@conduction/nextcloud-vue 2.56.0-beta.11 → 2.56.0-beta.13

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 (138) hide show
  1. package/dist/esm/components/CnAppNav/CnAppNav.vue2.js +253 -10
  2. package/dist/esm/components/CnAppNav/CnAppNav.vue2.js.map +1 -1
  3. package/dist/esm/components/CnAppNav/CnAppNav.vue3.js +139 -46
  4. package/dist/esm/components/CnAppNav/CnAppNav.vue3.js.map +1 -1
  5. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js +87 -0
  6. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js.map +1 -1
  7. package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js +26 -24
  8. package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js.map +1 -1
  9. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js +61 -16
  10. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js.map +1 -1
  11. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue3.js.map +1 -1
  12. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue2.js +20 -0
  13. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue2.js.map +1 -1
  14. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue3.js +3 -2
  15. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue3.js.map +1 -1
  16. package/dist/esm/components/CnBreadcrumbs/CnBreadcrumbs.vue2.js +13 -0
  17. package/dist/esm/components/CnBreadcrumbs/CnBreadcrumbs.vue2.js.map +1 -1
  18. package/dist/esm/components/CnBreadcrumbs/CnBreadcrumbs.vue3.js +2 -1
  19. package/dist/esm/components/CnBreadcrumbs/CnBreadcrumbs.vue3.js.map +1 -1
  20. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +33 -2
  21. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
  22. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
  23. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +154 -4
  24. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
  25. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +555 -480
  26. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
  27. package/dist/esm/components/CnDataTable/CnColumnFilterPopover.vue2.js +9 -3
  28. package/dist/esm/components/CnDataTable/CnColumnFilterPopover.vue2.js.map +1 -1
  29. package/dist/esm/components/CnDataTable/CnColumnFilterPopover.vue3.js +1 -1
  30. package/dist/esm/components/CnDataTable/CnColumnFilterPopover.vue3.js.map +1 -1
  31. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +37 -1
  32. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
  33. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +12 -4
  34. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
  35. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +187 -19
  36. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  37. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +215 -135
  38. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  39. package/dist/esm/components/CnFkResolveCell/CnFkResolveCell.vue2.js +3 -1
  40. package/dist/esm/components/CnFkResolveCell/CnFkResolveCell.vue2.js.map +1 -1
  41. package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js +144 -4
  42. package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js.map +1 -1
  43. package/dist/esm/components/CnFormDialog/CnFormDialog.vue3.js.map +1 -1
  44. package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue2.js +157 -7
  45. package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue2.js.map +1 -1
  46. package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue3.js +23 -5
  47. package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue3.js.map +1 -1
  48. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +30 -0
  49. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  50. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +2 -2
  51. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  52. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +5 -1
  53. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
  54. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js +4 -2
  55. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
  56. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue2.js +11 -0
  57. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue2.js.map +1 -1
  58. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue3.js +2 -1
  59. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue3.js.map +1 -1
  60. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js +63 -2
  61. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js.map +1 -1
  62. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue3.js +96 -37
  63. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue3.js.map +1 -1
  64. package/dist/esm/components/CnStagesWidget/stagesModel.js +5 -2
  65. package/dist/esm/components/CnStagesWidget/stagesModel.js.map +1 -1
  66. package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js +74 -5
  67. package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js.map +1 -1
  68. package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js +15 -8
  69. package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js.map +1 -1
  70. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +14 -2
  71. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
  72. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js +2 -1
  73. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
  74. package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue2.js +73 -1
  75. package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue2.js.map +1 -1
  76. package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue3.js +14 -2
  77. package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue3.js.map +1 -1
  78. package/dist/esm/l10n/en.json.js +5 -1
  79. package/dist/esm/l10n/en.json.js.map +1 -1
  80. package/dist/esm/l10n/nl.json.js +5 -1
  81. package/dist/esm/l10n/nl.json.js.map +1 -1
  82. package/dist/esm/mixins/pageViews.js +400 -0
  83. package/dist/esm/mixins/pageViews.js.map +1 -0
  84. package/dist/esm/nextcloud-vue.css +513 -81
  85. package/dist/esm/store/useObjectStore.js +118 -33
  86. package/dist/esm/store/useObjectStore.js.map +1 -1
  87. package/dist/esm/utils/actionsDispatcher.js +25 -2
  88. package/dist/esm/utils/actionsDispatcher.js.map +1 -1
  89. package/dist/esm/utils/columnFilters.js +27 -3
  90. package/dist/esm/utils/columnFilters.js.map +1 -1
  91. package/dist/esm/utils/schema.js +40 -2
  92. package/dist/esm/utils/schema.js.map +1 -1
  93. package/dist/esm/utils/schemaRefSlug.js +19 -3
  94. package/dist/esm/utils/schemaRefSlug.js.map +1 -1
  95. package/dist/esm/utils/validateManifestV2.compiled.js +2 -2
  96. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  97. package/dist/nextcloud-vue.cjs.js +8858 -6566
  98. package/dist/nextcloud-vue.cjs.js.map +2 -2
  99. package/dist/nextcloud-vue.css +513 -81
  100. package/l10n/en.json +5 -0
  101. package/l10n/nl.json +5 -0
  102. package/package.json +1 -1
  103. package/src/components/CnAppNav/CnAppNav.vue +441 -14
  104. package/src/components/CnAppRoot/CnAppRoot.md +4 -0
  105. package/src/components/CnAppRoot/CnAppRoot.vue +94 -1
  106. package/src/components/CnAuditTrailCard/CnAuditTrailCard.vue +61 -16
  107. package/src/components/CnAuditTrailWidget/CnAuditTrailWidget.vue +22 -1
  108. package/src/components/CnBreadcrumbs/CnBreadcrumbs.vue +14 -0
  109. package/src/components/CnCellRenderer/CnCellRenderer.vue +33 -2
  110. package/src/components/CnDashboardPage/CnDashboardPage.vue +237 -12
  111. package/src/components/CnDataTable/CnColumnFilterPopover.vue +11 -5
  112. package/src/components/CnDataTable/CnDataTable.vue +45 -1
  113. package/src/components/CnDetailPage/CnDetailPage.md +8 -0
  114. package/src/components/CnDetailPage/CnDetailPage.vue +263 -7
  115. package/src/components/CnFkResolveCell/CnFkResolveCell.vue +3 -1
  116. package/src/components/CnFormDialog/CnFormDialog.vue +144 -4
  117. package/src/components/CnHeaderWidget/CnHeaderWidget.vue +206 -9
  118. package/src/components/CnIndexPage/CnIndexPage.vue +32 -2
  119. package/src/components/CnObjectListWidget/CnObjectListWidget.vue +7 -1
  120. package/src/components/CnSegmentedControl/CnSegmentedControl.md +1 -1
  121. package/src/components/CnSegmentedControl/CnSegmentedControl.vue +12 -0
  122. package/src/components/CnStagesWidget/CnStagesWidget.vue +189 -2
  123. package/src/components/CnStagesWidget/stagesModel.js +5 -2
  124. package/src/components/CnStatWidget/CnStatWidget.vue +89 -7
  125. package/src/components/CnTabsWidget/CnTabsWidget.vue +15 -2
  126. package/src/components/CnWidgetWrapper/CnWidgetWrapper.md +4 -0
  127. package/src/components/CnWidgetWrapper/CnWidgetWrapper.vue +107 -1
  128. package/src/css/detail-page.css +37 -4
  129. package/src/css/kpi-card.css +71 -1
  130. package/src/css/table.css +18 -6
  131. package/src/mixins/pageViews.js +396 -0
  132. package/src/schemas/app-manifest-v2.schema.json +162 -3
  133. package/src/store/useObjectStore.js +118 -33
  134. package/src/utils/actionsDispatcher.js +25 -2
  135. package/src/utils/columnFilters.js +29 -2
  136. package/src/utils/schema.js +40 -2
  137. package/src/utils/schemaRefSlug.js +19 -3
  138. package/src/utils/validateManifestV2.compiled.js +2 -2
