@conduction/nextcloud-vue 2.121.0 → 2.123.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 (102) hide show
  1. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js +1 -0
  2. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js.map +1 -1
  3. package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js.map +1 -1
  4. package/dist/esm/components/CnAttentionFlagWidget/CnAttentionFlagWidget.vue.js +1 -1
  5. package/dist/esm/components/CnAttentionFlagWidget/CnAttentionFlagWidget.vue2.js +18 -4
  6. package/dist/esm/components/CnAttentionFlagWidget/CnAttentionFlagWidget.vue2.js.map +1 -1
  7. package/dist/esm/components/CnAttentionFlagWidget/CnAttentionFlagWidget.vue3.js +63 -32
  8. package/dist/esm/components/CnAttentionFlagWidget/CnAttentionFlagWidget.vue3.js.map +1 -1
  9. package/dist/esm/components/CnChartWidget/CnChartWidget.vue.js +1 -1
  10. package/dist/esm/components/CnChartWidget/CnChartWidget.vue2.js.map +1 -1
  11. package/dist/esm/components/CnChartWidget/CnChartWidget.vue3.js.map +1 -1
  12. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +35 -0
  13. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  14. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +11 -5
  15. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  16. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue.js +1 -1
  17. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js +13 -0
  18. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -1
  19. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js +37 -5
  20. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js.map +1 -1
  21. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue.js +1 -1
  22. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +40 -0
  23. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
  24. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js +71 -65
  25. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
  26. package/dist/esm/components/CnFlowDetail/CnFlowDetail.vue.js +1 -1
  27. package/dist/esm/components/CnFlowDetail/CnFlowDetail.vue2.js +20 -0
  28. package/dist/esm/components/CnFlowDetail/CnFlowDetail.vue2.js.map +1 -1
  29. package/dist/esm/components/CnFlowDetail/CnFlowDetail.vue3.js +2 -1
  30. package/dist/esm/components/CnFlowDetail/CnFlowDetail.vue3.js.map +1 -1
  31. package/dist/esm/components/CnFlowsPage/CnFlowBoard.vue.js +1 -1
  32. package/dist/esm/components/CnFlowsPage/CnFlowBoard.vue2.js +2 -0
  33. package/dist/esm/components/CnFlowsPage/CnFlowBoard.vue2.js.map +1 -1
  34. package/dist/esm/components/CnFlowsPage/CnFlowBoard.vue3.js +49 -44
  35. package/dist/esm/components/CnFlowsPage/CnFlowBoard.vue3.js.map +1 -1
  36. package/dist/esm/components/CnFlowsPage/CnFlowEditorPage.vue2.js +10 -0
  37. package/dist/esm/components/CnFlowsPage/CnFlowEditorPage.vue2.js.map +1 -1
  38. package/dist/esm/components/CnFlowsPage/CnFlowEditorPage.vue3.js +2 -1
  39. package/dist/esm/components/CnFlowsPage/CnFlowEditorPage.vue3.js.map +1 -1
  40. package/dist/esm/components/CnGraphCanvas/CnGraphCanvas.vue2.js +31 -0
  41. package/dist/esm/components/CnGraphCanvas/CnGraphCanvas.vue2.js.map +1 -1
  42. package/dist/esm/components/CnGraphCanvas/CnGraphCanvas.vue3.js +4 -3
  43. package/dist/esm/components/CnGraphCanvas/CnGraphCanvas.vue3.js.map +1 -1
  44. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +34 -2
  45. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  46. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  47. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js.map +1 -1
  48. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue3.js +1 -0
  49. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue3.js.map +1 -1
  50. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue.js +1 -1
  51. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js +2 -0
  52. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js.map +1 -1
  53. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js +2 -1
  54. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js.map +1 -1
  55. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue.js +1 -1
  56. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue2.js +31 -1
  57. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue2.js.map +1 -1
  58. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue3.js +14 -4
  59. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue3.js.map +1 -1
  60. package/dist/esm/composables/flowGraphLayout.js +36 -7
  61. package/dist/esm/composables/flowGraphLayout.js.map +1 -1
  62. package/dist/esm/composables/useFlowStore.js +7 -3
  63. package/dist/esm/composables/useFlowStore.js.map +1 -1
  64. package/dist/esm/l10n/en.json.js +3 -1
  65. package/dist/esm/l10n/en.json.js.map +1 -1
  66. package/dist/esm/l10n/nl.json.js +3 -1
  67. package/dist/esm/l10n/nl.json.js.map +1 -1
  68. package/dist/esm/library-style.js +1 -1
  69. package/dist/esm/nextcloud-vue.css +670 -316
  70. package/dist/esm/utils/manifestTranslate.js +12 -3
  71. package/dist/esm/utils/manifestTranslate.js.map +1 -1
  72. package/dist/esm/utils/routeFilters.js +3 -3
  73. package/dist/esm/utils/routeFilters.js.map +1 -1
  74. package/dist/nextcloud-vue.cjs.js +1218 -847
  75. package/dist/nextcloud-vue.cjs.js.map +2 -2
  76. package/dist/nextcloud-vue.css +670 -316
  77. package/l10n/en.json +3 -1
  78. package/l10n/nl.json +3 -1
  79. package/package.json +1 -1
  80. package/src/components/CnAppRoot/CnAppRoot.vue +1 -0
  81. package/src/components/CnAttentionFlagWidget/CnAttentionFlagWidget.vue +50 -5
  82. package/src/components/CnChartWidget/CnChartWidget.vue +10 -8
  83. package/src/components/CnDetailPage/CnDetailPage.md +10 -0
  84. package/src/components/CnDetailPage/CnDetailPage.vue +42 -1
  85. package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +39 -0
  86. package/src/components/CnFilesBrowser/CnFilesBrowser.vue +95 -37
  87. package/src/components/CnFlowDetail/CnFlowDetail.vue +21 -0
  88. package/src/components/CnFlowsPage/CnFlowBoard.vue +35 -18
  89. package/src/components/CnFlowsPage/CnFlowEditorPage.vue +11 -0
  90. package/src/components/CnGraphCanvas/CnGraphCanvas.vue +34 -2
  91. package/src/components/CnIndexPage/CnIndexPage.vue +34 -2
  92. package/src/components/CnIndexSidebar/CnIndexSidebar.vue +1 -0
  93. package/src/components/CnObjectSidebar/CnFilesTab.vue +3 -0
  94. package/src/components/CnSectionsWidget/CnSectionsWidget.vue +53 -2
  95. package/src/composables/flowGraphLayout.js +35 -6
  96. package/src/composables/useFlowStore.js +7 -3
  97. package/src/css/detail-page.css +6 -0
  98. package/src/css/look-board-detail.css +53 -6
  99. package/src/css/look-board-index.css +151 -12
  100. package/src/css/look-board.css +116 -4
  101. package/src/utils/manifestTranslate.js +12 -3
  102. package/src/utils/routeFilters.js +3 -3
