@conduction/nextcloud-vue 2.144.0 → 2.146.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 (133) hide show
  1. package/dist/esm/components/CnActionDialog/CnActionDialog.vue.js +1 -1
  2. package/dist/esm/components/CnActionDialog/CnActionDialog.vue2.js.map +1 -1
  3. package/dist/esm/components/CnActionDialog/CnActionDialog.vue3.js +1 -0
  4. package/dist/esm/components/CnActionDialog/CnActionDialog.vue3.js.map +1 -1
  5. package/dist/esm/components/CnAiCompanion/CnAiChatPanel.vue2.js.map +1 -1
  6. package/dist/esm/components/CnAiCompanion/CnAiChatPanel.vue3.js.map +1 -1
  7. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue.js +1 -1
  8. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js +55 -2
  9. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js.map +1 -1
  10. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue3.js.map +1 -1
  11. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue.js +1 -1
  12. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue2.js +16 -0
  13. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue2.js.map +1 -1
  14. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue3.js +3 -1
  15. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue3.js.map +1 -1
  16. package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue.js +1 -1
  17. package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue2.js.map +1 -1
  18. package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue3.js.map +1 -1
  19. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +12 -2
  20. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
  21. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +42 -30
  22. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
  23. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +22 -0
  24. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  25. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +2 -1
  26. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  27. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue.js +1 -1
  28. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue2.js +1 -1
  29. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue2.js.map +1 -1
  30. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue3.js +3 -3
  31. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue3.js.map +1 -1
  32. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js +1 -1
  33. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js +46 -8
  34. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -1
  35. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js +3 -3
  36. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -1
  37. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue.js +1 -1
  38. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js +2 -2
  39. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js.map +1 -1
  40. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js.map +1 -1
  41. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +6 -3
  42. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  43. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  44. package/dist/esm/components/CnMailTab/CnMailTab.vue.js +1 -1
  45. package/dist/esm/components/CnMailTab/CnMailTab.vue2.js.map +1 -1
  46. package/dist/esm/components/CnMailTab/CnMailTab.vue3.js +2 -2
  47. package/dist/esm/components/CnMailTab/CnMailTab.vue3.js.map +1 -1
  48. package/dist/esm/components/CnNotesCard/CnNotesCard.vue.js +1 -1
  49. package/dist/esm/components/CnNotesCard/CnNotesCard.vue2.js.map +1 -1
  50. package/dist/esm/components/CnNotesCard/CnNotesCard.vue3.js +1 -0
  51. package/dist/esm/components/CnNotesCard/CnNotesCard.vue3.js.map +1 -1
  52. package/dist/esm/components/CnNotificationMatrix/CnNotificationMatrix.vue.js +1 -1
  53. package/dist/esm/components/CnNotificationMatrix/CnNotificationMatrix.vue2.js +21 -2
  54. package/dist/esm/components/CnNotificationMatrix/CnNotificationMatrix.vue2.js.map +1 -1
  55. package/dist/esm/components/CnNotificationMatrix/CnNotificationMatrix.vue3.js.map +1 -1
  56. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +1 -1
  57. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +73 -12
  58. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
  59. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js +165 -126
  60. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
  61. package/dist/esm/components/CnRetentionWidget/CnRetentionWidget.vue.js +1 -1
  62. package/dist/esm/components/CnRetentionWidget/CnRetentionWidget.vue2.js.map +1 -1
  63. package/dist/esm/components/CnRetentionWidget/CnRetentionWidget.vue3.js.map +1 -1
  64. package/dist/esm/components/CnSettingsField/CnSettingsField.vue.js +1 -1
  65. package/dist/esm/components/CnSettingsField/CnSettingsField.vue2.js +14 -0
  66. package/dist/esm/components/CnSettingsField/CnSettingsField.vue2.js.map +1 -1
  67. package/dist/esm/components/CnSettingsField/CnSettingsField.vue3.js +2 -1
  68. package/dist/esm/components/CnSettingsField/CnSettingsField.vue3.js.map +1 -1
  69. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue.js +1 -1
  70. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
  71. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
  72. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue.js +1 -1
  73. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js +13 -8
  74. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js.map +1 -1
  75. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue3.js.map +1 -1
  76. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue.js +1 -1
  77. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue2.js +10 -2
  78. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue2.js.map +1 -1
  79. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue3.js.map +1 -1
  80. package/dist/esm/composables/indexSources.js +35 -9
  81. package/dist/esm/composables/indexSources.js.map +1 -1
  82. package/dist/esm/l10n/nl.json.js +2 -0
  83. package/dist/esm/l10n/nl.json.js.map +1 -1
  84. package/dist/esm/library-style.js +1 -1
  85. package/dist/esm/nextcloud-vue.css +1204 -467
  86. package/dist/esm/utils/builtInFormatters.js +18 -1
  87. package/dist/esm/utils/builtInFormatters.js.map +1 -1
  88. package/dist/esm/utils/detailObjectContext.js +7 -2
  89. package/dist/esm/utils/detailObjectContext.js.map +1 -1
  90. package/dist/esm/utils/localHeaderRows.js +95 -0
  91. package/dist/esm/utils/localHeaderRows.js.map +1 -0
  92. package/dist/esm/utils/validateManifestV2.compiled.js +2 -2
  93. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  94. package/dist/esm/utils/visibleWhen.js +6 -0
  95. package/dist/esm/utils/visibleWhen.js.map +1 -1
  96. package/dist/nextcloud-vue.cjs.js +686 -239
  97. package/dist/nextcloud-vue.cjs.js.map +2 -2
  98. package/dist/nextcloud-vue.css +1204 -467
  99. package/l10n/nl.json +2 -0
  100. package/package.json +1 -1
  101. package/src/components/CnActionDialog/CnActionDialog.vue +8 -1
  102. package/src/components/CnAiCompanion/CnAiChatPanel.vue +3 -0
  103. package/src/components/CnAuditTrailCard/CnAuditTrailCard.vue +55 -2
  104. package/src/components/CnAuditTrailWidget/CnAuditTrailWidget.vue +18 -0
  105. package/src/components/CnChecklistRunWidget/CnChecklistRunWidget.vue +4 -2
  106. package/src/components/CnDataTable/CnDataTable.vue +19 -2
  107. package/src/components/CnDetailPage/CnDetailPage.md +1 -0
  108. package/src/components/CnDetailPage/CnDetailPage.vue +23 -0
  109. package/src/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue +3 -1
  110. package/src/components/CnFactsWidget/CnFactsWidget.vue +74 -9
  111. package/src/components/CnFieldListWidget/CnFieldListWidget.vue +2 -2
  112. package/src/components/CnIndexPage/CnIndexPage.vue +6 -3
  113. package/src/components/CnMailTab/CnMailTab.vue +6 -4
  114. package/src/components/CnNotesCard/CnNotesCard.vue +7 -2
  115. package/src/components/CnNotificationMatrix/CnNotificationMatrix.vue +25 -3
  116. package/src/components/CnRecordListWidget/CnRecordListWidget.vue +132 -20
  117. package/src/components/CnRetentionWidget/CnRetentionWidget.vue +2 -0
  118. package/src/components/CnSettingsField/CnSettingsField.vue +15 -0
  119. package/src/components/CnTabsWidget/CnTabsWidget.vue +6 -1
  120. package/src/components/CnWidgetObjectTable/CnWidgetObjectTable.vue +13 -8
  121. package/src/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue +10 -2
  122. package/src/composables/indexSources.js +35 -9
  123. package/src/css/dialog.css +25 -9
  124. package/src/css/look-board-detail.css +370 -30
  125. package/src/css/look-board-index.css +116 -4
  126. package/src/css/look-board.css +168 -8
  127. package/src/css/table.css +17 -1
  128. package/src/schemas/app-manifest-v2.schema.json +2 -2
  129. package/src/utils/builtInFormatters.js +17 -0
  130. package/src/utils/detailObjectContext.js +7 -2
  131. package/src/utils/localHeaderRows.js +91 -0
  132. package/src/utils/validateManifestV2.compiled.js +2 -2
  133. package/src/utils/visibleWhen.js +6 -0
