@conduction/nextcloud-vue 2.98.0 → 2.100.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 (141) hide show
  1. package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue2.js +12 -0
  2. package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue2.js.map +1 -1
  3. package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue3.js +11 -2
  4. package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue3.js.map +1 -1
  5. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue.js +1 -1
  6. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js +6 -1
  7. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js.map +1 -1
  8. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js +2 -1
  9. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js.map +1 -1
  10. package/dist/esm/components/CnBreadcrumbs/CnBreadcrumbs.vue.js +1 -1
  11. package/dist/esm/components/CnBreadcrumbs/CnBreadcrumbs.vue2.js.map +1 -1
  12. package/dist/esm/components/CnBreadcrumbs/CnBreadcrumbs.vue3.js +1 -1
  13. package/dist/esm/components/CnBreadcrumbs/CnBreadcrumbs.vue3.js.map +1 -1
  14. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +25 -8
  15. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  16. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +7 -4
  17. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  18. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue.js +1 -1
  19. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js +11 -8
  20. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -1
  21. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js +13 -4
  22. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js.map +1 -1
  23. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js +1 -1
  24. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js +54 -3
  25. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -1
  26. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js +16 -2
  27. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -1
  28. package/dist/esm/components/CnFlowsPage/CnFlowBoard.vue.js +1 -1
  29. package/dist/esm/components/CnFlowsPage/CnFlowBoard.vue2.js +42 -7
  30. package/dist/esm/components/CnFlowsPage/CnFlowBoard.vue2.js.map +1 -1
  31. package/dist/esm/components/CnFlowsPage/CnFlowBoard.vue3.js +121 -57
  32. package/dist/esm/components/CnFlowsPage/CnFlowBoard.vue3.js.map +1 -1
  33. package/dist/esm/components/CnFlowsPage/CnFlowEditorPage.vue2.js +10 -0
  34. package/dist/esm/components/CnFlowsPage/CnFlowEditorPage.vue2.js.map +1 -1
  35. package/dist/esm/components/CnFlowsPage/CnFlowEditorPage.vue3.js +2 -1
  36. package/dist/esm/components/CnFlowsPage/CnFlowEditorPage.vue3.js.map +1 -1
  37. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +136 -7
  38. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  39. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  40. package/dist/esm/components/CnOrderedListField/CnOrderedListField.vue.js +1 -1
  41. package/dist/esm/components/CnOrderedListField/CnOrderedListField.vue2.js +26 -7
  42. package/dist/esm/components/CnOrderedListField/CnOrderedListField.vue2.js.map +1 -1
  43. package/dist/esm/components/CnOrderedListField/CnOrderedListField.vue3.js +78 -17
  44. package/dist/esm/components/CnOrderedListField/CnOrderedListField.vue3.js.map +1 -1
  45. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +1 -1
  46. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +68 -7
  47. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
  48. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js +256 -240
  49. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
  50. package/dist/esm/components/CnSettingsField/CnSettingsField.vue.js +9 -0
  51. package/dist/esm/components/CnSettingsField/CnSettingsField.vue.js.map +1 -0
  52. package/dist/esm/components/CnSettingsField/CnSettingsField.vue2.js +265 -0
  53. package/dist/esm/components/CnSettingsField/CnSettingsField.vue2.js.map +1 -0
  54. package/dist/esm/components/CnSettingsField/CnSettingsField.vue3.js +191 -0
  55. package/dist/esm/components/CnSettingsField/CnSettingsField.vue3.js.map +1 -0
  56. package/dist/esm/components/CnSettingsFieldsSection/CnSettingsFieldsSection.vue.js +9 -0
  57. package/dist/esm/components/CnSettingsFieldsSection/CnSettingsFieldsSection.vue.js.map +1 -0
  58. package/dist/esm/components/CnSettingsFieldsSection/CnSettingsFieldsSection.vue2.js +537 -0
  59. package/dist/esm/components/CnSettingsFieldsSection/CnSettingsFieldsSection.vue2.js.map +1 -0
  60. package/dist/esm/components/CnSettingsFieldsSection/CnSettingsFieldsSection.vue3.js +99 -0
  61. package/dist/esm/components/CnSettingsFieldsSection/CnSettingsFieldsSection.vue3.js.map +1 -0
  62. package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue.js +1 -1
  63. package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue2.js +18 -70
  64. package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue2.js.map +1 -1
  65. package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue3.js +6 -44
  66. package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue3.js.map +1 -1
  67. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue.js +1 -1
  68. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue2.js +16 -2
  69. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue2.js.map +1 -1
  70. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue3.js +40 -25
  71. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue3.js.map +1 -1
  72. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js +1 -0
  73. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js.map +1 -1
  74. package/dist/esm/components/CnWizardDialog/CnWizardDialog.vue.js +1 -1
  75. package/dist/esm/components/CnWizardDialog/CnWizardDialog.vue2.js +7 -7
  76. package/dist/esm/components/CnWizardDialog/CnWizardDialog.vue2.js.map +1 -1
  77. package/dist/esm/components/CnWizardDialog/CnWizardDialog.vue3.js.map +1 -1
  78. package/dist/esm/components/CnWorkingCalendarWidget/CnWorkingCalendarWidget.vue.js +9 -0
  79. package/dist/esm/components/CnWorkingCalendarWidget/CnWorkingCalendarWidget.vue.js.map +1 -0
  80. package/dist/esm/components/CnWorkingCalendarWidget/CnWorkingCalendarWidget.vue2.js +472 -0
  81. package/dist/esm/components/CnWorkingCalendarWidget/CnWorkingCalendarWidget.vue2.js.map +1 -0
  82. package/dist/esm/components/CnWorkingCalendarWidget/CnWorkingCalendarWidget.vue3.js +231 -0
  83. package/dist/esm/components/CnWorkingCalendarWidget/CnWorkingCalendarWidget.vue3.js.map +1 -0
  84. package/dist/esm/components/CnWorkingCalendarWidget/index.js +27 -0
  85. package/dist/esm/components/CnWorkingCalendarWidget/index.js.map +1 -0
  86. package/dist/esm/composables/useFlowStore.js +2 -1
  87. package/dist/esm/composables/useFlowStore.js.map +1 -1
  88. package/dist/esm/index.js +3 -0
  89. package/dist/esm/index.js.map +1 -1
  90. package/dist/esm/l10n/en.json.js +101 -1
  91. package/dist/esm/l10n/en.json.js.map +1 -1
  92. package/dist/esm/l10n/nl.json.js +115 -1
  93. package/dist/esm/l10n/nl.json.js.map +1 -1
  94. package/dist/esm/library-style.js +1 -1
  95. package/dist/esm/nextcloud-vue.css +999 -233
  96. package/dist/esm/utils/libraryWidgetKeys.js +1 -0
  97. package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
  98. package/dist/esm/utils/validateManifestV2.compiled.js +3 -3
  99. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  100. package/dist/esm/utils/workingCalendarMonth.js +85 -0
  101. package/dist/esm/utils/workingCalendarMonth.js.map +1 -0
  102. package/dist/nextcloud-vue.cjs.js +10314 -7778
  103. package/dist/nextcloud-vue.cjs.js.map +2 -2
  104. package/dist/nextcloud-vue.css +999 -233
  105. package/l10n/en.json +101 -1
  106. package/l10n/nl.json +115 -1
  107. package/package.json +1 -1
  108. package/src/components/CnActionsMenu/CnActionsMenu.vue +14 -1
  109. package/src/components/CnAdminSettingsShell/CnAdminSettingsShell.vue +7 -1
  110. package/src/components/CnBreadcrumbs/CnBreadcrumbs.vue +1 -0
  111. package/src/components/CnDetailPage/CnDetailPage.vue +29 -9
  112. package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +13 -4
  113. package/src/components/CnFactsWidget/CnFactsWidget.vue +65 -3
  114. package/src/components/CnFlowsPage/CnFlowBoard.vue +77 -2
  115. package/src/components/CnFlowsPage/CnFlowEditorPage.vue +11 -0
  116. package/src/components/CnIndexPage/CnIndexPage.vue +136 -7
  117. package/src/components/CnOrderedListField/CnOrderedListField.vue +81 -9
  118. package/src/components/CnRecordListWidget/CnRecordListWidget.vue +114 -7
  119. package/src/components/CnSettingsField/CnSettingsField.vue +449 -0
  120. package/src/components/CnSettingsField/index.js +4 -0
  121. package/src/components/CnSettingsFieldsSection/CnSettingsFieldsSection.vue +642 -0
  122. package/src/components/CnSettingsFieldsSection/index.js +4 -0
  123. package/src/components/CnSettingsPage/CnSettingsPage.vue +6 -86
  124. package/src/components/CnSetupWizard/CnSetupWizard.vue +37 -3
  125. package/src/components/CnWidgetGrid/registerDashboardWidgets.js +1 -0
  126. package/src/components/CnWizardDialog/CnWizardDialog.vue +7 -7
  127. package/src/components/CnWorkingCalendarWidget/CnWorkingCalendarWidget.vue +725 -0
  128. package/src/components/CnWorkingCalendarWidget/index.js +26 -0
  129. package/src/components/index.js +3 -0
  130. package/src/composables/useFlowStore.js +2 -1
  131. package/src/css/badge.css +32 -16
  132. package/src/css/detail-page.css +15 -0
  133. package/src/css/dialog.css +48 -0
  134. package/src/css/look-board-detail.css +80 -8
  135. package/src/css/look-board-index.css +52 -8
  136. package/src/css/look-board.css +301 -1
  137. package/src/index.js +3 -0
  138. package/src/schemas/app-manifest-v2.schema.json +25 -1
  139. package/src/utils/libraryWidgetKeys.js +1 -0
  140. package/src/utils/validateManifestV2.compiled.js +3 -3
  141. package/src/utils/workingCalendarMonth.js +82 -0
