@conduction/nextcloud-vue 2.111.0 → 2.113.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 (153) hide show
  1. package/dist/esm/components/CnActionButtons/CnActionButtons.vue.js +1 -1
  2. package/dist/esm/components/CnActionButtons/CnActionButtons.vue2.js +4 -6
  3. package/dist/esm/components/CnActionButtons/CnActionButtons.vue2.js.map +1 -1
  4. package/dist/esm/components/CnActionButtons/CnActionButtons.vue3.js.map +1 -1
  5. package/dist/esm/components/CnActionDialog/CnActionDialog.vue.js +1 -1
  6. package/dist/esm/components/CnActionDialog/CnActionDialog.vue2.js +3 -2
  7. package/dist/esm/components/CnActionDialog/CnActionDialog.vue2.js.map +1 -1
  8. package/dist/esm/components/CnActionDialog/CnActionDialog.vue3.js +4 -2
  9. package/dist/esm/components/CnActionDialog/CnActionDialog.vue3.js.map +1 -1
  10. package/dist/esm/components/CnAssignDialog/CnAssignDialog.vue.js +1 -1
  11. package/dist/esm/components/CnAssignDialog/CnAssignDialog.vue2.js +3 -2
  12. package/dist/esm/components/CnAssignDialog/CnAssignDialog.vue2.js.map +1 -1
  13. package/dist/esm/components/CnAssignDialog/CnAssignDialog.vue3.js +2 -1
  14. package/dist/esm/components/CnAssignDialog/CnAssignDialog.vue3.js.map +1 -1
  15. package/dist/esm/components/CnBoardView/CnBoardView.vue.js +1 -1
  16. package/dist/esm/components/CnBoardView/CnBoardView.vue2.js +54 -5
  17. package/dist/esm/components/CnBoardView/CnBoardView.vue2.js.map +1 -1
  18. package/dist/esm/components/CnBoardView/CnBoardView.vue3.js +16 -2
  19. package/dist/esm/components/CnBoardView/CnBoardView.vue3.js.map +1 -1
  20. package/dist/esm/components/CnCardGrid/CnCardGrid.vue.js +1 -1
  21. package/dist/esm/components/CnCardGrid/CnCardGrid.vue2.js +10 -0
  22. package/dist/esm/components/CnCardGrid/CnCardGrid.vue2.js.map +1 -1
  23. package/dist/esm/components/CnCardGrid/CnCardGrid.vue3.js +2 -1
  24. package/dist/esm/components/CnCardGrid/CnCardGrid.vue3.js.map +1 -1
  25. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue.js +1 -1
  26. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +22 -2
  27. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
  28. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js +17 -3
  29. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
  30. package/dist/esm/components/CnChartWidget/CnChartWidget.vue.js +1 -1
  31. package/dist/esm/components/CnChartWidget/CnChartWidget.vue2.js.map +1 -1
  32. package/dist/esm/components/CnChartWidget/CnChartWidget.vue3.js.map +1 -1
  33. package/dist/esm/components/CnChoiceCards/CnChoiceCards.vue.js +1 -1
  34. package/dist/esm/components/CnChoiceCards/CnChoiceCards.vue2.js.map +1 -1
  35. package/dist/esm/components/CnChoiceCards/CnChoiceCards.vue3.js.map +1 -1
  36. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue.js +1 -1
  37. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +18 -3
  38. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
  39. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +2 -2
  40. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
  41. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +52 -13
  42. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  43. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +31 -3
  44. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  45. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue.js +1 -1
  46. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js +48 -11
  47. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -1
  48. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js +160 -97
  49. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js.map +1 -1
  50. package/dist/esm/components/CnFormDialog/CnFormDialog.vue.js +1 -1
  51. package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js.map +1 -1
  52. package/dist/esm/components/CnFormDialog/CnFormDialog.vue3.js +2 -2
  53. package/dist/esm/components/CnFormDialog/CnFormDialog.vue3.js.map +1 -1
  54. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +222 -15
  55. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  56. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +24 -7
  57. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  58. package/dist/esm/components/CnNcDashboardList/CnNcDashboardList.vue.js +1 -1
  59. package/dist/esm/components/CnNcDashboardList/CnNcDashboardList.vue2.js +21 -1
  60. package/dist/esm/components/CnNcDashboardList/CnNcDashboardList.vue2.js.map +1 -1
  61. package/dist/esm/components/CnNcDashboardList/CnNcDashboardList.vue3.js.map +1 -1
  62. package/dist/esm/components/CnObjectCard/CnObjectCard.vue.js +1 -1
  63. package/dist/esm/components/CnObjectCard/CnObjectCard.vue2.js +36 -2
  64. package/dist/esm/components/CnObjectCard/CnObjectCard.vue2.js.map +1 -1
  65. package/dist/esm/components/CnObjectCard/CnObjectCard.vue3.js +44 -5
  66. package/dist/esm/components/CnObjectCard/CnObjectCard.vue3.js.map +1 -1
  67. package/dist/esm/components/CnPartyPicker/CnPartyPicker.vue.js +1 -0
  68. package/dist/esm/components/CnPartyPicker/CnPartyPicker.vue.js.map +1 -1
  69. package/dist/esm/components/CnPartyPicker/CnPartyPicker.vue2.js +22 -2
  70. package/dist/esm/components/CnPartyPicker/CnPartyPicker.vue2.js.map +1 -1
  71. package/dist/esm/components/CnPartyPicker/CnPartyPicker.vue3.js +36 -16
  72. package/dist/esm/components/CnPartyPicker/CnPartyPicker.vue3.js.map +1 -1
  73. package/dist/esm/components/CnReportsPage/CnReportsPage.vue.js +1 -1
  74. package/dist/esm/components/CnReportsPage/CnReportsPage.vue2.js +29 -12
  75. package/dist/esm/components/CnReportsPage/CnReportsPage.vue2.js.map +1 -1
  76. package/dist/esm/components/CnReportsPage/CnReportsPage.vue3.js +3 -1
  77. package/dist/esm/components/CnReportsPage/CnReportsPage.vue3.js.map +1 -1
  78. package/dist/esm/components/CnSearchSelect/CnSearchSelect.vue.js +1 -1
  79. package/dist/esm/components/CnSearchSelect/CnSearchSelect.vue2.js.map +1 -1
  80. package/dist/esm/components/CnSearchSelect/CnSearchSelect.vue3.js.map +1 -1
  81. package/dist/esm/composables/useRefLabels.js +26 -6
  82. package/dist/esm/composables/useRefLabels.js.map +1 -1
  83. package/dist/esm/integrations/registry.js +4 -0
  84. package/dist/esm/integrations/registry.js.map +1 -1
  85. package/dist/esm/l10n/en.json.js +3 -1
  86. package/dist/esm/l10n/en.json.js.map +1 -1
  87. package/dist/esm/l10n/nl.json.js +3 -1
  88. package/dist/esm/l10n/nl.json.js.map +1 -1
  89. package/dist/esm/library-style.js +1 -1
  90. package/dist/esm/nextcloud-vue.css +680 -449
  91. package/dist/esm/store/plugins/liveUpdates.js +3 -1
  92. package/dist/esm/store/plugins/liveUpdates.js.map +1 -1
  93. package/dist/esm/store/plugins/logs.js +2 -1
  94. package/dist/esm/store/plugins/logs.js.map +1 -1
  95. package/dist/esm/utils/actionLink.js +104 -1
  96. package/dist/esm/utils/actionLink.js.map +1 -1
  97. package/dist/esm/utils/detailActionModel.js +28 -1
  98. package/dist/esm/utils/detailActionModel.js.map +1 -1
  99. package/dist/esm/utils/fillTemplate.js +13 -5
  100. package/dist/esm/utils/fillTemplate.js.map +1 -1
  101. package/dist/esm/utils/headerFieldChips.js +21 -2
  102. package/dist/esm/utils/headerFieldChips.js.map +1 -1
  103. package/dist/esm/utils/mapList.js +26 -11
  104. package/dist/esm/utils/mapList.js.map +1 -1
  105. package/dist/esm/utils/savedViewMenu.js +12 -5
  106. package/dist/esm/utils/savedViewMenu.js.map +1 -1
  107. package/dist/esm/utils/validateManifestV2.compiled.js +3 -3
  108. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  109. package/dist/nextcloud-vue.cjs.js +2800 -1933
  110. package/dist/nextcloud-vue.cjs.js.map +2 -2
  111. package/dist/nextcloud-vue.css +680 -449
  112. package/l10n/en.json +3 -1
  113. package/l10n/nl.json +3 -1
  114. package/package.json +1 -1
  115. package/src/components/CnActionButtons/CnActionButtons.vue +4 -6
  116. package/src/components/CnActionDialog/CnActionDialog.vue +32 -9
  117. package/src/components/CnAssignDialog/CnAssignDialog.vue +4 -2
  118. package/src/components/CnBoardView/CnBoardView.vue +58 -5
  119. package/src/components/CnCardGrid/CnCardGrid.md +1 -0
  120. package/src/components/CnCardGrid/CnCardGrid.vue +11 -0
  121. package/src/components/CnCellRenderer/CnCellRenderer.vue +27 -3
  122. package/src/components/CnChartWidget/CnChartWidget.vue +6 -0
  123. package/src/components/CnChoiceCards/CnChoiceCards.vue +0 -3
  124. package/src/components/CnDashboardPage/CnDashboardPage.vue +20 -5
  125. package/src/components/CnDetailPage/CnDetailPage.vue +62 -14
  126. package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +100 -5
  127. package/src/components/CnFormDialog/CnFormDialog.vue +1 -1
  128. package/src/components/CnIndexPage/CnIndexPage.vue +233 -18
  129. package/src/components/CnNcDashboardList/CnNcDashboardList.vue +21 -1
  130. package/src/components/CnObjectCard/CnObjectCard.md +1 -0
  131. package/src/components/CnObjectCard/CnObjectCard.vue +51 -5
  132. package/src/components/CnPartyPicker/CnPartyPicker.vue +62 -16
  133. package/src/components/CnReportsPage/CnReportsPage.vue +31 -12
  134. package/src/components/CnSearchSelect/CnSearchSelect.vue +8 -0
  135. package/src/composables/useRefLabels.js +25 -5
  136. package/src/css/badge.css +15 -13
  137. package/src/css/board.css +0 -1
  138. package/src/css/dialog.css +53 -3
  139. package/src/css/index-page.css +26 -1
  140. package/src/css/look-board-detail.css +36 -15
  141. package/src/css/look-board-index.css +67 -15
  142. package/src/css/look-board.css +32 -18
  143. package/src/integrations/registry.js +4 -0
  144. package/src/schemas/app-manifest-v2.schema.json +61 -13
  145. package/src/store/plugins/liveUpdates.js +3 -1
  146. package/src/store/plugins/logs.js +2 -1
  147. package/src/utils/actionLink.js +103 -0
  148. package/src/utils/detailActionModel.js +27 -0
  149. package/src/utils/fillTemplate.js +13 -5
  150. package/src/utils/headerFieldChips.js +21 -2
  151. package/src/utils/mapList.js +26 -11
  152. package/src/utils/savedViewMenu.js +12 -5
  153. package/src/utils/validateManifestV2.compiled.js +3 -3