@@ -481,6 +481,26 @@
481
481
  padding: var(--cn-board-card-padding);
482
482
  }
483
483
 
484
+ /* A panel's own heading (DqZaaktypeRegels "Regels op de zaak"): title and
485
+ subtitle on their natural leading 2px apart, actions that wrap 8px under
486
+ them, and the card's 12px gap before the content. */
487
+ .cn-look-board .cn-tabs-widget__tabs .cn-tabs-widget__panel-heading {
488
+ margin-bottom: 12px;
489
+ }
490
+
491
+ .cn-look-board .cn-tabs-widget__tabs .cn-tabs-widget__panel-heading--actions {
492
+ row-gap: 8px;
493
+ }
494
+
495
+ .cn-look-board .cn-tabs-widget__tabs .cn-tabs-widget__panel-heading-text {
496
+ gap: 2px;
497
+ }
498
+
499
+ .cn-look-board .cn-tabs-widget__tabs .cn-tabs-widget__panel-title,
500
+ .cn-look-board .cn-tabs-widget__tabs .cn-tabs-widget__panel-subtitle {
501
+ line-height: normal;
502
+ }
503
+
484
504
  /* A list's footer Add bleeds to the panel's edges, so it bleeds the card
485
505
  padding (CnTabsWidget bleeds the Nextcloud look's 12px). */
486
506
  .cn-look-board .cn-tabs--board.cn-tabs-widget__tabs .cn-tabs__content > .cn-tab > .cn-detail-widget-host--bare .cn-object-list-widget__add {
@@ -627,6 +647,30 @@
627
647
  font-size: 14px;
628
648
  }
629
649
 
650
+ /* The reply box's buttons (Opslaan als concept, Versturen) are the board's
651
+ 40px control, as DqBerichtVersturen draws Versturen; NcButton draws 34
652
+ (DqZaakContact r29 controlHeight 34).
653
+ @spec openspec/changes/board-conversation-reply-buttons-40/specs/board-conversation-reply-buttons-40/spec.md#requirement-the-reply-boxs-buttons-are-the-boards-40px-control */
654
+ .cn-look-board .cn-conversation-thread__reply .button-vue:where(:not(.cn-look-nextcloud *)) {
655
+ --button-size: var(--cn-board-control-height);
656
+ }
657
+
658
+ /* A lead widget in a card (the review summary over the files) stands 16px
659
+ above the card's own body, the boards' gap between a card's parts
660
+ (DqZaakDocumenten r29: the files toolbar sat flush under the summary).
661
+ @spec openspec/changes/board-lead-widget-gap-16/specs/board-lead-widget-gap-16/spec.md#requirement-a-lead-widget-stands-16px-above-the-cards-body */
662
+ .cn-look-board .cn-detail-widget-host__lead:not(.cn-look-nextcloud *) {
663
+ margin-bottom: 16px;
664
+ }
665
+
666
+ /* The compact review summary runs on the normal line height, as the board
667
+ draws its heading and legend (DqZaakDocumenten r29: heading 22.5 vs 18,
668
+ the box 99.5 vs 91 high).
669
+ @spec openspec/changes/board-stacked-bar-compact-line-height/specs/board-stacked-bar-compact-line-height/spec.md#requirement-the-compact-summary-runs-on-the-normal-line-height */
670
+ .cn-look-board .cn-stacked-bar--compact:not(.cn-look-nextcloud *) {
671
+ line-height: normal;
672
+ }
673
+
630
674
  /* The case Status card as the board draws it: no grey box, the status's
631
675
  explanation as its bold line, the time in the status muted under it.
632
676
  @spec openspec/changes/status-explainer-board/specs/record-widgets/spec.md#requirement-the-status-card-says-where-the-record-stands-as-the-board-draws-it */