@@ -141,6 +141,50 @@
141
141
  color: var(--color-primary-element-text);
142
142
  }
143
143
 
144
+ /* ---- Header action buttons (CnActionButtons) ----------------------------- */
145
+ /* The board draws a page's secondary actions as neutral 40px buttons: the
146
+ main background, a grey border, the main text at 600 (DqZaak "Bericht",
147
+ "Document", "Contact vastleggen", "Bewerken"). Nextcloud's secondary button
148
+ is a primary tint. The label hands its ink to --nldesign-color-on-surface,
149
+ which a theme that forces the body ink onto every span (thematiq) reads. */
150
+ .cn-look-board .cn-action-buttons .button-vue--secondary:not(.cn-look-nextcloud *),
151
+ .cn-look-board .cn-action-buttons .button-vue--vue-secondary:not(.cn-look-nextcloud *) {
152
+ --nldesign-color-on-surface: var(--color-main-text);
153
+ height: var(--cn-board-control-height);
154
+ min-height: var(--cn-board-control-height);
155
+ padding: 0 14px;
156
+ border: 1px solid var(--color-border-dark);
157
+ border-radius: var(--cn-board-control-radius);
158
+ background: var(--color-main-background);
159
+ color: var(--color-main-text);
160
+ font-size: 14px;
161
+ font-weight: 600;
162
+ }
163
+
164
+ /* Buttons 10px apart, each icon 16px with 8px to its label (DqZaak's header,
165
+ DqZaken's "Downloaden"); NcButton draws a 20px icon in a 30px slot. */
166
+ .cn-look-board .cn-action-buttons:not(.cn-look-nextcloud *) {
167
+ gap: 10px;
168
+ }
169
+
170
+ .cn-look-board .cn-action-buttons .button-vue .button-vue__icon:not(.cn-look-nextcloud *) {
171
+ width: 16px;
172
+ min-width: 16px;
173
+ height: 16px;
174
+ min-height: 16px;
175
+ margin-inline-end: 8px;
176
+ }
177
+
178
+ .cn-look-board .cn-action-buttons .button-vue .button-vue__icon:not(.cn-look-nextcloud *) svg {
179
+ width: 16px;
180
+ height: 16px;
181
+ }
182
+
183
+ .cn-look-board .cn-action-buttons .button-vue--secondary:not(.cn-look-nextcloud *):hover,
184
+ .cn-look-board .cn-action-buttons .button-vue--vue-secondary:not(.cn-look-nextcloud *):hover {
185
+ background: var(--color-background-hover);
186
+ }
187
+
144
188
  /* ---- The buildiq square ------------------------------------------------ */
