@conduction/nextcloud-vue 2.148.0 → 2.150.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 (111) hide show
  1. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue.js +1 -1
  2. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js +24 -7
  3. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js.map +1 -1
  4. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue3.js.map +1 -1
  5. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue.js +1 -1
  6. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue2.js +12 -1
  7. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue2.js.map +1 -1
  8. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue3.js +2 -1
  9. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue3.js.map +1 -1
  10. package/dist/esm/components/CnChartWidget/CnChartWidget.vue.js +1 -1
  11. package/dist/esm/components/CnChartWidget/CnChartWidget.vue2.js +12 -0
  12. package/dist/esm/components/CnChartWidget/CnChartWidget.vue2.js.map +1 -1
  13. package/dist/esm/components/CnChartWidget/CnChartWidget.vue3.js.map +1 -1
  14. package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue.js +1 -1
  15. package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue2.js +23 -1
  16. package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue2.js.map +1 -1
  17. package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue3.js +1 -1
  18. package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue3.js.map +1 -1
  19. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +34 -1
  20. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
  21. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
  22. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue.js +1 -1
  23. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue2.js.map +1 -1
  24. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue3.js.map +1 -1
  25. package/dist/esm/components/CnDeviceFramesWidget/CnDeviceFramesWidget.vue.js +1 -1
  26. package/dist/esm/components/CnDeviceFramesWidget/CnDeviceFramesWidget.vue2.js.map +1 -1
  27. package/dist/esm/components/CnDeviceFramesWidget/CnDeviceFramesWidget.vue3.js.map +1 -1
  28. package/dist/esm/components/CnDuplicateWarning/CnDuplicateWarning.vue.js +1 -1
  29. package/dist/esm/components/CnDuplicateWarning/CnDuplicateWarning.vue2.js +64 -8
  30. package/dist/esm/components/CnDuplicateWarning/CnDuplicateWarning.vue2.js.map +1 -1
  31. package/dist/esm/components/CnDuplicateWarning/CnDuplicateWarning.vue3.js +14 -4
  32. package/dist/esm/components/CnDuplicateWarning/CnDuplicateWarning.vue3.js.map +1 -1
  33. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js +1 -1
  34. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js +26 -3
  35. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -1
  36. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js +10 -2
  37. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -1
  38. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue.js +1 -1
  39. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js +84 -1
  40. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js.map +1 -1
  41. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js +61 -33
  42. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js.map +1 -1
  43. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue.js +1 -1
  44. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue2.js +49 -2
  45. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue2.js.map +1 -1
  46. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue3.js +90 -59
  47. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue3.js.map +1 -1
  48. package/dist/esm/components/CnFollowingWidgetHost/CnFollowingWidgetHost.vue2.js +3 -1
  49. package/dist/esm/components/CnFollowingWidgetHost/CnFollowingWidgetHost.vue2.js.map +1 -1
  50. package/dist/esm/components/CnFollowingWidgetHost/CnFollowingWidgetHost.vue3.js.map +1 -1
  51. package/dist/esm/components/CnNotesCard/CnNotesCard.vue.js +1 -1
  52. package/dist/esm/components/CnNotesCard/CnNotesCard.vue2.js +10 -0
  53. package/dist/esm/components/CnNotesCard/CnNotesCard.vue2.js.map +1 -1
  54. package/dist/esm/components/CnNotesCard/CnNotesCard.vue3.js.map +1 -1
  55. package/dist/esm/components/CnObjectCard/CnObjectCard.vue.js +1 -1
  56. package/dist/esm/components/CnObjectCard/CnObjectCard.vue2.js +11 -0
  57. package/dist/esm/components/CnObjectCard/CnObjectCard.vue2.js.map +1 -1
  58. package/dist/esm/components/CnObjectCard/CnObjectCard.vue3.js +28 -21
  59. package/dist/esm/components/CnObjectCard/CnObjectCard.vue3.js.map +1 -1
  60. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue.js +1 -1
  61. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +1 -1
  62. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
  63. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
  64. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +1 -1
  65. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +3 -15
  66. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
  67. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js +123 -115
  68. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
  69. package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue.js +1 -1
  70. package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue2.js +4 -0
  71. package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue2.js.map +1 -1
  72. package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue3.js.map +1 -1
  73. package/dist/esm/l10n/en.json.js +2 -1
  74. package/dist/esm/l10n/en.json.js.map +1 -1
  75. package/dist/esm/l10n/nl.json.js +2 -1
  76. package/dist/esm/l10n/nl.json.js.map +1 -1
  77. package/dist/esm/library-style.js +1 -1
  78. package/dist/esm/nextcloud-vue.css +761 -520
  79. package/dist/esm/utils/fillTemplate.js +19 -2
  80. package/dist/esm/utils/fillTemplate.js.map +1 -1
  81. package/dist/nextcloud-vue.cjs.js +1368 -945
  82. package/dist/nextcloud-vue.cjs.js.map +2 -2
  83. package/dist/nextcloud-vue.css +761 -520
  84. package/l10n/en.json +2 -1
  85. package/l10n/nl.json +2 -1
  86. package/package.json +1 -1
  87. package/src/components/CnAuditTrailCard/CnAuditTrailCard.vue +24 -7
  88. package/src/components/CnAuditTrailWidget/CnAuditTrailWidget.vue +13 -1
  89. package/src/components/CnChartWidget/CnChartWidget.md +1 -1
  90. package/src/components/CnChartWidget/CnChartWidget.vue +12 -0
  91. package/src/components/CnChecklistRunWidget/CnChecklistRunWidget.vue +29 -2
  92. package/src/components/CnDataTable/CnDataTable.vue +34 -1
  93. package/src/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue +6 -1
  94. package/src/components/CnDeviceFramesWidget/CnDeviceFramesWidget.vue +1 -0
  95. package/src/components/CnDuplicateWarning/CnDuplicateWarning.vue +74 -10
  96. package/src/components/CnFactsWidget/CnFactsWidget.vue +35 -3
  97. package/src/components/CnFieldListWidget/CnFieldListWidget.vue +131 -3
  98. package/src/components/CnFlowRunsWidget/CnFlowRunsWidget.vue +103 -5
  99. package/src/components/CnFollowingWidgetHost/CnFollowingWidgetHost.vue +3 -1
  100. package/src/components/CnNotesCard/CnNotesCard.vue +10 -0
  101. package/src/components/CnObjectCard/CnObjectCard.vue +16 -0
  102. package/src/components/CnObjectListWidget/CnObjectListWidget.vue +1 -1
  103. package/src/components/CnRecordListWidget/CnRecordListWidget.vue +19 -19
  104. package/src/components/CnRegisterMapping/CnRegisterMapping.vue +4 -0
  105. package/src/css/board.css +2 -0
  106. package/src/css/dialog.css +17 -0
  107. package/src/css/look-board-detail.css +52 -3
  108. package/src/css/look-board-index.css +42 -2
  109. package/src/css/look-board.css +45 -5
  110. package/src/css/table.css +5 -2
  111. package/src/utils/fillTemplate.js +19 -2
