@revolist/revogrid 4.26.2 → 4.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/dist/cjs/{cell-renderer-Cf2Pu4S0.js → cell-renderer-C7rdgaov.js} +3 -3
  2. package/dist/cjs/{column.service-C7p5eC5V.js → column.service-Bbml5C2j.js} +3 -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-BljFI6wj.js} +1 -1
  6. package/dist/cjs/{index--FdNLz1Z.js → index-BVESmpqW.js} +1 -1
  7. package/dist/cjs/index.cjs.js +71 -55
  8. package/dist/cjs/loader.cjs.js +1 -1
  9. package/dist/cjs/revo-grid.cjs.entry.js +74 -49
  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-BRQy_qNn.js} +573 -19
  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 +44 -10
  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.row.plugin.js +9 -2
  33. package/dist/collection/plugins/groupingRow/grouping.row.renderer.js +1 -1
  34. package/dist/collection/plugins/groupingRow/grouping.service.js +1 -1
  35. package/dist/collection/plugins/index.js +1 -0
  36. package/dist/collection/plugins/row-resize/index.js +6 -0
  37. package/dist/collection/plugins/row-resize/row-resize.plugin.js +385 -0
  38. package/dist/collection/plugins/row-resize/row-resize.types.js +1 -0
  39. package/dist/collection/plugins/row-resize/row-resize.utils.js +55 -0
  40. package/dist/collection/serve/controller.js +1 -1
  41. package/dist/collection/services/data.provider.js +8 -2
  42. package/dist/collection/services/local.scroll.timer.js +3 -3
  43. package/dist/collection/services/selection.store.connector.js +4 -2
  44. package/dist/collection/store/dataSource/data.pending.plugin.js +21 -0
  45. package/dist/collection/store/dataSource/data.store.js +25 -3
  46. package/dist/collection/store/dataSource/trimmed.plugin.js +9 -6
  47. package/dist/collection/store/dimension/dimension.trim.plugin.js +1 -3
  48. package/dist/collection/types/events.js +4 -1
  49. package/dist/collection/utils/column.utils.js +1 -1
  50. package/dist/esm/{cell-renderer-11cf-lu3.js → cell-renderer-BFpmdV8H.js} +3 -3
  51. package/dist/esm/{column.service-Cfw3L0PN.js → column.service-CM-wgGs8.js} +3 -3
  52. package/dist/{revo-grid/dimension.helpers-fl4HSSK9.js → esm/dimension.helpers-Cln9sALu.js} +52 -9
  53. package/dist/{revo-grid/edit.utils-4e9fsqOR.js → esm/edit.utils-3ZbhQCv_.js} +1 -1
  54. package/dist/esm/{header-cell-renderer-Cqtg1ETB.js → header-cell-renderer-Bqh1PrgH.js} +1 -1
  55. package/dist/esm/{index-D24ku9ej.js → index-BvMNbQyq.js} +1 -1
  56. package/dist/esm/index.js +14 -11
  57. package/dist/esm/loader.js +1 -1
  58. package/dist/esm/revo-grid.entry.js +56 -31
  59. package/dist/esm/revo-grid.js +1 -1
  60. package/dist/esm/revogr-attribution_7.entry.js +51 -19
  61. package/dist/esm/revogr-clipboard_3.entry.js +4 -4
  62. package/dist/esm/revogr-data_4.entry.js +21 -15
  63. package/dist/esm/revogr-filter-panel.entry.js +9 -9
  64. package/dist/esm/{column.drag.plugin-DDBKeTGI.js → row-resize.plugin-BRiaHlHA.js} +562 -20
  65. package/dist/{revo-grid/text-editor-DlMnLkRK.js → esm/text-editor-eHtrwvxH.js} +2 -2
  66. package/dist/{revo-grid/throttle-Cpk1LoGk.js → esm/throttle-3rhqdcLy.js} +3 -3
  67. package/dist/{revo-grid/viewport.store-BSXmsiZc.js → esm/viewport.store-DWMKRDSH.js} +1 -1
  68. package/dist/revo-grid/{cell-renderer-11cf-lu3.js → cell-renderer-BFpmdV8H.js} +3 -3
  69. package/dist/revo-grid/{column.service-Cfw3L0PN.js → column.service-CM-wgGs8.js} +3 -3
  70. package/dist/{esm/dimension.helpers-fl4HSSK9.js → revo-grid/dimension.helpers-Cln9sALu.js} +52 -9
  71. package/dist/{esm/edit.utils-4e9fsqOR.js → revo-grid/edit.utils-3ZbhQCv_.js} +1 -1
  72. package/dist/revo-grid/{header-cell-renderer-Cqtg1ETB.js → header-cell-renderer-Bqh1PrgH.js} +1 -1
  73. package/dist/revo-grid/{index-D24ku9ej.js → index-BvMNbQyq.js} +1 -1
  74. package/dist/revo-grid/index.esm.js +14 -11
  75. package/dist/revo-grid/revo-grid.entry.js +56 -31
  76. package/dist/revo-grid/revo-grid.esm.js +1 -1
  77. package/dist/revo-grid/revogr-attribution_7.entry.js +51 -19
  78. package/dist/revo-grid/revogr-clipboard_3.entry.js +4 -4
  79. package/dist/revo-grid/revogr-data_4.entry.js +21 -15
  80. package/dist/revo-grid/revogr-filter-panel.entry.js +9 -9
  81. package/dist/revo-grid/{column.drag.plugin-DDBKeTGI.js → row-resize.plugin-BRiaHlHA.js} +562 -20
  82. package/dist/{esm/text-editor-DlMnLkRK.js → revo-grid/text-editor-eHtrwvxH.js} +2 -2
  83. package/dist/{esm/throttle-Cpk1LoGk.js → revo-grid/throttle-3rhqdcLy.js} +3 -3
  84. package/dist/{esm/viewport.store-BSXmsiZc.js → revo-grid/viewport.store-DWMKRDSH.js} +1 -1
  85. package/dist/types/components/data/revogr-data.d.ts +1 -0
  86. package/dist/types/components/overlay/keyboard.service.d.ts +6 -0
  87. package/dist/types/components/overlay/revogr-overlay-selection.d.ts +3 -1
  88. package/dist/types/components/revoGrid/revo-grid.d.ts +7 -1
  89. package/dist/types/components/revoGrid/viewport.scrolling.service.d.ts +3 -1
  90. package/dist/types/components.d.ts +23 -10
  91. package/dist/types/plugins/filter/filter.constants.d.ts +6 -0
  92. package/dist/types/plugins/filter/filter.plugin.d.ts +15 -0
  93. package/dist/types/plugins/index.d.ts +1 -0
  94. package/dist/types/plugins/row-resize/index.d.ts +3 -0
  95. package/dist/types/plugins/row-resize/row-resize.plugin.d.ts +44 -0
  96. package/dist/types/plugins/row-resize/row-resize.types.d.ts +40 -0
  97. package/dist/types/plugins/row-resize/row-resize.utils.d.ts +14 -0
  98. package/dist/types/services/data.provider.d.ts +2 -0
  99. package/dist/types/store/dataSource/data.pending.plugin.d.ts +9 -0
  100. package/dist/types/store/dataSource/data.store.d.ts +10 -0
  101. package/dist/types/store/dataSource/trimmed.plugin.d.ts +5 -0
  102. package/dist/types/types/events.d.ts +1 -1
  103. package/dist/types/types/interfaces.d.ts +3 -1
  104. package/hydrate/index.js +734 -85
  105. package/hydrate/index.mjs +734 -85
  106. package/package.json +1 -1
  107. package/readme.md +4 -1
  108. package/standalone/column.service.js +1 -1
  109. package/standalone/data.store.js +1 -1
  110. package/standalone/dimension.helpers.js +1 -1
  111. package/standalone/index.js +1 -1
  112. package/standalone/local.scroll.timer.js +1 -1
  113. package/standalone/revo-grid.js +1 -1
  114. package/standalone/revogr-data2.js +1 -1
  115. package/standalone/revogr-filter-panel.js +1 -1
  116. package/standalone/revogr-header2.js +1 -1
  117. package/standalone/revogr-overlay-selection2.js +1 -1
  118. 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);