@@ -185,7 +185,7 @@
185
185
  .cn-data-table th,
186
186
  .cn-data-table td {
187
187
  padding: calc(3 * var(--default-grid-baseline));
188
- text-align: left;
188
+ text-align: start;
189
189
  border-bottom: 1px solid var(--color-border);
190
190
  vertical-align: middle;
191
191
  max-width: var(--cn-table-cell-max-width, 22rem);
@@ -204,6 +204,18 @@
204
204
  white-space: normal;
205
205
  }
206
206
 
207
+ /* The secondary line of a cell (`columns[].secondary`): muted, smaller, on its
208
+ own line under the value. Theme hooks: --cn-table-secondary-size and
209
+ --cn-table-secondary-color. */
210
+ .cn-data-table .cn-table-cell__secondary {
211
+ display: block;
212
+ color: var(--cn-table-secondary-color, var(--color-text-maxcontrast));
213
+ font-size: var(--cn-table-secondary-size, 0.9em);
214
+ line-height: 1.35;
215
+ overflow: hidden;
216
+ text-overflow: ellipsis;
217
+ }
218
+
207
219
  /* Back to wrapping, for a column holding prose rather than a label:
208
220
  `columns: [{ key: 'description', cellClass: 'cn-cell--wrap' }]`. */
209
221
  .cn-data-table th.cn-cell--wrap,
@@ -265,7 +277,7 @@
265
277
  }
266
278
 
267
279
  .cn-data-table td.cn-cell--end {
268
- text-align: right;
280
+ text-align: end;
269
281
  white-space: nowrap;
270
282
  }
271
283
 
@@ -303,7 +315,7 @@
303
315
  }
304
316
 
305
317
  .cn-table-sort-indicator {
306
- margin-left: var(--default-grid-baseline);
318
+ margin-inline-start: var(--default-grid-baseline);
307
319
  opacity: 0.6;
308
320
  }
309
321
 
@@ -413,7 +425,7 @@
413
425
  justify-content: center;
414
426
  min-width: 14px;
415
427
  height: 14px;
416
- margin-left: 2px;
428
+ margin-inline-start: 2px;
417
429
  padding: 0 3px;
418
430
  border-radius: 7px;
419
431
  background-color: var(--color-primary-element);
@@ -478,7 +490,7 @@
478
490
 
479
491
  .cn-table-col--icon {
480
492
  width: 40px;
481
- padding-right: 0;
493
+ padding-inline-end: 0;
482
494
  text-align: center;
483
495
  color: var(--color-text-maxcontrast);
484
496
  }
@@ -541,7 +553,7 @@
541
553
 
542
554
  .viewTable { width: 100%; border-collapse: collapse; background-color: var(--color-main-background); }
543
555
 
544
- .viewTable th, .viewTable td { padding: calc(3 * var(--default-grid-baseline)); text-align: left; border-bottom: 1px solid var(--color-border); vertical-align: middle; }
556
+ .viewTable th, .viewTable td { padding: calc(3 * var(--default-grid-baseline)); text-align: start; border-bottom: 1px solid var(--color-border); vertical-align: middle; }
545
557
 
546
558
  .viewTable th { background: var(--color-background-hover); font-weight: 500; color: var(--color-text-maxcontrast); background-color: var(--color-background-dark); }
547
559
 
@@ -1037,7 +1049,7 @@
1037
1049
  padding: var(--cn-kpi-padding-flat, 8px);
1038
1050
  box-sizing: border-box;
1039
1051
  overflow: hidden;
1040
- text-align: left;
1052
+ text-align: start;
1041
1053
  text-decoration: none;
1042
1054
  color: inherit;
1043
1055
  background: transparent;
@@ -1152,6 +1164,29 @@
1152
1164
  white-space: nowrap;
1153
1165
  }
1154
1166
 
