@odoo/o-spreadsheet 19.1.0-alpha.8 → 19.1.1

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.
@@ -1,9 +1,9 @@
1
1
  <!--
2
2
  This file is generated by o-spreadsheet build tools. Do not edit it.
3
3
  @see https://github.com/odoo/o-spreadsheet
4
- @version 19.1.0-alpha.8
5
- @date 2025-10-23T08:20:53.153Z
6
- @hash 78717d4
4
+ @version 19.1.1
5
+ @date 2025-12-26T10:27:38.116Z
6
+ @hash e6313bd
7
7
  -->
8
8
  <odoo>
9
9
  <t t-name="o-spreadsheet-ValidationMessages">
@@ -29,9 +29,9 @@
29
29
 
30
30
  <t t-name="o-spreadsheet-TopBar">
31
31
  <div
32
- class="o-spreadsheet-topbar d-flex flex-column user-select-none"
32
+ class="o-spreadsheet-topbar d-flex flex-column user-select-none bg-white"
33
33
  t-on-click="props.onClick">
34
- <div t-if="!env.isSmall" class="o-topbar-top d-flex justify-content-between">
34
+ <div t-if="!env.isSmall" class="o-topbar-top d-flex justify-content-between border-bottom">
35
35
  <!-- Menus -->
36
36
  <div class="o-topbar-topleft d-flex">
37
37
  <t t-foreach="menus" t-as="menu" t-key="menu_index">
@@ -82,7 +82,7 @@
82
82
  t-key="toolbarAction_index">
83
83
  <t t-component="toolbarAction.component" t-props="toolbarAction.props"/>
84
84
  </t>
85
- <div t-if="showDivider(category_index)" class="o-topbar-divider"/>
85
+ <div t-if="showDivider(category_index)" class="o-topbar-divider border-end"/>
86
86
  </div>
87
87
  <div
88
88
  t-ref="moreToolsContainer"
@@ -100,7 +100,7 @@
100
100
  </div>
101
101
  <div
102
102
  t-if="this.fingerprints.isEnabled"
103
- class="irregularity-map d-flex align-items-center justify-content-between">
103
+ class="topbar-banner irregularity-map d-flex align-items-center justify-content-between border-top">
104
104
  <div
105
105
  t-on-click="() => this.fingerprints.disable()"
106
106
  role="button"
@@ -132,7 +132,7 @@
132
132
  popoverPositioning="'bottom-left'"
133
133
  />
134
134
  <Popover t-if="state.toolsPopoverState.isOpen" t-props="toolsPopoverProps">
135
- <div class="d-flex px-2 py-1 flex-wrap align-items-center" style="background-color:white;">
135
+ <div class="d-flex px-2 py-1 flex-wrap align-items-center bg-white">
136
136
  <t
137
137
  t-foreach="state.invisibleToolsCategories"
138
138
  t-as="category"
@@ -146,13 +146,28 @@
146
146
  </t>
147
147
  <div
148
148
  t-if="category_index &lt; state.invisibleToolsCategories.length-1"
149
- class="o-topbar-divider"
149
+ class="o-topbar-divider border-end"
150
150
  />
151
151
  </t>
152
152
  </div>
153
153
  </Popover>
154
154
  </t>
155
155
 
156
+ <div t-name="o-spreadsheet-TopBarZoom" t-ref="buttonRef" t-on-click.stop="">
157
+ <NumberEditor
158
+ currentValue="currentFontSize"
159
+ onValueChange.bind="this.setZoom"
160
+ class="props.class"
161
+ onToggle.bind="this.toggle"
162
+ onFocusInput.bind="this.onFocusInput"
163
+ valueIcon="'%'"
164
+ min="25"
165
+ max="300"
166
+ valueList="valueList"
167
+ title.translate="Zoom"
168
+ />
169
+ </div>
170
+
156
171
  <div t-name="o-spreadsheet-NumberFormatsTool" t-ref="buttonRef" t-on-click.stop="">
157
172
  <ActionButton
158
173
  action="formatNumberMenuItemSpec"
@@ -191,7 +206,7 @@
191
206
  class="props.class"
192
207
  />
193
208
  <Popover t-if="isActive" t-props="popoverProps">
194
- <div class="o-dropdown-content p-1" t-if="isActive" t-on-click.stop="">
209
+ <div class="o-dropdown-content p-1 bg-white" t-if="isActive" t-on-click.stop="">
195
210
  <div class="o-dropdown-line">
196
211
  <t t-foreach="props.childActions" t-as="action" t-key="action_index">
197
212
  <ActionButton action="action" class="props.childClass"/>
@@ -215,27 +230,33 @@
215
230
  </div>
216
231
  </t>
217
232
 
218
- <div t-name="o-spreadsheet-TextInput" class="w-100">
219
- <input
220
- t-ref="input"
221
- class="os-input w-100"
222
- type="text"
223
- t-att-class="inputClass"
224
- t-att-id="props.id"
225
- t-att-placeholder="props.placeholder"
226
- t-att-value="props.value"
227
- t-on-change="save"
228
- t-on-blur="save"
229
- t-on-pointerdown="onMouseDown"
230
- t-on-pointerup="onMouseUp"
231
- t-on-keydown="onKeyDown"
232
- />
233
- </div>
233
+ <t t-name="o-spreadsheet-TextInput">
234
+ <div class="position-relative">
235
+ <input
236
+ type="text"
237
+ t-ref="{{refName}}"
238
+ t-att-class="inputClass"
239
+ t-att-id="props.id"
240
+ t-att-placeholder="props.placeholder"
241
+ t-on-change="save"
242
+ t-on-blur="save"
243
+ t-on-pointerdown="onMouseDown"
244
+ t-on-pointerup="onMouseUp"
245
+ t-on-keydown="onKeyDown"
246
+ />
247
+ <span
248
+ t-if="props.errorMessage"
249
+ class="os-input-error-icon text-danger position-absolute d-flex align-items-center"
250
+ t-att-title="props.errorMessage">
251
+ <t t-call="o-spreadsheet-Icon.ERROR"/>
252
+ </span>
253
+ </div>
254
+ </t>
234
255
 
235
256
  <t t-name="o-spreadsheet-TableStylesPopover">
236
257
  <Popover t-if="props.popoverProps" t-props="props.popoverProps">
237
258
  <div
238
- class="o-table-style-popover d-flex flex-column py-3"
259
+ class="o-table-style-popover d-flex flex-column py-3 bg-white"
239
260
  t-ref="tableStyleList"
240
261
  t-on-contextmenu.prevent="">
241
262
  <div class="d-flex o-notebook ps-4 mb-3">
@@ -243,7 +264,7 @@
243
264
  t-foreach="Object.keys(categories)"
244
265
  t-as="category"
245
266
  t-key="category"
246
- class="o-notebook-tab d-flex align-items-center"
267
+ class="o-notebook-tab d-flex align-items-center border"
247
268
  t-att-class="{ 'selected': state.selectedCategory === category }"
248
269
  t-on-click="() => state.selectedCategory = category"
249
270
  t-att-data-id="category"
@@ -284,7 +305,7 @@
284
305
  <canvas t-ref="canvas" class="w-100 h-100"/>
285
306
  </div>
286
307
  <div
287
- class="o-table-style-edit-button position-absolute d-none"
308
+ class="o-table-style-edit-button position-absolute d-none bg-white border"
288
309
  t-if="isStyleEditable"
289
310
  t-on-click="this.editTableStyle"
290
311
  title="Edit custom table style">
@@ -300,7 +321,7 @@
300
321
  </t>
301
322
 
302
323
  <t t-name="o-spreadsheet-TableStylePicker">
303
- <div class="o-table-style-picker d-flex flew-row justify-content-between ps-1">
324
+ <div class="o-table-style-picker d-flex flew-row justify-content-between ps-1 border rounded">
304
325
  <div class="d-flex flex-row overflow-hidden ps-2">
305
326
  <t t-foreach="getDisplayedTableStyles()" t-as="styleId" t-key="styleId">
306
327
  <TableStylePreview
@@ -314,7 +335,7 @@
314
335
  </t>
315
336
  </div>
316
337
  <div
317
- class="o-table-style-picker-arrow d-flex align-items-center px-1"
338
+ class="o-table-style-picker-arrow d-flex align-items-center px-1 border-start"
318
339
  t-on-click.stop="onArrowButtonClick">
319
340
  <t t-call="o-spreadsheet-Icon.CARET_DOWN"/>
320
341
  </div>
@@ -356,7 +377,7 @@
356
377
  <t t-name="o-spreadsheet-Spreadsheet">
357
378
  <div
358
379
  class="o-spreadsheet h-100 w-100"
359
- t-att-class="{'o-spreadsheet-mobile': env.isSmall}"
380
+ t-att-class="getSpreadSheetClasses()"
360
381
  t-ref="spreadsheet"
361
382
  t-att-style="getStyle()">
362
383
  <t t-if="env.isDashboard()">
@@ -373,10 +394,10 @@
373
394
  t-att-style="gridContainerStyle"
374
395
  t-on-click="this.focusGrid">
375
396
  <div class="o-top-left"/>
376
- <div class="o-column-groups">
397
+ <div class="o-column-groups o-zoomable">
377
398
  <HeaderGroupContainer layers="colLayers" dimension="'COL'"/>
378
399
  </div>
379
- <div class="o-row-groups">
400
+ <div class="o-row-groups o-zoomable">
380
401
  <HeaderGroupContainer layers="rowLayers" dimension="'ROW'"/>
381
402
  </div>
382
403
  <div class="o-group-grid overflow-hidden">
@@ -398,7 +419,7 @@
398
419
  <RibbonMenu onClose="() => this.menuState.isOpen=false"/>
399
420
  </t>
400
421
  <t t-else="">
401
- <div class="o-small-composer px-2 py-2 position-relative">
422
+ <div class="o-small-composer px-2 py-2 position-relative bg-white border">
402
423
  <div class="w-100" t-ref="bottombarComposer">
403
424
  <Composer t-props="composerProps"/>
404
425
  <span
@@ -430,7 +451,7 @@
430
451
  composerFocusableElement="true"
431
452
  />
432
453
  </div>
433
- <div class="d-flex flex-fill align-items-center bottom-bar-menu">
454
+ <div class="d-flex flex-fill align-items-center bottom-bar-menu border-top border-bottom">
434
455
  <Ripple>
435
456
  <div class="py-1 px-1 mx-2 ribbon-toggler" t-on-click="toggleRibbon">
436
457
  <i class="o-icon fa fa-cog"/>
@@ -514,12 +535,12 @@
514
535
  value="tableConfig.numberOfHeaders > 0"
515
536
  onChange.bind="this.updateHasHeaders"
516
537
  />
517
- <input
538
+ <NumberInput
518
539
  t-if="tableConfig.numberOfHeaders > 0"
519
- t-att-value="tableConfig.numberOfHeaders"
520
- type="number"
521
- class="o-table-n-of-headers ms-2 o-input"
522
- t-on-change="onChangeNumberOfHeaders"
540
+ value="tableConfig.numberOfHeaders"
541
+ class="'o-table-n-of-headers ms-2'"
542
+ min="0"
543
+ onChange.bind="onChangeNumberOfHeaders"
523
544
  />
524
545
  </div>
525
546
  <Checkbox
@@ -677,8 +698,9 @@
677
698
  </t>
678
699
 
679
700
  <t t-name="o-spreadsheet-SidePanelExtended">
680
- <div class="o-sidePanel h-100">
681
- <div class="o-sidePanelHeader d-flex align-items-center justify-content-between">
701
+ <div class="o-sidePanel h-100 bg-white border-top border-start">
702
+ <div
703
+ class="o-sidePanelHeader d-flex align-items-center justify-content-between border-bottom">
682
704
  <div
683
705
  t-if="props.onToggleCollapsePanel"
684
706
  class="o-collapse-panel o-sidePanelAction rounded"
@@ -722,7 +744,9 @@
722
744
  </t>
723
745
 
724
746
  <t t-name="o-spreadsheet-SidePanelCollapsed">
725
- <div class="o-sidePanel collapsed w-100 h-100" t-on-click="props.onToggleCollapsePanel">
747
+ <div
748
+ class="o-sidePanel collapsed w-100 h-100 bg-white"
749
+ t-on-click="props.onToggleCollapsePanel">
726
750
  <div class="d-flex flex-column align-items-center">
727
751
  <div
728
752
  t-if="props.onToggleCollapsePanel"
@@ -761,7 +785,7 @@
761
785
  t-att-selected="currentLocale.code === locale.code"
762
786
  />
763
787
  </select>
764
- <div class="o-locale-preview mt-4 p-3 rounded">
788
+ <div class="o-locale-preview mt-4 p-3 rounded border">
765
789
  <div>
766
790
  <span class="o-fw-bold me-1">Number:</span>
767
791
  <span t-esc="numberFormatPreview"/>
@@ -864,7 +888,12 @@
864
888
  <CogWheelMenu items="cogWheelMenuItems"/>
865
889
  </div>
866
890
  </t>
867
- <TextInput class="'os-pivot-title'" value="name" onChange.bind="onNameChanged"/>
891
+ <TextInput
892
+ class="'os-pivot-title'"
893
+ value="name"
894
+ onChange.bind="onNameChanged"
895
+ selectContentOnFocus="true"
896
+ />
868
897
  </Section>
869
898
  </t>
870
899
 
@@ -954,24 +983,22 @@
954
983
  <div class="row mb-2 align-items-center">
955
984
  <div class="col-6">Max rows:</div>
956
985
  <div class="col-6 d-flex align-items-center">
957
- <input
958
- t-att-value="pivotStyle.numberOfRows ?? ''"
959
- type="number"
960
- class="o-pivot-n-of-rows o-input"
961
- placeholder="e.g. 10"
962
- t-on-change="(ev) => this.updatePivotStyleProperty('numberOfRows', ev.target.valueAsNumber)"
986
+ <NumberInput
987
+ value="pivotStyle.numberOfRows ?? ''"
988
+ class="'o-pivot-n-of-rows'"
989
+ placeholder.translate="e.g. 10"
990
+ onChange="(value) => this.updatePivotStyleNumberProperty(value, 'numberOfRows')"
963
991
  />
964
992
  </div>
965
993
  </div>
966
994
  <div class="row mb-2 align-items-center">
967
995
  <div class="col-6">Max columns:</div>
968
996
  <div class="col-6 d-flex align-items-center">
969
- <input
970
- t-att-value="pivotStyle.numberOfColumns ?? ''"
971
- type="number"
972
- class="o-pivot-n-of-columns o-input"
973
- placeholder="e.g. 5"
974
- t-on-change="(ev) => this.updatePivotStyleProperty('numberOfColumns', ev.target.valueAsNumber)"
997
+ <NumberInput
998
+ value="pivotStyle.numberOfColumns ?? ''"
999
+ class="'o-pivot-n-of-columns'"
1000
+ placeholder.translate="e.g. 5"
1001
+ onChange="(value) => this.updatePivotStyleNumberProperty(value, 'numberOfColumns')"
975
1002
  />
976
1003
  </div>
977
1004
  </div>
@@ -1024,13 +1051,13 @@
1024
1051
  </t>
1025
1052
  </select>
1026
1053
  <div
1027
- class="o-pivot-measure-display-description mt-3 ps-3"
1054
+ class="o-pivot-measure-display-description mt-3 ps-3 border-start"
1028
1055
  t-esc="measureDisplayDescription[store.measureDisplay.type]"
1029
1056
  />
1030
1057
  </Section>
1031
1058
 
1032
1059
  <Section t-if="store.doesDisplayNeedsField" title.translate="Base field:">
1033
- <div class="o-pivot-measure-display-field w-100 py-1 px-3">
1060
+ <div class="o-pivot-measure-display-field w-100 py-1 px-3 border">
1034
1061
  <t t-if="store.fields.length">
1035
1062
  <RadioSelection
1036
1063
  choices="fieldChoices"
@@ -1048,7 +1075,7 @@
1048
1075
 
1049
1076
  <t t-set="values" t-value="store.values"/>
1050
1077
  <Section t-if="store.doesDisplayNeedsValue and values.length" title.translate="Base item:">
1051
- <div class="o-pivot-measure-display-value w-100 py-1 px-3">
1078
+ <div class="o-pivot-measure-display-value w-100 py-1 px-3 border">
1052
1079
  <RadioSelection
1053
1080
  choices="values"
1054
1081
  selectedValue="store.measureDisplay.value"
@@ -1191,7 +1218,7 @@
1191
1218
  <div t-esc="sortDescription" class="pb-2"/>
1192
1219
  <div class="d-flex flex-column gap-2">
1193
1220
  <t t-foreach="sortValuesAndFields" t-as="valueAndField" t-key="valueAndField_index">
1194
- <div class="o-sort-card d-flex gap-1 px-2">
1221
+ <div class="o-sort-card d-flex gap-1 px-2 border">
1195
1222
  <t t-if="valueAndField.field">
1196
1223
  <span class="fw-bolder" t-esc="valueAndField.field"/>
1197
1224
  =
@@ -1303,7 +1330,7 @@
1303
1330
 
1304
1331
  <t t-name="o-spreadsheet-PivotDimension">
1305
1332
  <div
1306
- class="py-1 px-2 d-flex flex-column shadow-sm pivot-dimension"
1333
+ class="py-1 px-2 d-flex flex-column shadow-sm pivot-dimension border rounded"
1307
1334
  t-att-class="{'pivot-dimension-invalid': !props.dimension.isValid}">
1308
1335
  <div class="d-flex flex-row justify-content-between align-items-center">
1309
1336
  <div class="d-flex align-items-center overflow-hidden text-nowrap">
@@ -1315,6 +1342,7 @@
1315
1342
  value="props.dimension.displayName"
1316
1343
  onChange.bind="updateName"
1317
1344
  class="'o-fw-bold'"
1345
+ selectContentOnFocus="true"
1318
1346
  />
1319
1347
  <span t-else="1" class="o-fw-bold" t-esc="props.dimension.displayName"/>
1320
1348
  </div>
@@ -1335,7 +1363,7 @@
1335
1363
  <button class="add-dimension o-button" t-on-click="togglePopover" t-ref="button">Add</button>
1336
1364
  <Popover t-if="popover.isOpen" t-props="popoverProps">
1337
1365
  <div
