@conduction/nextcloud-vue 2.104.0 → 2.106.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 (224) hide show
  1. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue.js +1 -1
  2. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js.map +1 -1
  3. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js +1 -1
  4. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js.map +1 -1
  5. package/dist/esm/components/CnCardGrid/CnCardGrid.vue.js +1 -1
  6. package/dist/esm/components/CnCardGrid/CnCardGrid.vue2.js +18 -0
  7. package/dist/esm/components/CnCardGrid/CnCardGrid.vue2.js.map +1 -1
  8. package/dist/esm/components/CnCardGrid/CnCardGrid.vue3.js +3 -1
  9. package/dist/esm/components/CnCardGrid/CnCardGrid.vue3.js.map +1 -1
  10. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue.js +1 -1
  11. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +18 -0
  12. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
  13. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js +1 -1
  14. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
  15. package/dist/esm/components/CnChartWidget/CnChartWidget.vue.js +1 -1
  16. package/dist/esm/components/CnChartWidget/CnChartWidget.vue2.js +93 -1
  17. package/dist/esm/components/CnChartWidget/CnChartWidget.vue2.js.map +1 -1
  18. package/dist/esm/components/CnChartWidget/CnChartWidget.vue3.js.map +1 -1
  19. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue.js +1 -1
  20. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +6 -3
  21. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
  22. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +3 -3
  23. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
  24. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +112 -5
  25. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  26. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  27. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue.js +9 -0
  28. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue.js.map +1 -0
  29. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue2.js +24 -0
  30. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue2.js.map +1 -0
  31. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue3.js +49 -0
  32. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue3.js.map +1 -0
  33. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue.js +1 -1
  34. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js +36 -18
  35. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -1
  36. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js +17 -38
  37. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js.map +1 -1
  38. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js +1 -1
  39. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -1
  40. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -1
  41. package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue.js +1 -1
  42. package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue2.js +1 -1
  43. package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue2.js.map +1 -1
  44. package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue3.js.map +1 -1
  45. package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue.js +1 -1
  46. package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue2.js +2 -0
  47. package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue2.js.map +1 -1
  48. package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue3.js +32 -29
  49. package/dist/esm/components/CnFeaturesBoard/CnFeaturesBoard.vue3.js.map +1 -1
  50. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue.js +1 -1
  51. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +53 -2
  52. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
  53. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js +119 -111
  54. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
  55. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue.js +1 -1
  56. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue2.js +62 -1
  57. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue2.js.map +1 -1
  58. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue3.js.map +1 -1
  59. package/dist/esm/components/CnFlowsPage/CnFlowBoard.vue.js +1 -1
  60. package/dist/esm/components/CnFlowsPage/CnFlowBoard.vue2.js +73 -4
  61. package/dist/esm/components/CnFlowsPage/CnFlowBoard.vue2.js.map +1 -1
  62. package/dist/esm/components/CnFlowsPage/CnFlowBoard.vue3.js +74 -27
  63. package/dist/esm/components/CnFlowsPage/CnFlowBoard.vue3.js.map +1 -1
  64. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +208 -46
  65. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  66. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +121 -98
  67. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  68. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue.js +1 -1
  69. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue2.js +24 -0
  70. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue2.js.map +1 -1
  71. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue3.js +20 -4
  72. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue3.js.map +1 -1
  73. package/dist/esm/components/CnIndexPage/useSelfFetchList.js +25 -6
  74. package/dist/esm/components/CnIndexPage/useSelfFetchList.js.map +1 -1
  75. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js +112 -1
  76. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js.map +1 -1
  77. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue3.js +100 -44
  78. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue3.js.map +1 -1
  79. package/dist/esm/components/CnNcWidgetWidget/CnNcWidgetWidget.vue.js +1 -1
  80. package/dist/esm/components/CnNcWidgetWidget/CnNcWidgetWidget.vue2.js +67 -4
  81. package/dist/esm/components/CnNcWidgetWidget/CnNcWidgetWidget.vue2.js.map +1 -1
  82. package/dist/esm/components/CnNcWidgetWidget/CnNcWidgetWidget.vue3.js +1 -1
  83. package/dist/esm/components/CnNcWidgetWidget/CnNcWidgetWidget.vue3.js.map +1 -1
  84. package/dist/esm/components/CnNoticeWidget/CnNoticeWidget.vue.js +9 -0
  85. package/dist/esm/components/CnNoticeWidget/CnNoticeWidget.vue.js.map +1 -0
  86. package/dist/esm/components/CnNoticeWidget/CnNoticeWidget.vue2.js +88 -0
  87. package/dist/esm/components/CnNoticeWidget/CnNoticeWidget.vue2.js.map +1 -0
  88. package/dist/esm/components/CnNoticeWidget/CnNoticeWidget.vue3.js +39 -0
  89. package/dist/esm/components/CnNoticeWidget/CnNoticeWidget.vue3.js.map +1 -0
  90. package/dist/esm/components/CnObjectCard/CnObjectCard.vue.js +1 -1
  91. package/dist/esm/components/CnObjectCard/CnObjectCard.vue2.js +295 -12
  92. package/dist/esm/components/CnObjectCard/CnObjectCard.vue2.js.map +1 -1
  93. package/dist/esm/components/CnObjectCard/CnObjectCard.vue3.js +267 -144
  94. package/dist/esm/components/CnObjectCard/CnObjectCard.vue3.js.map +1 -1
  95. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue.js +1 -1
  96. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js +4 -0
  97. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js.map +1 -1
  98. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js +3 -1
  99. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js.map +1 -1
  100. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +1 -1
  101. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +93 -1
  102. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
  103. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js +322 -246
  104. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
  105. package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue.js +1 -1
  106. package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue2.js +122 -7
  107. package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue2.js.map +1 -1
  108. package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue3.js +189 -93
  109. package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue3.js.map +1 -1
  110. package/dist/esm/components/CnSettingsField/CnSettingsField.vue.js +1 -1
  111. package/dist/esm/components/CnSettingsField/CnSettingsField.vue2.js.map +1 -1
  112. package/dist/esm/components/CnSettingsField/CnSettingsField.vue3.js +3 -3
  113. package/dist/esm/components/CnSettingsField/CnSettingsField.vue3.js.map +1 -1
  114. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue.js +1 -1
  115. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue2.js.map +1 -1
  116. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue3.js +16 -4
  117. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue3.js.map +1 -1
  118. package/dist/esm/components/CnTabs/CnTabs.vue.js +1 -1
  119. package/dist/esm/components/CnTabs/CnTabs.vue2.js.map +1 -1
  120. package/dist/esm/components/CnTabs/CnTabs.vue3.js.map +1 -1
  121. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue.js +1 -1
  122. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +42 -0
  123. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
  124. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js +38 -19
  125. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
  126. package/dist/esm/components/CnTeamWorkloadWidget/CnTeamWorkloadWidget.vue.js +9 -0
  127. package/dist/esm/components/CnTeamWorkloadWidget/CnTeamWorkloadWidget.vue.js.map +1 -0
  128. package/dist/esm/components/CnTeamWorkloadWidget/CnTeamWorkloadWidget.vue2.js +258 -0
  129. package/dist/esm/components/CnTeamWorkloadWidget/CnTeamWorkloadWidget.vue2.js.map +1 -0
  130. package/dist/esm/components/CnTeamWorkloadWidget/CnTeamWorkloadWidget.vue3.js +69 -0
  131. package/dist/esm/components/CnTeamWorkloadWidget/CnTeamWorkloadWidget.vue3.js.map +1 -0
  132. package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue.js +1 -1
  133. package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue2.js +11 -0
  134. package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue2.js.map +1 -1
  135. package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue3.js +4 -4
  136. package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue3.js.map +1 -1
  137. package/dist/esm/components/CnWidgetGrid/builtInWidgets.js +16 -14
  138. package/dist/esm/components/CnWidgetGrid/builtInWidgets.js.map +1 -1
  139. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js +12 -0
  140. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js.map +1 -1
  141. package/dist/esm/index.js +2 -0
  142. package/dist/esm/index.js.map +1 -1
  143. package/dist/esm/l10n/en.json.js +24 -1
  144. package/dist/esm/l10n/en.json.js.map +1 -1
  145. package/dist/esm/l10n/nl.json.js +24 -1
  146. package/dist/esm/l10n/nl.json.js.map +1 -1
  147. package/dist/esm/library-style.js +1 -1
  148. package/dist/esm/nextcloud-vue.css +1369 -748
  149. package/dist/esm/utils/dueText.js +18 -3
  150. package/dist/esm/utils/dueText.js.map +1 -1
  151. package/dist/esm/utils/libraryWidgetKeys.js +2 -0
  152. package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
  153. package/dist/esm/utils/nextcloudApps.js +45 -0
  154. package/dist/esm/utils/nextcloudApps.js.map +1 -0
  155. package/dist/esm/utils/scopeListLayout.js +9 -2
  156. package/dist/esm/utils/scopeListLayout.js.map +1 -1
  157. package/dist/esm/utils/sortOrder.js +11 -1
  158. package/dist/esm/utils/sortOrder.js.map +1 -1
  159. package/dist/esm/utils/validateManifestV2.compiled.js +3 -3
  160. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  161. package/dist/esm/utils/visibleWhen.js +12 -4
  162. package/dist/esm/utils/visibleWhen.js.map +1 -1
  163. package/dist/nextcloud-vue.cjs.js +8965 -6497
  164. package/dist/nextcloud-vue.cjs.js.map +2 -2
  165. package/dist/nextcloud-vue.css +1369 -748
  166. package/l10n/en.json +24 -1
  167. package/l10n/nl.json +24 -1
  168. package/package.json +1 -1
  169. package/src/components/CnAdminSettingsShell/CnAdminSettingsShell.vue +1 -1
  170. package/src/components/CnCardGrid/CnCardGrid.md +2 -0
  171. package/src/components/CnCardGrid/CnCardGrid.vue +20 -0
  172. package/src/components/CnCellRenderer/CnCellRenderer.vue +19 -1
  173. package/src/components/CnChartWidget/CnChartWidget.md +2 -0
  174. package/src/components/CnChartWidget/CnChartWidget.vue +93 -1
  175. package/src/components/CnDashboardPage/CnDashboardPage.vue +9 -6
  176. package/src/components/CnDetailPage/CnDetailPage.md +3 -2
  177. package/src/components/CnDetailPage/CnDetailPage.vue +112 -5
  178. package/src/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue +60 -0
  179. package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +36 -29
  180. package/src/components/CnFactsWidget/CnFactsWidget.vue +4 -0
  181. package/src/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue +1 -1
  182. package/src/components/CnFeaturesBoard/CnFeaturesBoard.vue +4 -1
  183. package/src/components/CnFilesBrowser/CnFilesBrowser.vue +70 -4
  184. package/src/components/CnFlowRunsWidget/CnFlowRunsWidget.vue +62 -1
  185. package/src/components/CnFlowsPage/CnFlowBoard.vue +132 -8
  186. package/src/components/CnIndexPage/CnIndexPage.md +8 -5
  187. package/src/components/CnIndexPage/CnIndexPage.vue +236 -54
  188. package/src/components/CnIndexPage/CnIndexPageWidgets.vue +36 -1
  189. package/src/components/CnIndexPage/useSelfFetchList.js +25 -6
  190. package/src/components/CnIndexSidebar/CnIndexSidebar.md +2 -0
  191. package/src/components/CnIndexSidebar/CnIndexSidebar.vue +148 -1
  192. package/src/components/CnNcWidgetWidget/CnNcWidgetWidget.vue +68 -5
  193. package/src/components/CnNoticeWidget/CnNoticeWidget.vue +153 -0
  194. package/src/components/CnNoticeWidget/index.js +12 -0
  195. package/src/components/CnObjectCard/CnObjectCard.md +1 -0
  196. package/src/components/CnObjectCard/CnObjectCard.vue +354 -13
  197. package/src/components/CnObjectSidebar/CnFilesTab.vue +6 -0
  198. package/src/components/CnRecordListWidget/CnRecordListWidget.vue +190 -4
  199. package/src/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue +209 -9
  200. package/src/components/CnSettingsField/CnSettingsField.vue +4 -1
  201. package/src/components/CnSetupWizard/CnSetupWizard.vue +9 -1
  202. package/src/components/CnTabs/CnTabs.vue +11 -0
  203. package/src/components/CnTabsWidget/CnTabsWidget.vue +91 -18
  204. package/src/components/CnTeamWorkloadWidget/CnTeamWorkloadWidget.md +11 -0
  205. package/src/components/CnTeamWorkloadWidget/CnTeamWorkloadWidget.vue +382 -0
  206. package/src/components/CnTeamWorkloadWidget/index.js +14 -0
  207. package/src/components/CnVersionInfoCard/CnVersionInfoCard.vue +15 -4
  208. package/src/components/CnWidgetGrid/builtInWidgets.js +2 -0
  209. package/src/components/CnWidgetGrid/registerDashboardWidgets.js +12 -0
  210. package/src/components/index.js +2 -0
  211. package/src/css/dialog.css +20 -2
  212. package/src/css/index-page.css +14 -2
  213. package/src/css/look-board-detail.css +125 -8
  214. package/src/css/look-board-index.css +100 -4
  215. package/src/css/look-board.css +122 -14
  216. package/src/index.js +2 -1
  217. package/src/schemas/app-manifest-v2.schema.json +110 -8
  218. package/src/utils/dueText.js +18 -3
  219. package/src/utils/libraryWidgetKeys.js +2 -0
  220. package/src/utils/nextcloudApps.js +50 -0
  221. package/src/utils/scopeListLayout.js +9 -2
  222. package/src/utils/sortOrder.js +10 -0
  223. package/src/utils/validateManifestV2.compiled.js +3 -3
  224. package/src/utils/visibleWhen.js +12 -4