@@ -707,18 +751,28 @@
707
751
  padding: calc(12px - var(--cn-board-first-line-leading)) var(--cn-board-card-inline-padding) 20px;
708
752
  }
709
753
 
754
+ /* A history card with stacked rows (DqTaak "Historie") opens on the first
755
+ row's hairline 6px under the title, the row's own 12px padding above its
756
+ text, as drawn: 19px from the title to the first action.
757
+ @spec openspec/changes/board-history-card-ruled-start/specs/board-history-card-ruled-start/spec.md#requirement-a-board-history-card-with-stacked-rows-opens-on-its-first-rule */
758
+ .cn-look-board .cn-detail-card .cn-detail-card__content:has(> .cn-audit-card__list > .cn-audit-card__row--stacked:first-child):not(.cn-look-nextcloud *) {
759
+ padding-top: 6px;
760
+ }
761
+
710
762
  /* A data card (labels over values) starts 14px below its title (DqZaak
711
- "Zaakgegevens", DqContact "Contact"). A side card keeps its 10px.
763
+ "Zaakgegevens", DqContact "Contact"); its first label sits at the top of
764
+ its line box, so no leading comes off. A side card keeps its 10px.
712
765
  @spec openspec/changes/board-data-card-gap/specs/board-data-card-gap/spec.md#requirement-a-board-data-cards-body-starts-14px-below-its-title */
713
766
  .cn-look-board .cn-detail-page .cn-widget-wrapper__content:has(> .cn-object-data-widget__grid-wrap):not(.cn-detail-page__side *) {
714
- padding-top: calc(14px - var(--cn-board-first-line-leading));
767
+ padding-top: 14px;
715
768
  }
716
769
 
717
770
  /* Facts that open on the column grid are a data card too (DqContact
718
- "Contact", DqOrganisatie "Organisatie").
771
+ "Contact", DqOrganisatie "Organisatie"). Their labels sit on the normal
772
+ line height in the board look, so no leading is taken off the 14px.
719
773
  @spec openspec/changes/board-card-title-gap-variants/specs/board-card-title-gap-variants/spec.md#requirement-a-board-card-starts-its-body-as-drawn-for-its-kind-of-body */
720
774
  .cn-look-board .cn-detail-page .cn-widget-wrapper__content:has(> .cn-facts-widget > .cn-facts-widget__rows--columns:first-child):not(.cn-detail-page__side *) {
721
- padding-top: calc(14px - var(--cn-board-first-line-leading));
775
+ padding-top: 14px;
722
776
  }
723
777
 