145
189
  .cn-look-board .cn-buildiq-edit .cn-buildiq-edit__actions .button-vue {
146
190
  box-sizing: border-box;
@@ -153,6 +197,34 @@
153
197
  border-radius: var(--cn-board-control-radius);
154
198
  }
155
199
 
200
+ /* ---- The Actions menu trigger (CnActionsMenu) ---------------------------- */
201
+ /* A menu asked for as `secondary` ("Meer" in a detail header, "Acties" at the
202
+ end of a tab strip) is the board's neutral control: the main background, a
203
+ grey border, the main text at 600 (DqZaak), not Nextcloud's primary tint.
204
+ NcActions marks a secondary menu `action-item--secondary` on its root and
205
+ keeps a class given to it off, so the rule reads that marker. The label
206
+ hands its ink to --nldesign-color-on-surface for a theme that forces the
207
+ body ink onto every span (thematiq). */
208
+ .cn-look-board .action-item.action-item--secondary .action-item__menutoggle.button-vue--secondary:not(.cn-look-nextcloud *) {
209
+ --nldesign-color-on-surface: var(--color-main-text);
210
+ border: 1px solid var(--color-border-dark);
211
+ border-radius: var(--cn-board-control-radius);
212
+ background: var(--color-main-background);
213
+ color: var(--color-main-text);
214
+ font-size: 14px;
215
+ font-weight: 600;
216
+ }
217
+
218
+ .cn-look-board .action-item.action-item--secondary .action-item__menutoggle.button-vue--secondary:not(.cn-look-nextcloud *):hover {
219
+ background: var(--color-background-hover);
220
+ }
221
+
222
+ /* A trailing chevron ("Meer ⌄") follows the label, 6px after it. */
223
+ .cn-look-board .action-item.action-item--secondary .action-item__menutoggle:has(.chevron-down-icon) .button-vue__wrapper:not(.cn-look-nextcloud *) {
224
+ flex-direction: row-reverse;
225
+ gap: 6px;
226
+ }
227
+
156
228
  /* ---- The navigation ---------------------------------------------------- */
