@conduction/nextcloud-vue 2.58.0 → 2.60.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 (507) hide show
  1. package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js +12 -2
  2. package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js.map +1 -1
  3. package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js +1 -2
  4. package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js.map +1 -1
  5. package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue2.js +14 -1
  6. package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue2.js.map +1 -1
  7. package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue3.js +0 -3
  8. package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue3.js.map +1 -1
  9. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js.map +1 -1
  10. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js +1 -2
  11. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js.map +1 -1
  12. package/dist/esm/components/CnAppNav/CnAppNav.vue2.js +39 -0
  13. package/dist/esm/components/CnAppNav/CnAppNav.vue2.js.map +1 -1
  14. package/dist/esm/components/CnAppNav/CnAppNav.vue3.js +46 -4
  15. package/dist/esm/components/CnAppNav/CnAppNav.vue3.js.map +1 -1
  16. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js +224 -9
  17. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js.map +1 -1
  18. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js +79 -25
  19. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js.map +1 -1
  20. package/dist/esm/components/CnBannerWidgetForm/CnBannerWidgetForm.vue2.js +42 -3
  21. package/dist/esm/components/CnBannerWidgetForm/CnBannerWidgetForm.vue2.js.map +1 -1
  22. package/dist/esm/components/CnBannerWidgetForm/CnBannerWidgetForm.vue3.js +39 -6
  23. package/dist/esm/components/CnBannerWidgetForm/CnBannerWidgetForm.vue3.js.map +1 -1
  24. package/dist/esm/components/CnBoardView/CnBoardView.vue2.js +58 -5
  25. package/dist/esm/components/CnBoardView/CnBoardView.vue2.js.map +1 -1
  26. package/dist/esm/components/CnBoardView/CnBoardView.vue3.js +13 -5
  27. package/dist/esm/components/CnBoardView/CnBoardView.vue3.js.map +1 -1
  28. package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue.js +10 -0
  29. package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue.js.map +1 -0
  30. package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue2.js +39 -0
  31. package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue2.js.map +1 -0
  32. package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue3.js +16 -0
  33. package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue3.js.map +1 -0
  34. package/dist/esm/components/CnCardGrid/CnCardGrid.vue2.js +9 -1
  35. package/dist/esm/components/CnCardGrid/CnCardGrid.vue2.js.map +1 -1
  36. package/dist/esm/components/CnCardGrid/CnCardGrid.vue3.js.map +1 -1
  37. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +117 -1
  38. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
  39. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js +147 -89
  40. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
  41. package/dist/esm/components/CnContextMenu/CnContextMenu.vue2.js +6 -1
  42. package/dist/esm/components/CnContextMenu/CnContextMenu.vue2.js.map +1 -1
  43. package/dist/esm/components/CnContextMenu/CnContextMenu.vue3.js.map +1 -1
  44. package/dist/esm/components/CnConversationThread/CnConversationThread.vue.js +10 -0
  45. package/dist/esm/components/CnConversationThread/CnConversationThread.vue.js.map +1 -0
  46. package/dist/esm/components/CnConversationThread/CnConversationThread.vue2.js +259 -0
  47. package/dist/esm/components/CnConversationThread/CnConversationThread.vue2.js.map +1 -0
  48. package/dist/esm/components/CnConversationThread/CnConversationThread.vue3.js +131 -0
  49. package/dist/esm/components/CnConversationThread/CnConversationThread.vue3.js.map +1 -0
  50. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue.js +10 -0
  51. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue.js.map +1 -0
  52. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js +116 -0
  53. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js.map +1 -0
  54. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue3.js +24 -0
  55. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue3.js.map +1 -0
  56. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +116 -15
  57. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
  58. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +27 -14
  59. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
  60. package/dist/esm/components/CnDateAxisView/CnDateAxisView.vue2.js +13 -6
  61. package/dist/esm/components/CnDateAxisView/CnDateAxisView.vue2.js.map +1 -1
  62. package/dist/esm/components/CnDateAxisView/CnDateAxisView.vue3.js +2 -0
  63. package/dist/esm/components/CnDateAxisView/CnDateAxisView.vue3.js.map +1 -1
  64. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +532 -29
  65. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  66. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +300 -142
  67. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  68. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue.js +10 -0
  69. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue.js.map +1 -0
  70. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue2.js +237 -0
  71. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue2.js.map +1 -0
  72. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue3.js +120 -0
  73. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue3.js.map +1 -0
  74. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue.js +10 -0
  75. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue.js.map +1 -0
  76. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue2.js +77 -0
  77. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue2.js.map +1 -0
  78. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue3.js +27 -0
  79. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue3.js.map +1 -0
  80. package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue2.js.map +1 -1
  81. package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue3.js +1 -2
  82. package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue3.js.map +1 -1
  83. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +3 -1
  84. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
  85. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js +17 -17
  86. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
  87. package/dist/esm/components/CnFilesWidget/CnFilesWidget.vue2.js +4 -21
  88. package/dist/esm/components/CnFilesWidget/CnFilesWidget.vue2.js.map +1 -1
  89. package/dist/esm/components/CnFilesWidget/CnFilesWidget.vue3.js.map +1 -1
  90. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue2.js +0 -13
  91. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue2.js.map +1 -1
  92. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue3.js +8 -8
  93. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue3.js.map +1 -1
  94. package/dist/esm/components/CnFlowsPage/CnFlowsPage.vue2.js.map +1 -1
  95. package/dist/esm/components/CnFlowsPage/CnFlowsPage.vue3.js +3 -2
  96. package/dist/esm/components/CnFlowsPage/CnFlowsPage.vue3.js.map +1 -1
  97. package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue2.js +169 -12
  98. package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue2.js.map +1 -1
  99. package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue3.js +15 -7
  100. package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue3.js.map +1 -1
  101. package/dist/esm/components/CnHeaderWidgetForm/CnHeaderWidgetForm.vue2.js +37 -3
  102. package/dist/esm/components/CnHeaderWidgetForm/CnHeaderWidgetForm.vue2.js.map +1 -1
  103. package/dist/esm/components/CnHeaderWidgetForm/CnHeaderWidgetForm.vue3.js +44 -16
  104. package/dist/esm/components/CnHeaderWidgetForm/CnHeaderWidgetForm.vue3.js.map +1 -1
  105. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +199 -16
  106. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  107. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +20 -10
  108. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  109. package/dist/esm/components/CnIndexPage/manifestActionDispatch.js +31 -11
  110. package/dist/esm/components/CnIndexPage/manifestActionDispatch.js.map +1 -1
  111. package/dist/esm/components/CnIntegrationWidget/CnIntegrationWidgetEmpty.vue2.js.map +1 -1
  112. package/dist/esm/components/CnIntegrationWidget/CnIntegrationWidgetEmpty.vue3.js +1 -2
  113. package/dist/esm/components/CnIntegrationWidget/CnIntegrationWidgetEmpty.vue3.js.map +1 -1
  114. package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue2.js.map +1 -1
  115. package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue3.js +0 -1
  116. package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue3.js.map +1 -1
  117. package/dist/esm/components/CnLinkButtonWidget/CnLinkButtonWidget.vue2.js +2 -17
  118. package/dist/esm/components/CnLinkButtonWidget/CnLinkButtonWidget.vue2.js.map +1 -1
  119. package/dist/esm/components/CnLinkButtonWidget/CnLinkButtonWidget.vue3.js.map +1 -1
  120. package/dist/esm/components/CnLogsPage/CnLogsPage.vue2.js +35 -11
  121. package/dist/esm/components/CnLogsPage/CnLogsPage.vue2.js.map +1 -1
  122. package/dist/esm/components/CnLogsPage/CnLogsPage.vue3.js +3 -2
  123. package/dist/esm/components/CnLogsPage/CnLogsPage.vue3.js.map +1 -1
  124. package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue.js +10 -0
  125. package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue.js.map +1 -0
  126. package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue2.js +150 -0
  127. package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue2.js.map +1 -0
  128. package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue3.js +106 -0
  129. package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue3.js.map +1 -0
  130. package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue.js +9 -0
  131. package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue.js.map +1 -0
  132. package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue2.js +47 -0
  133. package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue2.js.map +1 -0
  134. package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue3.js +17 -0
  135. package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue3.js.map +1 -0
  136. package/dist/esm/components/CnObjectCard/CnObjectCard.vue2.js +23 -5
  137. package/dist/esm/components/CnObjectCard/CnObjectCard.vue2.js.map +1 -1
  138. package/dist/esm/components/CnObjectCard/CnObjectCard.vue3.js +1 -1
  139. package/dist/esm/components/CnObjectCard/CnObjectCard.vue3.js.map +1 -1
  140. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js +49 -0
  141. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js.map +1 -1
  142. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js.map +1 -1
  143. package/dist/esm/components/CnObjectDataWidgetForm/CnObjectDataWidgetForm.vue2.js +6 -0
  144. package/dist/esm/components/CnObjectDataWidgetForm/CnObjectDataWidgetForm.vue2.js.map +1 -1
  145. package/dist/esm/components/CnObjectDataWidgetForm/CnObjectDataWidgetForm.vue3.js.map +1 -1
  146. package/dist/esm/components/CnObjectKanban/CnObjectKanban.vue2.js +46 -0
  147. package/dist/esm/components/CnObjectKanban/CnObjectKanban.vue2.js.map +1 -1
  148. package/dist/esm/components/CnObjectKanban/CnObjectKanban.vue3.js +15 -3
  149. package/dist/esm/components/CnObjectKanban/CnObjectKanban.vue3.js.map +1 -1
  150. package/dist/esm/components/CnObjectList/CnObjectList.vue2.js +19 -3
  151. package/dist/esm/components/CnObjectList/CnObjectList.vue2.js.map +1 -1
  152. package/dist/esm/components/CnObjectList/CnObjectList.vue3.js.map +1 -1
  153. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +45 -15
  154. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
  155. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js +4 -2
  156. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
  157. package/dist/esm/components/CnObjectRow/CnObjectRow.vue2.js +24 -6
  158. package/dist/esm/components/CnObjectRow/CnObjectRow.vue2.js.map +1 -1
  159. package/dist/esm/components/CnObjectRow/CnObjectRow.vue3.js +1 -1
  160. package/dist/esm/components/CnObjectRow/CnObjectRow.vue3.js.map +1 -1
  161. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js.map +1 -1
  162. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js +0 -1
  163. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js.map +1 -1
  164. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue2.js.map +1 -1
  165. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue3.js +4 -2
  166. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue3.js.map +1 -1
  167. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue2.js +37 -1
  168. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue2.js.map +1 -1
  169. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue3.js +29 -13
  170. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue3.js.map +1 -1
  171. package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue2.js +100 -3
  172. package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue2.js.map +1 -1
  173. package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue3.js.map +1 -1
  174. package/dist/esm/components/CnRowActions/CnRowActions.vue2.js +7 -2
  175. package/dist/esm/components/CnRowActions/CnRowActions.vue2.js.map +1 -1
  176. package/dist/esm/components/CnRowActions/CnRowActions.vue3.js.map +1 -1
  177. package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue2.js +50 -3
  178. package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue2.js.map +1 -1
  179. package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue3.js.map +1 -1
  180. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue.js +10 -0
  181. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue.js.map +1 -0
  182. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue2.js +186 -0
  183. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue2.js.map +1 -0
  184. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue3.js +46 -0
  185. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue3.js.map +1 -0
  186. package/dist/esm/components/CnSpendAnalyticsWidget/CnSpendAnalyticsWidget.vue2.js +5 -3
  187. package/dist/esm/components/CnSpendAnalyticsWidget/CnSpendAnalyticsWidget.vue2.js.map +1 -1
  188. package/dist/esm/components/CnSpendAnalyticsWidget/CnSpendAnalyticsWidget.vue3.js.map +1 -1
  189. package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue.js +11 -0
  190. package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue.js.map +1 -0
  191. package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue2.js +298 -0
  192. package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue2.js.map +1 -0
  193. package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue3.js +77 -0
  194. package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue3.js.map +1 -0
  195. package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue.js +10 -0
  196. package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue.js.map +1 -0
  197. package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue2.js +169 -0
  198. package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue2.js.map +1 -0
  199. package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue3.js +48 -0
  200. package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue3.js.map +1 -0
  201. package/dist/esm/components/CnTabs/CnTab.vue2.js +35 -0
  202. package/dist/esm/components/CnTabs/CnTab.vue2.js.map +1 -1
  203. package/dist/esm/components/CnTabs/CnTab.vue3.js.map +1 -1
  204. package/dist/esm/components/CnTabs/CnTabs.vue2.js +120 -7
  205. package/dist/esm/components/CnTabs/CnTabs.vue2.js.map +1 -1
  206. package/dist/esm/components/CnTabs/CnTabs.vue3.js +57 -5
  207. package/dist/esm/components/CnTabs/CnTabs.vue3.js.map +1 -1
  208. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +59 -4
  209. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
  210. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js +6 -2
  211. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
  212. package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue2.js +3 -1
  213. package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue2.js.map +1 -1
  214. package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue3.js +1 -0
  215. package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue3.js.map +1 -1
  216. package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue.js +10 -0
  217. package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue.js.map +1 -0
  218. package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue2.js +484 -0
  219. package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue2.js.map +1 -0
  220. package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue3.js +115 -0
  221. package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue3.js.map +1 -0
  222. package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue.js +10 -0
  223. package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue.js.map +1 -0
  224. package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue2.js +189 -0
  225. package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue2.js.map +1 -0
  226. package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue3.js +74 -0
  227. package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue3.js.map +1 -0
  228. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js +82 -8
  229. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js.map +1 -1
  230. package/dist/esm/index.js +10 -0
  231. package/dist/esm/index.js.map +1 -1
  232. package/dist/esm/integrations/builtin/analytics/CnAnalyticsCard.vue2.js +3 -1
  233. package/dist/esm/integrations/builtin/analytics/CnAnalyticsCard.vue2.js.map +1 -1
  234. package/dist/esm/integrations/builtin/analytics/CnAnalyticsCard.vue3.js.map +1 -1
  235. package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue2.js +3 -1
  236. package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue2.js.map +1 -1
  237. package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue3.js +2 -4
  238. package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue3.js.map +1 -1
  239. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksCard.vue2.js +6 -0
  240. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksCard.vue2.js.map +1 -1
  241. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksCard.vue3.js +68 -53
  242. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksCard.vue3.js.map +1 -1
  243. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksTab.vue2.js +17 -0
  244. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksTab.vue2.js.map +1 -1
  245. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksTab.vue3.js +21 -19
  246. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksTab.vue3.js.map +1 -1
  247. package/dist/esm/integrations/builtin/collectives/CnCollectivesCard.vue2.js +3 -1
  248. package/dist/esm/integrations/builtin/collectives/CnCollectivesCard.vue2.js.map +1 -1
  249. package/dist/esm/integrations/builtin/collectives/CnCollectivesCard.vue3.js.map +1 -1
  250. package/dist/esm/integrations/builtin/collectives/CnCollectivesTab.vue2.js +3 -1
  251. package/dist/esm/integrations/builtin/collectives/CnCollectivesTab.vue2.js.map +1 -1
  252. package/dist/esm/integrations/builtin/collectives/CnCollectivesTab.vue3.js +2 -4
  253. package/dist/esm/integrations/builtin/collectives/CnCollectivesTab.vue3.js.map +1 -1
  254. package/dist/esm/integrations/builtin/cospend/CnCospendCard.vue2.js +2 -1
  255. package/dist/esm/integrations/builtin/cospend/CnCospendCard.vue2.js.map +1 -1
  256. package/dist/esm/integrations/builtin/cospend/CnCospendCard.vue3.js.map +1 -1
  257. package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue2.js +2 -1
  258. package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue2.js.map +1 -1
  259. package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue3.js +1 -2
  260. package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue3.js.map +1 -1
  261. package/dist/esm/integrations/builtin/deck/CnDeckCard.vue2.js +2 -1
  262. package/dist/esm/integrations/builtin/deck/CnDeckCard.vue2.js.map +1 -1
  263. package/dist/esm/integrations/builtin/deck/CnDeckCard.vue3.js.map +1 -1
  264. package/dist/esm/integrations/builtin/deck/CnDeckTab.vue2.js +2 -1
  265. package/dist/esm/integrations/builtin/deck/CnDeckTab.vue2.js.map +1 -1
  266. package/dist/esm/integrations/builtin/deck/CnDeckTab.vue3.js +1 -2
  267. package/dist/esm/integrations/builtin/deck/CnDeckTab.vue3.js.map +1 -1
  268. package/dist/esm/integrations/builtin/email/CnEmailCard.vue2.js.map +1 -1
  269. package/dist/esm/integrations/builtin/email/CnEmailCard.vue3.js.map +1 -1
  270. package/dist/esm/integrations/builtin/email/CnEmailTab.vue2.js.map +1 -1
  271. package/dist/esm/integrations/builtin/email/CnEmailTab.vue3.js +1 -2
  272. package/dist/esm/integrations/builtin/email/CnEmailTab.vue3.js.map +1 -1
  273. package/dist/esm/integrations/builtin/flow/CnFlowCard.vue2.js +2 -1
  274. package/dist/esm/integrations/builtin/flow/CnFlowCard.vue2.js.map +1 -1
  275. package/dist/esm/integrations/builtin/flow/CnFlowCard.vue3.js.map +1 -1
  276. package/dist/esm/integrations/builtin/flow/CnFlowTab.vue2.js +2 -1
  277. package/dist/esm/integrations/builtin/flow/CnFlowTab.vue2.js.map +1 -1
  278. package/dist/esm/integrations/builtin/flow/CnFlowTab.vue3.js +1 -2
  279. package/dist/esm/integrations/builtin/flow/CnFlowTab.vue3.js.map +1 -1
  280. package/dist/esm/integrations/builtin/forms/CnFormsCard.vue2.js +3 -1
  281. package/dist/esm/integrations/builtin/forms/CnFormsCard.vue2.js.map +1 -1
  282. package/dist/esm/integrations/builtin/forms/CnFormsCard.vue3.js.map +1 -1
  283. package/dist/esm/integrations/builtin/forms/CnFormsTab.vue2.js +3 -1
  284. package/dist/esm/integrations/builtin/forms/CnFormsTab.vue2.js.map +1 -1
  285. package/dist/esm/integrations/builtin/forms/CnFormsTab.vue3.js +2 -4
  286. package/dist/esm/integrations/builtin/forms/CnFormsTab.vue3.js.map +1 -1
  287. package/dist/esm/integrations/builtin/maps/CnMapsCard.vue2.js +3 -1
  288. package/dist/esm/integrations/builtin/maps/CnMapsCard.vue2.js.map +1 -1
  289. package/dist/esm/integrations/builtin/maps/CnMapsCard.vue3.js.map +1 -1
  290. package/dist/esm/integrations/builtin/maps/CnMapsTab.vue2.js +3 -1
  291. package/dist/esm/integrations/builtin/maps/CnMapsTab.vue2.js.map +1 -1
  292. package/dist/esm/integrations/builtin/maps/CnMapsTab.vue3.js +2 -4
  293. package/dist/esm/integrations/builtin/maps/CnMapsTab.vue3.js.map +1 -1
  294. package/dist/esm/integrations/builtin/openproject/CnOpenprojectCard.vue2.js +3 -1
  295. package/dist/esm/integrations/builtin/openproject/CnOpenprojectCard.vue2.js.map +1 -1
  296. package/dist/esm/integrations/builtin/openproject/CnOpenprojectCard.vue3.js.map +1 -1
  297. package/dist/esm/integrations/builtin/openproject/CnOpenprojectTab.vue2.js +3 -1
  298. package/dist/esm/integrations/builtin/openproject/CnOpenprojectTab.vue2.js.map +1 -1
  299. package/dist/esm/integrations/builtin/openproject/CnOpenprojectTab.vue3.js +2 -4
  300. package/dist/esm/integrations/builtin/openproject/CnOpenprojectTab.vue3.js.map +1 -1
  301. package/dist/esm/integrations/builtin/photos/CnPhotosCard.vue2.js +2 -1
  302. package/dist/esm/integrations/builtin/photos/CnPhotosCard.vue2.js.map +1 -1
  303. package/dist/esm/integrations/builtin/photos/CnPhotosCard.vue3.js.map +1 -1
  304. package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue2.js +2 -1
  305. package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue2.js.map +1 -1
  306. package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue3.js +1 -2
  307. package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue3.js.map +1 -1
  308. package/dist/esm/integrations/builtin/polls/CnPollsCard.vue2.js +2 -1
  309. package/dist/esm/integrations/builtin/polls/CnPollsCard.vue2.js.map +1 -1
  310. package/dist/esm/integrations/builtin/polls/CnPollsCard.vue3.js.map +1 -1
  311. package/dist/esm/integrations/builtin/polls/CnPollsTab.vue2.js +2 -1
  312. package/dist/esm/integrations/builtin/polls/CnPollsTab.vue2.js.map +1 -1
  313. package/dist/esm/integrations/builtin/polls/CnPollsTab.vue3.js +1 -2
  314. package/dist/esm/integrations/builtin/polls/CnPollsTab.vue3.js.map +1 -1
  315. package/dist/esm/integrations/builtin/shares/CnSharesTab.vue2.js.map +1 -1
  316. package/dist/esm/integrations/builtin/shares/CnSharesTab.vue3.js +3 -6
  317. package/dist/esm/integrations/builtin/shares/CnSharesTab.vue3.js.map +1 -1
  318. package/dist/esm/integrations/builtin/talk/CnTalkCard.vue2.js +3 -1
  319. package/dist/esm/integrations/builtin/talk/CnTalkCard.vue2.js.map +1 -1
  320. package/dist/esm/integrations/builtin/talk/CnTalkCard.vue3.js.map +1 -1
  321. package/dist/esm/integrations/builtin/talk/CnTalkTab.vue2.js +3 -1
  322. package/dist/esm/integrations/builtin/talk/CnTalkTab.vue2.js.map +1 -1
  323. package/dist/esm/integrations/builtin/talk/CnTalkTab.vue3.js +2 -4
  324. package/dist/esm/integrations/builtin/talk/CnTalkTab.vue3.js.map +1 -1
  325. package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerCard.vue2.js +2 -1
  326. package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerCard.vue2.js.map +1 -1
  327. package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerCard.vue3.js.map +1 -1
  328. package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerTab.vue2.js +2 -1
  329. package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerTab.vue2.js.map +1 -1
  330. package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerTab.vue3.js +1 -2
  331. package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerTab.vue3.js.map +1 -1
  332. package/dist/esm/integrations/builtin/xwiki/CnXwikiCard.vue2.js +4 -1
  333. package/dist/esm/integrations/builtin/xwiki/CnXwikiCard.vue2.js.map +1 -1
  334. package/dist/esm/integrations/builtin/xwiki/CnXwikiCard.vue3.js.map +1 -1
  335. package/dist/esm/integrations/builtin/xwiki/CnXwikiTab.vue2.js +6 -3
  336. package/dist/esm/integrations/builtin/xwiki/CnXwikiTab.vue2.js.map +1 -1
  337. package/dist/esm/integrations/builtin/xwiki/CnXwikiTab.vue3.js +2 -4
  338. package/dist/esm/integrations/builtin/xwiki/CnXwikiTab.vue3.js.map +1 -1
  339. package/dist/esm/l10n/en.json.js +55 -1
  340. package/dist/esm/l10n/en.json.js.map +1 -1
  341. package/dist/esm/l10n/nl.json.js +55 -1
  342. package/dist/esm/l10n/nl.json.js.map +1 -1
  343. package/dist/esm/nextcloud-vue.css +998 -7
  344. package/dist/esm/utils/actionLink.js +5 -0
  345. package/dist/esm/utils/actionLink.js.map +1 -1
  346. package/dist/esm/utils/actionsDispatcher.js +16 -1
  347. package/dist/esm/utils/actionsDispatcher.js.map +1 -1
  348. package/dist/esm/utils/dateVariant.js +124 -0
  349. package/dist/esm/utils/dateVariant.js.map +1 -0
  350. package/dist/esm/utils/detailActionModel.js +260 -0
  351. package/dist/esm/utils/detailActionModel.js.map +1 -0
  352. package/dist/esm/utils/dueRule.js +84 -0
  353. package/dist/esm/utils/dueRule.js.map +1 -0
  354. package/dist/esm/utils/fetchAggregate.js +37 -1
  355. package/dist/esm/utils/fetchAggregate.js.map +1 -1
  356. package/dist/esm/utils/fetchFilterCounts.js +186 -0
  357. package/dist/esm/utils/fetchFilterCounts.js.map +1 -0
  358. package/dist/esm/utils/libraryWidgetKeys.js +5 -0
  359. package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
  360. package/dist/esm/utils/linkNavigation.js +6 -3
  361. package/dist/esm/utils/linkNavigation.js.map +1 -1
  362. package/dist/esm/utils/readPath.js +30 -0
  363. package/dist/esm/utils/readPath.js.map +1 -0
  364. package/dist/esm/utils/rowAuxClick.js +30 -5
  365. package/dist/esm/utils/rowAuxClick.js.map +1 -1
  366. package/dist/esm/utils/safeHref.js +18 -3
  367. package/dist/esm/utils/safeHref.js.map +1 -1
  368. package/dist/esm/utils/validateManifestV2.compiled.js +2 -2
  369. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  370. package/dist/nextcloud-vue.cjs.js +15855 -9353
  371. package/dist/nextcloud-vue.cjs.js.map +2 -2
  372. package/dist/nextcloud-vue.css +998 -7
  373. package/l10n/en.json +55 -1
  374. package/l10n/nl.json +55 -1
  375. package/package.json +1 -1
  376. package/scripts/.jsdoc-baselines.json +3 -0
  377. package/src/components/CnActionsBar/CnActionsBar.vue +14 -5
  378. package/src/components/CnActionsMenu/CnActionsMenu.vue +14 -4
  379. package/src/components/CnAdminSettingsShell/CnAdminSettingsShell.vue +1 -2
  380. package/src/components/CnAppNav/CnAppNav.md +26 -0
  381. package/src/components/CnAppNav/CnAppNav.vue +104 -1
  382. package/src/components/CnBannerWidget/CnBannerWidget.vue +365 -10
  383. package/src/components/CnBannerWidgetForm/CnBannerWidgetForm.vue +65 -3
  384. package/src/components/CnBoardView/CnBoardView.vue +90 -5
  385. package/src/components/CnBrandStripe/CnBrandStripe.md +22 -0
  386. package/src/components/CnBrandStripe/CnBrandStripe.vue +100 -0
  387. package/src/components/CnBrandStripe/index.js +4 -0
  388. package/src/components/CnCardGrid/CnCardGrid.vue +9 -1
  389. package/src/components/CnCellRenderer/CnCellRenderer.vue +207 -1
  390. package/src/components/CnContextMenu/CnContextMenu.vue +6 -1
  391. package/src/components/CnConversationThread/CnConversationThread.md +51 -0
  392. package/src/components/CnConversationThread/CnConversationThread.vue +457 -0
  393. package/src/components/CnConversationThread/CnConversationWidget.vue +144 -0
  394. package/src/components/CnConversationThread/index.js +4 -0
  395. package/src/components/CnDataTable/CnDataTable.md +1 -1
  396. package/src/components/CnDataTable/CnDataTable.vue +131 -17
  397. package/src/components/CnDateAxisView/CnDateAxisView.vue +15 -6
  398. package/src/components/CnDetailPage/CnDetailPage.md +17 -1
  399. package/src/components/CnDetailPage/CnDetailPage.vue +712 -49
  400. package/src/components/CnDocumentReviewList/CnDocumentReviewList.md +55 -0
  401. package/src/components/CnDocumentReviewList/CnDocumentReviewList.vue +384 -0
  402. package/src/components/CnDocumentReviewList/CnDocumentReviewWidget.vue +108 -0
  403. package/src/components/CnDocumentReviewList/index.js +4 -0
  404. package/src/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue +1 -2
  405. package/src/components/CnFilesBrowser/CnFilesBrowser.vue +5 -3
  406. package/src/components/CnFilesWidget/CnFilesWidget.vue +4 -21
  407. package/src/components/CnFlowRunsWidget/CnFlowRunsWidget.vue +8 -21
  408. package/src/components/CnFlowsPage/CnFlowsPage.vue +2 -1
  409. package/src/components/CnHeaderWidget/CnHeaderWidget.vue +189 -14
  410. package/src/components/CnHeaderWidgetForm/CnHeaderWidgetForm.vue +53 -3
  411. package/src/components/CnIndexPage/CnIndexPage.vue +210 -17
  412. package/src/components/CnIndexPage/manifestActionDispatch.js +31 -11
  413. package/src/components/CnIntegrationWidget/CnIntegrationWidgetEmpty.vue +1 -2
  414. package/src/components/CnInteractionFormWidget/CnInteractionFormWidget.vue +0 -1
  415. package/src/components/CnLinkButtonWidget/CnLinkButtonWidget.vue +2 -17
  416. package/src/components/CnLogsPage/CnLogsPage.vue +37 -12
  417. package/src/components/CnNextStepCard/CnNextStepCard.md +40 -0
  418. package/src/components/CnNextStepCard/CnNextStepCard.vue +319 -0
  419. package/src/components/CnNextStepCard/CnNextStepWidget.vue +59 -0
  420. package/src/components/CnNextStepCard/index.js +4 -0
  421. package/src/components/CnObjectCard/CnObjectCard.vue +24 -6
  422. package/src/components/CnObjectDataWidget/CnObjectDataWidget.vue +49 -0
  423. package/src/components/CnObjectDataWidgetForm/CnObjectDataWidgetForm.vue +6 -0
  424. package/src/components/CnObjectKanban/CnObjectKanban.vue +86 -2
  425. package/src/components/CnObjectList/CnObjectList.vue +19 -3
  426. package/src/components/CnObjectListWidget/CnObjectListWidget.vue +47 -15
  427. package/src/components/CnObjectRow/CnObjectRow.vue +25 -7
  428. package/src/components/CnObjectSidebar/CnFilesTab.vue +0 -1
  429. package/src/components/CnPageRenderer/CnPageRenderer.vue +2 -0
  430. package/src/components/CnQuickFilterBar/CnQuickFilterBar.md +3 -0
  431. package/src/components/CnQuickFilterBar/CnQuickFilterBar.vue +60 -1
  432. package/src/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue +100 -3
  433. package/src/components/CnRowActions/CnRowActions.vue +7 -2
  434. package/src/components/CnSavedViewsControl/CnSavedViewsControl.vue +50 -3
  435. package/src/components/CnSegmentedControl/CnSegmentedControl.md +46 -0
  436. package/src/components/CnSegmentedControl/CnSegmentedControl.vue +291 -0
  437. package/src/components/CnSegmentedControl/index.js +4 -0
  438. package/src/components/CnSpendAnalyticsWidget/CnSpendAnalyticsWidget.vue +5 -3
  439. package/src/components/CnStackedBarWidget/CnStackedBarWidget.md +15 -0
  440. package/src/components/CnStackedBarWidget/CnStackedBarWidget.vue +414 -0
  441. package/src/components/CnStackedBarWidget/index.js +14 -0
  442. package/src/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue +224 -0
  443. package/src/components/CnStackedBarWidgetForm/index.js +4 -0
  444. package/src/components/CnTabs/CnTab.vue +35 -0
  445. package/src/components/CnTabs/CnTabs.vue +251 -13
  446. package/src/components/CnTabsWidget/CnTabsWidget.vue +63 -4
  447. package/src/components/CnTasksWidget/CnTasksWidget.vue +4 -1
  448. package/src/components/CnWeekStripWidget/CnWeekStripWidget.md +31 -0
  449. package/src/components/CnWeekStripWidget/CnWeekStripWidget.vue +668 -0
  450. package/src/components/CnWeekStripWidget/index.js +14 -0
  451. package/src/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue +265 -0
  452. package/src/components/CnWeekStripWidgetForm/index.js +4 -0
  453. package/src/components/CnWidgetGrid/registerDashboardWidgets.js +74 -0
  454. package/src/components/index.js +11 -0
  455. package/src/css/detail-page.css +47 -0
  456. package/src/css/table.css +26 -0
  457. package/src/index.js +9 -0
  458. package/src/integrations/builtin/analytics/CnAnalyticsCard.vue +3 -2
  459. package/src/integrations/builtin/analytics/CnAnalyticsTab.vue +5 -6
  460. package/src/integrations/builtin/bookmarks/CnBookmarksCard.vue +12 -1
  461. package/src/integrations/builtin/bookmarks/CnBookmarksTab.vue +23 -6
  462. package/src/integrations/builtin/bookmarks/__tests__/CnBookmarksTab.spec.js +7 -2
  463. package/src/integrations/builtin/collectives/CnCollectivesCard.vue +3 -2
  464. package/src/integrations/builtin/collectives/CnCollectivesTab.vue +5 -6
  465. package/src/integrations/builtin/cospend/CnCospendCard.vue +2 -2
  466. package/src/integrations/builtin/cospend/CnCospendTab.vue +3 -4
  467. package/src/integrations/builtin/deck/CnDeckCard.vue +2 -2
  468. package/src/integrations/builtin/deck/CnDeckTab.vue +3 -4
  469. package/src/integrations/builtin/email/CnEmailCard.vue +6 -2
  470. package/src/integrations/builtin/email/CnEmailTab.vue +7 -4
  471. package/src/integrations/builtin/flow/CnFlowCard.vue +2 -2
  472. package/src/integrations/builtin/flow/CnFlowTab.vue +3 -4
  473. package/src/integrations/builtin/forms/CnFormsCard.vue +3 -2
  474. package/src/integrations/builtin/forms/CnFormsTab.vue +5 -6
  475. package/src/integrations/builtin/maps/CnMapsCard.vue +3 -2
  476. package/src/integrations/builtin/maps/CnMapsTab.vue +5 -6
  477. package/src/integrations/builtin/maps/__tests__/CnMapsTab.spec.js +9 -0
  478. package/src/integrations/builtin/openproject/CnOpenprojectCard.vue +3 -2
  479. package/src/integrations/builtin/openproject/CnOpenprojectTab.vue +5 -6
  480. package/src/integrations/builtin/photos/CnPhotosCard.vue +2 -2
  481. package/src/integrations/builtin/photos/CnPhotosTab.vue +3 -4
  482. package/src/integrations/builtin/polls/CnPollsCard.vue +2 -2
  483. package/src/integrations/builtin/polls/CnPollsTab.vue +3 -4
  484. package/src/integrations/builtin/shares/CnSharesTab.vue +3 -6
  485. package/src/integrations/builtin/talk/CnTalkCard.vue +3 -2
  486. package/src/integrations/builtin/talk/CnTalkTab.vue +5 -6
  487. package/src/integrations/builtin/time-tracker/CnTimeTrackerCard.vue +2 -2
  488. package/src/integrations/builtin/time-tracker/CnTimeTrackerTab.vue +3 -4
  489. package/src/integrations/builtin/xwiki/CnXwikiCard.vue +4 -2
  490. package/src/integrations/builtin/xwiki/CnXwikiTab.vue +7 -7
  491. package/src/integrations/builtin/xwiki/__tests__/CnXwikiTab.spec.js +9 -0
  492. package/src/schemas/app-manifest-v2.schema.json +389 -1
  493. package/src/schemas/app-manifest.schema.json +2 -1
  494. package/src/utils/actionLink.js +5 -0
  495. package/src/utils/actionsDispatcher.js +15 -0
  496. package/src/utils/dateVariant.js +120 -0
  497. package/src/utils/detailActionModel.js +256 -0
  498. package/src/utils/dueRule.js +94 -0
  499. package/src/utils/fetchAggregate.js +36 -0
  500. package/src/utils/fetchFilterCounts.js +182 -0
  501. package/src/utils/index.js +1 -0
  502. package/src/utils/libraryWidgetKeys.js +5 -0
  503. package/src/utils/linkNavigation.js +6 -3
  504. package/src/utils/readPath.js +27 -0
  505. package/src/utils/rowAuxClick.js +29 -4
  506. package/src/utils/safeHref.js +18 -3
  507. package/src/utils/validateManifestV2.compiled.js +2 -2