@@ -20,6 +20,12 @@
20
20
  /* Card h2 and side heading. */
21
21
  --cn-board-heading-size: 17px;
22
22
  --cn-board-side-heading-size: 15px;
23
+ /* The boards set text at the font's normal line height (1.2 for Fira
24
+ Sans), Nextcloud at 1.5: a card body's first line carries this much
25
+ half-leading above its glyphs that a board does not draw. A gap the
26
+ boards measure from a title to the text under it is the board's value
27
+ minus this. Resolved in the element that uses it. */
28
+ --cn-board-first-line-leading: 0.15em;
23
29
  }
24
30
 
25
31
  /* ---- The header: two rows on the ground ------------------------------- */
@@ -212,24 +218,27 @@
212
218
  widget's 4px pad is room for the 32px circles, which the bars variant does
213
219
  not draw), the label 8px under its bar and the date 8px under the label at
214
220
  the normal line height, open steps muted and the done and current ones in
215
- the main text. Each hands its ink to --nldesign-color-on-surface, which a
216
- theme that forces the body ink onto every span (thematiq) reads instead. */
221
+ the main text. Each sets its ink as `color`, and also hands it to
222
+ --nldesign-color-on-surface for a theme that still forces the body ink. */
217
223
  .cn-look-board .cn-stages-widget:has(> .cn-stages-widget__bars):not(.cn-look-nextcloud *) {
218
224
  padding: 0;
219
225
  }