@@ -13,7 +13,11 @@
13
13
  * --cn-dialog-eyebrow-tracking letter spacing; 0 by default, 0.06em suits capitals
14
14
  */
15
15
 
16
+ /* The nldesign theme sets a dialog's radius with `!important` through its
17
+ dialog radius token, so the board's 12px goes to that token.
18
+ @spec openspec/changes/board-dialog-theme/specs/board-dialog-theme/spec.md#requirement-a-board-dialog-keeps-its-frame-and-inset-under-a-theme */
16
19
  .cn-dialog-board {
20
+ --nldesign-component-dialog-border-radius: var(--cn-board-card-radius, 12px);
17
21
  --cn-dialog-width: 640px;
18
22
  --cn-dialog-danger: var(--color-error);
19
23
  --cn-dialog-eyebrow-color: var(--color-primary-element-text, var(--color-main-text));
@@ -26,16 +30,26 @@
26
30
  background-color: color-mix(in srgb, var(--color-main-text) 45%, transparent);
27
31
  }
28
32
 
29
- /* Width by role, capped at the viewport minus a 16px gutter each side. */
33
+ /* Width by role, capped at the viewport minus a 16px gutter each side. The
34
+ shadow carries `!important`: the nldesign theme removes every
35
+ `.modal-container`'s shadow with `!important` and offers no token for it. */
30
36
  .modal-mask.cn-dialog-board .modal-wrapper--normal > .modal-container,
