@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
@@ -0,0 +1,26 @@
1
+ /**
2
+ * SPDX-FileCopyrightText: 2026 Conduction B.V.
3
+ * SPDX-License-Identifier: EUPL-1.2
4
+ *
5
+ * CnWorkingCalendarWidget — self-registers the `working-calendar` widget type
6
+ * (one month of a working calendar kept as an OpenRegister object, with its
7
+ * closed dates and Add day) into the shared dashboardWidgetRegistry at module
8
+ * load. Renderer only: the calendar object is named in the manifest.
9
+ */
10
+
11
+ import CnWorkingCalendarWidget from './CnWorkingCalendarWidget.vue'
12
+ import { registerDashboardWidget } from '../CnWidgetGrid/dashboardWidgetRegistry.js'
13
+
14
+ registerDashboardWidget('working-calendar', {
15
+ renderer: CnWorkingCalendarWidget,
16
+ form: null,
17
+ defaultContent: {
18
+ calendar: { register: 'flow-timers', schema: 'working-calendar', filter: {} },
19
+ },
20
+ displayName: 'Working calendar',
21
+ icon: 'CalendarMonthOutline',
22
+ surfaces: ['app-dashboard', 'detail-page'],
23
+ })
24
+
25
+ export { CnWorkingCalendarWidget }
26
+ export default CnWorkingCalendarWidget
@@ -13,6 +13,8 @@ export { CnStatusBadge } from './CnStatusBadge/index.js'
13
13
  export { CnPagination } from './CnPagination/index.js'
14
14
  export { CnSettingsCard } from './CnSettingsCard/index.js'
15
15
  export { CnSettingsSection } from './CnSettingsSection/index.js'
16
+ export { CnSettingsField } from './CnSettingsField/index.js'
17
+ export { CnSettingsFieldsSection } from './CnSettingsFieldsSection/index.js'
16
18
  export { CnLeafDependencySettings } from './CnLeafDependencySettings/index.js'
17
19
  export { CnStatsBlock } from './CnStatsBlock/index.js'
18
20
  export { CnStructuredDocReview } from './CnStructuredDocReview/index.js'
@@ -223,6 +225,7 @@ export { CnSectionsWidget } from './CnSectionsWidget/index.js'
223
225
  export { CnFactsWidget } from './CnFactsWidget/index.js'
224
226
  export { CnDeviceFramesWidget } from './CnDeviceFramesWidget/index.js'
225
227
  export { CnChecklistRunWidget } from './CnChecklistRunWidget/index.js'
228
+ export { CnWorkingCalendarWidget } from './CnWorkingCalendarWidget/index.js'
226
229
  export { CnPartyActionsWidget } from './CnPartyActionsWidget/index.js'
227
230
  export { CnFieldListWidget } from './CnFieldListWidget/index.js'
228
231
  export { CnSettingsFormWidget } from './CnSettingsFormWidget/index.js'
@@ -23,6 +23,7 @@
23
23
  // vocabulary.
24
24
 
25
25
  import axios from '@nextcloud/axios'
26
+ import { translate as t } from '@nextcloud/l10n'
26
27
  import { generateUrl } from '@nextcloud/router'
27
28
  import { defineStore } from 'pinia'
28
29
  import { layoutFlowNodes, needsFullLayout, placeLooseNodes } from './flowGraphLayout.js'
