@revolist/revogrid 4.26.2 → 4.27.1

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/dist/cjs/{cell-renderer-Cf2Pu4S0.js → cell-renderer-BDIx0xys.js} +3 -3
  2. package/dist/cjs/{column.service-C7p5eC5V.js → column.service-D-ENzqyb.js} +5 -3
  3. package/dist/cjs/{dimension.helpers-CgHhnN1d.js → dimension.helpers-CptesQOZ.js} +52 -8
  4. package/dist/cjs/{edit.utils-rAcGublN.js → edit.utils-CBAbQhGP.js} +1 -1
  5. package/dist/cjs/{header-cell-renderer-DHClfIto.js → header-cell-renderer-B5Y4fdZC.js} +1 -1
  6. package/dist/cjs/{index--FdNLz1Z.js → index-BVESmpqW.js} +1 -1
  7. package/dist/cjs/index.cjs.js +72 -55
  8. package/dist/cjs/loader.cjs.js +1 -1
  9. package/dist/cjs/revo-grid.cjs.entry.js +131 -86
  10. package/dist/cjs/revo-grid.cjs.js +1 -1
  11. package/dist/cjs/revogr-attribution_7.cjs.entry.js +51 -19
  12. package/dist/cjs/revogr-clipboard_3.cjs.entry.js +4 -4
  13. package/dist/cjs/revogr-data_4.cjs.entry.js +21 -15
  14. package/dist/cjs/revogr-filter-panel.cjs.entry.js +9 -9
  15. package/dist/cjs/{column.drag.plugin-CK5HADlW.js → row-resize.plugin-sK9_rcUN.js} +759 -86
  16. package/dist/cjs/{text-editor-F04kTx53.js → text-editor-CJyQaYei.js} +2 -2
  17. package/dist/cjs/{throttle-fV6BUmM7.js → throttle-BsaP4fgu.js} +3 -3
  18. package/dist/cjs/{viewport.store-B4Clk4m9.js → viewport.store-mhsdi61t.js} +1 -1
  19. package/dist/collection/components/data/revogr-data-style.css +11 -0
  20. package/dist/collection/components/data/revogr-data.js +14 -8
  21. package/dist/collection/components/header/revogr-header-style.css +1 -0
  22. package/dist/collection/components/overlay/keyboard.service.js +33 -3
  23. package/dist/collection/components/overlay/revogr-overlay-selection.js +12 -10
  24. package/dist/collection/components/revoGrid/plugin.service.js +2 -2
  25. package/dist/collection/components/revoGrid/revo-grid.js +80 -30
  26. package/dist/collection/components/revoGrid/viewport.scrolling.service.js +24 -13
  27. package/dist/collection/components/revoGrid/viewport.service.js +1 -1
  28. package/dist/collection/plugins/filter/filter.constants.js +9 -0
  29. package/dist/collection/plugins/filter/filter.panel.js +8 -8
  30. package/dist/collection/plugins/filter/filter.plugin.js +109 -10
  31. package/dist/collection/plugins/filter/filter.style.css +2 -0
  32. package/dist/collection/plugins/groupingRow/grouping.const.js +1 -0
  33. package/dist/collection/plugins/groupingRow/grouping.row.plugin.js +93 -56
  34. package/dist/collection/plugins/groupingRow/grouping.row.renderer.js +1 -1
  35. package/dist/collection/plugins/groupingRow/grouping.service.js +1 -1
  36. package/dist/collection/plugins/groupingRow/grouping.sorting.service.js +58 -0
  37. package/dist/collection/plugins/groupingRow/grouping.trimmed.service.js +5 -3
  38. package/dist/collection/plugins/index.js +1 -0
  39. package/dist/collection/plugins/row-resize/index.js +6 -0
  40. package/dist/collection/plugins/row-resize/row-resize.plugin.js +416 -0
  41. package/dist/collection/plugins/row-resize/row-resize.types.js +1 -0
  42. package/dist/collection/plugins/row-resize/row-resize.utils.js +55 -0
  43. package/dist/collection/plugins/sorting/sorting.plugin.js +16 -13
  44. package/dist/collection/plugins/wcag/index.js +5 -4
  45. package/dist/collection/serve/controller.js +1 -1
  46. package/dist/collection/services/data.provider.js +8 -2
  47. package/dist/collection/services/dimension.provider.js +17 -1
  48. package/dist/collection/services/local.scroll.timer.js +3 -3
  49. package/dist/collection/services/selection.store.connector.js +4 -2
  50. package/dist/collection/store/dataSource/data.pending.plugin.js +21 -0
  51. package/dist/collection/store/dataSource/data.store.js +25 -3
  52. package/dist/collection/store/dataSource/trimmed.plugin.js +9 -6
  53. package/dist/collection/store/dimension/dimension.trim.plugin.js +1 -3
  54. package/dist/collection/types/events.js +4 -1
  55. package/dist/collection/utils/column.utils.js +1 -1
  56. package/dist/esm/{cell-renderer-11cf-lu3.js → cell-renderer-D9ze8OJw.js} +3 -3
  57. package/dist/esm/{column.service-Cfw3L0PN.js → column.service-pu_fdQ0S.js} +5 -4
  58. package/dist/{revo-grid/dimension.helpers-fl4HSSK9.js → esm/dimension.helpers-Cln9sALu.js} +52 -9
  59. package/dist/{revo-grid/edit.utils-4e9fsqOR.js → esm/edit.utils-3ZbhQCv_.js} +1 -1
  60. package/dist/esm/{header-cell-renderer-Cqtg1ETB.js → header-cell-renderer-YCiVIQ2E.js} +1 -1
  61. package/dist/esm/{index-D24ku9ej.js → index-BvMNbQyq.js} +1 -1
  62. package/dist/esm/index.js +14 -11
  63. package/dist/esm/loader.js +1 -1
  64. package/dist/esm/revo-grid.entry.js +113 -68
  65. package/dist/esm/revo-grid.js +1 -1
  66. package/dist/esm/revogr-attribution_7.entry.js +51 -19
  67. package/dist/esm/revogr-clipboard_3.entry.js +4 -4
  68. package/dist/esm/revogr-data_4.entry.js +21 -15
  69. package/dist/esm/revogr-filter-panel.entry.js +9 -9
  70. package/dist/esm/{column.drag.plugin-DDBKeTGI.js → row-resize.plugin-DBOgjLdE.js} +748 -87
  71. package/dist/{revo-grid/text-editor-DlMnLkRK.js → esm/text-editor-eHtrwvxH.js} +2 -2
  72. package/dist/{revo-grid/throttle-Cpk1LoGk.js → esm/throttle-3rhqdcLy.js} +3 -3
  73. package/dist/{revo-grid/viewport.store-BSXmsiZc.js → esm/viewport.store-DWMKRDSH.js} +1 -1
  74. package/dist/revo-grid/{cell-renderer-11cf-lu3.js → cell-renderer-D9ze8OJw.js} +3 -3
  75. package/dist/revo-grid/{column.service-Cfw3L0PN.js → column.service-pu_fdQ0S.js} +5 -4
  76. package/dist/{esm/dimension.helpers-fl4HSSK9.js → revo-grid/dimension.helpers-Cln9sALu.js} +52 -9
  77. package/dist/{esm/edit.utils-4e9fsqOR.js → revo-grid/edit.utils-3ZbhQCv_.js} +1 -1
  78. package/dist/revo-grid/{header-cell-renderer-Cqtg1ETB.js → header-cell-renderer-YCiVIQ2E.js} +1 -1
  79. package/dist/revo-grid/{index-D24ku9ej.js → index-BvMNbQyq.js} +1 -1
  80. package/dist/revo-grid/index.esm.js +14 -11
  81. package/dist/revo-grid/revo-grid.entry.js +113 -68
  82. package/dist/revo-grid/revo-grid.esm.js +1 -1
  83. package/dist/revo-grid/revogr-attribution_7.entry.js +51 -19
  84. package/dist/revo-grid/revogr-clipboard_3.entry.js +4 -4
  85. package/dist/revo-grid/revogr-data_4.entry.js +21 -15
  86. package/dist/revo-grid/revogr-filter-panel.entry.js +9 -9
  87. package/dist/revo-grid/{column.drag.plugin-DDBKeTGI.js → row-resize.plugin-DBOgjLdE.js} +748 -87
  88. package/dist/{esm/text-editor-DlMnLkRK.js → revo-grid/text-editor-eHtrwvxH.js} +2 -2
  89. package/dist/{esm/throttle-Cpk1LoGk.js → revo-grid/throttle-3rhqdcLy.js} +3 -3
  90. package/dist/{esm/viewport.store-BSXmsiZc.js → revo-grid/viewport.store-DWMKRDSH.js} +1 -1
  91. package/dist/types/components/data/revogr-data.d.ts +1 -0
  92. package/dist/types/components/overlay/keyboard.service.d.ts +6 -0
  93. package/dist/types/components/overlay/revogr-overlay-selection.d.ts +3 -1
  94. package/dist/types/components/revoGrid/revo-grid.d.ts +9 -1
  95. package/dist/types/components/revoGrid/viewport.scrolling.service.d.ts +3 -1
  96. package/dist/types/components.d.ts +23 -10
  97. package/dist/types/plugins/filter/filter.constants.d.ts +6 -0
  98. package/dist/types/plugins/filter/filter.plugin.d.ts +15 -0
  99. package/dist/types/plugins/groupingRow/grouping.const.d.ts +1 -0
  100. package/dist/types/plugins/groupingRow/grouping.row.plugin.d.ts +5 -7
  101. package/dist/types/plugins/groupingRow/grouping.sorting.service.d.ts +7 -0
  102. package/dist/types/plugins/groupingRow/grouping.trimmed.service.d.ts +9 -0
  103. package/dist/types/plugins/index.d.ts +1 -0
  104. package/dist/types/plugins/row-resize/index.d.ts +3 -0
  105. package/dist/types/plugins/row-resize/row-resize.plugin.d.ts +46 -0
  106. package/dist/types/plugins/row-resize/row-resize.types.d.ts +40 -0
  107. package/dist/types/plugins/row-resize/row-resize.utils.d.ts +14 -0
  108. package/dist/types/plugins/sorting/sorting.plugin.d.ts +5 -0
  109. package/dist/types/services/data.provider.d.ts +2 -0
  110. package/dist/types/services/dimension.provider.d.ts +7 -1
  111. package/dist/types/store/dataSource/data.pending.plugin.d.ts +9 -0
  112. package/dist/types/store/dataSource/data.store.d.ts +10 -0
  113. package/dist/types/store/dataSource/trimmed.plugin.d.ts +5 -0
  114. package/dist/types/types/events.d.ts +1 -1
  115. package/dist/types/types/interfaces.d.ts +3 -1
  116. package/hydrate/index.js +980 -191
  117. package/hydrate/index.mjs +980 -191
  118. package/package.json +1 -1
  119. package/readme.md +4 -1
  120. package/standalone/column.service.js +1 -1
  121. package/standalone/data.store.js +1 -1
  122. package/standalone/dimension.helpers.js +1 -1
  123. package/standalone/index.js +1 -1
  124. package/standalone/local.scroll.timer.js +1 -1
  125. package/standalone/revo-grid.js +1 -1
  126. package/standalone/revogr-data2.js +1 -1
  127. package/standalone/revogr-filter-panel.js +1 -1
  128. package/standalone/revogr-header2.js +1 -1
  129. package/standalone/revogr-overlay-selection2.js +1 -1
  130. package/standalone/revogr-row-headers2.js +1 -1
package/hydrate/index.mjs CHANGED
@@ -7606,7 +7606,7 @@ function moveFilterItem(items, sourceId, targetId) {
7606
7606
  return true;
7607
7607
  }
7608
7608
 
7609
- const filterStyleCss = () => `.revo-button{position:relative;overflow:hidden;color:var(--rg-theme-button-text);background-color:var(--rg-theme-button-bg);height:32px;line-height:32px;padding:0 15px;outline:0;border:0;border-radius:7px;box-sizing:border-box;cursor:pointer}.revo-button.green{background-color:var(--rg-theme-button-success-bg)}.revo-button.red{background-color:var(--rg-theme-button-danger-bg)}.revo-button:disabled,.revo-button[disabled]{cursor:not-allowed !important;filter:opacity(0.35) !important}.revo-button.outline{border:1px solid var(--rg-theme-button-outline-border);line-height:30px;background:none;color:var(--rg-theme-button-outline-text);box-shadow:none}revogr-filter-panel{display:block}revogr-filter-panel .filter-panel-dialog{position:fixed;top:0;left:0;z-index:100;max-height:calc(100vh - 16px);overflow:auto;opacity:1;transform:none;color:var(--rg-theme-filter-panel-text);background-color:var(--rg-theme-filter-panel-bg);border:1px solid var(--rg-theme-filter-panel-border);transform-origin:62px 0px;box-shadow:0 5px 18px -2px var(--rg-theme-filter-panel-shadow);box-sizing:border-box;padding:10px;border-radius:8px;margin:0;min-width:220px;text-align:left;animation:revogr-filter-panel-open 140ms cubic-bezier(0.2, 0, 0, 1)}revogr-filter-panel .filter-panel-dialog .filter-holder>div{display:flex;flex-direction:column}revogr-filter-panel .filter-panel-dialog label{font-size:13px;display:block;padding:8px 0}revogr-filter-panel .filter-panel-dialog select{width:100%}revogr-filter-panel .filter-panel-dialog input[type=text]{border:0;min-height:34px;margin:5px 0;color:var(--rg-theme-filter-panel-text);background:var(--rg-theme-filter-panel-input-bg);border-radius:5px;padding:0 10px;box-sizing:border-box;width:100%}revogr-filter-panel .filter-panel-dialog .filter-actions{position:sticky;right:0;bottom:-10px;left:0;z-index:1;text-align:right;margin:10px -10px -10px;padding:0 5px 10px 10px;background:var(--rg-theme-filter-panel-bg);border-top:1px solid var(--rg-theme-filter-panel-divider)}revogr-filter-panel .filter-panel-dialog .filter-actions button{margin-top:10px;margin-right:5px}@keyframes revogr-filter-panel-open{from{opacity:0;transform:translateY(-4px) scale(0.98)}to{opacity:1;transform:none}}@media (prefers-reduced-motion: reduce){revogr-filter-panel .filter-panel-dialog{animation:none}}.rgHeaderCell:hover .rv-filter{transition:opacity 267ms cubic-bezier(0.4, 0, 0.2, 1) 0ms, transform 178ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.rgHeaderCell:hover .rv-filter,.rgHeaderCell .rv-filter.active{opacity:1}.rgHeaderCell .rv-filter{height:24px;width:24px;background:none;border:0;opacity:0;visibility:visible;cursor:pointer;border-radius:4px}.rgHeaderCell .rv-filter.active{color:var(--rg-theme-filter-panel-icon-active)}.rgHeaderCell .rv-filter .filter-img{color:var(--rg-theme-filter-panel-icon);width:11px}.select-css{display:block;font-family:sans-serif;line-height:1.3;padding:0.6em 1.4em 0.5em 0.8em;width:100%;max-width:100%;box-sizing:border-box;margin:0;color:var(--rg-theme-filter-panel-text);border:1px solid var(--rg-theme-filter-panel-select-border);box-shadow:transparent;border-radius:0.5em;appearance:none;background-color:var(--rg-theme-filter-panel-input-bg);background-image:var(--revo-grid-filter-panel-select-arrow, url("data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%23007CB2%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E"));background-repeat:no-repeat, repeat;background-position:right 0.7em top 50%, 0 0;background-size:0.65em auto, 100%;}.select-css::-ms-expand{display:none}.select-css{}.select-css:hover{border-color:var(--rg-theme-filter-panel-select-border)}.select-css{}.select-css:focus{border-color:var(--rg-theme-filter-panel-select-border-hover);box-shadow:var(--rg-theme-filter-panel-focus-ring);outline:none}.select-css{}.select-css option{font-weight:normal}.select-css{}.select-css:disabled,.select-css[aria-disabled=true]{color:var(--rg-theme-filter-panel-muted-text);background-image:var(--revo-grid-filter-panel-select-arrow-disabled, url("data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22graytext%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E"))}.select-css:disabled:hover,.select-css[aria-disabled=true]{border-color:var(--rg-theme-filter-panel-select-border)}.multi-filter-list{margin-top:5px;margin-bottom:5px}.multi-filter-list div{white-space:nowrap}.multi-filter-list .multi-filter-list-row{display:flex;align-items:center;gap:6px;position:relative}.multi-filter-list .multi-filter-list-row.filter-row-dragging{opacity:0.65}.multi-filter-list .multi-filter-list-row.filter-row-drag-over::before{content:"";position:absolute;top:-4px;right:0;left:0;z-index:2;height:2px;background:var(--rg-theme-filter-panel-reorder-accent);border-radius:999px;box-shadow:0 0 0 2px var(--rg-theme-filter-panel-bg)}.multi-filter-list .multi-filter-list-row.filter-row-drop-active .filter-row-drop-target{pointer-events:auto}.multi-filter-list .filter-row-drop-target{position:absolute;inset:0;z-index:1;padding:0;pointer-events:none;background:transparent;border:0}.multi-filter-list .multi-filter-list-action{display:flex;align-self:stretch;flex:0 0 auto;justify-content:flex-end;align-items:center}.multi-filter-list .and-or-button{margin:0 0 0 10px;min-width:58px;cursor:pointer}.multi-filter-list .trash-button{margin:0 0 -2px 6px;padding:0;border:0;background:transparent;color:inherit;cursor:pointer;width:22px;height:100%;font-size:16px}.multi-filter-list .trash-button .trash-img{width:1em}.multi-filter-list .reorder-button{border:0;background:transparent;color:var(--rg-theme-filter-panel-reorder-color);cursor:grab;font-family:monospace;font-size:12px;letter-spacing:0;line-height:1;padding:6px 2px;transform:scaleX(0.8);width:16px}.multi-filter-list .reorder-button.filter-row-drag-over{color:var(--rg-theme-filter-panel-reorder-accent)}.multi-filter-list .reorder-button:active{cursor:grabbing}.multi-filter-list-container{padding:0;margin:0;list-style:none}.add-filter-divider{display:block;margin:0 -10px 10px -10px;border-bottom:1px solid var(--rg-theme-filter-panel-divider);height:10px}.select-input{display:flex;align-items:center;flex:1 1 auto;gap:6px;min-width:0}.select-input .select-filter,.select-input .filter-extra{flex:1 1 0;min-width:0}.select-input .select-filter{width:auto}.select-input .filter-extra{display:flex}.select-input .filter-extra>*{width:100%}.select-input input[type=text],.select-input input[type=date]{margin:0}`;
7609
+ const filterStyleCss = () => `.revo-button{position:relative;overflow:hidden;color:var(--rg-theme-button-text);background-color:var(--rg-theme-button-bg);height:32px;line-height:32px;padding:0 15px;outline:0;border:0;border-radius:7px;box-sizing:border-box;cursor:pointer}.revo-button.green{background-color:var(--rg-theme-button-success-bg)}.revo-button.red{background-color:var(--rg-theme-button-danger-bg)}.revo-button:disabled,.revo-button[disabled]{cursor:not-allowed !important;filter:opacity(0.35) !important}.revo-button.outline{border:1px solid var(--rg-theme-button-outline-border);line-height:30px;background:none;color:var(--rg-theme-button-outline-text);box-shadow:none}revogr-filter-panel{display:block}revogr-filter-panel .filter-panel-dialog{position:fixed;top:0;left:0;z-index:100;max-height:calc(100vh - 16px);overflow:auto;opacity:1;transform:none;color:var(--rg-theme-filter-panel-text);background-color:var(--rg-theme-filter-panel-bg);border:1px solid var(--rg-theme-filter-panel-border);transform-origin:62px 0px;box-shadow:0 5px 18px -2px var(--rg-theme-filter-panel-shadow);box-sizing:border-box;padding:10px;border-radius:8px;margin:0;min-width:220px;text-align:left;animation:revogr-filter-panel-open 140ms cubic-bezier(0.2, 0, 0, 1)}revogr-filter-panel .filter-panel-dialog .filter-holder>div{display:flex;flex-direction:column}revogr-filter-panel .filter-panel-dialog label{font-size:13px;display:block;padding:8px 0}revogr-filter-panel .filter-panel-dialog select{width:100%}revogr-filter-panel .filter-panel-dialog input[type=text]{border:0;min-height:34px;margin:5px 0;color:var(--rg-theme-filter-panel-text);background:var(--rg-theme-filter-panel-input-bg);border-radius:5px;padding:0 10px;box-sizing:border-box;width:100%}revogr-filter-panel .filter-panel-dialog .filter-actions{position:sticky;right:0;bottom:-10px;left:0;z-index:1;text-align:right;margin:10px -10px -10px;padding:0 5px 10px 10px;background:var(--rg-theme-filter-panel-bg);border-top:1px solid var(--rg-theme-filter-panel-divider)}revogr-filter-panel .filter-panel-dialog .filter-actions button{margin-top:10px;margin-right:5px}@keyframes revogr-filter-panel-open{from{opacity:0;transform:translateY(-4px) scale(0.98)}to{opacity:1;transform:none}}@media (prefers-reduced-motion: reduce){revogr-filter-panel .filter-panel-dialog{animation:none}}.rgHeaderCell:hover .rv-filter{transition:opacity 267ms cubic-bezier(0.4, 0, 0.2, 1) 0ms, transform 178ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.rgHeaderCell:hover .rv-filter,.rgHeaderCell .rv-filter.active{opacity:1}.rgHeaderCell .rv-filter{height:24px;width:24px;background:none;border:0;opacity:0;visibility:visible;cursor:pointer;border-radius:4px;position:relative;z-index:1}.rgHeaderCell .rv-filter.active{color:var(--rg-theme-filter-panel-icon-active)}.rgHeaderCell .rv-filter .filter-img{color:var(--rg-theme-filter-panel-icon);width:11px}.select-css{display:block;font-family:sans-serif;line-height:1.3;padding:0.6em 1.4em 0.5em 0.8em;width:100%;max-width:100%;box-sizing:border-box;margin:0;color:var(--rg-theme-filter-panel-text);border:1px solid var(--rg-theme-filter-panel-select-border);box-shadow:transparent;border-radius:0.5em;appearance:none;background-color:var(--rg-theme-filter-panel-input-bg);background-image:var(--revo-grid-filter-panel-select-arrow, url("data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%23007CB2%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E"));background-repeat:no-repeat, repeat;background-position:right 0.7em top 50%, 0 0;background-size:0.65em auto, 100%;}.select-css::-ms-expand{display:none}.select-css{}.select-css:hover{border-color:var(--rg-theme-filter-panel-select-border)}.select-css{}.select-css:focus{border-color:var(--rg-theme-filter-panel-select-border-hover);box-shadow:var(--rg-theme-filter-panel-focus-ring);outline:none}.select-css{}.select-css option{font-weight:normal}.select-css{}.select-css:disabled,.select-css[aria-disabled=true]{color:var(--rg-theme-filter-panel-muted-text);background-image:var(--revo-grid-filter-panel-select-arrow-disabled, url("data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22graytext%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E"))}.select-css:disabled:hover,.select-css[aria-disabled=true]{border-color:var(--rg-theme-filter-panel-select-border)}.multi-filter-list{margin-top:5px;margin-bottom:5px}.multi-filter-list div{white-space:nowrap}.multi-filter-list .multi-filter-list-row{display:flex;align-items:center;gap:6px;position:relative}.multi-filter-list .multi-filter-list-row.filter-row-dragging{opacity:0.65}.multi-filter-list .multi-filter-list-row.filter-row-drag-over::before{content:"";position:absolute;top:-4px;right:0;left:0;z-index:2;height:2px;background:var(--rg-theme-filter-panel-reorder-accent);border-radius:999px;box-shadow:0 0 0 2px var(--rg-theme-filter-panel-bg)}.multi-filter-list .multi-filter-list-row.filter-row-drop-active .filter-row-drop-target{pointer-events:auto}.multi-filter-list .filter-row-drop-target{position:absolute;inset:0;z-index:1;padding:0;pointer-events:none;background:transparent;border:0}.multi-filter-list .multi-filter-list-action{display:flex;align-self:stretch;flex:0 0 auto;justify-content:flex-end;align-items:center}.multi-filter-list .and-or-button{margin:0 0 0 10px;min-width:58px;cursor:pointer}.multi-filter-list .trash-button{margin:0 0 -2px 6px;padding:0;border:0;background:transparent;color:inherit;cursor:pointer;width:22px;height:100%;font-size:16px}.multi-filter-list .trash-button .trash-img{width:1em}.multi-filter-list .reorder-button{border:0;background:transparent;color:var(--rg-theme-filter-panel-reorder-color);cursor:grab;font-family:monospace;font-size:12px;letter-spacing:0;line-height:1;padding:6px 2px;transform:scaleX(0.8);width:16px}.multi-filter-list .reorder-button.filter-row-drag-over{color:var(--rg-theme-filter-panel-reorder-accent)}.multi-filter-list .reorder-button:active{cursor:grabbing}.multi-filter-list-container{padding:0;margin:0;list-style:none}.add-filter-divider{display:block;margin:0 -10px 10px -10px;border-bottom:1px solid var(--rg-theme-filter-panel-divider);height:10px}.select-input{display:flex;align-items:center;flex:1 1 auto;gap:6px;min-width:0}.select-input .select-filter,.select-input .filter-extra{flex:1 1 0;min-width:0}.select-input .select-filter{width:auto}.select-input .filter-extra{display:flex}.select-input .filter-extra>*{width:100%}.select-input input[type=text],.select-input input[type=date]{margin:0}`;
7610
7610
 