31
37
  .modal-mask.cn-dialog-board .modal-wrapper .modal-container {
32
38
  width: var(--cn-dialog-width);
33
39
  max-width: min(var(--cn-dialog-width), calc(100% - 32px));
34
40
  border-radius: var(--cn-board-card-radius, 12px);
35
- box-shadow: 0 12px 40px color-mix(in srgb, var(--color-main-text) 28%, transparent);
41
+ box-shadow: 0 12px 40px color-mix(in srgb, var(--color-main-text) 28%, transparent) !important;
36
42
  overflow: hidden;
37
43
  }
38
44
 
45
+ /* The board's header and body carry their own 24px inset. NcDialog pads its
46
+ container 4px at the top and 12px at the start, which put the title and
47
+ the fields 36px in; its rule outranked the one above through the scoped
48
+ `.dialog__modal[data-v-…]`, so this one names the class too. */
49
+ .modal-mask.cn-dialog-board.dialog__modal .modal-wrapper .modal-container {
50
+ padding: 0;
51
+ }
52
+
39
53
  /* The header is ours: NcModal's own close button and NcDialog's heading give
40
54
  way (the heading stays as the accessible name, visually hidden). The mask
41
55
  class raises the rule above NcButton's `.button-vue[data-v-…]`, whose
@@ -269,6 +283,10 @@
269
283
  border-radius: 16px 16px 0 0;
270
284
  }
271
285
 
286
+ .cn-dialog-board {
287
+ --nldesign-component-dialog-border-radius: 16px 16px 0 0;
288
+ }
289
+
272
290
  .modal-mask.cn-dialog-board .modal-container::before {
273
291
  content: '';
274
292
  display: block;
@@ -411,11 +411,12 @@
411
411
  .cn-index-page--with-side-panel {
412
412
  display: grid;
413
413
  grid-template-columns: minmax(0, 1fr) var(--cn-index-side-panel-width, 300px);
414
- grid-template-rows: auto auto auto auto minmax(0, 1fr) auto;
414
+ grid-template-rows: auto auto auto auto auto minmax(0, 1fr) auto;
415
415
  grid-template-areas:
416
416
  "head head"
417
417
  "below below"
418
418
  "stats stats"
419
+ "chips side"
419
420
  "bar side"
420
421
  "body side"
421
422
  "extra extra";
@@ -444,6 +445,10 @@
444
445
  grid-area: bar;
445
446
  }
446
447
 
448
+ .cn-index-page--with-side-panel > .cn-index-page__quick-filter-row {
449
+ grid-area: chips;
450
+ }
451
+
447
452
  .cn-index-page--with-side-panel > .cn-index-page__body {
448
453
  grid-area: body;
449
454
  }
@@ -461,10 +466,11 @@
461
466
  "below"
462
467
  "stats"
463
468
  "side"
469
+ "chips"
464
470
  "bar"
465
471
  "body"
466
472
  "extra";
467
- grid-template-rows: auto auto auto auto auto minmax(0, 1fr) auto;
473
+ grid-template-rows: auto auto auto auto auto auto minmax(0, 1fr) auto;
468
474
  }
469
475
 
470
476
  .cn-index-page--with-side-panel > .cn-index-page__side-panel {
@@ -472,6 +478,12 @@
472
478
  }
473
479
  }
474
480
 
481
+ /* `quickFilterPlacement: "row"` (DqTeamwachtrij): the chips on a row of
482
+ their own above the toolbar, wrapping onto more lines. */
483
+ .cn-index-page__quick-filter-row {
484
+ margin-bottom: 12px;
485
+ }
486
+
475
487
  /* The second filter strip (`filterStrip`, board PqWachtrij "Kanaal"): 34px
476
488
  pills, radius 17, the active one in ink, each with a muted count. */
