handsontable 0.0.0-next-bfb0e3a-20240403 → 0.0.0-next-53a190b-20240403

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.

Potentially problematic release.


This version of handsontable might be problematic. Click here for more details.

@@ -227,9 +227,15 @@ class InlineStartOverlay extends _base.Overlay {
227
227
  * @returns {boolean}
228
228
  */
229
229
  scrollTo(sourceCol, beyondRendered) {
230
- let newX = this.getTableParentOffset();
230
+ const {
231
+ wtSettings
232
+ } = this;
233
+ const rowHeaders = wtSettings.getSetting('rowHeaders');
234
+ const fixedColumnsStart = wtSettings.getSetting('fixedColumnsStart');
231
235
  const sourceInstance = this.wot.cloneSource ? this.wot.cloneSource : this.wot;
232
236
  const mainHolder = sourceInstance.wtTable.holder;
237
+ const rowHeaderBorderCompensation = fixedColumnsStart === 0 && rowHeaders.length > 0 && !(0, _element.hasClass)(mainHolder.parentNode, 'innerBorderInlineStart') ? 1 : 0;
238
+ let newX = this.getTableParentOffset();
233
239
  let scrollbarCompensation = 0;
234
240
  if (beyondRendered) {
235
241
  const columnWidth = this.wot.wtTable.getColumnWidth(sourceCol);
@@ -244,10 +250,18 @@ class InlineStartOverlay extends _base.Overlay {
244
250
  if (beyondRendered) {
245
251
  newX += this.sumCellSizes(0, sourceCol + 1);
246
252
  newX -= this.wot.wtViewport.getViewportWidth();
253
+ // Compensate for the right header border if scrolled from the absolute left.
254
+ newX += rowHeaderBorderCompensation;
247
255
  } else {
248
256
  newX += this.sumCellSizes(this.wtSettings.getSetting('fixedColumnsStart'), sourceCol);
249
257
  }
250
258
  newX += scrollbarCompensation;
259
+
260
+ // If the table is scrolled all the way left when starting the scroll and going to be scrolled to the far right,
261
+ // we need to compensate for the potential header border width.
262
+ if ((0, _element.getMaximumScrollLeft)(this.mainTableScrollableElement) === newX - rowHeaderBorderCompensation && rowHeaderBorderCompensation > 0) {
263
+ this.wot.wtOverlays.expandHiderHorizontallyBy(rowHeaderBorderCompensation);
264
+ }
251
265
  return this.setScrollPosition(newX);
252
266
  }
253
267
 
@@ -1,5 +1,5 @@
1
1
  import "core-js/modules/es.error.cause.js";
2
- import { addClass, getScrollbarWidth, getScrollLeft, getWindowScrollTop, hasClass, outerWidth, removeClass, setOverlayPosition, resetCssTransform } from "../../../../helpers/dom/element.mjs";
2
+ import { addClass, getScrollbarWidth, getScrollLeft, getMaximumScrollLeft, getWindowScrollTop, hasClass, outerWidth, removeClass, setOverlayPosition, resetCssTransform } from "../../../../helpers/dom/element.mjs";
3
3
  import InlineStartOverlayTable from "../table/inlineStart.mjs";
4
4
  import { Overlay } from "./_base.mjs";
5
5
  import { CORNER_DEFAULT_STYLE } from "../selection/index.mjs";
@@ -223,9 +223,15 @@ export class InlineStartOverlay extends Overlay {
223
223
  * @returns {boolean}
224
224
  */
225
225
  scrollTo(sourceCol, beyondRendered) {
226
- let newX = this.getTableParentOffset();
226
+ const {
227
+ wtSettings
228
+ } = this;
229
+ const rowHeaders = wtSettings.getSetting('rowHeaders');
230
+ const fixedColumnsStart = wtSettings.getSetting('fixedColumnsStart');
227
231
  const sourceInstance = this.wot.cloneSource ? this.wot.cloneSource : this.wot;
228
232
  const mainHolder = sourceInstance.wtTable.holder;
233
+ const rowHeaderBorderCompensation = fixedColumnsStart === 0 && rowHeaders.length > 0 && !hasClass(mainHolder.parentNode, 'innerBorderInlineStart') ? 1 : 0;
234
+ let newX = this.getTableParentOffset();
229
235
  let scrollbarCompensation = 0;
230
236
  if (beyondRendered) {
231
237
  const columnWidth = this.wot.wtTable.getColumnWidth(sourceCol);
@@ -240,10 +246,18 @@ export class InlineStartOverlay extends Overlay {
240
246
  if (beyondRendered) {
241
247
  newX += this.sumCellSizes(0, sourceCol + 1);
242
248
  newX -= this.wot.wtViewport.getViewportWidth();
249
+ // Compensate for the right header border if scrolled from the absolute left.
250
+ newX += rowHeaderBorderCompensation;
243
251
  } else {
244
252
  newX += this.sumCellSizes(this.wtSettings.getSetting('fixedColumnsStart'), sourceCol);
245
253
  }
246
254
  newX += scrollbarCompensation;
255
+
256
+ // If the table is scrolled all the way left when starting the scroll and going to be scrolled to the far right,
257
+ // we need to compensate for the potential header border width.
258
+ if (getMaximumScrollLeft(this.mainTableScrollableElement) === newX - rowHeaderBorderCompensation && rowHeaderBorderCompensation > 0) {
259
+ this.wot.wtOverlays.expandHiderHorizontallyBy(rowHeaderBorderCompensation);
260
+ }
247
261
  return this.setScrollPosition(newX);
248
262
  }
249
263
 
@@ -259,6 +259,9 @@ class TopOverlay extends _base.Overlay {
259
259
  } = this;
260
260
  const sourceInstance = wot.cloneSource ? wot.cloneSource : wot;
261
261
  const mainHolder = sourceInstance.wtTable.holder;
262
+ const columnHeaders = wtSettings.getSetting('columnHeaders');
263
+ const fixedRowsTop = wtSettings.getSetting('fixedRowsTop');
264
+ const columnHeaderBorderCompensation = fixedRowsTop === 0 && columnHeaders.length > 0 && !(0, _element.hasClass)(mainHolder.parentNode, 'innerBorderTop') ? 1 : 0;
262
265
  let newY = this.getTableParentOffset();
263
266
  let scrollbarCompensation = 0;
264
267
  if (bottomEdge) {
@@ -278,10 +281,18 @@ class TopOverlay extends _base.Overlay {
278
281
  newY -= wot.wtViewport.getViewportHeight() - this.sumCellSizes(totalRows - fixedRowsBottom, totalRows);
279
282
  // Fix 1 pixel offset when cell is selected
280
283
  newY += 1;
284
+ // Compensate for the bottom header border if scrolled from the absolute top.
285
+ newY += columnHeaderBorderCompensation;
281
286
  } else {
282
287
  newY += this.sumCellSizes(wtSettings.getSetting('fixedRowsTop'), sourceRow);
283
288
  }
284
289
  newY += scrollbarCompensation;
290
+
291
+ // If the table is scrolled all the way up when starting the scroll and going to be scrolled to the bottom,
292
+ // we need to compensate for the potential header bottom border height.
293
+ if ((0, _element.getMaximumScrollTop)(this.mainTableScrollableElement) === newY - columnHeaderBorderCompensation && columnHeaderBorderCompensation > 0) {
294
+ this.wot.wtOverlays.expandHiderVerticallyBy(columnHeaderBorderCompensation);
295
+ }
285
296
  return this.setScrollPosition(newY);
286
297
  }
287
298
 
@@ -2,7 +2,7 @@ import "core-js/modules/es.error.cause.js";
2
2
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
3
3
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : String(i); }
4
4
  function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
5
- import { addClass, getScrollbarWidth, getScrollTop, getWindowScrollLeft, hasClass, outerHeight, removeClass, setOverlayPosition, resetCssTransform } from "../../../../helpers/dom/element.mjs";
5
+ import { addClass, getMaximumScrollTop, getScrollbarWidth, getScrollTop, getWindowScrollLeft, hasClass, outerHeight, removeClass, setOverlayPosition, resetCssTransform } from "../../../../helpers/dom/element.mjs";
6
6
  import TopOverlayTable from "./../table/top.mjs";
7
7
  import { Overlay } from "./_base.mjs";
8
8
  import { CORNER_DEFAULT_STYLE } from "../selection/index.mjs";
@@ -255,6 +255,9 @@ export class TopOverlay extends Overlay {
255
255
  } = this;
256
256
  const sourceInstance = wot.cloneSource ? wot.cloneSource : wot;
257
257
  const mainHolder = sourceInstance.wtTable.holder;
258
+ const columnHeaders = wtSettings.getSetting('columnHeaders');
259
+ const fixedRowsTop = wtSettings.getSetting('fixedRowsTop');
260
+ const columnHeaderBorderCompensation = fixedRowsTop === 0 && columnHeaders.length > 0 && !hasClass(mainHolder.parentNode, 'innerBorderTop') ? 1 : 0;
258
261
  let newY = this.getTableParentOffset();
259
262
  let scrollbarCompensation = 0;
260
263
  if (bottomEdge) {
@@ -274,10 +277,18 @@ export class TopOverlay extends Overlay {
274
277
  newY -= wot.wtViewport.getViewportHeight() - this.sumCellSizes(totalRows - fixedRowsBottom, totalRows);
275
278
  // Fix 1 pixel offset when cell is selected
276
279
  newY += 1;
280
+ // Compensate for the bottom header border if scrolled from the absolute top.
281
+ newY += columnHeaderBorderCompensation;
277
282
  } else {
278
283
  newY += this.sumCellSizes(wtSettings.getSetting('fixedRowsTop'), sourceRow);
279
284
  }
280
285
  newY += scrollbarCompensation;
286
+
287
+ // If the table is scrolled all the way up when starting the scroll and going to be scrolled to the bottom,
288
+ // we need to compensate for the potential header bottom border height.
289
+ if (getMaximumScrollTop(this.mainTableScrollableElement) === newY - columnHeaderBorderCompensation && columnHeaderBorderCompensation > 0) {
290
+ this.wot.wtOverlays.expandHiderVerticallyBy(columnHeaderBorderCompensation);
291
+ }
281
292
  return this.setScrollPosition(newY);
282
293
  }
283
294
 
@@ -562,13 +562,31 @@ class Overlays {
562
562
  const {
563
563
  wtTable
564
564
  } = this;
565
+ const {
566
+ rootWindow
567
+ } = this.domBindings;
568
+ const isWindowScrolled = this.scrollableElement === rootWindow;
565
569
  const totalColumns = this.wtSettings.getSetting('totalColumns');
566
570
  const totalRows = this.wtSettings.getSetting('totalRows');
567
571
  const headerRowSize = wtViewport.getRowHeaderWidth();
568
572
  const headerColumnSize = wtViewport.getColumnHeaderHeight();
569
- const hiderStyle = wtTable.hider.style;
570
- hiderStyle.width = `${headerRowSize + this.inlineStartOverlay.sumCellSizes(0, totalColumns)}px`;
571
- hiderStyle.height = `${headerColumnSize + this.topOverlay.sumCellSizes(0, totalRows) + 1}px`;
573
+ const proposedHiderHeight = headerColumnSize + this.topOverlay.sumCellSizes(0, totalRows) + 1;
574
+ const proposedHiderWidth = headerRowSize + this.inlineStartOverlay.sumCellSizes(0, totalColumns);
575
+ const hiderElement = wtTable.hider;
576
+ const hiderStyle = hiderElement.style;
577
+ const isScrolledBeyondHiderHeight = () => {
578
+ return isWindowScrolled ? false : this.scrollableElement.scrollTop > Math.max(0, proposedHiderHeight - wtTable.holder.clientHeight);
579
+ };
580
+ const isScrolledBeyondHiderWidth = () => {
581
+ return isWindowScrolled ? false : this.scrollableElement.scrollLeft > Math.max(0, proposedHiderWidth - wtTable.holder.clientWidth);
582
+ };
583
+ const columnHeaderBorderCompensation = isScrolledBeyondHiderHeight() ? 1 : 0;
584
+ const rowHeaderBorderCompensation = isScrolledBeyondHiderWidth() ? 1 : 0;
585
+
586
+ // If the elements are being adjusted after scrolling the table from the very beginning to the very end,
587
+ // we need to adjust the hider dimensions by the header border size. (https://github.com/handsontable/dev-handsontable/issues/1772)
588
+ hiderStyle.width = `${proposedHiderWidth + rowHeaderBorderCompensation}px`;
589
+ hiderStyle.height = `${proposedHiderHeight + columnHeaderBorderCompensation}px`;
572
590
  if (this.scrollbarSize > 0) {
573
591
  // todo refactoring, looking as a part of logic which should be moved outside the class
574
592
  const {
@@ -592,6 +610,30 @@ class Overlays {
592
610
  this.bottomOverlay.adjustElementsSize(force);
593
611
  }
594
612
 
613
+ /**
614
+ * Expand the hider vertically element by the provided delta value.
615
+ *
616
+ * @param {number} heightDelta The delta value to expand the hider element by.
617
+ */
618
+ expandHiderVerticallyBy(heightDelta) {
619
+ const {
620
+ wtTable
621
+ } = this;
622
+ wtTable.hider.style.height = `${parseInt(wtTable.hider.style.height, 10) + heightDelta}px`;
623
+ }
624
+
625
+ /**
626
+ * Expand the hider horizontally element by the provided delta value.
627
+ *
628
+ * @param {number} widthDelta The delta value to expand the hider element by.
629
+ */
630
+ expandHiderHorizontallyBy(widthDelta) {
631
+ const {
632
+ wtTable
633
+ } = this;
634
+ wtTable.hider.style.width = `${parseInt(wtTable.hider.style.width, 10) + widthDelta}px`;
635
+ }
636
+
595
637
  /**
596
638
  *
597
639
  */
@@ -559,13 +559,31 @@ class Overlays {
559
559
  const {
560
560
  wtTable
561
561
  } = this;
562
+ const {
563
+ rootWindow
564
+ } = this.domBindings;
565
+ const isWindowScrolled = this.scrollableElement === rootWindow;
562
566
  const totalColumns = this.wtSettings.getSetting('totalColumns');
563
567
  const totalRows = this.wtSettings.getSetting('totalRows');
564
568
  const headerRowSize = wtViewport.getRowHeaderWidth();
565
569
  const headerColumnSize = wtViewport.getColumnHeaderHeight();
566
- const hiderStyle = wtTable.hider.style;
567
- hiderStyle.width = `${headerRowSize + this.inlineStartOverlay.sumCellSizes(0, totalColumns)}px`;
568
- hiderStyle.height = `${headerColumnSize + this.topOverlay.sumCellSizes(0, totalRows) + 1}px`;
570
+ const proposedHiderHeight = headerColumnSize + this.topOverlay.sumCellSizes(0, totalRows) + 1;
571
+ const proposedHiderWidth = headerRowSize + this.inlineStartOverlay.sumCellSizes(0, totalColumns);
572
+ const hiderElement = wtTable.hider;
573
+ const hiderStyle = hiderElement.style;
574
+ const isScrolledBeyondHiderHeight = () => {
575
+ return isWindowScrolled ? false : this.scrollableElement.scrollTop > Math.max(0, proposedHiderHeight - wtTable.holder.clientHeight);
576
+ };
577
+ const isScrolledBeyondHiderWidth = () => {
578
+ return isWindowScrolled ? false : this.scrollableElement.scrollLeft > Math.max(0, proposedHiderWidth - wtTable.holder.clientWidth);
579
+ };
580
+ const columnHeaderBorderCompensation = isScrolledBeyondHiderHeight() ? 1 : 0;
581
+ const rowHeaderBorderCompensation = isScrolledBeyondHiderWidth() ? 1 : 0;
582
+
583
+ // If the elements are being adjusted after scrolling the table from the very beginning to the very end,
584
+ // we need to adjust the hider dimensions by the header border size. (https://github.com/handsontable/dev-handsontable/issues/1772)
585
+ hiderStyle.width = `${proposedHiderWidth + rowHeaderBorderCompensation}px`;
586
+ hiderStyle.height = `${proposedHiderHeight + columnHeaderBorderCompensation}px`;
569
587
  if (this.scrollbarSize > 0) {
570
588
  // todo refactoring, looking as a part of logic which should be moved outside the class
571
589
  const {
@@ -589,6 +607,30 @@ class Overlays {
589
607
  this.bottomOverlay.adjustElementsSize(force);
590
608
  }
591
609
 
610
+ /**
611
+ * Expand the hider vertically element by the provided delta value.
612
+ *
613
+ * @param {number} heightDelta The delta value to expand the hider element by.
614
+ */
615
+ expandHiderVerticallyBy(heightDelta) {
616
+ const {
617
+ wtTable
618
+ } = this;
619
+ wtTable.hider.style.height = `${parseInt(wtTable.hider.style.height, 10) + heightDelta}px`;
620
+ }
621
+
622
+ /**
623
+ * Expand the hider horizontally element by the provided delta value.
624
+ *
625
+ * @param {number} widthDelta The delta value to expand the hider element by.
626
+ */
627
+ expandHiderHorizontallyBy(widthDelta) {
628
+ const {
629
+ wtTable
630
+ } = this;
631
+ wtTable.hider.style.width = `${parseInt(wtTable.hider.style.width, 10) + widthDelta}px`;
632
+ }
633
+
592
634
  /**
593
635
  *
594
636
  */
package/base.js CHANGED
@@ -45,8 +45,8 @@ Handsontable.hooks = _pluginHooks.default.getSingleton();
45
45
  Handsontable.CellCoords = _src.CellCoords;
46
46
  Handsontable.CellRange = _src.CellRange;
47
47
  Handsontable.packageName = 'handsontable';
48
- Handsontable.buildDate = "03/04/2024 11:08:33";
49
- Handsontable.version = "0.0.0-next-bfb0e3a-20240403";
48
+ Handsontable.buildDate = "03/04/2024 11:36:00";
49
+ Handsontable.version = "0.0.0-next-53a190b-20240403";
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 = "03/04/2024 11:08:38";
39
- Handsontable.version = "0.0.0-next-bfb0e3a-20240403";
38
+ Handsontable.buildDate = "03/04/2024 11:36:05";
39
+ Handsontable.version = "0.0.0-next-53a190b-20240403";
40
40
  Handsontable.languages = {
41
41
  dictionaryKeys,
42
42
  getLanguageDictionary,
@@ -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: 0.0.0-next-bfb0e3a-20240403
29
- * Release date: 06/03/2024 (built at 03/04/2024 11:08:43)
28
+ * Version: 0.0.0-next-53a190b-20240403
29
+ * Release date: 06/03/2024 (built at 03/04/2024 11:36:10)
30
30
  */
31
31
  /**
32
32
  * 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: 0.0.0-next-bfb0e3a-20240403
29
- * Release date: 06/03/2024 (built at 03/04/2024 11:08:43)
28
+ * Version: 0.0.0-next-53a190b-20240403
29
+ * Release date: 06/03/2024 (built at 03/04/2024 11:36:10)
30
30
  */
31
31
  /**
32
32
  * 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: 0.0.0-next-bfb0e3a-20240403
29
- * Release date: 06/03/2024 (built at 03/04/2024 11:08:43)
28
+ * Version: 0.0.0-next-53a190b-20240403
29
+ * Release date: 06/03/2024 (built at 03/04/2024 11:36:10)
30
30
  */
31
31
  (function webpackUniversalModuleDefinition(root, factory) {
32
32
  if(typeof exports === 'object' && typeof module === 'object')
@@ -42644,8 +42644,8 @@ Handsontable.hooks = _pluginHooks.default.getSingleton();
42644
42644
  Handsontable.CellCoords = _src.CellCoords;
42645
42645
  Handsontable.CellRange = _src.CellRange;
42646
42646
  Handsontable.packageName = 'handsontable';
42647
- Handsontable.buildDate = "03/04/2024 11:08:43";
42648
- Handsontable.version = "0.0.0-next-bfb0e3a-20240403";
42647
+ Handsontable.buildDate = "03/04/2024 11:36:10";
42648
+ Handsontable.version = "0.0.0-next-53a190b-20240403";
42649
42649
  Handsontable.languages = {
42650
42650
  dictionaryKeys: _registry.dictionaryKeys,
42651
42651
  getLanguageDictionary: _registry.getLanguageDictionary,
@@ -49675,6 +49675,8 @@ exports.getCaretPosition = getCaretPosition;
49675
49675
  exports.getComputedStyle = getComputedStyle;
49676
49676
  exports.getCssTransform = getCssTransform;
49677
49677
  exports.getFrameElement = getFrameElement;
49678
+ exports.getMaximumScrollLeft = getMaximumScrollLeft;
49679
+ exports.getMaximumScrollTop = getMaximumScrollTop;
49678
49680
  exports.getParent = getParent;
49679
49681
  exports.getParentWindow = getParentWindow;
49680
49682
  exports.getScrollLeft = getScrollLeft;
@@ -50326,6 +50328,26 @@ function getScrollableElement(element) {
50326
50328
  return rootWindow;
50327
50329
  }
50328
50330
 
50331
+ /**
50332
+ * Get the maximum available `scrollTop` value for the provided element.
50333
+ *
50334
+ * @param {HTMLElement} element The element to get the maximum scroll top value from.
50335
+ * @returns {number} The maximum scroll top value.
50336
+ */
50337
+ function getMaximumScrollTop(element) {
50338
+ return element.scrollHeight - element.clientHeight;
50339
+ }
50340
+
50341
+ /**
50342
+ * Get the maximum available `scrollLeft` value for the provided element.
50343
+ *
50344
+ * @param {HTMLElement} element The element to get the maximum scroll left value from.
50345
+ * @returns {number} The maximum scroll left value.
50346
+ */
50347
+ function getMaximumScrollLeft(element) {
50348
+ return element.scrollWidth - element.clientWidth;
50349
+ }
50350
+
50329
50351
  /**
50330
50352
  * Returns a DOM element responsible for trimming the provided element.
50331
50353
  *
@@ -52777,7 +52799,7 @@ const domMessages = {
52777
52799
  function _injectProductInfo(key, element) {
52778
52800
  const hasValidType = !isEmpty(key);
52779
52801
  const isNonCommercial = typeof key === 'string' && key.toLowerCase() === 'non-commercial-and-evaluation';
52780
- const hotVersion = "0.0.0-next-bfb0e3a-20240403";
52802
+ const hotVersion = "0.0.0-next-53a190b-20240403";
52781
52803
  let keyValidityDate;
52782
52804
  let consoleMessageState = 'invalid';
52783
52805
  let domMessageState = 'invalid';
@@ -71342,13 +71364,31 @@ class Overlays {
71342
71364
  const {
71343
71365
  wtTable
71344
71366
  } = this;
71367
+ const {
71368
+ rootWindow
71369
+ } = this.domBindings;
71370
+ const isWindowScrolled = this.scrollableElement === rootWindow;
71345
71371
  const totalColumns = this.wtSettings.getSetting('totalColumns');
71346
71372
  const totalRows = this.wtSettings.getSetting('totalRows');
71347
71373
  const headerRowSize = wtViewport.getRowHeaderWidth();
71348
71374
  const headerColumnSize = wtViewport.getColumnHeaderHeight();
71349
- const hiderStyle = wtTable.hider.style;
71350
- hiderStyle.width = `${headerRowSize + this.inlineStartOverlay.sumCellSizes(0, totalColumns)}px`;
71351
- hiderStyle.height = `${headerColumnSize + this.topOverlay.sumCellSizes(0, totalRows) + 1}px`;
71375
+ const proposedHiderHeight = headerColumnSize + this.topOverlay.sumCellSizes(0, totalRows) + 1;
71376
+ const proposedHiderWidth = headerRowSize + this.inlineStartOverlay.sumCellSizes(0, totalColumns);
71377
+ const hiderElement = wtTable.hider;
71378
+ const hiderStyle = hiderElement.style;
71379
+ const isScrolledBeyondHiderHeight = () => {
71380
+ return isWindowScrolled ? false : this.scrollableElement.scrollTop > Math.max(0, proposedHiderHeight - wtTable.holder.clientHeight);
71381
+ };
71382
+ const isScrolledBeyondHiderWidth = () => {
71383
+ return isWindowScrolled ? false : this.scrollableElement.scrollLeft > Math.max(0, proposedHiderWidth - wtTable.holder.clientWidth);
71384
+ };
71385
+ const columnHeaderBorderCompensation = isScrolledBeyondHiderHeight() ? 1 : 0;
71386
+ const rowHeaderBorderCompensation = isScrolledBeyondHiderWidth() ? 1 : 0;
71387
+
71388
+ // If the elements are being adjusted after scrolling the table from the very beginning to the very end,
71389
+ // we need to adjust the hider dimensions by the header border size. (https://github.com/handsontable/dev-handsontable/issues/1772)
71390
+ hiderStyle.width = `${proposedHiderWidth + rowHeaderBorderCompensation}px`;
71391
+ hiderStyle.height = `${proposedHiderHeight + columnHeaderBorderCompensation}px`;
71352
71392
  if (this.scrollbarSize > 0) {
71353
71393
  // todo refactoring, looking as a part of logic which should be moved outside the class
71354
71394
  const {
@@ -71372,6 +71412,30 @@ class Overlays {
71372
71412
  this.bottomOverlay.adjustElementsSize(force);
71373
71413
  }
71374
71414
 
71415
+ /**
71416
+ * Expand the hider vertically element by the provided delta value.
71417
+ *
71418
+ * @param {number} heightDelta The delta value to expand the hider element by.
71419
+ */
71420
+ expandHiderVerticallyBy(heightDelta) {
71421
+ const {
71422
+ wtTable
71423
+ } = this;
71424
+ wtTable.hider.style.height = `${parseInt(wtTable.hider.style.height, 10) + heightDelta}px`;
71425
+ }
71426
+
71427
+ /**
71428
+ * Expand the hider horizontally element by the provided delta value.
71429
+ *
71430
+ * @param {number} widthDelta The delta value to expand the hider element by.
71431
+ */
71432
+ expandHiderHorizontallyBy(widthDelta) {
71433
+ const {
71434
+ wtTable
71435
+ } = this;
71436
+ wtTable.hider.style.width = `${parseInt(wtTable.hider.style.width, 10) + widthDelta}px`;
71437
+ }
71438
+
71375
71439
  /**
71376
71440
  *
71377
71441
  */
@@ -76862,9 +76926,15 @@ class InlineStartOverlay extends _base.Overlay {
76862
76926
  * @returns {boolean}
76863
76927
  */
76864
76928
  scrollTo(sourceCol, beyondRendered) {
76865
- let newX = this.getTableParentOffset();
76929
+ const {
76930
+ wtSettings
76931
+ } = this;
76932
+ const rowHeaders = wtSettings.getSetting('rowHeaders');
76933
+ const fixedColumnsStart = wtSettings.getSetting('fixedColumnsStart');
76866
76934
  const sourceInstance = this.wot.cloneSource ? this.wot.cloneSource : this.wot;
76867
76935
  const mainHolder = sourceInstance.wtTable.holder;
76936
+ const rowHeaderBorderCompensation = fixedColumnsStart === 0 && rowHeaders.length > 0 && !(0, _element.hasClass)(mainHolder.parentNode, 'innerBorderInlineStart') ? 1 : 0;
76937
+ let newX = this.getTableParentOffset();
76868
76938
  let scrollbarCompensation = 0;
76869
76939
  if (beyondRendered) {
76870
76940
  const columnWidth = this.wot.wtTable.getColumnWidth(sourceCol);
@@ -76879,10 +76949,18 @@ class InlineStartOverlay extends _base.Overlay {
76879
76949
  if (beyondRendered) {
76880
76950
  newX += this.sumCellSizes(0, sourceCol + 1);
76881
76951
  newX -= this.wot.wtViewport.getViewportWidth();
76952
+ // Compensate for the right header border if scrolled from the absolute left.
76953
+ newX += rowHeaderBorderCompensation;
76882
76954
  } else {
76883
76955
  newX += this.sumCellSizes(this.wtSettings.getSetting('fixedColumnsStart'), sourceCol);
76884
76956
  }
76885
76957
  newX += scrollbarCompensation;
76958
+
76959
+ // If the table is scrolled all the way left when starting the scroll and going to be scrolled to the far right,
76960
+ // we need to compensate for the potential header border width.
76961
+ if ((0, _element.getMaximumScrollLeft)(this.mainTableScrollableElement) === newX - rowHeaderBorderCompensation && rowHeaderBorderCompensation > 0) {
76962
+ this.wot.wtOverlays.expandHiderHorizontallyBy(rowHeaderBorderCompensation);
76963
+ }
76886
76964
  return this.setScrollPosition(newX);
76887
76965
  }
76888
76966
 
@@ -79176,6 +79254,9 @@ class TopOverlay extends _base.Overlay {
79176
79254
  } = this;
79177
79255
  const sourceInstance = wot.cloneSource ? wot.cloneSource : wot;
79178
79256
  const mainHolder = sourceInstance.wtTable.holder;
79257
+ const columnHeaders = wtSettings.getSetting('columnHeaders');
79258
+ const fixedRowsTop = wtSettings.getSetting('fixedRowsTop');
79259
+ const columnHeaderBorderCompensation = fixedRowsTop === 0 && columnHeaders.length > 0 && !(0, _element.hasClass)(mainHolder.parentNode, 'innerBorderTop') ? 1 : 0;
79179
79260
  let newY = this.getTableParentOffset();
79180
79261
  let scrollbarCompensation = 0;
79181
79262
  if (bottomEdge) {
@@ -79195,10 +79276,18 @@ class TopOverlay extends _base.Overlay {
79195
79276
  newY -= wot.wtViewport.getViewportHeight() - this.sumCellSizes(totalRows - fixedRowsBottom, totalRows);
79196
79277
  // Fix 1 pixel offset when cell is selected
79197
79278
  newY += 1;
79279
+ // Compensate for the bottom header border if scrolled from the absolute top.
79280
+ newY += columnHeaderBorderCompensation;
79198
79281
  } else {
79199
79282
  newY += this.sumCellSizes(wtSettings.getSetting('fixedRowsTop'), sourceRow);
79200
79283
  }
79201
79284
  newY += scrollbarCompensation;
79285
+
79286
+ // If the table is scrolled all the way up when starting the scroll and going to be scrolled to the bottom,
79287
+ // we need to compensate for the potential header bottom border height.
79288
+ if ((0, _element.getMaximumScrollTop)(this.mainTableScrollableElement) === newY - columnHeaderBorderCompensation && columnHeaderBorderCompensation > 0) {
79289
+ this.wot.wtOverlays.expandHiderVerticallyBy(columnHeaderBorderCompensation);
79290
+ }
79202
79291
  return this.setScrollPosition(newY);
79203
79292
  }
79204
79293
 
@@ -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: 0.0.0-next-bfb0e3a-20240403
29
- * Release date: 06/03/2024 (built at 03/04/2024 11:08:59)
28
+ * Version: 0.0.0-next-53a190b-20240403
29
+ * Release date: 06/03/2024 (built at 03/04/2024 11:36:27)
30
30
  */.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{position:relative}.handsontable .hide{display:none}.handsontable .relative{position:relative}.handsontable .wtHider{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 td:first-of-type,.handsontable th:first-child,.handsontable th:nth-child(2){border-left:1px solid #ccc}[dir=rtl].handsontable td:first-of-type,[dir=rtl].handsontable th:first-child,[dir=rtl].handsontable th:nth-child(2){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)~.handsontable tbody tr th,.ht_master:not(.innerBorderInlineStart):not(.emptyColumns)~.handsontable:not(.ht_clone_top) thead tr th:first-child{border-left:1px solid #ccc;border-right-width:0}[dir=rtl].ht_master:not(.innerBorderInlineStart):not(.emptyColumns)~.handsontable tbody tr th,[dir=rtl].ht_master:not(.innerBorderInlineStart):not(.emptyColumns)~.handsontable:not(.ht_clone_top) 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.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;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}.handsontable .htFocusCatcher{border:0;height:0;margin:0;opacity:0;padding:0;position:absolute;width:0;z-index:-1}.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 .columnSorting{position:relative}.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 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;bottom:-100%\9;content:"";left:0;position:absolute;right:0;top:0}@media (-ms-high-contrast:none),screen and (-ms-high-contrast:active){.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{bottom:-100%}}.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;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{-webkit-appearance:menulist-button!important;position:absolute;width:auto}.htSelectEditor:focus{outline: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{margin:0}.handsontable.listbox .ht_master table{background:#fff;border:1px solid #ccc;border-collapse:separate}.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 .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.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}
31
31
  /*!
32
32
  * Pikaday