@odoo/o-spreadsheet 18.0.79 → 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.79
6
- * @date 2026-08-21T15:27:46.928Z
7
- * @hash 173a29c
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,14 +32600,16 @@ 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
  }
32607
+
32608
+ &:focus {
32609
+ outline: none;
32610
+ box-shadow: 0 0 0 0.25rem rgba(113, 75, 103, 0.25);
32611
+ border-color: ${ACTION_COLOR};
32612
+ }
32575
32613
  }
32576
32614
  }
32577
32615
  `;
@@ -33162,11 +33200,7 @@ css`
33162
33200
  cursor: pointer;
33163
33201
  border: 1px solid ${GRAY_300};
33164
33202
  background-position: 1px 1px;
33165
- background-image: url("data:image/svg+xml,${encodeURIComponent(`
33166
- <svg xmlns="http://www.w3.org/2000/svg" width="10" height="10">
33167
- <path fill="#d9d9d9" d="M5 5h5v5H5zH0V0h5"/>
33168
- </svg>
33169
- `)}");
33203
+ background-image: url("data:image/svg+xml,${encodeURIComponent(TRANSPARENT_BACKGROUND_SVG)}");
33170
33204
  }
33171
33205
  `;
33172
33206
  var RoundColorPicker = class extends Component {
@@ -40036,7 +40070,13 @@ var PivotSpreadsheetSidePanel = class extends Component {
40036
40070
  }
40037
40071
  onSelectionChanged(ranges) {
40038
40072
  this.state.rangeHasChanged = true;
40039
- 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 });
40040
40080
  }
40041
40081
  onSelectionConfirmed() {
40042
40082
  if (this.state.range) {
@@ -43252,9 +43292,7 @@ var PaintFormatStore = class extends SpreadsheetStore {
43252
43292
  //#region src/components/grid_overlay/grid_overlay.ts
43253
43293
  css`
43254
43294
  .o-paint-format-cursor {
43255
- cursor: url("data:image/svg+xml,${encodeURIComponent(`
43256
- <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>
43257
- `)}"), auto;
43295
+ cursor: url("data:image/svg+xml,${encodeURIComponent(CURSOR_SVG)}"), auto;
43258
43296
  }
43259
43297
  `;
43260
43298
  function useCellHovered(env, gridRef, callback) {
@@ -51558,6 +51596,16 @@ var FormulaDependencyGraph = class {
51558
51596
  getCellsDependingOn(ranges, ignore) {
51559
51597
  const visited = this.createEmptyPositionSet();
51560
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
+ }
51561
51609
  while (queue.length > 0) {
51562
51610
  const range = queue.pop();
51563
51611
  const zone = range.zone;
@@ -51569,9 +51617,13 @@ var FormulaDependencyGraph = class {
51569
51617
  });
51570
51618
  const impactedPositions = this.rTree.search(range).map((dep) => dep.data);
51571
51619
  const nextInQueue = {};
51572
- for (const position of impactedPositions) if (!visited.has(position) && !ignore.has(position)) {
51573
- if (!nextInQueue[position.sheetId]) nextInQueue[position.sheetId] = [];
51574
- 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
+ }
51575
51627
  }
51576
51628
  for (const sheetId in nextInQueue) {
51577
51629
  const zones = recomputeZones(nextInQueue[sheetId], []);
@@ -51581,15 +51633,7 @@ var FormulaDependencyGraph = class {
51581
51633
  })));
51582
51634
  }
51583
51635
  }
51584
- for (const range of ranges) {
51585
- const zone = range.zone;
51586
- const sheetId = range.sheetId;
51587
- for (let col = zone.left; col <= zone.right; col++) for (let row = zone.top; row <= zone.bottom; row++) visited.delete({
51588
- sheetId,
51589
- col,
51590
- row
51591
- });
51592
- }
51636
+ for (const position of initialPositionsToRemove) visited.delete(position);
51593
51637
  return visited;
51594
51638
  }
51595
51639
  };
@@ -58687,8 +58731,8 @@ var InternalViewport = class {
58687
58731
  const { end: lastRowEnd, size: lastRowSize } = this.getters.getRowDimensions(this.sheetId, lastRow);
58688
58732
  const leftColIndex = this.searchHeaderIndex("COL", lastColEnd - this.viewportWidth, 0);
58689
58733
  const leftColSize = this.getters.getColSize(this.sheetId, leftColIndex);
58690
- const leftRowIndex = this.searchHeaderIndex("ROW", lastRowEnd - this.viewportHeight, 0);
58691
- 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);
58692
58736
  let width = lastColEnd - this.offsetCorrectionX;