1338
- class="p-2 bg-white border-bottom d-flex sticky-top align-items-baseline pivot-dimension-search">
1366
+ class="p-2 bg-white border-bottom d-flex sticky-top align-items-baseline pivot-dimension-search bg-white">
1339
1367
  <i class="pe-1 pivot-dimension-search-field-icon text-muted">
1340
1368
  <t t-call="o-spreadsheet-Icon.SEARCH"/>
1341
1369
  </i>
@@ -1399,6 +1427,7 @@
1399
1427
  <TextInput
1400
1428
  value="group.name"
1401
1429
  onChange="(newName) => this.onRenameGroup(group_index, newName)"
1430
+ selectContentOnFocus="true"
1402
1431
  />
1403
1432
  <i
1404
1433
  class="o-button-icon ps-3 fa fa-trash"
@@ -1419,21 +1448,97 @@
1419
1448
 
1420
1449
  <t t-name="o-spreadsheet-MoreFormatsPanel">
1421
1450
  <div class="o-more-formats-panel">
1422
- <div
1423
- t-foreach="dateFormatsActions"
1424
- t-as="action"
1425
- t-key="action.name(env)"
1426
- t-att-data-name="action.name(env)"
1427
- t-on-click="() => action.execute(env)"
1428
- class="w-100 d-flex align-items-center border-bottom format-preview">
1429
- <span class="ms-3 check-icon">
1430
- <t t-if="action.isActive(env)" t-call="o-spreadsheet-Icon.CHECK"/>
1431
- </span>
1432
- <span t-out="action.description(env)"/>
1433
- </div>
1451
+ <Section title.translate="Format type">
1452
+ <BadgeSelection
1453
+ choices="store.categories"
1454
+ onChange.bind="(category) => store.changeCategory(category)"
1455
+ selectedValue="store.category"
1456
+ />
1457
+ </Section>
1458
+ <t t-if="store.category === 'currency'" t-call="o-spreadsheet-CustomCurrencySection"/>
1459
+ <t t-set="proposals" t-value="store.formatProposals"/>
1460
+ <Section title.translate="Type" t-if="proposals.length">
1461
+ <div class="o-format-proposals overflow-auto border">
1462
+ <div
1463
+ t-foreach="proposals"
1464
+ t-as="proposal"
1465
+ t-key="proposal.format"
1466
+ t-att-data-name="proposal.format"
1467
+ t-on-click="() => this.store.updateFormat(proposal.format)"
1468
+ class="w-100 d-flex align-items-center format-preview px-2 py-1"
1469
+ t-att-class="{'active': (proposal.format || '') === (store.currentFormat || '')}">
1470
+ <span t-out="proposal.label"/>
1471
+ </div>
1472
+ </div>
1473
+ </Section>
1474
+
1475
+ <Section title.translate="Format" class="'o-custom-format-section'">
1476
+ <TextInput
1477
+ value="store.currentFormat || ''"
1478
+ onChange="(format) => this.store.updateFormat(format)"
1479
+ placeholder.translate="Format code"
1480
+ alwaysShowBorder="true"
1481
+ errorMessage="store.invalidFormatMessage"
1482
+ />
1483
+ <t t-set="examples" t-value="store.formatExamples"/>
1484
+ <div class="o-format-examples mt-4 p-2 rounded border" t-if="examples.length">
1485
+ <table class="w-100">
1486
+ <t t-foreach="examples" t-as="example" t-key="example_index">
1487
+ <tr>
1488
+ <td class="w-25 pe-3 o-fw-bold" t-esc="example.label"/>
1489
+ <td class="w-75 text-truncate" t-esc="example.value"/>
1490
+ </tr>
1491
+ </t>
1492
+ </table>
1493
+ </div>
1494
+ </Section>
1434
1495
  </div>
1435
1496
  </t>
1436
1497
 
1498
+ <t t-name="o-spreadsheet-CustomCurrencySection">
1499
+ <t t-set="availableCurrencies" t-value="store.availableCurrencies"/>
1500
+ <Section t-if="availableCurrencies.length > 1" title.translate="Currency">
1501
+ <select
1502
+ class="o-input o-available-currencies"
1503
+ t-on-change="(ev) => this.updateSelectCurrency(ev)">
1504
+ <t t-foreach="availableCurrencies" t-as="currency" t-key="currency_index">
1505
+ <option
1506
+ t-att-value="currency_index"
1507
+ t-esc="currencyDisplayName(currency)"
1508
+ t-att-selected="currency_index === store.selectedCurrencyIndex"
1509
+ />
1510
+ </t>
1511
+ </select>
1512
+ </Section>
1513
+ <Section>
1514
+ <div class="o-subsection-left">
1515
+ <div class="o-section-title">Code</div>
1516
+ <TextInput
1517
+ value="store.currencyCode"
1518
+ placeholder.translate="code"
1519
+ onChange="(code) => this.store.changeCurrencyCode(code)"
1520
+ alwaysShowBorder="true"
1521
+ />
1522
+ </div>
1523
+ <div class="o-subsection-right">
1524
+ <div class="o-section-title">Symbol</div>
1525
+ <TextInput
1526
+ value="store.currencySymbol"
1527
+ placeholder.translate="symbol"
1528
+ onChange="(symbol) => this.store.changeCurrencySymbol(symbol)"
1529
+ alwaysShowBorder="true"
1530
+ />
1531
+ </div>
1532
+ <Checkbox
1533
+ name="'accountingFormat'"
1534
+ className="'pt-2'"
1535
+ label.translate="Accounting format"
1536
+ value="store.isAccountingFormat"
1537
+ onChange="() => store.toggleAccountingFormat()"
1538
+ />
1539
+ </Section>
1540
+ </t>
1541
+
1437
1542
  <t t-name="o-spreadsheet-FindAndReplacePanel">
1438
1543
  <div class="o-find-and-replace">
1439
1544
  <Section title.translate="Search">
@@ -1563,7 +1668,7 @@
1563
1668
  </t>
1564
1669
 
1565
1670
  <t t-name="o-spreadsheet-DataValidationPreview">
1566
- <div class="o-dv-preview p-3" t-on-click="props.onClick" t-ref="dvPreview">
1671
+ <div class="o-dv-preview p-3 border-bottom" t-on-click="props.onClick" t-ref="dvPreview">
1567
1672
  <div class="d-flex justify-content-between">
1568
1673
  <div class="o-dv-container d-flex flex-column">
1569
1674
  <div class="o-dv-preview-description o-fw-bold text-truncate" t-esc="descriptionString"/>
@@ -1602,6 +1707,7 @@
1602
1707
  t-key="state.rule.criterion.type"
1603
1708
  criterion="state.rule.criterion"
1604
1709
  onCriterionChanged.bind="onCriterionChanged"
1710
+ autofocus="state.isTypeUpdated"
1605
1711
  />
1606
1712
  </div>
1607
1713
  </Section>
@@ -1625,93 +1731,13 @@
1625
1731
  </div>
1626
1732
  </t>
1627
1733
 
1628
- <t t-name="o-spreadsheet-CustomCurrencyPanel">
1629
- <div class="o-custom-currency">
1630
- <Section t-if="availableCurrencies.length > 1" title.translate="Currency">
1631
- <select
1632
- class="o-input o-available-currencies"
1633
- t-on-change="(ev) => this.updateSelectCurrency(ev)">
1634
- <t t-foreach="availableCurrencies" t-as="currency" t-key="currency_index">
1635
- <option
1636
- t-att-value="currency_index"
1637
- t-esc="currencyDisplayName(currency)"
1638
- t-att-selected="currency_index === state.selectedCurrencyIndex"
1639
- />
1640
- </t>
1641
- </select>
1642
- </Section>
1643
- <Section>
1644
- <div class="o-subsection-left">
1645
- <div class="o-section-title">Code</div>
1646
- <input
1647
- type="text"
1648
- class="o-input"
1649
- t-model="state.currencyCode"
1650
- placeholder="code"
1651
- t-on-input="(ev) => this.updateCode(ev)"
1652
- />
1653
- </div>
1654
- <div class="o-subsection-right">
1655
- <div class="o-section-title">Symbol</div>
1656
- <input
1657
- type="text"
1658
- class="o-input"
1659
- placeholder="symbol"
1660
- t-model="state.currencySymbol"
1661
- t-on-input="(ev) => this.updateSymbol(ev)"
1662
- />
1663
- </div>
1664
- </Section>
1665
- <Section title.translate="Format">
1666
- <select
1667
- class="o-input o-format-proposals mb-1"
1668
- t-on-change="(ev) => this.updateSelectFormat(ev)"
1669
- t-att-disabled="!formatProposals.length">
1670
- <t t-foreach="formatProposals" t-as="proposal" t-key="proposal_index">
1671
- <option
1672
- t-att-value="proposal_index"
1673
- t-esc="proposal.example"
1674
- t-att-selected="proposal_index === state.selectedFormatIndex"
1675
- />
1676
- </t>
1677
- </select>
1678
- <t t-set="accounting_format_label">Accounting format</t>
1679
- <Checkbox
1680
- name="'accountingFormat'"
1681
- label="accounting_format_label"
1682
- value="state.isAccountingFormat"
1683
- onChange.bind="toggleAccountingFormat"
1684
- />
1685
- <div class="o-format-examples mt-4" t-if="selectedFormat">
1686
- <table class="w-100">
1687
- <t t-foreach="getFormatExamples()" t-as="example" t-key="example_index">
1688
- <tr>
1689
- <td class="w-25 pe-3 o-fw-bold" t-esc="example.label"/>
1690
- <td class="w-75 text-truncate" t-esc="example.value"/>
1691
- </tr>
1692
- </t>
1693
- </table>
1694
- </div>
1695
- </Section>
1696
- <Section>
1697
- <div class="o-sidePanelButtons">
1698
- <button
1699
- class="o-button primary"
1700
- t-on-click="() => this.apply()"
1701
- t-att-disabled="!formatProposals.length || isSameFormat">
1702
- Apply
1703
- </button>
1704
- </div>
1705
- </Section>
1706
- </div>
1707
- </t>
1708
-
1709
1734
  <t t-name="o-spreadsheet-ValueInRangeCriterionForm">
1710
1735
  <SelectionInput
1711
1736
  ranges="[props.criterion.values[0] || '']"
1712
1737
  onSelectionChanged="(ranges) => this.onRangeChanged(ranges[0])"
1713
1738
  required="true"
1714
1739
  hasSingleRange="true"
1740
+ autofocus="props.autofocus"
1715
1741
  />
1716
1742
  <t t-foreach="values" t-as="value" t-key="value_index">
1717
1743
  <div class="o-dv-list-values p-1 d-flex align-items-center">
@@ -1781,6 +1807,7 @@
1781
1807
  onValueChanged.bind="onValueChanged"
1782
1808
  criterionType="props.criterion.type"
1783
1809
  disableFormulas="props.disableFormulas"
1810
+ focused="props.autofocus"
1784
1811
  />
1785
1812
  </t>
1786
1813
 
@@ -1790,6 +1817,7 @@
1790
1817
  onValueChanged.bind="onFirstValueChanged"
1791
1818
  criterionType="props.criterion.type"
1792
1819
  disableFormulas="props.disableFormulas"
1820
+ focused="props.autofocus"
1793
1821
  />
1794
1822
  <CriterionInput
1795
1823
  value="props.criterion.values[1]"
@@ -1807,16 +1835,17 @@
1807
1835
  t-key="dateValue.value"
1808
1836
  t-att-value="dateValue.value"
1809
1837
  t-esc="dateValue.title"
1810
- t-att-selected="dateValue.value === props.criterion.dateValue"
1838
+ t-att-selected="dateValue.value === currentDateValue"
1811
1839
  />
1812
1840
  </select>
1813
1841
 
1814
1842
  <CriterionInput
1815
- t-if="props.criterion.dateValue === 'exactDate'"
1843
+ t-if="currentDateValue === 'exactDate'"
1816
1844
  value="props.criterion.values[0]"
1817
1845
  onValueChanged.bind="onValueChanged"
1818
1846
  criterionType="props.criterion.type"
1819
1847
  disableFormulas="props.disableFormulas"
1848
+ focused="props.autofocus"
1820
1849
  />
1821
1850
  </t>
1822
1851
 
@@ -1895,47 +1924,45 @@
1895
1924
  <t t-name="o-spreadsheet-ConditionalFormatPreview">
1896
1925
  <t t-set="cf" t-value="props.conditionalFormat"/>
1897
1926
  <div
1898
- class="o-cf-preview w-100"
1927
+ class="o-cf-preview w-100 d-flex align-items-center border-bottom"
1899
1928
  t-ref="cfPreview"
1900
1929
  t-att-class="props.class"
1901
1930
  t-att-data-id="cf.id"
1902
1931
  t-on-click="props.onPreviewClick"
1903
1932
  t-on-pointerdown="(ev) => this.onMouseDown(ev)">
1904
- <div class="position-relative h-100 w-100 d-flex align-items-center">
1933
+ <div class="o-cf-drag-handle h-100 position-absolute d-flex align-items-center o-button-icon">
1934
+ <t t-call="o-spreadsheet-Icon.THIN_DRAG_HANDLE"/>
1935
+ </div>
1936
+ <t t-if="cf.rule.type==='IconSetRule'">
1905
1937
  <div
1906
- class="o-cf-drag-handle h-100 position-absolute d-flex align-items-center o-button-icon">
1907
- <t t-call="o-spreadsheet-Icon.THIN_DRAG_HANDLE"/>
1908
- </div>
1909
- <t t-if="cf.rule.type==='IconSetRule'">
1910
- <div class="o-cf-preview-icon d-flex justify-content-around align-items-center me-2">
1911
- <t t-call="o-spreadsheet-Icon.{{icons[cf.rule.icons.upper].template}}"/>
1912
- <t t-call="o-spreadsheet-Icon.{{icons[cf.rule.icons.middle].template}}"/>
1913
- <t t-call="o-spreadsheet-Icon.{{icons[cf.rule.icons.lower].template}}"/>
1914
- </div>
1915
- </t>
1916
- <t t-else="">
1917
- <div
1918
- t-att-style="getPreviewImageStyle(cf.rule)"
1919
- class="o-cf-preview-icon d-flex justify-content-around align-items-center me-2">
1920
- 123
1921
- </div>
1922
- </t>
1923
- <div class="o-cf-preview-description">
1924
- <div class="o-cf-preview-ruletype">
1925
- <div class="o-cf-preview-description-rule o-fw-bold text-truncate">
1926
- <t t-esc="getDescription(cf)"/>
1927
- </div>
1928
- </div>
1929
- <div class="o-cf-preview-range text-truncate" t-esc="cf.ranges"/>
1938
+ class="o-cf-preview-icon d-flex justify-content-around align-items-center me-3 bg-white border">
1939
+ <t t-call="o-spreadsheet-Icon.{{icons[cf.rule.icons.upper].template}}"/>
1940
+ <t t-call="o-spreadsheet-Icon.{{icons[cf.rule.icons.middle].template}}"/>
1941
+ <t t-call="o-spreadsheet-Icon.{{icons[cf.rule.icons.lower].template}}"/>
1930
1942
  </div>
1931
- <div class="o-cf-delete">
1932
- <div
1933
- class="o-cf-delete-button o-button-icon"
1934
- t-on-click.stop="(ev) => this.deleteConditionalFormat(cf, ev)"
1935
- title="Remove rule">
1936
- <t t-call="o-spreadsheet-Icon.TRASH_FILLED"/>
1943
+ </t>
1944
+ <t t-else="">
1945
+ <div
1946
+ t-att-style="getPreviewImageStyle(cf.rule)"
1947
+ class="o-cf-preview-icon d-flex justify-content-around align-items-center me-3 flex-shrink-0 border">
1948
+ 123
1949
+ </div>
1950
+ </t>
1951
+ <div class="o-cf-preview-description me-3 overflow-auto">
1952
+ <div class="o-cf-preview-ruletype">
1953
+ <div class="o-cf-preview-description-rule o-fw-bold text-truncate">
1954
+ <t t-esc="getDescription(cf)"/>
1937
1955
  </div>
1938
1956
  </div>
1957
+ <div class="o-cf-preview-range text-truncate" t-esc="cf.ranges"/>
1958
+ </div>
1959
+ <div class="o-cf-delete ms-auto">
1960
+ <div
1961
+ class="o-cf-delete-button o-button-icon"
1962
+ t-on-click.stop="(ev) => this.deleteConditionalFormat(cf, ev)"
1963
+ title="Remove rule">
1964
+ <t t-call="o-spreadsheet-Icon.TRASH_FILLED"/>
1965
+ </div>
1939
1966
  </div>
1940
1967
  </div>
1941
1968
  </t>
@@ -1945,7 +1972,7 @@
1945
1972
  <div class="o-section-subtitle">Icons</div>
1946
1973
  <div class="o-cf-iconsets d-flex flex-row">
1947
1974
  <div
1948
- class="o-cf-iconset o-cf-clickable-icon d-flex flex-row justify-content-between"
1975
+ class="o-cf-iconset o-cf-clickable-icon d-flex flex-row justify-content-between border rounded"
1949
1976
  t-foreach="['arrows', 'smiley', 'dots']"
1950
1977
  t-as="iconSet"
1951
1978
  t-key="iconSet"
@@ -1968,7 +1995,7 @@
1968
1995
  <tr>
1969
1996
  <td>
1970
1997
  <div t-on-click.stop="(ev) => this.toggleMenu('iconSet-'+icon+'Icon', ev)">
1971
- <div class="o-cf-icon-button o-cf-clickable-icon me-3">
1998
+ <div class="o-cf-icon-button o-cf-clickable-icon me-3 border rounded">
1972
1999
  <t t-call="o-spreadsheet-Icon.{{icons[iconValue].template}}"/>
1973
2000
  </div>
1974
2001
  </div>
@@ -2051,7 +2078,7 @@
2051
2078
  <tr>
2052
2079
  <td>
2053
2080
  <div t-on-click.stop="(ev) => this.toggleMenu('iconSet-lowerIcon', ev)">
2054
- <div class="o-cf-icon-button o-cf-clickable-icon me-3">
2081
+ <div class="o-cf-icon-button o-cf-clickable-icon me-3 border rounded">
2055
2082
  <t t-call="o-spreadsheet-Icon.{{icons[rule.icons.lower].template}}"/>