157
229
  .cn-look-board .app-navigation[data-testid="cn-nav"] {
158
230
  --app-navigation-padding: 0px;
@@ -230,6 +302,40 @@
230
302
  color: inherit;
231
303
  }
232
304
 
305
+ /* A caption's edit pencil ("Mijn zaaktypen") sits on the caption's line at
306
+ its end, 4px in: a 28px round muted button with a 16px icon that adds no
307
+ height (DqZijbalk). It is placed absolutely because a theme may force the
308
+ caption to `display: block` at id strength (thematiq's Zuiddrecht sheet),
309
+ which put the pencil on a line of its own. */
310
+ .cn-look-board .app-navigation[data-testid="cn-nav"] .app-navigation-caption:has(.app-navigation-caption__actions) {
311
+ position: relative;
312
+ padding-inline-end: 36px;
313
+ }
314
+
315
+ .cn-look-board .app-navigation[data-testid="cn-nav"] .app-navigation-caption .app-navigation-caption__actions {
316
+ --default-clickable-area: 28px;
317
+ position: absolute;
318
+ inset-block-start: -6px;
319
+ inset-inline-end: 4px;
320
+ margin: 0;
321
+ }
322
+
323
+ .cn-look-board .app-navigation[data-testid="cn-nav"] .app-navigation-caption .app-navigation-caption__actions .button-vue {
324
+ --nldesign-color-on-surface: var(--color-text-maxcontrast);
325
+ width: 28px;
326
+ min-width: 28px;
327
+ height: 28px;
328
+ min-height: 28px;
329
+ padding: 0;
330
+ border-radius: 14px;
331
+ color: var(--color-text-maxcontrast);
332
+ }
333
+
334
+ .cn-look-board .app-navigation[data-testid="cn-nav"] .app-navigation-caption .app-navigation-caption__actions .button-vue svg {
335
+ width: 16px;
336
+ height: 16px;
337
+ }
338
+
233
339
  .cn-look-board .app-navigation[data-testid="cn-nav"] .app-navigation-entry,
234
340
  .cn-look-board .app-navigation[data-testid="cn-nav"] .app-navigation-entry-link {
235
341
  min-height: 42px;
@@ -244,7 +350,15 @@
244
350
  color: var(--color-main-text);
245
351
  }
246
352
 