@@ -13196,7 +13237,7 @@ function isGrouping(rgRow) {
13196
13237
  return typeof (rgRow === null || rgRow === void 0 ? void 0 : rgRow[PSEUDO_GROUP_ITEM]) !== 'undefined';
13197
13238
  }
13198
13239
  function isGroupingColumn(column) {
13199
- return typeof (column === null || column === void 0 ? void 0 : column[PSEUDO_GROUP_COLUMN]) !== 'undefined';
13240
+ return (column === null || column === void 0 ? void 0 : column[PSEUDO_GROUP_COLUMN]) !== undefined;
13200
13241
  }
13201
13242
  function measureEqualDepth(groupA, groupB) {
13202
13243
  const ln = groupA.length;
@@ -13800,6 +13841,16 @@ const DIRECTION_CODES = [
13800
13841
  class KeyboardService {
13801
13842
  constructor(sv) {
13802
13843
  this.sv = sv;
13844
+ /** Keep focus transitions in keydown order so rendering can scroll each cell into view. */
13845
+ this.keyChangeQueue = Promise.resolve(false);
13846
+ this.keyChangeGeneration = 0;
13847
+ this.applyingKeyChange = false;
13848
+ }
13849
+ /** Cancel delayed directional input after focus or edit context changes externally. */
13850
+ invalidatePendingChanges() {
13851
+ if (!this.applyingKeyChange) {
13852
+ this.keyChangeGeneration += 1;
13853
+ }
13803
13854
  }
13804
13855
  /**
13805
13856
  * Appends printable key input that arrives after edit mode was requested
@@ -13902,13 +13953,33 @@ class KeyboardService {
13902
13953
  if (!data) {
13903
13954
  return false;
13904
13955
  }
13956
+ const keyChangeGeneration = this.keyChangeGeneration;
13905
13957
  // this interval needed for several cases
13906
13958
  // grid could be resized before next click
13907
13959
  // at this case to avoid screen jump we use this interval
13908
13960
  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);
13961
+ const applyKeyChange = async () => {
13962
+ if (keyChangeGeneration !== this.keyChangeGeneration) {
13963
+ return false;
13964
+ }
13965
+ const range = this.sv.selectionStore.get('range');
13966
+ const focus = this.sv.selectionStore.get('focus');
13967
+ this.applyingKeyChange = true;
13968
+ let changed;
13969
+ try {
13970
+ changed = this.keyPositionChange(data.changes, range, focus, data.isMulti);
13971
+ }
13972
+ finally {
13973
+ this.applyingKeyChange = false;
13974
+ }
13975
+ await new Promise(resolve => requestAnimationFrame(() => {
13976
+ requestAnimationFrame(() => resolve());
13977
+ }));
13978
+ return changed;
13979
+ };
13980
+ const queuedChange = this.keyChangeQueue.then(applyKeyChange, applyKeyChange);
13981
+ this.keyChangeQueue = queuedChange.catch(() => false);
13982
+ return queuedChange;
13912
13983
  }
13913
13984
  keyPositionChange(changes, range, focus, isMulti = false) {
13914
13985
  if (!range || !focus) {
@@ -14295,6 +14366,8 @@ class OverlaySelection {
14295
14366
  * Selection & Keyboard
14296
14367
  */
14297
14368
  selectionServiceSet(selectionStore) {
14369
+ var _a;
14370
+ (_a = this.keyboardService) === null || _a === void 0 ? void 0 : _a.invalidatePendingChanges();
14298
14371
  // clear subscriptions
14299
14372
  this.unsubscribeSelectionStore.forEach(v => v());
14300
14373
  this.unsubscribeSelectionStore.length = 0;
@@ -14322,6 +14395,7 @@ class OverlaySelection {
14322
14395
  getData: () => this.getData(),
14323
14396
  selectAll: () => this.selectAll.emit(),
14324
14397
  });
14398
+ 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
14399
  this.createAutoFillService();
14326
14400
  }
14327
14401
  /** Autofill */
@@ -14358,11 +14432,12 @@ class OverlaySelection {
14358
14432
  this.selectionServiceSet(this.selectionStore);
14359
14433
  }
14360
14434
  disconnectedCallback() {
14361
- var _a;
14435
+ var _a, _b;
14362
14436
  // clear subscriptions
14437
+ (_a = this.keyboardService) === null || _a === void 0 ? void 0 : _a.invalidatePendingChanges();
14363
14438
  this.unsubscribeSelectionStore.forEach(v => v());
14364
14439
  this.unsubscribeSelectionStore.length = 0;
14365
- (_a = this.columnService) === null || _a === void 0 ? void 0 : _a.destroy();
14440
+ (_b = this.columnService) === null || _b === void 0 ? void 0 : _b.destroy();
14366
14441
  }
14367
14442
  async componentWillRender() {
14368
14443
  var _a, _b;
@@ -14374,9 +14449,7 @@ class OverlaySelection {
14374
14449
  renderRange(range) {
14375
14450
  const cell = getCell(range, this.dimensionRow.state, this.dimensionCol.state);
14376
14451
  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
- ];
14452
+ 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
14453
  }
14381
14454
  renderEditor() {
14382
14455
  // Check if edit access
@@ -14429,7 +14502,7 @@ class OverlaySelection {
14429
14502
  }
14430
14503
  // Range
14431
14504
  if (range) {
14432
- nodes.push(...this.renderRange(range));
14505
+ nodes.push(this.renderRange(range));
14433
14506
  }
14434
14507
  // Autofill
14435
14508
  if (focus && !this.readonly && this.range) {
@@ -14440,9 +14513,9 @@ class OverlaySelection {
14440
14513
  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
14514
  }
14442
14515
  }
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),
14516
+ 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
14517
  // 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" })));
14518
+ onCelledit: (e) => this.onEditCell(e) }, nodes, hAsync("slot", { key: '47740a79c605258b4024384510358be927d000b7', name: "data" })));
14446
14519
  }
14447
14520
  /**
14448
14521
  * Executes the focus operation on the specified range of cells.
@@ -14639,12 +14712,12 @@ class OverlaySelection {
14639
14712
  clearCell() {
14640
14713
  var _a;
14641
14714
  const range = this.selectionStore.get('range');
14642
- if (range && !isRangeSingleCell(range)) {
14715
+ const focused = this.selectionStore.get('focus');
14716
+ if (range && (!isRangeSingleCell(range) || !focused)) {
14643
14717
  const data = this.columnService.getRangeStaticData(range, '');
14644
14718
  (_a = this.autoFillService) === null || _a === void 0 ? void 0 : _a.onRangeApply(data, range, range);
14645
14719
  }
14646
14720
  else if (this.canEdit()) {
14647
- const focused = this.selectionStore.get('focus');
14648
14721
  if (!focused) {
14649
14722
  return;
14650
14723
  }
@@ -15197,9 +15270,15 @@ class DataProvider {
15197
15270
  store.addTrimmed(trimmed);
15198
15271
  this.dimensionProvider.setTrimmed(trimmed, type);
15199
15272
  if (type === 'rgRow') {
15200
- this.dimensionProvider.setData(getVisibleSourceItem(store.store).length, type);
15273
+ this.dimensionProvider.setData(store.store.get('items').length, type);
15201
15274
  }
15202
15275
  }
15276
+ /** Keep a row source empty until its current asynchronous update is ready. */
15277
+ setItemsPending(pending, type = 'rgRow') {
15278
+ const store = this.stores[type];
15279
+ store.setItemsPending(pending);
15280
+ this.dimensionProvider.setData(store.store.get('items').length, type, type !== 'rgRow');
15281
+ }
15203
15282
  }
15204
15283
 
15205
15284
  const FALLBACK_MAX_SCROLL_SIZE = 16000000;
@@ -16315,6 +16394,13 @@ const filterNames = {
16315
16394
  lte: '<=',
16316
16395
  };
16317
16396
 
