@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.js CHANGED
@@ -7608,7 +7608,7 @@ function moveFilterItem(items, sourceId, targetId) {
7608
7608
  return true;
7609
7609
  }
7610
7610
 
7611
- 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}`;
7611
+ 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}`;
7612
7612
 
7613
7613
  const defaultType = 'none';
7614
7614
  const FILTER_LIST_CLASS = 'multi-filter-list';
@@ -7713,7 +7713,7 @@ class FilterPanel {
7713
7713
  getFilterItemsList() {
7714
7714
  var _a, _b;
7715
7715
  const prop = (_a = this.changes) === null || _a === void 0 ? void 0 : _a.prop;
7716
- if (typeof prop === 'undefined')
7716
+ if (prop === undefined)
7717
7717
  return '';
7718
7718
  const propFilters = (_b = this.filterItems[prop]) !== null && _b !== void 0 ? _b : [];
7719
7719
  const visibleFilterCount = propFilters.filter(filter => !filter.hidden).length;
@@ -7737,7 +7737,7 @@ class FilterPanel {
7737
7737
  'filter-row-dragging': isDragging,
7738
7738
  'filter-row-drag-over': isDragOver,
7739
7739
  } }, 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) })))));
7740
- })), propFilters.filter(f => !f.hidden).length > 0 ? hAsync("div", { class: "add-filter-divider" }) : ''));
7740
+ })), propFilters.some(f => !f.hidden) ? hAsync("div", { class: "add-filter-divider" }) : ''));
7741
7741
  }
7742
7742
  componentDidRender() {
7743
7743
  this.syncDialog();
@@ -8098,7 +8098,7 @@ class FilterPanel {
8098
8098
  top: `${(_d = (_c = this.changes) === null || _c === void 0 ? void 0 : _c.y) !== null && _d !== void 0 ? _d : 0}px`,
8099
8099
  };
8100
8100
  const capts = Object.assign(Object.assign({}, this.filterCaptionsInternal), this.filterCaptions);
8101
- return (hAsync(Host, { key: '8859c452eb08838f65f18efecbdde7f65fda2b49' }, hAsync("dialog", { key: 'f603067ff0986a9f344cbbf816388d2bbac198bb', class: "filter-panel-dialog", style: style, ref: el => (this.dialog = el), onCancel: e => {
8101
+ return (hAsync(Host, { key: 'd0e4ebb408750b11b3965da6a25e581733c968e3' }, hAsync("dialog", { key: '3df36777c931ec1063e8574169ca880a99dbfe41', class: "filter-panel-dialog", style: style, ref: el => (this.dialog = el), onCancel: e => {
8102
8102
  e.preventDefault();
8103
8103
  this.onCancel();
8104
8104
  } }, this.changes && [
@@ -8107,16 +8107,16 @@ class FilterPanel {
8107
8107
  ((_g = this.changes) === null || _g === void 0 ? void 0 : _g.hideDefaultFilters) !== true && [
8108
8108
  hAsync("label", { key: "filter-title" }, capts.title),
8109
8109
  hAsync("div", { key: "filter-holder", class: "filter-holder" }, this.getFilterItemsList()),
8110
- 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))),
8110
+ 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))),
8111
8111
  ],
8112
8112
  hAsync("slot", { key: "default-slot" }),
8113
8113
  ((_j = (_h = this.changes).extraBottomContent) === null || _j === void 0 ? void 0 : _j.call(_h, this.changes)) || '',
8114
8114
  hAsync("div", { key: "filter-actions", class: "filter-actions" }, this.disableDynamicFiltering && [
8115
- hAsync("button", { key: "save", id: "revo-button-save", "aria-label": "save", class: "revo-button green", onClick: () => this.onSave() }, capts.save),
8116
- hAsync("button", { key: "cancel", id: "revo-button-ok", "aria-label": "ok", class: "revo-button green", onClick: () => this.onCancel() }, capts.cancel),
8115
+ hAsync("button", { key: "save", type: "button", id: "revo-button-save", "aria-label": "save", class: "revo-button green", onClick: () => this.onSave() }, capts.save),
8116
+ hAsync("button", { key: "cancel", type: "button", id: "revo-button-ok", "aria-label": "ok", class: "revo-button green", onClick: () => this.onCancel() }, capts.cancel),
8117
8117
  ], !this.disableDynamicFiltering && [
8118
- hAsync("button", { key: "ok", id: "revo-button-ok", "aria-label": "ok", class: "revo-button green", onClick: () => this.onCancel() }, capts.ok),
8119
- hAsync("button", { key: "reset", id: "revo-button-reset", "aria-label": "reset", class: "revo-button outline", onClick: () => this.onReset() }, capts.reset),
8118
+ hAsync("button", { key: "ok", type: "button", id: "revo-button-ok", "aria-label": "ok", class: "revo-button green", onClick: () => this.onCancel() }, capts.ok),
8119
+ hAsync("button", { key: "reset", type: "button", id: "revo-button-reset", "aria-label": "reset", class: "revo-button outline", onClick: () => this.onReset() }, capts.reset),
8120
8120
  ]),
8121
8121
  hAsync("slot", { key: "footer-slot", slot: "footer" }),
8122
8122
  ])));
@@ -11170,13 +11170,8 @@ const trimmedPlugin$1 = (store) => ({
11170
11170
  set(k, newVal) {
11171
11171
  switch (k) {
11172
11172
  case 'trimmed': {
11173
- // full sorted items list
11174
- const proxy = store.get('proxyItems');
11175
- const trimmed = gatherTrimmedItems(newVal);
11176
- // filter our physical indexes which are not trimmed
11177
- const newItems = proxy.filter(v => !trimmed[v]);
11178
11173
  // set trimmed items in store
11179
- store.set('items', newItems);
11174
+ store.set('items', getVisibleItems(store.get('proxyItems'), newVal));
11180
11175
  break;
11181
11176
  }
11182
11177
  }
@@ -11192,6 +11187,14 @@ function gatherTrimmedItems(trimmedItems) {
11192
11187
  }
11193
11188
  return trimmed;
11194
11189
  }
11190
+ /**
11191
+ * Preserve proxy order while removing physical indexes hidden by any trim
11192
+ * layer.
11193
+ */
11194
+ function getVisibleItems(proxyItems, trimmedItems) {
11195
+ const trimmed = gatherTrimmedItems(trimmedItems);
11196
+ return proxyItems.filter(index => !trimmed[index]);
11197
+ }
11195
11198
 
11196
11199
  /**
11197
11200
  * Sets the given data on the specified store.
@@ -11498,7 +11501,7 @@ function gatherGroup(res, colData, collection, existingColumnsByType, level = 0)
11498
11501
  // fill columns
11499
11502
  resultItem.push(...collectionItem);
11500
11503
  // fill indexes per each viewport
11501
- res.columnGrouping[type].push(Object.assign(Object.assign({}, group), { indexes: Array(itemLength).fill(columnLength).map((v, i) => v + i) }));
11504
+ res.columnGrouping[type].push(Object.assign(Object.assign({}, group), { indexes: Array.from({ length: itemLength }, (_, i) => columnLength + i) }));
11502
11505
  }
11503
11506
  }
11504
11507
  });
@@ -11722,6 +11725,25 @@ async function timeout(delay = 0) {
11722
11725
  });
11723
11726
  }
11724
11727
 
11728
+ /**
11729
+ * Keeps the visible item collection empty while an asynchronous data operation
11730
+ * is pending. Proxy, trim, and source updates may still calculate new items,
11731
+ * but they must not expose those items until the owning operation releases the
11732
+ * pending state.
11733
+ */
11734
+ const pendingItemsPlugin = (store, isPending) => ({
11735
+ set(key, value) {
11736
+ if (key === 'items' &&
11737
+ isPending() &&
11738
+ Array.isArray(value) &&
11739
+ value.length) {
11740
+ // Writing an empty collection does not re-enter this branch, so the
11741
+ // guard safely replaces every attempted non-empty visibility update.
11742
+ store.set('items', []);
11743
+ }
11744
+ },
11745
+ });
11746
+
11725
11747
  /**
11726
11748
  * Data store
11727
11749
  * Manage the state of a data source and provide methods for updating, adding, and refreshing the data.
@@ -11731,9 +11753,15 @@ class DataStore {
11731
11753
  return this.dataStore;
11732
11754
  }
11733
11755
  constructor(type, storeData) {
11756
+ /**
11757
+ * The source, proxy order, and trims may continue changing,
11758
+ * but visible items must remain empty until the operation finishes.
11759
+ */
11760
+ this.itemsPending = false;
11734
11761
  const store = (this.dataStore = createStore(Object.assign({ items: [], proxyItems: [], source: [], groupingDepth: 0, groups: {}, type, trimmed: {}, groupingCustomRenderer: undefined, groupingCellRenderer: undefined }, storeData)));
11735
11762
  store.use(proxyPlugin(store));
11736
11763
  store.use(trimmedPlugin$1(store));
11764
+ store.use(pendingItemsPlugin(store, () => this.itemsPending));
11737
11765
  }
11738
11766
  /**
11739
11767
  * full data source update
@@ -11748,7 +11776,7 @@ class DataStore {
11748
11776
  // if true, current trimmed indexes will be re-applied to the new source
11749
11777
  preserveTrimmed = false) {
11750
11778
  const trimmed = this.store.get('trimmed');
11751
- const trimmedItems = silent && preserveTrimmed ? gatherTrimmedItems(trimmed) : null;
11779
+ const preserveCurrentTrimmed = silent && preserveTrimmed;
11752
11780
  // during full update we do drop trim
11753
11781
  if (!silent) {
11754
11782
  this.store.set('trimmed', {});
@@ -11763,7 +11791,7 @@ class DataStore {
11763
11791
  });
11764
11792
  // Explicit trim preservation is opt-in because physical indexes may change
11765
11793
  // across full data refreshes.
11766
- this.store.set('items', trimmedItems ? items.filter(i => !trimmedItems[i]) : items);
11794
+ this.store.set('items', preserveCurrentTrimmed ? getVisibleItems(items, trimmed) : items);
11767
11795
  // apply grouping if present
11768
11796
  if (grouping) {
11769
11797
  setStore(this.store, {
@@ -11780,6 +11808,21 @@ class DataStore {
11780
11808
  trimmed = Object.assign(Object.assign({}, trimmed), some);
11781
11809
  setStore(this.store, { trimmed });
11782
11810
  }
11811
+ /**
11812
+ * Keeps visible items empty while an asynchronous source operation is pending.
11813
+ * Releasing the state restores the current proxy order with all trims applied.
11814
+ */
11815
+ setItemsPending(pending) {
11816
+ if (this.itemsPending === pending) {
11817
+ return;
11818
+ }
11819
+ this.itemsPending = pending;
11820
+ if (pending) {
11821
+ this.store.set('items', []);
11822
+ return;
11823
+ }
11824
+ this.store.set('items', getVisibleItems(this.store.get('proxyItems'), this.store.get('trimmed')));
11825
+ }
11783
11826
  setSourceData(items, mutate = true) {
11784
11827
  setSourceByVirtualIndex(this.store, items, mutate);
11785
11828
  }
@@ -12157,9 +12200,7 @@ const trimmedPlugin = (storeService) => {
12157
12200
  }
12158
12201
  case 'trimmed': {
12159
12202
  const trim = val;
12160
- if (!trimmedPreviousSizes) {
12161
- trimmedPreviousSizes = storeService.store.get('sizes');
12162
- }
12203
+ trimmedPreviousSizes !== null && trimmedPreviousSizes !== void 0 ? trimmedPreviousSizes : (trimmedPreviousSizes = storeService.store.get('sizes'));
12163
12204
  trimmingObject = removeMultipleAndShift(trimmedPreviousSizes, trim || {});
12164
12205
  // save a reference to the trimmed object to prevent changes after trimming
12165
12206
  storeService.setSizes(trimmingObject);
@@ -13038,6 +13079,7 @@ const GROUP_COLUMN_PROP = `${GRID_INTERNALS}-prop`;
13038
13079
  const GROUP_ORIGINAL_INDEX = `${GRID_INTERNALS}-original-index`;
13039
13080
  const GROUP_EXPAND_BTN = `group-expand`;
13040
13081
  const GROUP_EXPAND_EVENT = `groupexpandclick`;
13082
+ const BEFORE_GROUPING_APPLY_EVENT = `beforegroupingapply`;
13041
13083
  const GROUPING_ROW_TYPE = 'rgRow';
13042
13084
 
13043
13085
  function getGroupValueDefault(item, prop, emptyGroupValue) {
@@ -13196,7 +13238,7 @@ function isGrouping(rgRow) {
13196
13238
  return typeof (rgRow === null || rgRow === void 0 ? void 0 : rgRow[PSEUDO_GROUP_ITEM]) !== 'undefined';
13197
13239
  }
13198
13240
  function isGroupingColumn(column) {
13199
- return typeof (column === null || column === void 0 ? void 0 : column[PSEUDO_GROUP_COLUMN]) !== 'undefined';
13241
+ return (column === null || column === void 0 ? void 0 : column[PSEUDO_GROUP_COLUMN]) !== undefined;
13200
13242
  }
13201
13243
  function measureEqualDepth(groupA, groupB) {
13202
13244
  const ln = groupA.length;
@@ -13800,6 +13842,16 @@ const DIRECTION_CODES = [
13800
13842
  class KeyboardService {
13801
13843
  constructor(sv) {
13802
13844
  this.sv = sv;
13845
+ /** Keep focus transitions in keydown order so rendering can scroll each cell into view. */
13846
+ this.keyChangeQueue = Promise.resolve(false);
13847
+ this.keyChangeGeneration = 0;
13848
+ this.applyingKeyChange = false;
13849
+ }
13850
+ /** Cancel delayed directional input after focus or edit context changes externally. */
13851
+ invalidatePendingChanges() {
13852
+ if (!this.applyingKeyChange) {
13853
+ this.keyChangeGeneration += 1;
13854
+ }
13803
13855
  }
13804
13856
  /**
13805
13857
  * Appends printable key input that arrives after edit mode was requested
@@ -13902,13 +13954,33 @@ class KeyboardService {
13902
13954
  if (!data) {
13903
13955
  return false;
13904
13956
  }
13957
+ const keyChangeGeneration = this.keyChangeGeneration;
13905
13958
  // this interval needed for several cases
13906
13959
  // grid could be resized before next click
13907
13960
  // at this case to avoid screen jump we use this interval
13908
13961
  await timeout(RESIZE_INTERVAL + 30);
13909
- const range = this.sv.selectionStore.get('range');
13910
- const focus = this.sv.selectionStore.get('focus');
13911
- return this.keyPositionChange(data.changes, range, focus, data.isMulti);
13962
+ const applyKeyChange = async () => {
13963
+ if (keyChangeGeneration !== this.keyChangeGeneration) {
13964
+ return false;
13965
+ }
13966
+ const range = this.sv.selectionStore.get('range');
13967
+ const focus = this.sv.selectionStore.get('focus');
13968
+ this.applyingKeyChange = true;
13969
+ let changed;
13970
+ try {
13971
+ changed = this.keyPositionChange(data.changes, range, focus, data.isMulti);
13972
+ }
13973
+ finally {
13974
+ this.applyingKeyChange = false;
13975
+ }
13976
+ await new Promise(resolve => requestAnimationFrame(() => {
13977
+ requestAnimationFrame(() => resolve());
13978
+ }));
13979
+ return changed;
13980
+ };
13981
+ const queuedChange = this.keyChangeQueue.then(applyKeyChange, applyKeyChange);
13982
+ this.keyChangeQueue = queuedChange.catch(() => false);
13983
+ return queuedChange;
13912
13984
  }
13913
13985
  keyPositionChange(changes, range, focus, isMulti = false) {
13914
13986
  if (!range || !focus) {
@@ -14295,6 +14367,8 @@ class OverlaySelection {
14295
14367
  * Selection & Keyboard
14296
14368
  */
14297
14369
  selectionServiceSet(selectionStore) {
14370
+ var _a;
14371
+ (_a = this.keyboardService) === null || _a === void 0 ? void 0 : _a.invalidatePendingChanges();
14298
14372
  // clear subscriptions
14299
14373
  this.unsubscribeSelectionStore.forEach(v => v());
14300
14374
  this.unsubscribeSelectionStore.length = 0;
@@ -14322,6 +14396,7 @@ class OverlaySelection {
14322
14396
  getData: () => this.getData(),
14323
14397
  selectAll: () => this.selectAll.emit(),
14324
14398
  });
14399
+ 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(); }));
14325
14400
  this.createAutoFillService();
14326
14401
  }
14327
14402
  /** Autofill */
@@ -14358,11 +14433,12 @@ class OverlaySelection {
14358
14433
  this.selectionServiceSet(this.selectionStore);
14359
14434
  }
14360
14435
  disconnectedCallback() {
14361
- var _a;
14436
+ var _a, _b;
14362
14437
  // clear subscriptions
14438
+ (_a = this.keyboardService) === null || _a === void 0 ? void 0 : _a.invalidatePendingChanges();
14363
14439
  this.unsubscribeSelectionStore.forEach(v => v());
14364
14440
  this.unsubscribeSelectionStore.length = 0;
14365
- (_a = this.columnService) === null || _a === void 0 ? void 0 : _a.destroy();
14441
+ (_b = this.columnService) === null || _b === void 0 ? void 0 : _b.destroy();
14366
14442
  }
14367
14443
  async componentWillRender() {
14368
14444
  var _a, _b;
@@ -14374,9 +14450,7 @@ class OverlaySelection {
14374
14450
  renderRange(range) {
14375
14451
  const cell = getCell(range, this.dimensionRow.state, this.dimensionCol.state);
14376
14452
  const styles = styleByCellProps(cell);
14377
- return [
14378
- 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 })))),
14379
- ];
14453
+ 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 })))));
14380
14454
  }