353
+ /* The open entry sits on the tonal primary. NcAppNavigationItem paints an
354
+ active entry with a 16% (22% hovered) primary mix at `!important`, so the
355
+ board value needs `!important` too; the selector is the more specific one.
356
+ The link carries the same ground. */
247
357
  .cn-look-board .app-navigation[data-testid="cn-nav"] .app-navigation-entry.active,
358
+ .cn-look-board .app-navigation[data-testid="cn-nav"] .app-navigation-entry.active:hover {
359
+ background-color: var(--color-primary-element-light) !important;
360
+ }
361
+
248
362
  .cn-look-board .app-navigation[data-testid="cn-nav"] .app-navigation-entry.active .app-navigation-entry-link {
249
363
  background: var(--color-primary-element-light);
250
364
  color: var(--color-primary-element-light-text);
@@ -290,9 +404,11 @@
290
404
  font-weight: 700;
291
405
  }
292
406
 
407
+ /* White on the error colour: --color-error-text is the error colour for text on
408
+ a light ground (#8A0000 under thematiq), not the text on an error pill. */
293
409
  .cn-look-board .cn-app-nav__count--attention {
294
410
  background: var(--color-error);
295
- color: var(--color-error-text, var(--color-primary-element-text));
411
+ color: var(--color-primary-element-text);
296
412
  }
297
413
 
298
414
  /* The footer: Help, then Advanced, whatever the declared order. */
@@ -374,6 +490,71 @@
374
490
  font-weight: 600;
375
491
  }
376
492
 
493
+ /* ---- Breadcrumbs (CnBreadcrumbs) ----------------------------------------- */
494
+ /* The board draws a trail as a line of 14px text, 8px apart: the crumbs that
495
+ lead somewhere as underlined links in the primary colour, the current one
496
+ as plain muted text (DqZaak "Alle zaken / 2026-0082"). NcBreadcrumbs draws
497
+ each crumb as a 34px tertiary button. The doubled classes outrank its
498
+ scoped rules; the ink goes through --nldesign-color-on-surface as well, for
499
+ a theme that forces the body ink onto every link and span (thematiq). */
500
+ .cn-look-board .cn-breadcrumbs.cn-breadcrumbs:not(.cn-look-nextcloud *) {
501
+ min-height: 0;
502
+ height: auto;
503
+ color: var(--color-text-maxcontrast);
504
+ font-size: 14px;
505
+ line-height: normal;
506
+ }
507
+
508
+ .cn-look-board .cn-breadcrumbs .breadcrumb__crumbs:not(.cn-look-nextcloud *) {
509
+ gap: 8px;
510
+ min-height: 0;
511
+ margin: 0;
512
+ padding: 0;
513
+ }
514
+
515
+ .cn-look-board .cn-breadcrumbs .vue-crumb.vue-crumb:not(.cn-look-nextcloud *) {
516
+ gap: 8px;
517
+ min-width: 0;
518
+ min-height: 0;
519
+ height: auto;
520
+ }
521
+
522
+ .cn-look-board .cn-breadcrumbs .vue-crumb .button-vue.button-vue:not(.cn-look-nextcloud *) {
523
+ --nldesign-color-on-surface: var(--color-primary-element);
524
+ min-width: 0;
525
+ min-height: 0;
526
+ height: auto;
527
+ padding: 0;
528
+ border: 0;
529
+ background: transparent;
530
+ color: var(--color-primary-element);
531
+ font-size: 14px;
532
+ font-weight: 400;
533
+ line-height: inherit;
534
+ }
535
+
536
+ .cn-look-board .cn-breadcrumbs .vue-crumb .button-vue.button-vue:not(.cn-look-nextcloud *) .button-vue__text {
537
+ padding: 0;
538
+ font-weight: inherit;
539
+ line-height: inherit;
540
+ text-decoration: underline;
541
+ }
542
+
543
+ .cn-look-board .cn-breadcrumbs .vue-crumb .button-vue.button-vue[aria-current='page']:not(.cn-look-nextcloud *) {
544
+ --nldesign-color-on-surface: var(--color-text-maxcontrast);
545
+ color: var(--color-text-maxcontrast);
546
+ cursor: default;
547
+ }
548
+
549
+ .cn-look-board .cn-breadcrumbs .vue-crumb .button-vue.button-vue[aria-current='page']:not(.cn-look-nextcloud *) .button-vue__text {
550
+ text-decoration: none;
551
+ }
552
+
553
+ .cn-look-board .cn-breadcrumbs .vue-crumb__separator:not(.cn-look-nextcloud *) {
554
+ margin: 0;
555
+ color: var(--color-text-maxcontrast);
556
+ }
557
+
377
558
  /* ---- Settings: header, cards in a grid, version card ------------------- */