2056
2083
  </div>
2057
2084
  </div>
@@ -2166,7 +2193,7 @@
2166
2193
  <t t-name="o-spreadsheet-ColorScaleRuleEditor">
2167
2194
  <div class="o-cf-color-scale-editor">
2168
2195
  <div class="o-section-subtitle">Preview</div>
2169
- <div class="o-cf-preview-display mb-4" t-attf-style="{{getPreviewGradient()}}">
2196
+ <div class="o-cf-preview-display mb-4" t-attf-style="{{getColorScalePreviewStyle()}}">
2170
2197
  Preview text
2171
2198
  </div>
2172
2199
  <div class="o-section-subtitle">Minpoint</div>
@@ -2245,7 +2272,7 @@
2245
2272
 
2246
2273
  <t t-name="o-spreadsheet-CellIsRuleEditorPreview">
2247
2274
  <div
2248
- class="o-cf-preview-display"
2275
+ class="o-cf-preview-display border"
2249
2276
  t-attf-style="font-weight:{{currentStyle.bold ?'bold':'normal'}};
2250
2277
  text-decoration:{{getTextDecoration(currentStyle)}};
2251
2278
  font-style:{{currentStyle.italic?'italic':'normal'}};
@@ -2273,6 +2300,7 @@
2273
2300
  t-key="state.rules.cellIs.operator"
2274
2301
  criterion="genericCriterion"
2275
2302
  onCriterionChanged.bind="onRuleValuesChanged"
2303
+ autofocus="this.state.hasEditedCf"
2276
2304
  />
2277
2305
 
2278
2306
  <div class="o-section-subtitle pt-3">Formatting style</div>
@@ -2318,7 +2346,7 @@
2318
2346
  icon="'o-spreadsheet-Icon.TEXT_COLOR'"
2319
2347
  class="'o-hoverable-button o-menu-item-button'"
2320
2348
  />
2321
- <div class="o-divider"/>
2349
+ <div class="o-divider border-end"/>
2322
2350
  <ColorPickerWidget
2323
2351
  currentColor="rule.style.fillColor"
2324
2352
  toggleColorPicker="(ev) => this.toggleMenu('cellIsRule-fillColor', ev)"
@@ -2346,7 +2374,7 @@
2346
2374
 
2347
2375
  <t t-name="o-spreadsheet.RoundColorPicker">
2348
2376
  <div
2349
- class="o-round-color-picker-button rounded-circle"
2377
+ class="o-round-color-picker-button rounded-circle border"
2350
2378
  t-ref="colorPickerButton"
2351
2379
  t-on-click.stop="togglePicker"
2352
2380
  t-att-title="props.title"
@@ -2370,6 +2398,7 @@
2370
2398
  <t t-foreach="props.choices" t-as="choice" t-key="choice.value">
2371
2399
  <label class="o-radio d-flex align-items-center me-4">
2372
2400
  <input
2401
+ class="border rounded-circle"
2373
2402
  t-att-class="{
2374
2403
  'me-1': props.direction === 'horizontal',
2375
2404
  'me-2': props.direction === 'vertical'}"
@@ -2437,7 +2466,7 @@
2437
2466
  t-att-class="{'text-muted': props.disabled }"
2438
2467
  t-attf-class="{{props.className}}">
2439
2468
  <input
2440
- class="me-2"
2469
+ class="me-2 flex-shrink-0 border"
2441
2470
  type="checkbox"
2442
2471
  t-att-disabled="props.disabled"
2443
2472
  t-att-name="props.name"
@@ -2445,7 +2474,7 @@
2445
2474
  t-on-change="onChange"
2446
2475
  t-on-click.stop=""
2447
2476
  />
2448
- <t t-if="props.label" t-esc="props.label"/>
2477
+ <span class="text-truncate" t-if="props.label" t-esc="props.label"/>
2449
2478
  </label>
2450
2479
  </t>
2451
2480
 
@@ -2479,6 +2508,9 @@
2479
2508
  className="'mb-2'"
2480
2509
  />
2481
2510
  </Section>
2511
+ <Section class="'pt-0'" title.translate="Number formatting">
2512
+ <ChartHumanizeNumbers t-props="props"/>
2513
+ </Section>
2482
2514
  </t>
2483
2515
  </GeneralDesignEditor>
2484
2516
  <SeriesWithAxisDesignEditor t-props="props"/>
@@ -2518,7 +2550,7 @@
2518
2550
  className="'mb-2'"
2519
2551
  />
2520
2552
  </Section>
2521
- <Section class="'pt-1'" title.translate="Number formatting">
2553
+ <Section class="'pt-0'" title.translate="Number formatting">
2522
2554
  <ChartHumanizeNumbers t-props="props"/>
2523
2555
  </Section>
2524
2556
  </t>
@@ -2657,6 +2689,9 @@
2657
2689
  hasVerticalAlign="true"
2658
2690
  />
2659
2691
  </Section>
2692
+ <Section class="'pt-0'" title.translate="Number formatting">
2693
+ <ChartHumanizeNumbers t-props="props"/>
2694
+ </Section>
2660
2695
  </t>
2661
2696
  </SidePanelCollapsible>
2662
2697
  </t>
@@ -2717,6 +2752,9 @@
2717
2752
  <GeneralDesignEditor t-props="props">
2718
2753
  <t t-set-slot="general-extension">
2719
2754
  <ChartLegend t-props="props"/>
2755
+ <Section class="'pt-0'" title.translate="Number formatting">
2756
+ <ChartHumanizeNumbers t-props="props"/>
2757
+ </Section>
2720
2758
  </t>
2721
2759
  </GeneralDesignEditor>
2722
2760
 
@@ -2768,7 +2806,7 @@
2768
2806
  <t t-set="color_down">Color Down</t>
2769
2807
  <GeneralDesignEditor t-props="props" defaultChartTitleFontSize="defaultScorecardTitleFontSize">
2770
2808
  <t t-set-slot="general-extension">
2771
- <Section class="'pt-1'" title.translate="Number formatting">
2809
+ <Section class="'pt-0'" title.translate="Number formatting">
2772
2810
  <ChartHumanizeNumbers t-props="props"/>
2773
2811
  </Section>
2774
2812
  </t>
@@ -2882,7 +2920,7 @@
2882
2920
  <ChartShowValues t-props="props"/>
2883
2921
  <ChartShowDataMarkers t-props="props"/>
2884
2922
  </Section>
2885
- <Section class="'pt-1'" title.translate="Number formatting">
2923
+ <Section class="'pt-0'" title.translate="Number formatting">
2886
2924
  <ChartHumanizeNumbers t-props="props"/>
2887
2925
  </Section>
2888
2926
  </t>
@@ -2897,7 +2935,7 @@
2897
2935
  <Section class="'pt-0'" title.translate="Values">
2898
2936
  <ChartShowValues t-props="props"/>
2899
2937
  </Section>
2900
- <Section class="'pt-1'" title.translate="Number formatting">
2938
+ <Section class="'pt-0'" title.translate="Number formatting">
2901
2939
  <ChartHumanizeNumbers t-props="props"/>
2902
2940
  </Section>
2903
2941
  <PieHoleSize
@@ -2929,7 +2967,7 @@
2929
2967
  </div>
2930
2968
 
2931
2969
  <t t-set="definition" t-value="getChartDefinition(this.chartId)"/>
2932
- <div class="o-panel-content overflow-y-auto" t-ref="panelContent">
2970
+ <div class="o-panel-content" t-ref="panelContent">
2933
2971
  <div t-att-class="store.panel !== 'configuration' ? 'd-none' : ''">
2934
2972
  <ChartTypePicker chartId="chartId" chartPanelStore="store"/>
2935
2973
  <t
@@ -2972,7 +3010,7 @@
2972
3010
  className="'mb-2'"
2973
3011
  />
2974
3012
  </Section>
2975
- <Section class="'pt-1'" title.translate="Number formatting">
3013
+ <Section class="'pt-0'" title.translate="Number formatting">
2976
3014
  <ChartHumanizeNumbers t-props="props"/>
2977
3015
  </Section>
2978
3016
  </t>
@@ -3081,7 +3119,7 @@
3081
3119
  <option value="left">Bottom left</option>
3082
3120
  </select>
3083
3121
  </Section>
3084
- <Section class="'pt-1'" title.translate="Number formatting">
3122
+ <Section class="'pt-0'" title.translate="Number formatting">
3085
3123
  <ChartHumanizeNumbers t-props="props"/>
3086
3124
  </Section>
3087
3125
  </t>
@@ -3089,45 +3127,10 @@
3089
3127
 
3090
3128
  <SidePanelCollapsible isInitiallyCollapsed="false" title.translate="Geo chart options">
3091
3129
  <t t-set-slot="content">
3092
- <Section class="'pt-0 o-color-scale'" title.translate="Color Scale">
3093
- <select class="o-input" t-on-change="this.updateColorScaleType">
3094
- <option value="custom">Custom</option>
3095
- <hr/>
3096
- <t t-foreach="colorScalesChoices" t-as="colorScale" t-key="colorScale">
3097
- <option
3098
- t-att-value="colorScale"
3099
- t-esc="colorScale_value"
3100
- t-att-selected="colorScale === selectedColorScale"
3101
- />
3102
- </t>
3103
- </select>
3104
-
3105
- <t t-if="customColorScale">
3106
- <div class="o-min-color d-flex align-items-center mb-2 mt-4">
3107
- <RoundColorPicker
3108
- currentColor="getCustomColorScaleColor('minColor')"
3109
- onColorPicked="(color) => this.setCustomColorScaleColor('minColor', color)"
3110
- disableNoColor="true"
3111
- />
3112
- <span class="ps-2">Color of minimum values</span>
3113
- </div>
3114
- <div class="o-mid-color d-flex align-items-center mb-2">
3115
- <RoundColorPicker
3116
- currentColor="getCustomColorScaleColor('midColor')"
3117
- onColorPicked="(color) => this.setCustomColorScaleColor('midColor', color)"
3118
- />
3119
- <span class="ps-2">Color of middle values</span>
3120
- </div>
3121
- <div class="o-max-color d-flex align-items-center">
3122
- <RoundColorPicker
3123
- currentColor="getCustomColorScaleColor('maxColor')"
3124
- onColorPicked="(color) => this.setCustomColorScaleColor('maxColor', color)"
3125
- disableNoColor="true"
3126
- />
3127
- <span class="ps-2">Color of maximum values</span>
3128
- </div>
3129
- </t>
3130
- </Section>
3130
+ <ColorScalePicker
3131
+ definition="props.definition"
3132
+ onUpdateColorScale.bind="this.updateColorScale"
3133
+ />
3131
3134
 
3132
3135
  <Section class="'pt-0 o-missing-value'" title.translate="Countries without value">
3133
3136
  <RoundColorPicker
@@ -3174,7 +3177,7 @@
3174
3177
  <t t-name="o-spreadsheet-GaugeChartDesignPanel">
3175
3178
  <GeneralDesignEditor t-props="props">
3176
3179
  <t t-set-slot="general-extension">
3177
- <Section class="'pt-1'" title.translate="Number formatting">
3180
+ <Section class="'pt-0'" title.translate="Number formatting">
3178
3181
  <ChartHumanizeNumbers t-props="props"/>
3179
3182
  </Section>
3180
3183
  </t>
@@ -3320,7 +3323,7 @@
3320
3323
  <Section class="'pt-0'" title.translate="Values">
3321
3324
  <ChartShowValues t-props="props"/>
3322
3325
  </Section>
3323
- <Section class="'pt-1'" title.translate="Number formatting">
3326
+ <Section class="'pt-0'" title.translate="Number formatting">
3324
3327
  <ChartHumanizeNumbers t-props="props"/>
3325
3328
  </Section>
3326
3329
  </t>
@@ -3360,7 +3363,7 @@
3360
3363
  className="'mb-2'"
3361
3364
  />
3362
3365
  </Section>
3363
- <Section class="'pt-1'" title.translate="Number formatting">
3366
+ <Section class="'pt-0'" title.translate="Number formatting">
3364
3367
  <ChartHumanizeNumbers t-props="props"/>
3365
3368
  </Section>
3366
3369
  </t>
@@ -3436,7 +3439,7 @@
3436
3439
  <Popover t-if="state.popoverProps" t-props="state.popoverProps">
3437
3440
  <div
3438
3441
  t-ref="popoverRef"
3439
- class="o-chart-select-popover px-3 pb-4"
3442
+ class="o-chart-select-popover px-3 pb-4 bg-white"
3440
3443
  t-att-style="state.popoverStyle">
3441
3444
  <t t-foreach="categories" t-as="category" t-key="category">
3442
3445
  <t t-if="chartTypeByCategories[category]">
@@ -3464,148 +3467,192 @@
3464
3467
 
3465
3468
  <t t-name="o-spreadsheet-ChartPreview.LINE_CHART">
3466
3469
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3467
- <path fill="#444" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3468
- <path stroke="#eb6d00" style="fill:none" d="M6,40 l12,-12 l6,6 l18,-18"/>
3469
- <path stroke="#0074d9" style="fill:none" d="M6,25 l12,-12 l18,18 l6,-6"/>
3470
+ <path fill="var(--os-gray-600)" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3471
+ <path
3472
+ stroke="var(--os-chart-preview-orange-line)"
3473
+ style="fill:none"
3474
+ d="M6,40 l12,-12 l6,6 l18,-18"
3475
+ />
3476
+ <path
3477
+ stroke="var(--os-chart-preview-blue-line)"
3478
+ style="fill:none"
3479
+ d="M6,25 l12,-12 l18,18 l6,-6"
3480
+ />
3470
3481
  </svg>
3471
3482
  </t>
3472
3483
  <t t-name="o-spreadsheet-ChartPreview.STACKED_LINE_CHART">
3473
3484
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3474
- <path stroke="#0074d9" style="fill:none" d="M3,30 l12,-12 l6,6 l18,-18"/>
3475
- <path stroke="#eb6d00" style="fill:none" d="M3,40 l12,-12 l6,6 l18,-12"/>
3476
- <path fill="#444" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3485
+ <path
3486
+ stroke="var(--os-chart-preview-blue-line)"
3487
+ style="fill:none"
3488
+ d="M3,30 l12,-12 l6,6 l18,-18"
3489
+ />
3490
+ <path
3491
+ stroke="var(--os-chart-preview-orange-line)"
3492
+ style="fill:none"
3493
+ d="M3,40 l12,-12 l6,6 l18,-12"
3494
+ />
3495
+ <path fill="var(--os-gray-600)" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3477
3496
  </svg>
3478
3497
  </t>
3479
3498
  <t t-name="o-spreadsheet-ChartPreview.AREA_CHART">
3480
3499
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3481
- <path fill="#c4e4ff" d="M3,45 V25 l12,-12 l18,18 l6,-6 V45"/>
3482
- <path fill="#ffe1c8" d="M3,45 V40 l12,-12 l6,6 l18,-18 V45"/>
3483
- <path stroke="#eb6d00" style="fill:none" d="M3,40 l12,-12 l6,6 l18,-18"/>
3484
- <path stroke="#0074d9" style="fill:none" d="M3,25 l12,-12 l18,18 l6,-6"/>
3485
- <path fill="#444" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3500
+ <path fill="var(--os-chart-preview-blue-fill)" d="M3,45 V25 l12,-12 l18,18 l6,-6 V45"/>
3501
+ <path fill="var(--os-chart-preview-orange-fill)" d="M3,45 V40 l12,-12 l6,6 l18,-18 V45"/>
3502
+ <path
3503
+ stroke="var(--os-chart-preview-orange-line)"
3504
+ style="fill:none"
3505
+ d="M3,40 l12,-12 l6,6 l18,-18"
3506
+ />
3507
+ <path
3508
+ stroke="var(--os-chart-preview-blue-line)"
3509
+ style="fill:none"
3510
+ d="M3,25 l12,-12 l18,18 l6,-6"
3511
+ />
3512
+ <path fill="var(--os-gray-600)" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3486
3513
  </svg>
3487
3514
  </t>
3488
3515
  <t t-name="o-spreadsheet-ChartPreview.STACKED_AREA_CHART">
3489
3516
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3490
- <path fill="#c4e4ff" d="M3,45 h36 v-39 l-18,18 l-6,-6 l-12,12"/>
3491
- <path stroke="#0074d9" style="fill:none" d="M3,30 l12,-12 l6,6 l18,-18"/>
3492
- <path fill="#ffe1c8" d="M3,45 h36 v-23 l-18,12 l-6,-6 l-12,12"/>
3493
- <path stroke="#eb6d00" style="fill:none" d="M3,40 l12,-12 l6,6 l18,-12"/>
3494
- <path fill="#444" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3517
+ <path fill="var(--os-chart-preview-blue-fill)" d="M3,45 h36 v-39 l-18,18 l-6,-6 l-12,12"/>
3518
+ <path
3519
+ stroke="var(--os-chart-preview-blue-line)"
3520
+ style="fill:none"
3521
+ d="M3,30 l12,-12 l6,6 l18,-18"
3522
+ />
3523
+ <path fill="var(--os-chart-preview-orange-fill)" d="M3,45 h36 v-23 l-18,12 l-6,-6 l-12,12"/>
3524
+ <path
3525
+ stroke="var(--os-chart-preview-orange-line)"
3526
+ style="fill:none"
3527
+ d="M3,40 l12,-12 l6,6 l18,-12"
3528
+ />
3529
+ <path fill="var(--os-gray-600)" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3495
3530
  </svg>
3496
3531
  </t>
3497
3532
  <t t-name="o-spreadsheet-ChartPreview.COLUMN_CHART">
