@conduction/nextcloud-vue 2.56.0-beta.30 → 2.56.0-beta.31

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 (173) hide show
  1. package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js.map +1 -1
  2. package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js +3 -3
  3. package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js.map +1 -1
  4. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js +80 -4
  5. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js.map +1 -1
  6. package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js +95 -91
  7. package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js.map +1 -1
  8. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js +85 -6
  9. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js.map +1 -1
  10. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js +1 -1
  11. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js.map +1 -1
  12. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +4 -1
  13. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
  14. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
  15. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js +1 -1
  16. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js.map +1 -1
  17. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue3.js.map +1 -1
  18. package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue2.js +2 -2
  19. package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue2.js.map +1 -1
  20. package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue3.js.map +1 -1
  21. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +40 -3
  22. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
  23. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
  24. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +19 -11
  25. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
  26. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
  27. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +43 -0
  28. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  29. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +1 -1
  30. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  31. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue2.js +1 -1
  32. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue2.js.map +1 -1
  33. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue3.js.map +1 -1
  34. package/dist/esm/components/CnFacetSidebar/CnFacetSidebar.vue2.js +7 -7
  35. package/dist/esm/components/CnFacetSidebar/CnFacetSidebar.vue2.js.map +1 -1
  36. package/dist/esm/components/CnFacetSidebar/CnFacetSidebar.vue3.js.map +1 -1
  37. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js +125 -0
  38. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -1
  39. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -1
  40. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js +3 -2
  41. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js.map +1 -1
  42. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js.map +1 -1
  43. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +302 -4
  44. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
  45. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js +417 -244
  46. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
  47. package/dist/esm/components/CnFilesBrowser/filesBrowser.js +101 -1
  48. package/dist/esm/components/CnFilesBrowser/filesBrowser.js.map +1 -1
  49. package/dist/esm/components/CnFilesBrowser/filesBrowserColumns.js +141 -1
  50. package/dist/esm/components/CnFilesBrowser/filesBrowserColumns.js.map +1 -1
  51. package/dist/esm/components/CnFormPage/CnFormPage.vue2.js +60 -0
  52. package/dist/esm/components/CnFormPage/CnFormPage.vue2.js.map +1 -1
  53. package/dist/esm/components/CnFormPage/CnFormPage.vue3.js +74 -49
  54. package/dist/esm/components/CnFormPage/CnFormPage.vue3.js.map +1 -1
  55. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +29 -1
  56. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  57. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +48 -4
  58. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  59. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js +7 -7
  60. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js.map +1 -1
  61. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue3.js.map +1 -1
  62. package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue2.js +1 -1
  63. package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue2.js.map +1 -1
  64. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +1 -1
  65. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
  66. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
  67. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js +63 -1
  68. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js.map +1 -1
  69. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js +8 -1
  70. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js.map +1 -1
  71. package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue2.js +14 -0
  72. package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue2.js.map +1 -1
  73. package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue3.js +5 -1
  74. package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue3.js.map +1 -1
  75. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +13 -6
  76. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
  77. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
  78. package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue2.js +84 -1
  79. package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue2.js.map +1 -1
  80. package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue3.js +85 -41
  81. package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue3.js.map +1 -1
  82. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js +7 -2
  83. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js.map +1 -1
  84. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue3.js.map +1 -1
  85. package/dist/esm/components/CnWidgetObjectTable/dashboardRegistration.js +5 -0
  86. package/dist/esm/components/CnWidgetObjectTable/dashboardRegistration.js.map +1 -1
  87. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue2.js +197 -6
  88. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue2.js.map +1 -1
  89. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue3.js +94 -50
  90. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue3.js.map +1 -1
  91. package/dist/esm/composables/useListView.js +4 -4
  92. package/dist/esm/composables/useListView.js.map +1 -1
  93. package/dist/esm/index.js +10 -1
  94. package/dist/esm/index.js.map +1 -1
  95. package/dist/esm/l10n/en.json.js +8 -1
  96. package/dist/esm/l10n/en.json.js.map +1 -1
  97. package/dist/esm/l10n/nl.json.js +54 -1
  98. package/dist/esm/l10n/nl.json.js.map +1 -1
  99. package/dist/esm/nextcloud-vue.css +198 -8
  100. package/dist/esm/utils/facets.js +75 -3
  101. package/dist/esm/utils/facets.js.map +1 -1
  102. package/dist/esm/utils/fillTemplate.js +7 -1
  103. package/dist/esm/utils/fillTemplate.js.map +1 -1
  104. package/dist/esm/utils/pageControls.js +81 -0
  105. package/dist/esm/utils/pageControls.js.map +1 -0
  106. package/dist/esm/utils/personalLenses.js +40 -3
  107. package/dist/esm/utils/personalLenses.js.map +1 -1
  108. package/dist/esm/utils/resolveFilterTokens.js +1 -1
  109. package/dist/esm/utils/resolveFilterTokens.js.map +1 -1
  110. package/dist/esm/utils/resolveManifestTokens.js +2 -0
  111. package/dist/esm/utils/resolveManifestTokens.js.map +1 -1
  112. package/dist/esm/utils/sentinelTokens.js +19 -1
  113. package/dist/esm/utils/sentinelTokens.js.map +1 -1
  114. package/dist/esm/utils/userGroupsPeek.js +91 -0
  115. package/dist/esm/utils/userGroupsPeek.js.map +1 -0
  116. package/dist/esm/utils/validateManifestV2.compiled.js +3 -3
  117. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  118. package/dist/esm/utils/visibleWhen.js +57 -5
  119. package/dist/esm/utils/visibleWhen.js.map +1 -1
  120. package/dist/esm/utils/widgetVisibility.js +4 -57
  121. package/dist/esm/utils/widgetVisibility.js.map +1 -1
  122. package/dist/nextcloud-vue.cjs.js +4309 -2233
  123. package/dist/nextcloud-vue.cjs.js.map +2 -2
  124. package/dist/nextcloud-vue.css +198 -8
  125. package/l10n/en.json +8 -1
  126. package/l10n/nl.json +54 -1
  127. package/package.json +2 -1
  128. package/scripts/check-docs-mdx.mjs +108 -0
  129. package/src/components/CnActionsBar/CnActionsBar.vue +6 -1
  130. package/src/components/CnAppRoot/CnAppRoot.md +4 -2
  131. package/src/components/CnAppRoot/CnAppRoot.vue +151 -59
  132. package/src/components/CnBannerWidget/CnBannerWidget.vue +112 -7
  133. package/src/components/CnCellRenderer/CnCellRenderer.vue +4 -1
  134. package/src/components/CnConversationThread/CnConversationWidget.vue +1 -1
  135. package/src/components/CnDashboardGrid/CnDashboardGrid.vue +2 -2
  136. package/src/components/CnDashboardPage/CnDashboardPage.vue +40 -3
  137. package/src/components/CnDataTable/CnDataTable.vue +19 -11
  138. package/src/components/CnDetailPage/CnDetailPage.vue +44 -1
  139. package/src/components/CnDocumentReviewList/CnDocumentReviewWidget.vue +1 -1
  140. package/src/components/CnFacetSidebar/CnFacetSidebar.vue +7 -7
  141. package/src/components/CnFactsWidget/CnFactsWidget.vue +125 -0
  142. package/src/components/CnFieldListWidget/CnFieldListWidget.vue +3 -2
  143. package/src/components/CnFilesBrowser/CnFilesBrowser.vue +588 -117
  144. package/src/components/CnFilesBrowser/filesBrowser.js +100 -0
  145. package/src/components/CnFilesBrowser/filesBrowserColumns.js +140 -0
  146. package/src/components/CnFormPage/CnFormPage.vue +81 -0
  147. package/src/components/CnIndexPage/CnIndexPage.vue +56 -3
  148. package/src/components/CnIndexSidebar/CnIndexSidebar.vue +7 -7
  149. package/src/components/CnNextStepCard/CnNextStepWidget.vue +1 -1
  150. package/src/components/CnObjectListWidget/CnObjectListWidget.vue +1 -1
  151. package/src/components/CnObjectSidebar/CnFilesTab.vue +70 -1
  152. package/src/components/CnObjectSidebar/CnNotesTab.vue +16 -0
  153. package/src/components/CnRecordListWidget/CnRecordListWidget.vue +13 -6
  154. package/src/components/CnStatsBlockWidget/CnStatsBlockWidget.vue +180 -3
  155. package/src/components/CnWidgetObjectTable/CnWidgetObjectTable.vue +7 -2
  156. package/src/components/CnWidgetObjectTable/dashboardRegistration.js +5 -0
  157. package/src/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue +281 -10
  158. package/src/components/index.js +8 -0
  159. package/src/composables/useListView.js +4 -4
  160. package/src/css/look-board-index.css +16 -8
  161. package/src/index.js +8 -0
  162. package/src/schemas/app-manifest-v2.schema.json +93 -9
  163. package/src/utils/facets.js +74 -2
  164. package/src/utils/fillTemplate.js +7 -1
  165. package/src/utils/pageControls.js +78 -0
  166. package/src/utils/personalLenses.js +39 -2
  167. package/src/utils/resolveFilterTokens.js +3 -1
  168. package/src/utils/resolveManifestTokens.js +2 -0
  169. package/src/utils/sentinelTokens.js +19 -1
  170. package/src/utils/userGroupsPeek.js +87 -0
  171. package/src/utils/validateManifestV2.compiled.js +3 -3
  172. package/src/utils/visibleWhen.js +56 -4
  173. package/src/utils/widgetVisibility.js +7 -56
