@conduction/nextcloud-vue 2.79.0 → 2.80.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 (197) hide show
  1. package/dist/esm/components/CnActionButtons/CnActionButtons.vue2.js.map +1 -1
  2. package/dist/esm/components/CnActionButtons/CnActionButtons.vue3.js +3 -1
  3. package/dist/esm/components/CnActionButtons/CnActionButtons.vue3.js.map +1 -1
  4. package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js +32 -3
  5. package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js.map +1 -1
  6. package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js +10 -8
  7. package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js.map +1 -1
  8. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js +39 -3
  9. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js.map +1 -1
  10. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js.map +1 -1
  11. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +79 -1
  12. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
  13. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js +133 -96
  14. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
  15. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
  16. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +1 -0
  17. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
  18. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +62 -4
  19. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  20. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  21. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js +24 -0
  22. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -1
  23. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js +43 -4
  24. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js.map +1 -1
  25. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js +11 -0
  26. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js.map +1 -0
  27. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js +736 -0
  28. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -0
  29. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js +238 -0
  30. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -0
  31. package/dist/esm/components/CnFactsWidget/index.js +30 -0
  32. package/dist/esm/components/CnFactsWidget/index.js.map +1 -0
  33. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue.js +10 -0
  34. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue.js.map +1 -0
  35. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js +551 -0
  36. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js.map +1 -0
  37. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js +183 -0
  38. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js.map +1 -0
  39. package/dist/esm/components/CnFieldListWidget/index.js +29 -0
  40. package/dist/esm/components/CnFieldListWidget/index.js.map +1 -0
  41. package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js +65 -17
  42. package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js.map +1 -1
  43. package/dist/esm/components/CnFormDialog/CnFormDialog.vue3.js +4 -4
  44. package/dist/esm/components/CnFormDialog/CnFormDialog.vue3.js.map +1 -1
  45. package/dist/esm/components/CnFormPage/CnFormPage.vue2.js +18 -3
  46. package/dist/esm/components/CnFormPage/CnFormPage.vue2.js.map +1 -1
  47. package/dist/esm/components/CnFormPage/CnFormPage.vue3.js.map +1 -1
  48. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +305 -72
  49. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  50. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +31 -13
  51. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  52. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue.js +10 -0
  53. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue.js.map +1 -0
  54. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue2.js +99 -0
  55. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue2.js.map +1 -0
  56. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue3.js +48 -0
  57. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue3.js.map +1 -0
  58. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue2.js +29 -1
  59. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue2.js.map +1 -1
  60. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue3.js.map +1 -1
  61. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +10 -0
  62. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js.map +1 -0
  63. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +387 -0
  64. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -0
  65. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js +169 -0
  66. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -0
  67. package/dist/esm/components/CnRecordListWidget/index.js +31 -0
  68. package/dist/esm/components/CnRecordListWidget/index.js.map +1 -0
  69. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue.js +10 -0
  70. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue.js.map +1 -0
  71. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue2.js +351 -0
  72. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue2.js.map +1 -0
  73. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue3.js +71 -0
  74. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue3.js.map +1 -0
  75. package/dist/esm/components/CnSectionsWidget/index.js +35 -0
  76. package/dist/esm/components/CnSectionsWidget/index.js.map +1 -0
  77. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js +81 -2
  78. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js.map +1 -1
  79. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue3.js.map +1 -1
  80. package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js.map +1 -1
  81. package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js +1 -0
  82. package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js.map +1 -1
  83. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +122 -7
  84. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
  85. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js +84 -23
  86. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
  87. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js +4 -0
  88. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js.map +1 -1
  89. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue2.js +106 -2
  90. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue2.js.map +1 -1
  91. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue3.js +105 -53
  92. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue3.js.map +1 -1
  93. package/dist/esm/composables/useFormDraft.js +140 -9
  94. package/dist/esm/composables/useFormDraft.js.map +1 -1
  95. package/dist/esm/index.js +4 -0
  96. package/dist/esm/index.js.map +1 -1
  97. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue2.js +28 -20
  98. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue2.js.map +1 -1
  99. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue3.js +9 -0
  100. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue3.js.map +1 -1
  101. package/dist/esm/integrations/builtin/field-inspection.js +21 -0
  102. package/dist/esm/integrations/builtin/field-inspection.js.map +1 -1
  103. package/dist/esm/integrations/offline/checklistSubmission.js +141 -0
  104. package/dist/esm/integrations/offline/checklistSubmission.js.map +1 -0
  105. package/dist/esm/integrations/offline/fieldCollectionHelpers.js +70 -5
  106. package/dist/esm/integrations/offline/fieldCollectionHelpers.js.map +1 -1
  107. package/dist/esm/integrations/offline/index.js +2 -1
  108. package/dist/esm/integrations/offline/index.js.map +1 -1
  109. package/dist/esm/integrations/offline/offlineDb.js +6 -1
  110. package/dist/esm/integrations/offline/offlineDb.js.map +1 -1
  111. package/dist/esm/integrations/offline/syncReplayService.js +8 -2
  112. package/dist/esm/integrations/offline/syncReplayService.js.map +1 -1
  113. package/dist/esm/l10n/en.json.js +12 -1
  114. package/dist/esm/l10n/en.json.js.map +1 -1
  115. package/dist/esm/l10n/nl.json.js +16 -2
  116. package/dist/esm/l10n/nl.json.js.map +1 -1
  117. package/dist/esm/nextcloud-vue.css +1000 -59
  118. package/dist/esm/utils/detailActionModel.js +60 -3
  119. package/dist/esm/utils/detailActionModel.js.map +1 -1
  120. package/dist/esm/utils/fillTemplate.js +114 -0
  121. package/dist/esm/utils/fillTemplate.js.map +1 -0
  122. package/dist/esm/utils/libraryWidgetKeys.js +4 -0
  123. package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
  124. package/dist/esm/utils/queryPresets.js +96 -0
  125. package/dist/esm/utils/queryPresets.js.map +1 -0
  126. package/dist/esm/utils/resolveFilterTokens.js +11 -0
  127. package/dist/esm/utils/resolveFilterTokens.js.map +1 -1
  128. package/dist/esm/utils/schema.js +21 -0
  129. package/dist/esm/utils/schema.js.map +1 -1
  130. package/dist/esm/utils/sentinelTokens.js +3 -3
  131. package/dist/esm/utils/sentinelTokens.js.map +1 -1
  132. package/dist/esm/utils/validateManifestV2.compiled.js +3 -3
  133. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  134. package/dist/esm/utils/widgetDispatch.js +7 -1
  135. package/dist/esm/utils/widgetDispatch.js.map +1 -1
  136. package/dist/nextcloud-vue.cjs.js +12368 -7717
  137. package/dist/nextcloud-vue.cjs.js.map +2 -2
  138. package/dist/nextcloud-vue.css +1000 -59
  139. package/l10n/en.json +12 -1
  140. package/l10n/nl.json +16 -2
  141. package/package.json +1 -1
  142. package/src/components/CnActionButtons/CnActionButtons.vue +2 -0
  143. package/src/components/CnActionsBar/CnActionsBar.md +4 -0
  144. package/src/components/CnActionsBar/CnActionsBar.vue +42 -10
  145. package/src/components/CnBannerWidget/CnBannerWidget.vue +39 -3
  146. package/src/components/CnCellRenderer/CnCellRenderer.vue +188 -1
  147. package/src/components/CnDataTable/CnDataTable.vue +1 -0
  148. package/src/components/CnDetailPage/CnDetailPage.md +1 -1
  149. package/src/components/CnDetailPage/CnDetailPage.vue +63 -3
  150. package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +66 -0
  151. package/src/components/CnFactsWidget/CnFactsWidget.vue +1050 -0
  152. package/src/components/CnFactsWidget/index.js +29 -0
  153. package/src/components/CnFieldListWidget/CnFieldListWidget.vue +746 -0
  154. package/src/components/CnFieldListWidget/index.js +28 -0
  155. package/src/components/CnFormDialog/CnFormDialog.md +9 -3
  156. package/src/components/CnFormDialog/CnFormDialog.vue +69 -21
  157. package/src/components/CnFormPage/CnFormPage.vue +18 -3
  158. package/src/components/CnIndexPage/CnIndexPage.vue +254 -6
  159. package/src/components/CnIndexPage/CnIndexPageWidgets.vue +169 -0
  160. package/src/components/CnPageRenderer/CnPageRenderer.vue +29 -1
  161. package/src/components/CnRecordListWidget/CnRecordListWidget.vue +603 -0
  162. package/src/components/CnRecordListWidget/index.js +30 -0
  163. package/src/components/CnSectionsWidget/CnSectionsWidget.vue +489 -0
  164. package/src/components/CnSectionsWidget/index.js +34 -0
  165. package/src/components/CnStagesWidget/CnStagesWidget.vue +81 -2
  166. package/src/components/CnStatWidget/CnStatWidget.vue +1 -1
  167. package/src/components/CnTabsWidget/CnTabsWidget.vue +184 -8
  168. package/src/components/CnWidgetGrid/registerDashboardWidgets.js +4 -0
  169. package/src/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue +188 -4
  170. package/src/components/index.js +4 -0
  171. package/src/composables/__tests__/useFormDraft.spec.js +69 -0
  172. package/src/composables/useFormDraft.js +139 -8
  173. package/src/css/form-field.css +14 -0
  174. package/src/css/index-page.css +71 -0
  175. package/src/css/kpi-card.css +32 -0
  176. package/src/css/look-board-detail.css +77 -0
  177. package/src/css/look-board-index.css +51 -0
  178. package/src/css/look-board.css +37 -2
  179. package/src/css/table.css +19 -0
  180. package/src/index.js +4 -0
  181. package/src/integrations/builtin/field-inspection/CnFieldInspectionCard.vue +35 -20
  182. package/src/integrations/builtin/field-inspection.js +21 -0
  183. package/src/integrations/offline/checklistSubmission.js +137 -0
  184. package/src/integrations/offline/fieldCollectionHelpers.js +69 -4
  185. package/src/integrations/offline/index.js +3 -0
  186. package/src/integrations/offline/offlineDb.js +6 -1
  187. package/src/integrations/offline/syncReplayService.js +8 -2
  188. package/src/schemas/app-manifest-v2.schema.json +104 -5
  189. package/src/utils/detailActionModel.js +59 -2
  190. package/src/utils/fillTemplate.js +110 -0
  191. package/src/utils/libraryWidgetKeys.js +4 -0
  192. package/src/utils/queryPresets.js +93 -0
  193. package/src/utils/resolveFilterTokens.js +11 -0
  194. package/src/utils/schema.js +21 -0
  195. package/src/utils/sentinelTokens.js +3 -3
  196. package/src/utils/validateManifestV2.compiled.js +3 -3
  197. package/src/utils/widgetDispatch.js +7 -1