@@ -83,11 +83,19 @@
83
83
  v-for="card in column.cards"
84
84
  :key="`card-${cardKey(card)}`"
85
85
  class="cn-board-view__card"
86
+ :class="dueState(card) ? `cn-board-view__card--${dueState(card)}` : null"
86
87
  role="listitem"
87
88
  data-testid="cn-board-card"
88
89
  :data-card-id="cardKey(card)"
89
90
  :draggable="canMove"
90
91
  @dragstart="onDragStart(card, column, $event)">
92
+ <span
93
+ v-if="dueLabel(card)"
94
+ class="cn-board-view__due"
95
+ :class="`cn-board-view__due--${dueState(card)}`"
96
+ data-testid="cn-board-due">
97
+ {{ dueLabel(card) }}
98
+ </span>
91
99
  <span
92
100
  v-for="field in cardFields"
93
101
  :key="`f-${cardKey(card)}-${field}`"
@@ -108,6 +116,7 @@
108
116
  :data-card-id="cardKey(card)"
109
117
  :aria-label="cardLabel(card, column)"
110
118
  @click="openCard(card, $event)"
119
+ @mousedown="preventMiddleClickAutoscroll"
111
120
  @auxclick="onCardAuxClick(card, $event)">
112
121
  {{ openLabel }}
