@conduction/nextcloud-vue 2.79.0 → 2.80.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. package/dist/esm/components/CnActionButtons/CnActionButtons.vue2.js.map +1 -1
  2. package/dist/esm/components/CnActionButtons/CnActionButtons.vue3.js +3 -1
  3. package/dist/esm/components/CnActionButtons/CnActionButtons.vue3.js.map +1 -1
  4. package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js +32 -3
  5. package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js.map +1 -1
  6. package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js +10 -8
  7. package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js.map +1 -1
  8. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js +39 -3
  9. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js.map +1 -1
  10. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js.map +1 -1
  11. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +79 -1
  12. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
  13. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js +133 -96
  14. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
  15. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
  16. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +1 -0
  17. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
  18. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +62 -4
  19. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  20. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  21. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js +24 -0
  22. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -1
  23. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js +43 -4
  24. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js.map +1 -1
  25. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js +11 -0
  26. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js.map +1 -0
  27. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js +736 -0
  28. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -0
  29. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js +238 -0
  30. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -0
  31. package/dist/esm/components/CnFactsWidget/index.js +30 -0
  32. package/dist/esm/components/CnFactsWidget/index.js.map +1 -0
  33. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue.js +10 -0
  34. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue.js.map +1 -0
  35. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js +551 -0
  36. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js.map +1 -0
  37. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js +183 -0
  38. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js.map +1 -0
  39. package/dist/esm/components/CnFieldListWidget/index.js +29 -0
  40. package/dist/esm/components/CnFieldListWidget/index.js.map +1 -0
  41. package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js +65 -17
  42. package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js.map +1 -1
  43. package/dist/esm/components/CnFormDialog/CnFormDialog.vue3.js +4 -4
  44. package/dist/esm/components/CnFormDialog/CnFormDialog.vue3.js.map +1 -1
  45. package/dist/esm/components/CnFormPage/CnFormPage.vue2.js +18 -3
  46. package/dist/esm/components/CnFormPage/CnFormPage.vue2.js.map +1 -1
  47. package/dist/esm/components/CnFormPage/CnFormPage.vue3.js.map +1 -1
  48. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +305 -72
  49. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  50. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +31 -13
  51. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  52. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue.js +10 -0
  53. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue.js.map +1 -0
  54. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue2.js +99 -0
  55. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue2.js.map +1 -0
  56. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue3.js +48 -0
  57. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue3.js.map +1 -0
  58. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue2.js +29 -1
  59. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue2.js.map +1 -1
  60. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue3.js.map +1 -1
  61. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +10 -0
  62. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js.map +1 -0
  63. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +387 -0
  64. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -0
  65. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js +169 -0
  66. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -0
  67. package/dist/esm/components/CnRecordListWidget/index.js +31 -0
  68. package/dist/esm/components/CnRecordListWidget/index.js.map +1 -0
  69. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue.js +10 -0
  70. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue.js.map +1 -0
  71. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue2.js +351 -0
  72. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue2.js.map +1 -0
  73. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue3.js +71 -0
  74. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue3.js.map +1 -0
  75. package/dist/esm/components/CnSectionsWidget/index.js +35 -0
  76. package/dist/esm/components/CnSectionsWidget/index.js.map +1 -0
  77. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js +81 -2
  78. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js.map +1 -1
  79. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue3.js.map +1 -1
  80. package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js.map +1 -1
  81. package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js +1 -0
  82. package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js.map +1 -1
  83. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +122 -7
  84. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
  85. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js +84 -23
  86. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
  87. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js +4 -0
  88. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js.map +1 -1
  89. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue2.js +106 -2
  90. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue2.js.map +1 -1
  91. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue3.js +105 -53
  92. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue3.js.map +1 -1
  93. package/dist/esm/composables/useFormDraft.js +140 -9
  94. package/dist/esm/composables/useFormDraft.js.map +1 -1
  95. package/dist/esm/index.js +4 -0
  96. package/dist/esm/index.js.map +1 -1
  97. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue2.js +28 -20
  98. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue2.js.map +1 -1
  99. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue3.js +9 -0
  100. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue3.js.map +1 -1
  101. package/dist/esm/integrations/builtin/field-inspection.js +21 -0
  102. package/dist/esm/integrations/builtin/field-inspection.js.map +1 -1
  103. package/dist/esm/integrations/offline/checklistSubmission.js +141 -0
  104. package/dist/esm/integrations/offline/checklistSubmission.js.map +1 -0
  105. package/dist/esm/integrations/offline/fieldCollectionHelpers.js +70 -5
  106. package/dist/esm/integrations/offline/fieldCollectionHelpers.js.map +1 -1
  107. package/dist/esm/integrations/offline/index.js +2 -1
  108. package/dist/esm/integrations/offline/index.js.map +1 -1
  109. package/dist/esm/integrations/offline/offlineDb.js +6 -1
  110. package/dist/esm/integrations/offline/offlineDb.js.map +1 -1
  111. package/dist/esm/integrations/offline/syncReplayService.js +8 -2
  112. package/dist/esm/integrations/offline/syncReplayService.js.map +1 -1
  113. package/dist/esm/l10n/en.json.js +12 -1
  114. package/dist/esm/l10n/en.json.js.map +1 -1
  115. package/dist/esm/l10n/nl.json.js +16 -2
  116. package/dist/esm/l10n/nl.json.js.map +1 -1
  117. package/dist/esm/nextcloud-vue.css +1000 -59
  118. package/dist/esm/utils/detailActionModel.js +60 -3
  119. package/dist/esm/utils/detailActionModel.js.map +1 -1
  120. package/dist/esm/utils/fillTemplate.js +114 -0
  121. package/dist/esm/utils/fillTemplate.js.map +1 -0
  122. package/dist/esm/utils/libraryWidgetKeys.js +4 -0
  123. package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
  124. package/dist/esm/utils/queryPresets.js +96 -0
  125. package/dist/esm/utils/queryPresets.js.map +1 -0
  126. package/dist/esm/utils/resolveFilterTokens.js +11 -0
  127. package/dist/esm/utils/resolveFilterTokens.js.map +1 -1
  128. package/dist/esm/utils/schema.js +21 -0
  129. package/dist/esm/utils/schema.js.map +1 -1
  130. package/dist/esm/utils/sentinelTokens.js +3 -3
  131. package/dist/esm/utils/sentinelTokens.js.map +1 -1
  132. package/dist/esm/utils/validateManifestV2.compiled.js +3 -3
  133. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  134. package/dist/esm/utils/widgetDispatch.js +7 -1
  135. package/dist/esm/utils/widgetDispatch.js.map +1 -1
  136. package/dist/nextcloud-vue.cjs.js +12368 -7717
  137. package/dist/nextcloud-vue.cjs.js.map +2 -2
  138. package/dist/nextcloud-vue.css +1000 -59
  139. package/l10n/en.json +12 -1
  140. package/l10n/nl.json +16 -2
  141. package/package.json +1 -1
  142. package/src/components/CnActionButtons/CnActionButtons.vue +2 -0
  143. package/src/components/CnActionsBar/CnActionsBar.md +4 -0
  144. package/src/components/CnActionsBar/CnActionsBar.vue +42 -10
  145. package/src/components/CnBannerWidget/CnBannerWidget.vue +39 -3
  146. package/src/components/CnCellRenderer/CnCellRenderer.vue +188 -1
  147. package/src/components/CnDataTable/CnDataTable.vue +1 -0
  148. package/src/components/CnDetailPage/CnDetailPage.md +1 -1
  149. package/src/components/CnDetailPage/CnDetailPage.vue +63 -3
  150. package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +66 -0
  151. package/src/components/CnFactsWidget/CnFactsWidget.vue +1050 -0
  152. package/src/components/CnFactsWidget/index.js +29 -0
  153. package/src/components/CnFieldListWidget/CnFieldListWidget.vue +746 -0
  154. package/src/components/CnFieldListWidget/index.js +28 -0
  155. package/src/components/CnFormDialog/CnFormDialog.md +9 -3
  156. package/src/components/CnFormDialog/CnFormDialog.vue +69 -21
  157. package/src/components/CnFormPage/CnFormPage.vue +18 -3
  158. package/src/components/CnIndexPage/CnIndexPage.vue +254 -6
  159. package/src/components/CnIndexPage/CnIndexPageWidgets.vue +169 -0
  160. package/src/components/CnPageRenderer/CnPageRenderer.vue +29 -1
  161. package/src/components/CnRecordListWidget/CnRecordListWidget.vue +603 -0
  162. package/src/components/CnRecordListWidget/index.js +30 -0
  163. package/src/components/CnSectionsWidget/CnSectionsWidget.vue +489 -0
  164. package/src/components/CnSectionsWidget/index.js +34 -0
  165. package/src/components/CnStagesWidget/CnStagesWidget.vue +81 -2
  166. package/src/components/CnStatWidget/CnStatWidget.vue +1 -1
  167. package/src/components/CnTabsWidget/CnTabsWidget.vue +184 -8
  168. package/src/components/CnWidgetGrid/registerDashboardWidgets.js +4 -0
  169. package/src/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue +188 -4
  170. package/src/components/index.js +4 -0
  171. package/src/composables/__tests__/useFormDraft.spec.js +69 -0
  172. package/src/composables/useFormDraft.js +139 -8
  173. package/src/css/form-field.css +14 -0
  174. package/src/css/index-page.css +71 -0
  175. package/src/css/kpi-card.css +32 -0
  176. package/src/css/look-board-detail.css +77 -0
  177. package/src/css/look-board-index.css +51 -0
  178. package/src/css/look-board.css +37 -2
  179. package/src/css/table.css +19 -0
  180. package/src/index.js +4 -0
  181. package/src/integrations/builtin/field-inspection/CnFieldInspectionCard.vue +35 -20
  182. package/src/integrations/builtin/field-inspection.js +21 -0
  183. package/src/integrations/offline/checklistSubmission.js +137 -0
  184. package/src/integrations/offline/fieldCollectionHelpers.js +69 -4
  185. package/src/integrations/offline/index.js +3 -0
  186. package/src/integrations/offline/offlineDb.js +6 -1
  187. package/src/integrations/offline/syncReplayService.js +8 -2
  188. package/src/schemas/app-manifest-v2.schema.json +104 -5
  189. package/src/utils/detailActionModel.js +59 -2
  190. package/src/utils/fillTemplate.js +110 -0
  191. package/src/utils/libraryWidgetKeys.js +4 -0
  192. package/src/utils/queryPresets.js +93 -0
  193. package/src/utils/resolveFilterTokens.js +11 -0
  194. package/src/utils/schema.js +21 -0
  195. package/src/utils/sentinelTokens.js +3 -3
  196. package/src/utils/validateManifestV2.compiled.js +3 -3
  197. package/src/utils/widgetDispatch.js +7 -1