@@ -751,6 +751,14 @@
751
751
  padding: calc(12px - var(--cn-board-first-line-leading)) var(--cn-board-card-inline-padding) 20px;
752
752
  }
753
753
 
754
+ /* A card that opens on a record-list table starts 12px under its title: the
755
+ table's head row sets its own padding and line height, so no first line
756
+ carries the half-leading the rule above takes off (r31 DqZaaktype
757
+ "Berichten aan de aanvrager" sat 2.2px high). */
758
+ .cn-look-board .cn-detail-page .cn-widget-wrapper__content:has(> .cn-record-list > .cn-record-list__table:first-child):not(.cn-look-nextcloud *) {
759
+ padding-top: 12px;
760
+ }
761
+
754
762
  /* A history card with stacked rows (DqTaak "Historie") opens on the first
755
763
  row's hairline 6px under the title, the row's own 12px padding above its
756
764
  text, as drawn: 19px from the title to the first action.
@@ -841,6 +849,15 @@
841
849
  font-weight: 500;
842
850
  }
843
851
 
852
+ /* The files table's checkbox column is the board's 42px (12px either side
853
+ of the 18px box): DqZaakDocumenten and DqDocumentenBeheer both draw it so.
854
+ The component's 36px pushed the file icon and name 6px left (r31: name 96
855
+ vs 100; probed with the rule: icon 54 as drawn, name 102).
856
+ @spec openspec/changes/board-files-select-column-42/specs/board-files-select-column-42/spec.md#requirement-the-files-tables-checkbox-column-is-42px */
857
+ .cn-look-board .cn-files-browser__col-select:not(.cn-look-nextcloud *) {
858
+ width: 42px;
859
+ }
860
+
844
861
  /* A labelled select in a page card is the board's field, as in a board
845
862
  dialog (dialog.css): its label above the control at 14px/600 on the normal
846
863
  line (the theme's label weight token set to 600 here), the control 40px,
@@ -1584,10 +1601,10 @@
1584
1601
 
1585
1602
  /* The buttons above the groups are the card's 34px controls ("Bekijken als
1586
1603
  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). */