220
226
 
221
227
  .cn-look-board .cn-stages-widget__bars .cn-stages-widget__bar-label:not(.cn-look-nextcloud *) {
222
228
  --nldesign-color-on-surface: var(--color-text-maxcontrast);
229
+ color: var(--color-text-maxcontrast);
223
230
  line-height: normal;
224
231
  }
225
232
 
226
233
  .cn-look-board .cn-stages-widget__bars .cn-stages-widget__bar-step--done .cn-stages-widget__bar-label:not(.cn-look-nextcloud *),
227
234
  .cn-look-board .cn-stages-widget__bars .cn-stages-widget__bar-step--current .cn-stages-widget__bar-label:not(.cn-look-nextcloud *) {
228
235
  --nldesign-color-on-surface: var(--color-main-text);
236
+ color: var(--color-main-text);
229
237
  }
230
238
 
231
239
  .cn-look-board .cn-stages-widget__bars .cn-stages-widget__bar-date:not(.cn-look-nextcloud *) {
232
240
  --nldesign-color-on-surface: var(--color-text-maxcontrast);
241
+ color: var(--color-text-maxcontrast);
233
242
  line-height: normal;
234
243
  }
235
244
 
@@ -367,13 +376,15 @@
367
376
  The nldesign theme sets every button's weight and radius with `!important`
368
377
  through its button tokens, which drew every tab bold with four rounded
369
378
  corners; the tab hands the board's values to those tokens. A tab is 37px
370
- with or without a count (DqZaak), not 34px without one.
379
+ with or without a count (DqZaak), not 34px without one. Its outline is
380
+ the widget card's border, so tab and card meet in one line.
381
+ @spec openspec/changes/board-tabs-widget-border/specs/board-tabs-widget-border/spec.md#requirement-board-folder-tabs-draw-the-widget-card-border
371
382
  @spec openspec/changes/board-tabs-theme/specs/board-tabs-theme/spec.md#requirement-board-folder-tabs-keep-the-boards-weight-shape-and-height-under-a-theme */