7611
7611
  const defaultType = 'none';
7612
7612
  const FILTER_LIST_CLASS = 'multi-filter-list';
@@ -7711,7 +7711,7 @@ class FilterPanel {
7711
7711
  getFilterItemsList() {
7712
7712
  var _a, _b;
7713
7713
  const prop = (_a = this.changes) === null || _a === void 0 ? void 0 : _a.prop;
7714
- if (typeof prop === 'undefined')
7714
+ if (prop === undefined)
7715
7715
  return '';
7716
7716
  const propFilters = (_b = this.filterItems[prop]) !== null && _b !== void 0 ? _b : [];
7717
7717
  const visibleFilterCount = propFilters.filter(filter => !filter.hidden).length;
@@ -7735,7 +7735,7 @@ class FilterPanel {
7735
7735
  'filter-row-dragging': isDragging,
7736
7736
  'filter-row-drag-over': isDragOver,
7737
7737
  } }, canReorder ? (hAsync("button", { type: "button", class: "filter-row-drop-target", tabIndex: -1, "aria-label": `${capts.filterCondition} ${index + 1}`, onDragOver: e => this.onFilterDragOver(e, filter.id), onDragLeave: () => this.onFilterDragLeave(filter.id), onDrop: e => this.onFilterDrop(e, prop, filter.id) })) : '', canReorder ? (hAsync(ReorderButton, { ariaLabel: capts.reorderFilter, dragging: isDragging, dragOver: isDragOver, onDragStart: e => this.onFilterDragStart(e, filter.id), onDragEnd: () => this.onFilterDragEnd(), onKeyDown: e => this.onFilterReorderKeyDown(e, prop, filter.id) })) : '', hAsync("div", { class: { 'select-input': true } }, hAsync("select", { class: "select-css select-filter", onChange: e => this.onFilterTypeChange(e, prop, index) }, this.renderSelectOptions(this.filterItems[prop][index].type, true)), extra ? hAsync("div", { class: "filter-extra" }, extra) : ''), hAsync("div", { class: FILTER_LIST_CLASS_ACTION }, andOrButton, hAsync(TrashButton, { ariaLabel: capts.removeFilter, onClick: () => this.onRemoveFilter(filter.id) })))));
7738
- })), propFilters.filter(f => !f.hidden).length > 0 ? hAsync("div", { class: "add-filter-divider" }) : ''));
7738
+ })), propFilters.some(f => !f.hidden) ? hAsync("div", { class: "add-filter-divider" }) : ''));
7739
7739
  }