1604
+ /* The buttons sit 14px above the groups, the card's gap; above them the
1605
+ content's own top padding is the space under the subtitle. */
1589
1606
  .cn-look-board .cn-grouped-cards__actions.cn-grouped-cards__actions:not(.cn-look-nextcloud *) {
1590
- margin-block: 2px 14px;
1607
+ margin-block: 0 14px;
1591
1608
  }
1592
1609
 
1593
1610
  .cn-look-board .cn-grouped-cards__actions:not(.cn-look-nextcloud *) .button-vue {
@@ -2379,3 +2396,35 @@
2379
2396
  .cn-look-board .cn-timeline-manage__draft-label:not(.cn-look-nextcloud *) {
2380
2397
  line-height: 1.2;
2381
2398
  }
2399
+
2400
+ /* A facts card's link with an icon (Werkinstructie) sets the icon beside its
2401
+ text, 10px apart, the text on the normal line starting 10px under the
2402
+ title, as the Dq boards draw it. The anchor was a block, so the icon stood
2403
+ on its own line above the text (r31).
2404
+ @spec openspec/changes/board-facts-link-icon-beside-text/specs/facts-widget/spec.md */
2405
+ .cn-look-board .cn-facts-widget .cn-facts-widget__link:has(> .material-design-icon):not(.cn-look-nextcloud *) {
2406
+ display: flex;
2407
+ align-items: center;
2408
+ gap: 10px;
2409
+ margin-top: var(--cn-board-first-line-leading);
2410
+ line-height: normal;
2411
+ }
2412
+
2413
+ /* A table in a detail page card names each row in the link colour at 14px,
2414
+ as DqZaakGerelateerd draws "Deelzaken" and "Objecten" (r31: 15px in the
2415
+ body ink). The row opens the record, so its name reads as the link.
2416
+ @spec openspec/changes/board-detail-table-title-cells/specs/board-tables/spec.md */
2417
+ .cn-look-board .cn-detail-page .cn-object-list-widget td.cn-table-col--title:not(.cn-look-nextcloud *),
2418
+ .cn-look-board .cn-detail-page .cn-object-list-widget td.cn-table-col--title .cn-cell-renderer:not(.cn-look-nextcloud *) {
2419
+ font-size: 14px;
2420
+ line-height: 1.2;
2421
+ color: var(--color-primary-element);
2422
+ }
2423
+
2424
+ /* A data card keeps its 14px under a subtitle too (DqZaakBetrokkenen
2425
+ "Zetels"): the subtitle rule's 12px won over the data card's 14px, so the
2426
+ labels sat 2.2px high (r31).
2427
+ @spec openspec/changes/board-data-card-under-subtitle/specs/board-card/spec.md */
2428
+ .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-object-data-widget__grid-wrap) {
2429
+ padding-top: 14px;
2430
+ }
@@ -1079,8 +1079,9 @@
1079
1079
  @spec openspec/changes/board-avatar-chip/specs/data-table/spec.md#requirement-a-board-avatar-cell-draws-the-initials-chip */