@@ -1,4 +1,4 @@
1
1
  [diffend] Oversized file quarantined before diffing.
2
2
  name: package/dist/nextcloud-vue.cjs.js.map
3
- size: 39172953 bytes
4
- sha256: ef1ebbbf9606b2cbad5aed35a9ed0121763f6eda57474125658a81f7be30dd26
3
+ size: 39419324 bytes
4
+ sha256: 8beaa575ec5a98f9b2ce3a89b8750a62dbb3e8150408a1753a96b7a821b9e195
@@ -1530,7 +1530,8 @@
1530
1530
  }
1531
1531
 
1532
1532
  /* Filter: a labelled secondary button, 36px, radius 8, with the active count. */
1533
- .cn-look-board .cn-actions-bar__filter-button.button-vue {
1533
+ .cn-look-board .cn-actions-bar__filter-button.button-vue,
1534
+ .cn-look-board .cn-actions-bar__filter-menu .button-vue {
1534
1535
  min-height: 36px;
1535
1536
  height: 36px;
1536
1537
  border-radius: 8px;
@@ -1780,11 +1781,16 @@
1780
1781
  max-width: calc(100% - 26px);
1781
1782
  }
1782
1783
 
1783
- /* The selection column: 28px, 18px checkboxes. */
1784
+ /* The selection column: 18px checkboxes, 28px of content after 16px of padding.
1785
+ The box model is set with `!important` and the widths include the padding:
1786
+ Nextcloud's server.css sets `box-sizing: border-box` on everything under
1787
+ `#content[class*="app-"]`, an id selector no class rule outranks, so a plain
1788
+ `content-box` here was ignored and the cell left 12px for the checkbox (the
1789
+ header's checkbox showed as a stray bracket). */
1784
1790
  .cn-look-board .cn-table-container--board .cn-data-table .cn-table-col--checkbox {
1785
- box-sizing: content-box;
1786
- width: 28px;
1787
- min-width: 28px;
1791
+ box-sizing: border-box !important;
1792
+ width: 44px;
1793
+ min-width: 44px;
1788
1794
  padding-inline: 16px 0;
1789
1795
  text-align: start;
1790
1796
  }
@@ -1842,10 +1848,12 @@
1842
1848
  line-height: 1.4;
1843
1849
  }