3498
3533
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3499
- <path fill="#0074d9" d="M7,45 v-28 h6 v28"/>
3500
- <path fill="#c4e4ff" d="M8,45 v-27 h4 v27"/>
3501
- <path fill="#eb6d00" d="M14,45 v-14 h6 v14"/>
3502
- <path fill="#ffe1c8" d="M15,45 v-13 h4 v13"/>
3503
- <path fill="#0074d9" d="M26,45 v-22 h6 v22"/>
3504
- <path fill="#c4e4ff" d="M27,45 v-21 h4 v21"/>
3505
- <path fill="#eb6d00" d="M33,45 v-32 h6 v32"/>
3506
- <path fill="#ffe1c8" d="M34,45 v-31 h4 v31"/>
3507
- <path fill="#444" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3534
+ <path fill="var(--os-chart-preview-blue-line)" d="M7,45 v-28 h6 v28"/>
3535
+ <path fill="var(--os-chart-preview-blue-fill)" d="M8,45 v-27 h4 v27"/>
3536
+ <path fill="var(--os-chart-preview-orange-line)" d="M14,45 v-14 h6 v14"/>
3537
+ <path fill="var(--os-chart-preview-orange-fill)" d="M15,45 v-13 h4 v13"/>
3538
+ <path fill="var(--os-chart-preview-blue-line)" d="M26,45 v-22 h6 v22"/>
3539
+ <path fill="var(--os-chart-preview-blue-fill)" d="M27,45 v-21 h4 v21"/>
3540
+ <path fill="var(--os-chart-preview-orange-line)" d="M33,45 v-32 h6 v32"/>
3541
+ <path fill="var(--os-chart-preview-orange-fill)" d="M34,45 v-31 h4 v31"/>
3542
+ <path fill="var(--os-gray-600)" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3508
3543
  </svg>
3509
3544
  </t>
3510
3545
  <t t-name="o-spreadsheet-ChartPreview.STACKED_COLUMN_CHART">
3511
3546
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3512
- <path fill="#0074d9" d="M7,45 v-12 h8 v12"/>
3513
- <path fill="#c4e4ff" d="M8,45 v-11 h6 v11"/>
3514
- <path fill="#eb6d00" d="M7,33 v-14 h8 v14"/>
3515
- <path fill="#ffe1c8" d="M8,33 v-13 h6 v13"/>
3547
+ <path fill="var(--os-chart-preview-blue-line)" d="M7,45 v-12 h8 v12"/>
3548
+ <path fill="var(--os-chart-preview-blue-fill)" d="M8,45 v-11 h6 v11"/>
3549
+ <path fill="var(--os-chart-preview-orange-line)" d="M7,33 v-14 h8 v14"/>
3550
+ <path fill="var(--os-chart-preview-orange-fill)" d="M8,33 v-13 h6 v13"/>
3516
3551
 
3517
- <path fill="#0074d9" d="M20,45 v-8 h8 v8"/>
3518
- <path fill="#c4e4ff" d="M21,45 v-7 h6 v7"/>
3519
- <path fill="#eb6d00" d="M20,37 v-9 h8 v9"/>
3520
- <path fill="#ffe1c8" d="M21,37 v-8 h6 v8"/>
3552
+ <path fill="var(--os-chart-preview-blue-line)" d="M20,45 v-8 h8 v8"/>
3553
+ <path fill="var(--os-chart-preview-blue-fill)" d="M21,45 v-7 h6 v7"/>
3554
+ <path fill="var(--os-chart-preview-orange-line)" d="M20,37 v-9 h8 v9"/>
3555
+ <path fill="var(--os-chart-preview-orange-fill)" d="M21,37 v-8 h6 v8"/>
3521
3556
 
3522
- <path fill="#0074d9" d="M33,45 v-18 h8 v18"/>
3523
- <path fill="#c4e4ff" d="M34,45 v-17 h6 v17"/>
3524
- <path fill="#eb6d00" d="M33,27 v-16 h8 v16"/>
3525
- <path fill="#ffe1c8" d="M34,27 v-15 h6 v15"/>
3557
+ <path fill="var(--os-chart-preview-blue-line)" d="M33,45 v-18 h8 v18"/>
3558
+ <path fill="var(--os-chart-preview-blue-fill)" d="M34,45 v-17 h6 v17"/>
3559
+ <path fill="var(--os-chart-preview-orange-line)" d="M33,27 v-16 h8 v16"/>
3560
+ <path fill="var(--os-chart-preview-orange-fill)" d="M34,27 v-15 h6 v15"/>
3526
3561
 
3527
- <path fill="#444" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3562
+ <path fill="var(--os-gray-600)" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3528
3563
  </svg>
3529
3564
  </t>
3530
3565
  <t t-name="o-spreadsheet-ChartPreview.BAR_CHART">
3531
3566
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3532
3567
  <g transform="matrix(0 1 -1 0 48 3)">
3533
- <path fill="#0074d9" d="M7,45 v-28 h6 v28"/>
3534
- <path fill="#c4e4ff" d="M8,45 v-27 h4 v27"/>
3535
- <path fill="#eb6d00" d="M14,45 v-14 h6 v14"/>
3536
- <path fill="#ffe1c8" d="M15,45 v-13 h4 v13"/>
3537
- <path fill="#0074d9" d="M26,45 v-22 h6 v22"/>
3538
- <path fill="#c4e4ff" d="M27,45 v-21 h4 v21"/>
3539
- <path fill="#eb6d00" d="M33,45 v-32 h6 v32"/>
3540
- <path fill="#ffe1c8" d="M34,45 v-31 h4 v31"/>
3568
+ <path fill="var(--os-chart-preview-blue-line)" d="M7,45 v-28 h6 v28"/>
3569
+ <path fill="var(--os-chart-preview-blue-fill)" d="M8,45 v-27 h4 v27"/>
3570
+ <path fill="var(--os-chart-preview-orange-line)" d="M14,45 v-14 h6 v14"/>
3571
+ <path fill="var(--os-chart-preview-orange-fill)" d="M15,45 v-13 h4 v13"/>
3572
+ <path fill="var(--os-chart-preview-blue-line)" d="M26,45 v-22 h6 v22"/>
3573
+ <path fill="var(--os-chart-preview-blue-fill)" d="M27,45 v-21 h4 v21"/>
3574
+ <path fill="var(--os-chart-preview-orange-line)" d="M33,45 v-32 h6 v32"/>
3575
+ <path fill="var(--os-chart-preview-orange-fill)" d="M34,45 v-31 h4 v31"/>
3541
3576
  </g>
3542
- <path fill="#444" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3577
+ <path fill="var(--os-gray-600)" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3543
3578
  </svg>
3544
3579
  </t>
3545
3580
  <t t-name="o-spreadsheet-ChartPreview.STACKED_BAR_CHART">
3546
3581
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3547
3582
  <g transform="matrix(0 1 -1 0 48 1)">
3548
- <path fill="#0074d9" d="M7,45 v-12 h8 v12"/>
3549
- <path fill="#c4e4ff" d="M8,45 v-11 h6 v11"/>
3550
- <path fill="#eb6d00" d="M7,33 v-14 h8 v14"/>
3551
- <path fill="#ffe1c8" d="M8,33 v-13 h6 v13"/>
3552
- <path fill="#0074d9" d="M20,45 v-8 h8 v8"/>
3553
- <path fill="#c4e4ff" d="M21,45 v-7 h6 v7"/>
3554
- <path fill="#eb6d00" d="M20,37 v-9 h8 v9"/>
3555
- <path fill="#ffe1c8" d="M21,37 v-8 h6 v8"/>
3556
- <path fill="#0074d9" d="M33,45 v-18 h8 v18"/>
3557
- <path fill="#c4e4ff" d="M34,45 v-17 h6 v17"/>
3558
- <path fill="#eb6d00" d="M33,27 v-16 h8 v16"/>
3559
- <path fill="#ffe1c8" d="M34,27 v-15 h6 v15"/>
3583
+ <path fill="var(--os-chart-preview-blue-line)" d="M7,45 v-12 h8 v12"/>
3584
+ <path fill="var(--os-chart-preview-blue-fill)" d="M8,45 v-11 h6 v11"/>
3585
+ <path fill="var(--os-chart-preview-orange-line)" d="M7,33 v-14 h8 v14"/>
3586
+ <path fill="var(--os-chart-preview-orange-fill)" d="M8,33 v-13 h6 v13"/>
3587
+ <path fill="var(--os-chart-preview-blue-line)" d="M20,45 v-8 h8 v8"/>
3588
+ <path fill="var(--os-chart-preview-blue-fill)" d="M21,45 v-7 h6 v7"/>
3589
+ <path fill="var(--os-chart-preview-orange-line)" d="M20,37 v-9 h8 v9"/>
3590
+ <path fill="var(--os-chart-preview-orange-fill)" d="M21,37 v-8 h6 v8"/>
3591
+ <path fill="var(--os-chart-preview-blue-line)" d="M33,45 v-18 h8 v18"/>
3592
+ <path fill="var(--os-chart-preview-blue-fill)" d="M34,45 v-17 h6 v17"/>
3593
+ <path fill="var(--os-chart-preview-orange-line)" d="M33,27 v-16 h8 v16"/>
3594
+ <path fill="var(--os-chart-preview-orange-fill)" d="M34,27 v-15 h6 v15"/>
3560
3595
  </g>
3561
- <path fill="#444" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3596
+ <path fill="var(--os-gray-600)" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3562
3597
  </svg>
3563
3598
  </t>
3564
3599
  <t t-name="o-spreadsheet-ChartPreview.COMBO_CHART">
3565
3600
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3566
- <path fill="#0074d9" d="M7,45 v-14 h6 v14"/>
3567
- <path fill="#c4e4ff" d="M8,45 v-13 h4 v13"/>
3568
- <path fill="#eb6d00" d="M14,45 v-28 h6 v28"/>
3569
- <path fill="#ffe1c8" d="M15,45 v-27 h4 v27"/>
3570
- <path fill="#0074d9" d="M26,45 v-22 h6 v22"/>
3571
- <path fill="#c4e4ff" d="M27,45 v-21 h4 v21"/>
3572
- <path fill="#eb6d00" d="M33,45 v-32 h6 v32"/>
3573
- <path fill="#ffe1c8" d="M34,45 v-31 h4 v31"/>
3574
- <path stroke="#888" style="fill:none;stroke-width:1.5;" d="M4,40 l14,-12 l6,6 l20,-18"/>
3575
- <path fill="#444" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3601
+ <path fill="var(--os-chart-preview-blue-line)" d="M7,45 v-14 h6 v14"/>
3602
+ <path fill="var(--os-chart-preview-blue-fill)" d="M8,45 v-13 h4 v13"/>
3603
+ <path fill="var(--os-chart-preview-orange-line)" d="M14,45 v-28 h6 v28"/>
3604
+ <path fill="var(--os-chart-preview-orange-fill)" d="M15,45 v-27 h4 v27"/>
3605
+ <path fill="var(--os-chart-preview-blue-line)" d="M26,45 v-22 h6 v22"/>
3606
+ <path fill="var(--os-chart-preview-blue-fill)" d="M27,45 v-21 h4 v21"/>
3607
+ <path fill="var(--os-chart-preview-orange-line)" d="M33,45 v-32 h6 v32"/>
3608
+ <path fill="var(--os-chart-preview-orange-fill)" d="M34,45 v-31 h4 v31"/>
3609
+ <path
3610
+ stroke="var(--os-gray-500)"
3611
+ style="fill:none;stroke-width:1.5;"
3612
+ d="M4,40 l14,-12 l6,6 l20,-18"
3613
+ />
3614
+ <path fill="var(--os-gray-600)" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3576
3615
  </svg>
3577
3616
  </t>
3578
3617
  <t t-name="o-spreadsheet-ChartPreview.PIE_CHART">
3579
3618
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3580
- <path fill="#ffe1c8" stroke="#eb6d00" d="M41.32, 34 A20 20, 0, 1, 1, 24, 4 v20"/>
3581
- <path fill="#c4e4ff" stroke="#0074d9" d="M24,24 v-20 A20 20, 0, 0, 1, 41.32, 34 L24,24"/>
3619
+ <path
3620
+ fill="var(--os-chart-preview-orange-fill)"
3621
+ stroke="var(--os-chart-preview-orange-line)"
3622
+ d="M41.32, 34 A20 20, 0, 1, 1, 24, 4 v20"
3623
+ />
3624
+ <path
3625
+ fill="var(--os-chart-preview-blue-fill)"
3626
+ stroke="var(--os-chart-preview-blue-line)"
3627
+ d="M24,24 v-20 A20 20, 0, 0, 1, 41.32, 34 L24,24"
3628
+ />
3582
3629
  </svg>
3583
3630
  </t>
3584
3631
  <t t-name="o-spreadsheet-ChartPreview.DOUGHNUT_CHART">
3585
3632
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3586
3633
  <path
3587
- fill="#ffe1c8"
3588
- stroke="#eb6d00"
3634
+ fill="var(--os-chart-preview-orange-fill)"
3635
+ stroke="var(--os-chart-preview-orange-line)"
3589
3636
  d="M41.32, 34 A20 20, 0, 1, 1, 24, 4 v8 A12,12,0,1,0,34.4,30"
3590
3637
  />
3591
3638
  <path
3592
- fill="#c4e4ff"
3593
- stroke="#0074d9"
3639
+ fill="var(--os-chart-preview-blue-fill)"
3640
+ stroke="var(--os-chart-preview-blue-line)"
3594
3641
  d="M24,12 v-8 A20 20, 0, 0, 1, 41.32, 34 L34.4,30 A12,12,0,0,0,24,12"
3595
3642
  />
3596
3643
  </svg>
3597
3644
  </t>
3598
3645
  <t t-name="o-spreadsheet-ChartPreview.SCATTER_CHART">
3599
3646
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3600
- <circle fill="#0074d9" cx="10" cy="10" r="2"/>
3601
- <circle fill="#0074d9" cx="15" cy="30" r="2"/>
3602
- <circle fill="#0074d9" cx="25" cy="36" r="2"/>
3603
- <circle fill="#0074d9" cx="32" cy="15" r="2"/>
3604
- <circle fill="#eb6d00" cx="10" cy="40" r="2"/>
3605
- <circle fill="#eb6d00" cx="18" cy="20" r="2"/>
3606
- <circle fill="#eb6d00" cx="30" cy="25" r="2"/>
3607
- <circle fill="#eb6d00" cx="40" cy="33" r="2"/>
3608
- <path fill="#444" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3647
+ <circle fill="var(--os-chart-preview-blue-line)" cx="10" cy="10" r="2"/>
3648
+ <circle fill="var(--os-chart-preview-blue-line)" cx="15" cy="30" r="2"/>
3649
+ <circle fill="var(--os-chart-preview-blue-line)" cx="25" cy="36" r="2"/>
3650
+ <circle fill="var(--os-chart-preview-blue-line)" cx="32" cy="15" r="2"/>
3651
+ <circle fill="var(--os-chart-preview-orange-line)" cx="10" cy="40" r="2"/>
3652
+ <circle fill="var(--os-chart-preview-orange-line)" cx="18" cy="20" r="2"/>
3653
+ <circle fill="var(--os-chart-preview-orange-line)" cx="30" cy="25" r="2"/>
3654
+ <circle fill="var(--os-chart-preview-orange-line)" cx="40" cy="33" r="2"/>
3655
+ <path fill="var(--os-gray-600)" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3609
3656
  </svg>
3610
3657
  </t>
3611
3658
  <t t-name="o-spreadsheet-ChartPreview.GAUGE_CHART">
@@ -3613,9 +3660,9 @@
3613
3660
  viewBox="0 0 48 48"
3614
3661
  class="o-chart-preview user-select-none"
3615
3662
  xmlns="http://www.w3.org/2000/svg">
3616
- <path fill="#ccc" d="M2,32 A22,22,0,0,1,46,32 h-6 A16,16,0,0,0,8,32"/>
3663
+ <path fill="var(--os-gray-400)" d="M2,32 A22,22,0,0,1,46,32 h-6 A16,16,0,0,0,8,32"/>
3617
3664
  <path fill="#6aa84f" d="M2,32 A22,22,0,0,1,35,13 L32,18.2 A16,16,0,0,0,8,32"/>
3618
- <text x="17" y="32" style="font-size:12px;">62</text>
3665
+ <text fill="currentColor" x="17" y="32" style="font-size:12px;">62</text>
3619
3666
  </svg>
3620
3667
  </t>
3621
3668
  <t t-name="o-spreadsheet-ChartPreview.SCORECARD_CHART">
@@ -3623,61 +3670,72 @@
3623
3670
  viewBox="0 0 48 48"
3624
3671
  class="o-chart-preview user-select-none"
3625
3672
  xmlns="http://www.w3.org/2000/svg">
3626
- <path fill="#ddd" d="M1,8 h46 v32 h-46"/>
3627
- <path fill="#eee" d="M2,9 h44 v30 h-44"/>
3628
- <text x="9" y="32" style="font-size:18px;">123</text>
3673
+ <path fill="var(--os-gray-300)" d="M1,8 h46 v32 h-46"/>
3674
+ <path fill="var(--os-gray-200)" d="M2,9 h44 v30 h-44"/>
3675
+ <text fill="currentColor" x="9" y="32" style="font-size:18px;">123</text>
3629
3676
  </svg>
3630
3677
  </t>
3631
3678
  <t t-name="o-spreadsheet-ChartPreview.WATERFALL_CHART">
3632
3679
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3633
- <path fill="#444" d="M5,45 v-26 h6 v26"/>
3634
- <path fill="#fff" d="M6,45 v-25 h4 v25"/>
3635
- <path fill="#eb6d00" d="M13,19 v7 h6 v-7"/>
3636
- <path fill="#ffe1c8" d="M14,20 v5 h4 v-5"/>
3637
- <path fill="#eb6d00" d="M21,25 v10 h6 v-10"/>
3638
- <path fill="#ffe1c8" d="M22,26 v8 h4 v-8"/>
3639
- <path fill="#0074d9" d="M29,35 v-24 h6 v24"/>
3640
- <path fill="#c4e4ff" d="M30,34 v-22 h4 v22"/>
3641
- <path fill="#444" d="M37,45 v-34 h6 v34"/>
3642
- <path fill="#fff" d="M38,45 v-33 h4 v33"/>
3643
- <path fill="#444" d="M11,20 v-1 h2 v1 M19,26 v-1 h2 v1 M27,35 v-1 h2 v1 M35,12 v-1 h2 v1"/>
3644
- <path fill="#444" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3680
+ <path fill="var(--os-gray-600)" d="M5,45 v-26 h6 v26"/>
3681
+ <path fill="var(--os-white-bg)" d="M6,45 v-25 h4 v25"/>
3682
+ <path fill="var(--os-chart-preview-orange-line)" d="M13,19 v7 h6 v-7"/>
3683
+ <path fill="var(--os-chart-preview-orange-fill)" d="M14,20 v5 h4 v-5"/>
3684
+ <path fill="var(--os-chart-preview-orange-line)" d="M21,25 v10 h6 v-10"/>
3685
+ <path fill="var(--os-chart-preview-orange-fill)" d="M22,26 v8 h4 v-8"/>
3686
+ <path fill="var(--os-chart-preview-blue-line)" d="M29,35 v-24 h6 v24"/>
3687
+ <path fill="var(--os-chart-preview-blue-fill)" d="M30,34 v-22 h4 v22"/>
3688
+ <path fill="var(--os-gray-600)" d="M37,45 v-34 h6 v34"/>
3689
+ <path fill="var(--os-white-bg)" d="M38,45 v-33 h4 v33"/>
3690
+ <path
3691
+ fill="var(--os-gray-600)"
3692
+ d="M11,20 v-1 h2 v1 M19,26 v-1 h2 v1 M27,35 v-1 h2 v1 M35,12 v-1 h2 v1"
3693
+ />
3694
+ <path fill="var(--os-gray-600)" d="M2,2 v44 h1 v-44 M3,45 h42 v1 h-42"/>
3645
3695
  </svg>
