@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.mjs CHANGED
@@ -7606,7 +7606,7 @@ function moveFilterItem(items, sourceId, targetId) {
7606
7606
  return true;
7607
7607
  }
7608
7608
 
7609
- const filterStyleCss = () => `.revo-button{position:relative;overflow:hidden;color:var(--rg-theme-button-text);background-color:var(--rg-theme-button-bg);height:32px;line-height:32px;padding:0 15px;outline:0;border:0;border-radius:7px;box-sizing:border-box;cursor:pointer}.revo-button.green{background-color:var(--rg-theme-button-success-bg)}.revo-button.red{background-color:var(--rg-theme-button-danger-bg)}.revo-button:disabled,.revo-button[disabled]{cursor:not-allowed !important;filter:opacity(0.35) !important}.revo-button.outline{border:1px solid var(--rg-theme-button-outline-border);line-height:30px;background:none;color:var(--rg-theme-button-outline-text);box-shadow:none}revogr-filter-panel{display:block}revogr-filter-panel .filter-panel-dialog{position:fixed;top:0;left:0;z-index:100;max-height:calc(100vh - 16px);overflow:auto;opacity:1;transform:none;color:var(--rg-theme-filter-panel-text);background-color:var(--rg-theme-filter-panel-bg);border:1px solid var(--rg-theme-filter-panel-border);transform-origin:62px 0px;box-shadow:0 5px 18px -2px var(--rg-theme-filter-panel-shadow);box-sizing:border-box;padding:10px;border-radius:8px;margin:0;min-width:220px;text-align:left;animation:revogr-filter-panel-open 140ms cubic-bezier(0.2, 0, 0, 1)}revogr-filter-panel .filter-panel-dialog .filter-holder>div{display:flex;flex-direction:column}revogr-filter-panel .filter-panel-dialog label{font-size:13px;display:block;padding:8px 0}revogr-filter-panel .filter-panel-dialog select{width:100%}revogr-filter-panel .filter-panel-dialog input[type=text]{border:0;min-height:34px;margin:5px 0;color:var(--rg-theme-filter-panel-text);background:var(--rg-theme-filter-panel-input-bg);border-radius:5px;padding:0 10px;box-sizing:border-box;width:100%}revogr-filter-panel .filter-panel-dialog .filter-actions{position:sticky;right:0;bottom:-10px;left:0;z-index:1;text-align:right;margin:10px -10px -10px;padding:0 5px 10px 10px;background:var(--rg-theme-filter-panel-bg);border-top:1px solid var(--rg-theme-filter-panel-divider)}revogr-filter-panel .filter-panel-dialog .filter-actions button{margin-top:10px;margin-right:5px}@keyframes revogr-filter-panel-open{from{opacity:0;transform:translateY(-4px) scale(0.98)}to{opacity:1;transform:none}}@media (prefers-reduced-motion: reduce){revogr-filter-panel .filter-panel-dialog{animation:none}}.rgHeaderCell:hover .rv-filter{transition:opacity 267ms cubic-bezier(0.4, 0, 0.2, 1) 0ms, transform 178ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.rgHeaderCell:hover .rv-filter,.rgHeaderCell .rv-filter.active{opacity:1}.rgHeaderCell .rv-filter{height:24px;width:24px;background:none;border:0;opacity:0;visibility:visible;cursor:pointer;border-radius:4px}.rgHeaderCell .rv-filter.active{color:var(--rg-theme-filter-panel-icon-active)}.rgHeaderCell .rv-filter .filter-img{color:var(--rg-theme-filter-panel-icon);width:11px}.select-css{display:block;font-family:sans-serif;line-height:1.3;padding:0.6em 1.4em 0.5em 0.8em;width:100%;max-width:100%;box-sizing:border-box;margin:0;color:var(--rg-theme-filter-panel-text);border:1px solid var(--rg-theme-filter-panel-select-border);box-shadow:transparent;border-radius:0.5em;appearance:none;background-color:var(--rg-theme-filter-panel-input-bg);background-image:var(--revo-grid-filter-panel-select-arrow, url("data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%23007CB2%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E"));background-repeat:no-repeat, repeat;background-position:right 0.7em top 50%, 0 0;background-size:0.65em auto, 100%;}.select-css::-ms-expand{display:none}.select-css{}.select-css:hover{border-color:var(--rg-theme-filter-panel-select-border)}.select-css{}.select-css:focus{border-color:var(--rg-theme-filter-panel-select-border-hover);box-shadow:var(--rg-theme-filter-panel-focus-ring);outline:none}.select-css{}.select-css option{font-weight:normal}.select-css{}.select-css:disabled,.select-css[aria-disabled=true]{color:var(--rg-theme-filter-panel-muted-text);background-image:var(--revo-grid-filter-panel-select-arrow-disabled, url("data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22graytext%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E"))}.select-css:disabled:hover,.select-css[aria-disabled=true]{border-color:var(--rg-theme-filter-panel-select-border)}.multi-filter-list{margin-top:5px;margin-bottom:5px}.multi-filter-list div{white-space:nowrap}.multi-filter-list .multi-filter-list-row{display:flex;align-items:center;gap:6px;position:relative}.multi-filter-list .multi-filter-list-row.filter-row-dragging{opacity:0.65}.multi-filter-list .multi-filter-list-row.filter-row-drag-over::before{content:"";position:absolute;top:-4px;right:0;left:0;z-index:2;height:2px;background:var(--rg-theme-filter-panel-reorder-accent);border-radius:999px;box-shadow:0 0 0 2px var(--rg-theme-filter-panel-bg)}.multi-filter-list .multi-filter-list-row.filter-row-drop-active .filter-row-drop-target{pointer-events:auto}.multi-filter-list .filter-row-drop-target{position:absolute;inset:0;z-index:1;padding:0;pointer-events:none;background:transparent;border:0}.multi-filter-list .multi-filter-list-action{display:flex;align-self:stretch;flex:0 0 auto;justify-content:flex-end;align-items:center}.multi-filter-list .and-or-button{margin:0 0 0 10px;min-width:58px;cursor:pointer}.multi-filter-list .trash-button{margin:0 0 -2px 6px;padding:0;border:0;background:transparent;color:inherit;cursor:pointer;width:22px;height:100%;font-size:16px}.multi-filter-list .trash-button .trash-img{width:1em}.multi-filter-list .reorder-button{border:0;background:transparent;color:var(--rg-theme-filter-panel-reorder-color);cursor:grab;font-family:monospace;font-size:12px;letter-spacing:0;line-height:1;padding:6px 2px;transform:scaleX(0.8);width:16px}.multi-filter-list .reorder-button.filter-row-drag-over{color:var(--rg-theme-filter-panel-reorder-accent)}.multi-filter-list .reorder-button:active{cursor:grabbing}.multi-filter-list-container{padding:0;margin:0;list-style:none}.add-filter-divider{display:block;margin:0 -10px 10px -10px;border-bottom:1px solid var(--rg-theme-filter-panel-divider);height:10px}.select-input{display:flex;align-items:center;flex:1 1 auto;gap:6px;min-width:0}.select-input .select-filter,.select-input .filter-extra{flex:1 1 0;min-width:0}.select-input .select-filter{width:auto}.select-input .filter-extra{display:flex}.select-input .filter-extra>*{width:100%}.select-input input[type=text],.select-input input[type=date]{margin:0}`;
7609
+ const filterStyleCss = () => `.revo-button{position:relative;overflow:hidden;color:var(--rg-theme-button-text);background-color:var(--rg-theme-button-bg);height:32px;line-height:32px;padding:0 15px;outline:0;border:0;border-radius:7px;box-sizing:border-box;cursor:pointer}.revo-button.green{background-color:var(--rg-theme-button-success-bg)}.revo-button.red{background-color:var(--rg-theme-button-danger-bg)}.revo-button:disabled,.revo-button[disabled]{cursor:not-allowed !important;filter:opacity(0.35) !important}.revo-button.outline{border:1px solid var(--rg-theme-button-outline-border);line-height:30px;background:none;color:var(--rg-theme-button-outline-text);box-shadow:none}revogr-filter-panel{display:block}revogr-filter-panel .filter-panel-dialog{position:fixed;top:0;left:0;z-index:100;max-height:calc(100vh - 16px);overflow:auto;opacity:1;transform:none;color:var(--rg-theme-filter-panel-text);background-color:var(--rg-theme-filter-panel-bg);border:1px solid var(--rg-theme-filter-panel-border);transform-origin:62px 0px;box-shadow:0 5px 18px -2px var(--rg-theme-filter-panel-shadow);box-sizing:border-box;padding:10px;border-radius:8px;margin:0;min-width:220px;text-align:left;animation:revogr-filter-panel-open 140ms cubic-bezier(0.2, 0, 0, 1)}revogr-filter-panel .filter-panel-dialog .filter-holder>div{display:flex;flex-direction:column}revogr-filter-panel .filter-panel-dialog label{font-size:13px;display:block;padding:8px 0}revogr-filter-panel .filter-panel-dialog select{width:100%}revogr-filter-panel .filter-panel-dialog input[type=text]{border:0;min-height:34px;margin:5px 0;color:var(--rg-theme-filter-panel-text);background:var(--rg-theme-filter-panel-input-bg);border-radius:5px;padding:0 10px;box-sizing:border-box;width:100%}revogr-filter-panel .filter-panel-dialog .filter-actions{position:sticky;right:0;bottom:-10px;left:0;z-index:1;text-align:right;margin:10px -10px -10px;padding:0 5px 10px 10px;background:var(--rg-theme-filter-panel-bg);border-top:1px solid var(--rg-theme-filter-panel-divider)}revogr-filter-panel .filter-panel-dialog .filter-actions button{margin-top:10px;margin-right:5px}@keyframes revogr-filter-panel-open{from{opacity:0;transform:translateY(-4px) scale(0.98)}to{opacity:1;transform:none}}@media (prefers-reduced-motion: reduce){revogr-filter-panel .filter-panel-dialog{animation:none}}.rgHeaderCell:hover .rv-filter{transition:opacity 267ms cubic-bezier(0.4, 0, 0.2, 1) 0ms, transform 178ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}.rgHeaderCell:hover .rv-filter,.rgHeaderCell .rv-filter.active{opacity:1}.rgHeaderCell .rv-filter{height:24px;width:24px;background:none;border:0;opacity:0;visibility:visible;cursor:pointer;border-radius:4px;position:relative;z-index:1}.rgHeaderCell .rv-filter.active{color:var(--rg-theme-filter-panel-icon-active)}.rgHeaderCell .rv-filter .filter-img{color:var(--rg-theme-filter-panel-icon);width:11px}.select-css{display:block;font-family:sans-serif;line-height:1.3;padding:0.6em 1.4em 0.5em 0.8em;width:100%;max-width:100%;box-sizing:border-box;margin:0;color:var(--rg-theme-filter-panel-text);border:1px solid var(--rg-theme-filter-panel-select-border);box-shadow:transparent;border-radius:0.5em;appearance:none;background-color:var(--rg-theme-filter-panel-input-bg);background-image:var(--revo-grid-filter-panel-select-arrow, url("data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%23007CB2%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E"));background-repeat:no-repeat, repeat;background-position:right 0.7em top 50%, 0 0;background-size:0.65em auto, 100%;}.select-css::-ms-expand{display:none}.select-css{}.select-css:hover{border-color:var(--rg-theme-filter-panel-select-border)}.select-css{}.select-css:focus{border-color:var(--rg-theme-filter-panel-select-border-hover);box-shadow:var(--rg-theme-filter-panel-focus-ring);outline:none}.select-css{}.select-css option{font-weight:normal}.select-css{}.select-css:disabled,.select-css[aria-disabled=true]{color:var(--rg-theme-filter-panel-muted-text);background-image:var(--revo-grid-filter-panel-select-arrow-disabled, url("data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22graytext%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E"))}.select-css:disabled:hover,.select-css[aria-disabled=true]{border-color:var(--rg-theme-filter-panel-select-border)}.multi-filter-list{margin-top:5px;margin-bottom:5px}.multi-filter-list div{white-space:nowrap}.multi-filter-list .multi-filter-list-row{display:flex;align-items:center;gap:6px;position:relative}.multi-filter-list .multi-filter-list-row.filter-row-dragging{opacity:0.65}.multi-filter-list .multi-filter-list-row.filter-row-drag-over::before{content:"";position:absolute;top:-4px;right:0;left:0;z-index:2;height:2px;background:var(--rg-theme-filter-panel-reorder-accent);border-radius:999px;box-shadow:0 0 0 2px var(--rg-theme-filter-panel-bg)}.multi-filter-list .multi-filter-list-row.filter-row-drop-active .filter-row-drop-target{pointer-events:auto}.multi-filter-list .filter-row-drop-target{position:absolute;inset:0;z-index:1;padding:0;pointer-events:none;background:transparent;border:0}.multi-filter-list .multi-filter-list-action{display:flex;align-self:stretch;flex:0 0 auto;justify-content:flex-end;align-items:center}.multi-filter-list .and-or-button{margin:0 0 0 10px;min-width:58px;cursor:pointer}.multi-filter-list .trash-button{margin:0 0 -2px 6px;padding:0;border:0;background:transparent;color:inherit;cursor:pointer;width:22px;height:100%;font-size:16px}.multi-filter-list .trash-button .trash-img{width:1em}.multi-filter-list .reorder-button{border:0;background:transparent;color:var(--rg-theme-filter-panel-reorder-color);cursor:grab;font-family:monospace;font-size:12px;letter-spacing:0;line-height:1;padding:6px 2px;transform:scaleX(0.8);width:16px}.multi-filter-list .reorder-button.filter-row-drag-over{color:var(--rg-theme-filter-panel-reorder-accent)}.multi-filter-list .reorder-button:active{cursor:grabbing}.multi-filter-list-container{padding:0;margin:0;list-style:none}.add-filter-divider{display:block;margin:0 -10px 10px -10px;border-bottom:1px solid var(--rg-theme-filter-panel-divider);height:10px}.select-input{display:flex;align-items:center;flex:1 1 auto;gap:6px;min-width:0}.select-input .select-filter,.select-input .filter-extra{flex:1 1 0;min-width:0}.select-input .select-filter{width:auto}.select-input .filter-extra{display:flex}.select-input .filter-extra>*{width:100%}.select-input input[type=text],.select-input input[type=date]{margin:0}`;
7610
7610
 
7611
7611
  const defaultType = 'none';
7612
7612
  const FILTER_LIST_CLASS = 'multi-filter-list';
@@ -7711,7 +7711,7 @@ class FilterPanel {
7711
7711
  getFilterItemsList() {
7712
7712
  var _a, _b;
7713
7713
  const prop = (_a = this.changes) === null || _a === void 0 ? void 0 : _a.prop;
7714
- if (typeof prop === 'undefined')
7714
+ if (prop === undefined)
7715
7715
  return '';
7716
7716
  const propFilters = (_b = this.filterItems[prop]) !== null && _b !== void 0 ? _b : [];
7717
7717
  const visibleFilterCount = propFilters.filter(filter => !filter.hidden).length;
@@ -7735,7 +7735,7 @@ class FilterPanel {
7735
7735
  'filter-row-dragging': isDragging,
7736
7736
  'filter-row-drag-over': isDragOver,
7737
7737
  } }, canReorder ? (hAsync("button", { type: "button", class: "filter-row-drop-target", tabIndex: -1, "aria-label": `${capts.filterCondition} ${index + 1}`, onDragOver: e => this.onFilterDragOver(e, filter.id), onDragLeave: () => this.onFilterDragLeave(filter.id), onDrop: e => this.onFilterDrop(e, prop, filter.id) })) : '', canReorder ? (hAsync(ReorderButton, { ariaLabel: capts.reorderFilter, dragging: isDragging, dragOver: isDragOver, onDragStart: e => this.onFilterDragStart(e, filter.id), onDragEnd: () => this.onFilterDragEnd(), onKeyDown: e => this.onFilterReorderKeyDown(e, prop, filter.id) })) : '', hAsync("div", { class: { 'select-input': true } }, hAsync("select", { class: "select-css select-filter", onChange: e => this.onFilterTypeChange(e, prop, index) }, this.renderSelectOptions(this.filterItems[prop][index].type, true)), extra ? hAsync("div", { class: "filter-extra" }, extra) : ''), hAsync("div", { class: FILTER_LIST_CLASS_ACTION }, andOrButton, hAsync(TrashButton, { ariaLabel: capts.removeFilter, onClick: () => this.onRemoveFilter(filter.id) })))));
7738
- })), propFilters.filter(f => !f.hidden).length > 0 ? hAsync("div", { class: "add-filter-divider" }) : ''));
7738
+ })), propFilters.some(f => !f.hidden) ? hAsync("div", { class: "add-filter-divider" }) : ''));
7739
7739
  }
