@conduction/nextcloud-vue 2.129.0 → 2.130.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 (63) hide show
  1. package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js +23 -1
  2. package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js.map +1 -1
  3. package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js +87 -4
  4. package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js.map +1 -1
  5. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue.js +1 -1
  6. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js +29 -3
  7. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -1
  8. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js +68 -14
  9. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js.map +1 -1
  10. package/dist/esm/components/CnEventsCard/CnEventsCard.vue.js +1 -1
  11. package/dist/esm/components/CnEventsCard/CnEventsCard.vue2.js +16 -5
  12. package/dist/esm/components/CnEventsCard/CnEventsCard.vue2.js.map +1 -1
  13. package/dist/esm/components/CnEventsCard/CnEventsCard.vue3.js.map +1 -1
  14. package/dist/esm/components/CnFilesCard/CnFilesCard.vue.js +1 -1
  15. package/dist/esm/components/CnFilesCard/CnFilesCard.vue2.js.map +1 -1
  16. package/dist/esm/components/CnFilesCard/CnFilesCard.vue3.js +11 -2
  17. package/dist/esm/components/CnFilesCard/CnFilesCard.vue3.js.map +1 -1
  18. package/dist/esm/components/CnIcon/semanticIcons.js +2 -0
  19. package/dist/esm/components/CnIcon/semanticIcons.js.map +1 -1
  20. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +32 -2
  21. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  22. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +3 -1
  23. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  24. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue.js +1 -1
  25. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
  26. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js +4 -1
  27. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
  28. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +1 -1
  29. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +62 -2
  30. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
  31. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js +515 -356
  32. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
  33. package/dist/esm/integrations/builtin/calendar/CnCalendarCard.vue.js +1 -1
  34. package/dist/esm/integrations/builtin/calendar/CnCalendarCard.vue2.js +6 -1
  35. package/dist/esm/integrations/builtin/calendar/CnCalendarCard.vue2.js.map +1 -1
  36. package/dist/esm/integrations/builtin/calendar/CnCalendarCard.vue3.js +17 -9
  37. package/dist/esm/integrations/builtin/calendar/CnCalendarCard.vue3.js.map +1 -1
  38. package/dist/esm/library-style.js +1 -1
  39. package/dist/esm/nextcloud-vue.css +323 -165
  40. package/dist/esm/utils/boardReferenceColumns.js +38 -1
  41. package/dist/esm/utils/boardReferenceColumns.js.map +1 -1
  42. package/dist/esm/utils/validateManifestV2.compiled.js +3 -3
  43. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  44. package/dist/nextcloud-vue.cjs.js +989 -479
  45. package/dist/nextcloud-vue.cjs.js.map +2 -2
  46. package/dist/nextcloud-vue.css +323 -165
  47. package/package.json +1 -1
  48. package/src/components/CnActionsBar/CnActionsBar.vue +67 -3
  49. package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +59 -8
  50. package/src/components/CnEventsCard/CnEventsCard.vue +16 -5
  51. package/src/components/CnFilesCard/CnFilesCard.vue +7 -0
  52. package/src/components/CnIcon/semanticIcons.js +2 -0
  53. package/src/components/CnIndexPage/CnIndexPage.vue +34 -1
  54. package/src/components/CnObjectListWidget/CnObjectListWidget.vue +1 -1
  55. package/src/components/CnRecordListWidget/CnRecordListWidget.vue +186 -8
  56. package/src/css/look-board-detail.css +27 -2
  57. package/src/css/look-board-index.css +50 -2
  58. package/src/css/look-board.css +52 -2
  59. package/src/integrations/builtin/calendar/CnCalendarCard.vue +12 -3
  60. package/src/integrations/builtin/calendar/__tests__/CnCalendarCardHeaderActions.spec.js +12 -1
  61. package/src/schemas/app-manifest-v2.schema.json +27 -3
  62. package/src/utils/boardReferenceColumns.js +37 -0
  63. package/src/utils/validateManifestV2.compiled.js +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"CnActionsBar.vue3.js","sources":["../../../../src/components/CnActionsBar/CnActionsBar.vue?vue&type=template&id=2e745aae&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<!-- `searchPlacement: \"toolbar\"`: the search field on row 1, before\n\t\t\t Filter and the view switch, instead of opening row 2. -->\n\t\t\t<div v-if=\"showSearch && searchInToolbar\"\n\t\t\t\tclass=\"cn-actions-bar__search cn-actions-bar__search--toolbar\"\n\t\t\t\tdata-testid=\"cn-actions-bar-search-toolbar\">\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 in this list')\"\n\t\t\t\t\t:value=\"searchValue\"\n\t\t\t\t\t:aria-label=\"searchPlaceholder || t('nextcloud-vue', 'Search in this list')\"\n\t\t\t\t\t@input=\"onSearchInput\">\n\t\t\t</div>\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 || $slots['filter-menu'] || (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<!--\n\t\t\t\t\t@slot filter-menu\n\t\t\t\t\t@description Board look, row 1: the Filter button drawn as a menu, for a page with no filter sidebar (`filterMenu`). Ignored while the sidebar toggle is shown.\n\t\t\t\t-->\n\t\t\t\t<slot v-else name=\"filter-menu\" />\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 A segment that opens another PAGE (`viewModeLinks`) is a link, never pressed. -->\n\t\t\t\t\t<template v-for=\"seg in viewSegments\" :key=\"seg.mode\">\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\tv-if=\"seg.link\"\n\t\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-btn cn-actions-bar__view-toggle-btn--link\"\n\t\t\t\t\t\t\t:href=\"seg.link.href\"\n\t\t\t\t\t\t\t:aria-label=\"seg.label\"\n\t\t\t\t\t\t\t:title=\"seg.label\"\n\t\t\t\t\t\t\t:data-mode=\"seg.mode\"\n\t\t\t\t\t\t\tdata-testid=\"cn-actions-bar-view-link\"\n\t\t\t\t\t\t\t@click=\"onViewLinkClick($event, seg)\">\n\t\t\t\t\t\t\t<CnIcon v-if=\"seg.icon\"\n\t\t\t\t\t\t\t\t:name=\"seg.icon\"\n\t\t\t\t\t\t\t\t:size=\"18\"\n\t\t\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-icon\" />\n\t\t\t\t\t\t\t<component :is=\"seg.boardFallback || seg.fallback\"\n\t\t\t\t\t\t\t\tv-else\n\t\t\t\t\t\t\t\t:size=\"18\"\n\t\t\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-icon\" />\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tv-else\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-btn\"\n\t\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\t:aria-pressed=\"viewMode === seg.mode\"\n\t\t\t\t\t\t\t:aria-label=\"seg.label\"\n\t\t\t\t\t\t\t:title=\"seg.disabled ? unavailableViewLabel(seg.label) : seg.label\"\n\t\t\t\t\t\t\t:disabled=\"seg.disabled\"\n\t\t\t\t\t\t\t:data-mode=\"seg.mode\"\n\t\t\t\t\t\t\t@click=\"seg.disabled || $emit('view-mode-change', seg.mode)\">\n\t\t\t\t\t\t\t<CnIcon v-if=\"seg.icon\"\n\t\t\t\t\t\t\t\t:name=\"seg.icon\"\n\t\t\t\t\t\t\t\t:size=\"18\"\n\t\t\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-icon\" />\n\t\t\t\t\t\t\t<component :is=\"seg.boardFallback || seg.fallback\"\n\t\t\t\t\t\t\t\tv-else\n\t\t\t\t\t\t\t\t:size=\"18\"\n\t\t\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-icon\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</template>\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 in this list')\"\n\t\t\t\t\t:value=\"searchValue\"\n\t\t\t\t\t:aria-label=\"searchPlaceholder || t('nextcloud-vue', 'Search in this list')\"\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 && !searchInToolbar\" 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 in this list')\"\n\t\t\t\t\t:value=\"searchValue\"\n\t\t\t\t\t:aria-label=\"searchPlaceholder || t('nextcloud-vue', 'Search in this list')\"\n\t\t\t\t\t@input=\"onSearchInput\">\n\t\t\t</div>\n\t\t\t<span v-else-if=\"showCount && hasTotal && !searchInToolbar\" 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, while rows are selected; with\n\t\t`bulkBandAlways` also before, its buttons disabled until there is a\n\t\tselection (DqZaken, DqWerkbord). The count stays announced by the live\n\t\tregion above.\n\t-->\n\t<div\n\t\tv-if=\"isBoardLayout && selectable && (selectedIds.length > 0 || (bulkBandAlways && bulkBandHasActions))\"\n\t\tclass=\"cn-actions-bar__band\"\n\t\t:class=\"{ 'cn-actions-bar__band--idle': selectedIds.length === 0 }\"\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\">{{ bulkLead || bulkBandLead }}</strong>\n\t\t<NcButton\n\t\t\tv-if=\"showMassCopy\"\n\t\t\tvariant=\"secondary\"\n\t\t\t:disabled=\"selectedIds.length === 0\"\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:disabled=\"selectedIds.length === 0\"\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 || selectedIds.length === 0\"\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<template v-if=\"entry.icon\" #icon>\n\t\t\t\t<CnIcon :name=\"entry.icon\" :size=\"16\" />\n\t\t\t</template>\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<NcButton\n\t\t\tv-if=\"bulkCancel\"\n\t\t\tvariant=\"secondary\"\n\t\t\tdata-testid=\"cn-bulk-band-cancel\"\n\t\t\t@click=\"$emit('clear-selection')\">\n\t\t\t{{ t('nextcloud-vue', 'Cancel') }}\n\t\t</NcButton>\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 * Board look: view modes that open another PAGE instead of switching in\n\t\t * place, by mode: `{ board: { href, to? } }`. Such a segment is drawn as\n\t\t * a link in its place in the switch; `to` (a router location) is pushed\n\t\t * on a plain click, `href` serves a new tab. A mode the page offers in\n\t\t * place stays a button. Ignored without the board look.\n\t\t *\n\t\t * @type {{[mode: string]: {href: string, to?: (object|string)}}}\n\t\t * @spec openspec/changes/screens-view-switch-links/specs/view-switch/spec.md#requirement-a-view-switch-segment-can-open-another-page\n\t\t */\n\t\tviewModeLinks: {\n\t\t\ttype: Object,\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/**\n\t\t * Board look: draw the bulk band also before anything is selected, its\n\t\t * buttons disabled until there is a selection, as DqZaken and DqWerkbord\n\t\t * draw it. Only when the band has an action to offer.\n\t\t */\n\t\tbulkBandAlways: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Board look: the band's lead instead of \"With the selected …\" (\"1 zaak geselecteerd\"). */\n\t\tbulkLead: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Board look: a Cancel button at the end of the band that clears the selection. */\n\t\tbulkCancel: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\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/**\n\t\t * Where the board look draws the search field: `''` (the default) at\n\t\t * the start of row 2, `'toolbar'` on row 1 before Filter and the view\n\t\t * switch (DqTeamwachtrij). No effect outside the board look.\n\t\t *\n\t\t * @type {''|'toolbar'}\n\t\t */\n\t\tsearchPlacement: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t\tvalidator: (v) => ['', 'toolbar'].includes(v),\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 search field sits on the board's row 1.\n\t\t *\n\t\t * @spec openspec/changes/index-search-on-toolbar/specs/index-page/spec.md#requirement-the-search-field-can-sit-on-the-toolbar-row\n\t\t * @return {boolean}\n\t\t */\n\t\tsearchInToolbar() {\n\t\t\treturn this.isBoardLayout && this.searchPlacement === 'toolbar'\n\t\t},\n\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 * Whether the bulk band has an action to offer: copy, delete, a\n\t\t * declared bulk action or the host's own buttons.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tbulkBandHasActions() {\n\t\t\treturn this.showMassCopy || this.showMassDelete\n\t\t\t\t|| (Array.isArray(this.bulkActions) && this.bulkActions.length > 0)\n\t\t\t\t|| Boolean(this.$slots['selection-actions'])\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\t// A mode that opens another page: a link, unless the page offers it in place.\n\t\t\t\tconst links = this.viewModeLinks && typeof this.viewModeLinks === 'object' ? this.viewModeLinks : {}\n\t\t\t\tconst linked = Object.keys(links).filter((mode) => !modes.includes(mode) && links[mode] && typeof links[mode].href === 'string' && links[mode].href !== '')\n\t\t\t\tconst disabled = (this.disabledViewModes || []).filter((mode) => !modes.includes(mode) && !linked.includes(mode))\n\t\t\t\tconst all = [...modes, ...linked, ...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), link: linked.includes(mode) ? links[mode] : null }))\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 * A click on a segment that opens another page: a plain click goes\n\t\t * through the router when the link names a route; a modified click\n\t\t * (new tab) and a link without a route are left to the browser.\n\t\t *\n\t\t * @param {MouseEvent} event The click.\n\t\t * @param {{link: {href: string, to?: (object|string)}}} seg The segment.\n\t\t */\n\t\tonViewLinkClick(event, seg) {\n\t\t\tconst to = seg.link && seg.link.to\n\t\t\tif (!to || !this.$router || typeof this.$router.push !== 'function' || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || event.button > 0) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tevent.preventDefault()\n\t\t\tthis.$router.push(to)\n\t\t},\n\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","_createVNode","_createBlock","_toDisplayString","_Fragment","_renderList","_resolveDynamicComponent","_normalizeClass","_createTextVNode"],"mappings":";;;;AAY4B,EAAA,KAAK,EAAC,gDAAiD;AAAA,EAAA,aAAW,EAAC,0BAA0B;;;;AAWrH,EAAA,KAAK,EAAC,wDAAuD;AAC7D,EAAA,aAAW,EAAC,+BAA+B;;;;;AAgB3C,EAAA,KAAK,EAAC,+BAA8B;AACpC,EAAA,aAAW,EAAC,8BAA8B;;;;;;;;AAuEjB,EAAA,KAAK,EAAC,sBAAsB;;;;AAE/B,EAAA,KAAK,EAAC,wBAAwB;;;;;AAUb,EAAA,KAAK,EAAC,uBAAuB;;;;;;AAmDvC,EAAA,KAAK,EAAC,mCAAmC;;AAInE,MAAA,WAAA,GAAA,EAAA,KAAK,EAAC,yBAAyB,GAAA;;;AAMc,EAAA,KAAK,EAAC,sBAAsB;;;;AA2MpD,EAAA,KAAK,EAAC,iDAAgD;AAAE,EAAA,aAAW,EAAC,2BAA2B;;;;AAC7E,EAAA,KAAK,EAAC,wBAAwB;;;;;AAUb,EAAA,KAAK,EAAC,uBAAuB;;;AAOlF,EAAA,KAAK,EAAC,8BAA+B;AAAA,EAAA,aAAW,EAAC,6BAA6B;;AAM7E,MAAA,WAAA,GAAA,EAAA,KAAK,EAAC,mCAAmC,GAAA;;;AA2B5C,EAAA,KAAK,EAAC,2BAA0B;AAAE,EAAA,IAAI,EAAC,QAAQ;;;;AAcpD,EAAA,KAAK,EAAC,2BAA0B;AAChC,EAAA,aAAW,EAAC,oBAAoB;;;AAC1B,EAAA,KAAK,EAAC,iCAAkC;AAAA,EAAA,aAAW,EAAC,MAAM;;;AAgFzD,MAAA,WAAA,GAAA,EAAA,KAAK,EAAC,2BAA2B,GAAA;;;AAuCnB,EAAA,KAAK,EAAC,2BAA4B;AAAA,EAAA,aAAW,EAAC,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;AA7jBxF,IAAAA,kBAAA,CAsgBK,OAtgBLC,UAsgBK,CAAA;MArgBJ,KAAK,EAAA,CAAC,gBAAe,EAAA,EAAA,uBAAA,EACc,QAAY,CAAA,aAAA,EAAA,CAAA;AAC/C,MAAA,aAAW,EAAC,gBAAe;OACnB,IAAM,CAAA,MAAA,CAAA,EAAA;OAOH,QAAa,CAAA,aAAA;AAAxB,WAAAC,SAAA,EAAA,EAAAC,kBAAA,CAmGK,OAnGL,UAmGK,EAAA;YAjGJC,UAAsB,CAAA,IAAA,CAAA,MAAA,EAAA,SAAA,CAAA;YAKtBA,UAA0B,CAAA,IAAA,CAAA,MAAA,EAAA,aAAA,CAAA;AAGf,YAAA,CAAA,MAAA,CAAA,UAAS,IAAK,QAAe,CAAA,eAAA;AAAxC,iBAAAF,SAAA,EAAA,EAAAC,kBAAA,CAWK,OAXL,UAWK,EAAA;kBARJE,WAAyD,CAAA,kBAAA,EAAA;AAA/C,oBAAA,IAAI,EAAE,EAAE;AAAE,oBAAA,KAAK,EAAC,6BAA4B;;kBACtDL,kBAMuB,CAAA,OAAA,EAAA;AALtB,oBAAA,IAAI,EAAC,QAAO;AACZ,oBAAA,KAAK,EAAC,8BAA6B;oBAClC,WAAW,EAAE,MAAkB,CAAA,iBAAA,IAAG,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,qBAAA,CAAA;AACnC,oBAAA,KAAK,EAAE,MAAW,CAAA,WAAA;oBAClB,YAAU,EAAE,MAAkB,CAAA,iBAAA,IAAG,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,qBAAA,CAAA;AAClC,oBAAA,OAAK,0CAAE,QAAa,CAAA,aAAA,IAAA,QAAA,CAAA,aAAA,CAAA,GAAA,IAAA,CAAA,CAAA,CAAA;;;;AAOZ,YAAA,CAAA,MAAA,CAAA,iBAAgB,IAAK,IAAM,CAAA,MAAA,CAAA,aAAA,CAAA,KAAoB,qBAAe,IAAG,QAAA,CAAA,YAAY,CAAC,MAAO,GAAA,CAAA,CAAA;AAAhG,iBAAAE,SAAA,EAAA,EAAAC,kBAAA,CAuEK,OAvEL,UAuEK,EAAA;mBApEY,MAAiB,CAAA,iBAAA;oCAAjCG,WAeU,CAAA,mBAAA,EAAA;;AAdT,wBAAA,OAAO,EAAC,WAAU;AAClB,wBAAA,KAAK,EAAC,+BAA8B;AACpC,wBAAA,aAAW,EAAC,8BAA6B;AACxC,wBAAA,OAAO,EAAE,MAAW,CAAA,WAAA;AACpB,wBAAA,OAAK,uCAAE,IAAK,CAAA,KAAA,CAAA,gBAAA,CAAA,CAAA,CAAA;;AACF,wBAAA,IAAI,UACd,MAAkB;0BAAlBD,WAAkB,CAAA,eAAA,EAAA,EAAX,IAAI,EAAE,EAAE,EAAA,CAAA;;yCACN,MACV;0CADU,GACV,GAAAE,eAAA,CAAG,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,QAAA,CAAA,CAAA,GAA6B,GACjC,EAAA,CAAA,YAAA;2BACO,QAAU,CAAA,WAAA,GAAA,CAAA;4CADjBJ,kBAIuD,CAAA,MAAA,EAAA;;AAFtD,gCAAA,KAAK,EAAC,8BAA6B;AACnC,gCAAA,aAAW,EAAC,6BAA4B;AACvC,gCAAA,YAAU,EAAE,QAAgB,CAAA,gBAAA;iDAAK,QAAU,CAAA,WAAA,CAAA,EAAA,CAAA,oBAAA,UAAA,CAAA;;;;;sBAM9CC,UAAiC,CAAA,IAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,CAAA;mBACtB,yBAAkB,QAAY,CAAA,YAAA,CAAC,MAAO,GAAA,CAAA;oCAAjDD,kBA8CK,CAAA,KAAA,EAAA;;AA7CJ,wBAAA,KAAK,EAAC,6BAA4B;AAClC,wBAAA,IAAI,EAAC,OAAM;AACV,wBAAA,YAAU,EAAE,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,WAAA,CAAA;;0CAGdA,kBAuCU,CAAAK,QAAA,EAAA,IAAA,EAAAC,UAAA,CAvCc,QAAY,CAAA,YAAA,EAAA,CAAnB,GAAI,KAAA;;AAAuB,4BAAA,GAAA,EAAA,GAAG,CAAC,IAAI;;AAE5C,4BAAA,CAAA,GAAG,CAAC,IAAI;8CADfN,kBAiBG,CAAA,GAAA,EAAA;;AAfF,kCAAA,KAAK,EAAC,uEAAsE;AAC3E,kCAAA,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI;kCACnB,YAAU,EAAE,GAAG,CAAC,KAAK;kCACrB,KAAK,EAAE,GAAG,CAAC,KAAK;kCAChB,WAAS,EAAE,GAAG,CAAC,IAAI;AACpB,kCAAA,aAAW,EAAC,0BAAyB;AACpC,kCAAA,OAAK,EAAE,MAAA,KAAA,QAAA,CAAA,eAAe,CAAC,MAAM,EAAE,GAAG,CAAA,CAAA;;AACrB,kCAAA,CAAA,GAAG,CAAC,IAAI;oDAAtBG,WAG2C,CAAA,iBAAA,EAAA;;wCAFzC,IAAI,EAAE,GAAG,CAAC,IAAI;AACd,wCAAA,IAAI,EAAE,EAAE;AACT,wCAAA,KAAK,EAAC;;AACP,uCAAAJ,SAAA,EAAA,EAAAI,WAAA,CAG2CI,wBAH3B,GAAG,CAAC,aAAY,IAAK,GAAG,CAAC,QAAQ,CAAA,EAAA;;AAE/C,wCAAA,IAAI,EAAE,EAAE;AACT,wCAAA,KAAK,EAAC;;;8CAERP,kBAmBQ,CAAA,QAAA,EAAA;;AAjBP,kCAAA,IAAI,EAAC,QAAO;kCACZ,KAAK,EAAAQ,cAAA,CAAA,CAAC,iCAAgC,EAAA,EAAA,yCAAA,EACe,MAAO,CAAA,QAAA,KAAM,GAAG,CAAC,IAAI,EAAA,2CAAA,EAA+C,GAAG,CAAC;AAC5H,kCAAA,cAAY,EAAE,MAAA,CAAA,QAAO,KAAM,GAAG,CAAC,IAAI;kCACnC,YAAU,EAAE,GAAG,CAAC,KAAK;AACrB,kCAAA,KAAK,EAAE,GAAG,CAAC,QAAS,GAAE,QAAA,CAAA,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAI,GAAA,GAAG,CAAC,KAAK;kCACjE,QAAQ,EAAE,GAAG,CAAC,QAAQ;kCACtB,WAAS,EAAE,GAAG,CAAC,IAAI;kCACnB,OAAK,EAAA,MAAA,KAAE,GAAG,CAAC,QAAO,IAAK,IAAK,CAAA,KAAA,CAAA,kBAAA,EAAqB,GAAG,CAAC,IAAI,CAAA,CAAA;;AAC5C,kCAAA,CAAA,GAAG,CAAC,IAAI;oDAAtBL,WAG2C,CAAA,iBAAA,EAAA;;wCAFzC,IAAI,EAAE,GAAG,CAAC,IAAI;AACd,wCAAA,IAAI,EAAE,EAAE;AACT,wCAAA,KAAK,EAAC;;AACP,uCAAAJ,SAAA,EAAA,EAAAI,WAAA,CAG2CI,wBAH3B,GAAG,CAAC,aAAY,IAAK,GAAG,CAAC,QAAQ,CAAA,EAAA;;AAE/C,wCAAA,IAAI,EAAE,EAAE;AACT,wCAAA,KAAK,EAAC;;;;;;;;;;;QAMA,QAAa,CAAA,aAAA;AAAzB,WAAAR,SAAA,EAAA,EAAAC,kBAAA,CAkEK,OAlEL,UAkEK,EAAA;aAhEO,MAAU,CAAA,UAAA;AAArB,iBAAAD,SAAA,EAAA,EAAAC,kBAAA,CASK,OATL,WASK,EAAA;kBARJE,WAAyD,CAAA,kBAAA,EAAA;AAA/C,oBAAA,IAAI,EAAE,EAAE;AAAE,oBAAA,KAAK,EAAC,6BAA4B;;kBACtDL,kBAMuB,CAAA,OAAA,EAAA;AALtB,oBAAA,IAAI,EAAC,QAAO;AACZ,oBAAA,KAAK,EAAC,8BAA6B;oBAClC,WAAW,EAAE,MAAkB,CAAA,iBAAA,IAAG,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,qBAAA,CAAA;AACnC,oBAAA,KAAK,EAAE,MAAW,CAAA,WAAA;oBAClB,YAAU,EAAE,MAAkB,CAAA,iBAAA,IAAG,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,qBAAA,CAAA;AAClC,oBAAA,OAAK,0CAAE,QAAa,CAAA,aAAA,IAAA,QAAA,CAAA,aAAA,CAAA,GAAA,IAAA,CAAA,CAAA,CAAA;;;AAEN,gBAAA,CAAA,MAAA,CAAA,SAAQ,IAAK,QAAQ,CAAA,QAAA;gCAAtCG,kBAEM,CAAA,MAAA,EAFN,WAEM,EAAAI,eAAA,CADF,QAAQ,CAAA,SAAA,CAAA,EAAA,CAAA,YAAA;;YAGZH,UAA2B,CAAA,IAAA,CAAA,MAAA,EAAA,cAAA,CAAA;aAEf,oBAAa,MAAW,CAAA,UAAA,IAAG,MAAmB,CAAA,mBAAA;8BAA1DD,kBAGyD,CAAA,MAAA,EAAA;;kBAFxD,KAAK,EAAAQ,cAAA,CAAA,CAAC,4DAA2D,EAAA,EAAA,8BAAA,EAAA,CACtB,QAAO,CAAA,QAAA,EAAA,CAAA,CAAA;AAClD,kBAAA,WAAS,EAAC,QAAQ;AAAI,iBAAA,EAAAJ,eAAA,CAAA,QAAA,CAAA,WAAW;;aAOvB,yBAAkB,QAAY,CAAA,YAAA,CAAC,MAAO,GAAA,CAAA;8BAAjDJ,kBAqCK,CAAA,KAAA,EAAA;;AApCJ,kBAAA,KAAK,EAAC,6BAA4B;AAClC,kBAAA,IAAI,EAAC,OAAM;AACV,kBAAA,YAAU,EAAE,QAAA,CAAA,aAAc,GAAE,QAAA,CAAA,CAAC,4BAA4B,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,WAAA,CAAA;;oBAKnD,QAAa,CAAA,aAAA;oCADrBA,kBAIqB,CAAA,MAAA,EAAA;;AAFpB,wBAAA,KAAK,EAAC,mCAAkC;AACvC,wBAAA,KAAK,iBAAE,QAAU,CAAA,UAAA,CAAA;AAClB,wBAAA,aAAW,EAAC;;;oCAMbA,kBAmBQ,CAAAK,QAAA,EAAA,IAAA,EAAAC,UAAA,CAlBO,QAAY,CAAA,YAAA,EAAA,CAAnB,GAAE,KAAA;yCADVN,kBAmBQ,CAAA,QAAA,EAAA;sBAjBN,GAAG,EAAE,GAAG,CAAC,IAAI;AACd,sBAAA,IAAI,EAAC,QAAO;AACZ,sBAAA,KAAK,kBAAC,iCAAgC,EAAA,EAAA,yCAAA,EACe,eAAO,KAAM,GAAG,CAAC;AACrE,sBAAA,cAAY,EAAE,MAAA,CAAA,QAAO,KAAM,GAAG,CAAC,IAAI;AACnC,sBAAA,YAAU,EAAE,QAAA,CAAA,gBAAgB,GAAG,CAAC,KAAI,GAAA,IAAA;AACpC,sBAAA,KAAK,EAAE,QAAA,CAAA,aAAc,GAAE,GAAG,CAAC,KAAM,GAAA,IAAA;AACjC,sBAAA,OAAK,EAAE,MAAA,KAAA,IAAA,CAAA,KAAK,CAAqB,kBAAA,EAAA,GAAG,CAAC,IAAI,CAAA,CAAA;;AAC5B,sBAAA,CAAA,GAAG,CAAC,IAAI;wCAAtBG,WAG2C,CAAA,iBAAA,EAAA;;4BAFzC,IAAI,EAAE,GAAG,CAAC,IAAI;AACd,4BAAA,IAAI,EAAE,EAAE;AACT,4BAAA,KAAK,EAAC;;wCACPA,WAG2C,CAAAI,uBAAA,CAH3B,GAAG,CAAC,QAAQ,CAAA,EAAA;;AAE1B,4BAAA,IAAI,EAAE,EAAE;AACT,4BAAA,KAAK,EAAC;;wBACM,QAAa,CAAA,aAAA;AAA1B,2BAAAR,SAAA,EAAA,EAAAC,kBAAA,CAA2F,MAA3F,EAAA,WAA2F,EAAlBI,eAAA,CAAA,GAAG,CAAC,KAAI,CAAA,EAAA,CAAA,YAAA;;;;;;;;AAIpF,MAAAP,kBAAA,CA8MK,OA9ML,WA8MK,EAAA;SAxMO,yBAAkB,MAAW,CAAA,WAAA,CAAC,MAAM;AAA/C,aAAAE,SAAA,EAAA,EAAAC,kBAAA,CAWK,OAXL,WAWK,EAAA;cAVJE,WAAmF,CAAA,sBAAA,EAAA;AAArE,gBAAA,IAAI,EAAE,EAAE;AAAE,gBAAA,KAAK,EAAC,2BAA4B;AAAC,gBAAA,YAAU,EAAE,MAAS,CAAA,SAAA;;cAChFA,WAQoC,CAAA,mBAAA,EAAA;AAPnC,gBAAA,KAAK,EAAC,6BAA4B;AACjC,gBAAA,UAAU,EAAE,QAAkB,CAAA,kBAAA;AAC9B,gBAAA,OAAO,EAAE,MAAW,CAAA,WAAA;AACpB,gBAAA,MAAM,EAAE,OAAO,GAAG,CAAC,KAAK;AACxB,gBAAA,SAAS,EAAE,KAAK;AAChB,gBAAA,qBAAmB,EAAE,MAAS,CAAA,SAAA;AAC/B,gBAAA,KAAK,EAAC,OAAM;AACX,gBAAA,qBAAiB,EAAE,QAAY,CAAA,YAAA;;;;UAIrB,QAAa,CAAA,aAAA;YAA1BD,UAA4C,CAAA,IAAA,CAAA,MAAA,EAAA,SAAA,EAAA,EAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,CAAA;;AAS5B,QAAA,CAAA,MAAA,CAAA,iBAAkB,KAAI,QAAa,CAAA,aAAA;0BAAnDE,WASU,CAAA,mBAAA,EAAA;;AART,cAAA,OAAO,EAAC,UAAS;AAChB,cAAA,YAAU,EAAE,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,oBAAA,CAAA;AACb,cAAA,KAAK,EAAE,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,oBAAA,CAAA;AACR,cAAA,OAAO,EAAE,MAAW,CAAA,WAAA;AACpB,cAAA,OAAK,uCAAE,IAAK,CAAA,KAAA,CAAA,gBAAA,CAAA,CAAA,CAAA;;AACF,cAAA,IAAI,UACd,MAAkB;gBAAlBD,WAAkB,CAAA,eAAA,EAAA,EAAX,IAAI,EAAE,EAAE,EAAA,CAAA;;;;;QAQjBD,UAAsB,CAAA,IAAA,CAAA,MAAA,EAAA,SAAA,CAAA;SAON,MAAO,CAAA,OAAA;0BAAvBE,WAYU,CAAA,mBAAA,EAAA;;AAXT,cAAA,OAAO,EAAC,SAAQ;AACf,cAAA,QAAQ,EAAE,MAAW,CAAA,WAAA;AACrB,cAAA,IAAI,EAAE,QAAQ,CAAA,OAAA,GAAE,gBAAO,CAAC,IAAK,GAAE,SAAS;AACzC,cAAA,aAAW,EAAC,gBAAe;AAC3B,cAAA,qBAAmB,EAAC,WAAU;AAC7B,cAAA,OAAK,EAAE,QAAU,CAAA,UAAA;;AACP,cAAA,IAAI,UACd,MAAmD;iBAArC,MAAO,CAAA,OAAA;kCAArBA,WAAmD,CAAA,iBAAA,EAAA;;AAA3B,sBAAA,IAAI,EAAE,MAAO,CAAA,OAAA;AAAG,sBAAA,IAAI,EAAE,EAAE;;kCAChDA,WAAyB,CAAA,eAAA,EAAA;;AAAX,sBAAA,IAAI,EAAE,EAAE;;;+BACb,MACV;AADU,gBAAAM,eAAA,CAAA,GACV,mBAAG,MAAO,CAAA,QAAA,CAAA,EAAA,CAAA,YAAA;;;;;UAOE,QAAa,CAAA,aAAA;YAA1BR,UAAgD,CAAA,IAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,CAAA;;SAIrB,MAAiB,CAAA,iBAAA;0BAA5CE,WAA+C,CAAA,8BAAA,EAAA,EAAA,GAAA,EAAA,CAAA,EAAA,CAAA;;SAIxC,MAAe,CAAA,eAAA;0BADtBA,WAiIW,CAAA,oBAAA,EAAA;;AA/HT,cAAA,SAAS,EAAE,IAAI;AACf,cAAA,MAAM,EAAE,MAAiB,CAAA,iBAAA;AACzB,cAAA,QAAQ,EAAE,QAAe,CAAA,eAAA;AAC1B,cAAA,aAAW,EAAC,YAAY;;+BAKxB,MAMgB;gBANhBD,WAMgB,CAAA,yBAAA,EAAA;kBANC,QAAQ,EAAE,MAAS,CAAA,UAAA,IAAK,MAAe,CAAA,eAAA;AAAG,kBAAA,OAAK,uCAAE,IAAK,CAAA,KAAA,CAAA,SAAA,CAAA,CAAA,CAAA;;AAC3D,kBAAA,IAAI,UACd,MAA6C;qBAAxB,MAAU,CAAA,UAAA;sCAA/BC,WAA6C,CAAA,wBAAA,EAAA;;AAAX,0BAAA,IAAI,EAAE,EAAE;;sCAC1CA,WAA4B,CAAA,kBAAA,EAAA;;AAAX,0BAAA,IAAI,EAAE,EAAE;;;mCAChB,MACV;AADU,oBAAAM,eAAA,CAAA,GACV,GAAGL,eAAA,CAAA,MAAA,CAAA,UAAW,GAAE,QAAA,CAAA,CAAC,mCAAmC,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,SAAA,CAAA,CAAA,EAAA,CAAA,YAAA;;;;iBAGlC,MAAgB,CAAA,gBAAA;kCAApCD,WAOc,CAAA,uBAAA,EAAA;;AANZ,sBAAA,IAAI,EAAE,MAAgB,CAAA,gBAAA;AACvB,sBAAA,MAAM,EAAC,QAAQ;;AACJ,sBAAA,IAAI,UACd,MAAoC;wBAApCD,WAAoC,CAAA,iCAAA,EAAA,EAAX,IAAI,EAAE,EAAE,EAAA,CAAA;;uCACxB,MACV;AADU,wBAAAO,eAAA,CAAA,GACV,mBAAG;;;;;AAIJ,iBAAAV,SAAA,CAAA,IAAA,CAAA,EAAAC,kBAAA,CA2BUK,QA3B0B,EAAA,IAAA,EAAAC,UAAA,CAAA,QAAA,CAAA,qBAAqB,EAAtC,CAAA,EAAA,KAAK,EAAE,IAAK,EAAA,KAAA;;AAAkC,oBAAA,GAAA,EAAA,KAAK,CAAC,EAAE;;oBAEjE,IAAI;sCADXH,WAac,CAAA,uBAAA,EAAA;;0BAXZ,IAAI,EAAE,IAAI,CAAC,IAAI;0BACf,MAAM,EAAE,IAAI,CAAC,MAAM;AACpB,0BAAA,eAAc,EAAd,EAAc;AACb,0BAAA,OAAK,aAAE,QAAiB,CAAA,iBAAA,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAA,CAAA;;AAClC,0BAAA,IAAI,UACd,MAAsF;AAAxE,4BAAA,CAAA,KAAK,CAAC,IAAK,IAAG,sBAAa,CAAC,KAAK,CAAC,IAAI,CAAA;8CAApDA,WAAsF,CAAA,iBAAA,EAAA;;kCAA9B,IAAI,EAAE,KAAK,CAAC,IAAI;AAAG,kCAAA,IAAI,EAAE,EAAE;;AAClE,gCAAA,CAAA,KAAK,CAAC,IAAI;gDAA3BH,kBAEwB,CAAA,MAAA,EAAA;;AADvB,oCAAA,KAAK,EAACQ,cAAA,CAAA,CAAA,oCAAmC,EAChC,CAAA,KAAK,CAAC,IAAI,CAAA,CAAA,CAAA;;;;2CACX,MACV;AADU,4BAAAC,eAAA,CAAA,GACV,GAAGL,eAAA,CAAA,KAAK,CAAC,KAAM,GAAE,QAAA,CAAA,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAI,GAAA,KAAK,CAAC,KAAI,CAAA,EAAA,CAAA,YAAA;;;;sCAE9DD,WAWgB,CAAA,yBAAA,EAAA;;AATd,0BAAA,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAA;0BAChC,OAAK,EAAA,MAAA,KAAE,UAAK,CAA4B,eAAA,EAAA,EAAA,MAAA,EAAA,KAAK,CAAC,EAAE,EAAA,EAAA,EAAM,KAAK,CAAC,EAAC,EAAA,CAAA,CAAA;;AACnD,0BAAA,IAAI,UACd,MAAsF;AAAxE,4BAAA,CAAA,KAAK,CAAC,IAAK,IAAG,sBAAa,CAAC,KAAK,CAAC,IAAI,CAAA;8CAApDA,WAAsF,CAAA,iBAAA,EAAA;;kCAA9B,IAAI,EAAE,KAAK,CAAC,IAAI;AAAG,kCAAA,IAAI,EAAE,EAAE;;AAClE,gCAAA,CAAA,KAAK,CAAC,IAAI;gDAA3BH,kBAEwB,CAAA,MAAA,EAAA;;AADvB,oCAAA,KAAK,EAACQ,cAAA,CAAA,CAAA,oCAAmC,EAChC,CAAA,KAAK,CAAC,IAAI,CAAA,CAAA,CAAA;;;;2CACX,MACV;AADU,4BAAAC,eAAA,CAAA,GACV,GAAGL,eAAA,CAAA,KAAK,CAAC,KAAM,GAAE,QAAA,CAAA,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAI,GAAA,KAAK,CAAC,KAAI,CAAA,EAAA,CAAA,YAAA;;;;;;gBAQ/DH,UAA2B,CAAA,IAAA,CAAA,MAAA,EAAA,cAAA,CAAA;iBAKF,QAAoB,CAAA,oBAAA;kCAA7CE,WAAgD,CAAA,4BAAA,EAAA,EAAA,GAAA,EAAA,CAAA,EAAA,CAAA;;iBAQzC,MAAc,CAAA,cAAA;kCADrBA,WAOgB,CAAA,yBAAA,EAAA;;AALd,sBAAA,OAAK,uCAAE,IAAK,CAAA,KAAA,CAAA,aAAA,CAAA,CAAA,CAAA;;AACF,sBAAA,IAAI,UACd,MAAoB;wBAApBD,WAAoB,CAAA,iBAAA,EAAA,EAAX,IAAI,EAAE,EAAE,EAAA,CAAA;;uCACR,MACV;AADU,wBAAAO,eAAA,CAAA,GACV,mBAAG,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,QAAA,CAAA,CAAA,EAAA,CAAA,YAAA;;;;;iBAOE,MAAc,CAAA,cAAA;kCADrBN,WAOgB,CAAA,yBAAA,EAAA;;AALd,sBAAA,OAAK,uCAAE,IAAK,CAAA,KAAA,CAAA,aAAA,CAAA,CAAA,CAAA;;AACF,sBAAA,IAAI,UACd,MAAoB;wBAApBD,WAAoB,CAAA,iBAAA,EAAA,EAAX,IAAI,EAAE,EAAE,EAAA,CAAA;;uCACR,MACV;AADU,wBAAAO,eAAA,CAAA,GACV,mBAAG,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,QAAA,CAAA,CAAA,EAAA,CAAA,YAAA;;;;;iBAOE,MAAY,CAAA,YAAA;kCADnBN,WASgB,CAAA,yBAAA,EAAA;;sBAPd,QAAQ,EAAE,MAAW,CAAA,WAAA,CAAC,MAAK,GAAA,CAAA;AAC3B,sBAAA,KAAK,EAAE,MAAA,CAAA,WAAW,CAAC,aAAa,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,gCAAA,CAAA,GAAA,EAAA;AACjC,sBAAA,OAAK,uCAAE,IAAK,CAAA,KAAA,CAAA,WAAA,CAAA,CAAA,CAAA;;AACF,sBAAA,IAAI,UACd,MAAyB;wBAAzBD,WAAyB,CAAA,sBAAA,EAAA,EAAX,IAAI,EAAE,EAAE,EAAA,CAAA;;uCACb,MACV;AADU,wBAAAO,eAAA,CAAA,GACV,mBAAG,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,eAAA,CAAA,CAAA,EAAA,CAAA,YAAA;;;;;iBAOE,MAAc,CAAA,cAAA;kCADrBN,WASgB,CAAA,yBAAA,EAAA;;sBAPd,QAAQ,EAAE,MAAW,CAAA,WAAA,CAAC,MAAK,GAAA,CAAA;AAC3B,sBAAA,KAAK,EAAE,MAAA,CAAA,WAAW,CAAC,MAAK,OAAQ,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,kCAAA,CAAA,GAAA,EAAA;AACjC,sBAAA,OAAK,uCAAE,IAAK,CAAA,KAAA,CAAA,aAAA,CAAA,CAAA,CAAA;;AACF,sBAAA,IAAI,UACd,MAA6B;wBAA7BD,WAA6B,CAAA,0BAAA,EAAA,EAAX,IAAI,EAAE,EAAE,EAAA,CAAA;;uCACjB,MACV;AADU,wBAAAO,eAAA,CAAA,GACV,mBAAG,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,iBAAA,CAAA,CAAA,EAAA,CAAA,YAAA;;;;;gBASLR,UAAkF,CAAA,IAAA,CAAA,MAAA,EAAA,cAAA,EAAA;kBAAvD,KAAK,EAAE,MAAW,CAAA,WAAA,CAAC,MAAM;AAAG,kBAAA,WAAW,EAAE,MAAW,CAAA,WAAA;;;;;;;OAKtE,QAAa,CAAA,aAAA;AAAxB,WAAAF,SAAA,EAAA,EAAAC,kBAAA,CA6CK,OA7CL,WA6CK,EAAA;AA5CO,YAAA,CAAA,MAAA,CAAA,UAAS,KAAM,QAAe,CAAA,eAAA;AAAzC,iBAAAD,SAAA,EAAA,EAAAC,kBAAA,CASK,OATL,WASK,EAAA;kBARJE,WAAyD,CAAA,kBAAA,EAAA;AAA/C,oBAAA,IAAI,EAAE,EAAE;AAAE,oBAAA,KAAK,EAAC,6BAA4B;;kBACtDL,kBAMuB,CAAA,OAAA,EAAA;AALtB,oBAAA,IAAI,EAAC,QAAO;AACZ,oBAAA,KAAK,EAAC,8BAA6B;oBAClC,WAAW,EAAE,MAAkB,CAAA,iBAAA,IAAG,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,qBAAA,CAAA;AACnC,oBAAA,KAAK,EAAE,MAAW,CAAA,WAAA;oBAClB,YAAU,EAAE,MAAkB,CAAA,iBAAA,IAAG,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,qBAAA,CAAA;AAClC,oBAAA,OAAK,0CAAE,QAAa,CAAA,aAAA,IAAA,QAAA,CAAA,aAAA,CAAA,GAAA,IAAA,CAAA,CAAA,CAAA;;;iBAEN,MAAQ,CAAA,SAAA,IAAK,QAAO,CAAA,QAAA,IAAA,CAAM,QAAe,CAAA,eAAA;gCAA1DG,kBAEM,CAAA,MAAA,EAFN,WAEM,EAAAI,eAAA,CADF,QAAQ,CAAA,SAAA,CAAA,EAAA,CAAA,YAAA;;YAEZH,UAA2B,CAAA,IAAA,CAAA,MAAA,EAAA,cAAA,CAAA;AAGX,YAAA,CAAA,MAAA,CAAA,iBAAiB,CAAC,MAAO,GAAA,CAAA;8BAAzCD,kBAuBU,CAAAK,QAAA,EAAA,EAAA,GAAA,EAAA,CAAA,EAAA,EAAA;kBAtBTR,kBAA8H,CAAA,MAAA,EAA9H,WAA8H,EAAAO,eAAA,CAAtC,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,SAAA,CAAA,CAAA,EAAA,CAAA,YAAA;oCACzFJ,kBAaM,CAAAK,QAAA,EAAA,IAAA,EAAAC,UAAA,CAZU,MAAiB,CAAA,iBAAA,EAAA,CAAzB,IAAG,KAAA;yCADXN,kBAaM,CAAA,MAAA,EAAA;sBAXJ,GAAG,EAAE,IAAI,CAAC,GAAG;AACd,sBAAA,KAAK,EAAC,6BAA4B;AAClC,sBAAA,aAAW,EAAC,4BAA4B;;AACxC,sBAAAH,kBAAA,CAAsE,MAAtE,EAAA,WAAsE,EAAnBO,eAAA,CAAA,IAAI,CAAC,KAAI,CAAA,EAAA,CAAA,YAAA;sBAC5DP,kBAMQ,CAAA,QAAA,EAAA;AALP,wBAAA,IAAI,EAAC,QAAO;AACZ,wBAAA,KAAK,EAAC,oCAAmC;wBACxC,YAAU,EAAE,QAAiB,CAAA,iBAAA,CAAC,IAAI,CAAA;wBAClC,OAAK,EAAA,MAAA,KAAE,IAAK,CAAA,KAAA,CAAA,eAAA,EAAkB,IAAI,CAAA,CAAA;;wBACnCK,WAAsC,CAAA,gBAAA,EAAA;AAA9B,0BAAA,IAAI,EAAE,EAAE;AAAE,0BAAA,aAAW,EAAC;;;;;kBAGhCL,kBAMQ,CAAA,QAAA,EAAA;AALP,oBAAA,IAAI,EAAC,QAAO;AACZ,oBAAA,KAAK,EAAC,2BAA0B;AAChC,oBAAA,aAAW,EAAC,0BAAyB;AACpC,oBAAA,OAAK,yCAAE,IAAK,CAAA,KAAA,CAAA,eAAA,CAAA,CAAA,CAAA;qCACV,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,WAAA,CAAA,CAAA,EAAA,CAAA,YAAA;;;aAGM,oBAAa,MAAW,CAAA,UAAA,IAAG,MAAmB,CAAA,mBAAA;8BAA1DG,kBAGyD,CAAA,MAAA,EAAA;;kBAFxD,KAAK,EAAAQ,cAAA,CAAA,CAAC,4DAA2D,EAAA,EAAA,8BAAA,EAAA,CACtB,QAAO,CAAA,QAAA,EAAA,CAAA,CAAA;AAClD,kBAAA,WAAS,EAAC,QAAQ;AAAI,iBAAA,EAAAJ,eAAA,CAAA,QAAA,CAAA,WAAW;;;;MAOnCP,kBAEM,CAAA,MAAA,EAFN,WAEM,EADFO,eAAA,CAAA,MAAA,CAAA,UAAW,IAAG,MAAW,CAAA,WAAA,CAAC,MAAO,GAAA,CAAA,GAAM,QAAmB,CAAA,kBAAA,GAAA,EAAA,CAAA,EAAA,CAAA,YAAA;AAYtD,MAAA,CAAA,CAAA,QAAA,CAAA,aAAY,IAAK,MAAA,CAAA,UAAS,IAAK,MAAA,CAAA,WAAW,CAAC,MAAO,GAAA,CAAA;AAD1D,WAAAL,SAAA,EAAA,EAAAC,kBAAA,CAmEK,OAnEL,WAmEK,EAAA;YA/DJH,kBAEM,CAAA,MAAA,EAFN,WAEM,EAAAO,eAAA,CADF;aAGG,MAAY,CAAA,YAAA;8BADnBD,WAQU,CAAA,mBAAA,EAAA;;AANT,kBAAA,OAAO,EAAC,WAAU;AACjB,kBAAA,OAAK,yCAAE,IAAK,CAAA,KAAA,CAAA,WAAA,CAAA,CAAA,CAAA;;AACF,kBAAA,IAAI,UACd,MAAyB;oBAAzBD,WAAyB,CAAA,sBAAA,EAAA,EAAX,IAAI,EAAE,EAAE,EAAA,CAAA;;mCACb,MACV;AADU,oBAAAO,eAAA,CAAA,GACV,mBAAG,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,eAAA,CAAA,CAAA,EAAA,CAAA,YAAA;;;;;aAGE,MAAc,CAAA,cAAA;8BADrBN,WAQU,CAAA,mBAAA,EAAA;;AANT,kBAAA,OAAO,EAAC,WAAU;AACjB,kBAAA,OAAK,yCAAE,IAAK,CAAA,KAAA,CAAA,aAAA,CAAA,CAAA,CAAA;;AACF,kBAAA,IAAI,UACd,MAA6B;oBAA7BD,WAA6B,CAAA,0BAAA,EAAA,EAAX,IAAI,EAAE,EAAE,EAAA,CAAA;;mCACjB,MACV;AADU,oBAAAO,eAAA,CAAA,GACV,mBAAG,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,iBAAA,CAAA,CAAA,EAAA,CAAA,YAAA;;;;;8BAULT,kBASU,CAAAK,QAAA,EAAA,IAAA,EAAAC,UAAA,CARO,MAAW,CAAA,WAAA,EAAA,CAApB,KAAI,KAAA;mCADZH,WASU,CAAA,mBAAA,EAAA;gBAPR,GAAG,EAAE,KAAK,CAAC,EAAE;AACd,gBAAA,OAAO,EAAC,WAAU;gBACjB,QAAQ,EAAE,KAAK,CAAC,QAAS,KAAA,IAAA;gBACzB,aAAW,EAAA,CAAA,eAAA,EAAoB,KAAK,CAAC,EAAE,CAAA,CAAA;gBACvC,IAAI,EAAE,QAAQ,CAAA,QAAA,CAAC,KAAK,CAAA;AACpB,gBAAA,OAAK,EAAE,MAAA,KAAA,IAAA,CAAA,KAAK,CAAsB,aAAA,EAAA,EAAA,EAAA,EAAA,KAAK,CAAC,EAAE,EAAA,MAAA,EAAU,KAAK,CAAC,EAAE,EAAE,WAAA,EAAA,MAAA,CAAA,WAAW,EAAS,KAAA,EAAA,MAAA,CAAA,WAAW,CAAC,MAAK,EAAA,CAAA,CAAA;;iCACpG,MAAgE;kDAA7D,KAAK,CAAC,KAAM,GAAE,QAAkB,CAAA,kBAAA,CAAC,KAAK,CAAC,KAAK,CAAA,GAAI,KAAK,CAAC,KAAI,CAAA,EAAA,CAAA,YAAA;;;;;YAO9DF,UAG6B,CAAA,IAAA,CAAA,MAAA,EAAA,mBAAA,EAAA;cAD3B,KAAK,EAAE,MAAW,CAAA,WAAA,CAAC,MAAM;AACzB,cAAA,WAAW,EAAE,MAAW,CAAA,WAAA;;YAO1BC,WAQU,CAAA,mBAAA,EAAA;AAPT,cAAA,KAAK,EAAC,iCAAgC;AACtC,cAAA,OAAO,EAAC,UAAS;AAChB,cAAA,OAAK,yCAAE,IAAK,CAAA,KAAA,CAAA,iBAAA,CAAA,CAAA,CAAA;;AACF,cAAA,IAAI,UACd,MAAmB;gBAAnBA,WAAmB,CAAA,gBAAA,EAAA,EAAX,IAAI,EAAE,EAAE,EAAA,CAAA;;+BACP,MACV;AADU,gBAAAO,eAAA,CAAA,GACV,mBAAG,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,iBAAA,CAAA,CAAA,EAAA,CAAA,YAAA;;;;;;;KAaA,QAAY,CAAA,aAAA,IAAK,iBAAS,KAAM,MAAA,CAAA,WAAW,CAAC,MAAK,GAAA,CAAA,KAAU,yBAAkB,QAAkB,CAAA,kBAAA,CAAA,CAAA;sBADtGT,kBA+CK,CAAA,KAAA,EAAA;;AA7CJ,UAAA,KAAK,EAACQ,cAAA,CAAA,CAAA,sBAAqB,EACa,EAAA,4BAAA,EAAA,MAAA,CAAA,WAAW,CAAC,MAAK,KAAA,CAAA,EAAA,CAAA,CAAA;AACzD,UAAA,IAAI,EAAC,QAAO;AACX,UAAA,YAAU,EAAE,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,2BAAA,CAAA;AACd,UAAA,aAAW,EAAC,cAAc;;AAC1B,UAAAX,kBAAA,CAAgF,QAAhF,EAAA,WAAgF,EAAnCO,eAAA,CAAA,MAAA,CAAA,QAAO,IAAK,QAAa,CAAA,YAAA,CAAA,EAAA,CAAA,YAAA;WAE/D,MAAY,CAAA,YAAA;4BADnBD,WAMU,CAAA,mBAAA,EAAA;;AAJT,gBAAA,OAAO,EAAC,WAAU;gBACjB,QAAQ,EAAE,MAAW,CAAA,WAAA,CAAC,MAAK,KAAA,CAAA;AAC3B,gBAAA,OAAK,yCAAE,IAAK,CAAA,KAAA,CAAA,WAAA,CAAA,CAAA,CAAA;;iCACb,MAAwC;kDAArC,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,eAAA,CAAA,CAAA,EAAA,CAAA,YAAA;;;;;WAGE,MAAc,CAAA,cAAA;4BADrBA,WAMU,CAAA,mBAAA,EAAA;;AAJT,gBAAA,OAAO,EAAC,WAAU;gBACjB,QAAQ,EAAE,MAAW,CAAA,WAAA,CAAC,MAAK,KAAA,CAAA;AAC3B,gBAAA,OAAK,yCAAE,IAAK,CAAA,KAAA,CAAA,aAAA,CAAA,CAAA,CAAA;;iCACb,MAA0C;kDAAvC,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,iBAAA,CAAA,CAAA,EAAA,CAAA,YAAA;;;;;4BAELH,kBAYU,CAAAK,QAAA,EAAA,IAAA,EAAAC,UAAA,CAXO,MAAW,CAAA,WAAA,EAAA,CAApB,KAAI,KAAA;iCADZH,WAYU,CAAA,mBAAA,EAAA;cAVR,GAAG,EAAE,KAAK,CAAC,EAAE;AACd,cAAA,OAAO,EAAC,WAAU;AACjB,cAAA,QAAQ,EAAE,KAAK,CAAC,QAAS,KAAY,IAAA,IAAA,MAAA,CAAA,WAAW,CAAC,MAAO,KAAA,CAAA;cACxD,aAAW,EAAA,CAAA,eAAA,EAAoB,KAAK,CAAC,EAAE,CAAA,CAAA;cACvC,IAAI,EAAE,QAAQ,CAAA,QAAA,CAAC,KAAK,CAAA;AACpB,cAAA,OAAK,EAAE,MAAA,KAAA,IAAA,CAAA,KAAK,CAAsB,aAAA,EAAA,EAAA,EAAA,EAAA,KAAK,CAAC,EAAE,EAAA,MAAA,EAAU,KAAK,CAAC,EAAE,EAAE,WAAA,EAAA,MAAA,CAAA,WAAW,EAAS,KAAA,EAAA,MAAA,CAAA,WAAW,CAAC,MAAK,EAAA,CAAA,CAAA;;+BAG1F,MACV;AADU,gBAAAM,eAAA,CAAA,GACV,GAAGL,eAAA,CAAA,KAAK,CAAC,KAAM,GAAE,QAAA,CAAA,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAI,GAAA,KAAK,CAAC,KAAI,CAAA,EAAA,CAAA,YAAA;;;;AAH7C,cAAA,CAAA,KAAK,CAAC,IAAI;;0BAAG,MAAI;gCAChC,MAAuC;sBAAvCF,WAAuC,CAAA,iBAAA,EAAA;wBAA9B,IAAI,EAAE,KAAK,CAAC,IAAI;AAAG,wBAAA,IAAI,EAAE,EAAE;;;;;;;;UAItCD,UAG6B,CAAA,IAAA,CAAA,MAAA,EAAA,mBAAA,EAAA;YAD3B,KAAK,EAAE,MAAW,CAAA,WAAA,CAAC,MAAM;AACzB,YAAA,WAAW,EAAE,MAAW,CAAA,WAAA;;WAEnB,MAAU,CAAA,UAAA;4BADjBE,WAMU,CAAA,mBAAA,EAAA;;AAJT,gBAAA,OAAO,EAAC,WAAU;AAClB,gBAAA,aAAW,EAAC,qBAAoB;AAC/B,gBAAA,OAAK,yCAAE,IAAK,CAAA,KAAA,CAAA,iBAAA,CAAA,CAAA,CAAA;;iCACb,MAAiC;kDAA9B,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,QAAA,CAAA,CAAA,EAAA,CAAA,YAAA;;;;;WAEO,MAAQ,CAAA,QAAA;4BAApBH,kBAA4G,CAAA,MAAA,EAA5G,WAA4G,EAAAI,eAAA,CAAjB,MAAO,CAAA,QAAA,CAAA,EAAA,CAAA,YAAA;;;;;;;;;"}