@@ -321,6 +321,29 @@
321
321
  font-weight: 600;
322
322
  }
323
323
 
324
+ /* With the sidebar open the Filter button is pressed: the board draws it on
325
+ the light primary ground with a primary edge and the main ink, not as a
326
+ filled primary button (DqFilterBeheren). Its count badge stays the filled
327
+ primary pill. NcButton redefines the main text inside the button, so the ink is taken
328
+ on the bar; the theme's forced primary ink and edge read the button's own
329
+ properties.
330
+ @spec openspec/changes/board-index-sidebar/specs/board-index-sidebar/spec.md#requirement-the-pressed-filter-button-is-the-boards-light-toggle */
331
+ .cn-look-board .cn-actions-bar {
332
+ --cn-filter-pressed-ink: var(--color-main-text);
333
+ }
334
+
335
+ .cn-look-board .cn-actions-bar__filter-button.button-vue[aria-pressed='true'] {
336
+ --nldesign-component-button-primary-action-color: var(--cn-filter-pressed-ink);
337
+ --nldesign-component-button-primary-action-border-color: var(--color-primary-element);
338
+ border-color: var(--color-primary-element);
339
+ background-color: var(--color-primary-element-light);
340
+ color: var(--cn-filter-pressed-ink);
341
+ }
342
+
343
+ .cn-look-board .cn-actions-bar__filter-button.button-vue[aria-pressed='true']:hover {
344
+ background-color: var(--color-primary-element-light-hover);
345
+ }
346
+
324
347
  .cn-look-board .cn-actions-bar__filter-badge {
325
348
  display: inline-flex;
326
349
  align-items: center;
@@ -634,16 +657,36 @@
634
657
  width: 18%;
635
658
  }