1844
1850
 
1845
- /* The row menu column holds one 34px button. */
1851
+ /* The row menu column holds one 34px button between 16px of padding, so 66px
1852
+ border to border (see the selection column for why the box model is forced). */
1846
1853
  .cn-look-board .cn-table-container--board .cn-data-table .cn-table-col--actions {
1847
- width: 34px;
1848
- min-width: 0;
1854
+ box-sizing: border-box !important;
1855
+ width: 66px;
1856
+ min-width: 66px;
1849
1857
  padding-inline: 16px;
1850
1858
  text-align: end;
1851
1859
  }
@@ -15273,6 +15281,70 @@ button.cn-files-card__open[data-v-46f7e3c9]:hover {
15273
15281
  white-space: nowrap;
15274
15282
  color: var(--color-text-maxcontrast);
15275
15283
  }
15284
+ .cn-files-browser__col-select[data-v-f5bdd9e2] {
15285
+ width: 36px;
15286
+ text-align: center;
15287
+ }
15288
+ .cn-files-browser__select[data-v-f5bdd9e2] {
15289
+ width: 18px;
15290
+ height: 18px;
15291
+ margin: 0;
15292
+ accent-color: var(--color-primary-element);
15293
+ }
15294
+ .cn-files-browser__bulk-bar[data-v-f5bdd9e2] {
15295
+ display: flex;
15296
+ flex-wrap: wrap;
15297
+ align-items: center;
15298
+ gap: 8px;
15299
+ padding: 8px 12px;
15300
+ border-radius: var(--border-radius-large);
15301
+ background: var(--color-primary-element-light);
15302
+ }
15303
+ .cn-files-browser__bulk-count[data-v-f5bdd9e2] {
15304
+ font-weight: 600;
15305
+ margin-inline-end: 8px;
15306
+ }
15307
+ .cn-files-browser__facets[data-v-f5bdd9e2] {
15308
+ display: flex;
15309
+ flex-wrap: wrap;
15310
+ align-items: center;
15311
+ gap: 8px 16px;
15312
+ }
15313
+ .cn-files-browser__facet[data-v-f5bdd9e2] {
15314
+ display: flex;
15315
+ flex-wrap: wrap;
15316
+ gap: 6px;
15317
+ }
15318
+ .cn-files-browser__facet-chip[data-v-f5bdd9e2] {
15319
+ display: inline-flex;
15320
+ align-items: center;
15321
+ gap: 6px;
15322
+ min-height: 32px;
15323
+ padding: 0 12px;
15324
+ border: 1px solid var(--color-border-dark);
15325
+ border-radius: var(--border-radius-pill);
15326
+ background: var(--color-main-background);
15327
+ color: var(--color-main-text);
15328
+ cursor: pointer;
15329
+ }
15330
+ .cn-files-browser__facet-chip--active[data-v-f5bdd9e2] {
15331
+ border-color: var(--color-primary-element);
15332
+ background: var(--color-primary-element-light);
15333
+ }
15334
+ .cn-files-browser__group-heading[data-v-f5bdd9e2] {
15335
+ padding: 12px 8px 4px;
15336
+ text-align: start;
15337
+ font-weight: 700;
15338
+ }
15339
+ .cn-files-browser__group-count[data-v-f5bdd9e2] {
15340
+ margin-inline-start: 6px;
15341
+ font-weight: 400;
15342
+ color: var(--color-text-maxcontrast);
15343
+ }
15344
+ .cn-files-browser__no-match[data-v-f5bdd9e2] {
15345
+ padding: 16px 8px;
15346
+ color: var(--color-text-maxcontrast);
15347
+ }
15276
15348
  .cn-files-browser__col-actions[data-v-f5bdd9e2] {
15277
15349
  width: 48px;
15278
15350
  }