372
383
  .cn-look-board .cn-tabs--board .cn-tabs__nav-item {
373
384
  --nldesign-component-button-font-weight: 400;
374
385
  --nldesign-component-button-border-radius: 8px 8px 0 0;
375
386
  background-color: var(--color-background-dark);
376
- border: 1px solid var(--color-border-dark);
387
+ border: 1px solid var(--color-border);
377
388
  border-bottom: none;
378
389
  border-radius: 8px 8px 0 0;
379
390
  font-size: 14px;
@@ -388,7 +399,7 @@
388
399
  --nldesign-component-button-font-weight: 700;
389
400
  background-color: var(--color-main-background);
390
401
  border-bottom: 1px solid var(--color-main-background);
391
- border-top: 1px solid var(--color-border-dark);
402
+ border-top: 1px solid var(--color-border);
392
403
  font-weight: 700;
393
404
  min-height: 38px;
394
405
  padding-bottom: 9px;
@@ -499,15 +510,17 @@
499
510
  .cn-look-board .cn-detail-card .cn-detail-card__title {
500
511
  font-size: var(--cn-board-heading-size);
501
512
  font-weight: 700;
502
- line-height: 1.3;
513
+ line-height: normal;
503
514
  }
504
515
 
516
+ /* 12px from the title's glyphs to the first line's glyphs, as drawn.
517
+ @spec openspec/changes/board-card-title-gap/specs/board-card-title-gap/spec.md#requirement-a-board-cards-body-starts-the-boards-gap-below-its-title */
505
518
  .cn-look-board .cn-detail-page .cn-widget-wrapper__content {
506
- padding: 12px 22px 20px;
519
+ padding: calc(12px - var(--cn-board-first-line-leading)) 22px 20px;
507
520
  }
508
521
 
509
522
  .cn-look-board .cn-detail-card .cn-detail-card__content {
510
- padding: 12px 22px 20px;
523
+ padding: calc(12px - var(--cn-board-first-line-leading)) 22px 20px;
511
524
  }
512
525
 
513
526
  /* A header-less card keeps the full 20px 22px. */
@@ -515,13 +528,18 @@
515
528
  padding: var(--cn-board-card-padding);
516
529
  }
517
530
 