477
489
  .cn-index-page__filter-strip {
@@ -25,7 +25,7 @@
25
25
  /* ---- The header: two rows on the ground ------------------------------- */
26
26
 
27
27
  .cn-look-board .cn-detail-page__header--board {
28
- align-items: center;
28
+ align-items: flex-start;
29
29
  column-gap: 16px;
30
30
  flex-wrap: wrap;
31
31
  margin-bottom: 22px;
@@ -33,10 +33,16 @@
33
33
  row-gap: 6px;
34
34
  }
35
35
 
36
- /* Row 1: the title takes what the buttons leave, from a 320px basis. */
36
+ /* Row 1: the title takes what the buttons leave, from a zero basis, and the
37
+ buttons sit at the row's top beside it (DqZaak: both at 96). From a 320px
38
+ basis the title and its follow control claimed the row first, so on a 960px
39
+ header the buttons centred against a two-line title, and below that they
40
+ dropped to a row of their own. Only when less than 16rem of title fits
41
+ beside the buttons do they still wrap.
42
+ @spec openspec/changes/board-detail-header-row/specs/board-detail-header-row/spec.md#requirement-the-board-detail-header-keeps-its-actions-on-the-title-row */
37
43
  .cn-look-board .cn-detail-page__header--board > :first-child {
38
- flex: 1 1 320px;
39
- min-width: 0;
44
+ flex: 1 1 0;
45
+ min-width: min(100%, 16rem);
40
46
  }
41
47
 
42
48
  .cn-look-board .cn-detail-page__header--board .cn-detail-page__title {
@@ -58,6 +64,44 @@
58
64
  min-height: var(--cn-board-control-height);
59
65
  }
60
66
 
67
+ /* The quick actions, Edit and the Meer menu are the board's neutral buttons
68
+ (DqZaak): the main background, a grey border, the main text at 600. They
69
+ outrank a theme that gives every secondary button a primary outline with
70
+ `!important` (nldesign), as the index header does. The buildiq square and
71
+ the primary button keep their own rules. */
72
+ .cn-look-board .cn-detail-page .cn-detail-page__header-actions > .button-vue--secondary,
73
+ .cn-look-board .cn-detail-page .cn-detail-page__header-actions .action-item--secondary .action-item__menutoggle {
74
+ --nldesign-color-on-surface: var(--color-main-text);
75
+ height: var(--cn-board-control-height) !important;
76
+ min-height: var(--cn-board-control-height) !important;
77
+ padding: 0 14px !important;
78
+ border: 1px solid var(--color-border-dark) !important;
79
+ border-radius: var(--cn-board-control-radius) !important;
80
+ background: var(--color-main-background) !important;
81
+ color: var(--color-main-text) !important;
82
+ font-size: 14px !important;
83
+ font-weight: 600 !important;
84
+ }
85
+
86
+ .cn-look-board .cn-detail-page .cn-detail-page__header-actions > .button-vue--secondary:hover,
87
+ .cn-look-board .cn-detail-page .cn-detail-page__header-actions .action-item--secondary .action-item__menutoggle:hover {
88
+ background: var(--color-background-hover) !important;
89
+ }
90
+
91
+ /* Each header icon is 16px with 8px to its label; NcButton draws 20px in a 30px slot. */
92
+ .cn-look-board .cn-detail-page .cn-detail-page__header-actions > .button-vue--secondary .button-vue__icon {
93
+ width: 16px;
94
+ min-width: 16px;
95
+ height: 16px;
96
+ min-height: 16px;
97
+ margin-inline-end: 8px;
98
+ }
99
+
100
+ .cn-look-board .cn-detail-page .cn-detail-page__header-actions > .button-vue--secondary .button-vue__icon svg {
101
+ width: 16px;
102
+ height: 16px;
103
+ }
104
+
61
105
  /* Row 2: pills, breadcrumb, dot, meta, chips. */
62
106
  .cn-look-board .cn-detail-page__header-row2 {
63
107
  align-items: center;
@@ -203,6 +247,58 @@
203
247
  width: auto;
204
248
  }
205
249
 
250
+ /* ---- The follow pill (DqZaak "Volgen") ---------------------------------- */
251
+ /* The board draws the follow control under the title as a 28px pill: 13px
252
+ text at 600 on the main background, a grey border, a 14px icon 6px from its
253
+ label. Live it was Nextcloud's 34px tertiary button, 15px bold in the
254
+ primary colour. The theme tokens carry the weight and radius past the
255
+ nldesign theme's `!important`; the follower count takes the same pill.
256
+ @spec openspec/changes/board-follow-pill/specs/board-follow-pill/spec.md#requirement-the-board-follow-control-is-a-pill */
257
+ .cn-look-board .cn-detail-page .cn-follow-toggle .button-vue {
258
+ --nldesign-component-button-font-weight: 600;
259
+ --nldesign-component-button-border-radius: 14px;
260
+ --nldesign-component-button-secondary-action-color: var(--color-main-text);
261
+ --nldesign-component-button-secondary-action-background-color: var(--color-main-background);
262
+ --nldesign-component-button-secondary-action-border-color: var(--color-border-dark);
263
+ --nldesign-component-button-secondary-action-hover-background-color: var(--color-background-hover);
264
+ box-sizing: border-box;
265
+ height: 28px;
266
+ min-height: 28px;
267
+ min-width: 0;
268
+ padding: 0 10px;
269
+ border: 1px solid var(--color-border-dark);
270
+ border-radius: 14px;
271
+ background: var(--color-main-background);
272
+ color: var(--color-main-text);
273
+ font-size: 13px;
274
+ }
275
+
276
+ .cn-look-board .cn-detail-page .cn-follow-toggle .button-vue:hover {
277
+ background: var(--color-background-hover);
278
+ }
279
+
280
+ .cn-look-board .cn-detail-page .cn-follow-toggle .button-vue .button-vue__wrapper {
281
+ gap: 6px;
282
+ }
283
+
284
+ .cn-look-board .cn-detail-page .cn-follow-toggle .button-vue .button-vue__icon {
285
+ width: 14px;
286
+ min-width: 14px;
287
+ height: 14px;
288
+ min-height: 14px;
289
+ color: var(--color-main-text);
290
+ }
291
+
292
+ .cn-look-board .cn-detail-page .cn-follow-toggle .button-vue .button-vue__icon svg {
293
+ width: 14px;
294
+ height: 14px;
295
+ }
296
+
297
+ .cn-look-board .cn-detail-page .cn-follow-toggle .button-vue .button-vue__text {
298
+ margin: 0;
299
+ padding: 0;
300
+ }
301
+
206
302
  /* ---- Folder tabs ------------------------------------------------------- */
207
303
 
208
304
  /* The strip draws no line of its own (design-system pull request 147). The card under it
@@ -222,7 +318,7 @@
222
318
  }
223
319
 
224
320
  /* Tabs sit on the card's top edge; only the open tab reaches 1px further
225
- down (min-height 35px below), over the card's top border. Top-aligned so
321
+ down (min-height 38px below), over the card's top border. Top-aligned so
226
322
  the inactive tabs do not stretch to the open tab's height. */
227
323
  .cn-look-board .cn-tabs--board .cn-tabs__nav {
228
324
  align-items: flex-start;
@@ -256,8 +352,15 @@
256
352
 
257
353
  /* `margin: 0`: a tab is a <button>, and Nextcloud's core stylesheet gives
258
354
  every `button:not(.button-vue)` `margin: 3px 3px 3px 0`, which put the strip
259
- 3px low and the tabs 7px apart instead of 4 (DqZaak "Zaakonderdelen"). */
355
+ 3px low and the tabs 7px apart instead of 4 (DqZaak "Zaakonderdelen").
356
+ The nldesign theme sets every button's weight and radius with `!important`
357
+ through its button tokens, which drew every tab bold with four rounded
358
+ corners; the tab hands the board's values to those tokens. A tab is 37px
359
+ with or without a count (DqZaak), not 34px without one.
360
+ @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 */
260
361
  .cn-look-board .cn-tabs--board .cn-tabs__nav-item {
362
+ --nldesign-component-button-font-weight: 400;
363
+ --nldesign-component-button-border-radius: 8px 8px 0 0;
261
364
  background-color: var(--color-background-dark);
262
365
  border: 1px solid var(--color-border-dark);
263
366
  border-bottom: none;
@@ -265,17 +368,18 @@
265
368
  font-size: 14px;
266
369
  font-weight: 400;
267
370
  margin: 0;
268
- min-height: 34px;
371
+ min-height: 37px;
269
372
  padding: 8px 12px;
270
373
  }
271
374
 
272
375
  /* The open tab: the panel's colour, bold, and no coloured top edge. */
273
376
  .cn-look-board .cn-tabs--board .cn-tabs__nav-item.cn-tabs__nav-item--active {
377
+ --nldesign-component-button-font-weight: 700;
274
378
  background-color: var(--color-main-background);
275
379
  border-bottom: 1px solid var(--color-main-background);
276
380
  border-top: 1px solid var(--color-border-dark);
277
381
  font-weight: 700;
278
- min-height: 35px;
382
+ min-height: 38px;
279
383
  padding-bottom: 9px;
280
384
  padding-top: 8px;
281
385
  position: relative;
@@ -456,6 +560,19 @@
456
560
  padding: 10px 22px 20px;
457
561
  }
458
562
 
563
+ /* A stat tile in a side card (DqZaak "Termijn") sits on the card's inset as
564
+ the board draws it. The card-fit wrapper is flush, and the wrapper's own
565
+ flush rule loads after this sheet and outranked the side card's padding,
566
+ so the value sat 11px from the card's edge instead of 23px.
567
+ @spec openspec/changes/board-dashboard-widget-inset/specs/board-dashboard-widget-inset/spec.md#requirement-a-stat-tile-in-a-detail-side-card-keeps-the-cards-inset */
568
+ .cn-look-board .cn-detail-page__side .cn-detail-page__card-fit > .cn-widget-wrapper__content:has(> .cn-kpi-card--board) {
569
+ padding: 10px 22px 20px;
570
+ }
571
+
572
+ .cn-look-board .cn-detail-page__side .cn-detail-page__card-fit > .cn-widget-wrapper__content > .cn-kpi-card--board {
573
+ padding: 0;
574
+ }
575
+
459
576
  /* No Actions menu on a side card. */
460
577
  .cn-look-board .cn-detail-page__side .cn-widget-wrapper__actions {
461
578
  display: none;
@@ -10,12 +10,16 @@
10
10
 
11
11
  /* ------------------------------------------------------------------ header */
12
12
 
13
- /* Row 1: the h1 and the buttons at its end. Row 2: the count line, 6px under. */
13
+ /* Row 1: the h1 and the buttons at its end, both at the row's top. Row 2:
14
+ the count line, 6px under. The header starts 4px under the content's top
15
+ (DqZaken: the title at 96, the count line at 142).
16
+ @spec openspec/changes/board-page-header-top/specs/board-page-header-top/spec.md#requirement-a-board-page-title-sits-4px-under-the-content-top */
14
17
  .cn-look-board .cn-index-page .cn-page-header {
15
18
  display: grid;
16
19
  grid-template-columns: minmax(0, 1fr) auto;
17
- align-items: center;
20
+ align-items: start;
18
21
  row-gap: 6px;
22
+ padding-top: 4px;
19
23
  margin-bottom: var(--cn-board-section-gap, 20px);
20
24
  }
21
25
 
@@ -163,8 +167,15 @@
163
167
  gap: 8px;
164
168
  }
165
169
 
170
+ /* A chip is a <button>: the nldesign theme sets every button's radius and
171
+ weight with `!important` through its button tokens, which drew the chips
172
+ as 8px boxes at 700 (DqTeamwachtrij), so the chip hands its pill radius and
173
+ 600 to those tokens.
174
+ @spec openspec/changes/board-chips-theme/specs/board-chips-theme/spec.md#requirement-board-chips-stay-pills-under-a-theme */
166
175
  .cn-look-board .cn-saved-views__chips .cn-saved-views__chip,
167
176
  .cn-look-board .cn-quick-filter-bar .cn-quick-filter-bar__tab {
177
+ --nldesign-component-button-border-radius: 19px;
178
+ --nldesign-component-button-font-weight: 600;
168
179
  display: inline-flex;
169
180
  align-items: center;
170
181
  gap: 8px;
@@ -267,12 +278,30 @@
267
278
  padding: 0;
268
279
  }
269
280
 
270
- /* Filter: a labelled secondary button, 36px, radius 8, with the active count. */
281
+ /* The toolbar's buttons are the board's neutral control (DqTeamwachtrij
282
+ "Filter"): the main text at 600 on the main background with a grey border.
283
+ The nldesign theme paints a secondary button in the primary colour with
284
+ `!important` through its button tokens, so the bar hands the board's values
285
+ to those tokens.
286
+ @spec openspec/changes/board-toolbar-buttons-theme/specs/board-toolbar-buttons-theme/spec.md#requirement-board-toolbar-buttons-are-neutral-under-a-theme */
287
+ .cn-look-board .cn-actions-bar:not(.cn-look-nextcloud *) {
288
+ --nldesign-component-button-font-weight: 600;
289
+ --nldesign-component-button-secondary-action-color: var(--color-main-text);
290
+ --nldesign-component-button-secondary-action-background-color: var(--color-main-background);
291
+ --nldesign-component-button-secondary-action-border-color: var(--color-border-dark);
292
+ --nldesign-component-button-secondary-action-hover-background-color: var(--color-background-hover);
293
+ }
294
+
295
+ /* Filter: a labelled secondary button, 36px, radius 8, 12px at both sides
296
+ and 14px text, with the active count. NcButton with an icon pads its start
297
+ 4px and sets 15px. */
271
298
  .cn-look-board .cn-actions-bar__filter-button.button-vue,
272
299
  .cn-look-board .cn-actions-bar__filter-menu .button-vue {
273
300
  min-height: 36px;
274
301
  height: 36px;
302
+ padding: 0 12px;
275
303
  border-radius: 8px;
304
+ font-size: 14px;
276
305
  font-weight: 600;
277
306
  }
278
307
 
@@ -513,9 +542,18 @@
513
542
 
514
543
  /* The header row is near-white on the boards (#fafbfc), not the hover grey,
515
544
  its labels 14px muted. The ink also goes to --nldesign-color-on-surface,
516
- which a theme that forces the body ink onto every span (thematiq) reads. */
545
+ which a theme that forces the body ink onto every span (thematiq) reads.
546
+ The nldesign theme paints every `th` with `!important` through its table
547
+ header tokens, and the sort button in it through its button weight token
548
+ (bold), so the cell hands the board's ground, ink and weight to those
549
+ tokens too.
550
+ @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 */
517
551
  .cn-look-board .cn-table-container--board .cn-data-table th {
518
552
  --nldesign-color-on-surface: var(--color-text-maxcontrast);
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)));
554
+ --nldesign-component-table-header-color: var(--color-text-maxcontrast);
555
+ --nldesign-component-table-header-font-weight: 600;
556
+ --nldesign-component-button-font-weight: 600;
519
557
  padding: 12px 16px;