636
659
 
637
- /* The board's data cells sit 12px apart (PqTickets), the first one 18px from
638
- the selection column; the selection and menu columns keep 16px. */
639
- .cn-look-board .cn-index-page__main--table .cn-table-container--board .cn-data-table th:not(.cn-table-col--checkbox):not(.cn-table-col--actions):not(.cn-table-col--icon),
640
- .cn-look-board .cn-index-page__main--table .cn-table-container--board .cn-data-table td:not(.cn-table-col--checkbox):not(.cn-table-col--actions):not(.cn-table-col--icon) {
660
+ /* An index table pads every cell 16px at the sides (DqZaken). The plain-title
661
+ table (`rowTitle: "plain"`: PqTickets, OcPublicaties) sets its data cells
662
+ 12px apart and its title column 18px from the selection column; the
663
+ selection and menu columns keep 16px. The title column is left out of the
664
+ 12px rule, which would otherwise outrank the 18px one.
665
+ @spec openspec/changes/board-table-density/specs/board-table-density/spec.md#requirement-a-board-table-pads-its-cells-as-the-boards-draw-them */
666
+ .cn-look-board .cn-index-page__main--table .cn-table-container--board.cn-table-container--title-plain .cn-data-table th:not(.cn-table-col--checkbox):not(.cn-table-col--actions):not(.cn-table-col--icon):not(.cn-table-head--title),
667
+ .cn-look-board .cn-index-page__main--table .cn-table-container--board.cn-table-container--title-plain .cn-data-table td:not(.cn-table-col--checkbox):not(.cn-table-col--actions):not(.cn-table-col--icon):not(.cn-table-col--title) {
641
668
  padding-inline: 12px;
642
669
  }
643
670
 
644
- .cn-look-board .cn-index-page__main--table .cn-table-container--board .cn-data-table th.cn-table-head--title,
645
- .cn-look-board .cn-index-page__main--table .cn-table-container--board .cn-data-table td.cn-table-col--title {
646
- padding-inline-start: 18px;
671
+ .cn-look-board .cn-index-page__main--table .cn-table-container--board.cn-table-container--title-plain .cn-data-table th.cn-table-head--title,
672
+ .cn-look-board .cn-index-page__main--table .cn-table-container--board.cn-table-container--title-plain .cn-data-table td.cn-table-col--title {
673
+ padding-inline: 18px 12px;
674
+ }
675
+
676
+ /* A table that is not an index page's main list sits in a card and is the
677
+ compact one: 10px 12px in the header, 11px 12px in the cells
678
+ (DqInstellingen, DqVthInstellingen, DqZaaktype, DqTermijnen). The selection
679
+ column keeps its 16px, so it stays 60px wide. */
680
+ .cn-look-board .cn-table-container--board:not(.cn-index-page__main--table > *) .cn-data-table th {
681
+ padding: 10px 12px;
682
+ }
683
+
684
+ .cn-look-board .cn-table-container--board:not(.cn-index-page__main--table > *) .cn-data-table td {
685
+ padding: 11px 12px;
686
+ }
687
+
688
+ .cn-look-board .cn-table-container--board:not(.cn-index-page__main--table > *) .cn-data-table .cn-table-col--checkbox {
689
+ padding-inline: 16px;
647
690
  }
648
691
 
649
692
  .cn-look-board .cn-index-page__main--table .cn-table-container--board .cn-data-table td > .cn-cell-renderer {
@@ -873,12 +916,15 @@
873
916
  }
874
917
 
875
918
  /* A page link is a <button>: Nextcloud's `button` rule sets it bold, the
876
- boards set the links at the regular weight and only the current page at 600. */
919
+ boards set the links at the regular weight and only the current page at 600.
920
+ The boards size a link's content box at 34px, so a bordered link is 36px
921
+ and the borderless current page 34px (DqZaken "2", "Volgende", "1").
922
+ @spec openspec/changes/board-pagination-links/specs/board-pagination-links/spec.md#requirement-a-board-page-link-is-sized-as-the-boards-draw-it */
877
923
  .cn-look-board .cn-pagination--board .cn-pagination__board-link {
878
924
  box-sizing: border-box;
879
- min-width: 34px;
880
- height: 34px;
881
- min-height: 34px;
925
+ min-width: 36px;
926
+ height: 36px;
927
+ min-height: 36px;
882
928
  margin: 0;
883
929
  padding: 0 8px;
884
930
  border: 1px solid var(--color-border);
@@ -903,7 +949,10 @@
903
949
  }
904
950
 
905
951
  .cn-look-board .cn-pagination--board .cn-pagination__board-link--current {
906
- border-color: var(--color-primary-element);
952
+ min-width: 34px;
953
+ height: 34px;
954
+ min-height: 34px;
955
+ border: 0;
907
956
  background: var(--color-primary-element);
908
957
  color: var(--color-primary-element-text);
909
958
  font-weight: 600;
@@ -1271,6 +1320,26 @@
1271
1320
  display: none;
1272
1321
  }
1273
1322
 
1323
+ /* The index sidebar as the board draws it (IndexZijpaneel, DqFilterBeheren):
1324
+ 360px wide, the line under the title 14px muted, and a round close button.
1325
+ The title and the tab row are the `.cn-index-sidebar-panel` rules.
1326
+ NcAppSidebar renders as the root's direct child, so the rules reach it
1327
+ through the root, as the toggle rule above does.
1328
+ @spec openspec/changes/board-index-sidebar/specs/board-index-sidebar/spec.md#requirement-the-board-index-sidebar-draws-the-boards-side-panel */
1329
+ .cn-look-board:has(.cn-index-page) > .app-sidebar {
1330
+ --app-sidebar-width: 360px;
1331
+ }
1332
+
1333
+ .cn-look-board:has(.cn-index-page) > .app-sidebar .app-sidebar-header__subname {
1334
+ color: var(--color-text-maxcontrast);
1335
+ font-size: 14px;
1336
+ }
1337
+
1338
+ .cn-look-board:has(.cn-index-page) > .app-sidebar .app-sidebar__close {
1339
+ border-radius: 50%;
1340
+ color: var(--cn-board-text-soft);
1341
+ }
1342
+
1274
1343
  /* The folder pane as a card (DqAfdelingen): 280px, a hairline border, 12px
1275
1344
  corners, with each folder's count in a grey pill. */
1276
1345
  .cn-look-board .cn-index-page__folder-pane {
@@ -1406,3 +1475,73 @@
1406
1475
  border-bottom: none;
1407
1476
  padding-block: 2px;
1408
1477
  }
1478
+
1479
+ /* ---- The index side panel (CnIndexSidebar, board IndexZijpaneel) -------- */
1480
+ /* The panel's title is 20px bold without the schema icon, and its tabs are
1481
+ one row of 40px labels, 14px weight 600 in the soft ink, the open one in
1482
+ the deep primary ink and underlined 2px in the primary colour on the
1483
+ strip's rule (DqFilterBeheren). NcAppSidebar stacks the icon over the
1484
+ label in a 54px tile with a highlight bar; the board does neither. The
1485
+ header rule repeats NcAppSidebar's own chain to outrank it.
1486
+ @spec openspec/changes/board-index-sidebar-tabs/specs/board-index-sidebar-tabs/spec.md#requirement-the-board-index-side-panel-draws-the-boards-header-and-tab-row */
1487
+ .cn-look-board .cn-index-sidebar-panel .app-sidebar-header__desc .app-sidebar-header__name-container .app-sidebar-header__mainname-container h2.app-sidebar-header__mainname {
1488
+ font-size: 20px;
1489
+ font-weight: 700;
1490
+ line-height: 1.2;
1491
+ min-height: 0;
1492
+ }
1493
+
1494
+ .cn-look-board .cn-index-sidebar-panel .app-sidebar-header__figure:has(> .cn-index-sidebar__header-icon) {
1495
+ display: none;
1496
+ }
1497
+
1498
+ .cn-look-board .cn-index-sidebar-panel .app-sidebar-tabs__nav[role="tablist"] {
1499
+ justify-content: flex-start;
1500
+ gap: 4px;
1501
+ margin: 0;
1502
+ padding: 14px 12px 0;
1503
+ border-bottom: 1px solid var(--color-border);
1504
+ }
1505
+
1506
+ .cn-look-board .cn-index-sidebar-panel .app-sidebar-tabs__highlight {
1507
+ display: none;
1508
+ }
1509
+
1510
+ .cn-look-board .cn-index-sidebar-panel .app-sidebar-tabs__tab[role="tab"] {
1511
+ flex: 0 0 auto;
1512
+ flex-direction: row;
1513
+ align-items: center;
1514
+ gap: 6px;
1515
+ box-sizing: border-box;
1516
+ height: 40px;
1517
+ min-height: 40px;
1518
+ margin: 0 0 -1px;
1519
+ padding: 0 10px;
1520
+ border: 0;
1521
+ border-bottom: 2px solid transparent;
1522
+ border-radius: 0;
1523
+ background: transparent;
1524
+ color: var(--cn-board-text-soft);
1525
+ font-size: 14px;
1526
+ font-weight: 600;
1527
+ }
1528
+
1529
+ .cn-look-board .cn-index-sidebar-panel .app-sidebar-tabs__tab[role="tab"] * {
1530
+ font-weight: inherit;
1531
+ }
1532
+
1533
+ .cn-look-board .cn-index-sidebar-panel .app-sidebar-tabs__tab[role="tab"]::after {
1534
+ content: none;
1535
+ }
1536
+
1537
+ .cn-look-board .cn-index-sidebar-panel .app-sidebar-tabs__tab[role="tab"]:hover {
1538
+ background: transparent;
1539
+ border-bottom-color: var(--color-border-dark);
1540
+ color: var(--color-main-text);
1541
+ }
1542
+
1543
+ .cn-look-board .cn-index-sidebar-panel .app-sidebar-tabs__tab[role="tab"][aria-selected="true"] {
1544
+ background: transparent;
1545
+ border-bottom-color: var(--color-primary-element);
1546
+ color: var(--color-primary-element-light-text);
1547
+ }
@@ -187,8 +187,8 @@
187
187
  /* ---- Dashboard switch row --------------------------------------------- */
188
188
  /* The switch row under a board dashboard's header (DqMijnWerk, DqMijnTeam).
189
189
  The link pills take the deep primary ink of the boards' primary pills: the
190
- light primary text mixed toward the main text, which only raises its
191
- contrast on the light primary ground. A theme that forces the link ink onto
190
+ light primary text, the ink a theme pairs with the light primary ground
191
+ (DqMijnWerk #234a78 on #eaf0f7, 8:1). A theme that forces the link ink onto
192
192
  every `a` reads it from --nldesign-color-on-surface, so the pill hands it
193
193
  its own. The view switch is the board's segmented control: 14px labels, the
194
194
  others in the soft ink, the chosen one raised on white without an edge;
@@ -196,7 +196,7 @@
196
196
  @spec openspec/changes/board-dashboard-switch-row/specs/board-dashboard-switch-row/spec.md#requirement-the-link-pills-take-the-deep-primary-ink
197
197
  @spec openspec/changes/board-dashboard-switch-row/specs/board-dashboard-switch-row/spec.md#requirement-the-view-switch-is-the-boards-segmented-control */
198
198
  .cn-look-board .cn-dashboard-page__switch-row .cn-dashboard-page__view-link:not(.cn-look-nextcloud *) {
199
- --cn-view-link-ink: color-mix(in srgb, var(--color-primary-element-light-text) 60%, var(--color-main-text));
199
+ --cn-view-link-ink: var(--color-primary-element-light-text);
200
200
  --nldesign-color-on-surface: var(--cn-view-link-ink);
201
201
  color: var(--cn-view-link-ink);
202
202
  }
@@ -221,6 +221,25 @@
221
221
  }
222
222
  }