@@ -968,7 +969,7 @@ export const useFlowStore = defineStore('cnFlow', {
968
969
  // A new flow is runnable on demand until its author picks a real
969
970
  // trigger, so the flow-level trigger and the seeded start node
970
971
  // say the same thing.
971
- this.flow = { ...emptyFlow(), name: 'New flow', app: app || 'openregister', trigger: 'manual' }
972
+ this.flow = { ...emptyFlow(), name: t('nextcloud-vue', 'New flow'), app: app || 'openregister', trigger: 'manual' }
972
973
  this.seedStartNode()
973
974
  this.dirty = false
974
975
  return
package/src/css/badge.css CHANGED
@@ -31,84 +31,100 @@
31
31
 
32
32
  /* Color variants */
33
33
  .cn-status-badge--default {
34
+ --cn-status-badge-ink: var(--color-main-text);
34
35
  background-color: var(--color-background-dark);
35
- color: var(--color-main-text);
36
+ color: var(--cn-status-badge-ink);
36
37
  }
37
38
 
38
39
  .cn-status-badge--primary {
40
+ --cn-status-badge-ink: var(--color-primary-element);
39
41
  background-color: var(--color-primary-element-light);
40
- color: var(--color-primary-element);
42
+ color: var(--cn-status-badge-ink);
41
43
  }
42
44
 
43
45
  .cn-status-badge--success {
46
+ --cn-status-badge-ink: var(--color-success-text, var(--color-success));
44
47
  background-color: var(--color-success-light, rgba(70, 186, 97, 0.15));
45
- color: var(--color-success-text, var(--color-success));
48
+ color: var(--cn-status-badge-ink);
46
49
  }
47
50
 
48
51
  .cn-status-badge--warning {
52
+ --cn-status-badge-ink: var(--color-warning-text, var(--color-warning));
49
53
  background-color: var(--color-warning-light, rgba(232, 163, 39, 0.15));
50
- color: var(--color-warning-text, var(--color-warning));
54
+ color: var(--cn-status-badge-ink);
51
55
  }
52
56
 
53
57
  .cn-status-badge--error {
58
+ --cn-status-badge-ink: var(--color-error-text, var(--color-error));
54
59
  background-color: var(--color-error-light, rgba(224, 68, 68, 0.15));
55
- color: var(--color-error-text, var(--color-error));
60
+ color: var(--cn-status-badge-ink);
56
61
  }
57
62
 
58
63
  .cn-status-badge--info {
64
+ --cn-status-badge-ink: var(--color-info-text, var(--color-info, #0082c9));
59
65
  background-color: var(--color-info-light, rgba(0, 130, 201, 0.15));
60
- color: var(--color-info-text, var(--color-info, #0082c9));
66
+ color: var(--cn-status-badge-ink);
61
67
  }
62
68
 
63
69
  /* Work in progress ("In behandeling"), a board tone. */
64
70
  .cn-status-badge--purple {
71
+ --cn-status-badge-ink: var(--cn-status-purple-text);
65
72
  background-color: var(--cn-status-purple-bg);
66
- color: var(--cn-status-purple-text);
73
+ color: var(--cn-status-badge-ink);
67
74
  }
68
75
 
69
76
  /* Handed on ("Omgezet naar een zaak"), a board tone. */
70
77
  .cn-status-badge--teal {
78
+ --cn-status-badge-ink: var(--cn-status-teal-text);
71
79
  background-color: var(--cn-status-teal-bg);
72
- color: var(--cn-status-teal-text);
80
+ color: var(--cn-status-badge-ink);
73
81
  }
74
82
 
75
83
  /* Solid variants — solid background with white text for use on colored backgrounds */
76
84
  .cn-status-badge--solid.cn-status-badge--default {
85
+ --cn-status-badge-ink: var(--color-main-text);
77
86
  background-color: var(--color-background-dark);
78
- color: var(--color-main-text);
87
+ color: var(--cn-status-badge-ink);
79
88
  }
80
89
 
81
90
  .cn-status-badge--solid.cn-status-badge--primary {
91
+ --cn-status-badge-ink: white;
82
92
  background-color: var(--color-primary-element);
83
- color: white;
93
+ color: var(--cn-status-badge-ink);
84
94
  }
85
95
 
86
96
  .cn-status-badge--solid.cn-status-badge--success {
97
+ --cn-status-badge-ink: white;
87
98
  background-color: var(--color-success);
88
- color: white;
99
+ color: var(--cn-status-badge-ink);
89
100
  }
90
101
 
91
102
  .cn-status-badge--solid.cn-status-badge--warning {
103
+ --cn-status-badge-ink: var(--color-primary-text);
92
104
  background-color: var(--color-warning);
93
- color: var(--color-primary-text);
105
+ color: var(--cn-status-badge-ink);
94
106
  }
95
107
 
96
108
  .cn-status-badge--solid.cn-status-badge--error {
109
+ --cn-status-badge-ink: white;
97
110
  background-color: var(--color-error);
98
- color: white;
111
+ color: var(--cn-status-badge-ink);
99
112
  }
100
113
 
101
114
  .cn-status-badge--solid.cn-status-badge--info {
115
+ --cn-status-badge-ink: white;
102
116
  background-color: var(--color-info, #0082c9);
103
- color: white;
117
+ color: var(--cn-status-badge-ink);
104
118
  }
105
119
 
106
120
  .cn-status-badge--solid.cn-status-badge--purple {
121
+ --cn-status-badge-ink: white;
107
122
  background-color: var(--cn-status-purple-text);
108
- color: white;
123
+ color: var(--cn-status-badge-ink);
109
124
  }
110
125
 
111
126
  .cn-status-badge--solid.cn-status-badge--teal {
127
+ --cn-status-badge-ink: white;
112
128
  background-color: var(--cn-status-teal-text);
113
- color: white;
129
+ color: var(--cn-status-badge-ink);
114
130
  }
@@ -525,3 +525,18 @@
525
525
  align-items: center;
526
526
  gap: 4px;
527
527
  }
528
+
529
+ /* The tag after an admin-only entry in a board detail page's Actions menu
530
+ ("beheerder", DqZaakMeer): 12px muted text at the end of the row. The menu
531
+ opens outside the page, so the rule keys on the attribute CnDetailPage sets
532
+ only in the board look. */
533
+ .action-button[data-cn-admin-tag]::after,
534
+ .action-link[data-cn-admin-tag]::after {
535
+ content: attr(data-cn-admin-tag);
536
+ margin-inline-start: auto;
537
+ padding-inline: 12px 4px;
538
+ color: var(--color-text-maxcontrast);
539
+ font-size: 12px;
540
+ font-weight: 400;
541
+ white-space: nowrap;
542
+ }
@@ -173,6 +173,54 @@
173
173
  color: var(--color-main-text);
174
174
  }
175
175
 
176
+ /* A Nextcloud text field or text area in a board dialog is the board's field:
177
+ its label above the control at 14px/600, the control 40px with a 1px grey
178
+ border and radius 8 (PlanItemDialog, DqWerkvoorraad). NcInputField draws
179
+ its border as a 65%-transparent shadow, which on the white dialog read as
180
+ an empty band, and floats its label inside the border. A field with
181
+ `labelOutside` keeps the app's own label and takes the same control. */
182
+ .cn-dialog-board .dialog__content .input-field:has(.input-field__label),
183
+ .cn-dialog-board .dialog__content .textarea:has(.textarea__label) {
184
+ margin-block-start: 26px;
185
+ }
186
+
187
+ /* The doubled class outranks NcInputField's raised-label rule (focused or
188
+ filled), which would pin the label's top as well and squash it. */
189
+ .cn-dialog-board .dialog__content .input-field__input + .input-field__label.input-field__label,
190
+ .cn-dialog-board .dialog__content .textarea__input + .textarea__label.textarea__label {
191
+ inset-block-start: auto;
192
+ inset-block-end: calc(100% + 4px);
193
+ inset-inline: 0 auto;
194
+ max-width: 100%;
195
+ margin: 0;
196
+ padding: 0;
197
+ background: none;
198
+ color: var(--color-main-text);
199
+ font-size: var(--cn-field-label-size, 14px);
200
+ font-weight: 600;
201
+ line-height: 20px;
202
+ pointer-events: auto;
203
+ transition: none;
204
+ }
205
+
206
+ .cn-dialog-board .dialog__content .input-field__main-wrapper {
207
+ height: calc(var(--cn-field-height, 40px) + 2 * var(--border-width-input-focused, 2px));
208
+ }
209
+
210
+ .cn-dialog-board .dialog__content .input-field__input,
211
+ .cn-dialog-board .dialog__content .input-field__input:hover:not([disabled]),
212
+ .cn-dialog-board .dialog__content .textarea__input,
213
+ .cn-dialog-board .dialog__content .textarea__input:hover:not([disabled]) {
214
+ border-radius: 8px;
215
+ box-shadow: 0 0 0 1px var(--color-border-dark);
216
+ font-size: var(--cn-field-text-size, 15px);
217
+ }
218
+
219
+ .cn-dialog-board .dialog__content .input-field:has(.input-field__label) .input-field__input:not(:focus)::placeholder,
220
+ .cn-dialog-board .dialog__content .textarea__input:not(:focus)::placeholder {
221
+ opacity: 1 !important;
222
+ }
223
+
176
224
  /* Type-to-confirm: a labelled 40px field with a monospace value and a hint. */
177
225
  .cn-dialog__confirm-field {
178
226
  display: flex;
@@ -152,6 +152,32 @@
152
152
  margin-top: 16px;
153
153
  }
154
154
 
155
+ /* ---- The stages bars (CnStagesWidget `variant: "bars"`) ---------------- */
156
+ /* DqZaak's "Voortgang": the bars sit flush with the content edge (the
157
+ widget's 4px pad is room for the 32px circles, which the bars variant does
158
+ not draw), the label 8px under its bar and the date 8px under the label at
159
+ the normal line height, open steps muted and the done and current ones in
160
+ the main text. Each hands its ink to --nldesign-color-on-surface, which a
161
+ theme that forces the body ink onto every span (thematiq) reads instead. */
162
+ .cn-look-board .cn-stages-widget:has(> .cn-stages-widget__bars):not(.cn-look-nextcloud *) {
163
+ padding: 0;
164
+ }
165
+
166
+ .cn-look-board .cn-stages-widget__bars .cn-stages-widget__bar-label:not(.cn-look-nextcloud *) {
167
+ --nldesign-color-on-surface: var(--color-text-maxcontrast);
168
+ line-height: normal;
169
+ }
170
+
171
+ .cn-look-board .cn-stages-widget__bars .cn-stages-widget__bar-step--done .cn-stages-widget__bar-label:not(.cn-look-nextcloud *),
172
+ .cn-look-board .cn-stages-widget__bars .cn-stages-widget__bar-step--current .cn-stages-widget__bar-label:not(.cn-look-nextcloud *) {
173
+ --nldesign-color-on-surface: var(--color-main-text);
174
+ }
175
+
176
+ .cn-look-board .cn-stages-widget__bars .cn-stages-widget__bar-date:not(.cn-look-nextcloud *) {
177
+ --nldesign-color-on-surface: var(--color-text-maxcontrast);
178
+ line-height: normal;
179
+ }
180
+
155
181
  /* ---- The body and the side column ------------------------------------- */
156
182
 
157
183
  .cn-look-board.cn-detail-page--with-side {
@@ -185,6 +211,7 @@
185
211
  The open tab overlaps that top border by 1px (the nav's -1px margin) and
186
212
  paints over it, so it flows into the card as a folder tab. */
187
213
  .cn-look-board .cn-tabs--board .cn-tabs__bar {
214
+ align-items: flex-end;
188
215
  border-bottom: none;
189
216
  gap: 4px;
190
217
  position: relative;
@@ -227,6 +254,9 @@
227
254
  row-gap: 4px;
228
255
  }
229
256
 
257
+ /* `margin: 0`: a tab is a <button>, and Nextcloud's core stylesheet gives
258
+ 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"). */
230
260
  .cn-look-board .cn-tabs--board .cn-tabs__nav-item {
231
261
  background-color: var(--color-background-dark);
232
262
  border: 1px solid var(--color-border-dark);
@@ -234,6 +264,7 @@
234
264
  border-radius: 8px 8px 0 0;
235
265
  font-size: 14px;
236
266
  font-weight: 400;
267
+ margin: 0;
237
268
  min-height: 34px;
238
269
  padding: 8px 12px;
239
270
  }
@@ -267,9 +298,12 @@
267
298
  padding: 0 6px;
268
299
  }
269
300
 
270
- /* The Actions button at the end of the strip, level with the tabs. */
301
+ /* The Actions button at the end of the strip: at the top, 8px in from the
302
+ end and 8px clear of the card, so the tabs, aligned to the bottom, sit 6px
303
+ lower than the button (DqZaak "Acties"). */
271
304
  .cn-look-board .cn-tabs--board .cn-tabs__nav-end {
272
305
  align-self: flex-start;
306
+ margin: 0 8px 8px 0;
273
307
  }
274
308
 
275
309
  .cn-look-board .cn-tabs--board .cn-tabs__nav-end .button-vue {
@@ -327,21 +361,26 @@
327
361
 
328
362
  /* ---- Body cards and side cards ----------------------------------------- */
329
363
 
364
+ /* A CnDetailCard takes the board card wherever it sits, not only on a detail
365
+ page: a dashboard or a custom page that mounts one drew the Nextcloud card
366
+ (a 12px 16px header over a rule). The doubled class keeps the specificity
367
+ the page-scoped rule had. */
368
+
330
369
  .cn-look-board .cn-detail-page .cn-widget-wrapper,
331
- .cn-look-board .cn-detail-page .cn-detail-card {
370
+ .cn-look-board .cn-detail-card.cn-detail-card:not(.cn-detail-card--chromeless) {
332
371
  background: var(--color-main-background);
333
372
  border: 1px solid var(--color-border);
334
373
  border-radius: var(--cn-board-card-radius);
335
374
  }
336
375
 
337
376
  .cn-look-board .cn-detail-page .cn-widget-wrapper__header,
338
- .cn-look-board .cn-detail-page .cn-detail-card__header {
377
+ .cn-look-board .cn-detail-card .cn-detail-card__header {
339
378
  border-bottom: none;
340
379
  padding: 20px 22px 0;
341
380
  }
342
381
 
343
382
  .cn-look-board .cn-detail-page .cn-widget-wrapper__title,
344
- .cn-look-board .cn-detail-page .cn-detail-card__title {
383
+ .cn-look-board .cn-detail-card .cn-detail-card__title {
345
384
  font-size: var(--cn-board-heading-size);
346
385
  font-weight: 700;
347
386
  line-height: 1.3;
@@ -351,7 +390,7 @@
351
390
  padding: 12px 22px 20px;
352
391
  }
353
392
 
354
- .cn-look-board .cn-detail-page .cn-detail-card__content {
393
+ .cn-look-board .cn-detail-card .cn-detail-card__content {
355
394
  padding: 12px 22px 20px;
356
395
  }
357
396
 
@@ -398,10 +437,12 @@
398
437
  font-weight: 500;
399
438
  }
400
439
 
401
- /* Side cards: the heading is a 15px muted label, not a title. */
440
+ /* Side cards: the heading is a 15px muted label, not a title. The tone
441
+ carries `!important` against a theme that colours every h3 that way
442
+ (thematiq's heading colour). */
402
443
  .cn-look-board .cn-detail-page__side .cn-widget-wrapper__title,
403
444
  .cn-look-board .cn-detail-page__side .cn-detail-card__title {
404
- color: var(--color-text-maxcontrast);
445
+ color: var(--color-text-maxcontrast) !important;
405
446
  font-size: var(--cn-board-side-heading-size);
406
447
  font-weight: 600;
407
448
  }
@@ -456,17 +497,23 @@
456
497
 
457
498
  /* ---- The next-step card ------------------------------------------------- */
458
499
 
500
+ /* The board sets the card at the browser's normal line height: a step row is
501
+ the 20px marker, 28px apart (DqZaak "Wat nu?"). */
459
502
  .cn-look-board .cn-next-step-card--board {
460
503
  border-radius: 12px;
461
504
  gap: 16px 32px;
505
+ line-height: normal;
462
506
  padding: 20px 24px 20px 28px;
463
507
  }
464
508
 
509
+ /* The kicker keeps its tone under a theme that colours every h3 with
510
+ `!important` (thematiq's heading colour); only `!important` beats it. */
465
511
  .cn-look-board .cn-next-step-card--board .cn-next-step-card__title.cn-next-step-card__title {
466
- color: var(--color-primary-element-light-text);
512
+ color: var(--color-primary-element-light-text) !important;
467
513
  font-size: 13px !important;
468
514
  font-weight: 700;
469
515
  letter-spacing: 0.06em;
516
+ line-height: normal;
470
517
  text-transform: uppercase;
471
518
  }
472
519
 
@@ -497,11 +544,36 @@
497
544
  padding: 0 20px;
498
545
  }
499
546
 
547
+ /* The label alone sets the width (DqZaak: 198px for "Verder met beoordelen"):
548
+ NcButton pads its text 4px a side inside the button's own padding, from a
549
+ rule that reaches it through `:has()`, hence the doubled class. */
550
+ .cn-look-board .cn-next-step-card--board .cn-next-step-card__side .button-vue .button-vue__text.button-vue__text {
551
+ margin-inline: 0;
552
+ padding-inline: 0;
553
+ }
554
+
500
555
  .cn-look-board .cn-next-step-card--board .cn-next-step-card__after {
501
556
  color: var(--color-text-maxcontrast);
502
557
  font-size: 13px;
503
558
  }
504
559
 
560
+ /* Done and open steps are muted, the current one in the main text. Each hands
561
+ its ink to --nldesign-color-on-surface, which a theme that forces the body
562
+ ink onto every li and span (thematiq) reads instead. */
563
+ .cn-look-board .cn-next-step-card--board .cn-next-step-card__item,
564
+ .cn-look-board .cn-next-step-card--board .cn-next-step-card__hint,
565
+ .cn-look-board .cn-next-step-card--board .cn-next-step-card__after {
566
+ --nldesign-color-on-surface: var(--color-text-maxcontrast);
567
+ }
568
+
569
+ .cn-look-board .cn-next-step-card--board .cn-next-step-card__item--current {
570
+ --nldesign-color-on-surface: var(--color-main-text);
571
+ }
572
+
573
+ .cn-look-board .cn-next-step-card--board .cn-next-step-card__item--current .cn-next-step-card__hint {
574
+ --nldesign-color-on-surface: var(--color-text-maxcontrast);
575
+ }
576
+
505
577
  /* ---- History: the activity tab ------------------------------------------ */
506
578
 
507
579
  .cn-look-board .cn-activity-tab--board .cn-activity-tab__board-head {
@@ -184,10 +184,15 @@
184
184
  outline-offset: 2px;
185
185
  }
186
186
 
187
+ /* The selected chip is light on dark, so it hands its ink to
188
+ --nldesign-color-on-surface: thematiq forces the body ink onto every span
189
+ with `!important` and reads it from that property, which left the label
190
+ dark on dark. */
187
191
  .cn-look-board .cn-saved-views__chips .cn-saved-views__chip--selected,
188
192
  .cn-look-board .cn-saved-views__chips .cn-saved-views__chip--selected:hover,
189
193
  .cn-look-board .cn-quick-filter-bar .cn-quick-filter-bar__tab--active,
190
194
  .cn-look-board .cn-quick-filter-bar .cn-quick-filter-bar__tab--active:hover {
195
+ --nldesign-color-on-surface: var(--color-main-background);
191
196
  border-color: transparent;
192
197
  background: var(--color-main-text);
193
198
  color: var(--color-main-background);
@@ -208,8 +213,12 @@
208
213
  }
209
214
 
210
215
  .cn-look-board .cn-saved-views__chip--selected .cn-saved-views__chip-count,
216
+ /* On the selected chip the count is a lighter bubble on the dark chip
217
+ (DqZaken: #3d4047 on #1b1c1d); --cn-board-text-soft resolves to the main
218
+ text, the chip's own colour, which hid the bubble. */
211
219
  .cn-look-board .cn-quick-filter-bar .cn-quick-filter-bar__tab--active .cn-quick-filter-bar__count {
212
- background: var(--cn-board-text-soft);
220
+ --nldesign-color-on-surface: var(--color-primary-element-text);
221
+ background: color-mix(in srgb, var(--color-main-background) 15%, var(--color-main-text));
213
222
  color: var(--color-primary-element-text);
214
223
  }
215
224
 
@@ -481,12 +490,16 @@
481
490
  border-radius: 0;
482
491
  }
483
492
 
484
- /* The header row is near-white on the boards (#fafbfc), not the hover grey. */
493
+ /* The header row is near-white on the boards (#fafbfc), not the hover grey,
494
+ its labels 14px muted. The ink also goes to --nldesign-color-on-surface,
495
+ which a theme that forces the body ink onto every span (thematiq) reads. */
485
496
  .cn-look-board .cn-table-container--board .cn-data-table th {
497
+ --nldesign-color-on-surface: var(--color-text-maxcontrast);
486
498
  padding: 12px 16px;
487
499
  border-bottom: 0;
488
500
  background: var(--cn-board-table-head-bg, color-mix(in srgb, var(--color-background-hover) 40%, var(--color-main-background)));
489
501
  color: var(--color-text-maxcontrast);
502
+ font-size: 14px;
490
503
  font-weight: 600;
491
504
  }
492
505
 
@@ -497,6 +510,20 @@
497
510
  font-size: 14px;
498
511
  }
499
512
 
513
+ /* The board sets its table at the normal line height: a row with a title and
514
+ a secondary line is 66px and the header row 50px (DqZaken). Nextcloud's 1.5
515
+ made them 71px and 67px, and the header's sort button kept the 34px
516
+ clickable area. */
517
+ .cn-look-board .cn-table-container--board .cn-data-table {
518
+ line-height: normal;
519
+ }
520
+
521
+ .cn-look-board .cn-table-container--board .cn-data-table th .cn-table-header__sort {
522
+ min-height: 0;
523
+ height: auto;
524
+ line-height: inherit;
525
+ }
526
+
500
527
  .cn-look-board .cn-table-container--board .cn-data-table .cn-table-row {
501
528
  border-bottom: 0;
502
529
  }
@@ -552,7 +579,9 @@
552
579
  margin-inline-start: 4px;
553
580
  }
554
581
 
555
- /* The selection column: 18px checkboxes, 28px of content after 16px of padding.
582
+ /* The selection column: 18px checkboxes, 28px of content between 16px of
583
+ padding either side, 60px in all (DqZaken and 130 other boards; the title
584
+ column starts 77px in).
556
585
  The box model is set with `!important` and the widths include the padding:
557
586
  Nextcloud's server.css sets `box-sizing: border-box` on everything under
558
587
  `#content[class*="app-"]`, an id selector no class rule outranks, so a plain
@@ -560,9 +589,9 @@
560
589
  header's checkbox showed as a stray bracket). */
561
590
  .cn-look-board .cn-table-container--board .cn-data-table .cn-table-col--checkbox {
562
591
  box-sizing: border-box !important;
563
- width: 44px;
564
- min-width: 44px;
565
- padding-inline: 16px 0;
592
+ width: 60px;
593
+ min-width: 60px;
594
+ padding-inline: 16px;
566
595
  text-align: start;
567
596
  }
568
597
 
@@ -570,6 +599,16 @@
570
599
  --icon-size: 18px;
571
600
  }
572
601
 
602
+ /* The checkbox is the 18px box alone, as the board draws it: NcCheckboxRadioSwitch
603
+ wraps it in a 34px clickable area with 4px 7px of padding, a 42px block that
604
+ set every row's height (71px where DqZaken's rows are 66). The cell around it
605
+ stays the click target's room: 44px wide, a full row high. */
606
+ .cn-look-board .cn-table-container--board .cn-data-table .checkbox-radio-switch .checkbox-radio-switch__content {
607
+ min-height: 0;
608
+ height: auto;
609
+ padding: 0;
610
+ }
611
+
573
612
  /* The title column: a 15px weight 600 link, the secondary line under it. */
574
613
  .cn-look-board .cn-table-container--board .cn-data-table td.cn-table-col--title {
575
614
  color: var(--color-main-text);
@@ -580,6 +619,7 @@
580
619
  }
581
620
 
582
621
  .cn-look-board .cn-table-container--board .cn-data-table td.cn-table-col--title .cn-table-cell__secondary {
622
+ --nldesign-color-on-surface: var(--color-text-maxcontrast);
583
623
  color: var(--color-text-maxcontrast);
584
624
  font-size: 14px;
585
625
  font-weight: 400;
@@ -621,10 +661,14 @@
621
661
  gap: 10px;
622
662
  }
623
663
 
664
+ /* The initials sit on the light primary tint in the primary ink, the board's
665
+ person chip (DqZaken's Behandelaar, and most boards' people). */
624
666
  .cn-look-board .cn-table-container--board .cn-data-table .cn-cell-renderer__avatar-initials {
625
- background: var(--color-background-dark);
626
- color: var(--color-main-text);
667
+ --nldesign-color-on-surface: var(--color-primary-element-light-text);
668
+ background: var(--color-primary-element-light);
669
+ color: var(--color-primary-element-light-text);
627
670
  font-size: 12px;
671
+ font-weight: 700;
628
672
  }
629
673
 
630
674
  .cn-look-board .cn-table-container--board .cn-data-table td.cn-table-col--title .cn-cell-renderer__avatar-name {