1080
1080
  .cn-look-board .cn-table-container--board .cn-data-table .cn-cell-renderer__avatar-initials--neutral {
1081
1081
  background: var(--color-background-dark);
1082
- color: var(--color-main-text);
1082
+ color: var(--cn-board-text-soft);
1083
1083
  font-size: 13px;
1084
+ line-height: normal;
1084
1085
  }
1085
1086
 
1086
1087
  .cn-look-board .cn-table-container--board .cn-data-table .cn-cell-renderer__avatar:has(.cn-cell-renderer__avatar-initials--neutral) {
@@ -1513,17 +1514,19 @@
1513
1514
  margin: 0;
1514
1515
  font-size: 17px;
1515
1516
  font-weight: 700;
1516
- line-height: 1.3;
1517
+ line-height: normal;
1517
1518
  text-decoration: none;
1518
1519
  white-space: normal;
1519
1520
  }
1520
1521
 
1521
1522
  .cn-look-board .cn-object-card--board .cn-object-card__record-meta {
1522
1523
  --nldesign-component-paragraph-font-size: 14px;
1524
+ --nldesign-component-paragraph-line-height: normal;
1523
1525
  --nldesign-component-paragraph-color: var(--color-text-maxcontrast);
1524
1526
  margin: 0;
1525
1527
  color: var(--color-text-maxcontrast);
1526
1528
  font-size: 14px;
1529
+ line-height: normal;
1527
1530
  }
1528
1531
 
1529
1532
  /* The meta line, note and description are paragraphs: each hands the theme,
@@ -1531,11 +1534,13 @@
1531
1534
  .cn-look-board .cn-object-card--board .cn-object-card__record-note {
1532
1535
  --nldesign-component-paragraph-font-size: 13px;
1533
1536
  --nldesign-component-paragraph-font-weight: 600;
1537
+ --nldesign-component-paragraph-line-height: normal;
1534
1538
  --nldesign-component-paragraph-color: var(--cn-board-text-soft);
1535
1539
  margin: 0;
1536
1540
  color: var(--cn-board-text-soft);
1537
1541
  font-size: 13px;
1538
1542
  font-weight: 600;
1543
+ line-height: normal;
1539
1544
  }
1540
1545
 
1541
1546
  .cn-look-board .cn-object-card--board .cn-object-card__record-note--purple {
@@ -1703,9 +1708,19 @@
1703
1708
  --app-sidebar-width: 360px;
1704
1709
  }
1705
1710
 
1711
+ /* The subtitle 2px under the title at a normal line height, and the tab's
1712
+ content 20px in from the panel edge (the tab's 10px and 10px here), as
1713
+ DqFilterBeheren draws the side panel.
1714
+ @spec openspec/changes/board-side-panel-rhythm/specs/board-side-panel-rhythm/spec.md */
1706
1715
  .cn-look-board:has(.cn-index-page) > .app-sidebar .app-sidebar-header__subname {
1716
+ margin-top: 2px;
1707
1717
  color: var(--color-text-maxcontrast);
1708
1718
  font-size: 14px;
1719
+ line-height: normal;
1720
+ }
1721
+
1722
+ .cn-look-board:has(.cn-index-page) > .app-sidebar .cn-index-sidebar__section {
1723
+ padding: 10px;
1709
1724
  }
1710
1725
 
