@conduction/nextcloud-vue 2.77.0 → 2.79.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.
Files changed (159) hide show
  1. package/dist/bundled-packages.json +0 -2
  2. package/dist/esm/bundled-packages.json +0 -2
  3. package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js.map +1 -1
  4. package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js +113 -104
  5. package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js.map +1 -1
  6. package/dist/esm/components/CnAiCompanion/CnAiCompanion.vue2.js +23 -0
  7. package/dist/esm/components/CnAiCompanion/CnAiCompanion.vue2.js.map +1 -1
  8. package/dist/esm/components/CnAiCompanion/CnAiCompanion.vue3.js.map +1 -1
  9. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js +12 -2
  10. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js.map +1 -1
  11. package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js.map +1 -1
  12. package/dist/esm/components/CnBoardView/CnBoardView.vue2.js +2 -1
  13. package/dist/esm/components/CnBoardView/CnBoardView.vue2.js.map +1 -1
  14. package/dist/esm/components/CnBoardView/CnBoardView.vue3.js.map +1 -1
  15. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +117 -0
  16. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
  17. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js +122 -97
  18. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
  19. package/dist/esm/components/CnChartWidget/CnChartWidget.vue2.js +37 -0
  20. package/dist/esm/components/CnChartWidget/CnChartWidget.vue2.js.map +1 -1
  21. package/dist/esm/components/CnChartWidget/CnChartWidget.vue3.js +2 -2
  22. package/dist/esm/components/CnChartWidget/CnChartWidget.vue3.js.map +1 -1
  23. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +168 -5
  24. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
  25. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +140 -92
  26. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
  27. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +84 -2
  28. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
  29. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +4 -2
  30. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
  31. package/dist/esm/components/CnDateRangePicker/CnDateRangePicker.vue.js +1 -1
  32. package/dist/esm/components/CnDateRangePicker/CnDateRangePicker.vue2.js +45 -2
  33. package/dist/esm/components/CnDateRangePicker/CnDateRangePicker.vue2.js.map +1 -1
  34. package/dist/esm/components/CnDateRangePicker/CnDateRangePicker.vue3.js.map +1 -1
  35. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js +61 -1
  36. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -1
  37. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js.map +1 -1
  38. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +173 -5
  39. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
  40. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js +181 -99
  41. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
  42. package/dist/esm/components/CnFilesBrowser/filesBrowser.js +29 -11
  43. package/dist/esm/components/CnFilesBrowser/filesBrowser.js.map +1 -1
  44. package/dist/esm/components/CnFilesBrowser/openRegisterSource.js +252 -0
  45. package/dist/esm/components/CnFilesBrowser/openRegisterSource.js.map +1 -0
  46. package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js +8 -2
  47. package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js.map +1 -1
  48. package/dist/esm/components/CnFormDialog/CnFormDialog.vue3.js.map +1 -1
  49. package/dist/esm/components/CnFormPage/CnFormPage.vue2.js +4 -1
  50. package/dist/esm/components/CnFormPage/CnFormPage.vue2.js.map +1 -1
  51. package/dist/esm/components/CnFormPage/CnFormPage.vue3.js.map +1 -1
  52. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +31 -2
  53. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  54. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +3 -2
  55. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  56. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js +100 -3
  57. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js.map +1 -1
  58. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js +4 -2
  59. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js.map +1 -1
  60. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue2.js +3 -2
  61. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue2.js.map +1 -1
  62. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue3.js.map +1 -1
  63. package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue2.js.map +1 -1
  64. package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue3.js +1 -1
  65. package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue3.js.map +1 -1
  66. package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js +36 -0
  67. package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js.map +1 -1
  68. package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js +35 -23
  69. package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js.map +1 -1
  70. package/dist/esm/components/CnStatusBadge/CnStatusBadge.vue2.js +6 -2
  71. package/dist/esm/components/CnStatusBadge/CnStatusBadge.vue2.js.map +1 -1
  72. package/dist/esm/components/CnStatusBadge/CnStatusBadge.vue3.js.map +1 -1
  73. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +30 -1
  74. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
  75. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
  76. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js +13 -0
  77. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js.map +1 -1
  78. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue3.js.map +1 -1
  79. package/dist/esm/composables/useAppManifest.js +8 -3
  80. package/dist/esm/composables/useAppManifest.js.map +1 -1
  81. package/dist/esm/composables/useFormDraft.js +11 -1
  82. package/dist/esm/composables/useFormDraft.js.map +1 -1
  83. package/dist/esm/composables/useObjectPresence.js +15 -4
  84. package/dist/esm/composables/useObjectPresence.js.map +1 -1
  85. package/dist/esm/index.js +1 -0
  86. package/dist/esm/index.js.map +1 -1
  87. package/dist/esm/l10n/en.json.js +68 -1
  88. package/dist/esm/l10n/en.json.js.map +1 -1
  89. package/dist/esm/l10n/nl.json.js +113 -2
  90. package/dist/esm/l10n/nl.json.js.map +1 -1
  91. package/dist/esm/nextcloud-vue.css +526 -16
  92. package/dist/esm/utils/badgeVariants.js +32 -0
  93. package/dist/esm/utils/badgeVariants.js.map +1 -0
  94. package/dist/esm/utils/boardDate.js +193 -0
  95. package/dist/esm/utils/boardDate.js.map +1 -0
  96. package/dist/esm/utils/dynamicProperties.js +5 -1
  97. package/dist/esm/utils/dynamicProperties.js.map +1 -1
  98. package/dist/esm/utils/validateManifestV2.compiled.js +57 -6
  99. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  100. package/dist/nextcloud-vue.cjs.js +2569 -811
  101. package/dist/nextcloud-vue.cjs.js.map +2 -2
  102. package/dist/nextcloud-vue.css +526 -16
  103. package/l10n/en.json +68 -1
  104. package/l10n/nl.json +113 -2
  105. package/package.json +1 -1
  106. package/scripts/build-validators.js +26 -0
  107. package/src/components/CnActionsBar/CnActionsBar.vue +48 -39
  108. package/src/components/CnAiCompanion/CnAiCompanion.vue +23 -0
  109. package/src/components/CnAppRoot/CnAppRoot.vue +12 -2
  110. package/src/components/CnBoardView/CnBoardView.vue +2 -1
  111. package/src/components/CnCellRenderer/CnCellRenderer.md +1 -0
  112. package/src/components/CnCellRenderer/CnCellRenderer.vue +169 -10
  113. package/src/components/CnChartWidget/CnChartWidget.vue +39 -2
  114. package/src/components/CnDashboardPage/CnDashboardPage.vue +248 -8
  115. package/src/components/CnDataTable/CnDataTable.md +2 -0
  116. package/src/components/CnDataTable/CnDataTable.vue +88 -4
  117. package/src/components/CnDateRangePicker/CnDateRangePicker.vue +44 -1
  118. package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +61 -1
  119. package/src/components/CnFilesBrowser/CnFilesBrowser.vue +232 -11
  120. package/src/components/CnFilesBrowser/filesBrowser.js +43 -2
  121. package/src/components/CnFilesBrowser/index.js +1 -0
  122. package/src/components/CnFilesBrowser/openRegisterSource.js +248 -0
  123. package/src/components/CnFormDialog/CnFormDialog.vue +8 -2
  124. package/src/components/CnFormPage/CnFormPage.vue +4 -1
  125. package/src/components/CnIndexPage/CnIndexPage.vue +33 -3
  126. package/src/components/CnObjectSidebar/CnFilesTab.vue +103 -4
  127. package/src/components/CnQuickFilterBar/CnQuickFilterBar.vue +3 -2
  128. package/src/components/CnSavedViewsControl/CnSavedViewsControl.vue +1 -1
  129. package/src/components/CnStatWidget/CnStatWidget.vue +52 -2
  130. package/src/components/CnStatusBadge/CnStatusBadge.vue +6 -2
  131. package/src/components/CnTabsWidget/CnTabsWidget.vue +30 -1
  132. package/src/components/CnWidgetObjectTable/CnWidgetObjectTable.vue +13 -0
  133. package/src/components/index.js +1 -1
  134. package/src/composables/__tests__/useObjectPresence.spec.js +24 -0
  135. package/src/composables/useAppManifest.js +8 -3
  136. package/src/composables/useFormDraft.js +11 -1
  137. package/src/composables/useObjectPresence.js +15 -4
  138. package/src/css/badge.css +31 -0
  139. package/src/css/kpi-card.css +51 -0
  140. package/src/css/look-board-detail.css +10 -0
  141. package/src/css/look-board-index.css +128 -14
  142. package/src/css/look-board.css +85 -0
  143. package/src/css/table.css +37 -0
  144. package/src/index.js +4 -0
  145. package/src/schemas/app-manifest-v2.schema.json +50 -5
  146. package/src/utils/badgeVariants.js +29 -0
  147. package/src/utils/boardDate.js +189 -0
  148. package/src/utils/dynamicProperties.js +5 -1
  149. package/src/utils/validateManifestV2.compiled.js +57 -2
  150. package/dist/esm/_virtual/equal.js +0 -4
  151. package/dist/esm/_virtual/equal.js.map +0 -1
  152. package/dist/esm/_virtual/ucs2length.js +0 -4
  153. package/dist/esm/_virtual/ucs2length.js.map +0 -1
  154. package/dist/esm/node_modules/ajv/dist/runtime/equal.js +0 -9
  155. package/dist/esm/node_modules/ajv/dist/runtime/equal.js.map +0 -1
  156. package/dist/esm/node_modules/ajv/dist/runtime/ucs2length.js +0 -25
  157. package/dist/esm/node_modules/ajv/dist/runtime/ucs2length.js.map +0 -1
  158. package/dist/esm/node_modules/fast-deep-equal/index.js +0 -47
  159. package/dist/esm/node_modules/fast-deep-equal/index.js.map +0 -1
