@handsontable/react-wrapper 0.0.0-next-950f502-20260629 → 0.0.0-next-8f26cab-20260630

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.
@@ -551,10 +551,18 @@ var HotTableContextProvider = function HotTableContextProvider(_ref) {
551
551
  return renderedCellCache.current.clear();
552
552
  }, []);
553
553
  var portalCache = React.useRef(new Map());
554
+ var portalContainerCache = React.useRef(new Map());
555
+ // Keys of the portal containers rendered in the current view-render pass.
556
+ // Reset every `beforeViewRender` and used after the render to evict
557
+ // containers whose cells left the viewport (see pushCellPortalsIntoPortalManager).
558
+ var renderedPortalContainerKeys = React.useRef(new Set());
554
559
  var clearPortalCache = React.useCallback(function () {
555
- return portalCache.current.clear();
560
+ portalCache.current.clear();
561
+ renderedPortalContainerKeys.current.clear();
562
+ }, []);
563
+ var getPortalContainerCacheSize = React.useCallback(function () {
564
+ return portalContainerCache.current.size;
556
565
  }, []);
557
- var portalContainerCache = React.useRef(new Map());
558
566
  var getRendererWrapper = React.useCallback(function (Renderer) {
559
567
  return function __internalRenderer(instance, TD, row, col, prop, value, cellProperties) {
560
568
  var key = "".concat(row, "-").concat(col);
@@ -590,6 +598,7 @@ var HotTableContextProvider = function HotTableContextProvider(_ref) {
590
598
  TD.appendChild(portalContainer);
591
599
  }
592
600
  portalContainerCache.current.set(portalContainerKey, portalContainer);
601
+ renderedPortalContainerKeys.current.add(portalContainerKey);
593
602
  portalCache.current.set(portalKey, portal);
594
603
  }
595
604
  renderedCellCache.current.set(key, TD);
@@ -603,6 +612,18 @@ var HotTableContextProvider = function HotTableContextProvider(_ref) {
603
612
  renderersPortalManager.current = pmComponent;
604
613
  }, []);
605
614
  var pushCellPortalsIntoPortalManager = React.useCallback(function () {
615
+ // Evict portal containers whose cells were not rendered in this pass (e.g.
616
+ // scrolled out of the viewport). Their container DIVs are already detached
617
+ // from the DOM, so without this they would be retained forever, leaking
618
+ // O(rows × cols) detached nodes for component-based renderers. Containers
619
+ // still in the viewport stay cached, preserving the in-place reuse that
620
+ // avoids remounting renderer components on every grid render (#10800).
621
+ var liveKeys = renderedPortalContainerKeys.current;
622
+ portalContainerCache.current.forEach(function (_, cacheKey) {
623
+ if (!liveKeys.has(cacheKey)) {
624
+ portalContainerCache.current["delete"](cacheKey);
625
+ }
626
+ });
606
627
  renderersPortalManager.current(_toConsumableArray(portalCache.current.values()));
607
628
  }, []);
608
629
  var contextImpl = React.useMemo(function () {
@@ -614,10 +635,11 @@ var HotTableContextProvider = function HotTableContextProvider(_ref) {
614
635
  getRendererWrapper: getRendererWrapper,
615
636
  clearPortalCache: clearPortalCache,
616
637
  clearRenderedCellCache: clearRenderedCellCache,
638
+ getPortalContainerCacheSize: getPortalContainerCacheSize,
617
639
  setRenderersPortalManagerRef: setRenderersPortalManagerRef,
618
640
  pushCellPortalsIntoPortalManager: pushCellPortalsIntoPortalManager
619
641
  };
620
- }, [setHotColumnSettings, trimColumnSettings, getRendererWrapper, clearRenderedCellCache, setRenderersPortalManagerRef, pushCellPortalsIntoPortalManager]);
642
+ }, [setHotColumnSettings, trimColumnSettings, getRendererWrapper, clearRenderedCellCache, getPortalContainerCacheSize, setRenderersPortalManagerRef, pushCellPortalsIntoPortalManager]);
621
643
  return /*#__PURE__*/React__default["default"].createElement(HotTableContext.Provider, {
622
644
  value: contextImpl
623
645
  }, children);
@@ -1086,7 +1108,7 @@ var HotColumn = function HotColumn(props) {
1086
1108
  }, editorPortal);
1087
1109
  };
1088
1110
 
1089
- var version="0.0.0-next-950f502-20260629";
1111
+ var version="0.0.0-next-8f26cab-20260630";
1090
1112
 
1091
1113
  /**
1092
1114
  * Component used to manage the renderer component portals.
@@ -25,7 +25,7 @@
25
25
  * INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER ARISING FROM
26
26
  * USE OR INABILITY TO USE THIS SOFTWARE.
27
27
  *
28
- * Version: 0.0.0-next-950f502-20260629 (built at Mon Jun 29 2026 12:55:27 GMT+0000 (Coordinated Universal Time))
28
+ * Version: 0.0.0-next-8f26cab-20260630 (built at Tue Jun 30 2026 10:05:05 GMT+0000 (Coordinated Universal Time))
29
29
  */