1711
1726
  .cn-look-board:has(.cn-index-page) > .app-sidebar .app-sidebar__close {
@@ -1924,9 +1939,33 @@
1924
1939
  @spec openspec/changes/board-index-sidebar-title-inset/specs/board-index-sidebar-title-inset/spec.md#requirement-the-index-side-panel-title-is-inset-as-the-board-draws-it */
1925
1940
  .cn-look-board .cn-index-sidebar-panel .app-sidebar-header.app-sidebar-header .app-sidebar-header__info .app-sidebar-header__desc.app-sidebar-header__desc {
1926
1941
  padding-block-start: 15px;
1942
+ padding-block-end: 0;
1927
1943
  padding-inline-start: 20px;
1928
1944
  }
1929
1945
 
1946
+ /* The line under the title is a paragraph the theme sets with `!important`
1947
+ (15px, its own leading): 14px muted at its normal leading, 2px under the
1948
+ title, so the tab row starts 14px under it and the first field 20px under
1949
+ the tabs (DqZakenSorteren, DqFilterBeheren: title 20, line 46, tabs 77,
1950
+ search field 137).
1951
+ @spec openspec/changes/board-side-panel-header-rhythm/specs/board-side-panel-header-rhythm/spec.md#requirement-the-side-panel-header-and-first-field-sit-as-the-boards-draw-them */
1952
+ .cn-look-board .cn-index-sidebar-panel .app-sidebar-header__subname {
1953
+ --nldesign-component-paragraph-font-size: 14px;
1954
+ --nldesign-component-paragraph-line-height: normal;
1955
+ --nldesign-component-paragraph-color: var(--color-text-maxcontrast);
1956
+ font-size: 14px !important;
1957
+ line-height: normal !important;
1958
+ margin-block-start: -3px !important;
1959
+ }
1960
+
1961
+ .cn-look-board .cn-index-sidebar-panel .cn-index-sidebar__tab-content > .cn-index-sidebar__section:first-child {
1962
+ padding-top: 8px;
1963
+ }
1964
+
1965
+ .cn-look-board .cn-index-sidebar-panel .cn-index-sidebar__tab-content > .cn-index-sidebar__section:first-child > .input-field {
1966
+ margin-top: 0;
1967
+ }
1968
+
1930
1969
  .cn-look-board .cn-index-sidebar-panel .app-sidebar-tabs__nav[role="tablist"] {
1931
1970
  justify-content: flex-start;
1932
1971
  gap: 4px;
@@ -2119,6 +2158,7 @@
2119
2158
  .cn-look-board .cn-saved-views-panel:not(.cn-look-nextcloud *) .cn-saved-views-panel__name-text {
2120
2159
  font-size: 14px;
2121
2160
  font-weight: 600;
2161
+ line-height: normal;
2122
2162
  }
2123
2163
 
2124
2164
  /* A view's count: a grey pill at the end of its row (DqFilterBeheren). */
@@ -942,14 +942,15 @@ body:has(.cn-look-board):not(:has(.cn-look-nextcloud)) .v-popper__popper.action-
942
942
  }
943
943
 
944
944
  /* A saved view's manage menu (DqFilterBeheren, DqFilterInMenu "Beheer
945
- <view>"): 264px wide, rows of at least 40px, 6px 10px in, 8px rounded,
945
+ <view>"): 278px wide outside (the board's 264px of content, 6px in and a
946
+ 1px line), rows of at least 40px, 6px 10px in, 8px rounded,
946
947
  the icon 12px before a 14px label at 600 with its explanation under it in
947
948
  12px muted text at 400; the separator in the soft line, and Delete in the
948
949
  error red. Its rows carry the panel's `cn-saved-views-` test ids.
949
950
  @spec openspec/changes/board-saved-view-manage-menu/specs/board-saved-view-manage-menu/spec.md#requirement-a-saved-views-manage-menu-is-the-boards-menu */
950
951
  body:has(.cn-look-board):not(:has(.cn-look-nextcloud)) .v-popper__popper.action-item__popper:has(li[data-testid^="cn-saved-views-"]) .v-popper__wrapper .v-popper__inner {
951
952
  box-sizing: border-box;
952
- width: 264px;
953
+ width: 278px;
953
954
  max-width: calc(100vw - 32px);
954
955
  }
955
956
 
@@ -1520,8 +1521,8 @@ body:has(.cn-look-board):not(:has(.cn-look-nextcloud)) .v-popper__popper.action-
1520
1521
  text-align: start;
1521
1522
  }
1522
1523
 