@@ -213,6 +213,14 @@
213
213
  margin-inline-start: -264px;
214
214
  }
215
215
 
216
+ /* The navigation draws the line between it and the content. NcContent draws a
217
+ second one on the content while the navigation is open, which doubled the
218
+ line and put the page 1px further from the navigation than the board's 28px.
219
+ Outranks NcContent's rule (six classes) with seven. */
220
+ .cn-look-board .app-navigation[data-testid="cn-nav"]:not(.app-navigation--closed):not(.app-navigation--close) ~ .app-content.app-content {
221
+ border-inline-start: none;
222
+ }
223
+
216
224
  .cn-look-board .app-navigation[data-testid="cn-nav"] .app-navigation__content {
217
225
  box-sizing: border-box;
218
226
  gap: 20px;
@@ -222,6 +230,31 @@
222
230
  .cn-look-board .app-navigation[data-testid="cn-nav"] .app-navigation__list {
223
231
  height: auto;
224
232
  flex: 1 1 auto;
233
+ margin: 0;
234
+ gap: 2px;
235
+ }
236
+
237
+ /* The board's vertical rhythm (AppZijbalk): the primary action 20px from the
238
+ top, the list 20px under it, entries 2px apart. An empty search slot is a
239
+ flex child too and pushed everything 20px down, so it goes. */
240
+ .cn-look-board .app-navigation[data-testid="cn-nav"] .app-navigation__search:empty {
241
+ display: none;
242
+ }
243
+
244
+ /* A caption is a 12px label with 6px under it, 20px after the group above
245
+ and 2px before its first entry. NcAppNavigationCaption gives its name a
246
+ 15px font on a 34px line, which made it 44px high. */
247
+ .cn-look-board .app-navigation[data-testid="cn-nav"] .app-navigation__list > .app-navigation-caption:not(:first-child) {
248
+ margin-top: 18px;
249
+ }
250
+
251
+ .cn-look-board .app-navigation[data-testid="cn-nav"] .app-navigation-caption .app-navigation-caption__name {
252
+ margin: 0;
253
+ padding: 0;
254
+ font-size: inherit;
255
+ font-weight: inherit;
256
+ line-height: normal;
257
+ color: inherit;
225
258
  }
226
259
 
227
260
  .cn-look-board .app-navigation[data-testid="cn-nav"] .app-navigation-entry,
@@ -306,6 +339,43 @@
306
339
  font-size: 15px;
307
340
  }