1167
+ /* A caption coloured by a rule (`captionVariant` / `overrides[].captionVariant`):
1168
+ "1 due today" in the error colour. Foreground tokens, which stay readable in
1169
+ dark mode. */
1170
+ .cn-kpi-card__label--primary {
1171
+ color: var(--color-primary-element);
1172
+ font-weight: 600;
1173
+ }
1174
+
1175
+ .cn-kpi-card__label--success {
1176
+ color: var(--color-text-success, var(--color-success-text));
1177
+ font-weight: 600;
1178
+ }
1179
+
1180
+ .cn-kpi-card__label--warning {
1181
+ color: var(--color-element-warning, var(--color-warning-text));
1182
+ font-weight: 600;
1183
+ }
1184
+
1185
+ .cn-kpi-card__label--error {
1186
+ color: var(--color-text-error, var(--color-error-text));
1187
+ font-weight: 600;
1188
+ }
1189
+
1155
1190
  /* Semantic variants. Each re-points the ONE accent token, so the icon tint
1156
1191
  and the number move together by construction — there is no second place to
1157
1192
  forget. The inline KPI below shares the same modifiers for the same reason:
@@ -1248,6 +1283,53 @@
1248
1283
  font-size: var(--cn-kpi-value-size-stacked, 2rem);
1249
1284
  }
1250
1285
 
1286
+ /* Stacked: the board's tile (`content.layout: 'stacked'`). A plain muted
1287
+ label, the number at 34px/700 in the text colour, and the caption on a line
1288
+ of its own; CnStatWidget draws no icon circle in this layout. The padding
1289
+ adds up with a dashboard card-fit cell's 8px 14px to the board's 18px 20px.
1290
+ Every value is a token so a theme can move it. */
1291
+ .cn-kpi-card--stacked {
1292
+ flex-direction: column;
1293
+ align-items: stretch;
1294
+ justify-content: center;
1295
+ gap: 0;
1296
+ padding: var(--cn-kpi-stacked-padding, 10px 6px);
1297
+ }
1298
+
1299
+ .cn-kpi-card--stacked .cn-kpi-card__body {
1300
+ gap: var(--cn-kpi-stacked-gap, 6px);
1301
+ }
1302
+
1303
+ .cn-kpi-card--stacked .cn-kpi-card__title {
1304
+ font-size: var(--cn-kpi-stacked-title-size, 14px);
1305
+ font-weight: var(--cn-kpi-stacked-title-weight, 400);
1306
+ color: var(--color-text-maxcontrast);
1307
+ }
1308
+
1309
+ .cn-kpi-card--stacked .cn-kpi-card__value {
1310
+ font-size: var(--cn-kpi-stacked-value-size, 34px);
1311
+ font-weight: var(--cn-kpi-value-weight, 700);
1312
+ line-height: 1;
1313
+ letter-spacing: -0.01em;
1314
+ color: var(--cn-kpi-stacked-value-color, var(--color-main-text));
1315
+ }
1316
+
1317
+ .cn-kpi-card--stacked .cn-kpi-card__caption-line {
1318
+ flex: 0 0 auto;
1319
+ max-width: 100%;
1320
+ font-size: var(--cn-kpi-label-size, 13px);
1321
+ font-weight: 500;
1322
+ }
1323
+
1324
+ /* A linked stacked tile reads as a tile, not as underlined link text. The
1325
+ NL Design theme underlines every `a` with `!important`, so the opt-out
1326
+ needs it too; it only applies to this opt-in layout. */
1327
+ a.cn-kpi-card--stacked,
1328
+ a.cn-kpi-card--stacked:hover,
1329
+ a.cn-kpi-card--stacked:focus-visible {
1330
+ text-decoration: none !important;
1331
+ }
1332
+
1251
1333
  /* Filled: the card draws its own grey box, for a KPI that is NOT already
1252
1334
  inside a wrapper that draws one. Opt-in via `content.flat: false`. */
1253
1335
  .cn-kpi-card--filled {
@@ -2724,6 +2806,12 @@
2724
2806
  position: relative;
2725
2807
  }
2726
2808
 
2809
+ /* The breadcrumb line above the header (`config.breadcrumb`). */
2810
+ .cn-detail-page__breadcrumbs {
2811
+ margin-bottom: calc(2 * var(--default-grid-baseline));
2812
+ color: var(--color-text-maxcontrast);
2813
+ }
2814
+
2727
2815
  /* Header */
2728
2816
  .cn-detail-page__header {
2729
2817
  display: flex;
@@ -2749,6 +2837,28 @@
2749
2837
  min-width: 0;
2750
2838
  }
2751
2839
 
2840
+ /* A widget in the header (`config.headerWidget`) takes a row of its own under
2841
+ the title and the actions. */
2842
+ .cn-detail-page__header--with-widget {
2843
+ flex-wrap: wrap;
2844
+ row-gap: var(--cn-detail-header-row-gap, 22px);
2845
+ }
2846
+
2847
+ .cn-detail-page__header-widget {
2848
+ flex: 1 0 100%;
2849
+ min-width: 0;
2850
+ }
2851
+
2852
+ /* The header as a card (`config.headerCard`): the board's case header, a
2853
+ bordered box on the surface colour. The 56px inset that clears the
2854
+ navigation toggle is not needed inside a card that starts below it. */
2855
+ .cn-detail-page__header--card {
2856
+ padding: var(--cn-detail-header-card-padding, 22px 24px);
2857
+ border: 1px solid var(--color-border);
2858
+ border-radius: var(--cn-detail-header-card-radius, 12px);
2859
+ background: var(--color-main-background);
2860
+ }
2861
+
2752
2862
  .cn-detail-page__header-left {
2753
2863
  display: flex;
2754
2864
  align-items: center;
@@ -2891,7 +3001,7 @@
2891
3001
 
2892
3002
  .cn-detail-page__stats-table thead th {
2893
3003
  padding: calc(1.5 * var(--default-grid-baseline)) calc(2 * var(--default-grid-baseline));
2894
- text-align: left;
3004
+ text-align: start;
2895
3005
  font-weight: 600;
2896
3006
  font-size: 0.9em;
2897
3007
  color: var(--color-text-maxcontrast);
@@ -2916,7 +3026,7 @@
2916
3026
  }
2917
3027
 
2918
3028
  .cn-detail-page__stats-cell--indented {
2919
- padding-left: calc(5 * var(--default-grid-baseline)) !important;
3029
+ padding-inline-start: calc(5 * var(--default-grid-baseline)) !important;
2920
3030
  }
2921
3031
 
2922
3032
  .cn-detail-page__stats-cell--center {
@@ -2924,7 +3034,7 @@
2924
3034
  }
2925
3035
 
2926
3036
  .cn-detail-page__stats-cell--right {
2927
- text-align: right;
3037
+ text-align: end;
2928
3038
  }
2929
3039
 
2930
3040
  /* Body & content */
@@ -3058,7 +3168,7 @@
3058
3168
 
3059
3169
  .cn-detail-page__sidebar-toggle {
3060
3170
  position: fixed;
3061
- right: calc(5 * var(--default-grid-baseline));
3171
+ inset-inline-end: calc(5 * var(--default-grid-baseline));
3062
3172
  top: 80px;
3063
3173
  z-index: 10;
3064
3174
  }
@@ -3169,6 +3279,11 @@
3169
3279
  font-size: 0.9em;
3170
3280
  white-space: nowrap;
3171
3281
  }