518
- /* The data card: 200px columns, a 12px 24px gap, label over value, hairline. */
519
- .cn-look-board .cn-object-data-widget__grid {
531
+ /* The data card: 200px columns, a 12px 24px gap, label over value, hairline.
532
+ Each selector holds one class more than the component's scoped rule
533
+ (`.cn-object-data-widget__cell[data-v-...]`), which loads after this sheet:
534
+ at equal specificity the cell kept its 8px top padding and the grid its 8px
535
+ gap, so the first label sat 8px further below the card's title.
536
+ @spec openspec/changes/board-card-title-gap/specs/board-card-title-gap/spec.md#requirement-the-data-cards-grid-keeps-the-boards-gap-and-cell-padding */
537
+ .cn-look-board .cn-object-data-widget__grid-wrap .cn-object-data-widget__grid {
520
538
  font-size: 15px;
521
539
  gap: 12px 24px;
522
540
  }
523
541
 
524
- .cn-look-board .cn-object-data-widget__cell {
542
+ .cn-look-board .cn-object-data-widget__grid .cn-object-data-widget__cell {
525
543
  border-bottom: 1px solid var(--cn-board-hairline);
526
544
  gap: 2px;
527
545
  padding: 0 0 10px;
@@ -569,7 +587,7 @@
569
587
  }
570
588
 
571
589
  .cn-look-board .cn-detail-page__side .cn-widget-wrapper__content {
572
- padding: 10px 22px 20px;
590
+ padding: calc(10px - var(--cn-board-first-line-leading)) 22px 20px;
573
591
  }
574
592
 
575
593
  /* A stat tile in a side card (DqZaak "Termijn") sits on the card's inset as
@@ -686,21 +704,24 @@
686
704
  font-size: 13px;
687
705
  }
688
706
 
689
- /* Done and open steps are muted, the current one in the main text. Each hands
690
- its ink to --nldesign-color-on-surface, which a theme that forces the body
691
- ink onto every li and span (thematiq) reads instead. */
707
+ /* Done and open steps are muted, the current one in the main text. Each sets
708
+ its ink as `color`, and also hands it to --nldesign-color-on-surface for a
709
+ theme that still forces the body ink. */
692
710
  .cn-look-board .cn-next-step-card--board .cn-next-step-card__item,
693
711
  .cn-look-board .cn-next-step-card--board .cn-next-step-card__hint,
694
712
  .cn-look-board .cn-next-step-card--board .cn-next-step-card__after {
695
713
  --nldesign-color-on-surface: var(--color-text-maxcontrast);
714
+ color: var(--color-text-maxcontrast);
696
715
  }
697
716
 
698
717
  .cn-look-board .cn-next-step-card--board .cn-next-step-card__item--current {
699
718
  --nldesign-color-on-surface: var(--color-main-text);
719
+ color: var(--color-main-text);
700
720
  }
701
721
 
702
722
  .cn-look-board .cn-next-step-card--board .cn-next-step-card__item--current .cn-next-step-card__hint {
703
723
  --nldesign-color-on-surface: var(--color-text-maxcontrast);
724
+ color: var(--color-text-maxcontrast);
704
725
  }
705
726
 
706
727
  /* ---- History: the activity tab ------------------------------------------ */
@@ -205,15 +205,11 @@
205
205
  outline-offset: 2px;
206
206
  }
207
207
 
208
- /* The selected chip is light on dark, so it hands its ink to
209
- --nldesign-color-on-surface: thematiq forces the body ink onto every span
210
- with `!important` and reads it from that property, which left the label
211
- dark on dark. */
208
+ /* The selected chip is light on dark. */
212
209
  .cn-look-board .cn-saved-views__chips .cn-saved-views__chip--selected,
213
210
  .cn-look-board .cn-saved-views__chips .cn-saved-views__chip--selected:hover,
214
211
  .cn-look-board .cn-quick-filter-bar .cn-quick-filter-bar__tab--active,
215
212
  .cn-look-board .cn-quick-filter-bar .cn-quick-filter-bar__tab--active:hover {
216
- --nldesign-color-on-surface: var(--color-main-background);
217
213
  border-color: transparent;
218
214
  background: var(--color-main-text);
219
215
  color: var(--color-main-background);
@@ -226,7 +222,6 @@
226
222
  padding: 1px 7px;
227
223
  border: 0;
228
224
  border-radius: 10px;
229
- --nldesign-color-on-surface: var(--cn-board-text-soft);
230
225
  background: var(--color-border);
231
226
  color: var(--cn-board-text-soft);
232
227
  font-size: 12px;
@@ -240,14 +235,15 @@
240
235
  /* On the selected chip the count is the soft ink as a lighter bubble on the
241
236
  dark chip (DqZaken: #3d4047 on #1b1c1d). */
242
237
  .cn-look-board .cn-quick-filter-bar .cn-quick-filter-bar__tab--active .cn-quick-filter-bar__count {
243
- --nldesign-color-on-surface: var(--color-primary-element-text);
244
238
  background: var(--cn-board-text-soft);
245
239
  color: var(--color-primary-element-text);
246
240
  }
247
241
 
248
242
  /* Save view: a ghost button, 34px, radius 17, no border, on the light primary
249
- tint, a 14px icon 6px before the label, on one line. */
243
+ tint, a 14px icon 6px before the label, on one line. The label is a span,
244
+ so its ink also goes to --nldesign-color-on-surface. */
250
245
  .cn-look-board .cn-saved-views__save .button-vue {
246
+ --nldesign-color-on-surface: var(--color-primary-element-light-text);
251
247
  min-height: 34px;
252
248
  height: 34px;
253
249
  padding: 0 12px;
@@ -288,6 +284,7 @@
288
284
  @spec openspec/changes/board-toolbar-buttons-theme/specs/board-toolbar-buttons-theme/spec.md#requirement-board-toolbar-buttons-are-neutral-under-a-theme */
289
285
  .cn-look-board .cn-actions-bar:not(.cn-look-nextcloud *) {
290
286
  --nldesign-component-button-font-weight: 600;
287
+ --nldesign-component-button-color: var(--color-main-text);
291
288
  --nldesign-component-button-secondary-action-color: var(--color-main-text);
292
289
  --nldesign-component-button-secondary-action-background-color: var(--color-main-background);
293
290
  --nldesign-component-button-secondary-action-border-color: var(--cn-board-control-border);
@@ -317,8 +314,6 @@
317
314
  margin-inline-start: 6px;
318
315
  padding: 0 6px;
319
316
  border-radius: 10px;
320
- /* A theme that forces the body ink onto every span reads it from here. */
321
- --nldesign-color-on-surface: var(--color-primary-element-text);
322
317
  background: var(--color-primary-element);
323
318
  color: var(--color-primary-element-text);
324
319
  font-size: 12px;
@@ -437,7 +432,10 @@
437
432
  font-size: 14px;
438
433
  }
439
434
 
435
+ /* An active filter: the light primary tint, its label (a span) in the tint's
436
+ ink through --nldesign-color-on-surface too. */
440
437
  .cn-look-board .cn-actions-bar--board .cn-actions-bar__filter-chip {
438
+ --nldesign-color-on-surface: var(--color-primary-element-light-text);
441
439
  display: inline-flex;
442
440
  align-items: center;
443
441
  gap: 6px;
@@ -545,15 +543,13 @@
545
543
  }
546
544
 
547
545
  /* The header row is near-white on the boards (#fafbfc), not the hover grey,
548
- its labels 14px muted. The ink also goes to --nldesign-color-on-surface,
549
- which a theme that forces the body ink onto every span (thematiq) reads.
546
+ its labels 14px muted.
550
547
  The nldesign theme paints every `th` with `!important` through its table
551
548
  header tokens, and the sort button in it through its button weight token
552
549
  (bold), so the cell hands the board's ground, ink and weight to those
553
550
  tokens too.
554
551
  @spec openspec/changes/board-table-head-theme/specs/board-table-head-theme/spec.md#requirement-a-board-table-header-keeps-the-boards-ground-ink-and-weight-under-a-theme */
555
552
  .cn-look-board .cn-table-container--board .cn-data-table th {
556
- --nldesign-color-on-surface: var(--color-text-maxcontrast);
557
553
  --nldesign-component-table-header-background-color: var(--cn-board-table-head-bg, color-mix(in srgb, var(--color-background-hover) 40%, var(--color-main-background)));
558
554
  --nldesign-component-table-header-color: var(--color-text-maxcontrast);
559
555
  --nldesign-component-table-header-font-weight: 600;
@@ -581,9 +577,13 @@
581
577
  line-height: normal;
582
578
  }
583
579
 
580
+ /* The sort button is the bare label, square (the boards draw no box round
581
+ it); the funnel after it is a 22px button with a 4px radius. Both outrank
582
+ the 8px element radius the table and Nextcloud's `button` rule give them. */
584
583
  .cn-look-board .cn-table-container--board .cn-data-table th .cn-table-header__sort {
585
584
  min-height: 0;
586
585
  height: auto;
586
+ border-radius: 0;
587
587
  line-height: inherit;
588
588
  }
589
589
 
@@ -639,6 +639,7 @@
639
639
  min-width: 22px;
640
640
  height: 22px;
641
641
  min-height: 22px;
642
+ border-radius: 4px;
642
643
  margin-inline-start: 4px;
643
644
  }
644
645
 
@@ -682,7 +683,6 @@
682
683
  }
683
684
 
684
685
  .cn-look-board .cn-table-container--board .cn-data-table td.cn-table-col--title .cn-table-cell__secondary {
685
- --nldesign-color-on-surface: var(--color-text-maxcontrast);
686
686
  color: var(--color-text-maxcontrast);
687
687
  font-size: 14px;
688
688
  font-weight: 400;
@@ -727,7 +727,6 @@
727
727
  /* The initials sit on the light primary tint in the primary ink, the board's
728
728
  person chip (DqZaken's Behandelaar, and most boards' people). */
729
729
  .cn-look-board .cn-table-container--board .cn-data-table .cn-cell-renderer__avatar-initials {
730
- --nldesign-color-on-surface: var(--color-primary-element-light-text);
731
730
  background: var(--color-primary-element-light);
732
731
  color: var(--color-primary-element-light-text);
733
732
  font-size: 12px;
@@ -847,6 +846,8 @@
847
846
  margin-inline-start: auto;
848
847
  }
849
848
 
849
+ /* A page link is a <button>: Nextcloud's `button` rule sets it bold, the
850
+ boards set the links at the regular weight and only the current page at 600. */
850
851
  .cn-look-board .cn-pagination--board .cn-pagination__board-link {
851
852
  box-sizing: border-box;
852
853
  min-width: 34px;
@@ -859,6 +860,7 @@
859
860
  background: var(--color-main-background);
860
861
  color: var(--color-main-text);
861
862
  font-size: 14px;
863
+ font-weight: 400;
862
864
  cursor: pointer;
863
865
  }
864
866
 
@@ -1279,3 +1281,53 @@
1279
1281
  font-size: 20px;
1280
1282
  font-weight: 700;
1281
1283
  }
1284
+
1285
+ /* ---- Side panel cards --------------------------------------------------- */
1286
+ /* A card beside the list is the board's side card (DqTeamwachtrij "Team
1287
+ vandaag", "Werkvoorraad per zaaktype"): no rule under the header, the
1288
+ title a 15px muted label on the card's 20px 22px inset, 12px above the
1289
+ body, 20px between cards. The wrapper drew the Nextcloud panel: a 14px
1290
+ dark title on a 12px 16px header over a rule, 16px between cards. The
1291
+ tone carries `!important` against a theme that colours every h3.
1292
+ @spec openspec/changes/board-index-side-panel-cards/specs/board-index-side-panel-cards/spec.md#requirement-a-board-index-side-panel-card-is-the-boards-side-card */
1293
+ .cn-look-board .cn-index-page-widgets--side-panel:not(.cn-look-nextcloud *) {
1294
+ gap: var(--cn-board-section-gap, 20px);
1295
+ }
1296
+
1297
+ .cn-look-board .cn-index-page-widgets--side-panel:not(.cn-look-nextcloud *) .cn-widget-wrapper__header {
1298
+ border-bottom: none;
1299
+ padding: 20px 22px 0;
1300
+ }
1301
+
1302
+ .cn-look-board .cn-index-page-widgets--side-panel:not(.cn-look-nextcloud *) .cn-widget-wrapper__title {
1303
+ color: var(--color-text-maxcontrast) !important;
1304
+ font-size: var(--cn-board-side-heading-size, 15px);
1305
+ font-weight: 600;
1306
+ line-height: normal;
1307
+ }
1308
+
1309
+ .cn-look-board .cn-index-page-widgets--side-panel:not(.cn-look-nextcloud *) .cn-widget-wrapper__content {
1310
+ padding: calc(12px - var(--cn-board-first-line-leading, 0.15em)) 22px 20px;
1311
+ }
1312
+
1313
+ .cn-look-board .cn-index-page-widgets--side-panel:not(.cn-look-nextcloud *) .cn-index-page-widgets__note {
1314
+ font-size: 13px;
1315
+ }
1316
+
1317
+ /* A record list drawn as a table (DqTeamwachtrij "Werkvoorraad per
1318
+ zaaktype") is the board's compact grid: a 13px muted header at regular
1319
+ weight, rows 8px apart, no rules between them. Line heights differ from
1320
+ the board's normal ones, so the cell padding sets the board's row pitch.
1321
+ One class more than the component's scoped rules, which load later.
1322
+ @spec openspec/changes/board-index-side-panel-cards/specs/board-index-side-panel-cards/spec.md#requirement-a-board-record-list-table-is-the-boards-compact-grid */
1323
+ .cn-look-board .cn-record-list--table .cn-record-list__table th {
1324
+ border-bottom: none;
1325
+ font-size: 13px;
1326
+ font-weight: 400;
1327
+ padding-block: 0 2px;
1328
+ }
1329
+
1330
+ .cn-look-board .cn-record-list--table .cn-record-list__table td {
1331
+ border-bottom: none;
1332
+ padding-block: 2px;
1333
+ }
@@ -219,6 +219,16 @@
219
219
  height: 16px;
220
220
  }