308
341
 
342
+ /* The footer of the board: Help and Advanced as two 40px rows at weight 400,
343
+ 2px apart. The Help row kept the 42px of a list entry, and the Advanced
344
+ foldout drew a 34px button inside 4px of padding, 20px under Help. */
345
+ .cn-look-board .app-navigation[data-testid="cn-nav"] .cn-app-nav__footer-list {
346
+ gap: 2px;
347
+ }
348
+
349
+ .cn-look-board .app-navigation[data-testid="cn-nav"] .cn-app-nav__footer-list .app-navigation-entry,
350
+ .cn-look-board .app-navigation[data-testid="cn-nav"] .cn-app-nav__footer-list .app-navigation-entry-link {
351
+ min-height: 40px;
352
+ font-weight: 400;
353
+ }
354
+
355
+ .cn-look-board .app-navigation[data-testid="cn-nav"] [data-testid="cn-nav-settings"] {
356
+ padding: 0;
357
+ }
358
+
359
+ .cn-look-board .app-navigation[data-testid="cn-nav"] .cn-app-nav__footer-list + [data-testid="cn-nav-settings"] {
360
+ margin-top: -18px;
361
+ }
362
+
363
+ .cn-look-board .app-navigation[data-testid="cn-nav"] [data-testid="cn-nav-settings"] > :first-child {
364
+ margin: 0;
365
+ }
366
+
367
+ .cn-look-board .app-navigation[data-testid="cn-nav"] [data-testid="cn-nav-settings"] > :first-child .button-vue {
368
+ box-sizing: border-box;
369
+ width: 100%;
370
+ height: 40px;
371
+ min-height: 40px;
372
+ padding: 0 10px;
373
+ border-radius: 8px;
374
+ font-size: 15px;
375
+ font-weight: 400;
376
+ justify-content: flex-start;
377
+ }
378
+
309
379
  /* The card above the footer, pushed down. */
310
380
  .cn-look-board .cn-app-nav__card {
311
381
  order: 0;
@@ -502,6 +572,21 @@
502
572
  color: var(--color-main-text);
503
573
  opacity: 1;
504
574
  }
575
+
576
+ /* ---- Status pills (screens-cell-pill-parity) ---------------------------- */
577
+ /* The board draws a primary pill in the deep primary ink on the light primary
578
+ ground ("Verzoek", "Nieuw"); the default look keeps the brighter
579
+ primary-element text. The other tones already match the board. */
580
+ .cn-look-board .cn-status-badge--primary:not(.cn-status-badge--solid):not(.cn-look-nextcloud *) {
581
+ color: var(--color-primary-element-light-text);
582
+ }
583
+
584
+ /* ---- Date and age cells (screens-cell-date-parity) ---------------------- */
585
+ /* The board sets every waiting time ("3 dagen", "4 uur") in weight 600; a
586
+ late one is red through its variant class. */
587
+ .cn-look-board .cn-cell-renderer__age:not(.cn-look-nextcloud *) {
588
+ font-weight: 600;
589
+ }
505
590
  /*
506
591
  * The board dialog (screens-dialog-parity, canon section 5).
507
592
  *
@@ -1192,6 +1277,42 @@
1192
1277
  margin-inline-start: 0;
1193
1278
  }
1194
1279
 
1280
+ /* The header buttons keep the board's button under a theme that styles every
1281
+ secondary or primary button with `!important` (the nldesign theme: a
1282
+ primary border, 8px 16px padding): Download and the Actions menu are 40px,
1283
+ a grey border on the main background (PqTickets, DqZaken), the primary
1284
+ button is the primary fill without a border. The buildiq square is not a
1285
+ direct child button and keeps its own rule. */
1286
+ .cn-look-board .cn-index-page .cn-index-page__header-buttons > .button-vue--secondary,
1287
+ .cn-look-board .cn-index-page .cn-index-page__header-buttons > .action-item .button-vue {
1288
+ height: var(--cn-board-control-height) !important;
1289
+ min-height: var(--cn-board-control-height) !important;
1290
+ padding: 0 14px !important;
1291
+ border: 1px solid var(--color-border-dark) !important;
1292
+ border-radius: var(--cn-board-control-radius) !important;
1293
+ background: var(--color-main-background) !important;
1294
+ color: var(--color-main-text) !important;
1295
+ }
1296
+
1297
+ .cn-look-board .cn-index-page .cn-index-page__header-buttons > .button-vue--secondary:hover,
1298
+ .cn-look-board .cn-index-page .cn-index-page__header-buttons > .action-item .button-vue:hover {
1299
+ background: var(--color-background-hover) !important;
1300
+ }
1301
+
1302
+ .cn-look-board .cn-index-page .cn-index-page__header-buttons > .button-vue--primary {
1303
+ height: var(--cn-board-control-height) !important;
1304
+ min-height: var(--cn-board-control-height) !important;
1305
+ padding: 0 16px !important;
1306
+ border: 0 !important;
1307
+ border-radius: var(--cn-board-control-radius) !important;
1308
+ background: var(--color-primary-element) !important;
1309
+ color: var(--color-primary-element-text) !important;
1310
+ }
1311
+
1312
+ .cn-look-board .cn-index-page .cn-index-page__header-buttons > .button-vue--primary:hover {
1313
+ background: var(--color-primary-element-hover) !important;
1314
+ }
1315
+
1195
1316
  /* ----------------------------------------------------------------- toolbar */