223
223
 
224
+ /* ---- Period group ------------------------------------------------------- */
225
+ /* The boards' compact segmented group (the period switch on DqDoorlooptijd
226
+ and DqTermijnen, Gemiddeld / Mediaan on DqProcesanalyse) pads a label 14px
227
+ on each side and draws the options not chosen in the soft ink; the chosen
228
+ one is raised on white in the main ink. An icon-only option stays square.
229
+ @spec openspec/changes/board-period-group-soft-ink/specs/board-period-group-soft-ink/spec.md#requirement-a-board-period-group-draws-the-options-not-chosen-in-the-soft-ink */
230
+ .cn-look-board .cn-segmented-control.cn-segmented-control--compact .cn-segmented-control__option:not(.cn-look-nextcloud *) {
231
+ padding: 0 14px;
232
+ color: var(--cn-board-text-soft);
233
+ }
234
+
235
+ .cn-look-board .cn-segmented-control.cn-segmented-control--compact .cn-segmented-control__option--checked:not(.cn-look-nextcloud *) {
236
+ color: var(--color-main-text);
237
+ }
238
+
239
+ .cn-look-board .cn-segmented-control.cn-segmented-control--compact .cn-segmented-control__option--icon-only:not(.cn-look-nextcloud *) {
240
+ padding: 0;
241
+ }
242
+
224
243
  /* ---- Button weight ------------------------------------------------------ */
