@odoo/o-spreadsheet 18.3.61 → 18.3.62

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.3.61
6
- * @date 2026-08-29T09:13:33.631Z
7
- * @hash c786d2f
5
+ * @version 18.3.62
6
+ * @date 2026-09-04T07:18:12.683Z
7
+ * @hash aaaa064
8
8
  */
9
9
  /* Originates from src/components/top_bar/top_bar.scss */
10
10
  @media (max-width: 900px) {
@@ -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.3.61
6
- * @date 2026-08-29T09:13:32.113Z
7
- * @hash c786d2f
5
+ * @version 18.3.62
6
+ * @date 2026-09-04T07:18:11.182Z
7
+ * @hash aaaa064
8
8
  */
9
9
 
10
10
  import { App, Component, blockDom, markRaw, onMounted, onPatched, onWillPatch, onWillStart, onWillUnmount, onWillUpdateProps, status, toRaw, useChildSubEnv, useComponent, useEffect, useEnv, useExternalListener, useRef, useState, useSubEnv, xml } from "@odoo/owl";
@@ -17684,10 +17684,10 @@ const chartShowValuesPlugin = {
17684
17684
  case "bar":
17685
17685
  case "line":
17686
17686
  case "radar":
17687
- options.horizontal ? drawHorizontalBarChartValues(chart, options, ctx) : drawLineOrBarOrRadarChartValues(chart, options, ctx);
17687
+ options.horizontal ? drawHorizontalBarChartValues(chart, options, ctx, { offsetFromAxisOrigin: true }) : drawLineOrBarOrRadarChartValues(chart, options, ctx);
17688
17688
  break;
17689
17689
  case "funnel":
17690
- drawHorizontalBarChartValues(chart, options, ctx);
17690
+ drawHorizontalBarChartValues(chart, options, ctx, { offsetFromAxisOrigin: false });
17691
17691
  break;
17692
17692
  }
17693
17693
  ctx.restore();
@@ -17728,7 +17728,7 @@ function drawLineOrBarOrRadarChartValues(chart, options, ctx) {
17728
17728
  }
17729
17729
  }
17730
17730
  }