1
+ {"version":3,"file":"CnActionsBar.vue3.js","sources":["../../../../src/components/CnActionsBar/CnActionsBar.vue?vue&type=template&id=bbd17a4c&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<!-- `searchPlacement: \"toolbar\"`: the search field on row 1, before\n\t\t\t Filter and the view switch, instead of opening row 2. -->\n\t\t\t<div v-if=\"showSearch && searchInToolbar\"\n\t\t\t\tclass=\"cn-actions-bar__search cn-actions-bar__search--toolbar\"\n\t\t\t\tdata-testid=\"cn-actions-bar-search-toolbar\">\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 in this list')\"\n\t\t\t\t\t:value=\"searchValue\"\n\t\t\t\t\t:aria-label=\"searchPlaceholder || t('nextcloud-vue', 'Search in this list')\"\n\t\t\t\t\t@input=\"onSearchInput\">\n\t\t\t</div>\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 || $slots['filter-menu'] || (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<!--\n\t\t\t\t\t@slot filter-menu\n\t\t\t\t\t@description Board look, row 1: the Filter button drawn as a menu, for a page with no filter sidebar (`filterMenu`). Ignored while the sidebar toggle is shown.\n\t\t\t\t-->\n\t\t\t\t<slot v-else name=\"filter-menu\" />\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 A segment that opens another PAGE (`viewModeLinks`) is a link, never pressed. -->\n\t\t\t\t\t<template v-for=\"seg in viewSegments\" :key=\"seg.mode\">\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\tv-if=\"seg.link\"\n\t\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-btn cn-actions-bar__view-toggle-btn--link\"\n\t\t\t\t\t\t\t:href=\"seg.link.href\"\n\t\t\t\t\t\t\t:aria-label=\"seg.label\"\n\t\t\t\t\t\t\t:title=\"seg.label\"\n\t\t\t\t\t\t\t:data-mode=\"seg.mode\"\n\t\t\t\t\t\t\tdata-testid=\"cn-actions-bar-view-link\"\n\t\t\t\t\t\t\t@click=\"onViewLinkClick($event, seg)\">\n\t\t\t\t\t\t\t<CnIcon v-if=\"seg.icon\"\n\t\t\t\t\t\t\t\t:name=\"seg.icon\"\n\t\t\t\t\t\t\t\t:size=\"18\"\n\t\t\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-icon\" />\n\t\t\t\t\t\t\t<component :is=\"seg.boardFallback || seg.fallback\"\n\t\t\t\t\t\t\t\tv-else\n\t\t\t\t\t\t\t\t:size=\"18\"\n\t\t\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-icon\" />\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tv-else\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-btn\"\n\t\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\t:aria-pressed=\"viewMode === seg.mode\"\n\t\t\t\t\t\t\t:aria-label=\"seg.label\"\n\t\t\t\t\t\t\t:title=\"seg.disabled ? unavailableViewLabel(seg.label) : seg.label\"\n\t\t\t\t\t\t\t:disabled=\"seg.disabled\"\n\t\t\t\t\t\t\t:data-mode=\"seg.mode\"\n\t\t\t\t\t\t\t@click=\"seg.disabled || $emit('view-mode-change', seg.mode)\">\n\t\t\t\t\t\t\t<CnIcon v-if=\"seg.icon\"\n\t\t\t\t\t\t\t\t:name=\"seg.icon\"\n\t\t\t\t\t\t\t\t:size=\"18\"\n\t\t\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-icon\" />\n\t\t\t\t\t\t\t<component :is=\"seg.boardFallback || seg.fallback\"\n\t\t\t\t\t\t\t\tv-else\n\t\t\t\t\t\t\t\t:size=\"18\"\n\t\t\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-icon\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</template>\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 in this list')\"\n\t\t\t\t\t:value=\"searchValue\"\n\t\t\t\t\t:aria-label=\"searchPlaceholder || t('nextcloud-vue', 'Search in this list')\"\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 && !searchInToolbar\" 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 in this list')\"\n\t\t\t\t\t:value=\"searchValue\"\n\t\t\t\t\t:aria-label=\"searchPlaceholder || t('nextcloud-vue', 'Search in this list')\"\n\t\t\t\t\t@input=\"onSearchInput\">\n\t\t\t</div>\n\t\t\t<span v-else-if=\"showCount && hasTotal && !searchInToolbar\" 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 inlineBulkActions\"\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<!-- Bulk actions declared with `menu: true` gather under More. -->\n\t\t\t<NcActions\n\t\t\t\tv-if=\"menuBulkActions.length > 0\"\n\t\t\t\t:menuName=\"t('nextcloud-vue', 'More')\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t:forceMenu=\"true\"\n\t\t\t\tdata-testid=\"cn-bulk-more\">\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-for=\"entry in menuBulkActions\"\n\t\t\t\t\t:key=\"entry.id\"\n\t\t\t\t\t:closeAfterClick=\"true\"\n\t\t\t\t\t:disabled=\"entry.disabled === true\"\n\t\t\t\t\t:data-testid=\"`cn-bulk-action-${entry.id}`\"\n\t\t\t\t\t:lang=\"bulkLang(entry)\"\n\t\t\t\t\t@click=\"$emit('bulk-action', { id: entry.id, action: entry.id, selectedIds, count: selectedIds.length })\">\n\t\t\t\t\t<template v-if=\"entry.icon\" #icon>\n\t\t\t\t\t\t<CnIcon :name=\"entry.icon\" :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ entry.label ? effectiveTranslate(entry.label) : entry.label }}\n\t\t\t\t</NcActionButton>\n\t\t\t</NcActions>\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, while rows are selected; with\n\t\t`bulkBandAlways` also before, its buttons disabled until there is a\n\t\tselection (DqZaken, DqWerkbord). The count stays announced by the live\n\t\tregion above.\n\t-->\n\t<div\n\t\tv-if=\"isBoardLayout && selectable && (selectedIds.length > 0 || (bulkBandAlways && bulkBandHasActions))\"\n\t\tclass=\"cn-actions-bar__band\"\n\t\t:class=\"{ 'cn-actions-bar__band--idle': selectedIds.length === 0 }\"\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\">{{ bulkLead || bulkBandLead }}</strong>\n\t\t<NcButton\n\t\t\tv-if=\"showMassCopy\"\n\t\t\tvariant=\"secondary\"\n\t\t\t:disabled=\"selectedIds.length === 0\"\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:disabled=\"selectedIds.length === 0\"\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 inlineBulkActions\"\n\t\t\t:key=\"entry.id\"\n\t\t\tvariant=\"secondary\"\n\t\t\t:disabled=\"entry.disabled === true || selectedIds.length === 0\"\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<template v-if=\"entry.icon\" #icon>\n\t\t\t\t<CnIcon :name=\"entry.icon\" :size=\"16\" />\n\t\t\t</template>\n\t\t\t{{ entry.label ? effectiveTranslate(entry.label) : entry.label }}\n\t\t</NcButton>\n\t\t<NcActions\n\t\t\tv-if=\"menuBulkActions.length > 0\"\n\t\t\t:menuName=\"t('nextcloud-vue', 'More')\"\n\t\t\tvariant=\"secondary\"\n\t\t\t:forceMenu=\"true\"\n\t\t\t:disabled=\"selectedIds.length === 0\"\n\t\t\tdata-testid=\"cn-bulk-band-more\">\n\t\t\t<NcActionButton\n\t\t\t\tv-for=\"entry in menuBulkActions\"\n\t\t\t\t:key=\"entry.id\"\n\t\t\t\t:closeAfterClick=\"true\"\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<template v-if=\"entry.icon\" #icon>\n\t\t\t\t\t<CnIcon :name=\"entry.icon\" :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ entry.label ? effectiveTranslate(entry.label) : entry.label }}\n\t\t\t</NcActionButton>\n\t\t</NcActions>\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<NcButton\n\t\t\tv-if=\"bulkCancel\"\n\t\t\tvariant=\"secondary\"\n\t\t\tdata-testid=\"cn-bulk-band-cancel\"\n\t\t\t@click=\"$emit('clear-selection')\">\n\t\t\t{{ t('nextcloud-vue', 'Cancel') }}\n\t\t</NcButton>\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 * Board look: view modes that open another PAGE instead of switching in\n\t\t * place, by mode: `{ board: { href, to? } }`. Such a segment is drawn as\n\t\t * a link in its place in the switch; `to` (a router location) is pushed\n\t\t * on a plain click, `href` serves a new tab. A mode the page offers in\n\t\t * place stays a button. Ignored without the board look.\n\t\t *\n\t\t * @type {{[mode: string]: {href: string, to?: (object|string)}}}\n\t\t * @spec openspec/changes/screens-view-switch-links/specs/view-switch/spec.md#requirement-a-view-switch-segment-can-open-another-page\n\t\t */\n\t\tviewModeLinks: {\n\t\t\ttype: Object,\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/**\n\t\t * Board look: draw the bulk band also before anything is selected, its\n\t\t * buttons disabled until there is a selection, as DqZaken and DqWerkbord\n\t\t * draw it. Only when the band has an action to offer.\n\t\t */\n\t\tbulkBandAlways: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Board look: the band's lead instead of \"With the selected …\" (\"1 zaak geselecteerd\"). */\n\t\tbulkLead: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Board look: a Cancel button at the end of the band that clears the selection. */\n\t\tbulkCancel: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\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/**\n\t\t * Where the board look draws the search field: `''` (the default) at\n\t\t * the start of row 2, `'toolbar'` on row 1 before Filter and the view\n\t\t * switch (DqTeamwachtrij). No effect outside the board look.\n\t\t *\n\t\t * @type {''|'toolbar'}\n\t\t */\n\t\tsearchPlacement: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t\tvalidator: (v) => ['', 'toolbar'].includes(v),\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 * An entry with `menu: true` is listed under a More menu after the\n\t\t * buttons instead of as a button of its own.\n\t\t *\n\t\t * @type {Array<{ id: string, label: string, icon?: string, disabled?: boolean, menu?: 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 search field sits on the board's row 1.\n\t\t *\n\t\t * @spec openspec/changes/index-search-on-toolbar/specs/index-page/spec.md#requirement-the-search-field-can-sit-on-the-toolbar-row\n\t\t * @return {boolean}\n\t\t */\n\t\tsearchInToolbar() {\n\t\t\treturn this.isBoardLayout && this.searchPlacement === 'toolbar'\n\t\t},\n\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 * Whether the bulk band has an action to offer: copy, delete, a\n\t\t * declared bulk action or the host's own buttons.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\t/**\n\t\t * The bulk actions drawn as buttons: every one without `menu: true`.\n\t\t *\n\t\t * @spec openspec/changes/bulk-actions-more-menu/specs/bulk-actions-more-menu/spec.md#requirement-a-bulk-action-can-sit-under-more\n\t\t * @return {Array<object>}\n\t\t */\n\t\tinlineBulkActions() {\n\t\t\treturn (this.bulkActions || []).filter((entry) => entry && entry.menu !== true)\n\t\t},\n\n\t\t/**\n\t\t * The bulk actions gathered under the selection's More menu (`menu: true`).\n\t\t *\n\t\t * @spec openspec/changes/bulk-actions-more-menu/specs/bulk-actions-more-menu/spec.md#requirement-a-bulk-action-can-sit-under-more\n\t\t * @return {Array<object>}\n\t\t */\n\t\tmenuBulkActions() {\n\t\t\treturn (this.bulkActions || []).filter((entry) => entry && entry.menu === true)\n\t\t},\n\n\t\tbulkBandHasActions() {\n\t\t\treturn this.showMassCopy || this.showMassDelete\n\t\t\t\t|| (Array.isArray(this.bulkActions) && this.bulkActions.length > 0)\n\t\t\t\t|| Boolean(this.$slots['selection-actions'])\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\t// A mode that opens another page: a link, unless the page offers it in place.\n\t\t\t\tconst links = this.viewModeLinks && typeof this.viewModeLinks === 'object' ? this.viewModeLinks : {}\n\t\t\t\tconst linked = Object.keys(links).filter((mode) => !modes.includes(mode) && links[mode] && typeof links[mode].href === 'string' && links[mode].href !== '')\n\t\t\t\tconst disabled = (this.disabledViewModes || []).filter((mode) => !modes.includes(mode) && !linked.includes(mode))\n\t\t\t\tconst all = [...modes, ...linked, ...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), link: linked.includes(mode) ? links[mode] : null }))\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 * A click on a segment that opens another page: a plain click goes\n\t\t * through the router when the link names a route; a modified click\n\t\t * (new tab) and a link without a route are left to the browser.\n\t\t *\n\t\t * @param {MouseEvent} event The click.\n\t\t * @param {{link: {href: string, to?: (object|string)}}} seg The segment.\n\t\t */\n\t\tonViewLinkClick(event, seg) {\n\t\t\tconst to = seg.link && seg.link.to\n\t\t\tif (!to || !this.$router || typeof this.$router.push !== 'function' || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || event.button > 0) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tevent.preventDefault()\n\t\t\tthis.$router.push(to)\n\t\t},\n\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","_createVNode","_createBlock","_toDisplayString","_Fragment","_renderList","_resolveDynamicComponent","_normalizeClass","_createTextVNode"],"mappings":"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"}
@@ -2,7 +2,7 @@ import script from './CnDetailWidgetHost.vue2.js';
2
2
  import { render } from './CnDetailWidgetHost.vue3.js';
