@odoo/o-spreadsheet 18.2.53 → 18.2.54

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.2.53
6
- * @date 2026-05-12T12:17:43.785Z
7
- * @hash d8b08ba
5
+ * @version 18.2.54
6
+ * @date 2026-05-27T05:56:03.418Z
7
+ * @hash bd06c51
8
8
  */
9
9
 
10
10
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
@@ -1346,6 +1346,7 @@ function getAlternatingColorsPalette(quantity) {
1346
1346
  else return ALTERNATING_COLORS_XL;
1347
1347
  }
1348
1348
  var ColorGenerator = class {
1349
+ preferredColors;
1349
1350
  currentColorIndex = 0;
1350
1351
  palette;
1351
1352
  constructor(paletteSize, preferredColors = []) {
@@ -1812,6 +1813,7 @@ const _t = function(s, ...values) {
1812
1813
  return sprintf(_translate(s), ...values);
1813
1814
  };
1814
1815
  var LazyTranslatedString = class extends String {
1816
+ values;
1815
1817
  constructor(str, values) {
1816
1818
  super(str);
1817
1819
  this.values = values;
@@ -3308,6 +3310,8 @@ const CellErrorType = {
3308
3310
  };
3309
3311
  const errorTypes = new Set(Object.values(CellErrorType));
3310
3312
  var EvaluationError = class {
3313
+ message;
3314
+ value;
3311
3315
  constructor(message = _t("Error"), value = CellErrorType.GenericError) {
3312
3316
  this.message = message;
3313
3317
  this.value = value;
@@ -3340,6 +3344,7 @@ var UnknownFunctionError = class extends EvaluationError {
3340
3344
  }
3341
3345
  };
3342
3346
  var SplillBlockedError = class extends EvaluationError {
3347
+ errorOriginPosition;
3343
3348
  constructor(message = _t("Spill range is not empty"), errorOriginPosition) {
3344
3349
  super(message, CellErrorType.SpilledBlocked);
3345
3350
  this.errorOriginPosition = errorOriginPosition;
@@ -5173,6 +5178,7 @@ function getFullReference(sheetName, xc) {
5173
5178
  //#endregion
5174
5179
  //#region src/helpers/range.ts
5175
5180
  var RangeImpl = class RangeImpl {
5181
+ getSheetSize;
5176
5182
  _zone;
5177
5183
  parts;
5178
5184
  invalidXc;
@@ -5860,6 +5866,8 @@ const selectPastedZone = (selection, sourceZones, pastedZones) => {
5860
5866
  //#endregion
5861
5867
  //#region src/clipboard_handlers/abstract_clipboard_handler.ts
5862
5868
  var ClipboardHandler = class {
5869
+ getters;
5870
+ dispatch;
5863
5871
  constructor(getters, dispatch) {
5864
5872
  this.getters = getters;
5865
5873
  this.dispatch = dispatch;
@@ -8267,6 +8275,7 @@ var DependencyContainer = class extends EventBus {
8267
8275
  }
8268
8276
  };
8269
8277
  var StoreFactory = class {
8278
+ get;
8270
8279
  pendingBuilds = /* @__PURE__ */ new Set();
8271
8280
  constructor(get) {
8272
8281
  this.get = get;
@@ -8311,6 +8320,7 @@ stores.inject(MyMetaStore, storeInstance);
8311
8320
  return MetaStore;
8312
8321
  }
8313
8322
  var DisposableStore = class {
8323
+ get;
8314
8324
  disposeCallbacks = [];
8315
8325
  constructor(get) {
8316
8326
  this.get = get;
@@ -9454,6 +9464,7 @@ function getScorecardConfiguration({ width, height }, runtime) {
9454
9464
  }, runtime).computeDesign();
9455
9465
  }
9456
9466
  var ScorecardChartConfigBuilder = class {
9467
+ runtime;
9457
9468
  context;
9458
9469
  width;
9459
9470
  height;
@@ -18108,6 +18119,7 @@ var AbstractComposerStore = class extends SpreadsheetStore {
18108
18119
  //#endregion
18109
18120
  //#region src/formulas/code_builder.ts
18110
18121
  var FunctionCodeBuilder = class {
18122
+ scope;
18111
18123
  code = "";
18112
18124
  constructor(scope = new Scope()) {
18113
18125
  this.scope = scope;
@@ -18123,6 +18135,8 @@ var FunctionCodeBuilder = class {
18123
18135
  }
18124
18136
  };
18125
18137
  var FunctionCodeImpl = class {
18138
+ scope;
18139
+ returnExpression;
18126
18140
  code;
18127
18141
  constructor(scope, code, returnExpression) {
18128
18142
  this.scope = scope;
@@ -18503,6 +18517,9 @@ function extractFormulaIdFromToken(tokenAtCursor) {
18503
18517
  function getFirstPivotFunction(tokens) {
18504
18518
  return getFunctionsFromTokens(tokens, PIVOT_FUNCTIONS)[0];
18505
18519
  }
18520
+ function getPivotFunctions(tokens) {
18521
+ return getFunctionsFromTokens(tokens, PIVOT_FUNCTIONS);
18522
+ }
18506
18523
  /**
18507
18524
  * Parse a spreadsheet formula and detect the number of PIVOT functions that are
18508
18525
  * present in the given formula.
@@ -19553,6 +19570,7 @@ const backgroundColorChartJSPlugin = {
19553
19570
  * Represent a raw XML string
19554
19571
  */
19555
19572
  var XMLString = class {
19573
+ xmlString;
19556
19574
  /**
19557
19575
  * @param xmlString should be a well formed, properly escaped XML string
19558
19576
  */
@@ -19671,6 +19689,10 @@ const FORCE_DEFAULT_ARGS_FUNCTIONS = {
19671
19689
  ROUNDDOWN: [{
19672
19690
  type: "NUMBER",
19673
19691
  value: 0
19692
+ }],
19693
+ IFERROR: [{
19694
+ type: "NUMBER",
19695
+ value: 0
19674
19696
  }]
19675
19697
  };
19676
19698
  /**
@@ -29586,6 +29608,10 @@ var Popover = class extends _odoo_owl.Component {
29586
29608
  }
29587
29609
  };
29588
29610
  var PopoverPositionContext = class {
29611
+ anchorRect;
29612
+ containerRect;
29613
+ propsMaxSize;
29614
+ spreadsheetOffset;
29589
29615
  constructor(anchorRect, containerRect, propsMaxSize, spreadsheetOffset) {
29590
29616
  this.anchorRect = anchorRect;
29591
29617
  this.containerRect = containerRect;
@@ -32624,7 +32650,7 @@ function getVisiblePivotCellPositions(getters, pivotId) {
32624
32650
  col,
32625
32651
  row
32626
32652
  };
32627
- if (pivotId === getters.getPivotIdFromPosition(position)) positions.push(position);
32653
+ if (getters.getPivotIdsFromPosition(position).includes(pivotId)) positions.push(position);
32628
32654
  }
32629
32655
  return positions;
32630
32656
  }
@@ -33402,6 +33428,7 @@ var DOMDndHelper = class {
33402
33428
  }
33403
33429
  };
33404
33430
  var ContainerWrapper = class {
33431
+ el;
33405
33432
  constructor(el) {
33406
33433
  this.el = el;
33407
33434
  }
@@ -33487,6 +33514,9 @@ var FocusStore = class {
33487
33514
  * This plugin handles this internal state.
33488
33515
  */
33489
33516
  var SelectionInputStore = class extends SpreadsheetStore {
33517
+ initialRanges;
33518
+ inputHasSingleRange;
33519
+ colors;
33490
33520
  mutators = [
33491
33521
  "resetWithRanges",
33492
33522
  "focusById",
@@ -36399,6 +36429,7 @@ var Composer = class extends _odoo_owl.Component {
36399
36429
  //#endregion
36400
36430
  //#region src/components/composer/standalone_composer/standalone_composer_store.ts
36401
36431
  var StandaloneComposerStore = class extends AbstractComposerStore {
36432
+ args;
36402
36433
  constructor(get, args) {
36403
36434
  super(get);
36404
36435
  this.args = args;
@@ -39973,6 +40004,8 @@ var MoreFormatsPanel = class extends _odoo_owl.Component {
39973
40004
  //#endregion
39974
40005
  //#region src/components/side_panel/pivot/pivot_measure_display_panel/pivot_measure_display_panel_store.ts
39975
40006
  var PivotMeasureDisplayPanelStore = class extends SpreadsheetStore {
40007
+ pivotId;
40008
+ initialMeasure;
39976
40009
  mutators = [
39977
40010
  "cancelMeasureDisplayEdition",
39978
40011
  "updateMeasureDisplayType",
@@ -41011,13 +41044,30 @@ function createMeasure(fields, measure) {
41011
41044
  } : fields[fieldName];
41012
41045
  const aggregator = measure.aggregator;
41013
41046
  return {
41047
+ /**
41048
+ * Get the id of the measure, as it is stored in the pivot formula
41049
+ */
41014
41050
  id: measure.id,
41051
+ /**
41052
+ * Display name of the measure
41053
+ * e.g. "__count" -> "Count", "amount_total" -> "Total Amount"
41054
+ */
41015
41055
  get displayName() {
41016
41056
  return measure.userDefinedName ?? field?.string ?? measure.fieldName;
41017
41057
  },
41018
41058
  userDefinedName: measure.userDefinedName,
41059
+ /**
41060
+ * Get the name of the field of the measure
41061
+ */
41019
41062
  fieldName,
41063
+ /**
41064
+ * Get the aggregator of the measure
41065
+ */
41020
41066
  aggregator,
41067
+ /**
41068
+ * Get the type of the measure field
41069
+ * e.g. "stage_id" -> "many2one", "create_date:month" -> "date"
41070
+ */
41021
41071
  type: fieldName === "__count" ? "integer" : field?.type ?? "integer",
41022
41072
  isValid: !!(field || measure.computedBy),
41023
41073
  isHidden: measure.isHidden,
@@ -41031,10 +41081,30 @@ function createPivotDimension(fields, dimension) {
41031
41081
  const type = field?.type ?? "integer";
41032
41082
  const granularity = field && isDateOrDatetimeField(field) ? dimension.granularity : void 0;
41033
41083
  return {
41084
+ /**
41085
+ * Get the display name of the dimension
41086
+ * e.g. "stage_id" -> "Stage", "create_date:month" -> "Create Date"
41087
+ */
41034
41088
  displayName: field?.string ?? dimension.fieldName,
41089
+ /**
41090
+ * Get the name of the dimension, as it is stored in the pivot formula
41091
+ * e.g. "stage_id", "create_date:month"
41092
+ */
41035
41093
  nameWithGranularity: dimension.fieldName + (granularity ? `:${granularity}` : ""),
41094
+ /**
41095
+ * Get the name of the field of the dimension
41096
+ * e.g. "stage_id" -> "stage_id", "create_date:month" -> "create_date"
41097
+ */
41036
41098
  fieldName: dimension.fieldName,
41099
+ /**
41100
+ * Get the aggregate operator of the dimension
41101
+ * e.g. "stage_id" -> undefined, "create_date:month" -> "month"
41102
+ */
41037
41103
  granularity,
41104
+ /**
41105
+ * Get the type of the field of the dimension
41106
+ * e.g. "stage_id" -> "many2one", "create_date:month" -> "date"
41107
+ */
41038
41108
  type,
41039
41109
  order: dimension.order,
41040
41110
  isValid: !!field
@@ -42074,6 +42144,7 @@ function adaptPivotRange(range, applyChange) {
42074
42144
  //#endregion
42075
42145
  //#region src/components/side_panel/pivot/pivot_side_panel/pivot_side_panel_store.ts
42076
42146
  var PivotSidePanelStore = class extends SpreadsheetStore {
42147
+ pivotId;
42077
42148
  mutators = [
42078
42149
  "reset",
42079
42150
  "deferUpdates",
@@ -49575,6 +49646,11 @@ var CellPlugin = class extends CorePlugin {
49575
49646
  }
49576
49647
  };
49577
49648
  var FormulaCellWithDependencies = class {
49649
+ id;
49650
+ format;
49651
+ style;
49652
+ sheetId;
49653
+ getRangeString;
49578
49654
  isFormula = true;
49579
49655
  compiledFormula;
49580
49656
  constructor(id, compiledFormula, format, style, dependencies, sheetId, getRangeString) {
@@ -49609,6 +49685,10 @@ var FormulaCellWithDependencies = class {
49609
49685
  }
49610
49686
  };
49611
49687
  var RangeReferenceToken = class {
49688
+ ranges;
49689
+ rangeIndex;
49690
+ sheetId;
49691
+ getRangeString;
49612
49692
  type = "REFERENCE";
49613
49693
  constructor(ranges, rangeIndex, sheetId, getRangeString) {
49614
49694
  this.ranges = ranges;
@@ -53505,6 +53585,8 @@ function buildCompilationParameters(context, getters, computeCell) {
53505
53585
  return new CompilationParametersBuilder(context, getters, computeCell).getParameters();
53506
53586
  }
53507
53587
  var CompilationParametersBuilder = class {
53588
+ getters;
53589
+ computeCell;
53508
53590
  evalContext;
53509
53591
  rangeCache = {};
53510
53592
  constructor(context, getters, computeCell) {
@@ -54142,6 +54224,7 @@ var ZoneRBush = class extends import_rbush.default {
54142
54224
  * It uses an R-Tree data structure to efficiently find dependent cells.
54143
54225
  */
54144
54226
  var FormulaDependencyGraph = class {
54227
+ createEmptyPositionSet;
54145
54228
  dependencies = new PositionMap();
54146
54229
  rTree;
54147
54230
  constructor(createEmptyPositionSet, data = []) {
@@ -54443,6 +54526,7 @@ const MAX_ITERATION = 30;
54443
54526
  const ERROR_CYCLE_CELL = Object.freeze(createEvaluatedCell(new CircularDependencyError()));
54444
54527
  const EMPTY_CELL = Object.freeze(createEvaluatedCell({ value: null }));
54445
54528
  var Evaluator = class {
54529
+ context;
54446
54530
  getters;
54447
54531
  compilationParams;
54448
54532
  evaluatedCells = new PositionMap();
@@ -56425,6 +56509,7 @@ var PivotUIPlugin = class extends CoreViewPlugin {
56425
56509
  "getPivot",
56426
56510
  "getFirstPivotFunction",
56427
56511
  "getPivotIdFromPosition",
56512
+ "getPivotIdsFromPosition",
56428
56513
  "getPivotCellFromPosition",
56429
56514
  "generateNewCalculatedMeasureName",
56430
56515
  "isPivotUnused",
@@ -56482,37 +56567,52 @@ var PivotUIPlugin = class extends CoreViewPlugin {
56482
56567
  }
56483
56568
  }
56484
56569
  /**
56485
- * Get the id of the pivot at the given position. Returns undefined if there
56570
+ * Get the id of the first pivot in the formula at the given position. Returns undefined if there
56486
56571
  * is no pivot at this position
56487
56572
  */
56488
56573
  getPivotIdFromPosition(position) {
56574
+ return this.getPivotIdsFromPosition(position)[0];
56575
+ }
56576
+ /**
56577
+ * Get all of the ids of the pivot present in the formula at the given position.
56578
+ */
56579
+ getPivotIdsFromPosition(position) {
56489
56580
  const cell = this.getters.getCorrespondingFormulaCell(position);
56490
- if (cell && cell.isFormula) {
56491
- const pivotFunction = this.getFirstPivotFunction(position.sheetId, cell.compiledFormula.tokens);
56492
- if (pivotFunction) {
56493
- const pivotId = pivotFunction.args[0]?.toString();
56494
- return pivotId && this.getters.getPivotId(pivotId);
56495
- }
56496
- }
56581
+ if (cell && cell.isFormula) return this.getPivotIdsFromFormula(position.sheetId, cell.compiledFormula);
56582
+ return [];
56583
+ }
56584
+ getPivotIdsFromFormula(sheetId, formula) {
56585
+ return this.getPivotFunctions(sheetId, formula.tokens).map((pivotFunction) => {
56586
+ const pivotId = pivotFunction.args[0]?.toString();
56587
+ return pivotId && this.getters.getPivotId(pivotId);
56588
+ }).filter(isDefined);
56497
56589
  }
56498
56590
  isSpillPivotFormula(position) {
56499
56591
  const cell = this.getters.getCorrespondingFormulaCell(position);
56500
56592
  if (cell && cell.isFormula) return this.getFirstPivotFunction(position.sheetId, cell.compiledFormula.tokens)?.functionName === "PIVOT";
56501
56593
  return false;
56502
56594
  }
56503
- getFirstPivotFunction(sheetId, tokens) {
56504
- const pivotFunction = getFirstPivotFunction(tokens);
56505
- if (!pivotFunction) return;
56506
- const { functionName, args } = pivotFunction;
56507
- return {
56508
- functionName,
56509
- args: args.map((argAst) => {
56595
+ getPivotFunctions(sheetId, tokens) {
56596
+ const pivotFunctions = getPivotFunctions(tokens);
56597
+ if (!pivotFunctions.length) return [];
56598
+ const evaluatedPivotFunctions = [];
56599
+ for (const pivotFunction of pivotFunctions) {
56600
+ const { functionName, args } = pivotFunction;
56601
+ const evaluatedArgs = args.map((argAst) => {
56510
56602
  if (argAst.type === "EMPTY") return;
56511
56603
  else if (argAst.type === "STRING" || argAst.type === "BOOLEAN" || argAst.type === "NUMBER") return argAst.value;
56512
56604
  const argsString = astToFormula(argAst);
56513
56605
  return this.getters.evaluateFormula(sheetId, argsString);
56514
- })
56515
- };
56606
+ });
56607
+ evaluatedPivotFunctions.push({
56608
+ functionName,
56609
+ args: evaluatedArgs
56610
+ });
56611
+ }
56612
+ return evaluatedPivotFunctions;
56613
+ }
56614
+ getFirstPivotFunction(sheetId, tokens) {
56615
+ return this.getPivotFunctions(sheetId, tokens)[0];
56516
56616
  }
56517
56617
  /**
56518
56618
  * Returns the domain args of a pivot formula from a position.
@@ -56606,8 +56706,8 @@ var PivotUIPlugin = class extends CoreViewPlugin {
56606
56706
  const unusedPivots = new Set(this.getters.getPivotIds());
56607
56707
  for (const sheetId of this.getters.getSheetIds()) for (const cellId in this.getters.getCells(sheetId)) {
56608
56708
  const position = this.getters.getCellPosition(cellId);
56609
- const pivotId = this.getPivotIdFromPosition(position);
56610
- if (pivotId) {
56709
+ const pivotIds = this.getPivotIdsFromPosition(position);
56710
+ for (const pivotId of pivotIds) {
56611
56711
  unusedPivots.delete(pivotId);
56612
56712
  if (!unusedPivots.size) {
56613
56713
  this.unusedPivots = [];
@@ -56615,6 +56715,21 @@ var PivotUIPlugin = class extends CoreViewPlugin {
56615
56715
  }
56616
56716
  }
56617
56717
  }
56718
+ for (const pivotId of this.getters.getPivotIds()) {
56719
+ const pivot = this.getters.getPivot(pivotId);
56720
+ for (const measure of pivot.definition.measures) if (measure.computedBy) {
56721
+ const { sheetId } = measure.computedBy;
56722
+ const formula = this.getters.getMeasureCompiledFormula(pivotId, measure);
56723
+ const relatedPivotIds = this.getPivotIdsFromFormula(sheetId, formula);
56724
+ for (const relatedPivotId of relatedPivotIds) {
56725
+ unusedPivots.delete(relatedPivotId);
56726
+ if (!unusedPivots.size) {
56727
+ this.unusedPivots = [];
56728
+ return [];
56729
+ }
56730
+ }
56731
+ }
56732
+ }
56618
56733
  this.unusedPivots = [...unusedPivots];
56619
56734
  return this.unusedPivots;
56620
56735
  }
@@ -57767,6 +57882,8 @@ function transformPositionWithMerge(toTransform, executed) {
57767
57882
  //#endregion
57768
57883
  //#region src/collaborative/revisions.ts
57769
57884
  var Revision = class {
57885
+ rootCommand;
57886
+ timestamp;
57770
57887
  id;
57771
57888
  clientId;
57772
57889
  _commands = [];
@@ -57803,6 +57920,9 @@ var Revision = class {
57803
57920
  //#region src/collaborative/session.ts
57804
57921
  var ClientDisconnectedError = class extends Error {};
57805
57922
  var Session = class extends EventBus {
57923
+ revisions;
57924
+ transportService;
57925
+ serverRevisionId;
57806
57926
  /**
57807
57927
  * Positions of the others client.
57808
57928
  */
@@ -61242,6 +61362,9 @@ var GridSelectionPlugin = class extends UIPlugin {
61242
61362
  //#endregion
61243
61363
  //#region src/helpers/internal_viewport.ts
61244
61364
  var InternalViewport = class {
61365
+ getters;
61366
+ sheetId;
61367
+ boundaries;
61245
61368
  top;
61246
61369
  bottom;
61247
61370
  left;
@@ -64455,6 +64578,7 @@ function instantiateClipboard() {
64455
64578
  return new WebClipboardWrapper(navigator.clipboard);
64456
64579
  }
64457
64580
  var WebClipboardWrapper = class {
64581
+ clipboard;
64458
64582
  constructor(clipboard) {
64459
64583
  this.clipboard = clipboard;
64460
64584
  }
@@ -64933,6 +65057,8 @@ function inverseCommand(cmd) {
64933
65057
  * @param operations initial operations
64934
65058
  */
64935
65059
  var Branch = class Branch {
65060
+ buildTransformation;
65061
+ operations;
64936
65062
  constructor(buildTransformation, operations = []) {
64937
65063
  this.buildTransformation = buildTransformation;
64938
65064
  this.operations = operations;
@@ -65049,6 +65175,8 @@ var Branch = class Branch {
65049
65175
  * to revert it).
65050
65176
  */
65051
65177
  var Operation = class {
65178
+ id;
65179
+ data;
65052
65180
  constructor(id, data) {
65053
65181
  this.id = id;
65054
65182
  this.data = data;
@@ -65058,6 +65186,8 @@ var Operation = class {
65058
65186
  }
65059
65187
  };
65060
65188
  var LazyOperation = class LazyOperation {
65189
+ id;
65190
+ lazyData;
65061
65191
  constructor(id, lazyData) {
65062
65192
  this.id = id;
65063
65193
  this.lazyData = lazyData;
@@ -65083,6 +65213,7 @@ var LazyOperation = class LazyOperation {
65083
65213
  * ```
65084
65214
  */
65085
65215
  var OperationSequence = class OperationSequence {
65216
+ operations;
65086
65217
  constructor(operations) {
65087
65218
  this.operations = operations;
65088
65219
  }
@@ -65158,6 +65289,7 @@ var OperationSequence = class OperationSequence {
65158
65289
  *
65159
65290
  */
65160
65291
  var Tree = class {
65292
+ buildTransformation;
65161
65293
  branches;
65162
65294
  branchingOperationIds = /* @__PURE__ */ new Map();
65163
65295
  constructor(buildTransformation, initialBranch) {
@@ -65740,6 +65872,7 @@ var EventStream = class {
65740
65872
  * with the new selected anchor
65741
65873
  */
65742
65874
  var SelectionStreamProcessorImpl = class {
65875
+ getters;
65743
65876
  stream;
65744
65877
  /**
65745
65878
  * "Active" anchor used as a reference to compute new anchors
@@ -69033,6 +69166,6 @@ exports.stores = stores;
69033
69166
  exports.tokenColors = tokenColors;
69034
69167
  exports.tokenize = tokenize;
69035
69168
 
69036
- __info__.version = "18.2.53";
69037
- __info__.date = "2026-05-12T12:17:43.785Z";
69038
- __info__.hash = "d8b08ba";
69169
+ __info__.version = "18.2.54";
69170
+ __info__.date = "2026-05-27T05:56:03.418Z";
69171
+ __info__.hash = "bd06c51";
@@ -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.2.53
6
- * @date 2026-05-12T12:17:45.471Z
7
- * @hash d8b08ba
5
+ * @version 18.2.54
6
+ * @date 2026-05-27T05:56:04.950Z
7
+ * @hash bd06c51
8
8
  */
9
9
  /* Originates from src/components/spreadsheet/spreadsheet.scss */
10
10
  .o-spreadsheet {