3646
3696
  </t>
3647
3697
  <t t-name="o-spreadsheet-ChartPreview.POPULATION_PYRAMID_CHART">
3648
3698
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3649
- <path fill="#eb6d00" d="M23,43 v-6 h22 v6"/>
3650
- <path fill="#ffe1c8" d="M23,42 v-4 h21 v4"/>
3651
- <path fill="#eb6d00" d="M23,36 v-6 h18 v6"/>
3652
- <path fill="#ffe1c8" d="M23,35 v-4 h17 v4"/>
3653
- <path fill="#eb6d00" d="M23,29 v-6 h12 v6"/>
3654
- <path fill="#ffe1c8" d="M23,28 v-4 h11 v4"/>
3655
- <path fill="#eb6d00" d="M23,22 v-6 h8 v6"/>
3656
- <path fill="#ffe1c8" d="M23,21 v-4 h7 v4"/>
3657
- <path fill="#eb6d00" d="M23,15 v-6 h4 v6"/>
3658
- <path fill="#ffe1c8" d="M23,14 v-4 h3 v4"/>
3659
-
3660
- <path fill="#0074d9" d="M24,43 v-6 h-20 v6"/>
3661
- <path fill="#c4e4ff" d="M24,42 v-4 h-19 v4"/>
3662
- <path fill="#0074d9" d="M24,36 v-6 h-18 v6"/>
3663
- <path fill="#c4e4ff" d="M24,35 v-4 h-17 v4"/>
3664
- <path fill="#0074d9" d="M24,29 v-6 h-12 v6"/>
3665
- <path fill="#c4e4ff" d="M24,28 v-4 h-11 v4"/>
3666
- <path fill="#0074d9" d="M24,22 v-6 h-6 v6"/>
3667
- <path fill="#c4e4ff" d="M24,21 v-4 h-5 v4"/>
3668
- <path fill="#0074d9" d="M24,15 v-6 h-4 v6"/>
3669
- <path fill="#c4e4ff" d="M24,14 v-4 h-3 v4"/>
3670
-
3671
- <path fill="#444" d="M23,2 v43 h1 v-43 M2,45 h44 v1 h-44"/>
3699
+ <path fill="var(--os-chart-preview-orange-line)" d="M23,43 v-6 h22 v6"/>
3700
+ <path fill="var(--os-chart-preview-orange-fill)" d="M23,42 v-4 h21 v4"/>
3701
+ <path fill="var(--os-chart-preview-orange-line)" d="M23,36 v-6 h18 v6"/>
3702
+ <path fill="var(--os-chart-preview-orange-fill)" d="M23,35 v-4 h17 v4"/>
3703
+ <path fill="var(--os-chart-preview-orange-line)" d="M23,29 v-6 h12 v6"/>
3704
+ <path fill="var(--os-chart-preview-orange-fill)" d="M23,28 v-4 h11 v4"/>
3705
+ <path fill="var(--os-chart-preview-orange-line)" d="M23,22 v-6 h8 v6"/>
3706
+ <path fill="var(--os-chart-preview-orange-fill)" d="M23,21 v-4 h7 v4"/>
3707
+ <path fill="var(--os-chart-preview-orange-line)" d="M23,15 v-6 h4 v6"/>
3708
+ <path fill="var(--os-chart-preview-orange-fill)" d="M23,14 v-4 h3 v4"/>
3709
+
3710
+ <path fill="var(--os-chart-preview-blue-line)" d="M24,43 v-6 h-20 v6"/>
3711
+ <path fill="var(--os-chart-preview-blue-fill)" d="M24,42 v-4 h-19 v4"/>
3712
+ <path fill="var(--os-chart-preview-blue-line)" d="M24,36 v-6 h-18 v6"/>
3713
+ <path fill="var(--os-chart-preview-blue-fill)" d="M24,35 v-4 h-17 v4"/>
3714
+ <path fill="var(--os-chart-preview-blue-line)" d="M24,29 v-6 h-12 v6"/>
3715
+ <path fill="var(--os-chart-preview-blue-fill)" d="M24,28 v-4 h-11 v4"/>
3716
+ <path fill="var(--os-chart-preview-blue-line)" d="M24,22 v-6 h-6 v6"/>
3717
+ <path fill="var(--os-chart-preview-blue-fill)" d="M24,21 v-4 h-5 v4"/>
3718
+ <path fill="var(--os-chart-preview-blue-line)" d="M24,15 v-6 h-4 v6"/>
3719
+ <path fill="var(--os-chart-preview-blue-fill)" d="M24,14 v-4 h-3 v4"/>
3720
+
3721
+ <path fill="var(--os-gray-600)" d="M23,2 v43 h1 v-43 M2,45 h44 v1 h-44"/>
3672
3722
  </svg>
3673
3723
  </t>
3674
3724
  <t t-name="o-spreadsheet-ChartPreview.RADAR_CHART">
3675
3725
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3676
- <path fill="none" stroke="#0074d9" d="m24 16 14.27 3.36-1.93 21.63-18.22-8.9-3.63-11.18Z"/>
3677
- <path fill="none" stroke="#eb6d00" d="m24 4 7.61 17.53-4.67 6.52-12.34 8.89-7.72-18.5Z"/>
3678
3726
  <path
3679
3727
  fill="none"
3680
- stroke="#444"
3728
+ stroke="var(--os-chart-preview-blue-line)"
3729
+ d="m24 16 14.27 3.36-1.93 21.63-18.22-8.9-3.63-11.18Z"
3730
+ />
3731
+ <path
3732
+ fill="none"
3733
+ stroke="var(--os-chart-preview-orange-line)"
3734
+ d="m24 4 7.61 17.53-4.67 6.52-12.34 8.89-7.72-18.5Z"
3735
+ />
3736
+ <path
3737
+ fill="none"
3738
+ stroke="var(--os-gray-600)"
3681
3739
  d="M24 2v22l20.92-6.8L24 24l12.93 17.8L24 24 11.07 41.8 24 24 3.08 17.2"
3682
3740
  />
3683
3741
  </svg>
@@ -3685,14 +3743,20 @@
3685
3743
  <t t-name="o-spreadsheet-ChartPreview.FILLED_RADAR_CHART">
3686
3744
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3687
3745
  <path
3688
- fill="#0074d944"
3689
- stroke="#0074d9"
3746
+ fill="var(--os-chart-preview-blue-line)"
3747
+ fill-opacity="0.25"
3748
+ stroke="var(--os-chart-preview-blue-line)"
3690
3749
  d="m24 16 14.27 3.36-1.93 21.63-18.22-8.9-3.63-11.18Z"
3691
3750
  />
3692
- <path fill="#eb6d0044" stroke="#eb6d00" d="m24 4 7.61 17.53-4.67 6.52-12.34 8.89-7.72-18.5Z"/>
3751
+ <path
3752
+ fill="var(--os-chart-preview-orange-line)"
3753
+ fill-opacity="0.25"
3754
+ stroke="var(--os-chart-preview-orange-line)"
3755
+ d="m24 4 7.61 17.53-4.67 6.52-12.34 8.89-7.72-18.5Z"
3756
+ />
3693
3757
  <path
3694
3758
  fill="none"
3695
- stroke="#444"
3759
+ stroke="var(--os-gray-600)"
3696
3760
  d="M24 2v22l20.92-6.8L24 24l12.93 17.8L24 24 11.07 41.8 24 24 3.08 17.2"
3697
3761
  />
3698
3762
  </svg>
@@ -3705,70 +3769,206 @@
3705
3769
  fill="none"
3706
3770
  stroke-width="0.5"
3707
3771
  stroke-linejoin="round">
3708
- <circle cx="16" cy="16" r="13" fill="#c4e4ff"/>
3772
+ <circle cx="16" cy="16" r="13" fill="var(--os-chart-preview-blue-fill)"/>
3709
3773
  <path
3710
- stroke="#eb6d00"
3711
- fill="#ffe1c8"
3774
+ stroke="var(--os-chart-preview-orange-line)"
3775
+ fill="var(--os-chart-preview-orange-fill)"
3712
3776
  d="M12.225 16.293c0 6.8 4 9 5 9 3.5 0 2-5.293 3.5-6.793s5-.707 5-4.207-2-5-5-5c-5 0-8.5 1.5-8.5 7z"
3713
3777
  />
3714
3778
  <path
3715
- fill="#ffe1c8"
3779
+ fill="var(--os-chart-preview-orange-fill)"
3716
3780
  d="M21.5 4.4c0 1.167-1.735 1.5-3 1.5-5.217 0-10.705 3.48-11.421 8.004C6.992 14.549 6.552 15 6 15H3.07 A 13 13 0 0 1 21.5 4.2
3717
3781
  M3.8 20.5c.785.262 2.126 1.285 3.44 1.517.57.101 1.153.464 1.299 1.023.303 1.16.548 1.992-.239 3.58 A 13 13 0 0 1 3.8 20.5"
3718
3782
  />
3719
3783
  <path
3720
- stroke="#eb6d00"
3784
+ stroke="var(--os-chart-preview-orange-line)"
3721
3785
  d="M21.5 4.4c0 1.167-1.735 1.5-3 1.5-5.217 0-10.705 3.48-11.421 8.004C6.992 14.549 6.552 15 6 15H3.07
3722
3786
  M3.8 20.5c.785.262 2.126 1.285 3.44 1.517.57.101 1.153.464 1.299 1.023.303 1.16.548 1.992-.239 3.58"
3723
3787
  />
3724
- <circle cx="16" cy="16" r="13" stroke="#444"/>
3788
+ <circle cx="16" cy="16" r="13" stroke="var(--os-gray-600)"/>
3725
3789
  </svg>
3726
3790
  </t>
3727
3791
  <t t-name="o-spreadsheet-ChartPreview.FUNNEL_CHART">
3728
3792
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3729
- <path stroke="#0074d9" fill="#c4e4ff" d="M2.5,6.5 h44 l-5,7 h-34 l-5,-7 h1"/>
3730
- <path stroke="#eb6d00" fill="#ffe1c8" d="M9.5,16.5 h30 l-3,7 h-25 l-3,-7 h1"/>
3731
- <path stroke="#0074d9" fill="#c4e4ff" d="M12.5,26.5 h23 l-8,7 h-7 l-8,-7 h1"/>
3732
- <path stroke="#eb6d00" fill="#ffe1c8" d="M21.5,35.5 h5 l-2.5,7 l-2.5,-7 h1"/>
3793
+ <path
3794
+ stroke="var(--os-chart-preview-blue-line)"
3795
+ fill="var(--os-chart-preview-blue-fill)"
3796
+ d="M2.5,6.5 h44 l-5,7 h-34 l-5,-7 h1"
3797
+ />
3798
+ <path
3799
+ stroke="var(--os-chart-preview-orange-line)"
3800
+ fill="var(--os-chart-preview-orange-fill)"
3801
+ d="M9.5,16.5 h30 l-3,7 h-25 l-3,-7 h1"
3802
+ />
3803
+ <path
3804
+ stroke="var(--os-chart-preview-blue-line)"
3805
+ fill="var(--os-chart-preview-blue-fill)"
3806
+ d="M12.5,26.5 h23 l-8,7 h-7 l-8,-7 h1"
3807
+ />
3808
+ <path
3809
+ stroke="var(--os-chart-preview-orange-line)"
3810
+ fill="var(--os-chart-preview-orange-fill)"
3811
+ d="M21.5,35.5 h5 l-2.5,7 l-2.5,-7 h1"
3812
+ />
3733
3813
  </svg>
3734
3814
  </t>
3735
3815
  <t t-name="o-spreadsheet-ChartPreview.SUNBURST_CHART">
3736
3816
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3737
3817
  <path
3738
- fill="#ffe1c8"
3739
- stroke="#eb6d00"
3818
+ fill="var(--os-chart-preview-orange-fill)"
3819
+ stroke="var(--os-chart-preview-orange-line)"
3740
3820
  d="M24,12 v8A4,4,0,1,0,27.46,26 L41.32, 34 A20,20,0,0,1,8.679,36.856 L14.807,31.713 A12,12,0,0,1,24,12 M34.4,30 A12,12,0,0,1,14.807,31.713"
3741
3821
  />
3742
3822
  <path
3743
- fill="#c4e4ff"
3744
- stroke="#0074d9"
3823
+ fill="var(--os-chart-preview-blue-fill)"
3824
+ stroke="var(--os-chart-preview-blue-line)"
3745
3825
  d="M24,20 v-16 A20 20, 0, 0, 1, 41.32, 34 L27.46,26 A4,4,0,0,0,24,20 M24,12 A12,12,0,0,1,34.4,30 M33.193,16.287 L39.321,11.144 M36,24 L44,24"
3746
3826
  />
3747
3827
  </svg>
3748
3828
  </t>
3749
3829
  <t t-name="o-spreadsheet-ChartPreview.TREE_MAP_CHART">
3750
3830
  <svg viewBox="0 0 48 48" class="o-chart-preview" xmlns="http://www.w3.org/2000/svg">
3751
- <path fill="#444" d="M2,4 h44 v5 h-44"/>
3752
- <path fill="#444" d="M2,10 h28 v5 h-28"/>
3753
- <path fill="#444" d="M31,10 h15 v5 h-15"/>
3754
- <path fill="#0074d9" d="M2,16 h28 v14 h-28"/>
3755
- <path fill="#c4e4ff" d="M3,17 h26 v12 h-26"/>
3756
- <path fill="#0074d9" d="M2,31 h15 v12 h-15"/>
3757
- <path fill="#c4e4ff" d="M3,32 h13 v10 h-13"/>
3758
- <path fill="#0074d9" d="M18,31 h12 v12 h-12"/>
3759
- <path fill="#c4e4ff" d="M19,32 h10 v10 h-10"/>
3760
- <path fill="#eb6d00" d="M31,16 h15 v27 h-15"/>
3761
- <path fill="#ffe1c8" d="M32,17 h13 v25 h-13"/>
3831
+ <path fill="var(--os-gray-600)" d="M2,4 h44 v5 h-44"/>
3832
+ <path fill="var(--os-gray-600)" d="M2,10 h28 v5 h-28"/>
3833
+ <path fill="var(--os-gray-600)" d="M31,10 h15 v5 h-15"/>
3834
+ <path fill="var(--os-chart-preview-blue-line)" d="M2,16 h28 v14 h-28"/>
3835
+ <path fill="var(--os-chart-preview-blue-fill)" d="M3,17 h26 v12 h-26"/>
3836
+ <path fill="var(--os-chart-preview-blue-line)" d="M2,31 h15 v12 h-15"/>
3837
+ <path fill="var(--os-chart-preview-blue-fill)" d="M3,32 h13 v10 h-13"/>
3838
+ <path fill="var(--os-chart-preview-blue-line)" d="M18,31 h12 v12 h-12"/>
3839
+ <path fill="var(--os-chart-preview-blue-fill)" d="M19,32 h10 v10 h-10"/>
3840
+ <path fill="var(--os-chart-preview-orange-line)" d="M31,16 h15 v27 h-15"/>
3841
+ <path fill="var(--os-chart-preview-orange-fill)" d="M32,17 h13 v25 h-13"/>
3842
+ </svg>
3843
+ </t>
3844
+ <t t-name="o-spreadsheet-ChartPreview.CALENDAR_CHART">
3845
+ <svg class="o-chart-preview" viewBox="0 0 48 48">
3846
+ <path fill="var(--os-gray-600)" d="M3 3h42v42H3zh1v41h40V4H4"/>
3847
+ <path
3848
+ fill="var(--os-chart-preview-orange-line)"
3849
+ d="M7 7h7v7H7m0 2h7v7H7m0 2h7v7H7m0 2h7v7H7m9-34h7v7h-7m0 2h7v7h-7m0 2h7v7h-7m0 2h7v7h-7m9-34h7v7h-7m0 11h7v7h-7m0 2h7v7h-7m9-34h7v7h-7m0 2h7v7h-7m0 2h7v7h-7m0 2h7v7h-7"
3850
+ />
3851
+ <path
3852
+ fill="var(--os-chart-preview-orange-fill)"
3853
+ d="M8 8h5v5H8m0 13h5v5H8m9 4h5v5h-5m18-5h5v5h-5"
3854
+ />
3855
+ <path
3856
+ fill="var(--os-chart-preview-orange-light)"
3857
+ d="M8 17h5v5H8m9-14h5v5h-5m0 13h5v5h-5m9 4h5v5h-5m9-32h5v5h-5m0 13h5v5h-5"
3858
+ />
3859
+ <path fill="var(--os-white-bg)" d="M8 35h5v5H8"/>
3860
+ <path fill="var(--os-chart-preview-orange-dark)" d="M25 16h7v7h-7"/>
3762
3861
  </svg>
3763
3862
  </t>
3764
3863
 