1196
1317
 
1197
1318
  /* No band, no padding, no radius. The DOM is already in reading order (row 1,
@@ -1218,16 +1339,27 @@
1218
1339
  margin-inline-start: 0;
1219
1340
  }
1220
1341
 
1221
- /* The first of Save view, Filter and the view switch takes the free space, so
1222
- the three sit at the end of row 1. */
1223
- .cn-look-board .cn-actions-bar--board > .cn-actions-bar__row--views > :is(.cn-saved-views__save, .cn-actions-bar__filter-button, .cn-actions-bar__view-toggle) {
1342
+ /* The first of Save view and the Filter + view switch unit takes the free
1343
+ space (the board's `flex: 1` spacer), so they sit at the end of row 1.
1344
+ When the line is full the unit wraps as one to the START of the next line
1345
+ while Save view stays at the end of row 1 (DqZaken); without Save view the
1346
+ unit sits at the end of row 1 (PqTickets, PqLeads, PtPortals). */
1347
+ .cn-look-board .cn-actions-bar--board > .cn-actions-bar__row--views > :is(.cn-saved-views__save, .cn-actions-bar__view-controls) {
1224
1348
  margin-inline-start: auto;
1225
1349
  }
1226
1350
 
1227
- .cn-look-board .cn-actions-bar--board > .cn-actions-bar__row--views > :is(.cn-saved-views__save, .cn-actions-bar__filter-button, .cn-actions-bar__view-toggle) ~ :is(.cn-saved-views__save, .cn-actions-bar__filter-button, .cn-actions-bar__view-toggle) {
1351
+ .cn-look-board .cn-actions-bar--board > .cn-actions-bar__row--views > .cn-saved-views__save ~ .cn-actions-bar__view-controls {
1228
1352
  margin-inline-start: 0;
1229
1353
  }
1230
1354
 
1355
+ .cn-look-board .cn-actions-bar--board .cn-actions-bar__view-controls {
1356
+ display: flex;
1357
+ flex: 0 0 auto;
1358
+ flex-wrap: nowrap;
1359
+ align-items: center;
1360
+ gap: 8px;
1361
+ }
1362
+
1231
1363
  /* Row 2: the search field and the active filters on a line of their own. */
1232
1364
  .cn-look-board .cn-actions-bar--board > .cn-actions-bar__row--search {
1233
1365
  display: flex;
@@ -1313,16 +1445,39 @@
1313
1445
  color: var(--color-primary-element-text);
1314
1446
  }
1315
1447
 
1316
- /* Save view: 34px, radius 17, on the light primary tint. */
1448
+ /* Save view: a ghost button, 34px, radius 17, no border, on the light primary
1449
+ tint, a 14px icon 6px before the label, on one line. */
1317
1450
  .cn-look-board .cn-saved-views__save .button-vue {
1318
1451
  min-height: 34px;
1319
1452
  height: 34px;
1320
- padding: 0 14px;
1453
+ padding: 0 12px;
1454
+ border: 0;
1321
1455
  border-radius: 17px;
1322
1456
  background: var(--color-primary-element-light);
1323
1457
  color: var(--color-primary-element-light-text);
1324
1458
  font-size: 13px;
1325
1459
  font-weight: 600;
1460
+ white-space: nowrap;
1461
+ }
1462
+
1463
+ .cn-look-board .cn-saved-views__save .button-vue:hover {
1464
+ background: var(--color-primary-element-light-hover);
1465
+ }
1466
+
1467
+ .cn-look-board .cn-saved-views__save .button-vue .button-vue__wrapper {
1468
+ gap: 6px;
1469
+ }
1470
+
1471
+ .cn-look-board .cn-saved-views__save .button-vue .button-vue__icon {
1472
+ width: auto;
1473
+ min-width: 0;
1474
+ height: auto;
1475
+ min-height: 0;
1476
+ }
1477
+
1478
+ .cn-look-board .cn-saved-views__save .button-vue .button-vue__text {
1479
+ margin: 0;
1480
+ padding: 0;
1326
1481
  }
1327
1482
 
1328
1483
  /* Filter: a labelled secondary button, 36px, radius 8, with the active count. */
@@ -1554,6 +1709,29 @@
1554
1709
  text-decoration: none;
1555
1710
  }
1556
1711
 
1712
+ /* Only the title is underlined (DqZaken). An underline set on the cell
1713
+ reaches every in-flow child whatever its own text-decoration, so the
1714
+ secondary lines become inline blocks on a line of their own: an atomic
1715
+ inline box is the one thing the underline does not reach. */
1716
+ .cn-look-board .cn-table-container--board .cn-data-table td.cn-table-col--title .cn-table-cell__secondary {
1717
+ display: inline-block;
1718
+ width: 100%;
1719
+ vertical-align: top;
1720
+ }
1721
+
1722
+ /* `rowTitle: "plain"` (PqTickets, OcPublicaties): the title is bold text in
1723
+ the main text colour without an underline, the secondary line 13px muted,
1724
+ 2px under it. The row stays clickable through its stretched row link. */
1725
+ .cn-look-board .cn-table-container--board.cn-table-container--title-plain .cn-data-table td.cn-table-col--title {
1726
+ font-weight: 700;
1727
+ text-decoration: none;
1728
+ }
1729
+
1730
+ .cn-look-board .cn-table-container--board.cn-table-container--title-plain .cn-data-table td.cn-table-col--title .cn-table-cell__secondary {
1731
+ margin-top: 2px;
1732
+ font-size: 13px;
1733
+ }
1734
+
1557
1735
  /* A status pill: 3px 10px, radius 12, 13px weight 600. The colours stay the
1558
1736
  status colour map's. */
1559
1737
  .cn-look-board .cn-table-container--board .cn-data-table .cn-status-badge {
@@ -1576,15 +1754,36 @@
1576
1754
  --default-clickable-area: 34px;
1577
1755
  }
1578
1756
 
1757
+ /* The row menu: a 34px square, three dots, a grey border on the main
1758
+ background (DqZaken, PqTickets). A theme that styles every secondary button
1759
+ with `!important` (the nldesign theme: a primary border, 8px 16px padding,
1760
+ `min-width: max-content`) would otherwise turn it into a 64px wide button
1761
+ with a blue border, so the board values are `!important` too. */
1762
+ .cn-look-board .cn-row-actions--board .button-vue,
1763
+ .cn-look-board .cn-row-actions--board .button-vue:hover,
1764
+ .cn-look-board .cn-row-actions--board .button-vue:focus {
1765
+ box-sizing: border-box !important;
1766
+ width: 34px !important;
1767
+ min-width: 34px !important;
1768
+ height: 34px !important;
1769
+ min-height: 34px !important;
1770
+ padding: 0 !important;
1771
+ border: 1px solid var(--color-border-dark) !important;
1772
+ border-radius: 8px !important;
1773
+ color: var(--cn-board-text-soft) !important;
1774
+ }
1775
+
1579
1776
  .cn-look-board .cn-row-actions--board .button-vue {
1580
- width: 34px;
1581
- min-width: 34px;
1582
- height: 34px;
1583
- min-height: 34px;
1584
- padding: 0;
1585
- border: 1px solid var(--color-border-dark);
1586
- border-radius: 8px;
1587
- background: var(--color-main-background);
1777
+ background: var(--color-main-background) !important;
1778
+ }
1779
+
1780
+ .cn-look-board .cn-row-actions--board .button-vue:hover {
1781
+ background: var(--color-background-hover) !important;
1782
+ }
1783
+
1784
+ .cn-look-board .cn-row-actions--board .button-vue:focus-visible {
1785
+ outline: 2px solid var(--color-main-text);
1786
+ outline-offset: 2px;
1588
1787
  }
1589
1788
 
1590
1789
  /* ------------------------------------------------------------------ footer */
@@ -2144,6 +2343,34 @@
2144
2343
  min-width: 0;
2145
2344
  }
