@handsontable/react-wrapper 17.1.0-rc9 → 18.0.0-rc1

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.
package/README.md CHANGED
@@ -56,9 +56,6 @@
56
56
  &nbsp;&nbsp;✅&nbsp; [Hiding columns](https://handsontable.com/docs/react-data-grid/column-hiding/) <br>
57
57
  &nbsp;&nbsp;✅&nbsp; [Right-click context menu](https://handsontable.com/docs/react-data-grid/context-menu/) <br>
58
58
  &nbsp;&nbsp;✅&nbsp; [Row pagination](https://handsontable.com/docs/react-data-grid/rows-pagination/) <br>
59
- &nbsp;&nbsp;✅&nbsp; [Server-side data](https://handsontable.com/docs/react-data-grid/server-side-data/) <br>
60
- &nbsp;&nbsp;✅&nbsp; [Notifications](https://handsontable.com/docs/react-data-grid/notification/) <br>
61
- &nbsp;&nbsp;✅&nbsp; [Export to Excel](https://handsontable.com/docs/react-data-grid/export-to-excel/) <br>
62
59
 
63
60
  <div id="installation">
64
61
 
@@ -186,7 +186,7 @@ function _toPrimitive(t, r) {
186
186
  if ("object" != typeof i) return i;
187
187
  throw new TypeError("@@toPrimitive must return a primitive value.");
188
188
  }
189
- return (String )(t);
189
+ return ("string" === r ? String : Number)(t);
190
190
  }
191
191
  function _toPropertyKey(t) {
192
192
  var i = _toPrimitive(t, "string");
@@ -355,11 +355,18 @@ function createPortal(rElement) {
355
355
  if (!ownerDocument) {
356
356
  ownerDocument = document;
357
357
  }
358
- if (!bulkComponentContainer) {
359
- bulkComponentContainer = ownerDocument.createDocumentFragment();
358
+ var portalContainer = cachedContainer;
359
+
360
+ // A new container needs an anchor before React mounts into it. A cached
361
+ // container is already attached (typically inside its TD) and must be
362
+ // left in place to avoid wiping the DOM on every grid render.
363
+ if (!portalContainer) {
364
+ if (!bulkComponentContainer) {
365
+ bulkComponentContainer = ownerDocument.createDocumentFragment();
366
+ }
367
+ portalContainer = ownerDocument.createElement('DIV');
368
+ bulkComponentContainer.appendChild(portalContainer);
360
369
  }
361
- var portalContainer = cachedContainer !== null && cachedContainer !== void 0 ? cachedContainer : ownerDocument.createElement('DIV');
362
- bulkComponentContainer.appendChild(portalContainer);
363
370
  return {
364
371
  portal: /*#__PURE__*/ReactDOM__default["default"].createPortal(rElement, portalContainer, portalKey),
365
372
  portalContainer: portalContainer
@@ -535,6 +542,9 @@ var HotTableContextProvider = function HotTableContextProvider(_ref) {
535
542
  var setHotColumnSettings = React.useCallback(function (columnSettings, columnIndex) {
536
543
  columnsSettings.current[columnIndex] = columnSettings;
537
544
  }, []);
545
+ var trimColumnSettings = React.useCallback(function (length) {
546
+ columnsSettings.current.length = length;
547
+ }, []);
538
548
  var componentRendererColumns = React.useRef(new Map());
539
549
  var renderedCellCache = React.useRef(new Map());
540
550
  var clearRenderedCellCache = React.useCallback(function () {
@@ -553,38 +563,36 @@ var HotTableContextProvider = function HotTableContextProvider(_ref) {
553
563
  var instanceGuid = instance.guid;
554
564
  var portalContainerKey = "".concat(instanceGuid, "-").concat(key);
555
565
  var portalKey = "".concat(key, "-").concat(instanceGuid);
556
- if (renderedCellCache.current.has(key)) {
557
- TD.innerHTML = renderedCellCache.current.get(key).innerHTML;
558
- }
559
566
  if (TD && !TD.getAttribute('ghost-table')) {
560
- var cachedPortal = portalCache.current.get(portalKey);
561
567
  var cachedPortalContainer = portalContainerCache.current.get(portalContainerKey);
562
- while (TD.firstChild) {
563
- TD.removeChild(TD.firstChild);
564
- }
565
-
566
- // if portal already exists, do not recreate
567
- if (cachedPortal && cachedPortalContainer) {
568
- TD.appendChild(cachedPortalContainer);
569
- } else {
570
- var rendererElement = /*#__PURE__*/React__default["default"].createElement(Renderer, {
571
- instance: instance,
572
- TD: TD,
573
- row: row,
574
- col: col,
575
- prop: prop,
576
- value: value,
577
- cellProperties: cellProperties
578
- });
579
- var _createPortal = createPortal(rendererElement, TD.ownerDocument, portalKey, cachedPortalContainer),
580
- portal = _createPortal.portal,
581
- portalContainer = _createPortal.portalContainer;
582
- portalContainerCache.current.set(portalContainerKey, portalContainer);
568
+ // When the cached portal container is still attached to the same
569
+ // TD as the previous render, the DOM is already correct and must
570
+ // not be wiped. Wiping detaches the React-managed children, which
571
+ // forces a full remount of the renderer component on every grid
572
+ // render (see issue #10800).
573
+ var containerInPlace = !!cachedPortalContainer && cachedPortalContainer.parentNode === TD;
574
+ var rendererElement = /*#__PURE__*/React__default["default"].createElement(Renderer, {
575
+ instance: instance,
576
+ TD: TD,
577
+ row: row,
578
+ col: col,
579
+ prop: prop,
580
+ value: value,
581
+ cellProperties: cellProperties
582
+ });
583
+ var _createPortal = createPortal(rendererElement, TD.ownerDocument, portalKey, cachedPortalContainer),
584
+ portal = _createPortal.portal,
585
+ portalContainer = _createPortal.portalContainer;
586
+ if (!containerInPlace) {
587
+ while (TD.firstChild) {
588
+ TD.removeChild(TD.firstChild);
589
+ }
583
590
  TD.appendChild(portalContainer);
584
- portalCache.current.set(portalKey, portal);
585
591
  }
592
+ portalContainerCache.current.set(portalContainerKey, portalContainer);
593
+ portalCache.current.set(portalKey, portal);
586
594
  }
587
- renderedCellCache.current.set("".concat(row, "-").concat(col), TD);
595
+ renderedCellCache.current.set(key, TD);
588
596
  return TD;
589
597
  };
590
598
  }, []);
@@ -602,13 +610,14 @@ var HotTableContextProvider = function HotTableContextProvider(_ref) {
602
610
  componentRendererColumns: componentRendererColumns.current,
603
611
  columnsSettings: columnsSettings.current,
604
612
  emitColumnSettings: setHotColumnSettings,
613
+ trimColumnSettings: trimColumnSettings,
605
614
  getRendererWrapper: getRendererWrapper,
606
615
  clearPortalCache: clearPortalCache,
607
616
  clearRenderedCellCache: clearRenderedCellCache,
608
617
  setRenderersPortalManagerRef: setRenderersPortalManagerRef,
609
618
  pushCellPortalsIntoPortalManager: pushCellPortalsIntoPortalManager
610
619
  };
611
- }, [setHotColumnSettings, getRendererWrapper, clearRenderedCellCache, setRenderersPortalManagerRef, pushCellPortalsIntoPortalManager]);
620
+ }, [setHotColumnSettings, trimColumnSettings, getRendererWrapper, clearRenderedCellCache, setRenderersPortalManagerRef, pushCellPortalsIntoPortalManager]);
612
621
  return /*#__PURE__*/React__default["default"].createElement(HotTableContext.Provider, {
613
622
  value: contextImpl
614
623
  }, children);
@@ -677,11 +686,12 @@ function makeEditorClass(hooksRef, instanceRef) {
677
686
  args[_key] = arguments[_key];
678
687
  }
679
688
  if (!AbstractMethods.includes(propName)) {
680
- result = baseMethod.call.apply(baseMethod, [this].concat(args)); // call super
689
+ var _ref;
690
+ result = (_ref = baseMethod).call.apply(_ref, [this].concat(args)); // call super
681
691
  }
682
692
  if (MethodsMap[propName] && (_hooksRef$current = hooksRef.current) !== null && _hooksRef$current !== void 0 && _hooksRef$current[MethodsMap[propName]]) {
683
- var _ref;
684
- result = (_ref = hooksRef.current[MethodsMap[propName]]).call.apply(_ref, [this].concat(args));
693
+ var _ref2;
694
+ result = (_ref2 = hooksRef.current[MethodsMap[propName]]).call.apply(_ref2, [this].concat(args));
685
695
  }
686
696
  return result;
687
697
  }.bind(_this);
@@ -722,10 +732,10 @@ var EditorContext = /*#__PURE__*/React.createContext(undefined);
722
732
  * @param {Ref} hooksRef Reference for component-based editor overridden hooks object.
723
733
  * @param {RefObject} hotCustomEditorInstanceRef Reference to Handsontable-native editor instance.
724
734
  */
725
- var EditorContextProvider = function EditorContextProvider(_ref2) {
726
- var hooksRef = _ref2.hooksRef,
727
- hotCustomEditorInstanceRef = _ref2.hotCustomEditorInstanceRef,
728
- children = _ref2.children;
735
+ var EditorContextProvider = function EditorContextProvider(_ref3) {
736
+ var hooksRef = _ref3.hooksRef,
737
+ hotCustomEditorInstanceRef = _ref3.hotCustomEditorInstanceRef,
738
+ children = _ref3.children;
729
739
  return /*#__PURE__*/React__default["default"].createElement(EditorContext.Provider, {
730
740
  value: {
731
741
  hooksRef: hooksRef,
@@ -794,9 +804,9 @@ function applyEditorPosition(el, editor, hot, td) {
794
804
  * @returns {UseHotEditorImpl} Editor API methods
795
805
  */
796
806
  function useHotEditor(overriddenHooks, deps) {
797
- var _ref3 = React.useContext(EditorContext),
798
- hooksRef = _ref3.hooksRef,
799
- hotCustomEditorInstanceRef = _ref3.hotCustomEditorInstanceRef;
807
+ var _ref4 = React.useContext(EditorContext),
808
+ hooksRef = _ref4.hooksRef,
809
+ hotCustomEditorInstanceRef = _ref4.hotCustomEditorInstanceRef;
800
810
  var _useState = React.useState(0),
801
811
  _useState2 = _slicedToArray(_useState, 2),
802
812
  rerenderTrigger = _useState2[0],
@@ -840,11 +850,13 @@ function useHotEditor(overriddenHooks, deps) {
840
850
  },
841
851
  get row() {
842
852
  var _hotCustomEditorInsta6;
843
- return (_hotCustomEditorInsta6 = hotCustomEditorInstanceRef.current) === null || _hotCustomEditorInsta6 === void 0 ? void 0 : _hotCustomEditorInsta6.row;
853
+ var row = (_hotCustomEditorInsta6 = hotCustomEditorInstanceRef.current) === null || _hotCustomEditorInsta6 === void 0 ? void 0 : _hotCustomEditorInsta6.row;
854
+ return row !== null && row !== void 0 ? row : undefined;
844
855
  },
845
856
  get col() {
846
857
  var _hotCustomEditorInsta7;
847
- return (_hotCustomEditorInsta7 = hotCustomEditorInstanceRef.current) === null || _hotCustomEditorInsta7 === void 0 ? void 0 : _hotCustomEditorInsta7.col;
858
+ var col = (_hotCustomEditorInsta7 = hotCustomEditorInstanceRef.current) === null || _hotCustomEditorInsta7 === void 0 ? void 0 : _hotCustomEditorInsta7.col;
859
+ return col !== null && col !== void 0 ? col : undefined;
848
860
  }
849
861
  };
850
862
  }, [rerenderTrigger, hotCustomEditorInstanceRef, deferredValue]);
@@ -854,23 +866,23 @@ function useHotEditor(overriddenHooks, deps) {
854
866
 
855
867
  // EditorComponent props - children typed to work with JSX syntax
856
868
 
857
- function EditorComponent(_ref4) {
858
- var _onPrepare = _ref4.onPrepare,
859
- _onClose = _ref4.onClose,
860
- _onOpen = _ref4.onOpen,
861
- _onFocus = _ref4.onFocus,
862
- children = _ref4.children,
863
- _ref4$shortcutsGroup = _ref4.shortcutsGroup,
864
- shortcutsGroup = _ref4$shortcutsGroup === void 0 ? "custom-editor" : _ref4$shortcutsGroup,
865
- shortcuts = _ref4.shortcuts;
869
+ function EditorComponent(_ref5) {
870
+ var _onPrepare = _ref5.onPrepare,
871
+ _onClose = _ref5.onClose,
872
+ _onOpen = _ref5.onOpen,
873
+ _onFocus = _ref5.onFocus,
874
+ children = _ref5.children,
875
+ _ref5$shortcutsGroup = _ref5.shortcutsGroup,
876
+ shortcutsGroup = _ref5$shortcutsGroup === void 0 ? "custom-editor" : _ref5$shortcutsGroup,
877
+ shortcuts = _ref5.shortcuts;
866
878
  var mainElementRef = React.useRef(null);
867
879
  var currentValue = React.useRef(undefined);
868
880
  var _useState5 = React.useState(),
869
881
  _useState6 = _slicedToArray(_useState5, 2),
870
882
  themeClassName = _useState6[0],
871
883
  setThemeClassName = _useState6[1];
872
- var _ref5 = React.useContext(EditorContext),
873
- hotCustomEditorInstanceRef = _ref5.hotCustomEditorInstanceRef;
884
+ var _ref6 = React.useContext(EditorContext),
885
+ hotCustomEditorInstanceRef = _ref6.hotCustomEditorInstanceRef;
874
886
  var registerShortcuts = React.useCallback(function () {
875
887
  var _hotCustomEditorInsta8, _hotCustomEditorInsta9, _hotCustomEditorInsta0;
876
888
  if (!((_hotCustomEditorInsta8 = hotCustomEditorInstanceRef.current) !== null && _hotCustomEditorInsta8 !== void 0 && _hotCustomEditorInsta8.hot)) return;
@@ -1074,7 +1086,7 @@ var HotColumn = function HotColumn(props) {
1074
1086
  }, editorPortal);
1075
1087
  };
1076
1088
 
1077
- var version="17.1.0-rc9";
1089
+ var version="18.0.0-rc1";
1078
1090
 
1079
1091
  /**
1080
1092
  * Component used to manage the renderer component portals.
@@ -2330,6 +2342,12 @@ var HotTableInner = /*#__PURE__*/React.forwardRef(function (props, ref) {
2330
2342
  * Initialize Handsontable after the component has mounted.
2331
2343
  */
2332
2344
  React.useEffect(function () {
2345
+ // React guarantees child effects run before parent effects on each
2346
+ // commit, so by the time this parent useEffect runs, every HotColumn
2347
+ // has already written its slot. Trim to drop any leftover slots from
2348
+ // a previous mount (e.g. StrictMode's double-invoke or HMR).
2349
+ var hotColumnCount = React.Children.toArray(props.children).filter(isHotColumn).length;
2350
+ context.trimColumnSettings(hotColumnCount);
2333
2351
  var newGlobalSettings = createNewGlobalSettings(true);
2334
2352
 
2335
2353
  // Update prevProps with the current props
@@ -2372,6 +2390,13 @@ var HotTableInner = /*#__PURE__*/React.forwardRef(function (props, ref) {
2372
2390
  useUpdateEffect(function () {
2373
2391
  clearCache();
2374
2392
  var hotInstance = getHotInstance();
2393
+
2394
+ // React guarantees child effects run before parent effects on each
2395
+ // commit, so by the time this parent useUpdateEffect runs, every
2396
+ // surviving HotColumn has already written its slot. Trim to drop
2397
+ // stale entries left behind by HotColumns that unmounted.
2398
+ var hotColumnCount = React.Children.toArray(props.children).filter(isHotColumn).length;
2399
+ context.trimColumnSettings(hotColumnCount);
2375
2400
  var newGlobalSettings = createNewGlobalSettings(false, prevProps.current);
2376
2401
 
2377
2402
  // Update prevProps with the current props
@@ -2409,7 +2434,11 @@ var HotTableInner = /*#__PURE__*/React.forwardRef(function (props, ref) {
2409
2434
  var editorPortal = createEditorPortal(getOwnerDocument(), props.editor);
2410
2435
  return /*#__PURE__*/React__default["default"].createElement(React.Fragment, null, /*#__PURE__*/React__default["default"].createElement("div", _extends({
2411
2436
  ref: hotElementRef
2412
- }, containerProps), hotColumnWrapped), /*#__PURE__*/React__default["default"].createElement(RenderersPortalManager, {
2437
+ }, containerProps, {
2438
+ style: _objectSpread2({
2439
+ height: '100%'
2440
+ }, containerProps.style)
2441
+ }), hotColumnWrapped), /*#__PURE__*/React__default["default"].createElement(RenderersPortalManager, {
2413
2442
  ref: context.setRenderersPortalManagerRef
2414
2443
  }), /*#__PURE__*/React__default["default"].createElement(EditorContextProvider, {
2415
2444
  hooksRef: globalEditorHooksRef,
@@ -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: 17.1.0-rc9 (built at Wed May 13 2026 10:01:45 GMT+0000 (Coordinated Universal Time))
28
+ * Version: 18.0.0-rc1 (built at Tue Jun 16 2026 10:11:54 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')) :
@@ -211,7 +211,7 @@ function _toPrimitive(t, r) {
211
211
  if ("object" != typeof i) return i;
212
212
  throw new TypeError("@@toPrimitive must return a primitive value.");
213
213
  }
214
- return (String )(t);
214
+ return ("string" === r ? String : Number)(t);
215
215
  }
216
216
  function _toPropertyKey(t) {
217
217
  var i = _toPrimitive(t, "string");
@@ -380,11 +380,18 @@ function createPortal(rElement) {
380
380
  if (!ownerDocument) {
381
381
  ownerDocument = document;
382
382
  }
383
- if (!bulkComponentContainer) {
384
- bulkComponentContainer = ownerDocument.createDocumentFragment();
383
+ var portalContainer = cachedContainer;
384
+
385
+ // A new container needs an anchor before React mounts into it. A cached
386
+ // container is already attached (typically inside its TD) and must be
387
+ // left in place to avoid wiping the DOM on every grid render.
388
+ if (!portalContainer) {
389
+ if (!bulkComponentContainer) {
390
+ bulkComponentContainer = ownerDocument.createDocumentFragment();
391
+ }
392
+ portalContainer = ownerDocument.createElement('DIV');
393
+ bulkComponentContainer.appendChild(portalContainer);
385
394
  }
386
- var portalContainer = cachedContainer !== null && cachedContainer !== void 0 ? cachedContainer : ownerDocument.createElement('DIV');
387
- bulkComponentContainer.appendChild(portalContainer);
388
395
  return {
389
396
  portal: /*#__PURE__*/ReactDOM__default["default"].createPortal(rElement, portalContainer, portalKey),
390
397
  portalContainer: portalContainer
@@ -560,6 +567,9 @@ var HotTableContextProvider = function HotTableContextProvider(_ref) {
560
567
  var setHotColumnSettings = React.useCallback(function (columnSettings, columnIndex) {
561
568
  columnsSettings.current[columnIndex] = columnSettings;
562
569
  }, []);
570
+ var trimColumnSettings = React.useCallback(function (length) {
571
+ columnsSettings.current.length = length;
572
+ }, []);
563
573
  var componentRendererColumns = React.useRef(new Map());
564
574
  var renderedCellCache = React.useRef(new Map());
565
575
  var clearRenderedCellCache = React.useCallback(function () {
@@ -578,38 +588,36 @@ var HotTableContextProvider = function HotTableContextProvider(_ref) {
578
588
  var instanceGuid = instance.guid;
579
589
  var portalContainerKey = "".concat(instanceGuid, "-").concat(key);
580
590
  var portalKey = "".concat(key, "-").concat(instanceGuid);
581
- if (renderedCellCache.current.has(key)) {
582
- TD.innerHTML = renderedCellCache.current.get(key).innerHTML;
583
- }
584
591
  if (TD && !TD.getAttribute('ghost-table')) {
585
- var cachedPortal = portalCache.current.get(portalKey);
586
592
  var cachedPortalContainer = portalContainerCache.current.get(portalContainerKey);
587
- while (TD.firstChild) {
588
- TD.removeChild(TD.firstChild);
589
- }
590
-
591
- // if portal already exists, do not recreate
592
- if (cachedPortal && cachedPortalContainer) {
593
- TD.appendChild(cachedPortalContainer);
594
- } else {
595
- var rendererElement = /*#__PURE__*/React__default["default"].createElement(Renderer, {
596
- instance: instance,
597
- TD: TD,
598
- row: row,
599
- col: col,
600
- prop: prop,
601
- value: value,
602
- cellProperties: cellProperties
603
- });
604
- var _createPortal = createPortal(rendererElement, TD.ownerDocument, portalKey, cachedPortalContainer),
605
- portal = _createPortal.portal,
606
- portalContainer = _createPortal.portalContainer;
607
- portalContainerCache.current.set(portalContainerKey, portalContainer);
593
+ // When the cached portal container is still attached to the same
594
+ // TD as the previous render, the DOM is already correct and must
595
+ // not be wiped. Wiping detaches the React-managed children, which
596
+ // forces a full remount of the renderer component on every grid
597
+ // render (see issue #10800).
598
+ var containerInPlace = !!cachedPortalContainer && cachedPortalContainer.parentNode === TD;
599
+ var rendererElement = /*#__PURE__*/React__default["default"].createElement(Renderer, {
600
+ instance: instance,
601
+ TD: TD,
602
+ row: row,
603
+ col: col,
604
+ prop: prop,
605
+ value: value,
606
+ cellProperties: cellProperties
607
+ });
608
+ var _createPortal = createPortal(rendererElement, TD.ownerDocument, portalKey, cachedPortalContainer),
609
+ portal = _createPortal.portal,
610
+ portalContainer = _createPortal.portalContainer;
611
+ if (!containerInPlace) {
612
+ while (TD.firstChild) {
613
+ TD.removeChild(TD.firstChild);
614
+ }
608
615
  TD.appendChild(portalContainer);
609
- portalCache.current.set(portalKey, portal);
610
616
  }
617
+ portalContainerCache.current.set(portalContainerKey, portalContainer);
618
+ portalCache.current.set(portalKey, portal);
611
619
  }
612
- renderedCellCache.current.set("".concat(row, "-").concat(col), TD);
620
+ renderedCellCache.current.set(key, TD);
613
621
  return TD;
614
622
  };
615
623
  }, []);
@@ -627,13 +635,14 @@ var HotTableContextProvider = function HotTableContextProvider(_ref) {
627
635
  componentRendererColumns: componentRendererColumns.current,
628
636
  columnsSettings: columnsSettings.current,
629
637
  emitColumnSettings: setHotColumnSettings,
638
+ trimColumnSettings: trimColumnSettings,
630
639
  getRendererWrapper: getRendererWrapper,
631
640
  clearPortalCache: clearPortalCache,
632
641
  clearRenderedCellCache: clearRenderedCellCache,
633
642
  setRenderersPortalManagerRef: setRenderersPortalManagerRef,
634
643
  pushCellPortalsIntoPortalManager: pushCellPortalsIntoPortalManager
635
644
  };
636
- }, [setHotColumnSettings, getRendererWrapper, clearRenderedCellCache, setRenderersPortalManagerRef, pushCellPortalsIntoPortalManager]);
645
+ }, [setHotColumnSettings, trimColumnSettings, getRendererWrapper, clearRenderedCellCache, setRenderersPortalManagerRef, pushCellPortalsIntoPortalManager]);
637
646
  return /*#__PURE__*/React__default["default"].createElement(HotTableContext.Provider, {
638
647
  value: contextImpl
639
648
  }, children);
@@ -702,11 +711,12 @@ function makeEditorClass(hooksRef, instanceRef) {
702
711
  args[_key] = arguments[_key];
703
712
  }
704
713
  if (!AbstractMethods.includes(propName)) {
705
- result = baseMethod.call.apply(baseMethod, [this].concat(args)); // call super
714
+ var _ref;
715
+ result = (_ref = baseMethod).call.apply(_ref, [this].concat(args)); // call super
706
716
  }
707
717
  if (MethodsMap[propName] && (_hooksRef$current = hooksRef.current) !== null && _hooksRef$current !== void 0 && _hooksRef$current[MethodsMap[propName]]) {
708
- var _ref;
709
- result = (_ref = hooksRef.current[MethodsMap[propName]]).call.apply(_ref, [this].concat(args));
718
+ var _ref2;
719
+ result = (_ref2 = hooksRef.current[MethodsMap[propName]]).call.apply(_ref2, [this].concat(args));
710
720
  }
711
721
  return result;
712
722
  }.bind(_this);
@@ -747,10 +757,10 @@ var EditorContext = /*#__PURE__*/React.createContext(undefined);
747
757
  * @param {Ref} hooksRef Reference for component-based editor overridden hooks object.
748
758
  * @param {RefObject} hotCustomEditorInstanceRef Reference to Handsontable-native editor instance.
749
759
  */
750
- var EditorContextProvider = function EditorContextProvider(_ref2) {
751
- var hooksRef = _ref2.hooksRef,
752
- hotCustomEditorInstanceRef = _ref2.hotCustomEditorInstanceRef,
753
- children = _ref2.children;
760
+ var EditorContextProvider = function EditorContextProvider(_ref3) {
761
+ var hooksRef = _ref3.hooksRef,
762
+ hotCustomEditorInstanceRef = _ref3.hotCustomEditorInstanceRef,
763
+ children = _ref3.children;
754
764
  return /*#__PURE__*/React__default["default"].createElement(EditorContext.Provider, {
755
765
  value: {
756
766
  hooksRef: hooksRef,
@@ -819,9 +829,9 @@ function applyEditorPosition(el, editor, hot, td) {
819
829
  * @returns {UseHotEditorImpl} Editor API methods
820
830
  */
821
831
  function useHotEditor(overriddenHooks, deps) {
822
- var _ref3 = React.useContext(EditorContext),
823
- hooksRef = _ref3.hooksRef,
824
- hotCustomEditorInstanceRef = _ref3.hotCustomEditorInstanceRef;
832
+ var _ref4 = React.useContext(EditorContext),
833
+ hooksRef = _ref4.hooksRef,
834
+ hotCustomEditorInstanceRef = _ref4.hotCustomEditorInstanceRef;
825
835
  var _useState = React.useState(0),
826
836
  _useState2 = _slicedToArray(_useState, 2),
827
837
  rerenderTrigger = _useState2[0],
@@ -865,11 +875,13 @@ function useHotEditor(overriddenHooks, deps) {
865
875
  },
866
876
  get row() {
867
877
  var _hotCustomEditorInsta6;
868
- return (_hotCustomEditorInsta6 = hotCustomEditorInstanceRef.current) === null || _hotCustomEditorInsta6 === void 0 ? void 0 : _hotCustomEditorInsta6.row;
878
+ var row = (_hotCustomEditorInsta6 = hotCustomEditorInstanceRef.current) === null || _hotCustomEditorInsta6 === void 0 ? void 0 : _hotCustomEditorInsta6.row;
879
+ return row !== null && row !== void 0 ? row : undefined;
869
880
  },
870
881
  get col() {
871
882
  var _hotCustomEditorInsta7;
872
- return (_hotCustomEditorInsta7 = hotCustomEditorInstanceRef.current) === null || _hotCustomEditorInsta7 === void 0 ? void 0 : _hotCustomEditorInsta7.col;
883
+ var col = (_hotCustomEditorInsta7 = hotCustomEditorInstanceRef.current) === null || _hotCustomEditorInsta7 === void 0 ? void 0 : _hotCustomEditorInsta7.col;
884
+ return col !== null && col !== void 0 ? col : undefined;
873
885
  }
874
886
  };
875
887
  }, [rerenderTrigger, hotCustomEditorInstanceRef, deferredValue]);
@@ -879,23 +891,23 @@ function useHotEditor(overriddenHooks, deps) {
879
891
 
880
892
  // EditorComponent props - children typed to work with JSX syntax
881
893
 
882
- function EditorComponent(_ref4) {
883
- var _onPrepare = _ref4.onPrepare,
884
- _onClose = _ref4.onClose,
885
- _onOpen = _ref4.onOpen,
886
- _onFocus = _ref4.onFocus,
887
- children = _ref4.children,
888
- _ref4$shortcutsGroup = _ref4.shortcutsGroup,
889
- shortcutsGroup = _ref4$shortcutsGroup === void 0 ? "custom-editor" : _ref4$shortcutsGroup,
890
- shortcuts = _ref4.shortcuts;
894
+ function EditorComponent(_ref5) {
895
+ var _onPrepare = _ref5.onPrepare,
896
+ _onClose = _ref5.onClose,
897
+ _onOpen = _ref5.onOpen,
898
+ _onFocus = _ref5.onFocus,
899
+ children = _ref5.children,
900
+ _ref5$shortcutsGroup = _ref5.shortcutsGroup,
901
+ shortcutsGroup = _ref5$shortcutsGroup === void 0 ? "custom-editor" : _ref5$shortcutsGroup,
902
+ shortcuts = _ref5.shortcuts;
891
903
  var mainElementRef = React.useRef(null);
892
904
  var currentValue = React.useRef(undefined);
893
905
  var _useState5 = React.useState(),
894
906
  _useState6 = _slicedToArray(_useState5, 2),
895
907
  themeClassName = _useState6[0],
896
908
  setThemeClassName = _useState6[1];
897
- var _ref5 = React.useContext(EditorContext),
898
- hotCustomEditorInstanceRef = _ref5.hotCustomEditorInstanceRef;
909
+ var _ref6 = React.useContext(EditorContext),
910
+ hotCustomEditorInstanceRef = _ref6.hotCustomEditorInstanceRef;
899
911
  var registerShortcuts = React.useCallback(function () {
900
912
  var _hotCustomEditorInsta8, _hotCustomEditorInsta9, _hotCustomEditorInsta0;
901
913
  if (!((_hotCustomEditorInsta8 = hotCustomEditorInstanceRef.current) !== null && _hotCustomEditorInsta8 !== void 0 && _hotCustomEditorInsta8.hot)) return;
@@ -1099,7 +1111,7 @@ var HotColumn = function HotColumn(props) {
1099
1111
  }, editorPortal);
1100
1112
  };
1101
1113
 
1102
- var version="17.1.0-rc9";
1114
+ var version="18.0.0-rc1";
1103
1115
 
1104
1116
  /**
1105
1117
  * Component used to manage the renderer component portals.
@@ -1328,6 +1340,12 @@ var HotTableInner = /*#__PURE__*/React.forwardRef(function (props, ref) {
1328
1340
  * Initialize Handsontable after the component has mounted.
1329
1341
  */
1330
1342
  React.useEffect(function () {
1343
+ // React guarantees child effects run before parent effects on each
1344
+ // commit, so by the time this parent useEffect runs, every HotColumn
1345
+ // has already written its slot. Trim to drop any leftover slots from
1346
+ // a previous mount (e.g. StrictMode's double-invoke or HMR).
1347
+ var hotColumnCount = React.Children.toArray(props.children).filter(isHotColumn).length;
1348
+ context.trimColumnSettings(hotColumnCount);
1331
1349
  var newGlobalSettings = createNewGlobalSettings(true);
1332
1350
 
1333
1351
  // Update prevProps with the current props
@@ -1370,6 +1388,13 @@ var HotTableInner = /*#__PURE__*/React.forwardRef(function (props, ref) {
1370
1388
  useUpdateEffect(function () {
1371
1389
  clearCache();
1372
1390
  var hotInstance = getHotInstance();
1391
+
1392
+ // React guarantees child effects run before parent effects on each
1393
+ // commit, so by the time this parent useUpdateEffect runs, every
1394
+ // surviving HotColumn has already written its slot. Trim to drop
1395
+ // stale entries left behind by HotColumns that unmounted.
1396
+ var hotColumnCount = React.Children.toArray(props.children).filter(isHotColumn).length;
1397
+ context.trimColumnSettings(hotColumnCount);
1373
1398
  var newGlobalSettings = createNewGlobalSettings(false, prevProps.current);
1374
1399
 
1375
1400
  // Update prevProps with the current props
@@ -1407,7 +1432,11 @@ var HotTableInner = /*#__PURE__*/React.forwardRef(function (props, ref) {
1407
1432
  var editorPortal = createEditorPortal(getOwnerDocument(), props.editor);
1408
1433
  return /*#__PURE__*/React__default["default"].createElement(React.Fragment, null, /*#__PURE__*/React__default["default"].createElement("div", _extends({
1409
1434
  ref: hotElementRef
1410
- }, containerProps), hotColumnWrapped), /*#__PURE__*/React__default["default"].createElement(RenderersPortalManager, {
1435
+ }, containerProps, {
1436
+ style: _objectSpread2({
1437
+ height: '100%'
1438
+ }, containerProps.style)
1439
+ }), hotColumnWrapped), /*#__PURE__*/React__default["default"].createElement(RenderersPortalManager, {
1411
1440
  ref: context.setRenderersPortalManagerRef
1412
1441
  }), /*#__PURE__*/React__default["default"].createElement(EditorContextProvider, {
1413
1442
  hooksRef: globalEditorHooksRef,