113
122
  </button>
@@ -161,7 +170,8 @@ import { translate as t } from '@nextcloud/l10n'
161
170
  import { buildBoardColumns } from '../../utils/boardColumns.js'
162
171
  import { buildSwimlanes } from '../../utils/boardSwimlanes.js'
163
172
  import { DROP_OUTCOMES, runBoardDrop } from '../../utils/boardTransition.js'
164
- import { isRowMiddleClick } from '../../utils/rowAuxClick.js'
173
+ import { dueStateForRow } from '../../utils/dueRule.js'
174
+ import { isRowMiddleClick, preventMiddleClickAutoscroll } from '../../utils/rowAuxClick.js'
165
175
 
166
176
  /**
167
177
  * CnBoardView — the index page's rows as a board, one column per stage.
@@ -251,9 +261,25 @@ export default {
251
261
  type: Boolean,
252
262
  default: false,
253
263
  },
264
+
265
+ /**
266
+ * Marks late cards: `{ field, soonDays? }`. `field` is the dot-path to
267
+ * a card's due date. A date before today gets an error edge and the
268
+ * label "Overdue"; a date within `soonDays` (default 3) gets "Due
269
+ * soon" in the warning colour. `null` (the default) marks nothing.
270
+ *
271
+ * The same rule shape the table's date cell uses, so a list and its
272
+ * board agree on what late means.
273
+ *
274
+ * @type {{field: string, soonDays?: number}|null}
275
+ */
276
+ dueRule: {
277
+ type: Object,
278
+ default: null,
279
+ },
254
280
  },