58693
58737
  if (this.canScrollHorizontally) {
58694
58738
  width += Math.max(96, Math.min(leftColSize, this.viewportWidth - lastColSize));
@@ -58866,7 +58910,11 @@ var InternalViewport = class {
58866
58910
  this.left = this.searchHeaderIndex("COL", this.offsetScrollbarX, this.boundaries.left);
58867
58911
  this.right = Math.min(this.boundaries.right, this.searchHeaderIndex("COL", this.viewportWidth, this.left));
58868
58912
  if (!this.viewportWidth) return;
58869
- 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
+ }
58870
58918
  if (this.right === -1) this.right = this.boundaries.right;
58871
58919
  this.offsetX = this.getters.getColDimensions(sheetId, this.left).start - this.getters.getColDimensions(sheetId, this.boundaries.left).start;
58872
58920
  }
@@ -58877,7 +58925,11 @@ var InternalViewport = class {
58877
58925
  this.top = this.searchHeaderIndex("ROW", this.offsetScrollbarY, this.boundaries.top);
58878
58926
  this.bottom = Math.min(this.boundaries.bottom, this.searchHeaderIndex("ROW", this.viewportHeight, this.top));
58879
58927
  if (!this.viewportHeight) return;
58880
- 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
+ }
58881
58933
  if (this.bottom === -1) this.bottom = this.boundaries.bottom;
58882
58934
  this.offsetY = this.getters.getRowDimensions(sheetId, this.top).start - this.getters.getRowDimensions(sheetId, this.boundaries.top).start;
58883
58935
  }
@@ -60665,6 +60717,9 @@ css`
60665
60717
  position: absolute;
60666
60718
  cursor: pointer;
60667
60719
  }
60720
+ .o-grid.o-dashboard-grid {
60721
+ background: #ffffff;
60722
+ }
60668
60723
  `;