1523
- /* Body rows are 42px as on the boards (10px, a 21px line, 10px, the rule).
1524
- A row header (dossiq's prerequisites) reads as a strong cell, not as a
1524
+ /* Body cells read 14px at 1.2, as the boards' settings tables do; a row's
1525
+ height comes from its content (a pill or a 34px button). A row header (dossiq's prerequisites) reads as a strong cell, not as a
1525
1526
  head: the theme paints every th, so its tokens are handed the cell's. */
1526
1527
  .cn-look-board .settings-section table:not(.cn-data-table):not(.cn-look-nextcloud *) td,
1527
1528
  .cn-look-board .settings-section table:not(.cn-data-table):not(.cn-look-nextcloud *) tbody th {
@@ -1529,7 +1530,7 @@ body:has(.cn-look-board):not(:has(.cn-look-nextcloud)) .v-popper__popper.action-
1529
1530
  border-bottom: 1px solid var(--color-background-dark);
1530
1531
  color: var(--color-main-text);
1531
1532
  font-size: 14px;
1532
- line-height: 1.5;
1533
+ line-height: 1.2;
1533
1534
  vertical-align: middle;
1534
1535
  }
1535
1536
 
@@ -1660,6 +1661,38 @@ body:has(.cn-look-board):not(:has(.cn-look-nextcloud)) .v-popper__popper.action-
1660
1661
  min-width: 0;
1661
1662
  }
1662
1663
 
