@opencorestack/opengridx 1.0.6 → 1.0.7
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/dist/opengridx.css +1 -1
- package/dist/opengridx.es.js +2687 -2673
- package/dist/opengridx.es.js.map +1 -1
- package/dist/opengridx.umd.js +11 -11
- package/dist/opengridx.umd.js.map +1 -1
- package/lib/components/ColumnVisibilityPanel/ColumnVisibilityPanel.tsx +0 -2
- package/lib/components/DataGrid/DataGrid.css +36 -0
- package/lib/components/DataGrid/DataGrid.tsx +4 -2
- package/lib/components/DataGrid/GridAggregationFooter.tsx +47 -9
- package/lib/components/DataGrid/GridStandaloneColumnPanel.tsx +3 -1
- package/lib/components/FilterPanel/FilterPanel.tsx +5 -4
- package/lib/components/Header/Header.tsx +4 -3
- package/lib/components/Pagination/Pagination.tsx +4 -3
- package/lib/components/Row/Row.tsx +3 -2
- package/lib/components/Toolbar/GlobalSearch.tsx +0 -2
- package/lib/components/Toolbar/GridToolbar.tsx +0 -4
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opengridx.umd.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/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/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 = { page: 0, pageSize: 100 },\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 && params.paginationModel !== undefined;\n const [internalPaginationModel, setInternalPaginationModel] = useState<GridPaginationModel>(\n () => initialState?.pagination?.paginationModel ?? propPaginationModel\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 r = cellParams.row as Record<string, unknown>;\n const depth = typeof r._treeDepth === 'number' ? r._treeDepth : 0;\n const hasChildren = Boolean(r._hasChildren);\n const isExpanded = Boolean(r._isExpanded);\n const groupingField = typeof r._groupingField === 'string' ? r._groupingField : undefined;\n const groupingValue = r._groupingValue;\n const descendantCount = typeof r._descendantCount === 'number' ? r._descendantCount : undefined;\n const isGroupRow = Boolean(r._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 content = (\n <div className=\"ogx__group-cell-content\">\n {col.field === groupingField ? '' : `${groupingField}: `}\n {String(groupingValue)}\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 r = cellParams.row as Record<string, unknown>;\n const hasChildren = Boolean(r._hasChildren);\n const groupingField = typeof r._groupingField === 'string' ? r._groupingField : undefined;\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 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 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 aggregationModel,\n isServerSide,\n dataSource,\n filterModel,\n sortModel,\n serverAggregationResults,\n } = params;\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 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, 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 from 'react';\nimport { formatAggregationValue } from '../../hooks/features/useAggregation';\nimport type { GridColDef, GridAggregationModel, GridAggregationResult } from '../../types';\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}\n\nexport function GridAggregationFooter({\n columns,\n aggregationModel,\n aggregationResult,\n columnWidths,\n rowHeight,\n checkboxSelection,\n hasDetailPanel,\n rowReordering,\n}: GridAggregationFooterProps) {\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 return (\n <div\n key={col.field}\n className=\"ogx__aggregation-cell\"\n role=\"gridcell\"\n style={{\n width: colWidth,\n minWidth: colWidth,\n maxWidth: colWidth,\n textAlign: (col.align as React.CSSProperties['textAlign']) || 'left',\n }}\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 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 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 onHideColumn,\n onPinColumn,\n onManageColumns,\n } = props;\n\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>) => () => {\n if (colDef.sortable === false || !onSort) 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 onSort(colDef.field, newDirection);\n };\n\n const getSortIcon = (field: string) => {\n const sortItem = sortModel.find(item => item.field === field);\n if (!sortItem) return null;\n\n return (\n <span className={`ogx__sort-icon ogx__sort-icon--${sortItem.sort}`} aria-hidden=\"true\" />\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=\"ogx-select-all\"\n name=\"ogx-select-all\"\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)();\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 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 from 'react';\nimport { Button } from '../ui/Button';\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}\n\nexport function Pagination(props: PaginationProps) {\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 } = 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 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=\"page-size-select\" className=\"ogx-pagination__label\">\n Rows per page:\n </label>\n <select\n id=\"page-size-select\"\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 {displayedRows} of {rowCount}\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 Page {currentPage + 1} of {pageCount}\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 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 { 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 return useMemo(() => ({\n treeNodes,\n groupingRows,\n toggleExpansion,\n isGroupExpanded,\n getVisibleRows,\n getNode,\n getNodePath\n }), [treeNodes, groupingRows, toggleExpansion, isGroupExpanded, getVisibleRows, getNode, getNodePath]);\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} 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 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\nexport function useRowGrouping<R extends GridRowModel>(params: UseRowGroupingParams<R>) {\n const { \n rows, \n getRowId, \n rowGroupingModel = [], \n aggregationModel = {}, \n defaultGroupingExpansionDepth = 0,\n filterModel,\n sortModel,\n getAggregationPosition = defaultGetAggregationPosition\n } = params;\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 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: `${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]);\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 return useMemo(() => ({\n treeNodes,\n groupingRows,\n toggleExpansion,\n isGroupExpanded,\n getVisibleRows,\n getNode\n }), [treeNodes, groupingRows, toggleExpansion, isGroupExpanded, getVisibleRows, getNode]);\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} 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 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 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 {...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","\nimport React from 'react';\nimport type { GridColDef, GridRowModel, GridPinnedPosition, GridCellParams } from '../../types';\nimport type { CellColSpanInfo } from '../../hooks/features/useGridSpanning';\n\nimport { GridEditInputCell } from './GridEditInputCell';\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}\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 } = 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 cellContent = React.useMemo(() => {\n if (isEditing && (onCellValueChange || onValueChange) && onEditStop) {\n if (colDef.renderEditCell) {\n return colDef.renderEditCell({\n value,\n row,\n field: colDef.field,\n colDef,\n rowIndex,\n colIndex\n });\n }\n return (\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 }\n\n if (colDef.renderCell) {\n return colDef.renderCell({\n value,\n row,\n field: colDef.field,\n colDef,\n rowIndex,\n colIndex\n });\n }\n\n return formattedValue;\n }, [value, row, colDef, rowIndex, colIndex, formattedValue, isEditing, handleValueChange, onEditStop, onCellValueChange, onValueChange]);\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 {cellContent}\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 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 } 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}\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 } = props;\n\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 = row._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={`ogx-select-row-${row.id}`}\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 />\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} 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}\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}: 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 />\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} 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}\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}: 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 />\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}\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 } = 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 if (!searchQuery) return columns;\n const lowerQuery = searchQuery.toLowerCase();\n return columns.filter(col =>\n (col.headerName || col.field).toLowerCase().includes(lowerQuery)\n );\n }, [columns, searchQuery]);\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 id=\"ogx-column-search\"\n name=\"ogx-column-search\"\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 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 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 id=\"ogx-standalone-col-panel\"\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 } from '../../types';\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 checkboxSelection = 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 = { page: 0, pageSize: 100 },\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\n rowGroupingModel: propRowGroupingModel,\n\n aggregationModel: propAggregationModel,\n onAggregationModelChange,\n getAggregationPosition,\n\n isCellEditable,\n processRowUpdate,\n onProcessRowUpdateError,\n\n dataSource,\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 apiRef: propApiRef,\n } = props;\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 activeRows = (pivotMode && pivot.isValid ? pivot.pivotRows : rows) as unknown as R[];\n const activeColumns = (pivotMode && pivot.isValid ? pivot.pivotColumns : columns) as unknown as GridColDef<R>[];\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,\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 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 pagination = propPagination && !isRowGrouping;\n\n const handleRowClick = useCallback((params: GridRowParams<R>) => {\n const { row, id } = params;\n\n if (isHierarchyEnabled && row._hasChildren) {\n activeHierarchyHandlers?.toggleExpansion(id);\n return;\n }\n\n onRowClick?.(params);\n }, [isHierarchyEnabled, activeHierarchyHandlers, onRowClick]);\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,\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.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 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 }, [aggregationResult, aggregationModel, hasAggregation, gridData.apiRef]);\n\n const layout = useLayout({\n rowHeight,\n pagination,\n paginatedUnpinnedRows,\n sortedUnpinnedRows,\n expandedRowIds,\n getDetailPanelHeight,\n pinnedTopRowsLength: pinnedTopRows.length,\n pinnedBottomRowsLength: pinnedBottomRows.length,\n visibleOrderedColumns,\n pinnedColumns,\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 { 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\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 const panel = document.getElementById('ogx-standalone-col-panel');\n if (panel && !panel.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': `${rowHeight}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 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={noRowsLabel}\n rowHeight={rowHeight}\n checkboxSelection={checkboxSelection}\n paginationMode={paginationMode}\n dataSource={dataSource}\n serverRowCount={state.pagination.rowCount || 0}\n paginationSlot={slots?.pagination}\n paginationSlotProps={slotProps?.pagination}\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\n onColumnResize={handleColumnResize}\n columnWidths={columnWidths}\n pinnedColumns={pinnedColumns}\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={noRowsLabel} 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={pinnedColumns}\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={rowHeight}\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={rowHeight}\n pinnedRows={pinnedRows}\n selectedRowIds={selectedRowIds}\n onRowClick={handleRowClick}\n onCellClick={handleCellClick}\n onSelectionChange={handleSelectionChange}\n columnWidths={columnWidths}\n pinnedColumns={pinnedColumns}\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 />\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={pinnedColumns}\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={rowHeight}\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={rowHeight}\n checkboxSelection={checkboxSelection}\n hasDetailPanel={hasDetailPanel}\n rowReordering={rowReordering}\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 {...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 ? noRowsLabel\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, 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 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={`ogx-filter-op-${col.field}`}\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={`ogx-filter-val-${col.field}`}\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={`ogx-filter-val-${col.field}`}\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 id=\"ogx-global-search-input\"\n name=\"ogx-global-search\"\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}\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}: {\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}) {\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 />\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}: 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 />\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 id=\"ogx-pivot-btn\"\n className={`ogx-toolbar__icon-btn${pivotOpen ? ' ogx-toolbar__icon-btn--active' : ''}`}\n aria-label=\"Configure pivot\"\n aria-expanded={pivotOpen}\n aria-controls=\"ogx-pivot-panel\"\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 id=\"ogx-aggregation-btn\"\n className={`ogx-toolbar__icon-btn${aggOpen ? ' ogx-toolbar__icon-btn--active' : ''}`}\n aria-label=\"Configure summaries\"\n aria-expanded={aggOpen}\n aria-controls=\"ogx-aggregation-panel\"\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","\nimport type { GridColDef, GridRowModel, GridAggregationModel } 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}\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 } = options;\n\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 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 // Add headers\n if (includeHeaders) {\n const headers = exportColumns.map(col => escapeCSV(col.headerName || col.field));\n csvContent += headers.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\n if (col.valueGetter) {\n value = col.valueGetter({ row, field: col.field, value });\n }\n\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n\n return escapeCSV(String(value ?? ''));\n });\n csvContent += values.join(delimiter) + '\\n';\n });\n\n // Add Aggregation\n if (options.aggregationResult) {\n const aggResult = options.aggregationResult;\n const aggModel = options.aggregationModel || {};\n \n // Print Aggregation Function Labels\n const aggLabels = exportColumns.map((col) => {\n if (aggModel[col.field]) {\n return escapeCSV(aggModel[col.field].toUpperCase());\n }\n return escapeCSV('');\n });\n csvContent += aggLabels.join(delimiter) + '\\n';\n\n // Print Aggregation Values\n const aggValues = exportColumns.map((col) => {\n const aggVal = aggResult[col.field];\n if (aggVal !== undefined && aggVal !== null) {\n let formatted = 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 escapeCSV('');\n });\n csvContent += aggValues.join(delimiter) + '\\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}\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 } = options;\n\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 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 = '<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 html += '<head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>';\n html += `<x:Name>${sheetName}</x:Name>`;\n html += '<x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]-->';\n html += '<meta charset=\"UTF-8\"></head><body>';\n html += '<table border=\"1\">';\n\n if (includeHeaders) {\n html += '<thead><tr>';\n exportColumns.forEach(col => {\n html += `<th>${escapeHTML(col.headerName || col.field)}</th>`;\n });\n html += '</tr></thead>';\n }\n\n html += '<tbody>';\n rowsToExport.forEach(row => {\n html += '<tr>';\n exportColumns.forEach(col => {\n let value: unknown = (row as GridRowModel)[col.field];\n\n if (col.valueGetter) {\n value = col.valueGetter({ row, field: col.field, value });\n }\n\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n\n html += `<td>${escapeHTML(String(value ?? ''))}</td>`;\n });\n });\n\n if (options.aggregationResult) {\n const aggResult = options.aggregationResult;\n const aggModel = options.aggregationModel || {};\n\n html += '<tr style=\"font-size: 11px; color: #666; background-color: #f5f5f5;\">';\n exportColumns.forEach((col) => {\n if (aggModel[col.field]) {\n html += `<td style=\"text-align: right; font-weight: bold;\">${escapeHTML(aggModel[col.field].toUpperCase())}</td>`;\n } else {\n html += `<td></td>`;\n }\n });\n html += '</tr>';\n\n html += '<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 = 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 html += `<td style=\"text-align: right;\">${escapeHTML(String(formatted))}</td>`;\n } else {\n html += `<td></td>`;\n }\n });\n html += '</tr>';\n }\n\n html += '</tbody></table></body></html>';\n\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}\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 } = options;\n\n // Filter rows if selection is active\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 // Filter columns\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 // Build JSON data\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\n // Use valueGetter if available\n if (col.valueGetter) {\n value = col.valueGetter({ row, field: col.field, value });\n }\n\n obj[col.field] = value;\n });\n return obj;\n });\n\n type ExportJsonPayload =\n | Record<string, unknown>[]\n | { data: Record<string, unknown>[]; aggregation: { labels: Record<string, unknown>; values: Record<string, unknown> } };\n\n let outData: ExportJsonPayload = data;\n\n if (options.aggregationResult) {\n const aggResult = options.aggregationResult;\n const aggModel = options.aggregationModel || {};\n\n const summaryLabelObj: Record<string, unknown> = {};\n exportColumns.forEach((col) => {\n if (aggModel[col.field]) {\n summaryLabelObj[col.field] = aggModel[col.field].toUpperCase();\n }\n });\n\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) {\n aggVal = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n } else if (aggModel[col.field]) {\n aggVal = formatAggregationValue(aggVal, aggModel[col.field]);\n }\n summaryDataObj[col.field] = aggVal;\n }\n });\n\n outData = {\n data: data,\n aggregation: {\n labels: summaryLabelObj,\n values: summaryDataObj\n }\n };\n }\n\n const jsonContent = pretty ? JSON.stringify(outData, null, 2) : JSON.stringify(outData);\n\n // Download file\n downloadFile(jsonContent, 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}\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 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 }\n\n // Filter rows if selection is active\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 // Filter columns\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 // Build HTML\n let html = `\n <!DOCTYPE html>\n <html>\n <head>\n <title>${title || 'Print'}</title>\n <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 @media print {\n body { margin: 0; }\n @page { margin: 1cm; }\n }\n </style>\n </head>\n <body>\n `;\n\n if (title) {\n html += `<h1>${escapeHTML(title)}</h1>`;\n }\n\n html += '<table>';\n\n // Headers\n html += '<thead><tr>';\n exportColumns.forEach(col => {\n html += `<th>${escapeHTML(col.headerName || col.field)}</th>`;\n });\n html += '</tr></thead>';\n\n // Rows\n html += '<tbody>';\n\n // Process rows (potential bottleneck logic here)\n rowsToExport.forEach(row => {\n html += '<tr>';\n exportColumns.forEach(col => {\n let value: unknown = (row as GridRowModel)[col.field];\n\n if (col.valueGetter) {\n value = col.valueGetter({ row, field: col.field, value });\n }\n\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\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 if (aggModel[col.field]) {\n html += `<td style=\"text-align: right; font-weight: bold;\">${escapeHTML(aggModel[col.field].toUpperCase())}</td>`;\n } else {\n html += `<td></td>`;\n }\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 = 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 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 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","\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","depth","hasChildren","groupingField","groupingValue","descendantCount","isGroupRow","content","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","clientResult","result","fn","serverResult","setServerResult","setIsLoading","error","setError","requestIdRef","fetchServerAggregations","requestId","err","GridAggregationFooter","aggregationResult","rawValue","colWidth","Fragment","GridEmptyState","noRowsLabel","GridErrorOverlay","message","Checkbox","indeterminate","label","className","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","colDef","onSort","onHide","onPin","onManageColumns","onClose","anchorEl","menuRef","style","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","onHideColumn","onPinColumn","cellRefs","menuOpenParams","setMenuOpenParams","handleMenuOpen","handleMenuClose","handleColumnClick","getSortIcon","pinnedPositions","groupDepth","allLeafFields","prefixWidth","cell","isSorted","isResizable","isPinned","isDragOver","effectiveWidth","offset","headerContent","handleHeaderClick","Button","size","color","disabled","Pagination","page","rowCount","onPageChange","onPageSizeChange","pageSizeOptions","showFirstButton","showLastButton","pageCount","currentPage","displayedRows","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","groupLabel","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","defaultGetAggregationPosition","groupNode","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","map","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","CellImpl","onCellClick","onCellEditStart","onCellValueChange","pinnedOffset","isFocused","isFocusVisible","isEditable","onEditStart","onEditStop","colSpanInfo","rowSpanProp","isHiddenByRowSpan","handleValueChange","newValue","formattedValue","cellContent","resolvedCellClassName","cellRef","handleClick","rowSpan","cellWidth","Cell","DragHandleIcon","DetailPanel","Row","isDetailPanelExpanded","onDetailPanelToggle","detailPanelContent","detailPanelHeight","onEditCellValueChange","focusedCellField","rowSpanningCaches","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","searchQuery","setSearchQuery","dragOverField","setDragOverField","dragFieldRef","allVisible","filteredColumns","lowerQuery","handleToggleAll","handleDragLeave","toField","fromField","isVisible","isHideable","canReorder","GridStandaloneColumnPanel","isOpen","containerRef","onColumnVisibilityChange","panelTop","setPanelTop","panelRight","setPanelRight","portalTarget","setPortalTarget","rect","handleReorder","currentOrder","fromIdx","toIdx","DataGrid","propOnRowSelectionModelChange","propFilterModel","onFilterModelChange","onSortModelChange","propPagination","controlledExpandedRowIds","onDetailPanelExpandedRowIdsChange","propRowGroupingModel","propRowCount","slots","slotProps","listView","propApiRef","defaultFilterModel","defaultRowGroupingModel","latestToolbarRef","StableToolbar","Toolbar","controlledState","onRowSelectionModelChange","pivot","activeRows","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","handleCellClick","prevEditingCellRef","wasEditing","hasRowSpanning","columnsPanelOpen","setColumnsPanelOpen","toolbarProps","reorderHandler","panel","cleanLeft","cleanRight","Skeleton","NO_VALUE_OPERATORS","getActiveFilter","FilterRow","onChange","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","panelRef","pos","setPos","portalContainer","setPortalContainer","computePos","update","onKey","inRow","inCol","inValue","isUsed","addRow","addCol","addValue","removeRow","removeCol","removeValue","changeValueFn","reset","numericFields","totalActive","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","exportToCsv","fileName","includeHeaders","delimiter","rowsToExport","exportColumns","csvContent","headers","escapeCSV","aggResult","aggModel","aggLabels","aggValues","aggVal","formatted","downloadFile","exportToExcel","sheetName","html","escapeHTML","exportToJson","pretty","data","obj","outData","summaryLabelObj","summaryDataObj","jsonContent","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","columnStyles","headerFillColor","headerTextColor","headerFontSize","bodyFontSize","ExcelJS","workbook","sRows","resolvedSheets","imageCache","sheetDef","ws","argb","bottomBorder","rowScope","includeSummary","autoFilter","frozenHeader","alternateRowColor","imageColumns","urlsNeeded","seen","fetched","extension","imgId","headerValues","excelRowIdx","rowIdx","dataRow","maxImgH","max","rowHeightPt","rowHeightPx","colIdx","imgW","imgH","colWidthPx","hGapPx","vGapPx","labelRow","totalValues","topBorder","hex","clean","lightBase","themeToCSS","theme","vars","set","cssVar","s","sh","tr","tb","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.umd.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/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/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 = { page: 0, pageSize: 100 },\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 && params.paginationModel !== undefined;\n const [internalPaginationModel, setInternalPaginationModel] = useState<GridPaginationModel>(\n () => initialState?.pagination?.paginationModel ?? propPaginationModel\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 r = cellParams.row as Record<string, unknown>;\n const depth = typeof r._treeDepth === 'number' ? r._treeDepth : 0;\n const hasChildren = Boolean(r._hasChildren);\n const isExpanded = Boolean(r._isExpanded);\n const groupingField = typeof r._groupingField === 'string' ? r._groupingField : undefined;\n const groupingValue = r._groupingValue;\n const descendantCount = typeof r._descendantCount === 'number' ? r._descendantCount : undefined;\n const isGroupRow = Boolean(r._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 content = (\n <div className=\"ogx__group-cell-content\">\n {col.field === groupingField ? '' : `${groupingField}: `}\n {String(groupingValue)}\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 r = cellParams.row as Record<string, unknown>;\n const hasChildren = Boolean(r._hasChildren);\n const groupingField = typeof r._groupingField === 'string' ? r._groupingField : undefined;\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 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 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 aggregationModel,\n isServerSide,\n dataSource,\n filterModel,\n sortModel,\n serverAggregationResults,\n } = params;\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 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, 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 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 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>) => () => {\n if (colDef.sortable === false || !onSort) 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 onSort(colDef.field, newDirection);\n };\n\n const getSortIcon = (field: string) => {\n const sortItem = sortModel.find(item => item.field === field);\n if (!sortItem) return null;\n\n return (\n <span className={`ogx__sort-icon ogx__sort-icon--${sortItem.sort}`} aria-hidden=\"true\" />\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)();\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 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';\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}\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 } = 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 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 Rows per page:\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 {displayedRows} of {rowCount}\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 Page {currentPage + 1} of {pageCount}\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 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 { 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 return useMemo(() => ({\n treeNodes,\n groupingRows,\n toggleExpansion,\n isGroupExpanded,\n getVisibleRows,\n getNode,\n getNodePath\n }), [treeNodes, groupingRows, toggleExpansion, isGroupExpanded, getVisibleRows, getNode, getNodePath]);\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} 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 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\nexport function useRowGrouping<R extends GridRowModel>(params: UseRowGroupingParams<R>) {\n const { \n rows, \n getRowId, \n rowGroupingModel = [], \n aggregationModel = {}, \n defaultGroupingExpansionDepth = 0,\n filterModel,\n sortModel,\n getAggregationPosition = defaultGetAggregationPosition\n } = params;\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 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: `${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]);\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 return useMemo(() => ({\n treeNodes,\n groupingRows,\n toggleExpansion,\n isGroupExpanded,\n getVisibleRows,\n getNode\n }), [treeNodes, groupingRows, toggleExpansion, isGroupExpanded, getVisibleRows, getNode]);\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} 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 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 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 {...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","\nimport React from 'react';\nimport type { GridColDef, GridRowModel, GridPinnedPosition, GridCellParams } from '../../types';\nimport type { CellColSpanInfo } from '../../hooks/features/useGridSpanning';\n\nimport { GridEditInputCell } from './GridEditInputCell';\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}\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 } = 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 cellContent = React.useMemo(() => {\n if (isEditing && (onCellValueChange || onValueChange) && onEditStop) {\n if (colDef.renderEditCell) {\n return colDef.renderEditCell({\n value,\n row,\n field: colDef.field,\n colDef,\n rowIndex,\n colIndex\n });\n }\n return (\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 }\n\n if (colDef.renderCell) {\n return colDef.renderCell({\n value,\n row,\n field: colDef.field,\n colDef,\n rowIndex,\n colIndex\n });\n }\n\n return formattedValue;\n }, [value, row, colDef, rowIndex, colIndex, formattedValue, isEditing, handleValueChange, onEditStop, onCellValueChange, onValueChange]);\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 {cellContent}\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 } 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}\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 } = 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 = row._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 />\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} 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}\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}: 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 />\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} 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}\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}: 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 />\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}\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 } = 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 if (!searchQuery) return columns;\n const lowerQuery = searchQuery.toLowerCase();\n return columns.filter(col =>\n (col.headerName || col.field).toLowerCase().includes(lowerQuery)\n );\n }, [columns, searchQuery]);\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 } from '../../types';\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 checkboxSelection = 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 = { page: 0, pageSize: 100 },\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\n rowGroupingModel: propRowGroupingModel,\n\n aggregationModel: propAggregationModel,\n onAggregationModelChange,\n getAggregationPosition,\n\n isCellEditable,\n processRowUpdate,\n onProcessRowUpdateError,\n\n dataSource,\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 apiRef: propApiRef,\n } = props;\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 activeRows = (pivotMode && pivot.isValid ? pivot.pivotRows : rows) as unknown as R[];\n const activeColumns = (pivotMode && pivot.isValid ? pivot.pivotColumns : columns) as unknown as GridColDef<R>[];\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,\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 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 pagination = propPagination && !isRowGrouping;\n\n const handleRowClick = useCallback((params: GridRowParams<R>) => {\n const { row, id } = params;\n\n if (isHierarchyEnabled && row._hasChildren) {\n activeHierarchyHandlers?.toggleExpansion(id);\n return;\n }\n\n onRowClick?.(params);\n }, [isHierarchyEnabled, activeHierarchyHandlers, onRowClick]);\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,\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.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 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 }, [aggregationResult, aggregationModel, hasAggregation, gridData.apiRef]);\n\n const layout = useLayout({\n rowHeight,\n pagination,\n paginatedUnpinnedRows,\n sortedUnpinnedRows,\n expandedRowIds,\n getDetailPanelHeight,\n pinnedTopRowsLength: pinnedTopRows.length,\n pinnedBottomRowsLength: pinnedBottomRows.length,\n visibleOrderedColumns,\n pinnedColumns,\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 { 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': `${rowHeight}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={noRowsLabel}\n rowHeight={rowHeight}\n checkboxSelection={checkboxSelection}\n paginationMode={paginationMode}\n dataSource={dataSource}\n serverRowCount={state.pagination.rowCount || 0}\n paginationSlot={slots?.pagination}\n paginationSlotProps={slotProps?.pagination}\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\n onColumnResize={handleColumnResize}\n columnWidths={columnWidths}\n pinnedColumns={pinnedColumns}\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={noRowsLabel} 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={pinnedColumns}\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={rowHeight}\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={rowHeight}\n pinnedRows={pinnedRows}\n selectedRowIds={selectedRowIds}\n onRowClick={handleRowClick}\n onCellClick={handleCellClick}\n onSelectionChange={handleSelectionChange}\n columnWidths={columnWidths}\n pinnedColumns={pinnedColumns}\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 />\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={pinnedColumns}\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={rowHeight}\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={rowHeight}\n checkboxSelection={checkboxSelection}\n hasDetailPanel={hasDetailPanel}\n rowReordering={rowReordering}\n pinnedColumns={pinnedColumns}\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 {...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 ? noRowsLabel\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}\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}: {\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}) {\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 />\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}: 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 />\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","\nimport type { GridColDef, GridRowModel, GridAggregationModel } 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}\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 } = options;\n\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 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 // Add headers\n if (includeHeaders) {\n const headers = exportColumns.map(col => escapeCSV(col.headerName || col.field));\n csvContent += headers.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\n if (col.valueGetter) {\n value = col.valueGetter({ row, field: col.field, value });\n }\n\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n\n return escapeCSV(String(value ?? ''));\n });\n csvContent += values.join(delimiter) + '\\n';\n });\n\n // Add Aggregation\n if (options.aggregationResult) {\n const aggResult = options.aggregationResult;\n const aggModel = options.aggregationModel || {};\n \n // Print Aggregation Function Labels\n const aggLabels = exportColumns.map((col) => {\n if (aggModel[col.field]) {\n return escapeCSV(aggModel[col.field].toUpperCase());\n }\n return escapeCSV('');\n });\n csvContent += aggLabels.join(delimiter) + '\\n';\n\n // Print Aggregation Values\n const aggValues = exportColumns.map((col) => {\n const aggVal = aggResult[col.field];\n if (aggVal !== undefined && aggVal !== null) {\n let formatted = 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 escapeCSV('');\n });\n csvContent += aggValues.join(delimiter) + '\\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}\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 } = options;\n\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 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 = '<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 html += '<head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>';\n html += `<x:Name>${sheetName}</x:Name>`;\n html += '<x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]-->';\n html += '<meta charset=\"UTF-8\"></head><body>';\n html += '<table border=\"1\">';\n\n if (includeHeaders) {\n html += '<thead><tr>';\n exportColumns.forEach(col => {\n html += `<th>${escapeHTML(col.headerName || col.field)}</th>`;\n });\n html += '</tr></thead>';\n }\n\n html += '<tbody>';\n rowsToExport.forEach(row => {\n html += '<tr>';\n exportColumns.forEach(col => {\n let value: unknown = (row as GridRowModel)[col.field];\n\n if (col.valueGetter) {\n value = col.valueGetter({ row, field: col.field, value });\n }\n\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n\n html += `<td>${escapeHTML(String(value ?? ''))}</td>`;\n });\n });\n\n if (options.aggregationResult) {\n const aggResult = options.aggregationResult;\n const aggModel = options.aggregationModel || {};\n\n html += '<tr style=\"font-size: 11px; color: #666; background-color: #f5f5f5;\">';\n exportColumns.forEach((col) => {\n if (aggModel[col.field]) {\n html += `<td style=\"text-align: right; font-weight: bold;\">${escapeHTML(aggModel[col.field].toUpperCase())}</td>`;\n } else {\n html += `<td></td>`;\n }\n });\n html += '</tr>';\n\n html += '<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 = 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 html += `<td style=\"text-align: right;\">${escapeHTML(String(formatted))}</td>`;\n } else {\n html += `<td></td>`;\n }\n });\n html += '</tr>';\n }\n\n html += '</tbody></table></body></html>';\n\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}\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 } = options;\n\n // Filter rows if selection is active\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 // Filter columns\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 // Build JSON data\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\n // Use valueGetter if available\n if (col.valueGetter) {\n value = col.valueGetter({ row, field: col.field, value });\n }\n\n obj[col.field] = value;\n });\n return obj;\n });\n\n type ExportJsonPayload =\n | Record<string, unknown>[]\n | { data: Record<string, unknown>[]; aggregation: { labels: Record<string, unknown>; values: Record<string, unknown> } };\n\n let outData: ExportJsonPayload = data;\n\n if (options.aggregationResult) {\n const aggResult = options.aggregationResult;\n const aggModel = options.aggregationModel || {};\n\n const summaryLabelObj: Record<string, unknown> = {};\n exportColumns.forEach((col) => {\n if (aggModel[col.field]) {\n summaryLabelObj[col.field] = aggModel[col.field].toUpperCase();\n }\n });\n\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) {\n aggVal = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n } else if (aggModel[col.field]) {\n aggVal = formatAggregationValue(aggVal, aggModel[col.field]);\n }\n summaryDataObj[col.field] = aggVal;\n }\n });\n\n outData = {\n data: data,\n aggregation: {\n labels: summaryLabelObj,\n values: summaryDataObj\n }\n };\n }\n\n const jsonContent = pretty ? JSON.stringify(outData, null, 2) : JSON.stringify(outData);\n\n // Download file\n downloadFile(jsonContent, 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}\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 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 }\n\n // Filter rows if selection is active\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 // Filter columns\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 // Build HTML\n let html = `\n <!DOCTYPE html>\n <html>\n <head>\n <title>${title || 'Print'}</title>\n <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 @media print {\n body { margin: 0; }\n @page { margin: 1cm; }\n }\n </style>\n </head>\n <body>\n `;\n\n if (title) {\n html += `<h1>${escapeHTML(title)}</h1>`;\n }\n\n html += '<table>';\n\n // Headers\n html += '<thead><tr>';\n exportColumns.forEach(col => {\n html += `<th>${escapeHTML(col.headerName || col.field)}</th>`;\n });\n html += '</tr></thead>';\n\n // Rows\n html += '<tbody>';\n\n // Process rows (potential bottleneck logic here)\n rowsToExport.forEach(row => {\n html += '<tr>';\n exportColumns.forEach(col => {\n let value: unknown = (row as GridRowModel)[col.field];\n\n if (col.valueGetter) {\n value = col.valueGetter({ row, field: col.field, value });\n }\n\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\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 if (aggModel[col.field]) {\n html += `<td style=\"text-align: right; font-weight: bold;\">${escapeHTML(aggModel[col.field].toUpperCase())}</td>`;\n } else {\n html += `<td></td>`;\n }\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 = 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 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 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","\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","depth","hasChildren","groupingField","groupingValue","descendantCount","isGroupRow","content","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","clientResult","result","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","colDef","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","onHideColumn","onPinColumn","selectAllId","useId","cellRefs","menuOpenParams","setMenuOpenParams","handleMenuOpen","handleMenuClose","handleColumnClick","getSortIcon","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","pageCount","currentPage","displayedRows","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","groupLabel","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","defaultGetAggregationPosition","groupNode","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","map","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","CellImpl","onCellClick","onCellEditStart","onCellValueChange","isFocused","isFocusVisible","isEditable","onEditStart","onEditStop","colSpanInfo","rowSpanProp","isHiddenByRowSpan","handleValueChange","newValue","formattedValue","cellContent","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","searchQuery","setSearchQuery","dragOverField","setDragOverField","dragFieldRef","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","DataGrid","propOnRowSelectionModelChange","propFilterModel","onFilterModelChange","onSortModelChange","propPagination","controlledExpandedRowIds","onDetailPanelExpandedRowIdsChange","propRowGroupingModel","propRowCount","slots","slotProps","listView","propApiRef","defaultFilterModel","defaultRowGroupingModel","latestToolbarRef","StableToolbar","Toolbar","controlledState","onRowSelectionModelChange","pivot","activeRows","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","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","exportToCsv","fileName","includeHeaders","delimiter","rowsToExport","exportColumns","csvContent","headers","escapeCSV","aggResult","aggModel","aggLabels","aggValues","aggVal","formatted","downloadFile","exportToExcel","sheetName","html","escapeHTML","exportToJson","pretty","data","obj","outData","summaryLabelObj","summaryDataObj","jsonContent","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","columnStyles","headerFillColor","headerTextColor","headerFontSize","bodyFontSize","ExcelJS","workbook","sRows","resolvedSheets","imageCache","sheetDef","ws","argb","bottomBorder","rowScope","includeSummary","autoFilter","frozenHeader","alternateRowColor","imageColumns","urlsNeeded","seen","fetched","extension","imgId","headerValues","excelRowIdx","rowIdx","dataRow","maxImgH","max","rowHeightPt","rowHeightPx","colIdx","imgW","imgH","colWidthPx","hGapPx","vGapPx","labelRow","totalValues","topBorder","hex","clean","lightBase","themeToCSS","theme","vars","set","cssVar","s","sh","tr","tb","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]}
|