378
559
  .cn-look-board .cn-admin-settings-shell__header:not(.cn-look-nextcloud *),
379
560
  .cn-look-board .cn-settings-page__header:not(.cn-look-nextcloud *) {
@@ -792,6 +973,63 @@
792
973
  ground ("Verzoek", "Nieuw"); the default look keeps the brighter
793
974
  primary-element text. The other tones already match the board. */
794
975
  .cn-look-board .cn-status-badge--primary:not(.cn-status-badge--solid):not(.cn-look-nextcloud *) {
976
+ --cn-status-badge-ink: var(--color-primary-element-light-text);
977
+ color: var(--cn-status-badge-ink);
978
+ }
979
+
980
+ /* Every board pill is 13px at 600 on a 3px 10px pad with a 12px corner
981
+ (DqZaak's header pills, DqZaken's status column). */
982
+ .cn-look-board .cn-status-badge:not(.cn-status-badge--small):not(.cn-look-nextcloud *) {
983
+ padding: 3px 10px;
984
+ border-radius: 12px;
985
+ font-size: 13px;
986
+ font-weight: 600;
987
+ line-height: normal;
988
+ }
989
+
990
+ /* A pill paints its own pairing of ink and fill. A theme that forces the body
991
+ ink onto every span (thematiq's text rule, `!important` at id level) reads
992
+ that ink from --nldesign-color-on-surface when the surface sets it, so the
993
+ pill hands it its own ink: "In behandeling" stays purple on purple. */
994
+ .cn-look-board .cn-status-badge:not(.cn-look-nextcloud *) {
995
+ --nldesign-color-on-surface: var(--cn-status-badge-ink);
996
+ }
997
+
998
+ /* ---- Info notes (NcNoteCard type="info") -------------------------------- */
999
+ /* The board's info note is a light-blue rounded box: no edge bar, 12px 14px
1000
+ of padding, radius 8, an 18px icon 10px before the text, 14px text in the
1001
+ deep primary ink at 1.5, and a bold heading line (DqBesluit and 13 other
1002
+ boards). NcNoteCard paints its ground and ink with `!important`, and a
1003
+ theme forces the body ink onto every p and span (thematiq), so the ground,
1004
+ the ink and the paragraph colour carry `!important` here too, scoped to
1005
+ the board look; the ink also goes to --nldesign-color-on-surface. */
1006
+ .cn-look-board .notecard.notecard--info:not(.cn-look-nextcloud *) {
1007
+ --nldesign-color-on-surface: var(--color-primary-element-light-text);
1008
+ --note-card-icon-size: 18px;
1009
+ --note-theme: var(--color-primary-element-light-text);
1010
+ gap: 10px;
1011
+ padding: 12px 14px;
1012
+ border-inline-start: 0;
1013
+ border-radius: 8px;
1014
+ background-color: var(--color-primary-element-light) !important;
1015
+ color: var(--color-primary-element-light-text) !important;
1016
+ font-size: 14px;
1017
+ line-height: 1.5;
1018
+ }
1019
+
1020
+ .cn-look-board .notecard.notecard--info:not(.cn-look-nextcloud *) p {
1021
+ color: var(--color-primary-element-light-text) !important;
1022
+ font-size: inherit;
1023
+ line-height: inherit;
1024
+ }
1025
+
1026
+ .cn-look-board .notecard.notecard--info:not(.cn-look-nextcloud *) .notecard__heading {
1027
+ font-size: inherit;
1028
+ font-weight: 700 !important;
1029
+ }
1030
+
1031
+ .cn-look-board .notecard.notecard--info:not(.cn-look-nextcloud *) .notecard__icon {
1032
+ padding-top: 1px;
795
1033
  color: var(--color-primary-element-light-text);
796
1034
  }
797
1035
 
@@ -802,6 +1040,68 @@
802
1040
  font-weight: 600;
803
1041
  }
