@odoo/o-spreadsheet 19.0.9 → 19.0.11

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.
@@ -2,9 +2,9 @@
2
2
  /**
3
3
  * This file is generated by o-spreadsheet build tools. Do not edit it.
4
4
  * @see https://github.com/odoo/o-spreadsheet
5
- * @version 19.0.9
6
- * @date 2025-11-03T12:32:15.473Z
7
- * @hash 10359f4
5
+ * @version 19.0.11
6
+ * @date 2025-11-24T07:46:47.685Z
7
+ * @hash f5bdbcc
8
8
  */
9
9
 
10
10
  import { useEnv, useSubEnv, onWillUnmount, useComponent, status, Component, useRef, onMounted, useEffect, App, blockDom, useState, onPatched, useExternalListener, onWillUpdateProps, onWillStart, onWillPatch, xml, useChildSubEnv, markRaw, toRaw } from '@odoo/owl';
@@ -862,7 +862,7 @@ const PIVOT_TABLE_CONFIG = {
862
862
  };
863
863
  const PIVOT_INDENT = 15;
864
864
  const PIVOT_COLLAPSE_ICON_SIZE = 12;
865
- const PIVOT_MAX_NUMBER_OF_CELLS = 1e5;
865
+ const PIVOT_MAX_NUMBER_OF_CELLS = 5e5;
866
866
  const DEFAULT_CURRENCY = {
867
867
  symbol: "$",
868
868
  position: "before",
@@ -2499,7 +2499,10 @@ function isInside(col, row, zone) {
2499
2499
  * Check if a zone is inside another
2500
2500
  */
2501
2501
  function isZoneInside(smallZone, biggerZone) {
2502
- return isEqual(union(biggerZone, smallZone), biggerZone);
2502
+ return (smallZone.left >= biggerZone.left &&
2503
+ smallZone.right <= biggerZone.right &&
2504
+ smallZone.top >= biggerZone.top &&
2505
+ smallZone.bottom <= biggerZone.bottom);
2503
2506
  }
2504
2507
  function zoneToDimension(zone) {
2505
2508
  return {
@@ -6902,7 +6905,7 @@ function getRangeString(range, forSheetId, getSheetName, options = { useBoundedR
6902
6905
  let sheetName = "";
6903
6906
  if (prefixSheet) {
6904
6907
  if (range.invalidSheetName) {
6905
- sheetName = range.invalidSheetName;
6908
+ sheetName = getCanonicalSymbolName(range.invalidSheetName);
6906
6909
  }
6907
6910
  else {
6908
6911
  sheetName = getCanonicalSymbolName(getSheetName(range.sheetId));
@@ -13345,7 +13348,7 @@ const SUBTOTAL = {
13345
13348
  if (!acceptHiddenCells && this.getters.isRowHiddenByUser(sheetId, row))
13346
13349
  continue;
13347
13350
  for (let col = left; col <= right; col++) {
13348
- const cell = this.getters.getCell({ sheetId, col, row });
13351
+ const cell = this.getters.getCorrespondingFormulaCell({ sheetId, col, row });
13349
13352
  if (!cell || !isSubtotalCell(cell)) {
13350
13353
  evaluatedCellToKeep.push(this.getters.getEvaluatedCell({ sheetId, col, row }));
13351
13354
  }
@@ -19341,7 +19344,7 @@ function getTokenNextReferenceType(xc) {
19341
19344
  function setXcToFixedReferenceType(xc, referenceType) {
19342
19345
  let sheetName;
19343
19346
  ({ sheetName, xc } = splitReference(xc));
19344
- sheetName = sheetName ? sheetName + "!" : "";
19347
+ sheetName = sheetName ? getCanonicalSymbolName(sheetName) + "!" : "";
19345
19348
  xc = xc.replace(/\$/g, "");
19346
19349
  const splitIndex = xc.indexOf(":");
19347
19350
  if (splitIndex >= 0) {
@@ -24418,7 +24421,7 @@ let ScorecardChart$1 = class ScorecardChart extends AbstractChart {
24418
24421
  return {
24419
24422
  background: context.background,
24420
24423
  type: "scorecard",
24421
- keyValue: context.range ? context.range[0].dataRange : undefined,
24424
+ keyValue: context.range?.[0]?.dataRange,
24422
24425
  title: context.title || { text: "" },
24423
24426
  baselineMode: DEFAULT_SCORECARD_BASELINE_MODE,
24424
24427
  baselineColorUp: DEFAULT_SCORECARD_BASELINE_COLOR_UP,
@@ -29127,7 +29130,7 @@ class GaugeChart extends AbstractChart {
29127
29130
  background: context.background,
29128
29131
  title: context.title || { text: "" },
29129
29132
  type: "gauge",
29130
- dataRange: context.range ? context.range[0].dataRange : undefined,
29133
+ dataRange: context.range?.[0]?.dataRange,
29131
29134
  sectionRule: {
29132
29135
  colors: {
29133
29136
  lowerColor: DEFAULT_GAUGE_LOWER_COLOR,
@@ -31019,8 +31022,7 @@ function generateMasterChartConfig(chartJsConfig) {
31019
31022
  .filter((ds) => !isTrendLineAxis(ds["xAxisID"]))
31020
31023
  .map((ds) => ({
31021
31024
  ...ds,
31022
- pointRadius: 0,
31023
- showLine: true,
31025
+ pointRadius: ds.showLine === false ? 2 : 0, // Show points only for scatter plots
31024
31026
  })),
31025
31027
  },
31026
31028
  options: {
@@ -34521,16 +34523,12 @@ class Composer extends Component {
34521
34523
  processTabKey(ev, direction) {
34522
34524
  ev.preventDefault();
34523
34525
  ev.stopPropagation();
34524
- if (!this.assistant.forcedClosed) {
34525
- this.props.composerStore.autoCompleteOrStop(direction);
34526
- }
34526
+ this.props.composerStore.autoCompleteOrStop(direction, this.assistant.forcedClosed);
34527
34527
  }
34528
34528
  processEnterKey(ev, direction) {
34529
34529
  ev.preventDefault();
34530
34530
  ev.stopPropagation();
34531
- if (!this.assistant.forcedClosed) {
34532
- this.props.composerStore.autoCompleteOrStop(direction);
34533
- }
34531
+ this.props.composerStore.autoCompleteOrStop(direction, this.assistant.forcedClosed);
34534
34532
  }
34535
34533
  processNewLineEvent(ev) {
34536
34534
  ev.preventDefault();
@@ -34706,7 +34704,6 @@ class Composer extends Component {
34706
34704
  return;
34707
34705
  }
34708
34706
  const newSelection = this.contentHelper.getCurrentSelection();
34709
- this.props.composerStore.stopComposerRangeSelection();
34710
34707
  const isCurrentlyInactive = this.props.composerStore.editionMode === "inactive";
34711
34708
  this.props.onComposerContentFocused(newSelection);
34712
34709
  if (!isCurrentlyInactive) {
@@ -35162,6 +35159,7 @@ class AbstractComposerStore extends SpreadsheetStore {
35162
35159
  this.highlightStore.register(this);
35163
35160
  this.onDispose(() => {
35164
35161
  this.highlightStore.unRegister(this);
35162
+ this._cancelEdition();
35165
35163
  });
35166
35164
  }
35167
35165
  handleEvent(event) {
@@ -35196,6 +35194,7 @@ class AbstractComposerStore extends SpreadsheetStore {
35196
35194
  }
35197
35195
  this.selectionStart = start;
35198
35196
  this.selectionEnd = end;
35197
+ this.editionMode = "editing";
35199
35198
  this.computeFormulaCursorContext();
35200
35199
  this.computeParenthesisRelatedToCursor();
35201
35200
  this.updateAutoCompleteProvider();
@@ -35866,10 +35865,13 @@ class AbstractComposerStore extends SpreadsheetStore {
35866
35865
  hideHelp() {
35867
35866
  this.autoComplete.hide();
35868
35867
  }
35869
- autoCompleteOrStop(direction) {
35868
+ autoCompleteOrStop(direction, assistantForcedClosed = false) {
35870
35869
  if (this.editionMode !== "inactive") {
35871
35870
  const autoComplete = this.autoComplete;
35872
- if (autoComplete.provider && autoComplete.selectedIndex !== undefined) {
35871
+ const suppressAutocomplete = assistantForcedClosed && this.canBeToggled;
35872
+ if (!suppressAutocomplete &&
35873
+ autoComplete.provider &&
35874
+ autoComplete.selectedIndex !== undefined) {
35873
35875
  const autoCompleteValue = autoComplete.provider.proposals[autoComplete.selectedIndex]?.text;
35874
35876
  if (autoCompleteValue) {
35875
35877
  this.autoComplete.provider?.selectProposal(autoCompleteValue);
@@ -51560,10 +51562,11 @@ class AbstractResizer extends Component {
51560
51562
  this.state.waitingForMove = false;
51561
51563
  }
51562
51564
  onMouseMove(ev) {
51563
- if (this.env.isMobile()) {
51564
- return;
51565
- }
51566
- if (this.state.isResizing || this.state.isMoving || this.state.isSelecting) {
51565
+ if (this.env.isMobile() ||
51566
+ this.env.model.getters.isReadonly() ||
51567
+ this.state.isResizing ||
51568
+ this.state.isMoving ||
51569
+ this.state.isSelecting) {
51567
51570
  return;
51568
51571
  }
51569
51572
  this._computeHandleDisplay(ev);
@@ -51630,6 +51633,10 @@ class AbstractResizer extends Component {
51630
51633
  if (index < 0) {
51631
51634
  return;
51632
51635
  }
51636
+ if (this.env.model.getters.isReadonly()) {
51637
+ this._selectElement(index, false);
51638
+ return;
51639
+ }
51633
51640
  if (this.state.waitingForMove) {
51634
51641
  if (!this.env.model.getters.isGridSelectionActive()) {
51635
51642
  this._selectElement(index, false);
@@ -52189,6 +52196,9 @@ class GridRenderer extends SpreadsheetStore {
52189
52196
  break;
52190
52197
  }
52191
52198
  }
52199
+ finalize() {
52200
+ this.zonesWithPreventedAnimationsInNextFrame = recomputeZones(this.zonesWithPreventedAnimationsInNextFrame);
52201
+ }
52192
52202
  get renderingLayers() {
52193
52203
  return ["Background", "Headers"];
52194
52204
  }
@@ -52988,7 +52998,7 @@ const friction = 0.95;
52988
52998
  const verticalScrollFactor = 1;
52989
52999
  const horizontalScrollFactor = 1;
52990
53000
  const resetTimeoutDuration = 100;
52991
- function useTouchScroll(ref, updateScroll, canMoveUp) {
53001
+ function useTouchScroll(ref, updateScroll, canMoveUp, canMoveDown) {
52992
53002
  let lastX = 0;
52993
53003
  let lastY = 0;
52994
53004
  let velocityX = 0;
@@ -53025,7 +53035,7 @@ function useTouchScroll(ref, updateScroll, canMoveUp) {
53025
53035
  lastX = clientX;
53026
53036
  lastY = clientY;
53027
53037
  lastTime = currentTime;
53028
- if (canMoveUp()) {
53038
+ if ((deltaY < 0 && canMoveUp()) || (deltaY > 0 && canMoveDown())) {
53029
53039
  if (event.cancelable) {
53030
53040
  event.preventDefault();
53031
53041
  }
@@ -59263,7 +59273,6 @@ function insertTokenAfterArgSeparator(tokenAtCursor, value) {
59263
59273
  // replace the whole token
59264
59274
  start = tokenAtCursor.start;
59265
59275
  }
59266
- this.composer.stopComposerRangeSelection();
59267
59276
  this.composer.changeComposerCursorSelection(start, end);
59268
59277
  this.composer.replaceComposerCursorSelection(value);
59269
59278
  }
@@ -59281,7 +59290,6 @@ function insertTokenAfterLeftParenthesis(tokenAtCursor, value) {
59281
59290
  // replace the whole token
59282
59291
  start = tokenAtCursor.start;
59283
59292
  }
59284
- this.composer.stopComposerRangeSelection();
59285
59293
  this.composer.changeComposerCursorSelection(start, end);
59286
59294
  this.composer.replaceComposerCursorSelection(value);
59287
59295
  }
@@ -60742,6 +60750,7 @@ class SidePanelStore extends SpreadsheetStore {
60742
60750
  getPanelProps(panelInfo) {
60743
60751
  const state = this.computeState(panelInfo);
60744
60752
  if (state.isOpen) {
60753
+ panelInfo.currentPanelProps = state.props ?? panelInfo.currentPanelProps;
60745
60754
  return state.props ?? {};
60746
60755
  }
60747
60756
  return {};
@@ -60753,11 +60762,11 @@ class SidePanelStore extends SpreadsheetStore {
60753
60762
  }
60754
60763
  return undefined;
60755
60764
  }
60756
- open(componentTag, initialPanelProps = {}) {
60765
+ open(componentTag, currentPanelProps = {}) {
60757
60766
  if (this.screenWidthStore.isSmall) {
60758
60767
  return;
60759
60768
  }
60760
- const newPanelInfo = { initialPanelProps, componentTag, size: DEFAULT_SIDE_PANEL_SIZE };
60769
+ const newPanelInfo = { currentPanelProps, componentTag, size: DEFAULT_SIDE_PANEL_SIZE };
60761
60770
  const state = this.computeState(newPanelInfo);
60762
60771
  if (!state.isOpen) {
60763
60772
  return;
@@ -60781,8 +60790,8 @@ class SidePanelStore extends SpreadsheetStore {
60781
60790
  }
60782
60791
  this._openPanel("secondaryPanel", newPanelInfo, state);
60783
60792
  }
60784
- replace(componentTag, currentPanelKey, initialPanelProps = {}) {
60785
- const newPanelInfo = { initialPanelProps, componentTag, size: DEFAULT_SIDE_PANEL_SIZE };
60793
+ replace(componentTag, currentPanelKey, currentPanelProps = {}) {
60794
+ const newPanelInfo = { currentPanelProps, componentTag, size: DEFAULT_SIDE_PANEL_SIZE };
60786
60795
  const state = this.computeState(newPanelInfo);
60787
60796
  if (!state.isOpen) {
60788
60797
  return;
@@ -60812,10 +60821,10 @@ class SidePanelStore extends SpreadsheetStore {
60812
60821
  _openPanel(panel, newPanel, state) {
60813
60822
  const currentPanel = this[panel];
60814
60823
  if (currentPanel && newPanel.componentTag !== currentPanel.componentTag) {
60815
- currentPanel.initialPanelProps?.onCloseSidePanel?.();
60824
+ currentPanel.currentPanelProps?.onCloseSidePanel?.();
60816
60825
  }
60817
60826
  this[panel] = {
60818
- initialPanelProps: state.props ?? {},
60827
+ currentPanelProps: state.props ?? {},
60819
60828
  componentTag: newPanel.componentTag,
60820
60829
  size: currentPanel?.size || DEFAULT_SIDE_PANEL_SIZE,
60821
60830
  isCollapsed: currentPanel?.isCollapsed || false,
@@ -60837,16 +60846,16 @@ class SidePanelStore extends SpreadsheetStore {
60837
60846
  close() {
60838
60847
  if (this.mainPanel?.isPinned) {
60839
60848
  if (this.secondaryPanel) {
60840
- this.secondaryPanel.initialPanelProps.onCloseSidePanel?.();
60849
+ this.secondaryPanel.currentPanelProps.onCloseSidePanel?.();
60841
60850
  this.secondaryPanel = undefined;
60842
60851
  }
60843
60852
  return;
60844
60853
  }
60845
- this.mainPanel?.initialPanelProps.onCloseSidePanel?.();
60854
+ this.mainPanel?.currentPanelProps.onCloseSidePanel?.();
60846
60855
  this.mainPanel = undefined;
60847
60856
  }
60848
60857
  closeMainPanel() {
60849
- this.mainPanel?.initialPanelProps.onCloseSidePanel?.();
60858
+ this.mainPanel?.currentPanelProps.onCloseSidePanel?.();
60850
60859
  this.mainPanel = this.secondaryPanel || undefined;
60851
60860
  this.secondaryPanel = undefined;
60852
60861
  }
@@ -60878,7 +60887,7 @@ class SidePanelStore extends SpreadsheetStore {
60878
60887
  }
60879
60888
  this.mainPanel.isPinned = !this.mainPanel.isPinned;
60880
60889
  if (!this.mainPanel.isPinned && this.secondaryPanel) {
60881
- this.secondaryPanel?.initialPanelProps.onCloseSidePanel?.();
60890
+ this.secondaryPanel?.currentPanelProps.onCloseSidePanel?.();
60882
60891
  this.mainPanel = this.secondaryPanel;
60883
60892
  this.secondaryPanel = undefined;
60884
60893
  }
@@ -60897,7 +60906,7 @@ class SidePanelStore extends SpreadsheetStore {
60897
60906
  panelInfo.size = COLLAPSED_SIDE_PANEL_SIZE;
60898
60907
  }
60899
60908
  }
60900
- computeState({ componentTag, initialPanelProps }) {
60909
+ computeState({ componentTag, currentPanelProps: initialPanelProps, }) {
60901
60910
  const customComputeState = sidePanelRegistry.get(componentTag).computeState;
60902
60911
  const state = customComputeState
60903
60912
  ? customComputeState(this.getters, initialPanelProps)
@@ -60907,7 +60916,7 @@ class SidePanelStore extends SpreadsheetStore {
60907
60916
  changeSpreadsheetWidth(width) {
60908
60917
  this.availableWidth = width - MIN_SHEET_VIEW_WIDTH;
60909
60918
  if (this.secondaryPanel && width - this.totalPanelSize < MIN_SHEET_VIEW_WIDTH) {
60910
- this.secondaryPanel?.initialPanelProps.onCloseSidePanel?.();
60919
+ this.secondaryPanel?.currentPanelProps.onCloseSidePanel?.();
60911
60920
  this.secondaryPanel = undefined;
60912
60921
  }
60913
60922
  if (this.mainPanel && width - this.totalPanelSize < MIN_SHEET_VIEW_WIDTH) {
@@ -61067,6 +61076,10 @@ class Grid extends Component {
61067
61076
  useTouchScroll(this.gridRef, this.moveCanvas.bind(this), () => {
61068
61077
  const { scrollY } = this.env.model.getters.getActiveSheetScrollInfo();
61069
61078
  return scrollY > 0;
61079
+ }, () => {
61080
+ const { maxOffsetY } = this.env.model.getters.getMaximumSheetOffset();
61081
+ const { scrollY } = this.env.model.getters.getActiveSheetScrollInfo();
61082
+ return scrollY < maxOffsetY;
61070
61083
  });
61071
61084
  }
61072
61085
  get highlights() {
@@ -62359,22 +62372,34 @@ class BordersPlugin extends CorePlugin {
62359
62372
  addBorder(sheetId, zone, newBorder, force = false) {
62360
62373
  const borders = [];
62361
62374
  const plannedBorder = newBorder ? { zone, style: newBorder } : undefined;
62362
- const sideToClear = {
62363
- left: force || !!newBorder?.left,
62364
- right: force || !!newBorder?.right,
62365
- top: force || !!newBorder?.top,
62366
- bottom: force || !!newBorder?.bottom,
62375
+ // For each side, decide if we must clear the border on the *adjacent*
62376
+ // existing cell when we draw on the opposite side of the new zone.
62377
+ //
62378
+ // Example:
62379
+ // - newBorder.right is set → we draw border on the RIGHT side of `zone`
62380
+ // - the cell on the right may already have a LEFT border on that edge
62381
+ // In that case we clear that LEFT border, so only the new RIGHT border
62382
+ // remains on the shared edge.
62383
+ //
62384
+ // existingBorderSideToClear[side] = true means we should clear the border on that
62385
+ // side of the existing adjacent zone before adding the new border.
62386
+ const existingBorderSideToClear = {
62387
+ left: force || !!newBorder?.right,
62388
+ right: force || !!newBorder?.left,
62389
+ top: force || !!newBorder?.bottom,
62390
+ bottom: force || !!newBorder?.top,
62367
62391
  };
62368
62392
  let editingZone = [zone];
62369
62393
  for (const existingBorder of this.borders[sheetId] ?? []) {
62370
62394
  const inter = intersection(existingBorder.zone, zone);
62371
62395
  if (!inter) {
62372
- // Clear adjacent borders on which you write
62396
+ // Check if the existing border is adjacent to the new zone
62373
62397
  const adjacentEdge = adjacent(existingBorder.zone, zone);
62374
- if (adjacentEdge && sideToClear[adjacentEdge.position]) {
62398
+ if (adjacentEdge && existingBorderSideToClear[adjacentEdge.position]) {
62375
62399
  for (const newZone of splitIfAdjacent(existingBorder.zone, zone)) {
62376
62400
  const border = this.computeBorderFromZone(newZone, existingBorder);
62377
62401
  const adjacentEdge = adjacent(newZone, zone);
62402
+ // Clear the existing border on the side that touches the new zone
62378
62403
  switch (adjacentEdge?.position) {
62379
62404
  case "left":
62380
62405
  border.style.left = undefined;
@@ -78668,6 +78693,7 @@ class SheetViewPlugin extends UIPlugin {
78668
78693
  "getFigureUI",
78669
78694
  "getPositionAnchorOffset",
78670
78695
  "getGridOffset",
78696
+ "getMaximumSheetOffset",
78671
78697
  ];
78672
78698
  viewports = {};
78673
78699
  /**
@@ -80486,6 +80512,7 @@ topbarMenuRegistry
80486
80512
  .add("file", {
80487
80513
  name: _t("File"),
80488
80514
  sequence: 10,
80515
+ isReadonlyAllowed: true,
80489
80516
  })
80490
80517
  .addChild("settings", ["file"], {
80491
80518
  name: _t("Settings"),
@@ -80500,6 +80527,7 @@ topbarMenuRegistry
80500
80527
  .add("edit", {
80501
80528
  name: _t("Edit"),
80502
80529
  sequence: 20,
80530
+ isReadonlyAllowed: true,
80503
80531
  })
80504
80532
  .addChild("undo", ["edit"], {
80505
80533
  ...undo,
@@ -80584,6 +80612,7 @@ topbarMenuRegistry
80584
80612
  .add("view", {
80585
80613
  name: _t("View"),
80586
80614
  sequence: 30,
80615
+ isReadonlyAllowed: true,
80587
80616
  })
80588
80617
  .addChild("unfreeze_panes", ["view"], {
80589
80618
  ...unFreezePane,
@@ -80675,6 +80704,7 @@ topbarMenuRegistry
80675
80704
  .add("insert", {
80676
80705
  name: _t("Insert"),
80677
80706
  sequence: 40,
80707
+ isReadonlyAllowed: true,
80678
80708
  })
80679
80709
  .addChild("insert_row", ["insert"], {
80680
80710
  ...insertRow,
@@ -80786,7 +80816,11 @@ topbarMenuRegistry
80786
80816
  // ---------------------------------------------------------------------
80787
80817
  // FORMAT MENU ITEMS
80788
80818
  // ---------------------------------------------------------------------
80789
- .add("format", { name: _t("Format"), sequence: 50 })
80819
+ .add("format", {
80820
+ name: _t("Format"),
80821
+ sequence: 50,
80822
+ isReadonlyAllowed: true,
80823
+ })
80790
80824
  .addChild("format_number", ["format"], {
80791
80825
  ...formatNumberMenuItemSpec,
80792
80826
  name: _t("Number"),
@@ -80878,6 +80912,7 @@ topbarMenuRegistry
80878
80912
  .add("data", {
80879
80913
  name: _t("Data"),
80880
80914
  sequence: 60,
80915
+ isReadonlyAllowed: true,
80881
80916
  })
80882
80917
  .addChild("sort_range", ["data"], {
80883
80918
  ...sortRange,
@@ -81970,6 +82005,10 @@ class SpreadsheetDashboard extends Component {
81970
82005
  useTouchScroll(this.gridRef, this.moveCanvas.bind(this), () => {
81971
82006
  const { scrollY } = this.env.model.getters.getActiveSheetScrollInfo();
81972
82007
  return scrollY > 0;
82008
+ }, () => {
82009
+ const { maxOffsetY } = this.env.model.getters.getMaximumSheetOffset();
82010
+ const { scrollY } = this.env.model.getters.getActiveSheetScrollInfo();
82011
+ return scrollY < maxOffsetY;
81973
82012
  });
81974
82013
  }
81975
82014
  get gridContainer() {
@@ -84014,7 +84053,7 @@ css /* scss */ `
84014
84053
  border-radius: 4px;
84015
84054
  font-weight: 500;
84016
84055
  font-size: 14px;
84017
- height: 32px;
84056
+ min-height: 32px;
84018
84057
  line-height: 16px;
84019
84058
  flex-grow: 1;
84020
84059
  background-color: ${BUTTON_BG};
@@ -88917,6 +88956,6 @@ const chartHelpers = { ...CHART_HELPERS, ...CHART_RUNTIME_HELPERS };
88917
88956
  export { AbstractCellClipboardHandler, AbstractChart, AbstractFigureClipboardHandler, CellErrorType, ClientDisconnectedError, CommandResult, CorePlugin, CoreViewPlugin, DispatchResult, EvaluationError, LocalTransportService, Model, PivotRuntimeDefinition, Registry, Revision, SPREADSHEET_DIMENSIONS, Spreadsheet, SpreadsheetPivotTable, UIPlugin, __info__, addFunction, addRenderingLayer, astToFormula, chartHelpers, compile, compileTokens, components, constants, convertAstNodes, coreTypes, findCellInNewZone, functionCache, getCaretDownSvg, getCaretUpSvg, helpers, hooks, invalidateCFEvaluationCommands, invalidateChartEvaluationCommands, invalidateDependenciesCommands, invalidateEvaluationCommands, iterateAstNodes, links, load, parse, parseTokens, readonlyAllowedCommands, registries, setDefaultSheetViewSize, setTranslationMethod, stores, tokenColors, tokenize };
88918
88957
 
88919
88958
 
88920
- __info__.version = "19.0.9";
88921
- __info__.date = "2025-11-03T12:32:15.473Z";
88922
- __info__.hash = "10359f4";
88959
+ __info__.version = "19.0.11";
88960
+ __info__.date = "2025-11-24T07:46:47.685Z";
88961
+ __info__.hash = "f5bdbcc";