2146
2345
 
2346
+ /* Fit to the container (CnDataTable's `fitWidth`, on in CnWidgetObjectTable).
2347
+
2348
+ In a narrow tile the auto layout made the table as wide as its one-line
2349
+ cells, so it ran past the tile and clipped the trailing column (a date).
2350
+ Here every column but one takes the width of its content (`width: 1%` asks
2351
+ for as little as the content allows), and the grow column takes what is
2352
+ left. `max-width: 0` is what lets that column go below its content's width:
2353
+ the table no longer counts its text, so the text is cut with an ellipsis
2354
+ instead of widening the table. The full value stays in the cell's tooltip. */
2355
+ .cn-data-table--fit {
2356
+ width: 100%;
2357
+ }
2358
+
2359
+ .cn-data-table--fit th,
2360
+ .cn-data-table--fit td {
2361
+ width: 1%;
2362
+ }
2363
+
2364
+ .cn-data-table--fit th.cn-table-col--grow,
2365
+ .cn-data-table--fit td.cn-table-col--grow {
2366
+ width: auto;
2367
+ min-width: 0;
2368
+ max-width: 0;
2369
+ overflow: hidden;
2370
+ text-overflow: ellipsis;
2371
+ white-space: nowrap;
2372
+ }
2373
+
2147
2374
  .cn-data-table th {
2148
2375
  background: var(--color-background-dark);
2149
2376
  font-weight: 500;
@@ -2492,6 +2719,15 @@
2492
2719
  color: var(--color-text-maxcontrast);
2493
2720
  }
2494
2721
 