@@ -79,9 +79,14 @@
79
79
  * counterpart default to one.
80
80
  */
81
81
  .cn-look-board {
82
- /* Page content area: padding, max width, gap between blocks. */
82
+ /* Page content area: padding, max width, gap between blocks. The content
83
+ spans the whole content area (screens-one-scroller-parity): grids grow
84
+ with the window and shrink only when the sidebar takes its share. A
85
+ 1240px cap left dead space right of the content, and on a dashboard,
86
+ which scrolled itself, put the scrollbar beside the content instead of
87
+ at the window edge. */
83
88
  --cn-board-content-padding: 24px 28px;
84
- --cn-board-content-max-width: 1240px;
89
+ --cn-board-content-max-width: none;
85
90
  --cn-board-section-gap: 20px;
86
91
  /* Buttons and inputs. */
87
92
  --cn-board-control-height: 40px;
@@ -121,6 +126,15 @@
121
126
  gap: var(--cn-board-section-gap);
122
127
  }
123
128
 
129
+ /* One scroller: the content area. CnDashboardPage scrolls itself
130
+ (`height: 100%; overflow-y: auto`), which nested a second scrollbar inside
131
+ NcAppContent's; under the board look the page grows with its widgets and
132
+ NcAppContent, which already spans to the window edge, scrolls it. */
133
+ .cn-look-board .cn-dashboard-page:not(.cn-look-nextcloud *) {
134
+ height: auto;
135
+ overflow-y: visible;
136
+ }
137
+
124
138
  .cn-look-board .cn-index-page:not(.cn-look-nextcloud *) .cn-page-header,
125
139
  .cn-look-board .cn-settings-page:not(.cn-look-nextcloud *) .cn-page-header,
126
140
  .cn-look-board .cn-index-page:not(.cn-look-nextcloud *) .cn-index-page__below-header,
@@ -234,6 +248,27 @@
234
248
  gap: 2px;
235
249
  }
236
250
 
251
+ /* No scrollbars inside the navigation (screens-one-scroller-parity).
252
+ NcAppNavigation gives the region above the list `overflow-y: scroll`, an
253
+ always-on track (with arrow buttons on classic scrollbars) beside the
254
+ primary action that has nothing to scroll. It takes its content's height
255
+ instead. A menu taller than the window still scrolls (wheel, touch, focus),
256
+ without drawing a bar of its own; the one visible scrollbar is the page's. */
257
+ .cn-look-board .app-navigation[data-testid="cn-nav"] .app-navigation__body:not(.app-navigation__body--no-list) {
258
+ flex-shrink: 0;
259
+ overflow: visible;
260
+ }
261
+
262
+ .cn-look-board .app-navigation[data-testid="cn-nav"] .app-navigation__list,
263
+ .cn-look-board .app-navigation[data-testid="cn-nav"] .app-navigation__body--no-list {
264
+ scrollbar-width: none;
265
+ }
266
+
267
+ .cn-look-board .app-navigation[data-testid="cn-nav"] .app-navigation__list::-webkit-scrollbar,
268
+ .cn-look-board .app-navigation[data-testid="cn-nav"] .app-navigation__body--no-list::-webkit-scrollbar {
269
+ display: none;
270
+ }
271
+
237
272
  /* The board's vertical rhythm (AppZijbalk): the primary action 20px from the
238
273
  top, the list 20px under it, entries 2px apart. An empty search slot is a
239
274
  flex child too and pushed everything 20px down, so it goes. */
@@ -874,6 +909,20 @@
874
909
  min-height: var(--cn-field-height);
875
910
  }
876
911
 
912
+ /* NcTextField draws its input inside `.input-field__main-wrapper`, which has a
913
+ FIXED height (`--default-clickable-area`, 34px on Nextcloud 34) and a 2px
914
+ padding ring for the focus outline. The min-height above makes the input
915
+ 40px, so without this the input overflowed its wrapper by 6px and the help
916
+ line under it, which starts at the wrapper's bottom edge, sat behind the
917
+ input's lower border. NcSelect grows with its content, which is why only
918
+ plain inputs showed it. The wrapper now takes the field height plus its
919
+ padding ring, so the input fits and the help line starts below it.
920
+ @spec openspec/changes/form-draft-on-change-and-help-text-spacing/specs/form-draft-on-change-and-help-text-spacing/spec.md#requirement-help-text-starts-below-every-input */
921
+ .cn-look-board .cn-form-dialog__field .input-field__main-wrapper,
922
+ .cn-look-board .cn-form-page__field .input-field__main-wrapper {
923
+ height: calc(var(--cn-field-height) + 2 * var(--border-width-input-focused, 2px));
924
+ }
925
+
877
926
  .cn-look-board .cn-form-dialog__field textarea,
878
927
  .cn-look-board .cn-form-page__field textarea {
879
928
  padding: 10px 12px;
@@ -1533,6 +1582,15 @@
1533
1582
  color: var(--color-main-text);
1534
1583
  }
1535
1584
 
1585
+ /* A segment the page cannot open: drawn, as the boards do, but faded and inert. */
1586
+ .cn-look-board .cn-actions-bar--board .cn-actions-bar__view-toggle .cn-actions-bar__view-toggle-btn--disabled,
1587
+ .cn-look-board .cn-actions-bar--board .cn-actions-bar__view-toggle .cn-actions-bar__view-toggle-btn--disabled:hover {
1588
+ background: transparent !important;
1589
+ color: var(--color-text-maxcontrast);
1590
+ opacity: 0.5;
1591
+ cursor: not-allowed;
1592
+ }
1593
+
1536
1594
  /* The search field: 40px, radius 8, not a pill. */
1537
1595
  .cn-look-board .cn-actions-bar--board .cn-actions-bar__search {
1538
1596
  flex: 1 1 260px;
@@ -1680,6 +1738,48 @@
1680
1738
  border-bottom: 0;
1681
1739
  }
1682
1740
 