17731
- function drawHorizontalBarChartValues(chart, options, ctx) {
17731
+ function drawHorizontalBarChartValues(chart, options, ctx, args) {
17732
17732
  const textsPositions = {};
17733
17733
  for (const dataset of chart._metasets) {
17734
17734
  if (isTrendLineAxis(dataset.xAxisID)) return;
@@ -17743,7 +17743,7 @@ function drawHorizontalBarChartValues(chart, options, ctx) {
17743
17743
  const distanceFromAxisOrigin = Math.abs(point.x - xZeroLine);
17744
17744
  const PADDING = 3;
17745
17745
  let xPosition;
17746
- if (distanceFromAxisOrigin < textWidth) xPosition = value < 0 ? xZeroLine - textWidth / 2 - PADDING : xZeroLine + textWidth / 2 + PADDING;
17746
+ if (args.offsetFromAxisOrigin && distanceFromAxisOrigin < textWidth) xPosition = value < 0 ? xZeroLine - textWidth / 2 - PADDING : xZeroLine + textWidth / 2 + PADDING;
17747
17747
  else xPosition = value < 0 ? point.x + point.width / 2 : point.x - point.width / 2;
17748
17748
  if (!textsPositions[yPosition]) textsPositions[yPosition] = [];
17749
17749
  for (const otherPosition of textsPositions[yPosition]) if (Math.abs(otherPosition - xPosition) < textWidth) xPosition = value < 0 ? otherPosition - textWidth - PADDING : otherPosition + textWidth + PADDING;
@@ -31034,12 +31034,48 @@ const ErrorToolTipPopoverBuilder = { onHover: (position, getters) => {
31034
31034
  } };
31035
31035
 
31036
31036
  //#endregion
31037
- //#region src/components/side_panel/components/checkbox/checkbox.ts
31037
+ //#region src/components/icons/raw_svgs.ts
31038
+ /**
31039
+ * SVG markup used in `css` tagged templates as `data:image/svg+xml` URIs.
31040
+ *
31041
+ * Keep these values in a separate module so Rolldown references them instead
31042
+ * of inlining them into template literals. Inlining produces nested template
31043
+ * literals, which the downstream `rjsmin` minifier cannot parse correctly
31044
+ * because it relies on regular expressions.
31045
+ *
31046
+ * Do not inline these constants.
31047
+ */
31038
31048
  const CHECK_SVG = `
31039
31049
  <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'>
31040
31050
  <path fill='none' stroke='#FFF' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/>
31041
31051
  </svg>
31042
31052
  `;
31053
+ const CIRCLE_SVG = `
31054
+ <svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'>
31055
+ <circle r="2" fill="#FFF"/>
31056
+ </svg>
31057
+ `;
31058
+ const FX_SVG = `
31059
+ <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 121.8 122.9' width='16' height='16' focusable='false'>
31060
+ <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'/>
31061
+ </svg>
31062
+ `;
31063
+ const TRANSPARENT_BACKGROUND_SVG = `
31064
+ <svg xmlns="http://www.w3.org/2000/svg" width="10" height="10">
31065
+ <path fill="#d9d9d9" d="M5 5h5v5H5zH0V0h5"/>
31066
+ </svg>
31067
+ `;
31068
+ const CURSOR_SVG = `
31069
+ <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>
31070
+ `;
31071
+ const CARET_DOWN_SVG = `
31072
+ <svg xmlns='http://www.w3.org/2000/svg' width='7' height='4' viewBox='0 0 7 4'>
31073
+ <polygon fill='%23374151' points='3.5 4 7 0 0 0'/>
31074
+ </svg>
31075
+ `;
31076
+
31077
+ //#endregion
31078
+ //#region src/components/side_panel/components/checkbox/checkbox.ts
31043
31079
  const CHECKBOX_WIDTH = 14;
31044
31080
  css`
31045
31081
  label.o-checkbox {
@@ -37319,11 +37355,7 @@ css`
37319
37355
  border-radius: 8px;
37320
37356
 
37321
37357
  &:checked {
37322
- background: url("data:image/svg+xml,${encodeURIComponent(`
37323
- <svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'>
37324
- <circle r="2" fill="#FFF"/>
37325
- </svg>
37326
- `)}");
37358
+ background: url("data:image/svg+xml,${encodeURIComponent(CIRCLE_SVG)}");
37327
37359
  background-color: ${ACTION_COLOR};
37328
37360
  border-color: ${ACTION_COLOR};
37329
37361
  }
@@ -37360,11 +37392,7 @@ css`
37360
37392
  cursor: pointer;
37361
37393
  border: 1px solid ${GRAY_300};
37362
37394
  background-position: 1px 1px;
37363
- background-image: url("data:image/svg+xml,${encodeURIComponent(`
37364
- <svg xmlns="http://www.w3.org/2000/svg" width="10" height="10">
37365
- <path fill="#d9d9d9" d="M5 5h5v5H5zH0V0h5"/>
37366
- </svg>
37367
- `)}");
37395
+ background-image: url("data:image/svg+xml,${encodeURIComponent(TRANSPARENT_BACKGROUND_SVG)}");
37368
37396
  }
37369
37397
  `;
37370
37398
  var RoundColorPicker = class extends Component {
@@ -38369,9 +38397,10 @@ var Composer = class extends Component {
38369
38397
  compositionActive = false;
38370
38398
  spreadsheetRect = useSpreadsheetRect();
38371
38399
  lastHoveredTokenIndex = void 0;
38372
- debouncedHover = debounce((tokenIndex, hoveredRect) => {
38400
+ debouncedHover = debounce((tokenIndex, composerContent, hoveredRect) => {
38373
38401
  const selection = this.contentHelper.getCurrentSelection();
38374
- if (selection.start !== selection.end) return;
38402
+ const currentContent = this.props.composerStore.currentContent;
38403
+ if (selection.start !== selection.end || currentContent !== composerContent) return;
38375
38404
  const currentHoveredContext = this.props.composerStore.hoveredTokens;
38376
38405
  this.props.composerStore.hoverToken(tokenIndex);
38377
38406
  if (!deepEquals(currentHoveredContext, this.props.composerStore.hoveredTokens)) this.composerState.hoveredRect = hoveredRect;
@@ -38713,7 +38742,8 @@ var Composer = class extends Component {
38713
38742
  onTokenHover(tokenIndex, hoveredRect) {
38714
38743
  if (this.lastHoveredTokenIndex !== tokenIndex) {
38715
38744
  this.lastHoveredTokenIndex = tokenIndex;
38716
- this.debouncedHover(tokenIndex, hoveredRect);
38745
+ const composerContent = this.props.composerStore.currentContent;
38746
+ this.debouncedHover(tokenIndex, composerContent, hoveredRect);
38717
38747
  }
38718
38748
  }
38719
38749
  /**
@@ -44981,7 +45011,13 @@ var PivotSpreadsheetSidePanel = class extends Component {
44981
45011
  }
44982
45012
  onSelectionChanged(ranges) {
44983
45013
  this.state.rangeHasChanged = true;
44984
- this.state.range = ranges[0];
45014
+ if (ranges.length === 0) {
45015
+ this.state.range = void 0;
45016
+ return;
45017
+ }
45018
+ const sheetId = this.env.model.getters.getActiveSheetId();
45019
+ const range = this.env.model.getters.getRangeFromSheetXC(sheetId, ranges[0]);
45020
+ this.state.range = this.env.model.getters.getRangeString(range, "forceSheetReference", { useBoundedReference: true });
44985
45021
  }
44986
45022
  onSelectionConfirmed() {
44987
45023
  if (this.state.range) {
@@ -48362,9 +48398,7 @@ var HoveredTableStore = class extends SpreadsheetStore {
48362
48398
  //#region src/components/grid_overlay/grid_overlay.ts
48363
48399
  css`
48364
48400
  .o-paint-format-cursor {
48365
- cursor: url("data:image/svg+xml,${encodeURIComponent(`
48366
- <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>
48367
- `)}"), auto;
48401
+ cursor: url("data:image/svg+xml,${encodeURIComponent(CURSOR_SVG)}"), auto;
48368
48402
  }
48369
48403
  `;
48370
48404
  function useCellHovered(env, gridRef) {
@@ -48540,6 +48574,11 @@ var GridOverlay = class extends Component {
48540
48574
  const y = ev.clientY - this.gridOverlayRect.y;
48541
48575
  return [this.env.model.getters.getColIndex(x), this.env.model.getters.getRowIndex(y)];
48542
48576
  }
48577
+ get isFooterVisible() {
48578
+ const { y } = this.env.model.getters.getMainViewportCoordinates();
48579
+ const { height } = this.env.model.getters.getSheetViewDimension();
48580
+ return !this.env.model.getters.isReadonly() && height - y > 46;
48581
+ }
48543
48582
  };
48544
48583
 
48545
48584
  //#endregion
@@ -56747,6 +56786,16 @@ var FormulaDependencyGraph = class {
56747
56786
  getCellsDependingOn(ranges, ignore) {
56748
56787
  const visited = this.createEmptyPositionSet();
56749
56788
  const queue = Array.from(ranges).reverse();
56789
+ const initialPositionsToRemove = this.createEmptyPositionSet();
56790
+ for (const range of ranges) {
56791
+ const zone = range.zone;
56792
+ const sheetId = range.sheetId;
56793
+ for (let col = zone.left; col <= zone.right; col++) for (let row = zone.top; row <= zone.bottom; row++) initialPositionsToRemove.add({
56794
+ sheetId,
56795
+ col,
56796
+ row
56797
+ });
56798
+ }
56750
56799
  while (queue.length > 0) {
56751
56800
  const range = queue.pop();
56752
56801
  const zone = range.zone;
@@ -56758,9 +56807,13 @@ var FormulaDependencyGraph = class {
56758
56807
  });
56759
56808
  const impactedPositions = this.rTree.search(range).map((dep) => dep.data);
56760
56809
  const nextInQueue = {};
56761
- for (const position of impactedPositions) if (!visited.has(position) && !ignore.has(position)) {
56762
- if (!nextInQueue[position.sheetId]) nextInQueue[position.sheetId] = [];
56763
- nextInQueue[position.sheetId].push(positionToZone(position));
56810
+ for (const position of impactedPositions) {
56811
+ if (ignore.has(position)) continue;
56812
+ initialPositionsToRemove.delete(position);
56813
+ if (!visited.has(position)) {
56814
+ if (!nextInQueue[position.sheetId]) nextInQueue[position.sheetId] = [];
56815
+ nextInQueue[position.sheetId].push(positionToZone(position));
56816
+ }
56764
56817
  }
56765
56818
  for (const sheetId in nextInQueue) {
56766
56819
  const zones = recomputeZones(nextInQueue[sheetId], []);
@@ -56770,15 +56823,7 @@ var FormulaDependencyGraph = class {
56770
56823
  })));
56771
56824
  }
56772
56825
  }
56773
- for (const range of ranges) {
56774
- const zone = range.zone;
56775
- const sheetId = range.sheetId;
56776
- for (let col = zone.left; col <= zone.right; col++) for (let row = zone.top; row <= zone.bottom; row++) visited.delete({
56777
- sheetId,
56778
- col,
56779
- row
56780
- });
56781
- }
56826
+ for (const position of initialPositionsToRemove) visited.delete(position);
56782
56827
  return visited;
56783
56828
  }
56784
56829
  };
@@ -64173,7 +64218,7 @@ var InternalViewport = class {
64173
64218
  let height = lastRowEnd - this.offsetCorrectionY;
64174
64219
  if (this.canScrollVertically) {
64175
64220
  height = Math.max(height, this.viewportHeight);
64176
- if (lastRowEnd + 46 > height && !this.getters.isReadonly()) height += 46;
64221
+ if (lastRowEnd + 46 > height && !this.getters.isReadonly() && this.viewportHeight > 46) height += 46;
64177
64222
  }
64178
64223
  return {
64179
64224
  width,
@@ -66751,11 +66796,7 @@ css`
66751
66796
  /* In readonly we always show the fx icon if the composer is empty, not matter the focus */
66752
66797
  .o-composer:empty:not(:focus):not(.active)::before,
66753
66798
  &.o-topbar-composer-readonly .o-composer:empty::before {
66754
- content: url("data:image/svg+xml,${encodeURIComponent(`
66755
- <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 121.8 122.9' width='16' height='16' focusable='false'>
66756
- <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'/>
66757
- </svg>
66758
- `)}");
66799
+ content: url("data:image/svg+xml,${encodeURIComponent(FX_SVG)}");
66759
66800
  position: relative;
66760
66801
  top: 20%;
66761
66802
  }
@@ -67909,11 +67950,7 @@ css`
67909
67950
  appearance: none;
67910
67951
  -webkit-appearance: none;
67911
67952
  -moz-appearance: none;
67912
- background: transparent url("data:image/svg+xml,${encodeURIComponent(`
67913
- <svg xmlns='http://www.w3.org/2000/svg' width='7' height='4' viewBox='0 0 7 4'>
67914
- <polygon fill='%23374151' points='3.5 4 7 0 0 0'/>
67915
- </svg>
67916
- `)}")
67953
+ background: transparent url("data:image/svg+xml,${encodeURIComponent(CARET_DOWN_SVG)}")
67917
67954
  no-repeat right center;
67918
67955
  text-overflow: ellipsis;
67919
67956
 
@@ -72304,6 +72341,6 @@ const chartHelpers = {
72304
72341
  //#endregion
72305
72342
  export { AbstractCellClipboardHandler, AbstractChart, AbstractFigureClipboardHandler, CellErrorType, CommandResult, CorePlugin, CoreViewPlugin, DispatchResult, EvaluationError, Model, PivotRuntimeDefinition, Registry, Revision, SPREADSHEET_DIMENSIONS, Spreadsheet, SpreadsheetPivotTable, UIPlugin, __info__, addFunction, addRenderingLayer, astToFormula, chartHelpers, compile, compileTokens, components, constants, convertAstNodes, coreTypes, findCellInNewZone, functionCache, helpers, hooks, invalidateCFEvaluationCommands, invalidateChartEvaluationCommands, invalidateDependenciesCommands, invalidateEvaluationCommands, iterateAstNodes, links, load, parse, parseTokens, readonlyAllowedCommands, registries, setDefaultSheetViewSize, setTranslationMethod, stores, tokenColors, tokenize };
72306
72343
 
72307
- __info__.version = "18.3.61";
72308
- __info__.date = "2026-08-29T09:13:32.113Z";
72309
- __info__.hash = "c786d2f";
72344
+ __info__.version = "18.3.62";
72345
+ __info__.date = "2026-09-04T07:18:11.182Z";
72346
+ __info__.hash = "aaaa064";
@@ -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.3.61
6
- * @date 2026-08-29T09:13:32.113Z
7
- * @hash c786d2f
5
+ * @version 18.3.62
6
+ * @date 2026-09-04T07:18:11.182Z
7
+ * @hash aaaa064
8
8
  */
9
9
 
10
10
  (function(exports, _odoo_owl) {
@@ -17686,10 +17686,10 @@ stores.inject(MyMetaStore, storeInstance);
17686
17686
  case "bar":
17687
17687
  case "line":
17688
17688
  case "radar":
17689
- options.horizontal ? drawHorizontalBarChartValues(chart, options, ctx) : drawLineOrBarOrRadarChartValues(chart, options, ctx);
17689
+ options.horizontal ? drawHorizontalBarChartValues(chart, options, ctx, { offsetFromAxisOrigin: true }) : drawLineOrBarOrRadarChartValues(chart, options, ctx);
17690
17690
  break;
17691
17691
  case "funnel":
17692
- drawHorizontalBarChartValues(chart, options, ctx);
17692
+ drawHorizontalBarChartValues(chart, options, ctx, { offsetFromAxisOrigin: false });
17693
17693
  break;
17694
17694
  }
17695
17695
  ctx.restore();
@@ -17730,7 +17730,7 @@ stores.inject(MyMetaStore, storeInstance);
17730
17730
  }
17731
17731
  }
17732
17732
  }
17733
- function drawHorizontalBarChartValues(chart, options, ctx) {
17733
+ function drawHorizontalBarChartValues(chart, options, ctx, args) {
17734
17734
  const textsPositions = {};
17735
17735
  for (const dataset of chart._metasets) {
17736
17736
  if (isTrendLineAxis(dataset.xAxisID)) return;
@@ -17745,7 +17745,7 @@ stores.inject(MyMetaStore, storeInstance);
17745
17745
  const distanceFromAxisOrigin = Math.abs(point.x - xZeroLine);
17746
17746
  const PADDING = 3;
17747
17747
  let xPosition;
17748
- if (distanceFromAxisOrigin < textWidth) xPosition = value < 0 ? xZeroLine - textWidth / 2 - PADDING : xZeroLine + textWidth / 2 + PADDING;
17748
+ if (args.offsetFromAxisOrigin && distanceFromAxisOrigin < textWidth) xPosition = value < 0 ? xZeroLine - textWidth / 2 - PADDING : xZeroLine + textWidth / 2 + PADDING;
17749
17749
  else xPosition = value < 0 ? point.x + point.width / 2 : point.x - point.width / 2;
17750
17750
  if (!textsPositions[yPosition]) textsPositions[yPosition] = [];
17751
17751
  for (const otherPosition of textsPositions[yPosition]) if (Math.abs(otherPosition - xPosition) < textWidth) xPosition = value < 0 ? otherPosition - textWidth - PADDING : otherPosition + textWidth + PADDING;
@@ -31036,12 +31036,48 @@ stores.inject(MyMetaStore, storeInstance);
31036
31036
  } };
31037
31037
 
31038
31038
  //#endregion
31039
- //#region src/components/side_panel/components/checkbox/checkbox.ts
31039
+ //#region src/components/icons/raw_svgs.ts
31040
+ /**
31041
+ * SVG markup used in `css` tagged templates as `data:image/svg+xml` URIs.
31042
+ *
31043
+ * Keep these values in a separate module so Rolldown references them instead
31044
+ * of inlining them into template literals. Inlining produces nested template
31045
+ * literals, which the downstream `rjsmin` minifier cannot parse correctly
31046
+ * because it relies on regular expressions.
31047
+ *
31048
+ * Do not inline these constants.
31049
+ */
31040
31050
  const CHECK_SVG = `
31041
31051
  <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'>
31042
31052
  <path fill='none' stroke='#FFF' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/>
31043
31053
  </svg>
31044
31054
  `;
31055
+ const CIRCLE_SVG = `
31056
+ <svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'>
31057
+ <circle r="2" fill="#FFF"/>
31058
+ </svg>
31059
+ `;
31060
+ const FX_SVG = `
31061
+ <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 121.8 122.9' width='16' height='16' focusable='false'>
31062
+ <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'/>
31063
+ </svg>
31064
+ `;
31065
+ const TRANSPARENT_BACKGROUND_SVG = `
31066
+ <svg xmlns="http://www.w3.org/2000/svg" width="10" height="10">
31067
+ <path fill="#d9d9d9" d="M5 5h5v5H5zH0V0h5"/>
31068
+ </svg>
31069
+ `;
31070
+ const CURSOR_SVG = `
31071
+ <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>
31072
+ `;
31073
+ const CARET_DOWN_SVG = `
31074
+ <svg xmlns='http://www.w3.org/2000/svg' width='7' height='4' viewBox='0 0 7 4'>
31075
+ <polygon fill='%23374151' points='3.5 4 7 0 0 0'/>
31076
+ </svg>
31077
+ `;
31078
+
31079
+ //#endregion
31080
+ //#region src/components/side_panel/components/checkbox/checkbox.ts
31045
31081
  const CHECKBOX_WIDTH = 14;
31046
31082
  css`
31047
31083
  label.o-checkbox {
@@ -37321,11 +37357,7 @@ stores.inject(MyMetaStore, storeInstance);
37321
37357
  border-radius: 8px;
37322
37358
 
37323
37359
  &:checked {
37324
- background: url("data:image/svg+xml,${encodeURIComponent(`
37325
- <svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'>
37326
- <circle r="2" fill="#FFF"/>
37327
- </svg>
37328
- `)}");
37360
+ background: url("data:image/svg+xml,${encodeURIComponent(CIRCLE_SVG)}");
37329
37361
  background-color: ${ACTION_COLOR};
37330
37362
  border-color: ${ACTION_COLOR};
37331
37363
  }
@@ -37362,11 +37394,7 @@ stores.inject(MyMetaStore, storeInstance);
37362
37394
  cursor: pointer;
37363
37395
  border: 1px solid ${GRAY_300};
37364
37396
  background-position: 1px 1px;
37365
- background-image: url("data:image/svg+xml,${encodeURIComponent(`
37366
- <svg xmlns="http://www.w3.org/2000/svg" width="10" height="10">
37367
- <path fill="#d9d9d9" d="M5 5h5v5H5zH0V0h5"/>
37368
- </svg>
37369
- `)}");
37397
+ background-image: url("data:image/svg+xml,${encodeURIComponent(TRANSPARENT_BACKGROUND_SVG)}");
37370
37398
  }
37371
37399
  `;
37372
37400
  var RoundColorPicker = class extends _odoo_owl.Component {
@@ -38371,9 +38399,10 @@ stores.inject(MyMetaStore, storeInstance);
38371
38399
  compositionActive = false;
38372
38400
  spreadsheetRect = useSpreadsheetRect();
38373
38401
  lastHoveredTokenIndex = void 0;
38374
- debouncedHover = debounce((tokenIndex, hoveredRect) => {
38402
+ debouncedHover = debounce((tokenIndex, composerContent, hoveredRect) => {
38375
38403
  const selection = this.contentHelper.getCurrentSelection();
38376
- if (selection.start !== selection.end) return;
38404
+ const currentContent = this.props.composerStore.currentContent;
38405
+ if (selection.start !== selection.end || currentContent !== composerContent) return;
38377
38406
  const currentHoveredContext = this.props.composerStore.hoveredTokens;
38378
38407
  this.props.composerStore.hoverToken(tokenIndex);
38379
38408
  if (!deepEquals(currentHoveredContext, this.props.composerStore.hoveredTokens)) this.composerState.hoveredRect = hoveredRect;
@@ -38715,7 +38744,8 @@ stores.inject(MyMetaStore, storeInstance);
38715
38744
  onTokenHover(tokenIndex, hoveredRect) {
38716
38745
  if (this.lastHoveredTokenIndex !== tokenIndex) {
38717
38746
  this.lastHoveredTokenIndex = tokenIndex;
38718
- this.debouncedHover(tokenIndex, hoveredRect);
38747
+ const composerContent = this.props.composerStore.currentContent;
38748
+ this.debouncedHover(tokenIndex, composerContent, hoveredRect);
38719
38749
  }
38720
38750
  }
38721
38751
  /**
@@ -44983,7 +45013,13 @@ stores.inject(MyMetaStore, storeInstance);
44983
45013
  }
44984
45014
  onSelectionChanged(ranges) {
44985
45015
  this.state.rangeHasChanged = true;
44986
- this.state.range = ranges[0];
45016
+ if (ranges.length === 0) {
45017
+ this.state.range = void 0;
45018
+ return;
45019
+ }
45020
+ const sheetId = this.env.model.getters.getActiveSheetId();
45021
+ const range = this.env.model.getters.getRangeFromSheetXC(sheetId, ranges[0]);
45022
+ this.state.range = this.env.model.getters.getRangeString(range, "forceSheetReference", { useBoundedReference: true });
44987
45023
  }
44988
45024
  onSelectionConfirmed() {
44989
45025
  if (this.state.range) {
@@ -48364,9 +48400,7 @@ stores.inject(MyMetaStore, storeInstance);
48364
48400
  //#region src/components/grid_overlay/grid_overlay.ts
48365
48401
  css`
48366
48402
  .o-paint-format-cursor {
48367
- cursor: url("data:image/svg+xml,${encodeURIComponent(`
48368
- <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>
48369
- `)}"), auto;
48403
+ cursor: url("data:image/svg+xml,${encodeURIComponent(CURSOR_SVG)}"), auto;
48370
48404
  }
48371
48405
  `;
48372
48406
  function useCellHovered(env, gridRef) {
@@ -48542,6 +48576,11 @@ stores.inject(MyMetaStore, storeInstance);
48542
48576
  const y = ev.clientY - this.gridOverlayRect.y;
48543
48577
  return [this.env.model.getters.getColIndex(x), this.env.model.getters.getRowIndex(y)];
48544
48578
  }
48579
+ get isFooterVisible() {
48580
+ const { y } = this.env.model.getters.getMainViewportCoordinates();
48581
+ const { height } = this.env.model.getters.getSheetViewDimension();
48582
+ return !this.env.model.getters.isReadonly() && height - y > 46;
48583
+ }
48545
48584
  };
48546
48585
 
48547
48586
  //#endregion
@@ -56749,6 +56788,16 @@ stores.inject(MyMetaStore, storeInstance);
56749
56788
  getCellsDependingOn(ranges, ignore) {
56750
56789
  const visited = this.createEmptyPositionSet();
56751
56790
  const queue = Array.from(ranges).reverse();
56791
+ const initialPositionsToRemove = this.createEmptyPositionSet();
56792
+ for (const range of ranges) {
56793
+ const zone = range.zone;
56794
+ const sheetId = range.sheetId;
56795
+ for (let col = zone.left; col <= zone.right; col++) for (let row = zone.top; row <= zone.bottom; row++) initialPositionsToRemove.add({
56796
+ sheetId,
56797
+ col,
56798
+ row
56799
+ });
56800
+ }
56752
56801
  while (queue.length > 0) {
56753
56802
  const range = queue.pop();
56754
56803
  const zone = range.zone;
@@ -56760,9 +56809,13 @@ stores.inject(MyMetaStore, storeInstance);
56760
56809
  });
56761
56810
  const impactedPositions = this.rTree.search(range).map((dep) => dep.data);
56762
56811
  const nextInQueue = {};
56763
- for (const position of impactedPositions) if (!visited.has(position) && !ignore.has(position)) {
56764
- if (!nextInQueue[position.sheetId]) nextInQueue[position.sheetId] = [];
56765
- nextInQueue[position.sheetId].push(positionToZone(position));
56812
+ for (const position of impactedPositions) {
56813
+ if (ignore.has(position)) continue;
56814
+ initialPositionsToRemove.delete(position);
56815
+ if (!visited.has(position)) {
56816
+ if (!nextInQueue[position.sheetId]) nextInQueue[position.sheetId] = [];
56817
+ nextInQueue[position.sheetId].push(positionToZone(position));
56818
+ }
56766
56819
  }
56767
56820
  for (const sheetId in nextInQueue) {
56768
56821
  const zones = recomputeZones(nextInQueue[sheetId], []);
@@ -56772,15 +56825,7 @@ stores.inject(MyMetaStore, storeInstance);
56772
56825
  })));
56773
56826
  }
56774
56827
  }
56775
- for (const range of ranges) {
56776
- const zone = range.zone;
56777
- const sheetId = range.sheetId;
56778
- for (let col = zone.left; col <= zone.right; col++) for (let row = zone.top; row <= zone.bottom; row++) visited.delete({
56779
- sheetId,
56780
- col,
56781
- row
56782
- });
56783
- }
56828
+ for (const position of initialPositionsToRemove) visited.delete(position);
56784
56829
  return visited;
56785
56830
  }
56786
56831
  };
@@ -64175,7 +64220,7 @@ stores.inject(MyMetaStore, storeInstance);
64175
64220
  let height = lastRowEnd - this.offsetCorrectionY;
64176
64221
  if (this.canScrollVertically) {
64177
64222
  height = Math.max(height, this.viewportHeight);
64178
- if (lastRowEnd + 46 > height && !this.getters.isReadonly()) height += 46;
64223
+ if (lastRowEnd + 46 > height && !this.getters.isReadonly() && this.viewportHeight > 46) height += 46;
64179
64224
  }
64180
64225
  return {
64181
64226
  width,
@@ -66753,11 +66798,7 @@ stores.inject(MyMetaStore, storeInstance);
66753
66798
  /* In readonly we always show the fx icon if the composer is empty, not matter the focus */
66754
66799
  .o-composer:empty:not(:focus):not(.active)::before,
66755
66800
  &.o-topbar-composer-readonly .o-composer:empty::before {
66756
- content: url("data:image/svg+xml,${encodeURIComponent(`
66757
- <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 121.8 122.9' width='16' height='16' focusable='false'>
66758
- <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'/>
66759
- </svg>
66760
- `)}");
66801
+ content: url("data:image/svg+xml,${encodeURIComponent(FX_SVG)}");
66761
66802
  position: relative;
66762
66803
  top: 20%;
66763
66804
  }
@@ -67911,11 +67952,7 @@ stores.inject(MyMetaStore, storeInstance);
67911
67952
  appearance: none;
67912
67953
  -webkit-appearance: none;
67913
67954
  -moz-appearance: none;
67914
- background: transparent url("data:image/svg+xml,${encodeURIComponent(`
67915
- <svg xmlns='http://www.w3.org/2000/svg' width='7' height='4' viewBox='0 0 7 4'>
67916
- <polygon fill='%23374151' points='3.5 4 7 0 0 0'/>
67917
- </svg>
67918
- `)}")
67955
+ background: transparent url("data:image/svg+xml,${encodeURIComponent(CARET_DOWN_SVG)}")
67919
67956
  no-repeat right center;
67920
67957
  text-overflow: ellipsis;
67921
67958
 
@@ -72353,8 +72390,8 @@ exports.stores = stores;
72353
72390
  exports.tokenColors = tokenColors;
72354
72391
  exports.tokenize = tokenize;
72355
72392
 
72356
- __info__.version = "18.3.61";
72357
- __info__.date = "2026-08-29T09:13:32.113Z";
72358
- __info__.hash = "c786d2f";
72393
+ __info__.version = "18.3.62";
72394
+ __info__.date = "2026-09-04T07:18:11.182Z";
72395
+ __info__.hash = "aaaa064";
72359
72396
 
72360
72397
  })(this.o_spreadsheet = this.o_spreadsheet || {}, owl);