handsontable 0.0.0-next-bb36dee-20241108 → 0.0.0-next-cf17948-20241113

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.

Files changed (41) hide show
  1. package/3rdparty/walkontable/src/table.js +3 -1
  2. package/3rdparty/walkontable/src/table.mjs +3 -1
  3. package/3rdparty/walkontable/src/utils/stylesHandler.js +23 -8
  4. package/3rdparty/walkontable/src/utils/stylesHandler.mjs +23 -8
  5. package/base.js +2 -2
  6. package/base.mjs +2 -2
  7. package/core/hooks/constants.js +1 -0
  8. package/core/hooks/constants.mjs +1 -0
  9. package/core/hooks/index.d.ts +1 -1
  10. package/core.d.ts +1 -1
  11. package/core.js +1 -1
  12. package/core.mjs +1 -1
  13. package/dataMap/metaManager/metaSchema.js +1 -1
  14. package/dataMap/metaManager/metaSchema.mjs +1 -1
  15. package/dist/handsontable.css +2 -2
  16. package/dist/handsontable.full.css +2 -2
  17. package/dist/handsontable.full.js +58 -27
  18. package/dist/handsontable.full.min.css +2 -2
  19. package/dist/handsontable.full.min.js +6 -6
  20. package/dist/handsontable.js +58 -27
  21. package/dist/handsontable.min.css +2 -2
  22. package/dist/handsontable.min.js +13 -13
  23. package/editors/dateEditor/dateEditor.js +5 -3
  24. package/editors/dateEditor/dateEditor.mjs +5 -3
  25. package/editors/handsontableEditor/handsontableEditor.js +4 -2
  26. package/editors/handsontableEditor/handsontableEditor.mjs +4 -2
  27. package/helpers/mixed.js +1 -1
  28. package/helpers/mixed.mjs +1 -1
  29. package/package.json +1 -1
  30. package/plugins/comments/comments.js +6 -1
  31. package/plugins/comments/comments.mjs +6 -1
  32. package/plugins/contextMenu/menu/menu.js +5 -3
  33. package/plugins/contextMenu/menu/menu.mjs +5 -3
  34. package/plugins/filters/ui/multipleSelect.js +4 -2
  35. package/plugins/filters/ui/multipleSelect.mjs +4 -2
  36. package/styles/handsontable.css +137 -19
  37. package/styles/handsontable.min.css +3 -3
  38. package/styles/ht-theme-horizon.css +59 -39
  39. package/styles/ht-theme-horizon.min.css +3 -3
  40. package/styles/ht-theme-main.css +59 -39
  41. package/styles/ht-theme-main.min.css +3 -3