@@ -1 +1 @@
1
- {"version":3,"file":"CnActionsBar.vue3.js","sources":["../../../../src/components/CnActionsBar/CnActionsBar.vue?vue&type=template&id=4880abef&lang.js"],"sourcesContent":["<template>\n\t<div\n\t\tclass=\"cn-actions-bar\"\n\t\t:class=\"{ 'cn-actions-bar--board': isBoardLayout }\"\n\t\tdata-testid=\"cn-actions-bar\"\n\t\tv-bind=\"$attrs\">\n\t\t<!--\n\t\t\tBoard look, row 1, in the order it is read and drawn: the quick-filter\n\t\t\tchips, the saved-view chips and Save view, the Filter button and the\n\t\t\tview switch. The act controls (sort, add, menus) follow in the\n\t\t\tcluster below; row 2 (search and the active filters) comes last.\n\t\t-->\n\t\t<div v-if=\"isBoardLayout\" class=\"cn-actions-bar__row cn-actions-bar__row--views\" data-testid=\"cn-actions-bar-row-views\">\n\t\t\t<!-- @slot filters Inline filter controls (chips) at the start of the board look's row 1. -->\n\t\t\t<slot name=\"filters\" />\n\t\t\t<!--\n\t\t\t\t@slot actions-end\n\t\t\t\t@description Under the board look: saved views as chips and the Save view button, in row 1 after the quick-filter chips.\n\t\t\t-->\n\t\t\t<slot name=\"actions-end\" />\n\t\t\t<!--\n\t\t\t\tFilter and the view switch are one unit: when row 1 is full they\n\t\t\t\twrap together to the start of the next line (the DqZaken board),\n\t\t\t\tnever the switch alone.\n\t\t\t-->\n\t\t\t<div v-if=\"showSidebarToggle || (showViewToggle && viewSegments.length > 1)\"\n\t\t\t\tclass=\"cn-actions-bar__view-controls\"\n\t\t\t\tdata-testid=\"cn-actions-bar-view-controls\">\n\t\t\t\t<NcButton v-if=\"showSidebarToggle\"\n\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\tclass=\"cn-actions-bar__filter-button\"\n\t\t\t\t\tdata-testid=\"cn-actions-bar-filter-button\"\n\t\t\t\t\t:pressed=\"sidebarOpen\"\n\t\t\t\t\t@click=\"$emit('toggle-sidebar')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<Tune :size=\"16\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('nextcloud-vue', 'Filter') }}\n\t\t\t\t\t<span\n\t\t\t\t\t\tv-if=\"filterCount > 0\"\n\t\t\t\t\t\tclass=\"cn-actions-bar__filter-badge\"\n\t\t\t\t\t\tdata-testid=\"cn-actions-bar-filter-badge\"\n\t\t\t\t\t\t:aria-label=\"filterCountLabel\">{{ filterCount }}</span>\n\t\t\t\t</NcButton>\n\t\t\t\t<div v-if=\"showViewToggle && viewSegments.length > 1\"\n\t\t\t\t\tclass=\"cn-actions-bar__view-toggle\"\n\t\t\t\t\trole=\"group\"\n\t\t\t\t\t:aria-label=\"t('nextcloud-vue', 'View')\">\n\t\t\t\t\t<button\n\t\t\t\t\t\tv-for=\"seg in viewSegments\"\n\t\t\t\t\t\t:key=\"seg.mode\"\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-btn\"\n\t\t\t\t\t\t:class=\"{ 'cn-actions-bar__view-toggle-btn--active': viewMode === seg.mode }\"\n\t\t\t\t\t\t:aria-pressed=\"viewMode === seg.mode\"\n\t\t\t\t\t\t:aria-label=\"seg.label\"\n\t\t\t\t\t\t:title=\"seg.label\"\n\t\t\t\t\t\t@click=\"$emit('view-mode-change', seg.mode)\">\n\t\t\t\t\t\t<CnIcon v-if=\"seg.icon\"\n\t\t\t\t\t\t\t:name=\"seg.icon\"\n\t\t\t\t\t\t\t:size=\"24\"\n\t\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-icon\" />\n\t\t\t\t\t\t<component :is=\"seg.fallback\"\n\t\t\t\t\t\t\tv-else\n\t\t\t\t\t\t\t:size=\"24\"\n\t\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-icon\" />\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div v-if=\"!isBoardLayout\" class=\"cn-actions-bar__info\">\n\t\t\t<!-- Inline search field (opt-in) -->\n\t\t\t<div v-if=\"showSearch\" class=\"cn-actions-bar__search\">\n\t\t\t\t<Magnify :size=\"18\" class=\"cn-actions-bar__search-icon\" />\n\t\t\t\t<input\n\t\t\t\t\ttype=\"search\"\n\t\t\t\t\tclass=\"cn-actions-bar__search-input\"\n\t\t\t\t\t:placeholder=\"searchPlaceholder || t('nextcloud-vue', 'Search…')\"\n\t\t\t\t\t:value=\"searchValue\"\n\t\t\t\t\t:aria-label=\"searchPlaceholder || t('nextcloud-vue', 'Search')\"\n\t\t\t\t\t@input=\"onSearchInput\">\n\t\t\t</div>\n\t\t\t<span v-else-if=\"showCount && hasTotal\" class=\"cn-actions-bar__count\">\n\t\t\t\t{{ countText }}\n\t\t\t</span>\n\t\t\t<!-- @slot after-search Refinement controls rendered beside the search field on the LEFT side of the bar (e.g. a filter menu button). Convention: the left side groups the VISUAL controls — search, filters, view toggle — while the right cluster holds the ACT controls (add, overflow); the standalone sort select is a display control too but keeps its legacy right-side placement. -->\n\t\t\t<slot name=\"after-search\" />\n\t\t\t<!-- Counter beside the search (`showCountWithSearch`): after the search and its #after-search controls. The live region stays mounted while there is no total, so results coming back after none are announced too. -->\n\t\t\t<span v-if=\"showCount && showSearch && showCountWithSearch\"\n\t\t\t\tclass=\"cn-actions-bar__count cn-actions-bar__count--beside-search\"\n\t\t\t\t:class=\"{ 'cn-actions-bar__count--empty': !hasTotal }\"\n\t\t\t\taria-live=\"polite\">{{ hasTotal ? countText : '' }}</span>\n\n\t\t\t<!-- View mode toggle (Cards / Table / List) — segmented control with\n\t\t\t a sliding thumb that animates between the N segments. Lives in\n\t\t\t the LEFT info group: switching view is a visual control like\n\t\t\t search and filters, it adds nothing — so it groups with them at\n\t\t\t every width instead of riding with the act buttons. -->\n\t\t\t<div v-if=\"showViewToggle && viewSegments.length > 1\"\n\t\t\t\tclass=\"cn-actions-bar__view-toggle\"\n\t\t\t\trole=\"group\"\n\t\t\t\t:aria-label=\"isBoardLayout ? t('nextcloud-vue', 'View') : t('nextcloud-vue', 'View mode')\">\n\t\t\t\t<!-- Sliding pill that sits behind the active segment. Width and\n\t\t\t\t offset are driven by the segment count so the same markup\n\t\t\t\t works for 2–4 segments (cards / table / list / map). -->\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"!isBoardLayout\"\n\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-thumb\"\n\t\t\t\t\t:style=\"thumbStyle\"\n\t\t\t\t\taria-hidden=\"true\" />\n\t\t\t\t<!--\n\t\t\t\t\t@event view-mode-change\n\t\t\t\t\t@description User clicked one of the view-mode toggle buttons (Cards / Table / List / Map). Payload is the selected mode string.\n\t\t\t\t\t@type {'cards' | 'table' | 'list' | 'map'}\n\t\t\t\t-->\n\t\t\t\t<button\n\t\t\t\t\tv-for=\"seg in viewSegments\"\n\t\t\t\t\t:key=\"seg.mode\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-btn\"\n\t\t\t\t\t:class=\"{ 'cn-actions-bar__view-toggle-btn--active': viewMode === seg.mode }\"\n\t\t\t\t\t:aria-pressed=\"viewMode === seg.mode\"\n\t\t\t\t\t:aria-label=\"isBoardLayout ? seg.label : null\"\n\t\t\t\t\t:title=\"isBoardLayout ? seg.label : null\"\n\t\t\t\t\t@click=\"$emit('view-mode-change', seg.mode)\">\n\t\t\t\t\t<CnIcon v-if=\"seg.icon\"\n\t\t\t\t\t\t:name=\"seg.icon\"\n\t\t\t\t\t\t:size=\"24\"\n\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-icon\" />\n\t\t\t\t\t<component :is=\"seg.fallback\"\n\t\t\t\t\t\tv-else\n\t\t\t\t\t\t:size=\"24\"\n\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-icon\" />\n\t\t\t\t\t<span v-if=\"!isBoardLayout\" class=\"cn-actions-bar__view-toggle-label\">{{ seg.label }}</span>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"cn-actions-bar__actions\">\n\t\t\t<!-- Sort select (opt-in). A standalone sort control for card/list\n\t\t\t views, which — unlike the table — have no sortable column\n\t\t\t headers. A leading sort icon replaces a visible \"Sort by\"\n\t\t\t label so the control stays on one line; the label is kept as\n\t\t\t the combobox's accessible name. -->\n\t\t\t<div v-if=\"showSortSelect && sortOptions.length\" class=\"cn-actions-bar__sort\">\n\t\t\t\t<SortVariant :size=\"20\" class=\"cn-actions-bar__sort-icon\" :aria-label=\"sortLabel\" />\n\t\t\t\t<NcSelect\n\t\t\t\t\tclass=\"cn-actions-bar__sort-select\"\n\t\t\t\t\t:modelValue=\"selectedSortOption\"\n\t\t\t\t\t:options=\"sortOptions\"\n\t\t\t\t\t:reduce=\"opt => opt.value\"\n\t\t\t\t\t:clearable=\"false\"\n\t\t\t\t\t:aria-label-combobox=\"sortLabel\"\n\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t@update:modelValue=\"onSortChange\" />\n\t\t\t</div>\n\n\t\t\t<!-- @slot filters Inline filter controls rendered inside the action bar, between the view toggle and the add/actions (e.g. a CnQuickFilterBar segmented toggle). -->\n\t\t\t<slot v-if=\"!isBoardLayout\" name=\"filters\" />\n\n\t\t\t<!-- Search / Columns sidebar toggle (opt-in). Icon-only; reflects the\n\t\t\t open state via aria-pressed so the index sidebar can default\n\t\t\t closed and be opened on demand. -->\n\t\t\t<!--\n\t\t\t\t@event toggle-sidebar\n\t\t\t\t@description User clicked the Search/Columns sidebar toggle. No payload — the host flips the sidebar open state.\n\t\t\t-->\n\t\t\t<NcButton v-if=\"showSidebarToggle && !isBoardLayout\"\n\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t:aria-label=\"t('nextcloud-vue', 'Search and columns')\"\n\t\t\t\t:title=\"t('nextcloud-vue', 'Search and columns')\"\n\t\t\t\t:pressed=\"sidebarOpen\"\n\t\t\t\t@click=\"$emit('toggle-sidebar')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Tune :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t</NcButton>\n\n\t\t\t<!--\n\t\t\t\t@slot actions\n\t\t\t\t@description Custom buttons rendered between the sidebar toggle and the primary Add button.\n\t\t\t-->\n\t\t\t<slot name=\"actions\" />\n\n\t\t\t<!--\n\t\t\t\t@event add\n\t\t\t\t@description User clicked the primary Add button. No payload.\n\t\t\t-->\n\t\t\t<!-- With `addHref` / `addTo` the button is a real link (middle-click, new tab), and still emits `add`, except on a modified click, which opens a new tab. -->\n\t\t\t<NcButton v-if=\"showAdd\"\n\t\t\t\tvariant=\"primary\"\n\t\t\t\t:disabled=\"addDisabled\"\n\t\t\t\t:href=\"addLink ? addLink.href : undefined\"\n\t\t\t\tdata-testid=\"cn-cta-primary\"\n\t\t\t\tdata-walkthrough-id=\"index-add\"\n\t\t\t\t@click=\"onAddClick\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<CnIcon v-if=\"addIcon\" :name=\"addIcon\" :size=\"20\" />\n\t\t\t\t\t<Plus v-else :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ addLabel }}\n\t\t\t</NcButton>\n\n\t\t\t<!--\n\t\t\t\t@slot actions-end\n\t\t\t\t@description Custom buttons (e.g. CnIndexPage's saved-views control) rendered AFTER the primary Add button, immediately before the overflow menu — for content that belongs grouped with \"browse/manage\" controls rather than with the app-specific buttons in `#actions`.\n\t\t\t-->\n\t\t\t<slot v-if=\"!isBoardLayout\" name=\"actions-end\" />\n\n\t\t\t<!-- In-app edit button (ADR-041): icon-only, self-wires from CnAppRoot.\n\t\t\t The board look draws it in the page header instead. -->\n\t\t\t<CnBuildiqEditButton v-if=\"showBuildiqButton\" />\n\n\t\t\t<!-- Actions menu (Refresh, Import, Export, mass actions) -->\n\t\t\t<NcActions\n\t\t\t\tv-if=\"showActionsMenu\"\n\t\t\t\t:forceName=\"true\"\n\t\t\t\t:inline=\"inlineActionCount\"\n\t\t\t\t:menuName=\"actionsMenuName\"\n\t\t\t\tdata-testid=\"cn-actions\">\n\t\t\t\t<!--\n\t\t\t\t\t@event refresh\n\t\t\t\t\t@description User clicked the Refresh entry in the overflow Actions menu. The host should re-fetch the underlying list.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton :disabled=\"refreshing || refreshDisabled\" @click=\"$emit('refresh')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<NcLoadingIcon v-if=\"refreshing\" :size=\"20\" />\n\t\t\t\t\t\t<Refresh v-else :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ refreshing ? t('nextcloud-vue', 'Refreshing…') : t('nextcloud-vue', 'Refresh') }}\n\t\t\t\t</NcActionButton>\n\n\t\t\t\t<NcActionLink v-if=\"documentationUrl\"\n\t\t\t\t\t:href=\"documentationUrl\"\n\t\t\t\t\ttarget=\"_blank\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<BookOpenVariantOutline :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ documentationLabel }}\n\t\t\t\t</NcActionLink>\n\n\t\t\t\t<!-- Manifest-declared page-level header actions (overflow); an entry with `href` / `to` is a real link. -->\n\t\t\t\t<template v-for=\"{ entry, link } in renderedHeaderActions\" :key=\"entry.id\">\n\t\t\t\t\t<NcActionLink\n\t\t\t\t\t\tv-if=\"link\"\n\t\t\t\t\t\t:href=\"link.href\"\n\t\t\t\t\t\t:target=\"link.target\"\n\t\t\t\t\t\tcloseAfterClick\n\t\t\t\t\t\t@click=\"onHeaderLinkClick(entry, link, $event)\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<CnIcon v-if=\"entry.icon && isMdiIconName(entry.icon)\" :name=\"entry.icon\" :size=\"20\" />\n\t\t\t\t\t\t\t<span v-else-if=\"entry.icon\"\n\t\t\t\t\t\t\t\tclass=\"cn-actions-bar__header-action-icon\"\n\t\t\t\t\t\t\t\t:class=\"[entry.icon]\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t{{ entry.label ? effectiveTranslate(entry.label) : entry.label }}\n\t\t\t\t\t</NcActionLink>\n\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\tv-else\n\t\t\t\t\t\t:disabled=\"Boolean(entry.disabled)\"\n\t\t\t\t\t\t@click=\"$emit('header-action', { action: entry.id, id: entry.id })\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<CnIcon v-if=\"entry.icon && isMdiIconName(entry.icon)\" :name=\"entry.icon\" :size=\"20\" />\n\t\t\t\t\t\t\t<span v-else-if=\"entry.icon\"\n\t\t\t\t\t\t\t\tclass=\"cn-actions-bar__header-action-icon\"\n\t\t\t\t\t\t\t\t:class=\"[entry.icon]\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t{{ entry.label ? effectiveTranslate(entry.label) : entry.label }}\n\t\t\t\t\t</NcActionButton>\n\t\t\t\t</template>\n\n\t\t\t\t<!--\n\t\t\t\t\t@slot action-items\n\t\t\t\t\t@description Additional NcActionButton-family items rendered inside the overflow menu, between the built-in Refresh entry and the mass-actions separator. Use for app-level page actions.\n\t\t\t\t-->\n\t\t\t\t<slot name=\"action-items\" />\n\n\t\t\t\t<!-- Separator between primary and mass actions. Hidden when the\n\t\t\t\t inline-action-count hoists every pre-separator item out of the\n\t\t\t\t overflow, which would otherwise leave the separator orphaned. -->\n\t\t\t\t<NcActionSeparator v-if=\"showActionsSeparator\" />\n\n\t\t\t\t<!-- Mass actions (overflow) -->\n\t\t\t\t<!--\n\t\t\t\t\t@event show-import\n\t\t\t\t\t@description User clicked the Import mass action. Host should open the import modal.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-if=\"showMassImport\"\n\t\t\t\t\t@click=\"$emit('show-import')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<Import :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('nextcloud-vue', 'Import') }}\n\t\t\t\t</NcActionButton>\n\t\t\t\t<!--\n\t\t\t\t\t@event show-export\n\t\t\t\t\t@description User clicked the Export mass action. Host should open the export modal.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-if=\"showMassExport\"\n\t\t\t\t\t@click=\"$emit('show-export')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<Export :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('nextcloud-vue', 'Export') }}\n\t\t\t\t</NcActionButton>\n\t\t\t\t<!--\n\t\t\t\t\t@event show-copy\n\t\t\t\t\t@description User clicked the Copy-selected mass action. Disabled while no row is selected.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-if=\"showMassCopy\"\n\t\t\t\t\t:disabled=\"selectedIds.length < 1\"\n\t\t\t\t\t:title=\"selectedIds.length < 1 ? t('nextcloud-vue', 'Select 1 or more items to copy') : ''\"\n\t\t\t\t\t@click=\"$emit('show-copy')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<ContentCopy :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('nextcloud-vue', 'Copy selected') }}\n\t\t\t\t</NcActionButton>\n\t\t\t\t<!--\n\t\t\t\t\t@event show-delete\n\t\t\t\t\t@description User clicked the Delete-selected mass action. Disabled while no row is selected.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-if=\"showMassDelete\"\n\t\t\t\t\t:disabled=\"selectedIds.length < 1\"\n\t\t\t\t\t:title=\"selectedIds.length < 1 ? t('nextcloud-vue', 'Select 1 or more items to delete') : ''\"\n\t\t\t\t\t@click=\"$emit('show-delete')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<TrashCanOutline :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('nextcloud-vue', 'Delete selected') }}\n\t\t\t\t</NcActionButton>\n\n\t\t\t\t<!--\n\t\t\t\t\t@slot mass-actions\n\t\t\t\t\t@description Additional mass-action NcActionButtons rendered at the bottom of the overflow menu. Scope receives the current selection count and ids so the host can disable / label per selection.\n\t\t\t\t\t@binding {number} count Length of the current selection.\n\t\t\t\t\t@binding {Array<string|number>} selected-ids The selected row ids.\n\t\t\t\t-->\n\t\t\t\t<slot name=\"mass-actions\" :count=\"selectedIds.length\" :selectedIds=\"selectedIds\" />\n\t\t\t</NcActions>\n\t\t</div>\n\n\t\t<!-- Board look, row 2: the search field, then the active filters. -->\n\t\t<div v-if=\"isBoardLayout\" class=\"cn-actions-bar__row cn-actions-bar__row--search\" data-testid=\"cn-actions-bar-row-search\">\n\t\t\t<div v-if=\"showSearch\" class=\"cn-actions-bar__search\">\n\t\t\t\t<Magnify :size=\"18\" class=\"cn-actions-bar__search-icon\" />\n\t\t\t\t<input\n\t\t\t\t\ttype=\"search\"\n\t\t\t\t\tclass=\"cn-actions-bar__search-input\"\n\t\t\t\t\t:placeholder=\"searchPlaceholder || t('nextcloud-vue', 'Search…')\"\n\t\t\t\t\t:value=\"searchValue\"\n\t\t\t\t\t:aria-label=\"searchPlaceholder || t('nextcloud-vue', 'Search')\"\n\t\t\t\t\t@input=\"onSearchInput\">\n\t\t\t</div>\n\t\t\t<span v-else-if=\"showCount && hasTotal\" class=\"cn-actions-bar__count\">\n\t\t\t\t{{ countText }}\n\t\t\t</span>\n\t\t\t<slot name=\"after-search\" />\n\t\t\t<!-- Board look, row 2: the active filters as removable chips and a\n\t\t\t \"Clear all\" link, after the search field. -->\n\t\t\t<template v-if=\"activeFilterChips.length > 0\">\n\t\t\t\t<span class=\"cn-actions-bar__active-label\" data-testid=\"cn-actions-bar-active-label\">{{ t('nextcloud-vue', 'Active:') }}</span>\n\t\t\t\t<span\n\t\t\t\t\tv-for=\"chip in activeFilterChips\"\n\t\t\t\t\t:key=\"chip.key\"\n\t\t\t\t\tclass=\"cn-actions-bar__filter-chip\"\n\t\t\t\t\tdata-testid=\"cn-actions-bar-filter-chip\">\n\t\t\t\t\t<span class=\"cn-actions-bar__filter-chip-label\">{{ chip.label }}</span>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"cn-actions-bar__filter-chip-remove\"\n\t\t\t\t\t\t:aria-label=\"removeFilterLabel(chip)\"\n\t\t\t\t\t\t@click=\"$emit('remove-filter', chip)\">\n\t\t\t\t\t\t<Close :size=\"14\" aria-hidden=\"true\" />\n\t\t\t\t\t</button>\n\t\t\t\t</span>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"cn-actions-bar__clear-all\"\n\t\t\t\t\tdata-testid=\"cn-actions-bar-clear-all\"\n\t\t\t\t\t@click=\"$emit('clear-filters')\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Clear all') }}\n\t\t\t\t</button>\n\t\t\t</template>\n\t\t\t<span v-if=\"showCount && showSearch && showCountWithSearch\"\n\t\t\t\tclass=\"cn-actions-bar__count cn-actions-bar__count--beside-search\"\n\t\t\t\t:class=\"{ 'cn-actions-bar__count--empty': !hasTotal }\"\n\t\t\t\taria-live=\"polite\">{{ hasTotal ? countText : '' }}</span>\n\t\t</div>\n\n\t\t<!-- Always-present live region for the selection count (WCAG 2.1\n\t\t SC 4.1.3 Status Messages): a `role=\"status\"` element must exist\n\t\t BEFORE its content changes for assistive tech to announce it, so\n\t\t it cannot live inside the v-if'd strip below. -->\n\t\t<span class=\"cn-actions-bar__sr-status\" role=\"status\">\n\t\t\t{{ selectable && selectedIds.length > 0 ? selectionCountText : '' }}\n\t\t</span>\n\n\t\t<!-- Contextual selection strip (the Proton Pass / Gmail / Files\n\t\t pattern): appears while a selection is active, carrying the\n\t\t visible count, the built-in selection-scoped mass actions, the\n\t\t host's own bulk buttons (#selection-actions) and a Clear control.\n\t\t This strip is the discoverable surface for bulk actions; the\n\t\t BUILT-IN Copy/Delete-selected also stay listed in the overflow\n\t\t menu above, while a host decides for its own actions (strip-only\n\t\t is fine — keepiq does exactly that). -->\n\t\t<div\n\t\t\tv-if=\"!isBoardLayout && selectable && selectedIds.length > 0\"\n\t\t\tclass=\"cn-actions-bar__selection\"\n\t\t\tdata-testid=\"cn-selection-strip\">\n\t\t\t<span class=\"cn-actions-bar__selection-count\" aria-hidden=\"true\">\n\t\t\t\t{{ selectionCountText }}\n\t\t\t</span>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"showMassCopy\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t@click=\"$emit('show-copy')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<ContentCopy :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Copy selected') }}\n\t\t\t</NcButton>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"showMassDelete\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t@click=\"$emit('show-delete')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<TrashCanOutline :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Delete selected') }}\n\t\t\t</NcButton>\n\t\t\t<!--\n\t\t\t\tDeclarative bulk actions, from `bulkActions`. They render in the\n\t\t\t\tSAME strip as a host's slot buttons and before them, so a page\n\t\t\t\tthat declares some in its manifest and hand-writes others gets\n\t\t\t\tone row of buttons rather than two groups in different places.\n\t\t\t\t@event bulk-action\n\t\t\t\t@description User clicked a declarative bulk action. Payload carries the action id AND the selection, because a bulk action without its selection is not a bulk action.\n\t\t\t-->\n\t\t\t<NcButton\n\t\t\t\tv-for=\"entry in bulkActions\"\n\t\t\t\t:key=\"entry.id\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t:disabled=\"entry.disabled === true\"\n\t\t\t\t:data-testid=\"`cn-bulk-action-${entry.id}`\"\n\t\t\t\t:lang=\"bulkLang(entry)\"\n\t\t\t\t@click=\"$emit('bulk-action', { id: entry.id, action: entry.id, selectedIds, count: selectedIds.length })\">\n\t\t\t\t{{ entry.label ? effectiveTranslate(entry.label) : entry.label }}\n\t\t\t</NcButton>\n\t\t\t<!--\n\t\t\t\t@slot selection-actions The host app's bulk-action buttons (NcButton family), rendered inside the contextual selection strip that appears while a selection is active. This strip is the primary bulk-actions surface; #mass-actions remains available for hosts that ALSO want the actions listed in the overflow menu (optional — strip-only is fine).\n\t\t\t\t@binding {number} count Length of the current selection.\n\t\t\t\t@binding {Array<string|number>} selected-ids The selected row ids.\n\t\t\t-->\n\t\t\t<slot\n\t\t\t\tname=\"selection-actions\"\n\t\t\t\t:count=\"selectedIds.length\"\n\t\t\t\t:selectedIds=\"selectedIds\" />\n\t\t\t<!--\n\t\t\t\t@event clear-selection\n\t\t\t\t@description User clicked the selection strip's Clear control. The host should empty its selection (CnIndexPage does this for you and re-emits `select` with an empty array).\n\t\t\t-->\n\t\t\t<!-- No aria-label: the visible \"Clear selection\" text IS the\n\t\t\t accessible name (review: an override here is redundant). -->\n\t\t\t<NcButton\n\t\t\t\tclass=\"cn-actions-bar__selection-clear\"\n\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t@click=\"$emit('clear-selection')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Close :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Clear selection') }}\n\t\t\t</NcButton>\n\t\t</div>\n\t</div>\n\n\t<!--\n\t\tBoard look: the bulk band is its own row between the toolbar and the\n\t\ttable card, outside the toolbar element, and only while rows are\n\t\tselected. The count stays announced by the live region above.\n\t-->\n\t<div\n\t\tv-if=\"isBoardLayout && selectable && selectedIds.length > 0\"\n\t\tclass=\"cn-actions-bar__band\"\n\t\trole=\"region\"\n\t\t:aria-label=\"t('nextcloud-vue', 'Actions for the selection')\"\n\t\tdata-testid=\"cn-bulk-band\">\n\t\t<strong class=\"cn-actions-bar__band-lead\">{{ bulkBandLead }}</strong>\n\t\t<NcButton\n\t\t\tv-if=\"showMassCopy\"\n\t\t\tvariant=\"secondary\"\n\t\t\t@click=\"$emit('show-copy')\">\n\t\t\t{{ t('nextcloud-vue', 'Copy selected') }}\n\t\t</NcButton>\n\t\t<NcButton\n\t\t\tv-if=\"showMassDelete\"\n\t\t\tvariant=\"secondary\"\n\t\t\t@click=\"$emit('show-delete')\">\n\t\t\t{{ t('nextcloud-vue', 'Delete selected') }}\n\t\t</NcButton>\n\t\t<NcButton\n\t\t\tv-for=\"entry in bulkActions\"\n\t\t\t:key=\"entry.id\"\n\t\t\tvariant=\"secondary\"\n\t\t\t:disabled=\"entry.disabled === true\"\n\t\t\t:data-testid=\"`cn-bulk-action-${entry.id}`\"\n\t\t\t:lang=\"bulkLang(entry)\"\n\t\t\t@click=\"$emit('bulk-action', { id: entry.id, action: entry.id, selectedIds, count: selectedIds.length })\">\n\t\t\t{{ entry.label ? effectiveTranslate(entry.label) : entry.label }}\n\t\t</NcButton>\n\t\t<slot\n\t\t\tname=\"selection-actions\"\n\t\t\t:count=\"selectedIds.length\"\n\t\t\t:selectedIds=\"selectedIds\" />\n\t\t<span v-if=\"bulkHint\" class=\"cn-actions-bar__band-hint\" data-testid=\"cn-bulk-band-hint\">{{ bulkHint }}</span>\n\t</div>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcActionButton, NcActionLink, NcActions, NcActionSeparator, NcButton, NcLoadingIcon, NcSelect } from '@nextcloud/vue'\nimport BookOpenVariantOutline from 'vue-material-design-icons/BookOpenVariantOutline.vue'\nimport CalendarMonthOutline from 'vue-material-design-icons/CalendarMonthOutline.vue'\nimport Close from 'vue-material-design-icons/Close.vue'\nimport ContentCopy from 'vue-material-design-icons/ContentCopy.vue'\nimport Export from 'vue-material-design-icons/Export.vue'\nimport FormatListBulletedSquare from 'vue-material-design-icons/FormatListBulletedSquare.vue'\nimport Import from 'vue-material-design-icons/Import.vue'\nimport Magnify from 'vue-material-design-icons/Magnify.vue'\nimport MapMarkerOutline from 'vue-material-design-icons/MapMarkerOutline.vue'\nimport Plus from 'vue-material-design-icons/Plus.vue'\nimport Refresh from 'vue-material-design-icons/Refresh.vue'\nimport SortVariant from 'vue-material-design-icons/SortVariant.vue'\nimport TrashCanOutline from 'vue-material-design-icons/TrashCanOutline.vue'\nimport Tune from 'vue-material-design-icons/Tune.vue'\nimport ViewColumnOutline from 'vue-material-design-icons/ViewColumnOutline.vue'\nimport ViewGridOutline from 'vue-material-design-icons/ViewGridOutline.vue'\nimport ViewListOutline from 'vue-material-design-icons/ViewListOutline.vue'\nimport CnBuildiqEditButton from '../CnBuildiqEditButton/CnBuildiqEditButton.vue'\nimport { normalizeLook } from '../../composables/useLook.js'\nimport { followItemActionLink, resolveItemActionLink } from '../../utils/actionLink.js'\nimport { isModifiedClick } from '../../utils/linkNavigation.js'\nimport { labelLang } from '../../utils/manifestTranslate.js'\nimport { CnIcon } from '../CnIcon/index.js'\n\n/**\n * CnActionsBar — Reusable actions toolbar with count, mass actions, and primary actions.\n *\n * ```vue\n * <CnActionsBar\n * :pagination=\"pagination\"\n * :object-count=\"items.length\"\n * add-label=\"Add Client\"\n * add-icon=\"AccountGroup\"\n * @add=\"createNew\"\n * @refresh=\"reload\" />\n * ```\n */\nexport default {\n\tname: 'CnActionsBar',\n\n\tcomponents: {\n\t\tCnBuildiqEditButton,\n\t\tNcActions,\n\t\tNcActionButton,\n\t\tNcActionLink,\n\t\tNcActionSeparator,\n\t\tNcButton,\n\t\tNcLoadingIcon,\n\t\tNcSelect,\n\t\tCnIcon,\n\t\tSortVariant,\n\t\tBookOpenVariantOutline,\n\t\tClose,\n\t\tPlus,\n\t\tRefresh,\n\t\tContentCopy,\n\t\tTrashCanOutline,\n\t\tImport,\n\t\tExport,\n\t\tMagnify,\n\t\tTune,\n\t\tViewColumnOutline,\n\t\tViewGridOutline,\n\t\tFormatListBulletedSquare,\n\t\tCalendarMonthOutline,\n\t\tMapMarkerOutline,\n\t},\n\n\tinject: {\n\t\t/** The look CnAppRoot provides; `board` draws the two-row toolbar. */\n\t\tcnLook: { default: 'nextcloud' },\n\t\t/**\n\t\t * Host translate function provided by CnAppRoot as\n\t\t * `cnTranslate: this.translate` (bound to the host app's id). The\n\t\t * manifest-authored `headerActions[].label` is run through it — the\n\t\t * entry is keyed and emitted by `id`, so only the visible text\n\t\t * changes. Defaults to an identity function so an untranslated key\n\t\t * renders as itself.\n\t\t */\n\t\tcnTranslate: { default: () => (key) => key },\n\t},\n\n\t// Attributes go on the toolbar element, not on the fragment (the toolbar\n\t// plus, under the board look, the bulk band).\n\tinheritAttrs: false,\n\n\tprops: {\n\t\t/**\n\t\t * `board` draws the toolbar of the board look: no band, two rows (saved\n\t\t * views, Filter and the view switch; then the search field and the\n\t\t * active filters). Empty follows the `cnLook` the app provides.\n\t\t *\n\t\t * @type {('' | 'board' | 'nextcloud')}\n\t\t * @spec openspec/changes/screens-index-list-parity/specs/index-list-board-look/spec.md#requirement-the-toolbar-sits-on-the-ground-in-two-rows\n\t\t */\n\t\tlayout: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * The active filters as chips for row 2 of the board toolbar:\n\t\t * `{ key, label }`, the label reading \"Team: Woo\". Removing one emits\n\t\t * `remove-filter` with the chip; \"Clear all\" emits `clear-filters`.\n\t\t *\n\t\t * @type {Array<{key: string, label: string}>}\n\t\t */\n\t\tactiveFilterChips: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * The number on the Filter button's badge. Empty (`null`) counts the\n\t\t * `activeFilterChips`.\n\t\t *\n\t\t * @type {(number|null)}\n\t\t */\n\t\tactiveFilterCount: {\n\t\t\ttype: Number,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Whether the bar draws the in-app buildiq edit button. A page that\n\t\t * draws it in its own header (the board look) passes false so there\n\t\t * is one square, not two.\n\t\t */\n\t\tshowBuildiqButton: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** The plural the board bulk band names (\"With the selected cases\"). */\n\t\tbulkNoun: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** The 13px hint after the board bulk band's buttons (`config.bulkHint`). */\n\t\tbulkHint: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Pagination state: { total, page, pages, limit } */\n\t\tpagination: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** Number of currently visible objects (for \"Showing X of Y\") */\n\t\tobjectCount: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\n\t\t/** Whether rows/cards can be selected */\n\t\tselectable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Currently selected IDs */\n\t\tselectedIds: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** Label for the Add button */\n\t\taddLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Add'),\n\t\t},\n\n\t\t/** MDI icon name for the Add button (e.g. 'AccountGroup'). Falls back to Plus icon. */\n\t\taddIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * URL the Add button links to. Makes the button a real link (middle-click,\n\t\t * open in new tab) that still emits `add` on click. `addTo` is ignored when set.\n\t\t *\n\t\t * @type {string|null}\n\t\t */\n\t\taddHref: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * vue-router location (path or `{ name, params }`) the Add button links to.\n\t\t * The button becomes a real link whose plain click routes in place and still\n\t\t * emits `add`; the host must then not navigate on `add` itself. Ignored when\n\t\t * the router cannot resolve it.\n\t\t *\n\t\t * @type {string|object|null}\n\t\t */\n\t\taddTo: {\n\t\t\ttype: [String, Object],\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** How many action buttons to show inline (rest go in overflow dropdown) */\n\t\tinlineActionCount: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\n\t\t/** Whether to show the built-in mass Import action */\n\t\tshowMassImport: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Whether to show the built-in mass Export action */\n\t\tshowMassExport: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Whether to show the built-in mass Copy action */\n\t\tshowMassCopy: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Whether to show the built-in mass Delete action */\n\t\tshowMassDelete: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Current view mode: 'table', 'cards', 'list', or 'map' */\n\t\tviewMode: {\n\t\t\ttype: String,\n\t\t\tdefault: 'table',\n\t\t\tvalidator: (v) => ['table', 'cards', 'list', 'map', 'calendar'].includes(v),\n\t\t},\n\n\t\t/**\n\t\t * Which view-mode segments to render, in order. Defaults to the\n\t\t * historical two-segment control; add `'list'` to expose the list view.\n\t\t *\n\t\t * @type {Array<'cards' | 'table' | 'list' | 'calendar'>}\n\t\t */\n\t\tavailableViewModes: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => ['cards', 'table'],\n\t\t\tvalidator: (modes) => modes.every((m) => ['cards', 'table', 'list', 'calendar'].includes(m)),\n\t\t},\n\n\t\t/** Whether to show the view-mode toggle */\n\t\tshowViewToggle: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Label for the cards/grid view-toggle option (defaults to \"Cards\") */\n\t\tcardsLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Label for the table/list view-toggle option (defaults to \"Table\") */\n\t\ttableLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** MDI icon name for the cards option (defaults to the built-in grid icon). Resolved via CnIcon. */\n\t\tcardsIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** MDI icon name for the table option (defaults to the built-in list icon). Resolved via CnIcon. */\n\t\ttableIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Whether to render the \"Map\" segment in the view toggle (back-compat bridge; equivalent to adding 'map' to `availableViewModes`). */\n\t\tshowMap: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Label for the map view-toggle option (defaults to \"Map\"). */\n\t\tmapLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** MDI icon name for the map option (defaults to the built-in map-marker icon). Resolved via CnIcon. */\n\t\tmapIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Label for the list view-toggle option (defaults to \"List\") */\n\t\tlistLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** MDI icon name for the list option (defaults to the built-in list icon). Resolved via CnIcon. */\n\t\tlistIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Show a standalone sort dropdown (useful in card/list views). */\n\t\tshowSortSelect: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Options for the sort dropdown.\n\t\t *\n\t\t * @type {Array<{ value: string, label: string }>}\n\t\t */\n\t\tsortOptions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** The currently selected sort option value (controlled). */\n\t\tsortValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Accessible label for the sort dropdown. */\n\t\tsortLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Sort by'),\n\t\t},\n\n\t\t/** Whether to show the inline search field on the left of the bar */\n\t\tshowSearch: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Current value of the inline search field (controlled) */\n\t\tsearchValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Placeholder / accessible label for the inline search field */\n\t\tsearchPlaceholder: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * Keep the \"Showing X of Y\" counter visible beside the inline search field,\n\t\t * after any `#after-search` controls. By default the search field takes the\n\t\t * counter's place. No effect without `showSearch`.\n\t\t */\n\t\tshowCountWithSearch: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Whether the refresh action is currently in progress */\n\t\trefreshing: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Whether the refresh action is disabled (e.g. when required selections are missing) */\n\t\trefreshDisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Whether the Add button is disabled (e.g. when required selections are missing) */\n\t\taddDisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Whether to show the Add button */\n\t\tshowAdd: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/**\n\t\t * Whether the \"Showing 20 of 258\" line renders where the search field\n\t\t * is not. `false` drops it, for a page whose title line already says\n\t\t * how many there are. True by default.\n\t\t *\n\t\t * @spec openspec/changes/zuiddrecht-pixel-gaps-3/specs/zuiddrecht-pixel-gaps-3/spec.md#requirement-an-index-page-can-take-the-board-header\n\t\t */\n\t\tshowCount: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/**\n\t\t * Whether the overflow Actions menu (Refresh, Import, Export, mass\n\t\t * actions, header actions) renders. `false` drops it, for a page that\n\t\t * offers its actions as buttons elsewhere (CnIndexPage\n\t\t * `headerButtons`). True by default.\n\t\t *\n\t\t * @spec openspec/changes/zuiddrecht-pixel-gaps-3/specs/zuiddrecht-pixel-gaps-3/spec.md#requirement-an-index-page-can-take-the-board-header\n\t\t */\n\t\tshowActionsMenu: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/**\n\t\t * Whether to show the Search/Columns sidebar toggle button. Lets the\n\t\t * index sidebar default to closed and be opened on demand.\n\t\t */\n\t\tshowSidebarToggle: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Current open state of the sidebar (controls the toggle's pressed state). */\n\t\tsidebarOpen: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Manifest-declared page-level actions rendered in the overflow\n\t\t * dropdown between Refresh and the `#action-items` slot. Each\n\t\t * entry is `{ id, label, icon?, disabled? }`. The bar emits\n\t\t * `@header-action({ action: id, id })` on click; handler\n\t\t * resolution happens upstream (CnIndexPage). An entry with `href`\n\t\t * (URL) or `to` (vue-router location) renders as a real link, with\n\t\t * `linkTarget` as its `target`; it still emits `header-action`, so the\n\t\t * host must not navigate for it again.\n\t\t *\n\t\t * @type {Array<{ id: string, label: string, icon?: string, disabled?: boolean, href?: string, to?: string|object, linkTarget?: string }>}\n\t\t */\n\t\theaderActions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * Declarative bulk actions, rendered in the contextual selection strip\n\t\t * that appears while a selection is active.\n\t\t *\n\t\t * The strip already had a `#selection-actions` slot, which only a\n\t\t * hand-written host component can fill — so a page declared in an app\n\t\t * manifest could carry row actions and header actions but never a bulk\n\t\t * one. This prop is that missing vocabulary; the slot stays, and both\n\t\t * render side by side in one row.\n\t\t *\n\t\t * Clicking emits `bulk-action` with the id AND the current selection.\n\t\t *\n\t\t * @type {Array<{ id: string, label: string, icon?: string, disabled?: boolean }>}\n\t\t */\n\t\tbulkActions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * When set, adds a Documentation entry to the overflow menu (after\n\t\t * Refresh, before headerActions). Opens the URL in a new tab.\n\t\t * Empty string hides the entry.\n\t\t */\n\t\tdocumentationUrl: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Label for the Documentation overflow entry. */\n\t\tdocumentationLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Documentation'),\n\t\t},\n\t},\n\n\temits: [\n\t\t'add',\n\t\t'bulk-action',\n\t\t'clear-filters',\n\t\t'clear-selection',\n\t\t'header-action',\n\t\t'refresh',\n\t\t'remove-filter',\n\t\t'search',\n\t\t'show-copy',\n\t\t'show-delete',\n\t\t'show-export',\n\t\t'show-import',\n\t\t'sort-change',\n\t\t'toggle-sidebar',\n\t\t'view-mode-change',\n\t],\n\n\tcomputed: {\n\t\t/**\n\t\t * Whether the board toolbar is drawn: the `layout` prop, else the look\n\t\t * the app provides.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tisBoardLayout() {\n\t\t\tif (this.layout) {\n\t\t\t\treturn this.layout === 'board'\n\t\t\t}\n\t\t\treturn normalizeLook(this.cnLook) === 'board'\n\t\t},\n\n\t\t/**\n\t\t * The number on the Filter button.\n\t\t *\n\t\t * @return {number}\n\t\t */\n\t\tfilterCount() {\n\t\t\treturn typeof this.activeFilterCount === 'number' ? this.activeFilterCount : this.activeFilterChips.length\n\t\t},\n\n\t\t/**\n\t\t * The accessible name of the Filter badge.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tfilterCountLabel() {\n\t\t\treturn t('nextcloud-vue', '{count} active', { count: this.filterCount })\n\t\t},\n\n\t\t/**\n\t\t * The bold lead of the board bulk band.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tbulkBandLead() {\n\t\t\treturn t('nextcloud-vue', 'With the selected {plural}', { plural: this.bulkNoun || t('nextcloud-vue', 'items') })\n\t\t},\n\n\t\t/**\n\t\t * Name of the overflow Actions menu. Library chrome, so it resolves\n\t\t * against the LIBRARY catalogue — it was a bare `menu-name=\"Actions\"`\n\t\t * literal, which rendered \"Actions\" in a Dutch session next to an\n\t\t * otherwise fully translated toolbar even though the catalogue has\n\t\t * carried \"Acties\" all along.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tactionsMenuName() {\n\t\t\treturn t('nextcloud-vue', 'Actions')\n\t\t},\n\n\t\t/**\n\t\t * The selection strip's count text — also fed to the always-present\n\t\t * `role=\"status\"` live region (WCAG 2.1 SC 4.1.3), so assistive tech\n\t\t * announces selection changes without focus moving.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tselectionCountText() {\n\t\t\treturn t('nextcloud-vue', '{count} selected', { count: this.selectedIds.length })\n\t\t},\n\n\t\t/**\n\t\t * Effective translate function: the injected `cnTranslate` (the host\n\t\t * app's bound `t()`), identity by default.\n\t\t *\n\t\t * @return {(key: string) => string}\n\t\t */\n\t\teffectiveTranslate() {\n\t\t\treturn typeof this.cnTranslate === 'function' ? this.cnTranslate : (key) => key\n\t\t},\n\n\t\t/**\n\t\t * The link the Add button renders as, or null for a plain button.\n\t\t *\n\t\t * @return {object|null}\n\t\t */\n\t\taddLink() {\n\t\t\tif (this.addDisabled) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn resolveItemActionLink({ href: this.addHref, to: this.addTo }, null, this.$router)\n\t\t},\n\n\t\t/**\n\t\t * Header actions paired with the link each renders as (null for a button).\n\t\t *\n\t\t * @return {Array<{entry: object, link: object|null}>}\n\t\t */\n\t\trenderedHeaderActions() {\n\t\t\treturn (this.headerActions || []).map((entry) => ({\n\t\t\t\tentry,\n\t\t\t\tlink: entry.disabled ? null : resolveItemActionLink(entry, null, this.$router),\n\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * Whether there is a non-empty total for the \"Showing X of Y\" counter.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\thasTotal() {\n\t\t\treturn Boolean(this.pagination && this.pagination.total > 0)\n\t\t},\n\n\t\tcountText() {\n\t\t\tif (!this.pagination) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\treturn t('nextcloud-vue', 'Showing {count} of {total}', { count: this.objectCount, total: this.pagination.total })\n\t\t},\n\n\t\t/**\n\t\t * The view-toggle segments (label + icon) derived from `availableViewModes`,\n\t\t * with a back-compat bridge that appends the map segment when the beta-era\n\t\t * `showMap` prop is set. `icon` is a CnIcon name (empty → the built-in\n\t\t * `fallback` component).\n\t\t */\n\t\tviewSegments() {\n\t\t\tconst defs = {\n\t\t\t\tcards: { label: this.cardsLabel || t('nextcloud-vue', 'Cards'), icon: this.cardsIcon, fallback: ViewGridOutline },\n\t\t\t\ttable: { label: this.tableLabel || t('nextcloud-vue', 'Table'), icon: this.tableIcon, fallback: FormatListBulletedSquare },\n\t\t\t\tlist: { label: this.listLabel || t('nextcloud-vue', 'List'), icon: this.listIcon, fallback: ViewListOutline },\n\t\t\t\tmap: { label: this.mapLabel || t('nextcloud-vue', 'Map'), icon: this.mapIcon, fallback: MapMarkerOutline },\n\t\t\t\tcalendar: { label: t('nextcloud-vue', 'Calendar'), icon: '', fallback: CalendarMonthOutline },\n\t\t\t}\n\t\t\tconst modes = [...this.availableViewModes]\n\t\t\tif (this.showMap && !modes.includes('map')) {\n\t\t\t\tmodes.push('map')\n\t\t\t}\n\t\t\tif (this.isBoardLayout) {\n\t\t\t\t// The board look's fixed order: table, cards, board, map, each\n\t\t\t\t// only when the page offers it. A mode the board switch does not\n\t\t\t\t// name (list, calendar) follows, so it is never lost.\n\t\t\t\tdefs.board = { label: t('nextcloud-vue', 'Board'), icon: '', fallback: ViewColumnOutline }\n\t\t\t\tconst fixed = ['table', 'cards', 'board', 'map']\n\t\t\t\tconst rest = modes.filter((mode) => !fixed.includes(mode))\n\t\t\t\treturn [...fixed.filter((mode) => modes.includes(mode)), ...rest]\n\t\t\t\t\t.filter((mode) => defs[mode])\n\t\t\t\t\t.map((mode) => ({ mode, ...defs[mode] }))\n\t\t\t}\n\t\t\treturn modes\n\t\t\t\t.filter((mode) => defs[mode])\n\t\t\t\t.map((mode) => ({ mode, ...defs[mode] }))\n\t\t},\n\n\t\t/** The full sort option object matching `sortValue` (for NcSelect). */\n\t\tselectedSortOption() {\n\t\t\treturn this.sortOptions.find((o) => o.value === this.sortValue) || null\n\t\t},\n\n\t\t/** Sliding-thumb width + offset, driven by the active segment index. */\n\t\tthumbStyle() {\n\t\t\tconst count = this.viewSegments.length || 1\n\t\t\tconst activeIndex = Math.max(0, this.viewSegments.findIndex((s) => s.mode === this.viewMode))\n\t\t\treturn {\n\t\t\t\twidth: `calc((100% - 8px) / ${count})`,\n\t\t\t\ttransform: `translateX(${activeIndex * 100}%)`,\n\t\t\t}\n\t\t},\n\n\t\thasMassActions() {\n\t\t\treturn this.showMassImport || this.showMassExport || this.showMassCopy || this.showMassDelete\n\t\t},\n\n\t\t/**\n\t\t * Count meaningful VNodes in the `#action-items` slot (excludes whitespace\n\t\t * text nodes and comments). Used to decide whether the mass-actions\n\t\t * separator would be orphaned by `inlineActionCount`.\n\t\t */\n\t\tactionItemsCount() {\n\t\t\tconst slot = this.$slots['action-items']\n\t\t\tif (!slot) {\n\t\t\t\treturn 0\n\t\t\t}\n\t\t\tconst vnodes = slot() || []\n\t\t\treturn vnodes.filter((n) => n && (n.tag !== undefined || n.componentOptions !== undefined)).length\n\t\t},\n\n\t\t/**\n\t\t * The separator is meaningful only when at least one pre-separator action\n\t\t * button (Refresh + #action-items) still ends up inside the overflow\n\t\t * dropdown after NcActions hoists the first `inlineActionCount` buttons\n\t\t * inline. Pre-separator items: 1 (Refresh) + actionItemsCount.\n\t\t */\n\t\tshowActionsSeparator() {\n\t\t\tif (!this.hasMassActions) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tif (!this.$slots['action-items']) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst preSeparatorOverflow = 1 + this.actionItemsCount - this.inlineActionCount\n\t\t\treturn preSeparatorOverflow > 0\n\t\t},\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * The accessible name of a filter chip's remove button.\n\t\t *\n\t\t * @param {{label: string}} chip The chip.\n\t\t * @return {string}\n\t\t */\n\t\tremoveFilterLabel(chip) {\n\t\t\treturn t('nextcloud-vue', 'Remove filter: {label}', { label: chip.label })\n\t\t},\n\n\t\t/**\n\t\t * The `lang` of a bulk action label that fell back to its written text in another language.\n\t\t *\n\t\t * @param {object} entry The bulk action.\n\t\t * @return {string|undefined} The source language, or undefined.\n\t\t */\n\t\tbulkLang(entry) {\n\t\t\treturn labelLang(this.cnTranslate, entry.label) || undefined\n\t\t},\n\n\t\tt,\n\t\t/**\n\t\t * Forward the inline search field's input to the host.\n\t\t *\n\t\t * @param {Event} event The native input event.\n\t\t * @return {void}\n\t\t */\n\t\tonSearchInput(event) {\n\t\t\t/**\n\t\t\t * @event search Emitted when the user types in the inline search field.\n\t\t\t * @type {string}\n\t\t\t */\n\t\t\tthis.$emit('search', event.target.value)\n\t\t},\n\n\t\t/**\n\t\t * Forward the standalone sort dropdown's selection to the host.\n\t\t *\n\t\t * @param {string} value The chosen option's `value`.\n\t\t * @return {void}\n\t\t */\n\t\tonSortChange(value) {\n\t\t\t/**\n\t\t\t * @event sort-change Emitted when the user picks an option from the standalone sort dropdown.\n\t\t\t * @type {string} The chosen option's `value`.\n\t\t\t */\n\t\t\tthis.$emit('sort-change', value)\n\t\t},\n\n\t\t/**\n\t\t * Add button click: a plain click on an in-app link routes in place,\n\t\t * anything else on a link is the browser's. Emits `add`, except for a\n\t\t * modified click on a link, which opens in a new tab: a host `@add`\n\t\t * would otherwise run in the tab the user is leaving.\n\t\t *\n\t\t * @param {MouseEvent} event The click event.\n\t\t */\n\t\tonAddClick(event) {\n\t\t\tif (this.addLink) {\n\t\t\t\tif (isModifiedClick(event)) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tfollowItemActionLink(event, this.addLink, this.$router)\n\t\t\t}\n\t\t\tthis.$emit('add')\n\t\t},\n\n\t\t/**\n\t\t * A header link entry was clicked: route a plain in-app click and emit\n\t\t * `header-action` as the button would. A modified click is the\n\t\t * browser's alone (a new tab), so nothing is emitted for it.\n\t\t *\n\t\t * @param {object} entry The header action.\n\t\t * @param {object} link The resolved link.\n\t\t * @param {MouseEvent} event The click event.\n\t\t */\n\t\tonHeaderLinkClick(entry, link, event) {\n\t\t\tif (isModifiedClick(event)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tfollowItemActionLink(event, link, this.$router)\n\t\t\tthis.$emit('header-action', { action: entry.id, id: entry.id })\n\t\t},\n\n\t\t/**\n\t\t * Heuristic: a \"plain\" name like `History` is an MDI Vue\n\t\t * component name (rendered via `CnIcon`). A name like\n\t\t * `icon-history` or any string starting with `icon-` is a\n\t\t * Nextcloud core CSS icon class (rendered as a `<span>`).\n\t\t *\n\t\t * @param {string} name Icon string from a headerActions entry.\n\t\t * @return {boolean} `true` when `name` should be passed to\n\t\t * `CnIcon` as `:name`; `false` for CSS-class icons or empty.\n\t\t */\n\t\tisMdiIconName(name) {\n\t\t\tif (!name || typeof name !== 'string') {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tif (name.startsWith('icon-')) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn true\n\t\t},\n\n\t\t/**\n\t\t * Emit declarations — invoked via the template `$emit(...)` sites.\n\t\t * Listed here so vue-docgen-api picks up the events for the\n\t\t * generated docs.\n\t\t *\n\t\t * @private\n\t\t */\n\t\t_emitDocs() {\n\t\t\t/**\n\t\t\t * @event view-mode-change User clicked one of the view-mode toggle buttons (Cards / Table). Payload is the selected mode string.\n\t\t\t * @type {'cards' | 'table'}\n\t\t\t */\n\t\t\tthis.$emit('view-mode-change')\n\t\t\t/**\n\t\t\t * @event add User clicked the primary Add button. No payload.\n\t\t\t */\n\t\t\tthis.$emit('add')\n\t\t\t/**\n\t\t\t * @event refresh User clicked the Refresh entry in the overflow Actions menu. The host should re-fetch the underlying list.\n\t\t\t */\n\t\t\tthis.$emit('refresh')\n\t\t\t/**\n\t\t\t * @event show-import User clicked the Import mass action. Host should open the import modal.\n\t\t\t */\n\t\t\tthis.$emit('show-import')\n\t\t\t/**\n\t\t\t * @event show-export User clicked the Export mass action. Host should open the export modal.\n\t\t\t */\n\t\t\tthis.$emit('show-export')\n\t\t\t/**\n\t\t\t * @event show-copy User clicked the Copy-selected mass action. Disabled while no row is selected.\n\t\t\t */\n\t\t\tthis.$emit('show-copy')\n\t\t\t/**\n\t\t\t * @event show-delete User clicked the Delete-selected mass action. Disabled while no row is selected.\n\t\t\t */\n\t\t\tthis.$emit('show-delete')\n\t\t\t/**\n\t\t\t * @event header-action User clicked a manifest-declared page-level header action. Payload: `{ action: id, id }`.\n\t\t\t */\n\t\t\tthis.$emit('header-action')\n\t\t\t/**\n\t\t\t * @event toggle-sidebar User clicked the Search/Columns sidebar toggle. No payload.\n\t\t\t */\n\t\t\tthis.$emit('toggle-sidebar')\n\t\t\t/**\n\t\t\t * @event clear-selection User clicked the selection strip's Clear control. No payload — the host should empty its selection (CnIndexPage does this and re-emits `select` with an empty array).\n\t\t\t */\n\t\t\tthis.$emit('clear-selection')\n\t\t\t/**\n\t\t\t * @event remove-filter User removed an active filter chip (board look). Payload: the chip `{ key, label }`.\n\t\t\t */\n\t\t\tthis.$emit('remove-filter')\n\t\t\t/**\n\t\t\t * @event clear-filters User clicked \"Clear all\" beside the active filter chips (board look). No payload.\n\t\t\t */\n\t\t\tthis.$emit('clear-filters')\n\t\t},\n\t},\n}\n</script>\n\n<!-- Styles in css/actions-bar.css -->\n"],"names":["_createElementVNode","_mergeProps","_openBlock","_createElementBlock","_renderSlot","_createBlock","_createVNode","_toDisplayString","_Fragment","_renderList","_resolveDynamicComponent","_normalizeClass","_createTextVNode"],"mappings":"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"}
1
+ {"version":3,"file":"CnActionsBar.vue3.js","sources":["../../../../src/components/CnActionsBar/CnActionsBar.vue?vue&type=template&id=4880abef&lang.js"],"sourcesContent":["<template>\n\t<div\n\t\tclass=\"cn-actions-bar\"\n\t\t:class=\"{ 'cn-actions-bar--board': isBoardLayout }\"\n\t\tdata-testid=\"cn-actions-bar\"\n\t\tv-bind=\"$attrs\">\n\t\t<!--\n\t\t\tBoard look, row 1, in the order it is read and drawn: the quick-filter\n\t\t\tchips, the saved-view chips and Save view, the Filter button and the\n\t\t\tview switch. The act controls (sort, add, menus) follow in the\n\t\t\tcluster below; row 2 (search and the active filters) comes last.\n\t\t-->\n\t\t<div v-if=\"isBoardLayout\" class=\"cn-actions-bar__row cn-actions-bar__row--views\" data-testid=\"cn-actions-bar-row-views\">\n\t\t\t<!-- @slot filters Inline filter controls (chips) at the start of the board look's row 1. -->\n\t\t\t<slot name=\"filters\" />\n\t\t\t<!--\n\t\t\t\t@slot actions-end\n\t\t\t\t@description Under the board look: saved views as chips and the Save view button, in row 1 after the quick-filter chips.\n\t\t\t-->\n\t\t\t<slot name=\"actions-end\" />\n\t\t\t<!--\n\t\t\t\tFilter and the view switch are one unit: when row 1 is full they\n\t\t\t\twrap together to the start of the next line (the DqZaken board),\n\t\t\t\tnever the switch alone.\n\t\t\t-->\n\t\t\t<div v-if=\"showSidebarToggle || (showViewToggle && viewSegments.length > 1)\"\n\t\t\t\tclass=\"cn-actions-bar__view-controls\"\n\t\t\t\tdata-testid=\"cn-actions-bar-view-controls\">\n\t\t\t\t<NcButton v-if=\"showSidebarToggle\"\n\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\tclass=\"cn-actions-bar__filter-button\"\n\t\t\t\t\tdata-testid=\"cn-actions-bar-filter-button\"\n\t\t\t\t\t:pressed=\"sidebarOpen\"\n\t\t\t\t\t@click=\"$emit('toggle-sidebar')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<Tune :size=\"16\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('nextcloud-vue', 'Filter') }}\n\t\t\t\t\t<span\n\t\t\t\t\t\tv-if=\"filterCount > 0\"\n\t\t\t\t\t\tclass=\"cn-actions-bar__filter-badge\"\n\t\t\t\t\t\tdata-testid=\"cn-actions-bar-filter-badge\"\n\t\t\t\t\t\t:aria-label=\"filterCountLabel\">{{ filterCount }}</span>\n\t\t\t\t</NcButton>\n\t\t\t\t<div v-if=\"showViewToggle && viewSegments.length > 1\"\n\t\t\t\t\tclass=\"cn-actions-bar__view-toggle\"\n\t\t\t\t\trole=\"group\"\n\t\t\t\t\t:aria-label=\"t('nextcloud-vue', 'View mode')\">\n\t\t\t\t\t<!-- A segment the page cannot open (`disabledViewModes`) is drawn, as the board does, but disabled and named so. -->\n\t\t\t\t\t<button\n\t\t\t\t\t\tv-for=\"seg in viewSegments\"\n\t\t\t\t\t\t:key=\"seg.mode\"\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-btn\"\n\t\t\t\t\t\t:class=\"{ 'cn-actions-bar__view-toggle-btn--active': viewMode === seg.mode, 'cn-actions-bar__view-toggle-btn--disabled': seg.disabled }\"\n\t\t\t\t\t\t:aria-pressed=\"viewMode === seg.mode\"\n\t\t\t\t\t\t:aria-label=\"seg.label\"\n\t\t\t\t\t\t:title=\"seg.disabled ? unavailableViewLabel(seg.label) : seg.label\"\n\t\t\t\t\t\t:disabled=\"seg.disabled\"\n\t\t\t\t\t\t:data-mode=\"seg.mode\"\n\t\t\t\t\t\t@click=\"seg.disabled || $emit('view-mode-change', seg.mode)\">\n\t\t\t\t\t\t<CnIcon v-if=\"seg.icon\"\n\t\t\t\t\t\t\t:name=\"seg.icon\"\n\t\t\t\t\t\t\t:size=\"18\"\n\t\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-icon\" />\n\t\t\t\t\t\t<component :is=\"seg.boardFallback || seg.fallback\"\n\t\t\t\t\t\t\tv-else\n\t\t\t\t\t\t\t:size=\"18\"\n\t\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-icon\" />\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div v-if=\"!isBoardLayout\" class=\"cn-actions-bar__info\">\n\t\t\t<!-- Inline search field (opt-in) -->\n\t\t\t<div v-if=\"showSearch\" class=\"cn-actions-bar__search\">\n\t\t\t\t<Magnify :size=\"18\" class=\"cn-actions-bar__search-icon\" />\n\t\t\t\t<input\n\t\t\t\t\ttype=\"search\"\n\t\t\t\t\tclass=\"cn-actions-bar__search-input\"\n\t\t\t\t\t:placeholder=\"searchPlaceholder || t('nextcloud-vue', 'Search…')\"\n\t\t\t\t\t:value=\"searchValue\"\n\t\t\t\t\t:aria-label=\"searchPlaceholder || t('nextcloud-vue', 'Search')\"\n\t\t\t\t\t@input=\"onSearchInput\">\n\t\t\t</div>\n\t\t\t<span v-else-if=\"showCount && hasTotal\" class=\"cn-actions-bar__count\">\n\t\t\t\t{{ countText }}\n\t\t\t</span>\n\t\t\t<!-- @slot after-search Refinement controls rendered beside the search field on the LEFT side of the bar (e.g. a filter menu button). Convention: the left side groups the VISUAL controls — search, filters, view toggle — while the right cluster holds the ACT controls (add, overflow); the standalone sort select is a display control too but keeps its legacy right-side placement. -->\n\t\t\t<slot name=\"after-search\" />\n\t\t\t<!-- Counter beside the search (`showCountWithSearch`): after the search and its #after-search controls. The live region stays mounted while there is no total, so results coming back after none are announced too. -->\n\t\t\t<span v-if=\"showCount && showSearch && showCountWithSearch\"\n\t\t\t\tclass=\"cn-actions-bar__count cn-actions-bar__count--beside-search\"\n\t\t\t\t:class=\"{ 'cn-actions-bar__count--empty': !hasTotal }\"\n\t\t\t\taria-live=\"polite\">{{ hasTotal ? countText : '' }}</span>\n\n\t\t\t<!-- View mode toggle (Cards / Table / List) — segmented control with\n\t\t\t a sliding thumb that animates between the N segments. Lives in\n\t\t\t the LEFT info group: switching view is a visual control like\n\t\t\t search and filters, it adds nothing — so it groups with them at\n\t\t\t every width instead of riding with the act buttons. -->\n\t\t\t<div v-if=\"showViewToggle && viewSegments.length > 1\"\n\t\t\t\tclass=\"cn-actions-bar__view-toggle\"\n\t\t\t\trole=\"group\"\n\t\t\t\t:aria-label=\"isBoardLayout ? t('nextcloud-vue', 'View') : t('nextcloud-vue', 'View mode')\">\n\t\t\t\t<!-- Sliding pill that sits behind the active segment. Width and\n\t\t\t\t offset are driven by the segment count so the same markup\n\t\t\t\t works for 2–4 segments (cards / table / list / map). -->\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"!isBoardLayout\"\n\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-thumb\"\n\t\t\t\t\t:style=\"thumbStyle\"\n\t\t\t\t\taria-hidden=\"true\" />\n\t\t\t\t<!--\n\t\t\t\t\t@event view-mode-change\n\t\t\t\t\t@description User clicked one of the view-mode toggle buttons (Cards / Table / List / Map). Payload is the selected mode string.\n\t\t\t\t\t@type {'cards' | 'table' | 'list' | 'map'}\n\t\t\t\t-->\n\t\t\t\t<button\n\t\t\t\t\tv-for=\"seg in viewSegments\"\n\t\t\t\t\t:key=\"seg.mode\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-btn\"\n\t\t\t\t\t:class=\"{ 'cn-actions-bar__view-toggle-btn--active': viewMode === seg.mode }\"\n\t\t\t\t\t:aria-pressed=\"viewMode === seg.mode\"\n\t\t\t\t\t:aria-label=\"isBoardLayout ? seg.label : null\"\n\t\t\t\t\t:title=\"isBoardLayout ? seg.label : null\"\n\t\t\t\t\t@click=\"$emit('view-mode-change', seg.mode)\">\n\t\t\t\t\t<CnIcon v-if=\"seg.icon\"\n\t\t\t\t\t\t:name=\"seg.icon\"\n\t\t\t\t\t\t:size=\"24\"\n\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-icon\" />\n\t\t\t\t\t<component :is=\"seg.fallback\"\n\t\t\t\t\t\tv-else\n\t\t\t\t\t\t:size=\"24\"\n\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-icon\" />\n\t\t\t\t\t<span v-if=\"!isBoardLayout\" class=\"cn-actions-bar__view-toggle-label\">{{ seg.label }}</span>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"cn-actions-bar__actions\">\n\t\t\t<!-- Sort select (opt-in). A standalone sort control for card/list\n\t\t\t views, which — unlike the table — have no sortable column\n\t\t\t headers. A leading sort icon replaces a visible \"Sort by\"\n\t\t\t label so the control stays on one line; the label is kept as\n\t\t\t the combobox's accessible name. -->\n\t\t\t<div v-if=\"showSortSelect && sortOptions.length\" class=\"cn-actions-bar__sort\">\n\t\t\t\t<SortVariant :size=\"20\" class=\"cn-actions-bar__sort-icon\" :aria-label=\"sortLabel\" />\n\t\t\t\t<NcSelect\n\t\t\t\t\tclass=\"cn-actions-bar__sort-select\"\n\t\t\t\t\t:modelValue=\"selectedSortOption\"\n\t\t\t\t\t:options=\"sortOptions\"\n\t\t\t\t\t:reduce=\"opt => opt.value\"\n\t\t\t\t\t:clearable=\"false\"\n\t\t\t\t\t:aria-label-combobox=\"sortLabel\"\n\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t@update:modelValue=\"onSortChange\" />\n\t\t\t</div>\n\n\t\t\t<!-- @slot filters Inline filter controls rendered inside the action bar, between the view toggle and the add/actions (e.g. a CnQuickFilterBar segmented toggle). -->\n\t\t\t<slot v-if=\"!isBoardLayout\" name=\"filters\" />\n\n\t\t\t<!-- Search / Columns sidebar toggle (opt-in). Icon-only; reflects the\n\t\t\t open state via aria-pressed so the index sidebar can default\n\t\t\t closed and be opened on demand. -->\n\t\t\t<!--\n\t\t\t\t@event toggle-sidebar\n\t\t\t\t@description User clicked the Search/Columns sidebar toggle. No payload — the host flips the sidebar open state.\n\t\t\t-->\n\t\t\t<NcButton v-if=\"showSidebarToggle && !isBoardLayout\"\n\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t:aria-label=\"t('nextcloud-vue', 'Search and columns')\"\n\t\t\t\t:title=\"t('nextcloud-vue', 'Search and columns')\"\n\t\t\t\t:pressed=\"sidebarOpen\"\n\t\t\t\t@click=\"$emit('toggle-sidebar')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Tune :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t</NcButton>\n\n\t\t\t<!--\n\t\t\t\t@slot actions\n\t\t\t\t@description Custom buttons rendered between the sidebar toggle and the primary Add button.\n\t\t\t-->\n\t\t\t<slot name=\"actions\" />\n\n\t\t\t<!--\n\t\t\t\t@event add\n\t\t\t\t@description User clicked the primary Add button. No payload.\n\t\t\t-->\n\t\t\t<!-- With `addHref` / `addTo` the button is a real link (middle-click, new tab), and still emits `add`, except on a modified click, which opens a new tab. -->\n\t\t\t<NcButton v-if=\"showAdd\"\n\t\t\t\tvariant=\"primary\"\n\t\t\t\t:disabled=\"addDisabled\"\n\t\t\t\t:href=\"addLink ? addLink.href : undefined\"\n\t\t\t\tdata-testid=\"cn-cta-primary\"\n\t\t\t\tdata-walkthrough-id=\"index-add\"\n\t\t\t\t@click=\"onAddClick\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<CnIcon v-if=\"addIcon\" :name=\"addIcon\" :size=\"20\" />\n\t\t\t\t\t<Plus v-else :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ addLabel }}\n\t\t\t</NcButton>\n\n\t\t\t<!--\n\t\t\t\t@slot actions-end\n\t\t\t\t@description Custom buttons (e.g. CnIndexPage's saved-views control) rendered AFTER the primary Add button, immediately before the overflow menu — for content that belongs grouped with \"browse/manage\" controls rather than with the app-specific buttons in `#actions`.\n\t\t\t-->\n\t\t\t<slot v-if=\"!isBoardLayout\" name=\"actions-end\" />\n\n\t\t\t<!-- In-app edit button (ADR-041): icon-only, self-wires from CnAppRoot.\n\t\t\t The board look draws it in the page header instead. -->\n\t\t\t<CnBuildiqEditButton v-if=\"showBuildiqButton\" />\n\n\t\t\t<!-- Actions menu (Refresh, Import, Export, mass actions) -->\n\t\t\t<NcActions\n\t\t\t\tv-if=\"showActionsMenu\"\n\t\t\t\t:forceName=\"true\"\n\t\t\t\t:inline=\"inlineActionCount\"\n\t\t\t\t:menuName=\"actionsMenuName\"\n\t\t\t\tdata-testid=\"cn-actions\">\n\t\t\t\t<!--\n\t\t\t\t\t@event refresh\n\t\t\t\t\t@description User clicked the Refresh entry in the overflow Actions menu. The host should re-fetch the underlying list.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton :disabled=\"refreshing || refreshDisabled\" @click=\"$emit('refresh')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<NcLoadingIcon v-if=\"refreshing\" :size=\"20\" />\n\t\t\t\t\t\t<Refresh v-else :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ refreshing ? t('nextcloud-vue', 'Refreshing…') : t('nextcloud-vue', 'Refresh') }}\n\t\t\t\t</NcActionButton>\n\n\t\t\t\t<NcActionLink v-if=\"documentationUrl\"\n\t\t\t\t\t:href=\"documentationUrl\"\n\t\t\t\t\ttarget=\"_blank\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<BookOpenVariantOutline :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ documentationLabel }}\n\t\t\t\t</NcActionLink>\n\n\t\t\t\t<!-- Manifest-declared page-level header actions (overflow); an entry with `href` / `to` is a real link. -->\n\t\t\t\t<template v-for=\"{ entry, link } in renderedHeaderActions\" :key=\"entry.id\">\n\t\t\t\t\t<NcActionLink\n\t\t\t\t\t\tv-if=\"link\"\n\t\t\t\t\t\t:href=\"link.href\"\n\t\t\t\t\t\t:target=\"link.target\"\n\t\t\t\t\t\tcloseAfterClick\n\t\t\t\t\t\t@click=\"onHeaderLinkClick(entry, link, $event)\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<CnIcon v-if=\"entry.icon && isMdiIconName(entry.icon)\" :name=\"entry.icon\" :size=\"20\" />\n\t\t\t\t\t\t\t<span v-else-if=\"entry.icon\"\n\t\t\t\t\t\t\t\tclass=\"cn-actions-bar__header-action-icon\"\n\t\t\t\t\t\t\t\t:class=\"[entry.icon]\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t{{ entry.label ? effectiveTranslate(entry.label) : entry.label }}\n\t\t\t\t\t</NcActionLink>\n\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\tv-else\n\t\t\t\t\t\t:disabled=\"Boolean(entry.disabled)\"\n\t\t\t\t\t\t@click=\"$emit('header-action', { action: entry.id, id: entry.id })\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<CnIcon v-if=\"entry.icon && isMdiIconName(entry.icon)\" :name=\"entry.icon\" :size=\"20\" />\n\t\t\t\t\t\t\t<span v-else-if=\"entry.icon\"\n\t\t\t\t\t\t\t\tclass=\"cn-actions-bar__header-action-icon\"\n\t\t\t\t\t\t\t\t:class=\"[entry.icon]\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t{{ entry.label ? effectiveTranslate(entry.label) : entry.label }}\n\t\t\t\t\t</NcActionButton>\n\t\t\t\t</template>\n\n\t\t\t\t<!--\n\t\t\t\t\t@slot action-items\n\t\t\t\t\t@description Additional NcActionButton-family items rendered inside the overflow menu, between the built-in Refresh entry and the mass-actions separator. Use for app-level page actions.\n\t\t\t\t-->\n\t\t\t\t<slot name=\"action-items\" />\n\n\t\t\t\t<!-- Separator between primary and mass actions. Hidden when the\n\t\t\t\t inline-action-count hoists every pre-separator item out of the\n\t\t\t\t overflow, which would otherwise leave the separator orphaned. -->\n\t\t\t\t<NcActionSeparator v-if=\"showActionsSeparator\" />\n\n\t\t\t\t<!-- Mass actions (overflow) -->\n\t\t\t\t<!--\n\t\t\t\t\t@event show-import\n\t\t\t\t\t@description User clicked the Import mass action. Host should open the import modal.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-if=\"showMassImport\"\n\t\t\t\t\t@click=\"$emit('show-import')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<Import :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('nextcloud-vue', 'Import') }}\n\t\t\t\t</NcActionButton>\n\t\t\t\t<!--\n\t\t\t\t\t@event show-export\n\t\t\t\t\t@description User clicked the Export mass action. Host should open the export modal.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-if=\"showMassExport\"\n\t\t\t\t\t@click=\"$emit('show-export')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<Export :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('nextcloud-vue', 'Export') }}\n\t\t\t\t</NcActionButton>\n\t\t\t\t<!--\n\t\t\t\t\t@event show-copy\n\t\t\t\t\t@description User clicked the Copy-selected mass action. Disabled while no row is selected.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-if=\"showMassCopy\"\n\t\t\t\t\t:disabled=\"selectedIds.length < 1\"\n\t\t\t\t\t:title=\"selectedIds.length < 1 ? t('nextcloud-vue', 'Select 1 or more items to copy') : ''\"\n\t\t\t\t\t@click=\"$emit('show-copy')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<ContentCopy :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('nextcloud-vue', 'Copy selected') }}\n\t\t\t\t</NcActionButton>\n\t\t\t\t<!--\n\t\t\t\t\t@event show-delete\n\t\t\t\t\t@description User clicked the Delete-selected mass action. Disabled while no row is selected.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-if=\"showMassDelete\"\n\t\t\t\t\t:disabled=\"selectedIds.length < 1\"\n\t\t\t\t\t:title=\"selectedIds.length < 1 ? t('nextcloud-vue', 'Select 1 or more items to delete') : ''\"\n\t\t\t\t\t@click=\"$emit('show-delete')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<TrashCanOutline :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('nextcloud-vue', 'Delete selected') }}\n\t\t\t\t</NcActionButton>\n\n\t\t\t\t<!--\n\t\t\t\t\t@slot mass-actions\n\t\t\t\t\t@description Additional mass-action NcActionButtons rendered at the bottom of the overflow menu. Scope receives the current selection count and ids so the host can disable / label per selection.\n\t\t\t\t\t@binding {number} count Length of the current selection.\n\t\t\t\t\t@binding {Array<string|number>} selected-ids The selected row ids.\n\t\t\t\t-->\n\t\t\t\t<slot name=\"mass-actions\" :count=\"selectedIds.length\" :selectedIds=\"selectedIds\" />\n\t\t\t</NcActions>\n\t\t</div>\n\n\t\t<!-- Board look, row 2: the search field, then the active filters. -->\n\t\t<div v-if=\"isBoardLayout\" class=\"cn-actions-bar__row cn-actions-bar__row--search\" data-testid=\"cn-actions-bar-row-search\">\n\t\t\t<div v-if=\"showSearch\" class=\"cn-actions-bar__search\">\n\t\t\t\t<Magnify :size=\"18\" class=\"cn-actions-bar__search-icon\" />\n\t\t\t\t<input\n\t\t\t\t\ttype=\"search\"\n\t\t\t\t\tclass=\"cn-actions-bar__search-input\"\n\t\t\t\t\t:placeholder=\"searchPlaceholder || t('nextcloud-vue', 'Search…')\"\n\t\t\t\t\t:value=\"searchValue\"\n\t\t\t\t\t:aria-label=\"searchPlaceholder || t('nextcloud-vue', 'Search')\"\n\t\t\t\t\t@input=\"onSearchInput\">\n\t\t\t</div>\n\t\t\t<span v-else-if=\"showCount && hasTotal\" class=\"cn-actions-bar__count\">\n\t\t\t\t{{ countText }}\n\t\t\t</span>\n\t\t\t<slot name=\"after-search\" />\n\t\t\t<!-- Board look, row 2: the active filters as removable chips and a\n\t\t\t \"Clear all\" link, after the search field. -->\n\t\t\t<template v-if=\"activeFilterChips.length > 0\">\n\t\t\t\t<span class=\"cn-actions-bar__active-label\" data-testid=\"cn-actions-bar-active-label\">{{ t('nextcloud-vue', 'Active:') }}</span>\n\t\t\t\t<span\n\t\t\t\t\tv-for=\"chip in activeFilterChips\"\n\t\t\t\t\t:key=\"chip.key\"\n\t\t\t\t\tclass=\"cn-actions-bar__filter-chip\"\n\t\t\t\t\tdata-testid=\"cn-actions-bar-filter-chip\">\n\t\t\t\t\t<span class=\"cn-actions-bar__filter-chip-label\">{{ chip.label }}</span>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"cn-actions-bar__filter-chip-remove\"\n\t\t\t\t\t\t:aria-label=\"removeFilterLabel(chip)\"\n\t\t\t\t\t\t@click=\"$emit('remove-filter', chip)\">\n\t\t\t\t\t\t<Close :size=\"14\" aria-hidden=\"true\" />\n\t\t\t\t\t</button>\n\t\t\t\t</span>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"cn-actions-bar__clear-all\"\n\t\t\t\t\tdata-testid=\"cn-actions-bar-clear-all\"\n\t\t\t\t\t@click=\"$emit('clear-filters')\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Clear all') }}\n\t\t\t\t</button>\n\t\t\t</template>\n\t\t\t<span v-if=\"showCount && showSearch && showCountWithSearch\"\n\t\t\t\tclass=\"cn-actions-bar__count cn-actions-bar__count--beside-search\"\n\t\t\t\t:class=\"{ 'cn-actions-bar__count--empty': !hasTotal }\"\n\t\t\t\taria-live=\"polite\">{{ hasTotal ? countText : '' }}</span>\n\t\t</div>\n\n\t\t<!-- Always-present live region for the selection count (WCAG 2.1\n\t\t SC 4.1.3 Status Messages): a `role=\"status\"` element must exist\n\t\t BEFORE its content changes for assistive tech to announce it, so\n\t\t it cannot live inside the v-if'd strip below. -->\n\t\t<span class=\"cn-actions-bar__sr-status\" role=\"status\">\n\t\t\t{{ selectable && selectedIds.length > 0 ? selectionCountText : '' }}\n\t\t</span>\n\n\t\t<!-- Contextual selection strip (the Proton Pass / Gmail / Files\n\t\t pattern): appears while a selection is active, carrying the\n\t\t visible count, the built-in selection-scoped mass actions, the\n\t\t host's own bulk buttons (#selection-actions) and a Clear control.\n\t\t This strip is the discoverable surface for bulk actions; the\n\t\t BUILT-IN Copy/Delete-selected also stay listed in the overflow\n\t\t menu above, while a host decides for its own actions (strip-only\n\t\t is fine — keepiq does exactly that). -->\n\t\t<div\n\t\t\tv-if=\"!isBoardLayout && selectable && selectedIds.length > 0\"\n\t\t\tclass=\"cn-actions-bar__selection\"\n\t\t\tdata-testid=\"cn-selection-strip\">\n\t\t\t<span class=\"cn-actions-bar__selection-count\" aria-hidden=\"true\">\n\t\t\t\t{{ selectionCountText }}\n\t\t\t</span>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"showMassCopy\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t@click=\"$emit('show-copy')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<ContentCopy :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Copy selected') }}\n\t\t\t</NcButton>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"showMassDelete\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t@click=\"$emit('show-delete')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<TrashCanOutline :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Delete selected') }}\n\t\t\t</NcButton>\n\t\t\t<!--\n\t\t\t\tDeclarative bulk actions, from `bulkActions`. They render in the\n\t\t\t\tSAME strip as a host's slot buttons and before them, so a page\n\t\t\t\tthat declares some in its manifest and hand-writes others gets\n\t\t\t\tone row of buttons rather than two groups in different places.\n\t\t\t\t@event bulk-action\n\t\t\t\t@description User clicked a declarative bulk action. Payload carries the action id AND the selection, because a bulk action without its selection is not a bulk action.\n\t\t\t-->\n\t\t\t<NcButton\n\t\t\t\tv-for=\"entry in bulkActions\"\n\t\t\t\t:key=\"entry.id\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t:disabled=\"entry.disabled === true\"\n\t\t\t\t:data-testid=\"`cn-bulk-action-${entry.id}`\"\n\t\t\t\t:lang=\"bulkLang(entry)\"\n\t\t\t\t@click=\"$emit('bulk-action', { id: entry.id, action: entry.id, selectedIds, count: selectedIds.length })\">\n\t\t\t\t{{ entry.label ? effectiveTranslate(entry.label) : entry.label }}\n\t\t\t</NcButton>\n\t\t\t<!--\n\t\t\t\t@slot selection-actions The host app's bulk-action buttons (NcButton family), rendered inside the contextual selection strip that appears while a selection is active. This strip is the primary bulk-actions surface; #mass-actions remains available for hosts that ALSO want the actions listed in the overflow menu (optional — strip-only is fine).\n\t\t\t\t@binding {number} count Length of the current selection.\n\t\t\t\t@binding {Array<string|number>} selected-ids The selected row ids.\n\t\t\t-->\n\t\t\t<slot\n\t\t\t\tname=\"selection-actions\"\n\t\t\t\t:count=\"selectedIds.length\"\n\t\t\t\t:selectedIds=\"selectedIds\" />\n\t\t\t<!--\n\t\t\t\t@event clear-selection\n\t\t\t\t@description User clicked the selection strip's Clear control. The host should empty its selection (CnIndexPage does this for you and re-emits `select` with an empty array).\n\t\t\t-->\n\t\t\t<!-- No aria-label: the visible \"Clear selection\" text IS the\n\t\t\t accessible name (review: an override here is redundant). -->\n\t\t\t<NcButton\n\t\t\t\tclass=\"cn-actions-bar__selection-clear\"\n\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t@click=\"$emit('clear-selection')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Close :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Clear selection') }}\n\t\t\t</NcButton>\n\t\t</div>\n\t</div>\n\n\t<!--\n\t\tBoard look: the bulk band is its own row between the toolbar and the\n\t\ttable card, outside the toolbar element, and only while rows are\n\t\tselected. The count stays announced by the live region above.\n\t-->\n\t<div\n\t\tv-if=\"isBoardLayout && selectable && selectedIds.length > 0\"\n\t\tclass=\"cn-actions-bar__band\"\n\t\trole=\"region\"\n\t\t:aria-label=\"t('nextcloud-vue', 'Actions for the selection')\"\n\t\tdata-testid=\"cn-bulk-band\">\n\t\t<strong class=\"cn-actions-bar__band-lead\">{{ bulkBandLead }}</strong>\n\t\t<NcButton\n\t\t\tv-if=\"showMassCopy\"\n\t\t\tvariant=\"secondary\"\n\t\t\t@click=\"$emit('show-copy')\">\n\t\t\t{{ t('nextcloud-vue', 'Copy selected') }}\n\t\t</NcButton>\n\t\t<NcButton\n\t\t\tv-if=\"showMassDelete\"\n\t\t\tvariant=\"secondary\"\n\t\t\t@click=\"$emit('show-delete')\">\n\t\t\t{{ t('nextcloud-vue', 'Delete selected') }}\n\t\t</NcButton>\n\t\t<NcButton\n\t\t\tv-for=\"entry in bulkActions\"\n\t\t\t:key=\"entry.id\"\n\t\t\tvariant=\"secondary\"\n\t\t\t:disabled=\"entry.disabled === true\"\n\t\t\t:data-testid=\"`cn-bulk-action-${entry.id}`\"\n\t\t\t:lang=\"bulkLang(entry)\"\n\t\t\t@click=\"$emit('bulk-action', { id: entry.id, action: entry.id, selectedIds, count: selectedIds.length })\">\n\t\t\t{{ entry.label ? effectiveTranslate(entry.label) : entry.label }}\n\t\t</NcButton>\n\t\t<slot\n\t\t\tname=\"selection-actions\"\n\t\t\t:count=\"selectedIds.length\"\n\t\t\t:selectedIds=\"selectedIds\" />\n\t\t<span v-if=\"bulkHint\" class=\"cn-actions-bar__band-hint\" data-testid=\"cn-bulk-band-hint\">{{ bulkHint }}</span>\n\t</div>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcActionButton, NcActionLink, NcActions, NcActionSeparator, NcButton, NcLoadingIcon, NcSelect } from '@nextcloud/vue'\nimport BookOpenVariantOutline from 'vue-material-design-icons/BookOpenVariantOutline.vue'\nimport CalendarMonthOutline from 'vue-material-design-icons/CalendarMonthOutline.vue'\nimport Close from 'vue-material-design-icons/Close.vue'\nimport ContentCopy from 'vue-material-design-icons/ContentCopy.vue'\nimport Export from 'vue-material-design-icons/Export.vue'\nimport FormatListBulleted from 'vue-material-design-icons/FormatListBulleted.vue'\nimport FormatListBulletedSquare from 'vue-material-design-icons/FormatListBulletedSquare.vue'\nimport Import from 'vue-material-design-icons/Import.vue'\nimport Magnify from 'vue-material-design-icons/Magnify.vue'\nimport MapMarkerOutline from 'vue-material-design-icons/MapMarkerOutline.vue'\nimport Plus from 'vue-material-design-icons/Plus.vue'\nimport Refresh from 'vue-material-design-icons/Refresh.vue'\nimport SortVariant from 'vue-material-design-icons/SortVariant.vue'\nimport TrashCanOutline from 'vue-material-design-icons/TrashCanOutline.vue'\nimport Tune from 'vue-material-design-icons/Tune.vue'\nimport ViewColumnOutline from 'vue-material-design-icons/ViewColumnOutline.vue'\nimport ViewGridOutline from 'vue-material-design-icons/ViewGridOutline.vue'\nimport ViewListOutline from 'vue-material-design-icons/ViewListOutline.vue'\nimport CnBuildiqEditButton from '../CnBuildiqEditButton/CnBuildiqEditButton.vue'\nimport { normalizeLook } from '../../composables/useLook.js'\nimport { followItemActionLink, resolveItemActionLink } from '../../utils/actionLink.js'\nimport { isModifiedClick } from '../../utils/linkNavigation.js'\nimport { labelLang } from '../../utils/manifestTranslate.js'\nimport { CnIcon } from '../CnIcon/index.js'\n\n/**\n * CnActionsBar — Reusable actions toolbar with count, mass actions, and primary actions.\n *\n * ```vue\n * <CnActionsBar\n * :pagination=\"pagination\"\n * :object-count=\"items.length\"\n * add-label=\"Add Client\"\n * add-icon=\"AccountGroup\"\n * @add=\"createNew\"\n * @refresh=\"reload\" />\n * ```\n */\nexport default {\n\tname: 'CnActionsBar',\n\n\tcomponents: {\n\t\tCnBuildiqEditButton,\n\t\tNcActions,\n\t\tNcActionButton,\n\t\tNcActionLink,\n\t\tNcActionSeparator,\n\t\tNcButton,\n\t\tNcLoadingIcon,\n\t\tNcSelect,\n\t\tCnIcon,\n\t\tSortVariant,\n\t\tBookOpenVariantOutline,\n\t\tClose,\n\t\tPlus,\n\t\tRefresh,\n\t\tContentCopy,\n\t\tTrashCanOutline,\n\t\tImport,\n\t\tExport,\n\t\tMagnify,\n\t\tTune,\n\t\tViewColumnOutline,\n\t\tViewGridOutline,\n\t\tFormatListBulleted,\n\t\tFormatListBulletedSquare,\n\t\tCalendarMonthOutline,\n\t\tMapMarkerOutline,\n\t},\n\n\tinject: {\n\t\t/** The look CnAppRoot provides; `board` draws the two-row toolbar. */\n\t\tcnLook: { default: 'nextcloud' },\n\t\t/**\n\t\t * Host translate function provided by CnAppRoot as\n\t\t * `cnTranslate: this.translate` (bound to the host app's id). The\n\t\t * manifest-authored `headerActions[].label` is run through it — the\n\t\t * entry is keyed and emitted by `id`, so only the visible text\n\t\t * changes. Defaults to an identity function so an untranslated key\n\t\t * renders as itself.\n\t\t */\n\t\tcnTranslate: { default: () => (key) => key },\n\t},\n\n\t// Attributes go on the toolbar element, not on the fragment (the toolbar\n\t// plus, under the board look, the bulk band).\n\tinheritAttrs: false,\n\n\tprops: {\n\t\t/**\n\t\t * `board` draws the toolbar of the board look: no band, two rows (saved\n\t\t * views, Filter and the view switch; then the search field and the\n\t\t * active filters). Empty follows the `cnLook` the app provides.\n\t\t *\n\t\t * @type {('' | 'board' | 'nextcloud')}\n\t\t * @spec openspec/changes/screens-index-list-parity/specs/index-list-board-look/spec.md#requirement-the-toolbar-sits-on-the-ground-in-two-rows\n\t\t */\n\t\tlayout: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * The active filters as chips for row 2 of the board toolbar:\n\t\t * `{ key, label }`, the label reading \"Team: Woo\". Removing one emits\n\t\t * `remove-filter` with the chip; \"Clear all\" emits `clear-filters`.\n\t\t *\n\t\t * @type {Array<{key: string, label: string}>}\n\t\t */\n\t\tactiveFilterChips: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * Board look: view modes the switch draws although the page cannot\n\t\t * open them, as disabled segments (the boards always draw table, cards,\n\t\t * board and map). Ignored without the board look.\n\t\t *\n\t\t * @type {Array<string>}\n\t\t * @spec openspec/changes/screens-view-switch-parity/specs/view-switch-board-look/spec.md#requirement-the-manifest-can-draw-segments-the-page-cannot-open\n\t\t */\n\t\tdisabledViewModes: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * The number on the Filter button's badge. Empty (`null`) counts the\n\t\t * `activeFilterChips`.\n\t\t *\n\t\t * @type {(number|null)}\n\t\t */\n\t\tactiveFilterCount: {\n\t\t\ttype: Number,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Whether the bar draws the in-app buildiq edit button. A page that\n\t\t * draws it in its own header (the board look) passes false so there\n\t\t * is one square, not two.\n\t\t */\n\t\tshowBuildiqButton: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** The plural the board bulk band names (\"With the selected cases\"). */\n\t\tbulkNoun: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** The 13px hint after the board bulk band's buttons (`config.bulkHint`). */\n\t\tbulkHint: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Pagination state: { total, page, pages, limit } */\n\t\tpagination: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** Number of currently visible objects (for \"Showing X of Y\") */\n\t\tobjectCount: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\n\t\t/** Whether rows/cards can be selected */\n\t\tselectable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Currently selected IDs */\n\t\tselectedIds: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** Label for the Add button */\n\t\taddLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Add'),\n\t\t},\n\n\t\t/** MDI icon name for the Add button (e.g. 'AccountGroup'). Falls back to Plus icon. */\n\t\taddIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * URL the Add button links to. Makes the button a real link (middle-click,\n\t\t * open in new tab) that still emits `add` on click. `addTo` is ignored when set.\n\t\t *\n\t\t * @type {string|null}\n\t\t */\n\t\taddHref: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * vue-router location (path or `{ name, params }`) the Add button links to.\n\t\t * The button becomes a real link whose plain click routes in place and still\n\t\t * emits `add`; the host must then not navigate on `add` itself. Ignored when\n\t\t * the router cannot resolve it.\n\t\t *\n\t\t * @type {string|object|null}\n\t\t */\n\t\taddTo: {\n\t\t\ttype: [String, Object],\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** How many action buttons to show inline (rest go in overflow dropdown) */\n\t\tinlineActionCount: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\n\t\t/** Whether to show the built-in mass Import action */\n\t\tshowMassImport: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Whether to show the built-in mass Export action */\n\t\tshowMassExport: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Whether to show the built-in mass Copy action */\n\t\tshowMassCopy: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Whether to show the built-in mass Delete action */\n\t\tshowMassDelete: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Current view mode: 'table', 'cards', 'list', or 'map' */\n\t\tviewMode: {\n\t\t\ttype: String,\n\t\t\tdefault: 'table',\n\t\t\tvalidator: (v) => ['table', 'cards', 'list', 'map', 'calendar'].includes(v),\n\t\t},\n\n\t\t/**\n\t\t * Which view-mode segments to render, in order. Defaults to the\n\t\t * historical two-segment control; add `'list'` to expose the list view.\n\t\t *\n\t\t * @type {Array<'cards' | 'table' | 'list' | 'calendar'>}\n\t\t */\n\t\tavailableViewModes: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => ['cards', 'table'],\n\t\t\tvalidator: (modes) => modes.every((m) => ['cards', 'table', 'list', 'calendar'].includes(m)),\n\t\t},\n\n\t\t/** Whether to show the view-mode toggle */\n\t\tshowViewToggle: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Label for the cards/grid view-toggle option (defaults to \"Cards\") */\n\t\tcardsLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Label for the table/list view-toggle option (defaults to \"Table\") */\n\t\ttableLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** MDI icon name for the cards option (defaults to the built-in grid icon). Resolved via CnIcon. */\n\t\tcardsIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** MDI icon name for the table option (defaults to the built-in list icon). Resolved via CnIcon. */\n\t\ttableIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Whether to render the \"Map\" segment in the view toggle (back-compat bridge; equivalent to adding 'map' to `availableViewModes`). */\n\t\tshowMap: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Label for the map view-toggle option (defaults to \"Map\"). */\n\t\tmapLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** MDI icon name for the map option (defaults to the built-in map-marker icon). Resolved via CnIcon. */\n\t\tmapIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Label for the list view-toggle option (defaults to \"List\") */\n\t\tlistLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** MDI icon name for the list option (defaults to the built-in list icon). Resolved via CnIcon. */\n\t\tlistIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Show a standalone sort dropdown (useful in card/list views). */\n\t\tshowSortSelect: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Options for the sort dropdown.\n\t\t *\n\t\t * @type {Array<{ value: string, label: string }>}\n\t\t */\n\t\tsortOptions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** The currently selected sort option value (controlled). */\n\t\tsortValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Accessible label for the sort dropdown. */\n\t\tsortLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Sort by'),\n\t\t},\n\n\t\t/** Whether to show the inline search field on the left of the bar */\n\t\tshowSearch: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Current value of the inline search field (controlled) */\n\t\tsearchValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Placeholder / accessible label for the inline search field */\n\t\tsearchPlaceholder: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * Keep the \"Showing X of Y\" counter visible beside the inline search field,\n\t\t * after any `#after-search` controls. By default the search field takes the\n\t\t * counter's place. No effect without `showSearch`.\n\t\t */\n\t\tshowCountWithSearch: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Whether the refresh action is currently in progress */\n\t\trefreshing: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Whether the refresh action is disabled (e.g. when required selections are missing) */\n\t\trefreshDisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Whether the Add button is disabled (e.g. when required selections are missing) */\n\t\taddDisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Whether to show the Add button */\n\t\tshowAdd: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/**\n\t\t * Whether the \"Showing 20 of 258\" line renders where the search field\n\t\t * is not. `false` drops it, for a page whose title line already says\n\t\t * how many there are. True by default.\n\t\t *\n\t\t * @spec openspec/changes/zuiddrecht-pixel-gaps-3/specs/zuiddrecht-pixel-gaps-3/spec.md#requirement-an-index-page-can-take-the-board-header\n\t\t */\n\t\tshowCount: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/**\n\t\t * Whether the overflow Actions menu (Refresh, Import, Export, mass\n\t\t * actions, header actions) renders. `false` drops it, for a page that\n\t\t * offers its actions as buttons elsewhere (CnIndexPage\n\t\t * `headerButtons`). True by default.\n\t\t *\n\t\t * @spec openspec/changes/zuiddrecht-pixel-gaps-3/specs/zuiddrecht-pixel-gaps-3/spec.md#requirement-an-index-page-can-take-the-board-header\n\t\t */\n\t\tshowActionsMenu: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/**\n\t\t * Whether to show the Search/Columns sidebar toggle button. Lets the\n\t\t * index sidebar default to closed and be opened on demand.\n\t\t */\n\t\tshowSidebarToggle: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Current open state of the sidebar (controls the toggle's pressed state). */\n\t\tsidebarOpen: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Manifest-declared page-level actions rendered in the overflow\n\t\t * dropdown between Refresh and the `#action-items` slot. Each\n\t\t * entry is `{ id, label, icon?, disabled? }`. The bar emits\n\t\t * `@header-action({ action: id, id })` on click; handler\n\t\t * resolution happens upstream (CnIndexPage). An entry with `href`\n\t\t * (URL) or `to` (vue-router location) renders as a real link, with\n\t\t * `linkTarget` as its `target`; it still emits `header-action`, so the\n\t\t * host must not navigate for it again.\n\t\t *\n\t\t * @type {Array<{ id: string, label: string, icon?: string, disabled?: boolean, href?: string, to?: string|object, linkTarget?: string }>}\n\t\t */\n\t\theaderActions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * Declarative bulk actions, rendered in the contextual selection strip\n\t\t * that appears while a selection is active.\n\t\t *\n\t\t * The strip already had a `#selection-actions` slot, which only a\n\t\t * hand-written host component can fill — so a page declared in an app\n\t\t * manifest could carry row actions and header actions but never a bulk\n\t\t * one. This prop is that missing vocabulary; the slot stays, and both\n\t\t * render side by side in one row.\n\t\t *\n\t\t * Clicking emits `bulk-action` with the id AND the current selection.\n\t\t *\n\t\t * @type {Array<{ id: string, label: string, icon?: string, disabled?: boolean }>}\n\t\t */\n\t\tbulkActions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * When set, adds a Documentation entry to the overflow menu (after\n\t\t * Refresh, before headerActions). Opens the URL in a new tab.\n\t\t * Empty string hides the entry.\n\t\t */\n\t\tdocumentationUrl: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Label for the Documentation overflow entry. */\n\t\tdocumentationLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Documentation'),\n\t\t},\n\t},\n\n\temits: [\n\t\t'add',\n\t\t'bulk-action',\n\t\t'clear-filters',\n\t\t'clear-selection',\n\t\t'header-action',\n\t\t'refresh',\n\t\t'remove-filter',\n\t\t'search',\n\t\t'show-copy',\n\t\t'show-delete',\n\t\t'show-export',\n\t\t'show-import',\n\t\t'sort-change',\n\t\t'toggle-sidebar',\n\t\t'view-mode-change',\n\t],\n\n\tcomputed: {\n\t\t/**\n\t\t * Whether the board toolbar is drawn: the `layout` prop, else the look\n\t\t * the app provides.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tisBoardLayout() {\n\t\t\tif (this.layout) {\n\t\t\t\treturn this.layout === 'board'\n\t\t\t}\n\t\t\treturn normalizeLook(this.cnLook) === 'board'\n\t\t},\n\n\t\t/**\n\t\t * The number on the Filter button.\n\t\t *\n\t\t * @return {number}\n\t\t */\n\t\tfilterCount() {\n\t\t\treturn typeof this.activeFilterCount === 'number' ? this.activeFilterCount : this.activeFilterChips.length\n\t\t},\n\n\t\t/**\n\t\t * The accessible name of the Filter badge.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tfilterCountLabel() {\n\t\t\treturn t('nextcloud-vue', '{count} active', { count: this.filterCount })\n\t\t},\n\n\t\t/**\n\t\t * The bold lead of the board bulk band.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tbulkBandLead() {\n\t\t\treturn t('nextcloud-vue', 'With the selected {plural}', { plural: this.bulkNoun || t('nextcloud-vue', 'items') })\n\t\t},\n\n\t\t/**\n\t\t * Name of the overflow Actions menu. Library chrome, so it resolves\n\t\t * against the LIBRARY catalogue — it was a bare `menu-name=\"Actions\"`\n\t\t * literal, which rendered \"Actions\" in a Dutch session next to an\n\t\t * otherwise fully translated toolbar even though the catalogue has\n\t\t * carried \"Acties\" all along.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tactionsMenuName() {\n\t\t\treturn t('nextcloud-vue', 'Actions')\n\t\t},\n\n\t\t/**\n\t\t * The selection strip's count text — also fed to the always-present\n\t\t * `role=\"status\"` live region (WCAG 2.1 SC 4.1.3), so assistive tech\n\t\t * announces selection changes without focus moving.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tselectionCountText() {\n\t\t\treturn t('nextcloud-vue', '{count} selected', { count: this.selectedIds.length })\n\t\t},\n\n\t\t/**\n\t\t * Effective translate function: the injected `cnTranslate` (the host\n\t\t * app's bound `t()`), identity by default.\n\t\t *\n\t\t * @return {(key: string) => string}\n\t\t */\n\t\teffectiveTranslate() {\n\t\t\treturn typeof this.cnTranslate === 'function' ? this.cnTranslate : (key) => key\n\t\t},\n\n\t\t/**\n\t\t * The link the Add button renders as, or null for a plain button.\n\t\t *\n\t\t * @return {object|null}\n\t\t */\n\t\taddLink() {\n\t\t\tif (this.addDisabled) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn resolveItemActionLink({ href: this.addHref, to: this.addTo }, null, this.$router)\n\t\t},\n\n\t\t/**\n\t\t * Header actions paired with the link each renders as (null for a button).\n\t\t *\n\t\t * @return {Array<{entry: object, link: object|null}>}\n\t\t */\n\t\trenderedHeaderActions() {\n\t\t\treturn (this.headerActions || []).map((entry) => ({\n\t\t\t\tentry,\n\t\t\t\tlink: entry.disabled ? null : resolveItemActionLink(entry, null, this.$router),\n\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * Whether there is a non-empty total for the \"Showing X of Y\" counter.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\thasTotal() {\n\t\t\treturn Boolean(this.pagination && this.pagination.total > 0)\n\t\t},\n\n\t\tcountText() {\n\t\t\tif (!this.pagination) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\treturn t('nextcloud-vue', 'Showing {count} of {total}', { count: this.objectCount, total: this.pagination.total })\n\t\t},\n\n\t\t/**\n\t\t * The view-toggle segments (label + icon) derived from `availableViewModes`,\n\t\t * with a back-compat bridge that appends the map segment when the beta-era\n\t\t * `showMap` prop is set. `icon` is a CnIcon name (empty → the built-in\n\t\t * `fallback` component).\n\t\t */\n\t\tviewSegments() {\n\t\t\tconst defs = {\n\t\t\t\tcards: { label: this.cardsLabel || t('nextcloud-vue', 'Cards'), icon: this.cardsIcon, fallback: ViewGridOutline },\n\t\t\t\ttable: { label: this.tableLabel || t('nextcloud-vue', 'Table'), icon: this.tableIcon, fallback: FormatListBulletedSquare },\n\t\t\t\tlist: { label: this.listLabel || t('nextcloud-vue', 'List'), icon: this.listIcon, fallback: ViewListOutline },\n\t\t\t\tmap: { label: this.mapLabel || t('nextcloud-vue', 'Map'), icon: this.mapIcon, fallback: MapMarkerOutline },\n\t\t\t\tcalendar: { label: t('nextcloud-vue', 'Calendar'), icon: '', fallback: CalendarMonthOutline },\n\t\t\t}\n\t\t\tconst modes = [...this.availableViewModes]\n\t\t\tif (this.showMap && !modes.includes('map')) {\n\t\t\t\tmodes.push('map')\n\t\t\t}\n\t\t\tif (this.isBoardLayout) {\n\t\t\t\t// The board look's fixed order: table, cards, board, map, each\n\t\t\t\t// only when the page offers it. A mode the board switch does not\n\t\t\t\t// name (list, calendar) follows, so it is never lost.\n\t\t\t\tdefs.board = { label: t('nextcloud-vue', 'Board'), icon: '', fallback: ViewColumnOutline }\n\t\t\t\t// The board's list icon: plain bullets, not the boxed ones.\n\t\t\t\tdefs.table.boardFallback = FormatListBulleted\n\t\t\t\tconst disabled = (this.disabledViewModes || []).filter((mode) => !modes.includes(mode))\n\t\t\t\tconst all = [...modes, ...disabled]\n\t\t\t\tconst fixed = ['table', 'cards', 'board', 'map']\n\t\t\t\tconst rest = all.filter((mode) => !fixed.includes(mode))\n\t\t\t\treturn [...fixed.filter((mode) => all.includes(mode)), ...rest]\n\t\t\t\t\t.filter((mode) => defs[mode])\n\t\t\t\t\t.map((mode) => ({ mode, ...defs[mode], disabled: disabled.includes(mode) }))\n\t\t\t}\n\t\t\treturn modes\n\t\t\t\t.filter((mode) => defs[mode])\n\t\t\t\t.map((mode) => ({ mode, ...defs[mode] }))\n\t\t},\n\n\t\t/** The full sort option object matching `sortValue` (for NcSelect). */\n\t\tselectedSortOption() {\n\t\t\treturn this.sortOptions.find((o) => o.value === this.sortValue) || null\n\t\t},\n\n\t\t/** Sliding-thumb width + offset, driven by the active segment index. */\n\t\tthumbStyle() {\n\t\t\tconst count = this.viewSegments.length || 1\n\t\t\tconst activeIndex = Math.max(0, this.viewSegments.findIndex((s) => s.mode === this.viewMode))\n\t\t\treturn {\n\t\t\t\twidth: `calc((100% - 8px) / ${count})`,\n\t\t\t\ttransform: `translateX(${activeIndex * 100}%)`,\n\t\t\t}\n\t\t},\n\n\t\thasMassActions() {\n\t\t\treturn this.showMassImport || this.showMassExport || this.showMassCopy || this.showMassDelete\n\t\t},\n\n\t\t/**\n\t\t * Count meaningful VNodes in the `#action-items` slot (excludes whitespace\n\t\t * text nodes and comments). Used to decide whether the mass-actions\n\t\t * separator would be orphaned by `inlineActionCount`.\n\t\t */\n\t\tactionItemsCount() {\n\t\t\tconst slot = this.$slots['action-items']\n\t\t\tif (!slot) {\n\t\t\t\treturn 0\n\t\t\t}\n\t\t\tconst vnodes = slot() || []\n\t\t\treturn vnodes.filter((n) => n && (n.tag !== undefined || n.componentOptions !== undefined)).length\n\t\t},\n\n\t\t/**\n\t\t * The separator is meaningful only when at least one pre-separator action\n\t\t * button (Refresh + #action-items) still ends up inside the overflow\n\t\t * dropdown after NcActions hoists the first `inlineActionCount` buttons\n\t\t * inline. Pre-separator items: 1 (Refresh) + actionItemsCount.\n\t\t */\n\t\tshowActionsSeparator() {\n\t\t\tif (!this.hasMassActions) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tif (!this.$slots['action-items']) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst preSeparatorOverflow = 1 + this.actionItemsCount - this.inlineActionCount\n\t\t\treturn preSeparatorOverflow > 0\n\t\t},\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * The tooltip of a segment the page cannot open.\n\t\t *\n\t\t * @param {string} label The segment's name.\n\t\t * @return {string} \"Map: not available on this list\".\n\t\t */\n\t\tunavailableViewLabel(label) {\n\t\t\treturn t('nextcloud-vue', '{view}: not available on this list', { view: label })\n\t\t},\n\n\t\t/**\n\t\t * The accessible name of a filter chip's remove button.\n\t\t *\n\t\t * @param {{label: string}} chip The chip.\n\t\t * @return {string}\n\t\t */\n\t\tremoveFilterLabel(chip) {\n\t\t\treturn t('nextcloud-vue', 'Remove filter: {label}', { label: chip.label })\n\t\t},\n\n\t\t/**\n\t\t * The `lang` of a bulk action label that fell back to its written text in another language.\n\t\t *\n\t\t * @param {object} entry The bulk action.\n\t\t * @return {string|undefined} The source language, or undefined.\n\t\t */\n\t\tbulkLang(entry) {\n\t\t\treturn labelLang(this.cnTranslate, entry.label) || undefined\n\t\t},\n\n\t\tt,\n\t\t/**\n\t\t * Forward the inline search field's input to the host.\n\t\t *\n\t\t * @param {Event} event The native input event.\n\t\t * @return {void}\n\t\t */\n\t\tonSearchInput(event) {\n\t\t\t/**\n\t\t\t * @event search Emitted when the user types in the inline search field.\n\t\t\t * @type {string}\n\t\t\t */\n\t\t\tthis.$emit('search', event.target.value)\n\t\t},\n\n\t\t/**\n\t\t * Forward the standalone sort dropdown's selection to the host.\n\t\t *\n\t\t * @param {string} value The chosen option's `value`.\n\t\t * @return {void}\n\t\t */\n\t\tonSortChange(value) {\n\t\t\t/**\n\t\t\t * @event sort-change Emitted when the user picks an option from the standalone sort dropdown.\n\t\t\t * @type {string} The chosen option's `value`.\n\t\t\t */\n\t\t\tthis.$emit('sort-change', value)\n\t\t},\n\n\t\t/**\n\t\t * Add button click: a plain click on an in-app link routes in place,\n\t\t * anything else on a link is the browser's. Emits `add`, except for a\n\t\t * modified click on a link, which opens in a new tab: a host `@add`\n\t\t * would otherwise run in the tab the user is leaving.\n\t\t *\n\t\t * @param {MouseEvent} event The click event.\n\t\t */\n\t\tonAddClick(event) {\n\t\t\tif (this.addLink) {\n\t\t\t\tif (isModifiedClick(event)) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tfollowItemActionLink(event, this.addLink, this.$router)\n\t\t\t}\n\t\t\tthis.$emit('add')\n\t\t},\n\n\t\t/**\n\t\t * A header link entry was clicked: route a plain in-app click and emit\n\t\t * `header-action` as the button would. A modified click is the\n\t\t * browser's alone (a new tab), so nothing is emitted for it.\n\t\t *\n\t\t * @param {object} entry The header action.\n\t\t * @param {object} link The resolved link.\n\t\t * @param {MouseEvent} event The click event.\n\t\t */\n\t\tonHeaderLinkClick(entry, link, event) {\n\t\t\tif (isModifiedClick(event)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tfollowItemActionLink(event, link, this.$router)\n\t\t\tthis.$emit('header-action', { action: entry.id, id: entry.id })\n\t\t},\n\n\t\t/**\n\t\t * Heuristic: a \"plain\" name like `History` is an MDI Vue\n\t\t * component name (rendered via `CnIcon`). A name like\n\t\t * `icon-history` or any string starting with `icon-` is a\n\t\t * Nextcloud core CSS icon class (rendered as a `<span>`).\n\t\t *\n\t\t * @param {string} name Icon string from a headerActions entry.\n\t\t * @return {boolean} `true` when `name` should be passed to\n\t\t * `CnIcon` as `:name`; `false` for CSS-class icons or empty.\n\t\t */\n\t\tisMdiIconName(name) {\n\t\t\tif (!name || typeof name !== 'string') {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tif (name.startsWith('icon-')) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn true\n\t\t},\n\n\t\t/**\n\t\t * Emit declarations — invoked via the template `$emit(...)` sites.\n\t\t * Listed here so vue-docgen-api picks up the events for the\n\t\t * generated docs.\n\t\t *\n\t\t * @private\n\t\t */\n\t\t_emitDocs() {\n\t\t\t/**\n\t\t\t * @event view-mode-change User clicked one of the view-mode toggle buttons (Cards / Table). Payload is the selected mode string.\n\t\t\t * @type {'cards' | 'table'}\n\t\t\t */\n\t\t\tthis.$emit('view-mode-change')\n\t\t\t/**\n\t\t\t * @event add User clicked the primary Add button. No payload.\n\t\t\t */\n\t\t\tthis.$emit('add')\n\t\t\t/**\n\t\t\t * @event refresh User clicked the Refresh entry in the overflow Actions menu. The host should re-fetch the underlying list.\n\t\t\t */\n\t\t\tthis.$emit('refresh')\n\t\t\t/**\n\t\t\t * @event show-import User clicked the Import mass action. Host should open the import modal.\n\t\t\t */\n\t\t\tthis.$emit('show-import')\n\t\t\t/**\n\t\t\t * @event show-export User clicked the Export mass action. Host should open the export modal.\n\t\t\t */\n\t\t\tthis.$emit('show-export')\n\t\t\t/**\n\t\t\t * @event show-copy User clicked the Copy-selected mass action. Disabled while no row is selected.\n\t\t\t */\n\t\t\tthis.$emit('show-copy')\n\t\t\t/**\n\t\t\t * @event show-delete User clicked the Delete-selected mass action. Disabled while no row is selected.\n\t\t\t */\n\t\t\tthis.$emit('show-delete')\n\t\t\t/**\n\t\t\t * @event header-action User clicked a manifest-declared page-level header action. Payload: `{ action: id, id }`.\n\t\t\t */\n\t\t\tthis.$emit('header-action')\n\t\t\t/**\n\t\t\t * @event toggle-sidebar User clicked the Search/Columns sidebar toggle. No payload.\n\t\t\t */\n\t\t\tthis.$emit('toggle-sidebar')\n\t\t\t/**\n\t\t\t * @event clear-selection User clicked the selection strip's Clear control. No payload — the host should empty its selection (CnIndexPage does this and re-emits `select` with an empty array).\n\t\t\t */\n\t\t\tthis.$emit('clear-selection')\n\t\t\t/**\n\t\t\t * @event remove-filter User removed an active filter chip (board look). Payload: the chip `{ key, label }`.\n\t\t\t */\n\t\t\tthis.$emit('remove-filter')\n\t\t\t/**\n\t\t\t * @event clear-filters User clicked \"Clear all\" beside the active filter chips (board look). No payload.\n\t\t\t */\n\t\t\tthis.$emit('clear-filters')\n\t\t},\n\t},\n}\n</script>\n\n<!-- Styles in css/actions-bar.css -->\n"],"names":["_createElementVNode","_mergeProps","_openBlock","_createElementBlock","_renderSlot","_createBlock","_createVNode","_toDisplayString","_Fragment","_renderList","_normalizeClass","_resolveDynamicComponent","_createTextVNode"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { translate } from '@nextcloud/l10n';
2
2
  import { NcNoteCard } from '@nextcloud/vue';
3
+ import { normalizeLook } from '../../composables/useLook.js';
3
4
  import { resolveHref, followLinkClick } from '../../utils/linkNavigation.js';
4
5
  import { safeHref } from '../../utils/safeHref.js';
5
6
  import { nextUid } from '../../utils/uid.js';
@@ -14,6 +15,12 @@ const LAYOUTS = ['banner', 'attention'];
14
15
  /** An attention card offers a primary and a secondary action, no more. */
15
16
  const MAX_ACTIONS = 2;
16
17
 
18
+ /**
19
+ * Under the board look the card takes what the boards draw: DqMijnWerk's
20
+ * "Vandaag eerst" has three secondary actions and the primary one.
21
+ */
22
+ const MAX_ACTIONS_BOARD = 4;
23
+
17
24
  /**
18
25
  * CnBannerWidget — declarative notice banner for dashboards and v2 pages
19
26
  * (`banner` widget type, Wave 1 of nextcloud-vue#91).
@@ -84,6 +91,8 @@ var script = {
84
91
  * label that is not a key renders as written.
85
92
  */
86
93
  cnTranslate: { default: () => (key) => key },
94
+ /** The app's look, provided by CnAppRoot or CnPageRenderer (`nextcloud` or `board`). */
95
+ cnLook: { default: 'nextcloud' },
87
96
  },
88
97
 
89
98
  props: {
@@ -168,7 +177,8 @@ var script = {
168
177
  },
169
178
 
170
179
  /**
171
- * Attention card: at most two actions. Each is `{ label, route?,
180
+ * Attention card: its actions, two at most (four under the board look,
181
+ * or `maxActions`). Each is `{ label, route?,
172
182
  * href?, primary?, id? }`: `route` is a route name or location,
173
183
  * `href` an URL. An action with neither renders a button that emits
174
184
  * `action`. The first action is the primary one unless one sets
@@ -181,6 +191,17 @@ var script = {
181
191
  default: null,
182
192
  },
183
193
 
194
+ /**
195
+ * Attention card: how many actions it shows at most. Null takes the
196
+ * default: two, four under the board look.
197
+ *
198
+ * @spec openspec/changes/screens-banner-actions-parity/specs/banner-actions/spec.md#requirement-the-board-attention-card-shows-the-boards-actions
199
+ */
200
+ maxActions: {
201
+ type: Number,
202
+ default: null,
203
+ },
204
+
184
205
  /**
185
206
  * Stored content blob (CnDashboardPage registry branch) carrying the
186
207
  * same keys as the flat props: `{ variant, text, visibleWhen, route,
@@ -339,12 +360,27 @@ var script = {
339
360
  },
340
361
 
341
362
  /**
342
- * The attention card's actions: the first two that have a label, each
363
+ * The attention card's actions: the first `actionCap` that have a label, each
343
364
  * with its href and whether it is the primary one.
344
365
  *
345
366
  * @return {Array<{key: string, id: (string|undefined), label: string, href: string, target: (object|null), primary: boolean, index: number}>}
346
367
  * @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-attention-card
347
368
  */
369
+ /**
370
+ * How many actions the attention card shows: `maxActions` (prop, then
371
+ * content), else four under the board look and two without it.
372
+ *
373
+ * @return {number} The cap.
374
+ * @spec openspec/changes/screens-banner-actions-parity/specs/banner-actions/spec.md#requirement-the-board-attention-card-shows-the-boards-actions
375
+ */
376
+ actionCap() {
377
+ const explicit = this.maxActions ?? (this.content ? this.content.maxActions : undefined);
378
+ if (Number.isInteger(explicit) && explicit > 0) {
379
+ return explicit
380
+ }
381
+ return normalizeLook(this.cnLook) === 'board' ? MAX_ACTIONS_BOARD : MAX_ACTIONS
382
+ },
383
+
348
384
  resolvedActions() {
349
385
  const raw = this.actions || (this.content && this.content.actions) || [];
350
386
  if (!Array.isArray(raw)) {
@@ -352,7 +388,7 @@ var script = {
352
388
  }
353
389
  const usable = raw
354
390
  .filter((action) => action && typeof action === 'object' && typeof action.label === 'string' && action.label !== '')
355
- .slice(0, MAX_ACTIONS);
391
+ .slice(0, this.actionCap);
356
392
  const declaredPrimary = usable.findIndex((action) => action.primary === true);
357
393
  const primaryIndex = declaredPrimary === -1 ? 0 : declaredPrimary;
358
394
  return usable.map((action, index) => {