3
3
 
4
4
  script.render = render;
5
- script.__scopeId = "data-v-60fe4103";
5
+ script.__scopeId = "data-v-1fc089be";
6
6
  const __sfc_main = script;
7
7
 
8
8
  export { __sfc_main as default };
@@ -1,5 +1,5 @@
1
1
  import { translate } from '@nextcloud/l10n';
2
- import { NcActionButton } from '@nextcloud/vue';
2
+ import { NcActionButton, NcButton } from '@nextcloud/vue';
3
3
  import { computed } from 'vue';
4
4
  import Plus from 'vue-material-design-icons/Plus.vue';
5
5
  import __sfc_main$9 from '../CnEmptyContent/CnEmptyContent.vue.js';
@@ -91,6 +91,7 @@ var script = {
91
91
  CnWidgetEmptyState: __sfc_main$7,
92
92
  CnWidgetWrapper: __sfc_main$8,
93
93
  NcActionButton,
94
+ NcButton,
94
95
  CnEmptyContent: __sfc_main$9,
95
96
  Plus,
96
97
  },
@@ -359,7 +360,7 @@ var script = {
359
360
  * `header` event (screens-relation-pages): a link and a note,
360
361
  * with the list's total already filled in.
361
362
  */
362
- rendererHeader: { link: null, note: '', subtitle: '', actions: [], pill: null, count: null, empty: null },
363
+ rendererHeader: { link: null, note: '', subtitle: '', actions: [], pill: null, count: null, empty: null, menuActions: [] },
363
364
  }