@@ -21928,6 +22000,59 @@ a.cn-kpi-card--board * {
21928
22000
  gap: var(--cn-kpi-stack-gap, 12px);
21929
22001
  }
21930
22002
 
22003
+ /* Rows layout: the board's "label left, number right" card body. */
22004
+ .cn-stats-block-widget--rows[data-v-4f8583ef] {
22005
+ display: flex;
22006
+ flex-direction: column;
22007
+ gap: 12px;
22008
+ box-sizing: border-box;
22009
+ padding: 20px 22px;
22010
+ }
22011
+ .cn-stats-block-widget__rows-title[data-v-4f8583ef] {
22012
+ margin: 0;
22013
+ font-size: 15px;
22014
+ font-weight: 600;
22015
+ color: var(--color-text-maxcontrast);
22016
+ }
22017
+ .cn-stats-block-widget__rows[data-v-4f8583ef] {
22018
+ display: flex;
22019
+ flex-direction: column;
22020
+ gap: 8px;
22021
+ margin: 0;
22022
+ font-size: 14px;
22023
+ }
22024
+ .cn-stats-block-widget__row[data-v-4f8583ef] {
22025
+ display: flex;
22026
+ align-items: baseline;
22027
+ justify-content: space-between;
22028
+ gap: 16px;
22029
+ }
22030
+ .cn-stats-block-widget__row-label[data-v-4f8583ef] {
22031
+ min-width: 0;
22032
+ margin: 0;
22033
+ overflow: hidden;
22034
+ text-overflow: ellipsis;
22035
+ }
22036
+ .cn-stats-block-widget__row-value[data-v-4f8583ef] {
22037
+ flex: none;
22038
+ margin: 0;
22039
+ font-size: 17px;
22040
+ font-weight: 700;
22041
+ text-align: right;
22042
+ }
22043
+ .cn-stats-block-widget__row-value--success[data-v-4f8583ef] {
22044
+ color: var(--color-text-success, var(--color-success-text));
22045
+ }
22046
+ .cn-stats-block-widget__row-value--warning[data-v-4f8583ef] {
22047
+ color: var(--color-text-warning, var(--color-warning-text));
22048
+ }
22049
+ .cn-stats-block-widget__row-value--error[data-v-4f8583ef] {
22050
+ color: var(--color-text-error, var(--color-error-text));
22051
+ }
22052
+ .cn-stats-block-widget__row-value--primary[data-v-4f8583ef] {
22053
+ color: var(--color-primary-element);
22054
+ }
22055
+
21931
22056
 
