@opencorestack/opengridx 0.1.6 → 0.1.8

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 (130) hide show
  1. package/CHANGELOG.md +30 -1
  2. package/README.md +9 -0
  3. package/dist/index.d.ts +12 -1
  4. package/dist/opengridx.css +1 -1
  5. package/dist/opengridx.es.js +2505 -2450
  6. package/dist/opengridx.es.js.map +1 -1
  7. package/dist/opengridx.umd.js +12 -12
  8. package/dist/opengridx.umd.js.map +1 -1
  9. package/docs/API_REFERENCE.md +177 -0
  10. package/docs/README.md +60 -0
  11. package/docs/components/cell.md +44 -0
  12. package/docs/components/column-group-header.md +57 -0
  13. package/docs/components/column-resize.md +63 -0
  14. package/docs/components/column-visibility.md +61 -0
  15. package/docs/components/datagrid.md +70 -0
  16. package/docs/components/filter-panel.md +26 -0
  17. package/docs/components/header.md +39 -0
  18. package/docs/components/pagination.md +34 -0
  19. package/docs/components/row.md +31 -0
  20. package/docs/components/toolbar.md +40 -0
  21. package/docs/components/tooltip.md +68 -0
  22. package/docs/customization/slots-api.md +227 -0
  23. package/docs/customization/theming.md +293 -0
  24. package/docs/features/aggregation-pivot.md +79 -0
  25. package/docs/features/cell-spanning.md +520 -0
  26. package/docs/features/clipboard.md +76 -0
  27. package/docs/features/custom-pagination.md +143 -0
  28. package/docs/features/data-source.md +72 -0
  29. package/docs/features/editing-reordering.md +99 -0
  30. package/docs/features/export-guide.md +434 -0
  31. package/docs/features/filtering.md +83 -0
  32. package/docs/features/infinite-scroll.md +87 -0
  33. package/docs/features/list-view.md +65 -0
  34. package/docs/features/loading-states.md +68 -0
  35. package/docs/features/master-detail.md +46 -0
  36. package/docs/features/pinning.md +67 -0
  37. package/docs/features/selection.md +70 -0
  38. package/docs/features/sorting-pagination.md +66 -0
  39. package/docs/features/state-persistence.md +67 -0
  40. package/docs/features/tree-data-grouping.md +67 -0
  41. package/docs/features/virtualization.md +188 -0
  42. package/docs/roadmap.md +71 -0
  43. package/lib/components/Cell/Cell.css +119 -0
  44. package/lib/components/Cell/Cell.tsx +264 -0
  45. package/lib/components/Cell/GridEditInputCell.css +62 -0
  46. package/lib/components/Cell/GridEditInputCell.tsx +152 -0
  47. package/lib/components/ColumnGroupHeader/ColumnGroupHeader.css +67 -0
  48. package/lib/components/ColumnGroupHeader/ColumnGroupHeader.tsx +220 -0
  49. package/lib/components/ColumnResizeHandle/ColumnResizeHandle.css +31 -0
  50. package/lib/components/ColumnResizeHandle/ColumnResizeHandle.tsx +85 -0
  51. package/lib/components/ColumnVisibilityPanel/ColumnVisibilityPanel.css +137 -0
  52. package/lib/components/ColumnVisibilityPanel/ColumnVisibilityPanel.tsx +190 -0
  53. package/lib/components/DataGrid/DataGrid.css +224 -0
  54. package/lib/components/DataGrid/DataGrid.tsx +2269 -0
  55. package/lib/components/DetailPanel/DetailPanel.css +36 -0
  56. package/lib/components/DetailPanel/DetailPanel.tsx +34 -0
  57. package/lib/components/FilterPanel/FilterPanel.css +196 -0
  58. package/lib/components/FilterPanel/FilterPanel.tsx +214 -0
  59. package/lib/components/FilterPanel/index.ts +1 -0
  60. package/lib/components/Header/ColumnMenu.css +68 -0
  61. package/lib/components/Header/ColumnMenu.tsx +249 -0
  62. package/lib/components/Header/Header.css +224 -0
  63. package/lib/components/Header/Header.tsx +516 -0
  64. package/lib/components/ListView/ListView.css +112 -0
  65. package/lib/components/ListView/ListViewRow.tsx +63 -0
  66. package/lib/components/Pagination/Pagination.css +91 -0
  67. package/lib/components/Pagination/Pagination.tsx +151 -0
  68. package/lib/components/QuickFilter/QuickFilter.css +23 -0
  69. package/lib/components/QuickFilter/QuickFilter.tsx +79 -0
  70. package/lib/components/Row/Row.css +126 -0
  71. package/lib/components/Row/Row.tsx +377 -0
  72. package/lib/components/Skeleton/Skeleton.css +55 -0
  73. package/lib/components/Skeleton/Skeleton.tsx +22 -0
  74. package/lib/components/SkeletonRow/SkeletonRow.css +32 -0
  75. package/lib/components/SkeletonRow/SkeletonRow.tsx +89 -0
  76. package/lib/components/SkeletonRow/index.ts +1 -0
  77. package/lib/components/Toolbar/GlobalSearch.css +110 -0
  78. package/lib/components/Toolbar/GlobalSearch.tsx +167 -0
  79. package/lib/components/Toolbar/GridToolbar.css +221 -0
  80. package/lib/components/Toolbar/GridToolbar.tsx +658 -0
  81. package/lib/components/Toolbar/PivotPanel.css +212 -0
  82. package/lib/components/Toolbar/PivotPanel.tsx +239 -0
  83. package/lib/components/Tooltip/Tooltip.css +59 -0
  84. package/lib/components/Tooltip/Tooltip.tsx +106 -0
  85. package/lib/components/ui/Button.css +89 -0
  86. package/lib/components/ui/Button.tsx +39 -0
  87. package/lib/components/ui/Checkbox.css +71 -0
  88. package/lib/components/ui/Checkbox.tsx +66 -0
  89. package/lib/components/ui/DragHandleIcon.css +19 -0
  90. package/lib/components/ui/DragHandleIcon.tsx +18 -0
  91. package/lib/components/ui/ExpandIcon.css +38 -0
  92. package/lib/components/ui/ExpandIcon.tsx +75 -0
  93. package/lib/components/ui/Input.css +59 -0
  94. package/lib/components/ui/Input.tsx +45 -0
  95. package/lib/components/ui/index.ts +15 -0
  96. package/lib/hooks/core/useDataGrid.ts +392 -0
  97. package/lib/hooks/core/useGridApiRef.ts +10 -0
  98. package/lib/hooks/features/useAggregation.ts +143 -0
  99. package/lib/hooks/features/useGridClipboard.ts +133 -0
  100. package/lib/hooks/features/useGridDataSource.ts +190 -0
  101. package/lib/hooks/features/useGridEditing.ts +100 -0
  102. package/lib/hooks/features/useGridSpanning.ts +349 -0
  103. package/lib/hooks/features/usePivot.ts +174 -0
  104. package/lib/hooks/useColumnReorder.ts +114 -0
  105. package/lib/hooks/useRowGrouping.ts +302 -0
  106. package/lib/hooks/useRowReorder.ts +83 -0
  107. package/lib/hooks/useTreeData.ts +323 -0
  108. package/lib/index.ts +106 -0
  109. package/lib/state/index.ts +17 -0
  110. package/lib/state/types.ts +48 -0
  111. package/lib/state/useGridStateStorage.ts +113 -0
  112. package/lib/styles/base/reset.css +21 -0
  113. package/lib/styles/base/variables.css +161 -0
  114. package/lib/styles/opengridx.css +27 -0
  115. package/lib/styles/opengridx.css.d.ts +4 -0
  116. package/lib/theme/DataGridThemeProvider.tsx +276 -0
  117. package/lib/theme/defaultStyles.ts +0 -0
  118. package/lib/theme/index.ts +21 -0
  119. package/lib/theme/presets.ts +148 -0
  120. package/lib/theme/types.ts +155 -0
  121. package/lib/types/index.ts +764 -0
  122. package/lib/utils/export/exportToExcelAdvanced.ts +516 -0
  123. package/lib/utils/export/index.ts +550 -0
  124. package/lib/utils/filtering/index.ts +240 -0
  125. package/lib/utils/pinning/index.ts +282 -0
  126. package/lib/utils/sorting/index.ts +55 -0
  127. package/lib/utils/virtualization/index.ts +106 -0
  128. package/lib/vite-env.d.ts +1 -0
  129. package/llms.txt +2 -1
  130. package/package.json +12 -4
@@ -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/components/ListView/ListViewRow.tsx","../lib/components/ui/Checkbox.tsx","../lib/components/ColumnResizeHandle/ColumnResizeHandle.tsx","../lib/utils/pinning/index.ts","../lib/components/Header/ColumnMenu.tsx","../lib/components/Header/Header.tsx","../lib/components/Cell/GridEditInputCell.tsx","../lib/components/Cell/Cell.tsx","../lib/components/ui/ExpandIcon.tsx","../lib/components/ui/DragHandleIcon.tsx","../lib/components/DetailPanel/DetailPanel.tsx","../lib/components/Row/Row.tsx","../lib/components/SkeletonRow/SkeletonRow.tsx","../lib/components/ui/Button.tsx","../lib/components/Pagination/Pagination.tsx","../lib/hooks/core/useDataGrid.ts","../lib/hooks/useColumnReorder.ts","../lib/hooks/useRowReorder.ts","../lib/utils/filtering/index.ts","../lib/utils/sorting/index.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/useAggregation.ts","../lib/hooks/features/usePivot.ts","../lib/hooks/features/useGridClipboard.ts","../lib/components/ColumnVisibilityPanel/ColumnVisibilityPanel.tsx","../lib/components/DataGrid/DataGrid.tsx","../lib/components/Skeleton/Skeleton.tsx","../lib/components/FilterPanel/FilterPanel.tsx","../lib/components/Toolbar/PivotPanel.tsx","../lib/components/Toolbar/GlobalSearch.tsx","../lib/components/Tooltip/Tooltip.tsx","../lib/components/Toolbar/GridToolbar.tsx","../lib/hooks/core/useGridApiRef.ts","../lib/components/ui/Input.tsx","../lib/utils/export/index.ts","../lib/utils/export/exportToExcelAdvanced.ts","../lib/theme/DataGridThemeProvider.tsx","../lib/theme/presets.ts","../lib/state/useGridStateStorage.ts"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (\n (\"number\" === typeof type.tag &&\n console.error(\n \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n ),\n type.$$typeof)\n ) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkKeyStringCoercion(value) {\n try {\n testStringCoercion(value);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n if (JSCompiler_inline_result) {\n JSCompiler_inline_result = console;\n var JSCompiler_temp_const = JSCompiler_inline_result.error;\n var JSCompiler_inline_result$jscomp$0 =\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\";\n JSCompiler_temp_const.call(\n JSCompiler_inline_result,\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n JSCompiler_inline_result$jscomp$0\n );\n return testStringCoercion(value);\n }\n }\n function getTaskName(type) {\n if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n if (\n \"object\" === typeof type &&\n null !== type &&\n type.$$typeof === REACT_LAZY_TYPE\n )\n return \"<...>\";\n try {\n var name = getComponentNameFromType(type);\n return name ? \"<\" + name + \">\" : \"<...>\";\n } catch (x) {\n return \"<...>\";\n }\n }\n function getOwner() {\n var dispatcher = ReactSharedInternals.A;\n return null === dispatcher ? null : dispatcher.getOwner();\n }\n function UnknownOwner() {\n return Error(\"react-stack-top-frame\");\n }\n function hasValidKey(config) {\n if (hasOwnProperty.call(config, \"key\")) {\n var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n if (getter && getter.isReactWarning) return !1;\n }\n return void 0 !== config.key;\n }\n function defineKeyPropWarningGetter(props, displayName) {\n function warnAboutAccessingKey() {\n specialPropKeyWarningShown ||\n ((specialPropKeyWarningShown = !0),\n console.error(\n \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n displayName\n ));\n }\n warnAboutAccessingKey.isReactWarning = !0;\n Object.defineProperty(props, \"key\", {\n get: warnAboutAccessingKey,\n configurable: !0\n });\n }\n function elementRefGetterWithDeprecationWarning() {\n var componentName = getComponentNameFromType(this.type);\n didWarnAboutElementRef[componentName] ||\n ((didWarnAboutElementRef[componentName] = !0),\n console.error(\n \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n ));\n componentName = this.props.ref;\n return void 0 !== componentName ? componentName : null;\n }\n function ReactElement(type, key, props, owner, debugStack, debugTask) {\n var refProp = props.ref;\n type = {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n props: props,\n _owner: owner\n };\n null !== (void 0 !== refProp ? refProp : null)\n ? Object.defineProperty(type, \"ref\", {\n enumerable: !1,\n get: elementRefGetterWithDeprecationWarning\n })\n : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n type._store = {};\n Object.defineProperty(type._store, \"validated\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: 0\n });\n Object.defineProperty(type, \"_debugInfo\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: null\n });\n Object.defineProperty(type, \"_debugStack\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugStack\n });\n Object.defineProperty(type, \"_debugTask\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugTask\n });\n Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n return type;\n }\n function jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n debugStack,\n debugTask\n ) {\n var children = config.children;\n if (void 0 !== children)\n if (isStaticChildren)\n if (isArrayImpl(children)) {\n for (\n isStaticChildren = 0;\n isStaticChildren < children.length;\n isStaticChildren++\n )\n validateChildKeys(children[isStaticChildren]);\n Object.freeze && Object.freeze(children);\n } else\n console.error(\n \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n );\n else validateChildKeys(children);\n if (hasOwnProperty.call(config, \"key\")) {\n children = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return \"key\" !== k;\n });\n isStaticChildren =\n 0 < keys.length\n ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n : \"{key: someKey}\";\n didWarnAboutKeySpread[children + isStaticChildren] ||\n ((keys =\n 0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n console.error(\n 'A props object containing a \"key\" prop is being spread into JSX:\\n let props = %s;\\n <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n let props = %s;\\n <%s key={someKey} {...props} />',\n isStaticChildren,\n children,\n keys,\n children\n ),\n (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n }\n children = null;\n void 0 !== maybeKey &&\n (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n children &&\n defineKeyPropWarningGetter(\n maybeKey,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n return ReactElement(\n type,\n children,\n maybeKey,\n getOwner(),\n debugStack,\n debugTask\n );\n }\n function validateChildKeys(node) {\n isValidElement(node)\n ? node._store && (node._store.validated = 1)\n : \"object\" === typeof node &&\n null !== node &&\n node.$$typeof === REACT_LAZY_TYPE &&\n (\"fulfilled\" === node._payload.status\n ? isValidElement(node._payload.value) &&\n node._payload.value._store &&\n (node._payload.value._store.validated = 1)\n : node._store && (node._store.validated = 1));\n }\n function isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n }\n var React = require(\"react\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n isArrayImpl = Array.isArray,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n React = {\n react_stack_bottom_frame: function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n React,\n UnknownOwner\n )();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutKeySpread = {};\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.jsx = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !1,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n exports.jsxs = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !0,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import React from 'react';\nimport type { 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 any,\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","\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","\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 React, { useRef, useEffect, useState } from 'react';\nimport ReactDOM from 'react-dom';\nimport type { GridColDef, GridSortDirection, GridColumnPinning } from '../../types';\n\n\ninterface ColumnMenuProps {\n colDef: GridColDef<any>;\n sortModel?: Array<{ field: string; sort: 'asc' | 'desc' }>;\n onSort?: (field: string, direction: GridSortDirection) => void;\n onHide?: (field: string) => void;\n onPin?: (field: string, side: 'left' | 'right' | null) => void;\n pinnedColumns?: GridColumnPinning;\n onManageColumns?: () => void;\n onClose: () => void;\n anchorEl: HTMLElement | null;\n}\n\nfunction ActiveDotIcon() {\n return (\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"currentColor\">\n <circle cx=\"4\" cy=\"4\" r=\"4\" />\n </svg>\n );\n}\n\nfunction InactiveDotIcon() {\n return (\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <circle cx=\"4\" cy=\"4\" r=\"3\" />\n </svg>\n );\n}\n\nfunction ManageColumnsIcon() {\n return (\n <svg focusable=\"false\" aria-hidden=\"true\" viewBox=\"0 0 24 24\" width=\"13\" height=\"13\" fill=\"none\">\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <rect x=\"8.5\" y=\"4\" width=\"7\" height=\"16\" fill=\"currentColor\" opacity=\"0.3\" />\n <line x1=\"8.5\" y1=\"4\" x2=\"8.5\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <line x1=\"15.5\" y1=\"4\" x2=\"15.5\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <line x1=\"2\" y1=\"9\" x2=\"22\" y2=\"9\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <line x1=\"2\" y1=\"14\" x2=\"22\" y2=\"14\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n </svg>\n );\n}\n\nfunction AscIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"5\" />\n <polyline points=\"5 12 12 5 19 12\" />\n </svg>\n );\n}\n\nfunction DescIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n <polyline points=\"19 12 12 19 5 12\" />\n </svg>\n );\n}\n\nfunction UnsortIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\">\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n );\n}\n\nfunction HideIcon() {\n return (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94\" />\n <path d=\"M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19\" />\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n </svg>\n );\n}\n\nfunction PinLeftIcon() {\n return (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n { }\n <line x1=\"4\" y1=\"2\" x2=\"4\" y2=\"22\" />\n { }\n <polyline points=\"11 8 4 12 11 16\" />\n { }\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n </svg>\n );\n}\n\nfunction PinRightIcon() {\n return (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n { }\n <line x1=\"20\" y1=\"2\" x2=\"20\" y2=\"22\" />\n { }\n <polyline points=\"13 8 20 12 13 16\" />\n { }\n <line x1=\"20\" y1=\"12\" x2=\"4\" y2=\"12\" />\n </svg>\n );\n}\n\nfunction UnpinIcon() {\n return (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"2\" y1=\"2\" x2=\"22\" y2=\"22\" />\n <line x1=\"4\" y1=\"4\" x2=\"4\" y2=\"20\" />\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n </svg>\n );\n}\n\nexport function ColumnMenu({ colDef, sortModel, onSort, onHide, onPin, pinnedColumns, onManageColumns, onClose, anchorEl }: ColumnMenuProps) {\n const menuRef = useRef<HTMLDivElement>(null);\n const [style, setStyle] = useState<React.CSSProperties>({ position: 'fixed', zIndex: 1300, top: 0, left: 0, visibility: 'hidden' });\n\n React.useLayoutEffect(() => {\n if (!anchorEl || !menuRef.current) return;\n\n const anchorRect = anchorEl.getBoundingClientRect();\n const menuRect = menuRef.current.getBoundingClientRect();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const margin = 8;\n\n let left = anchorRect.left;\n if (left + menuRect.width + margin > vw) {\n left = vw - menuRect.width - margin;\n }\n if (left < margin) left = margin;\n\n let top = anchorRect.bottom + 4;\n if (top + menuRect.height + margin > vh) {\n top = anchorRect.top - menuRect.height - 4;\n }\n\n setStyle({ position: 'fixed', zIndex: 1300, top, left, visibility: 'visible' });\n }, [anchorEl]);\n\n\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (\n menuRef.current && !menuRef.current.contains(event.target as Node) &&\n anchorEl && !anchorEl.contains(event.target as Node)\n ) onClose();\n }\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') onClose();\n }\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keydown', handleKey);\n // Close menu on any scroll or resize so it doesn't float detached from its anchor\n window.addEventListener('scroll', onClose, true);\n window.addEventListener('resize', onClose);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keydown', handleKey);\n window.removeEventListener('scroll', onClose, true);\n window.removeEventListener('resize', onClose);\n };\n }, [anchorEl, onClose]);\n\n const handleSort = (direction: GridSortDirection) => { onSort?.(colDef.field, direction); onClose(); };\n const handleHide = () => { onHide?.(colDef.field); onClose(); };\n const handlePin = (side: 'left' | 'right' | null) => { onPin?.(colDef.field, side); onClose(); };\n\n const currentSort = sortModel?.find(item => item.field === colDef.field)?.sort;\n const isUnsorted = currentSort === undefined || currentSort === null;\n\n const isPinnedLeft = pinnedColumns?.left?.includes(colDef.field) ?? false;\n const isPinnedRight = pinnedColumns?.right?.includes(colDef.field) ?? false;\n const isUnpinned = !isPinnedLeft && !isPinnedRight;\n\n const colLabel = colDef.headerName || colDef.field;\n\n return ReactDOM.createPortal(\n <div ref={menuRef} className=\"ogx-column-menu\" style={style} role=\"menu\" aria-label={`Column options for ${colLabel}`}>\n\n { }\n {onSort && colDef.sortable !== false && (\n <>\n <button className={`ogx-menu-item${currentSort === 'asc' ? ' ogx-menu-item--active' : ''}`}\n onClick={() => handleSort('asc')} role=\"menuitemradio\" aria-checked={currentSort === 'asc'}>\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\">{currentSort === 'asc' ? <ActiveDotIcon /> : <InactiveDotIcon />}</span>\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><AscIcon /></span>\n Sort Ascending\n </button>\n <button className={`ogx-menu-item${currentSort === 'desc' ? ' ogx-menu-item--active' : ''}`}\n onClick={() => handleSort('desc')} role=\"menuitemradio\" aria-checked={currentSort === 'desc'}>\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\">{currentSort === 'desc' ? <ActiveDotIcon /> : <InactiveDotIcon />}</span>\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><DescIcon /></span>\n Sort Descending\n </button>\n <button className={`ogx-menu-item${isUnsorted ? ' ogx-menu-item--active' : ''}`}\n onClick={() => handleSort(null)} role=\"menuitemradio\" aria-checked={isUnsorted}>\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\">{isUnsorted ? <ActiveDotIcon /> : <InactiveDotIcon />}</span>\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><UnsortIcon /></span>\n Unsort\n </button>\n <div className=\"ogx-menu-divider\" />\n </>\n )}\n\n { }\n <div className=\"ogx-menu-section-label\" aria-hidden=\"true\">Pin column</div>\n <button className={`ogx-menu-item${isPinnedLeft ? ' ogx-menu-item--active' : ''}`}\n onClick={() => handlePin('left')} role=\"menuitemradio\" aria-checked={isPinnedLeft} aria-label=\"Pin to left\">\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\">{isPinnedLeft ? <ActiveDotIcon /> : <InactiveDotIcon />}</span>\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><PinLeftIcon /></span>\n Pin to Left\n </button>\n <button className={`ogx-menu-item${isPinnedRight ? ' ogx-menu-item--active' : ''}`}\n onClick={() => handlePin('right')} role=\"menuitemradio\" aria-checked={isPinnedRight} aria-label=\"Pin to right\">\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\">{isPinnedRight ? <ActiveDotIcon /> : <InactiveDotIcon />}</span>\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><PinRightIcon /></span>\n Pin to Right\n </button>\n <button className={`ogx-menu-item${isUnpinned ? ' ogx-menu-item--active' : ''}`}\n onClick={() => handlePin(null)} role=\"menuitemradio\" aria-checked={isUnpinned} aria-label=\"Unpin column\">\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\">{isUnpinned ? <ActiveDotIcon /> : <InactiveDotIcon />}</span>\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><UnpinIcon /></span>\n Unpin\n </button>\n <div className=\"ogx-menu-divider\" />\n\n { }\n <button className=\"ogx-menu-item\" onClick={handleHide} role=\"menuitem\" aria-label={`Hide ${colLabel} column`}>\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\" />\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><HideIcon /></span>\n Hide Column\n </button>\n\n <div className=\"ogx-menu-divider\" />\n <button className=\"ogx-menu-item\" onClick={() => { onManageColumns?.(); onClose(); }} role=\"menuitem\" aria-label=\"Manage all columns\">\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\" />\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><ManageColumnsIcon /></span>\n Manage columns\n </button>\n </div>,\n (anchorEl?.closest('.ogx-theme-provider') || document.body)\n );\n}\n","import React from 'react';\nimport { Checkbox } from '../ui/Checkbox';\nimport { ColumnResizeHandle } from '../ColumnResizeHandle/ColumnResizeHandle';\nimport type { GridColDef, GridRowModel, GridSortDirection, GridColumnPinning, GridAggregationModel, GridColumnGroup, GridColumnGroupingModel } from '../../types';\nimport { isColumnPinned, calculatePinnedPositions } from '../../utils/pinning';\nimport { ColumnMenu } from './ColumnMenu';\n\n\nfunction MenuIcon() {\n return (\n <svg focusable=\"false\" aria-hidden=\"true\" viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"18\" height=\"18\">\n <path d=\"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"></path>\n </svg>\n );\n}\n\nfunction SwapIcon() {\n return (\n <svg focusable=\"false\" aria-hidden=\"true\" viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"currentColor\">\n <path d=\"M6.99 11L3 15l3.99 4v-3H14v-2H6.99v-3zM21 9l-3.99-4v3H10v2h7.01v3L21 9z\"></path>\n </svg>\n );\n}\n\n\n// ─── Group header helpers ─────────────────────────────────────────────────────\n\n/** Collect all leaf field names from a group node (recursive). */\nfunction collectGroupFields(group: GridColumnGroup): string[] {\n const out: string[] = [];\n for (const child of group.children) {\n if (typeof child === 'string') out.push(child);\n else out.push(...collectGroupFields(child));\n }\n return out;\n}\n\n/** Max nesting depth of the group tree (1 = single level). */\nfunction groupTreeDepth(groups: GridColumnGroupingModel): number {\n let d = 0;\n function walk(g: GridColumnGroup, depth: number) {\n d = Math.max(d, depth);\n for (const c of g.children) if (typeof c !== 'string') walk(c, depth + 1);\n }\n groups.forEach(g => walk(g, 1));\n return d;\n}\n\ninterface GroupCell { key: string; label: string; width: number; isGroup: boolean; }\n\n/**\n * Builds the flat array of GroupCell descriptors for one row (level).\n * level 0 = top-most group row.\n * allFields is the ORDERED list of all visible columns (including spacers).\n */\nfunction buildGroupRow(\n groups: GridColumnGroupingModel,\n allFields: { field: string; width: number }[],\n level: number,\n): GroupCell[] {\n // Map each field → the group that owns it at `level`\n function findAtLevel(g: GridColumnGroup, field: string, cur: number): GridColumnGroup | null {\n if (!collectGroupFields(g).includes(field)) return null;\n if (cur === level) return g;\n for (const child of g.children) {\n if (typeof child !== 'string') {\n const found = findAtLevel(child, field, cur + 1);\n if (found) return found;\n }\n }\n return null;\n }\n\n const fieldGroup = new Map<string, GridColumnGroup | null>();\n for (const f of allFields) {\n let found: GridColumnGroup | null = null;\n for (const g of groups) {\n found = findAtLevel(g, f.field, 0);\n if (found) break;\n }\n fieldGroup.set(f.field, found);\n }\n\n const cells: GroupCell[] = [];\n let i = 0;\n while (i < allFields.length) {\n const item = allFields[i];\n const group = fieldGroup.get(item.field) ?? null;\n const w = item.width;\n\n if (!group) {\n cells.push({ key: `fg-${item.field}-${level}`, label: '', width: w, isGroup: false });\n i++;\n } else {\n let totalW = 0;\n let j = i;\n while (j < allFields.length && fieldGroup.get(allFields[j].field) === group) {\n totalW += allFields[j].width;\n j++;\n }\n cells.push({ key: `${group.groupId}-${level}`, label: group.headerName, width: totalW, isGroup: true });\n i = j;\n }\n }\n return cells;\n}\n\n// ─── Props ────────────────────────────────────────────────────────────────────\n\nexport interface HeaderProps<R extends GridRowModel = GridRowModel> {\n columns: GridColDef<R>[];\n allColumns?: GridColDef<R>[];\n columnGroupingModel?: GridColumnGroupingModel;\n checkboxSelection?: boolean;\n allSelected?: boolean;\n someSelected?: boolean;\n onSelectAll?: (isSelected: boolean) => void;\n onSort?: (field: string, direction: GridSortDirection) => void;\n sortModel?: Array<{ field: string; sort: 'asc' | 'desc' }>;\n onColumnResize?: (field: string, newWidth: number) => void;\n columnWidths?: Record<string, number>;\n pinnedColumns?: GridColumnPinning;\n hasDetailPanel?: boolean;\n pinCheckboxColumn?: boolean;\n pinExpandColumn?: boolean;\n rowReordering?: boolean;\n aggregationModel?: GridAggregationModel;\n\n draggedColumn?: string | null;\n dragOverColumn?: string | null;\n onDragStart?: (field: string) => (event: React.DragEvent) => void;\n onDragOver?: (field: string) => (event: React.DragEvent) => void;\n onDragEnd?: () => void;\n onDrop?: (targetField: string) => (event: React.DragEvent) => void;\n focusedCell?: { id: string | number; field: string } | null;\n onHeaderClick?: (field: string) => void;\n onHideColumn?: (field: string) => void;\n onPinColumn?: (field: string, side: 'left' | 'right' | null) => void;\n onManageColumns?: () => void;\n}\n\nexport function Header<R extends GridRowModel = GridRowModel>(props: HeaderProps<R>) {\n const {\n columns,\n allColumns,\n columnGroupingModel,\n checkboxSelection = false,\n allSelected = false,\n someSelected = false,\n onSelectAll,\n onSort,\n sortModel = [],\n onColumnResize,\n columnWidths = {},\n pinnedColumns,\n hasDetailPanel = false,\n pinCheckboxColumn = true,\n pinExpandColumn = true,\n rowReordering = false,\n aggregationModel,\n draggedColumn,\n dragOverColumn,\n onDragStart,\n onDragOver,\n onDragEnd,\n onDrop,\n focusedCell,\n onHeaderClick,\n onHideColumn,\n onPinColumn,\n onManageColumns,\n } = props;\n\n const cellRefs = React.useRef<Record<string, HTMLElement | null>>({});\n const [menuOpenParams, setMenuOpenParams] = React.useState<{ colDef: GridColDef<R>; anchorEl: HTMLElement } | null>(null);\n\n const handleMenuOpen = (colDef: GridColDef<R>) => (event: React.MouseEvent) => {\n event.stopPropagation();\n setMenuOpenParams({ colDef, anchorEl: event.currentTarget as HTMLElement });\n };\n\n const handleMenuClose = () => {\n setMenuOpenParams(null);\n };\n\n React.useLayoutEffect(() => {\n if (focusedCell?.id === 'HEADER') {\n const element = cellRefs.current[focusedCell.field];\n if (element) {\n element.focus();\n }\n }\n }, [focusedCell]);\n\n const handleColumnClick = (colDef: GridColDef<R>) => () => {\n if (colDef.sortable === false || !onSort) return;\n\n const currentSort = sortModel.find(item => item.field === colDef.field);\n let newDirection: GridSortDirection = 'asc';\n\n if (currentSort) {\n if (currentSort.sort === 'asc') {\n newDirection = 'desc';\n } else {\n newDirection = null;\n }\n }\n\n onSort(colDef.field, newDirection);\n };\n\n const getSortIcon = (field: string) => {\n const sortItem = sortModel.find(item => item.field === field);\n if (!sortItem) return null;\n\n return (\n <span className={`ogx__sort-icon ogx__sort-icon--${sortItem.sort}`} aria-hidden=\"true\" />\n );\n };\n\n const pinnedPositions = React.useMemo(() => {\n return calculatePinnedPositions(\n columns,\n columnWidths,\n pinnedColumns,\n checkboxSelection,\n pinCheckboxColumn,\n hasDetailPanel,\n pinExpandColumn,\n rowReordering\n );\n }, [columns, columnWidths, pinnedColumns, checkboxSelection, pinCheckboxColumn, hasDetailPanel, pinExpandColumn, rowReordering]);\n\n const groupDepth = columnGroupingModel ? groupTreeDepth(columnGroupingModel) : 0;\n\n // All non-spacer fields in order (for group-span math) with their effective physical width\n const allCols = allColumns ?? columns;\n const allLeafFields = allCols\n .filter(c => !(c as any).isSpacer)\n .map(c => ({\n field: c.field,\n width: columnWidths[c.field] ?? c.width ?? 100\n }));\n\n // --- CHECKBOX / DETAIL / REORDER prefix width (for group filler) ---\n const CHECKBOX_W = 48;\n const REORDER_W = 48;\n const EXPAND_W = 48;\n const prefixWidth =\n (rowReordering ? REORDER_W : 0) +\n (hasDetailPanel ? EXPAND_W : 0) +\n (checkboxSelection ? CHECKBOX_W : 0);\n\n return (\n // Outer sticky wrapper — both group rows AND column header row live here\n // so they ALL stay sticky together and scroll horizontally as one unit.\n <div className=\"ogx__header-wrap\">\n {/* ── Group header rows ── */}\n {groupDepth > 0 && Array.from({ length: groupDepth }, (_, level) => {\n const row = buildGroupRow(\n columnGroupingModel!,\n allLeafFields,\n level,\n );\n return (\n <div key={`ogx-grp-${level}`} className=\"ogx-col-group-row\" role=\"row\">\n {/* Filler for checkbox / reorder / detailPanel prefix */}\n {prefixWidth > 0 && (\n <div\n className=\"ogx-col-group-cell ogx-col-group-cell--filler\"\n style={{ width: prefixWidth, minWidth: prefixWidth, flexShrink: 0 }}\n role=\"columnheader\"\n />\n )}\n {row.map(cell => (\n <div\n key={cell.key}\n role=\"columnheader\"\n className={`ogx-col-group-cell ${cell.isGroup ? 'ogx-col-group-cell--group' : 'ogx-col-group-cell--filler'}`}\n style={{ width: cell.width, minWidth: cell.width, flexShrink: 0 }}\n title={cell.isGroup ? cell.label : undefined}\n >\n {cell.isGroup && (\n <span className=\"ogx-col-group-cell__label\">{cell.label}</span>\n )}\n </div>\n ))}\n </div>\n );\n })}\n\n {/* ── Column header row ── */}\n <div className=\"ogx__header\" role=\"row\">\n { }\n {rowReordering && (\n <div\n className=\"ogx__header-cell ogx__header-cell--pinned ogx__header-cell--pinned-left\"\n role=\"columnheader\"\n aria-label=\"Row reorder handle\"\n title=\"Drag to reorder rows\"\n style={{\n minWidth: 48,\n maxWidth: 48,\n position: 'sticky',\n left: 0,\n zIndex: 4\n }}\n />\n )}\n\n { }\n {hasDetailPanel && (\n <div\n className={`ogx__header-cell ogx__header-cell--expand ${pinExpandColumn ? 'ogx__header-cell--pinned ogx__header-cell--pinned-left' : ''\n }`}\n role=\"columnheader\"\n aria-label=\"Expand row details\"\n style={{\n minWidth: 48,\n maxWidth: 48,\n position: pinExpandColumn ? 'sticky' : undefined,\n left: pinExpandColumn ? (rowReordering ? 48 : 0) : undefined,\n zIndex: pinExpandColumn ? 5 : undefined\n }}\n >\n { }\n </div>\n )}\n\n { }\n {checkboxSelection && (\n <div\n className={`ogx__header-cell ogx__header-cell--checkbox ${pinCheckboxColumn ? 'ogx__header-cell--pinned ogx__header-cell--pinned-left' : ''\n }`}\n role=\"columnheader\"\n style={{\n position: pinCheckboxColumn ? 'sticky' : undefined,\n left: pinCheckboxColumn ? ((rowReordering ? 48 : 0) + (hasDetailPanel && pinExpandColumn ? 48 : 0)) : undefined,\n\n }}\n >\n <Checkbox\n id=\"ogx-select-all\"\n name=\"ogx-select-all\"\n checked={allSelected}\n indeterminate={someSelected}\n onChange={(e) => onSelectAll?.(e.target.checked)}\n aria-label={allSelected ? 'Deselect all rows' : 'Select all rows'}\n tabIndex={focusedCell?.id === 'HEADER' && focusedCell.field === '__checkbox_col__' ? 0 : -1}\n onMouseDown={(e) => e.preventDefault()}\n inputRef={(el) => { cellRefs.current['__checkbox_col__'] = el; }}\n />\n </div>\n )}\n\n {columns.map((colDef, index) => {\n if ((colDef as any).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 any, colIndex: index })\n : colDef.headerName || colDef.field;\n\n const handleHeaderClick = (e: React.MouseEvent) => {\n if ((e.target as HTMLElement).closest('.ogx-column-resize-handle')) {\n e.stopPropagation();\n return;\n }\n onHeaderClick?.(colDef.field);\n if (isSortable) {\n handleColumnClick(colDef)();\n }\n };\n\n const handleDragStart = onDragStart ? onDragStart(colDef.field) : undefined;\n const handleDragOver = onDragOver ? onDragOver(colDef.field) : undefined;\n const handleDrop = onDrop ? onDrop(colDef.field) : undefined;\n\n return (\n <div\n key={colDef.field}\n className={classNames}\n style={style}\n onClick={handleHeaderClick}\n role=\"columnheader\"\n draggable={!!onDragStart}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDragEnd={onDragEnd}\n onDrop={handleDrop}\n aria-sort={\n isSortable\n ? (isSorted\n ? sortModel.find(item => item.field === colDef.field)?.sort === 'asc'\n ? 'ascending'\n : 'descending'\n : 'none')\n : undefined\n }\n aria-colindex={index + 1 + (checkboxSelection ? 1 : 0)}\n data-field={colDef.field}\n tabIndex={-1}\n ref={(el) => { cellRefs.current[colDef.field] = el; }}\n >\n <div className=\"ogx__header-cell-content\">\n {isDragging && (\n <div className=\"ogx__header-drag-icon\">\n <SwapIcon />\n </div>\n )}\n <div className=\"ogx__header-cell-title-wrapper\">\n <span className=\"ogx__header-cell-title\">\n {headerContent}\n </span>\n {aggregationModel && aggregationModel[colDef.field] && (\n <span className=\"ogx__header-cell-aggregation\">\n {aggregationModel[colDef.field]}\n </span>\n )}\n </div>\n {isSortable && getSortIcon(colDef.field)}\n {!colDef.disableColumnMenu && (\n <button\n className=\"ogx__menu-icon-btn\"\n onClick={handleMenuOpen(colDef)}\n aria-label={`Open column menu for ${colDef.headerName || colDef.field}`}\n aria-haspopup=\"menu\"\n tabIndex={-1}\n >\n <MenuIcon />\n </button>\n )}\n </div>\n\n { }\n {isResizable && onColumnResize && (\n <ColumnResizeHandle\n field={colDef.field}\n currentWidth={effectiveWidth}\n onResize={onColumnResize}\n minWidth={colDef.minWidth}\n maxWidth={colDef.maxWidth}\n />\n )}\n </div>\n );\n })}\n\n {menuOpenParams && (\n <ColumnMenu\n colDef={menuOpenParams.colDef}\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","import { useEffect, useRef, useState } from 'react';\nimport type { GridRenderCellParams } from '../../types';\n\nexport interface GridEditInputCellProps extends GridRenderCellParams {\n onValueChange: (value: any) => 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(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={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(value ?? '');\n const ref = useRef<HTMLInputElement>(null);\n useEffect(() => { ref.current?.focus(); }, []);\n\n return (\n <input\n ref={ref}\n type=\"date\"\n className=\"ogx__edit-input\"\n value={local}\n onChange={e => { setLocal(e.target.value); onValueChange(e.target.value); }}\n onBlur={onCommit}\n onKeyDown={e => {\n if (e.key === 'Enter') { e.stopPropagation(); onCommit(); }\n if (e.key === 'Escape') { e.stopPropagation(); onCancel(); }\n }}\n />\n );\n}\n\n// ─── Router ───────────────────────────────────────────────────────────────────\nexport function GridEditInputCell(props: GridEditInputCellProps) {\n const { colDef } = props;\n\n switch (colDef.type) {\n case 'number':\n return <div className=\"ogx__edit-cell\"><NumberEditor {...props} /></div>;\n case 'boolean':\n return <div className=\"ogx__edit-cell\"><BooleanEditor {...props} /></div>;\n case 'singleSelect':\n return <div className=\"ogx__edit-cell\"><SelectEditor {...props} /></div>;\n case 'date':\n return <div className=\"ogx__edit-cell\"><DateEditor {...props} /></div>;\n default:\n return <div className=\"ogx__edit-cell\"><TextEditor {...props} /></div>;\n }\n}\n","\nimport React from 'react';\nimport type { GridColDef, GridRowModel, GridPinnedPosition, GridCellParams } from '../../types';\nimport type { CellColSpanInfo } from '../../hooks/features/useGridSpanning';\n\nimport { GridEditInputCell } from './GridEditInputCell';\n\nexport interface CellProps<R extends GridRowModel = GridRowModel> {\n onCellClick?: (params: GridCellParams<R>) => void;\n onCellEditStart?: (field: string, value: any) => void;\n onCellValueChange?: (field: string, newValue: any) => void;\n value: any;\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: any) => void;\n\n colSpanInfo?: CellColSpanInfo;\n rowSpan?: number;\n isHiddenByRowSpan?: boolean;\n}\n\nfunction CellImpl<R extends GridRowModel = GridRowModel>(props: CellProps<R>) {\n const {\n onCellClick,\n onCellEditStart,\n onCellValueChange,\n value,\n row,\n colDef,\n rowIndex,\n colIndex,\n isSelected,\n onClick,\n width,\n pinnedPosition,\n pinnedOffset,\n isFocused,\n isFocusVisible,\n isEditable,\n isEditing,\n onEditStart,\n onEditStop,\n onValueChange,\n\n colSpanInfo,\n rowSpan: rowSpanProp,\n isHiddenByRowSpan\n } = props;\n\n if (colSpanInfo?.spannedByColSpan) {\n\n return null;\n }\n\n if (isHiddenByRowSpan) {\n\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 e.stopPropagation();\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 handleValueChange = React.useCallback((newValue: any) => {\n if (onCellValueChange) {\n onCellValueChange(colDef.field, newValue);\n } else {\n onValueChange?.(newValue);\n }\n }, [onCellValueChange, onValueChange, colDef.field]);\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 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 // Render custom cell content OR Edit Content\n const cellContent = React.useMemo(() => {\n if (isEditing && (onCellValueChange || onValueChange) && onEditStop) {\n if (colDef.renderEditCell) {\n return colDef.renderEditCell({\n value,\n row,\n field: colDef.field,\n colDef: colDef as any,\n rowIndex,\n colIndex\n });\n }\n return (\n <GridEditInputCell\n value={value}\n row={row}\n field={colDef.field}\n colDef={colDef as any}\n rowIndex={rowIndex}\n colIndex={colIndex}\n onValueChange={handleValueChange}\n onCommit={() => onEditStop()}\n onCancel={() => onEditStop(true)}\n />\n );\n }\n\n if (colDef.renderCell) {\n return colDef.renderCell({\n value,\n row,\n field: colDef.field,\n colDef: colDef as any,\n rowIndex,\n colIndex\n });\n }\n\n return formattedValue;\n }, [value, row, colDef, rowIndex, colIndex, formattedValue, isEditing, handleValueChange, onEditStop, onCellValueChange, onValueChange]);\n\n const isPinned = pinnedPosition !== null && pinnedPosition !== undefined;\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: colDef as any, rowIndex, colIndex }) || '';\n }\n return colDef.cellClassName;\n }, [colDef, value, row, rowIndex, colIndex]);\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 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 return (\n <div\n ref={cellRef}\n className={classNames}\n style={style}\n onClick={handleClick}\n onDoubleClick={handleDoubleClick}\n role=\"gridcell\"\n aria-colindex={colIndex + 1}\n aria-readonly={!isEditable || undefined}\n tabIndex={-1}\n data-field={colDef.field}\n data-colindex={colIndex}\n {...(colSpan > 1 ? { 'aria-colspan': colSpan } : {})}\n {...(rowSpan > 1 ? { 'aria-rowspan': rowSpan } : {})}\n >\n <div className=\"ogx__cell-content\">\n {cellContent}\n </div>\n </div>\n );\n}\n\nexport const Cell = React.memo(CellImpl) as typeof CellImpl;\n","\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 React from 'react';\n\nexport interface DragHandleIconProps extends React.ButtonHTMLAttributes<HTMLButtonElement> { }\n\nexport const DragHandleIcon: React.FC<DragHandleIconProps> = ({ className = '', ...props }) => {\n return (\n <button\n type=\"button\"\n className={`ogx-drag-handle ${className}`}\n aria-label=\"Drag to reorder row\"\n {...props}\n >\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M11 18c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2zm-2-8c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm6 4c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\" />\n </svg>\n </button>\n );\n};\n","\nimport React from 'react';\nimport type { GridRowModel, GridRowId, GridDetailPanelHeight } from '../../types';\n\n\nexport interface DetailPanelProps<R extends GridRowModel = GridRowModel> {\n row: R;\n rowId: GridRowId;\n rowIndex: number;\n content: React.ReactNode;\n height: GridDetailPanelHeight;\n isExpanded: boolean;\n}\n\nexport function DetailPanel<R extends GridRowModel = GridRowModel>(props: DetailPanelProps<R>) {\n const { content, height, isExpanded } = props;\n\n if (!isExpanded) {\n return null;\n }\n\n const style: React.CSSProperties = {\n height: height === 'auto' ? 'auto' : `${height}px`,\n overflow: height === 'auto' ? 'visible' : 'auto'\n };\n\n return (\n <div className=\"ogx__detail-panel\" style={style}>\n <div className=\"ogx__detail-panel-content\">\n {content}\n </div>\n </div>\n );\n}\n","\nimport React from 'react';\nimport { Cell } from '../Cell/Cell';\nimport { Checkbox } from '../ui/Checkbox';\nimport { ExpandIcon } from '../ui/ExpandIcon';\nimport { DragHandleIcon } from '../ui/DragHandleIcon';\nimport { DetailPanel } from '../DetailPanel/DetailPanel';\nimport type { GridRowModel, GridColDef, GridRowId, GridColumnPinning, GridRowPinning, GridRowParams, GridCellParams, GridDetailPanelHeight } from '../../types';\nimport type { CellColSpanInfo, RowSpanningCaches } from '../../hooks/features/useGridSpanning';\nimport { isColumnPinned, calculatePinnedPositions, isRowPinned } from '../../utils/pinning';\n\n\nexport interface RowProps<R extends GridRowModel = GridRowModel> {\n row: R;\n columns: GridColDef<R>[];\n rowIndex: number;\n isSelected?: boolean;\n checkboxSelection?: boolean;\n onRowClick?: (params: GridRowParams<R>) => void;\n onCellClick?: (params: GridCellParams<R>) => void;\n onSelectionChange?: (rowId: GridRowId, isSelected: boolean) => void;\n columnWidths?: Record<string, number>;\n pinnedColumns?: GridColumnPinning;\n pinnedRows?: GridRowPinning;\n\n hasDetailPanel?: boolean;\n isDetailPanelExpanded?: boolean;\n onDetailPanelToggle?: (rowId: GridRowId) => void;\n detailPanelContent?: React.ReactNode;\n detailPanelHeight?: GridDetailPanelHeight;\n\n pinCheckboxColumn?: boolean;\n pinExpandColumn?: boolean;\n\n rowReordering?: boolean;\n onDragStart?: (id: GridRowId) => (event: React.DragEvent) => void;\n onDragOver?: (id: GridRowId) => (event: React.DragEvent) => void;\n onDragEnd?: () => void;\n onDrop?: (targetId: GridRowId) => (event: React.DragEvent) => void;\n isDragging?: boolean;\n isDragOver?: boolean;\n\n editingCell?: { id: GridRowId; field: string; value: any; } | null;\n onEditStart?: (params: { id: GridRowId, field: string, value: any }) => void;\n onEditStop?: (params?: { cancel?: boolean }) => void;\n onEditCellValueChange?: (params: { id: GridRowId, field: string, value: any }) => void;\n\n focusedCellField?: string | null;\n isFocusVisible?: boolean;\n\n colspanMap?: Map<GridRowId, Record<string, CellColSpanInfo>>;\n rowSpanningCaches?: RowSpanningCaches;\n rowHeight?: number;\n}\n\nexport function Row<R extends GridRowModel = GridRowModel>(props: RowProps<R>) {\n const {\n row,\n columns,\n rowIndex,\n isSelected = false,\n checkboxSelection = false,\n onRowClick,\n onCellClick,\n onSelectionChange,\n columnWidths = {},\n pinnedColumns,\n pinnedRows,\n hasDetailPanel = false,\n isDetailPanelExpanded = false,\n onDetailPanelToggle,\n detailPanelContent,\n detailPanelHeight = 200,\n pinCheckboxColumn = true,\n pinExpandColumn = true,\n rowReordering = false,\n onDragStart,\n onDragOver,\n onDragEnd,\n onDrop,\n isDragging,\n isDragOver,\n\n editingCell,\n onEditStart,\n onEditStop,\n onEditCellValueChange,\n\n focusedCellField,\n isFocusVisible,\n\n colspanMap,\n rowSpanningCaches,\n rowHeight = 52\n } = props;\n\n const expandCellRef = React.useRef<HTMLDivElement>(null);\n const checkboxCellRef = React.useRef<HTMLDivElement>(null);\n\n // ── Skeleton row (shown during infinite-scroll fetch) ─────────────────────\n if ((row as any)._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 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 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 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 rowPinnedPosition = isRowPinned(row.id, pinnedRows);\n const isRowPinnedTop = rowPinnedPosition === 'top';\n const isRowPinnedBottom = rowPinnedPosition === 'bottom';\n\n const isGroupRow = (row as any)._hasChildren === true;\n\n const handleCellEditStart = React.useCallback((field: string, value: any) => {\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: any) => {\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 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 any,\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 any,\n rowIndex,\n colIndex: -1\n });\n }}\n >\n <Checkbox\n id={`ogx-select-row-${row.id}`}\n name={`ogx-select-row-${row.id}`}\n checked={isSelected}\n onChange={handleCheckboxChange}\n onClick={(e) => e.stopPropagation()}\n aria-label={isSelected ? `Deselect row ${row.id}` : `Select row ${row.id}`}\n tabIndex={-1}\n onMouseDown={(e) => e.preventDefault()}\n />\n </div>\n )}\n\n { }\n {columns.map((colDef, colIndex) => {\n if ((colDef as any).isSpacer) {\n return (\n <div\n key={colDef.field}\n style={{ width: colDef.width, minWidth: colDef.width, flexShrink: 0 }}\n aria-hidden=\"true\"\n />\n );\n }\n const value = colDef.valueGetter\n ? colDef.valueGetter({ row, field: colDef.field, value: row[colDef.field] })\n : row[colDef.field];\n\n const effectiveWidth = columnWidths[colDef.field] ?? colDef.width;\n\n const pinnedPosition = isColumnPinned(colDef.field, pinnedColumns);\n const pinnedOffset = pinnedPosition ? pinnedPositions[colDef.field] : undefined;\n\n const isEditing = editingCell?.id === row.id && editingCell?.field === colDef.field;\n\n const cellValue = isEditing ? editingCell?.value : value;\n\n const colSpanInfo = colspanMap?.get(row.id)?.[colDef.field];\n const rowSpan = rowSpanningCaches?.spannedCells[row.id]?.[colDef.field];\n const isHiddenByRowSpan = rowSpanningCaches?.hiddenCells[row.id]?.[colDef.field] || false;\n\n return (\n <Cell\n key={colDef.field}\n value={cellValue}\n row={row}\n colDef={colDef}\n rowIndex={rowIndex}\n colIndex={colIndex}\n isSelected={isSelected}\n onCellClick={onCellClick}\n width={effectiveWidth}\n pinnedPosition={pinnedPosition}\n pinnedOffset={pinnedOffset}\n\n isFocused={focusedCellField === colDef.field}\n isFocusVisible={isFocusVisible}\n\n isEditable={colDef.editable}\n isEditing={isEditing}\n onCellEditStart={handleCellEditStart}\n onEditStop={handleEditStopWrapper}\n onCellValueChange={handleCellValueChange}\n\n colSpanInfo={colSpanInfo}\n rowSpan={rowSpan}\n isHiddenByRowSpan={isHiddenByRowSpan}\n />\n );\n })}\n </div>\n\n { }\n {hasDetailPanel && (\n <DetailPanel\n row={row}\n rowId={row.id}\n rowIndex={rowIndex}\n content={detailPanelContent}\n height={detailPanelHeight}\n isExpanded={isDetailPanelExpanded}\n />\n )}\n </>\n );\n}\n","import React from 'react';\n\n\ninterface SkeletonRowProps {\n columns: any[];\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 = 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","\nimport React from 'react';\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: 'text' | 'outlined' | 'contained';\n size?: 'small' | 'medium' | 'large';\n color?: 'primary' | 'secondary' | 'default';\n disabled?: boolean;\n children: React.ReactNode;\n}\n\nexport const Button: React.FC<ButtonProps> = ({\n variant = 'text',\n size = 'medium',\n color = 'default',\n disabled = false,\n className = '',\n children,\n ...props\n}) => {\n const classNames = [\n 'ogx-button',\n `ogx-button--${variant}`,\n `ogx-button--${size}`,\n `ogx-button--${color}`,\n disabled && 'ogx-button--disabled',\n className\n ].filter(Boolean).join(' ');\n\n return (\n <button\n className={classNames}\n disabled={disabled}\n {...props}\n >\n {children}\n </button>\n );\n};\n","\nimport React from 'react';\nimport { Button } from '../ui/Button';\n\nexport interface PaginationProps {\n page: number;\n pageSize: number;\n rowCount: number;\n onPageChange: (page: number) => void;\n onPageSizeChange: (pageSize: number) => void;\n pageSizeOptions?: number[];\n showFirstButton?: boolean;\n showLastButton?: boolean;\n}\n\nexport function Pagination(props: PaginationProps) {\n const {\n page,\n pageSize,\n rowCount,\n onPageChange,\n onPageSizeChange,\n pageSizeOptions = [10, 25, 50, 100],\n showFirstButton = true,\n showLastButton = true\n } = props;\n\n const pageCount = Math.max(1, Math.ceil(rowCount / pageSize));\n const currentPage = Math.min(page, pageCount - 1);\n\n const firstRowIndex = currentPage * pageSize;\n const lastRowIndex = Math.min(firstRowIndex + pageSize, rowCount);\n const displayedRows = rowCount === 0 ? 0 : `${firstRowIndex + 1}–${lastRowIndex}`;\n\n const handleFirstPage = () => {\n onPageChange(0);\n };\n\n const handlePreviousPage = () => {\n onPageChange(Math.max(0, currentPage - 1));\n };\n\n const handleNextPage = () => {\n onPageChange(Math.min(pageCount - 1, currentPage + 1));\n };\n\n const handleLastPage = () => {\n onPageChange(pageCount - 1);\n };\n\n const handlePageSizeChange = (event: React.ChangeEvent<HTMLSelectElement>) => {\n const newPageSize = parseInt(event.target.value, 10);\n onPageSizeChange(newPageSize);\n\n };\n\n const isFirstPage = currentPage === 0;\n const isLastPage = currentPage >= pageCount - 1;\n\n return (\n <div className=\"ogx-pagination\" role=\"navigation\" aria-label=\"Pagination\">\n { }\n <div className=\"ogx-pagination__page-size\">\n <label htmlFor=\"page-size-select\" className=\"ogx-pagination__label\">\n Rows per page:\n </label>\n <select\n id=\"page-size-select\"\n className=\"ogx-pagination__select\"\n value={pageSize}\n onChange={handlePageSizeChange}\n aria-label=\"Rows per page\"\n >\n {pageSizeOptions.map(option => (\n <option key={option} value={option}>\n {option}\n </option>\n ))}\n </select>\n </div>\n\n { }\n <div className=\"ogx-pagination__info\" aria-live=\"polite\" aria-atomic=\"true\">\n {displayedRows} of {rowCount}\n </div>\n\n { }\n <div className=\"ogx-pagination__actions\">\n {showFirstButton && (\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={handleFirstPage}\n disabled={isFirstPage}\n aria-label=\"Go to first page\"\n title=\"First page\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M18.41 16.59L13.82 12l4.59-4.59L17 6l-6 6 6 6zM6 6h2v12H6z\" />\n </svg>\n </Button>\n )}\n\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={handlePreviousPage}\n disabled={isFirstPage}\n aria-label=\"Go to previous page\"\n title=\"Previous page\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\" />\n </svg>\n </Button>\n\n <div className=\"ogx-pagination__page-info\" aria-current=\"page\">\n Page {currentPage + 1} of {pageCount}\n </div>\n\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={handleNextPage}\n disabled={isLastPage}\n aria-label=\"Go to next page\"\n title=\"Next page\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" />\n </svg>\n </Button>\n\n {showLastButton && (\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={handleLastPage}\n disabled={isLastPage}\n aria-label=\"Go to last page\"\n title=\"Last page\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M5.59 7.41L10.18 12l-4.59 4.59L7 18l6-6-6-6zM16 6h2v12h-2z\" />\n </svg>\n </Button>\n )}\n </div>\n </div>\n );\n}\n","\nimport { useReducer, useCallback, useMemo, useRef, useEffect } from 'react';\nimport type {\n 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_SCROLL'; payload: { scrollTop: number; scrollLeft: number } }\n | { type: 'SET_DIMENSIONS'; payload: { viewportWidth: number; viewportHeight: number } }\n | { type: 'SET_DATASOURCE_LOADING'; payload: boolean }\n | { type: 'SET_DATASOURCE_ERROR'; payload: any }\n | { type: 'SET_ROW_COUNT'; payload: number };\n\nfunction createInitialState(rows: GridRowModel[], columns: GridColDef[], columnVisibilityModel: GridColumnVisibilityModel = {}): GridState {\n const idRowsLookup = new Map<GridRowId, GridRowModel>();\n const allRows: GridRowId[] = [];\n\n rows.forEach(row => {\n const id = row.id;\n idRowsLookup.set(id, row);\n allRows.push(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);\n orderedFields.push(col.field);\n });\n\n return {\n rows: {\n idRowsLookup,\n allRows\n },\n columns: {\n all: columns,\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 scrollTop: 0,\n scrollLeft: 0\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: {}\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_SCROLL':\n return {\n ...state,\n virtualization: {\n ...state.virtualization,\n scrollTop: action.payload.scrollTop,\n scrollLeft: action.payload.scrollLeft\n }\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 = useMemo(\n () => createInitialState(rows, columns as any, columnVisibilityModel),\n [] \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) as any,\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 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 setScroll = useCallback((scrollTop: number, scrollLeft: number) => {\n dispatch({ type: 'SET_SCROLL', payload: { scrollTop, scrollLeft } });\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: any) => {\n dispatch({ type: 'SET_DATASOURCE_ERROR', payload: error });\n }, []);\n\n const setRowCount = useCallback((count: number) => {\n dispatch({ type: 'SET_ROW_COUNT', payload: count });\n }, []);\n\n const apiRef = useRef<GridApi>({\n getRow: (id: GridRowId) => stateRef.current.rows.idRowsLookup.get(id) || null,\n getAllRows: () => Array.from(stateRef.current.rows.idRowsLookup.values()),\n getVisibleRows: () => Array.from(stateRef.current.rows.idRowsLookup.values()),\n getAggregationResult: () => null,\n getAggregationModel: () => null,\n getColumn: (field: string) => stateRef.current.columns.lookup.get(field) || null,\n getAllColumns: () => stateRef.current.columns.all,\n getVisibleColumns: () => stateRef.current.columns.all,\n selectRow: (id: GridRowId, isSelected = true) => {\n const newSelection = new Set(stateRef.current.selection.selectedRows);\n if (isSelected) {\n newSelection.add(id);\n } else {\n newSelection.delete(id);\n }\n setSelection(newSelection);\n },\n selectRows: (ids: GridRowId[], isSelected = true) => {\n const newSelection = new Set(stateRef.current.selection.selectedRows);\n ids.forEach(id => {\n if (isSelected) {\n newSelection.add(id);\n } else {\n newSelection.delete(id);\n }\n });\n setSelection(newSelection);\n },\n getSelectedRows: () => Array.from(stateRef.current.selection.selectedRows),\n sortColumn: (field: string, direction) => {\n if (direction === null) {\n setSortModel(stateRef.current.sorting.sortModel.filter(item => item.field !== field));\n } else {\n const existingIndex = stateRef.current.sorting.sortModel.findIndex(item => item.field === field);\n if (existingIndex >= 0) {\n const newModel = [...stateRef.current.sorting.sortModel];\n newModel[existingIndex] = { field, sort: direction };\n setSortModel(newModel);\n } else {\n setSortModel([...stateRef.current.sorting.sortModel, { field, sort: direction }]);\n }\n }\n },\n getSortModel: () => stateRef.current.sorting.sortModel,\n setFilterModel,\n getFilterModel: () => stateRef.current.filter.filterModel,\n setPage: (page: number) => {\n setPaginationModel({ ...stateRef.current.pagination.paginationModel, page });\n },\n setPageSize: (pageSize: number) => {\n setPaginationModel({ ...stateRef.current.pagination.paginationModel, pageSize, page: 0 });\n },\n scrollToIndexes: () => {\n\n },\n copySelectedRows: () => Promise.resolve()\n });\n\n return {\n state,\n dispatch,\n apiRef,\n setRows,\n setColumns,\n setSortModel,\n setFilterModel,\n setPaginationModel,\n setSelection,\n setScroll,\n setDimensions,\n setDataSourceLoading,\n setDataSourceError,\n setRowCount\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 any,\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","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","\nimport type { GridRowModel, GridFilterItem, GridFilterModel, GridFilterGroup } from '../../types';\n\nexport const FILTER_OPERATORS = {\n contains: (value: any, filterValue: any): boolean => {\n if (value == null || filterValue == null) return false;\n return String(value).toLowerCase().includes(String(filterValue).toLowerCase());\n },\n\n equals: (value: any, filterValue: any): 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: any, filterValue: any): boolean => {\n if (value == null || filterValue == null) return false;\n return String(value).toLowerCase().startsWith(String(filterValue).toLowerCase());\n },\n\n endsWith: (value: any, filterValue: any): boolean => {\n if (value == null || filterValue == null) return false;\n return String(value).toLowerCase().endsWith(String(filterValue).toLowerCase());\n },\n\n isEmpty: (value: any): boolean => {\n return value == null || String(value).trim() === '';\n },\n\n isNotEmpty: (value: any): boolean => {\n return value != null && String(value).trim() !== '';\n },\n\n '>': (value: any, filterValue: any): 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: any, filterValue: any): 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: any, filterValue: any): 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: any, filterValue: any): 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: any, filterValue: any): 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: any, filterValue: any[]): 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: any, filterValue: any): 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: any, filterValue: any): 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: any, filterValue: any): 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(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 as any).items || [];\n const logicOperator = (filterModel as any).logicOperator || 'and';\n const quickFilterValues = (filterModel as any).quickFilterValues || [];\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: any, b: any, 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, useState, useCallback, useEffect } from 'react';\nimport { GridRowModel, GridRowId, GridTreeNode, GridFilterModel, GridSortItem } from '../types';\nimport { isRowMatchingFilter } from '../utils/filtering';\nimport { compareValues } from '../utils/sorting';\n\ninterface UseTreeDataProps<R extends GridRowModel> {\n rows: R[];\n getRowId: (row: R) => GridRowId;\n getTreeDataPath?: (row: R) => string[];\n treeData?: boolean;\n defaultGroupingExpansionDepth?: number;\n filterModel?: GridFilterModel;\n sortModel?: GridSortItem[];\n onRowExpansionChange?: (node: GridTreeNode) => void;\n}\n\nexport function useTreeData<R extends GridRowModel>(props: UseTreeDataProps<R>) {\n const { \n rows, \n getRowId,\n getTreeDataPath, \n treeData = false, \n defaultGroupingExpansionDepth = 0, \n filterModel,\n sortModel,\n onRowExpansionChange\n } = props;\n\n const { treeNodes, rootIds, groupingRows } = useMemo(() => {\n if (!treeData || !getTreeDataPath) {\n return { \n treeNodes: new Map<GridRowId, GridTreeNode>(), \n rootIds: [], \n groupingRows: [] \n };\n }\n\n const nodes = new Map<GridRowId, GridTreeNode>();\n const roots: GridRowId[] = [];\n const groupRows: GridRowModel[] = [];\n const pathLookup = new Map<string, GridRowId>();\n\n const getPathKey = (path: string[]) => path.join('/');\n\n rows.forEach(row => {\n const id = getRowId(row);\n const path = getTreeDataPath(row);\n const pathKey = getPathKey(path);\n\n pathLookup.set(pathKey, id);\n\n nodes.set(id, {\n id,\n parentId: null,\n depth: path.length - 1,\n groupingKey: path[path.length - 1],\n isExpanded: false,\n children: [],\n serverChildrenCount: row.serverChildrenCount\n });\n });\n\n rows.forEach(row => {\n const id = getRowId(row);\n const path = getTreeDataPath(row);\n\n if (path.length === 1) {\n roots.push(id);\n return;\n }\n\n const ensureAncestors = (childPath: string[]) => {\n if (childPath.length <= 1) return;\n\n const parentPath = childPath.slice(0, -1);\n const parentPathKey = getPathKey(parentPath);\n let parentId = pathLookup.get(parentPathKey);\n\n if (parentId === undefined) {\n parentId = `auto-group-${parentPathKey}`;\n\n if (!nodes.has(parentId)) {\n const groupLabel = parentPath[parentPath.length - 1];\n nodes.set(parentId, {\n id: parentId,\n parentId: null, \n depth: parentPath.length - 1,\n groupingKey: groupLabel,\n isExpanded: false,\n children: [],\n label: groupLabel\n });\n pathLookup.set(parentPathKey, parentId);\n\n const groupRow = { \n id: parentId,\n name: groupLabel, \n _isGroupRow: true\n } as unknown as GridRowModel; \n groupRows.push(groupRow);\n\n if (parentPath.length === 1) {\n roots.push(parentId);\n }\n\n ensureAncestors(parentPath);\n }\n }\n\n return parentId;\n };\n\n const parentId = ensureAncestors(path);\n\n if (parentId !== undefined) {\n const parentNode = nodes.get(parentId);\n const childNode = nodes.get(id);\n\n if (parentNode && childNode) {\n childNode.parentId = parentId;\n parentNode.children = parentNode.children || [];\n if (!parentNode.children.includes(id)) {\n parentNode.children.push(id);\n }\n }\n }\n });\n\n groupRows.forEach(groupRow => {\n const groupId = groupRow.id;\n const node = nodes.get(groupId);\n if (!node) return;\n\n const nodePathKey = (groupId as string).replace('auto-group-', '');\n const nodePath = nodePathKey.split('/');\n\n if (nodePath.length > 1) {\n const parentPath = nodePath.slice(0, -1);\n const parentPathKey = getPathKey(parentPath);\n const parentId = pathLookup.get(parentPathKey);\n\n if (parentId && nodes.has(parentId)) {\n node.parentId = parentId;\n const parentNode = nodes.get(parentId);\n if (parentNode) {\n parentNode.children = parentNode.children || [];\n if (!parentNode.children.includes(groupId)) {\n parentNode.children.push(groupId);\n }\n }\n }\n }\n });\n\n return { treeNodes: nodes, rootIds: roots, groupingRows: groupRows };\n\n }, [rows, getTreeDataPath, treeData, getRowId]);\n\n const initialExpandedIds = useMemo(() => {\n if (!treeData) return new Set<GridRowId>();\n\n const initialExpanded = new Set<GridRowId>();\n treeNodes.forEach(node => {\n if (node.children && node.children.length > 0) {\n if (defaultGroupingExpansionDepth === -1 || node.depth < defaultGroupingExpansionDepth) {\n initialExpanded.add(node.id);\n }\n }\n });\n return initialExpanded;\n }, [treeNodes, treeData, defaultGroupingExpansionDepth]);\n\n const [expandedGroupIds, setExpandedGroupIds] = useState<Set<GridRowId>>(new Set());\n\n useEffect(() => {\n if (initialExpandedIds.size > 0) {\n setExpandedGroupIds(initialExpandedIds);\n }\n }, [initialExpandedIds]);\n\n const toggleExpansion = useCallback((id: GridRowId) => {\n setExpandedGroupIds(prev => {\n const next = new Set(prev);\n const isExpanding = !next.has(id);\n\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n\n if (isExpanding && onRowExpansionChange) {\n const node = treeNodes.get(id);\n if (node) {\n onRowExpansionChange(node);\n }\n }\n\n return next;\n });\n }, [treeNodes, onRowExpansionChange]);\n\n const getVisibleRows = useCallback(() => {\n\n if (!treeData) return null; \n\n const rowLookup = new Map<GridRowId, GridRowModel>();\n rows.forEach(r => rowLookup.set(getRowId(r), r));\n groupingRows.forEach(r => rowLookup.set(r.id, r));\n\n const matchesFilter = (row: GridRowModel) => {\n return isRowMatchingFilter(row, filterModel!);\n };\n\n const filterCache = new Map<GridRowId, boolean>();\n\n const isNodeVisible = (id: GridRowId): boolean => {\n if (filterCache.has(id)) return filterCache.get(id)!;\n\n const row = rowLookup.get(id);\n if (!row) return false;\n\n const selfMatch = matchesFilter(row);\n if (selfMatch) {\n filterCache.set(id, true);\n return true;\n }\n\n const node = treeNodes.get(id);\n if (node && node.children) {\n const childMatch = node.children.some(childId => isNodeVisible(childId));\n if (childMatch) {\n filterCache.set(id, true);\n return true;\n }\n }\n\n filterCache.set(id, false);\n return false;\n };\n\n const sortNodes = (aId: GridRowId, bId: GridRowId) => {\n if (!sortModel || sortModel.length === 0) return 0;\n const rowA = rowLookup.get(aId);\n const rowB = rowLookup.get(bId);\n if (!rowA || !rowB) return 0;\n\n for (const sortItem of sortModel) {\n const valA = rowA[sortItem.field];\n const valB = rowB[sortItem.field];\n const comp = compareValues(valA, valB, sortItem.sort);\n if (comp !== 0) return comp;\n }\n return 0;\n };\n\n const result: GridRowModel[] = [];\n\n const seenIds = new Set<GridRowId>();\n\n const traverse = (ids: GridRowId[]) => {\n\n const visibleIds = ids.filter(id => isNodeVisible(id));\n\n visibleIds.sort(sortNodes);\n\n visibleIds.forEach(id => {\n if (seenIds.has(id)) return; \n\n const row = rowLookup.get(id);\n const node = treeNodes.get(id);\n\n if (row && node) {\n seenIds.add(id); \n\n const enhancedRow = {\n ...row,\n _treeDepth: node.depth,\n _isExpanded: expandedGroupIds.has(id),\n _hasChildren: (node.children && node.children.length > 0) || (node.serverChildrenCount && node.serverChildrenCount > 0),\n _descendantCount: node.children ? node.children.length : 0\n };\n result.push(enhancedRow);\n\n if (expandedGroupIds.has(id) && node.children && node.children.length > 0) {\n traverse(node.children);\n }\n }\n });\n };\n\n traverse(rootIds);\n return result;\n\n }, [treeData, rows, groupingRows, rootIds, treeNodes, expandedGroupIds, filterModel, sortModel, getRowId]);\n\n const isGroupExpanded = useCallback((id: GridRowId) => expandedGroupIds.has(id), [expandedGroupIds]);\n const getNode = useCallback((id: GridRowId) => treeNodes.get(id), [treeNodes]);\n\n const getNodePath = useCallback((id: GridRowId): string[] => {\n const path: string[] = [];\n let currentId: GridRowId | null = id;\n\n while (currentId !== null) {\n const node = treeNodes.get(currentId);\n if (!node) break;\n\n path.unshift(node.groupingKey);\n currentId = node.parentId;\n }\n return path;\n }, [treeNodes]);\n\n return useMemo(() => ({\n treeNodes,\n groupingRows,\n toggleExpansion,\n isGroupExpanded,\n getVisibleRows,\n getNode,\n getNodePath\n }), [treeNodes, groupingRows, toggleExpansion, isGroupExpanded, getVisibleRows, getNode, getNodePath]);\n}\n","import { useState, useMemo, useEffect, useCallback } from 'react';\nimport type { \n GridRowModel, \n GridRowId, \n GridRowGroupingModel, \n GridAggregationModel, \n GridTreeNode,\n GridFilterModel,\n GridSortItem\n} from '../types';\nimport { isRowMatchingFilter } from '../utils/filtering';\nimport { compareValues } from '../utils/sorting';\n\nexport interface UseRowGroupingParams<R extends GridRowModel> {\n rows: R[];\n getRowId: (row: R) => GridRowId;\n rowGroupingModel?: GridRowGroupingModel;\n aggregationModel?: GridAggregationModel;\n defaultGroupingExpansionDepth?: number;\n filterModel?: GridFilterModel;\n sortModel?: GridSortItem[];\n getAggregationPosition?: (groupNode: GridTreeNode | null) => 'inline' | 'footer' | null;\n}\n\nconst defaultGetAggregationPosition = (groupNode: GridTreeNode | null): 'inline' | 'footer' | null => {\n\n return groupNode?.depth === -1 ? 'footer' : 'inline';\n};\n\nexport function useRowGrouping<R extends GridRowModel>(params: UseRowGroupingParams<R>) {\n const { \n rows, \n getRowId, \n rowGroupingModel = [], \n aggregationModel = {}, \n defaultGroupingExpansionDepth = 0,\n filterModel,\n sortModel,\n getAggregationPosition = defaultGetAggregationPosition\n } = params;\n\n const [expandedGroupIds, setExpandedGroupIds] = useState<Set<GridRowId>>(new Set());\n\n const { treeNodes, rootIds, groupingRows } = useMemo(() => {\n const treeNodes = new Map<GridRowId, GridTreeNode>();\n const groupingRows = new Map<GridRowId, R>();\n const rootIds: GridRowId[] = [];\n\n if (rowGroupingModel.length === 0) {\n return { treeNodes, rootIds, groupingRows };\n }\n\n const getGroupId = (field: string, value: any, parentId: GridRowId | null) => {\n return `auto-group-${field}-${value}-${parentId || 'root'}`;\n };\n\n const groupRows = (\n currentRows: R[], \n depth: number, \n parentId: GridRowId | null\n ) => {\n if (depth >= rowGroupingModel.length) {\n\n return currentRows.map(row => {\n const id = getRowId(row);\n treeNodes.set(id, {\n id,\n parentId,\n depth,\n groupingKey: '',\n isExpanded: false\n });\n return id;\n });\n }\n\n const field = rowGroupingModel[depth];\n const groups = new Map<any, 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, any> = {};\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, b) => (Number(a) || 0) + (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, b) => (Number(a) || 0) + (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: any = {\n [field]: rawValue, \n ...aggregatedValues, \n id: groupId \n };\n\n groupingRows.set(groupId, groupRow);\n\n const treeNode: GridTreeNode = {\n id: groupId,\n parentId,\n depth,\n groupingKey: key,\n groupingField: field,\n groupingValue: rawValue,\n aggregatedValues,\n isExpanded: false,\n children: [], \n label: `${field}: ${String(rawValue)}` \n };\n\n treeNode.aggregationPosition = getAggregationPosition(treeNode);\n\n treeNodes.set(groupId, treeNode);\n\n const childrenIds = groupRows(groupRowsList, depth + 1, groupId);\n treeNodes.get(groupId)!.children = childrenIds;\n\n const descendantCount = groupRowsList.length;\n treeNodes.get(groupId)!.descendantCount = descendantCount;\n });\n\n return groupIds;\n };\n\n const topLevelIds = groupRows(rows, 0, null);\n rootIds.push(...topLevelIds);\n\n return { treeNodes, rootIds, groupingRows };\n\n }, [rows, rowGroupingModel, aggregationModel, getRowId, getAggregationPosition]);\n\n useEffect(() => {\n if (defaultGroupingExpansionDepth === -1) {\n\n const allGroupIds = new Set<GridRowId>();\n treeNodes.forEach((node, id) => {\n if (node.children && node.children.length > 0) {\n allGroupIds.add(id);\n }\n });\n setExpandedGroupIds(allGroupIds);\n } else if (defaultGroupingExpansionDepth > 0) {\n const depthIds = new Set<GridRowId>();\n treeNodes.forEach((node, id) => {\n if (node.depth < defaultGroupingExpansionDepth && node.children && node.children.length > 0) {\n depthIds.add(id);\n }\n });\n setExpandedGroupIds(depthIds);\n } else {\n\n setExpandedGroupIds(new Set());\n }\n\n }, [rowGroupingModel, defaultGroupingExpansionDepth]);\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 as any)[sortItem.field];\n const valB = (rowB as any)[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]);\n\n const getNode = useCallback((id: GridRowId) => treeNodes.get(id), [treeNodes]);\n\n return useMemo(() => ({\n treeNodes,\n groupingRows,\n toggleExpansion,\n isGroupExpanded,\n getVisibleRows,\n getNode\n }), [treeNodes, groupingRows, toggleExpansion, isGroupExpanded, getVisibleRows, getNode]);\n}\n","import { useState, useCallback, useRef } from 'react';\nimport type { GridRowId, GridRowModel } from '../../types';\n\nexport interface GridEditingState {\n\n editingCell: {\n id: GridRowId;\n field: string;\n value: any;\n originalValue: any;\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: any) => void;\n onRowChange?: (newRow: R) => void; \n}\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<GridEditingState['editingCell']>(null);\n const editingCellRef = useRef<GridEditingState['editingCell']>(null);\n\n const setEditingCell = useCallback((val: any) => {\n setEditingCellState(val);\n editingCellRef.current = typeof val === 'function' ? val(editingCellRef.current) : val;\n }, []);\n\n const startCellEdit = useCallback((params: { id: GridRowId, field: string, value: any }) => {\n setEditingCell({\n id: params.id,\n field: params.field,\n value: params.value,\n originalValue: params.value\n });\n }, []);\n\n const stopCellEdit = useCallback(async (params?: { cancel?: boolean }) => {\n const currentCell = editingCellRef.current;\n if (!currentCell) return;\n\n if (params?.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 if (onProcessRowUpdateError) {\n onProcessRowUpdateError(error);\n }\n }\n\n }, [editingCell, rows, getRowId, processRowUpdate, onRowChange, onProcessRowUpdateError]);\n\n const setEditCellValue = useCallback((params: { id: GridRowId, field: string, value: any }) => {\n if (editingCell && editingCell.id === params.id && editingCell.field === params.field) {\n setEditingCell((prev: any) => prev ? { ...prev, value: params.value } : null);\n }\n }, [editingCell]);\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: any) => 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\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, useEffect, useRef, useCallback, useState } from 'react';\nimport type {\n GridRowModel,\n GridAggregationModel,\n GridAggregationResult,\n GridFilterModel,\n GridSortItem,\n GridDataSource,\n} from '../../types';\n\nexport type BuiltInAggFn = 'sum' | 'avg' | 'count' | 'min' | 'max' | 'unique';\n\nconst AGGREGATION_FUNCTIONS: Record<BuiltInAggFn, (values: any[]) => any> = {\n sum: (values) => {\n const nums = values.filter((v) => v != null && !isNaN(Number(v)));\n return nums.reduce((acc, 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, 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: any, fnName: string): string {\n if (value == null) return '—';\n if (typeof value === 'number') {\n if (fnName === 'avg') {\n return value.toLocaleString(undefined, { maximumFractionDigits: 2 });\n }\n return value.toLocaleString();\n }\n return String(value);\n}\n\nexport interface UseAggregationParams<R extends GridRowModel> {\n rows: R[];\n aggregationModel: GridAggregationModel;\n isServerSide: boolean;\n dataSource?: GridDataSource<R>;\n filterModel?: GridFilterModel;\n sortModel?: GridSortItem[];\n serverAggregationResults?: GridAggregationResult | null;\n}\n\nexport interface UseAggregationReturn {\n aggregationResult: GridAggregationResult;\n isLoading: boolean;\n error: any;\n}\n\nexport function useAggregation<R extends GridRowModel>(\n params: UseAggregationParams<R>\n): UseAggregationReturn {\n const {\n rows,\n aggregationModel,\n isServerSide,\n dataSource,\n filterModel,\n sortModel,\n serverAggregationResults,\n } = params;\n\n const clientResult = useMemo<GridAggregationResult>(() => {\n if (isServerSide || Object.keys(aggregationModel).length === 0) return {};\n\n const result: GridAggregationResult = {};\n for (const [field, fnName] of Object.entries(aggregationModel)) {\n const fn = AGGREGATION_FUNCTIONS[fnName as BuiltInAggFn];\n if (!fn) {\n console.warn(`[useAggregation] Unknown aggregation function: \"${fnName}\"`);\n continue;\n }\n const values = rows.map((row) => (row as any)[field]);\n result[field] = fn(values);\n }\n return result;\n }, [rows, aggregationModel, isServerSide]);\n\n const [serverResult, setServerResult] = useState<GridAggregationResult>({});\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<any>(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","\nimport { useMemo } from 'react';\nimport type { GridColDef, GridRowModel } from '../../types';\nimport type { GridPivotModel, GridPivotAggFn } from '../../types';\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('\\u0000');\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 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, any>;\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, any> = {};\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 v = Number(row[vf.field]);\n if (!colBucket.has(vf.field)) colBucket.set(vf.field, []);\n if (!isNaN(v)) colBucket.get(vf.field)!.push(v);\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 cellKey = columnFields.length > 0\n ? `${ck}\\u001f${vf.field}\\u001f${vf.aggFn}`\n : `${vf.field}\\u001f${vf.aggFn}`;\n const values = colBucket?.get(vf.field) ?? [];\n pivotRow[cellKey] = values.length > 0 ? aggregate(values, vf.aggFn) : null;\n }\n }\n\n pivotRows.push(pivotRow);\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\n const colLabel = columnFields.length > 0\n ? ck.split('\\u0000').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 cellKey = columnFields.length > 0\n ? `${ck}\\u001f${vf.field}\\u001f${vf.aggFn}`\n : `${vf.field}\\u001f${vf.aggFn}`;\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: cellKey,\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 any, 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 (e) {\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 { 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}\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 } = props;\n const [searchQuery, setSearchQuery] = useState('');\n const [dragOverField, setDragOverField] = useState<string | null>(null);\n const dragFieldRef = useRef<string | null>(null);\n\n const hideableColumns = useMemo(() => columns.filter(col => col.hideable !== false), [columns]);\n const allVisible = hideableColumns.every(col => visibleColumns.has(col.field));\n\n const filteredColumns = useMemo(() => {\n if (!searchQuery) return columns;\n const lowerQuery = searchQuery.toLowerCase();\n return columns.filter(col =>\n (col.headerName || col.field).toLowerCase().includes(lowerQuery)\n );\n }, [columns, searchQuery]);\n\n const handleToggleAll = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.checked) {\n onShowAll();\n } else {\n onHideAll();\n }\n };\n\n // ── Drag handlers ──────────────────────────────────────────────────────────\n const handleDragStart = (field: string) => (e: React.DragEvent) => {\n dragFieldRef.current = field;\n e.dataTransfer.effectAllowed = 'move';\n // Use a ghost image offset so the handle looks natural\n e.dataTransfer.setDragImage(e.currentTarget.closest('.ogx-column-visibility-panel__item') as HTMLElement, 20, 20);\n };\n\n const handleDragOver = (field: string) => (e: React.DragEvent) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n if (field !== dragFieldRef.current) {\n setDragOverField(field);\n }\n };\n\n const handleDragLeave = () => {\n setDragOverField(null);\n };\n\n const handleDrop = (toField: string) => (e: React.DragEvent) => {\n e.preventDefault();\n const fromField = dragFieldRef.current;\n setDragOverField(null);\n dragFieldRef.current = null;\n if (fromField && fromField !== toField && onColumnReorder) {\n onColumnReorder(fromField, toField);\n }\n };\n\n const handleDragEnd = () => {\n setDragOverField(null);\n dragFieldRef.current = null;\n };\n\n return (\n <div className=\"ogx-column-visibility-panel\">\n <div className=\"ogx-column-visibility-panel__search-section\">\n <div className=\"ogx-column-visibility-panel__search-container\">\n <SearchIcon />\n <input\n id=\"ogx-column-search\"\n name=\"ogx-column-search\"\n autoComplete=\"off\"\n className=\"ogx-column-visibility-panel__search-input\"\n placeholder=\"Search\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n />\n </div>\n </div>\n\n <div className=\"ogx-column-visibility-panel__list\">\n {filteredColumns.map(col => {\n const isVisible = visibleColumns.has(col.field);\n const isHideable = col.hideable !== false;\n const isDragOver = dragOverField === col.field;\n const canReorder = !!onColumnReorder && !searchQuery;\n\n return (\n <div\n key={col.field}\n className={[\n 'ogx-column-visibility-panel__item',\n !isHideable && 'ogx-column-visibility-panel__item--disabled',\n isDragOver && 'ogx-column-visibility-panel__item--drag-over',\n ].filter(Boolean).join(' ')}\n draggable={canReorder}\n onDragOver={canReorder ? handleDragOver(col.field) : undefined}\n onDragLeave={canReorder ? handleDragLeave : undefined}\n onDrop={canReorder ? handleDrop(col.field) : undefined}\n onDragEnd={canReorder ? handleDragEnd : undefined}\n >\n {canReorder && (\n <span\n className=\"ogx-column-visibility-panel__drag-handle-wrapper\"\n draggable\n onDragStart={handleDragStart(col.field)}\n title=\"Drag to reorder\"\n >\n <DragHandleIcon />\n </span>\n )}\n <label\n className=\"ogx-column-visibility-panel__item-label\"\n style={{ display: 'flex', alignItems: 'center', gap: 'var(--ogx-spacing-md)', flex: 1, cursor: isHideable ? 'pointer' : 'not-allowed' }}\n >\n <Checkbox\n checked={isVisible}\n onChange={(e) => onVisibilityChange(col.field, e.target.checked)}\n disabled={!isHideable}\n />\n <span className=\"ogx-column-visibility-panel__label\">\n {col.headerName || col.field}\n </span>\n </label>\n </div>\n );\n })}\n </div>\n\n <div className=\"ogx-column-visibility-panel__footer\">\n <label className=\"ogx-column-visibility-panel__item\">\n <Checkbox\n checked={allVisible}\n onChange={handleToggleAll}\n />\n <span className=\"ogx-column-visibility-panel__label\">\n Show/Hide All\n </span>\n </label>\n <button\n className=\"ogx-column-visibility-panel__reset-btn\"\n onClick={onShowAll}\n >\n Reset\n </button>\n </div>\n </div>\n );\n}\n","import React, { useRef, useEffect, useCallback, useMemo, useState } from 'react';\nimport ReactDOM from 'react-dom';\nimport { ListViewRow } from '../ListView/ListViewRow';\nimport type { GridState } from '../../state/types';\nimport { Header } from '../Header/Header';\nimport { Row } from '../Row/Row';\nimport { SkeletonRow } from '../SkeletonRow';\nimport { Pagination } from '../Pagination/Pagination';\nimport { useDataGrid } from '../../hooks/core/useDataGrid';\nimport { useColumnReorder } from '../../hooks/useColumnReorder';\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, formatAggregationValue } from '../../hooks/features/useAggregation';\nimport { usePivot } from '../../hooks/features/usePivot';\nimport { useGridClipboard } from '../../hooks/features/useGridClipboard';\nimport { ExpandIcon } from '../ui/ExpandIcon';\nimport { ColumnVisibilityPanel } from '../ColumnVisibilityPanel/ColumnVisibilityPanel';\nimport { getPinnedRowGroups, isRowPinned, isColumnPinned } from '../../utils/pinning';\nimport { sortRows } from '../../utils/sorting';\nimport { filterRows } from '../../utils/filtering';\nimport type { DataGridProps, GridRowModel, GridRowId, GridSortDirection, GridColumnOrderChangeParams, GridColDef, GridRenderCellParams, GridRowParams, GridCellParams, GridPaginationModel, GridDataSource, GridAggregationResult, GridAggregationModel, GridPivotModel, GridColumnPinning, GridFilterModel } from '../../types';\nimport '../../styles/opengridx.css';\n\nexport function DataGrid<R extends GridRowModel = GridRowModel>(props: DataGridProps<R>) {\n const {\n rows,\n columns,\n getRowId,\n rowHeight = 52,\n headerHeight = 56,\n autoHeight = false,\n checkboxSelection = false,\n rowSelectionModel: propRowSelectionModel,\n onRowSelectionModelChange: propOnRowSelectionModelChange,\n onRowClick,\n onCellClick,\n\n filterModel: propFilterModel,\n onFilterModelChange,\n sortModel: propSortModel,\n onSortModelChange,\n pagination: propPagination = false,\n paginationModel = { page: 0, pageSize: 100 },\n onPaginationModelChange,\n pageSizeOptions = [10, 25, 50, 100],\n pinnedColumns: propPinnedColumns,\n onPinnedColumnsChange,\n pinnedRows,\n\n getDetailPanelContent,\n getDetailPanelHeight,\n detailPanelExpandedRowIds: controlledExpandedRowIds,\n onDetailPanelExpandedRowIdsChange,\n pinCheckboxColumn = true,\n pinExpandColumn = true,\n disableColumnReorder = false,\n columnOrder,\n onColumnOrderChange,\n height,\n rowReordering = false,\n onRowOrderChange,\n loading = false,\n\n treeData = false,\n getTreeDataPath,\n defaultGroupingExpansionDepth,\n\n rowGroupingModel: propRowGroupingModel,\n\n aggregationModel: propAggregationModel,\n onAggregationModelChange,\n getAggregationPosition,\n\n isCellEditable,\n processRowUpdate,\n onProcessRowUpdateError,\n\n dataSource,\n sortingMode = 'client',\n filterMode = 'client',\n paginationMode = 'client',\n rowCount: propRowCount,\n\n slots,\n slotProps,\n\n pivotMode = false,\n pivotModel: propPivotModel,\n onPivotModelChange,\n\n className = '',\n style,\n onRowsScrollEnd,\n ariaLabel,\n initialState,\n onStateChange,\n // Column Visibility\n columnVisibilityModel: propColumnVisibilityModel,\n onColumnVisibilityModelChange,\n listView = false,\n listViewColumn,\n columnGroupingModel,\n noRowsLabel = 'No Data',\n apiRef: propApiRef,\n } = props;\n\n // Stable defaults\n const defaultFilterModel: GridFilterModel = useMemo(() => ({ items: [] }), []);\n const filterModel = (propFilterModel || defaultFilterModel) as GridFilterModel;\n\n const [internalSortModel, setInternalSortModel] = useState<{ field: string; sort: 'asc' | 'desc' }[]>(\n () => initialState?.sorting?.sortModel ?? []\n );\n const isSortControlled = propSortModel !== undefined;\n const sortModel = isSortControlled ? propSortModel : internalSortModel;\n\n const defaultRowGroupingModel = useMemo(() => [], []);\n const rowGroupingModel = propRowGroupingModel || defaultRowGroupingModel;\n const isAggregationControlled = propAggregationModel !== undefined;\n\n // ─── Stabilize toolbar component identity ────────────────────────────────\n // If the consumer passes an inline arrow function as slots.toolbar (e.g.\n // `slots={{ toolbar: (p) => <GridToolbar {...p}/> }}`), a new function is\n // created on every parent render. React reconciles by component *identity*,\n // so a changed reference means it unmounts the old toolbar and mounts a new\n // one — destroying focus, replaying animations, etc.\n // useMemo with an empty dep-array gives React a stable identity. If the\n // caller genuinely changes slots.toolbar (e.g. swaps to a different UI),\n // the new value IS used; we just don't thrash for incidental re-renders.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const StableToolbar = useMemo(() => slots?.toolbar, [slots?.toolbar]);\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) {\n setInternalAggregationModel(model);\n }\n onAggregationModelChange?.(model);\n }, [isAggregationControlled, onAggregationModelChange]);\n\n const [internalColumnVisibilityModel, setInternalColumnVisibilityModel] = useState<Record<string, boolean>>(\n () => initialState?.columns?.columnVisibilityModel ?? {}\n );\n const isColumnVisibilityControlled = propColumnVisibilityModel !== undefined;\n const columnVisibilityModel = isColumnVisibilityControlled ? propColumnVisibilityModel : internalColumnVisibilityModel;\n\n const handleColumnVisibilityModelChange = useCallback((model: Record<string, boolean>) => {\n if (!isColumnVisibilityControlled) {\n setInternalColumnVisibilityModel(model);\n }\n onColumnVisibilityModelChange?.(model);\n }, [isColumnVisibilityControlled, onColumnVisibilityModelChange]);\n\n const [internalPinnedColumns, setInternalPinnedColumns] = useState<GridColumnPinning>(\n () => initialState?.columns?.pinnedColumns ?? {}\n );\n const isPinnedColumnsControlled = propPinnedColumns !== undefined;\n const pinnedColumns = isPinnedColumnsControlled ? propPinnedColumns : internalPinnedColumns;\n\n const handlePinnedColumnsChange = useCallback((model: GridColumnPinning) => {\n if (!isPinnedColumnsControlled) {\n setInternalPinnedColumns(model);\n }\n onPinnedColumnsChange?.(model);\n }, [isPinnedColumnsControlled, onPinnedColumnsChange]);\n\n const EMPTY_PIVOT_MODEL: GridPivotModel = useMemo(() => ({ rowFields: [], columnFields: [], valueFields: [] }), []);\n const [internalPivotModel, setInternalPivotModel] = useState<GridPivotModel>(propPivotModel ?? EMPTY_PIVOT_MODEL);\n const currentPivotModel = propPivotModel ?? internalPivotModel;\n const handlePivotModelChange = useCallback((model: GridPivotModel) => {\n setInternalPivotModel(model);\n onPivotModelChange?.(model);\n }, [onPivotModelChange]);\n const pivot = usePivot(rows as GridRowModel[], columns as unknown as GridColDef[], currentPivotModel, pivotMode);\n\n const activeRows = (pivotMode && pivot.isValid ? pivot.pivotRows : rows) as unknown as R[];\n const activeColumns = (pivotMode && pivot.isValid ? pivot.pivotColumns : columns) as unknown as GridColDef<R>[];\n\n const [serverAggregationResults, setServerAggregationResults] = useState<GridAggregationResult | null>(null);\n\n useEffect(() => {\n setServerAggregationResults(null);\n }, [aggregationModel]);\n\n const [internalPaginationModel, setInternalPaginationModel] = useState(\n () => initialState?.pagination?.paginationModel ?? paginationModel\n );\n const isPaginationControlled = props.paginationModel !== undefined;\n const effectivePaginationModel = isPaginationControlled ? paginationModel : internalPaginationModel;\n\n const handlePaginationModelChange = useCallback((newModel: GridPaginationModel) => {\n if (!isPaginationControlled) {\n setInternalPaginationModel(newModel);\n }\n onPaginationModelChange?.(newModel);\n }, [isPaginationControlled, onPaginationModelChange]);\n\n const [internalRowSelectionModel, setInternalRowSelectionModel] = useState<GridRowId[]>([]);\n const isSelectionControlled = propRowSelectionModel !== undefined;\n const rowSelectionModel = isSelectionControlled ? propRowSelectionModel : internalRowSelectionModel;\n const selectedRowIds = useMemo(() => new Set(rowSelectionModel), [rowSelectionModel]);\n const onRowSelectionModelChange = propOnRowSelectionModelChange;\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 const [focusedCell, setFocusedCell] = useState<{ id: GridRowId; field: string } | null>(null);\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<any>(null);\n\n const handleNodeExpansion = useCallback((node: any) => {\n if (dataSourceRef.current && treeData) {\n\n if (node.serverChildrenCount > 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: activeRows,\n columns: activeColumns,\n rowHeight,\n headerHeight,\n rowCount: propRowCount,\n columnVisibilityModel,\n initialState: props.initialState\n });\n const {\n state,\n apiRef,\n setRows,\n setColumns,\n setScroll,\n setDimensions,\n setDataSourceLoading,\n setDataSourceError,\n setRowCount\n } = gridData;\n\n useEffect(() => {\n if (propApiRef) {\n propApiRef.current = apiRef.current;\n }\n }, [propApiRef, apiRef]);\n\n const { copySelectedRows } = useGridClipboard({\n selectedRowIds,\n columns: activeColumns as unknown as GridColDef[],\n getVisibleRows: () => apiRef.current.getVisibleRows(),\n getRowId: effectiveGetRowId as unknown as (row: GridRowModel) => GridRowId,\n });\n\n // Expose on apiRef for programmatic use\n useEffect(() => {\n apiRef.current.copySelectedRows = copySelectedRows;\n apiRef.current.getSelectedRows = () => Array.from(selectedRowIds);\n }, [copySelectedRows, selectedRowIds, apiRef]);\n\n const isInternalLoading = state.dataSource.loading;\n const effectiveLoading = loading || isInternalLoading;\n\n const effectiveRows = useMemo(() => {\n return state.rows.allRows.map(id => state.rows.idRowsLookup.get(id)!) as R[];\n }, [state.rows]);\n\n const treeDataHandlers = useTreeData({\n rows: effectiveRows,\n getRowId: effectiveGetRowId,\n getTreeDataPath,\n treeData,\n defaultGroupingExpansionDepth,\n filterModel,\n\n sortModel,\n onRowExpansionChange: handleNodeExpansion\n });\n\n useEffect(() => {\n treeDataRef.current = treeDataHandlers;\n }, [treeDataHandlers]);\n\n const rowGroupingHandlers = useRowGrouping({\n rows: effectiveRows,\n getRowId: effectiveGetRowId,\n rowGroupingModel,\n aggregationModel,\n defaultGroupingExpansionDepth,\n filterModel,\n sortModel,\n getAggregationPosition\n });\n\n const editingHandlers = useGridEditing({\n rows: effectiveRows,\n getRowId: effectiveGetRowId,\n processRowUpdate,\n onProcessRowUpdateError,\n onRowChange: (updatedRow) => {\n // Dispatch a proper state update so React re-renders with the new row value\n const { dispatch } = gridData;\n const currentRows = Array.from(gridData.state.rows.idRowsLookup.values());\n const nextRows = currentRows.map(r =>\n (r as any).id === (updatedRow as any).id ? updatedRow : r\n );\n dispatch({ type: 'SET_ROWS', payload: nextRows });\n },\n });\n\n const isTreeData = treeData;\n const isRowGrouping = !!(rowGroupingModel && rowGroupingModel.length > 0);\n const isHierarchyEnabled = isTreeData || isRowGrouping;\n const activeHierarchyHandlers = isTreeData ? treeDataHandlers : (isRowGrouping ? rowGroupingHandlers : null);\n\n const pagination = propPagination && !isRowGrouping;\n\n const handleRowClick = useCallback((params: GridRowParams<R>) => {\n const { row, id } = params;\n const rowData = row as any;\n\n if (isHierarchyEnabled && rowData._hasChildren) {\n activeHierarchyHandlers?.toggleExpansion(id);\n return;\n }\n\n onRowClick?.(params);\n }, [isHierarchyEnabled, activeHierarchyHandlers, onRowClick]);\n\n const effectiveColumns = useMemo(() => {\n if (!isHierarchyEnabled) return activeColumns;\n\n return activeColumns.map((col, index) => {\n\n if (index === 0) {\n return {\n ...col,\n renderCell: (params: GridRenderCellParams<R>) => {\n const { _treeDepth, _hasChildren, _isExpanded, _groupingField, _groupingValue, _descendantCount } = params.row as any;\n const depth = _treeDepth || 0;\n const paddingLeft = depth * 24;\n\n let content = col.renderCell ? col.renderCell(params) : params.value;\n\n if (isTreeData && _hasChildren && params.row._isGroupRow) {\n content = (\n <div className=\"ogx__group-cell-content\">\n {params.value}\n {_descendantCount !== undefined && _descendantCount > 0 ? ` (${_descendantCount})` : ''}\n </div>\n );\n }\n\n // For row grouping, override the first column content to show the group label\n if (isRowGrouping && _hasChildren && _groupingField) {\n content = (\n <div className=\"ogx__group-cell-content\">\n {col.field === _groupingField ? '' : `${_groupingField}: `}\n {String(_groupingValue)}\n {_descendantCount !== undefined ? ` (${_descendantCount})` : ''}\n </div>\n );\n }\n\n return (\n <div style={{ display: 'flex', alignItems: 'center', paddingLeft, width: '100%', height: '100%' }}>\n <div\n style={{\n marginRight: 4,\n width: 24,\n height: 24,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: _hasChildren ? 'pointer' : 'default',\n flexShrink: 0\n }}\n >\n\n {_hasChildren ? (\n <div\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n activeHierarchyHandlers?.toggleExpansion(params.row.id);\n }}\n onMouseDown={(e) => {\n e.stopPropagation();\n }}\n style={{\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n pointerEvents: 'auto',\n zIndex: 10,\n position: 'relative'\n }}\n >\n <ExpandIcon\n isExpanded={_isExpanded}\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n activeHierarchyHandlers?.toggleExpansion(params.row.id);\n }}\n />\n </div>\n ) : null}\n </div>\n <div style={{ flex: 1, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n {content}\n </div>\n </div>\n );\n }\n };\n }\n\n return {\n ...col,\n renderCell: (params: GridRenderCellParams<R>) => {\n const { _hasChildren, _groupingField } = params.row as any;\n\n if (isRowGrouping && _hasChildren) {\n\n if (col.field === _groupingField) {\n return null;\n }\n\n if (params.value !== undefined && params.value !== null) {\n return col.renderCell ? col.renderCell(params) : params.value;\n }\n\n return null;\n }\n\n return col.renderCell ? col.renderCell(params) : params.value;\n }\n };\n }) as GridColDef<R>[];\n }, [activeColumns, isHierarchyEnabled, isRowGrouping, activeHierarchyHandlers]);\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 const [columnWidths, setColumnWidths] = useState<Record<string, number>>(\n () => initialState?.columns?.columnWidths ?? {}\n );\n\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 if (!dataSource) {\n setRows(activeRows);\n }\n }, [activeRows, setRows, dataSource]);\n\n useEffect(() => {\n setColumns(activeColumns as any);\n }, [activeColumns, setColumns]);\n\n useEffect(() => {\n if (pivotMode) {\n setInternalColumnOrder(activeColumns.map(col => col.field));\n }\n }, [pivotMode, activeColumns]);\n\n const orderedColumns = useMemo(() => {\n if (disableColumnReorder) return effectiveColumns as GridColDef<R>[];\n\n const orderMap = new Map(effectiveColumnOrder.map((field, index) => [field, index]));\n return [...(effectiveColumns as GridColDef<R>[])].sort((a, b) => {\n const aIndex = orderMap.get(a.field) ?? effectiveColumns.indexOf(a);\n const bIndex = orderMap.get(b.field) ?? effectiveColumns.indexOf(b);\n return aIndex - bIndex;\n });\n }, [effectiveColumns, effectiveColumnOrder, disableColumnReorder]);\n\n const visibleOrderedColumns = useMemo(() => {\n return orderedColumns.filter(col => columnVisibilityModel[col.field] !== false);\n }, [orderedColumns, columnVisibilityModel]);\n\n const columnReorderHandlers = useColumnReorder({\n columns: orderedColumns,\n onColumnOrderChange: useCallback((params: GridColumnOrderChangeParams) => {\n const { oldIndex, targetIndex } = params;\n\n const newOrder = [...effectiveColumnOrder];\n const [movedField] = newOrder.splice(oldIndex, 1);\n newOrder.splice(targetIndex, 0, movedField);\n\n if (!columnOrder) {\n setInternalColumnOrder(newOrder);\n }\n\n onColumnOrderChange?.(params);\n }, [effectiveColumnOrder, columnOrder, onColumnOrderChange]),\n disableColumnReorder,\n });\n\n const [internalExpandedRowIds, setInternalExpandedRowIds] = useState<Set<GridRowId>>(new Set());\n const expandedRowIds = controlledExpandedRowIds ?? internalExpandedRowIds;\n const hasDetailPanel = Boolean(getDetailPanelContent);\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\n if (controlledExpandedRowIds === undefined) {\n setInternalExpandedRowIds(newExpandedRowIds);\n }\n onDetailPanelExpandedRowIdsChange?.(newExpandedRowIds);\n }, [expandedRowIds, controlledExpandedRowIds, onDetailPanelExpandedRowIdsChange]);\n\n const navigationColumns = useMemo(() => {\n const cols: { field: string; editable?: boolean }[] = [];\n if (rowReordering) cols.push({ field: '__reorder_col__' });\n if (hasDetailPanel) cols.push({ field: '__expand_col__' });\n if (checkboxSelection) cols.push({ field: '__checkbox_col__' });\n return [...cols, ...orderedColumns];\n }, [orderedColumns, checkboxSelection, hasDetailPanel, rowReordering]);\n\n const handleColumnResize = useCallback((field: string, newWidth: number) => {\n setColumnWidths(prev => ({ ...prev, [field]: newWidth }));\n }, []);\n\n const onStateChangeRef = useRef(onStateChange);\n onStateChangeRef.current = onStateChange;\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: 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 const baseRows = useMemo(() => {\n return effectiveRows;\n }, [effectiveRows]);\n\n const filteredRows = useMemo(() => {\n if (activeHierarchyHandlers) {\n\n return (activeHierarchyHandlers.getVisibleRows() || []) as R[];\n }\n\n if (filterMode === 'server' && dataSource) {\n return baseRows;\n }\n\n return filterRows(baseRows, filterModel);\n }, [baseRows, filterModel, activeHierarchyHandlers, filterMode, dataSource]);\n\n const { top: pinnedTopRows, center: unpinnedRows, bottom: pinnedBottomRows } = useMemo(() => {\n if (activeHierarchyHandlers) {\n\n return { top: [], center: filteredRows, bottom: [] };\n }\n return getPinnedRowGroups(filteredRows, pinnedRows);\n }, [filteredRows, pinnedRows, activeHierarchyHandlers]);\n\n const sortedUnpinnedRows = useMemo(() => {\n if (activeHierarchyHandlers) {\n return unpinnedRows;\n }\n\n if (sortingMode === 'server' && dataSource) {\n return unpinnedRows;\n }\n\n return sortRows(unpinnedRows, sortModel);\n }, [unpinnedRows, sortModel, activeHierarchyHandlers, sortingMode, dataSource]);\n\n const paginatedUnpinnedRows = useMemo(() => {\n if (!pagination) return sortedUnpinnedRows;\n\n if (paginationMode === 'server' && dataSource) {\n return sortedUnpinnedRows;\n }\n\n const start = effectivePaginationModel.page * effectivePaginationModel.pageSize;\n const end = start + effectivePaginationModel.pageSize;\n return sortedUnpinnedRows.slice(start, end);\n }, [sortedUnpinnedRows, pagination, effectivePaginationModel.page, effectivePaginationModel.pageSize, paginationMode, dataSource]);\n\n useEffect(() => {\n gridData.apiRef.current.getVisibleRows = () => sortedUnpinnedRows;\n gridData.apiRef.current.getVisibleColumns = () => effectiveColumns as any[];\n }, [sortedUnpinnedRows, 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 allRenderableRows = useMemo(() => {\n\n if (activeHierarchyHandlers) {\n return unpinnedRows;\n }\n const centerRows = pagination ? paginatedUnpinnedRows : sortedUnpinnedRows;\n const base = [...pinnedTopRows, ...centerRows, ...pinnedBottomRows];\n\n // Append skeleton rows while an infinite-scroll fetch is in flight\n if (paginationMode === 'infinite' && state.dataSource.loading && base.length > 0) {\n const skeletonCount = Math.min(effectivePaginationModel.pageSize, 20);\n const skeletons = Array.from({ length: skeletonCount }, (_, i) => ({\n id: `__skeleton_${i}__`,\n _isSkeleton: true,\n }));\n return [...base, ...skeletons] as typeof base;\n }\n\n return base;\n }, [pinnedTopRows, paginatedUnpinnedRows, sortedUnpinnedRows, pinnedBottomRows, pagination,\n activeHierarchyHandlers, unpinnedRows, paginationMode, state.dataSource.loading,\n effectivePaginationModel.pageSize]);\n\n const spanning = useGridSpanning(\n allRenderableRows,\n navigationColumns,\n columnWidths\n );\n\n const { aggregationResult } = useAggregation({\n rows: filteredRows,\n aggregationModel,\n isServerSide: !!(dataSource && (paginationMode === 'server' || sortingMode === 'server')),\n dataSource: dataSource as any,\n filterModel,\n sortModel,\n serverAggregationResults,\n });\n\n const hasAggregation = Object.keys(aggregationModel).length > 0;\n\n useEffect(() => {\n gridData.apiRef.current.getAggregationResult = () => hasAggregation ? aggregationResult : null;\n gridData.apiRef.current.getAggregationModel = () => hasAggregation ? aggregationModel : null;\n }, [aggregationResult, aggregationModel, hasAggregation, gridData.apiRef]);\n\n const layout = useMemo(() => {\n const baseRowHeight = rowHeight;\n\n const unpinnedRows = pagination ? paginatedUnpinnedRows : sortedUnpinnedRows;\n const rowHeights = unpinnedRows.map((row, index) => {\n let height = baseRowHeight;\n if (expandedRowIds.has(row.id)) {\n const detailHeight = getDetailPanelHeight?.({ row, id: row.id, rowIndex: pinnedTopRows.length + 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' && state.dataSource.loading && (unpinnedRows.length > 0))\n ? Math.min(effectivePaginationModel.pageSize, 20)\n : 0;\n const skeletonRowsHeight = skeletonCount * baseRowHeight;\n const unpinnedRowsHeight = (cumulativeHeights[cumulativeHeights.length - 1] || 0) + skeletonRowsHeight;\n const pinnedTopHeight = pinnedTopRows.length * baseRowHeight;\n const pinnedBottomHeight = pinnedBottomRows.length * baseRowHeight;\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 viewportWidth = state.dimensions.viewportWidth || 1000;\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 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\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 width = typeof col.width === 'number' ? col.width : 150;\n return sum + (minWidth || width);\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 let totalFlexUnits = 0;\n\n unpinnedCols.forEach(col => {\n // If the user has manually resized this column, columnWidths has an explicit\n // entry for it. Respect that stored width as fixed-width so the resize sticks,\n // even if the column definition originally had flex.\n const hasManualWidth = Object.prototype.hasOwnProperty.call(columnWidths, col.field);\n\n const parsed = parseWidth(getColWidth(col));\n\n if (!hasManualWidth && col.flex && col.flex > 0) {\n flexCols.push({ col, flex: col.flex });\n totalFlexUnits += 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\n const implicitFlex = 1;\n flexCols.push({ col, flex: implicitFlex });\n totalFlexUnits += implicitFlex;\n }\n });\n\n const fixedWidth = fixedWidthCols.reduce((sum, { width }) => sum + width, 0);\n\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\n remainingSpaceForFlex -= calculatedWidth;\n });\n\n remainingSpaceForFlex = Math.max(0, remainingSpaceForFlex);\n\n const finalFlexWidths = new Map<string, number>();\n\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\n let iterations = 0;\n const maxIterations = flexItems.length * 2;\n\n while (iterations < maxIterations) {\n iterations++;\n\n const unfrozen = flexItems.filter(f => !f.frozen);\n\n if (unfrozen.length === 0) break;\n\n const unfrozenFlexTotal = unfrozen.reduce((sum, f) => sum + f.flex, 0);\n\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 => {\n f.computedWidth = f.minWidth;\n f.frozen = true;\n });\n break;\n }\n\n const pixelsPerFlex = currentFreeSpace / unfrozenFlexTotal;\n\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\n if (rawWidth < f.minWidth) {\n const diff = f.minWidth - rawWidth;\n totalViolation += diff;\n minViolators.push(f);\n } else if (rawWidth > f.maxWidth) {\n const diff = f.maxWidth - rawWidth;\n totalViolation += diff;\n maxViolators.push(f);\n } else {\n\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 => {\n f.computedWidth = f.minWidth;\n f.frozen = true;\n });\n } else if (totalViolation < 0) {\n maxViolators.forEach(f => {\n f.computedWidth = f.maxWidth;\n f.frozen = true;\n });\n } else {\n\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\n unpinnedCols.forEach(col => {\n let computedWidth: number;\n\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\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\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 const numericWidth = parsed.type === 'fixed' ? parsed.value : 100;\n return {\n ...col,\n width: numericWidth,\n zIndex: baseLeftZ + i\n };\n });\n\n const baseRightZ = 11;\n const rightPinnedCols = rawRightPinnedCols.map((col, i) => {\n const parsed = parseWidth(getColWidth(col));\n const numericWidth = parsed.type === 'fixed' ? parsed.value : 100;\n return {\n ...col,\n width: numericWidth,\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\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: pinnedTopRows.length,\n pinnedBottomRowsLength: pinnedBottomRows.length,\n unpinnedRowsLength: unpinnedRows.length\n };\n }, [\n rowHeight,\n pagination,\n paginatedUnpinnedRows,\n sortedUnpinnedRows,\n expandedRowIds,\n getDetailPanelHeight,\n pinnedTopRows.length,\n pinnedBottomRows.length,\n expandedRowIds,\n getDetailPanelHeight,\n pinnedTopRows.length,\n pinnedBottomRows.length,\n visibleOrderedColumns,\n pinnedColumns,\n columnWidths,\n state.dimensions.viewportWidth,\n checkboxSelection,\n hasDetailPanel,\n rowReordering,\n pinCheckboxColumn,\n pinExpandColumn,\n autoHeight,\n paginationMode,\n state.dataSource.loading,\n effectivePaginationModel.pageSize\n ]);\n\n const virtualization = useMemo(() => {\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 scrollLeft = state.virtualization.scrollLeft;\n const scrollTop = state.virtualization.scrollTop;\n const viewportWidth = state.dimensions.viewportWidth || 1000;\n const viewportHeight = autoHeight ? (pinnedTopHeight + unpinnedRowsHeight + pinnedBottomHeight + 50) : (state.dimensions.viewportHeight || 600);\n\n const overscanCols = 6;\n\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) {\n low = mid + 1;\n } else {\n high = mid - 1;\n }\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: any[] = [\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) {\n rLow = mid + 1;\n } else {\n rHigh = mid - 1;\n }\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 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: (rowReordering ? 48 : 0) + (hasDetailPanel && pinExpandColumn ? 48 : 0) + (checkboxSelection && pinCheckboxColumn ? 48 : 0)\n }\n };\n }, [\n layout,\n state.virtualization.scrollTop,\n state.virtualization.scrollLeft,\n state.dimensions.viewportHeight,\n state.dimensions.viewportWidth,\n autoHeight\n ]);\n\n const handleScroll = useCallback((event: React.UIEvent<HTMLDivElement>) => {\n const target = event.currentTarget;\n setScroll(target.scrollTop, target.scrollLeft);\n\n if (onRowsScrollEnd) {\n const { scrollTop, scrollHeight, clientHeight } = target;\n const scrollThreshold = 100;\n\n if (scrollHeight - scrollTop - clientHeight < scrollThreshold) {\n\n onRowsScrollEnd({\n visibleTop: scrollTop,\n visibleBottom: scrollTop + clientHeight,\n viewportHeight: clientHeight\n });\n }\n }\n }, [setScroll, onRowsScrollEnd]);\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]);\n\n const handleSelectAll = useCallback((isSelected: boolean) => {\n let newSelection: GridRowId[] = [];\n if (isSelected) {\n newSelection = baseRows.map(row => row.id);\n }\n\n if (!isSelectionControlled) {\n setInternalRowSelectionModel(newSelection);\n }\n onRowSelectionModelChange?.(newSelection);\n }, [rows, isSelectionControlled, onRowSelectionModelChange]);\n\n const handleSort = useCallback((field: string, direction: GridSortDirection) => {\n const newSortModel = direction ? [{ field, sort: direction }] : [];\n\n if (!isSortControlled) {\n setInternalSortModel(newSortModel as any);\n }\n onSortModelChange?.(newSortModel as any);\n }, [isSortControlled, onSortModelChange]);\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]);\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 = useMemo(() => {\n const { firstRowIndex, lastRowIndex } = virtualization.renderContext;\n\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 + (pagination ? paginatedUnpinnedRows.length : sortedUnpinnedRows.length) + index\n }));\n\n const centerStartIndex = Math.max(0, firstRowIndex - topPinnedCount);\n const centerEndIndex = Math.min(\n pagination ? paginatedUnpinnedRows.length : sortedUnpinnedRows.length,\n lastRowIndex - topPinnedCount + 1\n );\n\n const centerRows = (pagination ? paginatedUnpinnedRows : sortedUnpinnedRows)\n .slice(centerStartIndex, centerEndIndex)\n .map((row, index) => ({\n row,\n rowIndex: topPinnedCount + centerStartIndex + index\n }));\n\n const combined = [...topPinned, ...centerRows, ...bottomPinned];\n\n const seenIds = new Set<GridRowId>();\n const deduplicated = combined.filter(item => {\n if (seenIds.has(item.row.id)) {\n return false;\n }\n seenIds.add(item.row.id);\n return true;\n });\n\n return deduplicated;\n }, [virtualization.renderContext, pinnedTopRows, pinnedBottomRows, paginatedUnpinnedRows, sortedUnpinnedRows, pagination,\n paginationMode, state.dataSource.loading, effectivePaginationModel.pageSize, rowHeight]);\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 handleFocus = useCallback((event: React.FocusEvent<HTMLDivElement>) => {\n\n if (event.target === event.currentTarget) {\n setFocusedCell(prev => {\n if (prev) return prev;\n\n if (checkboxSelection) {\n return { id: 'HEADER', field: '__checkbox_col__' };\n }\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]);\n\n const handleBlur = useCallback((event: React.FocusEvent<HTMLDivElement>) => {\n\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\n const isEditing = Boolean(editingHandlers.editingCell);\n\n if (event.key === 'Enter') {\n event.preventDefault();\n if (isEditing) {\n editingHandlers.stopCellEdit();\n } else {\n\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({\n id,\n field,\n value: (row as any)[field]\n });\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 (id === 'HEADER' && (event.key === 'Enter' || event.key === ' ')) {\n event.preventDefault();\n\n const col = navigationColumns.find(c => c.field === field);\n if (col && (col as any).sortable !== false) {\n const currentSort = sortModel.find(item => item.field === 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 handleSort(field, newDirection);\n }\n return;\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') {\n return;\n }\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 // Find the next FOCUSABLE cell (any cell — editability not required for arrow navigation)\n const findNextCell = (\n startRow: number,\n startCol: number,\n deltaRow: number,\n deltaCol: number,\n wrapRow: boolean,\n allowHeader: boolean = 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 // Find the next EDITABLE cell (for Tab key navigation)\n const findNextEditable = (\n startRow: number,\n startCol: number,\n deltaRow: number,\n deltaCol: number,\n wrapRow: boolean,\n allowHeader: boolean = false\n ) => {\n let r = startRow;\n let c = startCol;\n let steps = 0;\n\n const maxSteps = allRenderableRows.length * navigationColumns.length + navigationColumns.length;\n\n while (steps < maxSteps) {\n steps++;\n\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 as any).sortable !== false;\n const isInteractive = ['__checkbox_col__'].includes(col.field) || isSortable;\n if (isInteractive) return { r, c };\n continue;\n }\n\n const row = allRenderableRows[r];\n const col = navigationColumns[c];\n\n const isInteractable = ['__checkbox_col__', '__expand_col__', '__reorder_col__'].includes(col.field);\n let isEditable = col.editable || isInteractable;\n\n if (isCellEditable && !isInteractable) {\n try {\n isEditable = isCellEditable({\n row,\n field: col.field,\n value: (row as any)[col.field],\n colDef: col,\n rowIndex: r,\n colIndex: c\n });\n } catch (e) {\n console.error('Error in isCellEditable:', e);\n }\n }\n\n if (isEditable) 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 // Tab moves to next EDITABLE cell\n const dir = event.shiftKey ? -1 : 1;\n const res = findNextEditable(rowIndex, colIndex, 0, dir, true, false);\n if (res) {\n nextRowIndex = res.r;\n nextColIndex = res.c;\n handled = true;\n }\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 if (event.ctrlKey || event.metaKey) {\n nextRowIndex = -1;\n nextColIndex = 0;\n } else {\n nextColIndex = 0;\n }\n handled = true;\n } else if (event.key === 'End') {\n if (event.ctrlKey || event.metaKey) {\n nextRowIndex = allRenderableRows.length - 1;\n nextColIndex = navigationColumns.length - 1;\n } else {\n nextColIndex = navigationColumns.length - 1;\n }\n handled = true;\n } else if (event.key === 'PageUp') {\n const pageSize = pagination ? effectivePaginationModel.pageSize : 10;\n nextRowIndex = Math.max(-1, nextRowIndex - pageSize);\n handled = true;\n } else if (event.key === 'PageDown') {\n const pageSize = pagination ? effectivePaginationModel.pageSize : 10;\n nextRowIndex = Math.min(allRenderableRows.length - 1, nextRowIndex + pageSize);\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 const nextRow = allRenderableRows[nextRowIndex];\n setFocusedCell({ id: nextRow.id, field: nextCol.field });\n }\n\n if (viewportRef.current) {\n const { cumulativeHeights, pinnedTopHeight } = virtualization;\n const { clientHeight, clientWidth, scrollTop, scrollLeft } = viewportRef.current;\n\n const rowTop = nextRowIndex === 0 ? 0 : cumulativeHeights[nextRowIndex - 1];\n const rowBottom = cumulativeHeights[nextRowIndex];\n const pinnedOffset = pinnedTopHeight;\n const visibleTop = scrollTop + pinnedOffset;\n const visibleBottom = scrollTop + clientHeight;\n\n let newScrollTop = scrollTop;\n if (rowTop < visibleTop) {\n newScrollTop = Math.max(0, rowTop - pinnedOffset);\n } else if (rowBottom > visibleBottom) {\n newScrollTop = rowBottom - clientHeight;\n }\n\n if (newScrollTop !== scrollTop) {\n viewportRef.current.scrollTop = newScrollTop;\n }\n\n if (virtualization.columnMetrics) {\n const { leftPinnedWidth, rightPinnedWidth, unpinnedAccWidths, unpinnedCols, totalSpecialsWidth, pinnedSpecialsWidth } = virtualization.columnMetrics;\n const field = nextCol.field;\n const unpinnedIndex = unpinnedCols.findIndex((c: any) => c.field === 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\n const visibleStart = scrollLeft + pinnedSpecialsWidth + leftPinnedWidth;\n const visibleEnd = scrollLeft + clientWidth - rightPinnedWidth;\n\n let newScrollLeft = scrollLeft;\n\n if (colLeft < visibleStart) {\n newScrollLeft = Math.max(0, colLeft - pinnedSpecialsWidth - leftPinnedWidth);\n } else if (colRight > visibleEnd) {\n newScrollLeft = colRight - clientWidth + rightPinnedWidth;\n }\n\n if (newScrollLeft !== scrollLeft) {\n viewportRef.current.scrollLeft = newScrollLeft;\n }\n }\n }\n }\n }\n }\n }, [focusedCell, allRenderableRows, navigationColumns, editingHandlers, virtualization, selectedRowIds, handleSelectionChange, handleDetailPanelToggle]);\n\n const hasRowSpanning = React.useMemo(() => effectiveColumns.some(c => !!c.rowSpan), [effectiveColumns]);\n const [columnsPanelOpen, setColumnsPanelOpen] = React.useState(false);\n const containerRef = React.useRef<HTMLDivElement>(null);\n\n // Click-outside handler for standalone column panel\n useEffect(() => {\n if (!columnsPanelOpen || slots?.toolbar) return;\n function handleClickOutside(e: MouseEvent) {\n const panel = document.getElementById('ogx-standalone-col-panel');\n if (panel && !panel.contains(e.target as Node)) {\n setColumnsPanelOpen(false);\n }\n }\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [columnsPanelOpen, slots?.toolbar]);\n\n return (\n <div\n ref={containerRef}\n className={`ogx ${className} ${autoHeight ? 'ogx--auto-height' : ''} ${hasRowSpanning ? 'ogx--row-spanning' : ''} ${listView ? 'ogx--list-view' : ''}`}\n style={{\n ...style,\n height: height ?? style?.height,\n '--ogx-row-height': `${rowHeight}px`,\n '--ogx-header-height': `${headerHeight}px`\n } as any}\n aria-busy={effectiveLoading}\n >\n { }\n {StableToolbar && (() => {\n const toolbarProps = {\n apiRef: gridData.apiRef,\n columns: effectiveColumns,\n aggregationModel,\n onAggregationModelChange: handleAggregationModelChange,\n\n ...(pivotMode || propPivotModel || onPivotModelChange ? {\n pivotModel: currentPivotModel,\n onPivotModelChange: handlePivotModelChange,\n } : {}),\n\n filterModel,\n onFilterModelChange,\n\n columnVisibilityModel,\n onColumnVisibilityModelChange: handleColumnVisibilityModelChange,\n\n onColumnReorder: disableColumnReorder ? undefined : (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); if (col) onColumnOrderChange?.({ oldIndex: fromIdx, targetIndex: toIdx, column: col as any });\n },\n\n forceColumnsOpen: columnsPanelOpen,\n onColumnsPanelClose: () => setColumnsPanelOpen(false),\n\n ...slotProps?.toolbar,\n };\n return <StableToolbar {...toolbarProps} />;\n })()}\n\n {/* Fallback standalone column panel when no toolbar is present */}\n {!slots?.toolbar && columnsPanelOpen && ReactDOM.createPortal(\n <div\n id=\"ogx-standalone-col-panel\"\n style={(() => {\n const rect = containerRef.current?.getBoundingClientRect();\n return {\n position: 'fixed',\n top: rect ? rect.top + 8 : 16,\n right: rect ? window.innerWidth - rect.right + 8 : 16,\n zIndex: 9999,\n display: 'inline-block',\n };\n })()}\n >\n <button\n onClick={() => setColumnsPanelOpen(false)}\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\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 handleColumnVisibilityModelChange({ ...columnVisibilityModel, [field]: isVisible });\n }}\n onShowAll={() => {\n const next = { ...columnVisibilityModel };\n effectiveColumns.forEach(col => { if (col.hideable !== false) next[col.field] = true; });\n handleColumnVisibilityModelChange(next);\n }}\n onHideAll={() => {\n const next = { ...columnVisibilityModel };\n effectiveColumns.forEach(col => { if (col.hideable !== false) next[col.field] = false; });\n handleColumnVisibilityModelChange(next);\n }}\n onColumnReorder={disableColumnReorder ? undefined : (fromField, toField) => {\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) {\n setInternalColumnOrder(newOrder);\n }\n onColumnOrderChange?.({ oldIndex: fromIdx, targetIndex: toIdx, column: effectiveColumns.find(c => c.field === fromField) as any });\n }}\n />\n </div>,\n containerRef.current?.closest('.ogx-theme-provider') || document.body\n )}\n\n {/* ═══════════════════════════════════════════════════════════════\n LIST VIEW — single-column card layout\n ═══════════════════════════════════════════════════════════════ */}\n {listView && listViewColumn && (\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 {/* Info bar */}\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 {/* Scrollable rows — pagination stays OUTSIDE this div */}\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 as R}\n rowIndex={idx}\n listViewColumn={listViewColumn as any}\n isSelected={selectedRowIds.has(row.id)}\n checkboxSelection={checkboxSelection}\n rowHeight={rowHeight}\n onRowClick={(r) => handleRowClick({ row: r, id: r.id, rowIndex: idx })}\n onSelectionChange={handleSelectionChange}\n />\n ))\n )}\n </div>\n\n {/* Pagination in list view — use filteredRows.length as total since state.pagination.rowCount is only set for server-side */}\n {pagination && (() => {\n const PaginationComponent = slots?.pagination || Pagination;\n const totalRowCount = (paginationMode === 'server' && dataSource)\n ? (state.pagination.rowCount || 0)\n : filteredRows.length;\n const paginationProps = {\n page: effectivePaginationModel.page,\n pageSize: effectivePaginationModel.pageSize,\n rowCount: totalRowCount,\n pageSizeOptions: pageSizeOptions,\n onPageChange: (newPage: number) => handlePaginationModelChange({ ...effectivePaginationModel, page: newPage }),\n onPageSizeChange: (newPageSize: number) => handlePaginationModelChange({ ...effectivePaginationModel, pageSize: newPageSize, page: 0 }),\n ...slotProps?.pagination\n };\n return <PaginationComponent {...paginationProps} />;\n })()}\n </div>\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 as any}\n columnGroupingModel={columnGroupingModel}\n checkboxSelection={checkboxSelection}\n allSelected={allSelected}\n someSelected={someSelected}\n onSelectAll={handleSelectAll}\n sortModel={sortModel}\n onSort={handleSort}\n\n onColumnResize={handleColumnResize}\n columnWidths={columnWidths}\n pinnedColumns={pinnedColumns}\n\n focusedCell={focusedCell}\n onHeaderClick={(field) => {\n setFocusedCell({ id: 'HEADER', field });\n setKeyboardMode(false);\n gridRef.current?.focus({ preventScroll: true });\n }}\n onDragStart={columnGroupingModel ? undefined : columnReorderHandlers.onDragStart}\n onDragOver={columnGroupingModel ? undefined : columnReorderHandlers.onDragOver}\n onDragEnd={columnGroupingModel ? undefined : columnReorderHandlers.onDragEnd}\n onDrop={columnGroupingModel ? undefined : columnReorderHandlers.onDrop}\n draggedColumn={columnGroupingModel ? undefined : columnReorderHandlers.draggedColumn}\n dragOverColumn={columnGroupingModel ? undefined : columnReorderHandlers.dragOverColumn}\n rowReordering={rowReordering}\n hasDetailPanel={hasDetailPanel}\n pinCheckboxColumn={pinCheckboxColumn}\n pinExpandColumn={pinExpandColumn}\n aggregationModel={aggregationModel}\n onHideColumn={(field) => {\n handleColumnVisibilityModelChange({\n ...columnVisibilityModel,\n [field]: false,\n });\n }}\n onManageColumns={() => setColumnsPanelOpen(true)}\n onPinColumn={(field, side) => {\n const left = [...(pinnedColumns?.left ?? [])];\n const right = [...(pinnedColumns?.right ?? [])];\n\n const cleanLeft = left.filter(f => f !== field);\n const cleanRight = right.filter(f => f !== field);\n if (side === 'left') {\n handlePinnedColumnsChange({ left: [...cleanLeft, field], right: cleanRight });\n } else if (side === 'right') {\n handlePinnedColumnsChange({ left: cleanLeft, right: [...cleanRight, field] });\n } else {\n handlePinnedColumnsChange({ left: cleanLeft, right: cleanRight });\n }\n }}\n />\n\n {/* Empty State Overlay (Standard View) — showing after header */}\n {!effectiveLoading && !state.dataSource.error && filteredRows.length === 0 && (\n <div className=\"ogx__empty\" style={{ width: virtualization.totalWidth }}>\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 { }\n {pinnedTopRows.length > 0 && (\n <div className=\"ogx__pinned-rows ogx__pinned-rows--top\" role=\"rowgroup\">\n {pinnedTopRows.map((row, index) => (\n <Row\n key={row.id}\n row={row}\n columns={virtualization.virtualColumns}\n rowIndex={index}\n isSelected={selectedRowIds.has(row.id)}\n checkboxSelection={checkboxSelection}\n onRowClick={handleRowClick}\n onCellClick={handleCellClick}\n onSelectionChange={handleSelectionChange}\n columnWidths={columnWidths}\n pinnedColumns={pinnedColumns}\n pinnedRows={pinnedRows}\n\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={handleDetailPanelToggle}\n pinCheckboxColumn={pinCheckboxColumn}\n pinExpandColumn={pinExpandColumn}\n\n focusedCellField={focusedCell?.id === row.id ? focusedCell.field : null}\n\n colspanMap={spanning.colspanMap}\n rowSpanningCaches={spanning.rowSpanningState.caches}\n rowHeight={rowHeight}\n />\n ))}\n </div>\n )}\n\n { }\n <div\n className=\"ogx__virtual-container\"\n style={{\n height: `${virtualization.totalHeight - virtualization.pinnedTopHeight - virtualization.pinnedBottomHeight}px`\n }}\n role=\"presentation\"\n >\n { }\n <div\n className=\"ogx__rows\"\n style={{\n transform: `translateY(${virtualization.renderContext.firstRowIndex * rowHeight}px)`\n }}\n role=\"rowgroup\"\n >\n {effectiveLoading && visibleRows.length === 0 ? (\n\n (() => {\n\n const skeletonColumns = columns.length > 0\n ? columns\n : (() => {\n\n const availableWidth = (state.dimensions.viewportWidth || 1000) -\n (checkboxSelection ? 48 : 0) -\n (getDetailPanelContent ? 48 : 0) -\n (rowReordering ? 48 : 0);\n\n const columnWidth = 150;\n const columnCount = Math.max(1, Math.ceil(availableWidth / columnWidth));\n\n return Array.from({ length: columnCount }, (_, i) => ({\n field: `placeholder_${i}`,\n headerName: '',\n width: columnWidth\n }));\n })();\n\n return Array.from({ length: 10 }).map((_, index) => (\n <SkeletonRow\n key={`skeleton-${index}`}\n columns={skeletonColumns}\n rowHeight={rowHeight}\n checkboxSelection={checkboxSelection}\n hasDetailPanel={!!getDetailPanelContent}\n rowReordering={rowReordering}\n />\n ));\n })()\n ) : (\n visibleRows\n .filter(({ row }) => !isRowPinned(row.id, pinnedRows))\n // Defensive deduplication to prevent React key collision\n .filter((item, index, self) =>\n index === self.findIndex(t => t.row.id === item.row.id)\n )\n .map(({ row, rowIndex: actualIndex }) => {\n return (\n <Row\n key={`${row.id}-${virtualization.totalWidth}`}\n row={row}\n columns={virtualization.virtualColumns}\n rowIndex={actualIndex}\n isSelected={selectedRowIds.has(row.id)}\n checkboxSelection={checkboxSelection}\n onRowClick={handleRowClick}\n onCellClick={handleCellClick}\n onSelectionChange={handleSelectionChange}\n columnWidths={columnWidths}\n pinnedColumns={pinnedColumns}\n pinnedRows={pinnedRows}\n // Detail Panel\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={handleDetailPanelToggle}\n pinCheckboxColumn={pinCheckboxColumn}\n pinExpandColumn={pinExpandColumn}\n // Row Reordering\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 // Editing\n editingCell={editingHandlers.editingCell}\n onEditStart={editingHandlers.startCellEdit}\n onEditStop={editingHandlers.stopCellEdit}\n onEditCellValueChange={editingHandlers.setEditCellValue}\n // Focus\n focusedCellField={focusedCell != null && focusedCell.id === row.id ? focusedCell.field : null}\n // Spanning\n colspanMap={spanning.colspanMap}\n rowSpanningCaches={spanning.rowSpanningState.caches}\n rowHeight={rowHeight}\n />\n );\n })\n )}\n\n {/* Infinite Scroll Skeletons (Inline with flow, inside translateY container) */}\n {paginationMode === 'infinite' && state.dataSource.loading && sortedUnpinnedRows.length > 0 && (() => {\n const skeletonCount = Math.min(effectivePaginationModel.pageSize, 20);\n // The virtual container translates its children down by `firstRowIndex * rowHeight`. \n // Since these skeletons are at the VERY BOTTOM of all rows, their actual array index\n // is precisely after the last real row.\n const startIdx = layout.unpinnedRowsLength;\n\n // However, they are rendered INSIDE the translateY block. The real rows handled this nicely\n // because they just layout one after another. Skeletons can do exactly the same, EXCEPT we might\n // need to offset them so they sit at the bottom.\n return (\n <div className=\"ogx__skeleton-group\">\n {Array.from({ length: skeletonCount }).map((_, i) => (\n <Row\n key={`__skeleton_${i}__`}\n row={{ id: `__skeleton_${i}__`, _isSkeleton: true } as any}\n columns={virtualization.virtualColumns}\n rowIndex={startIdx + i}\n rowHeight={rowHeight}\n />\n ))}\n </div>\n );\n })()}\n </div>\n\n </div>\n\n {/* Pinned Bottom Rows */}\n {pinnedBottomRows.length > 0 && (\n <div className=\"ogx__pinned-rows ogx__pinned-rows--bottom\" role=\"rowgroup\">\n {pinnedBottomRows.map((row, index) => (\n <Row\n key={row.id}\n row={row}\n columns={virtualization.virtualColumns}\n rowIndex={index}\n isSelected={selectedRowIds.has(row.id)}\n checkboxSelection={checkboxSelection}\n onRowClick={handleRowClick}\n onCellClick={handleCellClick}\n onSelectionChange={handleSelectionChange}\n columnWidths={columnWidths}\n pinnedColumns={pinnedColumns}\n pinnedRows={pinnedRows}\n // Detail Panel\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={handleDetailPanelToggle}\n pinCheckboxColumn={pinCheckboxColumn}\n pinExpandColumn={pinExpandColumn}\n // Focus\n focusedCellField={focusedCell?.id === row.id ? focusedCell.field : null}\n // Spanning\n colspanMap={spanning.colspanMap}\n rowSpanningCaches={spanning.rowSpanningState.caches}\n rowHeight={rowHeight}\n />\n ))}\n </div>\n )}\n\n {/* Aggregation Footer Row */}\n {hasAggregation && (\n <div\n className=\"ogx__aggregation-footer\"\n role=\"row\"\n aria-label=\"Aggregation totals\"\n aria-live=\"polite\"\n style={{\n minHeight: `${rowHeight}px`\n }}\n >\n {checkboxSelection && (\n <div style={{ width: 48, flexShrink: 0 }} />\n )}\n {hasDetailPanel && (\n <div style={{ width: 48, flexShrink: 0 }} />\n )}\n {rowReordering && (\n <div style={{ width: 48, flexShrink: 0 }} />\n )}\n {orderedColumns.map((col) => {\n const fnName = (aggregationModel as Record<string, string>)[col.field];\n const rawValue = aggregationResult[col.field];\n const colWidth = columnWidths[col.field] ?? (typeof col.width === 'number' ? col.width : 120);\n\n return (\n <div\n key={col.field}\n className=\"ogx__aggregation-cell\"\n role=\"gridcell\"\n style={{\n width: colWidth,\n minWidth: colWidth,\n maxWidth: colWidth,\n textAlign: (col.align as React.CSSProperties['textAlign']) || 'left',\n }}\n >\n {fnName ? (\n <>\n <span className=\"ogx__aggregation-label\">\n {fnName}\n </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 </div>\n </div>\n )}\n\n {/* Pagination — shared between grid and list view when not inside list view block */}\n {!listView && pagination && (() => {\n const PaginationComponent = slots?.pagination || Pagination;\n const paginationProps = {\n page: effectivePaginationModel.page,\n pageSize: effectivePaginationModel.pageSize,\n rowCount: state.pagination.rowCount,\n pageSizeOptions: pageSizeOptions,\n onPageChange: (newPage: number) => handlePaginationModelChange({ ...effectivePaginationModel, page: newPage }),\n onPageSizeChange: (newPageSize: number) => handlePaginationModelChange({ ...effectivePaginationModel, pageSize: newPageSize, page: 0 }),\n ...slotProps?.pagination\n };\n\n return <PaginationComponent {...paginationProps} />;\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.message || 'Unknown error'}` : ''}\n {!loading && !state.dataSource.error && (\n filteredRows.length === 0\n ? noRowsLabel\n : (filterModel && ((filterModel.quickFilterValues?.length || 0) > 0 || (filterModel.items?.length || 0) > 0))\n ? `${filteredRows.length} ${filteredRows.length === 1 ? 'row' : 'rows'} found`\n : ''\n )}\n </div>\n\n {state.dataSource.error && (\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 {state.dataSource.error.message || 'An unexpected error occurred while loading the data.'}\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 </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 } from 'react';\nimport type {\n GridFilterModel,\n GridFilterItem,\n GridColDef,\n GridFilterOperator\n} from '../../types';\nimport { getOperatorsForType } from '../../utils/filtering';\n\n\ninterface FilterPanelProps {\n filterModel: GridFilterModel;\n columns: GridColDef[];\n onFilterModelChange: (model: GridFilterModel) => void;\n}\n\nconst NO_VALUE_OPERATORS = new Set(['isEmpty', 'isNotEmpty']);\n\nfunction getActiveFilter(items: GridFilterItem[], field: string): GridFilterItem | undefined {\n return items.find(item => 'field' in item && item.field === field) as GridFilterItem | undefined;\n}\n\nconst FilterRow: React.FC<{\n col: GridColDef;\n item: GridFilterItem | undefined;\n onChange: (item: GridFilterItem | null) => void;\n}> = ({ col, item, onChange }) => {\n const operators = getOperatorsForType(col.type);\n const isActive = !!item;\n const currentOperator = item?.operator ?? operators[0];\n\n 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 handleValueChange = (value: string) => {\n onChange({\n id: item?.id ?? `${col.field}-${Date.now()}`,\n field: col.field,\n operator: currentOperator as GridFilterOperator,\n value,\n });\n };\n\n const handleClear = () => {\n onChange(null);\n };\n\n const isNoValue = NO_VALUE_OPERATORS.has(String(currentOperator));\n const isBoolean = col.type === 'boolean';\n const showValue = !isNoValue;\n\n return (\n <div className={`ogx-filter__row${isActive ? ' ogx-filter__row--active' : ''}`}>\n { }\n <span className=\"ogx-filter__col-label\" title={col.field}>\n {col.headerName || col.field}\n </span>\n\n { }\n <div className=\"ogx-filter__controls\">\n { }\n <select\n id={`ogx-filter-op-${col.field}`}\n name={`filter-op-${col.field}`}\n className={`ogx-filter__op-select${isActive ? ' ogx-filter__op-select--active' : ''}`}\n value={String(currentOperator)}\n onChange={(e) => handleOperatorChange(e.target.value)}\n aria-label={`Filter operator for ${col.headerName || col.field}`}\n >\n {operators.map(op => (\n <option key={op} value={op}>{op}</option>\n ))}\n </select>\n\n { }\n {showValue && isBoolean && (\n <select\n id={`ogx-filter-val-${col.field}`}\n name={`filter-val-${col.field}`}\n className={`ogx-filter__value-input ogx-filter__value-select${isActive ? ' ogx-filter__value-input--active' : ''}`}\n value={String(item?.value ?? 'true')}\n onChange={(e) => handleValueChange(e.target.value)}\n aria-label={`Filter value for ${col.headerName || col.field}`}\n >\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n )}\n\n {showValue && !isBoolean && (\n <input\n id={`ogx-filter-val-${col.field}`}\n name={`filter-val-${col.field}`}\n className={`ogx-filter__value-input${isActive ? ' ogx-filter__value-input--active' : ''}`}\n type={col.type === 'number' ? 'number' : 'text'}\n value={item?.value ?? ''}\n onChange={(e) => handleValueChange(e.target.value)}\n placeholder=\"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: GridFilterItem[] = (filterModel.items ?? []) as GridFilterItem[];\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, 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\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, anchorRef.current?.closest('.ogx-theme-provider') || document.body);\n}\n","import React, { useState, useEffect, useRef } 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(false);\n const [localValue, setLocalValue] = useState(value);\n const inputRef = useRef<HTMLInputElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Sync local value with prop\n useEffect(() => {\n setLocalValue(value);\n if (value && !isExpanded) {\n setIsExpanded(true);\n }\n }, [value, isExpanded]);\n\n // Debounce change\n useEffect(() => {\n const handler = setTimeout(() => {\n if (localValue !== value) {\n onChange(localValue);\n }\n }, debounceMs);\n return () => clearTimeout(handler);\n }, [localValue, onChange, debounceMs, value]);\n\n const handleFocus = () => {\n setIsExpanded(true);\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n setLocalValue('');\n inputRef.current?.focus();\n onChange(''); // Immediate clear\n };\n\n // Close on blur if empty\n const handleBlur = () => {\n if (!localValue) {\n setIsExpanded(false);\n }\n };\n\n // Click outside to collapse if empty\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\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={() => {\n if (!isExpanded) {\n setIsExpanded(true);\n\n setTimeout(() => inputRef.current?.focus(), 50);\n }\n }}\n >\n <div className=\"ogx-global-search__icon-wrapper\">\n <SearchIcon />\n </div>\n <input\n ref={inputRef}\n id=\"ogx-global-search-input\"\n name=\"ogx-global-search\"\n className=\"ogx-global-search__input\"\n value={localValue}\n onChange={(e) => setLocalValue(e.target.value)}\n onFocus={handleFocus}\n onBlur={handleBlur}\n placeholder={placeholder}\n aria-label=\"Global Search\"\n autoComplete=\"off\"\n />\n {localValue && (\n <button className=\"ogx-global-search__clear\" onClick={handleClear} aria-label=\"Clear search\">\n <CloseIcon />\n </button>\n )}\n </div>\n );\n}\n","import { useState, useRef, useLayoutEffect, useCallback } from 'react';\nimport ReactDOM from 'react-dom';\nimport './Tooltip.css';\n\ninterface GridTooltipProps {\n title: React.ReactNode;\n children: React.ReactElement;\n placement?: 'top' | 'bottom' | 'left' | 'right';\n enterDelay?: number;\n leaveDelay?: number;\n}\n\nexport function GridTooltip({\n title,\n children,\n placement = 'top',\n enterDelay = 200,\n leaveDelay = 0\n}: GridTooltipProps) {\n const [open, setOpen] = useState(false);\n const [coords, setCoords] = useState({ top: 0, left: 0 });\n const timerRef = useRef<NodeJS.Timeout | null>(null);\n const childRef = useRef<HTMLElement | null>(null);\n\n const updateCoords = useCallback(() => {\n if (!childRef.current) return;\n const rect = childRef.current.getBoundingClientRect();\n\n let t = 0;\n let l = 0;\n\n // Note: These calculations are for positioning absolute relative to document.body\n const scrollX = window.pageXOffset || document.documentElement.scrollLeft;\n const scrollY = window.pageYOffset || document.documentElement.scrollTop;\n\n if (placement === 'top') {\n t = rect.top + scrollY - 8;\n l = rect.left + scrollX + rect.width / 2;\n } else if (placement === 'bottom') {\n t = rect.bottom + scrollY + 8;\n l = rect.left + scrollX + rect.width / 2;\n }\n\n setCoords({ top: t, left: l });\n }, [placement]);\n\n useLayoutEffect(() => {\n if (open) {\n updateCoords();\n window.addEventListener('scroll', updateCoords, true);\n window.addEventListener('resize', updateCoords);\n }\n return () => {\n window.removeEventListener('scroll', updateCoords, true);\n window.removeEventListener('resize', updateCoords);\n };\n }, [open, updateCoords]);\n\n const handleMouseEnter = () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => {\n setOpen(true);\n }, enterDelay);\n };\n\n const handleMouseLeave = () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => {\n setOpen(false);\n }, leaveDelay);\n };\n\n const wrapperRef = useCallback((node: HTMLSpanElement | null) => {\n // Use the first real child element for coordinates, not the wrapper span.\n // display:contents would give zero rects; inline-block wrapper gives correct rects\n // but we want coords from the actual child for pixel-perfect placement.\n childRef.current = node ? (node.firstElementChild as HTMLElement) ?? node : null;\n }, []);\n\n return (\n <>\n <span\n ref={wrapperRef}\n style={{ display: 'inline-block', lineHeight: 0 }}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {children}\n </span>\n {open && title && ReactDOM.createPortal(\n <div\n className={`ogx-tooltip ogx-tooltip--${placement}`}\n style={{\n top: coords.top,\n left: coords.left,\n position: 'absolute',\n zIndex: 99999\n }}\n >\n {title}\n </div>,\n document.body\n )}\n </>\n );\n}\n","import React, { useState, useRef, useEffect, useCallback } 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\nexport interface GridToolbarProps {\n columns?: 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 forceColumnsOpen?: boolean;\n onColumnsPanelClose?: () => void;\n children?: React.ReactNode;\n rightContent?: React.ReactNode;\n style?: React.CSSProperties;\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<HTMLButtonElement | 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\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, anchorRef.current?.closest('.ogx-theme-provider') || document.body);\n}\n\nfunction ColumnsPanelWrapper({\n anchorRef,\n columns,\n visibleColumns,\n onVisibilityChange,\n onShowAll,\n onHideAll,\n onColumnReorder,\n onClose\n}: {\n anchorRef: React.RefObject<HTMLButtonElement | 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 onClose: () => void;\n}) {\n const panelRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState<PanelPosition>({ top: 0, right: 0 });\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 />\n </div>\n );\n\n return ReactDOM.createPortal(panel, anchorRef.current?.closest('.ogx-theme-provider') || document.body);\n}\n\nfunction FilterPanelWrapper({\n anchorRef,\n columns,\n filterModel,\n onFilterModelChange,\n onClose\n}: {\n anchorRef: React.RefObject<HTMLButtonElement | 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\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 function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') onClose();\n }\n document.addEventListener('mousedown', handleClick);\n document.addEventListener('keydown', handleKey);\n return () => {\n document.removeEventListener('mousedown', handleClick);\n document.removeEventListener('keydown', handleKey);\n };\n }, [anchorRef, onClose]);\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 { }\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 {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 </div>\n\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, anchorRef.current?.closest('.ogx-theme-provider') || document.body);\n}\n\nconst EMPTY_PIVOT: GridPivotModel = { rowFields: [], columnFields: [], valueFields: [] };\n\nexport function GridToolbar({\n columns = [],\n aggregationModel = {},\n onAggregationModelChange,\n pivotModel,\n onPivotModelChange,\n filterModel,\n onFilterModelChange,\n columnVisibilityModel = {},\n onColumnVisibilityModelChange,\n onColumnReorder,\n forceColumnsOpen,\n onColumnsPanelClose,\n children,\n rightContent,\n style,\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 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\" 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 <GlobalSearch\n value={searchValue}\n onChange={handleSearchChange}\n placeholder=\"Search...\"\n />\n </div>\n )}\n\n {/* Columns Button */}\n {onColumnVisibilityModelChange && (\n <div className=\"ogx-toolbar__dropdown-wrapper\" style={{ marginRight: 4 }}>\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 {colsOpen && (\n <ColumnsPanelWrapper\n anchorRef={colsButtonRef}\n columns={columns}\n visibleColumns={visibleColumns}\n onVisibilityChange={handleVisibilityChange}\n onShowAll={handleShowAllColumns}\n onHideAll={handleHideAllColumns}\n onColumnReorder={onColumnReorder}\n onClose={() => { setColsOpen(false); onColumnsPanelClose?.(); }}\n />\n )}\n </div>\n )}\n\n {/* Filters Button */}\n {onFilterModelChange && (\n <div className=\"ogx-toolbar__dropdown-wrapper\" style={{ marginRight: 4 }}>\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 {filterOpen && (\n <FilterPanelWrapper\n anchorRef={filterButtonRef}\n columns={columns}\n filterModel={filterModel || { items: [] }}\n onFilterModelChange={onFilterModelChange}\n onClose={() => setFilterOpen(false)}\n />\n )}\n </div>\n )}\n\n {/* Pivot button */}\n {onPivotModelChange && (\n <div className=\"ogx-toolbar__dropdown-wrapper\" style={{ marginRight: 4 }}>\n <GridTooltip title=\"Pivot\">\n <button\n ref={pivotButtonRef}\n id=\"ogx-pivot-btn\"\n className={`ogx-toolbar__icon-btn${pivotOpen ? ' ogx-toolbar__icon-btn--active' : ''}`}\n aria-label=\"Configure pivot\"\n aria-expanded={pivotOpen}\n aria-controls=\"ogx-pivot-panel\"\n onClick={() => {\n setPivotOpen(!pivotOpen);\n setAggOpen(false);\n setColsOpen(false);\n setFilterOpen(false);\n }}\n >\n <PivotIcon />\n {pivotActive && (\n <span className=\"ogx-toolbar__dot\" aria-label=\"Pivot active\" />\n )}\n </button>\n </GridTooltip>\n\n {pivotOpen && (\n <PivotPanel\n anchorRef={pivotButtonRef}\n columns={columns}\n model={currentPivotModel}\n onChange={(m) => { onPivotModelChange?.(m); }}\n onClose={() => setPivotOpen(false)}\n />\n )}\n </div>\n )}\n\n {/* Summaries button */}\n <div className=\"ogx-toolbar__dropdown-wrapper\" style={{ marginRight: 4 }}>\n <GridTooltip title=\"Summaries\">\n <button\n ref={aggButtonRef}\n id=\"ogx-aggregation-btn\"\n className={`ogx-toolbar__icon-btn${aggOpen ? ' ogx-toolbar__icon-btn--active' : ''}`}\n aria-label=\"Configure summaries\"\n aria-expanded={aggOpen}\n aria-controls=\"ogx-aggregation-panel\"\n onClick={() => {\n setAggOpen(!aggOpen);\n setPivotOpen(false);\n setColsOpen(false);\n setFilterOpen(false);\n }}\n >\n <SigmaIcon />\n {activeCount > 0 && (\n <span className=\"ogx-toolbar__dot\" aria-label={`${activeCount} active summaries`} />\n )}\n </button>\n </GridTooltip>\n\n {aggOpen && (\n <AggregationPanel\n anchorRef={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 {rightContent}\n </div>\n </div>\n );\n}\n","import { useRef } from 'react';\nimport type { GridApi } from '../../types';\n\n/**\n * Hook to create a ref for the DataGrid API.\n * This ref can be passed to the `apiRef` prop of the `DataGrid` component.\n */\nexport function useGridApiRef() {\n return useRef<GridApi>(null!);\n}\n","\nimport React from 'react';\n\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n fullWidth?: boolean;\n error?: boolean;\n startAdornment?: React.ReactNode;\n endAdornment?: React.ReactNode;\n}\n\nexport const Input: React.FC<InputProps> = ({\n fullWidth = false,\n error = false,\n startAdornment,\n endAdornment,\n className = '',\n ...props\n}) => {\n const wrapperClassNames = [\n 'ogx-input-wrapper',\n fullWidth && 'ogx-input-wrapper--full-width',\n error && 'ogx-input-wrapper--error',\n props.disabled && 'ogx-input-wrapper--disabled',\n className\n ].filter(Boolean).join(' ');\n\n return (\n <div className={wrapperClassNames}>\n {startAdornment && (\n <div className=\"ogx-input__adornment ogx-input__adornment--start\">\n {startAdornment}\n </div>\n )}\n <input\n className=\"ogx-input\"\n {...props}\n />\n {endAdornment && (\n <div className=\"ogx-input__adornment ogx-input__adornment--end\">\n {endAdornment}\n </div>\n )}\n </div>\n );\n};\n","\nimport type { GridColDef, GridRowModel, GridAggregationModel } from '../../types';\nimport { formatAggregationValue } from '../../hooks/features/useAggregation';\n\nexport interface CsvExportOptions {\n fileName?: string;\n includeHeaders?: boolean;\n delimiter?: string;\n selectedRows?: (string | number)[];\n aggregationResult?: Record<string, any> | null;\n aggregationModel?: GridAggregationModel | null;\n}\n\nexport function exportToCsv<R extends GridRowModel>(\n rows: R[],\n columns: GridColDef<R>[],\n options: CsvExportOptions = {}\n): void {\n const {\n fileName = 'export.csv',\n includeHeaders = true,\n delimiter = ',',\n selectedRows\n } = options;\n\n const rowsToExport = selectedRows && selectedRows.length > 0\n ? rows.filter(r => selectedRows.includes(r.id))\n : rows;\n\n if (rowsToExport.length === 0) {\n console.warn('No rows to export');\n return;\n }\n\n const exportColumns = columns.filter(col => {\n\n if (col.field === '__check__' || col.field === '__actions__') return false;\n return true;\n });\n\n let csvContent = '';\n\n // Add headers\n if (includeHeaders) {\n const headers = exportColumns.map(col => escapeCSV(col.headerName || col.field));\n csvContent += headers.join(delimiter) + '\\n';\n }\n\n rowsToExport.forEach(row => {\n const values = exportColumns.map(col => {\n let value: any = row[col.field as keyof R];\n\n if (col.valueGetter) {\n value = col.valueGetter({ row, field: col.field, value });\n }\n\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n\n return escapeCSV(String(value ?? ''));\n });\n csvContent += values.join(delimiter) + '\\n';\n });\n\n // Add Aggregation\n if (options.aggregationResult) {\n const aggResult = options.aggregationResult;\n const aggModel = options.aggregationModel || {};\n \n // Print Aggregation Function Labels\n const aggLabels = exportColumns.map((col) => {\n if (aggModel[col.field]) {\n return escapeCSV(aggModel[col.field].toUpperCase());\n }\n return escapeCSV('');\n });\n csvContent += aggLabels.join(delimiter) + '\\n';\n\n // Print Aggregation Values\n const aggValues = exportColumns.map((col) => {\n const aggVal = aggResult[col.field];\n if (aggVal !== undefined && aggVal !== null) {\n let formatted = aggVal;\n if (col.valueFormatter) {\n formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n } else if (aggModel[col.field]) {\n formatted = formatAggregationValue(aggVal, aggModel[col.field]);\n }\n return escapeCSV(String(formatted));\n }\n return escapeCSV('');\n });\n csvContent += aggValues.join(delimiter) + '\\n';\n }\n\n downloadFile(csvContent, fileName, 'text/csv;charset=utf-8;');\n}\n\nfunction escapeCSV(value: string): string {\n if (value.includes(',') || value.includes('\"') || value.includes('\\n')) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n}\n\nexport interface ExcelExportOptions {\n fileName?: string;\n sheetName?: string;\n includeHeaders?: boolean;\n selectedRows?: (string | number)[];\n aggregationResult?: Record<string, any> | null;\n aggregationModel?: GridAggregationModel | null;\n}\n\nexport function exportToExcel<R extends GridRowModel>(\n rows: R[],\n columns: GridColDef<R>[],\n options: ExcelExportOptions = {}\n): void {\n const {\n fileName = 'export.xlsx',\n sheetName = 'Sheet1',\n includeHeaders = true,\n selectedRows\n } = options;\n\n const rowsToExport = selectedRows && selectedRows.length > 0\n ? rows.filter(r => selectedRows.includes(r.id))\n : rows;\n\n if (rowsToExport.length === 0) {\n console.warn('No rows to export');\n return;\n }\n\n const exportColumns = columns.filter(col => {\n if (col.field === '__check__' || col.field === '__actions__') return false;\n return true;\n });\n\n let html = '<html xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:x=\"urn:schemas-microsoft-com:office:excel\" xmlns=\"http://www.w3.org/TR/REC-html40\">';\n html += '<head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>';\n html += `<x:Name>${sheetName}</x:Name>`;\n html += '<x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]-->';\n html += '<meta charset=\"UTF-8\"></head><body>';\n html += '<table border=\"1\">';\n\n if (includeHeaders) {\n html += '<thead><tr>';\n exportColumns.forEach(col => {\n html += `<th>${escapeHTML(col.headerName || col.field)}</th>`;\n });\n html += '</tr></thead>';\n }\n\n html += '<tbody>';\n rowsToExport.forEach(row => {\n html += '<tr>';\n exportColumns.forEach(col => {\n let value: any = row[col.field as keyof R];\n\n if (col.valueGetter) {\n value = col.valueGetter({ row, field: col.field, value });\n }\n\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n\n html += `<td>${escapeHTML(String(value ?? ''))}</td>`;\n });\n });\n\n if (options.aggregationResult) {\n const aggResult = options.aggregationResult;\n const aggModel = options.aggregationModel || {};\n\n html += '<tr style=\"font-size: 11px; color: #666; background-color: #f5f5f5;\">';\n exportColumns.forEach((col) => {\n if (aggModel[col.field]) {\n html += `<td style=\"text-align: right; font-weight: bold;\">${escapeHTML(aggModel[col.field].toUpperCase())}</td>`;\n } else {\n html += `<td></td>`;\n }\n });\n html += '</tr>';\n\n html += '<tr style=\"font-weight: bold; background-color: #f5f5f5;\">';\n exportColumns.forEach((col) => {\n const aggVal = aggResult[col.field];\n if (aggVal !== undefined && aggVal !== null) {\n let formatted = aggVal;\n if (col.valueFormatter) {\n formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n } else if (aggModel[col.field]) {\n formatted = formatAggregationValue(aggVal, aggModel[col.field]);\n }\n html += `<td style=\"text-align: right;\">${escapeHTML(String(formatted))}</td>`;\n } else {\n html += `<td></td>`;\n }\n });\n html += '</tr>';\n }\n\n html += '</tbody></table></body></html>';\n\n downloadFile(html, fileName, 'application/vnd.ms-excel');\n}\n\nfunction escapeHTML(value: string): string {\n return value\n .replace(/&/g, '&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, any> | null;\n aggregationModel?: GridAggregationModel | null;\n}\n\n/**\n * Export data to JSON format\n */\nexport function exportToJson<R extends GridRowModel>(\n rows: R[],\n columns: GridColDef<R>[],\n options: JsonExportOptions = {}\n): void {\n const {\n fileName = 'export.json',\n pretty = true,\n selectedRows\n } = options;\n\n // Filter rows if selection is active\n const rowsToExport = selectedRows && selectedRows.length > 0\n ? rows.filter(r => selectedRows.includes(r.id))\n : rows;\n\n if (rowsToExport.length === 0) {\n console.warn('No rows to export');\n return;\n }\n\n // Filter columns\n const exportColumns = columns.filter(col => {\n if (col.field === '__check__' || col.field === '__actions__') return false;\n return true;\n });\n\n // Build JSON data\n const data = rowsToExport.map(row => {\n const obj: any = {};\n exportColumns.forEach(col => {\n let value: any = row[col.field as keyof R];\n\n // Use valueGetter if available\n if (col.valueGetter) {\n value = col.valueGetter({ row, field: col.field, value });\n }\n\n obj[col.field] = value;\n });\n return obj;\n });\n\n let outData: any = data;\n\n if (options.aggregationResult) {\n const aggResult = options.aggregationResult;\n const aggModel = options.aggregationModel || {};\n \n const summaryLabelObj: any = {};\n exportColumns.forEach((col) => {\n if (aggModel[col.field]) {\n summaryLabelObj[col.field] = aggModel[col.field].toUpperCase();\n }\n });\n\n const summaryDataObj: any = {};\n exportColumns.forEach((col) => {\n if (aggResult[col.field] !== undefined && aggResult[col.field] !== null) {\n let aggVal = aggResult[col.field];\n if (col.valueFormatter) {\n aggVal = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n } else if (aggModel[col.field]) {\n aggVal = formatAggregationValue(aggVal, aggModel[col.field]);\n }\n summaryDataObj[col.field] = aggVal;\n }\n });\n\n outData = {\n data: data,\n aggregation: {\n labels: summaryLabelObj,\n values: summaryDataObj\n }\n };\n }\n\n const jsonContent = pretty ? JSON.stringify(outData, null, 2) : JSON.stringify(outData);\n\n // Download file\n downloadFile(jsonContent, fileName, 'application/json;charset=utf-8;');\n}\n\n// ============================================================================\n// Print\n// ============================================================================\n\nexport interface PrintOptions {\n title?: string;\n selectedRows?: (string | number)[];\n aggregationResult?: Record<string, any> | null;\n aggregationModel?: GridAggregationModel | null;\n}\n\n/**\n * Open print dialog with formatted table\n */\nexport async function printGrid<R extends GridRowModel>(\n rows: R[],\n columns: GridColDef<R>[],\n titleOrOptions?: string | PrintOptions\n): Promise<void> {\n // 1. Open window immediately to resolve user activation constraints and provide feedback\n const printWindow = window.open('', '_blank');\n\n if (!printWindow) {\n console.error('Failed to open print window. Please check your popup blocker settings.');\n return;\n }\n\n // 2. Show loading state\n printWindow.document.write(`\n <!DOCTYPE html>\n <html>\n <head>\n <title>Preparing Print...</title>\n <style>\n body { font-family: sans-serif; height: 100vh; display: flex; align-items: center; justify-content: center; margin: 0; background: #f5f5f5; }\n .loader { text-align: center; }\n .spinner { border: 4px solid #f3f3f3; border-top: 4px solid #3498db; border-radius: 50%; width: 40px; height: 40px; animation: spin 1s linear infinite; margin: 0 auto 20px; }\n @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }\n </style>\n </head>\n <body>\n <div class=\"loader\">\n <div class=\"spinner\"></div>\n <h2>Generating Print Preview...</h2>\n <p>Processing data, please wait.</p>\n </div>\n </body>\n </html>\n `);\n printWindow.document.close();\n\n // 3. Yield to main thread to allow the new window to render its loading state\n await new Promise(resolve => setTimeout(resolve, 100));\n\n try {\n let title = 'Print';\n let selectedRows: (string | number)[] | undefined;\n let aggregationResult: Record<string, any> | null = null;\n let aggregationModel: GridAggregationModel | null = null;\n\n if (typeof titleOrOptions === 'string') {\n title = titleOrOptions;\n } else if (typeof titleOrOptions === 'object') {\n title = titleOrOptions.title || 'Print';\n selectedRows = titleOrOptions.selectedRows;\n aggregationResult = titleOrOptions.aggregationResult || null;\n aggregationModel = titleOrOptions.aggregationModel || null;\n }\n\n // Filter rows if selection is active\n const rowsToExport = selectedRows && selectedRows.length > 0\n ? rows.filter(r => selectedRows.includes(r.id))\n : rows;\n\n if (rowsToExport.length === 0) {\n printWindow.document.body.innerHTML = '<h3>No rows to export</h3>';\n return;\n }\n\n // Filter columns\n const exportColumns = columns.filter(col => {\n if (col.field === '__check__' || col.field === '__actions__') return false;\n return true;\n });\n\n // Build HTML\n let html = `\n <!DOCTYPE html>\n <html>\n <head>\n <title>${title || 'Print'}</title>\n <style>\n body { font-family: Arial, sans-serif; margin: 20px; }\n h1 { font-size: 24px; margin-bottom: 20px; }\n table { border-collapse: collapse; width: 100%; }\n th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }\n th { background-color: #f5f5f5; font-weight: bold; }\n tr:nth-child(even) { background-color: #f9f9f9; }\n @media print {\n body { margin: 0; }\n @page { margin: 1cm; }\n }\n </style>\n </head>\n <body>\n `;\n\n if (title) {\n html += `<h1>${escapeHTML(title)}</h1>`;\n }\n\n html += '<table>';\n\n // Headers\n html += '<thead><tr>';\n exportColumns.forEach(col => {\n html += `<th>${escapeHTML(col.headerName || col.field)}</th>`;\n });\n html += '</tr></thead>';\n\n // Rows\n html += '<tbody>';\n\n // Process rows (potential bottleneck logic here)\n rowsToExport.forEach(row => {\n html += '<tr>';\n exportColumns.forEach(col => {\n let value: any = row[col.field as keyof R];\n\n if (col.valueGetter) {\n value = col.valueGetter({ row, field: col.field, value });\n }\n\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n\n if (col.type === 'image' && value) {\n html += `<td><div style=\"display:flex;justify-content:center;\"><img src=\"${value}\" alt=\"${col.headerName}\" style=\"max-height: 40px; border-radius: 4px;\"></div></td>`;\n } else {\n html += `<td>${escapeHTML(String(value ?? ''))}</td>`;\n }\n });\n html += '</tr>';\n });\n\n if (aggregationResult) {\n const aggModel = aggregationModel || {};\n html += '<tfoot><tr style=\"font-size: 11px; color: #666; background-color: #f5f5f5;\">';\n exportColumns.forEach((col) => {\n if (aggModel[col.field]) {\n html += `<td style=\"text-align: right; font-weight: bold;\">${escapeHTML(aggModel[col.field].toUpperCase())}</td>`;\n } else {\n html += `<td></td>`;\n }\n });\n html += '</tr><tr style=\"font-weight: bold; background-color: #f5f5f5;\">';\n exportColumns.forEach((col) => {\n const aggVal = aggregationResult![col.field];\n if (aggVal !== undefined && aggVal !== null) {\n let formatted = aggVal;\n if (col.valueFormatter) {\n formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n } else if (aggModel[col.field]) {\n formatted = formatAggregationValue(aggVal, aggModel[col.field]);\n }\n html += `<td style=\"text-align: right;\">${escapeHTML(String(formatted))}</td>`;\n } else {\n html += `<td></td>`;\n }\n });\n html += '</tr></tfoot>';\n }\n\n html += '</tbody></table></body></html>';\n\n // Write the HTML content\n printWindow.document.open();\n printWindow.document.write(html);\n printWindow.document.close();\n\n // Set the document title explicitly (fixes about:blank issue)\n printWindow.document.title = title || 'Print Preview';\n\n printWindow.focus();\n\n let hasPrinted = false;\n\n printWindow.onload = () => {\n if (!hasPrinted) {\n hasPrinted = true;\n printWindow.print();\n\n setTimeout(() => {\n printWindow.close();\n }, 100);\n }\n };\n\n setTimeout(() => {\n if (!hasPrinted && printWindow && !printWindow.closed) {\n hasPrinted = true;\n printWindow.print();\n setTimeout(() => {\n if (!printWindow.closed) printWindow.close();\n }, 100);\n }\n }, 500);\n\n } catch (e: any) {\n console.error('Print generation failed:', e);\n if (printWindow && !printWindow.closed) {\n printWindow.document.body.innerHTML = `<div style=\"color: red; padding: 20px;\"><h3>Error Generating Print Preview</h3><p>${e.message}</p></div>`;\n }\n }\n}\n\nfunction downloadFile(content: string, fileName: string, mimeType: string): void {\n const blob = new Blob([content], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = fileName;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n}\n","\nimport type { GridColDef, GridRowModel, GridAggregationModel } from '../../types';\nimport { formatAggregationValue } from '../../hooks/features/useAggregation';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface ExcelColumnStyle {\n /** Numeric format string, e.g. '$#,##0.00', '0.00%', 'yyyy-mm-dd' */\n numFmt?: string;\n /** Override column width (characters). Defaults to colDef.width / 7 */\n width?: number;\n /** Horizontal alignment override */\n alignment?: 'left' | 'center' | 'right';\n /**\n * If true, the cell value (expected to be an image URL string) will be\n * fetched and embedded as an inline image in the cell.\n * Requires the image server to serve CORS headers. Falls back to the\n * raw URL string if the fetch fails (a warning is logged to the console).\n */\n embedImage?: boolean;\n /** Width of the embedded image in pixels (default: 40) */\n imageWidth?: number;\n /** Height of the embedded image in pixels (default: 40) */\n imageHeight?: number;\n}\n\nexport interface ExcelSheetDefinition {\n /** Sheet tab name (max 31 chars) */\n name: string;\n /** Which rows to include. Default: 'all' */\n rows?: 'all' | 'selected';\n /** Include header row. Default: true */\n includeHeaders?: boolean;\n /** Include aggregation totals row at the bottom. Default: false */\n includeSummary?: boolean;\n /** Auto-filter dropdowns on header row. Default: true */\n autoFilter?: boolean;\n /** Freeze the header row. Default: true */\n frozenHeader?: boolean;\n /** Alternate row fill (#hex). Pass false to disable. Default: '#f8fafc' */\n alternateRowColor?: string | false;\n}\n\nexport interface ExcelAdvancedExportOptions {\n /** Output filename (default: 'export.xlsx') */\n fileName?: string;\n /**\n * Sheet definitions. If omitted, a single 'Data' sheet is created\n * with all rows.\n *\n * Built-in special sheet type: `{ type: 'summary' }` renders a\n * standalone aggregation sheet.\n */\n sheets?: (ExcelSheetDefinition | { type: 'summary'; name?: string })[]; \n /** Per-column style overrides, keyed by field name */\n columnStyles?: Record<string, ExcelColumnStyle>;\n /** Header row fill color (default: '#f1f5f9') */\n headerFillColor?: string;\n /** Header row text color (default: '#334155') */\n headerTextColor?: string;\n /** Header row font size (default: 10) */\n headerFontSize?: number;\n /** Body font size (default: 10) */\n bodyFontSize?: number;\n /** Current aggregation result */\n aggregationResult?: Record<string, any> | 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<any>, value: any): '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<any>): 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<any>, 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 — cast to GridColDef<any> to avoid generic covariance issues\n const exportColumns: GridColDef<any>[] = (columns as GridColDef<any>[]).filter(col =>\n col.field !== '__check__' &&\n col.field !== '__actions__' &&\n !(col as any).isSpacer\n );\n\n const allRows: any[] = rows as any[];\n const sRows: any[] = (selectedRows && selectedRows.length > 0\n ? rows.filter(r => selectedRows.includes(r.id))\n : rows) as any[];\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 as any)[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: any = (row as any)[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 as any)[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 any);\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\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]); \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","ListViewRow","row","rowIndex","listViewColumn","isSelected","checkboxSelection","rowHeight","onRowClick","onSelectionChange","params","handleCheckboxChange","e","jsxs","jsx","Checkbox","indeterminate","label","className","inputRef","internalRef","setRef","element","wrapperClassNames","ColumnResizeHandle","field","currentWidth","onResize","minWidth","maxWidth","isDragging","setIsDragging","useState","startXRef","useRef","startWidthRef","handleMouseDown","useCallback","event","lastUpdateTime","throttleMs","handleMouseMove","deltaX","newWidth","now","handleMouseUp","handleDoubleClick","classNames","isColumnPinned","pinnedColumns","getPinnedColumnGroups","columns","left","center","right","col","pinnedPosition","a","b","aIndex","bIndex","calculatePinnedPositions","columnWidths","pinCheckboxColumn","hasDetailPanel","pinExpandColumn","rowReordering","positions","groups","leftOffset","width","rightOffset","isRowPinned","rowId","pinnedRows","getPinnedRowGroups","rows","top","bottom","ActiveDotIcon","InactiveDotIcon","ManageColumnsIcon","AscIcon","DescIcon","UnsortIcon","HideIcon","PinLeftIcon","PinRightIcon","UnpinIcon","ColumnMenu","colDef","sortModel","onSort","onHide","onPin","onManageColumns","onClose","anchorEl","menuRef","style","setStyle","anchorRect","menuRect","vw","vh","margin","useEffect","handleClickOutside","handleKey","handleSort","direction","handleHide","handlePin","side","currentSort","item","isUnsorted","isPinnedLeft","isPinnedRight","isUnpinned","colLabel","ReactDOM","Fragment","MenuIcon","SwapIcon","collectGroupFields","group","out","child","groupTreeDepth","d","walk","g","depth","c","buildGroupRow","allFields","level","findAtLevel","cur","found","fieldGroup","f","cells","i","w","totalW","j","Header","allColumns","columnGroupingModel","allSelected","someSelected","onSelectAll","onColumnResize","aggregationModel","draggedColumn","dragOverColumn","onDragStart","onDragOver","onDragEnd","onDrop","focusedCell","onHeaderClick","onHideColumn","onPinColumn","cellRefs","menuOpenParams","setMenuOpenParams","handleMenuOpen","handleMenuClose","handleColumnClick","newDirection","getSortIcon","sortItem","pinnedPositions","groupDepth","allLeafFields","prefixWidth","_","cell","el","index","isSortable","isSorted","isResizable","isPinned","isDragOver","effectiveWidth","offset","headerContent","handleHeaderClick","handleDragStart","handleDragOver","handleDrop","TextEditor","onValueChange","onCommit","onCancel","local","setLocal","ref","NumberEditor","v","BooleanEditor","handleChange","SelectEditor","options","opt","l","DateEditor","GridEditInputCell","CellImpl","onCellClick","onCellEditStart","onCellValueChange","colIndex","onClick","pinnedOffset","isFocused","isFocusVisible","isEditable","isEditing","onEditStart","onEditStop","colSpanInfo","rowSpanProp","isHiddenByRowSpan","handleClick","handleValueChange","newValue","formattedValue","cellContent","resolvedCellClassName","colSpan","rowSpan","cellWidth","cellRef","Cell","ExpandIcon","isExpanded","variant","DragHandleIcon","DetailPanel","content","height","Row","isDetailPanelExpanded","onDetailPanelToggle","detailPanelContent","detailPanelHeight","editingCell","onEditCellValueChange","focusedCellField","colspanMap","rowSpanningCaches","expandCellRef","checkboxCellRef","cellCount","handleRowClick","handleDetailPanelToggle","rowPinnedPosition","isRowPinnedTop","isRowPinnedBottom","isGroupRow","handleCellEditStart","handleCellValueChange","handleEditStopWrapper","cancel","cellValue","SkeletonRow","skeletonWidth","Button","size","color","disabled","Pagination","page","pageSize","rowCount","onPageChange","onPageSizeChange","pageSizeOptions","showFirstButton","showLastButton","pageCount","currentPage","firstRowIndex","lastRowIndex","displayedRows","handleFirstPage","handlePreviousPage","handleNextPage","handleLastPage","handlePageSizeChange","newPageSize","isFirstPage","isLastPage","option","createInitialState","columnVisibilityModel","idRowsLookup","allRows","id","columnLookup","orderedFields","gridReducer","state","action","currentRows","newRows","useDataGrid","headerHeight","propInitialState","internalInitialState","useMemo","dispatch","useReducer","stateRef","prevRowsRef","setRows","rowsOrUpdater","preserveRowCount","setColumns","newColumns","setSortModel","setFilterModel","filterModel","setPaginationModel","paginationModel","setSelection","selectedRows","setScroll","scrollTop","scrollLeft","setDimensions","viewportWidth","viewportHeight","setDataSourceLoading","loading","setDataSourceError","error","setRowCount","count","apiRef","newSelection","ids","existingIndex","newModel","useColumnReorder","onColumnOrderChange","disableColumnReorder","setDraggedColumn","setDragOverColumn","draggedIndexRef","columnIndex","targetField","oldIndex","targetIndex","column","handleDragEnd","useRowReorder","onRowOrderChange","getRowId","draggedRowId","setDraggedRowId","dragOverRowId","setDragOverRowId","getRowIdInternal","targetId","r","FILTER_OPERATORS","filterValue","numValue","numFilter","numV","numF","rowStr","filterStr","applyFilterItem","filterItem","operator","rowValue","operatorFn","applyQuickFilter","quickFilterValues","searchTerm","isRowMatchingFilter","items","logicOperator","evaluateItem","groupItems","filterRows","getOperatorsForType","compareValues","aStr","bStr","sortRows","sortedRows","aValue","bValue","comparison","useTreeData","getTreeDataPath","treeData","defaultGroupingExpansionDepth","onRowExpansionChange","treeNodes","rootIds","groupingRows","nodes","roots","groupRows","pathLookup","getPathKey","path","pathKey","ensureAncestors","childPath","parentPath","parentPathKey","parentId","groupLabel","groupRow","parentNode","childNode","groupId","nodePath","initialExpandedIds","initialExpanded","expandedGroupIds","setExpandedGroupIds","toggleExpansion","prev","next","isExpanding","getVisibleRows","rowLookup","matchesFilter","filterCache","isNodeVisible","childId","sortNodes","aId","bId","rowA","rowB","valA","valB","comp","result","seenIds","traverse","visibleIds","enhancedRow","isGroupExpanded","getNode","getNodePath","currentId","defaultGetAggregationPosition","groupNode","useRowGrouping","rowGroupingModel","getAggregationPosition","getGroupId","groupIds","groupRowsList","rawValue","aggregatedValues","aggField","aggType","values","sum","treeNode","childrenIds","descendantCount","topLevelIds","allGroupIds","depthIds","doesNodeMatchFilter","nodeId","compareResult","isGroup","isExpandedGroupIds","useGridEditing","processRowUpdate","onProcessRowUpdateError","onRowChange","setEditingCellState","editingCellRef","setEditingCell","val","startCellEdit","stopCellEdit","currentCell","originalValue","existingRow","newRow","processedRow","setEditCellValue","useGridSpanning","setColspanMap","rowSpanningState","setRowSpanningState","resetColSpan","getCellColSpanInfo","calculateColSpan","minFirstColumn","maxLastColumn","newMap","setCellColSpanInfo","nextCol","calculateRowSpan","spannedCells","hiddenCells","hiddenCellOriginMap","span","nextIndex","nextRow","resetRowSpan","colWidth","nextColWidth","getSpannedCells","getHiddenCells","getHiddenCellOriginMap","map","info","columnInfo","useGridDataSource","dataSource","paginationMode","sortingMode","filterMode","onAggregationResults","prevParamsRef","activeRequestRef","fetchRows","requestId","startRow","endRow","requestParams","response","shouldAppend","sortChanged","filterChanged","pageSizeChanged","prevRows","timer","fetchChildren","_parentId","groupKeys","existingIds","AGGREGATION_FUNCTIONS","acc","nums","formatAggregationValue","fnName","useAggregation","isServerSide","serverAggregationResults","clientResult","fn","serverResult","setServerResult","isLoading","setIsLoading","setError","requestIdRef","fetchServerAggregations","err","aggregate","makeKey","fields","usePivot","rawRows","rawCols","model","enabled","empty","rowFields","columnFields","valueFields","colDefMap","colKeySet","colKeys","outerMap","rk","labelValues","entry","ck","colBucket","vf","pivotRows","pivotRow","cellKey","pivotColumns","orig","def","labelBase","headerName","n","copyTextSynchronous","text","textarea","success","writeToClipboard","fallbackSuccess","useGridClipboard","selectedRowIds","copySelectedRows","rowsToCopy","visibleColumns","headerRow","dataRows","fullContent","handleKeyDown","activeEl","tag","SearchIcon","ColumnVisibilityPanel","onVisibilityChange","onShowAll","onHideAll","onColumnReorder","searchQuery","setSearchQuery","dragOverField","setDragOverField","dragFieldRef","allVisible","filteredColumns","lowerQuery","handleToggleAll","handleDragLeave","toField","fromField","isVisible","isHideable","canReorder","DataGrid","autoHeight","propRowSelectionModel","propOnRowSelectionModelChange","propFilterModel","onFilterModelChange","propSortModel","onSortModelChange","propPagination","onPaginationModelChange","propPinnedColumns","onPinnedColumnsChange","getDetailPanelContent","getDetailPanelHeight","controlledExpandedRowIds","onDetailPanelExpandedRowIdsChange","columnOrder","propRowGroupingModel","propAggregationModel","onAggregationModelChange","isCellEditable","propRowCount","slots","slotProps","pivotMode","propPivotModel","onPivotModelChange","onRowsScrollEnd","ariaLabel","initialState","onStateChange","propColumnVisibilityModel","onColumnVisibilityModelChange","listView","noRowsLabel","propApiRef","defaultFilterModel","internalSortModel","setInternalSortModel","isSortControlled","defaultRowGroupingModel","isAggregationControlled","StableToolbar","internalAggregationModel","setInternalAggregationModel","handleAggregationModelChange","internalColumnVisibilityModel","setInternalColumnVisibilityModel","isColumnVisibilityControlled","handleColumnVisibilityModelChange","internalPinnedColumns","setInternalPinnedColumns","isPinnedColumnsControlled","handlePinnedColumnsChange","EMPTY_PIVOT_MODEL","internalPivotModel","setInternalPivotModel","currentPivotModel","handlePivotModelChange","pivot","activeRows","activeColumns","setServerAggregationResults","internalPaginationModel","setInternalPaginationModel","isPaginationControlled","effectivePaginationModel","handlePaginationModelChange","internalRowSelectionModel","setInternalRowSelectionModel","isSelectionControlled","rowSelectionModel","onRowSelectionModelChange","viewportRef","contentRef","gridRef","defaultGetRowId","effectiveGetRowId","setFocusedCell","setKeyboardMode","on","containerRef","dataSourceRef","fetchChildrenRef","treeDataRef","handleNodeExpansion","gridData","isInternalLoading","effectiveLoading","effectiveRows","treeDataHandlers","rowGroupingHandlers","editingHandlers","updatedRow","nextRows","isTreeData","isRowGrouping","isHierarchyEnabled","activeHierarchyHandlers","pagination","effectiveColumns","_treeDepth","_hasChildren","_isExpanded","_groupingField","_groupingValue","_descendantCount","paddingLeft","dataSourceHandlers","setColumnWidths","internalColumnOrder","setInternalColumnOrder","effectiveColumnOrder","orderedColumns","orderMap","visibleOrderedColumns","columnReorderHandlers","newOrder","movedField","internalExpandedRowIds","setInternalExpandedRowIds","expandedRowIds","newExpandedRowIds","navigationColumns","cols","handleColumnResize","onStateChangeRef","snapshot","baseRows","filteredRows","pinnedTopRows","unpinnedRows","pinnedBottomRows","sortedUnpinnedRows","paginatedUnpinnedRows","start","end","rowReorderHandlers","allRenderableRows","centerRows","base","skeletonCount","skeletons","spanning","aggregationResult","hasAggregation","layout","baseRowHeight","rowHeights","detailHeight","cumulativeHeights","skeletonRowsHeight","unpinnedRowsHeight","pinnedTopHeight","pinnedBottomHeight","rawLeftPinnedCols","rawRightPinnedCols","unpinnedCols","unpinnedColWidths","pinned","systemColumnsWidth","getColWidth","parseWidth","floatVal","leftWidth","parsed","rightWidth","naturalFlexWidth","availableWidth","fixedWidthCols","percentageCols","flexCols","totalFlexUnits","hasManualWidth","fixedWidth","remainingSpaceForFlex","percentageWidthMap","percentage","calculatedWidth","finalFlexWidths","flexItems","iterations","maxIterations","unfrozen","unfrozenFlexTotal","frozenWidthTotal","currentFreeSpace","pixelsPerFlex","totalViolation","minViolators","maxViolators","rawWidth","diff","computedWidthMap","computedWidth","fixedCol","pctCol","p","rawPctWidth","unpinnedColsWithWidth","flexItem","baseLeftZ","leftPinnedCols","numericWidth","baseRightZ","rightPinnedCols","unpinnedTotalWidth","totalWidth","unpinnedAccWidths","virtualization","unpinnedRowsLength","overscanCols","visibleLocalStart","visibleLocalEnd","firstUnpinnedIndex","lastUnpinnedIndex","low","high","mid","leftSpacerWidth","rightSpacerWidth","virtualColumns","scrollbarBuffer","totalHeight","overscanRows","offsetTop","rLow","rHigh","handleScroll","target","scrollHeight","clientHeight","resizeObserver","entries","handleSelectionChange","newSelectionArray","handleSelectAll","newSortModel","handleCellClick","prevEditingCellRef","wasEditing","visibleRows","topPinnedCount","topPinned","bottomPinned","centerStartIndex","centerEndIndex","combined","handleFocus","firstRow","firstCol","handleBlur","isHeader","findNextCell","startCol","deltaRow","deltaCol","wrapRow","allowHeader","findNextEditable","steps","maxSteps","isInteractable","nextRowIndex","nextColIndex","handled","dir","res","clientWidth","rowTop","rowBottom","visibleTop","visibleBottom","newScrollTop","leftPinnedWidth","rightPinnedWidth","totalSpecialsWidth","pinnedSpecialsWidth","unpinnedIndex","colLeft","colRight","visibleStart","visibleEnd","newScrollLeft","hasRowSpanning","columnsPanelOpen","setColumnsPanelOpen","panel","toolbarProps","currentOrder","fromIdx","toIdx","rect","idx","PaginationComponent","totalRowCount","paginationProps","newPage","cleanLeft","cleanRight","skeletonColumns","columnWidth","columnCount","self","t","actualIndex","startIdx","Skeleton","NO_VALUE_OPERATORS","getActiveFilter","FilterRow","onChange","operators","isActive","currentOperator","handleOperatorChange","op","noValue","newItem","handleClear","isNoValue","isBoolean","showValue","FilterPanel","handleItemChange","rest","handleLogicChange","filterableColumns","AGG_FNS","PivotIcon","PivotPanel","anchorRef","panelRef","pos","setPos","computePos","update","onKey","inRow","inCol","inValue","isUsed","addRow","addCol","addValue","aggFn","removeRow","removeCol","removeValue","changeValueFn","reset","numericFields","totalActive","isNum","CloseIcon","GlobalSearch","placeholder","debounceMs","setIsExpanded","localValue","setLocalValue","handler","GridTooltip","title","placement","enterDelay","leaveDelay","open","setOpen","coords","setCoords","timerRef","childRef","updateCoords","scrollX","scrollY","useLayoutEffect","handleMouseEnter","handleMouseLeave","wrapperRef","SigmaIcon","ViewColumnIcon","FilterIcon","AggregationPanel","aggregableColumns","onFunctionChange","onClearAll","activeCount","currentFn","ColumnsPanelWrapper","FilterPanelWrapper","activeFilterCount","handleClearAll","EMPTY_PIVOT","GridToolbar","pivotModel","forceColumnsOpen","onColumnsPanelClose","rightContent","aggOpen","setAggOpen","pivotOpen","setPivotOpen","colsOpen","setColsOpen","filterOpen","setFilterOpen","aggButtonRef","pivotButtonRef","colsButtonRef","filterButtonRef","pivotActive","handleFunctionChange","clearAllAgg","handleSearchChange","nextModel","searchValue","handleVisibilityChange","handleShowAllColumns","handleHideAllColumns","m","useGridApiRef","Input","fullWidth","startAdornment","endAdornment","exportToCsv","fileName","includeHeaders","delimiter","rowsToExport","exportColumns","csvContent","headers","escapeCSV","aggResult","aggModel","aggLabels","aggValues","aggVal","formatted","downloadFile","exportToExcel","sheetName","html","escapeHTML","exportToJson","pretty","data","obj","outData","summaryLabelObj","summaryDataObj","jsonContent","printGrid","titleOrOptions","printWindow","resolve","hasPrinted","mimeType","blob","url","link","inferCellType","defaultNumFmt","override","px","imageExtension","contentType","ct","fetchImages","urls","settled","commaIdx","header","b64","binary","uint8","mime","ext","buffer","exportToExcelAdvanced","sheetDefs","columnStyles","headerFillColor","headerTextColor","headerFontSize","bodyFontSize","ExcelJS","workbook","sRows","resolvedSheets","imageCache","sheetDef","ws","argb","bottomBorder","rowScope","includeSummary","autoFilter","frozenHeader","alternateRowColor","imageColumns","urlsNeeded","seen","fetched","extension","imgId","headerValues","excelRowIdx","rowIdx","cellValues","dataRow","maxImgH","max","rowHeightPt","rowHeightPx","colIdx","imgW","imgH","colWidthPx","hGapPx","vGapPx","labelRow","totalValues","totalRow","topBorder","hex","clean","lightBase","themeToCSS","theme","vars","set","cssVar","s","sh","tr","tb","o","scr","sk","DataGridThemeProvider","cssVars","darkTheme","roseTheme","emeraldTheme","amberTheme","compactTheme","readFromStorage","storage","raw","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/components/ListView/ListViewRow.tsx","../lib/components/ui/Checkbox.tsx","../lib/components/ColumnResizeHandle/ColumnResizeHandle.tsx","../lib/utils/pinning/index.ts","../lib/components/Header/ColumnMenu.tsx","../lib/components/Header/Header.tsx","../lib/components/Cell/GridEditInputCell.tsx","../lib/components/Cell/Cell.tsx","../lib/components/ui/ExpandIcon.tsx","../lib/components/ui/DragHandleIcon.tsx","../lib/components/DetailPanel/DetailPanel.tsx","../lib/components/Row/Row.tsx","../lib/components/SkeletonRow/SkeletonRow.tsx","../lib/components/ui/Button.tsx","../lib/components/Pagination/Pagination.tsx","../lib/hooks/core/useDataGrid.ts","../lib/hooks/useColumnReorder.ts","../lib/hooks/useRowReorder.ts","../lib/utils/filtering/index.ts","../lib/utils/sorting/index.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/useAggregation.ts","../lib/hooks/features/usePivot.ts","../lib/hooks/features/useGridClipboard.ts","../lib/components/ColumnVisibilityPanel/ColumnVisibilityPanel.tsx","../lib/components/DataGrid/DataGrid.tsx","../lib/components/Skeleton/Skeleton.tsx","../lib/components/FilterPanel/FilterPanel.tsx","../lib/components/Toolbar/PivotPanel.tsx","../lib/components/Toolbar/GlobalSearch.tsx","../lib/components/Tooltip/Tooltip.tsx","../lib/components/Toolbar/GridToolbar.tsx","../lib/hooks/core/useGridApiRef.ts","../lib/components/ui/Input.tsx","../lib/utils/export/index.ts","../lib/utils/export/exportToExcelAdvanced.ts","../lib/theme/DataGridThemeProvider.tsx","../lib/theme/presets.ts","../lib/state/useGridStateStorage.ts"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (\n (\"number\" === typeof type.tag &&\n console.error(\n \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n ),\n type.$$typeof)\n ) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkKeyStringCoercion(value) {\n try {\n testStringCoercion(value);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n if (JSCompiler_inline_result) {\n JSCompiler_inline_result = console;\n var JSCompiler_temp_const = JSCompiler_inline_result.error;\n var JSCompiler_inline_result$jscomp$0 =\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\";\n JSCompiler_temp_const.call(\n JSCompiler_inline_result,\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n JSCompiler_inline_result$jscomp$0\n );\n return testStringCoercion(value);\n }\n }\n function getTaskName(type) {\n if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n if (\n \"object\" === typeof type &&\n null !== type &&\n type.$$typeof === REACT_LAZY_TYPE\n )\n return \"<...>\";\n try {\n var name = getComponentNameFromType(type);\n return name ? \"<\" + name + \">\" : \"<...>\";\n } catch (x) {\n return \"<...>\";\n }\n }\n function getOwner() {\n var dispatcher = ReactSharedInternals.A;\n return null === dispatcher ? null : dispatcher.getOwner();\n }\n function UnknownOwner() {\n return Error(\"react-stack-top-frame\");\n }\n function hasValidKey(config) {\n if (hasOwnProperty.call(config, \"key\")) {\n var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n if (getter && getter.isReactWarning) return !1;\n }\n return void 0 !== config.key;\n }\n function defineKeyPropWarningGetter(props, displayName) {\n function warnAboutAccessingKey() {\n specialPropKeyWarningShown ||\n ((specialPropKeyWarningShown = !0),\n console.error(\n \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n displayName\n ));\n }\n warnAboutAccessingKey.isReactWarning = !0;\n Object.defineProperty(props, \"key\", {\n get: warnAboutAccessingKey,\n configurable: !0\n });\n }\n function elementRefGetterWithDeprecationWarning() {\n var componentName = getComponentNameFromType(this.type);\n didWarnAboutElementRef[componentName] ||\n ((didWarnAboutElementRef[componentName] = !0),\n console.error(\n \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n ));\n componentName = this.props.ref;\n return void 0 !== componentName ? componentName : null;\n }\n function ReactElement(type, key, props, owner, debugStack, debugTask) {\n var refProp = props.ref;\n type = {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n props: props,\n _owner: owner\n };\n null !== (void 0 !== refProp ? refProp : null)\n ? Object.defineProperty(type, \"ref\", {\n enumerable: !1,\n get: elementRefGetterWithDeprecationWarning\n })\n : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n type._store = {};\n Object.defineProperty(type._store, \"validated\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: 0\n });\n Object.defineProperty(type, \"_debugInfo\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: null\n });\n Object.defineProperty(type, \"_debugStack\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugStack\n });\n Object.defineProperty(type, \"_debugTask\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugTask\n });\n Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n return type;\n }\n function jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n debugStack,\n debugTask\n ) {\n var children = config.children;\n if (void 0 !== children)\n if (isStaticChildren)\n if (isArrayImpl(children)) {\n for (\n isStaticChildren = 0;\n isStaticChildren < children.length;\n isStaticChildren++\n )\n validateChildKeys(children[isStaticChildren]);\n Object.freeze && Object.freeze(children);\n } else\n console.error(\n \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n );\n else validateChildKeys(children);\n if (hasOwnProperty.call(config, \"key\")) {\n children = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return \"key\" !== k;\n });\n isStaticChildren =\n 0 < keys.length\n ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n : \"{key: someKey}\";\n didWarnAboutKeySpread[children + isStaticChildren] ||\n ((keys =\n 0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n console.error(\n 'A props object containing a \"key\" prop is being spread into JSX:\\n let props = %s;\\n <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n let props = %s;\\n <%s key={someKey} {...props} />',\n isStaticChildren,\n children,\n keys,\n children\n ),\n (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n }\n children = null;\n void 0 !== maybeKey &&\n (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n children &&\n defineKeyPropWarningGetter(\n maybeKey,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n return ReactElement(\n type,\n children,\n maybeKey,\n getOwner(),\n debugStack,\n debugTask\n );\n }\n function validateChildKeys(node) {\n isValidElement(node)\n ? node._store && (node._store.validated = 1)\n : \"object\" === typeof node &&\n null !== node &&\n node.$$typeof === REACT_LAZY_TYPE &&\n (\"fulfilled\" === node._payload.status\n ? isValidElement(node._payload.value) &&\n node._payload.value._store &&\n (node._payload.value._store.validated = 1)\n : node._store && (node._store.validated = 1));\n }\n function isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n }\n var React = require(\"react\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n isArrayImpl = Array.isArray,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n React = {\n react_stack_bottom_frame: function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n React,\n UnknownOwner\n )();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutKeySpread = {};\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.jsx = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !1,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n exports.jsxs = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !0,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import React from 'react';\nimport type { 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 any,\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","\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","\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 React, { useRef, useEffect, useState } from 'react';\nimport ReactDOM from 'react-dom';\nimport type { GridColDef, GridSortDirection, GridColumnPinning } from '../../types';\n\n\ninterface ColumnMenuProps {\n colDef: GridColDef<any>;\n sortModel?: Array<{ field: string; sort: 'asc' | 'desc' }>;\n onSort?: (field: string, direction: GridSortDirection) => void;\n onHide?: (field: string) => void;\n onPin?: (field: string, side: 'left' | 'right' | null) => void;\n pinnedColumns?: GridColumnPinning;\n onManageColumns?: () => void;\n onClose: () => void;\n anchorEl: HTMLElement | null;\n}\n\nfunction ActiveDotIcon() {\n return (\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"currentColor\">\n <circle cx=\"4\" cy=\"4\" r=\"4\" />\n </svg>\n );\n}\n\nfunction InactiveDotIcon() {\n return (\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <circle cx=\"4\" cy=\"4\" r=\"3\" />\n </svg>\n );\n}\n\nfunction ManageColumnsIcon() {\n return (\n <svg focusable=\"false\" aria-hidden=\"true\" viewBox=\"0 0 24 24\" width=\"13\" height=\"13\" fill=\"none\">\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <rect x=\"8.5\" y=\"4\" width=\"7\" height=\"16\" fill=\"currentColor\" opacity=\"0.3\" />\n <line x1=\"8.5\" y1=\"4\" x2=\"8.5\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <line x1=\"15.5\" y1=\"4\" x2=\"15.5\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <line x1=\"2\" y1=\"9\" x2=\"22\" y2=\"9\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <line x1=\"2\" y1=\"14\" x2=\"22\" y2=\"14\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n </svg>\n );\n}\n\nfunction AscIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"5\" />\n <polyline points=\"5 12 12 5 19 12\" />\n </svg>\n );\n}\n\nfunction DescIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n <polyline points=\"19 12 12 19 5 12\" />\n </svg>\n );\n}\n\nfunction UnsortIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\">\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n );\n}\n\nfunction HideIcon() {\n return (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94\" />\n <path d=\"M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19\" />\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n </svg>\n );\n}\n\nfunction PinLeftIcon() {\n return (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n { }\n <line x1=\"4\" y1=\"2\" x2=\"4\" y2=\"22\" />\n { }\n <polyline points=\"11 8 4 12 11 16\" />\n { }\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n </svg>\n );\n}\n\nfunction PinRightIcon() {\n return (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n { }\n <line x1=\"20\" y1=\"2\" x2=\"20\" y2=\"22\" />\n { }\n <polyline points=\"13 8 20 12 13 16\" />\n { }\n <line x1=\"20\" y1=\"12\" x2=\"4\" y2=\"12\" />\n </svg>\n );\n}\n\nfunction UnpinIcon() {\n return (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"2\" y1=\"2\" x2=\"22\" y2=\"22\" />\n <line x1=\"4\" y1=\"4\" x2=\"4\" y2=\"20\" />\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n </svg>\n );\n}\n\nexport function ColumnMenu({ colDef, sortModel, onSort, onHide, onPin, pinnedColumns, onManageColumns, onClose, anchorEl }: ColumnMenuProps) {\n const menuRef = useRef<HTMLDivElement>(null);\n const [style, setStyle] = useState<React.CSSProperties>({ position: 'fixed', zIndex: 1300, top: 0, left: 0, visibility: 'hidden' });\n\n React.useLayoutEffect(() => {\n if (!anchorEl || !menuRef.current) return;\n\n const anchorRect = anchorEl.getBoundingClientRect();\n const menuRect = menuRef.current.getBoundingClientRect();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const margin = 8;\n\n let left = anchorRect.left;\n if (left + menuRect.width + margin > vw) {\n left = vw - menuRect.width - margin;\n }\n if (left < margin) left = margin;\n\n let top = anchorRect.bottom + 4;\n if (top + menuRect.height + margin > vh) {\n top = anchorRect.top - menuRect.height - 4;\n }\n\n setStyle({ position: 'fixed', zIndex: 1300, top, left, visibility: 'visible' });\n }, [anchorEl]);\n\n\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (\n menuRef.current && !menuRef.current.contains(event.target as Node) &&\n anchorEl && !anchorEl.contains(event.target as Node)\n ) onClose();\n }\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') onClose();\n }\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keydown', handleKey);\n // Close menu on any scroll or resize so it doesn't float detached from its anchor\n window.addEventListener('scroll', onClose, true);\n window.addEventListener('resize', onClose);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keydown', handleKey);\n window.removeEventListener('scroll', onClose, true);\n window.removeEventListener('resize', onClose);\n };\n }, [anchorEl, onClose]);\n\n const handleSort = (direction: GridSortDirection) => { onSort?.(colDef.field, direction); onClose(); };\n const handleHide = () => { onHide?.(colDef.field); onClose(); };\n const handlePin = (side: 'left' | 'right' | null) => { onPin?.(colDef.field, side); onClose(); };\n\n const currentSort = sortModel?.find(item => item.field === colDef.field)?.sort;\n const isUnsorted = currentSort === undefined || currentSort === null;\n\n const isPinnedLeft = pinnedColumns?.left?.includes(colDef.field) ?? false;\n const isPinnedRight = pinnedColumns?.right?.includes(colDef.field) ?? false;\n const isUnpinned = !isPinnedLeft && !isPinnedRight;\n\n const colLabel = colDef.headerName || colDef.field;\n\n return ReactDOM.createPortal(\n <div ref={menuRef} className=\"ogx-column-menu\" style={style} role=\"menu\" aria-label={`Column options for ${colLabel}`}>\n\n { }\n {onSort && colDef.sortable !== false && (\n <>\n <button className={`ogx-menu-item${currentSort === 'asc' ? ' ogx-menu-item--active' : ''}`}\n onClick={() => handleSort('asc')} role=\"menuitemradio\" aria-checked={currentSort === 'asc'}>\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\">{currentSort === 'asc' ? <ActiveDotIcon /> : <InactiveDotIcon />}</span>\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><AscIcon /></span>\n Sort Ascending\n </button>\n <button className={`ogx-menu-item${currentSort === 'desc' ? ' ogx-menu-item--active' : ''}`}\n onClick={() => handleSort('desc')} role=\"menuitemradio\" aria-checked={currentSort === 'desc'}>\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\">{currentSort === 'desc' ? <ActiveDotIcon /> : <InactiveDotIcon />}</span>\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><DescIcon /></span>\n Sort Descending\n </button>\n <button className={`ogx-menu-item${isUnsorted ? ' ogx-menu-item--active' : ''}`}\n onClick={() => handleSort(null)} role=\"menuitemradio\" aria-checked={isUnsorted}>\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\">{isUnsorted ? <ActiveDotIcon /> : <InactiveDotIcon />}</span>\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><UnsortIcon /></span>\n Unsort\n </button>\n <div className=\"ogx-menu-divider\" />\n </>\n )}\n\n { }\n <div className=\"ogx-menu-section-label\" aria-hidden=\"true\">Pin column</div>\n <button className={`ogx-menu-item${isPinnedLeft ? ' ogx-menu-item--active' : ''}`}\n onClick={() => handlePin('left')} role=\"menuitemradio\" aria-checked={isPinnedLeft} aria-label=\"Pin to left\">\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\">{isPinnedLeft ? <ActiveDotIcon /> : <InactiveDotIcon />}</span>\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><PinLeftIcon /></span>\n Pin to Left\n </button>\n <button className={`ogx-menu-item${isPinnedRight ? ' ogx-menu-item--active' : ''}`}\n onClick={() => handlePin('right')} role=\"menuitemradio\" aria-checked={isPinnedRight} aria-label=\"Pin to right\">\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\">{isPinnedRight ? <ActiveDotIcon /> : <InactiveDotIcon />}</span>\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><PinRightIcon /></span>\n Pin to Right\n </button>\n <button className={`ogx-menu-item${isUnpinned ? ' ogx-menu-item--active' : ''}`}\n onClick={() => handlePin(null)} role=\"menuitemradio\" aria-checked={isUnpinned} aria-label=\"Unpin column\">\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\">{isUnpinned ? <ActiveDotIcon /> : <InactiveDotIcon />}</span>\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><UnpinIcon /></span>\n Unpin\n </button>\n <div className=\"ogx-menu-divider\" />\n\n { }\n <button className=\"ogx-menu-item\" onClick={handleHide} role=\"menuitem\" aria-label={`Hide ${colLabel} column`}>\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\" />\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><HideIcon /></span>\n Hide Column\n </button>\n\n <div className=\"ogx-menu-divider\" />\n <button className=\"ogx-menu-item\" onClick={() => { onManageColumns?.(); onClose(); }} role=\"menuitem\" aria-label=\"Manage all columns\">\n <span className=\"ogx-menu-item__indicator\" aria-hidden=\"true\" />\n <span className=\"ogx-menu-item__icon\" aria-hidden=\"true\"><ManageColumnsIcon /></span>\n Manage columns\n </button>\n </div>,\n (anchorEl?.closest('.ogx-theme-provider') || document.body)\n );\n}\n","import React from 'react';\nimport { Checkbox } from '../ui/Checkbox';\nimport { ColumnResizeHandle } from '../ColumnResizeHandle/ColumnResizeHandle';\nimport type { GridColDef, GridRowModel, GridSortDirection, GridColumnPinning, GridAggregationModel, GridColumnGroup, GridColumnGroupingModel } from '../../types';\nimport { isColumnPinned, calculatePinnedPositions } from '../../utils/pinning';\nimport { ColumnMenu } from './ColumnMenu';\n\n\nfunction MenuIcon() {\n return (\n <svg focusable=\"false\" aria-hidden=\"true\" viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"18\" height=\"18\">\n <path d=\"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"></path>\n </svg>\n );\n}\n\nfunction SwapIcon() {\n return (\n <svg focusable=\"false\" aria-hidden=\"true\" viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"currentColor\">\n <path d=\"M6.99 11L3 15l3.99 4v-3H14v-2H6.99v-3zM21 9l-3.99-4v3H10v2h7.01v3L21 9z\"></path>\n </svg>\n );\n}\n\n\n// ─── Group header helpers ─────────────────────────────────────────────────────\n\n/** Collect all leaf field names from a group node (recursive). */\nfunction collectGroupFields(group: GridColumnGroup): string[] {\n const out: string[] = [];\n for (const child of group.children) {\n if (typeof child === 'string') out.push(child);\n else out.push(...collectGroupFields(child));\n }\n return out;\n}\n\n/** Max nesting depth of the group tree (1 = single level). */\nfunction groupTreeDepth(groups: GridColumnGroupingModel): number {\n let d = 0;\n function walk(g: GridColumnGroup, depth: number) {\n d = Math.max(d, depth);\n for (const c of g.children) if (typeof c !== 'string') walk(c, depth + 1);\n }\n groups.forEach(g => walk(g, 1));\n return d;\n}\n\ninterface GroupCell { key: string; label: string; width: number; isGroup: boolean; }\n\n/**\n * Builds the flat array of GroupCell descriptors for one row (level).\n * level 0 = top-most group row.\n * allFields is the ORDERED list of all visible columns (including spacers).\n */\nfunction buildGroupRow(\n groups: GridColumnGroupingModel,\n allFields: { field: string; width: number }[],\n level: number,\n): GroupCell[] {\n // Map each field → the group that owns it at `level`\n function findAtLevel(g: GridColumnGroup, field: string, cur: number): GridColumnGroup | null {\n if (!collectGroupFields(g).includes(field)) return null;\n if (cur === level) return g;\n for (const child of g.children) {\n if (typeof child !== 'string') {\n const found = findAtLevel(child, field, cur + 1);\n if (found) return found;\n }\n }\n return null;\n }\n\n const fieldGroup = new Map<string, GridColumnGroup | null>();\n for (const f of allFields) {\n let found: GridColumnGroup | null = null;\n for (const g of groups) {\n found = findAtLevel(g, f.field, 0);\n if (found) break;\n }\n fieldGroup.set(f.field, found);\n }\n\n const cells: GroupCell[] = [];\n let i = 0;\n while (i < allFields.length) {\n const item = allFields[i];\n const group = fieldGroup.get(item.field) ?? null;\n const w = item.width;\n\n if (!group) {\n cells.push({ key: `fg-${item.field}-${level}`, label: '', width: w, isGroup: false });\n i++;\n } else {\n let totalW = 0;\n let j = i;\n while (j < allFields.length && fieldGroup.get(allFields[j].field) === group) {\n totalW += allFields[j].width;\n j++;\n }\n cells.push({ key: `${group.groupId}-${level}`, label: group.headerName, width: totalW, isGroup: true });\n i = j;\n }\n }\n return cells;\n}\n\n// ─── Props ────────────────────────────────────────────────────────────────────\n\nexport interface HeaderProps<R extends GridRowModel = GridRowModel> {\n columns: GridColDef<R>[];\n allColumns?: GridColDef<R>[];\n columnGroupingModel?: GridColumnGroupingModel;\n checkboxSelection?: boolean;\n allSelected?: boolean;\n someSelected?: boolean;\n onSelectAll?: (isSelected: boolean) => void;\n onSort?: (field: string, direction: GridSortDirection) => void;\n sortModel?: Array<{ field: string; sort: 'asc' | 'desc' }>;\n onColumnResize?: (field: string, newWidth: number) => void;\n columnWidths?: Record<string, number>;\n pinnedColumns?: GridColumnPinning;\n hasDetailPanel?: boolean;\n pinCheckboxColumn?: boolean;\n pinExpandColumn?: boolean;\n rowReordering?: boolean;\n aggregationModel?: GridAggregationModel;\n\n draggedColumn?: string | null;\n dragOverColumn?: string | null;\n onDragStart?: (field: string) => (event: React.DragEvent) => void;\n onDragOver?: (field: string) => (event: React.DragEvent) => void;\n onDragEnd?: () => void;\n onDrop?: (targetField: string) => (event: React.DragEvent) => void;\n focusedCell?: { id: string | number; field: string } | null;\n onHeaderClick?: (field: string) => void;\n onHideColumn?: (field: string) => void;\n onPinColumn?: (field: string, side: 'left' | 'right' | null) => void;\n onManageColumns?: () => void;\n}\n\nexport function Header<R extends GridRowModel = GridRowModel>(props: HeaderProps<R>) {\n const {\n columns,\n allColumns,\n columnGroupingModel,\n checkboxSelection = false,\n allSelected = false,\n someSelected = false,\n onSelectAll,\n onSort,\n sortModel = [],\n onColumnResize,\n columnWidths = {},\n pinnedColumns,\n hasDetailPanel = false,\n pinCheckboxColumn = true,\n pinExpandColumn = true,\n rowReordering = false,\n aggregationModel,\n draggedColumn,\n dragOverColumn,\n onDragStart,\n onDragOver,\n onDragEnd,\n onDrop,\n focusedCell,\n onHeaderClick,\n onHideColumn,\n onPinColumn,\n onManageColumns,\n } = props;\n\n const cellRefs = React.useRef<Record<string, HTMLElement | null>>({});\n const [menuOpenParams, setMenuOpenParams] = React.useState<{ colDef: GridColDef<R>; anchorEl: HTMLElement } | null>(null);\n\n const handleMenuOpen = (colDef: GridColDef<R>) => (event: React.MouseEvent) => {\n event.stopPropagation();\n setMenuOpenParams({ colDef, anchorEl: event.currentTarget as HTMLElement });\n };\n\n const handleMenuClose = () => {\n setMenuOpenParams(null);\n };\n\n React.useLayoutEffect(() => {\n if (focusedCell?.id === 'HEADER') {\n const element = cellRefs.current[focusedCell.field];\n if (element) {\n element.focus();\n }\n }\n }, [focusedCell]);\n\n const handleColumnClick = (colDef: GridColDef<R>) => () => {\n if (colDef.sortable === false || !onSort) return;\n\n const currentSort = sortModel.find(item => item.field === colDef.field);\n let newDirection: GridSortDirection = 'asc';\n\n if (currentSort) {\n if (currentSort.sort === 'asc') {\n newDirection = 'desc';\n } else {\n newDirection = null;\n }\n }\n\n onSort(colDef.field, newDirection);\n };\n\n const getSortIcon = (field: string) => {\n const sortItem = sortModel.find(item => item.field === field);\n if (!sortItem) return null;\n\n return (\n <span className={`ogx__sort-icon ogx__sort-icon--${sortItem.sort}`} aria-hidden=\"true\" />\n );\n };\n\n const pinnedPositions = React.useMemo(() => {\n return calculatePinnedPositions(\n columns,\n columnWidths,\n pinnedColumns,\n checkboxSelection,\n pinCheckboxColumn,\n hasDetailPanel,\n pinExpandColumn,\n rowReordering\n );\n }, [columns, columnWidths, pinnedColumns, checkboxSelection, pinCheckboxColumn, hasDetailPanel, pinExpandColumn, rowReordering]);\n\n const groupDepth = columnGroupingModel ? groupTreeDepth(columnGroupingModel) : 0;\n\n // All non-spacer fields in order (for group-span math) with their effective physical width\n const allCols = allColumns ?? columns;\n const allLeafFields = allCols\n .filter(c => !(c as any).isSpacer)\n .map(c => ({\n field: c.field,\n width: columnWidths[c.field] ?? c.width ?? 100\n }));\n\n // --- CHECKBOX / DETAIL / REORDER prefix width (for group filler) ---\n const CHECKBOX_W = 48;\n const REORDER_W = 48;\n const EXPAND_W = 48;\n const prefixWidth =\n (rowReordering ? REORDER_W : 0) +\n (hasDetailPanel ? EXPAND_W : 0) +\n (checkboxSelection ? CHECKBOX_W : 0);\n\n return (\n // Outer sticky wrapper — both group rows AND column header row live here\n // so they ALL stay sticky together and scroll horizontally as one unit.\n <div className=\"ogx__header-wrap\">\n {/* ── Group header rows ── */}\n {groupDepth > 0 && Array.from({ length: groupDepth }, (_, level) => {\n const row = buildGroupRow(\n columnGroupingModel!,\n allLeafFields,\n level,\n );\n return (\n <div key={`ogx-grp-${level}`} className=\"ogx-col-group-row\" role=\"row\">\n {/* Filler for checkbox / reorder / detailPanel prefix */}\n {prefixWidth > 0 && (\n <div\n className=\"ogx-col-group-cell ogx-col-group-cell--filler\"\n style={{ width: prefixWidth, minWidth: prefixWidth, flexShrink: 0 }}\n role=\"columnheader\"\n />\n )}\n {row.map(cell => (\n <div\n key={cell.key}\n role=\"columnheader\"\n className={`ogx-col-group-cell ${cell.isGroup ? 'ogx-col-group-cell--group' : 'ogx-col-group-cell--filler'}`}\n style={{ width: cell.width, minWidth: cell.width, flexShrink: 0 }}\n title={cell.isGroup ? cell.label : undefined}\n >\n {cell.isGroup && (\n <span className=\"ogx-col-group-cell__label\">{cell.label}</span>\n )}\n </div>\n ))}\n </div>\n );\n })}\n\n {/* ── Column header row ── */}\n <div className=\"ogx__header\" role=\"row\">\n { }\n {rowReordering && (\n <div\n className=\"ogx__header-cell ogx__header-cell--pinned ogx__header-cell--pinned-left\"\n role=\"columnheader\"\n aria-label=\"Row reorder handle\"\n title=\"Drag to reorder rows\"\n style={{\n minWidth: 48,\n maxWidth: 48,\n position: 'sticky',\n left: 0,\n zIndex: 4\n }}\n />\n )}\n\n { }\n {hasDetailPanel && (\n <div\n className={`ogx__header-cell ogx__header-cell--expand ${pinExpandColumn ? 'ogx__header-cell--pinned ogx__header-cell--pinned-left' : ''\n }`}\n role=\"columnheader\"\n aria-label=\"Expand row details\"\n style={{\n minWidth: 48,\n maxWidth: 48,\n position: pinExpandColumn ? 'sticky' : undefined,\n left: pinExpandColumn ? (rowReordering ? 48 : 0) : undefined,\n zIndex: pinExpandColumn ? 5 : undefined\n }}\n >\n { }\n </div>\n )}\n\n { }\n {checkboxSelection && (\n <div\n className={`ogx__header-cell ogx__header-cell--checkbox ${pinCheckboxColumn ? 'ogx__header-cell--pinned ogx__header-cell--pinned-left' : ''\n }`}\n role=\"columnheader\"\n style={{\n position: pinCheckboxColumn ? 'sticky' : undefined,\n left: pinCheckboxColumn ? ((rowReordering ? 48 : 0) + (hasDetailPanel && pinExpandColumn ? 48 : 0)) : undefined,\n\n }}\n >\n <Checkbox\n id=\"ogx-select-all\"\n name=\"ogx-select-all\"\n checked={allSelected}\n indeterminate={someSelected}\n onChange={(e) => onSelectAll?.(e.target.checked)}\n aria-label={allSelected ? 'Deselect all rows' : 'Select all rows'}\n tabIndex={focusedCell?.id === 'HEADER' && focusedCell.field === '__checkbox_col__' ? 0 : -1}\n onMouseDown={(e) => e.preventDefault()}\n inputRef={(el) => { cellRefs.current['__checkbox_col__'] = el; }}\n />\n </div>\n )}\n\n {columns.map((colDef, index) => {\n if ((colDef as any).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 any, colIndex: index })\n : colDef.headerName || colDef.field;\n\n const handleHeaderClick = (e: React.MouseEvent) => {\n if ((e.target as HTMLElement).closest('.ogx-column-resize-handle')) {\n e.stopPropagation();\n return;\n }\n onHeaderClick?.(colDef.field);\n if (isSortable) {\n handleColumnClick(colDef)();\n }\n };\n\n const handleDragStart = onDragStart ? onDragStart(colDef.field) : undefined;\n const handleDragOver = onDragOver ? onDragOver(colDef.field) : undefined;\n const handleDrop = onDrop ? onDrop(colDef.field) : undefined;\n\n return (\n <div\n key={colDef.field}\n className={classNames}\n style={style}\n onClick={handleHeaderClick}\n role=\"columnheader\"\n draggable={!!onDragStart}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDragEnd={onDragEnd}\n onDrop={handleDrop}\n aria-sort={\n isSortable\n ? (isSorted\n ? sortModel.find(item => item.field === colDef.field)?.sort === 'asc'\n ? 'ascending'\n : 'descending'\n : 'none')\n : undefined\n }\n aria-colindex={index + 1 + (checkboxSelection ? 1 : 0)}\n data-field={colDef.field}\n tabIndex={-1}\n ref={(el) => { cellRefs.current[colDef.field] = el; }}\n >\n <div className=\"ogx__header-cell-content\">\n {isDragging && (\n <div className=\"ogx__header-drag-icon\">\n <SwapIcon />\n </div>\n )}\n <div className=\"ogx__header-cell-title-wrapper\">\n <span className=\"ogx__header-cell-title\">\n {headerContent}\n </span>\n {aggregationModel && aggregationModel[colDef.field] && (\n <span className=\"ogx__header-cell-aggregation\">\n {aggregationModel[colDef.field]}\n </span>\n )}\n </div>\n {isSortable && getSortIcon(colDef.field)}\n {!colDef.disableColumnMenu && (\n <button\n className=\"ogx__menu-icon-btn\"\n onClick={handleMenuOpen(colDef)}\n aria-label={`Open column menu for ${colDef.headerName || colDef.field}`}\n aria-haspopup=\"menu\"\n tabIndex={-1}\n >\n <MenuIcon />\n </button>\n )}\n </div>\n\n { }\n {isResizable && onColumnResize && (\n <ColumnResizeHandle\n field={colDef.field}\n currentWidth={effectiveWidth}\n onResize={onColumnResize}\n minWidth={colDef.minWidth}\n maxWidth={colDef.maxWidth}\n />\n )}\n </div>\n );\n })}\n\n {menuOpenParams && (\n <ColumnMenu\n colDef={menuOpenParams.colDef}\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","import { useEffect, useRef, useState } from 'react';\nimport type { GridRenderCellParams } from '../../types';\n\nexport interface GridEditInputCellProps extends GridRenderCellParams {\n onValueChange: (value: any) => 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(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={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(value ?? '');\n const ref = useRef<HTMLInputElement>(null);\n useEffect(() => { ref.current?.focus(); }, []);\n\n return (\n <input\n ref={ref}\n type=\"date\"\n className=\"ogx__edit-input\"\n value={local}\n onChange={e => { setLocal(e.target.value); onValueChange(e.target.value); }}\n onBlur={onCommit}\n onKeyDown={e => {\n if (e.key === 'Enter') { e.stopPropagation(); onCommit(); }\n if (e.key === 'Escape') { e.stopPropagation(); onCancel(); }\n }}\n />\n );\n}\n\n// ─── Router ───────────────────────────────────────────────────────────────────\nexport function GridEditInputCell(props: GridEditInputCellProps) {\n const { colDef } = props;\n\n switch (colDef.type) {\n case 'number':\n return <div className=\"ogx__edit-cell\"><NumberEditor {...props} /></div>;\n case 'boolean':\n return <div className=\"ogx__edit-cell\"><BooleanEditor {...props} /></div>;\n case 'singleSelect':\n return <div className=\"ogx__edit-cell\"><SelectEditor {...props} /></div>;\n case 'date':\n return <div className=\"ogx__edit-cell\"><DateEditor {...props} /></div>;\n default:\n return <div className=\"ogx__edit-cell\"><TextEditor {...props} /></div>;\n }\n}\n","\nimport React from 'react';\nimport type { GridColDef, GridRowModel, GridPinnedPosition, GridCellParams } from '../../types';\nimport type { CellColSpanInfo } from '../../hooks/features/useGridSpanning';\n\nimport { GridEditInputCell } from './GridEditInputCell';\n\nexport interface CellProps<R extends GridRowModel = GridRowModel> {\n onCellClick?: (params: GridCellParams<R>) => void;\n onCellEditStart?: (field: string, value: any) => void;\n onCellValueChange?: (field: string, newValue: any) => void;\n value: any;\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: any) => void;\n\n colSpanInfo?: CellColSpanInfo;\n rowSpan?: number;\n isHiddenByRowSpan?: boolean;\n}\n\nfunction CellImpl<R extends GridRowModel = GridRowModel>(props: CellProps<R>) {\n const {\n onCellClick,\n onCellEditStart,\n onCellValueChange,\n value,\n row,\n colDef,\n rowIndex,\n colIndex,\n isSelected,\n onClick,\n width,\n pinnedPosition,\n pinnedOffset,\n isFocused,\n isFocusVisible,\n isEditable,\n isEditing,\n onEditStart,\n onEditStop,\n onValueChange,\n\n colSpanInfo,\n rowSpan: rowSpanProp,\n isHiddenByRowSpan\n } = props;\n\n if (colSpanInfo?.spannedByColSpan) {\n\n return null;\n }\n\n if (isHiddenByRowSpan) {\n\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 e.stopPropagation();\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 handleValueChange = React.useCallback((newValue: any) => {\n if (onCellValueChange) {\n onCellValueChange(colDef.field, newValue);\n } else {\n onValueChange?.(newValue);\n }\n }, [onCellValueChange, onValueChange, colDef.field]);\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 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 // Render custom cell content OR Edit Content\n const cellContent = React.useMemo(() => {\n if (isEditing && (onCellValueChange || onValueChange) && onEditStop) {\n if (colDef.renderEditCell) {\n return colDef.renderEditCell({\n value,\n row,\n field: colDef.field,\n colDef: colDef as any,\n rowIndex,\n colIndex\n });\n }\n return (\n <GridEditInputCell\n value={value}\n row={row}\n field={colDef.field}\n colDef={colDef as any}\n rowIndex={rowIndex}\n colIndex={colIndex}\n onValueChange={handleValueChange}\n onCommit={() => onEditStop()}\n onCancel={() => onEditStop(true)}\n />\n );\n }\n\n if (colDef.renderCell) {\n return colDef.renderCell({\n value,\n row,\n field: colDef.field,\n colDef: colDef as any,\n rowIndex,\n colIndex\n });\n }\n\n return formattedValue;\n }, [value, row, colDef, rowIndex, colIndex, formattedValue, isEditing, handleValueChange, onEditStop, onCellValueChange, onValueChange]);\n\n const isPinned = pinnedPosition !== null && pinnedPosition !== undefined;\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: colDef as any, rowIndex, colIndex }) || '';\n }\n return colDef.cellClassName;\n }, [colDef, value, row, rowIndex, colIndex]);\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 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 return (\n <div\n ref={cellRef}\n className={classNames}\n style={style}\n onClick={handleClick}\n onDoubleClick={handleDoubleClick}\n role=\"gridcell\"\n aria-colindex={colIndex + 1}\n aria-readonly={!isEditable || undefined}\n tabIndex={-1}\n data-field={colDef.field}\n data-colindex={colIndex}\n {...(colSpan > 1 ? { 'aria-colspan': colSpan } : {})}\n {...(rowSpan > 1 ? { 'aria-rowspan': rowSpan } : {})}\n >\n <div className=\"ogx__cell-content\">\n {cellContent}\n </div>\n </div>\n );\n}\n\nexport const Cell = React.memo(CellImpl) as typeof CellImpl;\n","\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 React from 'react';\n\nexport interface DragHandleIconProps extends React.ButtonHTMLAttributes<HTMLButtonElement> { }\n\nexport const DragHandleIcon: React.FC<DragHandleIconProps> = ({ className = '', ...props }) => {\n return (\n <button\n type=\"button\"\n className={`ogx-drag-handle ${className}`}\n aria-label=\"Drag to reorder row\"\n {...props}\n >\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M11 18c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2zm-2-8c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm6 4c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\" />\n </svg>\n </button>\n );\n};\n","\nimport React from 'react';\nimport type { GridRowModel, GridRowId, GridDetailPanelHeight } from '../../types';\n\n\nexport interface DetailPanelProps<R extends GridRowModel = GridRowModel> {\n row: R;\n rowId: GridRowId;\n rowIndex: number;\n content: React.ReactNode;\n height: GridDetailPanelHeight;\n isExpanded: boolean;\n}\n\nexport function DetailPanel<R extends GridRowModel = GridRowModel>(props: DetailPanelProps<R>) {\n const { content, height, isExpanded } = props;\n\n if (!isExpanded) {\n return null;\n }\n\n const style: React.CSSProperties = {\n height: height === 'auto' ? 'auto' : `${height}px`,\n overflow: height === 'auto' ? 'visible' : 'auto'\n };\n\n return (\n <div className=\"ogx__detail-panel\" style={style}>\n <div className=\"ogx__detail-panel-content\">\n {content}\n </div>\n </div>\n );\n}\n","\nimport React from 'react';\nimport { Cell } from '../Cell/Cell';\nimport { Checkbox } from '../ui/Checkbox';\nimport { ExpandIcon } from '../ui/ExpandIcon';\nimport { DragHandleIcon } from '../ui/DragHandleIcon';\nimport { DetailPanel } from '../DetailPanel/DetailPanel';\nimport type { GridRowModel, GridColDef, GridRowId, GridColumnPinning, GridRowPinning, GridRowParams, GridCellParams, GridDetailPanelHeight } from '../../types';\nimport type { CellColSpanInfo, RowSpanningCaches } from '../../hooks/features/useGridSpanning';\nimport { isColumnPinned, calculatePinnedPositions, isRowPinned } from '../../utils/pinning';\n\n\nexport interface RowProps<R extends GridRowModel = GridRowModel> {\n row: R;\n columns: GridColDef<R>[];\n rowIndex: number;\n isSelected?: boolean;\n checkboxSelection?: boolean;\n onRowClick?: (params: GridRowParams<R>) => void;\n onCellClick?: (params: GridCellParams<R>) => void;\n onSelectionChange?: (rowId: GridRowId, isSelected: boolean) => void;\n columnWidths?: Record<string, number>;\n pinnedColumns?: GridColumnPinning;\n pinnedRows?: GridRowPinning;\n\n hasDetailPanel?: boolean;\n isDetailPanelExpanded?: boolean;\n onDetailPanelToggle?: (rowId: GridRowId) => void;\n detailPanelContent?: React.ReactNode;\n detailPanelHeight?: GridDetailPanelHeight;\n\n pinCheckboxColumn?: boolean;\n pinExpandColumn?: boolean;\n\n rowReordering?: boolean;\n onDragStart?: (id: GridRowId) => (event: React.DragEvent) => void;\n onDragOver?: (id: GridRowId) => (event: React.DragEvent) => void;\n onDragEnd?: () => void;\n onDrop?: (targetId: GridRowId) => (event: React.DragEvent) => void;\n isDragging?: boolean;\n isDragOver?: boolean;\n\n editingCell?: { id: GridRowId; field: string; value: any; } | null;\n onEditStart?: (params: { id: GridRowId, field: string, value: any }) => void;\n onEditStop?: (params?: { cancel?: boolean }) => void;\n onEditCellValueChange?: (params: { id: GridRowId, field: string, value: any }) => void;\n\n focusedCellField?: string | null;\n isFocusVisible?: boolean;\n\n colspanMap?: Map<GridRowId, Record<string, CellColSpanInfo>>;\n rowSpanningCaches?: RowSpanningCaches;\n rowHeight?: number;\n}\n\nexport function Row<R extends GridRowModel = GridRowModel>(props: RowProps<R>) {\n const {\n row,\n columns,\n rowIndex,\n isSelected = false,\n checkboxSelection = false,\n onRowClick,\n onCellClick,\n onSelectionChange,\n columnWidths = {},\n pinnedColumns,\n pinnedRows,\n hasDetailPanel = false,\n isDetailPanelExpanded = false,\n onDetailPanelToggle,\n detailPanelContent,\n detailPanelHeight = 200,\n pinCheckboxColumn = true,\n pinExpandColumn = true,\n rowReordering = false,\n onDragStart,\n onDragOver,\n onDragEnd,\n onDrop,\n isDragging,\n isDragOver,\n\n editingCell,\n onEditStart,\n onEditStop,\n onEditCellValueChange,\n\n focusedCellField,\n isFocusVisible,\n\n colspanMap,\n rowSpanningCaches,\n rowHeight = 52\n } = props;\n\n const expandCellRef = React.useRef<HTMLDivElement>(null);\n const checkboxCellRef = React.useRef<HTMLDivElement>(null);\n\n // ── Skeleton row (shown during infinite-scroll fetch) ─────────────────────\n if ((row as any)._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 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 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 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 rowPinnedPosition = isRowPinned(row.id, pinnedRows);\n const isRowPinnedTop = rowPinnedPosition === 'top';\n const isRowPinnedBottom = rowPinnedPosition === 'bottom';\n\n const isGroupRow = (row as any)._hasChildren === true;\n\n const handleCellEditStart = React.useCallback((field: string, value: any) => {\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: any) => {\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 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 any,\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 any,\n rowIndex,\n colIndex: -1\n });\n }}\n >\n <Checkbox\n id={`ogx-select-row-${row.id}`}\n name={`ogx-select-row-${row.id}`}\n checked={isSelected}\n onChange={handleCheckboxChange}\n onClick={(e) => e.stopPropagation()}\n aria-label={isSelected ? `Deselect row ${row.id}` : `Select row ${row.id}`}\n tabIndex={-1}\n onMouseDown={(e) => e.preventDefault()}\n />\n </div>\n )}\n\n { }\n {columns.map((colDef, colIndex) => {\n if ((colDef as any).isSpacer) {\n return (\n <div\n key={colDef.field}\n style={{ width: colDef.width, minWidth: colDef.width, flexShrink: 0 }}\n aria-hidden=\"true\"\n />\n );\n }\n const value = colDef.valueGetter\n ? colDef.valueGetter({ row, field: colDef.field, value: row[colDef.field] })\n : row[colDef.field];\n\n const effectiveWidth = columnWidths[colDef.field] ?? colDef.width;\n\n const pinnedPosition = isColumnPinned(colDef.field, pinnedColumns);\n const pinnedOffset = pinnedPosition ? pinnedPositions[colDef.field] : undefined;\n\n const isEditing = editingCell?.id === row.id && editingCell?.field === colDef.field;\n\n const cellValue = isEditing ? editingCell?.value : value;\n\n const colSpanInfo = colspanMap?.get(row.id)?.[colDef.field];\n const rowSpan = rowSpanningCaches?.spannedCells[row.id]?.[colDef.field];\n const isHiddenByRowSpan = rowSpanningCaches?.hiddenCells[row.id]?.[colDef.field] || false;\n\n return (\n <Cell\n key={colDef.field}\n value={cellValue}\n row={row}\n colDef={colDef}\n rowIndex={rowIndex}\n colIndex={colIndex}\n isSelected={isSelected}\n onCellClick={onCellClick}\n width={effectiveWidth}\n pinnedPosition={pinnedPosition}\n pinnedOffset={pinnedOffset}\n\n isFocused={focusedCellField === colDef.field}\n isFocusVisible={isFocusVisible}\n\n isEditable={colDef.editable}\n isEditing={isEditing}\n onCellEditStart={handleCellEditStart}\n onEditStop={handleEditStopWrapper}\n onCellValueChange={handleCellValueChange}\n\n colSpanInfo={colSpanInfo}\n rowSpan={rowSpan}\n isHiddenByRowSpan={isHiddenByRowSpan}\n />\n );\n })}\n </div>\n\n { }\n {hasDetailPanel && (\n <DetailPanel\n row={row}\n rowId={row.id}\n rowIndex={rowIndex}\n content={detailPanelContent}\n height={detailPanelHeight}\n isExpanded={isDetailPanelExpanded}\n />\n )}\n </>\n );\n}\n","import React from 'react';\n\n\ninterface SkeletonRowProps {\n columns: any[];\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 = 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","\nimport React from 'react';\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: 'text' | 'outlined' | 'contained';\n size?: 'small' | 'medium' | 'large';\n color?: 'primary' | 'secondary' | 'default';\n disabled?: boolean;\n children: React.ReactNode;\n}\n\nexport const Button: React.FC<ButtonProps> = ({\n variant = 'text',\n size = 'medium',\n color = 'default',\n disabled = false,\n className = '',\n children,\n ...props\n}) => {\n const classNames = [\n 'ogx-button',\n `ogx-button--${variant}`,\n `ogx-button--${size}`,\n `ogx-button--${color}`,\n disabled && 'ogx-button--disabled',\n className\n ].filter(Boolean).join(' ');\n\n return (\n <button\n className={classNames}\n disabled={disabled}\n {...props}\n >\n {children}\n </button>\n );\n};\n","\nimport React from 'react';\nimport { Button } from '../ui/Button';\n\nexport interface PaginationProps {\n page: number;\n pageSize: number;\n rowCount: number;\n onPageChange: (page: number) => void;\n onPageSizeChange: (pageSize: number) => void;\n pageSizeOptions?: number[];\n showFirstButton?: boolean;\n showLastButton?: boolean;\n}\n\nexport function Pagination(props: PaginationProps) {\n const {\n page,\n pageSize,\n rowCount,\n onPageChange,\n onPageSizeChange,\n pageSizeOptions = [10, 25, 50, 100],\n showFirstButton = true,\n showLastButton = true\n } = props;\n\n const pageCount = Math.max(1, Math.ceil(rowCount / pageSize));\n const currentPage = Math.min(page, pageCount - 1);\n\n const firstRowIndex = currentPage * pageSize;\n const lastRowIndex = Math.min(firstRowIndex + pageSize, rowCount);\n const displayedRows = rowCount === 0 ? 0 : `${firstRowIndex + 1}–${lastRowIndex}`;\n\n const handleFirstPage = () => {\n onPageChange(0);\n };\n\n const handlePreviousPage = () => {\n onPageChange(Math.max(0, currentPage - 1));\n };\n\n const handleNextPage = () => {\n onPageChange(Math.min(pageCount - 1, currentPage + 1));\n };\n\n const handleLastPage = () => {\n onPageChange(pageCount - 1);\n };\n\n const handlePageSizeChange = (event: React.ChangeEvent<HTMLSelectElement>) => {\n const newPageSize = parseInt(event.target.value, 10);\n onPageSizeChange(newPageSize);\n\n };\n\n const isFirstPage = currentPage === 0;\n const isLastPage = currentPage >= pageCount - 1;\n\n return (\n <div className=\"ogx-pagination\" role=\"navigation\" aria-label=\"Pagination\">\n { }\n <div className=\"ogx-pagination__page-size\">\n <label htmlFor=\"page-size-select\" className=\"ogx-pagination__label\">\n Rows per page:\n </label>\n <select\n id=\"page-size-select\"\n className=\"ogx-pagination__select\"\n value={pageSize}\n onChange={handlePageSizeChange}\n aria-label=\"Rows per page\"\n >\n {pageSizeOptions.map(option => (\n <option key={option} value={option}>\n {option}\n </option>\n ))}\n </select>\n </div>\n\n { }\n <div className=\"ogx-pagination__info\" aria-live=\"polite\" aria-atomic=\"true\">\n {displayedRows} of {rowCount}\n </div>\n\n { }\n <div className=\"ogx-pagination__actions\">\n {showFirstButton && (\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={handleFirstPage}\n disabled={isFirstPage}\n aria-label=\"Go to first page\"\n title=\"First page\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M18.41 16.59L13.82 12l4.59-4.59L17 6l-6 6 6 6zM6 6h2v12H6z\" />\n </svg>\n </Button>\n )}\n\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={handlePreviousPage}\n disabled={isFirstPage}\n aria-label=\"Go to previous page\"\n title=\"Previous page\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\" />\n </svg>\n </Button>\n\n <div className=\"ogx-pagination__page-info\" aria-current=\"page\">\n Page {currentPage + 1} of {pageCount}\n </div>\n\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={handleNextPage}\n disabled={isLastPage}\n aria-label=\"Go to next page\"\n title=\"Next page\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" />\n </svg>\n </Button>\n\n {showLastButton && (\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={handleLastPage}\n disabled={isLastPage}\n aria-label=\"Go to last page\"\n title=\"Last page\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M5.59 7.41L10.18 12l-4.59 4.59L7 18l6-6-6-6zM16 6h2v12h-2z\" />\n </svg>\n </Button>\n )}\n </div>\n </div>\n );\n}\n","\nimport { useReducer, useCallback, useMemo, useRef, useEffect } from 'react';\nimport type {\n 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_SCROLL'; payload: { scrollTop: number; scrollLeft: number } }\n | { type: 'SET_DIMENSIONS'; payload: { viewportWidth: number; viewportHeight: number } }\n | { type: 'SET_DATASOURCE_LOADING'; payload: boolean }\n | { type: 'SET_DATASOURCE_ERROR'; payload: any }\n | { type: 'SET_ROW_COUNT'; payload: number };\n\nfunction createInitialState(rows: GridRowModel[], columns: GridColDef[], columnVisibilityModel: GridColumnVisibilityModel = {}): GridState {\n const idRowsLookup = new Map<GridRowId, GridRowModel>();\n const allRows: GridRowId[] = [];\n\n rows.forEach(row => {\n const id = row.id;\n idRowsLookup.set(id, row);\n allRows.push(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);\n orderedFields.push(col.field);\n });\n\n return {\n rows: {\n idRowsLookup,\n allRows\n },\n columns: {\n all: columns,\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 scrollTop: 0,\n scrollLeft: 0\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: {}\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_SCROLL':\n return {\n ...state,\n virtualization: {\n ...state.virtualization,\n scrollTop: action.payload.scrollTop,\n scrollLeft: action.payload.scrollLeft\n }\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 = useMemo(\n () => createInitialState(rows, columns as any, columnVisibilityModel),\n [] \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) as any,\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 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 setScroll = useCallback((scrollTop: number, scrollLeft: number) => {\n dispatch({ type: 'SET_SCROLL', payload: { scrollTop, scrollLeft } });\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: any) => {\n dispatch({ type: 'SET_DATASOURCE_ERROR', payload: error });\n }, []);\n\n const setRowCount = useCallback((count: number) => {\n dispatch({ type: 'SET_ROW_COUNT', payload: count });\n }, []);\n\n const apiRef = useRef<GridApi>({\n getRow: (id: GridRowId) => stateRef.current.rows.idRowsLookup.get(id) || null,\n getAllRows: () => Array.from(stateRef.current.rows.idRowsLookup.values()),\n getVisibleRows: () => Array.from(stateRef.current.rows.idRowsLookup.values()),\n getAggregationResult: () => null,\n getAggregationModel: () => null,\n getColumn: (field: string) => stateRef.current.columns.lookup.get(field) || null,\n getAllColumns: () => stateRef.current.columns.all,\n getVisibleColumns: () => stateRef.current.columns.all,\n selectRow: (id: GridRowId, isSelected = true) => {\n const newSelection = new Set(stateRef.current.selection.selectedRows);\n if (isSelected) {\n newSelection.add(id);\n } else {\n newSelection.delete(id);\n }\n setSelection(newSelection);\n },\n selectRows: (ids: GridRowId[], isSelected = true) => {\n const newSelection = new Set(stateRef.current.selection.selectedRows);\n ids.forEach(id => {\n if (isSelected) {\n newSelection.add(id);\n } else {\n newSelection.delete(id);\n }\n });\n setSelection(newSelection);\n },\n getSelectedRows: () => Array.from(stateRef.current.selection.selectedRows),\n sortColumn: (field: string, direction) => {\n if (direction === null) {\n setSortModel(stateRef.current.sorting.sortModel.filter(item => item.field !== field));\n } else {\n const existingIndex = stateRef.current.sorting.sortModel.findIndex(item => item.field === field);\n if (existingIndex >= 0) {\n const newModel = [...stateRef.current.sorting.sortModel];\n newModel[existingIndex] = { field, sort: direction };\n setSortModel(newModel);\n } else {\n setSortModel([...stateRef.current.sorting.sortModel, { field, sort: direction }]);\n }\n }\n },\n getSortModel: () => stateRef.current.sorting.sortModel,\n setFilterModel,\n getFilterModel: () => stateRef.current.filter.filterModel,\n setPage: (page: number) => {\n setPaginationModel({ ...stateRef.current.pagination.paginationModel, page });\n },\n setPageSize: (pageSize: number) => {\n setPaginationModel({ ...stateRef.current.pagination.paginationModel, pageSize, page: 0 });\n },\n scrollToIndexes: () => {\n\n },\n copySelectedRows: () => Promise.resolve()\n });\n\n return {\n state,\n dispatch,\n apiRef,\n setRows,\n setColumns,\n setSortModel,\n setFilterModel,\n setPaginationModel,\n setSelection,\n setScroll,\n setDimensions,\n setDataSourceLoading,\n setDataSourceError,\n setRowCount\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 any,\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","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","\nimport type { GridRowModel, GridFilterItem, GridFilterModel, GridFilterGroup } from '../../types';\n\nexport const FILTER_OPERATORS = {\n contains: (value: any, filterValue: any): boolean => {\n if (value == null || filterValue == null) return false;\n return String(value).toLowerCase().includes(String(filterValue).toLowerCase());\n },\n\n equals: (value: any, filterValue: any): 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: any, filterValue: any): boolean => {\n if (value == null || filterValue == null) return false;\n return String(value).toLowerCase().startsWith(String(filterValue).toLowerCase());\n },\n\n endsWith: (value: any, filterValue: any): boolean => {\n if (value == null || filterValue == null) return false;\n return String(value).toLowerCase().endsWith(String(filterValue).toLowerCase());\n },\n\n isEmpty: (value: any): boolean => {\n return value == null || String(value).trim() === '';\n },\n\n isNotEmpty: (value: any): boolean => {\n return value != null && String(value).trim() !== '';\n },\n\n '>': (value: any, filterValue: any): 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: any, filterValue: any): 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: any, filterValue: any): 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: any, filterValue: any): 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: any, filterValue: any): 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: any, filterValue: any[]): 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: any, filterValue: any): 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: any, filterValue: any): 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: any, filterValue: any): 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(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 as any).items || [];\n const logicOperator = (filterModel as any).logicOperator || 'and';\n const quickFilterValues = (filterModel as any).quickFilterValues || [];\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: any, b: any, 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, useState, useCallback, useEffect } from 'react';\nimport { GridRowModel, GridRowId, GridTreeNode, GridFilterModel, GridSortItem } from '../types';\nimport { isRowMatchingFilter } from '../utils/filtering';\nimport { compareValues } from '../utils/sorting';\n\ninterface UseTreeDataProps<R extends GridRowModel> {\n rows: R[];\n getRowId: (row: R) => GridRowId;\n getTreeDataPath?: (row: R) => string[];\n treeData?: boolean;\n defaultGroupingExpansionDepth?: number;\n filterModel?: GridFilterModel;\n sortModel?: GridSortItem[];\n onRowExpansionChange?: (node: GridTreeNode) => void;\n}\n\nexport function useTreeData<R extends GridRowModel>(props: UseTreeDataProps<R>) {\n const { \n rows, \n getRowId,\n getTreeDataPath, \n treeData = false, \n defaultGroupingExpansionDepth = 0, \n filterModel,\n sortModel,\n onRowExpansionChange\n } = props;\n\n const { treeNodes, rootIds, groupingRows } = useMemo(() => {\n if (!treeData || !getTreeDataPath) {\n return { \n treeNodes: new Map<GridRowId, GridTreeNode>(), \n rootIds: [], \n groupingRows: [] \n };\n }\n\n const nodes = new Map<GridRowId, GridTreeNode>();\n const roots: GridRowId[] = [];\n const groupRows: GridRowModel[] = [];\n const pathLookup = new Map<string, GridRowId>();\n\n const getPathKey = (path: string[]) => path.join('/');\n\n rows.forEach(row => {\n const id = getRowId(row);\n const path = getTreeDataPath(row);\n const pathKey = getPathKey(path);\n\n pathLookup.set(pathKey, id);\n\n nodes.set(id, {\n id,\n parentId: null,\n depth: path.length - 1,\n groupingKey: path[path.length - 1],\n isExpanded: false,\n children: [],\n serverChildrenCount: row.serverChildrenCount\n });\n });\n\n rows.forEach(row => {\n const id = getRowId(row);\n const path = getTreeDataPath(row);\n\n if (path.length === 1) {\n roots.push(id);\n return;\n }\n\n const ensureAncestors = (childPath: string[]) => {\n if (childPath.length <= 1) return;\n\n const parentPath = childPath.slice(0, -1);\n const parentPathKey = getPathKey(parentPath);\n let parentId = pathLookup.get(parentPathKey);\n\n if (parentId === undefined) {\n parentId = `auto-group-${parentPathKey}`;\n\n if (!nodes.has(parentId)) {\n const groupLabel = parentPath[parentPath.length - 1];\n nodes.set(parentId, {\n id: parentId,\n parentId: null, \n depth: parentPath.length - 1,\n groupingKey: groupLabel,\n isExpanded: false,\n children: [],\n label: groupLabel\n });\n pathLookup.set(parentPathKey, parentId);\n\n const groupRow = { \n id: parentId,\n name: groupLabel, \n _isGroupRow: true\n } as unknown as GridRowModel; \n groupRows.push(groupRow);\n\n if (parentPath.length === 1) {\n roots.push(parentId);\n }\n\n ensureAncestors(parentPath);\n }\n }\n\n return parentId;\n };\n\n const parentId = ensureAncestors(path);\n\n if (parentId !== undefined) {\n const parentNode = nodes.get(parentId);\n const childNode = nodes.get(id);\n\n if (parentNode && childNode) {\n childNode.parentId = parentId;\n parentNode.children = parentNode.children || [];\n if (!parentNode.children.includes(id)) {\n parentNode.children.push(id);\n }\n }\n }\n });\n\n groupRows.forEach(groupRow => {\n const groupId = groupRow.id;\n const node = nodes.get(groupId);\n if (!node) return;\n\n const nodePathKey = (groupId as string).replace('auto-group-', '');\n const nodePath = nodePathKey.split('/');\n\n if (nodePath.length > 1) {\n const parentPath = nodePath.slice(0, -1);\n const parentPathKey = getPathKey(parentPath);\n const parentId = pathLookup.get(parentPathKey);\n\n if (parentId && nodes.has(parentId)) {\n node.parentId = parentId;\n const parentNode = nodes.get(parentId);\n if (parentNode) {\n parentNode.children = parentNode.children || [];\n if (!parentNode.children.includes(groupId)) {\n parentNode.children.push(groupId);\n }\n }\n }\n }\n });\n\n return { treeNodes: nodes, rootIds: roots, groupingRows: groupRows };\n\n }, [rows, getTreeDataPath, treeData, getRowId]);\n\n const initialExpandedIds = useMemo(() => {\n if (!treeData) return new Set<GridRowId>();\n\n const initialExpanded = new Set<GridRowId>();\n treeNodes.forEach(node => {\n if (node.children && node.children.length > 0) {\n if (defaultGroupingExpansionDepth === -1 || node.depth < defaultGroupingExpansionDepth) {\n initialExpanded.add(node.id);\n }\n }\n });\n return initialExpanded;\n }, [treeNodes, treeData, defaultGroupingExpansionDepth]);\n\n const [expandedGroupIds, setExpandedGroupIds] = useState<Set<GridRowId>>(new Set());\n\n useEffect(() => {\n if (initialExpandedIds.size > 0) {\n setExpandedGroupIds(initialExpandedIds);\n }\n }, [initialExpandedIds]);\n\n const toggleExpansion = useCallback((id: GridRowId) => {\n setExpandedGroupIds(prev => {\n const next = new Set(prev);\n const isExpanding = !next.has(id);\n\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n\n if (isExpanding && onRowExpansionChange) {\n const node = treeNodes.get(id);\n if (node) {\n onRowExpansionChange(node);\n }\n }\n\n return next;\n });\n }, [treeNodes, onRowExpansionChange]);\n\n const getVisibleRows = useCallback(() => {\n\n if (!treeData) return null; \n\n const rowLookup = new Map<GridRowId, GridRowModel>();\n rows.forEach(r => rowLookup.set(getRowId(r), r));\n groupingRows.forEach(r => rowLookup.set(r.id, r));\n\n const matchesFilter = (row: GridRowModel) => {\n return isRowMatchingFilter(row, filterModel!);\n };\n\n const filterCache = new Map<GridRowId, boolean>();\n\n const isNodeVisible = (id: GridRowId): boolean => {\n if (filterCache.has(id)) return filterCache.get(id)!;\n\n const row = rowLookup.get(id);\n if (!row) return false;\n\n const selfMatch = matchesFilter(row);\n if (selfMatch) {\n filterCache.set(id, true);\n return true;\n }\n\n const node = treeNodes.get(id);\n if (node && node.children) {\n const childMatch = node.children.some(childId => isNodeVisible(childId));\n if (childMatch) {\n filterCache.set(id, true);\n return true;\n }\n }\n\n filterCache.set(id, false);\n return false;\n };\n\n const sortNodes = (aId: GridRowId, bId: GridRowId) => {\n if (!sortModel || sortModel.length === 0) return 0;\n const rowA = rowLookup.get(aId);\n const rowB = rowLookup.get(bId);\n if (!rowA || !rowB) return 0;\n\n for (const sortItem of sortModel) {\n const valA = rowA[sortItem.field];\n const valB = rowB[sortItem.field];\n const comp = compareValues(valA, valB, sortItem.sort);\n if (comp !== 0) return comp;\n }\n return 0;\n };\n\n const result: GridRowModel[] = [];\n\n const seenIds = new Set<GridRowId>();\n\n const traverse = (ids: GridRowId[]) => {\n\n const visibleIds = ids.filter(id => isNodeVisible(id));\n\n visibleIds.sort(sortNodes);\n\n visibleIds.forEach(id => {\n if (seenIds.has(id)) return; \n\n const row = rowLookup.get(id);\n const node = treeNodes.get(id);\n\n if (row && node) {\n seenIds.add(id); \n\n const enhancedRow = {\n ...row,\n _treeDepth: node.depth,\n _isExpanded: expandedGroupIds.has(id),\n _hasChildren: (node.children && node.children.length > 0) || (node.serverChildrenCount && node.serverChildrenCount > 0),\n _descendantCount: node.children ? node.children.length : 0\n };\n result.push(enhancedRow);\n\n if (expandedGroupIds.has(id) && node.children && node.children.length > 0) {\n traverse(node.children);\n }\n }\n });\n };\n\n traverse(rootIds);\n return result;\n\n }, [treeData, rows, groupingRows, rootIds, treeNodes, expandedGroupIds, filterModel, sortModel, getRowId]);\n\n const isGroupExpanded = useCallback((id: GridRowId) => expandedGroupIds.has(id), [expandedGroupIds]);\n const getNode = useCallback((id: GridRowId) => treeNodes.get(id), [treeNodes]);\n\n const getNodePath = useCallback((id: GridRowId): string[] => {\n const path: string[] = [];\n let currentId: GridRowId | null = id;\n\n while (currentId !== null) {\n const node = treeNodes.get(currentId);\n if (!node) break;\n\n path.unshift(node.groupingKey);\n currentId = node.parentId;\n }\n return path;\n }, [treeNodes]);\n\n return useMemo(() => ({\n treeNodes,\n groupingRows,\n toggleExpansion,\n isGroupExpanded,\n getVisibleRows,\n getNode,\n getNodePath\n }), [treeNodes, groupingRows, toggleExpansion, isGroupExpanded, getVisibleRows, getNode, getNodePath]);\n}\n","import { useState, useMemo, useEffect, useCallback } from 'react';\nimport type { \n GridRowModel, \n GridRowId, \n GridRowGroupingModel, \n GridAggregationModel, \n GridTreeNode,\n GridFilterModel,\n GridSortItem\n} from '../types';\nimport { isRowMatchingFilter } from '../utils/filtering';\nimport { compareValues } from '../utils/sorting';\n\nexport interface UseRowGroupingParams<R extends GridRowModel> {\n rows: R[];\n getRowId: (row: R) => GridRowId;\n rowGroupingModel?: GridRowGroupingModel;\n aggregationModel?: GridAggregationModel;\n defaultGroupingExpansionDepth?: number;\n filterModel?: GridFilterModel;\n sortModel?: GridSortItem[];\n getAggregationPosition?: (groupNode: GridTreeNode | null) => 'inline' | 'footer' | null;\n}\n\nconst defaultGetAggregationPosition = (groupNode: GridTreeNode | null): 'inline' | 'footer' | null => {\n\n return groupNode?.depth === -1 ? 'footer' : 'inline';\n};\n\nexport function useRowGrouping<R extends GridRowModel>(params: UseRowGroupingParams<R>) {\n const { \n rows, \n getRowId, \n rowGroupingModel = [], \n aggregationModel = {}, \n defaultGroupingExpansionDepth = 0,\n filterModel,\n sortModel,\n getAggregationPosition = defaultGetAggregationPosition\n } = params;\n\n const [expandedGroupIds, setExpandedGroupIds] = useState<Set<GridRowId>>(new Set());\n\n const { treeNodes, rootIds, groupingRows } = useMemo(() => {\n const treeNodes = new Map<GridRowId, GridTreeNode>();\n const groupingRows = new Map<GridRowId, R>();\n const rootIds: GridRowId[] = [];\n\n if (rowGroupingModel.length === 0) {\n return { treeNodes, rootIds, groupingRows };\n }\n\n const getGroupId = (field: string, value: any, parentId: GridRowId | null) => {\n return `auto-group-${field}-${value}-${parentId || 'root'}`;\n };\n\n const groupRows = (\n currentRows: R[], \n depth: number, \n parentId: GridRowId | null\n ) => {\n if (depth >= rowGroupingModel.length) {\n\n return currentRows.map(row => {\n const id = getRowId(row);\n treeNodes.set(id, {\n id,\n parentId,\n depth,\n groupingKey: '',\n isExpanded: false\n });\n return id;\n });\n }\n\n const field = rowGroupingModel[depth];\n const groups = new Map<any, 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, any> = {};\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, b) => (Number(a) || 0) + (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, b) => (Number(a) || 0) + (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: any = {\n [field]: rawValue, \n ...aggregatedValues, \n id: groupId \n };\n\n groupingRows.set(groupId, groupRow);\n\n const treeNode: GridTreeNode = {\n id: groupId,\n parentId,\n depth,\n groupingKey: key,\n groupingField: field,\n groupingValue: rawValue,\n aggregatedValues,\n isExpanded: false,\n children: [], \n label: `${field}: ${String(rawValue)}` \n };\n\n treeNode.aggregationPosition = getAggregationPosition(treeNode);\n\n treeNodes.set(groupId, treeNode);\n\n const childrenIds = groupRows(groupRowsList, depth + 1, groupId);\n treeNodes.get(groupId)!.children = childrenIds;\n\n const descendantCount = groupRowsList.length;\n treeNodes.get(groupId)!.descendantCount = descendantCount;\n });\n\n return groupIds;\n };\n\n const topLevelIds = groupRows(rows, 0, null);\n rootIds.push(...topLevelIds);\n\n return { treeNodes, rootIds, groupingRows };\n\n }, [rows, rowGroupingModel, aggregationModel, getRowId, getAggregationPosition]);\n\n useEffect(() => {\n if (defaultGroupingExpansionDepth === -1) {\n\n const allGroupIds = new Set<GridRowId>();\n treeNodes.forEach((node, id) => {\n if (node.children && node.children.length > 0) {\n allGroupIds.add(id);\n }\n });\n setExpandedGroupIds(allGroupIds);\n } else if (defaultGroupingExpansionDepth > 0) {\n const depthIds = new Set<GridRowId>();\n treeNodes.forEach((node, id) => {\n if (node.depth < defaultGroupingExpansionDepth && node.children && node.children.length > 0) {\n depthIds.add(id);\n }\n });\n setExpandedGroupIds(depthIds);\n } else {\n\n setExpandedGroupIds(new Set());\n }\n\n }, [rowGroupingModel, defaultGroupingExpansionDepth]);\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 as any)[sortItem.field];\n const valB = (rowB as any)[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]);\n\n const getNode = useCallback((id: GridRowId) => treeNodes.get(id), [treeNodes]);\n\n return useMemo(() => ({\n treeNodes,\n groupingRows,\n toggleExpansion,\n isGroupExpanded,\n getVisibleRows,\n getNode\n }), [treeNodes, groupingRows, toggleExpansion, isGroupExpanded, getVisibleRows, getNode]);\n}\n","import { useState, useCallback, useRef } from 'react';\nimport type { GridRowId, GridRowModel } from '../../types';\n\nexport interface GridEditingState {\n\n editingCell: {\n id: GridRowId;\n field: string;\n value: any;\n originalValue: any;\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: any) => void;\n onRowChange?: (newRow: R) => void; \n}\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<GridEditingState['editingCell']>(null);\n const editingCellRef = useRef<GridEditingState['editingCell']>(null);\n\n const setEditingCell = useCallback((val: any) => {\n setEditingCellState(val);\n editingCellRef.current = typeof val === 'function' ? val(editingCellRef.current) : val;\n }, []);\n\n const startCellEdit = useCallback((params: { id: GridRowId, field: string, value: any }) => {\n setEditingCell({\n id: params.id,\n field: params.field,\n value: params.value,\n originalValue: params.value\n });\n }, []);\n\n const stopCellEdit = useCallback(async (params?: { cancel?: boolean }) => {\n const currentCell = editingCellRef.current;\n if (!currentCell) return;\n\n if (params?.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 if (onProcessRowUpdateError) {\n onProcessRowUpdateError(error);\n }\n }\n\n }, [editingCell, rows, getRowId, processRowUpdate, onRowChange, onProcessRowUpdateError]);\n\n const setEditCellValue = useCallback((params: { id: GridRowId, field: string, value: any }) => {\n if (editingCell && editingCell.id === params.id && editingCell.field === params.field) {\n setEditingCell((prev: any) => prev ? { ...prev, value: params.value } : null);\n }\n }, [editingCell]);\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: any) => 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\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, useEffect, useRef, useCallback, useState } from 'react';\nimport type {\n GridRowModel,\n GridAggregationModel,\n GridAggregationResult,\n GridFilterModel,\n GridSortItem,\n GridDataSource,\n} from '../../types';\n\nexport type BuiltInAggFn = 'sum' | 'avg' | 'count' | 'min' | 'max' | 'unique';\n\nconst AGGREGATION_FUNCTIONS: Record<BuiltInAggFn, (values: any[]) => any> = {\n sum: (values) => {\n const nums = values.filter((v) => v != null && !isNaN(Number(v)));\n return nums.reduce((acc, 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, 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: any, fnName: string): string {\n if (value == null) return '—';\n if (typeof value === 'number') {\n if (fnName === 'avg') {\n return value.toLocaleString(undefined, { maximumFractionDigits: 2 });\n }\n return value.toLocaleString();\n }\n return String(value);\n}\n\nexport interface UseAggregationParams<R extends GridRowModel> {\n rows: R[];\n aggregationModel: GridAggregationModel;\n isServerSide: boolean;\n dataSource?: GridDataSource<R>;\n filterModel?: GridFilterModel;\n sortModel?: GridSortItem[];\n serverAggregationResults?: GridAggregationResult | null;\n}\n\nexport interface UseAggregationReturn {\n aggregationResult: GridAggregationResult;\n isLoading: boolean;\n error: any;\n}\n\nexport function useAggregation<R extends GridRowModel>(\n params: UseAggregationParams<R>\n): UseAggregationReturn {\n const {\n rows,\n aggregationModel,\n isServerSide,\n dataSource,\n filterModel,\n sortModel,\n serverAggregationResults,\n } = params;\n\n const clientResult = useMemo<GridAggregationResult>(() => {\n if (isServerSide || Object.keys(aggregationModel).length === 0) return {};\n\n const result: GridAggregationResult = {};\n for (const [field, fnName] of Object.entries(aggregationModel)) {\n const fn = AGGREGATION_FUNCTIONS[fnName as BuiltInAggFn];\n if (!fn) {\n console.warn(`[useAggregation] Unknown aggregation function: \"${fnName}\"`);\n continue;\n }\n const values = rows.map((row) => (row as any)[field]);\n result[field] = fn(values);\n }\n return result;\n }, [rows, aggregationModel, isServerSide]);\n\n const [serverResult, setServerResult] = useState<GridAggregationResult>({});\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<any>(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","\nimport { useMemo } from 'react';\nimport type { GridColDef, GridRowModel } from '../../types';\nimport type { GridPivotModel, GridPivotAggFn } from '../../types';\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('\\u0000');\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 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, any>;\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, any> = {};\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 v = Number(row[vf.field]);\n if (!colBucket.has(vf.field)) colBucket.set(vf.field, []);\n if (!isNaN(v)) colBucket.get(vf.field)!.push(v);\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 cellKey = columnFields.length > 0\n ? `${ck}\\u001f${vf.field}\\u001f${vf.aggFn}`\n : `${vf.field}\\u001f${vf.aggFn}`;\n const values = colBucket?.get(vf.field) ?? [];\n pivotRow[cellKey] = values.length > 0 ? aggregate(values, vf.aggFn) : null;\n }\n }\n\n pivotRows.push(pivotRow);\n }\n\n // ── Grand Total row ───────────────────────────────────────────────────\n // Sum every numeric pivot cell across all pivot rows so users get\n // column totals. The row uses the same synthetic field keys as regular\n // pivot rows, so it renders with the correct valueFormatters.\n // Label columns (rowFields) show 'Grand Total' in the first field, empty elsewhere.\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 cellKey = columnFields.length > 0\n ? `${ck}\\u001f${vf.field}\\u001f${vf.aggFn}`\n : `${vf.field}\\u001f${vf.aggFn}`;\n // Sum the already-aggregated cell values across all pivot rows\n const colTotal = pivotRows.reduce((acc, r) => {\n const v = r[cellKey];\n return acc + (v != null && !isNaN(Number(v)) ? Number(v) : 0);\n }, 0);\n totalRow[cellKey] = colTotal;\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\n const colLabel = columnFields.length > 0\n ? ck.split('\\u0000').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 cellKey = columnFields.length > 0\n ? `${ck}\\u001f${vf.field}\\u001f${vf.aggFn}`\n : `${vf.field}\\u001f${vf.aggFn}`;\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: cellKey,\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 any, 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 (e) {\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 { 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}\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 } = props;\n const [searchQuery, setSearchQuery] = useState('');\n const [dragOverField, setDragOverField] = useState<string | null>(null);\n const dragFieldRef = useRef<string | null>(null);\n\n const hideableColumns = useMemo(() => columns.filter(col => col.hideable !== false), [columns]);\n const allVisible = hideableColumns.every(col => visibleColumns.has(col.field));\n\n const filteredColumns = useMemo(() => {\n if (!searchQuery) return columns;\n const lowerQuery = searchQuery.toLowerCase();\n return columns.filter(col =>\n (col.headerName || col.field).toLowerCase().includes(lowerQuery)\n );\n }, [columns, searchQuery]);\n\n const handleToggleAll = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.checked) {\n onShowAll();\n } else {\n onHideAll();\n }\n };\n\n // ── Drag handlers ──────────────────────────────────────────────────────────\n const handleDragStart = (field: string) => (e: React.DragEvent) => {\n dragFieldRef.current = field;\n e.dataTransfer.effectAllowed = 'move';\n // Use a ghost image offset so the handle looks natural\n e.dataTransfer.setDragImage(e.currentTarget.closest('.ogx-column-visibility-panel__item') as HTMLElement, 20, 20);\n };\n\n const handleDragOver = (field: string) => (e: React.DragEvent) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n if (field !== dragFieldRef.current) {\n setDragOverField(field);\n }\n };\n\n const handleDragLeave = () => {\n setDragOverField(null);\n };\n\n const handleDrop = (toField: string) => (e: React.DragEvent) => {\n e.preventDefault();\n const fromField = dragFieldRef.current;\n setDragOverField(null);\n dragFieldRef.current = null;\n if (fromField && fromField !== toField && onColumnReorder) {\n onColumnReorder(fromField, toField);\n }\n };\n\n const handleDragEnd = () => {\n setDragOverField(null);\n dragFieldRef.current = null;\n };\n\n return (\n <div className=\"ogx-column-visibility-panel\">\n <div className=\"ogx-column-visibility-panel__search-section\">\n <div className=\"ogx-column-visibility-panel__search-container\">\n <SearchIcon />\n <input\n id=\"ogx-column-search\"\n name=\"ogx-column-search\"\n autoComplete=\"off\"\n className=\"ogx-column-visibility-panel__search-input\"\n placeholder=\"Search\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n />\n </div>\n </div>\n\n <div className=\"ogx-column-visibility-panel__list\">\n {filteredColumns.map(col => {\n const isVisible = visibleColumns.has(col.field);\n const isHideable = col.hideable !== false;\n const isDragOver = dragOverField === col.field;\n const canReorder = !!onColumnReorder && !searchQuery;\n\n return (\n <div\n key={col.field}\n className={[\n 'ogx-column-visibility-panel__item',\n !isHideable && 'ogx-column-visibility-panel__item--disabled',\n isDragOver && 'ogx-column-visibility-panel__item--drag-over',\n ].filter(Boolean).join(' ')}\n draggable={canReorder}\n onDragOver={canReorder ? handleDragOver(col.field) : undefined}\n onDragLeave={canReorder ? handleDragLeave : undefined}\n onDrop={canReorder ? handleDrop(col.field) : undefined}\n onDragEnd={canReorder ? handleDragEnd : undefined}\n >\n {canReorder && (\n <span\n className=\"ogx-column-visibility-panel__drag-handle-wrapper\"\n draggable\n onDragStart={handleDragStart(col.field)}\n title=\"Drag to reorder\"\n >\n <DragHandleIcon />\n </span>\n )}\n <label\n className=\"ogx-column-visibility-panel__item-label\"\n style={{ display: 'flex', alignItems: 'center', gap: 'var(--ogx-spacing-md)', flex: 1, cursor: isHideable ? 'pointer' : 'not-allowed' }}\n >\n <Checkbox\n checked={isVisible}\n onChange={(e) => onVisibilityChange(col.field, e.target.checked)}\n disabled={!isHideable}\n />\n <span className=\"ogx-column-visibility-panel__label\">\n {col.headerName || col.field}\n </span>\n </label>\n </div>\n );\n })}\n </div>\n\n <div className=\"ogx-column-visibility-panel__footer\">\n <label className=\"ogx-column-visibility-panel__item\">\n <Checkbox\n checked={allVisible}\n onChange={handleToggleAll}\n />\n <span className=\"ogx-column-visibility-panel__label\">\n Show/Hide All\n </span>\n </label>\n <button\n className=\"ogx-column-visibility-panel__reset-btn\"\n onClick={onShowAll}\n >\n Reset\n </button>\n </div>\n </div>\n );\n}\n","import React, { useRef, useEffect, useCallback, useMemo, useState } from 'react';\nimport ReactDOM from 'react-dom';\nimport { ListViewRow } from '../ListView/ListViewRow';\nimport type { GridState } from '../../state/types';\nimport { Header } from '../Header/Header';\nimport { Row } from '../Row/Row';\nimport { SkeletonRow } from '../SkeletonRow';\nimport { Pagination } from '../Pagination/Pagination';\nimport { useDataGrid } from '../../hooks/core/useDataGrid';\nimport { useColumnReorder } from '../../hooks/useColumnReorder';\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, formatAggregationValue } from '../../hooks/features/useAggregation';\nimport { usePivot } from '../../hooks/features/usePivot';\nimport { useGridClipboard } from '../../hooks/features/useGridClipboard';\nimport { ExpandIcon } from '../ui/ExpandIcon';\nimport { ColumnVisibilityPanel } from '../ColumnVisibilityPanel/ColumnVisibilityPanel';\nimport { getPinnedRowGroups, isRowPinned, isColumnPinned } from '../../utils/pinning';\nimport { sortRows } from '../../utils/sorting';\nimport { filterRows } from '../../utils/filtering';\nimport type { DataGridProps, GridRowModel, GridRowId, GridSortDirection, GridColumnOrderChangeParams, GridColDef, GridRenderCellParams, GridRowParams, GridCellParams, GridPaginationModel, GridDataSource, GridAggregationResult, GridAggregationModel, GridPivotModel, GridColumnPinning, GridFilterModel } from '../../types';\nimport '../../styles/opengridx.css';\n\nexport function DataGrid<R extends GridRowModel = GridRowModel>(props: DataGridProps<R>) {\n const {\n rows,\n columns,\n getRowId,\n rowHeight = 52,\n headerHeight = 56,\n autoHeight = false,\n checkboxSelection = false,\n rowSelectionModel: propRowSelectionModel,\n onRowSelectionModelChange: propOnRowSelectionModelChange,\n onRowClick,\n onCellClick,\n\n filterModel: propFilterModel,\n onFilterModelChange,\n sortModel: propSortModel,\n onSortModelChange,\n pagination: propPagination = false,\n paginationModel = { page: 0, pageSize: 100 },\n onPaginationModelChange,\n pageSizeOptions = [10, 25, 50, 100],\n pinnedColumns: propPinnedColumns,\n onPinnedColumnsChange,\n pinnedRows,\n\n getDetailPanelContent,\n getDetailPanelHeight,\n detailPanelExpandedRowIds: controlledExpandedRowIds,\n onDetailPanelExpandedRowIdsChange,\n pinCheckboxColumn = true,\n pinExpandColumn = true,\n disableColumnReorder = false,\n columnOrder,\n onColumnOrderChange,\n height,\n rowReordering = false,\n onRowOrderChange,\n loading = false,\n\n treeData = false,\n getTreeDataPath,\n defaultGroupingExpansionDepth,\n\n rowGroupingModel: propRowGroupingModel,\n\n aggregationModel: propAggregationModel,\n onAggregationModelChange,\n getAggregationPosition,\n\n isCellEditable,\n processRowUpdate,\n onProcessRowUpdateError,\n\n dataSource,\n sortingMode = 'client',\n filterMode = 'client',\n paginationMode = 'client',\n rowCount: propRowCount,\n\n slots,\n slotProps,\n\n pivotMode = false,\n pivotModel: propPivotModel,\n onPivotModelChange,\n\n className = '',\n style,\n onRowsScrollEnd,\n ariaLabel,\n initialState,\n onStateChange,\n // Column Visibility\n columnVisibilityModel: propColumnVisibilityModel,\n onColumnVisibilityModelChange,\n listView = false,\n listViewColumn,\n columnGroupingModel,\n noRowsLabel = 'No Data',\n apiRef: propApiRef,\n } = props;\n\n // Stable defaults\n const defaultFilterModel: GridFilterModel = useMemo(() => ({ items: [] }), []);\n const filterModel = (propFilterModel || defaultFilterModel) as GridFilterModel;\n\n const [internalSortModel, setInternalSortModel] = useState<{ field: string; sort: 'asc' | 'desc' }[]>(\n () => initialState?.sorting?.sortModel ?? []\n );\n const isSortControlled = propSortModel !== undefined;\n const sortModel = isSortControlled ? propSortModel : internalSortModel;\n\n const defaultRowGroupingModel = useMemo(() => [], []);\n const rowGroupingModel = propRowGroupingModel || defaultRowGroupingModel;\n const isAggregationControlled = propAggregationModel !== undefined;\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 const [internalAggregationModel, setInternalAggregationModel] = useState<GridAggregationModel>(\n () => propAggregationModel ?? {}\n );\n const aggregationModel = isAggregationControlled ? propAggregationModel : internalAggregationModel;\n\n const handleAggregationModelChange = useCallback((model: GridAggregationModel) => {\n if (!isAggregationControlled) {\n setInternalAggregationModel(model);\n }\n onAggregationModelChange?.(model);\n }, [isAggregationControlled, onAggregationModelChange]);\n\n const [internalColumnVisibilityModel, setInternalColumnVisibilityModel] = useState<Record<string, boolean>>(\n () => initialState?.columns?.columnVisibilityModel ?? {}\n );\n const isColumnVisibilityControlled = propColumnVisibilityModel !== undefined;\n const columnVisibilityModel = isColumnVisibilityControlled ? propColumnVisibilityModel : internalColumnVisibilityModel;\n\n const handleColumnVisibilityModelChange = useCallback((model: Record<string, boolean>) => {\n if (!isColumnVisibilityControlled) {\n setInternalColumnVisibilityModel(model);\n }\n onColumnVisibilityModelChange?.(model);\n }, [isColumnVisibilityControlled, onColumnVisibilityModelChange]);\n\n const [internalPinnedColumns, setInternalPinnedColumns] = useState<GridColumnPinning>(\n () => initialState?.columns?.pinnedColumns ?? {}\n );\n const isPinnedColumnsControlled = propPinnedColumns !== undefined;\n const pinnedColumns = isPinnedColumnsControlled ? propPinnedColumns : internalPinnedColumns;\n\n const handlePinnedColumnsChange = useCallback((model: GridColumnPinning) => {\n if (!isPinnedColumnsControlled) {\n setInternalPinnedColumns(model);\n }\n onPinnedColumnsChange?.(model);\n }, [isPinnedColumnsControlled, onPinnedColumnsChange]);\n\n const EMPTY_PIVOT_MODEL: GridPivotModel = useMemo(() => ({ rowFields: [], columnFields: [], valueFields: [] }), []);\n const [internalPivotModel, setInternalPivotModel] = useState<GridPivotModel>(propPivotModel ?? EMPTY_PIVOT_MODEL);\n const currentPivotModel = propPivotModel ?? internalPivotModel;\n const handlePivotModelChange = useCallback((model: GridPivotModel) => {\n setInternalPivotModel(model);\n onPivotModelChange?.(model);\n }, [onPivotModelChange]);\n const pivot = usePivot(rows as GridRowModel[], columns as unknown as GridColDef[], currentPivotModel, pivotMode);\n\n const activeRows = (pivotMode && pivot.isValid ? pivot.pivotRows : rows) as unknown as R[];\n const activeColumns = (pivotMode && pivot.isValid ? pivot.pivotColumns : columns) as unknown as GridColDef<R>[];\n\n const [serverAggregationResults, setServerAggregationResults] = useState<GridAggregationResult | null>(null);\n\n useEffect(() => {\n setServerAggregationResults(null);\n }, [aggregationModel]);\n\n const [internalPaginationModel, setInternalPaginationModel] = useState(\n () => initialState?.pagination?.paginationModel ?? paginationModel\n );\n const isPaginationControlled = props.paginationModel !== undefined;\n const effectivePaginationModel = isPaginationControlled ? paginationModel : internalPaginationModel;\n\n const handlePaginationModelChange = useCallback((newModel: GridPaginationModel) => {\n if (!isPaginationControlled) {\n setInternalPaginationModel(newModel);\n }\n onPaginationModelChange?.(newModel);\n }, [isPaginationControlled, onPaginationModelChange]);\n\n const [internalRowSelectionModel, setInternalRowSelectionModel] = useState<GridRowId[]>([]);\n const isSelectionControlled = propRowSelectionModel !== undefined;\n const rowSelectionModel = isSelectionControlled ? propRowSelectionModel : internalRowSelectionModel;\n const selectedRowIds = useMemo(() => new Set(rowSelectionModel), [rowSelectionModel]);\n const onRowSelectionModelChange = propOnRowSelectionModelChange;\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 const [focusedCell, setFocusedCell] = useState<{ id: GridRowId; field: string } | null>(null);\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<any>(null);\n\n const handleNodeExpansion = useCallback((node: any) => {\n if (dataSourceRef.current && treeData) {\n\n if (node.serverChildrenCount > 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: activeRows,\n columns: activeColumns,\n rowHeight,\n headerHeight,\n rowCount: propRowCount,\n columnVisibilityModel,\n initialState: props.initialState\n });\n const {\n state,\n apiRef,\n setRows,\n setColumns,\n setScroll,\n setDimensions,\n setDataSourceLoading,\n setDataSourceError,\n setRowCount\n } = gridData;\n\n useEffect(() => {\n if (propApiRef) {\n propApiRef.current = apiRef.current;\n }\n }, [propApiRef, apiRef]);\n\n const { copySelectedRows } = useGridClipboard({\n selectedRowIds,\n columns: activeColumns as unknown as GridColDef[],\n getVisibleRows: () => apiRef.current.getVisibleRows(),\n getRowId: effectiveGetRowId as unknown as (row: GridRowModel) => GridRowId,\n });\n\n // Expose on apiRef for programmatic use\n useEffect(() => {\n apiRef.current.copySelectedRows = copySelectedRows;\n apiRef.current.getSelectedRows = () => Array.from(selectedRowIds);\n }, [copySelectedRows, selectedRowIds, apiRef]);\n\n const isInternalLoading = state.dataSource.loading;\n const effectiveLoading = loading || isInternalLoading;\n\n const effectiveRows = useMemo(() => {\n return state.rows.allRows.map(id => state.rows.idRowsLookup.get(id)!) as R[];\n }, [state.rows]);\n\n const treeDataHandlers = useTreeData({\n rows: effectiveRows,\n getRowId: effectiveGetRowId,\n getTreeDataPath,\n treeData,\n defaultGroupingExpansionDepth,\n filterModel,\n\n sortModel,\n onRowExpansionChange: handleNodeExpansion\n });\n\n useEffect(() => {\n treeDataRef.current = treeDataHandlers;\n }, [treeDataHandlers]);\n\n const rowGroupingHandlers = useRowGrouping({\n rows: effectiveRows,\n getRowId: effectiveGetRowId,\n rowGroupingModel,\n aggregationModel,\n defaultGroupingExpansionDepth,\n filterModel,\n sortModel,\n getAggregationPosition\n });\n\n const editingHandlers = useGridEditing({\n rows: effectiveRows,\n getRowId: effectiveGetRowId,\n processRowUpdate,\n onProcessRowUpdateError,\n onRowChange: (updatedRow) => {\n // Dispatch a proper state update so React re-renders with the new row value\n const { dispatch } = gridData;\n const currentRows = Array.from(gridData.state.rows.idRowsLookup.values());\n const nextRows = currentRows.map(r =>\n (r as any).id === (updatedRow as any).id ? updatedRow : r\n );\n dispatch({ type: 'SET_ROWS', payload: nextRows });\n },\n });\n\n const isTreeData = treeData;\n const isRowGrouping = !!(rowGroupingModel && rowGroupingModel.length > 0);\n const isHierarchyEnabled = isTreeData || isRowGrouping;\n const activeHierarchyHandlers = isTreeData ? treeDataHandlers : (isRowGrouping ? rowGroupingHandlers : null);\n\n const pagination = propPagination && !isRowGrouping;\n\n const handleRowClick = useCallback((params: GridRowParams<R>) => {\n const { row, id } = params;\n const rowData = row as any;\n\n if (isHierarchyEnabled && rowData._hasChildren) {\n activeHierarchyHandlers?.toggleExpansion(id);\n return;\n }\n\n onRowClick?.(params);\n }, [isHierarchyEnabled, activeHierarchyHandlers, onRowClick]);\n\n const effectiveColumns = useMemo(() => {\n if (!isHierarchyEnabled) return activeColumns;\n\n return activeColumns.map((col, index) => {\n\n if (index === 0) {\n return {\n ...col,\n renderCell: (params: GridRenderCellParams<R>) => {\n const { _treeDepth, _hasChildren, _isExpanded, _groupingField, _groupingValue, _descendantCount } = params.row as any;\n const depth = _treeDepth || 0;\n const paddingLeft = depth * 24;\n\n let content = col.renderCell ? col.renderCell(params) : params.value;\n\n if (isTreeData && _hasChildren && params.row._isGroupRow) {\n content = (\n <div className=\"ogx__group-cell-content\">\n {params.value}\n {_descendantCount !== undefined && _descendantCount > 0 ? ` (${_descendantCount})` : ''}\n </div>\n );\n }\n\n // For row grouping, override the first column content to show the group label\n if (isRowGrouping && _hasChildren && _groupingField) {\n content = (\n <div className=\"ogx__group-cell-content\">\n {col.field === _groupingField ? '' : `${_groupingField}: `}\n {String(_groupingValue)}\n {_descendantCount !== undefined ? ` (${_descendantCount})` : ''}\n </div>\n );\n }\n\n return (\n <div style={{ display: 'flex', alignItems: 'center', paddingLeft, width: '100%', height: '100%' }}>\n <div\n style={{\n marginRight: 4,\n width: 24,\n height: 24,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: _hasChildren ? 'pointer' : 'default',\n flexShrink: 0\n }}\n >\n\n {_hasChildren ? (\n <div\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n activeHierarchyHandlers?.toggleExpansion(params.row.id);\n }}\n onMouseDown={(e) => {\n e.stopPropagation();\n }}\n style={{\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n pointerEvents: 'auto',\n zIndex: 10,\n position: 'relative'\n }}\n >\n <ExpandIcon\n isExpanded={_isExpanded}\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n activeHierarchyHandlers?.toggleExpansion(params.row.id);\n }}\n />\n </div>\n ) : null}\n </div>\n <div style={{ flex: 1, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n {content}\n </div>\n </div>\n );\n }\n };\n }\n\n return {\n ...col,\n renderCell: (params: GridRenderCellParams<R>) => {\n const { _hasChildren, _groupingField } = params.row as any;\n\n if (isRowGrouping && _hasChildren) {\n\n if (col.field === _groupingField) {\n return null;\n }\n\n if (params.value !== undefined && params.value !== null) {\n return col.renderCell ? col.renderCell(params) : params.value;\n }\n\n return null;\n }\n\n return col.renderCell ? col.renderCell(params) : params.value;\n }\n };\n }) as GridColDef<R>[];\n }, [activeColumns, isHierarchyEnabled, isRowGrouping, activeHierarchyHandlers]);\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 const [columnWidths, setColumnWidths] = useState<Record<string, number>>(\n () => initialState?.columns?.columnWidths ?? {}\n );\n\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 if (!dataSource) {\n setRows(activeRows);\n }\n }, [activeRows, setRows, dataSource]);\n\n useEffect(() => {\n setColumns(activeColumns as any);\n }, [activeColumns, setColumns]);\n\n useEffect(() => {\n if (pivotMode) {\n setInternalColumnOrder(activeColumns.map(col => col.field));\n }\n }, [pivotMode, activeColumns]);\n\n const orderedColumns = useMemo(() => {\n if (disableColumnReorder) return effectiveColumns as GridColDef<R>[];\n\n const orderMap = new Map(effectiveColumnOrder.map((field, index) => [field, index]));\n return [...(effectiveColumns as GridColDef<R>[])].sort((a, b) => {\n const aIndex = orderMap.get(a.field) ?? effectiveColumns.indexOf(a);\n const bIndex = orderMap.get(b.field) ?? effectiveColumns.indexOf(b);\n return aIndex - bIndex;\n });\n }, [effectiveColumns, effectiveColumnOrder, disableColumnReorder]);\n\n const visibleOrderedColumns = useMemo(() => {\n return orderedColumns.filter(col => columnVisibilityModel[col.field] !== false);\n }, [orderedColumns, columnVisibilityModel]);\n\n const columnReorderHandlers = useColumnReorder({\n columns: orderedColumns,\n onColumnOrderChange: useCallback((params: GridColumnOrderChangeParams) => {\n const { oldIndex, targetIndex } = params;\n\n const newOrder = [...effectiveColumnOrder];\n const [movedField] = newOrder.splice(oldIndex, 1);\n newOrder.splice(targetIndex, 0, movedField);\n\n if (!columnOrder) {\n setInternalColumnOrder(newOrder);\n }\n\n onColumnOrderChange?.(params);\n }, [effectiveColumnOrder, columnOrder, onColumnOrderChange]),\n disableColumnReorder,\n });\n\n const [internalExpandedRowIds, setInternalExpandedRowIds] = useState<Set<GridRowId>>(new Set());\n const expandedRowIds = controlledExpandedRowIds ?? internalExpandedRowIds;\n const hasDetailPanel = Boolean(getDetailPanelContent);\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\n if (controlledExpandedRowIds === undefined) {\n setInternalExpandedRowIds(newExpandedRowIds);\n }\n onDetailPanelExpandedRowIdsChange?.(newExpandedRowIds);\n }, [expandedRowIds, controlledExpandedRowIds, onDetailPanelExpandedRowIdsChange]);\n\n const navigationColumns = useMemo(() => {\n const cols: { field: string; editable?: boolean }[] = [];\n if (rowReordering) cols.push({ field: '__reorder_col__' });\n if (hasDetailPanel) cols.push({ field: '__expand_col__' });\n if (checkboxSelection) cols.push({ field: '__checkbox_col__' });\n return [...cols, ...orderedColumns];\n }, [orderedColumns, checkboxSelection, hasDetailPanel, rowReordering]);\n\n const handleColumnResize = useCallback((field: string, newWidth: number) => {\n setColumnWidths(prev => ({ ...prev, [field]: newWidth }));\n }, []);\n\n const onStateChangeRef = useRef(onStateChange);\n onStateChangeRef.current = onStateChange;\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: 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 const baseRows = useMemo(() => {\n return effectiveRows;\n }, [effectiveRows]);\n\n const filteredRows = useMemo(() => {\n if (activeHierarchyHandlers) {\n\n return (activeHierarchyHandlers.getVisibleRows() || []) as R[];\n }\n\n if (filterMode === 'server' && dataSource) {\n return baseRows;\n }\n\n return filterRows(baseRows, filterModel);\n }, [baseRows, filterModel, activeHierarchyHandlers, filterMode, dataSource]);\n\n const { top: pinnedTopRows, center: unpinnedRows, bottom: pinnedBottomRows } = useMemo(() => {\n if (activeHierarchyHandlers) {\n\n return { top: [], center: filteredRows, bottom: [] };\n }\n return getPinnedRowGroups(filteredRows, pinnedRows);\n }, [filteredRows, pinnedRows, activeHierarchyHandlers]);\n\n const sortedUnpinnedRows = useMemo(() => {\n if (activeHierarchyHandlers) {\n return unpinnedRows;\n }\n\n if (sortingMode === 'server' && dataSource) {\n return unpinnedRows;\n }\n\n return sortRows(unpinnedRows, sortModel);\n }, [unpinnedRows, sortModel, activeHierarchyHandlers, sortingMode, dataSource]);\n\n const paginatedUnpinnedRows = useMemo(() => {\n if (!pagination) return sortedUnpinnedRows;\n\n if (paginationMode === 'server' && dataSource) {\n return sortedUnpinnedRows;\n }\n\n const start = effectivePaginationModel.page * effectivePaginationModel.pageSize;\n const end = start + effectivePaginationModel.pageSize;\n return sortedUnpinnedRows.slice(start, end);\n }, [sortedUnpinnedRows, pagination, effectivePaginationModel.page, effectivePaginationModel.pageSize, paginationMode, dataSource]);\n\n useEffect(() => {\n gridData.apiRef.current.getVisibleRows = () => sortedUnpinnedRows;\n gridData.apiRef.current.getVisibleColumns = () => effectiveColumns as any[];\n }, [sortedUnpinnedRows, 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 allRenderableRows = useMemo(() => {\n\n if (activeHierarchyHandlers) {\n return unpinnedRows;\n }\n const centerRows = pagination ? paginatedUnpinnedRows : sortedUnpinnedRows;\n const base = [...pinnedTopRows, ...centerRows, ...pinnedBottomRows];\n\n // Append skeleton rows while an infinite-scroll fetch is in flight\n if (paginationMode === 'infinite' && state.dataSource.loading && base.length > 0) {\n const skeletonCount = Math.min(effectivePaginationModel.pageSize, 20);\n const skeletons = Array.from({ length: skeletonCount }, (_, i) => ({\n id: `__skeleton_${i}__`,\n _isSkeleton: true,\n }));\n return [...base, ...skeletons] as typeof base;\n }\n\n return base;\n }, [pinnedTopRows, paginatedUnpinnedRows, sortedUnpinnedRows, pinnedBottomRows, pagination,\n activeHierarchyHandlers, unpinnedRows, paginationMode, state.dataSource.loading,\n effectivePaginationModel.pageSize]);\n\n const spanning = useGridSpanning(\n allRenderableRows,\n navigationColumns,\n columnWidths\n );\n\n const { aggregationResult } = useAggregation({\n rows: filteredRows,\n aggregationModel,\n isServerSide: !!(dataSource && (paginationMode === 'server' || sortingMode === 'server')),\n dataSource: dataSource as any,\n filterModel,\n sortModel,\n serverAggregationResults,\n });\n\n const hasAggregation = Object.keys(aggregationModel).length > 0;\n\n useEffect(() => {\n gridData.apiRef.current.getAggregationResult = () => hasAggregation ? aggregationResult : null;\n gridData.apiRef.current.getAggregationModel = () => hasAggregation ? aggregationModel : null;\n }, [aggregationResult, aggregationModel, hasAggregation, gridData.apiRef]);\n\n const layout = useMemo(() => {\n const baseRowHeight = rowHeight;\n\n const unpinnedRows = pagination ? paginatedUnpinnedRows : sortedUnpinnedRows;\n const rowHeights = unpinnedRows.map((row, index) => {\n let height = baseRowHeight;\n if (expandedRowIds.has(row.id)) {\n const detailHeight = getDetailPanelHeight?.({ row, id: row.id, rowIndex: pinnedTopRows.length + 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' && state.dataSource.loading && (unpinnedRows.length > 0))\n ? Math.min(effectivePaginationModel.pageSize, 20)\n : 0;\n const skeletonRowsHeight = skeletonCount * baseRowHeight;\n const unpinnedRowsHeight = (cumulativeHeights[cumulativeHeights.length - 1] || 0) + skeletonRowsHeight;\n const pinnedTopHeight = pinnedTopRows.length * baseRowHeight;\n const pinnedBottomHeight = pinnedBottomRows.length * baseRowHeight;\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 viewportWidth = state.dimensions.viewportWidth || 1000;\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 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\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 width = typeof col.width === 'number' ? col.width : 150;\n return sum + (minWidth || width);\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 let totalFlexUnits = 0;\n\n unpinnedCols.forEach(col => {\n // If the user has manually resized this column, columnWidths has an explicit\n // entry for it. Respect that stored width as fixed-width so the resize sticks,\n // even if the column definition originally had flex.\n const hasManualWidth = Object.prototype.hasOwnProperty.call(columnWidths, col.field);\n\n const parsed = parseWidth(getColWidth(col));\n\n if (!hasManualWidth && col.flex && col.flex > 0) {\n flexCols.push({ col, flex: col.flex });\n totalFlexUnits += 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\n const implicitFlex = 1;\n flexCols.push({ col, flex: implicitFlex });\n totalFlexUnits += implicitFlex;\n }\n });\n\n const fixedWidth = fixedWidthCols.reduce((sum, { width }) => sum + width, 0);\n\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\n remainingSpaceForFlex -= calculatedWidth;\n });\n\n remainingSpaceForFlex = Math.max(0, remainingSpaceForFlex);\n\n const finalFlexWidths = new Map<string, number>();\n\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\n let iterations = 0;\n const maxIterations = flexItems.length * 2;\n\n while (iterations < maxIterations) {\n iterations++;\n\n const unfrozen = flexItems.filter(f => !f.frozen);\n\n if (unfrozen.length === 0) break;\n\n const unfrozenFlexTotal = unfrozen.reduce((sum, f) => sum + f.flex, 0);\n\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 => {\n f.computedWidth = f.minWidth;\n f.frozen = true;\n });\n break;\n }\n\n const pixelsPerFlex = currentFreeSpace / unfrozenFlexTotal;\n\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\n if (rawWidth < f.minWidth) {\n const diff = f.minWidth - rawWidth;\n totalViolation += diff;\n minViolators.push(f);\n } else if (rawWidth > f.maxWidth) {\n const diff = f.maxWidth - rawWidth;\n totalViolation += diff;\n maxViolators.push(f);\n } else {\n\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 => {\n f.computedWidth = f.minWidth;\n f.frozen = true;\n });\n } else if (totalViolation < 0) {\n maxViolators.forEach(f => {\n f.computedWidth = f.maxWidth;\n f.frozen = true;\n });\n } else {\n\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\n unpinnedCols.forEach(col => {\n let computedWidth: number;\n\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\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\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 const numericWidth = parsed.type === 'fixed' ? parsed.value : 100;\n return {\n ...col,\n width: numericWidth,\n zIndex: baseLeftZ + i\n };\n });\n\n const baseRightZ = 11;\n const rightPinnedCols = rawRightPinnedCols.map((col, i) => {\n const parsed = parseWidth(getColWidth(col));\n const numericWidth = parsed.type === 'fixed' ? parsed.value : 100;\n return {\n ...col,\n width: numericWidth,\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\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: pinnedTopRows.length,\n pinnedBottomRowsLength: pinnedBottomRows.length,\n unpinnedRowsLength: unpinnedRows.length\n };\n }, [\n rowHeight,\n pagination,\n paginatedUnpinnedRows,\n sortedUnpinnedRows,\n expandedRowIds,\n getDetailPanelHeight,\n pinnedTopRows.length,\n pinnedBottomRows.length,\n expandedRowIds,\n getDetailPanelHeight,\n pinnedTopRows.length,\n pinnedBottomRows.length,\n visibleOrderedColumns,\n pinnedColumns,\n columnWidths,\n state.dimensions.viewportWidth,\n checkboxSelection,\n hasDetailPanel,\n rowReordering,\n pinCheckboxColumn,\n pinExpandColumn,\n autoHeight,\n paginationMode,\n state.dataSource.loading,\n effectivePaginationModel.pageSize\n ]);\n\n const virtualization = useMemo(() => {\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 scrollLeft = state.virtualization.scrollLeft;\n const scrollTop = state.virtualization.scrollTop;\n const viewportWidth = state.dimensions.viewportWidth || 1000;\n const viewportHeight = autoHeight ? (pinnedTopHeight + unpinnedRowsHeight + pinnedBottomHeight + 50) : (state.dimensions.viewportHeight || 600);\n\n const overscanCols = 6;\n\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) {\n low = mid + 1;\n } else {\n high = mid - 1;\n }\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: any[] = [\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) {\n rLow = mid + 1;\n } else {\n rHigh = mid - 1;\n }\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 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: (rowReordering ? 48 : 0) + (hasDetailPanel && pinExpandColumn ? 48 : 0) + (checkboxSelection && pinCheckboxColumn ? 48 : 0)\n }\n };\n }, [\n layout,\n state.virtualization.scrollTop,\n state.virtualization.scrollLeft,\n state.dimensions.viewportHeight,\n state.dimensions.viewportWidth,\n autoHeight\n ]);\n\n const handleScroll = useCallback((event: React.UIEvent<HTMLDivElement>) => {\n const target = event.currentTarget;\n setScroll(target.scrollTop, target.scrollLeft);\n\n if (onRowsScrollEnd) {\n const { scrollTop, scrollHeight, clientHeight } = target;\n const scrollThreshold = 100;\n\n if (scrollHeight - scrollTop - clientHeight < scrollThreshold) {\n\n onRowsScrollEnd({\n visibleTop: scrollTop,\n visibleBottom: scrollTop + clientHeight,\n viewportHeight: clientHeight\n });\n }\n }\n }, [setScroll, onRowsScrollEnd]);\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]);\n\n const handleSelectAll = useCallback((isSelected: boolean) => {\n let newSelection: GridRowId[] = [];\n if (isSelected) {\n newSelection = baseRows.map(row => row.id);\n }\n\n if (!isSelectionControlled) {\n setInternalRowSelectionModel(newSelection);\n }\n onRowSelectionModelChange?.(newSelection);\n }, [rows, isSelectionControlled, onRowSelectionModelChange]);\n\n const handleSort = useCallback((field: string, direction: GridSortDirection) => {\n const newSortModel = direction ? [{ field, sort: direction }] : [];\n\n if (!isSortControlled) {\n setInternalSortModel(newSortModel as any);\n }\n onSortModelChange?.(newSortModel as any);\n }, [isSortControlled, onSortModelChange]);\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]);\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 = useMemo(() => {\n const { firstRowIndex, lastRowIndex } = virtualization.renderContext;\n\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 + (pagination ? paginatedUnpinnedRows.length : sortedUnpinnedRows.length) + index\n }));\n\n const centerStartIndex = Math.max(0, firstRowIndex - topPinnedCount);\n const centerEndIndex = Math.min(\n pagination ? paginatedUnpinnedRows.length : sortedUnpinnedRows.length,\n lastRowIndex - topPinnedCount + 1\n );\n\n const centerRows = (pagination ? paginatedUnpinnedRows : sortedUnpinnedRows)\n .slice(centerStartIndex, centerEndIndex)\n .map((row, index) => ({\n row,\n rowIndex: topPinnedCount + centerStartIndex + index\n }));\n\n const combined = [...topPinned, ...centerRows, ...bottomPinned];\n\n const seenIds = new Set<GridRowId>();\n const deduplicated = combined.filter(item => {\n if (seenIds.has(item.row.id)) {\n return false;\n }\n seenIds.add(item.row.id);\n return true;\n });\n\n return deduplicated;\n }, [virtualization.renderContext, pinnedTopRows, pinnedBottomRows, paginatedUnpinnedRows, sortedUnpinnedRows, pagination,\n paginationMode, state.dataSource.loading, effectivePaginationModel.pageSize, rowHeight]);\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 handleFocus = useCallback((event: React.FocusEvent<HTMLDivElement>) => {\n\n if (event.target === event.currentTarget) {\n setFocusedCell(prev => {\n if (prev) return prev;\n\n if (checkboxSelection) {\n return { id: 'HEADER', field: '__checkbox_col__' };\n }\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]);\n\n const handleBlur = useCallback((event: React.FocusEvent<HTMLDivElement>) => {\n\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\n const isEditing = Boolean(editingHandlers.editingCell);\n\n if (event.key === 'Enter') {\n event.preventDefault();\n if (isEditing) {\n editingHandlers.stopCellEdit();\n } else {\n\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({\n id,\n field,\n value: (row as any)[field]\n });\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 (id === 'HEADER' && (event.key === 'Enter' || event.key === ' ')) {\n event.preventDefault();\n\n const col = navigationColumns.find(c => c.field === field);\n if (col && (col as any).sortable !== false) {\n const currentSort = sortModel.find(item => item.field === 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 handleSort(field, newDirection);\n }\n return;\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') {\n return;\n }\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 // Find the next FOCUSABLE cell (any cell — editability not required for arrow navigation)\n const findNextCell = (\n startRow: number,\n startCol: number,\n deltaRow: number,\n deltaCol: number,\n wrapRow: boolean,\n allowHeader: boolean = 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 // Find the next EDITABLE cell (for Tab key navigation)\n const findNextEditable = (\n startRow: number,\n startCol: number,\n deltaRow: number,\n deltaCol: number,\n wrapRow: boolean,\n allowHeader: boolean = false\n ) => {\n let r = startRow;\n let c = startCol;\n let steps = 0;\n\n const maxSteps = allRenderableRows.length * navigationColumns.length + navigationColumns.length;\n\n while (steps < maxSteps) {\n steps++;\n\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 as any).sortable !== false;\n const isInteractive = ['__checkbox_col__'].includes(col.field) || isSortable;\n if (isInteractive) return { r, c };\n continue;\n }\n\n const row = allRenderableRows[r];\n const col = navigationColumns[c];\n\n const isInteractable = ['__checkbox_col__', '__expand_col__', '__reorder_col__'].includes(col.field);\n let isEditable = col.editable || isInteractable;\n\n if (isCellEditable && !isInteractable) {\n try {\n isEditable = isCellEditable({\n row,\n field: col.field,\n value: (row as any)[col.field],\n colDef: col,\n rowIndex: r,\n colIndex: c\n });\n } catch (e) {\n console.error('Error in isCellEditable:', e);\n }\n }\n\n if (isEditable) 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 // Tab moves to next EDITABLE cell\n const dir = event.shiftKey ? -1 : 1;\n const res = findNextEditable(rowIndex, colIndex, 0, dir, true, false);\n if (res) {\n nextRowIndex = res.r;\n nextColIndex = res.c;\n handled = true;\n }\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 if (event.ctrlKey || event.metaKey) {\n nextRowIndex = -1;\n nextColIndex = 0;\n } else {\n nextColIndex = 0;\n }\n handled = true;\n } else if (event.key === 'End') {\n if (event.ctrlKey || event.metaKey) {\n nextRowIndex = allRenderableRows.length - 1;\n nextColIndex = navigationColumns.length - 1;\n } else {\n nextColIndex = navigationColumns.length - 1;\n }\n handled = true;\n } else if (event.key === 'PageUp') {\n const pageSize = pagination ? effectivePaginationModel.pageSize : 10;\n nextRowIndex = Math.max(-1, nextRowIndex - pageSize);\n handled = true;\n } else if (event.key === 'PageDown') {\n const pageSize = pagination ? effectivePaginationModel.pageSize : 10;\n nextRowIndex = Math.min(allRenderableRows.length - 1, nextRowIndex + pageSize);\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 const nextRow = allRenderableRows[nextRowIndex];\n setFocusedCell({ id: nextRow.id, field: nextCol.field });\n }\n\n if (viewportRef.current) {\n const { cumulativeHeights, pinnedTopHeight } = virtualization;\n const { clientHeight, clientWidth, scrollTop, scrollLeft } = viewportRef.current;\n\n const rowTop = nextRowIndex === 0 ? 0 : cumulativeHeights[nextRowIndex - 1];\n const rowBottom = cumulativeHeights[nextRowIndex];\n const pinnedOffset = pinnedTopHeight;\n const visibleTop = scrollTop + pinnedOffset;\n const visibleBottom = scrollTop + clientHeight;\n\n let newScrollTop = scrollTop;\n if (rowTop < visibleTop) {\n newScrollTop = Math.max(0, rowTop - pinnedOffset);\n } else if (rowBottom > visibleBottom) {\n newScrollTop = rowBottom - clientHeight;\n }\n\n if (newScrollTop !== scrollTop) {\n viewportRef.current.scrollTop = newScrollTop;\n }\n\n if (virtualization.columnMetrics) {\n const { leftPinnedWidth, rightPinnedWidth, unpinnedAccWidths, unpinnedCols, totalSpecialsWidth, pinnedSpecialsWidth } = virtualization.columnMetrics;\n const field = nextCol.field;\n const unpinnedIndex = unpinnedCols.findIndex((c: any) => c.field === 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\n const visibleStart = scrollLeft + pinnedSpecialsWidth + leftPinnedWidth;\n const visibleEnd = scrollLeft + clientWidth - rightPinnedWidth;\n\n let newScrollLeft = scrollLeft;\n\n if (colLeft < visibleStart) {\n newScrollLeft = Math.max(0, colLeft - pinnedSpecialsWidth - leftPinnedWidth);\n } else if (colRight > visibleEnd) {\n newScrollLeft = colRight - clientWidth + rightPinnedWidth;\n }\n\n if (newScrollLeft !== scrollLeft) {\n viewportRef.current.scrollLeft = newScrollLeft;\n }\n }\n }\n }\n }\n }\n }, [focusedCell, allRenderableRows, navigationColumns, editingHandlers, virtualization, selectedRowIds, handleSelectionChange, handleDetailPanelToggle]);\n\n const hasRowSpanning = React.useMemo(() => effectiveColumns.some(c => !!c.rowSpan), [effectiveColumns]);\n const [columnsPanelOpen, setColumnsPanelOpen] = React.useState(false);\n const containerRef = React.useRef<HTMLDivElement>(null);\n\n // Click-outside handler for standalone column panel\n useEffect(() => {\n if (!columnsPanelOpen || slots?.toolbar) return;\n function handleClickOutside(e: MouseEvent) {\n const panel = document.getElementById('ogx-standalone-col-panel');\n if (panel && !panel.contains(e.target as Node)) {\n setColumnsPanelOpen(false);\n }\n }\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [columnsPanelOpen, slots?.toolbar]);\n\n return (\n <div\n ref={containerRef}\n className={['ogx', className, autoHeight && 'ogx--auto-height', hasRowSpanning && 'ogx--row-spanning', listView && 'ogx--list-view'].filter(Boolean).join(' ')}\n style={{\n ...style,\n height: height ?? style?.height,\n '--ogx-row-height': `${rowHeight}px`,\n '--ogx-header-height': `${headerHeight}px`\n } as any}\n aria-busy={effectiveLoading}\n >\n { }\n {slots?.toolbar && (() => {\n const toolbarProps = {\n apiRef: gridData.apiRef,\n columns: effectiveColumns as unknown as GridColDef[],\n baseColumns: columns as unknown as GridColDef[],\n aggregationModel,\n onAggregationModelChange: handleAggregationModelChange,\n\n ...(pivotMode || propPivotModel || onPivotModelChange ? {\n pivotModel: currentPivotModel,\n onPivotModelChange: handlePivotModelChange,\n } : {}),\n\n filterModel,\n onFilterModelChange,\n columnVisibilityModel,\n onColumnVisibilityModelChange: handleColumnVisibilityModelChange,\n\n onColumnReorder: disableColumnReorder ? undefined : (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); if (col) onColumnOrderChange?.({ oldIndex: fromIdx, targetIndex: toIdx, column: col as any });\n },\n\n forceColumnsOpen: columnsPanelOpen,\n onColumnsPanelClose: () => setColumnsPanelOpen(false),\n\n ...slotProps?.toolbar,\n };\n return <StableToolbar {...toolbarProps} />;\n })()}\n\n {/* Fallback standalone column panel when no toolbar is present */}\n {!slots?.toolbar && columnsPanelOpen && ReactDOM.createPortal(\n <div\n id=\"ogx-standalone-col-panel\"\n style={(() => {\n const rect = containerRef.current?.getBoundingClientRect();\n return {\n position: 'fixed',\n top: rect ? rect.top + 8 : 16,\n right: rect ? window.innerWidth - rect.right + 8 : 16,\n zIndex: 9999,\n display: 'inline-block',\n };\n })()}\n >\n <button\n onClick={() => setColumnsPanelOpen(false)}\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\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 handleColumnVisibilityModelChange({ ...columnVisibilityModel, [field]: isVisible });\n }}\n onShowAll={() => {\n const next = { ...columnVisibilityModel };\n effectiveColumns.forEach(col => { if (col.hideable !== false) next[col.field] = true; });\n handleColumnVisibilityModelChange(next);\n }}\n onHideAll={() => {\n const next = { ...columnVisibilityModel };\n effectiveColumns.forEach(col => { if (col.hideable !== false) next[col.field] = false; });\n handleColumnVisibilityModelChange(next);\n }}\n onColumnReorder={disableColumnReorder ? undefined : (fromField, toField) => {\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) {\n setInternalColumnOrder(newOrder);\n }\n onColumnOrderChange?.({ oldIndex: fromIdx, targetIndex: toIdx, column: effectiveColumns.find(c => c.field === fromField) as any });\n }}\n />\n </div>,\n containerRef.current?.closest('.ogx-theme-provider') || document.body\n )}\n\n {/* ═══════════════════════════════════════════════════════════════\n LIST VIEW — single-column card layout\n ═══════════════════════════════════════════════════════════════ */}\n {listView && listViewColumn && (\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 {/* Info bar */}\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 {/* Scrollable rows — pagination stays OUTSIDE this div */}\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 as R}\n rowIndex={idx}\n listViewColumn={listViewColumn as any}\n isSelected={selectedRowIds.has(row.id)}\n checkboxSelection={checkboxSelection}\n rowHeight={rowHeight}\n onRowClick={(r) => handleRowClick({ row: r, id: r.id, rowIndex: idx })}\n onSelectionChange={handleSelectionChange}\n />\n ))\n )}\n </div>\n\n {/* Pagination in list view — use filteredRows.length as total since state.pagination.rowCount is only set for server-side */}\n {pagination && (() => {\n const PaginationComponent = slots?.pagination || Pagination;\n const totalRowCount = (paginationMode === 'server' && dataSource)\n ? (state.pagination.rowCount || 0)\n : filteredRows.length;\n const paginationProps = {\n page: effectivePaginationModel.page,\n pageSize: effectivePaginationModel.pageSize,\n rowCount: totalRowCount,\n pageSizeOptions: pageSizeOptions,\n onPageChange: (newPage: number) => handlePaginationModelChange({ ...effectivePaginationModel, page: newPage }),\n onPageSizeChange: (newPageSize: number) => handlePaginationModelChange({ ...effectivePaginationModel, pageSize: newPageSize, page: 0 }),\n ...slotProps?.pagination\n };\n return <PaginationComponent {...paginationProps} />;\n })()}\n </div>\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 as any}\n columnGroupingModel={columnGroupingModel}\n checkboxSelection={checkboxSelection}\n allSelected={allSelected}\n someSelected={someSelected}\n onSelectAll={handleSelectAll}\n sortModel={sortModel}\n onSort={handleSort}\n\n onColumnResize={handleColumnResize}\n columnWidths={columnWidths}\n pinnedColumns={pinnedColumns}\n\n focusedCell={focusedCell}\n onHeaderClick={(field) => {\n setFocusedCell({ id: 'HEADER', field });\n setKeyboardMode(false);\n gridRef.current?.focus({ preventScroll: true });\n }}\n onDragStart={columnGroupingModel ? undefined : columnReorderHandlers.onDragStart}\n onDragOver={columnGroupingModel ? undefined : columnReorderHandlers.onDragOver}\n onDragEnd={columnGroupingModel ? undefined : columnReorderHandlers.onDragEnd}\n onDrop={columnGroupingModel ? undefined : columnReorderHandlers.onDrop}\n draggedColumn={columnGroupingModel ? undefined : columnReorderHandlers.draggedColumn}\n dragOverColumn={columnGroupingModel ? undefined : columnReorderHandlers.dragOverColumn}\n rowReordering={rowReordering}\n hasDetailPanel={hasDetailPanel}\n pinCheckboxColumn={pinCheckboxColumn}\n pinExpandColumn={pinExpandColumn}\n aggregationModel={aggregationModel}\n onHideColumn={(field) => {\n handleColumnVisibilityModelChange({\n ...columnVisibilityModel,\n [field]: false,\n });\n }}\n onManageColumns={() => setColumnsPanelOpen(true)}\n onPinColumn={(field, side) => {\n const left = [...(pinnedColumns?.left ?? [])];\n const right = [...(pinnedColumns?.right ?? [])];\n\n const cleanLeft = left.filter(f => f !== field);\n const cleanRight = right.filter(f => f !== field);\n if (side === 'left') {\n handlePinnedColumnsChange({ left: [...cleanLeft, field], right: cleanRight });\n } else if (side === 'right') {\n handlePinnedColumnsChange({ left: cleanLeft, right: [...cleanRight, field] });\n } else {\n handlePinnedColumnsChange({ left: cleanLeft, right: cleanRight });\n }\n }}\n />\n\n {/* Empty State Overlay (Standard View) — showing after header */}\n {!effectiveLoading && !state.dataSource.error && filteredRows.length === 0 && (\n <div className=\"ogx__empty\" style={{ width: virtualization.totalWidth }}>\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 { }\n {pinnedTopRows.length > 0 && (\n <div className=\"ogx__pinned-rows ogx__pinned-rows--top\" role=\"rowgroup\">\n {pinnedTopRows.map((row, index) => (\n <Row\n key={row.id}\n row={row}\n columns={virtualization.virtualColumns}\n rowIndex={index}\n isSelected={selectedRowIds.has(row.id)}\n checkboxSelection={checkboxSelection}\n onRowClick={handleRowClick}\n onCellClick={handleCellClick}\n onSelectionChange={handleSelectionChange}\n columnWidths={columnWidths}\n pinnedColumns={pinnedColumns}\n pinnedRows={pinnedRows}\n\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={handleDetailPanelToggle}\n pinCheckboxColumn={pinCheckboxColumn}\n pinExpandColumn={pinExpandColumn}\n\n focusedCellField={focusedCell?.id === row.id ? focusedCell.field : null}\n\n colspanMap={spanning.colspanMap}\n rowSpanningCaches={spanning.rowSpanningState.caches}\n rowHeight={rowHeight}\n />\n ))}\n </div>\n )}\n\n { }\n <div\n className=\"ogx__virtual-container\"\n style={{\n height: `${virtualization.totalHeight - virtualization.pinnedTopHeight - virtualization.pinnedBottomHeight}px`\n }}\n role=\"presentation\"\n >\n { }\n <div\n className=\"ogx__rows\"\n style={{\n transform: `translateY(${virtualization.renderContext.firstRowIndex * rowHeight}px)`\n }}\n role=\"rowgroup\"\n >\n {effectiveLoading && visibleRows.length === 0 ? (\n\n (() => {\n\n const skeletonColumns = columns.length > 0\n ? columns\n : (() => {\n\n const availableWidth = (state.dimensions.viewportWidth || 1000) -\n (checkboxSelection ? 48 : 0) -\n (getDetailPanelContent ? 48 : 0) -\n (rowReordering ? 48 : 0);\n\n const columnWidth = 150;\n const columnCount = Math.max(1, Math.ceil(availableWidth / columnWidth));\n\n return Array.from({ length: columnCount }, (_, i) => ({\n field: `placeholder_${i}`,\n headerName: '',\n width: columnWidth\n }));\n })();\n\n return Array.from({ length: 10 }).map((_, index) => (\n <SkeletonRow\n key={`skeleton-${index}`}\n columns={skeletonColumns}\n rowHeight={rowHeight}\n checkboxSelection={checkboxSelection}\n hasDetailPanel={!!getDetailPanelContent}\n rowReordering={rowReordering}\n />\n ));\n })()\n ) : (\n visibleRows\n .filter(({ row }) => !isRowPinned(row.id, pinnedRows))\n // Defensive deduplication to prevent React key collision\n .filter((item, index, self) =>\n index === self.findIndex(t => t.row.id === item.row.id)\n )\n .map(({ row, rowIndex: actualIndex }) => {\n return (\n <Row\n key={`${row.id}-${virtualization.totalWidth}`}\n row={row}\n columns={virtualization.virtualColumns}\n rowIndex={actualIndex}\n isSelected={selectedRowIds.has(row.id)}\n checkboxSelection={checkboxSelection}\n onRowClick={handleRowClick}\n onCellClick={handleCellClick}\n onSelectionChange={handleSelectionChange}\n columnWidths={columnWidths}\n pinnedColumns={pinnedColumns}\n pinnedRows={pinnedRows}\n // Detail Panel\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={handleDetailPanelToggle}\n pinCheckboxColumn={pinCheckboxColumn}\n pinExpandColumn={pinExpandColumn}\n // Row Reordering\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 // Editing\n editingCell={editingHandlers.editingCell}\n onEditStart={editingHandlers.startCellEdit}\n onEditStop={editingHandlers.stopCellEdit}\n onEditCellValueChange={editingHandlers.setEditCellValue}\n // Focus\n focusedCellField={focusedCell != null && focusedCell.id === row.id ? focusedCell.field : null}\n // Spanning\n colspanMap={spanning.colspanMap}\n rowSpanningCaches={spanning.rowSpanningState.caches}\n rowHeight={rowHeight}\n />\n );\n })\n )}\n\n {/* Infinite Scroll Skeletons (Inline with flow, inside translateY container) */}\n {paginationMode === 'infinite' && state.dataSource.loading && sortedUnpinnedRows.length > 0 && (() => {\n const skeletonCount = Math.min(effectivePaginationModel.pageSize, 20);\n // The virtual container translates its children down by `firstRowIndex * rowHeight`. \n // Since these skeletons are at the VERY BOTTOM of all rows, their actual array index\n // is precisely after the last real row.\n const startIdx = layout.unpinnedRowsLength;\n\n // However, they are rendered INSIDE the translateY block. The real rows handled this nicely\n // because they just layout one after another. Skeletons can do exactly the same, EXCEPT we might\n // need to offset them so they sit at the bottom.\n return (\n <div className=\"ogx__skeleton-group\">\n {Array.from({ length: skeletonCount }).map((_, i) => (\n <Row\n key={`__skeleton_${i}__`}\n row={{ id: `__skeleton_${i}__`, _isSkeleton: true } as any}\n columns={virtualization.virtualColumns}\n rowIndex={startIdx + i}\n rowHeight={rowHeight}\n />\n ))}\n </div>\n );\n })()}\n </div>\n\n </div>\n\n {/* Pinned Bottom Rows */}\n {pinnedBottomRows.length > 0 && (\n <div className=\"ogx__pinned-rows ogx__pinned-rows--bottom\" role=\"rowgroup\">\n {pinnedBottomRows.map((row, index) => (\n <Row\n key={row.id}\n row={row}\n columns={virtualization.virtualColumns}\n rowIndex={index}\n isSelected={selectedRowIds.has(row.id)}\n checkboxSelection={checkboxSelection}\n onRowClick={handleRowClick}\n onCellClick={handleCellClick}\n onSelectionChange={handleSelectionChange}\n columnWidths={columnWidths}\n pinnedColumns={pinnedColumns}\n pinnedRows={pinnedRows}\n // Detail Panel\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={handleDetailPanelToggle}\n pinCheckboxColumn={pinCheckboxColumn}\n pinExpandColumn={pinExpandColumn}\n // Focus\n focusedCellField={focusedCell?.id === row.id ? focusedCell.field : null}\n // Spanning\n colspanMap={spanning.colspanMap}\n rowSpanningCaches={spanning.rowSpanningState.caches}\n rowHeight={rowHeight}\n />\n ))}\n </div>\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 <div\n className=\"ogx__aggregation-footer\"\n role=\"row\"\n aria-label=\"Aggregation totals\"\n aria-live=\"polite\"\n style={{\n minHeight: `${rowHeight}px`\n }}\n >\n {checkboxSelection && (\n <div style={{ width: 48, flexShrink: 0 }} />\n )}\n {hasDetailPanel && (\n <div style={{ width: 48, flexShrink: 0 }} />\n )}\n {rowReordering && (\n <div style={{ width: 48, flexShrink: 0 }} />\n )}\n {orderedColumns.map((col) => {\n const fnName = (aggregationModel as Record<string, string>)[col.field];\n const rawValue = aggregationResult[col.field];\n const colWidth = columnWidths[col.field] ?? (typeof col.width === 'number' ? col.width : 120);\n\n return (\n <div\n key={col.field}\n className=\"ogx__aggregation-cell\"\n role=\"gridcell\"\n style={{\n width: colWidth,\n minWidth: colWidth,\n maxWidth: colWidth,\n textAlign: (col.align as React.CSSProperties['textAlign']) || 'left',\n }}\n >\n {fnName ? (\n <>\n <span className=\"ogx__aggregation-label\">\n {fnName}\n </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 </div>\n </div>\n )}\n\n {/* Pagination — shared between grid and list view when not inside list view block */}\n {!listView && pagination && (() => {\n const PaginationComponent = slots?.pagination || Pagination;\n const paginationProps = {\n page: effectivePaginationModel.page,\n pageSize: effectivePaginationModel.pageSize,\n rowCount: state.pagination.rowCount,\n pageSizeOptions: pageSizeOptions,\n onPageChange: (newPage: number) => handlePaginationModelChange({ ...effectivePaginationModel, page: newPage }),\n onPageSizeChange: (newPageSize: number) => handlePaginationModelChange({ ...effectivePaginationModel, pageSize: newPageSize, page: 0 }),\n ...slotProps?.pagination\n };\n\n return <PaginationComponent {...paginationProps} />;\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.message || 'Unknown error'}` : ''}\n {!loading && !state.dataSource.error && (\n filteredRows.length === 0\n ? noRowsLabel\n : (filterModel && ((filterModel.quickFilterValues?.length || 0) > 0 || (filterModel.items?.length || 0) > 0))\n ? `${filteredRows.length} ${filteredRows.length === 1 ? 'row' : 'rows'} found`\n : ''\n )}\n </div>\n\n {state.dataSource.error && (\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 {state.dataSource.error.message || 'An unexpected error occurred while loading the data.'}\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 </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, useRef, useState } from 'react';\nimport type {\n GridFilterModel,\n GridFilterItem,\n GridColDef,\n GridFilterOperator\n} from '../../types';\nimport { getOperatorsForType } from '../../utils/filtering';\n\n\ninterface FilterPanelProps {\n filterModel: GridFilterModel;\n columns: GridColDef[];\n onFilterModelChange: (model: GridFilterModel) => void;\n}\n\nconst NO_VALUE_OPERATORS = new Set(['isEmpty', 'isNotEmpty']);\n\nfunction getActiveFilter(items: GridFilterItem[], field: string): GridFilterItem | undefined {\n return items.find(item => 'field' in item && item.field === field) as GridFilterItem | undefined;\n}\n\nconst FilterRow: React.FC<{\n col: GridColDef;\n item: GridFilterItem | undefined;\n onChange: (item: GridFilterItem | null) => void;\n}> = ({ col, item, onChange }) => {\n const operators = getOperatorsForType(col.type);\n const isActive = !!item;\n const currentOperator = item?.operator ?? operators[0];\n\n // Local input state to prevent full filter-panel re-render on every keystroke\n const [localValue, setLocalValue] = useState(item?.value ?? '');\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\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 ?? '');\n }\n }, [item?.value]);\n\n // Debounce propagating the value upward (300ms)\n useEffect(() => {\n const handler = setTimeout(() => {\n const currentValue = item?.value ?? '';\n if (localValue !== currentValue) {\n onChangeRef.current({\n id: item?.id ?? `${col.field}-${Date.now()}`,\n field: col.field,\n operator: currentOperator as GridFilterOperator,\n value: localValue,\n });\n }\n }, 300);\n return () => clearTimeout(handler);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [localValue]);\n\n const handleOperatorChange = (op: string) => {\n const noValue = NO_VALUE_OPERATORS.has(op);\n const newItem: GridFilterItem = {\n id: item?.id ?? `${col.field}-${Date.now()}`,\n field: col.field,\n operator: op as GridFilterOperator,\n value: noValue ? undefined : (item?.value ?? (col.type === 'boolean' ? 'true' : '')),\n };\n onChange(newItem);\n };\n\n const handleClear = () => {\n setLocalValue('');\n onChange(null);\n };\n\n const isNoValue = NO_VALUE_OPERATORS.has(String(currentOperator));\n const isBoolean = col.type === 'boolean';\n const showValue = !isNoValue;\n\n return (\n <div className={`ogx-filter__row${isActive ? ' ogx-filter__row--active' : ''}`}>\n { }\n <span className=\"ogx-filter__col-label\" title={col.field}>\n {col.headerName || col.field}\n </span>\n\n { }\n <div className=\"ogx-filter__controls\">\n { }\n <select\n id={`ogx-filter-op-${col.field}`}\n name={`filter-op-${col.field}`}\n className={`ogx-filter__op-select${isActive ? ' ogx-filter__op-select--active' : ''}`}\n value={String(currentOperator)}\n onChange={(e) => handleOperatorChange(e.target.value)}\n aria-label={`Filter operator for ${col.headerName || col.field}`}\n >\n {operators.map(op => (\n <option key={op} value={op}>{op}</option>\n ))}\n </select>\n\n { }\n {showValue && isBoolean && (\n <select\n id={`ogx-filter-val-${col.field}`}\n name={`filter-val-${col.field}`}\n className={`ogx-filter__value-input ogx-filter__value-select${isActive ? ' ogx-filter__value-input--active' : ''}`}\n value={String(item?.value ?? 'true')}\n onChange={(e) => {\n setLocalValue(e.target.value);\n onChange({\n id: item?.id ?? `${col.field}-${Date.now()}`,\n field: col.field,\n operator: currentOperator as GridFilterOperator,\n value: e.target.value,\n });\n }}\n aria-label={`Filter value for ${col.headerName || col.field}`}\n >\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n )}\n\n {showValue && !isBoolean && (\n <input\n id={`ogx-filter-val-${col.field}`}\n name={`filter-val-${col.field}`}\n className={`ogx-filter__value-input${isActive ? ' ogx-filter__value-input--active' : ''}`}\n type=\"text\"\n value={localValue}\n onChange={(e) => setLocalValue(e.target.value)}\n placeholder={col.type === 'number' ? 'Number…' : 'Value…'}\n aria-label={`Filter value for ${col.headerName || col.field}`}\n />\n )}\n\n {/* Clear button — only when active */}\n {isActive && (\n <button\n className=\"ogx-filter__row-clear\"\n onClick={handleClear}\n aria-label={`Clear filter for ${col.headerName || col.field}`}\n title=\"Clear\"\n >\n ×\n </button>\n )}\n </div>\n </div>\n );\n};\n\n// ── Root panel ────────────────────────────────────────────────────────────────\n\nexport const FilterPanel: React.FC<FilterPanelProps> = ({ filterModel, columns, onFilterModelChange }) => {\n const items: GridFilterItem[] = (filterModel.items ?? []) as GridFilterItem[];\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, 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\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, anchorRef.current?.closest('.ogx-theme-provider') || document.body);\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 onChangeRef.current = onChange;\n // Track the last value we emitted upward\n const lastEmittedRef = useRef(value);\n // Track the last incoming prop value to detect external resets\n const lastIncomingValueRef = useRef(value);\n // Track whether input was focused BEFORE a re-render so we can restore it\n const wasFocusedRef = useRef(false);\n\n // ── Focus preservation across re-renders ─────────────────────────────────\n // When the parent updates filterModel (triggered by our debounce), React\n // re-renders the entire tree. Even though the input element stays mounted,\n // the browser can lose focus during heavy reconciliation. We detect this\n // via useLayoutEffect (runs synchronously after DOM mutations, before paint)\n // and immediately restore focus without any visual flicker.\n useLayoutEffect(() => {\n if (wasFocusedRef.current && document.activeElement !== inputRef.current) {\n inputRef.current?.focus();\n }\n });\n\n // ── External reset detection ──────────────────────────────────────────────\n // Only responds when the PARENT programmatically changes the value\n // (e.g. \"Clear all filters\" button) — not from our own typing.\n useEffect(() => {\n if (value === lastIncomingValueRef.current) return;\n lastIncomingValueRef.current = value;\n\n if (value !== lastEmittedRef.current) {\n setLocalValue(value);\n lastEmittedRef.current = value;\n if (!value) {\n wasFocusedRef.current = false;\n setIsExpanded(false);\n } else {\n setIsExpanded(true);\n }\n }\n }, [value]);\n\n // ── Debounced upward notification ─────────────────────────────────────────\n useEffect(() => {\n const handler = setTimeout(() => {\n if (localValue !== lastEmittedRef.current) {\n lastEmittedRef.current = localValue;\n onChangeRef.current(localValue);\n }\n }, debounceMs);\n return () => clearTimeout(handler);\n }, [localValue, debounceMs]);\n\n const handleExpand = useCallback(() => {\n setIsExpanded(true);\n requestAnimationFrame(() => inputRef.current?.focus());\n }, []);\n\n const handleClear = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n setLocalValue('');\n lastEmittedRef.current = '';\n onChangeRef.current('');\n inputRef.current?.focus();\n }, []);\n\n const handleFocus = useCallback(() => {\n wasFocusedRef.current = true;\n setIsExpanded(true);\n }, []);\n\n // Blur: defer 150ms to allow focus to move within the container first\n // (e.g. clicking the clear button) before deciding to collapse.\n const handleBlur = useCallback(() => {\n wasFocusedRef.current = false;\n setTimeout(() => {\n if (\n containerRef.current &&\n document.activeElement &&\n containerRef.current.contains(document.activeElement)\n ) {\n // Focus is still inside — mark as focused again and abort\n wasFocusedRef.current = true;\n return;\n }\n if (!localValue) {\n setIsExpanded(false);\n }\n }, 150);\n }, [localValue]);\n\n // ── Click outside ─────────────────────────────────────────────────────────\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n if (!localValue) {\n setIsExpanded(false);\n }\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [localValue]);\n\n return (\n <div\n ref={containerRef}\n className={`ogx-global-search${isExpanded ? ' ogx-global-search--expanded' : ''}`}\n onClick={!isExpanded ? handleExpand : undefined}\n >\n <div className=\"ogx-global-search__icon-wrapper\">\n <SearchIcon />\n </div>\n <input\n ref={inputRef}\n id=\"ogx-global-search-input\"\n name=\"ogx-global-search\"\n className=\"ogx-global-search__input\"\n value={localValue}\n onChange={(e) => setLocalValue(e.target.value)}\n onFocus={handleFocus}\n onBlur={handleBlur}\n placeholder={placeholder}\n aria-label=\"Global Search\"\n autoComplete=\"off\"\n />\n {localValue && (\n <button className=\"ogx-global-search__clear\" onClick={handleClear} aria-label=\"Clear search\">\n <CloseIcon />\n </button>\n )}\n </div>\n );\n}\n","import { useState, useRef, useLayoutEffect, useCallback } from 'react';\nimport ReactDOM from 'react-dom';\nimport './Tooltip.css';\n\ninterface GridTooltipProps {\n title: React.ReactNode;\n children: React.ReactElement;\n placement?: 'top' | 'bottom' | 'left' | 'right';\n enterDelay?: number;\n leaveDelay?: number;\n}\n\nexport function GridTooltip({\n title,\n children,\n placement = 'top',\n enterDelay = 200,\n leaveDelay = 0\n}: GridTooltipProps) {\n const [open, setOpen] = useState(false);\n const [coords, setCoords] = useState({ top: 0, left: 0 });\n const timerRef = useRef<NodeJS.Timeout | null>(null);\n const childRef = useRef<HTMLElement | null>(null);\n\n const updateCoords = useCallback(() => {\n if (!childRef.current) return;\n const rect = childRef.current.getBoundingClientRect();\n\n let t = 0;\n let l = 0;\n\n // Note: These calculations are for positioning absolute relative to document.body\n const scrollX = window.pageXOffset || document.documentElement.scrollLeft;\n const scrollY = window.pageYOffset || document.documentElement.scrollTop;\n\n if (placement === 'top') {\n t = rect.top + scrollY - 8;\n l = rect.left + scrollX + rect.width / 2;\n } else if (placement === 'bottom') {\n t = rect.bottom + scrollY + 8;\n l = rect.left + scrollX + rect.width / 2;\n }\n\n setCoords({ top: t, left: l });\n }, [placement]);\n\n useLayoutEffect(() => {\n if (open) {\n updateCoords();\n window.addEventListener('scroll', updateCoords, true);\n window.addEventListener('resize', updateCoords);\n }\n return () => {\n window.removeEventListener('scroll', updateCoords, true);\n window.removeEventListener('resize', updateCoords);\n };\n }, [open, updateCoords]);\n\n const handleMouseEnter = () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => {\n setOpen(true);\n }, enterDelay);\n };\n\n const handleMouseLeave = () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => {\n setOpen(false);\n }, leaveDelay);\n };\n\n const wrapperRef = useCallback((node: HTMLSpanElement | null) => {\n // Use the first real child element for coordinates, not the wrapper span.\n // display:contents would give zero rects; inline-block wrapper gives correct rects\n // but we want coords from the actual child for pixel-perfect placement.\n childRef.current = node ? (node.firstElementChild as HTMLElement) ?? node : null;\n }, []);\n\n return (\n <>\n <span\n ref={wrapperRef}\n style={{ display: 'inline-block', lineHeight: 0 }}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {children}\n </span>\n {open && title && ReactDOM.createPortal(\n <div\n className={`ogx-tooltip ogx-tooltip--${placement}`}\n style={{\n top: coords.top,\n left: coords.left,\n position: 'absolute',\n zIndex: 99999\n }}\n >\n {title}\n </div>,\n document.body\n )}\n </>\n );\n}\n","import React, { useState, useRef, useEffect, useCallback } 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\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 forceColumnsOpen?: boolean;\n onColumnsPanelClose?: () => void;\n children?: React.ReactNode;\n rightContent?: React.ReactNode;\n style?: React.CSSProperties;\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<HTMLButtonElement | 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\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, anchorRef.current?.closest('.ogx-theme-provider') || document.body);\n}\n\nfunction ColumnsPanelWrapper({\n anchorRef,\n columns,\n visibleColumns,\n onVisibilityChange,\n onShowAll,\n onHideAll,\n onColumnReorder,\n onClose\n}: {\n anchorRef: React.RefObject<HTMLButtonElement | 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 onClose: () => void;\n}) {\n const panelRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState<PanelPosition>({ top: 0, right: 0 });\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 />\n </div>\n );\n\n return ReactDOM.createPortal(panel, anchorRef.current?.closest('.ogx-theme-provider') || document.body);\n}\n\nfunction FilterPanelWrapper({\n anchorRef,\n columns,\n filterModel,\n onFilterModelChange,\n onClose\n}: {\n anchorRef: React.RefObject<HTMLButtonElement | 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 onCloseRef.current = onClose;\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, anchorRef.current?.closest('.ogx-theme-provider') || document.body);\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 forceColumnsOpen,\n onColumnsPanelClose,\n children,\n rightContent,\n style,\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 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\" 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 <GlobalSearch\n value={searchValue}\n onChange={handleSearchChange}\n placeholder=\"Search...\"\n />\n </div>\n )}\n\n {/* Columns Button */}\n {onColumnVisibilityModelChange && (\n <div className=\"ogx-toolbar__dropdown-wrapper\" style={{ marginRight: 4 }}>\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 {colsOpen && (\n <ColumnsPanelWrapper\n anchorRef={colsButtonRef}\n columns={columns}\n visibleColumns={visibleColumns}\n onVisibilityChange={handleVisibilityChange}\n onShowAll={handleShowAllColumns}\n onHideAll={handleHideAllColumns}\n onColumnReorder={onColumnReorder}\n onClose={() => { setColsOpen(false); onColumnsPanelClose?.(); }}\n />\n )}\n </div>\n )}\n\n {/* Filters Button */}\n {onFilterModelChange && (\n <div className=\"ogx-toolbar__dropdown-wrapper\" style={{ marginRight: 4 }}>\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 {filterOpen && (\n <FilterPanelWrapper\n anchorRef={filterButtonRef}\n columns={columns}\n filterModel={filterModel || { items: [] }}\n onFilterModelChange={onFilterModelChange}\n onClose={() => setFilterOpen(false)}\n />\n )}\n </div>\n )}\n\n {/* Pivot button */}\n {onPivotModelChange && (\n <div className=\"ogx-toolbar__dropdown-wrapper\" style={{ marginRight: 4 }}>\n <GridTooltip title=\"Pivot\">\n <button\n ref={pivotButtonRef}\n id=\"ogx-pivot-btn\"\n className={`ogx-toolbar__icon-btn${pivotOpen ? ' ogx-toolbar__icon-btn--active' : ''}`}\n aria-label=\"Configure pivot\"\n aria-expanded={pivotOpen}\n aria-controls=\"ogx-pivot-panel\"\n onClick={() => {\n setPivotOpen(!pivotOpen);\n setAggOpen(false);\n setColsOpen(false);\n setFilterOpen(false);\n }}\n >\n <PivotIcon />\n {pivotActive && (\n <span className=\"ogx-toolbar__dot\" aria-label=\"Pivot active\" />\n )}\n </button>\n </GridTooltip>\n\n {pivotOpen && (\n <PivotPanel\n anchorRef={pivotButtonRef}\n columns={baseColumns ?? columns}\n model={currentPivotModel}\n onChange={(m) => { onPivotModelChange?.(m); }}\n onClose={() => setPivotOpen(false)}\n />\n )}\n </div>\n )}\n\n {/* Summaries button */}\n <div className=\"ogx-toolbar__dropdown-wrapper\" style={{ marginRight: 4 }}>\n <GridTooltip title=\"Summaries\">\n <button\n ref={aggButtonRef}\n id=\"ogx-aggregation-btn\"\n className={`ogx-toolbar__icon-btn${aggOpen ? ' ogx-toolbar__icon-btn--active' : ''}`}\n aria-label=\"Configure summaries\"\n aria-expanded={aggOpen}\n aria-controls=\"ogx-aggregation-panel\"\n onClick={() => {\n setAggOpen(!aggOpen);\n setPivotOpen(false);\n setColsOpen(false);\n setFilterOpen(false);\n }}\n >\n <SigmaIcon />\n {activeCount > 0 && (\n <span className=\"ogx-toolbar__dot\" aria-label={`${activeCount} active summaries`} />\n )}\n </button>\n </GridTooltip>\n\n {aggOpen && (\n <AggregationPanel\n anchorRef={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 {rightContent}\n </div>\n </div>\n );\n}\n","import { useRef } from 'react';\nimport type { GridApi } from '../../types';\n\n/**\n * Hook to create a ref for the DataGrid API.\n * This ref can be passed to the `apiRef` prop of the `DataGrid` component.\n */\nexport function useGridApiRef() {\n return useRef<GridApi>(null!);\n}\n","\nimport React from 'react';\n\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n fullWidth?: boolean;\n error?: boolean;\n startAdornment?: React.ReactNode;\n endAdornment?: React.ReactNode;\n}\n\nexport const Input: React.FC<InputProps> = ({\n fullWidth = false,\n error = false,\n startAdornment,\n endAdornment,\n className = '',\n ...props\n}) => {\n const wrapperClassNames = [\n 'ogx-input-wrapper',\n fullWidth && 'ogx-input-wrapper--full-width',\n error && 'ogx-input-wrapper--error',\n props.disabled && 'ogx-input-wrapper--disabled',\n className\n ].filter(Boolean).join(' ');\n\n return (\n <div className={wrapperClassNames}>\n {startAdornment && (\n <div className=\"ogx-input__adornment ogx-input__adornment--start\">\n {startAdornment}\n </div>\n )}\n <input\n className=\"ogx-input\"\n {...props}\n />\n {endAdornment && (\n <div className=\"ogx-input__adornment ogx-input__adornment--end\">\n {endAdornment}\n </div>\n )}\n </div>\n );\n};\n","\nimport type { GridColDef, GridRowModel, GridAggregationModel } from '../../types';\nimport { formatAggregationValue } from '../../hooks/features/useAggregation';\n\nexport interface CsvExportOptions {\n fileName?: string;\n includeHeaders?: boolean;\n delimiter?: string;\n selectedRows?: (string | number)[];\n aggregationResult?: Record<string, any> | null;\n aggregationModel?: GridAggregationModel | null;\n}\n\nexport function exportToCsv<R extends GridRowModel>(\n rows: R[],\n columns: GridColDef<R>[],\n options: CsvExportOptions = {}\n): void {\n const {\n fileName = 'export.csv',\n includeHeaders = true,\n delimiter = ',',\n selectedRows\n } = options;\n\n const rowsToExport = selectedRows && selectedRows.length > 0\n ? rows.filter(r => selectedRows.includes(r.id))\n : rows;\n\n if (rowsToExport.length === 0) {\n console.warn('No rows to export');\n return;\n }\n\n const exportColumns = columns.filter(col => {\n if (col.exportable === false) return false;\n if (col.field === '__check__' || col.field === '__actions__') return false;\n return true;\n });\n\n let csvContent = '';\n\n // Add headers\n if (includeHeaders) {\n const headers = exportColumns.map(col => escapeCSV(col.headerName || col.field));\n csvContent += headers.join(delimiter) + '\\n';\n }\n\n rowsToExport.forEach(row => {\n const values = exportColumns.map(col => {\n let value: any = row[col.field as keyof R];\n\n if (col.valueGetter) {\n value = col.valueGetter({ row, field: col.field, value });\n }\n\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n\n return escapeCSV(String(value ?? ''));\n });\n csvContent += values.join(delimiter) + '\\n';\n });\n\n // Add Aggregation\n if (options.aggregationResult) {\n const aggResult = options.aggregationResult;\n const aggModel = options.aggregationModel || {};\n \n // Print Aggregation Function Labels\n const aggLabels = exportColumns.map((col) => {\n if (aggModel[col.field]) {\n return escapeCSV(aggModel[col.field].toUpperCase());\n }\n return escapeCSV('');\n });\n csvContent += aggLabels.join(delimiter) + '\\n';\n\n // Print Aggregation Values\n const aggValues = exportColumns.map((col) => {\n const aggVal = aggResult[col.field];\n if (aggVal !== undefined && aggVal !== null) {\n let formatted = aggVal;\n if (col.valueFormatter) {\n formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n } else if (aggModel[col.field]) {\n formatted = formatAggregationValue(aggVal, aggModel[col.field]);\n }\n return escapeCSV(String(formatted));\n }\n return escapeCSV('');\n });\n csvContent += aggValues.join(delimiter) + '\\n';\n }\n\n downloadFile(csvContent, fileName, 'text/csv;charset=utf-8;');\n}\n\nfunction escapeCSV(value: string): string {\n if (value.includes(',') || value.includes('\"') || value.includes('\\n')) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n}\n\nexport interface ExcelExportOptions {\n fileName?: string;\n sheetName?: string;\n includeHeaders?: boolean;\n selectedRows?: (string | number)[];\n aggregationResult?: Record<string, any> | null;\n aggregationModel?: GridAggregationModel | null;\n}\n\nexport function exportToExcel<R extends GridRowModel>(\n rows: R[],\n columns: GridColDef<R>[],\n options: ExcelExportOptions = {}\n): void {\n const {\n fileName = 'export.xlsx',\n sheetName = 'Sheet1',\n includeHeaders = true,\n selectedRows\n } = options;\n\n const rowsToExport = selectedRows && selectedRows.length > 0\n ? rows.filter(r => selectedRows.includes(r.id))\n : rows;\n\n if (rowsToExport.length === 0) {\n console.warn('No rows to export');\n return;\n }\n\n const exportColumns = columns.filter(col => {\n if (col.exportable === false) return false;\n if (col.field === '__check__' || col.field === '__actions__') return false;\n return true;\n });\n\n let html = '<html xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:x=\"urn:schemas-microsoft-com:office:excel\" xmlns=\"http://www.w3.org/TR/REC-html40\">';\n html += '<head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>';\n html += `<x:Name>${sheetName}</x:Name>`;\n html += '<x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]-->';\n html += '<meta charset=\"UTF-8\"></head><body>';\n html += '<table border=\"1\">';\n\n if (includeHeaders) {\n html += '<thead><tr>';\n exportColumns.forEach(col => {\n html += `<th>${escapeHTML(col.headerName || col.field)}</th>`;\n });\n html += '</tr></thead>';\n }\n\n html += '<tbody>';\n rowsToExport.forEach(row => {\n html += '<tr>';\n exportColumns.forEach(col => {\n let value: any = row[col.field as keyof R];\n\n if (col.valueGetter) {\n value = col.valueGetter({ row, field: col.field, value });\n }\n\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n\n html += `<td>${escapeHTML(String(value ?? ''))}</td>`;\n });\n });\n\n if (options.aggregationResult) {\n const aggResult = options.aggregationResult;\n const aggModel = options.aggregationModel || {};\n\n html += '<tr style=\"font-size: 11px; color: #666; background-color: #f5f5f5;\">';\n exportColumns.forEach((col) => {\n if (aggModel[col.field]) {\n html += `<td style=\"text-align: right; font-weight: bold;\">${escapeHTML(aggModel[col.field].toUpperCase())}</td>`;\n } else {\n html += `<td></td>`;\n }\n });\n html += '</tr>';\n\n html += '<tr style=\"font-weight: bold; background-color: #f5f5f5;\">';\n exportColumns.forEach((col) => {\n const aggVal = aggResult[col.field];\n if (aggVal !== undefined && aggVal !== null) {\n let formatted = aggVal;\n if (col.valueFormatter) {\n formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n } else if (aggModel[col.field]) {\n formatted = formatAggregationValue(aggVal, aggModel[col.field]);\n }\n html += `<td style=\"text-align: right;\">${escapeHTML(String(formatted))}</td>`;\n } else {\n html += `<td></td>`;\n }\n });\n html += '</tr>';\n }\n\n html += '</tbody></table></body></html>';\n\n downloadFile(html, fileName, 'application/vnd.ms-excel');\n}\n\nfunction escapeHTML(value: string): string {\n return value\n .replace(/&/g, '&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, any> | null;\n aggregationModel?: GridAggregationModel | null;\n}\n\n/**\n * Export data to JSON format\n */\nexport function exportToJson<R extends GridRowModel>(\n rows: R[],\n columns: GridColDef<R>[],\n options: JsonExportOptions = {}\n): void {\n const {\n fileName = 'export.json',\n pretty = true,\n selectedRows\n } = options;\n\n // Filter rows if selection is active\n const rowsToExport = selectedRows && selectedRows.length > 0\n ? rows.filter(r => selectedRows.includes(r.id))\n : rows;\n\n if (rowsToExport.length === 0) {\n console.warn('No rows to export');\n return;\n }\n\n // Filter columns\n const exportColumns = columns.filter(col => {\n if (col.exportable === false) return false;\n if (col.field === '__check__' || col.field === '__actions__') return false;\n return true;\n });\n\n // Build JSON data\n const data = rowsToExport.map(row => {\n const obj: any = {};\n exportColumns.forEach(col => {\n let value: any = row[col.field as keyof R];\n\n // Use valueGetter if available\n if (col.valueGetter) {\n value = col.valueGetter({ row, field: col.field, value });\n }\n\n obj[col.field] = value;\n });\n return obj;\n });\n\n let outData: any = data;\n\n if (options.aggregationResult) {\n const aggResult = options.aggregationResult;\n const aggModel = options.aggregationModel || {};\n \n const summaryLabelObj: any = {};\n exportColumns.forEach((col) => {\n if (aggModel[col.field]) {\n summaryLabelObj[col.field] = aggModel[col.field].toUpperCase();\n }\n });\n\n const summaryDataObj: any = {};\n exportColumns.forEach((col) => {\n if (aggResult[col.field] !== undefined && aggResult[col.field] !== null) {\n let aggVal = aggResult[col.field];\n if (col.valueFormatter) {\n aggVal = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n } else if (aggModel[col.field]) {\n aggVal = formatAggregationValue(aggVal, aggModel[col.field]);\n }\n summaryDataObj[col.field] = aggVal;\n }\n });\n\n outData = {\n data: data,\n aggregation: {\n labels: summaryLabelObj,\n values: summaryDataObj\n }\n };\n }\n\n const jsonContent = pretty ? JSON.stringify(outData, null, 2) : JSON.stringify(outData);\n\n // Download file\n downloadFile(jsonContent, fileName, 'application/json;charset=utf-8;');\n}\n\n// ============================================================================\n// Print\n// ============================================================================\n\nexport interface PrintOptions {\n title?: string;\n selectedRows?: (string | number)[];\n aggregationResult?: Record<string, any> | null;\n aggregationModel?: GridAggregationModel | null;\n}\n\n/**\n * Open print dialog with formatted table\n */\nexport async function printGrid<R extends GridRowModel>(\n rows: R[],\n columns: GridColDef<R>[],\n titleOrOptions?: string | PrintOptions\n): Promise<void> {\n // 1. Open window immediately to resolve user activation constraints and provide feedback\n const printWindow = window.open('', '_blank');\n\n if (!printWindow) {\n console.error('Failed to open print window. Please check your popup blocker settings.');\n return;\n }\n\n // 2. Show loading state\n printWindow.document.write(`\n <!DOCTYPE html>\n <html>\n <head>\n <title>Preparing Print...</title>\n <style>\n body { font-family: sans-serif; height: 100vh; display: flex; align-items: center; justify-content: center; margin: 0; background: #f5f5f5; }\n .loader { text-align: center; }\n .spinner { border: 4px solid #f3f3f3; border-top: 4px solid #3498db; border-radius: 50%; width: 40px; height: 40px; animation: spin 1s linear infinite; margin: 0 auto 20px; }\n @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }\n </style>\n </head>\n <body>\n <div class=\"loader\">\n <div class=\"spinner\"></div>\n <h2>Generating Print Preview...</h2>\n <p>Processing data, please wait.</p>\n </div>\n </body>\n </html>\n `);\n printWindow.document.close();\n\n // 3. Yield to main thread to allow the new window to render its loading state\n await new Promise(resolve => setTimeout(resolve, 100));\n\n try {\n let title = 'Print';\n let selectedRows: (string | number)[] | undefined;\n let aggregationResult: Record<string, any> | null = null;\n let aggregationModel: GridAggregationModel | null = null;\n\n if (typeof titleOrOptions === 'string') {\n title = titleOrOptions;\n } else if (typeof titleOrOptions === 'object') {\n title = titleOrOptions.title || 'Print';\n selectedRows = titleOrOptions.selectedRows;\n aggregationResult = titleOrOptions.aggregationResult || null;\n aggregationModel = titleOrOptions.aggregationModel || null;\n }\n\n // Filter rows if selection is active\n const rowsToExport = selectedRows && selectedRows.length > 0\n ? rows.filter(r => selectedRows.includes(r.id))\n : rows;\n\n if (rowsToExport.length === 0) {\n printWindow.document.body.innerHTML = '<h3>No rows to export</h3>';\n return;\n }\n\n // Filter columns\n const exportColumns = columns.filter(col => {\n if (col.exportable === false) return false;\n if (col.field === '__check__' || col.field === '__actions__') return false;\n return true;\n });\n\n // Build HTML\n let html = `\n <!DOCTYPE html>\n <html>\n <head>\n <title>${title || 'Print'}</title>\n <style>\n body { font-family: Arial, sans-serif; margin: 20px; }\n h1 { font-size: 24px; margin-bottom: 20px; }\n table { border-collapse: collapse; width: 100%; }\n th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }\n th { background-color: #f5f5f5; font-weight: bold; }\n tr:nth-child(even) { background-color: #f9f9f9; }\n @media print {\n body { margin: 0; }\n @page { margin: 1cm; }\n }\n </style>\n </head>\n <body>\n `;\n\n if (title) {\n html += `<h1>${escapeHTML(title)}</h1>`;\n }\n\n html += '<table>';\n\n // Headers\n html += '<thead><tr>';\n exportColumns.forEach(col => {\n html += `<th>${escapeHTML(col.headerName || col.field)}</th>`;\n });\n html += '</tr></thead>';\n\n // Rows\n html += '<tbody>';\n\n // Process rows (potential bottleneck logic here)\n rowsToExport.forEach(row => {\n html += '<tr>';\n exportColumns.forEach(col => {\n let value: any = row[col.field as keyof R];\n\n if (col.valueGetter) {\n value = col.valueGetter({ row, field: col.field, value });\n }\n\n if (col.valueFormatter && value !== undefined && value !== null) {\n value = col.valueFormatter({ value, row, field: col.field });\n }\n\n if (col.type === 'image' && value) {\n html += `<td><div style=\"display:flex;justify-content:center;\"><img src=\"${value}\" alt=\"${col.headerName}\" style=\"max-height: 40px; border-radius: 4px;\"></div></td>`;\n } else {\n html += `<td>${escapeHTML(String(value ?? ''))}</td>`;\n }\n });\n html += '</tr>';\n });\n\n if (aggregationResult) {\n const aggModel = aggregationModel || {};\n html += '<tfoot><tr style=\"font-size: 11px; color: #666; background-color: #f5f5f5;\">';\n exportColumns.forEach((col) => {\n if (aggModel[col.field]) {\n html += `<td style=\"text-align: right; font-weight: bold;\">${escapeHTML(aggModel[col.field].toUpperCase())}</td>`;\n } else {\n html += `<td></td>`;\n }\n });\n html += '</tr><tr style=\"font-weight: bold; background-color: #f5f5f5;\">';\n exportColumns.forEach((col) => {\n const aggVal = aggregationResult![col.field];\n if (aggVal !== undefined && aggVal !== null) {\n let formatted = aggVal;\n if (col.valueFormatter) {\n formatted = col.valueFormatter({ value: aggVal, row: {} as R, field: col.field });\n } else if (aggModel[col.field]) {\n formatted = formatAggregationValue(aggVal, aggModel[col.field]);\n }\n html += `<td style=\"text-align: right;\">${escapeHTML(String(formatted))}</td>`;\n } else {\n html += `<td></td>`;\n }\n });\n html += '</tr></tfoot>';\n }\n\n html += '</tbody></table></body></html>';\n\n // Write the HTML content\n printWindow.document.open();\n printWindow.document.write(html);\n printWindow.document.close();\n\n // Set the document title explicitly (fixes about:blank issue)\n printWindow.document.title = title || 'Print Preview';\n\n printWindow.focus();\n\n let hasPrinted = false;\n\n printWindow.onload = () => {\n if (!hasPrinted) {\n hasPrinted = true;\n printWindow.print();\n\n setTimeout(() => {\n printWindow.close();\n }, 100);\n }\n };\n\n setTimeout(() => {\n if (!hasPrinted && printWindow && !printWindow.closed) {\n hasPrinted = true;\n printWindow.print();\n setTimeout(() => {\n if (!printWindow.closed) printWindow.close();\n }, 100);\n }\n }, 500);\n\n } catch (e: any) {\n console.error('Print generation failed:', e);\n if (printWindow && !printWindow.closed) {\n printWindow.document.body.innerHTML = `<div style=\"color: red; padding: 20px;\"><h3>Error Generating Print Preview</h3><p>${e.message}</p></div>`;\n }\n }\n}\n\nfunction downloadFile(content: string, fileName: string, mimeType: string): void {\n const blob = new Blob([content], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = fileName;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n}\n","\nimport type { GridColDef, GridRowModel, GridAggregationModel } from '../../types';\nimport { formatAggregationValue } from '../../hooks/features/useAggregation';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface ExcelColumnStyle {\n /** Numeric format string, e.g. '$#,##0.00', '0.00%', 'yyyy-mm-dd' */\n numFmt?: string;\n /** Override column width (characters). Defaults to colDef.width / 7 */\n width?: number;\n /** Horizontal alignment override */\n alignment?: 'left' | 'center' | 'right';\n /**\n * If true, the cell value (expected to be an image URL string) will be\n * fetched and embedded as an inline image in the cell.\n * Requires the image server to serve CORS headers. Falls back to the\n * raw URL string if the fetch fails (a warning is logged to the console).\n */\n embedImage?: boolean;\n /** Width of the embedded image in pixels (default: 40) */\n imageWidth?: number;\n /** Height of the embedded image in pixels (default: 40) */\n imageHeight?: number;\n}\n\nexport interface ExcelSheetDefinition {\n /** Sheet tab name (max 31 chars) */\n name: string;\n /** Which rows to include. Default: 'all' */\n rows?: 'all' | 'selected';\n /** Include header row. Default: true */\n includeHeaders?: boolean;\n /** Include aggregation totals row at the bottom. Default: false */\n includeSummary?: boolean;\n /** Auto-filter dropdowns on header row. Default: true */\n autoFilter?: boolean;\n /** Freeze the header row. Default: true */\n frozenHeader?: boolean;\n /** Alternate row fill (#hex). Pass false to disable. Default: '#f8fafc' */\n alternateRowColor?: string | false;\n}\n\nexport interface ExcelAdvancedExportOptions {\n /** Output filename (default: 'export.xlsx') */\n fileName?: string;\n /**\n * Sheet definitions. If omitted, a single 'Data' sheet is created\n * with all rows.\n *\n * Built-in special sheet type: `{ type: 'summary' }` renders a\n * standalone aggregation sheet.\n */\n sheets?: (ExcelSheetDefinition | { type: 'summary'; name?: string })[]; \n /** Per-column style overrides, keyed by field name */\n columnStyles?: Record<string, ExcelColumnStyle>;\n /** Header row fill color (default: '#f1f5f9') */\n headerFillColor?: string;\n /** Header row text color (default: '#334155') */\n headerTextColor?: string;\n /** Header row font size (default: 10) */\n headerFontSize?: number;\n /** Body font size (default: 10) */\n bodyFontSize?: number;\n /** Current aggregation result */\n aggregationResult?: Record<string, any> | 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<any>, value: any): '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<any>): 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<any>, 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 — cast to GridColDef<any> to avoid generic covariance issues\n const exportColumns: GridColDef<any>[] = (columns as GridColDef<any>[]).filter(col =>\n col.exportable !== false &&\n col.field !== '__check__' &&\n col.field !== '__actions__' &&\n !(col as any).isSpacer\n );\n\n const allRows: any[] = rows as any[];\n const sRows: any[] = (selectedRows && selectedRows.length > 0\n ? rows.filter(r => selectedRows.includes(r.id))\n : rows) as any[];\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 as any)[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: any = (row as any)[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 as any)[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 any);\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\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]); \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","ListViewRow","row","rowIndex","listViewColumn","isSelected","checkboxSelection","rowHeight","onRowClick","onSelectionChange","params","handleCheckboxChange","e","jsxs","jsx","Checkbox","indeterminate","label","className","inputRef","internalRef","setRef","element","wrapperClassNames","ColumnResizeHandle","field","currentWidth","onResize","minWidth","maxWidth","isDragging","setIsDragging","useState","startXRef","useRef","startWidthRef","handleMouseDown","useCallback","event","lastUpdateTime","throttleMs","handleMouseMove","deltaX","newWidth","now","handleMouseUp","handleDoubleClick","classNames","isColumnPinned","pinnedColumns","getPinnedColumnGroups","columns","left","center","right","col","pinnedPosition","b","aIndex","bIndex","calculatePinnedPositions","columnWidths","pinCheckboxColumn","hasDetailPanel","pinExpandColumn","rowReordering","positions","groups","leftOffset","width","rightOffset","isRowPinned","rowId","pinnedRows","getPinnedRowGroups","rows","top","bottom","ActiveDotIcon","InactiveDotIcon","ManageColumnsIcon","AscIcon","DescIcon","UnsortIcon","HideIcon","PinLeftIcon","PinRightIcon","UnpinIcon","ColumnMenu","colDef","sortModel","onSort","onHide","onPin","onManageColumns","onClose","anchorEl","menuRef","style","setStyle","anchorRect","menuRect","vw","vh","margin","useEffect","handleClickOutside","handleKey","handleSort","direction","handleHide","handlePin","side","currentSort","item","isUnsorted","isPinnedLeft","isPinnedRight","isUnpinned","colLabel","ReactDOM","Fragment","MenuIcon","SwapIcon","collectGroupFields","group","out","child","groupTreeDepth","d","walk","g","depth","c","buildGroupRow","allFields","level","findAtLevel","cur","found","fieldGroup","f","cells","i","w","totalW","j","Header","allColumns","columnGroupingModel","allSelected","someSelected","onSelectAll","onColumnResize","aggregationModel","draggedColumn","dragOverColumn","onDragStart","onDragOver","onDragEnd","onDrop","focusedCell","onHeaderClick","onHideColumn","onPinColumn","cellRefs","menuOpenParams","setMenuOpenParams","handleMenuOpen","handleMenuClose","handleColumnClick","newDirection","getSortIcon","sortItem","pinnedPositions","groupDepth","allLeafFields","prefixWidth","_","cell","el","index","isSortable","isSorted","isResizable","isPinned","isDragOver","effectiveWidth","offset","headerContent","handleHeaderClick","handleDragStart","handleDragOver","handleDrop","TextEditor","onValueChange","onCommit","onCancel","local","setLocal","ref","NumberEditor","v","BooleanEditor","handleChange","SelectEditor","options","opt","l","DateEditor","GridEditInputCell","CellImpl","onCellClick","onCellEditStart","onCellValueChange","colIndex","onClick","pinnedOffset","isFocused","isFocusVisible","isEditable","isEditing","onEditStart","onEditStop","colSpanInfo","rowSpanProp","isHiddenByRowSpan","handleClick","handleValueChange","newValue","formattedValue","cellContent","resolvedCellClassName","colSpan","rowSpan","cellWidth","cellRef","Cell","ExpandIcon","isExpanded","variant","DragHandleIcon","DetailPanel","content","height","Row","isDetailPanelExpanded","onDetailPanelToggle","detailPanelContent","detailPanelHeight","editingCell","onEditCellValueChange","focusedCellField","colspanMap","rowSpanningCaches","expandCellRef","checkboxCellRef","cellCount","handleRowClick","handleDetailPanelToggle","rowPinnedPosition","isRowPinnedTop","isRowPinnedBottom","isGroupRow","handleCellEditStart","handleCellValueChange","handleEditStopWrapper","cancel","cellValue","SkeletonRow","skeletonWidth","Button","size","color","disabled","Pagination","page","pageSize","rowCount","onPageChange","onPageSizeChange","pageSizeOptions","showFirstButton","showLastButton","pageCount","currentPage","firstRowIndex","lastRowIndex","displayedRows","handleFirstPage","handlePreviousPage","handleNextPage","handleLastPage","handlePageSizeChange","newPageSize","isFirstPage","isLastPage","option","createInitialState","columnVisibilityModel","idRowsLookup","allRows","id","columnLookup","orderedFields","gridReducer","state","action","currentRows","newRows","useDataGrid","headerHeight","propInitialState","internalInitialState","useMemo","dispatch","useReducer","stateRef","prevRowsRef","setRows","rowsOrUpdater","preserveRowCount","setColumns","newColumns","setSortModel","setFilterModel","filterModel","setPaginationModel","paginationModel","setSelection","selectedRows","setScroll","scrollTop","scrollLeft","setDimensions","viewportWidth","viewportHeight","setDataSourceLoading","loading","setDataSourceError","error","setRowCount","count","apiRef","newSelection","ids","existingIndex","newModel","useColumnReorder","onColumnOrderChange","disableColumnReorder","setDraggedColumn","setDragOverColumn","draggedIndexRef","columnIndex","targetField","oldIndex","targetIndex","column","handleDragEnd","useRowReorder","onRowOrderChange","getRowId","draggedRowId","setDraggedRowId","dragOverRowId","setDragOverRowId","getRowIdInternal","targetId","r","FILTER_OPERATORS","filterValue","numValue","numFilter","numV","numF","rowStr","filterStr","applyFilterItem","filterItem","operator","rowValue","operatorFn","applyQuickFilter","quickFilterValues","searchTerm","isRowMatchingFilter","items","logicOperator","evaluateItem","groupItems","filterRows","getOperatorsForType","compareValues","a","aStr","bStr","sortRows","sortedRows","aValue","bValue","comparison","useTreeData","getTreeDataPath","treeData","defaultGroupingExpansionDepth","onRowExpansionChange","treeNodes","rootIds","groupingRows","nodes","roots","groupRows","pathLookup","getPathKey","path","pathKey","ensureAncestors","childPath","parentPath","parentPathKey","parentId","groupLabel","groupRow","parentNode","childNode","groupId","nodePath","initialExpandedIds","initialExpanded","expandedGroupIds","setExpandedGroupIds","toggleExpansion","prev","next","isExpanding","getVisibleRows","rowLookup","matchesFilter","filterCache","isNodeVisible","childId","sortNodes","aId","bId","rowA","rowB","valA","valB","comp","result","seenIds","traverse","visibleIds","enhancedRow","isGroupExpanded","getNode","getNodePath","currentId","defaultGetAggregationPosition","groupNode","useRowGrouping","rowGroupingModel","getAggregationPosition","getGroupId","groupIds","groupRowsList","rawValue","aggregatedValues","aggField","aggType","values","sum","treeNode","childrenIds","descendantCount","topLevelIds","allGroupIds","depthIds","doesNodeMatchFilter","nodeId","compareResult","isGroup","isExpandedGroupIds","useGridEditing","processRowUpdate","onProcessRowUpdateError","onRowChange","setEditingCellState","editingCellRef","setEditingCell","val","startCellEdit","stopCellEdit","currentCell","originalValue","existingRow","newRow","processedRow","setEditCellValue","useGridSpanning","setColspanMap","rowSpanningState","setRowSpanningState","resetColSpan","getCellColSpanInfo","calculateColSpan","minFirstColumn","maxLastColumn","newMap","setCellColSpanInfo","nextCol","calculateRowSpan","spannedCells","hiddenCells","hiddenCellOriginMap","span","nextIndex","nextRow","resetRowSpan","colWidth","nextColWidth","getSpannedCells","getHiddenCells","getHiddenCellOriginMap","map","info","columnInfo","useGridDataSource","dataSource","paginationMode","sortingMode","filterMode","onAggregationResults","prevParamsRef","activeRequestRef","fetchRows","requestId","startRow","endRow","requestParams","response","shouldAppend","sortChanged","filterChanged","pageSizeChanged","prevRows","timer","fetchChildren","_parentId","groupKeys","existingIds","AGGREGATION_FUNCTIONS","acc","nums","formatAggregationValue","fnName","useAggregation","isServerSide","serverAggregationResults","clientResult","fn","serverResult","setServerResult","isLoading","setIsLoading","setError","requestIdRef","fetchServerAggregations","err","aggregate","makeKey","fields","usePivot","rawRows","rawCols","model","enabled","empty","rowFields","columnFields","valueFields","colDefMap","colKeySet","colKeys","outerMap","rk","labelValues","entry","ck","colBucket","vf","pivotRows","pivotRow","cellKey","totalRow","colTotal","pivotColumns","orig","def","labelBase","headerName","n","copyTextSynchronous","text","textarea","success","writeToClipboard","fallbackSuccess","useGridClipboard","selectedRowIds","copySelectedRows","rowsToCopy","visibleColumns","headerRow","dataRows","fullContent","handleKeyDown","activeEl","tag","SearchIcon","ColumnVisibilityPanel","onVisibilityChange","onShowAll","onHideAll","onColumnReorder","searchQuery","setSearchQuery","dragOverField","setDragOverField","dragFieldRef","allVisible","filteredColumns","lowerQuery","handleToggleAll","handleDragLeave","toField","fromField","isVisible","isHideable","canReorder","DataGrid","autoHeight","propRowSelectionModel","propOnRowSelectionModelChange","propFilterModel","onFilterModelChange","propSortModel","onSortModelChange","propPagination","onPaginationModelChange","propPinnedColumns","onPinnedColumnsChange","getDetailPanelContent","getDetailPanelHeight","controlledExpandedRowIds","onDetailPanelExpandedRowIdsChange","columnOrder","propRowGroupingModel","propAggregationModel","onAggregationModelChange","isCellEditable","propRowCount","slots","slotProps","pivotMode","propPivotModel","onPivotModelChange","onRowsScrollEnd","ariaLabel","initialState","onStateChange","propColumnVisibilityModel","onColumnVisibilityModelChange","listView","noRowsLabel","propApiRef","defaultFilterModel","internalSortModel","setInternalSortModel","isSortControlled","defaultRowGroupingModel","isAggregationControlled","latestToolbarRef","StableToolbar","Toolbar","internalAggregationModel","setInternalAggregationModel","handleAggregationModelChange","internalColumnVisibilityModel","setInternalColumnVisibilityModel","isColumnVisibilityControlled","handleColumnVisibilityModelChange","internalPinnedColumns","setInternalPinnedColumns","isPinnedColumnsControlled","handlePinnedColumnsChange","EMPTY_PIVOT_MODEL","internalPivotModel","setInternalPivotModel","currentPivotModel","handlePivotModelChange","pivot","activeRows","activeColumns","setServerAggregationResults","internalPaginationModel","setInternalPaginationModel","isPaginationControlled","effectivePaginationModel","handlePaginationModelChange","internalRowSelectionModel","setInternalRowSelectionModel","isSelectionControlled","rowSelectionModel","onRowSelectionModelChange","viewportRef","contentRef","gridRef","defaultGetRowId","effectiveGetRowId","setFocusedCell","setKeyboardMode","on","containerRef","dataSourceRef","fetchChildrenRef","treeDataRef","handleNodeExpansion","gridData","isInternalLoading","effectiveLoading","effectiveRows","treeDataHandlers","rowGroupingHandlers","editingHandlers","updatedRow","nextRows","isTreeData","isRowGrouping","isHierarchyEnabled","activeHierarchyHandlers","pagination","effectiveColumns","_treeDepth","_hasChildren","_isExpanded","_groupingField","_groupingValue","_descendantCount","paddingLeft","dataSourceHandlers","setColumnWidths","internalColumnOrder","setInternalColumnOrder","effectiveColumnOrder","orderedColumns","orderMap","visibleOrderedColumns","columnReorderHandlers","newOrder","movedField","internalExpandedRowIds","setInternalExpandedRowIds","expandedRowIds","newExpandedRowIds","navigationColumns","cols","handleColumnResize","onStateChangeRef","snapshot","baseRows","filteredRows","pinnedTopRows","unpinnedRows","pinnedBottomRows","sortedUnpinnedRows","paginatedUnpinnedRows","start","end","rowReorderHandlers","allRenderableRows","centerRows","base","skeletonCount","skeletons","spanning","aggregationResult","hasAggregation","layout","baseRowHeight","rowHeights","detailHeight","cumulativeHeights","skeletonRowsHeight","unpinnedRowsHeight","pinnedTopHeight","pinnedBottomHeight","rawLeftPinnedCols","rawRightPinnedCols","unpinnedCols","unpinnedColWidths","pinned","systemColumnsWidth","getColWidth","parseWidth","floatVal","leftWidth","parsed","rightWidth","naturalFlexWidth","availableWidth","fixedWidthCols","percentageCols","flexCols","totalFlexUnits","hasManualWidth","fixedWidth","remainingSpaceForFlex","percentageWidthMap","percentage","calculatedWidth","finalFlexWidths","flexItems","iterations","maxIterations","unfrozen","unfrozenFlexTotal","frozenWidthTotal","currentFreeSpace","pixelsPerFlex","totalViolation","minViolators","maxViolators","rawWidth","diff","computedWidthMap","computedWidth","fixedCol","pctCol","p","rawPctWidth","unpinnedColsWithWidth","flexItem","baseLeftZ","leftPinnedCols","numericWidth","baseRightZ","rightPinnedCols","unpinnedTotalWidth","totalWidth","unpinnedAccWidths","virtualization","unpinnedRowsLength","overscanCols","visibleLocalStart","visibleLocalEnd","firstUnpinnedIndex","lastUnpinnedIndex","low","high","mid","leftSpacerWidth","rightSpacerWidth","virtualColumns","scrollbarBuffer","totalHeight","overscanRows","offsetTop","rLow","rHigh","handleScroll","target","scrollHeight","clientHeight","resizeObserver","entries","handleSelectionChange","newSelectionArray","handleSelectAll","newSortModel","handleCellClick","prevEditingCellRef","wasEditing","visibleRows","topPinnedCount","topPinned","bottomPinned","centerStartIndex","centerEndIndex","combined","handleFocus","firstRow","firstCol","handleBlur","isHeader","findNextCell","startCol","deltaRow","deltaCol","wrapRow","allowHeader","findNextEditable","steps","maxSteps","isInteractable","nextRowIndex","nextColIndex","handled","dir","res","clientWidth","rowTop","rowBottom","visibleTop","visibleBottom","newScrollTop","leftPinnedWidth","rightPinnedWidth","totalSpecialsWidth","pinnedSpecialsWidth","unpinnedIndex","colLeft","colRight","visibleStart","visibleEnd","newScrollLeft","hasRowSpanning","columnsPanelOpen","setColumnsPanelOpen","panel","toolbarProps","currentOrder","fromIdx","toIdx","rect","idx","PaginationComponent","totalRowCount","paginationProps","newPage","cleanLeft","cleanRight","skeletonColumns","columnWidth","columnCount","self","t","actualIndex","startIdx","Skeleton","NO_VALUE_OPERATORS","getActiveFilter","FilterRow","onChange","operators","isActive","currentOperator","localValue","setLocalValue","onChangeRef","prevItemValue","handler","currentValue","handleOperatorChange","op","noValue","newItem","handleClear","isNoValue","isBoolean","showValue","FilterPanel","handleItemChange","rest","handleLogicChange","filterableColumns","AGG_FNS","PivotIcon","PivotPanel","anchorRef","panelRef","pos","setPos","computePos","update","onKey","inRow","inCol","inValue","isUsed","addRow","addCol","addValue","aggFn","removeRow","removeCol","removeValue","changeValueFn","reset","numericFields","totalActive","isNum","CloseIcon","GlobalSearch","placeholder","debounceMs","setIsExpanded","lastEmittedRef","lastIncomingValueRef","wasFocusedRef","useLayoutEffect","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","baseColumns","pivotModel","forceColumnsOpen","onColumnsPanelClose","rightContent","aggOpen","setAggOpen","pivotOpen","setPivotOpen","colsOpen","setColsOpen","filterOpen","setFilterOpen","aggButtonRef","pivotButtonRef","colsButtonRef","filterButtonRef","pivotActive","handleFunctionChange","clearAllAgg","handleSearchChange","nextModel","searchValue","handleVisibilityChange","handleShowAllColumns","handleHideAllColumns","m","useGridApiRef","Input","fullWidth","startAdornment","endAdornment","exportToCsv","fileName","includeHeaders","delimiter","rowsToExport","exportColumns","csvContent","headers","escapeCSV","aggResult","aggModel","aggLabels","aggValues","aggVal","formatted","downloadFile","exportToExcel","sheetName","html","escapeHTML","exportToJson","pretty","data","obj","outData","summaryLabelObj","summaryDataObj","jsonContent","printGrid","titleOrOptions","printWindow","resolve","hasPrinted","mimeType","blob","url","link","inferCellType","defaultNumFmt","override","px","imageExtension","contentType","ct","fetchImages","urls","settled","commaIdx","header","b64","binary","uint8","mime","ext","buffer","exportToExcelAdvanced","sheetDefs","columnStyles","headerFillColor","headerTextColor","headerFontSize","bodyFontSize","ExcelJS","workbook","sRows","resolvedSheets","imageCache","sheetDef","ws","argb","bottomBorder","rowScope","includeSummary","autoFilter","frozenHeader","alternateRowColor","imageColumns","urlsNeeded","seen","fetched","extension","imgId","headerValues","excelRowIdx","rowIdx","cellValues","dataRow","maxImgH","max","rowHeightPt","rowHeightPx","colIdx","imgW","imgH","colWidthPx","hGapPx","vGapPx","labelRow","totalValues","topBorder","hex","clean","lightBase","themeToCSS","theme","vars","set","cssVar","s","sh","tr","tb","o","scr","sk","DataGridThemeProvider","cssVars","darkTheme","roseTheme","emeraldTheme","amberTheme","compactTheme","readFromStorage","storage","raw","writeToStorage","include","toWrite","useGridStateStorage","opts","latestStateRef","flush","clearState"],"mappings":"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","x_google_ignoreList":[0,1,2]}