255
281
 
256
- emits: ['card-click', 'moved', 'refused', 'stale'],
282
+ emits: ['card-click', 'card-aux-click', 'moved', 'refused', 'stale'],
257
283
 
258
284
  data() {
259
285
  return {
@@ -263,6 +289,8 @@ export default {
263
289
  refusal: '',
264
290
  /** The card being dragged, and where from. */
265
291
  dragging: null,
292
+ /** The day late marking measures from. */
293
+ today: new Date(),
266
294
  }
267
295
  },
268
296
 
@@ -333,6 +361,35 @@ export default {
333
361
  methods: {
334
362
  t,
335
363
 
364
+ preventMiddleClickAutoscroll,
365
+
366
+ /**
367
+ * A card's due state under `dueRule`.
368
+ *
369
+ * @param {object} card The card's row.
370
+ * @return {'overdue'|'soon'|'ok'|null} The state, or null when no rule applies.
371
+ * @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-late-marking-on-board-cards
372
+ */
373
+ dueState(card) {
374
+ return dueStateForRow(card, this.dueRule, this.today)
375
+ },
376
+
377
+ /**
378
+ * The words a late card carries. Colour alone would not reach a reader
379
+ * who cannot see it, or cannot tell red from amber.
380
+ *
381
+ * @param {object} card The card's row.
382
+ * @return {string} "Overdue", "Due soon", or '' for a card that is fine.
383
+ * @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-late-marking-on-board-cards
384
+ */
385
+ dueLabel(card) {
386
+ const state = this.dueState(card)
387
+ if (state === 'overdue') {
388
+ return t('nextcloud-vue', 'Overdue')
389
+ }
390
+ return state === 'soon' ? t('nextcloud-vue', 'Due soon') : ''
391
+ },
392
+
336
393
  /**
337
394
  * Open one card. The pointer and the keyboard both come through here,
338
395
  * so a reader on Enter reaches the same record as a reader on click.
@@ -343,13 +400,15 @@ export default {
343
400
  */
344
401
  openCard(card, event) {
345
402
  /**
346
- * @event card-click Emitted when a reader opens a card, by click, Enter or middle click. Payload: `(card, event)` — the card row and the native event, so the host can open it in a new tab on a ctrl/cmd/shift or middle click.
403
+ * @event card-click Emitted when a reader opens a card, by click or Enter. Payload: `(card, event)` — the card row and the native event, so the host can open it in a new tab on a ctrl/cmd/shift click. A middle click emits `card-aux-click` instead.
347
404
  */
348
405
  this.$emit('card-click', card, event)
349
406
  },
350
407
 
351
408
  /**
352
- * Middle click on a card's open button: open it like a click would.
409
+ * Middle click on a card's open button: emits `card-aux-click`, not
410
+ * `card-click`, so an existing listener that navigates never moves the
411
+ * current tab away.
353
412
  *
354
413
  * @param {object} card The card the reader picked.
355
414
  * @param {MouseEvent} event The auxclick event.
@@ -357,7 +416,10 @@ export default {
357
416
  */
358
417
  onCardAuxClick(card, event) {
359
418
  if (isRowMiddleClick(event)) {
360
- this.openCard(card, event)
419
+ /**
420
+ * @event card-aux-click Emitted when a reader middle-clicks a card, for opening it in a new tab (see `openRowTarget`). Payload: `(card, event)` — the card row and the native auxclick event.
421
+ */
422
+ this.$emit('card-aux-click', card, event)
361
423
  }
362
424
  },
363
425
 
@@ -553,6 +615,29 @@ export default {
553
615
  display: block;
554
616
  }
555
617
 
618
+ /* A late card: an edge in the error colour, drawn as an inset shadow so the
619
+ card keeps its size and its rounded corners. The label below carries the
620
+ meaning; the edge only helps a sighted reader find it. */
621
+ .cn-board-view__card--overdue {
622
+ border-color: var(--color-error);
623
+ box-shadow: inset 3px 0 0 var(--color-error);
624
+ }
625
+
626
+ .cn-board-view__due {
627
+ display: block;
628
+ font-size: 0.85em;
629
+ font-weight: 700;
630
+ }
631
+
632
+ .cn-board-view__due--overdue {
633
+ color: var(--color-error-text, var(--color-error));
634
+ }
635
+
636
+ .cn-board-view__due--soon {
637
+ color: var(--color-warning-text, var(--color-main-text));
638
+ font-weight: 600;
639
+ }
640
+
556
641
  /*
557
642
  * The card's opening control. The cursor and the focus ring live here now,
558
643
  * on the thing that actually does something, rather than on the box.
@@ -0,0 +1,22 @@
1
+ The brand stripe of the organisation. A theme sets its colours, shares and height through the `--cn-brand-stripe-*` custom properties. Without a theme it is one band in the primary colour.
2
+
3
+ ```vue
4
+ <CnBrandStripe />
5
+ ```
6
+
7
+ With the properties a theme would set:
8
+
9
+ ```vue
10
+ <div style="--cn-brand-stripe-color-1: #cc0000; --cn-brand-stripe-color-2: #3669a5; --cn-brand-stripe-color-3: #cc0000; --cn-brand-stripe-ratio-1: 6; --cn-brand-stripe-ratio-2: 3; --cn-brand-stripe-ratio-3: 1; --cn-brand-stripe-height: 5px">
11
+ <CnBrandStripe />
12
+ </div>
13
+ ```
14
+
15
+ Down the side of a panel, with `orientation="vertical"`:
16
+
17
+ ```vue
18
+ <div style="display: flex; height: 80px; gap: 12px;">
19
+ <CnBrandStripe orientation="vertical" />
20
+ <span>Content beside the stripe</span>
21
+ </div>
22
+ ```
@@ -0,0 +1,100 @@
1
+ <!--
2
+ SPDX-FileCopyrightText: 2026 Conduction B.V.
3
+ SPDX-License-Identifier: EUPL-1.2
4
+ -->
5
+ <template>
6
+ <div
7
+ class="cn-brand-stripe"
8
+ :class="{ 'cn-brand-stripe--vertical': orientation === 'vertical' }"
9
+ aria-hidden="true"
10
+ data-testid="cn-brand-stripe">
11
+ <span class="cn-brand-stripe__band cn-brand-stripe__band--1" />
12
+ <span class="cn-brand-stripe__band cn-brand-stripe__band--2" />
13
+ <span class="cn-brand-stripe__band cn-brand-stripe__band--3" />
14
+ </div>
15
+ </template>
16
+
17
+ <script>
18
+ /**
19
+ * CnBrandStripe draws the organisation's brand stripe: up to three coloured
20
+ * bands next to each other, for the top of a page, a card or a sidebar.
21
+ *
22
+ * The theme decides what it looks like, through the library's own custom
23
+ * properties: `--cn-brand-stripe-color-1/2/3` (the colours, start to end),
24
+ * `--cn-brand-stripe-ratio-1/2/3` (unitless shares, such as 6, 3 and 1)
25
+ * and `--cn-brand-stripe-height` (such as 5px). A theming app maps its own
26
+ * tokens onto these; the library never reads a theme's tokens. Without them the
27
+ * stripe is one band in the Nextcloud primary colour, 4px high.
28
+ *
29
+ * The stripe is decoration: it carries no meaning and is hidden from
30
+ * assistive technology.
31
+ *
32
+ * ```vue
33
+ * <CnBrandStripe />
34
+ * ```
35
+ */
36
+ export default {
37
+ name: 'CnBrandStripe',
38
+
39
+ props: {
40
+ /**
41
+ * The direction the stripe runs in: `horizontal` (the default, a bar
42
+ * across the top) or `vertical` (a bar down the side; the height
43
+ * token then sets its width).
44
+ *
45
+ * @type {'horizontal'|'vertical'}
46
+ */
47
+ orientation: {
48
+ type: String,
49
+ default: 'horizontal',
50
+ validator: (v) => ['horizontal', 'vertical'].includes(v),
51
+ },
52
+ },
53
+ }
54
+ </script>
55
+
56
+ <!--
57
+ The stripe reads the library's own `--cn-brand-stripe-*` properties, each
58
+ with a Nextcloud fallback. A theming app sets them from its own tokens.
59
+ -->
60
+ <style scoped>
61
+ .cn-brand-stripe {
62
+ display: flex;
63
+ flex: none;
64
+ width: 100%;
65
+ height: var(--cn-brand-stripe-height, 4px);
66
+ }
67
+
68
+ .cn-brand-stripe--vertical {
69
+ flex-direction: column;
70
+ width: var(--cn-brand-stripe-height, 4px);
71
+ height: 100%;
72
+ }
73
+
74
+ .cn-brand-stripe__band {
75
+ flex-basis: 0;
76
+ flex-shrink: 1;
77
+ }
78
+
79
+ .cn-brand-stripe__band--1 {
80
+ flex-grow: var(--cn-brand-stripe-ratio-1, 1);
81
+ background-color: var(--cn-brand-stripe-color-1, var(--color-primary-element));
82
+ }
83
+
84
+ .cn-brand-stripe__band--2 {
85
+ flex-grow: var(--cn-brand-stripe-ratio-2, 1);
86
+ background-color: var(--cn-brand-stripe-color-2, var(--color-primary-element));
87
+ }
88
+
89
+ .cn-brand-stripe__band--3 {
90
+ flex-grow: var(--cn-brand-stripe-ratio-3, 1);
91
+ background-color: var(--cn-brand-stripe-color-3, var(--color-primary-element));
92
+ }
93
+
94
+ @media print {
95
+ .cn-brand-stripe {
96
+ print-color-adjust: exact;
97
+ -webkit-print-color-adjust: exact;
98
+ }
99
+ }
100
+ </style>
@@ -0,0 +1,4 @@
1
+ import CnBrandStripe from './CnBrandStripe.vue'
2
+
3
+ export default CnBrandStripe
4
+ export { CnBrandStripe }
@@ -149,7 +149,7 @@ export default {
149
149
  },
150
150
  },
151
151
 
152
- emits: ['click', 'select'],
152
+ emits: ['click', 'select', 'aux-click'],
153
153
 
154
154
  computed: {
155
155
  /**
@@ -184,6 +184,14 @@ export default {
184
184
  const listeners = { select: () => this.toggleSelect(object) }
185
185
  if (!this.selectable || this.clickToView) {
186
186
  listeners.click = (_card, event) => this.$emit('click', object, event)
187
+ // A middle click, kept off `click` so a navigating listener stays put.
188
+ listeners['aux-click'] = (_card, event) => {
189
+ /**
190
+ * @event aux-click Emitted when a navigating card is middle-clicked, for opening it in a new tab (see `openRowTarget`). Payload: `(object, event)` — the card's object and the native auxclick event.
191
+ * @type {object} The card's object.
192
+ */
193
+ this.$emit('aux-click', object, event)
194
+ }
187
195
  }
188
196
  return listeners
189
197
  },