16397
+ /** Fewer rows keep the existing synchronous filtering behavior. */
16398
+ const ASYNC_FILTER_ROW_THRESHOLD = 15000;
16399
+ /** Maximum rows evaluated in one filtering chunk. */
16400
+ const FILTER_CHUNK_SIZE = 1000;
16401
+ /** Yield after approximately this much accumulated filtering work. */
16402
+ const FILTER_TIME_BUDGET_MS = 5;
16403
+
16318
16404
  // filter.plugin.tsx
16319
16405
  const FILTER_TRIMMED_TYPE = 'filter';
16320
16406
  const FILTER_CONFIG_CHANGED_EVENT = 'filterconfigchanged';
@@ -16359,6 +16445,7 @@ class FilterPlugin extends BasePlugin {
16359
16445
  this.filterFunctionsIndexedByType = Object.assign({}, filterCoreFunctionsIndexedByType);
16360
16446
  this.filterProp = FILTER_PROP;
16361
16447
  this.allowDuplicateOperators = true;
16448
+ this.filteringRunId = 0;
16362
16449
  if (config) {
16363
16450
  this.initConfig(config);
16364
16451
  }
@@ -16367,7 +16454,7 @@ class FilterPlugin extends BasePlugin {
16367
16454
  ...existingNodes,
16368
16455
  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
16456
  ];
16370
- const aftersourceset = async () => {
16457
+ const aftersourceset = () => {
16371
16458
  const filterCollectionProps = Object.keys(this.filterCollection);
16372
16459
  if (filterCollectionProps.length > 0) {
16373
16460
  // handle old way of filtering by reworking FilterCollection to new MultiFilterItem
@@ -16384,12 +16471,26 @@ class FilterPlugin extends BasePlugin {
16384
16471
  }
16385
16472
  });
16386
16473
  }
16387
- if (Object.keys(this.multiFilterItems).length === 0) {
16474
+ if (!this.hasActiveFilters()) {
16475
+ this.cancelFiltering();
16388
16476
  return;
16389
16477
  }
16390
- await timeout();
16391
- await this.runFiltering(this.multiFilterItems);
16478
+ void this.runFiltering(this.multiFilterItems);
16392
16479
  };
16480
+ /**
16481
+ * This executes before the data store replaces its source.
16482
+ * For a large source with active filters:
16483
+ * 1. Existing filtering runs are invalidated.
16484
+ * 2. Pending state starts.
16485
+ * 3. Visible rows become empty.
16486
+ * 4. The source is replaced while the DataStore guard prevents it from exposing unfiltered rows.
16487
+ */
16488
+ this.addEventListener('beforesourceset', ({ detail }) => {
16489
+ if (detail.source.length >= ASYNC_FILTER_ROW_THRESHOLD &&
16490
+ this.hasActiveFilters()) {
16491
+ this.deferFiltering();
16492
+ }
16493
+ });
16393
16494
  this.addEventListener('headerclick', e => this.headerclick(e));
16394
16495
  this.addEventListener(FILTER_CONFIG_CHANGED_EVENT, ({ detail }) => {
16395
16496
  if (!detail) {
@@ -16550,7 +16651,7 @@ class FilterPlugin extends BasePlugin {
16550
16651
  // store the filter items
16551
16652
  this.multiFilterItems = filterItems;
16552
16653
  // run the filtering when the items change
16553
- this.runFiltering(this.multiFilterItems);
16654
+ await this.runFiltering(this.multiFilterItems);
16554
16655
  }
16555
16656
  onFilterReset(prop) {
16556
16657
  delete this.multiFilterItems[prop !== null && prop !== void 0 ? prop : ''];
@@ -16560,6 +16661,8 @@ class FilterPlugin extends BasePlugin {
16560
16661
  * Triggers grid filtering
16561
16662
  */
16562
16663
  async doFiltering(collection, source, columns, filterItems) {
16664
+ // creates the execution token - owns the actual calculation
16665
+ const runId = this.beginFiltering();
16563
16666
  const columnsToUpdate = [];
16564
16667
  /**
16565
16668
  * Loop through the columns and update the columns that need to be updated with the `hasFilter` property.
@@ -16584,7 +16687,25 @@ class FilterPlugin extends BasePlugin {
16584
16687
  column[this.filterProp] = true;
16585
16688
  }
16586
16689
  });
16587
- const itemsToTrim = this.getRowFilter(source, filterItems, columnByProp);
16690
+ let itemsToTrim;
16691
+ const hasFilters = Object.keys(filterItems).length > 0 || this.hasActiveFilters();
16692
+ const isLargeSource = hasFilters && source.length >= ASYNC_FILTER_ROW_THRESHOLD;
16693
+ if (isLargeSource) {
16694
+ this.providers.data.setItemsPending(true);
16695
+ await timeout();
16696
+ }
16697
+ if (!hasFilters) {
16698
+ itemsToTrim = {};
16699
+ }
16700
+ else if (isLargeSource && this.supportsChunkedFiltering()) {
16701
+ itemsToTrim = await this.getRowFilterInChunks(source, filterItems, columnByProp, runId);
16702
+ }
16703
+ else {
16704
+ itemsToTrim = this.getRowFilter(source, filterItems, columnByProp);
16705
+ }
16706
+ if (!itemsToTrim || runId !== this.filteringRunId) {
16707
+ return;
16708
+ }
16588
16709
  // check is filter event prevented
16589
16710
  const { defaultPrevented, detail } = this.emit('beforefiltertrimmed', {
16590
16711
  collection,
@@ -16592,10 +16713,12 @@ class FilterPlugin extends BasePlugin {
16592
16713
  source,
16593
16714
  filterItems,
16594
16715
  });
16595
- if (defaultPrevented) {
16716
+ if (defaultPrevented || runId !== this.filteringRunId) {
16717
+ this.releaseFiltering(runId);
16596
16718
  return;
16597
16719
  }
16598
16720
  this.providers.data.setTrimmed({ [FILTER_TRIMMED_TYPE]: detail.itemsToFilter });
16721
+ this.releaseFiltering(runId);
16599
16722
  // applies the hasFilter to the columns to show filter icon
16600
16723
  this.providers.column.updateColumns(columnsToUpdate);
16601
16724
  this.emit('afterfilterapply', {
@@ -16609,6 +16732,10 @@ class FilterPlugin extends BasePlugin {
16609
16732
  await this.runFiltering(this.multiFilterItems);
16610
16733
  }
16611
16734
  async runFiltering(multiFilterItems) {
16735
+ // runFiltering: First token: "Is this request still valid after event handlers run?"
16736
+ // doFiltering: Second token: "Is this calculation still the newest one?"
16737
+ // creates a preflight token and sets the grid to a pending state
16738
+ const runId = this.beginFiltering();
16612
16739
  const collection = {};
16613
16740
  // handle old filterCollection to return the first filter only (if any) from multiFilterItems
16614
16741
  const filterProps = Object.keys(multiFilterItems);
@@ -16632,10 +16759,67 @@ class FilterPlugin extends BasePlugin {
16632
16759
  columns,
16633
16760
  filterItems: this.multiFilterItems,
16634
16761
  });
16635
- if (defaultPrevented) {
16762
+ if (defaultPrevented || runId !== this.filteringRunId) {
16763
+ this.releaseFiltering(runId);
16636
16764
  return;
16637
16765
  }
16638
- this.doFiltering(detail.collection, detail.source, detail.columns, detail.filterItems);
16766
+ await this.doFiltering(detail.collection, detail.source, detail.columns, detail.filterItems);
16767
+ }
16768
+ /** Whether this plugin currently owns filter state that must follow a new source. */
16769
+ hasActiveFilters() {
16770
+ return (Object.keys(this.multiFilterItems).length > 0 ||
16771
+ Object.keys(this.filterCollection).length > 0);
16772
+ }
16773
+ /** Preserve whole-source semantics for plugins that override getRowFilter. */
16774
+ supportsChunkedFiltering() {
16775
+ return this.getRowFilter === FilterPlugin.prototype.getRowFilter;
16776
+ }
16777
+ /**
16778
+ * Hide visible rows and invalidate current filtering until a deferred filter
16779
+ * run is ready. Used by filter extensions with their own debounced state.
16780
+ */
16781
+ deferFiltering() {
16782
+ this.beginFiltering(true);
16783
+ }
16784
+ beginFiltering(pending = false) {
16785
+ const runId = ++this.filteringRunId;
16786
+ if (pending) {
16787
+ this.providers.data.setItemsPending(true);
16788
+ }
16789
+ return runId;
16790
+ }
16791
+ releaseFiltering(runId) {
16792
+ if (runId === this.filteringRunId) {
16793
+ this.providers.data.setItemsPending(false);
16794
+ }
16795
+ }
16796
+ cancelFiltering() {
16797
+ this.releaseFiltering(this.beginFiltering());
16798
+ }
16799
+ async getRowFilterInChunks(rows, filterItems, columnByProp, runId) {
16800
+ const trimmed = {};
16801
+ let sliceStarted = performance.now();
16802
+ for (let offset = 0; offset < rows.length; offset += FILTER_CHUNK_SIZE) {
16803
+ if (runId !== this.filteringRunId) {
16804
+ return;
16805
+ }
16806
+ const end = Math.min(offset + FILTER_CHUNK_SIZE, rows.length);
16807
+ const chunkTrimmed = this.getRowFilter(rows.slice(offset, end), filterItems, columnByProp);
16808
+ // filter that chunk
16809
+ for (const chunkIndex in chunkTrimmed) {
16810
+ trimmed[offset + Number(chunkIndex)] = true;
16811
+ }
16812
+ if (end < rows.length &&
16813
+ performance.now() - sliceStarted >= FILTER_TIME_BUDGET_MS) {
16814
+ await timeout();
16815
+ sliceStarted = performance.now();
16816
+ }
16817
+ }
16818
+ return runId === this.filteringRunId ? trimmed : undefined;
16819
+ }
16820
+ destroy() {
16821
+ this.cancelFiltering();
16822
+ super.destroy();
16639
16823
  }
16640
16824
  /**
16641
16825
  * Get trimmed rows based on filter
@@ -17910,7 +18094,7 @@ const GroupingRowRenderer = (props) => {
17910
18094
  depth })))));
17911
18095
  }
17912
18096
  return (hAsync(RowRenderer, Object.assign({}, props, groupRowAttrs), hasExpand && [
17913
- hAsync("button", { class: { [GROUP_EXPAND_BTN]: true }, onClick: e => expandEvent(e, model, itemIndex) }, expandSvgIconVNode(expanded)),
18097
+ hAsync("button", { type: "button", class: { [GROUP_EXPAND_BTN]: true }, onClick: e => expandEvent(e, model, itemIndex) }, expandSvgIconVNode(expanded)),
17914
18098
  String(name),
17915
18099
  ]));
17916
18100
  };
@@ -18070,7 +18254,7 @@ class GroupingRowPlugin extends BasePlugin {
18070
18254
  customRenderer: options.groupLabelTemplate,
18071
18255
  cellRenderer: options.groupCellTemplate,
18072
18256
  });
18073
- this.updateTrimmed(trimmed, oldNewIndexMap, undefined, sourceWithGroups);
18257
+ this.updateTrimmed(trimmed, oldNewIndexMap, undefined, sourceWithGroups, { filterTrimmedMode: 'recompute-after-source-set' });
18074
18258
  }
18075
18259
  /**
18076
18260
  * External call to apply grouping. Called by revogrid when prop changed.
@@ -18170,10 +18354,17 @@ class GroupingRowPlugin extends BasePlugin {
18170
18354
  this.providers.data.setData(source, GROUPING_ROW_TYPE, this.revogrid.disableVirtualY, undefined, true);
18171
18355
  this.updateTrimmed(undefined, undefined, oldNewIndexes, source);
18172
18356
  }
18173
- updateTrimmed(trimmedGroup = {}, firstLevelMap = {}, secondLevelMap, source = this.getStore().get('source')) {
18357
+ updateTrimmed(trimmedGroup = {}, firstLevelMap = {}, secondLevelMap, source = this.getStore().get('source'), { filterTrimmedMode = 'remap', } = {}) {
18174
18358
  // map previously trimmed data
18175
18359
  const trimemedOptionsToUpgrade = processDoubleConversionTrimmed(this.getStore().get('trimmed'), firstLevelMap, secondLevelMap);
18176
18360
  for (let type in trimemedOptionsToUpgrade) {
18361
+ if (filterTrimmedMode === 'recompute-after-source-set' &&
18362
+ type === FILTER_TRIMMED_TYPE) {
18363
+ // The filter plugin recalculates this trim against the installed source
18364
+ // during aftersourceset. Reapplying remapped old indexes afterwards
18365
+ // would overwrite that fresh result.
18366
+ continue;
18367
+ }
18177
18368
  if (type === FILTER_TRIMMED_TYPE) {
18178
18369
  /** Regrouping changes physical indexes, so filter trim needs fresh group-header state. */
18179
18370
  trimemedOptionsToUpgrade[type] = filterOutEmptyGroupRows(source, trimemedOptionsToUpgrade[type]);
@@ -18344,7 +18535,7 @@ class ViewportService {
18344
18535
  const changedItems = {};
18345
18536
  for (const i of Object.keys(detail || {})) {
18346
18537
  const size = detail[i];
18347
- const virtualIndex = parseInt(i, 10);
18538
+ const virtualIndex = Number.parseInt(i, 10);
18348
18539
  const item = getSourceItem(store, virtualIndex);
18349
18540
  if (item) {
18350
18541
  changedItems[virtualIndex] = Object.assign(Object.assign({}, item), { size });
@@ -18473,29 +18664,25 @@ class GridScrollingService {
18473
18664
  this.elements = {};
18474
18665
  }
18475
18666
  async proxyScroll(e, key, skipEvent) {
18476
- var _a;
18477
18667
  let newEventPromise;
18478
18668
  let event = e;
18479
- for (let elKey in (skipEvent ? {} : this.elements)) {
18669
+ for (const elKey in (skipEvent ? {} : this.elements)) {
18480
18670
  // skip
18481
18671
  if (e.dimension === 'rgCol' && elKey === 'headerRow') {
18482
18672
  continue;
18483
18673
  // pinned column only
18484
18674
  }
18485
- else if (this.isPinnedColumn(key) && e.dimension === 'rgCol') {
18675
+ if (this.isPinnedColumn(key) && e.dimension === 'rgCol') {
18486
18676
  if (elKey === key || !e.delta) {
18487
18677
  continue;
18488
18678
  }
18489
- for (let el of this.elements[elKey]) {
18490
- if (el.changeScroll) {
18491
- newEventPromise = el.changeScroll(e);
18492
- }
18679
+ const changedEvent = this.changeScroll(this.elements[elKey], e);
18680
+ if (changedEvent) {
18681
+ newEventPromise = changedEvent;
18493
18682
  }
18494
18683
  }
18495
18684
  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
- }
18685
+ await this.setScroll(this.elements[elKey], e);
18499
18686
  }
18500
18687
  }
18501
18688
  const newEvent = await newEventPromise;
@@ -18505,12 +18692,27 @@ class GridScrollingService {
18505
18692
  this.setViewport(skipEvent && this.isPinnedColumn(key)
18506
18693
  ? Object.assign(Object.assign({}, event), { dimension: key }) : event);
18507
18694
  }
18695
+ changeScroll(elements, e) {
18696
+ let changedEvent;
18697
+ for (const element of elements) {
18698
+ if (element.changeScroll) {
18699
+ changedEvent = element.changeScroll(e);
18700
+ }
18701
+ }
18702
+ return changedEvent;
18703
+ }
18704
+ async setScroll(elements, e) {
18705
+ var _a;
18706
+ for (const element of elements) {
18707
+ await ((_a = element.setScroll) === null || _a === void 0 ? void 0 : _a.call(element, e));
18708
+ }
18709
+ }
18508
18710
  /**
18509
18711
  * Silent scroll update for mobile devices when we have negative scroll top
18510
18712
  */
18511
18713
  async scrollSilentService(e, key) {
18512
18714
  var _a;
18513
- for (let elKey in this.elements) {
18715
+ for (const elKey in this.elements) {
18514
18716
  // skip same element update
18515
18717
  if (elKey === key) {
18516
18718
  continue;
@@ -18518,7 +18720,7 @@ class GridScrollingService {
18518
18720
  if (columnTypes.includes(key) &&
18519
18721
  (elKey === 'headerRow' ||
18520
18722
  columnTypes.includes(elKey))) {
18521
- for (let el of this.elements[elKey]) {
18723
+ for (const el of this.elements[elKey]) {
18522
18724
  await ((_a = el.changeScroll) === null || _a === void 0 ? void 0 : _a.call(el, e, true));
18523
18725
  }
18524
18726
  continue;
@@ -18526,7 +18728,7 @@ class GridScrollingService {
18526
18728
  }
18527
18729
  }
18528
18730
  isPinnedColumn(key) {
18529
- return !!key && ['colPinStart', 'colPinEnd'].indexOf(key) > -1;
18731
+ return !!key && ['colPinStart', 'colPinEnd'].includes(key);
18530
18732
  }
18531
18733
  registerElements(els) {
18532
18734
  this.elements = els;
@@ -18807,9 +19009,11 @@ class SelectionStoreConnector {
18807
19009
  continue;
18808
19010
  }
18809
19011
  const lastCell = store.store.get('lastCell');
18810
- if (lastCell) {
18811
- store.setRange({ x: 0, y: 0 }, { x: lastCell.x - 1, y: lastCell.y - 1 });
19012
+ if (!lastCell || lastCell.x <= 0 || lastCell.y <= 0) {
19013
+ store.setRangeArea(null);
19014
+ continue;
18812
19015
  }
19016
+ store.setRange({ x: 0, y: 0 }, { x: lastCell.x - 1, y: lastCell.y - 1 });
18813
19017
  }
18814
19018
  }
18815
19019
  }
@@ -19684,7 +19888,7 @@ class PluginService {
19684
19888
  return;
19685
19889
  }
19686
19890
  // 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))) || [];
19891
+ const pluginsToRemove = (prevPlugins === null || prevPlugins === void 0 ? void 0 : prevPlugins.filter(prevPlugin => !plugins.includes(prevPlugin))) || [];
19688
19892
  // Step 2: Remove old plugins
19689
19893
  pluginsToRemove.forEach(plugin => {
19690
19894
  var _a, _b;
@@ -19697,7 +19901,7 @@ class PluginService {
19697
19901
  // Step 3: Register user plugins
19698
19902
  plugins === null || plugins === void 0 ? void 0 : plugins.forEach(userPlugin => {
19699
19903
  // check if plugin already exists, if so, skip
19700
- const existingPlugin = this.internalPlugins.find(createdPlugin => createdPlugin instanceof userPlugin);
19904
+ const existingPlugin = this.internalPlugins.some(createdPlugin => createdPlugin instanceof userPlugin);
19701
19905
  if (existingPlugin) {
19702
19906
  return;
19703
19907
  }
@@ -19836,6 +20040,438 @@ class RTLPlugin extends BasePlugin {
19836
20040
  }
19837
20041
  }
19838
20042
 
20043
+ const DEFAULT_MIN_ROW_HEIGHT = 20;
20044
+ const finiteNumber = (value) => typeof value === 'number' && Number.isFinite(value);
20045
+ function resolveRowResizeConfig(config = {}) {
20046
+ const minHeight = finiteNumber(config.minHeight)
20047
+ ? Math.max(1, Math.round(config.minHeight))
20048
+ : DEFAULT_MIN_ROW_HEIGHT;
20049
+ const maxHeight = finiteNumber(config.maxHeight)
20050
+ ? Math.max(minHeight, Math.round(config.maxHeight))
20051
+ : undefined;
20052
+ return { minHeight, maxHeight, fullRow: config.fullRow === true };
20053
+ }
20054
+ function clampRowResizeHeight(height, config) {
20055
+ var _a;
20056
+ const rounded = Number.isFinite(height)
20057
+ ? Math.round(height)
20058
+ : config.minHeight;
20059
+ return Math.min(Math.max(rounded, config.minHeight), (_a = config.maxHeight) !== null && _a !== void 0 ? _a : Number.POSITIVE_INFINITY);
20060
+ }
20061
+ function getRowResizeIndexes({ rowType, rowIndex, rowCount, selectedRange, selectedRowType, }) {
20062
+ if (!selectedRange ||
20063
+ selectedRowType !== rowType ||
20064
+ rowIndex < Math.min(selectedRange.y, selectedRange.y1) ||
20065
+ rowIndex > Math.max(selectedRange.y, selectedRange.y1)) {
20066
+ return rowIndex >= 0 && rowIndex < rowCount ? [rowIndex] : [];
20067
+ }
20068
+ const start = Math.max(0, Math.min(selectedRange.y, selectedRange.y1));
20069
+ const end = Math.min(rowCount - 1, Math.max(selectedRange.y, selectedRange.y1));
20070
+ return Array.from({ length: Math.max(0, end - start + 1) }, (_, i) => start + i);
20071
+ }
20072
+ function createRowResizePatch(indexes, size) {
20073
+ return indexes.reduce((patch, index) => {
20074
+ patch[index] = size;
20075
+ return patch;
20076
+ }, {});
20077
+ }
20078
+ function mergeRowResizeDefinitions(definitions, rowType, physicalIndexes, size) {
20079
+ const targetIndexes = new Set(physicalIndexes);
20080
+ const existingIndexes = new Set();
20081
+ const merged = definitions.map(definition => {
20082
+ if (definition.type !== rowType || !targetIndexes.has(definition.index)) {
20083
+ return definition;
20084
+ }
20085
+ existingIndexes.add(definition.index);
20086
+ return Object.assign(Object.assign({}, definition), { size });
20087
+ });
20088
+ for (const index of targetIndexes) {
20089
+ if (!existingIndexes.has(index)) {
20090
+ merged.push({ type: rowType, index, size });
20091
+ }
20092
+ }
20093
+ return merged;
20094
+ }
20095
+
20096
+ const ROW_RESIZE_HANDLE_CLASS = 'row-resize-handle';
20097
+ const BEFORE_ROW_RESIZE_EVENT = 'beforerowresize';
20098
+ const ROW_RESIZE_EVENT = 'rowresize';
20099
+ const AFTER_ROW_RESIZE_EVENT = 'afterrowresize';
20100
+ const ROW_RESIZE_CANCEL_EVENT = 'rowresizecancel';
20101
+ class RowResizePlugin extends BasePlugin {
20102
+ static fromGridProperty(revogrid, providers) {
20103
+ const plugin = new RowResizePlugin(revogrid, providers);
20104
+ plugin.controlFromGridProperty();
20105
+ return plugin;
20106
+ }
20107
+ constructor(revogrid, providers, config = {}) {
20108
+ super(revogrid, providers);
20109
+ this.enabled = false;
20110
+ this.gridResizeRow = false;
20111
+ this.gridPlugins = [];
20112
+ this.committedSizes = new Map();
20113
+ this.appliedIndexes = new Map();
20114
+ this.previousBodyCursor = '';
20115
+ this.decorateRow = ({ detail, }) => {
20116
+ if (!this.enabled ||
20117
+ (detail.colType !== 'rowHeaders' && !this.config.fullRow)) {
20118
+ return;
20119
+ }
20120
+ const handle = this.h('div', {
20121
+ 'key': `row-resize-${detail.rowType}-${detail.item.itemIndex}`,
20122
+ 'class': { [ROW_RESIZE_HANDLE_CLASS]: true },
20123
+ 'data-row-resize-index': detail.item.itemIndex,
20124
+ 'aria-hidden': 'true',
20125
+ 'onPointerDown': (event) => this.startResize(event, detail.rowType, detail.item.itemIndex),
20126
+ });
20127
+ detail.node.$children$ = [...(detail.node.$children$ || []), handle];
20128
+ };
20129
+ this.cancelForDataChange = () => this.cancel('data-change');
20130
+ this.onPointerMove = (event) => {
20131
+ const active = this.active;
20132
+ if ((active === null || active === void 0 ? void 0 : active.pointerId) !== event.pointerId) {
20133
+ return;
20134
+ }
20135
+ event.preventDefault();
20136
+ active.lastEvent = event;
20137
+ this.pendingHeight = clampRowResizeHeight(active.startHeight + event.clientY - active.startY, this.config);
20138
+ if (this.animationFrame === undefined) {
20139
+ const view = this.revogrid.ownerDocument.defaultView;
20140
+ this.animationFrame = view === null || view === void 0 ? void 0 : view.requestAnimationFrame(() => {
20141
+ this.animationFrame = undefined;
20142
+ this.flushPendingResize();
20143
+ });
20144
+ }
20145
+ };
20146
+ this.onPointerUp = (event) => {
20147
+ const active = this.active;
20148
+ if ((active === null || active === void 0 ? void 0 : active.pointerId) !== event.pointerId) {
20149
+ return;
20150
+ }
20151
+ event.preventDefault();
20152
+ active.lastEvent = event;
20153
+ this.pendingHeight = clampRowResizeHeight(active.startHeight + event.clientY - active.startY, this.config);
20154
+ this.flushPendingResize();
20155
+ if (this.active !== active) {
20156
+ return;
20157
+ }
20158
+ const detail = this.eventDetail(active, event, active.currentHeight);
20159
+ this.finishGesture();
20160
+ this.commitResize(active);
20161
+ this.emit(AFTER_ROW_RESIZE_EVENT, detail);
20162
+ };
20163
+ this.onPointerCancel = (event) => {
20164
+ var _a;
20165
+ if (((_a = this.active) === null || _a === void 0 ? void 0 : _a.pointerId) === event.pointerId) {
20166
+ this.active.lastEvent = event;
20167
+ this.cancel('pointercancel');
20168
+ }
20169
+ };
20170
+ this.onKeyDown = (event) => {
20171
+ if (event.key === 'Escape' && this.active) {
20172
+ event.preventDefault();
20173
+ this.cancel('escape');
20174
+ }
20175
+ };
20176
+ this.onWindowBlur = () => this.cancel('blur');
20177
+ this.reapplyCommittedSizes = () => this.applyCommittedSizes(false);
20178
+ this.rebuildCommittedSizes = () => this.applyCommittedSizes(true);
20179
+ this.syncAppliedIndexes = () => {
20180
+ for (const [rowType, committed] of this.committedSizes) {
20181
+ const items = this.providers.data.stores[rowType].store.get('items');
20182
+ const indexes = new Set();
20183
+ items.forEach((physicalIndex, virtualIndex) => {
20184
+ if (committed.has(physicalIndex)) {
20185
+ indexes.add(virtualIndex);
20186
+ }
20187
+ });
20188
+ this.appliedIndexes.set(rowType, indexes);
20189
+ }
20190
+ };
20191
+ this.config = resolveRowResizeConfig(config);
20192
+ this.rowDefinitionsRef = revogrid.rowDefinitions;
20193
+ if (new.target !== RowResizePlugin) {
20194
+ this.enabled = true;
20195
+ this.registerEventListeners();
20196
+ }
20197
+ }
20198
+ registerEventListeners() {
20199
+ this.addEventListener('beforerowrender', this.decorateRow);
20200
+ this.addEventListener('beforeanysource', ({ detail }) => {
20201
+ this.cancel('data-change');
20202
+ const committed = this.committedSizes.get(detail.type);
20203
+ if (!committed) {
20204
+ return;
20205
+ }
20206
+ const removedIndexes = new Set();
20207
+ for (const index of committed.keys()) {
20208
+ if (index >= detail.source.length) {
20209
+ committed.delete(index);
20210
+ removedIndexes.add(index);
20211
+ }
20212
+ }
20213
+ if (removedIndexes.size) {
20214
+ const rowDefinitions = this.revogrid.rowDefinitions.filter(definition => definition.type !== detail.type ||
20215
+ !removedIndexes.has(definition.index));
20216
+ this.rowDefinitionsRef = rowDefinitions;
20217
+ this.revogrid.rowDefinitions = rowDefinitions;
20218
+ }
20219
+ });
20220
+ this.addEventListener('afteranysource', this.rebuildCommittedSizes);
20221
+ this.addEventListener('beforesourcesortingapply', this.cancelForDataChange);
20222
+ this.addEventListener('aftersortingapply', this.reapplyCommittedSizes);
20223
+ this.addEventListener('beforefilterapply', this.cancelForDataChange);
20224
+ this.addEventListener('beforerowdefinition', ({ detail }) => {
20225
+ this.cancel('data-change');
20226
+ if (detail.vals !== this.rowDefinitionsRef) {
20227
+ this.committedSizes.clear();
20228
+ this.appliedIndexes.clear();
20229
+ this.rowDefinitionsRef = detail.vals;
20230
+ }
20231
+ });
20232
+ this.addEventListener('afterthemechanged', this.reapplyCommittedSizes);
20233
+ this.addEventListener('aftertrimmed', this.syncAppliedIndexes);
20234
+ this.addEventListener('roworderchange', () => {
20235
+ queueMicrotask(this.reapplyCommittedSizes);
20236
+ });
20237
+ this.addEventListener(GROUP_EXPAND_EVENT, () => {
20238
+ queueMicrotask(this.reapplyCommittedSizes);
20239
+ });
20240
+ this.addEventListener('rowheaderschanged', ({ detail }) => {
20241
+ if (!detail && !this.config.fullRow) {
20242
+ this.cancel('row-headers-hidden');
20243
+ }
20244
+ });
20245
+ }
20246
+ controlFromGridProperty() {
20247
+ this.gridResizeRow = this.revogrid.resizeRow;
20248
+ this.gridPlugins = this.revogrid.plugins;
20249
+ this.syncGridProperty(false);
20250
+ this.watch('resizeRow', value => {
20251
+ this.gridResizeRow = value;
20252
+ this.syncGridProperty();
20253
+ });
20254
+ this.watch('plugins', value => {
20255
+ this.gridPlugins = value || [];
20256
+ this.syncGridProperty();
20257
+ });
20258
+ }
20259
+ syncGridProperty(refresh = true) {
20260
+ const hasConfiguredPlugin = this.gridPlugins.some(plugin => plugin !== RowResizePlugin &&
20261
+ plugin.prototype instanceof RowResizePlugin);
20262
+ const explicitlyEnabled = this.gridPlugins.includes(RowResizePlugin);
20263
+ const enabled = hasConfiguredPlugin
20264
+ ? false
20265
+ : explicitlyEnabled || !!this.gridResizeRow;
20266
+ const config = resolveRowResizeConfig(!hasConfiguredPlugin &&
20267
+ !explicitlyEnabled &&
20268
+ typeof this.gridResizeRow === 'object'
20269
+ ? this.gridResizeRow
20270
+ : undefined);
20271
+ const configChanged = config.minHeight !== this.config.minHeight ||
20272
+ config.maxHeight !== this.config.maxHeight ||
20273
+ config.fullRow !== this.config.fullRow;
20274
+ if (enabled === this.enabled && !configChanged) {
20275
+ return;
20276
+ }
20277
+ this.cancel('config-change');
20278
+ this.config = config;
20279
+ if (enabled !== this.enabled) {
20280
+ this.enabled = enabled;
20281
+ if (enabled) {
20282
+ this.rowDefinitionsRef = this.revogrid.rowDefinitions;
20283
+ this.registerEventListeners();
20284
+ }
20285
+ else {
20286
+ this.clearSubscriptions();
20287
+ }
20288
+ }
20289
+ if (refresh) {
20290
+ queueMicrotask(() => void this.revogrid.refresh());
20291
+ }
20292
+ }
20293
+ startResize(event, rowType, index) {
20294
+ var _a, _b;
20295
+ if (!this.enabled ||
20296
+ this.active ||
20297
+ event.defaultPrevented ||
20298
+ !event.isPrimary ||
20299
+ (event.pointerType !== 'touch' && event.button !== 0)) {
20300
+ return;
20301
+ }
20302
+ const dimension = this.providers.dimension.stores[rowType];
20303
+ const dimensionState = dimension.getCurrentState();
20304
+ const item = getItemByIndex(dimensionState, index);
20305
+ const focusedStore = this.providers.selection.focusedStore;
20306
+ const selectedRowType = focusedStore
20307
+ ? this.providers.selection.storesYToType[focusedStore.position.y]
20308
+ : undefined;
20309
+ const indexes = getRowResizeIndexes({
20310
+ rowType,
20311
+ rowIndex: index,
20312
+ rowCount: dimensionState.count,
20313
+ selectedRange: this.providers.selection.selectedRange,
20314
+ selectedRowType,
20315
+ });
20316
+ if (!indexes.length) {
20317
+ return;
20318
+ }
20319
+ const previousSizes = indexes.reduce((sizes, rowIndex) => {
20320
+ const row = getItemByIndex(dimensionState, rowIndex);
20321
+ sizes[rowIndex] = row.end - row.start;
20322
+ return sizes;
20323
+ }, {});
20324
+ const startHeight = item.end - item.start;
20325
+ const active = {
20326
+ pointerId: event.pointerId,
20327
+ rowType,
20328
+ index,
20329
+ indexes,
20330
+ startY: event.clientY,
20331
+ startHeight,
20332
+ currentHeight: startHeight,
20333
+ previousSizes,
20334
+ originalCustomSizes: Object.assign({}, dimensionState.sizes),
20335
+ startEvent: event,
20336
+ lastEvent: event,
20337
+ };
20338
+ const beforeEvent = this.emit(BEFORE_ROW_RESIZE_EVENT, this.eventDetail(active, event, startHeight));
20339
+ if (beforeEvent.defaultPrevented) {
20340
+ return;
20341
+ }
20342
+ event.preventDefault();
20343
+ event.stopPropagation();
20344
+ this.active = active;
20345
+ const doc = this.revogrid.ownerDocument;
20346
+ this.previousBodyCursor = ((_a = doc.body) === null || _a === void 0 ? void 0 : _a.style.cursor) || '';
20347
+ if (doc.body) {
20348
+ doc.body.style.cursor = 'row-resize';
20349
+ }
20350
+ doc.addEventListener('pointermove', this.onPointerMove, true);
20351
+ doc.addEventListener('pointerup', this.onPointerUp, true);
20352
+ doc.addEventListener('pointercancel', this.onPointerCancel, true);
20353
+ doc.addEventListener('keydown', this.onKeyDown, true);
20354
+ (_b = doc.defaultView) === null || _b === void 0 ? void 0 : _b.addEventListener('blur', this.onWindowBlur);
20355
+ }
20356
+ flushPendingResize() {
20357
+ const active = this.active;
20358
+ if (!active || this.pendingHeight === undefined) {
20359
+ return;
20360
+ }
20361
+ const size = this.pendingHeight;
20362
+ this.pendingHeight = undefined;
20363
+ if (size === active.currentHeight) {
20364
+ return;
20365
+ }
20366
+ this.providers.dimension.setCustomSizes(active.rowType, createRowResizePatch(active.indexes, size), true);
20367
+ active.currentHeight = size;
20368
+ this.emit(ROW_RESIZE_EVENT, this.eventDetail(active, active.lastEvent, size));
20369
+ }
20370
+ cancel(reason) {
20371
+ const active = this.active;
20372
+ if (!active) {
20373
+ return;
20374
+ }
20375
+ const currentSizes = Object.assign({}, this.providers.dimension.stores[active.rowType].store.get('sizes'));
20376
+ for (const index of active.indexes) {
20377
+ if (Object.hasOwn(active.originalCustomSizes, index)) {
20378
+ currentSizes[index] = active.originalCustomSizes[index];
20379
+ }
20380
+ else {
20381
+ delete currentSizes[index];
20382
+ }
20383
+ }
20384
+ this.providers.dimension.setCustomSizes(active.rowType, currentSizes);
20385
+ const detail = Object.assign(Object.assign({}, this.eventDetail(active, active.lastEvent || active.startEvent, active.startHeight)), { reason });
20386
+ this.finishGesture();
20387
+ this.emit(ROW_RESIZE_CANCEL_EVENT, detail);
20388
+ }
20389
+ eventDetail(active, originalEvent, size) {
20390
+ return {
20391
+ rowType: active.rowType,
20392
+ index: active.index,
20393
+ indexes: [...active.indexes],
20394
+ size,
20395
+ previousSizes: Object.assign({}, active.previousSizes),
20396
+ originalEvent,
20397
+ };
20398
+ }
20399
+ commitResize(active) {
20400
+ if (active.currentHeight === active.startHeight) {
20401
+ return;
20402
+ }
20403
+ const items = this.providers.data.stores[active.rowType].store.get('items');
20404
+ let committed = this.committedSizes.get(active.rowType);
20405
+ if (!committed) {
20406
+ committed = new Map();
20407
+ this.committedSizes.set(active.rowType, committed);
20408
+ }
20409
+ let applied = this.appliedIndexes.get(active.rowType);
20410
+ if (!applied) {
20411
+ applied = new Set();
20412
+ this.appliedIndexes.set(active.rowType, applied);
20413
+ }
20414
+ const physicalIndexes = active.indexes.reduce((result, index) => {
20415
+ const physicalIndex = items[index];
20416
+ if (physicalIndex !== undefined) {
20417
+ committed.set(physicalIndex, active.currentHeight);
20418
+ applied.add(index);
20419
+ result.push(physicalIndex);
20420
+ }
20421
+ return result;
20422
+ }, []);
20423
+ if (physicalIndexes.length) {
20424
+ const rowDefinitions = mergeRowResizeDefinitions(this.revogrid.rowDefinitions, active.rowType, physicalIndexes, active.currentHeight);
20425
+ this.rowDefinitionsRef = rowDefinitions;
20426
+ this.revogrid.rowDefinitions = rowDefinitions;
20427
+ }
20428
+ }
20429
+ applyCommittedSizes(clearAppliedIndexes) {
20430
+ for (const [rowType, committed] of this.committedSizes) {
20431
+ const dimension = this.providers.dimension.stores[rowType];
20432
+ const sizes = Object.assign({}, dimension.store.get('sizes'));
20433
+ if (clearAppliedIndexes) {
20434
+ for (const index of this.appliedIndexes.get(rowType) || []) {
20435
+ delete sizes[index];
20436
+ }
20437
+ }
20438
+ const items = this.providers.data.stores[rowType].store.get('items');
20439
+ const indexes = new Set();
20440
+ items.forEach((physicalIndex, virtualIndex) => {
20441
+ const size = committed.get(physicalIndex);
20442
+ if (size !== undefined) {
20443
+ sizes[virtualIndex] = size;
20444
+ indexes.add(virtualIndex);
20445
+ }
20446
+ });
20447
+ this.appliedIndexes.set(rowType, indexes);
20448
+ this.providers.dimension.setCustomSizes(rowType, sizes);
20449
+ }
20450
+ }
20451
+ finishGesture() {
20452
+ const doc = this.revogrid.ownerDocument;
20453
+ const view = doc.defaultView;
20454
+ if (this.animationFrame !== undefined) {
20455
+ view === null || view === void 0 ? void 0 : view.cancelAnimationFrame(this.animationFrame);
20456
+ }
20457
+ doc.removeEventListener('pointermove', this.onPointerMove, true);
20458
+ doc.removeEventListener('pointerup', this.onPointerUp, true);
20459
+ doc.removeEventListener('pointercancel', this.onPointerCancel, true);
20460
+ doc.removeEventListener('keydown', this.onKeyDown, true);
20461
+ view === null || view === void 0 ? void 0 : view.removeEventListener('blur', this.onWindowBlur);
20462
+ if (doc.body) {
20463
+ doc.body.style.cursor = this.previousBodyCursor;
20464
+ }
20465
+ this.animationFrame = undefined;
20466
+ this.pendingHeight = undefined;
20467
+ this.active = undefined;
20468
+ }
20469
+ destroy() {
20470
+ this.cancel('destroy');
20471
+ super.destroy();
20472
+ }
20473
+ }
20474
+
19839
20475
  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
20476
 
19841
20477
  const DEFAULT_COLUMN_SIZE = 100;
@@ -19926,7 +20562,12 @@ class RevoGridComponent {
19926
20562
  /** When true, grid in read only mode. */
19927
20563
  this.readonly = false;
19928
20564
  /** When true, columns are resizable. */
19929
- this.resize = false;
20565
+ this.resize = true;
20566
+ /**
20567
+ * Enables row resizing. Pass a configuration object to customize the
20568
+ * height limits or enable resize edges across the full row.
20569
+ */
20570
+ this.resizeRow = false;
19930
20571
  /**
19931
20572
  * Prevents horizontal scroll state from being mirrored across viewport sections.
19932
20573
  */
@@ -19997,15 +20638,15 @@ class RevoGridComponent {
19997
20638
  */
19998
20639
  this.autoSizeColumn = false;
19999
20640
  /**
20000
- * Enables filter plugin.
20641
+ * Enables filter plugin. Enabled by default; set to `false` to opt out.
20001
20642
  * Can be boolean.
20002
20643
  * Or can be filter collection See `FilterCollection` for more info.
20003
20644
  */
20004
- this.filter = false;
20645
+ this.filter = true;
20005
20646
  /**
20006
20647
  * Enable column move plugin.
20007
20648
  */
20008
- this.canMoveColumns = false;
20649
+ this.canMoveColumns = true;
20009
20650
  /**
20010
20651
  * Trimmed rows.
20011
20652
  * Functionality which allows to hide rows from main data set.
@@ -20015,7 +20656,7 @@ class RevoGridComponent {
20015
20656
  /**
20016
20657
  * Enable export plugin.
20017
20658
  */
20018
- this.exporting = false;
20659
+ this.exporting = true;
20019
20660
  /**
20020
20661
  * Stretch strategy for columns by `StretchColumn` plugin.
20021
20662
  * For example if there are more space on the right last column size would be increased.
@@ -20107,7 +20748,7 @@ class RevoGridComponent {
20107
20748
  var _a;
20108
20749
  if (this.dataProvider && this.columnProvider && !skipDataUpdate) {
20109
20750
  const columnProp = (_a = this.columnProvider.getColumn(col, colType)) === null || _a === void 0 ? void 0 : _a.prop;
20110
- if (typeof columnProp !== 'undefined') {
20751
+ if (columnProp !== undefined) {
20111
20752
  this.dataProvider.setCellData({
20112
20753
  type: rowType,
20113
20754
  rowIndex: row,
@@ -20836,6 +21477,7 @@ class RevoGridComponent {
20836
21477
  this.pluginService.add(new SortingPlugin(this.element, pluginData));
20837
21478
  // register grouping plugin
20838
21479
  this.pluginService.add(new GroupingRowPlugin(this.element, pluginData));
21480
+ this.pluginService.add(RowResizePlugin.fromGridProperty(this.element, pluginData));
20839
21481
  if (this.canMoveColumns) {
20840
21482
  this.pluginService.add(new ColumnMovePlugin(this.element, pluginData));
20841
21483
  }
@@ -21097,6 +21739,7 @@ class RevoGridComponent {
21097
21739
  "range": [4],
21098
21740
  "readonly": [4],
21099
21741
  "resize": [4],
21742
+ "resizeRow": [4, "resize-row"],
21100
21743
  "noHorizontalScrollTransfer": [4, "no-horizontal-scroll-transfer"],
21101
21744
  "canFocus": [4, "can-focus"],
21102
21745
  "useClipboard": [4, "use-clipboard"],
@@ -21335,7 +21978,7 @@ const CellRenderer = ({ renderProps, cellProps, }) => {
21335
21978
  return (hAsync("div", Object.assign({}, cellProps, { redraw: render }), render()));
21336
21979
  };
21337
21980
 
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}`;
21981
+ 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
21982
 
21340
21983
  /**
21341
21984
  * This component is responsible for rendering data
@@ -21445,7 +22088,10 @@ class RevogrData {
21445
22088
  groupingCellRenderer, additionalData: this.additionalData,
21446
22089
  // Only show expand button if grouping is enabled and not in row headers
21447
22090
  hasExpand: this.columnService.hasGrouping && this.colType !== 'rowHeaders', columnItems: cols, providers: this.providers });
21448
- rowsEls.push(hAsync(GroupingRowRenderer, Object.assign({}, gmodel)));
22091
+ const row = hAsync(GroupingRowRenderer, Object.assign({}, gmodel));
22092
+ this.triggerBeforeRowRender(row, rgRow, dataItem);
22093
+ rowsEls.push(row);
22094
+ this.renderedRows.set(rgRow.itemIndex, row);
21449
22095
  continue;
21450
22096
  }
21451
22097
  // #endregion
@@ -21494,19 +22140,22 @@ class RevogrData {
21494
22140
  rowClass += ` ${ROW_FOCUSED_CLASS}`;
21495
22141
  }
21496
22142
  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
- });
22143
+ this.triggerBeforeRowRender(row, rgRow, dataItem);
21504
22144
  rowsEls.push(row);
21505
22145
  this.renderedRows.set(rgRow.itemIndex, row);
21506
22146
  // #endregion
21507
22147
  }
21508
22148
  return (hAsync(Host, null, hAsync("slot", null), rowsEls));
21509
22149
  }
22150
+ triggerBeforeRowRender(node, item, model) {
22151
+ this.beforerowrender.emit({
22152
+ node,
22153
+ item,
22154
+ model,
22155
+ colType: this.colType,
22156
+ rowType: this.type,
22157
+ });
22158
+ }
21510
22159
  triggerBeforeCellRender(model, row, column) {
21511
22160
  const detail = {
21512
22161
  column,
@@ -21868,7 +22517,7 @@ const HeaderGroupRenderer = (p) => {
21868
22517
  return (hAsync(HeaderCellRenderer, { data: Object.assign(Object.assign({}, p.group), { prop: '', providers: p.providers, index: p.start }), props: groupProps, additionalData: p.additionalData }));
21869
22518
  };
21870
22519
 
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}`;
22520
+ 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
22521
 
21873
22522
  class RevogrHeaderComponent {
21874
22523
  constructor(hostRef) {
@@ -22430,7 +23079,7 @@ class LocalScrollTimer {
22430
23079
  * Remember last mw event time
22431
23080
  */
22432
23081
  latestScrollUpdate(dimension) {
22433
- this.mouseWheelScrollTimestamp[dimension] = new Date().getTime();
23082
+ this.mouseWheelScrollTimestamp[dimension] = Date.now();
22434
23083
  }
22435
23084
  isReady(type, coordinate) {
22436
23085
  // if there is a callback, clear it
@@ -22441,7 +23090,7 @@ class LocalScrollTimer {
22441
23090
  return this.verifyChange(type, coordinate);
22442
23091
  }
22443
23092
  verifyChange(type, coordinate) {
22444
- const now = new Date().getTime();
23093
+ const now = Date.now();
22445
23094
  const change = now - this.mouseWheelScrollTimestamp[type];
22446
23095
  return change > this.scrollThrottling &&
22447
23096
  coordinate !== this.lastKnownScrollCoordinate[type];
@@ -22459,7 +23108,7 @@ class LocalScrollTimer {
22459
23108
  // save lastScrollUpdate callback
22460
23109
  const callback = this.lastScrollUpdateCallbacks[type] = {
22461
23110
  callback: lastScrollUpdate,
22462
- timestamp: new Date().getTime(),
23111
+ timestamp: Date.now(),
22463
23112
  coordinate,
22464
23113
  timeout: 0,
22465
23114
  };