30
30
  (function (global, factory) {
31
31
  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react'), require('react-dom'), require('handsontable/base'), require('handsontable/renderers/registry'), require('handsontable/editors/registry')) :
@@ -576,10 +576,18 @@ var HotTableContextProvider = function HotTableContextProvider(_ref) {
576
576
  return renderedCellCache.current.clear();
577
577
  }, []);
578
578
  var portalCache = React.useRef(new Map());
579
+ var portalContainerCache = React.useRef(new Map());
580
+ // Keys of the portal containers rendered in the current view-render pass.
581
+ // Reset every `beforeViewRender` and used after the render to evict
582
+ // containers whose cells left the viewport (see pushCellPortalsIntoPortalManager).
583
+ var renderedPortalContainerKeys = React.useRef(new Set());
579
584
  var clearPortalCache = React.useCallback(function () {
580
- return portalCache.current.clear();
585
+ portalCache.current.clear();
586
+ renderedPortalContainerKeys.current.clear();
587
+ }, []);
588
+ var getPortalContainerCacheSize = React.useCallback(function () {
589
+ return portalContainerCache.current.size;
581
590
  }, []);
582
- var portalContainerCache = React.useRef(new Map());
583
591
  var getRendererWrapper = React.useCallback(function (Renderer) {
584
592
  return function __internalRenderer(instance, TD, row, col, prop, value, cellProperties) {
585
593
  var key = "".concat(row, "-").concat(col);
@@ -615,6 +623,7 @@ var HotTableContextProvider = function HotTableContextProvider(_ref) {
615
623
  TD.appendChild(portalContainer);
616
624
  }
617
625
  portalContainerCache.current.set(portalContainerKey, portalContainer);
626
+ renderedPortalContainerKeys.current.add(portalContainerKey);
618
627
  portalCache.current.set(portalKey, portal);
619
628
  }
620
629
  renderedCellCache.current.set(key, TD);
@@ -628,6 +637,18 @@ var HotTableContextProvider = function HotTableContextProvider(_ref) {
628
637
  renderersPortalManager.current = pmComponent;
629
638
  }, []);
630
639
  var pushCellPortalsIntoPortalManager = React.useCallback(function () {
640
+ // Evict portal containers whose cells were not rendered in this pass (e.g.
641
+ // scrolled out of the viewport). Their container DIVs are already detached
642
+ // from the DOM, so without this they would be retained forever, leaking
643
+ // O(rows × cols) detached nodes for component-based renderers. Containers
644
+ // still in the viewport stay cached, preserving the in-place reuse that
645
+ // avoids remounting renderer components on every grid render (#10800).
646
+ var liveKeys = renderedPortalContainerKeys.current;
647
+ portalContainerCache.current.forEach(function (_, cacheKey) {
648
+ if (!liveKeys.has(cacheKey)) {
649
+ portalContainerCache.current["delete"](cacheKey);
650
+ }
651
+ });
631
652
  renderersPortalManager.current(_toConsumableArray(portalCache.current.values()));
632
653
  }, []);
633
654
  var contextImpl = React.useMemo(function () {
@@ -639,10 +660,11 @@ var HotTableContextProvider = function HotTableContextProvider(_ref) {
639
660
  getRendererWrapper: getRendererWrapper,
640
661
  clearPortalCache: clearPortalCache,
641
662
  clearRenderedCellCache: clearRenderedCellCache,
663
+ getPortalContainerCacheSize: getPortalContainerCacheSize,
642
664
  setRenderersPortalManagerRef: setRenderersPortalManagerRef,
643
665
  pushCellPortalsIntoPortalManager: pushCellPortalsIntoPortalManager
644
666
  };
645
- }, [setHotColumnSettings, trimColumnSettings, getRendererWrapper, clearRenderedCellCache, setRenderersPortalManagerRef, pushCellPortalsIntoPortalManager]);
667
+ }, [setHotColumnSettings, trimColumnSettings, getRendererWrapper, clearRenderedCellCache, getPortalContainerCacheSize, setRenderersPortalManagerRef, pushCellPortalsIntoPortalManager]);
646
668
  return /*#__PURE__*/React__default["default"].createElement(HotTableContext.Provider, {
647
669
  value: contextImpl
648
670
  }, children);
@@ -1111,7 +1133,7 @@ var HotColumn = function HotColumn(props) {
1111
1133
  }, editorPortal);
1112
1134
  };
1113
1135
 
1114
- var version="0.0.0-next-950f502-20260629";
1136
+ var version="0.0.0-next-8f26cab-20260630";
1115
1137
 
1116
1138
  /**
1117
1139
  * Component used to manage the renderer component portals.