@@ -55,6 +55,43 @@
55
55
  <span v-else :title="rawTitle">{{ formattedValue }}</span>
56
56
  </template>
57
57
 
58
+ <!-- Built-in "avatar" widget: a person as an avatar with the name beside
59
+ it. A user id (widgetProps.userField, or widgetProps.user for a cell
60
+ that holds the id itself) gets the Nextcloud avatar; a free name
61
+ gets its initials. The picture is decoration: the name is the text. -->
62
+ <template v-else-if="widget === 'avatar'">
63
+ <span v-if="avatarName || avatarUserId" class="cn-cell-renderer__avatar">
64
+ <span v-if="avatarUserId" class="cn-cell-renderer__avatar-picture" aria-hidden="true">
65
+ <NcAvatar
66
+ :user="avatarUserId"
67
+ :displayName="avatarName || avatarUserId"
68
+ :size="avatarSize"
69
+ :disableMenu="true"
70
+ :disableTooltip="true" />
71
+ </span>
72
+ <span
73
+ v-else
74
+ class="cn-cell-renderer__avatar-initials"
75
+ :style="{ width: avatarSize + 'px', height: avatarSize + 'px' }"
76
+ aria-hidden="true">{{ avatarInitials }}</span>
77
+ <span class="cn-cell-renderer__avatar-name" :title="avatarName || avatarUserId">{{ avatarName || avatarUserId }}</span>
78
+ </span>
79
+ <span v-else class="cn-cell-renderer__dash">—</span>
80
+ </template>
81
+
82
+ <!-- Built-in "date" widget: a date whose colour follows
83
+ widgetProps.variantWhen, rules on the number of days until it
84
+ (0 = today, negative = overdue). -->
85
+ <template v-else-if="widget === 'date'">
86
+ <time
87
+ v-if="dateTimestamp"
88
+ class="cn-cell-renderer__date"
89
+ :class="dateVariant ? 'cn-cell-renderer__date--' + dateVariant : null"
90
+ :datetime="dateTimestamp.toISOString()"
91
+ :title="rawTitle">{{ dateLabel }}</time>
92
+ <span v-else class="cn-cell-renderer__dash">—</span>
93
+ </template>
94
+
58
95
  <!-- Explicit column formatter — overrides the type-aware paths below -->
