@conduction/nextcloud-vue 2.149.0 → 2.150.0

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.
@@ -24950,6 +24950,9 @@ var script$8z = {
24950
24950
  aggregateData: null,
24951
24951
  // The `cellSource` matrix, laid out (`{ series, categories, columnKeys }`), or null.
24952
24952
  cellData: null,
24953
+ // The record a `cellSource` with `cellsPath` read its cells from, for
24954
+ // `@source.<field>` in the notice.
24955
+ cellRecord: null,
24953
24956
  // Active `views[]` switcher key (null = the first view). Local
24954
24957
  // UI state only — never persisted.
24955
24958
  activeViewKey: null,
@@ -25594,6 +25597,14 @@ var script$8z = {
25594
25597
  }
25595
25598
  const declared = def.values && typeof def.values === 'object' ? def.values : {};
25596
25599
  const resolved = resolveFilterTokens(declared, this.chartTokenCtx());
25600
+ // `@source.<field>`: a field of the record the matrix read its cells
25601
+ // from (the matrix's name and version on an enforcement advice).
25602
+ for (const [name, token] of Object.entries(declared)) {
25603
+ if (typeof token === 'string' && token.startsWith('@source.')) {
25604
+ const value = token.slice('@source.'.length).split('.').reduce((at, key) => (at && typeof at === 'object' ? at[key] : undefined), this.cellRecord);
25605
+ resolved[name] = value === undefined ? null : value;
25606
+ }
25607
+ }
25597
25608
  const source = this.cellSource && typeof this.cellSource === 'object' ? this.cellSource : {};
25598
25609
  const maps = { rows: source.rowLabels, columns: source.columnLabels, values: source.valueLabels };
25599
25610
  const words = {};
@@ -26322,6 +26333,7 @@ var script$8z = {
26322
26333
  if (this._cellRequest !== key) {
26323
26334
  return
26324
26335
  }
26336
+ this.cellRecord = this.cellSource.cellsPath ? (records[0] || null) : null;
26325
26337
  if (this.cellSource.cellsPath) {
26326
26338
  const { cells, config } = cellsFromRecord(records[0] || null, this.cellSource, cellFilter);
26327
26339
  this.cellData = pivotCells(cells, config);
@@ -27060,7 +27072,7 @@ function render$8y(_ctx, _cache, $props, $setup, $data, $options) {
27060
27072
  }
27061
27073
 
27062
27074
  script$8z.render = render$8y;
27063
- script$8z.__scopeId = "data-v-b6e600c4";
27075
+ script$8z.__scopeId = "data-v-37644514";
27064
27076
  const __sfc_main$8t = script$8z;
27065
27077
 
27066
27078
  /**
@@ -41834,6 +41846,22 @@ function formatLongDate(value, now = new Date(), withYear = false) {
41834
41846
  }
41835
41847
  }
41836
41848
 
41849
+ /**
41850
+ * How many entries a list holds; with a key, the entries of that list in each
41851
+ * of its entries summed (`{sections|count:items}`: the questions of every
41852
+ * section of a checklist).
41853
+ *
41854
+ * @param {Array} list The list.
41855
+ * @param {string} key The key of each entry's own list, or '' to count the entries.
41856
+ * @return {number} The count.
41857
+ */
41858
+ function countEntries(list, key) {
41859
+ if (key === '') {
41860
+ return list.length
41861
+ }
41862
+ return list.reduce((sum, entry) => sum + (entry && Array.isArray(entry[key]) ? entry[key].length : 0), 0)
41863
+ }
41864
+
41837
41865
  /**
41838
41866
  * Format one token value.
41839
41867
  *
@@ -41850,7 +41878,7 @@ function formatLongDate(value, now = new Date(), withYear = false) {
41850
41878
  function formatValue(value, format, now, arg = '', object = null, config = null, formatters = null) {
41851
41879
  // `{list|count}`: how many entries a list holds, nothing for an empty one.
41852
41880
  if (format === 'count') {
41853
- const count = Array.isArray(value) ? value.length : Number(value);
41881
+ const count = Array.isArray(value) ? countEntries(value, arg) : Number(value);
41854
41882
  return Number.isFinite(count) && count > 0 ? String(count) : ''
41855
41883
  }
41856
41884
  if (value === null || value === undefined || value === '' || typeof value === 'object') {
@@ -41934,7 +41962,8 @@ function formatValue(value, format, now, arg = '', object = null, config = null,
41934
41962
  * ("vandaag, 09.42"), `{path|ago}` says how long ago it was ("10 min
41935
41963
  * geleden", "vanochtend", "vrijdag"), and `{path|days}` is the
41936
41964
  * whole days since that date ("has waited {createdAt|days} days"),
41937
- * `{path|count}` is how many entries a list holds (nothing for an empty one),
41965
+ * `{path|count}` is how many entries a list holds (nothing for an empty one;
41966
+ * `{path|count:key}` sums the `key` list of each entry),
41938
41967
  * `{path|lower}` writes the value in lower case ("Step 2: {statusLabel|lower}"
41939
41968
  * reads "Step 2: in progress" mid-sentence), and any other name is one of
41940
41969
  * the app's formatters, passed as `context.formatters` (`{id|caseAddress}`).
@@ -1,4 +1,4 @@
1
1
  [diffend] Oversized file quarantined before diffing.
2
2
  name: package/dist/nextcloud-vue.cjs.js.map
3
- size: 50052261 bytes
4
- sha256: 327e0c55ac598135853795870268afcbc79945b1d1f524ddd42d2b7e7b752161
3
+ size: 50055380 bytes
4
+ sha256: c2f523dc7dc2364a1deb46100db51b95207cb80241f95d5c5daadc73c9fad6e4
@@ -4527,6 +4527,7 @@ body:has(.cn-look-board):not(:has(.cn-look-nextcloud)) .modal-mask {
4527
4527
 
4528
4528
  .cn-board-view.cn-board-view--board .cn-board-view__card-sub {
4529
4529
  font-size: 13px;
4530
+ line-height: normal;
4530
4531
  color: var(--color-text-maxcontrast);
4531
4532
  }
4532
4533
 
@@ -4546,6 +4547,7 @@ body:has(.cn-look-board):not(:has(.cn-look-nextcloud)) .modal-mask {
4546
4547
 
4547
4548
  .cn-board-view.cn-board-view--board .cn-board-view__card-footer {
4548
4549
  display: flex;
4550
+ line-height: normal;
4549
4551
  align-items: center;
4550
4552
  justify-content: space-between;
4551
4553
  gap: 8px;
@@ -6291,17 +6293,19 @@ body:has(.cn-look-board):not(:has(.cn-look-nextcloud)) .modal-mask {
6291
6293
  margin: 0;
6292
6294
  font-size: 17px;
6293
6295
  font-weight: 700;
6294
- line-height: 1.3;
6296
+ line-height: normal;
6295
6297
  text-decoration: none;
6296
6298
  white-space: normal;
6297
6299
  }
6298
6300
 
6299
6301
  .cn-look-board .cn-object-card--board .cn-object-card__record-meta {
6300
6302
  --nldesign-component-paragraph-font-size: 14px;
6303
+ --nldesign-component-paragraph-line-height: normal;
6301
6304
  --nldesign-component-paragraph-color: var(--color-text-maxcontrast);
6302
6305
  margin: 0;
6303
6306
  color: var(--color-text-maxcontrast);
6304
6307
  font-size: 14px;
6308
+ line-height: normal;
6305
6309
  }
6306
6310
 
6307
6311
  /* The meta line, note and description are paragraphs: each hands the theme,
@@ -6309,11 +6313,13 @@ body:has(.cn-look-board):not(:has(.cn-look-nextcloud)) .modal-mask {
6309
6313
  .cn-look-board .cn-object-card--board .cn-object-card__record-note {
6310
6314
  --nldesign-component-paragraph-font-size: 13px;
6311
6315
  --nldesign-component-paragraph-font-weight: 600;
6316
+ --nldesign-component-paragraph-line-height: normal;
6312
6317
  --nldesign-component-paragraph-color: var(--cn-board-text-soft);
6313
6318
  margin: 0;
6314
6319
  color: var(--cn-board-text-soft);
6315
6320
  font-size: 13px;
6316
6321
  font-weight: 600;
6322
+ line-height: normal;
6317
6323
  }
6318
6324
 
6319
6325
  .cn-look-board .cn-object-card--board .cn-object-card__record-note--purple {
@@ -16996,7 +17002,7 @@ li[data-cn-admin-tag] > .action-link::after {
16996
17002
  }
16997
17003
 
16998
17004
 
16999
- .cn-chart-widget[data-v-b6e600c4] {
17005
+ .cn-chart-widget[data-v-37644514] {
17000
17006
  width: 100%;
17001
17007
  /* A chart FITS its container — it is never a scroll region. apexcharts
17002
17008
  sizes its SVG from the element it is mounted in, but it also enforces
@@ -17018,13 +17024,13 @@ li[data-cn-admin-tag] > .action-link::after {
17018
17024
  takes what is left, so the chart is sized by the box rather than sizing it.
17019
17025
  `min-height: 0` drops the 100px floor — on a fixed-height surface a floor is
17020
17026
  the thing that produces the overflow it was meant to prevent. */
17021
- .cn-chart-widget--fit[data-v-b6e600c4] {
17027
+ .cn-chart-widget--fit[data-v-37644514] {
17022
17028
  height: 100%;
17023
17029
  min-height: 0;
17024
17030
  display: flex;
17025
17031
  flex-direction: column;
17026
17032
  }
17027
- .cn-chart-widget__canvas[data-v-b6e600c4] {
17033
+ .cn-chart-widget__canvas[data-v-37644514] {
17028
17034
  min-width: 0;
17029
17035
  max-width: 100%;
17030
17036
  /* Never a scroll region (see the root). `overflow-x: hidden` alone made
@@ -17037,14 +17043,14 @@ li[data-cn-admin-tag] > .action-link::after {
17037
17043
  /* apexcharts writes an inline `width` onto its own wrapper from its measured
17038
17044
  minimum, which beats the container when the container is narrower. Cap the
17039
17045
  painted box so the inline width cannot push past the widget's border. */
17040
- .cn-chart-widget[data-v-b6e600c4] .apexcharts-canvas,
17041
- .cn-chart-widget[data-v-b6e600c4] .apexcharts-canvas svg {
17046
+ .cn-chart-widget[data-v-37644514] .apexcharts-canvas,
17047
+ .cn-chart-widget[data-v-37644514] .apexcharts-canvas svg {
17042
17048
  max-width: 100%;
17043
17049
  }
17044
17050
 
17045
17051
  /* The SVG is a block: as an inline box it sits on a line and adds the line's
17046
17052
  descender space under the chart. */
17047
- .cn-chart-widget[data-v-b6e600c4] .apexcharts-canvas svg {
17053
+ .cn-chart-widget[data-v-37644514] .apexcharts-canvas svg {
17048
17054
  display: block;
17049
17055
  }
17050
17056
 
@@ -17052,24 +17058,24 @@ li[data-cn-admin-tag] > .action-link::after {
17052
17058
  would grow to its content, i.e. to the chart, and the percentage height would
17053
17059
  resolve against a box the chart itself defined. `overflow: hidden` keeps a
17054
17060
  sub-pixel rounding difference from reintroducing a scrollbar. */
17055
- .cn-chart-widget--fit .cn-chart-widget__canvas[data-v-b6e600c4] {
17061
+ .cn-chart-widget--fit .cn-chart-widget__canvas[data-v-37644514] {
17056
17062
  flex: 1 1 0;
17057
17063
  min-height: 0;
17058
17064
  overflow: hidden;
17059
17065
  }
17060
- .cn-chart-widget__fallback[data-v-b6e600c4] {
17066
+ .cn-chart-widget__fallback[data-v-37644514] {
17061
17067
  display: flex;
17062
17068
  align-items: center;
17063
17069
  justify-content: center;
17064
17070
  min-height: 150px;
17065
17071
  color: var(--color-text-maxcontrast);
17066
17072
  }
17067
- .cn-chart-widget__html[data-v-b6e600c4] {
17073
+ .cn-chart-widget__html[data-v-37644514] {
17068
17074
  display: flex;
17069
17075
  flex-direction: column;
17070
17076
  gap: 12px;
17071
17077
  }
17072
- .cn-chart-widget__bar-list[data-v-b6e600c4] {
17078
+ .cn-chart-widget__bar-list[data-v-37644514] {
17073
17079
  display: flex;
17074
17080
  flex-direction: column;
17075
17081
  gap: 10px;
@@ -17077,7 +17083,7 @@ li[data-cn-admin-tag] > .action-link::after {
17077
17083
  margin: 0;
17078
17084
  padding: 0;
17079
17085
  }
17080
- .cn-chart-widget__bar-line[data-v-b6e600c4] {
17086
+ .cn-chart-widget__bar-line[data-v-37644514] {
17081
17087
  align-items: center;
17082
17088
  background: none;
17083
17089
  border: 0;
@@ -17092,32 +17098,32 @@ li[data-cn-admin-tag] > .action-link::after {
17092
17098
  text-align: start;
17093
17099
  width: 100%;
17094
17100
  }
17095
- .cn-chart-widget__bar-line--drill[data-v-b6e600c4] {
17101
+ .cn-chart-widget__bar-line--drill[data-v-37644514] {
17096
17102
  border-radius: var(--border-radius-small, 4px);
17097
17103
  cursor: pointer;
17098
17104
  }
17099
- .cn-chart-widget__bar-line--drill:hover .cn-chart-widget__bar-label[data-v-b6e600c4],
17100
- .cn-chart-widget__bar-line--drill:focus-visible .cn-chart-widget__bar-label[data-v-b6e600c4] {
17105
+ .cn-chart-widget__bar-line--drill:hover .cn-chart-widget__bar-label[data-v-37644514],
17106
+ .cn-chart-widget__bar-line--drill:focus-visible .cn-chart-widget__bar-label[data-v-37644514] {
17101
17107
  text-decoration: underline;
17102
17108
  }
17103
- .cn-chart-widget__bar-label[data-v-b6e600c4] {
17109
+ .cn-chart-widget__bar-label[data-v-37644514] {
17104
17110
  overflow: hidden;
17105
17111
  text-overflow: ellipsis;
17106
17112
  white-space: nowrap;
17107
17113
  }
17108
- .cn-chart-widget__bar-track[data-v-b6e600c4] {
17114
+ .cn-chart-widget__bar-track[data-v-37644514] {
17109
17115
  background: var(--color-background-dark);
17110
17116
  border-radius: 4px;
17111
17117
  display: block;
17112
17118
  height: 14px;
17113
17119
  overflow: hidden;
17114
17120
  }
17115
- .cn-chart-widget__bar-fill[data-v-b6e600c4] {
17121
+ .cn-chart-widget__bar-fill[data-v-37644514] {
17116
17122
  background: var(--color-primary-element);
17117
17123
  display: block;
17118
17124
  height: 100%;
17119
17125
  }
17120
- .cn-chart-widget__bar-value[data-v-b6e600c4] {
17126
+ .cn-chart-widget__bar-value[data-v-37644514] {
17121
17127
  font-weight: 600;
17122
17128
  text-align: end;
17123
17129
  white-space: nowrap;
@@ -17125,10 +17131,10 @@ li[data-cn-admin-tag] > .action-link::after {
17125
17131
 
17126
17132
  /* `barValueAtEnd`: no track; the bar takes its share of the row and gives way
17127
17133
  to the value right after its end, so the longest bar still fits. */
17128
- .cn-chart-widget__bar-list--value-at-end .cn-chart-widget__bar-line[data-v-b6e600c4] {
17134
+ .cn-chart-widget__bar-list--value-at-end .cn-chart-widget__bar-line[data-v-37644514] {
17129
17135
  grid-template-columns: minmax(80px, 130px) minmax(0, 1fr);
17130
17136
  }
17131
- .cn-chart-widget__bar-list--value-at-end .cn-chart-widget__bar-track[data-v-b6e600c4] {
17137
+ .cn-chart-widget__bar-list--value-at-end .cn-chart-widget__bar-track[data-v-37644514] {
17132
17138
  align-items: center;
17133
17139
  background: none;
17134
17140
  display: flex;
@@ -17136,71 +17142,71 @@ li[data-cn-admin-tag] > .action-link::after {
17136
17142
  height: auto;
17137
17143
  overflow: visible;
17138
17144
  }
17139
- .cn-chart-widget__bar-list--value-at-end .cn-chart-widget__bar-fill[data-v-b6e600c4] {
17145
+ .cn-chart-widget__bar-list--value-at-end .cn-chart-widget__bar-fill[data-v-37644514] {
17140
17146
  border-radius: 4px;
17141
17147
  flex: 0 1 auto;
17142
17148
  height: 18px;
17143
17149
  min-width: 2px;
17144
17150
  }
17145
- .cn-chart-widget__bar-list--value-at-end .cn-chart-widget__bar-value[data-v-b6e600c4] {
17151
+ .cn-chart-widget__bar-list--value-at-end .cn-chart-widget__bar-value[data-v-37644514] {
17146
17152
  flex: none;
17147
17153
  text-align: start;
17148
17154
  }
17149
- .cn-chart-widget__footnote[data-v-b6e600c4] {
17155
+ .cn-chart-widget__footnote[data-v-37644514] {
17150
17156
  color: var(--color-text-maxcontrast);
17151
17157
  margin: 0;
17152
17158
  }
17153
- .cn-chart-widget__notice[data-v-b6e600c4] {
17159
+ .cn-chart-widget__notice[data-v-37644514] {
17154
17160
  margin: 12px 0 0;
17155
17161
  }
17156
- .cn-chart-widget__notice-text[data-v-b6e600c4] {
17162
+ .cn-chart-widget__notice-text[data-v-37644514] {
17157
17163
  margin: 0;
17158
17164
  }
17159
17165
 
17160
17166
  /* Under an ApexCharts plot the footnote is a sibling of the canvas, so it keeps
17161
17167
  its own line height while the canvas takes the rest of a fitted column. */
17162
- .cn-chart-widget > .cn-chart-widget__footnote[data-v-b6e600c4] {
17168
+ .cn-chart-widget > .cn-chart-widget__footnote[data-v-37644514] {
17163
17169
  flex: 0 0 auto;
17164
17170
  margin-top: 8px;
17165
17171
  }
17166
- .cn-chart-widget__matrix[data-v-b6e600c4] {
17172
+ .cn-chart-widget__matrix[data-v-37644514] {
17167
17173
  display: grid;
17168
17174
  gap: 4px;
17169
17175
  }
17170
- .cn-chart-widget__matrix-row[data-v-b6e600c4] {
17176
+ .cn-chart-widget__matrix-row[data-v-37644514] {
17171
17177
  display: contents;
17172
17178
  }
17173
17179
 
17174
17180
  /* A column takes its share of the width (minmax(0, 1fr)), so a long phase
17175
17181
  name breaks inside its own column instead of running into the next. */
17176
- .cn-chart-widget__matrix-head[data-v-b6e600c4] {
17182
+ .cn-chart-widget__matrix-head[data-v-37644514] {
17177
17183
  --nldesign-color-on-surface: var(--color-text-maxcontrast);
17178
17184
  color: var(--color-text-maxcontrast);
17179
17185
  padding: 6px;
17180
17186
  hyphens: auto;
17181
17187
  overflow-wrap: anywhere;
17182
17188
  }
17183
- .cn-chart-widget__matrix-label[data-v-b6e600c4] {
17189
+ .cn-chart-widget__matrix-label[data-v-37644514] {
17184
17190
  padding: 10px 6px;
17185
17191
  }
17186
- .cn-chart-widget__matrix-cell[data-v-b6e600c4] {
17192
+ .cn-chart-widget__matrix-cell[data-v-37644514] {
17187
17193
  border-radius: 6px;
17188
17194
  padding: 10px;
17189
17195
  text-align: center;
17190
17196
  }
17191
- .cn-chart-widget__matrix-cell--success[data-v-b6e600c4] {
17197
+ .cn-chart-widget__matrix-cell--success[data-v-37644514] {
17192
17198
  background: var(--color-success-light, color-mix(in srgb, var(--color-success) 15%, var(--color-main-background)));
17193
17199
  }
17194
- .cn-chart-widget__matrix-cell--warning[data-v-b6e600c4] {
17200
+ .cn-chart-widget__matrix-cell--warning[data-v-37644514] {
17195
17201
  background: var(--color-warning-light, color-mix(in srgb, var(--color-warning) 15%, var(--color-main-background)));
17196
17202
  }
17197
- .cn-chart-widget__matrix-cell--error[data-v-b6e600c4] {
17203
+ .cn-chart-widget__matrix-cell--error[data-v-37644514] {
17198
17204
  background: var(--color-error-light, color-mix(in srgb, var(--color-error) 12%, var(--color-main-background)));
17199
17205
  }
17200
- .cn-chart-widget__matrix-cell--danger[data-v-b6e600c4] {
17206
+ .cn-chart-widget__matrix-cell--danger[data-v-37644514] {
17201
17207
  background: color-mix(in srgb, var(--color-error) 25%, var(--color-main-background));
17202
17208
  }
17203
- .cn-chart-widget__matrix-cell--current[data-v-b6e600c4] {
17209
+ .cn-chart-widget__matrix-cell--current[data-v-37644514] {
17204
17210
  font-weight: 700;
17205
17211
  outline: 3px solid var(--color-primary-element);
17206
17212
  outline-offset: -3px;
@@ -17212,26 +17218,26 @@ li[data-cn-admin-tag] > .action-link::after {
17212
17218
  primary at 35% and at 70%, and level 1 inverted. Levels 1 to 3 take a dark
17213
17219
  ink; the board's white on level 3 is about 3.1:1, and 70% is as deep as the
17214
17220
  dark ink stays at 4.5:1 in Nextcloud's dark theme. */
17215
- .cn-chart-widget__matrix-cell--1[data-v-b6e600c4] {
17221
+ .cn-chart-widget__matrix-cell--1[data-v-37644514] {
17216
17222
  --nldesign-color-on-surface: var(--color-primary-element-light-text);
17217
17223
  background: var(--color-primary-element-light);
17218
17224
  color: var(--color-primary-element-light-text);
17219
17225
  }
17220
- .cn-chart-widget__matrix-cell--2[data-v-b6e600c4] {
17226
+ .cn-chart-widget__matrix-cell--2[data-v-37644514] {
17221
17227
  background: color-mix(in srgb, var(--color-primary-element) 35%, var(--color-main-background));
17222
17228
  color: var(--color-main-text);
17223
17229
  }
17224
- .cn-chart-widget__matrix-cell--3[data-v-b6e600c4] {
17230
+ .cn-chart-widget__matrix-cell--3[data-v-37644514] {
17225
17231
  --nldesign-color-on-surface: var(--color-main-text);
17226
17232
  background: color-mix(in srgb, var(--color-primary-element) 70%, var(--color-main-background));
17227
17233
  color: var(--color-main-text);
17228
17234
  }
17229
- .cn-chart-widget__matrix-cell--4[data-v-b6e600c4] {
17235
+ .cn-chart-widget__matrix-cell--4[data-v-37644514] {
17230
17236
  --nldesign-color-on-surface: var(--color-primary-element-light);
17231
17237
  background: var(--color-primary-element-light-text);
17232
17238
  color: var(--color-primary-element-light);
17233
17239
  }
17234
- .cn-chart-widget__empty[data-v-b6e600c4] {
17240
+ .cn-chart-widget__empty[data-v-37644514] {
17235
17241
  display: flex;
17236
17242
  align-items: center;
17237
17243
  justify-content: center;
@@ -17246,25 +17252,25 @@ li[data-cn-admin-tag] > .action-link::after {
17246
17252
  content-sized case; in fit mode they take the leftover space and centre in it
17247
17253
  instead, since the floor would overflow a short tile. Declared after the base
17248
17254
  rules so the cascade order matches specificity (no-descending-specificity). */
17249
- .cn-chart-widget--fit .cn-chart-widget__empty[data-v-b6e600c4],
17250
- .cn-chart-widget--fit .cn-chart-widget__fallback[data-v-b6e600c4] {
17255
+ .cn-chart-widget--fit .cn-chart-widget__empty[data-v-37644514],
17256
+ .cn-chart-widget--fit .cn-chart-widget__fallback[data-v-37644514] {
17251
17257
  flex: 1 1 0;
17252
17258
  min-height: 0;
17253
17259
  }
17254
- .cn-chart-widget__error[data-v-b6e600c4] {
17260
+ .cn-chart-widget__error[data-v-37644514] {
17255
17261
  font-size: 14px;
17256
17262
  margin: 0;
17257
17263
  }
17258
17264
 
17259
17265
  /* In-widget view switcher pills (views[] prop) — compact segmented row,
17260
17266
  mirroring the dashboard date-range pill styling. */
17261
- .cn-chart-widget__views[data-v-b6e600c4] {
17267
+ .cn-chart-widget__views[data-v-37644514] {
17262
17268
  display: flex;
17263
17269
  gap: 4px;
17264
17270
  margin-bottom: 6px;
17265
17271
  justify-content: flex-end;
17266
17272
  }
17267
- .cn-chart-widget__view-pill[data-v-b6e600c4] {
17273
+ .cn-chart-widget__view-pill[data-v-37644514] {
17268
17274
  padding: 2px 10px;
17269
17275
  border: 1px solid var(--color-border);
17270
17276
  border-radius: 999px;
@@ -17273,7 +17279,7 @@ li[data-cn-admin-tag] > .action-link::after {
17273
17279
  font-size: 12px;
17274
17280
  cursor: pointer;
17275
17281
  }
17276
- .cn-chart-widget__view-pill--active[data-v-b6e600c4] {
17282
+ .cn-chart-widget__view-pill--active[data-v-37644514] {
17277
17283
  background: var(--color-primary-element-light, #aad2ed);
17278
17284
  color: var(--color-main-text);
17279
17285
  border-color: var(--color-primary-element, #0082c9);
@@ -17302,8 +17308,8 @@ li[data-cn-admin-tag] > .action-link::after {
17302
17308
  each override below therefore carries one more class than the apexcharts rule
17303
17309
  it replaces, and holds even without the scope attribute this block compiles
17304
17310
  with. */
17305
- .cn-chart-widget[data-v-b6e600c4] .apexcharts-tooltip.apexcharts-theme-light,
17306
- .cn-chart-widget[data-v-b6e600c4] .apexcharts-tooltip.apexcharts-theme-dark {
17311
+ .cn-chart-widget[data-v-37644514] .apexcharts-tooltip.apexcharts-theme-light,
17312
+ .cn-chart-widget[data-v-37644514] .apexcharts-tooltip.apexcharts-theme-dark {
17307
17313
  background: var(--color-main-background);
17308
17314
  border: 1px solid var(--color-border);
17309
17315
  color: var(--color-main-text);
@@ -17312,8 +17318,8 @@ li[data-cn-admin-tag] > .action-link::after {
17312
17318
 
17313
17319
  /* The title row is the date/category header ("Aug 26"). Its own background is
17314
17320
  what made it unreadable rather than merely off-theme. */
17315
- .cn-chart-widget[data-v-b6e600c4] .apexcharts-tooltip.apexcharts-theme-light .apexcharts-tooltip-title,
17316
- .cn-chart-widget[data-v-b6e600c4] .apexcharts-tooltip.apexcharts-theme-dark .apexcharts-tooltip-title {
17321
+ .cn-chart-widget[data-v-37644514] .apexcharts-tooltip.apexcharts-theme-light .apexcharts-tooltip-title,
17322
+ .cn-chart-widget[data-v-37644514] .apexcharts-tooltip.apexcharts-theme-dark .apexcharts-tooltip-title {
17317
17323
  background: var(--color-background-hover);
17318
17324
  border-bottom: 1px solid var(--color-border);
17319
17325
  color: var(--color-main-text);
@@ -17322,8 +17328,8 @@ li[data-cn-admin-tag] > .action-link::after {
17322
17328
  /* Crosshair axis tooltips. apexcharts puts light hex values on the BASE class
17323
17329
  here and only overrides them for its dark theme, so the base rule has to be
17324
17330
  replaced too — not just the theme variants. */
17325
- .cn-chart-widget[data-v-b6e600c4] .apexcharts-xaxistooltip,
17326
- .cn-chart-widget[data-v-b6e600c4] .apexcharts-yaxistooltip {
17331
+ .cn-chart-widget[data-v-37644514] .apexcharts-xaxistooltip,
17332
+ .cn-chart-widget[data-v-37644514] .apexcharts-yaxistooltip {
17327
17333
  background: var(--color-main-background);
17328
17334
  border: 1px solid var(--color-border);
17329
17335
  color: var(--color-main-text);
@@ -17332,55 +17338,55 @@ li[data-cn-admin-tag] > .action-link::after {
17332
17338
  /* Their pointer arrows are two stacked triangles: `::before` paints the border
17333
17339
  edge, `::after` the fill. Both need the tokens the box above uses, or the
17334
17340
  arrow keeps the old palette and reads as a stray light wedge. */
17335
- .cn-chart-widget[data-v-b6e600c4] .apexcharts-xaxistooltip-bottom::after,
17336
- .cn-chart-widget[data-v-b6e600c4] .apexcharts-xaxistooltip-top::after {
17341
+ .cn-chart-widget[data-v-37644514] .apexcharts-xaxistooltip-bottom::after,
17342
+ .cn-chart-widget[data-v-37644514] .apexcharts-xaxistooltip-top::after {
17337
17343
  border-bottom-color: var(--color-main-background);
17338
17344
  border-top-color: var(--color-main-background);
17339
17345
  }
17340
- .cn-chart-widget[data-v-b6e600c4] .apexcharts-xaxistooltip-bottom::before,
17341
- .cn-chart-widget[data-v-b6e600c4] .apexcharts-xaxistooltip-top::before {
17346
+ .cn-chart-widget[data-v-37644514] .apexcharts-xaxistooltip-bottom::before,
17347
+ .cn-chart-widget[data-v-37644514] .apexcharts-xaxistooltip-top::before {
17342
17348
  border-bottom-color: var(--color-border);
17343
17349
  border-top-color: var(--color-border);
17344
17350
  }
17345
- .cn-chart-widget[data-v-b6e600c4] .apexcharts-yaxistooltip-left::after,
17346
- .cn-chart-widget[data-v-b6e600c4] .apexcharts-yaxistooltip-right::after {
17351
+ .cn-chart-widget[data-v-37644514] .apexcharts-yaxistooltip-left::after,
17352
+ .cn-chart-widget[data-v-37644514] .apexcharts-yaxistooltip-right::after {
17347
17353
  border-left-color: var(--color-main-background);
17348
17354
  border-right-color: var(--color-main-background);
17349
17355
  }
17350
- .cn-chart-widget[data-v-b6e600c4] .apexcharts-yaxistooltip-left::before,
17351
- .cn-chart-widget[data-v-b6e600c4] .apexcharts-yaxistooltip-right::before {
17356
+ .cn-chart-widget[data-v-37644514] .apexcharts-yaxistooltip-left::before,
17357
+ .cn-chart-widget[data-v-37644514] .apexcharts-yaxistooltip-right::before {
17352
17358
  border-left-color: var(--color-border);
17353
17359
  border-right-color: var(--color-border);
17354
17360
  }
17355
17361
 
17356
17362
  /* Toolbar menu — only reachable with `toolbar: true`, but the same defect: a
17357
17363
  hardcoded `#fff` panel under inherited near-white text. */
17358
- .cn-chart-widget[data-v-b6e600c4] .apexcharts-menu {
17364
+ .cn-chart-widget[data-v-37644514] .apexcharts-menu {
17359
17365
  background: var(--color-main-background);
17360
17366
  border: 1px solid var(--color-border);
17361
17367
  color: var(--color-main-text);
17362
17368
  }
17363
- .cn-chart-widget[data-v-b6e600c4] .apexcharts-menu .apexcharts-menu-item:hover {
17369
+ .cn-chart-widget[data-v-37644514] .apexcharts-menu .apexcharts-menu-item:hover {
17364
17370
  background: var(--color-background-hover);
17365
17371
  }
17366
17372
 
17367
17373
  /* Toolbar icons: `#6e8192` at rest and `#333` on hover, i.e. the hover state
17368
17374
  vanishes against a dark background. One selector per icon class, matching
17369
17375
  apexcharts' own list, to clear its (0,3,1) hover rules. */
17370
- .cn-chart-widget[data-v-b6e600c4] .apexcharts-toolbar .apexcharts-menu-icon svg,
17371
- .cn-chart-widget[data-v-b6e600c4] .apexcharts-toolbar .apexcharts-reset-icon svg,
17372
- .cn-chart-widget[data-v-b6e600c4] .apexcharts-toolbar .apexcharts-selection-icon svg,
17373
- .cn-chart-widget[data-v-b6e600c4] .apexcharts-toolbar .apexcharts-zoom-icon svg,
17374
- .cn-chart-widget[data-v-b6e600c4] .apexcharts-toolbar .apexcharts-zoomin-icon svg,
17375
- .cn-chart-widget[data-v-b6e600c4] .apexcharts-toolbar .apexcharts-zoomout-icon svg {
17376
+ .cn-chart-widget[data-v-37644514] .apexcharts-toolbar .apexcharts-menu-icon svg,
17377
+ .cn-chart-widget[data-v-37644514] .apexcharts-toolbar .apexcharts-reset-icon svg,
17378
+ .cn-chart-widget[data-v-37644514] .apexcharts-toolbar .apexcharts-selection-icon svg,
17379
+ .cn-chart-widget[data-v-37644514] .apexcharts-toolbar .apexcharts-zoom-icon svg,
17380
+ .cn-chart-widget[data-v-37644514] .apexcharts-toolbar .apexcharts-zoomin-icon svg,
17381
+ .cn-chart-widget[data-v-37644514] .apexcharts-toolbar .apexcharts-zoomout-icon svg {
17376
17382
  fill: var(--color-text-maxcontrast);
17377
17383
  }
17378
- .cn-chart-widget[data-v-b6e600c4] .apexcharts-toolbar .apexcharts-menu-icon:hover svg,
17379
- .cn-chart-widget[data-v-b6e600c4] .apexcharts-toolbar .apexcharts-reset-icon:hover svg,
17380
- .cn-chart-widget[data-v-b6e600c4] .apexcharts-toolbar .apexcharts-selection-icon:hover svg,
17381
- .cn-chart-widget[data-v-b6e600c4] .apexcharts-toolbar .apexcharts-zoom-icon:hover svg,
17382
- .cn-chart-widget[data-v-b6e600c4] .apexcharts-toolbar .apexcharts-zoomin-icon:hover svg,
17383
- .cn-chart-widget[data-v-b6e600c4] .apexcharts-toolbar .apexcharts-zoomout-icon:hover svg {
17384
+ .cn-chart-widget[data-v-37644514] .apexcharts-toolbar .apexcharts-menu-icon:hover svg,
17385
+ .cn-chart-widget[data-v-37644514] .apexcharts-toolbar .apexcharts-reset-icon:hover svg,
17386
+ .cn-chart-widget[data-v-37644514] .apexcharts-toolbar .apexcharts-selection-icon:hover svg,
17387
+ .cn-chart-widget[data-v-37644514] .apexcharts-toolbar .apexcharts-zoom-icon:hover svg,
17388
+ .cn-chart-widget[data-v-37644514] .apexcharts-toolbar .apexcharts-zoomin-icon:hover svg,
17389
+ .cn-chart-widget[data-v-37644514] .apexcharts-toolbar .apexcharts-zoomout-icon:hover svg {
17384
17390
  fill: var(--color-main-text);
17385
17391
  }
17386
17392
 
@@ -48554,6 +48560,7 @@ to {
48554
48560
 
48555
48561
  .cn-board-view.cn-board-view--board .cn-board-view__card-sub {
48556
48562
  font-size: 13px;
48563
+ line-height: normal;
48557
48564
  color: var(--color-text-maxcontrast);
48558
48565
  }
48559
48566
 
@@ -48573,6 +48580,7 @@ to {
48573
48580
 
48574
48581
  .cn-board-view.cn-board-view--board .cn-board-view__card-footer {
48575
48582
  display: flex;
48583
+ line-height: normal;
48576
48584
  align-items: center;
48577
48585
  justify-content: space-between;
48578
48586
  gap: 8px;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@conduction/nextcloud-vue",
3
- "version": "2.149.0",
3
+ "version": "2.150.0",
4
4
  "description": "Shared Vue component library for Conduction Nextcloud apps — complements @nextcloud/vue with higher-level components, OpenRegister integration, and NL Design System support",
5
5
  "homepage": "https://github.com/ConductionNL/nextcloud-vue#readme",
6
6
  "bugs": {
@@ -109,7 +109,7 @@ Fallback slot — shown when ApexCharts is not available:
109
109
  | `barMax` | Number | `null` | `bar-list`: the value a full track stands for (100 for percentages); null takes the largest value |
110
110
  | `matrixLabelWidth` | Number | `null` | `matrix`: the row-label column's width in px; a long label wraps (DqProcesanalyse "Dagen per fase": 240). Null sizes the column to its longest label, at least 120px |
111
111
  | `footnote` | String | `''` | A line under the chart, through the host's translate: under the rows of a `bar-list` or `matrix`, under the plot of a `line`, `area` or `bar` chart |
112
- | `notice` | Object | `null` | A toned note card under the chart: `{ lead?, text?, values?, labels?, tone? }`. `{name}` in `lead` (bold) and `text` is filled from `values[name]`, a literal or a record token (`@object.<field>`); `labels[name]` (`"rows"`, `"columns"`, `"values"` or a map) turns a key into words. `tone`: info, success, warning, error. Hidden while a value is missing |
112
+ | `notice` | Object | `null` | A toned note card under the chart: `{ lead?, text?, values?, labels?, tone? }`. `{name}` in `lead` (bold) and `text` is filled from `values[name]`, a literal, a record token (`@object.<field>`) or a field of the record a `cellSource` with `cellsPath` read its cells from (`@source.<field>`, such as the matrix's name); `labels[name]` (`"rows"`, `"columns"`, `"values"` or a map) turns a key into words. `tone`: info, success, warning, error. Hidden while a value is missing |
113
113
  | `referenceLines` | Array | `[]` | Dashed horizontal reference lines on the value axis of a line, area or bar chart, such as a norm: `[{ value, label?, color? }]`. The label goes through the host's translate; the colour defaults to the theme's error colour (board DqDoorlooptijd). `valuePath` reads the value from the endpoint answer instead, `{value}` in the label writes it, and a line without a value is not drawn. |
114
114
  | `categoryFormat` | String | `''` | How date categories read on the x-axis: `month` ("jan") or `month-year` ("jan 2026"), in the user's language, or `week` for ISO week keys ("2026-W40" as "w40"). Categories that are not dates are left as is; a bare year key stays a year. |
115
115
  | `emptyCellLabel` | String | `''` | `matrix`: the text of a cell without a value ("geen"), through the host's translate. Empty leaves the cell blank |
@@ -1020,6 +1020,9 @@ export default {
1020
1020
  aggregateData: null,
1021
1021
  // The `cellSource` matrix, laid out (`{ series, categories, columnKeys }`), or null.
1022
1022
  cellData: null,
1023
+ // The record a `cellSource` with `cellsPath` read its cells from, for
1024
+ // `@source.<field>` in the notice.
1025
+ cellRecord: null,
1023
1026
  // Active `views[]` switcher key (null = the first view). Local
1024
1027
  // UI state only — never persisted.
1025
1028
  activeViewKey: null,
@@ -1664,6 +1667,14 @@ export default {
1664
1667
  }
1665
1668
  const declared = def.values && typeof def.values === 'object' ? def.values : {}
1666
1669
  const resolved = resolveFilterTokens(declared, this.chartTokenCtx())
1670
+ // `@source.<field>`: a field of the record the matrix read its cells
1671
+ // from (the matrix's name and version on an enforcement advice).
1672
+ for (const [name, token] of Object.entries(declared)) {
1673
+ if (typeof token === 'string' && token.startsWith('@source.')) {
1674
+ const value = token.slice('@source.'.length).split('.').reduce((at, key) => (at && typeof at === 'object' ? at[key] : undefined), this.cellRecord)
1675
+ resolved[name] = value === undefined ? null : value
1676
+ }
1677
+ }
1667
1678
  const source = this.cellSource && typeof this.cellSource === 'object' ? this.cellSource : {}
1668
1679
  const maps = { rows: source.rowLabels, columns: source.columnLabels, values: source.valueLabels }
1669
1680
  const words = {}
@@ -2392,6 +2403,7 @@ export default {
2392
2403
  if (this._cellRequest !== key) {
2393
2404
  return
2394
2405
  }
2406
+ this.cellRecord = this.cellSource.cellsPath ? (records[0] || null) : null
2395
2407
  if (this.cellSource.cellsPath) {
2396
2408
  const { cells, config } = cellsFromRecord(records[0] || null, this.cellSource, cellFilter)
2397
2409
  this.cellData = pivotCells(cells, config)
package/src/css/board.css CHANGED
@@ -132,6 +132,7 @@
132
132
 
133
133
  .cn-board-view.cn-board-view--board .cn-board-view__card-sub {
134
134
  font-size: 13px;
135
+ line-height: normal;
135
136
  color: var(--color-text-maxcontrast);
136
137
  }
137
138
 
@@ -151,6 +152,7 @@
151
152
 
152
153
  .cn-board-view.cn-board-view--board .cn-board-view__card-footer {
153
154
  display: flex;
155
+ line-height: normal;
154
156
  align-items: center;
155
157
  justify-content: space-between;
156
158
  gap: 8px;
@@ -1514,17 +1514,19 @@
1514
1514
  margin: 0;
1515
1515
  font-size: 17px;
1516
1516
  font-weight: 700;
1517
- line-height: 1.3;
1517
+ line-height: normal;
1518
1518
  text-decoration: none;
1519
1519
  white-space: normal;
1520
1520
  }
1521
1521
 
1522
1522
  .cn-look-board .cn-object-card--board .cn-object-card__record-meta {
1523
1523
  --nldesign-component-paragraph-font-size: 14px;
1524
+ --nldesign-component-paragraph-line-height: normal;
1524
1525
  --nldesign-component-paragraph-color: var(--color-text-maxcontrast);
1525
1526
  margin: 0;
1526
1527
  color: var(--color-text-maxcontrast);
1527
1528
  font-size: 14px;
1529
+ line-height: normal;
1528
1530
  }
1529
1531
 
1530
1532
  /* The meta line, note and description are paragraphs: each hands the theme,
@@ -1532,11 +1534,13 @@
1532
1534
  .cn-look-board .cn-object-card--board .cn-object-card__record-note {
1533
1535
  --nldesign-component-paragraph-font-size: 13px;
1534
1536
  --nldesign-component-paragraph-font-weight: 600;
1537
+ --nldesign-component-paragraph-line-height: normal;
1535
1538
  --nldesign-component-paragraph-color: var(--cn-board-text-soft);
1536
1539
  margin: 0;
1537
1540
  color: var(--cn-board-text-soft);
1538
1541
  font-size: 13px;
1539
1542
  font-weight: 600;
1543
+ line-height: normal;
1540
1544
  }
1541
1545
 
1542
1546
  .cn-look-board .cn-object-card--board .cn-object-card__record-note--purple {