3864
+ <t t-name="o-spreadsheet-CalendarChartDesignPanel">
3865
+ <GeneralDesignEditor t-props="props">
3866
+ <t t-set-slot="general-extension">
3867
+ <Section class="'pt-0'" title.translate="Legend position">
3868
+ <select
3869
+ t-att-value="props.definition.legendPosition ?? 'bottom-left'"
3870
+ class="o-input o-chart-legend-position"
3871
+ t-on-change="this.updateLegendPosition">
3872
+ <option value="none">None</option>
3873
+ <option value="right">Right</option>
3874
+ <option value="left">Left</option>
3875
+ </select>
3876
+ </Section>
3877
+ <Section class="'pt-0'" title.translate="Values">
3878
+ <ChartShowValues t-props="props"/>
3879
+ </Section>
3880
+ </t>
3881
+ </GeneralDesignEditor>
3882
+ <SidePanelCollapsible isInitiallyCollapsed="false" title.translate="Calendar chart options">
3883
+ <t t-set-slot="content">
3884
+ <ColorScalePicker definition="props.definition" onUpdateColorScale.bind="onColormapChange"/>
3885
+ <Section class="'pt-0 o-missing-value'" title.translate="Missing value color">
3886
+ <RoundColorPicker
3887
+ currentColor="selectedMissingValueColor"
3888
+ onColorPicked.bind="updateMissingValueColor"
3889
+ />
3890
+ </Section>
3891
+ </t>
3892
+ </SidePanelCollapsible>
3893
+ <SidePanelCollapsible isInitiallyCollapsed="true" title.translate="Axes">
3894
+ <t t-set-slot="content">
3895
+ <AxisDesignEditor
3896
+ axesList="axesList"
3897
+ chartId="props.chartId"
3898
+ definition="props.definition"
3899
+ updateChart="props.updateChart"
3900
+ />
3901
+ </t>
3902
+ </SidePanelCollapsible>
3903
+ </t>
3904
+
3905
+ <t t-name="o-spreadsheet-CalendarChartConfigPanel">
3906
+ <div>
3907
+ <ChartDataSeries
3908
+ ranges="this.getDataSeriesRanges()"
3909
+ onSelectionChanged.bind="onDataSeriesRangesChanged"
3910
+ onSelectionConfirmed.bind="onDataSeriesConfirmed"
3911
+ onSelectionReordered.bind="onDataSeriesReordered"
3912
+ onSelectionRemoved.bind="onDataSeriesRemoved"
3913
+ maxNumberOfUsedRanges="1"
3914
+ canChangeDatasetOrientation="false"
3915
+ />
3916
+ <ChartLabelRange
3917
+ range="this.getLabelRange()"
3918
+ isInvalid="isLabelInvalid"
3919
+ onSelectionChanged.bind="onLabelRangeChanged"
3920
+ onSelectionConfirmed.bind="onLabelRangeConfirmed"
3921
+ options="this.getLabelRangeOptions()"
3922
+ title.translate="Date range"
3923
+ />
3924
+
3925
+ <Section title.translate="Fields to group by">
3926
+ <div class="d-flex">
3927
+ <span class="w-100">Horizontal axis</span>
3928
+ <select
3929
+ t-att-value="getGroupByType('horizontal')"
3930
+ class="o-input o-horizontal-group-by"
3931
+ t-on-change="ev => this.updateGroupBy('horizontal', ev.target.value)">
3932
+ <t t-foreach="getGroupByOptions()" t-as="groupBy" t-key="groupBy.value">
3933
+ <option
3934
+ t-att-selected="getGroupByType('horizontal') === groupBy.value"
3935
+ t-att-value="groupBy.value">
3936
+ <t t-esc="groupBy.label"/>
3937
+ </option>
3938
+ </t>
3939
+ </select>
3940
+ </div>
3941
+ <div class="d-flex">
3942
+ <span class="w-100">Vertical axis</span>
3943
+ <select
3944
+ t-att-value="getGroupByType('vertical')"
3945
+ class="o-input o-vertical-group-by"
3946
+ t-on-change="ev => this.updateGroupBy('vertical', ev.target.value)">
3947
+ <t t-foreach="getGroupByOptions()" t-as="groupBy" t-key="groupBy.value">
3948
+ <option
3949
+ t-att-selected="getGroupByType('vertical') === groupBy.value"
3950
+ t-att-value="groupBy.value">
3951
+ <t t-esc="groupBy.label"/>
3952
+ </option>
3953
+ </t>
3954
+ </select>
3955
+ </div>
3956
+ </Section>
3957
+
3958
+ <ChartErrorSection t-if="errorMessages.length" messages="errorMessages"/>
3959
+ </div>
3960
+ </t>
3961
+
3765
3962
  <t t-name="o-spreadsheet.TextStyler">
3766
3963
  <div
3767
3964
  class="o-chart-title-designer position-relative d-flex align-items-center"
3768
3965
  t-att-class="props.class">
3769
3966
  <ActionButton action="boldButtonAction" class="'o-hoverable-button'"/>
3770
3967
  <ActionButton action="italicButtonAction" class="'o-hoverable-button'"/>
3771
- <div class="o-divider" t-if="props.hasHorizontalAlign || props.hasVerticalAlign"/>
3968
+ <div
3969
+ class="o-divider border-start"
3970
+ t-if="props.hasHorizontalAlign || props.hasVerticalAlign"
3971
+ />
3772
3972
  <div class="o-dropdown position-relative" t-if="props.hasHorizontalAlign">
3773
3973
  <ActionButton
3774
3974
  action="horizontalAlignButtonAction"
@@ -3807,13 +4007,13 @@
3807
4007
  </div>
3808
4008
  </div>
3809
4009
  </div>
3810
- <div class="o-divider"/>
4010
+ <div class="o-divider border-start"/>
3811
4011
  <FontSizeEditor
3812
4012
  currentFontSize="currentFontSize"
3813
4013
  onFontSizeChanged.bind="this.updateFontSize"
3814
4014
  class="'o-hoverable-button'"
3815
4015
  />
3816
- <div class="o-divider"/>
4016
+ <div class="o-divider border-start"/>
3817
4017
  <ColorPickerWidget
3818
4018
  currentColor="props.style.color ?? props.defaultStyle?.color"
3819
4019
  toggleColorPicker="(ev) => this.toggleDropdownTool('fillChartColorTool', ev)"
@@ -3910,11 +4110,11 @@
3910
4110
  </div>
3911
4111
  <div class="w-50 ms-3" t-if="trendType === 'trailingMovingAverage'">
3912
4112
  <span class="o-section-subtitle">Window</span>
3913
- <input
3914
- t-att-value="trend.window || this.defaultWindowSize"
3915
- type="number"
3916
- class="w-100 o-input trend-window-input"
3917
- t-on-change="(ev) => this.onChangeMovingAverageWindow(index, ev)"
4113
+ <NumberInput
4114
+ value="trend.window || this.defaultWindowSize"
4115
+ class="'w-100 trend-window-input'"
4116
+ min="2"
4117
+ onChange="(value) => this.onChangeMovingAverageWindow(index, value)"
3918
4118
  />
3919
4119
  </div>
3920
4120
  <div class="w-50 ms-3" t-if="trendType === 'polynomial'">
@@ -3987,13 +4187,12 @@
3987
4187
  <t t-name="o-spreadsheet.PieHoleSize">
3988
4188
  <Section class="'pt-0'" title.translate="Center radius">
3989
4189
  <div class="d-flex flex-row">
3990
- <input
3991
- t-att-value="props.value"
3992
- type="number"
3993
- class="o-input o-pie-hole-size-input"
4190
+ <NumberInput
4191
+ value="props.value"
4192
+ class="'o-pie-hole-size-input'"
3994
4193
  min="0"
3995
4194
  max="95"
3996
- t-on-change="(ev) => debouncedOnChange(ev.target.value)"
4195
+ onChange.bind="onChange"
3997
4196
  />
3998
4197
  %
3999
4198
  </div>
@@ -4040,7 +4239,8 @@
4040
4239
  <t t-name="o-spreadsheet-ChartHumanizeNumbers">
4041
4240
  <Checkbox
4042
4241
  name="'humanizeNumbers'"
4043
- label.translate="Make numbers human-readable"
4242
+ label.translate="Use compact format"
4243
+ title="title"
4044
4244
  value="props.definition.humanize ?? true"
4045
4245
  onChange="(humanize) => props.updateChart(this.props.chartId, { humanize })"
4046
4246
  />
@@ -4138,14 +4338,92 @@
4138
4338
  </Section>
4139
4339
  </t>
4140
4340
 
4341
+ <t t-name="o-spreadsheet-ColorScalePicker">
4342
+ <Section class="'pt-0 o-color-scale'" title.translate="Color Scale">
4343
+ <div class="w-100" style="position:relative">
4344
+ <div
4345
+ class="color-scale-container d-flex justify-content-end"
4346
+ t-on-click.stop="onPointerDown">
4347
+ <span class="color-scale-label">
4348
+ <t t-esc="currentColorScaleLabel"/>
4349
+ </span>
4350
+ <div
4351
+ class="color-scale-preview w-100"
4352
+ t-att-data-test-colorscale="selectedColorScale"
4353
+ t-att-style="currentColorScaleStyle"
4354
+ />
4355
+ <span class="ms-1">
4356
+ <t t-call="o-spreadsheet-Icon.CARET_DOWN"/>
4357
+ </span>
4358
+ </div>
4359
+ <Popover t-if="state.popoverProps" t-props="state.popoverProps">
4360
+ <table t-ref="popoverRef" class="bg-white" t-att-style="state.popoverStyle">
4361
+ <tr
4362
+ class="color-scale-container custom-color-scale-container"
4363
+ t-on-click="() => this.onColorScaleChange('custom')">
4364
+ <td class="p-1 text-end">Custom</td>
4365
+ <td class="w-100 p-1">
4366
+ <div
4367
+ class="color-scale-preview o-checkers-background"
4368
+ data-test-id="custom-color-scale"
4369
+ />
4370
+ </td>
4371
+ </tr>
4372
+ <t t-foreach="colorScales" t-as="colorScale" t-key="colorScale.value">
4373
+ <tr
4374
+ class="color-scale-container"
4375
+ t-on-click="() => this.onColorScaleChange(colorScale.value)"
4376
+ t-att-title="colorScale.label">
4377
+ <td class="p-1 text-end">
4378
+ <t t-esc="colorScale.label"/>
4379
+ </td>
4380
+ <td class="w-100 p-1">
4381
+ <div
4382
+ class="color-scale-preview"
4383
+ t-att-data-test-id="colorScale.className"
4384
+ t-att-style="colorScalePreviewStyle(colorScale.value)"
4385
+ />
4386
+ </td>
4387
+ </tr>
4388
+ </t>
4389
+ </table>
4390
+ </Popover>
4391
+ </div>
4392
+ <div class="ps-3 mt-2">
4393
+ <div class="o-min-color d-flex align-items-center mb-2">
4394
+ <RoundColorPicker
4395
+ currentColor="currentColorScale.minColor"
4396
+ onColorPicked="(color) => this.setCustomColorScaleColor('minColor', color)"
4397
+ disableNoColor="true"
4398
+ />
4399
+ <span class="ps-2">Color of minimum values</span>
4400
+ </div>
4401
+ <div class="o-mid-color d-flex align-items-center mb-2">
4402
+ <RoundColorPicker
4403
+ currentColor="currentColorScale.midColor"
4404
+ onColorPicked="(color) => this.setCustomColorScaleColor('midColor', color)"
4405
+ />
4406
+ <span class="ps-2">Color of middle values</span>
4407
+ </div>
4408
+ <div class="o-max-color d-flex align-items-center">
4409
+ <RoundColorPicker
4410
+ currentColor="currentColorScale.maxColor"
4411
+ onColorPicked="(color) => this.setCustomColorScaleColor('maxColor', color)"
4412
+ disableNoColor="true"
4413
+ />
4414
+ <span class="ps-2">Color of maximum values</span>
4415
+ </div>
4416
+ </div>
4417
+ </Section>
4418
+ </t>
4419
+
4141
4420
  <t t-name="o-spreadsheet.ChartTitle">
4142
4421
  <Section class="'o-chart-title'" title="props.name">
4143
- <input
4144
- type="text"
4145
- class="o-input"
4146
- t-att-value="props.title"
4147
- t-on-change="updateTitle"
4148
- t-att-placeholder="props.placeholder"
4422
+ <TextInput
4423
+ value="props.title"
4424
+ onChange.bind="updateTitle"
4425
+ placeholder="props.placeholder"
4426
+ alwaysShowBorder="true"
4149
4427
  />
4150
4428
  <TextStyler
4151
4429
  style="props.style"
@@ -4171,10 +4449,45 @@
4171
4449
  updateStyle.bind="updateAxisTitleStyle"
4172
4450
  name="editor_label"
4173
4451
  style="axisTitleStyle"
4452
+ placeholder.translate="Add a Title"
4174
4453
  defaultStyle="{align: 'center', color: '', fontSize: defaultFontSize}"
4175
4454
  />
4176
4455
  </t>
4177
4456
 
4457
+ <t t-name="o-spreadsheet-BarChartDesignPanel">
4458
+ <GeneralDesignEditor t-props="props">
4459
+ <t t-set-slot="general-extension">
4460
+ <ChartLegend t-props="props"/>
4461
+ <Section class="'pt-0'" title.translate="Values">
4462
+ <ChartShowValues t-props="props"/>
4463
+ </Section>
4464
+ <Section t-if="isZoomable" class="'pt-0'" title.translate="Zoom">
4465
+ <Checkbox
4466
+ name="'zoomable'"
4467
+ label.translate="Show slicer"
4468
+ value="props.definition.zoomable"
4469
+ onChange.bind="onToggleZoom"
4470
+ className="'mb-2'"
4471
+ />
4472
+ </Section>
4473
+ <Section class="'pt-0'" title.translate="Number formatting">
4474
+ <ChartHumanizeNumbers t-props="props"/>
4475
+ </Section>
4476
+ </t>
4477
+ </GeneralDesignEditor>
4478
+ <SeriesWithAxisDesignEditor t-props="props"/>
4479
+ <SidePanelCollapsible isInitiallyCollapsed="true" title.translate="Axes">
4480
+ <t t-set-slot="content">
4481
+ <AxisDesignEditor
4482
+ axesList="axesList"
4483
+ chartId="props.chartId"
4484
+ definition="props.definition"
4485
+ updateChart="props.updateChart"
4486
+ />
4487
+ </t>
4488
+ </SidePanelCollapsible>
4489
+ </t>
4490
+
4178
4491
  <t t-name="o-spreadsheet-BarConfigPanel">
4179
4492
  <div>
4180
4493
  <Section class="'pt-0'">
@@ -4215,6 +4528,7 @@
4215
4528
  onChange.bind="updateTitleText"
4216
4529
  placeholder.translate="Add a Title"
4217
4530
  alwaysShowBorder="true"
4531
+ selectContentOnFocus="true"
4218
4532
  />
4219
4533
  <TextStyler
4220
4534
  style="title ?? {}"
@@ -4226,7 +4540,7 @@
4226
4540
  <div class="o-section pb-1 pt-0">
4227
4541
  <div class="o-section-title">Carousel Sections</div>
4228
4542
  </div>
4229
- <div class="o-carousel-preview-list overflow-auto" t-ref="previewList">
4543
+ <div class="o-carousel-preview-list overflow-auto bg-white" t-ref="previewList">
4230
4544
  <t t-foreach="carouselItems" t-as="item" t-key="getItemId(item)">
4231
4545
  <div
4232
4546
  class="o-carousel-preview border-bottom pe-2 position-relative w-100 d-flex align-items-center"
@@ -4248,6 +4562,7 @@
4248
4562
  <TextInput
4249
4563
  value="getItemTitle(item)"
4250
4564
  onChange="(newName) => this.renameCarouselItem(item, newName)"
4565
+ selectContentOnFocus="true"
4251
4566
  />
4252
4567
  </div>
4253
4568
  <div class="ms-auto"/>
@@ -4436,9 +4751,66 @@
4436
4751
  </span>
4437
4752
  </t>
4438
4753
 
4754
+ <t t-name="o-spreadsheet-NumberInput">
4755
+ <input
4756
+ type="number"
4757
+ t-ref="{{refName}}"
4758
+ t-att-class="inputClass"
4759
+ t-att-id="props.id"
4760
+ t-att-placeholder="props.placeholder"
4761
+ t-on-change="save"
4762
+ t-on-blur="save"
4763
+ t-on-pointerdown="onMouseDown"
4764
+ t-on-pointerup="onMouseUp"
4765
+ t-on-keydown="onKeyDown"
4766
+ t-att-min="props.min"
4767
+ t-att-max="props.max"
4768
+ />
4769
+ </t>
4770
+
4771
+ <t t-name="o-spreadsheet-NumberEditor">
4772
+ <div class="o-dropdown" t-ref="NumberEditor">
4773
+ <div
4774
+ class="o-number-editor d-flex align-items-center"
4775
+ t-att-class="props.class"
4776
+ t-att-title="props.title"
4777
+ t-on-click.stop="this.toggleList">
4778
+ <input
4779
+ type="number"
4780
+ t-att-min="props.min"
4781
+ t-att-max="props.max"
4782
+ class="o-font-size o-number-input bg-transparent border-0"
4783
+ t-on-keydown="onInputKeydown"
4784
+ t-on-wheel.prevent.stop=""
4785
+ t-on-click.stop="props.onFocusInput"
4786
+ t-on-focus.stop="onInputFocused"
4787
+ t-on-change="setValueFromInput"
4788
+ t-ref="inputNumber"
4789
+ />
4790
+ <t t-esc="props.valueIcon"/>
4791
+ <span>
4792
+ <t t-call="o-spreadsheet-Icon.CARET_DOWN"/>
4793
+ </span>
4794
+ </div>
4795
+ <Popover t-if="dropdown.isOpen" t-props="popoverProps">
4796
+ <div class="o-text-options bg-white" t-on-click.stop="" t-ref="numberList">
4797
+ <t t-foreach="props.valueList" t-as="value" t-key="value">
4798
+ <div t-att-data-size="value" t-on-click="() => this.setValueFromList(value)">
4799
+ <t t-esc="value"/>
4800
+ <t t-esc="props.valueIcon"/>
4801
+ </div>
4802
+ </t>
4803
+ </div>
4804
+ </Popover>
4805
+ </div>
4806
+ </t>
4807
+
4439
4808
  <t t-name="o-spreadsheet-Menu-Popover">
4440
4809
  <Popover t-if="props.menuItems" t-props="popoverProps">