3282
+
3283
+ /* A page view the switch shows with nothing to draw (view-switch-containers). */
3284
+ .cn-detail-page .cn-page-view-region--empty {
3285
+ padding: 40px 20px;
3286
+ }
3172
3287
  /* CnReferencePreview — a reference that shows what it points at. */
3173
3288
 
3174
3289
  .cn-reference-preview {
@@ -6463,7 +6578,7 @@ svg.leaflet-image-layer.leaflet-interactive path {
6463
6578
  .cn-data-table th,
6464
6579
  .cn-data-table td {
6465
6580
  padding: calc(3 * var(--default-grid-baseline));
6466
- text-align: left;
6581
+ text-align: start;
6467
6582
  border-bottom: 1px solid var(--color-border);
6468
6583
  vertical-align: middle;
6469
6584
  max-width: var(--cn-table-cell-max-width, 22rem);
@@ -6482,6 +6597,18 @@ svg.leaflet-image-layer.leaflet-interactive path {
6482
6597
  white-space: normal;
6483
6598
  }
6484
6599
 
6600
+ /* The secondary line of a cell (`columns[].secondary`): muted, smaller, on its
6601
+ own line under the value. Theme hooks: --cn-table-secondary-size and
6602
+ --cn-table-secondary-color. */
6603
+ .cn-data-table .cn-table-cell__secondary {
6604
+ display: block;
6605
+ color: var(--cn-table-secondary-color, var(--color-text-maxcontrast));
6606
+ font-size: var(--cn-table-secondary-size, 0.9em);
6607
+ line-height: 1.35;
6608
+ overflow: hidden;
6609
+ text-overflow: ellipsis;
6610
+ }
6611
+
6485
6612
  /* Back to wrapping, for a column holding prose rather than a label:
6486
6613
  `columns: [{ key: 'description', cellClass: 'cn-cell--wrap' }]`. */
6487
6614
  .cn-data-table th.cn-cell--wrap,
@@ -6543,7 +6670,7 @@ svg.leaflet-image-layer.leaflet-interactive path {
6543
6670
  }
6544
6671
 
6545
6672
  .cn-data-table td.cn-cell--end {
6546
- text-align: right;
6673
+ text-align: end;
6547
6674
  white-space: nowrap;
6548
6675
  }
6549
6676
 
@@ -6581,7 +6708,7 @@ svg.leaflet-image-layer.leaflet-interactive path {
6581
6708
  }
6582
6709
 
6583
6710
  .cn-table-sort-indicator {
6584
- margin-left: var(--default-grid-baseline);
6711
+ margin-inline-start: var(--default-grid-baseline);
6585
6712
  opacity: 0.6;
6586
6713
  }
6587
6714
 
@@ -6691,7 +6818,7 @@ svg.leaflet-image-layer.leaflet-interactive path {
6691
6818
  justify-content: center;
6692
6819
  min-width: 14px;
6693
6820
  height: 14px;
6694
- margin-left: 2px;
6821
+ margin-inline-start: 2px;
6695
6822
  padding: 0 3px;
6696
6823
  border-radius: 7px;
6697
6824
  background-color: var(--color-primary-element);
@@ -6756,7 +6883,7 @@ svg.leaflet-image-layer.leaflet-interactive path {
6756
6883
 
6757
6884
  .cn-table-col--icon {
6758
6885
  width: 40px;
6759
- padding-right: 0;
6886
+ padding-inline-end: 0;
6760
6887
  text-align: center;
6761
6888
  color: var(--color-text-maxcontrast);
6762
6889
  }
@@ -6819,7 +6946,7 @@ svg.leaflet-image-layer.leaflet-interactive path {
6819
6946
 
6820
6947
  .viewTable { width: 100%; border-collapse: collapse; background-color: var(--color-main-background); }
6821
6948
 
6822
- .viewTable th, .viewTable td { padding: calc(3 * var(--default-grid-baseline)); text-align: left; border-bottom: 1px solid var(--color-border); vertical-align: middle; }
6949
+ .viewTable th, .viewTable td { padding: calc(3 * var(--default-grid-baseline)); text-align: start; border-bottom: 1px solid var(--color-border); vertical-align: middle; }
6823
6950
 
6824
6951
  .viewTable th { background: var(--color-background-hover); font-weight: 500; color: var(--color-text-maxcontrast); background-color: var(--color-background-dark); }
6825
6952
 
@@ -16058,6 +16185,27 @@ a.cn-xwiki-card__title[data-v-54e85fe3]:hover {
16058
16185
  flex-shrink: 0;
16059
16186
  }
16060
16187
 
16188
+ /* The header's text link (`headerLink`). Theme hooks: --cn-widget-header-link-size
16189
+ and --cn-widget-header-link-weight. */
16190
+ .cn-widget-wrapper__header-link[data-v-4dd77f59] {
16191
+ align-self: center;
16192
+ padding: 0 calc(1 * var(--default-grid-baseline));
16193
+ color: var(--color-primary-element);
16194
+ font-size: var(--cn-widget-header-link-size, 14px);
16195
+ font-weight: var(--cn-widget-header-link-weight, 600);
16196
+ text-decoration: none;
16197
+ white-space: nowrap;
16198
+ }
16199
+ .cn-widget-wrapper__header-link[data-v-4dd77f59]:hover,
16200
+ .cn-widget-wrapper__header-link[data-v-4dd77f59]:focus-visible {
16201
+ text-decoration: underline;
16202
+ }
16203
+ .cn-widget-wrapper__header-link[data-v-4dd77f59]:focus-visible {
16204
+ outline: 2px solid var(--color-primary-element);
16205
+ outline-offset: 2px;
16206
+ border-radius: var(--border-radius-small, 4px);
16207
+ }
16208
+
16061
16209
  /* Every widget's header icon is coloured — `--cn-widget-icon-color` is set on
16062
16210
  the header from titleIconStyle, and defaults to the theme colour if a
16063
16211
  wrapper is ever rendered without it. Material-design-icon components paint
@@ -16757,6 +16905,84 @@ a.cn-xwiki-card__title[data-v-54e85fe3]:hover {
16757
16905
  color: var(--color-text-maxcontrast);
16758
16906
  }
16759
16907
 
16908
+ /* The bars variant: equal columns, a thin bar per step. Theme hooks:
16909
+ --cn-stages-bar-height, --cn-stages-bar-radius, --cn-stages-bar-done,
16910
+ --cn-stages-bar-current, --cn-stages-bar-todo. */
16911
+ .cn-stages-widget__bars[data-v-358fde0f] {
16912
+ display: grid;
16913
+ grid-template-columns: repeat(auto-fit, minmax(0, 1fr));
16914
+ grid-auto-flow: column;
16915
+ gap: 8px;
16916
+ margin: 0;
16917
+ padding: 0;
16918
+ list-style: none;
16919
+ }
16920
+ .cn-stages-widget__bar-step[data-v-358fde0f] {
16921
+ display: flex;
16922
+ flex-direction: column;
16923
+ gap: 8px;
16924
+ min-width: 0;
16925
+ }
16926
+ .cn-stages-widget__bar[data-v-358fde0f] {
16927
+ display: block;
16928
+ height: var(--cn-stages-bar-height, 6px);
16929
+ border-radius: var(--cn-stages-bar-radius, 3px);
16930
+ background: var(--cn-stages-bar-todo, var(--color-border));
16931
+ }
16932
+ .cn-stages-widget__bar-step--done .cn-stages-widget__bar[data-v-358fde0f] {
16933
+ background: var(--cn-stages-bar-done, var(--color-primary-element));
16934
+ }
16935
+ .cn-stages-widget__bar-step--current .cn-stages-widget__bar[data-v-358fde0f] {
16936
+ background: var(--cn-stages-bar-current, var(--color-error));
16937
+ }
16938
+ .cn-stages-widget__bar-label[data-v-358fde0f] {
16939
+ display: block;
16940
+ margin: 0;
16941
+ padding: 0;
16942
+ border: 0;
16943
+ background: none;
16944
+ color: var(--color-text-maxcontrast);
16945
+ font: inherit;
16946
+ font-size: 14px;
16947
+ text-align: start;
16948
+ overflow: hidden;
16949
+ text-overflow: ellipsis;
16950
+ white-space: nowrap;
16951
+ }
16952
+
16953
+ /* A clickable label is a <button>, and Nextcloud's core stylesheet gives
16954
+ every `button:not(.button-vue)` a min-height of the clickable area (34 to
16955
+ 44px) with the text centred in it. That pushed each reachable stage's label
16956
+ about 12px below the current one, which is a <span>. Zeroed here so all
16957
+ labels sit 8px under their bar, as the board draws them. The visually
16958
+ hidden "(current step)" is absolutely positioned and takes no space. */
16959
+ button.cn-stages-widget__bar-label[data-v-358fde0f] {
16960
+ min-height: 0;
16961
+ height: auto;
16962
+ line-height: inherit;
16963
+ cursor: pointer;
16964
+ }
16965
+ button.cn-stages-widget__bar-label[aria-disabled="true"][data-v-358fde0f] {
16966
+ cursor: not-allowed;
16967
+ }
16968
+ button.cn-stages-widget__bar-label[data-v-358fde0f]:focus-visible {
16969
+ outline: 2px solid var(--color-primary-element);
16970
+ outline-offset: 2px;
16971
+ border-radius: var(--border-radius-small, 4px);
16972
+ }
16973
+ .cn-stages-widget__bar-step--done .cn-stages-widget__bar-label[data-v-358fde0f] {
16974
+ color: var(--color-main-text);
16975
+ font-weight: 600;
16976
+ }
16977
+ .cn-stages-widget__bar-step--current .cn-stages-widget__bar-label[data-v-358fde0f] {
16978
+ color: var(--color-main-text);
16979
+ font-weight: 700;
16980
+ }
16981
+ .cn-stages-widget__bar-date[data-v-358fde0f] {
16982
+ font-size: 12px;
16983
+ color: var(--color-text-maxcontrast);
16984
+ }
16985
+
16760
16986
  /* Text for screen readers only. */
16761
16987
  .cn-stages-widget__sr-only[data-v-358fde0f] {
16762
16988
  position: absolute;
@@ -16934,7 +17160,7 @@ a.cn-xwiki-card__title[data-v-54e85fe3]:hover {
16934
17160
  padding: var(--cn-kpi-padding-flat, 8px);
16935
17161
  box-sizing: border-box;
16936
17162
  overflow: hidden;
16937
- text-align: left;
17163
+ text-align: start;
16938
17164
  text-decoration: none;
16939
17165
  color: inherit;
16940
17166
  background: transparent;
@@ -17049,6 +17275,29 @@ a.cn-xwiki-card__title[data-v-54e85fe3]:hover {
17049
17275
  white-space: nowrap;
17050
17276
  }
17051
17277
 
17278
+ /* A caption coloured by a rule (`captionVariant` / `overrides[].captionVariant`):
17279
+ "1 due today" in the error colour. Foreground tokens, which stay readable in
17280
+ dark mode. */
17281
+ .cn-kpi-card__label--primary {
17282
+ color: var(--color-primary-element);
17283
+ font-weight: 600;
17284
+ }
17285
+
17286
+ .cn-kpi-card__label--success {
17287
+ color: var(--color-text-success, var(--color-success-text));
17288
+ font-weight: 600;
17289
+ }
17290
+
17291
+ .cn-kpi-card__label--warning {
17292
+ color: var(--color-element-warning, var(--color-warning-text));
17293
+ font-weight: 600;
17294
+ }
17295
+
17296
+ .cn-kpi-card__label--error {
17297
+ color: var(--color-text-error, var(--color-error-text));
17298
+ font-weight: 600;
17299
+ }
17300
+
17052
17301
  /* Semantic variants. Each re-points the ONE accent token, so the icon tint
17053
17302
  and the number move together by construction — there is no second place to
17054
17303
  forget. The inline KPI below shares the same modifiers for the same reason:
@@ -17145,6 +17394,53 @@ a.cn-xwiki-card__title[data-v-54e85fe3]:hover {
17145
17394
  font-size: var(--cn-kpi-value-size-stacked, 2rem);
17146
17395
  }
17147
17396
 
17397
+ /* Stacked: the board's tile (`content.layout: 'stacked'`). A plain muted
17398
+ label, the number at 34px/700 in the text colour, and the caption on a line
17399
+ of its own; CnStatWidget draws no icon circle in this layout. The padding
17400
+ adds up with a dashboard card-fit cell's 8px 14px to the board's 18px 20px.
17401
+ Every value is a token so a theme can move it. */
17402
+ .cn-kpi-card--stacked {
17403
+ flex-direction: column;
17404
+ align-items: stretch;
17405
+ justify-content: center;
17406
+ gap: 0;
17407
+ padding: var(--cn-kpi-stacked-padding, 10px 6px);
17408
+ }
17409
+
17410
+ .cn-kpi-card--stacked .cn-kpi-card__body {
17411
+ gap: var(--cn-kpi-stacked-gap, 6px);
17412
+ }
17413
+
17414
+ .cn-kpi-card--stacked .cn-kpi-card__title {
17415
+ font-size: var(--cn-kpi-stacked-title-size, 14px);
17416
+ font-weight: var(--cn-kpi-stacked-title-weight, 400);
17417
+ color: var(--color-text-maxcontrast);
17418
+ }
17419
+
17420
+ .cn-kpi-card--stacked .cn-kpi-card__value {
17421
+ font-size: var(--cn-kpi-stacked-value-size, 34px);
17422
+ font-weight: var(--cn-kpi-value-weight, 700);
17423
+ line-height: 1;
17424
+ letter-spacing: -0.01em;
17425
+ color: var(--cn-kpi-stacked-value-color, var(--color-main-text));
17426
+ }
17427
+
17428
+ .cn-kpi-card--stacked .cn-kpi-card__caption-line {
17429
+ flex: 0 0 auto;
17430
+ max-width: 100%;
17431
+ font-size: var(--cn-kpi-label-size, 13px);
17432
+ font-weight: 500;
17433
+ }
17434
+
17435
+ /* A linked stacked tile reads as a tile, not as underlined link text. The
17436
+ NL Design theme underlines every `a` with `!important`, so the opt-out
17437
+ needs it too; it only applies to this opt-in layout. */
17438
+ a.cn-kpi-card--stacked,
17439
+ a.cn-kpi-card--stacked:hover,
17440
+ a.cn-kpi-card--stacked:focus-visible {
17441
+ text-decoration: none !important;
17442
+ }
17443
+
17148
17444
  /* Filled: the card draws its own grey box, for a KPI that is NOT already
17149
17445
  inside a wrapper that draws one. Opt-in via `content.flat: false`. */
17150
17446
  .cn-kpi-card--filled {
@@ -18003,6 +18299,68 @@ to { background-position: -200% 0;
18003
18299
  }
18004
18300
 
18005
18301
 
18302
+ .cn-segmented-control[data-v-7b344b4f] {
18303
+ display: inline-flex;
18304
+ gap: 4px;
18305
+ max-width: 100%;
18306
+ padding: 4px;
18307
+ border-radius: var(--border-radius-container, var(--border-radius-large, 10px));
18308
+ background-color: var(--color-background-dark);
18309
+ overflow-x: auto;
18310
+ }
18311
+ .cn-segmented-control--stretch[data-v-7b344b4f] {
18312
+ display: flex;
18313
+ }
18314
+ .cn-segmented-control--stretch .cn-segmented-control__option[data-v-7b344b4f] {
18315
+ flex: 1 1 0;
18316
+ }
18317
+
18318
+ /* The parent class outscores Nextcloud's server rule that gives every plain
18319
+ `button` a margin and a border. */
18320
+ .cn-segmented-control .cn-segmented-control__option[data-v-7b344b4f] {
18321
+ display: inline-flex;
18322
+ align-items: center;
18323
+ justify-content: center;
18324
+ gap: 8px;
18325
+ box-sizing: border-box;
18326
+ min-height: 36px;
18327
+ margin: 0;
18328
+ padding: 0 16px;
18329
+ border: 1px solid transparent;
18330
+ border-radius: var(--border-radius-element, var(--border-radius-large, 8px));
18331
+ background-color: transparent;
18332
+ /* Full-contrast label on every option: the choice is carried by the
18333
+ raised surface, not by dimming the others. */
18334
+ color: var(--color-main-text);
18335
+ font: inherit;
18336
+ font-weight: 600;
18337
+ white-space: nowrap;
18338
+ cursor: pointer;
18339
+ }
18340
+ .cn-segmented-control .cn-segmented-control__option[data-v-7b344b4f]:hover {
18341
+ background-color: var(--color-background-hover);
18342
+ }
18343
+ .cn-segmented-control .cn-segmented-control__option[data-v-7b344b4f]:focus-visible {
18344
+ outline: 2px solid var(--color-primary-element);
18345
+ outline-offset: 2px;
18346
+ }
18347
+
18348
+ /* The border survives forced-colours mode, which drops background and shadow. */
18349
+ .cn-segmented-control .cn-segmented-control__option--checked[data-v-7b344b4f],
18350
+ .cn-segmented-control .cn-segmented-control__option--checked[data-v-7b344b4f]:hover {
18351
+ border-color: var(--color-border-dark);
18352
+ background-color: var(--color-main-background);
18353
+ box-shadow: 0 1px 2px var(--color-box-shadow);
18354
+ }
18355
+ .cn-segmented-control .cn-segmented-control__option[disabled][data-v-7b344b4f] {
18356
+ cursor: default;
18357
+ opacity: 0.5;
18358
+ }
18359
+ .cn-segmented-control__count[data-v-7b344b4f] {
18360
+ font-weight: 400;
18361
+ }
18362
+
18363
+
18006
18364
  .cn-header-widget[data-v-1b97430f] {
18007
18365
  width: 100%;
18008
18366
  height: 100%;
@@ -18014,6 +18372,37 @@ to { background-position: -200% 0;
18014
18372
  min-height: 0;
18015
18373
  border-radius: 0;
18016
18374
  }
18375
+
18376
+ /* With a view switch the heading and the switch share one row, the switch
18377
+ at the right and bottom-aligned with the heading; on a narrow card the
18378
+ switch wraps under it. */
18379
+ .cn-header-widget--with-views[data-v-1b97430f] {
18380
+ display: flex;
18381
+ flex-wrap: wrap;
18382
+ align-items: flex-end;
18383
+ justify-content: space-between;
18384
+ gap: calc(2 * var(--default-grid-baseline)) calc(4 * var(--default-grid-baseline));
18385
+ }
18386
+ .cn-header-widget--with-views .cn-header-widget__content[data-v-1b97430f] {
18387
+ flex: 1 1 320px;
18388
+ width: auto;
18389
+ }
18390
+ .cn-header-widget__views[data-v-1b97430f] {
18391
+ position: relative;
18392
+ z-index: 1;
18393
+ flex: 0 0 auto;
18394
+ padding: 16px;
18395
+ }
18396
+
18397
+ /* On the page ground (`content.ground`): no card, so no inset around the
18398
+ view switch, and the heading at the board's 32px. */
18399
+ .cn-header-widget--ground .cn-header-widget__views[data-v-1b97430f] {
18400
+ padding: 0;
18401
+ }
18402
+ .cn-header-widget--ground .cn-header-widget__title[data-v-1b97430f] {
18403
+ font-size: var(--cn-header-ground-title-size, 32px);
18404
+ letter-spacing: -0.01em;
18405
+ }
18017
18406
  .cn-header-widget__date[data-v-1b97430f] {
18018
18407
  font-size: 14px;
18019
18408
  line-height: 1.4;
@@ -18075,7 +18464,7 @@ to { background-position: -200% 0;
18075
18464
  height: 1px;
18076
18465
  opacity: 0;
18077
18466
  pointer-events: none;
18078
- left: -9999px;
18467
+ inset-inline-start: -9999px;
18079
18468
  top: -9999px;
18080
18469
  }
18081
18470
  @media print {
@@ -30183,6 +30572,19 @@ to {
30183
30572
  .cn-dashboard-page__empty[data-v-824052fe] {
30184
30573
  padding: 60px 20px;
30185
30574
  }
30575
+
30576
+ /* The page's view switch on a page without a header row: at the end of its
30577
+ own row, above the grids, where the header would have put it. */
30578
+ .cn-dashboard-page__view-switch[data-v-824052fe] {
30579
+ display: flex;
30580
+ justify-content: flex-end;
30581
+ margin-bottom: 12px;
30582
+ }
30583
+
30584
+ /* A view the switch shows with nothing to draw. */
30585
+ .cn-page-view-region--empty[data-v-824052fe] {
30586
+ padding: 40px 20px;
30587
+ }
30186
30588
  .cn-dashboard-page__page-filters[data-v-824052fe] {
30187
30589
  display: flex;
30188
30590
  flex-wrap: wrap;
@@ -32883,6 +33285,70 @@ a.cn-integration-card__title[data-v-f7e9bbfa]:hover {
32883
33285
  }
32884
33286
 
32885
33287
 
33288
+ /* The emblem beside the app name (`nav.brand.emblem`). A theme sets
33289
+ --nldesign-emblem-url for `emblem: true`, and --cn-nav-emblem-size for both. */
33290
+ .cn-app-nav__brand-emblem {
33291
+ flex: none;
33292
+ height: var(--cn-nav-emblem-size, 34px);
33293
+ width: auto;
33294
+ object-fit: contain;
33295
+ }
33296
+ .cn-app-nav__brand-emblem--theme {
33297
+ display: inline-block;
33298
+ width: var(--cn-nav-emblem-size, 34px);
33299
+ background: var(--nldesign-emblem-url) center / contain no-repeat;
33300
+ }
33301
+
33302
+ /* The solid primary action (`solid: true`, or an action that dispatches):
33303
+ one full-width primary button, as the board draws "New case". */
33304
+ .cn-app-nav__primary-action--solid .cn-action-buttons,
33305
+ .cn-app-nav__primary-action--solid .cn-action-buttons .button-vue,
33306
+ .cn-app-nav__primary-action--solid .button-vue {
33307
+ width: 100%;
33308
+ justify-content: center;
33309
+ }
33310
+
33311
+ /* The card above the footer entries (`nav.card`). Theme hooks:
33312
+ --cn-nav-card-background and --cn-nav-card-radius. */
33313
+ .cn-app-nav__card {
33314
+ display: flex;
33315
+ flex-direction: column;
33316
+ gap: calc(2 * var(--default-grid-baseline));
33317
+ margin: calc(2 * var(--default-grid-baseline));
33318
+ padding: calc(4 * var(--default-grid-baseline));
33319
+ border-radius: var(--cn-nav-card-radius, var(--border-radius-large));
33320
+ background: var(--cn-nav-card-background, var(--color-background-hover));
33321
+ }
33322
+ .cn-app-nav__card-title {
33323
+ color: var(--color-main-text);
33324
+ font-weight: 700;
33325
+ }
33326
+ .cn-app-nav__card-text {
33327
+ color: var(--color-text-maxcontrast);
33328
+ line-height: 1.4;
33329
+ }
33330
+ .cn-app-nav__card-link {
33331
+ align-self: flex-start;
33332
+ margin: 0;
33333
+ padding: 0;
33334
+ border: 0;
33335
+ background: none;
33336
+ color: var(--color-primary-element);
33337
+ font: inherit;
33338
+ font-weight: 600;
33339
+ text-decoration: none;
33340
+ cursor: pointer;
33341
+ }
33342
+ .cn-app-nav__card-link:hover,
33343
+ .cn-app-nav__card-link:focus-visible {
33344
+ text-decoration: underline;
33345
+ }
33346
+ .cn-app-nav__card-link:focus-visible {
33347
+ outline: 2px solid var(--color-primary-element);
33348
+ outline-offset: 2px;
33349
+ border-radius: var(--border-radius-small, 4px);
33350
+ }
33351
+
32886
33352
  /* The brand block at the top of the navigation. */
32887
33353
  .cn-app-nav__brand {
32888
33354
  align-items: center;
@@ -32935,6 +33401,21 @@ a.cn-integration-card__title[data-v-f7e9bbfa]:hover {
32935
33401
  padding: calc(var(--default-grid-baseline, 4px) * 2);
32936
33402
  }
32937
33403
 
33404
+ /*
33405
+ * The primary action never shrinks out of sight. NcAppNavigation renders it in
33406
+ * `.app-navigation__body`, a flex child with `overflow-y: scroll` (so its
33407
+ * minimum height is 0) beside a list of `height: 100%` and the footer. With a
33408
+ * card and footer entries below the list, the column overflows and the body
33409
+ * gives up its share of the shrink: "New case" showed as a 24px sliver of a
33410
+ * 42px button. All three forms carry `.app-navigation-new` (the solid and
33411
+ * link wrappers mirror NcAppNavigationNew's class), and the rule is scoped to
33412
+ * this component's navigation, so a navigation without a primary action lays
33413
+ * out exactly as before.
33414
+ */
33415
+ .app-navigation[data-testid="cn-nav"] .app-navigation__body:has(> .app-navigation-new) {
33416
+ flex-shrink: 0;
33417
+ }
33418
+
32938
33419
  /*
32939
33420
  * Footer-section items (section: "footer") render in NcAppNavigation's
32940
33421
  * #footer slot, outside the scroll container, so they stay visible above
@@ -32958,6 +33439,19 @@ a.cn-integration-card__title[data-v-f7e9bbfa]:hover {
32958
33439
  overflow: visible !important;
32959
33440
  }
32960
33441
 
33442
+ /*
33443
+ * A declared footer that names `settings` first (`nav.footer`) puts the
33444
+ * foldout above the footer list. The two are siblings in NcAppNavigation's
33445
+ * flex column, so `order` moves them without changing either's markup; the
33446
+ * card above keeps order 0 and stays first.
33447
+ */
33448
+ .cn-app-nav__settings--first {
33449
+ order: 1;
33450
+ }
33451
+ .cn-app-nav__footer-list--after-settings {
33452
+ order: 2;
33453
+ }
33454
+
32961
33455
  /*
32962
33456
  * Align the settings foldout's items with the main/footer list items,
32963
33457
  * whose icons sit at a 16px inset. The foldout's items live in a bare
@@ -34771,68 +35265,6 @@ a.cn-integration-card__title[data-v-f7e9bbfa]:hover {
34771
35265
  }
34772
35266
 
34773
35267
 
34774
- .cn-segmented-control[data-v-7b344b4f] {
34775
- display: inline-flex;
34776
- gap: 4px;
34777
- max-width: 100%;
34778
- padding: 4px;
34779
- border-radius: var(--border-radius-container, var(--border-radius-large, 10px));
34780
- background-color: var(--color-background-dark);
34781
- overflow-x: auto;
34782
- }
34783
- .cn-segmented-control--stretch[data-v-7b344b4f] {
34784
- display: flex;
34785
- }
34786
- .cn-segmented-control--stretch .cn-segmented-control__option[data-v-7b344b4f] {
34787
- flex: 1 1 0;
34788
- }
34789
-
34790
- /* The parent class outscores Nextcloud's server rule that gives every plain
34791
- `button` a margin and a border. */
34792
- .cn-segmented-control .cn-segmented-control__option[data-v-7b344b4f] {
34793
- display: inline-flex;
34794
- align-items: center;
34795
- justify-content: center;
34796
- gap: 8px;
34797
- box-sizing: border-box;
34798
- min-height: 36px;
34799
- margin: 0;
34800
- padding: 0 16px;
34801
- border: 1px solid transparent;
34802
- border-radius: var(--border-radius-element, var(--border-radius-large, 8px));
34803
- background-color: transparent;
34804
- /* Full-contrast label on every option: the choice is carried by the
34805
- raised surface, not by dimming the others. */
34806
- color: var(--color-main-text);
34807
- font: inherit;
34808
- font-weight: 600;
34809
- white-space: nowrap;
34810
- cursor: pointer;
34811
- }
34812
- .cn-segmented-control .cn-segmented-control__option[data-v-7b344b4f]:hover {
34813
- background-color: var(--color-background-hover);
34814
- }
34815
- .cn-segmented-control .cn-segmented-control__option[data-v-7b344b4f]:focus-visible {
34816
- outline: 2px solid var(--color-primary-element);
34817
- outline-offset: 2px;
34818
- }
34819
-
34820
- /* The border survives forced-colours mode, which drops background and shadow. */
34821
- .cn-segmented-control .cn-segmented-control__option--checked[data-v-7b344b4f],
34822
- .cn-segmented-control .cn-segmented-control__option--checked[data-v-7b344b4f]:hover {
34823
- border-color: var(--color-border-dark);
34824
- background-color: var(--color-main-background);
34825
- box-shadow: 0 1px 2px var(--color-box-shadow);
34826
- }
34827
- .cn-segmented-control .cn-segmented-control__option[disabled][data-v-7b344b4f] {
34828
- cursor: default;
34829
- opacity: 0.5;
34830
- }
34831
- .cn-segmented-control__count[data-v-7b344b4f] {
34832
- font-weight: 400;
34833
- }
34834
-
34835
-
34836
35268
  .cn-brand-stripe[data-v-6fdfa763] {
34837
35269
  --cn-brand-stripe-first: var(--cn-brand-stripe-ratio-1, 1);
34838
35270
  --cn-brand-stripe-second: var(--cn-brand-stripe-ratio-2, 1);