@opencorestack/opengridx 2.0.3 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/CHANGELOG.md +54 -3
  2. package/dist/index.d.ts +50 -2
  3. package/dist/opengridx.css +1 -1
  4. package/dist/opengridx.es.js +3805 -3692
  5. package/dist/opengridx.es.js.map +1 -1
  6. package/dist/opengridx.umd.js +16 -16
  7. package/dist/opengridx.umd.js.map +1 -1
  8. package/docs/API_REFERENCE.md +14 -4
  9. package/docs/components/column-visibility.md +40 -16
  10. package/docs/components/datagrid.md +1 -0
  11. package/docs/customization/slots-api.md +18 -6
  12. package/docs/features/export-guide.md +22 -3
  13. package/docs/features/sorting-pagination.md +2 -0
  14. package/docs/features/tree-data-grouping.md +8 -1
  15. package/docs/features/virtualization.md +66 -17
  16. package/docs/roadmap.md +13 -7
  17. package/lib/components/Cell/Cell.tsx +1 -0
  18. package/lib/components/DataGrid/DataGrid.css +7 -0
  19. package/lib/components/DataGrid/DataGrid.defects.test.tsx +103 -0
  20. package/lib/components/DataGrid/DataGrid.tsx +45 -11
  21. package/lib/components/DataGrid/DataGrid.virtualization.browser.test.tsx +183 -0
  22. package/lib/components/DataGrid/GridEmptyState.tsx +7 -1
  23. package/lib/components/DataGrid/GridListView.tsx +3 -0
  24. package/lib/components/DataGrid/GridPinnedRows.tsx +3 -0
  25. package/lib/components/DataGrid/GridVirtualRows.tsx +8 -1
  26. package/lib/components/ListView/ListViewRow.tsx +3 -0
  27. package/lib/components/Row/Row.tsx +10 -0
  28. package/lib/hooks/core/useGridColumns.tsx +8 -3
  29. package/lib/hooks/core/useGridDevWarnings.ts +42 -0
  30. package/lib/hooks/core/useGridKeyboardNavigation.ts +12 -14
  31. package/lib/hooks/core/useGridScrollSync.ts +62 -15
  32. package/lib/hooks/core/useGridVirtualization.ts +4 -1
  33. package/lib/hooks/core/useGridVisibleRows.ts +3 -2
  34. package/lib/hooks/features/useAggregation.ts +3 -38
  35. package/lib/hooks/useRowGrouping.test.ts +162 -1
  36. package/lib/hooks/useRowGrouping.ts +42 -59
  37. package/lib/hooks/useTreeData.test.ts +83 -0
  38. package/lib/hooks/useTreeData.ts +44 -43
  39. package/lib/index.ts +2 -0
  40. package/lib/types/index.ts +22 -2
  41. package/lib/utils/aggregation/aggregation.test.ts +16 -0
  42. package/lib/utils/aggregation/index.ts +62 -0
  43. package/lib/utils/export/exportToExcelAdvanced.test.ts +109 -0
  44. package/lib/utils/export/exportToExcelAdvanced.ts +89 -5
  45. package/lib/utils/scroll/index.ts +28 -0
  46. package/llms.txt +22 -13
  47. package/package.json +7 -3
@@ -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/CellErrorBoundary.tsx","../lib/components/Cell/Cell.tsx","../lib/components/ui/DragHandleIcon.tsx","../lib/components/DetailPanel/DetailPanel.tsx","../lib/components/Row/Row.tsx","../lib/components/DataGrid/GridPinnedRows.tsx","../lib/components/SkeletonRow/SkeletonRow.tsx","../lib/components/DataGrid/GridVirtualRows.tsx","../lib/components/ColumnVisibilityPanel/ColumnVisibilityPanel.tsx","../lib/components/DataGrid/GridStandaloneColumnPanel.tsx","../lib/components/DataGrid/DataGrid.tsx","../lib/components/Skeleton/Skeleton.tsx","../lib/components/FilterPanel/FilterPanel.tsx","../lib/components/Toolbar/PivotPanel.tsx","../lib/components/Toolbar/GlobalSearch.tsx","../lib/components/Tooltip/Tooltip.tsx","../lib/components/Toolbar/GridToolbar.tsx","../lib/hooks/core/useGridApiRef.ts","../lib/components/ui/Input.tsx","../lib/utils/export/exportToPdf.ts","../lib/utils/export/index.ts","../lib/utils/export/exportToExcelAdvanced.ts","../lib/theme/DataGridThemeProvider.tsx","../lib/theme/presets.ts","../lib/state/useGridStateStorage.ts"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (\n (\"number\" === typeof type.tag &&\n console.error(\n \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n ),\n type.$$typeof)\n ) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkKeyStringCoercion(value) {\n try {\n testStringCoercion(value);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n if (JSCompiler_inline_result) {\n JSCompiler_inline_result = console;\n var JSCompiler_temp_const = JSCompiler_inline_result.error;\n var JSCompiler_inline_result$jscomp$0 =\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\";\n JSCompiler_temp_const.call(\n JSCompiler_inline_result,\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n JSCompiler_inline_result$jscomp$0\n );\n return testStringCoercion(value);\n }\n }\n function getTaskName(type) {\n if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n if (\n \"object\" === typeof type &&\n null !== type &&\n type.$$typeof === REACT_LAZY_TYPE\n )\n return \"<...>\";\n try {\n var name = getComponentNameFromType(type);\n return name ? \"<\" + name + \">\" : \"<...>\";\n } catch (x) {\n return \"<...>\";\n }\n }\n function getOwner() {\n var dispatcher = ReactSharedInternals.A;\n return null === dispatcher ? null : dispatcher.getOwner();\n }\n function UnknownOwner() {\n return Error(\"react-stack-top-frame\");\n }\n function hasValidKey(config) {\n if (hasOwnProperty.call(config, \"key\")) {\n var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n if (getter && getter.isReactWarning) return !1;\n }\n return void 0 !== config.key;\n }\n function defineKeyPropWarningGetter(props, displayName) {\n function warnAboutAccessingKey() {\n specialPropKeyWarningShown ||\n ((specialPropKeyWarningShown = !0),\n console.error(\n \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n displayName\n ));\n }\n warnAboutAccessingKey.isReactWarning = !0;\n Object.defineProperty(props, \"key\", {\n get: warnAboutAccessingKey,\n configurable: !0\n });\n }\n function elementRefGetterWithDeprecationWarning() {\n var componentName = getComponentNameFromType(this.type);\n didWarnAboutElementRef[componentName] ||\n ((didWarnAboutElementRef[componentName] = !0),\n console.error(\n \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n ));\n componentName = this.props.ref;\n return void 0 !== componentName ? componentName : null;\n }\n function ReactElement(type, key, props, owner, debugStack, debugTask) {\n var refProp = props.ref;\n type = {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n props: props,\n _owner: owner\n };\n null !== (void 0 !== refProp ? refProp : null)\n ? Object.defineProperty(type, \"ref\", {\n enumerable: !1,\n get: elementRefGetterWithDeprecationWarning\n })\n : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n type._store = {};\n Object.defineProperty(type._store, \"validated\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: 0\n });\n Object.defineProperty(type, \"_debugInfo\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: null\n });\n Object.defineProperty(type, \"_debugStack\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugStack\n });\n Object.defineProperty(type, \"_debugTask\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugTask\n });\n Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n return type;\n }\n function jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n debugStack,\n debugTask\n ) {\n var children = config.children;\n if (void 0 !== children)\n if (isStaticChildren)\n if (isArrayImpl(children)) {\n for (\n isStaticChildren = 0;\n isStaticChildren < children.length;\n isStaticChildren++\n )\n validateChildKeys(children[isStaticChildren]);\n Object.freeze && Object.freeze(children);\n } else\n console.error(\n \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n );\n else validateChildKeys(children);\n if (hasOwnProperty.call(config, \"key\")) {\n children = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return \"key\" !== k;\n });\n isStaticChildren =\n 0 < keys.length\n ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n : \"{key: someKey}\";\n didWarnAboutKeySpread[children + isStaticChildren] ||\n ((keys =\n 0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n console.error(\n 'A props object containing a \"key\" prop is being spread into JSX:\\n let props = %s;\\n <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n let props = %s;\\n <%s key={someKey} {...props} />',\n isStaticChildren,\n children,\n keys,\n children\n ),\n (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n }\n children = null;\n void 0 !== maybeKey &&\n (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n children &&\n defineKeyPropWarningGetter(\n maybeKey,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n return ReactElement(\n type,\n children,\n maybeKey,\n getOwner(),\n debugStack,\n debugTask\n );\n }\n function validateChildKeys(node) {\n isValidElement(node)\n ? node._store && (node._store.validated = 1)\n : \"object\" === typeof node &&\n null !== node &&\n node.$$typeof === REACT_LAZY_TYPE &&\n (\"fulfilled\" === node._payload.status\n ? isValidElement(node._payload.value) &&\n node._payload.value._store &&\n (node._payload.value._store.validated = 1)\n : node._store && (node._store.validated = 1));\n }\n function isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n }\n var React = require(\"react\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n isArrayImpl = Array.isArray,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n React = {\n react_stack_bottom_frame: function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n React,\n UnknownOwner\n )();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutKeySpread = {};\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.jsx = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !1,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n exports.jsxs = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !0,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","\nimport type { GridColDef, GridRowModel, GridColumnPinning, GridRowPinning, GridPinnedPosition, GridRowId } from '../../types';\n\nexport function isColumnPinned(field: string, pinnedColumns?: GridColumnPinning): GridPinnedPosition | null {\n if (!pinnedColumns) return null;\n\n if (pinnedColumns.left?.includes(field)) {\n return 'left';\n }\n\n if (pinnedColumns.right?.includes(field)) {\n return 'right';\n }\n\n return null;\n}\n\nexport function getPinnedColumnGroups<R extends GridRowModel = GridRowModel>(\n columns: GridColDef<R>[],\n pinnedColumns?: GridColumnPinning\n): {\n left: GridColDef<R>[];\n center: GridColDef<R>[];\n right: GridColDef<R>[];\n} {\n const left: GridColDef<R>[] = [];\n const center: GridColDef<R>[] = [];\n const right: GridColDef<R>[] = [];\n\n if (!pinnedColumns) {\n return { left, center: columns, right };\n }\n\n columns.forEach(col => {\n const pinnedPosition = isColumnPinned(col.field, pinnedColumns);\n\n if (pinnedPosition === 'left') {\n left.push(col);\n } else if (pinnedPosition === 'right') {\n right.push(col);\n } else {\n center.push(col);\n }\n });\n\n if (pinnedColumns.left) {\n left.sort((a, b) => {\n const aIndex = pinnedColumns.left!.indexOf(a.field);\n const bIndex = pinnedColumns.left!.indexOf(b.field);\n return aIndex - bIndex;\n });\n }\n\n if (pinnedColumns.right) {\n right.sort((a, b) => {\n const aIndex = pinnedColumns.right!.indexOf(a.field);\n const bIndex = pinnedColumns.right!.indexOf(b.field);\n return aIndex - bIndex;\n });\n }\n\n return { left, center, right };\n}\n\nexport function calculatePinnedPositions<R extends GridRowModel = GridRowModel>(\n columns: GridColDef<R>[],\n columnWidths: Record<string, number>,\n pinnedColumns?: GridColumnPinning,\n checkboxSelection?: boolean,\n pinCheckboxColumn?: boolean,\n hasDetailPanel?: boolean,\n pinExpandColumn?: boolean,\n rowReordering?: boolean\n): Record<string, number> {\n const positions: Record<string, number> = {};\n\n if (!pinnedColumns) return positions;\n\n const groups = getPinnedColumnGroups(columns, pinnedColumns);\n\n let leftOffset = 0;\n\n if (rowReordering) {\n leftOffset += 48;\n }\n\n if (hasDetailPanel && pinExpandColumn) {\n leftOffset += 48; \n }\n\n if (checkboxSelection && pinCheckboxColumn) {\n leftOffset += 48; \n }\n\n groups.left.forEach(col => {\n positions[col.field] = leftOffset;\n const width = columnWidths[col.field] ?? col.width ?? 100;\n leftOffset += width;\n });\n\n let rightOffset = 0;\n\n [...groups.right].reverse().forEach(col => {\n const width = columnWidths[col.field] ?? col.width ?? 100;\n positions[col.field] = rightOffset;\n rightOffset += width;\n });\n\n return positions;\n}\n\nexport function isColumnPinnable<R extends GridRowModel = GridRowModel>(\n colDef: GridColDef<R>\n): boolean {\n return colDef.pinnable !== false;\n}\n\nexport function pinColumn(\n field: string,\n position: GridPinnedPosition,\n currentPinning?: GridColumnPinning\n): GridColumnPinning {\n const newPinning: GridColumnPinning = {\n left: [...(currentPinning?.left || [])],\n right: [...(currentPinning?.right || [])]\n };\n\n newPinning.left = (newPinning.left || []).filter(f => f !== field);\n newPinning.right = (newPinning.right || []).filter(f => f !== field);\n\n if (position === 'left') {\n if (!newPinning.left) newPinning.left = [];\n newPinning.left.push(field);\n } else {\n if (!newPinning.right) newPinning.right = [];\n newPinning.right.push(field);\n }\n\n return newPinning;\n}\n\nexport function unpinColumn(\n field: string,\n currentPinning?: GridColumnPinning\n): GridColumnPinning {\n if (!currentPinning) return {};\n\n return {\n left: currentPinning.left?.filter(f => f !== field) || [],\n right: currentPinning.right?.filter(f => f !== field) || []\n };\n}\n\nexport function getPinnedColumnsWidth(\n columns: GridColDef[],\n columnWidths: Record<string, number>,\n position: GridPinnedPosition,\n pinnedColumns?: GridColumnPinning\n): number {\n if (!pinnedColumns) return 0;\n\n const pinnedFields = position === 'left' ? pinnedColumns.left : pinnedColumns.right;\n if (!pinnedFields) return 0;\n\n return pinnedFields.reduce((total, field) => {\n const col = columns.find(c => c.field === field);\n if (!col) return total;\n\n const width = columnWidths[field] ?? col.width ?? 100;\n return total + width;\n }, 0);\n}\n\nexport function isRowPinned(\n rowId: GridRowId,\n pinnedRows?: GridRowPinning\n): 'top' | 'bottom' | null {\n if (!pinnedRows) return null;\n\n if (pinnedRows.top?.includes(rowId)) {\n return 'top';\n }\n\n if (pinnedRows.bottom?.includes(rowId)) {\n return 'bottom';\n }\n\n return null;\n}\n\nexport function getPinnedRowGroups<R extends GridRowModel = GridRowModel>(\n rows: R[],\n pinnedRows?: GridRowPinning\n): {\n top: R[];\n center: R[];\n bottom: R[];\n} {\n const top: R[] = [];\n const center: R[] = [];\n const bottom: R[] = [];\n\n if (!pinnedRows) {\n return { top, center: rows, bottom };\n }\n\n rows.forEach(row => {\n const pinnedPosition = isRowPinned(row.id, pinnedRows);\n\n if (pinnedPosition === 'top') {\n top.push(row);\n } else if (pinnedPosition === 'bottom') {\n bottom.push(row);\n } else {\n center.push(row);\n }\n });\n\n if (pinnedRows.top) {\n top.sort((a, b) => {\n const aIndex = pinnedRows.top!.indexOf(a.id);\n const bIndex = pinnedRows.top!.indexOf(b.id);\n return aIndex - bIndex;\n });\n }\n\n if (pinnedRows.bottom) {\n bottom.sort((a, b) => {\n const aIndex = pinnedRows.bottom!.indexOf(a.id);\n const bIndex = pinnedRows.bottom!.indexOf(b.id);\n return aIndex - bIndex;\n });\n }\n\n return { top, center, bottom };\n}\n\nexport function pinRow(\n rowId: GridRowId,\n position: 'top' | 'bottom',\n currentPinning?: GridRowPinning\n): GridRowPinning {\n const newPinning: GridRowPinning = {\n top: [...(currentPinning?.top || [])],\n bottom: [...(currentPinning?.bottom || [])]\n };\n\n newPinning.top = (newPinning.top || []).filter(id => id !== rowId);\n newPinning.bottom = (newPinning.bottom || []).filter(id => id !== rowId);\n\n if (position === 'top') {\n if (!newPinning.top) newPinning.top = [];\n newPinning.top.push(rowId);\n } else {\n if (!newPinning.bottom) newPinning.bottom = [];\n newPinning.bottom.push(rowId);\n }\n\n return newPinning;\n}\n\nexport function unpinRow(\n rowId: GridRowId,\n currentPinning?: GridRowPinning\n): GridRowPinning {\n if (!currentPinning) return {};\n\n return {\n top: currentPinning.top?.filter(id => id !== rowId) || [],\n bottom: currentPinning.bottom?.filter(id => id !== rowId) || []\n };\n}\n\nexport function getPinnedRowsCount(\n position: 'top' | 'bottom',\n pinnedRows?: GridRowPinning\n): number {\n if (!pinnedRows) return 0;\n\n const pinnedIds = position === 'top' ? pinnedRows.top : pinnedRows.bottom;\n return pinnedIds?.length || 0;\n}\n","import { useMemo } from 'react';\nimport type { GridColDef, GridRowModel, GridRowId, GridColumnPinning, GridDetailPanelHeight } from '../../types';\nimport { isColumnPinned } from '../../utils/pinning';\n\nexport interface UseLayoutParams<R extends GridRowModel> {\n rowHeight: number;\n pagination: boolean;\n paginatedUnpinnedRows: R[];\n sortedUnpinnedRows: R[];\n expandedRowIds: Set<GridRowId>;\n getDetailPanelHeight?: (params: { row: R; id: GridRowId; rowIndex: number }) => GridDetailPanelHeight;\n pinnedTopRowsLength: number;\n pinnedBottomRowsLength: number;\n visibleOrderedColumns: GridColDef<R>[];\n pinnedColumns?: GridColumnPinning;\n columnWidths: Record<string, number>;\n viewportWidth: number;\n checkboxSelection: boolean;\n hasDetailPanel: boolean;\n rowReordering: boolean;\n pinCheckboxColumn: boolean;\n pinExpandColumn: boolean;\n autoHeight: boolean;\n paginationMode: string;\n isLoading: boolean;\n pageSize: number;\n}\n\nexport interface LayoutResult<R extends GridRowModel> {\n rowHeights: number[];\n cumulativeHeights: number[];\n unpinnedRowsHeight: number;\n pinnedTopHeight: number;\n pinnedBottomHeight: number;\n leftPinnedCols: (GridColDef<R> & { width: number; zIndex: number })[];\n rightPinnedCols: (GridColDef<R> & { width: number; zIndex: number })[];\n unpinnedColsWithWidth: (GridColDef<R> & { width: number })[];\n unpinnedColWidths: number[];\n unpinnedAccWidths: number[];\n totalWidth: number;\n leftWidth: number;\n rightWidth: number;\n unpinnedTotalWidth: number;\n systemColumnsWidth: number;\n pinnedTopRowsLength: number;\n pinnedBottomRowsLength: number;\n unpinnedRowsLength: number;\n}\n\nfunction parseWidth(width: number | string | undefined): { type: 'fixed' | 'percentage' | 'auto'; value: number } {\n if (width === undefined) return { type: 'auto', value: 0 };\n if (typeof width === 'number') return { type: 'fixed', value: width };\n if (typeof width === 'string') {\n if (width.toLowerCase() === 'auto') return { type: 'auto', value: 0 };\n if (width.endsWith('%')) {\n const percentage = parseFloat(width);\n return { type: 'percentage', value: percentage };\n }\n const floatVal = parseFloat(width);\n if (!isNaN(floatVal)) return { type: 'fixed', value: floatVal };\n }\n return { type: 'fixed', value: 100 };\n}\n\nexport function useLayout<R extends GridRowModel>(params: UseLayoutParams<R>): LayoutResult<R> {\n const {\n rowHeight,\n pagination,\n paginatedUnpinnedRows,\n sortedUnpinnedRows,\n expandedRowIds,\n getDetailPanelHeight,\n pinnedTopRowsLength,\n pinnedBottomRowsLength,\n visibleOrderedColumns,\n pinnedColumns,\n columnWidths,\n viewportWidth,\n checkboxSelection,\n hasDetailPanel,\n rowReordering,\n paginationMode,\n isLoading,\n pageSize,\n } = params;\n\n return useMemo<LayoutResult<R>>(() => {\n const unpinnedRows = pagination ? paginatedUnpinnedRows : sortedUnpinnedRows;\n\n const rowHeights = unpinnedRows.map((row, index) => {\n let height = rowHeight;\n if (expandedRowIds.has(row.id)) {\n const detailHeight = getDetailPanelHeight?.({ row, id: row.id, rowIndex: pinnedTopRowsLength + index }) ?? 200;\n height += typeof detailHeight === 'number' ? detailHeight : parseInt(String(detailHeight), 10) || 200;\n }\n return height;\n });\n\n const cumulativeHeights = rowHeights.reduce((acc, height, index) => {\n acc.push((acc[index - 1] || 0) + height);\n return acc;\n }, [] as number[]);\n\n const skeletonCount = (paginationMode === 'infinite' && isLoading && unpinnedRows.length > 0)\n ? Math.min(pageSize, 20)\n : 0;\n const unpinnedRowsHeight = (cumulativeHeights[cumulativeHeights.length - 1] || 0) + skeletonCount * rowHeight;\n const pinnedTopHeight = pinnedTopRowsLength * rowHeight;\n const pinnedBottomHeight = pinnedBottomRowsLength * rowHeight;\n\n const rawLeftPinnedCols: GridColDef<R>[] = [];\n const rawRightPinnedCols: GridColDef<R>[] = [];\n const unpinnedCols: GridColDef<R>[] = [];\n const unpinnedColWidths: number[] = [];\n\n visibleOrderedColumns.forEach(col => {\n const pinned = isColumnPinned(col.field, pinnedColumns);\n if (pinned === 'left') {\n rawLeftPinnedCols.push(col);\n } else if (pinned === 'right') {\n rawRightPinnedCols.push(col);\n } else {\n unpinnedCols.push(col);\n }\n });\n\n const systemColumnsWidth = (checkboxSelection ? 48 : 0) + (hasDetailPanel ? 48 : 0) + (rowReordering ? 48 : 0);\n\n const getColWidth = (c: GridColDef<R>) => columnWidths[c.field] ?? c.width;\n\n const leftWidth = rawLeftPinnedCols.reduce((sum, c) => {\n const parsed = parseWidth(getColWidth(c));\n return sum + (parsed.type === 'fixed' ? parsed.value : 100);\n }, 0);\n const rightWidth = rawRightPinnedCols.reduce((sum, c) => {\n const parsed = parseWidth(getColWidth(c));\n return sum + (parsed.type === 'fixed' ? parsed.value : 100);\n }, 0);\n\n const naturalFlexWidth = unpinnedCols.reduce((sum, col) => {\n const hasManualWidth = Object.prototype.hasOwnProperty.call(columnWidths, col.field);\n if (!hasManualWidth && col.flex && col.flex > 0) {\n const minWidth = col.minWidth ?? 150;\n const w = typeof col.width === 'number' ? col.width : 150;\n return sum + (minWidth || w);\n }\n const parsed = parseWidth(getColWidth(col));\n if (parsed.type === 'fixed') return sum + parsed.value;\n if (parsed.type === 'percentage') return sum + 100;\n return sum + (col.minWidth ?? 150);\n }, 0);\n\n const availableWidth = Math.max(\n viewportWidth - systemColumnsWidth - leftWidth - rightWidth,\n naturalFlexWidth\n );\n\n const fixedWidthCols: Array<{ col: GridColDef<R>; width: number }> = [];\n const percentageCols: Array<{ col: GridColDef<R>; percentage: number }> = [];\n const flexCols: Array<{ col: GridColDef<R>; flex: number }> = [];\n\n unpinnedCols.forEach(col => {\n const hasManualWidth = Object.prototype.hasOwnProperty.call(columnWidths, col.field);\n const parsed = parseWidth(getColWidth(col));\n\n if (!hasManualWidth && col.flex && col.flex > 0) {\n flexCols.push({ col, flex: col.flex });\n return;\n }\n\n if (parsed.type === 'fixed') {\n fixedWidthCols.push({ col, width: parsed.value });\n } else if (parsed.type === 'percentage') {\n percentageCols.push({ col, percentage: parsed.value });\n } else {\n flexCols.push({ col, flex: 1 });\n }\n });\n\n const fixedWidth = fixedWidthCols.reduce((sum, { width }) => sum + width, 0);\n let remainingSpaceForFlex = Math.max(0, availableWidth - fixedWidth);\n\n const percentageWidthMap = new Map<string, number>();\n percentageCols.forEach(({ col, percentage }) => {\n const calculatedWidth = (percentage / 100) * remainingSpaceForFlex;\n percentageWidthMap.set(col.field, calculatedWidth);\n remainingSpaceForFlex -= calculatedWidth;\n });\n remainingSpaceForFlex = Math.max(0, remainingSpaceForFlex);\n\n const finalFlexWidths = new Map<string, number>();\n const flexItems = flexCols.map(f => ({\n ...f,\n minWidth: f.col.minWidth ?? 50,\n maxWidth: f.col.maxWidth ?? Infinity,\n frozen: false,\n computedWidth: 0\n }));\n\n const solveFlexAllocation = () => {\n let iterations = 0;\n const maxIterations = flexItems.length * 2;\n\n while (iterations < maxIterations) {\n iterations++;\n const unfrozen = flexItems.filter(f => !f.frozen);\n if (unfrozen.length === 0) break;\n\n const unfrozenFlexTotal = unfrozen.reduce((sum, f) => sum + f.flex, 0);\n const frozenWidthTotal = flexItems.reduce((sum, f) => f.frozen ? sum + f.computedWidth : sum, 0);\n const currentFreeSpace = Math.max(0, remainingSpaceForFlex - frozenWidthTotal);\n\n if (unfrozenFlexTotal <= 0) {\n unfrozen.forEach(f => { f.computedWidth = f.minWidth; f.frozen = true; });\n break;\n }\n\n const pixelsPerFlex = currentFreeSpace / unfrozenFlexTotal;\n let totalViolation = 0;\n const minViolators: typeof flexItems = [];\n const maxViolators: typeof flexItems = [];\n\n unfrozen.forEach(f => {\n const rawWidth = pixelsPerFlex * f.flex;\n if (rawWidth < f.minWidth) {\n totalViolation += f.minWidth - rawWidth;\n minViolators.push(f);\n } else if (rawWidth > f.maxWidth) {\n totalViolation += f.maxWidth - rawWidth;\n maxViolators.push(f);\n } else {\n f.computedWidth = rawWidth;\n }\n });\n\n if (minViolators.length === 0 && maxViolators.length === 0) {\n unfrozen.forEach(f => f.frozen = true);\n break;\n }\n\n if (totalViolation > 0) {\n minViolators.forEach(f => { f.computedWidth = f.minWidth; f.frozen = true; });\n } else if (totalViolation < 0) {\n maxViolators.forEach(f => { f.computedWidth = f.maxWidth; f.frozen = true; });\n } else {\n minViolators.forEach(f => { f.computedWidth = f.minWidth; f.frozen = true; });\n maxViolators.forEach(f => { f.computedWidth = f.maxWidth; f.frozen = true; });\n }\n }\n };\n\n solveFlexAllocation();\n flexItems.forEach(f => finalFlexWidths.set(f.col.field, f.computedWidth));\n\n const computedWidthMap = new Map<string, number>();\n unpinnedCols.forEach(col => {\n let computedWidth: number;\n if (finalFlexWidths.has(col.field)) {\n computedWidth = finalFlexWidths.get(col.field)!;\n } else {\n const fixedCol = fixedWidthCols.find(f => f.col.field === col.field);\n const pctCol = percentageCols.find(p => p.col.field === col.field);\n if (fixedCol) {\n computedWidth = fixedCol.width;\n } else if (pctCol) {\n const rawPctWidth = percentageWidthMap.get(col.field) || 0;\n computedWidth = Math.max(col.minWidth ?? 50, rawPctWidth || 100);\n } else {\n computedWidth = 100;\n }\n }\n unpinnedColWidths.push(computedWidth);\n computedWidthMap.set(col.field, computedWidth);\n });\n\n const unpinnedColsWithWidth = unpinnedCols.map(col => {\n const flexItem = flexItems.find(f => f.col.field === col.field);\n return {\n ...col,\n width: computedWidthMap.get(col.field) ?? (typeof col.width === 'number' ? col.width : 100),\n flex: flexItem ? flexItem.flex : col.flex\n };\n });\n\n const baseLeftZ = 11;\n const leftPinnedCols = rawLeftPinnedCols.map((col, i) => {\n const parsed = parseWidth(getColWidth(col));\n return { ...col, width: parsed.type === 'fixed' ? parsed.value : 100, zIndex: baseLeftZ + i };\n });\n\n const baseRightZ = 11;\n const rightPinnedCols = rawRightPinnedCols.map((col, i) => {\n const parsed = parseWidth(getColWidth(col));\n return {\n ...col,\n width: parsed.type === 'fixed' ? parsed.value : 100,\n zIndex: baseRightZ + (rawRightPinnedCols.length - 1 - i)\n };\n });\n\n const unpinnedTotalWidth = unpinnedColWidths.reduce((sum, w) => sum + w, 0);\n const totalWidth = leftWidth + unpinnedTotalWidth + rightWidth + systemColumnsWidth;\n const unpinnedAccWidths = unpinnedColWidths.reduce((acc, w, i) => {\n acc.push((acc[i - 1] || 0) + w);\n return acc;\n }, [] as number[]);\n\n return {\n rowHeights,\n cumulativeHeights,\n unpinnedRowsHeight,\n pinnedTopHeight,\n pinnedBottomHeight,\n leftPinnedCols,\n rightPinnedCols,\n unpinnedColsWithWidth,\n unpinnedColWidths,\n unpinnedAccWidths,\n totalWidth,\n leftWidth,\n rightWidth,\n unpinnedTotalWidth,\n systemColumnsWidth,\n pinnedTopRowsLength,\n pinnedBottomRowsLength,\n unpinnedRowsLength: unpinnedRows.length,\n };\n }, [\n rowHeight,\n pagination,\n paginatedUnpinnedRows,\n sortedUnpinnedRows,\n expandedRowIds,\n getDetailPanelHeight,\n pinnedTopRowsLength,\n pinnedBottomRowsLength,\n visibleOrderedColumns,\n pinnedColumns,\n columnWidths,\n viewportWidth,\n checkboxSelection,\n hasDetailPanel,\n rowReordering,\n paginationMode,\n isLoading,\n pageSize,\n ]);\n}\n","import { useState, useCallback } from 'react';\nimport type { GridRowModel, GridRowId, GridColDef, GridCellParams, GridSortItem, GridSortDirection } from '../../types';\nimport type { GridEditingState } from '../features/useGridEditing';\n\ninterface ColumnMetrics {\n leftPinnedWidth: number;\n rightPinnedWidth: number;\n unpinnedAccWidths: number[];\n unpinnedCols: { field: string }[];\n totalSpecialsWidth: number;\n pinnedSpecialsWidth: number;\n}\n\ninterface VirtualizationSnapshot {\n cumulativeHeights: number[];\n pinnedTopHeight: number;\n columnMetrics: ColumnMetrics | null;\n}\n\nexport interface UseGridKeyboardNavigationParams<R extends GridRowModel> {\n allRenderableRows: R[];\n navigationColumns: { field: string; editable?: boolean; sortable?: boolean }[];\n checkboxSelection: boolean;\n selectedRowIds: Set<GridRowId>;\n handleSelectionChange: (id: GridRowId, selected: boolean) => void;\n handleDetailPanelToggle: (id: GridRowId) => void;\n editingHandlers: {\n editingCell: GridEditingState['editingCell'];\n startCellEdit: (params: { id: GridRowId; field: string; value: unknown }) => void;\n stopCellEdit: (params?: { cancel?: boolean }) => void;\n };\n setKeyboardMode: (mode: boolean) => void;\n sortModel: GridSortItem[];\n handleSort: (field: string, direction: GridSortDirection) => void;\n isCellEditable?: (params: GridCellParams<R>) => boolean;\n pagination: boolean;\n pageSize: number;\n virtualization: VirtualizationSnapshot;\n viewportRef: React.RefObject<HTMLDivElement | null>;\n}\n\nexport interface FocusedCell {\n id: GridRowId;\n field: string;\n}\n\nexport interface UseGridKeyboardNavigationReturn {\n focusedCell: FocusedCell | null;\n setFocusedCell: React.Dispatch<React.SetStateAction<FocusedCell | null>>;\n handleFocus: (event: React.FocusEvent<HTMLDivElement>) => void;\n handleBlur: (event: React.FocusEvent<HTMLDivElement>) => void;\n handleKeyDown: (event: React.KeyboardEvent) => void;\n}\n\nexport function useGridKeyboardNavigation<R extends GridRowModel>(\n params: UseGridKeyboardNavigationParams<R>\n): UseGridKeyboardNavigationReturn {\n const {\n allRenderableRows,\n navigationColumns,\n checkboxSelection,\n selectedRowIds,\n handleSelectionChange,\n handleDetailPanelToggle,\n editingHandlers,\n setKeyboardMode,\n sortModel,\n handleSort,\n isCellEditable,\n pagination,\n pageSize,\n virtualization,\n viewportRef,\n } = params;\n\n const [focusedCell, setFocusedCell] = useState<FocusedCell | null>(null);\n\n const handleFocus = useCallback((event: React.FocusEvent<HTMLDivElement>) => {\n if (event.target === event.currentTarget) {\n setFocusedCell(prev => {\n if (prev) return prev;\n if (checkboxSelection) {\n return { id: 'HEADER', field: '__checkbox_col__' };\n }\n const firstRow = allRenderableRows[0];\n const firstCol = navigationColumns[0];\n if (firstRow && firstCol) {\n return { id: firstRow.id, field: firstCol.field };\n }\n return null;\n });\n }\n }, [allRenderableRows, navigationColumns, checkboxSelection]);\n\n const handleBlur = useCallback((event: React.FocusEvent<HTMLDivElement>) => {\n if (!event.currentTarget.contains(event.relatedTarget as Node)) {\n setFocusedCell(null);\n }\n }, []);\n\n const handleKeyDown = useCallback((event: React.KeyboardEvent) => {\n setKeyboardMode(true);\n\n if (!focusedCell) return;\n\n const { id, field } = focusedCell;\n const isEditing = Boolean(editingHandlers.editingCell);\n\n if (id === 'HEADER' && (event.key === 'Enter' || event.key === ' ')) {\n event.preventDefault();\n const col = navigationColumns.find(c => c.field === field);\n if (col && col.sortable !== false) {\n const currentSort = sortModel.find(item => item.field === field);\n let newDirection: GridSortDirection = 'asc';\n if (currentSort) {\n newDirection = currentSort.sort === 'asc' ? 'desc' : null;\n }\n handleSort(field, newDirection);\n }\n return;\n }\n\n if (event.key === 'Enter') {\n event.preventDefault();\n if (isEditing) {\n editingHandlers.stopCellEdit();\n } else {\n const col = navigationColumns.find(c => c.field === field);\n if (col?.editable) {\n const row = allRenderableRows.find(r => r.id === id);\n if (row) {\n editingHandlers.startCellEdit({ id, field, value: (row as R & Record<string, unknown>)[field] });\n }\n }\n }\n return;\n }\n\n if (event.key === ' ' || event.key === 'Spacebar') {\n if (!isEditing) {\n if (field === '__checkbox_col__') {\n event.preventDefault();\n handleSelectionChange(id, !selectedRowIds.has(id));\n return;\n }\n if (field === '__expand_col__') {\n event.preventDefault();\n handleDetailPanelToggle(id);\n return;\n }\n }\n }\n\n if (event.key === 'Escape') {\n if (isEditing) {\n event.preventDefault();\n editingHandlers.stopCellEdit({ cancel: true });\n }\n return;\n }\n\n if (isEditing && event.key !== 'Tab') return;\n\n const isHeader = id === 'HEADER';\n const rowIndex = isHeader ? -1 : allRenderableRows.findIndex(r => r.id === id);\n const colIndex = navigationColumns.findIndex(c => c.field === field);\n\n if (!isHeader && rowIndex === -1) return;\n if (colIndex === -1) return;\n\n const findNextCell = (\n startRow: number,\n startCol: number,\n deltaRow: number,\n deltaCol: number,\n wrapRow: boolean,\n allowHeader = false\n ) => {\n let r = startRow + deltaRow;\n let c = startCol + deltaCol;\n\n if (wrapRow && deltaCol !== 0) {\n if (deltaCol > 0 && c >= navigationColumns.length) { c = 0; r++; }\n else if (deltaCol < 0 && c < 0) { c = navigationColumns.length - 1; r--; }\n }\n\n if (!wrapRow && (c < 0 || c >= navigationColumns.length)) return null;\n if (r < (allowHeader ? -1 : 0) || r >= allRenderableRows.length) return null;\n\n return { r, c };\n };\n\n const findNextEditable = (\n startRow: number,\n startCol: number,\n deltaRow: number,\n deltaCol: number,\n wrapRow: boolean,\n allowHeader = false\n ) => {\n let r = startRow;\n let c = startCol;\n let steps = 0;\n const maxSteps = allRenderableRows.length * navigationColumns.length + navigationColumns.length;\n\n while (steps < maxSteps) {\n steps++;\n r += deltaRow;\n c += deltaCol;\n\n if (wrapRow && deltaCol !== 0) {\n if (deltaCol > 0) {\n if (c >= navigationColumns.length) { c = 0; r++; }\n } else {\n if (c < 0) { c = navigationColumns.length - 1; r--; }\n }\n } else {\n if (c < 0 || c >= navigationColumns.length) return null;\n }\n\n if (r < -1 || r >= allRenderableRows.length) return null;\n\n if (r === -1) {\n if (!allowHeader) continue;\n const col = navigationColumns[c];\n const isSortable = col.sortable !== false;\n if (['__checkbox_col__'].includes(col.field) || isSortable) return { r, c };\n continue;\n }\n\n const row = allRenderableRows[r];\n const col = navigationColumns[c];\n const isInteractable = ['__checkbox_col__', '__expand_col__', '__reorder_col__'].includes(col.field);\n let cellEditable = col.editable || isInteractable;\n\n if (isCellEditable && !isInteractable) {\n try {\n cellEditable = isCellEditable({\n row,\n field: col.field,\n value: (row as R & Record<string, unknown>)[col.field],\n colDef: col as GridColDef<R>,\n rowIndex: r,\n colIndex: c\n });\n } catch {\n // isCellEditable threw — treat cell as non-editable\n }\n }\n\n if (cellEditable) return { r, c };\n }\n return null;\n };\n\n let nextRowIndex = rowIndex;\n let nextColIndex = colIndex;\n let handled = false;\n\n if (event.key === 'Tab') {\n const dir = event.shiftKey ? -1 : 1;\n const res = findNextEditable(rowIndex, colIndex, 0, dir, true, false);\n if (res) { nextRowIndex = res.r; nextColIndex = res.c; handled = true; }\n } else if (event.key === 'ArrowRight') {\n const res = findNextCell(rowIndex, colIndex, 0, 1, true, true);\n if (res) { nextRowIndex = res.r; nextColIndex = res.c; handled = true; }\n } else if (event.key === 'ArrowLeft') {\n const res = findNextCell(rowIndex, colIndex, 0, -1, true, true);\n if (res) { nextRowIndex = res.r; nextColIndex = res.c; handled = true; }\n } else if (event.key === 'ArrowDown') {\n const res = findNextCell(rowIndex, colIndex, 1, 0, false, true);\n if (res) { nextRowIndex = res.r; nextColIndex = res.c; handled = true; }\n } else if (event.key === 'ArrowUp') {\n const res = findNextCell(rowIndex, colIndex, -1, 0, false, true);\n if (res) { nextRowIndex = res.r; nextColIndex = res.c; handled = true; }\n } else if (event.key === 'Home') {\n nextColIndex = 0;\n if (event.ctrlKey || event.metaKey) nextRowIndex = -1;\n handled = true;\n } else if (event.key === 'End') {\n nextColIndex = navigationColumns.length - 1;\n if (event.ctrlKey || event.metaKey) nextRowIndex = allRenderableRows.length - 1;\n handled = true;\n } else if (event.key === 'PageUp') {\n const pg = pagination ? pageSize : 10;\n nextRowIndex = Math.max(-1, nextRowIndex - pg);\n handled = true;\n } else if (event.key === 'PageDown') {\n const pg = pagination ? pageSize : 10;\n nextRowIndex = Math.min(allRenderableRows.length - 1, nextRowIndex + pg);\n handled = true;\n }\n\n if (handled) {\n event.preventDefault();\n\n if (isEditing && event.key === 'Tab') {\n editingHandlers.stopCellEdit();\n }\n\n if (nextRowIndex >= -1 && nextRowIndex < allRenderableRows.length &&\n nextColIndex >= 0 && nextColIndex < navigationColumns.length) {\n\n const nextCol = navigationColumns[nextColIndex];\n\n if (nextRowIndex === -1) {\n setFocusedCell({ id: 'HEADER', field: nextCol.field });\n } else {\n setFocusedCell({ id: allRenderableRows[nextRowIndex].id, field: nextCol.field });\n }\n\n const el = viewportRef.current;\n if (el) {\n const { cumulativeHeights, pinnedTopHeight, columnMetrics } = virtualization;\n const { clientHeight, clientWidth, scrollTop, scrollLeft } = el;\n\n const rowTop = nextRowIndex <= 0 ? 0 : cumulativeHeights[nextRowIndex - 1];\n const rowBottom = cumulativeHeights[nextRowIndex];\n const visibleTop = scrollTop + pinnedTopHeight;\n const visibleBottom = scrollTop + clientHeight;\n\n let newScrollTop = scrollTop;\n if (rowTop < visibleTop) {\n newScrollTop = Math.max(0, rowTop - pinnedTopHeight);\n } else if (rowBottom > visibleBottom) {\n newScrollTop = rowBottom - clientHeight;\n }\n if (newScrollTop !== scrollTop) el.scrollTop = newScrollTop;\n\n if (columnMetrics) {\n const { leftPinnedWidth, rightPinnedWidth, unpinnedAccWidths, unpinnedCols, totalSpecialsWidth, pinnedSpecialsWidth } = columnMetrics;\n const unpinnedIndex = unpinnedCols.findIndex(c => c.field === nextCol.field);\n\n if (unpinnedIndex !== -1) {\n const colLeft = totalSpecialsWidth + leftPinnedWidth + (unpinnedIndex > 0 ? unpinnedAccWidths[unpinnedIndex - 1] : 0);\n const colRight = totalSpecialsWidth + leftPinnedWidth + unpinnedAccWidths[unpinnedIndex];\n const visibleStart = scrollLeft + pinnedSpecialsWidth + leftPinnedWidth;\n const visibleEnd = scrollLeft + clientWidth - rightPinnedWidth;\n\n let newScrollLeft = scrollLeft;\n if (colLeft < visibleStart) {\n newScrollLeft = Math.max(0, colLeft - pinnedSpecialsWidth - leftPinnedWidth);\n } else if (colRight > visibleEnd) {\n newScrollLeft = colRight - clientWidth + rightPinnedWidth;\n }\n if (newScrollLeft !== scrollLeft) el.scrollLeft = newScrollLeft;\n }\n }\n }\n }\n }\n }, [\n focusedCell,\n allRenderableRows,\n navigationColumns,\n editingHandlers,\n virtualization,\n selectedRowIds,\n handleSelectionChange,\n handleDetailPanelToggle,\n setKeyboardMode,\n sortModel,\n handleSort,\n isCellEditable,\n pagination,\n pageSize,\n viewportRef,\n ]);\n\n return { focusedCell, setFocusedCell, handleFocus, handleBlur, handleKeyDown };\n}\n","import { useState, useCallback, useMemo } from 'react';\nimport type {\n GridRowId,\n GridSortItem,\n GridColumnPinning,\n GridPaginationModel,\n GridAggregationModel,\n GridPivotModel,\n} from '../../types';\nimport type { GridInitialState } from '../../state/types';\n\nexport interface UseGridControlledStateParams {\n initialState?: GridInitialState;\n\n sortModel?: GridSortItem[];\n onSortModelChange?: (model: GridSortItem[]) => void;\n\n aggregationModel?: GridAggregationModel;\n onAggregationModelChange?: (model: GridAggregationModel) => void;\n\n columnVisibilityModel?: Record<string, boolean>;\n onColumnVisibilityModelChange?: (model: Record<string, boolean>) => void;\n\n pinnedColumns?: GridColumnPinning;\n onPinnedColumnsChange?: (model: GridColumnPinning) => void;\n\n pivotModel?: GridPivotModel;\n onPivotModelChange?: (model: GridPivotModel) => void;\n\n paginationModel?: GridPaginationModel;\n onPaginationModelChange?: (model: GridPaginationModel) => void;\n\n rowSelectionModel?: GridRowId[];\n onRowSelectionModelChange?: (model: GridRowId[]) => void;\n}\n\nexport interface UseGridControlledStateReturn {\n // sort\n sortModel: GridSortItem[];\n isSortControlled: boolean;\n setInternalSortModel: React.Dispatch<React.SetStateAction<GridSortItem[]>>;\n\n // aggregation\n aggregationModel: GridAggregationModel;\n handleAggregationModelChange: (model: GridAggregationModel) => void;\n\n // column visibility\n columnVisibilityModel: Record<string, boolean>;\n handleColumnVisibilityModelChange: (model: Record<string, boolean>) => void;\n\n // pinned columns\n pinnedColumns: GridColumnPinning;\n handlePinnedColumnsChange: (model: GridColumnPinning) => void;\n\n // pivot\n currentPivotModel: GridPivotModel;\n handlePivotModelChange: (model: GridPivotModel) => void;\n\n // pagination\n effectivePaginationModel: GridPaginationModel;\n handlePaginationModelChange: (model: GridPaginationModel) => void;\n\n // selection\n rowSelectionModel: GridRowId[];\n selectedRowIds: Set<GridRowId>;\n isSelectionControlled: boolean;\n setInternalRowSelectionModel: React.Dispatch<React.SetStateAction<GridRowId[]>>;\n}\n\nconst EMPTY_PIVOT_MODEL: GridPivotModel = { rowFields: [], columnFields: [], valueFields: [] };\n\nexport function useGridControlledState(params: UseGridControlledStateParams): UseGridControlledStateReturn {\n const {\n initialState,\n sortModel: propSortModel,\n aggregationModel: propAggregationModel,\n onAggregationModelChange,\n columnVisibilityModel: propColumnVisibilityModel,\n onColumnVisibilityModelChange,\n pinnedColumns: propPinnedColumns,\n onPinnedColumnsChange,\n pivotModel: propPivotModel,\n onPivotModelChange,\n paginationModel: propPaginationModel,\n onPaginationModelChange,\n rowSelectionModel: propRowSelectionModel,\n onRowSelectionModelChange,\n } = params;\n\n // ── Sort ─────────────────────────────────────────────────────────────────\n const [internalSortModel, setInternalSortModel] = useState<GridSortItem[]>(\n () => initialState?.sorting?.sortModel ?? []\n );\n const isSortControlled = propSortModel !== undefined;\n const sortModel = isSortControlled ? propSortModel! : internalSortModel;\n\n // ── Aggregation ──────────────────────────────────────────────────────────\n const isAggregationControlled = propAggregationModel !== undefined;\n const [internalAggregationModel, setInternalAggregationModel] = useState<GridAggregationModel>(\n () => propAggregationModel ?? {}\n );\n const aggregationModel = isAggregationControlled ? propAggregationModel! : internalAggregationModel;\n\n const handleAggregationModelChange = useCallback((model: GridAggregationModel) => {\n if (!isAggregationControlled) setInternalAggregationModel(model);\n onAggregationModelChange?.(model);\n }, [isAggregationControlled, onAggregationModelChange]);\n\n // ── Column visibility ────────────────────────────────────────────────────\n const isColumnVisibilityControlled = propColumnVisibilityModel !== undefined;\n const [internalColumnVisibilityModel, setInternalColumnVisibilityModel] = useState<Record<string, boolean>>(\n () => initialState?.columns?.columnVisibilityModel ?? {}\n );\n const columnVisibilityModel = isColumnVisibilityControlled\n ? propColumnVisibilityModel!\n : internalColumnVisibilityModel;\n\n const handleColumnVisibilityModelChange = useCallback((model: Record<string, boolean>) => {\n if (!isColumnVisibilityControlled) setInternalColumnVisibilityModel(model);\n onColumnVisibilityModelChange?.(model);\n }, [isColumnVisibilityControlled, onColumnVisibilityModelChange]);\n\n // ── Pinned columns ───────────────────────────────────────────────────────\n const isPinnedColumnsControlled = propPinnedColumns !== undefined;\n const [internalPinnedColumns, setInternalPinnedColumns] = useState<GridColumnPinning>(\n () => initialState?.columns?.pinnedColumns ?? {}\n );\n const pinnedColumns = isPinnedColumnsControlled ? propPinnedColumns! : internalPinnedColumns;\n\n const handlePinnedColumnsChange = useCallback((model: GridColumnPinning) => {\n if (!isPinnedColumnsControlled) setInternalPinnedColumns(model);\n onPinnedColumnsChange?.(model);\n }, [isPinnedColumnsControlled, onPinnedColumnsChange]);\n\n // ── Pivot ────────────────────────────────────────────────────────────────\n const [internalPivotModel, setInternalPivotModel] = useState<GridPivotModel>(\n () => propPivotModel ?? EMPTY_PIVOT_MODEL\n );\n const currentPivotModel = propPivotModel ?? internalPivotModel;\n\n const handlePivotModelChange = useCallback((model: GridPivotModel) => {\n setInternalPivotModel(model);\n onPivotModelChange?.(model);\n }, [onPivotModelChange]);\n\n // ── Pagination ───────────────────────────────────────────────────────────\n const isPaginationControlled = propPaginationModel !== undefined;\n const [internalPaginationModel, setInternalPaginationModel] = useState<GridPaginationModel>(\n () => initialState?.pagination?.paginationModel ?? propPaginationModel ?? { page: 0, pageSize: 100 }\n );\n const effectivePaginationModel = isPaginationControlled ? propPaginationModel : internalPaginationModel;\n\n const handlePaginationModelChange = useCallback((newModel: GridPaginationModel) => {\n if (!isPaginationControlled) setInternalPaginationModel(newModel);\n onPaginationModelChange?.(newModel);\n }, [isPaginationControlled, onPaginationModelChange]);\n\n // ── Row selection ────────────────────────────────────────────────────────\n const isSelectionControlled = propRowSelectionModel !== undefined;\n const [internalRowSelectionModel, setInternalRowSelectionModel] = useState<GridRowId[]>([]);\n const rowSelectionModel = isSelectionControlled ? propRowSelectionModel! : internalRowSelectionModel;\n const selectedRowIds = useMemo(() => new Set(rowSelectionModel), [rowSelectionModel]);\n\n // onRowSelectionModelChange is consumed by the caller directly (they call it when selection changes)\n void onRowSelectionModelChange;\n\n return {\n sortModel: sortModel as GridSortItem[],\n isSortControlled,\n setInternalSortModel: setInternalSortModel as React.Dispatch<React.SetStateAction<GridSortItem[]>>,\n\n aggregationModel,\n handleAggregationModelChange,\n\n columnVisibilityModel,\n handleColumnVisibilityModelChange,\n\n pinnedColumns,\n handlePinnedColumnsChange,\n\n currentPivotModel,\n handlePivotModelChange,\n\n effectivePaginationModel,\n handlePaginationModelChange,\n\n rowSelectionModel,\n selectedRowIds,\n isSelectionControlled,\n setInternalRowSelectionModel,\n };\n}\n","\nimport type { GridRowModel, GridFilterItem, GridFilterModel, GridFilterGroup } from '../../types';\n\nexport const FILTER_OPERATORS = {\n contains: (value: unknown, filterValue: unknown): boolean => {\n if (value == null || filterValue == null) return false;\n return String(value).toLowerCase().includes(String(filterValue).toLowerCase());\n },\n\n equals: (value: unknown, filterValue: unknown): boolean => {\n if (value == null && filterValue == null) return true;\n if (value == null || filterValue == null) return false;\n return String(value).toLowerCase() === String(filterValue).toLowerCase();\n },\n\n startsWith: (value: unknown, filterValue: unknown): boolean => {\n if (value == null || filterValue == null) return false;\n return String(value).toLowerCase().startsWith(String(filterValue).toLowerCase());\n },\n\n endsWith: (value: unknown, filterValue: unknown): boolean => {\n if (value == null || filterValue == null) return false;\n return String(value).toLowerCase().endsWith(String(filterValue).toLowerCase());\n },\n\n isEmpty: (value: unknown): boolean => {\n return value == null || String(value).trim() === '';\n },\n\n isNotEmpty: (value: unknown): boolean => {\n return value != null && String(value).trim() !== '';\n },\n\n '>': (value: unknown, filterValue: unknown): boolean => {\n if (value == null || filterValue == null) return false;\n const numValue = Number(value);\n const numFilter = Number(filterValue);\n if (isNaN(numValue) || isNaN(numFilter)) return false;\n return numValue > numFilter;\n },\n\n '>=': (value: unknown, filterValue: unknown): boolean => {\n if (value == null || filterValue == null) return false;\n const numValue = Number(value);\n const numFilter = Number(filterValue);\n if (isNaN(numValue) || isNaN(numFilter)) return false;\n return numValue >= numFilter;\n },\n\n '<': (value: unknown, filterValue: unknown): boolean => {\n if (value == null || filterValue == null) return false;\n const numValue = Number(value);\n const numFilter = Number(filterValue);\n if (isNaN(numValue) || isNaN(numFilter)) return false;\n return numValue < numFilter;\n },\n\n '<=': (value: unknown, filterValue: unknown): boolean => {\n if (value == null || filterValue == null) return false;\n const numValue = Number(value);\n const numFilter = Number(filterValue);\n if (isNaN(numValue) || isNaN(numFilter)) return false;\n return numValue <= numFilter;\n },\n\n '!=': (value: unknown, filterValue: unknown): boolean => {\n if (filterValue == null || filterValue === '') return true;\n // Numeric comparison if both are numbers, otherwise string\n const numV = Number(value);\n const numF = Number(filterValue);\n if (!isNaN(numV) && !isNaN(numF)) return numV !== numF;\n return String(value).toLowerCase() !== String(filterValue).toLowerCase();\n },\n\n isAnyOf: (value: unknown, filterValue: unknown[]): boolean => {\n if (value == null || !Array.isArray(filterValue)) return false;\n return filterValue.some(v =>\n String(value).toLowerCase() === String(v).toLowerCase()\n );\n },\n\n not: (value: unknown, filterValue: unknown): boolean => {\n if (value == null && filterValue == null) return false;\n if (value == null || filterValue == null) return true;\n return String(value).toLowerCase() !== String(filterValue).toLowerCase();\n },\n\n // Used by boolean and singleSelect — case-insensitive string comparison\n is: (value: unknown, filterValue: unknown): boolean => {\n if (filterValue == null || filterValue === '') return true;\n const rowStr = String(value).toLowerCase();\n const filterStr = String(filterValue).toLowerCase();\n return rowStr === filterStr;\n },\n\n '=': (value: unknown, filterValue: unknown): boolean => {\n if (value == null || filterValue == null || filterValue === '') return false;\n return Number(value) === Number(filterValue);\n },\n};\n\n/**\n * Apply a single filter item to a row\n */\nexport function applyFilterItem<R extends GridRowModel>(\n row: R,\n filterItem: GridFilterItem\n): boolean {\n const { field, operator, value } = filterItem;\n\n // Get the value from the row\n const rowValue = row[field];\n\n // Get the operator function\n const operatorFn = FILTER_OPERATORS[operator];\n if (!operatorFn) {\n console.warn(`Unknown filter operator: ${operator}`);\n return true;\n }\n\n // Apply the operator\n return (operatorFn as (a: unknown, b: unknown) => boolean)(rowValue, value);\n}\n\n/**\n * Apply quick filter (global search across all fields)\n */\nexport function applyQuickFilter<R extends GridRowModel>(\n row: R,\n quickFilterValues: string[]\n): boolean {\n if (!quickFilterValues || quickFilterValues.length === 0) {\n return true;\n }\n\n // Check if any quick filter value matches any field in the row\n return quickFilterValues.every(filterValue => {\n const searchTerm = filterValue.toLowerCase();\n return Object.values(row).some(value => {\n if (value == null) return false;\n return String(value).toLowerCase().includes(searchTerm);\n });\n });\n}\n\n/**\n * Filter rows based on filter model\n */\n/**\n * Check if a row matches the filter model\n */\nexport function isRowMatchingFilter<R extends GridRowModel>(\n row: R,\n filterModel: GridFilterModel | GridFilterGroup // Accept Model or Group (similar structure)\n): boolean {\n // Normalize input: GridFilterModel matches GridFilterGroup shape largely, but let's be safe\n\n const items = filterModel.items ?? [];\n const logicOperator = filterModel.logicOperator ?? 'and';\n const quickFilterValues = ('quickFilterValues' in filterModel ? filterModel.quickFilterValues : undefined) ?? [];\n\n if (quickFilterValues.length > 0 && !applyQuickFilter(row, quickFilterValues)) {\n return false;\n }\n\n if (items.length === 0) {\n return true;\n }\n\n const evaluateItem = (item: GridFilterItem | GridFilterGroup): boolean => {\n if ('logicOperator' in item && 'items' in item) {\n\n const group = item as GridFilterGroup;\n const groupItems = group.items;\n if (groupItems.length === 0) return true;\n\n if (group.logicOperator === 'and') {\n return groupItems.every(evaluateItem);\n } else {\n return groupItems.some(evaluateItem);\n }\n } else {\n\n return applyFilterItem(row, item as GridFilterItem);\n }\n };\n\n if (logicOperator === 'and') {\n\n return items.every(evaluateItem);\n } else {\n\n return items.some(evaluateItem);\n }\n}\n\nexport function filterRows<R extends GridRowModel>(\n rows: R[],\n filterModel: GridFilterModel\n): R[] {\n if (!filterModel) return rows;\n\n const { items = [], quickFilterValues = [] } = filterModel;\n\n if (items.length === 0 && (!quickFilterValues || quickFilterValues.length === 0)) {\n return rows;\n }\n\n return rows.filter(row => isRowMatchingFilter(row, filterModel));\n}\n\nexport function getDefaultOperator(type?: string): string {\n switch (type) {\n case 'number':\n return '=';\n case 'date':\n return 'is';\n case 'boolean':\n return 'is';\n case 'singleSelect':\n return 'isAnyOf';\n default:\n return 'contains';\n }\n}\n\nexport function getOperatorsForType(type?: string): string[] {\n switch (type) {\n case 'number':\n return ['=', '!=', '>', '>=', '<', '<=', 'isEmpty', 'isNotEmpty'];\n case 'date':\n return ['is', 'not', 'after', 'onOrAfter', 'before', 'onOrBefore', 'isEmpty', 'isNotEmpty'];\n case 'boolean':\n return ['is'];\n case 'singleSelect':\n return ['isAnyOf', 'is', 'not'];\n default:\n return ['contains', 'equals', 'startsWith', 'endsWith', 'isEmpty', 'isNotEmpty'];\n }\n}\n","\nimport type { GridRowModel, GridSortItem } from '../../types';\n\nexport function compareValues(a: unknown, b: unknown, direction: 'asc' | 'desc'): number {\n\n if (a == null && b == null) return 0;\n if (a == null) return direction === 'asc' ? 1 : -1;\n if (b == null) return direction === 'asc' ? -1 : 1;\n\n if (typeof a === 'number' && typeof b === 'number') {\n return direction === 'asc' ? a - b : b - a;\n }\n\n if (a instanceof Date && b instanceof Date) {\n return direction === 'asc' \n ? a.getTime() - b.getTime() \n : b.getTime() - a.getTime();\n }\n\n const aStr = String(a).toLowerCase();\n const bStr = String(b).toLowerCase();\n\n if (direction === 'asc') {\n return aStr < bStr ? -1 : aStr > bStr ? 1 : 0;\n } else {\n return aStr > bStr ? -1 : aStr < bStr ? 1 : 0;\n }\n}\n\nexport function sortRows<R extends GridRowModel>(\n rows: R[],\n sortModel: GridSortItem[]\n): R[] {\n if (sortModel.length === 0) {\n return rows;\n }\n\n const sortedRows = [...rows];\n\n sortedRows.sort((a, b) => {\n for (const sortItem of sortModel) {\n const aValue = a[sortItem.field];\n const bValue = b[sortItem.field];\n\n const comparison = compareValues(aValue, bValue, sortItem.sort);\n\n if (comparison !== 0) {\n return comparison;\n }\n }\n return 0;\n });\n\n return sortedRows;\n}\n","import { useMemo } from 'react';\nimport { filterRows } from '../../utils/filtering';\nimport { sortRows } from '../../utils/sorting';\nimport { getPinnedRowGroups } from '../../utils/pinning';\nimport type { GridRowModel, GridFilterModel, GridSortItem, GridPaginationModel, GridRowPinning, GridDataSource } from '../../types';\n\ninterface HierarchyHandlers<R extends GridRowModel> {\n getVisibleRows: () => R[];\n}\n\nexport interface UseGridRowPipelineParams<R extends GridRowModel> {\n effectiveRows: R[];\n activeHierarchyHandlers: HierarchyHandlers<R> | null;\n filterMode: string;\n filterModel: GridFilterModel;\n dataSource?: GridDataSource<R>;\n sortModel: GridSortItem[];\n sortingMode: string;\n pagination: boolean;\n paginationMode: string;\n effectivePaginationModel: GridPaginationModel;\n pinnedRows?: GridRowPinning;\n isLoading: boolean;\n pageSize: number;\n}\n\nexport interface GridRowPipelineResult<R extends GridRowModel> {\n filteredRows: R[];\n pinnedTopRows: R[];\n unpinnedRows: R[];\n pinnedBottomRows: R[];\n sortedUnpinnedRows: R[];\n paginatedUnpinnedRows: R[];\n allRenderableRows: R[];\n}\n\nexport function useGridRowPipeline<R extends GridRowModel>(\n params: UseGridRowPipelineParams<R>\n): GridRowPipelineResult<R> {\n const {\n effectiveRows,\n activeHierarchyHandlers,\n filterMode,\n filterModel,\n dataSource,\n sortModel,\n sortingMode,\n pagination,\n paginationMode,\n effectivePaginationModel,\n pinnedRows,\n isLoading,\n pageSize,\n } = params;\n\n const filteredRows = useMemo<R[]>(() => {\n if (activeHierarchyHandlers) return (activeHierarchyHandlers.getVisibleRows() || []) as R[];\n if (filterMode === 'server' && dataSource) return effectiveRows;\n return filterRows(effectiveRows, filterModel) as R[];\n }, [effectiveRows, filterModel, activeHierarchyHandlers, filterMode, dataSource]);\n\n const { top: pinnedTopRows, center: unpinnedRows, bottom: pinnedBottomRows } = useMemo(() => {\n if (activeHierarchyHandlers) return { top: [] as R[], center: filteredRows, bottom: [] as R[] };\n return getPinnedRowGroups(filteredRows, pinnedRows);\n }, [filteredRows, pinnedRows, activeHierarchyHandlers]);\n\n const sortedUnpinnedRows = useMemo<R[]>(() => {\n if (activeHierarchyHandlers) return unpinnedRows;\n if (sortingMode === 'server' && dataSource) return unpinnedRows;\n return sortRows(unpinnedRows, sortModel) as R[];\n }, [unpinnedRows, sortModel, activeHierarchyHandlers, sortingMode, dataSource]);\n\n const paginatedUnpinnedRows = useMemo<R[]>(() => {\n if (!pagination) return sortedUnpinnedRows;\n if (paginationMode === 'server' && dataSource) return sortedUnpinnedRows;\n const start = effectivePaginationModel.page * effectivePaginationModel.pageSize;\n return sortedUnpinnedRows.slice(start, start + effectivePaginationModel.pageSize);\n }, [sortedUnpinnedRows, pagination, effectivePaginationModel.page, effectivePaginationModel.pageSize, paginationMode, dataSource]);\n\n const allRenderableRows = useMemo<R[]>(() => {\n if (activeHierarchyHandlers) return unpinnedRows;\n const centerRows = pagination ? paginatedUnpinnedRows : sortedUnpinnedRows;\n const base = [...pinnedTopRows, ...centerRows, ...pinnedBottomRows];\n\n if (paginationMode === 'infinite' && isLoading && base.length > 0) {\n const skeletonCount = Math.min(pageSize, 20);\n const skeletons = Array.from({ length: skeletonCount }, (_, i) => ({\n id: `__skeleton_${i}__`,\n _isSkeleton: true,\n }));\n return [...base, ...skeletons] as R[];\n }\n\n return base;\n }, [\n pinnedTopRows, paginatedUnpinnedRows, sortedUnpinnedRows, pinnedBottomRows,\n pagination, activeHierarchyHandlers, unpinnedRows, paginationMode, isLoading, pageSize,\n ]);\n\n return {\n filteredRows,\n pinnedTopRows,\n unpinnedRows,\n pinnedBottomRows,\n sortedUnpinnedRows,\n paginatedUnpinnedRows,\n allRenderableRows,\n };\n}\n","import { useMemo } from 'react';\nimport type { GridRowModel, GridColDef } from '../../types';\nimport type { LayoutResult } from './useLayout';\n\nexport interface UseGridVirtualizationParams<R extends GridRowModel> {\n layout: LayoutResult<R>;\n scrollTop: number;\n scrollLeft: number;\n viewportWidth: number;\n viewportHeight: number;\n autoHeight: boolean;\n rowReordering: boolean;\n hasDetailPanel: boolean;\n checkboxSelection: boolean;\n pinCheckboxColumn: boolean;\n pinExpandColumn: boolean;\n}\n\nexport interface GridVirtualizationResult<R extends GridRowModel = GridRowModel> {\n renderContext: {\n firstRowIndex: number;\n lastRowIndex: number;\n firstColumnIndex: number;\n lastColumnIndex: number;\n };\n offsetTop: number;\n offsetLeft: number;\n totalHeight: number;\n pinnedTopHeight: number;\n pinnedBottomHeight: number;\n totalWidth: number;\n rowHeights: number[];\n cumulativeHeights: number[];\n virtualColumns: (GridColDef<R> & { width: number })[];\n columnMetrics: {\n leftPinnedWidth: number;\n rightPinnedWidth: number;\n unpinnedAccWidths: number[];\n unpinnedCols: { field: string; width: number }[];\n totalSpecialsWidth: number;\n pinnedSpecialsWidth: number;\n };\n}\n\nexport function useGridVirtualization<R extends GridRowModel>(\n params: UseGridVirtualizationParams<R>\n): GridVirtualizationResult<R> {\n const {\n layout,\n scrollTop,\n scrollLeft,\n viewportWidth: rawViewportWidth,\n viewportHeight: rawViewportHeight,\n autoHeight,\n rowReordering,\n hasDetailPanel,\n checkboxSelection,\n pinCheckboxColumn,\n pinExpandColumn,\n } = params;\n\n return useMemo<GridVirtualizationResult<R>>(() => {\n const {\n unpinnedAccWidths,\n unpinnedColsWithWidth,\n leftPinnedCols,\n rightPinnedCols,\n totalWidth,\n leftWidth,\n rightWidth,\n unpinnedTotalWidth,\n systemColumnsWidth,\n cumulativeHeights,\n pinnedTopHeight,\n pinnedBottomHeight,\n unpinnedRowsHeight,\n rowHeights,\n unpinnedRowsLength,\n } = layout;\n\n const viewportWidth = rawViewportWidth || 1000;\n const viewportHeight = autoHeight\n ? pinnedTopHeight + unpinnedRowsHeight + pinnedBottomHeight + 50\n : rawViewportHeight || 600;\n\n const overscanCols = 6;\n const visibleLocalStart = Math.max(0, scrollLeft - leftWidth);\n const visibleLocalEnd = scrollLeft + viewportWidth - leftWidth;\n\n let firstUnpinnedIndex = 0;\n let lastUnpinnedIndex = unpinnedColsWithWidth.length - 1;\n\n let low = 0, high = unpinnedAccWidths.length - 1;\n while (low <= high) {\n const mid = (low + high) >>> 1;\n if (unpinnedAccWidths[mid] < visibleLocalStart) { low = mid + 1; } else { high = mid - 1; }\n }\n firstUnpinnedIndex = Math.max(0, low - overscanCols);\n\n for (let i = firstUnpinnedIndex; i < unpinnedAccWidths.length; i++) {\n if ((i === 0 ? 0 : unpinnedAccWidths[i - 1]) > visibleLocalEnd) {\n lastUnpinnedIndex = Math.min(unpinnedColsWithWidth.length - 1, i + overscanCols);\n break;\n }\n lastUnpinnedIndex = Math.min(unpinnedColsWithWidth.length - 1, i + overscanCols);\n }\n\n const leftSpacerWidth = firstUnpinnedIndex > 0 ? unpinnedAccWidths[firstUnpinnedIndex - 1] : 0;\n const rightSpacerWidth = unpinnedTotalWidth - unpinnedAccWidths[lastUnpinnedIndex];\n\n const virtualColumns: (GridColDef<R> & { width: number })[] = [\n ...leftPinnedCols,\n ...(leftSpacerWidth > 0 ? [{ field: '__spacer_left__', width: leftSpacerWidth, isSpacer: true }] : []),\n ...unpinnedColsWithWidth.slice(firstUnpinnedIndex, lastUnpinnedIndex + 1),\n ...(rightSpacerWidth > 0 ? [{ field: '__spacer_right__', width: rightSpacerWidth, isSpacer: true }] : []),\n ...rightPinnedCols,\n ];\n\n const hasHorizontalScroll = viewportWidth > 0 && totalWidth > viewportWidth;\n const scrollbarBuffer = hasHorizontalScroll ? 16 : 0;\n const totalHeight = pinnedTopHeight + unpinnedRowsHeight + pinnedBottomHeight + scrollbarBuffer + 2;\n\n const overscanRows = 5;\n let firstRowIndex = 0;\n let lastRowIndex = unpinnedRowsLength - 1;\n let offsetTop = 0;\n\n let rLow = 0, rHigh = cumulativeHeights.length - 1;\n while (rLow <= rHigh) {\n const mid = (rLow + rHigh) >>> 1;\n if (cumulativeHeights[mid] < scrollTop) { rLow = mid + 1; } else { rHigh = mid - 1; }\n }\n firstRowIndex = Math.max(0, rLow - overscanRows);\n offsetTop = firstRowIndex > 0 ? cumulativeHeights[firstRowIndex - 1] : 0;\n\n for (let i = firstRowIndex; i < cumulativeHeights.length; i++) {\n if (cumulativeHeights[i] >= scrollTop + viewportHeight) {\n lastRowIndex = Math.min(unpinnedRowsLength - 1, i + overscanRows);\n break;\n }\n }\n\n const pinnedSpecialsWidth =\n (rowReordering ? 48 : 0) +\n (hasDetailPanel && pinExpandColumn ? 48 : 0) +\n (checkboxSelection && pinCheckboxColumn ? 48 : 0);\n\n return {\n renderContext: {\n firstRowIndex,\n lastRowIndex,\n firstColumnIndex: firstUnpinnedIndex,\n lastColumnIndex: lastUnpinnedIndex,\n },\n offsetTop,\n offsetLeft: 0,\n totalHeight,\n pinnedTopHeight,\n pinnedBottomHeight,\n totalWidth,\n rowHeights,\n cumulativeHeights,\n virtualColumns,\n columnMetrics: {\n leftPinnedWidth: leftWidth,\n rightPinnedWidth: rightWidth,\n unpinnedAccWidths,\n unpinnedCols: unpinnedColsWithWidth,\n totalSpecialsWidth: systemColumnsWidth,\n pinnedSpecialsWidth,\n },\n };\n }, [\n layout,\n scrollTop,\n scrollLeft,\n rawViewportWidth,\n rawViewportHeight,\n autoHeight,\n rowReordering,\n hasDetailPanel,\n checkboxSelection,\n pinCheckboxColumn,\n pinExpandColumn,\n ]);\n}\n","\nimport { useState, useCallback, useRef } from 'react';\nimport type { GridColDef, GridRowModel, GridColumnOrderChangeParams } from '../types';\n\nexport interface UseColumnReorderProps<R extends GridRowModel = GridRowModel> {\n columns: GridColDef<R>[];\n onColumnOrderChange?: (params: GridColumnOrderChangeParams) => void;\n disableColumnReorder?: boolean;\n}\n\nexport interface UseColumnReorderReturn {\n draggedColumn: string | null;\n dragOverColumn: string | null;\n onDragStart: ((field: string) => (event: React.DragEvent) => void) | undefined;\n onDragOver: ((field: string) => (event: React.DragEvent) => void) | undefined;\n onDragEnd: (() => void) | undefined;\n onDrop: ((targetField: string) => (event: React.DragEvent) => void) | undefined;\n}\n\nexport function useColumnReorder<R extends GridRowModel = GridRowModel>(\n props: UseColumnReorderProps<R>\n): UseColumnReorderReturn {\n const { columns, onColumnOrderChange, disableColumnReorder = false } = props;\n\n const [draggedColumn, setDraggedColumn] = useState<string | null>(null);\n const [dragOverColumn, setDragOverColumn] = useState<string | null>(null);\n const draggedIndexRef = useRef<number>(-1);\n\n const handleDragStart = useCallback(\n (field: string) => (event: React.DragEvent) => {\n if (disableColumnReorder) return;\n\n const columnIndex = columns.findIndex(col => col.field === field);\n const column = columns[columnIndex];\n\n if (column?.pinnable === false) {\n event.preventDefault();\n return;\n }\n\n setDraggedColumn(field);\n draggedIndexRef.current = columnIndex;\n\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'move';\n event.dataTransfer.setData('text/plain', field);\n }\n },\n [columns, disableColumnReorder]\n );\n\n const handleDragOver = useCallback(\n (field: string) => (event: React.DragEvent) => {\n if (disableColumnReorder || !draggedColumn) return;\n\n event.preventDefault(); \n event.dataTransfer.dropEffect = 'move';\n\n setDragOverColumn(field);\n },\n [draggedColumn, disableColumnReorder]\n );\n\n const handleDrop = useCallback(\n (targetField: string) => (event: React.DragEvent) => {\n event.preventDefault();\n\n if (disableColumnReorder || !draggedColumn || draggedColumn === targetField) {\n setDraggedColumn(null);\n setDragOverColumn(null);\n return;\n }\n\n const oldIndex = columns.findIndex(col => col.field === draggedColumn);\n const targetIndex = columns.findIndex(col => col.field === targetField);\n\n if (oldIndex === -1 || targetIndex === -1) {\n setDraggedColumn(null);\n setDragOverColumn(null);\n return;\n }\n\n const column = columns[oldIndex];\n\n if (onColumnOrderChange) {\n onColumnOrderChange({\n column: column as unknown as GridColDef,\n oldIndex,\n targetIndex,\n });\n }\n\n setDraggedColumn(null);\n setDragOverColumn(null);\n draggedIndexRef.current = -1;\n },\n [columns, draggedColumn, disableColumnReorder, onColumnOrderChange]\n );\n\n const handleDragEnd = useCallback(() => {\n setDraggedColumn(null);\n setDragOverColumn(null);\n draggedIndexRef.current = -1;\n }, []);\n\n return {\n draggedColumn,\n dragOverColumn,\n onDragStart: disableColumnReorder ? undefined : handleDragStart,\n onDragOver: disableColumnReorder ? undefined : handleDragOver,\n onDragEnd: disableColumnReorder ? undefined : handleDragEnd,\n onDrop: disableColumnReorder ? undefined : handleDrop,\n };\n}\n","\nimport React from 'react';\n\nexport interface ExpandIconProps {\n isExpanded: boolean;\n onClick?: (event: React.MouseEvent) => void;\n variant?: 'chevron' | 'plus-minus';\n}\n\nexport function ExpandIcon({ isExpanded, onClick, variant = 'chevron' }: ExpandIconProps) {\n return (\n <button\n className={`ogx-expand-icon ${isExpanded ? 'ogx-expand-icon--expanded' : ''}`}\n onClick={(e) => {\n if (onClick) {\n onClick(e);\n }\n }}\n aria-label={isExpanded ? 'Collapse row' : 'Expand row'}\n type=\"button\"\n >\n {variant === 'plus-minus' ? (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n { }\n <path\n d=\"M4 8H12\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n { }\n <path\n d=\"M8 4V12\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{\n opacity: isExpanded ? 0 : 1,\n transition: 'opacity 0.2s ease',\n transformOrigin: 'center'\n }}\n />\n </svg>\n ) : (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{\n transform: isExpanded ? 'rotate(90deg)' : 'rotate(0deg)',\n transition: 'transform 0.2s ease'\n }}\n >\n <path\n d=\"M6 4L10 8L6 12\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </button>\n );\n}\n","import { useState, useMemo, useCallback, useEffect } from 'react';\nimport { useColumnReorder } from '../useColumnReorder';\nimport { ExpandIcon } from '../../components/ui/ExpandIcon';\nimport type {\n GridColDef,\n GridRowModel,\n GridRowId,\n GridColumnOrderChangeParams,\n GridRenderCellParams,\n} from '../../types';\nimport type { GridInitialState } from '../../state/types';\n\ninterface HierarchyHandlers {\n toggleExpansion: (id: GridRowId) => void;\n}\n\nexport interface UseGridColumnsParams<R extends GridRowModel> {\n activeColumns: GridColDef<R>[];\n isHierarchyEnabled: boolean;\n isRowGrouping: boolean;\n isTreeData: boolean;\n activeHierarchyHandlers: HierarchyHandlers | null;\n columnVisibilityModel: Record<string, boolean>;\n columnOrder?: string[];\n onColumnOrderChange?: (params: GridColumnOrderChangeParams) => void;\n disableColumnReorder: boolean;\n pivotMode: boolean;\n checkboxSelection: boolean;\n hasDetailPanel: boolean;\n rowReordering: boolean;\n initialState?: GridInitialState;\n setColumns: (cols: GridColDef[]) => void;\n}\n\nexport interface UseGridColumnsResult<R extends GridRowModel> {\n effectiveColumns: GridColDef<R>[];\n orderedColumns: GridColDef<R>[];\n visibleOrderedColumns: GridColDef<R>[];\n navigationColumns: Array<GridColDef<R> | { field: string }>;\n columnWidths: Record<string, number>;\n effectiveColumnOrder: string[];\n setInternalColumnOrder: React.Dispatch<React.SetStateAction<string[]>>;\n columnReorderHandlers: ReturnType<typeof useColumnReorder>;\n handleColumnResize: (field: string, newWidth: number) => void;\n}\n\nexport function useGridColumns<R extends GridRowModel>(\n params: UseGridColumnsParams<R>\n): UseGridColumnsResult<R> {\n const {\n activeColumns,\n isHierarchyEnabled,\n isRowGrouping,\n isTreeData,\n activeHierarchyHandlers,\n columnVisibilityModel,\n columnOrder,\n onColumnOrderChange,\n disableColumnReorder,\n pivotMode,\n checkboxSelection,\n hasDetailPanel,\n rowReordering,\n initialState,\n setColumns,\n } = params;\n\n // ── Effective columns (hierarchy cell renderer injection) ─────────────────\n const effectiveColumns = useMemo<GridColDef<R>[]>(() => {\n if (!isHierarchyEnabled) return activeColumns;\n\n return activeColumns.map((col, index) => {\n if (index === 0) {\n return {\n ...col,\n renderCell: (cellParams: GridRenderCellParams<R>) => {\n const meta = cellParams.rowMeta;\n const depth = meta?.treeDepth ?? 0;\n const hasChildren = Boolean(meta?.hasChildren);\n const isExpanded = Boolean(meta?.isExpanded);\n const groupingField = meta?.groupingField;\n const groupingValue = meta?.groupingValue;\n const descendantCount = meta?.descendantCount;\n const isGroupRow = Boolean(meta?.isGroupRow);\n\n let content: React.ReactNode = col.renderCell ? col.renderCell(cellParams) : cellParams.value as React.ReactNode;\n\n if (isTreeData && hasChildren && isGroupRow) {\n content = (\n <div className=\"ogx__group-cell-content\">\n {cellParams.value as React.ReactNode}\n {descendantCount !== undefined && descendantCount > 0 ? ` (${descendantCount})` : ''}\n </div>\n );\n }\n\n if (isRowGrouping && hasChildren && groupingField) {\n const groupLabel = meta?.groupLabel ?? `${groupingField}: ${String(groupingValue)}`;\n content = (\n <div className=\"ogx__group-cell-content\">\n {groupLabel}\n {descendantCount !== undefined ? ` (${descendantCount})` : ''}\n </div>\n );\n }\n\n return (\n <div style={{ display: 'flex', alignItems: 'center', paddingLeft: depth * 24, width: '100%', height: '100%' }}>\n <div style={{ marginRight: 4, width: 24, height: 24, display: 'flex', alignItems: 'center', justifyContent: 'center', cursor: hasChildren ? 'pointer' : 'default', flexShrink: 0 }}>\n {hasChildren ? (\n <div\n onClick={(e) => { e.stopPropagation(); e.preventDefault(); activeHierarchyHandlers?.toggleExpansion(cellParams.row.id); }}\n onMouseDown={(e) => { e.stopPropagation(); }}\n style={{ cursor: 'pointer', display: 'flex', alignItems: 'center', justifyContent: 'center', pointerEvents: 'auto', zIndex: 10, position: 'relative' }}\n >\n <ExpandIcon\n isExpanded={isExpanded}\n onClick={(e) => { e.stopPropagation(); e.preventDefault(); activeHierarchyHandlers?.toggleExpansion(cellParams.row.id); }}\n />\n </div>\n ) : null}\n </div>\n <div style={{ flex: 1, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{content}</div>\n </div>\n );\n }\n };\n }\n\n return {\n ...col,\n renderCell: (cellParams: GridRenderCellParams<R>) => {\n const meta = cellParams.rowMeta;\n const hasChildren = Boolean(meta?.hasChildren);\n const groupingField = meta?.groupingField;\n\n if (isRowGrouping && hasChildren) {\n if (col.field === groupingField) return null;\n if (cellParams.value !== undefined && cellParams.value !== null) {\n return col.renderCell ? col.renderCell(cellParams) : cellParams.value;\n }\n return null;\n }\n\n return col.renderCell ? col.renderCell(cellParams) : cellParams.value;\n }\n };\n }) as GridColDef<R>[];\n }, [activeColumns, isHierarchyEnabled, isRowGrouping, isTreeData, activeHierarchyHandlers]);\n\n // ── Column widths ─────────────────────────────────────────────────────────\n const [columnWidths, setColumnWidths] = useState<Record<string, number>>(\n () => initialState?.columns?.columnWidths ?? {}\n );\n\n const handleColumnResize = useCallback((field: string, newWidth: number) => {\n setColumnWidths(prev => ({ ...prev, [field]: newWidth }));\n }, []);\n\n // ── Column order ──────────────────────────────────────────────────────────\n const [internalColumnOrder, setInternalColumnOrder] = useState<string[]>(\n () => initialState?.columns?.columnOrder ?? activeColumns.map(col => col.field)\n );\n\n const effectiveColumnOrder = columnOrder ?? internalColumnOrder;\n\n useEffect(() => {\n setColumns(activeColumns as unknown as GridColDef[]);\n }, [activeColumns, setColumns]);\n\n useEffect(() => {\n if (pivotMode) {\n setInternalColumnOrder(activeColumns.map(col => col.field));\n }\n }, [pivotMode, activeColumns]);\n\n // ── Ordered / visible columns ─────────────────────────────────────────────\n const orderedColumns = useMemo<GridColDef<R>[]>(() => {\n if (disableColumnReorder) return effectiveColumns;\n\n const orderMap = new Map(effectiveColumnOrder.map((field, idx) => [field, idx]));\n return [...effectiveColumns].sort((a, b) => {\n const ai = orderMap.get(a.field) ?? effectiveColumns.indexOf(a);\n const bi = orderMap.get(b.field) ?? effectiveColumns.indexOf(b);\n return ai - bi;\n });\n }, [effectiveColumns, effectiveColumnOrder, disableColumnReorder]);\n\n const visibleOrderedColumns = useMemo<GridColDef<R>[]>(\n () => orderedColumns.filter(col => columnVisibilityModel[col.field] !== false),\n [orderedColumns, columnVisibilityModel]\n );\n\n // ── Column reorder handlers ───────────────────────────────────────────────\n const columnReorderHandlers = useColumnReorder({\n columns: orderedColumns,\n onColumnOrderChange: useCallback((reorderParams: GridColumnOrderChangeParams) => {\n const { oldIndex, targetIndex } = reorderParams;\n const newOrder = [...effectiveColumnOrder];\n const [movedField] = newOrder.splice(oldIndex, 1);\n newOrder.splice(targetIndex, 0, movedField);\n if (!columnOrder) setInternalColumnOrder(newOrder);\n onColumnOrderChange?.(reorderParams);\n }, [effectiveColumnOrder, columnOrder, onColumnOrderChange]),\n disableColumnReorder,\n });\n\n // ── Navigation columns (system cols + data cols for keyboard nav) ─────────\n const navigationColumns = useMemo(() => {\n const specials: { field: string }[] = [];\n if (rowReordering) specials.push({ field: '__reorder_col__' });\n if (hasDetailPanel) specials.push({ field: '__expand_col__' });\n if (checkboxSelection) specials.push({ field: '__checkbox_col__' });\n return [...specials, ...orderedColumns] as Array<GridColDef<R> | { field: string }>;\n }, [orderedColumns, checkboxSelection, hasDetailPanel, rowReordering]);\n\n return {\n effectiveColumns,\n orderedColumns,\n visibleOrderedColumns,\n navigationColumns,\n columnWidths,\n effectiveColumnOrder,\n setInternalColumnOrder,\n columnReorderHandlers,\n handleColumnResize,\n };\n}\n","import { useMemo } from 'react';\nimport type { GridRowModel, GridRowId } from '../../types';\n\ninterface RenderContext {\n firstRowIndex: number;\n lastRowIndex: number;\n}\n\nexport interface UseGridVisibleRowsParams<R extends GridRowModel> {\n renderContext: RenderContext;\n pinnedTopRows: R[];\n pinnedBottomRows: R[];\n paginatedUnpinnedRows: R[];\n sortedUnpinnedRows: R[];\n pagination: boolean;\n}\n\nexport interface GridVisibleRow<R extends GridRowModel> {\n row: R;\n rowIndex: number;\n}\n\nexport function useGridVisibleRows<R extends GridRowModel>(\n params: UseGridVisibleRowsParams<R>\n): GridVisibleRow<R>[] {\n const {\n renderContext,\n pinnedTopRows,\n pinnedBottomRows,\n paginatedUnpinnedRows,\n sortedUnpinnedRows,\n pagination,\n } = params;\n\n return useMemo<GridVisibleRow<R>[]>(() => {\n const { firstRowIndex, lastRowIndex } = renderContext;\n const centerRows = pagination ? paginatedUnpinnedRows : sortedUnpinnedRows;\n const topPinnedCount = pinnedTopRows.length;\n\n const topPinned = pinnedTopRows.map((row, index) => ({ row, rowIndex: index }));\n const bottomPinned = pinnedBottomRows.map((row, index) => ({\n row,\n rowIndex: topPinnedCount + centerRows.length + index,\n }));\n\n const centerStartIndex = Math.max(0, firstRowIndex - topPinnedCount);\n const centerEndIndex = Math.min(centerRows.length, lastRowIndex - topPinnedCount + 1);\n\n const centerVisible = centerRows\n .slice(centerStartIndex, centerEndIndex)\n .map((row, index) => ({\n row,\n rowIndex: topPinnedCount + centerStartIndex + index,\n }));\n\n const combined = [...topPinned, ...centerVisible, ...bottomPinned];\n\n // Deduplication guard: a row ID in both pinnedRows and rows would cause React key collisions\n const seenIds = new Set<GridRowId>();\n return combined.filter(item => {\n if (seenIds.has(item.row.id)) return false;\n seenIds.add(item.row.id);\n return true;\n });\n }, [renderContext, pinnedTopRows, pinnedBottomRows, paginatedUnpinnedRows, sortedUnpinnedRows, pagination]);\n}\n","import { useRef, useState, useCallback, useEffect } from 'react';\nimport type { GridRowScrollEndParams } from '../../types';\n\nexport interface UseGridScrollSyncParams {\n onRowsScrollEnd?: (params: GridRowScrollEndParams) => void;\n}\n\nexport interface UseGridScrollSyncResult {\n scrollTop: number;\n scrollLeft: number;\n handleScroll: (event: React.UIEvent<HTMLDivElement>) => void;\n}\n\nexport function useGridScrollSync(params: UseGridScrollSyncParams): UseGridScrollSyncResult {\n const { onRowsScrollEnd } = params;\n\n const pendingScrollRef = useRef({ scrollTop: 0, scrollLeft: 0 });\n const scrollRafRef = useRef<number | null>(null);\n const [scrollPos, setScrollPos] = useState({ scrollTop: 0, scrollLeft: 0 });\n\n useEffect(() => {\n return () => {\n if (scrollRafRef.current !== null) cancelAnimationFrame(scrollRafRef.current);\n };\n }, []);\n\n const handleScroll = useCallback((event: React.UIEvent<HTMLDivElement>) => {\n const target = event.currentTarget;\n pendingScrollRef.current = { scrollTop: target.scrollTop, scrollLeft: target.scrollLeft };\n\n if (scrollRafRef.current !== null) cancelAnimationFrame(scrollRafRef.current);\n scrollRafRef.current = requestAnimationFrame(() => {\n scrollRafRef.current = null;\n setScrollPos(pendingScrollRef.current);\n });\n\n if (onRowsScrollEnd) {\n const { scrollTop, scrollHeight, clientHeight } = target;\n const scrollThreshold = 100;\n\n if (scrollHeight - scrollTop - clientHeight < scrollThreshold) {\n onRowsScrollEnd({\n visibleTop: scrollTop,\n visibleBottom: scrollTop + clientHeight,\n viewportHeight: clientHeight,\n });\n }\n }\n }, [onRowsScrollEnd]);\n\n return { scrollTop: scrollPos.scrollTop, scrollLeft: scrollPos.scrollLeft, handleScroll };\n}\n","import { useRef, useEffect, useLayoutEffect } from 'react';\nimport type { GridState } from '../../state/types';\nimport type {\n GridSortItem,\n GridFilterModel,\n GridPaginationModel,\n GridColumnPinning,\n} from '../../types';\n\nexport interface UseGridStateSnapshotParams {\n onStateChange?: (state: GridState) => void;\n sortModel: GridSortItem[];\n filterModel: GridFilterModel;\n effectivePaginationModel: GridPaginationModel;\n columnWidths: Record<string, number>;\n effectiveColumnOrder: string[];\n columnVisibilityModel: Record<string, boolean>;\n pinnedColumns: GridColumnPinning;\n}\n\nexport function useGridStateSnapshot(params: UseGridStateSnapshotParams): void {\n const {\n onStateChange,\n sortModel,\n filterModel,\n effectivePaginationModel,\n columnWidths,\n effectiveColumnOrder,\n columnVisibilityModel,\n pinnedColumns,\n } = params;\n\n const onStateChangeRef = useRef(onStateChange);\n useLayoutEffect(() => {\n onStateChangeRef.current = onStateChange;\n });\n\n useEffect(() => {\n if (!onStateChangeRef.current) return;\n\n const snapshot: GridState = {\n sorting: { sortModel: sortModel as { field: string; sort: 'asc' | 'desc' }[] },\n filter: { filterModel },\n pagination: { paginationModel: effectivePaginationModel },\n columns: {\n columnWidths,\n columnOrder: effectiveColumnOrder,\n columnVisibilityModel,\n pinnedColumns,\n },\n };\n\n onStateChangeRef.current(snapshot);\n }, [\n sortModel,\n filterModel,\n effectivePaginationModel,\n columnWidths,\n effectiveColumnOrder,\n columnVisibilityModel,\n pinnedColumns,\n ]);\n}\n","\nimport { useMemo, useEffect, useRef, useCallback, useState } from 'react';\nimport type {\n GridRowModel,\n GridColDef,\n GridAggregationModel,\n GridAggregationResult,\n GridFilterModel,\n GridSortItem,\n GridDataSource,\n} from '../../types';\n\nexport type BuiltInAggFn = 'sum' | 'avg' | 'count' | 'min' | 'max' | 'unique';\n\nconst AGGREGATION_FUNCTIONS: Record<BuiltInAggFn, (values: unknown[]) => unknown> = {\n sum: (values) => {\n const nums = values.filter((v) => v != null && !isNaN(Number(v)));\n return nums.reduce((acc: number, v) => acc + Number(v), 0);\n },\n avg: (values) => {\n const nums = values.filter((v) => v != null && !isNaN(Number(v)));\n if (nums.length === 0) return null;\n return nums.reduce((acc: number, v) => acc + Number(v), 0) / nums.length;\n },\n count: (values) => values.filter((v) => v != null).length,\n min: (values) => {\n const nums = values.filter((v) => v != null && !isNaN(Number(v))).map(Number);\n return nums.length ? Math.min(...nums) : null;\n },\n max: (values) => {\n const nums = values.filter((v) => v != null && !isNaN(Number(v))).map(Number);\n return nums.length ? Math.max(...nums) : null;\n },\n unique: (values) => new Set(values.filter((v) => v != null)).size,\n};\n\nexport function formatAggregationValue(value: unknown, fnName: string): string {\n if (value == null) return '—';\n if (typeof value === 'number') {\n if (fnName === 'avg') {\n return value.toLocaleString(undefined, { maximumFractionDigits: 2 });\n }\n return value.toLocaleString();\n }\n return String(value);\n}\n\nexport interface UseAggregationParams<R extends GridRowModel> {\n rows: R[];\n columns?: GridColDef[];\n aggregationModel: GridAggregationModel;\n isServerSide: boolean;\n dataSource?: GridDataSource<R>;\n filterModel?: GridFilterModel;\n sortModel?: GridSortItem[];\n serverAggregationResults?: GridAggregationResult | null;\n}\n\nexport interface UseAggregationReturn {\n aggregationResult: GridAggregationResult;\n isLoading: boolean;\n error: unknown;\n}\n\nexport function useAggregation<R extends GridRowModel>(\n params: UseAggregationParams<R>\n): UseAggregationReturn {\n const {\n rows,\n columns,\n aggregationModel,\n isServerSide,\n dataSource,\n filterModel,\n sortModel,\n serverAggregationResults,\n } = params;\n\n const columnsLookup = useMemo(() => {\n const map = new Map<string, GridColDef>();\n (columns ?? []).forEach(col => map.set(col.field, col));\n return map;\n }, [columns]);\n\n const clientResult = useMemo<GridAggregationResult>(() => {\n if (isServerSide || Object.keys(aggregationModel).length === 0) return {};\n\n const result: GridAggregationResult = {};\n for (const [field, fnName] of Object.entries(aggregationModel)) {\n const colDef = columnsLookup.get(field);\n if (colDef?.availableAggregationFunctions && !colDef.availableAggregationFunctions.includes(fnName)) {\n continue;\n }\n const fn = AGGREGATION_FUNCTIONS[fnName as BuiltInAggFn];\n if (!fn) {\n console.warn(`[useAggregation] Unknown aggregation function: \"${fnName}\"`);\n continue;\n }\n const values = rows.map((row) => (row as GridRowModel)[field]);\n result[field] = fn(values);\n }\n return result;\n }, [rows, columnsLookup, aggregationModel, isServerSide]);\n\n const [serverResult, setServerResult] = useState<GridAggregationResult>({});\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<unknown>(null);\n const requestIdRef = useRef(0);\n\n const fetchServerAggregations = useCallback(async () => {\n if (!dataSource?.getAggregations || Object.keys(aggregationModel).length === 0) return;\n\n const requestId = ++requestIdRef.current;\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await dataSource.getAggregations({\n sortModel: sortModel ?? [],\n filterModel: filterModel ?? { items: [] },\n groupKeys: [],\n aggregationModel,\n });\n\n if (requestId === requestIdRef.current) {\n setServerResult(result);\n }\n } catch (err) {\n if (requestId === requestIdRef.current) {\n setError(err);\n console.error('[useAggregation] Server aggregation error:', err);\n }\n } finally {\n if (requestId === requestIdRef.current) {\n setIsLoading(false);\n }\n }\n }, [dataSource, aggregationModel, filterModel, sortModel]);\n\n useEffect(() => {\n if (isServerSide && dataSource?.getAggregations && !serverAggregationResults) {\n fetchServerAggregations();\n }\n }, [fetchServerAggregations, isServerSide, dataSource, serverAggregationResults]);\n\n const aggregationResult = useMemo<GridAggregationResult>(() => {\n if (!isServerSide) return clientResult;\n\n if (serverAggregationResults && Object.keys(serverAggregationResults).length > 0) {\n return serverAggregationResults;\n }\n return serverResult;\n }, [isServerSide, clientResult, serverAggregationResults, serverResult]);\n\n return { aggregationResult, isLoading, error };\n}\n","import React, { useMemo } from 'react';\nimport { formatAggregationValue } from '../../hooks/features/useAggregation';\nimport type { GridColDef, GridAggregationModel, GridAggregationResult, GridColumnPinning } from '../../types';\nimport { calculatePinnedPositions, isColumnPinned } from '../../utils/pinning';\n\ninterface GridAggregationFooterProps {\n columns: GridColDef[];\n aggregationModel: GridAggregationModel;\n aggregationResult: GridAggregationResult;\n columnWidths: Record<string, number>;\n rowHeight: number;\n checkboxSelection: boolean;\n hasDetailPanel: boolean;\n rowReordering: boolean;\n pinnedColumns?: GridColumnPinning;\n}\n\nexport function GridAggregationFooter({\n columns,\n aggregationModel,\n aggregationResult,\n columnWidths,\n rowHeight,\n checkboxSelection,\n hasDetailPanel,\n rowReordering,\n pinnedColumns,\n}: GridAggregationFooterProps) {\n // Compute sticky left/right pixel offsets for each pinned column.\n // The footer always renders checkbox/detail/reorder spacers unconditionally,\n // so treat pinCheckboxColumn and pinExpandColumn as always true.\n const pinnedOffsets = useMemo(\n () => calculatePinnedPositions(\n columns,\n columnWidths,\n pinnedColumns,\n checkboxSelection,\n true,\n hasDetailPanel,\n true,\n rowReordering,\n ),\n [columns, columnWidths, pinnedColumns, checkboxSelection, hasDetailPanel, rowReordering]\n );\n\n const lastLeftField = pinnedColumns?.left?.[pinnedColumns.left.length - 1];\n const firstRightField = pinnedColumns?.right?.[0];\n\n return (\n <div\n className=\"ogx__aggregation-footer\"\n role=\"row\"\n aria-label=\"Aggregation totals\"\n aria-live=\"polite\"\n style={{ minHeight: `${rowHeight}px` }}\n >\n {checkboxSelection && <div style={{ width: 48, flexShrink: 0 }} />}\n {hasDetailPanel && <div style={{ width: 48, flexShrink: 0 }} />}\n {rowReordering && <div style={{ width: 48, flexShrink: 0 }} />}\n\n {columns.map((col) => {\n const fnName = (aggregationModel as Record<string, string>)[col.field];\n const rawValue = aggregationResult[col.field];\n const colWidth = columnWidths[col.field] ?? (typeof col.width === 'number' ? col.width : 120);\n\n const pinnedPosition = isColumnPinned(col.field, pinnedColumns);\n const pinnedOffset = pinnedPosition ? pinnedOffsets[col.field] : undefined;\n\n const className = [\n 'ogx__aggregation-cell',\n pinnedPosition === 'left' && 'ogx__aggregation-cell--pinned-left',\n pinnedPosition === 'right' && 'ogx__aggregation-cell--pinned-right',\n pinnedPosition === 'left' && col.field === lastLeftField && 'ogx__aggregation-cell--pinned-left-last',\n pinnedPosition === 'right' && col.field === firstRightField && 'ogx__aggregation-cell--pinned-right-first',\n ].filter(Boolean).join(' ');\n\n const style: React.CSSProperties = {\n width: colWidth,\n minWidth: colWidth,\n maxWidth: colWidth,\n textAlign: (col.align as React.CSSProperties['textAlign']) || 'left',\n };\n if (pinnedPosition === 'left' && pinnedOffset !== undefined) style.left = pinnedOffset;\n if (pinnedPosition === 'right' && pinnedOffset !== undefined) style.right = pinnedOffset;\n\n return (\n <div\n key={col.field}\n className={className}\n role=\"gridcell\"\n style={style}\n >\n {fnName ? (\n <>\n <span className=\"ogx__aggregation-label\">{fnName}</span>\n <span className=\"ogx__aggregation-value\">\n {formatAggregationValue(rawValue, fnName)}\n </span>\n </>\n ) : null}\n </div>\n );\n })}\n </div>\n );\n}\n","interface GridEmptyStateProps {\n noRowsLabel: string;\n width: number;\n}\n\nexport function GridEmptyState({ noRowsLabel, width }: GridEmptyStateProps) {\n return (\n <div className=\"ogx__empty\" style={{ width }}>\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <path d=\"M3 9h18M9 21V9\" />\n </svg>\n <span>{noRowsLabel}</span>\n </div>\n );\n}\n","interface GridErrorOverlayProps {\n error: unknown;\n}\n\nexport function GridErrorOverlay({ error }: GridErrorOverlayProps) {\n if (!error) return null;\n const message = error instanceof Error\n ? error.message\n : typeof error === 'string'\n ? error\n : 'An unexpected error occurred while loading the data.';\n return (\n <div className=\"ogx-error-overlay\" aria-live=\"assertive\" role=\"alert\">\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"var(--ogx-color-error)\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n <div className=\"ogx-error-overlay__title\">\n Oops! Something went wrong\n </div>\n <div className=\"ogx-error-overlay__message\">\n {message}\n </div>\n <button\n onClick={() => window.location.reload()}\n className=\"ogx-button ogx-button--primary\"\n >\n Retry\n </button>\n </div>\n );\n}\n","\nimport React from 'react';\n\nexport interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {\n indeterminate?: boolean;\n label?: string;\n inputRef?: React.Ref<HTMLInputElement>;\n}\n\nexport const Checkbox: React.FC<CheckboxProps> = ({\n indeterminate = false,\n label,\n className = '',\n inputRef,\n ...props\n}) => {\n const internalRef = React.useRef<HTMLInputElement>(null);\n\n // Combine refs\n const setRef = React.useCallback((element: HTMLInputElement | null) => {\n internalRef.current = element;\n\n if (typeof inputRef === 'function') {\n inputRef(element);\n } else if (inputRef) {\n (inputRef as React.MutableRefObject<HTMLInputElement | null>).current = element;\n }\n }, [inputRef]);\n\n React.useEffect(() => {\n if (internalRef.current) {\n internalRef.current.indeterminate = indeterminate;\n }\n }, [indeterminate]);\n\n const wrapperClassNames = [\n 'ogx-checkbox-wrapper',\n props.disabled && 'ogx-checkbox-wrapper--disabled',\n className\n ].filter(Boolean).join(' ');\n\n return (\n <label className={wrapperClassNames}>\n <input\n ref={setRef}\n type=\"checkbox\"\n className=\"ogx-checkbox__input\"\n aria-label={label || props['aria-label'] || (indeterminate ? 'Select some' : props.checked ? 'Deselect' : 'Select')}\n {...props}\n />\n <span className=\"ogx-checkbox__box\">\n {props.checked && !indeterminate && (\n <svg className=\"ogx-checkbox__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\" />\n </svg>\n )}\n {indeterminate && (\n <svg className=\"ogx-checkbox__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M19 13H5v-2h14v2z\" />\n </svg>\n )}\n </span>\n {label && <span className=\"ogx-checkbox__label\">{label}</span>}\n </label>\n );\n};\n","\nimport React, { useCallback, useRef, useState } from 'react';\n\n\nexport interface ColumnResizeHandleProps {\n field: string;\n currentWidth: number;\n onResize: (field: string, newWidth: number) => void;\n minWidth?: number;\n maxWidth?: number;\n}\n\nexport function ColumnResizeHandle(props: ColumnResizeHandleProps) {\n const { field, currentWidth, onResize, minWidth = 50, maxWidth = 1000 } = props;\n const [isDragging, setIsDragging] = useState(false);\n const startXRef = useRef<number>(0);\n const startWidthRef = useRef<number>(0);\n\n const handleMouseDown = useCallback((event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n\n setIsDragging(true);\n startXRef.current = event.clientX;\n // Use the logical stored width — reliable for pinned, flex, and normal columns\n startWidthRef.current = currentWidth;\n\n let lastUpdateTime = 0;\n const throttleMs = 16;\n\n const handleMouseMove = (e: MouseEvent) => {\n const deltaX = e.clientX - startXRef.current;\n const newWidth = Math.max(minWidth, Math.min(maxWidth, startWidthRef.current + deltaX));\n\n const now = Date.now();\n if (now - lastUpdateTime >= throttleMs) {\n onResize(field, newWidth);\n lastUpdateTime = now;\n }\n };\n\n const handleMouseUp = (e: MouseEvent) => {\n setIsDragging(false);\n\n const deltaX = e.clientX - startXRef.current;\n const newWidth = Math.max(minWidth, Math.min(maxWidth, startWidthRef.current + deltaX));\n\n onResize(field, newWidth);\n\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n }, [field, currentWidth, onResize, minWidth, maxWidth]);\n\n const handleDoubleClick = useCallback((event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n }, []);\n\n const classNames = [\n 'ogx-column-resize-handle',\n isDragging && 'ogx-column-resize-handle--dragging'\n ].filter(Boolean).join(' ');\n\n return (\n <div\n className={classNames}\n onMouseDown={handleMouseDown}\n onClick={(e) => e.stopPropagation()}\n onDragStart={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n onDoubleClick={handleDoubleClick}\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label={`Resize ${field} column`}\n >\n <div className=\"ogx-column-resize-handle__line\" />\n </div>\n );\n}\n","import React, { useRef, useEffect, useState } from 'react';\nimport ReactDOM from 'react-dom';\nimport type { GridColDef, GridRowModel, GridSortDirection, GridColumnPinning } from '../../types';\n\n\ninterface ColumnMenuProps {\n colDef: GridColDef<GridRowModel>;\n sortModel?: Array<{ field: string; sort: 'asc' | 'desc' }>;\n onSort?: (field: string, direction: GridSortDirection) => void;\n onHide?: (field: string) => void;\n onPin?: (field: string, side: 'left' | 'right' | null) => void;\n pinnedColumns?: GridColumnPinning;\n onManageColumns?: () => void;\n onClose: () => void;\n anchorEl: HTMLElement | null;\n}\n\nfunction ActiveDotIcon() {\n return (\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"currentColor\">\n <circle cx=\"4\" cy=\"4\" r=\"4\" />\n </svg>\n );\n}\n\nfunction InactiveDotIcon() {\n return (\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <circle cx=\"4\" cy=\"4\" r=\"3\" />\n </svg>\n );\n}\n\nfunction ManageColumnsIcon() {\n return (\n <svg focusable=\"false\" aria-hidden=\"true\" viewBox=\"0 0 24 24\" width=\"13\" height=\"13\" fill=\"none\">\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <rect x=\"8.5\" y=\"4\" width=\"7\" height=\"16\" fill=\"currentColor\" opacity=\"0.3\" />\n <line x1=\"8.5\" y1=\"4\" x2=\"8.5\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <line x1=\"15.5\" y1=\"4\" x2=\"15.5\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <line x1=\"2\" y1=\"9\" x2=\"22\" y2=\"9\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <line x1=\"2\" y1=\"14\" x2=\"22\" y2=\"14\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n </svg>\n );\n}\n\nfunction AscIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"5\" />\n <polyline points=\"5 12 12 5 19 12\" />\n </svg>\n );\n}\n\nfunction DescIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n <polyline points=\"19 12 12 19 5 12\" />\n </svg>\n );\n}\n\nfunction UnsortIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\">\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n );\n}\n\nfunction HideIcon() {\n return (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94\" />\n <path d=\"M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19\" />\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n </svg>\n );\n}\n\nfunction PinLeftIcon() {\n return (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n { }\n <line x1=\"4\" y1=\"2\" x2=\"4\" y2=\"22\" />\n { }\n <polyline points=\"11 8 4 12 11 16\" />\n { }\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n </svg>\n );\n}\n\nfunction PinRightIcon() {\n return (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n { }\n <line x1=\"20\" y1=\"2\" x2=\"20\" y2=\"22\" />\n { }\n <polyline points=\"13 8 20 12 13 16\" />\n { }\n <line x1=\"20\" y1=\"12\" x2=\"4\" y2=\"12\" />\n </svg>\n );\n}\n\nfunction UnpinIcon() {\n return (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"2\" y1=\"2\" x2=\"22\" y2=\"22\" />\n <line x1=\"4\" y1=\"4\" x2=\"4\" y2=\"20\" />\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n </svg>\n );\n}\n\nexport function ColumnMenu({ colDef, sortModel, onSort, onHide, onPin, pinnedColumns, onManageColumns, onClose, anchorEl }: ColumnMenuProps) {\n const menuRef = useRef<HTMLDivElement>(null);\n const [style, setStyle] = useState<React.CSSProperties>({ position: 'fixed', zIndex: 1300, top: 0, left: 0, visibility: 'hidden' });\n\n React.useLayoutEffect(() => {\n if (!anchorEl || !menuRef.current) return;\n\n const anchorRect = anchorEl.getBoundingClientRect();\n const menuRect = menuRef.current.getBoundingClientRect();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const margin = 8;\n\n let left = anchorRect.left;\n if (left + menuRect.width + margin > vw) {\n left = vw - menuRect.width - margin;\n }\n if (left < margin) left = margin;\n\n let top = anchorRect.bottom + 4;\n if (top + menuRect.height + margin > vh) {\n top = anchorRect.top - menuRect.height - 4;\n }\n\n setStyle({ position: 'fixed', zIndex: 1300, top, left, visibility: 'visible' });\n }, [anchorEl]);\n\n\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (\n menuRef.current && !menuRef.current.contains(event.target as Node) &&\n anchorEl && !anchorEl.contains(event.target as Node)\n ) onClose();\n }\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') onClose();\n }\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keydown', handleKey);\n // Close menu on any scroll or resize so it doesn't float detached from its anchor\n window.addEventListener('scroll', onClose, true);\n window.addEventListener('resize', onClose);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keydown', handleKey);\n window.removeEventListener('scroll', onClose, true);\n window.removeEventListener('resize', onClose);\n };\n }, [anchorEl, onClose]);\n\n const handleSort = (direction: GridSortDirection) => { onSort?.(colDef.field, direction); onClose(); };\n const handleHide = () => { onHide?.(colDef.field); onClose(); };\n const handlePin = (side: 'left' | 'right' | null) => { onPin?.(colDef.field, side); onClose(); };\n\n const currentSort = sortModel?.find(item => item.field === colDef.field)?.sort;\n const isUnsorted = currentSort === undefined || currentSort === null;\n\n const isPinnedLeft = pinnedColumns?.left?.includes(colDef.field) ?? false;\n const isPinnedRight = pinnedColumns?.right?.includes(colDef.field) ?? false;\n const isUnpinned = !isPinnedLeft && !isPinnedRight;\n\n const colLabel = colDef.headerName || colDef.field;\n\n return ReactDOM.createPortal(\n <div ref={menuRef} className=\"ogx-column-menu\" style={style} role=\"menu\" aria-label={`Column options for ${colLabel}`}>\n\n { }\n {onSort && colDef.sortable !== false && (\n <>\n <button className={`ogx-menu-item${currentSort === 'asc' ? ' ogx-menu-item--active' : ''}`}\n onClick={() => handleSort('asc')} role=\"menuitemradio\" aria-checked={currentSort === 'asc'}>\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\">{currentSort === 'asc' ? <ActiveDotIcon /> : <InactiveDotIcon />}</span>\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><AscIcon /></span>\n Sort Ascending\n </button>\n <button className={`ogx-menu-item${currentSort === 'desc' ? ' ogx-menu-item--active' : ''}`}\n onClick={() => handleSort('desc')} role=\"menuitemradio\" aria-checked={currentSort === 'desc'}>\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\">{currentSort === 'desc' ? <ActiveDotIcon /> : <InactiveDotIcon />}</span>\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><DescIcon /></span>\n Sort Descending\n </button>\n <button className={`ogx-menu-item${isUnsorted ? ' ogx-menu-item--active' : ''}`}\n onClick={() => handleSort(null)} role=\"menuitemradio\" aria-checked={isUnsorted}>\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\">{isUnsorted ? <ActiveDotIcon /> : <InactiveDotIcon />}</span>\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><UnsortIcon /></span>\n Unsort\n </button>\n <div className=\"ogx-menu-divider\" />\n </>\n )}\n\n { }\n <div className=\"ogx-menu-section-label\" aria-hidden=\"true\">Pin column</div>\n <button className={`ogx-menu-item${isPinnedLeft ? ' ogx-menu-item--active' : ''}`}\n onClick={() => handlePin('left')} role=\"menuitemradio\" aria-checked={isPinnedLeft} aria-label=\"Pin to left\">\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\">{isPinnedLeft ? <ActiveDotIcon /> : <InactiveDotIcon />}</span>\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><PinLeftIcon /></span>\n Pin to Left\n </button>\n <button className={`ogx-menu-item${isPinnedRight ? ' ogx-menu-item--active' : ''}`}\n onClick={() => handlePin('right')} role=\"menuitemradio\" aria-checked={isPinnedRight} aria-label=\"Pin to right\">\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\">{isPinnedRight ? <ActiveDotIcon /> : <InactiveDotIcon />}</span>\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><PinRightIcon /></span>\n Pin to Right\n </button>\n <button className={`ogx-menu-item${isUnpinned ? ' ogx-menu-item--active' : ''}`}\n onClick={() => handlePin(null)} role=\"menuitemradio\" aria-checked={isUnpinned} aria-label=\"Unpin column\">\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\">{isUnpinned ? <ActiveDotIcon /> : <InactiveDotIcon />}</span>\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><UnpinIcon /></span>\n Unpin\n </button>\n <div className=\"ogx-menu-divider\" />\n\n { }\n <button className=\"ogx-menu-item\" onClick={handleHide} role=\"menuitem\" aria-label={`Hide ${colLabel} column`}>\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\" />\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><HideIcon /></span>\n Hide Column\n </button>\n\n <div className=\"ogx-menu-divider\" />\n <button className=\"ogx-menu-item\" onClick={() => { onManageColumns?.(); onClose(); }} role=\"menuitem\" aria-label=\"Manage all columns\">\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\" />\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><ManageColumnsIcon /></span>\n Manage columns\n </button>\n </div>,\n (anchorEl?.closest('.ogx-theme-provider') || document.body)\n );\n}\n","import React, { useId } from 'react';\nimport { Checkbox } from '../ui/Checkbox';\nimport { ColumnResizeHandle } from '../ColumnResizeHandle/ColumnResizeHandle';\nimport type { GridColDef, GridRowModel, GridSortDirection, GridColumnPinning, GridAggregationModel, GridColumnGroup, GridColumnGroupingModel } from '../../types';\nimport { isColumnPinned, calculatePinnedPositions } from '../../utils/pinning';\nimport { ColumnMenu } from './ColumnMenu';\n\n\nfunction MenuIcon() {\n return (\n <svg focusable=\"false\" aria-hidden=\"true\" viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"18\" height=\"18\">\n <path d=\"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"></path>\n </svg>\n );\n}\n\nfunction SwapIcon() {\n return (\n <svg focusable=\"false\" aria-hidden=\"true\" viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"currentColor\">\n <path d=\"M6.99 11L3 15l3.99 4v-3H14v-2H6.99v-3zM21 9l-3.99-4v3H10v2h7.01v3L21 9z\"></path>\n </svg>\n );\n}\n\n\n// ─── Group header helpers ─────────────────────────────────────────────────────\n\n/** Collect all leaf field names from a group node (recursive). */\nfunction collectGroupFields(group: GridColumnGroup): string[] {\n const out: string[] = [];\n for (const child of group.children) {\n if (typeof child === 'string') out.push(child);\n else out.push(...collectGroupFields(child));\n }\n return out;\n}\n\n/** Max nesting depth of the group tree (1 = single level). */\nfunction groupTreeDepth(groups: GridColumnGroupingModel): number {\n let d = 0;\n function walk(g: GridColumnGroup, depth: number) {\n d = Math.max(d, depth);\n for (const c of g.children) if (typeof c !== 'string') walk(c, depth + 1);\n }\n groups.forEach(g => walk(g, 1));\n return d;\n}\n\ninterface GroupCell { key: string; label: string; width: number; isGroup: boolean; }\n\n/**\n * Builds the flat array of GroupCell descriptors for one row (level).\n * level 0 = top-most group row.\n * allFields is the ORDERED list of all visible columns (including spacers).\n */\nfunction buildGroupRow(\n groups: GridColumnGroupingModel,\n allFields: { field: string; width: number }[],\n level: number,\n): GroupCell[] {\n // Map each field → the group that owns it at `level`\n function findAtLevel(g: GridColumnGroup, field: string, cur: number): GridColumnGroup | null {\n if (!collectGroupFields(g).includes(field)) return null;\n if (cur === level) return g;\n for (const child of g.children) {\n if (typeof child !== 'string') {\n const found = findAtLevel(child, field, cur + 1);\n if (found) return found;\n }\n }\n return null;\n }\n\n const fieldGroup = new Map<string, GridColumnGroup | null>();\n for (const f of allFields) {\n let found: GridColumnGroup | null = null;\n for (const g of groups) {\n found = findAtLevel(g, f.field, 0);\n if (found) break;\n }\n fieldGroup.set(f.field, found);\n }\n\n const cells: GroupCell[] = [];\n let i = 0;\n while (i < allFields.length) {\n const item = allFields[i];\n const group = fieldGroup.get(item.field) ?? null;\n const w = item.width;\n\n if (!group) {\n cells.push({ key: `fg-${item.field}-${level}`, label: '', width: w, isGroup: false });\n i++;\n } else {\n let totalW = 0;\n let j = i;\n while (j < allFields.length && fieldGroup.get(allFields[j].field) === group) {\n totalW += allFields[j].width;\n j++;\n }\n cells.push({ key: `${group.groupId}-${level}`, label: group.headerName, width: totalW, isGroup: true });\n i = j;\n }\n }\n return cells;\n}\n\n// ─── Props ────────────────────────────────────────────────────────────────────\n\nexport interface HeaderProps<R extends GridRowModel = GridRowModel> {\n columns: GridColDef<R>[];\n allColumns?: GridColDef<R>[];\n columnGroupingModel?: GridColumnGroupingModel;\n checkboxSelection?: boolean;\n allSelected?: boolean;\n someSelected?: boolean;\n onSelectAll?: (isSelected: boolean) => void;\n onSort?: (field: string, direction: GridSortDirection) => void;\n sortModel?: Array<{ field: string; sort: 'asc' | 'desc' }>;\n onColumnResize?: (field: string, newWidth: number) => void;\n columnWidths?: Record<string, number>;\n pinnedColumns?: GridColumnPinning;\n hasDetailPanel?: boolean;\n pinCheckboxColumn?: boolean;\n pinExpandColumn?: boolean;\n rowReordering?: boolean;\n aggregationModel?: GridAggregationModel;\n\n draggedColumn?: string | null;\n dragOverColumn?: string | null;\n onDragStart?: (field: string) => (event: React.DragEvent) => void;\n onDragOver?: (field: string) => (event: React.DragEvent) => void;\n onDragEnd?: () => void;\n onDrop?: (targetField: string) => (event: React.DragEvent) => void;\n focusedCell?: { id: string | number; field: string } | null;\n onHeaderClick?: (field: string) => void;\n onSortAdd?: (field: string, direction: GridSortDirection) => void;\n multiSort?: boolean;\n onHideColumn?: (field: string) => void;\n onPinColumn?: (field: string, side: 'left' | 'right' | null) => void;\n onManageColumns?: () => void;\n}\n\nexport function Header<R extends GridRowModel = GridRowModel>(props: HeaderProps<R>) {\n const {\n columns,\n allColumns,\n columnGroupingModel,\n checkboxSelection = false,\n allSelected = false,\n someSelected = false,\n onSelectAll,\n onSort,\n sortModel = [],\n onColumnResize,\n columnWidths = {},\n pinnedColumns,\n hasDetailPanel = false,\n pinCheckboxColumn = true,\n pinExpandColumn = true,\n rowReordering = false,\n aggregationModel,\n draggedColumn,\n dragOverColumn,\n onDragStart,\n onDragOver,\n onDragEnd,\n onDrop,\n focusedCell,\n onHeaderClick,\n onSortAdd,\n multiSort = false,\n onHideColumn,\n onPinColumn,\n onManageColumns,\n } = props;\n\n const selectAllId = useId();\n const cellRefs = React.useRef<Record<string, HTMLElement | null>>({});\n const [menuOpenParams, setMenuOpenParams] = React.useState<{ colDef: GridColDef<R>; anchorEl: HTMLElement } | null>(null);\n\n const handleMenuOpen = (colDef: GridColDef<R>) => (event: React.MouseEvent) => {\n event.stopPropagation();\n setMenuOpenParams({ colDef, anchorEl: event.currentTarget as HTMLElement });\n };\n\n const handleMenuClose = () => {\n setMenuOpenParams(null);\n };\n\n React.useLayoutEffect(() => {\n if (focusedCell?.id === 'HEADER') {\n const element = cellRefs.current[focusedCell.field];\n if (element) {\n element.focus();\n }\n }\n }, [focusedCell]);\n\n const handleColumnClick = (colDef: GridColDef<R>) => (e: React.MouseEvent) => {\n if (colDef.sortable === false) return;\n\n const currentSort = sortModel.find(item => item.field === colDef.field);\n let newDirection: GridSortDirection = 'asc';\n\n if (currentSort) {\n if (currentSort.sort === 'asc') {\n newDirection = 'desc';\n } else {\n newDirection = null;\n }\n }\n\n if ((e.shiftKey || multiSort) && onSortAdd) {\n onSortAdd(colDef.field, newDirection);\n } else if (onSort) {\n onSort(colDef.field, newDirection);\n }\n };\n\n const getSortIcon = (field: string) => {\n const sortItem = sortModel.find(item => item.field === field);\n if (!sortItem) return null;\n\n const sortIndex = sortModel.length > 1 ? sortModel.indexOf(sortItem) + 1 : null;\n\n return (\n <span className={`ogx__sort-icon ogx__sort-icon--${sortItem.sort}`} aria-hidden=\"true\">\n {sortIndex !== null && (\n <span className=\"ogx__sort-badge\">{sortIndex}</span>\n )}\n </span>\n );\n };\n\n const pinnedPositions = React.useMemo(() => {\n return calculatePinnedPositions(\n columns,\n columnWidths,\n pinnedColumns,\n checkboxSelection,\n pinCheckboxColumn,\n hasDetailPanel,\n pinExpandColumn,\n rowReordering\n );\n }, [columns, columnWidths, pinnedColumns, checkboxSelection, pinCheckboxColumn, hasDetailPanel, pinExpandColumn, rowReordering]);\n\n const groupDepth = columnGroupingModel ? groupTreeDepth(columnGroupingModel) : 0;\n\n // All non-spacer fields in order (for group-span math) with their effective physical width\n const allCols = allColumns ?? columns;\n const allLeafFields = allCols\n .filter(c => !c.isSpacer)\n .map(c => ({\n field: c.field,\n width: columnWidths[c.field] ?? c.width ?? 100\n }));\n\n // --- CHECKBOX / DETAIL / REORDER prefix width (for group filler) ---\n const CHECKBOX_W = 48;\n const REORDER_W = 48;\n const EXPAND_W = 48;\n const prefixWidth =\n (rowReordering ? REORDER_W : 0) +\n (hasDetailPanel ? EXPAND_W : 0) +\n (checkboxSelection ? CHECKBOX_W : 0);\n\n return (\n // Outer sticky wrapper — both group rows AND column header row live here\n // so they ALL stay sticky together and scroll horizontally as one unit.\n <div className=\"ogx__header-wrap\">\n {/* ── Group header rows ── */}\n {groupDepth > 0 && Array.from({ length: groupDepth }, (_, level) => {\n const row = buildGroupRow(\n columnGroupingModel!,\n allLeafFields,\n level,\n );\n return (\n <div key={`ogx-grp-${level}`} className=\"ogx-col-group-row\" role=\"row\">\n {/* Filler for checkbox / reorder / detailPanel prefix */}\n {prefixWidth > 0 && (\n <div\n className=\"ogx-col-group-cell ogx-col-group-cell--filler\"\n style={{ width: prefixWidth, minWidth: prefixWidth, flexShrink: 0 }}\n role=\"columnheader\"\n />\n )}\n {row.map(cell => (\n <div\n key={cell.key}\n role=\"columnheader\"\n className={`ogx-col-group-cell ${cell.isGroup ? 'ogx-col-group-cell--group' : 'ogx-col-group-cell--filler'}`}\n style={{ width: cell.width, minWidth: cell.width, flexShrink: 0 }}\n title={cell.isGroup ? cell.label : undefined}\n >\n {cell.isGroup && (\n <span className=\"ogx-col-group-cell__label\">{cell.label}</span>\n )}\n </div>\n ))}\n </div>\n );\n })}\n\n {/* ── Column header row ── */}\n <div className=\"ogx__header\" role=\"row\">\n { }\n {rowReordering && (\n <div\n className=\"ogx__header-cell ogx__header-cell--pinned ogx__header-cell--pinned-left\"\n role=\"columnheader\"\n aria-label=\"Row reorder handle\"\n title=\"Drag to reorder rows\"\n style={{\n minWidth: 48,\n maxWidth: 48,\n position: 'sticky',\n left: 0,\n zIndex: 4\n }}\n />\n )}\n\n { }\n {hasDetailPanel && (\n <div\n className={`ogx__header-cell ogx__header-cell--expand ${pinExpandColumn ? 'ogx__header-cell--pinned ogx__header-cell--pinned-left' : ''\n }`}\n role=\"columnheader\"\n aria-label=\"Expand row details\"\n style={{\n minWidth: 48,\n maxWidth: 48,\n position: pinExpandColumn ? 'sticky' : undefined,\n left: pinExpandColumn ? (rowReordering ? 48 : 0) : undefined,\n zIndex: pinExpandColumn ? 5 : undefined\n }}\n >\n { }\n </div>\n )}\n\n { }\n {checkboxSelection && (\n <div\n className={`ogx__header-cell ogx__header-cell--checkbox ${pinCheckboxColumn ? 'ogx__header-cell--pinned ogx__header-cell--pinned-left' : ''\n }`}\n role=\"columnheader\"\n style={{\n position: pinCheckboxColumn ? 'sticky' : undefined,\n left: pinCheckboxColumn ? ((rowReordering ? 48 : 0) + (hasDetailPanel && pinExpandColumn ? 48 : 0)) : undefined,\n\n }}\n >\n <Checkbox\n id={selectAllId}\n name={selectAllId}\n checked={allSelected}\n indeterminate={someSelected}\n onChange={(e) => onSelectAll?.(e.target.checked)}\n aria-label={allSelected ? 'Deselect all rows' : 'Select all rows'}\n tabIndex={focusedCell?.id === 'HEADER' && focusedCell.field === '__checkbox_col__' ? 0 : -1}\n onMouseDown={(e) => e.preventDefault()}\n inputRef={(el) => { cellRefs.current['__checkbox_col__'] = el; }}\n />\n </div>\n )}\n\n {columns.map((colDef, index) => {\n if (colDef.isSpacer) {\n return (\n <div\n key={colDef.field}\n style={{ width: colDef.width, minWidth: colDef.width, flexShrink: 0 }}\n aria-hidden=\"true\"\n />\n );\n }\n const isSortable = colDef.sortable !== false;\n const isSorted = sortModel.some(item => item.field === colDef.field);\n const isResizable = colDef.resizable !== false;\n const pinnedPosition = isColumnPinned(colDef.field, pinnedColumns);\n const isPinned = pinnedPosition !== null;\n const isDragging = draggedColumn === colDef.field;\n const isDragOver = dragOverColumn === colDef.field;\n\n const classNames = [\n 'ogx__header-cell',\n `ogx__header-cell--align-${colDef.headerAlign || colDef.align || 'left'}`,\n isSortable && 'ogx__header-cell--sortable',\n isSorted && 'ogx__header-cell--sorted',\n isPinned && `ogx__header-cell--pinned`,\n isPinned && `ogx__header-cell--pinned-${pinnedPosition}`,\n isDragging && 'ogx__header-cell--dragging',\n isDragOver && 'ogx__header-cell--drag-over',\n (focusedCell?.id === 'HEADER' && focusedCell.field === colDef.field) && 'ogx__header-cell--focused',\n colDef.headerClassName\n ].filter(Boolean).join(' ');\n\n const effectiveWidth = columnWidths[colDef.field] ?? colDef.width ?? 100;\n\n const style: React.CSSProperties = {\n width: effectiveWidth,\n minWidth: colDef.minWidth,\n maxWidth: colDef.maxWidth,\n flexGrow: colDef.flex ?? 0,\n flexShrink: 0,\n flexBasis: colDef.flex ? 'auto' : 'auto',\n boxSizing: 'border-box',\n position: isPinned ? 'sticky' : 'relative',\n zIndex: colDef.zIndex,\n opacity: isDragging ? 0.5 : 1\n };\n\n if (isPinned && pinnedPosition) {\n const offset = pinnedPositions[colDef.field];\n if (pinnedPosition === 'left') {\n style.left = offset;\n } else {\n style.right = offset;\n }\n }\n\n const headerContent = colDef.renderHeader\n ? colDef.renderHeader({ field: colDef.field, colDef: colDef as unknown as GridColDef, colIndex: index })\n : colDef.headerName || colDef.field;\n\n const handleHeaderClick = (e: React.MouseEvent) => {\n if ((e.target as HTMLElement).closest('.ogx-column-resize-handle')) {\n e.stopPropagation();\n return;\n }\n onHeaderClick?.(colDef.field);\n if (isSortable) {\n handleColumnClick(colDef)(e);\n }\n };\n\n const handleDragStart = onDragStart ? onDragStart(colDef.field) : undefined;\n const handleDragOver = onDragOver ? onDragOver(colDef.field) : undefined;\n const handleDrop = onDrop ? onDrop(colDef.field) : undefined;\n\n return (\n <div\n key={colDef.field}\n className={classNames}\n style={style}\n title={colDef.description}\n onClick={handleHeaderClick}\n role=\"columnheader\"\n draggable={!!onDragStart}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDragEnd={onDragEnd}\n onDrop={handleDrop}\n aria-sort={\n isSortable\n ? (isSorted\n ? sortModel.find(item => item.field === colDef.field)?.sort === 'asc'\n ? 'ascending'\n : 'descending'\n : 'none')\n : undefined\n }\n aria-colindex={index + 1 + (checkboxSelection ? 1 : 0)}\n data-field={colDef.field}\n tabIndex={-1}\n ref={(el) => { cellRefs.current[colDef.field] = el; }}\n >\n <div className=\"ogx__header-cell-content\">\n {isDragging && (\n <div className=\"ogx__header-drag-icon\">\n <SwapIcon />\n </div>\n )}\n <div className=\"ogx__header-cell-title-wrapper\">\n <span className=\"ogx__header-cell-title\">\n {headerContent}\n </span>\n {aggregationModel && aggregationModel[colDef.field] && (\n <span className=\"ogx__header-cell-aggregation\">\n {aggregationModel[colDef.field]}\n </span>\n )}\n </div>\n {isSortable && getSortIcon(colDef.field)}\n {!colDef.disableColumnMenu && (\n <button\n className=\"ogx__menu-icon-btn\"\n onClick={handleMenuOpen(colDef)}\n aria-label={`Open column menu for ${colDef.headerName || colDef.field}`}\n aria-haspopup=\"menu\"\n tabIndex={-1}\n >\n <MenuIcon />\n </button>\n )}\n </div>\n\n { }\n {isResizable && onColumnResize && (\n <ColumnResizeHandle\n field={colDef.field}\n currentWidth={effectiveWidth}\n onResize={onColumnResize}\n minWidth={colDef.minWidth}\n maxWidth={colDef.maxWidth}\n />\n )}\n </div>\n );\n })}\n\n {menuOpenParams && (\n <ColumnMenu\n colDef={menuOpenParams.colDef as unknown as GridColDef<GridRowModel>}\n sortModel={sortModel}\n onSort={onSort}\n onHide={onHideColumn}\n onPin={onPinColumn}\n pinnedColumns={pinnedColumns}\n onManageColumns={onManageColumns}\n onClose={handleMenuClose}\n anchorEl={menuOpenParams.anchorEl}\n />\n )}\n </div>{/* end .ogx__header */}\n </div>\n );\n}\n","\nimport React from 'react';\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: 'text' | 'outlined' | 'contained';\n size?: 'small' | 'medium' | 'large';\n color?: 'primary' | 'secondary' | 'default';\n disabled?: boolean;\n children: React.ReactNode;\n}\n\nexport const Button: React.FC<ButtonProps> = ({\n variant = 'text',\n size = 'medium',\n color = 'default',\n disabled = false,\n className = '',\n children,\n ...props\n}) => {\n const classNames = [\n 'ogx-button',\n `ogx-button--${variant}`,\n `ogx-button--${size}`,\n `ogx-button--${color}`,\n disabled && 'ogx-button--disabled',\n className\n ].filter(Boolean).join(' ');\n\n return (\n <button\n className={classNames}\n disabled={disabled}\n {...props}\n >\n {children}\n </button>\n );\n};\n","\nimport React, { useId } from 'react';\nimport { Button } from '../ui/Button';\nimport type { GridLocaleText } from '../../types';\n\nexport interface PaginationProps {\n page: number;\n pageSize: number;\n rowCount: number;\n onPageChange: (page: number) => void;\n onPageSizeChange: (pageSize: number) => void;\n pageSizeOptions?: number[];\n showFirstButton?: boolean;\n showLastButton?: boolean;\n localeText?: Pick<GridLocaleText, 'paginationRowsPerPage' | 'paginationOf' | 'paginationPage'>;\n}\n\nexport function Pagination(props: PaginationProps) {\n const pageSizeId = useId();\n const {\n page,\n pageSize,\n rowCount,\n onPageChange,\n onPageSizeChange,\n pageSizeOptions = [10, 25, 50, 100],\n showFirstButton = true,\n showLastButton = true,\n localeText,\n } = props;\n\n const pageCount = Math.max(1, Math.ceil(rowCount / pageSize));\n const currentPage = Math.min(page, pageCount - 1);\n\n const firstRowIndex = currentPage * pageSize;\n const lastRowIndex = Math.min(firstRowIndex + pageSize, rowCount);\n const displayedRows = rowCount === 0 ? 0 : `${firstRowIndex + 1}–${lastRowIndex}`;\n\n const rowsPerPageLabel = localeText?.paginationRowsPerPage ?? 'Rows per page:';\n const ofLabel = localeText?.paginationOf\n ? localeText.paginationOf(rowCount === 0 ? 0 : firstRowIndex + 1, lastRowIndex, rowCount)\n : `${displayedRows} of ${rowCount}`;\n const pageLabel = localeText?.paginationPage\n ? localeText.paginationPage(currentPage + 1, pageCount)\n : `Page ${currentPage + 1} of ${pageCount}`;\n\n const handleFirstPage = () => {\n onPageChange(0);\n };\n\n const handlePreviousPage = () => {\n onPageChange(Math.max(0, currentPage - 1));\n };\n\n const handleNextPage = () => {\n onPageChange(Math.min(pageCount - 1, currentPage + 1));\n };\n\n const handleLastPage = () => {\n onPageChange(pageCount - 1);\n };\n\n const handlePageSizeChange = (event: React.ChangeEvent<HTMLSelectElement>) => {\n const newPageSize = parseInt(event.target.value, 10);\n onPageSizeChange(newPageSize);\n\n };\n\n const isFirstPage = currentPage === 0;\n const isLastPage = currentPage >= pageCount - 1;\n\n return (\n <div className=\"ogx-pagination\" role=\"navigation\" aria-label=\"Pagination\">\n { }\n <div className=\"ogx-pagination__page-size\">\n <label htmlFor={pageSizeId} className=\"ogx-pagination__label\">\n {rowsPerPageLabel}\n </label>\n <select\n id={pageSizeId}\n className=\"ogx-pagination__select\"\n value={pageSize}\n onChange={handlePageSizeChange}\n aria-label=\"Rows per page\"\n >\n {pageSizeOptions.map(option => (\n <option key={option} value={option}>\n {option}\n </option>\n ))}\n </select>\n </div>\n\n { }\n <div className=\"ogx-pagination__info\" aria-live=\"polite\" aria-atomic=\"true\">\n {ofLabel}\n </div>\n\n { }\n <div className=\"ogx-pagination__actions\">\n {showFirstButton && (\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={handleFirstPage}\n disabled={isFirstPage}\n aria-label=\"Go to first page\"\n title=\"First page\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M18.41 16.59L13.82 12l4.59-4.59L17 6l-6 6 6 6zM6 6h2v12H6z\" />\n </svg>\n </Button>\n )}\n\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={handlePreviousPage}\n disabled={isFirstPage}\n aria-label=\"Go to previous page\"\n title=\"Previous page\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\" />\n </svg>\n </Button>\n\n <div className=\"ogx-pagination__page-info\" aria-current=\"page\">\n {pageLabel}\n </div>\n\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={handleNextPage}\n disabled={isLastPage}\n aria-label=\"Go to next page\"\n title=\"Next page\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" />\n </svg>\n </Button>\n\n {showLastButton && (\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={handleLastPage}\n disabled={isLastPage}\n aria-label=\"Go to last page\"\n title=\"Last page\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M5.59 7.41L10.18 12l-4.59 4.59L7 18l6-6-6-6zM16 6h2v12h-2z\" />\n </svg>\n </Button>\n )}\n </div>\n </div>\n );\n}\n","\nimport { useReducer, useCallback, useState, useRef, useEffect, useLayoutEffect } from 'react';\nimport type {\n GridInternalState as GridState,\n GridRowModel,\n GridColDef,\n GridRowId,\n GridSortItem,\n GridFilterModel,\n GridPaginationModel,\n GridColumnVisibilityModel,\n GridApi\n} from '../../types';\n\ntype GridAction =\n | { type: 'SET_ROWS'; payload: GridRowModel[] | ((prev: GridRowModel[]) => GridRowModel[]); preserveRowCount?: boolean }\n | { type: 'SET_COLUMNS'; payload: GridColDef[] }\n | { type: 'SET_SORT_MODEL'; payload: GridSortItem[] }\n | { type: 'SET_FILTER_MODEL'; payload: GridFilterModel }\n | { type: 'SET_PAGINATION_MODEL'; payload: GridPaginationModel }\n | { type: 'SET_SELECTION'; payload: Set<GridRowId> }\n | { type: 'SET_DIMENSIONS'; payload: { viewportWidth: number; viewportHeight: number } }\n | { type: 'SET_DATASOURCE_LOADING'; payload: boolean }\n | { type: 'SET_DATASOURCE_ERROR'; payload: unknown }\n | { type: 'SET_ROW_COUNT'; payload: number };\n\nfunction createInitialState<R extends GridRowModel>(rows: R[], columns: GridColDef<R>[], columnVisibilityModel: GridColumnVisibilityModel = {}): GridState {\n const idRowsLookup = new Map<GridRowId, GridRowModel>();\n const allRows: GridRowId[] = [];\n\n rows.forEach(row => {\n idRowsLookup.set(row.id, row);\n allRows.push(row.id);\n });\n\n const columnLookup = new Map<string, GridColDef>();\n const orderedFields: string[] = [];\n\n columns.forEach(col => {\n columnLookup.set(col.field, col as unknown as GridColDef);\n orderedFields.push(col.field);\n });\n\n return {\n rows: {\n idRowsLookup,\n allRows\n },\n columns: {\n all: columns as unknown as GridColDef[],\n lookup: columnLookup,\n orderedFields,\n columnVisibilityModel\n },\n sorting: {\n sortModel: []\n },\n filter: {\n filterModel: { items: [] }\n },\n pagination: {\n paginationModel: { page: 0, pageSize: 100 },\n rowCount: rows.length\n },\n selection: {\n selectedRows: new Set()\n },\n pinning: {\n pinnedColumns: {},\n pinnedRows: {}\n },\n virtualization: {\n renderContext: {\n firstRowIndex: 0,\n lastRowIndex: 0,\n firstColumnIndex: 0,\n lastColumnIndex: 0\n },\n },\n dimensions: {\n rowHeight: 52,\n headerHeight: 56,\n viewportWidth: 0,\n viewportHeight: 0\n },\n dataSource: {\n loading: false,\n error: null\n }\n };\n}\n\nfunction gridReducer(state: GridState, action: GridAction): GridState {\n switch (action.type) {\n case 'SET_ROWS': {\n const currentRows = Array.from(state.rows.idRowsLookup.values());\n const newRows = typeof action.payload === 'function' \n ? action.payload(currentRows)\n : action.payload;\n\n const idRowsLookup = new Map<GridRowId, GridRowModel>();\n const allRows: GridRowId[] = [];\n\n newRows.forEach(row => {\n idRowsLookup.set(row.id, row);\n allRows.push(row.id);\n });\n\n return {\n ...state,\n rows: { idRowsLookup, allRows },\n pagination: {\n ...state.pagination,\n // Only override rowCount when we're NOT in server mode (i.e. no preserveRowCount flag)\n // Server-side fetches set rowCount separately via SET_ROW_COUNT.\n rowCount: action.preserveRowCount ? state.pagination.rowCount : newRows.length\n }\n };\n }\n\n case 'SET_COLUMNS': {\n const columnLookup = new Map<string, GridColDef>();\n const orderedFields: string[] = [];\n\n action.payload.forEach(col => {\n columnLookup.set(col.field, col);\n orderedFields.push(col.field);\n });\n\n return {\n ...state,\n columns: {\n all: action.payload,\n lookup: columnLookup,\n orderedFields,\n columnVisibilityModel: state.columns.columnVisibilityModel\n }\n };\n }\n\n case 'SET_SORT_MODEL':\n return {\n ...state,\n sorting: { sortModel: action.payload }\n };\n\n case 'SET_FILTER_MODEL':\n return {\n ...state,\n filter: { filterModel: action.payload }\n };\n\n case 'SET_PAGINATION_MODEL':\n return {\n ...state,\n pagination: {\n ...state.pagination,\n paginationModel: action.payload\n }\n };\n\n case 'SET_SELECTION':\n return {\n ...state,\n selection: { selectedRows: action.payload }\n };\n\n case 'SET_DIMENSIONS':\n return {\n ...state,\n dimensions: {\n ...state.dimensions,\n viewportWidth: action.payload.viewportWidth,\n viewportHeight: action.payload.viewportHeight\n }\n };\n\n case 'SET_DATASOURCE_LOADING':\n return {\n ...state,\n dataSource: {\n ...state.dataSource,\n loading: action.payload\n }\n };\n\n case 'SET_DATASOURCE_ERROR':\n return {\n ...state,\n dataSource: {\n ...state.dataSource,\n error: action.payload\n }\n };\n\n case 'SET_ROW_COUNT':\n return {\n ...state,\n pagination: {\n ...state.pagination,\n rowCount: action.payload\n }\n };\n\n default:\n return state;\n }\n}\n\nexport interface UseDataGridParams<R extends GridRowModel = GridRowModel> {\n rows: R[];\n columns: GridColDef<R>[];\n rowHeight?: number;\n headerHeight?: number;\n rowCount?: number;\n columnVisibilityModel?: GridColumnVisibilityModel;\n initialState?: import('../../state/types').GridInitialState;\n}\n\nexport function useDataGrid<R extends GridRowModel = GridRowModel>(params: UseDataGridParams<R>) {\n const { rows, columns, rowHeight = 52, headerHeight = 56, columnVisibilityModel, initialState: propInitialState } = params;\n\n const [internalInitialState] = useState(() =>\n createInitialState(rows, columns, columnVisibilityModel)\n );\n\n const [state, dispatch] = useReducer(gridReducer, {\n ...internalInitialState,\n sorting: propInitialState?.sorting || internalInitialState.sorting,\n filter: propInitialState?.filter || internalInitialState.filter,\n dataSource: propInitialState?.dataSource\n ? { ...internalInitialState.dataSource, ...propInitialState.dataSource }\n : internalInitialState.dataSource,\n pagination: {\n ...internalInitialState.pagination,\n ...(propInitialState?.pagination || {}),\n rowCount: params.rowCount ?? propInitialState?.pagination?.rowCount ?? internalInitialState.pagination.rowCount\n },\n dimensions: {\n ...internalInitialState.dimensions,\n rowHeight,\n headerHeight\n }\n });\n\n const stateRef = useRef(state);\n useLayoutEffect(() => { stateRef.current = state; });\n\n // Sync internal state when the external `rows` prop changes\n const prevRowsRef = useRef(rows);\n useEffect(() => {\n if (rows !== prevRowsRef.current) {\n prevRowsRef.current = rows;\n dispatch({ type: 'SET_ROWS', payload: rows as GridRowModel[] });\n }\n }, [rows]);\n\n const setRows = useCallback((rowsOrUpdater: GridRowModel[] | ((prev: GridRowModel[]) => GridRowModel[]), preserveRowCount?: boolean) => {\n dispatch({ type: 'SET_ROWS', payload: rowsOrUpdater, preserveRowCount });\n }, []);\n\n const setColumns = useCallback((newColumns: GridColDef[]) => {\n dispatch({ type: 'SET_COLUMNS', payload: newColumns });\n }, []);\n\n const setSortModel = useCallback((sortModel: GridSortItem[]) => {\n dispatch({ type: 'SET_SORT_MODEL', payload: sortModel });\n }, []);\n\n const setFilterModel = useCallback((filterModel: GridFilterModel) => {\n dispatch({ type: 'SET_FILTER_MODEL', payload: filterModel });\n }, []);\n\n const setPaginationModel = useCallback((paginationModel: GridPaginationModel) => {\n dispatch({ type: 'SET_PAGINATION_MODEL', payload: paginationModel });\n }, []);\n\n const setSelection = useCallback((selectedRows: Set<GridRowId>) => {\n dispatch({ type: 'SET_SELECTION', payload: selectedRows });\n }, []);\n\n const setDimensions = useCallback((viewportWidth: number, viewportHeight: number) => {\n dispatch({ type: 'SET_DIMENSIONS', payload: { viewportWidth, viewportHeight } });\n }, []);\n\n const setDataSourceLoading = useCallback((loading: boolean) => {\n dispatch({ type: 'SET_DATASOURCE_LOADING', payload: loading });\n }, []);\n\n const setDataSourceError = useCallback((error: unknown) => {\n dispatch({ type: 'SET_DATASOURCE_ERROR', payload: error });\n }, []);\n\n const setRowCount = useCallback((count: number) => {\n dispatch({ type: 'SET_ROW_COUNT', payload: count });\n }, []);\n\n const apiRef = useRef<GridApi>({\n getRow: (id: GridRowId) => stateRef.current.rows.idRowsLookup.get(id) || null,\n getAllRows: () => Array.from(stateRef.current.rows.idRowsLookup.values()),\n getVisibleRows: () => Array.from(stateRef.current.rows.idRowsLookup.values()),\n getAllFilteredRows: () => Array.from(stateRef.current.rows.idRowsLookup.values()),\n getGroupedExportRows: () => null,\n getAggregationResult: () => null,\n getAggregationModel: () => null,\n getColumn: (field: string) => stateRef.current.columns.lookup.get(field) || null,\n getAllColumns: () => stateRef.current.columns.all,\n getVisibleColumns: () => stateRef.current.columns.all,\n selectRow: (id: GridRowId, isSelected = true) => {\n const newSelection = new Set(stateRef.current.selection.selectedRows);\n if (isSelected) {\n newSelection.add(id);\n } else {\n newSelection.delete(id);\n }\n setSelection(newSelection);\n },\n selectRows: (ids: GridRowId[], isSelected = true) => {\n const newSelection = new Set(stateRef.current.selection.selectedRows);\n ids.forEach(id => {\n if (isSelected) {\n newSelection.add(id);\n } else {\n newSelection.delete(id);\n }\n });\n setSelection(newSelection);\n },\n getSelectedRows: () => Array.from(stateRef.current.selection.selectedRows),\n sortColumn: (field: string, direction) => {\n if (direction === null) {\n setSortModel(stateRef.current.sorting.sortModel.filter(item => item.field !== field));\n } else {\n const existingIndex = stateRef.current.sorting.sortModel.findIndex(item => item.field === field);\n if (existingIndex >= 0) {\n const newModel = [...stateRef.current.sorting.sortModel];\n newModel[existingIndex] = { field, sort: direction };\n setSortModel(newModel);\n } else {\n setSortModel([...stateRef.current.sorting.sortModel, { field, sort: direction }]);\n }\n }\n },\n getSortModel: () => stateRef.current.sorting.sortModel,\n setFilterModel,\n getFilterModel: () => stateRef.current.filter.filterModel,\n setPage: (page: number) => {\n setPaginationModel({ ...stateRef.current.pagination.paginationModel, page });\n },\n setPageSize: (pageSize: number) => {\n setPaginationModel({ ...stateRef.current.pagination.paginationModel, pageSize, page: 0 });\n },\n scrollToIndexes: () => {\n\n },\n copySelectedRows: () => Promise.resolve()\n });\n\n return {\n state,\n dispatch,\n apiRef,\n setRows,\n setColumns,\n setSortModel,\n setFilterModel,\n setPaginationModel,\n setSelection,\n setDimensions,\n setDataSourceLoading,\n setDataSourceError,\n setRowCount\n };\n}\n","import { useState, useCallback } from 'react';\nimport type { GridRowId, GridRowModel, GridRowOrderChangeParams } from '../types';\n\nexport interface UseRowReorderProps<R extends GridRowModel = GridRowModel> {\n onRowOrderChange?: (params: GridRowOrderChangeParams<R>) => void;\n rows: R[];\n getRowId?: (row: R) => GridRowId;\n rowReordering?: boolean;\n}\n\nexport interface UseRowReorderReturn {\n draggedRowId: GridRowId | null;\n dragOverRowId: GridRowId | null;\n onDragStart: ((id: GridRowId) => (event: React.DragEvent) => void) | undefined;\n onDragOver: ((id: GridRowId) => (event: React.DragEvent) => void) | undefined;\n onDragEnd: (() => void) | undefined;\n onDrop: ((targetId: GridRowId) => (event: React.DragEvent) => void) | undefined;\n}\n\nexport function useRowReorder<R extends GridRowModel = GridRowModel>(\n props: UseRowReorderProps<R>\n): UseRowReorderReturn {\n const { onRowOrderChange, rows, getRowId, rowReordering = false } = props;\n const [draggedRowId, setDraggedRowId] = useState<GridRowId | null>(null);\n const [dragOverRowId, setDragOverRowId] = useState<GridRowId | null>(null);\n\n const getRowIdInternal = useCallback((row: R) => {\n return getRowId ? getRowId(row) : row.id;\n }, [getRowId]);\n\n const handleDragStart = useCallback((id: GridRowId) => (event: React.DragEvent) => {\n if (!rowReordering) return;\n setDraggedRowId(id);\n event.dataTransfer.effectAllowed = 'move';\n\n }, [rowReordering]);\n\n const handleDragOver = useCallback((id: GridRowId) => (event: React.DragEvent) => {\n if (!rowReordering || !draggedRowId) return;\n event.preventDefault(); \n event.dataTransfer.dropEffect = 'move';\n\n if (dragOverRowId !== id) {\n setDragOverRowId(id);\n }\n }, [rowReordering, draggedRowId, dragOverRowId]);\n\n const handleDragEnd = useCallback(() => {\n setDraggedRowId(null);\n setDragOverRowId(null);\n }, []);\n\n const handleDrop = useCallback((targetId: GridRowId) => (event: React.DragEvent) => {\n event.preventDefault();\n\n if (!draggedRowId || !onRowOrderChange) {\n handleDragEnd();\n return;\n }\n\n const oldIndex = rows.findIndex(r => getRowIdInternal(r) === draggedRowId);\n const targetIndex = rows.findIndex(r => getRowIdInternal(r) === targetId);\n\n if (oldIndex !== -1 && targetIndex !== -1 && oldIndex !== targetIndex) {\n onRowOrderChange({\n row: rows[oldIndex],\n oldIndex,\n targetIndex\n });\n }\n\n handleDragEnd();\n }, [draggedRowId, onRowOrderChange, rows, getRowIdInternal, handleDragEnd]);\n\n return {\n draggedRowId,\n dragOverRowId,\n onDragStart: rowReordering ? handleDragStart : undefined,\n onDragOver: rowReordering ? handleDragOver : undefined,\n onDragEnd: rowReordering ? handleDragEnd : undefined,\n onDrop: rowReordering ? handleDrop : undefined,\n };\n}\n","import { useMemo, useState, useCallback, useEffect } from 'react';\nimport { GridRowModel, GridRowId, GridTreeNode, GridFilterModel, GridSortItem } from '../types';\nimport type { GridRowMeta } from '../types';\nimport { isRowMatchingFilter } from '../utils/filtering';\nimport { compareValues } from '../utils/sorting';\n\ninterface UseTreeDataProps<R extends GridRowModel> {\n rows: R[];\n getRowId: (row: R) => GridRowId;\n getTreeDataPath?: (row: R) => string[];\n treeData?: boolean;\n defaultGroupingExpansionDepth?: number;\n filterModel?: GridFilterModel;\n sortModel?: GridSortItem[];\n onRowExpansionChange?: (node: GridTreeNode) => void;\n}\n\nexport function useTreeData<R extends GridRowModel>(props: UseTreeDataProps<R>) {\n const { \n rows, \n getRowId,\n getTreeDataPath, \n treeData = false, \n defaultGroupingExpansionDepth = 0, \n filterModel,\n sortModel,\n onRowExpansionChange\n } = props;\n\n const { treeNodes, rootIds, groupingRows } = useMemo(() => {\n if (!treeData || !getTreeDataPath) {\n return { \n treeNodes: new Map<GridRowId, GridTreeNode>(), \n rootIds: [], \n groupingRows: [] \n };\n }\n\n const nodes = new Map<GridRowId, GridTreeNode>();\n const roots: GridRowId[] = [];\n const groupRows: GridRowModel[] = [];\n const pathLookup = new Map<string, GridRowId>();\n\n const getPathKey = (path: string[]) => path.join('/');\n\n rows.forEach(row => {\n const id = getRowId(row);\n const path = getTreeDataPath(row);\n const pathKey = getPathKey(path);\n\n pathLookup.set(pathKey, id);\n\n nodes.set(id, {\n id,\n parentId: null,\n depth: path.length - 1,\n groupingKey: path[path.length - 1],\n isExpanded: false,\n children: [],\n serverChildrenCount: row.serverChildrenCount\n });\n });\n\n rows.forEach(row => {\n const id = getRowId(row);\n const path = getTreeDataPath(row);\n\n if (path.length === 1) {\n roots.push(id);\n return;\n }\n\n const ensureAncestors = (childPath: string[]) => {\n if (childPath.length <= 1) return;\n\n const parentPath = childPath.slice(0, -1);\n const parentPathKey = getPathKey(parentPath);\n let parentId = pathLookup.get(parentPathKey);\n\n if (parentId === undefined) {\n parentId = `auto-group-${parentPathKey}`;\n\n if (!nodes.has(parentId)) {\n const groupLabel = parentPath[parentPath.length - 1];\n nodes.set(parentId, {\n id: parentId,\n parentId: null, \n depth: parentPath.length - 1,\n groupingKey: groupLabel,\n isExpanded: false,\n children: [],\n label: groupLabel\n });\n pathLookup.set(parentPathKey, parentId);\n\n const groupRow = { \n id: parentId,\n name: groupLabel, \n _isGroupRow: true\n } as unknown as GridRowModel; \n groupRows.push(groupRow);\n\n if (parentPath.length === 1) {\n roots.push(parentId);\n }\n\n ensureAncestors(parentPath);\n }\n }\n\n return parentId;\n };\n\n const parentId = ensureAncestors(path);\n\n if (parentId !== undefined) {\n const parentNode = nodes.get(parentId);\n const childNode = nodes.get(id);\n\n if (parentNode && childNode) {\n childNode.parentId = parentId;\n parentNode.children = parentNode.children || [];\n if (!parentNode.children.includes(id)) {\n parentNode.children.push(id);\n }\n }\n }\n });\n\n groupRows.forEach(groupRow => {\n const groupId = groupRow.id;\n const node = nodes.get(groupId);\n if (!node) return;\n\n const nodePathKey = (groupId as string).replace('auto-group-', '');\n const nodePath = nodePathKey.split('/');\n\n if (nodePath.length > 1) {\n const parentPath = nodePath.slice(0, -1);\n const parentPathKey = getPathKey(parentPath);\n const parentId = pathLookup.get(parentPathKey);\n\n if (parentId && nodes.has(parentId)) {\n node.parentId = parentId;\n const parentNode = nodes.get(parentId);\n if (parentNode) {\n parentNode.children = parentNode.children || [];\n if (!parentNode.children.includes(groupId)) {\n parentNode.children.push(groupId);\n }\n }\n }\n }\n });\n\n return { treeNodes: nodes, rootIds: roots, groupingRows: groupRows };\n\n }, [rows, getTreeDataPath, treeData, getRowId]);\n\n const initialExpandedIds = useMemo(() => {\n if (!treeData) return new Set<GridRowId>();\n\n const initialExpanded = new Set<GridRowId>();\n treeNodes.forEach(node => {\n if (node.children && node.children.length > 0) {\n if (defaultGroupingExpansionDepth === -1 || node.depth < defaultGroupingExpansionDepth) {\n initialExpanded.add(node.id);\n }\n }\n });\n return initialExpanded;\n }, [treeNodes, treeData, defaultGroupingExpansionDepth]);\n\n const [expandedGroupIds, setExpandedGroupIds] = useState<Set<GridRowId>>(new Set());\n\n useEffect(() => {\n if (initialExpandedIds.size > 0) {\n setExpandedGroupIds(initialExpandedIds);\n }\n }, [initialExpandedIds]);\n\n const toggleExpansion = useCallback((id: GridRowId) => {\n setExpandedGroupIds(prev => {\n const next = new Set(prev);\n const isExpanding = !next.has(id);\n\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n\n if (isExpanding && onRowExpansionChange) {\n const node = treeNodes.get(id);\n if (node) {\n onRowExpansionChange(node);\n }\n }\n\n return next;\n });\n }, [treeNodes, onRowExpansionChange]);\n\n const getVisibleRows = useCallback(() => {\n\n if (!treeData) return null; \n\n const rowLookup = new Map<GridRowId, GridRowModel>();\n rows.forEach(r => rowLookup.set(getRowId(r), r));\n groupingRows.forEach(r => rowLookup.set(r.id, r));\n\n const matchesFilter = (row: GridRowModel) => {\n return isRowMatchingFilter(row, filterModel!);\n };\n\n const filterCache = new Map<GridRowId, boolean>();\n\n const isNodeVisible = (id: GridRowId): boolean => {\n if (filterCache.has(id)) return filterCache.get(id)!;\n\n const row = rowLookup.get(id);\n if (!row) return false;\n\n const selfMatch = matchesFilter(row);\n if (selfMatch) {\n filterCache.set(id, true);\n return true;\n }\n\n const node = treeNodes.get(id);\n if (node && node.children) {\n const childMatch = node.children.some(childId => isNodeVisible(childId));\n if (childMatch) {\n filterCache.set(id, true);\n return true;\n }\n }\n\n filterCache.set(id, false);\n return false;\n };\n\n const sortNodes = (aId: GridRowId, bId: GridRowId) => {\n if (!sortModel || sortModel.length === 0) return 0;\n const rowA = rowLookup.get(aId);\n const rowB = rowLookup.get(bId);\n if (!rowA || !rowB) return 0;\n\n for (const sortItem of sortModel) {\n const valA = rowA[sortItem.field];\n const valB = rowB[sortItem.field];\n const comp = compareValues(valA, valB, sortItem.sort);\n if (comp !== 0) return comp;\n }\n return 0;\n };\n\n const result: GridRowModel[] = [];\n\n const seenIds = new Set<GridRowId>();\n\n const traverse = (ids: GridRowId[]) => {\n\n const visibleIds = ids.filter(id => isNodeVisible(id));\n\n visibleIds.sort(sortNodes);\n\n visibleIds.forEach(id => {\n if (seenIds.has(id)) return; \n\n const row = rowLookup.get(id);\n const node = treeNodes.get(id);\n\n if (row && node) {\n seenIds.add(id); \n\n const enhancedRow = {\n ...row,\n _treeDepth: node.depth,\n _isExpanded: expandedGroupIds.has(id),\n _hasChildren: Boolean((node.children && node.children.length > 0) || (node.serverChildrenCount && node.serverChildrenCount > 0)),\n _descendantCount: node.children ? node.children.length : 0\n };\n result.push(enhancedRow);\n\n if (expandedGroupIds.has(id) && node.children && node.children.length > 0) {\n traverse(node.children);\n }\n }\n });\n };\n\n traverse(rootIds);\n return result;\n\n }, [treeData, rows, groupingRows, rootIds, treeNodes, expandedGroupIds, filterModel, sortModel, getRowId]);\n\n const isGroupExpanded = useCallback((id: GridRowId) => expandedGroupIds.has(id), [expandedGroupIds]);\n const getNode = useCallback((id: GridRowId) => treeNodes.get(id), [treeNodes]);\n\n const getNodePath = useCallback((id: GridRowId): string[] => {\n const path: string[] = [];\n let currentId: GridRowId | null = id;\n\n while (currentId !== null) {\n const node = treeNodes.get(currentId);\n if (!node) break;\n\n path.unshift(node.groupingKey);\n currentId = node.parentId;\n }\n return path;\n }, [treeNodes]);\n\n const rowMetaMap = useMemo<Map<GridRowId, GridRowMeta>>(() => {\n const map = new Map<GridRowId, GridRowMeta>();\n const groupRowIds = new Set(groupingRows.map(r => r.id));\n treeNodes.forEach((node, id) => {\n map.set(id, {\n hasChildren: Boolean(\n (node.children && node.children.length > 0) ||\n (node.serverChildrenCount && node.serverChildrenCount > 0)\n ),\n treeDepth: node.depth,\n descendantCount: node.children ? node.children.length : undefined,\n isGroupRow: groupRowIds.has(id),\n isExpanded: expandedGroupIds.has(id),\n });\n });\n return map;\n }, [treeNodes, groupingRows, expandedGroupIds]);\n\n return useMemo(() => ({\n treeNodes,\n groupingRows,\n toggleExpansion,\n isGroupExpanded,\n getVisibleRows,\n getNode,\n getNodePath,\n rowMetaMap,\n }), [treeNodes, groupingRows, toggleExpansion, isGroupExpanded, getVisibleRows, getNode, getNodePath, rowMetaMap]);\n}\n","import { useState, useMemo, useEffect, useCallback } from 'react';\nimport type {\n GridRowModel,\n GridRowId,\n GridRowGroupingModel,\n GridAggregationModel,\n GridTreeNode,\n GridFilterModel,\n GridSortItem,\n GridRowMeta,\n GridColDef\n} from '../types';\nimport { isRowMatchingFilter } from '../utils/filtering';\nimport { compareValues } from '../utils/sorting';\n\nexport interface UseRowGroupingParams<R extends GridRowModel> {\n rows: R[];\n getRowId: (row: R) => GridRowId;\n columns?: GridColDef<R>[];\n rowGroupingModel?: GridRowGroupingModel;\n aggregationModel?: GridAggregationModel;\n defaultGroupingExpansionDepth?: number;\n filterModel?: GridFilterModel;\n sortModel?: GridSortItem[];\n getAggregationPosition?: (groupNode: GridTreeNode | null) => 'inline' | 'footer' | null;\n}\n\nconst defaultGetAggregationPosition = (groupNode: GridTreeNode | null): 'inline' | 'footer' | null => {\n\n return groupNode?.depth === -1 ? 'footer' : 'inline';\n};\n\n// Stable empty defaults — module-level constants prevent new object identity\n// on every render, which would otherwise invalidate useMemo deps and cause\n// infinite re-render loops when callers omit optional params.\nconst EMPTY_ROW_GROUPING_MODEL: GridRowGroupingModel = [];\nconst EMPTY_AGGREGATION_MODEL: GridAggregationModel = {};\n\nexport function useRowGrouping<R extends GridRowModel>(params: UseRowGroupingParams<R>) {\n const {\n rows,\n getRowId,\n columns,\n rowGroupingModel = EMPTY_ROW_GROUPING_MODEL,\n aggregationModel = EMPTY_AGGREGATION_MODEL,\n defaultGroupingExpansionDepth = 0,\n filterModel,\n sortModel,\n getAggregationPosition = defaultGetAggregationPosition\n } = params;\n\n const columnsLookup = useMemo(() => {\n const map = new Map<string, GridColDef<R>>();\n (columns ?? []).forEach(col => map.set(col.field, col));\n return map;\n }, [columns]);\n\n const [expandedGroupIds, setExpandedGroupIds] = useState<Set<GridRowId>>(new Set());\n\n const { treeNodes, rootIds, groupingRows } = useMemo(() => {\n const treeNodes = new Map<GridRowId, GridTreeNode>();\n const groupingRows = new Map<GridRowId, R>();\n const rootIds: GridRowId[] = [];\n\n if (rowGroupingModel.length === 0) {\n return { treeNodes, rootIds, groupingRows };\n }\n\n const getGroupId = (field: string, value: unknown, parentId: GridRowId | null) => {\n return `auto-group-${field}-${value}-${parentId || 'root'}`;\n };\n\n const groupRows = (\n currentRows: R[], \n depth: number, \n parentId: GridRowId | null\n ) => {\n if (depth >= rowGroupingModel.length) {\n\n return currentRows.map(row => {\n const id = getRowId(row);\n treeNodes.set(id, {\n id,\n parentId,\n depth,\n groupingKey: '',\n isExpanded: false\n });\n return id;\n });\n }\n\n const field = rowGroupingModel[depth];\n\n // Skip fields where the column has explicitly opted out of grouping.\n const colDef = columnsLookup.get(field);\n if (colDef && colDef.groupable === false) {\n return groupRows(currentRows, depth + 1, parentId);\n }\n\n const groups = new Map<string, R[]>();\n\n // Group current rows by value of the current field\n currentRows.forEach(row => {\n const value = row[field];\n const key = String(value); // reliable map key\n if (!groups.has(key)) {\n groups.set(key, []);\n }\n groups.get(key)!.push(row);\n });\n\n const groupIds: GridRowId[] = [];\n\n // Create group rows\n groups.forEach((groupRowsList, key) => {\n // Use the raw value from the first row of the group for the groupingValue\n const firstRow = groupRowsList[0];\n const rawValue = firstRow[field];\n\n const groupId = getGroupId(field, key, parentId);\n groupIds.push(groupId);\n\n // Calculate Aggregations for this group\n const aggregatedValues: Record<string, unknown> = {};\n if (aggregationModel) {\n Object.entries(aggregationModel).forEach(([aggField, aggType]) => {\n const values = groupRowsList.map(r => r[aggField]);\n if (aggType === 'sum') {\n aggregatedValues[aggField] = values.reduce((a: number, b) => a + (Number(b) || 0), 0);\n } else if (aggType === 'min') {\n aggregatedValues[aggField] = Math.min(...values.map(v => Number(v) || 0));\n } else if (aggType === 'max') {\n aggregatedValues[aggField] = Math.max(...values.map(v => Number(v) || 0));\n } else if (aggType === 'avg') {\n const sum = values.reduce((a: number, b) => a + (Number(b) || 0), 0);\n aggregatedValues[aggField] = values.length ? sum / values.length : 0;\n } else if (aggType === 'count') {\n aggregatedValues[aggField] = values.length;\n }\n });\n }\n\n const groupRow = {\n [field]: rawValue,\n ...aggregatedValues,\n id: groupId\n } as unknown as R;\n\n groupingRows.set(groupId, groupRow);\n\n const treeNode: GridTreeNode = {\n id: groupId,\n parentId,\n depth,\n groupingKey: key,\n groupingField: field,\n groupingValue: rawValue,\n aggregatedValues,\n isExpanded: false,\n children: [], \n label: colDef?.groupingValueFormatter\n ? colDef.groupingValueFormatter({ field, value: rawValue })\n : `${field}: ${String(rawValue)}` \n };\n\n treeNode.aggregationPosition = getAggregationPosition(treeNode);\n\n treeNodes.set(groupId, treeNode);\n\n const childrenIds = groupRows(groupRowsList, depth + 1, groupId);\n treeNodes.get(groupId)!.children = childrenIds;\n\n const descendantCount = groupRowsList.length;\n treeNodes.get(groupId)!.descendantCount = descendantCount;\n });\n\n return groupIds;\n };\n\n const topLevelIds = groupRows(rows, 0, null);\n rootIds.push(...topLevelIds);\n\n return { treeNodes, rootIds, groupingRows };\n\n }, [rows, rowGroupingModel, aggregationModel, getRowId, getAggregationPosition, columnsLookup]);\n\n useEffect(() => {\n if (defaultGroupingExpansionDepth === -1) {\n\n const allGroupIds = new Set<GridRowId>();\n treeNodes.forEach((node, id) => {\n if (node.children && node.children.length > 0) {\n allGroupIds.add(id);\n }\n });\n setExpandedGroupIds(allGroupIds);\n } else if (defaultGroupingExpansionDepth > 0) {\n const depthIds = new Set<GridRowId>();\n treeNodes.forEach((node, id) => {\n if (node.depth < defaultGroupingExpansionDepth && node.children && node.children.length > 0) {\n depthIds.add(id);\n }\n });\n setExpandedGroupIds(depthIds);\n } else {\n\n setExpandedGroupIds(new Set());\n }\n\n }, [rowGroupingModel, defaultGroupingExpansionDepth, treeNodes]);\n\n const toggleExpansion = useCallback((id: GridRowId) => {\n setExpandedGroupIds(prev => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n }, []);\n\n const isGroupExpanded = useCallback((id: GridRowId) => {\n return expandedGroupIds.has(id);\n }, [expandedGroupIds]);\n\n const getVisibleRows = useCallback(() => {\n if (rowGroupingModel.length === 0) return null;\n\n const result: R[] = [];\n const seenIds = new Set<GridRowId>();\n\n const rowLookup = new Map<GridRowId, R>();\n rows.forEach(r => rowLookup.set(getRowId(r), r));\n\n const doesNodeMatchFilter = (nodeId: GridRowId): boolean => {\n const node = treeNodes.get(nodeId);\n if (!node) return false;\n\n if (!node.children || node.children.length === 0) {\n\n const row = rowLookup.get(nodeId);\n if (!row) return false;\n\n if (filterModel) {\n if (!isRowMatchingFilter(row, filterModel)) return false;\n }\n return true;\n }\n\n return node.children.some(childId => doesNodeMatchFilter(childId));\n };\n\n const traverse = (ids: GridRowId[]) => {\n\n let visibleIds = ids;\n if (filterModel) {\n visibleIds = ids.filter(doesNodeMatchFilter);\n }\n\n if (sortModel && sortModel.length > 0) {\n visibleIds.sort((aId, bId) => {\n const rowA = groupingRows.get(aId) || rowLookup.get(aId);\n const rowB = groupingRows.get(bId) || rowLookup.get(bId);\n\n if (!rowA || !rowB) return 0;\n\n for (const sortItem of sortModel) {\n const valA = rowA[sortItem.field];\n const valB = rowB[sortItem.field];\n const compareResult = compareValues(valA, valB, sortItem.sort);\n if (compareResult !== 0) return compareResult;\n }\n return 0;\n });\n }\n\n visibleIds.forEach(id => {\n if (seenIds.has(id)) return; \n\n const node = treeNodes.get(id);\n const isGroup = node?.children && node.children.length > 0;\n\n const row = isGroup ? groupingRows.get(id) : rowLookup.get(id);\n\n if (row && node) {\n seenIds.add(id);\n\n const enhancedRow = {\n ...row,\n _treeDepth: node.depth,\n _isExpanded: expandedGroupIds.has(id),\n _hasChildren: isGroup,\n _groupingField: node.groupingField,\n _groupingValue: node.groupingValue,\n _descendantCount: node.descendantCount\n };\n result.push(enhancedRow);\n\n if (isExpandedGroupIds.has(id) && isGroup) {\n traverse(node.children!);\n }\n }\n });\n };\n\n const isExpandedGroupIds = expandedGroupIds; \n\n traverse(rootIds);\n\n return result;\n\n }, [rows, getRowId, treeNodes, rootIds, groupingRows, filterModel, sortModel, expandedGroupIds, rowGroupingModel]);\n\n const getNode = useCallback((id: GridRowId) => treeNodes.get(id), [treeNodes]);\n\n const rowMetaMap = useMemo<Map<GridRowId, GridRowMeta>>(() => {\n const map = new Map<GridRowId, GridRowMeta>();\n treeNodes.forEach((node, id) => {\n const isGroup = Boolean(node.children && node.children.length > 0);\n map.set(id, {\n hasChildren: isGroup,\n treeDepth: node.depth,\n groupingField: node.groupingField,\n groupingValue: node.groupingValue,\n groupLabel: node.label,\n descendantCount: node.descendantCount,\n isGroupRow: isGroup,\n isExpanded: isGroup ? expandedGroupIds.has(id) : undefined,\n });\n });\n return map;\n }, [treeNodes, expandedGroupIds]);\n\n return useMemo(() => ({\n treeNodes,\n groupingRows,\n toggleExpansion,\n isGroupExpanded,\n getVisibleRows,\n getNode,\n rowMetaMap,\n }), [treeNodes, groupingRows, toggleExpansion, isGroupExpanded, getVisibleRows, getNode, rowMetaMap]);\n}\n","import React, { useState, useCallback, useRef } from 'react';\nimport type { GridRowId, GridRowModel } from '../../types';\n\nexport interface GridEditingState {\n editingCell: {\n id: GridRowId;\n field: string;\n value: unknown;\n originalValue: unknown;\n } | null;\n}\n\nexport interface UseGridEditingParams<R extends GridRowModel> {\n rows: R[];\n getRowId: (row: R) => GridRowId;\n processRowUpdate?: (newRow: R, oldRow: R) => R | Promise<R>;\n onProcessRowUpdateError?: (error: unknown) => void;\n onRowChange?: (newRow: R) => void;\n}\n\ntype EditingCellState = GridEditingState['editingCell'];\n\nexport function useGridEditing<R extends GridRowModel>(params: UseGridEditingParams<R>) {\n const {\n rows,\n getRowId,\n processRowUpdate,\n onProcessRowUpdateError,\n onRowChange\n } = params;\n\n const [editingCell, setEditingCellState] = useState<EditingCellState>(null);\n const editingCellRef = useRef<EditingCellState>(null);\n\n const setEditingCell = useCallback((val: React.SetStateAction<EditingCellState>) => {\n setEditingCellState(val);\n editingCellRef.current = typeof val === 'function' ? val(editingCellRef.current) : val;\n }, []);\n\n const startCellEdit = useCallback((editParams: { id: GridRowId; field: string; value: unknown }) => {\n setEditingCell({\n id: editParams.id,\n field: editParams.field,\n value: editParams.value,\n originalValue: editParams.value\n });\n }, [setEditingCell]);\n\n const stopCellEdit = useCallback(async (stopParams?: { cancel?: boolean }) => {\n const currentCell = editingCellRef.current;\n if (!currentCell) return;\n\n if (stopParams?.cancel) {\n setEditingCell(null);\n return;\n }\n\n const { id, field, value, originalValue } = currentCell;\n\n if (value === originalValue) {\n setEditingCell(null);\n return;\n }\n\n const existingRow = rows.find(r => getRowId(r) === id);\n if (!existingRow) {\n setEditingCell(null);\n return;\n }\n\n const newRow = { ...existingRow, [field]: value };\n\n try {\n if (processRowUpdate) {\n const processedRow = await processRowUpdate(newRow, existingRow);\n onRowChange?.(processedRow);\n } else {\n onRowChange?.(newRow);\n }\n setEditingCell(null);\n } catch (error) {\n onProcessRowUpdateError?.(error);\n }\n\n }, [setEditingCell, rows, getRowId, processRowUpdate, onRowChange, onProcessRowUpdateError]);\n\n const setEditCellValue = useCallback((editParams: { id: GridRowId; field: string; value: unknown }) => {\n if (editingCell && editingCell.id === editParams.id && editingCell.field === editParams.field) {\n setEditingCell(prev => prev ? { ...prev, value: editParams.value } : null);\n }\n }, [editingCell, setEditingCell]);\n\n return {\n editingCell,\n startCellEdit,\n stopCellEdit,\n setEditCellValue\n };\n}\n","\nimport { useState, useCallback, useEffect } from 'react';\nimport type { GridRowId, GridColDef, GridRowModel, GridRenderCellParams } from '../../types';\n\ntype ColumnKey = string;\n\nexport type CellColSpanInfo = \n | { \n spannedByColSpan: true; \n rightVisibleCellIndex: number; \n leftVisibleCellIndex: number; \n }\n | { \n spannedByColSpan: false; \n cellProps: { \n colSpan: number; \n width: number; \n }; \n };\n\ntype ColspanMap = Map<GridRowId, Record<ColumnKey, CellColSpanInfo>>;\n\nexport interface RowSpanningCaches {\n spannedCells: Record<GridRowId, Record<ColumnKey, number>>;\n hiddenCells: Record<GridRowId, Record<ColumnKey, boolean>>;\n hiddenCellOriginMap: Record<number, Record<ColumnKey, number>>;\n}\n\nexport interface RowSpanningState {\n caches: RowSpanningCaches;\n processedRange: { firstRowIndex: number; lastRowIndex: number; };\n}\n\nexport function useGridSpanning<R extends GridRowModel>(\n rows: R[],\n columns: GridColDef<R>[],\n columnWidths: Record<string, number>\n) {\n\n const [colspanMap, setColspanMap] = useState<ColspanMap>(new Map());\n\n const [rowSpanningState, setRowSpanningState] = useState<RowSpanningState>({\n caches: {\n spannedCells: {},\n hiddenCells: {},\n hiddenCellOriginMap: {}\n },\n processedRange: { firstRowIndex: 0, lastRowIndex: 0 }\n });\n\n const resetColSpan = useCallback(() => {\n setColspanMap(new Map());\n }, []);\n\n const getCellColSpanInfo = useCallback((rowId: GridRowId, field: string): CellColSpanInfo | undefined => {\n return colspanMap.get(rowId)?.[field];\n }, [colspanMap]);\n\n const calculateColSpan = useCallback((\n rowId: GridRowId,\n row: R,\n rowIndex: number,\n minFirstColumn: number,\n maxLastColumn: number\n ) => {\n const newMap = new Map(colspanMap);\n\n for (let i = minFirstColumn; i < maxLastColumn; i++) {\n const colDef = columns[i];\n if (!colDef) continue;\n\n let colSpan = 1;\n if (colDef.colSpan) {\n if (typeof colDef.colSpan === 'function') {\n const params: GridRenderCellParams<R> = {\n row,\n value: row[colDef.field as keyof R],\n field: colDef.field,\n colDef,\n rowIndex,\n colIndex: i \n };\n colSpan = colDef.colSpan(params);\n } else {\n colSpan = colDef.colSpan;\n }\n }\n\n if (colSpan <= 1) {\n setCellColSpanInfo(newMap, rowId, colDef.field, {\n spannedByColSpan: false,\n cellProps: { colSpan: 1, width: columnWidths[colDef.field] || 100 }\n });\n continue;\n }\n\n let width = columnWidths[colDef.field] || 100;\n for (let j = 1; j < colSpan; j++) {\n if (i + j < maxLastColumn) {\n const nextCol = columns[i + j];\n if (nextCol) {\n width += columnWidths[nextCol.field] || 100;\n\n setCellColSpanInfo(newMap, rowId, nextCol.field, {\n spannedByColSpan: true,\n leftVisibleCellIndex: i,\n rightVisibleCellIndex: Math.min(i + colSpan - 1, columns.length - 1)\n });\n }\n }\n }\n\n setCellColSpanInfo(newMap, rowId, colDef.field, {\n spannedByColSpan: false,\n cellProps: { colSpan, width }\n });\n\n i += colSpan - 1; \n }\n\n setColspanMap(newMap);\n }, [colspanMap, columns, columnWidths]);\n\n const calculateRowSpan = useCallback((\n firstRowIndex: number,\n lastRowIndex: number\n ) => {\n const spannedCells: Record<GridRowId, Record<ColumnKey, number>> = {};\n const hiddenCells: Record<GridRowId, Record<ColumnKey, boolean>> = {};\n const hiddenCellOriginMap: Record<number, Record<ColumnKey, number>> = {};\n\n columns.forEach((colDef, columnIndex) => {\n\n if (!colDef.rowSpan) return;\n\n for (let index = firstRowIndex; index < lastRowIndex; index++) {\n const row = rows[index];\n if (!row) continue;\n\n if (hiddenCells[row.id]?.[colDef.field]) continue;\n\n const cellValue = colDef.valueGetter\n ? colDef.valueGetter({ row, field: colDef.field, value: row[colDef.field as keyof R] })\n : row[colDef.field as keyof R];\n\n let span = 1;\n if (typeof colDef.rowSpan === 'function') {\n const params: GridRenderCellParams<R> = {\n row,\n value: cellValue,\n field: colDef.field,\n colDef,\n rowIndex: index,\n colIndex: columnIndex\n };\n span = colDef.rowSpan(params);\n } else if (typeof colDef.rowSpan === 'number') {\n span = colDef.rowSpan;\n }\n\n if (span > 1) {\n if (!spannedCells[row.id]) spannedCells[row.id] = {};\n spannedCells[row.id][colDef.field] = span; \n\n for (let k = 1; k < span; k++) {\n const nextIndex = index + k;\n if (nextIndex < lastRowIndex && rows[nextIndex]) {\n const nextRow = rows[nextIndex];\n if (!hiddenCells[nextRow.id]) hiddenCells[nextRow.id] = {};\n hiddenCells[nextRow.id][colDef.field] = true; \n\n if (!hiddenCellOriginMap[nextIndex]) hiddenCellOriginMap[nextIndex] = {};\n hiddenCellOriginMap[nextIndex][colDef.field] = index; \n }\n }\n }\n }\n });\n\n setRowSpanningState({\n caches: { spannedCells, hiddenCells, hiddenCellOriginMap },\n processedRange: { firstRowIndex, lastRowIndex }\n });\n }, [rows, columns]);\n\n const resetRowSpan = useCallback(() => {\n setRowSpanningState({\n caches: {\n spannedCells: {},\n hiddenCells: {},\n hiddenCellOriginMap: {}\n },\n processedRange: { firstRowIndex: 0, lastRowIndex: 0 }\n });\n }, []);\n\n useEffect(() => {\n\n const newMap = new Map<GridRowId, Record<ColumnKey, CellColSpanInfo>>();\n\n rows.forEach((row, index) => {\n for (let i = 0; i < columns.length; i++) {\n const colDef = columns[i];\n if (!colDef) continue;\n\n let colSpan = 1;\n if (colDef.colSpan) {\n if (typeof colDef.colSpan === 'function') {\n const params: GridRenderCellParams<R> = {\n row,\n value: row[colDef.field as keyof R],\n field: colDef.field,\n colDef,\n rowIndex: index,\n colIndex: i\n };\n colSpan = colDef.colSpan(params);\n } else {\n colSpan = colDef.colSpan;\n }\n }\n\n if (colSpan <= 1) {\n const colWidth = columnWidths[colDef.field] || (typeof colDef.width === 'number' ? colDef.width : 100);\n setCellColSpanInfo(newMap, row.id, colDef.field, {\n spannedByColSpan: false,\n cellProps: { colSpan: 1, width: colWidth }\n });\n continue;\n }\n\n let width = columnWidths[colDef.field] || (typeof colDef.width === 'number' ? colDef.width : 100);\n for (let j = 1; j < colSpan; j++) {\n if (i + j < columns.length) {\n const nextCol = columns[i + j];\n if (nextCol) {\n const nextColWidth = columnWidths[nextCol.field] || (typeof nextCol.width === 'number' ? nextCol.width : 100);\n width += nextColWidth;\n\n setCellColSpanInfo(newMap, row.id, nextCol.field, {\n spannedByColSpan: true,\n leftVisibleCellIndex: i,\n rightVisibleCellIndex: Math.min(i + colSpan - 1, columns.length - 1)\n });\n }\n }\n }\n\n setCellColSpanInfo(newMap, row.id, colDef.field, {\n spannedByColSpan: false,\n cellProps: { colSpan, width }\n });\n\n i += colSpan - 1; \n }\n });\n\n setColspanMap(newMap);\n\n const spannedCells: Record<GridRowId, Record<ColumnKey, number>> = {};\n const hiddenCells: Record<GridRowId, Record<ColumnKey, boolean>> = {};\n const hiddenCellOriginMap: Record<number, Record<ColumnKey, number>> = {};\n\n columns.forEach((colDef, columnIndex) => {\n if (!colDef.rowSpan) return;\n\n for (let index = 0; index < rows.length; index++) {\n const row = rows[index];\n if (!row) continue;\n\n if (hiddenCells[row.id]?.[colDef.field]) continue;\n\n const cellValue = colDef.valueGetter\n ? colDef.valueGetter({ row, field: colDef.field, value: row[colDef.field as keyof R] })\n : row[colDef.field as keyof R];\n\n let span = 1;\n if (typeof colDef.rowSpan === 'function') {\n const params: GridRenderCellParams<R> = {\n row,\n value: cellValue,\n field: colDef.field,\n colDef,\n rowIndex: index,\n colIndex: columnIndex\n };\n span = colDef.rowSpan(params);\n } else if (typeof colDef.rowSpan === 'number') {\n span = colDef.rowSpan;\n }\n\n if (span > 1) {\n if (!spannedCells[row.id]) spannedCells[row.id] = {};\n spannedCells[row.id][colDef.field] = span;\n\n for (let k = 1; k < span; k++) {\n const nextIndex = index + k;\n if (nextIndex < rows.length && rows[nextIndex]) {\n const nextRow = rows[nextIndex];\n if (!hiddenCells[nextRow.id]) hiddenCells[nextRow.id] = {};\n hiddenCells[nextRow.id][colDef.field] = true;\n\n if (!hiddenCellOriginMap[nextIndex]) hiddenCellOriginMap[nextIndex] = {};\n hiddenCellOriginMap[nextIndex][colDef.field] = index;\n }\n }\n }\n }\n });\n\n setRowSpanningState({\n caches: { spannedCells, hiddenCells, hiddenCellOriginMap },\n processedRange: { firstRowIndex: 0, lastRowIndex: rows.length }\n });\n }, [rows, columns, columnWidths]);\n\n const getSpannedCells = useCallback(() => rowSpanningState.caches.spannedCells, [rowSpanningState]);\n const getHiddenCells = useCallback(() => rowSpanningState.caches.hiddenCells, [rowSpanningState]);\n const getHiddenCellOriginMap = useCallback(() => rowSpanningState.caches.hiddenCellOriginMap, [rowSpanningState]);\n\n return {\n\n colspanMap,\n resetColSpan,\n getCellColSpanInfo,\n calculateColSpan,\n\n rowSpanningState,\n calculateRowSpan,\n resetRowSpan,\n getSpannedCells,\n getHiddenCells,\n getHiddenCellOriginMap\n };\n}\n\nfunction setCellColSpanInfo(\n map: ColspanMap,\n rowId: GridRowId,\n field: string,\n info: CellColSpanInfo\n) {\n let columnInfo = map.get(rowId);\n if (!columnInfo) {\n columnInfo = {};\n map.set(rowId, columnInfo);\n }\n columnInfo[field] = info;\n}\n","import { useEffect, useRef, useCallback } from 'react';\nimport { \n GridDataSource, \n GridRowModel, \n GridSortItem, \n GridFilterModel, \n GridPaginationModel,\n GridGetRowsParams,\n GridAggregationModel,\n GridAggregationResult,\n} from '../../types';\n\ninterface UseGridDataSourceParams<R extends GridRowModel> {\n dataSource?: GridDataSource<R>;\n sortModel: GridSortItem[];\n filterModel: GridFilterModel;\n paginationModel: GridPaginationModel;\n paginationMode?: 'client' | 'server' | 'infinite';\n sortingMode?: 'client' | 'server';\n filterMode?: 'client' | 'server';\n aggregationModel?: GridAggregationModel;\n setRows: (rows: R[] | ((prev: R[]) => R[]), preserveRowCount?: boolean) => void;\n setRowCount: (count: number) => void;\n setDataSourceLoading: (loading: boolean) => void;\n setDataSourceError: (error: unknown) => void;\n onAggregationResults?: (results: GridAggregationResult) => void;\n}\n\nexport function useGridDataSource<R extends GridRowModel>(params: UseGridDataSourceParams<R>) {\n const {\n dataSource,\n sortModel,\n filterModel,\n paginationModel,\n paginationMode,\n sortingMode,\n filterMode,\n aggregationModel,\n setRows,\n setRowCount,\n setDataSourceLoading,\n setDataSourceError,\n onAggregationResults,\n } = params;\n\n const prevParamsRef = useRef<{\n sortModel: GridSortItem[];\n filterModel: GridFilterModel;\n page: number;\n pageSize: number;\n } | null>(null);\n\n const activeRequestRef = useRef<number>(0);\n\n const fetchRows = useCallback(async () => {\n if (!dataSource) return;\n\n const requestId = ++activeRequestRef.current;\n\n setDataSourceLoading(true);\n setDataSourceError(null);\n\n const startRow = paginationModel.page * paginationModel.pageSize;\n const endRow = startRow + paginationModel.pageSize;\n\n const requestParams: GridGetRowsParams = {\n startRow,\n endRow,\n sortModel,\n filterModel,\n groupKeys: [], \n aggregationModel,\n };\n\n try {\n const response = await dataSource.getRows(requestParams);\n\n if (requestId !== activeRequestRef.current) {\n return;\n }\n\n let shouldAppend = false;\n\n if (paginationMode === 'infinite') {\n const prev = prevParamsRef.current;\n if (prev) {\n\n const sortChanged = JSON.stringify(prev.sortModel) !== JSON.stringify(sortModel);\n const filterChanged = JSON.stringify(prev.filterModel) !== JSON.stringify(filterModel);\n const pageSizeChanged = prev.pageSize !== paginationModel.pageSize;\n\n if (!sortChanged && !filterChanged && !pageSizeChanged && paginationModel.page > prev.page) {\n shouldAppend = true;\n }\n }\n }\n\n if (shouldAppend) {\n setRows((prevRows) => [...prevRows, ...response.rows], true);\n } else {\n setRows(response.rows, true);\n }\n\n if (response.aggregationResults && onAggregationResults) {\n onAggregationResults(response.aggregationResults);\n }\n\n if (response.rowCount !== undefined) {\n setRowCount(response.rowCount);\n } else if (paginationMode === 'infinite') {\n // rowCount is not required for infinite scroll — the grid uses appendRows\n }\n\n prevParamsRef.current = {\n sortModel,\n filterModel,\n page: paginationModel.page,\n pageSize: paginationModel.pageSize\n };\n\n } catch (error) {\n if (requestId === activeRequestRef.current) {\n setDataSourceError(error);\n console.error('Data Source Error:', error);\n }\n } finally {\n if (requestId === activeRequestRef.current) {\n setDataSourceLoading(false);\n }\n }\n }, [\n dataSource, \n paginationModel.page, \n paginationModel.pageSize, \n sortModel, \n filterModel,\n paginationMode,\n aggregationModel,\n onAggregationResults,\n setRows,\n setRowCount,\n setDataSourceLoading,\n setDataSourceError\n ]);\n\n useEffect(() => {\n const isServerSide = paginationMode === 'server' || paginationMode === 'infinite' || sortingMode === 'server' || filterMode === 'server';\n\n if (dataSource && isServerSide) {\n const timer = setTimeout(() => {\n fetchRows();\n }, 300);\n return () => clearTimeout(timer);\n }\n }, [fetchRows, dataSource, paginationMode, sortingMode, filterMode]);\n\n const fetchChildren = useCallback(async (_parentId: string | number, groupKeys: string[]) => {\n if (!dataSource) return;\n\n setDataSourceLoading(true);\n try {\n const response = await dataSource.getRows({\n startRow: 0,\n endRow: -1, \n sortModel,\n filterModel,\n groupKeys\n });\n\n if (response.rows.length > 0) {\n setRows((prevRows) => {\n\n const existingIds = new Set(prevRows.map(r => r.id));\n const newRows = response.rows.filter(r => !existingIds.has(r.id));\n return [...prevRows, ...newRows];\n });\n }\n } catch (error) {\n setDataSourceError(error);\n console.error('Failed to fetch children:', error);\n } finally {\n setDataSourceLoading(false);\n }\n }, [dataSource, sortModel, filterModel, setRows, setDataSourceLoading, setDataSourceError]);\n\n return {\n fetchRows,\n fetchChildren\n };\n}\n","\nimport { useMemo } from 'react';\nimport type { GridColDef, GridRowModel } from '../../types';\nimport type { GridPivotModel, GridPivotAggFn } from '../../types';\n\nconst SEP_COL = '\u0000';\nconst SEP_KEY = '\u001f';\n\nfunction aggregate(values: number[], fn: GridPivotAggFn): number | null {\n const nums = values.filter((v) => v != null && !isNaN(v));\n if (nums.length === 0) return null;\n switch (fn) {\n case 'sum': return nums.reduce((a, b) => a + b, 0);\n case 'avg': return nums.reduce((a, b) => a + b, 0) / nums.length;\n case 'count': return nums.length;\n case 'min': return Math.min(...nums);\n case 'max': return Math.max(...nums);\n }\n}\n\nfunction makeKey(row: GridRowModel, fields: string[]): string {\n return fields.map((f) => String(row[f] ?? '')).join(SEP_COL);\n}\n\nfunction cellKey(ck: string, field: string, aggFn: string, hasColFields: boolean): string {\n return hasColFields ? `${ck}${SEP_KEY}${field}${SEP_KEY}${aggFn}` : `${field}${SEP_KEY}${aggFn}`;\n}\n\nexport interface UsePivotReturn {\n pivotRows: GridRowModel[];\n pivotColumns: GridColDef[];\n colKeys: string[];\n isValid: boolean;\n}\n\nexport function usePivot(\n rawRows: GridRowModel[],\n rawCols: GridColDef[],\n model: GridPivotModel,\n enabled: boolean,\n): UsePivotReturn {\n return useMemo<UsePivotReturn>(() => {\n const empty: UsePivotReturn = { pivotRows: [], pivotColumns: [], colKeys: [], isValid: false };\n\n if (!enabled) return empty;\n\n const { rowFields, columnFields, valueFields } = model;\n if (rowFields.length === 0 || valueFields.length === 0) return empty;\n\n const hasColFields = columnFields.length > 0;\n const colDefMap = new Map(rawCols.map((c) => [c.field, c]));\n\n const colKeySet = new Set<string>();\n for (const row of rawRows) {\n colKeySet.add(makeKey(row, columnFields));\n }\n const colKeys = Array.from(colKeySet).sort();\n\n const outerMap = new Map<string, {\n labelValues: Record<string, unknown>;\n bucket: Map<string, Map<string, number[]>>;\n }>();\n\n for (const row of rawRows) {\n const rk = makeKey(row, rowFields);\n if (!outerMap.has(rk)) {\n const labelValues: Record<string, unknown> = {};\n for (const f of rowFields) labelValues[f] = row[f];\n outerMap.set(rk, { labelValues, bucket: new Map() });\n }\n const entry = outerMap.get(rk)!;\n\n const ck = makeKey(row, columnFields);\n if (!entry.bucket.has(ck)) entry.bucket.set(ck, new Map());\n const colBucket = entry.bucket.get(ck)!;\n\n for (const vf of valueFields) {\n const raw = row[vf.field];\n if (!colBucket.has(vf.field)) colBucket.set(vf.field, []);\n if (raw != null && !isNaN(Number(raw))) colBucket.get(vf.field)!.push(Number(raw));\n }\n }\n\n let rowIndex = 0;\n const pivotRows: GridRowModel[] = [];\n\n for (const [, entry] of outerMap) {\n const pivotRow: GridRowModel = { id: rowIndex++, ...entry.labelValues };\n\n for (const ck of colKeys) {\n const colBucket = entry.bucket.get(ck);\n for (const vf of valueFields) {\n const ck_ = cellKey(ck, vf.field, vf.aggFn, hasColFields);\n const values = colBucket?.get(vf.field) ?? [];\n pivotRow[ck_] = values.length > 0 ? aggregate(values, vf.aggFn) : null;\n }\n }\n\n pivotRows.push(pivotRow);\n }\n\n // ── Grand Total row ───────────────────────────────────────────────────\n // avg/min/max must be recomputed from raw source data — summing\n // per-row averages or mins produces wrong numbers.\n const gtBuckets = new Map<string, number[]>();\n for (const row of rawRows) {\n const ck = makeKey(row, columnFields);\n for (const vf of valueFields) {\n if (vf.aggFn !== 'avg' && vf.aggFn !== 'min' && vf.aggFn !== 'max') continue;\n const bk = `${ck}${SEP_KEY}${vf.field}`;\n if (!gtBuckets.has(bk)) gtBuckets.set(bk, []);\n const raw = row[vf.field];\n if (raw != null && !isNaN(Number(raw))) gtBuckets.get(bk)!.push(Number(raw));\n }\n }\n\n const totalRow: GridRowModel = { id: '__pivot_grand_total__' };\n for (let i = 0; i < rowFields.length; i++) {\n totalRow[rowFields[i]] = i === 0 ? 'Grand Total' : '';\n }\n for (const ck of colKeys) {\n for (const vf of valueFields) {\n const ck_ = cellKey(ck, vf.field, vf.aggFn, hasColFields);\n\n const cellValues = pivotRows\n .map(r => r[ck_])\n .filter(v => v != null && !isNaN(Number(v)))\n .map(Number);\n\n if (cellValues.length === 0) { totalRow[ck_] = null; continue; }\n\n const bk = `${ck}${SEP_KEY}${vf.field}`;\n switch (vf.aggFn) {\n case 'sum':\n case 'count':\n totalRow[ck_] = cellValues.reduce((a, b) => a + b, 0);\n break;\n case 'avg': {\n const raw = gtBuckets.get(bk) ?? [];\n totalRow[ck_] = raw.length > 0 ? raw.reduce((a, b) => a + b, 0) / raw.length : null;\n break;\n }\n case 'min':\n totalRow[ck_] = Math.min(...(gtBuckets.get(bk) ?? cellValues));\n break;\n case 'max':\n totalRow[ck_] = Math.max(...(gtBuckets.get(bk) ?? cellValues));\n break;\n }\n }\n }\n pivotRows.push(totalRow);\n\n\n const pivotColumns: GridColDef[] = [];\n\n for (const f of rowFields) {\n const orig = colDefMap.get(f);\n pivotColumns.push({\n field: f,\n headerName: orig?.headerName ?? f,\n width: orig?.width as number ?? 140,\n sortable: true,\n });\n }\n\n for (const ck of colKeys) {\n const colLabel = hasColFields\n ? ck.split(SEP_COL).map((v, i) => {\n const def = colDefMap.get(columnFields[i]);\n return def?.headerName ? `${def.headerName}: ${v}` : v;\n }).join(' / ')\n : '';\n\n for (const vf of valueFields) {\n const orig = colDefMap.get(vf.field);\n const ck_ = cellKey(ck, vf.field, vf.aggFn, hasColFields);\n const labelBase = vf.headerName ?? orig?.headerName ?? vf.field;\n const headerName = colLabel\n ? `${colLabel} — ${labelBase} (${vf.aggFn})`\n : `${labelBase} (${vf.aggFn})`;\n\n pivotColumns.push({\n field: ck_,\n headerName,\n width: 140,\n type: 'number',\n align: 'right',\n headerAlign: 'right',\n sortable: true,\n valueFormatter: ({ value }) => {\n if (value == null) return '—';\n const n = Number(value);\n if (vf.aggFn === 'avg') return n.toFixed(2);\n if (vf.aggFn === 'count') return n.toLocaleString();\n if (orig?.valueFormatter) return orig.valueFormatter({ value, row: {} as GridRowModel, field: vf.field });\n return n.toLocaleString();\n },\n });\n }\n }\n\n return { pivotRows, pivotColumns, colKeys, isValid: true };\n }, [rawRows, rawCols, model, enabled]);\n}\n","import { useEffect, useCallback } from 'react';\nimport type { GridColDef, GridRowModel, GridRowId } from '../../types';\n\ninterface UseGridClipboardProps {\n /** The currently selected row IDs — must come from the live selection source (not state.selection which is stale). */\n selectedRowIds: Set<GridRowId>;\n columns: GridColDef[];\n getVisibleRows: () => GridRowModel[];\n getRowId: (row: GridRowModel) => GridRowId;\n}\n\nfunction copyTextSynchronous(text: string): boolean {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.style.cssText = 'position:fixed;top:-9999px;left:-9999px;opacity:0;';\n document.body.appendChild(textarea);\n textarea.focus();\n textarea.select();\n let success = false;\n try {\n success = document.execCommand('copy');\n } finally {\n document.body.removeChild(textarea);\n }\n return success;\n}\n\n/**\n * Writes text to clipboard.\n * Uses both execCommand (synchronous, needed for non-HTTPS or non-async-gesture environments)\n * and navigator.clipboard for modern browser support.\n */\nasync function writeToClipboard(text: string): Promise<void> {\n let fallbackSuccess = false;\n try {\n fallbackSuccess = copyTextSynchronous(text);\n } catch {\n // Ignore fallback errors\n }\n\n if (navigator.clipboard && typeof navigator.clipboard.writeText === 'function') {\n try {\n await navigator.clipboard.writeText(text);\n return;\n } catch (e) {\n if (fallbackSuccess) return;\n throw e;\n }\n } else if (!fallbackSuccess) {\n throw new Error('Clipboard API not available and fallback failed.');\n }\n}\n\n/**\n * Hook to handle clipboard operations.\n * Copies selected rows as Tab-Separated Values (TSV) on Ctrl+C / Cmd+C.\n * Also exposes `copySelectedRows` for programmatic use via apiRef.\n */\nexport function useGridClipboard(props: UseGridClipboardProps) {\n const { selectedRowIds, columns, getVisibleRows, getRowId } = props;\n\n const copySelectedRows = useCallback(async () => {\n\n if (selectedRowIds.size === 0) return;\n\n const visibleRows = getVisibleRows();\n const rowsToCopy = visibleRows.filter((row) => selectedRowIds.has(getRowId(row)));\n\n\n\n if (rowsToCopy.length === 0) return;\n\n // Exclude internal grid columns (checkbox, expand, reorder)\n const visibleColumns = columns.filter((col) => !col.field.startsWith('__'));\n\n // Header row\n const headerRow = visibleColumns\n .map((col) => col.headerName || col.field)\n .join('\\t');\n\n // Data rows\n const dataRows = rowsToCopy\n .map((row) =>\n visibleColumns\n .map((col) => {\n const value = row[col.field];\n if (col.valueFormatter) {\n return col.valueFormatter({ value, row, field: col.field });\n }\n return value ?? '';\n })\n .join('\\t')\n )\n .join('\\n');\n\n const fullContent = `${headerRow}\\n${dataRows}`;\n\n try {\n await writeToClipboard(fullContent);\n\n } catch (err) {\n console.error('[OpenGridX] Failed to copy to clipboard:', err);\n }\n }, [selectedRowIds, columns, getVisibleRows, getRowId]);\n\n // Keyboard shortcut: Ctrl+C / Cmd+C\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (!(event.ctrlKey || event.metaKey) || event.key !== 'c') return;\n\n // Don't intercept when user is typing in an input / editor\n const activeEl = document.activeElement as HTMLElement;\n const tag = activeEl?.tagName.toLowerCase();\n const type = (activeEl as HTMLInputElement)?.type;\n\n // Skip capturing Ctrl+C if we are genuinely inside a text input\n if (\n (tag === 'input' && type !== 'checkbox' && type !== 'radio') ||\n tag === 'textarea' ||\n tag === 'select'\n ) return;\n\n if (activeEl?.isContentEditable) return;\n\n copySelectedRows();\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [copySelectedRows]);\n\n return { copySelectedRows };\n}\n","import React from 'react';\nimport type { GridColDef, GridRowModel, GridRowId, GridListViewColDef, GridRenderCellParams } from '../../types';\n\nexport interface ListViewRowProps<R extends GridRowModel = GridRowModel> {\n row: R;\n rowIndex: number;\n listViewColumn: GridListViewColDef<R>;\n isSelected?: boolean;\n checkboxSelection?: boolean;\n rowHeight?: number;\n onRowClick?: (row: R) => void;\n onSelectionChange?: (rowId: GridRowId, isSelected: boolean) => void;\n}\n\nexport function ListViewRow<R extends GridRowModel = GridRowModel>({\n row,\n rowIndex,\n listViewColumn,\n isSelected = false,\n checkboxSelection = false,\n rowHeight,\n onRowClick,\n onSelectionChange,\n}: ListViewRowProps<R>) {\n const params: GridRenderCellParams<R> = {\n row,\n value: undefined,\n field: listViewColumn.field,\n colDef: { field: listViewColumn.field } as unknown as GridColDef<R>,\n rowIndex,\n colIndex: 0,\n };\n\n const handleCheckboxChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n e.stopPropagation();\n onSelectionChange?.(row.id, e.target.checked);\n };\n\n return (\n <div\n className={`ogx-list-view__row${isSelected ? ' ogx-list-view__row--selected' : ''}`}\n style={rowHeight ? { minHeight: rowHeight } : undefined}\n onClick={() => onRowClick?.(row)}\n role=\"row\"\n aria-rowindex={rowIndex + 2}\n aria-selected={isSelected}\n >\n {checkboxSelection && (\n <div className=\"ogx-list-view__checkbox\" onClick={(e) => e.stopPropagation()}>\n <input\n type=\"checkbox\"\n checked={isSelected}\n onChange={handleCheckboxChange}\n aria-label={`Select row ${row.id}`}\n />\n </div>\n )}\n <div className=\"ogx-list-view__cell\" role=\"gridcell\">\n {listViewColumn.renderCell(params)}\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { Pagination } from '../Pagination/Pagination';\nimport { ListViewRow } from '../ListView/ListViewRow';\nimport type {\n GridRowModel,\n GridRowId,\n GridRowParams,\n GridListViewColDef,\n GridPaginationModel,\n GridDataSource,\n GridLocaleText,\n} from '../../types';\n\nexport interface GridListViewProps<R extends GridRowModel> {\n ariaLabel?: string;\n allRenderableRows: R[];\n filteredRows: R[];\n pagination: boolean;\n effectivePaginationModel: GridPaginationModel;\n pageSizeOptions: number[];\n selectedRowIds: Set<GridRowId>;\n listViewColumn: GridListViewColDef<R>;\n noRowsLabel: string;\n rowHeight: number;\n checkboxSelection: boolean;\n paginationMode: 'client' | 'server' | 'infinite';\n dataSource?: GridDataSource<R>;\n serverRowCount: number;\n paginationSlot?: React.ComponentType<Record<string, unknown>>;\n paginationSlotProps?: Record<string, unknown>;\n localeText?: Pick<GridLocaleText, 'paginationRowsPerPage' | 'paginationOf' | 'paginationPage'>;\n onRowClick: (params: GridRowParams<R>) => void;\n onSelectionChange: (rowId: GridRowId, isSelected: boolean) => void;\n onPaginationModelChange: (model: GridPaginationModel) => void;\n}\n\nexport function GridListView<R extends GridRowModel>({\n ariaLabel,\n allRenderableRows,\n filteredRows,\n pagination,\n effectivePaginationModel,\n pageSizeOptions,\n selectedRowIds,\n listViewColumn,\n noRowsLabel,\n rowHeight,\n checkboxSelection,\n paginationMode,\n dataSource,\n serverRowCount,\n paginationSlot,\n paginationSlotProps,\n localeText,\n onRowClick,\n onSelectionChange,\n onPaginationModelChange,\n}: GridListViewProps<R>) {\n const PaginationComponent = paginationSlot || Pagination;\n\n const totalRowCount = (paginationMode === 'server' && dataSource)\n ? (serverRowCount || 0)\n : filteredRows.length;\n\n return (\n <div\n className=\"ogx-list-view\"\n role=\"grid\"\n aria-label={ariaLabel || 'Data grid list view'}\n aria-rowcount={allRenderableRows.length + 1}\n >\n <div className=\"ogx-list-view__toolbar\">\n <span>\n {filteredRows.length} {filteredRows.length === 1 ? 'item' : 'items'}\n {pagination ? ` · page ${effectivePaginationModel.page + 1} of ${Math.ceil(filteredRows.length / effectivePaginationModel.pageSize) || 1}` : ''}\n {selectedRowIds.size > 0 ? ` · ${selectedRowIds.size} selected` : ''}\n </span>\n </div>\n\n <div className=\"ogx-list-view__rows\">\n {allRenderableRows.length === 0 ? (\n <div className=\"ogx-list-view__empty\" aria-live=\"polite\" role=\"status\">\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <path d=\"M3 9h18M9 21V9\" />\n </svg>\n {noRowsLabel}\n </div>\n ) : (\n allRenderableRows.map((row, idx) => (\n <ListViewRow<R>\n key={row.id}\n row={row}\n rowIndex={idx}\n listViewColumn={listViewColumn}\n isSelected={selectedRowIds.has(row.id)}\n checkboxSelection={checkboxSelection}\n rowHeight={rowHeight}\n onRowClick={(r) => onRowClick({ row: r, id: r.id, rowIndex: idx })}\n onSelectionChange={onSelectionChange}\n />\n ))\n )}\n </div>\n\n {pagination && (\n <PaginationComponent\n page={effectivePaginationModel.page}\n pageSize={effectivePaginationModel.pageSize}\n rowCount={totalRowCount}\n pageSizeOptions={pageSizeOptions}\n onPageChange={(newPage: number) => onPaginationModelChange({ ...effectivePaginationModel, page: newPage })}\n onPageSizeChange={(newPageSize: number) => onPaginationModelChange({ ...effectivePaginationModel, pageSize: newPageSize, page: 0 })}\n localeText={localeText}\n {...paginationSlotProps}\n />\n )}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport type { GridRenderCellParams } from '../../types';\n\nexport interface GridEditInputCellProps extends GridRenderCellParams {\n onValueChange: (value: unknown) => void;\n onCommit: () => void;\n onCancel: () => void;\n}\n\n// ─── Text / String ────────────────────────────────────────────────────────────\nfunction TextEditor({ value, onValueChange, onCommit, onCancel }: GridEditInputCellProps) {\n const [local, setLocal] = useState(String(value ?? ''));\n const ref = useRef<HTMLInputElement>(null);\n useEffect(() => { ref.current?.focus(); ref.current?.select(); }, []);\n\n return (\n <input\n ref={ref}\n type=\"text\"\n className=\"ogx__edit-input\"\n value={local}\n onChange={e => { setLocal(e.target.value); onValueChange(e.target.value); }}\n onBlur={onCommit}\n onKeyDown={e => {\n if (e.key === 'Enter') { e.stopPropagation(); onCommit(); }\n if (e.key === 'Escape') { e.stopPropagation(); onCancel(); }\n }}\n />\n );\n}\n\n// ─── Number ───────────────────────────────────────────────────────────────────\nfunction NumberEditor({ value, onValueChange, onCommit, onCancel }: GridEditInputCellProps) {\n const [local, setLocal] = useState<string | number>(typeof value === 'number' ? value : '');\n const ref = useRef<HTMLInputElement>(null);\n useEffect(() => { ref.current?.focus(); ref.current?.select(); }, []);\n\n return (\n <input\n ref={ref}\n type=\"number\"\n className=\"ogx__edit-input ogx__edit-input--number\"\n value={local}\n onChange={e => {\n const v = e.target.value === '' ? '' : Number(e.target.value);\n setLocal(v);\n onValueChange(v === '' ? null : v);\n }}\n onBlur={onCommit}\n onKeyDown={e => {\n if (e.key === 'Enter') { e.stopPropagation(); onCommit(); }\n if (e.key === 'Escape') { e.stopPropagation(); onCancel(); }\n }}\n />\n );\n}\n\n// ─── Boolean ──────────────────────────────────────────────────────────────────\nfunction BooleanEditor({ value, onValueChange, onCommit, onCancel }: GridEditInputCellProps) {\n const ref = useRef<HTMLInputElement>(null);\n useEffect(() => { ref.current?.focus(); }, []);\n\n const handleChange = () => {\n const next = !value;\n onValueChange(next);\n // Commit immediately on toggle\n setTimeout(onCommit, 0);\n };\n\n return (\n <div className=\"ogx__edit-boolean\">\n <input\n ref={ref}\n type=\"checkbox\"\n className=\"ogx__edit-checkbox\"\n checked={!!value}\n onChange={handleChange}\n onKeyDown={e => {\n if (e.key === 'Escape') { e.stopPropagation(); onCancel(); }\n }}\n />\n </div>\n );\n}\n\n// ─── SingleSelect / Enum ──────────────────────────────────────────────────────\nfunction SelectEditor({ value, colDef, onValueChange, onCommit, onCancel }: GridEditInputCellProps) {\n const ref = useRef<HTMLSelectElement>(null);\n useEffect(() => { ref.current?.focus(); }, []);\n\n const options = colDef.valueOptions ?? [];\n\n return (\n <select\n ref={ref}\n className=\"ogx__edit-select\"\n value={String(value ?? '')}\n onChange={e => { onValueChange(e.target.value); }}\n onBlur={onCommit}\n onKeyDown={e => {\n if (e.key === 'Enter') { e.stopPropagation(); onCommit(); }\n if (e.key === 'Escape') { e.stopPropagation(); onCancel(); }\n }}\n >\n {options.map(opt => {\n const v = typeof opt === 'object' ? opt.value : opt;\n const l = typeof opt === 'object' ? opt.label : String(opt);\n return <option key={String(v)} value={String(v)}>{l}</option>;\n })}\n </select>\n );\n}\n\n// ─── Date ─────────────────────────────────────────────────────────────────────\nfunction DateEditor({ value, onValueChange, onCommit, onCancel }: GridEditInputCellProps) {\n const [local, setLocal] = useState<string>(typeof value === 'string' ? value : String(value ?? ''));\n const ref = useRef<HTMLInputElement>(null);\n useEffect(() => { ref.current?.focus(); }, []);\n\n return (\n <input\n ref={ref}\n type=\"date\"\n className=\"ogx__edit-input\"\n value={local}\n onChange={e => { setLocal(e.target.value); onValueChange(e.target.value); }}\n onBlur={onCommit}\n onKeyDown={e => {\n if (e.key === 'Enter') { e.stopPropagation(); onCommit(); }\n if (e.key === 'Escape') { e.stopPropagation(); onCancel(); }\n }}\n />\n );\n}\n\n// ─── Router ───────────────────────────────────────────────────────────────────\nexport function GridEditInputCell(props: GridEditInputCellProps) {\n const { colDef } = props;\n\n switch (colDef.type) {\n case 'number':\n return <div className=\"ogx__edit-cell\"><NumberEditor {...props} /></div>;\n case 'boolean':\n return <div className=\"ogx__edit-cell\"><BooleanEditor {...props} /></div>;\n case 'singleSelect':\n return <div className=\"ogx__edit-cell\"><SelectEditor {...props} /></div>;\n case 'date':\n return <div className=\"ogx__edit-cell\"><DateEditor {...props} /></div>;\n default:\n return <div className=\"ogx__edit-cell\"><TextEditor {...props} /></div>;\n }\n}\n","import React from 'react';\n\n// Must live at module scope (not inline) so React sees a stable component type.\n// Calling renderFn() here puts the throw one level BELOW CellErrorBoundary,\n// which is required — a component cannot catch errors thrown in its own render().\nfunction CellRenderTarget({ renderFn }: { renderFn: () => React.ReactNode }) {\n return <>{renderFn()}</>;\n}\n\ninterface CellErrorBoundaryProps {\n renderFn: () => React.ReactNode;\n field: string;\n resetKey?: unknown;\n}\n\ninterface CellErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n resetKey?: unknown;\n}\n\nexport class CellErrorBoundary extends React.Component<CellErrorBoundaryProps, CellErrorBoundaryState> {\n constructor(props: CellErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null, resetKey: props.resetKey };\n }\n\n static getDerivedStateFromProps(\n props: CellErrorBoundaryProps,\n state: CellErrorBoundaryState\n ): Partial<CellErrorBoundaryState> | null {\n if (state.hasError && props.resetKey !== state.resetKey) {\n return { hasError: false, error: null, resetKey: props.resetKey };\n }\n if (props.resetKey !== state.resetKey) {\n return { resetKey: props.resetKey };\n }\n return null;\n }\n\n static getDerivedStateFromError(error: Error): Partial<CellErrorBoundaryState> {\n return { hasError: true, error };\n }\n\n override componentDidCatch(error: Error, info: React.ErrorInfo) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(`[CellErrorBoundary] field=\"${this.props.field}\"`, error, info.componentStack);\n }\n }\n\n override render() {\n if (this.state.hasError) {\n return (\n <div\n className=\"ogx__cell-error\"\n role=\"status\"\n aria-label={`Error in cell: ${this.props.field}`}\n title={this.state.error?.message ?? 'Render error'}\n >\n ⚠\n </div>\n );\n }\n return <CellRenderTarget renderFn={this.props.renderFn} />;\n }\n}\n","\nimport React from 'react';\nimport type { GridColDef, GridRowModel, GridPinnedPosition, GridCellParams, GridRowMeta } from '../../types';\nimport type { CellColSpanInfo } from '../../hooks/features/useGridSpanning';\n\nimport { GridEditInputCell } from './GridEditInputCell';\nimport { CellErrorBoundary } from './CellErrorBoundary';\n\nexport interface CellProps<R extends GridRowModel = GridRowModel> {\n onCellClick?: (params: GridCellParams<R>) => void;\n onCellEditStart?: (field: string, value: unknown) => void;\n onCellValueChange?: (field: string, newValue: unknown) => void;\n value: unknown;\n row: R;\n colDef: GridColDef<R>;\n rowIndex: number;\n colIndex: number;\n isSelected?: boolean;\n onClick?: (event: React.MouseEvent) => void;\n width?: number;\n pinnedPosition?: GridPinnedPosition | null;\n pinnedOffset?: number;\n\n isFocused?: boolean;\n isFocusVisible?: boolean;\n\n isEditable?: boolean;\n isEditing?: boolean;\n onEditStart?: () => void;\n onEditStop?: (cancel?: boolean) => void;\n onValueChange?: (newValue: unknown) => void;\n\n colSpanInfo?: CellColSpanInfo;\n rowSpan?: number;\n isHiddenByRowSpan?: boolean;\n rowMeta?: GridRowMeta;\n}\n\nfunction CellImpl<R extends GridRowModel = GridRowModel>(props: CellProps<R>) {\n const {\n onCellClick,\n onCellEditStart,\n onCellValueChange,\n value,\n row,\n colDef,\n rowIndex,\n colIndex,\n isSelected,\n onClick,\n width,\n pinnedPosition,\n pinnedOffset,\n isFocused,\n isFocusVisible,\n isEditable,\n isEditing,\n onEditStart,\n onEditStop,\n onValueChange,\n\n colSpanInfo,\n rowSpan: rowSpanProp,\n isHiddenByRowSpan,\n rowMeta\n } = props;\n\n // All hooks must come before any early returns (Rules of Hooks)\n const handleValueChange = React.useCallback((newValue: unknown) => {\n if (onCellValueChange) {\n onCellValueChange(colDef.field, newValue);\n } else {\n onValueChange?.(newValue);\n }\n }, [onCellValueChange, onValueChange, colDef.field]);\n\n const formattedValue = React.useMemo(() => {\n if (colDef.valueFormatter) {\n return colDef.valueFormatter({\n value,\n row,\n field: colDef.field\n });\n }\n\n if (value === null || value === undefined) {\n return '';\n }\n\n return String(value);\n }, [value, row, colDef]);\n\n const resolvedCellClassName = React.useMemo(() => {\n if (!colDef.cellClassName) return '';\n if (typeof colDef.cellClassName === 'function') {\n return colDef.cellClassName({ value, row, field: colDef.field, colDef, rowIndex, colIndex }) || '';\n }\n return colDef.cellClassName;\n }, [colDef, value, row, rowIndex, colIndex]);\n\n const cellRef = React.useRef<HTMLDivElement>(null);\n\n React.useLayoutEffect(() => {\n if (isFocused && cellRef.current) {\n cellRef.current.focus({ preventScroll: true });\n }\n }, [isFocused]);\n\n if (colSpanInfo?.spannedByColSpan) {\n return null;\n }\n\n if (isHiddenByRowSpan) {\n return (\n <div\n className=\"ogx__cell ogx__cell--hidden\"\n style={{ width: width ?? colDef.width ?? 100 }}\n role=\"presentation\"\n data-field={colDef.field}\n data-colindex={colIndex}\n />\n );\n }\n\n const handleClick = (e: React.MouseEvent) => {\n if (onCellClick) {\n onCellClick({\n row,\n field: colDef.field,\n value,\n colDef,\n rowIndex,\n colIndex\n });\n }\n onClick?.(e);\n };\n\n const handleDoubleClick = (e: React.MouseEvent) => {\n if (isEditable && (onEditStart || onCellEditStart)) {\n e.stopPropagation();\n if (onCellEditStart) {\n onCellEditStart(colDef.field, value);\n } else {\n onEditStart?.();\n }\n }\n };\n\n const isPinned = pinnedPosition !== null && pinnedPosition !== undefined;\n\n const classNames = [\n 'ogx__cell',\n `ogx__cell--align-${colDef.align || 'left'}`,\n isSelected && 'ogx__cell--selected',\n isFocused && 'ogx__cell--focused',\n (isFocused && isFocusVisible) && 'ogx__cell--focus-visible',\n colDef.type && `ogx__cell--type-${colDef.type}`,\n isPinned && 'ogx__cell--pinned',\n isPinned && `ogx__cell--pinned-${pinnedPosition}`,\n isEditing && 'ogx__cell--editing',\n (rowSpanProp && rowSpanProp > 1) && 'ogx__cell--spanned',\n resolvedCellClassName\n ].filter(Boolean).join(' ');\n\n const colSpan = colSpanInfo?.cellProps?.colSpan || 1;\n const rowSpan = rowSpanProp || 1;\n const cellWidth = colSpanInfo?.cellProps?.width ?? width ?? colDef.width ?? 100;\n\n const style: React.CSSProperties = {\n width: 'var(--width)',\n '--width': typeof cellWidth === 'number' ? `${cellWidth}px` : cellWidth,\n flexGrow: colDef.flex ?? 0,\n flexShrink: 0,\n flexBasis: colDef.flex ? 'auto' : 'auto',\n boxSizing: 'border-box',\n minWidth: colDef.minWidth,\n maxWidth: colDef.maxWidth,\n position: isPinned ? 'sticky' : undefined,\n zIndex: colDef.zIndex ?? (isPinned ? 3 : undefined),\n padding: isEditing ? 0 : undefined\n } as React.CSSProperties;\n\n if (rowSpan > 1) {\n style.height = `calc(var(--height) * ${rowSpan} - var(--border-width, 1px))`;\n style.zIndex = 10;\n if (isPinned) {\n style.zIndex = 40;\n }\n }\n\n if (isPinned && pinnedOffset !== undefined) {\n if (pinnedPosition === 'left') {\n style.left = pinnedOffset;\n } else {\n style.right = pinnedOffset;\n }\n }\n\n return (\n <div\n ref={cellRef}\n className={classNames}\n style={style}\n onClick={handleClick}\n onDoubleClick={handleDoubleClick}\n role=\"gridcell\"\n aria-colindex={colIndex + 1}\n aria-readonly={!isEditable || undefined}\n tabIndex={-1}\n data-field={colDef.field}\n data-colindex={colIndex}\n {...(colSpan > 1 ? { 'aria-colspan': colSpan } : {})}\n {...(rowSpan > 1 ? { 'aria-rowspan': rowSpan } : {})}\n >\n <div className=\"ogx__cell-content\">\n {isEditing && (onCellValueChange || onValueChange) && onEditStop ? (\n colDef.renderEditCell ? (\n colDef.renderEditCell({\n value,\n row,\n field: colDef.field,\n colDef,\n rowIndex,\n colIndex,\n rowMeta,\n })\n ) : (\n <GridEditInputCell\n value={value}\n row={row}\n field={colDef.field}\n colDef={colDef as unknown as GridColDef}\n rowIndex={rowIndex}\n colIndex={colIndex}\n onValueChange={handleValueChange}\n onCommit={() => onEditStop()}\n onCancel={() => onEditStop(true)}\n />\n )\n ) : colDef.renderCell ? (\n <CellErrorBoundary\n field={colDef.field}\n resetKey={row}\n renderFn={() => colDef.renderCell!({\n value,\n row,\n field: colDef.field,\n colDef,\n rowIndex,\n colIndex,\n rowMeta,\n })}\n />\n ) : (\n formattedValue\n )}\n </div>\n </div>\n );\n}\n\nexport const Cell = React.memo(CellImpl) as typeof CellImpl;\n","import React from 'react';\n\nexport type DragHandleIconProps = React.ButtonHTMLAttributes<HTMLButtonElement>;\n\nexport const DragHandleIcon: React.FC<DragHandleIconProps> = ({ className = '', ...props }) => {\n return (\n <button\n type=\"button\"\n className={`ogx-drag-handle ${className}`}\n aria-label=\"Drag to reorder row\"\n {...props}\n >\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M11 18c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2zm-2-8c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm6 4c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\" />\n </svg>\n </button>\n );\n};\n","\nimport React from 'react';\nimport type { GridRowModel, GridRowId, GridDetailPanelHeight } from '../../types';\n\n\nexport interface DetailPanelProps<R extends GridRowModel = GridRowModel> {\n row: R;\n rowId: GridRowId;\n rowIndex: number;\n content: React.ReactNode;\n height: GridDetailPanelHeight;\n isExpanded: boolean;\n}\n\nexport function DetailPanel<R extends GridRowModel = GridRowModel>(props: DetailPanelProps<R>) {\n const { content, height, isExpanded } = props;\n\n if (!isExpanded) {\n return null;\n }\n\n const style: React.CSSProperties = {\n height: height === 'auto' ? 'auto' : `${height}px`,\n overflow: height === 'auto' ? 'visible' : 'auto'\n };\n\n return (\n <div className=\"ogx__detail-panel\" style={style}>\n <div className=\"ogx__detail-panel-content\">\n {content}\n </div>\n </div>\n );\n}\n","\nimport React, { useId } from 'react';\nimport { Cell } from '../Cell/Cell';\nimport { Checkbox } from '../ui/Checkbox';\nimport { ExpandIcon } from '../ui/ExpandIcon';\nimport { DragHandleIcon } from '../ui/DragHandleIcon';\nimport { DetailPanel } from '../DetailPanel/DetailPanel';\nimport type { GridRowModel, GridColDef, GridRowId, GridColumnPinning, GridRowPinning, GridRowParams, GridCellParams, GridDetailPanelHeight, GridRowMeta } from '../../types';\nimport type { CellColSpanInfo, RowSpanningCaches } from '../../hooks/features/useGridSpanning';\nimport { isColumnPinned, calculatePinnedPositions, isRowPinned } from '../../utils/pinning';\n\n\nexport interface RowProps<R extends GridRowModel = GridRowModel> {\n row: R;\n columns: GridColDef<R>[];\n rowIndex: number;\n isSelected?: boolean;\n checkboxSelection?: boolean;\n onRowClick?: (params: GridRowParams<R>) => void;\n onCellClick?: (params: GridCellParams<R>) => void;\n onSelectionChange?: (rowId: GridRowId, isSelected: boolean) => void;\n columnWidths?: Record<string, number>;\n pinnedColumns?: GridColumnPinning;\n pinnedRows?: GridRowPinning;\n\n hasDetailPanel?: boolean;\n isDetailPanelExpanded?: boolean;\n onDetailPanelToggle?: (rowId: GridRowId) => void;\n detailPanelContent?: React.ReactNode;\n detailPanelHeight?: GridDetailPanelHeight;\n\n pinCheckboxColumn?: boolean;\n pinExpandColumn?: boolean;\n\n rowReordering?: boolean;\n onDragStart?: (id: GridRowId) => (event: React.DragEvent) => void;\n onDragOver?: (id: GridRowId) => (event: React.DragEvent) => void;\n onDragEnd?: () => void;\n onDrop?: (targetId: GridRowId) => (event: React.DragEvent) => void;\n isDragging?: boolean;\n isDragOver?: boolean;\n\n editingCell?: { id: GridRowId; field: string; value: unknown; } | null;\n onEditStart?: (params: { id: GridRowId, field: string, value: unknown }) => void;\n onEditStop?: (params?: { cancel?: boolean }) => void;\n onEditCellValueChange?: (params: { id: GridRowId, field: string, value: unknown }) => void;\n\n focusedCellField?: string | null;\n isFocusVisible?: boolean;\n\n colspanMap?: Map<GridRowId, Record<string, CellColSpanInfo>>;\n rowSpanningCaches?: RowSpanningCaches;\n rowHeight?: number;\n rowMeta?: GridRowMeta;\n}\n\nexport function Row<R extends GridRowModel = GridRowModel>(props: RowProps<R>) {\n const {\n row,\n columns,\n rowIndex,\n isSelected = false,\n checkboxSelection = false,\n onRowClick,\n onCellClick,\n onSelectionChange,\n columnWidths = {},\n pinnedColumns,\n pinnedRows,\n hasDetailPanel = false,\n isDetailPanelExpanded = false,\n onDetailPanelToggle,\n detailPanelContent,\n detailPanelHeight = 200,\n pinCheckboxColumn = true,\n pinExpandColumn = true,\n rowReordering = false,\n onDragStart,\n onDragOver,\n onDragEnd,\n onDrop,\n isDragging,\n isDragOver,\n\n editingCell,\n onEditStart,\n onEditStop,\n onEditCellValueChange,\n\n focusedCellField,\n isFocusVisible,\n\n colspanMap,\n rowSpanningCaches,\n rowHeight = 52,\n rowMeta\n } = props;\n\n const checkboxId = useId();\n const expandCellRef = React.useRef<HTMLDivElement>(null);\n const checkboxCellRef = React.useRef<HTMLDivElement>(null);\n\n // All hooks must come before any early returns (Rules of Hooks)\n React.useLayoutEffect(() => {\n if (focusedCellField === '__expand_col__' && expandCellRef.current) {\n expandCellRef.current.focus({ preventScroll: true });\n }\n if (focusedCellField === '__checkbox_col__' && checkboxCellRef.current) {\n checkboxCellRef.current.focus({ preventScroll: true });\n }\n }, [focusedCellField]);\n\n const pinnedPositions = React.useMemo(() => {\n return calculatePinnedPositions(\n columns,\n columnWidths,\n pinnedColumns,\n checkboxSelection,\n pinCheckboxColumn,\n hasDetailPanel,\n pinExpandColumn,\n rowReordering\n );\n }, [columns, columnWidths, pinnedColumns, checkboxSelection, pinCheckboxColumn, hasDetailPanel, pinExpandColumn, rowReordering]);\n\n const isGroupRow = rowMeta?.hasChildren === true;\n\n const handleCellEditStart = React.useCallback((field: string, value: unknown) => {\n if (!isGroupRow) {\n onEditStart?.({ id: row.id, field, value });\n }\n }, [isGroupRow, row.id, onEditStart]);\n\n const handleCellValueChange = React.useCallback((field: string, newValue: unknown) => {\n onEditCellValueChange?.({ id: row.id, field, value: newValue });\n }, [onEditCellValueChange, row.id]);\n\n const handleEditStopWrapper = React.useCallback((cancel?: boolean) => {\n onEditStop?.({ cancel });\n }, [onEditStop]);\n\n // ── Skeleton row (shown during infinite-scroll fetch) ─────────────────────\n if (row._isSkeleton) {\n // Render shimmer placeholders — one per visible column, matching row height\n const cellCount = Math.max(columns.length, 5);\n return (\n <div\n className=\"ogx__row ogx__row--skeleton\"\n role=\"row\"\n aria-hidden=\"true\"\n style={{ height: rowHeight, minHeight: rowHeight }}\n >\n {Array.from({ length: cellCount }).map((_, i) => (\n <div key={i} className=\"ogx__skeleton-cell\">\n <div className=\"ogx__skeleton-bar\" />\n </div>\n ))}\n </div>\n );\n }\n\n const handleRowClick = (event: React.MouseEvent) => {\n\n if ((event.target as HTMLElement).closest('.ogx-checkbox-wrapper, .ogx-expand-icon, .ogx-drag-handle, .ogx__edit-cell')) {\n return;\n }\n onRowClick?.({ row, id: row.id, rowIndex });\n };\n\n const handleCheckboxChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n event.stopPropagation();\n onSelectionChange?.(row.id, event.target.checked);\n };\n\n const handleDetailPanelToggle = (event: React.MouseEvent) => {\n event.stopPropagation();\n onDetailPanelToggle?.(row.id);\n };\n\n const rowPinnedPosition = isRowPinned(row.id, pinnedRows);\n const isRowPinnedTop = rowPinnedPosition === 'top';\n const isRowPinnedBottom = rowPinnedPosition === 'bottom';\n\n const classNames = [\n 'ogx__row',\n isSelected && 'ogx__row--selected',\n rowIndex % 2 === 0 && 'ogx__row--even',\n rowIndex % 2 === 1 && 'ogx__row--odd',\n isRowPinnedTop && 'ogx__row--pinned-top',\n isRowPinnedBottom && 'ogx__row--pinned-bottom',\n isDragging && 'ogx__row--dragging',\n isDragOver && 'ogx__row--drag-over',\n isGroupRow && 'ogx__row--group'\n ].filter(Boolean).join(' ');\n\n return (\n <>\n <div\n className={classNames}\n onClick={handleRowClick}\n role=\"row\"\n aria-rowindex={rowIndex + 1}\n aria-selected={isSelected}\n data-rowindex={rowIndex}\n onDragOver={onDragOver ? onDragOver(row.id) : undefined}\n onDrop={onDrop ? onDrop(row.id) : undefined}\n style={{\n maxHeight: `${rowHeight}px`,\n minHeight: `${rowHeight}px`,\n '--height': `${rowHeight}px`,\n '--border-width': '1px'\n } as React.CSSProperties}\n >\n { }\n {rowReordering && (\n <div\n className=\"ogx__cell ogx__cell--drag-handle\"\n role=\"gridcell\"\n aria-label=\"Drag to reorder row\"\n style={{\n position: 'sticky',\n left: 0,\n zIndex: 4\n }}\n draggable={true}\n onDragStart={onDragStart ? onDragStart(row.id) : undefined}\n onDragEnd={onDragEnd}\n onClick={(e) => e.stopPropagation()}\n >\n <DragHandleIcon />\n </div>\n )}\n\n { }\n {hasDetailPanel && (\n <div\n className={`ogx__cell ogx__cell--expand ${pinExpandColumn ? 'ogx__cell--pinned-left' : ''\n } ${focusedCellField === '__expand_col__' ? 'ogx__cell--focused' : ''} ${(focusedCellField === '__expand_col__' && isFocusVisible) ? 'ogx__cell--focus-visible' : ''\n }`}\n role=\"gridcell\"\n aria-label={isDetailPanelExpanded ? 'Collapse row details' : 'Expand row details'}\n aria-expanded={isDetailPanelExpanded}\n style={{\n position: pinExpandColumn ? 'sticky' : undefined,\n left: pinExpandColumn ? (rowReordering ? 48 : 0) : undefined,\n zIndex: pinExpandColumn ? 5 : undefined\n }}\n ref={expandCellRef}\n tabIndex={-1}\n onClick={(e) => {\n e.stopPropagation();\n onCellClick?.({\n row,\n field: '__expand_col__',\n value: isDetailPanelExpanded,\n colDef: { field: '__expand_col__', width: 48 } as unknown as GridColDef<R>,\n rowIndex,\n colIndex: -1\n });\n }}\n >\n <ExpandIcon\n isExpanded={isDetailPanelExpanded}\n onClick={handleDetailPanelToggle}\n variant=\"plus-minus\"\n />\n </div>\n )}\n\n { }\n {checkboxSelection && (\n <div\n className={`ogx__cell ogx__cell--checkbox ${pinCheckboxColumn ? 'ogx__cell--pinned-left' : ''\n } ${focusedCellField === '__checkbox_col__' ? 'ogx__cell--focused' : ''} ${(focusedCellField === '__checkbox_col__' && isFocusVisible) ? 'ogx__cell--focus-visible' : ''\n }`}\n role=\"gridcell\"\n style={{\n position: pinCheckboxColumn ? 'sticky' : undefined,\n left: pinCheckboxColumn ? ((rowReordering ? 48 : 0) + (hasDetailPanel && pinExpandColumn ? 48 : 0)) : undefined,\n zIndex: pinCheckboxColumn ? 11 : undefined\n }}\n ref={checkboxCellRef}\n tabIndex={-1}\n onClick={(e) => {\n e.stopPropagation();\n onCellClick?.({\n row,\n field: '__checkbox_col__',\n value: isSelected,\n colDef: { field: '__checkbox_col__', width: 48 } as unknown as GridColDef<R>,\n rowIndex,\n colIndex: -1\n });\n }}\n >\n <Checkbox\n id={checkboxId}\n name={`ogx-select-row-${row.id}`}\n checked={isSelected}\n onChange={handleCheckboxChange}\n onClick={(e) => e.stopPropagation()}\n aria-label={isSelected ? `Deselect row ${row.id}` : `Select row ${row.id}`}\n tabIndex={-1}\n onMouseDown={(e) => e.preventDefault()}\n />\n </div>\n )}\n\n { }\n {columns.map((colDef, colIndex) => {\n if (colDef.isSpacer) {\n return (\n <div\n key={colDef.field}\n style={{ width: colDef.width, minWidth: colDef.width, flexShrink: 0 }}\n aria-hidden=\"true\"\n />\n );\n }\n const value = colDef.valueGetter\n ? colDef.valueGetter({ row, field: colDef.field, value: row[colDef.field] })\n : row[colDef.field];\n\n const effectiveWidth = columnWidths[colDef.field] ?? colDef.width;\n\n const pinnedPosition = isColumnPinned(colDef.field, pinnedColumns);\n const pinnedOffset = pinnedPosition ? pinnedPositions[colDef.field] : undefined;\n\n const isEditing = editingCell?.id === row.id && editingCell?.field === colDef.field;\n\n const cellValue = isEditing ? editingCell?.value : value;\n\n const colSpanInfo = colspanMap?.get(row.id)?.[colDef.field];\n const rowSpan = rowSpanningCaches?.spannedCells[row.id]?.[colDef.field];\n const isHiddenByRowSpan = rowSpanningCaches?.hiddenCells[row.id]?.[colDef.field] || false;\n\n return (\n <Cell\n key={colDef.field}\n value={cellValue}\n row={row}\n colDef={colDef}\n rowIndex={rowIndex}\n colIndex={colIndex}\n isSelected={isSelected}\n onCellClick={onCellClick}\n width={effectiveWidth}\n pinnedPosition={pinnedPosition}\n pinnedOffset={pinnedOffset}\n\n isFocused={focusedCellField === colDef.field}\n isFocusVisible={isFocusVisible}\n\n isEditable={colDef.editable}\n isEditing={isEditing}\n onCellEditStart={handleCellEditStart}\n onEditStop={handleEditStopWrapper}\n onCellValueChange={handleCellValueChange}\n\n colSpanInfo={colSpanInfo}\n rowSpan={rowSpan}\n isHiddenByRowSpan={isHiddenByRowSpan}\n rowMeta={rowMeta}\n />\n );\n })}\n </div>\n\n { }\n {hasDetailPanel && (\n <DetailPanel\n row={row}\n rowId={row.id}\n rowIndex={rowIndex}\n content={detailPanelContent}\n height={detailPanelHeight}\n isExpanded={isDetailPanelExpanded}\n />\n )}\n </>\n );\n}\n","import React from 'react';\nimport { Row } from '../Row/Row';\nimport type {\n GridRowModel,\n GridRowId,\n GridColDef,\n GridRowParams,\n GridCellParams,\n GridColumnPinning,\n GridRowPinning,\n GridDetailPanelParams,\n GridDetailPanelHeight,\n GridRowMeta,\n} from '../../types';\nimport type { CellColSpanInfo, RowSpanningCaches } from '../../hooks/features/useGridSpanning';\n\nexport interface GridPinnedRowsProps<R extends GridRowModel> {\n rows: R[];\n position: 'top' | 'bottom';\n columns: GridColDef<R>[];\n selectedRowIds: Set<GridRowId>;\n checkboxSelection: boolean;\n onRowClick: (params: GridRowParams<R>) => void;\n onCellClick: (params: GridCellParams<R>) => void;\n onSelectionChange: (rowId: GridRowId, isSelected: boolean) => void;\n columnWidths: Record<string, number>;\n pinnedColumns: GridColumnPinning;\n pinnedRows?: GridRowPinning;\n hasDetailPanel: boolean;\n expandedRowIds: Set<GridRowId>;\n getDetailPanelContent?: (params: GridDetailPanelParams<R>) => React.ReactNode;\n getDetailPanelHeight?: (params: GridDetailPanelParams<R>) => GridDetailPanelHeight;\n onDetailPanelToggle: (rowId: GridRowId) => void;\n pinCheckboxColumn?: boolean;\n pinExpandColumn?: boolean;\n focusedCell: { id: GridRowId; field: string } | null;\n colspanMap?: Map<GridRowId, Record<string, CellColSpanInfo>>;\n rowSpanningCaches?: RowSpanningCaches;\n rowHeight: number;\n rowMetaMap: Map<GridRowId, GridRowMeta>;\n}\n\nexport function GridPinnedRows<R extends GridRowModel>({\n rows,\n position,\n columns,\n selectedRowIds,\n checkboxSelection,\n onRowClick,\n onCellClick,\n onSelectionChange,\n columnWidths,\n pinnedColumns,\n pinnedRows,\n hasDetailPanel,\n expandedRowIds,\n getDetailPanelContent,\n getDetailPanelHeight,\n onDetailPanelToggle,\n pinCheckboxColumn,\n pinExpandColumn,\n focusedCell,\n colspanMap,\n rowSpanningCaches,\n rowHeight,\n rowMetaMap,\n}: GridPinnedRowsProps<R>) {\n if (rows.length === 0) return null;\n\n return (\n <div className={`ogx__pinned-rows ogx__pinned-rows--${position}`} role=\"rowgroup\">\n {rows.map((row, index) => (\n <Row<R>\n key={row.id}\n row={row}\n columns={columns}\n rowIndex={index}\n isSelected={selectedRowIds.has(row.id)}\n checkboxSelection={checkboxSelection}\n onRowClick={onRowClick}\n onCellClick={onCellClick}\n onSelectionChange={onSelectionChange}\n columnWidths={columnWidths}\n pinnedColumns={pinnedColumns}\n pinnedRows={pinnedRows}\n hasDetailPanel={hasDetailPanel}\n isDetailPanelExpanded={expandedRowIds.has(row.id)}\n detailPanelContent={getDetailPanelContent ? getDetailPanelContent({ row, id: row.id, rowIndex: index }) : null}\n detailPanelHeight={getDetailPanelHeight?.({ row, id: row.id, rowIndex: index }) || 200}\n onDetailPanelToggle={onDetailPanelToggle}\n pinCheckboxColumn={pinCheckboxColumn}\n pinExpandColumn={pinExpandColumn}\n focusedCellField={focusedCell?.id === row.id ? focusedCell.field : null}\n colspanMap={colspanMap}\n rowSpanningCaches={rowSpanningCaches}\n rowHeight={rowHeight}\n rowMeta={rowMetaMap.get(row.id)}\n />\n ))}\n </div>\n );\n}\n","import React from 'react';\nimport type { GridColDef } from '../../types';\n\ninterface SkeletonColumn extends GridColDef {\n left?: number;\n right?: number;\n pinned?: 'left' | 'right';\n zIndex?: number;\n}\n\ninterface SkeletonRowProps {\n columns: SkeletonColumn[];\n rowHeight: number;\n checkboxSelection?: boolean;\n hasDetailPanel?: boolean;\n rowReordering?: boolean;\n}\n\nexport const SkeletonRow: React.FC<SkeletonRowProps> = ({\n columns,\n rowHeight,\n checkboxSelection = false,\n hasDetailPanel = false,\n rowReordering = false\n}) => {\n return (\n <div\n className=\"ogx__row ogx__skeleton-row\"\n style={{ height: rowHeight }}\n role=\"row\"\n >\n { }\n {checkboxSelection && (\n <div\n className=\"ogx__cell ogx__skeleton-cell\"\n style={{ width: 48, minWidth: 48 }}\n >\n <div className=\"ogx-skeleton-box\" style={{ width: 18, height: 18, borderRadius: 2 }} />\n </div>\n )}\n\n { }\n {hasDetailPanel && (\n <div\n className=\"ogx__cell ogx__skeleton-cell\"\n style={{ width: 48, minWidth: 48 }}\n >\n <div className=\"ogx-skeleton-box\" style={{ width: 18, height: 18, borderRadius: 2 }} />\n </div>\n )}\n\n { }\n {rowReordering && (\n <div\n className=\"ogx__cell ogx__skeleton-cell\"\n style={{ width: 48, minWidth: 48 }}\n >\n <div className=\"ogx-skeleton-box\" style={{ width: 18, height: 18, borderRadius: 2 }} />\n </div>\n )}\n\n { }\n {columns.map((col, index) => {\n const width = typeof col.width === 'number' ? col.width : 150;\n const skeletonWidth = Math.min(width * 0.7, width - 20);\n\n return (\n <div\n key={col.field || index}\n className=\"ogx__cell ogx__skeleton-cell\"\n style={{\n width,\n minWidth: col.minWidth,\n maxWidth: col.maxWidth,\n left: col.left,\n right: col.right,\n position: col.isSpacer ? 'relative' : (col.pinned ? 'sticky' : 'relative'),\n zIndex: col.zIndex\n }}\n >\n {!col.isSpacer && (\n <div\n className=\"ogx-skeleton-box\"\n style={{\n width: skeletonWidth,\n height: 16,\n borderRadius: 4\n }}\n />\n )}\n </div>\n );\n })}\n </div>\n );\n};\n","import React from 'react';\nimport { Row } from '../Row/Row';\nimport { SkeletonRow } from '../SkeletonRow';\nimport { isRowPinned } from '../../utils/pinning';\nimport type {\n GridRowModel,\n GridRowId,\n GridColDef,\n GridRowParams,\n GridCellParams,\n GridColumnPinning,\n GridRowPinning,\n GridDetailPanelParams,\n GridDetailPanelHeight,\n GridRowMeta,\n} from '../../types';\nimport type { GridVisibleRow } from '../../hooks/core/useGridVisibleRows';\nimport type { UseRowReorderReturn } from '../../hooks/useRowReorder';\nimport type { GridEditingState } from '../../hooks/features/useGridEditing';\nimport type { CellColSpanInfo, RowSpanningCaches } from '../../hooks/features/useGridSpanning';\n\ninterface RowEditingHandlers {\n editingCell: GridEditingState['editingCell'];\n startCellEdit: (params: { id: GridRowId; field: string; value: unknown }) => void;\n stopCellEdit: (params?: { cancel?: boolean }) => void;\n setEditCellValue: (params: { id: GridRowId; field: string; value: unknown }) => void;\n}\n\nexport interface GridVirtualRowsProps<R extends GridRowModel> {\n virtualContainerHeight: number;\n offsetTop: number;\n effectiveLoading: boolean;\n visibleRows: GridVisibleRow<R>[];\n baseColumns: GridColDef<R>[];\n virtualColumns: GridColDef<R>[];\n viewportWidth: number;\n checkboxSelection: boolean;\n hasDetailPanel: boolean;\n rowReordering: boolean;\n rowHeight: number;\n pinnedRows?: GridRowPinning;\n selectedRowIds: Set<GridRowId>;\n onRowClick: (params: GridRowParams<R>) => void;\n onCellClick: (params: GridCellParams<R>) => void;\n onSelectionChange: (rowId: GridRowId, isSelected: boolean) => void;\n columnWidths: Record<string, number>;\n pinnedColumns: GridColumnPinning;\n expandedRowIds: Set<GridRowId>;\n getDetailPanelContent?: (params: GridDetailPanelParams<R>) => React.ReactNode;\n getDetailPanelHeight?: (params: GridDetailPanelParams<R>) => GridDetailPanelHeight;\n onDetailPanelToggle: (rowId: GridRowId) => void;\n pinCheckboxColumn?: boolean;\n pinExpandColumn?: boolean;\n rowReorderHandlers: UseRowReorderReturn;\n editingHandlers: RowEditingHandlers;\n focusedCell: { id: GridRowId; field: string } | null;\n colspanMap?: Map<GridRowId, Record<string, CellColSpanInfo>>;\n rowSpanningCaches?: RowSpanningCaches;\n paginationMode: 'client' | 'server' | 'infinite';\n dataSourceLoading: boolean;\n sortedUnpinnedRowCount: number;\n infiniteScrollSkeletonCount: number;\n unpinnedRowsLength: number;\n rowMetaMap: Map<GridRowId, GridRowMeta>;\n}\n\nexport function GridVirtualRows<R extends GridRowModel>({\n virtualContainerHeight,\n offsetTop,\n effectiveLoading,\n visibleRows,\n baseColumns,\n virtualColumns,\n viewportWidth,\n checkboxSelection,\n hasDetailPanel,\n rowReordering,\n rowHeight,\n pinnedRows,\n selectedRowIds,\n onRowClick,\n onCellClick,\n onSelectionChange,\n columnWidths,\n pinnedColumns,\n expandedRowIds,\n getDetailPanelContent,\n getDetailPanelHeight,\n onDetailPanelToggle,\n pinCheckboxColumn,\n pinExpandColumn,\n rowReorderHandlers,\n editingHandlers,\n focusedCell,\n colspanMap,\n rowSpanningCaches,\n paginationMode,\n dataSourceLoading,\n sortedUnpinnedRowCount,\n infiniteScrollSkeletonCount,\n unpinnedRowsLength,\n rowMetaMap,\n}: GridVirtualRowsProps<R>) {\n const skeletonColumns: GridColDef<R>[] = baseColumns.length > 0\n ? baseColumns\n : (() => {\n const availableWidth = (viewportWidth || 1000) -\n (checkboxSelection ? 48 : 0) -\n (hasDetailPanel ? 48 : 0) -\n (rowReordering ? 48 : 0);\n const columnWidth = 150;\n const columnCount = Math.max(1, Math.ceil(availableWidth / columnWidth));\n return Array.from({ length: columnCount }, (_, i) => ({\n field: `placeholder_${i}`,\n headerName: '',\n width: columnWidth,\n })) as GridColDef<R>[];\n })();\n\n const centerRows = visibleRows\n .filter(({ row }) => !isRowPinned(row.id, pinnedRows))\n .filter((item, index, self) =>\n index === self.findIndex(t => t.row.id === item.row.id)\n );\n\n return (\n <div\n className=\"ogx__virtual-container\"\n style={{ height: `${virtualContainerHeight}px` }}\n role=\"presentation\"\n >\n <div\n className=\"ogx__rows\"\n style={{ transform: `translateY(${offsetTop}px)` }}\n role=\"rowgroup\"\n >\n {effectiveLoading && visibleRows.length === 0 ? (\n Array.from({ length: 10 }).map((_, index) => (\n <SkeletonRow\n key={`skeleton-${index}`}\n columns={skeletonColumns as unknown as GridColDef[]}\n rowHeight={rowHeight}\n checkboxSelection={checkboxSelection}\n hasDetailPanel={hasDetailPanel}\n rowReordering={rowReordering}\n />\n ))\n ) : (\n centerRows.map(({ row, rowIndex: actualIndex }) => (\n <Row<R>\n key={row.id}\n row={row}\n columns={virtualColumns}\n rowIndex={actualIndex}\n isSelected={selectedRowIds.has(row.id)}\n checkboxSelection={checkboxSelection}\n onRowClick={onRowClick}\n onCellClick={onCellClick}\n onSelectionChange={onSelectionChange}\n columnWidths={columnWidths}\n pinnedColumns={pinnedColumns}\n pinnedRows={pinnedRows}\n hasDetailPanel={hasDetailPanel}\n isDetailPanelExpanded={expandedRowIds.has(row.id)}\n detailPanelContent={getDetailPanelContent ? getDetailPanelContent({ row, id: row.id, rowIndex: actualIndex }) : null}\n detailPanelHeight={getDetailPanelHeight?.({ row, id: row.id, rowIndex: actualIndex }) || 200}\n onDetailPanelToggle={onDetailPanelToggle}\n pinCheckboxColumn={pinCheckboxColumn}\n pinExpandColumn={pinExpandColumn}\n rowReordering={rowReordering}\n onDragStart={rowReorderHandlers.onDragStart}\n onDragOver={rowReorderHandlers.onDragOver}\n onDragEnd={rowReorderHandlers.onDragEnd}\n onDrop={rowReorderHandlers.onDrop}\n isDragging={rowReorderHandlers.draggedRowId === row.id}\n isDragOver={rowReorderHandlers.dragOverRowId === row.id}\n editingCell={editingHandlers.editingCell}\n onEditStart={editingHandlers.startCellEdit}\n onEditStop={editingHandlers.stopCellEdit}\n onEditCellValueChange={editingHandlers.setEditCellValue}\n focusedCellField={focusedCell != null && focusedCell.id === row.id ? focusedCell.field : null}\n colspanMap={colspanMap}\n rowSpanningCaches={rowSpanningCaches}\n rowHeight={rowHeight}\n rowMeta={rowMetaMap.get(row.id)}\n />\n ))\n )}\n\n {paginationMode === 'infinite' && dataSourceLoading && sortedUnpinnedRowCount > 0 && (\n <div className=\"ogx__skeleton-group\">\n {Array.from({ length: infiniteScrollSkeletonCount }).map((_, i) => (\n <Row<R>\n key={`__skeleton_${i}__`}\n row={{ id: `__skeleton_${i}__`, _isSkeleton: true } as unknown as R}\n columns={virtualColumns}\n rowIndex={unpinnedRowsLength + i}\n rowHeight={rowHeight}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { useState, useMemo, useRef } from 'react';\nimport { Checkbox } from '../ui/Checkbox';\nimport type { GridColDef, GridRowModel } from '../../types';\n\n\nexport interface ColumnVisibilityPanelProps<R extends GridRowModel = GridRowModel> {\n columns: GridColDef<R>[];\n visibleColumns: Set<string>;\n onVisibilityChange: (field: string, isVisible: boolean) => void;\n onShowAll: () => void;\n onHideAll: () => void;\n onColumnReorder?: (fromField: string, toField: string) => void;\n onColumnOrderReset?: () => void;\n /** Show columns with `hideable: false` in the panel as disabled rows. Default: false. */\n showNonHideableColumns?: boolean;\n}\n\nfunction SearchIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n );\n}\n\nfunction DragHandleIcon() {\n return (\n <svg\n className=\"ogx-column-visibility-panel__drag-handle\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <circle cx=\"9\" cy=\"5\" r=\"1.5\" />\n <circle cx=\"15\" cy=\"5\" r=\"1.5\" />\n <circle cx=\"9\" cy=\"12\" r=\"1.5\" />\n <circle cx=\"15\" cy=\"12\" r=\"1.5\" />\n <circle cx=\"9\" cy=\"19\" r=\"1.5\" />\n <circle cx=\"15\" cy=\"19\" r=\"1.5\" />\n </svg>\n );\n}\n\nexport function ColumnVisibilityPanel<R extends GridRowModel = GridRowModel>(\n props: ColumnVisibilityPanelProps<R>\n) {\n const { columns, visibleColumns, onVisibilityChange, onShowAll, onHideAll, onColumnReorder, onColumnOrderReset, showNonHideableColumns } = props;\n const [searchQuery, setSearchQuery] = useState('');\n const [dragOverField, setDragOverField] = useState<string | null>(null);\n const dragFieldRef = useRef<string | null>(null);\n\n const hideableColumns = useMemo(() => columns.filter(col => col.hideable !== false), [columns]);\n const allVisible = hideableColumns.every(col => visibleColumns.has(col.field));\n\n const filteredColumns = useMemo(() => {\n const base = showNonHideableColumns ? columns : hideableColumns;\n if (!searchQuery) return base;\n const lowerQuery = searchQuery.toLowerCase();\n return base.filter(col =>\n (col.headerName || col.field).toLowerCase().includes(lowerQuery)\n );\n }, [columns, hideableColumns, searchQuery, showNonHideableColumns]);\n\n const handleToggleAll = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.checked) {\n onShowAll();\n } else {\n onHideAll();\n }\n };\n\n // ── Drag handlers ──────────────────────────────────────────────────────────\n const handleDragStart = (field: string) => (e: React.DragEvent) => {\n dragFieldRef.current = field;\n e.dataTransfer.effectAllowed = 'move';\n // Use a ghost image offset so the handle looks natural\n e.dataTransfer.setDragImage(e.currentTarget.closest('.ogx-column-visibility-panel__item') as HTMLElement, 20, 20);\n };\n\n const handleDragOver = (field: string) => (e: React.DragEvent) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n if (field !== dragFieldRef.current) {\n setDragOverField(field);\n }\n };\n\n const handleDragLeave = () => {\n setDragOverField(null);\n };\n\n const handleDrop = (toField: string) => (e: React.DragEvent) => {\n e.preventDefault();\n const fromField = dragFieldRef.current;\n setDragOverField(null);\n dragFieldRef.current = null;\n if (fromField && fromField !== toField && onColumnReorder) {\n onColumnReorder(fromField, toField);\n }\n };\n\n const handleDragEnd = () => {\n setDragOverField(null);\n dragFieldRef.current = null;\n };\n\n return (\n <div className=\"ogx-column-visibility-panel\">\n <div className=\"ogx-column-visibility-panel__search-section\">\n <div className=\"ogx-column-visibility-panel__search-container\">\n <SearchIcon />\n <input\n autoComplete=\"off\"\n className=\"ogx-column-visibility-panel__search-input\"\n placeholder=\"Search\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n />\n </div>\n </div>\n\n <div className=\"ogx-column-visibility-panel__list\">\n {filteredColumns.map(col => {\n const isVisible = visibleColumns.has(col.field);\n const isHideable = col.hideable !== false;\n const isDragOver = dragOverField === col.field;\n const canReorder = !!onColumnReorder && !searchQuery;\n\n return (\n <div\n key={col.field}\n className={[\n 'ogx-column-visibility-panel__item',\n !isHideable && 'ogx-column-visibility-panel__item--disabled',\n isDragOver && 'ogx-column-visibility-panel__item--drag-over',\n ].filter(Boolean).join(' ')}\n draggable={canReorder}\n onDragOver={canReorder ? handleDragOver(col.field) : undefined}\n onDragLeave={canReorder ? handleDragLeave : undefined}\n onDrop={canReorder ? handleDrop(col.field) : undefined}\n onDragEnd={canReorder ? handleDragEnd : undefined}\n >\n {canReorder && (\n <span\n className=\"ogx-column-visibility-panel__drag-handle-wrapper\"\n draggable\n onDragStart={handleDragStart(col.field)}\n title=\"Drag to reorder\"\n >\n <DragHandleIcon />\n </span>\n )}\n <label\n className=\"ogx-column-visibility-panel__item-label\"\n style={{ display: 'flex', alignItems: 'center', gap: 'var(--ogx-spacing-md)', flex: 1, cursor: isHideable ? 'pointer' : 'not-allowed' }}\n >\n <Checkbox\n checked={isVisible}\n onChange={(e) => onVisibilityChange(col.field, e.target.checked)}\n disabled={!isHideable}\n />\n <span className=\"ogx-column-visibility-panel__label\">\n {col.headerName || col.field}\n </span>\n </label>\n </div>\n );\n })}\n </div>\n\n <div className=\"ogx-column-visibility-panel__footer\">\n <label className=\"ogx-column-visibility-panel__item\">\n <Checkbox\n checked={allVisible}\n onChange={handleToggleAll}\n />\n <span className=\"ogx-column-visibility-panel__label\">\n Show/Hide All\n </span>\n </label>\n <button\n className=\"ogx-column-visibility-panel__reset-btn\"\n onClick={() => { onShowAll(); onColumnOrderReset?.(); }}\n >\n Reset\n </button>\n </div>\n </div>\n );\n}\n","import React, { useState, useLayoutEffect } from 'react';\nimport ReactDOM from 'react-dom';\nimport { ColumnVisibilityPanel } from '../ColumnVisibilityPanel/ColumnVisibilityPanel';\nimport type { GridColDef, GridRowModel, GridColumnOrderChangeParams } from '../../types';\n\nexport interface GridStandaloneColumnPanelProps<R extends GridRowModel> {\n isOpen: boolean;\n containerRef: React.RefObject<HTMLDivElement | null>;\n panelRef?: React.RefObject<HTMLDivElement | null>;\n effectiveColumns: GridColDef<R>[];\n columnVisibilityModel: Record<string, boolean>;\n effectiveColumnOrder: string[];\n columnOrder?: string[];\n disableColumnReorder: boolean;\n onClose: () => void;\n onColumnVisibilityChange: (model: Record<string, boolean>) => void;\n onColumnOrderChange?: (params: GridColumnOrderChangeParams) => void;\n setInternalColumnOrder: React.Dispatch<React.SetStateAction<string[]>>;\n}\n\nexport function GridStandaloneColumnPanel<R extends GridRowModel>({\n isOpen,\n containerRef,\n panelRef,\n effectiveColumns,\n columnVisibilityModel,\n effectiveColumnOrder,\n columnOrder,\n disableColumnReorder,\n onClose,\n onColumnVisibilityChange,\n onColumnOrderChange,\n setInternalColumnOrder,\n}: GridStandaloneColumnPanelProps<R>) {\n const [panelTop, setPanelTop] = useState<number>(16);\n const [panelRight, setPanelRight] = useState<number>(16);\n const [portalTarget, setPortalTarget] = useState<Element>(() => document.body);\n\n useLayoutEffect(() => {\n if (!isOpen || !containerRef.current) return;\n const rect = containerRef.current.getBoundingClientRect();\n setPanelTop(rect.top + 8);\n setPanelRight(window.innerWidth - rect.right + 8);\n setPortalTarget(containerRef.current.closest('.ogx-theme-provider') || document.body);\n }, [isOpen, containerRef]);\n\n if (!isOpen) return null;\n\n const handleReorder = disableColumnReorder\n ? undefined\n : (fromField: string, toField: string) => {\n const currentOrder = [...effectiveColumnOrder];\n const fromIdx = currentOrder.indexOf(fromField);\n const toIdx = currentOrder.indexOf(toField);\n if (fromIdx === -1 || toIdx === -1) return;\n const newOrder = [...currentOrder];\n newOrder.splice(fromIdx, 1);\n newOrder.splice(toIdx, 0, fromField);\n if (!columnOrder) setInternalColumnOrder(newOrder);\n onColumnOrderChange?.({\n oldIndex: fromIdx,\n targetIndex: toIdx,\n column: effectiveColumns.find(c => c.field === fromField) as unknown as GridColDef,\n });\n };\n\n return ReactDOM.createPortal(\n <div\n ref={panelRef}\n style={{\n position: 'fixed',\n top: panelTop,\n right: panelRight,\n zIndex: 9999,\n display: 'inline-block',\n }}\n >\n <button\n onClick={onClose}\n style={{\n position: 'absolute',\n top: -12,\n right: -12,\n width: 24,\n height: 24,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: '#334155',\n color: '#fff',\n border: 'none',\n borderRadius: '50%',\n cursor: 'pointer',\n fontSize: 14,\n lineHeight: 1,\n zIndex: 1,\n boxShadow: '0 1px 4px rgba(0,0,0,0.2)',\n }}\n aria-label=\"Close\"\n >×</button>\n <ColumnVisibilityPanel<R>\n columns={effectiveColumns}\n visibleColumns={new Set(\n effectiveColumns\n .filter(col => columnVisibilityModel[col.field] !== false)\n .map(col => col.field)\n )}\n onVisibilityChange={(field, isVisible) => {\n onColumnVisibilityChange({ ...columnVisibilityModel, [field]: isVisible });\n }}\n onShowAll={() => {\n const next = { ...columnVisibilityModel };\n effectiveColumns.forEach(col => { if (col.hideable !== false) next[col.field] = true; });\n onColumnVisibilityChange(next);\n }}\n onHideAll={() => {\n const next = { ...columnVisibilityModel };\n effectiveColumns.forEach(col => { if (col.hideable !== false) next[col.field] = false; });\n onColumnVisibilityChange(next);\n }}\n onColumnReorder={handleReorder}\n />\n </div>,\n portalTarget\n );\n}\n","import React, { useRef, useEffect, useCallback, useMemo, useState } from 'react';\nimport { useLayout } from '../../hooks/core/useLayout';\nimport { useGridKeyboardNavigation } from '../../hooks/core/useGridKeyboardNavigation';\nimport { useGridControlledState } from '../../hooks/core/useGridControlledState';\nimport { useGridRowPipeline } from '../../hooks/core/useGridRowPipeline';\nimport { useGridVirtualization } from '../../hooks/core/useGridVirtualization';\nimport { useGridColumns } from '../../hooks/core/useGridColumns';\nimport { useGridVisibleRows } from '../../hooks/core/useGridVisibleRows';\nimport { useGridScrollSync } from '../../hooks/core/useGridScrollSync';\nimport { useGridStateSnapshot } from '../../hooks/core/useGridStateSnapshot';\nimport { GridAggregationFooter } from './GridAggregationFooter';\nimport { GridEmptyState } from './GridEmptyState';\nimport { GridErrorOverlay } from './GridErrorOverlay';\nimport { Header } from '../Header/Header';\nimport { Pagination } from '../Pagination/Pagination';\nimport { useDataGrid } from '../../hooks/core/useDataGrid';\nimport { useRowReorder } from '../../hooks/useRowReorder';\nimport { useTreeData } from '../../hooks/useTreeData';\nimport { useRowGrouping } from '../../hooks/useRowGrouping';\nimport { useGridEditing } from '../../hooks/features/useGridEditing';\nimport { useGridSpanning } from '../../hooks/features/useGridSpanning';\nimport { useGridDataSource } from '../../hooks/features/useGridDataSource';\nimport { useAggregation } from '../../hooks/features/useAggregation';\nimport { usePivot } from '../../hooks/features/usePivot';\nimport { useGridClipboard } from '../../hooks/features/useGridClipboard';\nimport { GridListView } from './GridListView';\nimport { GridPinnedRows } from './GridPinnedRows';\nimport { GridVirtualRows } from './GridVirtualRows';\nimport { GridStandaloneColumnPanel } from './GridStandaloneColumnPanel';\nimport type { DataGridProps, GridRowModel, GridRowId, GridSortDirection, GridColDef, GridRowParams, GridCellParams, GridDataSource, GridAggregationResult, GridFilterModel, GridTreeNode, GridSortItem, GridRowMeta, GridGroupedExportRow } from '../../types';\n\nconst EMPTY_ROW_META_MAP: Map<GridRowId, GridRowMeta> = new Map();\n\nexport function DataGrid<R extends GridRowModel = GridRowModel>(props: DataGridProps<R>) {\n const {\n rows,\n columns,\n getRowId,\n rowHeight = 52,\n headerHeight = 56,\n autoHeight = false,\n density,\n checkboxSelection = false,\n disableRowSelectionOnClick = false,\n disableMultipleRowSelection = false,\n rowSelectionModel: propRowSelectionModel,\n onRowSelectionModelChange: propOnRowSelectionModelChange,\n onRowClick,\n onCellClick,\n\n filterModel: propFilterModel,\n onFilterModelChange,\n sortModel: propSortModel,\n onSortModelChange,\n pagination: propPagination = false,\n paginationModel,\n onPaginationModelChange,\n pageSizeOptions = [10, 25, 50, 100],\n pinnedColumns: propPinnedColumns,\n onPinnedColumnsChange,\n pinnedRows,\n\n getDetailPanelContent,\n getDetailPanelHeight,\n detailPanelExpandedRowIds: controlledExpandedRowIds,\n onDetailPanelExpandedRowIdsChange,\n pinCheckboxColumn = true,\n pinExpandColumn = true,\n disableColumnReorder = false,\n columnOrder,\n onColumnOrderChange,\n height,\n rowReordering = false,\n onRowOrderChange,\n loading = false,\n\n treeData = false,\n getTreeDataPath,\n defaultGroupingExpansionDepth,\n groupingColDef,\n\n rowGroupingModel: propRowGroupingModel,\n\n aggregationModel: propAggregationModel,\n onAggregationModelChange,\n getAggregationPosition,\n\n isCellEditable,\n processRowUpdate,\n onProcessRowUpdateError,\n\n dataSource,\n multiSort = false,\n sortingMode = 'client',\n filterMode = 'client',\n paginationMode = 'client',\n rowCount: propRowCount,\n\n slots,\n slotProps,\n\n pivotMode = false,\n pivotModel: propPivotModel,\n onPivotModelChange,\n\n className = '',\n style,\n onRowsScrollEnd,\n ariaLabel,\n initialState,\n onStateChange,\n // Column Visibility\n columnVisibilityModel: propColumnVisibilityModel,\n onColumnVisibilityModelChange,\n listView = false,\n listViewColumn,\n columnGroupingModel,\n noRowsLabel = 'No Data',\n localeText,\n apiRef: propApiRef,\n } = props;\n\n const effectiveNoRowsLabel = localeText?.noRowsLabel ?? noRowsLabel;\n\n // Stable defaults\n const defaultFilterModel: GridFilterModel = useMemo(() => ({ items: [] }), []);\n const filterModel = (propFilterModel || defaultFilterModel) as GridFilterModel;\n\n const defaultRowGroupingModel = useMemo(() => [], []);\n const rowGroupingModel = propRowGroupingModel || defaultRowGroupingModel;\n\n // ─── Stabilize toolbar component identity ────────────────────────────────\n // Problem: demos/users often define their toolbar as an inline function\n // INSIDE their component body, e.g.:\n // const MyToolbar = (props) => <GridToolbar {...props} /> // inside render!\n // This creates a NEW function reference on every parent re-render. React\n // reconciles by component *identity*, so a new reference = unmount old\n // toolbar + mount fresh one = all toolbar state (search expansion, filter\n // open, typed text) is destroyed on every keystroke.\n //\n // Fix: a stable wrapper component created ONCE via useRef. Its identity\n // never changes, so React keeps it mounted. It reads the latest toolbar\n // from a separate ref that is updated on every render, so the rendered\n // output is always current — zero stale closures.\n const latestToolbarRef = useRef(slots?.toolbar);\n latestToolbarRef.current = slots?.toolbar;\n // The wrapper itself has a stable identity (created once via useRef).\n // We call latestToolbarRef.current(props) as a PLAIN FUNCTION — not via\n // React.createElement — so React never sees a changing component type.\n // The elements the toolbar function returns are reconciled normally, so\n // GridToolbar's internal state (filterOpen, search expansion) is preserved\n // even when the toolbar is defined as an inline function inside the parent.\n const StableToolbar = useRef((props: Record<string, unknown>) => {\n const Toolbar = latestToolbarRef.current;\n return Toolbar ? (Toolbar as (p: typeof props) => React.ReactElement | null)(props) : null;\n }).current;\n\n const controlledState = useGridControlledState({\n initialState,\n sortModel: propSortModel,\n onSortModelChange,\n aggregationModel: propAggregationModel,\n onAggregationModelChange,\n columnVisibilityModel: propColumnVisibilityModel,\n onColumnVisibilityModelChange,\n pinnedColumns: propPinnedColumns,\n onPinnedColumnsChange,\n pivotModel: propPivotModel,\n onPivotModelChange,\n paginationModel,\n onPaginationModelChange,\n rowSelectionModel: propRowSelectionModel,\n onRowSelectionModelChange: propOnRowSelectionModelChange,\n });\n\n const {\n sortModel,\n isSortControlled,\n setInternalSortModel,\n aggregationModel,\n handleAggregationModelChange,\n columnVisibilityModel,\n handleColumnVisibilityModelChange,\n pinnedColumns,\n handlePinnedColumnsChange,\n currentPivotModel,\n handlePivotModelChange,\n effectivePaginationModel,\n handlePaginationModelChange,\n selectedRowIds,\n isSelectionControlled,\n setInternalRowSelectionModel,\n } = controlledState;\n\n const onRowSelectionModelChange = propOnRowSelectionModelChange;\n\n const pivot = usePivot(rows as GridRowModel[], columns as unknown as GridColDef[], currentPivotModel, pivotMode);\n\n const effectiveRowHeight = density === 'compact' ? 32 : density === 'comfortable' ? 72 : rowHeight;\n\n const activeRows = (pivotMode && pivot.isValid ? pivot.pivotRows : rows) as unknown as R[];\n const baseColumns = (pivotMode && pivot.isValid ? pivot.pivotColumns : columns) as unknown as GridColDef<R>[];\n\n // When groupingColDef is provided and row grouping is active, prepend a\n // dedicated synthetic __group__ column at position 0 (pinned-left).\n const isRowGroupingActive = Boolean(propRowGroupingModel && propRowGroupingModel.length > 0);\n\n // Auto-pin __group__ column to the left when groupingColDef is active.\n // Both values MUST be memoized: without useMemo they produce a new array/object\n // reference every render, which cascades through useRowGrouping's memos and\n // effects into an infinite setState loop (Maximum update depth exceeded).\n const effectivePinnedColumns = useMemo(() => (\n (groupingColDef && isRowGroupingActive && !pivotMode)\n ? { ...pinnedColumns, left: ['__group__', ...((pinnedColumns?.left ?? []).filter(f => f !== '__group__'))] }\n : pinnedColumns\n ), [groupingColDef, isRowGroupingActive, pivotMode, pinnedColumns]);\n\n const activeColumns = useMemo(() => (\n (groupingColDef && isRowGroupingActive && !pivotMode)\n ? [\n {\n headerName: 'Group',\n width: 220,\n ...groupingColDef,\n field: '__group__',\n hideable: false,\n sortable: false,\n pinnable: false,\n exportable: false,\n } as unknown as GridColDef<R>,\n ...baseColumns,\n ]\n : baseColumns\n ), [groupingColDef, isRowGroupingActive, pivotMode, baseColumns]);\n\n const [serverAggregationResults, setServerAggregationResults] = useState<GridAggregationResult | null>(null);\n\n useEffect(() => {\n setServerAggregationResults(null);\n }, [aggregationModel]);\n\n const viewportRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const gridRef = useRef<HTMLDivElement>(null);\n\n const defaultGetRowId = useCallback((row: R) => row.id, []);\n const effectiveGetRowId = getRowId || defaultGetRowId;\n\n // Normalize rows so every row has `id === getRowId(row)`.\n // createInitialState and SET_ROWS both key the internal store by row.id,\n // so rows without a native id field collide on undefined without this.\n // When getRowId is the default (row) => row.id this is a no-op per row.\n const normalizedRows = useMemo(\n () => activeRows.map(row => {\n const id = effectiveGetRowId(row);\n return id === row.id ? row : ({ ...row, id } as R);\n }),\n [activeRows, effectiveGetRowId]\n );\n\n // Keyboard-mode flag: toggled via DOM classname — no React state needed\n // so the ring appears instantly without a re-render cycle.\n const setKeyboardMode = useCallback((on: boolean) => {\n containerRef.current?.classList.toggle('ogx--kb', on);\n }, []);\n\n const dataSourceRef = useRef<GridDataSource<R> | undefined>(dataSource);\n dataSourceRef.current = dataSource;\n\n const fetchChildrenRef = useRef<((parentId: GridRowId, groupKeys: string[]) => Promise<void>) | null>(null);\n const treeDataRef = useRef<ReturnType<typeof useTreeData> | null>(null);\n\n const handleNodeExpansion = useCallback((node: GridTreeNode) => {\n if (dataSourceRef.current && treeData) {\n\n if ((node.serverChildrenCount ?? 0) > 0 && (node.children ?? []).length === 0) {\n\n const groupKeys = treeDataRef.current?.getNodePath(node.id) || [node.groupingKey];\n fetchChildrenRef.current?.(node.id, groupKeys);\n }\n }\n }, [treeData]);\n\n const gridData = useDataGrid({\n rows: normalizedRows,\n columns: activeColumns,\n rowHeight: effectiveRowHeight,\n headerHeight,\n rowCount: propRowCount,\n columnVisibilityModel,\n initialState: props.initialState\n });\n const {\n state,\n apiRef,\n setRows,\n setColumns,\n setDimensions,\n setDataSourceLoading,\n setDataSourceError,\n setRowCount\n } = gridData;\n\n const { scrollTop, scrollLeft, handleScroll } = useGridScrollSync({ onRowsScrollEnd });\n\n useEffect(() => {\n if (propApiRef) {\n propApiRef.current = apiRef.current;\n }\n }, [propApiRef, apiRef]);\n\n const { copySelectedRows } = useGridClipboard({\n selectedRowIds,\n columns: activeColumns as unknown as GridColDef[],\n getVisibleRows: () => apiRef.current.getVisibleRows(),\n getRowId: effectiveGetRowId as unknown as (row: GridRowModel) => GridRowId,\n });\n\n // Expose on apiRef for programmatic use\n useEffect(() => {\n apiRef.current.copySelectedRows = copySelectedRows;\n apiRef.current.getSelectedRows = () => Array.from(selectedRowIds);\n }, [copySelectedRows, selectedRowIds, apiRef]);\n\n const isInternalLoading = state.dataSource.loading;\n const effectiveLoading = loading || isInternalLoading;\n\n const effectiveRows = useMemo(() => {\n return state.rows.allRows.map(id => state.rows.idRowsLookup.get(id)!) as R[];\n }, [state.rows]);\n\n const treeDataHandlers = useTreeData({\n rows: effectiveRows,\n getRowId: effectiveGetRowId,\n getTreeDataPath,\n treeData,\n defaultGroupingExpansionDepth,\n filterModel,\n\n sortModel,\n onRowExpansionChange: handleNodeExpansion\n });\n\n useEffect(() => {\n treeDataRef.current = treeDataHandlers;\n }, [treeDataHandlers]);\n\n const rowGroupingHandlers = useRowGrouping({\n rows: effectiveRows,\n getRowId: effectiveGetRowId,\n columns: activeColumns,\n rowGroupingModel,\n aggregationModel,\n defaultGroupingExpansionDepth,\n filterModel,\n sortModel,\n getAggregationPosition\n });\n\n const editingHandlers = useGridEditing({\n rows: effectiveRows,\n getRowId: effectiveGetRowId,\n processRowUpdate,\n onProcessRowUpdateError,\n onRowChange: (updatedRow) => {\n // Dispatch a proper state update so React re-renders with the new row value\n const { dispatch } = gridData;\n const currentRows = Array.from(gridData.state.rows.idRowsLookup.values());\n const nextRows = currentRows.map(r =>\n r.id === updatedRow.id ? updatedRow : r\n );\n dispatch({ type: 'SET_ROWS', payload: nextRows });\n },\n });\n\n const isTreeData = treeData;\n const isRowGrouping = !!(rowGroupingModel && rowGroupingModel.length > 0);\n const isHierarchyEnabled = isTreeData || isRowGrouping;\n const activeHierarchyHandlers = isTreeData ? treeDataHandlers : (isRowGrouping ? rowGroupingHandlers : null);\n\n const rowMetaMap = useMemo<Map<GridRowId, GridRowMeta>>(() => {\n if (isTreeData) return treeDataHandlers.rowMetaMap;\n if (isRowGrouping) return rowGroupingHandlers.rowMetaMap;\n return EMPTY_ROW_META_MAP;\n }, [isTreeData, treeDataHandlers.rowMetaMap, isRowGrouping, rowGroupingHandlers.rowMetaMap]);\n\n const pagination = propPagination && !isRowGrouping;\n\n const handleRowClick = useCallback((params: GridRowParams<R>) => {\n const { row, id } = params;\n\n if (isHierarchyEnabled && rowMetaMap.get(row.id)?.hasChildren) {\n activeHierarchyHandlers?.toggleExpansion(id);\n return;\n }\n\n onRowClick?.(params);\n\n if (!disableRowSelectionOnClick) {\n let next: GridRowId[];\n if (disableMultipleRowSelection) {\n const alreadySelected = selectedRowIds.has(id as GridRowId);\n next = alreadySelected ? [] : [id as GridRowId];\n } else {\n const newSelection = new Set(selectedRowIds);\n if (newSelection.has(id as GridRowId)) {\n newSelection.delete(id as GridRowId);\n } else {\n newSelection.add(id as GridRowId);\n }\n next = Array.from(newSelection);\n }\n if (!isSelectionControlled) {\n setInternalRowSelectionModel(next);\n }\n onRowSelectionModelChange?.(next);\n }\n }, [isHierarchyEnabled, activeHierarchyHandlers, onRowClick, rowMetaMap, disableRowSelectionOnClick, disableMultipleRowSelection, selectedRowIds, isSelectionControlled, setInternalRowSelectionModel, onRowSelectionModelChange]);\n\n const dataSourceHandlers = useGridDataSource({\n dataSource,\n sortModel,\n filterModel,\n paginationModel: effectivePaginationModel,\n paginationMode,\n sortingMode,\n filterMode,\n aggregationModel,\n setRows,\n setRowCount,\n setDataSourceLoading,\n setDataSourceError,\n onAggregationResults: setServerAggregationResults,\n });\n\n useEffect(() => {\n if (dataSourceHandlers.fetchChildren) {\n fetchChildrenRef.current = dataSourceHandlers.fetchChildren;\n }\n }, [dataSourceHandlers.fetchChildren]);\n\n useEffect(() => {\n if (!dataSource) {\n setRows(normalizedRows);\n }\n }, [normalizedRows, setRows, dataSource]);\n\n // ── Detail panel (hoisted — hasDetailPanel feeds into useGridColumns) ──────\n const hasDetailPanel = Boolean(getDetailPanelContent);\n const [internalExpandedRowIds, setInternalExpandedRowIds] = useState<Set<GridRowId>>(new Set());\n const expandedRowIds = controlledExpandedRowIds ?? internalExpandedRowIds;\n\n const handleDetailPanelToggle = useCallback((rowId: GridRowId) => {\n const newExpandedRowIds = new Set(expandedRowIds);\n if (newExpandedRowIds.has(rowId)) {\n newExpandedRowIds.delete(rowId);\n } else {\n newExpandedRowIds.add(rowId);\n }\n if (controlledExpandedRowIds === undefined) {\n setInternalExpandedRowIds(newExpandedRowIds);\n }\n onDetailPanelExpandedRowIdsChange?.(newExpandedRowIds);\n }, [expandedRowIds, controlledExpandedRowIds, onDetailPanelExpandedRowIdsChange]);\n\n // ── Column management ─────────────────────────────────────────────────────\n const {\n effectiveColumns,\n orderedColumns,\n visibleOrderedColumns,\n navigationColumns,\n columnWidths,\n effectiveColumnOrder,\n setInternalColumnOrder,\n columnReorderHandlers,\n handleColumnResize,\n } = useGridColumns<R>({\n activeColumns,\n isHierarchyEnabled,\n isRowGrouping,\n isTreeData,\n activeHierarchyHandlers,\n columnVisibilityModel,\n columnOrder,\n onColumnOrderChange,\n disableColumnReorder,\n pivotMode,\n checkboxSelection,\n hasDetailPanel,\n rowReordering,\n initialState,\n setColumns,\n });\n\n useGridStateSnapshot({\n onStateChange,\n sortModel,\n filterModel,\n effectivePaginationModel,\n columnWidths,\n effectiveColumnOrder,\n columnVisibilityModel,\n pinnedColumns: effectivePinnedColumns,\n });\n\n const rowPipeline = useGridRowPipeline<GridRowModel>({\n effectiveRows: effectiveRows as GridRowModel[],\n activeHierarchyHandlers: activeHierarchyHandlers as { getVisibleRows: () => GridRowModel[] } | null,\n filterMode,\n filterModel,\n dataSource: dataSource as GridDataSource<GridRowModel> | undefined,\n sortModel,\n sortingMode,\n pagination,\n paginationMode,\n effectivePaginationModel,\n pinnedRows,\n isLoading: state.dataSource.loading,\n pageSize: effectivePaginationModel.pageSize,\n });\n const filteredRows = rowPipeline.filteredRows as R[];\n const pinnedTopRows = rowPipeline.pinnedTopRows as R[];\n const pinnedBottomRows = rowPipeline.pinnedBottomRows as R[];\n const sortedUnpinnedRows = rowPipeline.sortedUnpinnedRows as R[];\n const paginatedUnpinnedRows = rowPipeline.paginatedUnpinnedRows as R[];\n const allRenderableRows = rowPipeline.allRenderableRows as R[];\n\n useEffect(() => {\n gridData.apiRef.current.getVisibleRows = () => pagination ? paginatedUnpinnedRows : sortedUnpinnedRows;\n gridData.apiRef.current.getAllFilteredRows = () => sortedUnpinnedRows;\n gridData.apiRef.current.getVisibleColumns = () => effectiveColumns as unknown as GridColDef[];\n }, [sortedUnpinnedRows, paginatedUnpinnedRows, pagination, effectiveColumns, gridData.apiRef]);\n\n const rowReorderHandlers = useRowReorder({\n rows: pagination ? paginatedUnpinnedRows : sortedUnpinnedRows,\n getRowId: (row) => row.id,\n onRowOrderChange,\n rowReordering\n });\n\n const spanning = useGridSpanning(\n allRenderableRows,\n navigationColumns,\n columnWidths\n );\n\n const { aggregationResult } = useAggregation({\n rows: filteredRows,\n columns: activeColumns as unknown as GridColDef[],\n aggregationModel,\n isServerSide: !!(dataSource && (paginationMode === 'server' || sortingMode === 'server')),\n dataSource,\n filterModel,\n sortModel,\n serverAggregationResults,\n });\n\n const hasAggregation = Object.keys(aggregationModel).length > 0;\n\n useEffect(() => {\n gridData.apiRef.current.getAggregationResult = () => hasAggregation ? aggregationResult : null;\n gridData.apiRef.current.getAggregationModel = () => hasAggregation ? aggregationModel : null;\n gridData.apiRef.current.getGroupedExportRows = (): GridGroupedExportRow[] | null => {\n if (!isRowGrouping) return null;\n const { treeNodes, groupingRows } = rowGroupingHandlers;\n const rowLookup = new Map<GridRowId, GridRowModel>();\n sortedUnpinnedRows.forEach(r => rowLookup.set((r as GridRowModel).id as GridRowId, r as GridRowModel));\n\n const result: GridGroupedExportRow[] = [];\n\n const traverse = (ids: GridRowId[]) => {\n ids.forEach(id => {\n const node = treeNodes.get(id);\n if (!node) return;\n const isGroup = Boolean(node.children && node.children.length > 0);\n if (isGroup) {\n result.push({\n type: 'group-header',\n depth: node.depth,\n groupField: node.groupingField,\n groupValue: node.groupingValue,\n });\n traverse(node.children!);\n if (hasAggregation && node.aggregatedValues) {\n result.push({\n type: 'group-subtotal',\n depth: node.depth,\n groupField: node.groupingField,\n groupValue: node.groupingValue,\n aggregatedValues: node.aggregatedValues,\n });\n }\n } else {\n const row = rowLookup.get(id) ?? groupingRows.get(id);\n if (row) {\n result.push({ type: 'leaf', depth: node.depth, row });\n }\n }\n });\n };\n\n traverse(Array.from(treeNodes.keys()).filter(id => treeNodes.get(id)?.parentId === null));\n\n if (hasAggregation && aggregationResult) {\n result.push({ type: 'grand-total', depth: 0, aggregatedValues: aggregationResult });\n }\n return result;\n };\n }, [aggregationResult, aggregationModel, hasAggregation, gridData.apiRef, isRowGrouping, rowGroupingHandlers, sortedUnpinnedRows]);\n\n const layout = useLayout({\n rowHeight: effectiveRowHeight,\n pagination,\n paginatedUnpinnedRows,\n sortedUnpinnedRows,\n expandedRowIds,\n getDetailPanelHeight,\n pinnedTopRowsLength: pinnedTopRows.length,\n pinnedBottomRowsLength: pinnedBottomRows.length,\n visibleOrderedColumns,\n pinnedColumns: effectivePinnedColumns,\n columnWidths,\n viewportWidth: state.dimensions.viewportWidth || 1000,\n checkboxSelection,\n hasDetailPanel,\n rowReordering,\n pinCheckboxColumn,\n pinExpandColumn,\n autoHeight,\n paginationMode,\n isLoading: state.dataSource.loading,\n pageSize: effectivePaginationModel.pageSize,\n });\n\n // Merge layout-computed widths (which include flex resolution) with user-resize\n // overrides. The footer and other consumers that receive `columnWidths` only get\n // the resize-override map, which has no entry for flex columns that haven't been\n // manually resized — causing them to fall back to the raw `col.width` prop instead\n // of the actual rendered width.\n const resolvedColumnWidths = useMemo(() => {\n const result: Record<string, number> = {};\n for (const col of [...layout.leftPinnedCols, ...layout.unpinnedColsWithWidth, ...layout.rightPinnedCols]) {\n if (!col.isSpacer) result[col.field] = col.width;\n }\n return { ...result, ...columnWidths };\n }, [layout.leftPinnedCols, layout.unpinnedColsWithWidth, layout.rightPinnedCols, columnWidths]);\n\n useEffect(() => {\n gridData.apiRef.current.scrollToIndexes = ({ rowIndex, colIndex }) => {\n const el = viewportRef.current;\n if (!el) return;\n\n if (rowIndex !== undefined && rowIndex >= 0) {\n const rowTop = rowIndex > 0 ? layout.cumulativeHeights[rowIndex - 1] : 0;\n const rowBottom = layout.cumulativeHeights[rowIndex] ?? rowTop;\n const { scrollTop, clientHeight } = el;\n if (rowTop < scrollTop) {\n el.scrollTop = rowTop;\n } else if (rowBottom > scrollTop + clientHeight) {\n el.scrollTop = rowBottom - clientHeight;\n }\n }\n\n if (colIndex !== undefined && colIndex >= 0) {\n // colIndex is an index into all data columns: leftPinned + unpinned + rightPinned\n const allDataCols = [...layout.leftPinnedCols, ...layout.unpinnedColsWithWidth, ...layout.rightPinnedCols];\n const targetCol = allDataCols[colIndex];\n if (!targetCol) return;\n const unpinnedIndex = layout.unpinnedColsWithWidth.findIndex(c => c.field === targetCol.field);\n if (unpinnedIndex === -1) return; // pinned column — always visible, no scroll needed\n const colLocalLeft = unpinnedIndex > 0 ? layout.unpinnedAccWidths[unpinnedIndex - 1] : 0;\n const colLocalRight = layout.unpinnedAccWidths[unpinnedIndex] ?? colLocalLeft;\n const colRight = layout.leftWidth + colLocalRight;\n const { scrollLeft, clientWidth } = el;\n if (colLocalLeft < scrollLeft) {\n el.scrollLeft = colLocalLeft;\n } else if (colRight > scrollLeft + clientWidth) {\n el.scrollLeft = colRight - clientWidth;\n }\n }\n };\n }, [layout, viewportRef, gridData.apiRef]);\n\n const virtualization = useGridVirtualization({\n layout,\n scrollTop,\n scrollLeft,\n viewportWidth: state.dimensions.viewportWidth,\n viewportHeight: state.dimensions.viewportHeight,\n autoHeight,\n rowReordering,\n hasDetailPanel,\n checkboxSelection,\n pinCheckboxColumn,\n pinExpandColumn,\n });\n\n\n useEffect(() => {\n if (!viewportRef.current) return;\n\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect;\n setDimensions(width, height);\n }\n });\n\n resizeObserver.observe(viewportRef.current);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [setDimensions]);\n\n const handleSelectionChange = useCallback((rowId: GridRowId, isSelected: boolean) => {\n const newSelection = new Set(selectedRowIds);\n if (isSelected) {\n newSelection.add(rowId);\n } else {\n newSelection.delete(rowId);\n }\n const newSelectionArray = Array.from(newSelection);\n\n if (!isSelectionControlled) {\n setInternalRowSelectionModel(newSelectionArray);\n }\n onRowSelectionModelChange?.(newSelectionArray);\n }, [selectedRowIds, isSelectionControlled, onRowSelectionModelChange, setInternalRowSelectionModel]);\n\n const handleSelectAll = useCallback((isSelected: boolean) => {\n let newSelection: GridRowId[] = [];\n if (isSelected) {\n newSelection = effectiveRows.map((row: GridRowModel) => row.id);\n }\n\n if (!isSelectionControlled) {\n setInternalRowSelectionModel(newSelection);\n }\n onRowSelectionModelChange?.(newSelection);\n }, [effectiveRows, isSelectionControlled, onRowSelectionModelChange, setInternalRowSelectionModel]);\n\n const handleSort = useCallback((field: string, direction: GridSortDirection) => {\n const newSortModel = direction ? [{ field, sort: direction }] : [];\n\n if (!isSortControlled) {\n setInternalSortModel(newSortModel as GridSortItem[]);\n }\n onSortModelChange?.(newSortModel as GridSortItem[]);\n }, [isSortControlled, onSortModelChange, setInternalSortModel]);\n\n const handleSortAdd = useCallback((field: string, direction: GridSortDirection) => {\n const existing = sortModel.filter(item => item.field !== field);\n const newSortModel: GridSortItem[] = direction\n ? [...existing, { field, sort: direction }]\n : existing;\n\n if (!isSortControlled) {\n setInternalSortModel(newSortModel);\n }\n onSortModelChange?.(newSortModel);\n }, [sortModel, isSortControlled, onSortModelChange, setInternalSortModel]);\n\n const { focusedCell, setFocusedCell, handleFocus, handleBlur, handleKeyDown } = useGridKeyboardNavigation({\n allRenderableRows,\n navigationColumns,\n checkboxSelection,\n selectedRowIds,\n handleSelectionChange,\n handleDetailPanelToggle,\n editingHandlers,\n setKeyboardMode,\n sortModel,\n handleSort,\n isCellEditable,\n pagination,\n pageSize: effectivePaginationModel.pageSize,\n virtualization,\n viewportRef,\n });\n\n const handleCellClick = useCallback((params: GridCellParams<R>) => {\n setKeyboardMode(false);\n setFocusedCell({ id: params.row.id, field: params.field });\n\n gridRef.current?.focus({ preventScroll: true });\n onCellClick?.(params);\n }, [onCellClick, setKeyboardMode, setFocusedCell]);\n\n const prevEditingCellRef = useRef(editingHandlers.editingCell);\n useEffect(() => {\n const wasEditing = Boolean(prevEditingCellRef.current);\n const isEditing = Boolean(editingHandlers.editingCell);\n\n if (wasEditing && !isEditing) {\n\n gridRef.current?.focus({ preventScroll: true });\n }\n\n prevEditingCellRef.current = editingHandlers.editingCell;\n }, [editingHandlers.editingCell]);\n\n const visibleRows = useGridVisibleRows<R>({\n renderContext: virtualization.renderContext,\n pinnedTopRows,\n pinnedBottomRows,\n paginatedUnpinnedRows,\n sortedUnpinnedRows,\n pagination,\n });\n\n\n const allSelected = rows.length > 0 && selectedRowIds.size === rows.length;\n const someSelected = selectedRowIds.size > 0 && selectedRowIds.size < rows.length;\n\n const hasRowSpanning = React.useMemo(() => effectiveColumns.some(c => !!c.rowSpan), [effectiveColumns]);\n const [columnsPanelOpen, setColumnsPanelOpen] = React.useState(false);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const standalonePanelRef = React.useRef<HTMLDivElement>(null);\n\n const toolbarProps = React.useMemo(() => {\n if (!slots?.toolbar) return null;\n const reorderHandler = disableColumnReorder\n ? undefined\n : (fromField: string, toField: string) => {\n const currentOrder = [...effectiveColumnOrder];\n const fromIdx = currentOrder.indexOf(fromField);\n const toIdx = currentOrder.indexOf(toField);\n if (fromIdx === -1 || toIdx === -1) return;\n const newOrder = [...currentOrder];\n newOrder.splice(fromIdx, 1);\n newOrder.splice(toIdx, 0, fromField);\n if (!columnOrder) setInternalColumnOrder(newOrder);\n const col = effectiveColumns.find(c => c.field === fromField);\n if (col) onColumnOrderChange?.({ oldIndex: fromIdx, targetIndex: toIdx, column: col as unknown as GridColDef });\n };\n return {\n apiRef: gridData.apiRef,\n columns: orderedColumns as unknown as GridColDef[],\n baseColumns: columns as unknown as GridColDef[],\n aggregationModel,\n onAggregationModelChange: handleAggregationModelChange,\n ...(pivotMode || propPivotModel || onPivotModelChange ? {\n pivotModel: currentPivotModel,\n onPivotModelChange: handlePivotModelChange,\n } : {}),\n filterModel,\n onFilterModelChange,\n columnVisibilityModel,\n onColumnVisibilityModelChange: handleColumnVisibilityModelChange,\n onColumnReorder: reorderHandler,\n onColumnOrderReset: disableColumnReorder ? undefined : () => setInternalColumnOrder(columns.map(c => c.field)),\n forceColumnsOpen: columnsPanelOpen,\n onColumnsPanelClose: () => setColumnsPanelOpen(false),\n ...slotProps?.toolbar,\n };\n }, [\n slots?.toolbar, disableColumnReorder, effectiveColumnOrder, orderedColumns, effectiveColumns,\n columnOrder, onColumnOrderChange, setInternalColumnOrder, gridData.apiRef,\n columns, aggregationModel, handleAggregationModelChange, pivotMode,\n propPivotModel, onPivotModelChange, currentPivotModel, handlePivotModelChange,\n filterModel, onFilterModelChange, columnVisibilityModel,\n handleColumnVisibilityModelChange, columnsPanelOpen, slotProps?.toolbar,\n ]);\n\n // Click-outside handler for standalone column panel\n useEffect(() => {\n if (!columnsPanelOpen || slots?.toolbar) return;\n function handleClickOutside(e: MouseEvent) {\n if (standalonePanelRef.current && !standalonePanelRef.current.contains(e.target as Node)) {\n setColumnsPanelOpen(false);\n }\n }\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [columnsPanelOpen, slots?.toolbar]);\n\n return (\n <div\n ref={containerRef}\n className={['ogx', className, autoHeight && 'ogx--auto-height', hasRowSpanning && 'ogx--row-spanning', listView && 'ogx--list-view'].filter(Boolean).join(' ')}\n style={{\n ...style,\n height: height ?? style?.height,\n '--ogx-row-height': `${effectiveRowHeight}px`,\n '--ogx-header-height': `${headerHeight}px`\n } as unknown as React.CSSProperties}\n aria-busy={effectiveLoading}\n >\n {toolbarProps && <StableToolbar {...toolbarProps} />}\n\n {!slots?.toolbar && (\n <GridStandaloneColumnPanel<R>\n isOpen={columnsPanelOpen}\n containerRef={containerRef}\n panelRef={standalonePanelRef}\n effectiveColumns={effectiveColumns}\n columnVisibilityModel={columnVisibilityModel}\n effectiveColumnOrder={effectiveColumnOrder}\n columnOrder={columnOrder}\n disableColumnReorder={disableColumnReorder}\n onClose={() => setColumnsPanelOpen(false)}\n onColumnVisibilityChange={handleColumnVisibilityModelChange}\n onColumnOrderChange={onColumnOrderChange}\n setInternalColumnOrder={setInternalColumnOrder}\n />\n )}\n\n {listView && listViewColumn && (\n <GridListView<R>\n ariaLabel={ariaLabel}\n allRenderableRows={allRenderableRows}\n filteredRows={filteredRows}\n pagination={pagination}\n effectivePaginationModel={effectivePaginationModel}\n pageSizeOptions={pageSizeOptions}\n selectedRowIds={selectedRowIds}\n listViewColumn={listViewColumn}\n noRowsLabel={effectiveNoRowsLabel}\n rowHeight={effectiveRowHeight}\n checkboxSelection={checkboxSelection}\n paginationMode={paginationMode}\n dataSource={dataSource}\n serverRowCount={state.pagination.rowCount || 0}\n paginationSlot={slots?.pagination}\n paginationSlotProps={slotProps?.pagination}\n localeText={localeText ? {\n paginationRowsPerPage: localeText.paginationRowsPerPage,\n paginationOf: localeText.paginationOf,\n paginationPage: localeText.paginationPage,\n } : undefined}\n onRowClick={handleRowClick}\n onSelectionChange={handleSelectionChange}\n onPaginationModelChange={handlePaginationModelChange}\n />\n )}\n\n {/* ══════════════════════════════════════════════════════════════\n STANDARD GRID VIEWPORT (hidden when listView=true)\n ══════════════════════════════════════════════════════════════ */}\n {!listView && (\n <div\n ref={(el) => {\n viewportRef.current = el;\n gridRef.current = el;\n }}\n className=\"ogx__viewport\"\n onScroll={handleScroll}\n role=\"grid\"\n aria-label={ariaLabel || 'Data grid'}\n aria-rowcount={filteredRows.length + 1}\n aria-colcount={\n columns.length +\n (checkboxSelection ? 1 : 0) +\n (hasDetailPanel ? 1 : 0) +\n (rowReordering ? 1 : 0)\n }\n aria-busy={effectiveLoading}\n tabIndex={0}\n onKeyDownCapture={() => { setKeyboardMode(true); }}\n onMouseDownCapture={() => { setKeyboardMode(false); }}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n >\n <div\n ref={contentRef}\n className=\"ogx__content\"\n style={{\n width: virtualization.totalWidth\n }}\n role=\"presentation\"\n >\n { }\n <Header\n columns={virtualization.virtualColumns}\n allColumns={effectiveColumns}\n columnGroupingModel={columnGroupingModel}\n checkboxSelection={checkboxSelection}\n allSelected={allSelected}\n someSelected={someSelected}\n onSelectAll={handleSelectAll}\n sortModel={sortModel}\n onSort={handleSort}\n onSortAdd={handleSortAdd}\n multiSort={multiSort}\n\n onColumnResize={handleColumnResize}\n columnWidths={columnWidths}\n pinnedColumns={effectivePinnedColumns}\n\n focusedCell={focusedCell}\n onHeaderClick={(field) => {\n setFocusedCell({ id: 'HEADER', field });\n setKeyboardMode(false);\n gridRef.current?.focus({ preventScroll: true });\n }}\n onDragStart={columnGroupingModel ? undefined : columnReorderHandlers.onDragStart}\n onDragOver={columnGroupingModel ? undefined : columnReorderHandlers.onDragOver}\n onDragEnd={columnGroupingModel ? undefined : columnReorderHandlers.onDragEnd}\n onDrop={columnGroupingModel ? undefined : columnReorderHandlers.onDrop}\n draggedColumn={columnGroupingModel ? undefined : columnReorderHandlers.draggedColumn}\n dragOverColumn={columnGroupingModel ? undefined : columnReorderHandlers.dragOverColumn}\n rowReordering={rowReordering}\n hasDetailPanel={hasDetailPanel}\n pinCheckboxColumn={pinCheckboxColumn}\n pinExpandColumn={pinExpandColumn}\n aggregationModel={aggregationModel}\n onHideColumn={(field) => {\n handleColumnVisibilityModelChange({\n ...columnVisibilityModel,\n [field]: false,\n });\n }}\n onManageColumns={() => setColumnsPanelOpen(true)}\n onPinColumn={(field, side) => {\n const left = [...(pinnedColumns?.left ?? [])];\n const right = [...(pinnedColumns?.right ?? [])];\n\n const cleanLeft = left.filter(f => f !== field);\n const cleanRight = right.filter(f => f !== field);\n if (side === 'left') {\n handlePinnedColumnsChange({ left: [...cleanLeft, field], right: cleanRight });\n } else if (side === 'right') {\n handlePinnedColumnsChange({ left: cleanLeft, right: [...cleanRight, field] });\n } else {\n handlePinnedColumnsChange({ left: cleanLeft, right: cleanRight });\n }\n }}\n />\n\n {/* Empty State Overlay (Standard View) — showing after header */}\n {!effectiveLoading && !state.dataSource.error && filteredRows.length === 0 && (\n <GridEmptyState noRowsLabel={effectiveNoRowsLabel} width={virtualization.totalWidth} />\n )}\n\n <GridPinnedRows<R>\n rows={pinnedTopRows}\n position=\"top\"\n columns={virtualization.virtualColumns}\n selectedRowIds={selectedRowIds}\n checkboxSelection={checkboxSelection}\n onRowClick={handleRowClick}\n onCellClick={handleCellClick}\n onSelectionChange={handleSelectionChange}\n columnWidths={columnWidths}\n pinnedColumns={effectivePinnedColumns}\n pinnedRows={pinnedRows}\n hasDetailPanel={hasDetailPanel}\n expandedRowIds={expandedRowIds}\n getDetailPanelContent={getDetailPanelContent}\n getDetailPanelHeight={getDetailPanelHeight}\n onDetailPanelToggle={handleDetailPanelToggle}\n pinCheckboxColumn={pinCheckboxColumn}\n pinExpandColumn={pinExpandColumn}\n focusedCell={focusedCell}\n colspanMap={spanning.colspanMap}\n rowSpanningCaches={spanning.rowSpanningState.caches}\n rowHeight={effectiveRowHeight}\n rowMetaMap={rowMetaMap}\n />\n\n <GridVirtualRows<R>\n virtualContainerHeight={virtualization.totalHeight - virtualization.pinnedTopHeight - virtualization.pinnedBottomHeight}\n offsetTop={virtualization.offsetTop}\n effectiveLoading={effectiveLoading}\n visibleRows={visibleRows}\n baseColumns={columns as unknown as GridColDef<R>[]}\n virtualColumns={virtualization.virtualColumns}\n viewportWidth={state.dimensions.viewportWidth}\n checkboxSelection={checkboxSelection}\n hasDetailPanel={hasDetailPanel}\n rowReordering={rowReordering}\n rowHeight={effectiveRowHeight}\n pinnedRows={pinnedRows}\n selectedRowIds={selectedRowIds}\n onRowClick={handleRowClick}\n onCellClick={handleCellClick}\n onSelectionChange={handleSelectionChange}\n columnWidths={columnWidths}\n pinnedColumns={effectivePinnedColumns}\n expandedRowIds={expandedRowIds}\n getDetailPanelContent={getDetailPanelContent}\n getDetailPanelHeight={getDetailPanelHeight}\n onDetailPanelToggle={handleDetailPanelToggle}\n pinCheckboxColumn={pinCheckboxColumn}\n pinExpandColumn={pinExpandColumn}\n rowReorderHandlers={rowReorderHandlers}\n editingHandlers={editingHandlers}\n focusedCell={focusedCell}\n colspanMap={spanning.colspanMap}\n rowSpanningCaches={spanning.rowSpanningState.caches}\n paginationMode={paginationMode}\n dataSourceLoading={state.dataSource.loading}\n sortedUnpinnedRowCount={sortedUnpinnedRows.length}\n infiniteScrollSkeletonCount={Math.min(effectivePaginationModel.pageSize, 20)}\n unpinnedRowsLength={layout.unpinnedRowsLength}\n rowMetaMap={rowMetaMap}\n />\n\n <GridPinnedRows<R>\n rows={pinnedBottomRows}\n position=\"bottom\"\n columns={virtualization.virtualColumns}\n selectedRowIds={selectedRowIds}\n checkboxSelection={checkboxSelection}\n onRowClick={handleRowClick}\n onCellClick={handleCellClick}\n onSelectionChange={handleSelectionChange}\n columnWidths={columnWidths}\n pinnedColumns={effectivePinnedColumns}\n pinnedRows={pinnedRows}\n hasDetailPanel={hasDetailPanel}\n expandedRowIds={expandedRowIds}\n getDetailPanelContent={getDetailPanelContent}\n getDetailPanelHeight={getDetailPanelHeight}\n onDetailPanelToggle={handleDetailPanelToggle}\n pinCheckboxColumn={pinCheckboxColumn}\n pinExpandColumn={pinExpandColumn}\n focusedCell={focusedCell}\n colspanMap={spanning.colspanMap}\n rowSpanningCaches={spanning.rowSpanningState.caches}\n rowHeight={effectiveRowHeight}\n rowMetaMap={rowMetaMap}\n />\n\n {/* Aggregation Footer Row — suppressed in pivot mode because pivot rows\n already contain pre-aggregated values with synthetic field keys\n (e.g. 'Q1\\u001frevenue\\u001fsum') that don't match aggregationModel keys. */}\n {hasAggregation && !pivotMode && (\n <GridAggregationFooter\n columns={orderedColumns as unknown as GridColDef[]}\n aggregationModel={aggregationModel}\n aggregationResult={aggregationResult}\n columnWidths={resolvedColumnWidths}\n rowHeight={effectiveRowHeight}\n checkboxSelection={checkboxSelection}\n hasDetailPanel={hasDetailPanel}\n rowReordering={rowReordering}\n pinnedColumns={effectivePinnedColumns}\n />\n )}\n\n </div>\n </div>\n )}\n\n {!listView && pagination && (() => {\n const PaginationComponent = slots?.pagination || Pagination;\n return (\n <PaginationComponent\n page={effectivePaginationModel.page}\n pageSize={effectivePaginationModel.pageSize}\n rowCount={state.pagination.rowCount}\n pageSizeOptions={pageSizeOptions}\n onPageChange={(newPage: number) => handlePaginationModelChange({ ...effectivePaginationModel, page: newPage })}\n onPageSizeChange={(newPageSize: number) => handlePaginationModelChange({ ...effectivePaginationModel, pageSize: newPageSize, page: 0 })}\n localeText={localeText ? {\n paginationRowsPerPage: localeText.paginationRowsPerPage,\n paginationOf: localeText.paginationOf,\n paginationPage: localeText.paginationPage,\n } : undefined}\n {...slotProps?.pagination}\n />\n );\n })()}\n\n {/* Accessibility Live Region */}\n <div className=\"ogx-aria-live-status\" role=\"status\" aria-live=\"polite\">\n {effectiveLoading ? 'Loading data...' : ''}\n {state.dataSource.error ? `Error: ${state.dataSource.error instanceof Error ? state.dataSource.error.message : 'Unknown error'}` : ''}\n {!loading && !state.dataSource.error && (\n filteredRows.length === 0\n ? effectiveNoRowsLabel\n : (filterModel && ((filterModel.quickFilterValues?.length || 0) > 0 || (filterModel.items?.length || 0) > 0))\n ? `${filteredRows.length} ${filteredRows.length === 1 ? 'row' : 'rows'} found`\n : ''\n )}\n </div>\n\n <GridErrorOverlay error={state.dataSource.error} />\n </div>\n );\n}\n","\n\nexport interface SkeletonProps {\n rows?: number;\n columns?: number;\n}\n\nexport function Skeleton({ rows = 5, columns = 5 }: SkeletonProps) {\n return (\n <div className=\"ogx__skeleton\">\n {Array.from({ length: rows }).map((_, rowIndex) => (\n <div key={rowIndex} className=\"ogx__skeleton-row\">\n {Array.from({ length: columns }).map((_, colIndex) => (\n <div key={colIndex} className=\"ogx__skeleton-cell\">\n <div className=\"ogx__skeleton-content\" />\n </div>\n ))}\n </div>\n ))}\n </div>\n );\n}\n","import React, { useCallback, useEffect, useId, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport type {\n GridFilterModel,\n GridFilterItem,\n GridColDef,\n GridFilterOperator\n} from '../../types';\nimport { getOperatorsForType } from '../../utils/filtering';\n\n\ninterface FilterPanelProps {\n filterModel: GridFilterModel;\n columns: GridColDef[];\n onFilterModelChange: (model: GridFilterModel) => void;\n}\n\nconst NO_VALUE_OPERATORS = new Set(['isEmpty', 'isNotEmpty']);\n\nfunction getActiveFilter(items: GridFilterItem[], field: string): GridFilterItem | undefined {\n return items.find(item => 'field' in item && item.field === field) as GridFilterItem | undefined;\n}\n\nconst FilterRow: React.FC<{\n col: GridColDef;\n item: GridFilterItem | undefined;\n onChange: (item: GridFilterItem | null) => void;\n}> = ({ col, item, onChange }) => {\n const filterId = useId();\n const operators = getOperatorsForType(col.type);\n const isActive = !!item;\n const currentOperator = item?.operator ?? operators[0];\n\n // Local input state to prevent full filter-panel re-render on every keystroke\n const [localValue, setLocalValue] = useState<string>(item?.value != null ? String(item.value) : '');\n const onChangeRef = useRef(onChange);\n const itemRef = useRef(item);\n const colFieldRef = useRef(col.field);\n const operatorRef = useRef(currentOperator);\n useLayoutEffect(() => {\n onChangeRef.current = onChange;\n itemRef.current = item;\n colFieldRef.current = col.field;\n operatorRef.current = currentOperator;\n });\n\n // Sync when the external item changes (e.g. operator change, clear)\n const prevItemValue = useRef(item?.value);\n useEffect(() => {\n if (item?.value !== prevItemValue.current) {\n prevItemValue.current = item?.value;\n setLocalValue(item?.value != null ? String(item.value) : '');\n }\n }, [item?.value]);\n\n // Debounce propagating the value upward (300ms)\n useEffect(() => {\n const handler = setTimeout(() => {\n const currentItem = itemRef.current;\n const currentValue = currentItem?.value ?? '';\n if (localValue !== currentValue) {\n onChangeRef.current({\n id: currentItem?.id ?? `${colFieldRef.current}-${Date.now()}`,\n field: colFieldRef.current,\n operator: operatorRef.current as GridFilterOperator,\n value: localValue,\n });\n }\n }, 300);\n return () => clearTimeout(handler);\n }, [localValue]);\n\n const handleOperatorChange = (op: string) => {\n const noValue = NO_VALUE_OPERATORS.has(op);\n const newItem: GridFilterItem = {\n id: item?.id ?? `${col.field}-${Date.now()}`,\n field: col.field,\n operator: op as GridFilterOperator,\n value: noValue ? undefined : (item?.value ?? (col.type === 'boolean' ? 'true' : '')),\n };\n onChange(newItem);\n };\n\n const handleClear = () => {\n setLocalValue('');\n onChange(null);\n };\n\n const isNoValue = NO_VALUE_OPERATORS.has(String(currentOperator));\n const isBoolean = col.type === 'boolean';\n const showValue = !isNoValue;\n\n return (\n <div className={`ogx-filter__row${isActive ? ' ogx-filter__row--active' : ''}`}>\n { }\n <span className=\"ogx-filter__col-label\" title={col.field}>\n {col.headerName || col.field}\n </span>\n\n { }\n <div className=\"ogx-filter__controls\">\n { }\n <select\n id={`${filterId}-op`}\n name={`filter-op-${col.field}`}\n className={`ogx-filter__op-select${isActive ? ' ogx-filter__op-select--active' : ''}`}\n value={String(currentOperator)}\n onChange={(e) => handleOperatorChange(e.target.value)}\n aria-label={`Filter operator for ${col.headerName || col.field}`}\n >\n {operators.map(op => (\n <option key={op} value={op}>{op}</option>\n ))}\n </select>\n\n { }\n {showValue && isBoolean && (\n <select\n id={`${filterId}-val`}\n name={`filter-val-${col.field}`}\n className={`ogx-filter__value-input ogx-filter__value-select${isActive ? ' ogx-filter__value-input--active' : ''}`}\n value={String(item?.value ?? 'true')}\n onChange={(e) => {\n setLocalValue(e.target.value);\n onChange({\n id: item?.id ?? `${col.field}-${Date.now()}`,\n field: col.field,\n operator: currentOperator as GridFilterOperator,\n value: e.target.value,\n });\n }}\n aria-label={`Filter value for ${col.headerName || col.field}`}\n >\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n )}\n\n {showValue && !isBoolean && (\n <input\n id={`${filterId}-val`}\n name={`filter-val-${col.field}`}\n className={`ogx-filter__value-input${isActive ? ' ogx-filter__value-input--active' : ''}`}\n type=\"text\"\n value={localValue}\n onChange={(e) => setLocalValue(e.target.value)}\n placeholder={col.type === 'number' ? 'Number…' : 'Value…'}\n aria-label={`Filter value for ${col.headerName || col.field}`}\n />\n )}\n\n {/* Clear button — only when active */}\n {isActive && (\n <button\n className=\"ogx-filter__row-clear\"\n onClick={handleClear}\n aria-label={`Clear filter for ${col.headerName || col.field}`}\n title=\"Clear\"\n >\n ×\n </button>\n )}\n </div>\n </div>\n );\n};\n\n// ── Root panel ────────────────────────────────────────────────────────────────\n\nexport const FilterPanel: React.FC<FilterPanelProps> = ({ filterModel, columns, onFilterModelChange }) => {\n const items = useMemo<GridFilterItem[]>(() => (filterModel.items ?? []) as GridFilterItem[], [filterModel.items]);\n const logicOperator = filterModel.logicOperator ?? 'and';\n\n const handleItemChange = useCallback((field: string, newItem: GridFilterItem | null) => {\n const rest = items.filter(i => 'field' in i && (i as GridFilterItem).field !== field);\n const next: GridFilterItem[] = newItem ? [...rest, newItem] : rest;\n onFilterModelChange({ ...filterModel, items: next });\n }, [items, filterModel, onFilterModelChange]);\n\n const handleLogicChange = useCallback((op: 'and' | 'or') => {\n onFilterModelChange({ ...filterModel, logicOperator: op });\n }, [filterModel, onFilterModelChange]);\n\n const filterableColumns = columns.filter(col => col.filterable !== false);\n\n return (\n <>\n { }\n {items.length > 1 && (\n <div className=\"ogx-filter__logic-bar\">\n <span className=\"ogx-filter__logic-label\">Match:</span>\n <button\n className={`ogx-filter__logic-pill${logicOperator === 'and' ? ' ogx-filter__logic-pill--active' : ''}`}\n onClick={() => handleLogicChange('and')}\n aria-pressed={logicOperator === 'and'}\n >\n ALL (AND)\n </button>\n <button\n className={`ogx-filter__logic-pill${logicOperator === 'or' ? ' ogx-filter__logic-pill--active' : ''}`}\n onClick={() => handleLogicChange('or')}\n aria-pressed={logicOperator === 'or'}\n >\n ANY (OR)\n </button>\n </div>\n )}\n\n { }\n {filterableColumns.length === 0 ? (\n <div className=\"ogx-filter__empty\">No filterable columns.</div>\n ) : (\n filterableColumns.map(col => (\n <FilterRow\n key={col.field}\n col={col}\n item={getActiveFilter(items, col.field)}\n onChange={(item) => handleItemChange(col.field, item)}\n />\n ))\n )}\n </>\n );\n};\n","import React, { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport ReactDOM from 'react-dom';\nimport type { GridColDef } from '../../types';\nimport type { GridPivotModel, GridPivotAggFn, GridPivotValueField } from '../../types';\n\nconst AGG_FNS: GridPivotAggFn[] = ['sum', 'avg', 'count', 'min', 'max'];\n\nexport function PivotIcon() {\n return (\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" fill=\"currentColor\" opacity=\"0.25\" />\n <path d=\"M17 14v-4M17 10l-2 2 2 2\" />\n </svg>\n );\n}\n\nexport interface PivotPanelProps {\n anchorRef: React.RefObject<HTMLButtonElement | null>;\n columns: GridColDef[];\n model: GridPivotModel;\n onChange: (model: GridPivotModel) => void;\n onClose: () => void;\n}\n\nexport function PivotPanel({ anchorRef, columns, model, onChange, onClose }: PivotPanelProps) {\n const panelRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState({ top: 0, right: 0 });\n const [portalContainer, setPortalContainer] = useState<Element>(document.body);\n\n useLayoutEffect(() => {\n setPortalContainer(anchorRef.current?.closest('.ogx-theme-provider') ?? document.body);\n }, [anchorRef]);\n\n const computePos = useCallback(() => {\n if (!anchorRef.current) return { top: 0, right: 0 };\n const rect = anchorRef.current.getBoundingClientRect();\n return { top: rect.bottom + 6, right: window.innerWidth - rect.right };\n }, [anchorRef]);\n\n useEffect(() => {\n setPos(computePos());\n const update = () => setPos(computePos());\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n return () => {\n window.removeEventListener('scroll', update, true);\n window.removeEventListener('resize', update);\n };\n }, [computePos]);\n\n useEffect(() => {\n function onClick(e: MouseEvent) {\n if (\n panelRef.current && !panelRef.current.contains(e.target as Node) &&\n anchorRef.current && !anchorRef.current.contains(e.target as Node)\n ) onClose();\n }\n function onKey(e: KeyboardEvent) { if (e.key === 'Escape') onClose(); }\n document.addEventListener('mousedown', onClick);\n document.addEventListener('keydown', onKey);\n return () => {\n document.removeEventListener('mousedown', onClick);\n document.removeEventListener('keydown', onKey);\n };\n }, [anchorRef, onClose]);\n\n const inRow = new Set(model.rowFields);\n const inCol = new Set(model.columnFields);\n const inValue = new Set(model.valueFields.map((v) => v.field));\n const isUsed = (f: string) => inRow.has(f) || inCol.has(f) || inValue.has(f);\n\n function addRow(field: string) {\n if (inRow.has(field)) return;\n onChange({ ...model, rowFields: [...model.rowFields, field] });\n }\n function addCol(field: string) {\n if (inCol.has(field)) return;\n onChange({ ...model, columnFields: [...model.columnFields, field] });\n }\n function addValue(field: string, aggFn: GridPivotAggFn = 'sum') {\n if (inValue.has(field)) return;\n onChange({ ...model, valueFields: [...model.valueFields, { field, aggFn }] });\n }\n function removeRow(field: string) {\n onChange({ ...model, rowFields: model.rowFields.filter((f) => f !== field) });\n }\n function removeCol(field: string) {\n onChange({ ...model, columnFields: model.columnFields.filter((f) => f !== field) });\n }\n function removeValue(field: string) {\n onChange({ ...model, valueFields: model.valueFields.filter((v) => v.field !== field) });\n }\n function changeValueFn(field: string, aggFn: GridPivotAggFn) {\n onChange({\n ...model,\n valueFields: model.valueFields.map((v) => v.field === field ? { ...v, aggFn } : v),\n });\n }\n function reset() {\n onChange({ rowFields: [], columnFields: [], valueFields: [] });\n }\n\n const numericFields = new Set(columns.filter((c) => c.type === 'number' || c.aggregable).map((c) => c.field));\n\n const totalActive = model.rowFields.length + model.columnFields.length + model.valueFields.length;\n\n const colLabel = (field: string) =>\n columns.find((c) => c.field === field)?.headerName ?? field;\n\n const panel = (\n <div\n ref={panelRef}\n className=\"ogx-pivot-panel\"\n role=\"dialog\"\n aria-label=\"Pivot configuration\"\n style={{ top: pos.top, right: pos.right }}\n >\n { }\n <div className=\"ogx-pivot-panel__header\">\n <span className=\"ogx-pivot-panel__title\">\n <PivotIcon />\n Pivot Mode\n </span>\n {totalActive > 0 && (\n <button className=\"ogx-pivot-panel__reset-btn\" onClick={reset} title=\"Reset pivot\">\n Reset\n </button>\n )}\n </div>\n\n <div className=\"ogx-pivot-panel__body\">\n\n { }\n <div className=\"ogx-pivot-zone\">\n <span className=\"ogx-pivot-zone__label\">\n <span className=\"ogx-pivot-zone__dot ogx-pivot-zone__dot--row\" />\n Row Fields\n </span>\n <div\n className={`ogx-pivot-chips${model.rowFields.length === 0 ? ' ogx-pivot-chips--empty' : ''}`}\n data-placeholder=\"Add fields here — each becomes a row label\"\n >\n {model.rowFields.map((f) => (\n <span key={f} className=\"ogx-pivot-chip ogx-pivot-chip--row\">\n {colLabel(f)}\n <button className=\"ogx-pivot-chip__remove\" onClick={() => removeRow(f)} title={`Remove ${colLabel(f)}`}>×</button>\n </span>\n ))}\n </div>\n </div>\n\n { }\n <div className=\"ogx-pivot-zone\">\n <span className=\"ogx-pivot-zone__label\">\n <span className=\"ogx-pivot-zone__dot ogx-pivot-zone__dot--col\" />\n Column Fields\n </span>\n <div\n className={`ogx-pivot-chips${model.columnFields.length === 0 ? ' ogx-pivot-chips--empty' : ''}`}\n data-placeholder=\"Add fields here — unique values become column headers\"\n >\n {model.columnFields.map((f) => (\n <span key={f} className=\"ogx-pivot-chip ogx-pivot-chip--col\">\n {colLabel(f)}\n <button className=\"ogx-pivot-chip__remove\" onClick={() => removeCol(f)} title={`Remove ${colLabel(f)}`}>×</button>\n </span>\n ))}\n </div>\n </div>\n\n { }\n <div className=\"ogx-pivot-zone\">\n <span className=\"ogx-pivot-zone__label\">\n <span className=\"ogx-pivot-zone__dot ogx-pivot-zone__dot--value\" />\n Value Fields (aggregated)\n </span>\n <div\n className={`ogx-pivot-chips${model.valueFields.length === 0 ? ' ogx-pivot-chips--empty' : ''}`}\n data-placeholder=\"Add numeric fields here — values are aggregated\"\n >\n {model.valueFields.map((vf: GridPivotValueField) => (\n <span key={vf.field} className=\"ogx-pivot-chip ogx-pivot-chip--value\">\n {colLabel(vf.field)}\n <select\n className=\"ogx-pivot-chip__fn-select\"\n value={vf.aggFn}\n onChange={(e) => changeValueFn(vf.field, e.target.value as GridPivotAggFn)}\n title=\"Aggregation function\"\n >\n {AGG_FNS.map((fn) => (\n <option key={fn} value={fn}>{fn.toUpperCase()}</option>\n ))}\n </select>\n <button className=\"ogx-pivot-chip__remove\" onClick={() => removeValue(vf.field)} title={`Remove ${colLabel(vf.field)}`}>×</button>\n </span>\n ))}\n </div>\n </div>\n\n <hr className=\"ogx-pivot-panel__divider\" />\n\n { }\n <div>\n <div className=\"ogx-pivot-panel__fields-label\">Available Fields</div>\n <div className=\"ogx-pivot-fields\">\n {columns.map((col) => {\n const isNum = numericFields.has(col.field);\n const used = isUsed(col.field);\n if (used) return null;\n return (\n <div key={col.field} style={{ display: 'flex', alignItems: 'center', gap: 3 }}>\n <span className={`ogx-pivot-field-btn${isNum ? ' ogx-pivot-field-btn--numeric' : ''}`}>\n {col.headerName ?? col.field}\n </span>\n <div className=\"ogx-pivot-field-actions\">\n <button className=\"ogx-pivot-add-btn ogx-pivot-add-btn--row\" onClick={() => addRow(col.field)} title=\"Add to Row Fields\">Row</button>\n <button className=\"ogx-pivot-add-btn ogx-pivot-add-btn--col\" onClick={() => addCol(col.field)} title=\"Add to Column Fields\">Col</button>\n {isNum && (\n <button className=\"ogx-pivot-add-btn ogx-pivot-add-btn--value\" onClick={() => addValue(col.field)} title=\"Add to Value Fields\">Val</button>\n )}\n </div>\n </div>\n );\n })}\n {columns.every((col) => isUsed(col.field)) && (\n <span style={{ fontSize: 12, color: 'var(--ogx-color-gray-400, #94a3b8)' }}>\n All fields are in use.\n </span>\n )}\n </div>\n </div>\n\n </div>\n </div>\n );\n\n return ReactDOM.createPortal(panel, portalContainer);\n}\n","import React, { useState, useEffect, useRef, useCallback, useLayoutEffect } from 'react';\n\n\ninterface GlobalSearchProps {\n value?: string;\n onChange: (value: string) => void;\n placeholder?: string;\n debounceMs?: number;\n}\n\nfunction SearchIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n );\n}\n\nfunction CloseIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n );\n}\n\nexport function GlobalSearch({ value = '', onChange, placeholder = 'Search...', debounceMs = 250 }: GlobalSearchProps) {\n const [isExpanded, setIsExpanded] = useState(() => value.length > 0);\n // Fully uncontrolled: localValue is the single source of truth.\n const [localValue, setLocalValue] = useState(value);\n const inputRef = useRef<HTMLInputElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n // Keep onChange always current without adding it to effect deps\n const onChangeRef = useRef(onChange);\n useLayoutEffect(() => { onChangeRef.current = onChange; }, [onChange]);\n // Track the last value we emitted upward\n const lastEmittedRef = useRef(value);\n // Track the last incoming prop value to detect external resets\n const lastIncomingValueRef = useRef(value);\n // Track whether input was focused BEFORE a re-render so we can restore it\n const wasFocusedRef = useRef(false);\n\n // ── Focus preservation across re-renders ─────────────────────────────────\n // When the parent updates filterModel (triggered by our debounce), React\n // re-renders the entire tree. Even though the input element stays mounted,\n // the browser can lose focus during heavy reconciliation. We detect this\n // via useLayoutEffect (runs synchronously after DOM mutations, before paint)\n // and immediately restore focus without any visual flicker.\n useLayoutEffect(() => {\n if (wasFocusedRef.current && document.activeElement !== inputRef.current) {\n inputRef.current?.focus();\n }\n });\n\n // ── External reset detection ──────────────────────────────────────────────\n // Only responds when the PARENT programmatically changes the value\n // (e.g. \"Clear all filters\" button) — not from our own typing.\n useEffect(() => {\n if (value === lastIncomingValueRef.current) return;\n lastIncomingValueRef.current = value;\n\n if (value !== lastEmittedRef.current) {\n setLocalValue(value);\n lastEmittedRef.current = value;\n if (!value) {\n wasFocusedRef.current = false;\n setIsExpanded(false);\n } else {\n setIsExpanded(true);\n }\n }\n }, [value]);\n\n // ── Debounced upward notification ─────────────────────────────────────────\n useEffect(() => {\n const handler = setTimeout(() => {\n if (localValue !== lastEmittedRef.current) {\n lastEmittedRef.current = localValue;\n onChangeRef.current(localValue);\n }\n }, debounceMs);\n return () => clearTimeout(handler);\n }, [localValue, debounceMs]);\n\n const handleExpand = useCallback(() => {\n setIsExpanded(true);\n requestAnimationFrame(() => inputRef.current?.focus());\n }, []);\n\n const handleClear = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n setLocalValue('');\n lastEmittedRef.current = '';\n onChangeRef.current('');\n inputRef.current?.focus();\n }, []);\n\n const handleFocus = useCallback(() => {\n wasFocusedRef.current = true;\n setIsExpanded(true);\n }, []);\n\n // Blur: defer 150ms to allow focus to move within the container first\n // (e.g. clicking the clear button) before deciding to collapse.\n const handleBlur = useCallback(() => {\n wasFocusedRef.current = false;\n setTimeout(() => {\n if (\n containerRef.current &&\n document.activeElement &&\n containerRef.current.contains(document.activeElement)\n ) {\n // Focus is still inside — mark as focused again and abort\n wasFocusedRef.current = true;\n return;\n }\n if (!localValue) {\n setIsExpanded(false);\n }\n }, 150);\n }, [localValue]);\n\n // ── Click outside ─────────────────────────────────────────────────────────\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n if (!localValue) {\n setIsExpanded(false);\n }\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [localValue]);\n\n return (\n <div\n ref={containerRef}\n className={`ogx-global-search${isExpanded ? ' ogx-global-search--expanded' : ''}`}\n onClick={!isExpanded ? handleExpand : undefined}\n >\n <div className=\"ogx-global-search__icon-wrapper\">\n <SearchIcon />\n </div>\n <input\n ref={inputRef}\n className=\"ogx-global-search__input\"\n value={localValue}\n onChange={(e) => setLocalValue(e.target.value)}\n onFocus={handleFocus}\n onBlur={handleBlur}\n placeholder={placeholder}\n aria-label=\"Global Search\"\n autoComplete=\"off\"\n />\n {localValue && (\n <button className=\"ogx-global-search__clear\" onClick={handleClear} aria-label=\"Clear search\">\n <CloseIcon />\n </button>\n )}\n </div>\n );\n}\n","import { useState, useRef, useLayoutEffect, useCallback } from 'react';\nimport ReactDOM from 'react-dom';\nimport './Tooltip.css';\n\ninterface GridTooltipProps {\n title: React.ReactNode;\n children: React.ReactElement;\n placement?: 'top' | 'bottom' | 'left' | 'right';\n enterDelay?: number;\n leaveDelay?: number;\n}\n\nexport function GridTooltip({\n title,\n children,\n placement = 'top',\n enterDelay = 200,\n leaveDelay = 0\n}: GridTooltipProps) {\n const [open, setOpen] = useState(false);\n const [coords, setCoords] = useState({ top: 0, left: 0 });\n const timerRef = useRef<NodeJS.Timeout | null>(null);\n const childRef = useRef<HTMLElement | null>(null);\n\n const updateCoords = useCallback(() => {\n if (!childRef.current) return;\n const rect = childRef.current.getBoundingClientRect();\n\n let t = 0;\n let l = 0;\n\n // Note: These calculations are for positioning absolute relative to document.body\n const scrollX = window.pageXOffset || document.documentElement.scrollLeft;\n const scrollY = window.pageYOffset || document.documentElement.scrollTop;\n\n if (placement === 'top') {\n t = rect.top + scrollY - 8;\n l = rect.left + scrollX + rect.width / 2;\n } else if (placement === 'bottom') {\n t = rect.bottom + scrollY + 8;\n l = rect.left + scrollX + rect.width / 2;\n }\n\n setCoords({ top: t, left: l });\n }, [placement]);\n\n useLayoutEffect(() => {\n if (open) {\n updateCoords();\n window.addEventListener('scroll', updateCoords, true);\n window.addEventListener('resize', updateCoords);\n }\n return () => {\n window.removeEventListener('scroll', updateCoords, true);\n window.removeEventListener('resize', updateCoords);\n };\n }, [open, updateCoords]);\n\n const handleMouseEnter = () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => {\n setOpen(true);\n }, enterDelay);\n };\n\n const handleMouseLeave = () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => {\n setOpen(false);\n }, leaveDelay);\n };\n\n const wrapperRef = useCallback((node: HTMLSpanElement | null) => {\n // Use the first real child element for coordinates, not the wrapper span.\n // display:contents would give zero rects; inline-block wrapper gives correct rects\n // but we want coords from the actual child for pixel-perfect placement.\n childRef.current = node ? (node.firstElementChild as HTMLElement) ?? node : null;\n }, []);\n\n return (\n <>\n <span\n ref={wrapperRef}\n style={{ display: 'inline-block', lineHeight: 0 }}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {children}\n </span>\n {open && title && ReactDOM.createPortal(\n <div\n className={`ogx-tooltip ogx-tooltip--${placement}`}\n style={{\n top: coords.top,\n left: coords.left,\n position: 'absolute',\n zIndex: 99999\n }}\n >\n {title}\n </div>,\n document.body\n )}\n </>\n );\n}\n","import React, { useState, useRef, useEffect, useCallback, useLayoutEffect } from 'react';\nimport ReactDOM from 'react-dom';\nimport type { GridColDef, GridAggregationModel, GridPivotModel, GridFilterModel } from '../../types';\nimport { PivotPanel, PivotIcon } from './PivotPanel';\nimport { GlobalSearch } from './GlobalSearch';\nimport { ColumnVisibilityPanel } from '../ColumnVisibilityPanel/ColumnVisibilityPanel';\nimport { FilterPanel } from '../FilterPanel/FilterPanel';\nimport { GridTooltip } from '../Tooltip/Tooltip';\n\n/** Props passed to a custom toolbar button renderer. */\nexport interface ToolbarButtonRenderProps {\n /** Call this to toggle the associated panel open/closed. */\n onClick: () => void;\n /** Whether the associated panel is currently open. */\n isOpen: boolean;\n /** Number of active items (filters applied, aggregations configured, etc.). */\n activeCount: number;\n}\n\n/** Props passed to a custom quick-filter renderer. */\nexport interface ToolbarQuickFilterRenderProps {\n /** Current search string. */\n value: string;\n /** Call with the new search string when the input changes. */\n onChange: (value: string) => void;\n}\n\nexport interface GridToolbarProps {\n columns?: GridColDef[];\n /** Original user-defined columns (before pivot transformation).\n * When provided, the PivotPanel shows these instead of `columns`\n * to prevent pivot-generated synthetic columns from appearing in\n * 'Available Fields' and causing infinite nested aggregations. */\n baseColumns?: GridColDef[];\n aggregationModel?: GridAggregationModel;\n onAggregationModelChange?: (model: GridAggregationModel) => void;\n pivotModel?: GridPivotModel;\n onPivotModelChange?: (model: GridPivotModel) => void;\n filterModel?: GridFilterModel;\n onFilterModelChange?: (model: GridFilterModel) => void;\n columnVisibilityModel?: Record<string, boolean>;\n onColumnVisibilityModelChange?: (model: Record<string, boolean>) => void;\n onColumnReorder?: (fromField: string, toField: string) => void;\n onColumnOrderReset?: () => void;\n forceColumnsOpen?: boolean;\n onColumnsPanelClose?: () => void;\n children?: React.ReactNode;\n rightContent?: React.ReactNode;\n style?: React.CSSProperties;\n /**\n * Replace the built-in Columns button. The columns panel still opens and\n * closes normally — only the trigger element is replaced.\n */\n renderColumnsButton?: (props: ToolbarButtonRenderProps) => React.ReactNode;\n /**\n * Replace the built-in Filters button. The filter panel still opens and\n * closes normally — only the trigger element is replaced.\n */\n renderFilterButton?: (props: ToolbarButtonRenderProps) => React.ReactNode;\n /**\n * Replace the built-in Aggregation/Summaries button. The aggregation panel\n * still opens and closes normally — only the trigger element is replaced.\n */\n renderAggregationButton?: (props: ToolbarButtonRenderProps) => React.ReactNode;\n /**\n * Render an Export button. There is no built-in export button — this slot\n * inserts your element after the Aggregation button in the toolbar action row.\n */\n renderExportButton?: () => React.ReactNode;\n /**\n * Replace the built-in quick-filter search bar. Receives the current search\n * value and an onChange handler; connect them to your own input element.\n */\n renderQuickFilter?: (props: ToolbarQuickFilterRenderProps) => React.ReactNode;\n /** Additional CSS class applied to the toolbar root element. */\n className?: string;\n /** Show columns with `hideable: false` in the Columns panel as disabled rows. Default: false. */\n showNonHideableColumns?: boolean;\n}\n\nconst AGGREGATION_FUNCTIONS = ['none', 'sum', 'avg', 'count', 'min', 'max'] as const;\n\nfunction SigmaIcon() {\n return (\n <svg\n width=\"18\" height=\"18\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"\n strokeLinecap=\"round\" strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 4H6l6 8-6 8h12\" />\n </svg>\n );\n}\n\nfunction ViewColumnIcon() {\n return (\n <svg focusable=\"false\" aria-hidden=\"true\" viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\">\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <rect x=\"8.5\" y=\"4\" width=\"7\" height=\"16\" fill=\"currentColor\" opacity=\"0.25\" />\n <line x1=\"8.5\" y1=\"4\" x2=\"8.5\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <line x1=\"15.5\" y1=\"4\" x2=\"15.5\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <line x1=\"2\" y1=\"9\" x2=\"22\" y2=\"9\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <line x1=\"2\" y1=\"14\" x2=\"22\" y2=\"14\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n </svg>\n );\n}\n\nfunction FilterIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polygon points=\"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3\" />\n </svg>\n );\n}\n\ninterface PanelPosition { top: number; right: number; }\n\nfunction AggregationPanel({\n anchorRef,\n aggregationModel,\n aggregableColumns,\n onFunctionChange,\n onClearAll,\n onClose,\n activeCount,\n}: {\n anchorRef: React.RefObject<HTMLElement | null>;\n aggregationModel: GridAggregationModel;\n aggregableColumns: GridColDef[];\n onFunctionChange: (field: string, fn: string) => void;\n onClearAll: () => void;\n onClose: () => void;\n activeCount: number;\n}) {\n const panelRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState<PanelPosition>({ top: 0, right: 0 });\n const [portalContainer, setPortalContainer] = useState<Element>(document.body);\n\n useLayoutEffect(() => {\n setPortalContainer(anchorRef.current?.closest('.ogx-theme-provider') ?? document.body);\n }, [anchorRef]);\n\n const computePos = useCallback((): PanelPosition => {\n if (!anchorRef.current) return { top: 0, right: 0 };\n const rect = anchorRef.current.getBoundingClientRect();\n return {\n top: rect.bottom + 6,\n right: window.innerWidth - rect.right,\n };\n }, [anchorRef]);\n\n useEffect(() => {\n setPos(computePos());\n const update = () => setPos(computePos());\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n return () => {\n window.removeEventListener('scroll', update, true);\n window.removeEventListener('resize', update);\n };\n }, [computePos]);\n\n useEffect(() => {\n function handleClick(e: MouseEvent) {\n if (\n panelRef.current && !panelRef.current.contains(e.target as Node) &&\n anchorRef.current && !anchorRef.current.contains(e.target as Node)\n ) {\n onClose();\n }\n }\n document.addEventListener('mousedown', handleClick);\n return () => document.removeEventListener('mousedown', handleClick);\n }, [anchorRef, onClose]);\n\n useEffect(() => {\n function onKey(e: KeyboardEvent) { if (e.key === 'Escape') onClose(); }\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [onClose]);\n\n const panel = (\n <div\n ref={panelRef}\n className=\"ogx-toolbar__panel\"\n role=\"dialog\"\n aria-label=\"Summaries configuration\"\n style={{ top: pos.top, right: pos.right, width: 400, maxWidth: 'calc(100vw - 24px)' }}\n >\n <div className=\"ogx-toolbar__panel-header\">\n <span className=\"ogx-toolbar__panel-title\">\n <SigmaIcon />\n Summaries\n </span>\n {activeCount > 0 && (\n <button\n className=\"ogx-toolbar__clear-btn\"\n onClick={onClearAll}\n title=\"Clear all summaries\"\n >\n Clear all\n </button>\n )}\n </div>\n\n <div className=\"ogx-toolbar__panel-body\">\n {aggregableColumns.length === 0 ? (\n <p className=\"ogx-toolbar__empty\">\n No aggregable columns.<br />\n Set <code>aggregable: true</code> on a column to enable.\n </p>\n ) : (\n aggregableColumns.map((col) => {\n const currentFn = aggregationModel[col.field] || 'none';\n return (\n <div key={col.field} className=\"ogx-toolbar__agg-row\">\n <span className=\"ogx-toolbar__agg-label\" title={col.field}>\n {col.headerName || col.field}\n </span>\n <div className=\"ogx-toolbar__agg-pills\">\n {AGGREGATION_FUNCTIONS.map((fn) => (\n <button\n key={fn}\n className={`ogx-toolbar__pill${currentFn === fn ? ' ogx-toolbar__pill--active' : ''}`}\n onClick={() => onFunctionChange(col.field, fn)}\n aria-pressed={currentFn === fn}\n >\n {fn}\n </button>\n ))}\n </div>\n </div>\n );\n })\n )}\n </div>\n </div>\n );\n\n return ReactDOM.createPortal(panel, portalContainer);\n}\n\nfunction ColumnsPanelWrapper({\n anchorRef,\n columns,\n visibleColumns,\n onVisibilityChange,\n onShowAll,\n onHideAll,\n onColumnReorder,\n onColumnOrderReset,\n onClose,\n showNonHideableColumns,\n}: {\n anchorRef: React.RefObject<HTMLElement | null>;\n columns: GridColDef[];\n visibleColumns: Set<string>;\n onVisibilityChange: (field: string, isVisible: boolean) => void;\n onShowAll: () => void;\n onHideAll: () => void;\n onColumnReorder?: (fromField: string, toField: string) => void;\n onColumnOrderReset?: () => void;\n onClose: () => void;\n showNonHideableColumns?: boolean;\n}) {\n const panelRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState<PanelPosition>({ top: 0, right: 0 });\n const [portalContainer, setPortalContainer] = useState<Element>(document.body);\n\n useLayoutEffect(() => {\n setPortalContainer(anchorRef.current?.closest('.ogx-theme-provider') ?? document.body);\n }, [anchorRef]);\n\n const computePos = useCallback((): PanelPosition => {\n if (!anchorRef.current) return { top: 0, right: 0 };\n const rect = anchorRef.current.getBoundingClientRect();\n return {\n top: rect.bottom + 6,\n right: window.innerWidth - rect.right,\n };\n }, [anchorRef]);\n\n useEffect(() => {\n setPos(computePos());\n const update = () => setPos(computePos());\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n return () => {\n window.removeEventListener('scroll', update, true);\n window.removeEventListener('resize', update);\n };\n }, [computePos]);\n\n useEffect(() => {\n function handleClick(e: MouseEvent) {\n if (\n panelRef.current && !panelRef.current.contains(e.target as Node) &&\n anchorRef.current && !anchorRef.current.contains(e.target as Node)\n ) {\n onClose();\n }\n }\n document.addEventListener('mousedown', handleClick);\n return () => document.removeEventListener('mousedown', handleClick);\n }, [anchorRef, onClose]);\n\n const panel = (\n <div\n ref={panelRef}\n className=\"ogx-toolbar__panel\"\n role=\"dialog\"\n aria-label=\"Column visibility\"\n style={{ top: pos.top, right: pos.right, width: 280, padding: 0 }}\n >\n <ColumnVisibilityPanel\n columns={columns}\n visibleColumns={visibleColumns}\n onVisibilityChange={onVisibilityChange}\n onShowAll={onShowAll}\n onHideAll={onHideAll}\n onColumnReorder={onColumnReorder}\n onColumnOrderReset={onColumnOrderReset}\n showNonHideableColumns={showNonHideableColumns}\n />\n </div>\n );\n\n return ReactDOM.createPortal(panel, portalContainer);\n}\n\nfunction FilterPanelWrapper({\n anchorRef,\n columns,\n filterModel,\n onFilterModelChange,\n onClose\n}: {\n anchorRef: React.RefObject<HTMLElement | null>;\n columns: GridColDef[];\n filterModel: GridFilterModel;\n onFilterModelChange: (model: GridFilterModel) => void;\n onClose: () => void;\n}) {\n const panelRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState<PanelPosition>({ top: 0, right: 0 });\n // Stable ref for onClose — prevents the mousedown effect from\n // tearing down and re-registering on every filterModel update,\n // which could fire the close callback during the re-register window.\n const onCloseRef = useRef(onClose);\n useLayoutEffect(() => { onCloseRef.current = onClose; }, [onClose]);\n const [portalContainer, setPortalContainer] = useState<Element>(document.body);\n\n useLayoutEffect(() => {\n setPortalContainer(anchorRef.current?.closest('.ogx-theme-provider') ?? document.body);\n }, [anchorRef]);\n\n const computePos = useCallback((): PanelPosition => {\n if (!anchorRef.current) return { top: 0, right: 0 };\n const rect = anchorRef.current.getBoundingClientRect();\n return {\n top: rect.bottom + 6,\n right: window.innerWidth - rect.right,\n };\n }, [anchorRef]);\n\n useEffect(() => {\n setPos(computePos());\n const update = () => setPos(computePos());\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n return () => {\n window.removeEventListener('scroll', update, true);\n window.removeEventListener('resize', update);\n };\n }, [computePos]);\n\n // Only Escape key closes the filter panel automatically.\n // Click-outside is intentionally removed: users need to type in filter\n // inputs without the panel closing. There is an explicit Close button.\n useEffect(() => {\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') onCloseRef.current();\n }\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n // Empty deps — listener is registered once and uses the stable ref\n }, []);\n\n const activeFilterCount = filterModel.items?.length ?? 0;\n\n const handleClearAll = () => {\n onFilterModelChange({ ...filterModel, items: [], logicOperator: 'and' });\n };\n\n const panel = (\n <div\n ref={panelRef}\n className=\"ogx-toolbar__panel ogx-toolbar__panel--filter\"\n role=\"dialog\"\n aria-label=\"Advanced filters\"\n style={{ top: pos.top, right: pos.right, width: 540, maxWidth: 'calc(100vw - 24px)' }}\n >\n <div className=\"ogx-toolbar__panel-header\">\n <span className=\"ogx-toolbar__panel-title\">\n <FilterIcon />\n Filters\n {activeFilterCount > 0 && (\n <span className=\"ogx-toolbar__panel-count\">{activeFilterCount}</span>\n )}\n </span>\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n {activeFilterCount > 0 && (\n <button\n className=\"ogx-toolbar__clear-btn\"\n onClick={handleClearAll}\n title=\"Clear all filters\"\n >\n Clear all\n </button>\n )}\n <button\n className=\"ogx-toolbar__close-btn\"\n onClick={() => onCloseRef.current()}\n title=\"Close filters\"\n aria-label=\"Close filters panel\"\n >\n Close\n </button>\n </div>\n </div>\n\n <div className=\"ogx-toolbar__panel-body ogx-toolbar__panel-body--filter\">\n <FilterPanel\n columns={columns}\n filterModel={filterModel}\n onFilterModelChange={onFilterModelChange}\n />\n </div>\n </div>\n );\n\n return ReactDOM.createPortal(panel, portalContainer);\n}\n\nconst EMPTY_PIVOT: GridPivotModel = { rowFields: [], columnFields: [], valueFields: [] };\n\nexport function GridToolbar({\n columns = [],\n baseColumns,\n aggregationModel = {},\n onAggregationModelChange,\n pivotModel,\n onPivotModelChange,\n filterModel,\n onFilterModelChange,\n columnVisibilityModel = {},\n onColumnVisibilityModelChange,\n onColumnReorder,\n onColumnOrderReset,\n forceColumnsOpen,\n onColumnsPanelClose,\n children,\n rightContent,\n style,\n renderColumnsButton,\n renderFilterButton,\n renderAggregationButton,\n renderExportButton,\n renderQuickFilter,\n className,\n showNonHideableColumns,\n}: GridToolbarProps) {\n const [aggOpen, setAggOpen] = useState(false);\n const [pivotOpen, setPivotOpen] = useState(false);\n const [colsOpen, setColsOpen] = useState(false);\n const [filterOpen, setFilterOpen] = useState(false);\n\n useEffect(() => {\n if (forceColumnsOpen) {\n setColsOpen(true);\n setAggOpen(false);\n setPivotOpen(false);\n setFilterOpen(false);\n }\n }, [forceColumnsOpen]);\n\n const aggButtonRef = useRef<HTMLButtonElement>(null);\n const pivotButtonRef = useRef<HTMLButtonElement>(null);\n const colsButtonRef = useRef<HTMLButtonElement>(null);\n const filterButtonRef = useRef<HTMLButtonElement>(null);\n\n // Wrapper div refs — used as panel anchors when a custom button renderer\n // is provided (the custom element doesn't expose a ref to us).\n const colsWrapperRef = useRef<HTMLDivElement>(null);\n const filterWrapperRef = useRef<HTMLDivElement>(null);\n const aggWrapperRef = useRef<HTMLDivElement>(null);\n\n const currentPivotModel = pivotModel ?? EMPTY_PIVOT;\n const pivotActive = currentPivotModel.rowFields.length > 0\n || currentPivotModel.columnFields.length > 0\n || currentPivotModel.valueFields.length > 0;\n\n const aggregableColumns = columns.filter(\n (c) => c.aggregable !== false && (c.type === 'number' || c.aggregable === true)\n );\n\n const activeCount = Object.keys(aggregationModel).filter(\n (f) => aggregationModel[f] && aggregationModel[f] !== 'none'\n ).length;\n\n const handleFunctionChange = useCallback(\n (field: string, fn: string) => {\n if (!onAggregationModelChange) return;\n const next = { ...aggregationModel };\n if (fn === 'none') {\n delete next[field];\n } else {\n next[field] = fn;\n }\n onAggregationModelChange(next);\n },\n [aggregationModel, onAggregationModelChange]\n );\n\n const clearAllAgg = useCallback(() => {\n onAggregationModelChange?.({});\n }, [onAggregationModelChange]);\n\n const handleSearchChange = useCallback((value: string) => {\n if (!onFilterModelChange) return;\n\n const values = value ? [value] : [];\n const nextModel = {\n ...(filterModel || {}),\n quickFilterValues: values,\n items: filterModel?.items || []\n };\n onFilterModelChange(nextModel);\n }, [filterModel, onFilterModelChange]);\n\n const searchValue = filterModel?.quickFilterValues?.[0] || '';\n const activeFilterCount = (filterModel?.items?.length || 0);\n\n // Column Visibility Logic\n const visibleColumns = new Set(\n columns\n .filter(col => columnVisibilityModel[col.field] !== false) // default true\n .map(col => col.field)\n );\n\n const handleVisibilityChange = useCallback((field: string, isVisible: boolean) => {\n if (!onColumnVisibilityModelChange) return;\n const next = { ...columnVisibilityModel, [field]: isVisible };\n onColumnVisibilityModelChange(next);\n }, [columnVisibilityModel, onColumnVisibilityModelChange]);\n\n // Batch show/hide — build one full model so no stale-closure overwrites\n const handleShowAllColumns = useCallback(() => {\n if (!onColumnVisibilityModelChange) return;\n const next = { ...columnVisibilityModel };\n columns.forEach(col => {\n if (col.hideable !== false) next[col.field] = true;\n });\n onColumnVisibilityModelChange(next);\n }, [columns, columnVisibilityModel, onColumnVisibilityModelChange]);\n\n const handleHideAllColumns = useCallback(() => {\n if (!onColumnVisibilityModelChange) return;\n const next = { ...columnVisibilityModel };\n columns.forEach(col => {\n if (col.hideable !== false) next[col.field] = false;\n });\n onColumnVisibilityModelChange(next);\n }, [columns, columnVisibilityModel, onColumnVisibilityModelChange]);\n\n return (\n <div className={['ogx-toolbar', className].filter(Boolean).join(' ')} role=\"toolbar\" aria-label=\"Grid toolbar\" style={style}>\n {/* Left slot — custom content */}\n {children && <div className=\"ogx-toolbar__left\">{children}</div>}\n\n {/* Spacer */}\n <div className=\"ogx-toolbar__spacer\" />\n\n {/* Right: built-in buttons */}\n <div className=\"ogx-toolbar__actions\">\n {onFilterModelChange && (\n <div className=\"ogx-toolbar__dropdown-wrapper\" style={{ marginRight: 4 }}>\n {renderQuickFilter\n ? renderQuickFilter({ value: searchValue, onChange: handleSearchChange })\n : (\n <GlobalSearch\n value={searchValue}\n onChange={handleSearchChange}\n placeholder=\"Search...\"\n />\n )\n }\n </div>\n )}\n\n {/* Columns Button */}\n {onColumnVisibilityModelChange && (\n <div ref={colsWrapperRef} className=\"ogx-toolbar__dropdown-wrapper\" style={{ marginRight: 4 }}>\n {renderColumnsButton\n ? renderColumnsButton({\n onClick: () => { setColsOpen(o => !o); setAggOpen(false); setPivotOpen(false); setFilterOpen(false); },\n isOpen: colsOpen,\n activeCount: columns.length - visibleColumns.size,\n })\n : (\n <GridTooltip title=\"Columns\">\n <button\n ref={colsButtonRef}\n className={`ogx-toolbar__icon-btn${colsOpen ? ' ogx-toolbar__icon-btn--active' : ''}`}\n aria-label=\"Manage columns\"\n onClick={() => {\n setColsOpen(!colsOpen);\n setAggOpen(false);\n setPivotOpen(false);\n setFilterOpen(false);\n }}\n >\n <ViewColumnIcon />\n </button>\n </GridTooltip>\n )\n }\n {colsOpen && (\n <ColumnsPanelWrapper\n anchorRef={renderColumnsButton ? colsWrapperRef : colsButtonRef}\n columns={columns}\n visibleColumns={visibleColumns}\n onVisibilityChange={handleVisibilityChange}\n onShowAll={handleShowAllColumns}\n onHideAll={handleHideAllColumns}\n onColumnReorder={onColumnReorder}\n onColumnOrderReset={onColumnOrderReset}\n onClose={() => { setColsOpen(false); onColumnsPanelClose?.(); }}\n showNonHideableColumns={showNonHideableColumns}\n />\n )}\n </div>\n )}\n\n {/* Filters Button */}\n {onFilterModelChange && (\n <div ref={filterWrapperRef} className=\"ogx-toolbar__dropdown-wrapper\" style={{ marginRight: 4 }}>\n {renderFilterButton\n ? renderFilterButton({\n onClick: () => { setFilterOpen(o => !o); setAggOpen(false); setPivotOpen(false); setColsOpen(false); },\n isOpen: filterOpen,\n activeCount: activeFilterCount,\n })\n : (\n <GridTooltip title=\"Filters\">\n <button\n ref={filterButtonRef}\n className={`ogx-toolbar__icon-btn${filterOpen ? ' ogx-toolbar__icon-btn--active' : ''}`}\n aria-label=\"Advanced filters\"\n onClick={() => {\n setFilterOpen(!filterOpen);\n setAggOpen(false);\n setPivotOpen(false);\n setColsOpen(false);\n }}\n >\n <FilterIcon />\n {activeFilterCount > 0 && (\n <span className=\"ogx-toolbar__dot\" aria-label=\"Filters active\" />\n )}\n </button>\n </GridTooltip>\n )\n }\n {filterOpen && (\n <FilterPanelWrapper\n anchorRef={renderFilterButton ? filterWrapperRef : filterButtonRef}\n columns={columns}\n filterModel={filterModel || { items: [] }}\n onFilterModelChange={onFilterModelChange}\n onClose={() => setFilterOpen(false)}\n />\n )}\n </div>\n )}\n\n {/* Pivot button */}\n {onPivotModelChange && (\n <div className=\"ogx-toolbar__dropdown-wrapper\" style={{ marginRight: 4 }}>\n <GridTooltip title=\"Pivot\">\n <button\n ref={pivotButtonRef}\n className={`ogx-toolbar__icon-btn${pivotOpen ? ' ogx-toolbar__icon-btn--active' : ''}`}\n aria-label=\"Configure pivot\"\n aria-expanded={pivotOpen}\n onClick={() => {\n setPivotOpen(!pivotOpen);\n setAggOpen(false);\n setColsOpen(false);\n setFilterOpen(false);\n }}\n >\n <PivotIcon />\n {pivotActive && (\n <span className=\"ogx-toolbar__dot\" aria-label=\"Pivot active\" />\n )}\n </button>\n </GridTooltip>\n\n {pivotOpen && (\n <PivotPanel\n anchorRef={pivotButtonRef}\n columns={baseColumns ?? columns}\n model={currentPivotModel}\n onChange={(m) => { onPivotModelChange?.(m); }}\n onClose={() => setPivotOpen(false)}\n />\n )}\n </div>\n )}\n\n {/* Summaries button */}\n <div ref={aggWrapperRef} className=\"ogx-toolbar__dropdown-wrapper\" style={{ marginRight: 4 }}>\n {renderAggregationButton\n ? renderAggregationButton({\n onClick: () => { setAggOpen(o => !o); setPivotOpen(false); setColsOpen(false); setFilterOpen(false); },\n isOpen: aggOpen,\n activeCount,\n })\n : (\n <GridTooltip title=\"Summaries\">\n <button\n ref={aggButtonRef}\n className={`ogx-toolbar__icon-btn${aggOpen ? ' ogx-toolbar__icon-btn--active' : ''}`}\n aria-label=\"Configure summaries\"\n aria-expanded={aggOpen}\n onClick={() => {\n setAggOpen(!aggOpen);\n setPivotOpen(false);\n setColsOpen(false);\n setFilterOpen(false);\n }}\n >\n <SigmaIcon />\n {activeCount > 0 && (\n <span className=\"ogx-toolbar__dot\" aria-label={`${activeCount} active summaries`} />\n )}\n </button>\n </GridTooltip>\n )\n }\n\n {aggOpen && (\n <AggregationPanel\n anchorRef={renderAggregationButton ? aggWrapperRef : aggButtonRef}\n aggregationModel={aggregationModel}\n aggregableColumns={aggregableColumns}\n onFunctionChange={handleFunctionChange}\n onClearAll={clearAllAgg}\n onClose={() => setAggOpen(false)}\n activeCount={activeCount}\n />\n )}\n </div>\n\n {/* Export button slot */}\n {renderExportButton && renderExportButton()}\n\n {rightContent}\n </div>\n </div>\n );\n}\n","import { useRef } from 'react';\nimport type { GridApi } from '../../types';\n\n/**\n * Hook to create a ref for the DataGrid API.\n * This ref can be passed to the `apiRef` prop of the `DataGrid` component.\n */\nexport function useGridApiRef() {\n return useRef<GridApi>(null!);\n}\n","\nimport React from 'react';\n\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n fullWidth?: boolean;\n error?: boolean;\n startAdornment?: React.ReactNode;\n endAdornment?: React.ReactNode;\n}\n\nexport const Input: React.FC<InputProps> = ({\n fullWidth = false,\n error = false,\n startAdornment,\n endAdornment,\n className = '',\n ...props\n}) => {\n const wrapperClassNames = [\n 'ogx-input-wrapper',\n fullWidth && 'ogx-input-wrapper--full-width',\n error && 'ogx-input-wrapper--error',\n props.disabled && 'ogx-input-wrapper--disabled',\n className\n ].filter(Boolean).join(' ');\n\n return (\n <div className={wrapperClassNames}>\n {startAdornment && (\n <div className=\"ogx-input__adornment ogx-input__adornment--start\">\n {startAdornment}\n </div>\n )}\n <input\n className=\"ogx-input\"\n {...props}\n />\n {endAdornment && (\n <div className=\"ogx-input__adornment ogx-input__adornment--end\">\n {endAdornment}\n </div>\n )}\n </div>\n );\n};\n","import type {\n GridColDef,\n GridRowModel,\n GridFilterModel,\n PdfExportOptions,\n GridGroupedExportRow,\n} from '../../types';\nimport { formatAggregationValue } from '../../hooks/features/useAggregation';\n\ninterface JsPDFDoc {\n save: (filename: string) => void;\n setFontSize: (size: number) => void;\n setFont: (name: string, style: string) => void;\n setTextColor: (r: number, g: number, b: number) => void;\n text: (text: string, x: number, y: number, opts?: { align?: string }) => void;\n addImage: (data: string, format: string, x: number, y: number, w: number, h: number) => void;\n line: (x1: number, y1: number, x2: number, y2: number) => void;\n setDrawColor: (r: number, g: number, b: number) => void;\n setLineWidth: (w: number) => void;\n setPage: (page: number) => void;\n lastAutoTable: { finalY: number };\n internal: {\n pageSize: { getWidth: () => number; getHeight: () => number };\n getNumberOfPages: () => number;\n };\n getNumberOfPages: () => number;\n}\n\ninterface AutoTableOptions {\n head: string[][];\n body: string[][];\n foot?: string[][];\n startY?: number;\n styles?: Record<string, unknown>;\n headStyles?: Record<string, unknown>;\n alternateRowStyles?: Record<string, unknown>;\n footStyles?: Record<string, unknown>;\n columnStyles?: Record<number, { cellWidth: number }>;\n showFoot?: string;\n showHead?: string;\n margin?: { top: number; left: number; right: number; bottom: number };\n}\n\nfunction hexToRgb(hex: string): [number, number, number] {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n if (!result) return [79, 70, 229];\n return [\n parseInt(result[1], 16),\n parseInt(result[2], 16),\n parseInt(result[3], 16),\n ];\n}\n\nfunction getExportColumns<R extends GridRowModel>(columns: GridColDef<R>[]): GridColDef<R>[] {\n return columns.filter(col => {\n if (col.exportable === false) return false;\n if (col.field === '__check__' || col.field === '__actions__') return false;\n return true;\n });\n}\n\nfunction resolveValue<R extends GridRowModel>(row: R, col: GridColDef<R>): string {\n let value: unknown = (row as GridRowModel)[col.field];\n if (col.valueGetter) {\n value = col.valueGetter({ row, field: col.field, value });\n }\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n return String(value ?? '');\n}\n\nfunction colWeight<R extends GridRowModel>(col: GridColDef<R>): number {\n const w = typeof col.width === 'number' ? col.width : undefined;\n return w ?? (col.flex ?? 1) * 100;\n}\n\nfunction computeColumnStyles<R extends GridRowModel>(\n columns: GridColDef<R>[],\n usableWidth: number\n): Record<number, { cellWidth: number }> {\n const totalWeight = columns.reduce((sum, col) => sum + colWeight(col), 0);\n const styles: Record<number, { cellWidth: number }> = {};\n columns.forEach((col, i) => {\n styles[i] = { cellWidth: (colWeight(col) / totalWeight) * usableWidth };\n });\n return styles;\n}\n\nfunction formatFilterSummary<R extends GridRowModel>(\n filterModel: GridFilterModel,\n columns: GridColDef<R>[]\n): string {\n if (!filterModel.items || filterModel.items.length === 0) return '';\n return filterModel.items\n .flatMap(item => {\n // Only handle leaf GridFilterItem — skip GridFilterGroup (which has 'items')\n if ('items' in item) return [];\n const col = columns.find(c => c.field === item.field);\n const label = col?.headerName ?? item.field;\n const val = item.value !== undefined && item.value !== null ? String(item.value) : '';\n return [`${label} ${item.operator} \"${val}\"`];\n })\n .join(' • ');\n}\n\nexport async function exportToPdf<R extends GridRowModel>(\n rows: R[],\n columns: GridColDef<R>[],\n options: PdfExportOptions = {}\n): Promise<void> {\n // Lazy-load peer deps — provides a clear error if not installed\n let JsPDF: new (opts: Record<string, unknown>) => JsPDFDoc;\n let autoTable: (doc: JsPDFDoc, opts: AutoTableOptions) => void;\n try {\n const [jspdfMod, autoTableMod] = await Promise.all([\n import('jspdf'),\n import('jspdf-autotable'),\n ]);\n JsPDF = jspdfMod.default as unknown as new (opts: Record<string, unknown>) => JsPDFDoc;\n autoTable = autoTableMod.default as unknown as (doc: JsPDFDoc, opts: AutoTableOptions) => void;\n } catch {\n throw new Error(\n \"exportToPdf requires 'jspdf' and 'jspdf-autotable'. Run: npm install jspdf jspdf-autotable\"\n );\n }\n\n const {\n fileName = 'export',\n title,\n logoUrl,\n orientation = 'landscape',\n selectedRows,\n aggregationResult,\n aggregationModel,\n filterModel,\n alternateRowColor = true,\n headerBackgroundColor = '#4f46e5',\n headerTextColor = '#ffffff',\n fontSize = 9,\n groupedRows,\n } = options;\n\n const doc = new JsPDF({ orientation, unit: 'mm', format: 'a4' });\n const pageWidth = doc.internal.pageSize.getWidth();\n const pageHeight = doc.internal.pageSize.getHeight();\n const MARGIN = 14;\n const usableWidth = pageWidth - MARGIN * 2;\n\n const exportColumns = getExportColumns(columns);\n const rowsToExport = selectedRows && selectedRows.length > 0\n ? rows.filter(r => selectedRows.includes(r.id as string | number))\n : rows;\n\n // --- Header block ---\n let startY = MARGIN;\n\n if (title) {\n let cursorX = MARGIN;\n let cursorY = MARGIN + 8;\n\n if (logoUrl) {\n try {\n doc.addImage(logoUrl, 'PNG', cursorX, MARGIN, 10, 10);\n cursorX += 14;\n } catch {\n // logo failed to load — skip silently\n }\n }\n\n doc.setFontSize(16);\n doc.setFont('helvetica', 'bold');\n doc.setTextColor(30, 41, 59);\n doc.text(title, cursorX, cursorY);\n cursorY += 6;\n\n doc.setFontSize(8);\n doc.setFont('helvetica', 'normal');\n doc.setTextColor(100, 116, 139);\n const exportedAt = new Date().toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' });\n const rowCount = groupedRows\n ? groupedRows.filter(e => e.type === 'leaf').length\n : rowsToExport.length;\n doc.text(\n `Exported: ${exportedAt} • ${rowCount} row${rowCount !== 1 ? 's' : ''}`,\n cursorX,\n cursorY\n );\n cursorY += 5;\n\n if (filterModel) {\n const summary = formatFilterSummary(filterModel, columns);\n if (summary) {\n doc.text(`Filters: ${summary}`, cursorX, cursorY);\n cursorY += 5;\n }\n }\n\n doc.setDrawColor(226, 232, 240);\n doc.setLineWidth(0.3);\n doc.line(MARGIN, cursorY + 2, pageWidth - MARGIN, cursorY + 2);\n startY = cursorY + 6;\n }\n\n // --- Build table data ---\n const head = [exportColumns.map(col => col.headerName ?? col.field)];\n\n let body: string[][];\n let foot: string[][] | undefined;\n\n if (groupedRows && groupedRows.length > 0) {\n // Grouped export: flatten the ordered list into body rows with indentation\n body = [];\n const aggMod = aggregationModel || {};\n groupedRows.forEach((entry: GridGroupedExportRow) => {\n if (entry.type === 'group-header') {\n const indent = ' '.repeat(entry.depth * 2);\n const label = `${indent}${entry.groupField ?? ''}: ${String(entry.groupValue ?? '')}`;\n body.push(exportColumns.map((_, i) => i === 0 ? label : ''));\n } else if (entry.type === 'leaf' && entry.row) {\n const row = entry.row as R;\n const indent = ' '.repeat(entry.depth * 2);\n body.push(exportColumns.map((col, i) => (i === 0 ? indent : '') + resolveValue(row, col)));\n } else if (entry.type === 'group-subtotal' && entry.aggregatedValues) {\n const indent = ' '.repeat(entry.depth * 2);\n body.push(exportColumns.map((col, i) => {\n if (i === 0) return `${indent}Subtotal`;\n const aggVal = entry.aggregatedValues![col.field];\n if (aggVal === undefined || aggVal === null) return '';\n let formatted: unknown = aggVal;\n if (col.valueFormatter) formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n else if (aggMod[col.field]) formatted = formatAggregationValue(aggVal, aggMod[col.field] as string);\n return String(formatted);\n }));\n } else if (entry.type === 'grand-total' && entry.aggregatedValues) {\n const footRow = exportColumns.map((col, i) => {\n if (i === 0) return 'Grand Total';\n const aggVal = entry.aggregatedValues![col.field];\n if (aggVal === undefined || aggVal === null) return '';\n let formatted: unknown = aggVal;\n if (col.valueFormatter) formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n else if (aggMod[col.field]) formatted = formatAggregationValue(aggVal, aggMod[col.field] as string);\n return String(formatted);\n });\n foot = [footRow];\n }\n });\n } else {\n body = rowsToExport.map(row => exportColumns.map(col => resolveValue(row, col)));\n\n if (aggregationResult && aggregationModel) {\n const footRow = exportColumns.map((col, i) => {\n if (i === 0) {\n const hasAgg = exportColumns.some(c => aggregationModel[c.field]);\n return hasAgg ? 'TOTAL' : '';\n }\n const aggVal = aggregationResult[col.field];\n if (aggVal === undefined || aggVal === null) return '';\n let formatted: unknown = aggVal;\n if (col.valueFormatter) {\n formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n } else if (aggregationModel[col.field]) {\n formatted = formatAggregationValue(aggVal, aggregationModel[col.field] as string);\n }\n return String(formatted);\n });\n foot = [footRow];\n }\n }\n\n // --- Column widths ---\n const columnStyles = computeColumnStyles(exportColumns, usableWidth);\n\n const [hr, hg, hb] = hexToRgb(headerBackgroundColor);\n const [tr, tg, tb] = hexToRgb(headerTextColor);\n\n autoTable(doc, {\n head,\n body,\n ...(foot ? { foot } : {}),\n startY,\n styles: { fontSize, cellPadding: 3, font: 'helvetica', overflow: 'linebreak' },\n headStyles: {\n fillColor: [hr, hg, hb],\n textColor: [tr, tg, tb],\n fontStyle: 'bold',\n },\n ...(alternateRowColor\n ? { alternateRowStyles: { fillColor: [248, 250, 252] } }\n : {}),\n ...(foot\n ? { footStyles: { fillColor: [241, 245, 249], fontStyle: 'bold', textColor: [0, 0, 0] } }\n : {}),\n columnStyles,\n showFoot: foot ? 'lastPage' : 'never',\n showHead: 'everyPage',\n margin: { top: MARGIN, left: MARGIN, right: MARGIN, bottom: MARGIN + 6 },\n });\n\n // Two-pass page numbering — stamp all pages after the table is fully rendered\n // so each stamp reads the correct final total (not the running count during draw)\n const totalPages = doc.getNumberOfPages();\n for (let i = 1; i <= totalPages; i++) {\n doc.setPage(i);\n doc.setFontSize(8);\n doc.setTextColor(150, 150, 150);\n doc.text(\n `Page ${i} of ${totalPages}`,\n pageWidth - MARGIN,\n pageHeight - 8,\n { align: 'right' }\n );\n }\n\n doc.save(`${fileName}.pdf`);\n}\n","\nimport type { GridColDef, GridRowModel, GridAggregationModel, GridGroupedExportRow } from '../../types';\nimport { formatAggregationValue } from '../../hooks/features/useAggregation';\n\nexport interface CsvExportOptions {\n fileName?: string;\n includeHeaders?: boolean;\n delimiter?: string;\n selectedRows?: (string | number)[];\n aggregationResult?: Record<string, unknown> | null;\n aggregationModel?: GridAggregationModel | null;\n /** When provided, emits group headers, leaf rows, subtotals, and a grand total instead of a flat row list. */\n groupedRows?: GridGroupedExportRow[];\n}\n\nexport function exportToCsv<R extends GridRowModel>(\n rows: R[],\n columns: GridColDef<R>[],\n options: CsvExportOptions = {}\n): void {\n const {\n fileName = 'export.csv',\n includeHeaders = true,\n delimiter = ',',\n selectedRows,\n groupedRows,\n } = options;\n\n const exportColumns = columns.filter(col => {\n if (col.exportable === false) return false;\n if (col.field === '__check__' || col.field === '__actions__') return false;\n return true;\n });\n\n let csvContent = '';\n\n if (groupedRows && groupedRows.length > 0) {\n // Grouped export path\n if (includeHeaders) {\n csvContent += exportColumns.map(col => escapeCSV(col.headerName || col.field)).join(delimiter) + '\\n';\n }\n groupedRows.forEach(entry => {\n if (entry.type === 'group-header') {\n const indent = ' '.repeat(entry.depth);\n const label = `${indent}${entry.groupField ?? ''}: ${String(entry.groupValue ?? '')}`;\n const cells = exportColumns.map((_, i) => i === 0 ? escapeCSV(label) : '');\n csvContent += cells.join(delimiter) + '\\n';\n } else if (entry.type === 'leaf' && entry.row) {\n const row = entry.row as R;\n const indent = ' '.repeat(entry.depth);\n const cells = exportColumns.map((col, i) => {\n let value: unknown = (row as GridRowModel)[col.field];\n if (col.valueGetter) value = col.valueGetter({ row, field: col.field, value });\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n return escapeCSV((i === 0 ? indent : '') + String(value ?? ''));\n });\n csvContent += cells.join(delimiter) + '\\n';\n } else if (entry.type === 'group-subtotal' && entry.aggregatedValues) {\n const indent = ' '.repeat(entry.depth);\n const aggModel = options.aggregationModel || {};\n const cells = exportColumns.map((col, i) => {\n if (i === 0) return escapeCSV(`${indent}Subtotal`);\n const aggVal = entry.aggregatedValues![col.field];\n if (aggVal !== undefined && aggVal !== null) {\n let formatted: unknown = aggVal;\n if (col.valueFormatter) {\n formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n } else if (aggModel[col.field]) {\n formatted = formatAggregationValue(aggVal, aggModel[col.field]);\n }\n return escapeCSV(String(formatted));\n }\n return '';\n });\n csvContent += cells.join(delimiter) + '\\n';\n } else if (entry.type === 'grand-total' && entry.aggregatedValues) {\n const aggModel = options.aggregationModel || {};\n const cells = exportColumns.map((col, i) => {\n if (i === 0) return escapeCSV('Grand Total');\n const aggVal = entry.aggregatedValues![col.field];\n if (aggVal !== undefined && aggVal !== null) {\n let formatted: unknown = aggVal;\n if (col.valueFormatter) {\n formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n } else if (aggModel[col.field]) {\n formatted = formatAggregationValue(aggVal, aggModel[col.field]);\n }\n return escapeCSV(String(formatted));\n }\n return '';\n });\n csvContent += cells.join(delimiter) + '\\n';\n }\n });\n } else {\n // Flat export path (existing behavior)\n const rowsToExport = selectedRows && selectedRows.length > 0\n ? rows.filter(r => selectedRows.includes(r.id))\n : rows;\n\n if (rowsToExport.length === 0) {\n console.warn('No rows to export');\n return;\n }\n\n if (includeHeaders) {\n csvContent += exportColumns.map(col => escapeCSV(col.headerName || col.field)).join(delimiter) + '\\n';\n }\n\n rowsToExport.forEach(row => {\n const values = exportColumns.map(col => {\n let value: unknown = (row as GridRowModel)[col.field];\n if (col.valueGetter) value = col.valueGetter({ row, field: col.field, value });\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n return escapeCSV(String(value ?? ''));\n });\n csvContent += values.join(delimiter) + '\\n';\n });\n\n if (options.aggregationResult) {\n const aggResult = options.aggregationResult;\n const aggModel = options.aggregationModel || {};\n const aggLabels = exportColumns.map(col => escapeCSV(aggModel[col.field] ? aggModel[col.field].toUpperCase() : ''));\n csvContent += aggLabels.join(delimiter) + '\\n';\n const aggValues = exportColumns.map(col => {\n const aggVal = aggResult[col.field];\n if (aggVal !== undefined && aggVal !== null) {\n let formatted: unknown = aggVal;\n if (col.valueFormatter) formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n else if (aggModel[col.field]) formatted = formatAggregationValue(aggVal, aggModel[col.field]);\n return escapeCSV(String(formatted));\n }\n return '';\n });\n csvContent += aggValues.join(delimiter) + '\\n';\n }\n }\n\n downloadFile(csvContent, fileName, 'text/csv;charset=utf-8;');\n}\n\nfunction escapeCSV(value: string): string {\n if (value.includes(',') || value.includes('\"') || value.includes('\\n')) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n}\n\nexport interface ExcelExportOptions {\n fileName?: string;\n sheetName?: string;\n includeHeaders?: boolean;\n selectedRows?: (string | number)[];\n aggregationResult?: Record<string, unknown> | null;\n aggregationModel?: GridAggregationModel | null;\n /** When provided, emits group headers, leaf rows, subtotals, and a grand total instead of a flat row list. */\n groupedRows?: GridGroupedExportRow[];\n}\n\nexport function exportToExcel<R extends GridRowModel>(\n rows: R[],\n columns: GridColDef<R>[],\n options: ExcelExportOptions = {}\n): void {\n const {\n fileName = 'export.xls',\n sheetName = 'Sheet1',\n includeHeaders = true,\n selectedRows,\n groupedRows,\n } = options;\n\n const exportColumns = columns.filter(col => {\n if (col.exportable === false) return false;\n if (col.field === '__check__' || col.field === '__actions__') return false;\n return true;\n });\n\n const header = '<html xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:x=\"urn:schemas-microsoft-com:office:excel\" xmlns=\"http://www.w3.org/TR/REC-html40\">'\n + '<head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>'\n + `<x:Name>${sheetName}</x:Name>`\n + '<x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]-->'\n + '<meta charset=\"UTF-8\"></head><body><table border=\"1\">';\n\n let html = header;\n\n if (includeHeaders) {\n html += '<thead><tr>';\n exportColumns.forEach(col => { html += `<th>${escapeHTML(col.headerName || col.field)}</th>`; });\n html += '</tr></thead>';\n }\n\n html += '<tbody>';\n\n if (groupedRows && groupedRows.length > 0) {\n const aggModel = options.aggregationModel || {};\n groupedRows.forEach(entry => {\n if (entry.type === 'group-header') {\n const indent = '  '.repeat(entry.depth * 2);\n const label = `${indent}${entry.groupField ?? ''}: ${String(entry.groupValue ?? '')}`;\n html += `<tr style=\"font-weight:bold;background:#e8eaf6;\">`;\n html += `<td colspan=\"${exportColumns.length}\">${escapeHTML(label)}</td>`;\n html += '</tr>';\n } else if (entry.type === 'leaf' && entry.row) {\n const row = entry.row as R;\n const indent = '  '.repeat(entry.depth * 2);\n html += '<tr>';\n exportColumns.forEach((col, i) => {\n let value: unknown = (row as GridRowModel)[col.field];\n if (col.valueGetter) value = col.valueGetter({ row, field: col.field, value });\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n html += `<td>${escapeHTML((i === 0 ? indent : '') + String(value ?? ''))}</td>`;\n });\n html += '</tr>';\n } else if ((entry.type === 'group-subtotal' || entry.type === 'grand-total') && entry.aggregatedValues) {\n const isGrand = entry.type === 'grand-total';\n const indent = isGrand ? '' : '  '.repeat(entry.depth * 2);\n const label = isGrand ? 'Grand Total' : `${indent}Subtotal`;\n html += `<tr style=\"font-weight:bold;background:#f5f5f5;\">`;\n exportColumns.forEach((col, i) => {\n if (i === 0) { html += `<td>${escapeHTML(label)}</td>`; return; }\n const aggVal = entry.aggregatedValues![col.field];\n if (aggVal !== undefined && aggVal !== null) {\n let formatted: unknown = aggVal;\n if (col.valueFormatter) formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n else if (aggModel[col.field]) formatted = formatAggregationValue(aggVal, aggModel[col.field]);\n html += `<td style=\"text-align:right;\">${escapeHTML(String(formatted))}</td>`;\n } else {\n html += '<td></td>';\n }\n });\n html += '</tr>';\n }\n });\n } else {\n const rowsToExport = selectedRows && selectedRows.length > 0\n ? rows.filter(r => selectedRows.includes(r.id))\n : rows;\n\n if (rowsToExport.length === 0) {\n console.warn('No rows to export');\n return;\n }\n\n rowsToExport.forEach(row => {\n html += '<tr>';\n exportColumns.forEach(col => {\n let value: unknown = (row as GridRowModel)[col.field];\n if (col.valueGetter) value = col.valueGetter({ row, field: col.field, value });\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n html += `<td>${escapeHTML(String(value ?? ''))}</td>`;\n });\n html += '</tr>';\n });\n\n if (options.aggregationResult) {\n const aggResult = options.aggregationResult;\n const aggModel = options.aggregationModel || {};\n html += '<tr style=\"font-size: 11px; color: #666; background-color: #f5f5f5;\">';\n exportColumns.forEach(col => {\n html += aggModel[col.field]\n ? `<td style=\"text-align:right;font-weight:bold;\">${escapeHTML(aggModel[col.field].toUpperCase())}</td>`\n : '<td></td>';\n });\n html += '</tr><tr style=\"font-weight:bold;background-color:#f5f5f5;\">';\n exportColumns.forEach(col => {\n const aggVal = aggResult[col.field];\n if (aggVal !== undefined && aggVal !== null) {\n let formatted: unknown = aggVal;\n if (col.valueFormatter) formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n else if (aggModel[col.field]) formatted = formatAggregationValue(aggVal, aggModel[col.field]);\n html += `<td style=\"text-align:right;\">${escapeHTML(String(formatted))}</td>`;\n } else {\n html += '<td></td>';\n }\n });\n html += '</tr>';\n }\n }\n\n html += '</tbody></table></body></html>';\n downloadFile(html, fileName, 'application/vnd.ms-excel');\n}\n\nfunction escapeHTML(value: string): string {\n return value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\n}\n\n// ============================================================================\n// JSON Export\n// ============================================================================\n\nexport interface JsonExportOptions {\n fileName?: string;\n pretty?: boolean;\n selectedRows?: (string | number)[];\n aggregationResult?: Record<string, unknown> | null;\n aggregationModel?: GridAggregationModel | null;\n /** When provided, emits a nested grouping tree instead of a flat array. */\n groupedRows?: GridGroupedExportRow[];\n}\n\n/**\n * Export data to JSON format\n */\nexport function exportToJson<R extends GridRowModel>(\n rows: R[],\n columns: GridColDef<R>[],\n options: JsonExportOptions = {}\n): void {\n const {\n fileName = 'export.json',\n pretty = true,\n selectedRows,\n groupedRows,\n } = options;\n\n const exportColumns = columns.filter(col => {\n if (col.exportable === false) return false;\n if (col.field === '__check__' || col.field === '__actions__') return false;\n return true;\n });\n\n type GroupNode = {\n group: string;\n field: string;\n value: unknown;\n rows: Record<string, unknown>[];\n subtotals?: Record<string, unknown>;\n children?: GroupNode[];\n };\n\n type JsonPayload =\n | Record<string, unknown>[]\n | { data: Record<string, unknown>[]; aggregation: { labels: Record<string, unknown>; values: Record<string, unknown> } }\n | { groups: GroupNode[]; grandTotal?: Record<string, unknown> };\n\n let outData: JsonPayload;\n\n if (groupedRows && groupedRows.length > 0) {\n // Build nested tree from the flat ordered list\n const stack: GroupNode[] = [];\n const roots: GroupNode[] = [];\n let grandTotal: Record<string, unknown> | undefined;\n\n groupedRows.forEach(entry => {\n if (entry.type === 'group-header') {\n const node: GroupNode = {\n group: `${entry.groupField ?? ''}: ${String(entry.groupValue ?? '')}`,\n field: entry.groupField ?? '',\n value: entry.groupValue,\n rows: [],\n children: [],\n };\n while (stack.length > entry.depth) stack.pop();\n if (stack.length === 0) {\n roots.push(node);\n } else {\n (stack[stack.length - 1].children ??= []).push(node);\n }\n stack.push(node);\n } else if (entry.type === 'leaf' && entry.row) {\n const row = entry.row as R;\n const obj: Record<string, unknown> = {};\n exportColumns.forEach(col => {\n let value: unknown = (row as GridRowModel)[col.field];\n if (col.valueGetter) value = col.valueGetter({ row, field: col.field, value });\n obj[col.field] = value;\n });\n if (stack.length > 0) stack[stack.length - 1].rows.push(obj);\n } else if (entry.type === 'group-subtotal' && entry.aggregatedValues && stack.length > 0) {\n stack[stack.length - 1].subtotals = { ...entry.aggregatedValues };\n stack.pop();\n } else if (entry.type === 'grand-total' && entry.aggregatedValues) {\n grandTotal = { ...entry.aggregatedValues };\n }\n });\n\n outData = grandTotal ? { groups: roots, grandTotal } : { groups: roots };\n } else {\n const rowsToExport = selectedRows && selectedRows.length > 0\n ? rows.filter(r => selectedRows.includes(r.id))\n : rows;\n\n if (rowsToExport.length === 0) {\n console.warn('No rows to export');\n return;\n }\n\n const data = rowsToExport.map(row => {\n const obj: Record<string, unknown> = {};\n exportColumns.forEach(col => {\n let value: unknown = (row as GridRowModel)[col.field];\n if (col.valueGetter) value = col.valueGetter({ row, field: col.field, value });\n obj[col.field] = value;\n });\n return obj;\n });\n\n if (options.aggregationResult) {\n const aggResult = options.aggregationResult;\n const aggModel = options.aggregationModel || {};\n const summaryLabelObj: Record<string, unknown> = {};\n exportColumns.forEach(col => { if (aggModel[col.field]) summaryLabelObj[col.field] = aggModel[col.field].toUpperCase(); });\n const summaryDataObj: Record<string, unknown> = {};\n exportColumns.forEach(col => {\n if (aggResult[col.field] !== undefined && aggResult[col.field] !== null) {\n let aggVal: unknown = aggResult[col.field];\n if (col.valueFormatter) aggVal = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n else if (aggModel[col.field]) aggVal = formatAggregationValue(aggVal, aggModel[col.field]);\n summaryDataObj[col.field] = aggVal;\n }\n });\n outData = { data, aggregation: { labels: summaryLabelObj, values: summaryDataObj } };\n } else {\n outData = data;\n }\n }\n\n downloadFile(pretty ? JSON.stringify(outData, null, 2) : JSON.stringify(outData), fileName, 'application/json;charset=utf-8;');\n}\n\n// ============================================================================\n// Print\n// ============================================================================\n\nexport interface PrintOptions {\n title?: string;\n selectedRows?: (string | number)[];\n aggregationResult?: Record<string, unknown> | null;\n aggregationModel?: GridAggregationModel | null;\n /** When provided, emits group headers, leaf rows, subtotals, and a grand total instead of a flat row list. */\n groupedRows?: GridGroupedExportRow[];\n}\n\n/**\n * Open print dialog with formatted table\n */\nexport async function printGrid<R extends GridRowModel>(\n rows: R[],\n columns: GridColDef<R>[],\n titleOrOptions?: string | PrintOptions\n): Promise<void> {\n // 1. Open window immediately to resolve user activation constraints and provide feedback\n const printWindow = window.open('', '_blank');\n\n if (!printWindow) {\n console.error('Failed to open print window. Please check your popup blocker settings.');\n return;\n }\n\n // 2. Show loading state\n printWindow.document.write(`\n <!DOCTYPE html>\n <html>\n <head>\n <title>Preparing Print...</title>\n <style>\n body { font-family: sans-serif; height: 100vh; display: flex; align-items: center; justify-content: center; margin: 0; background: #f5f5f5; }\n .loader { text-align: center; }\n .spinner { border: 4px solid #f3f3f3; border-top: 4px solid #3498db; border-radius: 50%; width: 40px; height: 40px; animation: spin 1s linear infinite; margin: 0 auto 20px; }\n @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }\n </style>\n </head>\n <body>\n <div class=\"loader\">\n <div class=\"spinner\"></div>\n <h2>Generating Print Preview...</h2>\n <p>Processing data, please wait.</p>\n </div>\n </body>\n </html>\n `);\n printWindow.document.close();\n\n // 3. Yield to main thread to allow the new window to render its loading state\n await new Promise(resolve => setTimeout(resolve, 100));\n\n try {\n let title = 'Print';\n let selectedRows: (string | number)[] | undefined;\n let aggregationResult: Record<string, unknown> | null = null;\n let aggregationModel: GridAggregationModel | null = null;\n\n let groupedRows: GridGroupedExportRow[] | undefined;\n\n if (typeof titleOrOptions === 'string') {\n title = titleOrOptions;\n } else if (typeof titleOrOptions === 'object') {\n title = titleOrOptions.title || 'Print';\n selectedRows = titleOrOptions.selectedRows;\n aggregationResult = titleOrOptions.aggregationResult || null;\n aggregationModel = titleOrOptions.aggregationModel || null;\n groupedRows = titleOrOptions.groupedRows;\n }\n\n const exportColumns = columns.filter(col => {\n if (col.exportable === false) return false;\n if (col.field === '__check__' || col.field === '__actions__') return false;\n return true;\n });\n\n let html = `<!DOCTYPE html><html><head><title>${title || 'Print'}</title><style>\n body{font-family:Arial,sans-serif;margin:20px;}\n h1{font-size:24px;margin-bottom:20px;}\n table{border-collapse:collapse;width:100%;}\n th,td{border:1px solid #ddd;padding:8px;text-align:left;}\n th{background-color:#f5f5f5;font-weight:bold;}\n tr:nth-child(even){background-color:#f9f9f9;}\n .group-header{background:#e8eaf6;font-weight:bold;}\n .group-subtotal{background:#f0f4ff;font-style:italic;}\n .grand-total{background:#f5f5f5;font-weight:bold;}\n @media print{body{margin:0;}@page{margin:1cm;}}\n </style></head><body>`;\n\n if (title) html += `<h1>${escapeHTML(title)}</h1>`;\n html += '<table><thead><tr>';\n exportColumns.forEach(col => { html += `<th>${escapeHTML(col.headerName || col.field)}</th>`; });\n html += '</tr></thead><tbody>';\n\n if (groupedRows && groupedRows.length > 0) {\n const aggModel = aggregationModel || {};\n groupedRows.forEach(entry => {\n if (entry.type === 'group-header') {\n const indent = '&nbsp;'.repeat(entry.depth * 4);\n const label = `${indent}${escapeHTML(entry.groupField ?? '')}: ${escapeHTML(String(entry.groupValue ?? ''))}`;\n html += `<tr class=\"group-header\"><td colspan=\"${exportColumns.length}\">${label}</td></tr>`;\n } else if (entry.type === 'leaf' && entry.row) {\n const row = entry.row as R;\n const indent = '&nbsp;'.repeat(entry.depth * 4);\n html += '<tr>';\n exportColumns.forEach((col, i) => {\n let value: unknown = (row as GridRowModel)[col.field];\n if (col.valueGetter) value = col.valueGetter({ row, field: col.field, value });\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n if (col.type === 'image' && value) {\n html += `<td><img src=\"${value}\" style=\"max-height:40px;border-radius:4px;\"></td>`;\n } else {\n html += `<td>${(i === 0 ? indent : '') + escapeHTML(String(value ?? ''))}</td>`;\n }\n });\n html += '</tr>';\n } else if ((entry.type === 'group-subtotal' || entry.type === 'grand-total') && entry.aggregatedValues) {\n const isGrand = entry.type === 'grand-total';\n const indent = isGrand ? '' : '&nbsp;'.repeat(entry.depth * 4);\n const label = isGrand ? 'Grand Total' : `${indent}Subtotal`;\n const cls = isGrand ? 'grand-total' : 'group-subtotal';\n html += `<tr class=\"${cls}\">`;\n exportColumns.forEach((col, i) => {\n if (i === 0) { html += `<td>${label}</td>`; return; }\n const aggVal = entry.aggregatedValues![col.field];\n if (aggVal !== undefined && aggVal !== null) {\n let formatted: unknown = aggVal;\n if (col.valueFormatter) formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n else if (aggModel[col.field]) formatted = formatAggregationValue(aggVal, aggModel[col.field]);\n html += `<td style=\"text-align:right;\">${escapeHTML(String(formatted))}</td>`;\n } else {\n html += '<td></td>';\n }\n });\n html += '</tr>';\n }\n });\n } else {\n const rowsToExport = selectedRows && selectedRows.length > 0\n ? rows.filter(r => selectedRows.includes(r.id))\n : rows;\n\n if (rowsToExport.length === 0) {\n printWindow.document.body.innerHTML = '<h3>No rows to export</h3>';\n return;\n }\n\n rowsToExport.forEach(row => {\n html += '<tr>';\n exportColumns.forEach(col => {\n let value: unknown = (row as GridRowModel)[col.field];\n if (col.valueGetter) value = col.valueGetter({ row, field: col.field, value });\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n if (col.type === 'image' && value) {\n html += `<td><div style=\"display:flex;justify-content:center;\"><img src=\"${value}\" alt=\"${col.headerName}\" style=\"max-height:40px;border-radius:4px;\"></div></td>`;\n } else {\n html += `<td>${escapeHTML(String(value ?? ''))}</td>`;\n }\n });\n html += '</tr>';\n });\n\n if (aggregationResult) {\n const aggModel = aggregationModel || {};\n html += '<tfoot><tr style=\"font-size:11px;color:#666;background-color:#f5f5f5;\">';\n exportColumns.forEach(col => {\n html += aggModel[col.field]\n ? `<td style=\"text-align:right;font-weight:bold;\">${escapeHTML(aggModel[col.field].toUpperCase())}</td>`\n : '<td></td>';\n });\n html += '</tr><tr style=\"font-weight:bold;background-color:#f5f5f5;\">';\n exportColumns.forEach(col => {\n const aggVal = aggregationResult![col.field];\n if (aggVal !== undefined && aggVal !== null) {\n let formatted: unknown = aggVal;\n if (col.valueFormatter) formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n else if (aggModel[col.field]) formatted = formatAggregationValue(aggVal, aggModel[col.field]);\n html += `<td style=\"text-align:right;\">${escapeHTML(String(formatted))}</td>`;\n } else {\n html += '<td></td>';\n }\n });\n html += '</tr></tfoot>';\n }\n }\n\n html += '</tbody></table></body></html>';\n\n // Write the HTML content\n printWindow.document.open();\n printWindow.document.write(html);\n printWindow.document.close();\n\n // Set the document title explicitly (fixes about:blank issue)\n printWindow.document.title = title || 'Print Preview';\n\n printWindow.focus();\n\n let hasPrinted = false;\n\n printWindow.onload = () => {\n if (!hasPrinted) {\n hasPrinted = true;\n printWindow.print();\n\n setTimeout(() => {\n printWindow.close();\n }, 100);\n }\n };\n\n setTimeout(() => {\n if (!hasPrinted && printWindow && !printWindow.closed) {\n hasPrinted = true;\n printWindow.print();\n setTimeout(() => {\n if (!printWindow.closed) printWindow.close();\n }, 100);\n }\n }, 500);\n\n } catch (e) {\n console.error('Print generation failed:', e);\n if (printWindow && !printWindow.closed) {\n const message = e instanceof Error ? e.message : String(e);\n printWindow.document.body.innerHTML = `<div style=\"color: red; padding: 20px;\"><h3>Error Generating Print Preview</h3><p>${message}</p></div>`;\n }\n }\n}\n\nfunction downloadFile(content: string, fileName: string, mimeType: string): void {\n const blob = new Blob([content], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = fileName;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n}\n\nexport { exportToPdf } from './exportToPdf';\nexport type { PdfExportOptions } from '../../types';\n","\nimport type { GridColDef, GridRowModel, GridAggregationModel } from '../../types';\nimport { formatAggregationValue } from '../../hooks/features/useAggregation';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface ExcelColumnStyle {\n /** Numeric format string, e.g. '$#,##0.00', '0.00%', 'yyyy-mm-dd' */\n numFmt?: string;\n /** Override column width (characters). Defaults to colDef.width / 7 */\n width?: number;\n /** Horizontal alignment override */\n alignment?: 'left' | 'center' | 'right';\n /**\n * If true, the cell value (expected to be an image URL string) will be\n * fetched and embedded as an inline image in the cell.\n * Requires the image server to serve CORS headers. Falls back to the\n * raw URL string if the fetch fails (a warning is logged to the console).\n */\n embedImage?: boolean;\n /** Width of the embedded image in pixels (default: 40) */\n imageWidth?: number;\n /** Height of the embedded image in pixels (default: 40) */\n imageHeight?: number;\n}\n\nexport interface ExcelSheetDefinition {\n /** Sheet tab name (max 31 chars) */\n name: string;\n /** Which rows to include. Default: 'all' */\n rows?: 'all' | 'selected';\n /** Include header row. Default: true */\n includeHeaders?: boolean;\n /** Include aggregation totals row at the bottom. Default: false */\n includeSummary?: boolean;\n /** Auto-filter dropdowns on header row. Default: true */\n autoFilter?: boolean;\n /** Freeze the header row. Default: true */\n frozenHeader?: boolean;\n /** Alternate row fill (#hex). Pass false to disable. Default: '#f8fafc' */\n alternateRowColor?: string | false;\n}\n\nexport interface ExcelAdvancedExportOptions {\n /** Output filename (default: 'export.xlsx') */\n fileName?: string;\n /**\n * Sheet definitions. If omitted, a single 'Data' sheet is created\n * with all rows.\n *\n * Built-in special sheet type: `{ type: 'summary' }` renders a\n * standalone aggregation sheet.\n */\n sheets?: (ExcelSheetDefinition | { type: 'summary'; name?: string })[]; \n /** Per-column style overrides, keyed by field name */\n columnStyles?: Record<string, ExcelColumnStyle>;\n /** Header row fill color (default: '#f1f5f9') */\n headerFillColor?: string;\n /** Header row text color (default: '#334155') */\n headerTextColor?: string;\n /** Header row font size (default: 10) */\n headerFontSize?: number;\n /** Body font size (default: 10) */\n bodyFontSize?: number;\n /** Current aggregation result */\n aggregationResult?: Record<string, unknown> | null;\n /** Current aggregation model */\n aggregationModel?: GridAggregationModel | null;\n /** Currently selected row IDs */\n selectedRows?: (string | number)[];\n}\n\n// ─── Cell type inference ──────────────────────────────────────────────────────\n\nfunction inferCellType(colDef: GridColDef<GridRowModel>, value: unknown): 'number' | 'boolean' | 'date' | 'string' {\n if (colDef.type === 'number') return 'number';\n if (colDef.type === 'boolean') return 'boolean';\n if (colDef.type === 'date') return 'date';\n if (typeof value === 'number') return 'number';\n if (typeof value === 'boolean') return 'boolean';\n if (value instanceof Date) return 'date';\n return 'string';\n}\n\n// ─── Default numFmt per column type ──────────────────────────────────────────\n\nfunction defaultNumFmt(colDef: GridColDef<GridRowModel>): string | undefined {\n if (colDef.type === 'number') return '#,##0.##';\n if (colDef.type === 'date') return 'yyyy-mm-dd';\n return undefined;\n}\n\n// ─── Column display width (chars) ────────────────────────────────────────────\n\nfunction colWidth(colDef: GridColDef<GridRowModel>, override?: number): number {\n if (override != null) return override;\n const px = (colDef.width ?? 120) as number;\n return Math.min(60, Math.max(8, (px - 5) / 7));\n}\n\n// ─── Image helpers ────────────────────────────────────────────────────────────\n\ntype SupportedImageExt = 'png' | 'jpeg' | 'gif';\n\nfunction imageExtension(url: string, contentType?: string | null): SupportedImageExt {\n const ct = contentType ?? '';\n if (ct.includes('jpeg') || ct.includes('jpg')) return 'jpeg';\n if (ct.includes('gif')) return 'gif';\n const path = url.split('?')[0].toLowerCase();\n if (path.endsWith('.jpg') || path.endsWith('.jpeg')) return 'jpeg';\n if (path.endsWith('.gif')) return 'gif';\n return 'png';\n}\n\n/**\n * Fetch a list of image URLs in parallel.\n * CORS failures are logged and skipped — raw URL text is written to the cell\n * instead so data is never silently lost.\n */\nasync function fetchImages(\n urls: string[]\n): Promise<Map<string, { buffer: ArrayBuffer; extension: SupportedImageExt }>> {\n const settled = await Promise.allSettled(\n urls.map(async (url) => {\n // ── data: URI — decode base64 directly, no network needed ──────────\n if (url.startsWith('data:')) {\n const commaIdx = url.indexOf(',');\n const header = url.slice(0, commaIdx);\n const b64 = url.slice(commaIdx + 1);\n const binary = atob(b64);\n const uint8 = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) uint8[i] = binary.charCodeAt(i);\n const mimeMatch = header.match(/data:([^;,]+)/);\n const mime = mimeMatch?.[1] ?? 'image/png';\n let ext: SupportedImageExt = 'png';\n if (mime.includes('jpeg') || mime.includes('jpg')) ext = 'jpeg';\n else if (mime.includes('gif')) ext = 'gif';\n return { url, buffer: uint8.buffer as ArrayBuffer, ext };\n }\n\n // ── Remote URL — fetch with CORS ──────────────────────────────────\n const res = await fetch(url, { mode: 'cors' });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const buffer = await res.arrayBuffer();\n const ext = imageExtension(url, res.headers.get('content-type'));\n return { url, buffer, ext };\n })\n );\n const map = new Map<string, { buffer: ArrayBuffer; extension: SupportedImageExt }>();\n settled.forEach((result, i) => {\n if (result.status === 'fulfilled') {\n map.set(result.value.url, { buffer: result.value.buffer, extension: result.value.ext });\n } else {\n console.warn(\n `[exportToExcelAdvanced] Cannot embed image \"${urls[i]}\" ` +\n `(CORS/network error — raw URL written as fallback):`,\n result.reason\n );\n }\n });\n return map;\n}\n\n// ─── Main export function ─────────────────────────────────────────────────────\n\n/**\n * Export the grid data to a real XLSX file using ExcelJS.\n * Supports: typed cells, styled headers, column widths, frozen rows,\n * auto-filter, alternating row colors, aggregation totals, and multi-sheet.\n *\n * ExcelJS is loaded lazily so it does not affect bundle size for apps\n * that only use CSV/JSON export.\n */\nexport async function exportToExcelAdvanced<R extends GridRowModel>(\n rows: R[],\n columns: GridColDef<R>[],\n options: ExcelAdvancedExportOptions = {}\n): Promise<void> {\n const {\n fileName = 'export.xlsx',\n sheets: sheetDefs,\n columnStyles = {},\n headerFillColor = '#f1f5f9',\n headerTextColor = '#334155',\n headerFontSize = 10,\n bodyFontSize = 10,\n aggregationResult = null,\n aggregationModel = null,\n selectedRows,\n } = options;\n\n // Lazy-load ExcelJS to keep initial bundle lean\n const ExcelJS = (await import('exceljs')).default;\n const workbook = new ExcelJS.Workbook();\n workbook.creator = 'OpenGridX';\n workbook.created = new Date();\n\n // Filter system columns\n const exportColumns: GridColDef<GridRowModel>[] = (columns as unknown as GridColDef<GridRowModel>[]).filter(col =>\n col.exportable !== false &&\n col.field !== '__check__' &&\n col.field !== '__actions__' &&\n !col.isSpacer\n );\n\n const allRows: GridRowModel[] = rows as GridRowModel[];\n const sRows: GridRowModel[] = (selectedRows && selectedRows.length > 0\n ? rows.filter(r => selectedRows.includes(r.id))\n : rows) as GridRowModel[];\n\n // Normalise sheet definitions\n const resolvedSheets: (ExcelSheetDefinition | { type: 'summary'; name?: string })[] =\n sheetDefs ?? [{ name: 'Data', rows: 'all', includeHeaders: true, includeSummary: false }];\n\n // Workbook-level image cache — one fetch per URL, reused across multiple sheets\n const imageCache = new Map<string, number>();\n\n // ─── Build each sheet ────────────────────────────────────────────────────\n\n for (const sheetDef of resolvedSheets) {\n\n // ── Summary-only sheet ───────────────────────────────────────────────\n if ('type' in sheetDef && sheetDef.type === 'summary') {\n if (!aggregationResult || !aggregationModel) continue;\n const ws = workbook.addWorksheet(sheetDef.name ?? 'Summary');\n\n // Title row\n ws.addRow(['Summary / Aggregation Totals']);\n ws.getRow(1).font = { bold: true, size: headerFontSize + 2, color: { argb: argb(headerTextColor) } };\n ws.addRow([]);\n\n // Header: Field | Function | Value\n const hdr = ws.addRow(['Column', 'Function', 'Value']);\n hdr.eachCell(cell => {\n cell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: argb(headerFillColor) } };\n cell.font = { bold: true, size: headerFontSize, color: { argb: argb(headerTextColor) } };\n cell.border = bottomBorder();\n });\n\n exportColumns.forEach(col => {\n const fn = aggregationModel![col.field];\n const val = aggregationResult![col.field];\n if (fn == null || val == null) return;\n let formatted = val;\n if (col.valueFormatter) {\n formatted = col.valueFormatter({ value: val, row: {} as R, field: col.field });\n } else {\n formatted = formatAggregationValue(val, fn);\n }\n const row = ws.addRow([col.headerName ?? col.field, fn.toUpperCase(), formatted]);\n row.getCell(3).alignment = { horizontal: 'right' };\n row.getCell(3).font = { bold: true, size: bodyFontSize };\n });\n\n ws.getColumn(1).width = 20;\n ws.getColumn(2).width = 12;\n ws.getColumn(3).width = 18;\n continue;\n }\n\n // ── Data sheet ───────────────────────────────────────────────────────\n const def = sheetDef as ExcelSheetDefinition;\n const {\n name = 'Data',\n rows: rowScope = 'all',\n includeHeaders = true,\n includeSummary = false,\n autoFilter = true,\n frozenHeader = true,\n alternateRowColor = '#f8fafc',\n } = def;\n\n const rowsToExport = rowScope === 'selected' ? sRows : allRows;\n\n // ─ Pre-fetch images for this sheet ──────────────────────────────────────────\n const imageColumns = exportColumns.filter(col => columnStyles[col.field]?.embedImage);\n if (imageColumns.length > 0) {\n const urlsNeeded: string[] = [];\n const seen = new Set<string>();\n rowsToExport.forEach(row => {\n imageColumns.forEach(col => {\n const val = row[col.field];\n if (typeof val === 'string' && val && !imageCache.has(val) && !seen.has(val)) {\n urlsNeeded.push(val);\n seen.add(val);\n }\n });\n });\n if (urlsNeeded.length > 0) {\n const fetched = await fetchImages(urlsNeeded);\n for (const [url, { buffer, extension }] of fetched) {\n const imgId = workbook.addImage({ buffer, extension });\n imageCache.set(url, imgId);\n }\n }\n }\n\n const ws = workbook.addWorksheet(name);\n\n // ── Set column definitions ───────────────────────────────────────────\n ws.columns = exportColumns.map(col => ({\n key: col.field,\n width: colWidth(col, columnStyles[col.field]?.width),\n style: {\n numFmt: columnStyles[col.field]?.numFmt ?? defaultNumFmt(col),\n }\n }));\n\n // ── Header row ───────────────────────────────────────────────────────\n if (includeHeaders) {\n const headerValues = exportColumns.map(col => col.headerName ?? col.field);\n const headerRow = ws.addRow(headerValues);\n headerRow.height = 20;\n\n headerRow.eachCell((cell, colIndex) => {\n const colDef = exportColumns[colIndex - 1];\n cell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: argb(headerFillColor) } };\n cell.font = { bold: true, size: headerFontSize, color: { argb: argb(headerTextColor) } };\n cell.alignment = {\n horizontal: columnStyles[colDef?.field]?.alignment ??\n (colDef?.type === 'number' ? 'right' : 'left'),\n vertical: 'middle'\n };\n cell.border = bottomBorder();\n });\n\n if (autoFilter) {\n ws.autoFilter = {\n from: { row: 1, column: 1 },\n to: { row: 1, column: exportColumns.length }\n };\n }\n\n if (frozenHeader) {\n ws.views = [{ state: 'frozen', ySplit: 1, showGridLines: false }];\n } else {\n ws.views = [{ showGridLines: false }];\n }\n }\n\n // ── Data rows ────────────────────────────────────────────────────────\n // ExcelJS addImage tl.row is 0-based.\n // Header occupies index 0 when present; first data row is at index 1.\n let excelRowIdx = includeHeaders ? 1 : 0;\n\n rowsToExport.forEach((row, rowIdx) => {\n const cellValues = exportColumns.map(col => {\n // Image columns: write empty string; image placed below\n if (columnStyles[col.field]?.embedImage) return '';\n\n let value: unknown = row[col.field];\n if (col.valueGetter) {\n value = col.valueGetter({ row, field: col.field, value });\n }\n const cellType = inferCellType(col, value);\n if (cellType === 'string' && col.valueFormatter && value != null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n return value;\n });\n\n const dataRow = ws.addRow(cellValues);\n dataRow.font = { size: bodyFontSize };\n\n // Alternate row background\n if (alternateRowColor && rowIdx % 2 === 1) {\n dataRow.eachCell(cell => {\n cell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: argb(alternateRowColor) } };\n });\n }\n\n // Per-cell alignment and explicit web-like borders\n dataRow.eachCell((cell, colIndex) => {\n const colDef = exportColumns[colIndex - 1];\n if (!colDef) return;\n cell.alignment = {\n horizontal: columnStyles[colDef.field]?.alignment ?? (colDef.type === 'number' ? 'right' : 'left'),\n vertical: 'middle',\n };\n cell.border = { bottom: { style: 'thin', color: { argb: 'FFf1f5f9' } } }; // Slate 50\n });\n\n // ── Embed images for this row ─────────────────────────────────────\n //\n // ExcelJS images are floating objects anchored at tl.{col,row}.\n // Both values accept fractions (0–1 represents one cell length).\n // Adding an offset fraction shifts the anchor rightward / downward,\n // letting us centre the image inside its cell.\n\n if (imageColumns.length > 0) {\n // Pre-compute the final row height so vertical centring is exact.\n const maxImgH = imageColumns.reduce((max, col) => {\n return Math.max(max, columnStyles[col.field]?.imageHeight ?? 40);\n }, 0);\n // ExcelJS row height = points; 1 pt ≈ 1.333 px at 96 dpi\n const rowHeightPt = Math.ceil(maxImgH / 1.333);\n const rowHeightPx = rowHeightPt * 1.333;\n dataRow.height = rowHeightPt;\n\n imageColumns.forEach(col => {\n const colIdx = exportColumns.indexOf(col);\n const url = row[col.field];\n const imgId = typeof url === 'string' ? imageCache.get(url) : undefined;\n\n if (imgId === undefined) {\n // Fetch failed — write URL text so data isn't lost\n dataRow.getCell(colIdx + 1).value = typeof url === 'string' ? url : '';\n return;\n }\n\n const style = columnStyles[col.field];\n const imgW = style?.imageWidth ?? 40;\n const imgH = style?.imageHeight ?? 40;\n\n // ── Horizontal centre within the column ───────────────────\n // ws.getColumn uses 1-based index; width is in Excel \"chars\".\n // Excel column width in pixels for Calibri 11 (MaxDigitWidth=7, Padding=5).\n const colWidthChars = (ws.getColumn(colIdx + 1).width ?? 8) as number;\n const colWidthPx = colWidthChars * 7 + 5;\n const hGapPx = Math.max(0, colWidthPx - imgW) / 2;\n\n // ── Vertical centre within the row ────────────────────────\n const vGapPx = Math.max(0, rowHeightPx - imgH) / 2;\n\n // ExcelJS native offsets are in EMUs (1 pixel = 9525 EMUs).\n // This provides absolute pixel precision regardless of cell size.\n ws.addImage(imgId, {\n tl: {\n col: colIdx,\n row: excelRowIdx,\n nativeColOff: Math.floor(hGapPx * 9525),\n nativeRowOff: Math.floor(vGapPx * 9525),\n },\n ext: { width: imgW, height: imgH },\n editAs: 'oneCell',\n } as unknown as import('exceljs').ImageRange);\n });\n } else {\n dataRow.height = 16;\n }\n\n excelRowIdx++;\n });\n\n // ── Aggregation totals row ────────────────────────────────────────────\n if (includeSummary && aggregationResult && aggregationModel) {\n // Label row\n const labelValues = exportColumns.map(col => {\n const fn = aggregationModel![col.field];\n return fn ? fn.toUpperCase() : '';\n });\n const labelRow = ws.addRow(labelValues);\n labelRow.height = 16;\n labelRow.font = { size: bodyFontSize - 1, italic: true, color: { argb: 'FF94a3b8' } };\n labelRow.eachCell(cell => {\n cell.alignment = { horizontal: 'right', vertical: 'middle' };\n cell.border = { top: { style: 'thin', color: { argb: 'FFcbd5e1' } } };\n });\n\n // Value row\n const totalValues = exportColumns.map(col => {\n const fn = aggregationModel![col.field];\n const val = aggregationResult![col.field];\n if (fn == null || val == null) return '';\n if (col.valueFormatter) {\n return col.valueFormatter({ value: val, row: {} as R, field: col.field });\n }\n return formatAggregationValue(val, fn);\n });\n const totalRow = ws.addRow(totalValues);\n totalRow.height = 18;\n totalRow.font = { bold: true, size: bodyFontSize, color: { argb: argb(headerTextColor) } };\n totalRow.eachCell(cell => {\n cell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: argb(headerFillColor) } };\n cell.alignment = { horizontal: 'right', vertical: 'middle' };\n cell.border = topBorder();\n });\n }\n }\n\n // ─── Write & download ────────────────────────────────────────────────────\n const buffer = await workbook.xlsx.writeBuffer();\n const blob = new Blob([buffer], {\n type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\n });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = fileName.endsWith('.xlsx') ? fileName : `${fileName}.xlsx`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\n/** Convert '#rrggbb' or '#rgb' to ExcelJS ARGB 'FFrrggbb' */\nfunction argb(hex: string): string {\n const clean = hex.replace('#', '');\n if (clean.length === 3) {\n return 'FF' + clean.split('').map(c => c + c).join('');\n }\n if (clean.length === 6) {\n return 'FF' + clean;\n }\n return 'FF' + clean.padEnd(6, '0');\n}\n\nfunction bottomBorder(): Partial<import('exceljs').Borders> {\n return { bottom: { style: 'medium', color: { argb: 'FFcbd5e1' } } };\n}\n\nfunction topBorder(): Partial<import('exceljs').Borders> {\n return { top: { style: 'medium', color: { argb: 'FFcbd5e1' } } };\n}\n","import React from 'react';\nimport type { GridTheme } from './types';\n\nconst lightBase: Record<string, string> = {\n\n '--ogx-color-primary': '#3b82f6',\n '--ogx-color-primary-dark': '#2563eb',\n '--ogx-color-primary-light': '#eff6ff',\n '--ogx-color-primary-focus': 'rgba(59, 130, 246, 0.5)',\n\n '--ogx-color-secondary': '#8b5cf6',\n '--ogx-color-secondary-dark': '#7c3aed',\n '--ogx-color-secondary-light': '#f5f3ff',\n\n '--ogx-color-white': '#ffffff',\n '--ogx-color-black': '#0f172a',\n\n '--ogx-border-color': '#e2e8f0',\n '--ogx-border-color-hover': '#cbd5e1',\n\n '--ogx-shadow-sm': '0 1px 2px 0 rgba(0, 0, 0, 0.05)',\n '--ogx-shadow-md': '0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03)',\n '--ogx-shadow-lg': '0 10px 15px -3px rgba(0, 0, 0, 0.05), 0 4px 6px -2px rgba(0, 0, 0, 0.02)',\n\n '--ogx-grid-background': '#ffffff',\n '--ogx-grid-border-color': '#e2e8f0',\n '--ogx-grid-header-background': '#f8fafc',\n '--ogx-grid-header-text': '#334155',\n '--ogx-grid-header-hover-background': '#f1f5f9',\n '--ogx-grid-header-sorted-background': '#f8fafc',\n '--ogx-grid-row-text': '#1e293b',\n '--ogx-grid-row-hover-background': '#f8fafc',\n '--ogx-grid-row-alternate-background': 'transparent',\n '--ogx-grid-row-selected-background': '#eff6ff',\n '--ogx-grid-row-selected-hover-background': '#dbeafe',\n '--ogx-grid-cell-focus-border': '#3b82f6',\n\n '--ogx-checkbox-bg': '#ffffff',\n '--ogx-checkbox-border': '#94a3b8',\n\n '--ogx-grid-pinned-left-shadow': '4px 0 24px -4px rgba(0, 0, 0, 0.05)',\n '--ogx-grid-pinned-right-shadow': '-4px 0 24px -4px rgba(0, 0, 0, 0.05)',\n\n // Toolbars\n '--ogx-toolbar-background': 'transparent',\n '--ogx-toolbar-text': '#1e293b',\n '--ogx-toolbar-border': '#e2e8f0',\n '--ogx-toolbar-btn-bg': 'transparent',\n '--ogx-toolbar-btn-hover': '#f1f5f9',\n '--ogx-toolbar-btn-text': '#334155',\n '--ogx-toolbar-btn-primary-bg': '#3b82f6',\n '--ogx-toolbar-btn-primary-hover': '#2563eb',\n '--ogx-toolbar-btn-primary-text': '#ffffff',\n '--ogx-toolbar-btn-danger-bg': 'rgba(239, 68, 68, 0.08)',\n '--ogx-toolbar-btn-danger-hover': 'rgba(239, 68, 68, 0.15)',\n '--ogx-toolbar-btn-danger-text': '#ef4444',\n '--ogx-toolbar-input-bg': '#ffffff',\n '--ogx-toolbar-input-text': '#1e293b',\n '--ogx-toolbar-input-border': '#cbd5e1',\n '--ogx-toolbar-input-focus-border': '#3b82f6',\n '--ogx-toolbar-input-focus-shadow': '0 0 0 3px rgba(59, 130, 246, 0.12)',\n '--ogx-toolbar-chip-bg': '#f1f5f9',\n '--ogx-toolbar-chip-text': '#475569',\n '--ogx-toolbar-chip-active-bg': 'rgba(59, 130, 246, 0.12)',\n '--ogx-toolbar-chip-active-text': '#2563eb',\n\n // Overlays & Menus\n '--ogx-overlay-background': '#ffffff',\n '--ogx-overlay-text': '#1e293b',\n '--ogx-overlay-border': '#e2e8f0',\n '--ogx-overlay-shadow': '0 4px 6px -1px rgba(0,0,0,0.08), 0 2px 4px -1px rgba(0,0,0,0.06), 0 0 0 1px rgba(0,0,0,0.06)',\n '--ogx-overlay-item-hover-bg': '#f8fafc',\n '--ogx-overlay-item-hover-text': '#0f172a',\n '--ogx-overlay-item-selected-bg': 'rgba(59, 130, 246, 0.08)',\n '--ogx-overlay-item-selected-text': '#2563eb',\n '--ogx-overlay-item-danger-bg': 'rgba(239, 68, 68, 0.08)',\n '--ogx-overlay-item-danger-text': '#ef4444',\n\n // Scrollbars\n '--ogx-scrollbar-thumb': 'rgba(148, 163, 184, 0.5)',\n '--ogx-scrollbar-track': 'transparent',\n '--ogx-scrollbar-size': '10px',\n\n // Skeletons\n '--ogx-skeleton-base': '#f1f5f9',\n '--ogx-skeleton-highlight': '#ffffff',\n '--ogx-skeleton-dark-base': '#e2e8f0',\n '--ogx-skeleton-dark-highlight': '#f8fafc',\n};\n\nfunction themeToCSS(theme: GridTheme): Record<string, string> {\n const vars: Record<string, string> = {};\n\n function set(cssVar: string, value: string | undefined) {\n if (value !== undefined) {\n vars[cssVar] = value;\n }\n }\n\n if (theme.colors) {\n const c = theme.colors;\n set('--ogx-color-primary', c.primary);\n set('--ogx-color-primary-dark', c.primaryDark);\n set('--ogx-color-primary-light', c.primaryLight);\n set('--ogx-color-primary-focus', c.primaryFocus);\n set('--ogx-color-secondary', c.secondary);\n set('--ogx-color-secondary-dark', c.secondaryDark);\n set('--ogx-color-secondary-light', c.secondaryLight);\n set('--ogx-color-success', c.success);\n set('--ogx-color-warning', c.warning);\n set('--ogx-color-error', c.error);\n set('--ogx-color-info', c.info);\n }\n\n if (theme.typography) {\n const t = theme.typography;\n set('--ogx-font-family', t.fontFamily);\n set('--ogx-font-family-mono', t.fontFamilyMono);\n set('--ogx-font-size-xs', t.fontSizeXs);\n set('--ogx-font-size-sm', t.fontSizeSm);\n set('--ogx-font-size-md', t.fontSizeMd);\n set('--ogx-font-size-lg', t.fontSizeLg);\n set('--ogx-font-size-xl', t.fontSizeXl);\n }\n\n if (theme.spacing) {\n const s = theme.spacing;\n set('--ogx-spacing-xs', s.xs);\n set('--ogx-spacing-sm', s.sm);\n set('--ogx-spacing-md', s.md);\n set('--ogx-spacing-lg', s.lg);\n set('--ogx-spacing-xl', s.xl);\n set('--ogx-spacing-xxl', s.xxl);\n }\n\n if (theme.borders) {\n const b = theme.borders;\n set('--ogx-border-width-thin', b.widthThin);\n set('--ogx-border-width-medium', b.widthMedium);\n set('--ogx-border-width-thick', b.widthThick);\n set('--ogx-border-radius-sm', b.radiusSm);\n set('--ogx-border-radius-md', b.radiusMd);\n set('--ogx-border-radius-lg', b.radiusLg);\n set('--ogx-border-radius-xl', b.radiusXl);\n set('--ogx-border-color', b.color);\n set('--ogx-border-color-hover', b.colorHover);\n }\n\n if (theme.shadows) {\n const sh = theme.shadows;\n set('--ogx-shadow-sm', sh.sm);\n set('--ogx-shadow-md', sh.md);\n set('--ogx-shadow-lg', sh.lg);\n set('--ogx-shadow-xl', sh.xl);\n }\n\n if (theme.grid) {\n const g = theme.grid;\n set('--ogx-grid-row-height-compact', g.rowHeightCompact);\n set('--ogx-grid-row-height-standard', g.rowHeightStandard);\n set('--ogx-row-height', g.rowHeightStandard);\n set('--ogx-grid-row-height-comfortable', g.rowHeightComfortable);\n set('--ogx-grid-header-height', g.headerHeight);\n set('--ogx-header-height', g.headerHeight);\n set('--ogx-grid-cell-padding-x', g.cellPaddingX);\n set('--ogx-grid-cell-padding-y', g.cellPaddingY);\n set('--ogx-grid-background', g.background);\n set('--ogx-grid-border-color', g.borderColor);\n set('--ogx-grid-header-background', g.headerBackground);\n set('--ogx-grid-header-text', g.headerText);\n set('--ogx-grid-header-hover-background', g.headerHoverBackground);\n set('--ogx-grid-header-sorted-background', g.headerSortedBackground);\n set('--ogx-grid-row-text', g.rowText);\n set('--ogx-grid-row-hover-background', g.rowHoverBackground);\n set('--ogx-grid-row-alternate-background', g.rowAlternateBackground);\n set('--ogx-grid-row-selected-background', g.rowSelectedBackground);\n set('--ogx-grid-row-selected-hover-background', g.rowSelectedHoverBackground);\n set('--ogx-grid-cell-focus-border', g.cellFocusBorder);\n set('--ogx-grid-pinned-left-shadow', g.pinnedLeftShadow);\n set('--ogx-grid-pinned-right-shadow', g.pinnedRightShadow);\n set('--ogx-checkbox-bg', g.checkboxBg);\n set('--ogx-checkbox-border', g.checkboxBorder);\n }\n\n if (theme.transitions) {\n const tr = theme.transitions;\n set('--ogx-transition-duration-fast', tr.durationFast);\n set('--ogx-transition-duration-normal', tr.durationNormal);\n set('--ogx-transition-duration-slow', tr.durationSlow);\n set('--ogx-transition-easing', tr.easing);\n }\n\n if (theme.toolbar) {\n const tb = theme.toolbar;\n set('--ogx-toolbar-background', tb.background);\n set('--ogx-toolbar-text', tb.text);\n set('--ogx-toolbar-border', tb.border);\n set('--ogx-toolbar-btn-bg', tb.buttonBackground);\n set('--ogx-toolbar-btn-hover', tb.buttonHoverBackground);\n set('--ogx-toolbar-btn-text', tb.buttonText);\n set('--ogx-toolbar-btn-primary-bg', tb.buttonPrimaryBackground);\n set('--ogx-toolbar-btn-primary-hover', tb.buttonPrimaryHoverBackground);\n set('--ogx-toolbar-btn-primary-text', tb.buttonPrimaryText);\n set('--ogx-toolbar-btn-danger-bg', tb.buttonDangerBackground);\n set('--ogx-toolbar-btn-danger-hover', tb.buttonDangerHoverBackground);\n set('--ogx-toolbar-btn-danger-text', tb.buttonDangerText);\n set('--ogx-toolbar-input-bg', tb.inputBackground);\n set('--ogx-toolbar-input-text', tb.inputText);\n set('--ogx-toolbar-input-border', tb.inputBorder);\n set('--ogx-toolbar-input-focus-border', tb.inputFocusBorder);\n set('--ogx-toolbar-input-focus-shadow', tb.inputFocusShadow);\n set('--ogx-toolbar-chip-bg', tb.chipBackground);\n set('--ogx-toolbar-chip-text', tb.chipText);\n set('--ogx-toolbar-chip-active-bg', tb.chipActiveBackground);\n set('--ogx-toolbar-chip-active-text', tb.chipActiveText);\n }\n\n if (theme.overlays) {\n const o = theme.overlays;\n set('--ogx-overlay-background', o.background);\n set('--ogx-overlay-text', o.text);\n set('--ogx-overlay-border', o.border);\n set('--ogx-overlay-shadow', o.shadow);\n set('--ogx-overlay-item-hover-bg', o.itemHoverBackground);\n set('--ogx-overlay-item-hover-text', o.itemHoverText);\n set('--ogx-overlay-item-selected-bg', o.itemSelectedBackground);\n set('--ogx-overlay-item-selected-text', o.itemSelectedText);\n set('--ogx-overlay-item-danger-bg', o.itemDangerBackground);\n set('--ogx-overlay-item-danger-text', o.itemDangerText);\n }\n\n if (theme.scrollbar) {\n const scr = theme.scrollbar;\n set('--ogx-scrollbar-thumb', scr.thumbColor);\n set('--ogx-scrollbar-track', scr.trackColor);\n set('--ogx-scrollbar-size', scr.size);\n }\n\n if (theme.skeleton) {\n const sk = theme.skeleton;\n set('--ogx-skeleton-base', sk.baseColor);\n set('--ogx-skeleton-highlight', sk.highlightColor);\n set('--ogx-skeleton-dark-base', sk.darkBaseColor);\n set('--ogx-skeleton-dark-highlight', sk.darkHighlightColor);\n }\n\n return vars;\n}\n\nexport interface DataGridThemeProviderProps {\n theme: GridTheme;\n children: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function DataGridThemeProvider({\n theme,\n children,\n className,\n style\n}: DataGridThemeProviderProps) {\n const cssVars = React.useMemo(() => {\n\n return { ...lightBase, ...themeToCSS(theme) };\n }, [theme]);\n\n return (\n <div\n className={`ogx-theme-provider ${className || ''}`.trim()}\n style={{ ...style, ...cssVars } as React.CSSProperties}\n >\n {children}\n </div>\n );\n}\n","import type { GridTheme } from './types';\n\nexport const darkTheme: GridTheme = {\n colors: {\n primary: '#60a5fa', \n primaryDark: '#3b82f6',\n primaryLight: '#1e3a5f', \n primaryFocus: 'rgba(96, 165, 250, 0.4)',\n },\n grid: {\n background: '#0f172a', \n headerBackground: '#1e293b', \n headerText: '#e2e8f0', \n headerHoverBackground: '#334155', \n headerSortedBackground: '#1e3a5f', \n rowText: '#cbd5e1', \n borderColor: '#334155', \n rowHoverBackground: '#1e293b', \n rowAlternateBackground: '#162032', \n rowSelectedBackground: '#1e3a5f', \n rowSelectedHoverBackground: '#1d4ed8', \n cellFocusBorder: '#60a5fa',\n checkboxBg: '#1e293b', \n checkboxBorder: '#64748b', \n },\n borders: {\n color: '#334155',\n colorHover: '#475569',\n },\n shadows: {\n sm: '0 1px 2px 0 rgba(0, 0, 0, 0.3)',\n md: '0 4px 6px -1px rgba(0, 0, 0, 0.3)',\n },\n toolbar: {\n background: 'transparent',\n text: '#cbd5e1',\n border: '#334155',\n buttonBackground: 'transparent',\n buttonHoverBackground: '#1e293b',\n buttonText: '#e2e8f0',\n buttonPrimaryBackground: '#3b82f6',\n buttonPrimaryHoverBackground: '#2563eb',\n buttonPrimaryText: '#ffffff',\n buttonDangerBackground: 'rgba(239, 68, 68, 0.15)',\n buttonDangerHoverBackground: 'rgba(239, 68, 68, 0.25)',\n buttonDangerText: '#fca5a5',\n inputBackground: '#0f172a',\n inputText: '#f8fafc',\n inputBorder: '#334155',\n inputFocusBorder: '#60a5fa',\n inputFocusShadow: '0 0 0 3px rgba(96, 165, 250, 0.2)',\n chipBackground: '#1e293b',\n chipText: '#94a3b8',\n chipActiveBackground: 'rgba(96, 165, 250, 0.2)',\n chipActiveText: '#60a5fa',\n },\n overlays: {\n background: '#1e293b',\n text: '#f8fafc',\n border: '#334155',\n shadow: '0 10px 15px -3px rgba(0, 0, 0, 0.5), 0 4px 6px -2px rgba(0, 0, 0, 0.3)',\n itemHoverBackground: '#334155',\n itemHoverText: '#ffffff',\n itemSelectedBackground: 'rgba(96, 165, 250, 0.15)',\n itemSelectedText: '#60a5fa',\n itemDangerBackground: 'rgba(239, 68, 68, 0.15)',\n itemDangerText: '#fca5a5',\n },\n scrollbar: {\n thumbColor: 'rgba(148, 163, 184, 0.2)',\n trackColor: 'transparent',\n },\n skeleton: {\n baseColor: '#1e293b',\n highlightColor: '#334155',\n darkBaseColor: '#0f172a',\n darkHighlightColor: '#1e293b',\n }\n};\n\nexport const roseTheme: GridTheme = {\n colors: {\n primary: '#e11d48', \n primaryDark: '#be123c',\n primaryLight: '#fff1f2', \n primaryFocus: 'rgba(225, 29, 72, 0.4)',\n },\n grid: {\n headerBackground: '#fff1f2',\n headerHoverBackground: '#ffe4e6',\n headerSortedBackground: '#fecdd3',\n rowAlternateBackground: '#fff8f8',\n rowSelectedBackground: '#ffe4e6',\n rowSelectedHoverBackground: '#fecdd3',\n cellFocusBorder: '#e11d48',\n },\n};\n\nexport const emeraldTheme: GridTheme = {\n colors: {\n primary: '#059669', \n primaryDark: '#047857',\n primaryLight: '#ecfdf5', \n primaryFocus: 'rgba(5, 150, 105, 0.4)',\n },\n grid: {\n headerBackground: '#ecfdf5',\n headerHoverBackground: '#d1fae5',\n headerSortedBackground: '#a7f3d0',\n rowAlternateBackground: '#f6fdf9',\n rowSelectedBackground: '#d1fae5',\n rowSelectedHoverBackground: '#a7f3d0',\n cellFocusBorder: '#059669',\n },\n};\n\nexport const amberTheme: GridTheme = {\n colors: {\n primary: '#d97706', \n primaryDark: '#b45309',\n primaryLight: '#fffbeb', \n primaryFocus: 'rgba(217, 119, 6, 0.4)',\n },\n grid: {\n headerBackground: '#fffbeb',\n headerHoverBackground: '#fef3c7',\n headerSortedBackground: '#fde68a',\n rowAlternateBackground: '#fffdf5',\n rowSelectedBackground: '#fef3c7',\n rowSelectedHoverBackground: '#fde68a',\n cellFocusBorder: '#d97706',\n },\n};\n\nexport const compactTheme: GridTheme = {\n grid: {\n rowHeightCompact: '28px',\n rowHeightStandard: '36px',\n rowHeightComfortable: '48px',\n headerHeight: '40px',\n cellPaddingX: '8px',\n cellPaddingY: '4px',\n },\n typography: {\n fontSizeSm: '0.8rem',\n fontSizeMd: '0.875rem',\n },\n};\n","\nimport { useRef, useCallback, useMemo, useEffect } from 'react';\nimport type { GridState } from './types';\n\nexport interface UseGridStateStorageOptions {\n key: string;\n debounceMs?: number;\n include?: (keyof GridState)[];\n storage?: {\n getItem: (key: string) => string | null;\n setItem: (key: string, value: string) => void;\n removeItem: (key: string) => void;\n };\n}\n\nexport interface UseGridStateStorageReturn {\n initialState: GridState | undefined;\n onStateChange: (state: GridState) => void;\n clearState: () => void;\n}\n\nfunction readFromStorage(\n key: string,\n storage: UseGridStateStorageOptions['storage']\n): GridState | undefined {\n try {\n const raw = storage!.getItem(key);\n if (!raw) return undefined;\n return JSON.parse(raw) as GridState;\n } catch {\n\n return undefined;\n }\n}\n\nfunction writeToStorage(\n key: string,\n state: GridState,\n include: (keyof GridState)[] | undefined,\n storage: UseGridStateStorageOptions['storage']\n) {\n try {\n const toWrite = include\n ? Object.fromEntries(\n Object.entries(state).filter(([k]) => include.includes(k as keyof GridState))\n )\n : state;\n storage!.setItem(key, JSON.stringify(toWrite));\n } catch {\n // swallow localStorage write errors (private browsing, quota exceeded)\n }\n}\n\nexport function useGridStateStorage(\n options: UseGridStateStorageOptions | string\n): UseGridStateStorageReturn {\n\n const opts: UseGridStateStorageOptions = typeof options === 'string'\n ? { key: options }\n : options;\n\n const {\n key,\n debounceMs = 300,\n include,\n storage = typeof window !== 'undefined' ? window.localStorage : undefined,\n } = opts;\n\n const initialState = useMemo(() => {\n if (!storage) return undefined;\n return readFromStorage(key, storage);\n\n }, [key, storage]);\n\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const latestStateRef = useRef<GridState | null>(null);\n\n const flush = useCallback(() => {\n if (latestStateRef.current && storage) {\n writeToStorage(key, latestStateRef.current, include, storage);\n }\n }, [key, include, storage]);\n\n const onStateChange = useCallback(\n (state: GridState) => {\n latestStateRef.current = state;\n\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n\n timerRef.current = setTimeout(flush, debounceMs);\n },\n [flush, debounceMs]\n );\n\n useEffect(() => {\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n flush();\n }\n };\n }, [flush]);\n\n const clearState = useCallback(() => {\n if (storage) {\n storage.removeItem(key);\n }\n }, [key, storage]);\n\n return { initialState, onStateChange, clearState };\n}\n"],"names":["REACT_ELEMENT_TYPE","REACT_FRAGMENT_TYPE","jsxProd","type","config","maybeKey","key","propName","reactJsxRuntime_production","getComponentNameFromType","REACT_CLIENT_REFERENCE","REACT_PROFILER_TYPE","REACT_STRICT_MODE_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_ACTIVITY_TYPE","REACT_PORTAL_TYPE","REACT_CONTEXT_TYPE","REACT_CONSUMER_TYPE","REACT_FORWARD_REF_TYPE","innerType","REACT_MEMO_TYPE","REACT_LAZY_TYPE","testStringCoercion","value","checkKeyStringCoercion","JSCompiler_inline_result","JSCompiler_temp_const","JSCompiler_inline_result$jscomp$0","getTaskName","name","getOwner","dispatcher","ReactSharedInternals","UnknownOwner","hasValidKey","hasOwnProperty","getter","defineKeyPropWarningGetter","props","displayName","warnAboutAccessingKey","specialPropKeyWarningShown","elementRefGetterWithDeprecationWarning","componentName","didWarnAboutElementRef","ReactElement","owner","debugStack","debugTask","refProp","jsxDEVImpl","isStaticChildren","children","isArrayImpl","validateChildKeys","keys","k","didWarnAboutKeySpread","node","isValidElement","object","React","require$$0","createTask","callStackForError","unknownOwnerDebugStack","unknownOwnerDebugTask","reactJsxRuntime_development","trackActualOwner","jsxRuntimeModule","require$$1","isColumnPinned","field","pinnedColumns","getPinnedColumnGroups","columns","left","center","right","col","pinnedPosition","a","b","aIndex","bIndex","calculatePinnedPositions","columnWidths","checkboxSelection","pinCheckboxColumn","hasDetailPanel","pinExpandColumn","rowReordering","positions","groups","leftOffset","width","rightOffset","isRowPinned","rowId","pinnedRows","getPinnedRowGroups","rows","top","bottom","row","parseWidth","floatVal","useLayout","params","rowHeight","pagination","paginatedUnpinnedRows","sortedUnpinnedRows","expandedRowIds","getDetailPanelHeight","pinnedTopRowsLength","pinnedBottomRowsLength","visibleOrderedColumns","viewportWidth","paginationMode","isLoading","pageSize","useMemo","unpinnedRows","rowHeights","index","height","detailHeight","cumulativeHeights","acc","skeletonCount","unpinnedRowsHeight","pinnedTopHeight","pinnedBottomHeight","rawLeftPinnedCols","rawRightPinnedCols","unpinnedCols","unpinnedColWidths","pinned","systemColumnsWidth","getColWidth","c","leftWidth","sum","parsed","rightWidth","naturalFlexWidth","minWidth","w","availableWidth","fixedWidthCols","percentageCols","flexCols","hasManualWidth","fixedWidth","remainingSpaceForFlex","percentageWidthMap","percentage","calculatedWidth","finalFlexWidths","flexItems","f","iterations","maxIterations","unfrozen","unfrozenFlexTotal","frozenWidthTotal","currentFreeSpace","pixelsPerFlex","totalViolation","minViolators","maxViolators","rawWidth","computedWidthMap","computedWidth","fixedCol","pctCol","p","rawPctWidth","unpinnedColsWithWidth","flexItem","baseLeftZ","leftPinnedCols","i","baseRightZ","rightPinnedCols","unpinnedTotalWidth","totalWidth","unpinnedAccWidths","useGridKeyboardNavigation","allRenderableRows","navigationColumns","selectedRowIds","handleSelectionChange","handleDetailPanelToggle","editingHandlers","setKeyboardMode","sortModel","handleSort","isCellEditable","virtualization","viewportRef","focusedCell","setFocusedCell","useState","handleFocus","useCallback","event","prev","firstRow","firstCol","handleBlur","handleKeyDown","id","isEditing","currentSort","item","newDirection","r","isHeader","rowIndex","colIndex","findNextCell","startRow","startCol","deltaRow","deltaCol","wrapRow","allowHeader","findNextEditable","steps","maxSteps","isSortable","isInteractable","cellEditable","nextRowIndex","nextColIndex","handled","dir","res","pg","nextCol","el","columnMetrics","clientHeight","clientWidth","scrollTop","scrollLeft","rowTop","rowBottom","visibleTop","visibleBottom","newScrollTop","leftPinnedWidth","rightPinnedWidth","totalSpecialsWidth","pinnedSpecialsWidth","unpinnedIndex","colLeft","colRight","visibleStart","visibleEnd","newScrollLeft","EMPTY_PIVOT_MODEL","useGridControlledState","initialState","propSortModel","propAggregationModel","onAggregationModelChange","propColumnVisibilityModel","onColumnVisibilityModelChange","propPinnedColumns","onPinnedColumnsChange","propPivotModel","onPivotModelChange","propPaginationModel","onPaginationModelChange","propRowSelectionModel","internalSortModel","setInternalSortModel","isSortControlled","isAggregationControlled","internalAggregationModel","setInternalAggregationModel","aggregationModel","handleAggregationModelChange","model","isColumnVisibilityControlled","internalColumnVisibilityModel","setInternalColumnVisibilityModel","columnVisibilityModel","handleColumnVisibilityModelChange","isPinnedColumnsControlled","internalPinnedColumns","setInternalPinnedColumns","handlePinnedColumnsChange","internalPivotModel","setInternalPivotModel","currentPivotModel","handlePivotModelChange","isPaginationControlled","internalPaginationModel","setInternalPaginationModel","effectivePaginationModel","handlePaginationModelChange","newModel","isSelectionControlled","internalRowSelectionModel","setInternalRowSelectionModel","rowSelectionModel","FILTER_OPERATORS","filterValue","numValue","numFilter","numV","numF","v","rowStr","filterStr","applyFilterItem","filterItem","operator","rowValue","operatorFn","applyQuickFilter","quickFilterValues","searchTerm","isRowMatchingFilter","filterModel","items","logicOperator","evaluateItem","group","groupItems","filterRows","getOperatorsForType","compareValues","direction","aStr","bStr","sortRows","sortedRows","sortItem","aValue","bValue","comparison","useGridRowPipeline","effectiveRows","activeHierarchyHandlers","filterMode","dataSource","sortingMode","filteredRows","pinnedTopRows","pinnedBottomRows","start","centerRows","base","skeletons","_","useGridVirtualization","layout","rawViewportWidth","rawViewportHeight","autoHeight","unpinnedRowsLength","viewportHeight","overscanCols","visibleLocalStart","visibleLocalEnd","firstUnpinnedIndex","lastUnpinnedIndex","low","high","mid","leftSpacerWidth","rightSpacerWidth","virtualColumns","scrollbarBuffer","totalHeight","overscanRows","firstRowIndex","lastRowIndex","offsetTop","rLow","rHigh","useColumnReorder","onColumnOrderChange","disableColumnReorder","draggedColumn","setDraggedColumn","dragOverColumn","setDragOverColumn","draggedIndexRef","useRef","handleDragStart","columnIndex","handleDragOver","handleDrop","targetField","oldIndex","targetIndex","column","handleDragEnd","ExpandIcon","isExpanded","onClick","variant","jsx","e","jsxs","useGridColumns","activeColumns","isHierarchyEnabled","isRowGrouping","isTreeData","columnOrder","pivotMode","setColumns","effectiveColumns","cellParams","meta","depth","hasChildren","groupingField","groupingValue","descendantCount","isGroupRow","content","groupLabel","setColumnWidths","handleColumnResize","newWidth","internalColumnOrder","setInternalColumnOrder","effectiveColumnOrder","useEffect","orderedColumns","orderMap","idx","ai","bi","columnReorderHandlers","reorderParams","newOrder","movedField","specials","useGridVisibleRows","renderContext","topPinnedCount","topPinned","bottomPinned","centerStartIndex","centerEndIndex","centerVisible","combined","seenIds","useGridScrollSync","onRowsScrollEnd","pendingScrollRef","scrollRafRef","scrollPos","setScrollPos","handleScroll","target","scrollHeight","useGridStateSnapshot","onStateChange","onStateChangeRef","useLayoutEffect","snapshot","AGGREGATION_FUNCTIONS","values","nums","formatAggregationValue","fnName","useAggregation","isServerSide","serverAggregationResults","columnsLookup","map","clientResult","result","colDef","fn","serverResult","setServerResult","setIsLoading","error","setError","requestIdRef","fetchServerAggregations","requestId","err","GridAggregationFooter","aggregationResult","pinnedOffsets","lastLeftField","firstRightField","rawValue","colWidth","pinnedOffset","className","style","Fragment","GridEmptyState","noRowsLabel","GridErrorOverlay","message","Checkbox","indeterminate","label","inputRef","internalRef","setRef","element","wrapperClassNames","ColumnResizeHandle","currentWidth","onResize","maxWidth","isDragging","setIsDragging","startXRef","startWidthRef","handleMouseDown","lastUpdateTime","throttleMs","handleMouseMove","deltaX","now","handleMouseUp","handleDoubleClick","classNames","ActiveDotIcon","InactiveDotIcon","ManageColumnsIcon","AscIcon","DescIcon","UnsortIcon","HideIcon","PinLeftIcon","PinRightIcon","UnpinIcon","ColumnMenu","onSort","onHide","onPin","onManageColumns","onClose","anchorEl","menuRef","setStyle","anchorRect","menuRect","vw","vh","margin","handleClickOutside","handleKey","handleHide","handlePin","side","isUnsorted","isPinnedLeft","isPinnedRight","isUnpinned","colLabel","ReactDOM","MenuIcon","SwapIcon","collectGroupFields","out","child","groupTreeDepth","d","walk","g","buildGroupRow","allFields","level","findAtLevel","cur","found","fieldGroup","cells","totalW","j","Header","allColumns","columnGroupingModel","allSelected","someSelected","onSelectAll","onColumnResize","onDragStart","onDragOver","onDragEnd","onDrop","onHeaderClick","onSortAdd","multiSort","onHideColumn","onPinColumn","selectAllId","useId","cellRefs","menuOpenParams","setMenuOpenParams","handleMenuOpen","handleMenuClose","handleColumnClick","getSortIcon","sortIndex","pinnedPositions","groupDepth","allLeafFields","prefixWidth","cell","isSorted","isResizable","isPinned","isDragOver","effectiveWidth","offset","headerContent","handleHeaderClick","Button","size","color","disabled","Pagination","pageSizeId","page","rowCount","onPageChange","onPageSizeChange","pageSizeOptions","showFirstButton","showLastButton","localeText","pageCount","currentPage","displayedRows","rowsPerPageLabel","ofLabel","pageLabel","handleFirstPage","handlePreviousPage","handleNextPage","handleLastPage","handlePageSizeChange","newPageSize","isFirstPage","isLastPage","option","createInitialState","idRowsLookup","allRows","columnLookup","orderedFields","gridReducer","state","action","currentRows","newRows","useDataGrid","headerHeight","propInitialState","internalInitialState","dispatch","useReducer","stateRef","prevRowsRef","setRows","rowsOrUpdater","preserveRowCount","newColumns","setSortModel","setFilterModel","setPaginationModel","paginationModel","setSelection","selectedRows","setDimensions","setDataSourceLoading","loading","setDataSourceError","setRowCount","count","apiRef","isSelected","newSelection","ids","existingIndex","useRowReorder","onRowOrderChange","getRowId","draggedRowId","setDraggedRowId","dragOverRowId","setDragOverRowId","getRowIdInternal","targetId","useTreeData","getTreeDataPath","treeData","defaultGroupingExpansionDepth","onRowExpansionChange","treeNodes","rootIds","groupingRows","nodes","roots","groupRows","pathLookup","getPathKey","path","pathKey","ensureAncestors","childPath","parentPath","parentPathKey","parentId","groupRow","parentNode","childNode","groupId","nodePath","initialExpandedIds","initialExpanded","expandedGroupIds","setExpandedGroupIds","toggleExpansion","next","isExpanding","getVisibleRows","rowLookup","matchesFilter","filterCache","isNodeVisible","childId","sortNodes","aId","bId","rowA","rowB","valA","valB","comp","traverse","visibleIds","enhancedRow","isGroupExpanded","getNode","getNodePath","currentId","rowMetaMap","groupRowIds","defaultGetAggregationPosition","groupNode","EMPTY_ROW_GROUPING_MODEL","EMPTY_AGGREGATION_MODEL","useRowGrouping","rowGroupingModel","getAggregationPosition","getGroupId","groupIds","groupRowsList","aggregatedValues","aggField","aggType","treeNode","childrenIds","topLevelIds","allGroupIds","depthIds","doesNodeMatchFilter","nodeId","compareResult","isGroup","isExpandedGroupIds","useGridEditing","processRowUpdate","onProcessRowUpdateError","onRowChange","editingCell","setEditingCellState","editingCellRef","setEditingCell","val","startCellEdit","editParams","stopCellEdit","stopParams","currentCell","originalValue","existingRow","newRow","processedRow","setEditCellValue","useGridSpanning","colspanMap","setColspanMap","rowSpanningState","setRowSpanningState","resetColSpan","getCellColSpanInfo","calculateColSpan","minFirstColumn","maxLastColumn","newMap","colSpan","setCellColSpanInfo","calculateRowSpan","spannedCells","hiddenCells","hiddenCellOriginMap","cellValue","span","nextIndex","nextRow","resetRowSpan","nextColWidth","getSpannedCells","getHiddenCells","getHiddenCellOriginMap","info","columnInfo","useGridDataSource","onAggregationResults","prevParamsRef","activeRequestRef","fetchRows","endRow","requestParams","response","shouldAppend","sortChanged","filterChanged","pageSizeChanged","prevRows","timer","fetchChildren","_parentId","groupKeys","existingIds","SEP_COL","SEP_KEY","aggregate","makeKey","fields","cellKey","ck","aggFn","hasColFields","usePivot","rawRows","rawCols","enabled","empty","rowFields","columnFields","valueFields","colDefMap","colKeySet","colKeys","outerMap","rk","labelValues","entry","colBucket","vf","raw","pivotRows","pivotRow","ck_","gtBuckets","bk","totalRow","cellValues","pivotColumns","orig","def","labelBase","headerName","n","copyTextSynchronous","text","textarea","success","writeToClipboard","fallbackSuccess","useGridClipboard","copySelectedRows","rowsToCopy","visibleColumns","headerRow","dataRows","fullContent","activeEl","tag","ListViewRow","listViewColumn","onRowClick","onSelectionChange","handleCheckboxChange","GridListView","ariaLabel","serverRowCount","paginationSlot","paginationSlotProps","PaginationComponent","totalRowCount","newPage","TextEditor","onValueChange","onCommit","onCancel","local","setLocal","ref","NumberEditor","BooleanEditor","handleChange","SelectEditor","options","opt","l","DateEditor","GridEditInputCell","CellRenderTarget","renderFn","CellErrorBoundary","CellImpl","onCellClick","onCellEditStart","onCellValueChange","isFocused","isFocusVisible","isEditable","onEditStart","onEditStop","colSpanInfo","rowSpanProp","isHiddenByRowSpan","rowMeta","handleValueChange","newValue","formattedValue","resolvedCellClassName","cellRef","handleClick","rowSpan","cellWidth","Cell","DragHandleIcon","DetailPanel","Row","isDetailPanelExpanded","onDetailPanelToggle","detailPanelContent","detailPanelHeight","onEditCellValueChange","focusedCellField","rowSpanningCaches","checkboxId","expandCellRef","checkboxCellRef","handleCellEditStart","handleCellValueChange","handleEditStopWrapper","cancel","cellCount","handleRowClick","rowPinnedPosition","isRowPinnedTop","isRowPinnedBottom","GridPinnedRows","position","getDetailPanelContent","SkeletonRow","skeletonWidth","GridVirtualRows","virtualContainerHeight","effectiveLoading","visibleRows","baseColumns","rowReorderHandlers","dataSourceLoading","sortedUnpinnedRowCount","infiniteScrollSkeletonCount","skeletonColumns","columnWidth","columnCount","self","t","actualIndex","SearchIcon","ColumnVisibilityPanel","onVisibilityChange","onShowAll","onHideAll","onColumnReorder","onColumnOrderReset","showNonHideableColumns","searchQuery","setSearchQuery","dragOverField","setDragOverField","dragFieldRef","hideableColumns","allVisible","filteredColumns","lowerQuery","handleToggleAll","handleDragLeave","toField","fromField","isVisible","isHideable","canReorder","GridStandaloneColumnPanel","isOpen","containerRef","panelRef","onColumnVisibilityChange","panelTop","setPanelTop","panelRight","setPanelRight","portalTarget","setPortalTarget","rect","handleReorder","currentOrder","fromIdx","toIdx","EMPTY_ROW_META_MAP","DataGrid","density","disableRowSelectionOnClick","disableMultipleRowSelection","propOnRowSelectionModelChange","propFilterModel","onFilterModelChange","onSortModelChange","propPagination","controlledExpandedRowIds","onDetailPanelExpandedRowIdsChange","groupingColDef","propRowGroupingModel","propRowCount","slots","slotProps","listView","propApiRef","effectiveNoRowsLabel","defaultFilterModel","defaultRowGroupingModel","latestToolbarRef","StableToolbar","Toolbar","controlledState","onRowSelectionModelChange","pivot","effectiveRowHeight","activeRows","isRowGroupingActive","effectivePinnedColumns","setServerAggregationResults","contentRef","gridRef","defaultGetRowId","effectiveGetRowId","normalizedRows","on","dataSourceRef","fetchChildrenRef","treeDataRef","handleNodeExpansion","gridData","isInternalLoading","treeDataHandlers","rowGroupingHandlers","updatedRow","nextRows","dataSourceHandlers","internalExpandedRowIds","setInternalExpandedRowIds","newExpandedRowIds","rowPipeline","spanning","hasAggregation","resolvedColumnWidths","targetCol","colLocalLeft","colLocalRight","resizeObserver","entries","newSelectionArray","handleSelectAll","newSortModel","handleSortAdd","existing","handleCellClick","prevEditingCellRef","wasEditing","hasRowSpanning","columnsPanelOpen","setColumnsPanelOpen","standalonePanelRef","toolbarProps","reorderHandler","cleanLeft","cleanRight","Skeleton","NO_VALUE_OPERATORS","getActiveFilter","FilterRow","onChange","filterId","operators","isActive","currentOperator","localValue","setLocalValue","onChangeRef","itemRef","colFieldRef","operatorRef","prevItemValue","handler","currentItem","currentValue","handleOperatorChange","op","noValue","newItem","handleClear","isNoValue","isBoolean","showValue","FilterPanel","handleItemChange","rest","handleLogicChange","filterableColumns","AGG_FNS","PivotIcon","PivotPanel","anchorRef","pos","setPos","portalContainer","setPortalContainer","computePos","update","onKey","inRow","inCol","inValue","isUsed","addRow","addCol","addValue","removeRow","removeCol","removeValue","changeValueFn","reset","numericFields","totalActive","panel","isNum","CloseIcon","GlobalSearch","placeholder","debounceMs","setIsExpanded","lastEmittedRef","lastIncomingValueRef","wasFocusedRef","handleExpand","GridTooltip","title","placement","enterDelay","leaveDelay","open","setOpen","coords","setCoords","timerRef","childRef","updateCoords","scrollX","scrollY","handleMouseEnter","handleMouseLeave","wrapperRef","SigmaIcon","ViewColumnIcon","FilterIcon","AggregationPanel","aggregableColumns","onFunctionChange","onClearAll","activeCount","currentFn","ColumnsPanelWrapper","FilterPanelWrapper","onCloseRef","activeFilterCount","handleClearAll","EMPTY_PIVOT","GridToolbar","pivotModel","forceColumnsOpen","onColumnsPanelClose","rightContent","renderColumnsButton","renderFilterButton","renderAggregationButton","renderExportButton","renderQuickFilter","aggOpen","setAggOpen","pivotOpen","setPivotOpen","colsOpen","setColsOpen","filterOpen","setFilterOpen","aggButtonRef","pivotButtonRef","colsButtonRef","filterButtonRef","colsWrapperRef","filterWrapperRef","aggWrapperRef","pivotActive","handleFunctionChange","clearAllAgg","handleSearchChange","nextModel","searchValue","handleVisibilityChange","handleShowAllColumns","handleHideAllColumns","o","m","useGridApiRef","Input","fullWidth","startAdornment","endAdornment","hexToRgb","hex","getExportColumns","resolveValue","colWeight","computeColumnStyles","usableWidth","totalWeight","styles","formatFilterSummary","exportToPdf","JsPDF","autoTable","jspdfMod","autoTableMod","fileName","logoUrl","orientation","alternateRowColor","headerBackgroundColor","headerTextColor","fontSize","groupedRows","doc","pageWidth","pageHeight","MARGIN","exportColumns","rowsToExport","startY","cursorX","cursorY","exportedAt","summary","head","body","foot","aggMod","indent","aggVal","formatted","columnStyles","hr","hg","hb","tr","tg","tb","totalPages","exportToCsv","includeHeaders","delimiter","csvContent","escapeCSV","aggModel","aggResult","aggLabels","aggValues","downloadFile","exportToExcel","sheetName","html","escapeHTML","isGrand","exportToJson","pretty","outData","stack","grandTotal","obj","data","summaryLabelObj","summaryDataObj","printGrid","titleOrOptions","printWindow","resolve","hasPrinted","mimeType","blob","url","link","inferCellType","defaultNumFmt","override","px","imageExtension","contentType","ct","fetchImages","urls","settled","commaIdx","header","b64","binary","uint8","mime","ext","buffer","exportToExcelAdvanced","sheetDefs","headerFillColor","headerFontSize","bodyFontSize","ExcelJS","workbook","sRows","resolvedSheets","imageCache","sheetDef","ws","argb","bottomBorder","rowScope","includeSummary","autoFilter","frozenHeader","imageColumns","urlsNeeded","seen","fetched","extension","imgId","headerValues","excelRowIdx","rowIdx","dataRow","maxImgH","max","rowHeightPt","rowHeightPx","colIdx","imgW","imgH","colWidthPx","hGapPx","vGapPx","labelRow","totalValues","topBorder","clean","lightBase","themeToCSS","theme","vars","set","cssVar","s","sh","scr","sk","DataGridThemeProvider","cssVars","darkTheme","roseTheme","emeraldTheme","amberTheme","compactTheme","readFromStorage","storage","writeToStorage","include","toWrite","useGridStateStorage","opts","latestStateRef","flush","clearState"],"mappings":"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","x_google_ignoreList":[0,1,2]}
1
+ {"version":3,"file":"opengridx.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/utils/scroll/index.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/core/useGridDevWarnings.ts","../lib/utils/aggregation/index.ts","../lib/hooks/features/useAggregation.ts","../lib/components/DataGrid/GridAggregationFooter.tsx","../lib/components/DataGrid/GridEmptyState.tsx","../lib/components/DataGrid/GridErrorOverlay.tsx","../lib/components/ui/Checkbox.tsx","../lib/components/ColumnResizeHandle/ColumnResizeHandle.tsx","../lib/components/Header/ColumnMenu.tsx","../lib/components/Header/Header.tsx","../lib/components/ui/Button.tsx","../lib/components/Pagination/Pagination.tsx","../lib/hooks/core/useDataGrid.ts","../lib/hooks/useRowReorder.ts","../lib/hooks/useTreeData.ts","../lib/hooks/useRowGrouping.ts","../lib/hooks/features/useGridEditing.ts","../lib/hooks/features/useGridSpanning.ts","../lib/hooks/features/useGridDataSource.ts","../lib/hooks/features/usePivot.ts","../lib/hooks/features/useGridClipboard.ts","../lib/components/ListView/ListViewRow.tsx","../lib/components/DataGrid/GridListView.tsx","../lib/components/Cell/GridEditInputCell.tsx","../lib/components/Cell/CellErrorBoundary.tsx","../lib/components/Cell/Cell.tsx","../lib/components/ui/DragHandleIcon.tsx","../lib/components/DetailPanel/DetailPanel.tsx","../lib/components/Row/Row.tsx","../lib/components/DataGrid/GridPinnedRows.tsx","../lib/components/SkeletonRow/SkeletonRow.tsx","../lib/components/DataGrid/GridVirtualRows.tsx","../lib/components/ColumnVisibilityPanel/ColumnVisibilityPanel.tsx","../lib/components/DataGrid/GridStandaloneColumnPanel.tsx","../lib/components/DataGrid/DataGrid.tsx","../lib/components/Skeleton/Skeleton.tsx","../lib/components/FilterPanel/FilterPanel.tsx","../lib/components/Toolbar/PivotPanel.tsx","../lib/components/Toolbar/GlobalSearch.tsx","../lib/components/Tooltip/Tooltip.tsx","../lib/components/Toolbar/GridToolbar.tsx","../lib/hooks/core/useGridApiRef.ts","../lib/components/ui/Input.tsx","../lib/utils/export/exportToPdf.ts","../lib/utils/export/index.ts","../lib/utils/export/exportToExcelAdvanced.ts","../lib/theme/DataGridThemeProvider.tsx","../lib/theme/presets.ts","../lib/state/useGridStateStorage.ts"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (\n (\"number\" === typeof type.tag &&\n console.error(\n \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n ),\n type.$$typeof)\n ) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkKeyStringCoercion(value) {\n try {\n testStringCoercion(value);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n if (JSCompiler_inline_result) {\n JSCompiler_inline_result = console;\n var JSCompiler_temp_const = JSCompiler_inline_result.error;\n var JSCompiler_inline_result$jscomp$0 =\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\";\n JSCompiler_temp_const.call(\n JSCompiler_inline_result,\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n JSCompiler_inline_result$jscomp$0\n );\n return testStringCoercion(value);\n }\n }\n function getTaskName(type) {\n if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n if (\n \"object\" === typeof type &&\n null !== type &&\n type.$$typeof === REACT_LAZY_TYPE\n )\n return \"<...>\";\n try {\n var name = getComponentNameFromType(type);\n return name ? \"<\" + name + \">\" : \"<...>\";\n } catch (x) {\n return \"<...>\";\n }\n }\n function getOwner() {\n var dispatcher = ReactSharedInternals.A;\n return null === dispatcher ? null : dispatcher.getOwner();\n }\n function UnknownOwner() {\n return Error(\"react-stack-top-frame\");\n }\n function hasValidKey(config) {\n if (hasOwnProperty.call(config, \"key\")) {\n var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n if (getter && getter.isReactWarning) return !1;\n }\n return void 0 !== config.key;\n }\n function defineKeyPropWarningGetter(props, displayName) {\n function warnAboutAccessingKey() {\n specialPropKeyWarningShown ||\n ((specialPropKeyWarningShown = !0),\n console.error(\n \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n displayName\n ));\n }\n warnAboutAccessingKey.isReactWarning = !0;\n Object.defineProperty(props, \"key\", {\n get: warnAboutAccessingKey,\n configurable: !0\n });\n }\n function elementRefGetterWithDeprecationWarning() {\n var componentName = getComponentNameFromType(this.type);\n didWarnAboutElementRef[componentName] ||\n ((didWarnAboutElementRef[componentName] = !0),\n console.error(\n \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n ));\n componentName = this.props.ref;\n return void 0 !== componentName ? componentName : null;\n }\n function ReactElement(type, key, props, owner, debugStack, debugTask) {\n var refProp = props.ref;\n type = {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n props: props,\n _owner: owner\n };\n null !== (void 0 !== refProp ? refProp : null)\n ? Object.defineProperty(type, \"ref\", {\n enumerable: !1,\n get: elementRefGetterWithDeprecationWarning\n })\n : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n type._store = {};\n Object.defineProperty(type._store, \"validated\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: 0\n });\n Object.defineProperty(type, \"_debugInfo\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: null\n });\n Object.defineProperty(type, \"_debugStack\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugStack\n });\n Object.defineProperty(type, \"_debugTask\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugTask\n });\n Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n return type;\n }\n function jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n debugStack,\n debugTask\n ) {\n var children = config.children;\n if (void 0 !== children)\n if (isStaticChildren)\n if (isArrayImpl(children)) {\n for (\n isStaticChildren = 0;\n isStaticChildren < children.length;\n isStaticChildren++\n )\n validateChildKeys(children[isStaticChildren]);\n Object.freeze && Object.freeze(children);\n } else\n console.error(\n \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n );\n else validateChildKeys(children);\n if (hasOwnProperty.call(config, \"key\")) {\n children = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return \"key\" !== k;\n });\n isStaticChildren =\n 0 < keys.length\n ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n : \"{key: someKey}\";\n didWarnAboutKeySpread[children + isStaticChildren] ||\n ((keys =\n 0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n console.error(\n 'A props object containing a \"key\" prop is being spread into JSX:\\n let props = %s;\\n <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n let props = %s;\\n <%s key={someKey} {...props} />',\n isStaticChildren,\n children,\n keys,\n children\n ),\n (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n }\n children = null;\n void 0 !== maybeKey &&\n (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n children &&\n defineKeyPropWarningGetter(\n maybeKey,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n return ReactElement(\n type,\n children,\n maybeKey,\n getOwner(),\n debugStack,\n debugTask\n );\n }\n function validateChildKeys(node) {\n isValidElement(node)\n ? node._store && (node._store.validated = 1)\n : \"object\" === typeof node &&\n null !== node &&\n node.$$typeof === REACT_LAZY_TYPE &&\n (\"fulfilled\" === node._payload.status\n ? isValidElement(node._payload.value) &&\n node._payload.value._store &&\n (node._payload.value._store.validated = 1)\n : node._store && (node._store.validated = 1));\n }\n function isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n }\n var React = require(\"react\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n isArrayImpl = Array.isArray,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n React = {\n react_stack_bottom_frame: function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n React,\n UnknownOwner\n )();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutKeySpread = {};\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.jsx = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !1,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n exports.jsxs = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !0,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","\nimport type { GridColDef, GridRowModel, GridColumnPinning, GridRowPinning, GridPinnedPosition, GridRowId } from '../../types';\n\nexport function isColumnPinned(field: string, pinnedColumns?: GridColumnPinning): GridPinnedPosition | null {\n if (!pinnedColumns) return null;\n\n if (pinnedColumns.left?.includes(field)) {\n return 'left';\n }\n\n if (pinnedColumns.right?.includes(field)) {\n return 'right';\n }\n\n return null;\n}\n\nexport function getPinnedColumnGroups<R extends GridRowModel = GridRowModel>(\n columns: GridColDef<R>[],\n pinnedColumns?: GridColumnPinning\n): {\n left: GridColDef<R>[];\n center: GridColDef<R>[];\n right: GridColDef<R>[];\n} {\n const left: GridColDef<R>[] = [];\n const center: GridColDef<R>[] = [];\n const right: GridColDef<R>[] = [];\n\n if (!pinnedColumns) {\n return { left, center: columns, right };\n }\n\n columns.forEach(col => {\n const pinnedPosition = isColumnPinned(col.field, pinnedColumns);\n\n if (pinnedPosition === 'left') {\n left.push(col);\n } else if (pinnedPosition === 'right') {\n right.push(col);\n } else {\n center.push(col);\n }\n });\n\n if (pinnedColumns.left) {\n left.sort((a, b) => {\n const aIndex = pinnedColumns.left!.indexOf(a.field);\n const bIndex = pinnedColumns.left!.indexOf(b.field);\n return aIndex - bIndex;\n });\n }\n\n if (pinnedColumns.right) {\n right.sort((a, b) => {\n const aIndex = pinnedColumns.right!.indexOf(a.field);\n const bIndex = pinnedColumns.right!.indexOf(b.field);\n return aIndex - bIndex;\n });\n }\n\n return { left, center, right };\n}\n\nexport function calculatePinnedPositions<R extends GridRowModel = GridRowModel>(\n columns: GridColDef<R>[],\n columnWidths: Record<string, number>,\n pinnedColumns?: GridColumnPinning,\n checkboxSelection?: boolean,\n pinCheckboxColumn?: boolean,\n hasDetailPanel?: boolean,\n pinExpandColumn?: boolean,\n rowReordering?: boolean\n): Record<string, number> {\n const positions: Record<string, number> = {};\n\n if (!pinnedColumns) return positions;\n\n const groups = getPinnedColumnGroups(columns, pinnedColumns);\n\n let leftOffset = 0;\n\n if (rowReordering) {\n leftOffset += 48;\n }\n\n if (hasDetailPanel && pinExpandColumn) {\n leftOffset += 48; \n }\n\n if (checkboxSelection && pinCheckboxColumn) {\n leftOffset += 48; \n }\n\n groups.left.forEach(col => {\n positions[col.field] = leftOffset;\n const width = columnWidths[col.field] ?? col.width ?? 100;\n leftOffset += width;\n });\n\n let rightOffset = 0;\n\n [...groups.right].reverse().forEach(col => {\n const width = columnWidths[col.field] ?? col.width ?? 100;\n positions[col.field] = rightOffset;\n rightOffset += width;\n });\n\n return positions;\n}\n\nexport function isColumnPinnable<R extends GridRowModel = GridRowModel>(\n colDef: GridColDef<R>\n): boolean {\n return colDef.pinnable !== false;\n}\n\nexport function pinColumn(\n field: string,\n position: GridPinnedPosition,\n currentPinning?: GridColumnPinning\n): GridColumnPinning {\n const newPinning: GridColumnPinning = {\n left: [...(currentPinning?.left || [])],\n right: [...(currentPinning?.right || [])]\n };\n\n newPinning.left = (newPinning.left || []).filter(f => f !== field);\n newPinning.right = (newPinning.right || []).filter(f => f !== field);\n\n if (position === 'left') {\n if (!newPinning.left) newPinning.left = [];\n newPinning.left.push(field);\n } else {\n if (!newPinning.right) newPinning.right = [];\n newPinning.right.push(field);\n }\n\n return newPinning;\n}\n\nexport function unpinColumn(\n field: string,\n currentPinning?: GridColumnPinning\n): GridColumnPinning {\n if (!currentPinning) return {};\n\n return {\n left: currentPinning.left?.filter(f => f !== field) || [],\n right: currentPinning.right?.filter(f => f !== field) || []\n };\n}\n\nexport function getPinnedColumnsWidth(\n columns: GridColDef[],\n columnWidths: Record<string, number>,\n position: GridPinnedPosition,\n pinnedColumns?: GridColumnPinning\n): number {\n if (!pinnedColumns) return 0;\n\n const pinnedFields = position === 'left' ? pinnedColumns.left : pinnedColumns.right;\n if (!pinnedFields) return 0;\n\n return pinnedFields.reduce((total, field) => {\n const col = columns.find(c => c.field === field);\n if (!col) return total;\n\n const width = columnWidths[field] ?? col.width ?? 100;\n return total + width;\n }, 0);\n}\n\nexport function isRowPinned(\n rowId: GridRowId,\n pinnedRows?: GridRowPinning\n): 'top' | 'bottom' | null {\n if (!pinnedRows) return null;\n\n if (pinnedRows.top?.includes(rowId)) {\n return 'top';\n }\n\n if (pinnedRows.bottom?.includes(rowId)) {\n return 'bottom';\n }\n\n return null;\n}\n\nexport function getPinnedRowGroups<R extends GridRowModel = GridRowModel>(\n rows: R[],\n pinnedRows?: GridRowPinning\n): {\n top: R[];\n center: R[];\n bottom: R[];\n} {\n const top: R[] = [];\n const center: R[] = [];\n const bottom: R[] = [];\n\n if (!pinnedRows) {\n return { top, center: rows, bottom };\n }\n\n rows.forEach(row => {\n const pinnedPosition = isRowPinned(row.id, pinnedRows);\n\n if (pinnedPosition === 'top') {\n top.push(row);\n } else if (pinnedPosition === 'bottom') {\n bottom.push(row);\n } else {\n center.push(row);\n }\n });\n\n if (pinnedRows.top) {\n top.sort((a, b) => {\n const aIndex = pinnedRows.top!.indexOf(a.id);\n const bIndex = pinnedRows.top!.indexOf(b.id);\n return aIndex - bIndex;\n });\n }\n\n if (pinnedRows.bottom) {\n bottom.sort((a, b) => {\n const aIndex = pinnedRows.bottom!.indexOf(a.id);\n const bIndex = pinnedRows.bottom!.indexOf(b.id);\n return aIndex - bIndex;\n });\n }\n\n return { top, center, bottom };\n}\n\nexport function pinRow(\n rowId: GridRowId,\n position: 'top' | 'bottom',\n currentPinning?: GridRowPinning\n): GridRowPinning {\n const newPinning: GridRowPinning = {\n top: [...(currentPinning?.top || [])],\n bottom: [...(currentPinning?.bottom || [])]\n };\n\n newPinning.top = (newPinning.top || []).filter(id => id !== rowId);\n newPinning.bottom = (newPinning.bottom || []).filter(id => id !== rowId);\n\n if (position === 'top') {\n if (!newPinning.top) newPinning.top = [];\n newPinning.top.push(rowId);\n } else {\n if (!newPinning.bottom) newPinning.bottom = [];\n newPinning.bottom.push(rowId);\n }\n\n return newPinning;\n}\n\nexport function unpinRow(\n rowId: GridRowId,\n currentPinning?: GridRowPinning\n): GridRowPinning {\n if (!currentPinning) return {};\n\n return {\n top: currentPinning.top?.filter(id => id !== rowId) || [],\n bottom: currentPinning.bottom?.filter(id => id !== rowId) || []\n };\n}\n\nexport function getPinnedRowsCount(\n position: 'top' | 'bottom',\n pinnedRows?: GridRowPinning\n): number {\n if (!pinnedRows) return 0;\n\n const pinnedIds = position === 'top' ? pinnedRows.top : pinnedRows.bottom;\n return pinnedIds?.length || 0;\n}\n","import { useMemo } from 'react';\nimport type { GridColDef, GridRowModel, GridRowId, GridColumnPinning, GridDetailPanelHeight } from '../../types';\nimport { isColumnPinned } from '../../utils/pinning';\n\nexport interface UseLayoutParams<R extends GridRowModel> {\n rowHeight: number;\n pagination: boolean;\n paginatedUnpinnedRows: R[];\n sortedUnpinnedRows: R[];\n expandedRowIds: Set<GridRowId>;\n getDetailPanelHeight?: (params: { row: R; id: GridRowId; rowIndex: number }) => GridDetailPanelHeight;\n pinnedTopRowsLength: number;\n pinnedBottomRowsLength: number;\n visibleOrderedColumns: GridColDef<R>[];\n pinnedColumns?: GridColumnPinning;\n columnWidths: Record<string, number>;\n viewportWidth: number;\n checkboxSelection: boolean;\n hasDetailPanel: boolean;\n rowReordering: boolean;\n pinCheckboxColumn: boolean;\n pinExpandColumn: boolean;\n autoHeight: boolean;\n paginationMode: string;\n isLoading: boolean;\n pageSize: number;\n}\n\nexport interface LayoutResult<R extends GridRowModel> {\n rowHeights: number[];\n cumulativeHeights: number[];\n unpinnedRowsHeight: number;\n pinnedTopHeight: number;\n pinnedBottomHeight: number;\n leftPinnedCols: (GridColDef<R> & { width: number; zIndex: number })[];\n rightPinnedCols: (GridColDef<R> & { width: number; zIndex: number })[];\n unpinnedColsWithWidth: (GridColDef<R> & { width: number })[];\n unpinnedColWidths: number[];\n unpinnedAccWidths: number[];\n totalWidth: number;\n leftWidth: number;\n rightWidth: number;\n unpinnedTotalWidth: number;\n systemColumnsWidth: number;\n pinnedTopRowsLength: number;\n pinnedBottomRowsLength: number;\n unpinnedRowsLength: number;\n}\n\nfunction parseWidth(width: number | string | undefined): { type: 'fixed' | 'percentage' | 'auto'; value: number } {\n if (width === undefined) return { type: 'auto', value: 0 };\n if (typeof width === 'number') return { type: 'fixed', value: width };\n if (typeof width === 'string') {\n if (width.toLowerCase() === 'auto') return { type: 'auto', value: 0 };\n if (width.endsWith('%')) {\n const percentage = parseFloat(width);\n return { type: 'percentage', value: percentage };\n }\n const floatVal = parseFloat(width);\n if (!isNaN(floatVal)) return { type: 'fixed', value: floatVal };\n }\n return { type: 'fixed', value: 100 };\n}\n\nexport function useLayout<R extends GridRowModel>(params: UseLayoutParams<R>): LayoutResult<R> {\n const {\n rowHeight,\n pagination,\n paginatedUnpinnedRows,\n sortedUnpinnedRows,\n expandedRowIds,\n getDetailPanelHeight,\n pinnedTopRowsLength,\n pinnedBottomRowsLength,\n visibleOrderedColumns,\n pinnedColumns,\n columnWidths,\n viewportWidth,\n checkboxSelection,\n hasDetailPanel,\n rowReordering,\n paginationMode,\n isLoading,\n pageSize,\n } = params;\n\n return useMemo<LayoutResult<R>>(() => {\n const unpinnedRows = pagination ? paginatedUnpinnedRows : sortedUnpinnedRows;\n\n const rowHeights = unpinnedRows.map((row, index) => {\n let height = rowHeight;\n if (expandedRowIds.has(row.id)) {\n const detailHeight = getDetailPanelHeight?.({ row, id: row.id, rowIndex: pinnedTopRowsLength + index }) ?? 200;\n height += typeof detailHeight === 'number' ? detailHeight : parseInt(String(detailHeight), 10) || 200;\n }\n return height;\n });\n\n const cumulativeHeights = rowHeights.reduce((acc, height, index) => {\n acc.push((acc[index - 1] || 0) + height);\n return acc;\n }, [] as number[]);\n\n const skeletonCount = (paginationMode === 'infinite' && isLoading && unpinnedRows.length > 0)\n ? Math.min(pageSize, 20)\n : 0;\n const unpinnedRowsHeight = (cumulativeHeights[cumulativeHeights.length - 1] || 0) + skeletonCount * rowHeight;\n const pinnedTopHeight = pinnedTopRowsLength * rowHeight;\n const pinnedBottomHeight = pinnedBottomRowsLength * rowHeight;\n\n const rawLeftPinnedCols: GridColDef<R>[] = [];\n const rawRightPinnedCols: GridColDef<R>[] = [];\n const unpinnedCols: GridColDef<R>[] = [];\n const unpinnedColWidths: number[] = [];\n\n visibleOrderedColumns.forEach(col => {\n const pinned = isColumnPinned(col.field, pinnedColumns);\n if (pinned === 'left') {\n rawLeftPinnedCols.push(col);\n } else if (pinned === 'right') {\n rawRightPinnedCols.push(col);\n } else {\n unpinnedCols.push(col);\n }\n });\n\n const systemColumnsWidth = (checkboxSelection ? 48 : 0) + (hasDetailPanel ? 48 : 0) + (rowReordering ? 48 : 0);\n\n const getColWidth = (c: GridColDef<R>) => columnWidths[c.field] ?? c.width;\n\n const leftWidth = rawLeftPinnedCols.reduce((sum, c) => {\n const parsed = parseWidth(getColWidth(c));\n return sum + (parsed.type === 'fixed' ? parsed.value : 100);\n }, 0);\n const rightWidth = rawRightPinnedCols.reduce((sum, c) => {\n const parsed = parseWidth(getColWidth(c));\n return sum + (parsed.type === 'fixed' ? parsed.value : 100);\n }, 0);\n\n const naturalFlexWidth = unpinnedCols.reduce((sum, col) => {\n const hasManualWidth = Object.prototype.hasOwnProperty.call(columnWidths, col.field);\n if (!hasManualWidth && col.flex && col.flex > 0) {\n const minWidth = col.minWidth ?? 150;\n const w = typeof col.width === 'number' ? col.width : 150;\n return sum + (minWidth || w);\n }\n const parsed = parseWidth(getColWidth(col));\n if (parsed.type === 'fixed') return sum + parsed.value;\n if (parsed.type === 'percentage') return sum + 100;\n return sum + (col.minWidth ?? 150);\n }, 0);\n\n const availableWidth = Math.max(\n viewportWidth - systemColumnsWidth - leftWidth - rightWidth,\n naturalFlexWidth\n );\n\n const fixedWidthCols: Array<{ col: GridColDef<R>; width: number }> = [];\n const percentageCols: Array<{ col: GridColDef<R>; percentage: number }> = [];\n const flexCols: Array<{ col: GridColDef<R>; flex: number }> = [];\n\n unpinnedCols.forEach(col => {\n const hasManualWidth = Object.prototype.hasOwnProperty.call(columnWidths, col.field);\n const parsed = parseWidth(getColWidth(col));\n\n if (!hasManualWidth && col.flex && col.flex > 0) {\n flexCols.push({ col, flex: col.flex });\n return;\n }\n\n if (parsed.type === 'fixed') {\n fixedWidthCols.push({ col, width: parsed.value });\n } else if (parsed.type === 'percentage') {\n percentageCols.push({ col, percentage: parsed.value });\n } else {\n flexCols.push({ col, flex: 1 });\n }\n });\n\n const fixedWidth = fixedWidthCols.reduce((sum, { width }) => sum + width, 0);\n let remainingSpaceForFlex = Math.max(0, availableWidth - fixedWidth);\n\n const percentageWidthMap = new Map<string, number>();\n percentageCols.forEach(({ col, percentage }) => {\n const calculatedWidth = (percentage / 100) * remainingSpaceForFlex;\n percentageWidthMap.set(col.field, calculatedWidth);\n remainingSpaceForFlex -= calculatedWidth;\n });\n remainingSpaceForFlex = Math.max(0, remainingSpaceForFlex);\n\n const finalFlexWidths = new Map<string, number>();\n const flexItems = flexCols.map(f => ({\n ...f,\n minWidth: f.col.minWidth ?? 50,\n maxWidth: f.col.maxWidth ?? Infinity,\n frozen: false,\n computedWidth: 0\n }));\n\n const solveFlexAllocation = () => {\n let iterations = 0;\n const maxIterations = flexItems.length * 2;\n\n while (iterations < maxIterations) {\n iterations++;\n const unfrozen = flexItems.filter(f => !f.frozen);\n if (unfrozen.length === 0) break;\n\n const unfrozenFlexTotal = unfrozen.reduce((sum, f) => sum + f.flex, 0);\n const frozenWidthTotal = flexItems.reduce((sum, f) => f.frozen ? sum + f.computedWidth : sum, 0);\n const currentFreeSpace = Math.max(0, remainingSpaceForFlex - frozenWidthTotal);\n\n if (unfrozenFlexTotal <= 0) {\n unfrozen.forEach(f => { f.computedWidth = f.minWidth; f.frozen = true; });\n break;\n }\n\n const pixelsPerFlex = currentFreeSpace / unfrozenFlexTotal;\n let totalViolation = 0;\n const minViolators: typeof flexItems = [];\n const maxViolators: typeof flexItems = [];\n\n unfrozen.forEach(f => {\n const rawWidth = pixelsPerFlex * f.flex;\n if (rawWidth < f.minWidth) {\n totalViolation += f.minWidth - rawWidth;\n minViolators.push(f);\n } else if (rawWidth > f.maxWidth) {\n totalViolation += f.maxWidth - rawWidth;\n maxViolators.push(f);\n } else {\n f.computedWidth = rawWidth;\n }\n });\n\n if (minViolators.length === 0 && maxViolators.length === 0) {\n unfrozen.forEach(f => f.frozen = true);\n break;\n }\n\n if (totalViolation > 0) {\n minViolators.forEach(f => { f.computedWidth = f.minWidth; f.frozen = true; });\n } else if (totalViolation < 0) {\n maxViolators.forEach(f => { f.computedWidth = f.maxWidth; f.frozen = true; });\n } else {\n minViolators.forEach(f => { f.computedWidth = f.minWidth; f.frozen = true; });\n maxViolators.forEach(f => { f.computedWidth = f.maxWidth; f.frozen = true; });\n }\n }\n };\n\n solveFlexAllocation();\n flexItems.forEach(f => finalFlexWidths.set(f.col.field, f.computedWidth));\n\n const computedWidthMap = new Map<string, number>();\n unpinnedCols.forEach(col => {\n let computedWidth: number;\n if (finalFlexWidths.has(col.field)) {\n computedWidth = finalFlexWidths.get(col.field)!;\n } else {\n const fixedCol = fixedWidthCols.find(f => f.col.field === col.field);\n const pctCol = percentageCols.find(p => p.col.field === col.field);\n if (fixedCol) {\n computedWidth = fixedCol.width;\n } else if (pctCol) {\n const rawPctWidth = percentageWidthMap.get(col.field) || 0;\n computedWidth = Math.max(col.minWidth ?? 50, rawPctWidth || 100);\n } else {\n computedWidth = 100;\n }\n }\n unpinnedColWidths.push(computedWidth);\n computedWidthMap.set(col.field, computedWidth);\n });\n\n const unpinnedColsWithWidth = unpinnedCols.map(col => {\n const flexItem = flexItems.find(f => f.col.field === col.field);\n return {\n ...col,\n width: computedWidthMap.get(col.field) ?? (typeof col.width === 'number' ? col.width : 100),\n flex: flexItem ? flexItem.flex : col.flex\n };\n });\n\n const baseLeftZ = 11;\n const leftPinnedCols = rawLeftPinnedCols.map((col, i) => {\n const parsed = parseWidth(getColWidth(col));\n return { ...col, width: parsed.type === 'fixed' ? parsed.value : 100, zIndex: baseLeftZ + i };\n });\n\n const baseRightZ = 11;\n const rightPinnedCols = rawRightPinnedCols.map((col, i) => {\n const parsed = parseWidth(getColWidth(col));\n return {\n ...col,\n width: parsed.type === 'fixed' ? parsed.value : 100,\n zIndex: baseRightZ + (rawRightPinnedCols.length - 1 - i)\n };\n });\n\n const unpinnedTotalWidth = unpinnedColWidths.reduce((sum, w) => sum + w, 0);\n const totalWidth = leftWidth + unpinnedTotalWidth + rightWidth + systemColumnsWidth;\n const unpinnedAccWidths = unpinnedColWidths.reduce((acc, w, i) => {\n acc.push((acc[i - 1] || 0) + w);\n return acc;\n }, [] as number[]);\n\n return {\n rowHeights,\n cumulativeHeights,\n unpinnedRowsHeight,\n pinnedTopHeight,\n pinnedBottomHeight,\n leftPinnedCols,\n rightPinnedCols,\n unpinnedColsWithWidth,\n unpinnedColWidths,\n unpinnedAccWidths,\n totalWidth,\n leftWidth,\n rightWidth,\n unpinnedTotalWidth,\n systemColumnsWidth,\n pinnedTopRowsLength,\n pinnedBottomRowsLength,\n unpinnedRowsLength: unpinnedRows.length,\n };\n }, [\n rowHeight,\n pagination,\n paginatedUnpinnedRows,\n sortedUnpinnedRows,\n expandedRowIds,\n getDetailPanelHeight,\n pinnedTopRowsLength,\n pinnedBottomRowsLength,\n visibleOrderedColumns,\n pinnedColumns,\n columnWidths,\n viewportWidth,\n checkboxSelection,\n hasDetailPanel,\n rowReordering,\n paginationMode,\n isLoading,\n pageSize,\n ]);\n}\n","/**\n * Vertically scrolls the grid viewport so the center (unpinned) row at `centerIndex`\n * is fully visible below the sticky header / top-pinned rows and above the\n * bottom-pinned rows. `cumulativeHeights` is the unpinned-row layout.\n */\nexport function scrollRowIntoView(\n viewport: HTMLElement,\n centerIndex: number,\n cumulativeHeights: number[],\n pinnedBottomHeight: number,\n): void {\n if (centerIndex < 0 || centerIndex >= cumulativeHeights.length) return;\n const virtualContainer = viewport.querySelector<HTMLElement>('.ogx__virtual-container');\n if (!virtualContainer) return;\n\n const { scrollTop, clientHeight } = viewport;\n // Everything above the center rows is sticky, so it covers exactly this many\n // pixels at the top of the viewport at any scroll position.\n const stickyTop = virtualContainer.getBoundingClientRect().top - viewport.getBoundingClientRect().top + scrollTop;\n const rowTop = stickyTop + (centerIndex === 0 ? 0 : cumulativeHeights[centerIndex - 1]);\n const rowBottom = stickyTop + cumulativeHeights[centerIndex];\n\n if (rowTop < scrollTop + stickyTop) {\n viewport.scrollTop = Math.max(0, rowTop - stickyTop);\n } else if (rowBottom > scrollTop + clientHeight - pinnedBottomHeight) {\n viewport.scrollTop = rowBottom - clientHeight + pinnedBottomHeight;\n }\n}\n","import { useState, useCallback } from 'react';\nimport { scrollRowIntoView } from '../../utils/scroll';\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 pinnedBottomHeight: 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 /** Number of top-pinned rows at the start of allRenderableRows. */\n pinnedTopRowCount?: number;\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 pinnedTopRowCount = 0,\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, pinnedBottomHeight, columnMetrics } = virtualization;\n const { clientWidth, scrollLeft } = el;\n\n // allRenderableRows = pinned top + center + pinned bottom; pinned rows are sticky and always visible.\n if (nextRowIndex >= 0) {\n scrollRowIntoView(el, nextRowIndex - pinnedTopRowCount, cumulativeHeights, pinnedBottomHeight);\n }\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 pinnedTopRowCount,\n ]);\n\n return { focusedCell, setFocusedCell, handleFocus, handleBlur, handleKeyDown };\n}\n","import { useState, useCallback, useMemo } from 'react';\nimport type {\n GridRowId,\n GridSortItem,\n GridColumnPinning,\n GridPaginationModel,\n GridAggregationModel,\n GridPivotModel,\n} from '../../types';\nimport type { GridInitialState } from '../../state/types';\n\nexport interface UseGridControlledStateParams {\n initialState?: GridInitialState;\n\n sortModel?: GridSortItem[];\n onSortModelChange?: (model: GridSortItem[]) => void;\n\n aggregationModel?: GridAggregationModel;\n onAggregationModelChange?: (model: GridAggregationModel) => void;\n\n columnVisibilityModel?: Record<string, boolean>;\n onColumnVisibilityModelChange?: (model: Record<string, boolean>) => void;\n\n pinnedColumns?: GridColumnPinning;\n onPinnedColumnsChange?: (model: GridColumnPinning) => void;\n\n pivotModel?: GridPivotModel;\n onPivotModelChange?: (model: GridPivotModel) => void;\n\n paginationModel?: GridPaginationModel;\n onPaginationModelChange?: (model: GridPaginationModel) => void;\n\n rowSelectionModel?: GridRowId[];\n onRowSelectionModelChange?: (model: GridRowId[]) => void;\n}\n\nexport interface UseGridControlledStateReturn {\n // sort\n sortModel: GridSortItem[];\n isSortControlled: boolean;\n setInternalSortModel: React.Dispatch<React.SetStateAction<GridSortItem[]>>;\n\n // aggregation\n aggregationModel: GridAggregationModel;\n handleAggregationModelChange: (model: GridAggregationModel) => void;\n\n // column visibility\n columnVisibilityModel: Record<string, boolean>;\n handleColumnVisibilityModelChange: (model: Record<string, boolean>) => void;\n\n // pinned columns\n pinnedColumns: GridColumnPinning;\n handlePinnedColumnsChange: (model: GridColumnPinning) => void;\n\n // pivot\n currentPivotModel: GridPivotModel;\n handlePivotModelChange: (model: GridPivotModel) => void;\n\n // pagination\n effectivePaginationModel: GridPaginationModel;\n handlePaginationModelChange: (model: GridPaginationModel) => void;\n\n // selection\n rowSelectionModel: GridRowId[];\n selectedRowIds: Set<GridRowId>;\n isSelectionControlled: boolean;\n setInternalRowSelectionModel: React.Dispatch<React.SetStateAction<GridRowId[]>>;\n}\n\nconst EMPTY_PIVOT_MODEL: GridPivotModel = { rowFields: [], columnFields: [], valueFields: [] };\n\nexport function useGridControlledState(params: UseGridControlledStateParams): UseGridControlledStateReturn {\n const {\n initialState,\n sortModel: propSortModel,\n aggregationModel: propAggregationModel,\n onAggregationModelChange,\n columnVisibilityModel: propColumnVisibilityModel,\n onColumnVisibilityModelChange,\n pinnedColumns: propPinnedColumns,\n onPinnedColumnsChange,\n pivotModel: propPivotModel,\n onPivotModelChange,\n paginationModel: propPaginationModel,\n onPaginationModelChange,\n rowSelectionModel: propRowSelectionModel,\n onRowSelectionModelChange,\n } = params;\n\n // ── Sort ─────────────────────────────────────────────────────────────────\n const [internalSortModel, setInternalSortModel] = useState<GridSortItem[]>(\n () => initialState?.sorting?.sortModel ?? []\n );\n const isSortControlled = propSortModel !== undefined;\n const sortModel = isSortControlled ? propSortModel! : internalSortModel;\n\n // ── Aggregation ──────────────────────────────────────────────────────────\n const isAggregationControlled = propAggregationModel !== undefined;\n const [internalAggregationModel, setInternalAggregationModel] = useState<GridAggregationModel>(\n () => propAggregationModel ?? {}\n );\n const aggregationModel = isAggregationControlled ? propAggregationModel! : internalAggregationModel;\n\n const handleAggregationModelChange = useCallback((model: GridAggregationModel) => {\n if (!isAggregationControlled) setInternalAggregationModel(model);\n onAggregationModelChange?.(model);\n }, [isAggregationControlled, onAggregationModelChange]);\n\n // ── Column visibility ────────────────────────────────────────────────────\n const isColumnVisibilityControlled = propColumnVisibilityModel !== undefined;\n const [internalColumnVisibilityModel, setInternalColumnVisibilityModel] = useState<Record<string, boolean>>(\n () => initialState?.columns?.columnVisibilityModel ?? {}\n );\n const columnVisibilityModel = isColumnVisibilityControlled\n ? propColumnVisibilityModel!\n : internalColumnVisibilityModel;\n\n const handleColumnVisibilityModelChange = useCallback((model: Record<string, boolean>) => {\n if (!isColumnVisibilityControlled) setInternalColumnVisibilityModel(model);\n onColumnVisibilityModelChange?.(model);\n }, [isColumnVisibilityControlled, onColumnVisibilityModelChange]);\n\n // ── Pinned columns ───────────────────────────────────────────────────────\n const isPinnedColumnsControlled = propPinnedColumns !== undefined;\n const [internalPinnedColumns, setInternalPinnedColumns] = useState<GridColumnPinning>(\n () => initialState?.columns?.pinnedColumns ?? {}\n );\n const pinnedColumns = isPinnedColumnsControlled ? propPinnedColumns! : internalPinnedColumns;\n\n const handlePinnedColumnsChange = useCallback((model: GridColumnPinning) => {\n if (!isPinnedColumnsControlled) setInternalPinnedColumns(model);\n onPinnedColumnsChange?.(model);\n }, [isPinnedColumnsControlled, onPinnedColumnsChange]);\n\n // ── Pivot ────────────────────────────────────────────────────────────────\n const [internalPivotModel, setInternalPivotModel] = useState<GridPivotModel>(\n () => propPivotModel ?? EMPTY_PIVOT_MODEL\n );\n const currentPivotModel = propPivotModel ?? internalPivotModel;\n\n const handlePivotModelChange = useCallback((model: GridPivotModel) => {\n setInternalPivotModel(model);\n onPivotModelChange?.(model);\n }, [onPivotModelChange]);\n\n // ── Pagination ───────────────────────────────────────────────────────────\n const isPaginationControlled = propPaginationModel !== undefined;\n const [internalPaginationModel, setInternalPaginationModel] = useState<GridPaginationModel>(\n () => initialState?.pagination?.paginationModel ?? propPaginationModel ?? { page: 0, pageSize: 100 }\n );\n const effectivePaginationModel = isPaginationControlled ? propPaginationModel : internalPaginationModel;\n\n const handlePaginationModelChange = useCallback((newModel: GridPaginationModel) => {\n if (!isPaginationControlled) setInternalPaginationModel(newModel);\n onPaginationModelChange?.(newModel);\n }, [isPaginationControlled, onPaginationModelChange]);\n\n // ── Row selection ────────────────────────────────────────────────────────\n const isSelectionControlled = propRowSelectionModel !== undefined;\n const [internalRowSelectionModel, setInternalRowSelectionModel] = useState<GridRowId[]>([]);\n const rowSelectionModel = isSelectionControlled ? propRowSelectionModel! : internalRowSelectionModel;\n const selectedRowIds = useMemo(() => new Set(rowSelectionModel), [rowSelectionModel]);\n\n // onRowSelectionModelChange is consumed by the caller directly (they call it when selection changes)\n void onRowSelectionModelChange;\n\n return {\n sortModel: sortModel as GridSortItem[],\n isSortControlled,\n setInternalSortModel: setInternalSortModel as React.Dispatch<React.SetStateAction<GridSortItem[]>>,\n\n aggregationModel,\n handleAggregationModelChange,\n\n columnVisibilityModel,\n handleColumnVisibilityModelChange,\n\n pinnedColumns,\n handlePinnedColumnsChange,\n\n currentPivotModel,\n handlePivotModelChange,\n\n effectivePaginationModel,\n handlePaginationModelChange,\n\n rowSelectionModel,\n selectedRowIds,\n isSelectionControlled,\n setInternalRowSelectionModel,\n };\n}\n","\nimport type { GridRowModel, GridFilterItem, GridFilterModel, GridFilterGroup } from '../../types';\n\nexport const FILTER_OPERATORS = {\n contains: (value: unknown, filterValue: unknown): boolean => {\n if (value == null || filterValue == null) return false;\n return String(value).toLowerCase().includes(String(filterValue).toLowerCase());\n },\n\n equals: (value: unknown, filterValue: unknown): boolean => {\n if (value == null && filterValue == null) return true;\n if (value == null || filterValue == null) return false;\n return String(value).toLowerCase() === String(filterValue).toLowerCase();\n },\n\n startsWith: (value: unknown, filterValue: unknown): boolean => {\n if (value == null || filterValue == null) return false;\n return String(value).toLowerCase().startsWith(String(filterValue).toLowerCase());\n },\n\n endsWith: (value: unknown, filterValue: unknown): boolean => {\n if (value == null || filterValue == null) return false;\n return String(value).toLowerCase().endsWith(String(filterValue).toLowerCase());\n },\n\n isEmpty: (value: unknown): boolean => {\n return value == null || String(value).trim() === '';\n },\n\n isNotEmpty: (value: unknown): boolean => {\n return value != null && String(value).trim() !== '';\n },\n\n '>': (value: unknown, filterValue: unknown): boolean => {\n if (value == null || filterValue == null) return false;\n const numValue = Number(value);\n const numFilter = Number(filterValue);\n if (isNaN(numValue) || isNaN(numFilter)) return false;\n return numValue > numFilter;\n },\n\n '>=': (value: unknown, filterValue: unknown): boolean => {\n if (value == null || filterValue == null) return false;\n const numValue = Number(value);\n const numFilter = Number(filterValue);\n if (isNaN(numValue) || isNaN(numFilter)) return false;\n return numValue >= numFilter;\n },\n\n '<': (value: unknown, filterValue: unknown): boolean => {\n if (value == null || filterValue == null) return false;\n const numValue = Number(value);\n const numFilter = Number(filterValue);\n if (isNaN(numValue) || isNaN(numFilter)) return false;\n return numValue < numFilter;\n },\n\n '<=': (value: unknown, filterValue: unknown): boolean => {\n if (value == null || filterValue == null) return false;\n const numValue = Number(value);\n const numFilter = Number(filterValue);\n if (isNaN(numValue) || isNaN(numFilter)) return false;\n return numValue <= numFilter;\n },\n\n '!=': (value: unknown, filterValue: unknown): boolean => {\n if (filterValue == null || filterValue === '') return true;\n // Numeric comparison if both are numbers, otherwise string\n const numV = Number(value);\n const numF = Number(filterValue);\n if (!isNaN(numV) && !isNaN(numF)) return numV !== numF;\n return String(value).toLowerCase() !== String(filterValue).toLowerCase();\n },\n\n isAnyOf: (value: unknown, filterValue: unknown[]): boolean => {\n if (value == null || !Array.isArray(filterValue)) return false;\n return filterValue.some(v =>\n String(value).toLowerCase() === String(v).toLowerCase()\n );\n },\n\n not: (value: unknown, filterValue: unknown): boolean => {\n if (value == null && filterValue == null) return false;\n if (value == null || filterValue == null) return true;\n return String(value).toLowerCase() !== String(filterValue).toLowerCase();\n },\n\n // Used by boolean and singleSelect — case-insensitive string comparison\n is: (value: unknown, filterValue: unknown): boolean => {\n if (filterValue == null || filterValue === '') return true;\n const rowStr = String(value).toLowerCase();\n const filterStr = String(filterValue).toLowerCase();\n return rowStr === filterStr;\n },\n\n '=': (value: unknown, filterValue: unknown): boolean => {\n if (value == null || filterValue == null || filterValue === '') return false;\n return Number(value) === Number(filterValue);\n },\n};\n\n/**\n * Apply a single filter item to a row\n */\nexport function applyFilterItem<R extends GridRowModel>(\n row: R,\n filterItem: GridFilterItem\n): boolean {\n const { field, operator, value } = filterItem;\n\n // Get the value from the row\n const rowValue = row[field];\n\n // Get the operator function\n const operatorFn = FILTER_OPERATORS[operator];\n if (!operatorFn) {\n console.warn(`Unknown filter operator: ${operator}`);\n return true;\n }\n\n // Apply the operator\n return (operatorFn as (a: unknown, b: unknown) => boolean)(rowValue, value);\n}\n\n/**\n * Apply quick filter (global search across all fields)\n */\nexport function applyQuickFilter<R extends GridRowModel>(\n row: R,\n quickFilterValues: string[]\n): boolean {\n if (!quickFilterValues || quickFilterValues.length === 0) {\n return true;\n }\n\n // Check if any quick filter value matches any field in the row\n return quickFilterValues.every(filterValue => {\n const searchTerm = filterValue.toLowerCase();\n return Object.values(row).some(value => {\n if (value == null) return false;\n return String(value).toLowerCase().includes(searchTerm);\n });\n });\n}\n\n/**\n * Filter rows based on filter model\n */\n/**\n * Check if a row matches the filter model\n */\nexport function isRowMatchingFilter<R extends GridRowModel>(\n row: R,\n filterModel: GridFilterModel | GridFilterGroup // Accept Model or Group (similar structure)\n): boolean {\n // Normalize input: GridFilterModel matches GridFilterGroup shape largely, but let's be safe\n\n const items = filterModel.items ?? [];\n const logicOperator = filterModel.logicOperator ?? 'and';\n const quickFilterValues = ('quickFilterValues' in filterModel ? filterModel.quickFilterValues : undefined) ?? [];\n\n if (quickFilterValues.length > 0 && !applyQuickFilter(row, quickFilterValues)) {\n return false;\n }\n\n if (items.length === 0) {\n return true;\n }\n\n const evaluateItem = (item: GridFilterItem | GridFilterGroup): boolean => {\n if ('logicOperator' in item && 'items' in item) {\n\n const group = item as GridFilterGroup;\n const groupItems = group.items;\n if (groupItems.length === 0) return true;\n\n if (group.logicOperator === 'and') {\n return groupItems.every(evaluateItem);\n } else {\n return groupItems.some(evaluateItem);\n }\n } else {\n\n return applyFilterItem(row, item as GridFilterItem);\n }\n };\n\n if (logicOperator === 'and') {\n\n return items.every(evaluateItem);\n } else {\n\n return items.some(evaluateItem);\n }\n}\n\nexport function filterRows<R extends GridRowModel>(\n rows: R[],\n filterModel: GridFilterModel\n): R[] {\n if (!filterModel) return rows;\n\n const { items = [], quickFilterValues = [] } = filterModel;\n\n if (items.length === 0 && (!quickFilterValues || quickFilterValues.length === 0)) {\n return rows;\n }\n\n return rows.filter(row => isRowMatchingFilter(row, filterModel));\n}\n\nexport function getDefaultOperator(type?: string): string {\n switch (type) {\n case 'number':\n return '=';\n case 'date':\n return 'is';\n case 'boolean':\n return 'is';\n case 'singleSelect':\n return 'isAnyOf';\n default:\n return 'contains';\n }\n}\n\nexport function getOperatorsForType(type?: string): string[] {\n switch (type) {\n case 'number':\n return ['=', '!=', '>', '>=', '<', '<=', 'isEmpty', 'isNotEmpty'];\n case 'date':\n return ['is', 'not', 'after', 'onOrAfter', 'before', 'onOrBefore', 'isEmpty', 'isNotEmpty'];\n case 'boolean':\n return ['is'];\n case 'singleSelect':\n return ['isAnyOf', 'is', 'not'];\n default:\n return ['contains', 'equals', 'startsWith', 'endsWith', 'isEmpty', 'isNotEmpty'];\n }\n}\n","\nimport type { GridRowModel, GridSortItem } from '../../types';\n\nexport function compareValues(a: unknown, b: unknown, direction: 'asc' | 'desc'): number {\n\n if (a == null && b == null) return 0;\n if (a == null) return direction === 'asc' ? 1 : -1;\n if (b == null) return direction === 'asc' ? -1 : 1;\n\n if (typeof a === 'number' && typeof b === 'number') {\n return direction === 'asc' ? a - b : b - a;\n }\n\n if (a instanceof Date && b instanceof Date) {\n return direction === 'asc' \n ? a.getTime() - b.getTime() \n : b.getTime() - a.getTime();\n }\n\n const aStr = String(a).toLowerCase();\n const bStr = String(b).toLowerCase();\n\n if (direction === 'asc') {\n return aStr < bStr ? -1 : aStr > bStr ? 1 : 0;\n } else {\n return aStr > bStr ? -1 : aStr < bStr ? 1 : 0;\n }\n}\n\nexport function sortRows<R extends GridRowModel>(\n rows: R[],\n sortModel: GridSortItem[]\n): R[] {\n if (sortModel.length === 0) {\n return rows;\n }\n\n const sortedRows = [...rows];\n\n sortedRows.sort((a, b) => {\n for (const sortItem of sortModel) {\n const aValue = a[sortItem.field];\n const bValue = b[sortItem.field];\n\n const comparison = compareValues(aValue, bValue, sortItem.sort);\n\n if (comparison !== 0) {\n return comparison;\n }\n }\n return 0;\n });\n\n return sortedRows;\n}\n","import { useMemo } from 'react';\nimport { filterRows } from '../../utils/filtering';\nimport { sortRows } from '../../utils/sorting';\nimport { getPinnedRowGroups } from '../../utils/pinning';\nimport type { GridRowModel, GridFilterModel, GridSortItem, GridPaginationModel, GridRowPinning, GridDataSource } from '../../types';\n\ninterface HierarchyHandlers<R extends GridRowModel> {\n getVisibleRows: () => R[];\n}\n\nexport interface UseGridRowPipelineParams<R extends GridRowModel> {\n effectiveRows: R[];\n activeHierarchyHandlers: HierarchyHandlers<R> | null;\n filterMode: string;\n filterModel: GridFilterModel;\n dataSource?: GridDataSource<R>;\n sortModel: GridSortItem[];\n sortingMode: string;\n pagination: boolean;\n paginationMode: string;\n effectivePaginationModel: GridPaginationModel;\n pinnedRows?: GridRowPinning;\n isLoading: boolean;\n pageSize: number;\n}\n\nexport interface GridRowPipelineResult<R extends GridRowModel> {\n filteredRows: R[];\n pinnedTopRows: R[];\n unpinnedRows: R[];\n pinnedBottomRows: R[];\n sortedUnpinnedRows: R[];\n paginatedUnpinnedRows: R[];\n allRenderableRows: R[];\n}\n\nexport function useGridRowPipeline<R extends GridRowModel>(\n params: UseGridRowPipelineParams<R>\n): GridRowPipelineResult<R> {\n const {\n effectiveRows,\n activeHierarchyHandlers,\n filterMode,\n filterModel,\n dataSource,\n sortModel,\n sortingMode,\n pagination,\n paginationMode,\n effectivePaginationModel,\n pinnedRows,\n isLoading,\n pageSize,\n } = params;\n\n const filteredRows = useMemo<R[]>(() => {\n if (activeHierarchyHandlers) return (activeHierarchyHandlers.getVisibleRows() || []) as R[];\n if (filterMode === 'server' && dataSource) return effectiveRows;\n return filterRows(effectiveRows, filterModel) as R[];\n }, [effectiveRows, filterModel, activeHierarchyHandlers, filterMode, dataSource]);\n\n const { top: pinnedTopRows, center: unpinnedRows, bottom: pinnedBottomRows } = useMemo(() => {\n if (activeHierarchyHandlers) return { top: [] as R[], center: filteredRows, bottom: [] as R[] };\n return getPinnedRowGroups(filteredRows, pinnedRows);\n }, [filteredRows, pinnedRows, activeHierarchyHandlers]);\n\n const sortedUnpinnedRows = useMemo<R[]>(() => {\n if (activeHierarchyHandlers) return unpinnedRows;\n if (sortingMode === 'server' && dataSource) return unpinnedRows;\n return sortRows(unpinnedRows, sortModel) as R[];\n }, [unpinnedRows, sortModel, activeHierarchyHandlers, sortingMode, dataSource]);\n\n const paginatedUnpinnedRows = useMemo<R[]>(() => {\n if (!pagination) return sortedUnpinnedRows;\n if (paginationMode === 'server' && dataSource) return sortedUnpinnedRows;\n const start = effectivePaginationModel.page * effectivePaginationModel.pageSize;\n return sortedUnpinnedRows.slice(start, start + effectivePaginationModel.pageSize);\n }, [sortedUnpinnedRows, pagination, effectivePaginationModel.page, effectivePaginationModel.pageSize, paginationMode, dataSource]);\n\n const allRenderableRows = useMemo<R[]>(() => {\n if (activeHierarchyHandlers) return unpinnedRows;\n const centerRows = pagination ? paginatedUnpinnedRows : sortedUnpinnedRows;\n const base = [...pinnedTopRows, ...centerRows, ...pinnedBottomRows];\n\n if (paginationMode === 'infinite' && isLoading && base.length > 0) {\n const skeletonCount = Math.min(pageSize, 20);\n const skeletons = Array.from({ length: skeletonCount }, (_, i) => ({\n id: `__skeleton_${i}__`,\n _isSkeleton: true,\n }));\n return [...base, ...skeletons] as R[];\n }\n\n return base;\n }, [\n pinnedTopRows, paginatedUnpinnedRows, sortedUnpinnedRows, pinnedBottomRows,\n pagination, activeHierarchyHandlers, unpinnedRows, paginationMode, isLoading, pageSize,\n ]);\n\n return {\n filteredRows,\n pinnedTopRows,\n unpinnedRows,\n pinnedBottomRows,\n sortedUnpinnedRows,\n paginatedUnpinnedRows,\n allRenderableRows,\n };\n}\n","import { useMemo } from 'react';\nimport type { GridRowModel, GridColDef } from '../../types';\nimport type { LayoutResult } from './useLayout';\n\nexport interface UseGridVirtualizationParams<R extends GridRowModel> {\n layout: LayoutResult<R>;\n scrollTop: number;\n scrollLeft: number;\n viewportWidth: number;\n viewportHeight: number;\n autoHeight: boolean;\n rowReordering: boolean;\n hasDetailPanel: boolean;\n checkboxSelection: boolean;\n pinCheckboxColumn: boolean;\n pinExpandColumn: boolean;\n /** Adaptive overscan row count from useGridScrollSync. Defaults to 5. */\n overscanRows?: number;\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 overscanRows = 5,\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 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 overscanRows,\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\n// Injected hierarchy renderers replace the plain-cell path in Cell, so they must\n// render the formatted value themselves or valueFormatter is silently lost.\nconst displayValue = <R extends GridRowModel>(cellParams: GridRenderCellParams<R>): React.ReactNode =>\n cellParams.formattedValue ?? (cellParams.value as React.ReactNode);\n\nexport interface UseGridColumnsParams<R extends GridRowModel> {\n activeColumns: GridColDef<R>[];\n isHierarchyEnabled: boolean;\n isRowGrouping: boolean;\n isTreeData: boolean;\n activeHierarchyHandlers: HierarchyHandlers | null;\n columnVisibilityModel: Record<string, boolean>;\n columnOrder?: string[];\n onColumnOrderChange?: (params: GridColumnOrderChangeParams) => void;\n disableColumnReorder: boolean;\n pivotMode: boolean;\n checkboxSelection: boolean;\n hasDetailPanel: boolean;\n rowReordering: boolean;\n initialState?: GridInitialState;\n setColumns: (cols: GridColDef[]) => void;\n}\n\nexport interface UseGridColumnsResult<R extends GridRowModel> {\n effectiveColumns: GridColDef<R>[];\n orderedColumns: GridColDef<R>[];\n visibleOrderedColumns: GridColDef<R>[];\n navigationColumns: Array<GridColDef<R> | { field: string }>;\n columnWidths: Record<string, number>;\n effectiveColumnOrder: string[];\n setInternalColumnOrder: React.Dispatch<React.SetStateAction<string[]>>;\n columnReorderHandlers: ReturnType<typeof useColumnReorder>;\n handleColumnResize: (field: string, newWidth: number) => void;\n}\n\nexport function useGridColumns<R extends GridRowModel>(\n params: UseGridColumnsParams<R>\n): UseGridColumnsResult<R> {\n const {\n activeColumns,\n isHierarchyEnabled,\n isRowGrouping,\n isTreeData,\n activeHierarchyHandlers,\n columnVisibilityModel,\n columnOrder,\n onColumnOrderChange,\n disableColumnReorder,\n pivotMode,\n checkboxSelection,\n hasDetailPanel,\n rowReordering,\n initialState,\n setColumns,\n } = params;\n\n // ── Effective columns (hierarchy cell renderer injection) ─────────────────\n const effectiveColumns = useMemo<GridColDef<R>[]>(() => {\n if (!isHierarchyEnabled) return activeColumns;\n\n return activeColumns.map((col, index) => {\n if (index === 0) {\n return {\n ...col,\n renderCell: (cellParams: GridRenderCellParams<R>) => {\n const meta = cellParams.rowMeta;\n const depth = meta?.treeDepth ?? 0;\n const hasChildren = Boolean(meta?.hasChildren);\n const isExpanded = Boolean(meta?.isExpanded);\n const groupingField = meta?.groupingField;\n const groupingValue = meta?.groupingValue;\n const descendantCount = meta?.descendantCount;\n const isGroupRow = Boolean(meta?.isGroupRow);\n\n let content: React.ReactNode = col.renderCell ? col.renderCell(cellParams) : displayValue(cellParams);\n\n if (isTreeData && hasChildren && isGroupRow) {\n content = (\n <div className=\"ogx__group-cell-content\">\n {cellParams.value as React.ReactNode}\n {descendantCount !== undefined && descendantCount > 0 ? ` (${descendantCount})` : ''}\n </div>\n );\n }\n\n if (isRowGrouping && hasChildren && groupingField) {\n const groupLabel = meta?.groupLabel ?? `${groupingField}: ${String(groupingValue)}`;\n content = (\n <div className=\"ogx__group-cell-content\">\n {groupLabel}\n {descendantCount !== undefined ? ` (${descendantCount})` : ''}\n </div>\n );\n }\n\n return (\n <div style={{ display: 'flex', alignItems: 'center', paddingLeft: depth * 24, width: '100%', height: '100%' }}>\n <div style={{ marginRight: 4, width: 24, height: 24, display: 'flex', alignItems: 'center', justifyContent: 'center', cursor: hasChildren ? 'pointer' : 'default', flexShrink: 0 }}>\n {hasChildren ? (\n <div\n onClick={(e) => { e.stopPropagation(); e.preventDefault(); activeHierarchyHandlers?.toggleExpansion(cellParams.row.id); }}\n onMouseDown={(e) => { e.stopPropagation(); }}\n style={{ cursor: 'pointer', display: 'flex', alignItems: 'center', justifyContent: 'center', pointerEvents: 'auto', zIndex: 10, position: 'relative' }}\n >\n <ExpandIcon\n isExpanded={isExpanded}\n onClick={(e) => { e.stopPropagation(); e.preventDefault(); activeHierarchyHandlers?.toggleExpansion(cellParams.row.id); }}\n />\n </div>\n ) : null}\n </div>\n <div style={{ flex: 1, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{content}</div>\n </div>\n );\n }\n };\n }\n\n return {\n ...col,\n renderCell: (cellParams: GridRenderCellParams<R>) => {\n const meta = cellParams.rowMeta;\n const hasChildren = Boolean(meta?.hasChildren);\n const groupingField = meta?.groupingField;\n\n if (isRowGrouping && hasChildren) {\n if (col.field === groupingField) return null;\n if (cellParams.value !== undefined && cellParams.value !== null) {\n return col.renderCell ? col.renderCell(cellParams) : displayValue(cellParams);\n }\n return null;\n }\n\n return col.renderCell ? col.renderCell(cellParams) : displayValue(cellParams);\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 // renderContext indices come from the unpinned-row layout, so they index centerRows directly.\n const centerStartIndex = Math.max(0, firstRowIndex);\n const centerEndIndex = Math.min(centerRows.length, lastRowIndex + 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 /** Minimum overscan rows — the adaptive algorithm never goes below this. Defaults to 3. */\n overscanRowCount?: number;\n}\n\nexport interface UseGridScrollSyncResult {\n scrollTop: number;\n scrollLeft: number;\n /** Dynamically computed overscan row count based on current scroll velocity. */\n overscanRows: number;\n handleScroll: (event: React.UIEvent<HTMLDivElement>) => void;\n}\n\n/** Maps scroll velocity (px/ms) to an overscan row count. */\nfunction velocityToOverscan(velocity: number, minOverscan: number): number {\n let base: number;\n if (velocity < 0.5) base = 3;\n else if (velocity < 3) base = 5;\n else if (velocity < 15) base = 12;\n else if (velocity < 40) base = 20;\n else base = 30;\n return Math.max(base, minOverscan);\n}\n\nexport function useGridScrollSync(params: UseGridScrollSyncParams): UseGridScrollSyncResult {\n const { onRowsScrollEnd, overscanRowCount = 3 } = params;\n\n const pendingRef = useRef({ scrollTop: 0, scrollLeft: 0, velocity: 0 });\n const prevRef = useRef({ scrollTop: 0, scrollLeft: 0, time: 0 });\n const rafRef = useRef<number | null>(null);\n const decayRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const [scrollState, setScrollState] = useState({\n scrollTop: 0,\n scrollLeft: 0,\n overscanRows: overscanRowCount,\n });\n\n useEffect(() => {\n return () => {\n if (rafRef.current !== null) cancelAnimationFrame(rafRef.current);\n if (decayRef.current !== null) clearTimeout(decayRef.current);\n };\n }, []);\n\n const handleScroll = useCallback((event: React.UIEvent<HTMLDivElement>) => {\n const target = event.currentTarget;\n const now = performance.now();\n\n // Velocity: total positional delta / elapsed time (px/ms)\n const deltaPos = Math.abs(target.scrollTop - prevRef.current.scrollTop)\n + Math.abs(target.scrollLeft - prevRef.current.scrollLeft);\n const deltaTime = now - prevRef.current.time;\n const velocity = deltaTime > 0 ? deltaPos / deltaTime : 0;\n\n prevRef.current = { scrollTop: target.scrollTop, scrollLeft: target.scrollLeft, time: now };\n pendingRef.current = { scrollTop: target.scrollTop, scrollLeft: target.scrollLeft, velocity };\n\n if (rafRef.current !== null) cancelAnimationFrame(rafRef.current);\n rafRef.current = requestAnimationFrame(() => {\n rafRef.current = null;\n const { scrollTop, scrollLeft, velocity: v } = pendingRef.current;\n setScrollState({\n scrollTop,\n scrollLeft,\n overscanRows: velocityToOverscan(v, overscanRowCount),\n });\n });\n\n // Decay back to the minimum overscan 200ms after scrolling stops\n if (decayRef.current !== null) clearTimeout(decayRef.current);\n decayRef.current = setTimeout(() => {\n decayRef.current = null;\n setScrollState(prev => ({ ...prev, overscanRows: overscanRowCount }));\n }, 200);\n\n if (onRowsScrollEnd) {\n const { scrollTop, scrollHeight, clientHeight } = target;\n if (scrollHeight - scrollTop - clientHeight < 100) {\n onRowsScrollEnd({\n visibleTop: scrollTop,\n visibleBottom: scrollTop + clientHeight,\n viewportHeight: clientHeight,\n });\n }\n }\n }, [onRowsScrollEnd, overscanRowCount]);\n\n return {\n scrollTop: scrollState.scrollTop,\n scrollLeft: scrollState.scrollLeft,\n overscanRows: scrollState.overscanRows,\n handleScroll,\n };\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","import { useEffect, useRef } from 'react';\n\nexport interface UseGridDevWarningsParams {\n paginationRequested: boolean;\n isRowGrouping: boolean;\n autoHeight: boolean;\n viewportHeight: number;\n renderedRowCount: number;\n totalRowCount: number;\n}\n\n// Below this many rows, rendering everything is harmless, so an unbounded container is not worth a warning.\nconst UNBOUNDED_WARN_THRESHOLD = 200;\n\nexport function useGridDevWarnings(params: UseGridDevWarningsParams): void {\n const { paginationRequested, isRowGrouping, autoHeight, viewportHeight, renderedRowCount, totalRowCount } = params;\n const warnedPaginationRef = useRef(false);\n const warnedUnboundedRef = useRef(false);\n\n useEffect(() => {\n if (process.env.NODE_ENV === 'production' || warnedPaginationRef.current) return;\n if (paginationRequested && isRowGrouping) {\n warnedPaginationRef.current = true;\n console.warn(\n '[OpenGridX] `pagination` is ignored while `rowGroupingModel` is active — all group rows render in one ' +\n 'scrollable view. Give the grid a bounded height so it virtualizes. See docs/features/tree-data-grouping.md.'\n );\n }\n }, [paginationRequested, isRowGrouping]);\n\n useEffect(() => {\n if (process.env.NODE_ENV === 'production' || warnedUnboundedRef.current || autoHeight) return;\n if (viewportHeight > 0 && totalRowCount > UNBOUNDED_WARN_THRESHOLD && renderedRowCount >= totalRowCount) {\n warnedUnboundedRef.current = true;\n console.warn(\n `[OpenGridX] The grid viewport is ${Math.round(viewportHeight)}px tall and is rendering all ${totalRowCount} rows, ` +\n 'so row virtualization is effectively off. The grid container has no bounded height: it grows to fit its ' +\n 'content. Give it a fixed height, or if it is a flex child add `min-height: 0`. See docs/features/virtualization.md.'\n );\n }\n }, [autoHeight, viewportHeight, renderedRowCount, totalRowCount]);\n}\n","import type { GridAggregationModel, GridAggregationResult, GridColDef, GridRowModel } from '../../types';\n\nexport type BuiltInAggFn = 'sum' | 'avg' | 'count' | 'min' | 'max' | 'unique';\n\nconst toNumbers = (values: unknown[]): number[] => {\n const nums: number[] = [];\n for (const v of values) {\n if (v == null) continue;\n const n = Number(v);\n if (!isNaN(n)) nums.push(n);\n }\n return nums;\n};\n\n// Loops instead of Math.min(...nums): spreading >~120k arguments throws RangeError.\nconst minOf = (nums: number[]): number | null => {\n if (nums.length === 0) return null;\n let m = nums[0];\n for (let i = 1; i < nums.length; i++) if (nums[i] < m) m = nums[i];\n return m;\n};\n\nconst maxOf = (nums: number[]): number | null => {\n if (nums.length === 0) return null;\n let m = nums[0];\n for (let i = 1; i < nums.length; i++) if (nums[i] > m) m = nums[i];\n return m;\n};\n\nexport const AGGREGATION_FUNCTIONS: Record<BuiltInAggFn, (values: unknown[]) => unknown> = {\n sum: (values) => toNumbers(values).reduce((acc, n) => acc + n, 0),\n avg: (values) => {\n const nums = toNumbers(values);\n return nums.length ? nums.reduce((acc, n) => acc + n, 0) / nums.length : null;\n },\n count: (values) => values.filter((v) => v != null).length,\n min: (values) => minOf(toNumbers(values)),\n max: (values) => maxOf(toNumbers(values)),\n unique: (values) => new Set(values.filter((v) => v != null)).size,\n};\n\nexport function computeAggregations<R extends GridRowModel>(\n rows: R[],\n aggregationModel: GridAggregationModel,\n columnsLookup: Map<string, GridColDef<R>>,\n warnPrefix: string,\n): GridAggregationResult {\n const result: GridAggregationResult = {};\n for (const [field, fnName] of Object.entries(aggregationModel)) {\n const colDef = columnsLookup.get(field);\n if (colDef?.availableAggregationFunctions && !colDef.availableAggregationFunctions.includes(fnName)) {\n continue;\n }\n const fn = AGGREGATION_FUNCTIONS[fnName as BuiltInAggFn];\n if (!fn) {\n console.warn(`[${warnPrefix}] Unknown aggregation function: \"${fnName}\"`);\n continue;\n }\n result[field] = fn(rows.map((row) => row[field]));\n }\n return result;\n}\n","\nimport { useMemo, useEffect, useRef, useCallback, useState } from 'react';\nimport type {\n GridRowModel,\n GridColDef,\n GridAggregationModel,\n GridAggregationResult,\n GridFilterModel,\n GridSortItem,\n GridDataSource,\n} from '../../types';\nimport { computeAggregations } from '../../utils/aggregation';\n\nexport type { BuiltInAggFn } from '../../utils/aggregation';\n\nexport function formatAggregationValue(value: unknown, fnName: string): string {\n if (value == null) return '—';\n if (typeof value === 'number') {\n if (fnName === 'avg') {\n return value.toLocaleString(undefined, { maximumFractionDigits: 2 });\n }\n return value.toLocaleString();\n }\n return String(value);\n}\n\nexport interface UseAggregationParams<R extends GridRowModel> {\n rows: R[];\n columns?: GridColDef[];\n aggregationModel: GridAggregationModel;\n isServerSide: boolean;\n dataSource?: GridDataSource<R>;\n filterModel?: GridFilterModel;\n sortModel?: GridSortItem[];\n serverAggregationResults?: GridAggregationResult | null;\n}\n\nexport interface UseAggregationReturn {\n aggregationResult: GridAggregationResult;\n isLoading: boolean;\n error: unknown;\n}\n\nexport function useAggregation<R extends GridRowModel>(\n params: UseAggregationParams<R>\n): UseAggregationReturn {\n const {\n rows,\n columns,\n aggregationModel,\n isServerSide,\n dataSource,\n filterModel,\n sortModel,\n serverAggregationResults,\n } = params;\n\n const columnsLookup = useMemo(() => {\n const map = new Map<string, GridColDef>();\n (columns ?? []).forEach(col => map.set(col.field, col));\n return map;\n }, [columns]);\n\n const clientResult = useMemo<GridAggregationResult>(() => {\n if (isServerSide || Object.keys(aggregationModel).length === 0) return {};\n\n return computeAggregations(rows, aggregationModel, columnsLookup, 'useAggregation');\n }, [rows, columnsLookup, aggregationModel, isServerSide]);\n\n const [serverResult, setServerResult] = useState<GridAggregationResult>({});\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<unknown>(null);\n const requestIdRef = useRef(0);\n\n const fetchServerAggregations = useCallback(async () => {\n if (!dataSource?.getAggregations || Object.keys(aggregationModel).length === 0) return;\n\n const requestId = ++requestIdRef.current;\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await dataSource.getAggregations({\n sortModel: sortModel ?? [],\n filterModel: filterModel ?? { items: [] },\n groupKeys: [],\n aggregationModel,\n });\n\n if (requestId === requestIdRef.current) {\n setServerResult(result);\n }\n } catch (err) {\n if (requestId === requestIdRef.current) {\n setError(err);\n console.error('[useAggregation] Server aggregation error:', err);\n }\n } finally {\n if (requestId === requestIdRef.current) {\n setIsLoading(false);\n }\n }\n }, [dataSource, aggregationModel, filterModel, sortModel]);\n\n useEffect(() => {\n if (isServerSide && dataSource?.getAggregations && !serverAggregationResults) {\n fetchServerAggregations();\n }\n }, [fetchServerAggregations, isServerSide, dataSource, serverAggregationResults]);\n\n const aggregationResult = useMemo<GridAggregationResult>(() => {\n if (!isServerSide) return clientResult;\n\n if (serverAggregationResults && Object.keys(serverAggregationResults).length > 0) {\n return serverAggregationResults;\n }\n return serverResult;\n }, [isServerSide, clientResult, serverAggregationResults, serverResult]);\n\n return { aggregationResult, isLoading, error };\n}\n","import React, { useMemo } from 'react';\nimport { formatAggregationValue } from '../../hooks/features/useAggregation';\nimport type { GridColDef, GridAggregationModel, GridAggregationResult, GridColumnPinning } from '../../types';\nimport { calculatePinnedPositions, isColumnPinned } from '../../utils/pinning';\n\ninterface GridAggregationFooterProps {\n columns: GridColDef[];\n aggregationModel: GridAggregationModel;\n aggregationResult: GridAggregationResult;\n columnWidths: Record<string, number>;\n rowHeight: number;\n checkboxSelection: boolean;\n hasDetailPanel: boolean;\n rowReordering: boolean;\n pinnedColumns?: GridColumnPinning;\n}\n\nexport function GridAggregationFooter({\n columns,\n aggregationModel,\n aggregationResult,\n columnWidths,\n rowHeight,\n checkboxSelection,\n hasDetailPanel,\n rowReordering,\n pinnedColumns,\n}: GridAggregationFooterProps) {\n // Compute sticky left/right pixel offsets for each pinned column.\n // The footer always renders checkbox/detail/reorder spacers unconditionally,\n // so treat pinCheckboxColumn and pinExpandColumn as always true.\n const pinnedOffsets = useMemo(\n () => calculatePinnedPositions(\n columns,\n columnWidths,\n pinnedColumns,\n checkboxSelection,\n true,\n hasDetailPanel,\n true,\n rowReordering,\n ),\n [columns, columnWidths, pinnedColumns, checkboxSelection, hasDetailPanel, rowReordering]\n );\n\n const lastLeftField = pinnedColumns?.left?.[pinnedColumns.left.length - 1];\n const firstRightField = pinnedColumns?.right?.[0];\n\n return (\n <div\n className=\"ogx__aggregation-footer\"\n role=\"row\"\n aria-label=\"Aggregation totals\"\n aria-live=\"polite\"\n style={{ minHeight: `${rowHeight}px` }}\n >\n {checkboxSelection && <div style={{ width: 48, flexShrink: 0 }} />}\n {hasDetailPanel && <div style={{ width: 48, flexShrink: 0 }} />}\n {rowReordering && <div style={{ width: 48, flexShrink: 0 }} />}\n\n {columns.map((col) => {\n const fnName = (aggregationModel as Record<string, string>)[col.field];\n const rawValue = aggregationResult[col.field];\n const colWidth = columnWidths[col.field] ?? (typeof col.width === 'number' ? col.width : 120);\n\n const pinnedPosition = isColumnPinned(col.field, pinnedColumns);\n const pinnedOffset = pinnedPosition ? pinnedOffsets[col.field] : undefined;\n\n const className = [\n 'ogx__aggregation-cell',\n pinnedPosition === 'left' && 'ogx__aggregation-cell--pinned-left',\n pinnedPosition === 'right' && 'ogx__aggregation-cell--pinned-right',\n pinnedPosition === 'left' && col.field === lastLeftField && 'ogx__aggregation-cell--pinned-left-last',\n pinnedPosition === 'right' && col.field === firstRightField && 'ogx__aggregation-cell--pinned-right-first',\n ].filter(Boolean).join(' ');\n\n const style: React.CSSProperties = {\n width: colWidth,\n minWidth: colWidth,\n maxWidth: colWidth,\n textAlign: (col.align as React.CSSProperties['textAlign']) || 'left',\n };\n if (pinnedPosition === 'left' && pinnedOffset !== undefined) style.left = pinnedOffset;\n if (pinnedPosition === 'right' && pinnedOffset !== undefined) style.right = pinnedOffset;\n\n return (\n <div\n key={col.field}\n className={className}\n role=\"gridcell\"\n style={style}\n >\n {fnName ? (\n <>\n <span className=\"ogx__aggregation-label\">{fnName}</span>\n <span className=\"ogx__aggregation-value\">\n {formatAggregationValue(rawValue, fnName)}\n </span>\n </>\n ) : null}\n </div>\n );\n })}\n </div>\n );\n}\n","import type React from 'react';\n\ninterface GridEmptyStateProps {\n noRowsLabel: string;\n width: number;\n overlay?: React.ReactNode;\n}\n\nexport function GridEmptyState({ noRowsLabel, width, overlay }: GridEmptyStateProps) {\n if (overlay) {\n return <div className=\"ogx__empty\" style={{ width }}>{overlay}</div>;\n }\n return (\n <div className=\"ogx__empty\" style={{ width }}>\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <path d=\"M3 9h18M9 21V9\" />\n </svg>\n <span>{noRowsLabel}</span>\n </div>\n );\n}\n","interface GridErrorOverlayProps {\n error: unknown;\n}\n\nexport function GridErrorOverlay({ error }: GridErrorOverlayProps) {\n if (!error) return null;\n const message = error instanceof Error\n ? error.message\n : typeof error === 'string'\n ? error\n : 'An unexpected error occurred while loading the data.';\n return (\n <div className=\"ogx-error-overlay\" aria-live=\"assertive\" role=\"alert\">\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"var(--ogx-color-error)\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n <div className=\"ogx-error-overlay__title\">\n Oops! Something went wrong\n </div>\n <div className=\"ogx-error-overlay__message\">\n {message}\n </div>\n <button\n onClick={() => window.location.reload()}\n className=\"ogx-button ogx-button--primary\"\n >\n Retry\n </button>\n </div>\n );\n}\n","\nimport React from 'react';\n\nexport interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {\n indeterminate?: boolean;\n label?: string;\n inputRef?: React.Ref<HTMLInputElement>;\n}\n\nexport const Checkbox: React.FC<CheckboxProps> = ({\n indeterminate = false,\n label,\n className = '',\n inputRef,\n ...props\n}) => {\n const internalRef = React.useRef<HTMLInputElement>(null);\n\n // Combine refs\n const setRef = React.useCallback((element: HTMLInputElement | null) => {\n internalRef.current = element;\n\n if (typeof inputRef === 'function') {\n inputRef(element);\n } else if (inputRef) {\n (inputRef as React.MutableRefObject<HTMLInputElement | null>).current = element;\n }\n }, [inputRef]);\n\n React.useEffect(() => {\n if (internalRef.current) {\n internalRef.current.indeterminate = indeterminate;\n }\n }, [indeterminate]);\n\n const wrapperClassNames = [\n 'ogx-checkbox-wrapper',\n props.disabled && 'ogx-checkbox-wrapper--disabled',\n className\n ].filter(Boolean).join(' ');\n\n return (\n <label className={wrapperClassNames}>\n <input\n ref={setRef}\n type=\"checkbox\"\n className=\"ogx-checkbox__input\"\n aria-label={label || props['aria-label'] || (indeterminate ? 'Select some' : props.checked ? 'Deselect' : 'Select')}\n {...props}\n />\n <span className=\"ogx-checkbox__box\">\n {props.checked && !indeterminate && (\n <svg className=\"ogx-checkbox__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\" />\n </svg>\n )}\n {indeterminate && (\n <svg className=\"ogx-checkbox__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M19 13H5v-2h14v2z\" />\n </svg>\n )}\n </span>\n {label && <span className=\"ogx-checkbox__label\">{label}</span>}\n </label>\n );\n};\n","\nimport React, { useCallback, useRef, useState } from 'react';\n\n\nexport interface ColumnResizeHandleProps {\n field: string;\n currentWidth: number;\n onResize: (field: string, newWidth: number) => void;\n minWidth?: number;\n maxWidth?: number;\n}\n\nexport function ColumnResizeHandle(props: ColumnResizeHandleProps) {\n const { field, currentWidth, onResize, minWidth = 50, maxWidth = 1000 } = props;\n const [isDragging, setIsDragging] = useState(false);\n const startXRef = useRef<number>(0);\n const startWidthRef = useRef<number>(0);\n\n const handleMouseDown = useCallback((event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n\n setIsDragging(true);\n startXRef.current = event.clientX;\n // Use the logical stored width — reliable for pinned, flex, and normal columns\n startWidthRef.current = currentWidth;\n\n let lastUpdateTime = 0;\n const throttleMs = 16;\n\n const handleMouseMove = (e: MouseEvent) => {\n const deltaX = e.clientX - startXRef.current;\n const newWidth = Math.max(minWidth, Math.min(maxWidth, startWidthRef.current + deltaX));\n\n const now = Date.now();\n if (now - lastUpdateTime >= throttleMs) {\n onResize(field, newWidth);\n lastUpdateTime = now;\n }\n };\n\n const handleMouseUp = (e: MouseEvent) => {\n setIsDragging(false);\n\n const deltaX = e.clientX - startXRef.current;\n const newWidth = Math.max(minWidth, Math.min(maxWidth, startWidthRef.current + deltaX));\n\n onResize(field, newWidth);\n\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n }, [field, currentWidth, onResize, minWidth, maxWidth]);\n\n const handleDoubleClick = useCallback((event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n }, []);\n\n const classNames = [\n 'ogx-column-resize-handle',\n isDragging && 'ogx-column-resize-handle--dragging'\n ].filter(Boolean).join(' ');\n\n return (\n <div\n className={classNames}\n onMouseDown={handleMouseDown}\n onClick={(e) => e.stopPropagation()}\n onDragStart={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n onDoubleClick={handleDoubleClick}\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label={`Resize ${field} column`}\n >\n <div className=\"ogx-column-resize-handle__line\" />\n </div>\n );\n}\n","import React, { useRef, useEffect, useState } from 'react';\nimport ReactDOM from 'react-dom';\nimport type { GridColDef, GridRowModel, GridSortDirection, GridColumnPinning } from '../../types';\n\n\ninterface ColumnMenuProps {\n colDef: GridColDef<GridRowModel>;\n sortModel?: Array<{ field: string; sort: 'asc' | 'desc' }>;\n onSort?: (field: string, direction: GridSortDirection) => void;\n onHide?: (field: string) => void;\n onPin?: (field: string, side: 'left' | 'right' | null) => void;\n pinnedColumns?: GridColumnPinning;\n onManageColumns?: () => void;\n onClose: () => void;\n anchorEl: HTMLElement | null;\n}\n\nfunction ActiveDotIcon() {\n return (\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"currentColor\">\n <circle cx=\"4\" cy=\"4\" r=\"4\" />\n </svg>\n );\n}\n\nfunction InactiveDotIcon() {\n return (\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <circle cx=\"4\" cy=\"4\" r=\"3\" />\n </svg>\n );\n}\n\nfunction ManageColumnsIcon() {\n return (\n <svg focusable=\"false\" aria-hidden=\"true\" viewBox=\"0 0 24 24\" width=\"13\" height=\"13\" fill=\"none\">\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <rect x=\"8.5\" y=\"4\" width=\"7\" height=\"16\" fill=\"currentColor\" opacity=\"0.3\" />\n <line x1=\"8.5\" y1=\"4\" x2=\"8.5\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <line x1=\"15.5\" y1=\"4\" x2=\"15.5\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <line x1=\"2\" y1=\"9\" x2=\"22\" y2=\"9\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <line x1=\"2\" y1=\"14\" x2=\"22\" y2=\"14\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n </svg>\n );\n}\n\nfunction AscIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"5\" />\n <polyline points=\"5 12 12 5 19 12\" />\n </svg>\n );\n}\n\nfunction DescIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n <polyline points=\"19 12 12 19 5 12\" />\n </svg>\n );\n}\n\nfunction UnsortIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\">\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n );\n}\n\nfunction HideIcon() {\n return (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94\" />\n <path d=\"M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19\" />\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n </svg>\n );\n}\n\nfunction PinLeftIcon() {\n return (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n { }\n <line x1=\"4\" y1=\"2\" x2=\"4\" y2=\"22\" />\n { }\n <polyline points=\"11 8 4 12 11 16\" />\n { }\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n </svg>\n );\n}\n\nfunction PinRightIcon() {\n return (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n { }\n <line x1=\"20\" y1=\"2\" x2=\"20\" y2=\"22\" />\n { }\n <polyline points=\"13 8 20 12 13 16\" />\n { }\n <line x1=\"20\" y1=\"12\" x2=\"4\" y2=\"12\" />\n </svg>\n );\n}\n\nfunction UnpinIcon() {\n return (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"2\" y1=\"2\" x2=\"22\" y2=\"22\" />\n <line x1=\"4\" y1=\"4\" x2=\"4\" y2=\"20\" />\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n </svg>\n );\n}\n\nexport function ColumnMenu({ colDef, sortModel, onSort, onHide, onPin, pinnedColumns, onManageColumns, onClose, anchorEl }: ColumnMenuProps) {\n const menuRef = useRef<HTMLDivElement>(null);\n const [style, setStyle] = useState<React.CSSProperties>({ position: 'fixed', zIndex: 1300, top: 0, left: 0, visibility: 'hidden' });\n\n React.useLayoutEffect(() => {\n if (!anchorEl || !menuRef.current) return;\n\n const anchorRect = anchorEl.getBoundingClientRect();\n const menuRect = menuRef.current.getBoundingClientRect();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const margin = 8;\n\n let left = anchorRect.left;\n if (left + menuRect.width + margin > vw) {\n left = vw - menuRect.width - margin;\n }\n if (left < margin) left = margin;\n\n let top = anchorRect.bottom + 4;\n if (top + menuRect.height + margin > vh) {\n top = anchorRect.top - menuRect.height - 4;\n }\n\n setStyle({ position: 'fixed', zIndex: 1300, top, left, visibility: 'visible' });\n }, [anchorEl]);\n\n\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (\n menuRef.current && !menuRef.current.contains(event.target as Node) &&\n anchorEl && !anchorEl.contains(event.target as Node)\n ) onClose();\n }\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') onClose();\n }\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keydown', handleKey);\n // Close menu on any scroll or resize so it doesn't float detached from its anchor\n window.addEventListener('scroll', onClose, true);\n window.addEventListener('resize', onClose);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keydown', handleKey);\n window.removeEventListener('scroll', onClose, true);\n window.removeEventListener('resize', onClose);\n };\n }, [anchorEl, onClose]);\n\n const handleSort = (direction: GridSortDirection) => { onSort?.(colDef.field, direction); onClose(); };\n const handleHide = () => { onHide?.(colDef.field); onClose(); };\n const handlePin = (side: 'left' | 'right' | null) => { onPin?.(colDef.field, side); onClose(); };\n\n const currentSort = sortModel?.find(item => item.field === colDef.field)?.sort;\n const isUnsorted = currentSort === undefined || currentSort === null;\n\n const isPinnedLeft = pinnedColumns?.left?.includes(colDef.field) ?? false;\n const isPinnedRight = pinnedColumns?.right?.includes(colDef.field) ?? false;\n const isUnpinned = !isPinnedLeft && !isPinnedRight;\n\n const colLabel = colDef.headerName || colDef.field;\n\n return ReactDOM.createPortal(\n <div ref={menuRef} className=\"ogx-column-menu\" style={style} role=\"menu\" aria-label={`Column options for ${colLabel}`}>\n\n { }\n {onSort && colDef.sortable !== false && (\n <>\n <button className={`ogx-menu-item${currentSort === 'asc' ? ' ogx-menu-item--active' : ''}`}\n onClick={() => handleSort('asc')} role=\"menuitemradio\" aria-checked={currentSort === 'asc'}>\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\">{currentSort === 'asc' ? <ActiveDotIcon /> : <InactiveDotIcon />}</span>\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><AscIcon /></span>\n Sort Ascending\n </button>\n <button className={`ogx-menu-item${currentSort === 'desc' ? ' ogx-menu-item--active' : ''}`}\n onClick={() => handleSort('desc')} role=\"menuitemradio\" aria-checked={currentSort === 'desc'}>\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\">{currentSort === 'desc' ? <ActiveDotIcon /> : <InactiveDotIcon />}</span>\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><DescIcon /></span>\n Sort Descending\n </button>\n <button className={`ogx-menu-item${isUnsorted ? ' ogx-menu-item--active' : ''}`}\n onClick={() => handleSort(null)} role=\"menuitemradio\" aria-checked={isUnsorted}>\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\">{isUnsorted ? <ActiveDotIcon /> : <InactiveDotIcon />}</span>\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><UnsortIcon /></span>\n Unsort\n </button>\n <div className=\"ogx-menu-divider\" />\n </>\n )}\n\n { }\n <div className=\"ogx-menu-section-label\" aria-hidden=\"true\">Pin column</div>\n <button className={`ogx-menu-item${isPinnedLeft ? ' ogx-menu-item--active' : ''}`}\n onClick={() => handlePin('left')} role=\"menuitemradio\" aria-checked={isPinnedLeft} aria-label=\"Pin to left\">\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\">{isPinnedLeft ? <ActiveDotIcon /> : <InactiveDotIcon />}</span>\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><PinLeftIcon /></span>\n Pin to Left\n </button>\n <button className={`ogx-menu-item${isPinnedRight ? ' ogx-menu-item--active' : ''}`}\n onClick={() => handlePin('right')} role=\"menuitemradio\" aria-checked={isPinnedRight} aria-label=\"Pin to right\">\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\">{isPinnedRight ? <ActiveDotIcon /> : <InactiveDotIcon />}</span>\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><PinRightIcon /></span>\n Pin to Right\n </button>\n <button className={`ogx-menu-item${isUnpinned ? ' ogx-menu-item--active' : ''}`}\n onClick={() => handlePin(null)} role=\"menuitemradio\" aria-checked={isUnpinned} aria-label=\"Unpin column\">\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\">{isUnpinned ? <ActiveDotIcon /> : <InactiveDotIcon />}</span>\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><UnpinIcon /></span>\n Unpin\n </button>\n <div className=\"ogx-menu-divider\" />\n\n { }\n <button className=\"ogx-menu-item\" onClick={handleHide} role=\"menuitem\" aria-label={`Hide ${colLabel} column`}>\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\" />\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><HideIcon /></span>\n Hide Column\n </button>\n\n <div className=\"ogx-menu-divider\" />\n <button className=\"ogx-menu-item\" onClick={() => { onManageColumns?.(); onClose(); }} role=\"menuitem\" aria-label=\"Manage all columns\">\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\" />\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><ManageColumnsIcon /></span>\n Manage columns\n </button>\n </div>,\n (anchorEl?.closest('.ogx-theme-provider') || document.body)\n );\n}\n","import React, { useId } from 'react';\nimport { Checkbox } from '../ui/Checkbox';\nimport { ColumnResizeHandle } from '../ColumnResizeHandle/ColumnResizeHandle';\nimport type { GridColDef, GridRowModel, GridSortDirection, GridColumnPinning, GridAggregationModel, GridColumnGroup, GridColumnGroupingModel } from '../../types';\nimport { isColumnPinned, calculatePinnedPositions } from '../../utils/pinning';\nimport { ColumnMenu } from './ColumnMenu';\n\n\nfunction MenuIcon() {\n return (\n <svg focusable=\"false\" aria-hidden=\"true\" viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"18\" height=\"18\">\n <path d=\"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"></path>\n </svg>\n );\n}\n\nfunction SwapIcon() {\n return (\n <svg focusable=\"false\" aria-hidden=\"true\" viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"currentColor\">\n <path d=\"M6.99 11L3 15l3.99 4v-3H14v-2H6.99v-3zM21 9l-3.99-4v3H10v2h7.01v3L21 9z\"></path>\n </svg>\n );\n}\n\n\n// ─── Group header helpers ─────────────────────────────────────────────────────\n\n/** Collect all leaf field names from a group node (recursive). */\nfunction collectGroupFields(group: GridColumnGroup): string[] {\n const out: string[] = [];\n for (const child of group.children) {\n if (typeof child === 'string') out.push(child);\n else out.push(...collectGroupFields(child));\n }\n return out;\n}\n\n/** Max nesting depth of the group tree (1 = single level). */\nfunction groupTreeDepth(groups: GridColumnGroupingModel): number {\n let d = 0;\n function walk(g: GridColumnGroup, depth: number) {\n d = Math.max(d, depth);\n for (const c of g.children) if (typeof c !== 'string') walk(c, depth + 1);\n }\n groups.forEach(g => walk(g, 1));\n return d;\n}\n\ninterface GroupCell { key: string; label: string; width: number; isGroup: boolean; }\n\n/**\n * Builds the flat array of GroupCell descriptors for one row (level).\n * level 0 = top-most group row.\n * allFields is the ORDERED list of all visible columns (including spacers).\n */\nfunction buildGroupRow(\n groups: GridColumnGroupingModel,\n allFields: { field: string; width: number }[],\n level: number,\n): GroupCell[] {\n // Map each field → the group that owns it at `level`\n function findAtLevel(g: GridColumnGroup, field: string, cur: number): GridColumnGroup | null {\n if (!collectGroupFields(g).includes(field)) return null;\n if (cur === level) return g;\n for (const child of g.children) {\n if (typeof child !== 'string') {\n const found = findAtLevel(child, field, cur + 1);\n if (found) return found;\n }\n }\n return null;\n }\n\n const fieldGroup = new Map<string, GridColumnGroup | null>();\n for (const f of allFields) {\n let found: GridColumnGroup | null = null;\n for (const g of groups) {\n found = findAtLevel(g, f.field, 0);\n if (found) break;\n }\n fieldGroup.set(f.field, found);\n }\n\n const cells: GroupCell[] = [];\n let i = 0;\n while (i < allFields.length) {\n const item = allFields[i];\n const group = fieldGroup.get(item.field) ?? null;\n const w = item.width;\n\n if (!group) {\n cells.push({ key: `fg-${item.field}-${level}`, label: '', width: w, isGroup: false });\n i++;\n } else {\n let totalW = 0;\n let j = i;\n while (j < allFields.length && fieldGroup.get(allFields[j].field) === group) {\n totalW += allFields[j].width;\n j++;\n }\n cells.push({ key: `${group.groupId}-${level}`, label: group.headerName, width: totalW, isGroup: true });\n i = j;\n }\n }\n return cells;\n}\n\n// ─── Props ────────────────────────────────────────────────────────────────────\n\nexport interface HeaderProps<R extends GridRowModel = GridRowModel> {\n columns: GridColDef<R>[];\n allColumns?: GridColDef<R>[];\n columnGroupingModel?: GridColumnGroupingModel;\n checkboxSelection?: boolean;\n allSelected?: boolean;\n someSelected?: boolean;\n onSelectAll?: (isSelected: boolean) => void;\n onSort?: (field: string, direction: GridSortDirection) => void;\n sortModel?: Array<{ field: string; sort: 'asc' | 'desc' }>;\n onColumnResize?: (field: string, newWidth: number) => void;\n columnWidths?: Record<string, number>;\n pinnedColumns?: GridColumnPinning;\n hasDetailPanel?: boolean;\n pinCheckboxColumn?: boolean;\n pinExpandColumn?: boolean;\n rowReordering?: boolean;\n aggregationModel?: GridAggregationModel;\n\n draggedColumn?: string | null;\n dragOverColumn?: string | null;\n onDragStart?: (field: string) => (event: React.DragEvent) => void;\n onDragOver?: (field: string) => (event: React.DragEvent) => void;\n onDragEnd?: () => void;\n onDrop?: (targetField: string) => (event: React.DragEvent) => void;\n focusedCell?: { id: string | number; field: string } | null;\n onHeaderClick?: (field: string) => void;\n onSortAdd?: (field: string, direction: GridSortDirection) => void;\n multiSort?: boolean;\n onHideColumn?: (field: string) => void;\n onPinColumn?: (field: string, side: 'left' | 'right' | null) => void;\n onManageColumns?: () => void;\n}\n\nexport function Header<R extends GridRowModel = GridRowModel>(props: HeaderProps<R>) {\n const {\n columns,\n allColumns,\n columnGroupingModel,\n checkboxSelection = false,\n allSelected = false,\n someSelected = false,\n onSelectAll,\n onSort,\n sortModel = [],\n onColumnResize,\n columnWidths = {},\n pinnedColumns,\n hasDetailPanel = false,\n pinCheckboxColumn = true,\n pinExpandColumn = true,\n rowReordering = false,\n aggregationModel,\n draggedColumn,\n dragOverColumn,\n onDragStart,\n onDragOver,\n onDragEnd,\n onDrop,\n focusedCell,\n onHeaderClick,\n onSortAdd,\n multiSort = false,\n onHideColumn,\n onPinColumn,\n onManageColumns,\n } = props;\n\n const selectAllId = useId();\n const cellRefs = React.useRef<Record<string, HTMLElement | null>>({});\n const [menuOpenParams, setMenuOpenParams] = React.useState<{ colDef: GridColDef<R>; anchorEl: HTMLElement } | null>(null);\n\n const handleMenuOpen = (colDef: GridColDef<R>) => (event: React.MouseEvent) => {\n event.stopPropagation();\n setMenuOpenParams({ colDef, anchorEl: event.currentTarget as HTMLElement });\n };\n\n const handleMenuClose = () => {\n setMenuOpenParams(null);\n };\n\n React.useLayoutEffect(() => {\n if (focusedCell?.id === 'HEADER') {\n const element = cellRefs.current[focusedCell.field];\n if (element) {\n element.focus();\n }\n }\n }, [focusedCell]);\n\n const handleColumnClick = (colDef: GridColDef<R>) => (e: React.MouseEvent) => {\n if (colDef.sortable === false) return;\n\n const currentSort = sortModel.find(item => item.field === colDef.field);\n let newDirection: GridSortDirection = 'asc';\n\n if (currentSort) {\n if (currentSort.sort === 'asc') {\n newDirection = 'desc';\n } else {\n newDirection = null;\n }\n }\n\n if ((e.shiftKey || multiSort) && onSortAdd) {\n onSortAdd(colDef.field, newDirection);\n } else if (onSort) {\n onSort(colDef.field, newDirection);\n }\n };\n\n const getSortIcon = (field: string) => {\n const sortItem = sortModel.find(item => item.field === field);\n if (!sortItem) return null;\n\n const sortIndex = sortModel.length > 1 ? sortModel.indexOf(sortItem) + 1 : null;\n\n return (\n <span className={`ogx__sort-icon ogx__sort-icon--${sortItem.sort}`} aria-hidden=\"true\">\n {sortIndex !== null && (\n <span className=\"ogx__sort-badge\">{sortIndex}</span>\n )}\n </span>\n );\n };\n\n const pinnedPositions = React.useMemo(() => {\n return calculatePinnedPositions(\n columns,\n columnWidths,\n pinnedColumns,\n checkboxSelection,\n pinCheckboxColumn,\n hasDetailPanel,\n pinExpandColumn,\n rowReordering\n );\n }, [columns, columnWidths, pinnedColumns, checkboxSelection, pinCheckboxColumn, hasDetailPanel, pinExpandColumn, rowReordering]);\n\n const groupDepth = columnGroupingModel ? groupTreeDepth(columnGroupingModel) : 0;\n\n // All non-spacer fields in order (for group-span math) with their effective physical width\n const allCols = allColumns ?? columns;\n const allLeafFields = allCols\n .filter(c => !c.isSpacer)\n .map(c => ({\n field: c.field,\n width: columnWidths[c.field] ?? c.width ?? 100\n }));\n\n // --- CHECKBOX / DETAIL / REORDER prefix width (for group filler) ---\n const CHECKBOX_W = 48;\n const REORDER_W = 48;\n const EXPAND_W = 48;\n const prefixWidth =\n (rowReordering ? REORDER_W : 0) +\n (hasDetailPanel ? EXPAND_W : 0) +\n (checkboxSelection ? CHECKBOX_W : 0);\n\n return (\n // Outer sticky wrapper — both group rows AND column header row live here\n // so they ALL stay sticky together and scroll horizontally as one unit.\n <div className=\"ogx__header-wrap\">\n {/* ── Group header rows ── */}\n {groupDepth > 0 && Array.from({ length: groupDepth }, (_, level) => {\n const row = buildGroupRow(\n columnGroupingModel!,\n allLeafFields,\n level,\n );\n return (\n <div key={`ogx-grp-${level}`} className=\"ogx-col-group-row\" role=\"row\">\n {/* Filler for checkbox / reorder / detailPanel prefix */}\n {prefixWidth > 0 && (\n <div\n className=\"ogx-col-group-cell ogx-col-group-cell--filler\"\n style={{ width: prefixWidth, minWidth: prefixWidth, flexShrink: 0 }}\n role=\"columnheader\"\n />\n )}\n {row.map(cell => (\n <div\n key={cell.key}\n role=\"columnheader\"\n className={`ogx-col-group-cell ${cell.isGroup ? 'ogx-col-group-cell--group' : 'ogx-col-group-cell--filler'}`}\n style={{ width: cell.width, minWidth: cell.width, flexShrink: 0 }}\n title={cell.isGroup ? cell.label : undefined}\n >\n {cell.isGroup && (\n <span className=\"ogx-col-group-cell__label\">{cell.label}</span>\n )}\n </div>\n ))}\n </div>\n );\n })}\n\n {/* ── Column header row ── */}\n <div className=\"ogx__header\" role=\"row\">\n { }\n {rowReordering && (\n <div\n className=\"ogx__header-cell ogx__header-cell--pinned ogx__header-cell--pinned-left\"\n role=\"columnheader\"\n aria-label=\"Row reorder handle\"\n title=\"Drag to reorder rows\"\n style={{\n minWidth: 48,\n maxWidth: 48,\n position: 'sticky',\n left: 0,\n zIndex: 4\n }}\n />\n )}\n\n { }\n {hasDetailPanel && (\n <div\n className={`ogx__header-cell ogx__header-cell--expand ${pinExpandColumn ? 'ogx__header-cell--pinned ogx__header-cell--pinned-left' : ''\n }`}\n role=\"columnheader\"\n aria-label=\"Expand row details\"\n style={{\n minWidth: 48,\n maxWidth: 48,\n position: pinExpandColumn ? 'sticky' : undefined,\n left: pinExpandColumn ? (rowReordering ? 48 : 0) : undefined,\n zIndex: pinExpandColumn ? 5 : undefined\n }}\n >\n { }\n </div>\n )}\n\n { }\n {checkboxSelection && (\n <div\n className={`ogx__header-cell ogx__header-cell--checkbox ${pinCheckboxColumn ? 'ogx__header-cell--pinned ogx__header-cell--pinned-left' : ''\n }`}\n role=\"columnheader\"\n style={{\n position: pinCheckboxColumn ? 'sticky' : undefined,\n left: pinCheckboxColumn ? ((rowReordering ? 48 : 0) + (hasDetailPanel && pinExpandColumn ? 48 : 0)) : undefined,\n\n }}\n >\n <Checkbox\n id={selectAllId}\n name={selectAllId}\n checked={allSelected}\n indeterminate={someSelected}\n onChange={(e) => onSelectAll?.(e.target.checked)}\n aria-label={allSelected ? 'Deselect all rows' : 'Select all rows'}\n tabIndex={focusedCell?.id === 'HEADER' && focusedCell.field === '__checkbox_col__' ? 0 : -1}\n onMouseDown={(e) => e.preventDefault()}\n inputRef={(el) => { cellRefs.current['__checkbox_col__'] = el; }}\n />\n </div>\n )}\n\n {columns.map((colDef, index) => {\n if (colDef.isSpacer) {\n return (\n <div\n key={colDef.field}\n style={{ width: colDef.width, minWidth: colDef.width, flexShrink: 0 }}\n aria-hidden=\"true\"\n />\n );\n }\n const isSortable = colDef.sortable !== false;\n const isSorted = sortModel.some(item => item.field === colDef.field);\n const isResizable = colDef.resizable !== false;\n const pinnedPosition = isColumnPinned(colDef.field, pinnedColumns);\n const isPinned = pinnedPosition !== null;\n const isDragging = draggedColumn === colDef.field;\n const isDragOver = dragOverColumn === colDef.field;\n\n const classNames = [\n 'ogx__header-cell',\n `ogx__header-cell--align-${colDef.headerAlign || colDef.align || 'left'}`,\n isSortable && 'ogx__header-cell--sortable',\n isSorted && 'ogx__header-cell--sorted',\n isPinned && `ogx__header-cell--pinned`,\n isPinned && `ogx__header-cell--pinned-${pinnedPosition}`,\n isDragging && 'ogx__header-cell--dragging',\n isDragOver && 'ogx__header-cell--drag-over',\n (focusedCell?.id === 'HEADER' && focusedCell.field === colDef.field) && 'ogx__header-cell--focused',\n colDef.headerClassName\n ].filter(Boolean).join(' ');\n\n const effectiveWidth = columnWidths[colDef.field] ?? colDef.width ?? 100;\n\n const style: React.CSSProperties = {\n width: effectiveWidth,\n minWidth: colDef.minWidth,\n maxWidth: colDef.maxWidth,\n flexGrow: colDef.flex ?? 0,\n flexShrink: 0,\n flexBasis: colDef.flex ? 'auto' : 'auto',\n boxSizing: 'border-box',\n position: isPinned ? 'sticky' : 'relative',\n zIndex: colDef.zIndex,\n opacity: isDragging ? 0.5 : 1\n };\n\n if (isPinned && pinnedPosition) {\n const offset = pinnedPositions[colDef.field];\n if (pinnedPosition === 'left') {\n style.left = offset;\n } else {\n style.right = offset;\n }\n }\n\n const headerContent = colDef.renderHeader\n ? colDef.renderHeader({ field: colDef.field, colDef: colDef as unknown as GridColDef, colIndex: index })\n : colDef.headerName || colDef.field;\n\n const handleHeaderClick = (e: React.MouseEvent) => {\n if ((e.target as HTMLElement).closest('.ogx-column-resize-handle')) {\n e.stopPropagation();\n return;\n }\n onHeaderClick?.(colDef.field);\n if (isSortable) {\n handleColumnClick(colDef)(e);\n }\n };\n\n const handleDragStart = onDragStart ? onDragStart(colDef.field) : undefined;\n const handleDragOver = onDragOver ? onDragOver(colDef.field) : undefined;\n const handleDrop = onDrop ? onDrop(colDef.field) : undefined;\n\n return (\n <div\n key={colDef.field}\n className={classNames}\n style={style}\n title={colDef.description}\n onClick={handleHeaderClick}\n role=\"columnheader\"\n draggable={!!onDragStart}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDragEnd={onDragEnd}\n onDrop={handleDrop}\n aria-sort={\n isSortable\n ? (isSorted\n ? sortModel.find(item => item.field === colDef.field)?.sort === 'asc'\n ? 'ascending'\n : 'descending'\n : 'none')\n : undefined\n }\n aria-colindex={index + 1 + (checkboxSelection ? 1 : 0)}\n data-field={colDef.field}\n tabIndex={-1}\n ref={(el) => { cellRefs.current[colDef.field] = el; }}\n >\n <div className=\"ogx__header-cell-content\">\n {isDragging && (\n <div className=\"ogx__header-drag-icon\">\n <SwapIcon />\n </div>\n )}\n <div className=\"ogx__header-cell-title-wrapper\">\n <span className=\"ogx__header-cell-title\">\n {headerContent}\n </span>\n {aggregationModel && aggregationModel[colDef.field] && (\n <span className=\"ogx__header-cell-aggregation\">\n {aggregationModel[colDef.field]}\n </span>\n )}\n </div>\n {isSortable && getSortIcon(colDef.field)}\n {!colDef.disableColumnMenu && (\n <button\n className=\"ogx__menu-icon-btn\"\n onClick={handleMenuOpen(colDef)}\n aria-label={`Open column menu for ${colDef.headerName || colDef.field}`}\n aria-haspopup=\"menu\"\n tabIndex={-1}\n >\n <MenuIcon />\n </button>\n )}\n </div>\n\n { }\n {isResizable && onColumnResize && (\n <ColumnResizeHandle\n field={colDef.field}\n currentWidth={effectiveWidth}\n onResize={onColumnResize}\n minWidth={colDef.minWidth}\n maxWidth={colDef.maxWidth}\n />\n )}\n </div>\n );\n })}\n\n {menuOpenParams && (\n <ColumnMenu\n colDef={menuOpenParams.colDef as unknown as GridColDef<GridRowModel>}\n sortModel={sortModel}\n onSort={onSort}\n onHide={onHideColumn}\n onPin={onPinColumn}\n pinnedColumns={pinnedColumns}\n onManageColumns={onManageColumns}\n onClose={handleMenuClose}\n anchorEl={menuOpenParams.anchorEl}\n />\n )}\n </div>{/* end .ogx__header */}\n </div>\n );\n}\n","\nimport React from 'react';\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: 'text' | 'outlined' | 'contained';\n size?: 'small' | 'medium' | 'large';\n color?: 'primary' | 'secondary' | 'default';\n disabled?: boolean;\n children: React.ReactNode;\n}\n\nexport const Button: React.FC<ButtonProps> = ({\n variant = 'text',\n size = 'medium',\n color = 'default',\n disabled = false,\n className = '',\n children,\n ...props\n}) => {\n const classNames = [\n 'ogx-button',\n `ogx-button--${variant}`,\n `ogx-button--${size}`,\n `ogx-button--${color}`,\n disabled && 'ogx-button--disabled',\n className\n ].filter(Boolean).join(' ');\n\n return (\n <button\n className={classNames}\n disabled={disabled}\n {...props}\n >\n {children}\n </button>\n );\n};\n","\nimport React, { useId } from 'react';\nimport { Button } from '../ui/Button';\nimport type { GridLocaleText } from '../../types';\n\nexport interface PaginationProps {\n page: number;\n pageSize: number;\n rowCount: number;\n onPageChange: (page: number) => void;\n onPageSizeChange: (pageSize: number) => void;\n pageSizeOptions?: number[];\n showFirstButton?: boolean;\n showLastButton?: boolean;\n localeText?: Pick<GridLocaleText, 'paginationRowsPerPage' | 'paginationOf' | 'paginationPage'>;\n}\n\nexport function Pagination(props: PaginationProps) {\n const pageSizeId = useId();\n const {\n page,\n pageSize,\n rowCount,\n onPageChange,\n onPageSizeChange,\n pageSizeOptions = [10, 25, 50, 100],\n showFirstButton = true,\n showLastButton = true,\n localeText,\n } = props;\n\n const pageCount = Math.max(1, Math.ceil(rowCount / pageSize));\n const currentPage = Math.min(page, pageCount - 1);\n\n const firstRowIndex = currentPage * pageSize;\n const lastRowIndex = Math.min(firstRowIndex + pageSize, rowCount);\n const displayedRows = rowCount === 0 ? 0 : `${firstRowIndex + 1}–${lastRowIndex}`;\n\n const rowsPerPageLabel = localeText?.paginationRowsPerPage ?? 'Rows per page:';\n const ofLabel = localeText?.paginationOf\n ? localeText.paginationOf(rowCount === 0 ? 0 : firstRowIndex + 1, lastRowIndex, rowCount)\n : `${displayedRows} of ${rowCount}`;\n const pageLabel = localeText?.paginationPage\n ? localeText.paginationPage(currentPage + 1, pageCount)\n : `Page ${currentPage + 1} of ${pageCount}`;\n\n const handleFirstPage = () => {\n onPageChange(0);\n };\n\n const handlePreviousPage = () => {\n onPageChange(Math.max(0, currentPage - 1));\n };\n\n const handleNextPage = () => {\n onPageChange(Math.min(pageCount - 1, currentPage + 1));\n };\n\n const handleLastPage = () => {\n onPageChange(pageCount - 1);\n };\n\n const handlePageSizeChange = (event: React.ChangeEvent<HTMLSelectElement>) => {\n const newPageSize = parseInt(event.target.value, 10);\n onPageSizeChange(newPageSize);\n\n };\n\n const isFirstPage = currentPage === 0;\n const isLastPage = currentPage >= pageCount - 1;\n\n return (\n <div className=\"ogx-pagination\" role=\"navigation\" aria-label=\"Pagination\">\n { }\n <div className=\"ogx-pagination__page-size\">\n <label htmlFor={pageSizeId} className=\"ogx-pagination__label\">\n {rowsPerPageLabel}\n </label>\n <select\n id={pageSizeId}\n className=\"ogx-pagination__select\"\n value={pageSize}\n onChange={handlePageSizeChange}\n aria-label=\"Rows per page\"\n >\n {pageSizeOptions.map(option => (\n <option key={option} value={option}>\n {option}\n </option>\n ))}\n </select>\n </div>\n\n { }\n <div className=\"ogx-pagination__info\" aria-live=\"polite\" aria-atomic=\"true\">\n {ofLabel}\n </div>\n\n { }\n <div className=\"ogx-pagination__actions\">\n {showFirstButton && (\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={handleFirstPage}\n disabled={isFirstPage}\n aria-label=\"Go to first page\"\n title=\"First page\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M18.41 16.59L13.82 12l4.59-4.59L17 6l-6 6 6 6zM6 6h2v12H6z\" />\n </svg>\n </Button>\n )}\n\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={handlePreviousPage}\n disabled={isFirstPage}\n aria-label=\"Go to previous page\"\n title=\"Previous page\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\" />\n </svg>\n </Button>\n\n <div className=\"ogx-pagination__page-info\" aria-current=\"page\">\n {pageLabel}\n </div>\n\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={handleNextPage}\n disabled={isLastPage}\n aria-label=\"Go to next page\"\n title=\"Next page\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" />\n </svg>\n </Button>\n\n {showLastButton && (\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={handleLastPage}\n disabled={isLastPage}\n aria-label=\"Go to last page\"\n title=\"Last page\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M5.59 7.41L10.18 12l-4.59 4.59L7 18l6-6-6-6zM16 6h2v12h-2z\" />\n </svg>\n </Button>\n )}\n </div>\n </div>\n );\n}\n","\nimport { useReducer, useCallback, useState, useRef, useEffect, useLayoutEffect } from 'react';\nimport type {\n GridInternalState as GridState,\n GridRowModel,\n GridColDef,\n GridRowId,\n GridSortItem,\n GridFilterModel,\n GridPaginationModel,\n GridColumnVisibilityModel,\n GridApi\n} from '../../types';\n\ntype GridAction =\n | { type: 'SET_ROWS'; payload: GridRowModel[] | ((prev: GridRowModel[]) => GridRowModel[]); preserveRowCount?: boolean }\n | { type: 'SET_COLUMNS'; payload: GridColDef[] }\n | { type: 'SET_SORT_MODEL'; payload: GridSortItem[] }\n | { type: 'SET_FILTER_MODEL'; payload: GridFilterModel }\n | { type: 'SET_PAGINATION_MODEL'; payload: GridPaginationModel }\n | { type: 'SET_SELECTION'; payload: Set<GridRowId> }\n | { type: 'SET_DIMENSIONS'; payload: { viewportWidth: number; viewportHeight: number } }\n | { type: 'SET_DATASOURCE_LOADING'; payload: boolean }\n | { type: 'SET_DATASOURCE_ERROR'; payload: unknown }\n | { type: 'SET_ROW_COUNT'; payload: number };\n\nfunction createInitialState<R extends GridRowModel>(rows: R[], columns: GridColDef<R>[], columnVisibilityModel: GridColumnVisibilityModel = {}): GridState {\n const idRowsLookup = new Map<GridRowId, GridRowModel>();\n const allRows: GridRowId[] = [];\n\n rows.forEach(row => {\n idRowsLookup.set(row.id, row);\n allRows.push(row.id);\n });\n\n const columnLookup = new Map<string, GridColDef>();\n const orderedFields: string[] = [];\n\n columns.forEach(col => {\n columnLookup.set(col.field, col as unknown as GridColDef);\n orderedFields.push(col.field);\n });\n\n return {\n rows: {\n idRowsLookup,\n allRows\n },\n columns: {\n all: columns as unknown as GridColDef[],\n lookup: columnLookup,\n orderedFields,\n columnVisibilityModel\n },\n sorting: {\n sortModel: []\n },\n filter: {\n filterModel: { items: [] }\n },\n pagination: {\n paginationModel: { page: 0, pageSize: 100 },\n rowCount: rows.length\n },\n selection: {\n selectedRows: new Set()\n },\n pinning: {\n pinnedColumns: {},\n pinnedRows: {}\n },\n virtualization: {\n renderContext: {\n firstRowIndex: 0,\n lastRowIndex: 0,\n firstColumnIndex: 0,\n lastColumnIndex: 0\n },\n },\n dimensions: {\n rowHeight: 52,\n headerHeight: 56,\n viewportWidth: 0,\n viewportHeight: 0\n },\n dataSource: {\n loading: false,\n error: null\n }\n };\n}\n\nfunction gridReducer(state: GridState, action: GridAction): GridState {\n switch (action.type) {\n case 'SET_ROWS': {\n const currentRows = Array.from(state.rows.idRowsLookup.values());\n const newRows = typeof action.payload === 'function' \n ? action.payload(currentRows)\n : action.payload;\n\n const idRowsLookup = new Map<GridRowId, GridRowModel>();\n const allRows: GridRowId[] = [];\n\n newRows.forEach(row => {\n idRowsLookup.set(row.id, row);\n allRows.push(row.id);\n });\n\n return {\n ...state,\n rows: { idRowsLookup, allRows },\n pagination: {\n ...state.pagination,\n // Only override rowCount when we're NOT in server mode (i.e. no preserveRowCount flag)\n // Server-side fetches set rowCount separately via SET_ROW_COUNT.\n rowCount: action.preserveRowCount ? state.pagination.rowCount : newRows.length\n }\n };\n }\n\n case 'SET_COLUMNS': {\n const columnLookup = new Map<string, GridColDef>();\n const orderedFields: string[] = [];\n\n action.payload.forEach(col => {\n columnLookup.set(col.field, col);\n orderedFields.push(col.field);\n });\n\n return {\n ...state,\n columns: {\n all: action.payload,\n lookup: columnLookup,\n orderedFields,\n columnVisibilityModel: state.columns.columnVisibilityModel\n }\n };\n }\n\n case 'SET_SORT_MODEL':\n return {\n ...state,\n sorting: { sortModel: action.payload }\n };\n\n case 'SET_FILTER_MODEL':\n return {\n ...state,\n filter: { filterModel: action.payload }\n };\n\n case 'SET_PAGINATION_MODEL':\n return {\n ...state,\n pagination: {\n ...state.pagination,\n paginationModel: action.payload\n }\n };\n\n case 'SET_SELECTION':\n return {\n ...state,\n selection: { selectedRows: action.payload }\n };\n\n case 'SET_DIMENSIONS':\n return {\n ...state,\n dimensions: {\n ...state.dimensions,\n viewportWidth: action.payload.viewportWidth,\n viewportHeight: action.payload.viewportHeight\n }\n };\n\n case 'SET_DATASOURCE_LOADING':\n return {\n ...state,\n dataSource: {\n ...state.dataSource,\n loading: action.payload\n }\n };\n\n case 'SET_DATASOURCE_ERROR':\n return {\n ...state,\n dataSource: {\n ...state.dataSource,\n error: action.payload\n }\n };\n\n case 'SET_ROW_COUNT':\n return {\n ...state,\n pagination: {\n ...state.pagination,\n rowCount: action.payload\n }\n };\n\n default:\n return state;\n }\n}\n\nexport interface UseDataGridParams<R extends GridRowModel = GridRowModel> {\n rows: R[];\n columns: GridColDef<R>[];\n rowHeight?: number;\n headerHeight?: number;\n rowCount?: number;\n columnVisibilityModel?: GridColumnVisibilityModel;\n initialState?: import('../../state/types').GridInitialState;\n}\n\nexport function useDataGrid<R extends GridRowModel = GridRowModel>(params: UseDataGridParams<R>) {\n const { rows, columns, rowHeight = 52, headerHeight = 56, columnVisibilityModel, initialState: propInitialState } = params;\n\n const [internalInitialState] = useState(() =>\n createInitialState(rows, columns, columnVisibilityModel)\n );\n\n const [state, dispatch] = useReducer(gridReducer, {\n ...internalInitialState,\n sorting: propInitialState?.sorting || internalInitialState.sorting,\n filter: propInitialState?.filter || internalInitialState.filter,\n dataSource: propInitialState?.dataSource\n ? { ...internalInitialState.dataSource, ...propInitialState.dataSource }\n : internalInitialState.dataSource,\n pagination: {\n ...internalInitialState.pagination,\n ...(propInitialState?.pagination || {}),\n rowCount: params.rowCount ?? propInitialState?.pagination?.rowCount ?? internalInitialState.pagination.rowCount\n },\n dimensions: {\n ...internalInitialState.dimensions,\n rowHeight,\n headerHeight\n }\n });\n\n const stateRef = useRef(state);\n useLayoutEffect(() => { stateRef.current = state; });\n\n // Sync internal state when the external `rows` prop changes\n const prevRowsRef = useRef(rows);\n useEffect(() => {\n if (rows !== prevRowsRef.current) {\n prevRowsRef.current = rows;\n dispatch({ type: 'SET_ROWS', payload: rows as GridRowModel[] });\n }\n }, [rows]);\n\n const setRows = useCallback((rowsOrUpdater: GridRowModel[] | ((prev: GridRowModel[]) => GridRowModel[]), preserveRowCount?: boolean) => {\n dispatch({ type: 'SET_ROWS', payload: rowsOrUpdater, preserveRowCount });\n }, []);\n\n const setColumns = useCallback((newColumns: GridColDef[]) => {\n dispatch({ type: 'SET_COLUMNS', payload: newColumns });\n }, []);\n\n const setSortModel = useCallback((sortModel: GridSortItem[]) => {\n dispatch({ type: 'SET_SORT_MODEL', payload: sortModel });\n }, []);\n\n const setFilterModel = useCallback((filterModel: GridFilterModel) => {\n dispatch({ type: 'SET_FILTER_MODEL', payload: filterModel });\n }, []);\n\n const setPaginationModel = useCallback((paginationModel: GridPaginationModel) => {\n dispatch({ type: 'SET_PAGINATION_MODEL', payload: paginationModel });\n }, []);\n\n const setSelection = useCallback((selectedRows: Set<GridRowId>) => {\n dispatch({ type: 'SET_SELECTION', payload: selectedRows });\n }, []);\n\n const setDimensions = useCallback((viewportWidth: number, viewportHeight: number) => {\n dispatch({ type: 'SET_DIMENSIONS', payload: { viewportWidth, viewportHeight } });\n }, []);\n\n const setDataSourceLoading = useCallback((loading: boolean) => {\n dispatch({ type: 'SET_DATASOURCE_LOADING', payload: loading });\n }, []);\n\n const setDataSourceError = useCallback((error: unknown) => {\n dispatch({ type: 'SET_DATASOURCE_ERROR', payload: error });\n }, []);\n\n const setRowCount = useCallback((count: number) => {\n dispatch({ type: 'SET_ROW_COUNT', payload: count });\n }, []);\n\n const apiRef = useRef<GridApi>({\n getRow: (id: GridRowId) => stateRef.current.rows.idRowsLookup.get(id) || null,\n getAllRows: () => Array.from(stateRef.current.rows.idRowsLookup.values()),\n getVisibleRows: () => Array.from(stateRef.current.rows.idRowsLookup.values()),\n getAllFilteredRows: () => Array.from(stateRef.current.rows.idRowsLookup.values()),\n getGroupedExportRows: () => null,\n getAggregationResult: () => null,\n getAggregationModel: () => null,\n getColumn: (field: string) => stateRef.current.columns.lookup.get(field) || null,\n getAllColumns: () => stateRef.current.columns.all,\n getVisibleColumns: () => stateRef.current.columns.all,\n selectRow: (id: GridRowId, isSelected = true) => {\n const newSelection = new Set(stateRef.current.selection.selectedRows);\n if (isSelected) {\n newSelection.add(id);\n } else {\n newSelection.delete(id);\n }\n setSelection(newSelection);\n },\n selectRows: (ids: GridRowId[], isSelected = true) => {\n const newSelection = new Set(stateRef.current.selection.selectedRows);\n ids.forEach(id => {\n if (isSelected) {\n newSelection.add(id);\n } else {\n newSelection.delete(id);\n }\n });\n setSelection(newSelection);\n },\n getSelectedRows: () => Array.from(stateRef.current.selection.selectedRows),\n sortColumn: (field: string, direction) => {\n if (direction === null) {\n setSortModel(stateRef.current.sorting.sortModel.filter(item => item.field !== field));\n } else {\n const existingIndex = stateRef.current.sorting.sortModel.findIndex(item => item.field === field);\n if (existingIndex >= 0) {\n const newModel = [...stateRef.current.sorting.sortModel];\n newModel[existingIndex] = { field, sort: direction };\n setSortModel(newModel);\n } else {\n setSortModel([...stateRef.current.sorting.sortModel, { field, sort: direction }]);\n }\n }\n },\n getSortModel: () => stateRef.current.sorting.sortModel,\n setFilterModel,\n getFilterModel: () => stateRef.current.filter.filterModel,\n setPage: (page: number) => {\n setPaginationModel({ ...stateRef.current.pagination.paginationModel, page });\n },\n setPageSize: (pageSize: number) => {\n setPaginationModel({ ...stateRef.current.pagination.paginationModel, pageSize, page: 0 });\n },\n scrollToIndexes: () => {\n\n },\n copySelectedRows: () => Promise.resolve()\n });\n\n return {\n state,\n dispatch,\n apiRef,\n setRows,\n setColumns,\n setSortModel,\n setFilterModel,\n setPaginationModel,\n setSelection,\n setDimensions,\n setDataSourceLoading,\n setDataSourceError,\n setRowCount\n };\n}\n","import { useState, useCallback } from 'react';\nimport type { GridRowId, GridRowModel, GridRowOrderChangeParams } from '../types';\n\nexport interface UseRowReorderProps<R extends GridRowModel = GridRowModel> {\n onRowOrderChange?: (params: GridRowOrderChangeParams<R>) => void;\n rows: R[];\n getRowId?: (row: R) => GridRowId;\n rowReordering?: boolean;\n}\n\nexport interface UseRowReorderReturn {\n draggedRowId: GridRowId | null;\n dragOverRowId: GridRowId | null;\n onDragStart: ((id: GridRowId) => (event: React.DragEvent) => void) | undefined;\n onDragOver: ((id: GridRowId) => (event: React.DragEvent) => void) | undefined;\n onDragEnd: (() => void) | undefined;\n onDrop: ((targetId: GridRowId) => (event: React.DragEvent) => void) | undefined;\n}\n\nexport function useRowReorder<R extends GridRowModel = GridRowModel>(\n props: UseRowReorderProps<R>\n): UseRowReorderReturn {\n const { onRowOrderChange, rows, getRowId, rowReordering = false } = props;\n const [draggedRowId, setDraggedRowId] = useState<GridRowId | null>(null);\n const [dragOverRowId, setDragOverRowId] = useState<GridRowId | null>(null);\n\n const getRowIdInternal = useCallback((row: R) => {\n return getRowId ? getRowId(row) : row.id;\n }, [getRowId]);\n\n const handleDragStart = useCallback((id: GridRowId) => (event: React.DragEvent) => {\n if (!rowReordering) return;\n setDraggedRowId(id);\n event.dataTransfer.effectAllowed = 'move';\n\n }, [rowReordering]);\n\n const handleDragOver = useCallback((id: GridRowId) => (event: React.DragEvent) => {\n if (!rowReordering || !draggedRowId) return;\n event.preventDefault(); \n event.dataTransfer.dropEffect = 'move';\n\n if (dragOverRowId !== id) {\n setDragOverRowId(id);\n }\n }, [rowReordering, draggedRowId, dragOverRowId]);\n\n const handleDragEnd = useCallback(() => {\n setDraggedRowId(null);\n setDragOverRowId(null);\n }, []);\n\n const handleDrop = useCallback((targetId: GridRowId) => (event: React.DragEvent) => {\n event.preventDefault();\n\n if (!draggedRowId || !onRowOrderChange) {\n handleDragEnd();\n return;\n }\n\n const oldIndex = rows.findIndex(r => getRowIdInternal(r) === draggedRowId);\n const targetIndex = rows.findIndex(r => getRowIdInternal(r) === targetId);\n\n if (oldIndex !== -1 && targetIndex !== -1 && oldIndex !== targetIndex) {\n onRowOrderChange({\n row: rows[oldIndex],\n oldIndex,\n targetIndex\n });\n }\n\n handleDragEnd();\n }, [draggedRowId, onRowOrderChange, rows, getRowIdInternal, handleDragEnd]);\n\n return {\n draggedRowId,\n dragOverRowId,\n onDragStart: rowReordering ? handleDragStart : undefined,\n onDragOver: rowReordering ? handleDragOver : undefined,\n onDragEnd: rowReordering ? handleDragEnd : undefined,\n onDrop: rowReordering ? handleDrop : undefined,\n };\n}\n","import { useMemo, useState, useCallback } from 'react';\nimport { GridRowModel, GridRowId, GridTreeNode, GridFilterModel, GridSortItem } from '../types';\nimport type { GridRowMeta } from '../types';\nimport { isRowMatchingFilter } from '../utils/filtering';\nimport { compareValues } from '../utils/sorting';\n\nconst EMPTY_OVERRIDES: Map<GridRowId, boolean> = new Map();\n\ninterface ExpansionOverrides {\n configKey: string;\n overrides: Map<GridRowId, boolean>;\n}\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 // Same model as useRowGrouping: depth-based default plus user overrides keyed by config.\n // Rebuilding the tree (row edits, lazily loaded children) keeps the user's choices.\n const configKey = `${treeData}|${defaultGroupingExpansionDepth}`;\n const [expansionState, setExpansionState] = useState<ExpansionOverrides>(() => ({\n configKey,\n overrides: new Map(),\n }));\n const overrides = expansionState.configKey === configKey ? expansionState.overrides : EMPTY_OVERRIDES;\n\n const isDefaultExpanded = useCallback((node: GridTreeNode | undefined) => (\n Boolean(node?.children && node.children.length > 0) &&\n (defaultGroupingExpansionDepth === -1 || (node?.depth ?? 0) < defaultGroupingExpansionDepth)\n ), [defaultGroupingExpansionDepth]);\n\n const expandedGroupIds = useMemo<Set<GridRowId>>(() => {\n const ids = new Set<GridRowId>();\n if (!treeData) return ids;\n treeNodes.forEach((node, id) => {\n // A lazily loaded node can be expanded before it has any children, so an\n // explicit override counts even when children is still empty.\n if (overrides.get(id) ?? isDefaultExpanded(node)) ids.add(id);\n });\n return ids;\n }, [treeData, treeNodes, overrides, isDefaultExpanded]);\n\n const toggleExpansion = useCallback((id: GridRowId) => {\n const isExpanding = !expandedGroupIds.has(id);\n setExpansionState(prev => {\n const base = prev.configKey === configKey ? prev.overrides : EMPTY_OVERRIDES;\n const next = new Map(base);\n next.set(id, isExpanding);\n return { configKey, overrides: next };\n });\n // Called outside the state updater: updaters may run twice, and this can trigger a server fetch.\n if (isExpanding && onRowExpansionChange) {\n const node = treeNodes.get(id);\n if (node) onRowExpansionChange(node);\n }\n }, [expandedGroupIds, configKey, 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) => (filterModel ? isRowMatchingFilter(row, filterModel) : true);\n\n const filterCache = new Map<GridRowId, boolean>();\n\n const isNodeVisible = (id: GridRowId): boolean => {\n if (filterCache.has(id)) return filterCache.get(id)!;\n\n const row = rowLookup.get(id);\n if (!row) return false;\n\n const selfMatch = matchesFilter(row);\n if (selfMatch) {\n filterCache.set(id, true);\n return true;\n }\n\n const node = treeNodes.get(id);\n if (node && node.children) {\n const childMatch = node.children.some(childId => isNodeVisible(childId));\n if (childMatch) {\n filterCache.set(id, true);\n return true;\n }\n }\n\n filterCache.set(id, false);\n return false;\n };\n\n const sortNodes = (aId: GridRowId, bId: GridRowId) => {\n if (!sortModel || sortModel.length === 0) return 0;\n const rowA = rowLookup.get(aId);\n const rowB = rowLookup.get(bId);\n if (!rowA || !rowB) return 0;\n\n for (const sortItem of sortModel) {\n const valA = rowA[sortItem.field];\n const valB = rowB[sortItem.field];\n const comp = compareValues(valA, valB, sortItem.sort);\n if (comp !== 0) return comp;\n }\n return 0;\n };\n\n const result: GridRowModel[] = [];\n\n const seenIds = new Set<GridRowId>();\n\n const traverse = (ids: GridRowId[]) => {\n\n const visibleIds = ids.filter(id => isNodeVisible(id));\n\n visibleIds.sort(sortNodes);\n\n visibleIds.forEach(id => {\n if (seenIds.has(id)) return; \n\n const row = rowLookup.get(id);\n const node = treeNodes.get(id);\n\n if (row && node) {\n seenIds.add(id); \n\n const enhancedRow = {\n ...row,\n _treeDepth: node.depth,\n _isExpanded: expandedGroupIds.has(id),\n _hasChildren: Boolean((node.children && node.children.length > 0) || (node.serverChildrenCount && node.serverChildrenCount > 0)),\n _descendantCount: node.children ? node.children.length : 0\n };\n result.push(enhancedRow);\n\n if (expandedGroupIds.has(id) && node.children && node.children.length > 0) {\n traverse(node.children);\n }\n }\n });\n };\n\n traverse(rootIds);\n return result;\n\n }, [treeData, rows, groupingRows, rootIds, treeNodes, expandedGroupIds, filterModel, sortModel, getRowId]);\n\n const isGroupExpanded = useCallback((id: GridRowId) => expandedGroupIds.has(id), [expandedGroupIds]);\n const getNode = useCallback((id: GridRowId) => treeNodes.get(id), [treeNodes]);\n\n const getNodePath = useCallback((id: GridRowId): string[] => {\n const path: string[] = [];\n let currentId: GridRowId | null = id;\n\n while (currentId !== null) {\n const node = treeNodes.get(currentId);\n if (!node) break;\n\n path.unshift(node.groupingKey);\n currentId = node.parentId;\n }\n return path;\n }, [treeNodes]);\n\n const rowMetaMap = useMemo<Map<GridRowId, GridRowMeta>>(() => {\n const map = new Map<GridRowId, GridRowMeta>();\n const groupRowIds = new Set(groupingRows.map(r => r.id));\n treeNodes.forEach((node, id) => {\n map.set(id, {\n hasChildren: Boolean(\n (node.children && node.children.length > 0) ||\n (node.serverChildrenCount && node.serverChildrenCount > 0)\n ),\n treeDepth: node.depth,\n descendantCount: node.children ? node.children.length : undefined,\n isGroupRow: groupRowIds.has(id),\n isExpanded: expandedGroupIds.has(id),\n });\n });\n return map;\n }, [treeNodes, groupingRows, expandedGroupIds]);\n\n return useMemo(() => ({\n treeNodes,\n groupingRows,\n toggleExpansion,\n isGroupExpanded,\n getVisibleRows,\n getNode,\n getNodePath,\n rowMetaMap,\n }), [treeNodes, groupingRows, toggleExpansion, isGroupExpanded, getVisibleRows, getNode, getNodePath, rowMetaMap]);\n}\n","import { useState, useMemo, useCallback } from 'react';\nimport type {\n GridRowModel,\n GridRowId,\n GridRowGroupingModel,\n GridAggregationModel,\n GridTreeNode,\n GridFilterModel,\n GridSortItem,\n GridRowMeta,\n GridColDef\n} from '../types';\nimport { isRowMatchingFilter } from '../utils/filtering';\nimport { compareValues } from '../utils/sorting';\nimport { computeAggregations } from '../utils/aggregation';\n\nexport interface UseRowGroupingParams<R extends GridRowModel> {\n rows: R[];\n getRowId: (row: R) => GridRowId;\n columns?: GridColDef<R>[];\n rowGroupingModel?: GridRowGroupingModel;\n aggregationModel?: GridAggregationModel;\n defaultGroupingExpansionDepth?: number;\n filterModel?: GridFilterModel;\n sortModel?: GridSortItem[];\n getAggregationPosition?: (groupNode: GridTreeNode | null) => 'inline' | 'footer' | null;\n}\n\nconst defaultGetAggregationPosition = (groupNode: GridTreeNode | null): 'inline' | 'footer' | null => {\n\n return groupNode?.depth === -1 ? 'footer' : 'inline';\n};\n\n// Stable empty defaults — module-level constants prevent new object identity\n// on every render, which would otherwise invalidate useMemo deps and cause\n// infinite re-render loops when callers omit optional params.\nconst EMPTY_ROW_GROUPING_MODEL: GridRowGroupingModel = [];\nconst EMPTY_AGGREGATION_MODEL: GridAggregationModel = {};\nconst EMPTY_OVERRIDES: Map<GridRowId, boolean> = new Map();\n\ninterface ExpansionOverrides {\n configKey: string;\n overrides: Map<GridRowId, boolean>;\n}\n\nexport function useRowGrouping<R extends GridRowModel>(params: UseRowGroupingParams<R>) {\n const {\n rows,\n getRowId,\n columns,\n rowGroupingModel = EMPTY_ROW_GROUPING_MODEL,\n aggregationModel = EMPTY_AGGREGATION_MODEL,\n defaultGroupingExpansionDepth = 0,\n filterModel,\n sortModel,\n getAggregationPosition = defaultGetAggregationPosition\n } = params;\n\n const columnsLookup = useMemo(() => {\n const map = new Map<string, GridColDef<R>>();\n (columns ?? []).forEach(col => map.set(col.field, col));\n return map;\n }, [columns]);\n\n // User expand/collapse choices are stored as overrides on top of the depth-based\n // default, keyed by the grouping config. Rebuilding the tree (row edits, new rows\n // arrays) keeps them because group ids are deterministic; changing the grouping\n // config itself discards them.\n const configKey = `${rowGroupingModel.join('\\u001f')}|${defaultGroupingExpansionDepth}`;\n const [expansionState, setExpansionState] = useState<ExpansionOverrides>(() => ({\n configKey,\n overrides: new Map(),\n }));\n const overrides = expansionState.configKey === configKey ? expansionState.overrides : EMPTY_OVERRIDES;\n\n const { treeNodes, rootIds, groupingRows } = useMemo(() => {\n const treeNodes = new Map<GridRowId, GridTreeNode>();\n const groupingRows = new Map<GridRowId, R>();\n const rootIds: GridRowId[] = [];\n\n if (rowGroupingModel.length === 0) {\n return { treeNodes, rootIds, groupingRows };\n }\n\n const getGroupId = (field: string, value: unknown, parentId: GridRowId | null) => {\n return `auto-group-${field}-${value}-${parentId || 'root'}`;\n };\n\n const groupRows = (\n currentRows: R[], \n depth: number, \n parentId: GridRowId | null\n ) => {\n if (depth >= rowGroupingModel.length) {\n\n return currentRows.map(row => {\n const id = getRowId(row);\n treeNodes.set(id, {\n id,\n parentId,\n depth,\n groupingKey: '',\n isExpanded: false\n });\n return id;\n });\n }\n\n const field = rowGroupingModel[depth];\n\n // Skip fields where the column has explicitly opted out of grouping.\n const colDef = columnsLookup.get(field);\n if (colDef && colDef.groupable === false) {\n return groupRows(currentRows, depth + 1, parentId);\n }\n\n const groups = new Map<string, R[]>();\n\n // Group current rows by value of the current field\n currentRows.forEach(row => {\n const value = row[field];\n const key = String(value); // reliable map key\n if (!groups.has(key)) {\n groups.set(key, []);\n }\n groups.get(key)!.push(row);\n });\n\n const groupIds: GridRowId[] = [];\n\n // Create group rows\n groups.forEach((groupRowsList, key) => {\n // Use the raw value from the first row of the group for the groupingValue\n const firstRow = groupRowsList[0];\n const rawValue = firstRow[field];\n\n const groupId = getGroupId(field, key, parentId);\n groupIds.push(groupId);\n\n // Calculate Aggregations for this group\n const aggregatedValues: Record<string, unknown> =\n computeAggregations(groupRowsList, aggregationModel, columnsLookup, 'useRowGrouping');\n\n const groupRow = {\n [field]: rawValue,\n ...aggregatedValues,\n id: groupId\n } as unknown as R;\n\n groupingRows.set(groupId, groupRow);\n\n const treeNode: GridTreeNode = {\n id: groupId,\n parentId,\n depth,\n groupingKey: key,\n groupingField: field,\n groupingValue: rawValue,\n aggregatedValues,\n isExpanded: false,\n children: [], \n label: colDef?.groupingValueFormatter\n ? colDef.groupingValueFormatter({ field, value: rawValue })\n : `${field}: ${String(rawValue)}` \n };\n\n treeNode.aggregationPosition = getAggregationPosition(treeNode);\n\n treeNodes.set(groupId, treeNode);\n\n const childrenIds = groupRows(groupRowsList, depth + 1, groupId);\n treeNodes.get(groupId)!.children = childrenIds;\n\n const descendantCount = groupRowsList.length;\n treeNodes.get(groupId)!.descendantCount = descendantCount;\n });\n\n return groupIds;\n };\n\n const topLevelIds = groupRows(rows, 0, null);\n rootIds.push(...topLevelIds);\n\n return { treeNodes, rootIds, groupingRows };\n\n }, [rows, rowGroupingModel, aggregationModel, getRowId, getAggregationPosition, columnsLookup]);\n\n const isDefaultExpanded = useCallback((node: GridTreeNode | undefined) => (\n Boolean(node?.children && node.children.length > 0) &&\n (defaultGroupingExpansionDepth === -1 || (node?.depth ?? 0) < defaultGroupingExpansionDepth)\n ), [defaultGroupingExpansionDepth]);\n\n const expandedGroupIds = useMemo<Set<GridRowId>>(() => {\n const ids = new Set<GridRowId>();\n treeNodes.forEach((node, id) => {\n if (!node.children || node.children.length === 0) return;\n if (overrides.get(id) ?? isDefaultExpanded(node)) ids.add(id);\n });\n return ids;\n }, [treeNodes, overrides, isDefaultExpanded]);\n\n const toggleExpansion = useCallback((id: GridRowId) => {\n setExpansionState(prev => {\n const base = prev.configKey === configKey ? prev.overrides : EMPTY_OVERRIDES;\n const current = base.get(id) ?? isDefaultExpanded(treeNodes.get(id));\n const next = new Map(base);\n next.set(id, !current);\n return { configKey, overrides: next };\n });\n }, [configKey, treeNodes, isDefaultExpanded]);\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 // Copy before sorting: ids may be node.children / rootIds from the memoized tree.\n const visibleIds = filterModel ? ids.filter(doesNodeMatchFilter) : [...ids];\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 (expandedGroupIds.has(id) && isGroup) {\n traverse(node.children!);\n }\n }\n });\n };\n\n traverse(rootIds);\n\n return result;\n\n }, [rows, getRowId, treeNodes, rootIds, groupingRows, filterModel, sortModel, expandedGroupIds, rowGroupingModel]);\n\n const getNode = useCallback((id: GridRowId) => treeNodes.get(id), [treeNodes]);\n\n const rowMetaMap = useMemo<Map<GridRowId, GridRowMeta>>(() => {\n const map = new Map<GridRowId, GridRowMeta>();\n treeNodes.forEach((node, id) => {\n const isGroup = Boolean(node.children && node.children.length > 0);\n map.set(id, {\n hasChildren: isGroup,\n treeDepth: node.depth,\n groupingField: node.groupingField,\n groupingValue: node.groupingValue,\n groupLabel: node.label,\n descendantCount: node.descendantCount,\n isGroupRow: isGroup,\n isExpanded: isGroup ? expandedGroupIds.has(id) : undefined,\n });\n });\n return map;\n }, [treeNodes, expandedGroupIds]);\n\n return useMemo(() => ({\n treeNodes,\n groupingRows,\n toggleExpansion,\n isGroupExpanded,\n getVisibleRows,\n getNode,\n rowMetaMap,\n }), [treeNodes, groupingRows, toggleExpansion, isGroupExpanded, getVisibleRows, getNode, rowMetaMap]);\n}\n","import React, { useState, useCallback, useRef } from 'react';\nimport type { GridRowId, GridRowModel } from '../../types';\n\nexport interface GridEditingState {\n editingCell: {\n id: GridRowId;\n field: string;\n value: unknown;\n originalValue: unknown;\n } | null;\n}\n\nexport interface UseGridEditingParams<R extends GridRowModel> {\n rows: R[];\n getRowId: (row: R) => GridRowId;\n processRowUpdate?: (newRow: R, oldRow: R) => R | Promise<R>;\n onProcessRowUpdateError?: (error: unknown) => void;\n onRowChange?: (newRow: R) => void;\n}\n\ntype EditingCellState = GridEditingState['editingCell'];\n\nexport function useGridEditing<R extends GridRowModel>(params: UseGridEditingParams<R>) {\n const {\n rows,\n getRowId,\n processRowUpdate,\n onProcessRowUpdateError,\n onRowChange\n } = params;\n\n const [editingCell, setEditingCellState] = useState<EditingCellState>(null);\n const editingCellRef = useRef<EditingCellState>(null);\n\n const setEditingCell = useCallback((val: React.SetStateAction<EditingCellState>) => {\n setEditingCellState(val);\n editingCellRef.current = typeof val === 'function' ? val(editingCellRef.current) : val;\n }, []);\n\n const startCellEdit = useCallback((editParams: { id: GridRowId; field: string; value: unknown }) => {\n setEditingCell({\n id: editParams.id,\n field: editParams.field,\n value: editParams.value,\n originalValue: editParams.value\n });\n }, [setEditingCell]);\n\n const stopCellEdit = useCallback(async (stopParams?: { cancel?: boolean }) => {\n const currentCell = editingCellRef.current;\n if (!currentCell) return;\n\n if (stopParams?.cancel) {\n setEditingCell(null);\n return;\n }\n\n const { id, field, value, originalValue } = currentCell;\n\n if (value === originalValue) {\n setEditingCell(null);\n return;\n }\n\n const existingRow = rows.find(r => getRowId(r) === id);\n if (!existingRow) {\n setEditingCell(null);\n return;\n }\n\n const newRow = { ...existingRow, [field]: value };\n\n try {\n if (processRowUpdate) {\n const processedRow = await processRowUpdate(newRow, existingRow);\n onRowChange?.(processedRow);\n } else {\n onRowChange?.(newRow);\n }\n setEditingCell(null);\n } catch (error) {\n onProcessRowUpdateError?.(error);\n }\n\n }, [setEditingCell, rows, getRowId, processRowUpdate, onRowChange, onProcessRowUpdateError]);\n\n const setEditCellValue = useCallback((editParams: { id: GridRowId; field: string; value: unknown }) => {\n if (editingCell && editingCell.id === editParams.id && editingCell.field === editParams.field) {\n setEditingCell(prev => prev ? { ...prev, value: editParams.value } : null);\n }\n }, [editingCell, setEditingCell]);\n\n return {\n editingCell,\n startCellEdit,\n stopCellEdit,\n setEditCellValue\n };\n}\n","\nimport { useState, useCallback, useEffect } from 'react';\nimport type { GridRowId, GridColDef, GridRowModel, GridRenderCellParams } from '../../types';\n\ntype ColumnKey = string;\n\nexport type CellColSpanInfo = \n | { \n spannedByColSpan: true; \n rightVisibleCellIndex: number; \n leftVisibleCellIndex: number; \n }\n | { \n spannedByColSpan: false; \n cellProps: { \n colSpan: number; \n width: number; \n }; \n };\n\ntype ColspanMap = Map<GridRowId, Record<ColumnKey, CellColSpanInfo>>;\n\nexport interface RowSpanningCaches {\n spannedCells: Record<GridRowId, Record<ColumnKey, number>>;\n hiddenCells: Record<GridRowId, Record<ColumnKey, boolean>>;\n hiddenCellOriginMap: Record<number, Record<ColumnKey, number>>;\n}\n\nexport interface RowSpanningState {\n caches: RowSpanningCaches;\n processedRange: { firstRowIndex: number; lastRowIndex: number; };\n}\n\nexport function useGridSpanning<R extends GridRowModel>(\n rows: R[],\n columns: GridColDef<R>[],\n columnWidths: Record<string, number>\n) {\n\n const [colspanMap, setColspanMap] = useState<ColspanMap>(new Map());\n\n const [rowSpanningState, setRowSpanningState] = useState<RowSpanningState>({\n caches: {\n spannedCells: {},\n hiddenCells: {},\n hiddenCellOriginMap: {}\n },\n processedRange: { firstRowIndex: 0, lastRowIndex: 0 }\n });\n\n const resetColSpan = useCallback(() => {\n setColspanMap(new Map());\n }, []);\n\n const getCellColSpanInfo = useCallback((rowId: GridRowId, field: string): CellColSpanInfo | undefined => {\n return colspanMap.get(rowId)?.[field];\n }, [colspanMap]);\n\n const calculateColSpan = useCallback((\n rowId: GridRowId,\n row: R,\n rowIndex: number,\n minFirstColumn: number,\n maxLastColumn: number\n ) => {\n const newMap = new Map(colspanMap);\n\n for (let i = minFirstColumn; i < maxLastColumn; i++) {\n const colDef = columns[i];\n if (!colDef) continue;\n\n let colSpan = 1;\n if (colDef.colSpan) {\n if (typeof colDef.colSpan === 'function') {\n const params: GridRenderCellParams<R> = {\n row,\n value: row[colDef.field as keyof R],\n field: colDef.field,\n colDef,\n rowIndex,\n colIndex: i \n };\n colSpan = colDef.colSpan(params);\n } else {\n colSpan = colDef.colSpan;\n }\n }\n\n if (colSpan <= 1) {\n setCellColSpanInfo(newMap, rowId, colDef.field, {\n spannedByColSpan: false,\n cellProps: { colSpan: 1, width: columnWidths[colDef.field] || 100 }\n });\n continue;\n }\n\n let width = columnWidths[colDef.field] || 100;\n for (let j = 1; j < colSpan; j++) {\n if (i + j < maxLastColumn) {\n const nextCol = columns[i + j];\n if (nextCol) {\n width += columnWidths[nextCol.field] || 100;\n\n setCellColSpanInfo(newMap, rowId, nextCol.field, {\n spannedByColSpan: true,\n leftVisibleCellIndex: i,\n rightVisibleCellIndex: Math.min(i + colSpan - 1, columns.length - 1)\n });\n }\n }\n }\n\n setCellColSpanInfo(newMap, rowId, colDef.field, {\n spannedByColSpan: false,\n cellProps: { colSpan, width }\n });\n\n i += colSpan - 1; \n }\n\n setColspanMap(newMap);\n }, [colspanMap, columns, columnWidths]);\n\n const calculateRowSpan = useCallback((\n firstRowIndex: number,\n lastRowIndex: number\n ) => {\n const spannedCells: Record<GridRowId, Record<ColumnKey, number>> = {};\n const hiddenCells: Record<GridRowId, Record<ColumnKey, boolean>> = {};\n const hiddenCellOriginMap: Record<number, Record<ColumnKey, number>> = {};\n\n columns.forEach((colDef, columnIndex) => {\n\n if (!colDef.rowSpan) return;\n\n for (let index = firstRowIndex; index < lastRowIndex; index++) {\n const row = rows[index];\n if (!row) continue;\n\n if (hiddenCells[row.id]?.[colDef.field]) continue;\n\n const cellValue = colDef.valueGetter\n ? colDef.valueGetter({ row, field: colDef.field, value: row[colDef.field as keyof R] })\n : row[colDef.field as keyof R];\n\n let span = 1;\n if (typeof colDef.rowSpan === 'function') {\n const params: GridRenderCellParams<R> = {\n row,\n value: cellValue,\n field: colDef.field,\n colDef,\n rowIndex: index,\n colIndex: columnIndex\n };\n span = colDef.rowSpan(params);\n } else if (typeof colDef.rowSpan === 'number') {\n span = colDef.rowSpan;\n }\n\n if (span > 1) {\n if (!spannedCells[row.id]) spannedCells[row.id] = {};\n spannedCells[row.id][colDef.field] = span; \n\n for (let k = 1; k < span; k++) {\n const nextIndex = index + k;\n if (nextIndex < lastRowIndex && rows[nextIndex]) {\n const nextRow = rows[nextIndex];\n if (!hiddenCells[nextRow.id]) hiddenCells[nextRow.id] = {};\n hiddenCells[nextRow.id][colDef.field] = true; \n\n if (!hiddenCellOriginMap[nextIndex]) hiddenCellOriginMap[nextIndex] = {};\n hiddenCellOriginMap[nextIndex][colDef.field] = index; \n }\n }\n }\n }\n });\n\n setRowSpanningState({\n caches: { spannedCells, hiddenCells, hiddenCellOriginMap },\n processedRange: { firstRowIndex, lastRowIndex }\n });\n }, [rows, columns]);\n\n const resetRowSpan = useCallback(() => {\n setRowSpanningState({\n caches: {\n spannedCells: {},\n hiddenCells: {},\n hiddenCellOriginMap: {}\n },\n processedRange: { firstRowIndex: 0, lastRowIndex: 0 }\n });\n }, []);\n\n useEffect(() => {\n\n const newMap = new Map<GridRowId, Record<ColumnKey, CellColSpanInfo>>();\n\n rows.forEach((row, index) => {\n for (let i = 0; i < columns.length; i++) {\n const colDef = columns[i];\n if (!colDef) continue;\n\n let colSpan = 1;\n if (colDef.colSpan) {\n if (typeof colDef.colSpan === 'function') {\n const params: GridRenderCellParams<R> = {\n row,\n value: row[colDef.field as keyof R],\n field: colDef.field,\n colDef,\n rowIndex: index,\n colIndex: i\n };\n colSpan = colDef.colSpan(params);\n } else {\n colSpan = colDef.colSpan;\n }\n }\n\n if (colSpan <= 1) {\n const colWidth = columnWidths[colDef.field] || (typeof colDef.width === 'number' ? colDef.width : 100);\n setCellColSpanInfo(newMap, row.id, colDef.field, {\n spannedByColSpan: false,\n cellProps: { colSpan: 1, width: colWidth }\n });\n continue;\n }\n\n let width = columnWidths[colDef.field] || (typeof colDef.width === 'number' ? colDef.width : 100);\n for (let j = 1; j < colSpan; j++) {\n if (i + j < columns.length) {\n const nextCol = columns[i + j];\n if (nextCol) {\n const nextColWidth = columnWidths[nextCol.field] || (typeof nextCol.width === 'number' ? nextCol.width : 100);\n width += nextColWidth;\n\n setCellColSpanInfo(newMap, row.id, nextCol.field, {\n spannedByColSpan: true,\n leftVisibleCellIndex: i,\n rightVisibleCellIndex: Math.min(i + colSpan - 1, columns.length - 1)\n });\n }\n }\n }\n\n setCellColSpanInfo(newMap, row.id, colDef.field, {\n spannedByColSpan: false,\n cellProps: { colSpan, width }\n });\n\n i += colSpan - 1; \n }\n });\n\n setColspanMap(newMap);\n\n const spannedCells: Record<GridRowId, Record<ColumnKey, number>> = {};\n const hiddenCells: Record<GridRowId, Record<ColumnKey, boolean>> = {};\n const hiddenCellOriginMap: Record<number, Record<ColumnKey, number>> = {};\n\n columns.forEach((colDef, columnIndex) => {\n if (!colDef.rowSpan) return;\n\n for (let index = 0; index < rows.length; index++) {\n const row = rows[index];\n if (!row) continue;\n\n if (hiddenCells[row.id]?.[colDef.field]) continue;\n\n const cellValue = colDef.valueGetter\n ? colDef.valueGetter({ row, field: colDef.field, value: row[colDef.field as keyof R] })\n : row[colDef.field as keyof R];\n\n let span = 1;\n if (typeof colDef.rowSpan === 'function') {\n const params: GridRenderCellParams<R> = {\n row,\n value: cellValue,\n field: colDef.field,\n colDef,\n rowIndex: index,\n colIndex: columnIndex\n };\n span = colDef.rowSpan(params);\n } else if (typeof colDef.rowSpan === 'number') {\n span = colDef.rowSpan;\n }\n\n if (span > 1) {\n if (!spannedCells[row.id]) spannedCells[row.id] = {};\n spannedCells[row.id][colDef.field] = span;\n\n for (let k = 1; k < span; k++) {\n const nextIndex = index + k;\n if (nextIndex < rows.length && rows[nextIndex]) {\n const nextRow = rows[nextIndex];\n if (!hiddenCells[nextRow.id]) hiddenCells[nextRow.id] = {};\n hiddenCells[nextRow.id][colDef.field] = true;\n\n if (!hiddenCellOriginMap[nextIndex]) hiddenCellOriginMap[nextIndex] = {};\n hiddenCellOriginMap[nextIndex][colDef.field] = index;\n }\n }\n }\n }\n });\n\n setRowSpanningState({\n caches: { spannedCells, hiddenCells, hiddenCellOriginMap },\n processedRange: { firstRowIndex: 0, lastRowIndex: rows.length }\n });\n }, [rows, columns, columnWidths]);\n\n const getSpannedCells = useCallback(() => rowSpanningState.caches.spannedCells, [rowSpanningState]);\n const getHiddenCells = useCallback(() => rowSpanningState.caches.hiddenCells, [rowSpanningState]);\n const getHiddenCellOriginMap = useCallback(() => rowSpanningState.caches.hiddenCellOriginMap, [rowSpanningState]);\n\n return {\n\n colspanMap,\n resetColSpan,\n getCellColSpanInfo,\n calculateColSpan,\n\n rowSpanningState,\n calculateRowSpan,\n resetRowSpan,\n getSpannedCells,\n getHiddenCells,\n getHiddenCellOriginMap\n };\n}\n\nfunction setCellColSpanInfo(\n map: ColspanMap,\n rowId: GridRowId,\n field: string,\n info: CellColSpanInfo\n) {\n let columnInfo = map.get(rowId);\n if (!columnInfo) {\n columnInfo = {};\n map.set(rowId, columnInfo);\n }\n columnInfo[field] = info;\n}\n","import { useEffect, useRef, useCallback } from 'react';\nimport { \n GridDataSource, \n GridRowModel, \n GridSortItem, \n GridFilterModel, \n GridPaginationModel,\n GridGetRowsParams,\n GridAggregationModel,\n GridAggregationResult,\n} from '../../types';\n\ninterface UseGridDataSourceParams<R extends GridRowModel> {\n dataSource?: GridDataSource<R>;\n sortModel: GridSortItem[];\n filterModel: GridFilterModel;\n paginationModel: GridPaginationModel;\n paginationMode?: 'client' | 'server' | 'infinite';\n sortingMode?: 'client' | 'server';\n filterMode?: 'client' | 'server';\n aggregationModel?: GridAggregationModel;\n setRows: (rows: R[] | ((prev: R[]) => R[]), preserveRowCount?: boolean) => void;\n setRowCount: (count: number) => void;\n setDataSourceLoading: (loading: boolean) => void;\n setDataSourceError: (error: unknown) => void;\n onAggregationResults?: (results: GridAggregationResult) => void;\n}\n\nexport function useGridDataSource<R extends GridRowModel>(params: UseGridDataSourceParams<R>) {\n const {\n dataSource,\n sortModel,\n filterModel,\n paginationModel,\n paginationMode,\n sortingMode,\n filterMode,\n aggregationModel,\n setRows,\n setRowCount,\n setDataSourceLoading,\n setDataSourceError,\n onAggregationResults,\n } = params;\n\n const prevParamsRef = useRef<{\n sortModel: GridSortItem[];\n filterModel: GridFilterModel;\n page: number;\n pageSize: number;\n } | null>(null);\n\n const activeRequestRef = useRef<number>(0);\n\n const fetchRows = useCallback(async () => {\n if (!dataSource) return;\n\n const requestId = ++activeRequestRef.current;\n\n setDataSourceLoading(true);\n setDataSourceError(null);\n\n const startRow = paginationModel.page * paginationModel.pageSize;\n const endRow = startRow + paginationModel.pageSize;\n\n const requestParams: GridGetRowsParams = {\n startRow,\n endRow,\n sortModel,\n filterModel,\n groupKeys: [], \n aggregationModel,\n };\n\n try {\n const response = await dataSource.getRows(requestParams);\n\n if (requestId !== activeRequestRef.current) {\n return;\n }\n\n let shouldAppend = false;\n\n if (paginationMode === 'infinite') {\n const prev = prevParamsRef.current;\n if (prev) {\n\n const sortChanged = JSON.stringify(prev.sortModel) !== JSON.stringify(sortModel);\n const filterChanged = JSON.stringify(prev.filterModel) !== JSON.stringify(filterModel);\n const pageSizeChanged = prev.pageSize !== paginationModel.pageSize;\n\n if (!sortChanged && !filterChanged && !pageSizeChanged && paginationModel.page > prev.page) {\n shouldAppend = true;\n }\n }\n }\n\n if (shouldAppend) {\n setRows((prevRows) => [...prevRows, ...response.rows], true);\n } else {\n setRows(response.rows, true);\n }\n\n if (response.aggregationResults && onAggregationResults) {\n onAggregationResults(response.aggregationResults);\n }\n\n if (response.rowCount !== undefined) {\n setRowCount(response.rowCount);\n } else if (paginationMode === 'infinite') {\n // rowCount is not required for infinite scroll — the grid uses appendRows\n }\n\n prevParamsRef.current = {\n sortModel,\n filterModel,\n page: paginationModel.page,\n pageSize: paginationModel.pageSize\n };\n\n } catch (error) {\n if (requestId === activeRequestRef.current) {\n setDataSourceError(error);\n console.error('Data Source Error:', error);\n }\n } finally {\n if (requestId === activeRequestRef.current) {\n setDataSourceLoading(false);\n }\n }\n }, [\n dataSource, \n paginationModel.page, \n paginationModel.pageSize, \n sortModel, \n filterModel,\n paginationMode,\n aggregationModel,\n onAggregationResults,\n setRows,\n setRowCount,\n setDataSourceLoading,\n setDataSourceError\n ]);\n\n useEffect(() => {\n const isServerSide = paginationMode === 'server' || paginationMode === 'infinite' || sortingMode === 'server' || filterMode === 'server';\n\n if (dataSource && isServerSide) {\n const timer = setTimeout(() => {\n fetchRows();\n }, 300);\n return () => clearTimeout(timer);\n }\n }, [fetchRows, dataSource, paginationMode, sortingMode, filterMode]);\n\n const fetchChildren = useCallback(async (_parentId: string | number, groupKeys: string[]) => {\n if (!dataSource) return;\n\n setDataSourceLoading(true);\n try {\n const response = await dataSource.getRows({\n startRow: 0,\n endRow: -1, \n sortModel,\n filterModel,\n groupKeys\n });\n\n if (response.rows.length > 0) {\n setRows((prevRows) => {\n\n const existingIds = new Set(prevRows.map(r => r.id));\n const newRows = response.rows.filter(r => !existingIds.has(r.id));\n return [...prevRows, ...newRows];\n });\n }\n } catch (error) {\n setDataSourceError(error);\n console.error('Failed to fetch children:', error);\n } finally {\n setDataSourceLoading(false);\n }\n }, [dataSource, sortModel, filterModel, setRows, setDataSourceLoading, setDataSourceError]);\n\n return {\n fetchRows,\n fetchChildren\n };\n}\n","\nimport { useMemo } from 'react';\nimport type { GridColDef, GridRowModel } from '../../types';\nimport type { GridPivotModel, GridPivotAggFn } from '../../types';\n\nconst SEP_COL = '\u0000';\nconst SEP_KEY = '\u001f';\n\nfunction aggregate(values: number[], fn: GridPivotAggFn): number | null {\n const nums = values.filter((v) => v != null && !isNaN(v));\n if (nums.length === 0) return null;\n switch (fn) {\n case 'sum': return nums.reduce((a, b) => a + b, 0);\n case 'avg': return nums.reduce((a, b) => a + b, 0) / nums.length;\n case 'count': return nums.length;\n case 'min': return Math.min(...nums);\n case 'max': return Math.max(...nums);\n }\n}\n\nfunction makeKey(row: GridRowModel, fields: string[]): string {\n return fields.map((f) => String(row[f] ?? '')).join(SEP_COL);\n}\n\nfunction cellKey(ck: string, field: string, aggFn: string, hasColFields: boolean): string {\n return hasColFields ? `${ck}${SEP_KEY}${field}${SEP_KEY}${aggFn}` : `${field}${SEP_KEY}${aggFn}`;\n}\n\nexport interface UsePivotReturn {\n pivotRows: GridRowModel[];\n pivotColumns: GridColDef[];\n colKeys: string[];\n isValid: boolean;\n}\n\nexport function usePivot(\n rawRows: GridRowModel[],\n rawCols: GridColDef[],\n model: GridPivotModel,\n enabled: boolean,\n): UsePivotReturn {\n return useMemo<UsePivotReturn>(() => {\n const empty: UsePivotReturn = { pivotRows: [], pivotColumns: [], colKeys: [], isValid: false };\n\n if (!enabled) return empty;\n\n const { rowFields, columnFields, valueFields } = model;\n if (rowFields.length === 0 || valueFields.length === 0) return empty;\n\n const hasColFields = columnFields.length > 0;\n const colDefMap = new Map(rawCols.map((c) => [c.field, c]));\n\n const colKeySet = new Set<string>();\n for (const row of rawRows) {\n colKeySet.add(makeKey(row, columnFields));\n }\n const colKeys = Array.from(colKeySet).sort();\n\n const outerMap = new Map<string, {\n labelValues: Record<string, unknown>;\n bucket: Map<string, Map<string, number[]>>;\n }>();\n\n for (const row of rawRows) {\n const rk = makeKey(row, rowFields);\n if (!outerMap.has(rk)) {\n const labelValues: Record<string, unknown> = {};\n for (const f of rowFields) labelValues[f] = row[f];\n outerMap.set(rk, { labelValues, bucket: new Map() });\n }\n const entry = outerMap.get(rk)!;\n\n const ck = makeKey(row, columnFields);\n if (!entry.bucket.has(ck)) entry.bucket.set(ck, new Map());\n const colBucket = entry.bucket.get(ck)!;\n\n for (const vf of valueFields) {\n const raw = row[vf.field];\n if (!colBucket.has(vf.field)) colBucket.set(vf.field, []);\n if (raw != null && !isNaN(Number(raw))) colBucket.get(vf.field)!.push(Number(raw));\n }\n }\n\n let rowIndex = 0;\n const pivotRows: GridRowModel[] = [];\n\n for (const [, entry] of outerMap) {\n const pivotRow: GridRowModel = { id: rowIndex++, ...entry.labelValues };\n\n for (const ck of colKeys) {\n const colBucket = entry.bucket.get(ck);\n for (const vf of valueFields) {\n const ck_ = cellKey(ck, vf.field, vf.aggFn, hasColFields);\n const values = colBucket?.get(vf.field) ?? [];\n pivotRow[ck_] = values.length > 0 ? aggregate(values, vf.aggFn) : null;\n }\n }\n\n pivotRows.push(pivotRow);\n }\n\n // ── Grand Total row ───────────────────────────────────────────────────\n // avg/min/max must be recomputed from raw source data — summing\n // per-row averages or mins produces wrong numbers.\n const gtBuckets = new Map<string, number[]>();\n for (const row of rawRows) {\n const ck = makeKey(row, columnFields);\n for (const vf of valueFields) {\n if (vf.aggFn !== 'avg' && vf.aggFn !== 'min' && vf.aggFn !== 'max') continue;\n const bk = `${ck}${SEP_KEY}${vf.field}`;\n if (!gtBuckets.has(bk)) gtBuckets.set(bk, []);\n const raw = row[vf.field];\n if (raw != null && !isNaN(Number(raw))) gtBuckets.get(bk)!.push(Number(raw));\n }\n }\n\n const totalRow: GridRowModel = { id: '__pivot_grand_total__' };\n for (let i = 0; i < rowFields.length; i++) {\n totalRow[rowFields[i]] = i === 0 ? 'Grand Total' : '';\n }\n for (const ck of colKeys) {\n for (const vf of valueFields) {\n const ck_ = cellKey(ck, vf.field, vf.aggFn, hasColFields);\n\n const cellValues = pivotRows\n .map(r => r[ck_])\n .filter(v => v != null && !isNaN(Number(v)))\n .map(Number);\n\n if (cellValues.length === 0) { totalRow[ck_] = null; continue; }\n\n const bk = `${ck}${SEP_KEY}${vf.field}`;\n switch (vf.aggFn) {\n case 'sum':\n case 'count':\n totalRow[ck_] = cellValues.reduce((a, b) => a + b, 0);\n break;\n case 'avg': {\n const raw = gtBuckets.get(bk) ?? [];\n totalRow[ck_] = raw.length > 0 ? raw.reduce((a, b) => a + b, 0) / raw.length : null;\n break;\n }\n case 'min':\n totalRow[ck_] = Math.min(...(gtBuckets.get(bk) ?? cellValues));\n break;\n case 'max':\n totalRow[ck_] = Math.max(...(gtBuckets.get(bk) ?? cellValues));\n break;\n }\n }\n }\n pivotRows.push(totalRow);\n\n\n const pivotColumns: GridColDef[] = [];\n\n for (const f of rowFields) {\n const orig = colDefMap.get(f);\n pivotColumns.push({\n field: f,\n headerName: orig?.headerName ?? f,\n width: orig?.width as number ?? 140,\n sortable: true,\n });\n }\n\n for (const ck of colKeys) {\n const colLabel = hasColFields\n ? ck.split(SEP_COL).map((v, i) => {\n const def = colDefMap.get(columnFields[i]);\n return def?.headerName ? `${def.headerName}: ${v}` : v;\n }).join(' / ')\n : '';\n\n for (const vf of valueFields) {\n const orig = colDefMap.get(vf.field);\n const ck_ = cellKey(ck, vf.field, vf.aggFn, hasColFields);\n const labelBase = vf.headerName ?? orig?.headerName ?? vf.field;\n const headerName = colLabel\n ? `${colLabel} — ${labelBase} (${vf.aggFn})`\n : `${labelBase} (${vf.aggFn})`;\n\n pivotColumns.push({\n field: ck_,\n headerName,\n width: 140,\n type: 'number',\n align: 'right',\n headerAlign: 'right',\n sortable: true,\n valueFormatter: ({ value }) => {\n if (value == null) return '—';\n const n = Number(value);\n if (vf.aggFn === 'avg') return n.toFixed(2);\n if (vf.aggFn === 'count') return n.toLocaleString();\n if (orig?.valueFormatter) return orig.valueFormatter({ value, row: {} as GridRowModel, field: vf.field });\n return n.toLocaleString();\n },\n });\n }\n }\n\n return { pivotRows, pivotColumns, colKeys, isValid: true };\n }, [rawRows, rawCols, model, enabled]);\n}\n","import { useEffect, useCallback } from 'react';\nimport type { GridColDef, GridRowModel, GridRowId } from '../../types';\n\ninterface UseGridClipboardProps {\n /** The currently selected row IDs — must come from the live selection source (not state.selection which is stale). */\n selectedRowIds: Set<GridRowId>;\n columns: GridColDef[];\n getVisibleRows: () => GridRowModel[];\n getRowId: (row: GridRowModel) => GridRowId;\n}\n\nfunction copyTextSynchronous(text: string): boolean {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.style.cssText = 'position:fixed;top:-9999px;left:-9999px;opacity:0;';\n document.body.appendChild(textarea);\n textarea.focus();\n textarea.select();\n let success = false;\n try {\n success = document.execCommand('copy');\n } finally {\n document.body.removeChild(textarea);\n }\n return success;\n}\n\n/**\n * Writes text to clipboard.\n * Uses both execCommand (synchronous, needed for non-HTTPS or non-async-gesture environments)\n * and navigator.clipboard for modern browser support.\n */\nasync function writeToClipboard(text: string): Promise<void> {\n let fallbackSuccess = false;\n try {\n fallbackSuccess = copyTextSynchronous(text);\n } catch {\n // Ignore fallback errors\n }\n\n if (navigator.clipboard && typeof navigator.clipboard.writeText === 'function') {\n try {\n await navigator.clipboard.writeText(text);\n return;\n } catch (e) {\n if (fallbackSuccess) return;\n throw e;\n }\n } else if (!fallbackSuccess) {\n throw new Error('Clipboard API not available and fallback failed.');\n }\n}\n\n/**\n * Hook to handle clipboard operations.\n * Copies selected rows as Tab-Separated Values (TSV) on Ctrl+C / Cmd+C.\n * Also exposes `copySelectedRows` for programmatic use via apiRef.\n */\nexport function useGridClipboard(props: UseGridClipboardProps) {\n const { selectedRowIds, columns, getVisibleRows, getRowId } = props;\n\n const copySelectedRows = useCallback(async () => {\n\n if (selectedRowIds.size === 0) return;\n\n const visibleRows = getVisibleRows();\n const rowsToCopy = visibleRows.filter((row) => selectedRowIds.has(getRowId(row)));\n\n\n\n if (rowsToCopy.length === 0) return;\n\n // Exclude internal grid columns (checkbox, expand, reorder)\n const visibleColumns = columns.filter((col) => !col.field.startsWith('__'));\n\n // Header row\n const headerRow = visibleColumns\n .map((col) => col.headerName || col.field)\n .join('\\t');\n\n // Data rows\n const dataRows = rowsToCopy\n .map((row) =>\n visibleColumns\n .map((col) => {\n const value = row[col.field];\n if (col.valueFormatter) {\n return col.valueFormatter({ value, row, field: col.field });\n }\n return value ?? '';\n })\n .join('\\t')\n )\n .join('\\n');\n\n const fullContent = `${headerRow}\\n${dataRows}`;\n\n try {\n await writeToClipboard(fullContent);\n\n } catch (err) {\n console.error('[OpenGridX] Failed to copy to clipboard:', err);\n }\n }, [selectedRowIds, columns, getVisibleRows, getRowId]);\n\n // Keyboard shortcut: Ctrl+C / Cmd+C\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (!(event.ctrlKey || event.metaKey) || event.key !== 'c') return;\n\n // Don't intercept when user is typing in an input / editor\n const activeEl = document.activeElement as HTMLElement;\n const tag = activeEl?.tagName.toLowerCase();\n const type = (activeEl as HTMLInputElement)?.type;\n\n // Skip capturing Ctrl+C if we are genuinely inside a text input\n if (\n (tag === 'input' && type !== 'checkbox' && type !== 'radio') ||\n tag === 'textarea' ||\n tag === 'select'\n ) return;\n\n if (activeEl?.isContentEditable) return;\n\n copySelectedRows();\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [copySelectedRows]);\n\n return { copySelectedRows };\n}\n","import React from 'react';\nimport type { GridColDef, GridRowModel, GridRowId, GridListViewColDef, GridRenderCellParams } from '../../types';\n\nexport interface ListViewRowProps<R extends GridRowModel = GridRowModel> {\n row: R;\n rowIndex: number;\n listViewColumn: GridListViewColDef<R>;\n isSelected?: boolean;\n checkboxSelection?: boolean;\n rowHeight?: number;\n onRowClick?: (row: R) => void;\n onRowDoubleClick?: (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 onRowDoubleClick,\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 onDoubleClick={onRowDoubleClick ? () => onRowDoubleClick(row) : undefined}\n role=\"row\"\n aria-rowindex={rowIndex + 2}\n aria-selected={isSelected}\n >\n {checkboxSelection && (\n <div className=\"ogx-list-view__checkbox\" onClick={(e) => e.stopPropagation()}>\n <input\n type=\"checkbox\"\n checked={isSelected}\n onChange={handleCheckboxChange}\n aria-label={`Select row ${row.id}`}\n />\n </div>\n )}\n <div className=\"ogx-list-view__cell\" role=\"gridcell\">\n {listViewColumn.renderCell(params)}\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport { Pagination } from '../Pagination/Pagination';\nimport { ListViewRow } from '../ListView/ListViewRow';\nimport type {\n GridRowModel,\n GridRowId,\n GridRowParams,\n GridListViewColDef,\n GridPaginationModel,\n GridDataSource,\n GridLocaleText,\n} from '../../types';\n\nexport interface GridListViewProps<R extends GridRowModel> {\n ariaLabel?: string;\n allRenderableRows: R[];\n filteredRows: R[];\n pagination: boolean;\n effectivePaginationModel: GridPaginationModel;\n pageSizeOptions: number[];\n selectedRowIds: Set<GridRowId>;\n listViewColumn: GridListViewColDef<R>;\n noRowsLabel: string;\n rowHeight: number;\n checkboxSelection: boolean;\n paginationMode: 'client' | 'server' | 'infinite';\n dataSource?: GridDataSource<R>;\n serverRowCount: number;\n paginationSlot?: React.ComponentType<Record<string, unknown>>;\n paginationSlotProps?: Record<string, unknown>;\n localeText?: Pick<GridLocaleText, 'paginationRowsPerPage' | 'paginationOf' | 'paginationPage'>;\n onRowClick: (params: GridRowParams<R>) => void;\n onRowDoubleClick?: (params: GridRowParams<R>) => void;\n onSelectionChange: (rowId: GridRowId, isSelected: boolean) => void;\n onPaginationModelChange: (model: GridPaginationModel) => void;\n}\n\nexport function GridListView<R extends GridRowModel>({\n ariaLabel,\n allRenderableRows,\n filteredRows,\n pagination,\n effectivePaginationModel,\n pageSizeOptions,\n selectedRowIds,\n listViewColumn,\n noRowsLabel,\n rowHeight,\n checkboxSelection,\n paginationMode,\n dataSource,\n serverRowCount,\n paginationSlot,\n paginationSlotProps,\n localeText,\n onRowClick,\n onRowDoubleClick,\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 onRowDoubleClick={onRowDoubleClick ? (r) => onRowDoubleClick({ row: r, id: r.id, rowIndex: idx }) : undefined}\n onSelectionChange={onSelectionChange}\n />\n ))\n )}\n </div>\n\n {pagination && (\n <PaginationComponent\n page={effectivePaginationModel.page}\n pageSize={effectivePaginationModel.pageSize}\n rowCount={totalRowCount}\n pageSizeOptions={pageSizeOptions}\n onPageChange={(newPage: number) => onPaginationModelChange({ ...effectivePaginationModel, page: newPage })}\n onPageSizeChange={(newPageSize: number) => onPaginationModelChange({ ...effectivePaginationModel, pageSize: newPageSize, page: 0 })}\n localeText={localeText}\n {...paginationSlotProps}\n />\n )}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport type { GridRenderCellParams } from '../../types';\n\nexport interface GridEditInputCellProps extends GridRenderCellParams {\n onValueChange: (value: unknown) => void;\n onCommit: () => void;\n onCancel: () => void;\n}\n\n// ─── Text / String ────────────────────────────────────────────────────────────\nfunction TextEditor({ value, onValueChange, onCommit, onCancel }: GridEditInputCellProps) {\n const [local, setLocal] = useState(String(value ?? ''));\n const ref = useRef<HTMLInputElement>(null);\n useEffect(() => { ref.current?.focus(); ref.current?.select(); }, []);\n\n return (\n <input\n ref={ref}\n type=\"text\"\n className=\"ogx__edit-input\"\n value={local}\n onChange={e => { setLocal(e.target.value); onValueChange(e.target.value); }}\n onBlur={onCommit}\n onKeyDown={e => {\n if (e.key === 'Enter') { e.stopPropagation(); onCommit(); }\n if (e.key === 'Escape') { e.stopPropagation(); onCancel(); }\n }}\n />\n );\n}\n\n// ─── Number ───────────────────────────────────────────────────────────────────\nfunction NumberEditor({ value, onValueChange, onCommit, onCancel }: GridEditInputCellProps) {\n const [local, setLocal] = useState<string | number>(typeof value === 'number' ? value : '');\n const ref = useRef<HTMLInputElement>(null);\n useEffect(() => { ref.current?.focus(); ref.current?.select(); }, []);\n\n return (\n <input\n ref={ref}\n type=\"number\"\n className=\"ogx__edit-input ogx__edit-input--number\"\n value={local}\n onChange={e => {\n const v = e.target.value === '' ? '' : Number(e.target.value);\n setLocal(v);\n onValueChange(v === '' ? null : v);\n }}\n onBlur={onCommit}\n onKeyDown={e => {\n if (e.key === 'Enter') { e.stopPropagation(); onCommit(); }\n if (e.key === 'Escape') { e.stopPropagation(); onCancel(); }\n }}\n />\n );\n}\n\n// ─── Boolean ──────────────────────────────────────────────────────────────────\nfunction BooleanEditor({ value, onValueChange, onCommit, onCancel }: GridEditInputCellProps) {\n const ref = useRef<HTMLInputElement>(null);\n useEffect(() => { ref.current?.focus(); }, []);\n\n const handleChange = () => {\n const next = !value;\n onValueChange(next);\n // Commit immediately on toggle\n setTimeout(onCommit, 0);\n };\n\n return (\n <div className=\"ogx__edit-boolean\">\n <input\n ref={ref}\n type=\"checkbox\"\n className=\"ogx__edit-checkbox\"\n checked={!!value}\n onChange={handleChange}\n onKeyDown={e => {\n if (e.key === 'Escape') { e.stopPropagation(); onCancel(); }\n }}\n />\n </div>\n );\n}\n\n// ─── SingleSelect / Enum ──────────────────────────────────────────────────────\nfunction SelectEditor({ value, colDef, onValueChange, onCommit, onCancel }: GridEditInputCellProps) {\n const ref = useRef<HTMLSelectElement>(null);\n useEffect(() => { ref.current?.focus(); }, []);\n\n const options = colDef.valueOptions ?? [];\n\n return (\n <select\n ref={ref}\n className=\"ogx__edit-select\"\n value={String(value ?? '')}\n onChange={e => { onValueChange(e.target.value); }}\n onBlur={onCommit}\n onKeyDown={e => {\n if (e.key === 'Enter') { e.stopPropagation(); onCommit(); }\n if (e.key === 'Escape') { e.stopPropagation(); onCancel(); }\n }}\n >\n {options.map(opt => {\n const v = typeof opt === 'object' ? opt.value : opt;\n const l = typeof opt === 'object' ? opt.label : String(opt);\n return <option key={String(v)} value={String(v)}>{l}</option>;\n })}\n </select>\n );\n}\n\n// ─── Date ─────────────────────────────────────────────────────────────────────\nfunction DateEditor({ value, onValueChange, onCommit, onCancel }: GridEditInputCellProps) {\n const [local, setLocal] = useState<string>(typeof value === 'string' ? value : String(value ?? ''));\n const ref = useRef<HTMLInputElement>(null);\n useEffect(() => { ref.current?.focus(); }, []);\n\n return (\n <input\n ref={ref}\n type=\"date\"\n className=\"ogx__edit-input\"\n value={local}\n onChange={e => { setLocal(e.target.value); onValueChange(e.target.value); }}\n onBlur={onCommit}\n onKeyDown={e => {\n if (e.key === 'Enter') { e.stopPropagation(); onCommit(); }\n if (e.key === 'Escape') { e.stopPropagation(); onCancel(); }\n }}\n />\n );\n}\n\n// ─── Router ───────────────────────────────────────────────────────────────────\nexport function GridEditInputCell(props: GridEditInputCellProps) {\n const { colDef } = props;\n\n switch (colDef.type) {\n case 'number':\n return <div className=\"ogx__edit-cell\"><NumberEditor {...props} /></div>;\n case 'boolean':\n return <div className=\"ogx__edit-cell\"><BooleanEditor {...props} /></div>;\n case 'singleSelect':\n return <div className=\"ogx__edit-cell\"><SelectEditor {...props} /></div>;\n case 'date':\n return <div className=\"ogx__edit-cell\"><DateEditor {...props} /></div>;\n default:\n return <div className=\"ogx__edit-cell\"><TextEditor {...props} /></div>;\n }\n}\n","import React from 'react';\n\n// Must live at module scope (not inline) so React sees a stable component type.\n// Calling renderFn() here puts the throw one level BELOW CellErrorBoundary,\n// which is required — a component cannot catch errors thrown in its own render().\nfunction CellRenderTarget({ renderFn }: { renderFn: () => React.ReactNode }) {\n return <>{renderFn()}</>;\n}\n\ninterface CellErrorBoundaryProps {\n renderFn: () => React.ReactNode;\n field: string;\n resetKey?: unknown;\n}\n\ninterface CellErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n resetKey?: unknown;\n}\n\nexport class CellErrorBoundary extends React.Component<CellErrorBoundaryProps, CellErrorBoundaryState> {\n constructor(props: CellErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null, resetKey: props.resetKey };\n }\n\n static getDerivedStateFromProps(\n props: CellErrorBoundaryProps,\n state: CellErrorBoundaryState\n ): Partial<CellErrorBoundaryState> | null {\n if (state.hasError && props.resetKey !== state.resetKey) {\n return { hasError: false, error: null, resetKey: props.resetKey };\n }\n if (props.resetKey !== state.resetKey) {\n return { resetKey: props.resetKey };\n }\n return null;\n }\n\n static getDerivedStateFromError(error: Error): Partial<CellErrorBoundaryState> {\n return { hasError: true, error };\n }\n\n override componentDidCatch(error: Error, info: React.ErrorInfo) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(`[CellErrorBoundary] field=\"${this.props.field}\"`, error, info.componentStack);\n }\n }\n\n override render() {\n if (this.state.hasError) {\n return (\n <div\n className=\"ogx__cell-error\"\n role=\"status\"\n aria-label={`Error in cell: ${this.props.field}`}\n title={this.state.error?.message ?? 'Render error'}\n >\n ⚠\n </div>\n );\n }\n return <CellRenderTarget renderFn={this.props.renderFn} />;\n }\n}\n","\nimport React from 'react';\nimport type { GridColDef, GridRowModel, GridPinnedPosition, GridCellParams, GridRowMeta } from '../../types';\nimport type { CellColSpanInfo } from '../../hooks/features/useGridSpanning';\n\nimport { GridEditInputCell } from './GridEditInputCell';\nimport { CellErrorBoundary } from './CellErrorBoundary';\n\nexport interface CellProps<R extends GridRowModel = GridRowModel> {\n onCellClick?: (params: GridCellParams<R>) => void;\n onCellEditStart?: (field: string, value: unknown) => void;\n onCellValueChange?: (field: string, newValue: unknown) => void;\n value: unknown;\n row: R;\n colDef: GridColDef<R>;\n rowIndex: number;\n colIndex: number;\n isSelected?: boolean;\n onClick?: (event: React.MouseEvent) => void;\n width?: number;\n pinnedPosition?: GridPinnedPosition | null;\n pinnedOffset?: number;\n\n isFocused?: boolean;\n isFocusVisible?: boolean;\n\n isEditable?: boolean;\n isEditing?: boolean;\n onEditStart?: () => void;\n onEditStop?: (cancel?: boolean) => void;\n onValueChange?: (newValue: unknown) => void;\n\n colSpanInfo?: CellColSpanInfo;\n rowSpan?: number;\n isHiddenByRowSpan?: boolean;\n rowMeta?: GridRowMeta;\n}\n\nfunction CellImpl<R extends GridRowModel = GridRowModel>(props: CellProps<R>) {\n const {\n onCellClick,\n onCellEditStart,\n onCellValueChange,\n value,\n row,\n colDef,\n rowIndex,\n colIndex,\n isSelected,\n onClick,\n width,\n pinnedPosition,\n pinnedOffset,\n isFocused,\n isFocusVisible,\n isEditable,\n isEditing,\n onEditStart,\n onEditStop,\n onValueChange,\n\n colSpanInfo,\n rowSpan: rowSpanProp,\n isHiddenByRowSpan,\n rowMeta\n } = props;\n\n // All hooks must come before any early returns (Rules of Hooks)\n const handleValueChange = React.useCallback((newValue: unknown) => {\n if (onCellValueChange) {\n onCellValueChange(colDef.field, newValue);\n } else {\n onValueChange?.(newValue);\n }\n }, [onCellValueChange, onValueChange, colDef.field]);\n\n const formattedValue = React.useMemo(() => {\n if (colDef.valueFormatter) {\n return colDef.valueFormatter({\n value,\n row,\n field: colDef.field\n });\n }\n\n if (value === null || value === undefined) {\n return '';\n }\n\n return String(value);\n }, [value, row, colDef]);\n\n const resolvedCellClassName = React.useMemo(() => {\n if (!colDef.cellClassName) return '';\n if (typeof colDef.cellClassName === 'function') {\n return colDef.cellClassName({ value, row, field: colDef.field, colDef, rowIndex, colIndex }) || '';\n }\n return colDef.cellClassName;\n }, [colDef, value, row, rowIndex, colIndex]);\n\n const cellRef = React.useRef<HTMLDivElement>(null);\n\n React.useLayoutEffect(() => {\n if (isFocused && cellRef.current) {\n cellRef.current.focus({ preventScroll: true });\n }\n }, [isFocused]);\n\n if (colSpanInfo?.spannedByColSpan) {\n return null;\n }\n\n if (isHiddenByRowSpan) {\n return (\n <div\n className=\"ogx__cell ogx__cell--hidden\"\n style={{ width: width ?? colDef.width ?? 100 }}\n role=\"presentation\"\n data-field={colDef.field}\n data-colindex={colIndex}\n />\n );\n }\n\n const handleClick = (e: React.MouseEvent) => {\n if (onCellClick) {\n onCellClick({\n row,\n field: colDef.field,\n value,\n colDef,\n rowIndex,\n colIndex\n });\n }\n onClick?.(e);\n };\n\n const handleDoubleClick = (e: React.MouseEvent) => {\n if (isEditable && (onEditStart || onCellEditStart)) {\n e.stopPropagation();\n if (onCellEditStart) {\n onCellEditStart(colDef.field, value);\n } else {\n onEditStart?.();\n }\n }\n };\n\n const isPinned = pinnedPosition !== null && pinnedPosition !== undefined;\n\n const classNames = [\n 'ogx__cell',\n `ogx__cell--align-${colDef.align || 'left'}`,\n isSelected && 'ogx__cell--selected',\n isFocused && 'ogx__cell--focused',\n (isFocused && isFocusVisible) && 'ogx__cell--focus-visible',\n colDef.type && `ogx__cell--type-${colDef.type}`,\n isPinned && 'ogx__cell--pinned',\n isPinned && `ogx__cell--pinned-${pinnedPosition}`,\n isEditing && 'ogx__cell--editing',\n (rowSpanProp && rowSpanProp > 1) && 'ogx__cell--spanned',\n resolvedCellClassName\n ].filter(Boolean).join(' ');\n\n const colSpan = colSpanInfo?.cellProps?.colSpan || 1;\n const rowSpan = rowSpanProp || 1;\n const cellWidth = colSpanInfo?.cellProps?.width ?? width ?? colDef.width ?? 100;\n\n const style: React.CSSProperties = {\n width: 'var(--width)',\n '--width': typeof cellWidth === 'number' ? `${cellWidth}px` : cellWidth,\n flexGrow: colDef.flex ?? 0,\n flexShrink: 0,\n flexBasis: colDef.flex ? 'auto' : 'auto',\n boxSizing: 'border-box',\n minWidth: colDef.minWidth,\n maxWidth: colDef.maxWidth,\n position: isPinned ? 'sticky' : undefined,\n zIndex: colDef.zIndex ?? (isPinned ? 3 : undefined),\n padding: isEditing ? 0 : undefined\n } as React.CSSProperties;\n\n if (rowSpan > 1) {\n style.height = `calc(var(--height) * ${rowSpan} - var(--border-width, 1px))`;\n style.zIndex = 10;\n if (isPinned) {\n style.zIndex = 40;\n }\n }\n\n if (isPinned && pinnedOffset !== undefined) {\n if (pinnedPosition === 'left') {\n style.left = pinnedOffset;\n } else {\n style.right = pinnedOffset;\n }\n }\n\n return (\n <div\n ref={cellRef}\n className={classNames}\n style={style}\n onClick={handleClick}\n onDoubleClick={handleDoubleClick}\n role=\"gridcell\"\n aria-colindex={colIndex + 1}\n aria-readonly={!isEditable || undefined}\n tabIndex={-1}\n data-field={colDef.field}\n data-colindex={colIndex}\n {...(colSpan > 1 ? { 'aria-colspan': colSpan } : {})}\n {...(rowSpan > 1 ? { 'aria-rowspan': rowSpan } : {})}\n >\n <div className=\"ogx__cell-content\">\n {isEditing && (onCellValueChange || onValueChange) && onEditStop ? (\n colDef.renderEditCell ? (\n colDef.renderEditCell({\n value,\n row,\n field: colDef.field,\n colDef,\n rowIndex,\n colIndex,\n rowMeta,\n })\n ) : (\n <GridEditInputCell\n value={value}\n row={row}\n field={colDef.field}\n colDef={colDef as unknown as GridColDef}\n rowIndex={rowIndex}\n colIndex={colIndex}\n onValueChange={handleValueChange}\n onCommit={() => onEditStop()}\n onCancel={() => onEditStop(true)}\n />\n )\n ) : colDef.renderCell ? (\n <CellErrorBoundary\n field={colDef.field}\n resetKey={row}\n renderFn={() => colDef.renderCell!({\n value,\n formattedValue,\n row,\n field: colDef.field,\n colDef,\n rowIndex,\n colIndex,\n rowMeta,\n })}\n />\n ) : (\n formattedValue\n )}\n </div>\n </div>\n );\n}\n\nexport const Cell = React.memo(CellImpl) as typeof CellImpl;\n","import React from 'react';\n\nexport type DragHandleIconProps = React.ButtonHTMLAttributes<HTMLButtonElement>;\n\nexport const DragHandleIcon: React.FC<DragHandleIconProps> = ({ className = '', ...props }) => {\n return (\n <button\n type=\"button\"\n className={`ogx-drag-handle ${className}`}\n aria-label=\"Drag to reorder row\"\n {...props}\n >\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M11 18c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2zm-2-8c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm6 4c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\" />\n </svg>\n </button>\n );\n};\n","\nimport React from 'react';\nimport type { GridRowModel, GridRowId, GridDetailPanelHeight } from '../../types';\n\n\nexport interface DetailPanelProps<R extends GridRowModel = GridRowModel> {\n row: R;\n rowId: GridRowId;\n rowIndex: number;\n content: React.ReactNode;\n height: GridDetailPanelHeight;\n isExpanded: boolean;\n}\n\nexport function DetailPanel<R extends GridRowModel = GridRowModel>(props: DetailPanelProps<R>) {\n const { content, height, isExpanded } = props;\n\n if (!isExpanded) {\n return null;\n }\n\n const style: React.CSSProperties = {\n height: height === 'auto' ? 'auto' : `${height}px`,\n overflow: height === 'auto' ? 'visible' : 'auto'\n };\n\n return (\n <div className=\"ogx__detail-panel\" style={style}>\n <div className=\"ogx__detail-panel-content\">\n {content}\n </div>\n </div>\n );\n}\n","\nimport React, { useId } from 'react';\nimport { Cell } from '../Cell/Cell';\nimport { Checkbox } from '../ui/Checkbox';\nimport { ExpandIcon } from '../ui/ExpandIcon';\nimport { DragHandleIcon } from '../ui/DragHandleIcon';\nimport { DetailPanel } from '../DetailPanel/DetailPanel';\nimport type { GridRowModel, GridColDef, GridRowId, GridColumnPinning, GridRowPinning, GridRowParams, GridCellParams, GridDetailPanelHeight, GridRowMeta } from '../../types';\nimport type { CellColSpanInfo, RowSpanningCaches } from '../../hooks/features/useGridSpanning';\nimport { isColumnPinned, calculatePinnedPositions, isRowPinned } from '../../utils/pinning';\n\n\nexport interface RowProps<R extends GridRowModel = GridRowModel> {\n row: R;\n columns: GridColDef<R>[];\n rowIndex: number;\n isSelected?: boolean;\n checkboxSelection?: boolean;\n onRowClick?: (params: GridRowParams<R>) => void;\n onRowDoubleClick?: (params: GridRowParams<R>) => void;\n onCellClick?: (params: GridCellParams<R>) => void;\n onSelectionChange?: (rowId: GridRowId, isSelected: boolean) => void;\n columnWidths?: Record<string, number>;\n pinnedColumns?: GridColumnPinning;\n pinnedRows?: GridRowPinning;\n\n hasDetailPanel?: boolean;\n isDetailPanelExpanded?: boolean;\n onDetailPanelToggle?: (rowId: GridRowId) => void;\n detailPanelContent?: React.ReactNode;\n detailPanelHeight?: GridDetailPanelHeight;\n\n pinCheckboxColumn?: boolean;\n pinExpandColumn?: boolean;\n\n rowReordering?: boolean;\n onDragStart?: (id: GridRowId) => (event: React.DragEvent) => void;\n onDragOver?: (id: GridRowId) => (event: React.DragEvent) => void;\n onDragEnd?: () => void;\n onDrop?: (targetId: GridRowId) => (event: React.DragEvent) => void;\n isDragging?: boolean;\n isDragOver?: boolean;\n\n editingCell?: { id: GridRowId; field: string; value: unknown; } | null;\n onEditStart?: (params: { id: GridRowId, field: string, value: unknown }) => void;\n onEditStop?: (params?: { cancel?: boolean }) => void;\n onEditCellValueChange?: (params: { id: GridRowId, field: string, value: unknown }) => void;\n\n focusedCellField?: string | null;\n isFocusVisible?: boolean;\n\n colspanMap?: Map<GridRowId, Record<string, CellColSpanInfo>>;\n rowSpanningCaches?: RowSpanningCaches;\n rowHeight?: number;\n rowMeta?: GridRowMeta;\n}\n\nexport function Row<R extends GridRowModel = GridRowModel>(props: RowProps<R>) {\n const {\n row,\n columns,\n rowIndex,\n isSelected = false,\n checkboxSelection = false,\n onRowClick,\n onRowDoubleClick,\n onCellClick,\n onSelectionChange,\n columnWidths = {},\n pinnedColumns,\n pinnedRows,\n hasDetailPanel = false,\n isDetailPanelExpanded = false,\n onDetailPanelToggle,\n detailPanelContent,\n detailPanelHeight = 200,\n pinCheckboxColumn = true,\n pinExpandColumn = true,\n rowReordering = false,\n onDragStart,\n onDragOver,\n onDragEnd,\n onDrop,\n isDragging,\n isDragOver,\n\n editingCell,\n onEditStart,\n onEditStop,\n onEditCellValueChange,\n\n focusedCellField,\n isFocusVisible,\n\n colspanMap,\n rowSpanningCaches,\n rowHeight = 52,\n rowMeta\n } = props;\n\n const checkboxId = useId();\n const expandCellRef = React.useRef<HTMLDivElement>(null);\n const checkboxCellRef = React.useRef<HTMLDivElement>(null);\n\n // All hooks must come before any early returns (Rules of Hooks)\n React.useLayoutEffect(() => {\n if (focusedCellField === '__expand_col__' && expandCellRef.current) {\n expandCellRef.current.focus({ preventScroll: true });\n }\n if (focusedCellField === '__checkbox_col__' && checkboxCellRef.current) {\n checkboxCellRef.current.focus({ preventScroll: true });\n }\n }, [focusedCellField]);\n\n const pinnedPositions = React.useMemo(() => {\n return calculatePinnedPositions(\n columns,\n columnWidths,\n pinnedColumns,\n checkboxSelection,\n pinCheckboxColumn,\n hasDetailPanel,\n pinExpandColumn,\n rowReordering\n );\n }, [columns, columnWidths, pinnedColumns, checkboxSelection, pinCheckboxColumn, hasDetailPanel, pinExpandColumn, rowReordering]);\n\n const isGroupRow = rowMeta?.hasChildren === true;\n\n const handleCellEditStart = React.useCallback((field: string, value: unknown) => {\n if (!isGroupRow) {\n onEditStart?.({ id: row.id, field, value });\n }\n }, [isGroupRow, row.id, onEditStart]);\n\n const handleCellValueChange = React.useCallback((field: string, newValue: unknown) => {\n onEditCellValueChange?.({ id: row.id, field, value: newValue });\n }, [onEditCellValueChange, row.id]);\n\n const handleEditStopWrapper = React.useCallback((cancel?: boolean) => {\n onEditStop?.({ cancel });\n }, [onEditStop]);\n\n // ── Skeleton row (shown during infinite-scroll fetch) ─────────────────────\n if (row._isSkeleton) {\n // Render shimmer placeholders — one per visible column, matching row height\n const cellCount = Math.max(columns.length, 5);\n return (\n <div\n className=\"ogx__row ogx__row--skeleton\"\n role=\"row\"\n aria-hidden=\"true\"\n style={{ height: rowHeight, minHeight: rowHeight }}\n >\n {Array.from({ length: cellCount }).map((_, i) => (\n <div key={i} className=\"ogx__skeleton-cell\">\n <div className=\"ogx__skeleton-bar\" />\n </div>\n ))}\n </div>\n );\n }\n\n const handleRowClick = (event: React.MouseEvent) => {\n\n if ((event.target as HTMLElement).closest('.ogx-checkbox-wrapper, .ogx-expand-icon, .ogx-drag-handle, .ogx__edit-cell')) {\n return;\n }\n onRowClick?.({ row, id: row.id, rowIndex });\n };\n\n const handleRowDoubleClick = (event: React.MouseEvent) => {\n if ((event.target as HTMLElement).closest('.ogx-checkbox-wrapper, .ogx-expand-icon, .ogx-drag-handle, .ogx__edit-cell')) {\n return;\n }\n onRowDoubleClick?.({ 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 onDoubleClick={onRowDoubleClick ? handleRowDoubleClick : undefined}\n role=\"row\"\n aria-rowindex={rowIndex + 1}\n aria-selected={isSelected}\n data-rowindex={rowIndex}\n onDragOver={onDragOver ? onDragOver(row.id) : undefined}\n onDrop={onDrop ? onDrop(row.id) : undefined}\n style={{\n maxHeight: `${rowHeight}px`,\n minHeight: `${rowHeight}px`,\n '--height': `${rowHeight}px`,\n '--border-width': '1px'\n } as React.CSSProperties}\n >\n { }\n {rowReordering && (\n <div\n className=\"ogx__cell ogx__cell--drag-handle\"\n role=\"gridcell\"\n aria-label=\"Drag to reorder row\"\n style={{\n position: 'sticky',\n left: 0,\n zIndex: 4\n }}\n draggable={true}\n onDragStart={onDragStart ? onDragStart(row.id) : undefined}\n onDragEnd={onDragEnd}\n onClick={(e) => e.stopPropagation()}\n >\n <DragHandleIcon />\n </div>\n )}\n\n { }\n {hasDetailPanel && (\n <div\n className={`ogx__cell ogx__cell--expand ${pinExpandColumn ? 'ogx__cell--pinned-left' : ''\n } ${focusedCellField === '__expand_col__' ? 'ogx__cell--focused' : ''} ${(focusedCellField === '__expand_col__' && isFocusVisible) ? 'ogx__cell--focus-visible' : ''\n }`}\n role=\"gridcell\"\n aria-label={isDetailPanelExpanded ? 'Collapse row details' : 'Expand row details'}\n aria-expanded={isDetailPanelExpanded}\n style={{\n position: pinExpandColumn ? 'sticky' : undefined,\n left: pinExpandColumn ? (rowReordering ? 48 : 0) : undefined,\n zIndex: pinExpandColumn ? 5 : undefined\n }}\n ref={expandCellRef}\n tabIndex={-1}\n onClick={(e) => {\n e.stopPropagation();\n onCellClick?.({\n row,\n field: '__expand_col__',\n value: isDetailPanelExpanded,\n colDef: { field: '__expand_col__', width: 48 } as unknown as GridColDef<R>,\n rowIndex,\n colIndex: -1\n });\n }}\n >\n <ExpandIcon\n isExpanded={isDetailPanelExpanded}\n onClick={handleDetailPanelToggle}\n variant=\"plus-minus\"\n />\n </div>\n )}\n\n { }\n {checkboxSelection && (\n <div\n className={`ogx__cell ogx__cell--checkbox ${pinCheckboxColumn ? 'ogx__cell--pinned-left' : ''\n } ${focusedCellField === '__checkbox_col__' ? 'ogx__cell--focused' : ''} ${(focusedCellField === '__checkbox_col__' && isFocusVisible) ? 'ogx__cell--focus-visible' : ''\n }`}\n role=\"gridcell\"\n style={{\n position: pinCheckboxColumn ? 'sticky' : undefined,\n left: pinCheckboxColumn ? ((rowReordering ? 48 : 0) + (hasDetailPanel && pinExpandColumn ? 48 : 0)) : undefined,\n zIndex: pinCheckboxColumn ? 11 : undefined\n }}\n ref={checkboxCellRef}\n tabIndex={-1}\n onClick={(e) => {\n e.stopPropagation();\n onCellClick?.({\n row,\n field: '__checkbox_col__',\n value: isSelected,\n colDef: { field: '__checkbox_col__', width: 48 } as unknown as GridColDef<R>,\n rowIndex,\n colIndex: -1\n });\n }}\n >\n <Checkbox\n id={checkboxId}\n name={`ogx-select-row-${row.id}`}\n checked={isSelected}\n onChange={handleCheckboxChange}\n onClick={(e) => e.stopPropagation()}\n aria-label={isSelected ? `Deselect row ${row.id}` : `Select row ${row.id}`}\n tabIndex={-1}\n onMouseDown={(e) => e.preventDefault()}\n />\n </div>\n )}\n\n { }\n {columns.map((colDef, colIndex) => {\n if (colDef.isSpacer) {\n return (\n <div\n key={colDef.field}\n style={{ width: colDef.width, minWidth: colDef.width, flexShrink: 0 }}\n aria-hidden=\"true\"\n />\n );\n }\n const value = colDef.valueGetter\n ? colDef.valueGetter({ row, field: colDef.field, value: row[colDef.field] })\n : row[colDef.field];\n\n const effectiveWidth = columnWidths[colDef.field] ?? colDef.width;\n\n const pinnedPosition = isColumnPinned(colDef.field, pinnedColumns);\n const pinnedOffset = pinnedPosition ? pinnedPositions[colDef.field] : undefined;\n\n const isEditing = editingCell?.id === row.id && editingCell?.field === colDef.field;\n\n const cellValue = isEditing ? editingCell?.value : value;\n\n const colSpanInfo = colspanMap?.get(row.id)?.[colDef.field];\n const rowSpan = rowSpanningCaches?.spannedCells[row.id]?.[colDef.field];\n const isHiddenByRowSpan = rowSpanningCaches?.hiddenCells[row.id]?.[colDef.field] || false;\n\n return (\n <Cell\n key={colDef.field}\n value={cellValue}\n row={row}\n colDef={colDef}\n rowIndex={rowIndex}\n colIndex={colIndex}\n isSelected={isSelected}\n onCellClick={onCellClick}\n width={effectiveWidth}\n pinnedPosition={pinnedPosition}\n pinnedOffset={pinnedOffset}\n\n isFocused={focusedCellField === colDef.field}\n isFocusVisible={isFocusVisible}\n\n isEditable={colDef.editable}\n isEditing={isEditing}\n onCellEditStart={handleCellEditStart}\n onEditStop={handleEditStopWrapper}\n onCellValueChange={handleCellValueChange}\n\n colSpanInfo={colSpanInfo}\n rowSpan={rowSpan}\n isHiddenByRowSpan={isHiddenByRowSpan}\n rowMeta={rowMeta}\n />\n );\n })}\n </div>\n\n { }\n {hasDetailPanel && (\n <DetailPanel\n row={row}\n rowId={row.id}\n rowIndex={rowIndex}\n content={detailPanelContent}\n height={detailPanelHeight}\n isExpanded={isDetailPanelExpanded}\n />\n )}\n </>\n );\n}\n","import React from 'react';\nimport { Row } from '../Row/Row';\nimport type {\n GridRowModel,\n GridRowId,\n GridColDef,\n GridRowParams,\n GridCellParams,\n GridColumnPinning,\n GridRowPinning,\n GridDetailPanelParams,\n GridDetailPanelHeight,\n GridRowMeta,\n} from '../../types';\nimport type { CellColSpanInfo, RowSpanningCaches } from '../../hooks/features/useGridSpanning';\n\nexport interface GridPinnedRowsProps<R extends GridRowModel> {\n rows: R[];\n position: 'top' | 'bottom';\n columns: GridColDef<R>[];\n selectedRowIds: Set<GridRowId>;\n checkboxSelection: boolean;\n onRowClick: (params: GridRowParams<R>) => void;\n onRowDoubleClick?: (params: GridRowParams<R>) => void;\n onCellClick: (params: GridCellParams<R>) => void;\n onSelectionChange: (rowId: GridRowId, isSelected: boolean) => void;\n columnWidths: Record<string, number>;\n pinnedColumns: GridColumnPinning;\n pinnedRows?: GridRowPinning;\n hasDetailPanel: boolean;\n expandedRowIds: Set<GridRowId>;\n getDetailPanelContent?: (params: GridDetailPanelParams<R>) => React.ReactNode;\n getDetailPanelHeight?: (params: GridDetailPanelParams<R>) => GridDetailPanelHeight;\n onDetailPanelToggle: (rowId: GridRowId) => void;\n pinCheckboxColumn?: boolean;\n pinExpandColumn?: boolean;\n focusedCell: { id: GridRowId; field: string } | null;\n colspanMap?: Map<GridRowId, Record<string, CellColSpanInfo>>;\n rowSpanningCaches?: RowSpanningCaches;\n rowHeight: number;\n rowMetaMap: Map<GridRowId, GridRowMeta>;\n}\n\nexport function GridPinnedRows<R extends GridRowModel>({\n rows,\n position,\n columns,\n selectedRowIds,\n checkboxSelection,\n onRowClick,\n onRowDoubleClick,\n onCellClick,\n onSelectionChange,\n columnWidths,\n pinnedColumns,\n pinnedRows,\n hasDetailPanel,\n expandedRowIds,\n getDetailPanelContent,\n getDetailPanelHeight,\n onDetailPanelToggle,\n pinCheckboxColumn,\n pinExpandColumn,\n focusedCell,\n colspanMap,\n rowSpanningCaches,\n rowHeight,\n rowMetaMap,\n}: GridPinnedRowsProps<R>) {\n if (rows.length === 0) return null;\n\n return (\n <div className={`ogx__pinned-rows ogx__pinned-rows--${position}`} role=\"rowgroup\">\n {rows.map((row, index) => (\n <Row<R>\n key={row.id}\n row={row}\n columns={columns}\n rowIndex={index}\n isSelected={selectedRowIds.has(row.id)}\n checkboxSelection={checkboxSelection}\n onRowClick={onRowClick}\n onRowDoubleClick={onRowDoubleClick}\n onCellClick={onCellClick}\n onSelectionChange={onSelectionChange}\n columnWidths={columnWidths}\n pinnedColumns={pinnedColumns}\n pinnedRows={pinnedRows}\n hasDetailPanel={hasDetailPanel}\n isDetailPanelExpanded={expandedRowIds.has(row.id)}\n detailPanelContent={getDetailPanelContent ? getDetailPanelContent({ row, id: row.id, rowIndex: index }) : null}\n detailPanelHeight={getDetailPanelHeight?.({ row, id: row.id, rowIndex: index }) || 200}\n onDetailPanelToggle={onDetailPanelToggle}\n pinCheckboxColumn={pinCheckboxColumn}\n pinExpandColumn={pinExpandColumn}\n focusedCellField={focusedCell?.id === row.id ? focusedCell.field : null}\n colspanMap={colspanMap}\n rowSpanningCaches={rowSpanningCaches}\n rowHeight={rowHeight}\n rowMeta={rowMetaMap.get(row.id)}\n />\n ))}\n </div>\n );\n}\n","import React from 'react';\nimport type { GridColDef } from '../../types';\n\ninterface SkeletonColumn extends GridColDef {\n left?: number;\n right?: number;\n pinned?: 'left' | 'right';\n zIndex?: number;\n}\n\ninterface SkeletonRowProps {\n columns: SkeletonColumn[];\n rowHeight: number;\n checkboxSelection?: boolean;\n hasDetailPanel?: boolean;\n rowReordering?: boolean;\n}\n\nexport const SkeletonRow: React.FC<SkeletonRowProps> = ({\n columns,\n rowHeight,\n checkboxSelection = false,\n hasDetailPanel = false,\n rowReordering = false\n}) => {\n return (\n <div\n className=\"ogx__row ogx__skeleton-row\"\n style={{ height: rowHeight }}\n role=\"row\"\n >\n { }\n {checkboxSelection && (\n <div\n className=\"ogx__cell ogx__skeleton-cell\"\n style={{ width: 48, minWidth: 48 }}\n >\n <div className=\"ogx-skeleton-box\" style={{ width: 18, height: 18, borderRadius: 2 }} />\n </div>\n )}\n\n { }\n {hasDetailPanel && (\n <div\n className=\"ogx__cell ogx__skeleton-cell\"\n style={{ width: 48, minWidth: 48 }}\n >\n <div className=\"ogx-skeleton-box\" style={{ width: 18, height: 18, borderRadius: 2 }} />\n </div>\n )}\n\n { }\n {rowReordering && (\n <div\n className=\"ogx__cell ogx__skeleton-cell\"\n style={{ width: 48, minWidth: 48 }}\n >\n <div className=\"ogx-skeleton-box\" style={{ width: 18, height: 18, borderRadius: 2 }} />\n </div>\n )}\n\n { }\n {columns.map((col, index) => {\n const width = typeof col.width === 'number' ? col.width : 150;\n const skeletonWidth = Math.min(width * 0.7, width - 20);\n\n return (\n <div\n key={col.field || index}\n className=\"ogx__cell ogx__skeleton-cell\"\n style={{\n width,\n minWidth: col.minWidth,\n maxWidth: col.maxWidth,\n left: col.left,\n right: col.right,\n position: col.isSpacer ? 'relative' : (col.pinned ? 'sticky' : 'relative'),\n zIndex: col.zIndex\n }}\n >\n {!col.isSpacer && (\n <div\n className=\"ogx-skeleton-box\"\n style={{\n width: skeletonWidth,\n height: 16,\n borderRadius: 4\n }}\n />\n )}\n </div>\n );\n })}\n </div>\n );\n};\n","import React from 'react';\nimport { Row } from '../Row/Row';\nimport { SkeletonRow } from '../SkeletonRow';\nimport { isRowPinned } from '../../utils/pinning';\nimport type {\n GridRowModel,\n GridRowId,\n GridColDef,\n GridRowParams,\n GridCellParams,\n GridColumnPinning,\n GridRowPinning,\n GridDetailPanelParams,\n GridDetailPanelHeight,\n GridRowMeta,\n} from '../../types';\nimport type { GridVisibleRow } from '../../hooks/core/useGridVisibleRows';\nimport type { UseRowReorderReturn } from '../../hooks/useRowReorder';\nimport type { GridEditingState } from '../../hooks/features/useGridEditing';\nimport type { CellColSpanInfo, RowSpanningCaches } from '../../hooks/features/useGridSpanning';\n\ninterface RowEditingHandlers {\n editingCell: GridEditingState['editingCell'];\n startCellEdit: (params: { id: GridRowId; field: string; value: unknown }) => void;\n stopCellEdit: (params?: { cancel?: boolean }) => void;\n setEditCellValue: (params: { id: GridRowId; field: string; value: unknown }) => void;\n}\n\nexport interface GridVirtualRowsProps<R extends GridRowModel> {\n virtualContainerHeight: number;\n offsetTop: number;\n effectiveLoading: boolean;\n visibleRows: GridVisibleRow<R>[];\n baseColumns: GridColDef<R>[];\n virtualColumns: GridColDef<R>[];\n viewportWidth: number;\n checkboxSelection: boolean;\n hasDetailPanel: boolean;\n rowReordering: boolean;\n rowHeight: number;\n pinnedRows?: GridRowPinning;\n selectedRowIds: Set<GridRowId>;\n onRowClick: (params: GridRowParams<R>) => void;\n onRowDoubleClick?: (params: GridRowParams<R>) => void;\n onCellClick: (params: GridCellParams<R>) => void;\n onSelectionChange: (rowId: GridRowId, isSelected: boolean) => void;\n columnWidths: Record<string, number>;\n pinnedColumns: GridColumnPinning;\n expandedRowIds: Set<GridRowId>;\n getDetailPanelContent?: (params: GridDetailPanelParams<R>) => React.ReactNode;\n getDetailPanelHeight?: (params: GridDetailPanelParams<R>) => GridDetailPanelHeight;\n onDetailPanelToggle: (rowId: GridRowId) => void;\n pinCheckboxColumn?: boolean;\n pinExpandColumn?: boolean;\n rowReorderHandlers: UseRowReorderReturn;\n editingHandlers: RowEditingHandlers;\n focusedCell: { id: GridRowId; field: string } | null;\n colspanMap?: Map<GridRowId, Record<string, CellColSpanInfo>>;\n rowSpanningCaches?: RowSpanningCaches;\n paginationMode: 'client' | 'server' | 'infinite';\n dataSourceLoading: boolean;\n sortedUnpinnedRowCount: number;\n infiniteScrollSkeletonCount: number;\n unpinnedRowsLength: number;\n rowMetaMap: Map<GridRowId, GridRowMeta>;\n loadingOverlay?: React.ReactNode;\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 onRowDoubleClick,\n onCellClick,\n onSelectionChange,\n columnWidths,\n pinnedColumns,\n expandedRowIds,\n getDetailPanelContent,\n getDetailPanelHeight,\n onDetailPanelToggle,\n pinCheckboxColumn,\n pinExpandColumn,\n rowReorderHandlers,\n editingHandlers,\n focusedCell,\n colspanMap,\n rowSpanningCaches,\n paginationMode,\n dataSourceLoading,\n sortedUnpinnedRowCount,\n infiniteScrollSkeletonCount,\n unpinnedRowsLength,\n rowMetaMap,\n loadingOverlay,\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 && loadingOverlay ? (\n <div className=\"ogx__loading-overlay\" style={{ width: viewportWidth || undefined }}>{loadingOverlay}</div>\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 onRowDoubleClick={onRowDoubleClick}\n onCellClick={onCellClick}\n onSelectionChange={onSelectionChange}\n columnWidths={columnWidths}\n pinnedColumns={pinnedColumns}\n pinnedRows={pinnedRows}\n hasDetailPanel={hasDetailPanel}\n isDetailPanelExpanded={expandedRowIds.has(row.id)}\n detailPanelContent={getDetailPanelContent ? getDetailPanelContent({ row, id: row.id, rowIndex: actualIndex }) : null}\n detailPanelHeight={getDetailPanelHeight?.({ row, id: row.id, rowIndex: actualIndex }) || 200}\n onDetailPanelToggle={onDetailPanelToggle}\n pinCheckboxColumn={pinCheckboxColumn}\n pinExpandColumn={pinExpandColumn}\n rowReordering={rowReordering}\n onDragStart={rowReorderHandlers.onDragStart}\n onDragOver={rowReorderHandlers.onDragOver}\n onDragEnd={rowReorderHandlers.onDragEnd}\n onDrop={rowReorderHandlers.onDrop}\n isDragging={rowReorderHandlers.draggedRowId === row.id}\n isDragOver={rowReorderHandlers.dragOverRowId === row.id}\n editingCell={editingHandlers.editingCell}\n onEditStart={editingHandlers.startCellEdit}\n onEditStop={editingHandlers.stopCellEdit}\n onEditCellValueChange={editingHandlers.setEditCellValue}\n focusedCellField={focusedCell != null && focusedCell.id === row.id ? focusedCell.field : null}\n colspanMap={colspanMap}\n rowSpanningCaches={rowSpanningCaches}\n rowHeight={rowHeight}\n rowMeta={rowMetaMap.get(row.id)}\n />\n ))\n )}\n\n {paginationMode === 'infinite' && dataSourceLoading && sortedUnpinnedRowCount > 0 && (\n <div className=\"ogx__skeleton-group\">\n {Array.from({ length: infiniteScrollSkeletonCount }).map((_, i) => (\n <Row<R>\n key={`__skeleton_${i}__`}\n row={{ id: `__skeleton_${i}__`, _isSkeleton: true } as unknown as R}\n columns={virtualColumns}\n rowIndex={unpinnedRowsLength + i}\n rowHeight={rowHeight}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { useState, useMemo, useRef } from 'react';\nimport { Checkbox } from '../ui/Checkbox';\nimport type { GridColDef, GridRowModel } from '../../types';\n\n\nexport interface ColumnVisibilityPanelProps<R extends GridRowModel = GridRowModel> {\n columns: GridColDef<R>[];\n visibleColumns: Set<string>;\n onVisibilityChange: (field: string, isVisible: boolean) => void;\n onShowAll: () => void;\n onHideAll: () => void;\n onColumnReorder?: (fromField: string, toField: string) => void;\n onColumnOrderReset?: () => void;\n /** Show columns with `hideable: false` in the panel as disabled rows. Default: false. */\n showNonHideableColumns?: boolean;\n}\n\nfunction SearchIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n );\n}\n\nfunction DragHandleIcon() {\n return (\n <svg\n className=\"ogx-column-visibility-panel__drag-handle\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <circle cx=\"9\" cy=\"5\" r=\"1.5\" />\n <circle cx=\"15\" cy=\"5\" r=\"1.5\" />\n <circle cx=\"9\" cy=\"12\" r=\"1.5\" />\n <circle cx=\"15\" cy=\"12\" r=\"1.5\" />\n <circle cx=\"9\" cy=\"19\" r=\"1.5\" />\n <circle cx=\"15\" cy=\"19\" r=\"1.5\" />\n </svg>\n );\n}\n\nexport function ColumnVisibilityPanel<R extends GridRowModel = GridRowModel>(\n props: ColumnVisibilityPanelProps<R>\n) {\n const { columns, visibleColumns, onVisibilityChange, onShowAll, onHideAll, onColumnReorder, onColumnOrderReset, showNonHideableColumns } = props;\n const [searchQuery, setSearchQuery] = useState('');\n const [dragOverField, setDragOverField] = useState<string | null>(null);\n const dragFieldRef = useRef<string | null>(null);\n\n const hideableColumns = useMemo(() => columns.filter(col => col.hideable !== false), [columns]);\n const allVisible = hideableColumns.every(col => visibleColumns.has(col.field));\n\n const filteredColumns = useMemo(() => {\n const base = showNonHideableColumns ? columns : hideableColumns;\n if (!searchQuery) return base;\n const lowerQuery = searchQuery.toLowerCase();\n return base.filter(col =>\n (col.headerName || col.field).toLowerCase().includes(lowerQuery)\n );\n }, [columns, hideableColumns, searchQuery, showNonHideableColumns]);\n\n const handleToggleAll = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.checked) {\n onShowAll();\n } else {\n onHideAll();\n }\n };\n\n // ── Drag handlers ──────────────────────────────────────────────────────────\n const handleDragStart = (field: string) => (e: React.DragEvent) => {\n dragFieldRef.current = field;\n e.dataTransfer.effectAllowed = 'move';\n // Use a ghost image offset so the handle looks natural\n e.dataTransfer.setDragImage(e.currentTarget.closest('.ogx-column-visibility-panel__item') as HTMLElement, 20, 20);\n };\n\n const handleDragOver = (field: string) => (e: React.DragEvent) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n if (field !== dragFieldRef.current) {\n setDragOverField(field);\n }\n };\n\n const handleDragLeave = () => {\n setDragOverField(null);\n };\n\n const handleDrop = (toField: string) => (e: React.DragEvent) => {\n e.preventDefault();\n const fromField = dragFieldRef.current;\n setDragOverField(null);\n dragFieldRef.current = null;\n if (fromField && fromField !== toField && onColumnReorder) {\n onColumnReorder(fromField, toField);\n }\n };\n\n const handleDragEnd = () => {\n setDragOverField(null);\n dragFieldRef.current = null;\n };\n\n return (\n <div className=\"ogx-column-visibility-panel\">\n <div className=\"ogx-column-visibility-panel__search-section\">\n <div className=\"ogx-column-visibility-panel__search-container\">\n <SearchIcon />\n <input\n autoComplete=\"off\"\n className=\"ogx-column-visibility-panel__search-input\"\n placeholder=\"Search\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n />\n </div>\n </div>\n\n <div className=\"ogx-column-visibility-panel__list\">\n {filteredColumns.map(col => {\n const isVisible = visibleColumns.has(col.field);\n const isHideable = col.hideable !== false;\n const isDragOver = dragOverField === col.field;\n const canReorder = !!onColumnReorder && !searchQuery;\n\n return (\n <div\n key={col.field}\n className={[\n 'ogx-column-visibility-panel__item',\n !isHideable && 'ogx-column-visibility-panel__item--disabled',\n isDragOver && 'ogx-column-visibility-panel__item--drag-over',\n ].filter(Boolean).join(' ')}\n draggable={canReorder}\n onDragOver={canReorder ? handleDragOver(col.field) : undefined}\n onDragLeave={canReorder ? handleDragLeave : undefined}\n onDrop={canReorder ? handleDrop(col.field) : undefined}\n onDragEnd={canReorder ? handleDragEnd : undefined}\n >\n {canReorder && (\n <span\n className=\"ogx-column-visibility-panel__drag-handle-wrapper\"\n draggable\n onDragStart={handleDragStart(col.field)}\n title=\"Drag to reorder\"\n >\n <DragHandleIcon />\n </span>\n )}\n <label\n className=\"ogx-column-visibility-panel__item-label\"\n style={{ display: 'flex', alignItems: 'center', gap: 'var(--ogx-spacing-md)', flex: 1, cursor: isHideable ? 'pointer' : 'not-allowed' }}\n >\n <Checkbox\n checked={isVisible}\n onChange={(e) => onVisibilityChange(col.field, e.target.checked)}\n disabled={!isHideable}\n />\n <span className=\"ogx-column-visibility-panel__label\">\n {col.headerName || col.field}\n </span>\n </label>\n </div>\n );\n })}\n </div>\n\n <div className=\"ogx-column-visibility-panel__footer\">\n <label className=\"ogx-column-visibility-panel__item\">\n <Checkbox\n checked={allVisible}\n onChange={handleToggleAll}\n />\n <span className=\"ogx-column-visibility-panel__label\">\n Show/Hide All\n </span>\n </label>\n <button\n className=\"ogx-column-visibility-panel__reset-btn\"\n onClick={() => { onShowAll(); onColumnOrderReset?.(); }}\n >\n Reset\n </button>\n </div>\n </div>\n );\n}\n","import React, { useState, useLayoutEffect } from 'react';\nimport ReactDOM from 'react-dom';\nimport { ColumnVisibilityPanel } from '../ColumnVisibilityPanel/ColumnVisibilityPanel';\nimport type { GridColDef, GridRowModel, GridColumnOrderChangeParams } from '../../types';\n\nexport interface GridStandaloneColumnPanelProps<R extends GridRowModel> {\n isOpen: boolean;\n containerRef: React.RefObject<HTMLDivElement | null>;\n panelRef?: React.RefObject<HTMLDivElement | null>;\n effectiveColumns: GridColDef<R>[];\n columnVisibilityModel: Record<string, boolean>;\n effectiveColumnOrder: string[];\n columnOrder?: string[];\n disableColumnReorder: boolean;\n onClose: () => void;\n onColumnVisibilityChange: (model: Record<string, boolean>) => void;\n onColumnOrderChange?: (params: GridColumnOrderChangeParams) => void;\n setInternalColumnOrder: React.Dispatch<React.SetStateAction<string[]>>;\n}\n\nexport function GridStandaloneColumnPanel<R extends GridRowModel>({\n isOpen,\n containerRef,\n panelRef,\n effectiveColumns,\n columnVisibilityModel,\n effectiveColumnOrder,\n columnOrder,\n disableColumnReorder,\n onClose,\n onColumnVisibilityChange,\n onColumnOrderChange,\n setInternalColumnOrder,\n}: GridStandaloneColumnPanelProps<R>) {\n const [panelTop, setPanelTop] = useState<number>(16);\n const [panelRight, setPanelRight] = useState<number>(16);\n const [portalTarget, setPortalTarget] = useState<Element>(() => document.body);\n\n useLayoutEffect(() => {\n if (!isOpen || !containerRef.current) return;\n const rect = containerRef.current.getBoundingClientRect();\n setPanelTop(rect.top + 8);\n setPanelRight(window.innerWidth - rect.right + 8);\n setPortalTarget(containerRef.current.closest('.ogx-theme-provider') || document.body);\n }, [isOpen, containerRef]);\n\n if (!isOpen) return null;\n\n const handleReorder = disableColumnReorder\n ? undefined\n : (fromField: string, toField: string) => {\n const currentOrder = [...effectiveColumnOrder];\n const fromIdx = currentOrder.indexOf(fromField);\n const toIdx = currentOrder.indexOf(toField);\n if (fromIdx === -1 || toIdx === -1) return;\n const newOrder = [...currentOrder];\n newOrder.splice(fromIdx, 1);\n newOrder.splice(toIdx, 0, fromField);\n if (!columnOrder) setInternalColumnOrder(newOrder);\n onColumnOrderChange?.({\n oldIndex: fromIdx,\n targetIndex: toIdx,\n column: effectiveColumns.find(c => c.field === fromField) as unknown as GridColDef,\n });\n };\n\n return ReactDOM.createPortal(\n <div\n ref={panelRef}\n style={{\n position: 'fixed',\n top: panelTop,\n right: panelRight,\n zIndex: 9999,\n display: 'inline-block',\n }}\n >\n <button\n onClick={onClose}\n style={{\n position: 'absolute',\n top: -12,\n right: -12,\n width: 24,\n height: 24,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: '#334155',\n color: '#fff',\n border: 'none',\n borderRadius: '50%',\n cursor: 'pointer',\n fontSize: 14,\n lineHeight: 1,\n zIndex: 1,\n boxShadow: '0 1px 4px rgba(0,0,0,0.2)',\n }}\n aria-label=\"Close\"\n >×</button>\n <ColumnVisibilityPanel<R>\n columns={effectiveColumns}\n visibleColumns={new Set(\n effectiveColumns\n .filter(col => columnVisibilityModel[col.field] !== false)\n .map(col => col.field)\n )}\n onVisibilityChange={(field, isVisible) => {\n onColumnVisibilityChange({ ...columnVisibilityModel, [field]: isVisible });\n }}\n onShowAll={() => {\n const next = { ...columnVisibilityModel };\n effectiveColumns.forEach(col => { if (col.hideable !== false) next[col.field] = true; });\n onColumnVisibilityChange(next);\n }}\n onHideAll={() => {\n const next = { ...columnVisibilityModel };\n effectiveColumns.forEach(col => { if (col.hideable !== false) next[col.field] = false; });\n onColumnVisibilityChange(next);\n }}\n onColumnReorder={handleReorder}\n />\n </div>,\n portalTarget\n );\n}\n","import React, { useRef, useEffect, useCallback, useMemo, useState } from 'react';\nimport { useLayout } from '../../hooks/core/useLayout';\nimport { useGridKeyboardNavigation } from '../../hooks/core/useGridKeyboardNavigation';\nimport { useGridControlledState } from '../../hooks/core/useGridControlledState';\nimport { useGridRowPipeline } from '../../hooks/core/useGridRowPipeline';\nimport { useGridVirtualization } from '../../hooks/core/useGridVirtualization';\nimport { useGridColumns } from '../../hooks/core/useGridColumns';\nimport { useGridVisibleRows } from '../../hooks/core/useGridVisibleRows';\nimport { useGridScrollSync } from '../../hooks/core/useGridScrollSync';\nimport { useGridStateSnapshot } from '../../hooks/core/useGridStateSnapshot';\nimport { useGridDevWarnings } from '../../hooks/core/useGridDevWarnings';\nimport { scrollRowIntoView } from '../../utils/scroll';\nimport { GridAggregationFooter } from './GridAggregationFooter';\nimport { GridEmptyState } from './GridEmptyState';\nimport { GridErrorOverlay } from './GridErrorOverlay';\nimport { Header } from '../Header/Header';\nimport { Pagination } from '../Pagination/Pagination';\nimport { useDataGrid } from '../../hooks/core/useDataGrid';\nimport { useRowReorder } from '../../hooks/useRowReorder';\nimport { useTreeData } from '../../hooks/useTreeData';\nimport { useRowGrouping } from '../../hooks/useRowGrouping';\nimport { useGridEditing } from '../../hooks/features/useGridEditing';\nimport { useGridSpanning } from '../../hooks/features/useGridSpanning';\nimport { useGridDataSource } from '../../hooks/features/useGridDataSource';\nimport { useAggregation } from '../../hooks/features/useAggregation';\nimport { usePivot } from '../../hooks/features/usePivot';\nimport { useGridClipboard } from '../../hooks/features/useGridClipboard';\nimport { GridListView } from './GridListView';\nimport { GridPinnedRows } from './GridPinnedRows';\nimport { GridVirtualRows } from './GridVirtualRows';\nimport { GridStandaloneColumnPanel } from './GridStandaloneColumnPanel';\nimport type { DataGridProps, GridRowModel, GridRowId, GridSortDirection, GridColDef, GridRowParams, GridCellParams, GridDataSource, GridAggregationResult, GridFilterModel, GridTreeNode, GridSortItem, GridRowMeta, GridGroupedExportRow } from '../../types';\n\nconst EMPTY_ROW_META_MAP: Map<GridRowId, GridRowMeta> = new Map();\n\nexport function DataGrid<R extends GridRowModel = GridRowModel>(props: DataGridProps<R>) {\n const {\n rows,\n columns,\n getRowId,\n rowHeight = 52,\n headerHeight = 56,\n autoHeight = false,\n density,\n checkboxSelection = false,\n disableRowSelectionOnClick = false,\n disableMultipleRowSelection = false,\n rowSelectionModel: propRowSelectionModel,\n onRowSelectionModelChange: propOnRowSelectionModelChange,\n onRowClick,\n onRowDoubleClick,\n onCellClick,\n\n filterModel: propFilterModel,\n onFilterModelChange,\n sortModel: propSortModel,\n onSortModelChange,\n pagination: propPagination = false,\n paginationModel,\n onPaginationModelChange,\n pageSizeOptions = [10, 25, 50, 100],\n pinnedColumns: propPinnedColumns,\n onPinnedColumnsChange,\n pinnedRows,\n\n getDetailPanelContent,\n getDetailPanelHeight,\n detailPanelExpandedRowIds: controlledExpandedRowIds,\n onDetailPanelExpandedRowIdsChange,\n pinCheckboxColumn = true,\n pinExpandColumn = true,\n disableColumnReorder = false,\n columnOrder,\n onColumnOrderChange,\n height,\n rowReordering = false,\n onRowOrderChange,\n loading = false,\n\n treeData = false,\n getTreeDataPath,\n defaultGroupingExpansionDepth,\n groupingColDef,\n\n rowGroupingModel: propRowGroupingModel,\n\n aggregationModel: propAggregationModel,\n onAggregationModelChange,\n getAggregationPosition,\n\n isCellEditable,\n processRowUpdate,\n onProcessRowUpdateError,\n\n dataSource,\n multiSort = false,\n sortingMode = 'client',\n filterMode = 'client',\n paginationMode = 'client',\n rowCount: propRowCount,\n\n slots,\n slotProps,\n\n pivotMode = false,\n pivotModel: propPivotModel,\n onPivotModelChange,\n\n className = '',\n style,\n onRowsScrollEnd,\n ariaLabel,\n initialState,\n onStateChange,\n // Column Visibility\n columnVisibilityModel: propColumnVisibilityModel,\n onColumnVisibilityModelChange,\n listView = false,\n listViewColumn,\n columnGroupingModel,\n noRowsLabel = 'No Data',\n localeText,\n apiRef: propApiRef,\n overscanRowCount = 3,\n } = props;\n\n const effectiveNoRowsLabel = localeText?.noRowsLabel ?? noRowsLabel;\n\n // Stable defaults\n const defaultFilterModel: GridFilterModel = useMemo(() => ({ items: [] }), []);\n const filterModel = (propFilterModel || defaultFilterModel) as GridFilterModel;\n\n const defaultRowGroupingModel = useMemo(() => [], []);\n const rowGroupingModel = propRowGroupingModel || defaultRowGroupingModel;\n\n // ─── Stabilize toolbar component identity ────────────────────────────────\n // Problem: demos/users often define their toolbar as an inline function\n // INSIDE their component body, e.g.:\n // const MyToolbar = (props) => <GridToolbar {...props} /> // inside render!\n // This creates a NEW function reference on every parent re-render. React\n // reconciles by component *identity*, so a new reference = unmount old\n // toolbar + mount fresh one = all toolbar state (search expansion, filter\n // open, typed text) is destroyed on every keystroke.\n //\n // Fix: a stable wrapper component created ONCE via useRef. Its identity\n // never changes, so React keeps it mounted. It reads the latest toolbar\n // from a separate ref that is updated on every render, so the rendered\n // output is always current — zero stale closures.\n const latestToolbarRef = useRef(slots?.toolbar);\n latestToolbarRef.current = slots?.toolbar;\n // The wrapper itself has a stable identity (created once via useRef).\n // We call latestToolbarRef.current(props) as a PLAIN FUNCTION — not via\n // React.createElement — so React never sees a changing component type.\n // The elements the toolbar function returns are reconciled normally, so\n // GridToolbar's internal state (filterOpen, search expansion) is preserved\n // even when the toolbar is defined as an inline function inside the parent.\n const StableToolbar = useRef((props: Record<string, unknown>) => {\n const Toolbar = latestToolbarRef.current;\n return Toolbar ? (Toolbar as (p: typeof props) => React.ReactElement | null)(props) : null;\n }).current;\n\n const controlledState = useGridControlledState({\n initialState,\n sortModel: propSortModel,\n onSortModelChange,\n aggregationModel: propAggregationModel,\n onAggregationModelChange,\n columnVisibilityModel: propColumnVisibilityModel,\n onColumnVisibilityModelChange,\n pinnedColumns: propPinnedColumns,\n onPinnedColumnsChange,\n pivotModel: propPivotModel,\n onPivotModelChange,\n paginationModel,\n onPaginationModelChange,\n rowSelectionModel: propRowSelectionModel,\n onRowSelectionModelChange: propOnRowSelectionModelChange,\n });\n\n const {\n sortModel,\n isSortControlled,\n setInternalSortModel,\n aggregationModel,\n handleAggregationModelChange,\n columnVisibilityModel,\n handleColumnVisibilityModelChange,\n pinnedColumns,\n handlePinnedColumnsChange,\n currentPivotModel,\n handlePivotModelChange,\n effectivePaginationModel,\n handlePaginationModelChange,\n selectedRowIds,\n isSelectionControlled,\n setInternalRowSelectionModel,\n } = controlledState;\n\n const onRowSelectionModelChange = propOnRowSelectionModelChange;\n\n const pivot = usePivot(rows as GridRowModel[], columns as unknown as GridColDef[], currentPivotModel, pivotMode);\n\n const effectiveRowHeight = density === 'compact' ? 32 : density === 'comfortable' ? 72 : rowHeight;\n\n const activeRows = (pivotMode && pivot.isValid ? pivot.pivotRows : rows) as unknown as R[];\n const baseColumns = (pivotMode && pivot.isValid ? pivot.pivotColumns : columns) as unknown as GridColDef<R>[];\n\n // When groupingColDef is provided and row grouping is active, prepend a\n // dedicated synthetic __group__ column at position 0 (pinned-left).\n const isRowGroupingActive = Boolean(propRowGroupingModel && propRowGroupingModel.length > 0);\n\n // Auto-pin __group__ column to the left when groupingColDef is active.\n // Both values MUST be memoized: without useMemo they produce a new array/object\n // reference every render, which cascades through useRowGrouping's memos and\n // effects into an infinite setState loop (Maximum update depth exceeded).\n const effectivePinnedColumns = useMemo(() => (\n (groupingColDef && isRowGroupingActive && !pivotMode)\n ? { ...pinnedColumns, left: ['__group__', ...((pinnedColumns?.left ?? []).filter(f => f !== '__group__'))] }\n : pinnedColumns\n ), [groupingColDef, isRowGroupingActive, pivotMode, pinnedColumns]);\n\n const activeColumns = useMemo(() => (\n (groupingColDef && isRowGroupingActive && !pivotMode)\n ? [\n {\n headerName: 'Group',\n width: 220,\n ...groupingColDef,\n field: '__group__',\n hideable: false,\n sortable: false,\n pinnable: false,\n exportable: false,\n } as unknown as GridColDef<R>,\n ...baseColumns,\n ]\n : baseColumns\n ), [groupingColDef, isRowGroupingActive, pivotMode, baseColumns]);\n\n const [serverAggregationResults, setServerAggregationResults] = useState<GridAggregationResult | null>(null);\n\n useEffect(() => {\n setServerAggregationResults(null);\n }, [aggregationModel]);\n\n const viewportRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const gridRef = useRef<HTMLDivElement>(null);\n\n const defaultGetRowId = useCallback((row: R) => row.id, []);\n const effectiveGetRowId = getRowId || defaultGetRowId;\n\n // Normalize rows so every row has `id === getRowId(row)`.\n // createInitialState and SET_ROWS both key the internal store by row.id,\n // so rows without a native id field collide on undefined without this.\n // When getRowId is the default (row) => row.id this is a no-op per row.\n const normalizedRows = useMemo(\n () => activeRows.map(row => {\n const id = effectiveGetRowId(row);\n return id === row.id ? row : ({ ...row, id } as R);\n }),\n [activeRows, effectiveGetRowId]\n );\n\n // Keyboard-mode flag: toggled via DOM classname — no React state needed\n // so the ring appears instantly without a re-render cycle.\n const setKeyboardMode = useCallback((on: boolean) => {\n containerRef.current?.classList.toggle('ogx--kb', on);\n }, []);\n\n const dataSourceRef = useRef<GridDataSource<R> | undefined>(dataSource);\n dataSourceRef.current = dataSource;\n\n const fetchChildrenRef = useRef<((parentId: GridRowId, groupKeys: string[]) => Promise<void>) | null>(null);\n const treeDataRef = useRef<ReturnType<typeof useTreeData> | null>(null);\n\n const handleNodeExpansion = useCallback((node: GridTreeNode) => {\n if (dataSourceRef.current && treeData) {\n\n if ((node.serverChildrenCount ?? 0) > 0 && (node.children ?? []).length === 0) {\n\n const groupKeys = treeDataRef.current?.getNodePath(node.id) || [node.groupingKey];\n fetchChildrenRef.current?.(node.id, groupKeys);\n }\n }\n }, [treeData]);\n\n const gridData = useDataGrid({\n rows: normalizedRows,\n columns: activeColumns,\n rowHeight: effectiveRowHeight,\n headerHeight,\n rowCount: propRowCount,\n columnVisibilityModel,\n initialState: props.initialState\n });\n const {\n state,\n apiRef,\n setRows,\n setColumns,\n setDimensions,\n setDataSourceLoading,\n setDataSourceError,\n setRowCount\n } = gridData;\n\n const { scrollTop, scrollLeft, overscanRows, handleScroll } = useGridScrollSync({ onRowsScrollEnd, overscanRowCount });\n\n useEffect(() => {\n if (propApiRef) {\n propApiRef.current = apiRef.current;\n }\n }, [propApiRef, apiRef]);\n\n const { copySelectedRows } = useGridClipboard({\n selectedRowIds,\n columns: activeColumns as unknown as GridColDef[],\n getVisibleRows: () => apiRef.current.getVisibleRows(),\n getRowId: effectiveGetRowId as unknown as (row: GridRowModel) => GridRowId,\n });\n\n // Expose on apiRef for programmatic use\n useEffect(() => {\n apiRef.current.copySelectedRows = copySelectedRows;\n apiRef.current.getSelectedRows = () => Array.from(selectedRowIds);\n }, [copySelectedRows, selectedRowIds, apiRef]);\n\n const isInternalLoading = state.dataSource.loading;\n const effectiveLoading = loading || isInternalLoading;\n\n const effectiveRows = useMemo(() => {\n return state.rows.allRows.map(id => state.rows.idRowsLookup.get(id)!) as R[];\n }, [state.rows]);\n\n const treeDataHandlers = useTreeData({\n rows: effectiveRows,\n getRowId: effectiveGetRowId,\n getTreeDataPath,\n treeData,\n defaultGroupingExpansionDepth,\n filterModel,\n\n sortModel,\n onRowExpansionChange: handleNodeExpansion\n });\n\n useEffect(() => {\n treeDataRef.current = treeDataHandlers;\n }, [treeDataHandlers]);\n\n const rowGroupingHandlers = useRowGrouping({\n rows: effectiveRows,\n getRowId: effectiveGetRowId,\n columns: activeColumns,\n rowGroupingModel,\n aggregationModel,\n defaultGroupingExpansionDepth,\n filterModel,\n sortModel,\n getAggregationPosition\n });\n\n const editingHandlers = useGridEditing({\n rows: effectiveRows,\n getRowId: effectiveGetRowId,\n processRowUpdate,\n onProcessRowUpdateError,\n onRowChange: (updatedRow) => {\n // Dispatch a proper state update so React re-renders with the new row value\n const { dispatch } = gridData;\n const currentRows = Array.from(gridData.state.rows.idRowsLookup.values());\n const nextRows = currentRows.map(r =>\n r.id === updatedRow.id ? updatedRow : r\n );\n dispatch({ type: 'SET_ROWS', payload: nextRows });\n },\n });\n\n const isTreeData = treeData;\n const isRowGrouping = !!(rowGroupingModel && rowGroupingModel.length > 0);\n const isHierarchyEnabled = isTreeData || isRowGrouping;\n const activeHierarchyHandlers = isTreeData ? treeDataHandlers : (isRowGrouping ? rowGroupingHandlers : null);\n\n const rowMetaMap = useMemo<Map<GridRowId, GridRowMeta>>(() => {\n if (isTreeData) return treeDataHandlers.rowMetaMap;\n if (isRowGrouping) return rowGroupingHandlers.rowMetaMap;\n return EMPTY_ROW_META_MAP;\n }, [isTreeData, treeDataHandlers.rowMetaMap, isRowGrouping, rowGroupingHandlers.rowMetaMap]);\n\n const pagination = propPagination && !isRowGrouping;\n\n const handleRowClick = useCallback((params: GridRowParams<R>) => {\n const { row, id } = params;\n\n if (isHierarchyEnabled && rowMetaMap.get(row.id)?.hasChildren) {\n activeHierarchyHandlers?.toggleExpansion(id);\n return;\n }\n\n onRowClick?.(params);\n\n if (!disableRowSelectionOnClick) {\n let next: GridRowId[];\n if (disableMultipleRowSelection) {\n const alreadySelected = selectedRowIds.has(id as GridRowId);\n next = alreadySelected ? [] : [id as GridRowId];\n } else {\n const newSelection = new Set(selectedRowIds);\n if (newSelection.has(id as GridRowId)) {\n newSelection.delete(id as GridRowId);\n } else {\n newSelection.add(id as GridRowId);\n }\n next = Array.from(newSelection);\n }\n if (!isSelectionControlled) {\n setInternalRowSelectionModel(next);\n }\n onRowSelectionModelChange?.(next);\n }\n }, [isHierarchyEnabled, activeHierarchyHandlers, onRowClick, rowMetaMap, disableRowSelectionOnClick, disableMultipleRowSelection, selectedRowIds, isSelectionControlled, setInternalRowSelectionModel, onRowSelectionModelChange]);\n\n const dataSourceHandlers = useGridDataSource({\n dataSource,\n sortModel,\n filterModel,\n paginationModel: effectivePaginationModel,\n paginationMode,\n sortingMode,\n filterMode,\n aggregationModel,\n setRows,\n setRowCount,\n setDataSourceLoading,\n setDataSourceError,\n onAggregationResults: setServerAggregationResults,\n });\n\n useEffect(() => {\n if (dataSourceHandlers.fetchChildren) {\n fetchChildrenRef.current = dataSourceHandlers.fetchChildren;\n }\n }, [dataSourceHandlers.fetchChildren]);\n\n useEffect(() => {\n if (!dataSource) {\n setRows(normalizedRows);\n }\n }, [normalizedRows, setRows, dataSource]);\n\n // ── Detail panel (hoisted — hasDetailPanel feeds into useGridColumns) ──────\n const hasDetailPanel = Boolean(getDetailPanelContent);\n const [internalExpandedRowIds, setInternalExpandedRowIds] = useState<Set<GridRowId>>(new Set());\n const expandedRowIds = controlledExpandedRowIds ?? internalExpandedRowIds;\n\n const handleDetailPanelToggle = useCallback((rowId: GridRowId) => {\n const newExpandedRowIds = new Set(expandedRowIds);\n if (newExpandedRowIds.has(rowId)) {\n newExpandedRowIds.delete(rowId);\n } else {\n newExpandedRowIds.add(rowId);\n }\n if (controlledExpandedRowIds === undefined) {\n setInternalExpandedRowIds(newExpandedRowIds);\n }\n onDetailPanelExpandedRowIdsChange?.(newExpandedRowIds);\n }, [expandedRowIds, controlledExpandedRowIds, onDetailPanelExpandedRowIdsChange]);\n\n // ── Column management ─────────────────────────────────────────────────────\n const {\n effectiveColumns,\n orderedColumns,\n visibleOrderedColumns,\n navigationColumns,\n columnWidths,\n effectiveColumnOrder,\n setInternalColumnOrder,\n columnReorderHandlers,\n handleColumnResize,\n } = useGridColumns<R>({\n activeColumns,\n isHierarchyEnabled,\n isRowGrouping,\n isTreeData,\n activeHierarchyHandlers,\n columnVisibilityModel,\n columnOrder,\n onColumnOrderChange,\n disableColumnReorder,\n pivotMode,\n checkboxSelection,\n hasDetailPanel,\n rowReordering,\n initialState,\n setColumns,\n });\n\n useGridStateSnapshot({\n onStateChange,\n sortModel,\n filterModel,\n effectivePaginationModel,\n columnWidths,\n effectiveColumnOrder,\n columnVisibilityModel,\n pinnedColumns: effectivePinnedColumns,\n });\n\n const rowPipeline = useGridRowPipeline<GridRowModel>({\n effectiveRows: effectiveRows as GridRowModel[],\n activeHierarchyHandlers: activeHierarchyHandlers as { getVisibleRows: () => GridRowModel[] } | null,\n filterMode,\n filterModel,\n dataSource: dataSource as GridDataSource<GridRowModel> | undefined,\n sortModel,\n sortingMode,\n pagination,\n paginationMode,\n effectivePaginationModel,\n pinnedRows,\n isLoading: state.dataSource.loading,\n pageSize: effectivePaginationModel.pageSize,\n });\n const filteredRows = rowPipeline.filteredRows as R[];\n const pinnedTopRows = rowPipeline.pinnedTopRows as R[];\n const pinnedBottomRows = rowPipeline.pinnedBottomRows as R[];\n const sortedUnpinnedRows = rowPipeline.sortedUnpinnedRows as R[];\n const paginatedUnpinnedRows = rowPipeline.paginatedUnpinnedRows as R[];\n const allRenderableRows = rowPipeline.allRenderableRows as R[];\n\n useEffect(() => {\n gridData.apiRef.current.getVisibleRows = () => pagination ? paginatedUnpinnedRows : sortedUnpinnedRows;\n gridData.apiRef.current.getAllFilteredRows = () => sortedUnpinnedRows;\n gridData.apiRef.current.getVisibleColumns = () => effectiveColumns as unknown as GridColDef[];\n }, [sortedUnpinnedRows, paginatedUnpinnedRows, pagination, effectiveColumns, gridData.apiRef]);\n\n const rowReorderHandlers = useRowReorder({\n rows: pagination ? paginatedUnpinnedRows : sortedUnpinnedRows,\n getRowId: (row) => row.id,\n onRowOrderChange,\n rowReordering\n });\n\n const spanning = useGridSpanning(\n allRenderableRows,\n navigationColumns,\n columnWidths\n );\n\n const { aggregationResult } = useAggregation({\n rows: filteredRows,\n columns: activeColumns as unknown as GridColDef[],\n aggregationModel,\n isServerSide: !!(dataSource && (paginationMode === 'server' || sortingMode === 'server')),\n dataSource,\n filterModel,\n sortModel,\n serverAggregationResults,\n });\n\n const hasAggregation = Object.keys(aggregationModel).length > 0;\n\n useEffect(() => {\n gridData.apiRef.current.getAggregationResult = () => hasAggregation ? aggregationResult : null;\n gridData.apiRef.current.getAggregationModel = () => hasAggregation ? aggregationModel : null;\n gridData.apiRef.current.getGroupedExportRows = (): GridGroupedExportRow[] | null => {\n if (!isRowGrouping) return null;\n const { treeNodes, groupingRows } = rowGroupingHandlers;\n const rowLookup = new Map<GridRowId, GridRowModel>();\n sortedUnpinnedRows.forEach(r => rowLookup.set((r as GridRowModel).id as GridRowId, r as GridRowModel));\n\n const result: GridGroupedExportRow[] = [];\n\n const traverse = (ids: GridRowId[]) => {\n ids.forEach(id => {\n const node = treeNodes.get(id);\n if (!node) return;\n const isGroup = Boolean(node.children && node.children.length > 0);\n if (isGroup) {\n result.push({\n type: 'group-header',\n depth: node.depth,\n groupField: node.groupingField,\n groupValue: node.groupingValue,\n });\n traverse(node.children!);\n if (hasAggregation && node.aggregatedValues) {\n result.push({\n type: 'group-subtotal',\n depth: node.depth,\n groupField: node.groupingField,\n groupValue: node.groupingValue,\n aggregatedValues: node.aggregatedValues,\n });\n }\n } else {\n const row = rowLookup.get(id) ?? groupingRows.get(id);\n if (row) {\n result.push({ type: 'leaf', depth: node.depth, row });\n }\n }\n });\n };\n\n traverse(Array.from(treeNodes.keys()).filter(id => treeNodes.get(id)?.parentId === null));\n\n if (hasAggregation && aggregationResult) {\n result.push({ type: 'grand-total', depth: 0, aggregatedValues: aggregationResult });\n }\n return result;\n };\n }, [aggregationResult, aggregationModel, hasAggregation, gridData.apiRef, isRowGrouping, rowGroupingHandlers, sortedUnpinnedRows]);\n\n const layout = useLayout({\n rowHeight: effectiveRowHeight,\n pagination,\n paginatedUnpinnedRows,\n sortedUnpinnedRows,\n expandedRowIds,\n getDetailPanelHeight,\n pinnedTopRowsLength: pinnedTopRows.length,\n pinnedBottomRowsLength: pinnedBottomRows.length,\n visibleOrderedColumns,\n pinnedColumns: effectivePinnedColumns,\n columnWidths,\n viewportWidth: state.dimensions.viewportWidth || 1000,\n checkboxSelection,\n hasDetailPanel,\n rowReordering,\n pinCheckboxColumn,\n pinExpandColumn,\n autoHeight,\n paginationMode,\n isLoading: state.dataSource.loading,\n pageSize: effectivePaginationModel.pageSize,\n });\n\n // Merge layout-computed widths (which include flex resolution) with user-resize\n // overrides. The footer and other consumers that receive `columnWidths` only get\n // the resize-override map, which has no entry for flex columns that haven't been\n // manually resized — causing them to fall back to the raw `col.width` prop instead\n // of the actual rendered width.\n const resolvedColumnWidths = useMemo(() => {\n const result: Record<string, number> = {};\n for (const col of [...layout.leftPinnedCols, ...layout.unpinnedColsWithWidth, ...layout.rightPinnedCols]) {\n if (!col.isSpacer) result[col.field] = col.width;\n }\n return { ...result, ...columnWidths };\n }, [layout.leftPinnedCols, layout.unpinnedColsWithWidth, layout.rightPinnedCols, columnWidths]);\n\n useEffect(() => {\n gridData.apiRef.current.scrollToIndexes = ({ rowIndex, colIndex }) => {\n const el = viewportRef.current;\n if (!el) return;\n\n if (rowIndex !== undefined && rowIndex >= 0) {\n scrollRowIntoView(el, rowIndex, layout.cumulativeHeights, layout.pinnedBottomHeight);\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 overscanRows,\n });\n\n\n useEffect(() => {\n if (!viewportRef.current) return;\n\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect;\n setDimensions(width, height);\n }\n });\n\n resizeObserver.observe(viewportRef.current);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [setDimensions]);\n\n const handleSelectionChange = useCallback((rowId: GridRowId, isSelected: boolean) => {\n const newSelection = new Set(selectedRowIds);\n if (isSelected) {\n newSelection.add(rowId);\n } else {\n newSelection.delete(rowId);\n }\n const newSelectionArray = Array.from(newSelection);\n\n if (!isSelectionControlled) {\n setInternalRowSelectionModel(newSelectionArray);\n }\n onRowSelectionModelChange?.(newSelectionArray);\n }, [selectedRowIds, isSelectionControlled, onRowSelectionModelChange, setInternalRowSelectionModel]);\n\n const handleSelectAll = useCallback((isSelected: boolean) => {\n let newSelection: GridRowId[] = [];\n if (isSelected) {\n newSelection = effectiveRows.map((row: GridRowModel) => row.id);\n }\n\n if (!isSelectionControlled) {\n setInternalRowSelectionModel(newSelection);\n }\n onRowSelectionModelChange?.(newSelection);\n }, [effectiveRows, isSelectionControlled, onRowSelectionModelChange, setInternalRowSelectionModel]);\n\n const handleSort = useCallback((field: string, direction: GridSortDirection) => {\n const newSortModel = direction ? [{ field, sort: direction }] : [];\n\n if (!isSortControlled) {\n setInternalSortModel(newSortModel as GridSortItem[]);\n }\n onSortModelChange?.(newSortModel as GridSortItem[]);\n }, [isSortControlled, onSortModelChange, setInternalSortModel]);\n\n const handleSortAdd = useCallback((field: string, direction: GridSortDirection) => {\n const existing = sortModel.filter(item => item.field !== field);\n const newSortModel: GridSortItem[] = direction\n ? [...existing, { field, sort: direction }]\n : existing;\n\n if (!isSortControlled) {\n setInternalSortModel(newSortModel);\n }\n onSortModelChange?.(newSortModel);\n }, [sortModel, isSortControlled, onSortModelChange, setInternalSortModel]);\n\n const { focusedCell, setFocusedCell, handleFocus, handleBlur, handleKeyDown } = useGridKeyboardNavigation({\n allRenderableRows,\n navigationColumns,\n checkboxSelection,\n selectedRowIds,\n handleSelectionChange,\n handleDetailPanelToggle,\n editingHandlers,\n setKeyboardMode,\n sortModel,\n handleSort,\n isCellEditable,\n pagination,\n pageSize: effectivePaginationModel.pageSize,\n virtualization,\n viewportRef,\n pinnedTopRowCount: pinnedTopRows.length,\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 useGridDevWarnings({\n paginationRequested: propPagination,\n isRowGrouping,\n autoHeight,\n viewportHeight: state.dimensions.viewportHeight,\n renderedRowCount: visibleRows.length,\n totalRowCount: pinnedTopRows.length + (pagination ? paginatedUnpinnedRows.length : sortedUnpinnedRows.length) + pinnedBottomRows.length,\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 NoRowsOverlaySlot = slots?.noRowsOverlay;\n const LoadingOverlaySlot = slots?.loadingOverlay;\n const FooterSlot = slots?.footer;\n\n const toolbarProps = React.useMemo(() => {\n if (!slots?.toolbar) return null;\n const reorderHandler = disableColumnReorder\n ? undefined\n : (fromField: string, toField: string) => {\n const currentOrder = [...effectiveColumnOrder];\n const fromIdx = currentOrder.indexOf(fromField);\n const toIdx = currentOrder.indexOf(toField);\n if (fromIdx === -1 || toIdx === -1) return;\n const newOrder = [...currentOrder];\n newOrder.splice(fromIdx, 1);\n newOrder.splice(toIdx, 0, fromField);\n if (!columnOrder) setInternalColumnOrder(newOrder);\n const col = effectiveColumns.find(c => c.field === fromField);\n if (col) onColumnOrderChange?.({ oldIndex: fromIdx, targetIndex: toIdx, column: col as unknown as GridColDef });\n };\n return {\n apiRef: gridData.apiRef,\n columns: orderedColumns as unknown as GridColDef[],\n baseColumns: columns as unknown as GridColDef[],\n aggregationModel,\n onAggregationModelChange: handleAggregationModelChange,\n ...(pivotMode || propPivotModel || onPivotModelChange ? {\n pivotModel: currentPivotModel,\n onPivotModelChange: handlePivotModelChange,\n } : {}),\n filterModel,\n onFilterModelChange,\n columnVisibilityModel,\n onColumnVisibilityModelChange: handleColumnVisibilityModelChange,\n onColumnReorder: reorderHandler,\n onColumnOrderReset: disableColumnReorder ? undefined : () => setInternalColumnOrder(columns.map(c => c.field)),\n forceColumnsOpen: columnsPanelOpen,\n onColumnsPanelClose: () => setColumnsPanelOpen(false),\n ...slotProps?.toolbar,\n };\n }, [\n slots?.toolbar, disableColumnReorder, effectiveColumnOrder, orderedColumns, effectiveColumns,\n columnOrder, onColumnOrderChange, setInternalColumnOrder, gridData.apiRef,\n columns, aggregationModel, handleAggregationModelChange, pivotMode,\n propPivotModel, onPivotModelChange, currentPivotModel, handlePivotModelChange,\n filterModel, onFilterModelChange, columnVisibilityModel,\n handleColumnVisibilityModelChange, columnsPanelOpen, slotProps?.toolbar,\n ]);\n\n // Click-outside handler for standalone column panel\n useEffect(() => {\n if (!columnsPanelOpen || slots?.toolbar) return;\n function handleClickOutside(e: MouseEvent) {\n if (standalonePanelRef.current && !standalonePanelRef.current.contains(e.target as Node)) {\n setColumnsPanelOpen(false);\n }\n }\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [columnsPanelOpen, slots?.toolbar]);\n\n return (\n <div\n ref={containerRef}\n className={['ogx', className, autoHeight && 'ogx--auto-height', hasRowSpanning && 'ogx--row-spanning', listView && 'ogx--list-view'].filter(Boolean).join(' ')}\n style={{\n ...style,\n height: height ?? style?.height,\n '--ogx-row-height': `${effectiveRowHeight}px`,\n '--ogx-header-height': `${headerHeight}px`\n } as unknown as React.CSSProperties}\n aria-busy={effectiveLoading}\n >\n {toolbarProps && <StableToolbar {...toolbarProps} />}\n\n {!slots?.toolbar && (\n <GridStandaloneColumnPanel<R>\n isOpen={columnsPanelOpen}\n containerRef={containerRef}\n panelRef={standalonePanelRef}\n effectiveColumns={effectiveColumns}\n columnVisibilityModel={columnVisibilityModel}\n effectiveColumnOrder={effectiveColumnOrder}\n columnOrder={columnOrder}\n disableColumnReorder={disableColumnReorder}\n onClose={() => setColumnsPanelOpen(false)}\n onColumnVisibilityChange={handleColumnVisibilityModelChange}\n onColumnOrderChange={onColumnOrderChange}\n setInternalColumnOrder={setInternalColumnOrder}\n />\n )}\n\n {listView && listViewColumn && (\n <GridListView<R>\n ariaLabel={ariaLabel}\n allRenderableRows={allRenderableRows}\n filteredRows={filteredRows}\n pagination={pagination}\n effectivePaginationModel={effectivePaginationModel}\n pageSizeOptions={pageSizeOptions}\n selectedRowIds={selectedRowIds}\n listViewColumn={listViewColumn}\n noRowsLabel={effectiveNoRowsLabel}\n rowHeight={effectiveRowHeight}\n checkboxSelection={checkboxSelection}\n paginationMode={paginationMode}\n dataSource={dataSource}\n serverRowCount={state.pagination.rowCount || 0}\n paginationSlot={slots?.pagination}\n paginationSlotProps={slotProps?.pagination}\n localeText={localeText ? {\n paginationRowsPerPage: localeText.paginationRowsPerPage,\n paginationOf: localeText.paginationOf,\n paginationPage: localeText.paginationPage,\n } : undefined}\n onRowClick={handleRowClick}\n onRowDoubleClick={onRowDoubleClick}\n onSelectionChange={handleSelectionChange}\n onPaginationModelChange={handlePaginationModelChange}\n />\n )}\n\n {/* ══════════════════════════════════════════════════════════════\n STANDARD GRID VIEWPORT (hidden when listView=true)\n ══════════════════════════════════════════════════════════════ */}\n {!listView && (\n <div\n ref={(el) => {\n viewportRef.current = el;\n gridRef.current = el;\n }}\n className=\"ogx__viewport\"\n onScroll={handleScroll}\n role=\"grid\"\n aria-label={ariaLabel || 'Data grid'}\n aria-rowcount={filteredRows.length + 1}\n aria-colcount={\n columns.length +\n (checkboxSelection ? 1 : 0) +\n (hasDetailPanel ? 1 : 0) +\n (rowReordering ? 1 : 0)\n }\n aria-busy={effectiveLoading}\n tabIndex={0}\n onKeyDownCapture={() => { setKeyboardMode(true); }}\n onMouseDownCapture={() => { setKeyboardMode(false); }}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n >\n <div\n ref={contentRef}\n className=\"ogx__content\"\n style={{\n width: virtualization.totalWidth\n }}\n role=\"presentation\"\n >\n { }\n <Header\n columns={virtualization.virtualColumns}\n allColumns={effectiveColumns}\n columnGroupingModel={columnGroupingModel}\n checkboxSelection={checkboxSelection}\n allSelected={allSelected}\n someSelected={someSelected}\n onSelectAll={handleSelectAll}\n sortModel={sortModel}\n onSort={handleSort}\n onSortAdd={handleSortAdd}\n multiSort={multiSort}\n\n onColumnResize={handleColumnResize}\n columnWidths={columnWidths}\n pinnedColumns={effectivePinnedColumns}\n\n focusedCell={focusedCell}\n onHeaderClick={(field) => {\n setFocusedCell({ id: 'HEADER', field });\n setKeyboardMode(false);\n gridRef.current?.focus({ preventScroll: true });\n }}\n onDragStart={columnGroupingModel ? undefined : columnReorderHandlers.onDragStart}\n onDragOver={columnGroupingModel ? undefined : columnReorderHandlers.onDragOver}\n onDragEnd={columnGroupingModel ? undefined : columnReorderHandlers.onDragEnd}\n onDrop={columnGroupingModel ? undefined : columnReorderHandlers.onDrop}\n draggedColumn={columnGroupingModel ? undefined : columnReorderHandlers.draggedColumn}\n dragOverColumn={columnGroupingModel ? undefined : columnReorderHandlers.dragOverColumn}\n rowReordering={rowReordering}\n hasDetailPanel={hasDetailPanel}\n pinCheckboxColumn={pinCheckboxColumn}\n pinExpandColumn={pinExpandColumn}\n aggregationModel={aggregationModel}\n onHideColumn={(field) => {\n handleColumnVisibilityModelChange({\n ...columnVisibilityModel,\n [field]: false,\n });\n }}\n onManageColumns={() => setColumnsPanelOpen(true)}\n onPinColumn={(field, side) => {\n const left = [...(pinnedColumns?.left ?? [])];\n const right = [...(pinnedColumns?.right ?? [])];\n\n const cleanLeft = left.filter(f => f !== field);\n const cleanRight = right.filter(f => f !== field);\n if (side === 'left') {\n handlePinnedColumnsChange({ left: [...cleanLeft, field], right: cleanRight });\n } else if (side === 'right') {\n handlePinnedColumnsChange({ left: cleanLeft, right: [...cleanRight, field] });\n } else {\n handlePinnedColumnsChange({ left: cleanLeft, right: cleanRight });\n }\n }}\n />\n\n {/* Empty State Overlay (Standard View) — showing after header */}\n {!effectiveLoading && !state.dataSource.error && filteredRows.length === 0 && (\n <GridEmptyState\n noRowsLabel={effectiveNoRowsLabel}\n width={virtualization.totalWidth}\n overlay={NoRowsOverlaySlot ? <NoRowsOverlaySlot {...slotProps?.noRowsOverlay} /> : undefined}\n />\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 onRowDoubleClick={onRowDoubleClick}\n onCellClick={handleCellClick}\n onSelectionChange={handleSelectionChange}\n columnWidths={columnWidths}\n pinnedColumns={effectivePinnedColumns}\n pinnedRows={pinnedRows}\n hasDetailPanel={hasDetailPanel}\n expandedRowIds={expandedRowIds}\n getDetailPanelContent={getDetailPanelContent}\n getDetailPanelHeight={getDetailPanelHeight}\n onDetailPanelToggle={handleDetailPanelToggle}\n pinCheckboxColumn={pinCheckboxColumn}\n pinExpandColumn={pinExpandColumn}\n focusedCell={focusedCell}\n colspanMap={spanning.colspanMap}\n rowSpanningCaches={spanning.rowSpanningState.caches}\n rowHeight={effectiveRowHeight}\n rowMetaMap={rowMetaMap}\n />\n\n <GridVirtualRows<R>\n virtualContainerHeight={virtualization.totalHeight - virtualization.pinnedTopHeight - virtualization.pinnedBottomHeight}\n offsetTop={virtualization.offsetTop}\n effectiveLoading={effectiveLoading}\n visibleRows={visibleRows}\n baseColumns={columns as unknown as GridColDef<R>[]}\n virtualColumns={virtualization.virtualColumns}\n viewportWidth={state.dimensions.viewportWidth}\n checkboxSelection={checkboxSelection}\n hasDetailPanel={hasDetailPanel}\n rowReordering={rowReordering}\n rowHeight={effectiveRowHeight}\n pinnedRows={pinnedRows}\n selectedRowIds={selectedRowIds}\n onRowClick={handleRowClick}\n onRowDoubleClick={onRowDoubleClick}\n onCellClick={handleCellClick}\n onSelectionChange={handleSelectionChange}\n columnWidths={columnWidths}\n pinnedColumns={effectivePinnedColumns}\n expandedRowIds={expandedRowIds}\n getDetailPanelContent={getDetailPanelContent}\n getDetailPanelHeight={getDetailPanelHeight}\n onDetailPanelToggle={handleDetailPanelToggle}\n pinCheckboxColumn={pinCheckboxColumn}\n pinExpandColumn={pinExpandColumn}\n rowReorderHandlers={rowReorderHandlers}\n editingHandlers={editingHandlers}\n focusedCell={focusedCell}\n colspanMap={spanning.colspanMap}\n rowSpanningCaches={spanning.rowSpanningState.caches}\n paginationMode={paginationMode}\n dataSourceLoading={state.dataSource.loading}\n sortedUnpinnedRowCount={sortedUnpinnedRows.length}\n infiniteScrollSkeletonCount={Math.min(effectivePaginationModel.pageSize, 20)}\n unpinnedRowsLength={layout.unpinnedRowsLength}\n rowMetaMap={rowMetaMap}\n loadingOverlay={LoadingOverlaySlot ? <LoadingOverlaySlot {...slotProps?.loadingOverlay} /> : undefined}\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 onRowDoubleClick={onRowDoubleClick}\n onCellClick={handleCellClick}\n onSelectionChange={handleSelectionChange}\n columnWidths={columnWidths}\n pinnedColumns={effectivePinnedColumns}\n pinnedRows={pinnedRows}\n hasDetailPanel={hasDetailPanel}\n expandedRowIds={expandedRowIds}\n getDetailPanelContent={getDetailPanelContent}\n getDetailPanelHeight={getDetailPanelHeight}\n onDetailPanelToggle={handleDetailPanelToggle}\n pinCheckboxColumn={pinCheckboxColumn}\n pinExpandColumn={pinExpandColumn}\n focusedCell={focusedCell}\n colspanMap={spanning.colspanMap}\n rowSpanningCaches={spanning.rowSpanningState.caches}\n rowHeight={effectiveRowHeight}\n rowMetaMap={rowMetaMap}\n />\n\n {/* Aggregation Footer Row — suppressed in pivot mode because pivot rows\n already contain pre-aggregated values with synthetic field keys\n (e.g. 'Q1\\u001frevenue\\u001fsum') that don't match aggregationModel keys. */}\n {hasAggregation && !pivotMode && (\n <GridAggregationFooter\n columns={orderedColumns as unknown as GridColDef[]}\n aggregationModel={aggregationModel}\n aggregationResult={aggregationResult}\n columnWidths={resolvedColumnWidths}\n rowHeight={effectiveRowHeight}\n checkboxSelection={checkboxSelection}\n hasDetailPanel={hasDetailPanel}\n rowReordering={rowReordering}\n pinnedColumns={effectivePinnedColumns}\n />\n )}\n\n </div>\n </div>\n )}\n\n {!listView && FooterSlot && (\n <FooterSlot\n apiRef={gridData.apiRef}\n aggregationModel={aggregationModel}\n aggregationResult={hasAggregation ? aggregationResult : null}\n rowCount={isRowGrouping ? effectiveRows.length : sortedUnpinnedRows.length}\n pagination={pagination}\n paginationModel={effectivePaginationModel}\n pageSizeOptions={pageSizeOptions}\n onPaginationModelChange={handlePaginationModelChange}\n {...slotProps?.footer}\n />\n )}\n\n {!listView && !FooterSlot && pagination && (() => {\n const PaginationComponent = slots?.pagination || Pagination;\n return (\n <PaginationComponent\n page={effectivePaginationModel.page}\n pageSize={effectivePaginationModel.pageSize}\n rowCount={state.pagination.rowCount}\n pageSizeOptions={pageSizeOptions}\n onPageChange={(newPage: number) => handlePaginationModelChange({ ...effectivePaginationModel, page: newPage })}\n onPageSizeChange={(newPageSize: number) => handlePaginationModelChange({ ...effectivePaginationModel, pageSize: newPageSize, page: 0 })}\n localeText={localeText ? {\n paginationRowsPerPage: localeText.paginationRowsPerPage,\n paginationOf: localeText.paginationOf,\n paginationPage: localeText.paginationPage,\n } : undefined}\n {...slotProps?.pagination}\n />\n );\n })()}\n\n {/* Accessibility Live Region */}\n <div className=\"ogx-aria-live-status\" role=\"status\" aria-live=\"polite\">\n {effectiveLoading ? 'Loading data...' : ''}\n {state.dataSource.error ? `Error: ${state.dataSource.error instanceof Error ? state.dataSource.error.message : 'Unknown error'}` : ''}\n {!loading && !state.dataSource.error && (\n filteredRows.length === 0\n ? effectiveNoRowsLabel\n : (filterModel && ((filterModel.quickFilterValues?.length || 0) > 0 || (filterModel.items?.length || 0) > 0))\n ? `${filteredRows.length} ${filteredRows.length === 1 ? 'row' : 'rows'} found`\n : ''\n )}\n </div>\n\n <GridErrorOverlay error={state.dataSource.error} />\n </div>\n );\n}\n","\n\nexport interface SkeletonProps {\n rows?: number;\n columns?: number;\n}\n\nexport function Skeleton({ rows = 5, columns = 5 }: SkeletonProps) {\n return (\n <div className=\"ogx__skeleton\">\n {Array.from({ length: rows }).map((_, rowIndex) => (\n <div key={rowIndex} className=\"ogx__skeleton-row\">\n {Array.from({ length: columns }).map((_, colIndex) => (\n <div key={colIndex} className=\"ogx__skeleton-cell\">\n <div className=\"ogx__skeleton-content\" />\n </div>\n ))}\n </div>\n ))}\n </div>\n );\n}\n","import React, { useCallback, useEffect, useId, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport type {\n GridFilterModel,\n GridFilterItem,\n GridColDef,\n GridFilterOperator\n} from '../../types';\nimport { getOperatorsForType } from '../../utils/filtering';\n\n\ninterface FilterPanelProps {\n filterModel: GridFilterModel;\n columns: GridColDef[];\n onFilterModelChange: (model: GridFilterModel) => void;\n}\n\nconst NO_VALUE_OPERATORS = new Set(['isEmpty', 'isNotEmpty']);\n\nfunction getActiveFilter(items: GridFilterItem[], field: string): GridFilterItem | undefined {\n return items.find(item => 'field' in item && item.field === field) as GridFilterItem | undefined;\n}\n\nconst FilterRow: React.FC<{\n col: GridColDef;\n item: GridFilterItem | undefined;\n onChange: (item: GridFilterItem | null) => void;\n}> = ({ col, item, onChange }) => {\n const filterId = useId();\n const operators = getOperatorsForType(col.type);\n const isActive = !!item;\n const currentOperator = item?.operator ?? operators[0];\n\n // Local input state to prevent full filter-panel re-render on every keystroke\n const [localValue, setLocalValue] = useState<string>(item?.value != null ? String(item.value) : '');\n const onChangeRef = useRef(onChange);\n const itemRef = useRef(item);\n const colFieldRef = useRef(col.field);\n const operatorRef = useRef(currentOperator);\n useLayoutEffect(() => {\n onChangeRef.current = onChange;\n itemRef.current = item;\n colFieldRef.current = col.field;\n operatorRef.current = currentOperator;\n });\n\n // Sync when the external item changes (e.g. operator change, clear)\n const prevItemValue = useRef(item?.value);\n useEffect(() => {\n if (item?.value !== prevItemValue.current) {\n prevItemValue.current = item?.value;\n setLocalValue(item?.value != null ? String(item.value) : '');\n }\n }, [item?.value]);\n\n // Debounce propagating the value upward (300ms)\n useEffect(() => {\n const handler = setTimeout(() => {\n const currentItem = itemRef.current;\n const currentValue = currentItem?.value ?? '';\n if (localValue !== currentValue) {\n onChangeRef.current({\n id: currentItem?.id ?? `${colFieldRef.current}-${Date.now()}`,\n field: colFieldRef.current,\n operator: operatorRef.current as GridFilterOperator,\n value: localValue,\n });\n }\n }, 300);\n return () => clearTimeout(handler);\n }, [localValue]);\n\n const handleOperatorChange = (op: string) => {\n const noValue = NO_VALUE_OPERATORS.has(op);\n const newItem: GridFilterItem = {\n id: item?.id ?? `${col.field}-${Date.now()}`,\n field: col.field,\n operator: op as GridFilterOperator,\n value: noValue ? undefined : (item?.value ?? (col.type === 'boolean' ? 'true' : '')),\n };\n onChange(newItem);\n };\n\n const handleClear = () => {\n setLocalValue('');\n onChange(null);\n };\n\n const isNoValue = NO_VALUE_OPERATORS.has(String(currentOperator));\n const isBoolean = col.type === 'boolean';\n const showValue = !isNoValue;\n\n return (\n <div className={`ogx-filter__row${isActive ? ' ogx-filter__row--active' : ''}`}>\n { }\n <span className=\"ogx-filter__col-label\" title={col.field}>\n {col.headerName || col.field}\n </span>\n\n { }\n <div className=\"ogx-filter__controls\">\n { }\n <select\n id={`${filterId}-op`}\n name={`filter-op-${col.field}`}\n className={`ogx-filter__op-select${isActive ? ' ogx-filter__op-select--active' : ''}`}\n value={String(currentOperator)}\n onChange={(e) => handleOperatorChange(e.target.value)}\n aria-label={`Filter operator for ${col.headerName || col.field}`}\n >\n {operators.map(op => (\n <option key={op} value={op}>{op}</option>\n ))}\n </select>\n\n { }\n {showValue && isBoolean && (\n <select\n id={`${filterId}-val`}\n name={`filter-val-${col.field}`}\n className={`ogx-filter__value-input ogx-filter__value-select${isActive ? ' ogx-filter__value-input--active' : ''}`}\n value={String(item?.value ?? 'true')}\n onChange={(e) => {\n setLocalValue(e.target.value);\n onChange({\n id: item?.id ?? `${col.field}-${Date.now()}`,\n field: col.field,\n operator: currentOperator as GridFilterOperator,\n value: e.target.value,\n });\n }}\n aria-label={`Filter value for ${col.headerName || col.field}`}\n >\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n )}\n\n {showValue && !isBoolean && (\n <input\n id={`${filterId}-val`}\n name={`filter-val-${col.field}`}\n className={`ogx-filter__value-input${isActive ? ' ogx-filter__value-input--active' : ''}`}\n type=\"text\"\n value={localValue}\n onChange={(e) => setLocalValue(e.target.value)}\n placeholder={col.type === 'number' ? 'Number…' : 'Value…'}\n aria-label={`Filter value for ${col.headerName || col.field}`}\n />\n )}\n\n {/* Clear button — only when active */}\n {isActive && (\n <button\n className=\"ogx-filter__row-clear\"\n onClick={handleClear}\n aria-label={`Clear filter for ${col.headerName || col.field}`}\n title=\"Clear\"\n >\n ×\n </button>\n )}\n </div>\n </div>\n );\n};\n\n// ── Root panel ────────────────────────────────────────────────────────────────\n\nexport const FilterPanel: React.FC<FilterPanelProps> = ({ filterModel, columns, onFilterModelChange }) => {\n const items = useMemo<GridFilterItem[]>(() => (filterModel.items ?? []) as GridFilterItem[], [filterModel.items]);\n const logicOperator = filterModel.logicOperator ?? 'and';\n\n const handleItemChange = useCallback((field: string, newItem: GridFilterItem | null) => {\n const rest = items.filter(i => 'field' in i && (i as GridFilterItem).field !== field);\n const next: GridFilterItem[] = newItem ? [...rest, newItem] : rest;\n onFilterModelChange({ ...filterModel, items: next });\n }, [items, filterModel, onFilterModelChange]);\n\n const handleLogicChange = useCallback((op: 'and' | 'or') => {\n onFilterModelChange({ ...filterModel, logicOperator: op });\n }, [filterModel, onFilterModelChange]);\n\n const filterableColumns = columns.filter(col => col.filterable !== false);\n\n return (\n <>\n { }\n {items.length > 1 && (\n <div className=\"ogx-filter__logic-bar\">\n <span className=\"ogx-filter__logic-label\">Match:</span>\n <button\n className={`ogx-filter__logic-pill${logicOperator === 'and' ? ' ogx-filter__logic-pill--active' : ''}`}\n onClick={() => handleLogicChange('and')}\n aria-pressed={logicOperator === 'and'}\n >\n ALL (AND)\n </button>\n <button\n className={`ogx-filter__logic-pill${logicOperator === 'or' ? ' ogx-filter__logic-pill--active' : ''}`}\n onClick={() => handleLogicChange('or')}\n aria-pressed={logicOperator === 'or'}\n >\n ANY (OR)\n </button>\n </div>\n )}\n\n { }\n {filterableColumns.length === 0 ? (\n <div className=\"ogx-filter__empty\">No filterable columns.</div>\n ) : (\n filterableColumns.map(col => (\n <FilterRow\n key={col.field}\n col={col}\n item={getActiveFilter(items, col.field)}\n onChange={(item) => handleItemChange(col.field, item)}\n />\n ))\n )}\n </>\n );\n};\n","import React, { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport ReactDOM from 'react-dom';\nimport type { GridColDef } from '../../types';\nimport type { GridPivotModel, GridPivotAggFn, GridPivotValueField } from '../../types';\n\nconst AGG_FNS: GridPivotAggFn[] = ['sum', 'avg', 'count', 'min', 'max'];\n\nexport function PivotIcon() {\n return (\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" fill=\"currentColor\" opacity=\"0.25\" />\n <path d=\"M17 14v-4M17 10l-2 2 2 2\" />\n </svg>\n );\n}\n\nexport interface PivotPanelProps {\n anchorRef: React.RefObject<HTMLButtonElement | null>;\n columns: GridColDef[];\n model: GridPivotModel;\n onChange: (model: GridPivotModel) => void;\n onClose: () => void;\n}\n\nexport function PivotPanel({ anchorRef, columns, model, onChange, onClose }: PivotPanelProps) {\n const panelRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState({ top: 0, right: 0 });\n const [portalContainer, setPortalContainer] = useState<Element>(document.body);\n\n useLayoutEffect(() => {\n setPortalContainer(anchorRef.current?.closest('.ogx-theme-provider') ?? document.body);\n }, [anchorRef]);\n\n const computePos = useCallback(() => {\n if (!anchorRef.current) return { top: 0, right: 0 };\n const rect = anchorRef.current.getBoundingClientRect();\n return { top: rect.bottom + 6, right: window.innerWidth - rect.right };\n }, [anchorRef]);\n\n useEffect(() => {\n setPos(computePos());\n const update = () => setPos(computePos());\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n return () => {\n window.removeEventListener('scroll', update, true);\n window.removeEventListener('resize', update);\n };\n }, [computePos]);\n\n useEffect(() => {\n function onClick(e: MouseEvent) {\n if (\n panelRef.current && !panelRef.current.contains(e.target as Node) &&\n anchorRef.current && !anchorRef.current.contains(e.target as Node)\n ) onClose();\n }\n function onKey(e: KeyboardEvent) { if (e.key === 'Escape') onClose(); }\n document.addEventListener('mousedown', onClick);\n document.addEventListener('keydown', onKey);\n return () => {\n document.removeEventListener('mousedown', onClick);\n document.removeEventListener('keydown', onKey);\n };\n }, [anchorRef, onClose]);\n\n const inRow = new Set(model.rowFields);\n const inCol = new Set(model.columnFields);\n const inValue = new Set(model.valueFields.map((v) => v.field));\n const isUsed = (f: string) => inRow.has(f) || inCol.has(f) || inValue.has(f);\n\n function addRow(field: string) {\n if (inRow.has(field)) return;\n onChange({ ...model, rowFields: [...model.rowFields, field] });\n }\n function addCol(field: string) {\n if (inCol.has(field)) return;\n onChange({ ...model, columnFields: [...model.columnFields, field] });\n }\n function addValue(field: string, aggFn: GridPivotAggFn = 'sum') {\n if (inValue.has(field)) return;\n onChange({ ...model, valueFields: [...model.valueFields, { field, aggFn }] });\n }\n function removeRow(field: string) {\n onChange({ ...model, rowFields: model.rowFields.filter((f) => f !== field) });\n }\n function removeCol(field: string) {\n onChange({ ...model, columnFields: model.columnFields.filter((f) => f !== field) });\n }\n function removeValue(field: string) {\n onChange({ ...model, valueFields: model.valueFields.filter((v) => v.field !== field) });\n }\n function changeValueFn(field: string, aggFn: GridPivotAggFn) {\n onChange({\n ...model,\n valueFields: model.valueFields.map((v) => v.field === field ? { ...v, aggFn } : v),\n });\n }\n function reset() {\n onChange({ rowFields: [], columnFields: [], valueFields: [] });\n }\n\n const numericFields = new Set(columns.filter((c) => c.type === 'number' || c.aggregable).map((c) => c.field));\n\n const totalActive = model.rowFields.length + model.columnFields.length + model.valueFields.length;\n\n const colLabel = (field: string) =>\n columns.find((c) => c.field === field)?.headerName ?? field;\n\n const panel = (\n <div\n ref={panelRef}\n className=\"ogx-pivot-panel\"\n role=\"dialog\"\n aria-label=\"Pivot configuration\"\n style={{ top: pos.top, right: pos.right }}\n >\n { }\n <div className=\"ogx-pivot-panel__header\">\n <span className=\"ogx-pivot-panel__title\">\n <PivotIcon />\n Pivot Mode\n </span>\n {totalActive > 0 && (\n <button className=\"ogx-pivot-panel__reset-btn\" onClick={reset} title=\"Reset pivot\">\n Reset\n </button>\n )}\n </div>\n\n <div className=\"ogx-pivot-panel__body\">\n\n { }\n <div className=\"ogx-pivot-zone\">\n <span className=\"ogx-pivot-zone__label\">\n <span className=\"ogx-pivot-zone__dot ogx-pivot-zone__dot--row\" />\n Row Fields\n </span>\n <div\n className={`ogx-pivot-chips${model.rowFields.length === 0 ? ' ogx-pivot-chips--empty' : ''}`}\n data-placeholder=\"Add fields here — each becomes a row label\"\n >\n {model.rowFields.map((f) => (\n <span key={f} className=\"ogx-pivot-chip ogx-pivot-chip--row\">\n {colLabel(f)}\n <button className=\"ogx-pivot-chip__remove\" onClick={() => removeRow(f)} title={`Remove ${colLabel(f)}`}>×</button>\n </span>\n ))}\n </div>\n </div>\n\n { }\n <div className=\"ogx-pivot-zone\">\n <span className=\"ogx-pivot-zone__label\">\n <span className=\"ogx-pivot-zone__dot ogx-pivot-zone__dot--col\" />\n Column Fields\n </span>\n <div\n className={`ogx-pivot-chips${model.columnFields.length === 0 ? ' ogx-pivot-chips--empty' : ''}`}\n data-placeholder=\"Add fields here — unique values become column headers\"\n >\n {model.columnFields.map((f) => (\n <span key={f} className=\"ogx-pivot-chip ogx-pivot-chip--col\">\n {colLabel(f)}\n <button className=\"ogx-pivot-chip__remove\" onClick={() => removeCol(f)} title={`Remove ${colLabel(f)}`}>×</button>\n </span>\n ))}\n </div>\n </div>\n\n { }\n <div className=\"ogx-pivot-zone\">\n <span className=\"ogx-pivot-zone__label\">\n <span className=\"ogx-pivot-zone__dot ogx-pivot-zone__dot--value\" />\n Value Fields (aggregated)\n </span>\n <div\n className={`ogx-pivot-chips${model.valueFields.length === 0 ? ' ogx-pivot-chips--empty' : ''}`}\n data-placeholder=\"Add numeric fields here — values are aggregated\"\n >\n {model.valueFields.map((vf: GridPivotValueField) => (\n <span key={vf.field} className=\"ogx-pivot-chip ogx-pivot-chip--value\">\n {colLabel(vf.field)}\n <select\n className=\"ogx-pivot-chip__fn-select\"\n value={vf.aggFn}\n onChange={(e) => changeValueFn(vf.field, e.target.value as GridPivotAggFn)}\n title=\"Aggregation function\"\n >\n {AGG_FNS.map((fn) => (\n <option key={fn} value={fn}>{fn.toUpperCase()}</option>\n ))}\n </select>\n <button className=\"ogx-pivot-chip__remove\" onClick={() => removeValue(vf.field)} title={`Remove ${colLabel(vf.field)}`}>×</button>\n </span>\n ))}\n </div>\n </div>\n\n <hr className=\"ogx-pivot-panel__divider\" />\n\n { }\n <div>\n <div className=\"ogx-pivot-panel__fields-label\">Available Fields</div>\n <div className=\"ogx-pivot-fields\">\n {columns.map((col) => {\n const isNum = numericFields.has(col.field);\n const used = isUsed(col.field);\n if (used) return null;\n return (\n <div key={col.field} style={{ display: 'flex', alignItems: 'center', gap: 3 }}>\n <span className={`ogx-pivot-field-btn${isNum ? ' ogx-pivot-field-btn--numeric' : ''}`}>\n {col.headerName ?? col.field}\n </span>\n <div className=\"ogx-pivot-field-actions\">\n <button className=\"ogx-pivot-add-btn ogx-pivot-add-btn--row\" onClick={() => addRow(col.field)} title=\"Add to Row Fields\">Row</button>\n <button className=\"ogx-pivot-add-btn ogx-pivot-add-btn--col\" onClick={() => addCol(col.field)} title=\"Add to Column Fields\">Col</button>\n {isNum && (\n <button className=\"ogx-pivot-add-btn ogx-pivot-add-btn--value\" onClick={() => addValue(col.field)} title=\"Add to Value Fields\">Val</button>\n )}\n </div>\n </div>\n );\n })}\n {columns.every((col) => isUsed(col.field)) && (\n <span style={{ fontSize: 12, color: 'var(--ogx-color-gray-400, #94a3b8)' }}>\n All fields are in use.\n </span>\n )}\n </div>\n </div>\n\n </div>\n </div>\n );\n\n return ReactDOM.createPortal(panel, portalContainer);\n}\n","import React, { useState, useEffect, useRef, useCallback, useLayoutEffect } from 'react';\n\n\ninterface GlobalSearchProps {\n value?: string;\n onChange: (value: string) => void;\n placeholder?: string;\n debounceMs?: number;\n}\n\nfunction SearchIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n );\n}\n\nfunction CloseIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n );\n}\n\nexport function GlobalSearch({ value = '', onChange, placeholder = 'Search...', debounceMs = 250 }: GlobalSearchProps) {\n const [isExpanded, setIsExpanded] = useState(() => value.length > 0);\n // Fully uncontrolled: localValue is the single source of truth.\n const [localValue, setLocalValue] = useState(value);\n const inputRef = useRef<HTMLInputElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n // Keep onChange always current without adding it to effect deps\n const onChangeRef = useRef(onChange);\n useLayoutEffect(() => { onChangeRef.current = onChange; }, [onChange]);\n // Track the last value we emitted upward\n const lastEmittedRef = useRef(value);\n // Track the last incoming prop value to detect external resets\n const lastIncomingValueRef = useRef(value);\n // Track whether input was focused BEFORE a re-render so we can restore it\n const wasFocusedRef = useRef(false);\n\n // ── Focus preservation across re-renders ─────────────────────────────────\n // When the parent updates filterModel (triggered by our debounce), React\n // re-renders the entire tree. Even though the input element stays mounted,\n // the browser can lose focus during heavy reconciliation. We detect this\n // via useLayoutEffect (runs synchronously after DOM mutations, before paint)\n // and immediately restore focus without any visual flicker.\n useLayoutEffect(() => {\n if (wasFocusedRef.current && document.activeElement !== inputRef.current) {\n inputRef.current?.focus();\n }\n });\n\n // ── External reset detection ──────────────────────────────────────────────\n // Only responds when the PARENT programmatically changes the value\n // (e.g. \"Clear all filters\" button) — not from our own typing.\n useEffect(() => {\n if (value === lastIncomingValueRef.current) return;\n lastIncomingValueRef.current = value;\n\n if (value !== lastEmittedRef.current) {\n setLocalValue(value);\n lastEmittedRef.current = value;\n if (!value) {\n wasFocusedRef.current = false;\n setIsExpanded(false);\n } else {\n setIsExpanded(true);\n }\n }\n }, [value]);\n\n // ── Debounced upward notification ─────────────────────────────────────────\n useEffect(() => {\n const handler = setTimeout(() => {\n if (localValue !== lastEmittedRef.current) {\n lastEmittedRef.current = localValue;\n onChangeRef.current(localValue);\n }\n }, debounceMs);\n return () => clearTimeout(handler);\n }, [localValue, debounceMs]);\n\n const handleExpand = useCallback(() => {\n setIsExpanded(true);\n requestAnimationFrame(() => inputRef.current?.focus());\n }, []);\n\n const handleClear = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n setLocalValue('');\n lastEmittedRef.current = '';\n onChangeRef.current('');\n inputRef.current?.focus();\n }, []);\n\n const handleFocus = useCallback(() => {\n wasFocusedRef.current = true;\n setIsExpanded(true);\n }, []);\n\n // Blur: defer 150ms to allow focus to move within the container first\n // (e.g. clicking the clear button) before deciding to collapse.\n const handleBlur = useCallback(() => {\n wasFocusedRef.current = false;\n setTimeout(() => {\n if (\n containerRef.current &&\n document.activeElement &&\n containerRef.current.contains(document.activeElement)\n ) {\n // Focus is still inside — mark as focused again and abort\n wasFocusedRef.current = true;\n return;\n }\n if (!localValue) {\n setIsExpanded(false);\n }\n }, 150);\n }, [localValue]);\n\n // ── Click outside ─────────────────────────────────────────────────────────\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n if (!localValue) {\n setIsExpanded(false);\n }\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [localValue]);\n\n return (\n <div\n ref={containerRef}\n className={`ogx-global-search${isExpanded ? ' ogx-global-search--expanded' : ''}`}\n onClick={!isExpanded ? handleExpand : undefined}\n >\n <div className=\"ogx-global-search__icon-wrapper\">\n <SearchIcon />\n </div>\n <input\n ref={inputRef}\n className=\"ogx-global-search__input\"\n value={localValue}\n onChange={(e) => setLocalValue(e.target.value)}\n onFocus={handleFocus}\n onBlur={handleBlur}\n placeholder={placeholder}\n aria-label=\"Global Search\"\n autoComplete=\"off\"\n />\n {localValue && (\n <button className=\"ogx-global-search__clear\" onClick={handleClear} aria-label=\"Clear search\">\n <CloseIcon />\n </button>\n )}\n </div>\n );\n}\n","import { useState, useRef, useLayoutEffect, useCallback } from 'react';\nimport ReactDOM from 'react-dom';\nimport './Tooltip.css';\n\ninterface GridTooltipProps {\n title: React.ReactNode;\n children: React.ReactElement;\n placement?: 'top' | 'bottom' | 'left' | 'right';\n enterDelay?: number;\n leaveDelay?: number;\n}\n\nexport function GridTooltip({\n title,\n children,\n placement = 'top',\n enterDelay = 200,\n leaveDelay = 0\n}: GridTooltipProps) {\n const [open, setOpen] = useState(false);\n const [coords, setCoords] = useState({ top: 0, left: 0 });\n const timerRef = useRef<NodeJS.Timeout | null>(null);\n const childRef = useRef<HTMLElement | null>(null);\n\n const updateCoords = useCallback(() => {\n if (!childRef.current) return;\n const rect = childRef.current.getBoundingClientRect();\n\n let t = 0;\n let l = 0;\n\n // Note: These calculations are for positioning absolute relative to document.body\n const scrollX = window.pageXOffset || document.documentElement.scrollLeft;\n const scrollY = window.pageYOffset || document.documentElement.scrollTop;\n\n if (placement === 'top') {\n t = rect.top + scrollY - 8;\n l = rect.left + scrollX + rect.width / 2;\n } else if (placement === 'bottom') {\n t = rect.bottom + scrollY + 8;\n l = rect.left + scrollX + rect.width / 2;\n }\n\n setCoords({ top: t, left: l });\n }, [placement]);\n\n useLayoutEffect(() => {\n if (open) {\n updateCoords();\n window.addEventListener('scroll', updateCoords, true);\n window.addEventListener('resize', updateCoords);\n }\n return () => {\n window.removeEventListener('scroll', updateCoords, true);\n window.removeEventListener('resize', updateCoords);\n };\n }, [open, updateCoords]);\n\n const handleMouseEnter = () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => {\n setOpen(true);\n }, enterDelay);\n };\n\n const handleMouseLeave = () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => {\n setOpen(false);\n }, leaveDelay);\n };\n\n const wrapperRef = useCallback((node: HTMLSpanElement | null) => {\n // Use the first real child element for coordinates, not the wrapper span.\n // display:contents would give zero rects; inline-block wrapper gives correct rects\n // but we want coords from the actual child for pixel-perfect placement.\n childRef.current = node ? (node.firstElementChild as HTMLElement) ?? node : null;\n }, []);\n\n return (\n <>\n <span\n ref={wrapperRef}\n style={{ display: 'inline-block', lineHeight: 0 }}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {children}\n </span>\n {open && title && ReactDOM.createPortal(\n <div\n className={`ogx-tooltip ogx-tooltip--${placement}`}\n style={{\n top: coords.top,\n left: coords.left,\n position: 'absolute',\n zIndex: 99999\n }}\n >\n {title}\n </div>,\n document.body\n )}\n </>\n );\n}\n","import React, { useState, useRef, useEffect, useCallback, useLayoutEffect } from 'react';\nimport ReactDOM from 'react-dom';\nimport type { GridColDef, GridAggregationModel, GridPivotModel, GridFilterModel } from '../../types';\nimport { PivotPanel, PivotIcon } from './PivotPanel';\nimport { GlobalSearch } from './GlobalSearch';\nimport { ColumnVisibilityPanel } from '../ColumnVisibilityPanel/ColumnVisibilityPanel';\nimport { FilterPanel } from '../FilterPanel/FilterPanel';\nimport { GridTooltip } from '../Tooltip/Tooltip';\n\n/** Props passed to a custom toolbar button renderer. */\nexport interface ToolbarButtonRenderProps {\n /** Call this to toggle the associated panel open/closed. */\n onClick: () => void;\n /** Whether the associated panel is currently open. */\n isOpen: boolean;\n /** Number of active items (filters applied, aggregations configured, etc.). */\n activeCount: number;\n}\n\n/** Props passed to a custom quick-filter renderer. */\nexport interface ToolbarQuickFilterRenderProps {\n /** Current search string. */\n value: string;\n /** Call with the new search string when the input changes. */\n onChange: (value: string) => void;\n}\n\nexport interface GridToolbarProps {\n columns?: GridColDef[];\n /** Original user-defined columns (before pivot transformation).\n * When provided, the PivotPanel shows these instead of `columns`\n * to prevent pivot-generated synthetic columns from appearing in\n * 'Available Fields' and causing infinite nested aggregations. */\n baseColumns?: GridColDef[];\n aggregationModel?: GridAggregationModel;\n onAggregationModelChange?: (model: GridAggregationModel) => void;\n pivotModel?: GridPivotModel;\n onPivotModelChange?: (model: GridPivotModel) => void;\n filterModel?: GridFilterModel;\n onFilterModelChange?: (model: GridFilterModel) => void;\n columnVisibilityModel?: Record<string, boolean>;\n onColumnVisibilityModelChange?: (model: Record<string, boolean>) => void;\n onColumnReorder?: (fromField: string, toField: string) => void;\n onColumnOrderReset?: () => void;\n forceColumnsOpen?: boolean;\n onColumnsPanelClose?: () => void;\n children?: React.ReactNode;\n rightContent?: React.ReactNode;\n style?: React.CSSProperties;\n /**\n * Replace the built-in Columns button. The columns panel still opens and\n * closes normally — only the trigger element is replaced.\n */\n renderColumnsButton?: (props: ToolbarButtonRenderProps) => React.ReactNode;\n /**\n * Replace the built-in Filters button. The filter panel still opens and\n * closes normally — only the trigger element is replaced.\n */\n renderFilterButton?: (props: ToolbarButtonRenderProps) => React.ReactNode;\n /**\n * Replace the built-in Aggregation/Summaries button. The aggregation panel\n * still opens and closes normally — only the trigger element is replaced.\n */\n renderAggregationButton?: (props: ToolbarButtonRenderProps) => React.ReactNode;\n /**\n * Render an Export button. There is no built-in export button — this slot\n * inserts your element after the Aggregation button in the toolbar action row.\n */\n renderExportButton?: () => React.ReactNode;\n /**\n * Replace the built-in quick-filter search bar. Receives the current search\n * value and an onChange handler; connect them to your own input element.\n */\n renderQuickFilter?: (props: ToolbarQuickFilterRenderProps) => React.ReactNode;\n /** Additional CSS class applied to the toolbar root element. */\n className?: string;\n /** Show columns with `hideable: false` in the Columns panel as disabled rows. Default: false. */\n showNonHideableColumns?: boolean;\n}\n\nconst AGGREGATION_FUNCTIONS = ['none', 'sum', 'avg', 'count', 'min', 'max'] as const;\n\nfunction SigmaIcon() {\n return (\n <svg\n width=\"18\" height=\"18\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"\n strokeLinecap=\"round\" strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 4H6l6 8-6 8h12\" />\n </svg>\n );\n}\n\nfunction ViewColumnIcon() {\n return (\n <svg focusable=\"false\" aria-hidden=\"true\" viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\">\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <rect x=\"8.5\" y=\"4\" width=\"7\" height=\"16\" fill=\"currentColor\" opacity=\"0.25\" />\n <line x1=\"8.5\" y1=\"4\" x2=\"8.5\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <line x1=\"15.5\" y1=\"4\" x2=\"15.5\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <line x1=\"2\" y1=\"9\" x2=\"22\" y2=\"9\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <line x1=\"2\" y1=\"14\" x2=\"22\" y2=\"14\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n </svg>\n );\n}\n\nfunction FilterIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polygon points=\"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3\" />\n </svg>\n );\n}\n\ninterface PanelPosition { top: number; right: number; }\n\nfunction AggregationPanel({\n anchorRef,\n aggregationModel,\n aggregableColumns,\n onFunctionChange,\n onClearAll,\n onClose,\n activeCount,\n}: {\n anchorRef: React.RefObject<HTMLElement | null>;\n aggregationModel: GridAggregationModel;\n aggregableColumns: GridColDef[];\n onFunctionChange: (field: string, fn: string) => void;\n onClearAll: () => void;\n onClose: () => void;\n activeCount: number;\n}) {\n const panelRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState<PanelPosition>({ top: 0, right: 0 });\n const [portalContainer, setPortalContainer] = useState<Element>(document.body);\n\n useLayoutEffect(() => {\n setPortalContainer(anchorRef.current?.closest('.ogx-theme-provider') ?? document.body);\n }, [anchorRef]);\n\n const computePos = useCallback((): PanelPosition => {\n if (!anchorRef.current) return { top: 0, right: 0 };\n const rect = anchorRef.current.getBoundingClientRect();\n return {\n top: rect.bottom + 6,\n right: window.innerWidth - rect.right,\n };\n }, [anchorRef]);\n\n useEffect(() => {\n setPos(computePos());\n const update = () => setPos(computePos());\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n return () => {\n window.removeEventListener('scroll', update, true);\n window.removeEventListener('resize', update);\n };\n }, [computePos]);\n\n useEffect(() => {\n function handleClick(e: MouseEvent) {\n if (\n panelRef.current && !panelRef.current.contains(e.target as Node) &&\n anchorRef.current && !anchorRef.current.contains(e.target as Node)\n ) {\n onClose();\n }\n }\n document.addEventListener('mousedown', handleClick);\n return () => document.removeEventListener('mousedown', handleClick);\n }, [anchorRef, onClose]);\n\n useEffect(() => {\n function onKey(e: KeyboardEvent) { if (e.key === 'Escape') onClose(); }\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [onClose]);\n\n const panel = (\n <div\n ref={panelRef}\n className=\"ogx-toolbar__panel\"\n role=\"dialog\"\n aria-label=\"Summaries configuration\"\n style={{ top: pos.top, right: pos.right, width: 400, maxWidth: 'calc(100vw - 24px)' }}\n >\n <div className=\"ogx-toolbar__panel-header\">\n <span className=\"ogx-toolbar__panel-title\">\n <SigmaIcon />\n Summaries\n </span>\n {activeCount > 0 && (\n <button\n className=\"ogx-toolbar__clear-btn\"\n onClick={onClearAll}\n title=\"Clear all summaries\"\n >\n Clear all\n </button>\n )}\n </div>\n\n <div className=\"ogx-toolbar__panel-body\">\n {aggregableColumns.length === 0 ? (\n <p className=\"ogx-toolbar__empty\">\n No aggregable columns.<br />\n Set <code>aggregable: true</code> on a column to enable.\n </p>\n ) : (\n aggregableColumns.map((col) => {\n const currentFn = aggregationModel[col.field] || 'none';\n return (\n <div key={col.field} className=\"ogx-toolbar__agg-row\">\n <span className=\"ogx-toolbar__agg-label\" title={col.field}>\n {col.headerName || col.field}\n </span>\n <div className=\"ogx-toolbar__agg-pills\">\n {AGGREGATION_FUNCTIONS.map((fn) => (\n <button\n key={fn}\n className={`ogx-toolbar__pill${currentFn === fn ? ' ogx-toolbar__pill--active' : ''}`}\n onClick={() => onFunctionChange(col.field, fn)}\n aria-pressed={currentFn === fn}\n >\n {fn}\n </button>\n ))}\n </div>\n </div>\n );\n })\n )}\n </div>\n </div>\n );\n\n return ReactDOM.createPortal(panel, portalContainer);\n}\n\nfunction ColumnsPanelWrapper({\n anchorRef,\n columns,\n visibleColumns,\n onVisibilityChange,\n onShowAll,\n onHideAll,\n onColumnReorder,\n onColumnOrderReset,\n onClose,\n showNonHideableColumns,\n}: {\n anchorRef: React.RefObject<HTMLElement | null>;\n columns: GridColDef[];\n visibleColumns: Set<string>;\n onVisibilityChange: (field: string, isVisible: boolean) => void;\n onShowAll: () => void;\n onHideAll: () => void;\n onColumnReorder?: (fromField: string, toField: string) => void;\n onColumnOrderReset?: () => void;\n onClose: () => void;\n showNonHideableColumns?: boolean;\n}) {\n const panelRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState<PanelPosition>({ top: 0, right: 0 });\n const [portalContainer, setPortalContainer] = useState<Element>(document.body);\n\n useLayoutEffect(() => {\n setPortalContainer(anchorRef.current?.closest('.ogx-theme-provider') ?? document.body);\n }, [anchorRef]);\n\n const computePos = useCallback((): PanelPosition => {\n if (!anchorRef.current) return { top: 0, right: 0 };\n const rect = anchorRef.current.getBoundingClientRect();\n return {\n top: rect.bottom + 6,\n right: window.innerWidth - rect.right,\n };\n }, [anchorRef]);\n\n useEffect(() => {\n setPos(computePos());\n const update = () => setPos(computePos());\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n return () => {\n window.removeEventListener('scroll', update, true);\n window.removeEventListener('resize', update);\n };\n }, [computePos]);\n\n useEffect(() => {\n function handleClick(e: MouseEvent) {\n if (\n panelRef.current && !panelRef.current.contains(e.target as Node) &&\n anchorRef.current && !anchorRef.current.contains(e.target as Node)\n ) {\n onClose();\n }\n }\n document.addEventListener('mousedown', handleClick);\n return () => document.removeEventListener('mousedown', handleClick);\n }, [anchorRef, onClose]);\n\n const panel = (\n <div\n ref={panelRef}\n className=\"ogx-toolbar__panel\"\n role=\"dialog\"\n aria-label=\"Column visibility\"\n style={{ top: pos.top, right: pos.right, width: 280, padding: 0 }}\n >\n <ColumnVisibilityPanel\n columns={columns}\n visibleColumns={visibleColumns}\n onVisibilityChange={onVisibilityChange}\n onShowAll={onShowAll}\n onHideAll={onHideAll}\n onColumnReorder={onColumnReorder}\n onColumnOrderReset={onColumnOrderReset}\n showNonHideableColumns={showNonHideableColumns}\n />\n </div>\n );\n\n return ReactDOM.createPortal(panel, portalContainer);\n}\n\nfunction FilterPanelWrapper({\n anchorRef,\n columns,\n filterModel,\n onFilterModelChange,\n onClose\n}: {\n anchorRef: React.RefObject<HTMLElement | null>;\n columns: GridColDef[];\n filterModel: GridFilterModel;\n onFilterModelChange: (model: GridFilterModel) => void;\n onClose: () => void;\n}) {\n const panelRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState<PanelPosition>({ top: 0, right: 0 });\n // Stable ref for onClose — prevents the mousedown effect from\n // tearing down and re-registering on every filterModel update,\n // which could fire the close callback during the re-register window.\n const onCloseRef = useRef(onClose);\n useLayoutEffect(() => { onCloseRef.current = onClose; }, [onClose]);\n const [portalContainer, setPortalContainer] = useState<Element>(document.body);\n\n useLayoutEffect(() => {\n setPortalContainer(anchorRef.current?.closest('.ogx-theme-provider') ?? document.body);\n }, [anchorRef]);\n\n const computePos = useCallback((): PanelPosition => {\n if (!anchorRef.current) return { top: 0, right: 0 };\n const rect = anchorRef.current.getBoundingClientRect();\n return {\n top: rect.bottom + 6,\n right: window.innerWidth - rect.right,\n };\n }, [anchorRef]);\n\n useEffect(() => {\n setPos(computePos());\n const update = () => setPos(computePos());\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n return () => {\n window.removeEventListener('scroll', update, true);\n window.removeEventListener('resize', update);\n };\n }, [computePos]);\n\n // Only Escape key closes the filter panel automatically.\n // Click-outside is intentionally removed: users need to type in filter\n // inputs without the panel closing. There is an explicit Close button.\n useEffect(() => {\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') onCloseRef.current();\n }\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n // Empty deps — listener is registered once and uses the stable ref\n }, []);\n\n const activeFilterCount = filterModel.items?.length ?? 0;\n\n const handleClearAll = () => {\n onFilterModelChange({ ...filterModel, items: [], logicOperator: 'and' });\n };\n\n const panel = (\n <div\n ref={panelRef}\n className=\"ogx-toolbar__panel ogx-toolbar__panel--filter\"\n role=\"dialog\"\n aria-label=\"Advanced filters\"\n style={{ top: pos.top, right: pos.right, width: 540, maxWidth: 'calc(100vw - 24px)' }}\n >\n <div className=\"ogx-toolbar__panel-header\">\n <span className=\"ogx-toolbar__panel-title\">\n <FilterIcon />\n Filters\n {activeFilterCount > 0 && (\n <span className=\"ogx-toolbar__panel-count\">{activeFilterCount}</span>\n )}\n </span>\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n {activeFilterCount > 0 && (\n <button\n className=\"ogx-toolbar__clear-btn\"\n onClick={handleClearAll}\n title=\"Clear all filters\"\n >\n Clear all\n </button>\n )}\n <button\n className=\"ogx-toolbar__close-btn\"\n onClick={() => onCloseRef.current()}\n title=\"Close filters\"\n aria-label=\"Close filters panel\"\n >\n Close\n </button>\n </div>\n </div>\n\n <div className=\"ogx-toolbar__panel-body ogx-toolbar__panel-body--filter\">\n <FilterPanel\n columns={columns}\n filterModel={filterModel}\n onFilterModelChange={onFilterModelChange}\n />\n </div>\n </div>\n );\n\n return ReactDOM.createPortal(panel, portalContainer);\n}\n\nconst EMPTY_PIVOT: GridPivotModel = { rowFields: [], columnFields: [], valueFields: [] };\n\nexport function GridToolbar({\n columns = [],\n baseColumns,\n aggregationModel = {},\n onAggregationModelChange,\n pivotModel,\n onPivotModelChange,\n filterModel,\n onFilterModelChange,\n columnVisibilityModel = {},\n onColumnVisibilityModelChange,\n onColumnReorder,\n onColumnOrderReset,\n forceColumnsOpen,\n onColumnsPanelClose,\n children,\n rightContent,\n style,\n renderColumnsButton,\n renderFilterButton,\n renderAggregationButton,\n renderExportButton,\n renderQuickFilter,\n className,\n showNonHideableColumns,\n}: GridToolbarProps) {\n const [aggOpen, setAggOpen] = useState(false);\n const [pivotOpen, setPivotOpen] = useState(false);\n const [colsOpen, setColsOpen] = useState(false);\n const [filterOpen, setFilterOpen] = useState(false);\n\n useEffect(() => {\n if (forceColumnsOpen) {\n setColsOpen(true);\n setAggOpen(false);\n setPivotOpen(false);\n setFilterOpen(false);\n }\n }, [forceColumnsOpen]);\n\n const aggButtonRef = useRef<HTMLButtonElement>(null);\n const pivotButtonRef = useRef<HTMLButtonElement>(null);\n const colsButtonRef = useRef<HTMLButtonElement>(null);\n const filterButtonRef = useRef<HTMLButtonElement>(null);\n\n // Wrapper div refs — used as panel anchors when a custom button renderer\n // is provided (the custom element doesn't expose a ref to us).\n const colsWrapperRef = useRef<HTMLDivElement>(null);\n const filterWrapperRef = useRef<HTMLDivElement>(null);\n const aggWrapperRef = useRef<HTMLDivElement>(null);\n\n const currentPivotModel = pivotModel ?? EMPTY_PIVOT;\n const pivotActive = currentPivotModel.rowFields.length > 0\n || currentPivotModel.columnFields.length > 0\n || currentPivotModel.valueFields.length > 0;\n\n const aggregableColumns = columns.filter(\n (c) => c.aggregable !== false && (c.type === 'number' || c.aggregable === true)\n );\n\n const activeCount = Object.keys(aggregationModel).filter(\n (f) => aggregationModel[f] && aggregationModel[f] !== 'none'\n ).length;\n\n const handleFunctionChange = useCallback(\n (field: string, fn: string) => {\n if (!onAggregationModelChange) return;\n const next = { ...aggregationModel };\n if (fn === 'none') {\n delete next[field];\n } else {\n next[field] = fn;\n }\n onAggregationModelChange(next);\n },\n [aggregationModel, onAggregationModelChange]\n );\n\n const clearAllAgg = useCallback(() => {\n onAggregationModelChange?.({});\n }, [onAggregationModelChange]);\n\n const handleSearchChange = useCallback((value: string) => {\n if (!onFilterModelChange) return;\n\n const values = value ? [value] : [];\n const nextModel = {\n ...(filterModel || {}),\n quickFilterValues: values,\n items: filterModel?.items || []\n };\n onFilterModelChange(nextModel);\n }, [filterModel, onFilterModelChange]);\n\n const searchValue = filterModel?.quickFilterValues?.[0] || '';\n const activeFilterCount = (filterModel?.items?.length || 0);\n\n // Column Visibility Logic\n const visibleColumns = new Set(\n columns\n .filter(col => columnVisibilityModel[col.field] !== false) // default true\n .map(col => col.field)\n );\n\n const handleVisibilityChange = useCallback((field: string, isVisible: boolean) => {\n if (!onColumnVisibilityModelChange) return;\n const next = { ...columnVisibilityModel, [field]: isVisible };\n onColumnVisibilityModelChange(next);\n }, [columnVisibilityModel, onColumnVisibilityModelChange]);\n\n // Batch show/hide — build one full model so no stale-closure overwrites\n const handleShowAllColumns = useCallback(() => {\n if (!onColumnVisibilityModelChange) return;\n const next = { ...columnVisibilityModel };\n columns.forEach(col => {\n if (col.hideable !== false) next[col.field] = true;\n });\n onColumnVisibilityModelChange(next);\n }, [columns, columnVisibilityModel, onColumnVisibilityModelChange]);\n\n const handleHideAllColumns = useCallback(() => {\n if (!onColumnVisibilityModelChange) return;\n const next = { ...columnVisibilityModel };\n columns.forEach(col => {\n if (col.hideable !== false) next[col.field] = false;\n });\n onColumnVisibilityModelChange(next);\n }, [columns, columnVisibilityModel, onColumnVisibilityModelChange]);\n\n return (\n <div className={['ogx-toolbar', className].filter(Boolean).join(' ')} role=\"toolbar\" aria-label=\"Grid toolbar\" style={style}>\n {/* Left slot — custom content */}\n {children && <div className=\"ogx-toolbar__left\">{children}</div>}\n\n {/* Spacer */}\n <div className=\"ogx-toolbar__spacer\" />\n\n {/* Right: built-in buttons */}\n <div className=\"ogx-toolbar__actions\">\n {onFilterModelChange && (\n <div className=\"ogx-toolbar__dropdown-wrapper\" style={{ marginRight: 4 }}>\n {renderQuickFilter\n ? renderQuickFilter({ value: searchValue, onChange: handleSearchChange })\n : (\n <GlobalSearch\n value={searchValue}\n onChange={handleSearchChange}\n placeholder=\"Search...\"\n />\n )\n }\n </div>\n )}\n\n {/* Columns Button */}\n {onColumnVisibilityModelChange && (\n <div ref={colsWrapperRef} className=\"ogx-toolbar__dropdown-wrapper\" style={{ marginRight: 4 }}>\n {renderColumnsButton\n ? renderColumnsButton({\n onClick: () => { setColsOpen(o => !o); setAggOpen(false); setPivotOpen(false); setFilterOpen(false); },\n isOpen: colsOpen,\n activeCount: columns.length - visibleColumns.size,\n })\n : (\n <GridTooltip title=\"Columns\">\n <button\n ref={colsButtonRef}\n className={`ogx-toolbar__icon-btn${colsOpen ? ' ogx-toolbar__icon-btn--active' : ''}`}\n aria-label=\"Manage columns\"\n onClick={() => {\n setColsOpen(!colsOpen);\n setAggOpen(false);\n setPivotOpen(false);\n setFilterOpen(false);\n }}\n >\n <ViewColumnIcon />\n </button>\n </GridTooltip>\n )\n }\n {colsOpen && (\n <ColumnsPanelWrapper\n anchorRef={renderColumnsButton ? colsWrapperRef : colsButtonRef}\n columns={columns}\n visibleColumns={visibleColumns}\n onVisibilityChange={handleVisibilityChange}\n onShowAll={handleShowAllColumns}\n onHideAll={handleHideAllColumns}\n onColumnReorder={onColumnReorder}\n onColumnOrderReset={onColumnOrderReset}\n onClose={() => { setColsOpen(false); onColumnsPanelClose?.(); }}\n showNonHideableColumns={showNonHideableColumns}\n />\n )}\n </div>\n )}\n\n {/* Filters Button */}\n {onFilterModelChange && (\n <div ref={filterWrapperRef} className=\"ogx-toolbar__dropdown-wrapper\" style={{ marginRight: 4 }}>\n {renderFilterButton\n ? renderFilterButton({\n onClick: () => { setFilterOpen(o => !o); setAggOpen(false); setPivotOpen(false); setColsOpen(false); },\n isOpen: filterOpen,\n activeCount: activeFilterCount,\n })\n : (\n <GridTooltip title=\"Filters\">\n <button\n ref={filterButtonRef}\n className={`ogx-toolbar__icon-btn${filterOpen ? ' ogx-toolbar__icon-btn--active' : ''}`}\n aria-label=\"Advanced filters\"\n onClick={() => {\n setFilterOpen(!filterOpen);\n setAggOpen(false);\n setPivotOpen(false);\n setColsOpen(false);\n }}\n >\n <FilterIcon />\n {activeFilterCount > 0 && (\n <span className=\"ogx-toolbar__dot\" aria-label=\"Filters active\" />\n )}\n </button>\n </GridTooltip>\n )\n }\n {filterOpen && (\n <FilterPanelWrapper\n anchorRef={renderFilterButton ? filterWrapperRef : filterButtonRef}\n columns={columns}\n filterModel={filterModel || { items: [] }}\n onFilterModelChange={onFilterModelChange}\n onClose={() => setFilterOpen(false)}\n />\n )}\n </div>\n )}\n\n {/* Pivot button */}\n {onPivotModelChange && (\n <div className=\"ogx-toolbar__dropdown-wrapper\" style={{ marginRight: 4 }}>\n <GridTooltip title=\"Pivot\">\n <button\n ref={pivotButtonRef}\n className={`ogx-toolbar__icon-btn${pivotOpen ? ' ogx-toolbar__icon-btn--active' : ''}`}\n aria-label=\"Configure pivot\"\n aria-expanded={pivotOpen}\n onClick={() => {\n setPivotOpen(!pivotOpen);\n setAggOpen(false);\n setColsOpen(false);\n setFilterOpen(false);\n }}\n >\n <PivotIcon />\n {pivotActive && (\n <span className=\"ogx-toolbar__dot\" aria-label=\"Pivot active\" />\n )}\n </button>\n </GridTooltip>\n\n {pivotOpen && (\n <PivotPanel\n anchorRef={pivotButtonRef}\n columns={baseColumns ?? columns}\n model={currentPivotModel}\n onChange={(m) => { onPivotModelChange?.(m); }}\n onClose={() => setPivotOpen(false)}\n />\n )}\n </div>\n )}\n\n {/* Summaries button */}\n <div ref={aggWrapperRef} className=\"ogx-toolbar__dropdown-wrapper\" style={{ marginRight: 4 }}>\n {renderAggregationButton\n ? renderAggregationButton({\n onClick: () => { setAggOpen(o => !o); setPivotOpen(false); setColsOpen(false); setFilterOpen(false); },\n isOpen: aggOpen,\n activeCount,\n })\n : (\n <GridTooltip title=\"Summaries\">\n <button\n ref={aggButtonRef}\n className={`ogx-toolbar__icon-btn${aggOpen ? ' ogx-toolbar__icon-btn--active' : ''}`}\n aria-label=\"Configure summaries\"\n aria-expanded={aggOpen}\n onClick={() => {\n setAggOpen(!aggOpen);\n setPivotOpen(false);\n setColsOpen(false);\n setFilterOpen(false);\n }}\n >\n <SigmaIcon />\n {activeCount > 0 && (\n <span className=\"ogx-toolbar__dot\" aria-label={`${activeCount} active summaries`} />\n )}\n </button>\n </GridTooltip>\n )\n }\n\n {aggOpen && (\n <AggregationPanel\n anchorRef={renderAggregationButton ? aggWrapperRef : aggButtonRef}\n aggregationModel={aggregationModel}\n aggregableColumns={aggregableColumns}\n onFunctionChange={handleFunctionChange}\n onClearAll={clearAllAgg}\n onClose={() => setAggOpen(false)}\n activeCount={activeCount}\n />\n )}\n </div>\n\n {/* Export button slot */}\n {renderExportButton && renderExportButton()}\n\n {rightContent}\n </div>\n </div>\n );\n}\n","import { useRef } from 'react';\nimport type { GridApi } from '../../types';\n\n/**\n * Hook to create a ref for the DataGrid API.\n * This ref can be passed to the `apiRef` prop of the `DataGrid` component.\n */\nexport function useGridApiRef() {\n return useRef<GridApi>(null!);\n}\n","\nimport React from 'react';\n\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n fullWidth?: boolean;\n error?: boolean;\n startAdornment?: React.ReactNode;\n endAdornment?: React.ReactNode;\n}\n\nexport const Input: React.FC<InputProps> = ({\n fullWidth = false,\n error = false,\n startAdornment,\n endAdornment,\n className = '',\n ...props\n}) => {\n const wrapperClassNames = [\n 'ogx-input-wrapper',\n fullWidth && 'ogx-input-wrapper--full-width',\n error && 'ogx-input-wrapper--error',\n props.disabled && 'ogx-input-wrapper--disabled',\n className\n ].filter(Boolean).join(' ');\n\n return (\n <div className={wrapperClassNames}>\n {startAdornment && (\n <div className=\"ogx-input__adornment ogx-input__adornment--start\">\n {startAdornment}\n </div>\n )}\n <input\n className=\"ogx-input\"\n {...props}\n />\n {endAdornment && (\n <div className=\"ogx-input__adornment ogx-input__adornment--end\">\n {endAdornment}\n </div>\n )}\n </div>\n );\n};\n","import type {\n GridColDef,\n GridRowModel,\n GridFilterModel,\n PdfExportOptions,\n GridGroupedExportRow,\n} from '../../types';\nimport { formatAggregationValue } from '../../hooks/features/useAggregation';\n\ninterface JsPDFDoc {\n save: (filename: string) => void;\n setFontSize: (size: number) => void;\n setFont: (name: string, style: string) => void;\n setTextColor: (r: number, g: number, b: number) => void;\n text: (text: string, x: number, y: number, opts?: { align?: string }) => void;\n addImage: (data: string, format: string, x: number, y: number, w: number, h: number) => void;\n line: (x1: number, y1: number, x2: number, y2: number) => void;\n setDrawColor: (r: number, g: number, b: number) => void;\n setLineWidth: (w: number) => void;\n setPage: (page: number) => void;\n lastAutoTable: { finalY: number };\n internal: {\n pageSize: { getWidth: () => number; getHeight: () => number };\n getNumberOfPages: () => number;\n };\n getNumberOfPages: () => number;\n}\n\ninterface AutoTableOptions {\n head: string[][];\n body: string[][];\n foot?: string[][];\n startY?: number;\n styles?: Record<string, unknown>;\n headStyles?: Record<string, unknown>;\n alternateRowStyles?: Record<string, unknown>;\n footStyles?: Record<string, unknown>;\n columnStyles?: Record<number, { cellWidth: number }>;\n showFoot?: string;\n showHead?: string;\n margin?: { top: number; left: number; right: number; bottom: number };\n}\n\nfunction hexToRgb(hex: string): [number, number, number] {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n if (!result) return [79, 70, 229];\n return [\n parseInt(result[1], 16),\n parseInt(result[2], 16),\n parseInt(result[3], 16),\n ];\n}\n\nfunction getExportColumns<R extends GridRowModel>(columns: GridColDef<R>[]): GridColDef<R>[] {\n return columns.filter(col => {\n if (col.exportable === false) return false;\n if (col.field === '__check__' || col.field === '__actions__') return false;\n return true;\n });\n}\n\nfunction resolveValue<R extends GridRowModel>(row: R, col: GridColDef<R>): string {\n let value: unknown = (row as GridRowModel)[col.field];\n if (col.valueGetter) {\n value = col.valueGetter({ row, field: col.field, value });\n }\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n return String(value ?? '');\n}\n\nfunction colWeight<R extends GridRowModel>(col: GridColDef<R>): number {\n const w = typeof col.width === 'number' ? col.width : undefined;\n return w ?? (col.flex ?? 1) * 100;\n}\n\nfunction computeColumnStyles<R extends GridRowModel>(\n columns: GridColDef<R>[],\n usableWidth: number\n): Record<number, { cellWidth: number }> {\n const totalWeight = columns.reduce((sum, col) => sum + colWeight(col), 0);\n const styles: Record<number, { cellWidth: number }> = {};\n columns.forEach((col, i) => {\n styles[i] = { cellWidth: (colWeight(col) / totalWeight) * usableWidth };\n });\n return styles;\n}\n\nfunction formatFilterSummary<R extends GridRowModel>(\n filterModel: GridFilterModel,\n columns: GridColDef<R>[]\n): string {\n if (!filterModel.items || filterModel.items.length === 0) return '';\n return filterModel.items\n .flatMap(item => {\n // Only handle leaf GridFilterItem — skip GridFilterGroup (which has 'items')\n if ('items' in item) return [];\n const col = columns.find(c => c.field === item.field);\n const label = col?.headerName ?? item.field;\n const val = item.value !== undefined && item.value !== null ? String(item.value) : '';\n return [`${label} ${item.operator} \"${val}\"`];\n })\n .join(' • ');\n}\n\nexport async function exportToPdf<R extends GridRowModel>(\n rows: R[],\n columns: GridColDef<R>[],\n options: PdfExportOptions = {}\n): Promise<void> {\n // Lazy-load peer deps — provides a clear error if not installed\n let JsPDF: new (opts: Record<string, unknown>) => JsPDFDoc;\n let autoTable: (doc: JsPDFDoc, opts: AutoTableOptions) => void;\n try {\n const [jspdfMod, autoTableMod] = await Promise.all([\n import('jspdf'),\n import('jspdf-autotable'),\n ]);\n JsPDF = jspdfMod.default as unknown as new (opts: Record<string, unknown>) => JsPDFDoc;\n autoTable = autoTableMod.default as unknown as (doc: JsPDFDoc, opts: AutoTableOptions) => void;\n } catch {\n throw new Error(\n \"exportToPdf requires 'jspdf' and 'jspdf-autotable'. Run: npm install jspdf jspdf-autotable\"\n );\n }\n\n const {\n fileName = 'export',\n title,\n logoUrl,\n orientation = 'landscape',\n selectedRows,\n aggregationResult,\n aggregationModel,\n filterModel,\n alternateRowColor = true,\n headerBackgroundColor = '#4f46e5',\n headerTextColor = '#ffffff',\n fontSize = 9,\n groupedRows,\n } = options;\n\n const doc = new JsPDF({ orientation, unit: 'mm', format: 'a4' });\n const pageWidth = doc.internal.pageSize.getWidth();\n const pageHeight = doc.internal.pageSize.getHeight();\n const MARGIN = 14;\n const usableWidth = pageWidth - MARGIN * 2;\n\n const exportColumns = getExportColumns(columns);\n const rowsToExport = selectedRows && selectedRows.length > 0\n ? rows.filter(r => selectedRows.includes(r.id as string | number))\n : rows;\n\n // --- Header block ---\n let startY = MARGIN;\n\n if (title) {\n let cursorX = MARGIN;\n let cursorY = MARGIN + 8;\n\n if (logoUrl) {\n try {\n doc.addImage(logoUrl, 'PNG', cursorX, MARGIN, 10, 10);\n cursorX += 14;\n } catch {\n // logo failed to load — skip silently\n }\n }\n\n doc.setFontSize(16);\n doc.setFont('helvetica', 'bold');\n doc.setTextColor(30, 41, 59);\n doc.text(title, cursorX, cursorY);\n cursorY += 6;\n\n doc.setFontSize(8);\n doc.setFont('helvetica', 'normal');\n doc.setTextColor(100, 116, 139);\n const exportedAt = new Date().toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' });\n const rowCount = groupedRows\n ? groupedRows.filter(e => e.type === 'leaf').length\n : rowsToExport.length;\n doc.text(\n `Exported: ${exportedAt} • ${rowCount} row${rowCount !== 1 ? 's' : ''}`,\n cursorX,\n cursorY\n );\n cursorY += 5;\n\n if (filterModel) {\n const summary = formatFilterSummary(filterModel, columns);\n if (summary) {\n doc.text(`Filters: ${summary}`, cursorX, cursorY);\n cursorY += 5;\n }\n }\n\n doc.setDrawColor(226, 232, 240);\n doc.setLineWidth(0.3);\n doc.line(MARGIN, cursorY + 2, pageWidth - MARGIN, cursorY + 2);\n startY = cursorY + 6;\n }\n\n // --- Build table data ---\n const head = [exportColumns.map(col => col.headerName ?? col.field)];\n\n let body: string[][];\n let foot: string[][] | undefined;\n\n if (groupedRows && groupedRows.length > 0) {\n // Grouped export: flatten the ordered list into body rows with indentation\n body = [];\n const aggMod = aggregationModel || {};\n groupedRows.forEach((entry: GridGroupedExportRow) => {\n if (entry.type === 'group-header') {\n const indent = ' '.repeat(entry.depth * 2);\n const label = `${indent}${entry.groupField ?? ''}: ${String(entry.groupValue ?? '')}`;\n body.push(exportColumns.map((_, i) => i === 0 ? label : ''));\n } else if (entry.type === 'leaf' && entry.row) {\n const row = entry.row as R;\n const indent = ' '.repeat(entry.depth * 2);\n body.push(exportColumns.map((col, i) => (i === 0 ? indent : '') + resolveValue(row, col)));\n } else if (entry.type === 'group-subtotal' && entry.aggregatedValues) {\n const indent = ' '.repeat(entry.depth * 2);\n body.push(exportColumns.map((col, i) => {\n if (i === 0) return `${indent}Subtotal`;\n const aggVal = entry.aggregatedValues![col.field];\n if (aggVal === undefined || aggVal === null) return '';\n let formatted: unknown = aggVal;\n if (col.valueFormatter) formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n else if (aggMod[col.field]) formatted = formatAggregationValue(aggVal, aggMod[col.field] as string);\n return String(formatted);\n }));\n } else if (entry.type === 'grand-total' && entry.aggregatedValues) {\n const footRow = exportColumns.map((col, i) => {\n if (i === 0) return 'Grand Total';\n const aggVal = entry.aggregatedValues![col.field];\n if (aggVal === undefined || aggVal === null) return '';\n let formatted: unknown = aggVal;\n if (col.valueFormatter) formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n else if (aggMod[col.field]) formatted = formatAggregationValue(aggVal, aggMod[col.field] as string);\n return String(formatted);\n });\n foot = [footRow];\n }\n });\n } else {\n body = rowsToExport.map(row => exportColumns.map(col => resolveValue(row, col)));\n\n if (aggregationResult && aggregationModel) {\n const footRow = exportColumns.map((col, i) => {\n if (i === 0) {\n const hasAgg = exportColumns.some(c => aggregationModel[c.field]);\n return hasAgg ? 'TOTAL' : '';\n }\n const aggVal = aggregationResult[col.field];\n if (aggVal === undefined || aggVal === null) return '';\n let formatted: unknown = aggVal;\n if (col.valueFormatter) {\n formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n } else if (aggregationModel[col.field]) {\n formatted = formatAggregationValue(aggVal, aggregationModel[col.field] as string);\n }\n return String(formatted);\n });\n foot = [footRow];\n }\n }\n\n // --- Column widths ---\n const columnStyles = computeColumnStyles(exportColumns, usableWidth);\n\n const [hr, hg, hb] = hexToRgb(headerBackgroundColor);\n const [tr, tg, tb] = hexToRgb(headerTextColor);\n\n autoTable(doc, {\n head,\n body,\n ...(foot ? { foot } : {}),\n startY,\n styles: { fontSize, cellPadding: 3, font: 'helvetica', overflow: 'linebreak' },\n headStyles: {\n fillColor: [hr, hg, hb],\n textColor: [tr, tg, tb],\n fontStyle: 'bold',\n },\n ...(alternateRowColor\n ? { alternateRowStyles: { fillColor: [248, 250, 252] } }\n : {}),\n ...(foot\n ? { footStyles: { fillColor: [241, 245, 249], fontStyle: 'bold', textColor: [0, 0, 0] } }\n : {}),\n columnStyles,\n showFoot: foot ? 'lastPage' : 'never',\n showHead: 'everyPage',\n margin: { top: MARGIN, left: MARGIN, right: MARGIN, bottom: MARGIN + 6 },\n });\n\n // Two-pass page numbering — stamp all pages after the table is fully rendered\n // so each stamp reads the correct final total (not the running count during draw)\n const totalPages = doc.getNumberOfPages();\n for (let i = 1; i <= totalPages; i++) {\n doc.setPage(i);\n doc.setFontSize(8);\n doc.setTextColor(150, 150, 150);\n doc.text(\n `Page ${i} of ${totalPages}`,\n pageWidth - MARGIN,\n pageHeight - 8,\n { align: 'right' }\n );\n }\n\n doc.save(`${fileName}.pdf`);\n}\n","\nimport type { GridColDef, GridRowModel, GridAggregationModel, GridGroupedExportRow } from '../../types';\nimport { formatAggregationValue } from '../../hooks/features/useAggregation';\n\nexport interface CsvExportOptions {\n fileName?: string;\n includeHeaders?: boolean;\n delimiter?: string;\n selectedRows?: (string | number)[];\n aggregationResult?: Record<string, unknown> | null;\n aggregationModel?: GridAggregationModel | null;\n /** When provided, emits group headers, leaf rows, subtotals, and a grand total instead of a flat row list. */\n groupedRows?: GridGroupedExportRow[];\n}\n\nexport function exportToCsv<R extends GridRowModel>(\n rows: R[],\n columns: GridColDef<R>[],\n options: CsvExportOptions = {}\n): void {\n const {\n fileName = 'export.csv',\n includeHeaders = true,\n delimiter = ',',\n selectedRows,\n groupedRows,\n } = options;\n\n const exportColumns = columns.filter(col => {\n if (col.exportable === false) return false;\n if (col.field === '__check__' || col.field === '__actions__') return false;\n return true;\n });\n\n let csvContent = '';\n\n if (groupedRows && groupedRows.length > 0) {\n // Grouped export path\n if (includeHeaders) {\n csvContent += exportColumns.map(col => escapeCSV(col.headerName || col.field)).join(delimiter) + '\\n';\n }\n groupedRows.forEach(entry => {\n if (entry.type === 'group-header') {\n const indent = ' '.repeat(entry.depth);\n const label = `${indent}${entry.groupField ?? ''}: ${String(entry.groupValue ?? '')}`;\n const cells = exportColumns.map((_, i) => i === 0 ? escapeCSV(label) : '');\n csvContent += cells.join(delimiter) + '\\n';\n } else if (entry.type === 'leaf' && entry.row) {\n const row = entry.row as R;\n const indent = ' '.repeat(entry.depth);\n const cells = exportColumns.map((col, i) => {\n let value: unknown = (row as GridRowModel)[col.field];\n if (col.valueGetter) value = col.valueGetter({ row, field: col.field, value });\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n return escapeCSV((i === 0 ? indent : '') + String(value ?? ''));\n });\n csvContent += cells.join(delimiter) + '\\n';\n } else if (entry.type === 'group-subtotal' && entry.aggregatedValues) {\n const indent = ' '.repeat(entry.depth);\n const aggModel = options.aggregationModel || {};\n const cells = exportColumns.map((col, i) => {\n if (i === 0) return escapeCSV(`${indent}Subtotal`);\n const aggVal = entry.aggregatedValues![col.field];\n if (aggVal !== undefined && aggVal !== null) {\n let formatted: unknown = aggVal;\n if (col.valueFormatter) {\n formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n } else if (aggModel[col.field]) {\n formatted = formatAggregationValue(aggVal, aggModel[col.field]);\n }\n return escapeCSV(String(formatted));\n }\n return '';\n });\n csvContent += cells.join(delimiter) + '\\n';\n } else if (entry.type === 'grand-total' && entry.aggregatedValues) {\n const aggModel = options.aggregationModel || {};\n const cells = exportColumns.map((col, i) => {\n if (i === 0) return escapeCSV('Grand Total');\n const aggVal = entry.aggregatedValues![col.field];\n if (aggVal !== undefined && aggVal !== null) {\n let formatted: unknown = aggVal;\n if (col.valueFormatter) {\n formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n } else if (aggModel[col.field]) {\n formatted = formatAggregationValue(aggVal, aggModel[col.field]);\n }\n return escapeCSV(String(formatted));\n }\n return '';\n });\n csvContent += cells.join(delimiter) + '\\n';\n }\n });\n } else {\n // Flat export path (existing behavior)\n const rowsToExport = selectedRows && selectedRows.length > 0\n ? rows.filter(r => selectedRows.includes(r.id))\n : rows;\n\n if (rowsToExport.length === 0) {\n console.warn('No rows to export');\n return;\n }\n\n if (includeHeaders) {\n csvContent += exportColumns.map(col => escapeCSV(col.headerName || col.field)).join(delimiter) + '\\n';\n }\n\n rowsToExport.forEach(row => {\n const values = exportColumns.map(col => {\n let value: unknown = (row as GridRowModel)[col.field];\n if (col.valueGetter) value = col.valueGetter({ row, field: col.field, value });\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n return escapeCSV(String(value ?? ''));\n });\n csvContent += values.join(delimiter) + '\\n';\n });\n\n if (options.aggregationResult) {\n const aggResult = options.aggregationResult;\n const aggModel = options.aggregationModel || {};\n const aggLabels = exportColumns.map(col => escapeCSV(aggModel[col.field] ? aggModel[col.field].toUpperCase() : ''));\n csvContent += aggLabels.join(delimiter) + '\\n';\n const aggValues = exportColumns.map(col => {\n const aggVal = aggResult[col.field];\n if (aggVal !== undefined && aggVal !== null) {\n let formatted: unknown = aggVal;\n if (col.valueFormatter) formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n else if (aggModel[col.field]) formatted = formatAggregationValue(aggVal, aggModel[col.field]);\n return escapeCSV(String(formatted));\n }\n return '';\n });\n csvContent += aggValues.join(delimiter) + '\\n';\n }\n }\n\n downloadFile(csvContent, fileName, 'text/csv;charset=utf-8;');\n}\n\nfunction escapeCSV(value: string): string {\n if (value.includes(',') || value.includes('\"') || value.includes('\\n')) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n}\n\nexport interface ExcelExportOptions {\n fileName?: string;\n sheetName?: string;\n includeHeaders?: boolean;\n selectedRows?: (string | number)[];\n aggregationResult?: Record<string, unknown> | null;\n aggregationModel?: GridAggregationModel | null;\n /** When provided, emits group headers, leaf rows, subtotals, and a grand total instead of a flat row list. */\n groupedRows?: GridGroupedExportRow[];\n}\n\nexport function exportToExcel<R extends GridRowModel>(\n rows: R[],\n columns: GridColDef<R>[],\n options: ExcelExportOptions = {}\n): void {\n const {\n fileName = 'export.xls',\n sheetName = 'Sheet1',\n includeHeaders = true,\n selectedRows,\n groupedRows,\n } = options;\n\n const exportColumns = columns.filter(col => {\n if (col.exportable === false) return false;\n if (col.field === '__check__' || col.field === '__actions__') return false;\n return true;\n });\n\n const header = '<html xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:x=\"urn:schemas-microsoft-com:office:excel\" xmlns=\"http://www.w3.org/TR/REC-html40\">'\n + '<head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>'\n + `<x:Name>${sheetName}</x:Name>`\n + '<x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]-->'\n + '<meta charset=\"UTF-8\"></head><body><table border=\"1\">';\n\n let html = header;\n\n if (includeHeaders) {\n html += '<thead><tr>';\n exportColumns.forEach(col => { html += `<th>${escapeHTML(col.headerName || col.field)}</th>`; });\n html += '</tr></thead>';\n }\n\n html += '<tbody>';\n\n if (groupedRows && groupedRows.length > 0) {\n const aggModel = options.aggregationModel || {};\n groupedRows.forEach(entry => {\n if (entry.type === 'group-header') {\n const indent = '  '.repeat(entry.depth * 2);\n const label = `${indent}${entry.groupField ?? ''}: ${String(entry.groupValue ?? '')}`;\n html += `<tr style=\"font-weight:bold;background:#e8eaf6;\">`;\n html += `<td colspan=\"${exportColumns.length}\">${escapeHTML(label)}</td>`;\n html += '</tr>';\n } else if (entry.type === 'leaf' && entry.row) {\n const row = entry.row as R;\n const indent = '  '.repeat(entry.depth * 2);\n html += '<tr>';\n exportColumns.forEach((col, i) => {\n let value: unknown = (row as GridRowModel)[col.field];\n if (col.valueGetter) value = col.valueGetter({ row, field: col.field, value });\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n html += `<td>${escapeHTML((i === 0 ? indent : '') + String(value ?? ''))}</td>`;\n });\n html += '</tr>';\n } else if ((entry.type === 'group-subtotal' || entry.type === 'grand-total') && entry.aggregatedValues) {\n const isGrand = entry.type === 'grand-total';\n const indent = isGrand ? '' : '  '.repeat(entry.depth * 2);\n const label = isGrand ? 'Grand Total' : `${indent}Subtotal`;\n html += `<tr style=\"font-weight:bold;background:#f5f5f5;\">`;\n exportColumns.forEach((col, i) => {\n if (i === 0) { html += `<td>${escapeHTML(label)}</td>`; return; }\n const aggVal = entry.aggregatedValues![col.field];\n if (aggVal !== undefined && aggVal !== null) {\n let formatted: unknown = aggVal;\n if (col.valueFormatter) formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n else if (aggModel[col.field]) formatted = formatAggregationValue(aggVal, aggModel[col.field]);\n html += `<td style=\"text-align:right;\">${escapeHTML(String(formatted))}</td>`;\n } else {\n html += '<td></td>';\n }\n });\n html += '</tr>';\n }\n });\n } else {\n const rowsToExport = selectedRows && selectedRows.length > 0\n ? rows.filter(r => selectedRows.includes(r.id))\n : rows;\n\n if (rowsToExport.length === 0) {\n console.warn('No rows to export');\n return;\n }\n\n rowsToExport.forEach(row => {\n html += '<tr>';\n exportColumns.forEach(col => {\n let value: unknown = (row as GridRowModel)[col.field];\n if (col.valueGetter) value = col.valueGetter({ row, field: col.field, value });\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n html += `<td>${escapeHTML(String(value ?? ''))}</td>`;\n });\n html += '</tr>';\n });\n\n if (options.aggregationResult) {\n const aggResult = options.aggregationResult;\n const aggModel = options.aggregationModel || {};\n html += '<tr style=\"font-size: 11px; color: #666; background-color: #f5f5f5;\">';\n exportColumns.forEach(col => {\n html += aggModel[col.field]\n ? `<td style=\"text-align:right;font-weight:bold;\">${escapeHTML(aggModel[col.field].toUpperCase())}</td>`\n : '<td></td>';\n });\n html += '</tr><tr style=\"font-weight:bold;background-color:#f5f5f5;\">';\n exportColumns.forEach(col => {\n const aggVal = aggResult[col.field];\n if (aggVal !== undefined && aggVal !== null) {\n let formatted: unknown = aggVal;\n if (col.valueFormatter) formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n else if (aggModel[col.field]) formatted = formatAggregationValue(aggVal, aggModel[col.field]);\n html += `<td style=\"text-align:right;\">${escapeHTML(String(formatted))}</td>`;\n } else {\n html += '<td></td>';\n }\n });\n html += '</tr>';\n }\n }\n\n html += '</tbody></table></body></html>';\n downloadFile(html, fileName, 'application/vnd.ms-excel');\n}\n\nfunction escapeHTML(value: string): string {\n return value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\n}\n\n// ============================================================================\n// JSON Export\n// ============================================================================\n\nexport interface JsonExportOptions {\n fileName?: string;\n pretty?: boolean;\n selectedRows?: (string | number)[];\n aggregationResult?: Record<string, unknown> | null;\n aggregationModel?: GridAggregationModel | null;\n /** When provided, emits a nested grouping tree instead of a flat array. */\n groupedRows?: GridGroupedExportRow[];\n}\n\n/**\n * Export data to JSON format\n */\nexport function exportToJson<R extends GridRowModel>(\n rows: R[],\n columns: GridColDef<R>[],\n options: JsonExportOptions = {}\n): void {\n const {\n fileName = 'export.json',\n pretty = true,\n selectedRows,\n groupedRows,\n } = options;\n\n const exportColumns = columns.filter(col => {\n if (col.exportable === false) return false;\n if (col.field === '__check__' || col.field === '__actions__') return false;\n return true;\n });\n\n type GroupNode = {\n group: string;\n field: string;\n value: unknown;\n rows: Record<string, unknown>[];\n subtotals?: Record<string, unknown>;\n children?: GroupNode[];\n };\n\n type JsonPayload =\n | Record<string, unknown>[]\n | { data: Record<string, unknown>[]; aggregation: { labels: Record<string, unknown>; values: Record<string, unknown> } }\n | { groups: GroupNode[]; grandTotal?: Record<string, unknown> };\n\n let outData: JsonPayload;\n\n if (groupedRows && groupedRows.length > 0) {\n // Build nested tree from the flat ordered list\n const stack: GroupNode[] = [];\n const roots: GroupNode[] = [];\n let grandTotal: Record<string, unknown> | undefined;\n\n groupedRows.forEach(entry => {\n if (entry.type === 'group-header') {\n const node: GroupNode = {\n group: `${entry.groupField ?? ''}: ${String(entry.groupValue ?? '')}`,\n field: entry.groupField ?? '',\n value: entry.groupValue,\n rows: [],\n children: [],\n };\n while (stack.length > entry.depth) stack.pop();\n if (stack.length === 0) {\n roots.push(node);\n } else {\n (stack[stack.length - 1].children ??= []).push(node);\n }\n stack.push(node);\n } else if (entry.type === 'leaf' && entry.row) {\n const row = entry.row as R;\n const obj: Record<string, unknown> = {};\n exportColumns.forEach(col => {\n let value: unknown = (row as GridRowModel)[col.field];\n if (col.valueGetter) value = col.valueGetter({ row, field: col.field, value });\n obj[col.field] = value;\n });\n if (stack.length > 0) stack[stack.length - 1].rows.push(obj);\n } else if (entry.type === 'group-subtotal' && entry.aggregatedValues && stack.length > 0) {\n stack[stack.length - 1].subtotals = { ...entry.aggregatedValues };\n stack.pop();\n } else if (entry.type === 'grand-total' && entry.aggregatedValues) {\n grandTotal = { ...entry.aggregatedValues };\n }\n });\n\n outData = grandTotal ? { groups: roots, grandTotal } : { groups: roots };\n } else {\n const rowsToExport = selectedRows && selectedRows.length > 0\n ? rows.filter(r => selectedRows.includes(r.id))\n : rows;\n\n if (rowsToExport.length === 0) {\n console.warn('No rows to export');\n return;\n }\n\n const data = rowsToExport.map(row => {\n const obj: Record<string, unknown> = {};\n exportColumns.forEach(col => {\n let value: unknown = (row as GridRowModel)[col.field];\n if (col.valueGetter) value = col.valueGetter({ row, field: col.field, value });\n obj[col.field] = value;\n });\n return obj;\n });\n\n if (options.aggregationResult) {\n const aggResult = options.aggregationResult;\n const aggModel = options.aggregationModel || {};\n const summaryLabelObj: Record<string, unknown> = {};\n exportColumns.forEach(col => { if (aggModel[col.field]) summaryLabelObj[col.field] = aggModel[col.field].toUpperCase(); });\n const summaryDataObj: Record<string, unknown> = {};\n exportColumns.forEach(col => {\n if (aggResult[col.field] !== undefined && aggResult[col.field] !== null) {\n let aggVal: unknown = aggResult[col.field];\n if (col.valueFormatter) aggVal = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n else if (aggModel[col.field]) aggVal = formatAggregationValue(aggVal, aggModel[col.field]);\n summaryDataObj[col.field] = aggVal;\n }\n });\n outData = { data, aggregation: { labels: summaryLabelObj, values: summaryDataObj } };\n } else {\n outData = data;\n }\n }\n\n downloadFile(pretty ? JSON.stringify(outData, null, 2) : JSON.stringify(outData), fileName, 'application/json;charset=utf-8;');\n}\n\n// ============================================================================\n// Print\n// ============================================================================\n\nexport interface PrintOptions {\n title?: string;\n selectedRows?: (string | number)[];\n aggregationResult?: Record<string, unknown> | null;\n aggregationModel?: GridAggregationModel | null;\n /** When provided, emits group headers, leaf rows, subtotals, and a grand total instead of a flat row list. */\n groupedRows?: GridGroupedExportRow[];\n}\n\n/**\n * Open print dialog with formatted table\n */\nexport async function printGrid<R extends GridRowModel>(\n rows: R[],\n columns: GridColDef<R>[],\n titleOrOptions?: string | PrintOptions\n): Promise<void> {\n // 1. Open window immediately to resolve user activation constraints and provide feedback\n const printWindow = window.open('', '_blank');\n\n if (!printWindow) {\n console.error('Failed to open print window. Please check your popup blocker settings.');\n return;\n }\n\n // 2. Show loading state\n printWindow.document.write(`\n <!DOCTYPE html>\n <html>\n <head>\n <title>Preparing Print...</title>\n <style>\n body { font-family: sans-serif; height: 100vh; display: flex; align-items: center; justify-content: center; margin: 0; background: #f5f5f5; }\n .loader { text-align: center; }\n .spinner { border: 4px solid #f3f3f3; border-top: 4px solid #3498db; border-radius: 50%; width: 40px; height: 40px; animation: spin 1s linear infinite; margin: 0 auto 20px; }\n @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }\n </style>\n </head>\n <body>\n <div class=\"loader\">\n <div class=\"spinner\"></div>\n <h2>Generating Print Preview...</h2>\n <p>Processing data, please wait.</p>\n </div>\n </body>\n </html>\n `);\n printWindow.document.close();\n\n // 3. Yield to main thread to allow the new window to render its loading state\n await new Promise(resolve => setTimeout(resolve, 100));\n\n try {\n let title = 'Print';\n let selectedRows: (string | number)[] | undefined;\n let aggregationResult: Record<string, unknown> | null = null;\n let aggregationModel: GridAggregationModel | null = null;\n\n let groupedRows: GridGroupedExportRow[] | undefined;\n\n if (typeof titleOrOptions === 'string') {\n title = titleOrOptions;\n } else if (typeof titleOrOptions === 'object') {\n title = titleOrOptions.title || 'Print';\n selectedRows = titleOrOptions.selectedRows;\n aggregationResult = titleOrOptions.aggregationResult || null;\n aggregationModel = titleOrOptions.aggregationModel || null;\n groupedRows = titleOrOptions.groupedRows;\n }\n\n const exportColumns = columns.filter(col => {\n if (col.exportable === false) return false;\n if (col.field === '__check__' || col.field === '__actions__') return false;\n return true;\n });\n\n let html = `<!DOCTYPE html><html><head><title>${title || 'Print'}</title><style>\n body{font-family:Arial,sans-serif;margin:20px;}\n h1{font-size:24px;margin-bottom:20px;}\n table{border-collapse:collapse;width:100%;}\n th,td{border:1px solid #ddd;padding:8px;text-align:left;}\n th{background-color:#f5f5f5;font-weight:bold;}\n tr:nth-child(even){background-color:#f9f9f9;}\n .group-header{background:#e8eaf6;font-weight:bold;}\n .group-subtotal{background:#f0f4ff;font-style:italic;}\n .grand-total{background:#f5f5f5;font-weight:bold;}\n @media print{body{margin:0;}@page{margin:1cm;}}\n </style></head><body>`;\n\n if (title) html += `<h1>${escapeHTML(title)}</h1>`;\n html += '<table><thead><tr>';\n exportColumns.forEach(col => { html += `<th>${escapeHTML(col.headerName || col.field)}</th>`; });\n html += '</tr></thead><tbody>';\n\n if (groupedRows && groupedRows.length > 0) {\n const aggModel = aggregationModel || {};\n groupedRows.forEach(entry => {\n if (entry.type === 'group-header') {\n const indent = '&nbsp;'.repeat(entry.depth * 4);\n const label = `${indent}${escapeHTML(entry.groupField ?? '')}: ${escapeHTML(String(entry.groupValue ?? ''))}`;\n html += `<tr class=\"group-header\"><td colspan=\"${exportColumns.length}\">${label}</td></tr>`;\n } else if (entry.type === 'leaf' && entry.row) {\n const row = entry.row as R;\n const indent = '&nbsp;'.repeat(entry.depth * 4);\n html += '<tr>';\n exportColumns.forEach((col, i) => {\n let value: unknown = (row as GridRowModel)[col.field];\n if (col.valueGetter) value = col.valueGetter({ row, field: col.field, value });\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n if (col.type === 'image' && value) {\n html += `<td><img src=\"${value}\" style=\"max-height:40px;border-radius:4px;\"></td>`;\n } else {\n html += `<td>${(i === 0 ? indent : '') + escapeHTML(String(value ?? ''))}</td>`;\n }\n });\n html += '</tr>';\n } else if ((entry.type === 'group-subtotal' || entry.type === 'grand-total') && entry.aggregatedValues) {\n const isGrand = entry.type === 'grand-total';\n const indent = isGrand ? '' : '&nbsp;'.repeat(entry.depth * 4);\n const label = isGrand ? 'Grand Total' : `${indent}Subtotal`;\n const cls = isGrand ? 'grand-total' : 'group-subtotal';\n html += `<tr class=\"${cls}\">`;\n exportColumns.forEach((col, i) => {\n if (i === 0) { html += `<td>${label}</td>`; return; }\n const aggVal = entry.aggregatedValues![col.field];\n if (aggVal !== undefined && aggVal !== null) {\n let formatted: unknown = aggVal;\n if (col.valueFormatter) formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n else if (aggModel[col.field]) formatted = formatAggregationValue(aggVal, aggModel[col.field]);\n html += `<td style=\"text-align:right;\">${escapeHTML(String(formatted))}</td>`;\n } else {\n html += '<td></td>';\n }\n });\n html += '</tr>';\n }\n });\n } else {\n const rowsToExport = selectedRows && selectedRows.length > 0\n ? rows.filter(r => selectedRows.includes(r.id))\n : rows;\n\n if (rowsToExport.length === 0) {\n printWindow.document.body.innerHTML = '<h3>No rows to export</h3>';\n return;\n }\n\n rowsToExport.forEach(row => {\n html += '<tr>';\n exportColumns.forEach(col => {\n let value: unknown = (row as GridRowModel)[col.field];\n if (col.valueGetter) value = col.valueGetter({ row, field: col.field, value });\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n if (col.type === 'image' && value) {\n html += `<td><div style=\"display:flex;justify-content:center;\"><img src=\"${value}\" alt=\"${col.headerName}\" style=\"max-height:40px;border-radius:4px;\"></div></td>`;\n } else {\n html += `<td>${escapeHTML(String(value ?? ''))}</td>`;\n }\n });\n html += '</tr>';\n });\n\n if (aggregationResult) {\n const aggModel = aggregationModel || {};\n html += '<tfoot><tr style=\"font-size:11px;color:#666;background-color:#f5f5f5;\">';\n exportColumns.forEach(col => {\n html += aggModel[col.field]\n ? `<td style=\"text-align:right;font-weight:bold;\">${escapeHTML(aggModel[col.field].toUpperCase())}</td>`\n : '<td></td>';\n });\n html += '</tr><tr style=\"font-weight:bold;background-color:#f5f5f5;\">';\n exportColumns.forEach(col => {\n const aggVal = aggregationResult![col.field];\n if (aggVal !== undefined && aggVal !== null) {\n let formatted: unknown = aggVal;\n if (col.valueFormatter) formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n else if (aggModel[col.field]) formatted = formatAggregationValue(aggVal, aggModel[col.field]);\n html += `<td style=\"text-align:right;\">${escapeHTML(String(formatted))}</td>`;\n } else {\n html += '<td></td>';\n }\n });\n html += '</tr></tfoot>';\n }\n }\n\n html += '</tbody></table></body></html>';\n\n // Write the HTML content\n printWindow.document.open();\n printWindow.document.write(html);\n printWindow.document.close();\n\n // Set the document title explicitly (fixes about:blank issue)\n printWindow.document.title = title || 'Print Preview';\n\n printWindow.focus();\n\n let hasPrinted = false;\n\n printWindow.onload = () => {\n if (!hasPrinted) {\n hasPrinted = true;\n printWindow.print();\n\n setTimeout(() => {\n printWindow.close();\n }, 100);\n }\n };\n\n setTimeout(() => {\n if (!hasPrinted && printWindow && !printWindow.closed) {\n hasPrinted = true;\n printWindow.print();\n setTimeout(() => {\n if (!printWindow.closed) printWindow.close();\n }, 100);\n }\n }, 500);\n\n } catch (e) {\n console.error('Print generation failed:', e);\n if (printWindow && !printWindow.closed) {\n const message = e instanceof Error ? e.message : String(e);\n printWindow.document.body.innerHTML = `<div style=\"color: red; padding: 20px;\"><h3>Error Generating Print Preview</h3><p>${message}</p></div>`;\n }\n }\n}\n\nfunction downloadFile(content: string, fileName: string, mimeType: string): void {\n const blob = new Blob([content], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = fileName;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n}\n\nexport { exportToPdf } from './exportToPdf';\nexport type { PdfExportOptions } from '../../types';\n","\nimport type { GridColDef, GridRowModel, GridAggregationModel, GridGroupedExportRow } 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 * Grouped row structure, typically from `apiRef.current.getGroupedExportRows()`.\n * When provided, sheets with `rows: 'all'` are written in grouped order: group-header,\n * leaf, group-subtotal and grand-total rows, using Excel row outlining so groups\n * collapse natively. A `grand-total` entry replaces the sheet's `includeSummary` row.\n * Ignored for `rows: 'selected'` sheets.\n * @since v2.1\n */\n groupedRows?: GridGroupedExportRow[];\n /** Fill color for group-header rows in grouped export (default: '#e8eaf6') */\n groupHeaderFillColor?: string;\n /** Fill color for group-subtotal rows in grouped export (default: '#f0f4ff') */\n groupSubtotalFillColor?: string;\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 groupedRows,\n groupHeaderFillColor = '#e8eaf6',\n groupSubtotalFillColor = '#f0f4ff',\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 useGrouped = rowScope === 'all' && Boolean(groupedRows && groupedRows.length > 0);\n const rowsToExport = rowScope === 'selected'\n ? sRows\n : useGrouped\n ? groupedRows!.flatMap(e => (e.type === 'leaf' && e.row ? [e.row] : []))\n : 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 const writeDataRow = (row: GridRowModel, rowIdx: number, outlineLevel: number) => {\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 if (outlineLevel > 0) dataRow.outlineLevel = outlineLevel;\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 const groupLabel = (entry: GridGroupedExportRow): string => {\n const colDef = exportColumns.find(c => c.field === entry.groupField);\n if (colDef?.groupingValueFormatter && entry.groupField) {\n return colDef.groupingValueFormatter({ field: entry.groupField, value: entry.groupValue });\n }\n return `${colDef?.headerName ?? entry.groupField ?? ''}: ${String(entry.groupValue ?? '')}`;\n };\n\n // Numbers are written raw so the column numFmt applies; other values use the formatter.\n const aggregateCell = (col: GridColDef<GridRowModel>, values: Record<string, unknown>): unknown => {\n const val = values[col.field];\n if (val == null) return '';\n if (typeof val === 'number') return val;\n if (col.valueFormatter) return col.valueFormatter({ value: val, row: {} as GridRowModel, field: col.field });\n return formatAggregationValue(val, aggregationModel?.[col.field] ?? '');\n };\n\n const writeSummaryRow = (label: string, values: Record<string, unknown>, fill: string, outlineLevel: number, bold: boolean) => {\n const cells = exportColumns.map((col, i) => (i === 0 && values[col.field] == null ? label : aggregateCell(col, values)));\n const summaryRow = ws.addRow(cells);\n summaryRow.height = 18;\n if (outlineLevel > 0) summaryRow.outlineLevel = outlineLevel;\n summaryRow.font = { bold, italic: !bold, size: bodyFontSize, color: { argb: argb(headerTextColor) } };\n summaryRow.eachCell((cell, colIndex) => {\n cell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: argb(fill) } };\n const colDef = exportColumns[colIndex - 1];\n cell.alignment = { horizontal: colIndex === 1 ? 'left' : (colDef?.type === 'number' ? 'right' : 'left'), vertical: 'middle' };\n cell.border = topBorder();\n });\n excelRowIdx++;\n };\n\n let wroteGrandTotal = false;\n\n if (useGrouped) {\n let stripe = 0;\n groupedRows!.forEach(entry => {\n if (entry.type === 'group-header') {\n const groupHeaderRow = ws.addRow([groupLabel(entry)]);\n groupHeaderRow.height = 18;\n if (entry.depth > 0) groupHeaderRow.outlineLevel = entry.depth;\n groupHeaderRow.font = { bold: true, size: bodyFontSize, color: { argb: argb(headerTextColor) } };\n for (let c = 1; c <= exportColumns.length; c++) {\n groupHeaderRow.getCell(c).fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: argb(groupHeaderFillColor) } };\n }\n groupHeaderRow.getCell(1).alignment = { horizontal: 'left', vertical: 'middle', indent: entry.depth };\n excelRowIdx++;\n stripe = 0;\n } else if (entry.type === 'leaf' && entry.row) {\n writeDataRow(entry.row, stripe++, entry.depth);\n } else if (entry.type === 'group-subtotal' && entry.aggregatedValues) {\n writeSummaryRow('Subtotal', entry.aggregatedValues, groupSubtotalFillColor, entry.depth, false);\n } else if (entry.type === 'grand-total' && entry.aggregatedValues) {\n writeSummaryRow('Grand Total', entry.aggregatedValues, headerFillColor, 0, true);\n wroteGrandTotal = true;\n }\n });\n ws.properties.outlineProperties = { summaryBelow: true, summaryRight: false };\n } else {\n rowsToExport.forEach((row, rowIdx) => writeDataRow(row, rowIdx, 0));\n }\n\n // ── Aggregation totals row ────────────────────────────────────────────\n if (includeSummary && !wroteGrandTotal && 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","scrollRowIntoView","viewport","centerIndex","virtualContainer","scrollTop","clientHeight","stickyTop","rowTop","rowBottom","useGridKeyboardNavigation","allRenderableRows","navigationColumns","selectedRowIds","handleSelectionChange","handleDetailPanelToggle","editingHandlers","setKeyboardMode","sortModel","handleSort","isCellEditable","virtualization","viewportRef","pinnedTopRowCount","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","clientWidth","scrollLeft","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","overscanRows","unpinnedRowsLength","viewportHeight","overscanCols","visibleLocalStart","visibleLocalEnd","firstUnpinnedIndex","lastUnpinnedIndex","low","high","mid","leftSpacerWidth","rightSpacerWidth","virtualColumns","scrollbarBuffer","totalHeight","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","displayValue","cellParams","useGridColumns","activeColumns","isHierarchyEnabled","isRowGrouping","isTreeData","columnOrder","pivotMode","setColumns","effectiveColumns","meta","depth","hasChildren","groupingField","groupingValue","descendantCount","isGroupRow","content","groupLabel","setColumnWidths","handleColumnResize","newWidth","internalColumnOrder","setInternalColumnOrder","effectiveColumnOrder","useEffect","orderedColumns","orderMap","idx","ai","bi","columnReorderHandlers","reorderParams","newOrder","movedField","specials","useGridVisibleRows","renderContext","topPinnedCount","topPinned","bottomPinned","centerStartIndex","centerEndIndex","centerVisible","combined","seenIds","velocityToOverscan","velocity","minOverscan","useGridScrollSync","onRowsScrollEnd","overscanRowCount","pendingRef","prevRef","rafRef","decayRef","scrollState","setScrollState","handleScroll","target","now","deltaPos","deltaTime","scrollHeight","useGridStateSnapshot","onStateChange","onStateChangeRef","useLayoutEffect","snapshot","UNBOUNDED_WARN_THRESHOLD","useGridDevWarnings","paginationRequested","renderedRowCount","totalRowCount","warnedPaginationRef","warnedUnboundedRef","toNumbers","values","nums","n","minOf","m","maxOf","AGGREGATION_FUNCTIONS","computeAggregations","columnsLookup","warnPrefix","result","fnName","colDef","fn","formatAggregationValue","useAggregation","isServerSide","serverAggregationResults","map","clientResult","serverResult","setServerResult","setIsLoading","error","setError","requestIdRef","fetchServerAggregations","requestId","err","GridAggregationFooter","aggregationResult","pinnedOffsets","lastLeftField","firstRightField","rawValue","colWidth","pinnedOffset","className","style","Fragment","GridEmptyState","noRowsLabel","overlay","GridErrorOverlay","message","Checkbox","indeterminate","label","inputRef","internalRef","setRef","element","wrapperClassNames","ColumnResizeHandle","currentWidth","onResize","maxWidth","isDragging","setIsDragging","startXRef","startWidthRef","handleMouseDown","lastUpdateTime","throttleMs","handleMouseMove","deltaX","handleMouseUp","handleDoubleClick","classNames","ActiveDotIcon","InactiveDotIcon","ManageColumnsIcon","AscIcon","DescIcon","UnsortIcon","HideIcon","PinLeftIcon","PinRightIcon","UnpinIcon","ColumnMenu","onSort","onHide","onPin","onManageColumns","onClose","anchorEl","menuRef","setStyle","anchorRect","menuRect","vw","vh","margin","handleClickOutside","handleKey","handleHide","handlePin","side","isUnsorted","isPinnedLeft","isPinnedRight","isUnpinned","colLabel","ReactDOM","MenuIcon","SwapIcon","collectGroupFields","out","child","groupTreeDepth","d","walk","g","buildGroupRow","allFields","level","findAtLevel","cur","found","fieldGroup","cells","totalW","j","Header","allColumns","columnGroupingModel","allSelected","someSelected","onSelectAll","onColumnResize","onDragStart","onDragOver","onDragEnd","onDrop","onHeaderClick","onSortAdd","multiSort","onHideColumn","onPinColumn","selectAllId","useId","cellRefs","menuOpenParams","setMenuOpenParams","handleMenuOpen","handleMenuClose","handleColumnClick","getSortIcon","sortIndex","pinnedPositions","groupDepth","allLeafFields","prefixWidth","cell","isSorted","isResizable","isPinned","isDragOver","effectiveWidth","offset","headerContent","handleHeaderClick","Button","size","color","disabled","Pagination","pageSizeId","page","rowCount","onPageChange","onPageSizeChange","pageSizeOptions","showFirstButton","showLastButton","localeText","pageCount","currentPage","displayedRows","rowsPerPageLabel","ofLabel","pageLabel","handleFirstPage","handlePreviousPage","handleNextPage","handleLastPage","handlePageSizeChange","newPageSize","isFirstPage","isLastPage","option","createInitialState","idRowsLookup","allRows","columnLookup","orderedFields","gridReducer","state","action","currentRows","newRows","useDataGrid","headerHeight","propInitialState","internalInitialState","dispatch","useReducer","stateRef","prevRowsRef","setRows","rowsOrUpdater","preserveRowCount","newColumns","setSortModel","setFilterModel","setPaginationModel","paginationModel","setSelection","selectedRows","setDimensions","setDataSourceLoading","loading","setDataSourceError","setRowCount","count","apiRef","isSelected","newSelection","ids","existingIndex","useRowReorder","onRowOrderChange","getRowId","draggedRowId","setDraggedRowId","dragOverRowId","setDragOverRowId","getRowIdInternal","targetId","EMPTY_OVERRIDES","useTreeData","getTreeDataPath","treeData","defaultGroupingExpansionDepth","onRowExpansionChange","treeNodes","rootIds","groupingRows","nodes","roots","groupRows","pathLookup","getPathKey","path","pathKey","ensureAncestors","childPath","parentPath","parentPathKey","parentId","groupRow","parentNode","childNode","groupId","nodePath","configKey","expansionState","setExpansionState","overrides","isDefaultExpanded","expandedGroupIds","toggleExpansion","isExpanding","next","getVisibleRows","rowLookup","matchesFilter","filterCache","isNodeVisible","childId","sortNodes","aId","bId","rowA","rowB","valA","valB","comp","traverse","visibleIds","enhancedRow","isGroupExpanded","getNode","getNodePath","currentId","rowMetaMap","groupRowIds","defaultGetAggregationPosition","groupNode","EMPTY_ROW_GROUPING_MODEL","EMPTY_AGGREGATION_MODEL","useRowGrouping","rowGroupingModel","getAggregationPosition","getGroupId","groupIds","groupRowsList","aggregatedValues","treeNode","childrenIds","topLevelIds","current","doesNodeMatchFilter","nodeId","compareResult","isGroup","useGridEditing","processRowUpdate","onProcessRowUpdateError","onRowChange","editingCell","setEditingCellState","editingCellRef","setEditingCell","val","startCellEdit","editParams","stopCellEdit","stopParams","currentCell","originalValue","existingRow","newRow","processedRow","setEditCellValue","useGridSpanning","colspanMap","setColspanMap","rowSpanningState","setRowSpanningState","resetColSpan","getCellColSpanInfo","calculateColSpan","minFirstColumn","maxLastColumn","newMap","colSpan","setCellColSpanInfo","calculateRowSpan","spannedCells","hiddenCells","hiddenCellOriginMap","cellValue","span","nextIndex","nextRow","resetRowSpan","nextColWidth","getSpannedCells","getHiddenCells","getHiddenCellOriginMap","info","columnInfo","useGridDataSource","onAggregationResults","prevParamsRef","activeRequestRef","fetchRows","endRow","requestParams","response","shouldAppend","sortChanged","filterChanged","pageSizeChanged","prevRows","timer","fetchChildren","_parentId","groupKeys","existingIds","SEP_COL","SEP_KEY","aggregate","makeKey","fields","cellKey","ck","aggFn","hasColFields","usePivot","rawRows","rawCols","enabled","empty","rowFields","columnFields","valueFields","colDefMap","colKeySet","colKeys","outerMap","rk","labelValues","entry","colBucket","vf","raw","pivotRows","pivotRow","ck_","gtBuckets","bk","totalRow","cellValues","pivotColumns","orig","def","labelBase","headerName","copyTextSynchronous","text","textarea","success","writeToClipboard","fallbackSuccess","useGridClipboard","copySelectedRows","rowsToCopy","visibleColumns","headerRow","dataRows","fullContent","activeEl","tag","ListViewRow","listViewColumn","onRowClick","onRowDoubleClick","onSelectionChange","handleCheckboxChange","GridListView","ariaLabel","serverRowCount","paginationSlot","paginationSlotProps","PaginationComponent","newPage","TextEditor","onValueChange","onCommit","onCancel","local","setLocal","ref","NumberEditor","BooleanEditor","handleChange","SelectEditor","options","opt","l","DateEditor","GridEditInputCell","CellRenderTarget","renderFn","CellErrorBoundary","CellImpl","onCellClick","onCellEditStart","onCellValueChange","isFocused","isFocusVisible","isEditable","onEditStart","onEditStop","colSpanInfo","rowSpanProp","isHiddenByRowSpan","rowMeta","handleValueChange","newValue","formattedValue","resolvedCellClassName","cellRef","handleClick","rowSpan","cellWidth","Cell","DragHandleIcon","DetailPanel","Row","isDetailPanelExpanded","onDetailPanelToggle","detailPanelContent","detailPanelHeight","onEditCellValueChange","focusedCellField","rowSpanningCaches","checkboxId","expandCellRef","checkboxCellRef","handleCellEditStart","handleCellValueChange","handleEditStopWrapper","cancel","cellCount","handleRowClick","handleRowDoubleClick","rowPinnedPosition","isRowPinnedTop","isRowPinnedBottom","GridPinnedRows","position","getDetailPanelContent","SkeletonRow","skeletonWidth","GridVirtualRows","virtualContainerHeight","effectiveLoading","visibleRows","baseColumns","rowReorderHandlers","dataSourceLoading","sortedUnpinnedRowCount","infiniteScrollSkeletonCount","loadingOverlay","skeletonColumns","columnWidth","columnCount","self","t","actualIndex","SearchIcon","ColumnVisibilityPanel","onVisibilityChange","onShowAll","onHideAll","onColumnReorder","onColumnOrderReset","showNonHideableColumns","searchQuery","setSearchQuery","dragOverField","setDragOverField","dragFieldRef","hideableColumns","allVisible","filteredColumns","lowerQuery","handleToggleAll","handleDragLeave","toField","fromField","isVisible","isHideable","canReorder","GridStandaloneColumnPanel","isOpen","containerRef","panelRef","onColumnVisibilityChange","panelTop","setPanelTop","panelRight","setPanelRight","portalTarget","setPortalTarget","rect","handleReorder","currentOrder","fromIdx","toIdx","EMPTY_ROW_META_MAP","DataGrid","density","disableRowSelectionOnClick","disableMultipleRowSelection","propOnRowSelectionModelChange","propFilterModel","onFilterModelChange","onSortModelChange","propPagination","controlledExpandedRowIds","onDetailPanelExpandedRowIdsChange","groupingColDef","propRowGroupingModel","propRowCount","slots","slotProps","listView","propApiRef","effectiveNoRowsLabel","defaultFilterModel","defaultRowGroupingModel","latestToolbarRef","StableToolbar","Toolbar","controlledState","onRowSelectionModelChange","pivot","effectiveRowHeight","activeRows","isRowGroupingActive","effectivePinnedColumns","setServerAggregationResults","contentRef","gridRef","defaultGetRowId","effectiveGetRowId","normalizedRows","on","dataSourceRef","fetchChildrenRef","treeDataRef","handleNodeExpansion","gridData","isInternalLoading","treeDataHandlers","rowGroupingHandlers","updatedRow","nextRows","dataSourceHandlers","internalExpandedRowIds","setInternalExpandedRowIds","newExpandedRowIds","rowPipeline","spanning","hasAggregation","resolvedColumnWidths","targetCol","colLocalLeft","colLocalRight","resizeObserver","entries","newSelectionArray","handleSelectAll","newSortModel","handleSortAdd","existing","handleCellClick","prevEditingCellRef","wasEditing","hasRowSpanning","columnsPanelOpen","setColumnsPanelOpen","standalonePanelRef","NoRowsOverlaySlot","LoadingOverlaySlot","FooterSlot","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","useGridApiRef","Input","fullWidth","startAdornment","endAdornment","hexToRgb","hex","getExportColumns","resolveValue","colWeight","computeColumnStyles","usableWidth","totalWeight","styles","formatFilterSummary","exportToPdf","JsPDF","autoTable","jspdfMod","autoTableMod","fileName","logoUrl","orientation","alternateRowColor","headerBackgroundColor","headerTextColor","fontSize","groupedRows","doc","pageWidth","pageHeight","MARGIN","exportColumns","rowsToExport","startY","cursorX","cursorY","exportedAt","summary","head","body","foot","aggMod","indent","aggVal","formatted","columnStyles","hr","hg","hb","tr","tg","tb","totalPages","exportToCsv","includeHeaders","delimiter","csvContent","escapeCSV","aggModel","aggResult","aggLabels","aggValues","downloadFile","exportToExcel","sheetName","html","escapeHTML","isGrand","exportToJson","pretty","outData","stack","grandTotal","obj","data","summaryLabelObj","summaryDataObj","printGrid","titleOrOptions","printWindow","resolve","hasPrinted","mimeType","blob","url","link","inferCellType","defaultNumFmt","override","px","imageExtension","contentType","ct","fetchImages","urls","settled","commaIdx","header","b64","binary","uint8","mime","ext","buffer","exportToExcelAdvanced","sheetDefs","headerFillColor","headerFontSize","bodyFontSize","groupHeaderFillColor","groupSubtotalFillColor","ExcelJS","workbook","sRows","resolvedSheets","imageCache","sheetDef","ws","argb","bottomBorder","rowScope","includeSummary","autoFilter","frozenHeader","useGrouped","imageColumns","urlsNeeded","seen","fetched","extension","imgId","headerValues","excelRowIdx","writeDataRow","rowIdx","outlineLevel","dataRow","maxImgH","max","rowHeightPt","rowHeightPx","colIdx","imgW","imgH","colWidthPx","hGapPx","vGapPx","aggregateCell","writeSummaryRow","fill","bold","summaryRow","topBorder","wroteGrandTotal","stripe","groupHeaderRow","labelRow","totalValues","clean","lightBase","themeToCSS","theme","vars","set","cssVar","s","sh","scr","sk","DataGridThemeProvider","cssVars","darkTheme","roseTheme","emeraldTheme","amberTheme","compactTheme","readFromStorage","storage","writeToStorage","include","toWrite","useGridStateStorage","opts","latestStateRef","flush","clearState"],"mappings":"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","x_google_ignoreList":[0,1,2]}