@odoo/o-spreadsheet 18.0.80 → 18.0.81

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 18.0.80
6
- * @date 2026-08-29T09:13:05.057Z
7
- * @hash af324f5
5
+ * @version 18.0.81
6
+ * @date 2026-09-04T07:02:59.688Z
7
+ * @hash a952c0c
8
8
  */
9
9
 
10
10
  import { Component, markRaw, onMounted, onPatched, onWillPatch, onWillStart, onWillUnmount, onWillUpdateProps, status, toRaw, useChildSubEnv, useComponent, useEffect, useEnv, useExternalListener, useRef, useState, useSubEnv, xml } from "@odoo/owl";
@@ -31699,12 +31699,48 @@ var TopBarComponentRegistry = class extends Registry {
31699
31699
  const topbarComponentRegistry = new TopBarComponentRegistry();
31700
31700
 
31701
31701
  //#endregion
31702
- //#region src/components/side_panel/components/checkbox/checkbox.ts
31702
+ //#region src/components/icons/raw_svgs.ts
31703
+ /**
31704
+ * SVG markup used in `css` tagged templates as `data:image/svg+xml` URIs.
31705
+ *
31706
+ * Keep these values in a separate module so Rolldown references them instead
31707
+ * of inlining them into template literals. Inlining produces nested template
31708
+ * literals, which the downstream `rjsmin` minifier cannot parse correctly
31709
+ * because it relies on regular expressions.
31710
+ *
31711
+ * Do not inline these constants.
31712
+ */
31703
31713
  const CHECK_SVG = `
31704
31714
  <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'>
31705
31715
  <path fill='none' stroke='#FFF' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/>
31706
31716
  </svg>
31707
31717
  `;
31718
+ const CIRCLE_SVG = `
31719
+ <svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'>
31720
+ <circle r="2" fill="#FFF"/>
31721
+ </svg>
31722
+ `;
31723
+ const FX_SVG = `
31724
+ <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 121.8 122.9' width='16' height='16' focusable='false'>
31725
+ <path d='m28 34-4 5v2h10l-6 40c-4 22-6 28-7 30-2 2-3 3-5 3-3 0-7-2-9-4H4c-2 2-4 4-4 7s4 6 8 6 9-2 15-8c8-7 13-17 18-39l7-35 13-1 3-6H49c4-23 7-27 11-27 2 0 5 2 8 6h4c1-1 4-4 4-7 0-2-3-6-9-6-5 0-13 4-20 10-6 7-9 14-11 24h-8zm41 16c4-5 7-7 8-7s2 1 5 9l3 12c-7 11-12 17-16 17l-3-1-2-1c-3 0-6 3-6 7s3 7 7 7c6 0 12-6 22-23l3 10c3 9 6 13 10 13 5 0 11-4 18-15l-3-4c-4 6-7 8-8 8-2 0-4-3-6-10l-5-15 8-10 6-4 3 1 3 2c2 0 6-3 6-7s-2-7-6-7c-6 0-11 5-21 20l-2-6c-3-9-5-14-9-14-5 0-12 6-18 15l3 3z' fill='#BDBDBD'/>
31726
+ </svg>
31727
+ `;
31728
+ const TRANSPARENT_BACKGROUND_SVG = `
31729
+ <svg xmlns="http://www.w3.org/2000/svg" width="10" height="10">
31730
+ <path fill="#d9d9d9" d="M5 5h5v5H5zH0V0h5"/>
31731
+ </svg>
31732
+ `;
31733
+ const CURSOR_SVG = `
31734
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="14" height="16"><path d="M6.5.4c1.3-.8 2.9-.1 3.8 1.4l2.9 5.1c.2.4.9 1.6-.4 2.3l-1.6.9 1.8 3.1c.2.4.1 1-.2 1.2l-1.6 1c-.3.1-.9 0-1.1-.4l-1.8-3.1-1.6 1c-.6.4-1.7 0-2.2-.8L0 4.3"/><path fill="#fff" d="M9.1 2a1.4 1.1 60 0 0-1.7-.6L5.5 2.5l.9 1.6-1 .6-.9-1.6-.6.4 1.8 3.1-1.3.7-1.8-3.1-1 .6 3.8 6.6 6.8-3.98M3.9 8.8 10.82 5l.795 1.4-6.81 3.96"/></svg>
31735
+ `;
31736
+ const CARET_DOWN_SVG = `
31737
+ <svg xmlns='http://www.w3.org/2000/svg' width='7' height='4' viewBox='0 0 7 4'>
31738
+ <polygon fill='%23374151' points='3.5 4 7 0 0 0'/>
31739
+ </svg>
31740
+ `;
31741
+
31742
+ //#endregion
31743
+ //#region src/components/side_panel/components/checkbox/checkbox.ts
31708
31744
  const CHECKBOX_WIDTH = 14;
31709
31745
  css`
31710
31746
  label.o-checkbox {
@@ -32564,11 +32600,7 @@ css`
32564
32600
  border-radius: 8px;
32565
32601
 
32566
32602
  &:checked {
32567
- background: url("data:image/svg+xml,${encodeURIComponent(`
32568
- <svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'>
32569
- <circle r="2" fill="#FFF"/>
32570
- </svg>
32571
- `)}");
32603
+ background: url("data:image/svg+xml,${encodeURIComponent(CIRCLE_SVG)}");
32572
32604
  background-color: ${ACTION_COLOR};
32573
32605
  border-color: ${ACTION_COLOR};
32574
32606
  }
@@ -33168,11 +33200,7 @@ css`
33168
33200
  cursor: pointer;
33169
33201
  border: 1px solid ${GRAY_300};
33170
33202
  background-position: 1px 1px;
33171
- background-image: url("data:image/svg+xml,${encodeURIComponent(`
33172
- <svg xmlns="http://www.w3.org/2000/svg" width="10" height="10">
33173
- <path fill="#d9d9d9" d="M5 5h5v5H5zH0V0h5"/>
33174
- </svg>
33175
- `)}");
33203
+ background-image: url("data:image/svg+xml,${encodeURIComponent(TRANSPARENT_BACKGROUND_SVG)}");
33176
33204
  }
33177
33205
  `;
33178
33206
  var RoundColorPicker = class extends Component {
@@ -40042,7 +40070,13 @@ var PivotSpreadsheetSidePanel = class extends Component {
40042
40070
  }
40043
40071
  onSelectionChanged(ranges) {
40044
40072
  this.state.rangeHasChanged = true;
40045
- this.state.range = ranges[0];
40073
+ if (ranges.length === 0) {
40074
+ this.state.range = void 0;
40075
+ return;
40076
+ }
40077
+ const sheetId = this.env.model.getters.getActiveSheetId();
40078
+ const range = this.env.model.getters.getRangeFromSheetXC(sheetId, ranges[0]);
40079
+ this.state.range = this.env.model.getters.getRangeString(range, "forceSheetReference", { useBoundedReference: true });
40046
40080
  }
40047
40081
  onSelectionConfirmed() {
40048
40082
  if (this.state.range) {
@@ -43258,9 +43292,7 @@ var PaintFormatStore = class extends SpreadsheetStore {
43258
43292
  //#region src/components/grid_overlay/grid_overlay.ts
43259
43293
  css`
43260
43294
  .o-paint-format-cursor {
43261
- cursor: url("data:image/svg+xml,${encodeURIComponent(`
43262
- <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="14" height="16"><path d="M6.5.4c1.3-.8 2.9-.1 3.8 1.4l2.9 5.1c.2.4.9 1.6-.4 2.3l-1.6.9 1.8 3.1c.2.4.1 1-.2 1.2l-1.6 1c-.3.1-.9 0-1.1-.4l-1.8-3.1-1.6 1c-.6.4-1.7 0-2.2-.8L0 4.3"/><path fill="#fff" d="M9.1 2a1.4 1.1 60 0 0-1.7-.6L5.5 2.5l.9 1.6-1 .6-.9-1.6-.6.4 1.8 3.1-1.3.7-1.8-3.1-1 .6 3.8 6.6 6.8-3.98M3.9 8.8 10.82 5l.795 1.4-6.81 3.96"/></svg>
43263
- `)}"), auto;
43295
+ cursor: url("data:image/svg+xml,${encodeURIComponent(CURSOR_SVG)}"), auto;
43264
43296
  }
43265
43297
  `;
43266
43298
  function useCellHovered(env, gridRef, callback) {
@@ -51564,6 +51596,16 @@ var FormulaDependencyGraph = class {
51564
51596
  getCellsDependingOn(ranges, ignore) {
51565
51597
  const visited = this.createEmptyPositionSet();
51566
51598
  const queue = Array.from(ranges).reverse();
51599
+ const initialPositionsToRemove = this.createEmptyPositionSet();
51600
+ for (const range of ranges) {
51601
+ const zone = range.zone;
51602
+ const sheetId = range.sheetId;
51603
+ for (let col = zone.left; col <= zone.right; col++) for (let row = zone.top; row <= zone.bottom; row++) initialPositionsToRemove.add({
51604
+ sheetId,
51605
+ col,
51606
+ row
51607
+ });
51608
+ }
51567
51609
  while (queue.length > 0) {
51568
51610
  const range = queue.pop();
51569
51611
  const zone = range.zone;
@@ -51575,9 +51617,13 @@ var FormulaDependencyGraph = class {
51575
51617
  });
51576
51618
  const impactedPositions = this.rTree.search(range).map((dep) => dep.data);
51577
51619
  const nextInQueue = {};
51578
- for (const position of impactedPositions) if (!visited.has(position) && !ignore.has(position)) {
51579
- if (!nextInQueue[position.sheetId]) nextInQueue[position.sheetId] = [];
51580
- nextInQueue[position.sheetId].push(positionToZone(position));
51620
+ for (const position of impactedPositions) {
51621
+ if (ignore.has(position)) continue;
51622
+ initialPositionsToRemove.delete(position);
51623
+ if (!visited.has(position)) {
51624
+ if (!nextInQueue[position.sheetId]) nextInQueue[position.sheetId] = [];
51625
+ nextInQueue[position.sheetId].push(positionToZone(position));
51626
+ }
51581
51627
  }
51582
51628
  for (const sheetId in nextInQueue) {
51583
51629
  const zones = recomputeZones(nextInQueue[sheetId], []);
@@ -51587,15 +51633,7 @@ var FormulaDependencyGraph = class {
51587
51633
  })));
51588
51634
  }
51589
51635
  }
51590
- for (const range of ranges) {
51591
- const zone = range.zone;
51592
- const sheetId = range.sheetId;
51593
- for (let col = zone.left; col <= zone.right; col++) for (let row = zone.top; row <= zone.bottom; row++) visited.delete({
51594
- sheetId,
51595
- col,
51596
- row
51597
- });
51598
- }
51636
+ for (const position of initialPositionsToRemove) visited.delete(position);
51599
51637
  return visited;
51600
51638
  }
51601
51639
  };
@@ -58693,8 +58731,8 @@ var InternalViewport = class {
58693
58731
  const { end: lastRowEnd, size: lastRowSize } = this.getters.getRowDimensions(this.sheetId, lastRow);
58694
58732
  const leftColIndex = this.searchHeaderIndex("COL", lastColEnd - this.viewportWidth, 0);
58695
58733
  const leftColSize = this.getters.getColSize(this.sheetId, leftColIndex);
58696
- const leftRowIndex = this.searchHeaderIndex("ROW", lastRowEnd - this.viewportHeight, 0);
58697
- const topRowSize = this.getters.getRowSize(this.sheetId, leftRowIndex);
58734
+ const topRowIndex = this.searchHeaderIndex("ROW", lastRowEnd - this.viewportHeight, 0);
58735
+ const topRowSize = this.getters.getRowSize(this.sheetId, topRowIndex);
58698
58736
  let width = lastColEnd - this.offsetCorrectionX;
58699
58737
  if (this.canScrollHorizontally) {
58700
58738
  width += Math.max(96, Math.min(leftColSize, this.viewportWidth - lastColSize));
@@ -58872,7 +58910,11 @@ var InternalViewport = class {
58872
58910
  this.left = this.searchHeaderIndex("COL", this.offsetScrollbarX, this.boundaries.left);
58873
58911
  this.right = Math.min(this.boundaries.right, this.searchHeaderIndex("COL", this.viewportWidth, this.left));
58874
58912
  if (!this.viewportWidth) return;
58875
- if (this.left === -1) this.left = this.boundaries.left;
58913
+ if (this.left === -1) {
58914
+ const colsHeight = this.getters.getColRowOffset("COL", this.boundaries.left, this.boundaries.right);
58915
+ if (0 < colsHeight && colsHeight <= this.offsetScrollbarX) this.left = this.boundaries.right;
58916
+ else this.left = this.boundaries.left;
58917
+ }
58876
58918
  if (this.right === -1) this.right = this.boundaries.right;
58877
58919
  this.offsetX = this.getters.getColDimensions(sheetId, this.left).start - this.getters.getColDimensions(sheetId, this.boundaries.left).start;
58878
58920
  }
@@ -58883,7 +58925,11 @@ var InternalViewport = class {
58883
58925
  this.top = this.searchHeaderIndex("ROW", this.offsetScrollbarY, this.boundaries.top);
58884
58926
  this.bottom = Math.min(this.boundaries.bottom, this.searchHeaderIndex("ROW", this.viewportHeight, this.top));
58885
58927
  if (!this.viewportHeight) return;
58886
- if (this.top === -1) this.top = this.boundaries.top;
58928
+ if (this.top === -1) {
58929
+ const rowsHeight = this.getters.getColRowOffset("ROW", this.boundaries.top, this.boundaries.bottom);
58930
+ if (0 < rowsHeight && rowsHeight <= this.offsetScrollbarY) this.top = this.boundaries.bottom;
58931
+ else this.top = this.boundaries.top;
58932
+ }
58887
58933
  if (this.bottom === -1) this.bottom = this.boundaries.bottom;
58888
58934
  this.offsetY = this.getters.getRowDimensions(sheetId, this.top).start - this.getters.getRowDimensions(sheetId, this.boundaries.top).start;
58889
58935
  }
@@ -61509,11 +61555,7 @@ css`
61509
61555
  /* In readonly we always show the fx icon if the composer is empty, not matter the focus */
61510
61556
  .o-composer:empty:not(:focus):not(.active)::before,
61511
61557
  &.o-topbar-composer-readonly .o-composer:empty::before {
61512
- content: url("data:image/svg+xml,${encodeURIComponent(`
61513
- <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 121.8 122.9' width='16' height='16' focusable='false'>
61514
- <path d='m28 34-4 5v2h10l-6 40c-4 22-6 28-7 30-2 2-3 3-5 3-3 0-7-2-9-4H4c-2 2-4 4-4 7s4 6 8 6 9-2 15-8c8-7 13-17 18-39l7-35 13-1 3-6H49c4-23 7-27 11-27 2 0 5 2 8 6h4c1-1 4-4 4-7 0-2-3-6-9-6-5 0-13 4-20 10-6 7-9 14-11 24h-8zm41 16c4-5 7-7 8-7s2 1 5 9l3 12c-7 11-12 17-16 17l-3-1-2-1c-3 0-6 3-6 7s3 7 7 7c6 0 12-6 22-23l3 10c3 9 6 13 10 13 5 0 11-4 18-15l-3-4c-4 6-7 8-8 8-2 0-4-3-6-10l-5-15 8-10 6-4 3 1 3 2c2 0 6-3 6-7s-2-7-6-7c-6 0-11 5-21 20l-2-6c-3-9-5-14-9-14-5 0-12 6-18 15l3 3z' fill='#BDBDBD'/>
61515
- </svg>
61516
- `)}");
61558
+ content: url("data:image/svg+xml,${encodeURIComponent(FX_SVG)}");
61517
61559
  position: relative;
61518
61560
  top: 20%;
61519
61561
  }
@@ -62105,11 +62147,7 @@ css`
62105
62147
  appearance: none;
62106
62148
  -webkit-appearance: none;
62107
62149
  -moz-appearance: none;
62108
- background: transparent url("data:image/svg+xml,${encodeURIComponent(`
62109
- <svg xmlns='http://www.w3.org/2000/svg' width='7' height='4' viewBox='0 0 7 4'>
62110
- <polygon fill='%23374151' points='3.5 4 7 0 0 0'/>
62111
- </svg>
62112
- `)}")
62150
+ background: transparent url("data:image/svg+xml,${encodeURIComponent(CARET_DOWN_SVG)}")
62113
62151
  no-repeat right center;
62114
62152
  text-overflow: ellipsis;
62115
62153
 
@@ -66412,6 +66450,6 @@ const constants = {
66412
66450
  //#endregion
66413
66451
  export { AbstractCellClipboardHandler, AbstractChart, AbstractFigureClipboardHandler, CellErrorType, CommandResult, CorePlugin, DispatchResult, EvaluationError, Model, PivotRuntimeDefinition, Registry, Revision, SPREADSHEET_DIMENSIONS, Spreadsheet, SpreadsheetPivotTable, UIPlugin, __info__, addFunction, addRenderingLayer, astToFormula, compile, compileTokens, components, constants, convertAstNodes, coreTypes, findCellInNewZone, functionCache, helpers, hooks, invalidateCFEvaluationCommands, invalidateDependenciesCommands, invalidateEvaluationCommands, iterateAstNodes, links, load, parse, parseTokens, readonlyAllowedCommands, registries, setDefaultSheetViewSize, setTranslationMethod, stores, tokenColors, tokenize };
66414
66452
 
66415
- __info__.version = "18.0.80";
66416
- __info__.date = "2026-08-29T09:13:05.057Z";
66417
- __info__.hash = "af324f5";
66453
+ __info__.version = "18.0.81";
66454
+ __info__.date = "2026-09-04T07:02:59.688Z";
66455
+ __info__.hash = "a952c0c";
@@ -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 18.0.80
6
- * @date 2026-08-29T09:13:05.057Z
7
- * @hash af324f5
5
+ * @version 18.0.81
6
+ * @date 2026-09-04T07:02:59.688Z
7
+ * @hash a952c0c
8
8
  */
9
9
 
10
10
  (function(exports, _odoo_owl) {
@@ -31701,12 +31701,48 @@ stores.inject(MyMetaStore, storeInstance);
31701
31701
  const topbarComponentRegistry = new TopBarComponentRegistry();
31702
31702
 
31703
31703
  //#endregion
31704
- //#region src/components/side_panel/components/checkbox/checkbox.ts
31704
+ //#region src/components/icons/raw_svgs.ts
31705
+ /**
31706
+ * SVG markup used in `css` tagged templates as `data:image/svg+xml` URIs.
31707
+ *
31708
+ * Keep these values in a separate module so Rolldown references them instead
31709
+ * of inlining them into template literals. Inlining produces nested template
31710
+ * literals, which the downstream `rjsmin` minifier cannot parse correctly
31711
+ * because it relies on regular expressions.
31712
+ *
31713
+ * Do not inline these constants.
31714
+ */
31705
31715
  const CHECK_SVG = `
31706
31716
  <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'>
31707
31717
  <path fill='none' stroke='#FFF' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/>
31708
31718
  </svg>
31709
31719
  `;
31720
+ const CIRCLE_SVG = `
31721
+ <svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'>
31722
+ <circle r="2" fill="#FFF"/>
31723
+ </svg>
31724
+ `;
31725
+ const FX_SVG = `
31726
+ <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 121.8 122.9' width='16' height='16' focusable='false'>
31727
+ <path d='m28 34-4 5v2h10l-6 40c-4 22-6 28-7 30-2 2-3 3-5 3-3 0-7-2-9-4H4c-2 2-4 4-4 7s4 6 8 6 9-2 15-8c8-7 13-17 18-39l7-35 13-1 3-6H49c4-23 7-27 11-27 2 0 5 2 8 6h4c1-1 4-4 4-7 0-2-3-6-9-6-5 0-13 4-20 10-6 7-9 14-11 24h-8zm41 16c4-5 7-7 8-7s2 1 5 9l3 12c-7 11-12 17-16 17l-3-1-2-1c-3 0-6 3-6 7s3 7 7 7c6 0 12-6 22-23l3 10c3 9 6 13 10 13 5 0 11-4 18-15l-3-4c-4 6-7 8-8 8-2 0-4-3-6-10l-5-15 8-10 6-4 3 1 3 2c2 0 6-3 6-7s-2-7-6-7c-6 0-11 5-21 20l-2-6c-3-9-5-14-9-14-5 0-12 6-18 15l3 3z' fill='#BDBDBD'/>
31728
+ </svg>
31729
+ `;
31730
+ const TRANSPARENT_BACKGROUND_SVG = `
31731
+ <svg xmlns="http://www.w3.org/2000/svg" width="10" height="10">
31732
+ <path fill="#d9d9d9" d="M5 5h5v5H5zH0V0h5"/>
31733
+ </svg>
31734
+ `;
31735
+ const CURSOR_SVG = `
31736
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="14" height="16"><path d="M6.5.4c1.3-.8 2.9-.1 3.8 1.4l2.9 5.1c.2.4.9 1.6-.4 2.3l-1.6.9 1.8 3.1c.2.4.1 1-.2 1.2l-1.6 1c-.3.1-.9 0-1.1-.4l-1.8-3.1-1.6 1c-.6.4-1.7 0-2.2-.8L0 4.3"/><path fill="#fff" d="M9.1 2a1.4 1.1 60 0 0-1.7-.6L5.5 2.5l.9 1.6-1 .6-.9-1.6-.6.4 1.8 3.1-1.3.7-1.8-3.1-1 .6 3.8 6.6 6.8-3.98M3.9 8.8 10.82 5l.795 1.4-6.81 3.96"/></svg>
31737
+ `;
31738
+ const CARET_DOWN_SVG = `
31739
+ <svg xmlns='http://www.w3.org/2000/svg' width='7' height='4' viewBox='0 0 7 4'>
31740
+ <polygon fill='%23374151' points='3.5 4 7 0 0 0'/>
31741
+ </svg>
31742
+ `;
31743
+
31744
+ //#endregion
31745
+ //#region src/components/side_panel/components/checkbox/checkbox.ts
31710
31746
  const CHECKBOX_WIDTH = 14;
31711
31747
  css`
31712
31748
  label.o-checkbox {
@@ -32566,11 +32602,7 @@ stores.inject(MyMetaStore, storeInstance);
32566
32602
  border-radius: 8px;
32567
32603
 
32568
32604
  &:checked {
32569
- background: url("data:image/svg+xml,${encodeURIComponent(`
32570
- <svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'>
32571
- <circle r="2" fill="#FFF"/>
32572
- </svg>
32573
- `)}");
32605
+ background: url("data:image/svg+xml,${encodeURIComponent(CIRCLE_SVG)}");
32574
32606
  background-color: ${ACTION_COLOR};
32575
32607
  border-color: ${ACTION_COLOR};
32576
32608
  }
@@ -33170,11 +33202,7 @@ stores.inject(MyMetaStore, storeInstance);
33170
33202
  cursor: pointer;
33171
33203
  border: 1px solid ${GRAY_300};
33172
33204
  background-position: 1px 1px;
33173
- background-image: url("data:image/svg+xml,${encodeURIComponent(`
33174
- <svg xmlns="http://www.w3.org/2000/svg" width="10" height="10">
33175
- <path fill="#d9d9d9" d="M5 5h5v5H5zH0V0h5"/>
33176
- </svg>
33177
- `)}");
33205
+ background-image: url("data:image/svg+xml,${encodeURIComponent(TRANSPARENT_BACKGROUND_SVG)}");
33178
33206
  }
33179
33207
  `;
33180
33208
  var RoundColorPicker = class extends _odoo_owl.Component {
@@ -40044,7 +40072,13 @@ stores.inject(MyMetaStore, storeInstance);
40044
40072
  }
40045
40073
  onSelectionChanged(ranges) {
40046
40074
  this.state.rangeHasChanged = true;
40047
- this.state.range = ranges[0];
40075
+ if (ranges.length === 0) {
40076
+ this.state.range = void 0;
40077
+ return;
40078
+ }
40079
+ const sheetId = this.env.model.getters.getActiveSheetId();
40080
+ const range = this.env.model.getters.getRangeFromSheetXC(sheetId, ranges[0]);
40081
+ this.state.range = this.env.model.getters.getRangeString(range, "forceSheetReference", { useBoundedReference: true });
40048
40082
  }
40049
40083
  onSelectionConfirmed() {
40050
40084
  if (this.state.range) {
@@ -43260,9 +43294,7 @@ stores.inject(MyMetaStore, storeInstance);
43260
43294
  //#region src/components/grid_overlay/grid_overlay.ts
43261
43295
  css`
43262
43296
  .o-paint-format-cursor {
43263
- cursor: url("data:image/svg+xml,${encodeURIComponent(`
43264
- <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="14" height="16"><path d="M6.5.4c1.3-.8 2.9-.1 3.8 1.4l2.9 5.1c.2.4.9 1.6-.4 2.3l-1.6.9 1.8 3.1c.2.4.1 1-.2 1.2l-1.6 1c-.3.1-.9 0-1.1-.4l-1.8-3.1-1.6 1c-.6.4-1.7 0-2.2-.8L0 4.3"/><path fill="#fff" d="M9.1 2a1.4 1.1 60 0 0-1.7-.6L5.5 2.5l.9 1.6-1 .6-.9-1.6-.6.4 1.8 3.1-1.3.7-1.8-3.1-1 .6 3.8 6.6 6.8-3.98M3.9 8.8 10.82 5l.795 1.4-6.81 3.96"/></svg>
43265
- `)}"), auto;
43297
+ cursor: url("data:image/svg+xml,${encodeURIComponent(CURSOR_SVG)}"), auto;
43266
43298
  }
43267
43299
  `;
43268
43300
  function useCellHovered(env, gridRef, callback) {
@@ -51566,6 +51598,16 @@ stores.inject(MyMetaStore, storeInstance);
51566
51598
  getCellsDependingOn(ranges, ignore) {
51567
51599
  const visited = this.createEmptyPositionSet();
51568
51600
  const queue = Array.from(ranges).reverse();
51601
+ const initialPositionsToRemove = this.createEmptyPositionSet();
51602
+ for (const range of ranges) {
51603
+ const zone = range.zone;
51604
+ const sheetId = range.sheetId;
51605
+ for (let col = zone.left; col <= zone.right; col++) for (let row = zone.top; row <= zone.bottom; row++) initialPositionsToRemove.add({
51606
+ sheetId,
51607
+ col,
51608
+ row
51609
+ });
51610
+ }
51569
51611
  while (queue.length > 0) {
51570
51612
  const range = queue.pop();
51571
51613
  const zone = range.zone;
@@ -51577,9 +51619,13 @@ stores.inject(MyMetaStore, storeInstance);
51577
51619
  });
51578
51620
  const impactedPositions = this.rTree.search(range).map((dep) => dep.data);
51579
51621
  const nextInQueue = {};
51580
- for (const position of impactedPositions) if (!visited.has(position) && !ignore.has(position)) {
51581
- if (!nextInQueue[position.sheetId]) nextInQueue[position.sheetId] = [];
51582
- nextInQueue[position.sheetId].push(positionToZone(position));
51622
+ for (const position of impactedPositions) {
51623
+ if (ignore.has(position)) continue;
51624
+ initialPositionsToRemove.delete(position);
51625
+ if (!visited.has(position)) {
51626
+ if (!nextInQueue[position.sheetId]) nextInQueue[position.sheetId] = [];
51627
+ nextInQueue[position.sheetId].push(positionToZone(position));
51628
+ }
51583
51629
  }
51584
51630
  for (const sheetId in nextInQueue) {
51585
51631
  const zones = recomputeZones(nextInQueue[sheetId], []);
@@ -51589,15 +51635,7 @@ stores.inject(MyMetaStore, storeInstance);
51589
51635
  })));
51590
51636
  }
51591
51637
  }
51592
- for (const range of ranges) {
51593
- const zone = range.zone;
51594
- const sheetId = range.sheetId;
51595
- for (let col = zone.left; col <= zone.right; col++) for (let row = zone.top; row <= zone.bottom; row++) visited.delete({
51596
- sheetId,
51597
- col,
51598
- row
51599
- });
51600
- }
51638
+ for (const position of initialPositionsToRemove) visited.delete(position);
51601
51639
  return visited;
51602
51640
  }
51603
51641
  };
@@ -58695,8 +58733,8 @@ stores.inject(MyMetaStore, storeInstance);
58695
58733
  const { end: lastRowEnd, size: lastRowSize } = this.getters.getRowDimensions(this.sheetId, lastRow);
58696
58734
  const leftColIndex = this.searchHeaderIndex("COL", lastColEnd - this.viewportWidth, 0);
58697
58735
  const leftColSize = this.getters.getColSize(this.sheetId, leftColIndex);
58698
- const leftRowIndex = this.searchHeaderIndex("ROW", lastRowEnd - this.viewportHeight, 0);
58699
- const topRowSize = this.getters.getRowSize(this.sheetId, leftRowIndex);
58736
+ const topRowIndex = this.searchHeaderIndex("ROW", lastRowEnd - this.viewportHeight, 0);
58737
+ const topRowSize = this.getters.getRowSize(this.sheetId, topRowIndex);
58700
58738
  let width = lastColEnd - this.offsetCorrectionX;
58701
58739
  if (this.canScrollHorizontally) {
58702
58740
  width += Math.max(96, Math.min(leftColSize, this.viewportWidth - lastColSize));
@@ -58874,7 +58912,11 @@ stores.inject(MyMetaStore, storeInstance);
58874
58912
  this.left = this.searchHeaderIndex("COL", this.offsetScrollbarX, this.boundaries.left);
58875
58913
  this.right = Math.min(this.boundaries.right, this.searchHeaderIndex("COL", this.viewportWidth, this.left));
58876
58914
  if (!this.viewportWidth) return;
58877
- if (this.left === -1) this.left = this.boundaries.left;
58915
+ if (this.left === -1) {
58916
+ const colsHeight = this.getters.getColRowOffset("COL", this.boundaries.left, this.boundaries.right);
58917
+ if (0 < colsHeight && colsHeight <= this.offsetScrollbarX) this.left = this.boundaries.right;
58918
+ else this.left = this.boundaries.left;
58919
+ }
58878
58920
  if (this.right === -1) this.right = this.boundaries.right;
58879
58921
  this.offsetX = this.getters.getColDimensions(sheetId, this.left).start - this.getters.getColDimensions(sheetId, this.boundaries.left).start;
58880
58922
  }
@@ -58885,7 +58927,11 @@ stores.inject(MyMetaStore, storeInstance);
58885
58927
  this.top = this.searchHeaderIndex("ROW", this.offsetScrollbarY, this.boundaries.top);
58886
58928
  this.bottom = Math.min(this.boundaries.bottom, this.searchHeaderIndex("ROW", this.viewportHeight, this.top));
58887
58929
  if (!this.viewportHeight) return;
58888
- if (this.top === -1) this.top = this.boundaries.top;
58930
+ if (this.top === -1) {
58931
+ const rowsHeight = this.getters.getColRowOffset("ROW", this.boundaries.top, this.boundaries.bottom);
58932
+ if (0 < rowsHeight && rowsHeight <= this.offsetScrollbarY) this.top = this.boundaries.bottom;
58933
+ else this.top = this.boundaries.top;
58934
+ }
58889
58935
  if (this.bottom === -1) this.bottom = this.boundaries.bottom;
58890
58936
  this.offsetY = this.getters.getRowDimensions(sheetId, this.top).start - this.getters.getRowDimensions(sheetId, this.boundaries.top).start;
58891
58937
  }
@@ -61511,11 +61557,7 @@ stores.inject(MyMetaStore, storeInstance);
61511
61557
  /* In readonly we always show the fx icon if the composer is empty, not matter the focus */
61512
61558
  .o-composer:empty:not(:focus):not(.active)::before,
61513
61559
  &.o-topbar-composer-readonly .o-composer:empty::before {
61514
- content: url("data:image/svg+xml,${encodeURIComponent(`
61515
- <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 121.8 122.9' width='16' height='16' focusable='false'>
61516
- <path d='m28 34-4 5v2h10l-6 40c-4 22-6 28-7 30-2 2-3 3-5 3-3 0-7-2-9-4H4c-2 2-4 4-4 7s4 6 8 6 9-2 15-8c8-7 13-17 18-39l7-35 13-1 3-6H49c4-23 7-27 11-27 2 0 5 2 8 6h4c1-1 4-4 4-7 0-2-3-6-9-6-5 0-13 4-20 10-6 7-9 14-11 24h-8zm41 16c4-5 7-7 8-7s2 1 5 9l3 12c-7 11-12 17-16 17l-3-1-2-1c-3 0-6 3-6 7s3 7 7 7c6 0 12-6 22-23l3 10c3 9 6 13 10 13 5 0 11-4 18-15l-3-4c-4 6-7 8-8 8-2 0-4-3-6-10l-5-15 8-10 6-4 3 1 3 2c2 0 6-3 6-7s-2-7-6-7c-6 0-11 5-21 20l-2-6c-3-9-5-14-9-14-5 0-12 6-18 15l3 3z' fill='#BDBDBD'/>
61517
- </svg>
61518
- `)}");
61560
+ content: url("data:image/svg+xml,${encodeURIComponent(FX_SVG)}");
61519
61561
  position: relative;
61520
61562
  top: 20%;
61521
61563
  }
@@ -62107,11 +62149,7 @@ stores.inject(MyMetaStore, storeInstance);
62107
62149
  appearance: none;
62108
62150
  -webkit-appearance: none;
62109
62151
  -moz-appearance: none;
62110
- background: transparent url("data:image/svg+xml,${encodeURIComponent(`
62111
- <svg xmlns='http://www.w3.org/2000/svg' width='7' height='4' viewBox='0 0 7 4'>
62112
- <polygon fill='%23374151' points='3.5 4 7 0 0 0'/>
62113
- </svg>
62114
- `)}")
62152
+ background: transparent url("data:image/svg+xml,${encodeURIComponent(CARET_DOWN_SVG)}")
62115
62153
  no-repeat right center;
62116
62154
  text-overflow: ellipsis;
62117
62155
 
@@ -66458,8 +66496,8 @@ exports.stores = stores;
66458
66496
  exports.tokenColors = tokenColors;
66459
66497
  exports.tokenize = tokenize;
66460
66498
 
66461
- __info__.version = "18.0.80";
66462
- __info__.date = "2026-08-29T09:13:05.057Z";
66463
- __info__.hash = "af324f5";
66499
+ __info__.version = "18.0.81";
66500
+ __info__.date = "2026-09-04T07:02:59.688Z";
66501
+ __info__.hash = "a952c0c";
66464
66502
 
66465
66503
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);