14381
14455
  renderEditor() {
14382
14456
  // Check if edit access
@@ -14429,7 +14503,7 @@ class OverlaySelection {
14429
14503
  }
14430
14504
  // Range
14431
14505
  if (range) {
14432
- nodes.push(...this.renderRange(range));
14506
+ nodes.push(this.renderRange(range));
14433
14507
  }
14434
14508
  // Autofill
14435
14509
  if (focus && !this.readonly && this.range) {
@@ -14440,9 +14514,9 @@ class OverlaySelection {
14440
14514
  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) }));
14441
14515
  }
14442
14516
  }
14443
- 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),
14517
+ 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),
14444
14518
  // it's done to be able to throw events from different levels, not just from editor
14445
- onCelledit: (e) => this.onEditCell(e) }, nodes, hAsync("slot", { key: '8ad5df55904ca6a8b2fb0e69c5f608ec7264a0f1', name: "data" })));
14519
+ onCelledit: (e) => this.onEditCell(e) }, nodes, hAsync("slot", { key: '47740a79c605258b4024384510358be927d000b7', name: "data" })));
14446
14520
  }
14447
14521
  /**
14448
14522
  * Executes the focus operation on the specified range of cells.
@@ -14639,12 +14713,12 @@ class OverlaySelection {
14639
14713
  clearCell() {
14640
14714
  var _a;
14641
14715
  const range = this.selectionStore.get('range');
14642
- if (range && !isRangeSingleCell(range)) {
14716
+ const focused = this.selectionStore.get('focus');
14717
+ if (range && (!isRangeSingleCell(range) || !focused)) {
14643
14718
  const data = this.columnService.getRangeStaticData(range, '');
14644
14719
  (_a = this.autoFillService) === null || _a === void 0 ? void 0 : _a.onRangeApply(data, range, range);
14645
14720
  }
14646
14721
  else if (this.canEdit()) {
14647
- const focused = this.selectionStore.get('focus');
14648
14722
  if (!focused) {
14649
14723
  return;
14650
14724
  }
@@ -15197,9 +15271,15 @@ class DataProvider {
15197
15271
  store.addTrimmed(trimmed);
15198
15272
  this.dimensionProvider.setTrimmed(trimmed, type);
15199
15273
  if (type === 'rgRow') {
15200
- this.dimensionProvider.setData(getVisibleSourceItem(store.store).length, type);
15274
+ this.dimensionProvider.setData(store.store.get('items').length, type);
15201
15275
  }
15202
15276
  }
15277
+ /** Keep a row source empty until its current asynchronous update is ready. */
15278
+ setItemsPending(pending, type = 'rgRow') {
15279
+ const store = this.stores[type];
15280
+ store.setItemsPending(pending);
15281
+ this.dimensionProvider.setData(store.store.get('items').length, type, type !== 'rgRow');
15282
+ }
15203
15283
  }
15204
15284
 
15205
15285
  const FALLBACK_MAX_SCROLL_SIZE = 16000000;