4441
- <div t-ref="menu" class="o-menu-wrapper" t-on-mouseover="() => this.onMouseOverMainMenu()">
4810
+ <div
4811
+ t-ref="menu"
4812
+ class="o-menu-wrapper bg-white"
4813
+ t-on-mouseover="() => this.onMouseOverMainMenu()">
4442
4814
  <Menu t-props="menuProps"/>
4443
4815
  </div>
4444
4816
  <MenuPopover
@@ -4460,7 +4832,7 @@
4460
4832
  <t t-name="o-spreadsheet-Menu">
4461
4833
  <div
4462
4834
  t-ref="menu"
4463
- class="o-menu"
4835
+ class="o-menu bg-white"
4464
4836
  t-att-style="menuStyle"
4465
4837
  t-on-scroll="props.onScroll"
4466
4838
  t-on-wheel.stop=""
@@ -4468,7 +4840,7 @@
4468
4840
  t-on-click.stop=""
4469
4841
  t-on-contextmenu.prevent="">
4470
4842
  <t t-foreach="menuItemsAndSeparators" t-as="menuItem" t-key="menuItem_index">
4471
- <div t-if="menuItem === 'separator'" class="o-separator"/>
4843
+ <div t-if="menuItem === 'separator'" class="o-separator border-bottom"/>
4472
4844
  <t t-else="">
4473
4845
  <t t-set="isMenuRoot" t-value="isRoot(menuItem)"/>
4474
4846
  <t t-set="isMenuEnabled" t-value="isEnabled(menuItem)"/>
@@ -4517,7 +4889,7 @@
4517
4889
 
4518
4890
  <t t-name="o-spreadsheet-LinkEditor">
4519
4891
  <div
4520
- class="o-link-editor"
4892
+ class="o-link-editor bg-white rounded"
4521
4893
  t-on-click.stop="() => this.menu.isOpen=false"
4522
4894
  t-on-keydown="onKeyDown">
4523
4895
  <div class="o-section">
@@ -4559,7 +4931,7 @@
4559
4931
  <button
4560
4932
  t-if="!link.url"
4561
4933
  t-on-click.stop="openMenu"
4562
- class="o-special-link o-button-icon"
4934
+ class="o-special-link o-button-icon bg-white"
4563
4935
  t-ref="linkEditorMenuButton">
4564
4936
  <t t-call="o-spreadsheet-Icon.LIST"/>
4565
4937
  </button>
@@ -4582,7 +4954,7 @@
4582
4954
  </t>
4583
4955
 
4584
4956
  <t t-name="o-spreadsheet-LinkDisplay">
4585
- <div class="o-link-tool d-flex align-items-center">
4957
+ <div class="o-link-tool d-flex align-items-center bg-white rounded">
4586
4958
  <!-- t-key to prevent owl from re-using the previous img element when the link changes.
4587
4959
  The wrong/previous image would be displayed while the new one loads -->
4588
4960
  <img
@@ -5372,6 +5744,11 @@
5372
5744
  <i class="fa fa-search"/>
5373
5745
  </div>
5374
5746
  </t>
5747
+ <t t-name="o-spreadsheet-Icon.ZOOM">
5748
+ <div class="o-icon">
5749
+ <i class="fa fa-search-plus"/>
5750
+ </div>
5751
+ </t>
5375
5752
  <t t-name="o-spreadsheet-Icon.CHECK">
5376
5753
  <svg class="o-icon" viewBox="0 0 24 24">
5377
5754
  <path
@@ -5570,6 +5947,7 @@
5570
5947
  <div class="o-icon">
5571
5948
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 224 256">
5572
5949
  <path
5950
+ fill="currentColor"
5573
5951
  d="M201.4 342.6c12.5 12.5 32.8 12.5 45.3 0l160-160c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 274.7 86.6 137.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l160 160z"
5574
5952
  transform="translate(0, 9) scale(0.5,0.5)"
5575
5953
  />
@@ -5673,9 +6051,60 @@
5673
6051
  />
5674
6052
  </svg>
5675
6053
  </t>
6054
+ <t t-name="o-spreadsheet-Icon.DARK_MODE">
6055
+ <div class="o-icon">
6056
+ <i class="fa fa-moon-o"/>
6057
+ </div>
6058
+ </t>
6059
+ <t t-name="o-spreadsheet-Icon.ROTATION-0">
6060
+ <svg
6061
+ width="18"
6062
+ height="18"
6063
+ viewBox="0 0 18 18"
6064
+ transform="rotate(270)"
6065
+ xmlns="http://www.w3.org/2000/svg">
6066
+ <path
6067
+ d="M5 2h1v12h1.5l-2 2-2-2H5m6-5h1v5h1.5l-2 2-2-2H11M8 2l7 2.8V6L8 8.8l-.43-1.12 1.9-.7V3.8l-1.9-.7L8 1.98m2.7 2.25v2.3l2.8-1.1z"
6068
+ fill="currentColor"
6069
+ />
6070
+ </svg>
6071
+ </t>
6072
+ <t t-name="o-spreadsheet-Icon.ROTATION-45">
6073
+ <svg width="18" height="18" viewBox="0 0 18 18" xmlns="http://www.w3.org/2000/svg">
6074
+ <path
6075
+ d="m1.95 6.879.707-.707 8.485 8.485 1.06-1.06v2.828H9.375l1.061-1.061m.706-7.778.707-.707 3.536 3.535 1.06-1.06v2.828h-2.828l1.06-1.06M4.071 4.757l6.93-2.97.848.849-2.97 6.93-1.096-.488.849-1.839-2.249-2.248-1.838.848-.488-1.096m3.5-.318 1.626 1.626 1.203-2.757z"
6076
+ fill="currentColor"
6077
+ />
6078
+ </svg>
6079
+ </t>
6080
+ <t t-name="o-spreadsheet-Icon.ROTATION-90">
6081
+ <svg width="18" height="18" viewBox="0 0 18 18" xmlns="http://www.w3.org/2000/svg">
6082
+ <path
6083
+ d="M5 2h1v12h1.5l-2 2-2-2H5m6-5h1v5h1.5l-2 2-2-2H11M8 2l7 2.8V6L8 8.8l-.43-1.12 1.9-.7V3.8l-1.9-.7L8 1.98m2.7 2.25v2.3l2.8-1.1z"
6084
+ fill="currentColor"
6085
+ />
6086
+ </svg>
6087
+ </t>
6088
+
6089
+ <t t-name="o-spreadsheet-Icon.ROTATION-270">
6090
+ <svg width="18" height="18" viewBox="0 0 18 18" xmlns="http://www.w3.org/2000/svg">
6091
+ <path
6092
+ d="M13 16h-1V4h-1.5l2-2 2 2H13M7 9H6V4H4.5l2-2 2 2H7m3 12-7-2.8V12l7-2.8.43 1.12-1.9.7v3.18l1.9.7-.43 1.12m-2.7-2.25v-2.3l-2.8 1.1z"
6093
+ fill="currentColor"
6094
+ />
6095
+ </svg>
6096
+ </t>
6097
+ <t t-name="o-spreadsheet-Icon.ROTATION-315">
6098
+ <svg width="18" height="18" viewBox="0 0 18 18" xmlns="http://www.w3.org/2000/svg">
6099
+ <path
6100
+ d="m6.879 16.55-.707-.707 8.485-8.485-1.06-1.06h2.828v2.828l-1.061-1.061m-7.778-.707-.707-.707 3.535-3.536-1.06-1.06h2.828v2.828l-1.06-1.06M4.757 14.429l-2.97-6.93.849-.848 6.93 2.97-.488 1.096-1.839-.849-2.248 2.249.848 1.838-1.096.488m-.318-3.5 1.626-1.626-2.757-1.203z"
6101
+ fill="currentColor"
6102
+ />
6103
+ </svg>
6104
+ </t>
5676
6105
 
5677
6106
  <t t-name="o-spreadsheet-IconPicker">
5678
- <div class="o-icon-picker">
6107
+ <div class="o-icon-picker bg-white">
5679
6108
  <t t-foreach="iconSets" t-as="iconSet" t-key="iconSet">
5680
6109
  <div class="o-cf-icon-line">
5681
6110
  <div
@@ -5835,13 +6264,12 @@
5835
6264
 
5836
6265
  <t t-name="o-spreadsheet-RowResizer">
5837
6266
  <div
5838
- class="o-row-resizer"
6267
+ class="o-row-resizer o-zoomable"
5839
6268
  t-ref="rowResizer"
5840
6269
  t-on-pointermove.self="onMouseMove"
5841
6270
  t-on-mouseleave="onMouseLeave"
5842
6271
  t-on-pointerdown.self.prevent="select"
5843
6272
  t-on-click="onClick"
5844
- t-on-pointerup.self="onMouseUp"
5845
6273
  t-on-contextmenu.self="onContextMenu"
5846
6274
  t-att-class="{'o-grab': state.waitingForMove, 'o-dragging': state.isMoving}">
5847
6275
  <div
@@ -5879,13 +6307,12 @@
5879
6307
 
5880
6308
  <t t-name="o-spreadsheet-ColResizer">
5881
6309
  <div
5882
- class="o-col-resizer d-flex"
6310
+ class="o-col-resizer d-flex o-zoomable"
5883
6311
  t-ref="colResizer"
5884
6312
  t-on-pointermove.self="onMouseMove"
5885
6313
  t-on-mouseleave="onMouseLeave"
5886
6314
  t-on-pointerdown.self.prevent="select"
5887
6315
  t-on-click="onClick"
5888
- t-on-pointerup.self="onMouseUp"
5889
6316
  t-on-contextmenu.self="onContextMenu"
5890
6317
  t-att-class="{'o-grab': state.waitingForMove, 'o-dragging': state.isMoving, }">
5891
6318
  <div
@@ -6034,11 +6461,11 @@
6034
6461
 
6035
6462
  <t t-name="o-spreadsheet-GridOverlay">
6036
6463
  <div class="position-absolute" t-att-style="style">
6037
- <FiguresContainer onFigureDeleted="props.onFigureDeleted"/>
6464
+ <FiguresContainer/>
6038
6465
  </div>
6039
6466
  <div
6040
6467
  t-ref="gridOverlay"
6041
- class="o-grid-overlay overflow-hidden"
6468
+ class="o-grid-overlay overflow-hidden o-zoomable"
6042
6469
  t-att-class="{'o-paint-format-cursor': isPaintingFormat}"
6043
6470
  t-att-style="style"
6044
6471
  t-on-pointerdown="onPointerDown"
@@ -6049,7 +6476,6 @@
6049
6476
  <GridAddRowsFooter
6050
6477
  t-if="!env.model.getters.isReadonly()"
6051
6478
  t-key="env.model.getters.getActiveSheetId()"
6052
- focusGrid="props.onFigureDeleted"
6053
6479
  />
6054
6480
  <t t-slot="default"/>
6055
6481
  </div>
@@ -6063,7 +6489,8 @@
6063
6489
  <button
6064
6490
  t-on-click="onConfirm"
6065
6491
  t-att-disabled="state.errorFlag"
6066
- class="o-button flex-grow-0 me-2">
6492
+ class="o-button flex-grow-0 me-2"
6493
+ tabindex="-1">
6067
6494
  Add
6068
6495
  </button>
6069
6496
  <input
@@ -6075,6 +6502,7 @@
6075
6502
  t-on-keydown.stop="onKeydown"
6076
6503
  t-on-pointerdown.stop=""
6077
6504
  t-on-input.stop="onInput"
6505
+ tabindex="-1"
6078
6506
  />
6079
6507
  <span>more rows at the bottom</span>
6080
6508
  <ValidationMessages t-if="state.errorFlag" messages="errorMessages" msgType="'error'"/>
@@ -6083,7 +6511,7 @@
6083
6511
 
6084
6512
  <t t-name="o-spreadsheet-Grid">
6085
6513
  <div
6086
- class="o-grid w-100 h-100"
6514
+ class="o-grid w-100 h-100 o-zoomable"
6087
6515
  tabindex="-1"
6088
6516
  composerFocusableElement="true"
6089
6517
  t-on-click="focusDefaultElement"
@@ -6097,7 +6525,6 @@
6097
6525
  onGridResized.bind="onGridResized"
6098
6526
  onGridMoved.bind="moveCanvas"
6099
6527
  gridOverlayDimensions="gridOverlayDimensions"
6100
- onFigureDeleted.bind="focusDefaultElement"
6101
6528
  getGridSize="props.getGridSize"
6102
6529
  />
6103
6530
  <HeadersOverlay onOpenContextMenu="(type, x, y) => this.toggleContextMenu(type, x, y)"/>
@@ -6146,7 +6573,7 @@
6146
6573
  </t>
6147
6574
  <VerticalScrollBar topOffset="HEADER_HEIGHT"/>
6148
6575
  <HorizontalScrollBar leftOffset="HEADER_WIDTH"/>
6149
- <div class="o-scrollbar corner"/>
6576
+ <div class="o-scrollbar corner border-top border-start"/>
6150
6577
  </div>
6151
6578
  </t>
6152
6579
 
@@ -6174,7 +6601,6 @@
6174
6601
  t-component="figureComponent"
6175
6602
  figureUI="figureUI"
6176
6603
  isFullScreen="true"
6177
- onFigureDeleted="() => {}"
6178
6604
  t-key="figureUI.id"
6179
6605
  />
6180
6606
  </t>
@@ -6184,41 +6610,17 @@
6184
6610
  </t>
6185
6611
 
6186
6612
  <t t-name="o-spreadsheet-FontSizeEditor">
6187
- <div class="o-dropdown" t-ref="FontSizeEditor">
6188
- <div
6189
- class=" o-font-size-editor d-flex align-items-center"
6190
- t-att-class="props.class"
6191
- title="Font Size"
6192
- t-on-click="this.toggleFontList">
6193
- <input
6194
- type="number"
6195
- min="1"
6196
- max="400"
6197
- class="o-font-size o-number-input bg-transparent border-0"
6198
- t-on-keydown="onInputKeydown"
6199
- t-on-wheel.prevent.stop=""
6200
- t-on-click.stop="props.onFocusInput"
6201
- t-on-focus.stop="onInputFocused"
6202
- t-att-value="props.currentFontSize"
6203
- t-on-change="setSizeFromInput"
6204
- t-ref="inputFontSize"
6205
- />
6206
- <span>
6207
- <t t-call="o-spreadsheet-Icon.CARET_DOWN"/>
6208
- </span>
6209
- </div>
6210
- <Popover t-if="dropdown.isOpen" t-props="popoverProps">
6211
- <div class="o-text-options bg-white" t-on-click.stop="" t-ref="fontSizeList">
6212
- <t t-foreach="fontSizes" t-as="fontSize" t-key="fontSize">
6213
- <div
6214
- t-esc="fontSize"
6215
- t-att-data-size="fontSize"
6216
- t-on-click="() => this.setSizeFromList(fontSize)"
6217
- />
6218
- </t>
6219
- </div>
6220
- </Popover>
6221
- </div>
6613
+ <NumberEditor
6614
+ currentValue="props.currentFontSize"
6615
+ onValueChange="props.onFontSizeChanged"
6616
+ class="props.class"
6617
+ onToggle="props.onToggle"
6618
+ onFocusInput="props.onFocusInput"
6619
+ min="1"
6620
+ max="400"
6621
+ valueList="fontSizes"
6622
+ title.translate="Font Size"
6623
+ />
6222
6624
  </t>
6223
6625
 
6224
6626
  <t t-name="o-spreadsheet-FilterMenuValueList">
@@ -6240,7 +6642,7 @@
6240
6642
  </i>
6241
6643
  </div>
6242
6644
  <div
6243
- class="o-filter-menu-list d-flex flex-column"
6645
+ class="o-filter-menu-list d-flex flex-column border"
6244
6646
  t-ref="filterValueList"
6245
6647
  t-on-click="this.clearScrolledToValue"
6246
6648
  t-on-scroll="this.clearScrolledToValue">
@@ -6283,8 +6685,9 @@
6283
6685
  name="value.toString()"
6284
6686
  value="this.props.isChecked"
6285
6687
  onChange="this.props.onClick"
6286
- className="'p-2 w-100 pe-auto text-truncate'"
6688
+ className="'p-2 w-100 pe-auto'"
6287
6689
  label="value.toString()"
6690
+ title="value.toString()"
6288
6691
  />
6289
6692
  </div>
6290
6693
  </t>
@@ -6303,6 +6706,7 @@
6303
6706
  criterion="state.criterion"
6304
6707
  onCriterionChanged.bind="onCriterionChanged"
6305
6708
  disableFormulas="true"
6709
+ autofocus="true"
6306
6710
  />
6307
6711
  </t>
6308
6712
 
@@ -6323,7 +6727,7 @@
6323
6727
  </div>
6324
6728
  </t>
6325
6729
  <div class="o-filter-menu-content">
6326
- <div class="o-separator"/>
6730
+ <div class="o-separator border-bottom"/>
6327
6731
  <SidePanelCollapsible
6328
6732
  isInitiallyCollapsed="filterValueType !== 'criterion'"
6329
6733
  title.translate="Filter by criterion">
@@ -6374,7 +6778,6 @@
6374
6778
  t-att-style="container.inverseViewportStyle">
6375
6779
  <t t-foreach="container.figures" t-as="figureUI" t-key="figureUI.id">
6376
6780
  <FigureComponent
6377
- onFigureDeleted="this.props.onFigureDeleted"
6378
6781
  figureUI="figureUI"
6379
6782
  style="getFigureStyle(figureUI)"
6380
6783
  class="getFigureClass(figureUI)"
@@ -6521,7 +6924,6 @@
6521
6924
  <t
6522
6925
  t-component="figureRegistry.get(props.figureUI.tag).Component"
6523
6926
  t-key="props.figureUI.id"
6524
- onFigureDeleted="props.onFigureDeleted"
6525
6927
  figureUI="props.figureUI"
6526
6928
  editFigureStyle.bind="editWrapperStyle"
6527
6929
  openContextMenu.bind="openContextMenu"
@@ -6658,21 +7060,24 @@
6658
7060
  <div t-att-style="containerStyle">
6659
7061
  <canvas class="o-figure-canvas w-100 h-100" t-ref="graphContainer"/>
6660
7062
  </div>