21932
22057
  .cn-stats-block-form[data-v-20f3b26f] {
21933
22058
  display: flex;
@@ -22529,6 +22654,28 @@ to { background-position: -200% 0;
22529
22654
  margin: 0;
22530
22655
  color: var(--color-text-maxcontrast);
22531
22656
  }
22657
+
22658
+ /* Stacked (PqMijnWerk "Begin hier"): the text, then the action under it. */
22659
+ .cn-banner-widget--stacked[data-v-3531692f] {
22660
+ flex-direction: column;
22661
+ align-items: flex-start;
22662
+ gap: 10px;
22663
+ }
22664
+ .cn-banner-widget--stacked .cn-banner-widget__body[data-v-3531692f] {
22665
+ flex: 0 0 auto;
22666
+ gap: 10px;
22667
+ }
22668
+ .cn-banner-widget--stacked .cn-banner-widget__title[data-v-3531692f] {
22669
+ font-size: 16px;
22670
+ line-height: 1.4;
22671
+ }
22672
+ .cn-banner-widget--stacked .cn-banner-widget__reason[data-v-3531692f] {
22673
+ font-size: 14px;
22674
+ }
22675
+ .cn-banner-widget--stacked .cn-banner-widget__action[data-v-3531692f] {
22676
+ min-height: var(--cn-board-control-height, 40px);
22677
+ font-size: 14px;
22678
+ }
22532
22679
  .cn-banner-widget__actions[data-v-3531692f] {
22533
22680
  display: flex;
22534
22681
  flex-wrap: wrap;
@@ -23524,6 +23671,13 @@ button.cn-stepper__step[data-v-19697746] {
23524
23671
  }
23525
23672
 
23526
23673
 
23674
+ .cn-form-page__honeypot {
23675
+ position: absolute;
23676
+ left: -10000px;
23677
+ width: 1px;
23678
+ height: 1px;
23679
+ overflow: hidden;
23680
+ }
23527
23681
  .cn-form-page {
23528
23682
  display: flex;
23529
23683
  flex-direction: column;
@@ -28805,6 +28959,42 @@ a.cn-record-list__inline-title[data-v-7073b362] {
28805
28959
  gap: 2px;
28806
28960
  }
28807
28961
 
28962
+ /* The chips: the compact segmented group, left, in the card the grid draws. */
28963
+ .cn-workspace-filter-widget--chips[data-v-f0d5c1c6] {
28964
+ flex-direction: row;
28965
+ flex-wrap: wrap;
28966
+ align-items: center;
28967
+ }
28968
+
28969
+ /* A bar: its controls in one row, an `align: "end"` control pushed right. */
28970
+ .cn-workspace-filter-widget--bar[data-v-f0d5c1c6] {
28971
+ flex-direction: row;
28972
+ flex-wrap: wrap;
28973
+ align-items: center;
28974
+ gap: 12px 16px;
28975
+ }
28976
+
28977
+ /* An inline control sits in a bar: label left of the control, width to its content. */
28978
+ .cn-workspace-filter-widget--inline[data-v-f0d5c1c6] {
28979
+ flex-direction: row;
28980
+ align-items: center;
28981
+ gap: 8px;
28982
+ width: auto;
28983
+ }
28984
+ .cn-workspace-filter-widget--inline .cn-workspace-filter-widget__label[data-v-f0d5c1c6] {
28985
+ font-weight: 400;
28986
+ color: var(--color-text-maxcontrast);
28987
+ }
28988
+ .cn-workspace-filter-widget--end[data-v-f0d5c1c6] {
28989
+ margin-inline-start: auto;
28990
+ }
28991
+ .cn-workspace-filter-widget--end ~ .cn-workspace-filter-widget--end[data-v-f0d5c1c6] {
28992
+ margin-inline-start: 0;
28993
+ }
28994
+ .cn-workspace-filter-widget__toggle[data-v-f0d5c1c6] {
28995
+ font-weight: 600;
28996
+ }
28997
+
28808
28998
  /* The start card: text left, control (and link) right, as PqDashboard's "Contact starten". */
28809
28999
  .cn-workspace-filter-widget--start[data-v-f0d5c1c6] {
28810
29000
  flex-direction: row;
package/l10n/en.json CHANGED
@@ -1368,7 +1368,14 @@
1368
1368
  "{count} filters": "{count} filters",
1369
1369
  "{count} more filters": "{count} more filters",
1370
1370
  "{label} — show the other filters": "{label} — show the other filters",
1371
- "{view}: not available on this list": "{view}: not available on this list"
1371
+ "Select {name}": "Select {name}",
1372
+ "Select all files": "Select all files",
1373
+ "No files match the filter.": "No files match the filter.",
1374
+ "Actions for the selected files": "Actions for the selected files",
1375
+ "{view}: not available on this list": "{view}: not available on this list",
1376
+ "Leave this field empty": "Leave this field empty",
1377
+ "This answer was refused.": "This answer was refused.",
1378
+ "No value ({count})": "No value ({count})"
1372
1379
  },
1373
1380
  "plurals": {
1374
1381
  "{count} selected": [
package/l10n/nl.json CHANGED
@@ -171,6 +171,52 @@
171
171
  "No integrations available yet.": "Nog geen integraties beschikbaar.",
172
172
  "This integration is not available.": "Deze integratie is niet beschikbaar.",
173
173
  "Integrations": "Integraties",
174
+ "User settings": "Persoonlijke instellingen",
175
+ "Personal settings": "Persoonlijke instellingen",
176
+ "Admin settings": "Beheerinstellingen",
177
+ "Main navigation": "Hoofdnavigatie",
178
+ "Credentials": "Inloggegevens",
179
+ "Notifications": "Meldingen",
180
+ "Walkthrough": "Rondleiding",
181
+ "Take the guided tour of this app again.": "Doe de rondleiding door deze app nog een keer.",
182
+ "Restart walkthrough": "Rondleiding opnieuw starten",
183
+ "These open in another app.": "Deze openen in een andere app.",
184
+ "Notification preferences unavailable": "Meldingsvoorkeuren niet beschikbaar",
185
+ "Notification preferences are provided by OpenRegister and could not be loaded here.": "Meldingsvoorkeuren komen uit OpenRegister en konden hier niet worden geladen.",
186
+ "No notifications": "Geen meldingen",
187
+ "This app has no notifications.": "Deze app stuurt geen meldingen.",
188
+ "Choose which notifications you want to receive. Items you leave unchanged use the app default.": "Kies welke meldingen je wilt krijgen. Wat je niet aanpast, volgt de standaard van de app.",
189
+ "Reset to default": "Standaard herstellen",
190
+ "Could not save notification preference": "De meldingsvoorkeur kon niet worden opgeslagen",
191
+ "Could not reset notification preference": "De meldingsvoorkeur kon niet worden hersteld",
192
+ "When an item is created": "Als een item is aangemaakt",
193
+ "When an item is updated": "Als een item is gewijzigd",
194
+ "When an item is assigned or changes status": "Als een item is toegewezen of van status verandert",
195
+ "Learn about Keepiq": "Meer over Keepiq",
196
+ "What {app} uses": "Wat {app} gebruikt",
197
+ "This app does not use any external credentials.": "Deze app gebruikt geen inloggegevens van andere diensten.",
198
+ "Credentials are provided by OpenRegister and could not be loaded here.": "Inloggegevens komen uit OpenRegister en konden hier niet worden geladen.",
199
+ "Organisation credentials": "Inloggegevens van de organisatie",
200
+ "Your credentials": "Jouw inloggegevens",
201
+ "No credentials stored yet.": "Je hebt nog geen inloggegevens opgeslagen.",
202
+ "Confirm delete": "Verwijderen bevestigen",
203
+ "{app} may use this credential": "{app} mag deze inloggegevens gebruiken",
204
+ "Also allowed for: {apps}": "Ook toegestaan voor: {apps}",
205
+ "Allowed apps": "Toegestane apps",
206
+ "No app may use this credential yet": "Nog geen app mag deze inloggegevens gebruiken",
207
+ "Add credential": "Inloggegevens toevoegen",
208
+ "Which credential do you want to add?": "Welke inloggegevens wil je toevoegen?",
209
+ "Open {provider}": "{provider} openen",
210
+ "A label to recognise this credential later.": "Een naam waaraan je deze inloggegevens later herkent.",
211
+ "Secret": "Geheim",
212
+ "Sent to OpenRegister and stored in Keepiq. It is never shown again.": "Gaat naar OpenRegister en wordt in Keepiq bewaard. Je ziet het hierna nooit meer.",
213
+ "Choose which apps may use it": "Kies welke apps ze mogen gebruiken",
214
+ "{app} will be allowed to use this credential. You can change that afterwards.": "{app} mag deze inloggegevens gebruiken. Dat kun je later aanpassen.",
215
+ "This app": "Deze app",
216
+ "Could not save the credential": "De inloggegevens konden niet worden opgeslagen",
217
+ "Could not delete the credential": "De inloggegevens konden niet worden verwijderd",
218
+ "Could not update the credential": "De inloggegevens konden niet worden bijgewerkt",
219
+ "Could not update allowed apps": "De toegestane apps konden niet worden bijgewerkt",
174
220
  "View": "Bekijken",
175
221
  "Views": "Weergaven",
176
222
  "current step": "huidige stap",
@@ -1466,7 +1512,14 @@
1466
1512
  "{count} days left": "Nog {count} dagen",
1467
1513
  "1 day overdue": "1 dag te laat",
1468
1514
  "{count} days overdue": "{count} dagen te laat",
1469
- "{view}: not available on this list": "{view}: niet beschikbaar in deze lijst"
1515
+ "Select {name}": "{name} selecteren",
1516
+ "Select all files": "Alle bestanden selecteren",
1517
+ "No files match the filter.": "Geen bestanden passen bij het filter.",
1518
+ "Actions for the selected files": "Acties voor de geselecteerde bestanden",
1519
+ "{view}: not available on this list": "{view}: niet beschikbaar in deze lijst",
1520
+ "Leave this field empty": "Laat dit veld leeg",
1521
+ "This answer was refused.": "Dit antwoord is geweigerd.",
1522
+ "No value ({count})": "Geen waarde ({count})"
1470
1523
  },
1471
1524
  "plurals": {
1472
1525
  "{count} selected": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@conduction/nextcloud-vue",
3
- "version": "2.56.0-beta.30",
3
+ "version": "2.56.0-beta.31",
4
4
  "description": "Shared Vue component library for Conduction Nextcloud apps — complements @nextcloud/vue with higher-level components, OpenRegister integration, and NL Design System support",
5
5
  "homepage": "https://github.com/ConductionNL/nextcloud-vue#readme",
6
6
  "bugs": {
@@ -72,6 +72,7 @@
72
72
  "check:css-entry": "node scripts/check-css-entry.js",
73
73
  "check:dist-sideeffects": "node scripts/check-dist-sideeffects.mjs",
74
74
  "check:docs": "node scripts/check-docs.js",
75
+ "check:docs-mdx": "node scripts/check-docs-mdx.mjs",
75
76
  "check:docs-fresh": "cd docusaurus && npm run prebuild:docs && cd .. && node scripts/check-docs-fresh.js",
76
77
  "check:integration-parity": "node scripts/check-integration-parity.js",
77
78
  "check:journey-vocabulary": "node scripts/gates/journey-vocabulary.mjs .",
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Compiles every page under docs/ the way the Docusaurus site does (MDX 3,
3
+ * GFM, directives), and fails on the first class of error that breaks the
4
+ * site build: a `<word>` read as a JSX tag, a `{` read as an expression, an
5
+ * unclosed code span inside a table cell.
6
+ *
7
+ * Why this exists: `check:docs` and `check:docs-fresh` read the pages as
8
+ * text, so a page that MDX cannot compile passed both and only failed in the
9
+ * "Deploy Documentation" run after the push to beta (docs/components/
10
+ * cn-actions-bar.md and cn-workspace-filter-widget.md, 11 Oct 2026). The full
11
+ * `docusaurus build` takes minutes; this compiles the same pages in seconds.
12
+ *
13
+ * Needs the docusaurus/ dependencies (`cd docusaurus && npm ci`), which every
14
+ * code-quality check leg already installs.
15
+ *
16
+ * Usage: node scripts/check-docs-mdx.mjs
17
+ */
18
+
19
+ import fs from 'node:fs'
20
+ import { createRequire } from 'node:module'
21
+ import path from 'node:path'
22
+ import { fileURLToPath, pathToFileURL } from 'node:url'
23
+
24
+ const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..')
25
+ const DOCS_DIR = path.join(ROOT, 'docs')
26
+ const SITE_REQUIRE = createRequire(path.join(ROOT, 'docusaurus', 'package.json'))
27
+
28
+ /**
29
+ * Imports an ESM package from docusaurus/node_modules.
30
+ *
31
+ * @param {string} name package name
32
+ * @return {Promise<object>} the module namespace
33
+ */
34
+ async function importFromSite(name) {
35
+ let resolved
36
+ try {
37
+ resolved = SITE_REQUIRE.resolve(name)
38
+ } catch {
39
+ console.error(`check:docs-mdx: cannot resolve ${name} from docusaurus/. Run \`cd docusaurus && npm ci\` first.`)
40
+ process.exit(2)
41
+ }
42
+ return import(pathToFileURL(resolved).href)
43
+ }
44
+
45
+ /**
46
+ * @param {string} dir directory to walk
47
+ * @return {string[]} every .md / .mdx file below it
48
+ */
49
+ function listPages(dir) {
50
+ const out = []
51
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
52
+ const full = path.join(dir, entry.name)
53
+ if (entry.isDirectory()) {
54
+ out.push(...listPages(full))
55
+ } else if (/\.mdx?$/.test(entry.name)) {
56
+ out.push(full)
57
+ }
58
+ }
59
+ return out
60
+ }
61
+
62
+ const { compile } = await importFromSite('@mdx-js/mdx')
63
+ const remarkFrontmatter = (await importFromSite('remark-frontmatter')).default
64
+ const remarkComment = (await importFromSite('@slorber/remark-comment')).default
65
+ const remarkGfm = (await importFromSite('remark-gfm')).default
66
+ const remarkDirective = (await importFromSite('remark-directive')).default
67
+ const { unwrapMdxCodeBlocks, escapeMarkdownHeadingIds } = SITE_REQUIRE('@docusaurus/utils')
68
+
69
+ // The syntax extensions the site's MDX processor parses with
70
+ // (@docusaurus/mdx-loader lib/processor.js, mdx1Compat defaults on): front
71
+ // matter, HTML comments, GFM tables, admonition directives. A parse error is
72
+ // what breaks the build, so these are the ones that matter here.
73
+ const REMARK_PLUGINS = [remarkFrontmatter, remarkComment, remarkGfm, remarkDirective]
74
+
75
+ /**
76
+ * Applies the string preprocessing @docusaurus/mdx-loader runs before MDX
77
+ * (lib/preprocessor.js): unwrap mdx-code-block fences and escape custom
78
+ * heading ids.
79
+ *
80
+ * @param {string} source page source
81
+ * @return {string} the source MDX actually sees
82
+ */
83
+ function preprocess(source) {
84
+ return escapeMarkdownHeadingIds(unwrapMdxCodeBlocks(source))
85
+ }
86
+
87
+ const pages = listPages(DOCS_DIR)
88
+ const failures = []
89
+ for (const page of pages) {
90
+ const source = preprocess(fs.readFileSync(page, 'utf8'))
91
+ try {
92
+ await compile(source, { remarkPlugins: REMARK_PLUGINS })
93
+ } catch (error) {
94
+ const where = error.line ? `:${error.line}:${error.column ?? 1}` : ''
95
+ failures.push(`${path.relative(ROOT, page)}${where} ${error.reason ?? error.message}`)
96
+ }
97
+ }
98
+
99
+ if (failures.length > 0) {
100
+ console.error(`check:docs-mdx: ${failures.length} of ${pages.length} page(s) do not compile as MDX:\n`)
101
+ for (const line of failures) {
102
+ console.error(` ${line}`)
103
+ }
104
+ console.error('\nEscape a literal `<word>` or `{` with a backslash, or put it in a code span.')
105
+ process.exit(1)
106
+ }
107
+
108
+ console.log(`check:docs-mdx: all ${pages.length} pages compile as MDX.`)
@@ -23,7 +23,7 @@
23
23
  wrap together to the start of the next line (the DqZaken board),
24
24
  never the switch alone.
25
25
  -->
26
- <div v-if="showSidebarToggle || (showViewToggle && viewSegments.length > 1)"
26
+ <div v-if="showSidebarToggle || $slots['filter-menu'] || (showViewToggle && viewSegments.length > 1)"
27
27
  class="cn-actions-bar__view-controls"
28
28
  data-testid="cn-actions-bar-view-controls">
29
29
  <NcButton v-if="showSidebarToggle"
@@ -42,6 +42,11 @@
42
42
  data-testid="cn-actions-bar-filter-badge"
43
43
  :aria-label="filterCountLabel">{{ filterCount }}</span>
44
44
  </NcButton>
45
+ <!--
46
+ @slot filter-menu
47
+ @description Board look, row 1: the Filter button drawn as a menu, for a page with no filter sidebar (`filterMenu`). Ignored while the sidebar toggle is shown.
48
+ -->
49
+ <slot v-else name="filter-menu" />
45
50
  <div v-if="showViewToggle && viewSegments.length > 1"
46
51
  class="cn-actions-bar__view-toggle"
47
52
  role="group"
@@ -84,7 +84,8 @@ With loading state, custom components, translate, permissions, and custom page t
84
84
  | `notificationLabels` | Object | No | `{}` | Labels for the app's notification rules in the user-settings notification pane, keyed `<schema>.<key>` or `<key>`; values are translated strings or `{ nl, en }` maps. A rule without a label reads as its key split into words ("Case assigned"), never as the raw key. Provided to descendants as `cnNotificationLabels` |
85
85
  | `permissions` | Array | No | `[]` | Permission strings for the current user; forwarded to `CnAppNav` for menu filtering |
86
86
  | `pageTypes` | Object | No | `null` | Page-type registry map (`type → component`). Falls back to the library's `defaultPageTypes`. Extend with `{ ...defaultPageTypes, report: MyReportPage }` |
87
- | `userSettingsTitle` | String | No | `''` | Title shown at the top of the hosted `NcAppSettingsDialog`. Empty (the default) resolves to `translate('User settings')`. Override per app to brand the modal (e.g. `'Decidiq preferences'`). |
87
+ | `userSettingsTitle` | String | No | `''` | Title shown at the top of the hosted `NcAppSettingsDialog`. Empty (the default) resolves to "User settings" from the library catalogue ("Persoonlijke instellingen" in Dutch), then the app's `translate`. Override per app to brand the modal (e.g. `'Decidiq preferences'`). |
88
+ | `userSettingsSections` | Array | No | `null` | The user-settings sections to draw, in order: `app` (the app's slot content), `notifications`, `credentials`, `walkthrough`, `integrations`. A key left out is not drawn. `null` keeps the defaults: every section after `#user-settings-sections` content, or only the `#user-settings` content and the integrations section. |
88
89
  | `adminSettingsTitle` | String | No | `''` | Title shown at the top of the admin-settings `NcAppSettingsDialog`. Empty (the default) resolves to `translate('Administration')`. Override per app (e.g. `'Pipelinq administration'`). |
89
90
  | `requiresApps` | Array | No | `['openregister']` | App ids that MUST be installed for the host app to function. Checked against the OCS capabilities API on mount. When any required app is missing, CnAppRoot renders the empty state from the `or-missing` slot (default: `<NcEmptyContent>`) instead of the renderer. Pass `[]` to opt out (e.g. launchpad, the docs/styleguide app) — useful for any consumer that does not depend on OpenRegister. |
90
91
  | `look` | String | No | `''` | The look the app is drawn in: `board` or `nextcloud`. Empty falls back to the manifest's top-level `look`, then `nextcloud`. Provided to descendants as `cnLook`. |
@@ -104,7 +105,8 @@ With loading state, custom components, translate, permissions, and custom page t
104
105
  | `header-actions` | — | Extra buttons rendered in the app header |
105
106
  | `sidebar` | — | Sidebar area rendered alongside `NcAppContent` |
106
107
  | `footer` | — | Footer area rendered inside `NcAppContent` |
107
- | `user-settings` | — | `NcAppSettingsSection` children rendered inside the host `NcAppSettingsDialog`. CnAppRoot always mounts the dialog and exposes `cnOpenUserSettings` via inject; CnAppNav binds it to manifest items declaring `action: "user-settings"`. Defaults to a single placeholder section. |
108
+ | `user-settings-sections` | — | The app's own `NcAppSettingsSection` children, ADDED to the default sections (notifications, credentials, walkthrough replay, integrations). Place, order or hide the defaults with `userSettingsSections`. |
109
+ | `user-settings` | — | The older slot: the app's own `NcAppSettingsSection` children, REPLACING the default sections (only this content and the integrations section are drawn, unless `userSettingsSections` names more). CnAppRoot always mounts the dialog and exposes `cnOpenUserSettings` via inject; CnAppNav binds it to manifest items declaring `action: "user-settings"`. |
108
110
 
109
111
  ## AI Chat Companion — Context push
110
112