225
244
  /* The boards draw a labelled button at 600 (DqZaken "Downloaden", DqZaak's
226
245
  header, dialog footers, toolbar and row actions). An NcButton reads its
@@ -228,9 +247,15 @@
228
247
  look sets 600 on each button, so every NcButton on a board page draws the
229
248
  board's weight without a rule per surface. Breadcrumb buttons keep the
230
249
  crumb weight.
231
- @spec openspec/changes/board-button-weight/specs/board-button-weight/spec.md#requirement-a-board-button-draws-at-600 */
250
+ The boards also draw a button's text at 14px, against Nextcloud's 15px.
251
+ NcButton reads its size from --default-font-size, so the look sets that
252
+ variable on the button: a surface that sets its own `font-size` (the next
253
+ step card's 15px) keeps it.
254
+ @spec openspec/changes/board-button-weight/specs/board-button-weight/spec.md#requirement-a-board-button-draws-at-600
255
+ @spec openspec/changes/board-control-text/specs/board-control-text/spec.md#requirement-a-board-button-draws-its-text-at-14px */
232
256
  .cn-look-board .button-vue:not(.cn-look-nextcloud *):not(.vue-crumb *) {
233
257
  --font-weight-element: 600;
258
+ --default-font-size: 14px;
234
259
  }
235
260
 
236
261
  /* ---- A button with an icon and a label --------------------------------- */
@@ -393,6 +418,26 @@
393
418
  background: var(--color-background-hover);
394
419
  }