1664
+ /* A settings card's first line sits where the boards draw it: an
1665
+ "Uitleg tonen" link, a switch or a note adds no height beyond its text, so
1666
+ the first text is 16px under the subtitle (DqBeheerinstellingen
1667
+ "Zaak-e-mail" and "AI-ondersteunde verwerking", DqBeheerGeavanceerd "KCC"
1668
+ and "Storeregister": 7px and 29px lower live). The controls keep their full
1669
+ hit area; the negative margin only takes it out of the line.
1670
+ @spec openspec/changes/board-settings-first-line/specs/settings-board-look/spec.md */
1671
+ .cn-look-board .cn-settings-fields__hints-toggle:not(.cn-look-nextcloud *) {
1672
+ margin-block: -8px;
1673
+ }
1674
+
1675
+ .cn-look-board .cn-settings-field--switch:not(.cn-look-nextcloud *) > .checkbox-radio-switch {
1676
+ margin-block: -8px;
1677
+ }
1678
+
1679
+ .cn-look-board .cn-settings-field--status:not(.cn-look-nextcloud *) > .notecard {
1680
+ margin: 0;
1681
+ }
1682
+
1683
+ /* A card's longer explanation reads as the boards' second paragraph: 14px
1684
+ muted at 1.5, the fields 14px under it (DqBeheerGeavanceerd "Urgentie in de
1685
+ werkvoorraad": 15px and 30px live). The theme sizes every paragraph through
1686
+ its tokens. */
1687
+ .cn-look-board .cn-settings-section__description-text:not(.cn-look-nextcloud *) {
1688
+ --nldesign-component-paragraph-font-size: 14px;
1689
+ --nldesign-component-paragraph-line-height: 1.5;
1690
+ --nldesign-component-paragraph-color: var(--color-text-maxcontrast);
1691
+ margin: 0;
1692
+ font-size: 14px;
1693
+ line-height: 1.5;
1694
+ }
1695
+
1663
1696
  @container (max-width: 400px) {
1664
1697
  .cn-look-board .settings-section:not(.cn-look-nextcloud *) > .cn-settings-section__actions,
1665
1698
  .cn-look-board .settings-section:not(.cn-look-nextcloud *):has(> .settings-section__desc) > .cn-settings-section__actions {
@@ -2614,6 +2647,12 @@ body:has(.cn-look-board):not(:has(.cn-look-nextcloud)) .v-popper__popper.action-
2614
2647
  font-weight: 500;
2615
2648
  }
2616
2649
 
2650
+ /* A compact card keeps its 15px/700 title on a dashboard page too (DqInspectie). */
2651
+ .cn-look-board .cn-dashboard-page:not(.cn-look-nextcloud *) .cn-record-list--compact .cn-record-list__card .cn-record-list__title {
2652
+ font-weight: 700;
2653
+ line-height: 1.2;
2654
+ }
2655
+
2617
2656
  .cn-look-board .cn-dashboard-page:not(.cn-look-nextcloud *) .cn-record-list--compact .cn-record-list__main {
2618
2657
  gap: 2px;
2619
2658
  }
@@ -3472,4 +3511,5 @@ html :where(.cn-look-board) :is(h2, h3, h5, h6):where(.cn-inner-heading) {
3472
3511
  .cn-look-board .cn-saved-view-share__mode:not(.cn-look-nextcloud *) {
3473
3512
  border-radius: 8px;
3474
3513
  background: var(--cn-board-sunken-ground);
3514
+ line-height: normal;
3475
3515
  }
package/src/css/table.css CHANGED
@@ -616,10 +616,13 @@
616
616
  cursor: grab;
617
617
  }
618
618
 
619
- /* The handle before a reorderable row's name: a muted 16px grip 10px before it. */
619
+ /* The handle before a reorderable row's name: a muted 16px grip 10px before
620
+ it. It floats, so a name that wraps in a narrow cell wraps beside the grip
621
+ instead of dropping under it. */
620
622
  .cn-table-row__handle {
621
623
  display: inline-flex;
622
- vertical-align: middle;
624
+ float: inline-start;
625
+ margin-block-start: 1px;
623
626
  margin-inline-end: 10px;
624
627
  color: var(--color-text-maxcontrast);
625
628
  cursor: grab;
@@ -60,6 +60,22 @@ export function formatLongDate(value, now = new Date(), withYear = false) {
60
60
  }
61
61
  }
62
62
 
63
+ /**
64
+ * How many entries a list holds; with a key, the entries of that list in each
65
+ * of its entries summed (`{sections|count:items}`: the questions of every
66
+ * section of a checklist).
67
+ *
68
+ * @param {Array} list The list.
69
+ * @param {string} key The key of each entry's own list, or '' to count the entries.
70
+ * @return {number} The count.
71
+ */
72
+ function countEntries(list, key) {
73
+ if (key === '') {
74
+ return list.length
75
+ }
76
+ return list.reduce((sum, entry) => sum + (entry && Array.isArray(entry[key]) ? entry[key].length : 0), 0)
77
+ }
78
+
63
79
  /**
64
80
  * Format one token value.
65
81
  *
@@ -76,7 +92,7 @@ export function formatLongDate(value, now = new Date(), withYear = false) {
76
92
  function formatValue(value, format, now, arg = '', object = null, config = null, formatters = null) {
77
93
  // `{list|count}`: how many entries a list holds, nothing for an empty one.
78
94
  if (format === 'count') {
79
- const count = Array.isArray(value) ? value.length : Number(value)
95
+ const count = Array.isArray(value) ? countEntries(value, arg) : Number(value)
80
96
  return Number.isFinite(count) && count > 0 ? String(count) : ''
81
97
  }
82
98
  if (value === null || value === undefined || value === '' || typeof value === 'object') {
@@ -160,7 +176,8 @@ function formatValue(value, format, now, arg = '', object = null, config = null,
160
176
  * ("vandaag, 09.42"), `{path|ago}` says how long ago it was ("10 min
161
177
  * geleden", "vanochtend", "vrijdag"), and `{path|days}` is the
162
178
  * whole days since that date ("has waited {createdAt|days} days"),
163
- * `{path|count}` is how many entries a list holds (nothing for an empty one),
179
+ * `{path|count}` is how many entries a list holds (nothing for an empty one;
180
+ * `{path|count:key}` sums the `key` list of each entry),
164
181
  * `{path|lower}` writes the value in lower case ("Step 2: {statusLabel|lower}"
165
182
  * reads "Step 2: in progress" mid-sentence), and any other name is one of
166
183
  * the app's formatters, passed as `context.formatters` (`{id|caseAddress}`).