60669
60724
  var SpreadsheetDashboard = class extends Component {
60670
60725
  static template = "o-spreadsheet-SpreadsheetDashboard";
@@ -61500,11 +61555,7 @@ css`
61500
61555
  /* In readonly we always show the fx icon if the composer is empty, not matter the focus */
61501
61556
  .o-composer:empty:not(:focus):not(.active)::before,
61502
61557
  &.o-topbar-composer-readonly .o-composer:empty::before {
61503
- content: url("data:image/svg+xml,${encodeURIComponent(`
61504
- <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 121.8 122.9' width='16' height='16' focusable='false'>
61505
- <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'/>
61506
- </svg>
61507
- `)}");
61558
+ content: url("data:image/svg+xml,${encodeURIComponent(FX_SVG)}");
61508
61559
  position: relative;
61509
61560
  top: 20%;
61510
61561
  }
@@ -62096,11 +62147,7 @@ css`
62096
62147
  appearance: none;
62097
62148
  -webkit-appearance: none;
62098
62149
  -moz-appearance: none;
62099
- background: transparent url("data:image/svg+xml,${encodeURIComponent(`
62100
- <svg xmlns='http://www.w3.org/2000/svg' width='7' height='4' viewBox='0 0 7 4'>
62101
- <polygon fill='%23374151' points='3.5 4 7 0 0 0'/>
62102
- </svg>
62103
- `)}")
62150
+ background: transparent url("data:image/svg+xml,${encodeURIComponent(CARET_DOWN_SVG)}")
62104
62151
  no-repeat right center;
62105
62152
  text-overflow: ellipsis;
62106
62153
 
@@ -66403,6 +66450,6 @@ const constants = {
66403
66450
  //#endregion
66404
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 };
66405
66452
 
66406
- __info__.version = "18.0.79";
66407
- __info__.date = "2026-08-21T15:27:46.928Z";
66408
- __info__.hash = "173a29c";
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.79
6
- * @date 2026-08-21T15:27:46.928Z
7
- * @hash 173a29c
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,14 +32602,16 @@ 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
  }
32609
+
32610
+ &:focus {
32611
+ outline: none;
32612
+ box-shadow: 0 0 0 0.25rem rgba(113, 75, 103, 0.25);
32613
+ border-color: ${ACTION_COLOR};
32614
+ }
32577
32615
  }
32578
32616
  }
32579
32617
  `;
@@ -33164,11 +33202,7 @@ stores.inject(MyMetaStore, storeInstance);
33164
33202
  cursor: pointer;
33165
33203
  border: 1px solid ${GRAY_300};
33166
33204
  background-position: 1px 1px;
33167
- background-image: url("data:image/svg+xml,${encodeURIComponent(`
33168
- <svg xmlns="http://www.w3.org/2000/svg" width="10" height="10">
33169
- <path fill="#d9d9d9" d="M5 5h5v5H5zH0V0h5"/>
33170
- </svg>
33171
- `)}");
33205
+ background-image: url("data:image/svg+xml,${encodeURIComponent(TRANSPARENT_BACKGROUND_SVG)}");
33172
33206
  }
33173
33207
  `;
33174
33208
  var RoundColorPicker = class extends _odoo_owl.Component {
@@ -40038,7 +40072,13 @@ stores.inject(MyMetaStore, storeInstance);
40038
40072
  }
40039
40073
  onSelectionChanged(ranges) {
40040
40074
  this.state.rangeHasChanged = true;
40041
- 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 });
40042
40082
  }
40043
40083
  onSelectionConfirmed() {
40044
40084
  if (this.state.range) {
@@ -43254,9 +43294,7 @@ stores.inject(MyMetaStore, storeInstance);
43254
43294
  //#region src/components/grid_overlay/grid_overlay.ts
43255
43295
  css`
43256
43296
  .o-paint-format-cursor {
43257
- cursor: url("data:image/svg+xml,${encodeURIComponent(`
43258
- <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>
43259
- `)}"), auto;
43297
+ cursor: url("data:image/svg+xml,${encodeURIComponent(CURSOR_SVG)}"), auto;
43260
43298
  }
43261
43299
  `;
43262
43300
  function useCellHovered(env, gridRef, callback) {
@@ -51560,6 +51598,16 @@ stores.inject(MyMetaStore, storeInstance);
51560
51598
  getCellsDependingOn(ranges, ignore) {
51561
51599
  const visited = this.createEmptyPositionSet();
51562
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
+ }
51563
51611
  while (queue.length > 0) {
51564
51612
  const range = queue.pop();
51565
51613
  const zone = range.zone;
@@ -51571,9 +51619,13 @@ stores.inject(MyMetaStore, storeInstance);
51571
51619
  });
51572
51620
  const impactedPositions = this.rTree.search(range).map((dep) => dep.data);
51573
51621
  const nextInQueue = {};
51574
- for (const position of impactedPositions) if (!visited.has(position) && !ignore.has(position)) {
51575
- if (!nextInQueue[position.sheetId]) nextInQueue[position.sheetId] = [];
51576
- 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
+ }
51577
51629
  }
51578
51630
  for (const sheetId in nextInQueue) {
51579
51631
  const zones = recomputeZones(nextInQueue[sheetId], []);
@@ -51583,15 +51635,7 @@ stores.inject(MyMetaStore, storeInstance);
51583
51635
  })));
51584
51636
  }
51585
51637
  }
51586
- for (const range of ranges) {
51587
- const zone = range.zone;
51588
- const sheetId = range.sheetId;
51589
- for (let col = zone.left; col <= zone.right; col++) for (let row = zone.top; row <= zone.bottom; row++) visited.delete({
51590
- sheetId,
51591
- col,
51592
- row
51593
- });
51594
- }
51638
+ for (const position of initialPositionsToRemove) visited.delete(position);
51595
51639
  return visited;
51596
51640
  }
51597
51641
  };
@@ -58689,8 +58733,8 @@ stores.inject(MyMetaStore, storeInstance);
58689
58733
  const { end: lastRowEnd, size: lastRowSize } = this.getters.getRowDimensions(this.sheetId, lastRow);
58690
58734
  const leftColIndex = this.searchHeaderIndex("COL", lastColEnd - this.viewportWidth, 0);
58691
58735
  const leftColSize = this.getters.getColSize(this.sheetId, leftColIndex);
58692
- const leftRowIndex = this.searchHeaderIndex("ROW", lastRowEnd - this.viewportHeight, 0);
58693
- 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);
58694
58738
  let width = lastColEnd - this.offsetCorrectionX;