520
558
  border-bottom: 0;
521
559
  background: var(--cn-board-table-head-bg, color-mix(in srgb, var(--color-background-hover) 40%, var(--color-main-background)));
@@ -1023,6 +1061,64 @@
1023
1061
  border-radius: 8px;
1024
1062
  }
1025
1063
 
1064
+ /* The record layout (`config.cardLayout`, DqAanMijToegewezen): a 20px 22px
1065
+ inset, 10px between its parts; the head pill at the start and the number
1066
+ in 13px muted at the end; a 17px bold title, not underlined; a 14px muted
1067
+ meta line; a footer over a hairline with a pill and the 14px semibold date.
1068
+ @spec openspec/changes/board-record-card-layout/specs/board-record-card-layout/spec.md#requirement-a-board-card-can-draw-the-record-layout-from-config */
1069
+ .cn-look-board .cn-object-card.cn-object-card--board:has(> .cn-object-card__record) {
1070
+ padding: 20px 22px;
1071
+ }
1072
+
1073
+ .cn-look-board .cn-object-card--board .cn-object-card__record {
1074
+ gap: 10px;
1075
+ }
1076
+
1077
+ .cn-look-board .cn-object-card--board .cn-object-card__record-head {
1078
+ display: flex;
1079
+ align-items: center;
1080
+ gap: 8px;
1081
+ min-height: 24px;
1082
+ }
1083
+
1084
+ .cn-look-board .cn-object-card--board .cn-object-card__record-number {
1085
+ margin-inline-start: auto;
1086
+ color: var(--color-text-maxcontrast);
1087
+ font-size: 13px;
1088
+ }
1089
+
1090
+ .cn-look-board .cn-object-card--board .cn-object-card__record .cn-object-card__title {
1091
+ margin: 0;
1092
+ font-size: 17px;
1093
+ font-weight: 700;
1094
+ line-height: 1.3;
1095
+ text-decoration: none;
1096
+ white-space: normal;
1097
+ }
1098
+
1099
+ .cn-look-board .cn-object-card--board .cn-object-card__record-meta {
1100
+ margin: 0;
1101
+ color: var(--color-text-maxcontrast);
1102
+ font-size: 14px;
1103
+ }
1104
+
1105
+ .cn-look-board .cn-object-card--board .cn-object-card__record-foot {
1106
+ display: flex;
1107
+ align-items: center;
1108
+ justify-content: space-between;
1109
+ gap: 8px;
1110
+ margin-top: auto;
1111
+ padding-top: 10px;
1112
+ border-top: 1px solid var(--cn-board-hairline);
1113
+ }
1114
+
1115
+ .cn-look-board .cn-object-card--board .cn-object-card__record-date {
1116
+ margin-inline-start: auto;
1117
+ color: var(--color-main-text);
1118
+ font-size: 14px;
1119
+ font-weight: 600;
1120
+ }
1121
+
1026
1122
  /* The catalogue card of the store page. */