59
96
  <template v-else-if="hasFormatter">
60
97
  <span :title="rawTitle">{{ formattedValue }}</span>
@@ -129,10 +166,13 @@
129
166
  </template>
130
167
 
131
168
  <script>
132
- import { NcDateTime } from '@nextcloud/vue'
169
+ import { getCanonicalLocale } from '@nextcloud/l10n'
170
+ import { NcAvatar, NcDateTime } from '@nextcloud/vue'
133
171
  import CheckBold from 'vue-material-design-icons/CheckBold.vue'
134
172
  import CnFkResolveCell from '../CnFkResolveCell/CnFkResolveCell.vue'
173
+ import { parseDateValue, resolveDateVariant } from '../../utils/dateVariant.js'
135
174
  import { safeCurrencyCode } from '../../utils/formatMetric.js'
175
+ import { objectFieldValue } from '../../utils/objectName.js'
136
176
  import { safeHref } from '../../utils/safeHref.js'
137
177
  import { formatValue } from '../../utils/schema.js'
138
178
  import { CnStatusBadge } from '../CnStatusBadge/index.js'
@@ -162,6 +202,7 @@ export default {
162
202
  CnStatusBadge,
163
203
  CnFkResolveCell,
164
204
  CheckBold,
205
+ NcAvatar,
165
206
  NcDateTime,
166
207
  },