221
221
 
222
+ /* ---- A single select -------------------------------------------------- */
223
+ /* NcSelect draws a single select as its search field with the clear and
224
+ open buttons laid over its end. A legacy vue-select rule that Nextcloud
225
+ still loads caps the field at the width less one clickable area, which
226
+ left those buttons outside the field's border (DqNieuweZaak "Zaaktype",
227
+ "Intakekanaal"). */
228
+ .cn-look-board .nc-select.v-select.select.vs--single .vs__selected-options {
229
+ max-width: none;
230
+ }
231
+
222
232
  /* ---- The header button ------------------------------------------------- */
223
233
  .cn-look-board .cn-index-page__header-buttons:not(.cn-look-nextcloud *),
224
234
  .cn-look-board .cn-detail-page__header-actions:not(.cn-look-nextcloud *),
@@ -343,11 +353,8 @@
343
353
  end of a tab strip) is the board's neutral control: the main background, a
344
354
  grey border, the main text at 600 (DqZaak), not Nextcloud's primary tint.
345
355
  NcActions marks a secondary menu `action-item--secondary` on its root and
346
- keeps a class given to it off, so the rule reads that marker. The label
347
- hands its ink to --nldesign-color-on-surface for a theme that forces the
348
- body ink onto every span (thematiq). */
356
+ keeps a class given to it off, so the rule reads that marker. */
349
357
  .cn-look-board .action-item.action-item--secondary .action-item__menutoggle.button-vue--secondary:not(.cn-look-nextcloud *) {
350
- --nldesign-color-on-surface: var(--color-main-text);
351
358
  border: 1px solid var(--cn-board-control-border);
352
359
  border-radius: var(--cn-board-control-radius);
353
360
  background: var(--color-main-background);
@@ -1154,14 +1161,6 @@
1154
1161
  color: var(--cn-status-badge-ink);
1155
1162
  }