724
778
  /* A table (an object list) starts 12px below the title's box: its head has
@@ -787,6 +841,88 @@
787
841
  font-weight: 500;
788
842
  }
789
843
 
844
+ /* A labelled select in a page card is the board's field, as in a board
845
+ dialog (dialog.css): its label above the control at 14px/600 on the normal
846
+ line (the theme's label weight token set to 600 here), the control 40px,
847
+ 21px of room above it so the raised label does not rise over what stands
848
+ above (DqZaakEmail "E-mailsjabloon": NcSelect drew
849
+ the label inside a 44px field, 15px/700). The quick filter bar's dropdown
850
+ keeps NcSelect's own look.
851
+ @spec openspec/changes/board-page-select-label-above/specs/board-page-select-label-above/spec.md#requirement-a-labelled-select-in-a-board-page-card-carries-its-label-above */
852
+ .cn-look-board .cn-detail-widget-host .v-select:not(.cn-quick-filter-bar__select):has(.input-field__label):not(.cn-look-nextcloud *) {
853
+ --nldesign-component-form-field-label-font-weight: 600;
854
+ margin-block: 21px 0;
855
+ }
856
+
857
+ .cn-look-board .cn-detail-widget-host .v-select:not(.cn-quick-filter-bar__select) .input-field__input + .input-field__label.input-field__label:not(.cn-look-nextcloud *),
858
+ .cn-look-board .cn-detail-widget-host .nc-select.v-select.select:not(.cn-quick-filter-bar__select) .vs__selected-options:has(.vs__selected) .vs__search .input-field__input + .input-field__label.input-field__label:not(.cn-look-nextcloud *) {
859
+ inset-block-start: auto;
860
+ inset-block-end: calc(100% + 4px);
861
+ inset-inline: 0 auto;
862
+ max-width: 100%;
863
+ margin: 0;
864
+ padding: 0;
865
+ background: none;
866
+ color: var(--color-main-text);
867
+ font-size: var(--cn-field-label-size, 14px);
868
+ font-weight: 600;
869
+ line-height: normal;
870
+ pointer-events: auto;
871
+ transition: none;
872
+ }
873
+
874
+ .cn-look-board .cn-detail-widget-host .v-select:not(.cn-quick-filter-bar__select):has(.input-field__label) .input-field__main-wrapper:not(.cn-look-nextcloud *) {
875
+ height: calc(var(--cn-field-height, 40px) + 2 * var(--border-width-input-focused, 2px));
876
+ }
877
+
878
+ /* The mail card's template buttons stand beside the field at its 40px
879
+ height, their bottom on the field's edge (inside its 2px focus inset). */
880
+ .cn-look-board .cn-mail-tab__template-row .button-vue:where(:not(.cn-look-nextcloud *)) {
881
+ --button-size: var(--cn-board-control-height);
882
+ margin-block-end: var(--border-width-input-focused, 2px);
883
+ }
884
+
885
+ /* A data card's label and value sit 3px apart on the normal line height, as
886
+ the boards draw their facts (194 of 212 dt/dd pairs: gap 3px, no line
887
+ height); live ran them at 1.5 with a 2px gap (DqZaakContact
888
+ Ontvangstbevestiging r29: the first label 33.8 under the title, board 29).
889
+ @spec openspec/changes/board-data-cell-rhythm/specs/board-data-cell-rhythm/spec.md#requirement-a-data-cards-label-and-value-sit-3px-apart-on-the-normal-line-height */
890
+ .cn-look-board .cn-object-data-widget__grid .cn-object-data-widget__cell.cn-object-data-widget__cell {
891
+ gap: 3px;
892
+ }
893
+
894
+ .cn-look-board .cn-object-data-widget__grid .cn-object-data-widget__label.cn-object-data-widget__label,
895
+ .cn-look-board .cn-object-data-widget__grid .cn-object-data-widget__value {
896
+ line-height: normal;
897
+ }
898
+
899
+ /* A note in a page card starts at the card's inset: no list-item padding
900
+ around it, its icon 12px before the text (DqZaakEmail Notities r29: icon
901
+ at 31 and text at 71 where the board draws 23 and 67).
902
+ @spec openspec/changes/board-notes-card-rows-flush/specs/board-notes-card-rows-flush/spec.md#requirement-a-note-in-a-page-card-starts-at-the-cards-inset */
903
+ .cn-look-board .cn-detail-widget-host .cn-notes-tab__thread .list-item__wrapper:not(.cn-look-nextcloud *),
904
+ .cn-look-board .cn-detail-widget-host .cn-notes-tab__thread .list-item:not(.cn-look-nextcloud *) {
905
+ padding: 0;
906
+ }
907
+
908
+ .cn-look-board .cn-detail-widget-host .cn-notes-tab__thread .list-item-content:not(.cn-look-nextcloud *) {
909
+ padding-inline-start: 12px;
910
+ }
911
+
912
+ /* The note's two lines on the normal line height and its icon at the top of
913
+ the row, as the board draws the author tile beside the name (probed on
914
+ :8080: the name 44.8 under the title as drawn, the icon 6.5px lower while
915
+ centred in the 45px item).
916
+ @spec openspec/changes/board-notes-card-rows-flush/specs/board-notes-card-rows-flush/spec.md#requirement-a-note-in-a-page-card-starts-at-the-cards-inset */
917
+ .cn-look-board .cn-detail-widget-host .cn-notes-tab__thread .list-item-content__name:not(.cn-look-nextcloud *),
918
+ .cn-look-board .cn-detail-widget-host .cn-notes-tab__thread .list-item-content__subname:not(.cn-look-nextcloud *) {
919
+ line-height: normal;
920
+ }
921
+
922
+ .cn-look-board .cn-detail-widget-host .cn-notes-tab__thread .list-item__anchor > :first-child:not(.list-item-content):not(.cn-look-nextcloud *) {
923
+ align-self: flex-start;
924
+ }
925
+
790
926
  /* Side cards: the heading is a 15px muted label, not a title. The tone
791
927
  carries `!important` against a theme that colours every h3 that way
792
928
  (thematiq's heading colour). */
@@ -806,6 +942,14 @@
806
942
  padding: calc(10px - var(--cn-board-first-line-leading)) 22px 20px;
807
943
  }
808
944
 
945
+ /* A side card that opens on a list draws its first row's hairline 10px below
946
+ the title box; the row has no leading for the glyph gap above to subtract
947
+ (DqZaaktypeRegels, DqZaaktypeStatussen "Versies").
948
+ @spec openspec/changes/board-side-list-gap/specs/board-side-list-gap/spec.md#requirement-a-board-side-cards-list-starts-10px-below-its-title */
949
+ .cn-look-board .cn-detail-page__side .cn-widget-wrapper__content:has(> .cn-record-list--rows) {
950
+ padding-top: 10px;
951
+ }
952
+
809
953
  /* A side card that opens on a lead (DqZaak "Aanvrager", DqOrganisatie "KvK en
810
954
  adres") draws the lead row 12px below the title, its two lines at their
811
955
  normal height so they centre on the 40px tile.
@@ -865,6 +1009,12 @@
865
1009
  padding: 0;
866
1010
  }
867
1011
 
1012
+ /* Its Actions menu is the board's 34px header control. */
1013
+ .cn-look-board .cn-detail-page__side .cn-widget-wrapper:has(.cn-ai-chat-widget) .cn-widget-wrapper__actions .action-item .button-vue {
1014
+ height: 34px;
1015
+ min-height: 34px;
1016
+ }
1017
+
868
1018
  /* A widget-reported card header action in the main column is a neutral 40px
869
1019
  control: the main background, the control border, the main text at
870
1020
  14px/600, a 16px icon 8px before the label (DqZaakBesluiten "Document
@@ -885,6 +1035,13 @@
885
1035
  line-height: 1;
886
1036
  }
887
1037
 
1038
+ /* A list's Add in the title row is the card's 34px control, as the boards
1039
+ draw a card's Add (DqZaaktype "Variant toevoegen"). */
1040
+ .cn-look-board .cn-detail-page__catalog-action--add:not(.cn-detail-page__side *):not(.cn-look-nextcloud *) {
1041
+ height: 34px;
1042
+ min-height: 34px;
1043
+ }
1044
+
888
1045
  .cn-look-board .cn-detail-page__catalog-action:not(.cn-detail-page__side *):not(.cn-look-nextcloud *):hover {
889
1046
  background: var(--color-background-hover);
890
1047
  }