364
365
  },
365
366
 
@@ -1100,6 +1101,29 @@ var script = {
1100
1101
  return createActionState(this.content, this.object).visible
1101
1102
  },
1102
1103
 
1104
+ /**
1105
+ * Whether the catalog Add is a button in the card's title row: the board
1106
+ * look draws it there, right-aligned, instead of in the Actions menu and
1107
+ * the list's footer bar.
1108
+ *
1109
+ * @spec openspec/changes/board-object-list-add-button/specs/board-object-list-add-button/spec.md#requirement-the-board-look-draws-a-cards-add-as-a-title-row-button
1110
+ * @return {boolean} true when the header button renders.
1111
+ */
1112
+ catalogAddInHeader() {
1113
+ return this.catalogAddEnabled && !this.isBare && normalizeLook(this.cnLook) === 'board'
1114
+ },
1115
+
1116
+ /**
1117
+ * Whether the catalog Add is an item of the card's Actions menu, as
1118
+ * ADR-062 places it in the Nextcloud look.
1119
+ *
1120
+ * @spec openspec/changes/board-object-list-add-button/specs/board-object-list-add-button/spec.md#requirement-the-board-look-draws-a-cards-add-as-a-title-row-button
1121
+ * @return {boolean} true when the menu item renders.
1122
+ */
1123
+ catalogAddInMenu() {
1124
+ return this.catalogAddEnabled && !this.catalogAddInHeader
1125
+ },
1126
+
1103
1127
  /**
1104
1128
  * Whether the widget's overflow Actions menu renders: the definition's
1105
1129
  * own `showActions` when it is a boolean, else the surface's
@@ -1205,7 +1229,9 @@ var script = {
1205
1229
  : null;
1206
1230
  // `subtitle`: a muted line under the card title (a task table's "1 open, 3 done").
1207
1231
  const subtitle = header && typeof header.subtitle === 'string' ? header.subtitle : '';
1208
- this.rendererHeader = { link, note, subtitle, actions, pill, count, empty };
1232
+ // `menuActions`: items for the card's Actions menu instead of the title row.
1233
+ const menuActions = (header && Array.isArray(header.menuActions) ? header.menuActions : []).filter(usable);
1234
+ this.rendererHeader = { link, note, subtitle, actions, pill, count, empty, menuActions };
1209
1235
  },
1210
1236
 
1211
1237
  /**