395
420
 
421
+ /* ---- A secondary button --------------------------------------------------- */
422
+ /* The boards draw every secondary button neutral: the main background, a 1px
423
+ control border, the main text, the hover ground on hover (DqFlow "Testen
424
+ met een zaak", DqFunctionaliteiten "Documentatie", DqTaak "Afronden").
425
+ NcButton draws its secondary from the primary-light variables, on a 2px
426
+ bottom edge; the look points those variables at the neutral colours on the
427
+ button itself. The selector weighs (0,3,0): it outranks NcButton's border
428
+ (0,2,0), and a surface rule of the same weight later in the cascade (a
429
+ dialog's cancel) still decides for its surface.
430
+ @spec openspec/changes/board-secondary-neutral/specs/board-secondary-neutral/spec.md#requirement-a-board-secondary-button-is-neutral */
431
+ .cn-look-board .button-vue.button-vue--secondary:where(:not(.cn-look-nextcloud *):not(.vue-crumb *)),
432
+ .cn-look-board .button-vue.button-vue--vue-secondary:where(:not(.cn-look-nextcloud *):not(.vue-crumb *)) {
433
+ --color-primary-element-light: var(--color-main-background);
434
+ --color-primary-element-light-hover: var(--color-background-hover);
435
+ --color-primary-element-light-text: var(--color-main-text);
436
+ --nldesign-color-on-surface: var(--color-main-text);
437
+ border: 1px solid var(--cn-board-control-border);
438
+ color: var(--color-main-text);
439
+ }
440
+
396
441
  /* ---- Header action buttons (CnActionButtons) ----------------------------- */