1156
1163
 
1157
- /* A pill paints its own pairing of ink and fill. A theme that forces the body
1158
- ink onto every span (thematiq's text rule, `!important` at id level) reads
1159
- that ink from --nldesign-color-on-surface when the surface sets it, so the
1160
- pill hands it its own ink: "In behandeling" stays purple on purple. */
1161
- .cn-look-board .cn-status-badge:not(.cn-look-nextcloud *) {
1162
- --nldesign-color-on-surface: var(--cn-status-badge-ink);
1163
- }
1164
-
1165
1164
  /* ---- Info notes (NcNoteCard type="info") -------------------------------- */
1166
1165
  /* The board's info note is a light-blue rounded box: no edge bar, 12px 14px
1167
1166
  of padding, radius 8, an 18px icon 10px before the text, 14px text in the
@@ -1213,9 +1212,7 @@
1213
1212
  hairline under each pair (DqZaak "Zaakgegevens"), the horizontal layout as
1214
1213
  two columns of 14px text, the label column as wide as its longest label
1215
1214
  (the side cards). Both at the board's line height, 1.2, not Nextcloud's 1.5:
1216
- a pair is 47px tall on the board. The muted label also hands its ink to
1217
- --nldesign-color-on-surface, which a theme that forces the body ink onto
1218
- every div (thematiq) reads. */
1215
+ a pair is 47px tall on the board. */
1219
1216
  .cn-look-board .cn-detail-grid.cn-detail-grid--grid:not(.cn-look-nextcloud *) {
1220
1217
  gap: 12px 24px;
1221
1218
  font-size: 15px;
@@ -1246,7 +1243,6 @@
1246
1243
  }
1247
1244
 