804
1042
 
1043
+ /* ---- Label and value pairs (CnDetailGrid) -------------------------------- */
1044
+ /* The board draws pairs as plain text, not as grey cards with an accent bar:
1045
+ the grid as a 13px muted label over a 15px value at weight 500 with a
1046
+ hairline under each pair (DqZaak "Zaakgegevens"), the horizontal layout as
1047
+ two columns of 14px text, the label column as wide as its longest label
1048
+ (the side cards). Both at the board's line height, 1.2, not Nextcloud's 1.5:
1049
+ a pair is 47px tall on the board. The muted label also hands its ink to
1050
+ --nldesign-color-on-surface, which a theme that forces the body ink onto
1051
+ every div (thematiq) reads. */
1052
+ .cn-look-board .cn-detail-grid.cn-detail-grid--grid:not(.cn-look-nextcloud *) {
1053
+ gap: 12px 24px;
1054
+ font-size: 15px;
1055
+ }
1056
+
1057
+ .cn-look-board .cn-detail-grid.cn-detail-grid--horizontal:not(.cn-look-nextcloud *) {
1058
+ display: grid;
1059
+ grid-template-columns: max-content 1fr;
1060
+ gap: 8px 16px;
1061
+ font-size: 14px;
1062
+ }
1063
+
1064
+ .cn-look-board .cn-detail-grid .cn-detail-grid__item:not(.cn-look-nextcloud *) {
1065
+ gap: 3px;
1066
+ padding: 0;
1067
+ border-inline-start: none;
1068
+ border-radius: 0;
1069
+ background: none;
1070
+ }
1071
+
1072
+ .cn-look-board .cn-detail-grid.cn-detail-grid--grid .cn-detail-grid__item:not(.cn-look-nextcloud *) {
1073
+ padding-bottom: 10px;
1074
+ border-bottom: 1px solid var(--cn-board-hairline);
1075
+ }
1076
+
1077
+ .cn-look-board .cn-detail-grid.cn-detail-grid--horizontal .cn-detail-grid__item:not(.cn-look-nextcloud *) {
1078
+ display: contents;
1079
+ }
1080
+
1081
+ .cn-look-board .cn-detail-grid .cn-detail-grid__label:not(.cn-look-nextcloud *) {
1082
+ --nldesign-color-on-surface: var(--color-text-maxcontrast);
1083
+ min-width: 0;
1084
+ color: var(--color-text-maxcontrast);
1085
+ font-size: 13px;
1086
+ font-weight: 400;
1087
+ line-height: 1.2;
1088
+ }
1089
+
1090
+ .cn-look-board .cn-detail-grid.cn-detail-grid--horizontal .cn-detail-grid__label:not(.cn-look-nextcloud *) {
1091
+ font-size: inherit;
1092
+ }
1093
+
1094
+ .cn-look-board .cn-detail-grid .cn-detail-grid__value:not(.cn-look-nextcloud *) {
1095
+ margin: 0;
1096
+ font-size: inherit;
1097
+ font-weight: 500;
1098
+ line-height: 1.2;
1099
+ }
1100
+
1101
+ .cn-look-board .cn-detail-grid.cn-detail-grid--horizontal .cn-detail-grid__value:not(.cn-look-nextcloud *) {
1102
+ font-weight: 400;
1103
+ }
1104
+
805
1105
  /* ---- Dashboard card titles --------------------------------------------- */