@@ -637,6 +637,7 @@ class Table {
637
637
  const borderBoxSizing = this.wot.stylesHandler.areCellsBorderBox();
638
638
  const rowHeightFn = borderBoxSizing ? _element.outerHeight : _element.innerHeight;
639
639
  const borderCompensation = borderBoxSizing ? 0 : 1;
640
+ const firstRowBorderCompensation = borderBoxSizing ? 1 : 0;
640
641
  let previousRowHeight;
641
642
  let rowCurrentHeight;
642
643
  let sourceRowIndex;
@@ -652,12 +653,13 @@ class Table {
652
653
  previousRowHeight = this.getRowHeight(sourceRowIndex);
653
654
  currentTr = this.getTrForRow(sourceRowIndex);
654
655
  rowHeader = currentTr.querySelector('th');
656
+ const topBorderCompensation = sourceRowIndex === 0 ? firstRowBorderCompensation : 0;
655
657
  if (rowHeader) {
656
658
  rowCurrentHeight = rowHeightFn(rowHeader);
657
659
  } else {
658
660
  rowCurrentHeight = rowHeightFn(currentTr) - borderCompensation;
659
661
  }
660
- if (!previousRowHeight && this.dataAccessObject.stylesHandler.getDefaultRowHeight() < rowCurrentHeight || previousRowHeight < rowCurrentHeight) {
662
+ if (!previousRowHeight && this.dataAccessObject.stylesHandler.getDefaultRowHeight() < rowCurrentHeight - topBorderCompensation || previousRowHeight < rowCurrentHeight) {
661
663
  if (!borderBoxSizing) {
662
664
  rowCurrentHeight += 1;
663
665
  }
@@ -633,6 +633,7 @@ class Table {
633
633
  const borderBoxSizing = this.wot.stylesHandler.areCellsBorderBox();
634
634
  const rowHeightFn = borderBoxSizing ? outerHeight : innerHeight;
635
635
  const borderCompensation = borderBoxSizing ? 0 : 1;
636
+ const firstRowBorderCompensation = borderBoxSizing ? 1 : 0;
636
637
  let previousRowHeight;
637
638
  let rowCurrentHeight;
638
639
  let sourceRowIndex;
@@ -648,12 +649,13 @@ class Table {
648
649
  previousRowHeight = this.getRowHeight(sourceRowIndex);
649
650
  currentTr = this.getTrForRow(sourceRowIndex);
650
651
  rowHeader = currentTr.querySelector('th');
652
+ const topBorderCompensation = sourceRowIndex === 0 ? firstRowBorderCompensation : 0;
651
653
  if (rowHeader) {
652
654
  rowCurrentHeight = rowHeightFn(rowHeader);
653
655
  } else {
654
656
  rowCurrentHeight = rowHeightFn(currentTr) - borderCompensation;
655
657
  }
656
- if (!previousRowHeight && this.dataAccessObject.stylesHandler.getDefaultRowHeight() < rowCurrentHeight || previousRowHeight < rowCurrentHeight) {
658
+ if (!previousRowHeight && this.dataAccessObject.stylesHandler.getDefaultRowHeight() < rowCurrentHeight - topBorderCompensation || previousRowHeight < rowCurrentHeight) {
657
659
  if (!borderBoxSizing) {
658
660
  rowCurrentHeight += 1;
659
661
  }
@@ -33,7 +33,9 @@ class StylesHandler {
33
33
  */
34
34
  constructor(domBindings) {
35
35
  /**
36
- * Applies the necessary class names to the root element.
36
+ * Calculates the row height based on the current theme and CSS variables.
37
+ *
38
+ * @returns {number|null} The calculated row height, or `null` if any required CSS variable is not found.
37
39
  */
38
40
  _classPrivateMethodInitSpec(this, _StylesHandler_brand);
39
41
  /**
@@ -135,15 +137,15 @@ class StylesHandler {
135
137
  if (_classPrivateFieldGet(_isClassicTheme, this)) {
136
138
  return CLASSIC_THEME_DEFAULT_HEIGHT;
137
139
  }
138
- const cssVarRowHeightValue = this.getCSSVariableValue('row-height');
139
- if (!cssVarRowHeightValue) {
140
- (0, _console.warn)(`The "${_classPrivateFieldGet(_themeName, this)}" theme is enabled, but its stylesheets are missing. \
140
+ const calculatedRowHeight = _assertClassBrand(_StylesHandler_brand, this, _calculateRowHeight).call(this);
141
+ if (!calculatedRowHeight) {
142
+ (0, _console.warn)(`The "${_classPrivateFieldGet(_themeName, this)}" theme is enabled, but its stylesheets are missing or not imported correctly. \
141
143
  Import the correct CSS files in order to use that theme.`);
142
144
  _classPrivateFieldSet(_isClassicTheme, this, true);
143
145
  this.useTheme();
144
146
  return CLASSIC_THEME_DEFAULT_HEIGHT;
145
147
  }
146
- return cssVarRowHeightValue;
148
+ return calculatedRowHeight;
147
149
  }
148
150
 
149
151
  /**
@@ -197,6 +199,18 @@ Import the correct CSS files in order to use that theme.`);
197
199
  }
198
200
  }
199
201
  exports.StylesHandler = StylesHandler;
202
+ function _calculateRowHeight() {
203
+ const lineHeightVarValue = this.getCSSVariableValue('line-height');
204
+ const verticalPaddingVarValue = this.getCSSVariableValue('cell-vertical-padding');
205
+ const bottomBorderWidth = Math.ceil(parseFloat(this.getStyleForTD('border-bottom-width')));
206
+ if (lineHeightVarValue === null || verticalPaddingVarValue === null || isNaN(bottomBorderWidth)) {
207
+ return null;
208
+ }
209
+ return lineHeightVarValue + 2 * verticalPaddingVarValue + bottomBorderWidth;
210
+ }
211
+ /**
212
+ * Applies the necessary class names to the root element.
213
+ */
200
214
  function _applyClassNames() {
201
215
  (0, _element.removeClass)(_classPrivateFieldGet(_rootElement, this), /ht-theme-.*/g);
202
216
  (0, _element.addClass)(_classPrivateFieldGet(_rootElement, this), _classPrivateFieldGet(_themeName, this));
@@ -208,11 +222,12 @@ function _cacheStylesheetValues() {
208
222
  if (!this.isClassicTheme()) {
209
223
  _classPrivateFieldSet(_rootComputedStyle, this, getComputedStyle(_classPrivateFieldGet(_rootElement, this)));
210
224
  }
211
- const stylesForTD = _assertClassBrand(_StylesHandler_brand, this, _getStylesForTD).call(this, ['box-sizing']);
225
+ const stylesForTD = _assertClassBrand(_StylesHandler_brand, this, _getStylesForTD).call(this, ['box-sizing', 'border-bottom-width']);
212
226
  _classPrivateFieldGet(_computedStyles, this).td = {
213
227
  ..._classPrivateFieldGet(_computedStyles, this).td,
214
228
  ...{
215
- 'box-sizing': stylesForTD['box-sizing']
229
+ 'box-sizing': stylesForTD['box-sizing'],
230
+ 'border-bottom-width': stylesForTD['border-bottom-width']
216
231
  }
217
232
  };
218
233
  }
@@ -259,7 +274,7 @@ function _getParsedCSSValue(property) {
259
274
  if (_classPrivateFieldGet(_isClassicTheme, this)) {
260
275
  return null;
261
276
  }
262
- const parsedValue = parseInt(_classPrivateFieldGet(_rootComputedStyle, this).getPropertyValue(property), 10);
277
+ const parsedValue = Math.ceil(parseFloat(_classPrivateFieldGet(_rootComputedStyle, this).getPropertyValue(property)));
263
278
  return Number.isNaN(parsedValue) ? null : parsedValue;
264
279
  }
265
280
  /**
@@ -30,7 +30,9 @@ export class StylesHandler {
30
30
  */
31
31
  constructor(domBindings) {
32
32
  /**
33
- * Applies the necessary class names to the root element.
33
+ * Calculates the row height based on the current theme and CSS variables.
34
+ *
35
+ * @returns {number|null} The calculated row height, or `null` if any required CSS variable is not found.
34
36
  */
35
37
  _classPrivateMethodInitSpec(this, _StylesHandler_brand);
36
38
  /**
@@ -132,15 +134,15 @@ export class StylesHandler {
132
134
  if (_classPrivateFieldGet(_isClassicTheme, this)) {
133
135
  return CLASSIC_THEME_DEFAULT_HEIGHT;
134
136
  }
135
- const cssVarRowHeightValue = this.getCSSVariableValue('row-height');
136
- if (!cssVarRowHeightValue) {
137
- warn(`The "${_classPrivateFieldGet(_themeName, this)}" theme is enabled, but its stylesheets are missing. \
137
+ const calculatedRowHeight = _assertClassBrand(_StylesHandler_brand, this, _calculateRowHeight).call(this);
138
+ if (!calculatedRowHeight) {
139
+ warn(`The "${_classPrivateFieldGet(_themeName, this)}" theme is enabled, but its stylesheets are missing or not imported correctly. \
138
140
  Import the correct CSS files in order to use that theme.`);
139
141
  _classPrivateFieldSet(_isClassicTheme, this, true);
140
142
  this.useTheme();
141
143
  return CLASSIC_THEME_DEFAULT_HEIGHT;
142
144
  }
143
- return cssVarRowHeightValue;
145
+ return calculatedRowHeight;
144
146
  }
145
147
 
146
148
  /**
@@ -193,6 +195,18 @@ Import the correct CSS files in order to use that theme.`);
193
195
  }
194
196
  }
195
197
  }
198
+ function _calculateRowHeight() {
199
+ const lineHeightVarValue = this.getCSSVariableValue('line-height');
200
+ const verticalPaddingVarValue = this.getCSSVariableValue('cell-vertical-padding');
201
+ const bottomBorderWidth = Math.ceil(parseFloat(this.getStyleForTD('border-bottom-width')));
202
+ if (lineHeightVarValue === null || verticalPaddingVarValue === null || isNaN(bottomBorderWidth)) {
203
+ return null;
204
+ }
205
+ return lineHeightVarValue + 2 * verticalPaddingVarValue + bottomBorderWidth;
206
+ }
207
+ /**
208
+ * Applies the necessary class names to the root element.
209
+ */
196
210
  function _applyClassNames() {
197
211
  removeClass(_classPrivateFieldGet(_rootElement, this), /ht-theme-.*/g);
198
212
  addClass(_classPrivateFieldGet(_rootElement, this), _classPrivateFieldGet(_themeName, this));
@@ -204,11 +218,12 @@ function _cacheStylesheetValues() {
204
218
  if (!this.isClassicTheme()) {
205
219
  _classPrivateFieldSet(_rootComputedStyle, this, getComputedStyle(_classPrivateFieldGet(_rootElement, this)));
206
220
  }
207
- const stylesForTD = _assertClassBrand(_StylesHandler_brand, this, _getStylesForTD).call(this, ['box-sizing']);
221
+ const stylesForTD = _assertClassBrand(_StylesHandler_brand, this, _getStylesForTD).call(this, ['box-sizing', 'border-bottom-width']);
208
222
  _classPrivateFieldGet(_computedStyles, this).td = {
209
223
  ..._classPrivateFieldGet(_computedStyles, this).td,
210
224
  ...{
211
- 'box-sizing': stylesForTD['box-sizing']
225
+ 'box-sizing': stylesForTD['box-sizing'],
226
+ 'border-bottom-width': stylesForTD['border-bottom-width']
212
227
  }
213
228
  };
214
229
  }
@@ -255,7 +270,7 @@ function _getParsedCSSValue(property) {
255
270
  if (_classPrivateFieldGet(_isClassicTheme, this)) {
256
271
  return null;
257
272
  }
258
- const parsedValue = parseInt(_classPrivateFieldGet(_rootComputedStyle, this).getPropertyValue(property), 10);
273
+ const parsedValue = Math.ceil(parseFloat(_classPrivateFieldGet(_rootComputedStyle, this).getPropertyValue(property)));
259
274
  return Number.isNaN(parsedValue) ? null : parsedValue;
260
275
  }
261
276
  /**
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 = "08/11/2024 12:47:02";
49
- Handsontable.version = "0.0.0-next-bb36dee-20241108";
48
+ Handsontable.buildDate = "13/11/2024 12:54:48";
49
+ Handsontable.version = "0.0.0-next-cf17948-20241113";
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 = "08/11/2024 12:47:08";
39
- Handsontable.version = "0.0.0-next-bb36dee-20241108";
38
+ Handsontable.buildDate = "13/11/2024 12:54:53";
39
+ Handsontable.version = "0.0.0-next-cf17948-20241113";
40
40
  Handsontable.languages = {
41
41
  dictionaryKeys,
42
42
  getLanguageDictionary,
@@ -871,6 +871,7 @@ const REGISTERED_HOOKS = exports.REGISTERED_HOOKS = [/* eslint-disable jsdoc/req
871
871
  * @since 15.0.0
872
872
  * @event Hooks#afterSetTheme
873
873
  * @param {string|boolean|undefined} themeName The theme name.
874
+ * @param {boolean} firstRun `true` if it's the initial setting of the theme, `false` otherwise.
874
875
  */
875
876
  'afterSetTheme',
876
877
  /**
@@ -868,6 +868,7 @@ export const REGISTERED_HOOKS = [/* eslint-disable jsdoc/require-description-com
868
868
  * @since 15.0.0
869
869
  * @event Hooks#afterSetTheme
870
870
  * @param {string|boolean|undefined} themeName The theme name.
871
+ * @param {boolean} firstRun `true` if it's the initial setting of the theme, `false` otherwise.
871
872
  */
872
873
  'afterSetTheme',
873
874
  /**
@@ -134,7 +134,7 @@ export interface Events {
134
134
  afterSetDataAtCell?: (changes: CellChange[], source?: ChangeSource) => void;
135
135
  afterSetDataAtRowProp?: (changes: CellChange[], source?: ChangeSource) => void;
136
136
  afterSetSourceDataAtCell?: (changes: CellChange[], source?: ChangeSource) => void;
137
- afterSetTheme?: (themeName: string|boolean|undefined) => void;
137
+ afterSetTheme?: (themeName: string|boolean|undefined, firstRun: boolean) => void;
138
138
  afterSheetAdded?: (addedSheetDisplayName: string) => void;
139
139
  afterSheetRemoved?: (removedSheetDisplayName: string, changes: ExportedChange[]) => void;
140
140
  afterSheetRenamed?: (oldDisplayName: string, newDisplayName: string) => void;
package/core.d.ts CHANGED
@@ -180,7 +180,7 @@ export default class Core {
180
180
  unlisten(): void;
181
181
  updateData(data: CellValue[][] | RowObject[], source?: string): void;
182
182
  updateSettings(settings: GridSettings, init?: boolean): void;
183
- useTheme(themeName: string|undefined): void;
183
+ useTheme(themeName: string|boolean|undefined): void;
184
184
  validateCell(value: any, cellProperties: CellProperties, callback: (valid: boolean) => void, source: string): void;
185
185
  validateCells(callback?: (valid: boolean) => void): void;
186
186
  validateColumns(columns: number[], callback?: (valid: boolean) => void): void;
package/core.js CHANGED
@@ -4622,7 +4622,7 @@ function Core(rootElement, userSettings) {
4622
4622
  */
4623
4623
  this.useTheme = themeName => {
4624
4624
  this.view.getStylesHandler().useTheme(themeName);
4625
- this.runHooks('afterSetTheme', themeName);
4625
+ this.runHooks('afterSetTheme', themeName, !!firstRun);
4626
4626
  };
4627
4627
 
4628
4628
  /**
package/core.mjs CHANGED
@@ -4617,7 +4617,7 @@ export default function Core(rootElement, userSettings) {
4617
4617
  */
4618
4618
  this.useTheme = themeName => {
4619
4619
  this.view.getStylesHandler().useTheme(themeName);
4620
- this.runHooks('afterSetTheme', themeName);
4620
+ this.runHooks('afterSetTheme', themeName, !!firstRun);
4621
4621
  };
4622
4622
 
4623
4623
  /**
@@ -3842,7 +3842,7 @@ var _default = () => {
3842
3842
  /**
3843
3843
  * The `rowHeights` option sets rows' heights, in pixels.
3844
3844
  *
3845
- * In the rendering process, the default row height is 23 px (in the classic theme: 22 px + 1 px of the row's bottom border) or what's defined as `--ht-row-height` in the used theme.
3845
+ * In the rendering process, the default row height is 23 px (in the classic theme: 22 px + 1 px of the row's bottom border) or whatever is defined in the used theme (based on the line height, vertical padding and cell borders).
3846
3846
  * You can change it to equal or greater than the defautl value, by setting the `rowHeights` option to one of the following:
3847
3847
  *
3848
3848
  * | Setting | Description | Example |
@@ -3839,7 +3839,7 @@ export default () => {
3839
3839
  /**
3840
3840
  * The `rowHeights` option sets rows' heights, in pixels.
3841
3841
  *
3842
- * In the rendering process, the default row height is 23 px (in the classic theme: 22 px + 1 px of the row's bottom border) or what's defined as `--ht-row-height` in the used theme.
3842
+ * In the rendering process, the default row height is 23 px (in the classic theme: 22 px + 1 px of the row's bottom border) or whatever is defined in the used theme (based on the line height, vertical padding and cell borders).
3843
3843
  * You can change it to equal or greater than the defautl value, by setting the `rowHeights` option to one of the following:
3844
3844
  *
3845
3845
  * | Setting | Description | Example |
@@ -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-bb36dee-20241108
29
- * Release date: 17/10/2024 (built at 08/11/2024 12:47:30)
28
+ * Version: 0.0.0-next-cf17948-20241113
29
+ * Release date: 17/10/2024 (built at 13/11/2024 12:55:17)
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-bb36dee-20241108
29
- * Release date: 17/10/2024 (built at 08/11/2024 12:47:30)
28
+ * Version: 0.0.0-next-cf17948-20241113
29
+ * Release date: 17/10/2024 (built at 13/11/2024 12:55:17)
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-bb36dee-20241108
29
- * Release date: 17/10/2024 (built at 08/11/2024 12:47:12)
28
+ * Version: 0.0.0-next-cf17948-20241113
29
+ * Release date: 17/10/2024 (built at 13/11/2024 12:54:58)
30
30
  */
31
31
  (function webpackUniversalModuleDefinition(root, factory) {
32
32
  if(typeof exports === 'object' && typeof module === 'object')
@@ -42676,8 +42676,8 @@ Handsontable.hooks = _hooks.Hooks.getSingleton();
42676
42676
  Handsontable.CellCoords = _src.CellCoords;
42677
42677
  Handsontable.CellRange = _src.CellRange;
42678
42678
  Handsontable.packageName = 'handsontable';
42679
- Handsontable.buildDate = "08/11/2024 12:47:12";
42680
- Handsontable.version = "0.0.0-next-bb36dee-20241108";
42679
+ Handsontable.buildDate = "13/11/2024 12:54:58";
42680
+ Handsontable.version = "0.0.0-next-cf17948-20241113";
42681
42681
  Handsontable.languages = {
42682
42682
  dictionaryKeys: _registry.dictionaryKeys,
42683
42683
  getLanguageDictionary: _registry.getLanguageDictionary,
@@ -47322,7 +47322,7 @@ function Core(rootElement, userSettings) {
47322
47322
  */
47323
47323
  this.useTheme = themeName => {
47324
47324
  this.view.getStylesHandler().useTheme(themeName);
47325
- this.runHooks('afterSetTheme', themeName);
47325
+ this.runHooks('afterSetTheme', themeName, !!firstRun);
47326
47326
  };
47327
47327
 
47328
47328
  /**
@@ -54203,7 +54203,7 @@ const domMessages = {
54203
54203
  function _injectProductInfo(key, element) {
54204
54204
  const hasValidType = !isEmpty(key);
54205
54205
  const isNonCommercial = typeof key === 'string' && key.toLowerCase() === 'non-commercial-and-evaluation';
54206
- const hotVersion = "0.0.0-next-bb36dee-20241108";
54206
+ const hotVersion = "0.0.0-next-cf17948-20241113";
54207
54207
  let keyValidityDate;
54208
54208
  let consoleMessageState = 'invalid';
54209
54209
  let domMessageState = 'invalid';
@@ -64724,6 +64724,7 @@ const REGISTERED_HOOKS = exports.REGISTERED_HOOKS = [/* eslint-disable jsdoc/req
64724
64724
  * @since 15.0.0
64725
64725
  * @event Hooks#afterSetTheme
64726
64726
  * @param {string|boolean|undefined} themeName The theme name.
64727
+ * @param {boolean} firstRun `true` if it's the initial setting of the theme, `false` otherwise.
64727
64728
  */
64728
64729
  'afterSetTheme',
64729
64730
  /**
@@ -74862,6 +74863,7 @@ class Table {
74862
74863
  const borderBoxSizing = this.wot.stylesHandler.areCellsBorderBox();
74863
74864
  const rowHeightFn = borderBoxSizing ? _element.outerHeight : _element.innerHeight;
74864
74865
  const borderCompensation = borderBoxSizing ? 0 : 1;
74866
+ const firstRowBorderCompensation = borderBoxSizing ? 1 : 0;
74865
74867
  let previousRowHeight;
74866
74868
  let rowCurrentHeight;
74867
74869
  let sourceRowIndex;
@@ -74877,12 +74879,13 @@ class Table {
74877
74879
  previousRowHeight = this.getRowHeight(sourceRowIndex);
74878
74880
  currentTr = this.getTrForRow(sourceRowIndex);
74879
74881
  rowHeader = currentTr.querySelector('th');
74882
+ const topBorderCompensation = sourceRowIndex === 0 ? firstRowBorderCompensation : 0;
74880
74883
  if (rowHeader) {
74881
74884
  rowCurrentHeight = rowHeightFn(rowHeader);
74882
74885
  } else {
74883
74886
  rowCurrentHeight = rowHeightFn(currentTr) - borderCompensation;
74884
74887
  }
74885
- if (!previousRowHeight && this.dataAccessObject.stylesHandler.getDefaultRowHeight() < rowCurrentHeight || previousRowHeight < rowCurrentHeight) {
74888
+ if (!previousRowHeight && this.dataAccessObject.stylesHandler.getDefaultRowHeight() < rowCurrentHeight - topBorderCompensation || previousRowHeight < rowCurrentHeight) {
74886
74889
  if (!borderBoxSizing) {
74887
74890
  rowCurrentHeight += 1;
74888
74891
  }
@@ -82737,7 +82740,9 @@ class StylesHandler {
82737
82740
  */
82738
82741
  constructor(domBindings) {
82739
82742
  /**
82740
- * Applies the necessary class names to the root element.
82743
+ * Calculates the row height based on the current theme and CSS variables.
82744
+ *
82745
+ * @returns {number|null} The calculated row height, or `null` if any required CSS variable is not found.
82741
82746
  */
82742
82747
  _classPrivateMethodInitSpec(this, _StylesHandler_brand);
82743
82748
  /**
@@ -82839,15 +82844,15 @@ class StylesHandler {
82839
82844
  if (_classPrivateFieldGet(_isClassicTheme, this)) {
82840
82845
  return CLASSIC_THEME_DEFAULT_HEIGHT;
82841
82846
  }
82842
- const cssVarRowHeightValue = this.getCSSVariableValue('row-height');
82843
- if (!cssVarRowHeightValue) {
82844
- (0, _console.warn)(`The "${_classPrivateFieldGet(_themeName, this)}" theme is enabled, but its stylesheets are missing. \
82847
+ const calculatedRowHeight = _assertClassBrand(_StylesHandler_brand, this, _calculateRowHeight).call(this);
82848
+ if (!calculatedRowHeight) {
82849
+ (0, _console.warn)(`The "${_classPrivateFieldGet(_themeName, this)}" theme is enabled, but its stylesheets are missing or not imported correctly. \
82845
82850
  Import the correct CSS files in order to use that theme.`);
82846
82851
  _classPrivateFieldSet(_isClassicTheme, this, true);
82847
82852
  this.useTheme();
82848
82853
  return CLASSIC_THEME_DEFAULT_HEIGHT;
82849
82854
  }
82850
- return cssVarRowHeightValue;
82855
+ return calculatedRowHeight;
82851
82856
  }
82852
82857
 
82853
82858
  /**
@@ -82901,6 +82906,18 @@ Import the correct CSS files in order to use that theme.`);
82901
82906
  }
82902
82907
  }
82903
82908
  exports.StylesHandler = StylesHandler;
82909
+ function _calculateRowHeight() {
82910
+ const lineHeightVarValue = this.getCSSVariableValue('line-height');
82911
+ const verticalPaddingVarValue = this.getCSSVariableValue('cell-vertical-padding');
82912
+ const bottomBorderWidth = Math.ceil(parseFloat(this.getStyleForTD('border-bottom-width')));
82913
+ if (lineHeightVarValue === null || verticalPaddingVarValue === null || isNaN(bottomBorderWidth)) {
82914
+ return null;
82915
+ }
82916
+ return lineHeightVarValue + 2 * verticalPaddingVarValue + bottomBorderWidth;
82917
+ }
82918
+ /**
82919
+ * Applies the necessary class names to the root element.
82920
+ */
82904
82921
  function _applyClassNames() {
82905
82922
  (0, _element.removeClass)(_classPrivateFieldGet(_rootElement, this), /ht-theme-.*/g);
82906
82923
  (0, _element.addClass)(_classPrivateFieldGet(_rootElement, this), _classPrivateFieldGet(_themeName, this));
@@ -82912,11 +82929,12 @@ function _cacheStylesheetValues() {
82912
82929
  if (!this.isClassicTheme()) {
82913
82930
  _classPrivateFieldSet(_rootComputedStyle, this, getComputedStyle(_classPrivateFieldGet(_rootElement, this)));
82914
82931
  }
82915
- const stylesForTD = _assertClassBrand(_StylesHandler_brand, this, _getStylesForTD).call(this, ['box-sizing']);
82932
+ const stylesForTD = _assertClassBrand(_StylesHandler_brand, this, _getStylesForTD).call(this, ['box-sizing', 'border-bottom-width']);
82916
82933
  _classPrivateFieldGet(_computedStyles, this).td = {
82917
82934
  ..._classPrivateFieldGet(_computedStyles, this).td,
82918
82935
  ...{
82919
- 'box-sizing': stylesForTD['box-sizing']
82936
+ 'box-sizing': stylesForTD['box-sizing'],
82937
+ 'border-bottom-width': stylesForTD['border-bottom-width']
82920
82938
  }
82921
82939
  };
82922
82940
  }
@@ -82963,7 +82981,7 @@ function _getParsedCSSValue(property) {
82963
82981
  if (_classPrivateFieldGet(_isClassicTheme, this)) {
82964
82982
  return null;
82965
82983
  }
82966
- const parsedValue = parseInt(_classPrivateFieldGet(_rootComputedStyle, this).getPropertyValue(property), 10);
82984
+ const parsedValue = Math.ceil(parseFloat(_classPrivateFieldGet(_rootComputedStyle, this).getPropertyValue(property)));
82967
82985
  return Number.isNaN(parsedValue) ? null : parsedValue;
82968
82986
  }
82969
82987
  /**
@@ -94886,7 +94904,7 @@ var _default = () => {
94886
94904
  /**
94887
94905
  * The `rowHeights` option sets rows' heights, in pixels.
94888
94906
  *
94889
- * In the rendering process, the default row height is 23 px (in the classic theme: 22 px + 1 px of the row's bottom border) or what's defined as `--ht-row-height` in the used theme.
94907
+ * In the rendering process, the default row height is 23 px (in the classic theme: 22 px + 1 px of the row's bottom border) or whatever is defined in the used theme (based on the line height, vertical padding and cell borders).
94890
94908
  * You can change it to equal or greater than the defautl value, by setting the `rowHeights` option to one of the following:
94891
94909
  *
94892
94910
  * | Setting | Description | Example |
@@ -102345,8 +102363,10 @@ class HandsontableEditor extends _textEditor.TextEditor {
102345
102363
  this.htEditor.destroy();
102346
102364
  }
102347
102365
  });
102348
- this.hot.addHook('afterSetTheme', themeName => {
102349
- this.htEditor.useTheme(themeName);
102366
+ this.hot.addHook('afterSetTheme', (themeName, firstRun) => {
102367
+ if (!firstRun) {
102368
+ this.htEditor.useTheme(themeName);
102369
+ }
102350
102370
  });
102351
102371
  }
102352
102372
 
@@ -102562,9 +102582,11 @@ class DateEditor extends _textEditor.TextEditor {
102562
102582
  this.parentDestroyed = true;
102563
102583
  this.destroyElements();
102564
102584
  });
102565
- this.hot.addHook('afterSetTheme', themeName => {
102566
- (0, _element.removeClass)(this.datePicker, /ht-theme-.*/g);
102567
- (0, _element.addClass)(this.datePicker, themeName);
102585
+ this.hot.addHook('afterSetTheme', (themeName, firstRun) => {
102586
+ if (!firstRun) {
102587
+ (0, _element.removeClass)(this.datePicker, /ht-theme-.*/g);
102588
+ (0, _element.addClass)(this.datePicker, themeName);
102589
+ }
102568
102590
  });
102569
102591
  }
102570
102592
 
@@ -118472,7 +118494,12 @@ class Comments extends _base.BasePlugin {
118472
118494
  this.addHook('afterScroll', () => _assertClassBrand(_Comments_brand, this, _onAfterScroll).call(this));
118473
118495
  this.addHook('afterBeginEditing', () => this.hide());
118474
118496
  this.addHook('afterDocumentKeyDown', event => _assertClassBrand(_Comments_brand, this, _onAfterDocumentKeyDown).call(this, event));
118475
- this.addHook('afterSetTheme', () => _assertClassBrand(_Comments_brand, this, _updateEditorThemeClassName).call(this));
118497
+ this.addHook('afterSetTheme', function () {
118498
+ for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
118499
+ args[_key2] = arguments[_key2];
118500
+ }
118501
+ return _assertClassBrand(_Comments_brand, _this, _updateEditorThemeClassName).call(_this, ...args);
118502
+ });
118476
118503
  _classPrivateFieldGet(_displaySwitch, this).addLocalHook('hide', () => this.hide());
118477
118504
  _classPrivateFieldGet(_displaySwitch, this).addLocalHook('show', (row, col) => this.showAtCell(row, col));
118478
118505
  this.registerShortcuts();
@@ -121621,9 +121648,11 @@ class Menu {
121621
121648
  return _this.parentMenu.runLocalHooks('afterSelectionChange', ...args);
121622
121649
  });
121623
121650
  }
121624
- this.hot.addHook('afterSetTheme', themeName => {
121625
- var _this$hotMenu;
121626
- (_this$hotMenu = this.hotMenu) === null || _this$hotMenu === void 0 || _this$hotMenu.useTheme(themeName);
121651
+ this.hot.addHook('afterSetTheme', (themeName, firstRun) => {
121652
+ if (!firstRun) {
121653
+ var _this$hotMenu;
121654
+ (_this$hotMenu = this.hotMenu) === null || _this$hotMenu === void 0 || _this$hotMenu.useTheme(themeName);
121655
+ }
121627
121656
  });
121628
121657
  }
121629
121658
 
@@ -131157,8 +131186,10 @@ class MultipleSelectUI extends _base.BaseUI {
131157
131186
  layoutDirection: this.hot.isRtl() ? 'rtl' : 'ltr'
131158
131187
  }));
131159
131188
  _classPrivateFieldGet(_itemsBox, this).init();
131160
- this.hot.addHook('afterSetTheme', () => {
131161
- _classPrivateFieldGet(_itemsBox, this).useTheme(this.hot.getCurrentThemeName());
131189
+ this.hot.addHook('afterSetTheme', (themeName, firstRun) => {
131190
+ if (!firstRun) {
131191
+ _classPrivateFieldGet(_itemsBox, this).useTheme(themeName);
131192
+ }
131162
131193
  });
131163
131194
  const shortcutManager = _classPrivateFieldGet(_itemsBox, this).getShortcutManager();
131164
131195
  const gridContext = shortcutManager.getContext('grid');
@@ -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: 0.0.0-next-bb36dee-20241108
30
- * Release date: 17/10/2024 (built at 08/11/2024 12:48:05)
29
+ * Version: 0.0.0-next-cf17948-20241113
30
+ * Release date: 17/10/2024 (built at 13/11/2024 12:55:53)
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{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{border-left:1px solid #ccc}[dir=rtl].handsontable td:first-of-type,[dir=rtl].handsontable th:first-child{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.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 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{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.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{display:inline-block}.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 .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