167
208
 
@@ -232,6 +273,12 @@ export default {
232
273
  * the built-in id `"badge"` renders `CnStatusBadge` and the built-in
233
274
  * id `"fkResolve"` renders `CnFkResolveCell` (uuid → related object
234
275
  * label, config via `widgetProps { register, schema, labelField }`).
276
+ * The built-in id `"avatar"` renders a person as an avatar with the
277
+ * name beside it (`widgetProps { userField?, user?, nameField?, size? }`;
278
+ * a free name gets its initials), and the built-in id `"date"` renders
279
+ * a date whose colour follows `widgetProps.variantWhen`, rules on the
280
+ * number of days until the date (`[{ op: "lt", value: 0, variant:
281
+ * "error" }, { op: "lte", value: 5, variant: "warning" }]`).
235
282
  * Takes precedence over `formatter`/the type-aware rendering, but the
236
283
  * value handed to the widget is the formatter-shaped `formatted` when
237
284
  * `formatter` is also set.
@@ -350,6 +397,112 @@ export default {
350
397
  return Number.isNaN(date.getTime()) ? null : date
351
398
  },
352
399
 
400
+ /**
401
+ * `avatar` widget: the Nextcloud user id whose avatar to show, or ''
402
+ * for a free name. Read from the row field `widgetProps.userField`,
403
+ * or from the cell value itself when `widgetProps.user` is true.
404
+ *
405
+ * @return {string}
406
+ * @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-avatar-and-date-cells
407
+ */
408
+ avatarUserId() {
409
+ const props = this.widgetProps || {}
410
+ let id = ''
411
+ if (typeof props.userField === 'string' && props.userField !== '') {
412
+ id = objectFieldValue(this.row, props.userField)
413
+ } else if (props.user === true) {
414
+ id = this.value
415
+ }
416
+ return (typeof id === 'string' || typeof id === 'number') ? String(id) : ''
417
+ },
418
+
419
+ /**
420
+ * `avatar` widget: the name shown beside the picture. Read from the
421
+ * row field `widgetProps.nameField` when set, else the cell value.
422
+ *
423
+ * @return {string}
424
+ * @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-avatar-and-date-cells
425
+ */
426
+ avatarName() {
427
+ const props = this.widgetProps || {}
428
+ if (typeof props.nameField === 'string' && props.nameField !== '') {
429
+ const name = objectFieldValue(this.row, props.nameField)
430
+ if (typeof name === 'string' && name !== '') {
431
+ return name
432
+ }
433
+ }
434
+ if (!this.hasValue || typeof this.value === 'object') {
435
+ return ''
436
+ }
437
+ return String(this.hasFormatter ? this.formattedValue : this.value)
438
+ },
439
+
440
+ /**
441
+ * `avatar` widget: the initials of a free name, at most two letters
442
+ * (first and last word).
443
+ *
444
+ * @return {string}
445
+ * @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-avatar-and-date-cells
446
+ */
447
+ avatarInitials() {
448
+ const words = this.avatarName.trim().split(/\s+/).filter((word) => word !== '')
449
+ if (words.length === 0) {
450
+ return ''
451
+ }
452
+ const first = Array.from(words[0])[0] || ''
453
+ const last = words.length > 1 ? (Array.from(words[words.length - 1])[0] || '') : ''
454
+ return (first + last).toLocaleUpperCase()
455
+ },
456
+
457
+ /**
458
+ * `avatar` widget: the picture size in pixels (`widgetProps.size`, default 24).
459
+ *
460
+ * @return {number}
461
+ * @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-avatar-and-date-cells
462
+ */
463
+ avatarSize() {
464
+ const size = Number(this.widgetProps && this.widgetProps.size)
465
+ return Number.isFinite(size) && size > 0 ? size : 24
466
+ },
467
+
468
+ /**
469
+ * `date` widget: the variant of the first `widgetProps.variantWhen`
470
+ * rule the date matches, or '' for none.
471
+ *
472
+ * @return {string}
473
+ * @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-avatar-and-date-cells
474
+ */
475
+ dateVariant() {
476
+ const rules = this.widgetProps && this.widgetProps.variantWhen
477
+ const variant = resolveDateVariant(this.value, rules)
478
+ return variant === 'default' ? '' : variant
479
+ },
480
+
481
+ /**
482
+ * `date` widget: the date written out in the user's locale.
483
+ *
484
+ * @return {string}
485
+ * @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-avatar-and-date-cells
486
+ */
487
+ dateLabel() {
488
+ const date = parseDateValue(this.value)
489
+ if (date === null) {
490
+ return ''
491
+ }
492
+ const options = { day: 'numeric', month: 'short', year: 'numeric' }
493
+ let locale
494
+ try {
495
+ locale = getCanonicalLocale()
496
+ } catch {
497
+ locale = undefined
498
+ }
499
+ try {
500
+ return new Intl.DateTimeFormat(locale || undefined, options).format(date)
501
+ } catch {
502
+ return new Intl.DateTimeFormat(undefined, options).format(date)
503
+ }
504
+ },
505
+
353
506
  /** True when the property is a URI / URL (rendered as an external link). */
354
507
  isUri() {
355
508
  return this.property?.format === 'uri' || this.property?.format === 'url'
@@ -750,6 +903,59 @@ export default {
750
903
  color: var(--color-text-maxcontrast);
751
904
  }
752
905
 
906
+ .cn-cell-renderer__avatar {
907
+ display: inline-flex;
908
+ align-items: center;
909
+ gap: 8px;
910
+ max-width: 100%;
911
+ vertical-align: middle;
912
+ }
913
+
914
+ .cn-cell-renderer__avatar-picture {
915
+ display: inline-flex;
916
+ flex: none;
917
+ }
918
+
919
+ .cn-cell-renderer__avatar-initials {
920
+ display: inline-flex;
921
+ flex: none;
922
+ align-items: center;
923
+ justify-content: center;
924
+ border-radius: 50%;
925
+ background-color: var(--color-primary-element-light);
926
+ color: var(--color-primary-element-light-text);
927
+ font-size: 0.75em;
928
+ font-weight: 700;
929
+ line-height: 1;
930
+ }
931
+
932
+ .cn-cell-renderer__avatar-name {
933
+ min-width: 0;
934
+ overflow: hidden;
935
+ text-overflow: ellipsis;
936
+ white-space: nowrap;
937
+ }
938
+
939
+ /* A date that matched a rule is also set in a heavier weight, so the signal
940
+ does not rest on colour alone. */
941
+ .cn-cell-renderer__date--success,
942
+ .cn-cell-renderer__date--warning,
943
+ .cn-cell-renderer__date--error {
944
+ font-weight: 600;
945
+ }
946
+
947
+ .cn-cell-renderer__date--success {
948
+ color: var(--color-text-success, var(--color-success-text));
949
+ }
950
+
951
+ .cn-cell-renderer__date--warning {
952
+ color: var(--color-text-warning, var(--color-warning-text));
953
+ }
954
+
955
+ .cn-cell-renderer__date--error {
956
+ color: var(--color-text-error, var(--color-error-text));
957
+ }
958
+
753
959
  .cn-cell-renderer__icon--success {
754
960
  color: var(--color-success);
755
961
  }
@@ -94,6 +94,7 @@
94
94
  import { NcActionButton, NcActionLink, NcActions } from '@nextcloud/vue'
95
95
  import { CTX_MENU_DATA_ATTR, CTX_MENU_POPPER_ATTR } from '../../composables/useContextMenu.js'
96
96
  import { followItemActionLink, resolveItemActionLink } from '../../utils/actionLink.js'
97
+ import { isModifiedClick } from '../../utils/linkNavigation.js'
97
98
  import { CnIcon } from '../CnIcon/index.js'
98
99
 
99
100
  /**
@@ -493,13 +494,17 @@ export default {
493
494
  /**
494
495
  * A link entry was clicked: route a plain in-app click, leave the rest to
495
496
  * the browser, and emit `action` as a button would. The `handler` is not
496
- * called, since navigating is what the link already does.
497
+ * called, since navigating is what the link already does. A modified
498
+ * click opens a new tab, so nothing is emitted in this one.
497
499
  *
498
500
  * @param {object} action The action descriptor.
499
501
  * @param {object} link The resolved link.
500
502
  * @param {MouseEvent} event The click event.
501
503
  */
502
504
  onLinkAction(action, link, event) {
505
+ if (isModifiedClick(event)) {
506
+ return
507
+ }
503
508
  followItemActionLink(event, link, this.$router)
504
509
  this.$emit('action', { action: action.label, row: this.targetItem })
505
510
  },
@@ -0,0 +1,51 @@
1
+ A thread with a reply box:
2
+
3
+ ```vue
4
+ <CnConversationThread
5
+ title="Contact with the resident"
6
+ reply-label="Answer to the resident"
7
+ :messages="[
8
+ { id: 1, author: 'Sanne de Vries', time: '2026-10-04T10:52:00', side: 'them',
9
+ text: 'Thank you. I would like to see all documents about the lighting.' },
10
+ { id: 2, time: '2026-10-04T10:24:00', side: 'us',
11
+ text: 'Construction starts in March. There will be lighting along the whole cycle path.' },
12
+ ]" />
13
+ ```
14
+
15
+ Read-only, for a closed record:
16
+
17
+ ```vue
18
+ <CnConversationThread
19
+ title="Contact"
20
+ :allow-reply="false"
21
+ :messages="[
22
+ { id: 1, author: 'Sanne de Vries', time: '4 Oct, 10:52', side: 'them', text: 'Thank you.' },
23
+ ]" />
24
+ ```
25
+
26
+ No messages yet:
27
+
28
+ ```vue
29
+ <CnConversationThread title="Contact" :messages="[]" />
30
+ ```
31
+
32
+ Posting to an endpoint. The reply goes out as `{ message, ...payload }`. `title-tag`, `placeholder`, `send-label`, `us-label` and `empty-text` adjust the wording, and the `reply-actions` slot adds buttons before Send:
33
+
34
+ ```vue
35
+ <CnConversationThread
36
+ title="Contact"
37
+ title-tag="h2"
38
+ placeholder="Write your answer"
39
+ send-label="Send to resident"
40
+ us-label="Municipality"
41
+ empty-text="Nobody has written yet."
42
+ endpoint="/apps/example/api/cases/42/messages"
43
+ :payload="{ channel: 'portal' }"
44
+ :messages="[
45
+ { id: 1, time: '2026-10-04T11:00:00', side: 'us', text: 'We received your request.' },
46
+ ]">
47
+ <template #reply-actions="{ draft }">
48
+ <NcButton :disabled="!draft">Save draft</NcButton>
49
+ </template>
50
+ </CnConversationThread>
51
+ ```