7740
7740
  componentDidRender() {
7741
7741
  this.syncDialog();
@@ -8096,7 +8096,7 @@ class FilterPanel {
8096
8096
  top: `${(_d = (_c = this.changes) === null || _c === void 0 ? void 0 : _c.y) !== null && _d !== void 0 ? _d : 0}px`,
8097
8097
  };
8098
8098
  const capts = Object.assign(Object.assign({}, this.filterCaptionsInternal), this.filterCaptions);
8099
- return (hAsync(Host, { key: '8859c452eb08838f65f18efecbdde7f65fda2b49' }, hAsync("dialog", { key: 'f603067ff0986a9f344cbbf816388d2bbac198bb', class: "filter-panel-dialog", style: style, ref: el => (this.dialog = el), onCancel: e => {
8099
+ return (hAsync(Host, { key: 'd0e4ebb408750b11b3965da6a25e581733c968e3' }, hAsync("dialog", { key: '3df36777c931ec1063e8574169ca880a99dbfe41', class: "filter-panel-dialog", style: style, ref: el => (this.dialog = el), onCancel: e => {
8100
8100
  e.preventDefault();
8101
8101
  this.onCancel();
8102
8102
  } }, this.changes && [
@@ -8105,16 +8105,16 @@ class FilterPanel {
8105
8105
  ((_g = this.changes) === null || _g === void 0 ? void 0 : _g.hideDefaultFilters) !== true && [
8106
8106
  hAsync("label", { key: "filter-title" }, capts.title),
8107
8107
  hAsync("div", { key: "filter-holder", class: "filter-holder" }, this.getFilterItemsList()),
8108
- hAsync("div", { key: "add-filter", class: "add-filter" }, hAsync("select", { key: '2ec0a66918edf91bdde3962b6ec84c89f6f1c8f1', id: FILTER_ID, class: "select-css", onChange: e => this.onAddNewFilter(e) }, this.renderSelectOptions(this.currentFilterType))),
8108
+ hAsync("div", { key: "add-filter", class: "add-filter" }, hAsync("select", { key: 'e2a8bd29f2090d3e6c933795427b71ca190b82aa', id: FILTER_ID, class: "select-css", onChange: e => this.onAddNewFilter(e) }, this.renderSelectOptions(this.currentFilterType))),
8109
8109
  ],
8110
8110
  hAsync("slot", { key: "default-slot" }),
8111
8111
  ((_j = (_h = this.changes).extraBottomContent) === null || _j === void 0 ? void 0 : _j.call(_h, this.changes)) || '',
8112
8112
  hAsync("div", { key: "filter-actions", class: "filter-actions" }, this.disableDynamicFiltering && [
8113
- hAsync("button", { key: "save", id: "revo-button-save", "aria-label": "save", class: "revo-button green", onClick: () => this.onSave() }, capts.save),
8114
- hAsync("button", { key: "cancel", id: "revo-button-ok", "aria-label": "ok", class: "revo-button green", onClick: () => this.onCancel() }, capts.cancel),
8113
+ hAsync("button", { key: "save", type: "button", id: "revo-button-save", "aria-label": "save", class: "revo-button green", onClick: () => this.onSave() }, capts.save),
8114
+ hAsync("button", { key: "cancel", type: "button", id: "revo-button-ok", "aria-label": "ok", class: "revo-button green", onClick: () => this.onCancel() }, capts.cancel),
8115
8115
  ], !this.disableDynamicFiltering && [
8116
- hAsync("button", { key: "ok", id: "revo-button-ok", "aria-label": "ok", class: "revo-button green", onClick: () => this.onCancel() }, capts.ok),
8117
- hAsync("button", { key: "reset", id: "revo-button-reset", "aria-label": "reset", class: "revo-button outline", onClick: () => this.onReset() }, capts.reset),
8116
+ hAsync("button", { key: "ok", type: "button", id: "revo-button-ok", "aria-label": "ok", class: "revo-button green", onClick: () => this.onCancel() }, capts.ok),
8117
+ hAsync("button", { key: "reset", type: "button", id: "revo-button-reset", "aria-label": "reset", class: "revo-button outline", onClick: () => this.onReset() }, capts.reset),
8118
8118
  ]),
8119
8119
  hAsync("slot", { key: "footer-slot", slot: "footer" }),
8120
8120
  ])));
@@ -11168,13 +11168,8 @@ const trimmedPlugin$1 = (store) => ({
11168
11168
  set(k, newVal) {
11169
11169
  switch (k) {
11170
11170
  case 'trimmed': {
11171
- // full sorted items list
11172
- const proxy = store.get('proxyItems');
11173
- const trimmed = gatherTrimmedItems(newVal);
11174
- // filter our physical indexes which are not trimmed
11175
- const newItems = proxy.filter(v => !trimmed[v]);
11176
11171
  // set trimmed items in store
11177
- store.set('items', newItems);
11172
+ store.set('items', getVisibleItems(store.get('proxyItems'), newVal));
11178
11173
  break;
11179
11174
  }
11180
11175
  }
@@ -11190,6 +11185,14 @@ function gatherTrimmedItems(trimmedItems) {
11190
11185
  }
11191
11186
  return trimmed;
11192
11187
  }
11188
+ /**
11189
+ * Preserve proxy order while removing physical indexes hidden by any trim
11190
+ * layer.
11191
+ */
11192
+ function getVisibleItems(proxyItems, trimmedItems) {
11193
+ const trimmed = gatherTrimmedItems(trimmedItems);
11194
+ return proxyItems.filter(index => !trimmed[index]);
11195
+ }
11193
11196
 
11194
11197
  /**
11195
11198
  * Sets the given data on the specified store.
@@ -11496,7 +11499,7 @@ function gatherGroup(res, colData, collection, existingColumnsByType, level = 0)
11496
11499
  // fill columns
11497
11500
  resultItem.push(...collectionItem);
11498
11501
  // fill indexes per each viewport
11499
- res.columnGrouping[type].push(Object.assign(Object.assign({}, group), { indexes: Array(itemLength).fill(columnLength).map((v, i) => v + i) }));
11502
+ res.columnGrouping[type].push(Object.assign(Object.assign({}, group), { indexes: Array.from({ length: itemLength }, (_, i) => columnLength + i) }));
11500
11503
  }
11501
11504
  }
11502
11505
  });
@@ -11720,6 +11723,25 @@ async function timeout(delay = 0) {
11720
11723
  });
11721
11724
  }
11722
11725
 
11726
+ /**
11727
+ * Keeps the visible item collection empty while an asynchronous data operation
11728
+ * is pending. Proxy, trim, and source updates may still calculate new items,
11729
+ * but they must not expose those items until the owning operation releases the
11730
+ * pending state.
11731
+ */
11732
+ const pendingItemsPlugin = (store, isPending) => ({
11733
+ set(key, value) {
11734
+ if (key === 'items' &&
11735
+ isPending() &&
11736
+ Array.isArray(value) &&
11737
+ value.length) {
11738
+ // Writing an empty collection does not re-enter this branch, so the
11739
+ // guard safely replaces every attempted non-empty visibility update.
11740
+ store.set('items', []);
11741
+ }
11742
+ },
11743
+ });
11744
+
11723
11745
  /**
11724
11746
  * Data store
11725
11747
  * Manage the state of a data source and provide methods for updating, adding, and refreshing the data.
@@ -11729,9 +11751,15 @@ class DataStore {
11729
11751
  return this.dataStore;
11730
11752
  }
11731
11753
  constructor(type, storeData) {
11754
+ /**
11755
+ * The source, proxy order, and trims may continue changing,
11756
+ * but visible items must remain empty until the operation finishes.
11757
+ */
11758
+ this.itemsPending = false;
11732
11759
  const store = (this.dataStore = createStore(Object.assign({ items: [], proxyItems: [], source: [], groupingDepth: 0, groups: {}, type, trimmed: {}, groupingCustomRenderer: undefined, groupingCellRenderer: undefined }, storeData)));
11733
11760
  store.use(proxyPlugin(store));
11734
11761
  store.use(trimmedPlugin$1(store));
11762
+ store.use(pendingItemsPlugin(store, () => this.itemsPending));
11735
11763
  }
11736
11764
  /**
11737
11765
  * full data source update
@@ -11746,7 +11774,7 @@ class DataStore {
11746
11774
  // if true, current trimmed indexes will be re-applied to the new source
11747
11775
  preserveTrimmed = false) {
11748
11776
  const trimmed = this.store.get('trimmed');
11749
- const trimmedItems = silent && preserveTrimmed ? gatherTrimmedItems(trimmed) : null;
11777
+ const preserveCurrentTrimmed = silent && preserveTrimmed;
11750
11778
  // during full update we do drop trim
11751
11779
  if (!silent) {
11752
11780
  this.store.set('trimmed', {});
@@ -11761,7 +11789,7 @@ class DataStore {
11761
11789
  });
11762
11790
  // Explicit trim preservation is opt-in because physical indexes may change
11763
11791
  // across full data refreshes.
11764
- this.store.set('items', trimmedItems ? items.filter(i => !trimmedItems[i]) : items);
11792
+ this.store.set('items', preserveCurrentTrimmed ? getVisibleItems(items, trimmed) : items);
11765
11793
  // apply grouping if present
11766
11794
  if (grouping) {
11767
11795
  setStore(this.store, {
@@ -11778,6 +11806,21 @@ class DataStore {
11778
11806
  trimmed = Object.assign(Object.assign({}, trimmed), some);
11779
11807
  setStore(this.store, { trimmed });
11780
11808
  }
11809
+ /**
11810
+ * Keeps visible items empty while an asynchronous source operation is pending.
11811
+ * Releasing the state restores the current proxy order with all trims applied.
11812
+ */
11813
+ setItemsPending(pending) {
11814
+ if (this.itemsPending === pending) {
11815
+ return;
11816
+ }
11817
+ this.itemsPending = pending;
11818
+ if (pending) {
11819
+ this.store.set('items', []);
11820
+ return;
11821
+ }
11822
+ this.store.set('items', getVisibleItems(this.store.get('proxyItems'), this.store.get('trimmed')));
11823
+ }
11781
11824
  setSourceData(items, mutate = true) {
11782
11825
  setSourceByVirtualIndex(this.store, items, mutate);
11783
11826
  }
@@ -12155,9 +12198,7 @@ const trimmedPlugin = (storeService) => {
12155
12198
  }
12156
12199
  case 'trimmed': {
12157
12200
  const trim = val;
12158
- if (!trimmedPreviousSizes) {
12159
- trimmedPreviousSizes = storeService.store.get('sizes');
12160
- }
12201
+ trimmedPreviousSizes !== null && trimmedPreviousSizes !== void 0 ? trimmedPreviousSizes : (trimmedPreviousSizes = storeService.store.get('sizes'));
12161
12202
  trimmingObject = removeMultipleAndShift(trimmedPreviousSizes, trim || {});
12162
12203
  // save a reference to the trimmed object to prevent changes after trimming
12163
12204
  storeService.setSizes(trimmingObject);
@@ -13036,6 +13077,7 @@ const GROUP_COLUMN_PROP = `${GRID_INTERNALS}-prop`;
13036
13077
  const GROUP_ORIGINAL_INDEX = `${GRID_INTERNALS}-original-index`;
13037
13078
  const GROUP_EXPAND_BTN = `group-expand`;
13038
13079
  const GROUP_EXPAND_EVENT = `groupexpandclick`;
13080
+ const BEFORE_GROUPING_APPLY_EVENT = `beforegroupingapply`;
13039
13081
  const GROUPING_ROW_TYPE = 'rgRow';
13040
13082
 
13041
13083
  function getGroupValueDefault(item, prop, emptyGroupValue) {
@@ -13194,7 +13236,7 @@ function isGrouping(rgRow) {
13194
13236
  return typeof (rgRow === null || rgRow === void 0 ? void 0 : rgRow[PSEUDO_GROUP_ITEM]) !== 'undefined';
13195
13237
  }
13196
13238
  function isGroupingColumn(column) {
13197
- return typeof (column === null || column === void 0 ? void 0 : column[PSEUDO_GROUP_COLUMN]) !== 'undefined';
13239
+ return (column === null || column === void 0 ? void 0 : column[PSEUDO_GROUP_COLUMN]) !== undefined;
13198
13240
  }
13199
13241
  function measureEqualDepth(groupA, groupB) {
13200
13242
  const ln = groupA.length;
@@ -13798,6 +13840,16 @@ const DIRECTION_CODES = [
13798
13840
  class KeyboardService {
13799
13841
  constructor(sv) {
13800
13842
  this.sv = sv;
13843
+ /** Keep focus transitions in keydown order so rendering can scroll each cell into view. */
13844
+ this.keyChangeQueue = Promise.resolve(false);
13845
+ this.keyChangeGeneration = 0;
13846
+ this.applyingKeyChange = false;
13847
+ }
13848
+ /** Cancel delayed directional input after focus or edit context changes externally. */
13849
+ invalidatePendingChanges() {
13850
+ if (!this.applyingKeyChange) {
13851
+ this.keyChangeGeneration += 1;
13852
+ }
13801
13853
  }
13802
13854
  /**
13803
13855
  * Appends printable key input that arrives after edit mode was requested
@@ -13900,13 +13952,33 @@ class KeyboardService {
13900
13952
  if (!data) {
13901
13953
  return false;
13902
13954
  }
13955
+ const keyChangeGeneration = this.keyChangeGeneration;
13903
13956
  // this interval needed for several cases
13904
13957
  // grid could be resized before next click
13905
13958
  // at this case to avoid screen jump we use this interval
13906
13959
  await timeout(RESIZE_INTERVAL + 30);
13907
- const range = this.sv.selectionStore.get('range');
13908
- const focus = this.sv.selectionStore.get('focus');
13909
- return this.keyPositionChange(data.changes, range, focus, data.isMulti);
13960
+ const applyKeyChange = async () => {
13961
+ if (keyChangeGeneration !== this.keyChangeGeneration) {
13962
+ return false;
13963
+ }
13964
+ const range = this.sv.selectionStore.get('range');
13965
+ const focus = this.sv.selectionStore.get('focus');
13966
+ this.applyingKeyChange = true;
13967
+ let changed;
13968
+ try {
13969
+ changed = this.keyPositionChange(data.changes, range, focus, data.isMulti);
13970
+ }
13971
+ finally {
13972
+ this.applyingKeyChange = false;
13973
+ }
13974
+ await new Promise(resolve => requestAnimationFrame(() => {
13975
+ requestAnimationFrame(() => resolve());
13976
+ }));
13977
+ return changed;
13978
+ };
13979
+ const queuedChange = this.keyChangeQueue.then(applyKeyChange, applyKeyChange);
13980
+ this.keyChangeQueue = queuedChange.catch(() => false);
13981
+ return queuedChange;
13910
13982
  }
13911
13983
  keyPositionChange(changes, range, focus, isMulti = false) {
13912
13984
  if (!range || !focus) {
@@ -14293,6 +14365,8 @@ class OverlaySelection {
14293
14365
  * Selection & Keyboard
14294
14366
  */
14295
14367
  selectionServiceSet(selectionStore) {
14368
+ var _a;
14369
+ (_a = this.keyboardService) === null || _a === void 0 ? void 0 : _a.invalidatePendingChanges();
14296
14370
  // clear subscriptions
14297
14371
  this.unsubscribeSelectionStore.forEach(v => v());
14298
14372
  this.unsubscribeSelectionStore.length = 0;
@@ -14320,6 +14394,7 @@ class OverlaySelection {
14320
14394
  getData: () => this.getData(),
14321
14395
  selectAll: () => this.selectAll.emit(),
14322
14396
  });
14397
+ this.unsubscribeSelectionStore.push(selectionStore.onChange('focus', () => { var _a; return (_a = this.keyboardService) === null || _a === void 0 ? void 0 : _a.invalidatePendingChanges(); }), selectionStore.onChange('edit', () => { var _a; return (_a = this.keyboardService) === null || _a === void 0 ? void 0 : _a.invalidatePendingChanges(); }));
14323
14398
  this.createAutoFillService();
14324
14399
  }
14325
14400
  /** Autofill */
@@ -14356,11 +14431,12 @@ class OverlaySelection {
14356
14431
  this.selectionServiceSet(this.selectionStore);
14357
14432
  }
14358
14433
  disconnectedCallback() {
14359
- var _a;
14434
+ var _a, _b;
14360
14435
  // clear subscriptions
14436
+ (_a = this.keyboardService) === null || _a === void 0 ? void 0 : _a.invalidatePendingChanges();
14361
14437
  this.unsubscribeSelectionStore.forEach(v => v());
14362
14438
  this.unsubscribeSelectionStore.length = 0;
14363
- (_a = this.columnService) === null || _a === void 0 ? void 0 : _a.destroy();
14439
+ (_b = this.columnService) === null || _b === void 0 ? void 0 : _b.destroy();
14364
14440
  }
14365
14441
  async componentWillRender() {
14366
14442
  var _a, _b;
@@ -14372,9 +14448,7 @@ class OverlaySelection {
14372
14448
  renderRange(range) {
14373
14449
  const cell = getCell(range, this.dimensionRow.state, this.dimensionCol.state);
14374
14450
  const styles = styleByCellProps(cell);
14375
- return [
14376
- hAsync("div", { class: SELECTION_BORDER_CLASS, style: styles }, this.isMobileDevice && (hAsync("div", { class: "range-handlers" }, hAsync("span", { class: MOBILE_CLASS }), hAsync("span", { class: MOBILE_CLASS })))),
14377
- ];
14451
+ return (hAsync("div", { class: SELECTION_BORDER_CLASS, style: styles }, this.isMobileDevice && (hAsync("div", { class: "range-handlers" }, hAsync("span", { class: MOBILE_CLASS }), hAsync("span", { class: MOBILE_CLASS })))));
14378
14452
  }
14379
14453
  renderEditor() {
14380
14454
  // Check if edit access
@@ -14427,7 +14501,7 @@ class OverlaySelection {
14427
14501
  }
14428
14502
  // Range
14429
14503
  if (range) {
14430
- nodes.push(...this.renderRange(range));
14504
+ nodes.push(this.renderRange(range));
14431
14505
  }
14432
14506
  // Autofill
14433
14507
  if (focus && !this.readonly && this.range) {
@@ -14438,9 +14512,9 @@ class OverlaySelection {
14438
14512
  nodes.push(hAsync("revogr-order-editor", { ref: e => (this.orderEditor = e), dataStore: this.dataStore, dimensionRow: this.dimensionRow, dimensionCol: this.dimensionCol, parent: this.element, rowType: this.types.rowType, onRowdragstartinit: e => this.rowDragStart(e) }));
14439
14513
  }
14440
14514
  }
14441
- return (hAsync(Host, { key: '2d8dc4fd40a883fe59b24b2cfac1c370b9f0ac16', class: { mobile: this.isMobileDevice }, onDblClick: (e) => this.onElementDblClick(e), onMouseDown: (e) => this.onElementMouseDown(e), onTouchStart: (e) => this.onElementMouseDown(e, true), onCloseedit: (e) => this.closeEdit(e),
14515
+ return (hAsync(Host, { key: '230e2122c5c7065c072f02019d616a64949d54d0', class: { mobile: this.isMobileDevice }, onDblClick: (e) => this.onElementDblClick(e), onMouseDown: (e) => this.onElementMouseDown(e), onTouchStart: (e) => this.onElementMouseDown(e, true), onCloseedit: (e) => this.closeEdit(e),
14442
14516
  // it's done to be able to throw events from different levels, not just from editor
14443
- onCelledit: (e) => this.onEditCell(e) }, nodes, hAsync("slot", { key: '8ad5df55904ca6a8b2fb0e69c5f608ec7264a0f1', name: "data" })));
14517
+ onCelledit: (e) => this.onEditCell(e) }, nodes, hAsync("slot", { key: '47740a79c605258b4024384510358be927d000b7', name: "data" })));
14444
14518
  }
14445
14519
  /**
14446
14520
  * Executes the focus operation on the specified range of cells.
@@ -14637,12 +14711,12 @@ class OverlaySelection {
14637
14711
  clearCell() {
14638
14712
  var _a;
14639
14713
  const range = this.selectionStore.get('range');
14640
- if (range && !isRangeSingleCell(range)) {
14714
+ const focused = this.selectionStore.get('focus');
14715
+ if (range && (!isRangeSingleCell(range) || !focused)) {
14641
14716
  const data = this.columnService.getRangeStaticData(range, '');
14642
14717
  (_a = this.autoFillService) === null || _a === void 0 ? void 0 : _a.onRangeApply(data, range, range);
14643
14718
  }
14644
14719
  else if (this.canEdit()) {
14645
- const focused = this.selectionStore.get('focus');
14646
14720
  if (!focused) {
14647
14721
  return;
14648
14722
  }
@@ -15195,9 +15269,15 @@ class DataProvider {
15195
15269
  store.addTrimmed(trimmed);
15196
15270
  this.dimensionProvider.setTrimmed(trimmed, type);
15197
15271
  if (type === 'rgRow') {
15198
- this.dimensionProvider.setData(getVisibleSourceItem(store.store).length, type);
15272
+ this.dimensionProvider.setData(store.store.get('items').length, type);
15199
15273
  }
15200
15274
  }
15275
+ /** Keep a row source empty until its current asynchronous update is ready. */
15276
+ setItemsPending(pending, type = 'rgRow') {
15277
+ const store = this.stores[type];
15278
+ store.setItemsPending(pending);
15279
+ this.dimensionProvider.setData(store.store.get('items').length, type, type !== 'rgRow');
15280
+ }
15201
15281
  }
15202
15282
 
15203
15283
  const FALLBACK_MAX_SCROLL_SIZE = 16000000;
@@ -15294,7 +15374,9 @@ function isVirtualXDimension(type, disableVirtualX = false, virtualX = DEFAULT_V
15294
15374
  class DimensionProvider {
15295
15375
  constructor(viewports, config) {
15296
15376
  this.viewports = viewports;
15297
- const sizeChanged = debounce$1((k) => config.realSizeChanged(k), RESIZE_INTERVAL);
15377
+ this.config = config;
15378
+ this.rowDefinitions = [];
15379
+ const sizeChanged = debounce$1((k) => this.config.realSizeChanged(k), RESIZE_INTERVAL);
15298
15380
  this.stores = [...rowTypes, ...columnTypes].reduce((sources, t) => {
15299
15381
  sources[t] = new DimensionStore(t);
15300
15382
  sources[t].store.onChange('realSize', () => sizeChanged(t));
@@ -15312,6 +15394,20 @@ class DimensionProvider {
15312
15394
  this.viewports.stores[t].setOriginalSizes(this.stores[t].store.get('originItemSize'));
15313
15395
  this.setItemCount(count, t);
15314
15396
  }
15397
+ getRowDefinitions() {
15398
+ return this.rowDefinitions;
15399
+ }
15400
+ syncRowDefinitions(definitions) {
15401
+ this.rowDefinitions = definitions;
15402
+ }
15403
+ setRowDefinitions(definitions) {
15404
+ var _a, _b;
15405
+ if (definitions === this.rowDefinitions) {
15406
+ return;
15407
+ }
15408
+ this.syncRowDefinitions(definitions);
15409
+ (_b = (_a = this.config).rowDefinitionsChanged) === null || _b === void 0 ? void 0 : _b.call(_a, definitions);
15410
+ }
15315
15411
  /**
15316
15412
  * Apply new custom sizes to dimension and view port
15317
15413
  * @param type - dimension type
@@ -16313,6 +16409,13 @@ const filterNames = {
16313
16409
  lte: '<=',
16314
16410
  };
16315
16411
 
16412
+ /** Fewer rows keep the existing synchronous filtering behavior. */
16413
+ const ASYNC_FILTER_ROW_THRESHOLD = 15000;
16414
+ /** Maximum rows evaluated in one filtering chunk. */
16415
+ const FILTER_CHUNK_SIZE = 1000;
16416
+ /** Yield after approximately this much accumulated filtering work. */
16417
+ const FILTER_TIME_BUDGET_MS = 5;
16418
+
16316
16419
  // filter.plugin.tsx
16317
16420
  const FILTER_TRIMMED_TYPE = 'filter';
16318
16421
  const FILTER_CONFIG_CHANGED_EVENT = 'filterconfigchanged';
@@ -16357,6 +16460,7 @@ class FilterPlugin extends BasePlugin {
16357
16460
  this.filterFunctionsIndexedByType = Object.assign({}, filterCoreFunctionsIndexedByType);
16358
16461
  this.filterProp = FILTER_PROP;
16359
16462
  this.allowDuplicateOperators = true;
16463
+ this.filteringRunId = 0;
16360
16464
  if (config) {
16361
16465
  this.initConfig(config);
16362
16466
  }
@@ -16365,7 +16469,7 @@ class FilterPlugin extends BasePlugin {
16365
16469
  ...existingNodes,
16366
16470
  hAsync("revogr-filter-panel", { filterNames: this.filterNameIndexByType, filterEntities: this.filterFunctionsIndexedByType, filterCaptions: (_a = config === null || config === void 0 ? void 0 : config.localization) === null || _a === void 0 ? void 0 : _a.captions, onFilterChange: e => this.onFilterChange(e.detail), onResetChange: e => this.onFilterReset(e.detail), disableDynamicFiltering: config === null || config === void 0 ? void 0 : config.disableDynamicFiltering, closeOnOutsideClick: config === null || config === void 0 ? void 0 : config.closeFilterPanelOnOutsideClick, allowDuplicateOperators: this.allowDuplicateOperators, ref: e => (this.pop = e) }, ' ', this.extraContent()),
16367
16471
  ];
16368
- const aftersourceset = async () => {
16472
+ const aftersourceset = () => {
16369
16473
  const filterCollectionProps = Object.keys(this.filterCollection);
16370
16474
  if (filterCollectionProps.length > 0) {
16371
16475
  // handle old way of filtering by reworking FilterCollection to new MultiFilterItem
@@ -16382,12 +16486,26 @@ class FilterPlugin extends BasePlugin {
16382
16486
  }
16383
16487
  });
16384
16488
  }
16385
- if (Object.keys(this.multiFilterItems).length === 0) {
16489
+ if (!this.hasActiveFilters()) {
16490
+ this.cancelFiltering();
16386
16491
  return;
16387
16492
  }
16388
- await timeout();
16389
- await this.runFiltering(this.multiFilterItems);
16493
+ void this.runFiltering(this.multiFilterItems);
16390
16494
  };
16495
+ /**
16496
+ * This executes before the data store replaces its source.
16497
+ * For a large source with active filters:
16498
+ * 1. Existing filtering runs are invalidated.
16499
+ * 2. Pending state starts.
16500
+ * 3. Visible rows become empty.
16501
+ * 4. The source is replaced while the DataStore guard prevents it from exposing unfiltered rows.
16502
+ */
16503
+ this.addEventListener('beforesourceset', ({ detail }) => {
16504
+ if (detail.source.length >= ASYNC_FILTER_ROW_THRESHOLD &&
16505
+ this.hasActiveFilters()) {
16506
+ this.deferFiltering();
16507
+ }
16508
+ });
16391
16509
  this.addEventListener('headerclick', e => this.headerclick(e));
16392
16510
  this.addEventListener(FILTER_CONFIG_CHANGED_EVENT, ({ detail }) => {
16393
16511
  if (!detail) {
@@ -16548,7 +16666,7 @@ class FilterPlugin extends BasePlugin {
16548
16666
  // store the filter items
16549
16667
  this.multiFilterItems = filterItems;
16550
16668
  // run the filtering when the items change
16551
- this.runFiltering(this.multiFilterItems);
16669
+ await this.runFiltering(this.multiFilterItems);
16552
16670
  }
16553
16671
  onFilterReset(prop) {
16554
16672
  delete this.multiFilterItems[prop !== null && prop !== void 0 ? prop : ''];
@@ -16558,6 +16676,8 @@ class FilterPlugin extends BasePlugin {
16558
16676
  * Triggers grid filtering
16559
16677
  */
16560
16678
  async doFiltering(collection, source, columns, filterItems) {
16679
+ // creates the execution token - owns the actual calculation
16680
+ const runId = this.beginFiltering();
16561
16681
  const columnsToUpdate = [];
16562
16682
  /**
16563
16683
  * Loop through the columns and update the columns that need to be updated with the `hasFilter` property.
@@ -16582,7 +16702,25 @@ class FilterPlugin extends BasePlugin {
16582
16702
  column[this.filterProp] = true;
16583
16703
  }
16584
16704
  });
16585
- const itemsToTrim = this.getRowFilter(source, filterItems, columnByProp);
16705
+ let itemsToTrim;
16706
+ const hasFilters = Object.keys(filterItems).length > 0 || this.hasActiveFilters();
16707
+ const isLargeSource = hasFilters && source.length >= ASYNC_FILTER_ROW_THRESHOLD;
16708
+ if (isLargeSource) {
16709
+ this.providers.data.setItemsPending(true);
16710
+ await timeout();
16711
+ }
16712
+ if (!hasFilters) {
16713
+ itemsToTrim = {};
16714
+ }
16715
+ else if (isLargeSource && this.supportsChunkedFiltering()) {
16716
+ itemsToTrim = await this.getRowFilterInChunks(source, filterItems, columnByProp, runId);
16717
+ }
16718
+ else {
16719
+ itemsToTrim = this.getRowFilter(source, filterItems, columnByProp);
16720
+ }
16721
+ if (!itemsToTrim || runId !== this.filteringRunId) {
16722
+ return;
16723
+ }
16586
16724
  // check is filter event prevented
16587
16725
  const { defaultPrevented, detail } = this.emit('beforefiltertrimmed', {
16588
16726
  collection,
@@ -16590,10 +16728,12 @@ class FilterPlugin extends BasePlugin {
16590
16728
  source,
16591
16729
  filterItems,
16592
16730
  });
16593
- if (defaultPrevented) {
16731
+ if (defaultPrevented || runId !== this.filteringRunId) {
16732
+ this.releaseFiltering(runId);
16594
16733
  return;
16595
16734
  }
16596
16735
  this.providers.data.setTrimmed({ [FILTER_TRIMMED_TYPE]: detail.itemsToFilter });
16736
+ this.releaseFiltering(runId);
16597
16737
  // applies the hasFilter to the columns to show filter icon
16598
16738
  this.providers.column.updateColumns(columnsToUpdate);
16599
16739
  this.emit('afterfilterapply', {
@@ -16607,6 +16747,10 @@ class FilterPlugin extends BasePlugin {
16607
16747
  await this.runFiltering(this.multiFilterItems);
16608
16748
  }
16609
16749
  async runFiltering(multiFilterItems) {
16750
+ // runFiltering: First token: "Is this request still valid after event handlers run?"
16751
+ // doFiltering: Second token: "Is this calculation still the newest one?"
16752
+ // creates a preflight token and sets the grid to a pending state
16753
+ const runId = this.beginFiltering();
16610
16754
  const collection = {};
16611
16755
  // handle old filterCollection to return the first filter only (if any) from multiFilterItems
16612
16756
  const filterProps = Object.keys(multiFilterItems);
@@ -16630,10 +16774,67 @@ class FilterPlugin extends BasePlugin {
16630
16774
  columns,
16631
16775
  filterItems: this.multiFilterItems,
16632
16776
  });
16633
- if (defaultPrevented) {
16777
+ if (defaultPrevented || runId !== this.filteringRunId) {
16778
+ this.releaseFiltering(runId);
16634
16779
  return;
16635
16780
  }
16636
- this.doFiltering(detail.collection, detail.source, detail.columns, detail.filterItems);
16781
+ await this.doFiltering(detail.collection, detail.source, detail.columns, detail.filterItems);
16782
+ }
16783
+ /** Whether this plugin currently owns filter state that must follow a new source. */
16784
+ hasActiveFilters() {
16785
+ return (Object.keys(this.multiFilterItems).length > 0 ||
16786
+ Object.keys(this.filterCollection).length > 0);
16787
+ }
16788
+ /** Preserve whole-source semantics for plugins that override getRowFilter. */
16789
+ supportsChunkedFiltering() {
16790
+ return this.getRowFilter === FilterPlugin.prototype.getRowFilter;
16791
+ }
16792
+ /**
16793
+ * Hide visible rows and invalidate current filtering until a deferred filter
16794
+ * run is ready. Used by filter extensions with their own debounced state.
16795
+ */
16796
+ deferFiltering() {
16797
+ this.beginFiltering(true);
16798
+ }
16799
+ beginFiltering(pending = false) {
16800
+ const runId = ++this.filteringRunId;
16801
+ if (pending) {
16802
+ this.providers.data.setItemsPending(true);
16803
+ }
16804
+ return runId;
16805
+ }
16806
+ releaseFiltering(runId) {
16807
+ if (runId === this.filteringRunId) {
16808
+ this.providers.data.setItemsPending(false);
16809
+ }
16810
+ }
16811
+ cancelFiltering() {
16812
+ this.releaseFiltering(this.beginFiltering());
16813
+ }
16814
+ async getRowFilterInChunks(rows, filterItems, columnByProp, runId) {
16815
+ const trimmed = {};
16816
+ let sliceStarted = performance.now();
16817
+ for (let offset = 0; offset < rows.length; offset += FILTER_CHUNK_SIZE) {
16818
+ if (runId !== this.filteringRunId) {
16819
+ return;
16820
+ }
16821
+ const end = Math.min(offset + FILTER_CHUNK_SIZE, rows.length);
16822
+ const chunkTrimmed = this.getRowFilter(rows.slice(offset, end), filterItems, columnByProp);
16823
+ // filter that chunk
16824
+ for (const chunkIndex in chunkTrimmed) {
16825
+ trimmed[offset + Number(chunkIndex)] = true;
16826
+ }
16827
+ if (end < rows.length &&
16828
+ performance.now() - sliceStarted >= FILTER_TIME_BUDGET_MS) {
16829
+ await timeout();
16830
+ sliceStarted = performance.now();
16831
+ }
16832
+ }
16833
+ return runId === this.filteringRunId ? trimmed : undefined;
16834
+ }
16835
+ destroy() {
16836
+ this.cancelFiltering();
16837
+ super.destroy();
16637
16838
  }
16638
16839
  /**
16639
16840
  * Get trimmed rows based on filter
@@ -16737,6 +16938,60 @@ function allAndConditionsSatisfied(pendingResults) {
16737
16938
  return !pendingResults.includes(true);
16738
16939
  }
16739
16940
 
16941
+ /**
16942
+ * Restores group headers around already-sorted data indexes without rebuilding
16943
+ * the physical source. Group insertion order follows the first sorted member,
16944
+ * matching the order produced by regrouping a sorted source.
16945
+ */
16946
+ function gatherGroupedRowIndexes(source, sortedDataIndexes) {
16947
+ const groupPathByDataIndex = new Map();
16948
+ const currentGroupPath = [];
16949
+ source.forEach((model, physicalIndex) => {
16950
+ if (isGrouping(model)) {
16951
+ const depth = model[GROUP_DEPTH];
16952
+ if (typeof depth !== 'number') {
16953
+ return;
16954
+ }
16955
+ currentGroupPath.length = depth;
16956
+ currentGroupPath[depth] = physicalIndex;
16957
+ return;
16958
+ }
16959
+ if (model != null) {
16960
+ groupPathByDataIndex.set(physicalIndex, [...currentGroupPath]);
16961
+ }
16962
+ });
16963
+ const root = {
16964
+ children: new Map(),
16965
+ items: [],
16966
+ };
16967
+ for (const physicalIndex of sortedDataIndexes) {
16968
+ const groupPath = groupPathByDataIndex.get(physicalIndex);
16969
+ if (!(groupPath === null || groupPath === void 0 ? void 0 : groupPath.length)) {
16970
+ return undefined;
16971
+ }
16972
+ let node = root;
16973
+ for (const groupIndex of groupPath) {
16974
+ let child = node.children.get(groupIndex);
16975
+ if (!child) {
16976
+ child = { children: new Map(), items: [] };
16977
+ node.children.set(groupIndex, child);
16978
+ }
16979
+ node = child;
16980
+ }
16981
+ node.items.push(physicalIndex);
16982
+ }
16983
+ const groupedIndexes = [];
16984
+ const appendNode = (node) => {
16985
+ node.children.forEach((child, groupIndex) => {
16986
+ groupedIndexes.push(groupIndex);
16987
+ appendNode(child);
16988
+ });
16989
+ groupedIndexes.push(...node.items);
16990
+ };
16991
+ appendNode(root);
16992
+ return groupedIndexes;
16993
+ }
16994
+
16740
16995
  /**
16741
16996
  * Checks whether a sorting map contains at least one active order.
16742
16997
  *
@@ -16985,18 +17240,6 @@ const SortingSign = ({ column }) => {
16985
17240
  function getSortableRowIndexes(indexes, source) {
16986
17241
  return indexes.filter(index => !isGrouping(source[index]));
16987
17242
  }
16988
- function mergeSortedRowsWithGroups(indexes, source, sortedRows) {
16989
- if (sortedRows.length === indexes.length) {
16990
- return sortedRows;
16991
- }
16992
- let rowIndex = 0;
16993
- return indexes.map(index => {
16994
- if (isGrouping(source[index])) {
16995
- return index;
16996
- }
16997
- return sortedRows[rowIndex++];
16998
- });
16999
- }
17000
17243
  /**
17001
17244
  * Lifecycle
17002
17245
  * 1. @event `beforesorting` - Triggered when sorting just starts. Nothing has happened yet. This can be triggered from a column or from the source. If the type is from rows, the column will be undefined.
@@ -17156,6 +17399,7 @@ class SortingPlugin extends BasePlugin {
17156
17399
  storeService.setData({ proxyItems: newItemsOrder });
17157
17400
  }
17158
17401
  applySortingForStore(type, sorting, sortingFunc, sortingColumns, sortingOrder, ignoreViewportUpdate) {
17402
+ var _a;
17159
17403
  const storeService = this.providers.data.stores[type];
17160
17404
  // row data
17161
17405
  const source = storeService.store.get('source');
@@ -17163,7 +17407,10 @@ class SortingPlugin extends BasePlugin {
17163
17407
  const proxyItems = storeService.store.get('proxyItems');
17164
17408
  const sortItems = getSortableRowIndexes(proxyItems, source);
17165
17409
  const sortedItems = sortIndexByItems([...sortItems], source, sortingFunc, sorting, sortingColumns, sortingOrder);
17166
- const newItemsOrder = mergeSortedRowsWithGroups(proxyItems, source, sortedItems);
17410
+ const hasGroupingRows = sortedItems.length !== proxyItems.length;
17411
+ const newItemsOrder = hasGroupingRows
17412
+ ? (_a = gatherGroupedRowIndexes(source, sortedItems)) !== null && _a !== void 0 ? _a : proxyItems
17413
+ : sortedItems;
17167
17414
  // take row indexes before trim applied and proxy items
17168
17415
  const prevItems = storeService.store.get('items');
17169
17416
  storeService.setData({
@@ -17189,6 +17436,16 @@ class SortingPlugin extends BasePlugin {
17189
17436
  }
17190
17437
  this.postponeSort(order, sortingFunc, sortingColumns, sortingOrder, ignoreViewportUpdate);
17191
17438
  }
17439
+ /**
17440
+ * Schedules the current active sort again after another plugin rebuilds row
17441
+ * proxy indexes while keeping the physical source unchanged.
17442
+ */
17443
+ reapplySorting() {
17444
+ if (!hasActiveSorting(this.sorting) || !this.sortingFunc) {
17445
+ return;
17446
+ }
17447
+ this.startSorting(this.sorting, this.sortingFunc, this.sortingColumns, this.sortingOrder);
17448
+ }
17192
17449
  /**
17193
17450
  * Applies sorting requested by a sortable header click.
17194
17451
  *
@@ -17707,8 +17964,10 @@ const TRIMMED_GROUPING = 'grouping';
17707
17964
  * against the grouped physical source can still be remapped. If neither path
17708
17965
  * resolves to a number, the caller drops the stale trim entry.
17709
17966
  */
17710
- function convertTrimmedIndex(initialIndex, firstLevelMap, secondLevelMap) {
17711
- const sourceIndex = Number.parseInt(initialIndex, 10);
17967
+ function convertGroupingIndex(initialIndex, firstLevelMap, secondLevelMap) {
17968
+ const sourceIndex = typeof initialIndex === 'number'
17969
+ ? initialIndex
17970
+ : Number.parseInt(initialIndex, 10);
17712
17971
  const firstConversionIndex = firstLevelMap[sourceIndex];
17713
17972
  if (!secondLevelMap) {
17714
17973
  return firstConversionIndex;
@@ -17741,7 +18000,7 @@ function processDoubleConversionTrimmed(initiallyTrimed, firstLevelMap, secondLe
17741
18000
  * if item exists we find it in collection
17742
18001
  * we support 2 level of conversions
17743
18002
  */
17744
- const newConversionIndex = convertTrimmedIndex(initialIndex, firstLevelMap, secondLevelMap);
18003
+ const newConversionIndex = convertGroupingIndex(initialIndex, firstLevelMap, secondLevelMap);
17745
18004
  // Group rows do not exist in the ungrouped index map and must not leak into new trims.
17746
18005
  if (typeof newConversionIndex !== 'number') {
17747
18006
  continue;
@@ -17802,7 +18061,7 @@ function filterOutEmptyGroupRows(source, filterTrimmed) {
17802
18061
  return trimmed;
17803
18062
  }
17804
18063
 
17805
- var __rest$1 = (undefined && undefined.__rest) || function (s, e) {
18064
+ var __rest = (undefined && undefined.__rest) || function (s, e) {
17806
18065
  var t = {};
17807
18066
  for (var p in s)
17808
18067
  if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
@@ -17816,7 +18075,7 @@ var __rest$1 = (undefined && undefined.__rest) || function (s, e) {
17816
18075
  };
17817
18076
  const PADDING_DEPTH = 10;
17818
18077
  const RowRenderer = (_a, cells) => {
17819
- var { rowClass, index, size, start, depth, groupingLevel } = _a, attrs = __rest$1(_a, ["rowClass", "index", "size", "start", "depth", "groupingLevel"]);
18078
+ var { rowClass, index, size, start, depth, groupingLevel } = _a, attrs = __rest(_a, ["rowClass", "index", "size", "start", "depth", "groupingLevel"]);
17820
18079
  const props = Object.assign(Object.assign(Object.assign({}, attrs), { [DATA_ROW]: index }), (typeof groupingLevel === 'number'
17821
18080
  ? { 'data-level': groupingLevel }
17822
18081
  : {}));
@@ -17908,7 +18167,7 @@ const GroupingRowRenderer = (props) => {
17908
18167
  depth })))));
17909
18168
  }
17910
18169
  return (hAsync(RowRenderer, Object.assign({}, props, groupRowAttrs), hasExpand && [
17911
- hAsync("button", { class: { [GROUP_EXPAND_BTN]: true }, onClick: e => expandEvent(e, model, itemIndex) }, expandSvgIconVNode(expanded)),
18170
+ hAsync("button", { type: "button", class: { [GROUP_EXPAND_BTN]: true }, onClick: e => expandEvent(e, model, itemIndex) }, expandSvgIconVNode(expanded)),
17912
18171
  String(name),
17913
18172
  ]));
17914
18173
  };
@@ -17916,18 +18175,6 @@ const expandSvgIconVNode = (expanded = false) => {
17916
18175
  return (hAsync("svg", { "aria-hidden": "true", style: { transform: `rotate(${!expanded ? -90 : 0}deg)` }, focusable: "false", viewBox: "0 0 448 512" }, hAsync("path", { fill: "currentColor", d: "M207.029 381.476L12.686 187.132c-9.373-9.373-9.373-24.569 0-33.941l22.667-22.667c9.357-9.357 24.522-9.375 33.901-.04L224 284.505l154.745-154.021c9.379-9.335 24.544-9.317 33.901.04l22.667 22.667c9.373 9.373 9.373 24.569 0 33.941L240.971 381.476c-9.373 9.372-24.569 9.372-33.942 0z" })));
17917
18176
  };
17918
18177
 
17919
- var __rest = (undefined && undefined.__rest) || function (s, e) {
17920
- var t = {};
17921
- for (var p in s)
17922
- if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
17923
- t[p] = s[p];
17924
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
17925
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
17926
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
17927
- t[p[i]] = s[p[i]];
17928
- }
17929
- return t;
17930
- };
17931
18178
  class GroupingRowPlugin extends BasePlugin {
17932
18179
  getStore(type = GROUPING_ROW_TYPE) {
17933
18180
  return this.providers.data.stores[type].store;
@@ -17943,15 +18190,16 @@ class GroupingRowPlugin extends BasePlugin {
17943
18190
  }
17944
18191
  // expand event triggered
17945
18192
  onExpand({ virtualIndex }) {
17946
- const { source } = getSource(this.getStore().get('source'), this.getStore().get('proxyItems'));
17947
- let newTrimmed = this.getStore().get('trimmed')[TRIMMED_GROUPING];
17948
- let i = getPhysical(this.getStore(), virtualIndex);
18193
+ const store = this.getStore();
18194
+ const source = store.get('source');
18195
+ let newTrimmed = store.get('trimmed')[TRIMMED_GROUPING];
18196
+ const i = getPhysical(store, virtualIndex);
17949
18197
  const isExpanded = getExpanded(source[i]);
17950
18198
  if (!isExpanded) {
17951
- const { trimmed, items } = doExpand(virtualIndex, source, this.getStore().get('items'));
18199
+ const { trimmed, items: expandedItems } = doExpand(virtualIndex, source, store.get('items'));
17952
18200
  newTrimmed = Object.assign(Object.assign({}, newTrimmed), trimmed);
17953
- if (items) {
17954
- setItems(this.getStore(), items);
18201
+ if (expandedItems) {
18202
+ setItems(store, expandedItems);
17955
18203
  }
17956
18204
  }
17957
18205
  else {
@@ -17959,7 +18207,7 @@ class GroupingRowPlugin extends BasePlugin {
17959
18207
  newTrimmed = Object.assign(Object.assign({}, newTrimmed), trimmed);
17960
18208
  this.revogrid.clearFocus();
17961
18209
  }
17962
- this.getStore().set('source', source);
18210
+ store.set('source', source);
17963
18211
  this.revogrid.addTrimmed(newTrimmed, TRIMMED_GROUPING);
17964
18212
  }
17965
18213
  setColumnGrouping(cols) {
@@ -17981,7 +18229,7 @@ class GroupingRowPlugin extends BasePlugin {
17981
18229
  onDrag(e) {
17982
18230
  const { from, to } = e.detail;
17983
18231
  const isDown = to - from >= 0;
17984
- const { source } = getSource(this.getStore().get('source'), this.getStore().get('proxyItems'));
18232
+ const source = this.getStore().get('source');
17985
18233
  const items = this.getStore().get('items');
17986
18234
  let i = isDown ? from : to;
17987
18235
  const end = isDown ? to : from;
@@ -18007,21 +18255,13 @@ class GroupingRowPlugin extends BasePlugin {
18007
18255
  const source = this.getStore().get('source');
18008
18256
  return filterOutEmptyGroupRows(source, trimmed);
18009
18257
  }
18010
- isSortingRunning() {
18011
- const sortingPlugin = this.providers.plugins.getByClass(SortingPlugin);
18012
- return !!(sortingPlugin === null || sortingPlugin === void 0 ? void 0 : sortingPlugin.sortingPromise);
18013
- }
18014
18258
  /**
18015
- * Returns grouping options for regrouping that must preserve current UI state.
18016
- *
18017
- * `expandedAll` and config `prevExpanded` are initial/config instructions.
18018
- * Reusing them after sorting would reopen groups the user collapsed before
18019
- * sorting instead of using the current grouped source state.
18259
+ * Sorting changes proxy order without changing the physical source baseline.
18260
+ * Other proxy changes, such as row dragging, are user-authored source order
18261
+ * and must be retained when grouping is rebuilt.
18020
18262
  */
18021
- getCurrentExpandedOptions() {
18022
- var _a;
18023
- const _b = (_a = this.options) !== null && _a !== void 0 ? _a : {}, options = __rest(_b, ["expandedAll", "prevExpanded"]);
18024
- return options;
18263
+ isSortingActiveOrPending(sortingPlugin) {
18264
+ return !!(sortingPlugin === null || sortingPlugin === void 0 ? void 0 : sortingPlugin.sortingPromise) || hasActiveSorting(sortingPlugin === null || sortingPlugin === void 0 ? void 0 : sortingPlugin.sorting);
18025
18265
  }
18026
18266
  /**
18027
18267
  * Starts global source update with group clearing and applying new one
@@ -18034,7 +18274,12 @@ class GroupingRowPlugin extends BasePlugin {
18034
18274
  * @param newOldIndexMap - provides us mapping with new indexes vs old indexes, we would use it for trimmed mapping
18035
18275
  */
18036
18276
  const store = this.getStore();
18037
- const { source, prevExpanded, oldNewIndexes } = getSource(store.get('source'), store.get('proxyItems'), true);
18277
+ const sortingPlugin = this.providers.plugins.getByClass(SortingPlugin);
18278
+ const currentSource = store.get('source');
18279
+ const sourceItems = this.isSortingActiveOrPending(sortingPlugin)
18280
+ ? currentSource.map((_, index) => index)
18281
+ : store.get('proxyItems');
18282
+ const { source, prevExpanded, oldNewIndexes } = getSource(currentSource, sourceItems, true);
18038
18283
  const expanded = Object.assign({ prevExpanded }, options);
18039
18284
  /**
18040
18285
  * Group again
@@ -18044,8 +18289,13 @@ class GroupingRowPlugin extends BasePlugin {
18044
18289
  const customRenderer = options === null || options === void 0 ? void 0 : options.groupLabelTemplate;
18045
18290
  const cellRenderer = options === null || options === void 0 ? void 0 : options.groupCellTemplate;
18046
18291
  // setup source
18292
+ this.revogrid.dispatchEvent(new CustomEvent(BEFORE_GROUPING_APPLY_EVENT));
18047
18293
  this.providers.data.setData(sourceWithGroups, GROUPING_ROW_TYPE, this.revogrid.disableVirtualY, { depth, customRenderer, cellRenderer }, true);
18294
+ this.remapRowDefinitions(oldNewIndexes !== null && oldNewIndexes !== void 0 ? oldNewIndexes : {}, oldNewIndexMap, currentSource, sourceWithGroups);
18048
18295
  this.updateTrimmed(trimmed, oldNewIndexes !== null && oldNewIndexes !== void 0 ? oldNewIndexes : {}, oldNewIndexMap, sourceWithGroups);
18296
+ if (hasActiveSorting(sortingPlugin === null || sortingPlugin === void 0 ? void 0 : sortingPlugin.sorting)) {
18297
+ sortingPlugin === null || sortingPlugin === void 0 ? void 0 : sortingPlugin.reapplySorting();
18298
+ }
18049
18299
  }
18050
18300
  /**
18051
18301
  * Apply grouping on data set
@@ -18054,9 +18304,14 @@ class GroupingRowPlugin extends BasePlugin {
18054
18304
  */
18055
18305
  onDataSet(data) {
18056
18306
  var _a, _b, _c;
18307
+ const currentSource = this.getStore().get('source');
18308
+ const sortingPlugin = this.providers.plugins.getByClass(SortingPlugin);
18309
+ const currentItems = this.isSortingActiveOrPending(sortingPlugin)
18310
+ ? currentSource.map((_, index) => index)
18311
+ : this.getStore().get('proxyItems');
18312
+ const { prevExpanded, oldNewIndexes } = getSource(currentSource, currentItems, true);
18057
18313
  let preservedExpanded = {};
18058
18314
  if (((_a = this.options) === null || _a === void 0 ? void 0 : _a.preserveGroupingOnUpdate) !== false) {
18059
- let { prevExpanded } = getSource(this.getStore().get('source'), this.getStore().get('proxyItems'), true);
18060
18315
  preservedExpanded = prevExpanded;
18061
18316
  }
18062
18317
  const source = data.source.filter(s => !isGrouping(s));
@@ -18068,7 +18323,8 @@ class GroupingRowPlugin extends BasePlugin {
18068
18323
  customRenderer: options.groupLabelTemplate,
18069
18324
  cellRenderer: options.groupCellTemplate,
18070
18325
  });
18071
- this.updateTrimmed(trimmed, oldNewIndexMap, undefined, sourceWithGroups);
18326
+ queueMicrotask(() => this.remapRowDefinitions(oldNewIndexes !== null && oldNewIndexes !== void 0 ? oldNewIndexes : {}, oldNewIndexMap, currentSource, sourceWithGroups));
18327
+ this.updateTrimmed(trimmed, oldNewIndexMap, undefined, sourceWithGroups, { filterTrimmedMode: 'recompute-after-source-set' });
18072
18328
  }
18073
18329
  /**
18074
18330
  * External call to apply grouping. Called by revogrid when prop changed.
@@ -18103,10 +18359,6 @@ class GroupingRowPlugin extends BasePlugin {
18103
18359
  if (!(((_b = (_a = this.options) === null || _a === void 0 ? void 0 : _a.props) === null || _b === void 0 ? void 0 : _b.length) && ((_c = detail === null || detail === void 0 ? void 0 : detail.source) === null || _c === void 0 ? void 0 : _c.length))) {
18104
18360
  return;
18105
18361
  }
18106
- // if sorting is running don't apply grouping, wait for sorting, then it'll apply in @aftersortingapply
18107
- if (this.isSortingRunning()) {
18108
- return;
18109
- }
18110
18362
  this.onDataSet(detail);
18111
18363
  });
18112
18364
  this.addEventListener('beforecolumnsset', ({ detail }) => {
@@ -18121,17 +18373,6 @@ class GroupingRowPlugin extends BasePlugin {
18121
18373
  this.addEventListener('beforefiltertrimmed', ({ detail }) => {
18122
18374
  detail.itemsToFilter = this.beforeFilterTrimmed(detail.itemsToFilter);
18123
18375
  });
18124
- /**
18125
- * sorting applied need to clear grouping and apply again
18126
- * based on new results whole grouping order will changed
18127
- */
18128
- this.addEventListener('aftersortingapply', () => {
18129
- var _a, _b;
18130
- if (!((_b = (_a = this.options) === null || _a === void 0 ? void 0 : _a.props) === null || _b === void 0 ? void 0 : _b.length)) {
18131
- return;
18132
- }
18133
- this.doSourceUpdate(this.getCurrentExpandedOptions());
18134
- });
18135
18376
  /**
18136
18377
  * Apply logic for focus inside of grouping
18137
18378
  * We can't focus on grouping rows, navigation only inside of groups for now
@@ -18164,14 +18405,69 @@ class GroupingRowPlugin extends BasePlugin {
18164
18405
  }
18165
18406
  });
18166
18407
  // clear rows
18167
- const { source, oldNewIndexes } = getSource(this.getStore().get('source'), this.getStore().get('proxyItems'), true);
18408
+ const store = this.getStore();
18409
+ const sortingPlugin = this.providers.plugins.getByClass(SortingPlugin);
18410
+ const currentSource = store.get('source');
18411
+ const sourceItems = this.isSortingActiveOrPending(sortingPlugin)
18412
+ ? currentSource.map((_, index) => index)
18413
+ : store.get('proxyItems');
18414
+ const { source, oldNewIndexes } = getSource(currentSource, sourceItems, true);
18415
+ this.revogrid.dispatchEvent(new CustomEvent(BEFORE_GROUPING_APPLY_EVENT));
18168
18416
  this.providers.data.setData(source, GROUPING_ROW_TYPE, this.revogrid.disableVirtualY, undefined, true);
18417
+ this.remapRowDefinitions(oldNewIndexes !== null && oldNewIndexes !== void 0 ? oldNewIndexes : {}, undefined, currentSource, source);
18169
18418
  this.updateTrimmed(undefined, undefined, oldNewIndexes, source);
18419
+ if (hasActiveSorting(sortingPlugin === null || sortingPlugin === void 0 ? void 0 : sortingPlugin.sorting)) {
18420
+ sortingPlugin === null || sortingPlugin === void 0 ? void 0 : sortingPlugin.reapplySorting();
18421
+ }
18422
+ }
18423
+ remapRowDefinitions(firstLevelMap, secondLevelMap, previousSource, nextSource) {
18424
+ const definitions = this.providers.dimension.getRowDefinitions();
18425
+ const nextGroupIndexes = new Map();
18426
+ nextSource === null || nextSource === void 0 ? void 0 : nextSource.forEach((row, index) => {
18427
+ const groupId = row[PSEUDO_GROUP_ITEM_ID];
18428
+ if (groupId && !nextGroupIndexes.has(groupId)) {
18429
+ nextGroupIndexes.set(groupId, index);
18430
+ }
18431
+ });
18432
+ let changed = false;
18433
+ const remapped = definitions.flatMap(definition => {
18434
+ if (definition.type !== GROUPING_ROW_TYPE) {
18435
+ return [definition];
18436
+ }
18437
+ const previousRow = previousSource === null || previousSource === void 0 ? void 0 : previousSource[definition.index];
18438
+ const groupId = previousRow === null || previousRow === void 0 ? void 0 : previousRow[PSEUDO_GROUP_ITEM_ID];
18439
+ const index = groupId
18440
+ ? nextGroupIndexes.get(groupId)
18441
+ : convertGroupingIndex(definition.index, firstLevelMap, secondLevelMap);
18442
+ if (typeof index !== 'number') {
18443
+ changed = true;
18444
+ return [];
18445
+ }
18446
+ if (index < 0) {
18447
+ changed = true;
18448
+ return [];
18449
+ }
18450
+ if (index === definition.index) {
18451
+ return [definition];
18452
+ }
18453
+ changed = true;
18454
+ return [Object.assign(Object.assign({}, definition), { index })];
18455
+ });
18456
+ if (changed) {
18457
+ this.providers.dimension.setRowDefinitions(remapped);
18458
+ }
18170
18459
  }
18171
- updateTrimmed(trimmedGroup = {}, firstLevelMap = {}, secondLevelMap, source = this.getStore().get('source')) {
18460
+ updateTrimmed(trimmedGroup = {}, firstLevelMap = {}, secondLevelMap, source = this.getStore().get('source'), { filterTrimmedMode = 'remap', } = {}) {
18172
18461
  // map previously trimmed data
18173
18462
  const trimemedOptionsToUpgrade = processDoubleConversionTrimmed(this.getStore().get('trimmed'), firstLevelMap, secondLevelMap);
18174
18463
  for (let type in trimemedOptionsToUpgrade) {
18464
+ if (filterTrimmedMode === 'recompute-after-source-set' &&
18465
+ type === FILTER_TRIMMED_TYPE) {
18466
+ // The filter plugin recalculates this trim against the installed source
18467
+ // during aftersourceset. Reapplying remapped old indexes afterwards
18468
+ // would overwrite that fresh result.
18469
+ continue;
18470
+ }
18175
18471
  if (type === FILTER_TRIMMED_TYPE) {
18176
18472
  /** Regrouping changes physical indexes, so filter trim needs fresh group-header state. */
18177
18473
  trimemedOptionsToUpgrade[type] = filterOutEmptyGroupRows(source, trimemedOptionsToUpgrade[type]);
@@ -18342,7 +18638,7 @@ class ViewportService {
18342
18638
  const changedItems = {};
18343
18639
  for (const i of Object.keys(detail || {})) {
18344
18640
  const size = detail[i];
18345
- const virtualIndex = parseInt(i, 10);
18641
+ const virtualIndex = Number.parseInt(i, 10);
18346
18642
  const item = getSourceItem(store, virtualIndex);
18347
18643
  if (item) {
18348
18644
  changedItems[virtualIndex] = Object.assign(Object.assign({}, item), { size });
@@ -18471,29 +18767,25 @@ class GridScrollingService {
18471
18767
  this.elements = {};
18472
18768
  }
18473
18769
  async proxyScroll(e, key, skipEvent) {
18474
- var _a;
18475
18770
  let newEventPromise;
18476
18771
  let event = e;
18477
- for (let elKey in (skipEvent ? {} : this.elements)) {
18772
+ for (const elKey in (skipEvent ? {} : this.elements)) {
18478
18773
  // skip
18479
18774
  if (e.dimension === 'rgCol' && elKey === 'headerRow') {
18480
18775
  continue;
18481
18776
  // pinned column only
18482
18777
  }
18483
- else if (this.isPinnedColumn(key) && e.dimension === 'rgCol') {
18778
+ if (this.isPinnedColumn(key) && e.dimension === 'rgCol') {
18484
18779
  if (elKey === key || !e.delta) {
18485
18780
  continue;
18486
18781
  }
18487
- for (let el of this.elements[elKey]) {
18488
- if (el.changeScroll) {
18489
- newEventPromise = el.changeScroll(e);
18490
- }
18782
+ const changedEvent = this.changeScroll(this.elements[elKey], e);
18783
+ if (changedEvent) {
18784
+ newEventPromise = changedEvent;
18491
18785
  }
18492
18786
  }
18493
18787
  else {
18494
- for (let el of this.elements[elKey]) {
18495
- await ((_a = el.setScroll) === null || _a === void 0 ? void 0 : _a.call(el, e));
18496
- }
18788
+ await this.setScroll(this.elements[elKey], e);
18497
18789
  }
18498
18790
  }
18499
18791
  const newEvent = await newEventPromise;
@@ -18503,12 +18795,27 @@ class GridScrollingService {
18503
18795
  this.setViewport(skipEvent && this.isPinnedColumn(key)
18504
18796
  ? Object.assign(Object.assign({}, event), { dimension: key }) : event);
18505
18797
  }
18798
+ changeScroll(elements, e) {
18799
+ let changedEvent;
18800
+ for (const element of elements) {
18801
+ if (element.changeScroll) {
18802
+ changedEvent = element.changeScroll(e);
18803
+ }
18804
+ }
18805
+ return changedEvent;
18806
+ }
18807
+ async setScroll(elements, e) {
18808
+ var _a;
18809
+ for (const element of elements) {
18810
+ await ((_a = element.setScroll) === null || _a === void 0 ? void 0 : _a.call(element, e));
18811
+ }
18812
+ }
18506
18813
  /**
18507
18814
  * Silent scroll update for mobile devices when we have negative scroll top
18508
18815
  */
18509
18816
  async scrollSilentService(e, key) {
18510
18817
  var _a;
18511
- for (let elKey in this.elements) {
18818
+ for (const elKey in this.elements) {
18512
18819
  // skip same element update
18513
18820
  if (elKey === key) {
18514
18821
  continue;
@@ -18516,7 +18823,7 @@ class GridScrollingService {
18516
18823
  if (columnTypes.includes(key) &&
18517
18824
  (elKey === 'headerRow' ||
18518
18825
  columnTypes.includes(elKey))) {
18519
- for (let el of this.elements[elKey]) {
18826
+ for (const el of this.elements[elKey]) {
18520
18827
  await ((_a = el.changeScroll) === null || _a === void 0 ? void 0 : _a.call(el, e, true));
18521
18828
  }
18522
18829
  continue;
@@ -18524,7 +18831,7 @@ class GridScrollingService {
18524
18831
  }
18525
18832
  }
18526
18833
  isPinnedColumn(key) {
18527
- return !!key && ['colPinStart', 'colPinEnd'].indexOf(key) > -1;
18834
+ return !!key && ['colPinStart', 'colPinEnd'].includes(key);
18528
18835
  }
18529
18836
  registerElements(els) {
18530
18837
  this.elements = els;
@@ -18805,9 +19112,11 @@ class SelectionStoreConnector {
18805
19112
  continue;
18806
19113
  }
18807
19114
  const lastCell = store.store.get('lastCell');
18808
- if (lastCell) {
18809
- store.setRange({ x: 0, y: 0 }, { x: lastCell.x - 1, y: lastCell.y - 1 });
19115
+ if (!lastCell || lastCell.x <= 0 || lastCell.y <= 0) {
19116
+ store.setRangeArea(null);
19117
+ continue;
18810
19118
  }
19119
+ store.setRange({ x: 0, y: 0 }, { x: lastCell.x - 1, y: lastCell.y - 1 });
18811
19120
  }
18812
19121
  }
18813
19122
  }
@@ -18998,19 +19307,6 @@ const rowDefinitionByType = (newVal = []) => {
18998
19307
  }
18999
19308
  return result;
19000
19309
  };
19001
- const rowDefinitionRemoveByType = (oldVal = []) => {
19002
- const result = {};
19003
- for (const v of oldVal) {
19004
- let rowDefs = result[v.type];
19005
- if (!rowDefs) {
19006
- rowDefs = result[v.type] = [];
19007
- }
19008
- if (typeof v.size === 'number') {
19009
- rowDefs.push(v.index);
19010
- }
19011
- }
19012
- return result;
19013
- };
19014
19310
 
19015
19311
  const COLUMN_DRAG_CLASS = 'column-drag-start';
19016
19312
  class ColumnOrderHandler {
@@ -19570,6 +19866,7 @@ function isMobileDevice() {
19570
19866
  return /Mobi/i.test(navigator.userAgent) || /Android/i.test(navigator.userAgent) || navigator.maxTouchPoints > 0;
19571
19867
  }
19572
19868
 
19869
+ const toAriaIndex = (index) => `${index + 1}`;
19573
19870
  /**
19574
19871
  * WCAG Plugin is responsible for enhancing the accessibility features of the RevoGrid component.
19575
19872
  * It ensures that the grid is fully compliant with Web Content Accessibility Guidelines (WCAG) 2.1.
@@ -19613,14 +19910,14 @@ class WCAGPlugin extends BasePlugin {
19613
19910
  column.columnProperties = (...args) => {
19614
19911
  const result = (columnProperties === null || columnProperties === void 0 ? void 0 : columnProperties(...args)) || {};
19615
19912
  result.role = 'columnheader';
19616
- result['aria-colindex'] = `${index}`;
19913
+ result['aria-colindex'] = toAriaIndex(index);
19617
19914
  return result;
19618
19915
  };
19619
19916
  column.cellProperties = (...args) => {
19620
19917
  const wcagProps = {
19621
19918
  ['role']: 'gridcell',
19622
- ['aria-colindex']: `${index}`,
19623
- ['aria-rowindex']: `${args[0].rowIndex}`,
19919
+ ['aria-colindex']: toAriaIndex(index),
19920
+ ['aria-rowindex']: toAriaIndex(args[0].rowIndex),
19624
19921
  ['tabindex']: -1,
19625
19922
  };
19626
19923
  const columnProps = (cellProperties === null || cellProperties === void 0 ? void 0 : cellProperties(...args)) || {};
@@ -19635,7 +19932,7 @@ class WCAGPlugin extends BasePlugin {
19635
19932
  revogrid.setAttribute('aria-rowcount', `${detail.source.length}`);
19636
19933
  });
19637
19934
  this.addEventListener('beforerowrender', ({ detail, }) => {
19638
- detail.node.$attrs$ = Object.assign(Object.assign({}, detail.node.$attrs$), { role: 'row', ['aria-rowindex']: detail.item.itemIndex });
19935
+ detail.node.$attrs$ = Object.assign(Object.assign({}, detail.node.$attrs$), { role: 'row', ['aria-rowindex']: toAriaIndex(detail.item.itemIndex) });
19639
19936
  });
19640
19937
  // focuscell
19641
19938
  this.addEventListener('afterfocus', async (e) => {
@@ -19682,7 +19979,7 @@ class PluginService {
19682
19979
  return;
19683
19980
  }
19684
19981
  // Step 1: Identify plugins to remove, compare new and old plugins
19685
- const pluginsToRemove = (prevPlugins === null || prevPlugins === void 0 ? void 0 : prevPlugins.filter(prevPlugin => !plugins.some(userPlugin => userPlugin === prevPlugin))) || [];
19982
+ const pluginsToRemove = (prevPlugins === null || prevPlugins === void 0 ? void 0 : prevPlugins.filter(prevPlugin => !plugins.includes(prevPlugin))) || [];
19686
19983
  // Step 2: Remove old plugins
19687
19984
  pluginsToRemove.forEach(plugin => {
19688
19985
  var _a, _b;
@@ -19695,7 +19992,7 @@ class PluginService {
19695
19992
  // Step 3: Register user plugins
19696
19993
  plugins === null || plugins === void 0 ? void 0 : plugins.forEach(userPlugin => {
19697
19994
  // check if plugin already exists, if so, skip
19698
- const existingPlugin = this.internalPlugins.find(createdPlugin => createdPlugin instanceof userPlugin);
19995
+ const existingPlugin = this.internalPlugins.some(createdPlugin => createdPlugin instanceof userPlugin);
19699
19996
  if (existingPlugin) {
19700
19997
  return;
19701
19998
  }
@@ -19834,6 +20131,469 @@ class RTLPlugin extends BasePlugin {
19834
20131
  }
19835
20132
  }
19836
20133
 
20134
+ const DEFAULT_MIN_ROW_HEIGHT = 20;
20135
+ const finiteNumber = (value) => typeof value === 'number' && Number.isFinite(value);
20136
+ function resolveRowResizeConfig(config = {}) {
20137
+ const minHeight = finiteNumber(config.minHeight)
20138
+ ? Math.max(1, Math.round(config.minHeight))
20139
+ : DEFAULT_MIN_ROW_HEIGHT;
20140
+ const maxHeight = finiteNumber(config.maxHeight)
20141
+ ? Math.max(minHeight, Math.round(config.maxHeight))
20142
+ : undefined;
20143
+ return { minHeight, maxHeight, fullRow: config.fullRow === true };
20144
+ }
20145
+ function clampRowResizeHeight(height, config) {
20146
+ var _a;
20147
+ const rounded = Number.isFinite(height)
20148
+ ? Math.round(height)
20149
+ : config.minHeight;
20150
+ return Math.min(Math.max(rounded, config.minHeight), (_a = config.maxHeight) !== null && _a !== void 0 ? _a : Number.POSITIVE_INFINITY);
20151
+ }
20152
+ function getRowResizeIndexes({ rowType, rowIndex, rowCount, selectedRange, selectedRowType, }) {
20153
+ if (!selectedRange ||
20154
+ selectedRowType !== rowType ||
20155
+ rowIndex < Math.min(selectedRange.y, selectedRange.y1) ||
20156
+ rowIndex > Math.max(selectedRange.y, selectedRange.y1)) {
20157
+ return rowIndex >= 0 && rowIndex < rowCount ? [rowIndex] : [];
20158
+ }
20159
+ const start = Math.max(0, Math.min(selectedRange.y, selectedRange.y1));
20160
+ const end = Math.min(rowCount - 1, Math.max(selectedRange.y, selectedRange.y1));
20161
+ return Array.from({ length: Math.max(0, end - start + 1) }, (_, i) => start + i);
20162
+ }
20163
+ function createRowResizePatch(indexes, size) {
20164
+ return indexes.reduce((patch, index) => {
20165
+ patch[index] = size;
20166
+ return patch;
20167
+ }, {});
20168
+ }
20169
+ function mergeRowResizeDefinitions(definitions, rowType, physicalIndexes, size) {
20170
+ const targetIndexes = new Set(physicalIndexes);
20171
+ const existingIndexes = new Set();
20172
+ const merged = definitions.map(definition => {
20173
+ if (definition.type !== rowType || !targetIndexes.has(definition.index)) {
20174
+ return definition;
20175
+ }
20176
+ existingIndexes.add(definition.index);
20177
+ return Object.assign(Object.assign({}, definition), { size });
20178
+ });
20179
+ for (const index of targetIndexes) {
20180
+ if (!existingIndexes.has(index)) {
20181
+ merged.push({ type: rowType, index, size });
20182
+ }
20183
+ }
20184
+ return merged;
20185
+ }
20186
+
20187
+ const ROW_RESIZE_HANDLE_CLASS = 'row-resize-handle';
20188
+ const BEFORE_ROW_RESIZE_EVENT = 'beforerowresize';
20189
+ const ROW_RESIZE_EVENT = 'rowresize';
20190
+ const AFTER_ROW_RESIZE_EVENT = 'afterrowresize';
20191
+ const ROW_RESIZE_CANCEL_EVENT = 'rowresizecancel';
20192
+ class RowResizePlugin extends BasePlugin {
20193
+ constructor(revogrid, providers, config = {}) {
20194
+ super(revogrid, providers);
20195
+ this.enabled = false;
20196
+ this.appliedDefinitionIndexes = new Map();
20197
+ this.pendingBottomAnchor = false;
20198
+ this.keepBottomAnchor = false;
20199
+ this.rowDefinitionRemapQueued = false;
20200
+ this.pendingSourceCounts = new Map();
20201
+ this.previousBodyCursor = '';
20202
+ this.decorateRow = ({ detail, }) => {
20203
+ if (!this.enabled ||
20204
+ (detail.colType !== 'rowHeaders' && !this.config.fullRow)) {
20205
+ return;
20206
+ }
20207
+ const handle = this.h('div', {
20208
+ 'key': `row-resize-${detail.rowType}-${detail.item.itemIndex}`,
20209
+ 'class': { [ROW_RESIZE_HANDLE_CLASS]: true },
20210
+ 'data-row-resize-index': detail.item.itemIndex,
20211
+ 'aria-hidden': 'true',
20212
+ 'onPointerDown': (event) => this.startResize(event, detail.rowType, detail.item.itemIndex),
20213
+ });
20214
+ detail.node.$children$ = [...(detail.node.$children$ || []), handle];
20215
+ };
20216
+ this.cancelForDataChange = () => this.cancel('data-change');
20217
+ this.onPointerMove = (event) => {
20218
+ const active = this.active;
20219
+ if ((active === null || active === void 0 ? void 0 : active.pointerId) !== event.pointerId) {
20220
+ return;
20221
+ }
20222
+ event.preventDefault();
20223
+ active.lastEvent = event;
20224
+ this.pendingHeight = clampRowResizeHeight(active.startHeight + event.clientY - active.startY, this.config);
20225
+ if (this.animationFrame === undefined) {
20226
+ const view = this.revogrid.ownerDocument.defaultView;
20227
+ this.animationFrame = view === null || view === void 0 ? void 0 : view.requestAnimationFrame(() => {
20228
+ this.animationFrame = undefined;
20229
+ this.flushPendingResize();
20230
+ });
20231
+ }
20232
+ };
20233
+ this.onPointerUp = (event) => {
20234
+ const active = this.active;
20235
+ if ((active === null || active === void 0 ? void 0 : active.pointerId) !== event.pointerId) {
20236
+ return;
20237
+ }
20238
+ event.preventDefault();
20239
+ active.lastEvent = event;
20240
+ this.pendingHeight = clampRowResizeHeight(active.startHeight + event.clientY - active.startY, this.config);
20241
+ this.flushPendingResize();
20242
+ if (this.active !== active) {
20243
+ return;
20244
+ }
20245
+ const detail = this.eventDetail(active, event, active.currentHeight);
20246
+ this.finishGesture();
20247
+ this.commitResize(active);
20248
+ this.emit(AFTER_ROW_RESIZE_EVENT, detail);
20249
+ };
20250
+ this.onPointerCancel = (event) => {
20251
+ var _a;
20252
+ if (((_a = this.active) === null || _a === void 0 ? void 0 : _a.pointerId) === event.pointerId) {
20253
+ this.active.lastEvent = event;
20254
+ this.cancel('pointercancel');
20255
+ }
20256
+ };
20257
+ this.onKeyDown = (event) => {
20258
+ if (event.key === 'Escape' && this.active) {
20259
+ event.preventDefault();
20260
+ this.cancel('escape');
20261
+ }
20262
+ };
20263
+ this.onWindowBlur = () => this.cancel('blur');
20264
+ this.updateBottomAnchorState = ({ detail, }) => {
20265
+ if (detail.dimension !== 'rgRow') {
20266
+ return;
20267
+ }
20268
+ this.keepBottomAnchor = this.isMainViewportAtBottom(detail.coordinate);
20269
+ };
20270
+ this.applyPendingBottomAnchor = () => {
20271
+ if (!this.pendingBottomAnchor) {
20272
+ return;
20273
+ }
20274
+ this.pendingBottomAnchor = false;
20275
+ const dimension = this.providers.dimension.stores.rgRow.store;
20276
+ // Scroll surfaces have slightly different client sizes. Give the shared
20277
+ // scrolling service the content end and let each surface clamp to its own
20278
+ // exact bottom coordinate.
20279
+ void this.revogrid.scrollToCoordinate({ y: dimension.get('realSize') });
20280
+ };
20281
+ this.scheduleRowDefinitionRemap = () => {
20282
+ if (this.rowDefinitionRemapQueued) {
20283
+ return;
20284
+ }
20285
+ this.rowDefinitionRemapQueued = true;
20286
+ queueMicrotask(() => {
20287
+ if (!this.rowDefinitionRemapQueued) {
20288
+ return;
20289
+ }
20290
+ this.pruneRowDefinitions();
20291
+ this.reapplyRowDefinitionSizes();
20292
+ this.rowDefinitionRemapQueued = false;
20293
+ });
20294
+ };
20295
+ /** Map source-indexed row definitions back onto the current virtual order. */
20296
+ this.reapplyRowDefinitionSizes = () => {
20297
+ const rowDefinitions = this.providers.dimension.getRowDefinitions();
20298
+ for (const rowType of rowTypes) {
20299
+ const items = this.providers.data.stores[rowType].store.get('items');
20300
+ const definitions = new Map(rowDefinitions
20301
+ .filter(definition => definition.type === rowType)
20302
+ .map(definition => [definition.index, definition.size]));
20303
+ const appliedIndexes = this.appliedDefinitionIndexes.get(rowType);
20304
+ if (!definitions.size && !(appliedIndexes === null || appliedIndexes === void 0 ? void 0 : appliedIndexes.size)) {
20305
+ continue;
20306
+ }
20307
+ const dimension = this.providers.dimension.stores[rowType];
20308
+ const currentSizes = dimension.store.get('sizes');
20309
+ const sizes = Object.assign({}, currentSizes);
20310
+ for (const index of appliedIndexes || []) {
20311
+ delete sizes[index];
20312
+ }
20313
+ const indexes = new Set();
20314
+ items.forEach((physicalIndex, virtualIndex) => {
20315
+ const size = definitions.get(physicalIndex);
20316
+ if (size !== undefined) {
20317
+ sizes[virtualIndex] = size;
20318
+ indexes.add(virtualIndex);
20319
+ }
20320
+ });
20321
+ this.appliedDefinitionIndexes.set(rowType, indexes);
20322
+ const sizeKeys = Object.keys(sizes);
20323
+ if (sizeKeys.length !== Object.keys(currentSizes).length ||
20324
+ sizeKeys.some(index => sizes[index] !== currentSizes[index])) {
20325
+ this.providers.dimension.setCustomSizes(rowType, sizes);
20326
+ }
20327
+ }
20328
+ };
20329
+ this.config = resolveRowResizeConfig(config);
20330
+ if (new.target !== RowResizePlugin) {
20331
+ this.enabled = true;
20332
+ this.registerEventListeners();
20333
+ }
20334
+ }
20335
+ registerEventListeners() {
20336
+ this.addEventListener('beforerowrender', this.decorateRow);
20337
+ this.addEventListener('beforeanysource', () => {
20338
+ this.cancel('data-change');
20339
+ this.keepBottomAnchor = false;
20340
+ });
20341
+ this.addEventListener('afteranysource', ({ detail }) => {
20342
+ this.pendingSourceCounts.set(detail.type, detail.source.length);
20343
+ this.scheduleRowDefinitionRemap();
20344
+ });
20345
+ this.addEventListener('beforesourcesortingapply', this.cancelForDataChange);
20346
+ this.addEventListener('beforesortingapply', this.cancelForDataChange);
20347
+ this.addEventListener('sortingconfigchanged', this.cancelForDataChange);
20348
+ this.addEventListener(BEFORE_GROUPING_APPLY_EVENT, this.cancelForDataChange);
20349
+ this.addEventListener('aftersortingapply', this.scheduleRowDefinitionRemap);
20350
+ this.addEventListener('beforefilterapply', this.cancelForDataChange);
20351
+ this.addEventListener('afterfilterapply', this.scheduleRowDefinitionRemap);
20352
+ this.addEventListener('beforerowdefinition', () => {
20353
+ this.cancel('data-change');
20354
+ this.scheduleRowDefinitionRemap();
20355
+ });
20356
+ this.addEventListener('afterthemechanged', this.scheduleRowDefinitionRemap);
20357
+ this.addEventListener('aftertrimmed', this.scheduleRowDefinitionRemap);
20358
+ this.addEventListener('roworderchange', this.scheduleRowDefinitionRemap);
20359
+ this.addEventListener(GROUP_EXPAND_EVENT, () => {
20360
+ if (this.keepBottomAnchor) {
20361
+ this.pendingBottomAnchor = true;
20362
+ }
20363
+ this.scheduleRowDefinitionRemap();
20364
+ });
20365
+ this.addEventListener('aftergridrender', this.applyPendingBottomAnchor);
20366
+ this.addEventListener('viewportscroll', this.updateBottomAnchorState);
20367
+ this.addEventListener('rowheaderschanged', ({ detail }) => {
20368
+ if (!detail && !this.config.fullRow) {
20369
+ this.cancel('row-headers-hidden');
20370
+ }
20371
+ });
20372
+ }
20373
+ syncGridConfig(refresh = true) {
20374
+ const { plugins = [], resizeRow } = this.revogrid;
20375
+ const isCorePlugin = this.constructor === RowResizePlugin;
20376
+ const hasConfiguredPlugin = plugins.some(plugin => plugin !== RowResizePlugin &&
20377
+ plugin.prototype instanceof RowResizePlugin);
20378
+ const enabled = !isCorePlugin ||
20379
+ (!hasConfiguredPlugin && !!resizeRow);
20380
+ const resizeConfig = typeof resizeRow === 'object' ? resizeRow : undefined;
20381
+ const config = isCorePlugin
20382
+ ? resolveRowResizeConfig(resizeConfig)
20383
+ : this.config;
20384
+ const configChanged = config.minHeight !== this.config.minHeight ||
20385
+ config.maxHeight !== this.config.maxHeight ||
20386
+ config.fullRow !== this.config.fullRow;
20387
+ if (enabled === this.enabled && !configChanged) {
20388
+ return;
20389
+ }
20390
+ this.cancel('config-change');
20391
+ this.config = config;
20392
+ if (enabled !== this.enabled) {
20393
+ this.enabled = enabled;
20394
+ if (enabled) {
20395
+ this.registerEventListeners();
20396
+ }
20397
+ else {
20398
+ this.pendingBottomAnchor = false;
20399
+ this.keepBottomAnchor = false;
20400
+ this.rowDefinitionRemapQueued = false;
20401
+ this.pendingSourceCounts.clear();
20402
+ this.clearSubscriptions();
20403
+ }
20404
+ }
20405
+ if (refresh) {
20406
+ queueMicrotask(() => void this.revogrid.refresh());
20407
+ }
20408
+ }
20409
+ startResize(event, rowType, index) {
20410
+ var _a, _b;
20411
+ if (!this.enabled ||
20412
+ this.active ||
20413
+ event.defaultPrevented ||
20414
+ !event.isPrimary ||
20415
+ (event.pointerType !== 'touch' && event.button !== 0)) {
20416
+ return;
20417
+ }
20418
+ const dimension = this.providers.dimension.stores[rowType];
20419
+ const dimensionState = dimension.getCurrentState();
20420
+ const viewport = this.providers.viewport.stores[rowType];
20421
+ const item = getItemByIndex(dimensionState, index);
20422
+ const focusedStore = this.providers.selection.focusedStore;
20423
+ const selectedRowType = focusedStore
20424
+ ? this.providers.selection.storesYToType[focusedStore.position.y]
20425
+ : undefined;
20426
+ const indexes = getRowResizeIndexes({
20427
+ rowType,
20428
+ rowIndex: index,
20429
+ rowCount: dimensionState.count,
20430
+ selectedRange: this.providers.selection.selectedRange,
20431
+ selectedRowType,
20432
+ });
20433
+ if (!indexes.length) {
20434
+ return;
20435
+ }
20436
+ const previousSizes = indexes.reduce((sizes, rowIndex) => {
20437
+ const row = getItemByIndex(dimensionState, rowIndex);
20438
+ sizes[rowIndex] = row.end - row.start;
20439
+ return sizes;
20440
+ }, {});
20441
+ const startHeight = item.end - item.start;
20442
+ const active = {
20443
+ pointerId: event.pointerId,
20444
+ rowType,
20445
+ index,
20446
+ indexes,
20447
+ startY: event.clientY,
20448
+ startHeight,
20449
+ currentHeight: startHeight,
20450
+ previousSizes,
20451
+ originalCustomSizes: Object.assign({}, dimensionState.sizes),
20452
+ bottomAnchored: rowType === 'rgRow' &&
20453
+ this.isMainViewportAtBottom(viewport.lastCoordinate),
20454
+ lastEvent: event,
20455
+ };
20456
+ this.active = active;
20457
+ const beforeEvent = this.emit(BEFORE_ROW_RESIZE_EVENT, this.eventDetail(active, event, startHeight));
20458
+ if (beforeEvent.defaultPrevented) {
20459
+ if (this.active === active) {
20460
+ this.active = undefined;
20461
+ }
20462
+ return;
20463
+ }
20464
+ if (!this.enabled || this.active !== active) {
20465
+ return;
20466
+ }
20467
+ event.preventDefault();
20468
+ event.stopPropagation();
20469
+ const doc = this.revogrid.ownerDocument;
20470
+ this.previousBodyCursor = ((_a = doc.body) === null || _a === void 0 ? void 0 : _a.style.cursor) || '';
20471
+ if (doc.body) {
20472
+ doc.body.style.cursor = 'row-resize';
20473
+ }
20474
+ doc.addEventListener('pointermove', this.onPointerMove, true);
20475
+ doc.addEventListener('pointerup', this.onPointerUp, true);
20476
+ doc.addEventListener('pointercancel', this.onPointerCancel, true);
20477
+ doc.addEventListener('keydown', this.onKeyDown, true);
20478
+ (_b = doc.defaultView) === null || _b === void 0 ? void 0 : _b.addEventListener('blur', this.onWindowBlur);
20479
+ }
20480
+ flushPendingResize() {
20481
+ const active = this.active;
20482
+ if (!active || this.pendingHeight === undefined) {
20483
+ return;
20484
+ }
20485
+ const size = this.pendingHeight;
20486
+ this.pendingHeight = undefined;
20487
+ if (size === active.currentHeight) {
20488
+ return;
20489
+ }
20490
+ this.providers.dimension.setCustomSizes(active.rowType, createRowResizePatch(active.indexes, size), true);
20491
+ this.requestBottomAnchor(active);
20492
+ active.currentHeight = size;
20493
+ this.emit(ROW_RESIZE_EVENT, this.eventDetail(active, active.lastEvent, size));
20494
+ }
20495
+ cancel(reason) {
20496
+ const active = this.active;
20497
+ if (!active) {
20498
+ return;
20499
+ }
20500
+ const currentSizes = Object.assign({}, this.providers.dimension.stores[active.rowType].store.get('sizes'));
20501
+ for (const index of active.indexes) {
20502
+ if (Object.hasOwn(active.originalCustomSizes, index)) {
20503
+ currentSizes[index] = active.originalCustomSizes[index];
20504
+ }
20505
+ else {
20506
+ delete currentSizes[index];
20507
+ }
20508
+ }
20509
+ this.providers.dimension.setCustomSizes(active.rowType, currentSizes);
20510
+ this.requestBottomAnchor(active);
20511
+ const detail = Object.assign(Object.assign({}, this.eventDetail(active, active.lastEvent, active.startHeight)), { reason });
20512
+ this.finishGesture();
20513
+ this.emit(ROW_RESIZE_CANCEL_EVENT, detail);
20514
+ }
20515
+ eventDetail(active, originalEvent, size) {
20516
+ return {
20517
+ rowType: active.rowType,
20518
+ index: active.index,
20519
+ indexes: [...active.indexes],
20520
+ size,
20521
+ previousSizes: Object.assign({}, active.previousSizes),
20522
+ originalEvent,
20523
+ };
20524
+ }
20525
+ commitResize(active) {
20526
+ if (active.currentHeight === active.startHeight) {
20527
+ return;
20528
+ }
20529
+ const items = this.providers.data.stores[active.rowType].store.get('items');
20530
+ const physicalIndexes = active.indexes.reduce((result, index) => {
20531
+ const physicalIndex = items[index];
20532
+ if (physicalIndex !== undefined) {
20533
+ result.push(physicalIndex);
20534
+ }
20535
+ return result;
20536
+ }, []);
20537
+ if (physicalIndexes.length) {
20538
+ const rowDefinitions = mergeRowResizeDefinitions(this.providers.dimension.getRowDefinitions(), active.rowType, physicalIndexes, active.currentHeight);
20539
+ this.providers.dimension.setRowDefinitions(rowDefinitions);
20540
+ this.scheduleRowDefinitionRemap();
20541
+ this.keepBottomAnchor = active.bottomAnchored;
20542
+ this.requestBottomAnchor(active);
20543
+ }
20544
+ }
20545
+ requestBottomAnchor(active) {
20546
+ if (active.bottomAnchored) {
20547
+ this.pendingBottomAnchor = true;
20548
+ }
20549
+ }
20550
+ isMainViewportAtBottom(coordinate) {
20551
+ const dimension = this.providers.dimension.stores.rgRow.getCurrentState();
20552
+ const viewport = this.providers.viewport.stores.rgRow.store.state;
20553
+ return (dimension.realSize > viewport.clientSize &&
20554
+ coordinate >= getViewportMaxCoordinate(dimension, viewport.virtualSize));
20555
+ }
20556
+ pruneRowDefinitions() {
20557
+ if (!this.pendingSourceCounts.size) {
20558
+ return;
20559
+ }
20560
+ const definitions = this.providers.dimension.getRowDefinitions();
20561
+ const rowDefinitions = definitions.filter(definition => {
20562
+ const count = this.pendingSourceCounts.get(definition.type);
20563
+ return count === undefined || definition.index < count;
20564
+ });
20565
+ this.pendingSourceCounts.clear();
20566
+ if (rowDefinitions.length !== definitions.length) {
20567
+ this.providers.dimension.setRowDefinitions(rowDefinitions);
20568
+ }
20569
+ }
20570
+ finishGesture() {
20571
+ const doc = this.revogrid.ownerDocument;
20572
+ const view = doc.defaultView;
20573
+ if (this.animationFrame !== undefined) {
20574
+ view === null || view === void 0 ? void 0 : view.cancelAnimationFrame(this.animationFrame);
20575
+ }
20576
+ doc.removeEventListener('pointermove', this.onPointerMove, true);
20577
+ doc.removeEventListener('pointerup', this.onPointerUp, true);
20578
+ doc.removeEventListener('pointercancel', this.onPointerCancel, true);
20579
+ doc.removeEventListener('keydown', this.onKeyDown, true);
20580
+ view === null || view === void 0 ? void 0 : view.removeEventListener('blur', this.onWindowBlur);
20581
+ if (doc.body) {
20582
+ doc.body.style.cursor = this.previousBodyCursor;
20583
+ }
20584
+ this.animationFrame = undefined;
20585
+ this.pendingHeight = undefined;
20586
+ this.active = undefined;
20587
+ }
20588
+ destroy() {
20589
+ this.cancel('destroy');
20590
+ this.keepBottomAnchor = false;
20591
+ this.rowDefinitionRemapQueued = false;
20592
+ this.pendingSourceCounts.clear();
20593
+ super.destroy();
20594
+ }
20595
+ }
20596
+
19837
20597
  const revoGridStyleCss = () => `revo-grid:is([theme=default],[theme=dark]),revo-grid:not([theme]){--rg-theme-font-family:var( --revo-grid-font-family, Helvetica, Arial, Sans-Serif, serif );--rg-theme-font-size:var(--revo-grid-font-size, 12px);--rg-theme-header-height:var(--revo-grid-header-height, 30px);--rg-theme-header-font-size:var(--revo-grid-header-font-size, 12px);--rg-theme-header-font-weight:var(--revo-grid-header-font-weight, normal);--rg-theme-header-text-transform:var( --revo-grid-header-text-transform, uppercase );--rg-theme-header-text-align:var(--revo-grid-header-text-align, center);--rg-theme-cell-text-align:var(--revo-grid-cell-text-align, left);--rg-theme-header-padding:var(--revo-grid-header-padding, 0);--rg-theme-cell-padding:var(--revo-grid-cell-padding, 0 4px);border:1px solid var(--rg-theme-header-border);font-size:var(--rg-theme-font-size)}revo-grid:is([theme=default],[theme=dark]) .rowHeaders revogr-header,revo-grid:not([theme]) .rowHeaders revogr-header{box-shadow:-1px 0 0 0 var(--rg-theme-header-border) inset}revo-grid:is([theme=default],[theme=dark]) revogr-header,revo-grid:not([theme]) revogr-header{text-align:var(--rg-theme-header-text-align);line-height:var(--rg-theme-header-height);background-color:var(--rg-theme-header-bg)}revo-grid:is([theme=default],[theme=dark]) revogr-header .group-rgRow,revo-grid:not([theme]) revogr-header .group-rgRow{box-shadow:none}revo-grid:is([theme=default],[theme=dark]) revogr-header .group-rgRow .rgHeaderCell,revo-grid:not([theme]) revogr-header .group-rgRow .rgHeaderCell{box-shadow:-1px 0 0 0 var(--rg-theme-header-border), -1px 0 0 0 var(--rg-theme-header-border) inset, 0 -1px 0 0 var(--rg-theme-header-border), 0 -1px 0 0 var(--rg-theme-header-border) inset}revo-grid:is([theme=default],[theme=dark]) revogr-header .header-rgRow,revo-grid:is([theme=default],[theme=dark]) revogr-header .group-rgRow,revo-grid:not([theme]) revogr-header .header-rgRow,revo-grid:not([theme]) revogr-header .group-rgRow{text-transform:var(--rg-theme-header-text-transform);font-size:var(--rg-theme-header-font-size);font-weight:var(--rg-theme-header-font-weight);color:var(--rg-theme-header-color)}revo-grid:is([theme=default],[theme=dark]) revogr-header .header-rgRow,revo-grid:not([theme]) revogr-header .header-rgRow{height:var(--rg-theme-header-height);box-shadow:0 -1px 0 0 var(--rg-theme-header-border) inset}revo-grid:is([theme=default],[theme=dark]) revogr-header .rgHeaderCell,revo-grid:not([theme]) revogr-header .rgHeaderCell{box-shadow:-1px 0 0 0 var(--rg-theme-header-border) inset, 0 -1px 0 0 var(--rg-theme-header-border), 0 -1px 0 0 var(--rg-theme-header-border) inset}revo-grid:is([theme=default],[theme=dark]) .rowHeaders,revo-grid:not([theme]) .rowHeaders{background-color:var(--rg-theme-row-headers-bg)}revo-grid:is([theme=default],[theme=dark]) .rowHeaders revogr-data .rgCell,revo-grid:not([theme]) .rowHeaders revogr-data .rgCell{color:var(--rg-theme-row-headers-color)}revo-grid:is([theme=default],[theme=dark]) .rowHeaders revogr-data .rgCell:first-child,revo-grid:not([theme]) .rowHeaders revogr-data .rgCell:first-child{box-shadow:0 -1px 0 0 var(--rg-theme-header-border) inset}revo-grid:is([theme=default],[theme=dark]) .rowHeaders revogr-data .rgCell:not(:first-child),revo-grid:not([theme]) .rowHeaders revogr-data .rgCell:not(:first-child){box-shadow:0 -1px 0 0 var(--rg-theme-header-border) inset, -1px 0 0 0 var(--rg-theme-header-border) inset}revo-grid:is([theme=default],[theme=dark]) .rowHeaders revogr-data .rgCell:last-child,revo-grid:not([theme]) .rowHeaders revogr-data .rgCell:last-child{border-right:1px solid var(--rg-theme-header-border)}revo-grid:is([theme=default],[theme=dark]) .rowHeaders revogr-data revogr-header,revo-grid:not([theme]) .rowHeaders revogr-data revogr-header{box-shadow:0 -1px 0 0 var(--rg-theme-header-border) inset}revo-grid:is([theme=default],[theme=dark]) revogr-viewport-scroll.colPinStart revogr-data .rgRow .rgCell:last-child,revo-grid:not([theme]) revogr-viewport-scroll.colPinStart revogr-data .rgRow .rgCell:last-child{box-shadow:0 -1px 0 0 var(--rg-theme-cell-border) inset, -1px 0 0 0 var(--rg-theme-header-border) inset}revo-grid:is([theme=default],[theme=dark]) revogr-viewport-scroll.colPinStart .footer-wrapper revogr-data .rgRow:first-child .rgCell,revo-grid:not([theme]) revogr-viewport-scroll.colPinStart .footer-wrapper revogr-data .rgRow:first-child .rgCell{box-shadow:0 1px 0 0 var(--rg-theme-header-border) inset, -1px 0 0 0 var(--rg-theme-header-border) inset}revo-grid:is([theme=default],[theme=dark]) revogr-viewport-scroll.colPinEnd,revo-grid:is([theme=default],[theme=dark]) revogr-viewport-scroll.colPinEnd revogr-header,revo-grid:not([theme]) revogr-viewport-scroll.colPinEnd,revo-grid:not([theme]) revogr-viewport-scroll.colPinEnd revogr-header{box-shadow:1px 0 0 var(--rg-theme-header-border) inset}revo-grid:is([theme=default],[theme=dark]) .footer-wrapper revogr-data .rgRow:first-child .rgCell,revo-grid:not([theme]) .footer-wrapper revogr-data .rgRow:first-child .rgCell{box-shadow:0 1px 0 0 var(--rg-theme-cell-border) inset, -1px 0 0 0 var(--rg-theme-cell-border) inset, 0 -1px 0 0 var(--rg-theme-cell-border) inset}revo-grid:is([theme=default],[theme=dark]) revogr-data,revo-grid:not([theme]) revogr-data{text-align:var(--rg-theme-cell-text-align)}revo-grid:is([theme=default],[theme=dark]) revogr-data .revo-draggable,revo-grid:not([theme]) revogr-data .revo-draggable{float:left}revo-grid:is([theme=default],[theme=dark]) revogr-data .rgRow,revo-grid:not([theme]) revogr-data .rgRow{line-height:var(--rg-theme-row-size, 27px)}revo-grid:is([theme=default],[theme=dark]) revogr-data .rgCell,revo-grid:not([theme]) revogr-data .rgCell{padding:var(--rg-theme-cell-padding);box-shadow:0 -1px 0 0 var(--rg-theme-cell-border) inset, -1px 0 0 0 var(--rg-theme-cell-border) inset}revo-grid:is([theme=material],[theme=darkMaterial]),revo-grid[theme]:not([theme=default],[theme=dark],[theme=compact],[theme=darkCompact]){--rg-theme-font-family:var( --revo-grid-font-family, Nunito, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol' );--rg-theme-header-height:var(--revo-grid-header-height, 50px);--rg-theme-header-font-size:var( --revo-grid-header-font-size, var(--rg-theme-font-size) );--rg-theme-header-font-weight:var(--revo-grid-header-font-weight, 600);--rg-theme-header-text-transform:var( --revo-grid-header-text-transform, none );--rg-theme-header-text-align:var(--revo-grid-header-text-align, left);--rg-theme-cell-text-align:var(--revo-grid-cell-text-align, left);--rg-theme-header-padding:var(--revo-grid-header-padding, 0 15px);--rg-theme-cell-padding:var(--revo-grid-cell-padding, 0 15px);font-family:var(--rg-theme-font-family)}revo-grid:is([theme=material],[theme=darkMaterial]) revogr-header,revo-grid[theme]:not([theme=default],[theme=dark],[theme=compact],[theme=darkCompact]) revogr-header{color:var(--rg-theme-header-color);background-color:var(--rg-theme-header-bg);line-height:var(--rg-theme-header-height);font-size:var(--rg-theme-header-font-size);font-weight:var(--rg-theme-header-font-weight);text-transform:var(--rg-theme-header-text-transform);text-align:var(--rg-theme-header-text-align)}revo-grid:is([theme=material],[theme=darkMaterial]) revogr-header .rgHeaderCell,revo-grid[theme]:not([theme=default],[theme=dark],[theme=compact],[theme=darkCompact]) revogr-header .rgHeaderCell{padding:var(--rg-theme-header-padding);text-overflow:ellipsis}revo-grid:is([theme=material],[theme=darkMaterial]) revogr-header .header-rgRow,revo-grid[theme]:not([theme=default],[theme=dark],[theme=compact],[theme=darkCompact]) revogr-header .header-rgRow{height:var(--rg-theme-header-height)}revo-grid:is([theme=material],[theme=darkMaterial]) .rowHeaders,revo-grid[theme]:not([theme=default],[theme=dark],[theme=compact],[theme=darkCompact]) .rowHeaders{color:var(--rg-theme-row-headers-color);background-color:var(--rg-theme-row-headers-bg)}revo-grid:is([theme=material],[theme=darkMaterial]) .rowHeaders revogr-data .rgCell,revo-grid[theme]:not([theme=default],[theme=dark],[theme=compact],[theme=darkCompact]) .rowHeaders revogr-data .rgCell{color:var(--rg-theme-row-headers-color)}revo-grid:is([theme=material],[theme=darkMaterial]) revogr-data,revo-grid[theme]:not([theme=default],[theme=dark],[theme=compact],[theme=darkCompact]) revogr-data{text-align:var(--rg-theme-cell-text-align)}revo-grid:is([theme=material],[theme=darkMaterial]) revogr-data .rgRow,revo-grid[theme]:not([theme=default],[theme=dark],[theme=compact],[theme=darkCompact]) revogr-data .rgRow{line-height:var(--rg-theme-row-size, 42px)}revo-grid:is([theme=material],[theme=darkMaterial]) revogr-data .rgCell,revo-grid[theme]:not([theme=default],[theme=dark],[theme=compact],[theme=darkCompact]) revogr-data .rgCell{padding:var(--rg-theme-cell-padding);box-shadow:-1px 0 0 0 var(--rg-theme-cell-vertical-border) inset}revo-grid:is([theme=compact],[theme=darkCompact]){--rg-theme-font-family:var( --revo-grid-font-family, Nunito, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol' );--rg-theme-header-height:var(--revo-grid-header-height, 45px);--rg-theme-header-font-size:var( --revo-grid-header-font-size, var(--rg-theme-font-size) );--rg-theme-header-font-weight:var(--revo-grid-header-font-weight, 600);--rg-theme-header-text-transform:var( --revo-grid-header-text-transform, none );--rg-theme-header-text-align:var(--revo-grid-header-text-align, left);--rg-theme-cell-text-align:var(--revo-grid-cell-text-align, left);--rg-theme-header-padding:var(--revo-grid-header-padding, 0 15px);--rg-theme-cell-padding:var(--revo-grid-cell-padding, 0 15px);font-family:var(--rg-theme-font-family)}revo-grid:is([theme=compact],[theme=darkCompact]) revogr-header{color:var(--rg-theme-header-color);background-color:var(--rg-theme-header-bg);line-height:var(--rg-theme-header-height);font-size:var(--rg-theme-header-font-size);font-weight:var(--rg-theme-header-font-weight);text-transform:var(--rg-theme-header-text-transform);text-align:var(--rg-theme-header-text-align)}revo-grid:is([theme=compact],[theme=darkCompact]) revogr-header .rgHeaderCell{padding:var(--rg-theme-header-padding);text-overflow:ellipsis}revo-grid:is([theme=compact],[theme=darkCompact]) revogr-header .header-rgRow{height:var(--rg-theme-header-height)}revo-grid:is([theme=compact],[theme=darkCompact]) .rowHeaders{color:var(--rg-theme-row-headers-color);background-color:var(--rg-theme-row-headers-bg)}revo-grid:is([theme=compact],[theme=darkCompact]) .rowHeaders revogr-data .rgCell{color:var(--rg-theme-row-headers-color)}revo-grid:is([theme=compact],[theme=darkCompact]) revogr-data{text-align:var(--rg-theme-cell-text-align)}revo-grid:is([theme=compact],[theme=darkCompact]) revogr-data .rgRow{line-height:var(--rg-theme-row-size, 32px)}revo-grid:is([theme=compact],[theme=darkCompact]) revogr-data .rgCell{padding:var(--rg-theme-cell-padding);box-shadow:-1px 0 0 0 var(--rg-theme-cell-vertical-border) inset}revo-grid:is([theme=compact],[theme=darkCompact]) revo-dropdown .rv-dr-root{padding:0px 9px}revo-grid[dir=rtl] .viewports{flex-direction:row-reverse}revo-grid[dir=rtl] revogr-header .rgHeaderCell{text-align:right}revo-grid[dir=rtl] revogr-data .rgCell{text-align:right}revo-grid[dir=rtl] .rowHeaders revogr-data .rgCell{text-align:right}revo-grid[dir=rtl] revogr-filter-panel{direction:rtl}revo-grid[dir=rtl] revo-dropdown .rv-dr-root{text-align:right}revo-grid[dir=rtl] .drag-position{right:0;left:auto}revo-grid[dir=rtl] .drag-auto-scroll-y{right:0;left:auto}revo-grid[dir=rtl] .clipboard{right:0;left:auto}revo-grid[dir=rtl] .draggable{margin-left:-20px;margin-right:0;padding-right:20px;padding-left:5px}revo-grid[dir=rtl] .draggable .revo-alt-icon{right:5px;left:auto}revo-grid[dir=rtl] .focused-cell{border-right:2px solid var(--rg-theme-primary);border-left:none}revo-grid[dir=rtl] .selection-range{border-right:2px solid var(--rg-theme-primary);border-left:none}revo-grid[dir=rtl] .resize-handle{right:0;left:auto}revo-grid[dir=rtl] .sort-indicator{margin-left:0;margin-right:5px}revo-grid[dir=rtl] .filter-button{margin-left:0;margin-right:5px}revo-grid[dir=rtl] .group-expand{margin-right:0;margin-left:2px;padding-right:5px;padding-left:0}revo-grid[dir=rtl] .rgCell,revo-grid[dir=rtl] .rgHeaderCell{padding-left:5px;padding-right:5px}revo-grid[dir=rtl] revogr-edit{direction:rtl}revo-grid[dir=rtl] .rgHeaderCell{direction:rtl}revo-grid[dir=rtl] revogr-header,revo-grid[dir=rtl] revogr-data{text-align:right}revo-grid[dir=rtl]:is([theme=default],[theme=dark]) .rowHeaders,revo-grid[dir=rtl]:not([theme]) .rowHeaders{background-color:var(--rg-theme-row-headers-bg)}revo-grid[dir=rtl]:is([theme=default],[theme=dark]) .rowHeaders revogr-data .rgCell,revo-grid[dir=rtl]:not([theme]) .rowHeaders revogr-data .rgCell{color:var(--rg-theme-row-headers-color)}revo-grid[dir=rtl]:is([theme=default],[theme=dark]) .rowHeaders revogr-data .rgCell:first-child,revo-grid[dir=rtl]:not([theme]) .rowHeaders revogr-data .rgCell:first-child{box-shadow:0 -1px 0 0 var(--rg-theme-header-border) inset}revo-grid[dir=rtl]:is([theme=default],[theme=dark]) .rowHeaders revogr-data .rgCell:not(:first-child),revo-grid[dir=rtl]:not([theme]) .rowHeaders revogr-data .rgCell:not(:first-child){box-shadow:0 -1px 0 0 var(--rg-theme-header-border) inset, 1px 0 0 0 var(--rg-theme-header-border) inset}revo-grid[dir=rtl]:is([theme=default],[theme=dark]) .rowHeaders revogr-data .rgCell:last-child,revo-grid[dir=rtl]:not([theme]) .rowHeaders revogr-data .rgCell:last-child{border-left:1px solid var(--rg-theme-header-border);border-right:none}revo-grid[dir=rtl]:is([theme=default],[theme=dark]) .rowHeaders revogr-data revogr-header,revo-grid[dir=rtl]:not([theme]) .rowHeaders revogr-data revogr-header{box-shadow:0 -1px 0 0 var(--rg-theme-header-border) inset}revo-grid[dir=rtl]:is([theme=default],[theme=dark]) revogr-header,revo-grid[dir=rtl]:not([theme]) revogr-header{text-align:right}revo-grid[dir=rtl]:is([theme=default],[theme=dark]) revogr-data,revo-grid[dir=rtl]:not([theme]) revogr-data{text-align:right}.revo-drag-icon{width:11px;opacity:0.8}.revo-drag-icon::before{content:"::";display:inline-block}.revo-alt-icon{-webkit-mask-image:url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg viewBox='0 0 384 383' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cg%3E%3Cpath d='M192.4375,383 C197.424479,383 201.663411,381.254557 205.154297,377.763672 L205.154297,377.763672 L264.25,318.667969 C270.234375,312.683594 271.605794,306.075846 268.364258,298.844727 C265.122721,291.613607 259.51237,287.998047 251.533203,287.998047 L251.533203,287.998047 L213.382812,287.998047 L213.382812,212.445312 L288.935547,212.445312 L288.935547,250.595703 C288.935547,258.57487 292.551107,264.185221 299.782227,267.426758 C307.013346,270.668294 313.621094,269.296875 319.605469,263.3125 L319.605469,263.3125 L378.701172,204.216797 C382.192057,200.725911 383.9375,196.486979 383.9375,191.5 C383.9375,186.513021 382.192057,182.274089 378.701172,178.783203 L378.701172,178.783203 L319.605469,119.6875 C313.621094,114.201823 307.013346,112.955078 299.782227,115.947266 C292.551107,118.939453 288.935547,124.42513 288.935547,132.404297 L288.935547,132.404297 L288.935547,170.554688 L213.382812,170.554688 L213.382812,95.0019531 L251.533203,95.0019531 C259.51237,95.0019531 264.998047,91.3863932 267.990234,84.1552734 C270.982422,76.9241536 269.735677,70.3164062 264.25,64.3320312 L264.25,64.3320312 L205.154297,5.23632812 C201.663411,1.74544271 197.424479,0 192.4375,0 C187.450521,0 183.211589,1.74544271 179.720703,5.23632812 L179.720703,5.23632812 L120.625,64.3320312 C114.640625,70.3164062 113.269206,76.9241536 116.510742,84.1552734 C119.752279,91.3863932 125.36263,95.0019531 133.341797,95.0019531 L133.341797,95.0019531 L171.492188,95.0019531 L171.492188,170.554688 L95.9394531,170.554688 L95.9394531,132.404297 C95.9394531,124.42513 92.3238932,118.814779 85.0927734,115.573242 C77.8616536,112.331706 71.2539062,113.703125 65.2695312,119.6875 L65.2695312,119.6875 L6.17382812,178.783203 C2.68294271,182.274089 0.9375,186.513021 0.9375,191.5 C0.9375,196.486979 2.68294271,200.725911 6.17382812,204.216797 L6.17382812,204.216797 L65.2695312,263.3125 C71.2539062,268.798177 77.8616536,270.044922 85.0927734,267.052734 C92.3238932,264.060547 95.9394531,258.57487 95.9394531,250.595703 L95.9394531,250.595703 L95.9394531,212.445312 L171.492188,212.445312 L171.492188,287.998047 L133.341797,287.998047 C125.36263,287.998047 119.876953,291.613607 116.884766,298.844727 C113.892578,306.075846 115.139323,312.683594 120.625,318.667969 L120.625,318.667969 L179.720703,377.763672 C183.211589,381.254557 187.450521,383 192.4375,383 Z'%3E%3C/path%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg viewBox='0 0 384 383' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cg%3E%3Cpath d='M192.4375,383 C197.424479,383 201.663411,381.254557 205.154297,377.763672 L205.154297,377.763672 L264.25,318.667969 C270.234375,312.683594 271.605794,306.075846 268.364258,298.844727 C265.122721,291.613607 259.51237,287.998047 251.533203,287.998047 L251.533203,287.998047 L213.382812,287.998047 L213.382812,212.445312 L288.935547,212.445312 L288.935547,250.595703 C288.935547,258.57487 292.551107,264.185221 299.782227,267.426758 C307.013346,270.668294 313.621094,269.296875 319.605469,263.3125 L319.605469,263.3125 L378.701172,204.216797 C382.192057,200.725911 383.9375,196.486979 383.9375,191.5 C383.9375,186.513021 382.192057,182.274089 378.701172,178.783203 L378.701172,178.783203 L319.605469,119.6875 C313.621094,114.201823 307.013346,112.955078 299.782227,115.947266 C292.551107,118.939453 288.935547,124.42513 288.935547,132.404297 L288.935547,132.404297 L288.935547,170.554688 L213.382812,170.554688 L213.382812,95.0019531 L251.533203,95.0019531 C259.51237,95.0019531 264.998047,91.3863932 267.990234,84.1552734 C270.982422,76.9241536 269.735677,70.3164062 264.25,64.3320312 L264.25,64.3320312 L205.154297,5.23632812 C201.663411,1.74544271 197.424479,0 192.4375,0 C187.450521,0 183.211589,1.74544271 179.720703,5.23632812 L179.720703,5.23632812 L120.625,64.3320312 C114.640625,70.3164062 113.269206,76.9241536 116.510742,84.1552734 C119.752279,91.3863932 125.36263,95.0019531 133.341797,95.0019531 L133.341797,95.0019531 L171.492188,95.0019531 L171.492188,170.554688 L95.9394531,170.554688 L95.9394531,132.404297 C95.9394531,124.42513 92.3238932,118.814779 85.0927734,115.573242 C77.8616536,112.331706 71.2539062,113.703125 65.2695312,119.6875 L65.2695312,119.6875 L6.17382812,178.783203 C2.68294271,182.274089 0.9375,186.513021 0.9375,191.5 C0.9375,196.486979 2.68294271,200.725911 6.17382812,204.216797 L6.17382812,204.216797 L65.2695312,263.3125 C71.2539062,268.798177 77.8616536,270.044922 85.0927734,267.052734 C92.3238932,264.060547 95.9394531,258.57487 95.9394531,250.595703 L95.9394531,250.595703 L95.9394531,212.445312 L171.492188,212.445312 L171.492188,287.998047 L133.341797,287.998047 C125.36263,287.998047 119.876953,291.613607 116.884766,298.844727 C113.892578,306.075846 115.139323,312.683594 120.625,318.667969 L120.625,318.667969 L179.720703,377.763672 C183.211589,381.254557 187.450521,383 192.4375,383 Z'%3E%3C/path%3E%3C/g%3E%3C/svg%3E");width:11px;height:11px;background-size:cover;background-repeat:no-repeat}.arrow-down{position:absolute;right:5px;top:0}.arrow-down svg{width:8px;margin-top:5px;margin-left:5px;opacity:0.4}.cell-value-wrapper{margin-right:10px;overflow:hidden;text-overflow:ellipsis}revo-grid[theme]:is([theme=compact],[theme=darkCompact],[theme=material],[theme=darkMaterial]){background-color:transparent}revo-grid[theme]:is([theme=compact],[theme=darkCompact],[theme=material],[theme=darkMaterial]) revogr-header,revo-grid[theme]:is([theme=compact],[theme=darkCompact],[theme=material],[theme=darkMaterial]) .rowHeaders{background-color:transparent;color:inherit}revo-grid[theme]:is([theme=compact],[theme=darkCompact],[theme=material],[theme=darkMaterial]) .rowHeaders revogr-data .rgCell{color:inherit}revo-grid{--rg-theme-primary:var(--revo-grid-primary, #266ae8);--rg-theme-primary-transparent:var( --revo-grid-primary-transparent, rgba(38, 106, 232, 0.9) );--rg-theme-background:var(--revo-grid-background, #fff);--rg-theme-foreground:var(--revo-grid-foreground, black);--rg-theme-divider:var(--revo-grid-divider, gray);--rg-theme-shadow:var(--revo-grid-shadow, rgba(0, 0, 0, 0.15));--rg-theme-text:var(--revo-grid-text, black);--rg-theme-border:var(--revo-grid-border, rgba(0, 0, 0, 0.2));--rg-theme-header-bg:var(--revo-grid-header-bg, #f8f9fa);--rg-theme-header-color:var(--revo-grid-header-color, #000);--rg-theme-header-border:var(--revo-grid-header-border, #cecece);--rg-theme-header-focused-bg:var( --revo-grid-header-focused-bg, var(--rg-theme-focused-bg) );--rg-theme-header-hover-bg:var( --revo-grid-header-hover-bg, var(--rg-theme-row-hover) );--rg-theme-cell-border:var(--revo-grid-cell-border, #e2e3e3);--rg-theme-cell-vertical-border:var( --revo-grid-cell-vertical-border, transparent );--rg-theme-focused-bg:var(--revo-grid-focused-bg, rgba(233, 234, 237, 0.5));--rg-theme-row-hover:var(--revo-grid-row-hover, #f1f1f1);--rg-theme-row-headers-bg:var( --revo-grid-row-headers-bg, var(--rg-theme-header-bg) );--rg-theme-row-headers-color:var( --revo-grid-row-headers-color, var(--rg-theme-header-color) );--rg-theme-cell-disabled-bg:var( --revo-grid-cell-disabled-bg, rgba(0, 0, 0, 0.07) );--rg-theme-filter-panel-bg:var(--revo-grid-filter-panel-bg, #fff);--rg-theme-filter-panel-border:var(--revo-grid-filter-panel-border, #d9d9d9);--rg-theme-filter-panel-shadow:var( --revo-grid-filter-panel-shadow, rgba(0, 0, 0, 0.15) );--rg-theme-filter-panel-input-bg:var( --revo-grid-filter-panel-input-bg, #eaeaeb );--rg-theme-filter-panel-divider:var( --revo-grid-filter-panel-divider, #d9d9d9 );--rg-theme-filter-panel-select-border:var( --revo-grid-filter-panel-select-border, transparent );--rg-theme-filter-panel-select-border-hover:var( --revo-grid-filter-panel-select-border-hover, transparent );--rg-theme-filter-panel-reorder-accent:var( --revo-grid-filter-panel-reorder-accent, #007cb2 );--rg-theme-filter-panel-reorder-color:var( --revo-grid-filter-panel-reorder-color, #6b7280 );--rg-theme-filter-panel-text:var( --revo-grid-filter-panel-text, var(--rg-theme-text) );--rg-theme-filter-panel-muted-text:var( --revo-grid-filter-panel-muted-text, gray );--rg-theme-filter-panel-focus-ring:var( --revo-grid-filter-panel-focus-ring, 0 0 1px 3px rgba(59, 153, 252, 0.7) );--rg-theme-filter-panel-icon:var(--revo-grid-filter-panel-icon, gray);--rg-theme-filter-panel-icon-active:var( --revo-grid-filter-panel-icon-active, #10224a );--rg-theme-font-family:var( --revo-grid-font-family, Helvetica, Arial, Sans-Serif, serif );--rg-theme-font-size:var(--revo-grid-font-size, 14px);--rg-theme-header-height:var(--revo-grid-header-height, 30px);--rg-theme-header-font-size:var(--revo-grid-header-font-size, 12px);--rg-theme-header-font-weight:var(--revo-grid-header-font-weight, normal);--rg-theme-header-text-transform:var( --revo-grid-header-text-transform, uppercase );--rg-theme-header-text-align:var(--revo-grid-header-text-align, center);--rg-theme-cell-text-align:var(--revo-grid-cell-text-align, center);--rg-theme-header-padding:var(--revo-grid-header-padding, 0);--rg-theme-cell-padding:var(--revo-grid-cell-padding, 0);--rg-theme-selection-border:var(--revo-grid-selection-border, #0d63e8);--rg-theme-selection-bg:var(--revo-grid-selection-bg, transparent);--rg-theme-autofill-handle-bg:var( --revo-grid-autofill-handle-bg, var(--rg-theme-selection-border) );--rg-theme-autofill-handle-border:var( --revo-grid-autofill-handle-border, white );--rg-theme-range-handle-bg:var( --revo-grid-range-handle-bg, rgba(0, 0, 0, 0.2) );--rg-theme-temporary-range-border:var( --revo-grid-temporary-range-border, rgb(255, 94, 0) );--rg-theme-temporary-selection-border:var( --revo-grid-temporary-selection-border, gray );--rg-theme-header-resize-hover:var( --revo-grid-header-resize-hover, deepskyblue );--rg-theme-button-text:var(--revo-grid-button-text, #fff);--rg-theme-button-bg:var(--revo-grid-button-bg, #4545ff);--rg-theme-button-success-bg:var(--revo-grid-button-success-bg, #009037);--rg-theme-button-danger-bg:var(--revo-grid-button-danger-bg, #e0662e);--rg-theme-button-outline-border:var( --revo-grid-button-outline-border, #dbdbdb );--rg-theme-button-outline-text:var(--revo-grid-button-outline-text, #000)}revo-grid[data-rg-theme-scheme=dark]{color-scheme:dark;--rg-theme-background:var(--revo-grid-background, #212529);--rg-theme-foreground:var(--revo-grid-foreground, #fff);--rg-theme-text:var(--revo-grid-text, rgba(255, 255, 255, 0.9));--rg-theme-divider:var(--revo-grid-divider, #505050);--rg-theme-border:var( --revo-grid-border, rgba(255, 255, 255, 0.2) );--rg-theme-filter-panel-bg:var(--revo-grid-filter-panel-bg, #212529);--rg-theme-filter-panel-border:var( --revo-grid-filter-panel-border, #505050 );--rg-theme-filter-panel-input-bg:var( --revo-grid-filter-panel-input-bg, #343a40 );--rg-theme-filter-panel-divider:var( --revo-grid-filter-panel-divider, #505050 );--rg-theme-filter-panel-icon-active:var( --revo-grid-filter-panel-icon-active, #fff );--rg-theme-header-bg:var(--revo-grid-header-bg, #343a40);--rg-theme-header-color:var(--revo-grid-header-color, #fff);--rg-theme-header-border:var(--revo-grid-header-border, #505050);--rg-theme-cell-border:var(--revo-grid-cell-border, #424242);--rg-theme-focused-bg:var( --revo-grid-focused-bg, rgba(52, 58, 64, 0.5) );--rg-theme-row-hover:var( --revo-grid-row-hover, rgba(80, 80, 80, 0.5) );--rg-theme-row-headers-bg:var( --revo-grid-row-headers-bg, rgba(52, 58, 64, 0.8) );--rg-theme-row-headers-color:var( --revo-grid-row-headers-color, rgba(255, 255, 255, 0.8) );--rg-theme-cell-disabled-bg:var( --revo-grid-cell-disabled-bg, rgba(255, 255, 255, 0.07) );--rg-theme-button-outline-border:var( --revo-grid-button-outline-border, #404040 );--rg-theme-button-outline-text:var( --revo-grid-button-outline-text, #d8d8d8 )}revo-grid[data-rg-theme-scheme=light]{color-scheme:light}revo-grid{}revo-grid>*{--revo-grid-primary:var(--rg-theme-primary);--revo-grid-primary-transparent:var(--rg-theme-primary-transparent);--revo-grid-background:var(--rg-theme-background);--revo-grid-foreground:var(--rg-theme-foreground);--revo-grid-divider:var(--rg-theme-divider);--revo-grid-shadow:var(--rg-theme-shadow);--revo-grid-text:var(--rg-theme-text);--revo-grid-border:var(--rg-theme-border);--revo-grid-header-bg:var(--rg-theme-header-bg);--revo-grid-header-color:var(--rg-theme-header-color);--revo-grid-header-border:var(--rg-theme-header-border);--revo-grid-header-focused-bg:var(--rg-theme-header-focused-bg);--revo-grid-header-hover-bg:var(--rg-theme-header-hover-bg);--revo-grid-cell-border:var(--rg-theme-cell-border);--revo-grid-cell-vertical-border:var(--rg-theme-cell-vertical-border);--revo-grid-focused-bg:var(--rg-theme-focused-bg);--revo-grid-row-hover:var(--rg-theme-row-hover);--revo-grid-row-headers-bg:var(--rg-theme-row-headers-bg);--revo-grid-row-headers-color:var(--rg-theme-row-headers-color);--revo-grid-cell-disabled-bg:var(--rg-theme-cell-disabled-bg);--revo-grid-filter-panel-bg:var(--rg-theme-filter-panel-bg);--revo-grid-filter-panel-border:var(--rg-theme-filter-panel-border);--revo-grid-filter-panel-shadow:var(--rg-theme-filter-panel-shadow);--revo-grid-filter-panel-input-bg:var(--rg-theme-filter-panel-input-bg);--revo-grid-filter-panel-divider:var(--rg-theme-filter-panel-divider);--revo-grid-filter-panel-select-border:var(--rg-theme-filter-panel-select-border);--revo-grid-filter-panel-select-border-hover:var(--rg-theme-filter-panel-select-border-hover);--revo-grid-filter-panel-reorder-accent:var(--rg-theme-filter-panel-reorder-accent);--revo-grid-filter-panel-reorder-color:var(--rg-theme-filter-panel-reorder-color);--revo-grid-filter-panel-text:var(--rg-theme-filter-panel-text);--revo-grid-filter-panel-muted-text:var(--rg-theme-filter-panel-muted-text);--revo-grid-filter-panel-focus-ring:var(--rg-theme-filter-panel-focus-ring);--revo-grid-filter-panel-icon:var(--rg-theme-filter-panel-icon);--revo-grid-filter-panel-icon-active:var(--rg-theme-filter-panel-icon-active);--revo-grid-font-family:var(--rg-theme-font-family);--revo-grid-font-size:var(--rg-theme-font-size);--revo-grid-header-height:var(--rg-theme-header-height);--revo-grid-header-font-size:var(--rg-theme-header-font-size);--revo-grid-header-font-weight:var(--rg-theme-header-font-weight);--revo-grid-header-text-transform:var(--rg-theme-header-text-transform);--revo-grid-header-text-align:var(--rg-theme-header-text-align);--revo-grid-cell-text-align:var(--rg-theme-cell-text-align);--revo-grid-header-padding:var(--rg-theme-header-padding);--revo-grid-cell-padding:var(--rg-theme-cell-padding);--revo-grid-selection-border:var(--rg-theme-selection-border);--revo-grid-selection-bg:var(--rg-theme-selection-bg);--revo-grid-autofill-handle-bg:var(--rg-theme-autofill-handle-bg);--revo-grid-autofill-handle-border:var(--rg-theme-autofill-handle-border);--revo-grid-range-handle-bg:var(--rg-theme-range-handle-bg);--revo-grid-temporary-range-border:var(--rg-theme-temporary-range-border);--revo-grid-temporary-selection-border:var(--rg-theme-temporary-selection-border);--revo-grid-header-resize-hover:var(--rg-theme-header-resize-hover);--revo-grid-button-text:var(--rg-theme-button-text);--revo-grid-button-bg:var(--rg-theme-button-bg);--revo-grid-button-success-bg:var(--rg-theme-button-success-bg);--revo-grid-button-danger-bg:var(--rg-theme-button-danger-bg);--revo-grid-button-outline-border:var(--rg-theme-button-outline-border);--revo-grid-button-outline-text:var(--rg-theme-button-outline-text)}revo-grid{direction:ltr !important}revo-grid revogr-header .header-rgRow.group{box-shadow:0 -1px 0 0 var(--rg-theme-header-border) inset}revo-grid revogr-header .header-rgRow:not(.group){box-shadow:0 -1px 0 0 var(--rg-theme-header-border), 0 -1px 0 0 var(--rg-theme-header-border) inset}revo-grid revogr-header .rgHeaderCell.sortable:hover{background-color:var(--rg-theme-header-hover-bg)}revo-grid revogr-header .rgHeaderCell.focused-cell{background:var(--rg-theme-header-focused-bg)}revo-grid .footer-wrapper revogr-data{box-shadow:0 -1px 0 var(--rg-theme-cell-border)}revo-grid revogr-viewport-scroll.colPinStart{box-shadow:-1px 0 0 var(--rg-theme-cell-border) inset}revo-grid revogr-viewport-scroll.colPinEnd{box-shadow:-1px 0 0 var(--rg-theme-cell-border)}revo-grid revogr-data .rgRow{box-shadow:0 -1px 0 0 var(--rg-theme-cell-border) inset}revo-grid revogr-data .rgRow.focused-rgRow{background-color:var(--rg-theme-focused-bg)}revo-grid revogr-data .rgCell{color:var(--rg-theme-text)}revo-grid revogr-data .rgCell.disabled{background-color:var(--rg-theme-cell-disabled-bg)}revo-grid{display:flex !important;height:100%;min-height:300px;background-color:var(--rg-theme-background);font-family:var(--rg-theme-font-family);font-size:var(--rg-theme-font-size);position:relative;color:var(--rg-theme-text);-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;}revo-grid .attribution{position:absolute;bottom:0;left:0;right:0;z-index:1000;width:0;height:0;border-left:4px solid var(--rg-theme-primary-transparent);border-bottom:4px solid var(--rg-theme-primary-transparent);border-top:4px solid transparent;border-right:4px solid transparent;cursor:pointer}revo-grid .attribution .value{position:absolute;bottom:0;left:0;background-color:var(--rg-theme-background);padding:4px;border-radius:4px;box-shadow:0 1px 10px var(--rg-theme-border);white-space:nowrap;text-decoration:none;color:var(--rg-theme-text);letter-spacing:0.3px;font-size:11px;opacity:0;width:4px;overflow:hidden;transition:opacity 0.5s ease-in-out, width 0.3s ease-in-out}revo-grid .attribution:hover .value{width:63px;opacity:1}revo-grid.column-draggable.column-drag-start:hover,revo-grid.column-draggable.column-drag-start *:hover{cursor:grabbing}revo-grid .footer-wrapper,revo-grid .header-wrapper{width:100%}revo-grid .footer-wrapper revogr-data,revo-grid .header-wrapper revogr-data{z-index:3}revo-grid revo-dropdown{width:100%}revo-grid revo-dropdown .rv-dr-root{max-height:100%}revo-grid revo-dropdown.shrink label{opacity:0}revo-grid .viewports{max-width:100%;display:flex;flex-direction:row;align-items:flex-start;flex-grow:1}revo-grid{display:flex;flex-direction:column;width:100%;height:100%}revo-grid .main-viewport{flex-grow:1;height:0;display:flex;justify-content:space-between;flex-direction:row}revo-grid .draggable{position:fixed;height:30px;line-height:30px;background:var(--rg-theme-background);border-radius:3px;display:block;z-index:100;margin-top:5px;margin-right:-20px;box-shadow:0 4px 20px 0 var(--rg-theme-shadow);padding-left:20px;padding-right:5px}revo-grid .draggable.hidden{display:none}revo-grid .draggable .revo-alt-icon{background-color:var(--rg-theme-foreground);position:absolute;left:5px;top:10px}revo-grid .draggable-wrapper.hidden{display:none}revo-grid .drag-position{position:absolute;left:0;right:0;height:1px;z-index:2;background:var(--rg-theme-divider);pointer-events:none}revo-grid .drag-position-y{position:absolute;top:0;left:0;bottom:0;width:1px;z-index:2;background:var(--rg-theme-divider);pointer-events:none}revo-grid .drag-auto-scroll-y{pointer-events:none;position:absolute;left:0;top:0;height:50px;width:1px}revo-grid .clipboard{position:absolute;left:0;top:0}revo-grid revogr-scroll-virtual{position:relative}revo-grid revogr-scroll-virtual.vertical,revo-grid revogr-scroll-virtual.horizontal{z-index:3}`;
19838
20598
 
19839
20599
  const DEFAULT_COLUMN_SIZE = 100;
@@ -19924,7 +20684,12 @@ class RevoGridComponent {
19924
20684
  /** When true, grid in read only mode. */
19925
20685
  this.readonly = false;
19926
20686
  /** When true, columns are resizable. */
19927
- this.resize = false;
20687
+ this.resize = true;
20688
+ /**
20689
+ * Enables row resizing. Pass a configuration object to customize the
20690
+ * height limits or enable resize edges across the full row.
20691
+ */
20692
+ this.resizeRow = false;
19928
20693
  /**
19929
20694
  * Prevents horizontal scroll state from being mirrored across viewport sections.
19930
20695
  */
@@ -19995,15 +20760,15 @@ class RevoGridComponent {
19995
20760
  */
19996
20761
  this.autoSizeColumn = false;
19997
20762
  /**
19998
- * Enables filter plugin.
20763
+ * Enables filter plugin. Enabled by default; set to `false` to opt out.
19999
20764
  * Can be boolean.
20000
20765
  * Or can be filter collection See `FilterCollection` for more info.
20001
20766
  */
20002
- this.filter = false;
20767
+ this.filter = true;
20003
20768
  /**
20004
20769
  * Enable column move plugin.
20005
20770
  */
20006
- this.canMoveColumns = false;
20771
+ this.canMoveColumns = true;
20007
20772
  /**
20008
20773
  * Trimmed rows.
20009
20774
  * Functionality which allows to hide rows from main data set.
@@ -20013,7 +20778,7 @@ class RevoGridComponent {
20013
20778
  /**
20014
20779
  * Enable export plugin.
20015
20780
  */
20016
- this.exporting = false;
20781
+ this.exporting = true;
20017
20782
  /**
20018
20783
  * Stretch strategy for columns by `StretchColumn` plugin.
20019
20784
  * For example if there are more space on the right last column size would be increased.
@@ -20105,7 +20870,7 @@ class RevoGridComponent {
20105
20870
  var _a;
20106
20871
  if (this.dataProvider && this.columnProvider && !skipDataUpdate) {
20107
20872
  const columnProp = (_a = this.columnProvider.getColumn(col, colType)) === null || _a === void 0 ? void 0 : _a.prop;
20108
- if (typeof columnProp !== 'undefined') {
20873
+ if (columnProp !== undefined) {
20109
20874
  this.dataProvider.setCellData({
20110
20875
  type: rowType,
20111
20876
  rowIndex: row,
@@ -20701,29 +21466,31 @@ class RevoGridComponent {
20701
21466
  vals: after,
20702
21467
  oldVals: before,
20703
21468
  });
20704
- // apply new values
21469
+ this.dimensionProvider.syncRowDefinitions(newVal);
20705
21470
  const newRows = rowDefinitionByType(newVal);
20706
- // clear current defs
20707
- if (oldVal) {
20708
- const remove = rowDefinitionRemoveByType(oldVal);
20709
- // clear all old data and drop sizes
20710
- for (const t in remove) {
20711
- if (remove.hasOwnProperty(t)) {
20712
- const type = t;
20713
- const store = this.dataProvider.stores[type];
20714
- const sourceLength = store.store.get('source').length;
20715
- this.dimensionProvider.clearSize(type, sourceLength);
20716
- }
20717
- }
20718
- }
20719
- // set new sizes
21471
+ const oldRows = rowDefinitionByType(oldVal);
21472
+ const dataProvider = this.dataProvider;
21473
+ const dimensionProvider = this.dimensionProvider;
20720
21474
  rowTypes.forEach((t) => {
20721
- var _a;
20722
21475
  const newSizes = newRows[t];
20723
- // apply new sizes or force update
20724
- if (newSizes || forceUpdate) {
20725
- (_a = this.dimensionProvider) === null || _a === void 0 ? void 0 : _a.setCustomSizes(t, (newSizes === null || newSizes === void 0 ? void 0 : newSizes.sizes) || {});
21476
+ const oldSizes = oldRows[t];
21477
+ if (!newSizes && !oldSizes && !forceUpdate) {
21478
+ return;
20726
21479
  }
21480
+ const sizes = Object.assign({}, dimensionProvider.stores[t].store.get('sizes'));
21481
+ const definitionSizes = (newSizes === null || newSizes === void 0 ? void 0 : newSizes.sizes) || {};
21482
+ const previousDefinitionSizes = (oldSizes === null || oldSizes === void 0 ? void 0 : oldSizes.sizes) || {};
21483
+ const items = dataProvider.stores[t].store.get('items');
21484
+ items.forEach((physicalIndex, virtualIndex) => {
21485
+ if (Object.hasOwn(previousDefinitionSizes, physicalIndex) &&
21486
+ sizes[virtualIndex] === previousDefinitionSizes[physicalIndex]) {
21487
+ delete sizes[virtualIndex];
21488
+ }
21489
+ if (Object.hasOwn(definitionSizes, physicalIndex)) {
21490
+ sizes[virtualIndex] = definitionSizes[physicalIndex];
21491
+ }
21492
+ });
21493
+ dimensionProvider.setCustomSizes(t, sizes);
20727
21494
  });
20728
21495
  }
20729
21496
  trimmedRowsChanged(newVal = {}) {
@@ -20772,6 +21539,9 @@ class RevoGridComponent {
20772
21539
  rowHeadersChange(rowHeaders) {
20773
21540
  this.rowheaderschanged.emit(rowHeaders);
20774
21541
  }
21542
+ resizeRowChanged() {
21543
+ this.syncRowResizeConfig();
21544
+ }
20775
21545
  /**
20776
21546
  * Register external VNodes
20777
21547
  */
@@ -20794,6 +21564,7 @@ class RevoGridComponent {
20794
21564
  */
20795
21565
  pluginsChanged(plugins = [], prevPlugins) {
20796
21566
  this.pluginService.addUserPluginsAndCreate(this.element, plugins, prevPlugins, this.getPluginData());
21567
+ this.syncRowResizeConfig();
20797
21568
  }
20798
21569
  // #endregion
20799
21570
  // #region Plugins
@@ -20834,10 +21605,15 @@ class RevoGridComponent {
20834
21605
  this.pluginService.add(new SortingPlugin(this.element, pluginData));
20835
21606
  // register grouping plugin
20836
21607
  this.pluginService.add(new GroupingRowPlugin(this.element, pluginData));
21608
+ this.pluginService.add(new RowResizePlugin(this.element, pluginData));
20837
21609
  if (this.canMoveColumns) {
20838
21610
  this.pluginService.add(new ColumnMovePlugin(this.element, pluginData));
20839
21611
  }
20840
21612
  }
21613
+ syncRowResizeConfig() {
21614
+ const plugin = this.pluginService.getByClass(RowResizePlugin);
21615
+ plugin === null || plugin === void 0 ? void 0 : plugin.syncGridConfig();
21616
+ }
20841
21617
  getPluginData() {
20842
21618
  if (!this.dimensionProvider || !this.dataProvider || !this.columnProvider || !this.viewportProvider || !this.selectionStoreConnector) {
20843
21619
  return;
@@ -20880,6 +21656,9 @@ class RevoGridComponent {
20880
21656
  this.themeService.setDefinitions(this.themeDefinitions);
20881
21657
  this.dimensionProvider = new DimensionProvider(this.viewportProvider, {
20882
21658
  realSizeChanged: (k) => this.contentsizechanged.emit(k),
21659
+ rowDefinitionsChanged: definitions => {
21660
+ this.rowDefinitions = definitions;
21661
+ },
20883
21662
  });
20884
21663
  this.dimensionProvider.setSettings({ originItemSize: getColumnSize(this.colSize) }, 'rgCol');
20885
21664
  this.columnProvider = new ColumnDataProvider();
@@ -21070,6 +21849,9 @@ class RevoGridComponent {
21070
21849
  "rowHeaders": [{
21071
21850
  "rowHeadersChange": 0
21072
21851
  }],
21852
+ "resizeRow": [{
21853
+ "resizeRowChanged": 0
21854
+ }],
21073
21855
  "registerVNode": [{
21074
21856
  "registerOutsideVNodes": 0
21075
21857
  }],
@@ -21095,6 +21877,7 @@ class RevoGridComponent {
21095
21877
  "range": [4],
21096
21878
  "readonly": [4],
21097
21879
  "resize": [4],
21880
+ "resizeRow": [4, "resize-row"],
21098
21881
  "noHorizontalScrollTransfer": [4, "no-horizontal-scroll-transfer"],
21099
21882
  "canFocus": [4, "can-focus"],
21100
21883
  "useClipboard": [4, "use-clipboard"],
@@ -21333,7 +22116,7 @@ const CellRenderer = ({ renderProps, cellProps, }) => {
21333
22116
  return (hAsync("div", Object.assign({}, cellProps, { redraw: render }), render()));
21334
22117
  };
21335
22118
 
21336
- const revogrDataStyleCss = () => `.revo-drag-icon{width:11px;opacity:0.8}.revo-drag-icon::before{content:"::";display:inline-block}.revo-alt-icon{-webkit-mask-image:url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg viewBox='0 0 384 383' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cg%3E%3Cpath d='M192.4375,383 C197.424479,383 201.663411,381.254557 205.154297,377.763672 L205.154297,377.763672 L264.25,318.667969 C270.234375,312.683594 271.605794,306.075846 268.364258,298.844727 C265.122721,291.613607 259.51237,287.998047 251.533203,287.998047 L251.533203,287.998047 L213.382812,287.998047 L213.382812,212.445312 L288.935547,212.445312 L288.935547,250.595703 C288.935547,258.57487 292.551107,264.185221 299.782227,267.426758 C307.013346,270.668294 313.621094,269.296875 319.605469,263.3125 L319.605469,263.3125 L378.701172,204.216797 C382.192057,200.725911 383.9375,196.486979 383.9375,191.5 C383.9375,186.513021 382.192057,182.274089 378.701172,178.783203 L378.701172,178.783203 L319.605469,119.6875 C313.621094,114.201823 307.013346,112.955078 299.782227,115.947266 C292.551107,118.939453 288.935547,124.42513 288.935547,132.404297 L288.935547,132.404297 L288.935547,170.554688 L213.382812,170.554688 L213.382812,95.0019531 L251.533203,95.0019531 C259.51237,95.0019531 264.998047,91.3863932 267.990234,84.1552734 C270.982422,76.9241536 269.735677,70.3164062 264.25,64.3320312 L264.25,64.3320312 L205.154297,5.23632812 C201.663411,1.74544271 197.424479,0 192.4375,0 C187.450521,0 183.211589,1.74544271 179.720703,5.23632812 L179.720703,5.23632812 L120.625,64.3320312 C114.640625,70.3164062 113.269206,76.9241536 116.510742,84.1552734 C119.752279,91.3863932 125.36263,95.0019531 133.341797,95.0019531 L133.341797,95.0019531 L171.492188,95.0019531 L171.492188,170.554688 L95.9394531,170.554688 L95.9394531,132.404297 C95.9394531,124.42513 92.3238932,118.814779 85.0927734,115.573242 C77.8616536,112.331706 71.2539062,113.703125 65.2695312,119.6875 L65.2695312,119.6875 L6.17382812,178.783203 C2.68294271,182.274089 0.9375,186.513021 0.9375,191.5 C0.9375,196.486979 2.68294271,200.725911 6.17382812,204.216797 L6.17382812,204.216797 L65.2695312,263.3125 C71.2539062,268.798177 77.8616536,270.044922 85.0927734,267.052734 C92.3238932,264.060547 95.9394531,258.57487 95.9394531,250.595703 L95.9394531,250.595703 L95.9394531,212.445312 L171.492188,212.445312 L171.492188,287.998047 L133.341797,287.998047 C125.36263,287.998047 119.876953,291.613607 116.884766,298.844727 C113.892578,306.075846 115.139323,312.683594 120.625,318.667969 L120.625,318.667969 L179.720703,377.763672 C183.211589,381.254557 187.450521,383 192.4375,383 Z'%3E%3C/path%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg viewBox='0 0 384 383' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cg%3E%3Cpath d='M192.4375,383 C197.424479,383 201.663411,381.254557 205.154297,377.763672 L205.154297,377.763672 L264.25,318.667969 C270.234375,312.683594 271.605794,306.075846 268.364258,298.844727 C265.122721,291.613607 259.51237,287.998047 251.533203,287.998047 L251.533203,287.998047 L213.382812,287.998047 L213.382812,212.445312 L288.935547,212.445312 L288.935547,250.595703 C288.935547,258.57487 292.551107,264.185221 299.782227,267.426758 C307.013346,270.668294 313.621094,269.296875 319.605469,263.3125 L319.605469,263.3125 L378.701172,204.216797 C382.192057,200.725911 383.9375,196.486979 383.9375,191.5 C383.9375,186.513021 382.192057,182.274089 378.701172,178.783203 L378.701172,178.783203 L319.605469,119.6875 C313.621094,114.201823 307.013346,112.955078 299.782227,115.947266 C292.551107,118.939453 288.935547,124.42513 288.935547,132.404297 L288.935547,132.404297 L288.935547,170.554688 L213.382812,170.554688 L213.382812,95.0019531 L251.533203,95.0019531 C259.51237,95.0019531 264.998047,91.3863932 267.990234,84.1552734 C270.982422,76.9241536 269.735677,70.3164062 264.25,64.3320312 L264.25,64.3320312 L205.154297,5.23632812 C201.663411,1.74544271 197.424479,0 192.4375,0 C187.450521,0 183.211589,1.74544271 179.720703,5.23632812 L179.720703,5.23632812 L120.625,64.3320312 C114.640625,70.3164062 113.269206,76.9241536 116.510742,84.1552734 C119.752279,91.3863932 125.36263,95.0019531 133.341797,95.0019531 L133.341797,95.0019531 L171.492188,95.0019531 L171.492188,170.554688 L95.9394531,170.554688 L95.9394531,132.404297 C95.9394531,124.42513 92.3238932,118.814779 85.0927734,115.573242 C77.8616536,112.331706 71.2539062,113.703125 65.2695312,119.6875 L65.2695312,119.6875 L6.17382812,178.783203 C2.68294271,182.274089 0.9375,186.513021 0.9375,191.5 C0.9375,196.486979 2.68294271,200.725911 6.17382812,204.216797 L6.17382812,204.216797 L65.2695312,263.3125 C71.2539062,268.798177 77.8616536,270.044922 85.0927734,267.052734 C92.3238932,264.060547 95.9394531,258.57487 95.9394531,250.595703 L95.9394531,250.595703 L95.9394531,212.445312 L171.492188,212.445312 L171.492188,287.998047 L133.341797,287.998047 C125.36263,287.998047 119.876953,291.613607 116.884766,298.844727 C113.892578,306.075846 115.139323,312.683594 120.625,318.667969 L120.625,318.667969 L179.720703,377.763672 C183.211589,381.254557 187.450521,383 192.4375,383 Z'%3E%3C/path%3E%3C/g%3E%3C/svg%3E");width:11px;height:11px;background-size:cover;background-repeat:no-repeat}.arrow-down{position:absolute;right:5px;top:0}.arrow-down svg{width:8px;margin-top:5px;margin-left:5px;opacity:0.4}.cell-value-wrapper{margin-right:10px;overflow:hidden;text-overflow:ellipsis}revogr-data{display:block;width:100%;position:relative}revogr-data .rgRow{position:absolute;width:100%;left:0}revogr-data .rgRow.groupingRow{font-weight:600;text-align:left}revogr-data .rgRow.groupingRow .group-expand{width:25px;height:100%;max-height:25px;margin-right:2px;background-color:transparent;border-color:transparent;vertical-align:middle;padding-left:5px;display:inline-flex}revogr-data .rgRow.groupingRow .group-expand svg{width:7px}revogr-data .revo-draggable{border:none;height:32px;display:inline-flex;outline:0;padding:0;font-size:0.8125rem;box-sizing:border-box;align-items:center;white-space:nowrap;vertical-align:middle;justify-content:center;text-decoration:none;width:24px;height:100%;cursor:pointer;display:inline-flex}revogr-data .revo-draggable:hover>.revo-drag-icon{opacity:1;zoom:1.2;font-weight:600}revogr-data .revo-draggable>.revo-drag-icon{pointer-events:none;transition:opacity 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms, zoom 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}revogr-data .rgCell{top:0;left:0;position:absolute;box-sizing:border-box;height:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;outline:none}revogr-data .rgCell.align-center{text-align:center}revogr-data .rgCell.align-left{text-align:left}revogr-data .rgCell.align-right{text-align:right}`;
22119
+ const revogrDataStyleCss = () => `.revo-drag-icon{width:11px;opacity:0.8}.revo-drag-icon::before{content:"::";display:inline-block}.revo-alt-icon{-webkit-mask-image:url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg viewBox='0 0 384 383' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cg%3E%3Cpath d='M192.4375,383 C197.424479,383 201.663411,381.254557 205.154297,377.763672 L205.154297,377.763672 L264.25,318.667969 C270.234375,312.683594 271.605794,306.075846 268.364258,298.844727 C265.122721,291.613607 259.51237,287.998047 251.533203,287.998047 L251.533203,287.998047 L213.382812,287.998047 L213.382812,212.445312 L288.935547,212.445312 L288.935547,250.595703 C288.935547,258.57487 292.551107,264.185221 299.782227,267.426758 C307.013346,270.668294 313.621094,269.296875 319.605469,263.3125 L319.605469,263.3125 L378.701172,204.216797 C382.192057,200.725911 383.9375,196.486979 383.9375,191.5 C383.9375,186.513021 382.192057,182.274089 378.701172,178.783203 L378.701172,178.783203 L319.605469,119.6875 C313.621094,114.201823 307.013346,112.955078 299.782227,115.947266 C292.551107,118.939453 288.935547,124.42513 288.935547,132.404297 L288.935547,132.404297 L288.935547,170.554688 L213.382812,170.554688 L213.382812,95.0019531 L251.533203,95.0019531 C259.51237,95.0019531 264.998047,91.3863932 267.990234,84.1552734 C270.982422,76.9241536 269.735677,70.3164062 264.25,64.3320312 L264.25,64.3320312 L205.154297,5.23632812 C201.663411,1.74544271 197.424479,0 192.4375,0 C187.450521,0 183.211589,1.74544271 179.720703,5.23632812 L179.720703,5.23632812 L120.625,64.3320312 C114.640625,70.3164062 113.269206,76.9241536 116.510742,84.1552734 C119.752279,91.3863932 125.36263,95.0019531 133.341797,95.0019531 L133.341797,95.0019531 L171.492188,95.0019531 L171.492188,170.554688 L95.9394531,170.554688 L95.9394531,132.404297 C95.9394531,124.42513 92.3238932,118.814779 85.0927734,115.573242 C77.8616536,112.331706 71.2539062,113.703125 65.2695312,119.6875 L65.2695312,119.6875 L6.17382812,178.783203 C2.68294271,182.274089 0.9375,186.513021 0.9375,191.5 C0.9375,196.486979 2.68294271,200.725911 6.17382812,204.216797 L6.17382812,204.216797 L65.2695312,263.3125 C71.2539062,268.798177 77.8616536,270.044922 85.0927734,267.052734 C92.3238932,264.060547 95.9394531,258.57487 95.9394531,250.595703 L95.9394531,250.595703 L95.9394531,212.445312 L171.492188,212.445312 L171.492188,287.998047 L133.341797,287.998047 C125.36263,287.998047 119.876953,291.613607 116.884766,298.844727 C113.892578,306.075846 115.139323,312.683594 120.625,318.667969 L120.625,318.667969 L179.720703,377.763672 C183.211589,381.254557 187.450521,383 192.4375,383 Z'%3E%3C/path%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg viewBox='0 0 384 383' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cg%3E%3Cpath d='M192.4375,383 C197.424479,383 201.663411,381.254557 205.154297,377.763672 L205.154297,377.763672 L264.25,318.667969 C270.234375,312.683594 271.605794,306.075846 268.364258,298.844727 C265.122721,291.613607 259.51237,287.998047 251.533203,287.998047 L251.533203,287.998047 L213.382812,287.998047 L213.382812,212.445312 L288.935547,212.445312 L288.935547,250.595703 C288.935547,258.57487 292.551107,264.185221 299.782227,267.426758 C307.013346,270.668294 313.621094,269.296875 319.605469,263.3125 L319.605469,263.3125 L378.701172,204.216797 C382.192057,200.725911 383.9375,196.486979 383.9375,191.5 C383.9375,186.513021 382.192057,182.274089 378.701172,178.783203 L378.701172,178.783203 L319.605469,119.6875 C313.621094,114.201823 307.013346,112.955078 299.782227,115.947266 C292.551107,118.939453 288.935547,124.42513 288.935547,132.404297 L288.935547,132.404297 L288.935547,170.554688 L213.382812,170.554688 L213.382812,95.0019531 L251.533203,95.0019531 C259.51237,95.0019531 264.998047,91.3863932 267.990234,84.1552734 C270.982422,76.9241536 269.735677,70.3164062 264.25,64.3320312 L264.25,64.3320312 L205.154297,5.23632812 C201.663411,1.74544271 197.424479,0 192.4375,0 C187.450521,0 183.211589,1.74544271 179.720703,5.23632812 L179.720703,5.23632812 L120.625,64.3320312 C114.640625,70.3164062 113.269206,76.9241536 116.510742,84.1552734 C119.752279,91.3863932 125.36263,95.0019531 133.341797,95.0019531 L133.341797,95.0019531 L171.492188,95.0019531 L171.492188,170.554688 L95.9394531,170.554688 L95.9394531,132.404297 C95.9394531,124.42513 92.3238932,118.814779 85.0927734,115.573242 C77.8616536,112.331706 71.2539062,113.703125 65.2695312,119.6875 L65.2695312,119.6875 L6.17382812,178.783203 C2.68294271,182.274089 0.9375,186.513021 0.9375,191.5 C0.9375,196.486979 2.68294271,200.725911 6.17382812,204.216797 L6.17382812,204.216797 L65.2695312,263.3125 C71.2539062,268.798177 77.8616536,270.044922 85.0927734,267.052734 C92.3238932,264.060547 95.9394531,258.57487 95.9394531,250.595703 L95.9394531,250.595703 L95.9394531,212.445312 L171.492188,212.445312 L171.492188,287.998047 L133.341797,287.998047 C125.36263,287.998047 119.876953,291.613607 116.884766,298.844727 C113.892578,306.075846 115.139323,312.683594 120.625,318.667969 L120.625,318.667969 L179.720703,377.763672 C183.211589,381.254557 187.450521,383 192.4375,383 Z'%3E%3C/path%3E%3C/g%3E%3C/svg%3E");width:11px;height:11px;background-size:cover;background-repeat:no-repeat}.arrow-down{position:absolute;right:5px;top:0}.arrow-down svg{width:8px;margin-top:5px;margin-left:5px;opacity:0.4}.cell-value-wrapper{margin-right:10px;overflow:hidden;text-overflow:ellipsis}revogr-data{display:block;width:100%;position:relative}revogr-data .rgRow{position:absolute;width:100%;left:0}revogr-data .rgRow>.row-resize-handle{position:absolute;z-index:2;right:0;bottom:-3px;left:0;height:7px;cursor:row-resize;touch-action:none;user-select:none}revogr-data .rgRow.groupingRow{font-weight:600;text-align:left}revogr-data .rgRow.groupingRow .group-expand{width:25px;height:100%;max-height:25px;margin-right:2px;background-color:transparent;border-color:transparent;vertical-align:middle;padding-left:5px;display:inline-flex}revogr-data .rgRow.groupingRow .group-expand svg{width:7px}revogr-data .revo-draggable{border:none;height:32px;display:inline-flex;outline:0;padding:0;font-size:0.8125rem;box-sizing:border-box;align-items:center;white-space:nowrap;vertical-align:middle;justify-content:center;text-decoration:none;width:24px;height:100%;cursor:pointer;display:inline-flex}revogr-data .revo-draggable:hover>.revo-drag-icon{opacity:1;zoom:1.2;font-weight:600}revogr-data .revo-draggable>.revo-drag-icon{pointer-events:none;transition:opacity 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms, zoom 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}revogr-data .rgCell{top:0;left:0;position:absolute;box-sizing:border-box;height:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;outline:none}revogr-data .rgCell.align-center{text-align:center}revogr-data .rgCell.align-left{text-align:left}revogr-data .rgCell.align-right{text-align:right}`;
21337
22120
 
21338
22121
  /**
21339
22122
  * This component is responsible for rendering data
@@ -21443,7 +22226,10 @@ class RevogrData {
21443
22226
  groupingCellRenderer, additionalData: this.additionalData,
21444
22227
  // Only show expand button if grouping is enabled and not in row headers
21445
22228
  hasExpand: this.columnService.hasGrouping && this.colType !== 'rowHeaders', columnItems: cols, providers: this.providers });
21446
- rowsEls.push(hAsync(GroupingRowRenderer, Object.assign({}, gmodel)));
22229
+ const row = hAsync(GroupingRowRenderer, Object.assign({}, gmodel));
22230
+ this.triggerBeforeRowRender(row, rgRow, dataItem);
22231
+ rowsEls.push(row);
22232
+ this.renderedRows.set(rgRow.itemIndex, row);
21447
22233
  continue;
21448
22234
  }
21449
22235
  // #endregion
@@ -21492,19 +22278,22 @@ class RevogrData {
21492
22278
  rowClass += ` ${ROW_FOCUSED_CLASS}`;
21493
22279
  }
21494
22280
  const row = (hAsync(RowRenderer, { index: rgRow.itemIndex, rowClass: rowClass, size: rgRow.size, start: rgRow.start - rowRenderOffset, groupingLevel: groupDepth || undefined }, cells));
21495
- this.beforerowrender.emit({
21496
- node: row,
21497
- item: rgRow,
21498
- model: dataItem,
21499
- colType: this.columnService.type,
21500
- rowType: this.type,
21501
- });
22281
+ this.triggerBeforeRowRender(row, rgRow, dataItem);
21502
22282
  rowsEls.push(row);
21503
22283
  this.renderedRows.set(rgRow.itemIndex, row);
21504
22284
  // #endregion
21505
22285
  }
21506
22286
  return (hAsync(Host, null, hAsync("slot", null), rowsEls));
21507
22287
  }
22288
+ triggerBeforeRowRender(node, item, model) {
22289
+ this.beforerowrender.emit({
22290
+ node,
22291
+ item,
22292
+ model,
22293
+ colType: this.colType,
22294
+ rowType: this.type,
22295
+ });
22296
+ }
21508
22297
  triggerBeforeCellRender(model, row, column) {
21509
22298
  const detail = {
21510
22299
  column,
@@ -21866,7 +22655,7 @@ const HeaderGroupRenderer = (p) => {
21866
22655
  return (hAsync(HeaderCellRenderer, { data: Object.assign(Object.assign({}, p.group), { prop: '', providers: p.providers, index: p.start }), props: groupProps, additionalData: p.additionalData }));
21867
22656
  };
21868
22657
 
21869
- const revogrHeaderStyleCss = () => `@charset "UTF-8";revogr-header{position:relative;z-index:5;display:block}revogr-header .header-rgRow{display:block;position:relative}revogr-header .header-rgRow.group{z-index:0}revogr-header .group-rgRow{position:relative;overflow:hidden}revogr-header .rgHeaderCell{position:absolute;box-sizing:border-box;height:100%;z-index:1;display:flex;text-align:var(--rg-theme-header-text-align, center)}revogr-header .rgHeaderCell.align-center{text-align:center}revogr-header .rgHeaderCell.align-left{text-align:left}revogr-header .rgHeaderCell.align-right{text-align:right}revogr-header .rgHeaderCell.sortable{cursor:pointer}revogr-header .rgHeaderCell .sort-indicator{display:inline-flex;align-items:flex-start;gap:1px}revogr-header .rgHeaderCell .sort-indicator i.asc:after,revogr-header .rgHeaderCell .sort-indicator i.desc:after{font-size:13px}revogr-header .rgHeaderCell .sort-indicator i.asc:after{content:"↑"}revogr-header .rgHeaderCell .sort-indicator i.desc:after{content:"↓"}revogr-header .rgHeaderCell .sort-indicator .sort-order-index{font-size:10px;line-height:1;top:0}revogr-header .rgHeaderCell.active{z-index:10}revogr-header .rgHeaderCell.active .resizable{background-color:var(--rg-theme-header-resize-hover)}revogr-header .rgHeaderCell .header-content{position:absolute;inset:0;box-sizing:border-box;padding:inherit;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex-grow:1}revogr-header .rgHeaderCell>span:first-of-type{position:relative;z-index:1;margin-left:auto}revogr-header .rgHeaderCell .resizable{display:block;position:absolute;z-index:90;touch-action:none;user-select:none}revogr-header .rgHeaderCell .resizable:hover{background-color:var(--rg-theme-header-resize-hover)}revogr-header .rgHeaderCell>.resizable-r{cursor:ew-resize;width:6px;right:0;top:0;height:100%}revogr-header .rgHeaderCell>.resizable-rb{cursor:se-resize;width:6px;height:6px;right:0;bottom:0}revogr-header .rgHeaderCell>.resizable-b{cursor:s-resize;height:6px;bottom:0;width:100%;left:0}revogr-header .rgHeaderCell>.resizable-lb{cursor:sw-resize;width:6px;height:6px;left:0;bottom:0}revogr-header .rgHeaderCell>.resizable-l{cursor:w-resize;width:6px;left:0;height:100%;top:0}revogr-header .rgHeaderCell>.resizable-lt{cursor:nw-resize;width:6px;height:6px;left:0;top:0}revogr-header .rgHeaderCell>.resizable-t{cursor:n-resize;height:6px;top:0;width:100%;left:0}revogr-header .rgHeaderCell>.resizable-rt{cursor:ne-resize;width:6px;height:6px;right:0;top:0}revogr-header .rv-filter{visibility:hidden}`;
22658
+ const revogrHeaderStyleCss = () => `@charset "UTF-8";revogr-header{position:relative;z-index:5;display:block}revogr-header .header-rgRow{display:block;position:relative}revogr-header .header-rgRow.group{z-index:0}revogr-header .group-rgRow{position:relative;overflow:hidden}revogr-header .rgHeaderCell{position:absolute;box-sizing:border-box;height:100%;z-index:1;display:flex;text-align:var(--rg-theme-header-text-align, center)}revogr-header .rgHeaderCell.align-center{text-align:center}revogr-header .rgHeaderCell.align-left{text-align:left}revogr-header .rgHeaderCell.align-right{text-align:right}revogr-header .rgHeaderCell.sortable{cursor:pointer}revogr-header .rgHeaderCell .sort-indicator{display:inline-flex;align-items:flex-start;gap:1px}revogr-header .rgHeaderCell .sort-indicator i.asc:after,revogr-header .rgHeaderCell .sort-indicator i.desc:after{font-size:13px}revogr-header .rgHeaderCell .sort-indicator i.asc:after{content:"↑"}revogr-header .rgHeaderCell .sort-indicator i.desc:after{content:"↓"}revogr-header .rgHeaderCell .sort-indicator .sort-order-index{font-size:10px;line-height:1;top:0}revogr-header .rgHeaderCell.active{z-index:10}revogr-header .rgHeaderCell.active .resizable{background-color:var(--rg-theme-header-resize-hover)}revogr-header .rgHeaderCell .header-content{position:absolute;z-index:0;inset:0;box-sizing:border-box;padding:inherit;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex-grow:1}revogr-header .rgHeaderCell>span:first-of-type{position:relative;z-index:1;margin-left:auto}revogr-header .rgHeaderCell .resizable{display:block;position:absolute;z-index:90;touch-action:none;user-select:none}revogr-header .rgHeaderCell .resizable:hover{background-color:var(--rg-theme-header-resize-hover)}revogr-header .rgHeaderCell>.resizable-r{cursor:ew-resize;width:6px;right:0;top:0;height:100%}revogr-header .rgHeaderCell>.resizable-rb{cursor:se-resize;width:6px;height:6px;right:0;bottom:0}revogr-header .rgHeaderCell>.resizable-b{cursor:s-resize;height:6px;bottom:0;width:100%;left:0}revogr-header .rgHeaderCell>.resizable-lb{cursor:sw-resize;width:6px;height:6px;left:0;bottom:0}revogr-header .rgHeaderCell>.resizable-l{cursor:w-resize;width:6px;left:0;height:100%;top:0}revogr-header .rgHeaderCell>.resizable-lt{cursor:nw-resize;width:6px;height:6px;left:0;top:0}revogr-header .rgHeaderCell>.resizable-t{cursor:n-resize;height:6px;top:0;width:100%;left:0}revogr-header .rgHeaderCell>.resizable-rt{cursor:ne-resize;width:6px;height:6px;right:0;top:0}revogr-header .rv-filter{visibility:hidden}`;
21870
22659
 
21871
22660
  class RevogrHeaderComponent {
21872
22661
  constructor(hostRef) {
@@ -22428,7 +23217,7 @@ class LocalScrollTimer {
22428
23217
  * Remember last mw event time
22429
23218
  */
22430
23219
  latestScrollUpdate(dimension) {
22431
- this.mouseWheelScrollTimestamp[dimension] = new Date().getTime();
23220
+ this.mouseWheelScrollTimestamp[dimension] = Date.now();
22432
23221
  }
22433
23222
  isReady(type, coordinate) {
22434
23223
  // if there is a callback, clear it
@@ -22439,7 +23228,7 @@ class LocalScrollTimer {
22439
23228
  return this.verifyChange(type, coordinate);
22440
23229
  }
22441
23230
  verifyChange(type, coordinate) {
22442
- const now = new Date().getTime();
23231
+ const now = Date.now();
22443
23232
  const change = now - this.mouseWheelScrollTimestamp[type];
22444
23233
  return change > this.scrollThrottling &&
22445
23234
  coordinate !== this.lastKnownScrollCoordinate[type];
@@ -22457,7 +23246,7 @@ class LocalScrollTimer {
22457
23246
  // save lastScrollUpdate callback
22458
23247
  const callback = this.lastScrollUpdateCallbacks[type] = {
22459
23248
  callback: lastScrollUpdate,
22460
- timestamp: new Date().getTime(),
23249
+ timestamp: Date.now(),
22461
23250
  coordinate,
22462
23251
  timeout: 0,
22463
23252
  };