@@ -944,6 +1101,24 @@
944
1101
  width: 18px;
945
1102
  }
946
1103
 
1104
+ /* NcNoteCard renders a slotted icon (the banner's own, DqSociaalDomein
1105
+ "Bijzondere persoonsgegevens") as a bare 22px material icon without the
1106
+ `notecard__icon` wrapper; it takes the same 18px box on the first line, so
1107
+ the text starts 44px in.
1108
+ @spec openspec/changes/board-notice-slotted-icon/specs/board-notice-slotted-icon/spec.md#requirement-a-side-notices-slotted-icon-is-18px */
1109
+ .cn-look-board .cn-detail-page__side-item--notice .cn-banner-widget__card > .material-design-icon:not(.cn-look-nextcloud *) {
1110
+ align-self: flex-start;
1111
+ color: var(--cn-board-notice-ink);
1112
+ margin-top: 2px;
1113
+ width: 18px;
1114
+ height: 18px;
1115
+ }
1116
+
1117
+ .cn-look-board .cn-detail-page__side-item--notice .cn-banner-widget__card > .material-design-icon svg:not(.cn-look-nextcloud *) {
1118
+ height: 18px;
1119
+ width: 18px;
1120
+ }
1121
+
947
1122
  /* A notice whose condition does not hold renders no banner; its slot then
948
1123
  takes no room instead of standing as an empty tinted block. */
949
1124
  .cn-look-board .cn-detail-page__side-item--notice:not(:has(.cn-banner-widget)) {
@@ -1319,6 +1494,26 @@
1319
1494
  line-height: 1.2;
1320
1495
  }
1321
1496
 
1497
+ /* The task name takes the spare width, so it wraps only when long; the
1498
+ handler stays on one line. */
1499
+ .cn-look-board .cn-detail-page .cn-widget-wrapper__content > .cn-tasks-widget .cn-tasks-widget__table th:first-child,
1500
+ .cn-look-board .cn-detail-page .cn-widget-wrapper__content > .cn-tasks-widget .cn-tasks-widget__table .cn-tasks-widget__cell-task {
1501
+ width: 100%;
1502
+ }
1503
+
1504
+ .cn-look-board .cn-detail-page .cn-widget-wrapper__content > .cn-tasks-widget .cn-tasks-widget__table .cn-tasks-widget__cell-handler {
1505
+ white-space: nowrap;
1506
+ }
1507
+
1508
+ /* A head's filter is a 22px button, so a head is 42px high as drawn. */
1509
+ .cn-look-board .cn-detail-page .cn-widget-wrapper__content > .cn-tasks-widget .cn-tasks-widget__table .cn-tasks-widget__head-filter .button-vue {
1510
+ --button-size: 22px;
1511
+ min-width: 22px;
1512
+ min-height: 22px;
1513
+ width: 22px;
1514
+ height: 22px;
1515
+ }
1516
+
1322
1517
  /* A long task name wraps under itself, as the board draws it, rather than
1323
1518
  widening the table past the card. */
1324
1519
  .cn-look-board .cn-detail-page .cn-widget-wrapper__content > .cn-tasks-widget .cn-tasks-widget__table :is(.cn-tasks-widget__name, .cn-tasks-widget__meta) {
@@ -1352,6 +1547,13 @@
1352
1547
  padding-inline-end: var(--cn-board-card-inline-padding);
1353
1548
  }
1354
1549
 
1550
+ /* A row menu in the last column keeps its 34px button and 16px start
1551
+ padding beside the card's end padding, so it is not cut off. */
1552
+ .cn-look-board .cn-detail-page .cn-widget-wrapper__content > .cn-object-list-widget--bleed .cn-table-container .cn-data-table .cn-table-col--actions:last-child {
1553
+ width: calc(50px + var(--cn-board-card-inline-padding));
1554
+ min-width: calc(50px + var(--cn-board-card-inline-padding));
1555
+ }
1556
+
1355
1557
  /* ---- Grouped cards (CnGroupedCardsWidget, DqZaaktype "Fasen en taken") --- */
1356
1558
  /* Groups 14px apart, each padded 14px with a 10px radius and a bold title; a
1357
1559
  card in a group is padded 9px 12px with the 8px control radius, its title
@@ -1377,6 +1579,20 @@
1377
1579
 
1378
1580
  .cn-look-board .cn-grouped-cards__group-title.cn-grouped-cards__group-title {
1379
1581
  font-weight: 700;
1582
+ line-height: 1.2;
1583
+ }
1584
+
1585
+ /* The buttons above the groups are the card's 34px controls ("Bekijken als
1586
+ flow", "Taak toevoegen"), not the page's 40px ones. */
1587
+ /* The buttons sit 14px under the subtitle and 14px above the groups, the
1588
+ card's gap (the content's own 12px top padding plus 2px). */
1589
+ .cn-look-board .cn-grouped-cards__actions.cn-grouped-cards__actions:not(.cn-look-nextcloud *) {
1590
+ margin-block: 2px 14px;
1591
+ }
1592
+
1593
+ .cn-look-board .cn-grouped-cards__actions:not(.cn-look-nextcloud *) .button-vue {
1594
+ min-height: 34px;
1595
+ height: 34px;
1380
1596
  }