397
442
  /* The board draws a page's secondary actions as neutral 40px buttons: the
398
443
  main background, a grey border, the main text at 600 (DqZaak "Bericht",
@@ -1611,6 +1656,11 @@ body:has(.cn-look-board):not(:has(.cn-look-nextcloud)) .v-popper__popper.action-
1611
1656
  padding: 0 var(--cn-board-dashboard-card-inset) 10px;
1612
1657
  }
1613
1658
 
1659
+ /* DqMijnWerk "Mijn archiefbeoordelingen": its rows and its empty line. */
1660
+ .cn-look-board .cn-dashboard-page:not(.cn-look-nextcloud *) .cn-widget-wrapper:not(.cn-widget-wrapper--borderless) .cn-decision-list {
1661
+ padding: 0 var(--cn-board-dashboard-card-inset) 20px;
1662
+ }
1663
+
1614
1664
  .cn-look-board .cn-dashboard-page:not(.cn-look-nextcloud *) .cn-widget-wrapper:not(.cn-widget-wrapper--borderless) .cn-stacked-bar,
1615
1665
  .cn-look-board .cn-dashboard-page:not(.cn-look-nextcloud *) .cn-widget-wrapper:not(.cn-widget-wrapper--borderless) .cn-week-strip {
1616
1666
  box-sizing: border-box;
@@ -1656,6 +1706,29 @@ body:has(.cn-look-board):not(:has(.cn-look-nextcloud)) .v-popper__popper.action-
1656
1706
  padding-inline-end: var(--cn-board-dashboard-card-inset);
1657
1707
  }
1658
1708
 
1709
+ /* ---- A card of cards (DqDoorlooptijd "Naleving") ------------------------- */
1710
+ /* A sections widget laid out in columns on a dashboard card keeps the card's
1711
+ side inset and 20px below. Each section is a small card: a hairline edge,
1712
+ a 10px corner, 14px 16px of padding and its heading at 15px 700, 10px above
1713
+ the content.
1714
+ @spec openspec/changes/sections-card-grid/specs/sections-card-grid/spec.md#requirement-a-board-card-of-cards-draws-the-boards-small-cards */
1715
+ .cn-look-board .cn-dashboard-page:not(.cn-look-nextcloud *) .cn-widget-wrapper:not(.cn-widget-wrapper--borderless) .cn-sections-widget--grid {
1716
+ padding: 0 var(--cn-board-dashboard-card-inset) 20px;
1717
+ }
1718
+
1719
+ .cn-look-board .cn-sections-widget--grid.cn-sections-widget--cards .cn-sections-widget__section:not(.cn-look-nextcloud *) {
1720
+ padding: 14px 16px;
1721
+ border: 1px solid var(--cn-board-hairline);
1722
+ border-radius: 10px;
1723
+ }
1724
+
1725
+ .cn-look-board .cn-sections-widget--grid.cn-sections-widget--cards .cn-sections-widget__heading:not(.cn-look-nextcloud *) {
1726
+ margin: 0 0 10px;
1727
+ font-size: 15px;
1728
+ font-weight: 700;
1729
+ line-height: normal;
1730
+ }
1731
+
1659
1732
  /* ---- Week strip (DqMijnWerk "Termijnen deze week") ---------------------- */
1660
1733
  /* The days wrap inside the card instead of scrolling sideways: a row holds
1661
1734
  as many days of at least 120px as the card fits, and the rest go to the
@@ -1673,6 +1746,45 @@ body:has(.cn-look-board):not(:has(.cn-look-nextcloud)) .v-popper__popper.action-
1673
1746
 
1674
1747
  .cn-look-board .cn-week-strip:not(.cn-look-nextcloud *) .cn-week-strip__head {
1675
1748
  flex-wrap: wrap;
1749
+ font-size: 13px;
1750
+ font-weight: 700;
1751
+ color: var(--cn-board-text-soft);
1752
+ }
1753
+
1754
+ /* A board day is a tinted box without an edge, at least 132px high so a week
1755
+ of empty days still reads as a week (DqMijnWerk "Termijnen deze week"): the
1756
+ workspace grey, and today the light primary ground in its own ink. Forced
1757
+ colours drop the grounds, so the box keeps an edge there. */
1758
+ .cn-look-board .cn-week-strip:not(.cn-look-nextcloud *) .cn-week-strip__day {
1759
+ min-height: 132px;
1760
+ padding: 12px;
1761
+ border-color: transparent;
1762
+ border-radius: 10px;
1763
+ background: var(--nldesign-component-content-surface-background-color, var(--color-background-hover));
1764
+ }
1765
+
1766
+ .cn-look-board .cn-week-strip:not(.cn-look-nextcloud *) .cn-week-strip__day--today {
1767
+ background: var(--color-primary-element-light);
1768
+ }
1769
+
1770
+ .cn-look-board .cn-week-strip:not(.cn-look-nextcloud *) .cn-week-strip__day--today .cn-week-strip__head {
1771
+ color: var(--color-primary-element-light-text);
1772
+ }
1773
+
1774
+ .cn-look-board .cn-week-strip:not(.cn-look-nextcloud *) .cn-week-strip__today {
1775
+ border-radius: 10px;
1776
+ font-size: 11px;
1777
+ line-height: 13px;
1778
+ }
1779
+
1780
+ .cn-look-board .cn-week-strip:not(.cn-look-nextcloud *) .cn-week-strip__empty {
1781
+ font-size: 13px;
1782
+ }
1783
+
1784
+ @media (forced-colors: active) {
1785
+ .cn-look-board .cn-week-strip:not(.cn-look-nextcloud *) .cn-week-strip__day {
1786
+ border-color: CanvasText;
1787
+ }
1676
1788
  }