58695
58739
  if (this.canScrollHorizontally) {
58696
58740
  width += Math.max(96, Math.min(leftColSize, this.viewportWidth - lastColSize));
@@ -58868,7 +58912,11 @@ stores.inject(MyMetaStore, storeInstance);
58868
58912
  this.left = this.searchHeaderIndex("COL", this.offsetScrollbarX, this.boundaries.left);
58869
58913
  this.right = Math.min(this.boundaries.right, this.searchHeaderIndex("COL", this.viewportWidth, this.left));
58870
58914
  if (!this.viewportWidth) return;
58871
- 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
+ }
58872
58920
  if (this.right === -1) this.right = this.boundaries.right;
58873
58921
  this.offsetX = this.getters.getColDimensions(sheetId, this.left).start - this.getters.getColDimensions(sheetId, this.boundaries.left).start;
58874
58922
  }
@@ -58879,7 +58927,11 @@ stores.inject(MyMetaStore, storeInstance);
58879
58927
  this.top = this.searchHeaderIndex("ROW", this.offsetScrollbarY, this.boundaries.top);
58880
58928
  this.bottom = Math.min(this.boundaries.bottom, this.searchHeaderIndex("ROW", this.viewportHeight, this.top));
58881
58929
  if (!this.viewportHeight) return;
58882
- 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
+ }
58883
58935
  if (this.bottom === -1) this.bottom = this.boundaries.bottom;
58884
58936
  this.offsetY = this.getters.getRowDimensions(sheetId, this.top).start - this.getters.getRowDimensions(sheetId, this.boundaries.top).start;
58885
58937
  }
@@ -60667,6 +60719,9 @@ stores.inject(MyMetaStore, storeInstance);
60667
60719
  position: absolute;
60668
60720
  cursor: pointer;
60669
60721
  }
60722
+ .o-grid.o-dashboard-grid {
60723
+ background: #ffffff;
60724
+ }
60670
60725
  `;
60671
60726
  var SpreadsheetDashboard = class extends _odoo_owl.Component {
60672
60727
  static template = "o-spreadsheet-SpreadsheetDashboard";
@@ -61502,11 +61557,7 @@ stores.inject(MyMetaStore, storeInstance);
61502
61557
  /* In readonly we always show the fx icon if the composer is empty, not matter the focus */
61503
61558
  .o-composer:empty:not(:focus):not(.active)::before,
61504
61559
  &.o-topbar-composer-readonly .o-composer:empty::before {
61505
- content: url("data:image/svg+xml,${encodeURIComponent(`
61506
- <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 121.8 122.9' width='16' height='16' focusable='false'>
61507
- <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'/>
61508
- </svg>
61509
- `)}");
61560
+ content: url("data:image/svg+xml,${encodeURIComponent(FX_SVG)}");
61510
61561
  position: relative;
61511
61562
  top: 20%;
61512
61563
  }
@@ -62098,11 +62149,7 @@ stores.inject(MyMetaStore, storeInstance);
62098
62149
  appearance: none;
62099
62150
  -webkit-appearance: none;
62100
62151
  -moz-appearance: none;
62101
- background: transparent url("data:image/svg+xml,${encodeURIComponent(`
62102
- <svg xmlns='http://www.w3.org/2000/svg' width='7' height='4' viewBox='0 0 7 4'>
62103
- <polygon fill='%23374151' points='3.5 4 7 0 0 0'/>
62104
- </svg>
62105
- `)}")
62152
+ background: transparent url("data:image/svg+xml,${encodeURIComponent(CARET_DOWN_SVG)}")
62106
62153
  no-repeat right center;
62107
62154
  text-overflow: ellipsis;
62108
62155
 
@@ -66449,8 +66496,8 @@ exports.stores = stores;
66449
66496
  exports.tokenColors = tokenColors;
66450
66497
  exports.tokenize = tokenize;
66451
66498
 
66452
- __info__.version = "18.0.79";
66453
- __info__.date = "2026-08-21T15:27:46.928Z";
66454
- __info__.hash = "173a29c";
66499
+ __info__.version = "18.0.81";
66500
+ __info__.date = "2026-09-04T07:02:59.688Z";
66501
+ __info__.hash = "a952c0c";
66455
66502
 
66456
66503
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);