@opencorestack/opengridx 2.0.1 → 2.0.3
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/CHANGELOG.md +26 -0
- package/dist/opengridx.es.js +492 -492
- package/dist/opengridx.es.js.map +1 -1
- package/dist/opengridx.umd.js +6 -6
- package/dist/opengridx.umd.js.map +1 -1
- package/docs/API_REFERENCE.md +9 -4
- package/docs/components/aggregation-footer.md +1 -1
- package/docs/components/column-group-header.md +2 -9
- package/docs/components/column-resize.md +15 -16
- package/docs/components/column-visibility.md +5 -5
- package/docs/components/datagrid.md +1 -1
- package/docs/components/empty-state.md +1 -1
- package/docs/components/tooltip.md +4 -7
- package/docs/features/aggregation-pivot.md +2 -2
- package/docs/features/cell-spanning.md +1 -1
- package/docs/features/loading-states.md +5 -5
- package/docs/features/selection.md +1 -1
- package/docs/features/sorting-pagination.md +1 -1
- package/docs/features/virtualization.md +13 -1
- package/docs/roadmap.md +1 -1
- package/lib/components/DataGrid/DataGrid.tsx +26 -19
- package/llms.txt +1 -1
- package/package.json +1 -1
package/dist/opengridx.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opengridx.es.js","sources":["../node_modules/react/cjs/react-jsx-runtime.production.js","../node_modules/react/cjs/react-jsx-runtime.development.js","../node_modules/react/jsx-runtime.js","../lib/utils/pinning/index.ts","../lib/hooks/core/useLayout.ts","../lib/hooks/core/useGridKeyboardNavigation.ts","../lib/hooks/core/useGridControlledState.ts","../lib/utils/filtering/index.ts","../lib/utils/sorting/index.ts","../lib/hooks/core/useGridRowPipeline.ts","../lib/hooks/core/useGridVirtualization.ts","../lib/hooks/useColumnReorder.ts","../lib/components/ui/ExpandIcon.tsx","../lib/hooks/core/useGridColumns.tsx","../lib/hooks/core/useGridVisibleRows.ts","../lib/hooks/core/useGridScrollSync.ts","../lib/hooks/core/useGridStateSnapshot.ts","../lib/hooks/features/useAggregation.ts","../lib/components/DataGrid/GridAggregationFooter.tsx","../lib/components/DataGrid/GridEmptyState.tsx","../lib/components/DataGrid/GridErrorOverlay.tsx","../lib/components/ui/Checkbox.tsx","../lib/components/ColumnResizeHandle/ColumnResizeHandle.tsx","../lib/components/Header/ColumnMenu.tsx","../lib/components/Header/Header.tsx","../lib/components/ui/Button.tsx","../lib/components/Pagination/Pagination.tsx","../lib/hooks/core/useDataGrid.ts","../lib/hooks/useRowReorder.ts","../lib/hooks/useTreeData.ts","../lib/hooks/useRowGrouping.ts","../lib/hooks/features/useGridEditing.ts","../lib/hooks/features/useGridSpanning.ts","../lib/hooks/features/useGridDataSource.ts","../lib/hooks/features/usePivot.ts","../lib/hooks/features/useGridClipboard.ts","../lib/components/ListView/ListViewRow.tsx","../lib/components/DataGrid/GridListView.tsx","../lib/components/Cell/GridEditInputCell.tsx","../lib/components/Cell/CellErrorBoundary.tsx","../lib/components/Cell/Cell.tsx","../lib/components/ui/DragHandleIcon.tsx","../lib/components/DetailPanel/DetailPanel.tsx","../lib/components/Row/Row.tsx","../lib/components/DataGrid/GridPinnedRows.tsx","../lib/components/SkeletonRow/SkeletonRow.tsx","../lib/components/DataGrid/GridVirtualRows.tsx","../lib/components/ColumnVisibilityPanel/ColumnVisibilityPanel.tsx","../lib/components/DataGrid/GridStandaloneColumnPanel.tsx","../lib/components/DataGrid/DataGrid.tsx","../lib/components/Skeleton/Skeleton.tsx","../lib/components/FilterPanel/FilterPanel.tsx","../lib/components/Toolbar/PivotPanel.tsx","../lib/components/Toolbar/GlobalSearch.tsx","../lib/components/Tooltip/Tooltip.tsx","../lib/components/Toolbar/GridToolbar.tsx","../lib/hooks/core/useGridApiRef.ts","../lib/components/ui/Input.tsx","../lib/utils/export/exportToPdf.ts","../lib/utils/export/index.ts","../lib/utils/export/exportToExcelAdvanced.ts","../lib/theme/DataGridThemeProvider.tsx","../lib/theme/presets.ts","../lib/state/useGridStateStorage.ts"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (\n (\"number\" === typeof type.tag &&\n console.error(\n \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n ),\n type.$$typeof)\n ) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkKeyStringCoercion(value) {\n try {\n testStringCoercion(value);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n if (JSCompiler_inline_result) {\n JSCompiler_inline_result = console;\n var JSCompiler_temp_const = JSCompiler_inline_result.error;\n var JSCompiler_inline_result$jscomp$0 =\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\";\n JSCompiler_temp_const.call(\n JSCompiler_inline_result,\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n JSCompiler_inline_result$jscomp$0\n );\n return testStringCoercion(value);\n }\n }\n function getTaskName(type) {\n if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n if (\n \"object\" === typeof type &&\n null !== type &&\n type.$$typeof === REACT_LAZY_TYPE\n )\n return \"<...>\";\n try {\n var name = getComponentNameFromType(type);\n return name ? \"<\" + name + \">\" : \"<...>\";\n } catch (x) {\n return \"<...>\";\n }\n }\n function getOwner() {\n var dispatcher = ReactSharedInternals.A;\n return null === dispatcher ? null : dispatcher.getOwner();\n }\n function UnknownOwner() {\n return Error(\"react-stack-top-frame\");\n }\n function hasValidKey(config) {\n if (hasOwnProperty.call(config, \"key\")) {\n var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n if (getter && getter.isReactWarning) return !1;\n }\n return void 0 !== config.key;\n }\n function defineKeyPropWarningGetter(props, displayName) {\n function warnAboutAccessingKey() {\n specialPropKeyWarningShown ||\n ((specialPropKeyWarningShown = !0),\n console.error(\n \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n displayName\n ));\n }\n warnAboutAccessingKey.isReactWarning = !0;\n Object.defineProperty(props, \"key\", {\n get: warnAboutAccessingKey,\n configurable: !0\n });\n }\n function elementRefGetterWithDeprecationWarning() {\n var componentName = getComponentNameFromType(this.type);\n didWarnAboutElementRef[componentName] ||\n ((didWarnAboutElementRef[componentName] = !0),\n console.error(\n \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n ));\n componentName = this.props.ref;\n return void 0 !== componentName ? componentName : null;\n }\n function ReactElement(type, key, props, owner, debugStack, debugTask) {\n var refProp = props.ref;\n type = {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n props: props,\n _owner: owner\n };\n null !== (void 0 !== refProp ? refProp : null)\n ? Object.defineProperty(type, \"ref\", {\n enumerable: !1,\n get: elementRefGetterWithDeprecationWarning\n })\n : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n type._store = {};\n Object.defineProperty(type._store, \"validated\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: 0\n });\n Object.defineProperty(type, \"_debugInfo\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: null\n });\n Object.defineProperty(type, \"_debugStack\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugStack\n });\n Object.defineProperty(type, \"_debugTask\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugTask\n });\n Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n return type;\n }\n function jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n debugStack,\n debugTask\n ) {\n var children = config.children;\n if (void 0 !== children)\n if (isStaticChildren)\n if (isArrayImpl(children)) {\n for (\n isStaticChildren = 0;\n isStaticChildren < children.length;\n isStaticChildren++\n )\n validateChildKeys(children[isStaticChildren]);\n Object.freeze && Object.freeze(children);\n } else\n console.error(\n \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n );\n else validateChildKeys(children);\n if (hasOwnProperty.call(config, \"key\")) {\n children = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return \"key\" !== k;\n });\n isStaticChildren =\n 0 < keys.length\n ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n : \"{key: someKey}\";\n didWarnAboutKeySpread[children + isStaticChildren] ||\n ((keys =\n 0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n console.error(\n 'A props object containing a \"key\" prop is being spread into JSX:\\n let props = %s;\\n <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n let props = %s;\\n <%s key={someKey} {...props} />',\n isStaticChildren,\n children,\n keys,\n children\n ),\n (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n }\n children = null;\n void 0 !== maybeKey &&\n (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n children &&\n defineKeyPropWarningGetter(\n maybeKey,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n return ReactElement(\n type,\n children,\n maybeKey,\n getOwner(),\n debugStack,\n debugTask\n );\n }\n function validateChildKeys(node) {\n isValidElement(node)\n ? node._store && (node._store.validated = 1)\n : \"object\" === typeof node &&\n null !== node &&\n node.$$typeof === REACT_LAZY_TYPE &&\n (\"fulfilled\" === node._payload.status\n ? isValidElement(node._payload.value) &&\n node._payload.value._store &&\n (node._payload.value._store.validated = 1)\n : node._store && (node._store.validated = 1));\n }\n function isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n }\n var React = require(\"react\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n isArrayImpl = Array.isArray,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n React = {\n react_stack_bottom_frame: function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n React,\n UnknownOwner\n )();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutKeySpread = {};\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.jsx = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !1,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n exports.jsxs = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !0,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","\nimport type { GridColDef, GridRowModel, GridColumnPinning, GridRowPinning, GridPinnedPosition, GridRowId } from '../../types';\n\nexport function isColumnPinned(field: string, pinnedColumns?: GridColumnPinning): GridPinnedPosition | null {\n if (!pinnedColumns) return null;\n\n if (pinnedColumns.left?.includes(field)) {\n return 'left';\n }\n\n if (pinnedColumns.right?.includes(field)) {\n return 'right';\n }\n\n return null;\n}\n\nexport function getPinnedColumnGroups<R extends GridRowModel = GridRowModel>(\n columns: GridColDef<R>[],\n pinnedColumns?: GridColumnPinning\n): {\n left: GridColDef<R>[];\n center: GridColDef<R>[];\n right: GridColDef<R>[];\n} {\n const left: GridColDef<R>[] = [];\n const center: GridColDef<R>[] = [];\n const right: GridColDef<R>[] = [];\n\n if (!pinnedColumns) {\n return { left, center: columns, right };\n }\n\n columns.forEach(col => {\n const pinnedPosition = isColumnPinned(col.field, pinnedColumns);\n\n if (pinnedPosition === 'left') {\n left.push(col);\n } else if (pinnedPosition === 'right') {\n right.push(col);\n } else {\n center.push(col);\n }\n });\n\n if (pinnedColumns.left) {\n left.sort((a, b) => {\n const aIndex = pinnedColumns.left!.indexOf(a.field);\n const bIndex = pinnedColumns.left!.indexOf(b.field);\n return aIndex - bIndex;\n });\n }\n\n if (pinnedColumns.right) {\n right.sort((a, b) => {\n const aIndex = pinnedColumns.right!.indexOf(a.field);\n const bIndex = pinnedColumns.right!.indexOf(b.field);\n return aIndex - bIndex;\n });\n }\n\n return { left, center, right };\n}\n\nexport function calculatePinnedPositions<R extends GridRowModel = GridRowModel>(\n columns: GridColDef<R>[],\n columnWidths: Record<string, number>,\n pinnedColumns?: GridColumnPinning,\n checkboxSelection?: boolean,\n pinCheckboxColumn?: boolean,\n hasDetailPanel?: boolean,\n pinExpandColumn?: boolean,\n rowReordering?: boolean\n): Record<string, number> {\n const positions: Record<string, number> = {};\n\n if (!pinnedColumns) return positions;\n\n const groups = getPinnedColumnGroups(columns, pinnedColumns);\n\n let leftOffset = 0;\n\n if (rowReordering) {\n leftOffset += 48;\n }\n\n if (hasDetailPanel && pinExpandColumn) {\n leftOffset += 48; \n }\n\n if (checkboxSelection && pinCheckboxColumn) {\n leftOffset += 48; \n }\n\n groups.left.forEach(col => {\n positions[col.field] = leftOffset;\n const width = columnWidths[col.field] ?? col.width ?? 100;\n leftOffset += width;\n });\n\n let rightOffset = 0;\n\n [...groups.right].reverse().forEach(col => {\n const width = columnWidths[col.field] ?? col.width ?? 100;\n positions[col.field] = rightOffset;\n rightOffset += width;\n });\n\n return positions;\n}\n\nexport function isColumnPinnable<R extends GridRowModel = GridRowModel>(\n colDef: GridColDef<R>\n): boolean {\n return colDef.pinnable !== false;\n}\n\nexport function pinColumn(\n field: string,\n position: GridPinnedPosition,\n currentPinning?: GridColumnPinning\n): GridColumnPinning {\n const newPinning: GridColumnPinning = {\n left: [...(currentPinning?.left || [])],\n right: [...(currentPinning?.right || [])]\n };\n\n newPinning.left = (newPinning.left || []).filter(f => f !== field);\n newPinning.right = (newPinning.right || []).filter(f => f !== field);\n\n if (position === 'left') {\n if (!newPinning.left) newPinning.left = [];\n newPinning.left.push(field);\n } else {\n if (!newPinning.right) newPinning.right = [];\n newPinning.right.push(field);\n }\n\n return newPinning;\n}\n\nexport function unpinColumn(\n field: string,\n currentPinning?: GridColumnPinning\n): GridColumnPinning {\n if (!currentPinning) return {};\n\n return {\n left: currentPinning.left?.filter(f => f !== field) || [],\n right: currentPinning.right?.filter(f => f !== field) || []\n };\n}\n\nexport function getPinnedColumnsWidth(\n columns: GridColDef[],\n columnWidths: Record<string, number>,\n position: GridPinnedPosition,\n pinnedColumns?: GridColumnPinning\n): number {\n if (!pinnedColumns) return 0;\n\n const pinnedFields = position === 'left' ? pinnedColumns.left : pinnedColumns.right;\n if (!pinnedFields) return 0;\n\n return pinnedFields.reduce((total, field) => {\n const col = columns.find(c => c.field === field);\n if (!col) return total;\n\n const width = columnWidths[field] ?? col.width ?? 100;\n return total + width;\n }, 0);\n}\n\nexport function isRowPinned(\n rowId: GridRowId,\n pinnedRows?: GridRowPinning\n): 'top' | 'bottom' | null {\n if (!pinnedRows) return null;\n\n if (pinnedRows.top?.includes(rowId)) {\n return 'top';\n }\n\n if (pinnedRows.bottom?.includes(rowId)) {\n return 'bottom';\n }\n\n return null;\n}\n\nexport function getPinnedRowGroups<R extends GridRowModel = GridRowModel>(\n rows: R[],\n pinnedRows?: GridRowPinning\n): {\n top: R[];\n center: R[];\n bottom: R[];\n} {\n const top: R[] = [];\n const center: R[] = [];\n const bottom: R[] = [];\n\n if (!pinnedRows) {\n return { top, center: rows, bottom };\n }\n\n rows.forEach(row => {\n const pinnedPosition = isRowPinned(row.id, pinnedRows);\n\n if (pinnedPosition === 'top') {\n top.push(row);\n } else if (pinnedPosition === 'bottom') {\n bottom.push(row);\n } else {\n center.push(row);\n }\n });\n\n if (pinnedRows.top) {\n top.sort((a, b) => {\n const aIndex = pinnedRows.top!.indexOf(a.id);\n const bIndex = pinnedRows.top!.indexOf(b.id);\n return aIndex - bIndex;\n });\n }\n\n if (pinnedRows.bottom) {\n bottom.sort((a, b) => {\n const aIndex = pinnedRows.bottom!.indexOf(a.id);\n const bIndex = pinnedRows.bottom!.indexOf(b.id);\n return aIndex - bIndex;\n });\n }\n\n return { top, center, bottom };\n}\n\nexport function pinRow(\n rowId: GridRowId,\n position: 'top' | 'bottom',\n currentPinning?: GridRowPinning\n): GridRowPinning {\n const newPinning: GridRowPinning = {\n top: [...(currentPinning?.top || [])],\n bottom: [...(currentPinning?.bottom || [])]\n };\n\n newPinning.top = (newPinning.top || []).filter(id => id !== rowId);\n newPinning.bottom = (newPinning.bottom || []).filter(id => id !== rowId);\n\n if (position === 'top') {\n if (!newPinning.top) newPinning.top = [];\n newPinning.top.push(rowId);\n } else {\n if (!newPinning.bottom) newPinning.bottom = [];\n newPinning.bottom.push(rowId);\n }\n\n return newPinning;\n}\n\nexport function unpinRow(\n rowId: GridRowId,\n currentPinning?: GridRowPinning\n): GridRowPinning {\n if (!currentPinning) return {};\n\n return {\n top: currentPinning.top?.filter(id => id !== rowId) || [],\n bottom: currentPinning.bottom?.filter(id => id !== rowId) || []\n };\n}\n\nexport function getPinnedRowsCount(\n position: 'top' | 'bottom',\n pinnedRows?: GridRowPinning\n): number {\n if (!pinnedRows) return 0;\n\n const pinnedIds = position === 'top' ? pinnedRows.top : pinnedRows.bottom;\n return pinnedIds?.length || 0;\n}\n","import { useMemo } from 'react';\nimport type { GridColDef, GridRowModel, GridRowId, GridColumnPinning, GridDetailPanelHeight } from '../../types';\nimport { isColumnPinned } from '../../utils/pinning';\n\nexport interface UseLayoutParams<R extends GridRowModel> {\n rowHeight: number;\n pagination: boolean;\n paginatedUnpinnedRows: R[];\n sortedUnpinnedRows: R[];\n expandedRowIds: Set<GridRowId>;\n getDetailPanelHeight?: (params: { row: R; id: GridRowId; rowIndex: number }) => GridDetailPanelHeight;\n pinnedTopRowsLength: number;\n pinnedBottomRowsLength: number;\n visibleOrderedColumns: GridColDef<R>[];\n pinnedColumns?: GridColumnPinning;\n columnWidths: Record<string, number>;\n viewportWidth: number;\n checkboxSelection: boolean;\n hasDetailPanel: boolean;\n rowReordering: boolean;\n pinCheckboxColumn: boolean;\n pinExpandColumn: boolean;\n autoHeight: boolean;\n paginationMode: string;\n isLoading: boolean;\n pageSize: number;\n}\n\nexport interface LayoutResult<R extends GridRowModel> {\n rowHeights: number[];\n cumulativeHeights: number[];\n unpinnedRowsHeight: number;\n pinnedTopHeight: number;\n pinnedBottomHeight: number;\n leftPinnedCols: (GridColDef<R> & { width: number; zIndex: number })[];\n rightPinnedCols: (GridColDef<R> & { width: number; zIndex: number })[];\n unpinnedColsWithWidth: (GridColDef<R> & { width: number })[];\n unpinnedColWidths: number[];\n unpinnedAccWidths: number[];\n totalWidth: number;\n leftWidth: number;\n rightWidth: number;\n unpinnedTotalWidth: number;\n systemColumnsWidth: number;\n pinnedTopRowsLength: number;\n pinnedBottomRowsLength: number;\n unpinnedRowsLength: number;\n}\n\nfunction parseWidth(width: number | string | undefined): { type: 'fixed' | 'percentage' | 'auto'; value: number } {\n if (width === undefined) return { type: 'auto', value: 0 };\n if (typeof width === 'number') return { type: 'fixed', value: width };\n if (typeof width === 'string') {\n if (width.toLowerCase() === 'auto') return { type: 'auto', value: 0 };\n if (width.endsWith('%')) {\n const percentage = parseFloat(width);\n return { type: 'percentage', value: percentage };\n }\n const floatVal = parseFloat(width);\n if (!isNaN(floatVal)) return { type: 'fixed', value: floatVal };\n }\n return { type: 'fixed', value: 100 };\n}\n\nexport function useLayout<R extends GridRowModel>(params: UseLayoutParams<R>): LayoutResult<R> {\n const {\n rowHeight,\n pagination,\n paginatedUnpinnedRows,\n sortedUnpinnedRows,\n expandedRowIds,\n getDetailPanelHeight,\n pinnedTopRowsLength,\n pinnedBottomRowsLength,\n visibleOrderedColumns,\n pinnedColumns,\n columnWidths,\n viewportWidth,\n checkboxSelection,\n hasDetailPanel,\n rowReordering,\n paginationMode,\n isLoading,\n pageSize,\n } = params;\n\n return useMemo<LayoutResult<R>>(() => {\n const unpinnedRows = pagination ? paginatedUnpinnedRows : sortedUnpinnedRows;\n\n const rowHeights = unpinnedRows.map((row, index) => {\n let height = rowHeight;\n if (expandedRowIds.has(row.id)) {\n const detailHeight = getDetailPanelHeight?.({ row, id: row.id, rowIndex: pinnedTopRowsLength + index }) ?? 200;\n height += typeof detailHeight === 'number' ? detailHeight : parseInt(String(detailHeight), 10) || 200;\n }\n return height;\n });\n\n const cumulativeHeights = rowHeights.reduce((acc, height, index) => {\n acc.push((acc[index - 1] || 0) + height);\n return acc;\n }, [] as number[]);\n\n const skeletonCount = (paginationMode === 'infinite' && isLoading && unpinnedRows.length > 0)\n ? Math.min(pageSize, 20)\n : 0;\n const unpinnedRowsHeight = (cumulativeHeights[cumulativeHeights.length - 1] || 0) + skeletonCount * rowHeight;\n const pinnedTopHeight = pinnedTopRowsLength * rowHeight;\n const pinnedBottomHeight = pinnedBottomRowsLength * rowHeight;\n\n const rawLeftPinnedCols: GridColDef<R>[] = [];\n const rawRightPinnedCols: GridColDef<R>[] = [];\n const unpinnedCols: GridColDef<R>[] = [];\n const unpinnedColWidths: number[] = [];\n\n visibleOrderedColumns.forEach(col => {\n const pinned = isColumnPinned(col.field, pinnedColumns);\n if (pinned === 'left') {\n rawLeftPinnedCols.push(col);\n } else if (pinned === 'right') {\n rawRightPinnedCols.push(col);\n } else {\n unpinnedCols.push(col);\n }\n });\n\n const systemColumnsWidth = (checkboxSelection ? 48 : 0) + (hasDetailPanel ? 48 : 0) + (rowReordering ? 48 : 0);\n\n const getColWidth = (c: GridColDef<R>) => columnWidths[c.field] ?? c.width;\n\n const leftWidth = rawLeftPinnedCols.reduce((sum, c) => {\n const parsed = parseWidth(getColWidth(c));\n return sum + (parsed.type === 'fixed' ? parsed.value : 100);\n }, 0);\n const rightWidth = rawRightPinnedCols.reduce((sum, c) => {\n const parsed = parseWidth(getColWidth(c));\n return sum + (parsed.type === 'fixed' ? parsed.value : 100);\n }, 0);\n\n const naturalFlexWidth = unpinnedCols.reduce((sum, col) => {\n const hasManualWidth = Object.prototype.hasOwnProperty.call(columnWidths, col.field);\n if (!hasManualWidth && col.flex && col.flex > 0) {\n const minWidth = col.minWidth ?? 150;\n const w = typeof col.width === 'number' ? col.width : 150;\n return sum + (minWidth || w);\n }\n const parsed = parseWidth(getColWidth(col));\n if (parsed.type === 'fixed') return sum + parsed.value;\n if (parsed.type === 'percentage') return sum + 100;\n return sum + (col.minWidth ?? 150);\n }, 0);\n\n const availableWidth = Math.max(\n viewportWidth - systemColumnsWidth - leftWidth - rightWidth,\n naturalFlexWidth\n );\n\n const fixedWidthCols: Array<{ col: GridColDef<R>; width: number }> = [];\n const percentageCols: Array<{ col: GridColDef<R>; percentage: number }> = [];\n const flexCols: Array<{ col: GridColDef<R>; flex: number }> = [];\n\n unpinnedCols.forEach(col => {\n const hasManualWidth = Object.prototype.hasOwnProperty.call(columnWidths, col.field);\n const parsed = parseWidth(getColWidth(col));\n\n if (!hasManualWidth && col.flex && col.flex > 0) {\n flexCols.push({ col, flex: col.flex });\n return;\n }\n\n if (parsed.type === 'fixed') {\n fixedWidthCols.push({ col, width: parsed.value });\n } else if (parsed.type === 'percentage') {\n percentageCols.push({ col, percentage: parsed.value });\n } else {\n flexCols.push({ col, flex: 1 });\n }\n });\n\n const fixedWidth = fixedWidthCols.reduce((sum, { width }) => sum + width, 0);\n let remainingSpaceForFlex = Math.max(0, availableWidth - fixedWidth);\n\n const percentageWidthMap = new Map<string, number>();\n percentageCols.forEach(({ col, percentage }) => {\n const calculatedWidth = (percentage / 100) * remainingSpaceForFlex;\n percentageWidthMap.set(col.field, calculatedWidth);\n remainingSpaceForFlex -= calculatedWidth;\n });\n remainingSpaceForFlex = Math.max(0, remainingSpaceForFlex);\n\n const finalFlexWidths = new Map<string, number>();\n const flexItems = flexCols.map(f => ({\n ...f,\n minWidth: f.col.minWidth ?? 50,\n maxWidth: f.col.maxWidth ?? Infinity,\n frozen: false,\n computedWidth: 0\n }));\n\n const solveFlexAllocation = () => {\n let iterations = 0;\n const maxIterations = flexItems.length * 2;\n\n while (iterations < maxIterations) {\n iterations++;\n const unfrozen = flexItems.filter(f => !f.frozen);\n if (unfrozen.length === 0) break;\n\n const unfrozenFlexTotal = unfrozen.reduce((sum, f) => sum + f.flex, 0);\n const frozenWidthTotal = flexItems.reduce((sum, f) => f.frozen ? sum + f.computedWidth : sum, 0);\n const currentFreeSpace = Math.max(0, remainingSpaceForFlex - frozenWidthTotal);\n\n if (unfrozenFlexTotal <= 0) {\n unfrozen.forEach(f => { f.computedWidth = f.minWidth; f.frozen = true; });\n break;\n }\n\n const pixelsPerFlex = currentFreeSpace / unfrozenFlexTotal;\n let totalViolation = 0;\n const minViolators: typeof flexItems = [];\n const maxViolators: typeof flexItems = [];\n\n unfrozen.forEach(f => {\n const rawWidth = pixelsPerFlex * f.flex;\n if (rawWidth < f.minWidth) {\n totalViolation += f.minWidth - rawWidth;\n minViolators.push(f);\n } else if (rawWidth > f.maxWidth) {\n totalViolation += f.maxWidth - rawWidth;\n maxViolators.push(f);\n } else {\n f.computedWidth = rawWidth;\n }\n });\n\n if (minViolators.length === 0 && maxViolators.length === 0) {\n unfrozen.forEach(f => f.frozen = true);\n break;\n }\n\n if (totalViolation > 0) {\n minViolators.forEach(f => { f.computedWidth = f.minWidth; f.frozen = true; });\n } else if (totalViolation < 0) {\n maxViolators.forEach(f => { f.computedWidth = f.maxWidth; f.frozen = true; });\n } else {\n minViolators.forEach(f => { f.computedWidth = f.minWidth; f.frozen = true; });\n maxViolators.forEach(f => { f.computedWidth = f.maxWidth; f.frozen = true; });\n }\n }\n };\n\n solveFlexAllocation();\n flexItems.forEach(f => finalFlexWidths.set(f.col.field, f.computedWidth));\n\n const computedWidthMap = new Map<string, number>();\n unpinnedCols.forEach(col => {\n let computedWidth: number;\n if (finalFlexWidths.has(col.field)) {\n computedWidth = finalFlexWidths.get(col.field)!;\n } else {\n const fixedCol = fixedWidthCols.find(f => f.col.field === col.field);\n const pctCol = percentageCols.find(p => p.col.field === col.field);\n if (fixedCol) {\n computedWidth = fixedCol.width;\n } else if (pctCol) {\n const rawPctWidth = percentageWidthMap.get(col.field) || 0;\n computedWidth = Math.max(col.minWidth ?? 50, rawPctWidth || 100);\n } else {\n computedWidth = 100;\n }\n }\n unpinnedColWidths.push(computedWidth);\n computedWidthMap.set(col.field, computedWidth);\n });\n\n const unpinnedColsWithWidth = unpinnedCols.map(col => {\n const flexItem = flexItems.find(f => f.col.field === col.field);\n return {\n ...col,\n width: computedWidthMap.get(col.field) ?? (typeof col.width === 'number' ? col.width : 100),\n flex: flexItem ? flexItem.flex : col.flex\n };\n });\n\n const baseLeftZ = 11;\n const leftPinnedCols = rawLeftPinnedCols.map((col, i) => {\n const parsed = parseWidth(getColWidth(col));\n return { ...col, width: parsed.type === 'fixed' ? parsed.value : 100, zIndex: baseLeftZ + i };\n });\n\n const baseRightZ = 11;\n const rightPinnedCols = rawRightPinnedCols.map((col, i) => {\n const parsed = parseWidth(getColWidth(col));\n return {\n ...col,\n width: parsed.type === 'fixed' ? parsed.value : 100,\n zIndex: baseRightZ + (rawRightPinnedCols.length - 1 - i)\n };\n });\n\n const unpinnedTotalWidth = unpinnedColWidths.reduce((sum, w) => sum + w, 0);\n const totalWidth = leftWidth + unpinnedTotalWidth + rightWidth + systemColumnsWidth;\n const unpinnedAccWidths = unpinnedColWidths.reduce((acc, w, i) => {\n acc.push((acc[i - 1] || 0) + w);\n return acc;\n }, [] as number[]);\n\n return {\n rowHeights,\n cumulativeHeights,\n unpinnedRowsHeight,\n pinnedTopHeight,\n pinnedBottomHeight,\n leftPinnedCols,\n rightPinnedCols,\n unpinnedColsWithWidth,\n unpinnedColWidths,\n unpinnedAccWidths,\n totalWidth,\n leftWidth,\n rightWidth,\n unpinnedTotalWidth,\n systemColumnsWidth,\n pinnedTopRowsLength,\n pinnedBottomRowsLength,\n unpinnedRowsLength: unpinnedRows.length,\n };\n }, [\n rowHeight,\n pagination,\n paginatedUnpinnedRows,\n sortedUnpinnedRows,\n expandedRowIds,\n getDetailPanelHeight,\n pinnedTopRowsLength,\n pinnedBottomRowsLength,\n visibleOrderedColumns,\n pinnedColumns,\n columnWidths,\n viewportWidth,\n checkboxSelection,\n hasDetailPanel,\n rowReordering,\n paginationMode,\n isLoading,\n pageSize,\n ]);\n}\n","import { useState, useCallback } from 'react';\nimport type { GridRowModel, GridRowId, GridColDef, GridCellParams, GridSortItem, GridSortDirection } from '../../types';\nimport type { GridEditingState } from '../features/useGridEditing';\n\ninterface ColumnMetrics {\n leftPinnedWidth: number;\n rightPinnedWidth: number;\n unpinnedAccWidths: number[];\n unpinnedCols: { field: string }[];\n totalSpecialsWidth: number;\n pinnedSpecialsWidth: number;\n}\n\ninterface VirtualizationSnapshot {\n cumulativeHeights: number[];\n pinnedTopHeight: number;\n columnMetrics: ColumnMetrics | null;\n}\n\nexport interface UseGridKeyboardNavigationParams<R extends GridRowModel> {\n allRenderableRows: R[];\n navigationColumns: { field: string; editable?: boolean; sortable?: boolean }[];\n checkboxSelection: boolean;\n selectedRowIds: Set<GridRowId>;\n handleSelectionChange: (id: GridRowId, selected: boolean) => void;\n handleDetailPanelToggle: (id: GridRowId) => void;\n editingHandlers: {\n editingCell: GridEditingState['editingCell'];\n startCellEdit: (params: { id: GridRowId; field: string; value: unknown }) => void;\n stopCellEdit: (params?: { cancel?: boolean }) => void;\n };\n setKeyboardMode: (mode: boolean) => void;\n sortModel: GridSortItem[];\n handleSort: (field: string, direction: GridSortDirection) => void;\n isCellEditable?: (params: GridCellParams<R>) => boolean;\n pagination: boolean;\n pageSize: number;\n virtualization: VirtualizationSnapshot;\n viewportRef: React.RefObject<HTMLDivElement | null>;\n}\n\nexport interface FocusedCell {\n id: GridRowId;\n field: string;\n}\n\nexport interface UseGridKeyboardNavigationReturn {\n focusedCell: FocusedCell | null;\n setFocusedCell: React.Dispatch<React.SetStateAction<FocusedCell | null>>;\n handleFocus: (event: React.FocusEvent<HTMLDivElement>) => void;\n handleBlur: (event: React.FocusEvent<HTMLDivElement>) => void;\n handleKeyDown: (event: React.KeyboardEvent) => void;\n}\n\nexport function useGridKeyboardNavigation<R extends GridRowModel>(\n params: UseGridKeyboardNavigationParams<R>\n): UseGridKeyboardNavigationReturn {\n const {\n allRenderableRows,\n navigationColumns,\n checkboxSelection,\n selectedRowIds,\n handleSelectionChange,\n handleDetailPanelToggle,\n editingHandlers,\n setKeyboardMode,\n sortModel,\n handleSort,\n isCellEditable,\n pagination,\n pageSize,\n virtualization,\n viewportRef,\n } = params;\n\n const [focusedCell, setFocusedCell] = useState<FocusedCell | null>(null);\n\n const handleFocus = useCallback((event: React.FocusEvent<HTMLDivElement>) => {\n if (event.target === event.currentTarget) {\n setFocusedCell(prev => {\n if (prev) return prev;\n if (checkboxSelection) {\n return { id: 'HEADER', field: '__checkbox_col__' };\n }\n const firstRow = allRenderableRows[0];\n const firstCol = navigationColumns[0];\n if (firstRow && firstCol) {\n return { id: firstRow.id, field: firstCol.field };\n }\n return null;\n });\n }\n }, [allRenderableRows, navigationColumns, checkboxSelection]);\n\n const handleBlur = useCallback((event: React.FocusEvent<HTMLDivElement>) => {\n if (!event.currentTarget.contains(event.relatedTarget as Node)) {\n setFocusedCell(null);\n }\n }, []);\n\n const handleKeyDown = useCallback((event: React.KeyboardEvent) => {\n setKeyboardMode(true);\n\n if (!focusedCell) return;\n\n const { id, field } = focusedCell;\n const isEditing = Boolean(editingHandlers.editingCell);\n\n if (id === 'HEADER' && (event.key === 'Enter' || event.key === ' ')) {\n event.preventDefault();\n const col = navigationColumns.find(c => c.field === field);\n if (col && col.sortable !== false) {\n const currentSort = sortModel.find(item => item.field === field);\n let newDirection: GridSortDirection = 'asc';\n if (currentSort) {\n newDirection = currentSort.sort === 'asc' ? 'desc' : null;\n }\n handleSort(field, newDirection);\n }\n return;\n }\n\n if (event.key === 'Enter') {\n event.preventDefault();\n if (isEditing) {\n editingHandlers.stopCellEdit();\n } else {\n const col = navigationColumns.find(c => c.field === field);\n if (col?.editable) {\n const row = allRenderableRows.find(r => r.id === id);\n if (row) {\n editingHandlers.startCellEdit({ id, field, value: (row as R & Record<string, unknown>)[field] });\n }\n }\n }\n return;\n }\n\n if (event.key === ' ' || event.key === 'Spacebar') {\n if (!isEditing) {\n if (field === '__checkbox_col__') {\n event.preventDefault();\n handleSelectionChange(id, !selectedRowIds.has(id));\n return;\n }\n if (field === '__expand_col__') {\n event.preventDefault();\n handleDetailPanelToggle(id);\n return;\n }\n }\n }\n\n if (event.key === 'Escape') {\n if (isEditing) {\n event.preventDefault();\n editingHandlers.stopCellEdit({ cancel: true });\n }\n return;\n }\n\n if (isEditing && event.key !== 'Tab') return;\n\n const isHeader = id === 'HEADER';\n const rowIndex = isHeader ? -1 : allRenderableRows.findIndex(r => r.id === id);\n const colIndex = navigationColumns.findIndex(c => c.field === field);\n\n if (!isHeader && rowIndex === -1) return;\n if (colIndex === -1) return;\n\n const findNextCell = (\n startRow: number,\n startCol: number,\n deltaRow: number,\n deltaCol: number,\n wrapRow: boolean,\n allowHeader = false\n ) => {\n let r = startRow + deltaRow;\n let c = startCol + deltaCol;\n\n if (wrapRow && deltaCol !== 0) {\n if (deltaCol > 0 && c >= navigationColumns.length) { c = 0; r++; }\n else if (deltaCol < 0 && c < 0) { c = navigationColumns.length - 1; r--; }\n }\n\n if (!wrapRow && (c < 0 || c >= navigationColumns.length)) return null;\n if (r < (allowHeader ? -1 : 0) || r >= allRenderableRows.length) return null;\n\n return { r, c };\n };\n\n const findNextEditable = (\n startRow: number,\n startCol: number,\n deltaRow: number,\n deltaCol: number,\n wrapRow: boolean,\n allowHeader = false\n ) => {\n let r = startRow;\n let c = startCol;\n let steps = 0;\n const maxSteps = allRenderableRows.length * navigationColumns.length + navigationColumns.length;\n\n while (steps < maxSteps) {\n steps++;\n r += deltaRow;\n c += deltaCol;\n\n if (wrapRow && deltaCol !== 0) {\n if (deltaCol > 0) {\n if (c >= navigationColumns.length) { c = 0; r++; }\n } else {\n if (c < 0) { c = navigationColumns.length - 1; r--; }\n }\n } else {\n if (c < 0 || c >= navigationColumns.length) return null;\n }\n\n if (r < -1 || r >= allRenderableRows.length) return null;\n\n if (r === -1) {\n if (!allowHeader) continue;\n const col = navigationColumns[c];\n const isSortable = col.sortable !== false;\n if (['__checkbox_col__'].includes(col.field) || isSortable) return { r, c };\n continue;\n }\n\n const row = allRenderableRows[r];\n const col = navigationColumns[c];\n const isInteractable = ['__checkbox_col__', '__expand_col__', '__reorder_col__'].includes(col.field);\n let cellEditable = col.editable || isInteractable;\n\n if (isCellEditable && !isInteractable) {\n try {\n cellEditable = isCellEditable({\n row,\n field: col.field,\n value: (row as R & Record<string, unknown>)[col.field],\n colDef: col as GridColDef<R>,\n rowIndex: r,\n colIndex: c\n });\n } catch {\n // isCellEditable threw — treat cell as non-editable\n }\n }\n\n if (cellEditable) return { r, c };\n }\n return null;\n };\n\n let nextRowIndex = rowIndex;\n let nextColIndex = colIndex;\n let handled = false;\n\n if (event.key === 'Tab') {\n const dir = event.shiftKey ? -1 : 1;\n const res = findNextEditable(rowIndex, colIndex, 0, dir, true, false);\n if (res) { nextRowIndex = res.r; nextColIndex = res.c; handled = true; }\n } else if (event.key === 'ArrowRight') {\n const res = findNextCell(rowIndex, colIndex, 0, 1, true, true);\n if (res) { nextRowIndex = res.r; nextColIndex = res.c; handled = true; }\n } else if (event.key === 'ArrowLeft') {\n const res = findNextCell(rowIndex, colIndex, 0, -1, true, true);\n if (res) { nextRowIndex = res.r; nextColIndex = res.c; handled = true; }\n } else if (event.key === 'ArrowDown') {\n const res = findNextCell(rowIndex, colIndex, 1, 0, false, true);\n if (res) { nextRowIndex = res.r; nextColIndex = res.c; handled = true; }\n } else if (event.key === 'ArrowUp') {\n const res = findNextCell(rowIndex, colIndex, -1, 0, false, true);\n if (res) { nextRowIndex = res.r; nextColIndex = res.c; handled = true; }\n } else if (event.key === 'Home') {\n nextColIndex = 0;\n if (event.ctrlKey || event.metaKey) nextRowIndex = -1;\n handled = true;\n } else if (event.key === 'End') {\n nextColIndex = navigationColumns.length - 1;\n if (event.ctrlKey || event.metaKey) nextRowIndex = allRenderableRows.length - 1;\n handled = true;\n } else if (event.key === 'PageUp') {\n const pg = pagination ? pageSize : 10;\n nextRowIndex = Math.max(-1, nextRowIndex - pg);\n handled = true;\n } else if (event.key === 'PageDown') {\n const pg = pagination ? pageSize : 10;\n nextRowIndex = Math.min(allRenderableRows.length - 1, nextRowIndex + pg);\n handled = true;\n }\n\n if (handled) {\n event.preventDefault();\n\n if (isEditing && event.key === 'Tab') {\n editingHandlers.stopCellEdit();\n }\n\n if (nextRowIndex >= -1 && nextRowIndex < allRenderableRows.length &&\n nextColIndex >= 0 && nextColIndex < navigationColumns.length) {\n\n const nextCol = navigationColumns[nextColIndex];\n\n if (nextRowIndex === -1) {\n setFocusedCell({ id: 'HEADER', field: nextCol.field });\n } else {\n setFocusedCell({ id: allRenderableRows[nextRowIndex].id, field: nextCol.field });\n }\n\n const el = viewportRef.current;\n if (el) {\n const { cumulativeHeights, pinnedTopHeight, columnMetrics } = virtualization;\n const { clientHeight, clientWidth, scrollTop, scrollLeft } = el;\n\n const rowTop = nextRowIndex <= 0 ? 0 : cumulativeHeights[nextRowIndex - 1];\n const rowBottom = cumulativeHeights[nextRowIndex];\n const visibleTop = scrollTop + pinnedTopHeight;\n const visibleBottom = scrollTop + clientHeight;\n\n let newScrollTop = scrollTop;\n if (rowTop < visibleTop) {\n newScrollTop = Math.max(0, rowTop - pinnedTopHeight);\n } else if (rowBottom > visibleBottom) {\n newScrollTop = rowBottom - clientHeight;\n }\n if (newScrollTop !== scrollTop) el.scrollTop = newScrollTop;\n\n if (columnMetrics) {\n const { leftPinnedWidth, rightPinnedWidth, unpinnedAccWidths, unpinnedCols, totalSpecialsWidth, pinnedSpecialsWidth } = columnMetrics;\n const unpinnedIndex = unpinnedCols.findIndex(c => c.field === nextCol.field);\n\n if (unpinnedIndex !== -1) {\n const colLeft = totalSpecialsWidth + leftPinnedWidth + (unpinnedIndex > 0 ? unpinnedAccWidths[unpinnedIndex - 1] : 0);\n const colRight = totalSpecialsWidth + leftPinnedWidth + unpinnedAccWidths[unpinnedIndex];\n const visibleStart = scrollLeft + pinnedSpecialsWidth + leftPinnedWidth;\n const visibleEnd = scrollLeft + clientWidth - rightPinnedWidth;\n\n let newScrollLeft = scrollLeft;\n if (colLeft < visibleStart) {\n newScrollLeft = Math.max(0, colLeft - pinnedSpecialsWidth - leftPinnedWidth);\n } else if (colRight > visibleEnd) {\n newScrollLeft = colRight - clientWidth + rightPinnedWidth;\n }\n if (newScrollLeft !== scrollLeft) el.scrollLeft = newScrollLeft;\n }\n }\n }\n }\n }\n }, [\n focusedCell,\n allRenderableRows,\n navigationColumns,\n editingHandlers,\n virtualization,\n selectedRowIds,\n handleSelectionChange,\n handleDetailPanelToggle,\n setKeyboardMode,\n sortModel,\n handleSort,\n isCellEditable,\n pagination,\n pageSize,\n viewportRef,\n ]);\n\n return { focusedCell, setFocusedCell, handleFocus, handleBlur, handleKeyDown };\n}\n","import { useState, useCallback, useMemo } from 'react';\nimport type {\n GridRowId,\n GridSortItem,\n GridColumnPinning,\n GridPaginationModel,\n GridAggregationModel,\n GridPivotModel,\n} from '../../types';\nimport type { GridInitialState } from '../../state/types';\n\nexport interface UseGridControlledStateParams {\n initialState?: GridInitialState;\n\n sortModel?: GridSortItem[];\n onSortModelChange?: (model: GridSortItem[]) => void;\n\n aggregationModel?: GridAggregationModel;\n onAggregationModelChange?: (model: GridAggregationModel) => void;\n\n columnVisibilityModel?: Record<string, boolean>;\n onColumnVisibilityModelChange?: (model: Record<string, boolean>) => void;\n\n pinnedColumns?: GridColumnPinning;\n onPinnedColumnsChange?: (model: GridColumnPinning) => void;\n\n pivotModel?: GridPivotModel;\n onPivotModelChange?: (model: GridPivotModel) => void;\n\n paginationModel?: GridPaginationModel;\n onPaginationModelChange?: (model: GridPaginationModel) => void;\n\n rowSelectionModel?: GridRowId[];\n onRowSelectionModelChange?: (model: GridRowId[]) => void;\n}\n\nexport interface UseGridControlledStateReturn {\n // sort\n sortModel: GridSortItem[];\n isSortControlled: boolean;\n setInternalSortModel: React.Dispatch<React.SetStateAction<GridSortItem[]>>;\n\n // aggregation\n aggregationModel: GridAggregationModel;\n handleAggregationModelChange: (model: GridAggregationModel) => void;\n\n // column visibility\n columnVisibilityModel: Record<string, boolean>;\n handleColumnVisibilityModelChange: (model: Record<string, boolean>) => void;\n\n // pinned columns\n pinnedColumns: GridColumnPinning;\n handlePinnedColumnsChange: (model: GridColumnPinning) => void;\n\n // pivot\n currentPivotModel: GridPivotModel;\n handlePivotModelChange: (model: GridPivotModel) => void;\n\n // pagination\n effectivePaginationModel: GridPaginationModel;\n handlePaginationModelChange: (model: GridPaginationModel) => void;\n\n // selection\n rowSelectionModel: GridRowId[];\n selectedRowIds: Set<GridRowId>;\n isSelectionControlled: boolean;\n setInternalRowSelectionModel: React.Dispatch<React.SetStateAction<GridRowId[]>>;\n}\n\nconst EMPTY_PIVOT_MODEL: GridPivotModel = { rowFields: [], columnFields: [], valueFields: [] };\n\nexport function useGridControlledState(params: UseGridControlledStateParams): UseGridControlledStateReturn {\n const {\n initialState,\n sortModel: propSortModel,\n aggregationModel: propAggregationModel,\n onAggregationModelChange,\n columnVisibilityModel: propColumnVisibilityModel,\n onColumnVisibilityModelChange,\n pinnedColumns: propPinnedColumns,\n onPinnedColumnsChange,\n pivotModel: propPivotModel,\n onPivotModelChange,\n paginationModel: propPaginationModel,\n onPaginationModelChange,\n rowSelectionModel: propRowSelectionModel,\n onRowSelectionModelChange,\n } = params;\n\n // ── Sort ─────────────────────────────────────────────────────────────────\n const [internalSortModel, setInternalSortModel] = useState<GridSortItem[]>(\n () => initialState?.sorting?.sortModel ?? []\n );\n const isSortControlled = propSortModel !== undefined;\n const sortModel = isSortControlled ? propSortModel! : internalSortModel;\n\n // ── Aggregation ──────────────────────────────────────────────────────────\n const isAggregationControlled = propAggregationModel !== undefined;\n const [internalAggregationModel, setInternalAggregationModel] = useState<GridAggregationModel>(\n () => propAggregationModel ?? {}\n );\n const aggregationModel = isAggregationControlled ? propAggregationModel! : internalAggregationModel;\n\n const handleAggregationModelChange = useCallback((model: GridAggregationModel) => {\n if (!isAggregationControlled) setInternalAggregationModel(model);\n onAggregationModelChange?.(model);\n }, [isAggregationControlled, onAggregationModelChange]);\n\n // ── Column visibility ────────────────────────────────────────────────────\n const isColumnVisibilityControlled = propColumnVisibilityModel !== undefined;\n const [internalColumnVisibilityModel, setInternalColumnVisibilityModel] = useState<Record<string, boolean>>(\n () => initialState?.columns?.columnVisibilityModel ?? {}\n );\n const columnVisibilityModel = isColumnVisibilityControlled\n ? propColumnVisibilityModel!\n : internalColumnVisibilityModel;\n\n const handleColumnVisibilityModelChange = useCallback((model: Record<string, boolean>) => {\n if (!isColumnVisibilityControlled) setInternalColumnVisibilityModel(model);\n onColumnVisibilityModelChange?.(model);\n }, [isColumnVisibilityControlled, onColumnVisibilityModelChange]);\n\n // ── Pinned columns ───────────────────────────────────────────────────────\n const isPinnedColumnsControlled = propPinnedColumns !== undefined;\n const [internalPinnedColumns, setInternalPinnedColumns] = useState<GridColumnPinning>(\n () => initialState?.columns?.pinnedColumns ?? {}\n );\n const pinnedColumns = isPinnedColumnsControlled ? propPinnedColumns! : internalPinnedColumns;\n\n const handlePinnedColumnsChange = useCallback((model: GridColumnPinning) => {\n if (!isPinnedColumnsControlled) setInternalPinnedColumns(model);\n onPinnedColumnsChange?.(model);\n }, [isPinnedColumnsControlled, onPinnedColumnsChange]);\n\n // ── Pivot ────────────────────────────────────────────────────────────────\n const [internalPivotModel, setInternalPivotModel] = useState<GridPivotModel>(\n () => propPivotModel ?? EMPTY_PIVOT_MODEL\n );\n const currentPivotModel = propPivotModel ?? internalPivotModel;\n\n const handlePivotModelChange = useCallback((model: GridPivotModel) => {\n setInternalPivotModel(model);\n onPivotModelChange?.(model);\n }, [onPivotModelChange]);\n\n // ── Pagination ───────────────────────────────────────────────────────────\n const isPaginationControlled = propPaginationModel !== undefined;\n const [internalPaginationModel, setInternalPaginationModel] = useState<GridPaginationModel>(\n () => initialState?.pagination?.paginationModel ?? propPaginationModel ?? { page: 0, pageSize: 100 }\n );\n const effectivePaginationModel = isPaginationControlled ? propPaginationModel : internalPaginationModel;\n\n const handlePaginationModelChange = useCallback((newModel: GridPaginationModel) => {\n if (!isPaginationControlled) setInternalPaginationModel(newModel);\n onPaginationModelChange?.(newModel);\n }, [isPaginationControlled, onPaginationModelChange]);\n\n // ── Row selection ────────────────────────────────────────────────────────\n const isSelectionControlled = propRowSelectionModel !== undefined;\n const [internalRowSelectionModel, setInternalRowSelectionModel] = useState<GridRowId[]>([]);\n const rowSelectionModel = isSelectionControlled ? propRowSelectionModel! : internalRowSelectionModel;\n const selectedRowIds = useMemo(() => new Set(rowSelectionModel), [rowSelectionModel]);\n\n // onRowSelectionModelChange is consumed by the caller directly (they call it when selection changes)\n void onRowSelectionModelChange;\n\n return {\n sortModel: sortModel as GridSortItem[],\n isSortControlled,\n setInternalSortModel: setInternalSortModel as React.Dispatch<React.SetStateAction<GridSortItem[]>>,\n\n aggregationModel,\n handleAggregationModelChange,\n\n columnVisibilityModel,\n handleColumnVisibilityModelChange,\n\n pinnedColumns,\n handlePinnedColumnsChange,\n\n currentPivotModel,\n handlePivotModelChange,\n\n effectivePaginationModel,\n handlePaginationModelChange,\n\n rowSelectionModel,\n selectedRowIds,\n isSelectionControlled,\n setInternalRowSelectionModel,\n };\n}\n","\nimport type { GridRowModel, GridFilterItem, GridFilterModel, GridFilterGroup } from '../../types';\n\nexport const FILTER_OPERATORS = {\n contains: (value: unknown, filterValue: unknown): boolean => {\n if (value == null || filterValue == null) return false;\n return String(value).toLowerCase().includes(String(filterValue).toLowerCase());\n },\n\n equals: (value: unknown, filterValue: unknown): boolean => {\n if (value == null && filterValue == null) return true;\n if (value == null || filterValue == null) return false;\n return String(value).toLowerCase() === String(filterValue).toLowerCase();\n },\n\n startsWith: (value: unknown, filterValue: unknown): boolean => {\n if (value == null || filterValue == null) return false;\n return String(value).toLowerCase().startsWith(String(filterValue).toLowerCase());\n },\n\n endsWith: (value: unknown, filterValue: unknown): boolean => {\n if (value == null || filterValue == null) return false;\n return String(value).toLowerCase().endsWith(String(filterValue).toLowerCase());\n },\n\n isEmpty: (value: unknown): boolean => {\n return value == null || String(value).trim() === '';\n },\n\n isNotEmpty: (value: unknown): boolean => {\n return value != null && String(value).trim() !== '';\n },\n\n '>': (value: unknown, filterValue: unknown): boolean => {\n if (value == null || filterValue == null) return false;\n const numValue = Number(value);\n const numFilter = Number(filterValue);\n if (isNaN(numValue) || isNaN(numFilter)) return false;\n return numValue > numFilter;\n },\n\n '>=': (value: unknown, filterValue: unknown): boolean => {\n if (value == null || filterValue == null) return false;\n const numValue = Number(value);\n const numFilter = Number(filterValue);\n if (isNaN(numValue) || isNaN(numFilter)) return false;\n return numValue >= numFilter;\n },\n\n '<': (value: unknown, filterValue: unknown): boolean => {\n if (value == null || filterValue == null) return false;\n const numValue = Number(value);\n const numFilter = Number(filterValue);\n if (isNaN(numValue) || isNaN(numFilter)) return false;\n return numValue < numFilter;\n },\n\n '<=': (value: unknown, filterValue: unknown): boolean => {\n if (value == null || filterValue == null) return false;\n const numValue = Number(value);\n const numFilter = Number(filterValue);\n if (isNaN(numValue) || isNaN(numFilter)) return false;\n return numValue <= numFilter;\n },\n\n '!=': (value: unknown, filterValue: unknown): boolean => {\n if (filterValue == null || filterValue === '') return true;\n // Numeric comparison if both are numbers, otherwise string\n const numV = Number(value);\n const numF = Number(filterValue);\n if (!isNaN(numV) && !isNaN(numF)) return numV !== numF;\n return String(value).toLowerCase() !== String(filterValue).toLowerCase();\n },\n\n isAnyOf: (value: unknown, filterValue: unknown[]): boolean => {\n if (value == null || !Array.isArray(filterValue)) return false;\n return filterValue.some(v =>\n String(value).toLowerCase() === String(v).toLowerCase()\n );\n },\n\n not: (value: unknown, filterValue: unknown): boolean => {\n if (value == null && filterValue == null) return false;\n if (value == null || filterValue == null) return true;\n return String(value).toLowerCase() !== String(filterValue).toLowerCase();\n },\n\n // Used by boolean and singleSelect — case-insensitive string comparison\n is: (value: unknown, filterValue: unknown): boolean => {\n if (filterValue == null || filterValue === '') return true;\n const rowStr = String(value).toLowerCase();\n const filterStr = String(filterValue).toLowerCase();\n return rowStr === filterStr;\n },\n\n '=': (value: unknown, filterValue: unknown): boolean => {\n if (value == null || filterValue == null || filterValue === '') return false;\n return Number(value) === Number(filterValue);\n },\n};\n\n/**\n * Apply a single filter item to a row\n */\nexport function applyFilterItem<R extends GridRowModel>(\n row: R,\n filterItem: GridFilterItem\n): boolean {\n const { field, operator, value } = filterItem;\n\n // Get the value from the row\n const rowValue = row[field];\n\n // Get the operator function\n const operatorFn = FILTER_OPERATORS[operator];\n if (!operatorFn) {\n console.warn(`Unknown filter operator: ${operator}`);\n return true;\n }\n\n // Apply the operator\n return (operatorFn as (a: unknown, b: unknown) => boolean)(rowValue, value);\n}\n\n/**\n * Apply quick filter (global search across all fields)\n */\nexport function applyQuickFilter<R extends GridRowModel>(\n row: R,\n quickFilterValues: string[]\n): boolean {\n if (!quickFilterValues || quickFilterValues.length === 0) {\n return true;\n }\n\n // Check if any quick filter value matches any field in the row\n return quickFilterValues.every(filterValue => {\n const searchTerm = filterValue.toLowerCase();\n return Object.values(row).some(value => {\n if (value == null) return false;\n return String(value).toLowerCase().includes(searchTerm);\n });\n });\n}\n\n/**\n * Filter rows based on filter model\n */\n/**\n * Check if a row matches the filter model\n */\nexport function isRowMatchingFilter<R extends GridRowModel>(\n row: R,\n filterModel: GridFilterModel | GridFilterGroup // Accept Model or Group (similar structure)\n): boolean {\n // Normalize input: GridFilterModel matches GridFilterGroup shape largely, but let's be safe\n\n const items = filterModel.items ?? [];\n const logicOperator = filterModel.logicOperator ?? 'and';\n const quickFilterValues = ('quickFilterValues' in filterModel ? filterModel.quickFilterValues : undefined) ?? [];\n\n if (quickFilterValues.length > 0 && !applyQuickFilter(row, quickFilterValues)) {\n return false;\n }\n\n if (items.length === 0) {\n return true;\n }\n\n const evaluateItem = (item: GridFilterItem | GridFilterGroup): boolean => {\n if ('logicOperator' in item && 'items' in item) {\n\n const group = item as GridFilterGroup;\n const groupItems = group.items;\n if (groupItems.length === 0) return true;\n\n if (group.logicOperator === 'and') {\n return groupItems.every(evaluateItem);\n } else {\n return groupItems.some(evaluateItem);\n }\n } else {\n\n return applyFilterItem(row, item as GridFilterItem);\n }\n };\n\n if (logicOperator === 'and') {\n\n return items.every(evaluateItem);\n } else {\n\n return items.some(evaluateItem);\n }\n}\n\nexport function filterRows<R extends GridRowModel>(\n rows: R[],\n filterModel: GridFilterModel\n): R[] {\n if (!filterModel) return rows;\n\n const { items = [], quickFilterValues = [] } = filterModel;\n\n if (items.length === 0 && (!quickFilterValues || quickFilterValues.length === 0)) {\n return rows;\n }\n\n return rows.filter(row => isRowMatchingFilter(row, filterModel));\n}\n\nexport function getDefaultOperator(type?: string): string {\n switch (type) {\n case 'number':\n return '=';\n case 'date':\n return 'is';\n case 'boolean':\n return 'is';\n case 'singleSelect':\n return 'isAnyOf';\n default:\n return 'contains';\n }\n}\n\nexport function getOperatorsForType(type?: string): string[] {\n switch (type) {\n case 'number':\n return ['=', '!=', '>', '>=', '<', '<=', 'isEmpty', 'isNotEmpty'];\n case 'date':\n return ['is', 'not', 'after', 'onOrAfter', 'before', 'onOrBefore', 'isEmpty', 'isNotEmpty'];\n case 'boolean':\n return ['is'];\n case 'singleSelect':\n return ['isAnyOf', 'is', 'not'];\n default:\n return ['contains', 'equals', 'startsWith', 'endsWith', 'isEmpty', 'isNotEmpty'];\n }\n}\n","\nimport type { GridRowModel, GridSortItem } from '../../types';\n\nexport function compareValues(a: unknown, b: unknown, direction: 'asc' | 'desc'): number {\n\n if (a == null && b == null) return 0;\n if (a == null) return direction === 'asc' ? 1 : -1;\n if (b == null) return direction === 'asc' ? -1 : 1;\n\n if (typeof a === 'number' && typeof b === 'number') {\n return direction === 'asc' ? a - b : b - a;\n }\n\n if (a instanceof Date && b instanceof Date) {\n return direction === 'asc' \n ? a.getTime() - b.getTime() \n : b.getTime() - a.getTime();\n }\n\n const aStr = String(a).toLowerCase();\n const bStr = String(b).toLowerCase();\n\n if (direction === 'asc') {\n return aStr < bStr ? -1 : aStr > bStr ? 1 : 0;\n } else {\n return aStr > bStr ? -1 : aStr < bStr ? 1 : 0;\n }\n}\n\nexport function sortRows<R extends GridRowModel>(\n rows: R[],\n sortModel: GridSortItem[]\n): R[] {\n if (sortModel.length === 0) {\n return rows;\n }\n\n const sortedRows = [...rows];\n\n sortedRows.sort((a, b) => {\n for (const sortItem of sortModel) {\n const aValue = a[sortItem.field];\n const bValue = b[sortItem.field];\n\n const comparison = compareValues(aValue, bValue, sortItem.sort);\n\n if (comparison !== 0) {\n return comparison;\n }\n }\n return 0;\n });\n\n return sortedRows;\n}\n","import { useMemo } from 'react';\nimport { filterRows } from '../../utils/filtering';\nimport { sortRows } from '../../utils/sorting';\nimport { getPinnedRowGroups } from '../../utils/pinning';\nimport type { GridRowModel, GridFilterModel, GridSortItem, GridPaginationModel, GridRowPinning, GridDataSource } from '../../types';\n\ninterface HierarchyHandlers<R extends GridRowModel> {\n getVisibleRows: () => R[];\n}\n\nexport interface UseGridRowPipelineParams<R extends GridRowModel> {\n effectiveRows: R[];\n activeHierarchyHandlers: HierarchyHandlers<R> | null;\n filterMode: string;\n filterModel: GridFilterModel;\n dataSource?: GridDataSource<R>;\n sortModel: GridSortItem[];\n sortingMode: string;\n pagination: boolean;\n paginationMode: string;\n effectivePaginationModel: GridPaginationModel;\n pinnedRows?: GridRowPinning;\n isLoading: boolean;\n pageSize: number;\n}\n\nexport interface GridRowPipelineResult<R extends GridRowModel> {\n filteredRows: R[];\n pinnedTopRows: R[];\n unpinnedRows: R[];\n pinnedBottomRows: R[];\n sortedUnpinnedRows: R[];\n paginatedUnpinnedRows: R[];\n allRenderableRows: R[];\n}\n\nexport function useGridRowPipeline<R extends GridRowModel>(\n params: UseGridRowPipelineParams<R>\n): GridRowPipelineResult<R> {\n const {\n effectiveRows,\n activeHierarchyHandlers,\n filterMode,\n filterModel,\n dataSource,\n sortModel,\n sortingMode,\n pagination,\n paginationMode,\n effectivePaginationModel,\n pinnedRows,\n isLoading,\n pageSize,\n } = params;\n\n const filteredRows = useMemo<R[]>(() => {\n if (activeHierarchyHandlers) return (activeHierarchyHandlers.getVisibleRows() || []) as R[];\n if (filterMode === 'server' && dataSource) return effectiveRows;\n return filterRows(effectiveRows, filterModel) as R[];\n }, [effectiveRows, filterModel, activeHierarchyHandlers, filterMode, dataSource]);\n\n const { top: pinnedTopRows, center: unpinnedRows, bottom: pinnedBottomRows } = useMemo(() => {\n if (activeHierarchyHandlers) return { top: [] as R[], center: filteredRows, bottom: [] as R[] };\n return getPinnedRowGroups(filteredRows, pinnedRows);\n }, [filteredRows, pinnedRows, activeHierarchyHandlers]);\n\n const sortedUnpinnedRows = useMemo<R[]>(() => {\n if (activeHierarchyHandlers) return unpinnedRows;\n if (sortingMode === 'server' && dataSource) return unpinnedRows;\n return sortRows(unpinnedRows, sortModel) as R[];\n }, [unpinnedRows, sortModel, activeHierarchyHandlers, sortingMode, dataSource]);\n\n const paginatedUnpinnedRows = useMemo<R[]>(() => {\n if (!pagination) return sortedUnpinnedRows;\n if (paginationMode === 'server' && dataSource) return sortedUnpinnedRows;\n const start = effectivePaginationModel.page * effectivePaginationModel.pageSize;\n return sortedUnpinnedRows.slice(start, start + effectivePaginationModel.pageSize);\n }, [sortedUnpinnedRows, pagination, effectivePaginationModel.page, effectivePaginationModel.pageSize, paginationMode, dataSource]);\n\n const allRenderableRows = useMemo<R[]>(() => {\n if (activeHierarchyHandlers) return unpinnedRows;\n const centerRows = pagination ? paginatedUnpinnedRows : sortedUnpinnedRows;\n const base = [...pinnedTopRows, ...centerRows, ...pinnedBottomRows];\n\n if (paginationMode === 'infinite' && isLoading && base.length > 0) {\n const skeletonCount = Math.min(pageSize, 20);\n const skeletons = Array.from({ length: skeletonCount }, (_, i) => ({\n id: `__skeleton_${i}__`,\n _isSkeleton: true,\n }));\n return [...base, ...skeletons] as R[];\n }\n\n return base;\n }, [\n pinnedTopRows, paginatedUnpinnedRows, sortedUnpinnedRows, pinnedBottomRows,\n pagination, activeHierarchyHandlers, unpinnedRows, paginationMode, isLoading, pageSize,\n ]);\n\n return {\n filteredRows,\n pinnedTopRows,\n unpinnedRows,\n pinnedBottomRows,\n sortedUnpinnedRows,\n paginatedUnpinnedRows,\n allRenderableRows,\n };\n}\n","import { useMemo } from 'react';\nimport type { GridRowModel, GridColDef } from '../../types';\nimport type { LayoutResult } from './useLayout';\n\nexport interface UseGridVirtualizationParams<R extends GridRowModel> {\n layout: LayoutResult<R>;\n scrollTop: number;\n scrollLeft: number;\n viewportWidth: number;\n viewportHeight: number;\n autoHeight: boolean;\n rowReordering: boolean;\n hasDetailPanel: boolean;\n checkboxSelection: boolean;\n pinCheckboxColumn: boolean;\n pinExpandColumn: boolean;\n}\n\nexport interface GridVirtualizationResult<R extends GridRowModel = GridRowModel> {\n renderContext: {\n firstRowIndex: number;\n lastRowIndex: number;\n firstColumnIndex: number;\n lastColumnIndex: number;\n };\n offsetTop: number;\n offsetLeft: number;\n totalHeight: number;\n pinnedTopHeight: number;\n pinnedBottomHeight: number;\n totalWidth: number;\n rowHeights: number[];\n cumulativeHeights: number[];\n virtualColumns: (GridColDef<R> & { width: number })[];\n columnMetrics: {\n leftPinnedWidth: number;\n rightPinnedWidth: number;\n unpinnedAccWidths: number[];\n unpinnedCols: { field: string; width: number }[];\n totalSpecialsWidth: number;\n pinnedSpecialsWidth: number;\n };\n}\n\nexport function useGridVirtualization<R extends GridRowModel>(\n params: UseGridVirtualizationParams<R>\n): GridVirtualizationResult<R> {\n const {\n layout,\n scrollTop,\n scrollLeft,\n viewportWidth: rawViewportWidth,\n viewportHeight: rawViewportHeight,\n autoHeight,\n rowReordering,\n hasDetailPanel,\n checkboxSelection,\n pinCheckboxColumn,\n pinExpandColumn,\n } = params;\n\n return useMemo<GridVirtualizationResult<R>>(() => {\n const {\n unpinnedAccWidths,\n unpinnedColsWithWidth,\n leftPinnedCols,\n rightPinnedCols,\n totalWidth,\n leftWidth,\n rightWidth,\n unpinnedTotalWidth,\n systemColumnsWidth,\n cumulativeHeights,\n pinnedTopHeight,\n pinnedBottomHeight,\n unpinnedRowsHeight,\n rowHeights,\n unpinnedRowsLength,\n } = layout;\n\n const viewportWidth = rawViewportWidth || 1000;\n const viewportHeight = autoHeight\n ? pinnedTopHeight + unpinnedRowsHeight + pinnedBottomHeight + 50\n : rawViewportHeight || 600;\n\n const overscanCols = 6;\n const visibleLocalStart = Math.max(0, scrollLeft - leftWidth);\n const visibleLocalEnd = scrollLeft + viewportWidth - leftWidth;\n\n let firstUnpinnedIndex = 0;\n let lastUnpinnedIndex = unpinnedColsWithWidth.length - 1;\n\n let low = 0, high = unpinnedAccWidths.length - 1;\n while (low <= high) {\n const mid = (low + high) >>> 1;\n if (unpinnedAccWidths[mid] < visibleLocalStart) { low = mid + 1; } else { high = mid - 1; }\n }\n firstUnpinnedIndex = Math.max(0, low - overscanCols);\n\n for (let i = firstUnpinnedIndex; i < unpinnedAccWidths.length; i++) {\n if ((i === 0 ? 0 : unpinnedAccWidths[i - 1]) > visibleLocalEnd) {\n lastUnpinnedIndex = Math.min(unpinnedColsWithWidth.length - 1, i + overscanCols);\n break;\n }\n lastUnpinnedIndex = Math.min(unpinnedColsWithWidth.length - 1, i + overscanCols);\n }\n\n const leftSpacerWidth = firstUnpinnedIndex > 0 ? unpinnedAccWidths[firstUnpinnedIndex - 1] : 0;\n const rightSpacerWidth = unpinnedTotalWidth - unpinnedAccWidths[lastUnpinnedIndex];\n\n const virtualColumns: (GridColDef<R> & { width: number })[] = [\n ...leftPinnedCols,\n ...(leftSpacerWidth > 0 ? [{ field: '__spacer_left__', width: leftSpacerWidth, isSpacer: true }] : []),\n ...unpinnedColsWithWidth.slice(firstUnpinnedIndex, lastUnpinnedIndex + 1),\n ...(rightSpacerWidth > 0 ? [{ field: '__spacer_right__', width: rightSpacerWidth, isSpacer: true }] : []),\n ...rightPinnedCols,\n ];\n\n const hasHorizontalScroll = viewportWidth > 0 && totalWidth > viewportWidth;\n const scrollbarBuffer = hasHorizontalScroll ? 16 : 0;\n const totalHeight = pinnedTopHeight + unpinnedRowsHeight + pinnedBottomHeight + scrollbarBuffer + 2;\n\n const overscanRows = 5;\n let firstRowIndex = 0;\n let lastRowIndex = unpinnedRowsLength - 1;\n let offsetTop = 0;\n\n let rLow = 0, rHigh = cumulativeHeights.length - 1;\n while (rLow <= rHigh) {\n const mid = (rLow + rHigh) >>> 1;\n if (cumulativeHeights[mid] < scrollTop) { rLow = mid + 1; } else { rHigh = mid - 1; }\n }\n firstRowIndex = Math.max(0, rLow - overscanRows);\n offsetTop = firstRowIndex > 0 ? cumulativeHeights[firstRowIndex - 1] : 0;\n\n for (let i = firstRowIndex; i < cumulativeHeights.length; i++) {\n if (cumulativeHeights[i] >= scrollTop + viewportHeight) {\n lastRowIndex = Math.min(unpinnedRowsLength - 1, i + overscanRows);\n break;\n }\n }\n\n const pinnedSpecialsWidth =\n (rowReordering ? 48 : 0) +\n (hasDetailPanel && pinExpandColumn ? 48 : 0) +\n (checkboxSelection && pinCheckboxColumn ? 48 : 0);\n\n return {\n renderContext: {\n firstRowIndex,\n lastRowIndex,\n firstColumnIndex: firstUnpinnedIndex,\n lastColumnIndex: lastUnpinnedIndex,\n },\n offsetTop,\n offsetLeft: 0,\n totalHeight,\n pinnedTopHeight,\n pinnedBottomHeight,\n totalWidth,\n rowHeights,\n cumulativeHeights,\n virtualColumns,\n columnMetrics: {\n leftPinnedWidth: leftWidth,\n rightPinnedWidth: rightWidth,\n unpinnedAccWidths,\n unpinnedCols: unpinnedColsWithWidth,\n totalSpecialsWidth: systemColumnsWidth,\n pinnedSpecialsWidth,\n },\n };\n }, [\n layout,\n scrollTop,\n scrollLeft,\n rawViewportWidth,\n rawViewportHeight,\n autoHeight,\n rowReordering,\n hasDetailPanel,\n checkboxSelection,\n pinCheckboxColumn,\n pinExpandColumn,\n ]);\n}\n","\nimport { useState, useCallback, useRef } from 'react';\nimport type { GridColDef, GridRowModel, GridColumnOrderChangeParams } from '../types';\n\nexport interface UseColumnReorderProps<R extends GridRowModel = GridRowModel> {\n columns: GridColDef<R>[];\n onColumnOrderChange?: (params: GridColumnOrderChangeParams) => void;\n disableColumnReorder?: boolean;\n}\n\nexport interface UseColumnReorderReturn {\n draggedColumn: string | null;\n dragOverColumn: string | null;\n onDragStart: ((field: string) => (event: React.DragEvent) => void) | undefined;\n onDragOver: ((field: string) => (event: React.DragEvent) => void) | undefined;\n onDragEnd: (() => void) | undefined;\n onDrop: ((targetField: string) => (event: React.DragEvent) => void) | undefined;\n}\n\nexport function useColumnReorder<R extends GridRowModel = GridRowModel>(\n props: UseColumnReorderProps<R>\n): UseColumnReorderReturn {\n const { columns, onColumnOrderChange, disableColumnReorder = false } = props;\n\n const [draggedColumn, setDraggedColumn] = useState<string | null>(null);\n const [dragOverColumn, setDragOverColumn] = useState<string | null>(null);\n const draggedIndexRef = useRef<number>(-1);\n\n const handleDragStart = useCallback(\n (field: string) => (event: React.DragEvent) => {\n if (disableColumnReorder) return;\n\n const columnIndex = columns.findIndex(col => col.field === field);\n const column = columns[columnIndex];\n\n if (column?.pinnable === false) {\n event.preventDefault();\n return;\n }\n\n setDraggedColumn(field);\n draggedIndexRef.current = columnIndex;\n\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'move';\n event.dataTransfer.setData('text/plain', field);\n }\n },\n [columns, disableColumnReorder]\n );\n\n const handleDragOver = useCallback(\n (field: string) => (event: React.DragEvent) => {\n if (disableColumnReorder || !draggedColumn) return;\n\n event.preventDefault(); \n event.dataTransfer.dropEffect = 'move';\n\n setDragOverColumn(field);\n },\n [draggedColumn, disableColumnReorder]\n );\n\n const handleDrop = useCallback(\n (targetField: string) => (event: React.DragEvent) => {\n event.preventDefault();\n\n if (disableColumnReorder || !draggedColumn || draggedColumn === targetField) {\n setDraggedColumn(null);\n setDragOverColumn(null);\n return;\n }\n\n const oldIndex = columns.findIndex(col => col.field === draggedColumn);\n const targetIndex = columns.findIndex(col => col.field === targetField);\n\n if (oldIndex === -1 || targetIndex === -1) {\n setDraggedColumn(null);\n setDragOverColumn(null);\n return;\n }\n\n const column = columns[oldIndex];\n\n if (onColumnOrderChange) {\n onColumnOrderChange({\n column: column as unknown as GridColDef,\n oldIndex,\n targetIndex,\n });\n }\n\n setDraggedColumn(null);\n setDragOverColumn(null);\n draggedIndexRef.current = -1;\n },\n [columns, draggedColumn, disableColumnReorder, onColumnOrderChange]\n );\n\n const handleDragEnd = useCallback(() => {\n setDraggedColumn(null);\n setDragOverColumn(null);\n draggedIndexRef.current = -1;\n }, []);\n\n return {\n draggedColumn,\n dragOverColumn,\n onDragStart: disableColumnReorder ? undefined : handleDragStart,\n onDragOver: disableColumnReorder ? undefined : handleDragOver,\n onDragEnd: disableColumnReorder ? undefined : handleDragEnd,\n onDrop: disableColumnReorder ? undefined : handleDrop,\n };\n}\n","\nimport React from 'react';\n\nexport interface ExpandIconProps {\n isExpanded: boolean;\n onClick?: (event: React.MouseEvent) => void;\n variant?: 'chevron' | 'plus-minus';\n}\n\nexport function ExpandIcon({ isExpanded, onClick, variant = 'chevron' }: ExpandIconProps) {\n return (\n <button\n className={`ogx-expand-icon ${isExpanded ? 'ogx-expand-icon--expanded' : ''}`}\n onClick={(e) => {\n if (onClick) {\n onClick(e);\n }\n }}\n aria-label={isExpanded ? 'Collapse row' : 'Expand row'}\n type=\"button\"\n >\n {variant === 'plus-minus' ? (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n { }\n <path\n d=\"M4 8H12\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n { }\n <path\n d=\"M8 4V12\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{\n opacity: isExpanded ? 0 : 1,\n transition: 'opacity 0.2s ease',\n transformOrigin: 'center'\n }}\n />\n </svg>\n ) : (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{\n transform: isExpanded ? 'rotate(90deg)' : 'rotate(0deg)',\n transition: 'transform 0.2s ease'\n }}\n >\n <path\n d=\"M6 4L10 8L6 12\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </button>\n );\n}\n","import { useState, useMemo, useCallback, useEffect } from 'react';\nimport { useColumnReorder } from '../useColumnReorder';\nimport { ExpandIcon } from '../../components/ui/ExpandIcon';\nimport type {\n GridColDef,\n GridRowModel,\n GridRowId,\n GridColumnOrderChangeParams,\n GridRenderCellParams,\n} from '../../types';\nimport type { GridInitialState } from '../../state/types';\n\ninterface HierarchyHandlers {\n toggleExpansion: (id: GridRowId) => void;\n}\n\nexport interface UseGridColumnsParams<R extends GridRowModel> {\n activeColumns: GridColDef<R>[];\n isHierarchyEnabled: boolean;\n isRowGrouping: boolean;\n isTreeData: boolean;\n activeHierarchyHandlers: HierarchyHandlers | null;\n columnVisibilityModel: Record<string, boolean>;\n columnOrder?: string[];\n onColumnOrderChange?: (params: GridColumnOrderChangeParams) => void;\n disableColumnReorder: boolean;\n pivotMode: boolean;\n checkboxSelection: boolean;\n hasDetailPanel: boolean;\n rowReordering: boolean;\n initialState?: GridInitialState;\n setColumns: (cols: GridColDef[]) => void;\n}\n\nexport interface UseGridColumnsResult<R extends GridRowModel> {\n effectiveColumns: GridColDef<R>[];\n orderedColumns: GridColDef<R>[];\n visibleOrderedColumns: GridColDef<R>[];\n navigationColumns: Array<GridColDef<R> | { field: string }>;\n columnWidths: Record<string, number>;\n effectiveColumnOrder: string[];\n setInternalColumnOrder: React.Dispatch<React.SetStateAction<string[]>>;\n columnReorderHandlers: ReturnType<typeof useColumnReorder>;\n handleColumnResize: (field: string, newWidth: number) => void;\n}\n\nexport function useGridColumns<R extends GridRowModel>(\n params: UseGridColumnsParams<R>\n): UseGridColumnsResult<R> {\n const {\n activeColumns,\n isHierarchyEnabled,\n isRowGrouping,\n isTreeData,\n activeHierarchyHandlers,\n columnVisibilityModel,\n columnOrder,\n onColumnOrderChange,\n disableColumnReorder,\n pivotMode,\n checkboxSelection,\n hasDetailPanel,\n rowReordering,\n initialState,\n setColumns,\n } = params;\n\n // ── Effective columns (hierarchy cell renderer injection) ─────────────────\n const effectiveColumns = useMemo<GridColDef<R>[]>(() => {\n if (!isHierarchyEnabled) return activeColumns;\n\n return activeColumns.map((col, index) => {\n if (index === 0) {\n return {\n ...col,\n renderCell: (cellParams: GridRenderCellParams<R>) => {\n const meta = cellParams.rowMeta;\n const depth = meta?.treeDepth ?? 0;\n const hasChildren = Boolean(meta?.hasChildren);\n const isExpanded = Boolean(meta?.isExpanded);\n const groupingField = meta?.groupingField;\n const groupingValue = meta?.groupingValue;\n const descendantCount = meta?.descendantCount;\n const isGroupRow = Boolean(meta?.isGroupRow);\n\n let content: React.ReactNode = col.renderCell ? col.renderCell(cellParams) : cellParams.value as React.ReactNode;\n\n if (isTreeData && hasChildren && isGroupRow) {\n content = (\n <div className=\"ogx__group-cell-content\">\n {cellParams.value as React.ReactNode}\n {descendantCount !== undefined && descendantCount > 0 ? ` (${descendantCount})` : ''}\n </div>\n );\n }\n\n if (isRowGrouping && hasChildren && groupingField) {\n const groupLabel = meta?.groupLabel ?? `${groupingField}: ${String(groupingValue)}`;\n content = (\n <div className=\"ogx__group-cell-content\">\n {groupLabel}\n {descendantCount !== undefined ? ` (${descendantCount})` : ''}\n </div>\n );\n }\n\n return (\n <div style={{ display: 'flex', alignItems: 'center', paddingLeft: depth * 24, width: '100%', height: '100%' }}>\n <div style={{ marginRight: 4, width: 24, height: 24, display: 'flex', alignItems: 'center', justifyContent: 'center', cursor: hasChildren ? 'pointer' : 'default', flexShrink: 0 }}>\n {hasChildren ? (\n <div\n onClick={(e) => { e.stopPropagation(); e.preventDefault(); activeHierarchyHandlers?.toggleExpansion(cellParams.row.id); }}\n onMouseDown={(e) => { e.stopPropagation(); }}\n style={{ cursor: 'pointer', display: 'flex', alignItems: 'center', justifyContent: 'center', pointerEvents: 'auto', zIndex: 10, position: 'relative' }}\n >\n <ExpandIcon\n isExpanded={isExpanded}\n onClick={(e) => { e.stopPropagation(); e.preventDefault(); activeHierarchyHandlers?.toggleExpansion(cellParams.row.id); }}\n />\n </div>\n ) : null}\n </div>\n <div style={{ flex: 1, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{content}</div>\n </div>\n );\n }\n };\n }\n\n return {\n ...col,\n renderCell: (cellParams: GridRenderCellParams<R>) => {\n const meta = cellParams.rowMeta;\n const hasChildren = Boolean(meta?.hasChildren);\n const groupingField = meta?.groupingField;\n\n if (isRowGrouping && hasChildren) {\n if (col.field === groupingField) return null;\n if (cellParams.value !== undefined && cellParams.value !== null) {\n return col.renderCell ? col.renderCell(cellParams) : cellParams.value;\n }\n return null;\n }\n\n return col.renderCell ? col.renderCell(cellParams) : cellParams.value;\n }\n };\n }) as GridColDef<R>[];\n }, [activeColumns, isHierarchyEnabled, isRowGrouping, isTreeData, activeHierarchyHandlers]);\n\n // ── Column widths ─────────────────────────────────────────────────────────\n const [columnWidths, setColumnWidths] = useState<Record<string, number>>(\n () => initialState?.columns?.columnWidths ?? {}\n );\n\n const handleColumnResize = useCallback((field: string, newWidth: number) => {\n setColumnWidths(prev => ({ ...prev, [field]: newWidth }));\n }, []);\n\n // ── Column order ──────────────────────────────────────────────────────────\n const [internalColumnOrder, setInternalColumnOrder] = useState<string[]>(\n () => initialState?.columns?.columnOrder ?? activeColumns.map(col => col.field)\n );\n\n const effectiveColumnOrder = columnOrder ?? internalColumnOrder;\n\n useEffect(() => {\n setColumns(activeColumns as unknown as GridColDef[]);\n }, [activeColumns, setColumns]);\n\n useEffect(() => {\n if (pivotMode) {\n setInternalColumnOrder(activeColumns.map(col => col.field));\n }\n }, [pivotMode, activeColumns]);\n\n // ── Ordered / visible columns ─────────────────────────────────────────────\n const orderedColumns = useMemo<GridColDef<R>[]>(() => {\n if (disableColumnReorder) return effectiveColumns;\n\n const orderMap = new Map(effectiveColumnOrder.map((field, idx) => [field, idx]));\n return [...effectiveColumns].sort((a, b) => {\n const ai = orderMap.get(a.field) ?? effectiveColumns.indexOf(a);\n const bi = orderMap.get(b.field) ?? effectiveColumns.indexOf(b);\n return ai - bi;\n });\n }, [effectiveColumns, effectiveColumnOrder, disableColumnReorder]);\n\n const visibleOrderedColumns = useMemo<GridColDef<R>[]>(\n () => orderedColumns.filter(col => columnVisibilityModel[col.field] !== false),\n [orderedColumns, columnVisibilityModel]\n );\n\n // ── Column reorder handlers ───────────────────────────────────────────────\n const columnReorderHandlers = useColumnReorder({\n columns: orderedColumns,\n onColumnOrderChange: useCallback((reorderParams: GridColumnOrderChangeParams) => {\n const { oldIndex, targetIndex } = reorderParams;\n const newOrder = [...effectiveColumnOrder];\n const [movedField] = newOrder.splice(oldIndex, 1);\n newOrder.splice(targetIndex, 0, movedField);\n if (!columnOrder) setInternalColumnOrder(newOrder);\n onColumnOrderChange?.(reorderParams);\n }, [effectiveColumnOrder, columnOrder, onColumnOrderChange]),\n disableColumnReorder,\n });\n\n // ── Navigation columns (system cols + data cols for keyboard nav) ─────────\n const navigationColumns = useMemo(() => {\n const specials: { field: string }[] = [];\n if (rowReordering) specials.push({ field: '__reorder_col__' });\n if (hasDetailPanel) specials.push({ field: '__expand_col__' });\n if (checkboxSelection) specials.push({ field: '__checkbox_col__' });\n return [...specials, ...orderedColumns] as Array<GridColDef<R> | { field: string }>;\n }, [orderedColumns, checkboxSelection, hasDetailPanel, rowReordering]);\n\n return {\n effectiveColumns,\n orderedColumns,\n visibleOrderedColumns,\n navigationColumns,\n columnWidths,\n effectiveColumnOrder,\n setInternalColumnOrder,\n columnReorderHandlers,\n handleColumnResize,\n };\n}\n","import { useMemo } from 'react';\nimport type { GridRowModel, GridRowId } from '../../types';\n\ninterface RenderContext {\n firstRowIndex: number;\n lastRowIndex: number;\n}\n\nexport interface UseGridVisibleRowsParams<R extends GridRowModel> {\n renderContext: RenderContext;\n pinnedTopRows: R[];\n pinnedBottomRows: R[];\n paginatedUnpinnedRows: R[];\n sortedUnpinnedRows: R[];\n pagination: boolean;\n}\n\nexport interface GridVisibleRow<R extends GridRowModel> {\n row: R;\n rowIndex: number;\n}\n\nexport function useGridVisibleRows<R extends GridRowModel>(\n params: UseGridVisibleRowsParams<R>\n): GridVisibleRow<R>[] {\n const {\n renderContext,\n pinnedTopRows,\n pinnedBottomRows,\n paginatedUnpinnedRows,\n sortedUnpinnedRows,\n pagination,\n } = params;\n\n return useMemo<GridVisibleRow<R>[]>(() => {\n const { firstRowIndex, lastRowIndex } = renderContext;\n const centerRows = pagination ? paginatedUnpinnedRows : sortedUnpinnedRows;\n const topPinnedCount = pinnedTopRows.length;\n\n const topPinned = pinnedTopRows.map((row, index) => ({ row, rowIndex: index }));\n const bottomPinned = pinnedBottomRows.map((row, index) => ({\n row,\n rowIndex: topPinnedCount + centerRows.length + index,\n }));\n\n const centerStartIndex = Math.max(0, firstRowIndex - topPinnedCount);\n const centerEndIndex = Math.min(centerRows.length, lastRowIndex - topPinnedCount + 1);\n\n const centerVisible = centerRows\n .slice(centerStartIndex, centerEndIndex)\n .map((row, index) => ({\n row,\n rowIndex: topPinnedCount + centerStartIndex + index,\n }));\n\n const combined = [...topPinned, ...centerVisible, ...bottomPinned];\n\n // Deduplication guard: a row ID in both pinnedRows and rows would cause React key collisions\n const seenIds = new Set<GridRowId>();\n return combined.filter(item => {\n if (seenIds.has(item.row.id)) return false;\n seenIds.add(item.row.id);\n return true;\n });\n }, [renderContext, pinnedTopRows, pinnedBottomRows, paginatedUnpinnedRows, sortedUnpinnedRows, pagination]);\n}\n","import { useRef, useState, useCallback, useEffect } from 'react';\nimport type { GridRowScrollEndParams } from '../../types';\n\nexport interface UseGridScrollSyncParams {\n onRowsScrollEnd?: (params: GridRowScrollEndParams) => void;\n}\n\nexport interface UseGridScrollSyncResult {\n scrollTop: number;\n scrollLeft: number;\n handleScroll: (event: React.UIEvent<HTMLDivElement>) => void;\n}\n\nexport function useGridScrollSync(params: UseGridScrollSyncParams): UseGridScrollSyncResult {\n const { onRowsScrollEnd } = params;\n\n const pendingScrollRef = useRef({ scrollTop: 0, scrollLeft: 0 });\n const scrollRafRef = useRef<number | null>(null);\n const [scrollPos, setScrollPos] = useState({ scrollTop: 0, scrollLeft: 0 });\n\n useEffect(() => {\n return () => {\n if (scrollRafRef.current !== null) cancelAnimationFrame(scrollRafRef.current);\n };\n }, []);\n\n const handleScroll = useCallback((event: React.UIEvent<HTMLDivElement>) => {\n const target = event.currentTarget;\n pendingScrollRef.current = { scrollTop: target.scrollTop, scrollLeft: target.scrollLeft };\n\n if (scrollRafRef.current !== null) cancelAnimationFrame(scrollRafRef.current);\n scrollRafRef.current = requestAnimationFrame(() => {\n scrollRafRef.current = null;\n setScrollPos(pendingScrollRef.current);\n });\n\n if (onRowsScrollEnd) {\n const { scrollTop, scrollHeight, clientHeight } = target;\n const scrollThreshold = 100;\n\n if (scrollHeight - scrollTop - clientHeight < scrollThreshold) {\n onRowsScrollEnd({\n visibleTop: scrollTop,\n visibleBottom: scrollTop + clientHeight,\n viewportHeight: clientHeight,\n });\n }\n }\n }, [onRowsScrollEnd]);\n\n return { scrollTop: scrollPos.scrollTop, scrollLeft: scrollPos.scrollLeft, handleScroll };\n}\n","import { useRef, useEffect, useLayoutEffect } from 'react';\nimport type { GridState } from '../../state/types';\nimport type {\n GridSortItem,\n GridFilterModel,\n GridPaginationModel,\n GridColumnPinning,\n} from '../../types';\n\nexport interface UseGridStateSnapshotParams {\n onStateChange?: (state: GridState) => void;\n sortModel: GridSortItem[];\n filterModel: GridFilterModel;\n effectivePaginationModel: GridPaginationModel;\n columnWidths: Record<string, number>;\n effectiveColumnOrder: string[];\n columnVisibilityModel: Record<string, boolean>;\n pinnedColumns: GridColumnPinning;\n}\n\nexport function useGridStateSnapshot(params: UseGridStateSnapshotParams): void {\n const {\n onStateChange,\n sortModel,\n filterModel,\n effectivePaginationModel,\n columnWidths,\n effectiveColumnOrder,\n columnVisibilityModel,\n pinnedColumns,\n } = params;\n\n const onStateChangeRef = useRef(onStateChange);\n useLayoutEffect(() => {\n onStateChangeRef.current = onStateChange;\n });\n\n useEffect(() => {\n if (!onStateChangeRef.current) return;\n\n const snapshot: GridState = {\n sorting: { sortModel: sortModel as { field: string; sort: 'asc' | 'desc' }[] },\n filter: { filterModel },\n pagination: { paginationModel: effectivePaginationModel },\n columns: {\n columnWidths,\n columnOrder: effectiveColumnOrder,\n columnVisibilityModel,\n pinnedColumns,\n },\n };\n\n onStateChangeRef.current(snapshot);\n }, [\n sortModel,\n filterModel,\n effectivePaginationModel,\n columnWidths,\n effectiveColumnOrder,\n columnVisibilityModel,\n pinnedColumns,\n ]);\n}\n","\nimport { useMemo, useEffect, useRef, useCallback, useState } from 'react';\nimport type {\n GridRowModel,\n GridColDef,\n GridAggregationModel,\n GridAggregationResult,\n GridFilterModel,\n GridSortItem,\n GridDataSource,\n} from '../../types';\n\nexport type BuiltInAggFn = 'sum' | 'avg' | 'count' | 'min' | 'max' | 'unique';\n\nconst AGGREGATION_FUNCTIONS: Record<BuiltInAggFn, (values: unknown[]) => unknown> = {\n sum: (values) => {\n const nums = values.filter((v) => v != null && !isNaN(Number(v)));\n return nums.reduce((acc: number, v) => acc + Number(v), 0);\n },\n avg: (values) => {\n const nums = values.filter((v) => v != null && !isNaN(Number(v)));\n if (nums.length === 0) return null;\n return nums.reduce((acc: number, v) => acc + Number(v), 0) / nums.length;\n },\n count: (values) => values.filter((v) => v != null).length,\n min: (values) => {\n const nums = values.filter((v) => v != null && !isNaN(Number(v))).map(Number);\n return nums.length ? Math.min(...nums) : null;\n },\n max: (values) => {\n const nums = values.filter((v) => v != null && !isNaN(Number(v))).map(Number);\n return nums.length ? Math.max(...nums) : null;\n },\n unique: (values) => new Set(values.filter((v) => v != null)).size,\n};\n\nexport function formatAggregationValue(value: unknown, fnName: string): string {\n if (value == null) return '—';\n if (typeof value === 'number') {\n if (fnName === 'avg') {\n return value.toLocaleString(undefined, { maximumFractionDigits: 2 });\n }\n return value.toLocaleString();\n }\n return String(value);\n}\n\nexport interface UseAggregationParams<R extends GridRowModel> {\n rows: R[];\n columns?: GridColDef[];\n aggregationModel: GridAggregationModel;\n isServerSide: boolean;\n dataSource?: GridDataSource<R>;\n filterModel?: GridFilterModel;\n sortModel?: GridSortItem[];\n serverAggregationResults?: GridAggregationResult | null;\n}\n\nexport interface UseAggregationReturn {\n aggregationResult: GridAggregationResult;\n isLoading: boolean;\n error: unknown;\n}\n\nexport function useAggregation<R extends GridRowModel>(\n params: UseAggregationParams<R>\n): UseAggregationReturn {\n const {\n rows,\n columns,\n aggregationModel,\n isServerSide,\n dataSource,\n filterModel,\n sortModel,\n serverAggregationResults,\n } = params;\n\n const columnsLookup = useMemo(() => {\n const map = new Map<string, GridColDef>();\n (columns ?? []).forEach(col => map.set(col.field, col));\n return map;\n }, [columns]);\n\n const clientResult = useMemo<GridAggregationResult>(() => {\n if (isServerSide || Object.keys(aggregationModel).length === 0) return {};\n\n const result: GridAggregationResult = {};\n for (const [field, fnName] of Object.entries(aggregationModel)) {\n const colDef = columnsLookup.get(field);\n if (colDef?.availableAggregationFunctions && !colDef.availableAggregationFunctions.includes(fnName)) {\n continue;\n }\n const fn = AGGREGATION_FUNCTIONS[fnName as BuiltInAggFn];\n if (!fn) {\n console.warn(`[useAggregation] Unknown aggregation function: \"${fnName}\"`);\n continue;\n }\n const values = rows.map((row) => (row as GridRowModel)[field]);\n result[field] = fn(values);\n }\n return result;\n }, [rows, columnsLookup, aggregationModel, isServerSide]);\n\n const [serverResult, setServerResult] = useState<GridAggregationResult>({});\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<unknown>(null);\n const requestIdRef = useRef(0);\n\n const fetchServerAggregations = useCallback(async () => {\n if (!dataSource?.getAggregations || Object.keys(aggregationModel).length === 0) return;\n\n const requestId = ++requestIdRef.current;\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await dataSource.getAggregations({\n sortModel: sortModel ?? [],\n filterModel: filterModel ?? { items: [] },\n groupKeys: [],\n aggregationModel,\n });\n\n if (requestId === requestIdRef.current) {\n setServerResult(result);\n }\n } catch (err) {\n if (requestId === requestIdRef.current) {\n setError(err);\n console.error('[useAggregation] Server aggregation error:', err);\n }\n } finally {\n if (requestId === requestIdRef.current) {\n setIsLoading(false);\n }\n }\n }, [dataSource, aggregationModel, filterModel, sortModel]);\n\n useEffect(() => {\n if (isServerSide && dataSource?.getAggregations && !serverAggregationResults) {\n fetchServerAggregations();\n }\n }, [fetchServerAggregations, isServerSide, dataSource, serverAggregationResults]);\n\n const aggregationResult = useMemo<GridAggregationResult>(() => {\n if (!isServerSide) return clientResult;\n\n if (serverAggregationResults && Object.keys(serverAggregationResults).length > 0) {\n return serverAggregationResults;\n }\n return serverResult;\n }, [isServerSide, clientResult, serverAggregationResults, serverResult]);\n\n return { aggregationResult, isLoading, error };\n}\n","import React, { useMemo } from 'react';\nimport { formatAggregationValue } from '../../hooks/features/useAggregation';\nimport type { GridColDef, GridAggregationModel, GridAggregationResult, GridColumnPinning } from '../../types';\nimport { calculatePinnedPositions, isColumnPinned } from '../../utils/pinning';\n\ninterface GridAggregationFooterProps {\n columns: GridColDef[];\n aggregationModel: GridAggregationModel;\n aggregationResult: GridAggregationResult;\n columnWidths: Record<string, number>;\n rowHeight: number;\n checkboxSelection: boolean;\n hasDetailPanel: boolean;\n rowReordering: boolean;\n pinnedColumns?: GridColumnPinning;\n}\n\nexport function GridAggregationFooter({\n columns,\n aggregationModel,\n aggregationResult,\n columnWidths,\n rowHeight,\n checkboxSelection,\n hasDetailPanel,\n rowReordering,\n pinnedColumns,\n}: GridAggregationFooterProps) {\n // Compute sticky left/right pixel offsets for each pinned column.\n // The footer always renders checkbox/detail/reorder spacers unconditionally,\n // so treat pinCheckboxColumn and pinExpandColumn as always true.\n const pinnedOffsets = useMemo(\n () => calculatePinnedPositions(\n columns,\n columnWidths,\n pinnedColumns,\n checkboxSelection,\n true,\n hasDetailPanel,\n true,\n rowReordering,\n ),\n [columns, columnWidths, pinnedColumns, checkboxSelection, hasDetailPanel, rowReordering]\n );\n\n const lastLeftField = pinnedColumns?.left?.[pinnedColumns.left.length - 1];\n const firstRightField = pinnedColumns?.right?.[0];\n\n return (\n <div\n className=\"ogx__aggregation-footer\"\n role=\"row\"\n aria-label=\"Aggregation totals\"\n aria-live=\"polite\"\n style={{ minHeight: `${rowHeight}px` }}\n >\n {checkboxSelection && <div style={{ width: 48, flexShrink: 0 }} />}\n {hasDetailPanel && <div style={{ width: 48, flexShrink: 0 }} />}\n {rowReordering && <div style={{ width: 48, flexShrink: 0 }} />}\n\n {columns.map((col) => {\n const fnName = (aggregationModel as Record<string, string>)[col.field];\n const rawValue = aggregationResult[col.field];\n const colWidth = columnWidths[col.field] ?? (typeof col.width === 'number' ? col.width : 120);\n\n const pinnedPosition = isColumnPinned(col.field, pinnedColumns);\n const pinnedOffset = pinnedPosition ? pinnedOffsets[col.field] : undefined;\n\n const className = [\n 'ogx__aggregation-cell',\n pinnedPosition === 'left' && 'ogx__aggregation-cell--pinned-left',\n pinnedPosition === 'right' && 'ogx__aggregation-cell--pinned-right',\n pinnedPosition === 'left' && col.field === lastLeftField && 'ogx__aggregation-cell--pinned-left-last',\n pinnedPosition === 'right' && col.field === firstRightField && 'ogx__aggregation-cell--pinned-right-first',\n ].filter(Boolean).join(' ');\n\n const style: React.CSSProperties = {\n width: colWidth,\n minWidth: colWidth,\n maxWidth: colWidth,\n textAlign: (col.align as React.CSSProperties['textAlign']) || 'left',\n };\n if (pinnedPosition === 'left' && pinnedOffset !== undefined) style.left = pinnedOffset;\n if (pinnedPosition === 'right' && pinnedOffset !== undefined) style.right = pinnedOffset;\n\n return (\n <div\n key={col.field}\n className={className}\n role=\"gridcell\"\n style={style}\n >\n {fnName ? (\n <>\n <span className=\"ogx__aggregation-label\">{fnName}</span>\n <span className=\"ogx__aggregation-value\">\n {formatAggregationValue(rawValue, fnName)}\n </span>\n </>\n ) : null}\n </div>\n );\n })}\n </div>\n );\n}\n","interface GridEmptyStateProps {\n noRowsLabel: string;\n width: number;\n}\n\nexport function GridEmptyState({ noRowsLabel, width }: GridEmptyStateProps) {\n return (\n <div className=\"ogx__empty\" style={{ width }}>\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <path d=\"M3 9h18M9 21V9\" />\n </svg>\n <span>{noRowsLabel}</span>\n </div>\n );\n}\n","interface GridErrorOverlayProps {\n error: unknown;\n}\n\nexport function GridErrorOverlay({ error }: GridErrorOverlayProps) {\n if (!error) return null;\n const message = error instanceof Error\n ? error.message\n : typeof error === 'string'\n ? error\n : 'An unexpected error occurred while loading the data.';\n return (\n <div className=\"ogx-error-overlay\" aria-live=\"assertive\" role=\"alert\">\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"var(--ogx-color-error)\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n <div className=\"ogx-error-overlay__title\">\n Oops! Something went wrong\n </div>\n <div className=\"ogx-error-overlay__message\">\n {message}\n </div>\n <button\n onClick={() => window.location.reload()}\n className=\"ogx-button ogx-button--primary\"\n >\n Retry\n </button>\n </div>\n );\n}\n","\nimport React from 'react';\n\nexport interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {\n indeterminate?: boolean;\n label?: string;\n inputRef?: React.Ref<HTMLInputElement>;\n}\n\nexport const Checkbox: React.FC<CheckboxProps> = ({\n indeterminate = false,\n label,\n className = '',\n inputRef,\n ...props\n}) => {\n const internalRef = React.useRef<HTMLInputElement>(null);\n\n // Combine refs\n const setRef = React.useCallback((element: HTMLInputElement | null) => {\n internalRef.current = element;\n\n if (typeof inputRef === 'function') {\n inputRef(element);\n } else if (inputRef) {\n (inputRef as React.MutableRefObject<HTMLInputElement | null>).current = element;\n }\n }, [inputRef]);\n\n React.useEffect(() => {\n if (internalRef.current) {\n internalRef.current.indeterminate = indeterminate;\n }\n }, [indeterminate]);\n\n const wrapperClassNames = [\n 'ogx-checkbox-wrapper',\n props.disabled && 'ogx-checkbox-wrapper--disabled',\n className\n ].filter(Boolean).join(' ');\n\n return (\n <label className={wrapperClassNames}>\n <input\n ref={setRef}\n type=\"checkbox\"\n className=\"ogx-checkbox__input\"\n aria-label={label || props['aria-label'] || (indeterminate ? 'Select some' : props.checked ? 'Deselect' : 'Select')}\n {...props}\n />\n <span className=\"ogx-checkbox__box\">\n {props.checked && !indeterminate && (\n <svg className=\"ogx-checkbox__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\" />\n </svg>\n )}\n {indeterminate && (\n <svg className=\"ogx-checkbox__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M19 13H5v-2h14v2z\" />\n </svg>\n )}\n </span>\n {label && <span className=\"ogx-checkbox__label\">{label}</span>}\n </label>\n );\n};\n","\nimport React, { useCallback, useRef, useState } from 'react';\n\n\nexport interface ColumnResizeHandleProps {\n field: string;\n currentWidth: number;\n onResize: (field: string, newWidth: number) => void;\n minWidth?: number;\n maxWidth?: number;\n}\n\nexport function ColumnResizeHandle(props: ColumnResizeHandleProps) {\n const { field, currentWidth, onResize, minWidth = 50, maxWidth = 1000 } = props;\n const [isDragging, setIsDragging] = useState(false);\n const startXRef = useRef<number>(0);\n const startWidthRef = useRef<number>(0);\n\n const handleMouseDown = useCallback((event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n\n setIsDragging(true);\n startXRef.current = event.clientX;\n // Use the logical stored width — reliable for pinned, flex, and normal columns\n startWidthRef.current = currentWidth;\n\n let lastUpdateTime = 0;\n const throttleMs = 16;\n\n const handleMouseMove = (e: MouseEvent) => {\n const deltaX = e.clientX - startXRef.current;\n const newWidth = Math.max(minWidth, Math.min(maxWidth, startWidthRef.current + deltaX));\n\n const now = Date.now();\n if (now - lastUpdateTime >= throttleMs) {\n onResize(field, newWidth);\n lastUpdateTime = now;\n }\n };\n\n const handleMouseUp = (e: MouseEvent) => {\n setIsDragging(false);\n\n const deltaX = e.clientX - startXRef.current;\n const newWidth = Math.max(minWidth, Math.min(maxWidth, startWidthRef.current + deltaX));\n\n onResize(field, newWidth);\n\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n }, [field, currentWidth, onResize, minWidth, maxWidth]);\n\n const handleDoubleClick = useCallback((event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n }, []);\n\n const classNames = [\n 'ogx-column-resize-handle',\n isDragging && 'ogx-column-resize-handle--dragging'\n ].filter(Boolean).join(' ');\n\n return (\n <div\n className={classNames}\n onMouseDown={handleMouseDown}\n onClick={(e) => e.stopPropagation()}\n onDragStart={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n onDoubleClick={handleDoubleClick}\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label={`Resize ${field} column`}\n >\n <div className=\"ogx-column-resize-handle__line\" />\n </div>\n );\n}\n","import React, { useRef, useEffect, useState } from 'react';\nimport ReactDOM from 'react-dom';\nimport type { GridColDef, GridRowModel, GridSortDirection, GridColumnPinning } from '../../types';\n\n\ninterface ColumnMenuProps {\n colDef: GridColDef<GridRowModel>;\n sortModel?: Array<{ field: string; sort: 'asc' | 'desc' }>;\n onSort?: (field: string, direction: GridSortDirection) => void;\n onHide?: (field: string) => void;\n onPin?: (field: string, side: 'left' | 'right' | null) => void;\n pinnedColumns?: GridColumnPinning;\n onManageColumns?: () => void;\n onClose: () => void;\n anchorEl: HTMLElement | null;\n}\n\nfunction ActiveDotIcon() {\n return (\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"currentColor\">\n <circle cx=\"4\" cy=\"4\" r=\"4\" />\n </svg>\n );\n}\n\nfunction InactiveDotIcon() {\n return (\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <circle cx=\"4\" cy=\"4\" r=\"3\" />\n </svg>\n );\n}\n\nfunction ManageColumnsIcon() {\n return (\n <svg focusable=\"false\" aria-hidden=\"true\" viewBox=\"0 0 24 24\" width=\"13\" height=\"13\" fill=\"none\">\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <rect x=\"8.5\" y=\"4\" width=\"7\" height=\"16\" fill=\"currentColor\" opacity=\"0.3\" />\n <line x1=\"8.5\" y1=\"4\" x2=\"8.5\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <line x1=\"15.5\" y1=\"4\" x2=\"15.5\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <line x1=\"2\" y1=\"9\" x2=\"22\" y2=\"9\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <line x1=\"2\" y1=\"14\" x2=\"22\" y2=\"14\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n </svg>\n );\n}\n\nfunction AscIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"5\" />\n <polyline points=\"5 12 12 5 19 12\" />\n </svg>\n );\n}\n\nfunction DescIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n <polyline points=\"19 12 12 19 5 12\" />\n </svg>\n );\n}\n\nfunction UnsortIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\">\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n );\n}\n\nfunction HideIcon() {\n return (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94\" />\n <path d=\"M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19\" />\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n </svg>\n );\n}\n\nfunction PinLeftIcon() {\n return (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n { }\n <line x1=\"4\" y1=\"2\" x2=\"4\" y2=\"22\" />\n { }\n <polyline points=\"11 8 4 12 11 16\" />\n { }\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n </svg>\n );\n}\n\nfunction PinRightIcon() {\n return (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n { }\n <line x1=\"20\" y1=\"2\" x2=\"20\" y2=\"22\" />\n { }\n <polyline points=\"13 8 20 12 13 16\" />\n { }\n <line x1=\"20\" y1=\"12\" x2=\"4\" y2=\"12\" />\n </svg>\n );\n}\n\nfunction UnpinIcon() {\n return (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"2\" y1=\"2\" x2=\"22\" y2=\"22\" />\n <line x1=\"4\" y1=\"4\" x2=\"4\" y2=\"20\" />\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n </svg>\n );\n}\n\nexport function ColumnMenu({ colDef, sortModel, onSort, onHide, onPin, pinnedColumns, onManageColumns, onClose, anchorEl }: ColumnMenuProps) {\n const menuRef = useRef<HTMLDivElement>(null);\n const [style, setStyle] = useState<React.CSSProperties>({ position: 'fixed', zIndex: 1300, top: 0, left: 0, visibility: 'hidden' });\n\n React.useLayoutEffect(() => {\n if (!anchorEl || !menuRef.current) return;\n\n const anchorRect = anchorEl.getBoundingClientRect();\n const menuRect = menuRef.current.getBoundingClientRect();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const margin = 8;\n\n let left = anchorRect.left;\n if (left + menuRect.width + margin > vw) {\n left = vw - menuRect.width - margin;\n }\n if (left < margin) left = margin;\n\n let top = anchorRect.bottom + 4;\n if (top + menuRect.height + margin > vh) {\n top = anchorRect.top - menuRect.height - 4;\n }\n\n setStyle({ position: 'fixed', zIndex: 1300, top, left, visibility: 'visible' });\n }, [anchorEl]);\n\n\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (\n menuRef.current && !menuRef.current.contains(event.target as Node) &&\n anchorEl && !anchorEl.contains(event.target as Node)\n ) onClose();\n }\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') onClose();\n }\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keydown', handleKey);\n // Close menu on any scroll or resize so it doesn't float detached from its anchor\n window.addEventListener('scroll', onClose, true);\n window.addEventListener('resize', onClose);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keydown', handleKey);\n window.removeEventListener('scroll', onClose, true);\n window.removeEventListener('resize', onClose);\n };\n }, [anchorEl, onClose]);\n\n const handleSort = (direction: GridSortDirection) => { onSort?.(colDef.field, direction); onClose(); };\n const handleHide = () => { onHide?.(colDef.field); onClose(); };\n const handlePin = (side: 'left' | 'right' | null) => { onPin?.(colDef.field, side); onClose(); };\n\n const currentSort = sortModel?.find(item => item.field === colDef.field)?.sort;\n const isUnsorted = currentSort === undefined || currentSort === null;\n\n const isPinnedLeft = pinnedColumns?.left?.includes(colDef.field) ?? false;\n const isPinnedRight = pinnedColumns?.right?.includes(colDef.field) ?? false;\n const isUnpinned = !isPinnedLeft && !isPinnedRight;\n\n const colLabel = colDef.headerName || colDef.field;\n\n return ReactDOM.createPortal(\n <div ref={menuRef} className=\"ogx-column-menu\" style={style} role=\"menu\" aria-label={`Column options for ${colLabel}`}>\n\n { }\n {onSort && colDef.sortable !== false && (\n <>\n <button className={`ogx-menu-item${currentSort === 'asc' ? ' ogx-menu-item--active' : ''}`}\n onClick={() => handleSort('asc')} role=\"menuitemradio\" aria-checked={currentSort === 'asc'}>\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\">{currentSort === 'asc' ? <ActiveDotIcon /> : <InactiveDotIcon />}</span>\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><AscIcon /></span>\n Sort Ascending\n </button>\n <button className={`ogx-menu-item${currentSort === 'desc' ? ' ogx-menu-item--active' : ''}`}\n onClick={() => handleSort('desc')} role=\"menuitemradio\" aria-checked={currentSort === 'desc'}>\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\">{currentSort === 'desc' ? <ActiveDotIcon /> : <InactiveDotIcon />}</span>\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><DescIcon /></span>\n Sort Descending\n </button>\n <button className={`ogx-menu-item${isUnsorted ? ' ogx-menu-item--active' : ''}`}\n onClick={() => handleSort(null)} role=\"menuitemradio\" aria-checked={isUnsorted}>\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\">{isUnsorted ? <ActiveDotIcon /> : <InactiveDotIcon />}</span>\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><UnsortIcon /></span>\n Unsort\n </button>\n <div className=\"ogx-menu-divider\" />\n </>\n )}\n\n { }\n <div className=\"ogx-menu-section-label\" aria-hidden=\"true\">Pin column</div>\n <button className={`ogx-menu-item${isPinnedLeft ? ' ogx-menu-item--active' : ''}`}\n onClick={() => handlePin('left')} role=\"menuitemradio\" aria-checked={isPinnedLeft} aria-label=\"Pin to left\">\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\">{isPinnedLeft ? <ActiveDotIcon /> : <InactiveDotIcon />}</span>\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><PinLeftIcon /></span>\n Pin to Left\n </button>\n <button className={`ogx-menu-item${isPinnedRight ? ' ogx-menu-item--active' : ''}`}\n onClick={() => handlePin('right')} role=\"menuitemradio\" aria-checked={isPinnedRight} aria-label=\"Pin to right\">\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\">{isPinnedRight ? <ActiveDotIcon /> : <InactiveDotIcon />}</span>\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><PinRightIcon /></span>\n Pin to Right\n </button>\n <button className={`ogx-menu-item${isUnpinned ? ' ogx-menu-item--active' : ''}`}\n onClick={() => handlePin(null)} role=\"menuitemradio\" aria-checked={isUnpinned} aria-label=\"Unpin column\">\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\">{isUnpinned ? <ActiveDotIcon /> : <InactiveDotIcon />}</span>\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><UnpinIcon /></span>\n Unpin\n </button>\n <div className=\"ogx-menu-divider\" />\n\n { }\n <button className=\"ogx-menu-item\" onClick={handleHide} role=\"menuitem\" aria-label={`Hide ${colLabel} column`}>\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\" />\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><HideIcon /></span>\n Hide Column\n </button>\n\n <div className=\"ogx-menu-divider\" />\n <button className=\"ogx-menu-item\" onClick={() => { onManageColumns?.(); onClose(); }} role=\"menuitem\" aria-label=\"Manage all columns\">\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\" />\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><ManageColumnsIcon /></span>\n Manage columns\n </button>\n </div>,\n (anchorEl?.closest('.ogx-theme-provider') || document.body)\n );\n}\n","import React, { useId } from 'react';\nimport { Checkbox } from '../ui/Checkbox';\nimport { ColumnResizeHandle } from '../ColumnResizeHandle/ColumnResizeHandle';\nimport type { GridColDef, GridRowModel, GridSortDirection, GridColumnPinning, GridAggregationModel, GridColumnGroup, GridColumnGroupingModel } from '../../types';\nimport { isColumnPinned, calculatePinnedPositions } from '../../utils/pinning';\nimport { ColumnMenu } from './ColumnMenu';\n\n\nfunction MenuIcon() {\n return (\n <svg focusable=\"false\" aria-hidden=\"true\" viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"18\" height=\"18\">\n <path d=\"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"></path>\n </svg>\n );\n}\n\nfunction SwapIcon() {\n return (\n <svg focusable=\"false\" aria-hidden=\"true\" viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"currentColor\">\n <path d=\"M6.99 11L3 15l3.99 4v-3H14v-2H6.99v-3zM21 9l-3.99-4v3H10v2h7.01v3L21 9z\"></path>\n </svg>\n );\n}\n\n\n// ─── Group header helpers ─────────────────────────────────────────────────────\n\n/** Collect all leaf field names from a group node (recursive). */\nfunction collectGroupFields(group: GridColumnGroup): string[] {\n const out: string[] = [];\n for (const child of group.children) {\n if (typeof child === 'string') out.push(child);\n else out.push(...collectGroupFields(child));\n }\n return out;\n}\n\n/** Max nesting depth of the group tree (1 = single level). */\nfunction groupTreeDepth(groups: GridColumnGroupingModel): number {\n let d = 0;\n function walk(g: GridColumnGroup, depth: number) {\n d = Math.max(d, depth);\n for (const c of g.children) if (typeof c !== 'string') walk(c, depth + 1);\n }\n groups.forEach(g => walk(g, 1));\n return d;\n}\n\ninterface GroupCell { key: string; label: string; width: number; isGroup: boolean; }\n\n/**\n * Builds the flat array of GroupCell descriptors for one row (level).\n * level 0 = top-most group row.\n * allFields is the ORDERED list of all visible columns (including spacers).\n */\nfunction buildGroupRow(\n groups: GridColumnGroupingModel,\n allFields: { field: string; width: number }[],\n level: number,\n): GroupCell[] {\n // Map each field → the group that owns it at `level`\n function findAtLevel(g: GridColumnGroup, field: string, cur: number): GridColumnGroup | null {\n if (!collectGroupFields(g).includes(field)) return null;\n if (cur === level) return g;\n for (const child of g.children) {\n if (typeof child !== 'string') {\n const found = findAtLevel(child, field, cur + 1);\n if (found) return found;\n }\n }\n return null;\n }\n\n const fieldGroup = new Map<string, GridColumnGroup | null>();\n for (const f of allFields) {\n let found: GridColumnGroup | null = null;\n for (const g of groups) {\n found = findAtLevel(g, f.field, 0);\n if (found) break;\n }\n fieldGroup.set(f.field, found);\n }\n\n const cells: GroupCell[] = [];\n let i = 0;\n while (i < allFields.length) {\n const item = allFields[i];\n const group = fieldGroup.get(item.field) ?? null;\n const w = item.width;\n\n if (!group) {\n cells.push({ key: `fg-${item.field}-${level}`, label: '', width: w, isGroup: false });\n i++;\n } else {\n let totalW = 0;\n let j = i;\n while (j < allFields.length && fieldGroup.get(allFields[j].field) === group) {\n totalW += allFields[j].width;\n j++;\n }\n cells.push({ key: `${group.groupId}-${level}`, label: group.headerName, width: totalW, isGroup: true });\n i = j;\n }\n }\n return cells;\n}\n\n// ─── Props ────────────────────────────────────────────────────────────────────\n\nexport interface HeaderProps<R extends GridRowModel = GridRowModel> {\n columns: GridColDef<R>[];\n allColumns?: GridColDef<R>[];\n columnGroupingModel?: GridColumnGroupingModel;\n checkboxSelection?: boolean;\n allSelected?: boolean;\n someSelected?: boolean;\n onSelectAll?: (isSelected: boolean) => void;\n onSort?: (field: string, direction: GridSortDirection) => void;\n sortModel?: Array<{ field: string; sort: 'asc' | 'desc' }>;\n onColumnResize?: (field: string, newWidth: number) => void;\n columnWidths?: Record<string, number>;\n pinnedColumns?: GridColumnPinning;\n hasDetailPanel?: boolean;\n pinCheckboxColumn?: boolean;\n pinExpandColumn?: boolean;\n rowReordering?: boolean;\n aggregationModel?: GridAggregationModel;\n\n draggedColumn?: string | null;\n dragOverColumn?: string | null;\n onDragStart?: (field: string) => (event: React.DragEvent) => void;\n onDragOver?: (field: string) => (event: React.DragEvent) => void;\n onDragEnd?: () => void;\n onDrop?: (targetField: string) => (event: React.DragEvent) => void;\n focusedCell?: { id: string | number; field: string } | null;\n onHeaderClick?: (field: string) => void;\n onSortAdd?: (field: string, direction: GridSortDirection) => void;\n multiSort?: boolean;\n onHideColumn?: (field: string) => void;\n onPinColumn?: (field: string, side: 'left' | 'right' | null) => void;\n onManageColumns?: () => void;\n}\n\nexport function Header<R extends GridRowModel = GridRowModel>(props: HeaderProps<R>) {\n const {\n columns,\n allColumns,\n columnGroupingModel,\n checkboxSelection = false,\n allSelected = false,\n someSelected = false,\n onSelectAll,\n onSort,\n sortModel = [],\n onColumnResize,\n columnWidths = {},\n pinnedColumns,\n hasDetailPanel = false,\n pinCheckboxColumn = true,\n pinExpandColumn = true,\n rowReordering = false,\n aggregationModel,\n draggedColumn,\n dragOverColumn,\n onDragStart,\n onDragOver,\n onDragEnd,\n onDrop,\n focusedCell,\n onHeaderClick,\n onSortAdd,\n multiSort = false,\n onHideColumn,\n onPinColumn,\n onManageColumns,\n } = props;\n\n const selectAllId = useId();\n const cellRefs = React.useRef<Record<string, HTMLElement | null>>({});\n const [menuOpenParams, setMenuOpenParams] = React.useState<{ colDef: GridColDef<R>; anchorEl: HTMLElement } | null>(null);\n\n const handleMenuOpen = (colDef: GridColDef<R>) => (event: React.MouseEvent) => {\n event.stopPropagation();\n setMenuOpenParams({ colDef, anchorEl: event.currentTarget as HTMLElement });\n };\n\n const handleMenuClose = () => {\n setMenuOpenParams(null);\n };\n\n React.useLayoutEffect(() => {\n if (focusedCell?.id === 'HEADER') {\n const element = cellRefs.current[focusedCell.field];\n if (element) {\n element.focus();\n }\n }\n }, [focusedCell]);\n\n const handleColumnClick = (colDef: GridColDef<R>) => (e: React.MouseEvent) => {\n if (colDef.sortable === false) return;\n\n const currentSort = sortModel.find(item => item.field === colDef.field);\n let newDirection: GridSortDirection = 'asc';\n\n if (currentSort) {\n if (currentSort.sort === 'asc') {\n newDirection = 'desc';\n } else {\n newDirection = null;\n }\n }\n\n if ((e.shiftKey || multiSort) && onSortAdd) {\n onSortAdd(colDef.field, newDirection);\n } else if (onSort) {\n onSort(colDef.field, newDirection);\n }\n };\n\n const getSortIcon = (field: string) => {\n const sortItem = sortModel.find(item => item.field === field);\n if (!sortItem) return null;\n\n const sortIndex = sortModel.length > 1 ? sortModel.indexOf(sortItem) + 1 : null;\n\n return (\n <span className={`ogx__sort-icon ogx__sort-icon--${sortItem.sort}`} aria-hidden=\"true\">\n {sortIndex !== null && (\n <span className=\"ogx__sort-badge\">{sortIndex}</span>\n )}\n </span>\n );\n };\n\n const pinnedPositions = React.useMemo(() => {\n return calculatePinnedPositions(\n columns,\n columnWidths,\n pinnedColumns,\n checkboxSelection,\n pinCheckboxColumn,\n hasDetailPanel,\n pinExpandColumn,\n rowReordering\n );\n }, [columns, columnWidths, pinnedColumns, checkboxSelection, pinCheckboxColumn, hasDetailPanel, pinExpandColumn, rowReordering]);\n\n const groupDepth = columnGroupingModel ? groupTreeDepth(columnGroupingModel) : 0;\n\n // All non-spacer fields in order (for group-span math) with their effective physical width\n const allCols = allColumns ?? columns;\n const allLeafFields = allCols\n .filter(c => !c.isSpacer)\n .map(c => ({\n field: c.field,\n width: columnWidths[c.field] ?? c.width ?? 100\n }));\n\n // --- CHECKBOX / DETAIL / REORDER prefix width (for group filler) ---\n const CHECKBOX_W = 48;\n const REORDER_W = 48;\n const EXPAND_W = 48;\n const prefixWidth =\n (rowReordering ? REORDER_W : 0) +\n (hasDetailPanel ? EXPAND_W : 0) +\n (checkboxSelection ? CHECKBOX_W : 0);\n\n return (\n // Outer sticky wrapper — both group rows AND column header row live here\n // so they ALL stay sticky together and scroll horizontally as one unit.\n <div className=\"ogx__header-wrap\">\n {/* ── Group header rows ── */}\n {groupDepth > 0 && Array.from({ length: groupDepth }, (_, level) => {\n const row = buildGroupRow(\n columnGroupingModel!,\n allLeafFields,\n level,\n );\n return (\n <div key={`ogx-grp-${level}`} className=\"ogx-col-group-row\" role=\"row\">\n {/* Filler for checkbox / reorder / detailPanel prefix */}\n {prefixWidth > 0 && (\n <div\n className=\"ogx-col-group-cell ogx-col-group-cell--filler\"\n style={{ width: prefixWidth, minWidth: prefixWidth, flexShrink: 0 }}\n role=\"columnheader\"\n />\n )}\n {row.map(cell => (\n <div\n key={cell.key}\n role=\"columnheader\"\n className={`ogx-col-group-cell ${cell.isGroup ? 'ogx-col-group-cell--group' : 'ogx-col-group-cell--filler'}`}\n style={{ width: cell.width, minWidth: cell.width, flexShrink: 0 }}\n title={cell.isGroup ? cell.label : undefined}\n >\n {cell.isGroup && (\n <span className=\"ogx-col-group-cell__label\">{cell.label}</span>\n )}\n </div>\n ))}\n </div>\n );\n })}\n\n {/* ── Column header row ── */}\n <div className=\"ogx__header\" role=\"row\">\n { }\n {rowReordering && (\n <div\n className=\"ogx__header-cell ogx__header-cell--pinned ogx__header-cell--pinned-left\"\n role=\"columnheader\"\n aria-label=\"Row reorder handle\"\n title=\"Drag to reorder rows\"\n style={{\n minWidth: 48,\n maxWidth: 48,\n position: 'sticky',\n left: 0,\n zIndex: 4\n }}\n />\n )}\n\n { }\n {hasDetailPanel && (\n <div\n className={`ogx__header-cell ogx__header-cell--expand ${pinExpandColumn ? 'ogx__header-cell--pinned ogx__header-cell--pinned-left' : ''\n }`}\n role=\"columnheader\"\n aria-label=\"Expand row details\"\n style={{\n minWidth: 48,\n maxWidth: 48,\n position: pinExpandColumn ? 'sticky' : undefined,\n left: pinExpandColumn ? (rowReordering ? 48 : 0) : undefined,\n zIndex: pinExpandColumn ? 5 : undefined\n }}\n >\n { }\n </div>\n )}\n\n { }\n {checkboxSelection && (\n <div\n className={`ogx__header-cell ogx__header-cell--checkbox ${pinCheckboxColumn ? 'ogx__header-cell--pinned ogx__header-cell--pinned-left' : ''\n }`}\n role=\"columnheader\"\n style={{\n position: pinCheckboxColumn ? 'sticky' : undefined,\n left: pinCheckboxColumn ? ((rowReordering ? 48 : 0) + (hasDetailPanel && pinExpandColumn ? 48 : 0)) : undefined,\n\n }}\n >\n <Checkbox\n id={selectAllId}\n name={selectAllId}\n checked={allSelected}\n indeterminate={someSelected}\n onChange={(e) => onSelectAll?.(e.target.checked)}\n aria-label={allSelected ? 'Deselect all rows' : 'Select all rows'}\n tabIndex={focusedCell?.id === 'HEADER' && focusedCell.field === '__checkbox_col__' ? 0 : -1}\n onMouseDown={(e) => e.preventDefault()}\n inputRef={(el) => { cellRefs.current['__checkbox_col__'] = el; }}\n />\n </div>\n )}\n\n {columns.map((colDef, index) => {\n if (colDef.isSpacer) {\n return (\n <div\n key={colDef.field}\n style={{ width: colDef.width, minWidth: colDef.width, flexShrink: 0 }}\n aria-hidden=\"true\"\n />\n );\n }\n const isSortable = colDef.sortable !== false;\n const isSorted = sortModel.some(item => item.field === colDef.field);\n const isResizable = colDef.resizable !== false;\n const pinnedPosition = isColumnPinned(colDef.field, pinnedColumns);\n const isPinned = pinnedPosition !== null;\n const isDragging = draggedColumn === colDef.field;\n const isDragOver = dragOverColumn === colDef.field;\n\n const classNames = [\n 'ogx__header-cell',\n `ogx__header-cell--align-${colDef.headerAlign || colDef.align || 'left'}`,\n isSortable && 'ogx__header-cell--sortable',\n isSorted && 'ogx__header-cell--sorted',\n isPinned && `ogx__header-cell--pinned`,\n isPinned && `ogx__header-cell--pinned-${pinnedPosition}`,\n isDragging && 'ogx__header-cell--dragging',\n isDragOver && 'ogx__header-cell--drag-over',\n (focusedCell?.id === 'HEADER' && focusedCell.field === colDef.field) && 'ogx__header-cell--focused',\n colDef.headerClassName\n ].filter(Boolean).join(' ');\n\n const effectiveWidth = columnWidths[colDef.field] ?? colDef.width ?? 100;\n\n const style: React.CSSProperties = {\n width: effectiveWidth,\n minWidth: colDef.minWidth,\n maxWidth: colDef.maxWidth,\n flexGrow: colDef.flex ?? 0,\n flexShrink: 0,\n flexBasis: colDef.flex ? 'auto' : 'auto',\n boxSizing: 'border-box',\n position: isPinned ? 'sticky' : 'relative',\n zIndex: colDef.zIndex,\n opacity: isDragging ? 0.5 : 1\n };\n\n if (isPinned && pinnedPosition) {\n const offset = pinnedPositions[colDef.field];\n if (pinnedPosition === 'left') {\n style.left = offset;\n } else {\n style.right = offset;\n }\n }\n\n const headerContent = colDef.renderHeader\n ? colDef.renderHeader({ field: colDef.field, colDef: colDef as unknown as GridColDef, colIndex: index })\n : colDef.headerName || colDef.field;\n\n const handleHeaderClick = (e: React.MouseEvent) => {\n if ((e.target as HTMLElement).closest('.ogx-column-resize-handle')) {\n e.stopPropagation();\n return;\n }\n onHeaderClick?.(colDef.field);\n if (isSortable) {\n handleColumnClick(colDef)(e);\n }\n };\n\n const handleDragStart = onDragStart ? onDragStart(colDef.field) : undefined;\n const handleDragOver = onDragOver ? onDragOver(colDef.field) : undefined;\n const handleDrop = onDrop ? onDrop(colDef.field) : undefined;\n\n return (\n <div\n key={colDef.field}\n className={classNames}\n style={style}\n title={colDef.description}\n onClick={handleHeaderClick}\n role=\"columnheader\"\n draggable={!!onDragStart}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDragEnd={onDragEnd}\n onDrop={handleDrop}\n aria-sort={\n isSortable\n ? (isSorted\n ? sortModel.find(item => item.field === colDef.field)?.sort === 'asc'\n ? 'ascending'\n : 'descending'\n : 'none')\n : undefined\n }\n aria-colindex={index + 1 + (checkboxSelection ? 1 : 0)}\n data-field={colDef.field}\n tabIndex={-1}\n ref={(el) => { cellRefs.current[colDef.field] = el; }}\n >\n <div className=\"ogx__header-cell-content\">\n {isDragging && (\n <div className=\"ogx__header-drag-icon\">\n <SwapIcon />\n </div>\n )}\n <div className=\"ogx__header-cell-title-wrapper\">\n <span className=\"ogx__header-cell-title\">\n {headerContent}\n </span>\n {aggregationModel && aggregationModel[colDef.field] && (\n <span className=\"ogx__header-cell-aggregation\">\n {aggregationModel[colDef.field]}\n </span>\n )}\n </div>\n {isSortable && getSortIcon(colDef.field)}\n {!colDef.disableColumnMenu && (\n <button\n className=\"ogx__menu-icon-btn\"\n onClick={handleMenuOpen(colDef)}\n aria-label={`Open column menu for ${colDef.headerName || colDef.field}`}\n aria-haspopup=\"menu\"\n tabIndex={-1}\n >\n <MenuIcon />\n </button>\n )}\n </div>\n\n { }\n {isResizable && onColumnResize && (\n <ColumnResizeHandle\n field={colDef.field}\n currentWidth={effectiveWidth}\n onResize={onColumnResize}\n minWidth={colDef.minWidth}\n maxWidth={colDef.maxWidth}\n />\n )}\n </div>\n );\n })}\n\n {menuOpenParams && (\n <ColumnMenu\n colDef={menuOpenParams.colDef as unknown as GridColDef<GridRowModel>}\n sortModel={sortModel}\n onSort={onSort}\n onHide={onHideColumn}\n onPin={onPinColumn}\n pinnedColumns={pinnedColumns}\n onManageColumns={onManageColumns}\n onClose={handleMenuClose}\n anchorEl={menuOpenParams.anchorEl}\n />\n )}\n </div>{/* end .ogx__header */}\n </div>\n );\n}\n","\nimport React from 'react';\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: 'text' | 'outlined' | 'contained';\n size?: 'small' | 'medium' | 'large';\n color?: 'primary' | 'secondary' | 'default';\n disabled?: boolean;\n children: React.ReactNode;\n}\n\nexport const Button: React.FC<ButtonProps> = ({\n variant = 'text',\n size = 'medium',\n color = 'default',\n disabled = false,\n className = '',\n children,\n ...props\n}) => {\n const classNames = [\n 'ogx-button',\n `ogx-button--${variant}`,\n `ogx-button--${size}`,\n `ogx-button--${color}`,\n disabled && 'ogx-button--disabled',\n className\n ].filter(Boolean).join(' ');\n\n return (\n <button\n className={classNames}\n disabled={disabled}\n {...props}\n >\n {children}\n </button>\n );\n};\n","\nimport React, { useId } from 'react';\nimport { Button } from '../ui/Button';\nimport type { GridLocaleText } from '../../types';\n\nexport interface PaginationProps {\n page: number;\n pageSize: number;\n rowCount: number;\n onPageChange: (page: number) => void;\n onPageSizeChange: (pageSize: number) => void;\n pageSizeOptions?: number[];\n showFirstButton?: boolean;\n showLastButton?: boolean;\n localeText?: Pick<GridLocaleText, 'paginationRowsPerPage' | 'paginationOf' | 'paginationPage'>;\n}\n\nexport function Pagination(props: PaginationProps) {\n const pageSizeId = useId();\n const {\n page,\n pageSize,\n rowCount,\n onPageChange,\n onPageSizeChange,\n pageSizeOptions = [10, 25, 50, 100],\n showFirstButton = true,\n showLastButton = true,\n localeText,\n } = props;\n\n const pageCount = Math.max(1, Math.ceil(rowCount / pageSize));\n const currentPage = Math.min(page, pageCount - 1);\n\n const firstRowIndex = currentPage * pageSize;\n const lastRowIndex = Math.min(firstRowIndex + pageSize, rowCount);\n const displayedRows = rowCount === 0 ? 0 : `${firstRowIndex + 1}–${lastRowIndex}`;\n\n const rowsPerPageLabel = localeText?.paginationRowsPerPage ?? 'Rows per page:';\n const ofLabel = localeText?.paginationOf\n ? localeText.paginationOf(rowCount === 0 ? 0 : firstRowIndex + 1, lastRowIndex, rowCount)\n : `${displayedRows} of ${rowCount}`;\n const pageLabel = localeText?.paginationPage\n ? localeText.paginationPage(currentPage + 1, pageCount)\n : `Page ${currentPage + 1} of ${pageCount}`;\n\n const handleFirstPage = () => {\n onPageChange(0);\n };\n\n const handlePreviousPage = () => {\n onPageChange(Math.max(0, currentPage - 1));\n };\n\n const handleNextPage = () => {\n onPageChange(Math.min(pageCount - 1, currentPage + 1));\n };\n\n const handleLastPage = () => {\n onPageChange(pageCount - 1);\n };\n\n const handlePageSizeChange = (event: React.ChangeEvent<HTMLSelectElement>) => {\n const newPageSize = parseInt(event.target.value, 10);\n onPageSizeChange(newPageSize);\n\n };\n\n const isFirstPage = currentPage === 0;\n const isLastPage = currentPage >= pageCount - 1;\n\n return (\n <div className=\"ogx-pagination\" role=\"navigation\" aria-label=\"Pagination\">\n { }\n <div className=\"ogx-pagination__page-size\">\n <label htmlFor={pageSizeId} className=\"ogx-pagination__label\">\n {rowsPerPageLabel}\n </label>\n <select\n id={pageSizeId}\n className=\"ogx-pagination__select\"\n value={pageSize}\n onChange={handlePageSizeChange}\n aria-label=\"Rows per page\"\n >\n {pageSizeOptions.map(option => (\n <option key={option} value={option}>\n {option}\n </option>\n ))}\n </select>\n </div>\n\n { }\n <div className=\"ogx-pagination__info\" aria-live=\"polite\" aria-atomic=\"true\">\n {ofLabel}\n </div>\n\n { }\n <div className=\"ogx-pagination__actions\">\n {showFirstButton && (\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={handleFirstPage}\n disabled={isFirstPage}\n aria-label=\"Go to first page\"\n title=\"First page\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M18.41 16.59L13.82 12l4.59-4.59L17 6l-6 6 6 6zM6 6h2v12H6z\" />\n </svg>\n </Button>\n )}\n\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={handlePreviousPage}\n disabled={isFirstPage}\n aria-label=\"Go to previous page\"\n title=\"Previous page\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\" />\n </svg>\n </Button>\n\n <div className=\"ogx-pagination__page-info\" aria-current=\"page\">\n {pageLabel}\n </div>\n\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={handleNextPage}\n disabled={isLastPage}\n aria-label=\"Go to next page\"\n title=\"Next page\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" />\n </svg>\n </Button>\n\n {showLastButton && (\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={handleLastPage}\n disabled={isLastPage}\n aria-label=\"Go to last page\"\n title=\"Last page\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M5.59 7.41L10.18 12l-4.59 4.59L7 18l6-6-6-6zM16 6h2v12h-2z\" />\n </svg>\n </Button>\n )}\n </div>\n </div>\n );\n}\n","\nimport { useReducer, useCallback, useState, useRef, useEffect, useLayoutEffect } from 'react';\nimport type {\n GridInternalState as GridState,\n GridRowModel,\n GridColDef,\n GridRowId,\n GridSortItem,\n GridFilterModel,\n GridPaginationModel,\n GridColumnVisibilityModel,\n GridApi\n} from '../../types';\n\ntype GridAction =\n | { type: 'SET_ROWS'; payload: GridRowModel[] | ((prev: GridRowModel[]) => GridRowModel[]); preserveRowCount?: boolean }\n | { type: 'SET_COLUMNS'; payload: GridColDef[] }\n | { type: 'SET_SORT_MODEL'; payload: GridSortItem[] }\n | { type: 'SET_FILTER_MODEL'; payload: GridFilterModel }\n | { type: 'SET_PAGINATION_MODEL'; payload: GridPaginationModel }\n | { type: 'SET_SELECTION'; payload: Set<GridRowId> }\n | { type: 'SET_DIMENSIONS'; payload: { viewportWidth: number; viewportHeight: number } }\n | { type: 'SET_DATASOURCE_LOADING'; payload: boolean }\n | { type: 'SET_DATASOURCE_ERROR'; payload: unknown }\n | { type: 'SET_ROW_COUNT'; payload: number };\n\nfunction createInitialState<R extends GridRowModel>(rows: R[], columns: GridColDef<R>[], columnVisibilityModel: GridColumnVisibilityModel = {}): GridState {\n const idRowsLookup = new Map<GridRowId, GridRowModel>();\n const allRows: GridRowId[] = [];\n\n rows.forEach(row => {\n idRowsLookup.set(row.id, row);\n allRows.push(row.id);\n });\n\n const columnLookup = new Map<string, GridColDef>();\n const orderedFields: string[] = [];\n\n columns.forEach(col => {\n columnLookup.set(col.field, col as unknown as GridColDef);\n orderedFields.push(col.field);\n });\n\n return {\n rows: {\n idRowsLookup,\n allRows\n },\n columns: {\n all: columns as unknown as GridColDef[],\n lookup: columnLookup,\n orderedFields,\n columnVisibilityModel\n },\n sorting: {\n sortModel: []\n },\n filter: {\n filterModel: { items: [] }\n },\n pagination: {\n paginationModel: { page: 0, pageSize: 100 },\n rowCount: rows.length\n },\n selection: {\n selectedRows: new Set()\n },\n pinning: {\n pinnedColumns: {},\n pinnedRows: {}\n },\n virtualization: {\n renderContext: {\n firstRowIndex: 0,\n lastRowIndex: 0,\n firstColumnIndex: 0,\n lastColumnIndex: 0\n },\n },\n dimensions: {\n rowHeight: 52,\n headerHeight: 56,\n viewportWidth: 0,\n viewportHeight: 0\n },\n dataSource: {\n loading: false,\n error: null\n }\n };\n}\n\nfunction gridReducer(state: GridState, action: GridAction): GridState {\n switch (action.type) {\n case 'SET_ROWS': {\n const currentRows = Array.from(state.rows.idRowsLookup.values());\n const newRows = typeof action.payload === 'function' \n ? action.payload(currentRows)\n : action.payload;\n\n const idRowsLookup = new Map<GridRowId, GridRowModel>();\n const allRows: GridRowId[] = [];\n\n newRows.forEach(row => {\n idRowsLookup.set(row.id, row);\n allRows.push(row.id);\n });\n\n return {\n ...state,\n rows: { idRowsLookup, allRows },\n pagination: {\n ...state.pagination,\n // Only override rowCount when we're NOT in server mode (i.e. no preserveRowCount flag)\n // Server-side fetches set rowCount separately via SET_ROW_COUNT.\n rowCount: action.preserveRowCount ? state.pagination.rowCount : newRows.length\n }\n };\n }\n\n case 'SET_COLUMNS': {\n const columnLookup = new Map<string, GridColDef>();\n const orderedFields: string[] = [];\n\n action.payload.forEach(col => {\n columnLookup.set(col.field, col);\n orderedFields.push(col.field);\n });\n\n return {\n ...state,\n columns: {\n all: action.payload,\n lookup: columnLookup,\n orderedFields,\n columnVisibilityModel: state.columns.columnVisibilityModel\n }\n };\n }\n\n case 'SET_SORT_MODEL':\n return {\n ...state,\n sorting: { sortModel: action.payload }\n };\n\n case 'SET_FILTER_MODEL':\n return {\n ...state,\n filter: { filterModel: action.payload }\n };\n\n case 'SET_PAGINATION_MODEL':\n return {\n ...state,\n pagination: {\n ...state.pagination,\n paginationModel: action.payload\n }\n };\n\n case 'SET_SELECTION':\n return {\n ...state,\n selection: { selectedRows: action.payload }\n };\n\n case 'SET_DIMENSIONS':\n return {\n ...state,\n dimensions: {\n ...state.dimensions,\n viewportWidth: action.payload.viewportWidth,\n viewportHeight: action.payload.viewportHeight\n }\n };\n\n case 'SET_DATASOURCE_LOADING':\n return {\n ...state,\n dataSource: {\n ...state.dataSource,\n loading: action.payload\n }\n };\n\n case 'SET_DATASOURCE_ERROR':\n return {\n ...state,\n dataSource: {\n ...state.dataSource,\n error: action.payload\n }\n };\n\n case 'SET_ROW_COUNT':\n return {\n ...state,\n pagination: {\n ...state.pagination,\n rowCount: action.payload\n }\n };\n\n default:\n return state;\n }\n}\n\nexport interface UseDataGridParams<R extends GridRowModel = GridRowModel> {\n rows: R[];\n columns: GridColDef<R>[];\n rowHeight?: number;\n headerHeight?: number;\n rowCount?: number;\n columnVisibilityModel?: GridColumnVisibilityModel;\n initialState?: import('../../state/types').GridInitialState;\n}\n\nexport function useDataGrid<R extends GridRowModel = GridRowModel>(params: UseDataGridParams<R>) {\n const { rows, columns, rowHeight = 52, headerHeight = 56, columnVisibilityModel, initialState: propInitialState } = params;\n\n const [internalInitialState] = useState(() =>\n createInitialState(rows, columns, columnVisibilityModel)\n );\n\n const [state, dispatch] = useReducer(gridReducer, {\n ...internalInitialState,\n sorting: propInitialState?.sorting || internalInitialState.sorting,\n filter: propInitialState?.filter || internalInitialState.filter,\n dataSource: propInitialState?.dataSource\n ? { ...internalInitialState.dataSource, ...propInitialState.dataSource }\n : internalInitialState.dataSource,\n pagination: {\n ...internalInitialState.pagination,\n ...(propInitialState?.pagination || {}),\n rowCount: params.rowCount ?? propInitialState?.pagination?.rowCount ?? internalInitialState.pagination.rowCount\n },\n dimensions: {\n ...internalInitialState.dimensions,\n rowHeight,\n headerHeight\n }\n });\n\n const stateRef = useRef(state);\n useLayoutEffect(() => { stateRef.current = state; });\n\n // Sync internal state when the external `rows` prop changes\n const prevRowsRef = useRef(rows);\n useEffect(() => {\n if (rows !== prevRowsRef.current) {\n prevRowsRef.current = rows;\n dispatch({ type: 'SET_ROWS', payload: rows as GridRowModel[] });\n }\n }, [rows]);\n\n const setRows = useCallback((rowsOrUpdater: GridRowModel[] | ((prev: GridRowModel[]) => GridRowModel[]), preserveRowCount?: boolean) => {\n dispatch({ type: 'SET_ROWS', payload: rowsOrUpdater, preserveRowCount });\n }, []);\n\n const setColumns = useCallback((newColumns: GridColDef[]) => {\n dispatch({ type: 'SET_COLUMNS', payload: newColumns });\n }, []);\n\n const setSortModel = useCallback((sortModel: GridSortItem[]) => {\n dispatch({ type: 'SET_SORT_MODEL', payload: sortModel });\n }, []);\n\n const setFilterModel = useCallback((filterModel: GridFilterModel) => {\n dispatch({ type: 'SET_FILTER_MODEL', payload: filterModel });\n }, []);\n\n const setPaginationModel = useCallback((paginationModel: GridPaginationModel) => {\n dispatch({ type: 'SET_PAGINATION_MODEL', payload: paginationModel });\n }, []);\n\n const setSelection = useCallback((selectedRows: Set<GridRowId>) => {\n dispatch({ type: 'SET_SELECTION', payload: selectedRows });\n }, []);\n\n const setDimensions = useCallback((viewportWidth: number, viewportHeight: number) => {\n dispatch({ type: 'SET_DIMENSIONS', payload: { viewportWidth, viewportHeight } });\n }, []);\n\n const setDataSourceLoading = useCallback((loading: boolean) => {\n dispatch({ type: 'SET_DATASOURCE_LOADING', payload: loading });\n }, []);\n\n const setDataSourceError = useCallback((error: unknown) => {\n dispatch({ type: 'SET_DATASOURCE_ERROR', payload: error });\n }, []);\n\n const setRowCount = useCallback((count: number) => {\n dispatch({ type: 'SET_ROW_COUNT', payload: count });\n }, []);\n\n const apiRef = useRef<GridApi>({\n getRow: (id: GridRowId) => stateRef.current.rows.idRowsLookup.get(id) || null,\n getAllRows: () => Array.from(stateRef.current.rows.idRowsLookup.values()),\n getVisibleRows: () => Array.from(stateRef.current.rows.idRowsLookup.values()),\n getAllFilteredRows: () => Array.from(stateRef.current.rows.idRowsLookup.values()),\n getGroupedExportRows: () => null,\n getAggregationResult: () => null,\n getAggregationModel: () => null,\n getColumn: (field: string) => stateRef.current.columns.lookup.get(field) || null,\n getAllColumns: () => stateRef.current.columns.all,\n getVisibleColumns: () => stateRef.current.columns.all,\n selectRow: (id: GridRowId, isSelected = true) => {\n const newSelection = new Set(stateRef.current.selection.selectedRows);\n if (isSelected) {\n newSelection.add(id);\n } else {\n newSelection.delete(id);\n }\n setSelection(newSelection);\n },\n selectRows: (ids: GridRowId[], isSelected = true) => {\n const newSelection = new Set(stateRef.current.selection.selectedRows);\n ids.forEach(id => {\n if (isSelected) {\n newSelection.add(id);\n } else {\n newSelection.delete(id);\n }\n });\n setSelection(newSelection);\n },\n getSelectedRows: () => Array.from(stateRef.current.selection.selectedRows),\n sortColumn: (field: string, direction) => {\n if (direction === null) {\n setSortModel(stateRef.current.sorting.sortModel.filter(item => item.field !== field));\n } else {\n const existingIndex = stateRef.current.sorting.sortModel.findIndex(item => item.field === field);\n if (existingIndex >= 0) {\n const newModel = [...stateRef.current.sorting.sortModel];\n newModel[existingIndex] = { field, sort: direction };\n setSortModel(newModel);\n } else {\n setSortModel([...stateRef.current.sorting.sortModel, { field, sort: direction }]);\n }\n }\n },\n getSortModel: () => stateRef.current.sorting.sortModel,\n setFilterModel,\n getFilterModel: () => stateRef.current.filter.filterModel,\n setPage: (page: number) => {\n setPaginationModel({ ...stateRef.current.pagination.paginationModel, page });\n },\n setPageSize: (pageSize: number) => {\n setPaginationModel({ ...stateRef.current.pagination.paginationModel, pageSize, page: 0 });\n },\n scrollToIndexes: () => {\n\n },\n copySelectedRows: () => Promise.resolve()\n });\n\n return {\n state,\n dispatch,\n apiRef,\n setRows,\n setColumns,\n setSortModel,\n setFilterModel,\n setPaginationModel,\n setSelection,\n setDimensions,\n setDataSourceLoading,\n setDataSourceError,\n setRowCount\n };\n}\n","import { useState, useCallback } from 'react';\nimport type { GridRowId, GridRowModel, GridRowOrderChangeParams } from '../types';\n\nexport interface UseRowReorderProps<R extends GridRowModel = GridRowModel> {\n onRowOrderChange?: (params: GridRowOrderChangeParams<R>) => void;\n rows: R[];\n getRowId?: (row: R) => GridRowId;\n rowReordering?: boolean;\n}\n\nexport interface UseRowReorderReturn {\n draggedRowId: GridRowId | null;\n dragOverRowId: GridRowId | null;\n onDragStart: ((id: GridRowId) => (event: React.DragEvent) => void) | undefined;\n onDragOver: ((id: GridRowId) => (event: React.DragEvent) => void) | undefined;\n onDragEnd: (() => void) | undefined;\n onDrop: ((targetId: GridRowId) => (event: React.DragEvent) => void) | undefined;\n}\n\nexport function useRowReorder<R extends GridRowModel = GridRowModel>(\n props: UseRowReorderProps<R>\n): UseRowReorderReturn {\n const { onRowOrderChange, rows, getRowId, rowReordering = false } = props;\n const [draggedRowId, setDraggedRowId] = useState<GridRowId | null>(null);\n const [dragOverRowId, setDragOverRowId] = useState<GridRowId | null>(null);\n\n const getRowIdInternal = useCallback((row: R) => {\n return getRowId ? getRowId(row) : row.id;\n }, [getRowId]);\n\n const handleDragStart = useCallback((id: GridRowId) => (event: React.DragEvent) => {\n if (!rowReordering) return;\n setDraggedRowId(id);\n event.dataTransfer.effectAllowed = 'move';\n\n }, [rowReordering]);\n\n const handleDragOver = useCallback((id: GridRowId) => (event: React.DragEvent) => {\n if (!rowReordering || !draggedRowId) return;\n event.preventDefault(); \n event.dataTransfer.dropEffect = 'move';\n\n if (dragOverRowId !== id) {\n setDragOverRowId(id);\n }\n }, [rowReordering, draggedRowId, dragOverRowId]);\n\n const handleDragEnd = useCallback(() => {\n setDraggedRowId(null);\n setDragOverRowId(null);\n }, []);\n\n const handleDrop = useCallback((targetId: GridRowId) => (event: React.DragEvent) => {\n event.preventDefault();\n\n if (!draggedRowId || !onRowOrderChange) {\n handleDragEnd();\n return;\n }\n\n const oldIndex = rows.findIndex(r => getRowIdInternal(r) === draggedRowId);\n const targetIndex = rows.findIndex(r => getRowIdInternal(r) === targetId);\n\n if (oldIndex !== -1 && targetIndex !== -1 && oldIndex !== targetIndex) {\n onRowOrderChange({\n row: rows[oldIndex],\n oldIndex,\n targetIndex\n });\n }\n\n handleDragEnd();\n }, [draggedRowId, onRowOrderChange, rows, getRowIdInternal, handleDragEnd]);\n\n return {\n draggedRowId,\n dragOverRowId,\n onDragStart: rowReordering ? handleDragStart : undefined,\n onDragOver: rowReordering ? handleDragOver : undefined,\n onDragEnd: rowReordering ? handleDragEnd : undefined,\n onDrop: rowReordering ? handleDrop : undefined,\n };\n}\n","import { useMemo, useState, useCallback, useEffect } from 'react';\nimport { GridRowModel, GridRowId, GridTreeNode, GridFilterModel, GridSortItem } from '../types';\nimport type { GridRowMeta } from '../types';\nimport { isRowMatchingFilter } from '../utils/filtering';\nimport { compareValues } from '../utils/sorting';\n\ninterface UseTreeDataProps<R extends GridRowModel> {\n rows: R[];\n getRowId: (row: R) => GridRowId;\n getTreeDataPath?: (row: R) => string[];\n treeData?: boolean;\n defaultGroupingExpansionDepth?: number;\n filterModel?: GridFilterModel;\n sortModel?: GridSortItem[];\n onRowExpansionChange?: (node: GridTreeNode) => void;\n}\n\nexport function useTreeData<R extends GridRowModel>(props: UseTreeDataProps<R>) {\n const { \n rows, \n getRowId,\n getTreeDataPath, \n treeData = false, \n defaultGroupingExpansionDepth = 0, \n filterModel,\n sortModel,\n onRowExpansionChange\n } = props;\n\n const { treeNodes, rootIds, groupingRows } = useMemo(() => {\n if (!treeData || !getTreeDataPath) {\n return { \n treeNodes: new Map<GridRowId, GridTreeNode>(), \n rootIds: [], \n groupingRows: [] \n };\n }\n\n const nodes = new Map<GridRowId, GridTreeNode>();\n const roots: GridRowId[] = [];\n const groupRows: GridRowModel[] = [];\n const pathLookup = new Map<string, GridRowId>();\n\n const getPathKey = (path: string[]) => path.join('/');\n\n rows.forEach(row => {\n const id = getRowId(row);\n const path = getTreeDataPath(row);\n const pathKey = getPathKey(path);\n\n pathLookup.set(pathKey, id);\n\n nodes.set(id, {\n id,\n parentId: null,\n depth: path.length - 1,\n groupingKey: path[path.length - 1],\n isExpanded: false,\n children: [],\n serverChildrenCount: row.serverChildrenCount\n });\n });\n\n rows.forEach(row => {\n const id = getRowId(row);\n const path = getTreeDataPath(row);\n\n if (path.length === 1) {\n roots.push(id);\n return;\n }\n\n const ensureAncestors = (childPath: string[]) => {\n if (childPath.length <= 1) return;\n\n const parentPath = childPath.slice(0, -1);\n const parentPathKey = getPathKey(parentPath);\n let parentId = pathLookup.get(parentPathKey);\n\n if (parentId === undefined) {\n parentId = `auto-group-${parentPathKey}`;\n\n if (!nodes.has(parentId)) {\n const groupLabel = parentPath[parentPath.length - 1];\n nodes.set(parentId, {\n id: parentId,\n parentId: null, \n depth: parentPath.length - 1,\n groupingKey: groupLabel,\n isExpanded: false,\n children: [],\n label: groupLabel\n });\n pathLookup.set(parentPathKey, parentId);\n\n const groupRow = { \n id: parentId,\n name: groupLabel, \n _isGroupRow: true\n } as unknown as GridRowModel; \n groupRows.push(groupRow);\n\n if (parentPath.length === 1) {\n roots.push(parentId);\n }\n\n ensureAncestors(parentPath);\n }\n }\n\n return parentId;\n };\n\n const parentId = ensureAncestors(path);\n\n if (parentId !== undefined) {\n const parentNode = nodes.get(parentId);\n const childNode = nodes.get(id);\n\n if (parentNode && childNode) {\n childNode.parentId = parentId;\n parentNode.children = parentNode.children || [];\n if (!parentNode.children.includes(id)) {\n parentNode.children.push(id);\n }\n }\n }\n });\n\n groupRows.forEach(groupRow => {\n const groupId = groupRow.id;\n const node = nodes.get(groupId);\n if (!node) return;\n\n const nodePathKey = (groupId as string).replace('auto-group-', '');\n const nodePath = nodePathKey.split('/');\n\n if (nodePath.length > 1) {\n const parentPath = nodePath.slice(0, -1);\n const parentPathKey = getPathKey(parentPath);\n const parentId = pathLookup.get(parentPathKey);\n\n if (parentId && nodes.has(parentId)) {\n node.parentId = parentId;\n const parentNode = nodes.get(parentId);\n if (parentNode) {\n parentNode.children = parentNode.children || [];\n if (!parentNode.children.includes(groupId)) {\n parentNode.children.push(groupId);\n }\n }\n }\n }\n });\n\n return { treeNodes: nodes, rootIds: roots, groupingRows: groupRows };\n\n }, [rows, getTreeDataPath, treeData, getRowId]);\n\n const initialExpandedIds = useMemo(() => {\n if (!treeData) return new Set<GridRowId>();\n\n const initialExpanded = new Set<GridRowId>();\n treeNodes.forEach(node => {\n if (node.children && node.children.length > 0) {\n if (defaultGroupingExpansionDepth === -1 || node.depth < defaultGroupingExpansionDepth) {\n initialExpanded.add(node.id);\n }\n }\n });\n return initialExpanded;\n }, [treeNodes, treeData, defaultGroupingExpansionDepth]);\n\n const [expandedGroupIds, setExpandedGroupIds] = useState<Set<GridRowId>>(new Set());\n\n useEffect(() => {\n if (initialExpandedIds.size > 0) {\n setExpandedGroupIds(initialExpandedIds);\n }\n }, [initialExpandedIds]);\n\n const toggleExpansion = useCallback((id: GridRowId) => {\n setExpandedGroupIds(prev => {\n const next = new Set(prev);\n const isExpanding = !next.has(id);\n\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n\n if (isExpanding && onRowExpansionChange) {\n const node = treeNodes.get(id);\n if (node) {\n onRowExpansionChange(node);\n }\n }\n\n return next;\n });\n }, [treeNodes, onRowExpansionChange]);\n\n const getVisibleRows = useCallback(() => {\n\n if (!treeData) return null; \n\n const rowLookup = new Map<GridRowId, GridRowModel>();\n rows.forEach(r => rowLookup.set(getRowId(r), r));\n groupingRows.forEach(r => rowLookup.set(r.id, r));\n\n const matchesFilter = (row: GridRowModel) => {\n return isRowMatchingFilter(row, filterModel!);\n };\n\n const filterCache = new Map<GridRowId, boolean>();\n\n const isNodeVisible = (id: GridRowId): boolean => {\n if (filterCache.has(id)) return filterCache.get(id)!;\n\n const row = rowLookup.get(id);\n if (!row) return false;\n\n const selfMatch = matchesFilter(row);\n if (selfMatch) {\n filterCache.set(id, true);\n return true;\n }\n\n const node = treeNodes.get(id);\n if (node && node.children) {\n const childMatch = node.children.some(childId => isNodeVisible(childId));\n if (childMatch) {\n filterCache.set(id, true);\n return true;\n }\n }\n\n filterCache.set(id, false);\n return false;\n };\n\n const sortNodes = (aId: GridRowId, bId: GridRowId) => {\n if (!sortModel || sortModel.length === 0) return 0;\n const rowA = rowLookup.get(aId);\n const rowB = rowLookup.get(bId);\n if (!rowA || !rowB) return 0;\n\n for (const sortItem of sortModel) {\n const valA = rowA[sortItem.field];\n const valB = rowB[sortItem.field];\n const comp = compareValues(valA, valB, sortItem.sort);\n if (comp !== 0) return comp;\n }\n return 0;\n };\n\n const result: GridRowModel[] = [];\n\n const seenIds = new Set<GridRowId>();\n\n const traverse = (ids: GridRowId[]) => {\n\n const visibleIds = ids.filter(id => isNodeVisible(id));\n\n visibleIds.sort(sortNodes);\n\n visibleIds.forEach(id => {\n if (seenIds.has(id)) return; \n\n const row = rowLookup.get(id);\n const node = treeNodes.get(id);\n\n if (row && node) {\n seenIds.add(id); \n\n const enhancedRow = {\n ...row,\n _treeDepth: node.depth,\n _isExpanded: expandedGroupIds.has(id),\n _hasChildren: Boolean((node.children && node.children.length > 0) || (node.serverChildrenCount && node.serverChildrenCount > 0)),\n _descendantCount: node.children ? node.children.length : 0\n };\n result.push(enhancedRow);\n\n if (expandedGroupIds.has(id) && node.children && node.children.length > 0) {\n traverse(node.children);\n }\n }\n });\n };\n\n traverse(rootIds);\n return result;\n\n }, [treeData, rows, groupingRows, rootIds, treeNodes, expandedGroupIds, filterModel, sortModel, getRowId]);\n\n const isGroupExpanded = useCallback((id: GridRowId) => expandedGroupIds.has(id), [expandedGroupIds]);\n const getNode = useCallback((id: GridRowId) => treeNodes.get(id), [treeNodes]);\n\n const getNodePath = useCallback((id: GridRowId): string[] => {\n const path: string[] = [];\n let currentId: GridRowId | null = id;\n\n while (currentId !== null) {\n const node = treeNodes.get(currentId);\n if (!node) break;\n\n path.unshift(node.groupingKey);\n currentId = node.parentId;\n }\n return path;\n }, [treeNodes]);\n\n const rowMetaMap = useMemo<Map<GridRowId, GridRowMeta>>(() => {\n const map = new Map<GridRowId, GridRowMeta>();\n const groupRowIds = new Set(groupingRows.map(r => r.id));\n treeNodes.forEach((node, id) => {\n map.set(id, {\n hasChildren: Boolean(\n (node.children && node.children.length > 0) ||\n (node.serverChildrenCount && node.serverChildrenCount > 0)\n ),\n treeDepth: node.depth,\n descendantCount: node.children ? node.children.length : undefined,\n isGroupRow: groupRowIds.has(id),\n isExpanded: expandedGroupIds.has(id),\n });\n });\n return map;\n }, [treeNodes, groupingRows, expandedGroupIds]);\n\n return useMemo(() => ({\n treeNodes,\n groupingRows,\n toggleExpansion,\n isGroupExpanded,\n getVisibleRows,\n getNode,\n getNodePath,\n rowMetaMap,\n }), [treeNodes, groupingRows, toggleExpansion, isGroupExpanded, getVisibleRows, getNode, getNodePath, rowMetaMap]);\n}\n","import { useState, useMemo, useEffect, useCallback } from 'react';\nimport type {\n GridRowModel,\n GridRowId,\n GridRowGroupingModel,\n GridAggregationModel,\n GridTreeNode,\n GridFilterModel,\n GridSortItem,\n GridRowMeta,\n GridColDef\n} from '../types';\nimport { isRowMatchingFilter } from '../utils/filtering';\nimport { compareValues } from '../utils/sorting';\n\nexport interface UseRowGroupingParams<R extends GridRowModel> {\n rows: R[];\n getRowId: (row: R) => GridRowId;\n columns?: GridColDef<R>[];\n rowGroupingModel?: GridRowGroupingModel;\n aggregationModel?: GridAggregationModel;\n defaultGroupingExpansionDepth?: number;\n filterModel?: GridFilterModel;\n sortModel?: GridSortItem[];\n getAggregationPosition?: (groupNode: GridTreeNode | null) => 'inline' | 'footer' | null;\n}\n\nconst defaultGetAggregationPosition = (groupNode: GridTreeNode | null): 'inline' | 'footer' | null => {\n\n return groupNode?.depth === -1 ? 'footer' : 'inline';\n};\n\n// Stable empty defaults — module-level constants prevent new object identity\n// on every render, which would otherwise invalidate useMemo deps and cause\n// infinite re-render loops when callers omit optional params.\nconst EMPTY_ROW_GROUPING_MODEL: GridRowGroupingModel = [];\nconst EMPTY_AGGREGATION_MODEL: GridAggregationModel = {};\n\nexport function useRowGrouping<R extends GridRowModel>(params: UseRowGroupingParams<R>) {\n const {\n rows,\n getRowId,\n columns,\n rowGroupingModel = EMPTY_ROW_GROUPING_MODEL,\n aggregationModel = EMPTY_AGGREGATION_MODEL,\n defaultGroupingExpansionDepth = 0,\n filterModel,\n sortModel,\n getAggregationPosition = defaultGetAggregationPosition\n } = params;\n\n const columnsLookup = useMemo(() => {\n const map = new Map<string, GridColDef<R>>();\n (columns ?? []).forEach(col => map.set(col.field, col));\n return map;\n }, [columns]);\n\n const [expandedGroupIds, setExpandedGroupIds] = useState<Set<GridRowId>>(new Set());\n\n const { treeNodes, rootIds, groupingRows } = useMemo(() => {\n const treeNodes = new Map<GridRowId, GridTreeNode>();\n const groupingRows = new Map<GridRowId, R>();\n const rootIds: GridRowId[] = [];\n\n if (rowGroupingModel.length === 0) {\n return { treeNodes, rootIds, groupingRows };\n }\n\n const getGroupId = (field: string, value: unknown, parentId: GridRowId | null) => {\n return `auto-group-${field}-${value}-${parentId || 'root'}`;\n };\n\n const groupRows = (\n currentRows: R[], \n depth: number, \n parentId: GridRowId | null\n ) => {\n if (depth >= rowGroupingModel.length) {\n\n return currentRows.map(row => {\n const id = getRowId(row);\n treeNodes.set(id, {\n id,\n parentId,\n depth,\n groupingKey: '',\n isExpanded: false\n });\n return id;\n });\n }\n\n const field = rowGroupingModel[depth];\n\n // Skip fields where the column has explicitly opted out of grouping.\n const colDef = columnsLookup.get(field);\n if (colDef && colDef.groupable === false) {\n return groupRows(currentRows, depth + 1, parentId);\n }\n\n const groups = new Map<string, R[]>();\n\n // Group current rows by value of the current field\n currentRows.forEach(row => {\n const value = row[field];\n const key = String(value); // reliable map key\n if (!groups.has(key)) {\n groups.set(key, []);\n }\n groups.get(key)!.push(row);\n });\n\n const groupIds: GridRowId[] = [];\n\n // Create group rows\n groups.forEach((groupRowsList, key) => {\n // Use the raw value from the first row of the group for the groupingValue\n const firstRow = groupRowsList[0];\n const rawValue = firstRow[field];\n\n const groupId = getGroupId(field, key, parentId);\n groupIds.push(groupId);\n\n // Calculate Aggregations for this group\n const aggregatedValues: Record<string, unknown> = {};\n if (aggregationModel) {\n Object.entries(aggregationModel).forEach(([aggField, aggType]) => {\n const values = groupRowsList.map(r => r[aggField]);\n if (aggType === 'sum') {\n aggregatedValues[aggField] = values.reduce((a: number, b) => a + (Number(b) || 0), 0);\n } else if (aggType === 'min') {\n aggregatedValues[aggField] = Math.min(...values.map(v => Number(v) || 0));\n } else if (aggType === 'max') {\n aggregatedValues[aggField] = Math.max(...values.map(v => Number(v) || 0));\n } else if (aggType === 'avg') {\n const sum = values.reduce((a: number, b) => a + (Number(b) || 0), 0);\n aggregatedValues[aggField] = values.length ? sum / values.length : 0;\n } else if (aggType === 'count') {\n aggregatedValues[aggField] = values.length;\n }\n });\n }\n\n const groupRow = {\n [field]: rawValue,\n ...aggregatedValues,\n id: groupId\n } as unknown as R;\n\n groupingRows.set(groupId, groupRow);\n\n const treeNode: GridTreeNode = {\n id: groupId,\n parentId,\n depth,\n groupingKey: key,\n groupingField: field,\n groupingValue: rawValue,\n aggregatedValues,\n isExpanded: false,\n children: [], \n label: colDef?.groupingValueFormatter\n ? colDef.groupingValueFormatter({ field, value: rawValue })\n : `${field}: ${String(rawValue)}` \n };\n\n treeNode.aggregationPosition = getAggregationPosition(treeNode);\n\n treeNodes.set(groupId, treeNode);\n\n const childrenIds = groupRows(groupRowsList, depth + 1, groupId);\n treeNodes.get(groupId)!.children = childrenIds;\n\n const descendantCount = groupRowsList.length;\n treeNodes.get(groupId)!.descendantCount = descendantCount;\n });\n\n return groupIds;\n };\n\n const topLevelIds = groupRows(rows, 0, null);\n rootIds.push(...topLevelIds);\n\n return { treeNodes, rootIds, groupingRows };\n\n }, [rows, rowGroupingModel, aggregationModel, getRowId, getAggregationPosition, columnsLookup]);\n\n useEffect(() => {\n if (defaultGroupingExpansionDepth === -1) {\n\n const allGroupIds = new Set<GridRowId>();\n treeNodes.forEach((node, id) => {\n if (node.children && node.children.length > 0) {\n allGroupIds.add(id);\n }\n });\n setExpandedGroupIds(allGroupIds);\n } else if (defaultGroupingExpansionDepth > 0) {\n const depthIds = new Set<GridRowId>();\n treeNodes.forEach((node, id) => {\n if (node.depth < defaultGroupingExpansionDepth && node.children && node.children.length > 0) {\n depthIds.add(id);\n }\n });\n setExpandedGroupIds(depthIds);\n } else {\n\n setExpandedGroupIds(new Set());\n }\n\n }, [rowGroupingModel, defaultGroupingExpansionDepth, treeNodes]);\n\n const toggleExpansion = useCallback((id: GridRowId) => {\n setExpandedGroupIds(prev => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n }, []);\n\n const isGroupExpanded = useCallback((id: GridRowId) => {\n return expandedGroupIds.has(id);\n }, [expandedGroupIds]);\n\n const getVisibleRows = useCallback(() => {\n if (rowGroupingModel.length === 0) return null;\n\n const result: R[] = [];\n const seenIds = new Set<GridRowId>();\n\n const rowLookup = new Map<GridRowId, R>();\n rows.forEach(r => rowLookup.set(getRowId(r), r));\n\n const doesNodeMatchFilter = (nodeId: GridRowId): boolean => {\n const node = treeNodes.get(nodeId);\n if (!node) return false;\n\n if (!node.children || node.children.length === 0) {\n\n const row = rowLookup.get(nodeId);\n if (!row) return false;\n\n if (filterModel) {\n if (!isRowMatchingFilter(row, filterModel)) return false;\n }\n return true;\n }\n\n return node.children.some(childId => doesNodeMatchFilter(childId));\n };\n\n const traverse = (ids: GridRowId[]) => {\n\n let visibleIds = ids;\n if (filterModel) {\n visibleIds = ids.filter(doesNodeMatchFilter);\n }\n\n if (sortModel && sortModel.length > 0) {\n visibleIds.sort((aId, bId) => {\n const rowA = groupingRows.get(aId) || rowLookup.get(aId);\n const rowB = groupingRows.get(bId) || rowLookup.get(bId);\n\n if (!rowA || !rowB) return 0;\n\n for (const sortItem of sortModel) {\n const valA = rowA[sortItem.field];\n const valB = rowB[sortItem.field];\n const compareResult = compareValues(valA, valB, sortItem.sort);\n if (compareResult !== 0) return compareResult;\n }\n return 0;\n });\n }\n\n visibleIds.forEach(id => {\n if (seenIds.has(id)) return; \n\n const node = treeNodes.get(id);\n const isGroup = node?.children && node.children.length > 0;\n\n const row = isGroup ? groupingRows.get(id) : rowLookup.get(id);\n\n if (row && node) {\n seenIds.add(id);\n\n const enhancedRow = {\n ...row,\n _treeDepth: node.depth,\n _isExpanded: expandedGroupIds.has(id),\n _hasChildren: isGroup,\n _groupingField: node.groupingField,\n _groupingValue: node.groupingValue,\n _descendantCount: node.descendantCount\n };\n result.push(enhancedRow);\n\n if (isExpandedGroupIds.has(id) && isGroup) {\n traverse(node.children!);\n }\n }\n });\n };\n\n const isExpandedGroupIds = expandedGroupIds; \n\n traverse(rootIds);\n\n return result;\n\n }, [rows, getRowId, treeNodes, rootIds, groupingRows, filterModel, sortModel, expandedGroupIds, rowGroupingModel]);\n\n const getNode = useCallback((id: GridRowId) => treeNodes.get(id), [treeNodes]);\n\n const rowMetaMap = useMemo<Map<GridRowId, GridRowMeta>>(() => {\n const map = new Map<GridRowId, GridRowMeta>();\n treeNodes.forEach((node, id) => {\n const isGroup = Boolean(node.children && node.children.length > 0);\n map.set(id, {\n hasChildren: isGroup,\n treeDepth: node.depth,\n groupingField: node.groupingField,\n groupingValue: node.groupingValue,\n groupLabel: node.label,\n descendantCount: node.descendantCount,\n isGroupRow: isGroup,\n isExpanded: isGroup ? expandedGroupIds.has(id) : undefined,\n });\n });\n return map;\n }, [treeNodes, expandedGroupIds]);\n\n return useMemo(() => ({\n treeNodes,\n groupingRows,\n toggleExpansion,\n isGroupExpanded,\n getVisibleRows,\n getNode,\n rowMetaMap,\n }), [treeNodes, groupingRows, toggleExpansion, isGroupExpanded, getVisibleRows, getNode, rowMetaMap]);\n}\n","import React, { useState, useCallback, useRef } from 'react';\nimport type { GridRowId, GridRowModel } from '../../types';\n\nexport interface GridEditingState {\n editingCell: {\n id: GridRowId;\n field: string;\n value: unknown;\n originalValue: unknown;\n } | null;\n}\n\nexport interface UseGridEditingParams<R extends GridRowModel> {\n rows: R[];\n getRowId: (row: R) => GridRowId;\n processRowUpdate?: (newRow: R, oldRow: R) => R | Promise<R>;\n onProcessRowUpdateError?: (error: unknown) => void;\n onRowChange?: (newRow: R) => void;\n}\n\ntype EditingCellState = GridEditingState['editingCell'];\n\nexport function useGridEditing<R extends GridRowModel>(params: UseGridEditingParams<R>) {\n const {\n rows,\n getRowId,\n processRowUpdate,\n onProcessRowUpdateError,\n onRowChange\n } = params;\n\n const [editingCell, setEditingCellState] = useState<EditingCellState>(null);\n const editingCellRef = useRef<EditingCellState>(null);\n\n const setEditingCell = useCallback((val: React.SetStateAction<EditingCellState>) => {\n setEditingCellState(val);\n editingCellRef.current = typeof val === 'function' ? val(editingCellRef.current) : val;\n }, []);\n\n const startCellEdit = useCallback((editParams: { id: GridRowId; field: string; value: unknown }) => {\n setEditingCell({\n id: editParams.id,\n field: editParams.field,\n value: editParams.value,\n originalValue: editParams.value\n });\n }, [setEditingCell]);\n\n const stopCellEdit = useCallback(async (stopParams?: { cancel?: boolean }) => {\n const currentCell = editingCellRef.current;\n if (!currentCell) return;\n\n if (stopParams?.cancel) {\n setEditingCell(null);\n return;\n }\n\n const { id, field, value, originalValue } = currentCell;\n\n if (value === originalValue) {\n setEditingCell(null);\n return;\n }\n\n const existingRow = rows.find(r => getRowId(r) === id);\n if (!existingRow) {\n setEditingCell(null);\n return;\n }\n\n const newRow = { ...existingRow, [field]: value };\n\n try {\n if (processRowUpdate) {\n const processedRow = await processRowUpdate(newRow, existingRow);\n onRowChange?.(processedRow);\n } else {\n onRowChange?.(newRow);\n }\n setEditingCell(null);\n } catch (error) {\n onProcessRowUpdateError?.(error);\n }\n\n }, [setEditingCell, rows, getRowId, processRowUpdate, onRowChange, onProcessRowUpdateError]);\n\n const setEditCellValue = useCallback((editParams: { id: GridRowId; field: string; value: unknown }) => {\n if (editingCell && editingCell.id === editParams.id && editingCell.field === editParams.field) {\n setEditingCell(prev => prev ? { ...prev, value: editParams.value } : null);\n }\n }, [editingCell, setEditingCell]);\n\n return {\n editingCell,\n startCellEdit,\n stopCellEdit,\n setEditCellValue\n };\n}\n","\nimport { useState, useCallback, useEffect } from 'react';\nimport type { GridRowId, GridColDef, GridRowModel, GridRenderCellParams } from '../../types';\n\ntype ColumnKey = string;\n\nexport type CellColSpanInfo = \n | { \n spannedByColSpan: true; \n rightVisibleCellIndex: number; \n leftVisibleCellIndex: number; \n }\n | { \n spannedByColSpan: false; \n cellProps: { \n colSpan: number; \n width: number; \n }; \n };\n\ntype ColspanMap = Map<GridRowId, Record<ColumnKey, CellColSpanInfo>>;\n\nexport interface RowSpanningCaches {\n spannedCells: Record<GridRowId, Record<ColumnKey, number>>;\n hiddenCells: Record<GridRowId, Record<ColumnKey, boolean>>;\n hiddenCellOriginMap: Record<number, Record<ColumnKey, number>>;\n}\n\nexport interface RowSpanningState {\n caches: RowSpanningCaches;\n processedRange: { firstRowIndex: number; lastRowIndex: number; };\n}\n\nexport function useGridSpanning<R extends GridRowModel>(\n rows: R[],\n columns: GridColDef<R>[],\n columnWidths: Record<string, number>\n) {\n\n const [colspanMap, setColspanMap] = useState<ColspanMap>(new Map());\n\n const [rowSpanningState, setRowSpanningState] = useState<RowSpanningState>({\n caches: {\n spannedCells: {},\n hiddenCells: {},\n hiddenCellOriginMap: {}\n },\n processedRange: { firstRowIndex: 0, lastRowIndex: 0 }\n });\n\n const resetColSpan = useCallback(() => {\n setColspanMap(new Map());\n }, []);\n\n const getCellColSpanInfo = useCallback((rowId: GridRowId, field: string): CellColSpanInfo | undefined => {\n return colspanMap.get(rowId)?.[field];\n }, [colspanMap]);\n\n const calculateColSpan = useCallback((\n rowId: GridRowId,\n row: R,\n rowIndex: number,\n minFirstColumn: number,\n maxLastColumn: number\n ) => {\n const newMap = new Map(colspanMap);\n\n for (let i = minFirstColumn; i < maxLastColumn; i++) {\n const colDef = columns[i];\n if (!colDef) continue;\n\n let colSpan = 1;\n if (colDef.colSpan) {\n if (typeof colDef.colSpan === 'function') {\n const params: GridRenderCellParams<R> = {\n row,\n value: row[colDef.field as keyof R],\n field: colDef.field,\n colDef,\n rowIndex,\n colIndex: i \n };\n colSpan = colDef.colSpan(params);\n } else {\n colSpan = colDef.colSpan;\n }\n }\n\n if (colSpan <= 1) {\n setCellColSpanInfo(newMap, rowId, colDef.field, {\n spannedByColSpan: false,\n cellProps: { colSpan: 1, width: columnWidths[colDef.field] || 100 }\n });\n continue;\n }\n\n let width = columnWidths[colDef.field] || 100;\n for (let j = 1; j < colSpan; j++) {\n if (i + j < maxLastColumn) {\n const nextCol = columns[i + j];\n if (nextCol) {\n width += columnWidths[nextCol.field] || 100;\n\n setCellColSpanInfo(newMap, rowId, nextCol.field, {\n spannedByColSpan: true,\n leftVisibleCellIndex: i,\n rightVisibleCellIndex: Math.min(i + colSpan - 1, columns.length - 1)\n });\n }\n }\n }\n\n setCellColSpanInfo(newMap, rowId, colDef.field, {\n spannedByColSpan: false,\n cellProps: { colSpan, width }\n });\n\n i += colSpan - 1; \n }\n\n setColspanMap(newMap);\n }, [colspanMap, columns, columnWidths]);\n\n const calculateRowSpan = useCallback((\n firstRowIndex: number,\n lastRowIndex: number\n ) => {\n const spannedCells: Record<GridRowId, Record<ColumnKey, number>> = {};\n const hiddenCells: Record<GridRowId, Record<ColumnKey, boolean>> = {};\n const hiddenCellOriginMap: Record<number, Record<ColumnKey, number>> = {};\n\n columns.forEach((colDef, columnIndex) => {\n\n if (!colDef.rowSpan) return;\n\n for (let index = firstRowIndex; index < lastRowIndex; index++) {\n const row = rows[index];\n if (!row) continue;\n\n if (hiddenCells[row.id]?.[colDef.field]) continue;\n\n const cellValue = colDef.valueGetter\n ? colDef.valueGetter({ row, field: colDef.field, value: row[colDef.field as keyof R] })\n : row[colDef.field as keyof R];\n\n let span = 1;\n if (typeof colDef.rowSpan === 'function') {\n const params: GridRenderCellParams<R> = {\n row,\n value: cellValue,\n field: colDef.field,\n colDef,\n rowIndex: index,\n colIndex: columnIndex\n };\n span = colDef.rowSpan(params);\n } else if (typeof colDef.rowSpan === 'number') {\n span = colDef.rowSpan;\n }\n\n if (span > 1) {\n if (!spannedCells[row.id]) spannedCells[row.id] = {};\n spannedCells[row.id][colDef.field] = span; \n\n for (let k = 1; k < span; k++) {\n const nextIndex = index + k;\n if (nextIndex < lastRowIndex && rows[nextIndex]) {\n const nextRow = rows[nextIndex];\n if (!hiddenCells[nextRow.id]) hiddenCells[nextRow.id] = {};\n hiddenCells[nextRow.id][colDef.field] = true; \n\n if (!hiddenCellOriginMap[nextIndex]) hiddenCellOriginMap[nextIndex] = {};\n hiddenCellOriginMap[nextIndex][colDef.field] = index; \n }\n }\n }\n }\n });\n\n setRowSpanningState({\n caches: { spannedCells, hiddenCells, hiddenCellOriginMap },\n processedRange: { firstRowIndex, lastRowIndex }\n });\n }, [rows, columns]);\n\n const resetRowSpan = useCallback(() => {\n setRowSpanningState({\n caches: {\n spannedCells: {},\n hiddenCells: {},\n hiddenCellOriginMap: {}\n },\n processedRange: { firstRowIndex: 0, lastRowIndex: 0 }\n });\n }, []);\n\n useEffect(() => {\n\n const newMap = new Map<GridRowId, Record<ColumnKey, CellColSpanInfo>>();\n\n rows.forEach((row, index) => {\n for (let i = 0; i < columns.length; i++) {\n const colDef = columns[i];\n if (!colDef) continue;\n\n let colSpan = 1;\n if (colDef.colSpan) {\n if (typeof colDef.colSpan === 'function') {\n const params: GridRenderCellParams<R> = {\n row,\n value: row[colDef.field as keyof R],\n field: colDef.field,\n colDef,\n rowIndex: index,\n colIndex: i\n };\n colSpan = colDef.colSpan(params);\n } else {\n colSpan = colDef.colSpan;\n }\n }\n\n if (colSpan <= 1) {\n const colWidth = columnWidths[colDef.field] || (typeof colDef.width === 'number' ? colDef.width : 100);\n setCellColSpanInfo(newMap, row.id, colDef.field, {\n spannedByColSpan: false,\n cellProps: { colSpan: 1, width: colWidth }\n });\n continue;\n }\n\n let width = columnWidths[colDef.field] || (typeof colDef.width === 'number' ? colDef.width : 100);\n for (let j = 1; j < colSpan; j++) {\n if (i + j < columns.length) {\n const nextCol = columns[i + j];\n if (nextCol) {\n const nextColWidth = columnWidths[nextCol.field] || (typeof nextCol.width === 'number' ? nextCol.width : 100);\n width += nextColWidth;\n\n setCellColSpanInfo(newMap, row.id, nextCol.field, {\n spannedByColSpan: true,\n leftVisibleCellIndex: i,\n rightVisibleCellIndex: Math.min(i + colSpan - 1, columns.length - 1)\n });\n }\n }\n }\n\n setCellColSpanInfo(newMap, row.id, colDef.field, {\n spannedByColSpan: false,\n cellProps: { colSpan, width }\n });\n\n i += colSpan - 1; \n }\n });\n\n setColspanMap(newMap);\n\n const spannedCells: Record<GridRowId, Record<ColumnKey, number>> = {};\n const hiddenCells: Record<GridRowId, Record<ColumnKey, boolean>> = {};\n const hiddenCellOriginMap: Record<number, Record<ColumnKey, number>> = {};\n\n columns.forEach((colDef, columnIndex) => {\n if (!colDef.rowSpan) return;\n\n for (let index = 0; index < rows.length; index++) {\n const row = rows[index];\n if (!row) continue;\n\n if (hiddenCells[row.id]?.[colDef.field]) continue;\n\n const cellValue = colDef.valueGetter\n ? colDef.valueGetter({ row, field: colDef.field, value: row[colDef.field as keyof R] })\n : row[colDef.field as keyof R];\n\n let span = 1;\n if (typeof colDef.rowSpan === 'function') {\n const params: GridRenderCellParams<R> = {\n row,\n value: cellValue,\n field: colDef.field,\n colDef,\n rowIndex: index,\n colIndex: columnIndex\n };\n span = colDef.rowSpan(params);\n } else if (typeof colDef.rowSpan === 'number') {\n span = colDef.rowSpan;\n }\n\n if (span > 1) {\n if (!spannedCells[row.id]) spannedCells[row.id] = {};\n spannedCells[row.id][colDef.field] = span;\n\n for (let k = 1; k < span; k++) {\n const nextIndex = index + k;\n if (nextIndex < rows.length && rows[nextIndex]) {\n const nextRow = rows[nextIndex];\n if (!hiddenCells[nextRow.id]) hiddenCells[nextRow.id] = {};\n hiddenCells[nextRow.id][colDef.field] = true;\n\n if (!hiddenCellOriginMap[nextIndex]) hiddenCellOriginMap[nextIndex] = {};\n hiddenCellOriginMap[nextIndex][colDef.field] = index;\n }\n }\n }\n }\n });\n\n setRowSpanningState({\n caches: { spannedCells, hiddenCells, hiddenCellOriginMap },\n processedRange: { firstRowIndex: 0, lastRowIndex: rows.length }\n });\n }, [rows, columns, columnWidths]);\n\n const getSpannedCells = useCallback(() => rowSpanningState.caches.spannedCells, [rowSpanningState]);\n const getHiddenCells = useCallback(() => rowSpanningState.caches.hiddenCells, [rowSpanningState]);\n const getHiddenCellOriginMap = useCallback(() => rowSpanningState.caches.hiddenCellOriginMap, [rowSpanningState]);\n\n return {\n\n colspanMap,\n resetColSpan,\n getCellColSpanInfo,\n calculateColSpan,\n\n rowSpanningState,\n calculateRowSpan,\n resetRowSpan,\n getSpannedCells,\n getHiddenCells,\n getHiddenCellOriginMap\n };\n}\n\nfunction setCellColSpanInfo(\n map: ColspanMap,\n rowId: GridRowId,\n field: string,\n info: CellColSpanInfo\n) {\n let columnInfo = map.get(rowId);\n if (!columnInfo) {\n columnInfo = {};\n map.set(rowId, columnInfo);\n }\n columnInfo[field] = info;\n}\n","import { useEffect, useRef, useCallback } from 'react';\nimport { \n GridDataSource, \n GridRowModel, \n GridSortItem, \n GridFilterModel, \n GridPaginationModel,\n GridGetRowsParams,\n GridAggregationModel,\n GridAggregationResult,\n} from '../../types';\n\ninterface UseGridDataSourceParams<R extends GridRowModel> {\n dataSource?: GridDataSource<R>;\n sortModel: GridSortItem[];\n filterModel: GridFilterModel;\n paginationModel: GridPaginationModel;\n paginationMode?: 'client' | 'server' | 'infinite';\n sortingMode?: 'client' | 'server';\n filterMode?: 'client' | 'server';\n aggregationModel?: GridAggregationModel;\n setRows: (rows: R[] | ((prev: R[]) => R[]), preserveRowCount?: boolean) => void;\n setRowCount: (count: number) => void;\n setDataSourceLoading: (loading: boolean) => void;\n setDataSourceError: (error: unknown) => void;\n onAggregationResults?: (results: GridAggregationResult) => void;\n}\n\nexport function useGridDataSource<R extends GridRowModel>(params: UseGridDataSourceParams<R>) {\n const {\n dataSource,\n sortModel,\n filterModel,\n paginationModel,\n paginationMode,\n sortingMode,\n filterMode,\n aggregationModel,\n setRows,\n setRowCount,\n setDataSourceLoading,\n setDataSourceError,\n onAggregationResults,\n } = params;\n\n const prevParamsRef = useRef<{\n sortModel: GridSortItem[];\n filterModel: GridFilterModel;\n page: number;\n pageSize: number;\n } | null>(null);\n\n const activeRequestRef = useRef<number>(0);\n\n const fetchRows = useCallback(async () => {\n if (!dataSource) return;\n\n const requestId = ++activeRequestRef.current;\n\n setDataSourceLoading(true);\n setDataSourceError(null);\n\n const startRow = paginationModel.page * paginationModel.pageSize;\n const endRow = startRow + paginationModel.pageSize;\n\n const requestParams: GridGetRowsParams = {\n startRow,\n endRow,\n sortModel,\n filterModel,\n groupKeys: [], \n aggregationModel,\n };\n\n try {\n const response = await dataSource.getRows(requestParams);\n\n if (requestId !== activeRequestRef.current) {\n return;\n }\n\n let shouldAppend = false;\n\n if (paginationMode === 'infinite') {\n const prev = prevParamsRef.current;\n if (prev) {\n\n const sortChanged = JSON.stringify(prev.sortModel) !== JSON.stringify(sortModel);\n const filterChanged = JSON.stringify(prev.filterModel) !== JSON.stringify(filterModel);\n const pageSizeChanged = prev.pageSize !== paginationModel.pageSize;\n\n if (!sortChanged && !filterChanged && !pageSizeChanged && paginationModel.page > prev.page) {\n shouldAppend = true;\n }\n }\n }\n\n if (shouldAppend) {\n setRows((prevRows) => [...prevRows, ...response.rows], true);\n } else {\n setRows(response.rows, true);\n }\n\n if (response.aggregationResults && onAggregationResults) {\n onAggregationResults(response.aggregationResults);\n }\n\n if (response.rowCount !== undefined) {\n setRowCount(response.rowCount);\n } else if (paginationMode === 'infinite') {\n // rowCount is not required for infinite scroll — the grid uses appendRows\n }\n\n prevParamsRef.current = {\n sortModel,\n filterModel,\n page: paginationModel.page,\n pageSize: paginationModel.pageSize\n };\n\n } catch (error) {\n if (requestId === activeRequestRef.current) {\n setDataSourceError(error);\n console.error('Data Source Error:', error);\n }\n } finally {\n if (requestId === activeRequestRef.current) {\n setDataSourceLoading(false);\n }\n }\n }, [\n dataSource, \n paginationModel.page, \n paginationModel.pageSize, \n sortModel, \n filterModel,\n paginationMode,\n aggregationModel,\n onAggregationResults,\n setRows,\n setRowCount,\n setDataSourceLoading,\n setDataSourceError\n ]);\n\n useEffect(() => {\n const isServerSide = paginationMode === 'server' || paginationMode === 'infinite' || sortingMode === 'server' || filterMode === 'server';\n\n if (dataSource && isServerSide) {\n const timer = setTimeout(() => {\n fetchRows();\n }, 300);\n return () => clearTimeout(timer);\n }\n }, [fetchRows, dataSource, paginationMode, sortingMode, filterMode]);\n\n const fetchChildren = useCallback(async (_parentId: string | number, groupKeys: string[]) => {\n if (!dataSource) return;\n\n setDataSourceLoading(true);\n try {\n const response = await dataSource.getRows({\n startRow: 0,\n endRow: -1, \n sortModel,\n filterModel,\n groupKeys\n });\n\n if (response.rows.length > 0) {\n setRows((prevRows) => {\n\n const existingIds = new Set(prevRows.map(r => r.id));\n const newRows = response.rows.filter(r => !existingIds.has(r.id));\n return [...prevRows, ...newRows];\n });\n }\n } catch (error) {\n setDataSourceError(error);\n console.error('Failed to fetch children:', error);\n } finally {\n setDataSourceLoading(false);\n }\n }, [dataSource, sortModel, filterModel, setRows, setDataSourceLoading, setDataSourceError]);\n\n return {\n fetchRows,\n fetchChildren\n };\n}\n","\nimport { useMemo } from 'react';\nimport type { GridColDef, GridRowModel } from '../../types';\nimport type { GridPivotModel, GridPivotAggFn } from '../../types';\n\nconst SEP_COL = '\u0000';\nconst SEP_KEY = '\u001f';\n\nfunction aggregate(values: number[], fn: GridPivotAggFn): number | null {\n const nums = values.filter((v) => v != null && !isNaN(v));\n if (nums.length === 0) return null;\n switch (fn) {\n case 'sum': return nums.reduce((a, b) => a + b, 0);\n case 'avg': return nums.reduce((a, b) => a + b, 0) / nums.length;\n case 'count': return nums.length;\n case 'min': return Math.min(...nums);\n case 'max': return Math.max(...nums);\n }\n}\n\nfunction makeKey(row: GridRowModel, fields: string[]): string {\n return fields.map((f) => String(row[f] ?? '')).join(SEP_COL);\n}\n\nfunction cellKey(ck: string, field: string, aggFn: string, hasColFields: boolean): string {\n return hasColFields ? `${ck}${SEP_KEY}${field}${SEP_KEY}${aggFn}` : `${field}${SEP_KEY}${aggFn}`;\n}\n\nexport interface UsePivotReturn {\n pivotRows: GridRowModel[];\n pivotColumns: GridColDef[];\n colKeys: string[];\n isValid: boolean;\n}\n\nexport function usePivot(\n rawRows: GridRowModel[],\n rawCols: GridColDef[],\n model: GridPivotModel,\n enabled: boolean,\n): UsePivotReturn {\n return useMemo<UsePivotReturn>(() => {\n const empty: UsePivotReturn = { pivotRows: [], pivotColumns: [], colKeys: [], isValid: false };\n\n if (!enabled) return empty;\n\n const { rowFields, columnFields, valueFields } = model;\n if (rowFields.length === 0 || valueFields.length === 0) return empty;\n\n const hasColFields = columnFields.length > 0;\n const colDefMap = new Map(rawCols.map((c) => [c.field, c]));\n\n const colKeySet = new Set<string>();\n for (const row of rawRows) {\n colKeySet.add(makeKey(row, columnFields));\n }\n const colKeys = Array.from(colKeySet).sort();\n\n const outerMap = new Map<string, {\n labelValues: Record<string, unknown>;\n bucket: Map<string, Map<string, number[]>>;\n }>();\n\n for (const row of rawRows) {\n const rk = makeKey(row, rowFields);\n if (!outerMap.has(rk)) {\n const labelValues: Record<string, unknown> = {};\n for (const f of rowFields) labelValues[f] = row[f];\n outerMap.set(rk, { labelValues, bucket: new Map() });\n }\n const entry = outerMap.get(rk)!;\n\n const ck = makeKey(row, columnFields);\n if (!entry.bucket.has(ck)) entry.bucket.set(ck, new Map());\n const colBucket = entry.bucket.get(ck)!;\n\n for (const vf of valueFields) {\n const raw = row[vf.field];\n if (!colBucket.has(vf.field)) colBucket.set(vf.field, []);\n if (raw != null && !isNaN(Number(raw))) colBucket.get(vf.field)!.push(Number(raw));\n }\n }\n\n let rowIndex = 0;\n const pivotRows: GridRowModel[] = [];\n\n for (const [, entry] of outerMap) {\n const pivotRow: GridRowModel = { id: rowIndex++, ...entry.labelValues };\n\n for (const ck of colKeys) {\n const colBucket = entry.bucket.get(ck);\n for (const vf of valueFields) {\n const ck_ = cellKey(ck, vf.field, vf.aggFn, hasColFields);\n const values = colBucket?.get(vf.field) ?? [];\n pivotRow[ck_] = values.length > 0 ? aggregate(values, vf.aggFn) : null;\n }\n }\n\n pivotRows.push(pivotRow);\n }\n\n // ── Grand Total row ───────────────────────────────────────────────────\n // avg/min/max must be recomputed from raw source data — summing\n // per-row averages or mins produces wrong numbers.\n const gtBuckets = new Map<string, number[]>();\n for (const row of rawRows) {\n const ck = makeKey(row, columnFields);\n for (const vf of valueFields) {\n if (vf.aggFn !== 'avg' && vf.aggFn !== 'min' && vf.aggFn !== 'max') continue;\n const bk = `${ck}${SEP_KEY}${vf.field}`;\n if (!gtBuckets.has(bk)) gtBuckets.set(bk, []);\n const raw = row[vf.field];\n if (raw != null && !isNaN(Number(raw))) gtBuckets.get(bk)!.push(Number(raw));\n }\n }\n\n const totalRow: GridRowModel = { id: '__pivot_grand_total__' };\n for (let i = 0; i < rowFields.length; i++) {\n totalRow[rowFields[i]] = i === 0 ? 'Grand Total' : '';\n }\n for (const ck of colKeys) {\n for (const vf of valueFields) {\n const ck_ = cellKey(ck, vf.field, vf.aggFn, hasColFields);\n\n const cellValues = pivotRows\n .map(r => r[ck_])\n .filter(v => v != null && !isNaN(Number(v)))\n .map(Number);\n\n if (cellValues.length === 0) { totalRow[ck_] = null; continue; }\n\n const bk = `${ck}${SEP_KEY}${vf.field}`;\n switch (vf.aggFn) {\n case 'sum':\n case 'count':\n totalRow[ck_] = cellValues.reduce((a, b) => a + b, 0);\n break;\n case 'avg': {\n const raw = gtBuckets.get(bk) ?? [];\n totalRow[ck_] = raw.length > 0 ? raw.reduce((a, b) => a + b, 0) / raw.length : null;\n break;\n }\n case 'min':\n totalRow[ck_] = Math.min(...(gtBuckets.get(bk) ?? cellValues));\n break;\n case 'max':\n totalRow[ck_] = Math.max(...(gtBuckets.get(bk) ?? cellValues));\n break;\n }\n }\n }\n pivotRows.push(totalRow);\n\n\n const pivotColumns: GridColDef[] = [];\n\n for (const f of rowFields) {\n const orig = colDefMap.get(f);\n pivotColumns.push({\n field: f,\n headerName: orig?.headerName ?? f,\n width: orig?.width as number ?? 140,\n sortable: true,\n });\n }\n\n for (const ck of colKeys) {\n const colLabel = hasColFields\n ? ck.split(SEP_COL).map((v, i) => {\n const def = colDefMap.get(columnFields[i]);\n return def?.headerName ? `${def.headerName}: ${v}` : v;\n }).join(' / ')\n : '';\n\n for (const vf of valueFields) {\n const orig = colDefMap.get(vf.field);\n const ck_ = cellKey(ck, vf.field, vf.aggFn, hasColFields);\n const labelBase = vf.headerName ?? orig?.headerName ?? vf.field;\n const headerName = colLabel\n ? `${colLabel} — ${labelBase} (${vf.aggFn})`\n : `${labelBase} (${vf.aggFn})`;\n\n pivotColumns.push({\n field: ck_,\n headerName,\n width: 140,\n type: 'number',\n align: 'right',\n headerAlign: 'right',\n sortable: true,\n valueFormatter: ({ value }) => {\n if (value == null) return '—';\n const n = Number(value);\n if (vf.aggFn === 'avg') return n.toFixed(2);\n if (vf.aggFn === 'count') return n.toLocaleString();\n if (orig?.valueFormatter) return orig.valueFormatter({ value, row: {} as GridRowModel, field: vf.field });\n return n.toLocaleString();\n },\n });\n }\n }\n\n return { pivotRows, pivotColumns, colKeys, isValid: true };\n }, [rawRows, rawCols, model, enabled]);\n}\n","import { useEffect, useCallback } from 'react';\nimport type { GridColDef, GridRowModel, GridRowId } from '../../types';\n\ninterface UseGridClipboardProps {\n /** The currently selected row IDs — must come from the live selection source (not state.selection which is stale). */\n selectedRowIds: Set<GridRowId>;\n columns: GridColDef[];\n getVisibleRows: () => GridRowModel[];\n getRowId: (row: GridRowModel) => GridRowId;\n}\n\nfunction copyTextSynchronous(text: string): boolean {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.style.cssText = 'position:fixed;top:-9999px;left:-9999px;opacity:0;';\n document.body.appendChild(textarea);\n textarea.focus();\n textarea.select();\n let success = false;\n try {\n success = document.execCommand('copy');\n } finally {\n document.body.removeChild(textarea);\n }\n return success;\n}\n\n/**\n * Writes text to clipboard.\n * Uses both execCommand (synchronous, needed for non-HTTPS or non-async-gesture environments)\n * and navigator.clipboard for modern browser support.\n */\nasync function writeToClipboard(text: string): Promise<void> {\n let fallbackSuccess = false;\n try {\n fallbackSuccess = copyTextSynchronous(text);\n } catch {\n // Ignore fallback errors\n }\n\n if (navigator.clipboard && typeof navigator.clipboard.writeText === 'function') {\n try {\n await navigator.clipboard.writeText(text);\n return;\n } catch (e) {\n if (fallbackSuccess) return;\n throw e;\n }\n } else if (!fallbackSuccess) {\n throw new Error('Clipboard API not available and fallback failed.');\n }\n}\n\n/**\n * Hook to handle clipboard operations.\n * Copies selected rows as Tab-Separated Values (TSV) on Ctrl+C / Cmd+C.\n * Also exposes `copySelectedRows` for programmatic use via apiRef.\n */\nexport function useGridClipboard(props: UseGridClipboardProps) {\n const { selectedRowIds, columns, getVisibleRows, getRowId } = props;\n\n const copySelectedRows = useCallback(async () => {\n\n if (selectedRowIds.size === 0) return;\n\n const visibleRows = getVisibleRows();\n const rowsToCopy = visibleRows.filter((row) => selectedRowIds.has(getRowId(row)));\n\n\n\n if (rowsToCopy.length === 0) return;\n\n // Exclude internal grid columns (checkbox, expand, reorder)\n const visibleColumns = columns.filter((col) => !col.field.startsWith('__'));\n\n // Header row\n const headerRow = visibleColumns\n .map((col) => col.headerName || col.field)\n .join('\\t');\n\n // Data rows\n const dataRows = rowsToCopy\n .map((row) =>\n visibleColumns\n .map((col) => {\n const value = row[col.field];\n if (col.valueFormatter) {\n return col.valueFormatter({ value, row, field: col.field });\n }\n return value ?? '';\n })\n .join('\\t')\n )\n .join('\\n');\n\n const fullContent = `${headerRow}\\n${dataRows}`;\n\n try {\n await writeToClipboard(fullContent);\n\n } catch (err) {\n console.error('[OpenGridX] Failed to copy to clipboard:', err);\n }\n }, [selectedRowIds, columns, getVisibleRows, getRowId]);\n\n // Keyboard shortcut: Ctrl+C / Cmd+C\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (!(event.ctrlKey || event.metaKey) || event.key !== 'c') return;\n\n // Don't intercept when user is typing in an input / editor\n const activeEl = document.activeElement as HTMLElement;\n const tag = activeEl?.tagName.toLowerCase();\n const type = (activeEl as HTMLInputElement)?.type;\n\n // Skip capturing Ctrl+C if we are genuinely inside a text input\n if (\n (tag === 'input' && type !== 'checkbox' && type !== 'radio') ||\n tag === 'textarea' ||\n tag === 'select'\n ) return;\n\n if (activeEl?.isContentEditable) return;\n\n copySelectedRows();\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [copySelectedRows]);\n\n return { copySelectedRows };\n}\n","import React from 'react';\nimport type { GridColDef, GridRowModel, GridRowId, GridListViewColDef, GridRenderCellParams } from '../../types';\n\nexport interface ListViewRowProps<R extends GridRowModel = GridRowModel> {\n row: R;\n rowIndex: number;\n listViewColumn: GridListViewColDef<R>;\n isSelected?: boolean;\n checkboxSelection?: boolean;\n rowHeight?: number;\n onRowClick?: (row: R) => void;\n onSelectionChange?: (rowId: GridRowId, isSelected: boolean) => void;\n}\n\nexport function ListViewRow<R extends GridRowModel = GridRowModel>({\n row,\n rowIndex,\n listViewColumn,\n isSelected = false,\n checkboxSelection = false,\n rowHeight,\n onRowClick,\n onSelectionChange,\n}: ListViewRowProps<R>) {\n const params: GridRenderCellParams<R> = {\n row,\n value: undefined,\n field: listViewColumn.field,\n colDef: { field: listViewColumn.field } as unknown as GridColDef<R>,\n rowIndex,\n colIndex: 0,\n };\n\n const handleCheckboxChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n e.stopPropagation();\n onSelectionChange?.(row.id, e.target.checked);\n };\n\n return (\n <div\n className={`ogx-list-view__row${isSelected ? ' ogx-list-view__row--selected' : ''}`}\n style={rowHeight ? { minHeight: rowHeight } : undefined}\n onClick={() => onRowClick?.(row)}\n role=\"row\"\n aria-rowindex={rowIndex + 2}\n aria-selected={isSelected}\n >\n {checkboxSelection && (\n <div className=\"ogx-list-view__checkbox\" onClick={(e) => e.stopPropagation()}>\n <input\n type=\"checkbox\"\n checked={isSelected}\n onChange={handleCheckboxChange}\n aria-label={`Select row ${row.id}`}\n />\n </div>\n )}\n <div className=\"ogx-list-view__cell\" role=\"gridcell\">\n {listViewColumn.renderCell(params)}\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { Pagination } from '../Pagination/Pagination';\nimport { ListViewRow } from '../ListView/ListViewRow';\nimport type {\n GridRowModel,\n GridRowId,\n GridRowParams,\n GridListViewColDef,\n GridPaginationModel,\n GridDataSource,\n GridLocaleText,\n} from '../../types';\n\nexport interface GridListViewProps<R extends GridRowModel> {\n ariaLabel?: string;\n allRenderableRows: R[];\n filteredRows: R[];\n pagination: boolean;\n effectivePaginationModel: GridPaginationModel;\n pageSizeOptions: number[];\n selectedRowIds: Set<GridRowId>;\n listViewColumn: GridListViewColDef<R>;\n noRowsLabel: string;\n rowHeight: number;\n checkboxSelection: boolean;\n paginationMode: 'client' | 'server' | 'infinite';\n dataSource?: GridDataSource<R>;\n serverRowCount: number;\n paginationSlot?: React.ComponentType<Record<string, unknown>>;\n paginationSlotProps?: Record<string, unknown>;\n localeText?: Pick<GridLocaleText, 'paginationRowsPerPage' | 'paginationOf' | 'paginationPage'>;\n onRowClick: (params: GridRowParams<R>) => void;\n onSelectionChange: (rowId: GridRowId, isSelected: boolean) => void;\n onPaginationModelChange: (model: GridPaginationModel) => void;\n}\n\nexport function GridListView<R extends GridRowModel>({\n ariaLabel,\n allRenderableRows,\n filteredRows,\n pagination,\n effectivePaginationModel,\n pageSizeOptions,\n selectedRowIds,\n listViewColumn,\n noRowsLabel,\n rowHeight,\n checkboxSelection,\n paginationMode,\n dataSource,\n serverRowCount,\n paginationSlot,\n paginationSlotProps,\n localeText,\n onRowClick,\n onSelectionChange,\n onPaginationModelChange,\n}: GridListViewProps<R>) {\n const PaginationComponent = paginationSlot || Pagination;\n\n const totalRowCount = (paginationMode === 'server' && dataSource)\n ? (serverRowCount || 0)\n : filteredRows.length;\n\n return (\n <div\n className=\"ogx-list-view\"\n role=\"grid\"\n aria-label={ariaLabel || 'Data grid list view'}\n aria-rowcount={allRenderableRows.length + 1}\n >\n <div className=\"ogx-list-view__toolbar\">\n <span>\n {filteredRows.length} {filteredRows.length === 1 ? 'item' : 'items'}\n {pagination ? ` · page ${effectivePaginationModel.page + 1} of ${Math.ceil(filteredRows.length / effectivePaginationModel.pageSize) || 1}` : ''}\n {selectedRowIds.size > 0 ? ` · ${selectedRowIds.size} selected` : ''}\n </span>\n </div>\n\n <div className=\"ogx-list-view__rows\">\n {allRenderableRows.length === 0 ? (\n <div className=\"ogx-list-view__empty\" aria-live=\"polite\" role=\"status\">\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <path d=\"M3 9h18M9 21V9\" />\n </svg>\n {noRowsLabel}\n </div>\n ) : (\n allRenderableRows.map((row, idx) => (\n <ListViewRow<R>\n key={row.id}\n row={row}\n rowIndex={idx}\n listViewColumn={listViewColumn}\n isSelected={selectedRowIds.has(row.id)}\n checkboxSelection={checkboxSelection}\n rowHeight={rowHeight}\n onRowClick={(r) => onRowClick({ row: r, id: r.id, rowIndex: idx })}\n onSelectionChange={onSelectionChange}\n />\n ))\n )}\n </div>\n\n {pagination && (\n <PaginationComponent\n page={effectivePaginationModel.page}\n pageSize={effectivePaginationModel.pageSize}\n rowCount={totalRowCount}\n pageSizeOptions={pageSizeOptions}\n onPageChange={(newPage: number) => onPaginationModelChange({ ...effectivePaginationModel, page: newPage })}\n onPageSizeChange={(newPageSize: number) => onPaginationModelChange({ ...effectivePaginationModel, pageSize: newPageSize, page: 0 })}\n localeText={localeText}\n {...paginationSlotProps}\n />\n )}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport type { GridRenderCellParams } from '../../types';\n\nexport interface GridEditInputCellProps extends GridRenderCellParams {\n onValueChange: (value: unknown) => void;\n onCommit: () => void;\n onCancel: () => void;\n}\n\n// ─── Text / String ────────────────────────────────────────────────────────────\nfunction TextEditor({ value, onValueChange, onCommit, onCancel }: GridEditInputCellProps) {\n const [local, setLocal] = useState(String(value ?? ''));\n const ref = useRef<HTMLInputElement>(null);\n useEffect(() => { ref.current?.focus(); ref.current?.select(); }, []);\n\n return (\n <input\n ref={ref}\n type=\"text\"\n className=\"ogx__edit-input\"\n value={local}\n onChange={e => { setLocal(e.target.value); onValueChange(e.target.value); }}\n onBlur={onCommit}\n onKeyDown={e => {\n if (e.key === 'Enter') { e.stopPropagation(); onCommit(); }\n if (e.key === 'Escape') { e.stopPropagation(); onCancel(); }\n }}\n />\n );\n}\n\n// ─── Number ───────────────────────────────────────────────────────────────────\nfunction NumberEditor({ value, onValueChange, onCommit, onCancel }: GridEditInputCellProps) {\n const [local, setLocal] = useState<string | number>(typeof value === 'number' ? value : '');\n const ref = useRef<HTMLInputElement>(null);\n useEffect(() => { ref.current?.focus(); ref.current?.select(); }, []);\n\n return (\n <input\n ref={ref}\n type=\"number\"\n className=\"ogx__edit-input ogx__edit-input--number\"\n value={local}\n onChange={e => {\n const v = e.target.value === '' ? '' : Number(e.target.value);\n setLocal(v);\n onValueChange(v === '' ? null : v);\n }}\n onBlur={onCommit}\n onKeyDown={e => {\n if (e.key === 'Enter') { e.stopPropagation(); onCommit(); }\n if (e.key === 'Escape') { e.stopPropagation(); onCancel(); }\n }}\n />\n );\n}\n\n// ─── Boolean ──────────────────────────────────────────────────────────────────\nfunction BooleanEditor({ value, onValueChange, onCommit, onCancel }: GridEditInputCellProps) {\n const ref = useRef<HTMLInputElement>(null);\n useEffect(() => { ref.current?.focus(); }, []);\n\n const handleChange = () => {\n const next = !value;\n onValueChange(next);\n // Commit immediately on toggle\n setTimeout(onCommit, 0);\n };\n\n return (\n <div className=\"ogx__edit-boolean\">\n <input\n ref={ref}\n type=\"checkbox\"\n className=\"ogx__edit-checkbox\"\n checked={!!value}\n onChange={handleChange}\n onKeyDown={e => {\n if (e.key === 'Escape') { e.stopPropagation(); onCancel(); }\n }}\n />\n </div>\n );\n}\n\n// ─── SingleSelect / Enum ──────────────────────────────────────────────────────\nfunction SelectEditor({ value, colDef, onValueChange, onCommit, onCancel }: GridEditInputCellProps) {\n const ref = useRef<HTMLSelectElement>(null);\n useEffect(() => { ref.current?.focus(); }, []);\n\n const options = colDef.valueOptions ?? [];\n\n return (\n <select\n ref={ref}\n className=\"ogx__edit-select\"\n value={String(value ?? '')}\n onChange={e => { onValueChange(e.target.value); }}\n onBlur={onCommit}\n onKeyDown={e => {\n if (e.key === 'Enter') { e.stopPropagation(); onCommit(); }\n if (e.key === 'Escape') { e.stopPropagation(); onCancel(); }\n }}\n >\n {options.map(opt => {\n const v = typeof opt === 'object' ? opt.value : opt;\n const l = typeof opt === 'object' ? opt.label : String(opt);\n return <option key={String(v)} value={String(v)}>{l}</option>;\n })}\n </select>\n );\n}\n\n// ─── Date ─────────────────────────────────────────────────────────────────────\nfunction DateEditor({ value, onValueChange, onCommit, onCancel }: GridEditInputCellProps) {\n const [local, setLocal] = useState<string>(typeof value === 'string' ? value : String(value ?? ''));\n const ref = useRef<HTMLInputElement>(null);\n useEffect(() => { ref.current?.focus(); }, []);\n\n return (\n <input\n ref={ref}\n type=\"date\"\n className=\"ogx__edit-input\"\n value={local}\n onChange={e => { setLocal(e.target.value); onValueChange(e.target.value); }}\n onBlur={onCommit}\n onKeyDown={e => {\n if (e.key === 'Enter') { e.stopPropagation(); onCommit(); }\n if (e.key === 'Escape') { e.stopPropagation(); onCancel(); }\n }}\n />\n );\n}\n\n// ─── Router ───────────────────────────────────────────────────────────────────\nexport function GridEditInputCell(props: GridEditInputCellProps) {\n const { colDef } = props;\n\n switch (colDef.type) {\n case 'number':\n return <div className=\"ogx__edit-cell\"><NumberEditor {...props} /></div>;\n case 'boolean':\n return <div className=\"ogx__edit-cell\"><BooleanEditor {...props} /></div>;\n case 'singleSelect':\n return <div className=\"ogx__edit-cell\"><SelectEditor {...props} /></div>;\n case 'date':\n return <div className=\"ogx__edit-cell\"><DateEditor {...props} /></div>;\n default:\n return <div className=\"ogx__edit-cell\"><TextEditor {...props} /></div>;\n }\n}\n","import React from 'react';\n\n// Must live at module scope (not inline) so React sees a stable component type.\n// Calling renderFn() here puts the throw one level BELOW CellErrorBoundary,\n// which is required — a component cannot catch errors thrown in its own render().\nfunction CellRenderTarget({ renderFn }: { renderFn: () => React.ReactNode }) {\n return <>{renderFn()}</>;\n}\n\ninterface CellErrorBoundaryProps {\n renderFn: () => React.ReactNode;\n field: string;\n resetKey?: unknown;\n}\n\ninterface CellErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n resetKey?: unknown;\n}\n\nexport class CellErrorBoundary extends React.Component<CellErrorBoundaryProps, CellErrorBoundaryState> {\n constructor(props: CellErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null, resetKey: props.resetKey };\n }\n\n static getDerivedStateFromProps(\n props: CellErrorBoundaryProps,\n state: CellErrorBoundaryState\n ): Partial<CellErrorBoundaryState> | null {\n if (state.hasError && props.resetKey !== state.resetKey) {\n return { hasError: false, error: null, resetKey: props.resetKey };\n }\n if (props.resetKey !== state.resetKey) {\n return { resetKey: props.resetKey };\n }\n return null;\n }\n\n static getDerivedStateFromError(error: Error): Partial<CellErrorBoundaryState> {\n return { hasError: true, error };\n }\n\n override componentDidCatch(error: Error, info: React.ErrorInfo) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(`[CellErrorBoundary] field=\"${this.props.field}\"`, error, info.componentStack);\n }\n }\n\n override render() {\n if (this.state.hasError) {\n return (\n <div\n className=\"ogx__cell-error\"\n role=\"status\"\n aria-label={`Error in cell: ${this.props.field}`}\n title={this.state.error?.message ?? 'Render error'}\n >\n ⚠\n </div>\n );\n }\n return <CellRenderTarget renderFn={this.props.renderFn} />;\n }\n}\n","\nimport React from 'react';\nimport type { GridColDef, GridRowModel, GridPinnedPosition, GridCellParams, GridRowMeta } from '../../types';\nimport type { CellColSpanInfo } from '../../hooks/features/useGridSpanning';\n\nimport { GridEditInputCell } from './GridEditInputCell';\nimport { CellErrorBoundary } from './CellErrorBoundary';\n\nexport interface CellProps<R extends GridRowModel = GridRowModel> {\n onCellClick?: (params: GridCellParams<R>) => void;\n onCellEditStart?: (field: string, value: unknown) => void;\n onCellValueChange?: (field: string, newValue: unknown) => void;\n value: unknown;\n row: R;\n colDef: GridColDef<R>;\n rowIndex: number;\n colIndex: number;\n isSelected?: boolean;\n onClick?: (event: React.MouseEvent) => void;\n width?: number;\n pinnedPosition?: GridPinnedPosition | null;\n pinnedOffset?: number;\n\n isFocused?: boolean;\n isFocusVisible?: boolean;\n\n isEditable?: boolean;\n isEditing?: boolean;\n onEditStart?: () => void;\n onEditStop?: (cancel?: boolean) => void;\n onValueChange?: (newValue: unknown) => void;\n\n colSpanInfo?: CellColSpanInfo;\n rowSpan?: number;\n isHiddenByRowSpan?: boolean;\n rowMeta?: GridRowMeta;\n}\n\nfunction CellImpl<R extends GridRowModel = GridRowModel>(props: CellProps<R>) {\n const {\n onCellClick,\n onCellEditStart,\n onCellValueChange,\n value,\n row,\n colDef,\n rowIndex,\n colIndex,\n isSelected,\n onClick,\n width,\n pinnedPosition,\n pinnedOffset,\n isFocused,\n isFocusVisible,\n isEditable,\n isEditing,\n onEditStart,\n onEditStop,\n onValueChange,\n\n colSpanInfo,\n rowSpan: rowSpanProp,\n isHiddenByRowSpan,\n rowMeta\n } = props;\n\n // All hooks must come before any early returns (Rules of Hooks)\n const handleValueChange = React.useCallback((newValue: unknown) => {\n if (onCellValueChange) {\n onCellValueChange(colDef.field, newValue);\n } else {\n onValueChange?.(newValue);\n }\n }, [onCellValueChange, onValueChange, colDef.field]);\n\n const formattedValue = React.useMemo(() => {\n if (colDef.valueFormatter) {\n return colDef.valueFormatter({\n value,\n row,\n field: colDef.field\n });\n }\n\n if (value === null || value === undefined) {\n return '';\n }\n\n return String(value);\n }, [value, row, colDef]);\n\n const resolvedCellClassName = React.useMemo(() => {\n if (!colDef.cellClassName) return '';\n if (typeof colDef.cellClassName === 'function') {\n return colDef.cellClassName({ value, row, field: colDef.field, colDef, rowIndex, colIndex }) || '';\n }\n return colDef.cellClassName;\n }, [colDef, value, row, rowIndex, colIndex]);\n\n const cellRef = React.useRef<HTMLDivElement>(null);\n\n React.useLayoutEffect(() => {\n if (isFocused && cellRef.current) {\n cellRef.current.focus({ preventScroll: true });\n }\n }, [isFocused]);\n\n if (colSpanInfo?.spannedByColSpan) {\n return null;\n }\n\n if (isHiddenByRowSpan) {\n return (\n <div\n className=\"ogx__cell ogx__cell--hidden\"\n style={{ width: width ?? colDef.width ?? 100 }}\n role=\"presentation\"\n data-field={colDef.field}\n data-colindex={colIndex}\n />\n );\n }\n\n const handleClick = (e: React.MouseEvent) => {\n if (onCellClick) {\n onCellClick({\n row,\n field: colDef.field,\n value,\n colDef,\n rowIndex,\n colIndex\n });\n }\n onClick?.(e);\n };\n\n const handleDoubleClick = (e: React.MouseEvent) => {\n if (isEditable && (onEditStart || onCellEditStart)) {\n e.stopPropagation();\n if (onCellEditStart) {\n onCellEditStart(colDef.field, value);\n } else {\n onEditStart?.();\n }\n }\n };\n\n const isPinned = pinnedPosition !== null && pinnedPosition !== undefined;\n\n const classNames = [\n 'ogx__cell',\n `ogx__cell--align-${colDef.align || 'left'}`,\n isSelected && 'ogx__cell--selected',\n isFocused && 'ogx__cell--focused',\n (isFocused && isFocusVisible) && 'ogx__cell--focus-visible',\n colDef.type && `ogx__cell--type-${colDef.type}`,\n isPinned && 'ogx__cell--pinned',\n isPinned && `ogx__cell--pinned-${pinnedPosition}`,\n isEditing && 'ogx__cell--editing',\n (rowSpanProp && rowSpanProp > 1) && 'ogx__cell--spanned',\n resolvedCellClassName\n ].filter(Boolean).join(' ');\n\n const colSpan = colSpanInfo?.cellProps?.colSpan || 1;\n const rowSpan = rowSpanProp || 1;\n const cellWidth = colSpanInfo?.cellProps?.width ?? width ?? colDef.width ?? 100;\n\n const style: React.CSSProperties = {\n width: 'var(--width)',\n '--width': typeof cellWidth === 'number' ? `${cellWidth}px` : cellWidth,\n flexGrow: colDef.flex ?? 0,\n flexShrink: 0,\n flexBasis: colDef.flex ? 'auto' : 'auto',\n boxSizing: 'border-box',\n minWidth: colDef.minWidth,\n maxWidth: colDef.maxWidth,\n position: isPinned ? 'sticky' : undefined,\n zIndex: colDef.zIndex ?? (isPinned ? 3 : undefined),\n padding: isEditing ? 0 : undefined\n } as React.CSSProperties;\n\n if (rowSpan > 1) {\n style.height = `calc(var(--height) * ${rowSpan} - var(--border-width, 1px))`;\n style.zIndex = 10;\n if (isPinned) {\n style.zIndex = 40;\n }\n }\n\n if (isPinned && pinnedOffset !== undefined) {\n if (pinnedPosition === 'left') {\n style.left = pinnedOffset;\n } else {\n style.right = pinnedOffset;\n }\n }\n\n return (\n <div\n ref={cellRef}\n className={classNames}\n style={style}\n onClick={handleClick}\n onDoubleClick={handleDoubleClick}\n role=\"gridcell\"\n aria-colindex={colIndex + 1}\n aria-readonly={!isEditable || undefined}\n tabIndex={-1}\n data-field={colDef.field}\n data-colindex={colIndex}\n {...(colSpan > 1 ? { 'aria-colspan': colSpan } : {})}\n {...(rowSpan > 1 ? { 'aria-rowspan': rowSpan } : {})}\n >\n <div className=\"ogx__cell-content\">\n {isEditing && (onCellValueChange || onValueChange) && onEditStop ? (\n colDef.renderEditCell ? (\n colDef.renderEditCell({\n value,\n row,\n field: colDef.field,\n colDef,\n rowIndex,\n colIndex,\n rowMeta,\n })\n ) : (\n <GridEditInputCell\n value={value}\n row={row}\n field={colDef.field}\n colDef={colDef as unknown as GridColDef}\n rowIndex={rowIndex}\n colIndex={colIndex}\n onValueChange={handleValueChange}\n onCommit={() => onEditStop()}\n onCancel={() => onEditStop(true)}\n />\n )\n ) : colDef.renderCell ? (\n <CellErrorBoundary\n field={colDef.field}\n resetKey={row}\n renderFn={() => colDef.renderCell!({\n value,\n row,\n field: colDef.field,\n colDef,\n rowIndex,\n colIndex,\n rowMeta,\n })}\n />\n ) : (\n formattedValue\n )}\n </div>\n </div>\n );\n}\n\nexport const Cell = React.memo(CellImpl) as typeof CellImpl;\n","import React from 'react';\n\nexport type DragHandleIconProps = React.ButtonHTMLAttributes<HTMLButtonElement>;\n\nexport const DragHandleIcon: React.FC<DragHandleIconProps> = ({ className = '', ...props }) => {\n return (\n <button\n type=\"button\"\n className={`ogx-drag-handle ${className}`}\n aria-label=\"Drag to reorder row\"\n {...props}\n >\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M11 18c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2zm-2-8c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm6 4c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\" />\n </svg>\n </button>\n );\n};\n","\nimport React from 'react';\nimport type { GridRowModel, GridRowId, GridDetailPanelHeight } from '../../types';\n\n\nexport interface DetailPanelProps<R extends GridRowModel = GridRowModel> {\n row: R;\n rowId: GridRowId;\n rowIndex: number;\n content: React.ReactNode;\n height: GridDetailPanelHeight;\n isExpanded: boolean;\n}\n\nexport function DetailPanel<R extends GridRowModel = GridRowModel>(props: DetailPanelProps<R>) {\n const { content, height, isExpanded } = props;\n\n if (!isExpanded) {\n return null;\n }\n\n const style: React.CSSProperties = {\n height: height === 'auto' ? 'auto' : `${height}px`,\n overflow: height === 'auto' ? 'visible' : 'auto'\n };\n\n return (\n <div className=\"ogx__detail-panel\" style={style}>\n <div className=\"ogx__detail-panel-content\">\n {content}\n </div>\n </div>\n );\n}\n","\nimport React, { useId } from 'react';\nimport { Cell } from '../Cell/Cell';\nimport { Checkbox } from '../ui/Checkbox';\nimport { ExpandIcon } from '../ui/ExpandIcon';\nimport { DragHandleIcon } from '../ui/DragHandleIcon';\nimport { DetailPanel } from '../DetailPanel/DetailPanel';\nimport type { GridRowModel, GridColDef, GridRowId, GridColumnPinning, GridRowPinning, GridRowParams, GridCellParams, GridDetailPanelHeight, GridRowMeta } from '../../types';\nimport type { CellColSpanInfo, RowSpanningCaches } from '../../hooks/features/useGridSpanning';\nimport { isColumnPinned, calculatePinnedPositions, isRowPinned } from '../../utils/pinning';\n\n\nexport interface RowProps<R extends GridRowModel = GridRowModel> {\n row: R;\n columns: GridColDef<R>[];\n rowIndex: number;\n isSelected?: boolean;\n checkboxSelection?: boolean;\n onRowClick?: (params: GridRowParams<R>) => void;\n onCellClick?: (params: GridCellParams<R>) => void;\n onSelectionChange?: (rowId: GridRowId, isSelected: boolean) => void;\n columnWidths?: Record<string, number>;\n pinnedColumns?: GridColumnPinning;\n pinnedRows?: GridRowPinning;\n\n hasDetailPanel?: boolean;\n isDetailPanelExpanded?: boolean;\n onDetailPanelToggle?: (rowId: GridRowId) => void;\n detailPanelContent?: React.ReactNode;\n detailPanelHeight?: GridDetailPanelHeight;\n\n pinCheckboxColumn?: boolean;\n pinExpandColumn?: boolean;\n\n rowReordering?: boolean;\n onDragStart?: (id: GridRowId) => (event: React.DragEvent) => void;\n onDragOver?: (id: GridRowId) => (event: React.DragEvent) => void;\n onDragEnd?: () => void;\n onDrop?: (targetId: GridRowId) => (event: React.DragEvent) => void;\n isDragging?: boolean;\n isDragOver?: boolean;\n\n editingCell?: { id: GridRowId; field: string; value: unknown; } | null;\n onEditStart?: (params: { id: GridRowId, field: string, value: unknown }) => void;\n onEditStop?: (params?: { cancel?: boolean }) => void;\n onEditCellValueChange?: (params: { id: GridRowId, field: string, value: unknown }) => void;\n\n focusedCellField?: string | null;\n isFocusVisible?: boolean;\n\n colspanMap?: Map<GridRowId, Record<string, CellColSpanInfo>>;\n rowSpanningCaches?: RowSpanningCaches;\n rowHeight?: number;\n rowMeta?: GridRowMeta;\n}\n\nexport function Row<R extends GridRowModel = GridRowModel>(props: RowProps<R>) {\n const {\n row,\n columns,\n rowIndex,\n isSelected = false,\n checkboxSelection = false,\n onRowClick,\n onCellClick,\n onSelectionChange,\n columnWidths = {},\n pinnedColumns,\n pinnedRows,\n hasDetailPanel = false,\n isDetailPanelExpanded = false,\n onDetailPanelToggle,\n detailPanelContent,\n detailPanelHeight = 200,\n pinCheckboxColumn = true,\n pinExpandColumn = true,\n rowReordering = false,\n onDragStart,\n onDragOver,\n onDragEnd,\n onDrop,\n isDragging,\n isDragOver,\n\n editingCell,\n onEditStart,\n onEditStop,\n onEditCellValueChange,\n\n focusedCellField,\n isFocusVisible,\n\n colspanMap,\n rowSpanningCaches,\n rowHeight = 52,\n rowMeta\n } = props;\n\n const checkboxId = useId();\n const expandCellRef = React.useRef<HTMLDivElement>(null);\n const checkboxCellRef = React.useRef<HTMLDivElement>(null);\n\n // All hooks must come before any early returns (Rules of Hooks)\n React.useLayoutEffect(() => {\n if (focusedCellField === '__expand_col__' && expandCellRef.current) {\n expandCellRef.current.focus({ preventScroll: true });\n }\n if (focusedCellField === '__checkbox_col__' && checkboxCellRef.current) {\n checkboxCellRef.current.focus({ preventScroll: true });\n }\n }, [focusedCellField]);\n\n const pinnedPositions = React.useMemo(() => {\n return calculatePinnedPositions(\n columns,\n columnWidths,\n pinnedColumns,\n checkboxSelection,\n pinCheckboxColumn,\n hasDetailPanel,\n pinExpandColumn,\n rowReordering\n );\n }, [columns, columnWidths, pinnedColumns, checkboxSelection, pinCheckboxColumn, hasDetailPanel, pinExpandColumn, rowReordering]);\n\n const isGroupRow = rowMeta?.hasChildren === true;\n\n const handleCellEditStart = React.useCallback((field: string, value: unknown) => {\n if (!isGroupRow) {\n onEditStart?.({ id: row.id, field, value });\n }\n }, [isGroupRow, row.id, onEditStart]);\n\n const handleCellValueChange = React.useCallback((field: string, newValue: unknown) => {\n onEditCellValueChange?.({ id: row.id, field, value: newValue });\n }, [onEditCellValueChange, row.id]);\n\n const handleEditStopWrapper = React.useCallback((cancel?: boolean) => {\n onEditStop?.({ cancel });\n }, [onEditStop]);\n\n // ── Skeleton row (shown during infinite-scroll fetch) ─────────────────────\n if (row._isSkeleton) {\n // Render shimmer placeholders — one per visible column, matching row height\n const cellCount = Math.max(columns.length, 5);\n return (\n <div\n className=\"ogx__row ogx__row--skeleton\"\n role=\"row\"\n aria-hidden=\"true\"\n style={{ height: rowHeight, minHeight: rowHeight }}\n >\n {Array.from({ length: cellCount }).map((_, i) => (\n <div key={i} className=\"ogx__skeleton-cell\">\n <div className=\"ogx__skeleton-bar\" />\n </div>\n ))}\n </div>\n );\n }\n\n const handleRowClick = (event: React.MouseEvent) => {\n\n if ((event.target as HTMLElement).closest('.ogx-checkbox-wrapper, .ogx-expand-icon, .ogx-drag-handle, .ogx__edit-cell')) {\n return;\n }\n onRowClick?.({ row, id: row.id, rowIndex });\n };\n\n const handleCheckboxChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n event.stopPropagation();\n onSelectionChange?.(row.id, event.target.checked);\n };\n\n const handleDetailPanelToggle = (event: React.MouseEvent) => {\n event.stopPropagation();\n onDetailPanelToggle?.(row.id);\n };\n\n const rowPinnedPosition = isRowPinned(row.id, pinnedRows);\n const isRowPinnedTop = rowPinnedPosition === 'top';\n const isRowPinnedBottom = rowPinnedPosition === 'bottom';\n\n const classNames = [\n 'ogx__row',\n isSelected && 'ogx__row--selected',\n rowIndex % 2 === 0 && 'ogx__row--even',\n rowIndex % 2 === 1 && 'ogx__row--odd',\n isRowPinnedTop && 'ogx__row--pinned-top',\n isRowPinnedBottom && 'ogx__row--pinned-bottom',\n isDragging && 'ogx__row--dragging',\n isDragOver && 'ogx__row--drag-over',\n isGroupRow && 'ogx__row--group'\n ].filter(Boolean).join(' ');\n\n return (\n <>\n <div\n className={classNames}\n onClick={handleRowClick}\n role=\"row\"\n aria-rowindex={rowIndex + 1}\n aria-selected={isSelected}\n data-rowindex={rowIndex}\n onDragOver={onDragOver ? onDragOver(row.id) : undefined}\n onDrop={onDrop ? onDrop(row.id) : undefined}\n style={{\n maxHeight: `${rowHeight}px`,\n minHeight: `${rowHeight}px`,\n '--height': `${rowHeight}px`,\n '--border-width': '1px'\n } as React.CSSProperties}\n >\n { }\n {rowReordering && (\n <div\n className=\"ogx__cell ogx__cell--drag-handle\"\n role=\"gridcell\"\n aria-label=\"Drag to reorder row\"\n style={{\n position: 'sticky',\n left: 0,\n zIndex: 4\n }}\n draggable={true}\n onDragStart={onDragStart ? onDragStart(row.id) : undefined}\n onDragEnd={onDragEnd}\n onClick={(e) => e.stopPropagation()}\n >\n <DragHandleIcon />\n </div>\n )}\n\n { }\n {hasDetailPanel && (\n <div\n className={`ogx__cell ogx__cell--expand ${pinExpandColumn ? 'ogx__cell--pinned-left' : ''\n } ${focusedCellField === '__expand_col__' ? 'ogx__cell--focused' : ''} ${(focusedCellField === '__expand_col__' && isFocusVisible) ? 'ogx__cell--focus-visible' : ''\n }`}\n role=\"gridcell\"\n aria-label={isDetailPanelExpanded ? 'Collapse row details' : 'Expand row details'}\n aria-expanded={isDetailPanelExpanded}\n style={{\n position: pinExpandColumn ? 'sticky' : undefined,\n left: pinExpandColumn ? (rowReordering ? 48 : 0) : undefined,\n zIndex: pinExpandColumn ? 5 : undefined\n }}\n ref={expandCellRef}\n tabIndex={-1}\n onClick={(e) => {\n e.stopPropagation();\n onCellClick?.({\n row,\n field: '__expand_col__',\n value: isDetailPanelExpanded,\n colDef: { field: '__expand_col__', width: 48 } as unknown as GridColDef<R>,\n rowIndex,\n colIndex: -1\n });\n }}\n >\n <ExpandIcon\n isExpanded={isDetailPanelExpanded}\n onClick={handleDetailPanelToggle}\n variant=\"plus-minus\"\n />\n </div>\n )}\n\n { }\n {checkboxSelection && (\n <div\n className={`ogx__cell ogx__cell--checkbox ${pinCheckboxColumn ? 'ogx__cell--pinned-left' : ''\n } ${focusedCellField === '__checkbox_col__' ? 'ogx__cell--focused' : ''} ${(focusedCellField === '__checkbox_col__' && isFocusVisible) ? 'ogx__cell--focus-visible' : ''\n }`}\n role=\"gridcell\"\n style={{\n position: pinCheckboxColumn ? 'sticky' : undefined,\n left: pinCheckboxColumn ? ((rowReordering ? 48 : 0) + (hasDetailPanel && pinExpandColumn ? 48 : 0)) : undefined,\n zIndex: pinCheckboxColumn ? 11 : undefined\n }}\n ref={checkboxCellRef}\n tabIndex={-1}\n onClick={(e) => {\n e.stopPropagation();\n onCellClick?.({\n row,\n field: '__checkbox_col__',\n value: isSelected,\n colDef: { field: '__checkbox_col__', width: 48 } as unknown as GridColDef<R>,\n rowIndex,\n colIndex: -1\n });\n }}\n >\n <Checkbox\n id={checkboxId}\n name={`ogx-select-row-${row.id}`}\n checked={isSelected}\n onChange={handleCheckboxChange}\n onClick={(e) => e.stopPropagation()}\n aria-label={isSelected ? `Deselect row ${row.id}` : `Select row ${row.id}`}\n tabIndex={-1}\n onMouseDown={(e) => e.preventDefault()}\n />\n </div>\n )}\n\n { }\n {columns.map((colDef, colIndex) => {\n if (colDef.isSpacer) {\n return (\n <div\n key={colDef.field}\n style={{ width: colDef.width, minWidth: colDef.width, flexShrink: 0 }}\n aria-hidden=\"true\"\n />\n );\n }\n const value = colDef.valueGetter\n ? colDef.valueGetter({ row, field: colDef.field, value: row[colDef.field] })\n : row[colDef.field];\n\n const effectiveWidth = columnWidths[colDef.field] ?? colDef.width;\n\n const pinnedPosition = isColumnPinned(colDef.field, pinnedColumns);\n const pinnedOffset = pinnedPosition ? pinnedPositions[colDef.field] : undefined;\n\n const isEditing = editingCell?.id === row.id && editingCell?.field === colDef.field;\n\n const cellValue = isEditing ? editingCell?.value : value;\n\n const colSpanInfo = colspanMap?.get(row.id)?.[colDef.field];\n const rowSpan = rowSpanningCaches?.spannedCells[row.id]?.[colDef.field];\n const isHiddenByRowSpan = rowSpanningCaches?.hiddenCells[row.id]?.[colDef.field] || false;\n\n return (\n <Cell\n key={colDef.field}\n value={cellValue}\n row={row}\n colDef={colDef}\n rowIndex={rowIndex}\n colIndex={colIndex}\n isSelected={isSelected}\n onCellClick={onCellClick}\n width={effectiveWidth}\n pinnedPosition={pinnedPosition}\n pinnedOffset={pinnedOffset}\n\n isFocused={focusedCellField === colDef.field}\n isFocusVisible={isFocusVisible}\n\n isEditable={colDef.editable}\n isEditing={isEditing}\n onCellEditStart={handleCellEditStart}\n onEditStop={handleEditStopWrapper}\n onCellValueChange={handleCellValueChange}\n\n colSpanInfo={colSpanInfo}\n rowSpan={rowSpan}\n isHiddenByRowSpan={isHiddenByRowSpan}\n rowMeta={rowMeta}\n />\n );\n })}\n </div>\n\n { }\n {hasDetailPanel && (\n <DetailPanel\n row={row}\n rowId={row.id}\n rowIndex={rowIndex}\n content={detailPanelContent}\n height={detailPanelHeight}\n isExpanded={isDetailPanelExpanded}\n />\n )}\n </>\n );\n}\n","import React from 'react';\nimport { Row } from '../Row/Row';\nimport type {\n GridRowModel,\n GridRowId,\n GridColDef,\n GridRowParams,\n GridCellParams,\n GridColumnPinning,\n GridRowPinning,\n GridDetailPanelParams,\n GridDetailPanelHeight,\n GridRowMeta,\n} from '../../types';\nimport type { CellColSpanInfo, RowSpanningCaches } from '../../hooks/features/useGridSpanning';\n\nexport interface GridPinnedRowsProps<R extends GridRowModel> {\n rows: R[];\n position: 'top' | 'bottom';\n columns: GridColDef<R>[];\n selectedRowIds: Set<GridRowId>;\n checkboxSelection: boolean;\n onRowClick: (params: GridRowParams<R>) => void;\n onCellClick: (params: GridCellParams<R>) => void;\n onSelectionChange: (rowId: GridRowId, isSelected: boolean) => void;\n columnWidths: Record<string, number>;\n pinnedColumns: GridColumnPinning;\n pinnedRows?: GridRowPinning;\n hasDetailPanel: boolean;\n expandedRowIds: Set<GridRowId>;\n getDetailPanelContent?: (params: GridDetailPanelParams<R>) => React.ReactNode;\n getDetailPanelHeight?: (params: GridDetailPanelParams<R>) => GridDetailPanelHeight;\n onDetailPanelToggle: (rowId: GridRowId) => void;\n pinCheckboxColumn?: boolean;\n pinExpandColumn?: boolean;\n focusedCell: { id: GridRowId; field: string } | null;\n colspanMap?: Map<GridRowId, Record<string, CellColSpanInfo>>;\n rowSpanningCaches?: RowSpanningCaches;\n rowHeight: number;\n rowMetaMap: Map<GridRowId, GridRowMeta>;\n}\n\nexport function GridPinnedRows<R extends GridRowModel>({\n rows,\n position,\n columns,\n selectedRowIds,\n checkboxSelection,\n onRowClick,\n onCellClick,\n onSelectionChange,\n columnWidths,\n pinnedColumns,\n pinnedRows,\n hasDetailPanel,\n expandedRowIds,\n getDetailPanelContent,\n getDetailPanelHeight,\n onDetailPanelToggle,\n pinCheckboxColumn,\n pinExpandColumn,\n focusedCell,\n colspanMap,\n rowSpanningCaches,\n rowHeight,\n rowMetaMap,\n}: GridPinnedRowsProps<R>) {\n if (rows.length === 0) return null;\n\n return (\n <div className={`ogx__pinned-rows ogx__pinned-rows--${position}`} role=\"rowgroup\">\n {rows.map((row, index) => (\n <Row<R>\n key={row.id}\n row={row}\n columns={columns}\n rowIndex={index}\n isSelected={selectedRowIds.has(row.id)}\n checkboxSelection={checkboxSelection}\n onRowClick={onRowClick}\n onCellClick={onCellClick}\n onSelectionChange={onSelectionChange}\n columnWidths={columnWidths}\n pinnedColumns={pinnedColumns}\n pinnedRows={pinnedRows}\n hasDetailPanel={hasDetailPanel}\n isDetailPanelExpanded={expandedRowIds.has(row.id)}\n detailPanelContent={getDetailPanelContent ? getDetailPanelContent({ row, id: row.id, rowIndex: index }) : null}\n detailPanelHeight={getDetailPanelHeight?.({ row, id: row.id, rowIndex: index }) || 200}\n onDetailPanelToggle={onDetailPanelToggle}\n pinCheckboxColumn={pinCheckboxColumn}\n pinExpandColumn={pinExpandColumn}\n focusedCellField={focusedCell?.id === row.id ? focusedCell.field : null}\n colspanMap={colspanMap}\n rowSpanningCaches={rowSpanningCaches}\n rowHeight={rowHeight}\n rowMeta={rowMetaMap.get(row.id)}\n />\n ))}\n </div>\n );\n}\n","import React from 'react';\nimport type { GridColDef } from '../../types';\n\ninterface SkeletonColumn extends GridColDef {\n left?: number;\n right?: number;\n pinned?: 'left' | 'right';\n zIndex?: number;\n}\n\ninterface SkeletonRowProps {\n columns: SkeletonColumn[];\n rowHeight: number;\n checkboxSelection?: boolean;\n hasDetailPanel?: boolean;\n rowReordering?: boolean;\n}\n\nexport const SkeletonRow: React.FC<SkeletonRowProps> = ({\n columns,\n rowHeight,\n checkboxSelection = false,\n hasDetailPanel = false,\n rowReordering = false\n}) => {\n return (\n <div\n className=\"ogx__row ogx__skeleton-row\"\n style={{ height: rowHeight }}\n role=\"row\"\n >\n { }\n {checkboxSelection && (\n <div\n className=\"ogx__cell ogx__skeleton-cell\"\n style={{ width: 48, minWidth: 48 }}\n >\n <div className=\"ogx-skeleton-box\" style={{ width: 18, height: 18, borderRadius: 2 }} />\n </div>\n )}\n\n { }\n {hasDetailPanel && (\n <div\n className=\"ogx__cell ogx__skeleton-cell\"\n style={{ width: 48, minWidth: 48 }}\n >\n <div className=\"ogx-skeleton-box\" style={{ width: 18, height: 18, borderRadius: 2 }} />\n </div>\n )}\n\n { }\n {rowReordering && (\n <div\n className=\"ogx__cell ogx__skeleton-cell\"\n style={{ width: 48, minWidth: 48 }}\n >\n <div className=\"ogx-skeleton-box\" style={{ width: 18, height: 18, borderRadius: 2 }} />\n </div>\n )}\n\n { }\n {columns.map((col, index) => {\n const width = typeof col.width === 'number' ? col.width : 150;\n const skeletonWidth = Math.min(width * 0.7, width - 20);\n\n return (\n <div\n key={col.field || index}\n className=\"ogx__cell ogx__skeleton-cell\"\n style={{\n width,\n minWidth: col.minWidth,\n maxWidth: col.maxWidth,\n left: col.left,\n right: col.right,\n position: col.isSpacer ? 'relative' : (col.pinned ? 'sticky' : 'relative'),\n zIndex: col.zIndex\n }}\n >\n {!col.isSpacer && (\n <div\n className=\"ogx-skeleton-box\"\n style={{\n width: skeletonWidth,\n height: 16,\n borderRadius: 4\n }}\n />\n )}\n </div>\n );\n })}\n </div>\n );\n};\n","import React from 'react';\nimport { Row } from '../Row/Row';\nimport { SkeletonRow } from '../SkeletonRow';\nimport { isRowPinned } from '../../utils/pinning';\nimport type {\n GridRowModel,\n GridRowId,\n GridColDef,\n GridRowParams,\n GridCellParams,\n GridColumnPinning,\n GridRowPinning,\n GridDetailPanelParams,\n GridDetailPanelHeight,\n GridRowMeta,\n} from '../../types';\nimport type { GridVisibleRow } from '../../hooks/core/useGridVisibleRows';\nimport type { UseRowReorderReturn } from '../../hooks/useRowReorder';\nimport type { GridEditingState } from '../../hooks/features/useGridEditing';\nimport type { CellColSpanInfo, RowSpanningCaches } from '../../hooks/features/useGridSpanning';\n\ninterface RowEditingHandlers {\n editingCell: GridEditingState['editingCell'];\n startCellEdit: (params: { id: GridRowId; field: string; value: unknown }) => void;\n stopCellEdit: (params?: { cancel?: boolean }) => void;\n setEditCellValue: (params: { id: GridRowId; field: string; value: unknown }) => void;\n}\n\nexport interface GridVirtualRowsProps<R extends GridRowModel> {\n virtualContainerHeight: number;\n offsetTop: number;\n effectiveLoading: boolean;\n visibleRows: GridVisibleRow<R>[];\n baseColumns: GridColDef<R>[];\n virtualColumns: GridColDef<R>[];\n viewportWidth: number;\n checkboxSelection: boolean;\n hasDetailPanel: boolean;\n rowReordering: boolean;\n rowHeight: number;\n pinnedRows?: GridRowPinning;\n selectedRowIds: Set<GridRowId>;\n onRowClick: (params: GridRowParams<R>) => void;\n onCellClick: (params: GridCellParams<R>) => void;\n onSelectionChange: (rowId: GridRowId, isSelected: boolean) => void;\n columnWidths: Record<string, number>;\n pinnedColumns: GridColumnPinning;\n expandedRowIds: Set<GridRowId>;\n getDetailPanelContent?: (params: GridDetailPanelParams<R>) => React.ReactNode;\n getDetailPanelHeight?: (params: GridDetailPanelParams<R>) => GridDetailPanelHeight;\n onDetailPanelToggle: (rowId: GridRowId) => void;\n pinCheckboxColumn?: boolean;\n pinExpandColumn?: boolean;\n rowReorderHandlers: UseRowReorderReturn;\n editingHandlers: RowEditingHandlers;\n focusedCell: { id: GridRowId; field: string } | null;\n colspanMap?: Map<GridRowId, Record<string, CellColSpanInfo>>;\n rowSpanningCaches?: RowSpanningCaches;\n paginationMode: 'client' | 'server' | 'infinite';\n dataSourceLoading: boolean;\n sortedUnpinnedRowCount: number;\n infiniteScrollSkeletonCount: number;\n unpinnedRowsLength: number;\n rowMetaMap: Map<GridRowId, GridRowMeta>;\n}\n\nexport function GridVirtualRows<R extends GridRowModel>({\n virtualContainerHeight,\n offsetTop,\n effectiveLoading,\n visibleRows,\n baseColumns,\n virtualColumns,\n viewportWidth,\n checkboxSelection,\n hasDetailPanel,\n rowReordering,\n rowHeight,\n pinnedRows,\n selectedRowIds,\n onRowClick,\n onCellClick,\n onSelectionChange,\n columnWidths,\n pinnedColumns,\n expandedRowIds,\n getDetailPanelContent,\n getDetailPanelHeight,\n onDetailPanelToggle,\n pinCheckboxColumn,\n pinExpandColumn,\n rowReorderHandlers,\n editingHandlers,\n focusedCell,\n colspanMap,\n rowSpanningCaches,\n paginationMode,\n dataSourceLoading,\n sortedUnpinnedRowCount,\n infiniteScrollSkeletonCount,\n unpinnedRowsLength,\n rowMetaMap,\n}: GridVirtualRowsProps<R>) {\n const skeletonColumns: GridColDef<R>[] = baseColumns.length > 0\n ? baseColumns\n : (() => {\n const availableWidth = (viewportWidth || 1000) -\n (checkboxSelection ? 48 : 0) -\n (hasDetailPanel ? 48 : 0) -\n (rowReordering ? 48 : 0);\n const columnWidth = 150;\n const columnCount = Math.max(1, Math.ceil(availableWidth / columnWidth));\n return Array.from({ length: columnCount }, (_, i) => ({\n field: `placeholder_${i}`,\n headerName: '',\n width: columnWidth,\n })) as GridColDef<R>[];\n })();\n\n const centerRows = visibleRows\n .filter(({ row }) => !isRowPinned(row.id, pinnedRows))\n .filter((item, index, self) =>\n index === self.findIndex(t => t.row.id === item.row.id)\n );\n\n return (\n <div\n className=\"ogx__virtual-container\"\n style={{ height: `${virtualContainerHeight}px` }}\n role=\"presentation\"\n >\n <div\n className=\"ogx__rows\"\n style={{ transform: `translateY(${offsetTop}px)` }}\n role=\"rowgroup\"\n >\n {effectiveLoading && visibleRows.length === 0 ? (\n Array.from({ length: 10 }).map((_, index) => (\n <SkeletonRow\n key={`skeleton-${index}`}\n columns={skeletonColumns as unknown as GridColDef[]}\n rowHeight={rowHeight}\n checkboxSelection={checkboxSelection}\n hasDetailPanel={hasDetailPanel}\n rowReordering={rowReordering}\n />\n ))\n ) : (\n centerRows.map(({ row, rowIndex: actualIndex }) => (\n <Row<R>\n key={row.id}\n row={row}\n columns={virtualColumns}\n rowIndex={actualIndex}\n isSelected={selectedRowIds.has(row.id)}\n checkboxSelection={checkboxSelection}\n onRowClick={onRowClick}\n onCellClick={onCellClick}\n onSelectionChange={onSelectionChange}\n columnWidths={columnWidths}\n pinnedColumns={pinnedColumns}\n pinnedRows={pinnedRows}\n hasDetailPanel={hasDetailPanel}\n isDetailPanelExpanded={expandedRowIds.has(row.id)}\n detailPanelContent={getDetailPanelContent ? getDetailPanelContent({ row, id: row.id, rowIndex: actualIndex }) : null}\n detailPanelHeight={getDetailPanelHeight?.({ row, id: row.id, rowIndex: actualIndex }) || 200}\n onDetailPanelToggle={onDetailPanelToggle}\n pinCheckboxColumn={pinCheckboxColumn}\n pinExpandColumn={pinExpandColumn}\n rowReordering={rowReordering}\n onDragStart={rowReorderHandlers.onDragStart}\n onDragOver={rowReorderHandlers.onDragOver}\n onDragEnd={rowReorderHandlers.onDragEnd}\n onDrop={rowReorderHandlers.onDrop}\n isDragging={rowReorderHandlers.draggedRowId === row.id}\n isDragOver={rowReorderHandlers.dragOverRowId === row.id}\n editingCell={editingHandlers.editingCell}\n onEditStart={editingHandlers.startCellEdit}\n onEditStop={editingHandlers.stopCellEdit}\n onEditCellValueChange={editingHandlers.setEditCellValue}\n focusedCellField={focusedCell != null && focusedCell.id === row.id ? focusedCell.field : null}\n colspanMap={colspanMap}\n rowSpanningCaches={rowSpanningCaches}\n rowHeight={rowHeight}\n rowMeta={rowMetaMap.get(row.id)}\n />\n ))\n )}\n\n {paginationMode === 'infinite' && dataSourceLoading && sortedUnpinnedRowCount > 0 && (\n <div className=\"ogx__skeleton-group\">\n {Array.from({ length: infiniteScrollSkeletonCount }).map((_, i) => (\n <Row<R>\n key={`__skeleton_${i}__`}\n row={{ id: `__skeleton_${i}__`, _isSkeleton: true } as unknown as R}\n columns={virtualColumns}\n rowIndex={unpinnedRowsLength + i}\n rowHeight={rowHeight}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { useState, useMemo, useRef } from 'react';\nimport { Checkbox } from '../ui/Checkbox';\nimport type { GridColDef, GridRowModel } from '../../types';\n\n\nexport interface ColumnVisibilityPanelProps<R extends GridRowModel = GridRowModel> {\n columns: GridColDef<R>[];\n visibleColumns: Set<string>;\n onVisibilityChange: (field: string, isVisible: boolean) => void;\n onShowAll: () => void;\n onHideAll: () => void;\n onColumnReorder?: (fromField: string, toField: string) => void;\n onColumnOrderReset?: () => void;\n /** Show columns with `hideable: false` in the panel as disabled rows. Default: false. */\n showNonHideableColumns?: boolean;\n}\n\nfunction SearchIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n );\n}\n\nfunction DragHandleIcon() {\n return (\n <svg\n className=\"ogx-column-visibility-panel__drag-handle\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <circle cx=\"9\" cy=\"5\" r=\"1.5\" />\n <circle cx=\"15\" cy=\"5\" r=\"1.5\" />\n <circle cx=\"9\" cy=\"12\" r=\"1.5\" />\n <circle cx=\"15\" cy=\"12\" r=\"1.5\" />\n <circle cx=\"9\" cy=\"19\" r=\"1.5\" />\n <circle cx=\"15\" cy=\"19\" r=\"1.5\" />\n </svg>\n );\n}\n\nexport function ColumnVisibilityPanel<R extends GridRowModel = GridRowModel>(\n props: ColumnVisibilityPanelProps<R>\n) {\n const { columns, visibleColumns, onVisibilityChange, onShowAll, onHideAll, onColumnReorder, onColumnOrderReset, showNonHideableColumns } = props;\n const [searchQuery, setSearchQuery] = useState('');\n const [dragOverField, setDragOverField] = useState<string | null>(null);\n const dragFieldRef = useRef<string | null>(null);\n\n const hideableColumns = useMemo(() => columns.filter(col => col.hideable !== false), [columns]);\n const allVisible = hideableColumns.every(col => visibleColumns.has(col.field));\n\n const filteredColumns = useMemo(() => {\n const base = showNonHideableColumns ? columns : hideableColumns;\n if (!searchQuery) return base;\n const lowerQuery = searchQuery.toLowerCase();\n return base.filter(col =>\n (col.headerName || col.field).toLowerCase().includes(lowerQuery)\n );\n }, [columns, hideableColumns, searchQuery, showNonHideableColumns]);\n\n const handleToggleAll = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.checked) {\n onShowAll();\n } else {\n onHideAll();\n }\n };\n\n // ── Drag handlers ──────────────────────────────────────────────────────────\n const handleDragStart = (field: string) => (e: React.DragEvent) => {\n dragFieldRef.current = field;\n e.dataTransfer.effectAllowed = 'move';\n // Use a ghost image offset so the handle looks natural\n e.dataTransfer.setDragImage(e.currentTarget.closest('.ogx-column-visibility-panel__item') as HTMLElement, 20, 20);\n };\n\n const handleDragOver = (field: string) => (e: React.DragEvent) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n if (field !== dragFieldRef.current) {\n setDragOverField(field);\n }\n };\n\n const handleDragLeave = () => {\n setDragOverField(null);\n };\n\n const handleDrop = (toField: string) => (e: React.DragEvent) => {\n e.preventDefault();\n const fromField = dragFieldRef.current;\n setDragOverField(null);\n dragFieldRef.current = null;\n if (fromField && fromField !== toField && onColumnReorder) {\n onColumnReorder(fromField, toField);\n }\n };\n\n const handleDragEnd = () => {\n setDragOverField(null);\n dragFieldRef.current = null;\n };\n\n return (\n <div className=\"ogx-column-visibility-panel\">\n <div className=\"ogx-column-visibility-panel__search-section\">\n <div className=\"ogx-column-visibility-panel__search-container\">\n <SearchIcon />\n <input\n autoComplete=\"off\"\n className=\"ogx-column-visibility-panel__search-input\"\n placeholder=\"Search\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n />\n </div>\n </div>\n\n <div className=\"ogx-column-visibility-panel__list\">\n {filteredColumns.map(col => {\n const isVisible = visibleColumns.has(col.field);\n const isHideable = col.hideable !== false;\n const isDragOver = dragOverField === col.field;\n const canReorder = !!onColumnReorder && !searchQuery;\n\n return (\n <div\n key={col.field}\n className={[\n 'ogx-column-visibility-panel__item',\n !isHideable && 'ogx-column-visibility-panel__item--disabled',\n isDragOver && 'ogx-column-visibility-panel__item--drag-over',\n ].filter(Boolean).join(' ')}\n draggable={canReorder}\n onDragOver={canReorder ? handleDragOver(col.field) : undefined}\n onDragLeave={canReorder ? handleDragLeave : undefined}\n onDrop={canReorder ? handleDrop(col.field) : undefined}\n onDragEnd={canReorder ? handleDragEnd : undefined}\n >\n {canReorder && (\n <span\n className=\"ogx-column-visibility-panel__drag-handle-wrapper\"\n draggable\n onDragStart={handleDragStart(col.field)}\n title=\"Drag to reorder\"\n >\n <DragHandleIcon />\n </span>\n )}\n <label\n className=\"ogx-column-visibility-panel__item-label\"\n style={{ display: 'flex', alignItems: 'center', gap: 'var(--ogx-spacing-md)', flex: 1, cursor: isHideable ? 'pointer' : 'not-allowed' }}\n >\n <Checkbox\n checked={isVisible}\n onChange={(e) => onVisibilityChange(col.field, e.target.checked)}\n disabled={!isHideable}\n />\n <span className=\"ogx-column-visibility-panel__label\">\n {col.headerName || col.field}\n </span>\n </label>\n </div>\n );\n })}\n </div>\n\n <div className=\"ogx-column-visibility-panel__footer\">\n <label className=\"ogx-column-visibility-panel__item\">\n <Checkbox\n checked={allVisible}\n onChange={handleToggleAll}\n />\n <span className=\"ogx-column-visibility-panel__label\">\n Show/Hide All\n </span>\n </label>\n <button\n className=\"ogx-column-visibility-panel__reset-btn\"\n onClick={() => { onShowAll(); onColumnOrderReset?.(); }}\n >\n Reset\n </button>\n </div>\n </div>\n );\n}\n","import React, { useState, useLayoutEffect } from 'react';\nimport ReactDOM from 'react-dom';\nimport { ColumnVisibilityPanel } from '../ColumnVisibilityPanel/ColumnVisibilityPanel';\nimport type { GridColDef, GridRowModel, GridColumnOrderChangeParams } from '../../types';\n\nexport interface GridStandaloneColumnPanelProps<R extends GridRowModel> {\n isOpen: boolean;\n containerRef: React.RefObject<HTMLDivElement | null>;\n panelRef?: React.RefObject<HTMLDivElement | null>;\n effectiveColumns: GridColDef<R>[];\n columnVisibilityModel: Record<string, boolean>;\n effectiveColumnOrder: string[];\n columnOrder?: string[];\n disableColumnReorder: boolean;\n onClose: () => void;\n onColumnVisibilityChange: (model: Record<string, boolean>) => void;\n onColumnOrderChange?: (params: GridColumnOrderChangeParams) => void;\n setInternalColumnOrder: React.Dispatch<React.SetStateAction<string[]>>;\n}\n\nexport function GridStandaloneColumnPanel<R extends GridRowModel>({\n isOpen,\n containerRef,\n panelRef,\n effectiveColumns,\n columnVisibilityModel,\n effectiveColumnOrder,\n columnOrder,\n disableColumnReorder,\n onClose,\n onColumnVisibilityChange,\n onColumnOrderChange,\n setInternalColumnOrder,\n}: GridStandaloneColumnPanelProps<R>) {\n const [panelTop, setPanelTop] = useState<number>(16);\n const [panelRight, setPanelRight] = useState<number>(16);\n const [portalTarget, setPortalTarget] = useState<Element>(() => document.body);\n\n useLayoutEffect(() => {\n if (!isOpen || !containerRef.current) return;\n const rect = containerRef.current.getBoundingClientRect();\n setPanelTop(rect.top + 8);\n setPanelRight(window.innerWidth - rect.right + 8);\n setPortalTarget(containerRef.current.closest('.ogx-theme-provider') || document.body);\n }, [isOpen, containerRef]);\n\n if (!isOpen) return null;\n\n const handleReorder = disableColumnReorder\n ? undefined\n : (fromField: string, toField: string) => {\n const currentOrder = [...effectiveColumnOrder];\n const fromIdx = currentOrder.indexOf(fromField);\n const toIdx = currentOrder.indexOf(toField);\n if (fromIdx === -1 || toIdx === -1) return;\n const newOrder = [...currentOrder];\n newOrder.splice(fromIdx, 1);\n newOrder.splice(toIdx, 0, fromField);\n if (!columnOrder) setInternalColumnOrder(newOrder);\n onColumnOrderChange?.({\n oldIndex: fromIdx,\n targetIndex: toIdx,\n column: effectiveColumns.find(c => c.field === fromField) as unknown as GridColDef,\n });\n };\n\n return ReactDOM.createPortal(\n <div\n ref={panelRef}\n style={{\n position: 'fixed',\n top: panelTop,\n right: panelRight,\n zIndex: 9999,\n display: 'inline-block',\n }}\n >\n <button\n onClick={onClose}\n style={{\n position: 'absolute',\n top: -12,\n right: -12,\n width: 24,\n height: 24,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: '#334155',\n color: '#fff',\n border: 'none',\n borderRadius: '50%',\n cursor: 'pointer',\n fontSize: 14,\n lineHeight: 1,\n zIndex: 1,\n boxShadow: '0 1px 4px rgba(0,0,0,0.2)',\n }}\n aria-label=\"Close\"\n >×</button>\n <ColumnVisibilityPanel<R>\n columns={effectiveColumns}\n visibleColumns={new Set(\n effectiveColumns\n .filter(col => columnVisibilityModel[col.field] !== false)\n .map(col => col.field)\n )}\n onVisibilityChange={(field, isVisible) => {\n onColumnVisibilityChange({ ...columnVisibilityModel, [field]: isVisible });\n }}\n onShowAll={() => {\n const next = { ...columnVisibilityModel };\n effectiveColumns.forEach(col => { if (col.hideable !== false) next[col.field] = true; });\n onColumnVisibilityChange(next);\n }}\n onHideAll={() => {\n const next = { ...columnVisibilityModel };\n effectiveColumns.forEach(col => { if (col.hideable !== false) next[col.field] = false; });\n onColumnVisibilityChange(next);\n }}\n onColumnReorder={handleReorder}\n />\n </div>,\n portalTarget\n );\n}\n","import React, { useRef, useEffect, useCallback, useMemo, useState } from 'react';\nimport { useLayout } from '../../hooks/core/useLayout';\nimport { useGridKeyboardNavigation } from '../../hooks/core/useGridKeyboardNavigation';\nimport { useGridControlledState } from '../../hooks/core/useGridControlledState';\nimport { useGridRowPipeline } from '../../hooks/core/useGridRowPipeline';\nimport { useGridVirtualization } from '../../hooks/core/useGridVirtualization';\nimport { useGridColumns } from '../../hooks/core/useGridColumns';\nimport { useGridVisibleRows } from '../../hooks/core/useGridVisibleRows';\nimport { useGridScrollSync } from '../../hooks/core/useGridScrollSync';\nimport { useGridStateSnapshot } from '../../hooks/core/useGridStateSnapshot';\nimport { GridAggregationFooter } from './GridAggregationFooter';\nimport { GridEmptyState } from './GridEmptyState';\nimport { GridErrorOverlay } from './GridErrorOverlay';\nimport { Header } from '../Header/Header';\nimport { Pagination } from '../Pagination/Pagination';\nimport { useDataGrid } from '../../hooks/core/useDataGrid';\nimport { useRowReorder } from '../../hooks/useRowReorder';\nimport { useTreeData } from '../../hooks/useTreeData';\nimport { useRowGrouping } from '../../hooks/useRowGrouping';\nimport { useGridEditing } from '../../hooks/features/useGridEditing';\nimport { useGridSpanning } from '../../hooks/features/useGridSpanning';\nimport { useGridDataSource } from '../../hooks/features/useGridDataSource';\nimport { useAggregation } from '../../hooks/features/useAggregation';\nimport { usePivot } from '../../hooks/features/usePivot';\nimport { useGridClipboard } from '../../hooks/features/useGridClipboard';\nimport { GridListView } from './GridListView';\nimport { GridPinnedRows } from './GridPinnedRows';\nimport { GridVirtualRows } from './GridVirtualRows';\nimport { GridStandaloneColumnPanel } from './GridStandaloneColumnPanel';\nimport type { DataGridProps, GridRowModel, GridRowId, GridSortDirection, GridColDef, GridRowParams, GridCellParams, GridDataSource, GridAggregationResult, GridFilterModel, GridTreeNode, GridSortItem, GridRowMeta, GridGroupedExportRow } from '../../types';\n\nconst EMPTY_ROW_META_MAP: Map<GridRowId, GridRowMeta> = new Map();\n\nexport function DataGrid<R extends GridRowModel = GridRowModel>(props: DataGridProps<R>) {\n const {\n rows,\n columns,\n getRowId,\n rowHeight = 52,\n headerHeight = 56,\n autoHeight = false,\n density,\n checkboxSelection = false,\n disableRowSelectionOnClick = false,\n disableMultipleRowSelection = false,\n rowSelectionModel: propRowSelectionModel,\n onRowSelectionModelChange: propOnRowSelectionModelChange,\n onRowClick,\n onCellClick,\n\n filterModel: propFilterModel,\n onFilterModelChange,\n sortModel: propSortModel,\n onSortModelChange,\n pagination: propPagination = false,\n paginationModel,\n onPaginationModelChange,\n pageSizeOptions = [10, 25, 50, 100],\n pinnedColumns: propPinnedColumns,\n onPinnedColumnsChange,\n pinnedRows,\n\n getDetailPanelContent,\n getDetailPanelHeight,\n detailPanelExpandedRowIds: controlledExpandedRowIds,\n onDetailPanelExpandedRowIdsChange,\n pinCheckboxColumn = true,\n pinExpandColumn = true,\n disableColumnReorder = false,\n columnOrder,\n onColumnOrderChange,\n height,\n rowReordering = false,\n onRowOrderChange,\n loading = false,\n\n treeData = false,\n getTreeDataPath,\n defaultGroupingExpansionDepth,\n groupingColDef,\n\n rowGroupingModel: propRowGroupingModel,\n\n aggregationModel: propAggregationModel,\n onAggregationModelChange,\n getAggregationPosition,\n\n isCellEditable,\n processRowUpdate,\n onProcessRowUpdateError,\n\n dataSource,\n multiSort = false,\n sortingMode = 'client',\n filterMode = 'client',\n paginationMode = 'client',\n rowCount: propRowCount,\n\n slots,\n slotProps,\n\n pivotMode = false,\n pivotModel: propPivotModel,\n onPivotModelChange,\n\n className = '',\n style,\n onRowsScrollEnd,\n ariaLabel,\n initialState,\n onStateChange,\n // Column Visibility\n columnVisibilityModel: propColumnVisibilityModel,\n onColumnVisibilityModelChange,\n listView = false,\n listViewColumn,\n columnGroupingModel,\n noRowsLabel = 'No Data',\n localeText,\n apiRef: propApiRef,\n } = props;\n\n const effectiveNoRowsLabel = localeText?.noRowsLabel ?? noRowsLabel;\n\n // Stable defaults\n const defaultFilterModel: GridFilterModel = useMemo(() => ({ items: [] }), []);\n const filterModel = (propFilterModel || defaultFilterModel) as GridFilterModel;\n\n const defaultRowGroupingModel = useMemo(() => [], []);\n const rowGroupingModel = propRowGroupingModel || defaultRowGroupingModel;\n\n // ─── Stabilize toolbar component identity ────────────────────────────────\n // Problem: demos/users often define their toolbar as an inline function\n // INSIDE their component body, e.g.:\n // const MyToolbar = (props) => <GridToolbar {...props} /> // inside render!\n // This creates a NEW function reference on every parent re-render. React\n // reconciles by component *identity*, so a new reference = unmount old\n // toolbar + mount fresh one = all toolbar state (search expansion, filter\n // open, typed text) is destroyed on every keystroke.\n //\n // Fix: a stable wrapper component created ONCE via useRef. Its identity\n // never changes, so React keeps it mounted. It reads the latest toolbar\n // from a separate ref that is updated on every render, so the rendered\n // output is always current — zero stale closures.\n const latestToolbarRef = useRef(slots?.toolbar);\n latestToolbarRef.current = slots?.toolbar;\n // The wrapper itself has a stable identity (created once via useRef).\n // We call latestToolbarRef.current(props) as a PLAIN FUNCTION — not via\n // React.createElement — so React never sees a changing component type.\n // The elements the toolbar function returns are reconciled normally, so\n // GridToolbar's internal state (filterOpen, search expansion) is preserved\n // even when the toolbar is defined as an inline function inside the parent.\n const StableToolbar = useRef((props: Record<string, unknown>) => {\n const Toolbar = latestToolbarRef.current;\n return Toolbar ? (Toolbar as (p: typeof props) => React.ReactElement | null)(props) : null;\n }).current;\n\n const controlledState = useGridControlledState({\n initialState,\n sortModel: propSortModel,\n onSortModelChange,\n aggregationModel: propAggregationModel,\n onAggregationModelChange,\n columnVisibilityModel: propColumnVisibilityModel,\n onColumnVisibilityModelChange,\n pinnedColumns: propPinnedColumns,\n onPinnedColumnsChange,\n pivotModel: propPivotModel,\n onPivotModelChange,\n paginationModel,\n onPaginationModelChange,\n rowSelectionModel: propRowSelectionModel,\n onRowSelectionModelChange: propOnRowSelectionModelChange,\n });\n\n const {\n sortModel,\n isSortControlled,\n setInternalSortModel,\n aggregationModel,\n handleAggregationModelChange,\n columnVisibilityModel,\n handleColumnVisibilityModelChange,\n pinnedColumns,\n handlePinnedColumnsChange,\n currentPivotModel,\n handlePivotModelChange,\n effectivePaginationModel,\n handlePaginationModelChange,\n selectedRowIds,\n isSelectionControlled,\n setInternalRowSelectionModel,\n } = controlledState;\n\n const onRowSelectionModelChange = propOnRowSelectionModelChange;\n\n const pivot = usePivot(rows as GridRowModel[], columns as unknown as GridColDef[], currentPivotModel, pivotMode);\n\n const effectiveRowHeight = density === 'compact' ? 32 : density === 'comfortable' ? 72 : rowHeight;\n\n const activeRows = (pivotMode && pivot.isValid ? pivot.pivotRows : rows) as unknown as R[];\n const baseColumns = (pivotMode && pivot.isValid ? pivot.pivotColumns : columns) as unknown as GridColDef<R>[];\n\n // When groupingColDef is provided and row grouping is active, prepend a\n // dedicated synthetic __group__ column at position 0 (pinned-left).\n const isRowGroupingActive = Boolean(propRowGroupingModel && propRowGroupingModel.length > 0);\n\n // Auto-pin __group__ column to the left when groupingColDef is active.\n const effectivePinnedColumns = (groupingColDef && isRowGroupingActive && !pivotMode)\n ? { ...pinnedColumns, left: ['__group__', ...((pinnedColumns?.left ?? []).filter(f => f !== '__group__'))] }\n : pinnedColumns;\n\n const activeColumns = (groupingColDef && isRowGroupingActive && !pivotMode)\n ? [\n {\n headerName: 'Group',\n width: 220,\n ...groupingColDef,\n field: '__group__',\n hideable: false,\n sortable: false,\n pinnable: false,\n exportable: false,\n } as unknown as GridColDef<R>,\n ...baseColumns,\n ]\n : baseColumns;\n\n const [serverAggregationResults, setServerAggregationResults] = useState<GridAggregationResult | null>(null);\n\n useEffect(() => {\n setServerAggregationResults(null);\n }, [aggregationModel]);\n\n const viewportRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const gridRef = useRef<HTMLDivElement>(null);\n\n const defaultGetRowId = useCallback((row: R) => row.id, []);\n const effectiveGetRowId = getRowId || defaultGetRowId;\n\n // Normalize rows so every row has `id === getRowId(row)`.\n // createInitialState and SET_ROWS both key the internal store by row.id,\n // so rows without a native id field collide on undefined without this.\n // When getRowId is the default (row) => row.id this is a no-op per row.\n const normalizedRows = useMemo(\n () => activeRows.map(row => {\n const id = effectiveGetRowId(row);\n return id === row.id ? row : ({ ...row, id } as R);\n }),\n [activeRows, effectiveGetRowId]\n );\n\n // Keyboard-mode flag: toggled via DOM classname — no React state needed\n // so the ring appears instantly without a re-render cycle.\n const setKeyboardMode = useCallback((on: boolean) => {\n containerRef.current?.classList.toggle('ogx--kb', on);\n }, []);\n\n const dataSourceRef = useRef<GridDataSource<R> | undefined>(dataSource);\n dataSourceRef.current = dataSource;\n\n const fetchChildrenRef = useRef<((parentId: GridRowId, groupKeys: string[]) => Promise<void>) | null>(null);\n const treeDataRef = useRef<ReturnType<typeof useTreeData> | null>(null);\n\n const handleNodeExpansion = useCallback((node: GridTreeNode) => {\n if (dataSourceRef.current && treeData) {\n\n if ((node.serverChildrenCount ?? 0) > 0 && (node.children ?? []).length === 0) {\n\n const groupKeys = treeDataRef.current?.getNodePath(node.id) || [node.groupingKey];\n fetchChildrenRef.current?.(node.id, groupKeys);\n }\n }\n }, [treeData]);\n\n const gridData = useDataGrid({\n rows: normalizedRows,\n columns: activeColumns,\n rowHeight: effectiveRowHeight,\n headerHeight,\n rowCount: propRowCount,\n columnVisibilityModel,\n initialState: props.initialState\n });\n const {\n state,\n apiRef,\n setRows,\n setColumns,\n setDimensions,\n setDataSourceLoading,\n setDataSourceError,\n setRowCount\n } = gridData;\n\n const { scrollTop, scrollLeft, handleScroll } = useGridScrollSync({ onRowsScrollEnd });\n\n useEffect(() => {\n if (propApiRef) {\n propApiRef.current = apiRef.current;\n }\n }, [propApiRef, apiRef]);\n\n const { copySelectedRows } = useGridClipboard({\n selectedRowIds,\n columns: activeColumns as unknown as GridColDef[],\n getVisibleRows: () => apiRef.current.getVisibleRows(),\n getRowId: effectiveGetRowId as unknown as (row: GridRowModel) => GridRowId,\n });\n\n // Expose on apiRef for programmatic use\n useEffect(() => {\n apiRef.current.copySelectedRows = copySelectedRows;\n apiRef.current.getSelectedRows = () => Array.from(selectedRowIds);\n }, [copySelectedRows, selectedRowIds, apiRef]);\n\n const isInternalLoading = state.dataSource.loading;\n const effectiveLoading = loading || isInternalLoading;\n\n const effectiveRows = useMemo(() => {\n return state.rows.allRows.map(id => state.rows.idRowsLookup.get(id)!) as R[];\n }, [state.rows]);\n\n const treeDataHandlers = useTreeData({\n rows: effectiveRows,\n getRowId: effectiveGetRowId,\n getTreeDataPath,\n treeData,\n defaultGroupingExpansionDepth,\n filterModel,\n\n sortModel,\n onRowExpansionChange: handleNodeExpansion\n });\n\n useEffect(() => {\n treeDataRef.current = treeDataHandlers;\n }, [treeDataHandlers]);\n\n const rowGroupingHandlers = useRowGrouping({\n rows: effectiveRows,\n getRowId: effectiveGetRowId,\n columns: activeColumns,\n rowGroupingModel,\n aggregationModel,\n defaultGroupingExpansionDepth,\n filterModel,\n sortModel,\n getAggregationPosition\n });\n\n const editingHandlers = useGridEditing({\n rows: effectiveRows,\n getRowId: effectiveGetRowId,\n processRowUpdate,\n onProcessRowUpdateError,\n onRowChange: (updatedRow) => {\n // Dispatch a proper state update so React re-renders with the new row value\n const { dispatch } = gridData;\n const currentRows = Array.from(gridData.state.rows.idRowsLookup.values());\n const nextRows = currentRows.map(r =>\n r.id === updatedRow.id ? updatedRow : r\n );\n dispatch({ type: 'SET_ROWS', payload: nextRows });\n },\n });\n\n const isTreeData = treeData;\n const isRowGrouping = !!(rowGroupingModel && rowGroupingModel.length > 0);\n const isHierarchyEnabled = isTreeData || isRowGrouping;\n const activeHierarchyHandlers = isTreeData ? treeDataHandlers : (isRowGrouping ? rowGroupingHandlers : null);\n\n const rowMetaMap = useMemo<Map<GridRowId, GridRowMeta>>(() => {\n if (isTreeData) return treeDataHandlers.rowMetaMap;\n if (isRowGrouping) return rowGroupingHandlers.rowMetaMap;\n return EMPTY_ROW_META_MAP;\n }, [isTreeData, treeDataHandlers.rowMetaMap, isRowGrouping, rowGroupingHandlers.rowMetaMap]);\n\n const pagination = propPagination && !isRowGrouping;\n\n const handleRowClick = useCallback((params: GridRowParams<R>) => {\n const { row, id } = params;\n\n if (isHierarchyEnabled && rowMetaMap.get(row.id)?.hasChildren) {\n activeHierarchyHandlers?.toggleExpansion(id);\n return;\n }\n\n onRowClick?.(params);\n\n if (!disableRowSelectionOnClick) {\n let next: GridRowId[];\n if (disableMultipleRowSelection) {\n const alreadySelected = selectedRowIds.has(id as GridRowId);\n next = alreadySelected ? [] : [id as GridRowId];\n } else {\n const newSelection = new Set(selectedRowIds);\n if (newSelection.has(id as GridRowId)) {\n newSelection.delete(id as GridRowId);\n } else {\n newSelection.add(id as GridRowId);\n }\n next = Array.from(newSelection);\n }\n if (!isSelectionControlled) {\n setInternalRowSelectionModel(next);\n }\n onRowSelectionModelChange?.(next);\n }\n }, [isHierarchyEnabled, activeHierarchyHandlers, onRowClick, rowMetaMap, disableRowSelectionOnClick, disableMultipleRowSelection, selectedRowIds, isSelectionControlled, setInternalRowSelectionModel, onRowSelectionModelChange]);\n\n const dataSourceHandlers = useGridDataSource({\n dataSource,\n sortModel,\n filterModel,\n paginationModel: effectivePaginationModel,\n paginationMode,\n sortingMode,\n filterMode,\n aggregationModel,\n setRows,\n setRowCount,\n setDataSourceLoading,\n setDataSourceError,\n onAggregationResults: setServerAggregationResults,\n });\n\n useEffect(() => {\n if (dataSourceHandlers.fetchChildren) {\n fetchChildrenRef.current = dataSourceHandlers.fetchChildren;\n }\n }, [dataSourceHandlers.fetchChildren]);\n\n useEffect(() => {\n if (!dataSource) {\n setRows(normalizedRows);\n }\n }, [normalizedRows, setRows, dataSource]);\n\n // ── Detail panel (hoisted — hasDetailPanel feeds into useGridColumns) ──────\n const hasDetailPanel = Boolean(getDetailPanelContent);\n const [internalExpandedRowIds, setInternalExpandedRowIds] = useState<Set<GridRowId>>(new Set());\n const expandedRowIds = controlledExpandedRowIds ?? internalExpandedRowIds;\n\n const handleDetailPanelToggle = useCallback((rowId: GridRowId) => {\n const newExpandedRowIds = new Set(expandedRowIds);\n if (newExpandedRowIds.has(rowId)) {\n newExpandedRowIds.delete(rowId);\n } else {\n newExpandedRowIds.add(rowId);\n }\n if (controlledExpandedRowIds === undefined) {\n setInternalExpandedRowIds(newExpandedRowIds);\n }\n onDetailPanelExpandedRowIdsChange?.(newExpandedRowIds);\n }, [expandedRowIds, controlledExpandedRowIds, onDetailPanelExpandedRowIdsChange]);\n\n // ── Column management ─────────────────────────────────────────────────────\n const {\n effectiveColumns,\n orderedColumns,\n visibleOrderedColumns,\n navigationColumns,\n columnWidths,\n effectiveColumnOrder,\n setInternalColumnOrder,\n columnReorderHandlers,\n handleColumnResize,\n } = useGridColumns<R>({\n activeColumns,\n isHierarchyEnabled,\n isRowGrouping,\n isTreeData,\n activeHierarchyHandlers,\n columnVisibilityModel,\n columnOrder,\n onColumnOrderChange,\n disableColumnReorder,\n pivotMode,\n checkboxSelection,\n hasDetailPanel,\n rowReordering,\n initialState,\n setColumns,\n });\n\n useGridStateSnapshot({\n onStateChange,\n sortModel,\n filterModel,\n effectivePaginationModel,\n columnWidths,\n effectiveColumnOrder,\n columnVisibilityModel,\n pinnedColumns: effectivePinnedColumns,\n });\n\n const rowPipeline = useGridRowPipeline<GridRowModel>({\n effectiveRows: effectiveRows as GridRowModel[],\n activeHierarchyHandlers: activeHierarchyHandlers as { getVisibleRows: () => GridRowModel[] } | null,\n filterMode,\n filterModel,\n dataSource: dataSource as GridDataSource<GridRowModel> | undefined,\n sortModel,\n sortingMode,\n pagination,\n paginationMode,\n effectivePaginationModel,\n pinnedRows,\n isLoading: state.dataSource.loading,\n pageSize: effectivePaginationModel.pageSize,\n });\n const filteredRows = rowPipeline.filteredRows as R[];\n const pinnedTopRows = rowPipeline.pinnedTopRows as R[];\n const pinnedBottomRows = rowPipeline.pinnedBottomRows as R[];\n const sortedUnpinnedRows = rowPipeline.sortedUnpinnedRows as R[];\n const paginatedUnpinnedRows = rowPipeline.paginatedUnpinnedRows as R[];\n const allRenderableRows = rowPipeline.allRenderableRows as R[];\n\n useEffect(() => {\n gridData.apiRef.current.getVisibleRows = () => pagination ? paginatedUnpinnedRows : sortedUnpinnedRows;\n gridData.apiRef.current.getAllFilteredRows = () => sortedUnpinnedRows;\n gridData.apiRef.current.getVisibleColumns = () => effectiveColumns as unknown as GridColDef[];\n }, [sortedUnpinnedRows, paginatedUnpinnedRows, pagination, effectiveColumns, gridData.apiRef]);\n\n const rowReorderHandlers = useRowReorder({\n rows: pagination ? paginatedUnpinnedRows : sortedUnpinnedRows,\n getRowId: (row) => row.id,\n onRowOrderChange,\n rowReordering\n });\n\n const spanning = useGridSpanning(\n allRenderableRows,\n navigationColumns,\n columnWidths\n );\n\n const { aggregationResult } = useAggregation({\n rows: filteredRows,\n columns: activeColumns as unknown as GridColDef[],\n aggregationModel,\n isServerSide: !!(dataSource && (paginationMode === 'server' || sortingMode === 'server')),\n dataSource,\n filterModel,\n sortModel,\n serverAggregationResults,\n });\n\n const hasAggregation = Object.keys(aggregationModel).length > 0;\n\n useEffect(() => {\n gridData.apiRef.current.getAggregationResult = () => hasAggregation ? aggregationResult : null;\n gridData.apiRef.current.getAggregationModel = () => hasAggregation ? aggregationModel : null;\n gridData.apiRef.current.getGroupedExportRows = (): GridGroupedExportRow[] | null => {\n if (!isRowGrouping) return null;\n const { treeNodes, groupingRows } = rowGroupingHandlers;\n const rowLookup = new Map<GridRowId, GridRowModel>();\n sortedUnpinnedRows.forEach(r => rowLookup.set((r as GridRowModel).id as GridRowId, r as GridRowModel));\n\n const result: GridGroupedExportRow[] = [];\n\n const traverse = (ids: GridRowId[]) => {\n ids.forEach(id => {\n const node = treeNodes.get(id);\n if (!node) return;\n const isGroup = Boolean(node.children && node.children.length > 0);\n if (isGroup) {\n result.push({\n type: 'group-header',\n depth: node.depth,\n groupField: node.groupingField,\n groupValue: node.groupingValue,\n });\n traverse(node.children!);\n if (hasAggregation && node.aggregatedValues) {\n result.push({\n type: 'group-subtotal',\n depth: node.depth,\n groupField: node.groupingField,\n groupValue: node.groupingValue,\n aggregatedValues: node.aggregatedValues,\n });\n }\n } else {\n const row = rowLookup.get(id) ?? groupingRows.get(id);\n if (row) {\n result.push({ type: 'leaf', depth: node.depth, row });\n }\n }\n });\n };\n\n traverse(Array.from(treeNodes.keys()).filter(id => treeNodes.get(id)?.parentId === null));\n\n if (hasAggregation && aggregationResult) {\n result.push({ type: 'grand-total', depth: 0, aggregatedValues: aggregationResult });\n }\n return result;\n };\n }, [aggregationResult, aggregationModel, hasAggregation, gridData.apiRef, isRowGrouping, rowGroupingHandlers, sortedUnpinnedRows]);\n\n const layout = useLayout({\n rowHeight: effectiveRowHeight,\n pagination,\n paginatedUnpinnedRows,\n sortedUnpinnedRows,\n expandedRowIds,\n getDetailPanelHeight,\n pinnedTopRowsLength: pinnedTopRows.length,\n pinnedBottomRowsLength: pinnedBottomRows.length,\n visibleOrderedColumns,\n pinnedColumns: effectivePinnedColumns,\n columnWidths,\n viewportWidth: state.dimensions.viewportWidth || 1000,\n checkboxSelection,\n hasDetailPanel,\n rowReordering,\n pinCheckboxColumn,\n pinExpandColumn,\n autoHeight,\n paginationMode,\n isLoading: state.dataSource.loading,\n pageSize: effectivePaginationModel.pageSize,\n });\n\n // Merge layout-computed widths (which include flex resolution) with user-resize\n // overrides. The footer and other consumers that receive `columnWidths` only get\n // the resize-override map, which has no entry for flex columns that haven't been\n // manually resized — causing them to fall back to the raw `col.width` prop instead\n // of the actual rendered width.\n const resolvedColumnWidths = useMemo(() => {\n const result: Record<string, number> = {};\n for (const col of [...layout.leftPinnedCols, ...layout.unpinnedColsWithWidth, ...layout.rightPinnedCols]) {\n if (!col.isSpacer) result[col.field] = col.width;\n }\n return { ...result, ...columnWidths };\n }, [layout.leftPinnedCols, layout.unpinnedColsWithWidth, layout.rightPinnedCols, columnWidths]);\n\n useEffect(() => {\n gridData.apiRef.current.scrollToIndexes = ({ rowIndex, colIndex }) => {\n const el = viewportRef.current;\n if (!el) return;\n\n if (rowIndex !== undefined && rowIndex >= 0) {\n const rowTop = rowIndex > 0 ? layout.cumulativeHeights[rowIndex - 1] : 0;\n const rowBottom = layout.cumulativeHeights[rowIndex] ?? rowTop;\n const { scrollTop, clientHeight } = el;\n if (rowTop < scrollTop) {\n el.scrollTop = rowTop;\n } else if (rowBottom > scrollTop + clientHeight) {\n el.scrollTop = rowBottom - clientHeight;\n }\n }\n\n if (colIndex !== undefined && colIndex >= 0) {\n // colIndex is an index into all data columns: leftPinned + unpinned + rightPinned\n const allDataCols = [...layout.leftPinnedCols, ...layout.unpinnedColsWithWidth, ...layout.rightPinnedCols];\n const targetCol = allDataCols[colIndex];\n if (!targetCol) return;\n const unpinnedIndex = layout.unpinnedColsWithWidth.findIndex(c => c.field === targetCol.field);\n if (unpinnedIndex === -1) return; // pinned column — always visible, no scroll needed\n const colLocalLeft = unpinnedIndex > 0 ? layout.unpinnedAccWidths[unpinnedIndex - 1] : 0;\n const colLocalRight = layout.unpinnedAccWidths[unpinnedIndex] ?? colLocalLeft;\n const colRight = layout.leftWidth + colLocalRight;\n const { scrollLeft, clientWidth } = el;\n if (colLocalLeft < scrollLeft) {\n el.scrollLeft = colLocalLeft;\n } else if (colRight > scrollLeft + clientWidth) {\n el.scrollLeft = colRight - clientWidth;\n }\n }\n };\n }, [layout, viewportRef, gridData.apiRef]);\n\n const virtualization = useGridVirtualization({\n layout,\n scrollTop,\n scrollLeft,\n viewportWidth: state.dimensions.viewportWidth,\n viewportHeight: state.dimensions.viewportHeight,\n autoHeight,\n rowReordering,\n hasDetailPanel,\n checkboxSelection,\n pinCheckboxColumn,\n pinExpandColumn,\n });\n\n\n useEffect(() => {\n if (!viewportRef.current) return;\n\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect;\n setDimensions(width, height);\n }\n });\n\n resizeObserver.observe(viewportRef.current);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [setDimensions]);\n\n const handleSelectionChange = useCallback((rowId: GridRowId, isSelected: boolean) => {\n const newSelection = new Set(selectedRowIds);\n if (isSelected) {\n newSelection.add(rowId);\n } else {\n newSelection.delete(rowId);\n }\n const newSelectionArray = Array.from(newSelection);\n\n if (!isSelectionControlled) {\n setInternalRowSelectionModel(newSelectionArray);\n }\n onRowSelectionModelChange?.(newSelectionArray);\n }, [selectedRowIds, isSelectionControlled, onRowSelectionModelChange, setInternalRowSelectionModel]);\n\n const handleSelectAll = useCallback((isSelected: boolean) => {\n let newSelection: GridRowId[] = [];\n if (isSelected) {\n newSelection = effectiveRows.map((row: GridRowModel) => row.id);\n }\n\n if (!isSelectionControlled) {\n setInternalRowSelectionModel(newSelection);\n }\n onRowSelectionModelChange?.(newSelection);\n }, [effectiveRows, isSelectionControlled, onRowSelectionModelChange, setInternalRowSelectionModel]);\n\n const handleSort = useCallback((field: string, direction: GridSortDirection) => {\n const newSortModel = direction ? [{ field, sort: direction }] : [];\n\n if (!isSortControlled) {\n setInternalSortModel(newSortModel as GridSortItem[]);\n }\n onSortModelChange?.(newSortModel as GridSortItem[]);\n }, [isSortControlled, onSortModelChange, setInternalSortModel]);\n\n const handleSortAdd = useCallback((field: string, direction: GridSortDirection) => {\n const existing = sortModel.filter(item => item.field !== field);\n const newSortModel: GridSortItem[] = direction\n ? [...existing, { field, sort: direction }]\n : existing;\n\n if (!isSortControlled) {\n setInternalSortModel(newSortModel);\n }\n onSortModelChange?.(newSortModel);\n }, [sortModel, isSortControlled, onSortModelChange, setInternalSortModel]);\n\n const { focusedCell, setFocusedCell, handleFocus, handleBlur, handleKeyDown } = useGridKeyboardNavigation({\n allRenderableRows,\n navigationColumns,\n checkboxSelection,\n selectedRowIds,\n handleSelectionChange,\n handleDetailPanelToggle,\n editingHandlers,\n setKeyboardMode,\n sortModel,\n handleSort,\n isCellEditable,\n pagination,\n pageSize: effectivePaginationModel.pageSize,\n virtualization,\n viewportRef,\n });\n\n const handleCellClick = useCallback((params: GridCellParams<R>) => {\n setKeyboardMode(false);\n setFocusedCell({ id: params.row.id, field: params.field });\n\n gridRef.current?.focus({ preventScroll: true });\n onCellClick?.(params);\n }, [onCellClick, setKeyboardMode, setFocusedCell]);\n\n const prevEditingCellRef = useRef(editingHandlers.editingCell);\n useEffect(() => {\n const wasEditing = Boolean(prevEditingCellRef.current);\n const isEditing = Boolean(editingHandlers.editingCell);\n\n if (wasEditing && !isEditing) {\n\n gridRef.current?.focus({ preventScroll: true });\n }\n\n prevEditingCellRef.current = editingHandlers.editingCell;\n }, [editingHandlers.editingCell]);\n\n const visibleRows = useGridVisibleRows<R>({\n renderContext: virtualization.renderContext,\n pinnedTopRows,\n pinnedBottomRows,\n paginatedUnpinnedRows,\n sortedUnpinnedRows,\n pagination,\n });\n\n\n const allSelected = rows.length > 0 && selectedRowIds.size === rows.length;\n const someSelected = selectedRowIds.size > 0 && selectedRowIds.size < rows.length;\n\n const hasRowSpanning = React.useMemo(() => effectiveColumns.some(c => !!c.rowSpan), [effectiveColumns]);\n const [columnsPanelOpen, setColumnsPanelOpen] = React.useState(false);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const standalonePanelRef = React.useRef<HTMLDivElement>(null);\n\n const toolbarProps = React.useMemo(() => {\n if (!slots?.toolbar) return null;\n const reorderHandler = disableColumnReorder\n ? undefined\n : (fromField: string, toField: string) => {\n const currentOrder = [...effectiveColumnOrder];\n const fromIdx = currentOrder.indexOf(fromField);\n const toIdx = currentOrder.indexOf(toField);\n if (fromIdx === -1 || toIdx === -1) return;\n const newOrder = [...currentOrder];\n newOrder.splice(fromIdx, 1);\n newOrder.splice(toIdx, 0, fromField);\n if (!columnOrder) setInternalColumnOrder(newOrder);\n const col = effectiveColumns.find(c => c.field === fromField);\n if (col) onColumnOrderChange?.({ oldIndex: fromIdx, targetIndex: toIdx, column: col as unknown as GridColDef });\n };\n return {\n apiRef: gridData.apiRef,\n columns: orderedColumns as unknown as GridColDef[],\n baseColumns: columns as unknown as GridColDef[],\n aggregationModel,\n onAggregationModelChange: handleAggregationModelChange,\n ...(pivotMode || propPivotModel || onPivotModelChange ? {\n pivotModel: currentPivotModel,\n onPivotModelChange: handlePivotModelChange,\n } : {}),\n filterModel,\n onFilterModelChange,\n columnVisibilityModel,\n onColumnVisibilityModelChange: handleColumnVisibilityModelChange,\n onColumnReorder: reorderHandler,\n onColumnOrderReset: disableColumnReorder ? undefined : () => setInternalColumnOrder(columns.map(c => c.field)),\n forceColumnsOpen: columnsPanelOpen,\n onColumnsPanelClose: () => setColumnsPanelOpen(false),\n ...slotProps?.toolbar,\n };\n }, [\n slots?.toolbar, disableColumnReorder, effectiveColumnOrder, orderedColumns, effectiveColumns,\n columnOrder, onColumnOrderChange, setInternalColumnOrder, gridData.apiRef,\n columns, aggregationModel, handleAggregationModelChange, pivotMode,\n propPivotModel, onPivotModelChange, currentPivotModel, handlePivotModelChange,\n filterModel, onFilterModelChange, columnVisibilityModel,\n handleColumnVisibilityModelChange, columnsPanelOpen, slotProps?.toolbar,\n ]);\n\n // Click-outside handler for standalone column panel\n useEffect(() => {\n if (!columnsPanelOpen || slots?.toolbar) return;\n function handleClickOutside(e: MouseEvent) {\n if (standalonePanelRef.current && !standalonePanelRef.current.contains(e.target as Node)) {\n setColumnsPanelOpen(false);\n }\n }\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [columnsPanelOpen, slots?.toolbar]);\n\n return (\n <div\n ref={containerRef}\n className={['ogx', className, autoHeight && 'ogx--auto-height', hasRowSpanning && 'ogx--row-spanning', listView && 'ogx--list-view'].filter(Boolean).join(' ')}\n style={{\n ...style,\n height: height ?? style?.height,\n '--ogx-row-height': `${effectiveRowHeight}px`,\n '--ogx-header-height': `${headerHeight}px`\n } as unknown as React.CSSProperties}\n aria-busy={effectiveLoading}\n >\n {toolbarProps && <StableToolbar {...toolbarProps} />}\n\n {!slots?.toolbar && (\n <GridStandaloneColumnPanel<R>\n isOpen={columnsPanelOpen}\n containerRef={containerRef}\n panelRef={standalonePanelRef}\n effectiveColumns={effectiveColumns}\n columnVisibilityModel={columnVisibilityModel}\n effectiveColumnOrder={effectiveColumnOrder}\n columnOrder={columnOrder}\n disableColumnReorder={disableColumnReorder}\n onClose={() => setColumnsPanelOpen(false)}\n onColumnVisibilityChange={handleColumnVisibilityModelChange}\n onColumnOrderChange={onColumnOrderChange}\n setInternalColumnOrder={setInternalColumnOrder}\n />\n )}\n\n {listView && listViewColumn && (\n <GridListView<R>\n ariaLabel={ariaLabel}\n allRenderableRows={allRenderableRows}\n filteredRows={filteredRows}\n pagination={pagination}\n effectivePaginationModel={effectivePaginationModel}\n pageSizeOptions={pageSizeOptions}\n selectedRowIds={selectedRowIds}\n listViewColumn={listViewColumn}\n noRowsLabel={effectiveNoRowsLabel}\n rowHeight={effectiveRowHeight}\n checkboxSelection={checkboxSelection}\n paginationMode={paginationMode}\n dataSource={dataSource}\n serverRowCount={state.pagination.rowCount || 0}\n paginationSlot={slots?.pagination}\n paginationSlotProps={slotProps?.pagination}\n localeText={localeText ? {\n paginationRowsPerPage: localeText.paginationRowsPerPage,\n paginationOf: localeText.paginationOf,\n paginationPage: localeText.paginationPage,\n } : undefined}\n onRowClick={handleRowClick}\n onSelectionChange={handleSelectionChange}\n onPaginationModelChange={handlePaginationModelChange}\n />\n )}\n\n {/* ══════════════════════════════════════════════════════════════\n STANDARD GRID VIEWPORT (hidden when listView=true)\n ══════════════════════════════════════════════════════════════ */}\n {!listView && (\n <div\n ref={(el) => {\n viewportRef.current = el;\n gridRef.current = el;\n }}\n className=\"ogx__viewport\"\n onScroll={handleScroll}\n role=\"grid\"\n aria-label={ariaLabel || 'Data grid'}\n aria-rowcount={filteredRows.length + 1}\n aria-colcount={\n columns.length +\n (checkboxSelection ? 1 : 0) +\n (hasDetailPanel ? 1 : 0) +\n (rowReordering ? 1 : 0)\n }\n aria-busy={effectiveLoading}\n tabIndex={0}\n onKeyDownCapture={() => { setKeyboardMode(true); }}\n onMouseDownCapture={() => { setKeyboardMode(false); }}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n >\n <div\n ref={contentRef}\n className=\"ogx__content\"\n style={{\n width: virtualization.totalWidth\n }}\n role=\"presentation\"\n >\n { }\n <Header\n columns={virtualization.virtualColumns}\n allColumns={effectiveColumns}\n columnGroupingModel={columnGroupingModel}\n checkboxSelection={checkboxSelection}\n allSelected={allSelected}\n someSelected={someSelected}\n onSelectAll={handleSelectAll}\n sortModel={sortModel}\n onSort={handleSort}\n onSortAdd={handleSortAdd}\n multiSort={multiSort}\n\n onColumnResize={handleColumnResize}\n columnWidths={columnWidths}\n pinnedColumns={effectivePinnedColumns}\n\n focusedCell={focusedCell}\n onHeaderClick={(field) => {\n setFocusedCell({ id: 'HEADER', field });\n setKeyboardMode(false);\n gridRef.current?.focus({ preventScroll: true });\n }}\n onDragStart={columnGroupingModel ? undefined : columnReorderHandlers.onDragStart}\n onDragOver={columnGroupingModel ? undefined : columnReorderHandlers.onDragOver}\n onDragEnd={columnGroupingModel ? undefined : columnReorderHandlers.onDragEnd}\n onDrop={columnGroupingModel ? undefined : columnReorderHandlers.onDrop}\n draggedColumn={columnGroupingModel ? undefined : columnReorderHandlers.draggedColumn}\n dragOverColumn={columnGroupingModel ? undefined : columnReorderHandlers.dragOverColumn}\n rowReordering={rowReordering}\n hasDetailPanel={hasDetailPanel}\n pinCheckboxColumn={pinCheckboxColumn}\n pinExpandColumn={pinExpandColumn}\n aggregationModel={aggregationModel}\n onHideColumn={(field) => {\n handleColumnVisibilityModelChange({\n ...columnVisibilityModel,\n [field]: false,\n });\n }}\n onManageColumns={() => setColumnsPanelOpen(true)}\n onPinColumn={(field, side) => {\n const left = [...(pinnedColumns?.left ?? [])];\n const right = [...(pinnedColumns?.right ?? [])];\n\n const cleanLeft = left.filter(f => f !== field);\n const cleanRight = right.filter(f => f !== field);\n if (side === 'left') {\n handlePinnedColumnsChange({ left: [...cleanLeft, field], right: cleanRight });\n } else if (side === 'right') {\n handlePinnedColumnsChange({ left: cleanLeft, right: [...cleanRight, field] });\n } else {\n handlePinnedColumnsChange({ left: cleanLeft, right: cleanRight });\n }\n }}\n />\n\n {/* Empty State Overlay (Standard View) — showing after header */}\n {!effectiveLoading && !state.dataSource.error && filteredRows.length === 0 && (\n <GridEmptyState noRowsLabel={effectiveNoRowsLabel} width={virtualization.totalWidth} />\n )}\n\n <GridPinnedRows<R>\n rows={pinnedTopRows}\n position=\"top\"\n columns={virtualization.virtualColumns}\n selectedRowIds={selectedRowIds}\n checkboxSelection={checkboxSelection}\n onRowClick={handleRowClick}\n onCellClick={handleCellClick}\n onSelectionChange={handleSelectionChange}\n columnWidths={columnWidths}\n pinnedColumns={effectivePinnedColumns}\n pinnedRows={pinnedRows}\n hasDetailPanel={hasDetailPanel}\n expandedRowIds={expandedRowIds}\n getDetailPanelContent={getDetailPanelContent}\n getDetailPanelHeight={getDetailPanelHeight}\n onDetailPanelToggle={handleDetailPanelToggle}\n pinCheckboxColumn={pinCheckboxColumn}\n pinExpandColumn={pinExpandColumn}\n focusedCell={focusedCell}\n colspanMap={spanning.colspanMap}\n rowSpanningCaches={spanning.rowSpanningState.caches}\n rowHeight={effectiveRowHeight}\n rowMetaMap={rowMetaMap}\n />\n\n <GridVirtualRows<R>\n virtualContainerHeight={virtualization.totalHeight - virtualization.pinnedTopHeight - virtualization.pinnedBottomHeight}\n offsetTop={virtualization.offsetTop}\n effectiveLoading={effectiveLoading}\n visibleRows={visibleRows}\n baseColumns={columns as unknown as GridColDef<R>[]}\n virtualColumns={virtualization.virtualColumns}\n viewportWidth={state.dimensions.viewportWidth}\n checkboxSelection={checkboxSelection}\n hasDetailPanel={hasDetailPanel}\n rowReordering={rowReordering}\n rowHeight={effectiveRowHeight}\n pinnedRows={pinnedRows}\n selectedRowIds={selectedRowIds}\n onRowClick={handleRowClick}\n onCellClick={handleCellClick}\n onSelectionChange={handleSelectionChange}\n columnWidths={columnWidths}\n pinnedColumns={effectivePinnedColumns}\n expandedRowIds={expandedRowIds}\n getDetailPanelContent={getDetailPanelContent}\n getDetailPanelHeight={getDetailPanelHeight}\n onDetailPanelToggle={handleDetailPanelToggle}\n pinCheckboxColumn={pinCheckboxColumn}\n pinExpandColumn={pinExpandColumn}\n rowReorderHandlers={rowReorderHandlers}\n editingHandlers={editingHandlers}\n focusedCell={focusedCell}\n colspanMap={spanning.colspanMap}\n rowSpanningCaches={spanning.rowSpanningState.caches}\n paginationMode={paginationMode}\n dataSourceLoading={state.dataSource.loading}\n sortedUnpinnedRowCount={sortedUnpinnedRows.length}\n infiniteScrollSkeletonCount={Math.min(effectivePaginationModel.pageSize, 20)}\n unpinnedRowsLength={layout.unpinnedRowsLength}\n rowMetaMap={rowMetaMap}\n />\n\n <GridPinnedRows<R>\n rows={pinnedBottomRows}\n position=\"bottom\"\n columns={virtualization.virtualColumns}\n selectedRowIds={selectedRowIds}\n checkboxSelection={checkboxSelection}\n onRowClick={handleRowClick}\n onCellClick={handleCellClick}\n onSelectionChange={handleSelectionChange}\n columnWidths={columnWidths}\n pinnedColumns={effectivePinnedColumns}\n pinnedRows={pinnedRows}\n hasDetailPanel={hasDetailPanel}\n expandedRowIds={expandedRowIds}\n getDetailPanelContent={getDetailPanelContent}\n getDetailPanelHeight={getDetailPanelHeight}\n onDetailPanelToggle={handleDetailPanelToggle}\n pinCheckboxColumn={pinCheckboxColumn}\n pinExpandColumn={pinExpandColumn}\n focusedCell={focusedCell}\n colspanMap={spanning.colspanMap}\n rowSpanningCaches={spanning.rowSpanningState.caches}\n rowHeight={effectiveRowHeight}\n rowMetaMap={rowMetaMap}\n />\n\n {/* Aggregation Footer Row — suppressed in pivot mode because pivot rows\n already contain pre-aggregated values with synthetic field keys\n (e.g. 'Q1\\u001frevenue\\u001fsum') that don't match aggregationModel keys. */}\n {hasAggregation && !pivotMode && (\n <GridAggregationFooter\n columns={orderedColumns as unknown as GridColDef[]}\n aggregationModel={aggregationModel}\n aggregationResult={aggregationResult}\n columnWidths={resolvedColumnWidths}\n rowHeight={effectiveRowHeight}\n checkboxSelection={checkboxSelection}\n hasDetailPanel={hasDetailPanel}\n rowReordering={rowReordering}\n pinnedColumns={effectivePinnedColumns}\n />\n )}\n\n </div>\n </div>\n )}\n\n {!listView && pagination && (() => {\n const PaginationComponent = slots?.pagination || Pagination;\n return (\n <PaginationComponent\n page={effectivePaginationModel.page}\n pageSize={effectivePaginationModel.pageSize}\n rowCount={state.pagination.rowCount}\n pageSizeOptions={pageSizeOptions}\n onPageChange={(newPage: number) => handlePaginationModelChange({ ...effectivePaginationModel, page: newPage })}\n onPageSizeChange={(newPageSize: number) => handlePaginationModelChange({ ...effectivePaginationModel, pageSize: newPageSize, page: 0 })}\n localeText={localeText ? {\n paginationRowsPerPage: localeText.paginationRowsPerPage,\n paginationOf: localeText.paginationOf,\n paginationPage: localeText.paginationPage,\n } : undefined}\n {...slotProps?.pagination}\n />\n );\n })()}\n\n {/* Accessibility Live Region */}\n <div className=\"ogx-aria-live-status\" role=\"status\" aria-live=\"polite\">\n {effectiveLoading ? 'Loading data...' : ''}\n {state.dataSource.error ? `Error: ${state.dataSource.error instanceof Error ? state.dataSource.error.message : 'Unknown error'}` : ''}\n {!loading && !state.dataSource.error && (\n filteredRows.length === 0\n ? effectiveNoRowsLabel\n : (filterModel && ((filterModel.quickFilterValues?.length || 0) > 0 || (filterModel.items?.length || 0) > 0))\n ? `${filteredRows.length} ${filteredRows.length === 1 ? 'row' : 'rows'} found`\n : ''\n )}\n </div>\n\n <GridErrorOverlay error={state.dataSource.error} />\n </div>\n );\n}\n","\n\nexport interface SkeletonProps {\n rows?: number;\n columns?: number;\n}\n\nexport function Skeleton({ rows = 5, columns = 5 }: SkeletonProps) {\n return (\n <div className=\"ogx__skeleton\">\n {Array.from({ length: rows }).map((_, rowIndex) => (\n <div key={rowIndex} className=\"ogx__skeleton-row\">\n {Array.from({ length: columns }).map((_, colIndex) => (\n <div key={colIndex} className=\"ogx__skeleton-cell\">\n <div className=\"ogx__skeleton-content\" />\n </div>\n ))}\n </div>\n ))}\n </div>\n );\n}\n","import React, { useCallback, useEffect, useId, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport type {\n GridFilterModel,\n GridFilterItem,\n GridColDef,\n GridFilterOperator\n} from '../../types';\nimport { getOperatorsForType } from '../../utils/filtering';\n\n\ninterface FilterPanelProps {\n filterModel: GridFilterModel;\n columns: GridColDef[];\n onFilterModelChange: (model: GridFilterModel) => void;\n}\n\nconst NO_VALUE_OPERATORS = new Set(['isEmpty', 'isNotEmpty']);\n\nfunction getActiveFilter(items: GridFilterItem[], field: string): GridFilterItem | undefined {\n return items.find(item => 'field' in item && item.field === field) as GridFilterItem | undefined;\n}\n\nconst FilterRow: React.FC<{\n col: GridColDef;\n item: GridFilterItem | undefined;\n onChange: (item: GridFilterItem | null) => void;\n}> = ({ col, item, onChange }) => {\n const filterId = useId();\n const operators = getOperatorsForType(col.type);\n const isActive = !!item;\n const currentOperator = item?.operator ?? operators[0];\n\n // Local input state to prevent full filter-panel re-render on every keystroke\n const [localValue, setLocalValue] = useState<string>(item?.value != null ? String(item.value) : '');\n const onChangeRef = useRef(onChange);\n const itemRef = useRef(item);\n const colFieldRef = useRef(col.field);\n const operatorRef = useRef(currentOperator);\n useLayoutEffect(() => {\n onChangeRef.current = onChange;\n itemRef.current = item;\n colFieldRef.current = col.field;\n operatorRef.current = currentOperator;\n });\n\n // Sync when the external item changes (e.g. operator change, clear)\n const prevItemValue = useRef(item?.value);\n useEffect(() => {\n if (item?.value !== prevItemValue.current) {\n prevItemValue.current = item?.value;\n setLocalValue(item?.value != null ? String(item.value) : '');\n }\n }, [item?.value]);\n\n // Debounce propagating the value upward (300ms)\n useEffect(() => {\n const handler = setTimeout(() => {\n const currentItem = itemRef.current;\n const currentValue = currentItem?.value ?? '';\n if (localValue !== currentValue) {\n onChangeRef.current({\n id: currentItem?.id ?? `${colFieldRef.current}-${Date.now()}`,\n field: colFieldRef.current,\n operator: operatorRef.current as GridFilterOperator,\n value: localValue,\n });\n }\n }, 300);\n return () => clearTimeout(handler);\n }, [localValue]);\n\n const handleOperatorChange = (op: string) => {\n const noValue = NO_VALUE_OPERATORS.has(op);\n const newItem: GridFilterItem = {\n id: item?.id ?? `${col.field}-${Date.now()}`,\n field: col.field,\n operator: op as GridFilterOperator,\n value: noValue ? undefined : (item?.value ?? (col.type === 'boolean' ? 'true' : '')),\n };\n onChange(newItem);\n };\n\n const handleClear = () => {\n setLocalValue('');\n onChange(null);\n };\n\n const isNoValue = NO_VALUE_OPERATORS.has(String(currentOperator));\n const isBoolean = col.type === 'boolean';\n const showValue = !isNoValue;\n\n return (\n <div className={`ogx-filter__row${isActive ? ' ogx-filter__row--active' : ''}`}>\n { }\n <span className=\"ogx-filter__col-label\" title={col.field}>\n {col.headerName || col.field}\n </span>\n\n { }\n <div className=\"ogx-filter__controls\">\n { }\n <select\n id={`${filterId}-op`}\n name={`filter-op-${col.field}`}\n className={`ogx-filter__op-select${isActive ? ' ogx-filter__op-select--active' : ''}`}\n value={String(currentOperator)}\n onChange={(e) => handleOperatorChange(e.target.value)}\n aria-label={`Filter operator for ${col.headerName || col.field}`}\n >\n {operators.map(op => (\n <option key={op} value={op}>{op}</option>\n ))}\n </select>\n\n { }\n {showValue && isBoolean && (\n <select\n id={`${filterId}-val`}\n name={`filter-val-${col.field}`}\n className={`ogx-filter__value-input ogx-filter__value-select${isActive ? ' ogx-filter__value-input--active' : ''}`}\n value={String(item?.value ?? 'true')}\n onChange={(e) => {\n setLocalValue(e.target.value);\n onChange({\n id: item?.id ?? `${col.field}-${Date.now()}`,\n field: col.field,\n operator: currentOperator as GridFilterOperator,\n value: e.target.value,\n });\n }}\n aria-label={`Filter value for ${col.headerName || col.field}`}\n >\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n )}\n\n {showValue && !isBoolean && (\n <input\n id={`${filterId}-val`}\n name={`filter-val-${col.field}`}\n className={`ogx-filter__value-input${isActive ? ' ogx-filter__value-input--active' : ''}`}\n type=\"text\"\n value={localValue}\n onChange={(e) => setLocalValue(e.target.value)}\n placeholder={col.type === 'number' ? 'Number…' : 'Value…'}\n aria-label={`Filter value for ${col.headerName || col.field}`}\n />\n )}\n\n {/* Clear button — only when active */}\n {isActive && (\n <button\n className=\"ogx-filter__row-clear\"\n onClick={handleClear}\n aria-label={`Clear filter for ${col.headerName || col.field}`}\n title=\"Clear\"\n >\n ×\n </button>\n )}\n </div>\n </div>\n );\n};\n\n// ── Root panel ────────────────────────────────────────────────────────────────\n\nexport const FilterPanel: React.FC<FilterPanelProps> = ({ filterModel, columns, onFilterModelChange }) => {\n const items = useMemo<GridFilterItem[]>(() => (filterModel.items ?? []) as GridFilterItem[], [filterModel.items]);\n const logicOperator = filterModel.logicOperator ?? 'and';\n\n const handleItemChange = useCallback((field: string, newItem: GridFilterItem | null) => {\n const rest = items.filter(i => 'field' in i && (i as GridFilterItem).field !== field);\n const next: GridFilterItem[] = newItem ? [...rest, newItem] : rest;\n onFilterModelChange({ ...filterModel, items: next });\n }, [items, filterModel, onFilterModelChange]);\n\n const handleLogicChange = useCallback((op: 'and' | 'or') => {\n onFilterModelChange({ ...filterModel, logicOperator: op });\n }, [filterModel, onFilterModelChange]);\n\n const filterableColumns = columns.filter(col => col.filterable !== false);\n\n return (\n <>\n { }\n {items.length > 1 && (\n <div className=\"ogx-filter__logic-bar\">\n <span className=\"ogx-filter__logic-label\">Match:</span>\n <button\n className={`ogx-filter__logic-pill${logicOperator === 'and' ? ' ogx-filter__logic-pill--active' : ''}`}\n onClick={() => handleLogicChange('and')}\n aria-pressed={logicOperator === 'and'}\n >\n ALL (AND)\n </button>\n <button\n className={`ogx-filter__logic-pill${logicOperator === 'or' ? ' ogx-filter__logic-pill--active' : ''}`}\n onClick={() => handleLogicChange('or')}\n aria-pressed={logicOperator === 'or'}\n >\n ANY (OR)\n </button>\n </div>\n )}\n\n { }\n {filterableColumns.length === 0 ? (\n <div className=\"ogx-filter__empty\">No filterable columns.</div>\n ) : (\n filterableColumns.map(col => (\n <FilterRow\n key={col.field}\n col={col}\n item={getActiveFilter(items, col.field)}\n onChange={(item) => handleItemChange(col.field, item)}\n />\n ))\n )}\n </>\n );\n};\n","import React, { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport ReactDOM from 'react-dom';\nimport type { GridColDef } from '../../types';\nimport type { GridPivotModel, GridPivotAggFn, GridPivotValueField } from '../../types';\n\nconst AGG_FNS: GridPivotAggFn[] = ['sum', 'avg', 'count', 'min', 'max'];\n\nexport function PivotIcon() {\n return (\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" fill=\"currentColor\" opacity=\"0.25\" />\n <path d=\"M17 14v-4M17 10l-2 2 2 2\" />\n </svg>\n );\n}\n\nexport interface PivotPanelProps {\n anchorRef: React.RefObject<HTMLButtonElement | null>;\n columns: GridColDef[];\n model: GridPivotModel;\n onChange: (model: GridPivotModel) => void;\n onClose: () => void;\n}\n\nexport function PivotPanel({ anchorRef, columns, model, onChange, onClose }: PivotPanelProps) {\n const panelRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState({ top: 0, right: 0 });\n const [portalContainer, setPortalContainer] = useState<Element>(document.body);\n\n useLayoutEffect(() => {\n setPortalContainer(anchorRef.current?.closest('.ogx-theme-provider') ?? document.body);\n }, [anchorRef]);\n\n const computePos = useCallback(() => {\n if (!anchorRef.current) return { top: 0, right: 0 };\n const rect = anchorRef.current.getBoundingClientRect();\n return { top: rect.bottom + 6, right: window.innerWidth - rect.right };\n }, [anchorRef]);\n\n useEffect(() => {\n setPos(computePos());\n const update = () => setPos(computePos());\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n return () => {\n window.removeEventListener('scroll', update, true);\n window.removeEventListener('resize', update);\n };\n }, [computePos]);\n\n useEffect(() => {\n function onClick(e: MouseEvent) {\n if (\n panelRef.current && !panelRef.current.contains(e.target as Node) &&\n anchorRef.current && !anchorRef.current.contains(e.target as Node)\n ) onClose();\n }\n function onKey(e: KeyboardEvent) { if (e.key === 'Escape') onClose(); }\n document.addEventListener('mousedown', onClick);\n document.addEventListener('keydown', onKey);\n return () => {\n document.removeEventListener('mousedown', onClick);\n document.removeEventListener('keydown', onKey);\n };\n }, [anchorRef, onClose]);\n\n const inRow = new Set(model.rowFields);\n const inCol = new Set(model.columnFields);\n const inValue = new Set(model.valueFields.map((v) => v.field));\n const isUsed = (f: string) => inRow.has(f) || inCol.has(f) || inValue.has(f);\n\n function addRow(field: string) {\n if (inRow.has(field)) return;\n onChange({ ...model, rowFields: [...model.rowFields, field] });\n }\n function addCol(field: string) {\n if (inCol.has(field)) return;\n onChange({ ...model, columnFields: [...model.columnFields, field] });\n }\n function addValue(field: string, aggFn: GridPivotAggFn = 'sum') {\n if (inValue.has(field)) return;\n onChange({ ...model, valueFields: [...model.valueFields, { field, aggFn }] });\n }\n function removeRow(field: string) {\n onChange({ ...model, rowFields: model.rowFields.filter((f) => f !== field) });\n }\n function removeCol(field: string) {\n onChange({ ...model, columnFields: model.columnFields.filter((f) => f !== field) });\n }\n function removeValue(field: string) {\n onChange({ ...model, valueFields: model.valueFields.filter((v) => v.field !== field) });\n }\n function changeValueFn(field: string, aggFn: GridPivotAggFn) {\n onChange({\n ...model,\n valueFields: model.valueFields.map((v) => v.field === field ? { ...v, aggFn } : v),\n });\n }\n function reset() {\n onChange({ rowFields: [], columnFields: [], valueFields: [] });\n }\n\n const numericFields = new Set(columns.filter((c) => c.type === 'number' || c.aggregable).map((c) => c.field));\n\n const totalActive = model.rowFields.length + model.columnFields.length + model.valueFields.length;\n\n const colLabel = (field: string) =>\n columns.find((c) => c.field === field)?.headerName ?? field;\n\n const panel = (\n <div\n ref={panelRef}\n className=\"ogx-pivot-panel\"\n role=\"dialog\"\n aria-label=\"Pivot configuration\"\n style={{ top: pos.top, right: pos.right }}\n >\n { }\n <div className=\"ogx-pivot-panel__header\">\n <span className=\"ogx-pivot-panel__title\">\n <PivotIcon />\n Pivot Mode\n </span>\n {totalActive > 0 && (\n <button className=\"ogx-pivot-panel__reset-btn\" onClick={reset} title=\"Reset pivot\">\n Reset\n </button>\n )}\n </div>\n\n <div className=\"ogx-pivot-panel__body\">\n\n { }\n <div className=\"ogx-pivot-zone\">\n <span className=\"ogx-pivot-zone__label\">\n <span className=\"ogx-pivot-zone__dot ogx-pivot-zone__dot--row\" />\n Row Fields\n </span>\n <div\n className={`ogx-pivot-chips${model.rowFields.length === 0 ? ' ogx-pivot-chips--empty' : ''}`}\n data-placeholder=\"Add fields here — each becomes a row label\"\n >\n {model.rowFields.map((f) => (\n <span key={f} className=\"ogx-pivot-chip ogx-pivot-chip--row\">\n {colLabel(f)}\n <button className=\"ogx-pivot-chip__remove\" onClick={() => removeRow(f)} title={`Remove ${colLabel(f)}`}>×</button>\n </span>\n ))}\n </div>\n </div>\n\n { }\n <div className=\"ogx-pivot-zone\">\n <span className=\"ogx-pivot-zone__label\">\n <span className=\"ogx-pivot-zone__dot ogx-pivot-zone__dot--col\" />\n Column Fields\n </span>\n <div\n className={`ogx-pivot-chips${model.columnFields.length === 0 ? ' ogx-pivot-chips--empty' : ''}`}\n data-placeholder=\"Add fields here — unique values become column headers\"\n >\n {model.columnFields.map((f) => (\n <span key={f} className=\"ogx-pivot-chip ogx-pivot-chip--col\">\n {colLabel(f)}\n <button className=\"ogx-pivot-chip__remove\" onClick={() => removeCol(f)} title={`Remove ${colLabel(f)}`}>×</button>\n </span>\n ))}\n </div>\n </div>\n\n { }\n <div className=\"ogx-pivot-zone\">\n <span className=\"ogx-pivot-zone__label\">\n <span className=\"ogx-pivot-zone__dot ogx-pivot-zone__dot--value\" />\n Value Fields (aggregated)\n </span>\n <div\n className={`ogx-pivot-chips${model.valueFields.length === 0 ? ' ogx-pivot-chips--empty' : ''}`}\n data-placeholder=\"Add numeric fields here — values are aggregated\"\n >\n {model.valueFields.map((vf: GridPivotValueField) => (\n <span key={vf.field} className=\"ogx-pivot-chip ogx-pivot-chip--value\">\n {colLabel(vf.field)}\n <select\n className=\"ogx-pivot-chip__fn-select\"\n value={vf.aggFn}\n onChange={(e) => changeValueFn(vf.field, e.target.value as GridPivotAggFn)}\n title=\"Aggregation function\"\n >\n {AGG_FNS.map((fn) => (\n <option key={fn} value={fn}>{fn.toUpperCase()}</option>\n ))}\n </select>\n <button className=\"ogx-pivot-chip__remove\" onClick={() => removeValue(vf.field)} title={`Remove ${colLabel(vf.field)}`}>×</button>\n </span>\n ))}\n </div>\n </div>\n\n <hr className=\"ogx-pivot-panel__divider\" />\n\n { }\n <div>\n <div className=\"ogx-pivot-panel__fields-label\">Available Fields</div>\n <div className=\"ogx-pivot-fields\">\n {columns.map((col) => {\n const isNum = numericFields.has(col.field);\n const used = isUsed(col.field);\n if (used) return null;\n return (\n <div key={col.field} style={{ display: 'flex', alignItems: 'center', gap: 3 }}>\n <span className={`ogx-pivot-field-btn${isNum ? ' ogx-pivot-field-btn--numeric' : ''}`}>\n {col.headerName ?? col.field}\n </span>\n <div className=\"ogx-pivot-field-actions\">\n <button className=\"ogx-pivot-add-btn ogx-pivot-add-btn--row\" onClick={() => addRow(col.field)} title=\"Add to Row Fields\">Row</button>\n <button className=\"ogx-pivot-add-btn ogx-pivot-add-btn--col\" onClick={() => addCol(col.field)} title=\"Add to Column Fields\">Col</button>\n {isNum && (\n <button className=\"ogx-pivot-add-btn ogx-pivot-add-btn--value\" onClick={() => addValue(col.field)} title=\"Add to Value Fields\">Val</button>\n )}\n </div>\n </div>\n );\n })}\n {columns.every((col) => isUsed(col.field)) && (\n <span style={{ fontSize: 12, color: 'var(--ogx-color-gray-400, #94a3b8)' }}>\n All fields are in use.\n </span>\n )}\n </div>\n </div>\n\n </div>\n </div>\n );\n\n return ReactDOM.createPortal(panel, portalContainer);\n}\n","import React, { useState, useEffect, useRef, useCallback, useLayoutEffect } from 'react';\n\n\ninterface GlobalSearchProps {\n value?: string;\n onChange: (value: string) => void;\n placeholder?: string;\n debounceMs?: number;\n}\n\nfunction SearchIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n );\n}\n\nfunction CloseIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n );\n}\n\nexport function GlobalSearch({ value = '', onChange, placeholder = 'Search...', debounceMs = 250 }: GlobalSearchProps) {\n const [isExpanded, setIsExpanded] = useState(() => value.length > 0);\n // Fully uncontrolled: localValue is the single source of truth.\n const [localValue, setLocalValue] = useState(value);\n const inputRef = useRef<HTMLInputElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n // Keep onChange always current without adding it to effect deps\n const onChangeRef = useRef(onChange);\n useLayoutEffect(() => { onChangeRef.current = onChange; }, [onChange]);\n // Track the last value we emitted upward\n const lastEmittedRef = useRef(value);\n // Track the last incoming prop value to detect external resets\n const lastIncomingValueRef = useRef(value);\n // Track whether input was focused BEFORE a re-render so we can restore it\n const wasFocusedRef = useRef(false);\n\n // ── Focus preservation across re-renders ─────────────────────────────────\n // When the parent updates filterModel (triggered by our debounce), React\n // re-renders the entire tree. Even though the input element stays mounted,\n // the browser can lose focus during heavy reconciliation. We detect this\n // via useLayoutEffect (runs synchronously after DOM mutations, before paint)\n // and immediately restore focus without any visual flicker.\n useLayoutEffect(() => {\n if (wasFocusedRef.current && document.activeElement !== inputRef.current) {\n inputRef.current?.focus();\n }\n });\n\n // ── External reset detection ──────────────────────────────────────────────\n // Only responds when the PARENT programmatically changes the value\n // (e.g. \"Clear all filters\" button) — not from our own typing.\n useEffect(() => {\n if (value === lastIncomingValueRef.current) return;\n lastIncomingValueRef.current = value;\n\n if (value !== lastEmittedRef.current) {\n setLocalValue(value);\n lastEmittedRef.current = value;\n if (!value) {\n wasFocusedRef.current = false;\n setIsExpanded(false);\n } else {\n setIsExpanded(true);\n }\n }\n }, [value]);\n\n // ── Debounced upward notification ─────────────────────────────────────────\n useEffect(() => {\n const handler = setTimeout(() => {\n if (localValue !== lastEmittedRef.current) {\n lastEmittedRef.current = localValue;\n onChangeRef.current(localValue);\n }\n }, debounceMs);\n return () => clearTimeout(handler);\n }, [localValue, debounceMs]);\n\n const handleExpand = useCallback(() => {\n setIsExpanded(true);\n requestAnimationFrame(() => inputRef.current?.focus());\n }, []);\n\n const handleClear = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n setLocalValue('');\n lastEmittedRef.current = '';\n onChangeRef.current('');\n inputRef.current?.focus();\n }, []);\n\n const handleFocus = useCallback(() => {\n wasFocusedRef.current = true;\n setIsExpanded(true);\n }, []);\n\n // Blur: defer 150ms to allow focus to move within the container first\n // (e.g. clicking the clear button) before deciding to collapse.\n const handleBlur = useCallback(() => {\n wasFocusedRef.current = false;\n setTimeout(() => {\n if (\n containerRef.current &&\n document.activeElement &&\n containerRef.current.contains(document.activeElement)\n ) {\n // Focus is still inside — mark as focused again and abort\n wasFocusedRef.current = true;\n return;\n }\n if (!localValue) {\n setIsExpanded(false);\n }\n }, 150);\n }, [localValue]);\n\n // ── Click outside ─────────────────────────────────────────────────────────\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n if (!localValue) {\n setIsExpanded(false);\n }\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [localValue]);\n\n return (\n <div\n ref={containerRef}\n className={`ogx-global-search${isExpanded ? ' ogx-global-search--expanded' : ''}`}\n onClick={!isExpanded ? handleExpand : undefined}\n >\n <div className=\"ogx-global-search__icon-wrapper\">\n <SearchIcon />\n </div>\n <input\n ref={inputRef}\n className=\"ogx-global-search__input\"\n value={localValue}\n onChange={(e) => setLocalValue(e.target.value)}\n onFocus={handleFocus}\n onBlur={handleBlur}\n placeholder={placeholder}\n aria-label=\"Global Search\"\n autoComplete=\"off\"\n />\n {localValue && (\n <button className=\"ogx-global-search__clear\" onClick={handleClear} aria-label=\"Clear search\">\n <CloseIcon />\n </button>\n )}\n </div>\n );\n}\n","import { useState, useRef, useLayoutEffect, useCallback } from 'react';\nimport ReactDOM from 'react-dom';\nimport './Tooltip.css';\n\ninterface GridTooltipProps {\n title: React.ReactNode;\n children: React.ReactElement;\n placement?: 'top' | 'bottom' | 'left' | 'right';\n enterDelay?: number;\n leaveDelay?: number;\n}\n\nexport function GridTooltip({\n title,\n children,\n placement = 'top',\n enterDelay = 200,\n leaveDelay = 0\n}: GridTooltipProps) {\n const [open, setOpen] = useState(false);\n const [coords, setCoords] = useState({ top: 0, left: 0 });\n const timerRef = useRef<NodeJS.Timeout | null>(null);\n const childRef = useRef<HTMLElement | null>(null);\n\n const updateCoords = useCallback(() => {\n if (!childRef.current) return;\n const rect = childRef.current.getBoundingClientRect();\n\n let t = 0;\n let l = 0;\n\n // Note: These calculations are for positioning absolute relative to document.body\n const scrollX = window.pageXOffset || document.documentElement.scrollLeft;\n const scrollY = window.pageYOffset || document.documentElement.scrollTop;\n\n if (placement === 'top') {\n t = rect.top + scrollY - 8;\n l = rect.left + scrollX + rect.width / 2;\n } else if (placement === 'bottom') {\n t = rect.bottom + scrollY + 8;\n l = rect.left + scrollX + rect.width / 2;\n }\n\n setCoords({ top: t, left: l });\n }, [placement]);\n\n useLayoutEffect(() => {\n if (open) {\n updateCoords();\n window.addEventListener('scroll', updateCoords, true);\n window.addEventListener('resize', updateCoords);\n }\n return () => {\n window.removeEventListener('scroll', updateCoords, true);\n window.removeEventListener('resize', updateCoords);\n };\n }, [open, updateCoords]);\n\n const handleMouseEnter = () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => {\n setOpen(true);\n }, enterDelay);\n };\n\n const handleMouseLeave = () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => {\n setOpen(false);\n }, leaveDelay);\n };\n\n const wrapperRef = useCallback((node: HTMLSpanElement | null) => {\n // Use the first real child element for coordinates, not the wrapper span.\n // display:contents would give zero rects; inline-block wrapper gives correct rects\n // but we want coords from the actual child for pixel-perfect placement.\n childRef.current = node ? (node.firstElementChild as HTMLElement) ?? node : null;\n }, []);\n\n return (\n <>\n <span\n ref={wrapperRef}\n style={{ display: 'inline-block', lineHeight: 0 }}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {children}\n </span>\n {open && title && ReactDOM.createPortal(\n <div\n className={`ogx-tooltip ogx-tooltip--${placement}`}\n style={{\n top: coords.top,\n left: coords.left,\n position: 'absolute',\n zIndex: 99999\n }}\n >\n {title}\n </div>,\n document.body\n )}\n </>\n );\n}\n","import React, { useState, useRef, useEffect, useCallback, useLayoutEffect } from 'react';\nimport ReactDOM from 'react-dom';\nimport type { GridColDef, GridAggregationModel, GridPivotModel, GridFilterModel } from '../../types';\nimport { PivotPanel, PivotIcon } from './PivotPanel';\nimport { GlobalSearch } from './GlobalSearch';\nimport { ColumnVisibilityPanel } from '../ColumnVisibilityPanel/ColumnVisibilityPanel';\nimport { FilterPanel } from '../FilterPanel/FilterPanel';\nimport { GridTooltip } from '../Tooltip/Tooltip';\n\n/** Props passed to a custom toolbar button renderer. */\nexport interface ToolbarButtonRenderProps {\n /** Call this to toggle the associated panel open/closed. */\n onClick: () => void;\n /** Whether the associated panel is currently open. */\n isOpen: boolean;\n /** Number of active items (filters applied, aggregations configured, etc.). */\n activeCount: number;\n}\n\n/** Props passed to a custom quick-filter renderer. */\nexport interface ToolbarQuickFilterRenderProps {\n /** Current search string. */\n value: string;\n /** Call with the new search string when the input changes. */\n onChange: (value: string) => void;\n}\n\nexport interface GridToolbarProps {\n columns?: GridColDef[];\n /** Original user-defined columns (before pivot transformation).\n * When provided, the PivotPanel shows these instead of `columns`\n * to prevent pivot-generated synthetic columns from appearing in\n * 'Available Fields' and causing infinite nested aggregations. */\n baseColumns?: GridColDef[];\n aggregationModel?: GridAggregationModel;\n onAggregationModelChange?: (model: GridAggregationModel) => void;\n pivotModel?: GridPivotModel;\n onPivotModelChange?: (model: GridPivotModel) => void;\n filterModel?: GridFilterModel;\n onFilterModelChange?: (model: GridFilterModel) => void;\n columnVisibilityModel?: Record<string, boolean>;\n onColumnVisibilityModelChange?: (model: Record<string, boolean>) => void;\n onColumnReorder?: (fromField: string, toField: string) => void;\n onColumnOrderReset?: () => void;\n forceColumnsOpen?: boolean;\n onColumnsPanelClose?: () => void;\n children?: React.ReactNode;\n rightContent?: React.ReactNode;\n style?: React.CSSProperties;\n /**\n * Replace the built-in Columns button. The columns panel still opens and\n * closes normally — only the trigger element is replaced.\n */\n renderColumnsButton?: (props: ToolbarButtonRenderProps) => React.ReactNode;\n /**\n * Replace the built-in Filters button. The filter panel still opens and\n * closes normally — only the trigger element is replaced.\n */\n renderFilterButton?: (props: ToolbarButtonRenderProps) => React.ReactNode;\n /**\n * Replace the built-in Aggregation/Summaries button. The aggregation panel\n * still opens and closes normally — only the trigger element is replaced.\n */\n renderAggregationButton?: (props: ToolbarButtonRenderProps) => React.ReactNode;\n /**\n * Render an Export button. There is no built-in export button — this slot\n * inserts your element after the Aggregation button in the toolbar action row.\n */\n renderExportButton?: () => React.ReactNode;\n /**\n * Replace the built-in quick-filter search bar. Receives the current search\n * value and an onChange handler; connect them to your own input element.\n */\n renderQuickFilter?: (props: ToolbarQuickFilterRenderProps) => React.ReactNode;\n /** Additional CSS class applied to the toolbar root element. */\n className?: string;\n /** Show columns with `hideable: false` in the Columns panel as disabled rows. Default: false. */\n showNonHideableColumns?: boolean;\n}\n\nconst AGGREGATION_FUNCTIONS = ['none', 'sum', 'avg', 'count', 'min', 'max'] as const;\n\nfunction SigmaIcon() {\n return (\n <svg\n width=\"18\" height=\"18\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"\n strokeLinecap=\"round\" strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 4H6l6 8-6 8h12\" />\n </svg>\n );\n}\n\nfunction ViewColumnIcon() {\n return (\n <svg focusable=\"false\" aria-hidden=\"true\" viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\">\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <rect x=\"8.5\" y=\"4\" width=\"7\" height=\"16\" fill=\"currentColor\" opacity=\"0.25\" />\n <line x1=\"8.5\" y1=\"4\" x2=\"8.5\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <line x1=\"15.5\" y1=\"4\" x2=\"15.5\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <line x1=\"2\" y1=\"9\" x2=\"22\" y2=\"9\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <line x1=\"2\" y1=\"14\" x2=\"22\" y2=\"14\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n </svg>\n );\n}\n\nfunction FilterIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polygon points=\"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3\" />\n </svg>\n );\n}\n\ninterface PanelPosition { top: number; right: number; }\n\nfunction AggregationPanel({\n anchorRef,\n aggregationModel,\n aggregableColumns,\n onFunctionChange,\n onClearAll,\n onClose,\n activeCount,\n}: {\n anchorRef: React.RefObject<HTMLElement | null>;\n aggregationModel: GridAggregationModel;\n aggregableColumns: GridColDef[];\n onFunctionChange: (field: string, fn: string) => void;\n onClearAll: () => void;\n onClose: () => void;\n activeCount: number;\n}) {\n const panelRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState<PanelPosition>({ top: 0, right: 0 });\n const [portalContainer, setPortalContainer] = useState<Element>(document.body);\n\n useLayoutEffect(() => {\n setPortalContainer(anchorRef.current?.closest('.ogx-theme-provider') ?? document.body);\n }, [anchorRef]);\n\n const computePos = useCallback((): PanelPosition => {\n if (!anchorRef.current) return { top: 0, right: 0 };\n const rect = anchorRef.current.getBoundingClientRect();\n return {\n top: rect.bottom + 6,\n right: window.innerWidth - rect.right,\n };\n }, [anchorRef]);\n\n useEffect(() => {\n setPos(computePos());\n const update = () => setPos(computePos());\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n return () => {\n window.removeEventListener('scroll', update, true);\n window.removeEventListener('resize', update);\n };\n }, [computePos]);\n\n useEffect(() => {\n function handleClick(e: MouseEvent) {\n if (\n panelRef.current && !panelRef.current.contains(e.target as Node) &&\n anchorRef.current && !anchorRef.current.contains(e.target as Node)\n ) {\n onClose();\n }\n }\n document.addEventListener('mousedown', handleClick);\n return () => document.removeEventListener('mousedown', handleClick);\n }, [anchorRef, onClose]);\n\n useEffect(() => {\n function onKey(e: KeyboardEvent) { if (e.key === 'Escape') onClose(); }\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [onClose]);\n\n const panel = (\n <div\n ref={panelRef}\n className=\"ogx-toolbar__panel\"\n role=\"dialog\"\n aria-label=\"Summaries configuration\"\n style={{ top: pos.top, right: pos.right, width: 400, maxWidth: 'calc(100vw - 24px)' }}\n >\n <div className=\"ogx-toolbar__panel-header\">\n <span className=\"ogx-toolbar__panel-title\">\n <SigmaIcon />\n Summaries\n </span>\n {activeCount > 0 && (\n <button\n className=\"ogx-toolbar__clear-btn\"\n onClick={onClearAll}\n title=\"Clear all summaries\"\n >\n Clear all\n </button>\n )}\n </div>\n\n <div className=\"ogx-toolbar__panel-body\">\n {aggregableColumns.length === 0 ? (\n <p className=\"ogx-toolbar__empty\">\n No aggregable columns.<br />\n Set <code>aggregable: true</code> on a column to enable.\n </p>\n ) : (\n aggregableColumns.map((col) => {\n const currentFn = aggregationModel[col.field] || 'none';\n return (\n <div key={col.field} className=\"ogx-toolbar__agg-row\">\n <span className=\"ogx-toolbar__agg-label\" title={col.field}>\n {col.headerName || col.field}\n </span>\n <div className=\"ogx-toolbar__agg-pills\">\n {AGGREGATION_FUNCTIONS.map((fn) => (\n <button\n key={fn}\n className={`ogx-toolbar__pill${currentFn === fn ? ' ogx-toolbar__pill--active' : ''}`}\n onClick={() => onFunctionChange(col.field, fn)}\n aria-pressed={currentFn === fn}\n >\n {fn}\n </button>\n ))}\n </div>\n </div>\n );\n })\n )}\n </div>\n </div>\n );\n\n return ReactDOM.createPortal(panel, portalContainer);\n}\n\nfunction ColumnsPanelWrapper({\n anchorRef,\n columns,\n visibleColumns,\n onVisibilityChange,\n onShowAll,\n onHideAll,\n onColumnReorder,\n onColumnOrderReset,\n onClose,\n showNonHideableColumns,\n}: {\n anchorRef: React.RefObject<HTMLElement | null>;\n columns: GridColDef[];\n visibleColumns: Set<string>;\n onVisibilityChange: (field: string, isVisible: boolean) => void;\n onShowAll: () => void;\n onHideAll: () => void;\n onColumnReorder?: (fromField: string, toField: string) => void;\n onColumnOrderReset?: () => void;\n onClose: () => void;\n showNonHideableColumns?: boolean;\n}) {\n const panelRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState<PanelPosition>({ top: 0, right: 0 });\n const [portalContainer, setPortalContainer] = useState<Element>(document.body);\n\n useLayoutEffect(() => {\n setPortalContainer(anchorRef.current?.closest('.ogx-theme-provider') ?? document.body);\n }, [anchorRef]);\n\n const computePos = useCallback((): PanelPosition => {\n if (!anchorRef.current) return { top: 0, right: 0 };\n const rect = anchorRef.current.getBoundingClientRect();\n return {\n top: rect.bottom + 6,\n right: window.innerWidth - rect.right,\n };\n }, [anchorRef]);\n\n useEffect(() => {\n setPos(computePos());\n const update = () => setPos(computePos());\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n return () => {\n window.removeEventListener('scroll', update, true);\n window.removeEventListener('resize', update);\n };\n }, [computePos]);\n\n useEffect(() => {\n function handleClick(e: MouseEvent) {\n if (\n panelRef.current && !panelRef.current.contains(e.target as Node) &&\n anchorRef.current && !anchorRef.current.contains(e.target as Node)\n ) {\n onClose();\n }\n }\n document.addEventListener('mousedown', handleClick);\n return () => document.removeEventListener('mousedown', handleClick);\n }, [anchorRef, onClose]);\n\n const panel = (\n <div\n ref={panelRef}\n className=\"ogx-toolbar__panel\"\n role=\"dialog\"\n aria-label=\"Column visibility\"\n style={{ top: pos.top, right: pos.right, width: 280, padding: 0 }}\n >\n <ColumnVisibilityPanel\n columns={columns}\n visibleColumns={visibleColumns}\n onVisibilityChange={onVisibilityChange}\n onShowAll={onShowAll}\n onHideAll={onHideAll}\n onColumnReorder={onColumnReorder}\n onColumnOrderReset={onColumnOrderReset}\n showNonHideableColumns={showNonHideableColumns}\n />\n </div>\n );\n\n return ReactDOM.createPortal(panel, portalContainer);\n}\n\nfunction FilterPanelWrapper({\n anchorRef,\n columns,\n filterModel,\n onFilterModelChange,\n onClose\n}: {\n anchorRef: React.RefObject<HTMLElement | null>;\n columns: GridColDef[];\n filterModel: GridFilterModel;\n onFilterModelChange: (model: GridFilterModel) => void;\n onClose: () => void;\n}) {\n const panelRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState<PanelPosition>({ top: 0, right: 0 });\n // Stable ref for onClose — prevents the mousedown effect from\n // tearing down and re-registering on every filterModel update,\n // which could fire the close callback during the re-register window.\n const onCloseRef = useRef(onClose);\n useLayoutEffect(() => { onCloseRef.current = onClose; }, [onClose]);\n const [portalContainer, setPortalContainer] = useState<Element>(document.body);\n\n useLayoutEffect(() => {\n setPortalContainer(anchorRef.current?.closest('.ogx-theme-provider') ?? document.body);\n }, [anchorRef]);\n\n const computePos = useCallback((): PanelPosition => {\n if (!anchorRef.current) return { top: 0, right: 0 };\n const rect = anchorRef.current.getBoundingClientRect();\n return {\n top: rect.bottom + 6,\n right: window.innerWidth - rect.right,\n };\n }, [anchorRef]);\n\n useEffect(() => {\n setPos(computePos());\n const update = () => setPos(computePos());\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n return () => {\n window.removeEventListener('scroll', update, true);\n window.removeEventListener('resize', update);\n };\n }, [computePos]);\n\n // Only Escape key closes the filter panel automatically.\n // Click-outside is intentionally removed: users need to type in filter\n // inputs without the panel closing. There is an explicit Close button.\n useEffect(() => {\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') onCloseRef.current();\n }\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n // Empty deps — listener is registered once and uses the stable ref\n }, []);\n\n const activeFilterCount = filterModel.items?.length ?? 0;\n\n const handleClearAll = () => {\n onFilterModelChange({ ...filterModel, items: [], logicOperator: 'and' });\n };\n\n const panel = (\n <div\n ref={panelRef}\n className=\"ogx-toolbar__panel ogx-toolbar__panel--filter\"\n role=\"dialog\"\n aria-label=\"Advanced filters\"\n style={{ top: pos.top, right: pos.right, width: 540, maxWidth: 'calc(100vw - 24px)' }}\n >\n <div className=\"ogx-toolbar__panel-header\">\n <span className=\"ogx-toolbar__panel-title\">\n <FilterIcon />\n Filters\n {activeFilterCount > 0 && (\n <span className=\"ogx-toolbar__panel-count\">{activeFilterCount}</span>\n )}\n </span>\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n {activeFilterCount > 0 && (\n <button\n className=\"ogx-toolbar__clear-btn\"\n onClick={handleClearAll}\n title=\"Clear all filters\"\n >\n Clear all\n </button>\n )}\n <button\n className=\"ogx-toolbar__close-btn\"\n onClick={() => onCloseRef.current()}\n title=\"Close filters\"\n aria-label=\"Close filters panel\"\n >\n Close\n </button>\n </div>\n </div>\n\n <div className=\"ogx-toolbar__panel-body ogx-toolbar__panel-body--filter\">\n <FilterPanel\n columns={columns}\n filterModel={filterModel}\n onFilterModelChange={onFilterModelChange}\n />\n </div>\n </div>\n );\n\n return ReactDOM.createPortal(panel, portalContainer);\n}\n\nconst EMPTY_PIVOT: GridPivotModel = { rowFields: [], columnFields: [], valueFields: [] };\n\nexport function GridToolbar({\n columns = [],\n baseColumns,\n aggregationModel = {},\n onAggregationModelChange,\n pivotModel,\n onPivotModelChange,\n filterModel,\n onFilterModelChange,\n columnVisibilityModel = {},\n onColumnVisibilityModelChange,\n onColumnReorder,\n onColumnOrderReset,\n forceColumnsOpen,\n onColumnsPanelClose,\n children,\n rightContent,\n style,\n renderColumnsButton,\n renderFilterButton,\n renderAggregationButton,\n renderExportButton,\n renderQuickFilter,\n className,\n showNonHideableColumns,\n}: GridToolbarProps) {\n const [aggOpen, setAggOpen] = useState(false);\n const [pivotOpen, setPivotOpen] = useState(false);\n const [colsOpen, setColsOpen] = useState(false);\n const [filterOpen, setFilterOpen] = useState(false);\n\n useEffect(() => {\n if (forceColumnsOpen) {\n setColsOpen(true);\n setAggOpen(false);\n setPivotOpen(false);\n setFilterOpen(false);\n }\n }, [forceColumnsOpen]);\n\n const aggButtonRef = useRef<HTMLButtonElement>(null);\n const pivotButtonRef = useRef<HTMLButtonElement>(null);\n const colsButtonRef = useRef<HTMLButtonElement>(null);\n const filterButtonRef = useRef<HTMLButtonElement>(null);\n\n // Wrapper div refs — used as panel anchors when a custom button renderer\n // is provided (the custom element doesn't expose a ref to us).\n const colsWrapperRef = useRef<HTMLDivElement>(null);\n const filterWrapperRef = useRef<HTMLDivElement>(null);\n const aggWrapperRef = useRef<HTMLDivElement>(null);\n\n const currentPivotModel = pivotModel ?? EMPTY_PIVOT;\n const pivotActive = currentPivotModel.rowFields.length > 0\n || currentPivotModel.columnFields.length > 0\n || currentPivotModel.valueFields.length > 0;\n\n const aggregableColumns = columns.filter(\n (c) => c.aggregable !== false && (c.type === 'number' || c.aggregable === true)\n );\n\n const activeCount = Object.keys(aggregationModel).filter(\n (f) => aggregationModel[f] && aggregationModel[f] !== 'none'\n ).length;\n\n const handleFunctionChange = useCallback(\n (field: string, fn: string) => {\n if (!onAggregationModelChange) return;\n const next = { ...aggregationModel };\n if (fn === 'none') {\n delete next[field];\n } else {\n next[field] = fn;\n }\n onAggregationModelChange(next);\n },\n [aggregationModel, onAggregationModelChange]\n );\n\n const clearAllAgg = useCallback(() => {\n onAggregationModelChange?.({});\n }, [onAggregationModelChange]);\n\n const handleSearchChange = useCallback((value: string) => {\n if (!onFilterModelChange) return;\n\n const values = value ? [value] : [];\n const nextModel = {\n ...(filterModel || {}),\n quickFilterValues: values,\n items: filterModel?.items || []\n };\n onFilterModelChange(nextModel);\n }, [filterModel, onFilterModelChange]);\n\n const searchValue = filterModel?.quickFilterValues?.[0] || '';\n const activeFilterCount = (filterModel?.items?.length || 0);\n\n // Column Visibility Logic\n const visibleColumns = new Set(\n columns\n .filter(col => columnVisibilityModel[col.field] !== false) // default true\n .map(col => col.field)\n );\n\n const handleVisibilityChange = useCallback((field: string, isVisible: boolean) => {\n if (!onColumnVisibilityModelChange) return;\n const next = { ...columnVisibilityModel, [field]: isVisible };\n onColumnVisibilityModelChange(next);\n }, [columnVisibilityModel, onColumnVisibilityModelChange]);\n\n // Batch show/hide — build one full model so no stale-closure overwrites\n const handleShowAllColumns = useCallback(() => {\n if (!onColumnVisibilityModelChange) return;\n const next = { ...columnVisibilityModel };\n columns.forEach(col => {\n if (col.hideable !== false) next[col.field] = true;\n });\n onColumnVisibilityModelChange(next);\n }, [columns, columnVisibilityModel, onColumnVisibilityModelChange]);\n\n const handleHideAllColumns = useCallback(() => {\n if (!onColumnVisibilityModelChange) return;\n const next = { ...columnVisibilityModel };\n columns.forEach(col => {\n if (col.hideable !== false) next[col.field] = false;\n });\n onColumnVisibilityModelChange(next);\n }, [columns, columnVisibilityModel, onColumnVisibilityModelChange]);\n\n return (\n <div className={['ogx-toolbar', className].filter(Boolean).join(' ')} role=\"toolbar\" aria-label=\"Grid toolbar\" style={style}>\n {/* Left slot — custom content */}\n {children && <div className=\"ogx-toolbar__left\">{children}</div>}\n\n {/* Spacer */}\n <div className=\"ogx-toolbar__spacer\" />\n\n {/* Right: built-in buttons */}\n <div className=\"ogx-toolbar__actions\">\n {onFilterModelChange && (\n <div className=\"ogx-toolbar__dropdown-wrapper\" style={{ marginRight: 4 }}>\n {renderQuickFilter\n ? renderQuickFilter({ value: searchValue, onChange: handleSearchChange })\n : (\n <GlobalSearch\n value={searchValue}\n onChange={handleSearchChange}\n placeholder=\"Search...\"\n />\n )\n }\n </div>\n )}\n\n {/* Columns Button */}\n {onColumnVisibilityModelChange && (\n <div ref={colsWrapperRef} className=\"ogx-toolbar__dropdown-wrapper\" style={{ marginRight: 4 }}>\n {renderColumnsButton\n ? renderColumnsButton({\n onClick: () => { setColsOpen(o => !o); setAggOpen(false); setPivotOpen(false); setFilterOpen(false); },\n isOpen: colsOpen,\n activeCount: columns.length - visibleColumns.size,\n })\n : (\n <GridTooltip title=\"Columns\">\n <button\n ref={colsButtonRef}\n className={`ogx-toolbar__icon-btn${colsOpen ? ' ogx-toolbar__icon-btn--active' : ''}`}\n aria-label=\"Manage columns\"\n onClick={() => {\n setColsOpen(!colsOpen);\n setAggOpen(false);\n setPivotOpen(false);\n setFilterOpen(false);\n }}\n >\n <ViewColumnIcon />\n </button>\n </GridTooltip>\n )\n }\n {colsOpen && (\n <ColumnsPanelWrapper\n anchorRef={renderColumnsButton ? colsWrapperRef : colsButtonRef}\n columns={columns}\n visibleColumns={visibleColumns}\n onVisibilityChange={handleVisibilityChange}\n onShowAll={handleShowAllColumns}\n onHideAll={handleHideAllColumns}\n onColumnReorder={onColumnReorder}\n onColumnOrderReset={onColumnOrderReset}\n onClose={() => { setColsOpen(false); onColumnsPanelClose?.(); }}\n showNonHideableColumns={showNonHideableColumns}\n />\n )}\n </div>\n )}\n\n {/* Filters Button */}\n {onFilterModelChange && (\n <div ref={filterWrapperRef} className=\"ogx-toolbar__dropdown-wrapper\" style={{ marginRight: 4 }}>\n {renderFilterButton\n ? renderFilterButton({\n onClick: () => { setFilterOpen(o => !o); setAggOpen(false); setPivotOpen(false); setColsOpen(false); },\n isOpen: filterOpen,\n activeCount: activeFilterCount,\n })\n : (\n <GridTooltip title=\"Filters\">\n <button\n ref={filterButtonRef}\n className={`ogx-toolbar__icon-btn${filterOpen ? ' ogx-toolbar__icon-btn--active' : ''}`}\n aria-label=\"Advanced filters\"\n onClick={() => {\n setFilterOpen(!filterOpen);\n setAggOpen(false);\n setPivotOpen(false);\n setColsOpen(false);\n }}\n >\n <FilterIcon />\n {activeFilterCount > 0 && (\n <span className=\"ogx-toolbar__dot\" aria-label=\"Filters active\" />\n )}\n </button>\n </GridTooltip>\n )\n }\n {filterOpen && (\n <FilterPanelWrapper\n anchorRef={renderFilterButton ? filterWrapperRef : filterButtonRef}\n columns={columns}\n filterModel={filterModel || { items: [] }}\n onFilterModelChange={onFilterModelChange}\n onClose={() => setFilterOpen(false)}\n />\n )}\n </div>\n )}\n\n {/* Pivot button */}\n {onPivotModelChange && (\n <div className=\"ogx-toolbar__dropdown-wrapper\" style={{ marginRight: 4 }}>\n <GridTooltip title=\"Pivot\">\n <button\n ref={pivotButtonRef}\n className={`ogx-toolbar__icon-btn${pivotOpen ? ' ogx-toolbar__icon-btn--active' : ''}`}\n aria-label=\"Configure pivot\"\n aria-expanded={pivotOpen}\n onClick={() => {\n setPivotOpen(!pivotOpen);\n setAggOpen(false);\n setColsOpen(false);\n setFilterOpen(false);\n }}\n >\n <PivotIcon />\n {pivotActive && (\n <span className=\"ogx-toolbar__dot\" aria-label=\"Pivot active\" />\n )}\n </button>\n </GridTooltip>\n\n {pivotOpen && (\n <PivotPanel\n anchorRef={pivotButtonRef}\n columns={baseColumns ?? columns}\n model={currentPivotModel}\n onChange={(m) => { onPivotModelChange?.(m); }}\n onClose={() => setPivotOpen(false)}\n />\n )}\n </div>\n )}\n\n {/* Summaries button */}\n <div ref={aggWrapperRef} className=\"ogx-toolbar__dropdown-wrapper\" style={{ marginRight: 4 }}>\n {renderAggregationButton\n ? renderAggregationButton({\n onClick: () => { setAggOpen(o => !o); setPivotOpen(false); setColsOpen(false); setFilterOpen(false); },\n isOpen: aggOpen,\n activeCount,\n })\n : (\n <GridTooltip title=\"Summaries\">\n <button\n ref={aggButtonRef}\n className={`ogx-toolbar__icon-btn${aggOpen ? ' ogx-toolbar__icon-btn--active' : ''}`}\n aria-label=\"Configure summaries\"\n aria-expanded={aggOpen}\n onClick={() => {\n setAggOpen(!aggOpen);\n setPivotOpen(false);\n setColsOpen(false);\n setFilterOpen(false);\n }}\n >\n <SigmaIcon />\n {activeCount > 0 && (\n <span className=\"ogx-toolbar__dot\" aria-label={`${activeCount} active summaries`} />\n )}\n </button>\n </GridTooltip>\n )\n }\n\n {aggOpen && (\n <AggregationPanel\n anchorRef={renderAggregationButton ? aggWrapperRef : aggButtonRef}\n aggregationModel={aggregationModel}\n aggregableColumns={aggregableColumns}\n onFunctionChange={handleFunctionChange}\n onClearAll={clearAllAgg}\n onClose={() => setAggOpen(false)}\n activeCount={activeCount}\n />\n )}\n </div>\n\n {/* Export button slot */}\n {renderExportButton && renderExportButton()}\n\n {rightContent}\n </div>\n </div>\n );\n}\n","import { useRef } from 'react';\nimport type { GridApi } from '../../types';\n\n/**\n * Hook to create a ref for the DataGrid API.\n * This ref can be passed to the `apiRef` prop of the `DataGrid` component.\n */\nexport function useGridApiRef() {\n return useRef<GridApi>(null!);\n}\n","\nimport React from 'react';\n\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n fullWidth?: boolean;\n error?: boolean;\n startAdornment?: React.ReactNode;\n endAdornment?: React.ReactNode;\n}\n\nexport const Input: React.FC<InputProps> = ({\n fullWidth = false,\n error = false,\n startAdornment,\n endAdornment,\n className = '',\n ...props\n}) => {\n const wrapperClassNames = [\n 'ogx-input-wrapper',\n fullWidth && 'ogx-input-wrapper--full-width',\n error && 'ogx-input-wrapper--error',\n props.disabled && 'ogx-input-wrapper--disabled',\n className\n ].filter(Boolean).join(' ');\n\n return (\n <div className={wrapperClassNames}>\n {startAdornment && (\n <div className=\"ogx-input__adornment ogx-input__adornment--start\">\n {startAdornment}\n </div>\n )}\n <input\n className=\"ogx-input\"\n {...props}\n />\n {endAdornment && (\n <div className=\"ogx-input__adornment ogx-input__adornment--end\">\n {endAdornment}\n </div>\n )}\n </div>\n );\n};\n","import type {\n GridColDef,\n GridRowModel,\n GridFilterModel,\n PdfExportOptions,\n GridGroupedExportRow,\n} from '../../types';\nimport { formatAggregationValue } from '../../hooks/features/useAggregation';\n\ninterface JsPDFDoc {\n save: (filename: string) => void;\n setFontSize: (size: number) => void;\n setFont: (name: string, style: string) => void;\n setTextColor: (r: number, g: number, b: number) => void;\n text: (text: string, x: number, y: number, opts?: { align?: string }) => void;\n addImage: (data: string, format: string, x: number, y: number, w: number, h: number) => void;\n line: (x1: number, y1: number, x2: number, y2: number) => void;\n setDrawColor: (r: number, g: number, b: number) => void;\n setLineWidth: (w: number) => void;\n setPage: (page: number) => void;\n lastAutoTable: { finalY: number };\n internal: {\n pageSize: { getWidth: () => number; getHeight: () => number };\n getNumberOfPages: () => number;\n };\n getNumberOfPages: () => number;\n}\n\ninterface AutoTableOptions {\n head: string[][];\n body: string[][];\n foot?: string[][];\n startY?: number;\n styles?: Record<string, unknown>;\n headStyles?: Record<string, unknown>;\n alternateRowStyles?: Record<string, unknown>;\n footStyles?: Record<string, unknown>;\n columnStyles?: Record<number, { cellWidth: number }>;\n showFoot?: string;\n showHead?: string;\n margin?: { top: number; left: number; right: number; bottom: number };\n}\n\nfunction hexToRgb(hex: string): [number, number, number] {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n if (!result) return [79, 70, 229];\n return [\n parseInt(result[1], 16),\n parseInt(result[2], 16),\n parseInt(result[3], 16),\n ];\n}\n\nfunction getExportColumns<R extends GridRowModel>(columns: GridColDef<R>[]): GridColDef<R>[] {\n return columns.filter(col => {\n if (col.exportable === false) return false;\n if (col.field === '__check__' || col.field === '__actions__') return false;\n return true;\n });\n}\n\nfunction resolveValue<R extends GridRowModel>(row: R, col: GridColDef<R>): string {\n let value: unknown = (row as GridRowModel)[col.field];\n if (col.valueGetter) {\n value = col.valueGetter({ row, field: col.field, value });\n }\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n return String(value ?? '');\n}\n\nfunction colWeight<R extends GridRowModel>(col: GridColDef<R>): number {\n const w = typeof col.width === 'number' ? col.width : undefined;\n return w ?? (col.flex ?? 1) * 100;\n}\n\nfunction computeColumnStyles<R extends GridRowModel>(\n columns: GridColDef<R>[],\n usableWidth: number\n): Record<number, { cellWidth: number }> {\n const totalWeight = columns.reduce((sum, col) => sum + colWeight(col), 0);\n const styles: Record<number, { cellWidth: number }> = {};\n columns.forEach((col, i) => {\n styles[i] = { cellWidth: (colWeight(col) / totalWeight) * usableWidth };\n });\n return styles;\n}\n\nfunction formatFilterSummary<R extends GridRowModel>(\n filterModel: GridFilterModel,\n columns: GridColDef<R>[]\n): string {\n if (!filterModel.items || filterModel.items.length === 0) return '';\n return filterModel.items\n .flatMap(item => {\n // Only handle leaf GridFilterItem — skip GridFilterGroup (which has 'items')\n if ('items' in item) return [];\n const col = columns.find(c => c.field === item.field);\n const label = col?.headerName ?? item.field;\n const val = item.value !== undefined && item.value !== null ? String(item.value) : '';\n return [`${label} ${item.operator} \"${val}\"`];\n })\n .join(' • ');\n}\n\nexport async function exportToPdf<R extends GridRowModel>(\n rows: R[],\n columns: GridColDef<R>[],\n options: PdfExportOptions = {}\n): Promise<void> {\n // Lazy-load peer deps — provides a clear error if not installed\n let JsPDF: new (opts: Record<string, unknown>) => JsPDFDoc;\n let autoTable: (doc: JsPDFDoc, opts: AutoTableOptions) => void;\n try {\n const [jspdfMod, autoTableMod] = await Promise.all([\n import('jspdf'),\n import('jspdf-autotable'),\n ]);\n JsPDF = jspdfMod.default as unknown as new (opts: Record<string, unknown>) => JsPDFDoc;\n autoTable = autoTableMod.default as unknown as (doc: JsPDFDoc, opts: AutoTableOptions) => void;\n } catch {\n throw new Error(\n \"exportToPdf requires 'jspdf' and 'jspdf-autotable'. Run: npm install jspdf jspdf-autotable\"\n );\n }\n\n const {\n fileName = 'export',\n title,\n logoUrl,\n orientation = 'landscape',\n selectedRows,\n aggregationResult,\n aggregationModel,\n filterModel,\n alternateRowColor = true,\n headerBackgroundColor = '#4f46e5',\n headerTextColor = '#ffffff',\n fontSize = 9,\n groupedRows,\n } = options;\n\n const doc = new JsPDF({ orientation, unit: 'mm', format: 'a4' });\n const pageWidth = doc.internal.pageSize.getWidth();\n const pageHeight = doc.internal.pageSize.getHeight();\n const MARGIN = 14;\n const usableWidth = pageWidth - MARGIN * 2;\n\n const exportColumns = getExportColumns(columns);\n const rowsToExport = selectedRows && selectedRows.length > 0\n ? rows.filter(r => selectedRows.includes(r.id as string | number))\n : rows;\n\n // --- Header block ---\n let startY = MARGIN;\n\n if (title) {\n let cursorX = MARGIN;\n let cursorY = MARGIN + 8;\n\n if (logoUrl) {\n try {\n doc.addImage(logoUrl, 'PNG', cursorX, MARGIN, 10, 10);\n cursorX += 14;\n } catch {\n // logo failed to load — skip silently\n }\n }\n\n doc.setFontSize(16);\n doc.setFont('helvetica', 'bold');\n doc.setTextColor(30, 41, 59);\n doc.text(title, cursorX, cursorY);\n cursorY += 6;\n\n doc.setFontSize(8);\n doc.setFont('helvetica', 'normal');\n doc.setTextColor(100, 116, 139);\n const exportedAt = new Date().toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' });\n const rowCount = groupedRows\n ? groupedRows.filter(e => e.type === 'leaf').length\n : rowsToExport.length;\n doc.text(\n `Exported: ${exportedAt} • ${rowCount} row${rowCount !== 1 ? 's' : ''}`,\n cursorX,\n cursorY\n );\n cursorY += 5;\n\n if (filterModel) {\n const summary = formatFilterSummary(filterModel, columns);\n if (summary) {\n doc.text(`Filters: ${summary}`, cursorX, cursorY);\n cursorY += 5;\n }\n }\n\n doc.setDrawColor(226, 232, 240);\n doc.setLineWidth(0.3);\n doc.line(MARGIN, cursorY + 2, pageWidth - MARGIN, cursorY + 2);\n startY = cursorY + 6;\n }\n\n // --- Build table data ---\n const head = [exportColumns.map(col => col.headerName ?? col.field)];\n\n let body: string[][];\n let foot: string[][] | undefined;\n\n if (groupedRows && groupedRows.length > 0) {\n // Grouped export: flatten the ordered list into body rows with indentation\n body = [];\n const aggMod = aggregationModel || {};\n groupedRows.forEach((entry: GridGroupedExportRow) => {\n if (entry.type === 'group-header') {\n const indent = ' '.repeat(entry.depth * 2);\n const label = `${indent}${entry.groupField ?? ''}: ${String(entry.groupValue ?? '')}`;\n body.push(exportColumns.map((_, i) => i === 0 ? label : ''));\n } else if (entry.type === 'leaf' && entry.row) {\n const row = entry.row as R;\n const indent = ' '.repeat(entry.depth * 2);\n body.push(exportColumns.map((col, i) => (i === 0 ? indent : '') + resolveValue(row, col)));\n } else if (entry.type === 'group-subtotal' && entry.aggregatedValues) {\n const indent = ' '.repeat(entry.depth * 2);\n body.push(exportColumns.map((col, i) => {\n if (i === 0) return `${indent}Subtotal`;\n const aggVal = entry.aggregatedValues![col.field];\n if (aggVal === undefined || aggVal === null) return '';\n let formatted: unknown = aggVal;\n if (col.valueFormatter) formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n else if (aggMod[col.field]) formatted = formatAggregationValue(aggVal, aggMod[col.field] as string);\n return String(formatted);\n }));\n } else if (entry.type === 'grand-total' && entry.aggregatedValues) {\n const footRow = exportColumns.map((col, i) => {\n if (i === 0) return 'Grand Total';\n const aggVal = entry.aggregatedValues![col.field];\n if (aggVal === undefined || aggVal === null) return '';\n let formatted: unknown = aggVal;\n if (col.valueFormatter) formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n else if (aggMod[col.field]) formatted = formatAggregationValue(aggVal, aggMod[col.field] as string);\n return String(formatted);\n });\n foot = [footRow];\n }\n });\n } else {\n body = rowsToExport.map(row => exportColumns.map(col => resolveValue(row, col)));\n\n if (aggregationResult && aggregationModel) {\n const footRow = exportColumns.map((col, i) => {\n if (i === 0) {\n const hasAgg = exportColumns.some(c => aggregationModel[c.field]);\n return hasAgg ? 'TOTAL' : '';\n }\n const aggVal = aggregationResult[col.field];\n if (aggVal === undefined || aggVal === null) return '';\n let formatted: unknown = aggVal;\n if (col.valueFormatter) {\n formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n } else if (aggregationModel[col.field]) {\n formatted = formatAggregationValue(aggVal, aggregationModel[col.field] as string);\n }\n return String(formatted);\n });\n foot = [footRow];\n }\n }\n\n // --- Column widths ---\n const columnStyles = computeColumnStyles(exportColumns, usableWidth);\n\n const [hr, hg, hb] = hexToRgb(headerBackgroundColor);\n const [tr, tg, tb] = hexToRgb(headerTextColor);\n\n autoTable(doc, {\n head,\n body,\n ...(foot ? { foot } : {}),\n startY,\n styles: { fontSize, cellPadding: 3, font: 'helvetica', overflow: 'linebreak' },\n headStyles: {\n fillColor: [hr, hg, hb],\n textColor: [tr, tg, tb],\n fontStyle: 'bold',\n },\n ...(alternateRowColor\n ? { alternateRowStyles: { fillColor: [248, 250, 252] } }\n : {}),\n ...(foot\n ? { footStyles: { fillColor: [241, 245, 249], fontStyle: 'bold', textColor: [0, 0, 0] } }\n : {}),\n columnStyles,\n showFoot: foot ? 'lastPage' : 'never',\n showHead: 'everyPage',\n margin: { top: MARGIN, left: MARGIN, right: MARGIN, bottom: MARGIN + 6 },\n });\n\n // Two-pass page numbering — stamp all pages after the table is fully rendered\n // so each stamp reads the correct final total (not the running count during draw)\n const totalPages = doc.getNumberOfPages();\n for (let i = 1; i <= totalPages; i++) {\n doc.setPage(i);\n doc.setFontSize(8);\n doc.setTextColor(150, 150, 150);\n doc.text(\n `Page ${i} of ${totalPages}`,\n pageWidth - MARGIN,\n pageHeight - 8,\n { align: 'right' }\n );\n }\n\n doc.save(`${fileName}.pdf`);\n}\n","\nimport type { GridColDef, GridRowModel, GridAggregationModel, GridGroupedExportRow } from '../../types';\nimport { formatAggregationValue } from '../../hooks/features/useAggregation';\n\nexport interface CsvExportOptions {\n fileName?: string;\n includeHeaders?: boolean;\n delimiter?: string;\n selectedRows?: (string | number)[];\n aggregationResult?: Record<string, unknown> | null;\n aggregationModel?: GridAggregationModel | null;\n /** When provided, emits group headers, leaf rows, subtotals, and a grand total instead of a flat row list. */\n groupedRows?: GridGroupedExportRow[];\n}\n\nexport function exportToCsv<R extends GridRowModel>(\n rows: R[],\n columns: GridColDef<R>[],\n options: CsvExportOptions = {}\n): void {\n const {\n fileName = 'export.csv',\n includeHeaders = true,\n delimiter = ',',\n selectedRows,\n groupedRows,\n } = options;\n\n const exportColumns = columns.filter(col => {\n if (col.exportable === false) return false;\n if (col.field === '__check__' || col.field === '__actions__') return false;\n return true;\n });\n\n let csvContent = '';\n\n if (groupedRows && groupedRows.length > 0) {\n // Grouped export path\n if (includeHeaders) {\n csvContent += exportColumns.map(col => escapeCSV(col.headerName || col.field)).join(delimiter) + '\\n';\n }\n groupedRows.forEach(entry => {\n if (entry.type === 'group-header') {\n const indent = ' '.repeat(entry.depth);\n const label = `${indent}${entry.groupField ?? ''}: ${String(entry.groupValue ?? '')}`;\n const cells = exportColumns.map((_, i) => i === 0 ? escapeCSV(label) : '');\n csvContent += cells.join(delimiter) + '\\n';\n } else if (entry.type === 'leaf' && entry.row) {\n const row = entry.row as R;\n const indent = ' '.repeat(entry.depth);\n const cells = exportColumns.map((col, i) => {\n let value: unknown = (row as GridRowModel)[col.field];\n if (col.valueGetter) value = col.valueGetter({ row, field: col.field, value });\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n return escapeCSV((i === 0 ? indent : '') + String(value ?? ''));\n });\n csvContent += cells.join(delimiter) + '\\n';\n } else if (entry.type === 'group-subtotal' && entry.aggregatedValues) {\n const indent = ' '.repeat(entry.depth);\n const aggModel = options.aggregationModel || {};\n const cells = exportColumns.map((col, i) => {\n if (i === 0) return escapeCSV(`${indent}Subtotal`);\n const aggVal = entry.aggregatedValues![col.field];\n if (aggVal !== undefined && aggVal !== null) {\n let formatted: unknown = aggVal;\n if (col.valueFormatter) {\n formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n } else if (aggModel[col.field]) {\n formatted = formatAggregationValue(aggVal, aggModel[col.field]);\n }\n return escapeCSV(String(formatted));\n }\n return '';\n });\n csvContent += cells.join(delimiter) + '\\n';\n } else if (entry.type === 'grand-total' && entry.aggregatedValues) {\n const aggModel = options.aggregationModel || {};\n const cells = exportColumns.map((col, i) => {\n if (i === 0) return escapeCSV('Grand Total');\n const aggVal = entry.aggregatedValues![col.field];\n if (aggVal !== undefined && aggVal !== null) {\n let formatted: unknown = aggVal;\n if (col.valueFormatter) {\n formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n } else if (aggModel[col.field]) {\n formatted = formatAggregationValue(aggVal, aggModel[col.field]);\n }\n return escapeCSV(String(formatted));\n }\n return '';\n });\n csvContent += cells.join(delimiter) + '\\n';\n }\n });\n } else {\n // Flat export path (existing behavior)\n const rowsToExport = selectedRows && selectedRows.length > 0\n ? rows.filter(r => selectedRows.includes(r.id))\n : rows;\n\n if (rowsToExport.length === 0) {\n console.warn('No rows to export');\n return;\n }\n\n if (includeHeaders) {\n csvContent += exportColumns.map(col => escapeCSV(col.headerName || col.field)).join(delimiter) + '\\n';\n }\n\n rowsToExport.forEach(row => {\n const values = exportColumns.map(col => {\n let value: unknown = (row as GridRowModel)[col.field];\n if (col.valueGetter) value = col.valueGetter({ row, field: col.field, value });\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n return escapeCSV(String(value ?? ''));\n });\n csvContent += values.join(delimiter) + '\\n';\n });\n\n if (options.aggregationResult) {\n const aggResult = options.aggregationResult;\n const aggModel = options.aggregationModel || {};\n const aggLabels = exportColumns.map(col => escapeCSV(aggModel[col.field] ? aggModel[col.field].toUpperCase() : ''));\n csvContent += aggLabels.join(delimiter) + '\\n';\n const aggValues = exportColumns.map(col => {\n const aggVal = aggResult[col.field];\n if (aggVal !== undefined && aggVal !== null) {\n let formatted: unknown = aggVal;\n if (col.valueFormatter) formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n else if (aggModel[col.field]) formatted = formatAggregationValue(aggVal, aggModel[col.field]);\n return escapeCSV(String(formatted));\n }\n return '';\n });\n csvContent += aggValues.join(delimiter) + '\\n';\n }\n }\n\n downloadFile(csvContent, fileName, 'text/csv;charset=utf-8;');\n}\n\nfunction escapeCSV(value: string): string {\n if (value.includes(',') || value.includes('\"') || value.includes('\\n')) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n}\n\nexport interface ExcelExportOptions {\n fileName?: string;\n sheetName?: string;\n includeHeaders?: boolean;\n selectedRows?: (string | number)[];\n aggregationResult?: Record<string, unknown> | null;\n aggregationModel?: GridAggregationModel | null;\n /** When provided, emits group headers, leaf rows, subtotals, and a grand total instead of a flat row list. */\n groupedRows?: GridGroupedExportRow[];\n}\n\nexport function exportToExcel<R extends GridRowModel>(\n rows: R[],\n columns: GridColDef<R>[],\n options: ExcelExportOptions = {}\n): void {\n const {\n fileName = 'export.xls',\n sheetName = 'Sheet1',\n includeHeaders = true,\n selectedRows,\n groupedRows,\n } = options;\n\n const exportColumns = columns.filter(col => {\n if (col.exportable === false) return false;\n if (col.field === '__check__' || col.field === '__actions__') return false;\n return true;\n });\n\n const header = '<html xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:x=\"urn:schemas-microsoft-com:office:excel\" xmlns=\"http://www.w3.org/TR/REC-html40\">'\n + '<head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>'\n + `<x:Name>${sheetName}</x:Name>`\n + '<x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]-->'\n + '<meta charset=\"UTF-8\"></head><body><table border=\"1\">';\n\n let html = header;\n\n if (includeHeaders) {\n html += '<thead><tr>';\n exportColumns.forEach(col => { html += `<th>${escapeHTML(col.headerName || col.field)}</th>`; });\n html += '</tr></thead>';\n }\n\n html += '<tbody>';\n\n if (groupedRows && groupedRows.length > 0) {\n const aggModel = options.aggregationModel || {};\n groupedRows.forEach(entry => {\n if (entry.type === 'group-header') {\n const indent = ' '.repeat(entry.depth * 2);\n const label = `${indent}${entry.groupField ?? ''}: ${String(entry.groupValue ?? '')}`;\n html += `<tr style=\"font-weight:bold;background:#e8eaf6;\">`;\n html += `<td colspan=\"${exportColumns.length}\">${escapeHTML(label)}</td>`;\n html += '</tr>';\n } else if (entry.type === 'leaf' && entry.row) {\n const row = entry.row as R;\n const indent = ' '.repeat(entry.depth * 2);\n html += '<tr>';\n exportColumns.forEach((col, i) => {\n let value: unknown = (row as GridRowModel)[col.field];\n if (col.valueGetter) value = col.valueGetter({ row, field: col.field, value });\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n html += `<td>${escapeHTML((i === 0 ? indent : '') + String(value ?? ''))}</td>`;\n });\n html += '</tr>';\n } else if ((entry.type === 'group-subtotal' || entry.type === 'grand-total') && entry.aggregatedValues) {\n const isGrand = entry.type === 'grand-total';\n const indent = isGrand ? '' : ' '.repeat(entry.depth * 2);\n const label = isGrand ? 'Grand Total' : `${indent}Subtotal`;\n html += `<tr style=\"font-weight:bold;background:#f5f5f5;\">`;\n exportColumns.forEach((col, i) => {\n if (i === 0) { html += `<td>${escapeHTML(label)}</td>`; return; }\n const aggVal = entry.aggregatedValues![col.field];\n if (aggVal !== undefined && aggVal !== null) {\n let formatted: unknown = aggVal;\n if (col.valueFormatter) formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n else if (aggModel[col.field]) formatted = formatAggregationValue(aggVal, aggModel[col.field]);\n html += `<td style=\"text-align:right;\">${escapeHTML(String(formatted))}</td>`;\n } else {\n html += '<td></td>';\n }\n });\n html += '</tr>';\n }\n });\n } else {\n const rowsToExport = selectedRows && selectedRows.length > 0\n ? rows.filter(r => selectedRows.includes(r.id))\n : rows;\n\n if (rowsToExport.length === 0) {\n console.warn('No rows to export');\n return;\n }\n\n rowsToExport.forEach(row => {\n html += '<tr>';\n exportColumns.forEach(col => {\n let value: unknown = (row as GridRowModel)[col.field];\n if (col.valueGetter) value = col.valueGetter({ row, field: col.field, value });\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n html += `<td>${escapeHTML(String(value ?? ''))}</td>`;\n });\n html += '</tr>';\n });\n\n if (options.aggregationResult) {\n const aggResult = options.aggregationResult;\n const aggModel = options.aggregationModel || {};\n html += '<tr style=\"font-size: 11px; color: #666; background-color: #f5f5f5;\">';\n exportColumns.forEach(col => {\n html += aggModel[col.field]\n ? `<td style=\"text-align:right;font-weight:bold;\">${escapeHTML(aggModel[col.field].toUpperCase())}</td>`\n : '<td></td>';\n });\n html += '</tr><tr style=\"font-weight:bold;background-color:#f5f5f5;\">';\n exportColumns.forEach(col => {\n const aggVal = aggResult[col.field];\n if (aggVal !== undefined && aggVal !== null) {\n let formatted: unknown = aggVal;\n if (col.valueFormatter) formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n else if (aggModel[col.field]) formatted = formatAggregationValue(aggVal, aggModel[col.field]);\n html += `<td style=\"text-align:right;\">${escapeHTML(String(formatted))}</td>`;\n } else {\n html += '<td></td>';\n }\n });\n html += '</tr>';\n }\n }\n\n html += '</tbody></table></body></html>';\n downloadFile(html, fileName, 'application/vnd.ms-excel');\n}\n\nfunction escapeHTML(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\n// ============================================================================\n// JSON Export\n// ============================================================================\n\nexport interface JsonExportOptions {\n fileName?: string;\n pretty?: boolean;\n selectedRows?: (string | number)[];\n aggregationResult?: Record<string, unknown> | null;\n aggregationModel?: GridAggregationModel | null;\n /** When provided, emits a nested grouping tree instead of a flat array. */\n groupedRows?: GridGroupedExportRow[];\n}\n\n/**\n * Export data to JSON format\n */\nexport function exportToJson<R extends GridRowModel>(\n rows: R[],\n columns: GridColDef<R>[],\n options: JsonExportOptions = {}\n): void {\n const {\n fileName = 'export.json',\n pretty = true,\n selectedRows,\n groupedRows,\n } = options;\n\n const exportColumns = columns.filter(col => {\n if (col.exportable === false) return false;\n if (col.field === '__check__' || col.field === '__actions__') return false;\n return true;\n });\n\n type GroupNode = {\n group: string;\n field: string;\n value: unknown;\n rows: Record<string, unknown>[];\n subtotals?: Record<string, unknown>;\n children?: GroupNode[];\n };\n\n type JsonPayload =\n | Record<string, unknown>[]\n | { data: Record<string, unknown>[]; aggregation: { labels: Record<string, unknown>; values: Record<string, unknown> } }\n | { groups: GroupNode[]; grandTotal?: Record<string, unknown> };\n\n let outData: JsonPayload;\n\n if (groupedRows && groupedRows.length > 0) {\n // Build nested tree from the flat ordered list\n const stack: GroupNode[] = [];\n const roots: GroupNode[] = [];\n let grandTotal: Record<string, unknown> | undefined;\n\n groupedRows.forEach(entry => {\n if (entry.type === 'group-header') {\n const node: GroupNode = {\n group: `${entry.groupField ?? ''}: ${String(entry.groupValue ?? '')}`,\n field: entry.groupField ?? '',\n value: entry.groupValue,\n rows: [],\n children: [],\n };\n while (stack.length > entry.depth) stack.pop();\n if (stack.length === 0) {\n roots.push(node);\n } else {\n (stack[stack.length - 1].children ??= []).push(node);\n }\n stack.push(node);\n } else if (entry.type === 'leaf' && entry.row) {\n const row = entry.row as R;\n const obj: Record<string, unknown> = {};\n exportColumns.forEach(col => {\n let value: unknown = (row as GridRowModel)[col.field];\n if (col.valueGetter) value = col.valueGetter({ row, field: col.field, value });\n obj[col.field] = value;\n });\n if (stack.length > 0) stack[stack.length - 1].rows.push(obj);\n } else if (entry.type === 'group-subtotal' && entry.aggregatedValues && stack.length > 0) {\n stack[stack.length - 1].subtotals = { ...entry.aggregatedValues };\n stack.pop();\n } else if (entry.type === 'grand-total' && entry.aggregatedValues) {\n grandTotal = { ...entry.aggregatedValues };\n }\n });\n\n outData = grandTotal ? { groups: roots, grandTotal } : { groups: roots };\n } else {\n const rowsToExport = selectedRows && selectedRows.length > 0\n ? rows.filter(r => selectedRows.includes(r.id))\n : rows;\n\n if (rowsToExport.length === 0) {\n console.warn('No rows to export');\n return;\n }\n\n const data = rowsToExport.map(row => {\n const obj: Record<string, unknown> = {};\n exportColumns.forEach(col => {\n let value: unknown = (row as GridRowModel)[col.field];\n if (col.valueGetter) value = col.valueGetter({ row, field: col.field, value });\n obj[col.field] = value;\n });\n return obj;\n });\n\n if (options.aggregationResult) {\n const aggResult = options.aggregationResult;\n const aggModel = options.aggregationModel || {};\n const summaryLabelObj: Record<string, unknown> = {};\n exportColumns.forEach(col => { if (aggModel[col.field]) summaryLabelObj[col.field] = aggModel[col.field].toUpperCase(); });\n const summaryDataObj: Record<string, unknown> = {};\n exportColumns.forEach(col => {\n if (aggResult[col.field] !== undefined && aggResult[col.field] !== null) {\n let aggVal: unknown = aggResult[col.field];\n if (col.valueFormatter) aggVal = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n else if (aggModel[col.field]) aggVal = formatAggregationValue(aggVal, aggModel[col.field]);\n summaryDataObj[col.field] = aggVal;\n }\n });\n outData = { data, aggregation: { labels: summaryLabelObj, values: summaryDataObj } };\n } else {\n outData = data;\n }\n }\n\n downloadFile(pretty ? JSON.stringify(outData, null, 2) : JSON.stringify(outData), fileName, 'application/json;charset=utf-8;');\n}\n\n// ============================================================================\n// Print\n// ============================================================================\n\nexport interface PrintOptions {\n title?: string;\n selectedRows?: (string | number)[];\n aggregationResult?: Record<string, unknown> | null;\n aggregationModel?: GridAggregationModel | null;\n /** When provided, emits group headers, leaf rows, subtotals, and a grand total instead of a flat row list. */\n groupedRows?: GridGroupedExportRow[];\n}\n\n/**\n * Open print dialog with formatted table\n */\nexport async function printGrid<R extends GridRowModel>(\n rows: R[],\n columns: GridColDef<R>[],\n titleOrOptions?: string | PrintOptions\n): Promise<void> {\n // 1. Open window immediately to resolve user activation constraints and provide feedback\n const printWindow = window.open('', '_blank');\n\n if (!printWindow) {\n console.error('Failed to open print window. Please check your popup blocker settings.');\n return;\n }\n\n // 2. Show loading state\n printWindow.document.write(`\n <!DOCTYPE html>\n <html>\n <head>\n <title>Preparing Print...</title>\n <style>\n body { font-family: sans-serif; height: 100vh; display: flex; align-items: center; justify-content: center; margin: 0; background: #f5f5f5; }\n .loader { text-align: center; }\n .spinner { border: 4px solid #f3f3f3; border-top: 4px solid #3498db; border-radius: 50%; width: 40px; height: 40px; animation: spin 1s linear infinite; margin: 0 auto 20px; }\n @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }\n </style>\n </head>\n <body>\n <div class=\"loader\">\n <div class=\"spinner\"></div>\n <h2>Generating Print Preview...</h2>\n <p>Processing data, please wait.</p>\n </div>\n </body>\n </html>\n `);\n printWindow.document.close();\n\n // 3. Yield to main thread to allow the new window to render its loading state\n await new Promise(resolve => setTimeout(resolve, 100));\n\n try {\n let title = 'Print';\n let selectedRows: (string | number)[] | undefined;\n let aggregationResult: Record<string, unknown> | null = null;\n let aggregationModel: GridAggregationModel | null = null;\n\n let groupedRows: GridGroupedExportRow[] | undefined;\n\n if (typeof titleOrOptions === 'string') {\n title = titleOrOptions;\n } else if (typeof titleOrOptions === 'object') {\n title = titleOrOptions.title || 'Print';\n selectedRows = titleOrOptions.selectedRows;\n aggregationResult = titleOrOptions.aggregationResult || null;\n aggregationModel = titleOrOptions.aggregationModel || null;\n groupedRows = titleOrOptions.groupedRows;\n }\n\n const exportColumns = columns.filter(col => {\n if (col.exportable === false) return false;\n if (col.field === '__check__' || col.field === '__actions__') return false;\n return true;\n });\n\n let html = `<!DOCTYPE html><html><head><title>${title || 'Print'}</title><style>\n body{font-family:Arial,sans-serif;margin:20px;}\n h1{font-size:24px;margin-bottom:20px;}\n table{border-collapse:collapse;width:100%;}\n th,td{border:1px solid #ddd;padding:8px;text-align:left;}\n th{background-color:#f5f5f5;font-weight:bold;}\n tr:nth-child(even){background-color:#f9f9f9;}\n .group-header{background:#e8eaf6;font-weight:bold;}\n .group-subtotal{background:#f0f4ff;font-style:italic;}\n .grand-total{background:#f5f5f5;font-weight:bold;}\n @media print{body{margin:0;}@page{margin:1cm;}}\n </style></head><body>`;\n\n if (title) html += `<h1>${escapeHTML(title)}</h1>`;\n html += '<table><thead><tr>';\n exportColumns.forEach(col => { html += `<th>${escapeHTML(col.headerName || col.field)}</th>`; });\n html += '</tr></thead><tbody>';\n\n if (groupedRows && groupedRows.length > 0) {\n const aggModel = aggregationModel || {};\n groupedRows.forEach(entry => {\n if (entry.type === 'group-header') {\n const indent = ' '.repeat(entry.depth * 4);\n const label = `${indent}${escapeHTML(entry.groupField ?? '')}: ${escapeHTML(String(entry.groupValue ?? ''))}`;\n html += `<tr class=\"group-header\"><td colspan=\"${exportColumns.length}\">${label}</td></tr>`;\n } else if (entry.type === 'leaf' && entry.row) {\n const row = entry.row as R;\n const indent = ' '.repeat(entry.depth * 4);\n html += '<tr>';\n exportColumns.forEach((col, i) => {\n let value: unknown = (row as GridRowModel)[col.field];\n if (col.valueGetter) value = col.valueGetter({ row, field: col.field, value });\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n if (col.type === 'image' && value) {\n html += `<td><img src=\"${value}\" style=\"max-height:40px;border-radius:4px;\"></td>`;\n } else {\n html += `<td>${(i === 0 ? indent : '') + escapeHTML(String(value ?? ''))}</td>`;\n }\n });\n html += '</tr>';\n } else if ((entry.type === 'group-subtotal' || entry.type === 'grand-total') && entry.aggregatedValues) {\n const isGrand = entry.type === 'grand-total';\n const indent = isGrand ? '' : ' '.repeat(entry.depth * 4);\n const label = isGrand ? 'Grand Total' : `${indent}Subtotal`;\n const cls = isGrand ? 'grand-total' : 'group-subtotal';\n html += `<tr class=\"${cls}\">`;\n exportColumns.forEach((col, i) => {\n if (i === 0) { html += `<td>${label}</td>`; return; }\n const aggVal = entry.aggregatedValues![col.field];\n if (aggVal !== undefined && aggVal !== null) {\n let formatted: unknown = aggVal;\n if (col.valueFormatter) formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n else if (aggModel[col.field]) formatted = formatAggregationValue(aggVal, aggModel[col.field]);\n html += `<td style=\"text-align:right;\">${escapeHTML(String(formatted))}</td>`;\n } else {\n html += '<td></td>';\n }\n });\n html += '</tr>';\n }\n });\n } else {\n const rowsToExport = selectedRows && selectedRows.length > 0\n ? rows.filter(r => selectedRows.includes(r.id))\n : rows;\n\n if (rowsToExport.length === 0) {\n printWindow.document.body.innerHTML = '<h3>No rows to export</h3>';\n return;\n }\n\n rowsToExport.forEach(row => {\n html += '<tr>';\n exportColumns.forEach(col => {\n let value: unknown = (row as GridRowModel)[col.field];\n if (col.valueGetter) value = col.valueGetter({ row, field: col.field, value });\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n if (col.type === 'image' && value) {\n html += `<td><div style=\"display:flex;justify-content:center;\"><img src=\"${value}\" alt=\"${col.headerName}\" style=\"max-height:40px;border-radius:4px;\"></div></td>`;\n } else {\n html += `<td>${escapeHTML(String(value ?? ''))}</td>`;\n }\n });\n html += '</tr>';\n });\n\n if (aggregationResult) {\n const aggModel = aggregationModel || {};\n html += '<tfoot><tr style=\"font-size:11px;color:#666;background-color:#f5f5f5;\">';\n exportColumns.forEach(col => {\n html += aggModel[col.field]\n ? `<td style=\"text-align:right;font-weight:bold;\">${escapeHTML(aggModel[col.field].toUpperCase())}</td>`\n : '<td></td>';\n });\n html += '</tr><tr style=\"font-weight:bold;background-color:#f5f5f5;\">';\n exportColumns.forEach(col => {\n const aggVal = aggregationResult![col.field];\n if (aggVal !== undefined && aggVal !== null) {\n let formatted: unknown = aggVal;\n if (col.valueFormatter) formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n else if (aggModel[col.field]) formatted = formatAggregationValue(aggVal, aggModel[col.field]);\n html += `<td style=\"text-align:right;\">${escapeHTML(String(formatted))}</td>`;\n } else {\n html += '<td></td>';\n }\n });\n html += '</tr></tfoot>';\n }\n }\n\n html += '</tbody></table></body></html>';\n\n // Write the HTML content\n printWindow.document.open();\n printWindow.document.write(html);\n printWindow.document.close();\n\n // Set the document title explicitly (fixes about:blank issue)\n printWindow.document.title = title || 'Print Preview';\n\n printWindow.focus();\n\n let hasPrinted = false;\n\n printWindow.onload = () => {\n if (!hasPrinted) {\n hasPrinted = true;\n printWindow.print();\n\n setTimeout(() => {\n printWindow.close();\n }, 100);\n }\n };\n\n setTimeout(() => {\n if (!hasPrinted && printWindow && !printWindow.closed) {\n hasPrinted = true;\n printWindow.print();\n setTimeout(() => {\n if (!printWindow.closed) printWindow.close();\n }, 100);\n }\n }, 500);\n\n } catch (e) {\n console.error('Print generation failed:', e);\n if (printWindow && !printWindow.closed) {\n const message = e instanceof Error ? e.message : String(e);\n printWindow.document.body.innerHTML = `<div style=\"color: red; padding: 20px;\"><h3>Error Generating Print Preview</h3><p>${message}</p></div>`;\n }\n }\n}\n\nfunction downloadFile(content: string, fileName: string, mimeType: string): void {\n const blob = new Blob([content], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = fileName;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n}\n\nexport { exportToPdf } from './exportToPdf';\nexport type { PdfExportOptions } from '../../types';\n","\nimport type { GridColDef, GridRowModel, GridAggregationModel } from '../../types';\nimport { formatAggregationValue } from '../../hooks/features/useAggregation';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface ExcelColumnStyle {\n /** Numeric format string, e.g. '$#,##0.00', '0.00%', 'yyyy-mm-dd' */\n numFmt?: string;\n /** Override column width (characters). Defaults to colDef.width / 7 */\n width?: number;\n /** Horizontal alignment override */\n alignment?: 'left' | 'center' | 'right';\n /**\n * If true, the cell value (expected to be an image URL string) will be\n * fetched and embedded as an inline image in the cell.\n * Requires the image server to serve CORS headers. Falls back to the\n * raw URL string if the fetch fails (a warning is logged to the console).\n */\n embedImage?: boolean;\n /** Width of the embedded image in pixels (default: 40) */\n imageWidth?: number;\n /** Height of the embedded image in pixels (default: 40) */\n imageHeight?: number;\n}\n\nexport interface ExcelSheetDefinition {\n /** Sheet tab name (max 31 chars) */\n name: string;\n /** Which rows to include. Default: 'all' */\n rows?: 'all' | 'selected';\n /** Include header row. Default: true */\n includeHeaders?: boolean;\n /** Include aggregation totals row at the bottom. Default: false */\n includeSummary?: boolean;\n /** Auto-filter dropdowns on header row. Default: true */\n autoFilter?: boolean;\n /** Freeze the header row. Default: true */\n frozenHeader?: boolean;\n /** Alternate row fill (#hex). Pass false to disable. Default: '#f8fafc' */\n alternateRowColor?: string | false;\n}\n\nexport interface ExcelAdvancedExportOptions {\n /** Output filename (default: 'export.xlsx') */\n fileName?: string;\n /**\n * Sheet definitions. If omitted, a single 'Data' sheet is created\n * with all rows.\n *\n * Built-in special sheet type: `{ type: 'summary' }` renders a\n * standalone aggregation sheet.\n */\n sheets?: (ExcelSheetDefinition | { type: 'summary'; name?: string })[]; \n /** Per-column style overrides, keyed by field name */\n columnStyles?: Record<string, ExcelColumnStyle>;\n /** Header row fill color (default: '#f1f5f9') */\n headerFillColor?: string;\n /** Header row text color (default: '#334155') */\n headerTextColor?: string;\n /** Header row font size (default: 10) */\n headerFontSize?: number;\n /** Body font size (default: 10) */\n bodyFontSize?: number;\n /** Current aggregation result */\n aggregationResult?: Record<string, unknown> | null;\n /** Current aggregation model */\n aggregationModel?: GridAggregationModel | null;\n /** Currently selected row IDs */\n selectedRows?: (string | number)[];\n}\n\n// ─── Cell type inference ──────────────────────────────────────────────────────\n\nfunction inferCellType(colDef: GridColDef<GridRowModel>, value: unknown): 'number' | 'boolean' | 'date' | 'string' {\n if (colDef.type === 'number') return 'number';\n if (colDef.type === 'boolean') return 'boolean';\n if (colDef.type === 'date') return 'date';\n if (typeof value === 'number') return 'number';\n if (typeof value === 'boolean') return 'boolean';\n if (value instanceof Date) return 'date';\n return 'string';\n}\n\n// ─── Default numFmt per column type ──────────────────────────────────────────\n\nfunction defaultNumFmt(colDef: GridColDef<GridRowModel>): string | undefined {\n if (colDef.type === 'number') return '#,##0.##';\n if (colDef.type === 'date') return 'yyyy-mm-dd';\n return undefined;\n}\n\n// ─── Column display width (chars) ────────────────────────────────────────────\n\nfunction colWidth(colDef: GridColDef<GridRowModel>, override?: number): number {\n if (override != null) return override;\n const px = (colDef.width ?? 120) as number;\n return Math.min(60, Math.max(8, (px - 5) / 7));\n}\n\n// ─── Image helpers ────────────────────────────────────────────────────────────\n\ntype SupportedImageExt = 'png' | 'jpeg' | 'gif';\n\nfunction imageExtension(url: string, contentType?: string | null): SupportedImageExt {\n const ct = contentType ?? '';\n if (ct.includes('jpeg') || ct.includes('jpg')) return 'jpeg';\n if (ct.includes('gif')) return 'gif';\n const path = url.split('?')[0].toLowerCase();\n if (path.endsWith('.jpg') || path.endsWith('.jpeg')) return 'jpeg';\n if (path.endsWith('.gif')) return 'gif';\n return 'png';\n}\n\n/**\n * Fetch a list of image URLs in parallel.\n * CORS failures are logged and skipped — raw URL text is written to the cell\n * instead so data is never silently lost.\n */\nasync function fetchImages(\n urls: string[]\n): Promise<Map<string, { buffer: ArrayBuffer; extension: SupportedImageExt }>> {\n const settled = await Promise.allSettled(\n urls.map(async (url) => {\n // ── data: URI — decode base64 directly, no network needed ──────────\n if (url.startsWith('data:')) {\n const commaIdx = url.indexOf(',');\n const header = url.slice(0, commaIdx);\n const b64 = url.slice(commaIdx + 1);\n const binary = atob(b64);\n const uint8 = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) uint8[i] = binary.charCodeAt(i);\n const mimeMatch = header.match(/data:([^;,]+)/);\n const mime = mimeMatch?.[1] ?? 'image/png';\n let ext: SupportedImageExt = 'png';\n if (mime.includes('jpeg') || mime.includes('jpg')) ext = 'jpeg';\n else if (mime.includes('gif')) ext = 'gif';\n return { url, buffer: uint8.buffer as ArrayBuffer, ext };\n }\n\n // ── Remote URL — fetch with CORS ──────────────────────────────────\n const res = await fetch(url, { mode: 'cors' });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const buffer = await res.arrayBuffer();\n const ext = imageExtension(url, res.headers.get('content-type'));\n return { url, buffer, ext };\n })\n );\n const map = new Map<string, { buffer: ArrayBuffer; extension: SupportedImageExt }>();\n settled.forEach((result, i) => {\n if (result.status === 'fulfilled') {\n map.set(result.value.url, { buffer: result.value.buffer, extension: result.value.ext });\n } else {\n console.warn(\n `[exportToExcelAdvanced] Cannot embed image \"${urls[i]}\" ` +\n `(CORS/network error — raw URL written as fallback):`,\n result.reason\n );\n }\n });\n return map;\n}\n\n// ─── Main export function ─────────────────────────────────────────────────────\n\n/**\n * Export the grid data to a real XLSX file using ExcelJS.\n * Supports: typed cells, styled headers, column widths, frozen rows,\n * auto-filter, alternating row colors, aggregation totals, and multi-sheet.\n *\n * ExcelJS is loaded lazily so it does not affect bundle size for apps\n * that only use CSV/JSON export.\n */\nexport async function exportToExcelAdvanced<R extends GridRowModel>(\n rows: R[],\n columns: GridColDef<R>[],\n options: ExcelAdvancedExportOptions = {}\n): Promise<void> {\n const {\n fileName = 'export.xlsx',\n sheets: sheetDefs,\n columnStyles = {},\n headerFillColor = '#f1f5f9',\n headerTextColor = '#334155',\n headerFontSize = 10,\n bodyFontSize = 10,\n aggregationResult = null,\n aggregationModel = null,\n selectedRows,\n } = options;\n\n // Lazy-load ExcelJS to keep initial bundle lean\n const ExcelJS = (await import('exceljs')).default;\n const workbook = new ExcelJS.Workbook();\n workbook.creator = 'OpenGridX';\n workbook.created = new Date();\n\n // Filter system columns\n const exportColumns: GridColDef<GridRowModel>[] = (columns as unknown as GridColDef<GridRowModel>[]).filter(col =>\n col.exportable !== false &&\n col.field !== '__check__' &&\n col.field !== '__actions__' &&\n !col.isSpacer\n );\n\n const allRows: GridRowModel[] = rows as GridRowModel[];\n const sRows: GridRowModel[] = (selectedRows && selectedRows.length > 0\n ? rows.filter(r => selectedRows.includes(r.id))\n : rows) as GridRowModel[];\n\n // Normalise sheet definitions\n const resolvedSheets: (ExcelSheetDefinition | { type: 'summary'; name?: string })[] =\n sheetDefs ?? [{ name: 'Data', rows: 'all', includeHeaders: true, includeSummary: false }];\n\n // Workbook-level image cache — one fetch per URL, reused across multiple sheets\n const imageCache = new Map<string, number>();\n\n // ─── Build each sheet ────────────────────────────────────────────────────\n\n for (const sheetDef of resolvedSheets) {\n\n // ── Summary-only sheet ───────────────────────────────────────────────\n if ('type' in sheetDef && sheetDef.type === 'summary') {\n if (!aggregationResult || !aggregationModel) continue;\n const ws = workbook.addWorksheet(sheetDef.name ?? 'Summary');\n\n // Title row\n ws.addRow(['Summary / Aggregation Totals']);\n ws.getRow(1).font = { bold: true, size: headerFontSize + 2, color: { argb: argb(headerTextColor) } };\n ws.addRow([]);\n\n // Header: Field | Function | Value\n const hdr = ws.addRow(['Column', 'Function', 'Value']);\n hdr.eachCell(cell => {\n cell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: argb(headerFillColor) } };\n cell.font = { bold: true, size: headerFontSize, color: { argb: argb(headerTextColor) } };\n cell.border = bottomBorder();\n });\n\n exportColumns.forEach(col => {\n const fn = aggregationModel![col.field];\n const val = aggregationResult![col.field];\n if (fn == null || val == null) return;\n let formatted = val;\n if (col.valueFormatter) {\n formatted = col.valueFormatter({ value: val, row: {} as R, field: col.field });\n } else {\n formatted = formatAggregationValue(val, fn);\n }\n const row = ws.addRow([col.headerName ?? col.field, fn.toUpperCase(), formatted]);\n row.getCell(3).alignment = { horizontal: 'right' };\n row.getCell(3).font = { bold: true, size: bodyFontSize };\n });\n\n ws.getColumn(1).width = 20;\n ws.getColumn(2).width = 12;\n ws.getColumn(3).width = 18;\n continue;\n }\n\n // ── Data sheet ───────────────────────────────────────────────────────\n const def = sheetDef as ExcelSheetDefinition;\n const {\n name = 'Data',\n rows: rowScope = 'all',\n includeHeaders = true,\n includeSummary = false,\n autoFilter = true,\n frozenHeader = true,\n alternateRowColor = '#f8fafc',\n } = def;\n\n const rowsToExport = rowScope === 'selected' ? sRows : allRows;\n\n // ─ Pre-fetch images for this sheet ──────────────────────────────────────────\n const imageColumns = exportColumns.filter(col => columnStyles[col.field]?.embedImage);\n if (imageColumns.length > 0) {\n const urlsNeeded: string[] = [];\n const seen = new Set<string>();\n rowsToExport.forEach(row => {\n imageColumns.forEach(col => {\n const val = row[col.field];\n if (typeof val === 'string' && val && !imageCache.has(val) && !seen.has(val)) {\n urlsNeeded.push(val);\n seen.add(val);\n }\n });\n });\n if (urlsNeeded.length > 0) {\n const fetched = await fetchImages(urlsNeeded);\n for (const [url, { buffer, extension }] of fetched) {\n const imgId = workbook.addImage({ buffer, extension });\n imageCache.set(url, imgId);\n }\n }\n }\n\n const ws = workbook.addWorksheet(name);\n\n // ── Set column definitions ───────────────────────────────────────────\n ws.columns = exportColumns.map(col => ({\n key: col.field,\n width: colWidth(col, columnStyles[col.field]?.width),\n style: {\n numFmt: columnStyles[col.field]?.numFmt ?? defaultNumFmt(col),\n }\n }));\n\n // ── Header row ───────────────────────────────────────────────────────\n if (includeHeaders) {\n const headerValues = exportColumns.map(col => col.headerName ?? col.field);\n const headerRow = ws.addRow(headerValues);\n headerRow.height = 20;\n\n headerRow.eachCell((cell, colIndex) => {\n const colDef = exportColumns[colIndex - 1];\n cell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: argb(headerFillColor) } };\n cell.font = { bold: true, size: headerFontSize, color: { argb: argb(headerTextColor) } };\n cell.alignment = {\n horizontal: columnStyles[colDef?.field]?.alignment ??\n (colDef?.type === 'number' ? 'right' : 'left'),\n vertical: 'middle'\n };\n cell.border = bottomBorder();\n });\n\n if (autoFilter) {\n ws.autoFilter = {\n from: { row: 1, column: 1 },\n to: { row: 1, column: exportColumns.length }\n };\n }\n\n if (frozenHeader) {\n ws.views = [{ state: 'frozen', ySplit: 1, showGridLines: false }];\n } else {\n ws.views = [{ showGridLines: false }];\n }\n }\n\n // ── Data rows ────────────────────────────────────────────────────────\n // ExcelJS addImage tl.row is 0-based.\n // Header occupies index 0 when present; first data row is at index 1.\n let excelRowIdx = includeHeaders ? 1 : 0;\n\n rowsToExport.forEach((row, rowIdx) => {\n const cellValues = exportColumns.map(col => {\n // Image columns: write empty string; image placed below\n if (columnStyles[col.field]?.embedImage) return '';\n\n let value: unknown = row[col.field];\n if (col.valueGetter) {\n value = col.valueGetter({ row, field: col.field, value });\n }\n const cellType = inferCellType(col, value);\n if (cellType === 'string' && col.valueFormatter && value != null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n return value;\n });\n\n const dataRow = ws.addRow(cellValues);\n dataRow.font = { size: bodyFontSize };\n\n // Alternate row background\n if (alternateRowColor && rowIdx % 2 === 1) {\n dataRow.eachCell(cell => {\n cell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: argb(alternateRowColor) } };\n });\n }\n\n // Per-cell alignment and explicit web-like borders\n dataRow.eachCell((cell, colIndex) => {\n const colDef = exportColumns[colIndex - 1];\n if (!colDef) return;\n cell.alignment = {\n horizontal: columnStyles[colDef.field]?.alignment ?? (colDef.type === 'number' ? 'right' : 'left'),\n vertical: 'middle',\n };\n cell.border = { bottom: { style: 'thin', color: { argb: 'FFf1f5f9' } } }; // Slate 50\n });\n\n // ── Embed images for this row ─────────────────────────────────────\n //\n // ExcelJS images are floating objects anchored at tl.{col,row}.\n // Both values accept fractions (0–1 represents one cell length).\n // Adding an offset fraction shifts the anchor rightward / downward,\n // letting us centre the image inside its cell.\n\n if (imageColumns.length > 0) {\n // Pre-compute the final row height so vertical centring is exact.\n const maxImgH = imageColumns.reduce((max, col) => {\n return Math.max(max, columnStyles[col.field]?.imageHeight ?? 40);\n }, 0);\n // ExcelJS row height = points; 1 pt ≈ 1.333 px at 96 dpi\n const rowHeightPt = Math.ceil(maxImgH / 1.333);\n const rowHeightPx = rowHeightPt * 1.333;\n dataRow.height = rowHeightPt;\n\n imageColumns.forEach(col => {\n const colIdx = exportColumns.indexOf(col);\n const url = row[col.field];\n const imgId = typeof url === 'string' ? imageCache.get(url) : undefined;\n\n if (imgId === undefined) {\n // Fetch failed — write URL text so data isn't lost\n dataRow.getCell(colIdx + 1).value = typeof url === 'string' ? url : '';\n return;\n }\n\n const style = columnStyles[col.field];\n const imgW = style?.imageWidth ?? 40;\n const imgH = style?.imageHeight ?? 40;\n\n // ── Horizontal centre within the column ───────────────────\n // ws.getColumn uses 1-based index; width is in Excel \"chars\".\n // Excel column width in pixels for Calibri 11 (MaxDigitWidth=7, Padding=5).\n const colWidthChars = (ws.getColumn(colIdx + 1).width ?? 8) as number;\n const colWidthPx = colWidthChars * 7 + 5;\n const hGapPx = Math.max(0, colWidthPx - imgW) / 2;\n\n // ── Vertical centre within the row ────────────────────────\n const vGapPx = Math.max(0, rowHeightPx - imgH) / 2;\n\n // ExcelJS native offsets are in EMUs (1 pixel = 9525 EMUs).\n // This provides absolute pixel precision regardless of cell size.\n ws.addImage(imgId, {\n tl: {\n col: colIdx,\n row: excelRowIdx,\n nativeColOff: Math.floor(hGapPx * 9525),\n nativeRowOff: Math.floor(vGapPx * 9525),\n },\n ext: { width: imgW, height: imgH },\n editAs: 'oneCell',\n } as unknown as import('exceljs').ImageRange);\n });\n } else {\n dataRow.height = 16;\n }\n\n excelRowIdx++;\n });\n\n // ── Aggregation totals row ────────────────────────────────────────────\n if (includeSummary && aggregationResult && aggregationModel) {\n // Label row\n const labelValues = exportColumns.map(col => {\n const fn = aggregationModel![col.field];\n return fn ? fn.toUpperCase() : '';\n });\n const labelRow = ws.addRow(labelValues);\n labelRow.height = 16;\n labelRow.font = { size: bodyFontSize - 1, italic: true, color: { argb: 'FF94a3b8' } };\n labelRow.eachCell(cell => {\n cell.alignment = { horizontal: 'right', vertical: 'middle' };\n cell.border = { top: { style: 'thin', color: { argb: 'FFcbd5e1' } } };\n });\n\n // Value row\n const totalValues = exportColumns.map(col => {\n const fn = aggregationModel![col.field];\n const val = aggregationResult![col.field];\n if (fn == null || val == null) return '';\n if (col.valueFormatter) {\n return col.valueFormatter({ value: val, row: {} as R, field: col.field });\n }\n return formatAggregationValue(val, fn);\n });\n const totalRow = ws.addRow(totalValues);\n totalRow.height = 18;\n totalRow.font = { bold: true, size: bodyFontSize, color: { argb: argb(headerTextColor) } };\n totalRow.eachCell(cell => {\n cell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: argb(headerFillColor) } };\n cell.alignment = { horizontal: 'right', vertical: 'middle' };\n cell.border = topBorder();\n });\n }\n }\n\n // ─── Write & download ────────────────────────────────────────────────────\n const buffer = await workbook.xlsx.writeBuffer();\n const blob = new Blob([buffer], {\n type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\n });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = fileName.endsWith('.xlsx') ? fileName : `${fileName}.xlsx`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\n/** Convert '#rrggbb' or '#rgb' to ExcelJS ARGB 'FFrrggbb' */\nfunction argb(hex: string): string {\n const clean = hex.replace('#', '');\n if (clean.length === 3) {\n return 'FF' + clean.split('').map(c => c + c).join('');\n }\n if (clean.length === 6) {\n return 'FF' + clean;\n }\n return 'FF' + clean.padEnd(6, '0');\n}\n\nfunction bottomBorder(): Partial<import('exceljs').Borders> {\n return { bottom: { style: 'medium', color: { argb: 'FFcbd5e1' } } };\n}\n\nfunction topBorder(): Partial<import('exceljs').Borders> {\n return { top: { style: 'medium', color: { argb: 'FFcbd5e1' } } };\n}\n","import React from 'react';\nimport type { GridTheme } from './types';\n\nconst lightBase: Record<string, string> = {\n\n '--ogx-color-primary': '#3b82f6',\n '--ogx-color-primary-dark': '#2563eb',\n '--ogx-color-primary-light': '#eff6ff',\n '--ogx-color-primary-focus': 'rgba(59, 130, 246, 0.5)',\n\n '--ogx-color-secondary': '#8b5cf6',\n '--ogx-color-secondary-dark': '#7c3aed',\n '--ogx-color-secondary-light': '#f5f3ff',\n\n '--ogx-color-white': '#ffffff',\n '--ogx-color-black': '#0f172a',\n\n '--ogx-border-color': '#e2e8f0',\n '--ogx-border-color-hover': '#cbd5e1',\n\n '--ogx-shadow-sm': '0 1px 2px 0 rgba(0, 0, 0, 0.05)',\n '--ogx-shadow-md': '0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03)',\n '--ogx-shadow-lg': '0 10px 15px -3px rgba(0, 0, 0, 0.05), 0 4px 6px -2px rgba(0, 0, 0, 0.02)',\n\n '--ogx-grid-background': '#ffffff',\n '--ogx-grid-border-color': '#e2e8f0',\n '--ogx-grid-header-background': '#f8fafc',\n '--ogx-grid-header-text': '#334155',\n '--ogx-grid-header-hover-background': '#f1f5f9',\n '--ogx-grid-header-sorted-background': '#f8fafc',\n '--ogx-grid-row-text': '#1e293b',\n '--ogx-grid-row-hover-background': '#f8fafc',\n '--ogx-grid-row-alternate-background': 'transparent',\n '--ogx-grid-row-selected-background': '#eff6ff',\n '--ogx-grid-row-selected-hover-background': '#dbeafe',\n '--ogx-grid-cell-focus-border': '#3b82f6',\n\n '--ogx-checkbox-bg': '#ffffff',\n '--ogx-checkbox-border': '#94a3b8',\n\n '--ogx-grid-pinned-left-shadow': '4px 0 24px -4px rgba(0, 0, 0, 0.05)',\n '--ogx-grid-pinned-right-shadow': '-4px 0 24px -4px rgba(0, 0, 0, 0.05)',\n\n // Toolbars\n '--ogx-toolbar-background': 'transparent',\n '--ogx-toolbar-text': '#1e293b',\n '--ogx-toolbar-border': '#e2e8f0',\n '--ogx-toolbar-btn-bg': 'transparent',\n '--ogx-toolbar-btn-hover': '#f1f5f9',\n '--ogx-toolbar-btn-text': '#334155',\n '--ogx-toolbar-btn-primary-bg': '#3b82f6',\n '--ogx-toolbar-btn-primary-hover': '#2563eb',\n '--ogx-toolbar-btn-primary-text': '#ffffff',\n '--ogx-toolbar-btn-danger-bg': 'rgba(239, 68, 68, 0.08)',\n '--ogx-toolbar-btn-danger-hover': 'rgba(239, 68, 68, 0.15)',\n '--ogx-toolbar-btn-danger-text': '#ef4444',\n '--ogx-toolbar-input-bg': '#ffffff',\n '--ogx-toolbar-input-text': '#1e293b',\n '--ogx-toolbar-input-border': '#cbd5e1',\n '--ogx-toolbar-input-focus-border': '#3b82f6',\n '--ogx-toolbar-input-focus-shadow': '0 0 0 3px rgba(59, 130, 246, 0.12)',\n '--ogx-toolbar-chip-bg': '#f1f5f9',\n '--ogx-toolbar-chip-text': '#475569',\n '--ogx-toolbar-chip-active-bg': 'rgba(59, 130, 246, 0.12)',\n '--ogx-toolbar-chip-active-text': '#2563eb',\n\n // Overlays & Menus\n '--ogx-overlay-background': '#ffffff',\n '--ogx-overlay-text': '#1e293b',\n '--ogx-overlay-border': '#e2e8f0',\n '--ogx-overlay-shadow': '0 4px 6px -1px rgba(0,0,0,0.08), 0 2px 4px -1px rgba(0,0,0,0.06), 0 0 0 1px rgba(0,0,0,0.06)',\n '--ogx-overlay-item-hover-bg': '#f8fafc',\n '--ogx-overlay-item-hover-text': '#0f172a',\n '--ogx-overlay-item-selected-bg': 'rgba(59, 130, 246, 0.08)',\n '--ogx-overlay-item-selected-text': '#2563eb',\n '--ogx-overlay-item-danger-bg': 'rgba(239, 68, 68, 0.08)',\n '--ogx-overlay-item-danger-text': '#ef4444',\n\n // Scrollbars\n '--ogx-scrollbar-thumb': 'rgba(148, 163, 184, 0.5)',\n '--ogx-scrollbar-track': 'transparent',\n '--ogx-scrollbar-size': '10px',\n\n // Skeletons\n '--ogx-skeleton-base': '#f1f5f9',\n '--ogx-skeleton-highlight': '#ffffff',\n '--ogx-skeleton-dark-base': '#e2e8f0',\n '--ogx-skeleton-dark-highlight': '#f8fafc',\n};\n\nfunction themeToCSS(theme: GridTheme): Record<string, string> {\n const vars: Record<string, string> = {};\n\n function set(cssVar: string, value: string | undefined) {\n if (value !== undefined) {\n vars[cssVar] = value;\n }\n }\n\n if (theme.colors) {\n const c = theme.colors;\n set('--ogx-color-primary', c.primary);\n set('--ogx-color-primary-dark', c.primaryDark);\n set('--ogx-color-primary-light', c.primaryLight);\n set('--ogx-color-primary-focus', c.primaryFocus);\n set('--ogx-color-secondary', c.secondary);\n set('--ogx-color-secondary-dark', c.secondaryDark);\n set('--ogx-color-secondary-light', c.secondaryLight);\n set('--ogx-color-success', c.success);\n set('--ogx-color-warning', c.warning);\n set('--ogx-color-error', c.error);\n set('--ogx-color-info', c.info);\n }\n\n if (theme.typography) {\n const t = theme.typography;\n set('--ogx-font-family', t.fontFamily);\n set('--ogx-font-family-mono', t.fontFamilyMono);\n set('--ogx-font-size-xs', t.fontSizeXs);\n set('--ogx-font-size-sm', t.fontSizeSm);\n set('--ogx-font-size-md', t.fontSizeMd);\n set('--ogx-font-size-lg', t.fontSizeLg);\n set('--ogx-font-size-xl', t.fontSizeXl);\n }\n\n if (theme.spacing) {\n const s = theme.spacing;\n set('--ogx-spacing-xs', s.xs);\n set('--ogx-spacing-sm', s.sm);\n set('--ogx-spacing-md', s.md);\n set('--ogx-spacing-lg', s.lg);\n set('--ogx-spacing-xl', s.xl);\n set('--ogx-spacing-xxl', s.xxl);\n }\n\n if (theme.borders) {\n const b = theme.borders;\n set('--ogx-border-width-thin', b.widthThin);\n set('--ogx-border-width-medium', b.widthMedium);\n set('--ogx-border-width-thick', b.widthThick);\n set('--ogx-border-radius-sm', b.radiusSm);\n set('--ogx-border-radius-md', b.radiusMd);\n set('--ogx-border-radius-lg', b.radiusLg);\n set('--ogx-border-radius-xl', b.radiusXl);\n set('--ogx-border-color', b.color);\n set('--ogx-border-color-hover', b.colorHover);\n }\n\n if (theme.shadows) {\n const sh = theme.shadows;\n set('--ogx-shadow-sm', sh.sm);\n set('--ogx-shadow-md', sh.md);\n set('--ogx-shadow-lg', sh.lg);\n set('--ogx-shadow-xl', sh.xl);\n }\n\n if (theme.grid) {\n const g = theme.grid;\n set('--ogx-grid-row-height-compact', g.rowHeightCompact);\n set('--ogx-grid-row-height-standard', g.rowHeightStandard);\n set('--ogx-row-height', g.rowHeightStandard);\n set('--ogx-grid-row-height-comfortable', g.rowHeightComfortable);\n set('--ogx-grid-header-height', g.headerHeight);\n set('--ogx-header-height', g.headerHeight);\n set('--ogx-grid-cell-padding-x', g.cellPaddingX);\n set('--ogx-grid-cell-padding-y', g.cellPaddingY);\n set('--ogx-grid-background', g.background);\n set('--ogx-grid-border-color', g.borderColor);\n set('--ogx-grid-header-background', g.headerBackground);\n set('--ogx-grid-header-text', g.headerText);\n set('--ogx-grid-header-hover-background', g.headerHoverBackground);\n set('--ogx-grid-header-sorted-background', g.headerSortedBackground);\n set('--ogx-grid-row-text', g.rowText);\n set('--ogx-grid-row-hover-background', g.rowHoverBackground);\n set('--ogx-grid-row-alternate-background', g.rowAlternateBackground);\n set('--ogx-grid-row-selected-background', g.rowSelectedBackground);\n set('--ogx-grid-row-selected-hover-background', g.rowSelectedHoverBackground);\n set('--ogx-grid-cell-focus-border', g.cellFocusBorder);\n set('--ogx-grid-pinned-left-shadow', g.pinnedLeftShadow);\n set('--ogx-grid-pinned-right-shadow', g.pinnedRightShadow);\n set('--ogx-checkbox-bg', g.checkboxBg);\n set('--ogx-checkbox-border', g.checkboxBorder);\n }\n\n if (theme.transitions) {\n const tr = theme.transitions;\n set('--ogx-transition-duration-fast', tr.durationFast);\n set('--ogx-transition-duration-normal', tr.durationNormal);\n set('--ogx-transition-duration-slow', tr.durationSlow);\n set('--ogx-transition-easing', tr.easing);\n }\n\n if (theme.toolbar) {\n const tb = theme.toolbar;\n set('--ogx-toolbar-background', tb.background);\n set('--ogx-toolbar-text', tb.text);\n set('--ogx-toolbar-border', tb.border);\n set('--ogx-toolbar-btn-bg', tb.buttonBackground);\n set('--ogx-toolbar-btn-hover', tb.buttonHoverBackground);\n set('--ogx-toolbar-btn-text', tb.buttonText);\n set('--ogx-toolbar-btn-primary-bg', tb.buttonPrimaryBackground);\n set('--ogx-toolbar-btn-primary-hover', tb.buttonPrimaryHoverBackground);\n set('--ogx-toolbar-btn-primary-text', tb.buttonPrimaryText);\n set('--ogx-toolbar-btn-danger-bg', tb.buttonDangerBackground);\n set('--ogx-toolbar-btn-danger-hover', tb.buttonDangerHoverBackground);\n set('--ogx-toolbar-btn-danger-text', tb.buttonDangerText);\n set('--ogx-toolbar-input-bg', tb.inputBackground);\n set('--ogx-toolbar-input-text', tb.inputText);\n set('--ogx-toolbar-input-border', tb.inputBorder);\n set('--ogx-toolbar-input-focus-border', tb.inputFocusBorder);\n set('--ogx-toolbar-input-focus-shadow', tb.inputFocusShadow);\n set('--ogx-toolbar-chip-bg', tb.chipBackground);\n set('--ogx-toolbar-chip-text', tb.chipText);\n set('--ogx-toolbar-chip-active-bg', tb.chipActiveBackground);\n set('--ogx-toolbar-chip-active-text', tb.chipActiveText);\n }\n\n if (theme.overlays) {\n const o = theme.overlays;\n set('--ogx-overlay-background', o.background);\n set('--ogx-overlay-text', o.text);\n set('--ogx-overlay-border', o.border);\n set('--ogx-overlay-shadow', o.shadow);\n set('--ogx-overlay-item-hover-bg', o.itemHoverBackground);\n set('--ogx-overlay-item-hover-text', o.itemHoverText);\n set('--ogx-overlay-item-selected-bg', o.itemSelectedBackground);\n set('--ogx-overlay-item-selected-text', o.itemSelectedText);\n set('--ogx-overlay-item-danger-bg', o.itemDangerBackground);\n set('--ogx-overlay-item-danger-text', o.itemDangerText);\n }\n\n if (theme.scrollbar) {\n const scr = theme.scrollbar;\n set('--ogx-scrollbar-thumb', scr.thumbColor);\n set('--ogx-scrollbar-track', scr.trackColor);\n set('--ogx-scrollbar-size', scr.size);\n }\n\n if (theme.skeleton) {\n const sk = theme.skeleton;\n set('--ogx-skeleton-base', sk.baseColor);\n set('--ogx-skeleton-highlight', sk.highlightColor);\n set('--ogx-skeleton-dark-base', sk.darkBaseColor);\n set('--ogx-skeleton-dark-highlight', sk.darkHighlightColor);\n }\n\n return vars;\n}\n\nexport interface DataGridThemeProviderProps {\n theme: GridTheme;\n children: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function DataGridThemeProvider({\n theme,\n children,\n className,\n style\n}: DataGridThemeProviderProps) {\n const cssVars = React.useMemo(() => {\n\n return { ...lightBase, ...themeToCSS(theme) };\n }, [theme]);\n\n return (\n <div\n className={`ogx-theme-provider ${className || ''}`.trim()}\n style={{ ...style, ...cssVars } as React.CSSProperties}\n >\n {children}\n </div>\n );\n}\n","import type { GridTheme } from './types';\n\nexport const darkTheme: GridTheme = {\n colors: {\n primary: '#60a5fa', \n primaryDark: '#3b82f6',\n primaryLight: '#1e3a5f', \n primaryFocus: 'rgba(96, 165, 250, 0.4)',\n },\n grid: {\n background: '#0f172a', \n headerBackground: '#1e293b', \n headerText: '#e2e8f0', \n headerHoverBackground: '#334155', \n headerSortedBackground: '#1e3a5f', \n rowText: '#cbd5e1', \n borderColor: '#334155', \n rowHoverBackground: '#1e293b', \n rowAlternateBackground: '#162032', \n rowSelectedBackground: '#1e3a5f', \n rowSelectedHoverBackground: '#1d4ed8', \n cellFocusBorder: '#60a5fa',\n checkboxBg: '#1e293b', \n checkboxBorder: '#64748b', \n },\n borders: {\n color: '#334155',\n colorHover: '#475569',\n },\n shadows: {\n sm: '0 1px 2px 0 rgba(0, 0, 0, 0.3)',\n md: '0 4px 6px -1px rgba(0, 0, 0, 0.3)',\n },\n toolbar: {\n background: 'transparent',\n text: '#cbd5e1',\n border: '#334155',\n buttonBackground: 'transparent',\n buttonHoverBackground: '#1e293b',\n buttonText: '#e2e8f0',\n buttonPrimaryBackground: '#3b82f6',\n buttonPrimaryHoverBackground: '#2563eb',\n buttonPrimaryText: '#ffffff',\n buttonDangerBackground: 'rgba(239, 68, 68, 0.15)',\n buttonDangerHoverBackground: 'rgba(239, 68, 68, 0.25)',\n buttonDangerText: '#fca5a5',\n inputBackground: '#0f172a',\n inputText: '#f8fafc',\n inputBorder: '#334155',\n inputFocusBorder: '#60a5fa',\n inputFocusShadow: '0 0 0 3px rgba(96, 165, 250, 0.2)',\n chipBackground: '#1e293b',\n chipText: '#94a3b8',\n chipActiveBackground: 'rgba(96, 165, 250, 0.2)',\n chipActiveText: '#60a5fa',\n },\n overlays: {\n background: '#1e293b',\n text: '#f8fafc',\n border: '#334155',\n shadow: '0 10px 15px -3px rgba(0, 0, 0, 0.5), 0 4px 6px -2px rgba(0, 0, 0, 0.3)',\n itemHoverBackground: '#334155',\n itemHoverText: '#ffffff',\n itemSelectedBackground: 'rgba(96, 165, 250, 0.15)',\n itemSelectedText: '#60a5fa',\n itemDangerBackground: 'rgba(239, 68, 68, 0.15)',\n itemDangerText: '#fca5a5',\n },\n scrollbar: {\n thumbColor: 'rgba(148, 163, 184, 0.2)',\n trackColor: 'transparent',\n },\n skeleton: {\n baseColor: '#1e293b',\n highlightColor: '#334155',\n darkBaseColor: '#0f172a',\n darkHighlightColor: '#1e293b',\n }\n};\n\nexport const roseTheme: GridTheme = {\n colors: {\n primary: '#e11d48', \n primaryDark: '#be123c',\n primaryLight: '#fff1f2', \n primaryFocus: 'rgba(225, 29, 72, 0.4)',\n },\n grid: {\n headerBackground: '#fff1f2',\n headerHoverBackground: '#ffe4e6',\n headerSortedBackground: '#fecdd3',\n rowAlternateBackground: '#fff8f8',\n rowSelectedBackground: '#ffe4e6',\n rowSelectedHoverBackground: '#fecdd3',\n cellFocusBorder: '#e11d48',\n },\n};\n\nexport const emeraldTheme: GridTheme = {\n colors: {\n primary: '#059669', \n primaryDark: '#047857',\n primaryLight: '#ecfdf5', \n primaryFocus: 'rgba(5, 150, 105, 0.4)',\n },\n grid: {\n headerBackground: '#ecfdf5',\n headerHoverBackground: '#d1fae5',\n headerSortedBackground: '#a7f3d0',\n rowAlternateBackground: '#f6fdf9',\n rowSelectedBackground: '#d1fae5',\n rowSelectedHoverBackground: '#a7f3d0',\n cellFocusBorder: '#059669',\n },\n};\n\nexport const amberTheme: GridTheme = {\n colors: {\n primary: '#d97706', \n primaryDark: '#b45309',\n primaryLight: '#fffbeb', \n primaryFocus: 'rgba(217, 119, 6, 0.4)',\n },\n grid: {\n headerBackground: '#fffbeb',\n headerHoverBackground: '#fef3c7',\n headerSortedBackground: '#fde68a',\n rowAlternateBackground: '#fffdf5',\n rowSelectedBackground: '#fef3c7',\n rowSelectedHoverBackground: '#fde68a',\n cellFocusBorder: '#d97706',\n },\n};\n\nexport const compactTheme: GridTheme = {\n grid: {\n rowHeightCompact: '28px',\n rowHeightStandard: '36px',\n rowHeightComfortable: '48px',\n headerHeight: '40px',\n cellPaddingX: '8px',\n cellPaddingY: '4px',\n },\n typography: {\n fontSizeSm: '0.8rem',\n fontSizeMd: '0.875rem',\n },\n};\n","\nimport { useRef, useCallback, useMemo, useEffect } from 'react';\nimport type { GridState } from './types';\n\nexport interface UseGridStateStorageOptions {\n key: string;\n debounceMs?: number;\n include?: (keyof GridState)[];\n storage?: {\n getItem: (key: string) => string | null;\n setItem: (key: string, value: string) => void;\n removeItem: (key: string) => void;\n };\n}\n\nexport interface UseGridStateStorageReturn {\n initialState: GridState | undefined;\n onStateChange: (state: GridState) => void;\n clearState: () => void;\n}\n\nfunction readFromStorage(\n key: string,\n storage: UseGridStateStorageOptions['storage']\n): GridState | undefined {\n try {\n const raw = storage!.getItem(key);\n if (!raw) return undefined;\n return JSON.parse(raw) as GridState;\n } catch {\n\n return undefined;\n }\n}\n\nfunction writeToStorage(\n key: string,\n state: GridState,\n include: (keyof GridState)[] | undefined,\n storage: UseGridStateStorageOptions['storage']\n) {\n try {\n const toWrite = include\n ? Object.fromEntries(\n Object.entries(state).filter(([k]) => include.includes(k as keyof GridState))\n )\n : state;\n storage!.setItem(key, JSON.stringify(toWrite));\n } catch {\n // swallow localStorage write errors (private browsing, quota exceeded)\n }\n}\n\nexport function useGridStateStorage(\n options: UseGridStateStorageOptions | string\n): UseGridStateStorageReturn {\n\n const opts: UseGridStateStorageOptions = typeof options === 'string'\n ? { key: options }\n : options;\n\n const {\n key,\n debounceMs = 300,\n include,\n storage = typeof window !== 'undefined' ? window.localStorage : undefined,\n } = opts;\n\n const initialState = useMemo(() => {\n if (!storage) return undefined;\n return readFromStorage(key, storage);\n\n }, [key, storage]);\n\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const latestStateRef = useRef<GridState | null>(null);\n\n const flush = useCallback(() => {\n if (latestStateRef.current && storage) {\n writeToStorage(key, latestStateRef.current, include, storage);\n }\n }, [key, include, storage]);\n\n const onStateChange = useCallback(\n (state: GridState) => {\n latestStateRef.current = state;\n\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n\n timerRef.current = setTimeout(flush, debounceMs);\n },\n [flush, debounceMs]\n );\n\n useEffect(() => {\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n flush();\n }\n };\n }, [flush]);\n\n const clearState = useCallback(() => {\n if (storage) {\n storage.removeItem(key);\n }\n }, [key, storage]);\n\n return { initialState, onStateChange, clearState };\n}\n"],"names":["REACT_ELEMENT_TYPE","REACT_FRAGMENT_TYPE","jsxProd","type","config","maybeKey","key","propName","reactJsxRuntime_production","getComponentNameFromType","REACT_CLIENT_REFERENCE","REACT_PROFILER_TYPE","REACT_STRICT_MODE_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_ACTIVITY_TYPE","REACT_PORTAL_TYPE","REACT_CONTEXT_TYPE","REACT_CONSUMER_TYPE","REACT_FORWARD_REF_TYPE","innerType","REACT_MEMO_TYPE","REACT_LAZY_TYPE","testStringCoercion","value","checkKeyStringCoercion","JSCompiler_inline_result","JSCompiler_temp_const","JSCompiler_inline_result$jscomp$0","getTaskName","name","getOwner","dispatcher","ReactSharedInternals","UnknownOwner","hasValidKey","hasOwnProperty","getter","defineKeyPropWarningGetter","props","displayName","warnAboutAccessingKey","specialPropKeyWarningShown","elementRefGetterWithDeprecationWarning","componentName","didWarnAboutElementRef","ReactElement","owner","debugStack","debugTask","refProp","jsxDEVImpl","isStaticChildren","children","isArrayImpl","validateChildKeys","keys","k","didWarnAboutKeySpread","node","isValidElement","object","React","require$$0","createTask","callStackForError","unknownOwnerDebugStack","unknownOwnerDebugTask","reactJsxRuntime_development","trackActualOwner","jsxRuntimeModule","require$$1","isColumnPinned","field","pinnedColumns","getPinnedColumnGroups","columns","left","center","right","col","pinnedPosition","a","b","aIndex","bIndex","calculatePinnedPositions","columnWidths","checkboxSelection","pinCheckboxColumn","hasDetailPanel","pinExpandColumn","rowReordering","positions","groups","leftOffset","width","rightOffset","isRowPinned","rowId","pinnedRows","getPinnedRowGroups","rows","top","bottom","row","parseWidth","floatVal","useLayout","params","rowHeight","pagination","paginatedUnpinnedRows","sortedUnpinnedRows","expandedRowIds","getDetailPanelHeight","pinnedTopRowsLength","pinnedBottomRowsLength","visibleOrderedColumns","viewportWidth","paginationMode","isLoading","pageSize","useMemo","unpinnedRows","rowHeights","index","height","detailHeight","cumulativeHeights","acc","skeletonCount","unpinnedRowsHeight","pinnedTopHeight","pinnedBottomHeight","rawLeftPinnedCols","rawRightPinnedCols","unpinnedCols","unpinnedColWidths","pinned","systemColumnsWidth","getColWidth","c","leftWidth","sum","parsed","rightWidth","naturalFlexWidth","minWidth","w","availableWidth","fixedWidthCols","percentageCols","flexCols","hasManualWidth","fixedWidth","remainingSpaceForFlex","percentageWidthMap","percentage","calculatedWidth","finalFlexWidths","flexItems","f","iterations","maxIterations","unfrozen","unfrozenFlexTotal","frozenWidthTotal","currentFreeSpace","pixelsPerFlex","totalViolation","minViolators","maxViolators","rawWidth","computedWidthMap","computedWidth","fixedCol","pctCol","p","rawPctWidth","unpinnedColsWithWidth","flexItem","baseLeftZ","leftPinnedCols","i","baseRightZ","rightPinnedCols","unpinnedTotalWidth","totalWidth","unpinnedAccWidths","useGridKeyboardNavigation","allRenderableRows","navigationColumns","selectedRowIds","handleSelectionChange","handleDetailPanelToggle","editingHandlers","setKeyboardMode","sortModel","handleSort","isCellEditable","virtualization","viewportRef","focusedCell","setFocusedCell","useState","handleFocus","useCallback","event","prev","firstRow","firstCol","handleBlur","handleKeyDown","id","isEditing","currentSort","item","newDirection","r","isHeader","rowIndex","colIndex","findNextCell","startRow","startCol","deltaRow","deltaCol","wrapRow","allowHeader","findNextEditable","steps","maxSteps","isSortable","isInteractable","cellEditable","nextRowIndex","nextColIndex","handled","dir","res","pg","nextCol","el","columnMetrics","clientHeight","clientWidth","scrollTop","scrollLeft","rowTop","rowBottom","visibleTop","visibleBottom","newScrollTop","leftPinnedWidth","rightPinnedWidth","totalSpecialsWidth","pinnedSpecialsWidth","unpinnedIndex","colLeft","colRight","visibleStart","visibleEnd","newScrollLeft","EMPTY_PIVOT_MODEL","useGridControlledState","initialState","propSortModel","propAggregationModel","onAggregationModelChange","propColumnVisibilityModel","onColumnVisibilityModelChange","propPinnedColumns","onPinnedColumnsChange","propPivotModel","onPivotModelChange","propPaginationModel","onPaginationModelChange","propRowSelectionModel","internalSortModel","setInternalSortModel","isSortControlled","isAggregationControlled","internalAggregationModel","setInternalAggregationModel","aggregationModel","handleAggregationModelChange","model","isColumnVisibilityControlled","internalColumnVisibilityModel","setInternalColumnVisibilityModel","columnVisibilityModel","handleColumnVisibilityModelChange","isPinnedColumnsControlled","internalPinnedColumns","setInternalPinnedColumns","handlePinnedColumnsChange","internalPivotModel","setInternalPivotModel","currentPivotModel","handlePivotModelChange","isPaginationControlled","internalPaginationModel","setInternalPaginationModel","effectivePaginationModel","handlePaginationModelChange","newModel","isSelectionControlled","internalRowSelectionModel","setInternalRowSelectionModel","rowSelectionModel","FILTER_OPERATORS","filterValue","numValue","numFilter","numV","numF","v","rowStr","filterStr","applyFilterItem","filterItem","operator","rowValue","operatorFn","applyQuickFilter","quickFilterValues","searchTerm","isRowMatchingFilter","filterModel","items","logicOperator","evaluateItem","group","groupItems","filterRows","getOperatorsForType","compareValues","direction","aStr","bStr","sortRows","sortedRows","sortItem","aValue","bValue","comparison","useGridRowPipeline","effectiveRows","activeHierarchyHandlers","filterMode","dataSource","sortingMode","filteredRows","pinnedTopRows","pinnedBottomRows","start","centerRows","base","skeletons","_","useGridVirtualization","layout","rawViewportWidth","rawViewportHeight","autoHeight","unpinnedRowsLength","viewportHeight","overscanCols","visibleLocalStart","visibleLocalEnd","firstUnpinnedIndex","lastUnpinnedIndex","low","high","mid","leftSpacerWidth","rightSpacerWidth","virtualColumns","scrollbarBuffer","totalHeight","overscanRows","firstRowIndex","lastRowIndex","offsetTop","rLow","rHigh","useColumnReorder","onColumnOrderChange","disableColumnReorder","draggedColumn","setDraggedColumn","dragOverColumn","setDragOverColumn","draggedIndexRef","useRef","handleDragStart","columnIndex","handleDragOver","handleDrop","targetField","oldIndex","targetIndex","column","handleDragEnd","ExpandIcon","isExpanded","onClick","variant","jsx","e","jsxs","useGridColumns","activeColumns","isHierarchyEnabled","isRowGrouping","isTreeData","columnOrder","pivotMode","setColumns","effectiveColumns","cellParams","meta","depth","hasChildren","groupingField","groupingValue","descendantCount","isGroupRow","content","groupLabel","setColumnWidths","handleColumnResize","newWidth","internalColumnOrder","setInternalColumnOrder","effectiveColumnOrder","useEffect","orderedColumns","orderMap","idx","ai","bi","columnReorderHandlers","reorderParams","newOrder","movedField","specials","useGridVisibleRows","renderContext","topPinnedCount","topPinned","bottomPinned","centerStartIndex","centerEndIndex","centerVisible","combined","seenIds","useGridScrollSync","onRowsScrollEnd","pendingScrollRef","scrollRafRef","scrollPos","setScrollPos","handleScroll","target","scrollHeight","useGridStateSnapshot","onStateChange","onStateChangeRef","useLayoutEffect","snapshot","AGGREGATION_FUNCTIONS","values","nums","formatAggregationValue","fnName","useAggregation","isServerSide","serverAggregationResults","columnsLookup","map","clientResult","result","colDef","fn","serverResult","setServerResult","setIsLoading","error","setError","requestIdRef","fetchServerAggregations","requestId","err","GridAggregationFooter","aggregationResult","pinnedOffsets","lastLeftField","firstRightField","rawValue","colWidth","pinnedOffset","className","style","Fragment","GridEmptyState","noRowsLabel","GridErrorOverlay","message","Checkbox","indeterminate","label","inputRef","internalRef","setRef","element","wrapperClassNames","ColumnResizeHandle","currentWidth","onResize","maxWidth","isDragging","setIsDragging","startXRef","startWidthRef","handleMouseDown","lastUpdateTime","throttleMs","handleMouseMove","deltaX","now","handleMouseUp","handleDoubleClick","classNames","ActiveDotIcon","InactiveDotIcon","ManageColumnsIcon","AscIcon","DescIcon","UnsortIcon","HideIcon","PinLeftIcon","PinRightIcon","UnpinIcon","ColumnMenu","onSort","onHide","onPin","onManageColumns","onClose","anchorEl","menuRef","setStyle","anchorRect","menuRect","vw","vh","margin","handleClickOutside","handleKey","handleHide","handlePin","side","isUnsorted","isPinnedLeft","isPinnedRight","isUnpinned","colLabel","ReactDOM","MenuIcon","SwapIcon","collectGroupFields","out","child","groupTreeDepth","d","walk","g","buildGroupRow","allFields","level","findAtLevel","cur","found","fieldGroup","cells","totalW","j","Header","allColumns","columnGroupingModel","allSelected","someSelected","onSelectAll","onColumnResize","onDragStart","onDragOver","onDragEnd","onDrop","onHeaderClick","onSortAdd","multiSort","onHideColumn","onPinColumn","selectAllId","useId","cellRefs","menuOpenParams","setMenuOpenParams","handleMenuOpen","handleMenuClose","handleColumnClick","getSortIcon","sortIndex","pinnedPositions","groupDepth","allLeafFields","prefixWidth","cell","isSorted","isResizable","isPinned","isDragOver","effectiveWidth","offset","headerContent","handleHeaderClick","Button","size","color","disabled","Pagination","pageSizeId","page","rowCount","onPageChange","onPageSizeChange","pageSizeOptions","showFirstButton","showLastButton","localeText","pageCount","currentPage","displayedRows","rowsPerPageLabel","ofLabel","pageLabel","handleFirstPage","handlePreviousPage","handleNextPage","handleLastPage","handlePageSizeChange","newPageSize","isFirstPage","isLastPage","option","createInitialState","idRowsLookup","allRows","columnLookup","orderedFields","gridReducer","state","action","currentRows","newRows","useDataGrid","headerHeight","propInitialState","internalInitialState","dispatch","useReducer","stateRef","prevRowsRef","setRows","rowsOrUpdater","preserveRowCount","newColumns","setSortModel","setFilterModel","setPaginationModel","paginationModel","setSelection","selectedRows","setDimensions","setDataSourceLoading","loading","setDataSourceError","setRowCount","count","apiRef","isSelected","newSelection","ids","existingIndex","useRowReorder","onRowOrderChange","getRowId","draggedRowId","setDraggedRowId","dragOverRowId","setDragOverRowId","getRowIdInternal","targetId","useTreeData","getTreeDataPath","treeData","defaultGroupingExpansionDepth","onRowExpansionChange","treeNodes","rootIds","groupingRows","nodes","roots","groupRows","pathLookup","getPathKey","path","pathKey","ensureAncestors","childPath","parentPath","parentPathKey","parentId","groupRow","parentNode","childNode","groupId","nodePath","initialExpandedIds","initialExpanded","expandedGroupIds","setExpandedGroupIds","toggleExpansion","next","isExpanding","getVisibleRows","rowLookup","matchesFilter","filterCache","isNodeVisible","childId","sortNodes","aId","bId","rowA","rowB","valA","valB","comp","traverse","visibleIds","enhancedRow","isGroupExpanded","getNode","getNodePath","currentId","rowMetaMap","groupRowIds","defaultGetAggregationPosition","groupNode","EMPTY_ROW_GROUPING_MODEL","EMPTY_AGGREGATION_MODEL","useRowGrouping","rowGroupingModel","getAggregationPosition","getGroupId","groupIds","groupRowsList","aggregatedValues","aggField","aggType","treeNode","childrenIds","topLevelIds","allGroupIds","depthIds","doesNodeMatchFilter","nodeId","compareResult","isGroup","isExpandedGroupIds","useGridEditing","processRowUpdate","onProcessRowUpdateError","onRowChange","editingCell","setEditingCellState","editingCellRef","setEditingCell","val","startCellEdit","editParams","stopCellEdit","stopParams","currentCell","originalValue","existingRow","newRow","processedRow","setEditCellValue","useGridSpanning","colspanMap","setColspanMap","rowSpanningState","setRowSpanningState","resetColSpan","getCellColSpanInfo","calculateColSpan","minFirstColumn","maxLastColumn","newMap","colSpan","setCellColSpanInfo","calculateRowSpan","spannedCells","hiddenCells","hiddenCellOriginMap","cellValue","span","nextIndex","nextRow","resetRowSpan","nextColWidth","getSpannedCells","getHiddenCells","getHiddenCellOriginMap","info","columnInfo","useGridDataSource","onAggregationResults","prevParamsRef","activeRequestRef","fetchRows","endRow","requestParams","response","shouldAppend","sortChanged","filterChanged","pageSizeChanged","prevRows","timer","fetchChildren","_parentId","groupKeys","existingIds","SEP_COL","SEP_KEY","aggregate","makeKey","fields","cellKey","ck","aggFn","hasColFields","usePivot","rawRows","rawCols","enabled","empty","rowFields","columnFields","valueFields","colDefMap","colKeySet","colKeys","outerMap","rk","labelValues","entry","colBucket","vf","raw","pivotRows","pivotRow","ck_","gtBuckets","bk","totalRow","cellValues","pivotColumns","orig","def","labelBase","headerName","n","copyTextSynchronous","text","textarea","success","writeToClipboard","fallbackSuccess","useGridClipboard","copySelectedRows","rowsToCopy","visibleColumns","headerRow","dataRows","fullContent","activeEl","tag","ListViewRow","listViewColumn","onRowClick","onSelectionChange","handleCheckboxChange","GridListView","ariaLabel","serverRowCount","paginationSlot","paginationSlotProps","PaginationComponent","totalRowCount","newPage","TextEditor","onValueChange","onCommit","onCancel","local","setLocal","ref","NumberEditor","BooleanEditor","handleChange","SelectEditor","options","opt","l","DateEditor","GridEditInputCell","CellRenderTarget","renderFn","CellErrorBoundary","CellImpl","onCellClick","onCellEditStart","onCellValueChange","isFocused","isFocusVisible","isEditable","onEditStart","onEditStop","colSpanInfo","rowSpanProp","isHiddenByRowSpan","rowMeta","handleValueChange","newValue","formattedValue","resolvedCellClassName","cellRef","handleClick","rowSpan","cellWidth","Cell","DragHandleIcon","DetailPanel","Row","isDetailPanelExpanded","onDetailPanelToggle","detailPanelContent","detailPanelHeight","onEditCellValueChange","focusedCellField","rowSpanningCaches","checkboxId","expandCellRef","checkboxCellRef","handleCellEditStart","handleCellValueChange","handleEditStopWrapper","cancel","cellCount","handleRowClick","rowPinnedPosition","isRowPinnedTop","isRowPinnedBottom","GridPinnedRows","position","getDetailPanelContent","SkeletonRow","skeletonWidth","GridVirtualRows","virtualContainerHeight","effectiveLoading","visibleRows","baseColumns","rowReorderHandlers","dataSourceLoading","sortedUnpinnedRowCount","infiniteScrollSkeletonCount","skeletonColumns","columnWidth","columnCount","self","t","actualIndex","SearchIcon","ColumnVisibilityPanel","onVisibilityChange","onShowAll","onHideAll","onColumnReorder","onColumnOrderReset","showNonHideableColumns","searchQuery","setSearchQuery","dragOverField","setDragOverField","dragFieldRef","hideableColumns","allVisible","filteredColumns","lowerQuery","handleToggleAll","handleDragLeave","toField","fromField","isVisible","isHideable","canReorder","GridStandaloneColumnPanel","isOpen","containerRef","panelRef","onColumnVisibilityChange","panelTop","setPanelTop","panelRight","setPanelRight","portalTarget","setPortalTarget","rect","handleReorder","currentOrder","fromIdx","toIdx","EMPTY_ROW_META_MAP","DataGrid","density","disableRowSelectionOnClick","disableMultipleRowSelection","propOnRowSelectionModelChange","propFilterModel","onFilterModelChange","onSortModelChange","propPagination","controlledExpandedRowIds","onDetailPanelExpandedRowIdsChange","groupingColDef","propRowGroupingModel","propRowCount","slots","slotProps","listView","propApiRef","effectiveNoRowsLabel","defaultFilterModel","defaultRowGroupingModel","latestToolbarRef","StableToolbar","Toolbar","controlledState","onRowSelectionModelChange","pivot","effectiveRowHeight","activeRows","isRowGroupingActive","effectivePinnedColumns","setServerAggregationResults","contentRef","gridRef","defaultGetRowId","effectiveGetRowId","normalizedRows","on","dataSourceRef","fetchChildrenRef","treeDataRef","handleNodeExpansion","gridData","isInternalLoading","treeDataHandlers","rowGroupingHandlers","updatedRow","nextRows","dataSourceHandlers","internalExpandedRowIds","setInternalExpandedRowIds","newExpandedRowIds","rowPipeline","spanning","hasAggregation","resolvedColumnWidths","targetCol","colLocalLeft","colLocalRight","resizeObserver","entries","newSelectionArray","handleSelectAll","newSortModel","handleSortAdd","existing","handleCellClick","prevEditingCellRef","wasEditing","hasRowSpanning","columnsPanelOpen","setColumnsPanelOpen","standalonePanelRef","toolbarProps","reorderHandler","cleanLeft","cleanRight","Skeleton","NO_VALUE_OPERATORS","getActiveFilter","FilterRow","onChange","filterId","operators","isActive","currentOperator","localValue","setLocalValue","onChangeRef","itemRef","colFieldRef","operatorRef","prevItemValue","handler","currentItem","currentValue","handleOperatorChange","op","noValue","newItem","handleClear","isNoValue","isBoolean","showValue","FilterPanel","handleItemChange","rest","handleLogicChange","filterableColumns","AGG_FNS","PivotIcon","PivotPanel","anchorRef","pos","setPos","portalContainer","setPortalContainer","computePos","update","onKey","inRow","inCol","inValue","isUsed","addRow","addCol","addValue","removeRow","removeCol","removeValue","changeValueFn","reset","numericFields","totalActive","panel","isNum","CloseIcon","GlobalSearch","placeholder","debounceMs","setIsExpanded","lastEmittedRef","lastIncomingValueRef","wasFocusedRef","handleExpand","GridTooltip","title","placement","enterDelay","leaveDelay","open","setOpen","coords","setCoords","timerRef","childRef","updateCoords","scrollX","scrollY","handleMouseEnter","handleMouseLeave","wrapperRef","SigmaIcon","ViewColumnIcon","FilterIcon","AggregationPanel","aggregableColumns","onFunctionChange","onClearAll","activeCount","currentFn","ColumnsPanelWrapper","FilterPanelWrapper","onCloseRef","activeFilterCount","handleClearAll","EMPTY_PIVOT","GridToolbar","pivotModel","forceColumnsOpen","onColumnsPanelClose","rightContent","renderColumnsButton","renderFilterButton","renderAggregationButton","renderExportButton","renderQuickFilter","aggOpen","setAggOpen","pivotOpen","setPivotOpen","colsOpen","setColsOpen","filterOpen","setFilterOpen","aggButtonRef","pivotButtonRef","colsButtonRef","filterButtonRef","colsWrapperRef","filterWrapperRef","aggWrapperRef","pivotActive","handleFunctionChange","clearAllAgg","handleSearchChange","nextModel","searchValue","handleVisibilityChange","handleShowAllColumns","handleHideAllColumns","o","m","useGridApiRef","Input","fullWidth","startAdornment","endAdornment","hexToRgb","hex","getExportColumns","resolveValue","colWeight","computeColumnStyles","usableWidth","totalWeight","styles","formatFilterSummary","exportToPdf","JsPDF","autoTable","jspdfMod","autoTableMod","fileName","logoUrl","orientation","alternateRowColor","headerBackgroundColor","headerTextColor","fontSize","groupedRows","doc","pageWidth","pageHeight","MARGIN","exportColumns","rowsToExport","startY","cursorX","cursorY","exportedAt","summary","head","body","foot","aggMod","indent","aggVal","formatted","columnStyles","hr","hg","hb","tr","tg","tb","totalPages","exportToCsv","includeHeaders","delimiter","csvContent","escapeCSV","aggModel","aggResult","aggLabels","aggValues","downloadFile","exportToExcel","sheetName","html","escapeHTML","isGrand","exportToJson","pretty","outData","stack","grandTotal","obj","data","summaryLabelObj","summaryDataObj","printGrid","titleOrOptions","printWindow","resolve","hasPrinted","mimeType","blob","url","link","inferCellType","defaultNumFmt","override","px","imageExtension","contentType","ct","fetchImages","urls","settled","commaIdx","header","b64","binary","uint8","mime","ext","buffer","exportToExcelAdvanced","sheetDefs","headerFillColor","headerFontSize","bodyFontSize","ExcelJS","workbook","sRows","resolvedSheets","imageCache","sheetDef","ws","argb","bottomBorder","rowScope","includeSummary","autoFilter","frozenHeader","imageColumns","urlsNeeded","seen","fetched","extension","imgId","headerValues","excelRowIdx","rowIdx","dataRow","maxImgH","max","rowHeightPt","rowHeightPx","colIdx","imgW","imgH","colWidthPx","hGapPx","vGapPx","labelRow","totalValues","topBorder","clean","lightBase","themeToCSS","theme","vars","set","cssVar","s","sh","scr","sk","DataGridThemeProvider","cssVars","darkTheme","roseTheme","emeraldTheme","amberTheme","compactTheme","readFromStorage","storage","writeToStorage","include","toWrite","useGridStateStorage","opts","latestStateRef","flush","clearState"],"mappings":"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","x_google_ignoreList":[0,1,2]}
|
|
1
|
+
{"version":3,"file":"opengridx.es.js","sources":["../node_modules/react/cjs/react-jsx-runtime.production.js","../node_modules/react/cjs/react-jsx-runtime.development.js","../node_modules/react/jsx-runtime.js","../lib/utils/pinning/index.ts","../lib/hooks/core/useLayout.ts","../lib/hooks/core/useGridKeyboardNavigation.ts","../lib/hooks/core/useGridControlledState.ts","../lib/utils/filtering/index.ts","../lib/utils/sorting/index.ts","../lib/hooks/core/useGridRowPipeline.ts","../lib/hooks/core/useGridVirtualization.ts","../lib/hooks/useColumnReorder.ts","../lib/components/ui/ExpandIcon.tsx","../lib/hooks/core/useGridColumns.tsx","../lib/hooks/core/useGridVisibleRows.ts","../lib/hooks/core/useGridScrollSync.ts","../lib/hooks/core/useGridStateSnapshot.ts","../lib/hooks/features/useAggregation.ts","../lib/components/DataGrid/GridAggregationFooter.tsx","../lib/components/DataGrid/GridEmptyState.tsx","../lib/components/DataGrid/GridErrorOverlay.tsx","../lib/components/ui/Checkbox.tsx","../lib/components/ColumnResizeHandle/ColumnResizeHandle.tsx","../lib/components/Header/ColumnMenu.tsx","../lib/components/Header/Header.tsx","../lib/components/ui/Button.tsx","../lib/components/Pagination/Pagination.tsx","../lib/hooks/core/useDataGrid.ts","../lib/hooks/useRowReorder.ts","../lib/hooks/useTreeData.ts","../lib/hooks/useRowGrouping.ts","../lib/hooks/features/useGridEditing.ts","../lib/hooks/features/useGridSpanning.ts","../lib/hooks/features/useGridDataSource.ts","../lib/hooks/features/usePivot.ts","../lib/hooks/features/useGridClipboard.ts","../lib/components/ListView/ListViewRow.tsx","../lib/components/DataGrid/GridListView.tsx","../lib/components/Cell/GridEditInputCell.tsx","../lib/components/Cell/CellErrorBoundary.tsx","../lib/components/Cell/Cell.tsx","../lib/components/ui/DragHandleIcon.tsx","../lib/components/DetailPanel/DetailPanel.tsx","../lib/components/Row/Row.tsx","../lib/components/DataGrid/GridPinnedRows.tsx","../lib/components/SkeletonRow/SkeletonRow.tsx","../lib/components/DataGrid/GridVirtualRows.tsx","../lib/components/ColumnVisibilityPanel/ColumnVisibilityPanel.tsx","../lib/components/DataGrid/GridStandaloneColumnPanel.tsx","../lib/components/DataGrid/DataGrid.tsx","../lib/components/Skeleton/Skeleton.tsx","../lib/components/FilterPanel/FilterPanel.tsx","../lib/components/Toolbar/PivotPanel.tsx","../lib/components/Toolbar/GlobalSearch.tsx","../lib/components/Tooltip/Tooltip.tsx","../lib/components/Toolbar/GridToolbar.tsx","../lib/hooks/core/useGridApiRef.ts","../lib/components/ui/Input.tsx","../lib/utils/export/exportToPdf.ts","../lib/utils/export/index.ts","../lib/utils/export/exportToExcelAdvanced.ts","../lib/theme/DataGridThemeProvider.tsx","../lib/theme/presets.ts","../lib/state/useGridStateStorage.ts"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (\n (\"number\" === typeof type.tag &&\n console.error(\n \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n ),\n type.$$typeof)\n ) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkKeyStringCoercion(value) {\n try {\n testStringCoercion(value);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n if (JSCompiler_inline_result) {\n JSCompiler_inline_result = console;\n var JSCompiler_temp_const = JSCompiler_inline_result.error;\n var JSCompiler_inline_result$jscomp$0 =\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\";\n JSCompiler_temp_const.call(\n JSCompiler_inline_result,\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n JSCompiler_inline_result$jscomp$0\n );\n return testStringCoercion(value);\n }\n }\n function getTaskName(type) {\n if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n if (\n \"object\" === typeof type &&\n null !== type &&\n type.$$typeof === REACT_LAZY_TYPE\n )\n return \"<...>\";\n try {\n var name = getComponentNameFromType(type);\n return name ? \"<\" + name + \">\" : \"<...>\";\n } catch (x) {\n return \"<...>\";\n }\n }\n function getOwner() {\n var dispatcher = ReactSharedInternals.A;\n return null === dispatcher ? null : dispatcher.getOwner();\n }\n function UnknownOwner() {\n return Error(\"react-stack-top-frame\");\n }\n function hasValidKey(config) {\n if (hasOwnProperty.call(config, \"key\")) {\n var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n if (getter && getter.isReactWarning) return !1;\n }\n return void 0 !== config.key;\n }\n function defineKeyPropWarningGetter(props, displayName) {\n function warnAboutAccessingKey() {\n specialPropKeyWarningShown ||\n ((specialPropKeyWarningShown = !0),\n console.error(\n \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n displayName\n ));\n }\n warnAboutAccessingKey.isReactWarning = !0;\n Object.defineProperty(props, \"key\", {\n get: warnAboutAccessingKey,\n configurable: !0\n });\n }\n function elementRefGetterWithDeprecationWarning() {\n var componentName = getComponentNameFromType(this.type);\n didWarnAboutElementRef[componentName] ||\n ((didWarnAboutElementRef[componentName] = !0),\n console.error(\n \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n ));\n componentName = this.props.ref;\n return void 0 !== componentName ? componentName : null;\n }\n function ReactElement(type, key, props, owner, debugStack, debugTask) {\n var refProp = props.ref;\n type = {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n props: props,\n _owner: owner\n };\n null !== (void 0 !== refProp ? refProp : null)\n ? Object.defineProperty(type, \"ref\", {\n enumerable: !1,\n get: elementRefGetterWithDeprecationWarning\n })\n : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n type._store = {};\n Object.defineProperty(type._store, \"validated\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: 0\n });\n Object.defineProperty(type, \"_debugInfo\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: null\n });\n Object.defineProperty(type, \"_debugStack\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugStack\n });\n Object.defineProperty(type, \"_debugTask\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugTask\n });\n Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n return type;\n }\n function jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n debugStack,\n debugTask\n ) {\n var children = config.children;\n if (void 0 !== children)\n if (isStaticChildren)\n if (isArrayImpl(children)) {\n for (\n isStaticChildren = 0;\n isStaticChildren < children.length;\n isStaticChildren++\n )\n validateChildKeys(children[isStaticChildren]);\n Object.freeze && Object.freeze(children);\n } else\n console.error(\n \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n );\n else validateChildKeys(children);\n if (hasOwnProperty.call(config, \"key\")) {\n children = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return \"key\" !== k;\n });\n isStaticChildren =\n 0 < keys.length\n ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n : \"{key: someKey}\";\n didWarnAboutKeySpread[children + isStaticChildren] ||\n ((keys =\n 0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n console.error(\n 'A props object containing a \"key\" prop is being spread into JSX:\\n let props = %s;\\n <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n let props = %s;\\n <%s key={someKey} {...props} />',\n isStaticChildren,\n children,\n keys,\n children\n ),\n (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n }\n children = null;\n void 0 !== maybeKey &&\n (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n children &&\n defineKeyPropWarningGetter(\n maybeKey,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n return ReactElement(\n type,\n children,\n maybeKey,\n getOwner(),\n debugStack,\n debugTask\n );\n }\n function validateChildKeys(node) {\n isValidElement(node)\n ? node._store && (node._store.validated = 1)\n : \"object\" === typeof node &&\n null !== node &&\n node.$$typeof === REACT_LAZY_TYPE &&\n (\"fulfilled\" === node._payload.status\n ? isValidElement(node._payload.value) &&\n node._payload.value._store &&\n (node._payload.value._store.validated = 1)\n : node._store && (node._store.validated = 1));\n }\n function isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n }\n var React = require(\"react\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n isArrayImpl = Array.isArray,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n React = {\n react_stack_bottom_frame: function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n React,\n UnknownOwner\n )();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutKeySpread = {};\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.jsx = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !1,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n exports.jsxs = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !0,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","\nimport type { GridColDef, GridRowModel, GridColumnPinning, GridRowPinning, GridPinnedPosition, GridRowId } from '../../types';\n\nexport function isColumnPinned(field: string, pinnedColumns?: GridColumnPinning): GridPinnedPosition | null {\n if (!pinnedColumns) return null;\n\n if (pinnedColumns.left?.includes(field)) {\n return 'left';\n }\n\n if (pinnedColumns.right?.includes(field)) {\n return 'right';\n }\n\n return null;\n}\n\nexport function getPinnedColumnGroups<R extends GridRowModel = GridRowModel>(\n columns: GridColDef<R>[],\n pinnedColumns?: GridColumnPinning\n): {\n left: GridColDef<R>[];\n center: GridColDef<R>[];\n right: GridColDef<R>[];\n} {\n const left: GridColDef<R>[] = [];\n const center: GridColDef<R>[] = [];\n const right: GridColDef<R>[] = [];\n\n if (!pinnedColumns) {\n return { left, center: columns, right };\n }\n\n columns.forEach(col => {\n const pinnedPosition = isColumnPinned(col.field, pinnedColumns);\n\n if (pinnedPosition === 'left') {\n left.push(col);\n } else if (pinnedPosition === 'right') {\n right.push(col);\n } else {\n center.push(col);\n }\n });\n\n if (pinnedColumns.left) {\n left.sort((a, b) => {\n const aIndex = pinnedColumns.left!.indexOf(a.field);\n const bIndex = pinnedColumns.left!.indexOf(b.field);\n return aIndex - bIndex;\n });\n }\n\n if (pinnedColumns.right) {\n right.sort((a, b) => {\n const aIndex = pinnedColumns.right!.indexOf(a.field);\n const bIndex = pinnedColumns.right!.indexOf(b.field);\n return aIndex - bIndex;\n });\n }\n\n return { left, center, right };\n}\n\nexport function calculatePinnedPositions<R extends GridRowModel = GridRowModel>(\n columns: GridColDef<R>[],\n columnWidths: Record<string, number>,\n pinnedColumns?: GridColumnPinning,\n checkboxSelection?: boolean,\n pinCheckboxColumn?: boolean,\n hasDetailPanel?: boolean,\n pinExpandColumn?: boolean,\n rowReordering?: boolean\n): Record<string, number> {\n const positions: Record<string, number> = {};\n\n if (!pinnedColumns) return positions;\n\n const groups = getPinnedColumnGroups(columns, pinnedColumns);\n\n let leftOffset = 0;\n\n if (rowReordering) {\n leftOffset += 48;\n }\n\n if (hasDetailPanel && pinExpandColumn) {\n leftOffset += 48; \n }\n\n if (checkboxSelection && pinCheckboxColumn) {\n leftOffset += 48; \n }\n\n groups.left.forEach(col => {\n positions[col.field] = leftOffset;\n const width = columnWidths[col.field] ?? col.width ?? 100;\n leftOffset += width;\n });\n\n let rightOffset = 0;\n\n [...groups.right].reverse().forEach(col => {\n const width = columnWidths[col.field] ?? col.width ?? 100;\n positions[col.field] = rightOffset;\n rightOffset += width;\n });\n\n return positions;\n}\n\nexport function isColumnPinnable<R extends GridRowModel = GridRowModel>(\n colDef: GridColDef<R>\n): boolean {\n return colDef.pinnable !== false;\n}\n\nexport function pinColumn(\n field: string,\n position: GridPinnedPosition,\n currentPinning?: GridColumnPinning\n): GridColumnPinning {\n const newPinning: GridColumnPinning = {\n left: [...(currentPinning?.left || [])],\n right: [...(currentPinning?.right || [])]\n };\n\n newPinning.left = (newPinning.left || []).filter(f => f !== field);\n newPinning.right = (newPinning.right || []).filter(f => f !== field);\n\n if (position === 'left') {\n if (!newPinning.left) newPinning.left = [];\n newPinning.left.push(field);\n } else {\n if (!newPinning.right) newPinning.right = [];\n newPinning.right.push(field);\n }\n\n return newPinning;\n}\n\nexport function unpinColumn(\n field: string,\n currentPinning?: GridColumnPinning\n): GridColumnPinning {\n if (!currentPinning) return {};\n\n return {\n left: currentPinning.left?.filter(f => f !== field) || [],\n right: currentPinning.right?.filter(f => f !== field) || []\n };\n}\n\nexport function getPinnedColumnsWidth(\n columns: GridColDef[],\n columnWidths: Record<string, number>,\n position: GridPinnedPosition,\n pinnedColumns?: GridColumnPinning\n): number {\n if (!pinnedColumns) return 0;\n\n const pinnedFields = position === 'left' ? pinnedColumns.left : pinnedColumns.right;\n if (!pinnedFields) return 0;\n\n return pinnedFields.reduce((total, field) => {\n const col = columns.find(c => c.field === field);\n if (!col) return total;\n\n const width = columnWidths[field] ?? col.width ?? 100;\n return total + width;\n }, 0);\n}\n\nexport function isRowPinned(\n rowId: GridRowId,\n pinnedRows?: GridRowPinning\n): 'top' | 'bottom' | null {\n if (!pinnedRows) return null;\n\n if (pinnedRows.top?.includes(rowId)) {\n return 'top';\n }\n\n if (pinnedRows.bottom?.includes(rowId)) {\n return 'bottom';\n }\n\n return null;\n}\n\nexport function getPinnedRowGroups<R extends GridRowModel = GridRowModel>(\n rows: R[],\n pinnedRows?: GridRowPinning\n): {\n top: R[];\n center: R[];\n bottom: R[];\n} {\n const top: R[] = [];\n const center: R[] = [];\n const bottom: R[] = [];\n\n if (!pinnedRows) {\n return { top, center: rows, bottom };\n }\n\n rows.forEach(row => {\n const pinnedPosition = isRowPinned(row.id, pinnedRows);\n\n if (pinnedPosition === 'top') {\n top.push(row);\n } else if (pinnedPosition === 'bottom') {\n bottom.push(row);\n } else {\n center.push(row);\n }\n });\n\n if (pinnedRows.top) {\n top.sort((a, b) => {\n const aIndex = pinnedRows.top!.indexOf(a.id);\n const bIndex = pinnedRows.top!.indexOf(b.id);\n return aIndex - bIndex;\n });\n }\n\n if (pinnedRows.bottom) {\n bottom.sort((a, b) => {\n const aIndex = pinnedRows.bottom!.indexOf(a.id);\n const bIndex = pinnedRows.bottom!.indexOf(b.id);\n return aIndex - bIndex;\n });\n }\n\n return { top, center, bottom };\n}\n\nexport function pinRow(\n rowId: GridRowId,\n position: 'top' | 'bottom',\n currentPinning?: GridRowPinning\n): GridRowPinning {\n const newPinning: GridRowPinning = {\n top: [...(currentPinning?.top || [])],\n bottom: [...(currentPinning?.bottom || [])]\n };\n\n newPinning.top = (newPinning.top || []).filter(id => id !== rowId);\n newPinning.bottom = (newPinning.bottom || []).filter(id => id !== rowId);\n\n if (position === 'top') {\n if (!newPinning.top) newPinning.top = [];\n newPinning.top.push(rowId);\n } else {\n if (!newPinning.bottom) newPinning.bottom = [];\n newPinning.bottom.push(rowId);\n }\n\n return newPinning;\n}\n\nexport function unpinRow(\n rowId: GridRowId,\n currentPinning?: GridRowPinning\n): GridRowPinning {\n if (!currentPinning) return {};\n\n return {\n top: currentPinning.top?.filter(id => id !== rowId) || [],\n bottom: currentPinning.bottom?.filter(id => id !== rowId) || []\n };\n}\n\nexport function getPinnedRowsCount(\n position: 'top' | 'bottom',\n pinnedRows?: GridRowPinning\n): number {\n if (!pinnedRows) return 0;\n\n const pinnedIds = position === 'top' ? pinnedRows.top : pinnedRows.bottom;\n return pinnedIds?.length || 0;\n}\n","import { useMemo } from 'react';\nimport type { GridColDef, GridRowModel, GridRowId, GridColumnPinning, GridDetailPanelHeight } from '../../types';\nimport { isColumnPinned } from '../../utils/pinning';\n\nexport interface UseLayoutParams<R extends GridRowModel> {\n rowHeight: number;\n pagination: boolean;\n paginatedUnpinnedRows: R[];\n sortedUnpinnedRows: R[];\n expandedRowIds: Set<GridRowId>;\n getDetailPanelHeight?: (params: { row: R; id: GridRowId; rowIndex: number }) => GridDetailPanelHeight;\n pinnedTopRowsLength: number;\n pinnedBottomRowsLength: number;\n visibleOrderedColumns: GridColDef<R>[];\n pinnedColumns?: GridColumnPinning;\n columnWidths: Record<string, number>;\n viewportWidth: number;\n checkboxSelection: boolean;\n hasDetailPanel: boolean;\n rowReordering: boolean;\n pinCheckboxColumn: boolean;\n pinExpandColumn: boolean;\n autoHeight: boolean;\n paginationMode: string;\n isLoading: boolean;\n pageSize: number;\n}\n\nexport interface LayoutResult<R extends GridRowModel> {\n rowHeights: number[];\n cumulativeHeights: number[];\n unpinnedRowsHeight: number;\n pinnedTopHeight: number;\n pinnedBottomHeight: number;\n leftPinnedCols: (GridColDef<R> & { width: number; zIndex: number })[];\n rightPinnedCols: (GridColDef<R> & { width: number; zIndex: number })[];\n unpinnedColsWithWidth: (GridColDef<R> & { width: number })[];\n unpinnedColWidths: number[];\n unpinnedAccWidths: number[];\n totalWidth: number;\n leftWidth: number;\n rightWidth: number;\n unpinnedTotalWidth: number;\n systemColumnsWidth: number;\n pinnedTopRowsLength: number;\n pinnedBottomRowsLength: number;\n unpinnedRowsLength: number;\n}\n\nfunction parseWidth(width: number | string | undefined): { type: 'fixed' | 'percentage' | 'auto'; value: number } {\n if (width === undefined) return { type: 'auto', value: 0 };\n if (typeof width === 'number') return { type: 'fixed', value: width };\n if (typeof width === 'string') {\n if (width.toLowerCase() === 'auto') return { type: 'auto', value: 0 };\n if (width.endsWith('%')) {\n const percentage = parseFloat(width);\n return { type: 'percentage', value: percentage };\n }\n const floatVal = parseFloat(width);\n if (!isNaN(floatVal)) return { type: 'fixed', value: floatVal };\n }\n return { type: 'fixed', value: 100 };\n}\n\nexport function useLayout<R extends GridRowModel>(params: UseLayoutParams<R>): LayoutResult<R> {\n const {\n rowHeight,\n pagination,\n paginatedUnpinnedRows,\n sortedUnpinnedRows,\n expandedRowIds,\n getDetailPanelHeight,\n pinnedTopRowsLength,\n pinnedBottomRowsLength,\n visibleOrderedColumns,\n pinnedColumns,\n columnWidths,\n viewportWidth,\n checkboxSelection,\n hasDetailPanel,\n rowReordering,\n paginationMode,\n isLoading,\n pageSize,\n } = params;\n\n return useMemo<LayoutResult<R>>(() => {\n const unpinnedRows = pagination ? paginatedUnpinnedRows : sortedUnpinnedRows;\n\n const rowHeights = unpinnedRows.map((row, index) => {\n let height = rowHeight;\n if (expandedRowIds.has(row.id)) {\n const detailHeight = getDetailPanelHeight?.({ row, id: row.id, rowIndex: pinnedTopRowsLength + index }) ?? 200;\n height += typeof detailHeight === 'number' ? detailHeight : parseInt(String(detailHeight), 10) || 200;\n }\n return height;\n });\n\n const cumulativeHeights = rowHeights.reduce((acc, height, index) => {\n acc.push((acc[index - 1] || 0) + height);\n return acc;\n }, [] as number[]);\n\n const skeletonCount = (paginationMode === 'infinite' && isLoading && unpinnedRows.length > 0)\n ? Math.min(pageSize, 20)\n : 0;\n const unpinnedRowsHeight = (cumulativeHeights[cumulativeHeights.length - 1] || 0) + skeletonCount * rowHeight;\n const pinnedTopHeight = pinnedTopRowsLength * rowHeight;\n const pinnedBottomHeight = pinnedBottomRowsLength * rowHeight;\n\n const rawLeftPinnedCols: GridColDef<R>[] = [];\n const rawRightPinnedCols: GridColDef<R>[] = [];\n const unpinnedCols: GridColDef<R>[] = [];\n const unpinnedColWidths: number[] = [];\n\n visibleOrderedColumns.forEach(col => {\n const pinned = isColumnPinned(col.field, pinnedColumns);\n if (pinned === 'left') {\n rawLeftPinnedCols.push(col);\n } else if (pinned === 'right') {\n rawRightPinnedCols.push(col);\n } else {\n unpinnedCols.push(col);\n }\n });\n\n const systemColumnsWidth = (checkboxSelection ? 48 : 0) + (hasDetailPanel ? 48 : 0) + (rowReordering ? 48 : 0);\n\n const getColWidth = (c: GridColDef<R>) => columnWidths[c.field] ?? c.width;\n\n const leftWidth = rawLeftPinnedCols.reduce((sum, c) => {\n const parsed = parseWidth(getColWidth(c));\n return sum + (parsed.type === 'fixed' ? parsed.value : 100);\n }, 0);\n const rightWidth = rawRightPinnedCols.reduce((sum, c) => {\n const parsed = parseWidth(getColWidth(c));\n return sum + (parsed.type === 'fixed' ? parsed.value : 100);\n }, 0);\n\n const naturalFlexWidth = unpinnedCols.reduce((sum, col) => {\n const hasManualWidth = Object.prototype.hasOwnProperty.call(columnWidths, col.field);\n if (!hasManualWidth && col.flex && col.flex > 0) {\n const minWidth = col.minWidth ?? 150;\n const w = typeof col.width === 'number' ? col.width : 150;\n return sum + (minWidth || w);\n }\n const parsed = parseWidth(getColWidth(col));\n if (parsed.type === 'fixed') return sum + parsed.value;\n if (parsed.type === 'percentage') return sum + 100;\n return sum + (col.minWidth ?? 150);\n }, 0);\n\n const availableWidth = Math.max(\n viewportWidth - systemColumnsWidth - leftWidth - rightWidth,\n naturalFlexWidth\n );\n\n const fixedWidthCols: Array<{ col: GridColDef<R>; width: number }> = [];\n const percentageCols: Array<{ col: GridColDef<R>; percentage: number }> = [];\n const flexCols: Array<{ col: GridColDef<R>; flex: number }> = [];\n\n unpinnedCols.forEach(col => {\n const hasManualWidth = Object.prototype.hasOwnProperty.call(columnWidths, col.field);\n const parsed = parseWidth(getColWidth(col));\n\n if (!hasManualWidth && col.flex && col.flex > 0) {\n flexCols.push({ col, flex: col.flex });\n return;\n }\n\n if (parsed.type === 'fixed') {\n fixedWidthCols.push({ col, width: parsed.value });\n } else if (parsed.type === 'percentage') {\n percentageCols.push({ col, percentage: parsed.value });\n } else {\n flexCols.push({ col, flex: 1 });\n }\n });\n\n const fixedWidth = fixedWidthCols.reduce((sum, { width }) => sum + width, 0);\n let remainingSpaceForFlex = Math.max(0, availableWidth - fixedWidth);\n\n const percentageWidthMap = new Map<string, number>();\n percentageCols.forEach(({ col, percentage }) => {\n const calculatedWidth = (percentage / 100) * remainingSpaceForFlex;\n percentageWidthMap.set(col.field, calculatedWidth);\n remainingSpaceForFlex -= calculatedWidth;\n });\n remainingSpaceForFlex = Math.max(0, remainingSpaceForFlex);\n\n const finalFlexWidths = new Map<string, number>();\n const flexItems = flexCols.map(f => ({\n ...f,\n minWidth: f.col.minWidth ?? 50,\n maxWidth: f.col.maxWidth ?? Infinity,\n frozen: false,\n computedWidth: 0\n }));\n\n const solveFlexAllocation = () => {\n let iterations = 0;\n const maxIterations = flexItems.length * 2;\n\n while (iterations < maxIterations) {\n iterations++;\n const unfrozen = flexItems.filter(f => !f.frozen);\n if (unfrozen.length === 0) break;\n\n const unfrozenFlexTotal = unfrozen.reduce((sum, f) => sum + f.flex, 0);\n const frozenWidthTotal = flexItems.reduce((sum, f) => f.frozen ? sum + f.computedWidth : sum, 0);\n const currentFreeSpace = Math.max(0, remainingSpaceForFlex - frozenWidthTotal);\n\n if (unfrozenFlexTotal <= 0) {\n unfrozen.forEach(f => { f.computedWidth = f.minWidth; f.frozen = true; });\n break;\n }\n\n const pixelsPerFlex = currentFreeSpace / unfrozenFlexTotal;\n let totalViolation = 0;\n const minViolators: typeof flexItems = [];\n const maxViolators: typeof flexItems = [];\n\n unfrozen.forEach(f => {\n const rawWidth = pixelsPerFlex * f.flex;\n if (rawWidth < f.minWidth) {\n totalViolation += f.minWidth - rawWidth;\n minViolators.push(f);\n } else if (rawWidth > f.maxWidth) {\n totalViolation += f.maxWidth - rawWidth;\n maxViolators.push(f);\n } else {\n f.computedWidth = rawWidth;\n }\n });\n\n if (minViolators.length === 0 && maxViolators.length === 0) {\n unfrozen.forEach(f => f.frozen = true);\n break;\n }\n\n if (totalViolation > 0) {\n minViolators.forEach(f => { f.computedWidth = f.minWidth; f.frozen = true; });\n } else if (totalViolation < 0) {\n maxViolators.forEach(f => { f.computedWidth = f.maxWidth; f.frozen = true; });\n } else {\n minViolators.forEach(f => { f.computedWidth = f.minWidth; f.frozen = true; });\n maxViolators.forEach(f => { f.computedWidth = f.maxWidth; f.frozen = true; });\n }\n }\n };\n\n solveFlexAllocation();\n flexItems.forEach(f => finalFlexWidths.set(f.col.field, f.computedWidth));\n\n const computedWidthMap = new Map<string, number>();\n unpinnedCols.forEach(col => {\n let computedWidth: number;\n if (finalFlexWidths.has(col.field)) {\n computedWidth = finalFlexWidths.get(col.field)!;\n } else {\n const fixedCol = fixedWidthCols.find(f => f.col.field === col.field);\n const pctCol = percentageCols.find(p => p.col.field === col.field);\n if (fixedCol) {\n computedWidth = fixedCol.width;\n } else if (pctCol) {\n const rawPctWidth = percentageWidthMap.get(col.field) || 0;\n computedWidth = Math.max(col.minWidth ?? 50, rawPctWidth || 100);\n } else {\n computedWidth = 100;\n }\n }\n unpinnedColWidths.push(computedWidth);\n computedWidthMap.set(col.field, computedWidth);\n });\n\n const unpinnedColsWithWidth = unpinnedCols.map(col => {\n const flexItem = flexItems.find(f => f.col.field === col.field);\n return {\n ...col,\n width: computedWidthMap.get(col.field) ?? (typeof col.width === 'number' ? col.width : 100),\n flex: flexItem ? flexItem.flex : col.flex\n };\n });\n\n const baseLeftZ = 11;\n const leftPinnedCols = rawLeftPinnedCols.map((col, i) => {\n const parsed = parseWidth(getColWidth(col));\n return { ...col, width: parsed.type === 'fixed' ? parsed.value : 100, zIndex: baseLeftZ + i };\n });\n\n const baseRightZ = 11;\n const rightPinnedCols = rawRightPinnedCols.map((col, i) => {\n const parsed = parseWidth(getColWidth(col));\n return {\n ...col,\n width: parsed.type === 'fixed' ? parsed.value : 100,\n zIndex: baseRightZ + (rawRightPinnedCols.length - 1 - i)\n };\n });\n\n const unpinnedTotalWidth = unpinnedColWidths.reduce((sum, w) => sum + w, 0);\n const totalWidth = leftWidth + unpinnedTotalWidth + rightWidth + systemColumnsWidth;\n const unpinnedAccWidths = unpinnedColWidths.reduce((acc, w, i) => {\n acc.push((acc[i - 1] || 0) + w);\n return acc;\n }, [] as number[]);\n\n return {\n rowHeights,\n cumulativeHeights,\n unpinnedRowsHeight,\n pinnedTopHeight,\n pinnedBottomHeight,\n leftPinnedCols,\n rightPinnedCols,\n unpinnedColsWithWidth,\n unpinnedColWidths,\n unpinnedAccWidths,\n totalWidth,\n leftWidth,\n rightWidth,\n unpinnedTotalWidth,\n systemColumnsWidth,\n pinnedTopRowsLength,\n pinnedBottomRowsLength,\n unpinnedRowsLength: unpinnedRows.length,\n };\n }, [\n rowHeight,\n pagination,\n paginatedUnpinnedRows,\n sortedUnpinnedRows,\n expandedRowIds,\n getDetailPanelHeight,\n pinnedTopRowsLength,\n pinnedBottomRowsLength,\n visibleOrderedColumns,\n pinnedColumns,\n columnWidths,\n viewportWidth,\n checkboxSelection,\n hasDetailPanel,\n rowReordering,\n paginationMode,\n isLoading,\n pageSize,\n ]);\n}\n","import { useState, useCallback } from 'react';\nimport type { GridRowModel, GridRowId, GridColDef, GridCellParams, GridSortItem, GridSortDirection } from '../../types';\nimport type { GridEditingState } from '../features/useGridEditing';\n\ninterface ColumnMetrics {\n leftPinnedWidth: number;\n rightPinnedWidth: number;\n unpinnedAccWidths: number[];\n unpinnedCols: { field: string }[];\n totalSpecialsWidth: number;\n pinnedSpecialsWidth: number;\n}\n\ninterface VirtualizationSnapshot {\n cumulativeHeights: number[];\n pinnedTopHeight: number;\n columnMetrics: ColumnMetrics | null;\n}\n\nexport interface UseGridKeyboardNavigationParams<R extends GridRowModel> {\n allRenderableRows: R[];\n navigationColumns: { field: string; editable?: boolean; sortable?: boolean }[];\n checkboxSelection: boolean;\n selectedRowIds: Set<GridRowId>;\n handleSelectionChange: (id: GridRowId, selected: boolean) => void;\n handleDetailPanelToggle: (id: GridRowId) => void;\n editingHandlers: {\n editingCell: GridEditingState['editingCell'];\n startCellEdit: (params: { id: GridRowId; field: string; value: unknown }) => void;\n stopCellEdit: (params?: { cancel?: boolean }) => void;\n };\n setKeyboardMode: (mode: boolean) => void;\n sortModel: GridSortItem[];\n handleSort: (field: string, direction: GridSortDirection) => void;\n isCellEditable?: (params: GridCellParams<R>) => boolean;\n pagination: boolean;\n pageSize: number;\n virtualization: VirtualizationSnapshot;\n viewportRef: React.RefObject<HTMLDivElement | null>;\n}\n\nexport interface FocusedCell {\n id: GridRowId;\n field: string;\n}\n\nexport interface UseGridKeyboardNavigationReturn {\n focusedCell: FocusedCell | null;\n setFocusedCell: React.Dispatch<React.SetStateAction<FocusedCell | null>>;\n handleFocus: (event: React.FocusEvent<HTMLDivElement>) => void;\n handleBlur: (event: React.FocusEvent<HTMLDivElement>) => void;\n handleKeyDown: (event: React.KeyboardEvent) => void;\n}\n\nexport function useGridKeyboardNavigation<R extends GridRowModel>(\n params: UseGridKeyboardNavigationParams<R>\n): UseGridKeyboardNavigationReturn {\n const {\n allRenderableRows,\n navigationColumns,\n checkboxSelection,\n selectedRowIds,\n handleSelectionChange,\n handleDetailPanelToggle,\n editingHandlers,\n setKeyboardMode,\n sortModel,\n handleSort,\n isCellEditable,\n pagination,\n pageSize,\n virtualization,\n viewportRef,\n } = params;\n\n const [focusedCell, setFocusedCell] = useState<FocusedCell | null>(null);\n\n const handleFocus = useCallback((event: React.FocusEvent<HTMLDivElement>) => {\n if (event.target === event.currentTarget) {\n setFocusedCell(prev => {\n if (prev) return prev;\n if (checkboxSelection) {\n return { id: 'HEADER', field: '__checkbox_col__' };\n }\n const firstRow = allRenderableRows[0];\n const firstCol = navigationColumns[0];\n if (firstRow && firstCol) {\n return { id: firstRow.id, field: firstCol.field };\n }\n return null;\n });\n }\n }, [allRenderableRows, navigationColumns, checkboxSelection]);\n\n const handleBlur = useCallback((event: React.FocusEvent<HTMLDivElement>) => {\n if (!event.currentTarget.contains(event.relatedTarget as Node)) {\n setFocusedCell(null);\n }\n }, []);\n\n const handleKeyDown = useCallback((event: React.KeyboardEvent) => {\n setKeyboardMode(true);\n\n if (!focusedCell) return;\n\n const { id, field } = focusedCell;\n const isEditing = Boolean(editingHandlers.editingCell);\n\n if (id === 'HEADER' && (event.key === 'Enter' || event.key === ' ')) {\n event.preventDefault();\n const col = navigationColumns.find(c => c.field === field);\n if (col && col.sortable !== false) {\n const currentSort = sortModel.find(item => item.field === field);\n let newDirection: GridSortDirection = 'asc';\n if (currentSort) {\n newDirection = currentSort.sort === 'asc' ? 'desc' : null;\n }\n handleSort(field, newDirection);\n }\n return;\n }\n\n if (event.key === 'Enter') {\n event.preventDefault();\n if (isEditing) {\n editingHandlers.stopCellEdit();\n } else {\n const col = navigationColumns.find(c => c.field === field);\n if (col?.editable) {\n const row = allRenderableRows.find(r => r.id === id);\n if (row) {\n editingHandlers.startCellEdit({ id, field, value: (row as R & Record<string, unknown>)[field] });\n }\n }\n }\n return;\n }\n\n if (event.key === ' ' || event.key === 'Spacebar') {\n if (!isEditing) {\n if (field === '__checkbox_col__') {\n event.preventDefault();\n handleSelectionChange(id, !selectedRowIds.has(id));\n return;\n }\n if (field === '__expand_col__') {\n event.preventDefault();\n handleDetailPanelToggle(id);\n return;\n }\n }\n }\n\n if (event.key === 'Escape') {\n if (isEditing) {\n event.preventDefault();\n editingHandlers.stopCellEdit({ cancel: true });\n }\n return;\n }\n\n if (isEditing && event.key !== 'Tab') return;\n\n const isHeader = id === 'HEADER';\n const rowIndex = isHeader ? -1 : allRenderableRows.findIndex(r => r.id === id);\n const colIndex = navigationColumns.findIndex(c => c.field === field);\n\n if (!isHeader && rowIndex === -1) return;\n if (colIndex === -1) return;\n\n const findNextCell = (\n startRow: number,\n startCol: number,\n deltaRow: number,\n deltaCol: number,\n wrapRow: boolean,\n allowHeader = false\n ) => {\n let r = startRow + deltaRow;\n let c = startCol + deltaCol;\n\n if (wrapRow && deltaCol !== 0) {\n if (deltaCol > 0 && c >= navigationColumns.length) { c = 0; r++; }\n else if (deltaCol < 0 && c < 0) { c = navigationColumns.length - 1; r--; }\n }\n\n if (!wrapRow && (c < 0 || c >= navigationColumns.length)) return null;\n if (r < (allowHeader ? -1 : 0) || r >= allRenderableRows.length) return null;\n\n return { r, c };\n };\n\n const findNextEditable = (\n startRow: number,\n startCol: number,\n deltaRow: number,\n deltaCol: number,\n wrapRow: boolean,\n allowHeader = false\n ) => {\n let r = startRow;\n let c = startCol;\n let steps = 0;\n const maxSteps = allRenderableRows.length * navigationColumns.length + navigationColumns.length;\n\n while (steps < maxSteps) {\n steps++;\n r += deltaRow;\n c += deltaCol;\n\n if (wrapRow && deltaCol !== 0) {\n if (deltaCol > 0) {\n if (c >= navigationColumns.length) { c = 0; r++; }\n } else {\n if (c < 0) { c = navigationColumns.length - 1; r--; }\n }\n } else {\n if (c < 0 || c >= navigationColumns.length) return null;\n }\n\n if (r < -1 || r >= allRenderableRows.length) return null;\n\n if (r === -1) {\n if (!allowHeader) continue;\n const col = navigationColumns[c];\n const isSortable = col.sortable !== false;\n if (['__checkbox_col__'].includes(col.field) || isSortable) return { r, c };\n continue;\n }\n\n const row = allRenderableRows[r];\n const col = navigationColumns[c];\n const isInteractable = ['__checkbox_col__', '__expand_col__', '__reorder_col__'].includes(col.field);\n let cellEditable = col.editable || isInteractable;\n\n if (isCellEditable && !isInteractable) {\n try {\n cellEditable = isCellEditable({\n row,\n field: col.field,\n value: (row as R & Record<string, unknown>)[col.field],\n colDef: col as GridColDef<R>,\n rowIndex: r,\n colIndex: c\n });\n } catch {\n // isCellEditable threw — treat cell as non-editable\n }\n }\n\n if (cellEditable) return { r, c };\n }\n return null;\n };\n\n let nextRowIndex = rowIndex;\n let nextColIndex = colIndex;\n let handled = false;\n\n if (event.key === 'Tab') {\n const dir = event.shiftKey ? -1 : 1;\n const res = findNextEditable(rowIndex, colIndex, 0, dir, true, false);\n if (res) { nextRowIndex = res.r; nextColIndex = res.c; handled = true; }\n } else if (event.key === 'ArrowRight') {\n const res = findNextCell(rowIndex, colIndex, 0, 1, true, true);\n if (res) { nextRowIndex = res.r; nextColIndex = res.c; handled = true; }\n } else if (event.key === 'ArrowLeft') {\n const res = findNextCell(rowIndex, colIndex, 0, -1, true, true);\n if (res) { nextRowIndex = res.r; nextColIndex = res.c; handled = true; }\n } else if (event.key === 'ArrowDown') {\n const res = findNextCell(rowIndex, colIndex, 1, 0, false, true);\n if (res) { nextRowIndex = res.r; nextColIndex = res.c; handled = true; }\n } else if (event.key === 'ArrowUp') {\n const res = findNextCell(rowIndex, colIndex, -1, 0, false, true);\n if (res) { nextRowIndex = res.r; nextColIndex = res.c; handled = true; }\n } else if (event.key === 'Home') {\n nextColIndex = 0;\n if (event.ctrlKey || event.metaKey) nextRowIndex = -1;\n handled = true;\n } else if (event.key === 'End') {\n nextColIndex = navigationColumns.length - 1;\n if (event.ctrlKey || event.metaKey) nextRowIndex = allRenderableRows.length - 1;\n handled = true;\n } else if (event.key === 'PageUp') {\n const pg = pagination ? pageSize : 10;\n nextRowIndex = Math.max(-1, nextRowIndex - pg);\n handled = true;\n } else if (event.key === 'PageDown') {\n const pg = pagination ? pageSize : 10;\n nextRowIndex = Math.min(allRenderableRows.length - 1, nextRowIndex + pg);\n handled = true;\n }\n\n if (handled) {\n event.preventDefault();\n\n if (isEditing && event.key === 'Tab') {\n editingHandlers.stopCellEdit();\n }\n\n if (nextRowIndex >= -1 && nextRowIndex < allRenderableRows.length &&\n nextColIndex >= 0 && nextColIndex < navigationColumns.length) {\n\n const nextCol = navigationColumns[nextColIndex];\n\n if (nextRowIndex === -1) {\n setFocusedCell({ id: 'HEADER', field: nextCol.field });\n } else {\n setFocusedCell({ id: allRenderableRows[nextRowIndex].id, field: nextCol.field });\n }\n\n const el = viewportRef.current;\n if (el) {\n const { cumulativeHeights, pinnedTopHeight, columnMetrics } = virtualization;\n const { clientHeight, clientWidth, scrollTop, scrollLeft } = el;\n\n const rowTop = nextRowIndex <= 0 ? 0 : cumulativeHeights[nextRowIndex - 1];\n const rowBottom = cumulativeHeights[nextRowIndex];\n const visibleTop = scrollTop + pinnedTopHeight;\n const visibleBottom = scrollTop + clientHeight;\n\n let newScrollTop = scrollTop;\n if (rowTop < visibleTop) {\n newScrollTop = Math.max(0, rowTop - pinnedTopHeight);\n } else if (rowBottom > visibleBottom) {\n newScrollTop = rowBottom - clientHeight;\n }\n if (newScrollTop !== scrollTop) el.scrollTop = newScrollTop;\n\n if (columnMetrics) {\n const { leftPinnedWidth, rightPinnedWidth, unpinnedAccWidths, unpinnedCols, totalSpecialsWidth, pinnedSpecialsWidth } = columnMetrics;\n const unpinnedIndex = unpinnedCols.findIndex(c => c.field === nextCol.field);\n\n if (unpinnedIndex !== -1) {\n const colLeft = totalSpecialsWidth + leftPinnedWidth + (unpinnedIndex > 0 ? unpinnedAccWidths[unpinnedIndex - 1] : 0);\n const colRight = totalSpecialsWidth + leftPinnedWidth + unpinnedAccWidths[unpinnedIndex];\n const visibleStart = scrollLeft + pinnedSpecialsWidth + leftPinnedWidth;\n const visibleEnd = scrollLeft + clientWidth - rightPinnedWidth;\n\n let newScrollLeft = scrollLeft;\n if (colLeft < visibleStart) {\n newScrollLeft = Math.max(0, colLeft - pinnedSpecialsWidth - leftPinnedWidth);\n } else if (colRight > visibleEnd) {\n newScrollLeft = colRight - clientWidth + rightPinnedWidth;\n }\n if (newScrollLeft !== scrollLeft) el.scrollLeft = newScrollLeft;\n }\n }\n }\n }\n }\n }, [\n focusedCell,\n allRenderableRows,\n navigationColumns,\n editingHandlers,\n virtualization,\n selectedRowIds,\n handleSelectionChange,\n handleDetailPanelToggle,\n setKeyboardMode,\n sortModel,\n handleSort,\n isCellEditable,\n pagination,\n pageSize,\n viewportRef,\n ]);\n\n return { focusedCell, setFocusedCell, handleFocus, handleBlur, handleKeyDown };\n}\n","import { useState, useCallback, useMemo } from 'react';\nimport type {\n GridRowId,\n GridSortItem,\n GridColumnPinning,\n GridPaginationModel,\n GridAggregationModel,\n GridPivotModel,\n} from '../../types';\nimport type { GridInitialState } from '../../state/types';\n\nexport interface UseGridControlledStateParams {\n initialState?: GridInitialState;\n\n sortModel?: GridSortItem[];\n onSortModelChange?: (model: GridSortItem[]) => void;\n\n aggregationModel?: GridAggregationModel;\n onAggregationModelChange?: (model: GridAggregationModel) => void;\n\n columnVisibilityModel?: Record<string, boolean>;\n onColumnVisibilityModelChange?: (model: Record<string, boolean>) => void;\n\n pinnedColumns?: GridColumnPinning;\n onPinnedColumnsChange?: (model: GridColumnPinning) => void;\n\n pivotModel?: GridPivotModel;\n onPivotModelChange?: (model: GridPivotModel) => void;\n\n paginationModel?: GridPaginationModel;\n onPaginationModelChange?: (model: GridPaginationModel) => void;\n\n rowSelectionModel?: GridRowId[];\n onRowSelectionModelChange?: (model: GridRowId[]) => void;\n}\n\nexport interface UseGridControlledStateReturn {\n // sort\n sortModel: GridSortItem[];\n isSortControlled: boolean;\n setInternalSortModel: React.Dispatch<React.SetStateAction<GridSortItem[]>>;\n\n // aggregation\n aggregationModel: GridAggregationModel;\n handleAggregationModelChange: (model: GridAggregationModel) => void;\n\n // column visibility\n columnVisibilityModel: Record<string, boolean>;\n handleColumnVisibilityModelChange: (model: Record<string, boolean>) => void;\n\n // pinned columns\n pinnedColumns: GridColumnPinning;\n handlePinnedColumnsChange: (model: GridColumnPinning) => void;\n\n // pivot\n currentPivotModel: GridPivotModel;\n handlePivotModelChange: (model: GridPivotModel) => void;\n\n // pagination\n effectivePaginationModel: GridPaginationModel;\n handlePaginationModelChange: (model: GridPaginationModel) => void;\n\n // selection\n rowSelectionModel: GridRowId[];\n selectedRowIds: Set<GridRowId>;\n isSelectionControlled: boolean;\n setInternalRowSelectionModel: React.Dispatch<React.SetStateAction<GridRowId[]>>;\n}\n\nconst EMPTY_PIVOT_MODEL: GridPivotModel = { rowFields: [], columnFields: [], valueFields: [] };\n\nexport function useGridControlledState(params: UseGridControlledStateParams): UseGridControlledStateReturn {\n const {\n initialState,\n sortModel: propSortModel,\n aggregationModel: propAggregationModel,\n onAggregationModelChange,\n columnVisibilityModel: propColumnVisibilityModel,\n onColumnVisibilityModelChange,\n pinnedColumns: propPinnedColumns,\n onPinnedColumnsChange,\n pivotModel: propPivotModel,\n onPivotModelChange,\n paginationModel: propPaginationModel,\n onPaginationModelChange,\n rowSelectionModel: propRowSelectionModel,\n onRowSelectionModelChange,\n } = params;\n\n // ── Sort ─────────────────────────────────────────────────────────────────\n const [internalSortModel, setInternalSortModel] = useState<GridSortItem[]>(\n () => initialState?.sorting?.sortModel ?? []\n );\n const isSortControlled = propSortModel !== undefined;\n const sortModel = isSortControlled ? propSortModel! : internalSortModel;\n\n // ── Aggregation ──────────────────────────────────────────────────────────\n const isAggregationControlled = propAggregationModel !== undefined;\n const [internalAggregationModel, setInternalAggregationModel] = useState<GridAggregationModel>(\n () => propAggregationModel ?? {}\n );\n const aggregationModel = isAggregationControlled ? propAggregationModel! : internalAggregationModel;\n\n const handleAggregationModelChange = useCallback((model: GridAggregationModel) => {\n if (!isAggregationControlled) setInternalAggregationModel(model);\n onAggregationModelChange?.(model);\n }, [isAggregationControlled, onAggregationModelChange]);\n\n // ── Column visibility ────────────────────────────────────────────────────\n const isColumnVisibilityControlled = propColumnVisibilityModel !== undefined;\n const [internalColumnVisibilityModel, setInternalColumnVisibilityModel] = useState<Record<string, boolean>>(\n () => initialState?.columns?.columnVisibilityModel ?? {}\n );\n const columnVisibilityModel = isColumnVisibilityControlled\n ? propColumnVisibilityModel!\n : internalColumnVisibilityModel;\n\n const handleColumnVisibilityModelChange = useCallback((model: Record<string, boolean>) => {\n if (!isColumnVisibilityControlled) setInternalColumnVisibilityModel(model);\n onColumnVisibilityModelChange?.(model);\n }, [isColumnVisibilityControlled, onColumnVisibilityModelChange]);\n\n // ── Pinned columns ───────────────────────────────────────────────────────\n const isPinnedColumnsControlled = propPinnedColumns !== undefined;\n const [internalPinnedColumns, setInternalPinnedColumns] = useState<GridColumnPinning>(\n () => initialState?.columns?.pinnedColumns ?? {}\n );\n const pinnedColumns = isPinnedColumnsControlled ? propPinnedColumns! : internalPinnedColumns;\n\n const handlePinnedColumnsChange = useCallback((model: GridColumnPinning) => {\n if (!isPinnedColumnsControlled) setInternalPinnedColumns(model);\n onPinnedColumnsChange?.(model);\n }, [isPinnedColumnsControlled, onPinnedColumnsChange]);\n\n // ── Pivot ────────────────────────────────────────────────────────────────\n const [internalPivotModel, setInternalPivotModel] = useState<GridPivotModel>(\n () => propPivotModel ?? EMPTY_PIVOT_MODEL\n );\n const currentPivotModel = propPivotModel ?? internalPivotModel;\n\n const handlePivotModelChange = useCallback((model: GridPivotModel) => {\n setInternalPivotModel(model);\n onPivotModelChange?.(model);\n }, [onPivotModelChange]);\n\n // ── Pagination ───────────────────────────────────────────────────────────\n const isPaginationControlled = propPaginationModel !== undefined;\n const [internalPaginationModel, setInternalPaginationModel] = useState<GridPaginationModel>(\n () => initialState?.pagination?.paginationModel ?? propPaginationModel ?? { page: 0, pageSize: 100 }\n );\n const effectivePaginationModel = isPaginationControlled ? propPaginationModel : internalPaginationModel;\n\n const handlePaginationModelChange = useCallback((newModel: GridPaginationModel) => {\n if (!isPaginationControlled) setInternalPaginationModel(newModel);\n onPaginationModelChange?.(newModel);\n }, [isPaginationControlled, onPaginationModelChange]);\n\n // ── Row selection ────────────────────────────────────────────────────────\n const isSelectionControlled = propRowSelectionModel !== undefined;\n const [internalRowSelectionModel, setInternalRowSelectionModel] = useState<GridRowId[]>([]);\n const rowSelectionModel = isSelectionControlled ? propRowSelectionModel! : internalRowSelectionModel;\n const selectedRowIds = useMemo(() => new Set(rowSelectionModel), [rowSelectionModel]);\n\n // onRowSelectionModelChange is consumed by the caller directly (they call it when selection changes)\n void onRowSelectionModelChange;\n\n return {\n sortModel: sortModel as GridSortItem[],\n isSortControlled,\n setInternalSortModel: setInternalSortModel as React.Dispatch<React.SetStateAction<GridSortItem[]>>,\n\n aggregationModel,\n handleAggregationModelChange,\n\n columnVisibilityModel,\n handleColumnVisibilityModelChange,\n\n pinnedColumns,\n handlePinnedColumnsChange,\n\n currentPivotModel,\n handlePivotModelChange,\n\n effectivePaginationModel,\n handlePaginationModelChange,\n\n rowSelectionModel,\n selectedRowIds,\n isSelectionControlled,\n setInternalRowSelectionModel,\n };\n}\n","\nimport type { GridRowModel, GridFilterItem, GridFilterModel, GridFilterGroup } from '../../types';\n\nexport const FILTER_OPERATORS = {\n contains: (value: unknown, filterValue: unknown): boolean => {\n if (value == null || filterValue == null) return false;\n return String(value).toLowerCase().includes(String(filterValue).toLowerCase());\n },\n\n equals: (value: unknown, filterValue: unknown): boolean => {\n if (value == null && filterValue == null) return true;\n if (value == null || filterValue == null) return false;\n return String(value).toLowerCase() === String(filterValue).toLowerCase();\n },\n\n startsWith: (value: unknown, filterValue: unknown): boolean => {\n if (value == null || filterValue == null) return false;\n return String(value).toLowerCase().startsWith(String(filterValue).toLowerCase());\n },\n\n endsWith: (value: unknown, filterValue: unknown): boolean => {\n if (value == null || filterValue == null) return false;\n return String(value).toLowerCase().endsWith(String(filterValue).toLowerCase());\n },\n\n isEmpty: (value: unknown): boolean => {\n return value == null || String(value).trim() === '';\n },\n\n isNotEmpty: (value: unknown): boolean => {\n return value != null && String(value).trim() !== '';\n },\n\n '>': (value: unknown, filterValue: unknown): boolean => {\n if (value == null || filterValue == null) return false;\n const numValue = Number(value);\n const numFilter = Number(filterValue);\n if (isNaN(numValue) || isNaN(numFilter)) return false;\n return numValue > numFilter;\n },\n\n '>=': (value: unknown, filterValue: unknown): boolean => {\n if (value == null || filterValue == null) return false;\n const numValue = Number(value);\n const numFilter = Number(filterValue);\n if (isNaN(numValue) || isNaN(numFilter)) return false;\n return numValue >= numFilter;\n },\n\n '<': (value: unknown, filterValue: unknown): boolean => {\n if (value == null || filterValue == null) return false;\n const numValue = Number(value);\n const numFilter = Number(filterValue);\n if (isNaN(numValue) || isNaN(numFilter)) return false;\n return numValue < numFilter;\n },\n\n '<=': (value: unknown, filterValue: unknown): boolean => {\n if (value == null || filterValue == null) return false;\n const numValue = Number(value);\n const numFilter = Number(filterValue);\n if (isNaN(numValue) || isNaN(numFilter)) return false;\n return numValue <= numFilter;\n },\n\n '!=': (value: unknown, filterValue: unknown): boolean => {\n if (filterValue == null || filterValue === '') return true;\n // Numeric comparison if both are numbers, otherwise string\n const numV = Number(value);\n const numF = Number(filterValue);\n if (!isNaN(numV) && !isNaN(numF)) return numV !== numF;\n return String(value).toLowerCase() !== String(filterValue).toLowerCase();\n },\n\n isAnyOf: (value: unknown, filterValue: unknown[]): boolean => {\n if (value == null || !Array.isArray(filterValue)) return false;\n return filterValue.some(v =>\n String(value).toLowerCase() === String(v).toLowerCase()\n );\n },\n\n not: (value: unknown, filterValue: unknown): boolean => {\n if (value == null && filterValue == null) return false;\n if (value == null || filterValue == null) return true;\n return String(value).toLowerCase() !== String(filterValue).toLowerCase();\n },\n\n // Used by boolean and singleSelect — case-insensitive string comparison\n is: (value: unknown, filterValue: unknown): boolean => {\n if (filterValue == null || filterValue === '') return true;\n const rowStr = String(value).toLowerCase();\n const filterStr = String(filterValue).toLowerCase();\n return rowStr === filterStr;\n },\n\n '=': (value: unknown, filterValue: unknown): boolean => {\n if (value == null || filterValue == null || filterValue === '') return false;\n return Number(value) === Number(filterValue);\n },\n};\n\n/**\n * Apply a single filter item to a row\n */\nexport function applyFilterItem<R extends GridRowModel>(\n row: R,\n filterItem: GridFilterItem\n): boolean {\n const { field, operator, value } = filterItem;\n\n // Get the value from the row\n const rowValue = row[field];\n\n // Get the operator function\n const operatorFn = FILTER_OPERATORS[operator];\n if (!operatorFn) {\n console.warn(`Unknown filter operator: ${operator}`);\n return true;\n }\n\n // Apply the operator\n return (operatorFn as (a: unknown, b: unknown) => boolean)(rowValue, value);\n}\n\n/**\n * Apply quick filter (global search across all fields)\n */\nexport function applyQuickFilter<R extends GridRowModel>(\n row: R,\n quickFilterValues: string[]\n): boolean {\n if (!quickFilterValues || quickFilterValues.length === 0) {\n return true;\n }\n\n // Check if any quick filter value matches any field in the row\n return quickFilterValues.every(filterValue => {\n const searchTerm = filterValue.toLowerCase();\n return Object.values(row).some(value => {\n if (value == null) return false;\n return String(value).toLowerCase().includes(searchTerm);\n });\n });\n}\n\n/**\n * Filter rows based on filter model\n */\n/**\n * Check if a row matches the filter model\n */\nexport function isRowMatchingFilter<R extends GridRowModel>(\n row: R,\n filterModel: GridFilterModel | GridFilterGroup // Accept Model or Group (similar structure)\n): boolean {\n // Normalize input: GridFilterModel matches GridFilterGroup shape largely, but let's be safe\n\n const items = filterModel.items ?? [];\n const logicOperator = filterModel.logicOperator ?? 'and';\n const quickFilterValues = ('quickFilterValues' in filterModel ? filterModel.quickFilterValues : undefined) ?? [];\n\n if (quickFilterValues.length > 0 && !applyQuickFilter(row, quickFilterValues)) {\n return false;\n }\n\n if (items.length === 0) {\n return true;\n }\n\n const evaluateItem = (item: GridFilterItem | GridFilterGroup): boolean => {\n if ('logicOperator' in item && 'items' in item) {\n\n const group = item as GridFilterGroup;\n const groupItems = group.items;\n if (groupItems.length === 0) return true;\n\n if (group.logicOperator === 'and') {\n return groupItems.every(evaluateItem);\n } else {\n return groupItems.some(evaluateItem);\n }\n } else {\n\n return applyFilterItem(row, item as GridFilterItem);\n }\n };\n\n if (logicOperator === 'and') {\n\n return items.every(evaluateItem);\n } else {\n\n return items.some(evaluateItem);\n }\n}\n\nexport function filterRows<R extends GridRowModel>(\n rows: R[],\n filterModel: GridFilterModel\n): R[] {\n if (!filterModel) return rows;\n\n const { items = [], quickFilterValues = [] } = filterModel;\n\n if (items.length === 0 && (!quickFilterValues || quickFilterValues.length === 0)) {\n return rows;\n }\n\n return rows.filter(row => isRowMatchingFilter(row, filterModel));\n}\n\nexport function getDefaultOperator(type?: string): string {\n switch (type) {\n case 'number':\n return '=';\n case 'date':\n return 'is';\n case 'boolean':\n return 'is';\n case 'singleSelect':\n return 'isAnyOf';\n default:\n return 'contains';\n }\n}\n\nexport function getOperatorsForType(type?: string): string[] {\n switch (type) {\n case 'number':\n return ['=', '!=', '>', '>=', '<', '<=', 'isEmpty', 'isNotEmpty'];\n case 'date':\n return ['is', 'not', 'after', 'onOrAfter', 'before', 'onOrBefore', 'isEmpty', 'isNotEmpty'];\n case 'boolean':\n return ['is'];\n case 'singleSelect':\n return ['isAnyOf', 'is', 'not'];\n default:\n return ['contains', 'equals', 'startsWith', 'endsWith', 'isEmpty', 'isNotEmpty'];\n }\n}\n","\nimport type { GridRowModel, GridSortItem } from '../../types';\n\nexport function compareValues(a: unknown, b: unknown, direction: 'asc' | 'desc'): number {\n\n if (a == null && b == null) return 0;\n if (a == null) return direction === 'asc' ? 1 : -1;\n if (b == null) return direction === 'asc' ? -1 : 1;\n\n if (typeof a === 'number' && typeof b === 'number') {\n return direction === 'asc' ? a - b : b - a;\n }\n\n if (a instanceof Date && b instanceof Date) {\n return direction === 'asc' \n ? a.getTime() - b.getTime() \n : b.getTime() - a.getTime();\n }\n\n const aStr = String(a).toLowerCase();\n const bStr = String(b).toLowerCase();\n\n if (direction === 'asc') {\n return aStr < bStr ? -1 : aStr > bStr ? 1 : 0;\n } else {\n return aStr > bStr ? -1 : aStr < bStr ? 1 : 0;\n }\n}\n\nexport function sortRows<R extends GridRowModel>(\n rows: R[],\n sortModel: GridSortItem[]\n): R[] {\n if (sortModel.length === 0) {\n return rows;\n }\n\n const sortedRows = [...rows];\n\n sortedRows.sort((a, b) => {\n for (const sortItem of sortModel) {\n const aValue = a[sortItem.field];\n const bValue = b[sortItem.field];\n\n const comparison = compareValues(aValue, bValue, sortItem.sort);\n\n if (comparison !== 0) {\n return comparison;\n }\n }\n return 0;\n });\n\n return sortedRows;\n}\n","import { useMemo } from 'react';\nimport { filterRows } from '../../utils/filtering';\nimport { sortRows } from '../../utils/sorting';\nimport { getPinnedRowGroups } from '../../utils/pinning';\nimport type { GridRowModel, GridFilterModel, GridSortItem, GridPaginationModel, GridRowPinning, GridDataSource } from '../../types';\n\ninterface HierarchyHandlers<R extends GridRowModel> {\n getVisibleRows: () => R[];\n}\n\nexport interface UseGridRowPipelineParams<R extends GridRowModel> {\n effectiveRows: R[];\n activeHierarchyHandlers: HierarchyHandlers<R> | null;\n filterMode: string;\n filterModel: GridFilterModel;\n dataSource?: GridDataSource<R>;\n sortModel: GridSortItem[];\n sortingMode: string;\n pagination: boolean;\n paginationMode: string;\n effectivePaginationModel: GridPaginationModel;\n pinnedRows?: GridRowPinning;\n isLoading: boolean;\n pageSize: number;\n}\n\nexport interface GridRowPipelineResult<R extends GridRowModel> {\n filteredRows: R[];\n pinnedTopRows: R[];\n unpinnedRows: R[];\n pinnedBottomRows: R[];\n sortedUnpinnedRows: R[];\n paginatedUnpinnedRows: R[];\n allRenderableRows: R[];\n}\n\nexport function useGridRowPipeline<R extends GridRowModel>(\n params: UseGridRowPipelineParams<R>\n): GridRowPipelineResult<R> {\n const {\n effectiveRows,\n activeHierarchyHandlers,\n filterMode,\n filterModel,\n dataSource,\n sortModel,\n sortingMode,\n pagination,\n paginationMode,\n effectivePaginationModel,\n pinnedRows,\n isLoading,\n pageSize,\n } = params;\n\n const filteredRows = useMemo<R[]>(() => {\n if (activeHierarchyHandlers) return (activeHierarchyHandlers.getVisibleRows() || []) as R[];\n if (filterMode === 'server' && dataSource) return effectiveRows;\n return filterRows(effectiveRows, filterModel) as R[];\n }, [effectiveRows, filterModel, activeHierarchyHandlers, filterMode, dataSource]);\n\n const { top: pinnedTopRows, center: unpinnedRows, bottom: pinnedBottomRows } = useMemo(() => {\n if (activeHierarchyHandlers) return { top: [] as R[], center: filteredRows, bottom: [] as R[] };\n return getPinnedRowGroups(filteredRows, pinnedRows);\n }, [filteredRows, pinnedRows, activeHierarchyHandlers]);\n\n const sortedUnpinnedRows = useMemo<R[]>(() => {\n if (activeHierarchyHandlers) return unpinnedRows;\n if (sortingMode === 'server' && dataSource) return unpinnedRows;\n return sortRows(unpinnedRows, sortModel) as R[];\n }, [unpinnedRows, sortModel, activeHierarchyHandlers, sortingMode, dataSource]);\n\n const paginatedUnpinnedRows = useMemo<R[]>(() => {\n if (!pagination) return sortedUnpinnedRows;\n if (paginationMode === 'server' && dataSource) return sortedUnpinnedRows;\n const start = effectivePaginationModel.page * effectivePaginationModel.pageSize;\n return sortedUnpinnedRows.slice(start, start + effectivePaginationModel.pageSize);\n }, [sortedUnpinnedRows, pagination, effectivePaginationModel.page, effectivePaginationModel.pageSize, paginationMode, dataSource]);\n\n const allRenderableRows = useMemo<R[]>(() => {\n if (activeHierarchyHandlers) return unpinnedRows;\n const centerRows = pagination ? paginatedUnpinnedRows : sortedUnpinnedRows;\n const base = [...pinnedTopRows, ...centerRows, ...pinnedBottomRows];\n\n if (paginationMode === 'infinite' && isLoading && base.length > 0) {\n const skeletonCount = Math.min(pageSize, 20);\n const skeletons = Array.from({ length: skeletonCount }, (_, i) => ({\n id: `__skeleton_${i}__`,\n _isSkeleton: true,\n }));\n return [...base, ...skeletons] as R[];\n }\n\n return base;\n }, [\n pinnedTopRows, paginatedUnpinnedRows, sortedUnpinnedRows, pinnedBottomRows,\n pagination, activeHierarchyHandlers, unpinnedRows, paginationMode, isLoading, pageSize,\n ]);\n\n return {\n filteredRows,\n pinnedTopRows,\n unpinnedRows,\n pinnedBottomRows,\n sortedUnpinnedRows,\n paginatedUnpinnedRows,\n allRenderableRows,\n };\n}\n","import { useMemo } from 'react';\nimport type { GridRowModel, GridColDef } from '../../types';\nimport type { LayoutResult } from './useLayout';\n\nexport interface UseGridVirtualizationParams<R extends GridRowModel> {\n layout: LayoutResult<R>;\n scrollTop: number;\n scrollLeft: number;\n viewportWidth: number;\n viewportHeight: number;\n autoHeight: boolean;\n rowReordering: boolean;\n hasDetailPanel: boolean;\n checkboxSelection: boolean;\n pinCheckboxColumn: boolean;\n pinExpandColumn: boolean;\n}\n\nexport interface GridVirtualizationResult<R extends GridRowModel = GridRowModel> {\n renderContext: {\n firstRowIndex: number;\n lastRowIndex: number;\n firstColumnIndex: number;\n lastColumnIndex: number;\n };\n offsetTop: number;\n offsetLeft: number;\n totalHeight: number;\n pinnedTopHeight: number;\n pinnedBottomHeight: number;\n totalWidth: number;\n rowHeights: number[];\n cumulativeHeights: number[];\n virtualColumns: (GridColDef<R> & { width: number })[];\n columnMetrics: {\n leftPinnedWidth: number;\n rightPinnedWidth: number;\n unpinnedAccWidths: number[];\n unpinnedCols: { field: string; width: number }[];\n totalSpecialsWidth: number;\n pinnedSpecialsWidth: number;\n };\n}\n\nexport function useGridVirtualization<R extends GridRowModel>(\n params: UseGridVirtualizationParams<R>\n): GridVirtualizationResult<R> {\n const {\n layout,\n scrollTop,\n scrollLeft,\n viewportWidth: rawViewportWidth,\n viewportHeight: rawViewportHeight,\n autoHeight,\n rowReordering,\n hasDetailPanel,\n checkboxSelection,\n pinCheckboxColumn,\n pinExpandColumn,\n } = params;\n\n return useMemo<GridVirtualizationResult<R>>(() => {\n const {\n unpinnedAccWidths,\n unpinnedColsWithWidth,\n leftPinnedCols,\n rightPinnedCols,\n totalWidth,\n leftWidth,\n rightWidth,\n unpinnedTotalWidth,\n systemColumnsWidth,\n cumulativeHeights,\n pinnedTopHeight,\n pinnedBottomHeight,\n unpinnedRowsHeight,\n rowHeights,\n unpinnedRowsLength,\n } = layout;\n\n const viewportWidth = rawViewportWidth || 1000;\n const viewportHeight = autoHeight\n ? pinnedTopHeight + unpinnedRowsHeight + pinnedBottomHeight + 50\n : rawViewportHeight || 600;\n\n const overscanCols = 6;\n const visibleLocalStart = Math.max(0, scrollLeft - leftWidth);\n const visibleLocalEnd = scrollLeft + viewportWidth - leftWidth;\n\n let firstUnpinnedIndex = 0;\n let lastUnpinnedIndex = unpinnedColsWithWidth.length - 1;\n\n let low = 0, high = unpinnedAccWidths.length - 1;\n while (low <= high) {\n const mid = (low + high) >>> 1;\n if (unpinnedAccWidths[mid] < visibleLocalStart) { low = mid + 1; } else { high = mid - 1; }\n }\n firstUnpinnedIndex = Math.max(0, low - overscanCols);\n\n for (let i = firstUnpinnedIndex; i < unpinnedAccWidths.length; i++) {\n if ((i === 0 ? 0 : unpinnedAccWidths[i - 1]) > visibleLocalEnd) {\n lastUnpinnedIndex = Math.min(unpinnedColsWithWidth.length - 1, i + overscanCols);\n break;\n }\n lastUnpinnedIndex = Math.min(unpinnedColsWithWidth.length - 1, i + overscanCols);\n }\n\n const leftSpacerWidth = firstUnpinnedIndex > 0 ? unpinnedAccWidths[firstUnpinnedIndex - 1] : 0;\n const rightSpacerWidth = unpinnedTotalWidth - unpinnedAccWidths[lastUnpinnedIndex];\n\n const virtualColumns: (GridColDef<R> & { width: number })[] = [\n ...leftPinnedCols,\n ...(leftSpacerWidth > 0 ? [{ field: '__spacer_left__', width: leftSpacerWidth, isSpacer: true }] : []),\n ...unpinnedColsWithWidth.slice(firstUnpinnedIndex, lastUnpinnedIndex + 1),\n ...(rightSpacerWidth > 0 ? [{ field: '__spacer_right__', width: rightSpacerWidth, isSpacer: true }] : []),\n ...rightPinnedCols,\n ];\n\n const hasHorizontalScroll = viewportWidth > 0 && totalWidth > viewportWidth;\n const scrollbarBuffer = hasHorizontalScroll ? 16 : 0;\n const totalHeight = pinnedTopHeight + unpinnedRowsHeight + pinnedBottomHeight + scrollbarBuffer + 2;\n\n const overscanRows = 5;\n let firstRowIndex = 0;\n let lastRowIndex = unpinnedRowsLength - 1;\n let offsetTop = 0;\n\n let rLow = 0, rHigh = cumulativeHeights.length - 1;\n while (rLow <= rHigh) {\n const mid = (rLow + rHigh) >>> 1;\n if (cumulativeHeights[mid] < scrollTop) { rLow = mid + 1; } else { rHigh = mid - 1; }\n }\n firstRowIndex = Math.max(0, rLow - overscanRows);\n offsetTop = firstRowIndex > 0 ? cumulativeHeights[firstRowIndex - 1] : 0;\n\n for (let i = firstRowIndex; i < cumulativeHeights.length; i++) {\n if (cumulativeHeights[i] >= scrollTop + viewportHeight) {\n lastRowIndex = Math.min(unpinnedRowsLength - 1, i + overscanRows);\n break;\n }\n }\n\n const pinnedSpecialsWidth =\n (rowReordering ? 48 : 0) +\n (hasDetailPanel && pinExpandColumn ? 48 : 0) +\n (checkboxSelection && pinCheckboxColumn ? 48 : 0);\n\n return {\n renderContext: {\n firstRowIndex,\n lastRowIndex,\n firstColumnIndex: firstUnpinnedIndex,\n lastColumnIndex: lastUnpinnedIndex,\n },\n offsetTop,\n offsetLeft: 0,\n totalHeight,\n pinnedTopHeight,\n pinnedBottomHeight,\n totalWidth,\n rowHeights,\n cumulativeHeights,\n virtualColumns,\n columnMetrics: {\n leftPinnedWidth: leftWidth,\n rightPinnedWidth: rightWidth,\n unpinnedAccWidths,\n unpinnedCols: unpinnedColsWithWidth,\n totalSpecialsWidth: systemColumnsWidth,\n pinnedSpecialsWidth,\n },\n };\n }, [\n layout,\n scrollTop,\n scrollLeft,\n rawViewportWidth,\n rawViewportHeight,\n autoHeight,\n rowReordering,\n hasDetailPanel,\n checkboxSelection,\n pinCheckboxColumn,\n pinExpandColumn,\n ]);\n}\n","\nimport { useState, useCallback, useRef } from 'react';\nimport type { GridColDef, GridRowModel, GridColumnOrderChangeParams } from '../types';\n\nexport interface UseColumnReorderProps<R extends GridRowModel = GridRowModel> {\n columns: GridColDef<R>[];\n onColumnOrderChange?: (params: GridColumnOrderChangeParams) => void;\n disableColumnReorder?: boolean;\n}\n\nexport interface UseColumnReorderReturn {\n draggedColumn: string | null;\n dragOverColumn: string | null;\n onDragStart: ((field: string) => (event: React.DragEvent) => void) | undefined;\n onDragOver: ((field: string) => (event: React.DragEvent) => void) | undefined;\n onDragEnd: (() => void) | undefined;\n onDrop: ((targetField: string) => (event: React.DragEvent) => void) | undefined;\n}\n\nexport function useColumnReorder<R extends GridRowModel = GridRowModel>(\n props: UseColumnReorderProps<R>\n): UseColumnReorderReturn {\n const { columns, onColumnOrderChange, disableColumnReorder = false } = props;\n\n const [draggedColumn, setDraggedColumn] = useState<string | null>(null);\n const [dragOverColumn, setDragOverColumn] = useState<string | null>(null);\n const draggedIndexRef = useRef<number>(-1);\n\n const handleDragStart = useCallback(\n (field: string) => (event: React.DragEvent) => {\n if (disableColumnReorder) return;\n\n const columnIndex = columns.findIndex(col => col.field === field);\n const column = columns[columnIndex];\n\n if (column?.pinnable === false) {\n event.preventDefault();\n return;\n }\n\n setDraggedColumn(field);\n draggedIndexRef.current = columnIndex;\n\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'move';\n event.dataTransfer.setData('text/plain', field);\n }\n },\n [columns, disableColumnReorder]\n );\n\n const handleDragOver = useCallback(\n (field: string) => (event: React.DragEvent) => {\n if (disableColumnReorder || !draggedColumn) return;\n\n event.preventDefault(); \n event.dataTransfer.dropEffect = 'move';\n\n setDragOverColumn(field);\n },\n [draggedColumn, disableColumnReorder]\n );\n\n const handleDrop = useCallback(\n (targetField: string) => (event: React.DragEvent) => {\n event.preventDefault();\n\n if (disableColumnReorder || !draggedColumn || draggedColumn === targetField) {\n setDraggedColumn(null);\n setDragOverColumn(null);\n return;\n }\n\n const oldIndex = columns.findIndex(col => col.field === draggedColumn);\n const targetIndex = columns.findIndex(col => col.field === targetField);\n\n if (oldIndex === -1 || targetIndex === -1) {\n setDraggedColumn(null);\n setDragOverColumn(null);\n return;\n }\n\n const column = columns[oldIndex];\n\n if (onColumnOrderChange) {\n onColumnOrderChange({\n column: column as unknown as GridColDef,\n oldIndex,\n targetIndex,\n });\n }\n\n setDraggedColumn(null);\n setDragOverColumn(null);\n draggedIndexRef.current = -1;\n },\n [columns, draggedColumn, disableColumnReorder, onColumnOrderChange]\n );\n\n const handleDragEnd = useCallback(() => {\n setDraggedColumn(null);\n setDragOverColumn(null);\n draggedIndexRef.current = -1;\n }, []);\n\n return {\n draggedColumn,\n dragOverColumn,\n onDragStart: disableColumnReorder ? undefined : handleDragStart,\n onDragOver: disableColumnReorder ? undefined : handleDragOver,\n onDragEnd: disableColumnReorder ? undefined : handleDragEnd,\n onDrop: disableColumnReorder ? undefined : handleDrop,\n };\n}\n","\nimport React from 'react';\n\nexport interface ExpandIconProps {\n isExpanded: boolean;\n onClick?: (event: React.MouseEvent) => void;\n variant?: 'chevron' | 'plus-minus';\n}\n\nexport function ExpandIcon({ isExpanded, onClick, variant = 'chevron' }: ExpandIconProps) {\n return (\n <button\n className={`ogx-expand-icon ${isExpanded ? 'ogx-expand-icon--expanded' : ''}`}\n onClick={(e) => {\n if (onClick) {\n onClick(e);\n }\n }}\n aria-label={isExpanded ? 'Collapse row' : 'Expand row'}\n type=\"button\"\n >\n {variant === 'plus-minus' ? (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n { }\n <path\n d=\"M4 8H12\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n { }\n <path\n d=\"M8 4V12\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{\n opacity: isExpanded ? 0 : 1,\n transition: 'opacity 0.2s ease',\n transformOrigin: 'center'\n }}\n />\n </svg>\n ) : (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{\n transform: isExpanded ? 'rotate(90deg)' : 'rotate(0deg)',\n transition: 'transform 0.2s ease'\n }}\n >\n <path\n d=\"M6 4L10 8L6 12\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </button>\n );\n}\n","import { useState, useMemo, useCallback, useEffect } from 'react';\nimport { useColumnReorder } from '../useColumnReorder';\nimport { ExpandIcon } from '../../components/ui/ExpandIcon';\nimport type {\n GridColDef,\n GridRowModel,\n GridRowId,\n GridColumnOrderChangeParams,\n GridRenderCellParams,\n} from '../../types';\nimport type { GridInitialState } from '../../state/types';\n\ninterface HierarchyHandlers {\n toggleExpansion: (id: GridRowId) => void;\n}\n\nexport interface UseGridColumnsParams<R extends GridRowModel> {\n activeColumns: GridColDef<R>[];\n isHierarchyEnabled: boolean;\n isRowGrouping: boolean;\n isTreeData: boolean;\n activeHierarchyHandlers: HierarchyHandlers | null;\n columnVisibilityModel: Record<string, boolean>;\n columnOrder?: string[];\n onColumnOrderChange?: (params: GridColumnOrderChangeParams) => void;\n disableColumnReorder: boolean;\n pivotMode: boolean;\n checkboxSelection: boolean;\n hasDetailPanel: boolean;\n rowReordering: boolean;\n initialState?: GridInitialState;\n setColumns: (cols: GridColDef[]) => void;\n}\n\nexport interface UseGridColumnsResult<R extends GridRowModel> {\n effectiveColumns: GridColDef<R>[];\n orderedColumns: GridColDef<R>[];\n visibleOrderedColumns: GridColDef<R>[];\n navigationColumns: Array<GridColDef<R> | { field: string }>;\n columnWidths: Record<string, number>;\n effectiveColumnOrder: string[];\n setInternalColumnOrder: React.Dispatch<React.SetStateAction<string[]>>;\n columnReorderHandlers: ReturnType<typeof useColumnReorder>;\n handleColumnResize: (field: string, newWidth: number) => void;\n}\n\nexport function useGridColumns<R extends GridRowModel>(\n params: UseGridColumnsParams<R>\n): UseGridColumnsResult<R> {\n const {\n activeColumns,\n isHierarchyEnabled,\n isRowGrouping,\n isTreeData,\n activeHierarchyHandlers,\n columnVisibilityModel,\n columnOrder,\n onColumnOrderChange,\n disableColumnReorder,\n pivotMode,\n checkboxSelection,\n hasDetailPanel,\n rowReordering,\n initialState,\n setColumns,\n } = params;\n\n // ── Effective columns (hierarchy cell renderer injection) ─────────────────\n const effectiveColumns = useMemo<GridColDef<R>[]>(() => {\n if (!isHierarchyEnabled) return activeColumns;\n\n return activeColumns.map((col, index) => {\n if (index === 0) {\n return {\n ...col,\n renderCell: (cellParams: GridRenderCellParams<R>) => {\n const meta = cellParams.rowMeta;\n const depth = meta?.treeDepth ?? 0;\n const hasChildren = Boolean(meta?.hasChildren);\n const isExpanded = Boolean(meta?.isExpanded);\n const groupingField = meta?.groupingField;\n const groupingValue = meta?.groupingValue;\n const descendantCount = meta?.descendantCount;\n const isGroupRow = Boolean(meta?.isGroupRow);\n\n let content: React.ReactNode = col.renderCell ? col.renderCell(cellParams) : cellParams.value as React.ReactNode;\n\n if (isTreeData && hasChildren && isGroupRow) {\n content = (\n <div className=\"ogx__group-cell-content\">\n {cellParams.value as React.ReactNode}\n {descendantCount !== undefined && descendantCount > 0 ? ` (${descendantCount})` : ''}\n </div>\n );\n }\n\n if (isRowGrouping && hasChildren && groupingField) {\n const groupLabel = meta?.groupLabel ?? `${groupingField}: ${String(groupingValue)}`;\n content = (\n <div className=\"ogx__group-cell-content\">\n {groupLabel}\n {descendantCount !== undefined ? ` (${descendantCount})` : ''}\n </div>\n );\n }\n\n return (\n <div style={{ display: 'flex', alignItems: 'center', paddingLeft: depth * 24, width: '100%', height: '100%' }}>\n <div style={{ marginRight: 4, width: 24, height: 24, display: 'flex', alignItems: 'center', justifyContent: 'center', cursor: hasChildren ? 'pointer' : 'default', flexShrink: 0 }}>\n {hasChildren ? (\n <div\n onClick={(e) => { e.stopPropagation(); e.preventDefault(); activeHierarchyHandlers?.toggleExpansion(cellParams.row.id); }}\n onMouseDown={(e) => { e.stopPropagation(); }}\n style={{ cursor: 'pointer', display: 'flex', alignItems: 'center', justifyContent: 'center', pointerEvents: 'auto', zIndex: 10, position: 'relative' }}\n >\n <ExpandIcon\n isExpanded={isExpanded}\n onClick={(e) => { e.stopPropagation(); e.preventDefault(); activeHierarchyHandlers?.toggleExpansion(cellParams.row.id); }}\n />\n </div>\n ) : null}\n </div>\n <div style={{ flex: 1, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{content}</div>\n </div>\n );\n }\n };\n }\n\n return {\n ...col,\n renderCell: (cellParams: GridRenderCellParams<R>) => {\n const meta = cellParams.rowMeta;\n const hasChildren = Boolean(meta?.hasChildren);\n const groupingField = meta?.groupingField;\n\n if (isRowGrouping && hasChildren) {\n if (col.field === groupingField) return null;\n if (cellParams.value !== undefined && cellParams.value !== null) {\n return col.renderCell ? col.renderCell(cellParams) : cellParams.value;\n }\n return null;\n }\n\n return col.renderCell ? col.renderCell(cellParams) : cellParams.value;\n }\n };\n }) as GridColDef<R>[];\n }, [activeColumns, isHierarchyEnabled, isRowGrouping, isTreeData, activeHierarchyHandlers]);\n\n // ── Column widths ─────────────────────────────────────────────────────────\n const [columnWidths, setColumnWidths] = useState<Record<string, number>>(\n () => initialState?.columns?.columnWidths ?? {}\n );\n\n const handleColumnResize = useCallback((field: string, newWidth: number) => {\n setColumnWidths(prev => ({ ...prev, [field]: newWidth }));\n }, []);\n\n // ── Column order ──────────────────────────────────────────────────────────\n const [internalColumnOrder, setInternalColumnOrder] = useState<string[]>(\n () => initialState?.columns?.columnOrder ?? activeColumns.map(col => col.field)\n );\n\n const effectiveColumnOrder = columnOrder ?? internalColumnOrder;\n\n useEffect(() => {\n setColumns(activeColumns as unknown as GridColDef[]);\n }, [activeColumns, setColumns]);\n\n useEffect(() => {\n if (pivotMode) {\n setInternalColumnOrder(activeColumns.map(col => col.field));\n }\n }, [pivotMode, activeColumns]);\n\n // ── Ordered / visible columns ─────────────────────────────────────────────\n const orderedColumns = useMemo<GridColDef<R>[]>(() => {\n if (disableColumnReorder) return effectiveColumns;\n\n const orderMap = new Map(effectiveColumnOrder.map((field, idx) => [field, idx]));\n return [...effectiveColumns].sort((a, b) => {\n const ai = orderMap.get(a.field) ?? effectiveColumns.indexOf(a);\n const bi = orderMap.get(b.field) ?? effectiveColumns.indexOf(b);\n return ai - bi;\n });\n }, [effectiveColumns, effectiveColumnOrder, disableColumnReorder]);\n\n const visibleOrderedColumns = useMemo<GridColDef<R>[]>(\n () => orderedColumns.filter(col => columnVisibilityModel[col.field] !== false),\n [orderedColumns, columnVisibilityModel]\n );\n\n // ── Column reorder handlers ───────────────────────────────────────────────\n const columnReorderHandlers = useColumnReorder({\n columns: orderedColumns,\n onColumnOrderChange: useCallback((reorderParams: GridColumnOrderChangeParams) => {\n const { oldIndex, targetIndex } = reorderParams;\n const newOrder = [...effectiveColumnOrder];\n const [movedField] = newOrder.splice(oldIndex, 1);\n newOrder.splice(targetIndex, 0, movedField);\n if (!columnOrder) setInternalColumnOrder(newOrder);\n onColumnOrderChange?.(reorderParams);\n }, [effectiveColumnOrder, columnOrder, onColumnOrderChange]),\n disableColumnReorder,\n });\n\n // ── Navigation columns (system cols + data cols for keyboard nav) ─────────\n const navigationColumns = useMemo(() => {\n const specials: { field: string }[] = [];\n if (rowReordering) specials.push({ field: '__reorder_col__' });\n if (hasDetailPanel) specials.push({ field: '__expand_col__' });\n if (checkboxSelection) specials.push({ field: '__checkbox_col__' });\n return [...specials, ...orderedColumns] as Array<GridColDef<R> | { field: string }>;\n }, [orderedColumns, checkboxSelection, hasDetailPanel, rowReordering]);\n\n return {\n effectiveColumns,\n orderedColumns,\n visibleOrderedColumns,\n navigationColumns,\n columnWidths,\n effectiveColumnOrder,\n setInternalColumnOrder,\n columnReorderHandlers,\n handleColumnResize,\n };\n}\n","import { useMemo } from 'react';\nimport type { GridRowModel, GridRowId } from '../../types';\n\ninterface RenderContext {\n firstRowIndex: number;\n lastRowIndex: number;\n}\n\nexport interface UseGridVisibleRowsParams<R extends GridRowModel> {\n renderContext: RenderContext;\n pinnedTopRows: R[];\n pinnedBottomRows: R[];\n paginatedUnpinnedRows: R[];\n sortedUnpinnedRows: R[];\n pagination: boolean;\n}\n\nexport interface GridVisibleRow<R extends GridRowModel> {\n row: R;\n rowIndex: number;\n}\n\nexport function useGridVisibleRows<R extends GridRowModel>(\n params: UseGridVisibleRowsParams<R>\n): GridVisibleRow<R>[] {\n const {\n renderContext,\n pinnedTopRows,\n pinnedBottomRows,\n paginatedUnpinnedRows,\n sortedUnpinnedRows,\n pagination,\n } = params;\n\n return useMemo<GridVisibleRow<R>[]>(() => {\n const { firstRowIndex, lastRowIndex } = renderContext;\n const centerRows = pagination ? paginatedUnpinnedRows : sortedUnpinnedRows;\n const topPinnedCount = pinnedTopRows.length;\n\n const topPinned = pinnedTopRows.map((row, index) => ({ row, rowIndex: index }));\n const bottomPinned = pinnedBottomRows.map((row, index) => ({\n row,\n rowIndex: topPinnedCount + centerRows.length + index,\n }));\n\n const centerStartIndex = Math.max(0, firstRowIndex - topPinnedCount);\n const centerEndIndex = Math.min(centerRows.length, lastRowIndex - topPinnedCount + 1);\n\n const centerVisible = centerRows\n .slice(centerStartIndex, centerEndIndex)\n .map((row, index) => ({\n row,\n rowIndex: topPinnedCount + centerStartIndex + index,\n }));\n\n const combined = [...topPinned, ...centerVisible, ...bottomPinned];\n\n // Deduplication guard: a row ID in both pinnedRows and rows would cause React key collisions\n const seenIds = new Set<GridRowId>();\n return combined.filter(item => {\n if (seenIds.has(item.row.id)) return false;\n seenIds.add(item.row.id);\n return true;\n });\n }, [renderContext, pinnedTopRows, pinnedBottomRows, paginatedUnpinnedRows, sortedUnpinnedRows, pagination]);\n}\n","import { useRef, useState, useCallback, useEffect } from 'react';\nimport type { GridRowScrollEndParams } from '../../types';\n\nexport interface UseGridScrollSyncParams {\n onRowsScrollEnd?: (params: GridRowScrollEndParams) => void;\n}\n\nexport interface UseGridScrollSyncResult {\n scrollTop: number;\n scrollLeft: number;\n handleScroll: (event: React.UIEvent<HTMLDivElement>) => void;\n}\n\nexport function useGridScrollSync(params: UseGridScrollSyncParams): UseGridScrollSyncResult {\n const { onRowsScrollEnd } = params;\n\n const pendingScrollRef = useRef({ scrollTop: 0, scrollLeft: 0 });\n const scrollRafRef = useRef<number | null>(null);\n const [scrollPos, setScrollPos] = useState({ scrollTop: 0, scrollLeft: 0 });\n\n useEffect(() => {\n return () => {\n if (scrollRafRef.current !== null) cancelAnimationFrame(scrollRafRef.current);\n };\n }, []);\n\n const handleScroll = useCallback((event: React.UIEvent<HTMLDivElement>) => {\n const target = event.currentTarget;\n pendingScrollRef.current = { scrollTop: target.scrollTop, scrollLeft: target.scrollLeft };\n\n if (scrollRafRef.current !== null) cancelAnimationFrame(scrollRafRef.current);\n scrollRafRef.current = requestAnimationFrame(() => {\n scrollRafRef.current = null;\n setScrollPos(pendingScrollRef.current);\n });\n\n if (onRowsScrollEnd) {\n const { scrollTop, scrollHeight, clientHeight } = target;\n const scrollThreshold = 100;\n\n if (scrollHeight - scrollTop - clientHeight < scrollThreshold) {\n onRowsScrollEnd({\n visibleTop: scrollTop,\n visibleBottom: scrollTop + clientHeight,\n viewportHeight: clientHeight,\n });\n }\n }\n }, [onRowsScrollEnd]);\n\n return { scrollTop: scrollPos.scrollTop, scrollLeft: scrollPos.scrollLeft, handleScroll };\n}\n","import { useRef, useEffect, useLayoutEffect } from 'react';\nimport type { GridState } from '../../state/types';\nimport type {\n GridSortItem,\n GridFilterModel,\n GridPaginationModel,\n GridColumnPinning,\n} from '../../types';\n\nexport interface UseGridStateSnapshotParams {\n onStateChange?: (state: GridState) => void;\n sortModel: GridSortItem[];\n filterModel: GridFilterModel;\n effectivePaginationModel: GridPaginationModel;\n columnWidths: Record<string, number>;\n effectiveColumnOrder: string[];\n columnVisibilityModel: Record<string, boolean>;\n pinnedColumns: GridColumnPinning;\n}\n\nexport function useGridStateSnapshot(params: UseGridStateSnapshotParams): void {\n const {\n onStateChange,\n sortModel,\n filterModel,\n effectivePaginationModel,\n columnWidths,\n effectiveColumnOrder,\n columnVisibilityModel,\n pinnedColumns,\n } = params;\n\n const onStateChangeRef = useRef(onStateChange);\n useLayoutEffect(() => {\n onStateChangeRef.current = onStateChange;\n });\n\n useEffect(() => {\n if (!onStateChangeRef.current) return;\n\n const snapshot: GridState = {\n sorting: { sortModel: sortModel as { field: string; sort: 'asc' | 'desc' }[] },\n filter: { filterModel },\n pagination: { paginationModel: effectivePaginationModel },\n columns: {\n columnWidths,\n columnOrder: effectiveColumnOrder,\n columnVisibilityModel,\n pinnedColumns,\n },\n };\n\n onStateChangeRef.current(snapshot);\n }, [\n sortModel,\n filterModel,\n effectivePaginationModel,\n columnWidths,\n effectiveColumnOrder,\n columnVisibilityModel,\n pinnedColumns,\n ]);\n}\n","\nimport { useMemo, useEffect, useRef, useCallback, useState } from 'react';\nimport type {\n GridRowModel,\n GridColDef,\n GridAggregationModel,\n GridAggregationResult,\n GridFilterModel,\n GridSortItem,\n GridDataSource,\n} from '../../types';\n\nexport type BuiltInAggFn = 'sum' | 'avg' | 'count' | 'min' | 'max' | 'unique';\n\nconst AGGREGATION_FUNCTIONS: Record<BuiltInAggFn, (values: unknown[]) => unknown> = {\n sum: (values) => {\n const nums = values.filter((v) => v != null && !isNaN(Number(v)));\n return nums.reduce((acc: number, v) => acc + Number(v), 0);\n },\n avg: (values) => {\n const nums = values.filter((v) => v != null && !isNaN(Number(v)));\n if (nums.length === 0) return null;\n return nums.reduce((acc: number, v) => acc + Number(v), 0) / nums.length;\n },\n count: (values) => values.filter((v) => v != null).length,\n min: (values) => {\n const nums = values.filter((v) => v != null && !isNaN(Number(v))).map(Number);\n return nums.length ? Math.min(...nums) : null;\n },\n max: (values) => {\n const nums = values.filter((v) => v != null && !isNaN(Number(v))).map(Number);\n return nums.length ? Math.max(...nums) : null;\n },\n unique: (values) => new Set(values.filter((v) => v != null)).size,\n};\n\nexport function formatAggregationValue(value: unknown, fnName: string): string {\n if (value == null) return '—';\n if (typeof value === 'number') {\n if (fnName === 'avg') {\n return value.toLocaleString(undefined, { maximumFractionDigits: 2 });\n }\n return value.toLocaleString();\n }\n return String(value);\n}\n\nexport interface UseAggregationParams<R extends GridRowModel> {\n rows: R[];\n columns?: GridColDef[];\n aggregationModel: GridAggregationModel;\n isServerSide: boolean;\n dataSource?: GridDataSource<R>;\n filterModel?: GridFilterModel;\n sortModel?: GridSortItem[];\n serverAggregationResults?: GridAggregationResult | null;\n}\n\nexport interface UseAggregationReturn {\n aggregationResult: GridAggregationResult;\n isLoading: boolean;\n error: unknown;\n}\n\nexport function useAggregation<R extends GridRowModel>(\n params: UseAggregationParams<R>\n): UseAggregationReturn {\n const {\n rows,\n columns,\n aggregationModel,\n isServerSide,\n dataSource,\n filterModel,\n sortModel,\n serverAggregationResults,\n } = params;\n\n const columnsLookup = useMemo(() => {\n const map = new Map<string, GridColDef>();\n (columns ?? []).forEach(col => map.set(col.field, col));\n return map;\n }, [columns]);\n\n const clientResult = useMemo<GridAggregationResult>(() => {\n if (isServerSide || Object.keys(aggregationModel).length === 0) return {};\n\n const result: GridAggregationResult = {};\n for (const [field, fnName] of Object.entries(aggregationModel)) {\n const colDef = columnsLookup.get(field);\n if (colDef?.availableAggregationFunctions && !colDef.availableAggregationFunctions.includes(fnName)) {\n continue;\n }\n const fn = AGGREGATION_FUNCTIONS[fnName as BuiltInAggFn];\n if (!fn) {\n console.warn(`[useAggregation] Unknown aggregation function: \"${fnName}\"`);\n continue;\n }\n const values = rows.map((row) => (row as GridRowModel)[field]);\n result[field] = fn(values);\n }\n return result;\n }, [rows, columnsLookup, aggregationModel, isServerSide]);\n\n const [serverResult, setServerResult] = useState<GridAggregationResult>({});\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<unknown>(null);\n const requestIdRef = useRef(0);\n\n const fetchServerAggregations = useCallback(async () => {\n if (!dataSource?.getAggregations || Object.keys(aggregationModel).length === 0) return;\n\n const requestId = ++requestIdRef.current;\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await dataSource.getAggregations({\n sortModel: sortModel ?? [],\n filterModel: filterModel ?? { items: [] },\n groupKeys: [],\n aggregationModel,\n });\n\n if (requestId === requestIdRef.current) {\n setServerResult(result);\n }\n } catch (err) {\n if (requestId === requestIdRef.current) {\n setError(err);\n console.error('[useAggregation] Server aggregation error:', err);\n }\n } finally {\n if (requestId === requestIdRef.current) {\n setIsLoading(false);\n }\n }\n }, [dataSource, aggregationModel, filterModel, sortModel]);\n\n useEffect(() => {\n if (isServerSide && dataSource?.getAggregations && !serverAggregationResults) {\n fetchServerAggregations();\n }\n }, [fetchServerAggregations, isServerSide, dataSource, serverAggregationResults]);\n\n const aggregationResult = useMemo<GridAggregationResult>(() => {\n if (!isServerSide) return clientResult;\n\n if (serverAggregationResults && Object.keys(serverAggregationResults).length > 0) {\n return serverAggregationResults;\n }\n return serverResult;\n }, [isServerSide, clientResult, serverAggregationResults, serverResult]);\n\n return { aggregationResult, isLoading, error };\n}\n","import React, { useMemo } from 'react';\nimport { formatAggregationValue } from '../../hooks/features/useAggregation';\nimport type { GridColDef, GridAggregationModel, GridAggregationResult, GridColumnPinning } from '../../types';\nimport { calculatePinnedPositions, isColumnPinned } from '../../utils/pinning';\n\ninterface GridAggregationFooterProps {\n columns: GridColDef[];\n aggregationModel: GridAggregationModel;\n aggregationResult: GridAggregationResult;\n columnWidths: Record<string, number>;\n rowHeight: number;\n checkboxSelection: boolean;\n hasDetailPanel: boolean;\n rowReordering: boolean;\n pinnedColumns?: GridColumnPinning;\n}\n\nexport function GridAggregationFooter({\n columns,\n aggregationModel,\n aggregationResult,\n columnWidths,\n rowHeight,\n checkboxSelection,\n hasDetailPanel,\n rowReordering,\n pinnedColumns,\n}: GridAggregationFooterProps) {\n // Compute sticky left/right pixel offsets for each pinned column.\n // The footer always renders checkbox/detail/reorder spacers unconditionally,\n // so treat pinCheckboxColumn and pinExpandColumn as always true.\n const pinnedOffsets = useMemo(\n () => calculatePinnedPositions(\n columns,\n columnWidths,\n pinnedColumns,\n checkboxSelection,\n true,\n hasDetailPanel,\n true,\n rowReordering,\n ),\n [columns, columnWidths, pinnedColumns, checkboxSelection, hasDetailPanel, rowReordering]\n );\n\n const lastLeftField = pinnedColumns?.left?.[pinnedColumns.left.length - 1];\n const firstRightField = pinnedColumns?.right?.[0];\n\n return (\n <div\n className=\"ogx__aggregation-footer\"\n role=\"row\"\n aria-label=\"Aggregation totals\"\n aria-live=\"polite\"\n style={{ minHeight: `${rowHeight}px` }}\n >\n {checkboxSelection && <div style={{ width: 48, flexShrink: 0 }} />}\n {hasDetailPanel && <div style={{ width: 48, flexShrink: 0 }} />}\n {rowReordering && <div style={{ width: 48, flexShrink: 0 }} />}\n\n {columns.map((col) => {\n const fnName = (aggregationModel as Record<string, string>)[col.field];\n const rawValue = aggregationResult[col.field];\n const colWidth = columnWidths[col.field] ?? (typeof col.width === 'number' ? col.width : 120);\n\n const pinnedPosition = isColumnPinned(col.field, pinnedColumns);\n const pinnedOffset = pinnedPosition ? pinnedOffsets[col.field] : undefined;\n\n const className = [\n 'ogx__aggregation-cell',\n pinnedPosition === 'left' && 'ogx__aggregation-cell--pinned-left',\n pinnedPosition === 'right' && 'ogx__aggregation-cell--pinned-right',\n pinnedPosition === 'left' && col.field === lastLeftField && 'ogx__aggregation-cell--pinned-left-last',\n pinnedPosition === 'right' && col.field === firstRightField && 'ogx__aggregation-cell--pinned-right-first',\n ].filter(Boolean).join(' ');\n\n const style: React.CSSProperties = {\n width: colWidth,\n minWidth: colWidth,\n maxWidth: colWidth,\n textAlign: (col.align as React.CSSProperties['textAlign']) || 'left',\n };\n if (pinnedPosition === 'left' && pinnedOffset !== undefined) style.left = pinnedOffset;\n if (pinnedPosition === 'right' && pinnedOffset !== undefined) style.right = pinnedOffset;\n\n return (\n <div\n key={col.field}\n className={className}\n role=\"gridcell\"\n style={style}\n >\n {fnName ? (\n <>\n <span className=\"ogx__aggregation-label\">{fnName}</span>\n <span className=\"ogx__aggregation-value\">\n {formatAggregationValue(rawValue, fnName)}\n </span>\n </>\n ) : null}\n </div>\n );\n })}\n </div>\n );\n}\n","interface GridEmptyStateProps {\n noRowsLabel: string;\n width: number;\n}\n\nexport function GridEmptyState({ noRowsLabel, width }: GridEmptyStateProps) {\n return (\n <div className=\"ogx__empty\" style={{ width }}>\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <path d=\"M3 9h18M9 21V9\" />\n </svg>\n <span>{noRowsLabel}</span>\n </div>\n );\n}\n","interface GridErrorOverlayProps {\n error: unknown;\n}\n\nexport function GridErrorOverlay({ error }: GridErrorOverlayProps) {\n if (!error) return null;\n const message = error instanceof Error\n ? error.message\n : typeof error === 'string'\n ? error\n : 'An unexpected error occurred while loading the data.';\n return (\n <div className=\"ogx-error-overlay\" aria-live=\"assertive\" role=\"alert\">\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"var(--ogx-color-error)\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n <div className=\"ogx-error-overlay__title\">\n Oops! Something went wrong\n </div>\n <div className=\"ogx-error-overlay__message\">\n {message}\n </div>\n <button\n onClick={() => window.location.reload()}\n className=\"ogx-button ogx-button--primary\"\n >\n Retry\n </button>\n </div>\n );\n}\n","\nimport React from 'react';\n\nexport interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {\n indeterminate?: boolean;\n label?: string;\n inputRef?: React.Ref<HTMLInputElement>;\n}\n\nexport const Checkbox: React.FC<CheckboxProps> = ({\n indeterminate = false,\n label,\n className = '',\n inputRef,\n ...props\n}) => {\n const internalRef = React.useRef<HTMLInputElement>(null);\n\n // Combine refs\n const setRef = React.useCallback((element: HTMLInputElement | null) => {\n internalRef.current = element;\n\n if (typeof inputRef === 'function') {\n inputRef(element);\n } else if (inputRef) {\n (inputRef as React.MutableRefObject<HTMLInputElement | null>).current = element;\n }\n }, [inputRef]);\n\n React.useEffect(() => {\n if (internalRef.current) {\n internalRef.current.indeterminate = indeterminate;\n }\n }, [indeterminate]);\n\n const wrapperClassNames = [\n 'ogx-checkbox-wrapper',\n props.disabled && 'ogx-checkbox-wrapper--disabled',\n className\n ].filter(Boolean).join(' ');\n\n return (\n <label className={wrapperClassNames}>\n <input\n ref={setRef}\n type=\"checkbox\"\n className=\"ogx-checkbox__input\"\n aria-label={label || props['aria-label'] || (indeterminate ? 'Select some' : props.checked ? 'Deselect' : 'Select')}\n {...props}\n />\n <span className=\"ogx-checkbox__box\">\n {props.checked && !indeterminate && (\n <svg className=\"ogx-checkbox__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\" />\n </svg>\n )}\n {indeterminate && (\n <svg className=\"ogx-checkbox__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M19 13H5v-2h14v2z\" />\n </svg>\n )}\n </span>\n {label && <span className=\"ogx-checkbox__label\">{label}</span>}\n </label>\n );\n};\n","\nimport React, { useCallback, useRef, useState } from 'react';\n\n\nexport interface ColumnResizeHandleProps {\n field: string;\n currentWidth: number;\n onResize: (field: string, newWidth: number) => void;\n minWidth?: number;\n maxWidth?: number;\n}\n\nexport function ColumnResizeHandle(props: ColumnResizeHandleProps) {\n const { field, currentWidth, onResize, minWidth = 50, maxWidth = 1000 } = props;\n const [isDragging, setIsDragging] = useState(false);\n const startXRef = useRef<number>(0);\n const startWidthRef = useRef<number>(0);\n\n const handleMouseDown = useCallback((event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n\n setIsDragging(true);\n startXRef.current = event.clientX;\n // Use the logical stored width — reliable for pinned, flex, and normal columns\n startWidthRef.current = currentWidth;\n\n let lastUpdateTime = 0;\n const throttleMs = 16;\n\n const handleMouseMove = (e: MouseEvent) => {\n const deltaX = e.clientX - startXRef.current;\n const newWidth = Math.max(minWidth, Math.min(maxWidth, startWidthRef.current + deltaX));\n\n const now = Date.now();\n if (now - lastUpdateTime >= throttleMs) {\n onResize(field, newWidth);\n lastUpdateTime = now;\n }\n };\n\n const handleMouseUp = (e: MouseEvent) => {\n setIsDragging(false);\n\n const deltaX = e.clientX - startXRef.current;\n const newWidth = Math.max(minWidth, Math.min(maxWidth, startWidthRef.current + deltaX));\n\n onResize(field, newWidth);\n\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n }, [field, currentWidth, onResize, minWidth, maxWidth]);\n\n const handleDoubleClick = useCallback((event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n }, []);\n\n const classNames = [\n 'ogx-column-resize-handle',\n isDragging && 'ogx-column-resize-handle--dragging'\n ].filter(Boolean).join(' ');\n\n return (\n <div\n className={classNames}\n onMouseDown={handleMouseDown}\n onClick={(e) => e.stopPropagation()}\n onDragStart={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n onDoubleClick={handleDoubleClick}\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label={`Resize ${field} column`}\n >\n <div className=\"ogx-column-resize-handle__line\" />\n </div>\n );\n}\n","import React, { useRef, useEffect, useState } from 'react';\nimport ReactDOM from 'react-dom';\nimport type { GridColDef, GridRowModel, GridSortDirection, GridColumnPinning } from '../../types';\n\n\ninterface ColumnMenuProps {\n colDef: GridColDef<GridRowModel>;\n sortModel?: Array<{ field: string; sort: 'asc' | 'desc' }>;\n onSort?: (field: string, direction: GridSortDirection) => void;\n onHide?: (field: string) => void;\n onPin?: (field: string, side: 'left' | 'right' | null) => void;\n pinnedColumns?: GridColumnPinning;\n onManageColumns?: () => void;\n onClose: () => void;\n anchorEl: HTMLElement | null;\n}\n\nfunction ActiveDotIcon() {\n return (\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"currentColor\">\n <circle cx=\"4\" cy=\"4\" r=\"4\" />\n </svg>\n );\n}\n\nfunction InactiveDotIcon() {\n return (\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <circle cx=\"4\" cy=\"4\" r=\"3\" />\n </svg>\n );\n}\n\nfunction ManageColumnsIcon() {\n return (\n <svg focusable=\"false\" aria-hidden=\"true\" viewBox=\"0 0 24 24\" width=\"13\" height=\"13\" fill=\"none\">\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <rect x=\"8.5\" y=\"4\" width=\"7\" height=\"16\" fill=\"currentColor\" opacity=\"0.3\" />\n <line x1=\"8.5\" y1=\"4\" x2=\"8.5\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <line x1=\"15.5\" y1=\"4\" x2=\"15.5\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <line x1=\"2\" y1=\"9\" x2=\"22\" y2=\"9\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <line x1=\"2\" y1=\"14\" x2=\"22\" y2=\"14\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n </svg>\n );\n}\n\nfunction AscIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"5\" />\n <polyline points=\"5 12 12 5 19 12\" />\n </svg>\n );\n}\n\nfunction DescIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n <polyline points=\"19 12 12 19 5 12\" />\n </svg>\n );\n}\n\nfunction UnsortIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\">\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n );\n}\n\nfunction HideIcon() {\n return (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94\" />\n <path d=\"M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19\" />\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n </svg>\n );\n}\n\nfunction PinLeftIcon() {\n return (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n { }\n <line x1=\"4\" y1=\"2\" x2=\"4\" y2=\"22\" />\n { }\n <polyline points=\"11 8 4 12 11 16\" />\n { }\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n </svg>\n );\n}\n\nfunction PinRightIcon() {\n return (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n { }\n <line x1=\"20\" y1=\"2\" x2=\"20\" y2=\"22\" />\n { }\n <polyline points=\"13 8 20 12 13 16\" />\n { }\n <line x1=\"20\" y1=\"12\" x2=\"4\" y2=\"12\" />\n </svg>\n );\n}\n\nfunction UnpinIcon() {\n return (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"2\" y1=\"2\" x2=\"22\" y2=\"22\" />\n <line x1=\"4\" y1=\"4\" x2=\"4\" y2=\"20\" />\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n </svg>\n );\n}\n\nexport function ColumnMenu({ colDef, sortModel, onSort, onHide, onPin, pinnedColumns, onManageColumns, onClose, anchorEl }: ColumnMenuProps) {\n const menuRef = useRef<HTMLDivElement>(null);\n const [style, setStyle] = useState<React.CSSProperties>({ position: 'fixed', zIndex: 1300, top: 0, left: 0, visibility: 'hidden' });\n\n React.useLayoutEffect(() => {\n if (!anchorEl || !menuRef.current) return;\n\n const anchorRect = anchorEl.getBoundingClientRect();\n const menuRect = menuRef.current.getBoundingClientRect();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const margin = 8;\n\n let left = anchorRect.left;\n if (left + menuRect.width + margin > vw) {\n left = vw - menuRect.width - margin;\n }\n if (left < margin) left = margin;\n\n let top = anchorRect.bottom + 4;\n if (top + menuRect.height + margin > vh) {\n top = anchorRect.top - menuRect.height - 4;\n }\n\n setStyle({ position: 'fixed', zIndex: 1300, top, left, visibility: 'visible' });\n }, [anchorEl]);\n\n\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (\n menuRef.current && !menuRef.current.contains(event.target as Node) &&\n anchorEl && !anchorEl.contains(event.target as Node)\n ) onClose();\n }\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') onClose();\n }\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keydown', handleKey);\n // Close menu on any scroll or resize so it doesn't float detached from its anchor\n window.addEventListener('scroll', onClose, true);\n window.addEventListener('resize', onClose);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keydown', handleKey);\n window.removeEventListener('scroll', onClose, true);\n window.removeEventListener('resize', onClose);\n };\n }, [anchorEl, onClose]);\n\n const handleSort = (direction: GridSortDirection) => { onSort?.(colDef.field, direction); onClose(); };\n const handleHide = () => { onHide?.(colDef.field); onClose(); };\n const handlePin = (side: 'left' | 'right' | null) => { onPin?.(colDef.field, side); onClose(); };\n\n const currentSort = sortModel?.find(item => item.field === colDef.field)?.sort;\n const isUnsorted = currentSort === undefined || currentSort === null;\n\n const isPinnedLeft = pinnedColumns?.left?.includes(colDef.field) ?? false;\n const isPinnedRight = pinnedColumns?.right?.includes(colDef.field) ?? false;\n const isUnpinned = !isPinnedLeft && !isPinnedRight;\n\n const colLabel = colDef.headerName || colDef.field;\n\n return ReactDOM.createPortal(\n <div ref={menuRef} className=\"ogx-column-menu\" style={style} role=\"menu\" aria-label={`Column options for ${colLabel}`}>\n\n { }\n {onSort && colDef.sortable !== false && (\n <>\n <button className={`ogx-menu-item${currentSort === 'asc' ? ' ogx-menu-item--active' : ''}`}\n onClick={() => handleSort('asc')} role=\"menuitemradio\" aria-checked={currentSort === 'asc'}>\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\">{currentSort === 'asc' ? <ActiveDotIcon /> : <InactiveDotIcon />}</span>\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><AscIcon /></span>\n Sort Ascending\n </button>\n <button className={`ogx-menu-item${currentSort === 'desc' ? ' ogx-menu-item--active' : ''}`}\n onClick={() => handleSort('desc')} role=\"menuitemradio\" aria-checked={currentSort === 'desc'}>\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\">{currentSort === 'desc' ? <ActiveDotIcon /> : <InactiveDotIcon />}</span>\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><DescIcon /></span>\n Sort Descending\n </button>\n <button className={`ogx-menu-item${isUnsorted ? ' ogx-menu-item--active' : ''}`}\n onClick={() => handleSort(null)} role=\"menuitemradio\" aria-checked={isUnsorted}>\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\">{isUnsorted ? <ActiveDotIcon /> : <InactiveDotIcon />}</span>\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><UnsortIcon /></span>\n Unsort\n </button>\n <div className=\"ogx-menu-divider\" />\n </>\n )}\n\n { }\n <div className=\"ogx-menu-section-label\" aria-hidden=\"true\">Pin column</div>\n <button className={`ogx-menu-item${isPinnedLeft ? ' ogx-menu-item--active' : ''}`}\n onClick={() => handlePin('left')} role=\"menuitemradio\" aria-checked={isPinnedLeft} aria-label=\"Pin to left\">\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\">{isPinnedLeft ? <ActiveDotIcon /> : <InactiveDotIcon />}</span>\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><PinLeftIcon /></span>\n Pin to Left\n </button>\n <button className={`ogx-menu-item${isPinnedRight ? ' ogx-menu-item--active' : ''}`}\n onClick={() => handlePin('right')} role=\"menuitemradio\" aria-checked={isPinnedRight} aria-label=\"Pin to right\">\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\">{isPinnedRight ? <ActiveDotIcon /> : <InactiveDotIcon />}</span>\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><PinRightIcon /></span>\n Pin to Right\n </button>\n <button className={`ogx-menu-item${isUnpinned ? ' ogx-menu-item--active' : ''}`}\n onClick={() => handlePin(null)} role=\"menuitemradio\" aria-checked={isUnpinned} aria-label=\"Unpin column\">\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\">{isUnpinned ? <ActiveDotIcon /> : <InactiveDotIcon />}</span>\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><UnpinIcon /></span>\n Unpin\n </button>\n <div className=\"ogx-menu-divider\" />\n\n { }\n <button className=\"ogx-menu-item\" onClick={handleHide} role=\"menuitem\" aria-label={`Hide ${colLabel} column`}>\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\" />\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><HideIcon /></span>\n Hide Column\n </button>\n\n <div className=\"ogx-menu-divider\" />\n <button className=\"ogx-menu-item\" onClick={() => { onManageColumns?.(); onClose(); }} role=\"menuitem\" aria-label=\"Manage all columns\">\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\" />\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><ManageColumnsIcon /></span>\n Manage columns\n </button>\n </div>,\n (anchorEl?.closest('.ogx-theme-provider') || document.body)\n );\n}\n","import React, { useId } from 'react';\nimport { Checkbox } from '../ui/Checkbox';\nimport { ColumnResizeHandle } from '../ColumnResizeHandle/ColumnResizeHandle';\nimport type { GridColDef, GridRowModel, GridSortDirection, GridColumnPinning, GridAggregationModel, GridColumnGroup, GridColumnGroupingModel } from '../../types';\nimport { isColumnPinned, calculatePinnedPositions } from '../../utils/pinning';\nimport { ColumnMenu } from './ColumnMenu';\n\n\nfunction MenuIcon() {\n return (\n <svg focusable=\"false\" aria-hidden=\"true\" viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"18\" height=\"18\">\n <path d=\"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"></path>\n </svg>\n );\n}\n\nfunction SwapIcon() {\n return (\n <svg focusable=\"false\" aria-hidden=\"true\" viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"currentColor\">\n <path d=\"M6.99 11L3 15l3.99 4v-3H14v-2H6.99v-3zM21 9l-3.99-4v3H10v2h7.01v3L21 9z\"></path>\n </svg>\n );\n}\n\n\n// ─── Group header helpers ─────────────────────────────────────────────────────\n\n/** Collect all leaf field names from a group node (recursive). */\nfunction collectGroupFields(group: GridColumnGroup): string[] {\n const out: string[] = [];\n for (const child of group.children) {\n if (typeof child === 'string') out.push(child);\n else out.push(...collectGroupFields(child));\n }\n return out;\n}\n\n/** Max nesting depth of the group tree (1 = single level). */\nfunction groupTreeDepth(groups: GridColumnGroupingModel): number {\n let d = 0;\n function walk(g: GridColumnGroup, depth: number) {\n d = Math.max(d, depth);\n for (const c of g.children) if (typeof c !== 'string') walk(c, depth + 1);\n }\n groups.forEach(g => walk(g, 1));\n return d;\n}\n\ninterface GroupCell { key: string; label: string; width: number; isGroup: boolean; }\n\n/**\n * Builds the flat array of GroupCell descriptors for one row (level).\n * level 0 = top-most group row.\n * allFields is the ORDERED list of all visible columns (including spacers).\n */\nfunction buildGroupRow(\n groups: GridColumnGroupingModel,\n allFields: { field: string; width: number }[],\n level: number,\n): GroupCell[] {\n // Map each field → the group that owns it at `level`\n function findAtLevel(g: GridColumnGroup, field: string, cur: number): GridColumnGroup | null {\n if (!collectGroupFields(g).includes(field)) return null;\n if (cur === level) return g;\n for (const child of g.children) {\n if (typeof child !== 'string') {\n const found = findAtLevel(child, field, cur + 1);\n if (found) return found;\n }\n }\n return null;\n }\n\n const fieldGroup = new Map<string, GridColumnGroup | null>();\n for (const f of allFields) {\n let found: GridColumnGroup | null = null;\n for (const g of groups) {\n found = findAtLevel(g, f.field, 0);\n if (found) break;\n }\n fieldGroup.set(f.field, found);\n }\n\n const cells: GroupCell[] = [];\n let i = 0;\n while (i < allFields.length) {\n const item = allFields[i];\n const group = fieldGroup.get(item.field) ?? null;\n const w = item.width;\n\n if (!group) {\n cells.push({ key: `fg-${item.field}-${level}`, label: '', width: w, isGroup: false });\n i++;\n } else {\n let totalW = 0;\n let j = i;\n while (j < allFields.length && fieldGroup.get(allFields[j].field) === group) {\n totalW += allFields[j].width;\n j++;\n }\n cells.push({ key: `${group.groupId}-${level}`, label: group.headerName, width: totalW, isGroup: true });\n i = j;\n }\n }\n return cells;\n}\n\n// ─── Props ────────────────────────────────────────────────────────────────────\n\nexport interface HeaderProps<R extends GridRowModel = GridRowModel> {\n columns: GridColDef<R>[];\n allColumns?: GridColDef<R>[];\n columnGroupingModel?: GridColumnGroupingModel;\n checkboxSelection?: boolean;\n allSelected?: boolean;\n someSelected?: boolean;\n onSelectAll?: (isSelected: boolean) => void;\n onSort?: (field: string, direction: GridSortDirection) => void;\n sortModel?: Array<{ field: string; sort: 'asc' | 'desc' }>;\n onColumnResize?: (field: string, newWidth: number) => void;\n columnWidths?: Record<string, number>;\n pinnedColumns?: GridColumnPinning;\n hasDetailPanel?: boolean;\n pinCheckboxColumn?: boolean;\n pinExpandColumn?: boolean;\n rowReordering?: boolean;\n aggregationModel?: GridAggregationModel;\n\n draggedColumn?: string | null;\n dragOverColumn?: string | null;\n onDragStart?: (field: string) => (event: React.DragEvent) => void;\n onDragOver?: (field: string) => (event: React.DragEvent) => void;\n onDragEnd?: () => void;\n onDrop?: (targetField: string) => (event: React.DragEvent) => void;\n focusedCell?: { id: string | number; field: string } | null;\n onHeaderClick?: (field: string) => void;\n onSortAdd?: (field: string, direction: GridSortDirection) => void;\n multiSort?: boolean;\n onHideColumn?: (field: string) => void;\n onPinColumn?: (field: string, side: 'left' | 'right' | null) => void;\n onManageColumns?: () => void;\n}\n\nexport function Header<R extends GridRowModel = GridRowModel>(props: HeaderProps<R>) {\n const {\n columns,\n allColumns,\n columnGroupingModel,\n checkboxSelection = false,\n allSelected = false,\n someSelected = false,\n onSelectAll,\n onSort,\n sortModel = [],\n onColumnResize,\n columnWidths = {},\n pinnedColumns,\n hasDetailPanel = false,\n pinCheckboxColumn = true,\n pinExpandColumn = true,\n rowReordering = false,\n aggregationModel,\n draggedColumn,\n dragOverColumn,\n onDragStart,\n onDragOver,\n onDragEnd,\n onDrop,\n focusedCell,\n onHeaderClick,\n onSortAdd,\n multiSort = false,\n onHideColumn,\n onPinColumn,\n onManageColumns,\n } = props;\n\n const selectAllId = useId();\n const cellRefs = React.useRef<Record<string, HTMLElement | null>>({});\n const [menuOpenParams, setMenuOpenParams] = React.useState<{ colDef: GridColDef<R>; anchorEl: HTMLElement } | null>(null);\n\n const handleMenuOpen = (colDef: GridColDef<R>) => (event: React.MouseEvent) => {\n event.stopPropagation();\n setMenuOpenParams({ colDef, anchorEl: event.currentTarget as HTMLElement });\n };\n\n const handleMenuClose = () => {\n setMenuOpenParams(null);\n };\n\n React.useLayoutEffect(() => {\n if (focusedCell?.id === 'HEADER') {\n const element = cellRefs.current[focusedCell.field];\n if (element) {\n element.focus();\n }\n }\n }, [focusedCell]);\n\n const handleColumnClick = (colDef: GridColDef<R>) => (e: React.MouseEvent) => {\n if (colDef.sortable === false) return;\n\n const currentSort = sortModel.find(item => item.field === colDef.field);\n let newDirection: GridSortDirection = 'asc';\n\n if (currentSort) {\n if (currentSort.sort === 'asc') {\n newDirection = 'desc';\n } else {\n newDirection = null;\n }\n }\n\n if ((e.shiftKey || multiSort) && onSortAdd) {\n onSortAdd(colDef.field, newDirection);\n } else if (onSort) {\n onSort(colDef.field, newDirection);\n }\n };\n\n const getSortIcon = (field: string) => {\n const sortItem = sortModel.find(item => item.field === field);\n if (!sortItem) return null;\n\n const sortIndex = sortModel.length > 1 ? sortModel.indexOf(sortItem) + 1 : null;\n\n return (\n <span className={`ogx__sort-icon ogx__sort-icon--${sortItem.sort}`} aria-hidden=\"true\">\n {sortIndex !== null && (\n <span className=\"ogx__sort-badge\">{sortIndex}</span>\n )}\n </span>\n );\n };\n\n const pinnedPositions = React.useMemo(() => {\n return calculatePinnedPositions(\n columns,\n columnWidths,\n pinnedColumns,\n checkboxSelection,\n pinCheckboxColumn,\n hasDetailPanel,\n pinExpandColumn,\n rowReordering\n );\n }, [columns, columnWidths, pinnedColumns, checkboxSelection, pinCheckboxColumn, hasDetailPanel, pinExpandColumn, rowReordering]);\n\n const groupDepth = columnGroupingModel ? groupTreeDepth(columnGroupingModel) : 0;\n\n // All non-spacer fields in order (for group-span math) with their effective physical width\n const allCols = allColumns ?? columns;\n const allLeafFields = allCols\n .filter(c => !c.isSpacer)\n .map(c => ({\n field: c.field,\n width: columnWidths[c.field] ?? c.width ?? 100\n }));\n\n // --- CHECKBOX / DETAIL / REORDER prefix width (for group filler) ---\n const CHECKBOX_W = 48;\n const REORDER_W = 48;\n const EXPAND_W = 48;\n const prefixWidth =\n (rowReordering ? REORDER_W : 0) +\n (hasDetailPanel ? EXPAND_W : 0) +\n (checkboxSelection ? CHECKBOX_W : 0);\n\n return (\n // Outer sticky wrapper — both group rows AND column header row live here\n // so they ALL stay sticky together and scroll horizontally as one unit.\n <div className=\"ogx__header-wrap\">\n {/* ── Group header rows ── */}\n {groupDepth > 0 && Array.from({ length: groupDepth }, (_, level) => {\n const row = buildGroupRow(\n columnGroupingModel!,\n allLeafFields,\n level,\n );\n return (\n <div key={`ogx-grp-${level}`} className=\"ogx-col-group-row\" role=\"row\">\n {/* Filler for checkbox / reorder / detailPanel prefix */}\n {prefixWidth > 0 && (\n <div\n className=\"ogx-col-group-cell ogx-col-group-cell--filler\"\n style={{ width: prefixWidth, minWidth: prefixWidth, flexShrink: 0 }}\n role=\"columnheader\"\n />\n )}\n {row.map(cell => (\n <div\n key={cell.key}\n role=\"columnheader\"\n className={`ogx-col-group-cell ${cell.isGroup ? 'ogx-col-group-cell--group' : 'ogx-col-group-cell--filler'}`}\n style={{ width: cell.width, minWidth: cell.width, flexShrink: 0 }}\n title={cell.isGroup ? cell.label : undefined}\n >\n {cell.isGroup && (\n <span className=\"ogx-col-group-cell__label\">{cell.label}</span>\n )}\n </div>\n ))}\n </div>\n );\n })}\n\n {/* ── Column header row ── */}\n <div className=\"ogx__header\" role=\"row\">\n { }\n {rowReordering && (\n <div\n className=\"ogx__header-cell ogx__header-cell--pinned ogx__header-cell--pinned-left\"\n role=\"columnheader\"\n aria-label=\"Row reorder handle\"\n title=\"Drag to reorder rows\"\n style={{\n minWidth: 48,\n maxWidth: 48,\n position: 'sticky',\n left: 0,\n zIndex: 4\n }}\n />\n )}\n\n { }\n {hasDetailPanel && (\n <div\n className={`ogx__header-cell ogx__header-cell--expand ${pinExpandColumn ? 'ogx__header-cell--pinned ogx__header-cell--pinned-left' : ''\n }`}\n role=\"columnheader\"\n aria-label=\"Expand row details\"\n style={{\n minWidth: 48,\n maxWidth: 48,\n position: pinExpandColumn ? 'sticky' : undefined,\n left: pinExpandColumn ? (rowReordering ? 48 : 0) : undefined,\n zIndex: pinExpandColumn ? 5 : undefined\n }}\n >\n { }\n </div>\n )}\n\n { }\n {checkboxSelection && (\n <div\n className={`ogx__header-cell ogx__header-cell--checkbox ${pinCheckboxColumn ? 'ogx__header-cell--pinned ogx__header-cell--pinned-left' : ''\n }`}\n role=\"columnheader\"\n style={{\n position: pinCheckboxColumn ? 'sticky' : undefined,\n left: pinCheckboxColumn ? ((rowReordering ? 48 : 0) + (hasDetailPanel && pinExpandColumn ? 48 : 0)) : undefined,\n\n }}\n >\n <Checkbox\n id={selectAllId}\n name={selectAllId}\n checked={allSelected}\n indeterminate={someSelected}\n onChange={(e) => onSelectAll?.(e.target.checked)}\n aria-label={allSelected ? 'Deselect all rows' : 'Select all rows'}\n tabIndex={focusedCell?.id === 'HEADER' && focusedCell.field === '__checkbox_col__' ? 0 : -1}\n onMouseDown={(e) => e.preventDefault()}\n inputRef={(el) => { cellRefs.current['__checkbox_col__'] = el; }}\n />\n </div>\n )}\n\n {columns.map((colDef, index) => {\n if (colDef.isSpacer) {\n return (\n <div\n key={colDef.field}\n style={{ width: colDef.width, minWidth: colDef.width, flexShrink: 0 }}\n aria-hidden=\"true\"\n />\n );\n }\n const isSortable = colDef.sortable !== false;\n const isSorted = sortModel.some(item => item.field === colDef.field);\n const isResizable = colDef.resizable !== false;\n const pinnedPosition = isColumnPinned(colDef.field, pinnedColumns);\n const isPinned = pinnedPosition !== null;\n const isDragging = draggedColumn === colDef.field;\n const isDragOver = dragOverColumn === colDef.field;\n\n const classNames = [\n 'ogx__header-cell',\n `ogx__header-cell--align-${colDef.headerAlign || colDef.align || 'left'}`,\n isSortable && 'ogx__header-cell--sortable',\n isSorted && 'ogx__header-cell--sorted',\n isPinned && `ogx__header-cell--pinned`,\n isPinned && `ogx__header-cell--pinned-${pinnedPosition}`,\n isDragging && 'ogx__header-cell--dragging',\n isDragOver && 'ogx__header-cell--drag-over',\n (focusedCell?.id === 'HEADER' && focusedCell.field === colDef.field) && 'ogx__header-cell--focused',\n colDef.headerClassName\n ].filter(Boolean).join(' ');\n\n const effectiveWidth = columnWidths[colDef.field] ?? colDef.width ?? 100;\n\n const style: React.CSSProperties = {\n width: effectiveWidth,\n minWidth: colDef.minWidth,\n maxWidth: colDef.maxWidth,\n flexGrow: colDef.flex ?? 0,\n flexShrink: 0,\n flexBasis: colDef.flex ? 'auto' : 'auto',\n boxSizing: 'border-box',\n position: isPinned ? 'sticky' : 'relative',\n zIndex: colDef.zIndex,\n opacity: isDragging ? 0.5 : 1\n };\n\n if (isPinned && pinnedPosition) {\n const offset = pinnedPositions[colDef.field];\n if (pinnedPosition === 'left') {\n style.left = offset;\n } else {\n style.right = offset;\n }\n }\n\n const headerContent = colDef.renderHeader\n ? colDef.renderHeader({ field: colDef.field, colDef: colDef as unknown as GridColDef, colIndex: index })\n : colDef.headerName || colDef.field;\n\n const handleHeaderClick = (e: React.MouseEvent) => {\n if ((e.target as HTMLElement).closest('.ogx-column-resize-handle')) {\n e.stopPropagation();\n return;\n }\n onHeaderClick?.(colDef.field);\n if (isSortable) {\n handleColumnClick(colDef)(e);\n }\n };\n\n const handleDragStart = onDragStart ? onDragStart(colDef.field) : undefined;\n const handleDragOver = onDragOver ? onDragOver(colDef.field) : undefined;\n const handleDrop = onDrop ? onDrop(colDef.field) : undefined;\n\n return (\n <div\n key={colDef.field}\n className={classNames}\n style={style}\n title={colDef.description}\n onClick={handleHeaderClick}\n role=\"columnheader\"\n draggable={!!onDragStart}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDragEnd={onDragEnd}\n onDrop={handleDrop}\n aria-sort={\n isSortable\n ? (isSorted\n ? sortModel.find(item => item.field === colDef.field)?.sort === 'asc'\n ? 'ascending'\n : 'descending'\n : 'none')\n : undefined\n }\n aria-colindex={index + 1 + (checkboxSelection ? 1 : 0)}\n data-field={colDef.field}\n tabIndex={-1}\n ref={(el) => { cellRefs.current[colDef.field] = el; }}\n >\n <div className=\"ogx__header-cell-content\">\n {isDragging && (\n <div className=\"ogx__header-drag-icon\">\n <SwapIcon />\n </div>\n )}\n <div className=\"ogx__header-cell-title-wrapper\">\n <span className=\"ogx__header-cell-title\">\n {headerContent}\n </span>\n {aggregationModel && aggregationModel[colDef.field] && (\n <span className=\"ogx__header-cell-aggregation\">\n {aggregationModel[colDef.field]}\n </span>\n )}\n </div>\n {isSortable && getSortIcon(colDef.field)}\n {!colDef.disableColumnMenu && (\n <button\n className=\"ogx__menu-icon-btn\"\n onClick={handleMenuOpen(colDef)}\n aria-label={`Open column menu for ${colDef.headerName || colDef.field}`}\n aria-haspopup=\"menu\"\n tabIndex={-1}\n >\n <MenuIcon />\n </button>\n )}\n </div>\n\n { }\n {isResizable && onColumnResize && (\n <ColumnResizeHandle\n field={colDef.field}\n currentWidth={effectiveWidth}\n onResize={onColumnResize}\n minWidth={colDef.minWidth}\n maxWidth={colDef.maxWidth}\n />\n )}\n </div>\n );\n })}\n\n {menuOpenParams && (\n <ColumnMenu\n colDef={menuOpenParams.colDef as unknown as GridColDef<GridRowModel>}\n sortModel={sortModel}\n onSort={onSort}\n onHide={onHideColumn}\n onPin={onPinColumn}\n pinnedColumns={pinnedColumns}\n onManageColumns={onManageColumns}\n onClose={handleMenuClose}\n anchorEl={menuOpenParams.anchorEl}\n />\n )}\n </div>{/* end .ogx__header */}\n </div>\n );\n}\n","\nimport React from 'react';\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: 'text' | 'outlined' | 'contained';\n size?: 'small' | 'medium' | 'large';\n color?: 'primary' | 'secondary' | 'default';\n disabled?: boolean;\n children: React.ReactNode;\n}\n\nexport const Button: React.FC<ButtonProps> = ({\n variant = 'text',\n size = 'medium',\n color = 'default',\n disabled = false,\n className = '',\n children,\n ...props\n}) => {\n const classNames = [\n 'ogx-button',\n `ogx-button--${variant}`,\n `ogx-button--${size}`,\n `ogx-button--${color}`,\n disabled && 'ogx-button--disabled',\n className\n ].filter(Boolean).join(' ');\n\n return (\n <button\n className={classNames}\n disabled={disabled}\n {...props}\n >\n {children}\n </button>\n );\n};\n","\nimport React, { useId } from 'react';\nimport { Button } from '../ui/Button';\nimport type { GridLocaleText } from '../../types';\n\nexport interface PaginationProps {\n page: number;\n pageSize: number;\n rowCount: number;\n onPageChange: (page: number) => void;\n onPageSizeChange: (pageSize: number) => void;\n pageSizeOptions?: number[];\n showFirstButton?: boolean;\n showLastButton?: boolean;\n localeText?: Pick<GridLocaleText, 'paginationRowsPerPage' | 'paginationOf' | 'paginationPage'>;\n}\n\nexport function Pagination(props: PaginationProps) {\n const pageSizeId = useId();\n const {\n page,\n pageSize,\n rowCount,\n onPageChange,\n onPageSizeChange,\n pageSizeOptions = [10, 25, 50, 100],\n showFirstButton = true,\n showLastButton = true,\n localeText,\n } = props;\n\n const pageCount = Math.max(1, Math.ceil(rowCount / pageSize));\n const currentPage = Math.min(page, pageCount - 1);\n\n const firstRowIndex = currentPage * pageSize;\n const lastRowIndex = Math.min(firstRowIndex + pageSize, rowCount);\n const displayedRows = rowCount === 0 ? 0 : `${firstRowIndex + 1}–${lastRowIndex}`;\n\n const rowsPerPageLabel = localeText?.paginationRowsPerPage ?? 'Rows per page:';\n const ofLabel = localeText?.paginationOf\n ? localeText.paginationOf(rowCount === 0 ? 0 : firstRowIndex + 1, lastRowIndex, rowCount)\n : `${displayedRows} of ${rowCount}`;\n const pageLabel = localeText?.paginationPage\n ? localeText.paginationPage(currentPage + 1, pageCount)\n : `Page ${currentPage + 1} of ${pageCount}`;\n\n const handleFirstPage = () => {\n onPageChange(0);\n };\n\n const handlePreviousPage = () => {\n onPageChange(Math.max(0, currentPage - 1));\n };\n\n const handleNextPage = () => {\n onPageChange(Math.min(pageCount - 1, currentPage + 1));\n };\n\n const handleLastPage = () => {\n onPageChange(pageCount - 1);\n };\n\n const handlePageSizeChange = (event: React.ChangeEvent<HTMLSelectElement>) => {\n const newPageSize = parseInt(event.target.value, 10);\n onPageSizeChange(newPageSize);\n\n };\n\n const isFirstPage = currentPage === 0;\n const isLastPage = currentPage >= pageCount - 1;\n\n return (\n <div className=\"ogx-pagination\" role=\"navigation\" aria-label=\"Pagination\">\n { }\n <div className=\"ogx-pagination__page-size\">\n <label htmlFor={pageSizeId} className=\"ogx-pagination__label\">\n {rowsPerPageLabel}\n </label>\n <select\n id={pageSizeId}\n className=\"ogx-pagination__select\"\n value={pageSize}\n onChange={handlePageSizeChange}\n aria-label=\"Rows per page\"\n >\n {pageSizeOptions.map(option => (\n <option key={option} value={option}>\n {option}\n </option>\n ))}\n </select>\n </div>\n\n { }\n <div className=\"ogx-pagination__info\" aria-live=\"polite\" aria-atomic=\"true\">\n {ofLabel}\n </div>\n\n { }\n <div className=\"ogx-pagination__actions\">\n {showFirstButton && (\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={handleFirstPage}\n disabled={isFirstPage}\n aria-label=\"Go to first page\"\n title=\"First page\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M18.41 16.59L13.82 12l4.59-4.59L17 6l-6 6 6 6zM6 6h2v12H6z\" />\n </svg>\n </Button>\n )}\n\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={handlePreviousPage}\n disabled={isFirstPage}\n aria-label=\"Go to previous page\"\n title=\"Previous page\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\" />\n </svg>\n </Button>\n\n <div className=\"ogx-pagination__page-info\" aria-current=\"page\">\n {pageLabel}\n </div>\n\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={handleNextPage}\n disabled={isLastPage}\n aria-label=\"Go to next page\"\n title=\"Next page\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" />\n </svg>\n </Button>\n\n {showLastButton && (\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={handleLastPage}\n disabled={isLastPage}\n aria-label=\"Go to last page\"\n title=\"Last page\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M5.59 7.41L10.18 12l-4.59 4.59L7 18l6-6-6-6zM16 6h2v12h-2z\" />\n </svg>\n </Button>\n )}\n </div>\n </div>\n );\n}\n","\nimport { useReducer, useCallback, useState, useRef, useEffect, useLayoutEffect } from 'react';\nimport type {\n GridInternalState as GridState,\n GridRowModel,\n GridColDef,\n GridRowId,\n GridSortItem,\n GridFilterModel,\n GridPaginationModel,\n GridColumnVisibilityModel,\n GridApi\n} from '../../types';\n\ntype GridAction =\n | { type: 'SET_ROWS'; payload: GridRowModel[] | ((prev: GridRowModel[]) => GridRowModel[]); preserveRowCount?: boolean }\n | { type: 'SET_COLUMNS'; payload: GridColDef[] }\n | { type: 'SET_SORT_MODEL'; payload: GridSortItem[] }\n | { type: 'SET_FILTER_MODEL'; payload: GridFilterModel }\n | { type: 'SET_PAGINATION_MODEL'; payload: GridPaginationModel }\n | { type: 'SET_SELECTION'; payload: Set<GridRowId> }\n | { type: 'SET_DIMENSIONS'; payload: { viewportWidth: number; viewportHeight: number } }\n | { type: 'SET_DATASOURCE_LOADING'; payload: boolean }\n | { type: 'SET_DATASOURCE_ERROR'; payload: unknown }\n | { type: 'SET_ROW_COUNT'; payload: number };\n\nfunction createInitialState<R extends GridRowModel>(rows: R[], columns: GridColDef<R>[], columnVisibilityModel: GridColumnVisibilityModel = {}): GridState {\n const idRowsLookup = new Map<GridRowId, GridRowModel>();\n const allRows: GridRowId[] = [];\n\n rows.forEach(row => {\n idRowsLookup.set(row.id, row);\n allRows.push(row.id);\n });\n\n const columnLookup = new Map<string, GridColDef>();\n const orderedFields: string[] = [];\n\n columns.forEach(col => {\n columnLookup.set(col.field, col as unknown as GridColDef);\n orderedFields.push(col.field);\n });\n\n return {\n rows: {\n idRowsLookup,\n allRows\n },\n columns: {\n all: columns as unknown as GridColDef[],\n lookup: columnLookup,\n orderedFields,\n columnVisibilityModel\n },\n sorting: {\n sortModel: []\n },\n filter: {\n filterModel: { items: [] }\n },\n pagination: {\n paginationModel: { page: 0, pageSize: 100 },\n rowCount: rows.length\n },\n selection: {\n selectedRows: new Set()\n },\n pinning: {\n pinnedColumns: {},\n pinnedRows: {}\n },\n virtualization: {\n renderContext: {\n firstRowIndex: 0,\n lastRowIndex: 0,\n firstColumnIndex: 0,\n lastColumnIndex: 0\n },\n },\n dimensions: {\n rowHeight: 52,\n headerHeight: 56,\n viewportWidth: 0,\n viewportHeight: 0\n },\n dataSource: {\n loading: false,\n error: null\n }\n };\n}\n\nfunction gridReducer(state: GridState, action: GridAction): GridState {\n switch (action.type) {\n case 'SET_ROWS': {\n const currentRows = Array.from(state.rows.idRowsLookup.values());\n const newRows = typeof action.payload === 'function' \n ? action.payload(currentRows)\n : action.payload;\n\n const idRowsLookup = new Map<GridRowId, GridRowModel>();\n const allRows: GridRowId[] = [];\n\n newRows.forEach(row => {\n idRowsLookup.set(row.id, row);\n allRows.push(row.id);\n });\n\n return {\n ...state,\n rows: { idRowsLookup, allRows },\n pagination: {\n ...state.pagination,\n // Only override rowCount when we're NOT in server mode (i.e. no preserveRowCount flag)\n // Server-side fetches set rowCount separately via SET_ROW_COUNT.\n rowCount: action.preserveRowCount ? state.pagination.rowCount : newRows.length\n }\n };\n }\n\n case 'SET_COLUMNS': {\n const columnLookup = new Map<string, GridColDef>();\n const orderedFields: string[] = [];\n\n action.payload.forEach(col => {\n columnLookup.set(col.field, col);\n orderedFields.push(col.field);\n });\n\n return {\n ...state,\n columns: {\n all: action.payload,\n lookup: columnLookup,\n orderedFields,\n columnVisibilityModel: state.columns.columnVisibilityModel\n }\n };\n }\n\n case 'SET_SORT_MODEL':\n return {\n ...state,\n sorting: { sortModel: action.payload }\n };\n\n case 'SET_FILTER_MODEL':\n return {\n ...state,\n filter: { filterModel: action.payload }\n };\n\n case 'SET_PAGINATION_MODEL':\n return {\n ...state,\n pagination: {\n ...state.pagination,\n paginationModel: action.payload\n }\n };\n\n case 'SET_SELECTION':\n return {\n ...state,\n selection: { selectedRows: action.payload }\n };\n\n case 'SET_DIMENSIONS':\n return {\n ...state,\n dimensions: {\n ...state.dimensions,\n viewportWidth: action.payload.viewportWidth,\n viewportHeight: action.payload.viewportHeight\n }\n };\n\n case 'SET_DATASOURCE_LOADING':\n return {\n ...state,\n dataSource: {\n ...state.dataSource,\n loading: action.payload\n }\n };\n\n case 'SET_DATASOURCE_ERROR':\n return {\n ...state,\n dataSource: {\n ...state.dataSource,\n error: action.payload\n }\n };\n\n case 'SET_ROW_COUNT':\n return {\n ...state,\n pagination: {\n ...state.pagination,\n rowCount: action.payload\n }\n };\n\n default:\n return state;\n }\n}\n\nexport interface UseDataGridParams<R extends GridRowModel = GridRowModel> {\n rows: R[];\n columns: GridColDef<R>[];\n rowHeight?: number;\n headerHeight?: number;\n rowCount?: number;\n columnVisibilityModel?: GridColumnVisibilityModel;\n initialState?: import('../../state/types').GridInitialState;\n}\n\nexport function useDataGrid<R extends GridRowModel = GridRowModel>(params: UseDataGridParams<R>) {\n const { rows, columns, rowHeight = 52, headerHeight = 56, columnVisibilityModel, initialState: propInitialState } = params;\n\n const [internalInitialState] = useState(() =>\n createInitialState(rows, columns, columnVisibilityModel)\n );\n\n const [state, dispatch] = useReducer(gridReducer, {\n ...internalInitialState,\n sorting: propInitialState?.sorting || internalInitialState.sorting,\n filter: propInitialState?.filter || internalInitialState.filter,\n dataSource: propInitialState?.dataSource\n ? { ...internalInitialState.dataSource, ...propInitialState.dataSource }\n : internalInitialState.dataSource,\n pagination: {\n ...internalInitialState.pagination,\n ...(propInitialState?.pagination || {}),\n rowCount: params.rowCount ?? propInitialState?.pagination?.rowCount ?? internalInitialState.pagination.rowCount\n },\n dimensions: {\n ...internalInitialState.dimensions,\n rowHeight,\n headerHeight\n }\n });\n\n const stateRef = useRef(state);\n useLayoutEffect(() => { stateRef.current = state; });\n\n // Sync internal state when the external `rows` prop changes\n const prevRowsRef = useRef(rows);\n useEffect(() => {\n if (rows !== prevRowsRef.current) {\n prevRowsRef.current = rows;\n dispatch({ type: 'SET_ROWS', payload: rows as GridRowModel[] });\n }\n }, [rows]);\n\n const setRows = useCallback((rowsOrUpdater: GridRowModel[] | ((prev: GridRowModel[]) => GridRowModel[]), preserveRowCount?: boolean) => {\n dispatch({ type: 'SET_ROWS', payload: rowsOrUpdater, preserveRowCount });\n }, []);\n\n const setColumns = useCallback((newColumns: GridColDef[]) => {\n dispatch({ type: 'SET_COLUMNS', payload: newColumns });\n }, []);\n\n const setSortModel = useCallback((sortModel: GridSortItem[]) => {\n dispatch({ type: 'SET_SORT_MODEL', payload: sortModel });\n }, []);\n\n const setFilterModel = useCallback((filterModel: GridFilterModel) => {\n dispatch({ type: 'SET_FILTER_MODEL', payload: filterModel });\n }, []);\n\n const setPaginationModel = useCallback((paginationModel: GridPaginationModel) => {\n dispatch({ type: 'SET_PAGINATION_MODEL', payload: paginationModel });\n }, []);\n\n const setSelection = useCallback((selectedRows: Set<GridRowId>) => {\n dispatch({ type: 'SET_SELECTION', payload: selectedRows });\n }, []);\n\n const setDimensions = useCallback((viewportWidth: number, viewportHeight: number) => {\n dispatch({ type: 'SET_DIMENSIONS', payload: { viewportWidth, viewportHeight } });\n }, []);\n\n const setDataSourceLoading = useCallback((loading: boolean) => {\n dispatch({ type: 'SET_DATASOURCE_LOADING', payload: loading });\n }, []);\n\n const setDataSourceError = useCallback((error: unknown) => {\n dispatch({ type: 'SET_DATASOURCE_ERROR', payload: error });\n }, []);\n\n const setRowCount = useCallback((count: number) => {\n dispatch({ type: 'SET_ROW_COUNT', payload: count });\n }, []);\n\n const apiRef = useRef<GridApi>({\n getRow: (id: GridRowId) => stateRef.current.rows.idRowsLookup.get(id) || null,\n getAllRows: () => Array.from(stateRef.current.rows.idRowsLookup.values()),\n getVisibleRows: () => Array.from(stateRef.current.rows.idRowsLookup.values()),\n getAllFilteredRows: () => Array.from(stateRef.current.rows.idRowsLookup.values()),\n getGroupedExportRows: () => null,\n getAggregationResult: () => null,\n getAggregationModel: () => null,\n getColumn: (field: string) => stateRef.current.columns.lookup.get(field) || null,\n getAllColumns: () => stateRef.current.columns.all,\n getVisibleColumns: () => stateRef.current.columns.all,\n selectRow: (id: GridRowId, isSelected = true) => {\n const newSelection = new Set(stateRef.current.selection.selectedRows);\n if (isSelected) {\n newSelection.add(id);\n } else {\n newSelection.delete(id);\n }\n setSelection(newSelection);\n },\n selectRows: (ids: GridRowId[], isSelected = true) => {\n const newSelection = new Set(stateRef.current.selection.selectedRows);\n ids.forEach(id => {\n if (isSelected) {\n newSelection.add(id);\n } else {\n newSelection.delete(id);\n }\n });\n setSelection(newSelection);\n },\n getSelectedRows: () => Array.from(stateRef.current.selection.selectedRows),\n sortColumn: (field: string, direction) => {\n if (direction === null) {\n setSortModel(stateRef.current.sorting.sortModel.filter(item => item.field !== field));\n } else {\n const existingIndex = stateRef.current.sorting.sortModel.findIndex(item => item.field === field);\n if (existingIndex >= 0) {\n const newModel = [...stateRef.current.sorting.sortModel];\n newModel[existingIndex] = { field, sort: direction };\n setSortModel(newModel);\n } else {\n setSortModel([...stateRef.current.sorting.sortModel, { field, sort: direction }]);\n }\n }\n },\n getSortModel: () => stateRef.current.sorting.sortModel,\n setFilterModel,\n getFilterModel: () => stateRef.current.filter.filterModel,\n setPage: (page: number) => {\n setPaginationModel({ ...stateRef.current.pagination.paginationModel, page });\n },\n setPageSize: (pageSize: number) => {\n setPaginationModel({ ...stateRef.current.pagination.paginationModel, pageSize, page: 0 });\n },\n scrollToIndexes: () => {\n\n },\n copySelectedRows: () => Promise.resolve()\n });\n\n return {\n state,\n dispatch,\n apiRef,\n setRows,\n setColumns,\n setSortModel,\n setFilterModel,\n setPaginationModel,\n setSelection,\n setDimensions,\n setDataSourceLoading,\n setDataSourceError,\n setRowCount\n };\n}\n","import { useState, useCallback } from 'react';\nimport type { GridRowId, GridRowModel, GridRowOrderChangeParams } from '../types';\n\nexport interface UseRowReorderProps<R extends GridRowModel = GridRowModel> {\n onRowOrderChange?: (params: GridRowOrderChangeParams<R>) => void;\n rows: R[];\n getRowId?: (row: R) => GridRowId;\n rowReordering?: boolean;\n}\n\nexport interface UseRowReorderReturn {\n draggedRowId: GridRowId | null;\n dragOverRowId: GridRowId | null;\n onDragStart: ((id: GridRowId) => (event: React.DragEvent) => void) | undefined;\n onDragOver: ((id: GridRowId) => (event: React.DragEvent) => void) | undefined;\n onDragEnd: (() => void) | undefined;\n onDrop: ((targetId: GridRowId) => (event: React.DragEvent) => void) | undefined;\n}\n\nexport function useRowReorder<R extends GridRowModel = GridRowModel>(\n props: UseRowReorderProps<R>\n): UseRowReorderReturn {\n const { onRowOrderChange, rows, getRowId, rowReordering = false } = props;\n const [draggedRowId, setDraggedRowId] = useState<GridRowId | null>(null);\n const [dragOverRowId, setDragOverRowId] = useState<GridRowId | null>(null);\n\n const getRowIdInternal = useCallback((row: R) => {\n return getRowId ? getRowId(row) : row.id;\n }, [getRowId]);\n\n const handleDragStart = useCallback((id: GridRowId) => (event: React.DragEvent) => {\n if (!rowReordering) return;\n setDraggedRowId(id);\n event.dataTransfer.effectAllowed = 'move';\n\n }, [rowReordering]);\n\n const handleDragOver = useCallback((id: GridRowId) => (event: React.DragEvent) => {\n if (!rowReordering || !draggedRowId) return;\n event.preventDefault(); \n event.dataTransfer.dropEffect = 'move';\n\n if (dragOverRowId !== id) {\n setDragOverRowId(id);\n }\n }, [rowReordering, draggedRowId, dragOverRowId]);\n\n const handleDragEnd = useCallback(() => {\n setDraggedRowId(null);\n setDragOverRowId(null);\n }, []);\n\n const handleDrop = useCallback((targetId: GridRowId) => (event: React.DragEvent) => {\n event.preventDefault();\n\n if (!draggedRowId || !onRowOrderChange) {\n handleDragEnd();\n return;\n }\n\n const oldIndex = rows.findIndex(r => getRowIdInternal(r) === draggedRowId);\n const targetIndex = rows.findIndex(r => getRowIdInternal(r) === targetId);\n\n if (oldIndex !== -1 && targetIndex !== -1 && oldIndex !== targetIndex) {\n onRowOrderChange({\n row: rows[oldIndex],\n oldIndex,\n targetIndex\n });\n }\n\n handleDragEnd();\n }, [draggedRowId, onRowOrderChange, rows, getRowIdInternal, handleDragEnd]);\n\n return {\n draggedRowId,\n dragOverRowId,\n onDragStart: rowReordering ? handleDragStart : undefined,\n onDragOver: rowReordering ? handleDragOver : undefined,\n onDragEnd: rowReordering ? handleDragEnd : undefined,\n onDrop: rowReordering ? handleDrop : undefined,\n };\n}\n","import { useMemo, useState, useCallback, useEffect } from 'react';\nimport { GridRowModel, GridRowId, GridTreeNode, GridFilterModel, GridSortItem } from '../types';\nimport type { GridRowMeta } from '../types';\nimport { isRowMatchingFilter } from '../utils/filtering';\nimport { compareValues } from '../utils/sorting';\n\ninterface UseTreeDataProps<R extends GridRowModel> {\n rows: R[];\n getRowId: (row: R) => GridRowId;\n getTreeDataPath?: (row: R) => string[];\n treeData?: boolean;\n defaultGroupingExpansionDepth?: number;\n filterModel?: GridFilterModel;\n sortModel?: GridSortItem[];\n onRowExpansionChange?: (node: GridTreeNode) => void;\n}\n\nexport function useTreeData<R extends GridRowModel>(props: UseTreeDataProps<R>) {\n const { \n rows, \n getRowId,\n getTreeDataPath, \n treeData = false, \n defaultGroupingExpansionDepth = 0, \n filterModel,\n sortModel,\n onRowExpansionChange\n } = props;\n\n const { treeNodes, rootIds, groupingRows } = useMemo(() => {\n if (!treeData || !getTreeDataPath) {\n return { \n treeNodes: new Map<GridRowId, GridTreeNode>(), \n rootIds: [], \n groupingRows: [] \n };\n }\n\n const nodes = new Map<GridRowId, GridTreeNode>();\n const roots: GridRowId[] = [];\n const groupRows: GridRowModel[] = [];\n const pathLookup = new Map<string, GridRowId>();\n\n const getPathKey = (path: string[]) => path.join('/');\n\n rows.forEach(row => {\n const id = getRowId(row);\n const path = getTreeDataPath(row);\n const pathKey = getPathKey(path);\n\n pathLookup.set(pathKey, id);\n\n nodes.set(id, {\n id,\n parentId: null,\n depth: path.length - 1,\n groupingKey: path[path.length - 1],\n isExpanded: false,\n children: [],\n serverChildrenCount: row.serverChildrenCount\n });\n });\n\n rows.forEach(row => {\n const id = getRowId(row);\n const path = getTreeDataPath(row);\n\n if (path.length === 1) {\n roots.push(id);\n return;\n }\n\n const ensureAncestors = (childPath: string[]) => {\n if (childPath.length <= 1) return;\n\n const parentPath = childPath.slice(0, -1);\n const parentPathKey = getPathKey(parentPath);\n let parentId = pathLookup.get(parentPathKey);\n\n if (parentId === undefined) {\n parentId = `auto-group-${parentPathKey}`;\n\n if (!nodes.has(parentId)) {\n const groupLabel = parentPath[parentPath.length - 1];\n nodes.set(parentId, {\n id: parentId,\n parentId: null, \n depth: parentPath.length - 1,\n groupingKey: groupLabel,\n isExpanded: false,\n children: [],\n label: groupLabel\n });\n pathLookup.set(parentPathKey, parentId);\n\n const groupRow = { \n id: parentId,\n name: groupLabel, \n _isGroupRow: true\n } as unknown as GridRowModel; \n groupRows.push(groupRow);\n\n if (parentPath.length === 1) {\n roots.push(parentId);\n }\n\n ensureAncestors(parentPath);\n }\n }\n\n return parentId;\n };\n\n const parentId = ensureAncestors(path);\n\n if (parentId !== undefined) {\n const parentNode = nodes.get(parentId);\n const childNode = nodes.get(id);\n\n if (parentNode && childNode) {\n childNode.parentId = parentId;\n parentNode.children = parentNode.children || [];\n if (!parentNode.children.includes(id)) {\n parentNode.children.push(id);\n }\n }\n }\n });\n\n groupRows.forEach(groupRow => {\n const groupId = groupRow.id;\n const node = nodes.get(groupId);\n if (!node) return;\n\n const nodePathKey = (groupId as string).replace('auto-group-', '');\n const nodePath = nodePathKey.split('/');\n\n if (nodePath.length > 1) {\n const parentPath = nodePath.slice(0, -1);\n const parentPathKey = getPathKey(parentPath);\n const parentId = pathLookup.get(parentPathKey);\n\n if (parentId && nodes.has(parentId)) {\n node.parentId = parentId;\n const parentNode = nodes.get(parentId);\n if (parentNode) {\n parentNode.children = parentNode.children || [];\n if (!parentNode.children.includes(groupId)) {\n parentNode.children.push(groupId);\n }\n }\n }\n }\n });\n\n return { treeNodes: nodes, rootIds: roots, groupingRows: groupRows };\n\n }, [rows, getTreeDataPath, treeData, getRowId]);\n\n const initialExpandedIds = useMemo(() => {\n if (!treeData) return new Set<GridRowId>();\n\n const initialExpanded = new Set<GridRowId>();\n treeNodes.forEach(node => {\n if (node.children && node.children.length > 0) {\n if (defaultGroupingExpansionDepth === -1 || node.depth < defaultGroupingExpansionDepth) {\n initialExpanded.add(node.id);\n }\n }\n });\n return initialExpanded;\n }, [treeNodes, treeData, defaultGroupingExpansionDepth]);\n\n const [expandedGroupIds, setExpandedGroupIds] = useState<Set<GridRowId>>(new Set());\n\n useEffect(() => {\n if (initialExpandedIds.size > 0) {\n setExpandedGroupIds(initialExpandedIds);\n }\n }, [initialExpandedIds]);\n\n const toggleExpansion = useCallback((id: GridRowId) => {\n setExpandedGroupIds(prev => {\n const next = new Set(prev);\n const isExpanding = !next.has(id);\n\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n\n if (isExpanding && onRowExpansionChange) {\n const node = treeNodes.get(id);\n if (node) {\n onRowExpansionChange(node);\n }\n }\n\n return next;\n });\n }, [treeNodes, onRowExpansionChange]);\n\n const getVisibleRows = useCallback(() => {\n\n if (!treeData) return null; \n\n const rowLookup = new Map<GridRowId, GridRowModel>();\n rows.forEach(r => rowLookup.set(getRowId(r), r));\n groupingRows.forEach(r => rowLookup.set(r.id, r));\n\n const matchesFilter = (row: GridRowModel) => {\n return isRowMatchingFilter(row, filterModel!);\n };\n\n const filterCache = new Map<GridRowId, boolean>();\n\n const isNodeVisible = (id: GridRowId): boolean => {\n if (filterCache.has(id)) return filterCache.get(id)!;\n\n const row = rowLookup.get(id);\n if (!row) return false;\n\n const selfMatch = matchesFilter(row);\n if (selfMatch) {\n filterCache.set(id, true);\n return true;\n }\n\n const node = treeNodes.get(id);\n if (node && node.children) {\n const childMatch = node.children.some(childId => isNodeVisible(childId));\n if (childMatch) {\n filterCache.set(id, true);\n return true;\n }\n }\n\n filterCache.set(id, false);\n return false;\n };\n\n const sortNodes = (aId: GridRowId, bId: GridRowId) => {\n if (!sortModel || sortModel.length === 0) return 0;\n const rowA = rowLookup.get(aId);\n const rowB = rowLookup.get(bId);\n if (!rowA || !rowB) return 0;\n\n for (const sortItem of sortModel) {\n const valA = rowA[sortItem.field];\n const valB = rowB[sortItem.field];\n const comp = compareValues(valA, valB, sortItem.sort);\n if (comp !== 0) return comp;\n }\n return 0;\n };\n\n const result: GridRowModel[] = [];\n\n const seenIds = new Set<GridRowId>();\n\n const traverse = (ids: GridRowId[]) => {\n\n const visibleIds = ids.filter(id => isNodeVisible(id));\n\n visibleIds.sort(sortNodes);\n\n visibleIds.forEach(id => {\n if (seenIds.has(id)) return; \n\n const row = rowLookup.get(id);\n const node = treeNodes.get(id);\n\n if (row && node) {\n seenIds.add(id); \n\n const enhancedRow = {\n ...row,\n _treeDepth: node.depth,\n _isExpanded: expandedGroupIds.has(id),\n _hasChildren: Boolean((node.children && node.children.length > 0) || (node.serverChildrenCount && node.serverChildrenCount > 0)),\n _descendantCount: node.children ? node.children.length : 0\n };\n result.push(enhancedRow);\n\n if (expandedGroupIds.has(id) && node.children && node.children.length > 0) {\n traverse(node.children);\n }\n }\n });\n };\n\n traverse(rootIds);\n return result;\n\n }, [treeData, rows, groupingRows, rootIds, treeNodes, expandedGroupIds, filterModel, sortModel, getRowId]);\n\n const isGroupExpanded = useCallback((id: GridRowId) => expandedGroupIds.has(id), [expandedGroupIds]);\n const getNode = useCallback((id: GridRowId) => treeNodes.get(id), [treeNodes]);\n\n const getNodePath = useCallback((id: GridRowId): string[] => {\n const path: string[] = [];\n let currentId: GridRowId | null = id;\n\n while (currentId !== null) {\n const node = treeNodes.get(currentId);\n if (!node) break;\n\n path.unshift(node.groupingKey);\n currentId = node.parentId;\n }\n return path;\n }, [treeNodes]);\n\n const rowMetaMap = useMemo<Map<GridRowId, GridRowMeta>>(() => {\n const map = new Map<GridRowId, GridRowMeta>();\n const groupRowIds = new Set(groupingRows.map(r => r.id));\n treeNodes.forEach((node, id) => {\n map.set(id, {\n hasChildren: Boolean(\n (node.children && node.children.length > 0) ||\n (node.serverChildrenCount && node.serverChildrenCount > 0)\n ),\n treeDepth: node.depth,\n descendantCount: node.children ? node.children.length : undefined,\n isGroupRow: groupRowIds.has(id),\n isExpanded: expandedGroupIds.has(id),\n });\n });\n return map;\n }, [treeNodes, groupingRows, expandedGroupIds]);\n\n return useMemo(() => ({\n treeNodes,\n groupingRows,\n toggleExpansion,\n isGroupExpanded,\n getVisibleRows,\n getNode,\n getNodePath,\n rowMetaMap,\n }), [treeNodes, groupingRows, toggleExpansion, isGroupExpanded, getVisibleRows, getNode, getNodePath, rowMetaMap]);\n}\n","import { useState, useMemo, useEffect, useCallback } from 'react';\nimport type {\n GridRowModel,\n GridRowId,\n GridRowGroupingModel,\n GridAggregationModel,\n GridTreeNode,\n GridFilterModel,\n GridSortItem,\n GridRowMeta,\n GridColDef\n} from '../types';\nimport { isRowMatchingFilter } from '../utils/filtering';\nimport { compareValues } from '../utils/sorting';\n\nexport interface UseRowGroupingParams<R extends GridRowModel> {\n rows: R[];\n getRowId: (row: R) => GridRowId;\n columns?: GridColDef<R>[];\n rowGroupingModel?: GridRowGroupingModel;\n aggregationModel?: GridAggregationModel;\n defaultGroupingExpansionDepth?: number;\n filterModel?: GridFilterModel;\n sortModel?: GridSortItem[];\n getAggregationPosition?: (groupNode: GridTreeNode | null) => 'inline' | 'footer' | null;\n}\n\nconst defaultGetAggregationPosition = (groupNode: GridTreeNode | null): 'inline' | 'footer' | null => {\n\n return groupNode?.depth === -1 ? 'footer' : 'inline';\n};\n\n// Stable empty defaults — module-level constants prevent new object identity\n// on every render, which would otherwise invalidate useMemo deps and cause\n// infinite re-render loops when callers omit optional params.\nconst EMPTY_ROW_GROUPING_MODEL: GridRowGroupingModel = [];\nconst EMPTY_AGGREGATION_MODEL: GridAggregationModel = {};\n\nexport function useRowGrouping<R extends GridRowModel>(params: UseRowGroupingParams<R>) {\n const {\n rows,\n getRowId,\n columns,\n rowGroupingModel = EMPTY_ROW_GROUPING_MODEL,\n aggregationModel = EMPTY_AGGREGATION_MODEL,\n defaultGroupingExpansionDepth = 0,\n filterModel,\n sortModel,\n getAggregationPosition = defaultGetAggregationPosition\n } = params;\n\n const columnsLookup = useMemo(() => {\n const map = new Map<string, GridColDef<R>>();\n (columns ?? []).forEach(col => map.set(col.field, col));\n return map;\n }, [columns]);\n\n const [expandedGroupIds, setExpandedGroupIds] = useState<Set<GridRowId>>(new Set());\n\n const { treeNodes, rootIds, groupingRows } = useMemo(() => {\n const treeNodes = new Map<GridRowId, GridTreeNode>();\n const groupingRows = new Map<GridRowId, R>();\n const rootIds: GridRowId[] = [];\n\n if (rowGroupingModel.length === 0) {\n return { treeNodes, rootIds, groupingRows };\n }\n\n const getGroupId = (field: string, value: unknown, parentId: GridRowId | null) => {\n return `auto-group-${field}-${value}-${parentId || 'root'}`;\n };\n\n const groupRows = (\n currentRows: R[], \n depth: number, \n parentId: GridRowId | null\n ) => {\n if (depth >= rowGroupingModel.length) {\n\n return currentRows.map(row => {\n const id = getRowId(row);\n treeNodes.set(id, {\n id,\n parentId,\n depth,\n groupingKey: '',\n isExpanded: false\n });\n return id;\n });\n }\n\n const field = rowGroupingModel[depth];\n\n // Skip fields where the column has explicitly opted out of grouping.\n const colDef = columnsLookup.get(field);\n if (colDef && colDef.groupable === false) {\n return groupRows(currentRows, depth + 1, parentId);\n }\n\n const groups = new Map<string, R[]>();\n\n // Group current rows by value of the current field\n currentRows.forEach(row => {\n const value = row[field];\n const key = String(value); // reliable map key\n if (!groups.has(key)) {\n groups.set(key, []);\n }\n groups.get(key)!.push(row);\n });\n\n const groupIds: GridRowId[] = [];\n\n // Create group rows\n groups.forEach((groupRowsList, key) => {\n // Use the raw value from the first row of the group for the groupingValue\n const firstRow = groupRowsList[0];\n const rawValue = firstRow[field];\n\n const groupId = getGroupId(field, key, parentId);\n groupIds.push(groupId);\n\n // Calculate Aggregations for this group\n const aggregatedValues: Record<string, unknown> = {};\n if (aggregationModel) {\n Object.entries(aggregationModel).forEach(([aggField, aggType]) => {\n const values = groupRowsList.map(r => r[aggField]);\n if (aggType === 'sum') {\n aggregatedValues[aggField] = values.reduce((a: number, b) => a + (Number(b) || 0), 0);\n } else if (aggType === 'min') {\n aggregatedValues[aggField] = Math.min(...values.map(v => Number(v) || 0));\n } else if (aggType === 'max') {\n aggregatedValues[aggField] = Math.max(...values.map(v => Number(v) || 0));\n } else if (aggType === 'avg') {\n const sum = values.reduce((a: number, b) => a + (Number(b) || 0), 0);\n aggregatedValues[aggField] = values.length ? sum / values.length : 0;\n } else if (aggType === 'count') {\n aggregatedValues[aggField] = values.length;\n }\n });\n }\n\n const groupRow = {\n [field]: rawValue,\n ...aggregatedValues,\n id: groupId\n } as unknown as R;\n\n groupingRows.set(groupId, groupRow);\n\n const treeNode: GridTreeNode = {\n id: groupId,\n parentId,\n depth,\n groupingKey: key,\n groupingField: field,\n groupingValue: rawValue,\n aggregatedValues,\n isExpanded: false,\n children: [], \n label: colDef?.groupingValueFormatter\n ? colDef.groupingValueFormatter({ field, value: rawValue })\n : `${field}: ${String(rawValue)}` \n };\n\n treeNode.aggregationPosition = getAggregationPosition(treeNode);\n\n treeNodes.set(groupId, treeNode);\n\n const childrenIds = groupRows(groupRowsList, depth + 1, groupId);\n treeNodes.get(groupId)!.children = childrenIds;\n\n const descendantCount = groupRowsList.length;\n treeNodes.get(groupId)!.descendantCount = descendantCount;\n });\n\n return groupIds;\n };\n\n const topLevelIds = groupRows(rows, 0, null);\n rootIds.push(...topLevelIds);\n\n return { treeNodes, rootIds, groupingRows };\n\n }, [rows, rowGroupingModel, aggregationModel, getRowId, getAggregationPosition, columnsLookup]);\n\n useEffect(() => {\n if (defaultGroupingExpansionDepth === -1) {\n\n const allGroupIds = new Set<GridRowId>();\n treeNodes.forEach((node, id) => {\n if (node.children && node.children.length > 0) {\n allGroupIds.add(id);\n }\n });\n setExpandedGroupIds(allGroupIds);\n } else if (defaultGroupingExpansionDepth > 0) {\n const depthIds = new Set<GridRowId>();\n treeNodes.forEach((node, id) => {\n if (node.depth < defaultGroupingExpansionDepth && node.children && node.children.length > 0) {\n depthIds.add(id);\n }\n });\n setExpandedGroupIds(depthIds);\n } else {\n\n setExpandedGroupIds(new Set());\n }\n\n }, [rowGroupingModel, defaultGroupingExpansionDepth, treeNodes]);\n\n const toggleExpansion = useCallback((id: GridRowId) => {\n setExpandedGroupIds(prev => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n }, []);\n\n const isGroupExpanded = useCallback((id: GridRowId) => {\n return expandedGroupIds.has(id);\n }, [expandedGroupIds]);\n\n const getVisibleRows = useCallback(() => {\n if (rowGroupingModel.length === 0) return null;\n\n const result: R[] = [];\n const seenIds = new Set<GridRowId>();\n\n const rowLookup = new Map<GridRowId, R>();\n rows.forEach(r => rowLookup.set(getRowId(r), r));\n\n const doesNodeMatchFilter = (nodeId: GridRowId): boolean => {\n const node = treeNodes.get(nodeId);\n if (!node) return false;\n\n if (!node.children || node.children.length === 0) {\n\n const row = rowLookup.get(nodeId);\n if (!row) return false;\n\n if (filterModel) {\n if (!isRowMatchingFilter(row, filterModel)) return false;\n }\n return true;\n }\n\n return node.children.some(childId => doesNodeMatchFilter(childId));\n };\n\n const traverse = (ids: GridRowId[]) => {\n\n let visibleIds = ids;\n if (filterModel) {\n visibleIds = ids.filter(doesNodeMatchFilter);\n }\n\n if (sortModel && sortModel.length > 0) {\n visibleIds.sort((aId, bId) => {\n const rowA = groupingRows.get(aId) || rowLookup.get(aId);\n const rowB = groupingRows.get(bId) || rowLookup.get(bId);\n\n if (!rowA || !rowB) return 0;\n\n for (const sortItem of sortModel) {\n const valA = rowA[sortItem.field];\n const valB = rowB[sortItem.field];\n const compareResult = compareValues(valA, valB, sortItem.sort);\n if (compareResult !== 0) return compareResult;\n }\n return 0;\n });\n }\n\n visibleIds.forEach(id => {\n if (seenIds.has(id)) return; \n\n const node = treeNodes.get(id);\n const isGroup = node?.children && node.children.length > 0;\n\n const row = isGroup ? groupingRows.get(id) : rowLookup.get(id);\n\n if (row && node) {\n seenIds.add(id);\n\n const enhancedRow = {\n ...row,\n _treeDepth: node.depth,\n _isExpanded: expandedGroupIds.has(id),\n _hasChildren: isGroup,\n _groupingField: node.groupingField,\n _groupingValue: node.groupingValue,\n _descendantCount: node.descendantCount\n };\n result.push(enhancedRow);\n\n if (isExpandedGroupIds.has(id) && isGroup) {\n traverse(node.children!);\n }\n }\n });\n };\n\n const isExpandedGroupIds = expandedGroupIds; \n\n traverse(rootIds);\n\n return result;\n\n }, [rows, getRowId, treeNodes, rootIds, groupingRows, filterModel, sortModel, expandedGroupIds, rowGroupingModel]);\n\n const getNode = useCallback((id: GridRowId) => treeNodes.get(id), [treeNodes]);\n\n const rowMetaMap = useMemo<Map<GridRowId, GridRowMeta>>(() => {\n const map = new Map<GridRowId, GridRowMeta>();\n treeNodes.forEach((node, id) => {\n const isGroup = Boolean(node.children && node.children.length > 0);\n map.set(id, {\n hasChildren: isGroup,\n treeDepth: node.depth,\n groupingField: node.groupingField,\n groupingValue: node.groupingValue,\n groupLabel: node.label,\n descendantCount: node.descendantCount,\n isGroupRow: isGroup,\n isExpanded: isGroup ? expandedGroupIds.has(id) : undefined,\n });\n });\n return map;\n }, [treeNodes, expandedGroupIds]);\n\n return useMemo(() => ({\n treeNodes,\n groupingRows,\n toggleExpansion,\n isGroupExpanded,\n getVisibleRows,\n getNode,\n rowMetaMap,\n }), [treeNodes, groupingRows, toggleExpansion, isGroupExpanded, getVisibleRows, getNode, rowMetaMap]);\n}\n","import React, { useState, useCallback, useRef } from 'react';\nimport type { GridRowId, GridRowModel } from '../../types';\n\nexport interface GridEditingState {\n editingCell: {\n id: GridRowId;\n field: string;\n value: unknown;\n originalValue: unknown;\n } | null;\n}\n\nexport interface UseGridEditingParams<R extends GridRowModel> {\n rows: R[];\n getRowId: (row: R) => GridRowId;\n processRowUpdate?: (newRow: R, oldRow: R) => R | Promise<R>;\n onProcessRowUpdateError?: (error: unknown) => void;\n onRowChange?: (newRow: R) => void;\n}\n\ntype EditingCellState = GridEditingState['editingCell'];\n\nexport function useGridEditing<R extends GridRowModel>(params: UseGridEditingParams<R>) {\n const {\n rows,\n getRowId,\n processRowUpdate,\n onProcessRowUpdateError,\n onRowChange\n } = params;\n\n const [editingCell, setEditingCellState] = useState<EditingCellState>(null);\n const editingCellRef = useRef<EditingCellState>(null);\n\n const setEditingCell = useCallback((val: React.SetStateAction<EditingCellState>) => {\n setEditingCellState(val);\n editingCellRef.current = typeof val === 'function' ? val(editingCellRef.current) : val;\n }, []);\n\n const startCellEdit = useCallback((editParams: { id: GridRowId; field: string; value: unknown }) => {\n setEditingCell({\n id: editParams.id,\n field: editParams.field,\n value: editParams.value,\n originalValue: editParams.value\n });\n }, [setEditingCell]);\n\n const stopCellEdit = useCallback(async (stopParams?: { cancel?: boolean }) => {\n const currentCell = editingCellRef.current;\n if (!currentCell) return;\n\n if (stopParams?.cancel) {\n setEditingCell(null);\n return;\n }\n\n const { id, field, value, originalValue } = currentCell;\n\n if (value === originalValue) {\n setEditingCell(null);\n return;\n }\n\n const existingRow = rows.find(r => getRowId(r) === id);\n if (!existingRow) {\n setEditingCell(null);\n return;\n }\n\n const newRow = { ...existingRow, [field]: value };\n\n try {\n if (processRowUpdate) {\n const processedRow = await processRowUpdate(newRow, existingRow);\n onRowChange?.(processedRow);\n } else {\n onRowChange?.(newRow);\n }\n setEditingCell(null);\n } catch (error) {\n onProcessRowUpdateError?.(error);\n }\n\n }, [setEditingCell, rows, getRowId, processRowUpdate, onRowChange, onProcessRowUpdateError]);\n\n const setEditCellValue = useCallback((editParams: { id: GridRowId; field: string; value: unknown }) => {\n if (editingCell && editingCell.id === editParams.id && editingCell.field === editParams.field) {\n setEditingCell(prev => prev ? { ...prev, value: editParams.value } : null);\n }\n }, [editingCell, setEditingCell]);\n\n return {\n editingCell,\n startCellEdit,\n stopCellEdit,\n setEditCellValue\n };\n}\n","\nimport { useState, useCallback, useEffect } from 'react';\nimport type { GridRowId, GridColDef, GridRowModel, GridRenderCellParams } from '../../types';\n\ntype ColumnKey = string;\n\nexport type CellColSpanInfo = \n | { \n spannedByColSpan: true; \n rightVisibleCellIndex: number; \n leftVisibleCellIndex: number; \n }\n | { \n spannedByColSpan: false; \n cellProps: { \n colSpan: number; \n width: number; \n }; \n };\n\ntype ColspanMap = Map<GridRowId, Record<ColumnKey, CellColSpanInfo>>;\n\nexport interface RowSpanningCaches {\n spannedCells: Record<GridRowId, Record<ColumnKey, number>>;\n hiddenCells: Record<GridRowId, Record<ColumnKey, boolean>>;\n hiddenCellOriginMap: Record<number, Record<ColumnKey, number>>;\n}\n\nexport interface RowSpanningState {\n caches: RowSpanningCaches;\n processedRange: { firstRowIndex: number; lastRowIndex: number; };\n}\n\nexport function useGridSpanning<R extends GridRowModel>(\n rows: R[],\n columns: GridColDef<R>[],\n columnWidths: Record<string, number>\n) {\n\n const [colspanMap, setColspanMap] = useState<ColspanMap>(new Map());\n\n const [rowSpanningState, setRowSpanningState] = useState<RowSpanningState>({\n caches: {\n spannedCells: {},\n hiddenCells: {},\n hiddenCellOriginMap: {}\n },\n processedRange: { firstRowIndex: 0, lastRowIndex: 0 }\n });\n\n const resetColSpan = useCallback(() => {\n setColspanMap(new Map());\n }, []);\n\n const getCellColSpanInfo = useCallback((rowId: GridRowId, field: string): CellColSpanInfo | undefined => {\n return colspanMap.get(rowId)?.[field];\n }, [colspanMap]);\n\n const calculateColSpan = useCallback((\n rowId: GridRowId,\n row: R,\n rowIndex: number,\n minFirstColumn: number,\n maxLastColumn: number\n ) => {\n const newMap = new Map(colspanMap);\n\n for (let i = minFirstColumn; i < maxLastColumn; i++) {\n const colDef = columns[i];\n if (!colDef) continue;\n\n let colSpan = 1;\n if (colDef.colSpan) {\n if (typeof colDef.colSpan === 'function') {\n const params: GridRenderCellParams<R> = {\n row,\n value: row[colDef.field as keyof R],\n field: colDef.field,\n colDef,\n rowIndex,\n colIndex: i \n };\n colSpan = colDef.colSpan(params);\n } else {\n colSpan = colDef.colSpan;\n }\n }\n\n if (colSpan <= 1) {\n setCellColSpanInfo(newMap, rowId, colDef.field, {\n spannedByColSpan: false,\n cellProps: { colSpan: 1, width: columnWidths[colDef.field] || 100 }\n });\n continue;\n }\n\n let width = columnWidths[colDef.field] || 100;\n for (let j = 1; j < colSpan; j++) {\n if (i + j < maxLastColumn) {\n const nextCol = columns[i + j];\n if (nextCol) {\n width += columnWidths[nextCol.field] || 100;\n\n setCellColSpanInfo(newMap, rowId, nextCol.field, {\n spannedByColSpan: true,\n leftVisibleCellIndex: i,\n rightVisibleCellIndex: Math.min(i + colSpan - 1, columns.length - 1)\n });\n }\n }\n }\n\n setCellColSpanInfo(newMap, rowId, colDef.field, {\n spannedByColSpan: false,\n cellProps: { colSpan, width }\n });\n\n i += colSpan - 1; \n }\n\n setColspanMap(newMap);\n }, [colspanMap, columns, columnWidths]);\n\n const calculateRowSpan = useCallback((\n firstRowIndex: number,\n lastRowIndex: number\n ) => {\n const spannedCells: Record<GridRowId, Record<ColumnKey, number>> = {};\n const hiddenCells: Record<GridRowId, Record<ColumnKey, boolean>> = {};\n const hiddenCellOriginMap: Record<number, Record<ColumnKey, number>> = {};\n\n columns.forEach((colDef, columnIndex) => {\n\n if (!colDef.rowSpan) return;\n\n for (let index = firstRowIndex; index < lastRowIndex; index++) {\n const row = rows[index];\n if (!row) continue;\n\n if (hiddenCells[row.id]?.[colDef.field]) continue;\n\n const cellValue = colDef.valueGetter\n ? colDef.valueGetter({ row, field: colDef.field, value: row[colDef.field as keyof R] })\n : row[colDef.field as keyof R];\n\n let span = 1;\n if (typeof colDef.rowSpan === 'function') {\n const params: GridRenderCellParams<R> = {\n row,\n value: cellValue,\n field: colDef.field,\n colDef,\n rowIndex: index,\n colIndex: columnIndex\n };\n span = colDef.rowSpan(params);\n } else if (typeof colDef.rowSpan === 'number') {\n span = colDef.rowSpan;\n }\n\n if (span > 1) {\n if (!spannedCells[row.id]) spannedCells[row.id] = {};\n spannedCells[row.id][colDef.field] = span; \n\n for (let k = 1; k < span; k++) {\n const nextIndex = index + k;\n if (nextIndex < lastRowIndex && rows[nextIndex]) {\n const nextRow = rows[nextIndex];\n if (!hiddenCells[nextRow.id]) hiddenCells[nextRow.id] = {};\n hiddenCells[nextRow.id][colDef.field] = true; \n\n if (!hiddenCellOriginMap[nextIndex]) hiddenCellOriginMap[nextIndex] = {};\n hiddenCellOriginMap[nextIndex][colDef.field] = index; \n }\n }\n }\n }\n });\n\n setRowSpanningState({\n caches: { spannedCells, hiddenCells, hiddenCellOriginMap },\n processedRange: { firstRowIndex, lastRowIndex }\n });\n }, [rows, columns]);\n\n const resetRowSpan = useCallback(() => {\n setRowSpanningState({\n caches: {\n spannedCells: {},\n hiddenCells: {},\n hiddenCellOriginMap: {}\n },\n processedRange: { firstRowIndex: 0, lastRowIndex: 0 }\n });\n }, []);\n\n useEffect(() => {\n\n const newMap = new Map<GridRowId, Record<ColumnKey, CellColSpanInfo>>();\n\n rows.forEach((row, index) => {\n for (let i = 0; i < columns.length; i++) {\n const colDef = columns[i];\n if (!colDef) continue;\n\n let colSpan = 1;\n if (colDef.colSpan) {\n if (typeof colDef.colSpan === 'function') {\n const params: GridRenderCellParams<R> = {\n row,\n value: row[colDef.field as keyof R],\n field: colDef.field,\n colDef,\n rowIndex: index,\n colIndex: i\n };\n colSpan = colDef.colSpan(params);\n } else {\n colSpan = colDef.colSpan;\n }\n }\n\n if (colSpan <= 1) {\n const colWidth = columnWidths[colDef.field] || (typeof colDef.width === 'number' ? colDef.width : 100);\n setCellColSpanInfo(newMap, row.id, colDef.field, {\n spannedByColSpan: false,\n cellProps: { colSpan: 1, width: colWidth }\n });\n continue;\n }\n\n let width = columnWidths[colDef.field] || (typeof colDef.width === 'number' ? colDef.width : 100);\n for (let j = 1; j < colSpan; j++) {\n if (i + j < columns.length) {\n const nextCol = columns[i + j];\n if (nextCol) {\n const nextColWidth = columnWidths[nextCol.field] || (typeof nextCol.width === 'number' ? nextCol.width : 100);\n width += nextColWidth;\n\n setCellColSpanInfo(newMap, row.id, nextCol.field, {\n spannedByColSpan: true,\n leftVisibleCellIndex: i,\n rightVisibleCellIndex: Math.min(i + colSpan - 1, columns.length - 1)\n });\n }\n }\n }\n\n setCellColSpanInfo(newMap, row.id, colDef.field, {\n spannedByColSpan: false,\n cellProps: { colSpan, width }\n });\n\n i += colSpan - 1; \n }\n });\n\n setColspanMap(newMap);\n\n const spannedCells: Record<GridRowId, Record<ColumnKey, number>> = {};\n const hiddenCells: Record<GridRowId, Record<ColumnKey, boolean>> = {};\n const hiddenCellOriginMap: Record<number, Record<ColumnKey, number>> = {};\n\n columns.forEach((colDef, columnIndex) => {\n if (!colDef.rowSpan) return;\n\n for (let index = 0; index < rows.length; index++) {\n const row = rows[index];\n if (!row) continue;\n\n if (hiddenCells[row.id]?.[colDef.field]) continue;\n\n const cellValue = colDef.valueGetter\n ? colDef.valueGetter({ row, field: colDef.field, value: row[colDef.field as keyof R] })\n : row[colDef.field as keyof R];\n\n let span = 1;\n if (typeof colDef.rowSpan === 'function') {\n const params: GridRenderCellParams<R> = {\n row,\n value: cellValue,\n field: colDef.field,\n colDef,\n rowIndex: index,\n colIndex: columnIndex\n };\n span = colDef.rowSpan(params);\n } else if (typeof colDef.rowSpan === 'number') {\n span = colDef.rowSpan;\n }\n\n if (span > 1) {\n if (!spannedCells[row.id]) spannedCells[row.id] = {};\n spannedCells[row.id][colDef.field] = span;\n\n for (let k = 1; k < span; k++) {\n const nextIndex = index + k;\n if (nextIndex < rows.length && rows[nextIndex]) {\n const nextRow = rows[nextIndex];\n if (!hiddenCells[nextRow.id]) hiddenCells[nextRow.id] = {};\n hiddenCells[nextRow.id][colDef.field] = true;\n\n if (!hiddenCellOriginMap[nextIndex]) hiddenCellOriginMap[nextIndex] = {};\n hiddenCellOriginMap[nextIndex][colDef.field] = index;\n }\n }\n }\n }\n });\n\n setRowSpanningState({\n caches: { spannedCells, hiddenCells, hiddenCellOriginMap },\n processedRange: { firstRowIndex: 0, lastRowIndex: rows.length }\n });\n }, [rows, columns, columnWidths]);\n\n const getSpannedCells = useCallback(() => rowSpanningState.caches.spannedCells, [rowSpanningState]);\n const getHiddenCells = useCallback(() => rowSpanningState.caches.hiddenCells, [rowSpanningState]);\n const getHiddenCellOriginMap = useCallback(() => rowSpanningState.caches.hiddenCellOriginMap, [rowSpanningState]);\n\n return {\n\n colspanMap,\n resetColSpan,\n getCellColSpanInfo,\n calculateColSpan,\n\n rowSpanningState,\n calculateRowSpan,\n resetRowSpan,\n getSpannedCells,\n getHiddenCells,\n getHiddenCellOriginMap\n };\n}\n\nfunction setCellColSpanInfo(\n map: ColspanMap,\n rowId: GridRowId,\n field: string,\n info: CellColSpanInfo\n) {\n let columnInfo = map.get(rowId);\n if (!columnInfo) {\n columnInfo = {};\n map.set(rowId, columnInfo);\n }\n columnInfo[field] = info;\n}\n","import { useEffect, useRef, useCallback } from 'react';\nimport { \n GridDataSource, \n GridRowModel, \n GridSortItem, \n GridFilterModel, \n GridPaginationModel,\n GridGetRowsParams,\n GridAggregationModel,\n GridAggregationResult,\n} from '../../types';\n\ninterface UseGridDataSourceParams<R extends GridRowModel> {\n dataSource?: GridDataSource<R>;\n sortModel: GridSortItem[];\n filterModel: GridFilterModel;\n paginationModel: GridPaginationModel;\n paginationMode?: 'client' | 'server' | 'infinite';\n sortingMode?: 'client' | 'server';\n filterMode?: 'client' | 'server';\n aggregationModel?: GridAggregationModel;\n setRows: (rows: R[] | ((prev: R[]) => R[]), preserveRowCount?: boolean) => void;\n setRowCount: (count: number) => void;\n setDataSourceLoading: (loading: boolean) => void;\n setDataSourceError: (error: unknown) => void;\n onAggregationResults?: (results: GridAggregationResult) => void;\n}\n\nexport function useGridDataSource<R extends GridRowModel>(params: UseGridDataSourceParams<R>) {\n const {\n dataSource,\n sortModel,\n filterModel,\n paginationModel,\n paginationMode,\n sortingMode,\n filterMode,\n aggregationModel,\n setRows,\n setRowCount,\n setDataSourceLoading,\n setDataSourceError,\n onAggregationResults,\n } = params;\n\n const prevParamsRef = useRef<{\n sortModel: GridSortItem[];\n filterModel: GridFilterModel;\n page: number;\n pageSize: number;\n } | null>(null);\n\n const activeRequestRef = useRef<number>(0);\n\n const fetchRows = useCallback(async () => {\n if (!dataSource) return;\n\n const requestId = ++activeRequestRef.current;\n\n setDataSourceLoading(true);\n setDataSourceError(null);\n\n const startRow = paginationModel.page * paginationModel.pageSize;\n const endRow = startRow + paginationModel.pageSize;\n\n const requestParams: GridGetRowsParams = {\n startRow,\n endRow,\n sortModel,\n filterModel,\n groupKeys: [], \n aggregationModel,\n };\n\n try {\n const response = await dataSource.getRows(requestParams);\n\n if (requestId !== activeRequestRef.current) {\n return;\n }\n\n let shouldAppend = false;\n\n if (paginationMode === 'infinite') {\n const prev = prevParamsRef.current;\n if (prev) {\n\n const sortChanged = JSON.stringify(prev.sortModel) !== JSON.stringify(sortModel);\n const filterChanged = JSON.stringify(prev.filterModel) !== JSON.stringify(filterModel);\n const pageSizeChanged = prev.pageSize !== paginationModel.pageSize;\n\n if (!sortChanged && !filterChanged && !pageSizeChanged && paginationModel.page > prev.page) {\n shouldAppend = true;\n }\n }\n }\n\n if (shouldAppend) {\n setRows((prevRows) => [...prevRows, ...response.rows], true);\n } else {\n setRows(response.rows, true);\n }\n\n if (response.aggregationResults && onAggregationResults) {\n onAggregationResults(response.aggregationResults);\n }\n\n if (response.rowCount !== undefined) {\n setRowCount(response.rowCount);\n } else if (paginationMode === 'infinite') {\n // rowCount is not required for infinite scroll — the grid uses appendRows\n }\n\n prevParamsRef.current = {\n sortModel,\n filterModel,\n page: paginationModel.page,\n pageSize: paginationModel.pageSize\n };\n\n } catch (error) {\n if (requestId === activeRequestRef.current) {\n setDataSourceError(error);\n console.error('Data Source Error:', error);\n }\n } finally {\n if (requestId === activeRequestRef.current) {\n setDataSourceLoading(false);\n }\n }\n }, [\n dataSource, \n paginationModel.page, \n paginationModel.pageSize, \n sortModel, \n filterModel,\n paginationMode,\n aggregationModel,\n onAggregationResults,\n setRows,\n setRowCount,\n setDataSourceLoading,\n setDataSourceError\n ]);\n\n useEffect(() => {\n const isServerSide = paginationMode === 'server' || paginationMode === 'infinite' || sortingMode === 'server' || filterMode === 'server';\n\n if (dataSource && isServerSide) {\n const timer = setTimeout(() => {\n fetchRows();\n }, 300);\n return () => clearTimeout(timer);\n }\n }, [fetchRows, dataSource, paginationMode, sortingMode, filterMode]);\n\n const fetchChildren = useCallback(async (_parentId: string | number, groupKeys: string[]) => {\n if (!dataSource) return;\n\n setDataSourceLoading(true);\n try {\n const response = await dataSource.getRows({\n startRow: 0,\n endRow: -1, \n sortModel,\n filterModel,\n groupKeys\n });\n\n if (response.rows.length > 0) {\n setRows((prevRows) => {\n\n const existingIds = new Set(prevRows.map(r => r.id));\n const newRows = response.rows.filter(r => !existingIds.has(r.id));\n return [...prevRows, ...newRows];\n });\n }\n } catch (error) {\n setDataSourceError(error);\n console.error('Failed to fetch children:', error);\n } finally {\n setDataSourceLoading(false);\n }\n }, [dataSource, sortModel, filterModel, setRows, setDataSourceLoading, setDataSourceError]);\n\n return {\n fetchRows,\n fetchChildren\n };\n}\n","\nimport { useMemo } from 'react';\nimport type { GridColDef, GridRowModel } from '../../types';\nimport type { GridPivotModel, GridPivotAggFn } from '../../types';\n\nconst SEP_COL = '\u0000';\nconst SEP_KEY = '\u001f';\n\nfunction aggregate(values: number[], fn: GridPivotAggFn): number | null {\n const nums = values.filter((v) => v != null && !isNaN(v));\n if (nums.length === 0) return null;\n switch (fn) {\n case 'sum': return nums.reduce((a, b) => a + b, 0);\n case 'avg': return nums.reduce((a, b) => a + b, 0) / nums.length;\n case 'count': return nums.length;\n case 'min': return Math.min(...nums);\n case 'max': return Math.max(...nums);\n }\n}\n\nfunction makeKey(row: GridRowModel, fields: string[]): string {\n return fields.map((f) => String(row[f] ?? '')).join(SEP_COL);\n}\n\nfunction cellKey(ck: string, field: string, aggFn: string, hasColFields: boolean): string {\n return hasColFields ? `${ck}${SEP_KEY}${field}${SEP_KEY}${aggFn}` : `${field}${SEP_KEY}${aggFn}`;\n}\n\nexport interface UsePivotReturn {\n pivotRows: GridRowModel[];\n pivotColumns: GridColDef[];\n colKeys: string[];\n isValid: boolean;\n}\n\nexport function usePivot(\n rawRows: GridRowModel[],\n rawCols: GridColDef[],\n model: GridPivotModel,\n enabled: boolean,\n): UsePivotReturn {\n return useMemo<UsePivotReturn>(() => {\n const empty: UsePivotReturn = { pivotRows: [], pivotColumns: [], colKeys: [], isValid: false };\n\n if (!enabled) return empty;\n\n const { rowFields, columnFields, valueFields } = model;\n if (rowFields.length === 0 || valueFields.length === 0) return empty;\n\n const hasColFields = columnFields.length > 0;\n const colDefMap = new Map(rawCols.map((c) => [c.field, c]));\n\n const colKeySet = new Set<string>();\n for (const row of rawRows) {\n colKeySet.add(makeKey(row, columnFields));\n }\n const colKeys = Array.from(colKeySet).sort();\n\n const outerMap = new Map<string, {\n labelValues: Record<string, unknown>;\n bucket: Map<string, Map<string, number[]>>;\n }>();\n\n for (const row of rawRows) {\n const rk = makeKey(row, rowFields);\n if (!outerMap.has(rk)) {\n const labelValues: Record<string, unknown> = {};\n for (const f of rowFields) labelValues[f] = row[f];\n outerMap.set(rk, { labelValues, bucket: new Map() });\n }\n const entry = outerMap.get(rk)!;\n\n const ck = makeKey(row, columnFields);\n if (!entry.bucket.has(ck)) entry.bucket.set(ck, new Map());\n const colBucket = entry.bucket.get(ck)!;\n\n for (const vf of valueFields) {\n const raw = row[vf.field];\n if (!colBucket.has(vf.field)) colBucket.set(vf.field, []);\n if (raw != null && !isNaN(Number(raw))) colBucket.get(vf.field)!.push(Number(raw));\n }\n }\n\n let rowIndex = 0;\n const pivotRows: GridRowModel[] = [];\n\n for (const [, entry] of outerMap) {\n const pivotRow: GridRowModel = { id: rowIndex++, ...entry.labelValues };\n\n for (const ck of colKeys) {\n const colBucket = entry.bucket.get(ck);\n for (const vf of valueFields) {\n const ck_ = cellKey(ck, vf.field, vf.aggFn, hasColFields);\n const values = colBucket?.get(vf.field) ?? [];\n pivotRow[ck_] = values.length > 0 ? aggregate(values, vf.aggFn) : null;\n }\n }\n\n pivotRows.push(pivotRow);\n }\n\n // ── Grand Total row ───────────────────────────────────────────────────\n // avg/min/max must be recomputed from raw source data — summing\n // per-row averages or mins produces wrong numbers.\n const gtBuckets = new Map<string, number[]>();\n for (const row of rawRows) {\n const ck = makeKey(row, columnFields);\n for (const vf of valueFields) {\n if (vf.aggFn !== 'avg' && vf.aggFn !== 'min' && vf.aggFn !== 'max') continue;\n const bk = `${ck}${SEP_KEY}${vf.field}`;\n if (!gtBuckets.has(bk)) gtBuckets.set(bk, []);\n const raw = row[vf.field];\n if (raw != null && !isNaN(Number(raw))) gtBuckets.get(bk)!.push(Number(raw));\n }\n }\n\n const totalRow: GridRowModel = { id: '__pivot_grand_total__' };\n for (let i = 0; i < rowFields.length; i++) {\n totalRow[rowFields[i]] = i === 0 ? 'Grand Total' : '';\n }\n for (const ck of colKeys) {\n for (const vf of valueFields) {\n const ck_ = cellKey(ck, vf.field, vf.aggFn, hasColFields);\n\n const cellValues = pivotRows\n .map(r => r[ck_])\n .filter(v => v != null && !isNaN(Number(v)))\n .map(Number);\n\n if (cellValues.length === 0) { totalRow[ck_] = null; continue; }\n\n const bk = `${ck}${SEP_KEY}${vf.field}`;\n switch (vf.aggFn) {\n case 'sum':\n case 'count':\n totalRow[ck_] = cellValues.reduce((a, b) => a + b, 0);\n break;\n case 'avg': {\n const raw = gtBuckets.get(bk) ?? [];\n totalRow[ck_] = raw.length > 0 ? raw.reduce((a, b) => a + b, 0) / raw.length : null;\n break;\n }\n case 'min':\n totalRow[ck_] = Math.min(...(gtBuckets.get(bk) ?? cellValues));\n break;\n case 'max':\n totalRow[ck_] = Math.max(...(gtBuckets.get(bk) ?? cellValues));\n break;\n }\n }\n }\n pivotRows.push(totalRow);\n\n\n const pivotColumns: GridColDef[] = [];\n\n for (const f of rowFields) {\n const orig = colDefMap.get(f);\n pivotColumns.push({\n field: f,\n headerName: orig?.headerName ?? f,\n width: orig?.width as number ?? 140,\n sortable: true,\n });\n }\n\n for (const ck of colKeys) {\n const colLabel = hasColFields\n ? ck.split(SEP_COL).map((v, i) => {\n const def = colDefMap.get(columnFields[i]);\n return def?.headerName ? `${def.headerName}: ${v}` : v;\n }).join(' / ')\n : '';\n\n for (const vf of valueFields) {\n const orig = colDefMap.get(vf.field);\n const ck_ = cellKey(ck, vf.field, vf.aggFn, hasColFields);\n const labelBase = vf.headerName ?? orig?.headerName ?? vf.field;\n const headerName = colLabel\n ? `${colLabel} — ${labelBase} (${vf.aggFn})`\n : `${labelBase} (${vf.aggFn})`;\n\n pivotColumns.push({\n field: ck_,\n headerName,\n width: 140,\n type: 'number',\n align: 'right',\n headerAlign: 'right',\n sortable: true,\n valueFormatter: ({ value }) => {\n if (value == null) return '—';\n const n = Number(value);\n if (vf.aggFn === 'avg') return n.toFixed(2);\n if (vf.aggFn === 'count') return n.toLocaleString();\n if (orig?.valueFormatter) return orig.valueFormatter({ value, row: {} as GridRowModel, field: vf.field });\n return n.toLocaleString();\n },\n });\n }\n }\n\n return { pivotRows, pivotColumns, colKeys, isValid: true };\n }, [rawRows, rawCols, model, enabled]);\n}\n","import { useEffect, useCallback } from 'react';\nimport type { GridColDef, GridRowModel, GridRowId } from '../../types';\n\ninterface UseGridClipboardProps {\n /** The currently selected row IDs — must come from the live selection source (not state.selection which is stale). */\n selectedRowIds: Set<GridRowId>;\n columns: GridColDef[];\n getVisibleRows: () => GridRowModel[];\n getRowId: (row: GridRowModel) => GridRowId;\n}\n\nfunction copyTextSynchronous(text: string): boolean {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.style.cssText = 'position:fixed;top:-9999px;left:-9999px;opacity:0;';\n document.body.appendChild(textarea);\n textarea.focus();\n textarea.select();\n let success = false;\n try {\n success = document.execCommand('copy');\n } finally {\n document.body.removeChild(textarea);\n }\n return success;\n}\n\n/**\n * Writes text to clipboard.\n * Uses both execCommand (synchronous, needed for non-HTTPS or non-async-gesture environments)\n * and navigator.clipboard for modern browser support.\n */\nasync function writeToClipboard(text: string): Promise<void> {\n let fallbackSuccess = false;\n try {\n fallbackSuccess = copyTextSynchronous(text);\n } catch {\n // Ignore fallback errors\n }\n\n if (navigator.clipboard && typeof navigator.clipboard.writeText === 'function') {\n try {\n await navigator.clipboard.writeText(text);\n return;\n } catch (e) {\n if (fallbackSuccess) return;\n throw e;\n }\n } else if (!fallbackSuccess) {\n throw new Error('Clipboard API not available and fallback failed.');\n }\n}\n\n/**\n * Hook to handle clipboard operations.\n * Copies selected rows as Tab-Separated Values (TSV) on Ctrl+C / Cmd+C.\n * Also exposes `copySelectedRows` for programmatic use via apiRef.\n */\nexport function useGridClipboard(props: UseGridClipboardProps) {\n const { selectedRowIds, columns, getVisibleRows, getRowId } = props;\n\n const copySelectedRows = useCallback(async () => {\n\n if (selectedRowIds.size === 0) return;\n\n const visibleRows = getVisibleRows();\n const rowsToCopy = visibleRows.filter((row) => selectedRowIds.has(getRowId(row)));\n\n\n\n if (rowsToCopy.length === 0) return;\n\n // Exclude internal grid columns (checkbox, expand, reorder)\n const visibleColumns = columns.filter((col) => !col.field.startsWith('__'));\n\n // Header row\n const headerRow = visibleColumns\n .map((col) => col.headerName || col.field)\n .join('\\t');\n\n // Data rows\n const dataRows = rowsToCopy\n .map((row) =>\n visibleColumns\n .map((col) => {\n const value = row[col.field];\n if (col.valueFormatter) {\n return col.valueFormatter({ value, row, field: col.field });\n }\n return value ?? '';\n })\n .join('\\t')\n )\n .join('\\n');\n\n const fullContent = `${headerRow}\\n${dataRows}`;\n\n try {\n await writeToClipboard(fullContent);\n\n } catch (err) {\n console.error('[OpenGridX] Failed to copy to clipboard:', err);\n }\n }, [selectedRowIds, columns, getVisibleRows, getRowId]);\n\n // Keyboard shortcut: Ctrl+C / Cmd+C\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (!(event.ctrlKey || event.metaKey) || event.key !== 'c') return;\n\n // Don't intercept when user is typing in an input / editor\n const activeEl = document.activeElement as HTMLElement;\n const tag = activeEl?.tagName.toLowerCase();\n const type = (activeEl as HTMLInputElement)?.type;\n\n // Skip capturing Ctrl+C if we are genuinely inside a text input\n if (\n (tag === 'input' && type !== 'checkbox' && type !== 'radio') ||\n tag === 'textarea' ||\n tag === 'select'\n ) return;\n\n if (activeEl?.isContentEditable) return;\n\n copySelectedRows();\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [copySelectedRows]);\n\n return { copySelectedRows };\n}\n","import React from 'react';\nimport type { GridColDef, GridRowModel, GridRowId, GridListViewColDef, GridRenderCellParams } from '../../types';\n\nexport interface ListViewRowProps<R extends GridRowModel = GridRowModel> {\n row: R;\n rowIndex: number;\n listViewColumn: GridListViewColDef<R>;\n isSelected?: boolean;\n checkboxSelection?: boolean;\n rowHeight?: number;\n onRowClick?: (row: R) => void;\n onSelectionChange?: (rowId: GridRowId, isSelected: boolean) => void;\n}\n\nexport function ListViewRow<R extends GridRowModel = GridRowModel>({\n row,\n rowIndex,\n listViewColumn,\n isSelected = false,\n checkboxSelection = false,\n rowHeight,\n onRowClick,\n onSelectionChange,\n}: ListViewRowProps<R>) {\n const params: GridRenderCellParams<R> = {\n row,\n value: undefined,\n field: listViewColumn.field,\n colDef: { field: listViewColumn.field } as unknown as GridColDef<R>,\n rowIndex,\n colIndex: 0,\n };\n\n const handleCheckboxChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n e.stopPropagation();\n onSelectionChange?.(row.id, e.target.checked);\n };\n\n return (\n <div\n className={`ogx-list-view__row${isSelected ? ' ogx-list-view__row--selected' : ''}`}\n style={rowHeight ? { minHeight: rowHeight } : undefined}\n onClick={() => onRowClick?.(row)}\n role=\"row\"\n aria-rowindex={rowIndex + 2}\n aria-selected={isSelected}\n >\n {checkboxSelection && (\n <div className=\"ogx-list-view__checkbox\" onClick={(e) => e.stopPropagation()}>\n <input\n type=\"checkbox\"\n checked={isSelected}\n onChange={handleCheckboxChange}\n aria-label={`Select row ${row.id}`}\n />\n </div>\n )}\n <div className=\"ogx-list-view__cell\" role=\"gridcell\">\n {listViewColumn.renderCell(params)}\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { Pagination } from '../Pagination/Pagination';\nimport { ListViewRow } from '../ListView/ListViewRow';\nimport type {\n GridRowModel,\n GridRowId,\n GridRowParams,\n GridListViewColDef,\n GridPaginationModel,\n GridDataSource,\n GridLocaleText,\n} from '../../types';\n\nexport interface GridListViewProps<R extends GridRowModel> {\n ariaLabel?: string;\n allRenderableRows: R[];\n filteredRows: R[];\n pagination: boolean;\n effectivePaginationModel: GridPaginationModel;\n pageSizeOptions: number[];\n selectedRowIds: Set<GridRowId>;\n listViewColumn: GridListViewColDef<R>;\n noRowsLabel: string;\n rowHeight: number;\n checkboxSelection: boolean;\n paginationMode: 'client' | 'server' | 'infinite';\n dataSource?: GridDataSource<R>;\n serverRowCount: number;\n paginationSlot?: React.ComponentType<Record<string, unknown>>;\n paginationSlotProps?: Record<string, unknown>;\n localeText?: Pick<GridLocaleText, 'paginationRowsPerPage' | 'paginationOf' | 'paginationPage'>;\n onRowClick: (params: GridRowParams<R>) => void;\n onSelectionChange: (rowId: GridRowId, isSelected: boolean) => void;\n onPaginationModelChange: (model: GridPaginationModel) => void;\n}\n\nexport function GridListView<R extends GridRowModel>({\n ariaLabel,\n allRenderableRows,\n filteredRows,\n pagination,\n effectivePaginationModel,\n pageSizeOptions,\n selectedRowIds,\n listViewColumn,\n noRowsLabel,\n rowHeight,\n checkboxSelection,\n paginationMode,\n dataSource,\n serverRowCount,\n paginationSlot,\n paginationSlotProps,\n localeText,\n onRowClick,\n onSelectionChange,\n onPaginationModelChange,\n}: GridListViewProps<R>) {\n const PaginationComponent = paginationSlot || Pagination;\n\n const totalRowCount = (paginationMode === 'server' && dataSource)\n ? (serverRowCount || 0)\n : filteredRows.length;\n\n return (\n <div\n className=\"ogx-list-view\"\n role=\"grid\"\n aria-label={ariaLabel || 'Data grid list view'}\n aria-rowcount={allRenderableRows.length + 1}\n >\n <div className=\"ogx-list-view__toolbar\">\n <span>\n {filteredRows.length} {filteredRows.length === 1 ? 'item' : 'items'}\n {pagination ? ` · page ${effectivePaginationModel.page + 1} of ${Math.ceil(filteredRows.length / effectivePaginationModel.pageSize) || 1}` : ''}\n {selectedRowIds.size > 0 ? ` · ${selectedRowIds.size} selected` : ''}\n </span>\n </div>\n\n <div className=\"ogx-list-view__rows\">\n {allRenderableRows.length === 0 ? (\n <div className=\"ogx-list-view__empty\" aria-live=\"polite\" role=\"status\">\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <path d=\"M3 9h18M9 21V9\" />\n </svg>\n {noRowsLabel}\n </div>\n ) : (\n allRenderableRows.map((row, idx) => (\n <ListViewRow<R>\n key={row.id}\n row={row}\n rowIndex={idx}\n listViewColumn={listViewColumn}\n isSelected={selectedRowIds.has(row.id)}\n checkboxSelection={checkboxSelection}\n rowHeight={rowHeight}\n onRowClick={(r) => onRowClick({ row: r, id: r.id, rowIndex: idx })}\n onSelectionChange={onSelectionChange}\n />\n ))\n )}\n </div>\n\n {pagination && (\n <PaginationComponent\n page={effectivePaginationModel.page}\n pageSize={effectivePaginationModel.pageSize}\n rowCount={totalRowCount}\n pageSizeOptions={pageSizeOptions}\n onPageChange={(newPage: number) => onPaginationModelChange({ ...effectivePaginationModel, page: newPage })}\n onPageSizeChange={(newPageSize: number) => onPaginationModelChange({ ...effectivePaginationModel, pageSize: newPageSize, page: 0 })}\n localeText={localeText}\n {...paginationSlotProps}\n />\n )}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport type { GridRenderCellParams } from '../../types';\n\nexport interface GridEditInputCellProps extends GridRenderCellParams {\n onValueChange: (value: unknown) => void;\n onCommit: () => void;\n onCancel: () => void;\n}\n\n// ─── Text / String ────────────────────────────────────────────────────────────\nfunction TextEditor({ value, onValueChange, onCommit, onCancel }: GridEditInputCellProps) {\n const [local, setLocal] = useState(String(value ?? ''));\n const ref = useRef<HTMLInputElement>(null);\n useEffect(() => { ref.current?.focus(); ref.current?.select(); }, []);\n\n return (\n <input\n ref={ref}\n type=\"text\"\n className=\"ogx__edit-input\"\n value={local}\n onChange={e => { setLocal(e.target.value); onValueChange(e.target.value); }}\n onBlur={onCommit}\n onKeyDown={e => {\n if (e.key === 'Enter') { e.stopPropagation(); onCommit(); }\n if (e.key === 'Escape') { e.stopPropagation(); onCancel(); }\n }}\n />\n );\n}\n\n// ─── Number ───────────────────────────────────────────────────────────────────\nfunction NumberEditor({ value, onValueChange, onCommit, onCancel }: GridEditInputCellProps) {\n const [local, setLocal] = useState<string | number>(typeof value === 'number' ? value : '');\n const ref = useRef<HTMLInputElement>(null);\n useEffect(() => { ref.current?.focus(); ref.current?.select(); }, []);\n\n return (\n <input\n ref={ref}\n type=\"number\"\n className=\"ogx__edit-input ogx__edit-input--number\"\n value={local}\n onChange={e => {\n const v = e.target.value === '' ? '' : Number(e.target.value);\n setLocal(v);\n onValueChange(v === '' ? null : v);\n }}\n onBlur={onCommit}\n onKeyDown={e => {\n if (e.key === 'Enter') { e.stopPropagation(); onCommit(); }\n if (e.key === 'Escape') { e.stopPropagation(); onCancel(); }\n }}\n />\n );\n}\n\n// ─── Boolean ──────────────────────────────────────────────────────────────────\nfunction BooleanEditor({ value, onValueChange, onCommit, onCancel }: GridEditInputCellProps) {\n const ref = useRef<HTMLInputElement>(null);\n useEffect(() => { ref.current?.focus(); }, []);\n\n const handleChange = () => {\n const next = !value;\n onValueChange(next);\n // Commit immediately on toggle\n setTimeout(onCommit, 0);\n };\n\n return (\n <div className=\"ogx__edit-boolean\">\n <input\n ref={ref}\n type=\"checkbox\"\n className=\"ogx__edit-checkbox\"\n checked={!!value}\n onChange={handleChange}\n onKeyDown={e => {\n if (e.key === 'Escape') { e.stopPropagation(); onCancel(); }\n }}\n />\n </div>\n );\n}\n\n// ─── SingleSelect / Enum ──────────────────────────────────────────────────────\nfunction SelectEditor({ value, colDef, onValueChange, onCommit, onCancel }: GridEditInputCellProps) {\n const ref = useRef<HTMLSelectElement>(null);\n useEffect(() => { ref.current?.focus(); }, []);\n\n const options = colDef.valueOptions ?? [];\n\n return (\n <select\n ref={ref}\n className=\"ogx__edit-select\"\n value={String(value ?? '')}\n onChange={e => { onValueChange(e.target.value); }}\n onBlur={onCommit}\n onKeyDown={e => {\n if (e.key === 'Enter') { e.stopPropagation(); onCommit(); }\n if (e.key === 'Escape') { e.stopPropagation(); onCancel(); }\n }}\n >\n {options.map(opt => {\n const v = typeof opt === 'object' ? opt.value : opt;\n const l = typeof opt === 'object' ? opt.label : String(opt);\n return <option key={String(v)} value={String(v)}>{l}</option>;\n })}\n </select>\n );\n}\n\n// ─── Date ─────────────────────────────────────────────────────────────────────\nfunction DateEditor({ value, onValueChange, onCommit, onCancel }: GridEditInputCellProps) {\n const [local, setLocal] = useState<string>(typeof value === 'string' ? value : String(value ?? ''));\n const ref = useRef<HTMLInputElement>(null);\n useEffect(() => { ref.current?.focus(); }, []);\n\n return (\n <input\n ref={ref}\n type=\"date\"\n className=\"ogx__edit-input\"\n value={local}\n onChange={e => { setLocal(e.target.value); onValueChange(e.target.value); }}\n onBlur={onCommit}\n onKeyDown={e => {\n if (e.key === 'Enter') { e.stopPropagation(); onCommit(); }\n if (e.key === 'Escape') { e.stopPropagation(); onCancel(); }\n }}\n />\n );\n}\n\n// ─── Router ───────────────────────────────────────────────────────────────────\nexport function GridEditInputCell(props: GridEditInputCellProps) {\n const { colDef } = props;\n\n switch (colDef.type) {\n case 'number':\n return <div className=\"ogx__edit-cell\"><NumberEditor {...props} /></div>;\n case 'boolean':\n return <div className=\"ogx__edit-cell\"><BooleanEditor {...props} /></div>;\n case 'singleSelect':\n return <div className=\"ogx__edit-cell\"><SelectEditor {...props} /></div>;\n case 'date':\n return <div className=\"ogx__edit-cell\"><DateEditor {...props} /></div>;\n default:\n return <div className=\"ogx__edit-cell\"><TextEditor {...props} /></div>;\n }\n}\n","import React from 'react';\n\n// Must live at module scope (not inline) so React sees a stable component type.\n// Calling renderFn() here puts the throw one level BELOW CellErrorBoundary,\n// which is required — a component cannot catch errors thrown in its own render().\nfunction CellRenderTarget({ renderFn }: { renderFn: () => React.ReactNode }) {\n return <>{renderFn()}</>;\n}\n\ninterface CellErrorBoundaryProps {\n renderFn: () => React.ReactNode;\n field: string;\n resetKey?: unknown;\n}\n\ninterface CellErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n resetKey?: unknown;\n}\n\nexport class CellErrorBoundary extends React.Component<CellErrorBoundaryProps, CellErrorBoundaryState> {\n constructor(props: CellErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null, resetKey: props.resetKey };\n }\n\n static getDerivedStateFromProps(\n props: CellErrorBoundaryProps,\n state: CellErrorBoundaryState\n ): Partial<CellErrorBoundaryState> | null {\n if (state.hasError && props.resetKey !== state.resetKey) {\n return { hasError: false, error: null, resetKey: props.resetKey };\n }\n if (props.resetKey !== state.resetKey) {\n return { resetKey: props.resetKey };\n }\n return null;\n }\n\n static getDerivedStateFromError(error: Error): Partial<CellErrorBoundaryState> {\n return { hasError: true, error };\n }\n\n override componentDidCatch(error: Error, info: React.ErrorInfo) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(`[CellErrorBoundary] field=\"${this.props.field}\"`, error, info.componentStack);\n }\n }\n\n override render() {\n if (this.state.hasError) {\n return (\n <div\n className=\"ogx__cell-error\"\n role=\"status\"\n aria-label={`Error in cell: ${this.props.field}`}\n title={this.state.error?.message ?? 'Render error'}\n >\n ⚠\n </div>\n );\n }\n return <CellRenderTarget renderFn={this.props.renderFn} />;\n }\n}\n","\nimport React from 'react';\nimport type { GridColDef, GridRowModel, GridPinnedPosition, GridCellParams, GridRowMeta } from '../../types';\nimport type { CellColSpanInfo } from '../../hooks/features/useGridSpanning';\n\nimport { GridEditInputCell } from './GridEditInputCell';\nimport { CellErrorBoundary } from './CellErrorBoundary';\n\nexport interface CellProps<R extends GridRowModel = GridRowModel> {\n onCellClick?: (params: GridCellParams<R>) => void;\n onCellEditStart?: (field: string, value: unknown) => void;\n onCellValueChange?: (field: string, newValue: unknown) => void;\n value: unknown;\n row: R;\n colDef: GridColDef<R>;\n rowIndex: number;\n colIndex: number;\n isSelected?: boolean;\n onClick?: (event: React.MouseEvent) => void;\n width?: number;\n pinnedPosition?: GridPinnedPosition | null;\n pinnedOffset?: number;\n\n isFocused?: boolean;\n isFocusVisible?: boolean;\n\n isEditable?: boolean;\n isEditing?: boolean;\n onEditStart?: () => void;\n onEditStop?: (cancel?: boolean) => void;\n onValueChange?: (newValue: unknown) => void;\n\n colSpanInfo?: CellColSpanInfo;\n rowSpan?: number;\n isHiddenByRowSpan?: boolean;\n rowMeta?: GridRowMeta;\n}\n\nfunction CellImpl<R extends GridRowModel = GridRowModel>(props: CellProps<R>) {\n const {\n onCellClick,\n onCellEditStart,\n onCellValueChange,\n value,\n row,\n colDef,\n rowIndex,\n colIndex,\n isSelected,\n onClick,\n width,\n pinnedPosition,\n pinnedOffset,\n isFocused,\n isFocusVisible,\n isEditable,\n isEditing,\n onEditStart,\n onEditStop,\n onValueChange,\n\n colSpanInfo,\n rowSpan: rowSpanProp,\n isHiddenByRowSpan,\n rowMeta\n } = props;\n\n // All hooks must come before any early returns (Rules of Hooks)\n const handleValueChange = React.useCallback((newValue: unknown) => {\n if (onCellValueChange) {\n onCellValueChange(colDef.field, newValue);\n } else {\n onValueChange?.(newValue);\n }\n }, [onCellValueChange, onValueChange, colDef.field]);\n\n const formattedValue = React.useMemo(() => {\n if (colDef.valueFormatter) {\n return colDef.valueFormatter({\n value,\n row,\n field: colDef.field\n });\n }\n\n if (value === null || value === undefined) {\n return '';\n }\n\n return String(value);\n }, [value, row, colDef]);\n\n const resolvedCellClassName = React.useMemo(() => {\n if (!colDef.cellClassName) return '';\n if (typeof colDef.cellClassName === 'function') {\n return colDef.cellClassName({ value, row, field: colDef.field, colDef, rowIndex, colIndex }) || '';\n }\n return colDef.cellClassName;\n }, [colDef, value, row, rowIndex, colIndex]);\n\n const cellRef = React.useRef<HTMLDivElement>(null);\n\n React.useLayoutEffect(() => {\n if (isFocused && cellRef.current) {\n cellRef.current.focus({ preventScroll: true });\n }\n }, [isFocused]);\n\n if (colSpanInfo?.spannedByColSpan) {\n return null;\n }\n\n if (isHiddenByRowSpan) {\n return (\n <div\n className=\"ogx__cell ogx__cell--hidden\"\n style={{ width: width ?? colDef.width ?? 100 }}\n role=\"presentation\"\n data-field={colDef.field}\n data-colindex={colIndex}\n />\n );\n }\n\n const handleClick = (e: React.MouseEvent) => {\n if (onCellClick) {\n onCellClick({\n row,\n field: colDef.field,\n value,\n colDef,\n rowIndex,\n colIndex\n });\n }\n onClick?.(e);\n };\n\n const handleDoubleClick = (e: React.MouseEvent) => {\n if (isEditable && (onEditStart || onCellEditStart)) {\n e.stopPropagation();\n if (onCellEditStart) {\n onCellEditStart(colDef.field, value);\n } else {\n onEditStart?.();\n }\n }\n };\n\n const isPinned = pinnedPosition !== null && pinnedPosition !== undefined;\n\n const classNames = [\n 'ogx__cell',\n `ogx__cell--align-${colDef.align || 'left'}`,\n isSelected && 'ogx__cell--selected',\n isFocused && 'ogx__cell--focused',\n (isFocused && isFocusVisible) && 'ogx__cell--focus-visible',\n colDef.type && `ogx__cell--type-${colDef.type}`,\n isPinned && 'ogx__cell--pinned',\n isPinned && `ogx__cell--pinned-${pinnedPosition}`,\n isEditing && 'ogx__cell--editing',\n (rowSpanProp && rowSpanProp > 1) && 'ogx__cell--spanned',\n resolvedCellClassName\n ].filter(Boolean).join(' ');\n\n const colSpan = colSpanInfo?.cellProps?.colSpan || 1;\n const rowSpan = rowSpanProp || 1;\n const cellWidth = colSpanInfo?.cellProps?.width ?? width ?? colDef.width ?? 100;\n\n const style: React.CSSProperties = {\n width: 'var(--width)',\n '--width': typeof cellWidth === 'number' ? `${cellWidth}px` : cellWidth,\n flexGrow: colDef.flex ?? 0,\n flexShrink: 0,\n flexBasis: colDef.flex ? 'auto' : 'auto',\n boxSizing: 'border-box',\n minWidth: colDef.minWidth,\n maxWidth: colDef.maxWidth,\n position: isPinned ? 'sticky' : undefined,\n zIndex: colDef.zIndex ?? (isPinned ? 3 : undefined),\n padding: isEditing ? 0 : undefined\n } as React.CSSProperties;\n\n if (rowSpan > 1) {\n style.height = `calc(var(--height) * ${rowSpan} - var(--border-width, 1px))`;\n style.zIndex = 10;\n if (isPinned) {\n style.zIndex = 40;\n }\n }\n\n if (isPinned && pinnedOffset !== undefined) {\n if (pinnedPosition === 'left') {\n style.left = pinnedOffset;\n } else {\n style.right = pinnedOffset;\n }\n }\n\n return (\n <div\n ref={cellRef}\n className={classNames}\n style={style}\n onClick={handleClick}\n onDoubleClick={handleDoubleClick}\n role=\"gridcell\"\n aria-colindex={colIndex + 1}\n aria-readonly={!isEditable || undefined}\n tabIndex={-1}\n data-field={colDef.field}\n data-colindex={colIndex}\n {...(colSpan > 1 ? { 'aria-colspan': colSpan } : {})}\n {...(rowSpan > 1 ? { 'aria-rowspan': rowSpan } : {})}\n >\n <div className=\"ogx__cell-content\">\n {isEditing && (onCellValueChange || onValueChange) && onEditStop ? (\n colDef.renderEditCell ? (\n colDef.renderEditCell({\n value,\n row,\n field: colDef.field,\n colDef,\n rowIndex,\n colIndex,\n rowMeta,\n })\n ) : (\n <GridEditInputCell\n value={value}\n row={row}\n field={colDef.field}\n colDef={colDef as unknown as GridColDef}\n rowIndex={rowIndex}\n colIndex={colIndex}\n onValueChange={handleValueChange}\n onCommit={() => onEditStop()}\n onCancel={() => onEditStop(true)}\n />\n )\n ) : colDef.renderCell ? (\n <CellErrorBoundary\n field={colDef.field}\n resetKey={row}\n renderFn={() => colDef.renderCell!({\n value,\n row,\n field: colDef.field,\n colDef,\n rowIndex,\n colIndex,\n rowMeta,\n })}\n />\n ) : (\n formattedValue\n )}\n </div>\n </div>\n );\n}\n\nexport const Cell = React.memo(CellImpl) as typeof CellImpl;\n","import React from 'react';\n\nexport type DragHandleIconProps = React.ButtonHTMLAttributes<HTMLButtonElement>;\n\nexport const DragHandleIcon: React.FC<DragHandleIconProps> = ({ className = '', ...props }) => {\n return (\n <button\n type=\"button\"\n className={`ogx-drag-handle ${className}`}\n aria-label=\"Drag to reorder row\"\n {...props}\n >\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M11 18c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2zm-2-8c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm6 4c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\" />\n </svg>\n </button>\n );\n};\n","\nimport React from 'react';\nimport type { GridRowModel, GridRowId, GridDetailPanelHeight } from '../../types';\n\n\nexport interface DetailPanelProps<R extends GridRowModel = GridRowModel> {\n row: R;\n rowId: GridRowId;\n rowIndex: number;\n content: React.ReactNode;\n height: GridDetailPanelHeight;\n isExpanded: boolean;\n}\n\nexport function DetailPanel<R extends GridRowModel = GridRowModel>(props: DetailPanelProps<R>) {\n const { content, height, isExpanded } = props;\n\n if (!isExpanded) {\n return null;\n }\n\n const style: React.CSSProperties = {\n height: height === 'auto' ? 'auto' : `${height}px`,\n overflow: height === 'auto' ? 'visible' : 'auto'\n };\n\n return (\n <div className=\"ogx__detail-panel\" style={style}>\n <div className=\"ogx__detail-panel-content\">\n {content}\n </div>\n </div>\n );\n}\n","\nimport React, { useId } from 'react';\nimport { Cell } from '../Cell/Cell';\nimport { Checkbox } from '../ui/Checkbox';\nimport { ExpandIcon } from '../ui/ExpandIcon';\nimport { DragHandleIcon } from '../ui/DragHandleIcon';\nimport { DetailPanel } from '../DetailPanel/DetailPanel';\nimport type { GridRowModel, GridColDef, GridRowId, GridColumnPinning, GridRowPinning, GridRowParams, GridCellParams, GridDetailPanelHeight, GridRowMeta } from '../../types';\nimport type { CellColSpanInfo, RowSpanningCaches } from '../../hooks/features/useGridSpanning';\nimport { isColumnPinned, calculatePinnedPositions, isRowPinned } from '../../utils/pinning';\n\n\nexport interface RowProps<R extends GridRowModel = GridRowModel> {\n row: R;\n columns: GridColDef<R>[];\n rowIndex: number;\n isSelected?: boolean;\n checkboxSelection?: boolean;\n onRowClick?: (params: GridRowParams<R>) => void;\n onCellClick?: (params: GridCellParams<R>) => void;\n onSelectionChange?: (rowId: GridRowId, isSelected: boolean) => void;\n columnWidths?: Record<string, number>;\n pinnedColumns?: GridColumnPinning;\n pinnedRows?: GridRowPinning;\n\n hasDetailPanel?: boolean;\n isDetailPanelExpanded?: boolean;\n onDetailPanelToggle?: (rowId: GridRowId) => void;\n detailPanelContent?: React.ReactNode;\n detailPanelHeight?: GridDetailPanelHeight;\n\n pinCheckboxColumn?: boolean;\n pinExpandColumn?: boolean;\n\n rowReordering?: boolean;\n onDragStart?: (id: GridRowId) => (event: React.DragEvent) => void;\n onDragOver?: (id: GridRowId) => (event: React.DragEvent) => void;\n onDragEnd?: () => void;\n onDrop?: (targetId: GridRowId) => (event: React.DragEvent) => void;\n isDragging?: boolean;\n isDragOver?: boolean;\n\n editingCell?: { id: GridRowId; field: string; value: unknown; } | null;\n onEditStart?: (params: { id: GridRowId, field: string, value: unknown }) => void;\n onEditStop?: (params?: { cancel?: boolean }) => void;\n onEditCellValueChange?: (params: { id: GridRowId, field: string, value: unknown }) => void;\n\n focusedCellField?: string | null;\n isFocusVisible?: boolean;\n\n colspanMap?: Map<GridRowId, Record<string, CellColSpanInfo>>;\n rowSpanningCaches?: RowSpanningCaches;\n rowHeight?: number;\n rowMeta?: GridRowMeta;\n}\n\nexport function Row<R extends GridRowModel = GridRowModel>(props: RowProps<R>) {\n const {\n row,\n columns,\n rowIndex,\n isSelected = false,\n checkboxSelection = false,\n onRowClick,\n onCellClick,\n onSelectionChange,\n columnWidths = {},\n pinnedColumns,\n pinnedRows,\n hasDetailPanel = false,\n isDetailPanelExpanded = false,\n onDetailPanelToggle,\n detailPanelContent,\n detailPanelHeight = 200,\n pinCheckboxColumn = true,\n pinExpandColumn = true,\n rowReordering = false,\n onDragStart,\n onDragOver,\n onDragEnd,\n onDrop,\n isDragging,\n isDragOver,\n\n editingCell,\n onEditStart,\n onEditStop,\n onEditCellValueChange,\n\n focusedCellField,\n isFocusVisible,\n\n colspanMap,\n rowSpanningCaches,\n rowHeight = 52,\n rowMeta\n } = props;\n\n const checkboxId = useId();\n const expandCellRef = React.useRef<HTMLDivElement>(null);\n const checkboxCellRef = React.useRef<HTMLDivElement>(null);\n\n // All hooks must come before any early returns (Rules of Hooks)\n React.useLayoutEffect(() => {\n if (focusedCellField === '__expand_col__' && expandCellRef.current) {\n expandCellRef.current.focus({ preventScroll: true });\n }\n if (focusedCellField === '__checkbox_col__' && checkboxCellRef.current) {\n checkboxCellRef.current.focus({ preventScroll: true });\n }\n }, [focusedCellField]);\n\n const pinnedPositions = React.useMemo(() => {\n return calculatePinnedPositions(\n columns,\n columnWidths,\n pinnedColumns,\n checkboxSelection,\n pinCheckboxColumn,\n hasDetailPanel,\n pinExpandColumn,\n rowReordering\n );\n }, [columns, columnWidths, pinnedColumns, checkboxSelection, pinCheckboxColumn, hasDetailPanel, pinExpandColumn, rowReordering]);\n\n const isGroupRow = rowMeta?.hasChildren === true;\n\n const handleCellEditStart = React.useCallback((field: string, value: unknown) => {\n if (!isGroupRow) {\n onEditStart?.({ id: row.id, field, value });\n }\n }, [isGroupRow, row.id, onEditStart]);\n\n const handleCellValueChange = React.useCallback((field: string, newValue: unknown) => {\n onEditCellValueChange?.({ id: row.id, field, value: newValue });\n }, [onEditCellValueChange, row.id]);\n\n const handleEditStopWrapper = React.useCallback((cancel?: boolean) => {\n onEditStop?.({ cancel });\n }, [onEditStop]);\n\n // ── Skeleton row (shown during infinite-scroll fetch) ─────────────────────\n if (row._isSkeleton) {\n // Render shimmer placeholders — one per visible column, matching row height\n const cellCount = Math.max(columns.length, 5);\n return (\n <div\n className=\"ogx__row ogx__row--skeleton\"\n role=\"row\"\n aria-hidden=\"true\"\n style={{ height: rowHeight, minHeight: rowHeight }}\n >\n {Array.from({ length: cellCount }).map((_, i) => (\n <div key={i} className=\"ogx__skeleton-cell\">\n <div className=\"ogx__skeleton-bar\" />\n </div>\n ))}\n </div>\n );\n }\n\n const handleRowClick = (event: React.MouseEvent) => {\n\n if ((event.target as HTMLElement).closest('.ogx-checkbox-wrapper, .ogx-expand-icon, .ogx-drag-handle, .ogx__edit-cell')) {\n return;\n }\n onRowClick?.({ row, id: row.id, rowIndex });\n };\n\n const handleCheckboxChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n event.stopPropagation();\n onSelectionChange?.(row.id, event.target.checked);\n };\n\n const handleDetailPanelToggle = (event: React.MouseEvent) => {\n event.stopPropagation();\n onDetailPanelToggle?.(row.id);\n };\n\n const rowPinnedPosition = isRowPinned(row.id, pinnedRows);\n const isRowPinnedTop = rowPinnedPosition === 'top';\n const isRowPinnedBottom = rowPinnedPosition === 'bottom';\n\n const classNames = [\n 'ogx__row',\n isSelected && 'ogx__row--selected',\n rowIndex % 2 === 0 && 'ogx__row--even',\n rowIndex % 2 === 1 && 'ogx__row--odd',\n isRowPinnedTop && 'ogx__row--pinned-top',\n isRowPinnedBottom && 'ogx__row--pinned-bottom',\n isDragging && 'ogx__row--dragging',\n isDragOver && 'ogx__row--drag-over',\n isGroupRow && 'ogx__row--group'\n ].filter(Boolean).join(' ');\n\n return (\n <>\n <div\n className={classNames}\n onClick={handleRowClick}\n role=\"row\"\n aria-rowindex={rowIndex + 1}\n aria-selected={isSelected}\n data-rowindex={rowIndex}\n onDragOver={onDragOver ? onDragOver(row.id) : undefined}\n onDrop={onDrop ? onDrop(row.id) : undefined}\n style={{\n maxHeight: `${rowHeight}px`,\n minHeight: `${rowHeight}px`,\n '--height': `${rowHeight}px`,\n '--border-width': '1px'\n } as React.CSSProperties}\n >\n { }\n {rowReordering && (\n <div\n className=\"ogx__cell ogx__cell--drag-handle\"\n role=\"gridcell\"\n aria-label=\"Drag to reorder row\"\n style={{\n position: 'sticky',\n left: 0,\n zIndex: 4\n }}\n draggable={true}\n onDragStart={onDragStart ? onDragStart(row.id) : undefined}\n onDragEnd={onDragEnd}\n onClick={(e) => e.stopPropagation()}\n >\n <DragHandleIcon />\n </div>\n )}\n\n { }\n {hasDetailPanel && (\n <div\n className={`ogx__cell ogx__cell--expand ${pinExpandColumn ? 'ogx__cell--pinned-left' : ''\n } ${focusedCellField === '__expand_col__' ? 'ogx__cell--focused' : ''} ${(focusedCellField === '__expand_col__' && isFocusVisible) ? 'ogx__cell--focus-visible' : ''\n }`}\n role=\"gridcell\"\n aria-label={isDetailPanelExpanded ? 'Collapse row details' : 'Expand row details'}\n aria-expanded={isDetailPanelExpanded}\n style={{\n position: pinExpandColumn ? 'sticky' : undefined,\n left: pinExpandColumn ? (rowReordering ? 48 : 0) : undefined,\n zIndex: pinExpandColumn ? 5 : undefined\n }}\n ref={expandCellRef}\n tabIndex={-1}\n onClick={(e) => {\n e.stopPropagation();\n onCellClick?.({\n row,\n field: '__expand_col__',\n value: isDetailPanelExpanded,\n colDef: { field: '__expand_col__', width: 48 } as unknown as GridColDef<R>,\n rowIndex,\n colIndex: -1\n });\n }}\n >\n <ExpandIcon\n isExpanded={isDetailPanelExpanded}\n onClick={handleDetailPanelToggle}\n variant=\"plus-minus\"\n />\n </div>\n )}\n\n { }\n {checkboxSelection && (\n <div\n className={`ogx__cell ogx__cell--checkbox ${pinCheckboxColumn ? 'ogx__cell--pinned-left' : ''\n } ${focusedCellField === '__checkbox_col__' ? 'ogx__cell--focused' : ''} ${(focusedCellField === '__checkbox_col__' && isFocusVisible) ? 'ogx__cell--focus-visible' : ''\n }`}\n role=\"gridcell\"\n style={{\n position: pinCheckboxColumn ? 'sticky' : undefined,\n left: pinCheckboxColumn ? ((rowReordering ? 48 : 0) + (hasDetailPanel && pinExpandColumn ? 48 : 0)) : undefined,\n zIndex: pinCheckboxColumn ? 11 : undefined\n }}\n ref={checkboxCellRef}\n tabIndex={-1}\n onClick={(e) => {\n e.stopPropagation();\n onCellClick?.({\n row,\n field: '__checkbox_col__',\n value: isSelected,\n colDef: { field: '__checkbox_col__', width: 48 } as unknown as GridColDef<R>,\n rowIndex,\n colIndex: -1\n });\n }}\n >\n <Checkbox\n id={checkboxId}\n name={`ogx-select-row-${row.id}`}\n checked={isSelected}\n onChange={handleCheckboxChange}\n onClick={(e) => e.stopPropagation()}\n aria-label={isSelected ? `Deselect row ${row.id}` : `Select row ${row.id}`}\n tabIndex={-1}\n onMouseDown={(e) => e.preventDefault()}\n />\n </div>\n )}\n\n { }\n {columns.map((colDef, colIndex) => {\n if (colDef.isSpacer) {\n return (\n <div\n key={colDef.field}\n style={{ width: colDef.width, minWidth: colDef.width, flexShrink: 0 }}\n aria-hidden=\"true\"\n />\n );\n }\n const value = colDef.valueGetter\n ? colDef.valueGetter({ row, field: colDef.field, value: row[colDef.field] })\n : row[colDef.field];\n\n const effectiveWidth = columnWidths[colDef.field] ?? colDef.width;\n\n const pinnedPosition = isColumnPinned(colDef.field, pinnedColumns);\n const pinnedOffset = pinnedPosition ? pinnedPositions[colDef.field] : undefined;\n\n const isEditing = editingCell?.id === row.id && editingCell?.field === colDef.field;\n\n const cellValue = isEditing ? editingCell?.value : value;\n\n const colSpanInfo = colspanMap?.get(row.id)?.[colDef.field];\n const rowSpan = rowSpanningCaches?.spannedCells[row.id]?.[colDef.field];\n const isHiddenByRowSpan = rowSpanningCaches?.hiddenCells[row.id]?.[colDef.field] || false;\n\n return (\n <Cell\n key={colDef.field}\n value={cellValue}\n row={row}\n colDef={colDef}\n rowIndex={rowIndex}\n colIndex={colIndex}\n isSelected={isSelected}\n onCellClick={onCellClick}\n width={effectiveWidth}\n pinnedPosition={pinnedPosition}\n pinnedOffset={pinnedOffset}\n\n isFocused={focusedCellField === colDef.field}\n isFocusVisible={isFocusVisible}\n\n isEditable={colDef.editable}\n isEditing={isEditing}\n onCellEditStart={handleCellEditStart}\n onEditStop={handleEditStopWrapper}\n onCellValueChange={handleCellValueChange}\n\n colSpanInfo={colSpanInfo}\n rowSpan={rowSpan}\n isHiddenByRowSpan={isHiddenByRowSpan}\n rowMeta={rowMeta}\n />\n );\n })}\n </div>\n\n { }\n {hasDetailPanel && (\n <DetailPanel\n row={row}\n rowId={row.id}\n rowIndex={rowIndex}\n content={detailPanelContent}\n height={detailPanelHeight}\n isExpanded={isDetailPanelExpanded}\n />\n )}\n </>\n );\n}\n","import React from 'react';\nimport { Row } from '../Row/Row';\nimport type {\n GridRowModel,\n GridRowId,\n GridColDef,\n GridRowParams,\n GridCellParams,\n GridColumnPinning,\n GridRowPinning,\n GridDetailPanelParams,\n GridDetailPanelHeight,\n GridRowMeta,\n} from '../../types';\nimport type { CellColSpanInfo, RowSpanningCaches } from '../../hooks/features/useGridSpanning';\n\nexport interface GridPinnedRowsProps<R extends GridRowModel> {\n rows: R[];\n position: 'top' | 'bottom';\n columns: GridColDef<R>[];\n selectedRowIds: Set<GridRowId>;\n checkboxSelection: boolean;\n onRowClick: (params: GridRowParams<R>) => void;\n onCellClick: (params: GridCellParams<R>) => void;\n onSelectionChange: (rowId: GridRowId, isSelected: boolean) => void;\n columnWidths: Record<string, number>;\n pinnedColumns: GridColumnPinning;\n pinnedRows?: GridRowPinning;\n hasDetailPanel: boolean;\n expandedRowIds: Set<GridRowId>;\n getDetailPanelContent?: (params: GridDetailPanelParams<R>) => React.ReactNode;\n getDetailPanelHeight?: (params: GridDetailPanelParams<R>) => GridDetailPanelHeight;\n onDetailPanelToggle: (rowId: GridRowId) => void;\n pinCheckboxColumn?: boolean;\n pinExpandColumn?: boolean;\n focusedCell: { id: GridRowId; field: string } | null;\n colspanMap?: Map<GridRowId, Record<string, CellColSpanInfo>>;\n rowSpanningCaches?: RowSpanningCaches;\n rowHeight: number;\n rowMetaMap: Map<GridRowId, GridRowMeta>;\n}\n\nexport function GridPinnedRows<R extends GridRowModel>({\n rows,\n position,\n columns,\n selectedRowIds,\n checkboxSelection,\n onRowClick,\n onCellClick,\n onSelectionChange,\n columnWidths,\n pinnedColumns,\n pinnedRows,\n hasDetailPanel,\n expandedRowIds,\n getDetailPanelContent,\n getDetailPanelHeight,\n onDetailPanelToggle,\n pinCheckboxColumn,\n pinExpandColumn,\n focusedCell,\n colspanMap,\n rowSpanningCaches,\n rowHeight,\n rowMetaMap,\n}: GridPinnedRowsProps<R>) {\n if (rows.length === 0) return null;\n\n return (\n <div className={`ogx__pinned-rows ogx__pinned-rows--${position}`} role=\"rowgroup\">\n {rows.map((row, index) => (\n <Row<R>\n key={row.id}\n row={row}\n columns={columns}\n rowIndex={index}\n isSelected={selectedRowIds.has(row.id)}\n checkboxSelection={checkboxSelection}\n onRowClick={onRowClick}\n onCellClick={onCellClick}\n onSelectionChange={onSelectionChange}\n columnWidths={columnWidths}\n pinnedColumns={pinnedColumns}\n pinnedRows={pinnedRows}\n hasDetailPanel={hasDetailPanel}\n isDetailPanelExpanded={expandedRowIds.has(row.id)}\n detailPanelContent={getDetailPanelContent ? getDetailPanelContent({ row, id: row.id, rowIndex: index }) : null}\n detailPanelHeight={getDetailPanelHeight?.({ row, id: row.id, rowIndex: index }) || 200}\n onDetailPanelToggle={onDetailPanelToggle}\n pinCheckboxColumn={pinCheckboxColumn}\n pinExpandColumn={pinExpandColumn}\n focusedCellField={focusedCell?.id === row.id ? focusedCell.field : null}\n colspanMap={colspanMap}\n rowSpanningCaches={rowSpanningCaches}\n rowHeight={rowHeight}\n rowMeta={rowMetaMap.get(row.id)}\n />\n ))}\n </div>\n );\n}\n","import React from 'react';\nimport type { GridColDef } from '../../types';\n\ninterface SkeletonColumn extends GridColDef {\n left?: number;\n right?: number;\n pinned?: 'left' | 'right';\n zIndex?: number;\n}\n\ninterface SkeletonRowProps {\n columns: SkeletonColumn[];\n rowHeight: number;\n checkboxSelection?: boolean;\n hasDetailPanel?: boolean;\n rowReordering?: boolean;\n}\n\nexport const SkeletonRow: React.FC<SkeletonRowProps> = ({\n columns,\n rowHeight,\n checkboxSelection = false,\n hasDetailPanel = false,\n rowReordering = false\n}) => {\n return (\n <div\n className=\"ogx__row ogx__skeleton-row\"\n style={{ height: rowHeight }}\n role=\"row\"\n >\n { }\n {checkboxSelection && (\n <div\n className=\"ogx__cell ogx__skeleton-cell\"\n style={{ width: 48, minWidth: 48 }}\n >\n <div className=\"ogx-skeleton-box\" style={{ width: 18, height: 18, borderRadius: 2 }} />\n </div>\n )}\n\n { }\n {hasDetailPanel && (\n <div\n className=\"ogx__cell ogx__skeleton-cell\"\n style={{ width: 48, minWidth: 48 }}\n >\n <div className=\"ogx-skeleton-box\" style={{ width: 18, height: 18, borderRadius: 2 }} />\n </div>\n )}\n\n { }\n {rowReordering && (\n <div\n className=\"ogx__cell ogx__skeleton-cell\"\n style={{ width: 48, minWidth: 48 }}\n >\n <div className=\"ogx-skeleton-box\" style={{ width: 18, height: 18, borderRadius: 2 }} />\n </div>\n )}\n\n { }\n {columns.map((col, index) => {\n const width = typeof col.width === 'number' ? col.width : 150;\n const skeletonWidth = Math.min(width * 0.7, width - 20);\n\n return (\n <div\n key={col.field || index}\n className=\"ogx__cell ogx__skeleton-cell\"\n style={{\n width,\n minWidth: col.minWidth,\n maxWidth: col.maxWidth,\n left: col.left,\n right: col.right,\n position: col.isSpacer ? 'relative' : (col.pinned ? 'sticky' : 'relative'),\n zIndex: col.zIndex\n }}\n >\n {!col.isSpacer && (\n <div\n className=\"ogx-skeleton-box\"\n style={{\n width: skeletonWidth,\n height: 16,\n borderRadius: 4\n }}\n />\n )}\n </div>\n );\n })}\n </div>\n );\n};\n","import React from 'react';\nimport { Row } from '../Row/Row';\nimport { SkeletonRow } from '../SkeletonRow';\nimport { isRowPinned } from '../../utils/pinning';\nimport type {\n GridRowModel,\n GridRowId,\n GridColDef,\n GridRowParams,\n GridCellParams,\n GridColumnPinning,\n GridRowPinning,\n GridDetailPanelParams,\n GridDetailPanelHeight,\n GridRowMeta,\n} from '../../types';\nimport type { GridVisibleRow } from '../../hooks/core/useGridVisibleRows';\nimport type { UseRowReorderReturn } from '../../hooks/useRowReorder';\nimport type { GridEditingState } from '../../hooks/features/useGridEditing';\nimport type { CellColSpanInfo, RowSpanningCaches } from '../../hooks/features/useGridSpanning';\n\ninterface RowEditingHandlers {\n editingCell: GridEditingState['editingCell'];\n startCellEdit: (params: { id: GridRowId; field: string; value: unknown }) => void;\n stopCellEdit: (params?: { cancel?: boolean }) => void;\n setEditCellValue: (params: { id: GridRowId; field: string; value: unknown }) => void;\n}\n\nexport interface GridVirtualRowsProps<R extends GridRowModel> {\n virtualContainerHeight: number;\n offsetTop: number;\n effectiveLoading: boolean;\n visibleRows: GridVisibleRow<R>[];\n baseColumns: GridColDef<R>[];\n virtualColumns: GridColDef<R>[];\n viewportWidth: number;\n checkboxSelection: boolean;\n hasDetailPanel: boolean;\n rowReordering: boolean;\n rowHeight: number;\n pinnedRows?: GridRowPinning;\n selectedRowIds: Set<GridRowId>;\n onRowClick: (params: GridRowParams<R>) => void;\n onCellClick: (params: GridCellParams<R>) => void;\n onSelectionChange: (rowId: GridRowId, isSelected: boolean) => void;\n columnWidths: Record<string, number>;\n pinnedColumns: GridColumnPinning;\n expandedRowIds: Set<GridRowId>;\n getDetailPanelContent?: (params: GridDetailPanelParams<R>) => React.ReactNode;\n getDetailPanelHeight?: (params: GridDetailPanelParams<R>) => GridDetailPanelHeight;\n onDetailPanelToggle: (rowId: GridRowId) => void;\n pinCheckboxColumn?: boolean;\n pinExpandColumn?: boolean;\n rowReorderHandlers: UseRowReorderReturn;\n editingHandlers: RowEditingHandlers;\n focusedCell: { id: GridRowId; field: string } | null;\n colspanMap?: Map<GridRowId, Record<string, CellColSpanInfo>>;\n rowSpanningCaches?: RowSpanningCaches;\n paginationMode: 'client' | 'server' | 'infinite';\n dataSourceLoading: boolean;\n sortedUnpinnedRowCount: number;\n infiniteScrollSkeletonCount: number;\n unpinnedRowsLength: number;\n rowMetaMap: Map<GridRowId, GridRowMeta>;\n}\n\nexport function GridVirtualRows<R extends GridRowModel>({\n virtualContainerHeight,\n offsetTop,\n effectiveLoading,\n visibleRows,\n baseColumns,\n virtualColumns,\n viewportWidth,\n checkboxSelection,\n hasDetailPanel,\n rowReordering,\n rowHeight,\n pinnedRows,\n selectedRowIds,\n onRowClick,\n onCellClick,\n onSelectionChange,\n columnWidths,\n pinnedColumns,\n expandedRowIds,\n getDetailPanelContent,\n getDetailPanelHeight,\n onDetailPanelToggle,\n pinCheckboxColumn,\n pinExpandColumn,\n rowReorderHandlers,\n editingHandlers,\n focusedCell,\n colspanMap,\n rowSpanningCaches,\n paginationMode,\n dataSourceLoading,\n sortedUnpinnedRowCount,\n infiniteScrollSkeletonCount,\n unpinnedRowsLength,\n rowMetaMap,\n}: GridVirtualRowsProps<R>) {\n const skeletonColumns: GridColDef<R>[] = baseColumns.length > 0\n ? baseColumns\n : (() => {\n const availableWidth = (viewportWidth || 1000) -\n (checkboxSelection ? 48 : 0) -\n (hasDetailPanel ? 48 : 0) -\n (rowReordering ? 48 : 0);\n const columnWidth = 150;\n const columnCount = Math.max(1, Math.ceil(availableWidth / columnWidth));\n return Array.from({ length: columnCount }, (_, i) => ({\n field: `placeholder_${i}`,\n headerName: '',\n width: columnWidth,\n })) as GridColDef<R>[];\n })();\n\n const centerRows = visibleRows\n .filter(({ row }) => !isRowPinned(row.id, pinnedRows))\n .filter((item, index, self) =>\n index === self.findIndex(t => t.row.id === item.row.id)\n );\n\n return (\n <div\n className=\"ogx__virtual-container\"\n style={{ height: `${virtualContainerHeight}px` }}\n role=\"presentation\"\n >\n <div\n className=\"ogx__rows\"\n style={{ transform: `translateY(${offsetTop}px)` }}\n role=\"rowgroup\"\n >\n {effectiveLoading && visibleRows.length === 0 ? (\n Array.from({ length: 10 }).map((_, index) => (\n <SkeletonRow\n key={`skeleton-${index}`}\n columns={skeletonColumns as unknown as GridColDef[]}\n rowHeight={rowHeight}\n checkboxSelection={checkboxSelection}\n hasDetailPanel={hasDetailPanel}\n rowReordering={rowReordering}\n />\n ))\n ) : (\n centerRows.map(({ row, rowIndex: actualIndex }) => (\n <Row<R>\n key={row.id}\n row={row}\n columns={virtualColumns}\n rowIndex={actualIndex}\n isSelected={selectedRowIds.has(row.id)}\n checkboxSelection={checkboxSelection}\n onRowClick={onRowClick}\n onCellClick={onCellClick}\n onSelectionChange={onSelectionChange}\n columnWidths={columnWidths}\n pinnedColumns={pinnedColumns}\n pinnedRows={pinnedRows}\n hasDetailPanel={hasDetailPanel}\n isDetailPanelExpanded={expandedRowIds.has(row.id)}\n detailPanelContent={getDetailPanelContent ? getDetailPanelContent({ row, id: row.id, rowIndex: actualIndex }) : null}\n detailPanelHeight={getDetailPanelHeight?.({ row, id: row.id, rowIndex: actualIndex }) || 200}\n onDetailPanelToggle={onDetailPanelToggle}\n pinCheckboxColumn={pinCheckboxColumn}\n pinExpandColumn={pinExpandColumn}\n rowReordering={rowReordering}\n onDragStart={rowReorderHandlers.onDragStart}\n onDragOver={rowReorderHandlers.onDragOver}\n onDragEnd={rowReorderHandlers.onDragEnd}\n onDrop={rowReorderHandlers.onDrop}\n isDragging={rowReorderHandlers.draggedRowId === row.id}\n isDragOver={rowReorderHandlers.dragOverRowId === row.id}\n editingCell={editingHandlers.editingCell}\n onEditStart={editingHandlers.startCellEdit}\n onEditStop={editingHandlers.stopCellEdit}\n onEditCellValueChange={editingHandlers.setEditCellValue}\n focusedCellField={focusedCell != null && focusedCell.id === row.id ? focusedCell.field : null}\n colspanMap={colspanMap}\n rowSpanningCaches={rowSpanningCaches}\n rowHeight={rowHeight}\n rowMeta={rowMetaMap.get(row.id)}\n />\n ))\n )}\n\n {paginationMode === 'infinite' && dataSourceLoading && sortedUnpinnedRowCount > 0 && (\n <div className=\"ogx__skeleton-group\">\n {Array.from({ length: infiniteScrollSkeletonCount }).map((_, i) => (\n <Row<R>\n key={`__skeleton_${i}__`}\n row={{ id: `__skeleton_${i}__`, _isSkeleton: true } as unknown as R}\n columns={virtualColumns}\n rowIndex={unpinnedRowsLength + i}\n rowHeight={rowHeight}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { useState, useMemo, useRef } from 'react';\nimport { Checkbox } from '../ui/Checkbox';\nimport type { GridColDef, GridRowModel } from '../../types';\n\n\nexport interface ColumnVisibilityPanelProps<R extends GridRowModel = GridRowModel> {\n columns: GridColDef<R>[];\n visibleColumns: Set<string>;\n onVisibilityChange: (field: string, isVisible: boolean) => void;\n onShowAll: () => void;\n onHideAll: () => void;\n onColumnReorder?: (fromField: string, toField: string) => void;\n onColumnOrderReset?: () => void;\n /** Show columns with `hideable: false` in the panel as disabled rows. Default: false. */\n showNonHideableColumns?: boolean;\n}\n\nfunction SearchIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n );\n}\n\nfunction DragHandleIcon() {\n return (\n <svg\n className=\"ogx-column-visibility-panel__drag-handle\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <circle cx=\"9\" cy=\"5\" r=\"1.5\" />\n <circle cx=\"15\" cy=\"5\" r=\"1.5\" />\n <circle cx=\"9\" cy=\"12\" r=\"1.5\" />\n <circle cx=\"15\" cy=\"12\" r=\"1.5\" />\n <circle cx=\"9\" cy=\"19\" r=\"1.5\" />\n <circle cx=\"15\" cy=\"19\" r=\"1.5\" />\n </svg>\n );\n}\n\nexport function ColumnVisibilityPanel<R extends GridRowModel = GridRowModel>(\n props: ColumnVisibilityPanelProps<R>\n) {\n const { columns, visibleColumns, onVisibilityChange, onShowAll, onHideAll, onColumnReorder, onColumnOrderReset, showNonHideableColumns } = props;\n const [searchQuery, setSearchQuery] = useState('');\n const [dragOverField, setDragOverField] = useState<string | null>(null);\n const dragFieldRef = useRef<string | null>(null);\n\n const hideableColumns = useMemo(() => columns.filter(col => col.hideable !== false), [columns]);\n const allVisible = hideableColumns.every(col => visibleColumns.has(col.field));\n\n const filteredColumns = useMemo(() => {\n const base = showNonHideableColumns ? columns : hideableColumns;\n if (!searchQuery) return base;\n const lowerQuery = searchQuery.toLowerCase();\n return base.filter(col =>\n (col.headerName || col.field).toLowerCase().includes(lowerQuery)\n );\n }, [columns, hideableColumns, searchQuery, showNonHideableColumns]);\n\n const handleToggleAll = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.checked) {\n onShowAll();\n } else {\n onHideAll();\n }\n };\n\n // ── Drag handlers ──────────────────────────────────────────────────────────\n const handleDragStart = (field: string) => (e: React.DragEvent) => {\n dragFieldRef.current = field;\n e.dataTransfer.effectAllowed = 'move';\n // Use a ghost image offset so the handle looks natural\n e.dataTransfer.setDragImage(e.currentTarget.closest('.ogx-column-visibility-panel__item') as HTMLElement, 20, 20);\n };\n\n const handleDragOver = (field: string) => (e: React.DragEvent) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n if (field !== dragFieldRef.current) {\n setDragOverField(field);\n }\n };\n\n const handleDragLeave = () => {\n setDragOverField(null);\n };\n\n const handleDrop = (toField: string) => (e: React.DragEvent) => {\n e.preventDefault();\n const fromField = dragFieldRef.current;\n setDragOverField(null);\n dragFieldRef.current = null;\n if (fromField && fromField !== toField && onColumnReorder) {\n onColumnReorder(fromField, toField);\n }\n };\n\n const handleDragEnd = () => {\n setDragOverField(null);\n dragFieldRef.current = null;\n };\n\n return (\n <div className=\"ogx-column-visibility-panel\">\n <div className=\"ogx-column-visibility-panel__search-section\">\n <div className=\"ogx-column-visibility-panel__search-container\">\n <SearchIcon />\n <input\n autoComplete=\"off\"\n className=\"ogx-column-visibility-panel__search-input\"\n placeholder=\"Search\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n />\n </div>\n </div>\n\n <div className=\"ogx-column-visibility-panel__list\">\n {filteredColumns.map(col => {\n const isVisible = visibleColumns.has(col.field);\n const isHideable = col.hideable !== false;\n const isDragOver = dragOverField === col.field;\n const canReorder = !!onColumnReorder && !searchQuery;\n\n return (\n <div\n key={col.field}\n className={[\n 'ogx-column-visibility-panel__item',\n !isHideable && 'ogx-column-visibility-panel__item--disabled',\n isDragOver && 'ogx-column-visibility-panel__item--drag-over',\n ].filter(Boolean).join(' ')}\n draggable={canReorder}\n onDragOver={canReorder ? handleDragOver(col.field) : undefined}\n onDragLeave={canReorder ? handleDragLeave : undefined}\n onDrop={canReorder ? handleDrop(col.field) : undefined}\n onDragEnd={canReorder ? handleDragEnd : undefined}\n >\n {canReorder && (\n <span\n className=\"ogx-column-visibility-panel__drag-handle-wrapper\"\n draggable\n onDragStart={handleDragStart(col.field)}\n title=\"Drag to reorder\"\n >\n <DragHandleIcon />\n </span>\n )}\n <label\n className=\"ogx-column-visibility-panel__item-label\"\n style={{ display: 'flex', alignItems: 'center', gap: 'var(--ogx-spacing-md)', flex: 1, cursor: isHideable ? 'pointer' : 'not-allowed' }}\n >\n <Checkbox\n checked={isVisible}\n onChange={(e) => onVisibilityChange(col.field, e.target.checked)}\n disabled={!isHideable}\n />\n <span className=\"ogx-column-visibility-panel__label\">\n {col.headerName || col.field}\n </span>\n </label>\n </div>\n );\n })}\n </div>\n\n <div className=\"ogx-column-visibility-panel__footer\">\n <label className=\"ogx-column-visibility-panel__item\">\n <Checkbox\n checked={allVisible}\n onChange={handleToggleAll}\n />\n <span className=\"ogx-column-visibility-panel__label\">\n Show/Hide All\n </span>\n </label>\n <button\n className=\"ogx-column-visibility-panel__reset-btn\"\n onClick={() => { onShowAll(); onColumnOrderReset?.(); }}\n >\n Reset\n </button>\n </div>\n </div>\n );\n}\n","import React, { useState, useLayoutEffect } from 'react';\nimport ReactDOM from 'react-dom';\nimport { ColumnVisibilityPanel } from '../ColumnVisibilityPanel/ColumnVisibilityPanel';\nimport type { GridColDef, GridRowModel, GridColumnOrderChangeParams } from '../../types';\n\nexport interface GridStandaloneColumnPanelProps<R extends GridRowModel> {\n isOpen: boolean;\n containerRef: React.RefObject<HTMLDivElement | null>;\n panelRef?: React.RefObject<HTMLDivElement | null>;\n effectiveColumns: GridColDef<R>[];\n columnVisibilityModel: Record<string, boolean>;\n effectiveColumnOrder: string[];\n columnOrder?: string[];\n disableColumnReorder: boolean;\n onClose: () => void;\n onColumnVisibilityChange: (model: Record<string, boolean>) => void;\n onColumnOrderChange?: (params: GridColumnOrderChangeParams) => void;\n setInternalColumnOrder: React.Dispatch<React.SetStateAction<string[]>>;\n}\n\nexport function GridStandaloneColumnPanel<R extends GridRowModel>({\n isOpen,\n containerRef,\n panelRef,\n effectiveColumns,\n columnVisibilityModel,\n effectiveColumnOrder,\n columnOrder,\n disableColumnReorder,\n onClose,\n onColumnVisibilityChange,\n onColumnOrderChange,\n setInternalColumnOrder,\n}: GridStandaloneColumnPanelProps<R>) {\n const [panelTop, setPanelTop] = useState<number>(16);\n const [panelRight, setPanelRight] = useState<number>(16);\n const [portalTarget, setPortalTarget] = useState<Element>(() => document.body);\n\n useLayoutEffect(() => {\n if (!isOpen || !containerRef.current) return;\n const rect = containerRef.current.getBoundingClientRect();\n setPanelTop(rect.top + 8);\n setPanelRight(window.innerWidth - rect.right + 8);\n setPortalTarget(containerRef.current.closest('.ogx-theme-provider') || document.body);\n }, [isOpen, containerRef]);\n\n if (!isOpen) return null;\n\n const handleReorder = disableColumnReorder\n ? undefined\n : (fromField: string, toField: string) => {\n const currentOrder = [...effectiveColumnOrder];\n const fromIdx = currentOrder.indexOf(fromField);\n const toIdx = currentOrder.indexOf(toField);\n if (fromIdx === -1 || toIdx === -1) return;\n const newOrder = [...currentOrder];\n newOrder.splice(fromIdx, 1);\n newOrder.splice(toIdx, 0, fromField);\n if (!columnOrder) setInternalColumnOrder(newOrder);\n onColumnOrderChange?.({\n oldIndex: fromIdx,\n targetIndex: toIdx,\n column: effectiveColumns.find(c => c.field === fromField) as unknown as GridColDef,\n });\n };\n\n return ReactDOM.createPortal(\n <div\n ref={panelRef}\n style={{\n position: 'fixed',\n top: panelTop,\n right: panelRight,\n zIndex: 9999,\n display: 'inline-block',\n }}\n >\n <button\n onClick={onClose}\n style={{\n position: 'absolute',\n top: -12,\n right: -12,\n width: 24,\n height: 24,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: '#334155',\n color: '#fff',\n border: 'none',\n borderRadius: '50%',\n cursor: 'pointer',\n fontSize: 14,\n lineHeight: 1,\n zIndex: 1,\n boxShadow: '0 1px 4px rgba(0,0,0,0.2)',\n }}\n aria-label=\"Close\"\n >×</button>\n <ColumnVisibilityPanel<R>\n columns={effectiveColumns}\n visibleColumns={new Set(\n effectiveColumns\n .filter(col => columnVisibilityModel[col.field] !== false)\n .map(col => col.field)\n )}\n onVisibilityChange={(field, isVisible) => {\n onColumnVisibilityChange({ ...columnVisibilityModel, [field]: isVisible });\n }}\n onShowAll={() => {\n const next = { ...columnVisibilityModel };\n effectiveColumns.forEach(col => { if (col.hideable !== false) next[col.field] = true; });\n onColumnVisibilityChange(next);\n }}\n onHideAll={() => {\n const next = { ...columnVisibilityModel };\n effectiveColumns.forEach(col => { if (col.hideable !== false) next[col.field] = false; });\n onColumnVisibilityChange(next);\n }}\n onColumnReorder={handleReorder}\n />\n </div>,\n portalTarget\n );\n}\n","import React, { useRef, useEffect, useCallback, useMemo, useState } from 'react';\nimport { useLayout } from '../../hooks/core/useLayout';\nimport { useGridKeyboardNavigation } from '../../hooks/core/useGridKeyboardNavigation';\nimport { useGridControlledState } from '../../hooks/core/useGridControlledState';\nimport { useGridRowPipeline } from '../../hooks/core/useGridRowPipeline';\nimport { useGridVirtualization } from '../../hooks/core/useGridVirtualization';\nimport { useGridColumns } from '../../hooks/core/useGridColumns';\nimport { useGridVisibleRows } from '../../hooks/core/useGridVisibleRows';\nimport { useGridScrollSync } from '../../hooks/core/useGridScrollSync';\nimport { useGridStateSnapshot } from '../../hooks/core/useGridStateSnapshot';\nimport { GridAggregationFooter } from './GridAggregationFooter';\nimport { GridEmptyState } from './GridEmptyState';\nimport { GridErrorOverlay } from './GridErrorOverlay';\nimport { Header } from '../Header/Header';\nimport { Pagination } from '../Pagination/Pagination';\nimport { useDataGrid } from '../../hooks/core/useDataGrid';\nimport { useRowReorder } from '../../hooks/useRowReorder';\nimport { useTreeData } from '../../hooks/useTreeData';\nimport { useRowGrouping } from '../../hooks/useRowGrouping';\nimport { useGridEditing } from '../../hooks/features/useGridEditing';\nimport { useGridSpanning } from '../../hooks/features/useGridSpanning';\nimport { useGridDataSource } from '../../hooks/features/useGridDataSource';\nimport { useAggregation } from '../../hooks/features/useAggregation';\nimport { usePivot } from '../../hooks/features/usePivot';\nimport { useGridClipboard } from '../../hooks/features/useGridClipboard';\nimport { GridListView } from './GridListView';\nimport { GridPinnedRows } from './GridPinnedRows';\nimport { GridVirtualRows } from './GridVirtualRows';\nimport { GridStandaloneColumnPanel } from './GridStandaloneColumnPanel';\nimport type { DataGridProps, GridRowModel, GridRowId, GridSortDirection, GridColDef, GridRowParams, GridCellParams, GridDataSource, GridAggregationResult, GridFilterModel, GridTreeNode, GridSortItem, GridRowMeta, GridGroupedExportRow } from '../../types';\n\nconst EMPTY_ROW_META_MAP: Map<GridRowId, GridRowMeta> = new Map();\n\nexport function DataGrid<R extends GridRowModel = GridRowModel>(props: DataGridProps<R>) {\n const {\n rows,\n columns,\n getRowId,\n rowHeight = 52,\n headerHeight = 56,\n autoHeight = false,\n density,\n checkboxSelection = false,\n disableRowSelectionOnClick = false,\n disableMultipleRowSelection = false,\n rowSelectionModel: propRowSelectionModel,\n onRowSelectionModelChange: propOnRowSelectionModelChange,\n onRowClick,\n onCellClick,\n\n filterModel: propFilterModel,\n onFilterModelChange,\n sortModel: propSortModel,\n onSortModelChange,\n pagination: propPagination = false,\n paginationModel,\n onPaginationModelChange,\n pageSizeOptions = [10, 25, 50, 100],\n pinnedColumns: propPinnedColumns,\n onPinnedColumnsChange,\n pinnedRows,\n\n getDetailPanelContent,\n getDetailPanelHeight,\n detailPanelExpandedRowIds: controlledExpandedRowIds,\n onDetailPanelExpandedRowIdsChange,\n pinCheckboxColumn = true,\n pinExpandColumn = true,\n disableColumnReorder = false,\n columnOrder,\n onColumnOrderChange,\n height,\n rowReordering = false,\n onRowOrderChange,\n loading = false,\n\n treeData = false,\n getTreeDataPath,\n defaultGroupingExpansionDepth,\n groupingColDef,\n\n rowGroupingModel: propRowGroupingModel,\n\n aggregationModel: propAggregationModel,\n onAggregationModelChange,\n getAggregationPosition,\n\n isCellEditable,\n processRowUpdate,\n onProcessRowUpdateError,\n\n dataSource,\n multiSort = false,\n sortingMode = 'client',\n filterMode = 'client',\n paginationMode = 'client',\n rowCount: propRowCount,\n\n slots,\n slotProps,\n\n pivotMode = false,\n pivotModel: propPivotModel,\n onPivotModelChange,\n\n className = '',\n style,\n onRowsScrollEnd,\n ariaLabel,\n initialState,\n onStateChange,\n // Column Visibility\n columnVisibilityModel: propColumnVisibilityModel,\n onColumnVisibilityModelChange,\n listView = false,\n listViewColumn,\n columnGroupingModel,\n noRowsLabel = 'No Data',\n localeText,\n apiRef: propApiRef,\n } = props;\n\n const effectiveNoRowsLabel = localeText?.noRowsLabel ?? noRowsLabel;\n\n // Stable defaults\n const defaultFilterModel: GridFilterModel = useMemo(() => ({ items: [] }), []);\n const filterModel = (propFilterModel || defaultFilterModel) as GridFilterModel;\n\n const defaultRowGroupingModel = useMemo(() => [], []);\n const rowGroupingModel = propRowGroupingModel || defaultRowGroupingModel;\n\n // ─── Stabilize toolbar component identity ────────────────────────────────\n // Problem: demos/users often define their toolbar as an inline function\n // INSIDE their component body, e.g.:\n // const MyToolbar = (props) => <GridToolbar {...props} /> // inside render!\n // This creates a NEW function reference on every parent re-render. React\n // reconciles by component *identity*, so a new reference = unmount old\n // toolbar + mount fresh one = all toolbar state (search expansion, filter\n // open, typed text) is destroyed on every keystroke.\n //\n // Fix: a stable wrapper component created ONCE via useRef. Its identity\n // never changes, so React keeps it mounted. It reads the latest toolbar\n // from a separate ref that is updated on every render, so the rendered\n // output is always current — zero stale closures.\n const latestToolbarRef = useRef(slots?.toolbar);\n latestToolbarRef.current = slots?.toolbar;\n // The wrapper itself has a stable identity (created once via useRef).\n // We call latestToolbarRef.current(props) as a PLAIN FUNCTION — not via\n // React.createElement — so React never sees a changing component type.\n // The elements the toolbar function returns are reconciled normally, so\n // GridToolbar's internal state (filterOpen, search expansion) is preserved\n // even when the toolbar is defined as an inline function inside the parent.\n const StableToolbar = useRef((props: Record<string, unknown>) => {\n const Toolbar = latestToolbarRef.current;\n return Toolbar ? (Toolbar as (p: typeof props) => React.ReactElement | null)(props) : null;\n }).current;\n\n const controlledState = useGridControlledState({\n initialState,\n sortModel: propSortModel,\n onSortModelChange,\n aggregationModel: propAggregationModel,\n onAggregationModelChange,\n columnVisibilityModel: propColumnVisibilityModel,\n onColumnVisibilityModelChange,\n pinnedColumns: propPinnedColumns,\n onPinnedColumnsChange,\n pivotModel: propPivotModel,\n onPivotModelChange,\n paginationModel,\n onPaginationModelChange,\n rowSelectionModel: propRowSelectionModel,\n onRowSelectionModelChange: propOnRowSelectionModelChange,\n });\n\n const {\n sortModel,\n isSortControlled,\n setInternalSortModel,\n aggregationModel,\n handleAggregationModelChange,\n columnVisibilityModel,\n handleColumnVisibilityModelChange,\n pinnedColumns,\n handlePinnedColumnsChange,\n currentPivotModel,\n handlePivotModelChange,\n effectivePaginationModel,\n handlePaginationModelChange,\n selectedRowIds,\n isSelectionControlled,\n setInternalRowSelectionModel,\n } = controlledState;\n\n const onRowSelectionModelChange = propOnRowSelectionModelChange;\n\n const pivot = usePivot(rows as GridRowModel[], columns as unknown as GridColDef[], currentPivotModel, pivotMode);\n\n const effectiveRowHeight = density === 'compact' ? 32 : density === 'comfortable' ? 72 : rowHeight;\n\n const activeRows = (pivotMode && pivot.isValid ? pivot.pivotRows : rows) as unknown as R[];\n const baseColumns = (pivotMode && pivot.isValid ? pivot.pivotColumns : columns) as unknown as GridColDef<R>[];\n\n // When groupingColDef is provided and row grouping is active, prepend a\n // dedicated synthetic __group__ column at position 0 (pinned-left).\n const isRowGroupingActive = Boolean(propRowGroupingModel && propRowGroupingModel.length > 0);\n\n // Auto-pin __group__ column to the left when groupingColDef is active.\n // Both values MUST be memoized: without useMemo they produce a new array/object\n // reference every render, which cascades through useRowGrouping's memos and\n // effects into an infinite setState loop (Maximum update depth exceeded).\n const effectivePinnedColumns = useMemo(() => (\n (groupingColDef && isRowGroupingActive && !pivotMode)\n ? { ...pinnedColumns, left: ['__group__', ...((pinnedColumns?.left ?? []).filter(f => f !== '__group__'))] }\n : pinnedColumns\n ), [groupingColDef, isRowGroupingActive, pivotMode, pinnedColumns]);\n\n const activeColumns = useMemo(() => (\n (groupingColDef && isRowGroupingActive && !pivotMode)\n ? [\n {\n headerName: 'Group',\n width: 220,\n ...groupingColDef,\n field: '__group__',\n hideable: false,\n sortable: false,\n pinnable: false,\n exportable: false,\n } as unknown as GridColDef<R>,\n ...baseColumns,\n ]\n : baseColumns\n ), [groupingColDef, isRowGroupingActive, pivotMode, baseColumns]);\n\n const [serverAggregationResults, setServerAggregationResults] = useState<GridAggregationResult | null>(null);\n\n useEffect(() => {\n setServerAggregationResults(null);\n }, [aggregationModel]);\n\n const viewportRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const gridRef = useRef<HTMLDivElement>(null);\n\n const defaultGetRowId = useCallback((row: R) => row.id, []);\n const effectiveGetRowId = getRowId || defaultGetRowId;\n\n // Normalize rows so every row has `id === getRowId(row)`.\n // createInitialState and SET_ROWS both key the internal store by row.id,\n // so rows without a native id field collide on undefined without this.\n // When getRowId is the default (row) => row.id this is a no-op per row.\n const normalizedRows = useMemo(\n () => activeRows.map(row => {\n const id = effectiveGetRowId(row);\n return id === row.id ? row : ({ ...row, id } as R);\n }),\n [activeRows, effectiveGetRowId]\n );\n\n // Keyboard-mode flag: toggled via DOM classname — no React state needed\n // so the ring appears instantly without a re-render cycle.\n const setKeyboardMode = useCallback((on: boolean) => {\n containerRef.current?.classList.toggle('ogx--kb', on);\n }, []);\n\n const dataSourceRef = useRef<GridDataSource<R> | undefined>(dataSource);\n dataSourceRef.current = dataSource;\n\n const fetchChildrenRef = useRef<((parentId: GridRowId, groupKeys: string[]) => Promise<void>) | null>(null);\n const treeDataRef = useRef<ReturnType<typeof useTreeData> | null>(null);\n\n const handleNodeExpansion = useCallback((node: GridTreeNode) => {\n if (dataSourceRef.current && treeData) {\n\n if ((node.serverChildrenCount ?? 0) > 0 && (node.children ?? []).length === 0) {\n\n const groupKeys = treeDataRef.current?.getNodePath(node.id) || [node.groupingKey];\n fetchChildrenRef.current?.(node.id, groupKeys);\n }\n }\n }, [treeData]);\n\n const gridData = useDataGrid({\n rows: normalizedRows,\n columns: activeColumns,\n rowHeight: effectiveRowHeight,\n headerHeight,\n rowCount: propRowCount,\n columnVisibilityModel,\n initialState: props.initialState\n });\n const {\n state,\n apiRef,\n setRows,\n setColumns,\n setDimensions,\n setDataSourceLoading,\n setDataSourceError,\n setRowCount\n } = gridData;\n\n const { scrollTop, scrollLeft, handleScroll } = useGridScrollSync({ onRowsScrollEnd });\n\n useEffect(() => {\n if (propApiRef) {\n propApiRef.current = apiRef.current;\n }\n }, [propApiRef, apiRef]);\n\n const { copySelectedRows } = useGridClipboard({\n selectedRowIds,\n columns: activeColumns as unknown as GridColDef[],\n getVisibleRows: () => apiRef.current.getVisibleRows(),\n getRowId: effectiveGetRowId as unknown as (row: GridRowModel) => GridRowId,\n });\n\n // Expose on apiRef for programmatic use\n useEffect(() => {\n apiRef.current.copySelectedRows = copySelectedRows;\n apiRef.current.getSelectedRows = () => Array.from(selectedRowIds);\n }, [copySelectedRows, selectedRowIds, apiRef]);\n\n const isInternalLoading = state.dataSource.loading;\n const effectiveLoading = loading || isInternalLoading;\n\n const effectiveRows = useMemo(() => {\n return state.rows.allRows.map(id => state.rows.idRowsLookup.get(id)!) as R[];\n }, [state.rows]);\n\n const treeDataHandlers = useTreeData({\n rows: effectiveRows,\n getRowId: effectiveGetRowId,\n getTreeDataPath,\n treeData,\n defaultGroupingExpansionDepth,\n filterModel,\n\n sortModel,\n onRowExpansionChange: handleNodeExpansion\n });\n\n useEffect(() => {\n treeDataRef.current = treeDataHandlers;\n }, [treeDataHandlers]);\n\n const rowGroupingHandlers = useRowGrouping({\n rows: effectiveRows,\n getRowId: effectiveGetRowId,\n columns: activeColumns,\n rowGroupingModel,\n aggregationModel,\n defaultGroupingExpansionDepth,\n filterModel,\n sortModel,\n getAggregationPosition\n });\n\n const editingHandlers = useGridEditing({\n rows: effectiveRows,\n getRowId: effectiveGetRowId,\n processRowUpdate,\n onProcessRowUpdateError,\n onRowChange: (updatedRow) => {\n // Dispatch a proper state update so React re-renders with the new row value\n const { dispatch } = gridData;\n const currentRows = Array.from(gridData.state.rows.idRowsLookup.values());\n const nextRows = currentRows.map(r =>\n r.id === updatedRow.id ? updatedRow : r\n );\n dispatch({ type: 'SET_ROWS', payload: nextRows });\n },\n });\n\n const isTreeData = treeData;\n const isRowGrouping = !!(rowGroupingModel && rowGroupingModel.length > 0);\n const isHierarchyEnabled = isTreeData || isRowGrouping;\n const activeHierarchyHandlers = isTreeData ? treeDataHandlers : (isRowGrouping ? rowGroupingHandlers : null);\n\n const rowMetaMap = useMemo<Map<GridRowId, GridRowMeta>>(() => {\n if (isTreeData) return treeDataHandlers.rowMetaMap;\n if (isRowGrouping) return rowGroupingHandlers.rowMetaMap;\n return EMPTY_ROW_META_MAP;\n }, [isTreeData, treeDataHandlers.rowMetaMap, isRowGrouping, rowGroupingHandlers.rowMetaMap]);\n\n const pagination = propPagination && !isRowGrouping;\n\n const handleRowClick = useCallback((params: GridRowParams<R>) => {\n const { row, id } = params;\n\n if (isHierarchyEnabled && rowMetaMap.get(row.id)?.hasChildren) {\n activeHierarchyHandlers?.toggleExpansion(id);\n return;\n }\n\n onRowClick?.(params);\n\n if (!disableRowSelectionOnClick) {\n let next: GridRowId[];\n if (disableMultipleRowSelection) {\n const alreadySelected = selectedRowIds.has(id as GridRowId);\n next = alreadySelected ? [] : [id as GridRowId];\n } else {\n const newSelection = new Set(selectedRowIds);\n if (newSelection.has(id as GridRowId)) {\n newSelection.delete(id as GridRowId);\n } else {\n newSelection.add(id as GridRowId);\n }\n next = Array.from(newSelection);\n }\n if (!isSelectionControlled) {\n setInternalRowSelectionModel(next);\n }\n onRowSelectionModelChange?.(next);\n }\n }, [isHierarchyEnabled, activeHierarchyHandlers, onRowClick, rowMetaMap, disableRowSelectionOnClick, disableMultipleRowSelection, selectedRowIds, isSelectionControlled, setInternalRowSelectionModel, onRowSelectionModelChange]);\n\n const dataSourceHandlers = useGridDataSource({\n dataSource,\n sortModel,\n filterModel,\n paginationModel: effectivePaginationModel,\n paginationMode,\n sortingMode,\n filterMode,\n aggregationModel,\n setRows,\n setRowCount,\n setDataSourceLoading,\n setDataSourceError,\n onAggregationResults: setServerAggregationResults,\n });\n\n useEffect(() => {\n if (dataSourceHandlers.fetchChildren) {\n fetchChildrenRef.current = dataSourceHandlers.fetchChildren;\n }\n }, [dataSourceHandlers.fetchChildren]);\n\n useEffect(() => {\n if (!dataSource) {\n setRows(normalizedRows);\n }\n }, [normalizedRows, setRows, dataSource]);\n\n // ── Detail panel (hoisted — hasDetailPanel feeds into useGridColumns) ──────\n const hasDetailPanel = Boolean(getDetailPanelContent);\n const [internalExpandedRowIds, setInternalExpandedRowIds] = useState<Set<GridRowId>>(new Set());\n const expandedRowIds = controlledExpandedRowIds ?? internalExpandedRowIds;\n\n const handleDetailPanelToggle = useCallback((rowId: GridRowId) => {\n const newExpandedRowIds = new Set(expandedRowIds);\n if (newExpandedRowIds.has(rowId)) {\n newExpandedRowIds.delete(rowId);\n } else {\n newExpandedRowIds.add(rowId);\n }\n if (controlledExpandedRowIds === undefined) {\n setInternalExpandedRowIds(newExpandedRowIds);\n }\n onDetailPanelExpandedRowIdsChange?.(newExpandedRowIds);\n }, [expandedRowIds, controlledExpandedRowIds, onDetailPanelExpandedRowIdsChange]);\n\n // ── Column management ─────────────────────────────────────────────────────\n const {\n effectiveColumns,\n orderedColumns,\n visibleOrderedColumns,\n navigationColumns,\n columnWidths,\n effectiveColumnOrder,\n setInternalColumnOrder,\n columnReorderHandlers,\n handleColumnResize,\n } = useGridColumns<R>({\n activeColumns,\n isHierarchyEnabled,\n isRowGrouping,\n isTreeData,\n activeHierarchyHandlers,\n columnVisibilityModel,\n columnOrder,\n onColumnOrderChange,\n disableColumnReorder,\n pivotMode,\n checkboxSelection,\n hasDetailPanel,\n rowReordering,\n initialState,\n setColumns,\n });\n\n useGridStateSnapshot({\n onStateChange,\n sortModel,\n filterModel,\n effectivePaginationModel,\n columnWidths,\n effectiveColumnOrder,\n columnVisibilityModel,\n pinnedColumns: effectivePinnedColumns,\n });\n\n const rowPipeline = useGridRowPipeline<GridRowModel>({\n effectiveRows: effectiveRows as GridRowModel[],\n activeHierarchyHandlers: activeHierarchyHandlers as { getVisibleRows: () => GridRowModel[] } | null,\n filterMode,\n filterModel,\n dataSource: dataSource as GridDataSource<GridRowModel> | undefined,\n sortModel,\n sortingMode,\n pagination,\n paginationMode,\n effectivePaginationModel,\n pinnedRows,\n isLoading: state.dataSource.loading,\n pageSize: effectivePaginationModel.pageSize,\n });\n const filteredRows = rowPipeline.filteredRows as R[];\n const pinnedTopRows = rowPipeline.pinnedTopRows as R[];\n const pinnedBottomRows = rowPipeline.pinnedBottomRows as R[];\n const sortedUnpinnedRows = rowPipeline.sortedUnpinnedRows as R[];\n const paginatedUnpinnedRows = rowPipeline.paginatedUnpinnedRows as R[];\n const allRenderableRows = rowPipeline.allRenderableRows as R[];\n\n useEffect(() => {\n gridData.apiRef.current.getVisibleRows = () => pagination ? paginatedUnpinnedRows : sortedUnpinnedRows;\n gridData.apiRef.current.getAllFilteredRows = () => sortedUnpinnedRows;\n gridData.apiRef.current.getVisibleColumns = () => effectiveColumns as unknown as GridColDef[];\n }, [sortedUnpinnedRows, paginatedUnpinnedRows, pagination, effectiveColumns, gridData.apiRef]);\n\n const rowReorderHandlers = useRowReorder({\n rows: pagination ? paginatedUnpinnedRows : sortedUnpinnedRows,\n getRowId: (row) => row.id,\n onRowOrderChange,\n rowReordering\n });\n\n const spanning = useGridSpanning(\n allRenderableRows,\n navigationColumns,\n columnWidths\n );\n\n const { aggregationResult } = useAggregation({\n rows: filteredRows,\n columns: activeColumns as unknown as GridColDef[],\n aggregationModel,\n isServerSide: !!(dataSource && (paginationMode === 'server' || sortingMode === 'server')),\n dataSource,\n filterModel,\n sortModel,\n serverAggregationResults,\n });\n\n const hasAggregation = Object.keys(aggregationModel).length > 0;\n\n useEffect(() => {\n gridData.apiRef.current.getAggregationResult = () => hasAggregation ? aggregationResult : null;\n gridData.apiRef.current.getAggregationModel = () => hasAggregation ? aggregationModel : null;\n gridData.apiRef.current.getGroupedExportRows = (): GridGroupedExportRow[] | null => {\n if (!isRowGrouping) return null;\n const { treeNodes, groupingRows } = rowGroupingHandlers;\n const rowLookup = new Map<GridRowId, GridRowModel>();\n sortedUnpinnedRows.forEach(r => rowLookup.set((r as GridRowModel).id as GridRowId, r as GridRowModel));\n\n const result: GridGroupedExportRow[] = [];\n\n const traverse = (ids: GridRowId[]) => {\n ids.forEach(id => {\n const node = treeNodes.get(id);\n if (!node) return;\n const isGroup = Boolean(node.children && node.children.length > 0);\n if (isGroup) {\n result.push({\n type: 'group-header',\n depth: node.depth,\n groupField: node.groupingField,\n groupValue: node.groupingValue,\n });\n traverse(node.children!);\n if (hasAggregation && node.aggregatedValues) {\n result.push({\n type: 'group-subtotal',\n depth: node.depth,\n groupField: node.groupingField,\n groupValue: node.groupingValue,\n aggregatedValues: node.aggregatedValues,\n });\n }\n } else {\n const row = rowLookup.get(id) ?? groupingRows.get(id);\n if (row) {\n result.push({ type: 'leaf', depth: node.depth, row });\n }\n }\n });\n };\n\n traverse(Array.from(treeNodes.keys()).filter(id => treeNodes.get(id)?.parentId === null));\n\n if (hasAggregation && aggregationResult) {\n result.push({ type: 'grand-total', depth: 0, aggregatedValues: aggregationResult });\n }\n return result;\n };\n }, [aggregationResult, aggregationModel, hasAggregation, gridData.apiRef, isRowGrouping, rowGroupingHandlers, sortedUnpinnedRows]);\n\n const layout = useLayout({\n rowHeight: effectiveRowHeight,\n pagination,\n paginatedUnpinnedRows,\n sortedUnpinnedRows,\n expandedRowIds,\n getDetailPanelHeight,\n pinnedTopRowsLength: pinnedTopRows.length,\n pinnedBottomRowsLength: pinnedBottomRows.length,\n visibleOrderedColumns,\n pinnedColumns: effectivePinnedColumns,\n columnWidths,\n viewportWidth: state.dimensions.viewportWidth || 1000,\n checkboxSelection,\n hasDetailPanel,\n rowReordering,\n pinCheckboxColumn,\n pinExpandColumn,\n autoHeight,\n paginationMode,\n isLoading: state.dataSource.loading,\n pageSize: effectivePaginationModel.pageSize,\n });\n\n // Merge layout-computed widths (which include flex resolution) with user-resize\n // overrides. The footer and other consumers that receive `columnWidths` only get\n // the resize-override map, which has no entry for flex columns that haven't been\n // manually resized — causing them to fall back to the raw `col.width` prop instead\n // of the actual rendered width.\n const resolvedColumnWidths = useMemo(() => {\n const result: Record<string, number> = {};\n for (const col of [...layout.leftPinnedCols, ...layout.unpinnedColsWithWidth, ...layout.rightPinnedCols]) {\n if (!col.isSpacer) result[col.field] = col.width;\n }\n return { ...result, ...columnWidths };\n }, [layout.leftPinnedCols, layout.unpinnedColsWithWidth, layout.rightPinnedCols, columnWidths]);\n\n useEffect(() => {\n gridData.apiRef.current.scrollToIndexes = ({ rowIndex, colIndex }) => {\n const el = viewportRef.current;\n if (!el) return;\n\n if (rowIndex !== undefined && rowIndex >= 0) {\n const rowTop = rowIndex > 0 ? layout.cumulativeHeights[rowIndex - 1] : 0;\n const rowBottom = layout.cumulativeHeights[rowIndex] ?? rowTop;\n const { scrollTop, clientHeight } = el;\n if (rowTop < scrollTop) {\n el.scrollTop = rowTop;\n } else if (rowBottom > scrollTop + clientHeight) {\n el.scrollTop = rowBottom - clientHeight;\n }\n }\n\n if (colIndex !== undefined && colIndex >= 0) {\n // colIndex is an index into all data columns: leftPinned + unpinned + rightPinned\n const allDataCols = [...layout.leftPinnedCols, ...layout.unpinnedColsWithWidth, ...layout.rightPinnedCols];\n const targetCol = allDataCols[colIndex];\n if (!targetCol) return;\n const unpinnedIndex = layout.unpinnedColsWithWidth.findIndex(c => c.field === targetCol.field);\n if (unpinnedIndex === -1) return; // pinned column — always visible, no scroll needed\n const colLocalLeft = unpinnedIndex > 0 ? layout.unpinnedAccWidths[unpinnedIndex - 1] : 0;\n const colLocalRight = layout.unpinnedAccWidths[unpinnedIndex] ?? colLocalLeft;\n const colRight = layout.leftWidth + colLocalRight;\n const { scrollLeft, clientWidth } = el;\n if (colLocalLeft < scrollLeft) {\n el.scrollLeft = colLocalLeft;\n } else if (colRight > scrollLeft + clientWidth) {\n el.scrollLeft = colRight - clientWidth;\n }\n }\n };\n }, [layout, viewportRef, gridData.apiRef]);\n\n const virtualization = useGridVirtualization({\n layout,\n scrollTop,\n scrollLeft,\n viewportWidth: state.dimensions.viewportWidth,\n viewportHeight: state.dimensions.viewportHeight,\n autoHeight,\n rowReordering,\n hasDetailPanel,\n checkboxSelection,\n pinCheckboxColumn,\n pinExpandColumn,\n });\n\n\n useEffect(() => {\n if (!viewportRef.current) return;\n\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect;\n setDimensions(width, height);\n }\n });\n\n resizeObserver.observe(viewportRef.current);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [setDimensions]);\n\n const handleSelectionChange = useCallback((rowId: GridRowId, isSelected: boolean) => {\n const newSelection = new Set(selectedRowIds);\n if (isSelected) {\n newSelection.add(rowId);\n } else {\n newSelection.delete(rowId);\n }\n const newSelectionArray = Array.from(newSelection);\n\n if (!isSelectionControlled) {\n setInternalRowSelectionModel(newSelectionArray);\n }\n onRowSelectionModelChange?.(newSelectionArray);\n }, [selectedRowIds, isSelectionControlled, onRowSelectionModelChange, setInternalRowSelectionModel]);\n\n const handleSelectAll = useCallback((isSelected: boolean) => {\n let newSelection: GridRowId[] = [];\n if (isSelected) {\n newSelection = effectiveRows.map((row: GridRowModel) => row.id);\n }\n\n if (!isSelectionControlled) {\n setInternalRowSelectionModel(newSelection);\n }\n onRowSelectionModelChange?.(newSelection);\n }, [effectiveRows, isSelectionControlled, onRowSelectionModelChange, setInternalRowSelectionModel]);\n\n const handleSort = useCallback((field: string, direction: GridSortDirection) => {\n const newSortModel = direction ? [{ field, sort: direction }] : [];\n\n if (!isSortControlled) {\n setInternalSortModel(newSortModel as GridSortItem[]);\n }\n onSortModelChange?.(newSortModel as GridSortItem[]);\n }, [isSortControlled, onSortModelChange, setInternalSortModel]);\n\n const handleSortAdd = useCallback((field: string, direction: GridSortDirection) => {\n const existing = sortModel.filter(item => item.field !== field);\n const newSortModel: GridSortItem[] = direction\n ? [...existing, { field, sort: direction }]\n : existing;\n\n if (!isSortControlled) {\n setInternalSortModel(newSortModel);\n }\n onSortModelChange?.(newSortModel);\n }, [sortModel, isSortControlled, onSortModelChange, setInternalSortModel]);\n\n const { focusedCell, setFocusedCell, handleFocus, handleBlur, handleKeyDown } = useGridKeyboardNavigation({\n allRenderableRows,\n navigationColumns,\n checkboxSelection,\n selectedRowIds,\n handleSelectionChange,\n handleDetailPanelToggle,\n editingHandlers,\n setKeyboardMode,\n sortModel,\n handleSort,\n isCellEditable,\n pagination,\n pageSize: effectivePaginationModel.pageSize,\n virtualization,\n viewportRef,\n });\n\n const handleCellClick = useCallback((params: GridCellParams<R>) => {\n setKeyboardMode(false);\n setFocusedCell({ id: params.row.id, field: params.field });\n\n gridRef.current?.focus({ preventScroll: true });\n onCellClick?.(params);\n }, [onCellClick, setKeyboardMode, setFocusedCell]);\n\n const prevEditingCellRef = useRef(editingHandlers.editingCell);\n useEffect(() => {\n const wasEditing = Boolean(prevEditingCellRef.current);\n const isEditing = Boolean(editingHandlers.editingCell);\n\n if (wasEditing && !isEditing) {\n\n gridRef.current?.focus({ preventScroll: true });\n }\n\n prevEditingCellRef.current = editingHandlers.editingCell;\n }, [editingHandlers.editingCell]);\n\n const visibleRows = useGridVisibleRows<R>({\n renderContext: virtualization.renderContext,\n pinnedTopRows,\n pinnedBottomRows,\n paginatedUnpinnedRows,\n sortedUnpinnedRows,\n pagination,\n });\n\n\n const allSelected = rows.length > 0 && selectedRowIds.size === rows.length;\n const someSelected = selectedRowIds.size > 0 && selectedRowIds.size < rows.length;\n\n const hasRowSpanning = React.useMemo(() => effectiveColumns.some(c => !!c.rowSpan), [effectiveColumns]);\n const [columnsPanelOpen, setColumnsPanelOpen] = React.useState(false);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const standalonePanelRef = React.useRef<HTMLDivElement>(null);\n\n const toolbarProps = React.useMemo(() => {\n if (!slots?.toolbar) return null;\n const reorderHandler = disableColumnReorder\n ? undefined\n : (fromField: string, toField: string) => {\n const currentOrder = [...effectiveColumnOrder];\n const fromIdx = currentOrder.indexOf(fromField);\n const toIdx = currentOrder.indexOf(toField);\n if (fromIdx === -1 || toIdx === -1) return;\n const newOrder = [...currentOrder];\n newOrder.splice(fromIdx, 1);\n newOrder.splice(toIdx, 0, fromField);\n if (!columnOrder) setInternalColumnOrder(newOrder);\n const col = effectiveColumns.find(c => c.field === fromField);\n if (col) onColumnOrderChange?.({ oldIndex: fromIdx, targetIndex: toIdx, column: col as unknown as GridColDef });\n };\n return {\n apiRef: gridData.apiRef,\n columns: orderedColumns as unknown as GridColDef[],\n baseColumns: columns as unknown as GridColDef[],\n aggregationModel,\n onAggregationModelChange: handleAggregationModelChange,\n ...(pivotMode || propPivotModel || onPivotModelChange ? {\n pivotModel: currentPivotModel,\n onPivotModelChange: handlePivotModelChange,\n } : {}),\n filterModel,\n onFilterModelChange,\n columnVisibilityModel,\n onColumnVisibilityModelChange: handleColumnVisibilityModelChange,\n onColumnReorder: reorderHandler,\n onColumnOrderReset: disableColumnReorder ? undefined : () => setInternalColumnOrder(columns.map(c => c.field)),\n forceColumnsOpen: columnsPanelOpen,\n onColumnsPanelClose: () => setColumnsPanelOpen(false),\n ...slotProps?.toolbar,\n };\n }, [\n slots?.toolbar, disableColumnReorder, effectiveColumnOrder, orderedColumns, effectiveColumns,\n columnOrder, onColumnOrderChange, setInternalColumnOrder, gridData.apiRef,\n columns, aggregationModel, handleAggregationModelChange, pivotMode,\n propPivotModel, onPivotModelChange, currentPivotModel, handlePivotModelChange,\n filterModel, onFilterModelChange, columnVisibilityModel,\n handleColumnVisibilityModelChange, columnsPanelOpen, slotProps?.toolbar,\n ]);\n\n // Click-outside handler for standalone column panel\n useEffect(() => {\n if (!columnsPanelOpen || slots?.toolbar) return;\n function handleClickOutside(e: MouseEvent) {\n if (standalonePanelRef.current && !standalonePanelRef.current.contains(e.target as Node)) {\n setColumnsPanelOpen(false);\n }\n }\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [columnsPanelOpen, slots?.toolbar]);\n\n return (\n <div\n ref={containerRef}\n className={['ogx', className, autoHeight && 'ogx--auto-height', hasRowSpanning && 'ogx--row-spanning', listView && 'ogx--list-view'].filter(Boolean).join(' ')}\n style={{\n ...style,\n height: height ?? style?.height,\n '--ogx-row-height': `${effectiveRowHeight}px`,\n '--ogx-header-height': `${headerHeight}px`\n } as unknown as React.CSSProperties}\n aria-busy={effectiveLoading}\n >\n {toolbarProps && <StableToolbar {...toolbarProps} />}\n\n {!slots?.toolbar && (\n <GridStandaloneColumnPanel<R>\n isOpen={columnsPanelOpen}\n containerRef={containerRef}\n panelRef={standalonePanelRef}\n effectiveColumns={effectiveColumns}\n columnVisibilityModel={columnVisibilityModel}\n effectiveColumnOrder={effectiveColumnOrder}\n columnOrder={columnOrder}\n disableColumnReorder={disableColumnReorder}\n onClose={() => setColumnsPanelOpen(false)}\n onColumnVisibilityChange={handleColumnVisibilityModelChange}\n onColumnOrderChange={onColumnOrderChange}\n setInternalColumnOrder={setInternalColumnOrder}\n />\n )}\n\n {listView && listViewColumn && (\n <GridListView<R>\n ariaLabel={ariaLabel}\n allRenderableRows={allRenderableRows}\n filteredRows={filteredRows}\n pagination={pagination}\n effectivePaginationModel={effectivePaginationModel}\n pageSizeOptions={pageSizeOptions}\n selectedRowIds={selectedRowIds}\n listViewColumn={listViewColumn}\n noRowsLabel={effectiveNoRowsLabel}\n rowHeight={effectiveRowHeight}\n checkboxSelection={checkboxSelection}\n paginationMode={paginationMode}\n dataSource={dataSource}\n serverRowCount={state.pagination.rowCount || 0}\n paginationSlot={slots?.pagination}\n paginationSlotProps={slotProps?.pagination}\n localeText={localeText ? {\n paginationRowsPerPage: localeText.paginationRowsPerPage,\n paginationOf: localeText.paginationOf,\n paginationPage: localeText.paginationPage,\n } : undefined}\n onRowClick={handleRowClick}\n onSelectionChange={handleSelectionChange}\n onPaginationModelChange={handlePaginationModelChange}\n />\n )}\n\n {/* ══════════════════════════════════════════════════════════════\n STANDARD GRID VIEWPORT (hidden when listView=true)\n ══════════════════════════════════════════════════════════════ */}\n {!listView && (\n <div\n ref={(el) => {\n viewportRef.current = el;\n gridRef.current = el;\n }}\n className=\"ogx__viewport\"\n onScroll={handleScroll}\n role=\"grid\"\n aria-label={ariaLabel || 'Data grid'}\n aria-rowcount={filteredRows.length + 1}\n aria-colcount={\n columns.length +\n (checkboxSelection ? 1 : 0) +\n (hasDetailPanel ? 1 : 0) +\n (rowReordering ? 1 : 0)\n }\n aria-busy={effectiveLoading}\n tabIndex={0}\n onKeyDownCapture={() => { setKeyboardMode(true); }}\n onMouseDownCapture={() => { setKeyboardMode(false); }}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n >\n <div\n ref={contentRef}\n className=\"ogx__content\"\n style={{\n width: virtualization.totalWidth\n }}\n role=\"presentation\"\n >\n { }\n <Header\n columns={virtualization.virtualColumns}\n allColumns={effectiveColumns}\n columnGroupingModel={columnGroupingModel}\n checkboxSelection={checkboxSelection}\n allSelected={allSelected}\n someSelected={someSelected}\n onSelectAll={handleSelectAll}\n sortModel={sortModel}\n onSort={handleSort}\n onSortAdd={handleSortAdd}\n multiSort={multiSort}\n\n onColumnResize={handleColumnResize}\n columnWidths={columnWidths}\n pinnedColumns={effectivePinnedColumns}\n\n focusedCell={focusedCell}\n onHeaderClick={(field) => {\n setFocusedCell({ id: 'HEADER', field });\n setKeyboardMode(false);\n gridRef.current?.focus({ preventScroll: true });\n }}\n onDragStart={columnGroupingModel ? undefined : columnReorderHandlers.onDragStart}\n onDragOver={columnGroupingModel ? undefined : columnReorderHandlers.onDragOver}\n onDragEnd={columnGroupingModel ? undefined : columnReorderHandlers.onDragEnd}\n onDrop={columnGroupingModel ? undefined : columnReorderHandlers.onDrop}\n draggedColumn={columnGroupingModel ? undefined : columnReorderHandlers.draggedColumn}\n dragOverColumn={columnGroupingModel ? undefined : columnReorderHandlers.dragOverColumn}\n rowReordering={rowReordering}\n hasDetailPanel={hasDetailPanel}\n pinCheckboxColumn={pinCheckboxColumn}\n pinExpandColumn={pinExpandColumn}\n aggregationModel={aggregationModel}\n onHideColumn={(field) => {\n handleColumnVisibilityModelChange({\n ...columnVisibilityModel,\n [field]: false,\n });\n }}\n onManageColumns={() => setColumnsPanelOpen(true)}\n onPinColumn={(field, side) => {\n const left = [...(pinnedColumns?.left ?? [])];\n const right = [...(pinnedColumns?.right ?? [])];\n\n const cleanLeft = left.filter(f => f !== field);\n const cleanRight = right.filter(f => f !== field);\n if (side === 'left') {\n handlePinnedColumnsChange({ left: [...cleanLeft, field], right: cleanRight });\n } else if (side === 'right') {\n handlePinnedColumnsChange({ left: cleanLeft, right: [...cleanRight, field] });\n } else {\n handlePinnedColumnsChange({ left: cleanLeft, right: cleanRight });\n }\n }}\n />\n\n {/* Empty State Overlay (Standard View) — showing after header */}\n {!effectiveLoading && !state.dataSource.error && filteredRows.length === 0 && (\n <GridEmptyState noRowsLabel={effectiveNoRowsLabel} width={virtualization.totalWidth} />\n )}\n\n <GridPinnedRows<R>\n rows={pinnedTopRows}\n position=\"top\"\n columns={virtualization.virtualColumns}\n selectedRowIds={selectedRowIds}\n checkboxSelection={checkboxSelection}\n onRowClick={handleRowClick}\n onCellClick={handleCellClick}\n onSelectionChange={handleSelectionChange}\n columnWidths={columnWidths}\n pinnedColumns={effectivePinnedColumns}\n pinnedRows={pinnedRows}\n hasDetailPanel={hasDetailPanel}\n expandedRowIds={expandedRowIds}\n getDetailPanelContent={getDetailPanelContent}\n getDetailPanelHeight={getDetailPanelHeight}\n onDetailPanelToggle={handleDetailPanelToggle}\n pinCheckboxColumn={pinCheckboxColumn}\n pinExpandColumn={pinExpandColumn}\n focusedCell={focusedCell}\n colspanMap={spanning.colspanMap}\n rowSpanningCaches={spanning.rowSpanningState.caches}\n rowHeight={effectiveRowHeight}\n rowMetaMap={rowMetaMap}\n />\n\n <GridVirtualRows<R>\n virtualContainerHeight={virtualization.totalHeight - virtualization.pinnedTopHeight - virtualization.pinnedBottomHeight}\n offsetTop={virtualization.offsetTop}\n effectiveLoading={effectiveLoading}\n visibleRows={visibleRows}\n baseColumns={columns as unknown as GridColDef<R>[]}\n virtualColumns={virtualization.virtualColumns}\n viewportWidth={state.dimensions.viewportWidth}\n checkboxSelection={checkboxSelection}\n hasDetailPanel={hasDetailPanel}\n rowReordering={rowReordering}\n rowHeight={effectiveRowHeight}\n pinnedRows={pinnedRows}\n selectedRowIds={selectedRowIds}\n onRowClick={handleRowClick}\n onCellClick={handleCellClick}\n onSelectionChange={handleSelectionChange}\n columnWidths={columnWidths}\n pinnedColumns={effectivePinnedColumns}\n expandedRowIds={expandedRowIds}\n getDetailPanelContent={getDetailPanelContent}\n getDetailPanelHeight={getDetailPanelHeight}\n onDetailPanelToggle={handleDetailPanelToggle}\n pinCheckboxColumn={pinCheckboxColumn}\n pinExpandColumn={pinExpandColumn}\n rowReorderHandlers={rowReorderHandlers}\n editingHandlers={editingHandlers}\n focusedCell={focusedCell}\n colspanMap={spanning.colspanMap}\n rowSpanningCaches={spanning.rowSpanningState.caches}\n paginationMode={paginationMode}\n dataSourceLoading={state.dataSource.loading}\n sortedUnpinnedRowCount={sortedUnpinnedRows.length}\n infiniteScrollSkeletonCount={Math.min(effectivePaginationModel.pageSize, 20)}\n unpinnedRowsLength={layout.unpinnedRowsLength}\n rowMetaMap={rowMetaMap}\n />\n\n <GridPinnedRows<R>\n rows={pinnedBottomRows}\n position=\"bottom\"\n columns={virtualization.virtualColumns}\n selectedRowIds={selectedRowIds}\n checkboxSelection={checkboxSelection}\n onRowClick={handleRowClick}\n onCellClick={handleCellClick}\n onSelectionChange={handleSelectionChange}\n columnWidths={columnWidths}\n pinnedColumns={effectivePinnedColumns}\n pinnedRows={pinnedRows}\n hasDetailPanel={hasDetailPanel}\n expandedRowIds={expandedRowIds}\n getDetailPanelContent={getDetailPanelContent}\n getDetailPanelHeight={getDetailPanelHeight}\n onDetailPanelToggle={handleDetailPanelToggle}\n pinCheckboxColumn={pinCheckboxColumn}\n pinExpandColumn={pinExpandColumn}\n focusedCell={focusedCell}\n colspanMap={spanning.colspanMap}\n rowSpanningCaches={spanning.rowSpanningState.caches}\n rowHeight={effectiveRowHeight}\n rowMetaMap={rowMetaMap}\n />\n\n {/* Aggregation Footer Row — suppressed in pivot mode because pivot rows\n already contain pre-aggregated values with synthetic field keys\n (e.g. 'Q1\\u001frevenue\\u001fsum') that don't match aggregationModel keys. */}\n {hasAggregation && !pivotMode && (\n <GridAggregationFooter\n columns={orderedColumns as unknown as GridColDef[]}\n aggregationModel={aggregationModel}\n aggregationResult={aggregationResult}\n columnWidths={resolvedColumnWidths}\n rowHeight={effectiveRowHeight}\n checkboxSelection={checkboxSelection}\n hasDetailPanel={hasDetailPanel}\n rowReordering={rowReordering}\n pinnedColumns={effectivePinnedColumns}\n />\n )}\n\n </div>\n </div>\n )}\n\n {!listView && pagination && (() => {\n const PaginationComponent = slots?.pagination || Pagination;\n return (\n <PaginationComponent\n page={effectivePaginationModel.page}\n pageSize={effectivePaginationModel.pageSize}\n rowCount={state.pagination.rowCount}\n pageSizeOptions={pageSizeOptions}\n onPageChange={(newPage: number) => handlePaginationModelChange({ ...effectivePaginationModel, page: newPage })}\n onPageSizeChange={(newPageSize: number) => handlePaginationModelChange({ ...effectivePaginationModel, pageSize: newPageSize, page: 0 })}\n localeText={localeText ? {\n paginationRowsPerPage: localeText.paginationRowsPerPage,\n paginationOf: localeText.paginationOf,\n paginationPage: localeText.paginationPage,\n } : undefined}\n {...slotProps?.pagination}\n />\n );\n })()}\n\n {/* Accessibility Live Region */}\n <div className=\"ogx-aria-live-status\" role=\"status\" aria-live=\"polite\">\n {effectiveLoading ? 'Loading data...' : ''}\n {state.dataSource.error ? `Error: ${state.dataSource.error instanceof Error ? state.dataSource.error.message : 'Unknown error'}` : ''}\n {!loading && !state.dataSource.error && (\n filteredRows.length === 0\n ? effectiveNoRowsLabel\n : (filterModel && ((filterModel.quickFilterValues?.length || 0) > 0 || (filterModel.items?.length || 0) > 0))\n ? `${filteredRows.length} ${filteredRows.length === 1 ? 'row' : 'rows'} found`\n : ''\n )}\n </div>\n\n <GridErrorOverlay error={state.dataSource.error} />\n </div>\n );\n}\n","\n\nexport interface SkeletonProps {\n rows?: number;\n columns?: number;\n}\n\nexport function Skeleton({ rows = 5, columns = 5 }: SkeletonProps) {\n return (\n <div className=\"ogx__skeleton\">\n {Array.from({ length: rows }).map((_, rowIndex) => (\n <div key={rowIndex} className=\"ogx__skeleton-row\">\n {Array.from({ length: columns }).map((_, colIndex) => (\n <div key={colIndex} className=\"ogx__skeleton-cell\">\n <div className=\"ogx__skeleton-content\" />\n </div>\n ))}\n </div>\n ))}\n </div>\n );\n}\n","import React, { useCallback, useEffect, useId, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport type {\n GridFilterModel,\n GridFilterItem,\n GridColDef,\n GridFilterOperator\n} from '../../types';\nimport { getOperatorsForType } from '../../utils/filtering';\n\n\ninterface FilterPanelProps {\n filterModel: GridFilterModel;\n columns: GridColDef[];\n onFilterModelChange: (model: GridFilterModel) => void;\n}\n\nconst NO_VALUE_OPERATORS = new Set(['isEmpty', 'isNotEmpty']);\n\nfunction getActiveFilter(items: GridFilterItem[], field: string): GridFilterItem | undefined {\n return items.find(item => 'field' in item && item.field === field) as GridFilterItem | undefined;\n}\n\nconst FilterRow: React.FC<{\n col: GridColDef;\n item: GridFilterItem | undefined;\n onChange: (item: GridFilterItem | null) => void;\n}> = ({ col, item, onChange }) => {\n const filterId = useId();\n const operators = getOperatorsForType(col.type);\n const isActive = !!item;\n const currentOperator = item?.operator ?? operators[0];\n\n // Local input state to prevent full filter-panel re-render on every keystroke\n const [localValue, setLocalValue] = useState<string>(item?.value != null ? String(item.value) : '');\n const onChangeRef = useRef(onChange);\n const itemRef = useRef(item);\n const colFieldRef = useRef(col.field);\n const operatorRef = useRef(currentOperator);\n useLayoutEffect(() => {\n onChangeRef.current = onChange;\n itemRef.current = item;\n colFieldRef.current = col.field;\n operatorRef.current = currentOperator;\n });\n\n // Sync when the external item changes (e.g. operator change, clear)\n const prevItemValue = useRef(item?.value);\n useEffect(() => {\n if (item?.value !== prevItemValue.current) {\n prevItemValue.current = item?.value;\n setLocalValue(item?.value != null ? String(item.value) : '');\n }\n }, [item?.value]);\n\n // Debounce propagating the value upward (300ms)\n useEffect(() => {\n const handler = setTimeout(() => {\n const currentItem = itemRef.current;\n const currentValue = currentItem?.value ?? '';\n if (localValue !== currentValue) {\n onChangeRef.current({\n id: currentItem?.id ?? `${colFieldRef.current}-${Date.now()}`,\n field: colFieldRef.current,\n operator: operatorRef.current as GridFilterOperator,\n value: localValue,\n });\n }\n }, 300);\n return () => clearTimeout(handler);\n }, [localValue]);\n\n const handleOperatorChange = (op: string) => {\n const noValue = NO_VALUE_OPERATORS.has(op);\n const newItem: GridFilterItem = {\n id: item?.id ?? `${col.field}-${Date.now()}`,\n field: col.field,\n operator: op as GridFilterOperator,\n value: noValue ? undefined : (item?.value ?? (col.type === 'boolean' ? 'true' : '')),\n };\n onChange(newItem);\n };\n\n const handleClear = () => {\n setLocalValue('');\n onChange(null);\n };\n\n const isNoValue = NO_VALUE_OPERATORS.has(String(currentOperator));\n const isBoolean = col.type === 'boolean';\n const showValue = !isNoValue;\n\n return (\n <div className={`ogx-filter__row${isActive ? ' ogx-filter__row--active' : ''}`}>\n { }\n <span className=\"ogx-filter__col-label\" title={col.field}>\n {col.headerName || col.field}\n </span>\n\n { }\n <div className=\"ogx-filter__controls\">\n { }\n <select\n id={`${filterId}-op`}\n name={`filter-op-${col.field}`}\n className={`ogx-filter__op-select${isActive ? ' ogx-filter__op-select--active' : ''}`}\n value={String(currentOperator)}\n onChange={(e) => handleOperatorChange(e.target.value)}\n aria-label={`Filter operator for ${col.headerName || col.field}`}\n >\n {operators.map(op => (\n <option key={op} value={op}>{op}</option>\n ))}\n </select>\n\n { }\n {showValue && isBoolean && (\n <select\n id={`${filterId}-val`}\n name={`filter-val-${col.field}`}\n className={`ogx-filter__value-input ogx-filter__value-select${isActive ? ' ogx-filter__value-input--active' : ''}`}\n value={String(item?.value ?? 'true')}\n onChange={(e) => {\n setLocalValue(e.target.value);\n onChange({\n id: item?.id ?? `${col.field}-${Date.now()}`,\n field: col.field,\n operator: currentOperator as GridFilterOperator,\n value: e.target.value,\n });\n }}\n aria-label={`Filter value for ${col.headerName || col.field}`}\n >\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n )}\n\n {showValue && !isBoolean && (\n <input\n id={`${filterId}-val`}\n name={`filter-val-${col.field}`}\n className={`ogx-filter__value-input${isActive ? ' ogx-filter__value-input--active' : ''}`}\n type=\"text\"\n value={localValue}\n onChange={(e) => setLocalValue(e.target.value)}\n placeholder={col.type === 'number' ? 'Number…' : 'Value…'}\n aria-label={`Filter value for ${col.headerName || col.field}`}\n />\n )}\n\n {/* Clear button — only when active */}\n {isActive && (\n <button\n className=\"ogx-filter__row-clear\"\n onClick={handleClear}\n aria-label={`Clear filter for ${col.headerName || col.field}`}\n title=\"Clear\"\n >\n ×\n </button>\n )}\n </div>\n </div>\n );\n};\n\n// ── Root panel ────────────────────────────────────────────────────────────────\n\nexport const FilterPanel: React.FC<FilterPanelProps> = ({ filterModel, columns, onFilterModelChange }) => {\n const items = useMemo<GridFilterItem[]>(() => (filterModel.items ?? []) as GridFilterItem[], [filterModel.items]);\n const logicOperator = filterModel.logicOperator ?? 'and';\n\n const handleItemChange = useCallback((field: string, newItem: GridFilterItem | null) => {\n const rest = items.filter(i => 'field' in i && (i as GridFilterItem).field !== field);\n const next: GridFilterItem[] = newItem ? [...rest, newItem] : rest;\n onFilterModelChange({ ...filterModel, items: next });\n }, [items, filterModel, onFilterModelChange]);\n\n const handleLogicChange = useCallback((op: 'and' | 'or') => {\n onFilterModelChange({ ...filterModel, logicOperator: op });\n }, [filterModel, onFilterModelChange]);\n\n const filterableColumns = columns.filter(col => col.filterable !== false);\n\n return (\n <>\n { }\n {items.length > 1 && (\n <div className=\"ogx-filter__logic-bar\">\n <span className=\"ogx-filter__logic-label\">Match:</span>\n <button\n className={`ogx-filter__logic-pill${logicOperator === 'and' ? ' ogx-filter__logic-pill--active' : ''}`}\n onClick={() => handleLogicChange('and')}\n aria-pressed={logicOperator === 'and'}\n >\n ALL (AND)\n </button>\n <button\n className={`ogx-filter__logic-pill${logicOperator === 'or' ? ' ogx-filter__logic-pill--active' : ''}`}\n onClick={() => handleLogicChange('or')}\n aria-pressed={logicOperator === 'or'}\n >\n ANY (OR)\n </button>\n </div>\n )}\n\n { }\n {filterableColumns.length === 0 ? (\n <div className=\"ogx-filter__empty\">No filterable columns.</div>\n ) : (\n filterableColumns.map(col => (\n <FilterRow\n key={col.field}\n col={col}\n item={getActiveFilter(items, col.field)}\n onChange={(item) => handleItemChange(col.field, item)}\n />\n ))\n )}\n </>\n );\n};\n","import React, { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport ReactDOM from 'react-dom';\nimport type { GridColDef } from '../../types';\nimport type { GridPivotModel, GridPivotAggFn, GridPivotValueField } from '../../types';\n\nconst AGG_FNS: GridPivotAggFn[] = ['sum', 'avg', 'count', 'min', 'max'];\n\nexport function PivotIcon() {\n return (\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" fill=\"currentColor\" opacity=\"0.25\" />\n <path d=\"M17 14v-4M17 10l-2 2 2 2\" />\n </svg>\n );\n}\n\nexport interface PivotPanelProps {\n anchorRef: React.RefObject<HTMLButtonElement | null>;\n columns: GridColDef[];\n model: GridPivotModel;\n onChange: (model: GridPivotModel) => void;\n onClose: () => void;\n}\n\nexport function PivotPanel({ anchorRef, columns, model, onChange, onClose }: PivotPanelProps) {\n const panelRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState({ top: 0, right: 0 });\n const [portalContainer, setPortalContainer] = useState<Element>(document.body);\n\n useLayoutEffect(() => {\n setPortalContainer(anchorRef.current?.closest('.ogx-theme-provider') ?? document.body);\n }, [anchorRef]);\n\n const computePos = useCallback(() => {\n if (!anchorRef.current) return { top: 0, right: 0 };\n const rect = anchorRef.current.getBoundingClientRect();\n return { top: rect.bottom + 6, right: window.innerWidth - rect.right };\n }, [anchorRef]);\n\n useEffect(() => {\n setPos(computePos());\n const update = () => setPos(computePos());\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n return () => {\n window.removeEventListener('scroll', update, true);\n window.removeEventListener('resize', update);\n };\n }, [computePos]);\n\n useEffect(() => {\n function onClick(e: MouseEvent) {\n if (\n panelRef.current && !panelRef.current.contains(e.target as Node) &&\n anchorRef.current && !anchorRef.current.contains(e.target as Node)\n ) onClose();\n }\n function onKey(e: KeyboardEvent) { if (e.key === 'Escape') onClose(); }\n document.addEventListener('mousedown', onClick);\n document.addEventListener('keydown', onKey);\n return () => {\n document.removeEventListener('mousedown', onClick);\n document.removeEventListener('keydown', onKey);\n };\n }, [anchorRef, onClose]);\n\n const inRow = new Set(model.rowFields);\n const inCol = new Set(model.columnFields);\n const inValue = new Set(model.valueFields.map((v) => v.field));\n const isUsed = (f: string) => inRow.has(f) || inCol.has(f) || inValue.has(f);\n\n function addRow(field: string) {\n if (inRow.has(field)) return;\n onChange({ ...model, rowFields: [...model.rowFields, field] });\n }\n function addCol(field: string) {\n if (inCol.has(field)) return;\n onChange({ ...model, columnFields: [...model.columnFields, field] });\n }\n function addValue(field: string, aggFn: GridPivotAggFn = 'sum') {\n if (inValue.has(field)) return;\n onChange({ ...model, valueFields: [...model.valueFields, { field, aggFn }] });\n }\n function removeRow(field: string) {\n onChange({ ...model, rowFields: model.rowFields.filter((f) => f !== field) });\n }\n function removeCol(field: string) {\n onChange({ ...model, columnFields: model.columnFields.filter((f) => f !== field) });\n }\n function removeValue(field: string) {\n onChange({ ...model, valueFields: model.valueFields.filter((v) => v.field !== field) });\n }\n function changeValueFn(field: string, aggFn: GridPivotAggFn) {\n onChange({\n ...model,\n valueFields: model.valueFields.map((v) => v.field === field ? { ...v, aggFn } : v),\n });\n }\n function reset() {\n onChange({ rowFields: [], columnFields: [], valueFields: [] });\n }\n\n const numericFields = new Set(columns.filter((c) => c.type === 'number' || c.aggregable).map((c) => c.field));\n\n const totalActive = model.rowFields.length + model.columnFields.length + model.valueFields.length;\n\n const colLabel = (field: string) =>\n columns.find((c) => c.field === field)?.headerName ?? field;\n\n const panel = (\n <div\n ref={panelRef}\n className=\"ogx-pivot-panel\"\n role=\"dialog\"\n aria-label=\"Pivot configuration\"\n style={{ top: pos.top, right: pos.right }}\n >\n { }\n <div className=\"ogx-pivot-panel__header\">\n <span className=\"ogx-pivot-panel__title\">\n <PivotIcon />\n Pivot Mode\n </span>\n {totalActive > 0 && (\n <button className=\"ogx-pivot-panel__reset-btn\" onClick={reset} title=\"Reset pivot\">\n Reset\n </button>\n )}\n </div>\n\n <div className=\"ogx-pivot-panel__body\">\n\n { }\n <div className=\"ogx-pivot-zone\">\n <span className=\"ogx-pivot-zone__label\">\n <span className=\"ogx-pivot-zone__dot ogx-pivot-zone__dot--row\" />\n Row Fields\n </span>\n <div\n className={`ogx-pivot-chips${model.rowFields.length === 0 ? ' ogx-pivot-chips--empty' : ''}`}\n data-placeholder=\"Add fields here — each becomes a row label\"\n >\n {model.rowFields.map((f) => (\n <span key={f} className=\"ogx-pivot-chip ogx-pivot-chip--row\">\n {colLabel(f)}\n <button className=\"ogx-pivot-chip__remove\" onClick={() => removeRow(f)} title={`Remove ${colLabel(f)}`}>×</button>\n </span>\n ))}\n </div>\n </div>\n\n { }\n <div className=\"ogx-pivot-zone\">\n <span className=\"ogx-pivot-zone__label\">\n <span className=\"ogx-pivot-zone__dot ogx-pivot-zone__dot--col\" />\n Column Fields\n </span>\n <div\n className={`ogx-pivot-chips${model.columnFields.length === 0 ? ' ogx-pivot-chips--empty' : ''}`}\n data-placeholder=\"Add fields here — unique values become column headers\"\n >\n {model.columnFields.map((f) => (\n <span key={f} className=\"ogx-pivot-chip ogx-pivot-chip--col\">\n {colLabel(f)}\n <button className=\"ogx-pivot-chip__remove\" onClick={() => removeCol(f)} title={`Remove ${colLabel(f)}`}>×</button>\n </span>\n ))}\n </div>\n </div>\n\n { }\n <div className=\"ogx-pivot-zone\">\n <span className=\"ogx-pivot-zone__label\">\n <span className=\"ogx-pivot-zone__dot ogx-pivot-zone__dot--value\" />\n Value Fields (aggregated)\n </span>\n <div\n className={`ogx-pivot-chips${model.valueFields.length === 0 ? ' ogx-pivot-chips--empty' : ''}`}\n data-placeholder=\"Add numeric fields here — values are aggregated\"\n >\n {model.valueFields.map((vf: GridPivotValueField) => (\n <span key={vf.field} className=\"ogx-pivot-chip ogx-pivot-chip--value\">\n {colLabel(vf.field)}\n <select\n className=\"ogx-pivot-chip__fn-select\"\n value={vf.aggFn}\n onChange={(e) => changeValueFn(vf.field, e.target.value as GridPivotAggFn)}\n title=\"Aggregation function\"\n >\n {AGG_FNS.map((fn) => (\n <option key={fn} value={fn}>{fn.toUpperCase()}</option>\n ))}\n </select>\n <button className=\"ogx-pivot-chip__remove\" onClick={() => removeValue(vf.field)} title={`Remove ${colLabel(vf.field)}`}>×</button>\n </span>\n ))}\n </div>\n </div>\n\n <hr className=\"ogx-pivot-panel__divider\" />\n\n { }\n <div>\n <div className=\"ogx-pivot-panel__fields-label\">Available Fields</div>\n <div className=\"ogx-pivot-fields\">\n {columns.map((col) => {\n const isNum = numericFields.has(col.field);\n const used = isUsed(col.field);\n if (used) return null;\n return (\n <div key={col.field} style={{ display: 'flex', alignItems: 'center', gap: 3 }}>\n <span className={`ogx-pivot-field-btn${isNum ? ' ogx-pivot-field-btn--numeric' : ''}`}>\n {col.headerName ?? col.field}\n </span>\n <div className=\"ogx-pivot-field-actions\">\n <button className=\"ogx-pivot-add-btn ogx-pivot-add-btn--row\" onClick={() => addRow(col.field)} title=\"Add to Row Fields\">Row</button>\n <button className=\"ogx-pivot-add-btn ogx-pivot-add-btn--col\" onClick={() => addCol(col.field)} title=\"Add to Column Fields\">Col</button>\n {isNum && (\n <button className=\"ogx-pivot-add-btn ogx-pivot-add-btn--value\" onClick={() => addValue(col.field)} title=\"Add to Value Fields\">Val</button>\n )}\n </div>\n </div>\n );\n })}\n {columns.every((col) => isUsed(col.field)) && (\n <span style={{ fontSize: 12, color: 'var(--ogx-color-gray-400, #94a3b8)' }}>\n All fields are in use.\n </span>\n )}\n </div>\n </div>\n\n </div>\n </div>\n );\n\n return ReactDOM.createPortal(panel, portalContainer);\n}\n","import React, { useState, useEffect, useRef, useCallback, useLayoutEffect } from 'react';\n\n\ninterface GlobalSearchProps {\n value?: string;\n onChange: (value: string) => void;\n placeholder?: string;\n debounceMs?: number;\n}\n\nfunction SearchIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n );\n}\n\nfunction CloseIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n );\n}\n\nexport function GlobalSearch({ value = '', onChange, placeholder = 'Search...', debounceMs = 250 }: GlobalSearchProps) {\n const [isExpanded, setIsExpanded] = useState(() => value.length > 0);\n // Fully uncontrolled: localValue is the single source of truth.\n const [localValue, setLocalValue] = useState(value);\n const inputRef = useRef<HTMLInputElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n // Keep onChange always current without adding it to effect deps\n const onChangeRef = useRef(onChange);\n useLayoutEffect(() => { onChangeRef.current = onChange; }, [onChange]);\n // Track the last value we emitted upward\n const lastEmittedRef = useRef(value);\n // Track the last incoming prop value to detect external resets\n const lastIncomingValueRef = useRef(value);\n // Track whether input was focused BEFORE a re-render so we can restore it\n const wasFocusedRef = useRef(false);\n\n // ── Focus preservation across re-renders ─────────────────────────────────\n // When the parent updates filterModel (triggered by our debounce), React\n // re-renders the entire tree. Even though the input element stays mounted,\n // the browser can lose focus during heavy reconciliation. We detect this\n // via useLayoutEffect (runs synchronously after DOM mutations, before paint)\n // and immediately restore focus without any visual flicker.\n useLayoutEffect(() => {\n if (wasFocusedRef.current && document.activeElement !== inputRef.current) {\n inputRef.current?.focus();\n }\n });\n\n // ── External reset detection ──────────────────────────────────────────────\n // Only responds when the PARENT programmatically changes the value\n // (e.g. \"Clear all filters\" button) — not from our own typing.\n useEffect(() => {\n if (value === lastIncomingValueRef.current) return;\n lastIncomingValueRef.current = value;\n\n if (value !== lastEmittedRef.current) {\n setLocalValue(value);\n lastEmittedRef.current = value;\n if (!value) {\n wasFocusedRef.current = false;\n setIsExpanded(false);\n } else {\n setIsExpanded(true);\n }\n }\n }, [value]);\n\n // ── Debounced upward notification ─────────────────────────────────────────\n useEffect(() => {\n const handler = setTimeout(() => {\n if (localValue !== lastEmittedRef.current) {\n lastEmittedRef.current = localValue;\n onChangeRef.current(localValue);\n }\n }, debounceMs);\n return () => clearTimeout(handler);\n }, [localValue, debounceMs]);\n\n const handleExpand = useCallback(() => {\n setIsExpanded(true);\n requestAnimationFrame(() => inputRef.current?.focus());\n }, []);\n\n const handleClear = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n setLocalValue('');\n lastEmittedRef.current = '';\n onChangeRef.current('');\n inputRef.current?.focus();\n }, []);\n\n const handleFocus = useCallback(() => {\n wasFocusedRef.current = true;\n setIsExpanded(true);\n }, []);\n\n // Blur: defer 150ms to allow focus to move within the container first\n // (e.g. clicking the clear button) before deciding to collapse.\n const handleBlur = useCallback(() => {\n wasFocusedRef.current = false;\n setTimeout(() => {\n if (\n containerRef.current &&\n document.activeElement &&\n containerRef.current.contains(document.activeElement)\n ) {\n // Focus is still inside — mark as focused again and abort\n wasFocusedRef.current = true;\n return;\n }\n if (!localValue) {\n setIsExpanded(false);\n }\n }, 150);\n }, [localValue]);\n\n // ── Click outside ─────────────────────────────────────────────────────────\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n if (!localValue) {\n setIsExpanded(false);\n }\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [localValue]);\n\n return (\n <div\n ref={containerRef}\n className={`ogx-global-search${isExpanded ? ' ogx-global-search--expanded' : ''}`}\n onClick={!isExpanded ? handleExpand : undefined}\n >\n <div className=\"ogx-global-search__icon-wrapper\">\n <SearchIcon />\n </div>\n <input\n ref={inputRef}\n className=\"ogx-global-search__input\"\n value={localValue}\n onChange={(e) => setLocalValue(e.target.value)}\n onFocus={handleFocus}\n onBlur={handleBlur}\n placeholder={placeholder}\n aria-label=\"Global Search\"\n autoComplete=\"off\"\n />\n {localValue && (\n <button className=\"ogx-global-search__clear\" onClick={handleClear} aria-label=\"Clear search\">\n <CloseIcon />\n </button>\n )}\n </div>\n );\n}\n","import { useState, useRef, useLayoutEffect, useCallback } from 'react';\nimport ReactDOM from 'react-dom';\nimport './Tooltip.css';\n\ninterface GridTooltipProps {\n title: React.ReactNode;\n children: React.ReactElement;\n placement?: 'top' | 'bottom' | 'left' | 'right';\n enterDelay?: number;\n leaveDelay?: number;\n}\n\nexport function GridTooltip({\n title,\n children,\n placement = 'top',\n enterDelay = 200,\n leaveDelay = 0\n}: GridTooltipProps) {\n const [open, setOpen] = useState(false);\n const [coords, setCoords] = useState({ top: 0, left: 0 });\n const timerRef = useRef<NodeJS.Timeout | null>(null);\n const childRef = useRef<HTMLElement | null>(null);\n\n const updateCoords = useCallback(() => {\n if (!childRef.current) return;\n const rect = childRef.current.getBoundingClientRect();\n\n let t = 0;\n let l = 0;\n\n // Note: These calculations are for positioning absolute relative to document.body\n const scrollX = window.pageXOffset || document.documentElement.scrollLeft;\n const scrollY = window.pageYOffset || document.documentElement.scrollTop;\n\n if (placement === 'top') {\n t = rect.top + scrollY - 8;\n l = rect.left + scrollX + rect.width / 2;\n } else if (placement === 'bottom') {\n t = rect.bottom + scrollY + 8;\n l = rect.left + scrollX + rect.width / 2;\n }\n\n setCoords({ top: t, left: l });\n }, [placement]);\n\n useLayoutEffect(() => {\n if (open) {\n updateCoords();\n window.addEventListener('scroll', updateCoords, true);\n window.addEventListener('resize', updateCoords);\n }\n return () => {\n window.removeEventListener('scroll', updateCoords, true);\n window.removeEventListener('resize', updateCoords);\n };\n }, [open, updateCoords]);\n\n const handleMouseEnter = () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => {\n setOpen(true);\n }, enterDelay);\n };\n\n const handleMouseLeave = () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => {\n setOpen(false);\n }, leaveDelay);\n };\n\n const wrapperRef = useCallback((node: HTMLSpanElement | null) => {\n // Use the first real child element for coordinates, not the wrapper span.\n // display:contents would give zero rects; inline-block wrapper gives correct rects\n // but we want coords from the actual child for pixel-perfect placement.\n childRef.current = node ? (node.firstElementChild as HTMLElement) ?? node : null;\n }, []);\n\n return (\n <>\n <span\n ref={wrapperRef}\n style={{ display: 'inline-block', lineHeight: 0 }}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {children}\n </span>\n {open && title && ReactDOM.createPortal(\n <div\n className={`ogx-tooltip ogx-tooltip--${placement}`}\n style={{\n top: coords.top,\n left: coords.left,\n position: 'absolute',\n zIndex: 99999\n }}\n >\n {title}\n </div>,\n document.body\n )}\n </>\n );\n}\n","import React, { useState, useRef, useEffect, useCallback, useLayoutEffect } from 'react';\nimport ReactDOM from 'react-dom';\nimport type { GridColDef, GridAggregationModel, GridPivotModel, GridFilterModel } from '../../types';\nimport { PivotPanel, PivotIcon } from './PivotPanel';\nimport { GlobalSearch } from './GlobalSearch';\nimport { ColumnVisibilityPanel } from '../ColumnVisibilityPanel/ColumnVisibilityPanel';\nimport { FilterPanel } from '../FilterPanel/FilterPanel';\nimport { GridTooltip } from '../Tooltip/Tooltip';\n\n/** Props passed to a custom toolbar button renderer. */\nexport interface ToolbarButtonRenderProps {\n /** Call this to toggle the associated panel open/closed. */\n onClick: () => void;\n /** Whether the associated panel is currently open. */\n isOpen: boolean;\n /** Number of active items (filters applied, aggregations configured, etc.). */\n activeCount: number;\n}\n\n/** Props passed to a custom quick-filter renderer. */\nexport interface ToolbarQuickFilterRenderProps {\n /** Current search string. */\n value: string;\n /** Call with the new search string when the input changes. */\n onChange: (value: string) => void;\n}\n\nexport interface GridToolbarProps {\n columns?: GridColDef[];\n /** Original user-defined columns (before pivot transformation).\n * When provided, the PivotPanel shows these instead of `columns`\n * to prevent pivot-generated synthetic columns from appearing in\n * 'Available Fields' and causing infinite nested aggregations. */\n baseColumns?: GridColDef[];\n aggregationModel?: GridAggregationModel;\n onAggregationModelChange?: (model: GridAggregationModel) => void;\n pivotModel?: GridPivotModel;\n onPivotModelChange?: (model: GridPivotModel) => void;\n filterModel?: GridFilterModel;\n onFilterModelChange?: (model: GridFilterModel) => void;\n columnVisibilityModel?: Record<string, boolean>;\n onColumnVisibilityModelChange?: (model: Record<string, boolean>) => void;\n onColumnReorder?: (fromField: string, toField: string) => void;\n onColumnOrderReset?: () => void;\n forceColumnsOpen?: boolean;\n onColumnsPanelClose?: () => void;\n children?: React.ReactNode;\n rightContent?: React.ReactNode;\n style?: React.CSSProperties;\n /**\n * Replace the built-in Columns button. The columns panel still opens and\n * closes normally — only the trigger element is replaced.\n */\n renderColumnsButton?: (props: ToolbarButtonRenderProps) => React.ReactNode;\n /**\n * Replace the built-in Filters button. The filter panel still opens and\n * closes normally — only the trigger element is replaced.\n */\n renderFilterButton?: (props: ToolbarButtonRenderProps) => React.ReactNode;\n /**\n * Replace the built-in Aggregation/Summaries button. The aggregation panel\n * still opens and closes normally — only the trigger element is replaced.\n */\n renderAggregationButton?: (props: ToolbarButtonRenderProps) => React.ReactNode;\n /**\n * Render an Export button. There is no built-in export button — this slot\n * inserts your element after the Aggregation button in the toolbar action row.\n */\n renderExportButton?: () => React.ReactNode;\n /**\n * Replace the built-in quick-filter search bar. Receives the current search\n * value and an onChange handler; connect them to your own input element.\n */\n renderQuickFilter?: (props: ToolbarQuickFilterRenderProps) => React.ReactNode;\n /** Additional CSS class applied to the toolbar root element. */\n className?: string;\n /** Show columns with `hideable: false` in the Columns panel as disabled rows. Default: false. */\n showNonHideableColumns?: boolean;\n}\n\nconst AGGREGATION_FUNCTIONS = ['none', 'sum', 'avg', 'count', 'min', 'max'] as const;\n\nfunction SigmaIcon() {\n return (\n <svg\n width=\"18\" height=\"18\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"\n strokeLinecap=\"round\" strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 4H6l6 8-6 8h12\" />\n </svg>\n );\n}\n\nfunction ViewColumnIcon() {\n return (\n <svg focusable=\"false\" aria-hidden=\"true\" viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\">\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <rect x=\"8.5\" y=\"4\" width=\"7\" height=\"16\" fill=\"currentColor\" opacity=\"0.25\" />\n <line x1=\"8.5\" y1=\"4\" x2=\"8.5\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <line x1=\"15.5\" y1=\"4\" x2=\"15.5\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <line x1=\"2\" y1=\"9\" x2=\"22\" y2=\"9\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <line x1=\"2\" y1=\"14\" x2=\"22\" y2=\"14\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n </svg>\n );\n}\n\nfunction FilterIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polygon points=\"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3\" />\n </svg>\n );\n}\n\ninterface PanelPosition { top: number; right: number; }\n\nfunction AggregationPanel({\n anchorRef,\n aggregationModel,\n aggregableColumns,\n onFunctionChange,\n onClearAll,\n onClose,\n activeCount,\n}: {\n anchorRef: React.RefObject<HTMLElement | null>;\n aggregationModel: GridAggregationModel;\n aggregableColumns: GridColDef[];\n onFunctionChange: (field: string, fn: string) => void;\n onClearAll: () => void;\n onClose: () => void;\n activeCount: number;\n}) {\n const panelRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState<PanelPosition>({ top: 0, right: 0 });\n const [portalContainer, setPortalContainer] = useState<Element>(document.body);\n\n useLayoutEffect(() => {\n setPortalContainer(anchorRef.current?.closest('.ogx-theme-provider') ?? document.body);\n }, [anchorRef]);\n\n const computePos = useCallback((): PanelPosition => {\n if (!anchorRef.current) return { top: 0, right: 0 };\n const rect = anchorRef.current.getBoundingClientRect();\n return {\n top: rect.bottom + 6,\n right: window.innerWidth - rect.right,\n };\n }, [anchorRef]);\n\n useEffect(() => {\n setPos(computePos());\n const update = () => setPos(computePos());\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n return () => {\n window.removeEventListener('scroll', update, true);\n window.removeEventListener('resize', update);\n };\n }, [computePos]);\n\n useEffect(() => {\n function handleClick(e: MouseEvent) {\n if (\n panelRef.current && !panelRef.current.contains(e.target as Node) &&\n anchorRef.current && !anchorRef.current.contains(e.target as Node)\n ) {\n onClose();\n }\n }\n document.addEventListener('mousedown', handleClick);\n return () => document.removeEventListener('mousedown', handleClick);\n }, [anchorRef, onClose]);\n\n useEffect(() => {\n function onKey(e: KeyboardEvent) { if (e.key === 'Escape') onClose(); }\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [onClose]);\n\n const panel = (\n <div\n ref={panelRef}\n className=\"ogx-toolbar__panel\"\n role=\"dialog\"\n aria-label=\"Summaries configuration\"\n style={{ top: pos.top, right: pos.right, width: 400, maxWidth: 'calc(100vw - 24px)' }}\n >\n <div className=\"ogx-toolbar__panel-header\">\n <span className=\"ogx-toolbar__panel-title\">\n <SigmaIcon />\n Summaries\n </span>\n {activeCount > 0 && (\n <button\n className=\"ogx-toolbar__clear-btn\"\n onClick={onClearAll}\n title=\"Clear all summaries\"\n >\n Clear all\n </button>\n )}\n </div>\n\n <div className=\"ogx-toolbar__panel-body\">\n {aggregableColumns.length === 0 ? (\n <p className=\"ogx-toolbar__empty\">\n No aggregable columns.<br />\n Set <code>aggregable: true</code> on a column to enable.\n </p>\n ) : (\n aggregableColumns.map((col) => {\n const currentFn = aggregationModel[col.field] || 'none';\n return (\n <div key={col.field} className=\"ogx-toolbar__agg-row\">\n <span className=\"ogx-toolbar__agg-label\" title={col.field}>\n {col.headerName || col.field}\n </span>\n <div className=\"ogx-toolbar__agg-pills\">\n {AGGREGATION_FUNCTIONS.map((fn) => (\n <button\n key={fn}\n className={`ogx-toolbar__pill${currentFn === fn ? ' ogx-toolbar__pill--active' : ''}`}\n onClick={() => onFunctionChange(col.field, fn)}\n aria-pressed={currentFn === fn}\n >\n {fn}\n </button>\n ))}\n </div>\n </div>\n );\n })\n )}\n </div>\n </div>\n );\n\n return ReactDOM.createPortal(panel, portalContainer);\n}\n\nfunction ColumnsPanelWrapper({\n anchorRef,\n columns,\n visibleColumns,\n onVisibilityChange,\n onShowAll,\n onHideAll,\n onColumnReorder,\n onColumnOrderReset,\n onClose,\n showNonHideableColumns,\n}: {\n anchorRef: React.RefObject<HTMLElement | null>;\n columns: GridColDef[];\n visibleColumns: Set<string>;\n onVisibilityChange: (field: string, isVisible: boolean) => void;\n onShowAll: () => void;\n onHideAll: () => void;\n onColumnReorder?: (fromField: string, toField: string) => void;\n onColumnOrderReset?: () => void;\n onClose: () => void;\n showNonHideableColumns?: boolean;\n}) {\n const panelRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState<PanelPosition>({ top: 0, right: 0 });\n const [portalContainer, setPortalContainer] = useState<Element>(document.body);\n\n useLayoutEffect(() => {\n setPortalContainer(anchorRef.current?.closest('.ogx-theme-provider') ?? document.body);\n }, [anchorRef]);\n\n const computePos = useCallback((): PanelPosition => {\n if (!anchorRef.current) return { top: 0, right: 0 };\n const rect = anchorRef.current.getBoundingClientRect();\n return {\n top: rect.bottom + 6,\n right: window.innerWidth - rect.right,\n };\n }, [anchorRef]);\n\n useEffect(() => {\n setPos(computePos());\n const update = () => setPos(computePos());\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n return () => {\n window.removeEventListener('scroll', update, true);\n window.removeEventListener('resize', update);\n };\n }, [computePos]);\n\n useEffect(() => {\n function handleClick(e: MouseEvent) {\n if (\n panelRef.current && !panelRef.current.contains(e.target as Node) &&\n anchorRef.current && !anchorRef.current.contains(e.target as Node)\n ) {\n onClose();\n }\n }\n document.addEventListener('mousedown', handleClick);\n return () => document.removeEventListener('mousedown', handleClick);\n }, [anchorRef, onClose]);\n\n const panel = (\n <div\n ref={panelRef}\n className=\"ogx-toolbar__panel\"\n role=\"dialog\"\n aria-label=\"Column visibility\"\n style={{ top: pos.top, right: pos.right, width: 280, padding: 0 }}\n >\n <ColumnVisibilityPanel\n columns={columns}\n visibleColumns={visibleColumns}\n onVisibilityChange={onVisibilityChange}\n onShowAll={onShowAll}\n onHideAll={onHideAll}\n onColumnReorder={onColumnReorder}\n onColumnOrderReset={onColumnOrderReset}\n showNonHideableColumns={showNonHideableColumns}\n />\n </div>\n );\n\n return ReactDOM.createPortal(panel, portalContainer);\n}\n\nfunction FilterPanelWrapper({\n anchorRef,\n columns,\n filterModel,\n onFilterModelChange,\n onClose\n}: {\n anchorRef: React.RefObject<HTMLElement | null>;\n columns: GridColDef[];\n filterModel: GridFilterModel;\n onFilterModelChange: (model: GridFilterModel) => void;\n onClose: () => void;\n}) {\n const panelRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState<PanelPosition>({ top: 0, right: 0 });\n // Stable ref for onClose — prevents the mousedown effect from\n // tearing down and re-registering on every filterModel update,\n // which could fire the close callback during the re-register window.\n const onCloseRef = useRef(onClose);\n useLayoutEffect(() => { onCloseRef.current = onClose; }, [onClose]);\n const [portalContainer, setPortalContainer] = useState<Element>(document.body);\n\n useLayoutEffect(() => {\n setPortalContainer(anchorRef.current?.closest('.ogx-theme-provider') ?? document.body);\n }, [anchorRef]);\n\n const computePos = useCallback((): PanelPosition => {\n if (!anchorRef.current) return { top: 0, right: 0 };\n const rect = anchorRef.current.getBoundingClientRect();\n return {\n top: rect.bottom + 6,\n right: window.innerWidth - rect.right,\n };\n }, [anchorRef]);\n\n useEffect(() => {\n setPos(computePos());\n const update = () => setPos(computePos());\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n return () => {\n window.removeEventListener('scroll', update, true);\n window.removeEventListener('resize', update);\n };\n }, [computePos]);\n\n // Only Escape key closes the filter panel automatically.\n // Click-outside is intentionally removed: users need to type in filter\n // inputs without the panel closing. There is an explicit Close button.\n useEffect(() => {\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') onCloseRef.current();\n }\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n // Empty deps — listener is registered once and uses the stable ref\n }, []);\n\n const activeFilterCount = filterModel.items?.length ?? 0;\n\n const handleClearAll = () => {\n onFilterModelChange({ ...filterModel, items: [], logicOperator: 'and' });\n };\n\n const panel = (\n <div\n ref={panelRef}\n className=\"ogx-toolbar__panel ogx-toolbar__panel--filter\"\n role=\"dialog\"\n aria-label=\"Advanced filters\"\n style={{ top: pos.top, right: pos.right, width: 540, maxWidth: 'calc(100vw - 24px)' }}\n >\n <div className=\"ogx-toolbar__panel-header\">\n <span className=\"ogx-toolbar__panel-title\">\n <FilterIcon />\n Filters\n {activeFilterCount > 0 && (\n <span className=\"ogx-toolbar__panel-count\">{activeFilterCount}</span>\n )}\n </span>\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n {activeFilterCount > 0 && (\n <button\n className=\"ogx-toolbar__clear-btn\"\n onClick={handleClearAll}\n title=\"Clear all filters\"\n >\n Clear all\n </button>\n )}\n <button\n className=\"ogx-toolbar__close-btn\"\n onClick={() => onCloseRef.current()}\n title=\"Close filters\"\n aria-label=\"Close filters panel\"\n >\n Close\n </button>\n </div>\n </div>\n\n <div className=\"ogx-toolbar__panel-body ogx-toolbar__panel-body--filter\">\n <FilterPanel\n columns={columns}\n filterModel={filterModel}\n onFilterModelChange={onFilterModelChange}\n />\n </div>\n </div>\n );\n\n return ReactDOM.createPortal(panel, portalContainer);\n}\n\nconst EMPTY_PIVOT: GridPivotModel = { rowFields: [], columnFields: [], valueFields: [] };\n\nexport function GridToolbar({\n columns = [],\n baseColumns,\n aggregationModel = {},\n onAggregationModelChange,\n pivotModel,\n onPivotModelChange,\n filterModel,\n onFilterModelChange,\n columnVisibilityModel = {},\n onColumnVisibilityModelChange,\n onColumnReorder,\n onColumnOrderReset,\n forceColumnsOpen,\n onColumnsPanelClose,\n children,\n rightContent,\n style,\n renderColumnsButton,\n renderFilterButton,\n renderAggregationButton,\n renderExportButton,\n renderQuickFilter,\n className,\n showNonHideableColumns,\n}: GridToolbarProps) {\n const [aggOpen, setAggOpen] = useState(false);\n const [pivotOpen, setPivotOpen] = useState(false);\n const [colsOpen, setColsOpen] = useState(false);\n const [filterOpen, setFilterOpen] = useState(false);\n\n useEffect(() => {\n if (forceColumnsOpen) {\n setColsOpen(true);\n setAggOpen(false);\n setPivotOpen(false);\n setFilterOpen(false);\n }\n }, [forceColumnsOpen]);\n\n const aggButtonRef = useRef<HTMLButtonElement>(null);\n const pivotButtonRef = useRef<HTMLButtonElement>(null);\n const colsButtonRef = useRef<HTMLButtonElement>(null);\n const filterButtonRef = useRef<HTMLButtonElement>(null);\n\n // Wrapper div refs — used as panel anchors when a custom button renderer\n // is provided (the custom element doesn't expose a ref to us).\n const colsWrapperRef = useRef<HTMLDivElement>(null);\n const filterWrapperRef = useRef<HTMLDivElement>(null);\n const aggWrapperRef = useRef<HTMLDivElement>(null);\n\n const currentPivotModel = pivotModel ?? EMPTY_PIVOT;\n const pivotActive = currentPivotModel.rowFields.length > 0\n || currentPivotModel.columnFields.length > 0\n || currentPivotModel.valueFields.length > 0;\n\n const aggregableColumns = columns.filter(\n (c) => c.aggregable !== false && (c.type === 'number' || c.aggregable === true)\n );\n\n const activeCount = Object.keys(aggregationModel).filter(\n (f) => aggregationModel[f] && aggregationModel[f] !== 'none'\n ).length;\n\n const handleFunctionChange = useCallback(\n (field: string, fn: string) => {\n if (!onAggregationModelChange) return;\n const next = { ...aggregationModel };\n if (fn === 'none') {\n delete next[field];\n } else {\n next[field] = fn;\n }\n onAggregationModelChange(next);\n },\n [aggregationModel, onAggregationModelChange]\n );\n\n const clearAllAgg = useCallback(() => {\n onAggregationModelChange?.({});\n }, [onAggregationModelChange]);\n\n const handleSearchChange = useCallback((value: string) => {\n if (!onFilterModelChange) return;\n\n const values = value ? [value] : [];\n const nextModel = {\n ...(filterModel || {}),\n quickFilterValues: values,\n items: filterModel?.items || []\n };\n onFilterModelChange(nextModel);\n }, [filterModel, onFilterModelChange]);\n\n const searchValue = filterModel?.quickFilterValues?.[0] || '';\n const activeFilterCount = (filterModel?.items?.length || 0);\n\n // Column Visibility Logic\n const visibleColumns = new Set(\n columns\n .filter(col => columnVisibilityModel[col.field] !== false) // default true\n .map(col => col.field)\n );\n\n const handleVisibilityChange = useCallback((field: string, isVisible: boolean) => {\n if (!onColumnVisibilityModelChange) return;\n const next = { ...columnVisibilityModel, [field]: isVisible };\n onColumnVisibilityModelChange(next);\n }, [columnVisibilityModel, onColumnVisibilityModelChange]);\n\n // Batch show/hide — build one full model so no stale-closure overwrites\n const handleShowAllColumns = useCallback(() => {\n if (!onColumnVisibilityModelChange) return;\n const next = { ...columnVisibilityModel };\n columns.forEach(col => {\n if (col.hideable !== false) next[col.field] = true;\n });\n onColumnVisibilityModelChange(next);\n }, [columns, columnVisibilityModel, onColumnVisibilityModelChange]);\n\n const handleHideAllColumns = useCallback(() => {\n if (!onColumnVisibilityModelChange) return;\n const next = { ...columnVisibilityModel };\n columns.forEach(col => {\n if (col.hideable !== false) next[col.field] = false;\n });\n onColumnVisibilityModelChange(next);\n }, [columns, columnVisibilityModel, onColumnVisibilityModelChange]);\n\n return (\n <div className={['ogx-toolbar', className].filter(Boolean).join(' ')} role=\"toolbar\" aria-label=\"Grid toolbar\" style={style}>\n {/* Left slot — custom content */}\n {children && <div className=\"ogx-toolbar__left\">{children}</div>}\n\n {/* Spacer */}\n <div className=\"ogx-toolbar__spacer\" />\n\n {/* Right: built-in buttons */}\n <div className=\"ogx-toolbar__actions\">\n {onFilterModelChange && (\n <div className=\"ogx-toolbar__dropdown-wrapper\" style={{ marginRight: 4 }}>\n {renderQuickFilter\n ? renderQuickFilter({ value: searchValue, onChange: handleSearchChange })\n : (\n <GlobalSearch\n value={searchValue}\n onChange={handleSearchChange}\n placeholder=\"Search...\"\n />\n )\n }\n </div>\n )}\n\n {/* Columns Button */}\n {onColumnVisibilityModelChange && (\n <div ref={colsWrapperRef} className=\"ogx-toolbar__dropdown-wrapper\" style={{ marginRight: 4 }}>\n {renderColumnsButton\n ? renderColumnsButton({\n onClick: () => { setColsOpen(o => !o); setAggOpen(false); setPivotOpen(false); setFilterOpen(false); },\n isOpen: colsOpen,\n activeCount: columns.length - visibleColumns.size,\n })\n : (\n <GridTooltip title=\"Columns\">\n <button\n ref={colsButtonRef}\n className={`ogx-toolbar__icon-btn${colsOpen ? ' ogx-toolbar__icon-btn--active' : ''}`}\n aria-label=\"Manage columns\"\n onClick={() => {\n setColsOpen(!colsOpen);\n setAggOpen(false);\n setPivotOpen(false);\n setFilterOpen(false);\n }}\n >\n <ViewColumnIcon />\n </button>\n </GridTooltip>\n )\n }\n {colsOpen && (\n <ColumnsPanelWrapper\n anchorRef={renderColumnsButton ? colsWrapperRef : colsButtonRef}\n columns={columns}\n visibleColumns={visibleColumns}\n onVisibilityChange={handleVisibilityChange}\n onShowAll={handleShowAllColumns}\n onHideAll={handleHideAllColumns}\n onColumnReorder={onColumnReorder}\n onColumnOrderReset={onColumnOrderReset}\n onClose={() => { setColsOpen(false); onColumnsPanelClose?.(); }}\n showNonHideableColumns={showNonHideableColumns}\n />\n )}\n </div>\n )}\n\n {/* Filters Button */}\n {onFilterModelChange && (\n <div ref={filterWrapperRef} className=\"ogx-toolbar__dropdown-wrapper\" style={{ marginRight: 4 }}>\n {renderFilterButton\n ? renderFilterButton({\n onClick: () => { setFilterOpen(o => !o); setAggOpen(false); setPivotOpen(false); setColsOpen(false); },\n isOpen: filterOpen,\n activeCount: activeFilterCount,\n })\n : (\n <GridTooltip title=\"Filters\">\n <button\n ref={filterButtonRef}\n className={`ogx-toolbar__icon-btn${filterOpen ? ' ogx-toolbar__icon-btn--active' : ''}`}\n aria-label=\"Advanced filters\"\n onClick={() => {\n setFilterOpen(!filterOpen);\n setAggOpen(false);\n setPivotOpen(false);\n setColsOpen(false);\n }}\n >\n <FilterIcon />\n {activeFilterCount > 0 && (\n <span className=\"ogx-toolbar__dot\" aria-label=\"Filters active\" />\n )}\n </button>\n </GridTooltip>\n )\n }\n {filterOpen && (\n <FilterPanelWrapper\n anchorRef={renderFilterButton ? filterWrapperRef : filterButtonRef}\n columns={columns}\n filterModel={filterModel || { items: [] }}\n onFilterModelChange={onFilterModelChange}\n onClose={() => setFilterOpen(false)}\n />\n )}\n </div>\n )}\n\n {/* Pivot button */}\n {onPivotModelChange && (\n <div className=\"ogx-toolbar__dropdown-wrapper\" style={{ marginRight: 4 }}>\n <GridTooltip title=\"Pivot\">\n <button\n ref={pivotButtonRef}\n className={`ogx-toolbar__icon-btn${pivotOpen ? ' ogx-toolbar__icon-btn--active' : ''}`}\n aria-label=\"Configure pivot\"\n aria-expanded={pivotOpen}\n onClick={() => {\n setPivotOpen(!pivotOpen);\n setAggOpen(false);\n setColsOpen(false);\n setFilterOpen(false);\n }}\n >\n <PivotIcon />\n {pivotActive && (\n <span className=\"ogx-toolbar__dot\" aria-label=\"Pivot active\" />\n )}\n </button>\n </GridTooltip>\n\n {pivotOpen && (\n <PivotPanel\n anchorRef={pivotButtonRef}\n columns={baseColumns ?? columns}\n model={currentPivotModel}\n onChange={(m) => { onPivotModelChange?.(m); }}\n onClose={() => setPivotOpen(false)}\n />\n )}\n </div>\n )}\n\n {/* Summaries button */}\n <div ref={aggWrapperRef} className=\"ogx-toolbar__dropdown-wrapper\" style={{ marginRight: 4 }}>\n {renderAggregationButton\n ? renderAggregationButton({\n onClick: () => { setAggOpen(o => !o); setPivotOpen(false); setColsOpen(false); setFilterOpen(false); },\n isOpen: aggOpen,\n activeCount,\n })\n : (\n <GridTooltip title=\"Summaries\">\n <button\n ref={aggButtonRef}\n className={`ogx-toolbar__icon-btn${aggOpen ? ' ogx-toolbar__icon-btn--active' : ''}`}\n aria-label=\"Configure summaries\"\n aria-expanded={aggOpen}\n onClick={() => {\n setAggOpen(!aggOpen);\n setPivotOpen(false);\n setColsOpen(false);\n setFilterOpen(false);\n }}\n >\n <SigmaIcon />\n {activeCount > 0 && (\n <span className=\"ogx-toolbar__dot\" aria-label={`${activeCount} active summaries`} />\n )}\n </button>\n </GridTooltip>\n )\n }\n\n {aggOpen && (\n <AggregationPanel\n anchorRef={renderAggregationButton ? aggWrapperRef : aggButtonRef}\n aggregationModel={aggregationModel}\n aggregableColumns={aggregableColumns}\n onFunctionChange={handleFunctionChange}\n onClearAll={clearAllAgg}\n onClose={() => setAggOpen(false)}\n activeCount={activeCount}\n />\n )}\n </div>\n\n {/* Export button slot */}\n {renderExportButton && renderExportButton()}\n\n {rightContent}\n </div>\n </div>\n );\n}\n","import { useRef } from 'react';\nimport type { GridApi } from '../../types';\n\n/**\n * Hook to create a ref for the DataGrid API.\n * This ref can be passed to the `apiRef` prop of the `DataGrid` component.\n */\nexport function useGridApiRef() {\n return useRef<GridApi>(null!);\n}\n","\nimport React from 'react';\n\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n fullWidth?: boolean;\n error?: boolean;\n startAdornment?: React.ReactNode;\n endAdornment?: React.ReactNode;\n}\n\nexport const Input: React.FC<InputProps> = ({\n fullWidth = false,\n error = false,\n startAdornment,\n endAdornment,\n className = '',\n ...props\n}) => {\n const wrapperClassNames = [\n 'ogx-input-wrapper',\n fullWidth && 'ogx-input-wrapper--full-width',\n error && 'ogx-input-wrapper--error',\n props.disabled && 'ogx-input-wrapper--disabled',\n className\n ].filter(Boolean).join(' ');\n\n return (\n <div className={wrapperClassNames}>\n {startAdornment && (\n <div className=\"ogx-input__adornment ogx-input__adornment--start\">\n {startAdornment}\n </div>\n )}\n <input\n className=\"ogx-input\"\n {...props}\n />\n {endAdornment && (\n <div className=\"ogx-input__adornment ogx-input__adornment--end\">\n {endAdornment}\n </div>\n )}\n </div>\n );\n};\n","import type {\n GridColDef,\n GridRowModel,\n GridFilterModel,\n PdfExportOptions,\n GridGroupedExportRow,\n} from '../../types';\nimport { formatAggregationValue } from '../../hooks/features/useAggregation';\n\ninterface JsPDFDoc {\n save: (filename: string) => void;\n setFontSize: (size: number) => void;\n setFont: (name: string, style: string) => void;\n setTextColor: (r: number, g: number, b: number) => void;\n text: (text: string, x: number, y: number, opts?: { align?: string }) => void;\n addImage: (data: string, format: string, x: number, y: number, w: number, h: number) => void;\n line: (x1: number, y1: number, x2: number, y2: number) => void;\n setDrawColor: (r: number, g: number, b: number) => void;\n setLineWidth: (w: number) => void;\n setPage: (page: number) => void;\n lastAutoTable: { finalY: number };\n internal: {\n pageSize: { getWidth: () => number; getHeight: () => number };\n getNumberOfPages: () => number;\n };\n getNumberOfPages: () => number;\n}\n\ninterface AutoTableOptions {\n head: string[][];\n body: string[][];\n foot?: string[][];\n startY?: number;\n styles?: Record<string, unknown>;\n headStyles?: Record<string, unknown>;\n alternateRowStyles?: Record<string, unknown>;\n footStyles?: Record<string, unknown>;\n columnStyles?: Record<number, { cellWidth: number }>;\n showFoot?: string;\n showHead?: string;\n margin?: { top: number; left: number; right: number; bottom: number };\n}\n\nfunction hexToRgb(hex: string): [number, number, number] {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n if (!result) return [79, 70, 229];\n return [\n parseInt(result[1], 16),\n parseInt(result[2], 16),\n parseInt(result[3], 16),\n ];\n}\n\nfunction getExportColumns<R extends GridRowModel>(columns: GridColDef<R>[]): GridColDef<R>[] {\n return columns.filter(col => {\n if (col.exportable === false) return false;\n if (col.field === '__check__' || col.field === '__actions__') return false;\n return true;\n });\n}\n\nfunction resolveValue<R extends GridRowModel>(row: R, col: GridColDef<R>): string {\n let value: unknown = (row as GridRowModel)[col.field];\n if (col.valueGetter) {\n value = col.valueGetter({ row, field: col.field, value });\n }\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n return String(value ?? '');\n}\n\nfunction colWeight<R extends GridRowModel>(col: GridColDef<R>): number {\n const w = typeof col.width === 'number' ? col.width : undefined;\n return w ?? (col.flex ?? 1) * 100;\n}\n\nfunction computeColumnStyles<R extends GridRowModel>(\n columns: GridColDef<R>[],\n usableWidth: number\n): Record<number, { cellWidth: number }> {\n const totalWeight = columns.reduce((sum, col) => sum + colWeight(col), 0);\n const styles: Record<number, { cellWidth: number }> = {};\n columns.forEach((col, i) => {\n styles[i] = { cellWidth: (colWeight(col) / totalWeight) * usableWidth };\n });\n return styles;\n}\n\nfunction formatFilterSummary<R extends GridRowModel>(\n filterModel: GridFilterModel,\n columns: GridColDef<R>[]\n): string {\n if (!filterModel.items || filterModel.items.length === 0) return '';\n return filterModel.items\n .flatMap(item => {\n // Only handle leaf GridFilterItem — skip GridFilterGroup (which has 'items')\n if ('items' in item) return [];\n const col = columns.find(c => c.field === item.field);\n const label = col?.headerName ?? item.field;\n const val = item.value !== undefined && item.value !== null ? String(item.value) : '';\n return [`${label} ${item.operator} \"${val}\"`];\n })\n .join(' • ');\n}\n\nexport async function exportToPdf<R extends GridRowModel>(\n rows: R[],\n columns: GridColDef<R>[],\n options: PdfExportOptions = {}\n): Promise<void> {\n // Lazy-load peer deps — provides a clear error if not installed\n let JsPDF: new (opts: Record<string, unknown>) => JsPDFDoc;\n let autoTable: (doc: JsPDFDoc, opts: AutoTableOptions) => void;\n try {\n const [jspdfMod, autoTableMod] = await Promise.all([\n import('jspdf'),\n import('jspdf-autotable'),\n ]);\n JsPDF = jspdfMod.default as unknown as new (opts: Record<string, unknown>) => JsPDFDoc;\n autoTable = autoTableMod.default as unknown as (doc: JsPDFDoc, opts: AutoTableOptions) => void;\n } catch {\n throw new Error(\n \"exportToPdf requires 'jspdf' and 'jspdf-autotable'. Run: npm install jspdf jspdf-autotable\"\n );\n }\n\n const {\n fileName = 'export',\n title,\n logoUrl,\n orientation = 'landscape',\n selectedRows,\n aggregationResult,\n aggregationModel,\n filterModel,\n alternateRowColor = true,\n headerBackgroundColor = '#4f46e5',\n headerTextColor = '#ffffff',\n fontSize = 9,\n groupedRows,\n } = options;\n\n const doc = new JsPDF({ orientation, unit: 'mm', format: 'a4' });\n const pageWidth = doc.internal.pageSize.getWidth();\n const pageHeight = doc.internal.pageSize.getHeight();\n const MARGIN = 14;\n const usableWidth = pageWidth - MARGIN * 2;\n\n const exportColumns = getExportColumns(columns);\n const rowsToExport = selectedRows && selectedRows.length > 0\n ? rows.filter(r => selectedRows.includes(r.id as string | number))\n : rows;\n\n // --- Header block ---\n let startY = MARGIN;\n\n if (title) {\n let cursorX = MARGIN;\n let cursorY = MARGIN + 8;\n\n if (logoUrl) {\n try {\n doc.addImage(logoUrl, 'PNG', cursorX, MARGIN, 10, 10);\n cursorX += 14;\n } catch {\n // logo failed to load — skip silently\n }\n }\n\n doc.setFontSize(16);\n doc.setFont('helvetica', 'bold');\n doc.setTextColor(30, 41, 59);\n doc.text(title, cursorX, cursorY);\n cursorY += 6;\n\n doc.setFontSize(8);\n doc.setFont('helvetica', 'normal');\n doc.setTextColor(100, 116, 139);\n const exportedAt = new Date().toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' });\n const rowCount = groupedRows\n ? groupedRows.filter(e => e.type === 'leaf').length\n : rowsToExport.length;\n doc.text(\n `Exported: ${exportedAt} • ${rowCount} row${rowCount !== 1 ? 's' : ''}`,\n cursorX,\n cursorY\n );\n cursorY += 5;\n\n if (filterModel) {\n const summary = formatFilterSummary(filterModel, columns);\n if (summary) {\n doc.text(`Filters: ${summary}`, cursorX, cursorY);\n cursorY += 5;\n }\n }\n\n doc.setDrawColor(226, 232, 240);\n doc.setLineWidth(0.3);\n doc.line(MARGIN, cursorY + 2, pageWidth - MARGIN, cursorY + 2);\n startY = cursorY + 6;\n }\n\n // --- Build table data ---\n const head = [exportColumns.map(col => col.headerName ?? col.field)];\n\n let body: string[][];\n let foot: string[][] | undefined;\n\n if (groupedRows && groupedRows.length > 0) {\n // Grouped export: flatten the ordered list into body rows with indentation\n body = [];\n const aggMod = aggregationModel || {};\n groupedRows.forEach((entry: GridGroupedExportRow) => {\n if (entry.type === 'group-header') {\n const indent = ' '.repeat(entry.depth * 2);\n const label = `${indent}${entry.groupField ?? ''}: ${String(entry.groupValue ?? '')}`;\n body.push(exportColumns.map((_, i) => i === 0 ? label : ''));\n } else if (entry.type === 'leaf' && entry.row) {\n const row = entry.row as R;\n const indent = ' '.repeat(entry.depth * 2);\n body.push(exportColumns.map((col, i) => (i === 0 ? indent : '') + resolveValue(row, col)));\n } else if (entry.type === 'group-subtotal' && entry.aggregatedValues) {\n const indent = ' '.repeat(entry.depth * 2);\n body.push(exportColumns.map((col, i) => {\n if (i === 0) return `${indent}Subtotal`;\n const aggVal = entry.aggregatedValues![col.field];\n if (aggVal === undefined || aggVal === null) return '';\n let formatted: unknown = aggVal;\n if (col.valueFormatter) formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n else if (aggMod[col.field]) formatted = formatAggregationValue(aggVal, aggMod[col.field] as string);\n return String(formatted);\n }));\n } else if (entry.type === 'grand-total' && entry.aggregatedValues) {\n const footRow = exportColumns.map((col, i) => {\n if (i === 0) return 'Grand Total';\n const aggVal = entry.aggregatedValues![col.field];\n if (aggVal === undefined || aggVal === null) return '';\n let formatted: unknown = aggVal;\n if (col.valueFormatter) formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n else if (aggMod[col.field]) formatted = formatAggregationValue(aggVal, aggMod[col.field] as string);\n return String(formatted);\n });\n foot = [footRow];\n }\n });\n } else {\n body = rowsToExport.map(row => exportColumns.map(col => resolveValue(row, col)));\n\n if (aggregationResult && aggregationModel) {\n const footRow = exportColumns.map((col, i) => {\n if (i === 0) {\n const hasAgg = exportColumns.some(c => aggregationModel[c.field]);\n return hasAgg ? 'TOTAL' : '';\n }\n const aggVal = aggregationResult[col.field];\n if (aggVal === undefined || aggVal === null) return '';\n let formatted: unknown = aggVal;\n if (col.valueFormatter) {\n formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n } else if (aggregationModel[col.field]) {\n formatted = formatAggregationValue(aggVal, aggregationModel[col.field] as string);\n }\n return String(formatted);\n });\n foot = [footRow];\n }\n }\n\n // --- Column widths ---\n const columnStyles = computeColumnStyles(exportColumns, usableWidth);\n\n const [hr, hg, hb] = hexToRgb(headerBackgroundColor);\n const [tr, tg, tb] = hexToRgb(headerTextColor);\n\n autoTable(doc, {\n head,\n body,\n ...(foot ? { foot } : {}),\n startY,\n styles: { fontSize, cellPadding: 3, font: 'helvetica', overflow: 'linebreak' },\n headStyles: {\n fillColor: [hr, hg, hb],\n textColor: [tr, tg, tb],\n fontStyle: 'bold',\n },\n ...(alternateRowColor\n ? { alternateRowStyles: { fillColor: [248, 250, 252] } }\n : {}),\n ...(foot\n ? { footStyles: { fillColor: [241, 245, 249], fontStyle: 'bold', textColor: [0, 0, 0] } }\n : {}),\n columnStyles,\n showFoot: foot ? 'lastPage' : 'never',\n showHead: 'everyPage',\n margin: { top: MARGIN, left: MARGIN, right: MARGIN, bottom: MARGIN + 6 },\n });\n\n // Two-pass page numbering — stamp all pages after the table is fully rendered\n // so each stamp reads the correct final total (not the running count during draw)\n const totalPages = doc.getNumberOfPages();\n for (let i = 1; i <= totalPages; i++) {\n doc.setPage(i);\n doc.setFontSize(8);\n doc.setTextColor(150, 150, 150);\n doc.text(\n `Page ${i} of ${totalPages}`,\n pageWidth - MARGIN,\n pageHeight - 8,\n { align: 'right' }\n );\n }\n\n doc.save(`${fileName}.pdf`);\n}\n","\nimport type { GridColDef, GridRowModel, GridAggregationModel, GridGroupedExportRow } from '../../types';\nimport { formatAggregationValue } from '../../hooks/features/useAggregation';\n\nexport interface CsvExportOptions {\n fileName?: string;\n includeHeaders?: boolean;\n delimiter?: string;\n selectedRows?: (string | number)[];\n aggregationResult?: Record<string, unknown> | null;\n aggregationModel?: GridAggregationModel | null;\n /** When provided, emits group headers, leaf rows, subtotals, and a grand total instead of a flat row list. */\n groupedRows?: GridGroupedExportRow[];\n}\n\nexport function exportToCsv<R extends GridRowModel>(\n rows: R[],\n columns: GridColDef<R>[],\n options: CsvExportOptions = {}\n): void {\n const {\n fileName = 'export.csv',\n includeHeaders = true,\n delimiter = ',',\n selectedRows,\n groupedRows,\n } = options;\n\n const exportColumns = columns.filter(col => {\n if (col.exportable === false) return false;\n if (col.field === '__check__' || col.field === '__actions__') return false;\n return true;\n });\n\n let csvContent = '';\n\n if (groupedRows && groupedRows.length > 0) {\n // Grouped export path\n if (includeHeaders) {\n csvContent += exportColumns.map(col => escapeCSV(col.headerName || col.field)).join(delimiter) + '\\n';\n }\n groupedRows.forEach(entry => {\n if (entry.type === 'group-header') {\n const indent = ' '.repeat(entry.depth);\n const label = `${indent}${entry.groupField ?? ''}: ${String(entry.groupValue ?? '')}`;\n const cells = exportColumns.map((_, i) => i === 0 ? escapeCSV(label) : '');\n csvContent += cells.join(delimiter) + '\\n';\n } else if (entry.type === 'leaf' && entry.row) {\n const row = entry.row as R;\n const indent = ' '.repeat(entry.depth);\n const cells = exportColumns.map((col, i) => {\n let value: unknown = (row as GridRowModel)[col.field];\n if (col.valueGetter) value = col.valueGetter({ row, field: col.field, value });\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n return escapeCSV((i === 0 ? indent : '') + String(value ?? ''));\n });\n csvContent += cells.join(delimiter) + '\\n';\n } else if (entry.type === 'group-subtotal' && entry.aggregatedValues) {\n const indent = ' '.repeat(entry.depth);\n const aggModel = options.aggregationModel || {};\n const cells = exportColumns.map((col, i) => {\n if (i === 0) return escapeCSV(`${indent}Subtotal`);\n const aggVal = entry.aggregatedValues![col.field];\n if (aggVal !== undefined && aggVal !== null) {\n let formatted: unknown = aggVal;\n if (col.valueFormatter) {\n formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n } else if (aggModel[col.field]) {\n formatted = formatAggregationValue(aggVal, aggModel[col.field]);\n }\n return escapeCSV(String(formatted));\n }\n return '';\n });\n csvContent += cells.join(delimiter) + '\\n';\n } else if (entry.type === 'grand-total' && entry.aggregatedValues) {\n const aggModel = options.aggregationModel || {};\n const cells = exportColumns.map((col, i) => {\n if (i === 0) return escapeCSV('Grand Total');\n const aggVal = entry.aggregatedValues![col.field];\n if (aggVal !== undefined && aggVal !== null) {\n let formatted: unknown = aggVal;\n if (col.valueFormatter) {\n formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n } else if (aggModel[col.field]) {\n formatted = formatAggregationValue(aggVal, aggModel[col.field]);\n }\n return escapeCSV(String(formatted));\n }\n return '';\n });\n csvContent += cells.join(delimiter) + '\\n';\n }\n });\n } else {\n // Flat export path (existing behavior)\n const rowsToExport = selectedRows && selectedRows.length > 0\n ? rows.filter(r => selectedRows.includes(r.id))\n : rows;\n\n if (rowsToExport.length === 0) {\n console.warn('No rows to export');\n return;\n }\n\n if (includeHeaders) {\n csvContent += exportColumns.map(col => escapeCSV(col.headerName || col.field)).join(delimiter) + '\\n';\n }\n\n rowsToExport.forEach(row => {\n const values = exportColumns.map(col => {\n let value: unknown = (row as GridRowModel)[col.field];\n if (col.valueGetter) value = col.valueGetter({ row, field: col.field, value });\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n return escapeCSV(String(value ?? ''));\n });\n csvContent += values.join(delimiter) + '\\n';\n });\n\n if (options.aggregationResult) {\n const aggResult = options.aggregationResult;\n const aggModel = options.aggregationModel || {};\n const aggLabels = exportColumns.map(col => escapeCSV(aggModel[col.field] ? aggModel[col.field].toUpperCase() : ''));\n csvContent += aggLabels.join(delimiter) + '\\n';\n const aggValues = exportColumns.map(col => {\n const aggVal = aggResult[col.field];\n if (aggVal !== undefined && aggVal !== null) {\n let formatted: unknown = aggVal;\n if (col.valueFormatter) formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n else if (aggModel[col.field]) formatted = formatAggregationValue(aggVal, aggModel[col.field]);\n return escapeCSV(String(formatted));\n }\n return '';\n });\n csvContent += aggValues.join(delimiter) + '\\n';\n }\n }\n\n downloadFile(csvContent, fileName, 'text/csv;charset=utf-8;');\n}\n\nfunction escapeCSV(value: string): string {\n if (value.includes(',') || value.includes('\"') || value.includes('\\n')) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n}\n\nexport interface ExcelExportOptions {\n fileName?: string;\n sheetName?: string;\n includeHeaders?: boolean;\n selectedRows?: (string | number)[];\n aggregationResult?: Record<string, unknown> | null;\n aggregationModel?: GridAggregationModel | null;\n /** When provided, emits group headers, leaf rows, subtotals, and a grand total instead of a flat row list. */\n groupedRows?: GridGroupedExportRow[];\n}\n\nexport function exportToExcel<R extends GridRowModel>(\n rows: R[],\n columns: GridColDef<R>[],\n options: ExcelExportOptions = {}\n): void {\n const {\n fileName = 'export.xls',\n sheetName = 'Sheet1',\n includeHeaders = true,\n selectedRows,\n groupedRows,\n } = options;\n\n const exportColumns = columns.filter(col => {\n if (col.exportable === false) return false;\n if (col.field === '__check__' || col.field === '__actions__') return false;\n return true;\n });\n\n const header = '<html xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:x=\"urn:schemas-microsoft-com:office:excel\" xmlns=\"http://www.w3.org/TR/REC-html40\">'\n + '<head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>'\n + `<x:Name>${sheetName}</x:Name>`\n + '<x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]-->'\n + '<meta charset=\"UTF-8\"></head><body><table border=\"1\">';\n\n let html = header;\n\n if (includeHeaders) {\n html += '<thead><tr>';\n exportColumns.forEach(col => { html += `<th>${escapeHTML(col.headerName || col.field)}</th>`; });\n html += '</tr></thead>';\n }\n\n html += '<tbody>';\n\n if (groupedRows && groupedRows.length > 0) {\n const aggModel = options.aggregationModel || {};\n groupedRows.forEach(entry => {\n if (entry.type === 'group-header') {\n const indent = ' '.repeat(entry.depth * 2);\n const label = `${indent}${entry.groupField ?? ''}: ${String(entry.groupValue ?? '')}`;\n html += `<tr style=\"font-weight:bold;background:#e8eaf6;\">`;\n html += `<td colspan=\"${exportColumns.length}\">${escapeHTML(label)}</td>`;\n html += '</tr>';\n } else if (entry.type === 'leaf' && entry.row) {\n const row = entry.row as R;\n const indent = ' '.repeat(entry.depth * 2);\n html += '<tr>';\n exportColumns.forEach((col, i) => {\n let value: unknown = (row as GridRowModel)[col.field];\n if (col.valueGetter) value = col.valueGetter({ row, field: col.field, value });\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n html += `<td>${escapeHTML((i === 0 ? indent : '') + String(value ?? ''))}</td>`;\n });\n html += '</tr>';\n } else if ((entry.type === 'group-subtotal' || entry.type === 'grand-total') && entry.aggregatedValues) {\n const isGrand = entry.type === 'grand-total';\n const indent = isGrand ? '' : ' '.repeat(entry.depth * 2);\n const label = isGrand ? 'Grand Total' : `${indent}Subtotal`;\n html += `<tr style=\"font-weight:bold;background:#f5f5f5;\">`;\n exportColumns.forEach((col, i) => {\n if (i === 0) { html += `<td>${escapeHTML(label)}</td>`; return; }\n const aggVal = entry.aggregatedValues![col.field];\n if (aggVal !== undefined && aggVal !== null) {\n let formatted: unknown = aggVal;\n if (col.valueFormatter) formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n else if (aggModel[col.field]) formatted = formatAggregationValue(aggVal, aggModel[col.field]);\n html += `<td style=\"text-align:right;\">${escapeHTML(String(formatted))}</td>`;\n } else {\n html += '<td></td>';\n }\n });\n html += '</tr>';\n }\n });\n } else {\n const rowsToExport = selectedRows && selectedRows.length > 0\n ? rows.filter(r => selectedRows.includes(r.id))\n : rows;\n\n if (rowsToExport.length === 0) {\n console.warn('No rows to export');\n return;\n }\n\n rowsToExport.forEach(row => {\n html += '<tr>';\n exportColumns.forEach(col => {\n let value: unknown = (row as GridRowModel)[col.field];\n if (col.valueGetter) value = col.valueGetter({ row, field: col.field, value });\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n html += `<td>${escapeHTML(String(value ?? ''))}</td>`;\n });\n html += '</tr>';\n });\n\n if (options.aggregationResult) {\n const aggResult = options.aggregationResult;\n const aggModel = options.aggregationModel || {};\n html += '<tr style=\"font-size: 11px; color: #666; background-color: #f5f5f5;\">';\n exportColumns.forEach(col => {\n html += aggModel[col.field]\n ? `<td style=\"text-align:right;font-weight:bold;\">${escapeHTML(aggModel[col.field].toUpperCase())}</td>`\n : '<td></td>';\n });\n html += '</tr><tr style=\"font-weight:bold;background-color:#f5f5f5;\">';\n exportColumns.forEach(col => {\n const aggVal = aggResult[col.field];\n if (aggVal !== undefined && aggVal !== null) {\n let formatted: unknown = aggVal;\n if (col.valueFormatter) formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n else if (aggModel[col.field]) formatted = formatAggregationValue(aggVal, aggModel[col.field]);\n html += `<td style=\"text-align:right;\">${escapeHTML(String(formatted))}</td>`;\n } else {\n html += '<td></td>';\n }\n });\n html += '</tr>';\n }\n }\n\n html += '</tbody></table></body></html>';\n downloadFile(html, fileName, 'application/vnd.ms-excel');\n}\n\nfunction escapeHTML(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\n// ============================================================================\n// JSON Export\n// ============================================================================\n\nexport interface JsonExportOptions {\n fileName?: string;\n pretty?: boolean;\n selectedRows?: (string | number)[];\n aggregationResult?: Record<string, unknown> | null;\n aggregationModel?: GridAggregationModel | null;\n /** When provided, emits a nested grouping tree instead of a flat array. */\n groupedRows?: GridGroupedExportRow[];\n}\n\n/**\n * Export data to JSON format\n */\nexport function exportToJson<R extends GridRowModel>(\n rows: R[],\n columns: GridColDef<R>[],\n options: JsonExportOptions = {}\n): void {\n const {\n fileName = 'export.json',\n pretty = true,\n selectedRows,\n groupedRows,\n } = options;\n\n const exportColumns = columns.filter(col => {\n if (col.exportable === false) return false;\n if (col.field === '__check__' || col.field === '__actions__') return false;\n return true;\n });\n\n type GroupNode = {\n group: string;\n field: string;\n value: unknown;\n rows: Record<string, unknown>[];\n subtotals?: Record<string, unknown>;\n children?: GroupNode[];\n };\n\n type JsonPayload =\n | Record<string, unknown>[]\n | { data: Record<string, unknown>[]; aggregation: { labels: Record<string, unknown>; values: Record<string, unknown> } }\n | { groups: GroupNode[]; grandTotal?: Record<string, unknown> };\n\n let outData: JsonPayload;\n\n if (groupedRows && groupedRows.length > 0) {\n // Build nested tree from the flat ordered list\n const stack: GroupNode[] = [];\n const roots: GroupNode[] = [];\n let grandTotal: Record<string, unknown> | undefined;\n\n groupedRows.forEach(entry => {\n if (entry.type === 'group-header') {\n const node: GroupNode = {\n group: `${entry.groupField ?? ''}: ${String(entry.groupValue ?? '')}`,\n field: entry.groupField ?? '',\n value: entry.groupValue,\n rows: [],\n children: [],\n };\n while (stack.length > entry.depth) stack.pop();\n if (stack.length === 0) {\n roots.push(node);\n } else {\n (stack[stack.length - 1].children ??= []).push(node);\n }\n stack.push(node);\n } else if (entry.type === 'leaf' && entry.row) {\n const row = entry.row as R;\n const obj: Record<string, unknown> = {};\n exportColumns.forEach(col => {\n let value: unknown = (row as GridRowModel)[col.field];\n if (col.valueGetter) value = col.valueGetter({ row, field: col.field, value });\n obj[col.field] = value;\n });\n if (stack.length > 0) stack[stack.length - 1].rows.push(obj);\n } else if (entry.type === 'group-subtotal' && entry.aggregatedValues && stack.length > 0) {\n stack[stack.length - 1].subtotals = { ...entry.aggregatedValues };\n stack.pop();\n } else if (entry.type === 'grand-total' && entry.aggregatedValues) {\n grandTotal = { ...entry.aggregatedValues };\n }\n });\n\n outData = grandTotal ? { groups: roots, grandTotal } : { groups: roots };\n } else {\n const rowsToExport = selectedRows && selectedRows.length > 0\n ? rows.filter(r => selectedRows.includes(r.id))\n : rows;\n\n if (rowsToExport.length === 0) {\n console.warn('No rows to export');\n return;\n }\n\n const data = rowsToExport.map(row => {\n const obj: Record<string, unknown> = {};\n exportColumns.forEach(col => {\n let value: unknown = (row as GridRowModel)[col.field];\n if (col.valueGetter) value = col.valueGetter({ row, field: col.field, value });\n obj[col.field] = value;\n });\n return obj;\n });\n\n if (options.aggregationResult) {\n const aggResult = options.aggregationResult;\n const aggModel = options.aggregationModel || {};\n const summaryLabelObj: Record<string, unknown> = {};\n exportColumns.forEach(col => { if (aggModel[col.field]) summaryLabelObj[col.field] = aggModel[col.field].toUpperCase(); });\n const summaryDataObj: Record<string, unknown> = {};\n exportColumns.forEach(col => {\n if (aggResult[col.field] !== undefined && aggResult[col.field] !== null) {\n let aggVal: unknown = aggResult[col.field];\n if (col.valueFormatter) aggVal = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n else if (aggModel[col.field]) aggVal = formatAggregationValue(aggVal, aggModel[col.field]);\n summaryDataObj[col.field] = aggVal;\n }\n });\n outData = { data, aggregation: { labels: summaryLabelObj, values: summaryDataObj } };\n } else {\n outData = data;\n }\n }\n\n downloadFile(pretty ? JSON.stringify(outData, null, 2) : JSON.stringify(outData), fileName, 'application/json;charset=utf-8;');\n}\n\n// ============================================================================\n// Print\n// ============================================================================\n\nexport interface PrintOptions {\n title?: string;\n selectedRows?: (string | number)[];\n aggregationResult?: Record<string, unknown> | null;\n aggregationModel?: GridAggregationModel | null;\n /** When provided, emits group headers, leaf rows, subtotals, and a grand total instead of a flat row list. */\n groupedRows?: GridGroupedExportRow[];\n}\n\n/**\n * Open print dialog with formatted table\n */\nexport async function printGrid<R extends GridRowModel>(\n rows: R[],\n columns: GridColDef<R>[],\n titleOrOptions?: string | PrintOptions\n): Promise<void> {\n // 1. Open window immediately to resolve user activation constraints and provide feedback\n const printWindow = window.open('', '_blank');\n\n if (!printWindow) {\n console.error('Failed to open print window. Please check your popup blocker settings.');\n return;\n }\n\n // 2. Show loading state\n printWindow.document.write(`\n <!DOCTYPE html>\n <html>\n <head>\n <title>Preparing Print...</title>\n <style>\n body { font-family: sans-serif; height: 100vh; display: flex; align-items: center; justify-content: center; margin: 0; background: #f5f5f5; }\n .loader { text-align: center; }\n .spinner { border: 4px solid #f3f3f3; border-top: 4px solid #3498db; border-radius: 50%; width: 40px; height: 40px; animation: spin 1s linear infinite; margin: 0 auto 20px; }\n @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }\n </style>\n </head>\n <body>\n <div class=\"loader\">\n <div class=\"spinner\"></div>\n <h2>Generating Print Preview...</h2>\n <p>Processing data, please wait.</p>\n </div>\n </body>\n </html>\n `);\n printWindow.document.close();\n\n // 3. Yield to main thread to allow the new window to render its loading state\n await new Promise(resolve => setTimeout(resolve, 100));\n\n try {\n let title = 'Print';\n let selectedRows: (string | number)[] | undefined;\n let aggregationResult: Record<string, unknown> | null = null;\n let aggregationModel: GridAggregationModel | null = null;\n\n let groupedRows: GridGroupedExportRow[] | undefined;\n\n if (typeof titleOrOptions === 'string') {\n title = titleOrOptions;\n } else if (typeof titleOrOptions === 'object') {\n title = titleOrOptions.title || 'Print';\n selectedRows = titleOrOptions.selectedRows;\n aggregationResult = titleOrOptions.aggregationResult || null;\n aggregationModel = titleOrOptions.aggregationModel || null;\n groupedRows = titleOrOptions.groupedRows;\n }\n\n const exportColumns = columns.filter(col => {\n if (col.exportable === false) return false;\n if (col.field === '__check__' || col.field === '__actions__') return false;\n return true;\n });\n\n let html = `<!DOCTYPE html><html><head><title>${title || 'Print'}</title><style>\n body{font-family:Arial,sans-serif;margin:20px;}\n h1{font-size:24px;margin-bottom:20px;}\n table{border-collapse:collapse;width:100%;}\n th,td{border:1px solid #ddd;padding:8px;text-align:left;}\n th{background-color:#f5f5f5;font-weight:bold;}\n tr:nth-child(even){background-color:#f9f9f9;}\n .group-header{background:#e8eaf6;font-weight:bold;}\n .group-subtotal{background:#f0f4ff;font-style:italic;}\n .grand-total{background:#f5f5f5;font-weight:bold;}\n @media print{body{margin:0;}@page{margin:1cm;}}\n </style></head><body>`;\n\n if (title) html += `<h1>${escapeHTML(title)}</h1>`;\n html += '<table><thead><tr>';\n exportColumns.forEach(col => { html += `<th>${escapeHTML(col.headerName || col.field)}</th>`; });\n html += '</tr></thead><tbody>';\n\n if (groupedRows && groupedRows.length > 0) {\n const aggModel = aggregationModel || {};\n groupedRows.forEach(entry => {\n if (entry.type === 'group-header') {\n const indent = ' '.repeat(entry.depth * 4);\n const label = `${indent}${escapeHTML(entry.groupField ?? '')}: ${escapeHTML(String(entry.groupValue ?? ''))}`;\n html += `<tr class=\"group-header\"><td colspan=\"${exportColumns.length}\">${label}</td></tr>`;\n } else if (entry.type === 'leaf' && entry.row) {\n const row = entry.row as R;\n const indent = ' '.repeat(entry.depth * 4);\n html += '<tr>';\n exportColumns.forEach((col, i) => {\n let value: unknown = (row as GridRowModel)[col.field];\n if (col.valueGetter) value = col.valueGetter({ row, field: col.field, value });\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n if (col.type === 'image' && value) {\n html += `<td><img src=\"${value}\" style=\"max-height:40px;border-radius:4px;\"></td>`;\n } else {\n html += `<td>${(i === 0 ? indent : '') + escapeHTML(String(value ?? ''))}</td>`;\n }\n });\n html += '</tr>';\n } else if ((entry.type === 'group-subtotal' || entry.type === 'grand-total') && entry.aggregatedValues) {\n const isGrand = entry.type === 'grand-total';\n const indent = isGrand ? '' : ' '.repeat(entry.depth * 4);\n const label = isGrand ? 'Grand Total' : `${indent}Subtotal`;\n const cls = isGrand ? 'grand-total' : 'group-subtotal';\n html += `<tr class=\"${cls}\">`;\n exportColumns.forEach((col, i) => {\n if (i === 0) { html += `<td>${label}</td>`; return; }\n const aggVal = entry.aggregatedValues![col.field];\n if (aggVal !== undefined && aggVal !== null) {\n let formatted: unknown = aggVal;\n if (col.valueFormatter) formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n else if (aggModel[col.field]) formatted = formatAggregationValue(aggVal, aggModel[col.field]);\n html += `<td style=\"text-align:right;\">${escapeHTML(String(formatted))}</td>`;\n } else {\n html += '<td></td>';\n }\n });\n html += '</tr>';\n }\n });\n } else {\n const rowsToExport = selectedRows && selectedRows.length > 0\n ? rows.filter(r => selectedRows.includes(r.id))\n : rows;\n\n if (rowsToExport.length === 0) {\n printWindow.document.body.innerHTML = '<h3>No rows to export</h3>';\n return;\n }\n\n rowsToExport.forEach(row => {\n html += '<tr>';\n exportColumns.forEach(col => {\n let value: unknown = (row as GridRowModel)[col.field];\n if (col.valueGetter) value = col.valueGetter({ row, field: col.field, value });\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n if (col.type === 'image' && value) {\n html += `<td><div style=\"display:flex;justify-content:center;\"><img src=\"${value}\" alt=\"${col.headerName}\" style=\"max-height:40px;border-radius:4px;\"></div></td>`;\n } else {\n html += `<td>${escapeHTML(String(value ?? ''))}</td>`;\n }\n });\n html += '</tr>';\n });\n\n if (aggregationResult) {\n const aggModel = aggregationModel || {};\n html += '<tfoot><tr style=\"font-size:11px;color:#666;background-color:#f5f5f5;\">';\n exportColumns.forEach(col => {\n html += aggModel[col.field]\n ? `<td style=\"text-align:right;font-weight:bold;\">${escapeHTML(aggModel[col.field].toUpperCase())}</td>`\n : '<td></td>';\n });\n html += '</tr><tr style=\"font-weight:bold;background-color:#f5f5f5;\">';\n exportColumns.forEach(col => {\n const aggVal = aggregationResult![col.field];\n if (aggVal !== undefined && aggVal !== null) {\n let formatted: unknown = aggVal;\n if (col.valueFormatter) formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n else if (aggModel[col.field]) formatted = formatAggregationValue(aggVal, aggModel[col.field]);\n html += `<td style=\"text-align:right;\">${escapeHTML(String(formatted))}</td>`;\n } else {\n html += '<td></td>';\n }\n });\n html += '</tr></tfoot>';\n }\n }\n\n html += '</tbody></table></body></html>';\n\n // Write the HTML content\n printWindow.document.open();\n printWindow.document.write(html);\n printWindow.document.close();\n\n // Set the document title explicitly (fixes about:blank issue)\n printWindow.document.title = title || 'Print Preview';\n\n printWindow.focus();\n\n let hasPrinted = false;\n\n printWindow.onload = () => {\n if (!hasPrinted) {\n hasPrinted = true;\n printWindow.print();\n\n setTimeout(() => {\n printWindow.close();\n }, 100);\n }\n };\n\n setTimeout(() => {\n if (!hasPrinted && printWindow && !printWindow.closed) {\n hasPrinted = true;\n printWindow.print();\n setTimeout(() => {\n if (!printWindow.closed) printWindow.close();\n }, 100);\n }\n }, 500);\n\n } catch (e) {\n console.error('Print generation failed:', e);\n if (printWindow && !printWindow.closed) {\n const message = e instanceof Error ? e.message : String(e);\n printWindow.document.body.innerHTML = `<div style=\"color: red; padding: 20px;\"><h3>Error Generating Print Preview</h3><p>${message}</p></div>`;\n }\n }\n}\n\nfunction downloadFile(content: string, fileName: string, mimeType: string): void {\n const blob = new Blob([content], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = fileName;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n}\n\nexport { exportToPdf } from './exportToPdf';\nexport type { PdfExportOptions } from '../../types';\n","\nimport type { GridColDef, GridRowModel, GridAggregationModel } from '../../types';\nimport { formatAggregationValue } from '../../hooks/features/useAggregation';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface ExcelColumnStyle {\n /** Numeric format string, e.g. '$#,##0.00', '0.00%', 'yyyy-mm-dd' */\n numFmt?: string;\n /** Override column width (characters). Defaults to colDef.width / 7 */\n width?: number;\n /** Horizontal alignment override */\n alignment?: 'left' | 'center' | 'right';\n /**\n * If true, the cell value (expected to be an image URL string) will be\n * fetched and embedded as an inline image in the cell.\n * Requires the image server to serve CORS headers. Falls back to the\n * raw URL string if the fetch fails (a warning is logged to the console).\n */\n embedImage?: boolean;\n /** Width of the embedded image in pixels (default: 40) */\n imageWidth?: number;\n /** Height of the embedded image in pixels (default: 40) */\n imageHeight?: number;\n}\n\nexport interface ExcelSheetDefinition {\n /** Sheet tab name (max 31 chars) */\n name: string;\n /** Which rows to include. Default: 'all' */\n rows?: 'all' | 'selected';\n /** Include header row. Default: true */\n includeHeaders?: boolean;\n /** Include aggregation totals row at the bottom. Default: false */\n includeSummary?: boolean;\n /** Auto-filter dropdowns on header row. Default: true */\n autoFilter?: boolean;\n /** Freeze the header row. Default: true */\n frozenHeader?: boolean;\n /** Alternate row fill (#hex). Pass false to disable. Default: '#f8fafc' */\n alternateRowColor?: string | false;\n}\n\nexport interface ExcelAdvancedExportOptions {\n /** Output filename (default: 'export.xlsx') */\n fileName?: string;\n /**\n * Sheet definitions. If omitted, a single 'Data' sheet is created\n * with all rows.\n *\n * Built-in special sheet type: `{ type: 'summary' }` renders a\n * standalone aggregation sheet.\n */\n sheets?: (ExcelSheetDefinition | { type: 'summary'; name?: string })[]; \n /** Per-column style overrides, keyed by field name */\n columnStyles?: Record<string, ExcelColumnStyle>;\n /** Header row fill color (default: '#f1f5f9') */\n headerFillColor?: string;\n /** Header row text color (default: '#334155') */\n headerTextColor?: string;\n /** Header row font size (default: 10) */\n headerFontSize?: number;\n /** Body font size (default: 10) */\n bodyFontSize?: number;\n /** Current aggregation result */\n aggregationResult?: Record<string, unknown> | null;\n /** Current aggregation model */\n aggregationModel?: GridAggregationModel | null;\n /** Currently selected row IDs */\n selectedRows?: (string | number)[];\n}\n\n// ─── Cell type inference ──────────────────────────────────────────────────────\n\nfunction inferCellType(colDef: GridColDef<GridRowModel>, value: unknown): 'number' | 'boolean' | 'date' | 'string' {\n if (colDef.type === 'number') return 'number';\n if (colDef.type === 'boolean') return 'boolean';\n if (colDef.type === 'date') return 'date';\n if (typeof value === 'number') return 'number';\n if (typeof value === 'boolean') return 'boolean';\n if (value instanceof Date) return 'date';\n return 'string';\n}\n\n// ─── Default numFmt per column type ──────────────────────────────────────────\n\nfunction defaultNumFmt(colDef: GridColDef<GridRowModel>): string | undefined {\n if (colDef.type === 'number') return '#,##0.##';\n if (colDef.type === 'date') return 'yyyy-mm-dd';\n return undefined;\n}\n\n// ─── Column display width (chars) ────────────────────────────────────────────\n\nfunction colWidth(colDef: GridColDef<GridRowModel>, override?: number): number {\n if (override != null) return override;\n const px = (colDef.width ?? 120) as number;\n return Math.min(60, Math.max(8, (px - 5) / 7));\n}\n\n// ─── Image helpers ────────────────────────────────────────────────────────────\n\ntype SupportedImageExt = 'png' | 'jpeg' | 'gif';\n\nfunction imageExtension(url: string, contentType?: string | null): SupportedImageExt {\n const ct = contentType ?? '';\n if (ct.includes('jpeg') || ct.includes('jpg')) return 'jpeg';\n if (ct.includes('gif')) return 'gif';\n const path = url.split('?')[0].toLowerCase();\n if (path.endsWith('.jpg') || path.endsWith('.jpeg')) return 'jpeg';\n if (path.endsWith('.gif')) return 'gif';\n return 'png';\n}\n\n/**\n * Fetch a list of image URLs in parallel.\n * CORS failures are logged and skipped — raw URL text is written to the cell\n * instead so data is never silently lost.\n */\nasync function fetchImages(\n urls: string[]\n): Promise<Map<string, { buffer: ArrayBuffer; extension: SupportedImageExt }>> {\n const settled = await Promise.allSettled(\n urls.map(async (url) => {\n // ── data: URI — decode base64 directly, no network needed ──────────\n if (url.startsWith('data:')) {\n const commaIdx = url.indexOf(',');\n const header = url.slice(0, commaIdx);\n const b64 = url.slice(commaIdx + 1);\n const binary = atob(b64);\n const uint8 = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) uint8[i] = binary.charCodeAt(i);\n const mimeMatch = header.match(/data:([^;,]+)/);\n const mime = mimeMatch?.[1] ?? 'image/png';\n let ext: SupportedImageExt = 'png';\n if (mime.includes('jpeg') || mime.includes('jpg')) ext = 'jpeg';\n else if (mime.includes('gif')) ext = 'gif';\n return { url, buffer: uint8.buffer as ArrayBuffer, ext };\n }\n\n // ── Remote URL — fetch with CORS ──────────────────────────────────\n const res = await fetch(url, { mode: 'cors' });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const buffer = await res.arrayBuffer();\n const ext = imageExtension(url, res.headers.get('content-type'));\n return { url, buffer, ext };\n })\n );\n const map = new Map<string, { buffer: ArrayBuffer; extension: SupportedImageExt }>();\n settled.forEach((result, i) => {\n if (result.status === 'fulfilled') {\n map.set(result.value.url, { buffer: result.value.buffer, extension: result.value.ext });\n } else {\n console.warn(\n `[exportToExcelAdvanced] Cannot embed image \"${urls[i]}\" ` +\n `(CORS/network error — raw URL written as fallback):`,\n result.reason\n );\n }\n });\n return map;\n}\n\n// ─── Main export function ─────────────────────────────────────────────────────\n\n/**\n * Export the grid data to a real XLSX file using ExcelJS.\n * Supports: typed cells, styled headers, column widths, frozen rows,\n * auto-filter, alternating row colors, aggregation totals, and multi-sheet.\n *\n * ExcelJS is loaded lazily so it does not affect bundle size for apps\n * that only use CSV/JSON export.\n */\nexport async function exportToExcelAdvanced<R extends GridRowModel>(\n rows: R[],\n columns: GridColDef<R>[],\n options: ExcelAdvancedExportOptions = {}\n): Promise<void> {\n const {\n fileName = 'export.xlsx',\n sheets: sheetDefs,\n columnStyles = {},\n headerFillColor = '#f1f5f9',\n headerTextColor = '#334155',\n headerFontSize = 10,\n bodyFontSize = 10,\n aggregationResult = null,\n aggregationModel = null,\n selectedRows,\n } = options;\n\n // Lazy-load ExcelJS to keep initial bundle lean\n const ExcelJS = (await import('exceljs')).default;\n const workbook = new ExcelJS.Workbook();\n workbook.creator = 'OpenGridX';\n workbook.created = new Date();\n\n // Filter system columns\n const exportColumns: GridColDef<GridRowModel>[] = (columns as unknown as GridColDef<GridRowModel>[]).filter(col =>\n col.exportable !== false &&\n col.field !== '__check__' &&\n col.field !== '__actions__' &&\n !col.isSpacer\n );\n\n const allRows: GridRowModel[] = rows as GridRowModel[];\n const sRows: GridRowModel[] = (selectedRows && selectedRows.length > 0\n ? rows.filter(r => selectedRows.includes(r.id))\n : rows) as GridRowModel[];\n\n // Normalise sheet definitions\n const resolvedSheets: (ExcelSheetDefinition | { type: 'summary'; name?: string })[] =\n sheetDefs ?? [{ name: 'Data', rows: 'all', includeHeaders: true, includeSummary: false }];\n\n // Workbook-level image cache — one fetch per URL, reused across multiple sheets\n const imageCache = new Map<string, number>();\n\n // ─── Build each sheet ────────────────────────────────────────────────────\n\n for (const sheetDef of resolvedSheets) {\n\n // ── Summary-only sheet ───────────────────────────────────────────────\n if ('type' in sheetDef && sheetDef.type === 'summary') {\n if (!aggregationResult || !aggregationModel) continue;\n const ws = workbook.addWorksheet(sheetDef.name ?? 'Summary');\n\n // Title row\n ws.addRow(['Summary / Aggregation Totals']);\n ws.getRow(1).font = { bold: true, size: headerFontSize + 2, color: { argb: argb(headerTextColor) } };\n ws.addRow([]);\n\n // Header: Field | Function | Value\n const hdr = ws.addRow(['Column', 'Function', 'Value']);\n hdr.eachCell(cell => {\n cell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: argb(headerFillColor) } };\n cell.font = { bold: true, size: headerFontSize, color: { argb: argb(headerTextColor) } };\n cell.border = bottomBorder();\n });\n\n exportColumns.forEach(col => {\n const fn = aggregationModel![col.field];\n const val = aggregationResult![col.field];\n if (fn == null || val == null) return;\n let formatted = val;\n if (col.valueFormatter) {\n formatted = col.valueFormatter({ value: val, row: {} as R, field: col.field });\n } else {\n formatted = formatAggregationValue(val, fn);\n }\n const row = ws.addRow([col.headerName ?? col.field, fn.toUpperCase(), formatted]);\n row.getCell(3).alignment = { horizontal: 'right' };\n row.getCell(3).font = { bold: true, size: bodyFontSize };\n });\n\n ws.getColumn(1).width = 20;\n ws.getColumn(2).width = 12;\n ws.getColumn(3).width = 18;\n continue;\n }\n\n // ── Data sheet ───────────────────────────────────────────────────────\n const def = sheetDef as ExcelSheetDefinition;\n const {\n name = 'Data',\n rows: rowScope = 'all',\n includeHeaders = true,\n includeSummary = false,\n autoFilter = true,\n frozenHeader = true,\n alternateRowColor = '#f8fafc',\n } = def;\n\n const rowsToExport = rowScope === 'selected' ? sRows : allRows;\n\n // ─ Pre-fetch images for this sheet ──────────────────────────────────────────\n const imageColumns = exportColumns.filter(col => columnStyles[col.field]?.embedImage);\n if (imageColumns.length > 0) {\n const urlsNeeded: string[] = [];\n const seen = new Set<string>();\n rowsToExport.forEach(row => {\n imageColumns.forEach(col => {\n const val = row[col.field];\n if (typeof val === 'string' && val && !imageCache.has(val) && !seen.has(val)) {\n urlsNeeded.push(val);\n seen.add(val);\n }\n });\n });\n if (urlsNeeded.length > 0) {\n const fetched = await fetchImages(urlsNeeded);\n for (const [url, { buffer, extension }] of fetched) {\n const imgId = workbook.addImage({ buffer, extension });\n imageCache.set(url, imgId);\n }\n }\n }\n\n const ws = workbook.addWorksheet(name);\n\n // ── Set column definitions ───────────────────────────────────────────\n ws.columns = exportColumns.map(col => ({\n key: col.field,\n width: colWidth(col, columnStyles[col.field]?.width),\n style: {\n numFmt: columnStyles[col.field]?.numFmt ?? defaultNumFmt(col),\n }\n }));\n\n // ── Header row ───────────────────────────────────────────────────────\n if (includeHeaders) {\n const headerValues = exportColumns.map(col => col.headerName ?? col.field);\n const headerRow = ws.addRow(headerValues);\n headerRow.height = 20;\n\n headerRow.eachCell((cell, colIndex) => {\n const colDef = exportColumns[colIndex - 1];\n cell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: argb(headerFillColor) } };\n cell.font = { bold: true, size: headerFontSize, color: { argb: argb(headerTextColor) } };\n cell.alignment = {\n horizontal: columnStyles[colDef?.field]?.alignment ??\n (colDef?.type === 'number' ? 'right' : 'left'),\n vertical: 'middle'\n };\n cell.border = bottomBorder();\n });\n\n if (autoFilter) {\n ws.autoFilter = {\n from: { row: 1, column: 1 },\n to: { row: 1, column: exportColumns.length }\n };\n }\n\n if (frozenHeader) {\n ws.views = [{ state: 'frozen', ySplit: 1, showGridLines: false }];\n } else {\n ws.views = [{ showGridLines: false }];\n }\n }\n\n // ── Data rows ────────────────────────────────────────────────────────\n // ExcelJS addImage tl.row is 0-based.\n // Header occupies index 0 when present; first data row is at index 1.\n let excelRowIdx = includeHeaders ? 1 : 0;\n\n rowsToExport.forEach((row, rowIdx) => {\n const cellValues = exportColumns.map(col => {\n // Image columns: write empty string; image placed below\n if (columnStyles[col.field]?.embedImage) return '';\n\n let value: unknown = row[col.field];\n if (col.valueGetter) {\n value = col.valueGetter({ row, field: col.field, value });\n }\n const cellType = inferCellType(col, value);\n if (cellType === 'string' && col.valueFormatter && value != null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n return value;\n });\n\n const dataRow = ws.addRow(cellValues);\n dataRow.font = { size: bodyFontSize };\n\n // Alternate row background\n if (alternateRowColor && rowIdx % 2 === 1) {\n dataRow.eachCell(cell => {\n cell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: argb(alternateRowColor) } };\n });\n }\n\n // Per-cell alignment and explicit web-like borders\n dataRow.eachCell((cell, colIndex) => {\n const colDef = exportColumns[colIndex - 1];\n if (!colDef) return;\n cell.alignment = {\n horizontal: columnStyles[colDef.field]?.alignment ?? (colDef.type === 'number' ? 'right' : 'left'),\n vertical: 'middle',\n };\n cell.border = { bottom: { style: 'thin', color: { argb: 'FFf1f5f9' } } }; // Slate 50\n });\n\n // ── Embed images for this row ─────────────────────────────────────\n //\n // ExcelJS images are floating objects anchored at tl.{col,row}.\n // Both values accept fractions (0–1 represents one cell length).\n // Adding an offset fraction shifts the anchor rightward / downward,\n // letting us centre the image inside its cell.\n\n if (imageColumns.length > 0) {\n // Pre-compute the final row height so vertical centring is exact.\n const maxImgH = imageColumns.reduce((max, col) => {\n return Math.max(max, columnStyles[col.field]?.imageHeight ?? 40);\n }, 0);\n // ExcelJS row height = points; 1 pt ≈ 1.333 px at 96 dpi\n const rowHeightPt = Math.ceil(maxImgH / 1.333);\n const rowHeightPx = rowHeightPt * 1.333;\n dataRow.height = rowHeightPt;\n\n imageColumns.forEach(col => {\n const colIdx = exportColumns.indexOf(col);\n const url = row[col.field];\n const imgId = typeof url === 'string' ? imageCache.get(url) : undefined;\n\n if (imgId === undefined) {\n // Fetch failed — write URL text so data isn't lost\n dataRow.getCell(colIdx + 1).value = typeof url === 'string' ? url : '';\n return;\n }\n\n const style = columnStyles[col.field];\n const imgW = style?.imageWidth ?? 40;\n const imgH = style?.imageHeight ?? 40;\n\n // ── Horizontal centre within the column ───────────────────\n // ws.getColumn uses 1-based index; width is in Excel \"chars\".\n // Excel column width in pixels for Calibri 11 (MaxDigitWidth=7, Padding=5).\n const colWidthChars = (ws.getColumn(colIdx + 1).width ?? 8) as number;\n const colWidthPx = colWidthChars * 7 + 5;\n const hGapPx = Math.max(0, colWidthPx - imgW) / 2;\n\n // ── Vertical centre within the row ────────────────────────\n const vGapPx = Math.max(0, rowHeightPx - imgH) / 2;\n\n // ExcelJS native offsets are in EMUs (1 pixel = 9525 EMUs).\n // This provides absolute pixel precision regardless of cell size.\n ws.addImage(imgId, {\n tl: {\n col: colIdx,\n row: excelRowIdx,\n nativeColOff: Math.floor(hGapPx * 9525),\n nativeRowOff: Math.floor(vGapPx * 9525),\n },\n ext: { width: imgW, height: imgH },\n editAs: 'oneCell',\n } as unknown as import('exceljs').ImageRange);\n });\n } else {\n dataRow.height = 16;\n }\n\n excelRowIdx++;\n });\n\n // ── Aggregation totals row ────────────────────────────────────────────\n if (includeSummary && aggregationResult && aggregationModel) {\n // Label row\n const labelValues = exportColumns.map(col => {\n const fn = aggregationModel![col.field];\n return fn ? fn.toUpperCase() : '';\n });\n const labelRow = ws.addRow(labelValues);\n labelRow.height = 16;\n labelRow.font = { size: bodyFontSize - 1, italic: true, color: { argb: 'FF94a3b8' } };\n labelRow.eachCell(cell => {\n cell.alignment = { horizontal: 'right', vertical: 'middle' };\n cell.border = { top: { style: 'thin', color: { argb: 'FFcbd5e1' } } };\n });\n\n // Value row\n const totalValues = exportColumns.map(col => {\n const fn = aggregationModel![col.field];\n const val = aggregationResult![col.field];\n if (fn == null || val == null) return '';\n if (col.valueFormatter) {\n return col.valueFormatter({ value: val, row: {} as R, field: col.field });\n }\n return formatAggregationValue(val, fn);\n });\n const totalRow = ws.addRow(totalValues);\n totalRow.height = 18;\n totalRow.font = { bold: true, size: bodyFontSize, color: { argb: argb(headerTextColor) } };\n totalRow.eachCell(cell => {\n cell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: argb(headerFillColor) } };\n cell.alignment = { horizontal: 'right', vertical: 'middle' };\n cell.border = topBorder();\n });\n }\n }\n\n // ─── Write & download ────────────────────────────────────────────────────\n const buffer = await workbook.xlsx.writeBuffer();\n const blob = new Blob([buffer], {\n type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\n });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = fileName.endsWith('.xlsx') ? fileName : `${fileName}.xlsx`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\n/** Convert '#rrggbb' or '#rgb' to ExcelJS ARGB 'FFrrggbb' */\nfunction argb(hex: string): string {\n const clean = hex.replace('#', '');\n if (clean.length === 3) {\n return 'FF' + clean.split('').map(c => c + c).join('');\n }\n if (clean.length === 6) {\n return 'FF' + clean;\n }\n return 'FF' + clean.padEnd(6, '0');\n}\n\nfunction bottomBorder(): Partial<import('exceljs').Borders> {\n return { bottom: { style: 'medium', color: { argb: 'FFcbd5e1' } } };\n}\n\nfunction topBorder(): Partial<import('exceljs').Borders> {\n return { top: { style: 'medium', color: { argb: 'FFcbd5e1' } } };\n}\n","import React from 'react';\nimport type { GridTheme } from './types';\n\nconst lightBase: Record<string, string> = {\n\n '--ogx-color-primary': '#3b82f6',\n '--ogx-color-primary-dark': '#2563eb',\n '--ogx-color-primary-light': '#eff6ff',\n '--ogx-color-primary-focus': 'rgba(59, 130, 246, 0.5)',\n\n '--ogx-color-secondary': '#8b5cf6',\n '--ogx-color-secondary-dark': '#7c3aed',\n '--ogx-color-secondary-light': '#f5f3ff',\n\n '--ogx-color-white': '#ffffff',\n '--ogx-color-black': '#0f172a',\n\n '--ogx-border-color': '#e2e8f0',\n '--ogx-border-color-hover': '#cbd5e1',\n\n '--ogx-shadow-sm': '0 1px 2px 0 rgba(0, 0, 0, 0.05)',\n '--ogx-shadow-md': '0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03)',\n '--ogx-shadow-lg': '0 10px 15px -3px rgba(0, 0, 0, 0.05), 0 4px 6px -2px rgba(0, 0, 0, 0.02)',\n\n '--ogx-grid-background': '#ffffff',\n '--ogx-grid-border-color': '#e2e8f0',\n '--ogx-grid-header-background': '#f8fafc',\n '--ogx-grid-header-text': '#334155',\n '--ogx-grid-header-hover-background': '#f1f5f9',\n '--ogx-grid-header-sorted-background': '#f8fafc',\n '--ogx-grid-row-text': '#1e293b',\n '--ogx-grid-row-hover-background': '#f8fafc',\n '--ogx-grid-row-alternate-background': 'transparent',\n '--ogx-grid-row-selected-background': '#eff6ff',\n '--ogx-grid-row-selected-hover-background': '#dbeafe',\n '--ogx-grid-cell-focus-border': '#3b82f6',\n\n '--ogx-checkbox-bg': '#ffffff',\n '--ogx-checkbox-border': '#94a3b8',\n\n '--ogx-grid-pinned-left-shadow': '4px 0 24px -4px rgba(0, 0, 0, 0.05)',\n '--ogx-grid-pinned-right-shadow': '-4px 0 24px -4px rgba(0, 0, 0, 0.05)',\n\n // Toolbars\n '--ogx-toolbar-background': 'transparent',\n '--ogx-toolbar-text': '#1e293b',\n '--ogx-toolbar-border': '#e2e8f0',\n '--ogx-toolbar-btn-bg': 'transparent',\n '--ogx-toolbar-btn-hover': '#f1f5f9',\n '--ogx-toolbar-btn-text': '#334155',\n '--ogx-toolbar-btn-primary-bg': '#3b82f6',\n '--ogx-toolbar-btn-primary-hover': '#2563eb',\n '--ogx-toolbar-btn-primary-text': '#ffffff',\n '--ogx-toolbar-btn-danger-bg': 'rgba(239, 68, 68, 0.08)',\n '--ogx-toolbar-btn-danger-hover': 'rgba(239, 68, 68, 0.15)',\n '--ogx-toolbar-btn-danger-text': '#ef4444',\n '--ogx-toolbar-input-bg': '#ffffff',\n '--ogx-toolbar-input-text': '#1e293b',\n '--ogx-toolbar-input-border': '#cbd5e1',\n '--ogx-toolbar-input-focus-border': '#3b82f6',\n '--ogx-toolbar-input-focus-shadow': '0 0 0 3px rgba(59, 130, 246, 0.12)',\n '--ogx-toolbar-chip-bg': '#f1f5f9',\n '--ogx-toolbar-chip-text': '#475569',\n '--ogx-toolbar-chip-active-bg': 'rgba(59, 130, 246, 0.12)',\n '--ogx-toolbar-chip-active-text': '#2563eb',\n\n // Overlays & Menus\n '--ogx-overlay-background': '#ffffff',\n '--ogx-overlay-text': '#1e293b',\n '--ogx-overlay-border': '#e2e8f0',\n '--ogx-overlay-shadow': '0 4px 6px -1px rgba(0,0,0,0.08), 0 2px 4px -1px rgba(0,0,0,0.06), 0 0 0 1px rgba(0,0,0,0.06)',\n '--ogx-overlay-item-hover-bg': '#f8fafc',\n '--ogx-overlay-item-hover-text': '#0f172a',\n '--ogx-overlay-item-selected-bg': 'rgba(59, 130, 246, 0.08)',\n '--ogx-overlay-item-selected-text': '#2563eb',\n '--ogx-overlay-item-danger-bg': 'rgba(239, 68, 68, 0.08)',\n '--ogx-overlay-item-danger-text': '#ef4444',\n\n // Scrollbars\n '--ogx-scrollbar-thumb': 'rgba(148, 163, 184, 0.5)',\n '--ogx-scrollbar-track': 'transparent',\n '--ogx-scrollbar-size': '10px',\n\n // Skeletons\n '--ogx-skeleton-base': '#f1f5f9',\n '--ogx-skeleton-highlight': '#ffffff',\n '--ogx-skeleton-dark-base': '#e2e8f0',\n '--ogx-skeleton-dark-highlight': '#f8fafc',\n};\n\nfunction themeToCSS(theme: GridTheme): Record<string, string> {\n const vars: Record<string, string> = {};\n\n function set(cssVar: string, value: string | undefined) {\n if (value !== undefined) {\n vars[cssVar] = value;\n }\n }\n\n if (theme.colors) {\n const c = theme.colors;\n set('--ogx-color-primary', c.primary);\n set('--ogx-color-primary-dark', c.primaryDark);\n set('--ogx-color-primary-light', c.primaryLight);\n set('--ogx-color-primary-focus', c.primaryFocus);\n set('--ogx-color-secondary', c.secondary);\n set('--ogx-color-secondary-dark', c.secondaryDark);\n set('--ogx-color-secondary-light', c.secondaryLight);\n set('--ogx-color-success', c.success);\n set('--ogx-color-warning', c.warning);\n set('--ogx-color-error', c.error);\n set('--ogx-color-info', c.info);\n }\n\n if (theme.typography) {\n const t = theme.typography;\n set('--ogx-font-family', t.fontFamily);\n set('--ogx-font-family-mono', t.fontFamilyMono);\n set('--ogx-font-size-xs', t.fontSizeXs);\n set('--ogx-font-size-sm', t.fontSizeSm);\n set('--ogx-font-size-md', t.fontSizeMd);\n set('--ogx-font-size-lg', t.fontSizeLg);\n set('--ogx-font-size-xl', t.fontSizeXl);\n }\n\n if (theme.spacing) {\n const s = theme.spacing;\n set('--ogx-spacing-xs', s.xs);\n set('--ogx-spacing-sm', s.sm);\n set('--ogx-spacing-md', s.md);\n set('--ogx-spacing-lg', s.lg);\n set('--ogx-spacing-xl', s.xl);\n set('--ogx-spacing-xxl', s.xxl);\n }\n\n if (theme.borders) {\n const b = theme.borders;\n set('--ogx-border-width-thin', b.widthThin);\n set('--ogx-border-width-medium', b.widthMedium);\n set('--ogx-border-width-thick', b.widthThick);\n set('--ogx-border-radius-sm', b.radiusSm);\n set('--ogx-border-radius-md', b.radiusMd);\n set('--ogx-border-radius-lg', b.radiusLg);\n set('--ogx-border-radius-xl', b.radiusXl);\n set('--ogx-border-color', b.color);\n set('--ogx-border-color-hover', b.colorHover);\n }\n\n if (theme.shadows) {\n const sh = theme.shadows;\n set('--ogx-shadow-sm', sh.sm);\n set('--ogx-shadow-md', sh.md);\n set('--ogx-shadow-lg', sh.lg);\n set('--ogx-shadow-xl', sh.xl);\n }\n\n if (theme.grid) {\n const g = theme.grid;\n set('--ogx-grid-row-height-compact', g.rowHeightCompact);\n set('--ogx-grid-row-height-standard', g.rowHeightStandard);\n set('--ogx-row-height', g.rowHeightStandard);\n set('--ogx-grid-row-height-comfortable', g.rowHeightComfortable);\n set('--ogx-grid-header-height', g.headerHeight);\n set('--ogx-header-height', g.headerHeight);\n set('--ogx-grid-cell-padding-x', g.cellPaddingX);\n set('--ogx-grid-cell-padding-y', g.cellPaddingY);\n set('--ogx-grid-background', g.background);\n set('--ogx-grid-border-color', g.borderColor);\n set('--ogx-grid-header-background', g.headerBackground);\n set('--ogx-grid-header-text', g.headerText);\n set('--ogx-grid-header-hover-background', g.headerHoverBackground);\n set('--ogx-grid-header-sorted-background', g.headerSortedBackground);\n set('--ogx-grid-row-text', g.rowText);\n set('--ogx-grid-row-hover-background', g.rowHoverBackground);\n set('--ogx-grid-row-alternate-background', g.rowAlternateBackground);\n set('--ogx-grid-row-selected-background', g.rowSelectedBackground);\n set('--ogx-grid-row-selected-hover-background', g.rowSelectedHoverBackground);\n set('--ogx-grid-cell-focus-border', g.cellFocusBorder);\n set('--ogx-grid-pinned-left-shadow', g.pinnedLeftShadow);\n set('--ogx-grid-pinned-right-shadow', g.pinnedRightShadow);\n set('--ogx-checkbox-bg', g.checkboxBg);\n set('--ogx-checkbox-border', g.checkboxBorder);\n }\n\n if (theme.transitions) {\n const tr = theme.transitions;\n set('--ogx-transition-duration-fast', tr.durationFast);\n set('--ogx-transition-duration-normal', tr.durationNormal);\n set('--ogx-transition-duration-slow', tr.durationSlow);\n set('--ogx-transition-easing', tr.easing);\n }\n\n if (theme.toolbar) {\n const tb = theme.toolbar;\n set('--ogx-toolbar-background', tb.background);\n set('--ogx-toolbar-text', tb.text);\n set('--ogx-toolbar-border', tb.border);\n set('--ogx-toolbar-btn-bg', tb.buttonBackground);\n set('--ogx-toolbar-btn-hover', tb.buttonHoverBackground);\n set('--ogx-toolbar-btn-text', tb.buttonText);\n set('--ogx-toolbar-btn-primary-bg', tb.buttonPrimaryBackground);\n set('--ogx-toolbar-btn-primary-hover', tb.buttonPrimaryHoverBackground);\n set('--ogx-toolbar-btn-primary-text', tb.buttonPrimaryText);\n set('--ogx-toolbar-btn-danger-bg', tb.buttonDangerBackground);\n set('--ogx-toolbar-btn-danger-hover', tb.buttonDangerHoverBackground);\n set('--ogx-toolbar-btn-danger-text', tb.buttonDangerText);\n set('--ogx-toolbar-input-bg', tb.inputBackground);\n set('--ogx-toolbar-input-text', tb.inputText);\n set('--ogx-toolbar-input-border', tb.inputBorder);\n set('--ogx-toolbar-input-focus-border', tb.inputFocusBorder);\n set('--ogx-toolbar-input-focus-shadow', tb.inputFocusShadow);\n set('--ogx-toolbar-chip-bg', tb.chipBackground);\n set('--ogx-toolbar-chip-text', tb.chipText);\n set('--ogx-toolbar-chip-active-bg', tb.chipActiveBackground);\n set('--ogx-toolbar-chip-active-text', tb.chipActiveText);\n }\n\n if (theme.overlays) {\n const o = theme.overlays;\n set('--ogx-overlay-background', o.background);\n set('--ogx-overlay-text', o.text);\n set('--ogx-overlay-border', o.border);\n set('--ogx-overlay-shadow', o.shadow);\n set('--ogx-overlay-item-hover-bg', o.itemHoverBackground);\n set('--ogx-overlay-item-hover-text', o.itemHoverText);\n set('--ogx-overlay-item-selected-bg', o.itemSelectedBackground);\n set('--ogx-overlay-item-selected-text', o.itemSelectedText);\n set('--ogx-overlay-item-danger-bg', o.itemDangerBackground);\n set('--ogx-overlay-item-danger-text', o.itemDangerText);\n }\n\n if (theme.scrollbar) {\n const scr = theme.scrollbar;\n set('--ogx-scrollbar-thumb', scr.thumbColor);\n set('--ogx-scrollbar-track', scr.trackColor);\n set('--ogx-scrollbar-size', scr.size);\n }\n\n if (theme.skeleton) {\n const sk = theme.skeleton;\n set('--ogx-skeleton-base', sk.baseColor);\n set('--ogx-skeleton-highlight', sk.highlightColor);\n set('--ogx-skeleton-dark-base', sk.darkBaseColor);\n set('--ogx-skeleton-dark-highlight', sk.darkHighlightColor);\n }\n\n return vars;\n}\n\nexport interface DataGridThemeProviderProps {\n theme: GridTheme;\n children: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function DataGridThemeProvider({\n theme,\n children,\n className,\n style\n}: DataGridThemeProviderProps) {\n const cssVars = React.useMemo(() => {\n\n return { ...lightBase, ...themeToCSS(theme) };\n }, [theme]);\n\n return (\n <div\n className={`ogx-theme-provider ${className || ''}`.trim()}\n style={{ ...style, ...cssVars } as React.CSSProperties}\n >\n {children}\n </div>\n );\n}\n","import type { GridTheme } from './types';\n\nexport const darkTheme: GridTheme = {\n colors: {\n primary: '#60a5fa', \n primaryDark: '#3b82f6',\n primaryLight: '#1e3a5f', \n primaryFocus: 'rgba(96, 165, 250, 0.4)',\n },\n grid: {\n background: '#0f172a', \n headerBackground: '#1e293b', \n headerText: '#e2e8f0', \n headerHoverBackground: '#334155', \n headerSortedBackground: '#1e3a5f', \n rowText: '#cbd5e1', \n borderColor: '#334155', \n rowHoverBackground: '#1e293b', \n rowAlternateBackground: '#162032', \n rowSelectedBackground: '#1e3a5f', \n rowSelectedHoverBackground: '#1d4ed8', \n cellFocusBorder: '#60a5fa',\n checkboxBg: '#1e293b', \n checkboxBorder: '#64748b', \n },\n borders: {\n color: '#334155',\n colorHover: '#475569',\n },\n shadows: {\n sm: '0 1px 2px 0 rgba(0, 0, 0, 0.3)',\n md: '0 4px 6px -1px rgba(0, 0, 0, 0.3)',\n },\n toolbar: {\n background: 'transparent',\n text: '#cbd5e1',\n border: '#334155',\n buttonBackground: 'transparent',\n buttonHoverBackground: '#1e293b',\n buttonText: '#e2e8f0',\n buttonPrimaryBackground: '#3b82f6',\n buttonPrimaryHoverBackground: '#2563eb',\n buttonPrimaryText: '#ffffff',\n buttonDangerBackground: 'rgba(239, 68, 68, 0.15)',\n buttonDangerHoverBackground: 'rgba(239, 68, 68, 0.25)',\n buttonDangerText: '#fca5a5',\n inputBackground: '#0f172a',\n inputText: '#f8fafc',\n inputBorder: '#334155',\n inputFocusBorder: '#60a5fa',\n inputFocusShadow: '0 0 0 3px rgba(96, 165, 250, 0.2)',\n chipBackground: '#1e293b',\n chipText: '#94a3b8',\n chipActiveBackground: 'rgba(96, 165, 250, 0.2)',\n chipActiveText: '#60a5fa',\n },\n overlays: {\n background: '#1e293b',\n text: '#f8fafc',\n border: '#334155',\n shadow: '0 10px 15px -3px rgba(0, 0, 0, 0.5), 0 4px 6px -2px rgba(0, 0, 0, 0.3)',\n itemHoverBackground: '#334155',\n itemHoverText: '#ffffff',\n itemSelectedBackground: 'rgba(96, 165, 250, 0.15)',\n itemSelectedText: '#60a5fa',\n itemDangerBackground: 'rgba(239, 68, 68, 0.15)',\n itemDangerText: '#fca5a5',\n },\n scrollbar: {\n thumbColor: 'rgba(148, 163, 184, 0.2)',\n trackColor: 'transparent',\n },\n skeleton: {\n baseColor: '#1e293b',\n highlightColor: '#334155',\n darkBaseColor: '#0f172a',\n darkHighlightColor: '#1e293b',\n }\n};\n\nexport const roseTheme: GridTheme = {\n colors: {\n primary: '#e11d48', \n primaryDark: '#be123c',\n primaryLight: '#fff1f2', \n primaryFocus: 'rgba(225, 29, 72, 0.4)',\n },\n grid: {\n headerBackground: '#fff1f2',\n headerHoverBackground: '#ffe4e6',\n headerSortedBackground: '#fecdd3',\n rowAlternateBackground: '#fff8f8',\n rowSelectedBackground: '#ffe4e6',\n rowSelectedHoverBackground: '#fecdd3',\n cellFocusBorder: '#e11d48',\n },\n};\n\nexport const emeraldTheme: GridTheme = {\n colors: {\n primary: '#059669', \n primaryDark: '#047857',\n primaryLight: '#ecfdf5', \n primaryFocus: 'rgba(5, 150, 105, 0.4)',\n },\n grid: {\n headerBackground: '#ecfdf5',\n headerHoverBackground: '#d1fae5',\n headerSortedBackground: '#a7f3d0',\n rowAlternateBackground: '#f6fdf9',\n rowSelectedBackground: '#d1fae5',\n rowSelectedHoverBackground: '#a7f3d0',\n cellFocusBorder: '#059669',\n },\n};\n\nexport const amberTheme: GridTheme = {\n colors: {\n primary: '#d97706', \n primaryDark: '#b45309',\n primaryLight: '#fffbeb', \n primaryFocus: 'rgba(217, 119, 6, 0.4)',\n },\n grid: {\n headerBackground: '#fffbeb',\n headerHoverBackground: '#fef3c7',\n headerSortedBackground: '#fde68a',\n rowAlternateBackground: '#fffdf5',\n rowSelectedBackground: '#fef3c7',\n rowSelectedHoverBackground: '#fde68a',\n cellFocusBorder: '#d97706',\n },\n};\n\nexport const compactTheme: GridTheme = {\n grid: {\n rowHeightCompact: '28px',\n rowHeightStandard: '36px',\n rowHeightComfortable: '48px',\n headerHeight: '40px',\n cellPaddingX: '8px',\n cellPaddingY: '4px',\n },\n typography: {\n fontSizeSm: '0.8rem',\n fontSizeMd: '0.875rem',\n },\n};\n","\nimport { useRef, useCallback, useMemo, useEffect } from 'react';\nimport type { GridState } from './types';\n\nexport interface UseGridStateStorageOptions {\n key: string;\n debounceMs?: number;\n include?: (keyof GridState)[];\n storage?: {\n getItem: (key: string) => string | null;\n setItem: (key: string, value: string) => void;\n removeItem: (key: string) => void;\n };\n}\n\nexport interface UseGridStateStorageReturn {\n initialState: GridState | undefined;\n onStateChange: (state: GridState) => void;\n clearState: () => void;\n}\n\nfunction readFromStorage(\n key: string,\n storage: UseGridStateStorageOptions['storage']\n): GridState | undefined {\n try {\n const raw = storage!.getItem(key);\n if (!raw) return undefined;\n return JSON.parse(raw) as GridState;\n } catch {\n\n return undefined;\n }\n}\n\nfunction writeToStorage(\n key: string,\n state: GridState,\n include: (keyof GridState)[] | undefined,\n storage: UseGridStateStorageOptions['storage']\n) {\n try {\n const toWrite = include\n ? Object.fromEntries(\n Object.entries(state).filter(([k]) => include.includes(k as keyof GridState))\n )\n : state;\n storage!.setItem(key, JSON.stringify(toWrite));\n } catch {\n // swallow localStorage write errors (private browsing, quota exceeded)\n }\n}\n\nexport function useGridStateStorage(\n options: UseGridStateStorageOptions | string\n): UseGridStateStorageReturn {\n\n const opts: UseGridStateStorageOptions = typeof options === 'string'\n ? { key: options }\n : options;\n\n const {\n key,\n debounceMs = 300,\n include,\n storage = typeof window !== 'undefined' ? window.localStorage : undefined,\n } = opts;\n\n const initialState = useMemo(() => {\n if (!storage) return undefined;\n return readFromStorage(key, storage);\n\n }, [key, storage]);\n\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const latestStateRef = useRef<GridState | null>(null);\n\n const flush = useCallback(() => {\n if (latestStateRef.current && storage) {\n writeToStorage(key, latestStateRef.current, include, storage);\n }\n }, [key, include, storage]);\n\n const onStateChange = useCallback(\n (state: GridState) => {\n latestStateRef.current = state;\n\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n\n timerRef.current = setTimeout(flush, debounceMs);\n },\n [flush, debounceMs]\n );\n\n useEffect(() => {\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n flush();\n }\n };\n }, [flush]);\n\n const clearState = useCallback(() => {\n if (storage) {\n storage.removeItem(key);\n }\n }, [key, storage]);\n\n return { initialState, onStateChange, clearState };\n}\n"],"names":["REACT_ELEMENT_TYPE","REACT_FRAGMENT_TYPE","jsxProd","type","config","maybeKey","key","propName","reactJsxRuntime_production","getComponentNameFromType","REACT_CLIENT_REFERENCE","REACT_PROFILER_TYPE","REACT_STRICT_MODE_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_ACTIVITY_TYPE","REACT_PORTAL_TYPE","REACT_CONTEXT_TYPE","REACT_CONSUMER_TYPE","REACT_FORWARD_REF_TYPE","innerType","REACT_MEMO_TYPE","REACT_LAZY_TYPE","testStringCoercion","value","checkKeyStringCoercion","JSCompiler_inline_result","JSCompiler_temp_const","JSCompiler_inline_result$jscomp$0","getTaskName","name","getOwner","dispatcher","ReactSharedInternals","UnknownOwner","hasValidKey","hasOwnProperty","getter","defineKeyPropWarningGetter","props","displayName","warnAboutAccessingKey","specialPropKeyWarningShown","elementRefGetterWithDeprecationWarning","componentName","didWarnAboutElementRef","ReactElement","owner","debugStack","debugTask","refProp","jsxDEVImpl","isStaticChildren","children","isArrayImpl","validateChildKeys","keys","k","didWarnAboutKeySpread","node","isValidElement","object","React","require$$0","createTask","callStackForError","unknownOwnerDebugStack","unknownOwnerDebugTask","reactJsxRuntime_development","trackActualOwner","jsxRuntimeModule","require$$1","isColumnPinned","field","pinnedColumns","getPinnedColumnGroups","columns","left","center","right","col","pinnedPosition","a","b","aIndex","bIndex","calculatePinnedPositions","columnWidths","checkboxSelection","pinCheckboxColumn","hasDetailPanel","pinExpandColumn","rowReordering","positions","groups","leftOffset","width","rightOffset","isRowPinned","rowId","pinnedRows","getPinnedRowGroups","rows","top","bottom","row","parseWidth","floatVal","useLayout","params","rowHeight","pagination","paginatedUnpinnedRows","sortedUnpinnedRows","expandedRowIds","getDetailPanelHeight","pinnedTopRowsLength","pinnedBottomRowsLength","visibleOrderedColumns","viewportWidth","paginationMode","isLoading","pageSize","useMemo","unpinnedRows","rowHeights","index","height","detailHeight","cumulativeHeights","acc","skeletonCount","unpinnedRowsHeight","pinnedTopHeight","pinnedBottomHeight","rawLeftPinnedCols","rawRightPinnedCols","unpinnedCols","unpinnedColWidths","pinned","systemColumnsWidth","getColWidth","c","leftWidth","sum","parsed","rightWidth","naturalFlexWidth","minWidth","w","availableWidth","fixedWidthCols","percentageCols","flexCols","hasManualWidth","fixedWidth","remainingSpaceForFlex","percentageWidthMap","percentage","calculatedWidth","finalFlexWidths","flexItems","f","iterations","maxIterations","unfrozen","unfrozenFlexTotal","frozenWidthTotal","currentFreeSpace","pixelsPerFlex","totalViolation","minViolators","maxViolators","rawWidth","computedWidthMap","computedWidth","fixedCol","pctCol","p","rawPctWidth","unpinnedColsWithWidth","flexItem","baseLeftZ","leftPinnedCols","i","baseRightZ","rightPinnedCols","unpinnedTotalWidth","totalWidth","unpinnedAccWidths","useGridKeyboardNavigation","allRenderableRows","navigationColumns","selectedRowIds","handleSelectionChange","handleDetailPanelToggle","editingHandlers","setKeyboardMode","sortModel","handleSort","isCellEditable","virtualization","viewportRef","focusedCell","setFocusedCell","useState","handleFocus","useCallback","event","prev","firstRow","firstCol","handleBlur","handleKeyDown","id","isEditing","currentSort","item","newDirection","r","isHeader","rowIndex","colIndex","findNextCell","startRow","startCol","deltaRow","deltaCol","wrapRow","allowHeader","findNextEditable","steps","maxSteps","isSortable","isInteractable","cellEditable","nextRowIndex","nextColIndex","handled","dir","res","pg","nextCol","el","columnMetrics","clientHeight","clientWidth","scrollTop","scrollLeft","rowTop","rowBottom","visibleTop","visibleBottom","newScrollTop","leftPinnedWidth","rightPinnedWidth","totalSpecialsWidth","pinnedSpecialsWidth","unpinnedIndex","colLeft","colRight","visibleStart","visibleEnd","newScrollLeft","EMPTY_PIVOT_MODEL","useGridControlledState","initialState","propSortModel","propAggregationModel","onAggregationModelChange","propColumnVisibilityModel","onColumnVisibilityModelChange","propPinnedColumns","onPinnedColumnsChange","propPivotModel","onPivotModelChange","propPaginationModel","onPaginationModelChange","propRowSelectionModel","internalSortModel","setInternalSortModel","isSortControlled","isAggregationControlled","internalAggregationModel","setInternalAggregationModel","aggregationModel","handleAggregationModelChange","model","isColumnVisibilityControlled","internalColumnVisibilityModel","setInternalColumnVisibilityModel","columnVisibilityModel","handleColumnVisibilityModelChange","isPinnedColumnsControlled","internalPinnedColumns","setInternalPinnedColumns","handlePinnedColumnsChange","internalPivotModel","setInternalPivotModel","currentPivotModel","handlePivotModelChange","isPaginationControlled","internalPaginationModel","setInternalPaginationModel","effectivePaginationModel","handlePaginationModelChange","newModel","isSelectionControlled","internalRowSelectionModel","setInternalRowSelectionModel","rowSelectionModel","FILTER_OPERATORS","filterValue","numValue","numFilter","numV","numF","v","rowStr","filterStr","applyFilterItem","filterItem","operator","rowValue","operatorFn","applyQuickFilter","quickFilterValues","searchTerm","isRowMatchingFilter","filterModel","items","logicOperator","evaluateItem","group","groupItems","filterRows","getOperatorsForType","compareValues","direction","aStr","bStr","sortRows","sortedRows","sortItem","aValue","bValue","comparison","useGridRowPipeline","effectiveRows","activeHierarchyHandlers","filterMode","dataSource","sortingMode","filteredRows","pinnedTopRows","pinnedBottomRows","start","centerRows","base","skeletons","_","useGridVirtualization","layout","rawViewportWidth","rawViewportHeight","autoHeight","unpinnedRowsLength","viewportHeight","overscanCols","visibleLocalStart","visibleLocalEnd","firstUnpinnedIndex","lastUnpinnedIndex","low","high","mid","leftSpacerWidth","rightSpacerWidth","virtualColumns","scrollbarBuffer","totalHeight","overscanRows","firstRowIndex","lastRowIndex","offsetTop","rLow","rHigh","useColumnReorder","onColumnOrderChange","disableColumnReorder","draggedColumn","setDraggedColumn","dragOverColumn","setDragOverColumn","draggedIndexRef","useRef","handleDragStart","columnIndex","handleDragOver","handleDrop","targetField","oldIndex","targetIndex","column","handleDragEnd","ExpandIcon","isExpanded","onClick","variant","jsx","e","jsxs","useGridColumns","activeColumns","isHierarchyEnabled","isRowGrouping","isTreeData","columnOrder","pivotMode","setColumns","effectiveColumns","cellParams","meta","depth","hasChildren","groupingField","groupingValue","descendantCount","isGroupRow","content","groupLabel","setColumnWidths","handleColumnResize","newWidth","internalColumnOrder","setInternalColumnOrder","effectiveColumnOrder","useEffect","orderedColumns","orderMap","idx","ai","bi","columnReorderHandlers","reorderParams","newOrder","movedField","specials","useGridVisibleRows","renderContext","topPinnedCount","topPinned","bottomPinned","centerStartIndex","centerEndIndex","centerVisible","combined","seenIds","useGridScrollSync","onRowsScrollEnd","pendingScrollRef","scrollRafRef","scrollPos","setScrollPos","handleScroll","target","scrollHeight","useGridStateSnapshot","onStateChange","onStateChangeRef","useLayoutEffect","snapshot","AGGREGATION_FUNCTIONS","values","nums","formatAggregationValue","fnName","useAggregation","isServerSide","serverAggregationResults","columnsLookup","map","clientResult","result","colDef","fn","serverResult","setServerResult","setIsLoading","error","setError","requestIdRef","fetchServerAggregations","requestId","err","GridAggregationFooter","aggregationResult","pinnedOffsets","lastLeftField","firstRightField","rawValue","colWidth","pinnedOffset","className","style","Fragment","GridEmptyState","noRowsLabel","GridErrorOverlay","message","Checkbox","indeterminate","label","inputRef","internalRef","setRef","element","wrapperClassNames","ColumnResizeHandle","currentWidth","onResize","maxWidth","isDragging","setIsDragging","startXRef","startWidthRef","handleMouseDown","lastUpdateTime","throttleMs","handleMouseMove","deltaX","now","handleMouseUp","handleDoubleClick","classNames","ActiveDotIcon","InactiveDotIcon","ManageColumnsIcon","AscIcon","DescIcon","UnsortIcon","HideIcon","PinLeftIcon","PinRightIcon","UnpinIcon","ColumnMenu","onSort","onHide","onPin","onManageColumns","onClose","anchorEl","menuRef","setStyle","anchorRect","menuRect","vw","vh","margin","handleClickOutside","handleKey","handleHide","handlePin","side","isUnsorted","isPinnedLeft","isPinnedRight","isUnpinned","colLabel","ReactDOM","MenuIcon","SwapIcon","collectGroupFields","out","child","groupTreeDepth","d","walk","g","buildGroupRow","allFields","level","findAtLevel","cur","found","fieldGroup","cells","totalW","j","Header","allColumns","columnGroupingModel","allSelected","someSelected","onSelectAll","onColumnResize","onDragStart","onDragOver","onDragEnd","onDrop","onHeaderClick","onSortAdd","multiSort","onHideColumn","onPinColumn","selectAllId","useId","cellRefs","menuOpenParams","setMenuOpenParams","handleMenuOpen","handleMenuClose","handleColumnClick","getSortIcon","sortIndex","pinnedPositions","groupDepth","allLeafFields","prefixWidth","cell","isSorted","isResizable","isPinned","isDragOver","effectiveWidth","offset","headerContent","handleHeaderClick","Button","size","color","disabled","Pagination","pageSizeId","page","rowCount","onPageChange","onPageSizeChange","pageSizeOptions","showFirstButton","showLastButton","localeText","pageCount","currentPage","displayedRows","rowsPerPageLabel","ofLabel","pageLabel","handleFirstPage","handlePreviousPage","handleNextPage","handleLastPage","handlePageSizeChange","newPageSize","isFirstPage","isLastPage","option","createInitialState","idRowsLookup","allRows","columnLookup","orderedFields","gridReducer","state","action","currentRows","newRows","useDataGrid","headerHeight","propInitialState","internalInitialState","dispatch","useReducer","stateRef","prevRowsRef","setRows","rowsOrUpdater","preserveRowCount","newColumns","setSortModel","setFilterModel","setPaginationModel","paginationModel","setSelection","selectedRows","setDimensions","setDataSourceLoading","loading","setDataSourceError","setRowCount","count","apiRef","isSelected","newSelection","ids","existingIndex","useRowReorder","onRowOrderChange","getRowId","draggedRowId","setDraggedRowId","dragOverRowId","setDragOverRowId","getRowIdInternal","targetId","useTreeData","getTreeDataPath","treeData","defaultGroupingExpansionDepth","onRowExpansionChange","treeNodes","rootIds","groupingRows","nodes","roots","groupRows","pathLookup","getPathKey","path","pathKey","ensureAncestors","childPath","parentPath","parentPathKey","parentId","groupRow","parentNode","childNode","groupId","nodePath","initialExpandedIds","initialExpanded","expandedGroupIds","setExpandedGroupIds","toggleExpansion","next","isExpanding","getVisibleRows","rowLookup","matchesFilter","filterCache","isNodeVisible","childId","sortNodes","aId","bId","rowA","rowB","valA","valB","comp","traverse","visibleIds","enhancedRow","isGroupExpanded","getNode","getNodePath","currentId","rowMetaMap","groupRowIds","defaultGetAggregationPosition","groupNode","EMPTY_ROW_GROUPING_MODEL","EMPTY_AGGREGATION_MODEL","useRowGrouping","rowGroupingModel","getAggregationPosition","getGroupId","groupIds","groupRowsList","aggregatedValues","aggField","aggType","treeNode","childrenIds","topLevelIds","allGroupIds","depthIds","doesNodeMatchFilter","nodeId","compareResult","isGroup","isExpandedGroupIds","useGridEditing","processRowUpdate","onProcessRowUpdateError","onRowChange","editingCell","setEditingCellState","editingCellRef","setEditingCell","val","startCellEdit","editParams","stopCellEdit","stopParams","currentCell","originalValue","existingRow","newRow","processedRow","setEditCellValue","useGridSpanning","colspanMap","setColspanMap","rowSpanningState","setRowSpanningState","resetColSpan","getCellColSpanInfo","calculateColSpan","minFirstColumn","maxLastColumn","newMap","colSpan","setCellColSpanInfo","calculateRowSpan","spannedCells","hiddenCells","hiddenCellOriginMap","cellValue","span","nextIndex","nextRow","resetRowSpan","nextColWidth","getSpannedCells","getHiddenCells","getHiddenCellOriginMap","info","columnInfo","useGridDataSource","onAggregationResults","prevParamsRef","activeRequestRef","fetchRows","endRow","requestParams","response","shouldAppend","sortChanged","filterChanged","pageSizeChanged","prevRows","timer","fetchChildren","_parentId","groupKeys","existingIds","SEP_COL","SEP_KEY","aggregate","makeKey","fields","cellKey","ck","aggFn","hasColFields","usePivot","rawRows","rawCols","enabled","empty","rowFields","columnFields","valueFields","colDefMap","colKeySet","colKeys","outerMap","rk","labelValues","entry","colBucket","vf","raw","pivotRows","pivotRow","ck_","gtBuckets","bk","totalRow","cellValues","pivotColumns","orig","def","labelBase","headerName","n","copyTextSynchronous","text","textarea","success","writeToClipboard","fallbackSuccess","useGridClipboard","copySelectedRows","rowsToCopy","visibleColumns","headerRow","dataRows","fullContent","activeEl","tag","ListViewRow","listViewColumn","onRowClick","onSelectionChange","handleCheckboxChange","GridListView","ariaLabel","serverRowCount","paginationSlot","paginationSlotProps","PaginationComponent","totalRowCount","newPage","TextEditor","onValueChange","onCommit","onCancel","local","setLocal","ref","NumberEditor","BooleanEditor","handleChange","SelectEditor","options","opt","l","DateEditor","GridEditInputCell","CellRenderTarget","renderFn","CellErrorBoundary","CellImpl","onCellClick","onCellEditStart","onCellValueChange","isFocused","isFocusVisible","isEditable","onEditStart","onEditStop","colSpanInfo","rowSpanProp","isHiddenByRowSpan","rowMeta","handleValueChange","newValue","formattedValue","resolvedCellClassName","cellRef","handleClick","rowSpan","cellWidth","Cell","DragHandleIcon","DetailPanel","Row","isDetailPanelExpanded","onDetailPanelToggle","detailPanelContent","detailPanelHeight","onEditCellValueChange","focusedCellField","rowSpanningCaches","checkboxId","expandCellRef","checkboxCellRef","handleCellEditStart","handleCellValueChange","handleEditStopWrapper","cancel","cellCount","handleRowClick","rowPinnedPosition","isRowPinnedTop","isRowPinnedBottom","GridPinnedRows","position","getDetailPanelContent","SkeletonRow","skeletonWidth","GridVirtualRows","virtualContainerHeight","effectiveLoading","visibleRows","baseColumns","rowReorderHandlers","dataSourceLoading","sortedUnpinnedRowCount","infiniteScrollSkeletonCount","skeletonColumns","columnWidth","columnCount","self","t","actualIndex","SearchIcon","ColumnVisibilityPanel","onVisibilityChange","onShowAll","onHideAll","onColumnReorder","onColumnOrderReset","showNonHideableColumns","searchQuery","setSearchQuery","dragOverField","setDragOverField","dragFieldRef","hideableColumns","allVisible","filteredColumns","lowerQuery","handleToggleAll","handleDragLeave","toField","fromField","isVisible","isHideable","canReorder","GridStandaloneColumnPanel","isOpen","containerRef","panelRef","onColumnVisibilityChange","panelTop","setPanelTop","panelRight","setPanelRight","portalTarget","setPortalTarget","rect","handleReorder","currentOrder","fromIdx","toIdx","EMPTY_ROW_META_MAP","DataGrid","density","disableRowSelectionOnClick","disableMultipleRowSelection","propOnRowSelectionModelChange","propFilterModel","onFilterModelChange","onSortModelChange","propPagination","controlledExpandedRowIds","onDetailPanelExpandedRowIdsChange","groupingColDef","propRowGroupingModel","propRowCount","slots","slotProps","listView","propApiRef","effectiveNoRowsLabel","defaultFilterModel","defaultRowGroupingModel","latestToolbarRef","StableToolbar","Toolbar","controlledState","onRowSelectionModelChange","pivot","effectiveRowHeight","activeRows","isRowGroupingActive","effectivePinnedColumns","setServerAggregationResults","contentRef","gridRef","defaultGetRowId","effectiveGetRowId","normalizedRows","on","dataSourceRef","fetchChildrenRef","treeDataRef","handleNodeExpansion","gridData","isInternalLoading","treeDataHandlers","rowGroupingHandlers","updatedRow","nextRows","dataSourceHandlers","internalExpandedRowIds","setInternalExpandedRowIds","newExpandedRowIds","rowPipeline","spanning","hasAggregation","resolvedColumnWidths","targetCol","colLocalLeft","colLocalRight","resizeObserver","entries","newSelectionArray","handleSelectAll","newSortModel","handleSortAdd","existing","handleCellClick","prevEditingCellRef","wasEditing","hasRowSpanning","columnsPanelOpen","setColumnsPanelOpen","standalonePanelRef","toolbarProps","reorderHandler","cleanLeft","cleanRight","Skeleton","NO_VALUE_OPERATORS","getActiveFilter","FilterRow","onChange","filterId","operators","isActive","currentOperator","localValue","setLocalValue","onChangeRef","itemRef","colFieldRef","operatorRef","prevItemValue","handler","currentItem","currentValue","handleOperatorChange","op","noValue","newItem","handleClear","isNoValue","isBoolean","showValue","FilterPanel","handleItemChange","rest","handleLogicChange","filterableColumns","AGG_FNS","PivotIcon","PivotPanel","anchorRef","pos","setPos","portalContainer","setPortalContainer","computePos","update","onKey","inRow","inCol","inValue","isUsed","addRow","addCol","addValue","removeRow","removeCol","removeValue","changeValueFn","reset","numericFields","totalActive","panel","isNum","CloseIcon","GlobalSearch","placeholder","debounceMs","setIsExpanded","lastEmittedRef","lastIncomingValueRef","wasFocusedRef","handleExpand","GridTooltip","title","placement","enterDelay","leaveDelay","open","setOpen","coords","setCoords","timerRef","childRef","updateCoords","scrollX","scrollY","handleMouseEnter","handleMouseLeave","wrapperRef","SigmaIcon","ViewColumnIcon","FilterIcon","AggregationPanel","aggregableColumns","onFunctionChange","onClearAll","activeCount","currentFn","ColumnsPanelWrapper","FilterPanelWrapper","onCloseRef","activeFilterCount","handleClearAll","EMPTY_PIVOT","GridToolbar","pivotModel","forceColumnsOpen","onColumnsPanelClose","rightContent","renderColumnsButton","renderFilterButton","renderAggregationButton","renderExportButton","renderQuickFilter","aggOpen","setAggOpen","pivotOpen","setPivotOpen","colsOpen","setColsOpen","filterOpen","setFilterOpen","aggButtonRef","pivotButtonRef","colsButtonRef","filterButtonRef","colsWrapperRef","filterWrapperRef","aggWrapperRef","pivotActive","handleFunctionChange","clearAllAgg","handleSearchChange","nextModel","searchValue","handleVisibilityChange","handleShowAllColumns","handleHideAllColumns","o","m","useGridApiRef","Input","fullWidth","startAdornment","endAdornment","hexToRgb","hex","getExportColumns","resolveValue","colWeight","computeColumnStyles","usableWidth","totalWeight","styles","formatFilterSummary","exportToPdf","JsPDF","autoTable","jspdfMod","autoTableMod","fileName","logoUrl","orientation","alternateRowColor","headerBackgroundColor","headerTextColor","fontSize","groupedRows","doc","pageWidth","pageHeight","MARGIN","exportColumns","rowsToExport","startY","cursorX","cursorY","exportedAt","summary","head","body","foot","aggMod","indent","aggVal","formatted","columnStyles","hr","hg","hb","tr","tg","tb","totalPages","exportToCsv","includeHeaders","delimiter","csvContent","escapeCSV","aggModel","aggResult","aggLabels","aggValues","downloadFile","exportToExcel","sheetName","html","escapeHTML","isGrand","exportToJson","pretty","outData","stack","grandTotal","obj","data","summaryLabelObj","summaryDataObj","printGrid","titleOrOptions","printWindow","resolve","hasPrinted","mimeType","blob","url","link","inferCellType","defaultNumFmt","override","px","imageExtension","contentType","ct","fetchImages","urls","settled","commaIdx","header","b64","binary","uint8","mime","ext","buffer","exportToExcelAdvanced","sheetDefs","headerFillColor","headerFontSize","bodyFontSize","ExcelJS","workbook","sRows","resolvedSheets","imageCache","sheetDef","ws","argb","bottomBorder","rowScope","includeSummary","autoFilter","frozenHeader","imageColumns","urlsNeeded","seen","fetched","extension","imgId","headerValues","excelRowIdx","rowIdx","dataRow","maxImgH","max","rowHeightPt","rowHeightPx","colIdx","imgW","imgH","colWidthPx","hGapPx","vGapPx","labelRow","totalValues","topBorder","clean","lightBase","themeToCSS","theme","vars","set","cssVar","s","sh","scr","sk","DataGridThemeProvider","cssVars","darkTheme","roseTheme","emeraldTheme","amberTheme","compactTheme","readFromStorage","storage","writeToStorage","include","toWrite","useGridStateStorage","opts","latestStateRef","flush","clearState"],"mappings":"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","x_google_ignoreList":[0,1,2]}
|