1677
1789
 
1678
1790
  /* ---- A card of boxed stat tiles (DcRapportages "Vergaderingen en efficiëntie") -- */
@@ -12,7 +12,9 @@
12
12
  * for the language, then for its base (`en_GB` falls back to `en`);
13
13
  * 2. otherwise the host's `translate(text, vars)`, whose answer is the text
14
14
  * itself when it has no translation;
15
- * 3. the text as written.
15
+ * 3. the library's own catalog (`library`), for the strings a library
16
+ * component asks through `cnTranslate` and the app never translates;
17
+ * 4. the text as written.
16
18
  *
17
19
  * The fallback is per label, never per page. The manifest is read through a
18
20
  * getter on every call, so an edit to the working copy shows at once.
@@ -52,9 +54,10 @@ function fill(text, vars) {
52
54
  * @param {() => (object|null|undefined)} options.getManifest The live manifest (the editor's working copy while editing).
53
55
  * @param {() => string} options.getLanguage The language to show.
54
56
  * @param {(text: string, vars?: object) => string} [options.translate] The host's translate.
57
+ * @param {(text: string, vars?: object) => string} [options.library] The library's translate, asked when the host has no translation.
55
58
  * @return {Function} `(text, vars) => string`, with `lookup`, `fellBack` and `sourceLanguage` attached.
56
59
  */
57
- export function createManifestTranslate({ getManifest, getLanguage, translate }) {
60
+ export function createManifestTranslate({ getManifest, getLanguage, translate, library }) {
58
61
  const host = typeof translate === 'function' ? translate : (text) => text
59
62
 
60
63
  const i18n = () => {
@@ -79,7 +82,13 @@ export function createManifestTranslate({ getManifest, getLanguage, translate })
79
82
  }
80
83
  }
81
84
  const answer = host(text, vars)
82
- const shown = typeof answer === 'string' && answer !== '' ? answer : fill(text, vars)
85
+ let shown = typeof answer === 'string' && answer !== '' ? answer : fill(text, vars)
86
+ if (shown === fill(text, vars) && typeof library === 'function') {
87
+ const own = library(text, vars)
88
+ if (typeof own === 'string' && own !== '') {
89
+ shown = own
90
+ }
91
+ }
83
92
  return { text: shown, fellBack: !!block && !inSource && shown === fill(text, vars) }
84
93
  }
85
94
 
@@ -123,9 +123,9 @@ export function resolveQueryFilters(query, ctx) {
123
123
  }
124
124
  const out = {}
125
125
  for (const [k, v] of Object.entries(query)) {
126
- // `contentSearch` is the index page's own "search inside files" switch,
127
- // not a filter on the records.
128
- if (k.startsWith('_') || k === 'contentSearch') {
126
+ // `contentSearch` is the index page's own "search inside files" switch
127
+ // and `savedView` names the applied saved view: neither filters the records.
128
+ if (k.startsWith('_') || k === 'contentSearch' || k === 'savedView') {
129
129
  continue
130
130
  }
131
131
  if (v === undefined || v === null || v === '') {