2722
+ /* The empty row holds a sentence (the empty text, or why a lens cannot
2723
+ answer), not a cell value: it wraps instead of being cut to one line. The
2724
+ selector carries the table class so it outranks the one-line cell rule. */
2725
+ .cn-data-table .cn-table-empty td {
2726
+ max-width: none;
2727
+ white-space: normal;
2728
+ overflow-wrap: anywhere;
2729
+ }
2730
+
2495
2731
  /* ========================================
2496
2732
  Backwards compatibility aliases
2497
2733
  (legacy OpenRegister CSS class names)
@@ -3346,6 +3582,57 @@ a.cn-kpi-card--stacked:focus-visible {
3346
3582
  gap: 6px;
3347
3583
  }
3348
3584
 
3585
+ /* A linked board tile is one link: the label is not underlined link text, in
3586
+ any layout (screens-stat-tile-parity). The NL Design theme underlines every
3587
+ `a` with `!important`, so the opt-out needs it too. */
3588
+ a.cn-kpi-card--board,
3589
+ a.cn-kpi-card--board:hover,
3590
+ a.cn-kpi-card--board:focus-visible,
3591
+ a.cn-kpi-card--board * {
3592
+ text-decoration: none !important;
3593
+ }
3594
+
3595
+ /* `content.iconPlacement: "end"` (DqDashboard): label left, the icon in a
3596
+ 32px circle right, tinted by the tile's state. */
3597
+ .cn-kpi-card--board .cn-kpi-card__title--badge-end {
3598
+ justify-content: space-between;
3599
+ gap: 8px;
3600
+ }
3601
+
3602
+ .cn-kpi-card__badge {
3603
+ display: inline-flex;
3604
+ flex: 0 0 auto;
3605
+ align-items: center;
3606
+ justify-content: center;
3607
+ width: 32px;
3608
+ height: 32px;
3609
+ margin-inline-start: auto;
3610
+ border-radius: 50%;
3611
+ color: var(--color-primary-element-light-text, var(--color-primary-element));
3612
+ background: var(--color-primary-element-light, color-mix(in srgb, var(--color-primary-element) 12%, transparent));
3613
+ }
3614
+
3615
+ .cn-kpi-card__badge svg {
3616
+ width: 18px;
3617
+ height: 18px;
3618
+ fill: currentcolor;
3619
+ }
3620
+
3621
+ .cn-kpi-card__badge--success {
3622
+ color: var(--color-text-success, var(--color-success-text));
3623
+ background: color-mix(in srgb, var(--color-text-success, var(--color-success-text)) 12%, var(--color-main-background));
3624
+ }
3625
+
3626
+ .cn-kpi-card__badge--warning {
3627
+ color: var(--color-element-warning, var(--color-warning-text));
3628
+ background: color-mix(in srgb, var(--color-element-warning, var(--color-warning-text)) 12%, var(--color-main-background));
3629
+ }
3630
+
3631
+ .cn-kpi-card__badge--error {
3632
+ color: var(--color-text-error, var(--color-error-text));
3633
+ background: color-mix(in srgb, var(--color-text-error, var(--color-error-text)) 10%, var(--color-main-background));
3634
+ }
3635
+
3349
3636
  .cn-kpi-card__glyph {
3350
3637
  display: inline-flex;
3351
3638
  flex: 0 0 auto;
@@ -3592,6 +3879,15 @@ a.cn-kpi-card--stacked:focus-visible {
3592
3879
  @conduction/nextcloud-vue — Status Badge
3593
3880
  ======================================== */
3594
3881
 
3882
+ /* The two board tones without a Nextcloud colour role (screens-cell-pill-parity).
3883
+ A theme may redefine them; the six role variants below use Nextcloud's own. */
3884
+ :root {
3885
+ --cn-status-purple-bg: #e8e6f6;
3886
+ --cn-status-purple-text: #4a3f8f;
3887
+ --cn-status-teal-bg: #e3f1f3;
3888
+ --cn-status-teal-text: #1d5e66;
3889
+ }
3890
+
3595
3891
  .cn-status-badge {
3596
3892
  display: inline-flex;
3597
3893
  align-items: center;
@@ -3641,6 +3937,18 @@ a.cn-kpi-card--stacked:focus-visible {
3641
3937
  color: var(--color-info-text, var(--color-info, #0082c9));
3642
3938
  }
3643
3939
 
3940
+ /* Work in progress ("In behandeling"), a board tone. */
3941
+ .cn-status-badge--purple {
3942
+ background-color: var(--cn-status-purple-bg);
3943
+ color: var(--cn-status-purple-text);
3944
+ }
3945
+
3946
+ /* Handed on ("Omgezet naar een zaak"), a board tone. */
3947
+ .cn-status-badge--teal {
3948
+ background-color: var(--cn-status-teal-bg);
3949
+ color: var(--cn-status-teal-text);
3950
+ }
3951
+
3644
3952
  /* Solid variants — solid background with white text for use on colored backgrounds */
3645
3953
  .cn-status-badge--solid.cn-status-badge--default {
3646
3954
  background-color: var(--color-background-dark);
@@ -3671,6 +3979,16 @@ a.cn-kpi-card--stacked:focus-visible {
3671
3979
  background-color: var(--color-info, #0082c9);
3672
3980
  color: white;
3673
3981
  }
3982
+
3983
+ .cn-status-badge--solid.cn-status-badge--purple {
3984
+ background-color: var(--cn-status-purple-text);
3985
+ color: white;
3986
+ }
3987
+
3988
+ .cn-status-badge--solid.cn-status-badge--teal {
3989
+ background-color: var(--cn-status-teal-text);
3990
+ color: white;
3991
+ }
3674
3992
  /* ========================================
3675
3993
  @conduction/nextcloud-vue — Layout & Filter Utility Styles
3676
3994
  ======================================== */
@@ -5566,6 +5884,16 @@ a.cn-kpi-card--stacked:focus-visible {
5566
5884
  gap: 20px;
5567
5885
  }
5568
5886
 
5887
+ /* GridStack insets every cell by its 12px margin, the outer edge included, so
5888
+ the tab strip started 12px below the top of the body column and stopped 12px
5889
+ short of its end, while the side column started at the top. Pulling the grid
5890
+ out by that margin puts its first card on the column's edges: the side column
5891
+ is level with the strip, and the strip ends where the body column ends. */
5892
+ .cn-look-board.cn-detail-page--with-side > .cn-detail-page__body > .cn-detail-page__grid {
5893
+ margin: -12px;
5894
+ width: auto;
5895
+ }
5896
+
5569
5897
  /* ---- Folder tabs ------------------------------------------------------- */
5570
5898
 
5571
5899
  /* The strip draws no line of its own (design-system pull request 147). The card under it
@@ -9110,9 +9438,24 @@ svg.leaflet-image-layer.leaflet-interactive path {
9110
9438
  does not rest on colour alone. */
9111
9439
  .cn-cell-renderer__date--success[data-v-37d7b88f],
9112
9440
  .cn-cell-renderer__date--warning[data-v-37d7b88f],
9113
- .cn-cell-renderer__date--error[data-v-37d7b88f] {
9441
+ .cn-cell-renderer__date--error[data-v-37d7b88f],
9442
+ .cn-cell-renderer__age--success[data-v-37d7b88f],
9443
+ .cn-cell-renderer__age--warning[data-v-37d7b88f],
9444
+ .cn-cell-renderer__age--error[data-v-37d7b88f] {
9114
9445
  font-weight: 600;
9115
9446
  }
9447
+ .cn-cell-renderer__age[data-v-37d7b88f] {
9448
+ white-space: nowrap;
9449
+ }
9450
+ .cn-cell-renderer__age--success[data-v-37d7b88f] {
9451
+ color: var(--color-text-success, var(--color-success-text));
9452
+ }
9453
+ .cn-cell-renderer__age--warning[data-v-37d7b88f] {
9454
+ color: var(--color-text-warning, var(--color-warning-text));
9455
+ }
9456
+ .cn-cell-renderer__age--error[data-v-37d7b88f] {
9457
+ color: var(--color-text-error, var(--color-error-text));
9458
+ }
9116
9459
  .cn-cell-renderer__date--success[data-v-37d7b88f] {
9117
9460
  color: var(--color-text-success, var(--color-success-text));
9118
9461
  }
@@ -9122,8 +9465,11 @@ svg.leaflet-image-layer.leaflet-interactive path {
9122
9465
  .cn-cell-renderer__date--error[data-v-37d7b88f] {
9123
9466
  color: var(--color-text-error, var(--color-error-text));
9124
9467
  }
9468
+
9469
+ /* The text variant, not the fill: from Nextcloud 32 `--color-success` is a
9470
+ background colour and too pale for a 16px glyph on a light theme. */
9125
9471
  .cn-cell-renderer__icon--success[data-v-37d7b88f] {
9126
- color: var(--color-success);
9472
+ color: var(--color-text-success, var(--color-success-text, var(--color-success)));
9127
9473
  }
9128
9474
  .cn-cell-renderer__swatch-wrap[data-v-37d7b88f] {
9129
9475
  display: inline-flex;
@@ -9405,6 +9751,34 @@ svg.leaflet-image-layer.leaflet-interactive path {
9405
9751
  min-width: 0;
9406
9752
  }
9407
9753
 
9754
+ /* Fit to the container (CnDataTable's `fitWidth`, on in CnWidgetObjectTable).
9755
+
9756
+ In a narrow tile the auto layout made the table as wide as its one-line
9757
+ cells, so it ran past the tile and clipped the trailing column (a date).
9758
+ Here every column but one takes the width of its content (`width: 1%` asks
9759
+ for as little as the content allows), and the grow column takes what is
9760
+ left. `max-width: 0` is what lets that column go below its content's width:
9761
+ the table no longer counts its text, so the text is cut with an ellipsis
9762
+ instead of widening the table. The full value stays in the cell's tooltip. */
9763
+ .cn-data-table--fit {
9764
+ width: 100%;
9765
+ }
9766
+
9767
+ .cn-data-table--fit th,
9768
+ .cn-data-table--fit td {
9769
+ width: 1%;
9770
+ }
9771
+
9772
+ .cn-data-table--fit th.cn-table-col--grow,
9773
+ .cn-data-table--fit td.cn-table-col--grow {
9774
+ width: auto;
9775
+ min-width: 0;
9776
+ max-width: 0;
9777
+ overflow: hidden;
9778
+ text-overflow: ellipsis;
9779
+ white-space: nowrap;
9780
+ }
9781
+
9408
9782
  .cn-data-table th {
9409
9783
  background: var(--color-background-dark);
9410
9784
  font-weight: 500;
@@ -9753,6 +10127,15 @@ svg.leaflet-image-layer.leaflet-interactive path {
9753
10127
  color: var(--color-text-maxcontrast);
9754
10128
  }
9755
10129
 
10130
+ /* The empty row holds a sentence (the empty text, or why a lens cannot
10131
+ answer), not a cell value: it wraps instead of being cut to one line. The
10132
+ selector carries the table class so it outranks the one-line cell rule. */
10133
+ .cn-data-table .cn-table-empty td {
10134
+ max-width: none;
10135
+ white-space: normal;
10136
+ overflow-wrap: anywhere;
10137
+ }
10138
+
9756
10139
  /* ========================================
9757
10140
  Backwards compatibility aliases
9758
10141
  (legacy OpenRegister CSS class names)
@@ -14416,6 +14799,13 @@ button.cn-files-card__open[data-v-46f7e3c9]:hover {
14416
14799
  min-width: 0;
14417
14800
  flex: 1 1 auto;
14418
14801
  }
14802
+
14803
+ /* The crumbs give way, the controls do not: a long crumb (a folder named
14804
+ after a uuid) shrank the upload button to "Bestanden..." while the crumbs
14805
+ kept their width. */
14806
+ .cn-files-browser__bar[data-v-f5bdd9e2] > :not(.cn-files-browser__crumbs) {
14807
+ flex-shrink: 0;
14808
+ }
14419
14809
  .cn-files-browser__file-input[data-v-f5bdd9e2] {
14420
14810
  display: none;
14421
14811
  }
@@ -20833,6 +21223,57 @@ a.cn-kpi-card--stacked:focus-visible {
20833
21223
  gap: 6px;
20834
21224
  }
20835
21225
 
21226
+ /* A linked board tile is one link: the label is not underlined link text, in
21227
+ any layout (screens-stat-tile-parity). The NL Design theme underlines every
21228
+ `a` with `!important`, so the opt-out needs it too. */
21229
+ a.cn-kpi-card--board,
21230
+ a.cn-kpi-card--board:hover,
21231
+ a.cn-kpi-card--board:focus-visible,
21232
+ a.cn-kpi-card--board * {
21233
+ text-decoration: none !important;
21234
+ }
21235
+
21236
+ /* `content.iconPlacement: "end"` (DqDashboard): label left, the icon in a
21237
+ 32px circle right, tinted by the tile's state. */
21238
+ .cn-kpi-card--board .cn-kpi-card__title--badge-end {
21239
+ justify-content: space-between;
21240
+ gap: 8px;
21241
+ }
21242
+
21243
+ .cn-kpi-card__badge {
21244
+ display: inline-flex;
21245
+ flex: 0 0 auto;
21246
+ align-items: center;
21247
+ justify-content: center;
21248
+ width: 32px;
21249
+ height: 32px;
21250
+ margin-inline-start: auto;
21251
+ border-radius: 50%;
21252
+ color: var(--color-primary-element-light-text, var(--color-primary-element));
21253
+ background: var(--color-primary-element-light, color-mix(in srgb, var(--color-primary-element) 12%, transparent));
21254
+ }
21255
+
21256
+ .cn-kpi-card__badge svg {
21257
+ width: 18px;
21258
+ height: 18px;
21259
+ fill: currentcolor;
21260
+ }
21261
+
21262
+ .cn-kpi-card__badge--success {
21263
+ color: var(--color-text-success, var(--color-success-text));
21264
+ background: color-mix(in srgb, var(--color-text-success, var(--color-success-text)) 12%, var(--color-main-background));
21265
+ }
21266
+
21267
+ .cn-kpi-card__badge--warning {
21268
+ color: var(--color-element-warning, var(--color-warning-text));
21269
+ background: color-mix(in srgb, var(--color-element-warning, var(--color-warning-text)) 12%, var(--color-main-background));
21270
+ }
21271
+
21272
+ .cn-kpi-card__badge--error {
21273
+ color: var(--color-text-error, var(--color-error-text));
21274
+ background: color-mix(in srgb, var(--color-text-error, var(--color-error-text)) 10%, var(--color-main-background));
21275
+ }
21276
+
20836
21277
  .cn-kpi-card__glyph {
20837
21278
  display: inline-flex;
20838
21279
  flex: 0 0 auto;
@@ -26550,6 +26991,15 @@ tr.file-picker__row td.row-name[data-v-1f96131b] {
26550
26991
  @conduction/nextcloud-vue — Status Badge
26551
26992
  ======================================== */
26552
26993
 
26994
+ /* The two board tones without a Nextcloud colour role (screens-cell-pill-parity).
26995
+ A theme may redefine them; the six role variants below use Nextcloud's own. */
26996
+ :root {
26997
+ --cn-status-purple-bg: #e8e6f6;
26998
+ --cn-status-purple-text: #4a3f8f;
26999
+ --cn-status-teal-bg: #e3f1f3;
27000
+ --cn-status-teal-text: #1d5e66;
27001
+ }
27002
+
26553
27003
  .cn-status-badge {
26554
27004
  display: inline-flex;
26555
27005
  align-items: center;
@@ -26599,6 +27049,18 @@ tr.file-picker__row td.row-name[data-v-1f96131b] {
26599
27049
  color: var(--color-info-text, var(--color-info, #0082c9));
26600
27050
  }
26601
27051
 
27052
+ /* Work in progress ("In behandeling"), a board tone. */
27053
+ .cn-status-badge--purple {
27054
+ background-color: var(--cn-status-purple-bg);
27055
+ color: var(--cn-status-purple-text);
27056
+ }
27057
+
27058
+ /* Handed on ("Omgezet naar een zaak"), a board tone. */
27059
+ .cn-status-badge--teal {
27060
+ background-color: var(--cn-status-teal-bg);
27061
+ color: var(--cn-status-teal-text);
27062
+ }
27063
+
26602
27064
  /* Solid variants — solid background with white text for use on colored backgrounds */
26603
27065
  .cn-status-badge--solid.cn-status-badge--default {
26604
27066
  background-color: var(--color-background-dark);
@@ -26630,6 +27092,16 @@ tr.file-picker__row td.row-name[data-v-1f96131b] {
26630
27092
  color: white;
26631
27093
  }
26632
27094
 
27095
+ .cn-status-badge--solid.cn-status-badge--purple {
27096
+ background-color: var(--cn-status-purple-text);
27097
+ color: white;
27098
+ }
27099
+
27100
+ .cn-status-badge--solid.cn-status-badge--teal {
27101
+ background-color: var(--cn-status-teal-text);
27102
+ color: white;
27103
+ }
27104
+
26633
27105
 
26634
27106
  /*
26635
27107
  * The card itself — its box, body stack, icon circle, title and value
@@ -34810,6 +35282,44 @@ button.cn-object-calendar__overflow[data-v-bea31862] {
34810
35282
  height: var(--cn-board-control-height, 40px);
34811
35283
  }
34812
35284
 
35285
+ /* The switch row under the header (screens-dashboard-greeting-header): the
35286
+ view switch left, the `viewLinks` pills right (DqMijnWerk: pills 34px high,
35287
+ radius 17, 13px/600, a 14px icon, primary light on primary deep). */
35288
+ .cn-dashboard-page__switch-row[data-v-824052fe] {
35289
+ display: flex;
35290
+ flex-wrap: wrap;
35291
+ align-items: center;
35292
+ gap: 10px;
35293
+ margin-bottom: var(--cn-board-section-gap, 20px);
35294
+ }
35295
+ .cn-dashboard-page__switch-row-spacer[data-v-824052fe] {
35296
+ flex: 1 1 auto;
35297
+ }
35298
+ .cn-dashboard-page__view-link[data-v-824052fe] {
35299
+ display: inline-flex;
35300
+ align-items: center;
35301
+ gap: 6px;
35302
+ height: 34px;
35303
+ padding: 0 12px;
35304
+ border-radius: 17px;
35305
+ background: var(--color-primary-element-light);
35306
+ color: var(--color-primary-element-light-text);
35307
+ font-size: 13px;
35308
+ font-weight: 600;
35309
+ white-space: nowrap;
35310
+ text-decoration: none !important;
35311
+ }
35312
+ .cn-dashboard-page__view-link[data-v-824052fe]:hover {
35313
+ background: var(--color-primary-element-light-hover, var(--color-primary-element-light));
35314
+ }
35315
+ .cn-dashboard-page__view-link[data-v-824052fe]:focus-visible {
35316
+ outline: 2px solid var(--color-main-text);
35317
+ outline-offset: 2px;
35318
+ }
35319
+ .cn-dashboard-page__view-link-icon[data-v-824052fe] {
35320
+ display: inline-flex;
35321
+ }
35322
+
34813
35323
  /* The period group, in a row of its own between the header and the KPI row. */
34814
35324
  .cn-dashboard-page__date-range--segmented[data-v-824052fe] {
34815
35325
  margin-bottom: 16px;