6661
- <div t-if="sliceable" class="o-master-chart-container m-0">
7063
+ <div
7064
+ t-if="sliceable"
7065
+ class="o-master-chart-container m-0"
7066
+ t-att-style="masterChartContainerStyle">
6662
7067
  <canvas
6663
7068
  class="o-figure-canvas o-master-chart-canvas w-100 h-100"
6664
7069
  t-ref="masterChartCanvas"
6665
- t-on-dblclick="onDoubleClickInMasterChart"
6666
- t-on-pointerdown="onPointerDownInMasterChart"
6667
- t-on-pointermove="onPointerMoveInMasterChart"
6668
- t-on-mouseleave="onMouseLeaveMasterChart"
7070
+ t-on-dblclick="onMasterChartDoubleClick"
7071
+ t-on-pointerdown="onMasterChartPointerDown"
7072
+ t-on-pointermove="onMasterChartPointerMove"
7073
+ t-on-mouseleave="onMasterChartMouseLeave"
6669
7074
  />
6670
7075
  </div>
6671
7076
  </div>
6672
7077
  </t>
6673
7078
 
6674
7079
  <t t-name="o-spreadsheet-ErrorToolTip">
6675
- <div class="o-error-tooltip">
7080
+ <div class="o-error-tooltip bg-white">
6676
7081
  <t t-if="evaluationError">
6677
7082
  <div class="o-error-tooltip-title fw-bold text-danger">Error</div>
6678
7083
  <div class="o-error-tooltip-message">
@@ -6749,7 +7154,7 @@
6749
7154
  <t t-name="o-spreadsheet-TopBarComposer">
6750
7155
  <div class="o-topbar-composer-container w-100">
6751
7156
  <div
6752
- class="o-topbar-composer position-relative bg-white user-select-text d-flex"
7157
+ class="o-topbar-composer position-relative bg-white user-select-text d-flex border"
6753
7158
  t-att-class="{
6754
7159
  'o-topbar-composer-readonly': env.model.getters.isReadonly(),
6755
7160
  'o-topbar-composer-active': focus !== 'inactive',
@@ -6772,7 +7177,7 @@
6772
7177
 
6773
7178
  <t t-name="o-spreadsheet-StandaloneComposer">
6774
7179
  <div
6775
- class="o-standalone-composer"
7180
+ class="o-standalone-composer border-bottom"
6776
7181
  t-on-click.stop=""
6777
7182
  t-att-class="containerClass"
6778
7183
  t-att-title="props.title">
@@ -6789,7 +7194,7 @@
6789
7194
 
6790
7195
  <t t-name="o-spreadsheet-SpeechBubble">
6791
7196
  <t t-portal="'.o-spreadsheet'">
6792
- <div class="o-speech-bubble position-absolute px-3" t-ref="bubble">
7197
+ <div class="o-speech-bubble position-absolute px-3 border" t-ref="bubble">
6793
7198
  <div class="o-speech-content text-truncate pb-1" t-esc="props.content"/>
6794
7199
  </div>
6795
7200
  </t>
@@ -6797,7 +7202,7 @@
6797
7202
 
6798
7203
  <t t-name="o-spreadsheet-GridComposer">
6799
7204
  <div
6800
- class="o-cell-reference"
7205
+ class="o-cell-reference rounded"
6801
7206
  t-if="shouldDisplayCellReference"
6802
7207
  t-att-style="cellReferenceStyle"
6803
7208
  t-esc="cellReference"
@@ -6808,30 +7213,28 @@
6808
7213
  </t>
6809
7214
 
6810
7215
  <t t-name="o-spreadsheet-FunctionDescriptionProvider">
6811
- <div class="o-formula-assistant-container user-select-none shadow">
7216
+ <div
7217
+ class="o-formula-assistant-container shadow"
7218
+ tabindex="-1"
7219
+ t-on-pointerdown=""
7220
+ t-on-pointerup.stop=""
7221
+ t-on-keydown.stop=""
7222
+ t-on-click.stop="">
6812
7223
  <t t-set="context" t-value="getContext()"/>
6813
- <div class="o-formula-assistant" t-if="context.functionDescription.name">
7224
+ <div class="o-formula-assistant bg-white" t-if="context.functionDescription.name">
6814
7225
  <div class="o-formula-assistant-head d-flex flex-row justify-content-between">
6815
7226
  <div>
6816
- <span t-esc="context.functionDescription.name"/>
6817
- (
6818
- <t t-foreach="context.functionDescription.args" t-as="arg" t-key="arg.name">
6819
- <span t-if="arg_index > '0'" t-esc="formulaArgSeparator"/>
7227
+ <t t-foreach="formulaHeaderContent" t-as="part" t-key="part_index">
6820
7228
  <span
6821
- t-att-class="{ 'o-formula-assistant-focus': context.argsToFocus.includes(arg_index) }">
6822
- <span>
6823
- <span t-if="arg.optional || arg.repeating || arg.default">[</span>
6824
- <span t-esc="arg.name"/>
6825
- <span t-if="arg.repeating">, ...</span>
6826
- <span t-if="arg.optional || arg.repeating || arg.default">]</span>
6827
- </span>
6828
- </span>
7229
+ t-esc="part.content"
7230
+ t-att-class="part.focused ? 'o-formula-assistant-focus' : ''"
7231
+ />
6829
7232
  </t>
6830
- )
6831
7233
  </div>
6832
7234
  <div
6833
7235
  class="collapsor px-2 d-flex align-items-center rounded"
6834
7236
  t-att-class="state.isCollapsed ? 'collapsed' : ''"
7237
+ t-on-pointerdown.prevent=""
6835
7238
  t-on-click="() => this.toggle()">
6836
7239
  <span class="collapsor-arrow d-inline-block">
6837
7240
  <t t-call="o-spreadsheet-Icon.ANGLE_DOWN"/>
@@ -6840,27 +7243,34 @@
6840
7243
  </div>
6841
7244
 
6842
7245
  <Collapse isCollapsed="state.isCollapsed">
6843
- <div class="o-formula-assistant-core pb-3 m-3">
7246
+ <div class="o-formula-assistant-core pb-3 m-3 border-bottom">
6844
7247
  <div class="o-formula-assistant-gray">ABOUT</div>
6845
7248
  <div t-esc="context.functionDescription.description"/>
6846
7249
  </div>
6847
7250
 
7251
+ <t
7252
+ t-set="firstRepeatableGroupOptional"
7253
+ t-value="context.functionDescription.args.some(arg => arg.repeating and arg.optional)"
7254
+ />
7255
+
6848
7256
  <t t-foreach="context.functionDescription.args" t-as="arg" t-key="arg.name">
6849
7257
  <div
6850
7258
  class="o-formula-assistant-arg p-3 pt-0 display-flex flex-column"
6851
- t-att-class="{
6852
- 'o-formula-assistant-gray': context.argsToFocus.length > 0,
6853
- 'o-formula-assistant-focus': context.argsToFocus.includes(arg_index),
6854
- }">
6855
- <div>
6856
- <span t-esc="arg.name"/>
7259
+ t-att-class="{'o-formula-assistant-gray': context.argsToFocus.length > 0}">
7260
+ <div
7261
+ t-att-class="{'o-formula-assistant-focus': context.argsToFocus.includes(arg_index)}">
7262
+ <span t-if="arg.repeating">
7263
+ <span t-esc="arg.name + (context.repeatingArgGroupIndex + 1)"/>
7264
+ </span>
7265
+ <span t-else="">
7266
+ <span t-esc="arg.name"/>
7267
+ </span>
6857
7268
  <span
6858
- t-if="arg.optional || arg.repeating || arg.default ">&#xA0;- [optional]&#xA0;</span>
7269
+ t-if="arg.optional || arg.default || (arg.repeating and (firstRepeatableGroupOptional or context.repeatingArgGroupIndex > 0))">&#xA0;- [optional]&#xA0;</span>
6859
7270
  <span t-if="arg.default">
6860
7271
  <span>default:&#xA0;</span>
6861
7272
  <t t-esc="arg.defaultValue"/>
6862
7273
  </span>
6863
- <span t-if="arg.repeating">repeatable</span>
6864
7274
  </div>
6865
7275
  <div class="o-formula-assistant-arg-description" t-esc="arg.description"/>
6866
7276
  </div>
@@ -6871,7 +7281,7 @@
6871
7281
  </t>
6872
7282
 
6873
7283
  <t t-name="o-spreadsheet-Composer">
6874
- <div class="o-composer-container w-100 h-100">
7284
+ <div class="o-composer-container w-100 h-100" t-ref="composerContainer">
6875
7285
  <t t-set="autoCompleteProposals" t-value="props.composerStore.autoCompleteProposals"/>
6876
7286
  <t t-set="canBeToggled" t-value="props.composerStore.canBeToggled"/>
6877
7287
  <t
@@ -6883,10 +7293,9 @@
6883
7293
  t-if="props.focus !== 'inactive' and assistantIsAvailable and canBeToggled and assistant.forcedClosed"
6884
7294
  role="button"
6885
7295
  title="Show formula help"
6886
- t-on-click="openAssistant"
7296
+ t-on-click.stop="openAssistant"
6887
7297
  t-on-pointerdown.prevent.stop=""
6888
- t-on-click.prevent.stop=""
6889
- t-on-pointerup.prevent.stop=""
7298
+ t-on-pointerup.stop=""
6890
7299
  class="fa-stack position-absolute translate-middle force-open-assistant fs-4">
6891
7300
  <i class="fa fa-circle fa-stack-1x fa-inverse"/>
6892
7301
  <i class="fa fa-question-circle fa-stack-1x"/>
@@ -6922,22 +7331,24 @@
6922
7331
  t-att-style="assistantContainerStyle"
6923
7332
  t-if="props.focus !== 'inactive' and assistantIsAvailable and !(canBeToggled and assistant.forcedClosed)"
6924
7333
  t-on-wheel.stop=""
6925
- t-on-pointerdown.prevent.stop=""
6926
- t-on-pointerup.prevent.stop=""
6927
- t-on-click.prevent.stop="">
7334
+ t-on-pointerdown.stop=""
7335
+ t-on-pointerup.stop=""
7336
+ t-on-click.stop="">
6928
7337
  <span
6929
7338
  t-if="canBeToggled and !assistant.forcedClosed"
6930
7339
  role="button"
6931
7340
  t-on-click="closeAssistant"
7341
+ t-on-pointerdown.prevent.stop=""
6932
7342
  class="fa-stack position-absolute top-0 start-100 translate-middle fs-4">
6933
7343
  <i class="fa fa-circle fa-stack-1x fa-inverse"/>
6934
- <i class="fa fa-times-circle fa-stack-1x text-muted"/>
7344
+ <i class="fa fa-times-circle fa-stack-1x"/>
6935
7345
  </span>
6936
7346
  <div class="o-composer-assistant overflow-auto" t-att-style="assistantStyle">
6937
7347
  <FunctionDescriptionProvider
6938
7348
  t-if="functionDescriptionState.showDescription"
6939
7349
  functionDescription="functionDescriptionState.functionDescription"
6940
7350
  argsToFocus="functionDescriptionState.argsToFocus"
7351
+ repeatingArgGroupIndex="functionDescriptionState.repeatingArgGroupIndex"
6941
7352
  />
6942
7353
  <div
6943
7354
  t-if="functionDescriptionState.showDescription and autoCompleteProposals.length"
@@ -6963,8 +7374,9 @@
6963
7374
  <t t-name="o-spreadsheet-TextValueProvider">
6964
7375
  <div
6965
7376
  t-ref="autoCompleteList"
7377
+ t-on-pointerdown.prevent=""
6966
7378
  t-att-class="{
6967
- 'o-autocomplete-dropdown': props.proposals.length}">
7379
+ 'o-autocomplete-dropdown bg-white': props.proposals.length}">
6968
7380
  <t t-foreach="props.proposals" t-as="proposal" t-key="proposal.text + proposal_index">
6969
7381
  <div
6970
7382
  class="d-flex flex-column text-start"
@@ -7017,7 +7429,7 @@
7017
7429
 
7018
7430
  <t t-name="o-spreadsheet-ColorPicker">
7019
7431
  <Popover t-props="popoverProps">
7020
- <div class="o-color-picker" t-on-click.stop="" t-att-style="colorPickerStyle">
7432
+ <div class="o-color-picker bg-white" t-on-click.stop="" t-att-style="colorPickerStyle">
7021
7433
  <div class="o-color-picker-section-name">Standard</div>
7022
7434
  <div class="colors-grid">
7023
7435
  <div
@@ -7036,14 +7448,14 @@
7036
7448
  </div>
7037
7449
  </div>
7038
7450
  </div>
7039
- <div class="o-separator"/>
7451
+ <div class="o-separator border-bottom"/>
7040
7452
  <div
7041
7453
  class="o-color-picker-section-name o-color-picker-toggler"
7042
7454
  t-on-click="toggleColorPicker">
7043
7455
  <span>Custom</span>
7044
7456
  </div>
7045
7457
  <div class="colors-grid o-color-picker-toggler" t-on-click.stop="toggleColorPicker">
7046
- <div class="o-color-picker-line-item o-color-picker-toggler-button">
7458
+ <div class="o-color-picker-line-item bg-white o-color-picker-toggler-button">
7047
7459
  <div class="o-color-picker-toggler-sign">
7048
7460
  <t t-call="o-spreadsheet-Icon.PLUS"/>
7049
7461
  </div>
@@ -7075,7 +7487,7 @@
7075
7487
  <div class="magnifier pe-none" t-att-style="pointerStyle"/>
7076
7488
  </div>
7077
7489
  <div class="o-hue-container" t-on-pointerdown="dragHuePointer">
7078
- <div class="o-hue-picker" t-on-click.stop=""/>
7490
+ <div class="o-hue-picker border rounded" t-on-click.stop=""/>
7079
7491
  <div class="o-hue-slider pe-none" t-att-style="sliderStyle">
7080
7492
  <t t-call="o-spreadsheet-Icon.CARET_UP"/>
7081
7493
  </div>
@@ -7083,16 +7495,17 @@
7083
7495
  <div class="o-custom-input-preview">
7084
7496
  <input
7085
7497
  type="text"
7498
+ class="border rounded"
7086
7499
  t-att-class="{'o-wrong-color': !isHexColorInputValid }"
7087
7500
  t-on-click.stop=""
7088
7501
  t-att-value="state.customHexColor"
7089
7502
  t-on-input="setHexColor"
7090
7503
  />
7091
- <div class="o-color-preview" t-att-style="colorPreviewStyle"/>
7504
+ <div class="o-color-preview border rounded" t-att-style="colorPreviewStyle"/>
7092
7505
  </div>
7093
7506
  <div class="o-custom-input-buttons">
7094
7507
  <button
7095
- class="o-add-button"
7508
+ class="o-add-button border rounded"
7096
7509
  t-att-class="{'o-disabled': !state.customHexColor or !isHexColorInputValid}"
7097
7510
  t-on-click.stop="addCustomColor">
7098
7511
  Add
@@ -7100,9 +7513,9 @@
7100
7513
  </div>
7101
7514
  </div>
7102
7515
  <t t-if="!props.disableNoColor">
7103
- <div class="o-separator"/>
7516
+ <div class="o-separator border-bottom"/>
7104
7517
  <div class="o-buttons">
7105
- <button t-on-click="resetColor" class="o-cancel">No Color</button>
7518
+ <button t-on-click="resetColor" class="o-cancel border rounded">No Color</button>
7106
7519
  </div>
7107
7520
  </t>
7108
7521
  </div>
@@ -7115,7 +7528,7 @@
7115
7528
 
7116
7529
  <t t-name="o-spreadsheet-BottomBar">
7117
7530
  <div
7118
- class="o-spreadsheet-bottom-bar o-two-columns d-flex flex-fill align-items-center overflow-hidden"
7531
+ class="o-spreadsheet-bottom-bar o-two-columns d-flex flex-fill align-items-center overflow-hidden border-top"
7119
7532
  t-on-click="props.onClick"
7120
7533
  t-ref="bottomBar"
7121
7534
  t-on-contextmenu.prevent="">
@@ -7227,13 +7640,14 @@
7227
7640
  <t t-name="o-spreadsheet-BottomBarSheet">
7228
7641
  <Ripple>
7229
7642
  <div
7230
- class="o-sheet d-flex align-items-center user-select-none text-nowrap "
7643
+ class="o-sheet d-flex align-items-center user-select-none text-nowrap border-start border-end"
7231
7644
  tabindex="-1"
7232
7645
  composerFocusableElement="true"
7233
7646
  t-on-pointerdown="(ev) => this.onMouseDown(ev)"
7234
7647
  t-on-click="onClick"
7235
7648
  t-on-contextmenu.prevent="(ev) => this.onContextMenu(ev)"
7236
7649
  t-ref="sheetDiv"
7650
+ t-key="sheetName"
7237
7651
  t-att-style="props.style"
7238
7652
  t-att-title="sheetName"
7239
7653
  t-att-data-id="props.sheetId"
@@ -7300,7 +7714,7 @@
7300
7714
  <t t-set="border_color">Border Color</t>
7301
7715
  <Popover t-props="popoverProps">
7302
7716
  <div
7303
- class="d-flex o-border-selector"
7717
+ class="d-flex o-border-selector bg-white"
7304
7718
  t-on-click.stop=""
7305
7719
  t-att-class="props.class ? props.class : ''">
7306
7720
  <div class="o-border-selector-section">
@@ -7321,7 +7735,7 @@
7321
7735
  </span>
7322
7736
  </div>
7323
7737
  </div>
7324
- <div class="o-divider"/>
7738
+ <div class="o-divider border-end"/>
7325
7739
  <div class="o-border-selector-section">
7326
7740
  <div
7327
7741
  class="m-0 p-0 d-flex align-items-center justify-content-center o-with-color o-hoverable-button"
@@ -7349,7 +7763,7 @@
7349
7763
  <Popover
7350
7764
  t-props="lineStylePickerPopoverProps"
7351
7765
  t-if="state.activeTool === 'borderTypeTool'">
7352
- <div class="o-border-style-dropdown">
7766
+ <div class="o-border-style-dropdown bg-white">
7353
7767
  <t t-foreach="borderStyles" t-as="borderStyle" t-key="borderStyle">
7354
7768
  <div
7355
7769
  t-att-title="borderStyle"