1741
+ /* The table fits its card (screens-index-table-fit-parity). Under the auto
1742
+ layout every one-line cell asked for its whole text up to the 22rem cap, so
1743
+ seven text columns made a 1500px table in a 1118px card at a 1440px
1744
+ viewport: the last columns and the row menus sat past the card's edge. The
1745
+ fixed layout shares the card's width: the selection and menu columns keep
1746
+ their own width, the first data column takes 18%, the others split the
1747
+ rest, and a value that does not fit is cut with an ellipsis (its full text
1748
+ stays in the cell's tooltip). A column's own `width` still wins. */
1749
+ .cn-look-board .cn-index-page__main--table .cn-table-container--board .cn-data-table {
1750
+ table-layout: fixed;
1751
+ width: 100%;
1752
+ }
1753
+
1754
+ .cn-look-board .cn-index-page__main--table .cn-table-container--board .cn-data-table th.cn-table-head--title {
1755
+ width: 18%;
1756
+ }
1757
+
1758
+ /* The board's data cells sit 12px apart (PqTickets), the first one 18px from
1759
+ the selection column; the selection and menu columns keep 16px. */
1760
+ .cn-look-board .cn-index-page__main--table .cn-table-container--board .cn-data-table th:not(.cn-table-col--checkbox):not(.cn-table-col--actions):not(.cn-table-col--icon),
1761
+ .cn-look-board .cn-index-page__main--table .cn-table-container--board .cn-data-table td:not(.cn-table-col--checkbox):not(.cn-table-col--actions):not(.cn-table-col--icon) {
1762
+ padding-inline: 12px;
1763
+ }
1764
+
1765
+ .cn-look-board .cn-index-page__main--table .cn-table-container--board .cn-data-table th.cn-table-head--title,
1766
+ .cn-look-board .cn-index-page__main--table .cn-table-container--board .cn-data-table td.cn-table-col--title {
1767
+ padding-inline-start: 18px;
1768
+ }
1769
+
1770
+ .cn-look-board .cn-index-page__main--table .cn-table-container--board .cn-data-table td > .cn-cell-renderer {
1771
+ display: block;
1772
+ min-width: 0;
1773
+ overflow: hidden;
1774
+ text-overflow: ellipsis;
1775
+ white-space: nowrap;
1776
+ }
1777
+
1778
+ /* A narrow header cuts its label, not its filter funnel. */
1779
+ .cn-look-board .cn-index-page__main--table .cn-table-container--board .cn-data-table th .cn-table-header__sort:has(~ .cn-table-header__filter) {
1780
+ max-width: calc(100% - 26px);
1781
+ }
1782
+
1683
1783
  /* The selection column: 28px, 18px checkboxes. */
1684
1784
  .cn-look-board .cn-table-container--board .cn-data-table .cn-table-col--checkbox {
1685
1785
  box-sizing: content-box;
@@ -2371,6 +2471,25 @@
2371
2471
  white-space: nowrap;
2372
2472
  }
2373
2473
 