1027
1123
  .cn-look-board .cn-store-page__card.cn-store-page__card--board {
1028
1124
  gap: 10px;
@@ -27,6 +27,8 @@
27
27
  /* Cards. */
28
28
  --cn-board-card-radius: 12px;
29
29
  --cn-board-card-padding: 20px 22px;
30
+ /* The side inset of a dashboard card: its title and its rows. */
31
+ --cn-board-dashboard-card-inset: 24px;
30
32
  /* Hairline inside a card, and the soft secondary text. */
31
33
  --cn-board-hairline: var(--color-border);
32
34
  --cn-board-text-soft: var(--color-main-text);
@@ -56,6 +58,23 @@
56
58
  margin-inline: 0;
57
59
  }
58
60
 
61
+ /* The page shows the content area's ground (the theme's content surface,
62
+ light grey on the boards) and draws none of its own; only its cards are
63
+ white. A theme rule that paints every `[class*="panel"]` with the main
64
+ background (the nldesign theme's element overrides) caught an index page
65
+ with a side panel (`cn-index-page--with-side-panel`) and drew the whole
66
+ page white (DqTeamwachtrij). That rule carries an id through
67
+ `:not(#header *)`, so this one names an id in `:not()` to outrank it.
68
+ @spec openspec/changes/board-page-ground/specs/board-page-ground/spec.md#requirement-a-board-page-draws-no-ground-of-its-own */
69
+ .cn-look-board .cn-index-page:not(#cn-board-page-ground):not(.cn-look-nextcloud *),
70
+ .cn-look-board .cn-detail-page:not(#cn-board-page-ground):not(.cn-look-nextcloud *),
71
+ .cn-look-board .cn-dashboard-page:not(#cn-board-page-ground):not(.cn-look-nextcloud *),
72
+ .cn-look-board .cn-settings-page:not(#cn-board-page-ground):not(.cn-look-nextcloud *),
73
+ .cn-look-board .cn-store-page:not(#cn-board-page-ground):not(.cn-look-nextcloud *),
74
+ .cn-look-board .cn-admin-settings-shell:not(#cn-board-page-ground):not(.cn-look-nextcloud *) {
75
+ background-color: transparent;
76
+ }
77
+
59
78
  .cn-look-board .cn-index-page:not(.cn-look-nextcloud *),
60
79
  .cn-look-board .cn-settings-page:not(.cn-look-nextcloud *) {
61
80
  gap: var(--cn-board-section-gap);
@@ -82,6 +101,15 @@
82
101
  margin-bottom: var(--cn-board-section-gap);
83
102
  }
84
103
 
104
+ /* The boards start a page's header 4px under the content's top, so the title
105
+ sits at 96 (DqZaak, DqMijnWerk), not 92. The index page's header carries
106
+ the same inset in look-board-index.css.
107
+ @spec openspec/changes/board-page-header-top/specs/board-page-header-top/spec.md#requirement-a-board-page-title-sits-4px-under-the-content-top */
108
+ .cn-look-board .cn-detail-page:not(.cn-look-nextcloud *) .cn-detail-page__header,
109
+ .cn-look-board .cn-dashboard-page:not(.cn-look-nextcloud *) .cn-dashboard-page__header {
110
+ padding-top: 4px;
111
+ }
112
+
85
113
  /* The 56px inset clears the navigation toggle, which overlays the content
86
114
  only while the navigation is closed. The store page's own header too: it
87
115
  kept the inset with the navigation open, 56px right of the board's title. */
@@ -121,7 +149,7 @@
121
149
  .cn-look-board .cn-dashboard-page:not(.cn-look-nextcloud *) .cn-dashboard-page__title-row {
122
150
  grid-column: 1;
123
151
  grid-row: 1;
124
- align-self: center;
152
+ align-self: start;
125
153
  }
126
154
 
127
155
  .cn-look-board .cn-dashboard-page:not(.cn-look-nextcloud *) .cn-dashboard-page__header-left > :not(.cn-dashboard-page__title-row) {
@@ -155,6 +183,27 @@
155
183
  gap: 10px;
156
184
  }
157
185
 
186
+ /* The nldesign theme paints every primary and secondary button with
187
+ `!important` through its button tokens: weight 700, and a secondary in
188
+ the primary colour with a primary border on no ground. The board draws
189
+ header buttons at 600, the secondary on the main background with a grey
190
+ border (DqMijnWerk, DqZaak, DqZaken). The look hands the theme those values
191
+ through the same tokens, so the theme's own rules draw the board's button.
192
+ @spec openspec/changes/board-header-buttons-theme/specs/board-header-buttons-theme/spec.md#requirement-board-header-buttons-keep-the-boards-weight-and-ground-under-a-theme */
193
+ .cn-look-board .cn-index-page__header-buttons:not(.cn-look-nextcloud *),
194
+ .cn-look-board .cn-detail-page__header-actions:not(.cn-look-nextcloud *),
195
+ .cn-look-board .cn-dashboard-page__header-actions:not(.cn-look-nextcloud *),
196
+ .cn-look-board .cn-settings-page__header-buttons:not(.cn-look-nextcloud *),
197
+ .cn-look-board .cn-admin-settings-shell__header-buttons:not(.cn-look-nextcloud *),
198
+ .cn-look-board .cn-action-buttons:not(.cn-look-nextcloud *) {
199
+ --nldesign-component-button-font-weight: 600;
200
+ --nldesign-component-button-primary-action-font-weight: 600;
201
+ --nldesign-component-button-secondary-action-color: var(--color-main-text);
202
+ --nldesign-component-button-secondary-action-background-color: var(--color-main-background);
203
+ --nldesign-component-button-secondary-action-border-color: var(--color-border-dark);
204
+ --nldesign-component-button-secondary-action-hover-background-color: var(--color-background-hover);
205
+ }
206
+
158
207
  .cn-look-board .cn-index-page__header-buttons:not(.cn-look-nextcloud *) .button-vue,
159
208
  .cn-look-board .cn-detail-page__header-actions:not(.cn-look-nextcloud *) .button-vue,
160
209
  .cn-look-board .cn-dashboard-page__header-actions:not(.cn-look-nextcloud *) .button-vue,
@@ -610,6 +659,7 @@
610
659
  }
611
660
 
612
661
  .cn-look-board .cn-admin-settings-shell__title:not(.cn-look-nextcloud *) {
662
+ min-height: var(--cn-board-control-height);
613
663
  margin: 0;
614
664
  font-size: 28px;
615
665
  font-weight: 700;
@@ -622,10 +672,23 @@
622
672
  align-items: center;
623
673
  gap: 8px;
624
674
  margin-top: 6px;
625
- font-size: 15px;
675
+ font-size: 14px;
676
+ line-height: normal;
626
677
  color: var(--color-text-maxcontrast);
627
678
  }
628
679
 
680
+ /* The admin settings header as the board draws it (DqInstellingen): 4px
681
+ under the content's top and 8px above the grid's gap, the crumbs 6px under
682
+ the 40px title row in 14px, and the tab strip 20px under the header (at
683
+ 187). The shell is a grid whose gap already spaces its rows, so the
684
+ header's own 20px bottom margin came on top of it and the strip sat at 194.
685
+ @spec openspec/changes/board-admin-settings-header-rhythm/specs/board-admin-settings-header-rhythm/spec.md#requirement-the-board-admin-settings-header-keeps-the-boards-rhythm */
686
+ .cn-look-board .cn-admin-settings-shell:not(.cn-look-nextcloud *) > .cn-admin-settings-shell__header,
687
+ .cn-look-board.cn-admin-settings-shell:not(.cn-look-nextcloud *) > .cn-admin-settings-shell__header {
688
+ margin-bottom: 0;
689
+ padding: 4px 0 8px;
690
+ }
691
+
629
692
  .cn-look-board .cn-admin-settings-shell__crumb-list:not(.cn-look-nextcloud *) {
630
693
  display: flex;
631
694
  flex-wrap: wrap;
@@ -1158,6 +1221,20 @@
1158
1221
  line-height: 1.3;
1159
1222
  }
1160
1223
 
1224
+ /* The board draws no rule under a dashboard card's title (DqMijnWerk,
1225
+ DqDashboard, PqMijnWerk): the title sits 20px from the card's top and on
1226
+ the card's 24px side inset, the line its rows start on, 12px above the
1227
+ content. A borderless card has no edge to inset from and keeps the
1228
+ wrapper's padding.
1229
+ @spec openspec/changes/board-dashboard-card-header/specs/board-dashboard-card-header/spec.md#requirement-a-board-dashboard-card-draws-no-header-rule */
1230
+ .cn-look-board .cn-dashboard-page:not(.cn-look-nextcloud *) .cn-widget-wrapper:not(.cn-widget-wrapper--nc-dashboard) .cn-widget-wrapper__header {
1231
+ border-bottom: none;
1232
+ }
1233
+
1234
+ .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 {
1235
+ padding: 20px var(--cn-board-dashboard-card-inset) 12px;
1236
+ }
1237
+
1161
1238
  /* ---- Record list on a dashboard card (PtDashboard) ---------------------- */
1162
1239
  /* The dashboard's card body is flush, so the rows carry their own inset: the
1163
1240
  board's card pads 24px at the sides and each row 14px, a soft hairline
@@ -1274,6 +1351,47 @@
1274
1351
  display: none;
1275
1352
  }
1276
1353
 
1354
+ /* ---- Widgets that drew their rows on the card's edge -------------------- */
1355
+ /* The card body is flush, so a widget carries the card's side inset itself,
1356
+ as the record list and saved views do. Without it the task list's
1357
+ checkboxes, the step bar and its legend, the week strip's days, the bar
1358
+ list and the activity items started on the card's edge, and a table's
1359
+ first column 16px in (DqMijnWerk "Mijn taken", "Mijn 14 zaken per stap",
1360
+ "Termijnen deze week", "Recente activiteit"; DqDashboard "Zaken per
1361
+ status", "Vastgelopen zaken"). The top inset is 4px: with the header's
1362
+ 12px it is the board's 16px from title to bar. This also replaces the
1363
+ step bar's and week strip's opt-in `content.inset` on a board dashboard.
1364
+ A borderless card stands on the page ground and keeps its rows flush.
1365
+ @spec openspec/changes/board-dashboard-widget-inset/specs/board-dashboard-widget-inset/spec.md#requirement-a-board-dashboard-widget-keeps-the-cards-side-inset */
1366
+ .cn-look-board .cn-dashboard-page:not(.cn-look-nextcloud *) .cn-widget-wrapper:not(.cn-widget-wrapper--borderless) .cn-tasks-widget {
1367
+ padding: 0 var(--cn-board-dashboard-card-inset) 10px;
1368
+ }
1369
+
1370
+ .cn-look-board .cn-dashboard-page:not(.cn-look-nextcloud *) .cn-widget-wrapper:not(.cn-widget-wrapper--borderless) .cn-stacked-bar,
1371
+ .cn-look-board .cn-dashboard-page:not(.cn-look-nextcloud *) .cn-widget-wrapper:not(.cn-widget-wrapper--borderless) .cn-week-strip {
1372
+ box-sizing: border-box;
1373
+ padding: 4px var(--cn-board-dashboard-card-inset) 22px;
1374
+ }
1375
+
1376
+ .cn-look-board .cn-dashboard-page:not(.cn-look-nextcloud *) .cn-widget-wrapper:not(.cn-widget-wrapper--borderless) .cn-chart-widget__html {
1377
+ padding: 4px var(--cn-board-dashboard-card-inset) 20px;
1378
+ }
1379
+
1380
+ /* An activity item pads itself 4px, so the body takes 4px less. */
1381
+ .cn-look-board .cn-dashboard-page:not(.cn-look-nextcloud *) .cn-widget-wrapper:not(.cn-widget-wrapper--borderless) .cn-nc-widget-widget__body {
1382
+ padding: 0 calc(var(--cn-board-dashboard-card-inset) - 4px) 16px;
1383
+ }
1384
+
1385
+ .cn-look-board .cn-dashboard-page:not(.cn-look-nextcloud *) .cn-widget-wrapper:not(.cn-widget-wrapper--borderless) .cn-widget-object-table .cn-data-table th:first-child,
1386
+ .cn-look-board .cn-dashboard-page:not(.cn-look-nextcloud *) .cn-widget-wrapper:not(.cn-widget-wrapper--borderless) .cn-widget-object-table .cn-data-table td:first-child {
1387
+ padding-inline-start: var(--cn-board-dashboard-card-inset);
1388
+ }
1389
+
1390
+ .cn-look-board .cn-dashboard-page:not(.cn-look-nextcloud *) .cn-widget-wrapper:not(.cn-widget-wrapper--borderless) .cn-widget-object-table .cn-data-table th:last-child,
1391
+ .cn-look-board .cn-dashboard-page:not(.cn-look-nextcloud *) .cn-widget-wrapper:not(.cn-widget-wrapper--borderless) .cn-widget-object-table .cn-data-table td:last-child {
1392
+ padding-inline-end: var(--cn-board-dashboard-card-inset);
1393
+ }
1394
+
1277
1395
  /* ---- Week strip (DqMijnWerk "Termijnen deze week") ---------------------- */
1278
1396
  /* The days wrap inside the card instead of scrolling sideways: a row holds
1279
1397
  as many days of at least 120px as the card fits, and the rest go to the
@@ -1293,23 +1411,13 @@
1293
1411
  flex-wrap: wrap;
1294
1412
  }
1295
1413
 
1296
- /* ---- Bar-list and matrix cards (DqDashboard) ----------------------------- */
1297
- /* The board draws no rule under the title of a card holding a bar list or a
1298
- matrix. Other cards, plain stat tiles among them, keep theirs.
1299
- @spec openspec/changes/chart-bar-list-and-matrix/specs/chart-bar-list-and-matrix/spec.md#requirement-board-bar-list-and-matrix-cards-draw-no-header-rule */
1300
- .cn-look-board .cn-dashboard-page:not(.cn-look-nextcloud *) .cn-widget-wrapper:has(.cn-chart-widget__html) .cn-widget-wrapper__header {
1301
- border-bottom: none;
1302
- }
1303
-
1304
1414
  /* ---- A card of boxed stat tiles (DcRapportages "Vergaderingen en efficiëntie") -- */
1305
1415
  /* The board draws this card 22px from its edge on every side but the bottom
1306
- (20px), the header 14px above the tiles, and no rule under the header. The
1307
- card-fit cell padding (8px 14px) plus the grid's own 24px came to 38px at
1308
- the sides, with the wrapper's divider under the title.
1416
+ (20px) and the header 14px above the tiles. The card-fit cell padding
1417
+ (8px 14px) plus the grid's own 24px came to 38px at the sides.
1309
1418
  @spec openspec/changes/stats-box-card-inset/specs/stats-box-card-inset/spec.md#requirement-a-card-of-boxed-stat-tiles-keeps-the-boards-inset */
1310
1419
  .cn-look-board .cn-dashboard-page:not(.cn-look-nextcloud *) .cn-widget-wrapper:has(.cn-stats-block-widget--tiles-box) .cn-widget-wrapper__header {
1311
1420
  padding: 20px 22px 0;
1312
- border-bottom: none;
1313
1421
  }
1314
1422
 
1315
1423
  .cn-look-board .cn-dashboard-page:not(.cn-look-nextcloud *) .cn-widget-wrapper:has(.cn-stats-block-widget--tiles-box) .cn-widget-wrapper__content {
package/src/index.js CHANGED
@@ -220,6 +220,7 @@ export {
220
220
  CnNotepadWidget,
221
221
  CnNotepadWidgetForm,
222
222
  CnNotesCard,
223
+ CnNoticeWidget,
223
224
  CnNotificationMatrix,
224
225
  CnNotificationPreferences,
225
226
  CnObjectAccessTab,
@@ -375,7 +376,7 @@ export { createOpenRegisterSource } from './components/index.js'
375
376
  // Workplace dashboard primitives (openspec: workplace-dashboard-primitives):
376
377
  // the week strip and stacked bar widgets with their forms, the segmented
377
378
  // control, and the brand stripe.
378
- export { CnBrandStripe, CnSegmentedControl, CnStackedBarWidget, CnStackedBarWidgetForm, CnWeekStripWidget, CnWeekStripWidgetForm } from './components/index.js'
379
+ export { CnBrandStripe, CnSegmentedControl, CnStackedBarWidget, CnStackedBarWidgetForm, CnTeamWorkloadWidget, CnWeekStripWidget, CnWeekStripWidgetForm } from './components/index.js'
379
380
 
380
381
  // Page components the page renderer mounts by `pages[].type` that were missing
381
382
  // from this entry. A component reachable from a manifest but not importable