@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.
- package/dist/esm/components/CnAppNav/CnAppNav.vue2.js +253 -10
- package/dist/esm/components/CnAppNav/CnAppNav.vue2.js.map +1 -1
- package/dist/esm/components/CnAppNav/CnAppNav.vue3.js +139 -46
- package/dist/esm/components/CnAppNav/CnAppNav.vue3.js.map +1 -1
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js +87 -0
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js.map +1 -1
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js +26 -24
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js.map +1 -1
- package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js +61 -16
- package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js.map +1 -1
- package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue3.js.map +1 -1
- package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue2.js +20 -0
- package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue3.js +3 -2
- package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnBreadcrumbs/CnBreadcrumbs.vue2.js +13 -0
- package/dist/esm/components/CnBreadcrumbs/CnBreadcrumbs.vue2.js.map +1 -1
- package/dist/esm/components/CnBreadcrumbs/CnBreadcrumbs.vue3.js +2 -1
- package/dist/esm/components/CnBreadcrumbs/CnBreadcrumbs.vue3.js.map +1 -1
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +33 -2
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +154 -4
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +555 -480
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnColumnFilterPopover.vue2.js +9 -3
- package/dist/esm/components/CnDataTable/CnColumnFilterPopover.vue2.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnColumnFilterPopover.vue3.js +1 -1
- package/dist/esm/components/CnDataTable/CnColumnFilterPopover.vue3.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +37 -1
- package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +12 -4
- package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +187 -19
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +215 -135
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
- package/dist/esm/components/CnFkResolveCell/CnFkResolveCell.vue2.js +3 -1
- package/dist/esm/components/CnFkResolveCell/CnFkResolveCell.vue2.js.map +1 -1
- package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js +144 -4
- package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js.map +1 -1
- package/dist/esm/components/CnFormDialog/CnFormDialog.vue3.js.map +1 -1
- package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue2.js +157 -7
- package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue3.js +23 -5
- package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +30 -0
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +2 -2
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +5 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js +4 -2
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue2.js +11 -0
- package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue2.js.map +1 -1
- package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue3.js +2 -1
- package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue3.js.map +1 -1
- package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js +63 -2
- package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue3.js +96 -37
- package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnStagesWidget/stagesModel.js +5 -2
- package/dist/esm/components/CnStagesWidget/stagesModel.js.map +1 -1
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js +74 -5
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js +15 -8
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +14 -2
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js +2 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue2.js +73 -1
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue2.js.map +1 -1
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue3.js +14 -2
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue3.js.map +1 -1
- package/dist/esm/l10n/en.json.js +5 -1
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +5 -1
- package/dist/esm/l10n/nl.json.js.map +1 -1
- package/dist/esm/mixins/pageViews.js +400 -0
- package/dist/esm/mixins/pageViews.js.map +1 -0
- package/dist/esm/nextcloud-vue.css +513 -81
- package/dist/esm/store/useObjectStore.js +118 -33
- package/dist/esm/store/useObjectStore.js.map +1 -1
- package/dist/esm/utils/actionsDispatcher.js +25 -2
- package/dist/esm/utils/actionsDispatcher.js.map +1 -1
- package/dist/esm/utils/columnFilters.js +27 -3
- package/dist/esm/utils/columnFilters.js.map +1 -1
- package/dist/esm/utils/schema.js +40 -2
- package/dist/esm/utils/schema.js.map +1 -1
- package/dist/esm/utils/schemaRefSlug.js +19 -3
- package/dist/esm/utils/schemaRefSlug.js.map +1 -1
- package/dist/esm/utils/validateManifestV2.compiled.js +2 -2
- package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
- package/dist/nextcloud-vue.cjs.js +8858 -6566
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +513 -81
- package/l10n/en.json +5 -0
- package/l10n/nl.json +5 -0
- package/package.json +1 -1
- package/src/components/CnAppNav/CnAppNav.vue +441 -14
- package/src/components/CnAppRoot/CnAppRoot.md +4 -0
- package/src/components/CnAppRoot/CnAppRoot.vue +94 -1
- package/src/components/CnAuditTrailCard/CnAuditTrailCard.vue +61 -16
- package/src/components/CnAuditTrailWidget/CnAuditTrailWidget.vue +22 -1
- package/src/components/CnBreadcrumbs/CnBreadcrumbs.vue +14 -0
- package/src/components/CnCellRenderer/CnCellRenderer.vue +33 -2
- package/src/components/CnDashboardPage/CnDashboardPage.vue +237 -12
- package/src/components/CnDataTable/CnColumnFilterPopover.vue +11 -5
- package/src/components/CnDataTable/CnDataTable.vue +45 -1
- package/src/components/CnDetailPage/CnDetailPage.md +8 -0
- package/src/components/CnDetailPage/CnDetailPage.vue +263 -7
- package/src/components/CnFkResolveCell/CnFkResolveCell.vue +3 -1
- package/src/components/CnFormDialog/CnFormDialog.vue +144 -4
- package/src/components/CnHeaderWidget/CnHeaderWidget.vue +206 -9
- package/src/components/CnIndexPage/CnIndexPage.vue +32 -2
- package/src/components/CnObjectListWidget/CnObjectListWidget.vue +7 -1
- package/src/components/CnSegmentedControl/CnSegmentedControl.md +1 -1
- package/src/components/CnSegmentedControl/CnSegmentedControl.vue +12 -0
- package/src/components/CnStagesWidget/CnStagesWidget.vue +189 -2
- package/src/components/CnStagesWidget/stagesModel.js +5 -2
- package/src/components/CnStatWidget/CnStatWidget.vue +89 -7
- package/src/components/CnTabsWidget/CnTabsWidget.vue +15 -2
- package/src/components/CnWidgetWrapper/CnWidgetWrapper.md +4 -0
- package/src/components/CnWidgetWrapper/CnWidgetWrapper.vue +107 -1
- package/src/css/detail-page.css +37 -4
- package/src/css/kpi-card.css +71 -1
- package/src/css/table.css +18 -6
- package/src/mixins/pageViews.js +396 -0
- package/src/schemas/app-manifest-v2.schema.json +162 -3
- package/src/store/useObjectStore.js +118 -33
- package/src/utils/actionsDispatcher.js +25 -2
- package/src/utils/columnFilters.js +29 -2
- package/src/utils/schema.js +40 -2
- package/src/utils/schemaRefSlug.js +19 -3
- package/src/utils/validateManifestV2.compiled.js +2 -2
package/dist/nextcloud-vue.css
CHANGED
|
@@ -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:
|
|
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:
|
|
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-
|
|
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-
|
|
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-
|
|
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:
|
|
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:
|
|
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:
|
|
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-
|
|
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:
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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-
|
|
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-
|
|
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-
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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);
|