1381
1597
 
1382
1598
  .cn-look-board .cn-grouped-cards__item.cn-grouped-cards__item {
@@ -1386,6 +1602,7 @@
1386
1602
 
1387
1603
  .cn-look-board .cn-grouped-cards__item-title.cn-grouped-cards__item-title {
1388
1604
  font-size: 15px;
1605
+ line-height: 1.2;
1389
1606
  }
1390
1607
 
1391
1608
  /* A card with actions holds them at its end, beside the title and meta (the
@@ -1564,6 +1781,15 @@
1564
1781
  font-size: 14px;
1565
1782
  }
1566
1783
 
1784
+ /* The mail card's description runs on the normal line height: thematiq's
1785
+ board paragraph token (1.5) gave
1786
+ it 21px lines (probed on :8080 after REFRESH-4b: 14px/21 vs the board's
1787
+ normal; DqZaakEmail r29 E-mail gapBelowTitle 44.4 vs 49).
1788
+ @spec openspec/changes/board-mail-subtitle-line-height/specs/board-mail-subtitle-line-height/spec.md#requirement-the-mail-cards-description-runs-on-the-normal-line-height */
1789
+ .cn-look-board .cn-detail-widget-host .cn-mail-tab__subtitle.cn-mail-tab__subtitle:not(.cn-look-nextcloud *) {
1790
+ line-height: normal;
1791
+ }
1792
+
1567
1793
  /* ---- The attention flag's buttons --------------------------------------- */
1568
1794
  /* The case boards draw "Markeer voor aandacht" and the flag's other labelled
1569
1795
  buttons at the 40px control height (DqZaak and the case tab boards);
@@ -1728,9 +1954,14 @@
1728
1954
  }
1729
1955
 
1730
1956
  .cn-look-board .cn-detail-page__leaf-card .cn-contacts-tab .cn-contacts-tab__header {
1957
+ display: inline-flex;
1731
1958
  justify-content: flex-start;
1732
1959
  }
1733
1960
 
1961
+ .cn-look-board .cn-detail-page__leaf-card .cn-contacts-tab .cn-contacts-tab__header .button-vue {
1962
+ --button-size: var(--cn-board-control-height);
1963
+ }
1964
+
1734
1965
  /* A body card's subtitle as the Dq boards draw it: 14px muted at line
1735
1966
  height 1.2, 3px under the title, and the content 12px under it.
1736
1967
  @spec openspec/changes/board-card-subtitle-gaps/specs/board-card/spec.md */
@@ -1800,6 +2031,11 @@
1800
2031
  line-height: 1.2;
1801
2032
  }
1802
2033
 
