handsontable 16.1.0-next-91b8a0f-20250905 → 16.1.0-next-1494b74-20250909

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.
@@ -348,12 +348,14 @@ class Viewport {
348
348
  const rowsCalculator = this.createRowsCalculator();
349
349
  const columnsCalculator = this.createColumnsCalculator();
350
350
  if (fastDraw && !wtSettings.getSetting('renderAllRows')) {
351
- const proposedRowsVisibleCalculator = rowsCalculator.getResultsFor('fullyVisible');
352
- fastDraw = this.areAllProposedVisibleRowsAlreadyRendered(proposedRowsVisibleCalculator);
351
+ const proposedFullyVisibleRowsCalculator = rowsCalculator.getResultsFor('fullyVisible');
352
+ const proposedPartiallyVisibleRowsCalculator = rowsCalculator.getResultsFor('partiallyVisible');
353
+ fastDraw = this.areAllProposedVisibleRowsAlreadyRendered(proposedFullyVisibleRowsCalculator, proposedPartiallyVisibleRowsCalculator);
353
354
  }
354
355
  if (fastDraw && !wtSettings.getSetting('renderAllColumns')) {
355
- const proposedColumnsVisibleCalculator = columnsCalculator.getResultsFor('fullyVisible');
356
- fastDraw = this.areAllProposedVisibleColumnsAlreadyRendered(proposedColumnsVisibleCalculator);
356
+ const proposedFullyVisibleColumnsCalculator = columnsCalculator.getResultsFor('fullyVisible');
357
+ const proposedPartiallyVisibleColumnsCalculator = columnsCalculator.getResultsFor('partiallyVisible');
358
+ fastDraw = this.areAllProposedVisibleColumnsAlreadyRendered(proposedFullyVisibleColumnsCalculator, proposedPartiallyVisibleColumnsCalculator);
357
359
  }
358
360
  if (!fastDraw) {
359
361
  this.rowsRenderCalculator = rowsCalculator.getResultsFor('rendered');
@@ -380,30 +382,35 @@ class Viewport {
380
382
  }
381
383
 
382
384
  /**
383
- * Returns information whether proposedRowsVisibleCalculator viewport
385
+ * Returns information whether proposedFullyVisibleRowsCalculator viewport
384
386
  * is contained inside rows rendered in previous draw (cached in rowsRenderCalculator).
385
387
  *
386
- * @param {ViewportRowsCalculator} proposedRowsVisibleCalculator The instance of the viewport calculator to compare with.
388
+ * @param {ViewportRowsCalculator} proposedFullyVisibleRowsCalculator The instance of the fully visible rows viewport calculator to compare with.
389
+ * @param {ViewportRowsCalculator} proposedPartiallyVisibleRowsCalculator The instance of the partially visible rows viewport calculator to compare with.
387
390
  * @returns {boolean} Returns `true` if all proposed visible rows are already rendered (meaning: redraw is not needed).
388
391
  * Returns `false` if at least one proposed visible row is not already rendered (meaning: redraw is needed).
389
392
  */
390
- areAllProposedVisibleRowsAlreadyRendered(proposedRowsVisibleCalculator) {
393
+ areAllProposedVisibleRowsAlreadyRendered(proposedFullyVisibleRowsCalculator, proposedPartiallyVisibleRowsCalculator) {
391
394
  if (!this.rowsVisibleCalculator) {
392
395
  return false;
393
396
  }
394
397
  let {
395
398
  startRow,
396
399
  endRow
397
- } = proposedRowsVisibleCalculator;
400
+ } = proposedFullyVisibleRowsCalculator;
401
+ const {
402
+ startRow: partiallyVisibleStartRow,
403
+ endRow: partiallyVisibleEndRow
404
+ } = proposedPartiallyVisibleRowsCalculator;
398
405
 
399
406
  // if there are no fully visible rows at all...
400
407
  if (startRow === null && endRow === null) {
401
- if (!proposedRowsVisibleCalculator.isVisibleInTrimmingContainer) {
408
+ if (!proposedFullyVisibleRowsCalculator.isVisibleInTrimmingContainer && !this.wtTable.isRowBeforeRenderedRows(partiallyVisibleStartRow) && !this.wtTable.isRowAfterRenderedRows(partiallyVisibleEndRow)) {
402
409
  return true;
403
410
  }
404
411
  // ...use partially visible rows calculator to determine what render type is needed
405
- startRow = this.rowsPartiallyVisibleCalculator.startRow;
406
- endRow = this.rowsPartiallyVisibleCalculator.endRow;
412
+ startRow = partiallyVisibleStartRow;
413
+ endRow = partiallyVisibleEndRow;
407
414
  }
408
415
  const {
409
416
  startRow: renderedStartRow,
@@ -429,30 +436,35 @@ class Viewport {
429
436
  }
430
437
 
431
438
  /**
432
- * Returns information whether proposedColumnsVisibleCalculator viewport
439
+ * Returns information whether proposedFullyVisibleColumnsCalculator viewport
433
440
  * is contained inside column rendered in previous draw (cached in columnsRenderCalculator).
434
441
  *
435
- * @param {ViewportRowsCalculator} proposedColumnsVisibleCalculator The instance of the viewport calculator to compare with.
442
+ * @param {ViewportRowsCalculator} proposedFullyVisibleColumnsCalculator The instance of the fully visible columns viewport calculator to compare with.
443
+ * @param {ViewportRowsCalculator} proposedPartiallyVisibleColumnsCalculator The instance of the partially visible columns viewport calculator to compare with.
436
444
  * @returns {boolean} Returns `true` if all proposed visible columns are already rendered (meaning: redraw is not needed).
437
445
  * Returns `false` if at least one proposed visible column is not already rendered (meaning: redraw is needed).
438
446
  */
439
- areAllProposedVisibleColumnsAlreadyRendered(proposedColumnsVisibleCalculator) {
447
+ areAllProposedVisibleColumnsAlreadyRendered(proposedFullyVisibleColumnsCalculator, proposedPartiallyVisibleColumnsCalculator) {
440
448
  if (!this.columnsVisibleCalculator) {
441
449
  return false;
442
450
  }
443
451
  let {
444
452
  startColumn,
445
453
  endColumn
446
- } = proposedColumnsVisibleCalculator;
454
+ } = proposedFullyVisibleColumnsCalculator;
455
+ const {
456
+ startColumn: partiallyVisibleStartColumn,
457
+ endColumn: partiallyVisibleEndColumn
458
+ } = proposedPartiallyVisibleColumnsCalculator;
447
459
 
448
460
  // if there are no fully visible columns at all...
449
461
  if (startColumn === null && endColumn === null) {
450
- if (!proposedColumnsVisibleCalculator.isVisibleInTrimmingContainer) {
462
+ if (!proposedFullyVisibleColumnsCalculator.isVisibleInTrimmingContainer && !this.wtTable.isColumnBeforeRenderedColumns(partiallyVisibleStartColumn) && !this.wtTable.isColumnAfterRenderedColumns(partiallyVisibleEndColumn)) {
451
463
  return true;
452
464
  }
453
465
  // ...use partially visible columns calculator to determine what render type is needed
454
- startColumn = this.columnsPartiallyVisibleCalculator.startColumn;
455
- endColumn = this.columnsPartiallyVisibleCalculator.endColumn;
466
+ startColumn = partiallyVisibleStartColumn;
467
+ endColumn = partiallyVisibleEndColumn;
456
468
  }
457
469
  const {
458
470
  startColumn: renderedStartColumn,
@@ -345,12 +345,14 @@ class Viewport {
345
345
  const rowsCalculator = this.createRowsCalculator();
346
346
  const columnsCalculator = this.createColumnsCalculator();
347
347
  if (fastDraw && !wtSettings.getSetting('renderAllRows')) {
348
- const proposedRowsVisibleCalculator = rowsCalculator.getResultsFor('fullyVisible');
349
- fastDraw = this.areAllProposedVisibleRowsAlreadyRendered(proposedRowsVisibleCalculator);
348
+ const proposedFullyVisibleRowsCalculator = rowsCalculator.getResultsFor('fullyVisible');
349
+ const proposedPartiallyVisibleRowsCalculator = rowsCalculator.getResultsFor('partiallyVisible');
350
+ fastDraw = this.areAllProposedVisibleRowsAlreadyRendered(proposedFullyVisibleRowsCalculator, proposedPartiallyVisibleRowsCalculator);
350
351
  }
351
352
  if (fastDraw && !wtSettings.getSetting('renderAllColumns')) {
352
- const proposedColumnsVisibleCalculator = columnsCalculator.getResultsFor('fullyVisible');
353
- fastDraw = this.areAllProposedVisibleColumnsAlreadyRendered(proposedColumnsVisibleCalculator);
353
+ const proposedFullyVisibleColumnsCalculator = columnsCalculator.getResultsFor('fullyVisible');
354
+ const proposedPartiallyVisibleColumnsCalculator = columnsCalculator.getResultsFor('partiallyVisible');
355
+ fastDraw = this.areAllProposedVisibleColumnsAlreadyRendered(proposedFullyVisibleColumnsCalculator, proposedPartiallyVisibleColumnsCalculator);
354
356
  }
355
357
  if (!fastDraw) {
356
358
  this.rowsRenderCalculator = rowsCalculator.getResultsFor('rendered');
@@ -377,30 +379,35 @@ class Viewport {
377
379
  }
378
380
 
379
381
  /**
380
- * Returns information whether proposedRowsVisibleCalculator viewport
382
+ * Returns information whether proposedFullyVisibleRowsCalculator viewport
381
383
  * is contained inside rows rendered in previous draw (cached in rowsRenderCalculator).
382
384
  *
383
- * @param {ViewportRowsCalculator} proposedRowsVisibleCalculator The instance of the viewport calculator to compare with.
385
+ * @param {ViewportRowsCalculator} proposedFullyVisibleRowsCalculator The instance of the fully visible rows viewport calculator to compare with.
386
+ * @param {ViewportRowsCalculator} proposedPartiallyVisibleRowsCalculator The instance of the partially visible rows viewport calculator to compare with.
384
387
  * @returns {boolean} Returns `true` if all proposed visible rows are already rendered (meaning: redraw is not needed).
385
388
  * Returns `false` if at least one proposed visible row is not already rendered (meaning: redraw is needed).
386
389
  */
387
- areAllProposedVisibleRowsAlreadyRendered(proposedRowsVisibleCalculator) {
390
+ areAllProposedVisibleRowsAlreadyRendered(proposedFullyVisibleRowsCalculator, proposedPartiallyVisibleRowsCalculator) {
388
391
  if (!this.rowsVisibleCalculator) {
389
392
  return false;
390
393
  }
391
394
  let {
392
395
  startRow,
393
396
  endRow
394
- } = proposedRowsVisibleCalculator;
397
+ } = proposedFullyVisibleRowsCalculator;
398
+ const {
399
+ startRow: partiallyVisibleStartRow,
400
+ endRow: partiallyVisibleEndRow
401
+ } = proposedPartiallyVisibleRowsCalculator;
395
402
 
396
403
  // if there are no fully visible rows at all...
397
404
  if (startRow === null && endRow === null) {
398
- if (!proposedRowsVisibleCalculator.isVisibleInTrimmingContainer) {
405
+ if (!proposedFullyVisibleRowsCalculator.isVisibleInTrimmingContainer && !this.wtTable.isRowBeforeRenderedRows(partiallyVisibleStartRow) && !this.wtTable.isRowAfterRenderedRows(partiallyVisibleEndRow)) {
399
406
  return true;
400
407
  }
401
408
  // ...use partially visible rows calculator to determine what render type is needed
402
- startRow = this.rowsPartiallyVisibleCalculator.startRow;
403
- endRow = this.rowsPartiallyVisibleCalculator.endRow;
409
+ startRow = partiallyVisibleStartRow;
410
+ endRow = partiallyVisibleEndRow;
404
411
  }
405
412
  const {
406
413
  startRow: renderedStartRow,
@@ -426,30 +433,35 @@ class Viewport {
426
433
  }
427
434
 
428
435
  /**
429
- * Returns information whether proposedColumnsVisibleCalculator viewport
436
+ * Returns information whether proposedFullyVisibleColumnsCalculator viewport
430
437
  * is contained inside column rendered in previous draw (cached in columnsRenderCalculator).
431
438
  *
432
- * @param {ViewportRowsCalculator} proposedColumnsVisibleCalculator The instance of the viewport calculator to compare with.
439
+ * @param {ViewportRowsCalculator} proposedFullyVisibleColumnsCalculator The instance of the fully visible columns viewport calculator to compare with.
440
+ * @param {ViewportRowsCalculator} proposedPartiallyVisibleColumnsCalculator The instance of the partially visible columns viewport calculator to compare with.
433
441
  * @returns {boolean} Returns `true` if all proposed visible columns are already rendered (meaning: redraw is not needed).
434
442
  * Returns `false` if at least one proposed visible column is not already rendered (meaning: redraw is needed).
435
443
  */
436
- areAllProposedVisibleColumnsAlreadyRendered(proposedColumnsVisibleCalculator) {
444
+ areAllProposedVisibleColumnsAlreadyRendered(proposedFullyVisibleColumnsCalculator, proposedPartiallyVisibleColumnsCalculator) {
437
445
  if (!this.columnsVisibleCalculator) {
438
446
  return false;
439
447
  }
440
448
  let {
441
449
  startColumn,
442
450
  endColumn
443
- } = proposedColumnsVisibleCalculator;
451
+ } = proposedFullyVisibleColumnsCalculator;
452
+ const {
453
+ startColumn: partiallyVisibleStartColumn,
454
+ endColumn: partiallyVisibleEndColumn
455
+ } = proposedPartiallyVisibleColumnsCalculator;
444
456
 
445
457
  // if there are no fully visible columns at all...
446
458
  if (startColumn === null && endColumn === null) {
447
- if (!proposedColumnsVisibleCalculator.isVisibleInTrimmingContainer) {
459
+ if (!proposedFullyVisibleColumnsCalculator.isVisibleInTrimmingContainer && !this.wtTable.isColumnBeforeRenderedColumns(partiallyVisibleStartColumn) && !this.wtTable.isColumnAfterRenderedColumns(partiallyVisibleEndColumn)) {
448
460
  return true;
449
461
  }
450
462
  // ...use partially visible columns calculator to determine what render type is needed
451
- startColumn = this.columnsPartiallyVisibleCalculator.startColumn;
452
- endColumn = this.columnsPartiallyVisibleCalculator.endColumn;
463
+ startColumn = partiallyVisibleStartColumn;
464
+ endColumn = partiallyVisibleEndColumn;
453
465
  }
454
466
  const {
455
467
  startColumn: renderedStartColumn,
package/base.js CHANGED
@@ -45,8 +45,8 @@ Handsontable.hooks = _hooks.Hooks.getSingleton();
45
45
  Handsontable.CellCoords = _src.CellCoords;
46
46
  Handsontable.CellRange = _src.CellRange;
47
47
  Handsontable.packageName = 'handsontable';
48
- Handsontable.buildDate = "05/09/2025 09:35:20";
49
- Handsontable.version = "16.1.0-next-91b8a0f-20250905";
48
+ Handsontable.buildDate = "09/09/2025 12:56:23";
49
+ Handsontable.version = "16.1.0-next-1494b74-20250909";
50
50
  Handsontable.languages = {
51
51
  dictionaryKeys: _registry.dictionaryKeys,
52
52
  getLanguageDictionary: _registry.getLanguageDictionary,
package/base.mjs CHANGED
@@ -35,8 +35,8 @@ Handsontable.hooks = Hooks.getSingleton();
35
35
  Handsontable.CellCoords = CellCoords;
36
36
  Handsontable.CellRange = CellRange;
37
37
  Handsontable.packageName = 'handsontable';
38
- Handsontable.buildDate = "05/09/2025 09:35:26";
39
- Handsontable.version = "16.1.0-next-91b8a0f-20250905";
38
+ Handsontable.buildDate = "09/09/2025 12:56:29";
39
+ Handsontable.version = "16.1.0-next-1494b74-20250909";
40
40
  Handsontable.languages = {
41
41
  dictionaryKeys,
42
42
  getLanguageDictionary,
package/core.js CHANGED
@@ -58,6 +58,13 @@ var _valueAccessors = require("./utils/valueAccessors");
58
58
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
59
59
  let activeGuid = null;
60
60
 
61
+ /**
62
+ * A set of deprecated warn instances.
63
+ *
64
+ * @type {Set<string>}
65
+ */
66
+ const deprecatedWarnInstances = new WeakSet();
67
+
61
68
  /**
62
69
  * Keeps the collection of the all Handsontable instances created on the same page. The
63
70
  * list is then used to trigger the "afterUnlisten" hook when the "listen()" method was
@@ -2536,9 +2543,13 @@ function Core(rootContainer, userSettings) {
2536
2543
  instance.useTheme(settings.themeName);
2537
2544
  }
2538
2545
  }
2539
- if ((0, _rootInstance.isRootInstance)(instance) && instance.stylesHandler.isClassicTheme()) {
2546
+ if (deprecatedWarnInstances.has(instance) && instance.stylesHandler.getThemeName() !== undefined) {
2547
+ deprecatedWarnInstances.delete(instance);
2548
+ }
2549
+ if ((0, _rootInstance.isRootInstance)(instance) && !deprecatedWarnInstances.has(instance) && instance.stylesHandler.isClassicTheme()) {
2540
2550
  // eslint-disable-next-line max-len
2541
2551
  (0, _console.deprecatedWarn)('Handsontable classic theme is a legacy theme and will be removed in version 17.0. Please update your theme settings to ensure compatibility with future versions.');
2552
+ deprecatedWarnInstances.add(instance);
2542
2553
  }
2543
2554
 
2544
2555
  // Load data or create data map
package/core.mjs CHANGED
@@ -53,6 +53,13 @@ import { install as installAccessibilityAnnouncer, uninstall as uninstallAccessi
53
53
  import { getValueSetterValue } from "./utils/valueAccessors.mjs";
54
54
  let activeGuid = null;
55
55
 
56
+ /**
57
+ * A set of deprecated warn instances.
58
+ *
59
+ * @type {Set<string>}
60
+ */
61
+ const deprecatedWarnInstances = new WeakSet();
62
+
56
63
  /**
57
64
  * Keeps the collection of the all Handsontable instances created on the same page. The
58
65
  * list is then used to trigger the "afterUnlisten" hook when the "listen()" method was
@@ -2531,9 +2538,13 @@ export default function Core(rootContainer, userSettings) {
2531
2538
  instance.useTheme(settings.themeName);
2532
2539
  }
2533
2540
  }
2534
- if (isRootInstance(instance) && instance.stylesHandler.isClassicTheme()) {
2541
+ if (deprecatedWarnInstances.has(instance) && instance.stylesHandler.getThemeName() !== undefined) {
2542
+ deprecatedWarnInstances.delete(instance);
2543
+ }
2544
+ if (isRootInstance(instance) && !deprecatedWarnInstances.has(instance) && instance.stylesHandler.isClassicTheme()) {
2535
2545
  // eslint-disable-next-line max-len
2536
2546
  deprecatedWarn('Handsontable classic theme is a legacy theme and will be removed in version 17.0. Please update your theme settings to ensure compatibility with future versions.');
2547
+ deprecatedWarnInstances.add(instance);
2537
2548
  }
2538
2549
 
2539
2550
  // Load data or create data map
@@ -26,8 +26,8 @@
26
26
  * INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER ARISING FROM
27
27
  * USE OR INABILITY TO USE THIS SOFTWARE.
28
28
  *
29
- * Version: 16.1.0-next-91b8a0f-20250905
30
- * Release date: 11/09/2025 (built at 05/09/2025 09:35:49)
29
+ * Version: 16.1.0-next-1494b74-20250909
30
+ * Release date: 11/09/2025 (built at 09/09/2025 12:56:52)
31
31
  */
32
32
  /**
33
33
  * Fix for bootstrap styles
@@ -26,8 +26,8 @@
26
26
  * INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER ARISING FROM
27
27
  * USE OR INABILITY TO USE THIS SOFTWARE.
28
28
  *
29
- * Version: 16.1.0-next-91b8a0f-20250905
30
- * Release date: 11/09/2025 (built at 05/09/2025 09:35:49)
29
+ * Version: 16.1.0-next-1494b74-20250909
30
+ * Release date: 11/09/2025 (built at 09/09/2025 12:56:52)
31
31
  */
32
32
  /**
33
33
  * Fix for bootstrap styles
@@ -25,8 +25,8 @@
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: 16.1.0-next-91b8a0f-20250905
29
- * Release date: 11/09/2025 (built at 05/09/2025 09:35:31)
28
+ * Version: 16.1.0-next-1494b74-20250909
29
+ * Release date: 11/09/2025 (built at 09/09/2025 12:56:34)
30
30
  */
31
31
  (function webpackUniversalModuleDefinition(root, factory) {
32
32
  if(typeof exports === 'object' && typeof module === 'object')
@@ -42877,8 +42877,8 @@ Handsontable.hooks = _hooks.Hooks.getSingleton();
42877
42877
  Handsontable.CellCoords = _src.CellCoords;
42878
42878
  Handsontable.CellRange = _src.CellRange;
42879
42879
  Handsontable.packageName = 'handsontable';
42880
- Handsontable.buildDate = "05/09/2025 09:35:31";
42881
- Handsontable.version = "16.1.0-next-91b8a0f-20250905";
42880
+ Handsontable.buildDate = "09/09/2025 12:56:34";
42881
+ Handsontable.version = "16.1.0-next-1494b74-20250909";
42882
42882
  Handsontable.languages = {
42883
42883
  dictionaryKeys: _registry.dictionaryKeys,
42884
42884
  getLanguageDictionary: _registry.getLanguageDictionary,
@@ -42959,6 +42959,13 @@ var _a11yAnnouncer = __webpack_require__(767);
42959
42959
  var _valueAccessors = __webpack_require__(680);
42960
42960
  let activeGuid = null;
42961
42961
 
42962
+ /**
42963
+ * A set of deprecated warn instances.
42964
+ *
42965
+ * @type {Set<string>}
42966
+ */
42967
+ const deprecatedWarnInstances = new WeakSet();
42968
+
42962
42969
  /**
42963
42970
  * Keeps the collection of the all Handsontable instances created on the same page. The
42964
42971
  * list is then used to trigger the "afterUnlisten" hook when the "listen()" method was
@@ -45437,9 +45444,13 @@ function Core(rootContainer, userSettings) {
45437
45444
  instance.useTheme(settings.themeName);
45438
45445
  }
45439
45446
  }
45440
- if ((0, _rootInstance.isRootInstance)(instance) && instance.stylesHandler.isClassicTheme()) {
45447
+ if (deprecatedWarnInstances.has(instance) && instance.stylesHandler.getThemeName() !== undefined) {
45448
+ deprecatedWarnInstances.delete(instance);
45449
+ }
45450
+ if ((0, _rootInstance.isRootInstance)(instance) && !deprecatedWarnInstances.has(instance) && instance.stylesHandler.isClassicTheme()) {
45441
45451
  // eslint-disable-next-line max-len
45442
45452
  (0, _console.deprecatedWarn)('Handsontable classic theme is a legacy theme and will be removed in version 17.0. Please update your theme settings to ensure compatibility with future versions.');
45453
+ deprecatedWarnInstances.add(instance);
45443
45454
  }
45444
45455
 
45445
45456
  // Load data or create data map
@@ -54777,7 +54788,7 @@ const domMessages = {
54777
54788
  function _injectProductInfo(key, element) {
54778
54789
  const hasValidType = !isEmpty(key);
54779
54790
  const isNonCommercial = typeof key === 'string' && key.toLowerCase() === 'non-commercial-and-evaluation';
54780
- const hotVersion = "16.1.0-next-91b8a0f-20250905";
54791
+ const hotVersion = "16.1.0-next-1494b74-20250909";
54781
54792
  let keyValidityDate;
54782
54793
  let consoleMessageState = 'invalid';
54783
54794
  let domMessageState = 'invalid';
@@ -84436,12 +84447,14 @@ class Viewport {
84436
84447
  const rowsCalculator = this.createRowsCalculator();
84437
84448
  const columnsCalculator = this.createColumnsCalculator();
84438
84449
  if (fastDraw && !wtSettings.getSetting('renderAllRows')) {
84439
- const proposedRowsVisibleCalculator = rowsCalculator.getResultsFor('fullyVisible');
84440
- fastDraw = this.areAllProposedVisibleRowsAlreadyRendered(proposedRowsVisibleCalculator);
84450
+ const proposedFullyVisibleRowsCalculator = rowsCalculator.getResultsFor('fullyVisible');
84451
+ const proposedPartiallyVisibleRowsCalculator = rowsCalculator.getResultsFor('partiallyVisible');
84452
+ fastDraw = this.areAllProposedVisibleRowsAlreadyRendered(proposedFullyVisibleRowsCalculator, proposedPartiallyVisibleRowsCalculator);
84441
84453
  }
84442
84454
  if (fastDraw && !wtSettings.getSetting('renderAllColumns')) {
84443
- const proposedColumnsVisibleCalculator = columnsCalculator.getResultsFor('fullyVisible');
84444
- fastDraw = this.areAllProposedVisibleColumnsAlreadyRendered(proposedColumnsVisibleCalculator);
84455
+ const proposedFullyVisibleColumnsCalculator = columnsCalculator.getResultsFor('fullyVisible');
84456
+ const proposedPartiallyVisibleColumnsCalculator = columnsCalculator.getResultsFor('partiallyVisible');
84457
+ fastDraw = this.areAllProposedVisibleColumnsAlreadyRendered(proposedFullyVisibleColumnsCalculator, proposedPartiallyVisibleColumnsCalculator);
84445
84458
  }
84446
84459
  if (!fastDraw) {
84447
84460
  this.rowsRenderCalculator = rowsCalculator.getResultsFor('rendered');
@@ -84468,30 +84481,35 @@ class Viewport {
84468
84481
  }
84469
84482
 
84470
84483
  /**
84471
- * Returns information whether proposedRowsVisibleCalculator viewport
84484
+ * Returns information whether proposedFullyVisibleRowsCalculator viewport
84472
84485
  * is contained inside rows rendered in previous draw (cached in rowsRenderCalculator).
84473
84486
  *
84474
- * @param {ViewportRowsCalculator} proposedRowsVisibleCalculator The instance of the viewport calculator to compare with.
84487
+ * @param {ViewportRowsCalculator} proposedFullyVisibleRowsCalculator The instance of the fully visible rows viewport calculator to compare with.
84488
+ * @param {ViewportRowsCalculator} proposedPartiallyVisibleRowsCalculator The instance of the partially visible rows viewport calculator to compare with.
84475
84489
  * @returns {boolean} Returns `true` if all proposed visible rows are already rendered (meaning: redraw is not needed).
84476
84490
  * Returns `false` if at least one proposed visible row is not already rendered (meaning: redraw is needed).
84477
84491
  */
84478
- areAllProposedVisibleRowsAlreadyRendered(proposedRowsVisibleCalculator) {
84492
+ areAllProposedVisibleRowsAlreadyRendered(proposedFullyVisibleRowsCalculator, proposedPartiallyVisibleRowsCalculator) {
84479
84493
  if (!this.rowsVisibleCalculator) {
84480
84494
  return false;
84481
84495
  }
84482
84496
  let {
84483
84497
  startRow,
84484
84498
  endRow
84485
- } = proposedRowsVisibleCalculator;
84499
+ } = proposedFullyVisibleRowsCalculator;
84500
+ const {
84501
+ startRow: partiallyVisibleStartRow,
84502
+ endRow: partiallyVisibleEndRow
84503
+ } = proposedPartiallyVisibleRowsCalculator;
84486
84504
 
84487
84505
  // if there are no fully visible rows at all...
84488
84506
  if (startRow === null && endRow === null) {
84489
- if (!proposedRowsVisibleCalculator.isVisibleInTrimmingContainer) {
84507
+ if (!proposedFullyVisibleRowsCalculator.isVisibleInTrimmingContainer && !this.wtTable.isRowBeforeRenderedRows(partiallyVisibleStartRow) && !this.wtTable.isRowAfterRenderedRows(partiallyVisibleEndRow)) {
84490
84508
  return true;
84491
84509
  }
84492
84510
  // ...use partially visible rows calculator to determine what render type is needed
84493
- startRow = this.rowsPartiallyVisibleCalculator.startRow;
84494
- endRow = this.rowsPartiallyVisibleCalculator.endRow;
84511
+ startRow = partiallyVisibleStartRow;
84512
+ endRow = partiallyVisibleEndRow;
84495
84513
  }
84496
84514
  const {
84497
84515
  startRow: renderedStartRow,
@@ -84517,30 +84535,35 @@ class Viewport {
84517
84535
  }
84518
84536
 
84519
84537
  /**
84520
- * Returns information whether proposedColumnsVisibleCalculator viewport
84538
+ * Returns information whether proposedFullyVisibleColumnsCalculator viewport
84521
84539
  * is contained inside column rendered in previous draw (cached in columnsRenderCalculator).
84522
84540
  *
84523
- * @param {ViewportRowsCalculator} proposedColumnsVisibleCalculator The instance of the viewport calculator to compare with.
84541
+ * @param {ViewportRowsCalculator} proposedFullyVisibleColumnsCalculator The instance of the fully visible columns viewport calculator to compare with.
84542
+ * @param {ViewportRowsCalculator} proposedPartiallyVisibleColumnsCalculator The instance of the partially visible columns viewport calculator to compare with.
84524
84543
  * @returns {boolean} Returns `true` if all proposed visible columns are already rendered (meaning: redraw is not needed).
84525
84544
  * Returns `false` if at least one proposed visible column is not already rendered (meaning: redraw is needed).
84526
84545
  */
84527
- areAllProposedVisibleColumnsAlreadyRendered(proposedColumnsVisibleCalculator) {
84546
+ areAllProposedVisibleColumnsAlreadyRendered(proposedFullyVisibleColumnsCalculator, proposedPartiallyVisibleColumnsCalculator) {
84528
84547
  if (!this.columnsVisibleCalculator) {
84529
84548
  return false;
84530
84549
  }
84531
84550
  let {
84532
84551
  startColumn,
84533
84552
  endColumn
84534
- } = proposedColumnsVisibleCalculator;
84553
+ } = proposedFullyVisibleColumnsCalculator;
84554
+ const {
84555
+ startColumn: partiallyVisibleStartColumn,
84556
+ endColumn: partiallyVisibleEndColumn
84557
+ } = proposedPartiallyVisibleColumnsCalculator;
84535
84558
 
84536
84559
  // if there are no fully visible columns at all...
84537
84560
  if (startColumn === null && endColumn === null) {
84538
- if (!proposedColumnsVisibleCalculator.isVisibleInTrimmingContainer) {
84561
+ if (!proposedFullyVisibleColumnsCalculator.isVisibleInTrimmingContainer && !this.wtTable.isColumnBeforeRenderedColumns(partiallyVisibleStartColumn) && !this.wtTable.isColumnAfterRenderedColumns(partiallyVisibleEndColumn)) {
84539
84562
  return true;
84540
84563
  }
84541
84564
  // ...use partially visible columns calculator to determine what render type is needed
84542
- startColumn = this.columnsPartiallyVisibleCalculator.startColumn;
84543
- endColumn = this.columnsPartiallyVisibleCalculator.endColumn;
84565
+ startColumn = partiallyVisibleStartColumn;
84566
+ endColumn = partiallyVisibleEndColumn;
84544
84567
  }
84545
84568
  const {
84546
84569
  startColumn: renderedStartColumn,
@@ -26,8 +26,8 @@
26
26
  * INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER ARISING FROM
27
27
  * USE OR INABILITY TO USE THIS SOFTWARE.
28
28
  *
29
- * Version: 16.1.0-next-91b8a0f-20250905
30
- * Release date: 11/09/2025 (built at 05/09/2025 09:36:26)
29
+ * Version: 16.1.0-next-1494b74-20250909
30
+ * Release date: 11/09/2025 (built at 09/09/2025 12:57:28)
31
31
  */.handsontable .table td,.handsontable .table th{border-top:none}.handsontable tr{background:#fff}.handsontable td{background-color:inherit}.handsontable .table caption+thead tr:first-child td,.handsontable .table caption+thead tr:first-child th,.handsontable .table colgroup+thead tr:first-child td,.handsontable .table colgroup+thead tr:first-child th,.handsontable .table thead:first-child tr:first-child td,.handsontable .table thead:first-child tr:first-child th{border-top:1px solid #ccc}.handsontable .table-bordered{border:0;border-collapse:separate}.handsontable .table-bordered td,.handsontable .table-bordered th{border-left:none}.handsontable .table-bordered td:first-child,.handsontable .table-bordered th:first-child{border-left:1px solid #ccc}.handsontable .table>tbody>tr>td,.handsontable .table>tbody>tr>th,.handsontable .table>tfoot>tr>td,.handsontable .table>tfoot>tr>th,.handsontable .table>thead>tr>td,.handsontable .table>thead>tr>th{line-height:21px;padding:0}.col-lg-1.handsontable,.col-lg-10.handsontable,.col-lg-11.handsontable,.col-lg-12.handsontable,.col-lg-2.handsontable,.col-lg-3.handsontable,.col-lg-4.handsontable,.col-lg-5.handsontable,.col-lg-6.handsontable,.col-lg-7.handsontable,.col-lg-8.handsontable,.col-lg-9.handsontable,.col-md-1.handsontable,.col-md-10.handsontable,.col-md-11.handsontable,.col-md-12.handsontable,.col-md-2.handsontable,.col-md-3.handsontable,.col-md-4.handsontable,.col-md-5.handsontable,.col-md-6.handsontable,.col-md-7.handsontable,.col-md-8.handsontable,.col-md-9.handsontable .col-sm-1.handsontable,.col-sm-10.handsontable,.col-sm-11.handsontable,.col-sm-12.handsontable,.col-sm-2.handsontable,.col-sm-3.handsontable,.col-sm-4.handsontable,.col-sm-5.handsontable,.col-sm-6.handsontable,.col-sm-7.handsontable,.col-sm-8.handsontable,.col-sm-9.handsontable .col-xs-1.handsontable,.col-xs-10.handsontable,.col-xs-11.handsontable,.col-xs-12.handsontable,.col-xs-2.handsontable,.col-xs-3.handsontable,.col-xs-4.handsontable,.col-xs-5.handsontable,.col-xs-6.handsontable,.col-xs-7.handsontable,.col-xs-8.handsontable,.col-xs-9.handsontable{padding-left:0;padding-right:0}.handsontable .table-striped>tbody>tr:nth-of-type(2n){background-color:#fff}.handsontable .hide{display:none}.handsontable .relative{position:relative}.handsontable .wtHider{position:relative;width:0}.handsontable .wtSpreader{height:auto;position:relative;width:0}.handsontable div,.handsontable input,.handsontable table,.handsontable tbody,.handsontable td,.handsontable textarea,.handsontable th,.handsontable thead{box-sizing:content-box;-webkit-box-sizing:content-box;-moz-box-sizing:content-box}.handsontable input,.handsontable textarea{min-height:auto}.handsontable table.htCore{border-collapse:separate;border-spacing:0;border-width:0;cursor:default;margin:0;max-height:none;max-width:none;outline-width:0;table-layout:fixed;width:0}.handsontable col,.handsontable col.rowHeader{width:50px}.handsontable td,.handsontable th{background-color:#fff;border-bottom:1px solid #ccc;border-left-width:0;border-right:1px solid #ccc;border-top-width:0;empty-cells:show;height:22px;line-height:21px;outline:none;outline-width:0;overflow:hidden;padding:0 4px;vertical-align:top;white-space:pre-wrap}[dir=rtl].handsontable td,[dir=rtl].handsontable th{border-left:1px solid #ccc;border-right-width:0}.handsontable th:last-child{border-bottom:1px solid #ccc;border-left:none;border-right:1px solid #ccc}[dir=rtl].handsontable th:last-child{border-left:1px solid #ccc;border-right:none}.handsontable .ht_clone_bottom_inline_start_corner td:first-of-type,.handsontable .ht_clone_inline_start td:first-of-type,.handsontable .ht_clone_top_inline_start_corner td:first-of-type,.handsontable th:first-child,.handsontable.ht-wrapper:not(.htFirstDatasetColumnNotRendered) td:first-of-type{border-left:1px solid #ccc}[dir=rtl].handsontable th:first-child,[dir=rtl].handsontable.ht-wrapper:not(.htFirstDatasetColumnNotRendered) td:first-of-type{border-right:1px solid #ccc}.handsontable .ht_clone_top th:nth-child(2){border-left-width:0;border-right:1px solid #ccc}[dir=rtl].handsontable .ht_clone_top th:nth-child(2){border-left:1px solid #ccc;border-right-width:0}.handsontable.htRowHeaders thead tr th:nth-child(2){border-left:1px solid #ccc}[dir=rtl].handsontable.htRowHeaders thead tr th:nth-child(2){border-right:1px solid #ccc}.handsontable tr:first-child td,.handsontable tr:first-child th{border-top:1px solid #ccc}.ht_master:not(.innerBorderInlineStart):not(.emptyColumns) tbody tr th,.ht_master:not(.innerBorderInlineStart):not(.emptyColumns) thead tr th:first-child,.ht_master:not(.innerBorderInlineStart):not(.emptyColumns)~.handsontable:not(.htGhostTable) tbody tr th,.ht_master:not(.innerBorderInlineStart):not(.emptyColumns)~.handsontable:not(.ht_clone_top):not(.htGhostTable) thead tr th:first-child{border-left:1px solid #ccc;border-right-width:0}[dir=rtl].ht_master:not(.innerBorderInlineStart):not(.emptyColumns) tbody tr th,[dir=rtl].ht_master:not(.innerBorderInlineStart):not(.emptyColumns) thead tr th:first-child,[dir=rtl].ht_master:not(.innerBorderInlineStart):not(.emptyColumns)~.handsontable:not(.htGhostTable) tbody tr th,[dir=rtl].ht_master:not(.innerBorderInlineStart):not(.emptyColumns)~.handsontable:not(.ht_clone_top):not(.htGhostTable) thead tr th:first-child{border-left-width:0;border-right:1px solid #ccc}.ht_master:not(.innerBorderTop):not(.innerBorderBottom) thead tr.lastChild th,.ht_master:not(.innerBorderTop):not(.innerBorderBottom) thead tr:last-child th,.ht_master:not(.innerBorderTop):not(.innerBorderBottom)~.handsontable thead tr.lastChild th,.ht_master:not(.innerBorderTop):not(.innerBorderBottom)~.handsontable thead tr:last-child th{border-bottom-width:0}.handsontable th{background-color:#f0f0f0;color:#222;font-weight:400;text-align:center;white-space:nowrap}.handsontable thead th{padding:0}.handsontable th.active{background-color:#ccc}.handsontable thead th .relative{padding:2px 4px}.handsontable span.colHeader{display:inline-block;line-height:1.1}.handsontable .wtBorder{font-size:0;position:absolute}.handsontable .wtBorder.hidden{display:none!important}.handsontable .wtBorder:first-child,.handsontable .wtBorder:nth-child(3){z-index:2}.handsontable .wtBorder:nth-child(2),.handsontable .wtBorder:nth-child(4){z-index:1}.handsontable .wtBorder.current{z-index:10}.handsontable .wtBorder.area{z-index:8}.handsontable .wtBorder.fill{z-index:6}.handsontable .wtBorder.corner{cursor:crosshair;font-size:0}.ht_clone_master{z-index:100}.ht_clone_inline_start{z-index:120}.ht_clone_bottom{z-index:130}.ht_clone_bottom_inline_start_corner{z-index:150}.ht_clone_top{z-index:160}.ht_clone_top_inline_start_corner{z-index:180}.handsontable col.hidden{width:0!important}.handsontable tr.hidden,.handsontable tr.hidden td,.handsontable tr.hidden th{display:none}.ht_clone_bottom,.ht_clone_inline_start,.ht_clone_top,.ht_master{overflow:hidden}.ht_master .wtHolder{overflow:auto}.handsontable .ht_clone_inline_start table.htCore>thead,.handsontable .ht_master table.htCore>tbody>tr>th,.handsontable .ht_master table.htCore>thead{visibility:hidden}.ht_clone_bottom .wtHolder,.ht_clone_inline_start .wtHolder,.ht_clone_top .wtHolder{overflow:hidden}.handsontable{color:#373737;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Helvetica Neue,Arial,sans-serif;font-size:13px;font-weight:400;position:relative;touch-action:manipulation}.handsontable a{color:#104acc}.handsontable.htAutoSize{left:-99000px;position:absolute;top:-99000px;visibility:hidden}.handsontable td.htInvalid{background-color:#ffbeba!important}.handsontable td.htNoWrap{white-space:nowrap}.handsontable td.invisibleSelection,.handsontable th.invisibleSelection{outline:none}.handsontable td.invisibleSelection::selection,.handsontable th.invisibleSelection::selection{background:hsla(0,0%,100%,0)}.hot-display-license-info{color:#373737;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Helvetica Neue,Arial,sans-serif;font-size:10px;font-weight:400;padding:5px 0 3px;text-align:left}.hot-display-license-info a{color:#104acc;font-size:10px}.ht-root-wrapper .htFocusCatcher{border:0;height:0;margin:0;opacity:0;padding:0;position:absolute;width:0;z-index:-1}.handsontable .htTextEllipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.handsontable .manualColumnResizer{cursor:col-resize;height:25px;position:absolute;top:0;width:5px;z-index:210}.handsontable .manualRowResizer{cursor:row-resize;height:5px;left:0;position:absolute;width:50px;z-index:210}.handsontable .manualColumnResizer.active,.handsontable .manualColumnResizer:hover,.handsontable .manualRowResizer.active,.handsontable .manualRowResizer:hover{background-color:#34a9db}.handsontable .manualColumnResizerGuide{background-color:#34a9db;border-left:none;border-right:1px dashed #777;display:none;margin-left:5px;margin-right:unset;position:absolute;right:unset;top:0;width:0}[dir=rtl].handsontable .manualColumnResizerGuide{border-left:1px dashed #777;border-right:none;left:unset;margin-left:unset;margin-right:5px}.handsontable .manualRowResizerGuide{background-color:#34a9db;border-bottom:1px dashed #777;bottom:0;display:none;height:0;left:0;margin-top:5px;position:absolute}.handsontable .manualColumnResizerGuide.active,.handsontable .manualRowResizerGuide.active{display:block;z-index:209}.handsontable td.area,.handsontable td.area-1,.handsontable td.area-2,.handsontable td.area-3,.handsontable td.area-4,.handsontable td.area-5,.handsontable td.area-6,.handsontable td.area-7{position:relative}.handsontable td.area-1:before,.handsontable td.area-2:before,.handsontable td.area-3:before,.handsontable td.area-4:before,.handsontable td.area-5:before,.handsontable td.area-6:before,.handsontable td.area-7:before,.handsontable td.area:before{background:#005eff;bottom:0;content:"";left:0;position:absolute;right:0;top:0}.handsontable td.area:before{opacity:.1}.handsontable td.area-1:before{opacity:.2}.handsontable td.area-2:before{opacity:.27}.handsontable td.area-3:before{opacity:.35}.handsontable td.area-4:before{opacity:.41}.handsontable td.area-5:before{opacity:.47}.handsontable td.area-6:before{opacity:.54}.handsontable td.area-7:before{opacity:.58}.handsontable tbody th.current,.handsontable thead th.current{box-shadow:inset 0 0 0 2px #4b89ff}.handsontable tbody th.ht__highlight,.handsontable thead th.ht__highlight{background-color:#dcdcdc}.handsontable tbody th.ht__active_highlight,.handsontable thead th.ht__active_highlight{background-color:#8eb0e7;color:#000}.handsontableInput{background-color:#fff;border:none;border-radius:0;box-shadow:inset 0 0 0 2px #5292f7;box-sizing:border-box!important;color:#000;display:block;font-family:inherit;font-size:inherit;line-height:21px;margin:0;outline-width:0;padding:1px 5px 0;resize:none}.handsontableInput:focus{outline:none}.handsontableInputHolder{left:0;position:absolute;top:0}.htSelectEditor{position:absolute;select{-webkit-appearance:menulist-button!important;border:2px solid #4b89ff;box-sizing:border-box!important;height:100%;width:100%}}.htSelectEditor select:focus{outline:none}.htSelectEditor .htAutocompleteArrow{display:none}.handsontable .htDimmed{color:#777}.handsontable .htSubmenu{position:relative}.handsontable .htSubmenu :after{color:#777;content:"▶";font-size:9px;position:absolute;right:5px}[dir=rtl].handsontable .htSubmenu :after{content:""}[dir=rtl].handsontable .htSubmenu :before{color:#777;content:"◀";font-size:9px;left:5px;position:absolute}.handsontable .htLeft{text-align:left}.handsontable .htCenter{text-align:center}.handsontable .htRight{text-align:right}.handsontable .htJustify{text-align:justify}.handsontable .htTop{vertical-align:top}.handsontable .htMiddle{vertical-align:middle}.handsontable .htBottom{vertical-align:bottom}.handsontable .htPlaceholder{color:#999}.handsontable.listbox{border:1px solid #ccc;margin:0}.handsontable.listbox.autocompleteEditor,.handsontable.listbox.dropdownEditor{border-width:0}.handsontable.listbox .ht_master table{background:#fff;border-collapse:separate}.handsontable.listbox.autocompleteEditor .ht_master table,.handsontable.listbox.dropdownEditor .ht_master table{border:1px solid #ccc}.handsontable.listbox td,.handsontable.listbox th,.handsontable.listbox tr:first-child td,.handsontable.listbox tr:first-child th,.handsontable.listbox tr:last-child th{border-color:transparent!important}.handsontable.listbox td,.handsontable.listbox th{text-overflow:ellipsis;white-space:nowrap}.handsontable.listbox td.htDimmed{color:inherit;cursor:default;font-style:inherit}.handsontable.listbox .wtBorder{visibility:hidden}.handsontable.listbox tr td.current,.handsontable.listbox tr:hover td{background:#eee}.ht_editor_hidden{z-index:-1}.ht_editor_visible{z-index:200}.handsontable td.htSearchResult{background:#fcedd9;color:#583707}.handsontable.mobile,.handsontable.mobile .wtHolder{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-overflow-scrolling:touch}.handsontable.mobile .handsontableInput:focus{-webkit-appearance:none;-webkit-box-shadow:inset 0 0 0 2px #5292f7;-moz-box-shadow:inset 0 0 0 2px #5292f7;box-shadow:inset 0 0 0 2px #5292f7}.handsontable .bottomSelectionHandle,.handsontable .bottomSelectionHandle-HitArea,.handsontable .topSelectionHandle,.handsontable .topSelectionHandle-HitArea{left:-10000px;right:unset;top:-10000px;z-index:9999}[dir=rtl].handsontable .bottomSelectionHandle,[dir=rtl].handsontable .bottomSelectionHandle-HitArea,[dir=rtl].handsontable .topSelectionHandle,[dir=rtl].handsontable .topSelectionHandle-HitArea{left:unset;right:-10000px}.handsontable.hide-tween{-webkit-animation:opacity-hide .3s;animation:opacity-hide .3s;animation-fill-mode:forwards;-webkit-animation-fill-mode:forwards}.handsontable.show-tween{-webkit-animation:opacity-show .3s;animation:opacity-show .3s;animation-fill-mode:forwards;-webkit-animation-fill-mode:forwards}.handsontable .htAutocompleteArrow{color:#bbb;cursor:default;float:right;font-size:10px;text-align:center;width:16px}[dir=rtl].handsontable .htAutocompleteArrow{float:left}.handsontable td.htInvalid .htAutocompleteArrow{color:#555}.handsontable td.htInvalid .htAutocompleteArrow:hover{color:#1a1a1a}.handsontable td .htAutocompleteArrow:hover{color:#777}.handsontable td.area .htAutocompleteArrow{color:#d3d3d3}.handsontable .htCheckboxRendererInput.noValue{opacity:.5}.handsontable .htCheckboxRendererLabel{cursor:pointer;display:inline-block;font-size:inherit;vertical-align:middle}.handsontable .htCheckboxRendererLabel.fullWidth{width:100%}.handsontable .collapsibleIndicator{background:#eee;border:1px solid #a6a6a6;border-radius:10px;-webkit-box-shadow:0 0 0 6px #eee;-moz-box-shadow:0 0 0 6px #eee;box-shadow:0 0 0 3px #eee;color:#222;cursor:pointer;font-size:10px;height:10px;left:unset;line-height:8px;position:absolute;right:5px;text-align:center;top:50%;transform:translateY(-50%);width:10px}[dir=rtl].handsontable .collapsibleIndicator{left:5px;right:unset}.handsontable[dir=ltr] thead th:has(.collapsibleIndicator) div.htRight span.colHeader{margin-right:20px}.handsontable[dir=rtl] thead th:has(.collapsibleIndicator) div.htLeft span.colHeader{margin-left:20px}.handsontable .columnSorting{position:relative}.handsontable[dir=ltr] div.htRight span[class*=ascending],.handsontable[dir=ltr] div.htRight span[class*=descending]{margin-left:-10px;margin-right:10px}.handsontable[dir=rtl] div.htLeft span[class*=ascending],.handsontable[dir=rtl] div.htLeft span[class*=descending]{margin-left:10px;margin-right:-10px}.handsontable[dir=ltr] div.htRight span[class*=ascending]:only-child,.handsontable[dir=ltr] div.htRight span[class*=descending]:only-child{margin-left:-15px;margin-right:15px}.handsontable[dir=rtl] div.htLeft span[class*=ascending]:only-child,.handsontable[dir=rtl] div.htLeft span[class*=descending]:only-child{margin-left:15px;margin-right:-15px}.handsontable .columnSorting.sortAction:hover{cursor:pointer;text-decoration:underline}.handsontable span.colHeader.columnSorting:before{background-position-x:right;background-repeat:no-repeat;background-size:contain;content:"";height:10px;left:unset;margin-top:-6px;padding-left:8px;padding-right:0;position:absolute;right:-9px;top:50%;width:5px}[dir=rtl].handsontable span.colHeader.columnSorting:before{background-position-x:left;left:-9px;padding-left:0;padding-right:8px;right:unset}.handsontable span.colHeader.columnSorting.ascending:before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAoCAMAAADJ7yrpAAAAKlBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKE86IAAAADXRSTlMABBEmRGprlJW72e77tTkTKwAAAFNJREFUeAHtzjkSgCAUBNHPgsoy97+ulGXRqJE5L+xkxoYt2UdsLb5bqFINz+aLuuLn5rIu2RkO3fZpWENimNgiw6iBYRTPMLJjGFxQZ1hxxb/xBI1qC8k39CdKAAAAAElFTkSuQmCC)}.handsontable span.colHeader.columnSorting.descending:before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAoCAMAAADJ7yrpAAAAKlBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKE86IAAAADXRSTlMABBEmRGprlJW72e77tTkTKwAAAFJJREFUeAHtzjkSgCAQRNFmQYUZ7n9dKUvru0TmvPAn3br0QfgdZ5xx6x+rQn23GqTYnq1FDcnuzZIO2WmedVqIRVxgGKEyjNgYRjKGkZ1hFIZ3I70LyM0VtU8AAAAASUVORK5CYII=)}.htGhostTable .htCore span.colHeader.columnSorting:not(.indicatorDisabled):before{content:"*";display:inline-block;padding-right:20px;position:relative}.handsontable.htGhostTable table thead th{border-bottom-width:0}.handsontable.htGhostTable table tbody tr td,.handsontable.htGhostTable table tbody tr th{border-top-width:0}.handsontable .htCommentCell{position:relative}.handsontable .htCommentCell:after{border-left:6px solid transparent;border-right:none;border-top:6px solid #000;content:"";left:unset;position:absolute;right:0;top:0}[dir=rtl].handsontable .htCommentCell:after{border-left:none;border-right:6px solid transparent;left:0;right:unset}.htCommentsContainer .htComments{display:none;position:absolute;z-index:1059}.htCommentsContainer .htCommentTextArea{-webkit-appearance:none;background-color:#fff;border:none;border-left:3px solid #ccc;box-shadow:0 1px 3px rgba(0,0,0,.118),0 1px 2px rgba(0,0,0,.239);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:12px;height:90px;outline:0!important;padding:5px;width:215px}[dir=rtl].htCommentsContainer .htCommentTextArea{border-left:none;border-right:3px solid #ccc}.htCommentsContainer .htCommentTextArea:focus{border-left:3px solid #5292f7;border-right:none;box-shadow:0 1px 3px rgba(0,0,0,.118),0 1px 2px rgba(0,0,0,.239),inset 0 0 0 1px #5292f7}[dir=rtl].htCommentsContainer .htCommentTextArea:focus{border-left:none;border-right:3px solid #5292f7}
32
32
  /*!
33
33
  * Handsontable ContextMenu