@@ -15296,7 +15376,9 @@ function isVirtualXDimension(type, disableVirtualX = false, virtualX = DEFAULT_V
15296
15376
  class DimensionProvider {
15297
15377
  constructor(viewports, config) {
15298
15378
  this.viewports = viewports;
15299
- const sizeChanged = debounce$1((k) => config.realSizeChanged(k), RESIZE_INTERVAL);
15379
+ this.config = config;
15380
+ this.rowDefinitions = [];
15381
+ const sizeChanged = debounce$1((k) => this.config.realSizeChanged(k), RESIZE_INTERVAL);
15300
15382
  this.stores = [...rowTypes, ...columnTypes].reduce((sources, t) => {
15301
15383
  sources[t] = new DimensionStore(t);
15302
15384
  sources[t].store.onChange('realSize', () => sizeChanged(t));
@@ -15314,6 +15396,20 @@ class DimensionProvider {
15314
15396
  this.viewports.stores[t].setOriginalSizes(this.stores[t].store.get('originItemSize'));
15315
15397
  this.setItemCount(count, t);
15316
15398
  }
15399
+ getRowDefinitions() {
15400
+ return this.rowDefinitions;
15401
+ }
15402
+ syncRowDefinitions(definitions) {
15403
+ this.rowDefinitions = definitions;
15404
+ }
15405
+ setRowDefinitions(definitions) {
15406
+ var _a, _b;
15407
+ if (definitions === this.rowDefinitions) {
15408
+ return;
15409
+ }
15410
+ this.syncRowDefinitions(definitions);
15411
+ (_b = (_a = this.config).rowDefinitionsChanged) === null || _b === void 0 ? void 0 : _b.call(_a, definitions);
15412
+ }
15317
15413
  /**
15318
15414
  * Apply new custom sizes to dimension and view port
15319
15415
  * @param type - dimension type
@@ -16315,6 +16411,13 @@ const filterNames = {
16315
16411
  lte: '<=',
16316
16412
  };
16317
16413
 
16414
+ /** Fewer rows keep the existing synchronous filtering behavior. */
16415
+ const ASYNC_FILTER_ROW_THRESHOLD = 15000;
16416
+ /** Maximum rows evaluated in one filtering chunk. */
16417
+ const FILTER_CHUNK_SIZE = 1000;
16418
+ /** Yield after approximately this much accumulated filtering work. */
16419
+ const FILTER_TIME_BUDGET_MS = 5;
16420
+
16318
16421
  // filter.plugin.tsx
16319
16422
  const FILTER_TRIMMED_TYPE = 'filter';
16320
16423
  const FILTER_CONFIG_CHANGED_EVENT = 'filterconfigchanged';
@@ -16359,6 +16462,7 @@ class FilterPlugin extends BasePlugin {
16359
16462
  this.filterFunctionsIndexedByType = Object.assign({}, filterCoreFunctionsIndexedByType);
16360
16463
  this.filterProp = FILTER_PROP;
16361
16464
  this.allowDuplicateOperators = true;
16465
+ this.filteringRunId = 0;
16362
16466
  if (config) {
16363
16467
  this.initConfig(config);
16364
16468
  }
@@ -16367,7 +16471,7 @@ class FilterPlugin extends BasePlugin {
16367
16471
  ...existingNodes,
16368
16472
  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()),
16369
16473
  ];
16370
- const aftersourceset = async () => {
16474
+ const aftersourceset = () => {
16371
16475
  const filterCollectionProps = Object.keys(this.filterCollection);
16372
16476
  if (filterCollectionProps.length > 0) {
16373
16477
  // handle old way of filtering by reworking FilterCollection to new MultiFilterItem
@@ -16384,12 +16488,26 @@ class FilterPlugin extends BasePlugin {
16384
16488
  }
16385
16489
  });
16386
16490
  }
16387
- if (Object.keys(this.multiFilterItems).length === 0) {
16491
+ if (!this.hasActiveFilters()) {
16492
+ this.cancelFiltering();
16388
16493
  return;
16389
16494
  }
16390
- await timeout();
16391
- await this.runFiltering(this.multiFilterItems);
16495
+ void this.runFiltering(this.multiFilterItems);
16392
16496
  };
16497
+ /**
16498
+ * This executes before the data store replaces its source.
16499
+ * For a large source with active filters:
16500
+ * 1. Existing filtering runs are invalidated.
16501
+ * 2. Pending state starts.
16502
+ * 3. Visible rows become empty.
16503
+ * 4. The source is replaced while the DataStore guard prevents it from exposing unfiltered rows.
16504
+ */
16505
+ this.addEventListener('beforesourceset', ({ detail }) => {
16506
+ if (detail.source.length >= ASYNC_FILTER_ROW_THRESHOLD &&
16507
+ this.hasActiveFilters()) {
16508
+ this.deferFiltering();
16509
+ }
16510
+ });
16393
16511
  this.addEventListener('headerclick', e => this.headerclick(e));
16394
16512
  this.addEventListener(FILTER_CONFIG_CHANGED_EVENT, ({ detail }) => {
16395
16513
  if (!detail) {
@@ -16550,7 +16668,7 @@ class FilterPlugin extends BasePlugin {
16550
16668
  // store the filter items
16551
16669
  this.multiFilterItems = filterItems;
16552
16670
  // run the filtering when the items change
16553
- this.runFiltering(this.multiFilterItems);
16671
+ await this.runFiltering(this.multiFilterItems);
16554
16672
  }
16555
16673
  onFilterReset(prop) {
16556
16674
  delete this.multiFilterItems[prop !== null && prop !== void 0 ? prop : ''];
@@ -16560,6 +16678,8 @@ class FilterPlugin extends BasePlugin {
16560
16678
  * Triggers grid filtering
16561
16679
  */
16562
16680
  async doFiltering(collection, source, columns, filterItems) {
16681
+ // creates the execution token - owns the actual calculation
16682
+ const runId = this.beginFiltering();
16563
16683
  const columnsToUpdate = [];
16564
16684
  /**
16565
16685
  * Loop through the columns and update the columns that need to be updated with the `hasFilter` property.
@@ -16584,7 +16704,25 @@ class FilterPlugin extends BasePlugin {
16584
16704
  column[this.filterProp] = true;
16585
16705
  }
16586
16706
  });
16587
- const itemsToTrim = this.getRowFilter(source, filterItems, columnByProp);
16707
+ let itemsToTrim;
16708
+ const hasFilters = Object.keys(filterItems).length > 0 || this.hasActiveFilters();
16709
+ const isLargeSource = hasFilters && source.length >= ASYNC_FILTER_ROW_THRESHOLD;
16710
+ if (isLargeSource) {
16711
+ this.providers.data.setItemsPending(true);
16712
+ await timeout();
16713
+ }
16714
+ if (!hasFilters) {
16715
+ itemsToTrim = {};
16716
+ }
16717
+ else if (isLargeSource && this.supportsChunkedFiltering()) {
16718
+ itemsToTrim = await this.getRowFilterInChunks(source, filterItems, columnByProp, runId);
16719
+ }
16720
+ else {
16721
+ itemsToTrim = this.getRowFilter(source, filterItems, columnByProp);
16722
+ }
16723
+ if (!itemsToTrim || runId !== this.filteringRunId) {
16724
+ return;
16725
+ }
16588
16726
  // check is filter event prevented
16589
16727
  const { defaultPrevented, detail } = this.emit('beforefiltertrimmed', {
16590
16728
  collection,
@@ -16592,10 +16730,12 @@ class FilterPlugin extends BasePlugin {
16592
16730
  source,
16593
16731
  filterItems,
16594
16732
  });
16595
- if (defaultPrevented) {
16733
+ if (defaultPrevented || runId !== this.filteringRunId) {
16734
+ this.releaseFiltering(runId);
16596
16735
  return;
16597
16736
  }
16598
16737
  this.providers.data.setTrimmed({ [FILTER_TRIMMED_TYPE]: detail.itemsToFilter });
16738
+ this.releaseFiltering(runId);
16599
16739
  // applies the hasFilter to the columns to show filter icon
16600
16740
  this.providers.column.updateColumns(columnsToUpdate);
16601
16741
  this.emit('afterfilterapply', {
@@ -16609,6 +16749,10 @@ class FilterPlugin extends BasePlugin {
16609
16749
  await this.runFiltering(this.multiFilterItems);
16610
16750
  }
16611
16751
  async runFiltering(multiFilterItems) {
16752
+ // runFiltering: First token: "Is this request still valid after event handlers run?"
16753
+ // doFiltering: Second token: "Is this calculation still the newest one?"
16754
+ // creates a preflight token and sets the grid to a pending state
16755
+ const runId = this.beginFiltering();
16612
16756
  const collection = {};
16613
16757
  // handle old filterCollection to return the first filter only (if any) from multiFilterItems
16614
16758
  const filterProps = Object.keys(multiFilterItems);
@@ -16632,10 +16776,67 @@ class FilterPlugin extends BasePlugin {
16632
16776
  columns,
16633
16777
  filterItems: this.multiFilterItems,
16634
16778
  });
16635
- if (defaultPrevented) {
16779
+ if (defaultPrevented || runId !== this.filteringRunId) {
16780
+ this.releaseFiltering(runId);
16636
16781
  return;
16637
16782
  }
16638
- this.doFiltering(detail.collection, detail.source, detail.columns, detail.filterItems);
16783
+ await this.doFiltering(detail.collection, detail.source, detail.columns, detail.filterItems);
16784
+ }
16785
+ /** Whether this plugin currently owns filter state that must follow a new source. */
16786
+ hasActiveFilters() {
16787
+ return (Object.keys(this.multiFilterItems).length > 0 ||
16788
+ Object.keys(this.filterCollection).length > 0);
16789
+ }
16790
+ /** Preserve whole-source semantics for plugins that override getRowFilter. */
16791
+ supportsChunkedFiltering() {
16792
+ return this.getRowFilter === FilterPlugin.prototype.getRowFilter;
16793
+ }
16794
+ /**
16795
+ * Hide visible rows and invalidate current filtering until a deferred filter
16796
+ * run is ready. Used by filter extensions with their own debounced state.
16797
+ */
16798
+ deferFiltering() {
16799
+ this.beginFiltering(true);
16800
+ }
16801
+ beginFiltering(pending = false) {
16802
+ const runId = ++this.filteringRunId;
16803
+ if (pending) {
16804
+ this.providers.data.setItemsPending(true);
16805
+ }
16806
+ return runId;
16807
+ }
16808
+ releaseFiltering(runId) {
16809
+ if (runId === this.filteringRunId) {
16810
+ this.providers.data.setItemsPending(false);
16811
+ }
16812
+ }
16813
+ cancelFiltering() {
16814
+ this.releaseFiltering(this.beginFiltering());
16815
+ }
16816
+ async getRowFilterInChunks(rows, filterItems, columnByProp, runId) {
16817
+ const trimmed = {};
16818
+ let sliceStarted = performance.now();
16819
+ for (let offset = 0; offset < rows.length; offset += FILTER_CHUNK_SIZE) {
16820
+ if (runId !== this.filteringRunId) {
16821
+ return;
16822
+ }
16823
+ const end = Math.min(offset + FILTER_CHUNK_SIZE, rows.length);
16824
+ const chunkTrimmed = this.getRowFilter(rows.slice(offset, end), filterItems, columnByProp);
16825
+ // filter that chunk
16826
+ for (const chunkIndex in chunkTrimmed) {
16827
+ trimmed[offset + Number(chunkIndex)] = true;
16828
+ }
16829
+ if (end < rows.length &&
16830
+ performance.now() - sliceStarted >= FILTER_TIME_BUDGET_MS) {
16831
+ await timeout();
16832
+ sliceStarted = performance.now();
16833
+ }
16834
+ }
16835
+ return runId === this.filteringRunId ? trimmed : undefined;
16836
+ }
16837
+ destroy() {
16838
+ this.cancelFiltering();
16839
+ super.destroy();
16639
16840
  }
16640
16841
  /**
16641
16842
  * Get trimmed rows based on filter
@@ -16739,6 +16940,60 @@ function allAndConditionsSatisfied(pendingResults) {
16739
16940
  return !pendingResults.includes(true);
16740
16941
  }
16741
16942
 
16943
+ /**
16944
+ * Restores group headers around already-sorted data indexes without rebuilding
16945
+ * the physical source. Group insertion order follows the first sorted member,
16946
+ * matching the order produced by regrouping a sorted source.
16947
+ */
16948
+ function gatherGroupedRowIndexes(source, sortedDataIndexes) {
16949
+ const groupPathByDataIndex = new Map();
16950
+ const currentGroupPath = [];
16951
+ source.forEach((model, physicalIndex) => {
16952
+ if (isGrouping(model)) {
16953
+ const depth = model[GROUP_DEPTH];
16954
+ if (typeof depth !== 'number') {
16955
+ return;
16956
+ }
16957
+ currentGroupPath.length = depth;
16958
+ currentGroupPath[depth] = physicalIndex;
16959
+ return;
16960
+ }
16961
+ if (model != null) {
16962
+ groupPathByDataIndex.set(physicalIndex, [...currentGroupPath]);
16963
+ }
16964
+ });
16965
+ const root = {
16966
+ children: new Map(),
16967
+ items: [],
16968
+ };
16969
+ for (const physicalIndex of sortedDataIndexes) {
16970
+ const groupPath = groupPathByDataIndex.get(physicalIndex);
16971
+ if (!(groupPath === null || groupPath === void 0 ? void 0 : groupPath.length)) {
16972
+ return undefined;
16973
+ }
16974
+ let node = root;
16975
+ for (const groupIndex of groupPath) {
16976
+ let child = node.children.get(groupIndex);
16977
+ if (!child) {
16978
+ child = { children: new Map(), items: [] };
16979
+ node.children.set(groupIndex, child);
16980
+ }
16981
+ node = child;
16982
+ }
16983
+ node.items.push(physicalIndex);
16984
+ }
16985
+ const groupedIndexes = [];
16986
+ const appendNode = (node) => {
16987
+ node.children.forEach((child, groupIndex) => {
16988
+ groupedIndexes.push(groupIndex);
16989
+ appendNode(child);
16990
+ });
16991
+ groupedIndexes.push(...node.items);
16992
+ };
16993
+ appendNode(root);
16994
+ return groupedIndexes;
16995
+ }
16996
+
16742
16997
  /**
16743
16998
  * Checks whether a sorting map contains at least one active order.
16744
16999
  *
@@ -16987,18 +17242,6 @@ const SortingSign = ({ column }) => {
16987
17242
  function getSortableRowIndexes(indexes, source) {
16988
17243
  return indexes.filter(index => !isGrouping(source[index]));
16989
17244
  }
16990
- function mergeSortedRowsWithGroups(indexes, source, sortedRows) {
16991
- if (sortedRows.length === indexes.length) {
16992
- return sortedRows;
16993
- }
16994
- let rowIndex = 0;
16995
- return indexes.map(index => {
16996
- if (isGrouping(source[index])) {
16997
- return index;
16998
- }
16999
- return sortedRows[rowIndex++];
17000
- });
17001
- }
17002
17245
  /**
17003
17246
  * Lifecycle
17004
17247
  * 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.
@@ -17158,6 +17401,7 @@ class SortingPlugin extends BasePlugin {
17158
17401
  storeService.setData({ proxyItems: newItemsOrder });
17159
17402
  }
17160
17403
  applySortingForStore(type, sorting, sortingFunc, sortingColumns, sortingOrder, ignoreViewportUpdate) {
17404
+ var _a;
17161
17405
  const storeService = this.providers.data.stores[type];
17162
17406
  // row data
17163
17407
  const source = storeService.store.get('source');
@@ -17165,7 +17409,10 @@ class SortingPlugin extends BasePlugin {
17165
17409
  const proxyItems = storeService.store.get('proxyItems');
17166
17410
  const sortItems = getSortableRowIndexes(proxyItems, source);
17167
17411
  const sortedItems = sortIndexByItems([...sortItems], source, sortingFunc, sorting, sortingColumns, sortingOrder);
17168
- const newItemsOrder = mergeSortedRowsWithGroups(proxyItems, source, sortedItems);
17412
+ const hasGroupingRows = sortedItems.length !== proxyItems.length;
17413
+ const newItemsOrder = hasGroupingRows
17414
+ ? (_a = gatherGroupedRowIndexes(source, sortedItems)) !== null && _a !== void 0 ? _a : proxyItems
17415
+ : sortedItems;
17169
17416
  // take row indexes before trim applied and proxy items
17170
17417
  const prevItems = storeService.store.get('items');
17171
17418
  storeService.setData({
@@ -17191,6 +17438,16 @@ class SortingPlugin extends BasePlugin {
17191
17438
  }
17192
17439
  this.postponeSort(order, sortingFunc, sortingColumns, sortingOrder, ignoreViewportUpdate);
17193
17440
  }
17441
+ /**
17442
+ * Schedules the current active sort again after another plugin rebuilds row
17443
+ * proxy indexes while keeping the physical source unchanged.
17444
+ */
17445
+ reapplySorting() {
17446
+ if (!hasActiveSorting(this.sorting) || !this.sortingFunc) {
17447
+ return;
17448
+ }
17449
+ this.startSorting(this.sorting, this.sortingFunc, this.sortingColumns, this.sortingOrder);
17450
+ }
17194
17451
  /**
17195
17452
  * Applies sorting requested by a sortable header click.
17196
17453
  *
@@ -17709,8 +17966,10 @@ const TRIMMED_GROUPING = 'grouping';
17709
17966
  * against the grouped physical source can still be remapped. If neither path
17710
17967
  * resolves to a number, the caller drops the stale trim entry.
17711
17968
  */
17712
- function convertTrimmedIndex(initialIndex, firstLevelMap, secondLevelMap) {
17713
- const sourceIndex = Number.parseInt(initialIndex, 10);
17969
+ function convertGroupingIndex(initialIndex, firstLevelMap, secondLevelMap) {
17970
+ const sourceIndex = typeof initialIndex === 'number'
17971
+ ? initialIndex
17972
+ : Number.parseInt(initialIndex, 10);
17714
17973
  const firstConversionIndex = firstLevelMap[sourceIndex];
17715
17974
  if (!secondLevelMap) {
17716
17975
  return firstConversionIndex;
@@ -17743,7 +18002,7 @@ function processDoubleConversionTrimmed(initiallyTrimed, firstLevelMap, secondLe
17743
18002
  * if item exists we find it in collection
17744
18003
  * we support 2 level of conversions
17745
18004
  */
17746
- const newConversionIndex = convertTrimmedIndex(initialIndex, firstLevelMap, secondLevelMap);
18005
+ const newConversionIndex = convertGroupingIndex(initialIndex, firstLevelMap, secondLevelMap);
17747
18006
  // Group rows do not exist in the ungrouped index map and must not leak into new trims.
17748
18007
  if (typeof newConversionIndex !== 'number') {
17749
18008
  continue;
@@ -17804,7 +18063,7 @@ function filterOutEmptyGroupRows(source, filterTrimmed) {
17804
18063
  return trimmed;
17805
18064
  }
17806
18065
 
17807
- var __rest$1 = (undefined && undefined.__rest) || function (s, e) {
18066
+ var __rest = (undefined && undefined.__rest) || function (s, e) {
17808
18067
  var t = {};
17809
18068
  for (var p in s)
17810
18069
  if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
@@ -17818,7 +18077,7 @@ var __rest$1 = (undefined && undefined.__rest) || function (s, e) {
17818
18077
  };
17819
18078
  const PADDING_DEPTH = 10;
17820
18079
  const RowRenderer = (_a, cells) => {
17821
- var { rowClass, index, size, start, depth, groupingLevel } = _a, attrs = __rest$1(_a, ["rowClass", "index", "size", "start", "depth", "groupingLevel"]);
18080
+ var { rowClass, index, size, start, depth, groupingLevel } = _a, attrs = __rest(_a, ["rowClass", "index", "size", "start", "depth", "groupingLevel"]);
17822
18081
  const props = Object.assign(Object.assign(Object.assign({}, attrs), { [DATA_ROW]: index }), (typeof groupingLevel === 'number'
17823
18082
  ? { 'data-level': groupingLevel }
17824
18083
  : {}));
@@ -17910,7 +18169,7 @@ const GroupingRowRenderer = (props) => {
17910
18169
  depth })))));
17911
18170
  }
17912
18171
  return (hAsync(RowRenderer, Object.assign({}, props, groupRowAttrs), hasExpand && [
17913
- hAsync("button", { class: { [GROUP_EXPAND_BTN]: true }, onClick: e => expandEvent(e, model, itemIndex) }, expandSvgIconVNode(expanded)),
18172
+ hAsync("button", { type: "button", class: { [GROUP_EXPAND_BTN]: true }, onClick: e => expandEvent(e, model, itemIndex) }, expandSvgIconVNode(expanded)),
17914
18173
  String(name),
17915
18174
  ]));
17916
18175
  };
@@ -17918,18 +18177,6 @@ const expandSvgIconVNode = (expanded = false) => {
17918
18177
  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" })));
17919
18178
  };
17920
18179
 
17921
- var __rest = (undefined && undefined.__rest) || function (s, e) {
17922
- var t = {};
17923
- for (var p in s)
17924
- if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
17925
- t[p] = s[p];
17926
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
17927
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
17928
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
17929
- t[p[i]] = s[p[i]];
17930
- }
17931
- return t;
17932
- };
17933
18180
  class GroupingRowPlugin extends BasePlugin {
17934
18181
  getStore(type = GROUPING_ROW_TYPE) {
17935
18182
  return this.providers.data.stores[type].store;
@@ -17945,15 +18192,16 @@ class GroupingRowPlugin extends BasePlugin {
17945
18192
  }
17946
18193
  // expand event triggered
17947
18194
  onExpand({ virtualIndex }) {
17948
- const { source } = getSource(this.getStore().get('source'), this.getStore().get('proxyItems'));
17949
- let newTrimmed = this.getStore().get('trimmed')[TRIMMED_GROUPING];
17950
- let i = getPhysical(this.getStore(), virtualIndex);
18195
+ const store = this.getStore();
18196
+ const source = store.get('source');
18197
+ let newTrimmed = store.get('trimmed')[TRIMMED_GROUPING];
18198
+ const i = getPhysical(store, virtualIndex);
17951
18199
  const isExpanded = getExpanded(source[i]);
17952
18200
  if (!isExpanded) {
17953
- const { trimmed, items } = doExpand(virtualIndex, source, this.getStore().get('items'));
18201
+ const { trimmed, items: expandedItems } = doExpand(virtualIndex, source, store.get('items'));
17954
18202
  newTrimmed = Object.assign(Object.assign({}, newTrimmed), trimmed);
17955
- if (items) {
17956
- setItems(this.getStore(), items);
18203
+ if (expandedItems) {
18204
+ setItems(store, expandedItems);
17957
18205
  }
17958
18206
  }
17959
18207
  else {
@@ -17961,7 +18209,7 @@ class GroupingRowPlugin extends BasePlugin {
17961
18209
  newTrimmed = Object.assign(Object.assign({}, newTrimmed), trimmed);
17962
18210
  this.revogrid.clearFocus();
17963
18211
  }
17964
- this.getStore().set('source', source);
18212
+ store.set('source', source);
17965
18213
  this.revogrid.addTrimmed(newTrimmed, TRIMMED_GROUPING);
17966
18214
  }
17967
18215
  setColumnGrouping(cols) {
@@ -17983,7 +18231,7 @@ class GroupingRowPlugin extends BasePlugin {
17983
18231
  onDrag(e) {
17984
18232
  const { from, to } = e.detail;
17985
18233
  const isDown = to - from >= 0;
17986
- const { source } = getSource(this.getStore().get('source'), this.getStore().get('proxyItems'));
18234
+ const source = this.getStore().get('source');
17987
18235
  const items = this.getStore().get('items');
17988
18236
  let i = isDown ? from : to;
17989
18237
  const end = isDown ? to : from;
@@ -18009,21 +18257,13 @@ class GroupingRowPlugin extends BasePlugin {
18009
18257
  const source = this.getStore().get('source');
18010
18258
  return filterOutEmptyGroupRows(source, trimmed);
18011
18259
  }
18012
- isSortingRunning() {
18013
- const sortingPlugin = this.providers.plugins.getByClass(SortingPlugin);
18014
- return !!(sortingPlugin === null || sortingPlugin === void 0 ? void 0 : sortingPlugin.sortingPromise);
18015
- }
18016
18260
  /**
18017
- * Returns grouping options for regrouping that must preserve current UI state.
18018
- *
18019
- * `expandedAll` and config `prevExpanded` are initial/config instructions.
18020
- * Reusing them after sorting would reopen groups the user collapsed before
18021
- * sorting instead of using the current grouped source state.
18261
+ * Sorting changes proxy order without changing the physical source baseline.
18262
+ * Other proxy changes, such as row dragging, are user-authored source order
18263
+ * and must be retained when grouping is rebuilt.
18022
18264
  */
18023
- getCurrentExpandedOptions() {
18024
- var _a;
18025
- const _b = (_a = this.options) !== null && _a !== void 0 ? _a : {}, options = __rest(_b, ["expandedAll", "prevExpanded"]);
18026
- return options;
18265
+ isSortingActiveOrPending(sortingPlugin) {
18266
+ return !!(sortingPlugin === null || sortingPlugin === void 0 ? void 0 : sortingPlugin.sortingPromise) || hasActiveSorting(sortingPlugin === null || sortingPlugin === void 0 ? void 0 : sortingPlugin.sorting);
18027
18267
  }
18028
18268
  /**
18029
18269
  * Starts global source update with group clearing and applying new one
@@ -18036,7 +18276,12 @@ class GroupingRowPlugin extends BasePlugin {
18036
18276
  * @param newOldIndexMap - provides us mapping with new indexes vs old indexes, we would use it for trimmed mapping
18037
18277
  */
18038
18278
  const store = this.getStore();
18039
- const { source, prevExpanded, oldNewIndexes } = getSource(store.get('source'), store.get('proxyItems'), true);
18279
+ const sortingPlugin = this.providers.plugins.getByClass(SortingPlugin);
18280
+ const currentSource = store.get('source');
18281
+ const sourceItems = this.isSortingActiveOrPending(sortingPlugin)
18282
+ ? currentSource.map((_, index) => index)
18283
+ : store.get('proxyItems');
18284
+ const { source, prevExpanded, oldNewIndexes } = getSource(currentSource, sourceItems, true);
18040
18285
  const expanded = Object.assign({ prevExpanded }, options);
18041
18286
  /**
18042
18287
  * Group again
@@ -18046,8 +18291,13 @@ class GroupingRowPlugin extends BasePlugin {
18046
18291
  const customRenderer = options === null || options === void 0 ? void 0 : options.groupLabelTemplate;
18047
18292
  const cellRenderer = options === null || options === void 0 ? void 0 : options.groupCellTemplate;
18048
18293
  // setup source
18294
+ this.revogrid.dispatchEvent(new CustomEvent(BEFORE_GROUPING_APPLY_EVENT));
18049
18295
  this.providers.data.setData(sourceWithGroups, GROUPING_ROW_TYPE, this.revogrid.disableVirtualY, { depth, customRenderer, cellRenderer }, true);
18296
+ this.remapRowDefinitions(oldNewIndexes !== null && oldNewIndexes !== void 0 ? oldNewIndexes : {}, oldNewIndexMap, currentSource, sourceWithGroups);
18050
18297
  this.updateTrimmed(trimmed, oldNewIndexes !== null && oldNewIndexes !== void 0 ? oldNewIndexes : {}, oldNewIndexMap, sourceWithGroups);
18298
+ if (hasActiveSorting(sortingPlugin === null || sortingPlugin === void 0 ? void 0 : sortingPlugin.sorting)) {
18299
+ sortingPlugin === null || sortingPlugin === void 0 ? void 0 : sortingPlugin.reapplySorting();
18300
+ }
18051
18301
  }
18052
18302
  /**
18053
18303
  * Apply grouping on data set
@@ -18056,9 +18306,14 @@ class GroupingRowPlugin extends BasePlugin {
18056
18306
  */
18057
18307
  onDataSet(data) {
18058
18308
  var _a, _b, _c;
18309
+ const currentSource = this.getStore().get('source');
18310
+ const sortingPlugin = this.providers.plugins.getByClass(SortingPlugin);
18311
+ const currentItems = this.isSortingActiveOrPending(sortingPlugin)
18312
+ ? currentSource.map((_, index) => index)
18313
+ : this.getStore().get('proxyItems');
18314
+ const { prevExpanded, oldNewIndexes } = getSource(currentSource, currentItems, true);
18059
18315
  let preservedExpanded = {};
18060
18316
  if (((_a = this.options) === null || _a === void 0 ? void 0 : _a.preserveGroupingOnUpdate) !== false) {
18061
- let { prevExpanded } = getSource(this.getStore().get('source'), this.getStore().get('proxyItems'), true);
18062
18317
  preservedExpanded = prevExpanded;
18063
18318
  }
18064
18319
  const source = data.source.filter(s => !isGrouping(s));
@@ -18070,7 +18325,8 @@ class GroupingRowPlugin extends BasePlugin {
18070
18325
  customRenderer: options.groupLabelTemplate,
18071
18326
  cellRenderer: options.groupCellTemplate,
18072
18327
  });
18073
- this.updateTrimmed(trimmed, oldNewIndexMap, undefined, sourceWithGroups);
18328
+ queueMicrotask(() => this.remapRowDefinitions(oldNewIndexes !== null && oldNewIndexes !== void 0 ? oldNewIndexes : {}, oldNewIndexMap, currentSource, sourceWithGroups));
18329
+ this.updateTrimmed(trimmed, oldNewIndexMap, undefined, sourceWithGroups, { filterTrimmedMode: 'recompute-after-source-set' });
18074
18330
  }
18075
18331
  /**
18076
18332
  * External call to apply grouping. Called by revogrid when prop changed.
@@ -18105,10 +18361,6 @@ class GroupingRowPlugin extends BasePlugin {
18105
18361
  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))) {
18106
18362
  return;
18107
18363
  }
18108
- // if sorting is running don't apply grouping, wait for sorting, then it'll apply in @aftersortingapply
18109
- if (this.isSortingRunning()) {
18110
- return;
18111
- }
18112
18364
  this.onDataSet(detail);
18113
18365
  });
18114
18366
  this.addEventListener('beforecolumnsset', ({ detail }) => {
@@ -18123,17 +18375,6 @@ class GroupingRowPlugin extends BasePlugin {
18123
18375
  this.addEventListener('beforefiltertrimmed', ({ detail }) => {
18124
18376
  detail.itemsToFilter = this.beforeFilterTrimmed(detail.itemsToFilter);
18125
18377
  });
18126
- /**
18127
- * sorting applied need to clear grouping and apply again
18128
- * based on new results whole grouping order will changed
18129
- */
18130
- this.addEventListener('aftersortingapply', () => {
18131
- var _a, _b;
18132
- if (!((_b = (_a = this.options) === null || _a === void 0 ? void 0 : _a.props) === null || _b === void 0 ? void 0 : _b.length)) {
18133
- return;
18134
- }
18135
- this.doSourceUpdate(this.getCurrentExpandedOptions());
18136
- });
18137
18378
  /**
18138
18379
  * Apply logic for focus inside of grouping
18139
18380
  * We can't focus on grouping rows, navigation only inside of groups for now
@@ -18166,14 +18407,69 @@ class GroupingRowPlugin extends BasePlugin {
18166
18407
  }
18167
18408
  });
18168
18409
  // clear rows
18169
- const { source, oldNewIndexes } = getSource(this.getStore().get('source'), this.getStore().get('proxyItems'), true);
18410
+ const store = this.getStore();
18411
+ const sortingPlugin = this.providers.plugins.getByClass(SortingPlugin);
18412
+ const currentSource = store.get('source');
18413
+ const sourceItems = this.isSortingActiveOrPending(sortingPlugin)
18414
+ ? currentSource.map((_, index) => index)
18415
+ : store.get('proxyItems');
18416
+ const { source, oldNewIndexes } = getSource(currentSource, sourceItems, true);
18417
+ this.revogrid.dispatchEvent(new CustomEvent(BEFORE_GROUPING_APPLY_EVENT));
18170
18418
  this.providers.data.setData(source, GROUPING_ROW_TYPE, this.revogrid.disableVirtualY, undefined, true);
18419
+ this.remapRowDefinitions(oldNewIndexes !== null && oldNewIndexes !== void 0 ? oldNewIndexes : {}, undefined, currentSource, source);
18171
18420
  this.updateTrimmed(undefined, undefined, oldNewIndexes, source);
18421
+ if (hasActiveSorting(sortingPlugin === null || sortingPlugin === void 0 ? void 0 : sortingPlugin.sorting)) {
18422
+ sortingPlugin === null || sortingPlugin === void 0 ? void 0 : sortingPlugin.reapplySorting();
18423
+ }
18424
+ }
18425
+ remapRowDefinitions(firstLevelMap, secondLevelMap, previousSource, nextSource) {
18426
+ const definitions = this.providers.dimension.getRowDefinitions();
18427
+ const nextGroupIndexes = new Map();
18428
+ nextSource === null || nextSource === void 0 ? void 0 : nextSource.forEach((row, index) => {
18429
+ const groupId = row[PSEUDO_GROUP_ITEM_ID];
18430
+ if (groupId && !nextGroupIndexes.has(groupId)) {
18431
+ nextGroupIndexes.set(groupId, index);
18432
+ }
18433
+ });
18434
+ let changed = false;
18435
+ const remapped = definitions.flatMap(definition => {
18436
+ if (definition.type !== GROUPING_ROW_TYPE) {
18437
+ return [definition];
18438
+ }
18439
+ const previousRow = previousSource === null || previousSource === void 0 ? void 0 : previousSource[definition.index];
18440
+ const groupId = previousRow === null || previousRow === void 0 ? void 0 : previousRow[PSEUDO_GROUP_ITEM_ID];
18441
+ const index = groupId
18442
+ ? nextGroupIndexes.get(groupId)
18443
+ : convertGroupingIndex(definition.index, firstLevelMap, secondLevelMap);
18444
+ if (typeof index !== 'number') {
18445
+ changed = true;
18446
+ return [];
18447
+ }
18448
+ if (index < 0) {
18449
+ changed = true;
18450
+ return [];
18451
+ }
18452
+ if (index === definition.index) {
18453
+ return [definition];
18454
+ }
18455
+ changed = true;
18456
+ return [Object.assign(Object.assign({}, definition), { index })];
18457
+ });
18458
+ if (changed) {
18459
+ this.providers.dimension.setRowDefinitions(remapped);
18460
+ }
18172
18461
  }
18173
- updateTrimmed(trimmedGroup = {}, firstLevelMap = {}, secondLevelMap, source = this.getStore().get('source')) {
18462
+ updateTrimmed(trimmedGroup = {}, firstLevelMap = {}, secondLevelMap, source = this.getStore().get('source'), { filterTrimmedMode = 'remap', } = {}) {
18174
18463
  // map previously trimmed data
18175
18464
  const trimemedOptionsToUpgrade = processDoubleConversionTrimmed(this.getStore().get('trimmed'), firstLevelMap, secondLevelMap);
18176
18465
  for (let type in trimemedOptionsToUpgrade) {
18466
+ if (filterTrimmedMode === 'recompute-after-source-set' &&
18467
+ type === FILTER_TRIMMED_TYPE) {
18468
+ // The filter plugin recalculates this trim against the installed source
18469
+ // during aftersourceset. Reapplying remapped old indexes afterwards
18470
+ // would overwrite that fresh result.
18471
+ continue;
18472
+ }
18177
18473
  if (type === FILTER_TRIMMED_TYPE) {
18178
18474
  /** Regrouping changes physical indexes, so filter trim needs fresh group-header state. */
18179
18475
  trimemedOptionsToUpgrade[type] = filterOutEmptyGroupRows(source, trimemedOptionsToUpgrade[type]);
@@ -18344,7 +18640,7 @@ class ViewportService {
18344
18640
  const changedItems = {};
18345
18641
  for (const i of Object.keys(detail || {})) {
18346
18642
  const size = detail[i];
18347
- const virtualIndex = parseInt(i, 10);
18643
+ const virtualIndex = Number.parseInt(i, 10);
18348
18644
  const item = getSourceItem(store, virtualIndex);
18349
18645
  if (item) {
18350
18646
  changedItems[virtualIndex] = Object.assign(Object.assign({}, item), { size });
@@ -18473,29 +18769,25 @@ class GridScrollingService {
18473
18769
  this.elements = {};
18474
18770
  }
18475
18771
  async proxyScroll(e, key, skipEvent) {
18476
- var _a;
18477
18772
  let newEventPromise;
18478
18773
  let event = e;
18479
- for (let elKey in (skipEvent ? {} : this.elements)) {
18774
+ for (const elKey in (skipEvent ? {} : this.elements)) {
18480
18775
  // skip
18481
18776
  if (e.dimension === 'rgCol' && elKey === 'headerRow') {
18482
18777
  continue;
18483
18778
  // pinned column only
18484
18779
  }
18485
- else if (this.isPinnedColumn(key) && e.dimension === 'rgCol') {
18780
+ if (this.isPinnedColumn(key) && e.dimension === 'rgCol') {
18486
18781
  if (elKey === key || !e.delta) {
18487
18782
  continue;
18488
18783
  }
18489
- for (let el of this.elements[elKey]) {
18490
- if (el.changeScroll) {
18491
- newEventPromise = el.changeScroll(e);
18492
- }
18784
+ const changedEvent = this.changeScroll(this.elements[elKey], e);
18785
+ if (changedEvent) {
18786
+ newEventPromise = changedEvent;
18493
18787
  }
18494
18788
  }
18495
18789
  else {
18496
- for (let el of this.elements[elKey]) {
18497
- await ((_a = el.setScroll) === null || _a === void 0 ? void 0 : _a.call(el, e));
18498
- }
18790
+ await this.setScroll(this.elements[elKey], e);
18499
18791
  }
18500
18792
  }
18501
18793
  const newEvent = await newEventPromise;
@@ -18505,12 +18797,27 @@ class GridScrollingService {
18505
18797
  this.setViewport(skipEvent && this.isPinnedColumn(key)
18506
18798
  ? Object.assign(Object.assign({}, event), { dimension: key }) : event);
18507
18799
  }
18800
+ changeScroll(elements, e) {
18801
+ let changedEvent;
18802
+ for (const element of elements) {
18803
+ if (element.changeScroll) {
18804
+ changedEvent = element.changeScroll(e);
18805
+ }
18806
+ }
18807
+ return changedEvent;
18808
+ }
18809
+ async setScroll(elements, e) {
18810
+ var _a;
18811
+ for (const element of elements) {
18812
+ await ((_a = element.setScroll) === null || _a === void 0 ? void 0 : _a.call(element, e));
18813
+ }
18814
+ }
18508
18815
  /**
18509
18816
  * Silent scroll update for mobile devices when we have negative scroll top
18510
18817
  */
18511
18818
  async scrollSilentService(e, key) {
18512
18819
  var _a;
18513
- for (let elKey in this.elements) {
18820
+ for (const elKey in this.elements) {
18514
18821
  // skip same element update
18515
18822
  if (elKey === key) {
18516
18823
  continue;
@@ -18518,7 +18825,7 @@ class GridScrollingService {
18518
18825
  if (columnTypes.includes(key) &&
18519
18826
  (elKey === 'headerRow' ||
18520
18827
  columnTypes.includes(elKey))) {
18521
- for (let el of this.elements[elKey]) {
18828
+ for (const el of this.elements[elKey]) {
18522
18829
  await ((_a = el.changeScroll) === null || _a === void 0 ? void 0 : _a.call(el, e, true));
18523
18830
  }
18524
18831
  continue;
@@ -18526,7 +18833,7 @@ class GridScrollingService {
18526
18833
  }
18527
18834
  }
18528
18835
  isPinnedColumn(key) {
18529
- return !!key && ['colPinStart', 'colPinEnd'].indexOf(key) > -1;
18836
+ return !!key && ['colPinStart', 'colPinEnd'].includes(key);
18530
18837
  }
18531
18838
  registerElements(els) {
18532
18839
  this.elements = els;
@@ -18807,9 +19114,11 @@ class SelectionStoreConnector {
18807
19114
  continue;
18808
19115
  }
18809
19116
  const lastCell = store.store.get('lastCell');
18810
- if (lastCell) {
18811
- store.setRange({ x: 0, y: 0 }, { x: lastCell.x - 1, y: lastCell.y - 1 });
19117
+ if (!lastCell || lastCell.x <= 0 || lastCell.y <= 0) {
19118
+ store.setRangeArea(null);
19119
+ continue;
18812
19120
  }
19121
+ store.setRange({ x: 0, y: 0 }, { x: lastCell.x - 1, y: lastCell.y - 1 });
18813
19122
  }
18814
19123
  }
18815
19124
  }
@@ -19000,19 +19309,6 @@ const rowDefinitionByType = (newVal = []) => {
19000
19309
  }
19001
19310
  return result;
19002
19311
  };
19003
- const rowDefinitionRemoveByType = (oldVal = []) => {
19004
- const result = {};
19005
- for (const v of oldVal) {
19006
- let rowDefs = result[v.type];
19007
- if (!rowDefs) {
19008
- rowDefs = result[v.type] = [];
19009
- }
19010
- if (typeof v.size === 'number') {
19011
- rowDefs.push(v.index);
19012
- }
19013
- }
19014
- return result;
19015
- };
19016
19312
 
19017
19313
  const COLUMN_DRAG_CLASS = 'column-drag-start';
19018
19314
  class ColumnOrderHandler {
@@ -19572,6 +19868,7 @@ function isMobileDevice() {
19572
19868
  return /Mobi/i.test(navigator.userAgent) || /Android/i.test(navigator.userAgent) || navigator.maxTouchPoints > 0;
19573
19869
  }
19574
19870
 
19871
+ const toAriaIndex = (index) => `${index + 1}`;
19575
19872
  /**
19576
19873
  * WCAG Plugin is responsible for enhancing the accessibility features of the RevoGrid component.
19577
19874
  * It ensures that the grid is fully compliant with Web Content Accessibility Guidelines (WCAG) 2.1.
@@ -19615,14 +19912,14 @@ class WCAGPlugin extends BasePlugin {
19615
19912
  column.columnProperties = (...args) => {
19616
19913
  const result = (columnProperties === null || columnProperties === void 0 ? void 0 : columnProperties(...args)) || {};
19617
19914
  result.role = 'columnheader';
19618
- result['aria-colindex'] = `${index}`;
19915
+ result['aria-colindex'] = toAriaIndex(index);
19619
19916
  return result;
19620
19917
  };
19621
19918
  column.cellProperties = (...args) => {
19622
19919
  const wcagProps = {
19623
19920
  ['role']: 'gridcell',
19624
- ['aria-colindex']: `${index}`,
19625
- ['aria-rowindex']: `${args[0].rowIndex}`,
19921
+ ['aria-colindex']: toAriaIndex(index),
19922
+ ['aria-rowindex']: toAriaIndex(args[0].rowIndex),
19626
19923
  ['tabindex']: -1,
19627
19924
  };
19628
19925
  const columnProps = (cellProperties === null || cellProperties === void 0 ? void 0 : cellProperties(...args)) || {};
@@ -19637,7 +19934,7 @@ class WCAGPlugin extends BasePlugin {
19637
19934
  revogrid.setAttribute('aria-rowcount', `${detail.source.length}`);
19638
19935
  });
19639
19936
  this.addEventListener('beforerowrender', ({ detail, }) => {
19640
- detail.node.$attrs$ = Object.assign(Object.assign({}, detail.node.$attrs$), { role: 'row', ['aria-rowindex']: detail.item.itemIndex });
19937
+ detail.node.$attrs$ = Object.assign(Object.assign({}, detail.node.$attrs$), { role: 'row', ['aria-rowindex']: toAriaIndex(detail.item.itemIndex) });
19641
19938
  });
19642
19939
  // focuscell
19643
19940
  this.addEventListener('afterfocus', async (e) => {
@@ -19684,7 +19981,7 @@ class PluginService {
19684
19981
  return;
19685
19982
  }
19686
19983
  // Step 1: Identify plugins to remove, compare new and old plugins
19687
- const pluginsToRemove = (prevPlugins === null || prevPlugins === void 0 ? void 0 : prevPlugins.filter(prevPlugin => !plugins.some(userPlugin => userPlugin === prevPlugin))) || [];
19984
+ const pluginsToRemove = (prevPlugins === null || prevPlugins === void 0 ? void 0 : prevPlugins.filter(prevPlugin => !plugins.includes(prevPlugin))) || [];
19688
19985
  // Step 2: Remove old plugins
19689
19986
  pluginsToRemove.forEach(plugin => {
19690
19987
  var _a, _b;
@@ -19697,7 +19994,7 @@ class PluginService {
19697
19994
  // Step 3: Register user plugins
19698
19995
  plugins === null || plugins === void 0 ? void 0 : plugins.forEach(userPlugin => {
19699
19996
  // check if plugin already exists, if so, skip
19700
- const existingPlugin = this.internalPlugins.find(createdPlugin => createdPlugin instanceof userPlugin);
19997
+ const existingPlugin = this.internalPlugins.some(createdPlugin => createdPlugin instanceof userPlugin);
19701
19998
  if (existingPlugin) {
19702
19999
  return;
19703
20000
  }
@@ -19836,6 +20133,469 @@ class RTLPlugin extends BasePlugin {
19836
20133
  }
19837
20134
  }
19838
20135
 
20136
+ const DEFAULT_MIN_ROW_HEIGHT = 20;
20137
+ const finiteNumber = (value) => typeof value === 'number' && Number.isFinite(value);
20138
+ function resolveRowResizeConfig(config = {}) {
20139
+ const minHeight = finiteNumber(config.minHeight)
20140
+ ? Math.max(1, Math.round(config.minHeight))
20141
+ : DEFAULT_MIN_ROW_HEIGHT;
20142
+ const maxHeight = finiteNumber(config.maxHeight)
20143
+ ? Math.max(minHeight, Math.round(config.maxHeight))
20144
+ : undefined;
20145
+ return { minHeight, maxHeight, fullRow: config.fullRow === true };
20146
+ }
20147
+ function clampRowResizeHeight(height, config) {
20148
+ var _a;
20149
+ const rounded = Number.isFinite(height)
20150
+ ? Math.round(height)
20151
+ : config.minHeight;
20152
+ return Math.min(Math.max(rounded, config.minHeight), (_a = config.maxHeight) !== null && _a !== void 0 ? _a : Number.POSITIVE_INFINITY);
20153
+ }
20154
+ function getRowResizeIndexes({ rowType, rowIndex, rowCount, selectedRange, selectedRowType, }) {
20155
+ if (!selectedRange ||
20156
+ selectedRowType !== rowType ||
20157
+ rowIndex < Math.min(selectedRange.y, selectedRange.y1) ||
20158
+ rowIndex > Math.max(selectedRange.y, selectedRange.y1)) {
20159
+ return rowIndex >= 0 && rowIndex < rowCount ? [rowIndex] : [];
20160
+ }
20161
+ const start = Math.max(0, Math.min(selectedRange.y, selectedRange.y1));
20162
+ const end = Math.min(rowCount - 1, Math.max(selectedRange.y, selectedRange.y1));
20163
+ return Array.from({ length: Math.max(0, end - start + 1) }, (_, i) => start + i);
20164
+ }
20165
+ function createRowResizePatch(indexes, size) {
20166
+ return indexes.reduce((patch, index) => {
20167
+ patch[index] = size;
20168
+ return patch;
20169
+ }, {});
20170
+ }
20171
+ function mergeRowResizeDefinitions(definitions, rowType, physicalIndexes, size) {
20172
+ const targetIndexes = new Set(physicalIndexes);
20173
+ const existingIndexes = new Set();
20174
+ const merged = definitions.map(definition => {
20175
+ if (definition.type !== rowType || !targetIndexes.has(definition.index)) {
20176
+ return definition;
20177
+ }
20178
+ existingIndexes.add(definition.index);
20179
+ return Object.assign(Object.assign({}, definition), { size });
20180
+ });
20181
+ for (const index of targetIndexes) {
20182
+ if (!existingIndexes.has(index)) {
20183
+ merged.push({ type: rowType, index, size });
20184
+ }
20185
+ }
20186
+ return merged;
20187
+ }
20188
+
20189
+ const ROW_RESIZE_HANDLE_CLASS = 'row-resize-handle';
20190
+ const BEFORE_ROW_RESIZE_EVENT = 'beforerowresize';
20191
+ const ROW_RESIZE_EVENT = 'rowresize';
20192
+ const AFTER_ROW_RESIZE_EVENT = 'afterrowresize';
20193
+ const ROW_RESIZE_CANCEL_EVENT = 'rowresizecancel';
20194
+ class RowResizePlugin extends BasePlugin {
20195
+ constructor(revogrid, providers, config = {}) {
20196
+ super(revogrid, providers);
20197
+ this.enabled = false;
20198
+ this.appliedDefinitionIndexes = new Map();
20199
+ this.pendingBottomAnchor = false;
20200
+ this.keepBottomAnchor = false;
20201
+ this.rowDefinitionRemapQueued = false;
20202
+ this.pendingSourceCounts = new Map();
20203
+ this.previousBodyCursor = '';
20204
+ this.decorateRow = ({ detail, }) => {
20205
+ if (!this.enabled ||
20206
+ (detail.colType !== 'rowHeaders' && !this.config.fullRow)) {
20207
+ return;
20208
+ }
20209
+ const handle = this.h('div', {
20210
+ 'key': `row-resize-${detail.rowType}-${detail.item.itemIndex}`,
20211
+ 'class': { [ROW_RESIZE_HANDLE_CLASS]: true },
20212
+ 'data-row-resize-index': detail.item.itemIndex,
20213
+ 'aria-hidden': 'true',
20214
+ 'onPointerDown': (event) => this.startResize(event, detail.rowType, detail.item.itemIndex),
20215
+ });
20216
+ detail.node.$children$ = [...(detail.node.$children$ || []), handle];
20217
+ };
20218
+ this.cancelForDataChange = () => this.cancel('data-change');
20219
+ this.onPointerMove = (event) => {
20220
+ const active = this.active;
20221
+ if ((active === null || active === void 0 ? void 0 : active.pointerId) !== event.pointerId) {
20222
+ return;
20223
+ }
20224
+ event.preventDefault();
20225
+ active.lastEvent = event;
20226
+ this.pendingHeight = clampRowResizeHeight(active.startHeight + event.clientY - active.startY, this.config);
20227
+ if (this.animationFrame === undefined) {
20228
+ const view = this.revogrid.ownerDocument.defaultView;
20229
+ this.animationFrame = view === null || view === void 0 ? void 0 : view.requestAnimationFrame(() => {
20230
+ this.animationFrame = undefined;
20231
+ this.flushPendingResize();
20232
+ });
20233
+ }
20234
+ };
20235
+ this.onPointerUp = (event) => {
20236
+ const active = this.active;
20237
+ if ((active === null || active === void 0 ? void 0 : active.pointerId) !== event.pointerId) {
20238
+ return;
20239
+ }
20240
+ event.preventDefault();
20241
+ active.lastEvent = event;
20242
+ this.pendingHeight = clampRowResizeHeight(active.startHeight + event.clientY - active.startY, this.config);
20243
+ this.flushPendingResize();
20244
+ if (this.active !== active) {
20245
+ return;
20246
+ }
20247
+ const detail = this.eventDetail(active, event, active.currentHeight);
20248
+ this.finishGesture();
20249
+ this.commitResize(active);
20250
+ this.emit(AFTER_ROW_RESIZE_EVENT, detail);
20251
+ };
20252
+ this.onPointerCancel = (event) => {
20253
+ var _a;
20254
+ if (((_a = this.active) === null || _a === void 0 ? void 0 : _a.pointerId) === event.pointerId) {
20255
+ this.active.lastEvent = event;
20256
+ this.cancel('pointercancel');
20257
+ }
20258
+ };
20259
+ this.onKeyDown = (event) => {
20260
+ if (event.key === 'Escape' && this.active) {
20261
+ event.preventDefault();
20262
+ this.cancel('escape');
20263
+ }
20264
+ };
20265
+ this.onWindowBlur = () => this.cancel('blur');
20266
+ this.updateBottomAnchorState = ({ detail, }) => {
20267
+ if (detail.dimension !== 'rgRow') {
20268
+ return;
20269
+ }
20270
+ this.keepBottomAnchor = this.isMainViewportAtBottom(detail.coordinate);
20271
+ };
20272
+ this.applyPendingBottomAnchor = () => {
20273
+ if (!this.pendingBottomAnchor) {
20274
+ return;
20275
+ }
20276
+ this.pendingBottomAnchor = false;
20277
+ const dimension = this.providers.dimension.stores.rgRow.store;
20278
+ // Scroll surfaces have slightly different client sizes. Give the shared
20279
+ // scrolling service the content end and let each surface clamp to its own
20280
+ // exact bottom coordinate.
20281
+ void this.revogrid.scrollToCoordinate({ y: dimension.get('realSize') });
20282
+ };
20283
+ this.scheduleRowDefinitionRemap = () => {
20284
+ if (this.rowDefinitionRemapQueued) {
20285
+ return;
20286
+ }
20287
+ this.rowDefinitionRemapQueued = true;
20288
+ queueMicrotask(() => {
20289
+ if (!this.rowDefinitionRemapQueued) {
20290
+ return;
20291
+ }
20292
+ this.pruneRowDefinitions();
20293
+ this.reapplyRowDefinitionSizes();
20294
+ this.rowDefinitionRemapQueued = false;
20295
+ });
20296
+ };
20297
+ /** Map source-indexed row definitions back onto the current virtual order. */
20298
+ this.reapplyRowDefinitionSizes = () => {
20299
+ const rowDefinitions = this.providers.dimension.getRowDefinitions();
20300
+ for (const rowType of rowTypes) {
20301
+ const items = this.providers.data.stores[rowType].store.get('items');
20302
+ const definitions = new Map(rowDefinitions
20303
+ .filter(definition => definition.type === rowType)
20304
+ .map(definition => [definition.index, definition.size]));
20305
+ const appliedIndexes = this.appliedDefinitionIndexes.get(rowType);
20306
+ if (!definitions.size && !(appliedIndexes === null || appliedIndexes === void 0 ? void 0 : appliedIndexes.size)) {
20307
+ continue;
20308
+ }
20309
+ const dimension = this.providers.dimension.stores[rowType];
20310
+ const currentSizes = dimension.store.get('sizes');
20311
+ const sizes = Object.assign({}, currentSizes);
20312
+ for (const index of appliedIndexes || []) {
20313
+ delete sizes[index];
20314
+ }
20315
+ const indexes = new Set();
20316
+ items.forEach((physicalIndex, virtualIndex) => {
20317
+ const size = definitions.get(physicalIndex);
20318
+ if (size !== undefined) {
20319
+ sizes[virtualIndex] = size;
20320
+ indexes.add(virtualIndex);
20321
+ }
20322
+ });
20323
+ this.appliedDefinitionIndexes.set(rowType, indexes);
20324
+ const sizeKeys = Object.keys(sizes);
20325
+ if (sizeKeys.length !== Object.keys(currentSizes).length ||
20326
+ sizeKeys.some(index => sizes[index] !== currentSizes[index])) {
20327
+ this.providers.dimension.setCustomSizes(rowType, sizes);
20328
+ }
20329
+ }
20330
+ };
20331
+ this.config = resolveRowResizeConfig(config);
20332
+ if (new.target !== RowResizePlugin) {
20333
+ this.enabled = true;
20334
+ this.registerEventListeners();
20335
+ }
20336
+ }
20337
+ registerEventListeners() {
20338
+ this.addEventListener('beforerowrender', this.decorateRow);
20339
+ this.addEventListener('beforeanysource', () => {
20340
+ this.cancel('data-change');
20341
+ this.keepBottomAnchor = false;
20342
+ });
20343
+ this.addEventListener('afteranysource', ({ detail }) => {
20344
+ this.pendingSourceCounts.set(detail.type, detail.source.length);
20345
+ this.scheduleRowDefinitionRemap();
20346
+ });
20347
+ this.addEventListener('beforesourcesortingapply', this.cancelForDataChange);
20348
+ this.addEventListener('beforesortingapply', this.cancelForDataChange);
20349
+ this.addEventListener('sortingconfigchanged', this.cancelForDataChange);
20350
+ this.addEventListener(BEFORE_GROUPING_APPLY_EVENT, this.cancelForDataChange);
20351
+ this.addEventListener('aftersortingapply', this.scheduleRowDefinitionRemap);
20352
+ this.addEventListener('beforefilterapply', this.cancelForDataChange);
20353
+ this.addEventListener('afterfilterapply', this.scheduleRowDefinitionRemap);
20354
+ this.addEventListener('beforerowdefinition', () => {
20355
+ this.cancel('data-change');
20356
+ this.scheduleRowDefinitionRemap();
20357
+ });
20358
+ this.addEventListener('afterthemechanged', this.scheduleRowDefinitionRemap);
20359
+ this.addEventListener('aftertrimmed', this.scheduleRowDefinitionRemap);
20360
+ this.addEventListener('roworderchange', this.scheduleRowDefinitionRemap);
20361
+ this.addEventListener(GROUP_EXPAND_EVENT, () => {
20362
+ if (this.keepBottomAnchor) {
20363
+ this.pendingBottomAnchor = true;
20364
+ }
20365
+ this.scheduleRowDefinitionRemap();
20366
+ });
20367
+ this.addEventListener('aftergridrender', this.applyPendingBottomAnchor);
20368
+ this.addEventListener('viewportscroll', this.updateBottomAnchorState);
20369
+ this.addEventListener('rowheaderschanged', ({ detail }) => {
20370
+ if (!detail && !this.config.fullRow) {
20371
+ this.cancel('row-headers-hidden');
20372
+ }
20373
+ });
20374
+ }
20375
+ syncGridConfig(refresh = true) {
20376
+ const { plugins = [], resizeRow } = this.revogrid;
20377
+ const isCorePlugin = this.constructor === RowResizePlugin;
20378
+ const hasConfiguredPlugin = plugins.some(plugin => plugin !== RowResizePlugin &&
20379
+ plugin.prototype instanceof RowResizePlugin);
20380
+ const enabled = !isCorePlugin ||
20381
+ (!hasConfiguredPlugin && !!resizeRow);
20382
+ const resizeConfig = typeof resizeRow === 'object' ? resizeRow : undefined;
20383
+ const config = isCorePlugin
20384
+ ? resolveRowResizeConfig(resizeConfig)
20385
+ : this.config;
20386
+ const configChanged = config.minHeight !== this.config.minHeight ||
20387
+ config.maxHeight !== this.config.maxHeight ||
20388
+ config.fullRow !== this.config.fullRow;
20389
+ if (enabled === this.enabled && !configChanged) {
20390
+ return;
20391
+ }
20392
+ this.cancel('config-change');
20393
+ this.config = config;
20394
+ if (enabled !== this.enabled) {
20395
+ this.enabled = enabled;
20396
+ if (enabled) {
20397
+ this.registerEventListeners();
20398
+ }
20399
+ else {
20400
+ this.pendingBottomAnchor = false;
20401
+ this.keepBottomAnchor = false;
20402
+ this.rowDefinitionRemapQueued = false;
20403
+ this.pendingSourceCounts.clear();
20404
+ this.clearSubscriptions();
20405
+ }
20406
+ }
20407
+ if (refresh) {
20408
+ queueMicrotask(() => void this.revogrid.refresh());
20409
+ }
20410
+ }
20411
+ startResize(event, rowType, index) {
20412
+ var _a, _b;
20413
+ if (!this.enabled ||
20414
+ this.active ||
20415
+ event.defaultPrevented ||
20416
+ !event.isPrimary ||
20417
+ (event.pointerType !== 'touch' && event.button !== 0)) {
20418
+ return;
20419
+ }
20420
+ const dimension = this.providers.dimension.stores[rowType];
20421
+ const dimensionState = dimension.getCurrentState();
20422
+ const viewport = this.providers.viewport.stores[rowType];
20423
+ const item = getItemByIndex(dimensionState, index);
20424
+ const focusedStore = this.providers.selection.focusedStore;
20425
+ const selectedRowType = focusedStore
20426
+ ? this.providers.selection.storesYToType[focusedStore.position.y]
20427
+ : undefined;
20428
+ const indexes = getRowResizeIndexes({
20429
+ rowType,
20430
+ rowIndex: index,
20431
+ rowCount: dimensionState.count,
20432
+ selectedRange: this.providers.selection.selectedRange,
20433
+ selectedRowType,
20434
+ });
20435
+ if (!indexes.length) {
20436
+ return;
20437
+ }
20438
+ const previousSizes = indexes.reduce((sizes, rowIndex) => {
20439
+ const row = getItemByIndex(dimensionState, rowIndex);
20440
+ sizes[rowIndex] = row.end - row.start;
20441
+ return sizes;
20442
+ }, {});
20443
+ const startHeight = item.end - item.start;
20444
+ const active = {
20445
+ pointerId: event.pointerId,
20446
+ rowType,
20447
+ index,
20448
+ indexes,
20449
+ startY: event.clientY,
20450
+ startHeight,
20451
+ currentHeight: startHeight,
20452
+ previousSizes,
20453
+ originalCustomSizes: Object.assign({}, dimensionState.sizes),
20454
+ bottomAnchored: rowType === 'rgRow' &&
20455
+ this.isMainViewportAtBottom(viewport.lastCoordinate),
20456
+ lastEvent: event,
20457
+ };
20458
+ this.active = active;
20459
+ const beforeEvent = this.emit(BEFORE_ROW_RESIZE_EVENT, this.eventDetail(active, event, startHeight));
20460
+ if (beforeEvent.defaultPrevented) {
20461
+ if (this.active === active) {
20462
+ this.active = undefined;
20463
+ }
20464
+ return;
20465
+ }
20466
+ if (!this.enabled || this.active !== active) {
20467
+ return;
20468
+ }
20469
+ event.preventDefault();
20470
+ event.stopPropagation();
20471
+ const doc = this.revogrid.ownerDocument;
20472
+ this.previousBodyCursor = ((_a = doc.body) === null || _a === void 0 ? void 0 : _a.style.cursor) || '';
20473
+ if (doc.body) {
20474
+ doc.body.style.cursor = 'row-resize';
20475
+ }
20476
+ doc.addEventListener('pointermove', this.onPointerMove, true);
20477
+ doc.addEventListener('pointerup', this.onPointerUp, true);
20478
+ doc.addEventListener('pointercancel', this.onPointerCancel, true);
20479
+ doc.addEventListener('keydown', this.onKeyDown, true);
20480
+ (_b = doc.defaultView) === null || _b === void 0 ? void 0 : _b.addEventListener('blur', this.onWindowBlur);
20481
+ }
20482
+ flushPendingResize() {
20483
+ const active = this.active;
20484
+ if (!active || this.pendingHeight === undefined) {
20485
+ return;
20486
+ }
20487
+ const size = this.pendingHeight;
20488
+ this.pendingHeight = undefined;
20489
+ if (size === active.currentHeight) {
20490
+ return;
20491
+ }
20492
+ this.providers.dimension.setCustomSizes(active.rowType, createRowResizePatch(active.indexes, size), true);
20493
+ this.requestBottomAnchor(active);
20494
+ active.currentHeight = size;
20495
+ this.emit(ROW_RESIZE_EVENT, this.eventDetail(active, active.lastEvent, size));
20496
+ }
20497
+ cancel(reason) {
20498
+ const active = this.active;
20499
+ if (!active) {
20500
+ return;
20501
+ }
20502
+ const currentSizes = Object.assign({}, this.providers.dimension.stores[active.rowType].store.get('sizes'));
20503
+ for (const index of active.indexes) {
20504
+ if (Object.hasOwn(active.originalCustomSizes, index)) {
20505
+ currentSizes[index] = active.originalCustomSizes[index];
20506
+ }
20507
+ else {
20508
+ delete currentSizes[index];
20509
+ }
20510
+ }
20511
+ this.providers.dimension.setCustomSizes(active.rowType, currentSizes);
20512
+ this.requestBottomAnchor(active);
20513
+ const detail = Object.assign(Object.assign({}, this.eventDetail(active, active.lastEvent, active.startHeight)), { reason });
20514
+ this.finishGesture();
20515
+ this.emit(ROW_RESIZE_CANCEL_EVENT, detail);
20516
+ }
20517
+ eventDetail(active, originalEvent, size) {
20518
+ return {
20519
+ rowType: active.rowType,
20520
+ index: active.index,
20521
+ indexes: [...active.indexes],
20522
+ size,
20523
+ previousSizes: Object.assign({}, active.previousSizes),
20524
+ originalEvent,
20525
+ };
20526
+ }
20527
+ commitResize(active) {
20528
+ if (active.currentHeight === active.startHeight) {
20529
+ return;
20530
+ }
20531
+ const items = this.providers.data.stores[active.rowType].store.get('items');
20532
+ const physicalIndexes = active.indexes.reduce((result, index) => {
20533
+ const physicalIndex = items[index];
20534
+ if (physicalIndex !== undefined) {
20535
+ result.push(physicalIndex);
20536
+ }
20537
+ return result;
20538
+ }, []);
20539
+ if (physicalIndexes.length) {
20540
+ const rowDefinitions = mergeRowResizeDefinitions(this.providers.dimension.getRowDefinitions(), active.rowType, physicalIndexes, active.currentHeight);
20541
+ this.providers.dimension.setRowDefinitions(rowDefinitions);
20542
+ this.scheduleRowDefinitionRemap();
20543
+ this.keepBottomAnchor = active.bottomAnchored;
20544
+ this.requestBottomAnchor(active);
20545
+ }
20546
+ }
20547
+ requestBottomAnchor(active) {
20548
+ if (active.bottomAnchored) {
20549
+ this.pendingBottomAnchor = true;
20550
+ }
20551
+ }
20552
+ isMainViewportAtBottom(coordinate) {
20553
+ const dimension = this.providers.dimension.stores.rgRow.getCurrentState();
20554
+ const viewport = this.providers.viewport.stores.rgRow.store.state;
20555
+ return (dimension.realSize > viewport.clientSize &&
20556
+ coordinate >= getViewportMaxCoordinate(dimension, viewport.virtualSize));
20557
+ }
20558
+ pruneRowDefinitions() {
20559
+ if (!this.pendingSourceCounts.size) {
20560
+ return;
20561
+ }
20562
+ const definitions = this.providers.dimension.getRowDefinitions();
20563
+ const rowDefinitions = definitions.filter(definition => {
20564
+ const count = this.pendingSourceCounts.get(definition.type);
20565
+ return count === undefined || definition.index < count;
20566
+ });
20567
+ this.pendingSourceCounts.clear();
20568
+ if (rowDefinitions.length !== definitions.length) {
20569
+ this.providers.dimension.setRowDefinitions(rowDefinitions);
20570
+ }
20571
+ }
20572
+ finishGesture() {
20573
+ const doc = this.revogrid.ownerDocument;
20574
+ const view = doc.defaultView;
20575
+ if (this.animationFrame !== undefined) {
20576
+ view === null || view === void 0 ? void 0 : view.cancelAnimationFrame(this.animationFrame);
20577
+ }
20578
+ doc.removeEventListener('pointermove', this.onPointerMove, true);
20579
+ doc.removeEventListener('pointerup', this.onPointerUp, true);
20580
+ doc.removeEventListener('pointercancel', this.onPointerCancel, true);
20581
+ doc.removeEventListener('keydown', this.onKeyDown, true);
20582
+ view === null || view === void 0 ? void 0 : view.removeEventListener('blur', this.onWindowBlur);
20583
+ if (doc.body) {
20584
+ doc.body.style.cursor = this.previousBodyCursor;
20585
+ }
20586
+ this.animationFrame = undefined;
20587
+ this.pendingHeight = undefined;
20588
+ this.active = undefined;
20589
+ }
20590
+ destroy() {
20591
+ this.cancel('destroy');
20592
+ this.keepBottomAnchor = false;
20593
+ this.rowDefinitionRemapQueued = false;
20594
+ this.pendingSourceCounts.clear();
20595
+ super.destroy();
20596
+ }
20597
+ }
20598
+
19839
20599
  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}`;
19840
20600
 
19841
20601
  const DEFAULT_COLUMN_SIZE = 100;
@@ -19926,7 +20686,12 @@ class RevoGridComponent {
19926
20686
  /** When true, grid in read only mode. */
19927
20687
  this.readonly = false;
19928
20688
  /** When true, columns are resizable. */
19929
- this.resize = false;
20689
+ this.resize = true;
20690
+ /**
20691
+ * Enables row resizing. Pass a configuration object to customize the
20692
+ * height limits or enable resize edges across the full row.
20693
+ */
20694
+ this.resizeRow = false;
19930
20695
  /**
19931
20696
  * Prevents horizontal scroll state from being mirrored across viewport sections.
19932
20697
  */
@@ -19997,15 +20762,15 @@ class RevoGridComponent {
19997
20762
  */
19998
20763
  this.autoSizeColumn = false;
19999
20764
  /**
20000
- * Enables filter plugin.
20765
+ * Enables filter plugin. Enabled by default; set to `false` to opt out.
20001
20766
  * Can be boolean.
20002
20767
  * Or can be filter collection See `FilterCollection` for more info.
20003
20768
  */
20004
- this.filter = false;
20769
+ this.filter = true;
20005
20770
  /**
20006
20771
  * Enable column move plugin.
20007
20772
  */
20008
- this.canMoveColumns = false;
20773
+ this.canMoveColumns = true;
20009
20774
  /**
20010
20775
  * Trimmed rows.
20011
20776
  * Functionality which allows to hide rows from main data set.
@@ -20015,7 +20780,7 @@ class RevoGridComponent {
20015
20780
  /**
20016
20781
  * Enable export plugin.
20017
20782
  */
20018
- this.exporting = false;
20783
+ this.exporting = true;
20019
20784
  /**
20020
20785
  * Stretch strategy for columns by `StretchColumn` plugin.
20021
20786
  * For example if there are more space on the right last column size would be increased.
@@ -20107,7 +20872,7 @@ class RevoGridComponent {
20107
20872
  var _a;
20108
20873
  if (this.dataProvider && this.columnProvider && !skipDataUpdate) {
20109
20874
  const columnProp = (_a = this.columnProvider.getColumn(col, colType)) === null || _a === void 0 ? void 0 : _a.prop;
20110
- if (typeof columnProp !== 'undefined') {
20875
+ if (columnProp !== undefined) {
20111
20876
  this.dataProvider.setCellData({
20112
20877
  type: rowType,
20113
20878
  rowIndex: row,
@@ -20703,29 +21468,31 @@ class RevoGridComponent {
20703
21468
  vals: after,
20704
21469
  oldVals: before,
20705
21470
  });
20706
- // apply new values
21471
+ this.dimensionProvider.syncRowDefinitions(newVal);
20707
21472
  const newRows = rowDefinitionByType(newVal);
20708
- // clear current defs
20709
- if (oldVal) {
20710
- const remove = rowDefinitionRemoveByType(oldVal);
20711
- // clear all old data and drop sizes
20712
- for (const t in remove) {
20713
- if (remove.hasOwnProperty(t)) {
20714
- const type = t;
20715
- const store = this.dataProvider.stores[type];
20716
- const sourceLength = store.store.get('source').length;
20717
- this.dimensionProvider.clearSize(type, sourceLength);
20718
- }
20719
- }
20720
- }
20721
- // set new sizes
21473
+ const oldRows = rowDefinitionByType(oldVal);
21474
+ const dataProvider = this.dataProvider;
21475
+ const dimensionProvider = this.dimensionProvider;
20722
21476
  rowTypes.forEach((t) => {
20723
- var _a;
20724
21477
  const newSizes = newRows[t];
20725
- // apply new sizes or force update
20726
- if (newSizes || forceUpdate) {
20727
- (_a = this.dimensionProvider) === null || _a === void 0 ? void 0 : _a.setCustomSizes(t, (newSizes === null || newSizes === void 0 ? void 0 : newSizes.sizes) || {});
21478
+ const oldSizes = oldRows[t];
21479
+ if (!newSizes && !oldSizes && !forceUpdate) {
21480
+ return;
20728
21481
  }
21482
+ const sizes = Object.assign({}, dimensionProvider.stores[t].store.get('sizes'));
21483
+ const definitionSizes = (newSizes === null || newSizes === void 0 ? void 0 : newSizes.sizes) || {};
21484
+ const previousDefinitionSizes = (oldSizes === null || oldSizes === void 0 ? void 0 : oldSizes.sizes) || {};
21485
+ const items = dataProvider.stores[t].store.get('items');
21486
+ items.forEach((physicalIndex, virtualIndex) => {
21487
+ if (Object.hasOwn(previousDefinitionSizes, physicalIndex) &&
21488
+ sizes[virtualIndex] === previousDefinitionSizes[physicalIndex]) {
21489
+ delete sizes[virtualIndex];
21490
+ }
21491
+ if (Object.hasOwn(definitionSizes, physicalIndex)) {
21492
+ sizes[virtualIndex] = definitionSizes[physicalIndex];
21493
+ }
21494
+ });
21495
+ dimensionProvider.setCustomSizes(t, sizes);
20729
21496
  });
20730
21497
  }
20731
21498
  trimmedRowsChanged(newVal = {}) {
@@ -20774,6 +21541,9 @@ class RevoGridComponent {
20774
21541
  rowHeadersChange(rowHeaders) {
20775
21542
  this.rowheaderschanged.emit(rowHeaders);
20776
21543
  }
21544
+ resizeRowChanged() {
21545
+ this.syncRowResizeConfig();
21546
+ }
20777
21547
  /**
20778
21548
  * Register external VNodes
20779
21549
  */
@@ -20796,6 +21566,7 @@ class RevoGridComponent {
20796
21566
  */
20797
21567
  pluginsChanged(plugins = [], prevPlugins) {
20798
21568
  this.pluginService.addUserPluginsAndCreate(this.element, plugins, prevPlugins, this.getPluginData());
21569
+ this.syncRowResizeConfig();
20799
21570
  }
20800
21571
  // #endregion
20801
21572
  // #region Plugins
@@ -20836,10 +21607,15 @@ class RevoGridComponent {
20836
21607
  this.pluginService.add(new SortingPlugin(this.element, pluginData));
20837
21608
  // register grouping plugin
20838
21609
  this.pluginService.add(new GroupingRowPlugin(this.element, pluginData));
21610
+ this.pluginService.add(new RowResizePlugin(this.element, pluginData));
20839
21611
  if (this.canMoveColumns) {
20840
21612
  this.pluginService.add(new ColumnMovePlugin(this.element, pluginData));
20841
21613
  }
20842
21614
  }
21615
+ syncRowResizeConfig() {
21616
+ const plugin = this.pluginService.getByClass(RowResizePlugin);
21617
+ plugin === null || plugin === void 0 ? void 0 : plugin.syncGridConfig();
21618
+ }
20843
21619
  getPluginData() {
20844
21620
  if (!this.dimensionProvider || !this.dataProvider || !this.columnProvider || !this.viewportProvider || !this.selectionStoreConnector) {
20845
21621
  return;
@@ -20882,6 +21658,9 @@ class RevoGridComponent {
20882
21658
  this.themeService.setDefinitions(this.themeDefinitions);
20883
21659
  this.dimensionProvider = new DimensionProvider(this.viewportProvider, {
20884
21660
  realSizeChanged: (k) => this.contentsizechanged.emit(k),
21661
+ rowDefinitionsChanged: definitions => {
21662
+ this.rowDefinitions = definitions;
21663
+ },
20885
21664
  });
20886
21665
  this.dimensionProvider.setSettings({ originItemSize: getColumnSize(this.colSize) }, 'rgCol');
20887
21666
  this.columnProvider = new ColumnDataProvider();
@@ -21072,6 +21851,9 @@ class RevoGridComponent {
21072
21851
  "rowHeaders": [{
21073
21852
  "rowHeadersChange": 0
21074
21853
  }],
21854
+ "resizeRow": [{
21855
+ "resizeRowChanged": 0
21856
+ }],
21075
21857
  "registerVNode": [{
21076
21858
  "registerOutsideVNodes": 0
21077
21859
  }],
@@ -21097,6 +21879,7 @@ class RevoGridComponent {
21097
21879
  "range": [4],
21098
21880
  "readonly": [4],
21099
21881
  "resize": [4],
21882
+ "resizeRow": [4, "resize-row"],
21100
21883
  "noHorizontalScrollTransfer": [4, "no-horizontal-scroll-transfer"],
21101
21884
  "canFocus": [4, "can-focus"],
21102
21885
  "useClipboard": [4, "use-clipboard"],
@@ -21335,7 +22118,7 @@ const CellRenderer = ({ renderProps, cellProps, }) => {
21335
22118
  return (hAsync("div", Object.assign({}, cellProps, { redraw: render }), render()));
21336
22119
  };
21337
22120
 
21338
- 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}`;
22121
+ 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}`;
21339
22122
 
21340
22123
  /**
21341
22124
  * This component is responsible for rendering data
@@ -21445,7 +22228,10 @@ class RevogrData {
21445
22228
  groupingCellRenderer, additionalData: this.additionalData,
21446
22229
  // Only show expand button if grouping is enabled and not in row headers
21447
22230
  hasExpand: this.columnService.hasGrouping && this.colType !== 'rowHeaders', columnItems: cols, providers: this.providers });
21448
- rowsEls.push(hAsync(GroupingRowRenderer, Object.assign({}, gmodel)));
22231
+ const row = hAsync(GroupingRowRenderer, Object.assign({}, gmodel));
22232
+ this.triggerBeforeRowRender(row, rgRow, dataItem);
22233
+ rowsEls.push(row);
22234
+ this.renderedRows.set(rgRow.itemIndex, row);
21449
22235
  continue;
21450
22236
  }
21451
22237
  // #endregion
@@ -21494,19 +22280,22 @@ class RevogrData {
21494
22280
  rowClass += ` ${ROW_FOCUSED_CLASS}`;
21495
22281
  }
21496
22282
  const row = (hAsync(RowRenderer, { index: rgRow.itemIndex, rowClass: rowClass, size: rgRow.size, start: rgRow.start - rowRenderOffset, groupingLevel: groupDepth || undefined }, cells));
21497
- this.beforerowrender.emit({
21498
- node: row,
21499
- item: rgRow,
21500
- model: dataItem,
21501
- colType: this.columnService.type,
21502
- rowType: this.type,
21503
- });
22283
+ this.triggerBeforeRowRender(row, rgRow, dataItem);
21504
22284
  rowsEls.push(row);
21505
22285
  this.renderedRows.set(rgRow.itemIndex, row);
21506
22286
  // #endregion
21507
22287
  }
21508
22288
  return (hAsync(Host, null, hAsync("slot", null), rowsEls));
21509
22289
  }
22290
+ triggerBeforeRowRender(node, item, model) {
22291
+ this.beforerowrender.emit({
22292
+ node,
22293
+ item,
22294
+ model,
22295
+ colType: this.colType,
22296
+ rowType: this.type,
22297
+ });
22298
+ }
21510
22299
  triggerBeforeCellRender(model, row, column) {
21511
22300
  const detail = {
21512
22301
  column,
@@ -21868,7 +22657,7 @@ const HeaderGroupRenderer = (p) => {
21868
22657
  return (hAsync(HeaderCellRenderer, { data: Object.assign(Object.assign({}, p.group), { prop: '', providers: p.providers, index: p.start }), props: groupProps, additionalData: p.additionalData }));
21869
22658
  };
21870
22659
 
21871
- 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}`;
22660
+ 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}`;
21872
22661
 
21873
22662
  class RevogrHeaderComponent {
21874
22663
  constructor(hostRef) {
@@ -22430,7 +23219,7 @@ class LocalScrollTimer {
22430
23219
  * Remember last mw event time
22431
23220
  */
22432
23221
  latestScrollUpdate(dimension) {
22433
- this.mouseWheelScrollTimestamp[dimension] = new Date().getTime();
23222
+ this.mouseWheelScrollTimestamp[dimension] = Date.now();
22434
23223
  }
22435
23224
  isReady(type, coordinate) {
22436
23225
  // if there is a callback, clear it
@@ -22441,7 +23230,7 @@ class LocalScrollTimer {
22441
23230
  return this.verifyChange(type, coordinate);
22442
23231
  }
22443
23232
  verifyChange(type, coordinate) {
22444
- const now = new Date().getTime();
23233
+ const now = Date.now();
22445
23234
  const change = now - this.mouseWheelScrollTimestamp[type];
22446
23235
  return change > this.scrollThrottling &&
22447
23236
  coordinate !== this.lastKnownScrollCoordinate[type];
@@ -22459,7 +23248,7 @@ class LocalScrollTimer {
22459
23248
  // save lastScrollUpdate callback
22460
23249
  const callback = this.lastScrollUpdateCallbacks[type] = {
22461
23250
  callback: lastScrollUpdate,
22462
- timestamp: new Date().getTime(),
23251
+ timestamp: Date.now(),
22463
23252
  coordinate,
22464
23253
  timeout: 0,
22465
23254
  };