1248
1245
  .cn-look-board .cn-detail-grid .cn-detail-grid__label:not(.cn-look-nextcloud *) {
1249
- --nldesign-color-on-surface: var(--color-text-maxcontrast);
1250
1246
  min-width: 0;
1251
1247
  color: var(--color-text-maxcontrast);
1252
1248
  font-size: 13px;
@@ -1278,7 +1274,7 @@
1278
1274
  .cn-look-board .cn-dashboard-page:not(.cn-look-nextcloud *) .cn-widget-wrapper:not(.cn-widget-wrapper--nc-dashboard) .cn-widget-wrapper__title {
1279
1275
  font-size: var(--cn-board-heading-size, 17px);
1280
1276
  font-weight: 700;
1281
- line-height: 1.3;
1277
+ line-height: normal;
1282
1278
  }
1283
1279
 
1284
1280
  /* The board draws no rule under a dashboard card's title (DqMijnWerk,
@@ -1292,7 +1288,7 @@
1292
1288
  }
1293
1289
 
1294
1290
  .cn-look-board .cn-dashboard-page:not(.cn-look-nextcloud *) .cn-widget-wrapper:not(.cn-widget-wrapper--nc-dashboard):not(.cn-widget-wrapper--borderless) .cn-widget-wrapper__header {
1295
- padding: 20px var(--cn-board-dashboard-card-inset) 12px;
1291
+ padding: 20px var(--cn-board-dashboard-card-inset) calc(12px - var(--cn-board-first-line-leading, 0.15em));
1296
1292
  }
1297
1293
 
1298
1294
  /* ---- Record list on a dashboard card (PtDashboard) ---------------------- */
@@ -1487,3 +1483,21 @@
1487
1483
  .cn-look-board .cn-dashboard-page:not(.cn-look-nextcloud *) .cn-stats-block-widget--tiles-box {
1488
1484
  padding: 14px 22px 20px;
1489
1485
  }
1486
+
1487
+ /* ---- Matrix chart (DqProcesanalyse "Dagen per fase") -------------------- */
1488
+ /* The board sets the matrix at 14px and the font's normal line height: the
1489
+ column heads and the cell figures at 600, a cell 37px with its 10px
1490
+ padding. Nextcloud's 15px at 1.5 made each row 42.5px.
1491
+ @spec openspec/changes/board-matrix-cells/specs/board-matrix-cells/spec.md#requirement-a-board-matrix-takes-the-boards-type */
1492
+ .cn-look-board .cn-chart-widget__matrix:not(.cn-look-nextcloud *) {
1493
+ font-size: 14px;
1494
+ line-height: normal;
1495
+ }
1496
+
1497
+ .cn-look-board .cn-chart-widget__matrix:not(.cn-look-nextcloud *) .cn-chart-widget__matrix-head {
1498
+ font-weight: 600;
1499
+ }
1500
+
1501
+ .cn-look-board .cn-chart-widget__matrix:not(.cn-look-nextcloud *) .cn-chart-widget__matrix-cell:not(.cn-chart-widget__matrix-cell--current) {
1502
+ font-weight: 600;
1503
+ }
@@ -89,6 +89,7 @@ export function createIntegrationRegistry() {
89
89
  * @param {?object} [entry.offlineConfig] Opaque per-integration config bag forwarded verbatim to the integration's components (e.g. the field-inspection leaf's offline schema/filter config). A consuming app overrides it by pre-registering the same id.
90
90
  * @param {'component'|'mount'} [entry.renderMode] Render strategy (openregister#2127 / ADR-066). `'component'` (default) interprets the SFC `tab`/`widget` under the host's own Vue runtime. `'mount'` hands the leaf a bare host-owned DOM element via `mount`/`unmount`, so a leaf built against a different Vue major than the host renders its own framework instance inside that element.
91
91
  * @param {(el: Element, props: object) => void} [entry.mount] Mount hand-off. Required together with `unmount` when `renderMode` is `'mount'`; the host calls it against a bare element with the same context an SFC widget/tab receives (`{ register, schema, objectId, surface, integrationContext, … }`). May also be supplied alongside an SFC pair as a same-major fast path.
92
+ * @param {'card'} [entry.chrome] `'card'` when a mount-mode leaf draws no card of its own: a detail page then hosts it in the library card and hands it `onHeader(header)` to report its count, actions and empty state.
92
93
  * @param {(el: Element) => void} [entry.unmount] Teardown hand-off, called by the host before it removes the element and on surface hide / bound-object change. Travels as a pair with `mount`.
93
94
  *
94
95
  * @return {?object} Normalised entry, or null on collision / malformed mount pair in prod.
@@ -209,6 +210,9 @@ export function createIntegrationRegistry() {
209
210
  // registration, with the tabbed panel silently keeping the sidebar
210
211
  // component.
211
212
  bareWidget: entry.bareWidget === true,
213
+ // `card`: a mount-mode leaf that draws no card of its own, so a
214
+ // detail page hosts it in the library card (CnDetailWidgetHost).
215
+ chrome: entry.chrome === 'card' ? 'card' : null,
212
216
  // Marker set by `registerBuiltinIntegrations` /
213
217
  // `registerLeafIntegrations` so `useIntegrationRegistry` can
214
218
  // distinguish lib-owned registrations (whose components must