806
1106
  /* A card's title on a dashboard (and on the widgets under a reports page) is
807
1107
  the board's card h2: 17px weight 700 (boards PqMijnWerk, DcRapportages and
package/src/index.js CHANGED
@@ -280,6 +280,8 @@ export {
280
280
  CnSearchPage,
281
281
  CnSectionsWidget,
282
282
  CnSettingsCard,
283
+ CnSettingsField,
284
+ CnSettingsFieldsSection,
283
285
  CnSettingsFormWidget,
284
286
  CnSettingsPage,
285
287
  CnSettingsSection,
@@ -344,6 +346,7 @@ export {
344
346
  CnWidgetVisibilityRulesModal,
345
347
  CnWidgetWrapper,
346
348
  CnWizardDialog,
349
+ CnWorkingCalendarWidget,
347
350
  CnWorkspaceFilterWidget,
348
351
  DEFAULT_DATE_RANGE_PRESETS,
349
352
  defaultPageTypes,
@@ -3,7 +3,7 @@
3
3
  "$id": "https://raw.githubusercontent.com/ConductionNL/nextcloud-vue/main/src/schemas/app-manifest-v2.schema.json",
4
4
  "title": "Conduction App Manifest v2",
5
5
  "description": "v2 schema for the JSON-driven page and navigation manifest consumed by @conduction/nextcloud-vue. Introduces a uniform widgets[] array on every page type with a per-slot grid coordinate system, a typed actions[] discriminator, and the required $schema field for version detection. v1 manifests continue to validate against app-manifest.schema.json (unchanged).",
6
- "version": "2.122.0",
6
+ "version": "2.123.0",
7
7
  "type": "object",
8
8
  "required": ["$schema", "version"],
9
9
  "allOf": [
@@ -97,6 +97,8 @@
97
97
  "type": { "type": "string", "enum": ["info", "config-fields", "choice", "run-action", "summary", "component"], "description": "Built-in step renderer." },
98
98
  "title": { "type": "string" },
99
99
  "body": { "type": "string", "description": "info: explanatory copy." },
100
+ "note": { "type": "string", "minLength": 1, "description": "choice: a footnote under the options, translated like body." },
101
+ "footnote": { "type": "string", "minLength": 1, "description": "choice: the same footnote under another name; note wins when both are set." },
100
102
  "required": { "type": "boolean", "default": false, "description": "When true the step gates the app until done." },
101
103
  "schema": { "description": "config-fields: a JSON Schema ref (string) or inline object rendered via fieldsFromSchema." },
102
104
  "configKey": { "type": "string", "description": "choice: app-config key the selection is written to." },
@@ -4024,6 +4026,14 @@
4024
4026
  "type": "boolean",
4025
4027
  "description": "false removes Request a feature, Report a bug and Documentation, for an app that offers them in its own help menu."
4026
4028
  },
4029
+ "showMarkUnread": {
4030
+ "type": "boolean",
4031
+ "description": "false removes the built-in Mark as unread entry."
4032
+ },
4033
+ "showOpenSidebar": {
4034
+ "type": "boolean",
4035
+ "description": "false removes the built-in Open sidebar entry of the board look."
4036
+ },
4027
4037
  "label": {
4028
4038
  "type": "string",
4029
4039
  "minLength": 1,
@@ -4333,6 +4343,20 @@
4333
4343
  "minLength": 1,
4334
4344
  "description": "type='detail', board look: the meta line on row 2 of the header, after the breadcrumb and a middle dot (screens-detail-page-parity). A field template such as `\"via {channel}\"`: every `{path}` is read from the record, and a line with an empty value is dropped. Maps to CnDetailPage `headerMeta`. type='index' | 'dashboard' | 'settings' (page-header-breadcrumb): the note after the breadcrumb and a middle dot under the title; on an index page `{total}` and `{shown}` are the list's counts."
4335
4345
  },
4346
+ "headerMetaCounts": {
4347
+ "type": "object",
4348
+ "description": "type='index': the other lists headerMeta counts, by name. Each is read as one list total and fills `{count:<name>}` in headerMeta (\"{total} contracten bij {count:suppliers} leveranciers\"); while a count loads or when it fails, the note is left out.",
4349
+ "additionalProperties": {
4350
+ "type": "object",
4351
+ "required": ["register", "schema"],
4352
+ "additionalProperties": false,
4353
+ "properties": {
4354
+ "register": { "type": "string", "minLength": 1 },
4355
+ "schema": { "type": "string", "minLength": 1 },
4356
+ "filter": { "type": "object" }
4357
+ }
4358
+ }
4359
+ },
4336
4360
  "tabsLabel": {
4337
4361
  "type": "string",
4338
4362
  "minLength": 1,
@@ -152,6 +152,7 @@ export const DASHBOARD_CATALOG_WIDGET_KEYS = Object.freeze([
152
152
  'toggle-table',
153
153
  'video',
154
154
  'week-strip',
155
+ 'working-calendar',
155
156
  'workspace-filter',
156
157
  ])
157
158