7740
7740
  componentDidRender() {
7741
7741
  this.syncDialog();
@@ -8096,7 +8096,7 @@ class FilterPanel {
8096
8096
  top: `${(_d = (_c = this.changes) === null || _c === void 0 ? void 0 : _c.y) !== null && _d !== void 0 ? _d : 0}px`,
8097
8097
  };
8098
8098
  const capts = Object.assign(Object.assign({}, this.filterCaptionsInternal), this.filterCaptions);
8099
- return (hAsync(Host, { key: '8859c452eb08838f65f18efecbdde7f65fda2b49' }, hAsync("dialog", { key: 'f603067ff0986a9f344cbbf816388d2bbac198bb', class: "filter-panel-dialog", style: style, ref: el => (this.dialog = el), onCancel: e => {
8099
+ return (hAsync(Host, { key: 'd0e4ebb408750b11b3965da6a25e581733c968e3' }, hAsync("dialog", { key: '3df36777c931ec1063e8574169ca880a99dbfe41', class: "filter-panel-dialog", style: style, ref: el => (this.dialog = el), onCancel: e => {
8100
8100
  e.preventDefault();
8101
8101
  this.onCancel();
8102
8102
  } }, this.changes && [
@@ -8105,16 +8105,16 @@ class FilterPanel {
8105
8105
  ((_g = this.changes) === null || _g === void 0 ? void 0 : _g.hideDefaultFilters) !== true && [
8106
8106
  hAsync("label", { key: "filter-title" }, capts.title),
8107
8107
  hAsync("div", { key: "filter-holder", class: "filter-holder" }, this.getFilterItemsList()),
8108
- hAsync("div", { key: "add-filter", class: "add-filter" }, hAsync("select", { key: '2ec0a66918edf91bdde3962b6ec84c89f6f1c8f1', id: FILTER_ID, class: "select-css", onChange: e => this.onAddNewFilter(e) }, this.renderSelectOptions(this.currentFilterType))),
8108
+ hAsync("div", { key: "add-filter", class: "add-filter" }, hAsync("select", { key: 'e2a8bd29f2090d3e6c933795427b71ca190b82aa', id: FILTER_ID, class: "select-css", onChange: e => this.onAddNewFilter(e) }, this.renderSelectOptions(this.currentFilterType))),
8109
8109
  ],
8110
8110
  hAsync("slot", { key: "default-slot" }),
8111
8111
  ((_j = (_h = this.changes).extraBottomContent) === null || _j === void 0 ? void 0 : _j.call(_h, this.changes)) || '',
8112
8112
  hAsync("div", { key: "filter-actions", class: "filter-actions" }, this.disableDynamicFiltering && [
8113
- hAsync("button", { key: "save", id: "revo-button-save", "aria-label": "save", class: "revo-button green", onClick: () => this.onSave() }, capts.save),
8114
- hAsync("button", { key: "cancel", id: "revo-button-ok", "aria-label": "ok", class: "revo-button green", onClick: () => this.onCancel() }, capts.cancel),
8113
+ hAsync("button", { key: "save", type: "button", id: "revo-button-save", "aria-label": "save", class: "revo-button green", onClick: () => this.onSave() }, capts.save),
8114
+ hAsync("button", { key: "cancel", type: "button", id: "revo-button-ok", "aria-label": "ok", class: "revo-button green", onClick: () => this.onCancel() }, capts.cancel),
8115
8115
  ], !this.disableDynamicFiltering && [
8116
- hAsync("button", { key: "ok", id: "revo-button-ok", "aria-label": "ok", class: "revo-button green", onClick: () => this.onCancel() }, capts.ok),
8117
- hAsync("button", { key: "reset", id: "revo-button-reset", "aria-label": "reset", class: "revo-button outline", onClick: () => this.onReset() }, capts.reset),
8116
+ hAsync("button", { key: "ok", type: "button", id: "revo-button-ok", "aria-label": "ok", class: "revo-button green", onClick: () => this.onCancel() }, capts.ok),
8117
+ hAsync("button", { key: "reset", type: "button", id: "revo-button-reset", "aria-label": "reset", class: "revo-button outline", onClick: () => this.onReset() }, capts.reset),
8118
8118
  ]),
8119
8119
  hAsync("slot", { key: "footer-slot", slot: "footer" }),
8120
8120
  ])));
@@ -11168,13 +11168,8 @@ const trimmedPlugin$1 = (store) => ({
11168
11168
  set(k, newVal) {
11169
11169
  switch (k) {
11170
11170
  case 'trimmed': {
11171
- // full sorted items list
11172
- const proxy = store.get('proxyItems');
11173
- const trimmed = gatherTrimmedItems(newVal);
11174
- // filter our physical indexes which are not trimmed
11175
- const newItems = proxy.filter(v => !trimmed[v]);
11176
11171
  // set trimmed items in store
11177
- store.set('items', newItems);
11172
+ store.set('items', getVisibleItems(store.get('proxyItems'), newVal));
11178
11173
  break;
11179
11174
  }
11180
11175
  }
@@ -11190,6 +11185,14 @@ function gatherTrimmedItems(trimmedItems) {
11190
11185
  }
11191
11186
  return trimmed;
11192
11187
  }
11188
+ /**
11189
+ * Preserve proxy order while removing physical indexes hidden by any trim
11190
+ * layer.
11191
+ */
11192
+ function getVisibleItems(proxyItems, trimmedItems) {
11193
+ const trimmed = gatherTrimmedItems(trimmedItems);
11194
+ return proxyItems.filter(index => !trimmed[index]);
11195
+ }
11193
11196
 
11194
11197
  /**
11195
11198
  * Sets the given data on the specified store.
@@ -11496,7 +11499,7 @@ function gatherGroup(res, colData, collection, existingColumnsByType, level = 0)
11496
11499
  // fill columns
11497
11500
  resultItem.push(...collectionItem);
11498
11501
  // fill indexes per each viewport
11499
- res.columnGrouping[type].push(Object.assign(Object.assign({}, group), { indexes: Array(itemLength).fill(columnLength).map((v, i) => v + i) }));
11502
+ res.columnGrouping[type].push(Object.assign(Object.assign({}, group), { indexes: Array.from({ length: itemLength }, (_, i) => columnLength + i) }));
11500
11503
  }
11501
11504
  }
11502
11505
  });
@@ -11720,6 +11723,25 @@ async function timeout(delay = 0) {
11720
11723
  });
11721
11724
  }
11722
11725
 
11726
+ /**
11727
+ * Keeps the visible item collection empty while an asynchronous data operation
11728
+ * is pending. Proxy, trim, and source updates may still calculate new items,
11729
+ * but they must not expose those items until the owning operation releases the
11730
+ * pending state.
11731
+ */
11732
+ const pendingItemsPlugin = (store, isPending) => ({
11733
+ set(key, value) {
11734
+ if (key === 'items' &&
11735
+ isPending() &&
11736
+ Array.isArray(value) &&
11737
+ value.length) {
11738
+ // Writing an empty collection does not re-enter this branch, so the
11739
+ // guard safely replaces every attempted non-empty visibility update.
11740
+ store.set('items', []);
11741
+ }
11742
+ },
11743
+ });
11744
+
11723
11745
  /**
11724
11746
  * Data store
11725
11747
  * Manage the state of a data source and provide methods for updating, adding, and refreshing the data.
@@ -11729,9 +11751,15 @@ class DataStore {
11729
11751
  return this.dataStore;
11730
11752
  }
11731
11753
  constructor(type, storeData) {
11754
+ /**
11755
+ * The source, proxy order, and trims may continue changing,
11756
+ * but visible items must remain empty until the operation finishes.
11757
+ */
11758
+ this.itemsPending = false;
11732
11759
  const store = (this.dataStore = createStore(Object.assign({ items: [], proxyItems: [], source: [], groupingDepth: 0, groups: {}, type, trimmed: {}, groupingCustomRenderer: undefined, groupingCellRenderer: undefined }, storeData)));
11733
11760
  store.use(proxyPlugin(store));
11734
11761
  store.use(trimmedPlugin$1(store));
11762
+ store.use(pendingItemsPlugin(store, () => this.itemsPending));
11735
11763
  }
11736
11764
  /**
11737
11765
  * full data source update
@@ -11746,7 +11774,7 @@ class DataStore {
11746
11774
  // if true, current trimmed indexes will be re-applied to the new source
11747
11775
  preserveTrimmed = false) {
11748
11776
  const trimmed = this.store.get('trimmed');
11749
- const trimmedItems = silent && preserveTrimmed ? gatherTrimmedItems(trimmed) : null;
11777
+ const preserveCurrentTrimmed = silent && preserveTrimmed;
11750
11778
  // during full update we do drop trim
11751
11779
  if (!silent) {
11752
11780
  this.store.set('trimmed', {});
@@ -11761,7 +11789,7 @@ class DataStore {
11761
11789
  });
11762
11790
  // Explicit trim preservation is opt-in because physical indexes may change
11763
11791
  // across full data refreshes.
11764
- this.store.set('items', trimmedItems ? items.filter(i => !trimmedItems[i]) : items);
11792
+ this.store.set('items', preserveCurrentTrimmed ? getVisibleItems(items, trimmed) : items);
11765
11793
  // apply grouping if present
11766
11794
  if (grouping) {
11767
11795
  setStore(this.store, {
@@ -11778,6 +11806,21 @@ class DataStore {
11778
11806
  trimmed = Object.assign(Object.assign({}, trimmed), some);
11779
11807
  setStore(this.store, { trimmed });
11780
11808
  }
11809
+ /**
11810
+ * Keeps visible items empty while an asynchronous source operation is pending.
11811
+ * Releasing the state restores the current proxy order with all trims applied.
11812
+ */
11813
+ setItemsPending(pending) {
11814
+ if (this.itemsPending === pending) {
11815
+ return;
11816
+ }
11817
+ this.itemsPending = pending;
11818
+ if (pending) {
11819
+ this.store.set('items', []);
11820
+ return;
11821
+ }
11822
+ this.store.set('items', getVisibleItems(this.store.get('proxyItems'), this.store.get('trimmed')));
11823
+ }
11781
11824
  setSourceData(items, mutate = true) {
11782
11825
  setSourceByVirtualIndex(this.store, items, mutate);
11783
11826
  }
@@ -12155,9 +12198,7 @@ const trimmedPlugin = (storeService) => {
12155
12198
  }
12156
12199
  case 'trimmed': {
12157
12200
  const trim = val;
12158
- if (!trimmedPreviousSizes) {
12159
- trimmedPreviousSizes = storeService.store.get('sizes');
12160
- }
12201
+ trimmedPreviousSizes !== null && trimmedPreviousSizes !== void 0 ? trimmedPreviousSizes : (trimmedPreviousSizes = storeService.store.get('sizes'));
12161
12202
  trimmingObject = removeMultipleAndShift(trimmedPreviousSizes, trim || {});
12162
12203
  // save a reference to the trimmed object to prevent changes after trimming
12163
12204
  storeService.setSizes(trimmingObject);
@@ -13194,7 +13235,7 @@ function isGrouping(rgRow) {
13194
13235
  return typeof (rgRow === null || rgRow === void 0 ? void 0 : rgRow[PSEUDO_GROUP_ITEM]) !== 'undefined';
13195
13236
  }
13196
13237
  function isGroupingColumn(column) {
13197
- return typeof (column === null || column === void 0 ? void 0 : column[PSEUDO_GROUP_COLUMN]) !== 'undefined';
13238
+ return (column === null || column === void 0 ? void 0 : column[PSEUDO_GROUP_COLUMN]) !== undefined;
13198
13239
  }
13199
13240
  function measureEqualDepth(groupA, groupB) {
13200
13241
  const ln = groupA.length;
@@ -13798,6 +13839,16 @@ const DIRECTION_CODES = [
13798
13839
  class KeyboardService {
13799
13840
  constructor(sv) {
13800
13841
  this.sv = sv;
13842
+ /** Keep focus transitions in keydown order so rendering can scroll each cell into view. */
13843
+ this.keyChangeQueue = Promise.resolve(false);
13844
+ this.keyChangeGeneration = 0;
13845
+ this.applyingKeyChange = false;
13846
+ }
13847
+ /** Cancel delayed directional input after focus or edit context changes externally. */
13848
+ invalidatePendingChanges() {
13849
+ if (!this.applyingKeyChange) {
13850
+ this.keyChangeGeneration += 1;
13851
+ }
13801
13852
  }
13802
13853
  /**
13803
13854
  * Appends printable key input that arrives after edit mode was requested
@@ -13900,13 +13951,33 @@ class KeyboardService {
13900
13951
  if (!data) {
13901
13952
  return false;
13902
13953
  }
13954
+ const keyChangeGeneration = this.keyChangeGeneration;
13903
13955
  // this interval needed for several cases
13904
13956
  // grid could be resized before next click
13905
13957
  // at this case to avoid screen jump we use this interval
13906
13958
  await timeout(RESIZE_INTERVAL + 30);
13907
- const range = this.sv.selectionStore.get('range');
13908
- const focus = this.sv.selectionStore.get('focus');
13909
- return this.keyPositionChange(data.changes, range, focus, data.isMulti);
13959
+ const applyKeyChange = async () => {
13960
+ if (keyChangeGeneration !== this.keyChangeGeneration) {
13961
+ return false;
13962
+ }
13963
+ const range = this.sv.selectionStore.get('range');
13964
+ const focus = this.sv.selectionStore.get('focus');
13965
+ this.applyingKeyChange = true;
13966
+ let changed;
13967
+ try {
13968
+ changed = this.keyPositionChange(data.changes, range, focus, data.isMulti);
13969
+ }
13970
+ finally {
13971
+ this.applyingKeyChange = false;
13972
+ }
13973
+ await new Promise(resolve => requestAnimationFrame(() => {
13974
+ requestAnimationFrame(() => resolve());
13975
+ }));
13976
+ return changed;
13977
+ };
13978
+ const queuedChange = this.keyChangeQueue.then(applyKeyChange, applyKeyChange);
13979
+ this.keyChangeQueue = queuedChange.catch(() => false);
13980
+ return queuedChange;
13910
13981
  }
13911
13982
  keyPositionChange(changes, range, focus, isMulti = false) {
13912
13983
  if (!range || !focus) {
@@ -14293,6 +14364,8 @@ class OverlaySelection {
14293
14364
  * Selection & Keyboard
14294
14365
  */
14295
14366
  selectionServiceSet(selectionStore) {
14367
+ var _a;
14368
+ (_a = this.keyboardService) === null || _a === void 0 ? void 0 : _a.invalidatePendingChanges();
14296
14369
  // clear subscriptions
14297
14370
  this.unsubscribeSelectionStore.forEach(v => v());
14298
14371
  this.unsubscribeSelectionStore.length = 0;
@@ -14320,6 +14393,7 @@ class OverlaySelection {
14320
14393
  getData: () => this.getData(),
14321
14394
  selectAll: () => this.selectAll.emit(),
14322
14395
  });
14396
+ this.unsubscribeSelectionStore.push(selectionStore.onChange('focus', () => { var _a; return (_a = this.keyboardService) === null || _a === void 0 ? void 0 : _a.invalidatePendingChanges(); }), selectionStore.onChange('edit', () => { var _a; return (_a = this.keyboardService) === null || _a === void 0 ? void 0 : _a.invalidatePendingChanges(); }));
14323
14397
  this.createAutoFillService();
14324
14398
  }
14325
14399
  /** Autofill */
@@ -14356,11 +14430,12 @@ class OverlaySelection {
14356
14430
  this.selectionServiceSet(this.selectionStore);
14357
14431
  }
14358
14432
  disconnectedCallback() {
14359
- var _a;
14433
+ var _a, _b;
14360
14434
  // clear subscriptions
14435
+ (_a = this.keyboardService) === null || _a === void 0 ? void 0 : _a.invalidatePendingChanges();
14361
14436
  this.unsubscribeSelectionStore.forEach(v => v());
14362
14437
  this.unsubscribeSelectionStore.length = 0;
14363
- (_a = this.columnService) === null || _a === void 0 ? void 0 : _a.destroy();
14438
+ (_b = this.columnService) === null || _b === void 0 ? void 0 : _b.destroy();
14364
14439
  }
14365
14440
  async componentWillRender() {
14366
14441
  var _a, _b;
@@ -14372,9 +14447,7 @@ class OverlaySelection {
14372
14447
  renderRange(range) {
14373
14448
  const cell = getCell(range, this.dimensionRow.state, this.dimensionCol.state);
14374
14449
  const styles = styleByCellProps(cell);
14375
- return [
14376
- hAsync("div", { class: SELECTION_BORDER_CLASS, style: styles }, this.isMobileDevice && (hAsync("div", { class: "range-handlers" }, hAsync("span", { class: MOBILE_CLASS }), hAsync("span", { class: MOBILE_CLASS })))),
14377
- ];
14450
+ return (hAsync("div", { class: SELECTION_BORDER_CLASS, style: styles }, this.isMobileDevice && (hAsync("div", { class: "range-handlers" }, hAsync("span", { class: MOBILE_CLASS }), hAsync("span", { class: MOBILE_CLASS })))));
14378
14451
  }
14379
14452
  renderEditor() {
14380
14453
  // Check if edit access
@@ -14427,7 +14500,7 @@ class OverlaySelection {
14427
14500
  }
14428
14501
  // Range
14429
14502
  if (range) {
14430
- nodes.push(...this.renderRange(range));
14503
+ nodes.push(this.renderRange(range));
14431
14504
  }
14432
14505
  // Autofill
14433
14506
  if (focus && !this.readonly && this.range) {
@@ -14438,9 +14511,9 @@ class OverlaySelection {
14438
14511
  nodes.push(hAsync("revogr-order-editor", { ref: e => (this.orderEditor = e), dataStore: this.dataStore, dimensionRow: this.dimensionRow, dimensionCol: this.dimensionCol, parent: this.element, rowType: this.types.rowType, onRowdragstartinit: e => this.rowDragStart(e) }));
14439
14512
  }
14440
14513
  }
14441
- return (hAsync(Host, { key: '2d8dc4fd40a883fe59b24b2cfac1c370b9f0ac16', class: { mobile: this.isMobileDevice }, onDblClick: (e) => this.onElementDblClick(e), onMouseDown: (e) => this.onElementMouseDown(e), onTouchStart: (e) => this.onElementMouseDown(e, true), onCloseedit: (e) => this.closeEdit(e),
14514
+ return (hAsync(Host, { key: '230e2122c5c7065c072f02019d616a64949d54d0', class: { mobile: this.isMobileDevice }, onDblClick: (e) => this.onElementDblClick(e), onMouseDown: (e) => this.onElementMouseDown(e), onTouchStart: (e) => this.onElementMouseDown(e, true), onCloseedit: (e) => this.closeEdit(e),
14442
14515
  // it's done to be able to throw events from different levels, not just from editor
14443
- onCelledit: (e) => this.onEditCell(e) }, nodes, hAsync("slot", { key: '8ad5df55904ca6a8b2fb0e69c5f608ec7264a0f1', name: "data" })));
14516
+ onCelledit: (e) => this.onEditCell(e) }, nodes, hAsync("slot", { key: '47740a79c605258b4024384510358be927d000b7', name: "data" })));
14444
14517
  }
14445
14518
  /**
14446
14519
  * Executes the focus operation on the specified range of cells.
@@ -14637,12 +14710,12 @@ class OverlaySelection {
14637
14710
  clearCell() {
14638
14711
  var _a;
14639
14712
  const range = this.selectionStore.get('range');
14640
- if (range && !isRangeSingleCell(range)) {
14713
+ const focused = this.selectionStore.get('focus');
14714
+ if (range && (!isRangeSingleCell(range) || !focused)) {
14641
14715
  const data = this.columnService.getRangeStaticData(range, '');
14642
14716
  (_a = this.autoFillService) === null || _a === void 0 ? void 0 : _a.onRangeApply(data, range, range);
14643
14717
  }
14644
14718
  else if (this.canEdit()) {
14645
- const focused = this.selectionStore.get('focus');
14646
14719
  if (!focused) {
14647
14720
  return;
14648
14721
  }
@@ -15195,9 +15268,15 @@ class DataProvider {
15195
15268
  store.addTrimmed(trimmed);
15196
15269
  this.dimensionProvider.setTrimmed(trimmed, type);
15197
15270
  if (type === 'rgRow') {
15198
- this.dimensionProvider.setData(getVisibleSourceItem(store.store).length, type);
15271
+ this.dimensionProvider.setData(store.store.get('items').length, type);
15199
15272
  }
15200
15273
  }
15274
+ /** Keep a row source empty until its current asynchronous update is ready. */
15275
+ setItemsPending(pending, type = 'rgRow') {
15276
+ const store = this.stores[type];
15277
+ store.setItemsPending(pending);
15278
+ this.dimensionProvider.setData(store.store.get('items').length, type, type !== 'rgRow');
15279
+ }
15201
15280
  }
15202
15281
 
15203
15282
  const FALLBACK_MAX_SCROLL_SIZE = 16000000;
@@ -16313,6 +16392,13 @@ const filterNames = {
16313
16392
  lte: '<=',
16314
16393
  };
16315
16394
 
16395
+ /** Fewer rows keep the existing synchronous filtering behavior. */
16396
+ const ASYNC_FILTER_ROW_THRESHOLD = 15000;
16397
+ /** Maximum rows evaluated in one filtering chunk. */
16398
+ const FILTER_CHUNK_SIZE = 1000;
16399
+ /** Yield after approximately this much accumulated filtering work. */
16400
+ const FILTER_TIME_BUDGET_MS = 5;
16401
+
16316
16402
  // filter.plugin.tsx
16317
16403
  const FILTER_TRIMMED_TYPE = 'filter';
16318
16404
  const FILTER_CONFIG_CHANGED_EVENT = 'filterconfigchanged';
@@ -16357,6 +16443,7 @@ class FilterPlugin extends BasePlugin {
16357
16443
  this.filterFunctionsIndexedByType = Object.assign({}, filterCoreFunctionsIndexedByType);
16358
16444
  this.filterProp = FILTER_PROP;
16359
16445
  this.allowDuplicateOperators = true;
16446
+ this.filteringRunId = 0;
16360
16447
  if (config) {
16361
16448
  this.initConfig(config);
16362
16449
  }
@@ -16365,7 +16452,7 @@ class FilterPlugin extends BasePlugin {
16365
16452
  ...existingNodes,
16366
16453
  hAsync("revogr-filter-panel", { filterNames: this.filterNameIndexByType, filterEntities: this.filterFunctionsIndexedByType, filterCaptions: (_a = config === null || config === void 0 ? void 0 : config.localization) === null || _a === void 0 ? void 0 : _a.captions, onFilterChange: e => this.onFilterChange(e.detail), onResetChange: e => this.onFilterReset(e.detail), disableDynamicFiltering: config === null || config === void 0 ? void 0 : config.disableDynamicFiltering, closeOnOutsideClick: config === null || config === void 0 ? void 0 : config.closeFilterPanelOnOutsideClick, allowDuplicateOperators: this.allowDuplicateOperators, ref: e => (this.pop = e) }, ' ', this.extraContent()),
16367
16454
  ];
16368
- const aftersourceset = async () => {
16455
+ const aftersourceset = () => {
16369
16456
  const filterCollectionProps = Object.keys(this.filterCollection);
16370
16457
  if (filterCollectionProps.length > 0) {
16371
16458
  // handle old way of filtering by reworking FilterCollection to new MultiFilterItem
@@ -16382,12 +16469,26 @@ class FilterPlugin extends BasePlugin {
16382
16469
  }
16383
16470
  });
16384
16471
  }
16385
- if (Object.keys(this.multiFilterItems).length === 0) {
16472
+ if (!this.hasActiveFilters()) {
16473
+ this.cancelFiltering();
16386
16474
  return;
16387
16475
  }
16388
- await timeout();
16389
- await this.runFiltering(this.multiFilterItems);
16476
+ void this.runFiltering(this.multiFilterItems);
16390
16477
  };
16478
+ /**
16479
+ * This executes before the data store replaces its source.
16480
+ * For a large source with active filters:
16481
+ * 1. Existing filtering runs are invalidated.
16482
+ * 2. Pending state starts.
16483
+ * 3. Visible rows become empty.
16484
+ * 4. The source is replaced while the DataStore guard prevents it from exposing unfiltered rows.
16485
+ */
16486
+ this.addEventListener('beforesourceset', ({ detail }) => {
16487
+ if (detail.source.length >= ASYNC_FILTER_ROW_THRESHOLD &&
16488
+ this.hasActiveFilters()) {
16489
+ this.deferFiltering();
16490
+ }
16491
+ });
16391
16492
  this.addEventListener('headerclick', e => this.headerclick(e));
16392
16493
  this.addEventListener(FILTER_CONFIG_CHANGED_EVENT, ({ detail }) => {
16393
16494
  if (!detail) {
@@ -16548,7 +16649,7 @@ class FilterPlugin extends BasePlugin {
16548
16649
  // store the filter items
16549
16650
  this.multiFilterItems = filterItems;
16550
16651
  // run the filtering when the items change
16551
- this.runFiltering(this.multiFilterItems);
16652
+ await this.runFiltering(this.multiFilterItems);
16552
16653
  }
16553
16654
  onFilterReset(prop) {
16554
16655
  delete this.multiFilterItems[prop !== null && prop !== void 0 ? prop : ''];
@@ -16558,6 +16659,8 @@ class FilterPlugin extends BasePlugin {
16558
16659
  * Triggers grid filtering
16559
16660
  */
16560
16661
  async doFiltering(collection, source, columns, filterItems) {
16662
+ // creates the execution token - owns the actual calculation
16663
+ const runId = this.beginFiltering();
16561
16664
  const columnsToUpdate = [];
16562
16665
  /**
16563
16666
  * Loop through the columns and update the columns that need to be updated with the `hasFilter` property.
@@ -16582,7 +16685,25 @@ class FilterPlugin extends BasePlugin {
16582
16685
  column[this.filterProp] = true;
16583
16686
  }
16584
16687
  });
16585
- const itemsToTrim = this.getRowFilter(source, filterItems, columnByProp);
16688
+ let itemsToTrim;
16689
+ const hasFilters = Object.keys(filterItems).length > 0 || this.hasActiveFilters();
16690
+ const isLargeSource = hasFilters && source.length >= ASYNC_FILTER_ROW_THRESHOLD;
16691
+ if (isLargeSource) {
16692
+ this.providers.data.setItemsPending(true);
16693
+ await timeout();
16694
+ }
16695
+ if (!hasFilters) {
16696
+ itemsToTrim = {};
16697
+ }
16698
+ else if (isLargeSource && this.supportsChunkedFiltering()) {
16699
+ itemsToTrim = await this.getRowFilterInChunks(source, filterItems, columnByProp, runId);
16700
+ }
16701
+ else {
16702
+ itemsToTrim = this.getRowFilter(source, filterItems, columnByProp);
16703
+ }
16704
+ if (!itemsToTrim || runId !== this.filteringRunId) {
16705
+ return;
16706
+ }
16586
16707
  // check is filter event prevented
16587
16708
  const { defaultPrevented, detail } = this.emit('beforefiltertrimmed', {
16588
16709
  collection,
@@ -16590,10 +16711,12 @@ class FilterPlugin extends BasePlugin {
16590
16711
  source,
16591
16712
  filterItems,
16592
16713
  });
16593
- if (defaultPrevented) {
16714
+ if (defaultPrevented || runId !== this.filteringRunId) {
16715
+ this.releaseFiltering(runId);
16594
16716
  return;
16595
16717
  }
16596
16718
  this.providers.data.setTrimmed({ [FILTER_TRIMMED_TYPE]: detail.itemsToFilter });
16719
+ this.releaseFiltering(runId);
16597
16720
  // applies the hasFilter to the columns to show filter icon
16598
16721
  this.providers.column.updateColumns(columnsToUpdate);
16599
16722
  this.emit('afterfilterapply', {
@@ -16607,6 +16730,10 @@ class FilterPlugin extends BasePlugin {
16607
16730
  await this.runFiltering(this.multiFilterItems);
16608
16731
  }
16609
16732
  async runFiltering(multiFilterItems) {
16733
+ // runFiltering: First token: "Is this request still valid after event handlers run?"
16734
+ // doFiltering: Second token: "Is this calculation still the newest one?"
16735
+ // creates a preflight token and sets the grid to a pending state
16736
+ const runId = this.beginFiltering();
16610
16737
  const collection = {};
16611
16738
  // handle old filterCollection to return the first filter only (if any) from multiFilterItems
16612
16739
  const filterProps = Object.keys(multiFilterItems);
@@ -16630,10 +16757,67 @@ class FilterPlugin extends BasePlugin {
16630
16757
  columns,
16631
16758
  filterItems: this.multiFilterItems,
16632
16759
  });
16633
- if (defaultPrevented) {
16760
+ if (defaultPrevented || runId !== this.filteringRunId) {
16761
+ this.releaseFiltering(runId);
16634
16762
  return;
16635
16763
  }
16636
- this.doFiltering(detail.collection, detail.source, detail.columns, detail.filterItems);
16764
+ await this.doFiltering(detail.collection, detail.source, detail.columns, detail.filterItems);
16765
+ }
16766
+ /** Whether this plugin currently owns filter state that must follow a new source. */
16767
+ hasActiveFilters() {
16768
+ return (Object.keys(this.multiFilterItems).length > 0 ||
16769
+ Object.keys(this.filterCollection).length > 0);
16770
+ }
16771
+ /** Preserve whole-source semantics for plugins that override getRowFilter. */
16772
+ supportsChunkedFiltering() {
16773
+ return this.getRowFilter === FilterPlugin.prototype.getRowFilter;
16774
+ }
16775
+ /**
16776
+ * Hide visible rows and invalidate current filtering until a deferred filter
16777
+ * run is ready. Used by filter extensions with their own debounced state.
16778
+ */
16779
+ deferFiltering() {
16780
+ this.beginFiltering(true);
16781
+ }
16782
+ beginFiltering(pending = false) {
16783
+ const runId = ++this.filteringRunId;
16784
+ if (pending) {
16785
+ this.providers.data.setItemsPending(true);
16786
+ }
16787
+ return runId;
16788
+ }
16789
+ releaseFiltering(runId) {
16790
+ if (runId === this.filteringRunId) {
16791
+ this.providers.data.setItemsPending(false);
16792
+ }
16793
+ }
16794
+ cancelFiltering() {
16795
+ this.releaseFiltering(this.beginFiltering());
16796
+ }
16797
+ async getRowFilterInChunks(rows, filterItems, columnByProp, runId) {
16798
+ const trimmed = {};
16799
+ let sliceStarted = performance.now();
16800
+ for (let offset = 0; offset < rows.length; offset += FILTER_CHUNK_SIZE) {
16801
+ if (runId !== this.filteringRunId) {
16802
+ return;
16803
+ }
16804
+ const end = Math.min(offset + FILTER_CHUNK_SIZE, rows.length);
16805
+ const chunkTrimmed = this.getRowFilter(rows.slice(offset, end), filterItems, columnByProp);
16806
+ // filter that chunk
16807
+ for (const chunkIndex in chunkTrimmed) {
16808
+ trimmed[offset + Number(chunkIndex)] = true;
16809
+ }
16810
+ if (end < rows.length &&
16811
+ performance.now() - sliceStarted >= FILTER_TIME_BUDGET_MS) {
16812
+ await timeout();
16813
+ sliceStarted = performance.now();
16814
+ }
16815
+ }
16816
+ return runId === this.filteringRunId ? trimmed : undefined;
16817
+ }
16818
+ destroy() {
16819
+ this.cancelFiltering();
16820
+ super.destroy();
16637
16821
  }
16638
16822
  /**
16639
16823
  * Get trimmed rows based on filter
@@ -17908,7 +18092,7 @@ const GroupingRowRenderer = (props) => {
17908
18092
  depth })))));
17909
18093
  }
17910
18094
  return (hAsync(RowRenderer, Object.assign({}, props, groupRowAttrs), hasExpand && [
17911
- hAsync("button", { class: { [GROUP_EXPAND_BTN]: true }, onClick: e => expandEvent(e, model, itemIndex) }, expandSvgIconVNode(expanded)),
18095
+ hAsync("button", { type: "button", class: { [GROUP_EXPAND_BTN]: true }, onClick: e => expandEvent(e, model, itemIndex) }, expandSvgIconVNode(expanded)),
17912
18096
  String(name),
17913
18097
  ]));
17914
18098
  };
@@ -18068,7 +18252,7 @@ class GroupingRowPlugin extends BasePlugin {
18068
18252
  customRenderer: options.groupLabelTemplate,
18069
18253
  cellRenderer: options.groupCellTemplate,
18070
18254
  });
18071
- this.updateTrimmed(trimmed, oldNewIndexMap, undefined, sourceWithGroups);
18255
+ this.updateTrimmed(trimmed, oldNewIndexMap, undefined, sourceWithGroups, { filterTrimmedMode: 'recompute-after-source-set' });
18072
18256
  }
18073
18257
  /**
18074
18258
  * External call to apply grouping. Called by revogrid when prop changed.
@@ -18168,10 +18352,17 @@ class GroupingRowPlugin extends BasePlugin {
18168
18352
  this.providers.data.setData(source, GROUPING_ROW_TYPE, this.revogrid.disableVirtualY, undefined, true);
18169
18353
  this.updateTrimmed(undefined, undefined, oldNewIndexes, source);
18170
18354
  }
18171
- updateTrimmed(trimmedGroup = {}, firstLevelMap = {}, secondLevelMap, source = this.getStore().get('source')) {
18355
+ updateTrimmed(trimmedGroup = {}, firstLevelMap = {}, secondLevelMap, source = this.getStore().get('source'), { filterTrimmedMode = 'remap', } = {}) {
18172
18356
  // map previously trimmed data
18173
18357
  const trimemedOptionsToUpgrade = processDoubleConversionTrimmed(this.getStore().get('trimmed'), firstLevelMap, secondLevelMap);
18174
18358
  for (let type in trimemedOptionsToUpgrade) {
18359
+ if (filterTrimmedMode === 'recompute-after-source-set' &&
18360
+ type === FILTER_TRIMMED_TYPE) {
18361
+ // The filter plugin recalculates this trim against the installed source
18362
+ // during aftersourceset. Reapplying remapped old indexes afterwards
18363
+ // would overwrite that fresh result.
18364
+ continue;
18365
+ }
18175
18366
  if (type === FILTER_TRIMMED_TYPE) {
18176
18367
  /** Regrouping changes physical indexes, so filter trim needs fresh group-header state. */
18177
18368
  trimemedOptionsToUpgrade[type] = filterOutEmptyGroupRows(source, trimemedOptionsToUpgrade[type]);
@@ -18342,7 +18533,7 @@ class ViewportService {
18342
18533
  const changedItems = {};
18343
18534
  for (const i of Object.keys(detail || {})) {
18344
18535
  const size = detail[i];
18345
- const virtualIndex = parseInt(i, 10);
18536
+ const virtualIndex = Number.parseInt(i, 10);
18346
18537
  const item = getSourceItem(store, virtualIndex);
18347
18538
  if (item) {
18348
18539
  changedItems[virtualIndex] = Object.assign(Object.assign({}, item), { size });
@@ -18471,29 +18662,25 @@ class GridScrollingService {
18471
18662
  this.elements = {};
18472
18663
  }
18473
18664
  async proxyScroll(e, key, skipEvent) {
18474
- var _a;
18475
18665
  let newEventPromise;
18476
18666
  let event = e;
18477
- for (let elKey in (skipEvent ? {} : this.elements)) {
18667
+ for (const elKey in (skipEvent ? {} : this.elements)) {
18478
18668
  // skip
18479
18669
  if (e.dimension === 'rgCol' && elKey === 'headerRow') {
18480
18670
  continue;
18481
18671
  // pinned column only
18482
18672
  }
18483
- else if (this.isPinnedColumn(key) && e.dimension === 'rgCol') {
18673
+ if (this.isPinnedColumn(key) && e.dimension === 'rgCol') {
18484
18674
  if (elKey === key || !e.delta) {
18485
18675
  continue;
18486
18676
  }
18487
- for (let el of this.elements[elKey]) {
18488
- if (el.changeScroll) {
18489
- newEventPromise = el.changeScroll(e);
18490
- }
18677
+ const changedEvent = this.changeScroll(this.elements[elKey], e);
18678
+ if (changedEvent) {
18679
+ newEventPromise = changedEvent;
18491
18680
  }
18492
18681
  }
18493
18682
  else {
18494
- for (let el of this.elements[elKey]) {
18495
- await ((_a = el.setScroll) === null || _a === void 0 ? void 0 : _a.call(el, e));
18496
- }
18683
+ await this.setScroll(this.elements[elKey], e);
18497
18684
  }
18498
18685
  }
18499
18686
  const newEvent = await newEventPromise;
@@ -18503,12 +18690,27 @@ class GridScrollingService {
18503
18690
  this.setViewport(skipEvent && this.isPinnedColumn(key)
18504
18691
  ? Object.assign(Object.assign({}, event), { dimension: key }) : event);
18505
18692
  }
18693
+ changeScroll(elements, e) {
18694
+ let changedEvent;
18695
+ for (const element of elements) {
18696
+ if (element.changeScroll) {
18697
+ changedEvent = element.changeScroll(e);
18698
+ }
18699
+ }
18700
+ return changedEvent;
18701
+ }
18702
+ async setScroll(elements, e) {
18703
+ var _a;
18704
+ for (const element of elements) {
18705
+ await ((_a = element.setScroll) === null || _a === void 0 ? void 0 : _a.call(element, e));
18706
+ }
18707
+ }
18506
18708
  /**
18507
18709
  * Silent scroll update for mobile devices when we have negative scroll top
18508
18710
  */
18509
18711
  async scrollSilentService(e, key) {
18510
18712
  var _a;
18511
- for (let elKey in this.elements) {
18713
+ for (const elKey in this.elements) {
18512
18714
  // skip same element update
18513
18715
  if (elKey === key) {
18514
18716
  continue;
@@ -18516,7 +18718,7 @@ class GridScrollingService {
18516
18718
  if (columnTypes.includes(key) &&
18517
18719
  (elKey === 'headerRow' ||
18518
18720
  columnTypes.includes(elKey))) {
18519
- for (let el of this.elements[elKey]) {
18721
+ for (const el of this.elements[elKey]) {
18520
18722
  await ((_a = el.changeScroll) === null || _a === void 0 ? void 0 : _a.call(el, e, true));
18521
18723
  }
18522
18724
  continue;
@@ -18524,7 +18726,7 @@ class GridScrollingService {
18524
18726
  }
18525
18727
  }
18526
18728
  isPinnedColumn(key) {
18527
- return !!key && ['colPinStart', 'colPinEnd'].indexOf(key) > -1;
18729
+ return !!key && ['colPinStart', 'colPinEnd'].includes(key);
18528
18730
  }
18529
18731
  registerElements(els) {
18530
18732
  this.elements = els;
@@ -18805,9 +19007,11 @@ class SelectionStoreConnector {
18805
19007
  continue;
18806
19008
  }
18807
19009
  const lastCell = store.store.get('lastCell');
18808
- if (lastCell) {
18809
- store.setRange({ x: 0, y: 0 }, { x: lastCell.x - 1, y: lastCell.y - 1 });
19010
+ if (!lastCell || lastCell.x <= 0 || lastCell.y <= 0) {
19011
+ store.setRangeArea(null);
19012
+ continue;
18810
19013
  }
19014
+ store.setRange({ x: 0, y: 0 }, { x: lastCell.x - 1, y: lastCell.y - 1 });
18811
19015
  }
18812
19016
  }
18813
19017
  }
@@ -19682,7 +19886,7 @@ class PluginService {
19682
19886
  return;
19683
19887
  }
19684
19888
  // Step 1: Identify plugins to remove, compare new and old plugins
19685
- const pluginsToRemove = (prevPlugins === null || prevPlugins === void 0 ? void 0 : prevPlugins.filter(prevPlugin => !plugins.some(userPlugin => userPlugin === prevPlugin))) || [];
19889
+ const pluginsToRemove = (prevPlugins === null || prevPlugins === void 0 ? void 0 : prevPlugins.filter(prevPlugin => !plugins.includes(prevPlugin))) || [];
19686
19890
  // Step 2: Remove old plugins
19687
19891
  pluginsToRemove.forEach(plugin => {
19688
19892
  var _a, _b;
@@ -19695,7 +19899,7 @@ class PluginService {
19695
19899
  // Step 3: Register user plugins
19696
19900
  plugins === null || plugins === void 0 ? void 0 : plugins.forEach(userPlugin => {
19697
19901
  // check if plugin already exists, if so, skip
19698
- const existingPlugin = this.internalPlugins.find(createdPlugin => createdPlugin instanceof userPlugin);
19902
+ const existingPlugin = this.internalPlugins.some(createdPlugin => createdPlugin instanceof userPlugin);
19699
19903
  if (existingPlugin) {
19700
19904
  return;
19701
19905
  }
@@ -19834,6 +20038,438 @@ class RTLPlugin extends BasePlugin {
19834
20038
  }
19835
20039
  }
19836
20040
 
20041
+ const DEFAULT_MIN_ROW_HEIGHT = 20;
20042
+ const finiteNumber = (value) => typeof value === 'number' && Number.isFinite(value);
20043
+ function resolveRowResizeConfig(config = {}) {
20044
+ const minHeight = finiteNumber(config.minHeight)
20045
+ ? Math.max(1, Math.round(config.minHeight))
20046
+ : DEFAULT_MIN_ROW_HEIGHT;
20047
+ const maxHeight = finiteNumber(config.maxHeight)
20048
+ ? Math.max(minHeight, Math.round(config.maxHeight))
20049
+ : undefined;
20050
+ return { minHeight, maxHeight, fullRow: config.fullRow === true };
20051
+ }
20052
+ function clampRowResizeHeight(height, config) {
20053
+ var _a;
20054
+ const rounded = Number.isFinite(height)
20055
+ ? Math.round(height)
20056
+ : config.minHeight;
20057
+ return Math.min(Math.max(rounded, config.minHeight), (_a = config.maxHeight) !== null && _a !== void 0 ? _a : Number.POSITIVE_INFINITY);
20058
+ }
20059
+ function getRowResizeIndexes({ rowType, rowIndex, rowCount, selectedRange, selectedRowType, }) {
20060
+ if (!selectedRange ||
20061
+ selectedRowType !== rowType ||
20062
+ rowIndex < Math.min(selectedRange.y, selectedRange.y1) ||
20063
+ rowIndex > Math.max(selectedRange.y, selectedRange.y1)) {
20064
+ return rowIndex >= 0 && rowIndex < rowCount ? [rowIndex] : [];
20065
+ }
20066
+ const start = Math.max(0, Math.min(selectedRange.y, selectedRange.y1));
20067
+ const end = Math.min(rowCount - 1, Math.max(selectedRange.y, selectedRange.y1));
20068
+ return Array.from({ length: Math.max(0, end - start + 1) }, (_, i) => start + i);
20069
+ }
20070
+ function createRowResizePatch(indexes, size) {
20071
+ return indexes.reduce((patch, index) => {
20072
+ patch[index] = size;
20073
+ return patch;
20074
+ }, {});
20075
+ }
20076
+ function mergeRowResizeDefinitions(definitions, rowType, physicalIndexes, size) {
20077
+ const targetIndexes = new Set(physicalIndexes);
20078
+ const existingIndexes = new Set();
20079
+ const merged = definitions.map(definition => {
20080
+ if (definition.type !== rowType || !targetIndexes.has(definition.index)) {
20081
+ return definition;
20082
+ }
20083
+ existingIndexes.add(definition.index);
20084
+ return Object.assign(Object.assign({}, definition), { size });
20085
+ });
20086
+ for (const index of targetIndexes) {
20087
+ if (!existingIndexes.has(index)) {
20088
+ merged.push({ type: rowType, index, size });
20089
+ }
20090
+ }
20091
+ return merged;
20092
+ }
20093
+
20094
+ const ROW_RESIZE_HANDLE_CLASS = 'row-resize-handle';
20095
+ const BEFORE_ROW_RESIZE_EVENT = 'beforerowresize';
20096
+ const ROW_RESIZE_EVENT = 'rowresize';
20097
+ const AFTER_ROW_RESIZE_EVENT = 'afterrowresize';
20098
+ const ROW_RESIZE_CANCEL_EVENT = 'rowresizecancel';
20099
+ class RowResizePlugin extends BasePlugin {
20100
+ static fromGridProperty(revogrid, providers) {
20101
+ const plugin = new RowResizePlugin(revogrid, providers);
20102
+ plugin.controlFromGridProperty();
20103
+ return plugin;
20104
+ }
20105
+ constructor(revogrid, providers, config = {}) {
20106
+ super(revogrid, providers);
20107
+ this.enabled = false;
20108
+ this.gridResizeRow = false;
20109
+ this.gridPlugins = [];
20110
+ this.committedSizes = new Map();
20111
+ this.appliedIndexes = new Map();
20112
+ this.previousBodyCursor = '';
20113
+ this.decorateRow = ({ detail, }) => {
20114
+ if (!this.enabled ||
20115
+ (detail.colType !== 'rowHeaders' && !this.config.fullRow)) {
20116
+ return;
20117
+ }
20118
+ const handle = this.h('div', {
20119
+ 'key': `row-resize-${detail.rowType}-${detail.item.itemIndex}`,
20120
+ 'class': { [ROW_RESIZE_HANDLE_CLASS]: true },
20121
+ 'data-row-resize-index': detail.item.itemIndex,
20122
+ 'aria-hidden': 'true',
20123
+ 'onPointerDown': (event) => this.startResize(event, detail.rowType, detail.item.itemIndex),
20124
+ });
20125
+ detail.node.$children$ = [...(detail.node.$children$ || []), handle];
20126
+ };
20127
+ this.cancelForDataChange = () => this.cancel('data-change');
20128
+ this.onPointerMove = (event) => {
20129
+ const active = this.active;
20130
+ if ((active === null || active === void 0 ? void 0 : active.pointerId) !== event.pointerId) {
20131
+ return;
20132
+ }
20133
+ event.preventDefault();
20134
+ active.lastEvent = event;
20135
+ this.pendingHeight = clampRowResizeHeight(active.startHeight + event.clientY - active.startY, this.config);
20136
+ if (this.animationFrame === undefined) {
20137
+ const view = this.revogrid.ownerDocument.defaultView;
20138
+ this.animationFrame = view === null || view === void 0 ? void 0 : view.requestAnimationFrame(() => {
20139
+ this.animationFrame = undefined;
20140
+ this.flushPendingResize();
20141
+ });
20142
+ }
20143
+ };
20144
+ this.onPointerUp = (event) => {
20145
+ const active = this.active;
20146
+ if ((active === null || active === void 0 ? void 0 : active.pointerId) !== event.pointerId) {
20147
+ return;
20148
+ }
20149
+ event.preventDefault();
20150
+ active.lastEvent = event;
20151
+ this.pendingHeight = clampRowResizeHeight(active.startHeight + event.clientY - active.startY, this.config);
20152
+ this.flushPendingResize();
20153
+ if (this.active !== active) {
20154
+ return;
20155
+ }
20156
+ const detail = this.eventDetail(active, event, active.currentHeight);
20157
+ this.finishGesture();
20158
+ this.commitResize(active);
20159
+ this.emit(AFTER_ROW_RESIZE_EVENT, detail);
20160
+ };
20161
+ this.onPointerCancel = (event) => {
20162
+ var _a;
20163
+ if (((_a = this.active) === null || _a === void 0 ? void 0 : _a.pointerId) === event.pointerId) {
20164
+ this.active.lastEvent = event;
20165
+ this.cancel('pointercancel');
20166
+ }
20167
+ };
20168
+ this.onKeyDown = (event) => {
20169
+ if (event.key === 'Escape' && this.active) {
20170
+ event.preventDefault();
20171
+ this.cancel('escape');
20172
+ }
20173
+ };
20174
+ this.onWindowBlur = () => this.cancel('blur');
20175
+ this.reapplyCommittedSizes = () => this.applyCommittedSizes(false);
20176
+ this.rebuildCommittedSizes = () => this.applyCommittedSizes(true);
20177
+ this.syncAppliedIndexes = () => {
20178
+ for (const [rowType, committed] of this.committedSizes) {
20179
+ const items = this.providers.data.stores[rowType].store.get('items');
20180
+ const indexes = new Set();
20181
+ items.forEach((physicalIndex, virtualIndex) => {
20182
+ if (committed.has(physicalIndex)) {
20183
+ indexes.add(virtualIndex);
20184
+ }
20185
+ });
20186
+ this.appliedIndexes.set(rowType, indexes);
20187
+ }
20188
+ };
20189
+ this.config = resolveRowResizeConfig(config);
20190
+ this.rowDefinitionsRef = revogrid.rowDefinitions;
20191
+ if (new.target !== RowResizePlugin) {
20192
+ this.enabled = true;
20193
+ this.registerEventListeners();
20194
+ }
20195
+ }
20196
+ registerEventListeners() {
20197
+ this.addEventListener('beforerowrender', this.decorateRow);
20198
+ this.addEventListener('beforeanysource', ({ detail }) => {
20199
+ this.cancel('data-change');
20200
+ const committed = this.committedSizes.get(detail.type);
20201
+ if (!committed) {
20202
+ return;
20203
+ }
20204
+ const removedIndexes = new Set();
20205
+ for (const index of committed.keys()) {
20206
+ if (index >= detail.source.length) {
20207
+ committed.delete(index);
20208
+ removedIndexes.add(index);
20209
+ }
20210
+ }
20211
+ if (removedIndexes.size) {
20212
+ const rowDefinitions = this.revogrid.rowDefinitions.filter(definition => definition.type !== detail.type ||
20213
+ !removedIndexes.has(definition.index));
20214
+ this.rowDefinitionsRef = rowDefinitions;
20215
+ this.revogrid.rowDefinitions = rowDefinitions;
20216
+ }
20217
+ });
20218
+ this.addEventListener('afteranysource', this.rebuildCommittedSizes);
20219
+ this.addEventListener('beforesourcesortingapply', this.cancelForDataChange);
20220
+ this.addEventListener('aftersortingapply', this.reapplyCommittedSizes);
20221
+ this.addEventListener('beforefilterapply', this.cancelForDataChange);
20222
+ this.addEventListener('beforerowdefinition', ({ detail }) => {
20223
+ this.cancel('data-change');
20224
+ if (detail.vals !== this.rowDefinitionsRef) {
20225
+ this.committedSizes.clear();
20226
+ this.appliedIndexes.clear();
20227
+ this.rowDefinitionsRef = detail.vals;
20228
+ }
20229
+ });
20230
+ this.addEventListener('afterthemechanged', this.reapplyCommittedSizes);
20231
+ this.addEventListener('aftertrimmed', this.syncAppliedIndexes);
20232
+ this.addEventListener('roworderchange', () => {
20233
+ queueMicrotask(this.reapplyCommittedSizes);
20234
+ });
20235
+ this.addEventListener(GROUP_EXPAND_EVENT, () => {
20236
+ queueMicrotask(this.reapplyCommittedSizes);
20237
+ });
20238
+ this.addEventListener('rowheaderschanged', ({ detail }) => {
20239
+ if (!detail && !this.config.fullRow) {
20240
+ this.cancel('row-headers-hidden');
20241
+ }
20242
+ });
20243
+ }
20244
+ controlFromGridProperty() {
20245
+ this.gridResizeRow = this.revogrid.resizeRow;
20246
+ this.gridPlugins = this.revogrid.plugins;
20247
+ this.syncGridProperty(false);
20248
+ this.watch('resizeRow', value => {
20249
+ this.gridResizeRow = value;
20250
+ this.syncGridProperty();
20251
+ });
20252
+ this.watch('plugins', value => {
20253
+ this.gridPlugins = value || [];
20254
+ this.syncGridProperty();
20255
+ });
20256
+ }
20257
+ syncGridProperty(refresh = true) {
20258
+ const hasConfiguredPlugin = this.gridPlugins.some(plugin => plugin !== RowResizePlugin &&
20259
+ plugin.prototype instanceof RowResizePlugin);
20260
+ const explicitlyEnabled = this.gridPlugins.includes(RowResizePlugin);
20261
+ const enabled = hasConfiguredPlugin
20262
+ ? false
20263
+ : explicitlyEnabled || !!this.gridResizeRow;
20264
+ const config = resolveRowResizeConfig(!hasConfiguredPlugin &&
20265
+ !explicitlyEnabled &&
20266
+ typeof this.gridResizeRow === 'object'
20267
+ ? this.gridResizeRow
20268
+ : undefined);
20269
+ const configChanged = config.minHeight !== this.config.minHeight ||
20270
+ config.maxHeight !== this.config.maxHeight ||
20271
+ config.fullRow !== this.config.fullRow;
20272
+ if (enabled === this.enabled && !configChanged) {
20273
+ return;
20274
+ }
20275
+ this.cancel('config-change');
20276
+ this.config = config;
20277
+ if (enabled !== this.enabled) {
20278
+ this.enabled = enabled;
20279
+ if (enabled) {
20280
+ this.rowDefinitionsRef = this.revogrid.rowDefinitions;
20281
+ this.registerEventListeners();
20282
+ }
20283
+ else {
20284
+ this.clearSubscriptions();
20285
+ }
20286
+ }
20287
+ if (refresh) {
20288
+ queueMicrotask(() => void this.revogrid.refresh());
20289
+ }
20290
+ }
20291
+ startResize(event, rowType, index) {
20292
+ var _a, _b;
20293
+ if (!this.enabled ||
20294
+ this.active ||
20295
+ event.defaultPrevented ||
20296
+ !event.isPrimary ||
20297
+ (event.pointerType !== 'touch' && event.button !== 0)) {
20298
+ return;
20299
+ }
20300
+ const dimension = this.providers.dimension.stores[rowType];
20301
+ const dimensionState = dimension.getCurrentState();
20302
+ const item = getItemByIndex(dimensionState, index);
20303
+ const focusedStore = this.providers.selection.focusedStore;
20304
+ const selectedRowType = focusedStore
20305
+ ? this.providers.selection.storesYToType[focusedStore.position.y]
20306
+ : undefined;
20307
+ const indexes = getRowResizeIndexes({
20308
+ rowType,
20309
+ rowIndex: index,
20310
+ rowCount: dimensionState.count,
20311
+ selectedRange: this.providers.selection.selectedRange,
20312
+ selectedRowType,
20313
+ });
20314
+ if (!indexes.length) {
20315
+ return;
20316
+ }
20317
+ const previousSizes = indexes.reduce((sizes, rowIndex) => {
20318
+ const row = getItemByIndex(dimensionState, rowIndex);
20319
+ sizes[rowIndex] = row.end - row.start;
20320
+ return sizes;
20321
+ }, {});
20322
+ const startHeight = item.end - item.start;
20323
+ const active = {
20324
+ pointerId: event.pointerId,
20325
+ rowType,
20326
+ index,
20327
+ indexes,
20328
+ startY: event.clientY,
20329
+ startHeight,
20330
+ currentHeight: startHeight,
20331
+ previousSizes,
20332
+ originalCustomSizes: Object.assign({}, dimensionState.sizes),
20333
+ startEvent: event,
20334
+ lastEvent: event,
20335
+ };
20336
+ const beforeEvent = this.emit(BEFORE_ROW_RESIZE_EVENT, this.eventDetail(active, event, startHeight));
20337
+ if (beforeEvent.defaultPrevented) {
20338
+ return;
20339
+ }
20340
+ event.preventDefault();
20341
+ event.stopPropagation();
20342
+ this.active = active;
20343
+ const doc = this.revogrid.ownerDocument;
20344
+ this.previousBodyCursor = ((_a = doc.body) === null || _a === void 0 ? void 0 : _a.style.cursor) || '';
20345
+ if (doc.body) {
20346
+ doc.body.style.cursor = 'row-resize';
20347
+ }
20348
+ doc.addEventListener('pointermove', this.onPointerMove, true);
20349
+ doc.addEventListener('pointerup', this.onPointerUp, true);
20350
+ doc.addEventListener('pointercancel', this.onPointerCancel, true);
20351
+ doc.addEventListener('keydown', this.onKeyDown, true);
20352
+ (_b = doc.defaultView) === null || _b === void 0 ? void 0 : _b.addEventListener('blur', this.onWindowBlur);
20353
+ }
20354
+ flushPendingResize() {
20355
+ const active = this.active;
20356
+ if (!active || this.pendingHeight === undefined) {
20357
+ return;
20358
+ }
20359
+ const size = this.pendingHeight;
20360
+ this.pendingHeight = undefined;
20361
+ if (size === active.currentHeight) {
20362
+ return;
20363
+ }
20364
+ this.providers.dimension.setCustomSizes(active.rowType, createRowResizePatch(active.indexes, size), true);
20365
+ active.currentHeight = size;
20366
+ this.emit(ROW_RESIZE_EVENT, this.eventDetail(active, active.lastEvent, size));
20367
+ }
20368
+ cancel(reason) {
20369
+ const active = this.active;
20370
+ if (!active) {
20371
+ return;
20372
+ }
20373
+ const currentSizes = Object.assign({}, this.providers.dimension.stores[active.rowType].store.get('sizes'));
20374
+ for (const index of active.indexes) {
20375
+ if (Object.hasOwn(active.originalCustomSizes, index)) {
20376
+ currentSizes[index] = active.originalCustomSizes[index];
20377
+ }
20378
+ else {
20379
+ delete currentSizes[index];
20380
+ }
20381
+ }
20382
+ this.providers.dimension.setCustomSizes(active.rowType, currentSizes);
20383
+ const detail = Object.assign(Object.assign({}, this.eventDetail(active, active.lastEvent || active.startEvent, active.startHeight)), { reason });
20384
+ this.finishGesture();
20385
+ this.emit(ROW_RESIZE_CANCEL_EVENT, detail);
20386
+ }
20387
+ eventDetail(active, originalEvent, size) {
20388
+ return {
20389
+ rowType: active.rowType,
20390
+ index: active.index,
20391
+ indexes: [...active.indexes],
20392
+ size,
20393
+ previousSizes: Object.assign({}, active.previousSizes),
20394
+ originalEvent,
20395
+ };
20396
+ }
20397
+ commitResize(active) {
20398
+ if (active.currentHeight === active.startHeight) {
20399
+ return;
20400
+ }
20401
+ const items = this.providers.data.stores[active.rowType].store.get('items');
20402
+ let committed = this.committedSizes.get(active.rowType);
20403
+ if (!committed) {
20404
+ committed = new Map();
20405
+ this.committedSizes.set(active.rowType, committed);
20406
+ }
20407
+ let applied = this.appliedIndexes.get(active.rowType);
20408
+ if (!applied) {
20409
+ applied = new Set();
20410
+ this.appliedIndexes.set(active.rowType, applied);
20411
+ }
20412
+ const physicalIndexes = active.indexes.reduce((result, index) => {
20413
+ const physicalIndex = items[index];
20414
+ if (physicalIndex !== undefined) {
20415
+ committed.set(physicalIndex, active.currentHeight);
20416
+ applied.add(index);
20417
+ result.push(physicalIndex);
20418
+ }
20419
+ return result;
20420
+ }, []);
20421
+ if (physicalIndexes.length) {
20422
+ const rowDefinitions = mergeRowResizeDefinitions(this.revogrid.rowDefinitions, active.rowType, physicalIndexes, active.currentHeight);
20423
+ this.rowDefinitionsRef = rowDefinitions;
20424
+ this.revogrid.rowDefinitions = rowDefinitions;
20425
+ }
20426
+ }
20427
+ applyCommittedSizes(clearAppliedIndexes) {
20428
+ for (const [rowType, committed] of this.committedSizes) {
20429
+ const dimension = this.providers.dimension.stores[rowType];
20430
+ const sizes = Object.assign({}, dimension.store.get('sizes'));
20431
+ if (clearAppliedIndexes) {
20432
+ for (const index of this.appliedIndexes.get(rowType) || []) {
20433
+ delete sizes[index];
20434
+ }
20435
+ }
20436
+ const items = this.providers.data.stores[rowType].store.get('items');
20437
+ const indexes = new Set();
20438
+ items.forEach((physicalIndex, virtualIndex) => {
20439
+ const size = committed.get(physicalIndex);
20440
+ if (size !== undefined) {
20441
+ sizes[virtualIndex] = size;
20442
+ indexes.add(virtualIndex);
20443
+ }
20444
+ });
20445
+ this.appliedIndexes.set(rowType, indexes);
20446
+ this.providers.dimension.setCustomSizes(rowType, sizes);
20447
+ }
20448
+ }
20449
+ finishGesture() {
20450
+ const doc = this.revogrid.ownerDocument;
20451
+ const view = doc.defaultView;
20452
+ if (this.animationFrame !== undefined) {
20453
+ view === null || view === void 0 ? void 0 : view.cancelAnimationFrame(this.animationFrame);
20454
+ }
20455
+ doc.removeEventListener('pointermove', this.onPointerMove, true);
20456
+ doc.removeEventListener('pointerup', this.onPointerUp, true);
20457
+ doc.removeEventListener('pointercancel', this.onPointerCancel, true);
20458
+ doc.removeEventListener('keydown', this.onKeyDown, true);
20459
+ view === null || view === void 0 ? void 0 : view.removeEventListener('blur', this.onWindowBlur);
20460
+ if (doc.body) {
20461
+ doc.body.style.cursor = this.previousBodyCursor;
20462
+ }
20463
+ this.animationFrame = undefined;
20464
+ this.pendingHeight = undefined;
20465
+ this.active = undefined;
20466
+ }
20467
+ destroy() {
20468
+ this.cancel('destroy');
20469
+ super.destroy();
20470
+ }
20471
+ }
20472
+
19837
20473
  const revoGridStyleCss = () => `revo-grid:is([theme=default],[theme=dark]),revo-grid:not([theme]){--rg-theme-font-family:var( --revo-grid-font-family, Helvetica, Arial, Sans-Serif, serif );--rg-theme-font-size:var(--revo-grid-font-size, 12px);--rg-theme-header-height:var(--revo-grid-header-height, 30px);--rg-theme-header-font-size:var(--revo-grid-header-font-size, 12px);--rg-theme-header-font-weight:var(--revo-grid-header-font-weight, normal);--rg-theme-header-text-transform:var( --revo-grid-header-text-transform, uppercase );--rg-theme-header-text-align:var(--revo-grid-header-text-align, center);--rg-theme-cell-text-align:var(--revo-grid-cell-text-align, left);--rg-theme-header-padding:var(--revo-grid-header-padding, 0);--rg-theme-cell-padding:var(--revo-grid-cell-padding, 0 4px);border:1px solid var(--rg-theme-header-border);font-size:var(--rg-theme-font-size)}revo-grid:is([theme=default],[theme=dark]) .rowHeaders revogr-header,revo-grid:not([theme]) .rowHeaders revogr-header{box-shadow:-1px 0 0 0 var(--rg-theme-header-border) inset}revo-grid:is([theme=default],[theme=dark]) revogr-header,revo-grid:not([theme]) revogr-header{text-align:var(--rg-theme-header-text-align);line-height:var(--rg-theme-header-height);background-color:var(--rg-theme-header-bg)}revo-grid:is([theme=default],[theme=dark]) revogr-header .group-rgRow,revo-grid:not([theme]) revogr-header .group-rgRow{box-shadow:none}revo-grid:is([theme=default],[theme=dark]) revogr-header .group-rgRow .rgHeaderCell,revo-grid:not([theme]) revogr-header .group-rgRow .rgHeaderCell{box-shadow:-1px 0 0 0 var(--rg-theme-header-border), -1px 0 0 0 var(--rg-theme-header-border) inset, 0 -1px 0 0 var(--rg-theme-header-border), 0 -1px 0 0 var(--rg-theme-header-border) inset}revo-grid:is([theme=default],[theme=dark]) revogr-header .header-rgRow,revo-grid:is([theme=default],[theme=dark]) revogr-header .group-rgRow,revo-grid:not([theme]) revogr-header .header-rgRow,revo-grid:not([theme]) revogr-header .group-rgRow{text-transform:var(--rg-theme-header-text-transform);font-size:var(--rg-theme-header-font-size);font-weight:var(--rg-theme-header-font-weight);color:var(--rg-theme-header-color)}revo-grid:is([theme=default],[theme=dark]) revogr-header .header-rgRow,revo-grid:not([theme]) revogr-header .header-rgRow{height:var(--rg-theme-header-height);box-shadow:0 -1px 0 0 var(--rg-theme-header-border) inset}revo-grid:is([theme=default],[theme=dark]) revogr-header .rgHeaderCell,revo-grid:not([theme]) revogr-header .rgHeaderCell{box-shadow:-1px 0 0 0 var(--rg-theme-header-border) inset, 0 -1px 0 0 var(--rg-theme-header-border), 0 -1px 0 0 var(--rg-theme-header-border) inset}revo-grid:is([theme=default],[theme=dark]) .rowHeaders,revo-grid:not([theme]) .rowHeaders{background-color:var(--rg-theme-row-headers-bg)}revo-grid:is([theme=default],[theme=dark]) .rowHeaders revogr-data .rgCell,revo-grid:not([theme]) .rowHeaders revogr-data .rgCell{color:var(--rg-theme-row-headers-color)}revo-grid:is([theme=default],[theme=dark]) .rowHeaders revogr-data .rgCell:first-child,revo-grid:not([theme]) .rowHeaders revogr-data .rgCell:first-child{box-shadow:0 -1px 0 0 var(--rg-theme-header-border) inset}revo-grid:is([theme=default],[theme=dark]) .rowHeaders revogr-data .rgCell:not(:first-child),revo-grid:not([theme]) .rowHeaders revogr-data .rgCell:not(:first-child){box-shadow:0 -1px 0 0 var(--rg-theme-header-border) inset, -1px 0 0 0 var(--rg-theme-header-border) inset}revo-grid:is([theme=default],[theme=dark]) .rowHeaders revogr-data .rgCell:last-child,revo-grid:not([theme]) .rowHeaders revogr-data .rgCell:last-child{border-right:1px solid var(--rg-theme-header-border)}revo-grid:is([theme=default],[theme=dark]) .rowHeaders revogr-data revogr-header,revo-grid:not([theme]) .rowHeaders revogr-data revogr-header{box-shadow:0 -1px 0 0 var(--rg-theme-header-border) inset}revo-grid:is([theme=default],[theme=dark]) revogr-viewport-scroll.colPinStart revogr-data .rgRow .rgCell:last-child,revo-grid:not([theme]) revogr-viewport-scroll.colPinStart revogr-data .rgRow .rgCell:last-child{box-shadow:0 -1px 0 0 var(--rg-theme-cell-border) inset, -1px 0 0 0 var(--rg-theme-header-border) inset}revo-grid:is([theme=default],[theme=dark]) revogr-viewport-scroll.colPinStart .footer-wrapper revogr-data .rgRow:first-child .rgCell,revo-grid:not([theme]) revogr-viewport-scroll.colPinStart .footer-wrapper revogr-data .rgRow:first-child .rgCell{box-shadow:0 1px 0 0 var(--rg-theme-header-border) inset, -1px 0 0 0 var(--rg-theme-header-border) inset}revo-grid:is([theme=default],[theme=dark]) revogr-viewport-scroll.colPinEnd,revo-grid:is([theme=default],[theme=dark]) revogr-viewport-scroll.colPinEnd revogr-header,revo-grid:not([theme]) revogr-viewport-scroll.colPinEnd,revo-grid:not([theme]) revogr-viewport-scroll.colPinEnd revogr-header{box-shadow:1px 0 0 var(--rg-theme-header-border) inset}revo-grid:is([theme=default],[theme=dark]) .footer-wrapper revogr-data .rgRow:first-child .rgCell,revo-grid:not([theme]) .footer-wrapper revogr-data .rgRow:first-child .rgCell{box-shadow:0 1px 0 0 var(--rg-theme-cell-border) inset, -1px 0 0 0 var(--rg-theme-cell-border) inset, 0 -1px 0 0 var(--rg-theme-cell-border) inset}revo-grid:is([theme=default],[theme=dark]) revogr-data,revo-grid:not([theme]) revogr-data{text-align:var(--rg-theme-cell-text-align)}revo-grid:is([theme=default],[theme=dark]) revogr-data .revo-draggable,revo-grid:not([theme]) revogr-data .revo-draggable{float:left}revo-grid:is([theme=default],[theme=dark]) revogr-data .rgRow,revo-grid:not([theme]) revogr-data .rgRow{line-height:var(--rg-theme-row-size, 27px)}revo-grid:is([theme=default],[theme=dark]) revogr-data .rgCell,revo-grid:not([theme]) revogr-data .rgCell{padding:var(--rg-theme-cell-padding);box-shadow:0 -1px 0 0 var(--rg-theme-cell-border) inset, -1px 0 0 0 var(--rg-theme-cell-border) inset}revo-grid:is([theme=material],[theme=darkMaterial]),revo-grid[theme]:not([theme=default],[theme=dark],[theme=compact],[theme=darkCompact]){--rg-theme-font-family:var( --revo-grid-font-family, Nunito, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol' );--rg-theme-header-height:var(--revo-grid-header-height, 50px);--rg-theme-header-font-size:var( --revo-grid-header-font-size, var(--rg-theme-font-size) );--rg-theme-header-font-weight:var(--revo-grid-header-font-weight, 600);--rg-theme-header-text-transform:var( --revo-grid-header-text-transform, none );--rg-theme-header-text-align:var(--revo-grid-header-text-align, left);--rg-theme-cell-text-align:var(--revo-grid-cell-text-align, left);--rg-theme-header-padding:var(--revo-grid-header-padding, 0 15px);--rg-theme-cell-padding:var(--revo-grid-cell-padding, 0 15px);font-family:var(--rg-theme-font-family)}revo-grid:is([theme=material],[theme=darkMaterial]) revogr-header,revo-grid[theme]:not([theme=default],[theme=dark],[theme=compact],[theme=darkCompact]) revogr-header{color:var(--rg-theme-header-color);background-color:var(--rg-theme-header-bg);line-height:var(--rg-theme-header-height);font-size:var(--rg-theme-header-font-size);font-weight:var(--rg-theme-header-font-weight);text-transform:var(--rg-theme-header-text-transform);text-align:var(--rg-theme-header-text-align)}revo-grid:is([theme=material],[theme=darkMaterial]) revogr-header .rgHeaderCell,revo-grid[theme]:not([theme=default],[theme=dark],[theme=compact],[theme=darkCompact]) revogr-header .rgHeaderCell{padding:var(--rg-theme-header-padding);text-overflow:ellipsis}revo-grid:is([theme=material],[theme=darkMaterial]) revogr-header .header-rgRow,revo-grid[theme]:not([theme=default],[theme=dark],[theme=compact],[theme=darkCompact]) revogr-header .header-rgRow{height:var(--rg-theme-header-height)}revo-grid:is([theme=material],[theme=darkMaterial]) .rowHeaders,revo-grid[theme]:not([theme=default],[theme=dark],[theme=compact],[theme=darkCompact]) .rowHeaders{color:var(--rg-theme-row-headers-color);background-color:var(--rg-theme-row-headers-bg)}revo-grid:is([theme=material],[theme=darkMaterial]) .rowHeaders revogr-data .rgCell,revo-grid[theme]:not([theme=default],[theme=dark],[theme=compact],[theme=darkCompact]) .rowHeaders revogr-data .rgCell{color:var(--rg-theme-row-headers-color)}revo-grid:is([theme=material],[theme=darkMaterial]) revogr-data,revo-grid[theme]:not([theme=default],[theme=dark],[theme=compact],[theme=darkCompact]) revogr-data{text-align:var(--rg-theme-cell-text-align)}revo-grid:is([theme=material],[theme=darkMaterial]) revogr-data .rgRow,revo-grid[theme]:not([theme=default],[theme=dark],[theme=compact],[theme=darkCompact]) revogr-data .rgRow{line-height:var(--rg-theme-row-size, 42px)}revo-grid:is([theme=material],[theme=darkMaterial]) revogr-data .rgCell,revo-grid[theme]:not([theme=default],[theme=dark],[theme=compact],[theme=darkCompact]) revogr-data .rgCell{padding:var(--rg-theme-cell-padding);box-shadow:-1px 0 0 0 var(--rg-theme-cell-vertical-border) inset}revo-grid:is([theme=compact],[theme=darkCompact]){--rg-theme-font-family:var( --revo-grid-font-family, Nunito, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol' );--rg-theme-header-height:var(--revo-grid-header-height, 45px);--rg-theme-header-font-size:var( --revo-grid-header-font-size, var(--rg-theme-font-size) );--rg-theme-header-font-weight:var(--revo-grid-header-font-weight, 600);--rg-theme-header-text-transform:var( --revo-grid-header-text-transform, none );--rg-theme-header-text-align:var(--revo-grid-header-text-align, left);--rg-theme-cell-text-align:var(--revo-grid-cell-text-align, left);--rg-theme-header-padding:var(--revo-grid-header-padding, 0 15px);--rg-theme-cell-padding:var(--revo-grid-cell-padding, 0 15px);font-family:var(--rg-theme-font-family)}revo-grid:is([theme=compact],[theme=darkCompact]) revogr-header{color:var(--rg-theme-header-color);background-color:var(--rg-theme-header-bg);line-height:var(--rg-theme-header-height);font-size:var(--rg-theme-header-font-size);font-weight:var(--rg-theme-header-font-weight);text-transform:var(--rg-theme-header-text-transform);text-align:var(--rg-theme-header-text-align)}revo-grid:is([theme=compact],[theme=darkCompact]) revogr-header .rgHeaderCell{padding:var(--rg-theme-header-padding);text-overflow:ellipsis}revo-grid:is([theme=compact],[theme=darkCompact]) revogr-header .header-rgRow{height:var(--rg-theme-header-height)}revo-grid:is([theme=compact],[theme=darkCompact]) .rowHeaders{color:var(--rg-theme-row-headers-color);background-color:var(--rg-theme-row-headers-bg)}revo-grid:is([theme=compact],[theme=darkCompact]) .rowHeaders revogr-data .rgCell{color:var(--rg-theme-row-headers-color)}revo-grid:is([theme=compact],[theme=darkCompact]) revogr-data{text-align:var(--rg-theme-cell-text-align)}revo-grid:is([theme=compact],[theme=darkCompact]) revogr-data .rgRow{line-height:var(--rg-theme-row-size, 32px)}revo-grid:is([theme=compact],[theme=darkCompact]) revogr-data .rgCell{padding:var(--rg-theme-cell-padding);box-shadow:-1px 0 0 0 var(--rg-theme-cell-vertical-border) inset}revo-grid:is([theme=compact],[theme=darkCompact]) revo-dropdown .rv-dr-root{padding:0px 9px}revo-grid[dir=rtl] .viewports{flex-direction:row-reverse}revo-grid[dir=rtl] revogr-header .rgHeaderCell{text-align:right}revo-grid[dir=rtl] revogr-data .rgCell{text-align:right}revo-grid[dir=rtl] .rowHeaders revogr-data .rgCell{text-align:right}revo-grid[dir=rtl] revogr-filter-panel{direction:rtl}revo-grid[dir=rtl] revo-dropdown .rv-dr-root{text-align:right}revo-grid[dir=rtl] .drag-position{right:0;left:auto}revo-grid[dir=rtl] .drag-auto-scroll-y{right:0;left:auto}revo-grid[dir=rtl] .clipboard{right:0;left:auto}revo-grid[dir=rtl] .draggable{margin-left:-20px;margin-right:0;padding-right:20px;padding-left:5px}revo-grid[dir=rtl] .draggable .revo-alt-icon{right:5px;left:auto}revo-grid[dir=rtl] .focused-cell{border-right:2px solid var(--rg-theme-primary);border-left:none}revo-grid[dir=rtl] .selection-range{border-right:2px solid var(--rg-theme-primary);border-left:none}revo-grid[dir=rtl] .resize-handle{right:0;left:auto}revo-grid[dir=rtl] .sort-indicator{margin-left:0;margin-right:5px}revo-grid[dir=rtl] .filter-button{margin-left:0;margin-right:5px}revo-grid[dir=rtl] .group-expand{margin-right:0;margin-left:2px;padding-right:5px;padding-left:0}revo-grid[dir=rtl] .rgCell,revo-grid[dir=rtl] .rgHeaderCell{padding-left:5px;padding-right:5px}revo-grid[dir=rtl] revogr-edit{direction:rtl}revo-grid[dir=rtl] .rgHeaderCell{direction:rtl}revo-grid[dir=rtl] revogr-header,revo-grid[dir=rtl] revogr-data{text-align:right}revo-grid[dir=rtl]:is([theme=default],[theme=dark]) .rowHeaders,revo-grid[dir=rtl]:not([theme]) .rowHeaders{background-color:var(--rg-theme-row-headers-bg)}revo-grid[dir=rtl]:is([theme=default],[theme=dark]) .rowHeaders revogr-data .rgCell,revo-grid[dir=rtl]:not([theme]) .rowHeaders revogr-data .rgCell{color:var(--rg-theme-row-headers-color)}revo-grid[dir=rtl]:is([theme=default],[theme=dark]) .rowHeaders revogr-data .rgCell:first-child,revo-grid[dir=rtl]:not([theme]) .rowHeaders revogr-data .rgCell:first-child{box-shadow:0 -1px 0 0 var(--rg-theme-header-border) inset}revo-grid[dir=rtl]:is([theme=default],[theme=dark]) .rowHeaders revogr-data .rgCell:not(:first-child),revo-grid[dir=rtl]:not([theme]) .rowHeaders revogr-data .rgCell:not(:first-child){box-shadow:0 -1px 0 0 var(--rg-theme-header-border) inset, 1px 0 0 0 var(--rg-theme-header-border) inset}revo-grid[dir=rtl]:is([theme=default],[theme=dark]) .rowHeaders revogr-data .rgCell:last-child,revo-grid[dir=rtl]:not([theme]) .rowHeaders revogr-data .rgCell:last-child{border-left:1px solid var(--rg-theme-header-border);border-right:none}revo-grid[dir=rtl]:is([theme=default],[theme=dark]) .rowHeaders revogr-data revogr-header,revo-grid[dir=rtl]:not([theme]) .rowHeaders revogr-data revogr-header{box-shadow:0 -1px 0 0 var(--rg-theme-header-border) inset}revo-grid[dir=rtl]:is([theme=default],[theme=dark]) revogr-header,revo-grid[dir=rtl]:not([theme]) revogr-header{text-align:right}revo-grid[dir=rtl]:is([theme=default],[theme=dark]) revogr-data,revo-grid[dir=rtl]:not([theme]) revogr-data{text-align:right}.revo-drag-icon{width:11px;opacity:0.8}.revo-drag-icon::before{content:"::";display:inline-block}.revo-alt-icon{-webkit-mask-image:url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg viewBox='0 0 384 383' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cg%3E%3Cpath d='M192.4375,383 C197.424479,383 201.663411,381.254557 205.154297,377.763672 L205.154297,377.763672 L264.25,318.667969 C270.234375,312.683594 271.605794,306.075846 268.364258,298.844727 C265.122721,291.613607 259.51237,287.998047 251.533203,287.998047 L251.533203,287.998047 L213.382812,287.998047 L213.382812,212.445312 L288.935547,212.445312 L288.935547,250.595703 C288.935547,258.57487 292.551107,264.185221 299.782227,267.426758 C307.013346,270.668294 313.621094,269.296875 319.605469,263.3125 L319.605469,263.3125 L378.701172,204.216797 C382.192057,200.725911 383.9375,196.486979 383.9375,191.5 C383.9375,186.513021 382.192057,182.274089 378.701172,178.783203 L378.701172,178.783203 L319.605469,119.6875 C313.621094,114.201823 307.013346,112.955078 299.782227,115.947266 C292.551107,118.939453 288.935547,124.42513 288.935547,132.404297 L288.935547,132.404297 L288.935547,170.554688 L213.382812,170.554688 L213.382812,95.0019531 L251.533203,95.0019531 C259.51237,95.0019531 264.998047,91.3863932 267.990234,84.1552734 C270.982422,76.9241536 269.735677,70.3164062 264.25,64.3320312 L264.25,64.3320312 L205.154297,5.23632812 C201.663411,1.74544271 197.424479,0 192.4375,0 C187.450521,0 183.211589,1.74544271 179.720703,5.23632812 L179.720703,5.23632812 L120.625,64.3320312 C114.640625,70.3164062 113.269206,76.9241536 116.510742,84.1552734 C119.752279,91.3863932 125.36263,95.0019531 133.341797,95.0019531 L133.341797,95.0019531 L171.492188,95.0019531 L171.492188,170.554688 L95.9394531,170.554688 L95.9394531,132.404297 C95.9394531,124.42513 92.3238932,118.814779 85.0927734,115.573242 C77.8616536,112.331706 71.2539062,113.703125 65.2695312,119.6875 L65.2695312,119.6875 L6.17382812,178.783203 C2.68294271,182.274089 0.9375,186.513021 0.9375,191.5 C0.9375,196.486979 2.68294271,200.725911 6.17382812,204.216797 L6.17382812,204.216797 L65.2695312,263.3125 C71.2539062,268.798177 77.8616536,270.044922 85.0927734,267.052734 C92.3238932,264.060547 95.9394531,258.57487 95.9394531,250.595703 L95.9394531,250.595703 L95.9394531,212.445312 L171.492188,212.445312 L171.492188,287.998047 L133.341797,287.998047 C125.36263,287.998047 119.876953,291.613607 116.884766,298.844727 C113.892578,306.075846 115.139323,312.683594 120.625,318.667969 L120.625,318.667969 L179.720703,377.763672 C183.211589,381.254557 187.450521,383 192.4375,383 Z'%3E%3C/path%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg viewBox='0 0 384 383' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cg%3E%3Cpath d='M192.4375,383 C197.424479,383 201.663411,381.254557 205.154297,377.763672 L205.154297,377.763672 L264.25,318.667969 C270.234375,312.683594 271.605794,306.075846 268.364258,298.844727 C265.122721,291.613607 259.51237,287.998047 251.533203,287.998047 L251.533203,287.998047 L213.382812,287.998047 L213.382812,212.445312 L288.935547,212.445312 L288.935547,250.595703 C288.935547,258.57487 292.551107,264.185221 299.782227,267.426758 C307.013346,270.668294 313.621094,269.296875 319.605469,263.3125 L319.605469,263.3125 L378.701172,204.216797 C382.192057,200.725911 383.9375,196.486979 383.9375,191.5 C383.9375,186.513021 382.192057,182.274089 378.701172,178.783203 L378.701172,178.783203 L319.605469,119.6875 C313.621094,114.201823 307.013346,112.955078 299.782227,115.947266 C292.551107,118.939453 288.935547,124.42513 288.935547,132.404297 L288.935547,132.404297 L288.935547,170.554688 L213.382812,170.554688 L213.382812,95.0019531 L251.533203,95.0019531 C259.51237,95.0019531 264.998047,91.3863932 267.990234,84.1552734 C270.982422,76.9241536 269.735677,70.3164062 264.25,64.3320312 L264.25,64.3320312 L205.154297,5.23632812 C201.663411,1.74544271 197.424479,0 192.4375,0 C187.450521,0 183.211589,1.74544271 179.720703,5.23632812 L179.720703,5.23632812 L120.625,64.3320312 C114.640625,70.3164062 113.269206,76.9241536 116.510742,84.1552734 C119.752279,91.3863932 125.36263,95.0019531 133.341797,95.0019531 L133.341797,95.0019531 L171.492188,95.0019531 L171.492188,170.554688 L95.9394531,170.554688 L95.9394531,132.404297 C95.9394531,124.42513 92.3238932,118.814779 85.0927734,115.573242 C77.8616536,112.331706 71.2539062,113.703125 65.2695312,119.6875 L65.2695312,119.6875 L6.17382812,178.783203 C2.68294271,182.274089 0.9375,186.513021 0.9375,191.5 C0.9375,196.486979 2.68294271,200.725911 6.17382812,204.216797 L6.17382812,204.216797 L65.2695312,263.3125 C71.2539062,268.798177 77.8616536,270.044922 85.0927734,267.052734 C92.3238932,264.060547 95.9394531,258.57487 95.9394531,250.595703 L95.9394531,250.595703 L95.9394531,212.445312 L171.492188,212.445312 L171.492188,287.998047 L133.341797,287.998047 C125.36263,287.998047 119.876953,291.613607 116.884766,298.844727 C113.892578,306.075846 115.139323,312.683594 120.625,318.667969 L120.625,318.667969 L179.720703,377.763672 C183.211589,381.254557 187.450521,383 192.4375,383 Z'%3E%3C/path%3E%3C/g%3E%3C/svg%3E");width:11px;height:11px;background-size:cover;background-repeat:no-repeat}.arrow-down{position:absolute;right:5px;top:0}.arrow-down svg{width:8px;margin-top:5px;margin-left:5px;opacity:0.4}.cell-value-wrapper{margin-right:10px;overflow:hidden;text-overflow:ellipsis}revo-grid[theme]:is([theme=compact],[theme=darkCompact],[theme=material],[theme=darkMaterial]){background-color:transparent}revo-grid[theme]:is([theme=compact],[theme=darkCompact],[theme=material],[theme=darkMaterial]) revogr-header,revo-grid[theme]:is([theme=compact],[theme=darkCompact],[theme=material],[theme=darkMaterial]) .rowHeaders{background-color:transparent;color:inherit}revo-grid[theme]:is([theme=compact],[theme=darkCompact],[theme=material],[theme=darkMaterial]) .rowHeaders revogr-data .rgCell{color:inherit}revo-grid{--rg-theme-primary:var(--revo-grid-primary, #266ae8);--rg-theme-primary-transparent:var( --revo-grid-primary-transparent, rgba(38, 106, 232, 0.9) );--rg-theme-background:var(--revo-grid-background, #fff);--rg-theme-foreground:var(--revo-grid-foreground, black);--rg-theme-divider:var(--revo-grid-divider, gray);--rg-theme-shadow:var(--revo-grid-shadow, rgba(0, 0, 0, 0.15));--rg-theme-text:var(--revo-grid-text, black);--rg-theme-border:var(--revo-grid-border, rgba(0, 0, 0, 0.2));--rg-theme-header-bg:var(--revo-grid-header-bg, #f8f9fa);--rg-theme-header-color:var(--revo-grid-header-color, #000);--rg-theme-header-border:var(--revo-grid-header-border, #cecece);--rg-theme-header-focused-bg:var( --revo-grid-header-focused-bg, var(--rg-theme-focused-bg) );--rg-theme-header-hover-bg:var( --revo-grid-header-hover-bg, var(--rg-theme-row-hover) );--rg-theme-cell-border:var(--revo-grid-cell-border, #e2e3e3);--rg-theme-cell-vertical-border:var( --revo-grid-cell-vertical-border, transparent );--rg-theme-focused-bg:var(--revo-grid-focused-bg, rgba(233, 234, 237, 0.5));--rg-theme-row-hover:var(--revo-grid-row-hover, #f1f1f1);--rg-theme-row-headers-bg:var( --revo-grid-row-headers-bg, var(--rg-theme-header-bg) );--rg-theme-row-headers-color:var( --revo-grid-row-headers-color, var(--rg-theme-header-color) );--rg-theme-cell-disabled-bg:var( --revo-grid-cell-disabled-bg, rgba(0, 0, 0, 0.07) );--rg-theme-filter-panel-bg:var(--revo-grid-filter-panel-bg, #fff);--rg-theme-filter-panel-border:var(--revo-grid-filter-panel-border, #d9d9d9);--rg-theme-filter-panel-shadow:var( --revo-grid-filter-panel-shadow, rgba(0, 0, 0, 0.15) );--rg-theme-filter-panel-input-bg:var( --revo-grid-filter-panel-input-bg, #eaeaeb );--rg-theme-filter-panel-divider:var( --revo-grid-filter-panel-divider, #d9d9d9 );--rg-theme-filter-panel-select-border:var( --revo-grid-filter-panel-select-border, transparent );--rg-theme-filter-panel-select-border-hover:var( --revo-grid-filter-panel-select-border-hover, transparent );--rg-theme-filter-panel-reorder-accent:var( --revo-grid-filter-panel-reorder-accent, #007cb2 );--rg-theme-filter-panel-reorder-color:var( --revo-grid-filter-panel-reorder-color, #6b7280 );--rg-theme-filter-panel-text:var( --revo-grid-filter-panel-text, var(--rg-theme-text) );--rg-theme-filter-panel-muted-text:var( --revo-grid-filter-panel-muted-text, gray );--rg-theme-filter-panel-focus-ring:var( --revo-grid-filter-panel-focus-ring, 0 0 1px 3px rgba(59, 153, 252, 0.7) );--rg-theme-filter-panel-icon:var(--revo-grid-filter-panel-icon, gray);--rg-theme-filter-panel-icon-active:var( --revo-grid-filter-panel-icon-active, #10224a );--rg-theme-font-family:var( --revo-grid-font-family, Helvetica, Arial, Sans-Serif, serif );--rg-theme-font-size:var(--revo-grid-font-size, 14px);--rg-theme-header-height:var(--revo-grid-header-height, 30px);--rg-theme-header-font-size:var(--revo-grid-header-font-size, 12px);--rg-theme-header-font-weight:var(--revo-grid-header-font-weight, normal);--rg-theme-header-text-transform:var( --revo-grid-header-text-transform, uppercase );--rg-theme-header-text-align:var(--revo-grid-header-text-align, center);--rg-theme-cell-text-align:var(--revo-grid-cell-text-align, center);--rg-theme-header-padding:var(--revo-grid-header-padding, 0);--rg-theme-cell-padding:var(--revo-grid-cell-padding, 0);--rg-theme-selection-border:var(--revo-grid-selection-border, #0d63e8);--rg-theme-selection-bg:var(--revo-grid-selection-bg, transparent);--rg-theme-autofill-handle-bg:var( --revo-grid-autofill-handle-bg, var(--rg-theme-selection-border) );--rg-theme-autofill-handle-border:var( --revo-grid-autofill-handle-border, white );--rg-theme-range-handle-bg:var( --revo-grid-range-handle-bg, rgba(0, 0, 0, 0.2) );--rg-theme-temporary-range-border:var( --revo-grid-temporary-range-border, rgb(255, 94, 0) );--rg-theme-temporary-selection-border:var( --revo-grid-temporary-selection-border, gray );--rg-theme-header-resize-hover:var( --revo-grid-header-resize-hover, deepskyblue );--rg-theme-button-text:var(--revo-grid-button-text, #fff);--rg-theme-button-bg:var(--revo-grid-button-bg, #4545ff);--rg-theme-button-success-bg:var(--revo-grid-button-success-bg, #009037);--rg-theme-button-danger-bg:var(--revo-grid-button-danger-bg, #e0662e);--rg-theme-button-outline-border:var( --revo-grid-button-outline-border, #dbdbdb );--rg-theme-button-outline-text:var(--revo-grid-button-outline-text, #000)}revo-grid[data-rg-theme-scheme=dark]{color-scheme:dark;--rg-theme-background:var(--revo-grid-background, #212529);--rg-theme-foreground:var(--revo-grid-foreground, #fff);--rg-theme-text:var(--revo-grid-text, rgba(255, 255, 255, 0.9));--rg-theme-divider:var(--revo-grid-divider, #505050);--rg-theme-border:var( --revo-grid-border, rgba(255, 255, 255, 0.2) );--rg-theme-filter-panel-bg:var(--revo-grid-filter-panel-bg, #212529);--rg-theme-filter-panel-border:var( --revo-grid-filter-panel-border, #505050 );--rg-theme-filter-panel-input-bg:var( --revo-grid-filter-panel-input-bg, #343a40 );--rg-theme-filter-panel-divider:var( --revo-grid-filter-panel-divider, #505050 );--rg-theme-filter-panel-icon-active:var( --revo-grid-filter-panel-icon-active, #fff );--rg-theme-header-bg:var(--revo-grid-header-bg, #343a40);--rg-theme-header-color:var(--revo-grid-header-color, #fff);--rg-theme-header-border:var(--revo-grid-header-border, #505050);--rg-theme-cell-border:var(--revo-grid-cell-border, #424242);--rg-theme-focused-bg:var( --revo-grid-focused-bg, rgba(52, 58, 64, 0.5) );--rg-theme-row-hover:var( --revo-grid-row-hover, rgba(80, 80, 80, 0.5) );--rg-theme-row-headers-bg:var( --revo-grid-row-headers-bg, rgba(52, 58, 64, 0.8) );--rg-theme-row-headers-color:var( --revo-grid-row-headers-color, rgba(255, 255, 255, 0.8) );--rg-theme-cell-disabled-bg:var( --revo-grid-cell-disabled-bg, rgba(255, 255, 255, 0.07) );--rg-theme-button-outline-border:var( --revo-grid-button-outline-border, #404040 );--rg-theme-button-outline-text:var( --revo-grid-button-outline-text, #d8d8d8 )}revo-grid[data-rg-theme-scheme=light]{color-scheme:light}revo-grid{}revo-grid>*{--revo-grid-primary:var(--rg-theme-primary);--revo-grid-primary-transparent:var(--rg-theme-primary-transparent);--revo-grid-background:var(--rg-theme-background);--revo-grid-foreground:var(--rg-theme-foreground);--revo-grid-divider:var(--rg-theme-divider);--revo-grid-shadow:var(--rg-theme-shadow);--revo-grid-text:var(--rg-theme-text);--revo-grid-border:var(--rg-theme-border);--revo-grid-header-bg:var(--rg-theme-header-bg);--revo-grid-header-color:var(--rg-theme-header-color);--revo-grid-header-border:var(--rg-theme-header-border);--revo-grid-header-focused-bg:var(--rg-theme-header-focused-bg);--revo-grid-header-hover-bg:var(--rg-theme-header-hover-bg);--revo-grid-cell-border:var(--rg-theme-cell-border);--revo-grid-cell-vertical-border:var(--rg-theme-cell-vertical-border);--revo-grid-focused-bg:var(--rg-theme-focused-bg);--revo-grid-row-hover:var(--rg-theme-row-hover);--revo-grid-row-headers-bg:var(--rg-theme-row-headers-bg);--revo-grid-row-headers-color:var(--rg-theme-row-headers-color);--revo-grid-cell-disabled-bg:var(--rg-theme-cell-disabled-bg);--revo-grid-filter-panel-bg:var(--rg-theme-filter-panel-bg);--revo-grid-filter-panel-border:var(--rg-theme-filter-panel-border);--revo-grid-filter-panel-shadow:var(--rg-theme-filter-panel-shadow);--revo-grid-filter-panel-input-bg:var(--rg-theme-filter-panel-input-bg);--revo-grid-filter-panel-divider:var(--rg-theme-filter-panel-divider);--revo-grid-filter-panel-select-border:var(--rg-theme-filter-panel-select-border);--revo-grid-filter-panel-select-border-hover:var(--rg-theme-filter-panel-select-border-hover);--revo-grid-filter-panel-reorder-accent:var(--rg-theme-filter-panel-reorder-accent);--revo-grid-filter-panel-reorder-color:var(--rg-theme-filter-panel-reorder-color);--revo-grid-filter-panel-text:var(--rg-theme-filter-panel-text);--revo-grid-filter-panel-muted-text:var(--rg-theme-filter-panel-muted-text);--revo-grid-filter-panel-focus-ring:var(--rg-theme-filter-panel-focus-ring);--revo-grid-filter-panel-icon:var(--rg-theme-filter-panel-icon);--revo-grid-filter-panel-icon-active:var(--rg-theme-filter-panel-icon-active);--revo-grid-font-family:var(--rg-theme-font-family);--revo-grid-font-size:var(--rg-theme-font-size);--revo-grid-header-height:var(--rg-theme-header-height);--revo-grid-header-font-size:var(--rg-theme-header-font-size);--revo-grid-header-font-weight:var(--rg-theme-header-font-weight);--revo-grid-header-text-transform:var(--rg-theme-header-text-transform);--revo-grid-header-text-align:var(--rg-theme-header-text-align);--revo-grid-cell-text-align:var(--rg-theme-cell-text-align);--revo-grid-header-padding:var(--rg-theme-header-padding);--revo-grid-cell-padding:var(--rg-theme-cell-padding);--revo-grid-selection-border:var(--rg-theme-selection-border);--revo-grid-selection-bg:var(--rg-theme-selection-bg);--revo-grid-autofill-handle-bg:var(--rg-theme-autofill-handle-bg);--revo-grid-autofill-handle-border:var(--rg-theme-autofill-handle-border);--revo-grid-range-handle-bg:var(--rg-theme-range-handle-bg);--revo-grid-temporary-range-border:var(--rg-theme-temporary-range-border);--revo-grid-temporary-selection-border:var(--rg-theme-temporary-selection-border);--revo-grid-header-resize-hover:var(--rg-theme-header-resize-hover);--revo-grid-button-text:var(--rg-theme-button-text);--revo-grid-button-bg:var(--rg-theme-button-bg);--revo-grid-button-success-bg:var(--rg-theme-button-success-bg);--revo-grid-button-danger-bg:var(--rg-theme-button-danger-bg);--revo-grid-button-outline-border:var(--rg-theme-button-outline-border);--revo-grid-button-outline-text:var(--rg-theme-button-outline-text)}revo-grid{direction:ltr !important}revo-grid revogr-header .header-rgRow.group{box-shadow:0 -1px 0 0 var(--rg-theme-header-border) inset}revo-grid revogr-header .header-rgRow:not(.group){box-shadow:0 -1px 0 0 var(--rg-theme-header-border), 0 -1px 0 0 var(--rg-theme-header-border) inset}revo-grid revogr-header .rgHeaderCell.sortable:hover{background-color:var(--rg-theme-header-hover-bg)}revo-grid revogr-header .rgHeaderCell.focused-cell{background:var(--rg-theme-header-focused-bg)}revo-grid .footer-wrapper revogr-data{box-shadow:0 -1px 0 var(--rg-theme-cell-border)}revo-grid revogr-viewport-scroll.colPinStart{box-shadow:-1px 0 0 var(--rg-theme-cell-border) inset}revo-grid revogr-viewport-scroll.colPinEnd{box-shadow:-1px 0 0 var(--rg-theme-cell-border)}revo-grid revogr-data .rgRow{box-shadow:0 -1px 0 0 var(--rg-theme-cell-border) inset}revo-grid revogr-data .rgRow.focused-rgRow{background-color:var(--rg-theme-focused-bg)}revo-grid revogr-data .rgCell{color:var(--rg-theme-text)}revo-grid revogr-data .rgCell.disabled{background-color:var(--rg-theme-cell-disabled-bg)}revo-grid{display:flex !important;height:100%;min-height:300px;background-color:var(--rg-theme-background);font-family:var(--rg-theme-font-family);font-size:var(--rg-theme-font-size);position:relative;color:var(--rg-theme-text);-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;}revo-grid .attribution{position:absolute;bottom:0;left:0;right:0;z-index:1000;width:0;height:0;border-left:4px solid var(--rg-theme-primary-transparent);border-bottom:4px solid var(--rg-theme-primary-transparent);border-top:4px solid transparent;border-right:4px solid transparent;cursor:pointer}revo-grid .attribution .value{position:absolute;bottom:0;left:0;background-color:var(--rg-theme-background);padding:4px;border-radius:4px;box-shadow:0 1px 10px var(--rg-theme-border);white-space:nowrap;text-decoration:none;color:var(--rg-theme-text);letter-spacing:0.3px;font-size:11px;opacity:0;width:4px;overflow:hidden;transition:opacity 0.5s ease-in-out, width 0.3s ease-in-out}revo-grid .attribution:hover .value{width:63px;opacity:1}revo-grid.column-draggable.column-drag-start:hover,revo-grid.column-draggable.column-drag-start *:hover{cursor:grabbing}revo-grid .footer-wrapper,revo-grid .header-wrapper{width:100%}revo-grid .footer-wrapper revogr-data,revo-grid .header-wrapper revogr-data{z-index:3}revo-grid revo-dropdown{width:100%}revo-grid revo-dropdown .rv-dr-root{max-height:100%}revo-grid revo-dropdown.shrink label{opacity:0}revo-grid .viewports{max-width:100%;display:flex;flex-direction:row;align-items:flex-start;flex-grow:1}revo-grid{display:flex;flex-direction:column;width:100%;height:100%}revo-grid .main-viewport{flex-grow:1;height:0;display:flex;justify-content:space-between;flex-direction:row}revo-grid .draggable{position:fixed;height:30px;line-height:30px;background:var(--rg-theme-background);border-radius:3px;display:block;z-index:100;margin-top:5px;margin-right:-20px;box-shadow:0 4px 20px 0 var(--rg-theme-shadow);padding-left:20px;padding-right:5px}revo-grid .draggable.hidden{display:none}revo-grid .draggable .revo-alt-icon{background-color:var(--rg-theme-foreground);position:absolute;left:5px;top:10px}revo-grid .draggable-wrapper.hidden{display:none}revo-grid .drag-position{position:absolute;left:0;right:0;height:1px;z-index:2;background:var(--rg-theme-divider);pointer-events:none}revo-grid .drag-position-y{position:absolute;top:0;left:0;bottom:0;width:1px;z-index:2;background:var(--rg-theme-divider);pointer-events:none}revo-grid .drag-auto-scroll-y{pointer-events:none;position:absolute;left:0;top:0;height:50px;width:1px}revo-grid .clipboard{position:absolute;left:0;top:0}revo-grid revogr-scroll-virtual{position:relative}revo-grid revogr-scroll-virtual.vertical,revo-grid revogr-scroll-virtual.horizontal{z-index:3}`;
19838
20474
 
19839
20475
  const DEFAULT_COLUMN_SIZE = 100;
@@ -19924,7 +20560,12 @@ class RevoGridComponent {
19924
20560
  /** When true, grid in read only mode. */
19925
20561
  this.readonly = false;
19926
20562
  /** When true, columns are resizable. */
19927
- this.resize = false;
20563
+ this.resize = true;
20564
+ /**
20565
+ * Enables row resizing. Pass a configuration object to customize the
20566
+ * height limits or enable resize edges across the full row.
20567
+ */
20568
+ this.resizeRow = false;
19928
20569
  /**
19929
20570
  * Prevents horizontal scroll state from being mirrored across viewport sections.
19930
20571
  */
@@ -19995,15 +20636,15 @@ class RevoGridComponent {
19995
20636
  */
19996
20637
  this.autoSizeColumn = false;
19997
20638
  /**
19998
- * Enables filter plugin.
20639
+ * Enables filter plugin. Enabled by default; set to `false` to opt out.
19999
20640
  * Can be boolean.
20000
20641
  * Or can be filter collection See `FilterCollection` for more info.
20001
20642
  */
20002
- this.filter = false;
20643
+ this.filter = true;
20003
20644
  /**
20004
20645
  * Enable column move plugin.
20005
20646
  */
20006
- this.canMoveColumns = false;
20647
+ this.canMoveColumns = true;
20007
20648
  /**
20008
20649
  * Trimmed rows.
20009
20650
  * Functionality which allows to hide rows from main data set.
@@ -20013,7 +20654,7 @@ class RevoGridComponent {
20013
20654
  /**
20014
20655
  * Enable export plugin.
20015
20656
  */
20016
- this.exporting = false;
20657
+ this.exporting = true;
20017
20658
  /**
20018
20659
  * Stretch strategy for columns by `StretchColumn` plugin.
20019
20660
  * For example if there are more space on the right last column size would be increased.
@@ -20105,7 +20746,7 @@ class RevoGridComponent {
20105
20746
  var _a;
20106
20747
  if (this.dataProvider && this.columnProvider && !skipDataUpdate) {
20107
20748
  const columnProp = (_a = this.columnProvider.getColumn(col, colType)) === null || _a === void 0 ? void 0 : _a.prop;
20108
- if (typeof columnProp !== 'undefined') {
20749
+ if (columnProp !== undefined) {
20109
20750
  this.dataProvider.setCellData({
20110
20751
  type: rowType,
20111
20752
  rowIndex: row,
@@ -20834,6 +21475,7 @@ class RevoGridComponent {
20834
21475
  this.pluginService.add(new SortingPlugin(this.element, pluginData));
20835
21476
  // register grouping plugin
20836
21477
  this.pluginService.add(new GroupingRowPlugin(this.element, pluginData));
21478
+ this.pluginService.add(RowResizePlugin.fromGridProperty(this.element, pluginData));
20837
21479
  if (this.canMoveColumns) {
20838
21480
  this.pluginService.add(new ColumnMovePlugin(this.element, pluginData));
20839
21481
  }
@@ -21095,6 +21737,7 @@ class RevoGridComponent {
21095
21737
  "range": [4],
21096
21738
  "readonly": [4],
21097
21739
  "resize": [4],
21740
+ "resizeRow": [4, "resize-row"],
21098
21741
  "noHorizontalScrollTransfer": [4, "no-horizontal-scroll-transfer"],
21099
21742
  "canFocus": [4, "can-focus"],
21100
21743
  "useClipboard": [4, "use-clipboard"],
@@ -21333,7 +21976,7 @@ const CellRenderer = ({ renderProps, cellProps, }) => {
21333
21976
  return (hAsync("div", Object.assign({}, cellProps, { redraw: render }), render()));
21334
21977
  };
21335
21978
 
21336
- const revogrDataStyleCss = () => `.revo-drag-icon{width:11px;opacity:0.8}.revo-drag-icon::before{content:"::";display:inline-block}.revo-alt-icon{-webkit-mask-image:url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg viewBox='0 0 384 383' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cg%3E%3Cpath d='M192.4375,383 C197.424479,383 201.663411,381.254557 205.154297,377.763672 L205.154297,377.763672 L264.25,318.667969 C270.234375,312.683594 271.605794,306.075846 268.364258,298.844727 C265.122721,291.613607 259.51237,287.998047 251.533203,287.998047 L251.533203,287.998047 L213.382812,287.998047 L213.382812,212.445312 L288.935547,212.445312 L288.935547,250.595703 C288.935547,258.57487 292.551107,264.185221 299.782227,267.426758 C307.013346,270.668294 313.621094,269.296875 319.605469,263.3125 L319.605469,263.3125 L378.701172,204.216797 C382.192057,200.725911 383.9375,196.486979 383.9375,191.5 C383.9375,186.513021 382.192057,182.274089 378.701172,178.783203 L378.701172,178.783203 L319.605469,119.6875 C313.621094,114.201823 307.013346,112.955078 299.782227,115.947266 C292.551107,118.939453 288.935547,124.42513 288.935547,132.404297 L288.935547,132.404297 L288.935547,170.554688 L213.382812,170.554688 L213.382812,95.0019531 L251.533203,95.0019531 C259.51237,95.0019531 264.998047,91.3863932 267.990234,84.1552734 C270.982422,76.9241536 269.735677,70.3164062 264.25,64.3320312 L264.25,64.3320312 L205.154297,5.23632812 C201.663411,1.74544271 197.424479,0 192.4375,0 C187.450521,0 183.211589,1.74544271 179.720703,5.23632812 L179.720703,5.23632812 L120.625,64.3320312 C114.640625,70.3164062 113.269206,76.9241536 116.510742,84.1552734 C119.752279,91.3863932 125.36263,95.0019531 133.341797,95.0019531 L133.341797,95.0019531 L171.492188,95.0019531 L171.492188,170.554688 L95.9394531,170.554688 L95.9394531,132.404297 C95.9394531,124.42513 92.3238932,118.814779 85.0927734,115.573242 C77.8616536,112.331706 71.2539062,113.703125 65.2695312,119.6875 L65.2695312,119.6875 L6.17382812,178.783203 C2.68294271,182.274089 0.9375,186.513021 0.9375,191.5 C0.9375,196.486979 2.68294271,200.725911 6.17382812,204.216797 L6.17382812,204.216797 L65.2695312,263.3125 C71.2539062,268.798177 77.8616536,270.044922 85.0927734,267.052734 C92.3238932,264.060547 95.9394531,258.57487 95.9394531,250.595703 L95.9394531,250.595703 L95.9394531,212.445312 L171.492188,212.445312 L171.492188,287.998047 L133.341797,287.998047 C125.36263,287.998047 119.876953,291.613607 116.884766,298.844727 C113.892578,306.075846 115.139323,312.683594 120.625,318.667969 L120.625,318.667969 L179.720703,377.763672 C183.211589,381.254557 187.450521,383 192.4375,383 Z'%3E%3C/path%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg viewBox='0 0 384 383' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cg%3E%3Cpath d='M192.4375,383 C197.424479,383 201.663411,381.254557 205.154297,377.763672 L205.154297,377.763672 L264.25,318.667969 C270.234375,312.683594 271.605794,306.075846 268.364258,298.844727 C265.122721,291.613607 259.51237,287.998047 251.533203,287.998047 L251.533203,287.998047 L213.382812,287.998047 L213.382812,212.445312 L288.935547,212.445312 L288.935547,250.595703 C288.935547,258.57487 292.551107,264.185221 299.782227,267.426758 C307.013346,270.668294 313.621094,269.296875 319.605469,263.3125 L319.605469,263.3125 L378.701172,204.216797 C382.192057,200.725911 383.9375,196.486979 383.9375,191.5 C383.9375,186.513021 382.192057,182.274089 378.701172,178.783203 L378.701172,178.783203 L319.605469,119.6875 C313.621094,114.201823 307.013346,112.955078 299.782227,115.947266 C292.551107,118.939453 288.935547,124.42513 288.935547,132.404297 L288.935547,132.404297 L288.935547,170.554688 L213.382812,170.554688 L213.382812,95.0019531 L251.533203,95.0019531 C259.51237,95.0019531 264.998047,91.3863932 267.990234,84.1552734 C270.982422,76.9241536 269.735677,70.3164062 264.25,64.3320312 L264.25,64.3320312 L205.154297,5.23632812 C201.663411,1.74544271 197.424479,0 192.4375,0 C187.450521,0 183.211589,1.74544271 179.720703,5.23632812 L179.720703,5.23632812 L120.625,64.3320312 C114.640625,70.3164062 113.269206,76.9241536 116.510742,84.1552734 C119.752279,91.3863932 125.36263,95.0019531 133.341797,95.0019531 L133.341797,95.0019531 L171.492188,95.0019531 L171.492188,170.554688 L95.9394531,170.554688 L95.9394531,132.404297 C95.9394531,124.42513 92.3238932,118.814779 85.0927734,115.573242 C77.8616536,112.331706 71.2539062,113.703125 65.2695312,119.6875 L65.2695312,119.6875 L6.17382812,178.783203 C2.68294271,182.274089 0.9375,186.513021 0.9375,191.5 C0.9375,196.486979 2.68294271,200.725911 6.17382812,204.216797 L6.17382812,204.216797 L65.2695312,263.3125 C71.2539062,268.798177 77.8616536,270.044922 85.0927734,267.052734 C92.3238932,264.060547 95.9394531,258.57487 95.9394531,250.595703 L95.9394531,250.595703 L95.9394531,212.445312 L171.492188,212.445312 L171.492188,287.998047 L133.341797,287.998047 C125.36263,287.998047 119.876953,291.613607 116.884766,298.844727 C113.892578,306.075846 115.139323,312.683594 120.625,318.667969 L120.625,318.667969 L179.720703,377.763672 C183.211589,381.254557 187.450521,383 192.4375,383 Z'%3E%3C/path%3E%3C/g%3E%3C/svg%3E");width:11px;height:11px;background-size:cover;background-repeat:no-repeat}.arrow-down{position:absolute;right:5px;top:0}.arrow-down svg{width:8px;margin-top:5px;margin-left:5px;opacity:0.4}.cell-value-wrapper{margin-right:10px;overflow:hidden;text-overflow:ellipsis}revogr-data{display:block;width:100%;position:relative}revogr-data .rgRow{position:absolute;width:100%;left:0}revogr-data .rgRow.groupingRow{font-weight:600;text-align:left}revogr-data .rgRow.groupingRow .group-expand{width:25px;height:100%;max-height:25px;margin-right:2px;background-color:transparent;border-color:transparent;vertical-align:middle;padding-left:5px;display:inline-flex}revogr-data .rgRow.groupingRow .group-expand svg{width:7px}revogr-data .revo-draggable{border:none;height:32px;display:inline-flex;outline:0;padding:0;font-size:0.8125rem;box-sizing:border-box;align-items:center;white-space:nowrap;vertical-align:middle;justify-content:center;text-decoration:none;width:24px;height:100%;cursor:pointer;display:inline-flex}revogr-data .revo-draggable:hover>.revo-drag-icon{opacity:1;zoom:1.2;font-weight:600}revogr-data .revo-draggable>.revo-drag-icon{pointer-events:none;transition:opacity 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms, zoom 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}revogr-data .rgCell{top:0;left:0;position:absolute;box-sizing:border-box;height:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;outline:none}revogr-data .rgCell.align-center{text-align:center}revogr-data .rgCell.align-left{text-align:left}revogr-data .rgCell.align-right{text-align:right}`;
21979
+ const revogrDataStyleCss = () => `.revo-drag-icon{width:11px;opacity:0.8}.revo-drag-icon::before{content:"::";display:inline-block}.revo-alt-icon{-webkit-mask-image:url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg viewBox='0 0 384 383' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cg%3E%3Cpath d='M192.4375,383 C197.424479,383 201.663411,381.254557 205.154297,377.763672 L205.154297,377.763672 L264.25,318.667969 C270.234375,312.683594 271.605794,306.075846 268.364258,298.844727 C265.122721,291.613607 259.51237,287.998047 251.533203,287.998047 L251.533203,287.998047 L213.382812,287.998047 L213.382812,212.445312 L288.935547,212.445312 L288.935547,250.595703 C288.935547,258.57487 292.551107,264.185221 299.782227,267.426758 C307.013346,270.668294 313.621094,269.296875 319.605469,263.3125 L319.605469,263.3125 L378.701172,204.216797 C382.192057,200.725911 383.9375,196.486979 383.9375,191.5 C383.9375,186.513021 382.192057,182.274089 378.701172,178.783203 L378.701172,178.783203 L319.605469,119.6875 C313.621094,114.201823 307.013346,112.955078 299.782227,115.947266 C292.551107,118.939453 288.935547,124.42513 288.935547,132.404297 L288.935547,132.404297 L288.935547,170.554688 L213.382812,170.554688 L213.382812,95.0019531 L251.533203,95.0019531 C259.51237,95.0019531 264.998047,91.3863932 267.990234,84.1552734 C270.982422,76.9241536 269.735677,70.3164062 264.25,64.3320312 L264.25,64.3320312 L205.154297,5.23632812 C201.663411,1.74544271 197.424479,0 192.4375,0 C187.450521,0 183.211589,1.74544271 179.720703,5.23632812 L179.720703,5.23632812 L120.625,64.3320312 C114.640625,70.3164062 113.269206,76.9241536 116.510742,84.1552734 C119.752279,91.3863932 125.36263,95.0019531 133.341797,95.0019531 L133.341797,95.0019531 L171.492188,95.0019531 L171.492188,170.554688 L95.9394531,170.554688 L95.9394531,132.404297 C95.9394531,124.42513 92.3238932,118.814779 85.0927734,115.573242 C77.8616536,112.331706 71.2539062,113.703125 65.2695312,119.6875 L65.2695312,119.6875 L6.17382812,178.783203 C2.68294271,182.274089 0.9375,186.513021 0.9375,191.5 C0.9375,196.486979 2.68294271,200.725911 6.17382812,204.216797 L6.17382812,204.216797 L65.2695312,263.3125 C71.2539062,268.798177 77.8616536,270.044922 85.0927734,267.052734 C92.3238932,264.060547 95.9394531,258.57487 95.9394531,250.595703 L95.9394531,250.595703 L95.9394531,212.445312 L171.492188,212.445312 L171.492188,287.998047 L133.341797,287.998047 C125.36263,287.998047 119.876953,291.613607 116.884766,298.844727 C113.892578,306.075846 115.139323,312.683594 120.625,318.667969 L120.625,318.667969 L179.720703,377.763672 C183.211589,381.254557 187.450521,383 192.4375,383 Z'%3E%3C/path%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg viewBox='0 0 384 383' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cg%3E%3Cpath d='M192.4375,383 C197.424479,383 201.663411,381.254557 205.154297,377.763672 L205.154297,377.763672 L264.25,318.667969 C270.234375,312.683594 271.605794,306.075846 268.364258,298.844727 C265.122721,291.613607 259.51237,287.998047 251.533203,287.998047 L251.533203,287.998047 L213.382812,287.998047 L213.382812,212.445312 L288.935547,212.445312 L288.935547,250.595703 C288.935547,258.57487 292.551107,264.185221 299.782227,267.426758 C307.013346,270.668294 313.621094,269.296875 319.605469,263.3125 L319.605469,263.3125 L378.701172,204.216797 C382.192057,200.725911 383.9375,196.486979 383.9375,191.5 C383.9375,186.513021 382.192057,182.274089 378.701172,178.783203 L378.701172,178.783203 L319.605469,119.6875 C313.621094,114.201823 307.013346,112.955078 299.782227,115.947266 C292.551107,118.939453 288.935547,124.42513 288.935547,132.404297 L288.935547,132.404297 L288.935547,170.554688 L213.382812,170.554688 L213.382812,95.0019531 L251.533203,95.0019531 C259.51237,95.0019531 264.998047,91.3863932 267.990234,84.1552734 C270.982422,76.9241536 269.735677,70.3164062 264.25,64.3320312 L264.25,64.3320312 L205.154297,5.23632812 C201.663411,1.74544271 197.424479,0 192.4375,0 C187.450521,0 183.211589,1.74544271 179.720703,5.23632812 L179.720703,5.23632812 L120.625,64.3320312 C114.640625,70.3164062 113.269206,76.9241536 116.510742,84.1552734 C119.752279,91.3863932 125.36263,95.0019531 133.341797,95.0019531 L133.341797,95.0019531 L171.492188,95.0019531 L171.492188,170.554688 L95.9394531,170.554688 L95.9394531,132.404297 C95.9394531,124.42513 92.3238932,118.814779 85.0927734,115.573242 C77.8616536,112.331706 71.2539062,113.703125 65.2695312,119.6875 L65.2695312,119.6875 L6.17382812,178.783203 C2.68294271,182.274089 0.9375,186.513021 0.9375,191.5 C0.9375,196.486979 2.68294271,200.725911 6.17382812,204.216797 L6.17382812,204.216797 L65.2695312,263.3125 C71.2539062,268.798177 77.8616536,270.044922 85.0927734,267.052734 C92.3238932,264.060547 95.9394531,258.57487 95.9394531,250.595703 L95.9394531,250.595703 L95.9394531,212.445312 L171.492188,212.445312 L171.492188,287.998047 L133.341797,287.998047 C125.36263,287.998047 119.876953,291.613607 116.884766,298.844727 C113.892578,306.075846 115.139323,312.683594 120.625,318.667969 L120.625,318.667969 L179.720703,377.763672 C183.211589,381.254557 187.450521,383 192.4375,383 Z'%3E%3C/path%3E%3C/g%3E%3C/svg%3E");width:11px;height:11px;background-size:cover;background-repeat:no-repeat}.arrow-down{position:absolute;right:5px;top:0}.arrow-down svg{width:8px;margin-top:5px;margin-left:5px;opacity:0.4}.cell-value-wrapper{margin-right:10px;overflow:hidden;text-overflow:ellipsis}revogr-data{display:block;width:100%;position:relative}revogr-data .rgRow{position:absolute;width:100%;left:0}revogr-data .rgRow>.row-resize-handle{position:absolute;z-index:2;right:0;bottom:-3px;left:0;height:7px;cursor:row-resize;touch-action:none;user-select:none}revogr-data .rgRow.groupingRow{font-weight:600;text-align:left}revogr-data .rgRow.groupingRow .group-expand{width:25px;height:100%;max-height:25px;margin-right:2px;background-color:transparent;border-color:transparent;vertical-align:middle;padding-left:5px;display:inline-flex}revogr-data .rgRow.groupingRow .group-expand svg{width:7px}revogr-data .revo-draggable{border:none;height:32px;display:inline-flex;outline:0;padding:0;font-size:0.8125rem;box-sizing:border-box;align-items:center;white-space:nowrap;vertical-align:middle;justify-content:center;text-decoration:none;width:24px;height:100%;cursor:pointer;display:inline-flex}revogr-data .revo-draggable:hover>.revo-drag-icon{opacity:1;zoom:1.2;font-weight:600}revogr-data .revo-draggable>.revo-drag-icon{pointer-events:none;transition:opacity 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms, zoom 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms}revogr-data .rgCell{top:0;left:0;position:absolute;box-sizing:border-box;height:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;outline:none}revogr-data .rgCell.align-center{text-align:center}revogr-data .rgCell.align-left{text-align:left}revogr-data .rgCell.align-right{text-align:right}`;
21337
21980
 
21338
21981
  /**
21339
21982
  * This component is responsible for rendering data
@@ -21443,7 +22086,10 @@ class RevogrData {
21443
22086
  groupingCellRenderer, additionalData: this.additionalData,
21444
22087
  // Only show expand button if grouping is enabled and not in row headers
21445
22088
  hasExpand: this.columnService.hasGrouping && this.colType !== 'rowHeaders', columnItems: cols, providers: this.providers });
21446
- rowsEls.push(hAsync(GroupingRowRenderer, Object.assign({}, gmodel)));
22089
+ const row = hAsync(GroupingRowRenderer, Object.assign({}, gmodel));
22090
+ this.triggerBeforeRowRender(row, rgRow, dataItem);
22091
+ rowsEls.push(row);
22092
+ this.renderedRows.set(rgRow.itemIndex, row);
21447
22093
  continue;
21448
22094
  }
21449
22095
  // #endregion
@@ -21492,19 +22138,22 @@ class RevogrData {
21492
22138
  rowClass += ` ${ROW_FOCUSED_CLASS}`;
21493
22139
  }
21494
22140
  const row = (hAsync(RowRenderer, { index: rgRow.itemIndex, rowClass: rowClass, size: rgRow.size, start: rgRow.start - rowRenderOffset, groupingLevel: groupDepth || undefined }, cells));
21495
- this.beforerowrender.emit({
21496
- node: row,
21497
- item: rgRow,
21498
- model: dataItem,
21499
- colType: this.columnService.type,
21500
- rowType: this.type,
21501
- });
22141
+ this.triggerBeforeRowRender(row, rgRow, dataItem);
21502
22142
  rowsEls.push(row);
21503
22143
  this.renderedRows.set(rgRow.itemIndex, row);
21504
22144
  // #endregion
21505
22145
  }
21506
22146
  return (hAsync(Host, null, hAsync("slot", null), rowsEls));
21507
22147
  }
22148
+ triggerBeforeRowRender(node, item, model) {
22149
+ this.beforerowrender.emit({
22150
+ node,
22151
+ item,
22152
+ model,
22153
+ colType: this.colType,
22154
+ rowType: this.type,
22155
+ });
22156
+ }
21508
22157
  triggerBeforeCellRender(model, row, column) {
21509
22158
  const detail = {
21510
22159
  column,
@@ -21866,7 +22515,7 @@ const HeaderGroupRenderer = (p) => {
21866
22515
  return (hAsync(HeaderCellRenderer, { data: Object.assign(Object.assign({}, p.group), { prop: '', providers: p.providers, index: p.start }), props: groupProps, additionalData: p.additionalData }));
21867
22516
  };
21868
22517
 
21869
- const revogrHeaderStyleCss = () => `@charset "UTF-8";revogr-header{position:relative;z-index:5;display:block}revogr-header .header-rgRow{display:block;position:relative}revogr-header .header-rgRow.group{z-index:0}revogr-header .group-rgRow{position:relative;overflow:hidden}revogr-header .rgHeaderCell{position:absolute;box-sizing:border-box;height:100%;z-index:1;display:flex;text-align:var(--rg-theme-header-text-align, center)}revogr-header .rgHeaderCell.align-center{text-align:center}revogr-header .rgHeaderCell.align-left{text-align:left}revogr-header .rgHeaderCell.align-right{text-align:right}revogr-header .rgHeaderCell.sortable{cursor:pointer}revogr-header .rgHeaderCell .sort-indicator{display:inline-flex;align-items:flex-start;gap:1px}revogr-header .rgHeaderCell .sort-indicator i.asc:after,revogr-header .rgHeaderCell .sort-indicator i.desc:after{font-size:13px}revogr-header .rgHeaderCell .sort-indicator i.asc:after{content:"↑"}revogr-header .rgHeaderCell .sort-indicator i.desc:after{content:"↓"}revogr-header .rgHeaderCell .sort-indicator .sort-order-index{font-size:10px;line-height:1;top:0}revogr-header .rgHeaderCell.active{z-index:10}revogr-header .rgHeaderCell.active .resizable{background-color:var(--rg-theme-header-resize-hover)}revogr-header .rgHeaderCell .header-content{position:absolute;inset:0;box-sizing:border-box;padding:inherit;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex-grow:1}revogr-header .rgHeaderCell>span:first-of-type{position:relative;z-index:1;margin-left:auto}revogr-header .rgHeaderCell .resizable{display:block;position:absolute;z-index:90;touch-action:none;user-select:none}revogr-header .rgHeaderCell .resizable:hover{background-color:var(--rg-theme-header-resize-hover)}revogr-header .rgHeaderCell>.resizable-r{cursor:ew-resize;width:6px;right:0;top:0;height:100%}revogr-header .rgHeaderCell>.resizable-rb{cursor:se-resize;width:6px;height:6px;right:0;bottom:0}revogr-header .rgHeaderCell>.resizable-b{cursor:s-resize;height:6px;bottom:0;width:100%;left:0}revogr-header .rgHeaderCell>.resizable-lb{cursor:sw-resize;width:6px;height:6px;left:0;bottom:0}revogr-header .rgHeaderCell>.resizable-l{cursor:w-resize;width:6px;left:0;height:100%;top:0}revogr-header .rgHeaderCell>.resizable-lt{cursor:nw-resize;width:6px;height:6px;left:0;top:0}revogr-header .rgHeaderCell>.resizable-t{cursor:n-resize;height:6px;top:0;width:100%;left:0}revogr-header .rgHeaderCell>.resizable-rt{cursor:ne-resize;width:6px;height:6px;right:0;top:0}revogr-header .rv-filter{visibility:hidden}`;
22518
+ const revogrHeaderStyleCss = () => `@charset "UTF-8";revogr-header{position:relative;z-index:5;display:block}revogr-header .header-rgRow{display:block;position:relative}revogr-header .header-rgRow.group{z-index:0}revogr-header .group-rgRow{position:relative;overflow:hidden}revogr-header .rgHeaderCell{position:absolute;box-sizing:border-box;height:100%;z-index:1;display:flex;text-align:var(--rg-theme-header-text-align, center)}revogr-header .rgHeaderCell.align-center{text-align:center}revogr-header .rgHeaderCell.align-left{text-align:left}revogr-header .rgHeaderCell.align-right{text-align:right}revogr-header .rgHeaderCell.sortable{cursor:pointer}revogr-header .rgHeaderCell .sort-indicator{display:inline-flex;align-items:flex-start;gap:1px}revogr-header .rgHeaderCell .sort-indicator i.asc:after,revogr-header .rgHeaderCell .sort-indicator i.desc:after{font-size:13px}revogr-header .rgHeaderCell .sort-indicator i.asc:after{content:"↑"}revogr-header .rgHeaderCell .sort-indicator i.desc:after{content:"↓"}revogr-header .rgHeaderCell .sort-indicator .sort-order-index{font-size:10px;line-height:1;top:0}revogr-header .rgHeaderCell.active{z-index:10}revogr-header .rgHeaderCell.active .resizable{background-color:var(--rg-theme-header-resize-hover)}revogr-header .rgHeaderCell .header-content{position:absolute;z-index:0;inset:0;box-sizing:border-box;padding:inherit;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex-grow:1}revogr-header .rgHeaderCell>span:first-of-type{position:relative;z-index:1;margin-left:auto}revogr-header .rgHeaderCell .resizable{display:block;position:absolute;z-index:90;touch-action:none;user-select:none}revogr-header .rgHeaderCell .resizable:hover{background-color:var(--rg-theme-header-resize-hover)}revogr-header .rgHeaderCell>.resizable-r{cursor:ew-resize;width:6px;right:0;top:0;height:100%}revogr-header .rgHeaderCell>.resizable-rb{cursor:se-resize;width:6px;height:6px;right:0;bottom:0}revogr-header .rgHeaderCell>.resizable-b{cursor:s-resize;height:6px;bottom:0;width:100%;left:0}revogr-header .rgHeaderCell>.resizable-lb{cursor:sw-resize;width:6px;height:6px;left:0;bottom:0}revogr-header .rgHeaderCell>.resizable-l{cursor:w-resize;width:6px;left:0;height:100%;top:0}revogr-header .rgHeaderCell>.resizable-lt{cursor:nw-resize;width:6px;height:6px;left:0;top:0}revogr-header .rgHeaderCell>.resizable-t{cursor:n-resize;height:6px;top:0;width:100%;left:0}revogr-header .rgHeaderCell>.resizable-rt{cursor:ne-resize;width:6px;height:6px;right:0;top:0}revogr-header .rv-filter{visibility:hidden}`;
21870
22519
 
21871
22520
  class RevogrHeaderComponent {
21872
22521
  constructor(hostRef) {
@@ -22428,7 +23077,7 @@ class LocalScrollTimer {
22428
23077
  * Remember last mw event time
22429
23078
  */
22430
23079
  latestScrollUpdate(dimension) {
22431
- this.mouseWheelScrollTimestamp[dimension] = new Date().getTime();
23080
+ this.mouseWheelScrollTimestamp[dimension] = Date.now();
22432
23081
  }
22433
23082
  isReady(type, coordinate) {
22434
23083
  // if there is a callback, clear it
@@ -22439,7 +23088,7 @@ class LocalScrollTimer {
22439
23088
  return this.verifyChange(type, coordinate);
22440
23089
  }
22441
23090
  verifyChange(type, coordinate) {
22442
- const now = new Date().getTime();
23091
+ const now = Date.now();
22443
23092
  const change = now - this.mouseWheelScrollTimestamp[type];
22444
23093
  return change > this.scrollThrottling &&
22445
23094
  coordinate !== this.lastKnownScrollCoordinate[type];
@@ -22457,7 +23106,7 @@ class LocalScrollTimer {
22457
23106
  // save lastScrollUpdate callback
22458
23107
  const callback = this.lastScrollUpdateCallbacks[type] = {
22459
23108
  callback: lastScrollUpdate,
22460
- timestamp: new Date().getTime(),
23109
+ timestamp: Date.now(),
22461
23110
  coordinate,
22462
23111
  timeout: 0,
22463
23112
  };