2034
+ .cn-look-board .cn-object-parties .cn-object-parties__accepted .cn-object-parties__muted {
2035
+ font-size: 13px;
2036
+ line-height: 1.2;
2037
+ }
2038
+
1803
2039
  .cn-look-board .cn-object-parties .cn-object-parties__accepted-kind {
1804
2040
  padding: 2px 8px;
1805
2041
  border: 1px solid var(--color-border-maxcontrast);
@@ -1836,23 +2072,30 @@
1836
2072
  /* Appointment and note rows (DqTaak Afspraken, Notities): a hairline above
1837
2073
  every row including the first, 12px 0 padding, a 32px round tile (the day
1838
2074
  an appointment starts, the author's initials) 12px before the text, the
1839
- title 15/600 and one 13px muted meta line joined with " · ".
2075
+ title 15/600 and one 13px muted meta line joined with " · ". Every
2076
+ selector carries :not(.cn-look-nextcloud *) to outrank the cards' scoped
2077
+ rules, which tie with a two-class selector and load later.
1840
2078
  @spec openspec/changes/board-task-cards-rows/specs/task-cards/spec.md#requirement-board-appointment-and-note-rows-carry-a-tile-and-a-meta-line */
1841
- .cn-look-board .cn-events-card__list {
2079
+ .cn-look-board .cn-events-card__list:not(.cn-look-nextcloud *) {
1842
2080
  gap: 0;
1843
2081
  }
1844
2082
 
1845
- .cn-look-board .cn-events-card__event,
1846
- .cn-look-board .cn-events-card__event:last-child,
1847
- .cn-look-board .cn-notes-card__note,
1848
- .cn-look-board .cn-notes-card__note:last-child {
1849
- padding: 12px 0;
2083
+ .cn-look-board .cn-events-card__event:not(.cn-look-nextcloud *),
2084
+ .cn-look-board .cn-events-card__event:not(.cn-look-nextcloud *):last-child,
2085
+ .cn-look-board .cn-notes-card__note:not(.cn-look-nextcloud *),
2086
+ .cn-look-board .cn-notes-card__note:not(.cn-look-nextcloud *):last-child {
2087
+ padding-block: 12px;
1850
2088
  border-top: 1px solid var(--cn-board-hairline);
1851
2089
  border-bottom: none;
1852
2090
  }
1853
2091
 
1854
- .cn-look-board .cn-events-card__day,
1855
- .cn-look-board .cn-notes-card__initials {
2092
+ .cn-look-board .cn-events-card__event:not(.cn-look-nextcloud *),
2093
+ .cn-look-board .cn-events-card__event:not(.cn-look-nextcloud *):last-child {
2094
+ padding-inline: 0;
2095
+ }
2096
+
2097
+ .cn-look-board .cn-events-card__day:not(.cn-look-nextcloud *),
2098
+ .cn-look-board .cn-notes-card__initials:not(.cn-look-nextcloud *) {
1856
2099
  display: inline-flex;
1857
2100
  flex: 0 0 32px;
1858
2101
  align-items: center;
@@ -1866,60 +2109,79 @@
1866
2109
  font-weight: 700;
1867
2110
  }
1868
2111
 
1869
- .cn-look-board .cn-events-card__text {
2112
+ .cn-look-board .cn-events-card__text:not(.cn-look-nextcloud *) {
1870
2113
  flex-flow: row wrap;
1871
2114
  row-gap: 2px;
1872
2115
  }
1873
2116
 
1874
- .cn-look-board .cn-events-card__summary,
1875
- .cn-look-board .cn-notes-card__body {
2117
+ .cn-look-board .cn-events-card__summary:not(.cn-look-nextcloud *),
2118
+ .cn-look-board .cn-notes-card__body:not(.cn-look-nextcloud *) {
1876
2119
  font-size: 15px;
1877
2120
  font-weight: 600;
1878
- line-height: 1.35;
2121
+ line-height: normal;
1879
2122
  }
1880
2123
 
1881
- .cn-look-board .cn-events-card__summary {
2124
+ .cn-look-board .cn-events-card__summary:not(.cn-look-nextcloud *) {
1882
2125
  flex-basis: 100%;
1883
2126
  }
1884
2127
 
1885
- .cn-look-board .cn-events-card__when,
1886
- .cn-look-board .cn-events-card__where,
1887
- .cn-look-board .cn-notes-card__author,
1888
- .cn-look-board .cn-notes-card__time {
2128
+ .cn-look-board .cn-events-card__when:not(.cn-look-nextcloud *),
2129
+ .cn-look-board .cn-events-card__where:not(.cn-look-nextcloud *),
2130
+ .cn-look-board .cn-notes-card__author:not(.cn-look-nextcloud *),
2131
+ .cn-look-board .cn-notes-card__time:not(.cn-look-nextcloud *) {
1889
2132
  color: var(--color-text-maxcontrast);
1890
2133
  font-size: 13px;
1891
2134
  font-weight: 400;
1892
2135
  }
1893
2136
 
1894
- .cn-look-board .cn-events-card__where::before,
1895
- .cn-look-board .cn-notes-card__time::before {
2137
+ .cn-look-board .cn-events-card__where:not(.cn-look-nextcloud *)::before,
2138
+ .cn-look-board .cn-notes-card__time:not(.cn-look-nextcloud *)::before {
1896
2139
  content: ' · ';
1897
2140
  white-space: pre;
1898
2141
  }
1899
2142
 
1900
- .cn-look-board .cn-notes-card__note {
2143
+ /* Each note sits alone in its thread, so it is also a :last-child; the
2144
+ padding above is set per side so the 44px room for the tile holds. */
2145
+ .cn-look-board .cn-notes-card__note:not(.cn-look-nextcloud *),
2146
+ .cn-look-board .cn-notes-card__note:not(.cn-look-nextcloud *):last-child {
1901
2147
  display: flex;
1902
2148
  flex-direction: column;
1903
2149
  gap: 2px;
1904
- padding-inline-start: 44px;
2150
+ padding-inline: 44px 0;
1905
2151
  }
1906
2152
 
1907
- .cn-look-board .cn-notes-card__initials {
2153
+ /* Reply stays on the row as Delete does: at its end, shown on hover and on
2154
+ keyboard focus, so the row keeps the board's two lines.
2155
+ @spec openspec/changes/board-note-rows-tile-room/specs/task-cards/spec.md#requirement-a-board-note-row-keeps-its-tile-room-and-two-lines */
2156
+ .cn-look-board .cn-notes-card__note:not(.cn-look-nextcloud *) > .cn-notes-card__reply-btn {
2157
+ position: absolute;
2158
+ top: 8px;
2159
+ inset-inline-end: 32px;
2160
+ opacity: 0;
2161
+ }
2162
+
2163
+ .cn-look-board .cn-notes-card__note:not(.cn-look-nextcloud *):hover > .cn-notes-card__reply-btn,
2164
+ .cn-look-board .cn-notes-card__note:not(.cn-look-nextcloud *):focus-within > .cn-notes-card__reply-btn {
2165
+ opacity: 1;
2166
+ }
2167
+
2168
+ .cn-look-board .cn-notes-card__initials:not(.cn-look-nextcloud *) {
1908
2169
  position: absolute;
1909
2170
  top: 12px;
1910
2171
  inset-inline-start: 0;
1911
2172
  }
1912
2173
 
1913
- .cn-look-board .cn-notes-card__body {
2174
+ .cn-look-board .cn-notes-card__body:not(.cn-look-nextcloud *) {
1914
2175
  order: -1;
1915
2176
  }
1916
2177
 
1917
- .cn-look-board .cn-notes-card__note-header {
2178
+ .cn-look-board .cn-notes-card__note-header:not(.cn-look-nextcloud *) {
1918
2179
  justify-content: flex-start;
1919
2180
  margin-bottom: 0;
2181
+ line-height: normal;
1920
2182
  }
1921
2183
 
1922
- .cn-look-board .cn-notes-card__time {
2184
+ .cn-look-board .cn-notes-card__time:not(.cn-look-nextcloud *) {
1923
2185
  margin-inline-start: 0;
1924
2186
  }
1925
2187
 
@@ -1928,6 +2190,10 @@
1928
2190
  that names the role, the pills at the end. The role headings stay for
1929
2191
  assistive tech only.
1930
2192
  @spec openspec/changes/board-parties-rows/specs/parties/spec.md */
2193
+ .cn-look-board .cn-object-parties--board {
2194
+ gap: 8px;
2195
+ }
2196
+
1931
2197
  .cn-look-board .cn-object-parties--board .cn-object-parties__role-label {
1932
2198
  position: absolute;
1933
2199
  width: 1px;
@@ -2039,3 +2305,77 @@
2039
2305
  font-weight: 600;
2040
2306
  text-decoration: underline;
2041
2307
  }
2308
+
2309
+ /* Two-column facts (`columns: 2`, DqContact "Contact", DqOrganisatie
2310
+ "Organisatie"): the boards draw the label 2px above a regular-weight
2311
+ value, with no hairline under the fact; the 14px row gap separates them.
2312
+ @spec openspec/changes/board-facts-columns-plain/specs/board-facts-columns-plain/spec.md#requirement-board-two-column-facts-are-plain-label-over-value-pairs */
2313
+ .cn-look-board .cn-facts-widget__rows--columns:not(.cn-look-nextcloud *) .cn-facts-widget__row {
2314
+ gap: 2px;
2315
+ padding-bottom: 0;
2316
+ border-bottom: none;
2317
+ }
2318
+
2319
+ .cn-look-board .cn-facts-widget__rows--columns:not(.cn-look-nextcloud *) .cn-facts-widget__value.cn-facts-widget__value {
2320
+ font-weight: 400;
2321
+ line-height: normal;
2322
+ }
2323
+
2324
+ .cn-look-board .cn-facts-widget__rows--columns:not(.cn-look-nextcloud *) .cn-facts-widget__label.cn-facts-widget__label {
2325
+ line-height: normal;
2326
+ }
2327
+
2328
+ /* A ruled list in a page card (`ruleAbove`, DqContact and DqOrganisatie
2329
+ "Zaken", "Tickets"): the rule sits 12px under the title and each row has
2330
+ 12px above and below its text, so the first row's text is 25px under the
2331
+ title.
2332
+ @spec openspec/changes/board-ruled-list-card-start/specs/board-ruled-list-card-start/spec.md#requirement-a-board-ruled-list-in-a-page-card-starts-12px-under-the-title */
2333
+ .cn-look-board .cn-detail-page .cn-widget-wrapper__content:has(> .cn-record-list--rows.cn-record-list--rule-above):not(.cn-detail-page__side *),
2334
+ .cn-look-board .cn-detail-card__content:has(> .cn-record-list--rows.cn-record-list--rule-above):not(.cn-detail-page__side *) {
2335
+ padding-top: 12px;
2336
+ }
2337
+
2338
+ .cn-look-board .cn-detail-page .cn-record-list--rows.cn-record-list--rule-above:not(.cn-detail-page__side *):not(.cn-look-nextcloud *) .cn-record-list__row {
2339
+ padding: 12px 0;
2340
+ }
2341
+
2342
+ /* Under a title with a subtitle the rule sits 8px below the subtitle
2343
+ (DqZaakBesluiten "Adviezen", DqZaakArchivering "Bewaring"). A custom
2344
+ widget that opens on a ruled list opts in with `cn-rule-above` on its root. */
2345
+ .cn-look-board .cn-detail-page .cn-widget-wrapper:not(.cn-detail-page__side *):has(> .cn-widget-wrapper__header .cn-widget-wrapper__subtitle) > .cn-widget-wrapper__content:has(> .cn-record-list--rows.cn-record-list--rule-above, > .cn-rule-above) {
2346
+ padding-top: 8px;
2347
+ }
2348
+
2349
+ /* A side list row with initials stays one line: a 28px circle 8px before
2350
+ the regular-weight text (DqSociaalDomein "Wie"). The library stacks side
2351
+ rows into a column, which put the initials above the name.
2352
+ @spec openspec/changes/board-side-person-rows/specs/board-side-person-rows/spec.md#requirement-a-board-side-row-with-initials-keeps-them-beside-the-text */
2353
+ .cn-look-board .cn-detail-page__side .cn-record-list__row:has(> .cn-record-list__avatar):not(.cn-look-nextcloud *) {
2354
+ flex-direction: row;
2355
+ align-items: center;
2356
+ gap: 8px;
2357
+ }
2358
+
2359
+ .cn-look-board .cn-detail-page__side .cn-record-list__row:not(.cn-look-nextcloud *) > .cn-record-list__avatar {
2360
+ width: 28px;
2361
+ height: 28px;
2362
+ background: var(--color-primary-element-light);
2363
+ color: var(--color-primary-element-light-text);
2364
+ }
2365
+
2366
+ .cn-look-board .cn-detail-page__side .cn-record-list__row:has(> .cn-record-list__avatar):not(.cn-look-nextcloud *) .cn-record-list__title {
2367
+ font-weight: 400;
2368
+ }
2369
+
2370
+ /* The history card's kind chips sit on the header's 16px gap, 8px apart, as
2371
+ DqZaakHistorie draws them: the server's 3px button margin pushed the row
2372
+ 3px down and made it 42px tall. The composer's field labels run on a 1.2
2373
+ line, so "Sjabloon" starts 12px under the subtitle as drawn.
2374
+ @spec openspec/changes/board-history-chips-and-labels/specs/timeline/spec.md */
2375
+ .cn-look-board .cn-timeline-manage__chips .cn-timeline-manage__chip:not(.cn-look-nextcloud *) {
2376
+ margin: 0;
2377
+ }
2378
+
2379
+ .cn-look-board .cn-timeline-manage__draft-label:not(.cn-look-nextcloud *) {
2380
+ line-height: 1.2;
2381
+ }