2474
+ /* The secondary line of the growing column ("2026-0004" under a case title)
2475
+ is a line of its own with its own ellipsis. The cell does not wrap, so in
2476
+ the board look, where the secondary line is an inline block (the title
2477
+ underline cannot reach an atomic inline box), it stayed on the title's line
2478
+ and ran out of the tile. A full-width float is a block (computed `display:
2479
+ block`) that always starts under the line before it, and, being out of the
2480
+ flow, the cell's underline does not reach it either. The cell is a table
2481
+ cell, which contains its floats, so the row grows to hold the line.
2482
+ @spec openspec/changes/dashboard-tile-text-fits/specs/dashboard-tile-text-fits/spec.md#requirement-the-secondary-line-of-a-narrow-tables-growing-column-sits-under-the-value */
2483
+ .cn-data-table.cn-data-table--fit td.cn-table-col--grow .cn-table-cell__secondary {
2484
+ float: inline-start;
2485
+ clear: both;
2486
+ box-sizing: border-box;
2487
+ width: 100%;
2488
+ overflow: hidden;
2489
+ text-overflow: ellipsis;
2490
+ white-space: nowrap;
2491
+ }
2492
+
2374
2493
  .cn-data-table th {
2375
2494
  background: var(--color-background-dark);
2376
2495
  font-weight: 500;
@@ -3569,6 +3688,38 @@ a.cn-kpi-card--stacked:focus-visible {
3569
3688
  font-weight: 400;
3570
3689
  }
3571
3690
 
3691
+ /* A caption on a line of its own wraps, up to two lines (DqDashboard: "haalden
3692
+ hun termijn, naar doorlooptijd" runs over two lines in a narrow tile). The
3693
+ one-line rule of `.cn-kpi-card__label` is for a caption BESIDE the number,
3694
+ where a second line would push the tile taller; this line has the width of
3695
+ the tile to itself. The clamp is safe here because the element is a plain
3696
+ span, not a flex row (compare the title note above).
3697
+ @spec openspec/changes/dashboard-tile-text-fits/specs/dashboard-tile-text-fits/spec.md#requirement-a-kpi-tiles-caption-and-board-label-wrap-to-two-lines */
3698
+ .cn-kpi-card--stacked .cn-kpi-card__caption-line {
3699
+ display: -webkit-box;
3700
+ -webkit-box-orient: vertical;
3701
+ -webkit-line-clamp: 2;
3702
+ line-clamp: 2;
3703
+ white-space: normal;
3704
+ overflow-wrap: break-word;
3705
+ }
3706
+
3707
+ /* Board look: the label wraps too, up to two lines, beside its icon badge
3708
+ ("Afgehandeld deze maand"). The clamp sits on the label's own span
3709
+ (`cn-kpi-card__title-text`), not on the title row, which stays the flex row
3710
+ that carries the badge or the range select. */
3711
+ .cn-kpi-card--board .cn-kpi-card__title-text {
3712
+ flex: 1 1 auto;
3713
+ min-width: 0;
3714
+ display: -webkit-box;
3715
+ -webkit-box-orient: vertical;
3716
+ -webkit-line-clamp: 2;
3717
+ line-clamp: 2;
3718
+ overflow: hidden;
3719
+ white-space: normal;
3720
+ overflow-wrap: break-word;
3721
+ }
3722
+
3572
3723
  /* The 18px glyph before the label, drawn only on a link tile. */
3573
3724
  .cn-kpi-card--board .cn-kpi-card__title {
3574
3725
  display: flex;
@@ -4861,6 +5012,77 @@ a.cn-kpi-card--board * {
4861
5012
  color: var(--color-text-maxcontrast);
4862
5013
  font-size: 0.9em;
4863
5014
  }
5015
+
5016
+ /* An index page with cards beside its list (`sidePanel`,
5017
+ screens-index-stat-row): the header rows span the page, the toolbar and the
5018
+ list take the first column and the side panel the second (300px, 20px
5019
+ apart), spanning both. Every other child (dialogs, the inline sidebar) sits
5020
+ in a zero-height area after them. The list row is the flexible one, so a
5021
+ side panel taller than the toolbar never opens a gap under the toolbar.
5022
+ Below 1024px the panel moves above the toolbar. */
5023
+ .cn-index-page--with-side-panel {
5024
+ display: grid;
5025
+ grid-template-columns: minmax(0, 1fr) var(--cn-index-side-panel-width, 300px);
5026
+ grid-template-rows: auto auto auto auto minmax(0, 1fr) auto;
5027
+ grid-template-areas:
5028
+ "head head"
5029
+ "below below"
5030
+ "stats stats"
5031
+ "bar side"
5032
+ "body side"
5033
+ "extra extra";
5034
+ column-gap: 20px;
5035
+ align-content: start;
5036
+ }
5037
+
5038
+ .cn-index-page--with-side-panel > * {
5039
+ grid-area: extra;
5040
+ min-width: 0;
5041
+ }
5042
+
5043
+ .cn-index-page--with-side-panel > :first-child {
5044
+ grid-area: head;
5045
+ }
5046
+
5047
+ .cn-index-page--with-side-panel > .cn-index-page__below-header {
5048
+ grid-area: below;
5049
+ }
5050
+
5051
+ .cn-index-page--with-side-panel > .cn-index-page__stat-row {
5052
+ grid-area: stats;
5053
+ }
5054
+
5055
+ .cn-index-page--with-side-panel > .cn-actions-bar {
5056
+ grid-area: bar;
5057
+ }
5058
+
5059
+ .cn-index-page--with-side-panel > .cn-index-page__body {
5060
+ grid-area: body;
5061
+ }
5062
+
5063
+ .cn-index-page--with-side-panel > .cn-index-page__side-panel {
5064
+ grid-area: side;
5065
+ align-self: start;
5066
+ }
5067
+
5068
+ @media (max-width: 1024px) {
5069
+ .cn-index-page--with-side-panel {
5070
+ grid-template-columns: minmax(0, 1fr);
5071
+ grid-template-areas:
5072
+ "head"
5073
+ "below"
5074
+ "stats"
5075
+ "side"
5076
+ "bar"
5077
+ "body"
5078
+ "extra";
5079
+ grid-template-rows: auto auto auto auto auto minmax(0, 1fr) auto;
5080
+ }
5081
+
5082
+ .cn-index-page--with-side-panel > .cn-index-page__side-panel {
5083
+ margin-bottom: 20px;
5084
+ }
5085
+ }
4864
5086
  /* CnIndexSidebar — NcAppSidebar wrapper styles */
4865
5087
 
4866
5088
  /* Tab content: limit height to container so overflow shows a scrollbar */
@@ -5859,6 +6081,61 @@ a.cn-kpi-card--board * {
5859
6081
  margin-bottom: 0;
5860
6082
  }
5861
6083
 
6084
+ /* The breadcrumb is a line of 14px text between the pills and the meta, as
6085
+ the boards draw it (screens-detail-header-row-parity). NcBreadcrumbs grows to
6086
+ the full row and draws each crumb as a 34px tertiary button, which pushed the
6087
+ pills above it and the meta under it. The doubled class outranks its scoped
6088
+ rules. */
6089
+ .cn-look-board .cn-detail-page__header-row2 .cn-detail-page__breadcrumbs.cn-detail-page__breadcrumbs {
6090
+ flex: 0 1 auto;
6091
+ height: auto;
6092
+ min-height: 0;
6093
+ min-width: 0;
6094
+ width: auto;
6095
+ }
6096
+
6097
+ .cn-look-board .cn-detail-page__header-row2 .cn-detail-page__breadcrumbs .breadcrumb__crumbs {
6098
+ gap: 8px;
6099
+ margin: 0;
6100
+ min-height: 0;
6101
+ padding: 0;
6102
+ vertical-align: middle;
6103
+ }
6104
+
6105
+ .cn-look-board .cn-detail-page__header-row2 .cn-detail-page__breadcrumbs .vue-crumb.vue-crumb {
6106
+ gap: 8px;
6107
+ height: auto;
6108
+ min-height: 0;
6109
+ min-width: 0;
6110
+ }
6111
+
6112
+ .cn-look-board .cn-detail-page__header-row2 .cn-detail-page__breadcrumbs .vue-crumb .button-vue.button-vue {
6113
+ background: transparent;
6114
+ border: 0;
6115
+ font-size: 14px;
6116
+ font-weight: 400;
6117
+ height: auto;
6118
+ min-height: 0;
6119
+ min-width: 0;
6120
+ padding: 0;
6121
+ }
6122
+
6123
+ .cn-look-board .cn-detail-page__header-row2 .cn-detail-page__breadcrumbs .vue-crumb .button-vue__text {
6124
+ font-weight: inherit;
6125
+ line-height: 20px;
6126
+ padding: 0;
6127
+ }
6128
+
6129
+ /* The list is the link; the record's own crumb is plain muted text. */
6130
+ .cn-look-board .cn-detail-page__header-row2 .cn-detail-page__breadcrumbs .vue-crumb .button-vue[aria-current='page'] {
6131
+ color: var(--color-text-maxcontrast);
6132
+ cursor: default;
6133
+ }
6134
+
6135
+ .cn-look-board .cn-detail-page__header-row2 .cn-detail-page__breadcrumbs .vue-crumb__separator {
6136
+ margin: 0;
6137
+ }
6138
+
5862
6139
  .cn-look-board .cn-detail-page__header-dot,
5863
6140
  .cn-look-board .cn-detail-page__header-meta {
5864
6141
  color: var(--color-text-maxcontrast);
@@ -6001,6 +6278,22 @@ a.cn-kpi-card--board * {
6001
6278
  border-radius: 0;
6002
6279
  }
6003
6280
 
6281
+ /* A tab that holds a stack (`widgetIds`, screens-relation-pages): the panel
6282
+ draws no frame and no padding; each widget is its own card. The first card
6283
+ joins the open tab (the first-card rule above), the next ones stand 20px
6284
+ apart, as the Overzicht of DqContact and PqOrganisatie draws them. */
6285
+ .cn-look-board .cn-tabs--board.cn-tabs-widget__tabs .cn-tabs__content:has(> .cn-tab:not([hidden]) > .cn-tabs-widget__stack) {
6286
+ background: transparent;
6287
+ border: 0;
6288
+ border-radius: 0;
6289
+ padding: 0;
6290
+ }
6291
+
6292
+ /* The stack's next cards are whole cards, not joined to the strip. */
6293
+ .cn-look-board .cn-tabs--board .cn-tabs__content .cn-tab .cn-tabs-widget__stack-item .cn-widget-wrapper {
6294
+ border-radius: var(--cn-board-card-radius);
6295
+ }
6296
+
6004
6297
  /* ---- Body cards and side cards ----------------------------------------- */
6005
6298
 
6006
6299
  .cn-look-board .cn-detail-page .cn-widget-wrapper,
@@ -6080,6 +6373,12 @@ a.cn-kpi-card--board * {
6080
6373
  display: none;
6081
6374
  }
6082
6375
 
6376
+ /* A side card whose widget reports a header action (screens-relation-pages:
6377
+ the "+ Toevoegen" of Contactkanalen and Relaties) keeps that one button. */
6378
+ .cn-look-board .cn-detail-page__side .cn-widget-wrapper__actions:has(.cn-detail-page__catalog-action) {
6379
+ display: flex;
6380
+ }
6381
+
6083
6382
  /* The notice at the top of the side column: radius 12, padding 14px 16px. */
6084
6383
  .cn-look-board .cn-detail-page__side-item--notice .cn-widget-wrapper,
6085
6384
  .cn-look-board .cn-detail-page__side-item--notice .cn-banner-widget,
@@ -9447,6 +9746,77 @@ svg.leaflet-image-layer.leaflet-interactive path {
9447
9746
  .cn-cell-renderer__age[data-v-37d7b88f] {
9448
9747
  white-space: nowrap;
9449
9748
  }
9749
+
9750
+ /* The progress cell (abstract-progress-cell): a 56 x 8 bar, the percentage
9751
+ 8px beside it in the bar's tone, and an optional age badge after them, as
9752
+ PqLeads' Winkans column. The value is bold, so the tone is not the only signal. */
9753
+ .cn-cell-renderer__progress[data-v-37d7b88f] {
9754
+ display: inline-flex;
9755
+ flex-wrap: wrap;
9756
+ align-items: center;
9757
+ gap: 4px 8px;
9758
+ }
9759
+ .cn-cell-renderer__progress-line[data-v-37d7b88f] {
9760
+ display: inline-flex;
9761
+ align-items: center;
9762
+ gap: 8px;
9763
+ white-space: nowrap;
9764
+ }
9765
+ .cn-cell-renderer__progress-bar[data-v-37d7b88f] {
9766
+ display: inline-block;
9767
+ width: 56px;
9768
+ height: 8px;
9769
+ border-radius: 4px;
9770
+ background: var(--color-background-dark);
9771
+ overflow: hidden;
9772
+ }
9773
+ .cn-cell-renderer__progress-fill[data-v-37d7b88f] {
9774
+ display: block;
9775
+ height: 100%;
9776
+ }
9777
+ .cn-cell-renderer__progress-fill--success[data-v-37d7b88f] {
9778
+ background: var(--color-element-success, var(--color-success));
9779
+ }
9780
+ .cn-cell-renderer__progress-fill--warning[data-v-37d7b88f] {
9781
+ background: var(--color-element-warning, var(--color-warning));
9782
+ }
9783
+ .cn-cell-renderer__progress-fill--error[data-v-37d7b88f] {
9784
+ background: var(--color-element-error, var(--color-error));
9785
+ }
9786
+ .cn-cell-renderer__progress-value[data-v-37d7b88f] {
9787
+ font-size: 14px;
9788
+ font-weight: 700;
9789
+ }
9790
+ .cn-cell-renderer__progress-value--success[data-v-37d7b88f] {
9791
+ color: var(--color-text-success, var(--color-success-text));
9792
+ }
9793
+ .cn-cell-renderer__progress-value--warning[data-v-37d7b88f] {
9794
+ color: var(--color-text-warning, var(--color-warning-text));
9795
+ }
9796
+ .cn-cell-renderer__progress-value--error[data-v-37d7b88f] {
9797
+ color: var(--color-text-error, var(--color-error-text));
9798
+ }
9799
+ .cn-cell-renderer__progress-badge[data-v-37d7b88f] {
9800
+ display: inline-block;
9801
+ padding: 3px 10px;
9802
+ border-radius: 12px;
9803
+ font-size: 13px;
9804
+ font-weight: 600;
9805
+ white-space: nowrap;
9806
+ }
9807
+ .cn-cell-renderer__progress-badge--error[data-v-37d7b88f] {
9808
+ color: var(--color-text-error, var(--color-error-text));
9809
+ background: var(--color-error-hover, var(--color-background-dark));
9810
+ background: color-mix(in srgb, var(--color-error) 12%, transparent);
9811
+ }
9812
+ .cn-cell-renderer__progress-badge--warning[data-v-37d7b88f] {
9813
+ color: var(--color-text-warning, var(--color-warning-text));
9814
+ background: color-mix(in srgb, var(--color-warning) 14%, transparent);
9815
+ }
9816
+ .cn-cell-renderer__progress-badge--success[data-v-37d7b88f] {
9817
+ color: var(--color-text-success, var(--color-success-text));
9818
+ background: color-mix(in srgb, var(--color-success) 12%, transparent);
9819
+ }
9450
9820
  .cn-cell-renderer__age--success[data-v-37d7b88f] {
9451
9821
  color: var(--color-text-success, var(--color-success-text));
9452
9822
  }
@@ -9779,6 +10149,25 @@ svg.leaflet-image-layer.leaflet-interactive path {
9779
10149
  white-space: nowrap;
9780
10150
  }
9781
10151
 
10152
+ /* The secondary line of the growing column ("2026-0004" under a case title)
10153
+ is a line of its own with its own ellipsis. The cell does not wrap, so in
10154
+ the board look, where the secondary line is an inline block (the title
10155
+ underline cannot reach an atomic inline box), it stayed on the title's line
10156
+ and ran out of the tile. A full-width float is a block (computed `display:
10157
+ block`) that always starts under the line before it, and, being out of the
10158
+ flow, the cell's underline does not reach it either. The cell is a table
10159
+ cell, which contains its floats, so the row grows to hold the line.
10160
+ @spec openspec/changes/dashboard-tile-text-fits/specs/dashboard-tile-text-fits/spec.md#requirement-the-secondary-line-of-a-narrow-tables-growing-column-sits-under-the-value */
10161
+ .cn-data-table.cn-data-table--fit td.cn-table-col--grow .cn-table-cell__secondary {
10162
+ float: inline-start;
10163
+ clear: both;
10164
+ box-sizing: border-box;
10165
+ width: 100%;
10166
+ overflow: hidden;
10167
+ text-overflow: ellipsis;
10168
+ white-space: nowrap;
10169
+ }
10170
+
9782
10171
  .cn-data-table th {
9783
10172
  background: var(--color-background-dark);
9784
10173
  font-weight: 500;
@@ -21210,6 +21599,38 @@ a.cn-kpi-card--stacked:focus-visible {
21210
21599
  font-weight: 400;
21211
21600
  }
21212
21601
 
21602
+ /* A caption on a line of its own wraps, up to two lines (DqDashboard: "haalden
21603
+ hun termijn, naar doorlooptijd" runs over two lines in a narrow tile). The
21604
+ one-line rule of `.cn-kpi-card__label` is for a caption BESIDE the number,
21605
+ where a second line would push the tile taller; this line has the width of
21606
+ the tile to itself. The clamp is safe here because the element is a plain
21607
+ span, not a flex row (compare the title note above).
21608
+ @spec openspec/changes/dashboard-tile-text-fits/specs/dashboard-tile-text-fits/spec.md#requirement-a-kpi-tiles-caption-and-board-label-wrap-to-two-lines */
21609
+ .cn-kpi-card--stacked .cn-kpi-card__caption-line {
21610
+ display: -webkit-box;
21611
+ -webkit-box-orient: vertical;
21612
+ -webkit-line-clamp: 2;
21613
+ line-clamp: 2;
21614
+ white-space: normal;
21615
+ overflow-wrap: break-word;
21616
+ }
21617
+
21618
+ /* Board look: the label wraps too, up to two lines, beside its icon badge
21619
+ ("Afgehandeld deze maand"). The clamp sits on the label's own span
21620
+ (`cn-kpi-card__title-text`), not on the title row, which stays the flex row
21621
+ that carries the badge or the range select. */
21622
+ .cn-kpi-card--board .cn-kpi-card__title-text {
21623
+ flex: 1 1 auto;
21624
+ min-width: 0;
21625
+ display: -webkit-box;
21626
+ -webkit-box-orient: vertical;
21627
+ -webkit-line-clamp: 2;
21628
+ line-clamp: 2;
21629
+ overflow: hidden;
21630
+ white-space: normal;
21631
+ overflow-wrap: break-word;
21632
+ }
21633
+
21213
21634
  /* The 18px glyph before the label, drawn only on a link tile. */
21214
21635
  .cn-kpi-card--board .cn-kpi-card__title {
21215
21636
  display: flex;
@@ -23239,6 +23660,27 @@ button.cn-stepper__step[data-v-19697746] {
23239
23660
  }
23240
23661
 
23241
23662
 
23663
+ .cn-detail-page__catalog-action[data-v-76c1b60f] {
23664
+ align-items: center;
23665
+ background: var(--color-primary-element-light);
23666
+ border: 0;
23667
+ border-radius: 16px;
23668
+ color: var(--color-primary-element-light-text, var(--color-primary-element));
23669
+ cursor: pointer;
23670
+ display: inline-flex;
23671
+ font: inherit;
23672
+ font-size: 13px;
23673
+ font-weight: 700;
23674
+ gap: 6px;
23675
+ min-height: 32px;
23676
+ padding: 0 14px;
23677
+ white-space: nowrap;
23678
+ }
23679
+ .cn-detail-page__catalog-note[data-v-76c1b60f] {
23680
+ color: var(--color-text-maxcontrast);
23681
+ font-size: 14px;
23682
+ white-space: nowrap;
23683
+ }
23242
23684
  .cn-detail-widget-host[data-v-76c1b60f],
23243
23685
  .cn-detail-widget-host[data-v-76c1b60f] > * {
23244
23686
  height: 100%;
@@ -23528,6 +23970,13 @@ button.cn-stepper__step[data-v-19697746] {
23528
23970
  }
23529
23971
 
23530
23972
 
23973
+ /* A stack (`widgetIds`): the panel's widget, then cards 20px apart. */
23974
+ .cn-tabs-widget__stack[data-v-1dbd6122] {
23975
+ display: flex;
23976
+ flex-direction: column;
23977
+ gap: 20px;
23978
+ }
23979
+
23531
23980
  /* The panel is the card; the strip is not inside it. There is no title bar
23532
23981
  above the tabs either: the open tab names the panel, so a title row would
23533
23982
  say the same thing twice and cost a row of height on a card that is mostly
@@ -27610,6 +28059,441 @@ a.cn-flow-runs-widget__row-content:hover .cn-flow-runs-widget__name[data-v-75628
27610
28059
  }
27611
28060
 
27612
28061
 
28062
+ .cn-sections-widget[data-v-ea4f8722] {
28063
+ min-width: 0;
28064
+ }
28065
+ .cn-sections-widget__column[data-v-ea4f8722] {
28066
+ display: flex;
28067
+ flex-direction: column;
28068
+ gap: calc(var(--default-grid-baseline, 4px) * 4);
28069
+ min-width: 0;
28070
+ }
28071
+
28072
+ /* A main and a side column (the settings boards: 1fr and 418px, 20px apart). */
28073
+ .cn-sections-widget--two-column[data-v-ea4f8722] {
28074
+ display: grid;
28075
+ grid-template-columns: minmax(0, 1fr) minmax(280px, 418px);
28076
+ gap: 20px;
28077
+ align-items: start;
28078
+ }
28079
+ @media (max-width: 1024px) {
28080
+ .cn-sections-widget--two-column[data-v-ea4f8722] {
28081
+ grid-template-columns: minmax(0, 1fr);
28082
+ }
28083
+ }
28084
+
28085
+ /* A host page may space every <section>; these sections are spaced by the column gap only. */
28086
+ .cn-sections-widget__section[data-v-ea4f8722] {
28087
+ margin: 0;
28088
+ min-width: 0;
28089
+ }
28090
+
28091
+ /* A rule above a section that follows a shown one. */
28092
+ .cn-sections-widget:not(.cn-sections-widget--cards) .cn-sections-widget__section:not(.cn-sections-widget__section--empty) ~ .cn-sections-widget__section[data-v-ea4f8722] {
28093
+ padding-top: calc(var(--default-grid-baseline, 4px) * 4);
28094
+ border-top: 1px solid var(--color-border);
28095
+ }
28096
+
28097
+ /*
28098
+ * An empty section keeps its host mounted (display: none still mounts it, so
28099
+ * the widget fetches and can fill later) but takes no space, gap or rule.
28100
+ */
28101
+ .cn-sections-widget__section--empty[data-v-ea4f8722] {
28102
+ display: none;
28103
+ }
28104
+ .cn-sections-widget__heading[data-v-ea4f8722] {
28105
+ margin: 0 0 calc(var(--default-grid-baseline, 4px) * 2);
28106
+ font-size: 16px;
28107
+ font-weight: 600;
28108
+ color: var(--color-main-text);
28109
+ }
28110
+ .cn-sections-widget__description[data-v-ea4f8722] {
28111
+ margin: calc(var(--default-grid-baseline, 4px) * -1) 0 calc(var(--default-grid-baseline, 4px) * 3);
28112
+ color: var(--color-text-maxcontrast);
28113
+ }
28114
+
28115
+ /* One card per section. */
28116
+ .cn-sections-widget--cards .cn-sections-widget__column[data-v-ea4f8722] {
28117
+ gap: 20px;
28118
+ }
28119
+ .cn-sections-widget--cards .cn-sections-widget__section[data-v-ea4f8722] {
28120
+ background: var(--color-main-background);
28121
+ border: 1px solid var(--color-border);
28122
+ border-radius: var(--cn-board-card-radius, var(--border-radius-large, 12px));
28123
+ padding: var(--cn-board-card-padding, 16px 20px);
28124
+ }
28125
+ .cn-sections-widget--cards .cn-sections-widget__heading[data-v-ea4f8722] {
28126
+ font-size: 18px;
28127
+ margin-bottom: 12px;
28128
+ }
28129
+
28130
+
28131
+ .cn-facts-widget[data-v-2ca63011] {
28132
+ display: flex;
28133
+ flex-direction: column;
28134
+ gap: 10px;
28135
+ min-width: 0;
28136
+ }
28137
+ .cn-facts-widget__rows[data-v-2ca63011] {
28138
+ display: grid;
28139
+ grid-template-columns: max-content 1fr;
28140
+ gap: 8px 16px;
28141
+ margin: 0;
28142
+ font-size: 14px;
28143
+ }
28144
+
28145
+ /* Each row is a grid of its own children: the wrapper takes no box. */
28146
+ .cn-facts-widget__row[data-v-2ca63011] {
28147
+ display: contents;
28148
+ }
28149
+ .cn-facts-widget__label[data-v-2ca63011] {
28150
+ color: var(--color-text-maxcontrast);
28151
+ }
28152
+ .cn-facts-widget__value[data-v-2ca63011] {
28153
+ margin: 0;
28154
+ font-weight: 500;
28155
+ min-width: 0;
28156
+ overflow-wrap: anywhere;
28157
+ }
28158
+ .cn-facts-widget__title[data-v-2ca63011] {
28159
+ font-size: 15px;
28160
+ font-weight: 600;
28161
+ color: var(--color-main-text);
28162
+ }
28163
+ .cn-facts-widget__line[data-v-2ca63011] {
28164
+ font-size: 13px;
28165
+ color: var(--color-text-maxcontrast);
28166
+ }
28167
+ .cn-facts-widget__muted[data-v-2ca63011] {
28168
+ margin: 0;
28169
+ color: var(--color-text-maxcontrast);
28170
+ }
28171
+ .cn-facts-widget__label .hidden-visually[data-v-2ca63011] {
28172
+ clip-path: inset(50%);
28173
+ height: 1px;
28174
+ overflow: hidden;
28175
+ position: absolute;
28176
+ white-space: nowrap;
28177
+ width: 1px;
28178
+ }
28179
+ .cn-facts-widget__label--icon[data-v-2ca63011] {
28180
+ align-items: center;
28181
+ display: flex;
28182
+ }
28183
+ .cn-facts-widget__value-link[data-v-2ca63011] {
28184
+ color: var(--color-primary-element);
28185
+ text-decoration: underline;
28186
+ }
28187
+ .cn-facts-widget__inline-button[data-v-2ca63011],
28188
+ .cn-facts-widget__icon-button[data-v-2ca63011],
28189
+ .cn-facts-widget__action[data-v-2ca63011] {
28190
+ align-items: center;
28191
+ cursor: pointer;
28192
+ display: inline-flex;
28193
+ font: inherit;
28194
+ }
28195
+ .cn-facts-widget__inline-button[data-v-2ca63011] {
28196
+ background: var(--color-main-background);
28197
+ border: 1px solid var(--color-border-dark);
28198
+ border-radius: 16px;
28199
+ font-size: 13px;
28200
+ font-weight: 600;
28201
+ gap: 4px;
28202
+ margin-inline-start: 8px;
28203
+ min-height: 28px;
28204
+ padding: 0 10px;
28205
+ }
28206
+ .cn-facts-widget__icon-button[data-v-2ca63011] {
28207
+ background: transparent;
28208
+ border: 0;
28209
+ border-radius: 6px;
28210
+ color: var(--color-text-maxcontrast);
28211
+ margin-inline-start: 4px;
28212
+ padding: 2px;
28213
+ vertical-align: middle;
28214
+ }
28215
+ .cn-facts-widget__icon-button[data-v-2ca63011]:hover,
28216
+ .cn-facts-widget__icon-button[data-v-2ca63011]:focus-visible {
28217
+ background: var(--color-background-hover);
28218
+ color: var(--color-main-text);
28219
+ }
28220
+ .cn-facts-widget__text[data-v-2ca63011] {
28221
+ color: var(--color-main-text);
28222
+ font-size: 15px;
28223
+ }
28224
+
28225
+ /* A lead: an icon tile or initials beside a bold title and a muted subtitle. */
28226
+ .cn-facts-widget__lead[data-v-2ca63011] {
28227
+ align-items: center;
28228
+ display: flex;
28229
+ gap: 12px;
28230
+ }
28231
+ .cn-facts-widget__lead-tile[data-v-2ca63011] {
28232
+ align-items: center;
28233
+ background: var(--color-background-dark);
28234
+ border-radius: 8px;
28235
+ color: var(--color-main-text);
28236
+ display: flex;
28237
+ flex: none;
28238
+ font-size: 14px;
28239
+ font-weight: 700;
28240
+ height: 40px;
28241
+ justify-content: center;
28242
+ width: 40px;
28243
+ }
28244
+ .cn-facts-widget__lead-tile--success[data-v-2ca63011] {
28245
+ background: color-mix(in srgb, var(--color-success) 14%, var(--color-main-background));
28246
+ border-radius: 50%;
28247
+ color: var(--color-success-text, var(--color-success));
28248
+ }
28249
+ .cn-facts-widget__lead-tile--info[data-v-2ca63011] {
28250
+ background: var(--color-primary-element-light);
28251
+ border-radius: 50%;
28252
+ color: var(--color-primary-element-light-text, var(--color-primary-element));
28253
+ }
28254
+ .cn-facts-widget__lead-text[data-v-2ca63011] {
28255
+ display: flex;
28256
+ flex-direction: column;
28257
+ min-width: 0;
28258
+ }
28259
+ .cn-facts-widget__lead-title[data-v-2ca63011] {
28260
+ font-size: 15px;
28261
+ }
28262
+ .cn-facts-widget__lead-subtitle[data-v-2ca63011] {
28263
+ color: var(--color-text-maxcontrast);
28264
+ font-size: 13px;
28265
+ }
28266
+ .cn-facts-widget__action[data-v-2ca63011] {
28267
+ align-self: flex-start;
28268
+ background: var(--color-primary-element-light);
28269
+ border: 0;
28270
+ border-radius: 16px;
28271
+ color: var(--color-primary-element-light-text, var(--color-primary-element));
28272
+ font-size: 13px;
28273
+ font-weight: 700;
28274
+ gap: 6px;
28275
+ min-height: 32px;
28276
+ padding: 0 14px;
28277
+ }
28278
+ .cn-facts-widget__action[data-v-2ca63011]:hover,
28279
+ .cn-facts-widget__action[data-v-2ca63011]:focus-visible {
28280
+ background: var(--color-primary-element-light-hover, var(--color-primary-element-light));
28281
+ }
28282
+ .cn-facts-widget__link[data-v-2ca63011] {
28283
+ font-size: 14px;
28284
+ font-weight: 600;
28285
+ color: var(--color-primary-element);
28286
+ text-decoration: underline;
28287
+ }
28288
+
28289
+
28290
+ .cn-field-list-widget[data-v-0f29a833] {
28291
+ display: flex;
28292
+ flex-direction: column;
28293
+ gap: 12px;
28294
+ min-width: 0;
28295
+ }
28296
+ .cn-field-list-widget__rows[data-v-0f29a833] {
28297
+ list-style: none;
28298
+ margin: 0;
28299
+ padding: 0;
28300
+ display: flex;
28301
+ flex-direction: column;
28302
+ }
28303
+ .cn-field-list-widget__row[data-v-0f29a833] {
28304
+ padding: 10px 0;
28305
+ border-top: 1px solid var(--color-border);
28306
+ }
28307
+ .cn-field-list-widget__row[data-v-0f29a833]:first-child {
28308
+ border-top: none;
28309
+ padding-top: 0;
28310
+ }
28311
+ .cn-field-list-widget__line[data-v-0f29a833] {
28312
+ display: flex;
28313
+ align-items: center;
28314
+ gap: 12px;
28315
+ min-width: 0;
28316
+ }
28317
+ .cn-field-list-widget__avatar[data-v-0f29a833] {
28318
+ flex: 0 0 auto;
28319
+ display: inline-flex;
28320
+ align-items: center;
28321
+ justify-content: center;
28322
+ width: 32px;
28323
+ height: 32px;
28324
+ border-radius: 50%;
28325
+ background: var(--color-primary-element-light);
28326
+ color: var(--color-primary-element-light-text, var(--color-main-text));
28327
+ font-size: 12px;
28328
+ font-weight: 700;
28329
+ }
28330
+ .cn-field-list-widget__main[data-v-0f29a833] {
28331
+ display: flex;
28332
+ flex-direction: column;
28333
+ flex: 1 1 auto;
28334
+ min-width: 0;
28335
+ }
28336
+ .cn-field-list-widget__title[data-v-0f29a833] {
28337
+ font-weight: 600;
28338
+ overflow-wrap: anywhere;
28339
+ }
28340
+ .cn-field-list-widget__meta[data-v-0f29a833],
28341
+ .cn-field-list-widget__aside[data-v-0f29a833],
28342
+ .cn-field-list-widget__detail[data-v-0f29a833],
28343
+ .cn-field-list-widget__hint[data-v-0f29a833],
28344
+ .cn-field-list-widget__empty[data-v-0f29a833] {
28345
+ color: var(--color-text-maxcontrast);
28346
+ }
28347
+ .cn-field-list-widget__meta[data-v-0f29a833],
28348
+ .cn-field-list-widget__aside[data-v-0f29a833],
28349
+ .cn-field-list-widget__detail[data-v-0f29a833] {
28350
+ font-size: 13px;
28351
+ }
28352
+ .cn-field-list-widget__aside[data-v-0f29a833] {
28353
+ white-space: nowrap;
28354
+ }
28355
+ .cn-field-list-widget__detail[data-v-0f29a833],
28356
+ .cn-field-list-widget__hint[data-v-0f29a833],
28357
+ .cn-field-list-widget__empty[data-v-0f29a833] {
28358
+ margin: 4px 0 0;
28359
+ overflow-wrap: anywhere;
28360
+ }
28361
+ .cn-field-list-widget__add[data-v-0f29a833] {
28362
+ display: flex;
28363
+ flex-wrap: wrap;
28364
+ align-items: flex-end;
28365
+ gap: 8px 12px;
28366
+ }
28367
+ .cn-field-list-widget__add[data-v-0f29a833] > * {
28368
+ flex: 1 1 180px;
28369
+ }
28370
+ .cn-field-list-widget__add > button[data-v-0f29a833] {
28371
+ flex: 0 0 auto;
28372
+ }
28373
+
28374
+
28375
+ .cn-record-list__list[data-v-7073b362] {
28376
+ list-style: none;
28377
+ margin: 0;
28378
+ padding: 0;
28379
+ }
28380
+ .cn-record-list__empty[data-v-7073b362],
28381
+ .cn-record-list__error[data-v-7073b362] {
28382
+ color: var(--color-text-maxcontrast);
28383
+ margin: 0;
28384
+ }
28385
+ .cn-record-list__loading[data-v-7073b362] {
28386
+ display: flex;
28387
+ justify-content: center;
28388
+ padding: 8px 0;
28389
+ }
28390
+
28391
+ /* rows */
28392
+ .cn-record-list--rows .cn-record-list__item + .cn-record-list__item[data-v-7073b362] {
28393
+ border-top: 1px solid var(--color-border);
28394
+ }
28395
+ .cn-record-list__row[data-v-7073b362] {
28396
+ align-items: center;
28397
+ color: var(--color-main-text);
28398
+ display: flex;
28399
+ gap: 16px;
28400
+ padding: 12px 0;
28401
+ text-decoration: none;
28402
+ }
28403
+ .cn-record-list__row--link:hover .cn-record-list__title[data-v-7073b362],
28404
+ .cn-record-list__row--link:focus-visible .cn-record-list__title[data-v-7073b362] {
28405
+ text-decoration: underline;
28406
+ }
28407
+ .cn-record-list__main[data-v-7073b362] {
28408
+ display: flex;
28409
+ flex: 1 1 auto;
28410
+ flex-direction: column;
28411
+ gap: 2px;
28412
+ min-width: 0;
28413
+ }
28414
+ .cn-record-list__title[data-v-7073b362] {
28415
+ font-size: 15px;
28416
+ font-weight: 700;
28417
+ }
28418
+ .cn-record-list__meta[data-v-7073b362] {
28419
+ color: var(--color-text-maxcontrast);
28420
+ font-size: 13px;
28421
+ }
28422
+ .cn-record-list__aside[data-v-7073b362] {
28423
+ align-items: center;
28424
+ display: flex;
28425
+ flex: none;
28426
+ gap: 16px;
28427
+ }
28428
+ .cn-record-list__trailing[data-v-7073b362] {
28429
+ font-size: 14px;
28430
+ white-space: nowrap;
28431
+ }
28432
+ .cn-record-list__chevron[data-v-7073b362] {
28433
+ color: var(--color-text-maxcontrast);
28434
+ flex: none;
28435
+ }
28436
+
28437
+ /* feed */
28438
+ .cn-record-list--feed .cn-record-list__item + .cn-record-list__item[data-v-7073b362] {
28439
+ border-top: 1px solid var(--color-border);
28440
+ }
28441
+ .cn-record-list__feed-row[data-v-7073b362] {
28442
+ align-items: flex-start;
28443
+ display: flex;
28444
+ gap: 14px;
28445
+ padding: 12px 0;
28446
+ }
28447
+ .cn-record-list__feed-icon[data-v-7073b362] {
28448
+ align-items: center;
28449
+ background: var(--color-primary-element-light);
28450
+ border-radius: 50%;
28451
+ color: var(--color-primary-element-light-text, var(--color-primary-element));
28452
+ display: flex;
28453
+ flex: none;
28454
+ height: 36px;
28455
+ justify-content: center;
28456
+ width: 36px;
28457
+ }
28458
+ .cn-record-list__text[data-v-7073b362] {
28459
+ font-size: 15px;
28460
+ }
28461
+ .cn-record-list--feed .cn-record-list__main[data-v-7073b362] {
28462
+ color: var(--color-main-text);
28463
+ text-decoration: none;
28464
+ }
28465
+
28466
+ /* inline */
28467
+ .cn-record-list__inline-row[data-v-7073b362] {
28468
+ padding: 4px 0;
28469
+ }
28470
+ .cn-record-list__label[data-v-7073b362] {
28471
+ margin-inline-end: 4px;
28472
+ }
28473
+ .cn-record-list__inline-title[data-v-7073b362] {
28474
+ color: var(--color-main-text);
28475
+ }
28476
+ a.cn-record-list__inline-title[data-v-7073b362] {
28477
+ color: var(--color-primary-element);
28478
+ text-decoration: underline;
28479
+ }
28480
+
28481
+
28482
+ /* In a narrow side column a row stacks: title, meta, then pill and date. */
28483
+ .cn-detail-page__side .cn-record-list__row {
28484
+ align-items: flex-start;
28485
+ flex-direction: column;
28486
+ gap: 6px;
28487
+ }
28488
+ .cn-detail-page__side .cn-record-list__row .cn-record-list__title {
28489
+ color: var(--color-primary-element);
28490
+ text-decoration: underline;
28491
+ }
28492
+ .cn-detail-page__side .cn-record-list__chevron {
28493
+ display: none;
28494
+ }
28495
+
28496
+
27613
28497
  .cn-notepad-widget-form[data-v-c752df66] {
27614
28498
  display: flex;
27615
28499
  flex-direction: column;
@@ -27920,6 +28804,40 @@ a.cn-flow-runs-widget__row-content:hover .cn-flow-runs-widget__name[data-v-75628
27920
28804
  flex-direction: column;
27921
28805
  gap: 2px;
27922
28806
  }
28807
+
28808
+ /* The start card: text left, control (and link) right, as PqDashboard's "Contact starten". */
28809
+ .cn-workspace-filter-widget--start[data-v-f0d5c1c6] {
28810
+ flex-direction: row;
28811
+ flex-wrap: wrap;
28812
+ align-items: center;
28813
+ gap: 16px 24px;
28814
+ }
28815
+ .cn-workspace-filter-widget__text[data-v-f0d5c1c6] {
28816
+ flex: 1 1 320px;
28817
+ min-width: 0;
28818
+ }
28819
+ .cn-workspace-filter-widget__title[data-v-f0d5c1c6] {
28820
+ margin: 0 0 4px;
28821
+ font-size: 17px;
28822
+ font-weight: 700;
28823
+ color: var(--color-main-text);
28824
+ }
28825
+ .cn-workspace-filter-widget__description[data-v-f0d5c1c6] {
28826
+ margin: 0;
28827
+ max-width: 420px;
28828
+ color: var(--color-text-maxcontrast);
28829
+ }
28830
+ .cn-workspace-filter-widget--start .cn-workspace-filter-widget__control[data-v-f0d5c1c6],
28831
+ .cn-workspace-filter-widget--start > .v-select[data-v-f0d5c1c6] {
28832
+ flex: 0 1 480px;
28833
+ min-width: 240px;
28834
+ }
28835
+ .cn-workspace-filter-widget__link[data-v-f0d5c1c6] {
28836
+ font-weight: 600;
28837
+ color: var(--color-primary-element);
28838
+ text-decoration: underline;
28839
+ white-space: nowrap;
28840
+ }
27923
28841
  .cn-workspace-filter-widget__count[data-v-f0d5c1c6] {
27924
28842
  margin-inline-start: 6px;
27925
28843
  padding: 0 6px;
@@ -32815,6 +33733,86 @@ button.cn-object-calendar__overflow[data-v-bea31862] {
32815
33733
  }
32816
33734
 
32817
33735
 
33736
+ /*
33737
+ * Layout only — this component draws no KPI of its own; the tiles inside it do
33738
+ * (src/css/kpi-card.css). What it DOES owe the canonical look is the rhythm
33739
+ * around those tiles, so the gutter is the card's own `--cn-kpi-grid-gap`
33740
+ * rather than a number picked here. A grid whose gutter disagrees with the
33741
+ * card's padding reads as a different design even when every tile is
33742
+ * identical.
33743
+ */
33744
+ .cn-kpi-grid[data-v-e31696e2] {
33745
+ display: grid;
33746
+ gap: var(--cn-kpi-grid-gap, 16px);
33747
+ margin-bottom: 24px;
33748
+ }
33749
+
33750
+ /*
33751
+ * `minmax(0, 1fr)`, not `1fr`. A grid track's default minimum is `auto`, which
33752
+ * refuses to shrink below its content — and the canonical KPI value is
33753
+ * deliberately `white-space: nowrap`, so a long number (a formatted currency
33754
+ * amount, a six-figure count) pushes its track wider than its share and the
33755
+ * whole row overflows the page. With a 0 minimum the track holds its share and
33756
+ * the card's own `overflow: hidden` clips instead.
33757
+ */
33758
+ .cn-kpi-grid--cols-2[data-v-e31696e2] {
33759
+ grid-template-columns: repeat(2, minmax(0, 1fr));
33760
+ }
33761
+ .cn-kpi-grid--cols-3[data-v-e31696e2] {
33762
+ grid-template-columns: repeat(3, minmax(0, 1fr));
33763
+ }
33764
+ .cn-kpi-grid--cols-4[data-v-e31696e2] {
33765
+ grid-template-columns: repeat(4, minmax(0, 1fr));
33766
+ }
33767
+
33768
+ /* Auto: as many 200px columns as fit (screens-dashboard-parity). */
33769
+ .cn-kpi-grid--cols-auto[data-v-e31696e2] {
33770
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
33771
+ }
33772
+
33773
+ /* Responsive breakpoints */
33774
+ @media (max-width: 1200px) {
33775
+ .cn-kpi-grid--cols-4[data-v-e31696e2] {
33776
+ grid-template-columns: repeat(2, minmax(0, 1fr));
33777
+ }
33778
+ }
33779
+ @media (max-width: 900px) {
33780
+ .cn-kpi-grid--cols-3[data-v-e31696e2] {
33781
+ grid-template-columns: repeat(2, minmax(0, 1fr));
33782
+ }
33783
+ }
33784
+ @media (max-width: 600px) {
33785
+ .cn-kpi-grid--cols-2[data-v-e31696e2],
33786
+ .cn-kpi-grid--cols-3[data-v-e31696e2],
33787
+ .cn-kpi-grid--cols-4[data-v-e31696e2] {
33788
+ grid-template-columns: minmax(0, 1fr);
33789
+ }
33790
+ }
33791
+
33792
+
33793
+ .cn-index-page-widgets--stat-row[data-v-5ec0c5bc] {
33794
+ margin-bottom: var(--cn-board-section-gap, 20px);
33795
+ }
33796
+ .cn-index-page-widgets__cell[data-v-5ec0c5bc] {
33797
+ display: flex;
33798
+ min-width: 0;
33799
+ }
33800
+ .cn-index-page-widgets__cell[data-v-5ec0c5bc] > * {
33801
+ flex: 1 1 auto;
33802
+ min-width: 0;
33803
+ }
33804
+
33805
+ /* The side panel column (DqTeamwachtrij: 300px, 16px between cards). Its
33806
+ place beside the toolbar and the list is set by CnIndexPage
33807
+ (`cn-index-page--with-side-panel`, index-page.css). */
33808
+ .cn-index-page-widgets--side-panel[data-v-5ec0c5bc] {
33809
+ display: flex;
33810
+ flex-direction: column;
33811
+ gap: 16px;
33812
+ min-width: 0;
33813
+ }
33814
+
33815
+
32818
33816
  .cn-advanced-form-dialog__json-editor[data-v-733de04c] {
32819
33817
  display: flex;
32820
33818
  flex-direction: column;
@@ -34090,63 +35088,6 @@ button.cn-object-calendar__overflow[data-v-bea31862] {
34090
35088
  }
34091
35089
 
34092
35090
 
34093
- /*
34094
- * Layout only — this component draws no KPI of its own; the tiles inside it do
34095
- * (src/css/kpi-card.css). What it DOES owe the canonical look is the rhythm
34096
- * around those tiles, so the gutter is the card's own `--cn-kpi-grid-gap`
34097
- * rather than a number picked here. A grid whose gutter disagrees with the
34098
- * card's padding reads as a different design even when every tile is
34099
- * identical.
34100
- */
34101
- .cn-kpi-grid[data-v-e31696e2] {
34102
- display: grid;
34103
- gap: var(--cn-kpi-grid-gap, 16px);
34104
- margin-bottom: 24px;
34105
- }
34106
-
34107
- /*
34108
- * `minmax(0, 1fr)`, not `1fr`. A grid track's default minimum is `auto`, which
34109
- * refuses to shrink below its content — and the canonical KPI value is
34110
- * deliberately `white-space: nowrap`, so a long number (a formatted currency
34111
- * amount, a six-figure count) pushes its track wider than its share and the
34112
- * whole row overflows the page. With a 0 minimum the track holds its share and
34113
- * the card's own `overflow: hidden` clips instead.
34114
- */
34115
- .cn-kpi-grid--cols-2[data-v-e31696e2] {
34116
- grid-template-columns: repeat(2, minmax(0, 1fr));
34117
- }
34118
- .cn-kpi-grid--cols-3[data-v-e31696e2] {
34119
- grid-template-columns: repeat(3, minmax(0, 1fr));
34120
- }
34121
- .cn-kpi-grid--cols-4[data-v-e31696e2] {
34122
- grid-template-columns: repeat(4, minmax(0, 1fr));
34123
- }
34124
-
34125
- /* Auto: as many 200px columns as fit (screens-dashboard-parity). */
34126
- .cn-kpi-grid--cols-auto[data-v-e31696e2] {
34127
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
34128
- }
34129
-
34130
- /* Responsive breakpoints */
34131
- @media (max-width: 1200px) {
34132
- .cn-kpi-grid--cols-4[data-v-e31696e2] {
34133
- grid-template-columns: repeat(2, minmax(0, 1fr));
34134
- }
34135
- }
34136
- @media (max-width: 900px) {
34137
- .cn-kpi-grid--cols-3[data-v-e31696e2] {
34138
- grid-template-columns: repeat(2, minmax(0, 1fr));
34139
- }
34140
- }
34141
- @media (max-width: 600px) {
34142
- .cn-kpi-grid--cols-2[data-v-e31696e2],
34143
- .cn-kpi-grid--cols-3[data-v-e31696e2],
34144
- .cn-kpi-grid--cols-4[data-v-e31696e2] {
34145
- grid-template-columns: minmax(0, 1fr);
34146
- }
34147
- }
34148
-
34149
-
34150
35091
  .cn-export-wizard__description[data-v-59983562] {
34151
35092
  color: var(--color-text-maxcontrast);
34152
35093
  margin-bottom: 12px;