@conduction/nextcloud-vue 2.137.0 → 2.139.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 (105) hide show
  1. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue.js +1 -1
  2. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +6 -4
  3. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
  4. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
  5. package/dist/esm/components/CnChartWidget/CnChartWidget.vue.js +1 -1
  6. package/dist/esm/components/CnChartWidget/CnChartWidget.vue2.js.map +1 -1
  7. package/dist/esm/components/CnChartWidget/CnChartWidget.vue3.js.map +1 -1
  8. package/dist/esm/components/CnDetailCard/CnDetailCard.vue.js +1 -1
  9. package/dist/esm/components/CnDetailCard/CnDetailCard.vue2.js +6 -0
  10. package/dist/esm/components/CnDetailCard/CnDetailCard.vue2.js.map +1 -1
  11. package/dist/esm/components/CnDetailCard/CnDetailCard.vue3.js +24 -7
  12. package/dist/esm/components/CnDetailCard/CnDetailCard.vue3.js.map +1 -1
  13. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue.js +1 -1
  14. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js +2 -0
  15. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -1
  16. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js.map +1 -1
  17. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js +1 -1
  18. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -1
  19. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -1
  20. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue.js +1 -1
  21. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +43 -1
  22. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
  23. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
  24. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +133 -6
  25. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  26. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +25 -17
  27. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  28. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js +2 -0
  29. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js.map +1 -1
  30. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue3.js +13 -2
  31. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue3.js.map +1 -1
  32. package/dist/esm/components/CnMailTab/dashboardRegistration.js +4 -0
  33. package/dist/esm/components/CnMailTab/dashboardRegistration.js.map +1 -1
  34. package/dist/esm/components/CnNotificationMatrix/CnNotificationMatrix.vue.js +1 -1
  35. package/dist/esm/components/CnNotificationMatrix/CnNotificationMatrix.vue2.js.map +1 -1
  36. package/dist/esm/components/CnNotificationMatrix/CnNotificationMatrix.vue3.js.map +1 -1
  37. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue.js +1 -1
  38. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +1 -1
  39. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
  40. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
  41. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue.js +1 -1
  42. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js +2 -0
  43. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js.map +1 -1
  44. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js +2 -1
  45. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js.map +1 -1
  46. package/dist/esm/components/CnOrderedListField/CnOrderedListField.vue.js +1 -1
  47. package/dist/esm/components/CnOrderedListField/CnOrderedListField.vue2.js +6 -0
  48. package/dist/esm/components/CnOrderedListField/CnOrderedListField.vue2.js.map +1 -1
  49. package/dist/esm/components/CnOrderedListField/CnOrderedListField.vue3.js +3 -3
  50. package/dist/esm/components/CnOrderedListField/CnOrderedListField.vue3.js.map +1 -1
  51. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +1 -1
  52. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +16 -0
  53. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
  54. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js +11 -5
  55. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
  56. package/dist/esm/components/CnSavedViewMenuSettings/CnSavedViewMenuSettings.vue.js +1 -1
  57. package/dist/esm/components/CnSavedViewMenuSettings/CnSavedViewMenuSettings.vue2.js.map +1 -1
  58. package/dist/esm/components/CnSavedViewMenuSettings/CnSavedViewMenuSettings.vue3.js +1 -0
  59. package/dist/esm/components/CnSavedViewMenuSettings/CnSavedViewMenuSettings.vue3.js.map +1 -1
  60. package/dist/esm/components/CnUserSettingsDialog/CnUserSettingsDialog.vue.js +1 -1
  61. package/dist/esm/components/CnUserSettingsDialog/CnUserSettingsDialog.vue2.js.map +1 -1
  62. package/dist/esm/components/CnUserSettingsDialog/CnUserSettingsDialog.vue3.js.map +1 -1
  63. package/dist/esm/composables/indexSources.js +78 -12
  64. package/dist/esm/composables/indexSources.js.map +1 -1
  65. package/dist/esm/l10n/en.json.js +12 -1
  66. package/dist/esm/l10n/en.json.js.map +1 -1
  67. package/dist/esm/l10n/nl.json.js +12 -1
  68. package/dist/esm/l10n/nl.json.js.map +1 -1
  69. package/dist/esm/library-style.js +1 -1
  70. package/dist/esm/nextcloud-vue.css +685 -512
  71. package/dist/esm/utils/resolveFilterTokens.js +9 -0
  72. package/dist/esm/utils/resolveFilterTokens.js.map +1 -1
  73. package/dist/esm/utils/sentinelTokens.js +1 -1
  74. package/dist/esm/utils/sentinelTokens.js.map +1 -1
  75. package/dist/nextcloud-vue.cjs.js +580 -236
  76. package/dist/nextcloud-vue.cjs.js.map +2 -2
  77. package/dist/nextcloud-vue.css +685 -512
  78. package/l10n/en.json +12 -1
  79. package/l10n/nl.json +12 -1
  80. package/package.json +1 -1
  81. package/src/components/CnCellRenderer/CnCellRenderer.vue +6 -4
  82. package/src/components/CnChartWidget/CnChartWidget.vue +4 -0
  83. package/src/components/CnDetailCard/CnDetailCard.md +1 -0
  84. package/src/components/CnDetailCard/CnDetailCard.vue +25 -1
  85. package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +2 -0
  86. package/src/components/CnFactsWidget/CnFactsWidget.vue +6 -4
  87. package/src/components/CnFilesBrowser/CnFilesBrowser.vue +54 -1
  88. package/src/components/CnIndexPage/CnIndexPage.vue +135 -7
  89. package/src/components/CnIndexSidebar/CnIndexSidebar.vue +10 -2
  90. package/src/components/CnMailTab/dashboardRegistration.js +4 -0
  91. package/src/components/CnNotificationMatrix/CnNotificationMatrix.vue +4 -0
  92. package/src/components/CnObjectListWidget/CnObjectListWidget.vue +1 -1
  93. package/src/components/CnObjectSidebar/CnFilesTab.vue +3 -0
  94. package/src/components/CnOrderedListField/CnOrderedListField.vue +11 -1
  95. package/src/components/CnRecordListWidget/CnRecordListWidget.vue +22 -3
  96. package/src/components/CnSavedViewMenuSettings/CnSavedViewMenuSettings.vue +1 -0
  97. package/src/components/CnUserSettingsDialog/CnUserSettingsDialog.vue +3 -0
  98. package/src/composables/indexSources.js +78 -12
  99. package/src/css/dialog.css +26 -0
  100. package/src/css/index-page.css +5 -0
  101. package/src/css/look-board-detail.css +36 -0
  102. package/src/css/look-board-index.css +21 -0
  103. package/src/css/look-board.css +47 -0
  104. package/src/utils/resolveFilterTokens.js +9 -0
  105. package/src/utils/sentinelTokens.js +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"CnDetailWidgetHost.vue2.js","sources":["../../../../src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n\n<template>\n\t<div class=\"cn-detail-widget-host\" :class=\"`cn-detail-widget-host--${chrome}`\">\n\t\t<!-- `type: 'data'` — the schema-driven data widget. In bare mode it is\n\t\t `chromeless`: no border, no background, no padding, no title row and\n\t\t no header divider, so the tab panel holds the content directly\n\t\t instead of a card inside a card.\n\n\t\t One prop, not three. `chromeless` is the word this component already\n\t\t used for the same thing on the integration path (`bareWidget`), and\n\t\t the three it replaces (`show-title`, `borderless`, `flush`) were a\n\t\t decomposition every caller had to remember in full — miss one and\n\t\t the panel keeps half a card.\n\n\t\t Chromeless does NOT mean no wrapper element. The wrapper's content\n\t\t node is what the library's table and detail-page CSS key on.\n\n\t\t It used to keep the whole card here, because its Save button lives\n\t\t in CnWidgetWrapper's header and hiding the header hid Save with it.\n\t\t The wrapper renders its header whenever there are actions, with or\n\t\t without a title, so the panel gets no title while an inline edit\n\t\t stays committable. Controls are not chrome.\n\n\t\t Passing `undefined` was never enough on its own: `title` carries a\n\t\t DEFAULT of \"Data\", so an unset title became a \"Data\" heading that\n\t\t nobody chose. The title is still passed, and now names the content\n\t\t region for a screen reader instead of printing a second heading.\n\n\t\t The overflow menu goes too, which `chromeless` does not cover. It\n\t\t left a 59px band whose only content was an Actions menu about eight\n\t\t pixels from the tab strip's own, and two menus on one row read as the\n\t\t same card inside a card in miniature.\n\n\t\t Nothing is lost, but that took a second piece of work rather than\n\t\t being true on its own. Suppressing the menu takes its two items with\n\t\t it, and Metadata had no other home anywhere: the page header carries\n\t\t no equivalent, so it became unreachable inside a panel. Edit is the\n\t\t softer case. CnDetailPage does carry a record Edit button, but it\n\t\t opens the form the PAGE configures, not the subset THIS widget\n\t\t declares through `overrides`, `include` and `exclude`, so a tabbed\n\t\t widget showing eight of forty fields lost the form scoped to its\n\t\t eight. Both items are now published to the host surface and render in\n\t\t its menu; see utils/panelActions.js. Inline editing was never\n\t\t affected: a cell opens its editor when clicked, and Save and Discard\n\t\t arrive in the header the moment there is an edit to commit. -->\n\t\t<!-- `requiredApp` names another Nextcloud app this widget leans on. When\n\t\t that app is absent the widget renders its NORMAL chrome plus a\n\t\t set-up state, and asks its backend NOTHING.\n\n\t\t It renders rather than hides on purpose. A hidden widget leaves a\n\t\t hole a reader cannot interpret, and the alternative — letting the\n\t\t query run — is worse: an aggregation over an absent app's register\n\t\t 404s and the tile shows `0`, which is exactly what a real zero\n\t\t shows. dossiq's hours tile did that on every install without\n\t\t humaniq, and looked correct doing it.\n\n\t\t \"NORMAL chrome\" means the chrome of the surface it is on. In a tab\n\t\t panel that is no chrome, same as every other widget there: a set-up\n\t\t state is still a widget, and a bordered card around it inside the\n\t\t panel is the same doubled card this file removes below. The title\n\t\t is now passed in bare mode too, where it names the content region\n\t\t rather than printing a heading the tab already carries. -->\n\t\t<CnWidgetWrapper\n\t\t\tv-if=\"missingApp\"\n\t\t\t:title=\"widgetTitle\"\n\t\t\t:subtitle=\"widgetSubtitle\"\n\t\t\t:chromeless=\"isBare\"\n\t\t\ttitleIconPosition=\"left\"\n\t\t\t:titleTone=\"widgetTitleTone\"\n\t\t\t:showRefresh=\"false\"\n\t\t\t:showRequestFeature=\"false\">\n\t\t\t<template v-if=\"widget && widget.icon\" #title-icon>\n\t\t\t\t<CnIcon :name=\"widget.icon\" :size=\"20\" />\n\t\t\t</template>\n\t\t\t<CnEmptyContent class=\"cn-requires-app\" :name=\"missingAppName\" :description=\"missingAppDescription\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<CnIcon :name=\"(widget && widget.icon) || 'PuzzleOutline'\" :size=\"32\" />\n\t\t\t\t</template>\n\t\t\t</CnEmptyContent>\n\t\t</CnWidgetWrapper>\n\n\t\t<CnObjectDataWidget\n\t\t\tv-else-if=\"isData && schemaObject\"\n\t\t\t:title=\"resolvedTitle\"\n\t\t\t:chromeless=\"isBare\"\n\t\t\t:showActions=\"!isBare && actionsShown\"\n\t\t\t:icon=\"widget.icon || null\"\n\t\t\t:schema=\"schemaObject\"\n\t\t\t:objectData=\"object\"\n\t\t\t:objectType=\"objectType\"\n\t\t\t:store=\"store\"\n\t\t\t:overrides=\"content.overrides || {}\"\n\t\t\t:include=\"content.include || null\"\n\t\t\t:exclude=\"content.exclude || []\"\n\t\t\t:hideEmpty=\"content.hideEmpty === true || hideEmpty\"\n\t\t\t:columns=\"content.columns || 3\"\n\t\t\t:collapsedFields=\"content.collapsedFields ?? null\"\n\t\t\t:footnote=\"content.footnote || ''\"\n\t\t\t:editable=\"content.editable !== false\" />\n\n\t\t<!-- `type: 'related'` — resolves this object's relations and links into\n\t\t integrations. Honours bare mode via its own `bare` prop. -->\n\t\t<CnRelatedObjectsWidget\n\t\t\tv-else-if=\"isRelated\"\n\t\t\t:title=\"resolvedTitle\"\n\t\t\t:bare=\"isBare\"\n\t\t\t:objectType=\"objectType\"\n\t\t\t:objectId=\"objectId\"\n\t\t\t:objectData=\"object\"\n\t\t\t:register=\"register\"\n\t\t\t:schema=\"schema\"\n\t\t\t:store=\"store\"\n\t\t\t:includeGroups=\"content.groups || []\"\n\t\t\t:layout=\"content.layout\"\n\t\t\t:groupByRelation=\"content.groupByRelation\"\n\t\t\t:groupActions=\"content.groupActions\"\n\t\t\t:showObjects=\"content.showObjects\"\n\t\t\t:showFiles=\"content.showFiles\"\n\t\t\t:showIntegrations=\"content.showIntegrations\"\n\t\t\t:showContracts=\"content.showContracts\"\n\t\t\t:excludeIntegrations=\"content.excludeIntegrations\"\n\t\t\t:extraSources=\"content.extraSources\"\n\t\t\t:referenceSections=\"content.referenceSections\"\n\t\t\t:footerActions=\"content.footerActions\"\n\t\t\t:showAddFooter=\"content.showAddFooter\"\n\t\t\t:emptyLabel=\"content.emptyLabel\"\n\t\t\t:hideSingleTabTitle=\"content.hideSingleTabTitle !== false\"\n\t\t\t:showTotalCount=\"content.showTotalCount !== false\"\n\t\t\t@openIntegration=\"onOpenIntegration\"\n\t\t\t@selectObject=\"onSelectObject\" />\n\n\t\t<!-- `type: 'object-geo'` — view/edit the object's `@self.geo` on a map. -->\n\t\t<CnObjectGeoWidget\n\t\t\tv-else-if=\"isGeo\"\n\t\t\t:title=\"resolvedTitle\"\n\t\t\t:objectId=\"objectId\"\n\t\t\t:objectData=\"object\"\n\t\t\t:register=\"register\"\n\t\t\t:schema=\"schema\"\n\t\t\t:editable=\"content.editable !== false\"\n\t\t\t:addressSearch=\"content.addressSearch === true\"\n\t\t\t:basemap=\"content.basemap || 'standard'\"\n\t\t\t:allowBasemapSwitch=\"content.allowBasemapSwitch === true\"\n\t\t\t:fitControl=\"content.fitControl !== false\"\n\t\t\t:locateControl=\"content.locateControl !== false\"\n\t\t\t:fullscreenControl=\"content.fullscreenControl !== false\"\n\t\t\t:height=\"content.height || '360px'\"\n\t\t\t:defaultZoom=\"content.defaultZoom || 7\"\n\t\t\t@saved=\"onGeoSaved\" />\n\n\t\t<!-- Mount-mode integration leaf (openregister#2127): a bare host-owned\n\t\t element the leaf mounts its own framework into. -->\n\t\t<!-- An integration widget whose `props` name a value the record does not\n\t\t hold yet (`objectId: \"@object.caseReference\"` on a ticket with no\n\t\t case) is absent. Mounting it would hand the leaf an empty host, and a\n\t\t leaf falls back to the page's own object from there. -->\n\t\t<span\n\t\t\tv-else-if=\"(isIntegration && widgetPropsPending) || consumerWidgetWaiting\"\n\t\t\thidden\n\t\t\tdata-testid=\"cn-detail-widget-props-pending\" />\n\n\t\t<!-- A mount-mode leaf whose descriptor asks for the library card\n\t\t (`chrome: \"card\"`): the host draws the card, its title with the\n\t\t count the leaf reports, the leaf's actions in the title row and the\n\t\t library empty state. The leaf reports them through the `onHeader`\n\t\t mount prop and renders only its rows. -->\n\t\t<CnWidgetWrapper\n\t\t\tv-else-if=\"wrapsMountLeaf\"\n\t\t\t:title=\"leafCardTitle\"\n\t\t\t:showTitle=\"leafCardTitle !== ''\"\n\t\t\ttitleIconPosition=\"left\"\n\t\t\t:titleTone=\"widgetTitleTone\"\n\t\t\t:showActions=\"false\"\n\t\t\t:showRefresh=\"false\"\n\t\t\t:showRequestFeature=\"false\"\n\t\t\t:headerLink=\"cardHeaderLink\"\n\t\t\tclass=\"cn-detail-page__leaf-card\"\n\t\t\tdata-testid=\"cn-detail-widget-leaf-card\">\n\t\t\t<template v-if=\"leafCardIcon\" #title-icon>\n\t\t\t\t<CnIcon :name=\"leafCardIcon\" :size=\"20\" />\n\t\t\t</template>\n\t\t\t<template v-if=\"rendererHeader.count !== null\" #title-meta>\n\t\t\t\t<span class=\"cn-detail-page__catalog-count\" data-testid=\"cn-detail-widget-header-count\">{{ rendererHeader.count }}</span>\n\t\t\t</template>\n\t\t\t<template v-if=\"hasRendererHeaderItems\" #actions>\n\t\t\t\t<CnDetailWidgetHeaderItems :header=\"rendererHeader\" />\n\t\t\t</template>\n\t\t\t<!-- `content.leadWidgetIds`: other widgets drawn inside this card, before its own content. -->\n\t\t\t<CnDetailWidgetHost\n\t\t\t\tv-for=\"lead in leadWidgets\"\n\t\t\t\t:key=\"`lead-${lead.id}`\"\n\t\t\t\tclass=\"cn-detail-widget-host__lead\"\n\t\t\t\t:widget=\"lead\"\n\t\t\t\tchrome=\"bare\"\n\t\t\t\t:objectId=\"objectId\"\n\t\t\t\t:object=\"object\"\n\t\t\t\t:objectType=\"objectType\"\n\t\t\t\t:register=\"register\"\n\t\t\t\t:schema=\"schema\"\n\t\t\t\t:store=\"store\"\n\t\t\t\t:availableWidgets=\"availableWidgets\"\n\t\t\t\t:cnRegistry=\"cnRegistry\" />\n\t\t\t<CnWidgetEmptyState\n\t\t\t\tv-if=\"rendererHeader.empty\"\n\t\t\t\t:name=\"rendererHeader.empty.name\"\n\t\t\t\t:description=\"rendererHeader.empty.description\" />\n\t\t\t<CnLeafMountHost\n\t\t\t\t:provider=\"integrationProvider\"\n\t\t\t\t:mountProps=\"integrationMountProps\" />\n\t\t</CnWidgetWrapper>\n\n\t\t<CnLeafMountHost\n\t\t\tv-else-if=\"isMountIntegration\"\n\t\t\t:provider=\"integrationProvider\"\n\t\t\t:mountProps=\"integrationMountProps\" />\n\n\t\t<!-- An integration widget with `content.view: \"tab\"` on a card surface:\n\t\t the leaf's full tab (its rows and its own buttons) inside a card the\n\t\t widget titles, instead of the provider's compact count card. -->\n\t\t<CnWidgetWrapper\n\t\t\tv-else-if=\"wrapsLeafTab\"\n\t\t\t:title=\"leafCardTitle\"\n\t\t\t:showTitle=\"leafCardTitle !== ''\"\n\t\t\t:subtitle=\"widgetSubtitle\"\n\t\t\ttitleIconPosition=\"left\"\n\t\t\t:titleTone=\"widgetTitleTone\"\n\t\t\t:showActions=\"false\"\n\t\t\t:showRefresh=\"false\"\n\t\t\t:showRequestFeature=\"false\"\n\t\t\tclass=\"cn-detail-page__leaf-card\"\n\t\t\tdata-testid=\"cn-detail-widget-tab-card\">\n\t\t\t<template v-if=\"leafCardIcon\" #title-icon>\n\t\t\t\t<CnIcon :name=\"leafCardIcon\" :size=\"20\" />\n\t\t\t</template>\n\t\t\t<!-- `content.leadWidgetIds`: other widgets drawn inside this card, before its own content. -->\n\t\t\t<CnDetailWidgetHost\n\t\t\t\tv-for=\"lead in leadWidgets\"\n\t\t\t\t:key=\"`lead-${lead.id}`\"\n\t\t\t\tclass=\"cn-detail-widget-host__lead\"\n\t\t\t\t:widget=\"lead\"\n\t\t\t\tchrome=\"bare\"\n\t\t\t\t:objectId=\"objectId\"\n\t\t\t\t:object=\"object\"\n\t\t\t\t:objectType=\"objectType\"\n\t\t\t\t:register=\"register\"\n\t\t\t\t:schema=\"schema\"\n\t\t\t\t:store=\"store\"\n\t\t\t\t:availableWidgets=\"availableWidgets\"\n\t\t\t\t:cnRegistry=\"cnRegistry\" />\n\t\t\t<component :is=\"resolveRegistryTab(widget.integrationId)\" v-bind=\"integrationProps\" />\n\t\t</CnWidgetWrapper>\n\n\t\t<!-- Integration leaf, component mode. In BARE mode this renders the\n\t\t provider's `tab` (its bare content) rather than its `widget` (which\n\t\t draws its own card). That pairing is not an invention here:\n\t\t CnIntegrationWidget already renders `provider.tab` inside its own\n\t\t tab panels for exactly this reason. -->\n\t\t<component\n\t\t\t:is=\"integrationComponent\"\n\t\t\tv-else-if=\"isIntegration && integrationComponent\"\n\t\t\tv-bind=\"integrationProps\" />\n\n\t\t<!-- An integration whose leaf is not registered (its app is absent or\n\t\t its bundle did not load) says so, as CnIntegrationWidget does. -->\n\t\t<CnIntegrationWidgetEmpty\n\t\t\tv-else-if=\"integrationAbsent\"\n\t\t\t:provider=\"absentIntegrationProvider\"\n\t\t\t:reason=\"absentIntegrationProvider.appName ? 'missing-app' : 'unknown'\"\n\t\t\tdata-testid=\"cn-detail-widget-integration-absent\" />\n\n\t\t<!-- Content-only catalog widgets (object-list / table / files) render\n\t\t bare tables. On a card surface they get the titled wrapper (ADR-062:\n\t\t every body widget has chrome and its manifest title); inside a tab\n\t\t the strip supplies both, so they render as-is.\n\n\t\t The `cn-detail-page__*` classes here and below keep their old names\n\t\t although the markup moved out of CnDetailPage: src/css/detail-page.css\n\t\t targets them, and so may consumer app CSS. Renaming them to match this\n\t\t component would be a silent visual regression across the fleet. -->\n\t\t<CnWidgetWrapper\n\t\t\tv-else-if=\"renderer && isContentOnly && !isBare\"\n\t\t\t:title=\"widget.title || ''\"\n\t\t\t:subtitle=\"rendererHeader.subtitle || widgetSubtitle\"\n\t\t\ttitleIconPosition=\"left\"\n\t\t\t:titleTone=\"widgetTitleTone\"\n\t\t\t:showActions=\"actionsShown || catalogAddInMenu || rendererHeader.menuActions.length > 0\"\n\t\t\t:showRefresh=\"false\"\n\t\t\t:showRequestFeature=\"false\"\n\t\t\t:headerLink=\"cardHeaderLink\"\n\t\t\tclass=\"cn-detail-page__catalog-card\">\n\t\t\t<template v-if=\"widget.icon\" #title-icon>\n\t\t\t\t<CnIcon :name=\"widget.icon\" :size=\"20\" />\n\t\t\t</template>\n\t\t\t<!-- A renderer that reports its own header (`header` event:\n\t\t\t `{ link, note, action, actions, pill }`, e.g. record-list's \"3 in\n\t\t\t totaal\", a facts card's status pill). -->\n\t\t\t<template v-if=\"hasRendererHeaderItems || catalogAddInHeader\" #actions>\n\t\t\t\t<CnDetailWidgetHeaderItems v-if=\"hasRendererHeaderItems\" :header=\"rendererHeader\" />\n\t\t\t\t<!-- The board look draws the catalog Add as a button in the title\n\t\t\t\t row; the list's footer Add is hidden there (look-board-detail.css). -->\n\t\t\t\t<NcButton\n\t\t\t\t\tv-if=\"catalogAddInHeader\"\n\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\tclass=\"cn-detail-page__catalog-add\"\n\t\t\t\t\tdata-testid=\"cn-detail-widget-catalog-add\"\n\t\t\t\t\t@click=\"invokeCatalogAdd\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<Plus :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ addLabel }}\n\t\t\t\t</NcButton>\n\t\t\t</template>\n\t\t\t<template v-if=\"catalogAddInMenu || rendererHeader.menuActions.length > 0\" #action-items>\n\t\t\t\t<NcActionButton v-if=\"catalogAddInMenu\" @click=\"invokeCatalogAdd\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<Plus :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ addLabel }}\n\t\t\t\t</NcActionButton>\n\t\t\t\t<!-- `menuActions` a renderer reports: items in the card's Actions menu. -->\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-for=\"(action, index) in rendererHeader.menuActions\"\n\t\t\t\t\t:key=\"`menu-${index}-${action.label}`\"\n\t\t\t\t\t:closeAfterClick=\"true\"\n\t\t\t\t\tdata-testid=\"cn-detail-widget-menu-action\"\n\t\t\t\t\t@click=\"action.run()\">\n\t\t\t\t\t<template v-if=\"action.icon\" #icon>\n\t\t\t\t\t\t<CnIcon :name=\"action.icon\" :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ action.label }}\n\t\t\t\t</NcActionButton>\n\t\t\t</template>\n\t\t\t<!-- `content.leadWidgetIds`: other widgets drawn inside this card, before its own content. -->\n\t\t\t<CnDetailWidgetHost\n\t\t\t\tv-for=\"lead in leadWidgets\"\n\t\t\t\t:key=\"`lead-${lead.id}`\"\n\t\t\t\tclass=\"cn-detail-widget-host__lead\"\n\t\t\t\t:widget=\"lead\"\n\t\t\t\tchrome=\"bare\"\n\t\t\t\t:objectId=\"objectId\"\n\t\t\t\t:object=\"object\"\n\t\t\t\t:objectType=\"objectType\"\n\t\t\t\t:register=\"register\"\n\t\t\t\t:schema=\"schema\"\n\t\t\t\t:store=\"store\"\n\t\t\t\t:availableWidgets=\"availableWidgets\"\n\t\t\t\t:cnRegistry=\"cnRegistry\" />\n\t\t\t<component\n\t\t\t\t:is=\"renderer\"\n\t\t\t\tref=\"renderer\"\n\t\t\t\tv-bind=\"rendererProps\"\n\t\t\t\t@header=\"onRendererHeader\"\n\t\t\t\t@selectObject=\"onSelectObject\" />\n\t\t</CnWidgetWrapper>\n\n\t\t<!-- Registry \"card\" widgets (stat / gauge / delta) render bare tile\n\t\t content, so on a card surface they need the same titled wrapper the\n\t\t dashboard gives them (ADR-062: a lone stat must not read as uncarded\n\t\t floating text). `card-fit` centres the tile and drops the inner\n\t\t scrollbar. No Actions menu: it would hold nothing here and squeezes\n\t\t the title of a narrow tile. -->\n\t\t<CnWidgetWrapper\n\t\t\tv-else-if=\"renderer && isCard && !isBare\"\n\t\t\t:title=\"widget.title || content.title || ''\"\n\t\t\t:subtitle=\"widgetSubtitle\"\n\t\t\t:showTitle=\"effectiveShowCardTitle\"\n\t\t\ttitleIconPosition=\"left\"\n\t\t\t:titleTone=\"widgetTitleTone\"\n\t\t\tflush\n\t\t\t:showActions=\"false\"\n\t\t\t:showRefresh=\"false\"\n\t\t\t:showRequestFeature=\"false\"\n\t\t\t:headerLink=\"cardHeaderLink\"\n\t\t\tclass=\"cn-detail-page__card-fit\">\n\t\t\t<template v-if=\"widget.icon\" #title-icon>\n\t\t\t\t<CnIcon :name=\"widget.icon\" :size=\"20\" />\n\t\t\t</template>\n\t\t\t<!-- `content.leadWidgetIds`: other widgets drawn inside this card, before its own content. -->\n\t\t\t<CnDetailWidgetHost\n\t\t\t\tv-for=\"lead in leadWidgets\"\n\t\t\t\t:key=\"`lead-${lead.id}`\"\n\t\t\t\tclass=\"cn-detail-widget-host__lead\"\n\t\t\t\t:widget=\"lead\"\n\t\t\t\tchrome=\"bare\"\n\t\t\t\t:objectId=\"objectId\"\n\t\t\t\t:object=\"object\"\n\t\t\t\t:objectType=\"objectType\"\n\t\t\t\t:register=\"register\"\n\t\t\t\t:schema=\"schema\"\n\t\t\t\t:store=\"store\"\n\t\t\t\t:availableWidgets=\"availableWidgets\"\n\t\t\t\t:cnRegistry=\"cnRegistry\" />\n\t\t\t<component :is=\"renderer\" :content=\"content\" v-bind=\"declaredContent\" />\n\t\t</CnWidgetWrapper>\n\n\t\t<!-- A chart on a card surface: the titled card every body widget\n\t\t carries (ADR-062), with the whole prop bag, so record tokens in its\n\t\t `cellSource` or `dataSource` still resolve. In a tab panel it stays\n\t\t bare. -->\n\t\t<CnWidgetWrapper\n\t\t\tv-else-if=\"renderer && wrapsChart\"\n\t\t\t:title=\"widget.title || ''\"\n\t\t\t:subtitle=\"widgetSubtitle\"\n\t\t\ttitleIconPosition=\"left\"\n\t\t\t:titleTone=\"widgetTitleTone\"\n\t\t\t:showActions=\"false\"\n\t\t\t:showRefresh=\"false\"\n\t\t\t:showRequestFeature=\"false\"\n\t\t\t:headerLink=\"cardHeaderLink\"\n\t\t\tclass=\"cn-detail-page__card-fit\"\n\t\t\tdata-testid=\"cn-detail-widget-chart-card\">\n\t\t\t<template v-if=\"widget.icon\" #title-icon>\n\t\t\t\t<CnIcon :name=\"widget.icon\" :size=\"20\" />\n\t\t\t</template>\n\t\t\t<component\n\t\t\t\t:is=\"renderer\"\n\t\t\t\tref=\"renderer\"\n\t\t\t\tv-bind=\"rendererProps\"\n\t\t\t\t@selectObject=\"onSelectObject\" />\n\t\t</CnWidgetWrapper>\n\n\t\t<!-- An app's own widget (consumer registry) on a card surface, the\n\t\t side column or a tab stack, whose registry entry asks for the\n\t\t titled card (`chrome: \"card\"`). Opt-in: many app widgets draw their\n\t\t own card. A body grid cell has its own card, so there it stays\n\t\t bare. -->\n\t\t<CnWidgetWrapper\n\t\t\tv-else-if=\"renderer && wrapsConsumerWidget\"\n\t\t\t:title=\"widget.title || ''\"\n\t\t\t:subtitle=\"rendererHeader.subtitle || widgetSubtitle\"\n\t\t\t:showTitle=\"effectiveShowCardTitle\"\n\t\t\ttitleIconPosition=\"left\"\n\t\t\t:titleTone=\"widgetTitleTone\"\n\t\t\t:showActions=\"false\"\n\t\t\t:showRefresh=\"false\"\n\t\t\t:showRequestFeature=\"false\"\n\t\t\t:headerLink=\"cardHeaderLink\"\n\t\t\tclass=\"cn-detail-page__consumer-card\"\n\t\t\tdata-testid=\"cn-detail-widget-consumer-card\">\n\t\t\t<template v-if=\"widget.icon\" #title-icon>\n\t\t\t\t<CnIcon :name=\"widget.icon\" :size=\"20\" />\n\t\t\t</template>\n\t\t\t<!-- The app widget reports its title row the way the built-in\n\t\t\t cards do (`header` event). -->\n\t\t\t<template v-if=\"hasRendererHeaderItems\" #actions>\n\t\t\t\t<CnDetailWidgetHeaderItems :header=\"rendererHeader\" />\n\t\t\t</template>\n\t\t\t<!-- `content.leadWidgetIds`: other widgets drawn inside this card, before its own content. -->\n\t\t\t<CnDetailWidgetHost\n\t\t\t\tv-for=\"lead in leadWidgets\"\n\t\t\t\t:key=\"`lead-${lead.id}`\"\n\t\t\t\tclass=\"cn-detail-widget-host__lead\"\n\t\t\t\t:widget=\"lead\"\n\t\t\t\tchrome=\"bare\"\n\t\t\t\t:objectId=\"objectId\"\n\t\t\t\t:object=\"object\"\n\t\t\t\t:objectType=\"objectType\"\n\t\t\t\t:register=\"register\"\n\t\t\t\t:schema=\"schema\"\n\t\t\t\t:store=\"store\"\n\t\t\t\t:availableWidgets=\"availableWidgets\"\n\t\t\t\t:cnRegistry=\"cnRegistry\" />\n\t\t\t<component\n\t\t\t\t:is=\"renderer\"\n\t\t\t\tref=\"renderer\"\n\t\t\t\tv-bind=\"rendererProps\"\n\t\t\t\t@header=\"onRendererHeader\"\n\t\t\t\t@selectObject=\"onSelectObject\" />\n\t\t</CnWidgetWrapper>\n\n\t\t<!-- A titled `sections` widget in the side column or a tab stack: its\n\t\t sections stack inside one titled card, as the other cards there\n\t\t are drawn. A grid cell has its own card, and `content.cards` makes\n\t\t every section a card of its own, so both stay as they are. -->\n\t\t<CnWidgetWrapper\n\t\t\tv-else-if=\"renderer && wrapsSections\"\n\t\t\t:title=\"widget.title\"\n\t\t\t:subtitle=\"widgetSubtitle\"\n\t\t\t:showTitle=\"effectiveShowCardTitle\"\n\t\t\ttitleIconPosition=\"left\"\n\t\t\t:titleTone=\"widgetTitleTone\"\n\t\t\t:showActions=\"false\"\n\t\t\t:showRefresh=\"false\"\n\t\t\t:showRequestFeature=\"false\"\n\t\t\t:headerLink=\"cardHeaderLink\"\n\t\t\tclass=\"cn-detail-page__sections-card\"\n\t\t\tdata-testid=\"cn-detail-widget-sections-card\">\n\t\t\t<template v-if=\"widget.icon\" #title-icon>\n\t\t\t\t<CnIcon :name=\"widget.icon\" :size=\"20\" />\n\t\t\t</template>\n\t\t\t<!-- `content.leadWidgetIds`: other widgets drawn inside this card, before its own content. -->\n\t\t\t<CnDetailWidgetHost\n\t\t\t\tv-for=\"lead in leadWidgets\"\n\t\t\t\t:key=\"`lead-${lead.id}`\"\n\t\t\t\tclass=\"cn-detail-widget-host__lead\"\n\t\t\t\t:widget=\"lead\"\n\t\t\t\tchrome=\"bare\"\n\t\t\t\t:objectId=\"objectId\"\n\t\t\t\t:object=\"object\"\n\t\t\t\t:objectType=\"objectType\"\n\t\t\t\t:register=\"register\"\n\t\t\t\t:schema=\"schema\"\n\t\t\t\t:store=\"store\"\n\t\t\t\t:availableWidgets=\"availableWidgets\"\n\t\t\t\t:cnRegistry=\"cnRegistry\" />\n\t\t\t<component\n\t\t\t\t:is=\"renderer\"\n\t\t\t\tref=\"renderer\"\n\t\t\t\tv-bind=\"rendererProps\"\n\t\t\t\t@selectObject=\"onSelectObject\" />\n\t\t</CnWidgetWrapper>\n\n\t\t<!-- A library widget that draws its own title row and asks for the\n\t\t card (registry `ownsTitle` + `chrome: \"card\"`): an untitled card\n\t\t on a card surface, so it does not float bare in a tab stack. -->\n\t\t<CnWidgetWrapper\n\t\t\tv-else-if=\"renderer && wrapsSelfTitledWidget\"\n\t\t\t:showTitle=\"false\"\n\t\t\t:showActions=\"false\"\n\t\t\t:showRefresh=\"false\"\n\t\t\t:showRequestFeature=\"false\"\n\t\t\tclass=\"cn-detail-page__self-titled-card\"\n\t\t\tdata-testid=\"cn-detail-widget-self-titled-card\">\n\t\t\t<component\n\t\t\t\t:is=\"renderer\"\n\t\t\t\tref=\"renderer\"\n\t\t\t\tv-bind=\"rendererProps\"\n\t\t\t\t@selectObject=\"onSelectObject\" />\n\t\t</CnWidgetWrapper>\n\n\t\t<!-- Every other content-driven catalog widget, and every bare-mode\n\t\t catalog widget. These self-fetch from OpenRegister. The object\n\t\t context is forwarded too (the same shape CnWidgetGrid merges on the\n\t\t v2 widgets[] path) so object-aware widgets receive it; widgets that\n\t\t declare none of those props ignore them. `content` spreads LAST so\n\t\t explicit widget config still wins. -->\n\t\t<component\n\t\t\t:is=\"renderer\"\n\t\t\tv-else-if=\"renderer\"\n\t\t\tref=\"renderer\"\n\t\t\tv-bind=\"rendererProps\"\n\t\t\t@selectObject=\"onSelectObject\" />\n\n\t\t<!-- No renderer resolves: render nothing, which is what CnDetailPage has\n\t\t always done here. Surfacing an \"unknown widget\" box instead would be\n\t\t more honest, but this is the SLOT FALLBACK for every detail page in\n\t\t the fleet, so an app that declares a custom widget and omits its\n\t\t `#widget-<id>` slot would start showing a placeholder where it shows\n\t\t nothing today. That is its own change, not a side effect of this one. -->\n\t</div>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcActionButton, NcButton } from '@nextcloud/vue'\nimport { computed } from 'vue'\nimport Plus from 'vue-material-design-icons/Plus.vue'\nimport CnEmptyContent from '../CnEmptyContent/CnEmptyContent.vue'\nimport CnIcon from '../CnIcon/CnIcon.vue'\nimport CnIntegrationWidgetEmpty from '../CnIntegrationWidget/CnIntegrationWidgetEmpty.vue'\nimport CnLeafMountHost from '../CnLeafMountHost/CnLeafMountHost.vue'\nimport CnObjectDataWidget from '../CnObjectDataWidget/CnObjectDataWidget.vue'\nimport CnObjectFilesWidget from '../CnObjectFilesWidget/CnObjectFilesWidget.vue'\nimport CnObjectGeoWidget from '../CnObjectGeoWidget/CnObjectGeoWidget.vue'\nimport CnRelatedObjectsWidget from '../CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue'\nimport CnWidgetEmptyState from '../CnWidgetEmptyState/CnWidgetEmptyState.vue'\nimport CnDetailWidgetHeaderItems from './CnDetailWidgetHeaderItems.vue'\nimport { getByPath } from '../../composables/useEndpointSource.js'\nimport { useIntegrationRegistry } from '../../composables/useIntegrationRegistry.js'\nimport { normalizeLook } from '../../composables/useLook.js'\nimport { dispatchAction } from '../../utils/actionsDispatcher.js'\nimport { isAppInstalled } from '../../utils/appInstalled.js'\nimport { pickConditionalText } from '../../utils/conditionalText.js'\nimport { resolveHeaderLink, widgetHeaderLink } from '../../utils/contentHeaderLink.js'\nimport { pickDeclaredProps } from '../../utils/declaredProps.js'\nimport { unwrapAppConfig } from '../../utils/formatMetric.js'\nimport { isActivityWidget } from '../../utils/headerMeta.js'\nimport { createActionState, listCreateAction } from '../../utils/listCreateAction.js'\nimport { PANEL_ACTION_SINK } from '../../utils/panelActions.js'\nimport { resolveDeepTokens } from '../../utils/resolveFilterTokens.js'\nimport { evaluateVisibleWhenLocal } from '../../utils/visibleWhen.js'\nimport {\n\tisCardWidgetDef,\n\tisContentOnlyWidgetDef,\n\tisDataWidgetDef,\n\tisGeoWidgetDef,\n\tisIntegrationWidgetDef,\n\tisRelatedWidgetDef,\n\tresolveRegistryRenderer,\n\twidgetContentOf,\n\twidgetTitleOf,\n} from '../../utils/widgetDispatch.js'\nimport { resolveWidgetHeaderActions, WIDGET_BODY_ACTIONS, WIDGET_HEADER_ACTIONS } from '../../utils/widgetHeaderActions.js'\nimport { HOST_WIDGET_ID } from '../../utils/widgetSelection.js'\nimport { getWidgetTypeEntry } from '../CnWidgetGrid/dashboardWidgetRegistry.js'\nimport { CnWidgetWrapper } from '../CnWidgetWrapper/index.js'\n\n/**\n * CnDetailWidgetHost — renders ONE detail-page widget definition.\n *\n * This is the dispatch that used to be a ~230-line `v-if` chain inside\n * `CnDetailPage`'s grid slot. It moved out when a second surface needed it:\n * `CnTabsWidget` renders the same widget definitions inside tab panels, and\n * two copies of \"which renderer does this type get\" is the kind of thing that\n * drifts silently. A type added to one and not the other renders correctly on\n * the page and blank in a tab, with nothing in the console either way.\n *\n * ## The two chrome modes\n *\n * `chrome=\"card\"` is the detail-page grid: every widget gets a titled card,\n * because ADR-062 rule 5 says every body widget carries chrome and its manifest\n * title.\n *\n * `chrome=\"bare\"` is a tab panel. The tab strip already shows the title and\n * draws the card, so a second title inside the panel reads as a heading nested\n * in its own heading. Bare mode therefore drops the wrapper and, for\n * integration leaves, renders the provider's `tab` (bare content) instead of\n * its `widget` (which draws its own card). That pairing is not new: it is\n * exactly what `CnIntegrationWidget` already does inside its own panels.\n *\n * ## The `data` widget in bare mode\n *\n * It drops its title, border and padding, so a tab panel holds the content\n * directly rather than a card inside a card.\n *\n * That used not to be possible. `CnWidgetWrapper` renders its actions INSIDE\n * the header and `CnObjectDataWidget` puts its **Save** button there, so\n * hiding the header to remove the duplicate title also removed the only way to\n * commit an inline edit; a silently unsaveable form being worse than a doubled\n * title, the title stayed. The wrapper now renders its header whenever there\n * are actions, with or without a title, so the two are separate requests and a\n * panel can have no title while staying saveable.\n *\n * ```vue\n * <CnDetailWidgetHost\n * :widget=\"def\"\n * :object-id=\"id\"\n * :object=\"record\"\n * register=\"dossiq\"\n * schema=\"case\"\n * chrome=\"bare\" />\n * ```\n */\nexport default {\n\tname: 'CnDetailWidgetHost',\n\n\tcomponents: {\n\t\tCnDetailWidgetHeaderItems,\n\t\tCnIcon,\n\t\tCnIntegrationWidgetEmpty,\n\t\tCnLeafMountHost,\n\t\tCnObjectDataWidget,\n\t\tCnObjectGeoWidget,\n\t\tCnRelatedObjectsWidget,\n\t\tCnWidgetEmptyState,\n\t\tCnWidgetWrapper,\n\t\tNcActionButton,\n\t\tNcButton,\n\t\tCnEmptyContent,\n\t\tPlus,\n\t},\n\n\tinject: {\n\t\t/**\n\t\t * The surface's panel-action channel, when this host sits inside one.\n\t\t *\n\t\t * Absent on every other surface, which is why the default is null\n\t\t * rather than a required injection.\n\t\t */\n\t\tpanelActionSink: {\n\t\t\tfrom: PANEL_ACTION_SINK,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** The app's look, provided by CnAppRoot or CnPageRenderer (`nextcloud` or `board`). */\n\t\tcnLook: { default: 'nextcloud' },\n\t\t/** The host's translate (CnAppRoot provides `cnTranslate`). */\n\t\tcnTranslate: { default: () => (key) => key },\n\t\t/** The page's action dispatcher (CnPageRenderer), for `headerActions`. */\n\t\tcnDispatchAction: { default: null },\n\t\t/** The detail page's record edit form (`{ available, open }`), for an `edit-record` header action. */\n\t\tcnRecordEdit: { default: null },\n\t\t/** The records the detail page reads beside the record (`@context.<name>`), for a subtitle that depends on them. */\n\t\tcnDetailVisibilityRows: { default: null },\n\t\t/**\n\t\t * The page-level app config (CnDetailPage provides `cnAppConfig` from\n\t\t * its `appConfig` prop), which answers `@config.<key>` in a widget's\n\t\t * `props`. Empty when no ancestor provides one.\n\t\t */\n\t\tcnAppConfig: { default: () => ({}) },\n\t},\n\n\t/**\n\t * Re-provide the channel with this panel's widget id baked in.\n\t *\n\t * The widget below does not know its own id on the surface and should not\n\t * have to, so the id is supplied here, where it is already known. Read at\n\t * CALL time rather than captured, so a host whose `widget` changes keeps\n\t * publishing under the right key.\n\t *\n\t * Provides null when there is no surface to publish to, so the widget's own\n\t * injection resolves to null instead of finding a channel that goes nowhere.\n\t *\n\t * @return {object} The narrowed sink, or null.\n\t */\n\tprovide() {\n\t\tconst sink = this.panelActionSink\n\t\treturn {\n\t\t\t// The widget's manifest `headerActions`, for the card that titles\n\t\t\t// it. In bare mode the surface (a tab panel) draws them instead.\n\t\t\t[WIDGET_HEADER_ACTIONS]: computed(() => (this.isBare ? [] : this.declaredHeaderActions)),\n\t\t\t// The widget's manifest `bodyActions`, for a leaf that draws its\n\t\t\t// own button row in the body (the contacts tab).\n\t\t\t[WIDGET_BODY_ACTIONS]: computed(() => this.declaredBodyActions),\n\t\t\t// The hosted widget's id, read at call time, so a list can publish its\n\t\t\t// rows under it for a card that follows them (side-card-follows-row).\n\t\t\t[HOST_WIDGET_ID]: () => (this.widget && this.widget.id) || '',\n\t\t\t[PANEL_ACTION_SINK]: sink\n\t\t\t\t? {\n\t\t\t\t\t\tset: (...args) => sink.set(...this.narrowPanelArgs(args, 'set')),\n\t\t\t\t\t\tclear: (...args) => sink.clear(...this.narrowPanelArgs(args, 'clear')),\n\t\t\t\t\t}\n\t\t\t\t: null,\n\t\t}\n\t},\n\n\tprops: {\n\t\t/**\n\t\t * The resolved widget definition: `{ id, type, title, icon, content }`,\n\t\t * plus `integrationId` for `type: 'integration'`.\n\t\t *\n\t\t * Resolved, not a layout item: turning an item into a definition needs\n\t\t * the surface's own widget list, which is the one part the two surfaces\n\t\t * genuinely do differently.\n\t\t *\n\t\t * @type {object}\n\t\t */\n\t\twidget: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\n\t\t/**\n\t\t * How much chrome to draw around the widget.\n\t\t * - `'card'` — a titled `CnWidgetWrapper`, the detail-page grid default.\n\t\t * - `'bare'` — no wrapper; the caller owns the title and the card.\n\t\t */\n\t\tchrome: {\n\t\t\ttype: String,\n\t\t\tdefault: 'card',\n\t\t\tvalidator: (v) => ['card', 'bare'].includes(v),\n\t\t},\n\n\t\t/**\n\t\t * The host sits in a body grid cell, which draws its own card: an\n\t\t * app's own widget then stays bare, as it always has.\n\t\t *\n\t\t * @spec openspec/changes/detail-consumer-widget-card/specs/detail-page/spec.md#requirement-a-consumer-widget-on-a-card-surface-gets-the-titled-card\n\t\t */\n\t\tinGridCell: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** The bound record's id. Present on the first render; `object` is not. */\n\t\tobjectId: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** The loaded record, or null while it is still being fetched. */\n\t\tobject: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** The resolved object-type slug. */\n\t\tobjectType: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** The resolved JSON Schema object, needed by the `data` widget. */\n\t\tschemaObject: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** OpenRegister register slug of the surface. */\n\t\tregister: {\n\t\t\ttype: [String, Object],\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** OpenRegister schema slug of the surface. */\n\t\tschema: {\n\t\t\ttype: [String, Object],\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** The effective object store. */\n\t\tstore: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** Rendering surface forwarded to integration widgets (AD-19). */\n\t\tsurface: {\n\t\t\ttype: String,\n\t\t\tdefault: 'detail-page',\n\t\t},\n\n\t\t/** Object context forwarded to integration widgets. */\n\t\tintegrationContext: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** Hide empty properties in the `data` widget. */\n\t\thideEmpty: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Every widget definition on the surface, for a CONTAINER widget to\n\t\t * resolve the children it references by id.\n\t\t *\n\t\t * Only container types receive it (see `rendererProps`). A leaf widget\n\t\t * has no business knowing what else is on the page.\n\t\t *\n\t\t * @type {object[]}\n\t\t */\n\t\tavailableWidgets: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * Whether a card widget (stat / gauge / delta) draws the wrapper header.\n\t\t *\n\t\t * A prop, not a computed, because the rule reads the LAYOUT item's\n\t\t * `showTitle` and only the surface holds the layout. Deriving it from the\n\t\t * widget definition alone silently drops `showTitle: false`, which is the\n\t\t * one way a consumer can stop a card printing its title twice: the tile\n\t\t * already draws `content.label` itself.\n\t\t *\n\t\t * Null means \"decide from the definition\", which is what a surface with\n\t\t * no layout (a tab panel) wants.\n\t\t *\n\t\t * @type {boolean|null}\n\t\t */\n\t\tshowCardTitle: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Whether a card draws the manifest `headerLink` of its widget (on the\n\t\t * definition, or `content.headerLink` / `viewAllRoute`) in its header\n\t\t * when the renderer reports none. Off by default: a tab panel's link\n\t\t * is drawn beside the tab strip. CnTabsWidget turns it on for the\n\t\t * cards after the first in a stack, whose links had no place.\n\t\t *\n\t\t * @spec openspec/changes/stack-card-header-link/specs/stack-card-header-link/spec.md#requirement-a-stacked-card-draws-its-own-header-link\n\t\t */\n\t\tshowHeaderLink: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Whether a widget on a card keeps its overflow Actions menu when its\n\t\t * definition does not say (`showActions`). `false` (CnDetailPage\n\t\t * `showWidgetActions: false`) drops it from the record's data cards; a\n\t\t * definition with `showActions: true` keeps it, one with\n\t\t * `showActions: false` drops it whatever this says. True by default,\n\t\t * which is the menu every card had.\n\t\t *\n\t\t * @spec openspec/changes/zuiddrecht-pixel-gaps-3/specs/zuiddrecht-pixel-gaps-3/spec.md#requirement-a-detail-page-can-drop-the-widget-actions-menu\n\t\t */\n\t\tshowActions: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/**\n\t\t * The consumer's component registry, consulted before the built-in\n\t\t * catalog so a custom widget type overrides a built-in (REQ-MVR-005).\n\t\t *\n\t\t * @type {object}\n\t\t */\n\t\tcnRegistry: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\t},\n\n\temits: ['geo-saved', 'open-integration', 'select-object'],\n\n\tsetup() {\n\t\t// Every integration component this host renders goes through the\n\t\t// composable's resolvers, never through the registry entry's own\n\t\t// `tab` / `widget`. The resolvers swap a lib-owned entry for THIS\n\t\t// bundle's copy of the component (openregister#1958). The entry's\n\t\t// object belongs to whichever bundle registered it; when that is\n\t\t// OpenRegister's integration-global bundle, rendering it under the\n\t\t// app's Vue leaves `resolveComponent()` without a current instance,\n\t\t// and `<NcButton>` / `<CnDetailCard>` reach the DOM as literal\n\t\t// unknown elements. Seen on dossiq's Notes, Contacts and Files tabs.\n\t\tconst { resolveWidget, resolveBaseWidget, resolveTab, getById } = useIntegrationRegistry()\n\t\treturn {\n\t\t\tresolveRegistryWidget: resolveWidget,\n\t\t\tresolveRegistryBaseWidget: resolveBaseWidget,\n\t\t\tresolveRegistryTab: resolveTab,\n\t\t\tgetRegistryProvider: getById,\n\t\t}\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * The card header a content-only renderer reports through its\n\t\t\t * `header` event (screens-relation-pages): a link and a note,\n\t\t\t * with the list's total already filled in.\n\t\t\t */\n\t\t\trendererHeader: { link: null, note: '', subtitle: '', actions: [], pill: null, count: null, empty: null, menuActions: [] },\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * Whether the caller owns the title and card.\n\t\t *\n\t\t * @return {boolean} true in bare mode.\n\t\t */\n\t\tisBare() {\n\t\t\treturn this.chrome === 'bare'\n\t\t},\n\n\t\t/**\n\t\t * The widget's stored config blob.\n\t\t *\n\t\t * @return {object} The `content`, or an empty object.\n\t\t */\n\t\tcontent() {\n\t\t\treturn widgetContentOf(this.widget)\n\t\t},\n\n\t\t/**\n\t\t * The title to render. Undefined in bare mode so a self-chromed widget\n\t\t * does not repeat what the tab strip already says.\n\t\t *\n\t\t * @return {string|undefined} The title, or undefined.\n\t\t */\n\t\tresolvedTitle() {\n\t\t\treturn this.isBare ? undefined : widgetTitleOf(this.widget)\n\t\t},\n\n\t\t/**\n\t\t * The widgets `content.leadWidgetIds` names, drawn inside this card before\n\t\t * its own content (DqZaakDocumenten: the review summary in the Files\n\t\t * card), those whose `visibleWhen` holds against the record.\n\t\t *\n\t\t * @return {object[]}\n\t\t * @spec openspec/changes/widget-lead-widgets-in-card/specs/widget-lead-widgets/spec.md#requirement-a-card-can-lead-with-other-widgets\n\t\t */\n\t\tleadWidgets() {\n\t\t\tconst ids = this.content && Array.isArray(this.content.leadWidgetIds) ? this.content.leadWidgetIds : []\n\t\t\tif (ids.length === 0) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\tconst rows = this.cnDetailVisibilityRows ? this.cnDetailVisibilityRows.value : null\n\t\t\tconst data = this.object ? { ...this.object, '@context': rows || {} } : null\n\t\t\treturn ids\n\t\t\t\t.map((id) => (this.availableWidgets || []).find((def) => def && def.id === id))\n\t\t\t\t.filter((def) => def && (!def.visibleWhen || (data !== null && evaluateVisibleWhenLocal(def.visibleWhen, data))))\n\t\t},\n\n\t\t/** @return {boolean} Whether the reported header has anything for the title row. */\n\t\thasRendererHeaderItems() {\n\t\t\tconst h = this.rendererHeader\n\t\t\treturn !!(h.note || h.pill || (h.actions && h.actions.length > 0))\n\t\t},\n\n\t\t/**\n\t\t * The card header's link: the one the renderer reports, else, with\n\t\t * `showHeaderLink`, the one the manifest declares for the widget.\n\t\t *\n\t\t * @spec openspec/changes/stack-card-header-link/specs/stack-card-header-link/spec.md#requirement-a-stacked-card-draws-its-own-header-link\n\t\t * @return {object|null} `{ label, route?, params?, query?, href? }` or null.\n\t\t */\n\t\tcardHeaderLink() {\n\t\t\treturn this.rendererHeader.link || (this.showHeaderLink ? resolveHeaderLink(widgetHeaderLink(this.widget), { objectId: this.objectId, object: this.object }) : null)\n\t\t},\n\n\t\t/**\n\t\t * The app this widget leans on, if it declares one.\n\t\t *\n\t\t * Read from the widget definition first and its `content` second, so a\n\t\t * manifest may put it wherever the rest of that widget's config lives.\n\t\t *\n\t\t * @return {string} A Nextcloud app id, or ''.\n\t\t */\n\t\trequiredApp() {\n\t\t\t// `widget` is declared required, but CnDetailPage renders a host for\n\t\t\t// a layout item whose widget id resolves to nothing — and there is a\n\t\t\t// test that it must not throw for one. This computed runs in the\n\t\t\t// render path BEFORE the branches that tolerate a missing widget, so\n\t\t\t// it is the one that has to survive it.\n\t\t\treturn (this.widget || {}).requiredApp || this.content.requiredApp || ''\n\t\t},\n\n\t\t/**\n\t\t * Whether this widget's backing app is declared and absent.\n\t\t *\n\t\t * @return {boolean} true when the widget must render its set-up state.\n\t\t */\n\t\tmissingApp() {\n\t\t\treturn this.requiredApp !== '' && !isAppInstalled(this.requiredApp)\n\t\t},\n\n\t\t/**\n\t\t * The widget's title, independent of chrome mode.\n\t\t *\n\t\t * `resolvedTitle` is deliberately undefined in bare mode so a tabbed\n\t\t * widget does not repeat what the strip already says. The set-up state\n\t\t * still needs the name to say WHICH widget is inert.\n\t\t *\n\t\t * @return {string} The manifest title.\n\t\t */\n\t\twidgetTitle() {\n\t\t\treturn widgetTitleOf(this.widget) || ''\n\t\t},\n\n\t\t/**\n\t\t * The muted line under a card's title (`subtitle` on the widget or in\n\t\t * its content), translated by the card. Empty when neither sets one.\n\t\t *\n\t\t * @return {string} The subtitle.\n\t\t */\n\t\twidgetSubtitle() {\n\t\t\tconst subtitle = (this.widget && this.widget.subtitle) || this.content.subtitle || ''\n\t\t\tif (!Array.isArray(subtitle)) {\n\t\t\t\treturn typeof subtitle === 'string' ? subtitle : ''\n\t\t\t}\n\t\t\t// `[{ when, text }]`: the line depends on the record and the records the\n\t\t\t// page reads beside it (`@context.<name>`), as a `visibleWhen` does.\n\t\t\tconst rows = this.cnDetailVisibilityRows ? this.cnDetailVisibilityRows.value : null\n\t\t\tconst object = this.object || null\n\t\t\tconst data = object && (!this.cnDetailVisibilityRows || rows) ? { ...object, '@context': rows || {} } : null\n\t\t\treturn pickConditionalText(subtitle, data)\n\t\t},\n\n\t\t/**\n\t\t * Headline for the set-up state.\n\t\t *\n\t\t * @return {string} e.g. \"Humaniq is not installed\".\n\t\t */\n\t\tmissingAppName() {\n\t\t\treturn t('nextcloud-vue', '{app} is not installed', { app: this.requiredAppLabel })\n\t\t},\n\n\t\t/**\n\t\t * Body for the set-up state, naming what the reader is NOT seeing.\n\t\t *\n\t\t * @return {string} The description.\n\t\t */\n\t\tmissingAppDescription() {\n\t\t\treturn this.widgetTitle\n\t\t\t\t? t('nextcloud-vue', '{title} needs the {app} app. Install and enable it to see this.', {\n\t\t\t\t\t\ttitle: this.widgetTitle,\n\t\t\t\t\t\tapp: this.requiredAppLabel,\n\t\t\t\t\t})\n\t\t\t\t: t('nextcloud-vue', 'Install and enable the {app} app to see this.', {\n\t\t\t\t\t\tapp: this.requiredAppLabel,\n\t\t\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * The app id as a display name — `humaniq` reads as `Humaniq`.\n\t\t *\n\t\t * @return {string} The capitalised app id.\n\t\t */\n\t\trequiredAppLabel() {\n\t\t\treturn this.requiredApp.charAt(0).toUpperCase() + this.requiredApp.slice(1)\n\t\t},\n\n\t\t/** @return {boolean} true for `type: 'data'`. */\n\t\tisData() {\n\t\t\treturn isDataWidgetDef(this.widget)\n\t\t},\n\n\t\t/** @return {boolean} true for `type: 'related'`. */\n\t\tisRelated() {\n\t\t\treturn isRelatedWidgetDef(this.widget)\n\t\t},\n\n\t\t/** @return {boolean} true for `type: 'object-geo'`. */\n\t\tisGeo() {\n\t\t\treturn isGeoWidgetDef(this.widget)\n\t\t},\n\n\t\t/** @return {boolean} true for a registered integration leaf. */\n\t\tisIntegration() {\n\t\t\treturn isIntegrationWidgetDef(this.widget)\n\t\t},\n\n\t\t/** @return {boolean} true for object-list / table / files. */\n\t\tisContentOnly() {\n\t\t\treturn isContentOnlyWidgetDef(this.widget)\n\t\t},\n\n\t\t/**\n\t\t * Whether a chart gets the titled card: on a card surface, with a title.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\twrapsChart() {\n\t\t\treturn !this.isBare && Boolean(this.widget) && this.widget.type === 'chart' && Boolean(this.widget.title)\n\t\t},\n\n\t\t/**\n\t\t * Whether an app's own widget (from the consumer registry) gets the\n\t\t * titled card: on a card surface outside a body grid cell, when its\n\t\t * registry entry asks for it (`chrome: \"card\"`). Opt-in, because many\n\t\t * app widgets already draw their own card.\n\t\t *\n\t\t * @return {boolean}\n\t\t * @spec openspec/changes/detail-consumer-widget-card/specs/detail-page/spec.md#requirement-a-consumer-widget-on-a-card-surface-gets-the-titled-card\n\t\t */\n\t\twrapsConsumerWidget() {\n\t\t\tif (this.isBare || this.inGridCell || !this.widget || !this.widget.type || this.isContentOnly || this.isCard) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst entry = (this.cnRegistry || {})[this.widget.type]\n\t\t\tif (!entry) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn typeof entry === 'object' && entry.chrome === 'card'\n\t\t},\n\n\t\t/**\n\t\t * Whether a library widget that draws its own title row gets an\n\t\t * untitled card: on a card surface outside a body grid cell, when its\n\t\t * registry entry owns its title and asks for the card.\n\t\t *\n\t\t * @return {boolean}\n\t\t * @spec openspec/changes/retention-card-in-tab-stack/specs/detail-page/spec.md\n\t\t */\n\t\twrapsSelfTitledWidget() {\n\t\t\tif (this.isBare || this.inGridCell || !this.widget || !this.widget.type || this.isContentOnly || this.isCard || this.wrapsConsumerWidget) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst entry = getWidgetTypeEntry(this.widget.type)\n\t\t\treturn Boolean(entry && entry.ownsTitle && entry.chrome === 'card')\n\t\t},\n\n\t\t/**\n\t\t * Whether a `sections` widget gets one titled card: on a card surface\n\t\t * outside a body grid cell, with a title, and not in `cards` mode.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\twrapsSections() {\n\t\t\tif (this.isBare || this.inGridCell || !this.widget || this.widget.type !== 'sections' || !this.widget.title) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn !(this.widget.content && this.widget.content.cards)\n\t\t},\n\n\t\t/** @return {boolean} true when the registry entry declares `card`. */\n\t\tisCard() {\n\t\t\treturn isCardWidgetDef(this.widget)\n\t\t},\n\n\t\t/**\n\t\t * The registered renderer for a content-driven catalog type.\n\t\t *\n\t\t * @return {object|null} The component, or null.\n\t\t */\n\t\trenderer() {\n\t\t\t// A `files` widget on a detail page belongs to THIS object's folder; the\n\t\t\t// placement-folder CnFilesWidget stays the dashboard widget. A consumer\n\t\t\t// registry entry for `files` still wins.\n\t\t\tif (this.widget && this.widget.type === 'files' && !(this.cnRegistry && this.cnRegistry.files) && this.register && this.schema) {\n\t\t\t\treturn CnObjectFilesWidget\n\t\t\t}\n\t\t\t// Inside a dashboard's tabs the dashboard's resolution holds.\n\t\t\tconst onDashboard = this.surface === 'app-dashboard' || this.surface === 'user-dashboard'\n\t\t\treturn resolveRegistryRenderer(this.widget, this.cnRegistry, { typeAsWritten: onDashboard })\n\t\t},\n\n\t\t/**\n\t\t * The integration descriptor behind an `integration` widget.\n\t\t *\n\t\t * @return {object|null} The provider, or null.\n\t\t */\n\t\tintegrationProvider() {\n\t\t\tif (!this.isIntegration || typeof this.getRegistryProvider !== 'function') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn this.getRegistryProvider(this.widget.integrationId)\n\t\t},\n\n\t\t/**\n\t\t * Whether an `integration` widget names a leaf the registry does not\n\t\t * hold. Only asked when the host can look leaves up at all.\n\t\t *\n\t\t * @return {boolean}\n\t\t * @spec openspec/changes/integration-widget-mounts-leaves/specs/integration-widget-mounts-leaves/spec.md#requirement-an-absent-leaf-says-it-is-not-available\n\t\t */\n\t\tintegrationAbsent() {\n\t\t\treturn this.isIntegration && typeof this.getRegistryProvider === 'function' && !this.integrationProvider\n\t\t},\n\n\t\t/**\n\t\t * The stand-in descriptor the empty state of an absent leaf draws: the\n\t\t * widget's `appName` (else its `requiredApp`), icon and title.\n\t\t *\n\t\t * @return {{id: string, appName: string, label: string, icon: string}}\n\t\t */\n\t\tabsentIntegrationProvider() {\n\t\t\tconst widget = this.widget || {}\n\t\t\treturn {\n\t\t\t\tid: widget.integrationId || '',\n\t\t\t\tappName: widget.appName || (this.requiredApp ? this.requiredAppLabel : ''),\n\t\t\t\tlabel: this.translateLabel(widgetTitleOf(widget) || '') || widget.integrationId || '',\n\t\t\t\ticon: widget.icon || '',\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Whether the integration is a mount-mode leaf (ADR-066), rendered\n\t\t * through CnLeafMountHost rather than as a component.\n\t\t *\n\t\t * @return {boolean} true for a mount-mode leaf.\n\t\t */\n\t\tisMountIntegration() {\n\t\t\tconst provider = this.integrationProvider\n\t\t\treturn Boolean(provider)\n\t\t\t\t&& provider.renderMode === 'mount'\n\t\t\t\t&& typeof provider.mount === 'function'\n\t\t\t\t&& typeof provider.unmount === 'function'\n\t\t},\n\n\t\t/**\n\t\t * Whether a mount-mode leaf gets the library card: on a card surface,\n\t\t * grid cell included, when its descriptor asks for it (`chrome:\n\t\t * \"card\"`). Opt-in, because a leaf that draws its own card would\n\t\t * otherwise sit in two.\n\t\t *\n\t\t * @return {boolean}\n\t\t * @spec openspec/changes/integration-leaf-card/specs/integration-leaf-card/spec.md#requirement-a-mount-mode-leaf-can-take-the-library-card\n\t\t */\n\t\twrapsMountLeaf() {\n\t\t\treturn !this.isBare && this.isMountIntegration && this.integrationProvider.chrome === 'card'\n\t\t},\n\n\t\t/**\n\t\t * Whether a component-mode integration shows its full tab inside a card\n\t\t * (`content.view: \"tab\"`), as a case's Parties card lists the people by\n\t\t * role with their Link and New buttons.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\twrapsLeafTab() {\n\t\t\treturn !this.isBare\n\t\t\t\t&& this.isIntegration\n\t\t\t\t&& !this.isMountIntegration\n\t\t\t\t&& this.content.view === 'tab'\n\t\t\t\t&& Boolean(this.integrationProvider?.tab)\n\t\t\t\t&& typeof this.resolveRegistryTab === 'function'\n\t\t},\n\n\t\t/**\n\t\t * The widget's title tone (`titleTone`): `side` titles its card as a\n\t\t * side card in the board look.\n\t\t *\n\t\t * @return {string} `side`, or ''.\n\t\t * @spec openspec/changes/widget-side-title-tone/specs/widget-side-title-tone/spec.md#requirement-a-widget-can-be-titled-as-a-side-card\n\t\t */\n\t\twidgetTitleTone() {\n\t\t\treturn this.widget && this.widget.titleTone === 'side' ? 'side' : ''\n\t\t},\n\n\t\t/**\n\t\t * The leaf card's title: the manifest's, else the descriptor's label.\n\t\t *\n\t\t * @return {string} The title in the user's language.\n\t\t */\n\t\t/**\n\t\t * The widget's manifest `headerActions` as buttons: gated on the\n\t\t * record, dispatched through the page's dispatcher.\n\t\t *\n\t\t * @return {Array<object>} The buttons.\n\t\t * @spec openspec/changes/widget-header-actions/specs/widget-header-actions/spec.md#requirement-a-widget-declares-buttons-for-its-card-header\n\t\t */\n\t\tdeclaredHeaderActions() {\n\t\t\treturn resolveWidgetHeaderActions(this.widget, this.actionContext)\n\t\t},\n\n\t\t/**\n\t\t * The widget's manifest `bodyActions` as buttons, for a leaf that draws\n\t\t * them in its own button row (\"Partij toevoegen\" beside the contacts\n\t\t * tab's Link and New buttons).\n\t\t *\n\t\t * @return {Array<object>} The buttons.\n\t\t */\n\t\tdeclaredBodyActions() {\n\t\t\treturn resolveWidgetHeaderActions(this.widget, this.actionContext, 'bodyActions')\n\t\t},\n\n\t\t/**\n\t\t * What a header or body action resolves and dispatches with.\n\t\t *\n\t\t * @return {object} `{ object, objectId, translate, dispatch }`.\n\t\t */\n\t\tactionContext() {\n\t\t\treturn {\n\t\t\t\tobject: this.object || {},\n\t\t\t\tobjectId: this.objectId,\n\t\t\t\ttranslate: (key) => this.translateLabel(key),\n\t\t\t\trecordEdit: this.cnRecordEdit,\n\t\t\t\tdispatch: (action) => (typeof this.cnDispatchAction === 'function'\n\t\t\t\t\t? this.cnDispatchAction(action)\n\t\t\t\t\t: dispatchAction(action, { router: this.$router || null })),\n\t\t\t}\n\t\t},\n\n\t\tleafCardTitle() {\n\t\t\t// An empty title is a card without one (a `titleWhen` entry that says so).\n\t\t\tif (this.widget && this.widget.title === '') {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\tconst title = widgetTitleOf(this.widget)\n\t\t\treturn title ? this.translateLabel(title) : (this.integrationProvider?.label || '')\n\t\t},\n\n\t\t/** @return {string} The leaf card's icon: the manifest's, else the descriptor's. */\n\t\tleafCardIcon() {\n\t\t\treturn this.widget?.icon || this.integrationProvider?.icon || ''\n\t\t},\n\n\t\t/**\n\t\t * Whether this render is using a provider's widget as its bare surface.\n\t\t *\n\t\t * @return {boolean} True when bare AND the provider opted in.\n\t\t */\n\t\tusesBareWidget() {\n\t\t\treturn !!(this.isBare && this.integrationProvider?.bareWidget && this.integrationProvider?.widget)\n\t\t},\n\n\t\t/**\n\t\t * The component for a component-mode integration leaf. Bare mode takes\n\t\t * the provider's `tab`, which is its content without a card, unless the\n\t\t * provider opted into `bareWidget`.\n\t\t *\n\t\t * Each branch resolves through the registry composable rather than\n\t\t * reading `integrationProvider.widget` / `.tab`. The provider is the\n\t\t * shared registry's entry, and its component objects belong to the\n\t\t * bundle that registered it. For a lib-owned id registered by\n\t\t * OpenRegister's bundle, that object renders under the wrong Vue: its\n\t\t * `resolveComponent()` finds no current instance, so `NcButton` and\n\t\t * `CnDetailCard` reach the DOM as literal `<ncbutton>` /\n\t\t * `<cndetailcard>` elements, and a Files tab whose whole body sits\n\t\t * inside that card looks empty. The resolvers hand back this bundle's\n\t\t * own copy for lib-owned ids and the stored object for consumer ids.\n\t\t *\n\t\t * @return {object|null} The component, or null.\n\t\t */\n\t\tintegrationComponent() {\n\t\t\tif (!this.isIntegration) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst id = this.widget.integrationId\n\t\t\t// `bareWidget` lets a provider say its WIDGET is already bare, so a\n\t\t\t// tab panel gets the widget surface instead of the sidebar one.\n\t\t\t// The default below (prefer `tab`) assumes every `widget` draws its\n\t\t\t// own card, which is not true: `notes`' widget is an adapter around\n\t\t\t// CnNotesCard, whose root carries no border, background or padding.\n\t\t\t// Preferring `tab` there swapped an inline compose textarea for the\n\t\t\t// sidebar's collapsed \"Add note\" button and dressed the panel in\n\t\t\t// sidebar CSS, which is what made the tabbed leaves look like they\n\t\t\t// had lost their styling. Opt-in rather than a blanket switch: the\n\t\t\t// other providers keep today's behaviour until each is checked.\n\t\t\tif (this.usesBareWidget && typeof this.resolveRegistryBaseWidget === 'function') {\n\t\t\t\treturn this.resolveRegistryBaseWidget(id)\n\t\t\t}\n\t\t\tif (this.isBare && this.integrationProvider?.tab && typeof this.resolveRegistryTab === 'function') {\n\t\t\t\treturn this.resolveRegistryTab(id)\n\t\t\t}\n\t\t\tif (typeof this.resolveRegistryWidget !== 'function') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn this.resolveRegistryWidget(id, this.surface)\n\t\t},\n\n\t\t/**\n\t\t * The object context every integration surface is handed.\n\t\t *\n\t\t * @return {object} `{ register, schema, objectId }`.\n\t\t */\n\t\tderivedIntegrationContext() {\n\t\t\treturn this.integrationContext || {\n\t\t\t\tregister: this.register || '',\n\t\t\t\tschema: this.schema || this.objectType || '',\n\t\t\t\tobjectId: this.objectId ? String(this.objectId) : '',\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Props for an integration widget or tab.\n\t\t *\n\t\t * The title is forwarded because `CnIntegrationCard`'s `cardTitle` falls\n\t\t * back to the raw `integrationId` without it, so a widget the manifest\n\t\t * calls \"Class space\" rendered as \"talk\". It is placed BEFORE `def.props`\n\t\t * so an explicit per-widget prop still wins.\n\t\t *\n\t\t * @return {object} The prop bag.\n\t\t */\n\t\t/**\n\t\t * The widget's own `props` with their tokens resolved: `@objectId` and\n\t\t * `@object.<field>` from the record, `@config.<key>` from the page's\n\t\t * app config, at any depth. A manifest can so point an integration at\n\t\t * another object than the page's, such as the decisions on the case a\n\t\t * ticket became (`props: { objectId: \"@object.caseReference\" }`), and\n\t\t * name that object's register and schema from the instance's\n\t\t * configuration instead of as literals\n\t\t * (`register: \"@config.caseRegister\"`).\n\t\t *\n\t\t * @return {object} The resolved prop bag, `{}` when the widget declares none.\n\t\t */\n\t\tresolvedWidgetProps() {\n\t\t\tconst declared = this.widget?.props\n\t\t\tif (!declared || typeof declared !== 'object' || Array.isArray(declared)) {\n\t\t\t\treturn {}\n\t\t\t}\n\t\t\treturn resolveDeepTokens(declared, {\n\t\t\t\tobjectId: this.objectId,\n\t\t\t\tobject: this.object,\n\t\t\t\tconfig: unwrapAppConfig(this.cnAppConfig),\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * Whether a prop written as a token still has no value: the record is\n\t\t * not loaded, it does not hold the field, or the app config does not\n\t\t * hold the key. Only top-level props\n\t\t * written as a token count; a literal empty string is the author's.\n\t\t *\n\t\t * @return {boolean} true while the widget must not mount.\n\t\t */\n\t\twidgetPropsPending() {\n\t\t\tconst declared = this.widget?.props\n\t\t\tif (!declared || typeof declared !== 'object' || Array.isArray(declared)) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst resolved = this.resolvedWidgetProps\n\t\t\treturn Object.keys(declared).some((key) => {\n\t\t\t\tconst written = declared[key]\n\t\t\t\tif (typeof written !== 'string' || written.charAt(0) !== '@') {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t\tconst value = resolved[key]\n\t\t\t\treturn value === undefined || value === null || value === ''\n\t\t\t\t\t|| (typeof value === 'string' && value.charAt(0) === '@')\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * The object an integration is mounted for: the page's, unless the\n\t\t * widget's `props` name another `register`, `schema` or `objectId`.\n\t\t *\n\t\t * @return {object} `{ register, schema, objectId }`.\n\t\t */\n\t\twidgetIntegrationContext() {\n\t\t\tconst context = { ...this.derivedIntegrationContext }\n\t\t\tconst own = this.resolvedWidgetProps\n\t\t\tfor (const key of ['register', 'schema', 'objectId']) {\n\t\t\t\tif (own[key] !== undefined && own[key] !== null && own[key] !== '') {\n\t\t\t\t\tcontext[key] = String(own[key])\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn context\n\t\t},\n\n\t\t/**\n\t\t * The widget's title for a leaf that names its title `titleLabel`\n\t\t * (contacts, notes, tasks, contact moments): without it the leaf\n\t\t * printed its own default. Empty when the widget has no title, so the\n\t\t * leaf keeps that default.\n\t\t *\n\t\t * @return {{titleLabel?: string}} The prop, or nothing.\n\t\t * @spec openspec/changes/leaf-card-widget-title/specs/leaf-card-widget-title/spec.md#requirement-a-leaf-card-carries-the-widgets-title\n\t\t */\n\t\tleafTitleLabel() {\n\t\t\tconst title = this.translateLabel(this.widget?.title || '')\n\t\t\treturn title ? { titleLabel: title } : {}\n\t\t},\n\n\t\tintegrationProps() {\n\t\t\treturn {\n\t\t\t\tsurface: this.surface,\n\t\t\t\t// Through the host's translate: an integration card (CnDetailCard)\n\t\t\t\t// prints its title as given.\n\t\t\t\ttitle: this.translateLabel(this.widget?.title || ''),\n\t\t\t\t...this.leafTitleLabel,\n\t\t\t\t// A provider opting into `bareWidget` is being rendered where the\n\t\t\t\t// tab strip already supplies the card and the title, so tell it to\n\t\t\t\t// drop its own. Without this the panel gets a titled card inside\n\t\t\t\t// the tabs card, repeating the label the open tab already shows.\n\t\t\t\t...(this.usesBareWidget ? { chromeless: true } : {}),\n\t\t\t\t...this.derivedIntegrationContext,\n\t\t\t\t...this.resolvedWidgetProps,\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Props handed to a mount-mode leaf.\n\t\t *\n\t\t * @return {object} The mount prop bag.\n\t\t */\n\t\tintegrationMountProps() {\n\t\t\treturn {\n\t\t\t\tsurface: this.surface,\n\t\t\t\ttitle: this.translateLabel(this.widget?.title || ''),\n\t\t\t\t...this.leafTitleLabel,\n\t\t\t\t...this.derivedIntegrationContext,\n\t\t\t\t// The context follows the widget's own host, so a leaf that\n\t\t\t\t// reads `integrationContext.objectId` gets the same object as\n\t\t\t\t// one that reads `objectId`.\n\t\t\t\tintegrationContext: this.widgetIntegrationContext,\n\t\t\t\t...this.resolvedWidgetProps,\n\t\t\t\t// A carded leaf reports its title row and empty state here.\n\t\t\t\t...(this.wrapsMountLeaf ? { onHeader: this.onRendererHeader } : {}),\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Props for a catalog renderer: its content plus the object context, in\n\t\t * the shape CnWidgetGrid merges on the v2 widgets[] path. `content`\n\t\t * spreads last so explicit widget config still wins.\n\t\t *\n\t\t * @return {object} The prop bag.\n\t\t */\n\t\trendererProps() {\n\t\t\tconst base = {\n\t\t\t\tcontent: this.content,\n\t\t\t\tobjectId: this.objectId,\n\t\t\t\tregister: this.register,\n\t\t\t\tschema: this.schema,\n\t\t\t\tobjectData: this.object,\n\t\t\t\tobjectType: this.objectType,\n\t\t\t\tstore: this.store,\n\t\t\t}\n\t\t\t// A container widget renders other widgets, so it needs what a\n\t\t\t// surface knows and a leaf does not: the sibling definitions to\n\t\t\t// resolve its children against, and the context those children will\n\t\t\t// need. Handing this to every widget instead would put objects on\n\t\t\t// the DOM as stringified attributes for the ones that ignore them.\n\t\t\tif (this.isContainer) {\n\t\t\t\tObject.assign(base, {\n\t\t\t\t\tavailableWidgets: this.availableWidgets,\n\t\t\t\t\tschemaObject: this.schemaObject,\n\t\t\t\t\tintegrationContext: this.integrationContext,\n\t\t\t\t\tcnRegistry: this.cnRegistry,\n\t\t\t\t\tsurface: this.surface,\n\t\t\t\t})\n\t\t\t}\n\t\t\t// The board look: a self-titled card (an audit trail, a calendar)\n\t\t\t// takes the manifest title, so the side column's History card says\n\t\t\t// what the board says instead of the widget's own default.\n\t\t\tconst title = this.cardTitle\n\t\t\tif (title) {\n\t\t\t\tbase.title = title\n\t\t\t}\n\t\t\treturn { ...base, ...this.declaredContent, ...this.consumerWidgetProps }\n\t\t},\n\n\t\t/**\n\t\t * Whether the widget is the app's own (a consumer registry entry).\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tisConsumerWidget() {\n\t\t\tconst type = this.widget && this.widget.type\n\t\t\treturn Boolean(type && this.cnRegistry && this.cnRegistry[type])\n\t\t},\n\n\t\t/**\n\t\t * The props an app widget takes from its manifest `props`: literals,\n\t\t * and `@objectId` / `@object.<field>` / `@config.<key>` /\n\t\t * `@content.<path>` tokens. A token that does not resolve is left out,\n\t\t * so the component's own default holds; only declared props pass.\n\t\t *\n\t\t * @spec openspec/changes/consumer-widget-props/specs/detail-page/spec.md#requirement-an-app-widget-takes-its-props-from-the-manifest\n\t\t * @return {object} The prop bag, `{}` for any other widget.\n\t\t */\n\t\tconsumerWidgetProps() {\n\t\t\tconst declared = this.widget?.props\n\t\t\tif (!this.isConsumerWidget || !declared || typeof declared !== 'object' || Array.isArray(declared)) {\n\t\t\t\treturn {}\n\t\t\t}\n\t\t\tconst bag = {}\n\t\t\tfor (const [key, written] of Object.entries(declared)) {\n\t\t\t\tconst value = typeof written === 'string' && written.startsWith('@content.')\n\t\t\t\t\t? getByPath(this.content || {}, written.slice('@content.'.length))\n\t\t\t\t\t: this.resolvedWidgetProps[key]\n\t\t\t\tif (value === undefined || value === null || (typeof value === 'string' && value.charAt(0) === '@')) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tbag[key] = value\n\t\t\t}\n\t\t\treturn pickDeclaredProps(this.renderer, bag, this.widget.type)\n\t\t},\n\n\t\t/**\n\t\t * Whether an app widget that asks for `@objectId` has none yet.\n\t\t *\n\t\t * @spec openspec/changes/consumer-widget-props/specs/detail-page/spec.md#requirement-an-app-widget-takes-its-props-from-the-manifest\n\t\t * @return {boolean} true while the widget must not mount.\n\t\t */\n\t\tconsumerWidgetWaiting() {\n\t\t\tconst declared = this.widget?.props\n\t\t\tif (!this.isConsumerWidget || !declared || typeof declared !== 'object') {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst asksForId = Object.values(declared).includes('@objectId')\n\t\t\treturn asksForId && (this.objectId === null || this.objectId === undefined || this.objectId === '')\n\t\t},\n\n\t\t/**\n\t\t * The content keys the renderer declares as props. An undeclared key\n\t\t * would fall through as an attribute onto the renderer's root and could\n\t\t * override a value the widget computes there; the whole content still\n\t\t * arrives as `content`.\n\t\t *\n\t\t * `content.chartKind` is read as the chart's `type`, as the dashboard\n\t\t * dispatcher reads it, so a chart placed on a detail page draws.\n\t\t *\n\t\t * @return {object} The declared content keys.\n\t\t * @spec openspec/changes/declared-props-detail-index-sidebar/specs/widget-hosts/spec.md#requirement-a-widget-host-passes-only-the-keys-a-widget-declares\n\t\t * @spec openspec/changes/detail-chart-kind/specs/widget-hosts/spec.md#requirement-a-detail-chart-reads-chartkind-as-its-type\n\t\t */\n\t\tdeclaredContent() {\n\t\t\tlet bindings = this.content\n\t\t\tif (bindings && typeof bindings === 'object' && bindings.chartKind !== undefined && bindings.type === undefined) {\n\t\t\t\tconst { chartKind, ...rest } = bindings\n\t\t\t\tbindings = { ...rest, type: chartKind }\n\t\t\t}\n\t\t\treturn pickDeclaredProps(this.renderer, bindings, this.widget?.type || '')\n\t\t},\n\n\t\t/**\n\t\t * The title a self-titled renderer gets under the board look: the\n\t\t * manifest title through the host's translate, else History for the\n\t\t * activity widget. Empty outside the board look, in a tab panel, and\n\t\t * when `content.title` already names the card.\n\t\t *\n\t\t * @return {string} The title, or ''.\n\t\t * @spec openspec/changes/screens-detail-labels-parity/specs/detail-labels-board-look/spec.md#requirement-a-side-card-takes-its-manifest-title\n\t\t */\n\t\tcardTitle() {\n\t\t\tif (normalizeLook(this.cnLook) !== 'board' || this.isBare || !this.widget || this.isContentOnly || this.isCard) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\t// Only a renderer that takes a `title` prop: on any other the value\n\t\t\t// would land on its root element as a tooltip.\n\t\t\tconst declared = this.renderer && this.renderer.props\n\t\t\tconst takesTitle = Array.isArray(declared) ? declared.includes('title') : Boolean(declared && Object.hasOwn(declared, 'title'))\n\t\t\tif (!takesTitle) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\tif (typeof this.content.title === 'string' && this.content.title !== '') {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\tconst title = widgetTitleOf(this.widget)\n\t\t\tif (title) {\n\t\t\t\treturn this.translateLabel(title)\n\t\t\t}\n\t\t\treturn isActivityWidget(this.widget) ? t('nextcloud-vue', 'History') : ''\n\t\t},\n\n\t\t/**\n\t\t * Whether the type declares itself a container (registry `container`).\n\t\t *\n\t\t * @return {boolean} true for a widget that renders other widgets.\n\t\t */\n\t\tisContainer() {\n\t\t\tif (!this.widget?.type) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst entry = getWidgetTypeEntry(this.widget.type)\n\t\t\treturn Boolean(entry && entry.container === true)\n\t\t},\n\n\t\t/**\n\t\t * Whether a catalog list widget offers the Add action (ADR-062:\n\t\t * collections carry their create affordance in the card's Actions menu).\n\t\t * Files widgets carry their own upload toolbar, so they are excluded.\n\t\t *\n\t\t * @return {boolean} true when Add should render.\n\t\t */\n\t\tcatalogAddEnabled() {\n\t\t\tif (!['object-list', 'table'].includes(this.widget?.type)) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tif (this.content.allowCreate === false) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t// A declared `createAction` shows only where its visibleWhen holds,\n\t\t\t// the same answer the list gives for its own Add buttons.\n\t\t\treturn createActionState(this.content, this.object).visible\n\t\t},\n\n\t\t/**\n\t\t * Whether the catalog Add is a button in the card's title row: the board\n\t\t * look draws it there, right-aligned, instead of in the Actions menu and\n\t\t * the list's footer bar.\n\t\t *\n\t\t * @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\n\t\t * @return {boolean} true when the header button renders.\n\t\t */\n\t\tcatalogAddInHeader() {\n\t\t\treturn this.catalogAddEnabled && !this.isBare && normalizeLook(this.cnLook) === 'board'\n\t\t},\n\n\t\t/**\n\t\t * Whether the catalog Add is an item of the card's Actions menu, as\n\t\t * ADR-062 places it in the Nextcloud look.\n\t\t *\n\t\t * @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\n\t\t * @return {boolean} true when the menu item renders.\n\t\t */\n\t\tcatalogAddInMenu() {\n\t\t\treturn this.catalogAddEnabled && !this.catalogAddInHeader\n\t\t},\n\n\t\t/**\n\t\t * Whether the widget's overflow Actions menu renders: the definition's\n\t\t * own `showActions` when it is a boolean, else the surface's\n\t\t * `showActions`.\n\t\t *\n\t\t * @spec openspec/changes/zuiddrecht-pixel-gaps-3/specs/zuiddrecht-pixel-gaps-3/spec.md#requirement-a-detail-page-can-drop-the-widget-actions-menu\n\t\t * @return {boolean} true when the menu renders.\n\t\t */\n\t\tactionsShown() {\n\t\t\tconst own = this.widget && this.widget.showActions\n\t\t\treturn typeof own === 'boolean' ? own : this.showActions\n\t\t},\n\n\t\t/**\n\t\t * The card header rule, with the surface's layout-driven answer winning\n\t\t * when it supplied one.\n\t\t *\n\t\t * @return {boolean} true when the wrapper header renders.\n\t\t */\n\t\teffectiveShowCardTitle() {\n\t\t\tif (this.showCardTitle !== null) {\n\t\t\t\treturn this.showCardTitle\n\t\t\t}\n\t\t\tif (this.widget?.title === '' && this.content.title === undefined) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn this.widget?.title !== undefined || this.content.title !== undefined\n\t\t},\n\n\t\t/**\n\t\t * Label for the catalog Add action: the createAction's label, else the\n\t\t * list's own `addLabel`, as the list's Add reads it.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\taddLabel() {\n\t\t\tconst action = listCreateAction(this.content)\n\t\t\tconst label = action && typeof action.label === 'string' && action.label !== '' ? action.label : (typeof this.content.addLabel === 'string' ? this.content.addLabel : '')\n\t\t\tif (label !== '') {\n\t\t\t\treturn typeof this.cnTranslate === 'function' ? this.cnTranslate(label) : label\n\t\t\t}\n\t\t\treturn t('nextcloud-vue', 'Add')\n\t\t},\n\n\t\t/**\n\t\t * The items THIS HOST offers to the surface, as opposed to the ones the\n\t\t * widget inside it publishes.\n\t\t *\n\t\t * There is one: the catalog Add. It is drawn in the host's own card\n\t\t * header, and that header only exists off a panel, so a Documents or\n\t\t * Files tab simply had no way to add anything. The data widget's\n\t\t * Metadata went the same way until it was published, and this is the\n\t\t * same defect one widget type along.\n\t\t *\n\t\t * Empty off a panel, where the header draws the item itself and\n\t\t * publishing would put it in two menus at once.\n\t\t *\n\t\t * @return {object[]} PanelAction descriptors.\n\t\t */\n\t\townPanelActions() {\n\t\t\tif (!this.isBare || !this.catalogAddEnabled) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\treturn [{\n\t\t\t\tkey: 'catalog-add',\n\t\t\t\tlabel: this.addLabel,\n\t\t\t\ticon: 'Plus',\n\t\t\t\trun: () => this.invokeCatalogAdd(),\n\t\t\t}]\n\t\t},\n\t},\n\n\twatch: {\n\t\townPanelActions: {\n\t\t\thandler() {\n\t\t\t\tthis.publishOwnPanelActions()\n\t\t\t},\n\t\t},\n\t},\n\n\tmounted() {\n\t\tthis.publishOwnPanelActions()\n\t},\n\n\tbeforeUnmount() {\n\t\t// A closed tab's panel can be torn down while the strip lives on, and an\n\t\t// item whose host is gone would call into nothing.\n\t\tif (this.panelActionSink) {\n\t\t\tthis.panelActionSink.clear(this.widget?.id, 'host')\n\t\t}\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Take the header a content-only renderer, an app widget in the\n\t\t * titled card, or a carded mount-mode leaf (`onHeader`) reports.\n\t\t *\n\t\t * @param {{link?: object|null, note?: string, action?: {label: string, icon?: string, run: () => unknown}|null, actions?: Array<{label: string, icon?: string, run: () => unknown}>, count?: number, empty?: {name: string, description?: string}|null}} header The header parts.\n\t\t * @spec openspec/changes/screens-relation-pages/specs/relation-pages/spec.md#requirement-a-record-list-shows-the-objects-that-point-at-this-record\n\t\t * @spec openspec/changes/integration-leaf-card/specs/integration-leaf-card/spec.md#requirement-a-carded-leaf-reports-its-count-actions-and-empty-state\n\t\t */\n\t\tonRendererHeader(header) {\n\t\t\tconst link = header && header.link && typeof header.link === 'object' ? header.link : null\n\t\t\tconst note = header && typeof header.note === 'string' ? header.note : ''\n\t\t\tconst usable = (action) => action && typeof action.run === 'function' && action.label\n\t\t\t// `action` (one) and `actions` (several) both count, `action` first.\n\t\t\tconst actions = [header && header.action, ...((header && Array.isArray(header.actions)) ? header.actions : [])].filter(usable)\n\t\t\tconst pill = header && header.pill && typeof header.pill.label === 'string' && header.pill.label !== '' ? header.pill : null\n\t\t\tconst count = header && Number.isFinite(header.count) ? header.count : null\n\t\t\tconst empty = header && header.empty && typeof header.empty.name === 'string' && header.empty.name !== ''\n\t\t\t\t? { name: header.empty.name, description: typeof header.empty.description === 'string' ? header.empty.description : '' }\n\t\t\t\t: null\n\t\t\t// `subtitle`: a muted line under the card title (a task table's \"1 open, 3 done\").\n\t\t\tconst subtitle = header && typeof header.subtitle === 'string' ? header.subtitle : ''\n\t\t\t// `menuActions`: items for the card's Actions menu instead of the title row.\n\t\t\tconst menuActions = (header && Array.isArray(header.menuActions) ? header.menuActions : []).filter(usable)\n\t\t\tthis.rendererHeader = { link, note, subtitle, actions, pill, count, empty, menuActions }\n\t\t},\n\n\t\t/**\n\t\t * A manifest label through the host's translate; '' stays ''.\n\t\t *\n\t\t * @param {string} text The label as written in the manifest.\n\t\t * @return {string} The label in the user's language.\n\t\t * @spec openspec/changes/screens-detail-labels-parity/specs/detail-labels-board-look/spec.md#requirement-detail-labels-read-in-the-users-language\n\t\t */\n\t\ttranslateLabel(text) {\n\t\t\tif (typeof text !== 'string' || text === '') {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\treturn typeof this.cnTranslate === 'function' ? this.cnTranslate(text) : text\n\t\t},\n\n\t\t/**\n\t\t * Re-key a call on the channel this host provides onto the one it holds.\n\t\t * A widget publishes `set(items)`; a host nested in this one speaks the\n\t\t * surface's `set(id, items, source)`. Items are always an array and an\n\t\t * id never is, which tells the two apart.\n\t\t *\n\t\t * @param {Array} args The arguments as called.\n\t\t * @param {'set'|'clear'} kind Which channel method was called.\n\t\t * @return {Array} Arguments for the held channel.\n\t\t */\n\t\tnarrowPanelArgs(args, kind) {\n\t\t\tconst id = this.widget?.id\n\t\t\tif (kind === 'set') {\n\t\t\t\treturn Array.isArray(args[0])\n\t\t\t\t\t? [id, args[0], 'widget']\n\t\t\t\t\t: [id, args[1], args[2] || 'widget']\n\t\t\t}\n\t\t\treturn [id, args.length > 1 ? (args[1] || 'widget') : 'widget']\n\t\t},\n\n\t\t/**\n\t\t * Publish or withdraw this host's OWN items on the surface.\n\t\t *\n\t\t * Published under the `host` source so the widget inside the panel can\n\t\t * publish its own without either replacing the other.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tpublishOwnPanelActions() {\n\t\t\tif (!this.panelActionSink) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst id = this.widget?.id\n\t\t\tif (!id) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (this.ownPanelActions.length) {\n\t\t\t\tthis.panelActionSink.set(id, this.ownPanelActions, 'host')\n\t\t\t} else {\n\t\t\t\tthis.panelActionSink.clear(id, 'host')\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Re-emit the geo widget's save so the surface can reload the record.\n\t\t *\n\t\t * @param {object} geo The saved geometry.\n\t\t * @return {void}\n\t\t */\n\t\tonGeoSaved(geo) {\n\t\t\t/**\n\t\t\t * @event geo-saved Emitted when the geo widget saved a geometry.\n\t\t\t * @type {object}\n\t\t\t */\n\t\t\tthis.$emit('geo-saved', geo)\n\t\t},\n\n\t\t/**\n\t\t * Re-emit the related widget's request to open an integration.\n\t\t *\n\t\t * @param {string} integrationId The integration to open.\n\t\t * @return {void}\n\t\t */\n\t\tonOpenIntegration(integrationId) {\n\t\t\t/**\n\t\t\t * @event open-integration Emitted when the related widget asks to open an integration.\n\t\t\t * @type {string}\n\t\t\t */\n\t\t\tthis.$emit('open-integration', integrationId)\n\t\t},\n\n\t\t/**\n\t\t * Pass a related-object click up; the page decides where it opens. Heard\n\t\t * from the Related widget itself and from a registry widget that nests a\n\t\t * host of its own (a Tabs widget with a Related tab).\n\t\t *\n\t\t * @param {object} raw The clicked object as the related widget holds it.\n\t\t */\n\t\tonSelectObject(raw) {\n\t\t\t/**\n\t\t\t * @event select-object A related object was clicked in the related widget. Payload is the raw object; its `@self` names the register and schema.\n\t\t\t * @type {object}\n\t\t\t */\n\t\t\tthis.$emit('select-object', raw)\n\t\t},\n\n\t\t/**\n\t\t * Delegate to the rendered list widget's own create affordance, so the\n\t\t * card's Add action and the widget's footer button open the same form.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tinvokeCatalogAdd() {\n\t\t\tconst child = this.$refs.renderer\n\t\t\tconst target = Array.isArray(child) ? child[0] : child\n\t\t\tif (target && typeof target.openCreate === 'function') {\n\t\t\t\ttarget.openCreate()\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n/* A leaf card in a narrow cell keeps its title and count: the title row\n wraps and the actions move under it instead of squeezing the title out. */\n.cn-detail-page__leaf-card :deep(.cn-widget-wrapper__header) {\n\tflex-wrap: wrap;\n}\n\n.cn-detail-page__leaf-card :deep(.cn-widget-wrapper__header-left) {\n\tflex: 1 0 auto;\n}\n\n/* The count beside a card title: the grey 20px badge of the tab strip. */\n.cn-detail-page__catalog-count {\n\tbackground-color: var(--color-border);\n\tborder-radius: 10px;\n\tbox-sizing: border-box;\n\tcolor: var(--color-main-text);\n\tdisplay: inline-block;\n\tfont-size: 12px;\n\tfont-weight: 600;\n\tline-height: 20px;\n\tmin-width: 20px;\n\tpadding: 0 6px;\n\ttext-align: center;\n}\n\n.cn-detail-page__catalog-note {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 14px;\n\twhite-space: nowrap;\n}\n\n.cn-detail-widget-host,\n.cn-detail-widget-host > * {\n\theight: 100%;\n}\n\n/* A bare host is a tab panel's body: it fills the panel and lets the panel\n scroll, rather than growing a second scroll region of its own. */\n.cn-detail-widget-host--bare {\n\tmin-height: 0;\n}\n</style>\n"],"names":["CnDetailWidgetHeaderItems","CnIcon","CnIntegrationWidgetEmpty","CnLeafMountHost","CnObjectDataWidget","CnObjectGeoWidget","CnRelatedObjectsWidget","CnWidgetEmptyState","CnWidgetWrapper","CnEmptyContent","t","CnObjectFilesWidget"],"mappings":"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"}
1
+ {"version":3,"file":"CnDetailWidgetHost.vue2.js","sources":["../../../../src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n\n<template>\n\t<div class=\"cn-detail-widget-host\" :class=\"`cn-detail-widget-host--${chrome}`\">\n\t\t<!-- `type: 'data'` — the schema-driven data widget. In bare mode it is\n\t\t `chromeless`: no border, no background, no padding, no title row and\n\t\t no header divider, so the tab panel holds the content directly\n\t\t instead of a card inside a card.\n\n\t\t One prop, not three. `chromeless` is the word this component already\n\t\t used for the same thing on the integration path (`bareWidget`), and\n\t\t the three it replaces (`show-title`, `borderless`, `flush`) were a\n\t\t decomposition every caller had to remember in full — miss one and\n\t\t the panel keeps half a card.\n\n\t\t Chromeless does NOT mean no wrapper element. The wrapper's content\n\t\t node is what the library's table and detail-page CSS key on.\n\n\t\t It used to keep the whole card here, because its Save button lives\n\t\t in CnWidgetWrapper's header and hiding the header hid Save with it.\n\t\t The wrapper renders its header whenever there are actions, with or\n\t\t without a title, so the panel gets no title while an inline edit\n\t\t stays committable. Controls are not chrome.\n\n\t\t Passing `undefined` was never enough on its own: `title` carries a\n\t\t DEFAULT of \"Data\", so an unset title became a \"Data\" heading that\n\t\t nobody chose. The title is still passed, and now names the content\n\t\t region for a screen reader instead of printing a second heading.\n\n\t\t The overflow menu goes too, which `chromeless` does not cover. It\n\t\t left a 59px band whose only content was an Actions menu about eight\n\t\t pixels from the tab strip's own, and two menus on one row read as the\n\t\t same card inside a card in miniature.\n\n\t\t Nothing is lost, but that took a second piece of work rather than\n\t\t being true on its own. Suppressing the menu takes its two items with\n\t\t it, and Metadata had no other home anywhere: the page header carries\n\t\t no equivalent, so it became unreachable inside a panel. Edit is the\n\t\t softer case. CnDetailPage does carry a record Edit button, but it\n\t\t opens the form the PAGE configures, not the subset THIS widget\n\t\t declares through `overrides`, `include` and `exclude`, so a tabbed\n\t\t widget showing eight of forty fields lost the form scoped to its\n\t\t eight. Both items are now published to the host surface and render in\n\t\t its menu; see utils/panelActions.js. Inline editing was never\n\t\t affected: a cell opens its editor when clicked, and Save and Discard\n\t\t arrive in the header the moment there is an edit to commit. -->\n\t\t<!-- `requiredApp` names another Nextcloud app this widget leans on. When\n\t\t that app is absent the widget renders its NORMAL chrome plus a\n\t\t set-up state, and asks its backend NOTHING.\n\n\t\t It renders rather than hides on purpose. A hidden widget leaves a\n\t\t hole a reader cannot interpret, and the alternative — letting the\n\t\t query run — is worse: an aggregation over an absent app's register\n\t\t 404s and the tile shows `0`, which is exactly what a real zero\n\t\t shows. dossiq's hours tile did that on every install without\n\t\t humaniq, and looked correct doing it.\n\n\t\t \"NORMAL chrome\" means the chrome of the surface it is on. In a tab\n\t\t panel that is no chrome, same as every other widget there: a set-up\n\t\t state is still a widget, and a bordered card around it inside the\n\t\t panel is the same doubled card this file removes below. The title\n\t\t is now passed in bare mode too, where it names the content region\n\t\t rather than printing a heading the tab already carries. -->\n\t\t<CnWidgetWrapper\n\t\t\tv-if=\"missingApp\"\n\t\t\t:title=\"widgetTitle\"\n\t\t\t:subtitle=\"widgetSubtitle\"\n\t\t\t:chromeless=\"isBare\"\n\t\t\ttitleIconPosition=\"left\"\n\t\t\t:titleTone=\"widgetTitleTone\"\n\t\t\t:showRefresh=\"false\"\n\t\t\t:showRequestFeature=\"false\">\n\t\t\t<template v-if=\"widget && widget.icon\" #title-icon>\n\t\t\t\t<CnIcon :name=\"widget.icon\" :size=\"20\" />\n\t\t\t</template>\n\t\t\t<CnEmptyContent class=\"cn-requires-app\" :name=\"missingAppName\" :description=\"missingAppDescription\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<CnIcon :name=\"(widget && widget.icon) || 'PuzzleOutline'\" :size=\"32\" />\n\t\t\t\t</template>\n\t\t\t</CnEmptyContent>\n\t\t</CnWidgetWrapper>\n\n\t\t<CnObjectDataWidget\n\t\t\tv-else-if=\"isData && schemaObject\"\n\t\t\t:title=\"resolvedTitle\"\n\t\t\t:chromeless=\"isBare\"\n\t\t\t:showActions=\"!isBare && actionsShown\"\n\t\t\t:icon=\"widget.icon || null\"\n\t\t\t:schema=\"schemaObject\"\n\t\t\t:objectData=\"object\"\n\t\t\t:objectType=\"objectType\"\n\t\t\t:store=\"store\"\n\t\t\t:overrides=\"content.overrides || {}\"\n\t\t\t:include=\"content.include || null\"\n\t\t\t:exclude=\"content.exclude || []\"\n\t\t\t:hideEmpty=\"content.hideEmpty === true || hideEmpty\"\n\t\t\t:columns=\"content.columns || 3\"\n\t\t\t:collapsedFields=\"content.collapsedFields ?? null\"\n\t\t\t:footnote=\"content.footnote || ''\"\n\t\t\t:editable=\"content.editable !== false\" />\n\n\t\t<!-- `type: 'related'` — resolves this object's relations and links into\n\t\t integrations. Honours bare mode via its own `bare` prop. -->\n\t\t<CnRelatedObjectsWidget\n\t\t\tv-else-if=\"isRelated\"\n\t\t\t:title=\"resolvedTitle\"\n\t\t\t:bare=\"isBare\"\n\t\t\t:objectType=\"objectType\"\n\t\t\t:objectId=\"objectId\"\n\t\t\t:objectData=\"object\"\n\t\t\t:register=\"register\"\n\t\t\t:schema=\"schema\"\n\t\t\t:store=\"store\"\n\t\t\t:includeGroups=\"content.groups || []\"\n\t\t\t:layout=\"content.layout\"\n\t\t\t:groupByRelation=\"content.groupByRelation\"\n\t\t\t:groupActions=\"content.groupActions\"\n\t\t\t:showObjects=\"content.showObjects\"\n\t\t\t:showFiles=\"content.showFiles\"\n\t\t\t:showIntegrations=\"content.showIntegrations\"\n\t\t\t:showContracts=\"content.showContracts\"\n\t\t\t:excludeIntegrations=\"content.excludeIntegrations\"\n\t\t\t:extraSources=\"content.extraSources\"\n\t\t\t:referenceSections=\"content.referenceSections\"\n\t\t\t:footerActions=\"content.footerActions\"\n\t\t\t:showAddFooter=\"content.showAddFooter\"\n\t\t\t:emptyLabel=\"content.emptyLabel\"\n\t\t\t:hideSingleTabTitle=\"content.hideSingleTabTitle !== false\"\n\t\t\t:showTotalCount=\"content.showTotalCount !== false\"\n\t\t\t@openIntegration=\"onOpenIntegration\"\n\t\t\t@selectObject=\"onSelectObject\" />\n\n\t\t<!-- `type: 'object-geo'` — view/edit the object's `@self.geo` on a map. -->\n\t\t<CnObjectGeoWidget\n\t\t\tv-else-if=\"isGeo\"\n\t\t\t:title=\"resolvedTitle\"\n\t\t\t:objectId=\"objectId\"\n\t\t\t:objectData=\"object\"\n\t\t\t:register=\"register\"\n\t\t\t:schema=\"schema\"\n\t\t\t:editable=\"content.editable !== false\"\n\t\t\t:addressSearch=\"content.addressSearch === true\"\n\t\t\t:basemap=\"content.basemap || 'standard'\"\n\t\t\t:allowBasemapSwitch=\"content.allowBasemapSwitch === true\"\n\t\t\t:fitControl=\"content.fitControl !== false\"\n\t\t\t:locateControl=\"content.locateControl !== false\"\n\t\t\t:fullscreenControl=\"content.fullscreenControl !== false\"\n\t\t\t:height=\"content.height || '360px'\"\n\t\t\t:defaultZoom=\"content.defaultZoom || 7\"\n\t\t\t@saved=\"onGeoSaved\" />\n\n\t\t<!-- Mount-mode integration leaf (openregister#2127): a bare host-owned\n\t\t element the leaf mounts its own framework into. -->\n\t\t<!-- An integration widget whose `props` name a value the record does not\n\t\t hold yet (`objectId: \"@object.caseReference\"` on a ticket with no\n\t\t case) is absent. Mounting it would hand the leaf an empty host, and a\n\t\t leaf falls back to the page's own object from there. -->\n\t\t<span\n\t\t\tv-else-if=\"(isIntegration && widgetPropsPending) || consumerWidgetWaiting\"\n\t\t\thidden\n\t\t\tdata-testid=\"cn-detail-widget-props-pending\" />\n\n\t\t<!-- A mount-mode leaf whose descriptor asks for the library card\n\t\t (`chrome: \"card\"`): the host draws the card, its title with the\n\t\t count the leaf reports, the leaf's actions in the title row and the\n\t\t library empty state. The leaf reports them through the `onHeader`\n\t\t mount prop and renders only its rows. -->\n\t\t<CnWidgetWrapper\n\t\t\tv-else-if=\"wrapsMountLeaf\"\n\t\t\t:title=\"leafCardTitle\"\n\t\t\t:showTitle=\"leafCardTitle !== ''\"\n\t\t\ttitleIconPosition=\"left\"\n\t\t\t:titleTone=\"widgetTitleTone\"\n\t\t\t:showActions=\"false\"\n\t\t\t:showRefresh=\"false\"\n\t\t\t:showRequestFeature=\"false\"\n\t\t\t:headerLink=\"cardHeaderLink\"\n\t\t\tclass=\"cn-detail-page__leaf-card\"\n\t\t\tdata-testid=\"cn-detail-widget-leaf-card\">\n\t\t\t<template v-if=\"leafCardIcon\" #title-icon>\n\t\t\t\t<CnIcon :name=\"leafCardIcon\" :size=\"20\" />\n\t\t\t</template>\n\t\t\t<template v-if=\"rendererHeader.count !== null\" #title-meta>\n\t\t\t\t<span class=\"cn-detail-page__catalog-count\" data-testid=\"cn-detail-widget-header-count\">{{ rendererHeader.count }}</span>\n\t\t\t</template>\n\t\t\t<template v-if=\"hasRendererHeaderItems\" #actions>\n\t\t\t\t<CnDetailWidgetHeaderItems :header=\"rendererHeader\" />\n\t\t\t</template>\n\t\t\t<!-- `content.leadWidgetIds`: other widgets drawn inside this card, before its own content. -->\n\t\t\t<CnDetailWidgetHost\n\t\t\t\tv-for=\"lead in leadWidgets\"\n\t\t\t\t:key=\"`lead-${lead.id}`\"\n\t\t\t\tclass=\"cn-detail-widget-host__lead\"\n\t\t\t\t:widget=\"lead\"\n\t\t\t\tchrome=\"bare\"\n\t\t\t\t:objectId=\"objectId\"\n\t\t\t\t:object=\"object\"\n\t\t\t\t:objectType=\"objectType\"\n\t\t\t\t:register=\"register\"\n\t\t\t\t:schema=\"schema\"\n\t\t\t\t:store=\"store\"\n\t\t\t\t:availableWidgets=\"availableWidgets\"\n\t\t\t\t:cnRegistry=\"cnRegistry\" />\n\t\t\t<CnWidgetEmptyState\n\t\t\t\tv-if=\"rendererHeader.empty\"\n\t\t\t\t:name=\"rendererHeader.empty.name\"\n\t\t\t\t:description=\"rendererHeader.empty.description\" />\n\t\t\t<CnLeafMountHost\n\t\t\t\t:provider=\"integrationProvider\"\n\t\t\t\t:mountProps=\"integrationMountProps\" />\n\t\t</CnWidgetWrapper>\n\n\t\t<CnLeafMountHost\n\t\t\tv-else-if=\"isMountIntegration\"\n\t\t\t:provider=\"integrationProvider\"\n\t\t\t:mountProps=\"integrationMountProps\" />\n\n\t\t<!-- An integration widget with `content.view: \"tab\"` on a card surface:\n\t\t the leaf's full tab (its rows and its own buttons) inside a card the\n\t\t widget titles, instead of the provider's compact count card. -->\n\t\t<CnWidgetWrapper\n\t\t\tv-else-if=\"wrapsLeafTab\"\n\t\t\t:title=\"leafCardTitle\"\n\t\t\t:showTitle=\"leafCardTitle !== ''\"\n\t\t\t:subtitle=\"widgetSubtitle\"\n\t\t\ttitleIconPosition=\"left\"\n\t\t\t:titleTone=\"widgetTitleTone\"\n\t\t\t:showActions=\"false\"\n\t\t\t:showRefresh=\"false\"\n\t\t\t:showRequestFeature=\"false\"\n\t\t\tclass=\"cn-detail-page__leaf-card\"\n\t\t\tdata-testid=\"cn-detail-widget-tab-card\">\n\t\t\t<template v-if=\"leafCardIcon\" #title-icon>\n\t\t\t\t<CnIcon :name=\"leafCardIcon\" :size=\"20\" />\n\t\t\t</template>\n\t\t\t<!-- `content.leadWidgetIds`: other widgets drawn inside this card, before its own content. -->\n\t\t\t<CnDetailWidgetHost\n\t\t\t\tv-for=\"lead in leadWidgets\"\n\t\t\t\t:key=\"`lead-${lead.id}`\"\n\t\t\t\tclass=\"cn-detail-widget-host__lead\"\n\t\t\t\t:widget=\"lead\"\n\t\t\t\tchrome=\"bare\"\n\t\t\t\t:objectId=\"objectId\"\n\t\t\t\t:object=\"object\"\n\t\t\t\t:objectType=\"objectType\"\n\t\t\t\t:register=\"register\"\n\t\t\t\t:schema=\"schema\"\n\t\t\t\t:store=\"store\"\n\t\t\t\t:availableWidgets=\"availableWidgets\"\n\t\t\t\t:cnRegistry=\"cnRegistry\" />\n\t\t\t<component :is=\"resolveRegistryTab(widget.integrationId)\" v-bind=\"integrationProps\" />\n\t\t</CnWidgetWrapper>\n\n\t\t<!-- Integration leaf, component mode. In BARE mode this renders the\n\t\t provider's `tab` (its bare content) rather than its `widget` (which\n\t\t draws its own card). That pairing is not an invention here:\n\t\t CnIntegrationWidget already renders `provider.tab` inside its own\n\t\t tab panels for exactly this reason. -->\n\t\t<component\n\t\t\t:is=\"integrationComponent\"\n\t\t\tv-else-if=\"isIntegration && integrationComponent\"\n\t\t\tv-bind=\"integrationProps\" />\n\n\t\t<!-- An integration whose leaf is not registered (its app is absent or\n\t\t its bundle did not load) says so, as CnIntegrationWidget does. -->\n\t\t<CnIntegrationWidgetEmpty\n\t\t\tv-else-if=\"integrationAbsent\"\n\t\t\t:provider=\"absentIntegrationProvider\"\n\t\t\t:reason=\"absentIntegrationProvider.appName ? 'missing-app' : 'unknown'\"\n\t\t\tdata-testid=\"cn-detail-widget-integration-absent\" />\n\n\t\t<!-- Content-only catalog widgets (object-list / table / files) render\n\t\t bare tables. On a card surface they get the titled wrapper (ADR-062:\n\t\t every body widget has chrome and its manifest title); inside a tab\n\t\t the strip supplies both, so they render as-is.\n\n\t\t The `cn-detail-page__*` classes here and below keep their old names\n\t\t although the markup moved out of CnDetailPage: src/css/detail-page.css\n\t\t targets them, and so may consumer app CSS. Renaming them to match this\n\t\t component would be a silent visual regression across the fleet. -->\n\t\t<CnWidgetWrapper\n\t\t\tv-else-if=\"renderer && isContentOnly && !isBare\"\n\t\t\t:title=\"widget.title || ''\"\n\t\t\t:subtitle=\"rendererHeader.subtitle || widgetSubtitle\"\n\t\t\ttitleIconPosition=\"left\"\n\t\t\t:titleTone=\"widgetTitleTone\"\n\t\t\t:showActions=\"actionsShown || catalogAddInMenu || rendererHeader.menuActions.length > 0\"\n\t\t\t:showRefresh=\"false\"\n\t\t\t:showRequestFeature=\"false\"\n\t\t\t:headerLink=\"cardHeaderLink\"\n\t\t\tclass=\"cn-detail-page__catalog-card\">\n\t\t\t<template v-if=\"widget.icon\" #title-icon>\n\t\t\t\t<CnIcon :name=\"widget.icon\" :size=\"20\" />\n\t\t\t</template>\n\t\t\t<!-- A renderer that reports its own header (`header` event:\n\t\t\t `{ link, note, action, actions, pill }`, e.g. record-list's \"3 in\n\t\t\t totaal\", a facts card's status pill). -->\n\t\t\t<template v-if=\"hasRendererHeaderItems || catalogAddInHeader\" #actions>\n\t\t\t\t<CnDetailWidgetHeaderItems v-if=\"hasRendererHeaderItems\" :header=\"rendererHeader\" />\n\t\t\t\t<!-- The board look draws the catalog Add as a button in the title\n\t\t\t\t row; the list's footer Add is hidden there (look-board-detail.css). -->\n\t\t\t\t<NcButton\n\t\t\t\t\tv-if=\"catalogAddInHeader\"\n\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\tclass=\"cn-detail-page__catalog-add\"\n\t\t\t\t\tdata-testid=\"cn-detail-widget-catalog-add\"\n\t\t\t\t\t@click=\"invokeCatalogAdd\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<Plus :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ addLabel }}\n\t\t\t\t</NcButton>\n\t\t\t</template>\n\t\t\t<template v-if=\"catalogAddInMenu || rendererHeader.menuActions.length > 0\" #action-items>\n\t\t\t\t<NcActionButton v-if=\"catalogAddInMenu\" @click=\"invokeCatalogAdd\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<Plus :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ addLabel }}\n\t\t\t\t</NcActionButton>\n\t\t\t\t<!-- `menuActions` a renderer reports: items in the card's Actions menu. -->\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-for=\"(action, index) in rendererHeader.menuActions\"\n\t\t\t\t\t:key=\"`menu-${index}-${action.label}`\"\n\t\t\t\t\t:closeAfterClick=\"true\"\n\t\t\t\t\tdata-testid=\"cn-detail-widget-menu-action\"\n\t\t\t\t\t@click=\"action.run()\">\n\t\t\t\t\t<template v-if=\"action.icon\" #icon>\n\t\t\t\t\t\t<CnIcon :name=\"action.icon\" :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ action.label }}\n\t\t\t\t</NcActionButton>\n\t\t\t</template>\n\t\t\t<!-- `content.leadWidgetIds`: other widgets drawn inside this card, before its own content. -->\n\t\t\t<CnDetailWidgetHost\n\t\t\t\tv-for=\"lead in leadWidgets\"\n\t\t\t\t:key=\"`lead-${lead.id}`\"\n\t\t\t\tclass=\"cn-detail-widget-host__lead\"\n\t\t\t\t:widget=\"lead\"\n\t\t\t\tchrome=\"bare\"\n\t\t\t\t:objectId=\"objectId\"\n\t\t\t\t:object=\"object\"\n\t\t\t\t:objectType=\"objectType\"\n\t\t\t\t:register=\"register\"\n\t\t\t\t:schema=\"schema\"\n\t\t\t\t:store=\"store\"\n\t\t\t\t:availableWidgets=\"availableWidgets\"\n\t\t\t\t:cnRegistry=\"cnRegistry\" />\n\t\t\t<component\n\t\t\t\t:is=\"renderer\"\n\t\t\t\tref=\"renderer\"\n\t\t\t\tv-bind=\"rendererProps\"\n\t\t\t\t@header=\"onRendererHeader\"\n\t\t\t\t@selectObject=\"onSelectObject\" />\n\t\t</CnWidgetWrapper>\n\n\t\t<!-- Registry \"card\" widgets (stat / gauge / delta) render bare tile\n\t\t content, so on a card surface they need the same titled wrapper the\n\t\t dashboard gives them (ADR-062: a lone stat must not read as uncarded\n\t\t floating text). `card-fit` centres the tile and drops the inner\n\t\t scrollbar. No Actions menu: it would hold nothing here and squeezes\n\t\t the title of a narrow tile. -->\n\t\t<CnWidgetWrapper\n\t\t\tv-else-if=\"renderer && isCard && !isBare\"\n\t\t\t:title=\"widget.title || content.title || ''\"\n\t\t\t:subtitle=\"widgetSubtitle\"\n\t\t\t:showTitle=\"effectiveShowCardTitle\"\n\t\t\ttitleIconPosition=\"left\"\n\t\t\t:titleTone=\"widgetTitleTone\"\n\t\t\tflush\n\t\t\t:showActions=\"false\"\n\t\t\t:showRefresh=\"false\"\n\t\t\t:showRequestFeature=\"false\"\n\t\t\t:headerLink=\"cardHeaderLink\"\n\t\t\tclass=\"cn-detail-page__card-fit\">\n\t\t\t<template v-if=\"widget.icon\" #title-icon>\n\t\t\t\t<CnIcon :name=\"widget.icon\" :size=\"20\" />\n\t\t\t</template>\n\t\t\t<!-- `content.leadWidgetIds`: other widgets drawn inside this card, before its own content. -->\n\t\t\t<CnDetailWidgetHost\n\t\t\t\tv-for=\"lead in leadWidgets\"\n\t\t\t\t:key=\"`lead-${lead.id}`\"\n\t\t\t\tclass=\"cn-detail-widget-host__lead\"\n\t\t\t\t:widget=\"lead\"\n\t\t\t\tchrome=\"bare\"\n\t\t\t\t:objectId=\"objectId\"\n\t\t\t\t:object=\"object\"\n\t\t\t\t:objectType=\"objectType\"\n\t\t\t\t:register=\"register\"\n\t\t\t\t:schema=\"schema\"\n\t\t\t\t:store=\"store\"\n\t\t\t\t:availableWidgets=\"availableWidgets\"\n\t\t\t\t:cnRegistry=\"cnRegistry\" />\n\t\t\t<component :is=\"renderer\" :content=\"content\" v-bind=\"declaredContent\" />\n\t\t</CnWidgetWrapper>\n\n\t\t<!-- A chart on a card surface: the titled card every body widget\n\t\t carries (ADR-062), with the whole prop bag, so record tokens in its\n\t\t `cellSource` or `dataSource` still resolve. In a tab panel it stays\n\t\t bare. -->\n\t\t<CnWidgetWrapper\n\t\t\tv-else-if=\"renderer && wrapsChart\"\n\t\t\t:title=\"widget.title || ''\"\n\t\t\t:subtitle=\"widgetSubtitle\"\n\t\t\ttitleIconPosition=\"left\"\n\t\t\t:titleTone=\"widgetTitleTone\"\n\t\t\t:showActions=\"false\"\n\t\t\t:showRefresh=\"false\"\n\t\t\t:showRequestFeature=\"false\"\n\t\t\t:headerLink=\"cardHeaderLink\"\n\t\t\tclass=\"cn-detail-page__card-fit\"\n\t\t\tdata-testid=\"cn-detail-widget-chart-card\">\n\t\t\t<template v-if=\"widget.icon\" #title-icon>\n\t\t\t\t<CnIcon :name=\"widget.icon\" :size=\"20\" />\n\t\t\t</template>\n\t\t\t<component\n\t\t\t\t:is=\"renderer\"\n\t\t\t\tref=\"renderer\"\n\t\t\t\tv-bind=\"rendererProps\"\n\t\t\t\t@selectObject=\"onSelectObject\" />\n\t\t</CnWidgetWrapper>\n\n\t\t<!-- An app's own widget (consumer registry) on a card surface, the\n\t\t side column or a tab stack, whose registry entry asks for the\n\t\t titled card (`chrome: \"card\"`). Opt-in: many app widgets draw their\n\t\t own card. A body grid cell has its own card, so there it stays\n\t\t bare. -->\n\t\t<CnWidgetWrapper\n\t\t\tv-else-if=\"renderer && wrapsConsumerWidget\"\n\t\t\t:title=\"widget.title || ''\"\n\t\t\t:subtitle=\"rendererHeader.subtitle || widgetSubtitle\"\n\t\t\t:showTitle=\"effectiveShowCardTitle\"\n\t\t\ttitleIconPosition=\"left\"\n\t\t\t:titleTone=\"widgetTitleTone\"\n\t\t\t:showActions=\"false\"\n\t\t\t:showRefresh=\"false\"\n\t\t\t:showRequestFeature=\"false\"\n\t\t\t:headerLink=\"cardHeaderLink\"\n\t\t\tclass=\"cn-detail-page__consumer-card\"\n\t\t\tdata-testid=\"cn-detail-widget-consumer-card\">\n\t\t\t<template v-if=\"widget.icon\" #title-icon>\n\t\t\t\t<CnIcon :name=\"widget.icon\" :size=\"20\" />\n\t\t\t</template>\n\t\t\t<!-- The app widget reports its title row the way the built-in\n\t\t\t cards do (`header` event). -->\n\t\t\t<template v-if=\"hasRendererHeaderItems\" #actions>\n\t\t\t\t<CnDetailWidgetHeaderItems :header=\"rendererHeader\" />\n\t\t\t</template>\n\t\t\t<!-- `content.leadWidgetIds`: other widgets drawn inside this card, before its own content. -->\n\t\t\t<CnDetailWidgetHost\n\t\t\t\tv-for=\"lead in leadWidgets\"\n\t\t\t\t:key=\"`lead-${lead.id}`\"\n\t\t\t\tclass=\"cn-detail-widget-host__lead\"\n\t\t\t\t:widget=\"lead\"\n\t\t\t\tchrome=\"bare\"\n\t\t\t\t:objectId=\"objectId\"\n\t\t\t\t:object=\"object\"\n\t\t\t\t:objectType=\"objectType\"\n\t\t\t\t:register=\"register\"\n\t\t\t\t:schema=\"schema\"\n\t\t\t\t:store=\"store\"\n\t\t\t\t:availableWidgets=\"availableWidgets\"\n\t\t\t\t:cnRegistry=\"cnRegistry\" />\n\t\t\t<component\n\t\t\t\t:is=\"renderer\"\n\t\t\t\tref=\"renderer\"\n\t\t\t\tv-bind=\"rendererProps\"\n\t\t\t\t@header=\"onRendererHeader\"\n\t\t\t\t@selectObject=\"onSelectObject\" />\n\t\t</CnWidgetWrapper>\n\n\t\t<!-- A titled `sections` widget in the side column or a tab stack: its\n\t\t sections stack inside one titled card, as the other cards there\n\t\t are drawn. A grid cell has its own card, and `content.cards` makes\n\t\t every section a card of its own, so both stay as they are. -->\n\t\t<CnWidgetWrapper\n\t\t\tv-else-if=\"renderer && wrapsSections\"\n\t\t\t:title=\"widget.title\"\n\t\t\t:subtitle=\"widgetSubtitle\"\n\t\t\t:showTitle=\"effectiveShowCardTitle\"\n\t\t\ttitleIconPosition=\"left\"\n\t\t\t:titleTone=\"widgetTitleTone\"\n\t\t\t:showActions=\"false\"\n\t\t\t:showRefresh=\"false\"\n\t\t\t:showRequestFeature=\"false\"\n\t\t\t:headerLink=\"cardHeaderLink\"\n\t\t\tclass=\"cn-detail-page__sections-card\"\n\t\t\tdata-testid=\"cn-detail-widget-sections-card\">\n\t\t\t<template v-if=\"widget.icon\" #title-icon>\n\t\t\t\t<CnIcon :name=\"widget.icon\" :size=\"20\" />\n\t\t\t</template>\n\t\t\t<!-- `content.leadWidgetIds`: other widgets drawn inside this card, before its own content. -->\n\t\t\t<CnDetailWidgetHost\n\t\t\t\tv-for=\"lead in leadWidgets\"\n\t\t\t\t:key=\"`lead-${lead.id}`\"\n\t\t\t\tclass=\"cn-detail-widget-host__lead\"\n\t\t\t\t:widget=\"lead\"\n\t\t\t\tchrome=\"bare\"\n\t\t\t\t:objectId=\"objectId\"\n\t\t\t\t:object=\"object\"\n\t\t\t\t:objectType=\"objectType\"\n\t\t\t\t:register=\"register\"\n\t\t\t\t:schema=\"schema\"\n\t\t\t\t:store=\"store\"\n\t\t\t\t:availableWidgets=\"availableWidgets\"\n\t\t\t\t:cnRegistry=\"cnRegistry\" />\n\t\t\t<component\n\t\t\t\t:is=\"renderer\"\n\t\t\t\tref=\"renderer\"\n\t\t\t\tv-bind=\"rendererProps\"\n\t\t\t\t@selectObject=\"onSelectObject\" />\n\t\t</CnWidgetWrapper>\n\n\t\t<!-- A library widget that draws its own title row and asks for the\n\t\t card (registry `ownsTitle` + `chrome: \"card\"`): an untitled card\n\t\t on a card surface, so it does not float bare in a tab stack. -->\n\t\t<CnWidgetWrapper\n\t\t\tv-else-if=\"renderer && wrapsSelfTitledWidget\"\n\t\t\t:showTitle=\"false\"\n\t\t\t:showActions=\"false\"\n\t\t\t:showRefresh=\"false\"\n\t\t\t:showRequestFeature=\"false\"\n\t\t\tclass=\"cn-detail-page__self-titled-card\"\n\t\t\tdata-testid=\"cn-detail-widget-self-titled-card\">\n\t\t\t<component\n\t\t\t\t:is=\"renderer\"\n\t\t\t\tref=\"renderer\"\n\t\t\t\tv-bind=\"rendererProps\"\n\t\t\t\t@selectObject=\"onSelectObject\" />\n\t\t</CnWidgetWrapper>\n\n\t\t<!-- Every other content-driven catalog widget, and every bare-mode\n\t\t catalog widget. These self-fetch from OpenRegister. The object\n\t\t context is forwarded too (the same shape CnWidgetGrid merges on the\n\t\t v2 widgets[] path) so object-aware widgets receive it; widgets that\n\t\t declare none of those props ignore them. `content` spreads LAST so\n\t\t explicit widget config still wins. -->\n\t\t<component\n\t\t\t:is=\"renderer\"\n\t\t\tv-else-if=\"renderer\"\n\t\t\tref=\"renderer\"\n\t\t\tv-bind=\"rendererProps\"\n\t\t\t@selectObject=\"onSelectObject\" />\n\n\t\t<!-- No renderer resolves: render nothing, which is what CnDetailPage has\n\t\t always done here. Surfacing an \"unknown widget\" box instead would be\n\t\t more honest, but this is the SLOT FALLBACK for every detail page in\n\t\t the fleet, so an app that declares a custom widget and omits its\n\t\t `#widget-<id>` slot would start showing a placeholder where it shows\n\t\t nothing today. That is its own change, not a side effect of this one. -->\n\t</div>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcActionButton, NcButton } from '@nextcloud/vue'\nimport { computed } from 'vue'\nimport Plus from 'vue-material-design-icons/Plus.vue'\nimport CnEmptyContent from '../CnEmptyContent/CnEmptyContent.vue'\nimport CnIcon from '../CnIcon/CnIcon.vue'\nimport CnIntegrationWidgetEmpty from '../CnIntegrationWidget/CnIntegrationWidgetEmpty.vue'\nimport CnLeafMountHost from '../CnLeafMountHost/CnLeafMountHost.vue'\nimport CnObjectDataWidget from '../CnObjectDataWidget/CnObjectDataWidget.vue'\nimport CnObjectFilesWidget from '../CnObjectFilesWidget/CnObjectFilesWidget.vue'\nimport CnObjectGeoWidget from '../CnObjectGeoWidget/CnObjectGeoWidget.vue'\nimport CnRelatedObjectsWidget from '../CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue'\nimport CnWidgetEmptyState from '../CnWidgetEmptyState/CnWidgetEmptyState.vue'\nimport CnDetailWidgetHeaderItems from './CnDetailWidgetHeaderItems.vue'\nimport { getByPath } from '../../composables/useEndpointSource.js'\nimport { useIntegrationRegistry } from '../../composables/useIntegrationRegistry.js'\nimport { normalizeLook } from '../../composables/useLook.js'\nimport { dispatchAction } from '../../utils/actionsDispatcher.js'\nimport { isAppInstalled } from '../../utils/appInstalled.js'\nimport { pickConditionalText } from '../../utils/conditionalText.js'\nimport { resolveHeaderLink, widgetHeaderLink } from '../../utils/contentHeaderLink.js'\nimport { pickDeclaredProps } from '../../utils/declaredProps.js'\nimport { unwrapAppConfig } from '../../utils/formatMetric.js'\nimport { isActivityWidget } from '../../utils/headerMeta.js'\nimport { createActionState, listCreateAction } from '../../utils/listCreateAction.js'\nimport { PANEL_ACTION_SINK } from '../../utils/panelActions.js'\nimport { resolveDeepTokens } from '../../utils/resolveFilterTokens.js'\nimport { evaluateVisibleWhenLocal } from '../../utils/visibleWhen.js'\nimport {\n\tisCardWidgetDef,\n\tisContentOnlyWidgetDef,\n\tisDataWidgetDef,\n\tisGeoWidgetDef,\n\tisIntegrationWidgetDef,\n\tisRelatedWidgetDef,\n\tresolveRegistryRenderer,\n\twidgetContentOf,\n\twidgetTitleOf,\n} from '../../utils/widgetDispatch.js'\nimport { resolveWidgetHeaderActions, WIDGET_BODY_ACTIONS, WIDGET_HEADER_ACTIONS } from '../../utils/widgetHeaderActions.js'\nimport { HOST_WIDGET_ID } from '../../utils/widgetSelection.js'\nimport { getWidgetTypeEntry } from '../CnWidgetGrid/dashboardWidgetRegistry.js'\nimport { CnWidgetWrapper } from '../CnWidgetWrapper/index.js'\n\n/**\n * CnDetailWidgetHost — renders ONE detail-page widget definition.\n *\n * This is the dispatch that used to be a ~230-line `v-if` chain inside\n * `CnDetailPage`'s grid slot. It moved out when a second surface needed it:\n * `CnTabsWidget` renders the same widget definitions inside tab panels, and\n * two copies of \"which renderer does this type get\" is the kind of thing that\n * drifts silently. A type added to one and not the other renders correctly on\n * the page and blank in a tab, with nothing in the console either way.\n *\n * ## The two chrome modes\n *\n * `chrome=\"card\"` is the detail-page grid: every widget gets a titled card,\n * because ADR-062 rule 5 says every body widget carries chrome and its manifest\n * title.\n *\n * `chrome=\"bare\"` is a tab panel. The tab strip already shows the title and\n * draws the card, so a second title inside the panel reads as a heading nested\n * in its own heading. Bare mode therefore drops the wrapper and, for\n * integration leaves, renders the provider's `tab` (bare content) instead of\n * its `widget` (which draws its own card). That pairing is not new: it is\n * exactly what `CnIntegrationWidget` already does inside its own panels.\n *\n * ## The `data` widget in bare mode\n *\n * It drops its title, border and padding, so a tab panel holds the content\n * directly rather than a card inside a card.\n *\n * That used not to be possible. `CnWidgetWrapper` renders its actions INSIDE\n * the header and `CnObjectDataWidget` puts its **Save** button there, so\n * hiding the header to remove the duplicate title also removed the only way to\n * commit an inline edit; a silently unsaveable form being worse than a doubled\n * title, the title stayed. The wrapper now renders its header whenever there\n * are actions, with or without a title, so the two are separate requests and a\n * panel can have no title while staying saveable.\n *\n * ```vue\n * <CnDetailWidgetHost\n * :widget=\"def\"\n * :object-id=\"id\"\n * :object=\"record\"\n * register=\"dossiq\"\n * schema=\"case\"\n * chrome=\"bare\" />\n * ```\n */\nexport default {\n\tname: 'CnDetailWidgetHost',\n\n\tcomponents: {\n\t\tCnDetailWidgetHeaderItems,\n\t\tCnIcon,\n\t\tCnIntegrationWidgetEmpty,\n\t\tCnLeafMountHost,\n\t\tCnObjectDataWidget,\n\t\tCnObjectGeoWidget,\n\t\tCnRelatedObjectsWidget,\n\t\tCnWidgetEmptyState,\n\t\tCnWidgetWrapper,\n\t\tNcActionButton,\n\t\tNcButton,\n\t\tCnEmptyContent,\n\t\tPlus,\n\t},\n\n\tinject: {\n\t\t/**\n\t\t * The surface's panel-action channel, when this host sits inside one.\n\t\t *\n\t\t * Absent on every other surface, which is why the default is null\n\t\t * rather than a required injection.\n\t\t */\n\t\tpanelActionSink: {\n\t\t\tfrom: PANEL_ACTION_SINK,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** The app's look, provided by CnAppRoot or CnPageRenderer (`nextcloud` or `board`). */\n\t\tcnLook: { default: 'nextcloud' },\n\t\t/** The host's translate (CnAppRoot provides `cnTranslate`). */\n\t\tcnTranslate: { default: () => (key) => key },\n\t\t/** The page's action dispatcher (CnPageRenderer), for `headerActions`. */\n\t\tcnDispatchAction: { default: null },\n\t\t/** The detail page's record edit form (`{ available, open }`), for an `edit-record` header action. */\n\t\tcnRecordEdit: { default: null },\n\t\t/** The records the detail page reads beside the record (`@context.<name>`), for a subtitle that depends on them. */\n\t\tcnDetailVisibilityRows: { default: null },\n\t\t/**\n\t\t * The page-level app config (CnDetailPage provides `cnAppConfig` from\n\t\t * its `appConfig` prop), which answers `@config.<key>` in a widget's\n\t\t * `props`. Empty when no ancestor provides one.\n\t\t */\n\t\tcnAppConfig: { default: () => ({}) },\n\t},\n\n\t/**\n\t * Re-provide the channel with this panel's widget id baked in.\n\t *\n\t * The widget below does not know its own id on the surface and should not\n\t * have to, so the id is supplied here, where it is already known. Read at\n\t * CALL time rather than captured, so a host whose `widget` changes keeps\n\t * publishing under the right key.\n\t *\n\t * Provides null when there is no surface to publish to, so the widget's own\n\t * injection resolves to null instead of finding a channel that goes nowhere.\n\t *\n\t * @return {object} The narrowed sink, or null.\n\t */\n\tprovide() {\n\t\tconst sink = this.panelActionSink\n\t\treturn {\n\t\t\t// The widget's manifest `headerActions`, for the card that titles\n\t\t\t// it. In bare mode the surface (a tab panel) draws them instead.\n\t\t\t[WIDGET_HEADER_ACTIONS]: computed(() => (this.isBare ? [] : this.declaredHeaderActions)),\n\t\t\t// The widget's manifest `bodyActions`, for a leaf that draws its\n\t\t\t// own button row in the body (the contacts tab).\n\t\t\t[WIDGET_BODY_ACTIONS]: computed(() => this.declaredBodyActions),\n\t\t\t// The hosted widget's id, read at call time, so a list can publish its\n\t\t\t// rows under it for a card that follows them (side-card-follows-row).\n\t\t\t[HOST_WIDGET_ID]: () => (this.widget && this.widget.id) || '',\n\t\t\t[PANEL_ACTION_SINK]: sink\n\t\t\t\t? {\n\t\t\t\t\t\tset: (...args) => sink.set(...this.narrowPanelArgs(args, 'set')),\n\t\t\t\t\t\tclear: (...args) => sink.clear(...this.narrowPanelArgs(args, 'clear')),\n\t\t\t\t\t}\n\t\t\t\t: null,\n\t\t}\n\t},\n\n\tprops: {\n\t\t/**\n\t\t * The resolved widget definition: `{ id, type, title, icon, content }`,\n\t\t * plus `integrationId` for `type: 'integration'`.\n\t\t *\n\t\t * Resolved, not a layout item: turning an item into a definition needs\n\t\t * the surface's own widget list, which is the one part the two surfaces\n\t\t * genuinely do differently.\n\t\t *\n\t\t * @type {object}\n\t\t */\n\t\twidget: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\n\t\t/**\n\t\t * How much chrome to draw around the widget.\n\t\t * - `'card'` — a titled `CnWidgetWrapper`, the detail-page grid default.\n\t\t * - `'bare'` — no wrapper; the caller owns the title and the card.\n\t\t */\n\t\tchrome: {\n\t\t\ttype: String,\n\t\t\tdefault: 'card',\n\t\t\tvalidator: (v) => ['card', 'bare'].includes(v),\n\t\t},\n\n\t\t/**\n\t\t * The host sits in a body grid cell, which draws its own card: an\n\t\t * app's own widget then stays bare, as it always has.\n\t\t *\n\t\t * @spec openspec/changes/detail-consumer-widget-card/specs/detail-page/spec.md#requirement-a-consumer-widget-on-a-card-surface-gets-the-titled-card\n\t\t */\n\t\tinGridCell: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** The bound record's id. Present on the first render; `object` is not. */\n\t\tobjectId: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** The loaded record, or null while it is still being fetched. */\n\t\tobject: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** The resolved object-type slug. */\n\t\tobjectType: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** The resolved JSON Schema object, needed by the `data` widget. */\n\t\tschemaObject: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** OpenRegister register slug of the surface. */\n\t\tregister: {\n\t\t\ttype: [String, Object],\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** OpenRegister schema slug of the surface. */\n\t\tschema: {\n\t\t\ttype: [String, Object],\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** The effective object store. */\n\t\tstore: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** Rendering surface forwarded to integration widgets (AD-19). */\n\t\tsurface: {\n\t\t\ttype: String,\n\t\t\tdefault: 'detail-page',\n\t\t},\n\n\t\t/** Object context forwarded to integration widgets. */\n\t\tintegrationContext: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** Hide empty properties in the `data` widget. */\n\t\thideEmpty: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Every widget definition on the surface, for a CONTAINER widget to\n\t\t * resolve the children it references by id.\n\t\t *\n\t\t * Only container types receive it (see `rendererProps`). A leaf widget\n\t\t * has no business knowing what else is on the page.\n\t\t *\n\t\t * @type {object[]}\n\t\t */\n\t\tavailableWidgets: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * Whether a card widget (stat / gauge / delta) draws the wrapper header.\n\t\t *\n\t\t * A prop, not a computed, because the rule reads the LAYOUT item's\n\t\t * `showTitle` and only the surface holds the layout. Deriving it from the\n\t\t * widget definition alone silently drops `showTitle: false`, which is the\n\t\t * one way a consumer can stop a card printing its title twice: the tile\n\t\t * already draws `content.label` itself.\n\t\t *\n\t\t * Null means \"decide from the definition\", which is what a surface with\n\t\t * no layout (a tab panel) wants.\n\t\t *\n\t\t * @type {boolean|null}\n\t\t */\n\t\tshowCardTitle: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Whether a card draws the manifest `headerLink` of its widget (on the\n\t\t * definition, or `content.headerLink` / `viewAllRoute`) in its header\n\t\t * when the renderer reports none. Off by default: a tab panel's link\n\t\t * is drawn beside the tab strip. CnTabsWidget turns it on for the\n\t\t * cards after the first in a stack, whose links had no place.\n\t\t *\n\t\t * @spec openspec/changes/stack-card-header-link/specs/stack-card-header-link/spec.md#requirement-a-stacked-card-draws-its-own-header-link\n\t\t */\n\t\tshowHeaderLink: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Whether a widget on a card keeps its overflow Actions menu when its\n\t\t * definition does not say (`showActions`). `false` (CnDetailPage\n\t\t * `showWidgetActions: false`) drops it from the record's data cards; a\n\t\t * definition with `showActions: true` keeps it, one with\n\t\t * `showActions: false` drops it whatever this says. True by default,\n\t\t * which is the menu every card had.\n\t\t *\n\t\t * @spec openspec/changes/zuiddrecht-pixel-gaps-3/specs/zuiddrecht-pixel-gaps-3/spec.md#requirement-a-detail-page-can-drop-the-widget-actions-menu\n\t\t */\n\t\tshowActions: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/**\n\t\t * The consumer's component registry, consulted before the built-in\n\t\t * catalog so a custom widget type overrides a built-in (REQ-MVR-005).\n\t\t *\n\t\t * @type {object}\n\t\t */\n\t\tcnRegistry: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\t},\n\n\temits: ['geo-saved', 'open-integration', 'select-object'],\n\n\tsetup() {\n\t\t// Every integration component this host renders goes through the\n\t\t// composable's resolvers, never through the registry entry's own\n\t\t// `tab` / `widget`. The resolvers swap a lib-owned entry for THIS\n\t\t// bundle's copy of the component (openregister#1958). The entry's\n\t\t// object belongs to whichever bundle registered it; when that is\n\t\t// OpenRegister's integration-global bundle, rendering it under the\n\t\t// app's Vue leaves `resolveComponent()` without a current instance,\n\t\t// and `<NcButton>` / `<CnDetailCard>` reach the DOM as literal\n\t\t// unknown elements. Seen on dossiq's Notes, Contacts and Files tabs.\n\t\tconst { resolveWidget, resolveBaseWidget, resolveTab, getById } = useIntegrationRegistry()\n\t\treturn {\n\t\t\tresolveRegistryWidget: resolveWidget,\n\t\t\tresolveRegistryBaseWidget: resolveBaseWidget,\n\t\t\tresolveRegistryTab: resolveTab,\n\t\t\tgetRegistryProvider: getById,\n\t\t}\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\t/**\n\t\t\t * The card header a content-only renderer reports through its\n\t\t\t * `header` event (screens-relation-pages): a link and a note,\n\t\t\t * with the list's total already filled in.\n\t\t\t */\n\t\t\trendererHeader: { link: null, note: '', subtitle: '', actions: [], pill: null, count: null, empty: null, menuActions: [] },\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * Whether the caller owns the title and card.\n\t\t *\n\t\t * @return {boolean} true in bare mode.\n\t\t */\n\t\tisBare() {\n\t\t\treturn this.chrome === 'bare'\n\t\t},\n\n\t\t/**\n\t\t * The widget's stored config blob.\n\t\t *\n\t\t * @return {object} The `content`, or an empty object.\n\t\t */\n\t\tcontent() {\n\t\t\treturn widgetContentOf(this.widget)\n\t\t},\n\n\t\t/**\n\t\t * The title to render. Undefined in bare mode so a self-chromed widget\n\t\t * does not repeat what the tab strip already says.\n\t\t *\n\t\t * @return {string|undefined} The title, or undefined.\n\t\t */\n\t\tresolvedTitle() {\n\t\t\treturn this.isBare ? undefined : widgetTitleOf(this.widget)\n\t\t},\n\n\t\t/**\n\t\t * The widgets `content.leadWidgetIds` names, drawn inside this card before\n\t\t * its own content (DqZaakDocumenten: the review summary in the Files\n\t\t * card), those whose `visibleWhen` holds against the record.\n\t\t *\n\t\t * @return {object[]}\n\t\t * @spec openspec/changes/widget-lead-widgets-in-card/specs/widget-lead-widgets/spec.md#requirement-a-card-can-lead-with-other-widgets\n\t\t */\n\t\tleadWidgets() {\n\t\t\tconst ids = this.content && Array.isArray(this.content.leadWidgetIds) ? this.content.leadWidgetIds : []\n\t\t\tif (ids.length === 0) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\tconst rows = this.cnDetailVisibilityRows ? this.cnDetailVisibilityRows.value : null\n\t\t\tconst data = this.object ? { ...this.object, '@context': rows || {} } : null\n\t\t\treturn ids\n\t\t\t\t.map((id) => (this.availableWidgets || []).find((def) => def && def.id === id))\n\t\t\t\t.filter((def) => def && (!def.visibleWhen || (data !== null && evaluateVisibleWhenLocal(def.visibleWhen, data))))\n\t\t},\n\n\t\t/** @return {boolean} Whether the reported header has anything for the title row. */\n\t\thasRendererHeaderItems() {\n\t\t\tconst h = this.rendererHeader\n\t\t\treturn !!(h.note || h.pill || (h.actions && h.actions.length > 0))\n\t\t},\n\n\t\t/**\n\t\t * The card header's link: the one the renderer reports, else, with\n\t\t * `showHeaderLink`, the one the manifest declares for the widget.\n\t\t *\n\t\t * @spec openspec/changes/stack-card-header-link/specs/stack-card-header-link/spec.md#requirement-a-stacked-card-draws-its-own-header-link\n\t\t * @return {object|null} `{ label, route?, params?, query?, href? }` or null.\n\t\t */\n\t\tcardHeaderLink() {\n\t\t\treturn this.rendererHeader.link || (this.showHeaderLink ? resolveHeaderLink(widgetHeaderLink(this.widget), { objectId: this.objectId, object: this.object }) : null)\n\t\t},\n\n\t\t/**\n\t\t * The app this widget leans on, if it declares one.\n\t\t *\n\t\t * Read from the widget definition first and its `content` second, so a\n\t\t * manifest may put it wherever the rest of that widget's config lives.\n\t\t *\n\t\t * @return {string} A Nextcloud app id, or ''.\n\t\t */\n\t\trequiredApp() {\n\t\t\t// `widget` is declared required, but CnDetailPage renders a host for\n\t\t\t// a layout item whose widget id resolves to nothing — and there is a\n\t\t\t// test that it must not throw for one. This computed runs in the\n\t\t\t// render path BEFORE the branches that tolerate a missing widget, so\n\t\t\t// it is the one that has to survive it.\n\t\t\treturn (this.widget || {}).requiredApp || this.content.requiredApp || ''\n\t\t},\n\n\t\t/**\n\t\t * Whether this widget's backing app is declared and absent.\n\t\t *\n\t\t * @return {boolean} true when the widget must render its set-up state.\n\t\t */\n\t\tmissingApp() {\n\t\t\treturn this.requiredApp !== '' && !isAppInstalled(this.requiredApp)\n\t\t},\n\n\t\t/**\n\t\t * The widget's title, independent of chrome mode.\n\t\t *\n\t\t * `resolvedTitle` is deliberately undefined in bare mode so a tabbed\n\t\t * widget does not repeat what the strip already says. The set-up state\n\t\t * still needs the name to say WHICH widget is inert.\n\t\t *\n\t\t * @return {string} The manifest title.\n\t\t */\n\t\twidgetTitle() {\n\t\t\treturn widgetTitleOf(this.widget) || ''\n\t\t},\n\n\t\t/**\n\t\t * The muted line under a card's title (`subtitle` on the widget or in\n\t\t * its content), translated by the card. Empty when neither sets one.\n\t\t *\n\t\t * @return {string} The subtitle.\n\t\t */\n\t\twidgetSubtitle() {\n\t\t\tconst subtitle = (this.widget && this.widget.subtitle) || this.content.subtitle || ''\n\t\t\tif (!Array.isArray(subtitle)) {\n\t\t\t\treturn typeof subtitle === 'string' ? subtitle : ''\n\t\t\t}\n\t\t\t// `[{ when, text }]`: the line depends on the record and the records the\n\t\t\t// page reads beside it (`@context.<name>`), as a `visibleWhen` does.\n\t\t\tconst rows = this.cnDetailVisibilityRows ? this.cnDetailVisibilityRows.value : null\n\t\t\tconst object = this.object || null\n\t\t\tconst data = object && (!this.cnDetailVisibilityRows || rows) ? { ...object, '@context': rows || {} } : null\n\t\t\treturn pickConditionalText(subtitle, data)\n\t\t},\n\n\t\t/**\n\t\t * Headline for the set-up state.\n\t\t *\n\t\t * @return {string} e.g. \"Humaniq is not installed\".\n\t\t */\n\t\tmissingAppName() {\n\t\t\treturn t('nextcloud-vue', '{app} is not installed', { app: this.requiredAppLabel })\n\t\t},\n\n\t\t/**\n\t\t * Body for the set-up state, naming what the reader is NOT seeing.\n\t\t *\n\t\t * @return {string} The description.\n\t\t */\n\t\tmissingAppDescription() {\n\t\t\treturn this.widgetTitle\n\t\t\t\t? t('nextcloud-vue', '{title} needs the {app} app. Install and enable it to see this.', {\n\t\t\t\t\t\ttitle: this.widgetTitle,\n\t\t\t\t\t\tapp: this.requiredAppLabel,\n\t\t\t\t\t})\n\t\t\t\t: t('nextcloud-vue', 'Install and enable the {app} app to see this.', {\n\t\t\t\t\t\tapp: this.requiredAppLabel,\n\t\t\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * The app id as a display name — `humaniq` reads as `Humaniq`.\n\t\t *\n\t\t * @return {string} The capitalised app id.\n\t\t */\n\t\trequiredAppLabel() {\n\t\t\treturn this.requiredApp.charAt(0).toUpperCase() + this.requiredApp.slice(1)\n\t\t},\n\n\t\t/** @return {boolean} true for `type: 'data'`. */\n\t\tisData() {\n\t\t\treturn isDataWidgetDef(this.widget)\n\t\t},\n\n\t\t/** @return {boolean} true for `type: 'related'`. */\n\t\tisRelated() {\n\t\t\treturn isRelatedWidgetDef(this.widget)\n\t\t},\n\n\t\t/** @return {boolean} true for `type: 'object-geo'`. */\n\t\tisGeo() {\n\t\t\treturn isGeoWidgetDef(this.widget)\n\t\t},\n\n\t\t/** @return {boolean} true for a registered integration leaf. */\n\t\tisIntegration() {\n\t\t\treturn isIntegrationWidgetDef(this.widget)\n\t\t},\n\n\t\t/** @return {boolean} true for object-list / table / files. */\n\t\tisContentOnly() {\n\t\t\treturn isContentOnlyWidgetDef(this.widget)\n\t\t},\n\n\t\t/**\n\t\t * Whether a chart gets the titled card: on a card surface, with a title.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\twrapsChart() {\n\t\t\treturn !this.isBare && Boolean(this.widget) && this.widget.type === 'chart' && Boolean(this.widget.title)\n\t\t},\n\n\t\t/**\n\t\t * Whether an app's own widget (from the consumer registry) gets the\n\t\t * titled card: on a card surface outside a body grid cell, when its\n\t\t * registry entry asks for it (`chrome: \"card\"`). Opt-in, because many\n\t\t * app widgets already draw their own card.\n\t\t *\n\t\t * @return {boolean}\n\t\t * @spec openspec/changes/detail-consumer-widget-card/specs/detail-page/spec.md#requirement-a-consumer-widget-on-a-card-surface-gets-the-titled-card\n\t\t */\n\t\twrapsConsumerWidget() {\n\t\t\tif (this.isBare || this.inGridCell || !this.widget || !this.widget.type || this.isContentOnly || this.isCard) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst entry = (this.cnRegistry || {})[this.widget.type]\n\t\t\tif (!entry) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn typeof entry === 'object' && entry.chrome === 'card'\n\t\t},\n\n\t\t/**\n\t\t * Whether a library widget that draws its own title row gets an\n\t\t * untitled card: on a card surface outside a body grid cell, when its\n\t\t * registry entry owns its title and asks for the card.\n\t\t *\n\t\t * @return {boolean}\n\t\t * @spec openspec/changes/retention-card-in-tab-stack/specs/detail-page/spec.md\n\t\t */\n\t\twrapsSelfTitledWidget() {\n\t\t\tif (this.isBare || this.inGridCell || !this.widget || !this.widget.type || this.isContentOnly || this.isCard || this.wrapsConsumerWidget) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst entry = getWidgetTypeEntry(this.widget.type)\n\t\t\treturn Boolean(entry && entry.ownsTitle && entry.chrome === 'card')\n\t\t},\n\n\t\t/**\n\t\t * Whether a `sections` widget gets one titled card: on a card surface\n\t\t * outside a body grid cell, with a title, and not in `cards` mode.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\twrapsSections() {\n\t\t\tif (this.isBare || this.inGridCell || !this.widget || this.widget.type !== 'sections' || !this.widget.title) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn !(this.widget.content && this.widget.content.cards)\n\t\t},\n\n\t\t/** @return {boolean} true when the registry entry declares `card`. */\n\t\tisCard() {\n\t\t\treturn isCardWidgetDef(this.widget)\n\t\t},\n\n\t\t/**\n\t\t * The registered renderer for a content-driven catalog type.\n\t\t *\n\t\t * @return {object|null} The component, or null.\n\t\t */\n\t\trenderer() {\n\t\t\t// A `files` widget on a detail page belongs to THIS object's folder; the\n\t\t\t// placement-folder CnFilesWidget stays the dashboard widget. A consumer\n\t\t\t// registry entry for `files` still wins.\n\t\t\tif (this.widget && this.widget.type === 'files' && !(this.cnRegistry && this.cnRegistry.files) && this.register && this.schema) {\n\t\t\t\treturn CnObjectFilesWidget\n\t\t\t}\n\t\t\t// Inside a dashboard's tabs the dashboard's resolution holds.\n\t\t\tconst onDashboard = this.surface === 'app-dashboard' || this.surface === 'user-dashboard'\n\t\t\treturn resolveRegistryRenderer(this.widget, this.cnRegistry, { typeAsWritten: onDashboard })\n\t\t},\n\n\t\t/**\n\t\t * The integration descriptor behind an `integration` widget.\n\t\t *\n\t\t * @return {object|null} The provider, or null.\n\t\t */\n\t\tintegrationProvider() {\n\t\t\tif (!this.isIntegration || typeof this.getRegistryProvider !== 'function') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn this.getRegistryProvider(this.widget.integrationId)\n\t\t},\n\n\t\t/**\n\t\t * Whether an `integration` widget names a leaf the registry does not\n\t\t * hold. Only asked when the host can look leaves up at all.\n\t\t *\n\t\t * @return {boolean}\n\t\t * @spec openspec/changes/integration-widget-mounts-leaves/specs/integration-widget-mounts-leaves/spec.md#requirement-an-absent-leaf-says-it-is-not-available\n\t\t */\n\t\tintegrationAbsent() {\n\t\t\treturn this.isIntegration && typeof this.getRegistryProvider === 'function' && !this.integrationProvider\n\t\t},\n\n\t\t/**\n\t\t * The stand-in descriptor the empty state of an absent leaf draws: the\n\t\t * widget's `appName` (else its `requiredApp`), icon and title.\n\t\t *\n\t\t * @return {{id: string, appName: string, label: string, icon: string}}\n\t\t */\n\t\tabsentIntegrationProvider() {\n\t\t\tconst widget = this.widget || {}\n\t\t\treturn {\n\t\t\t\tid: widget.integrationId || '',\n\t\t\t\tappName: widget.appName || (this.requiredApp ? this.requiredAppLabel : ''),\n\t\t\t\tlabel: this.translateLabel(widgetTitleOf(widget) || '') || widget.integrationId || '',\n\t\t\t\ticon: widget.icon || '',\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Whether the integration is a mount-mode leaf (ADR-066), rendered\n\t\t * through CnLeafMountHost rather than as a component.\n\t\t *\n\t\t * @return {boolean} true for a mount-mode leaf.\n\t\t */\n\t\tisMountIntegration() {\n\t\t\tconst provider = this.integrationProvider\n\t\t\treturn Boolean(provider)\n\t\t\t\t&& provider.renderMode === 'mount'\n\t\t\t\t&& typeof provider.mount === 'function'\n\t\t\t\t&& typeof provider.unmount === 'function'\n\t\t},\n\n\t\t/**\n\t\t * Whether a mount-mode leaf gets the library card: on a card surface,\n\t\t * grid cell included, when its descriptor asks for it (`chrome:\n\t\t * \"card\"`). Opt-in, because a leaf that draws its own card would\n\t\t * otherwise sit in two.\n\t\t *\n\t\t * @return {boolean}\n\t\t * @spec openspec/changes/integration-leaf-card/specs/integration-leaf-card/spec.md#requirement-a-mount-mode-leaf-can-take-the-library-card\n\t\t */\n\t\twrapsMountLeaf() {\n\t\t\treturn !this.isBare && this.isMountIntegration && this.integrationProvider.chrome === 'card'\n\t\t},\n\n\t\t/**\n\t\t * Whether a component-mode integration shows its full tab inside a card\n\t\t * (`content.view: \"tab\"`), as a case's Parties card lists the people by\n\t\t * role with their Link and New buttons.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\twrapsLeafTab() {\n\t\t\treturn !this.isBare\n\t\t\t\t&& this.isIntegration\n\t\t\t\t&& !this.isMountIntegration\n\t\t\t\t&& this.content.view === 'tab'\n\t\t\t\t&& Boolean(this.integrationProvider?.tab)\n\t\t\t\t&& typeof this.resolveRegistryTab === 'function'\n\t\t},\n\n\t\t/**\n\t\t * The widget's title tone (`titleTone`): `side` titles its card as a\n\t\t * side card in the board look.\n\t\t *\n\t\t * @return {string} `side`, or ''.\n\t\t * @spec openspec/changes/widget-side-title-tone/specs/widget-side-title-tone/spec.md#requirement-a-widget-can-be-titled-as-a-side-card\n\t\t */\n\t\twidgetTitleTone() {\n\t\t\treturn this.widget && this.widget.titleTone === 'side' ? 'side' : ''\n\t\t},\n\n\t\t/**\n\t\t * The leaf card's title: the manifest's, else the descriptor's label.\n\t\t *\n\t\t * @return {string} The title in the user's language.\n\t\t */\n\t\t/**\n\t\t * The widget's manifest `headerActions` as buttons: gated on the\n\t\t * record, dispatched through the page's dispatcher.\n\t\t *\n\t\t * @return {Array<object>} The buttons.\n\t\t * @spec openspec/changes/widget-header-actions/specs/widget-header-actions/spec.md#requirement-a-widget-declares-buttons-for-its-card-header\n\t\t */\n\t\tdeclaredHeaderActions() {\n\t\t\treturn resolveWidgetHeaderActions(this.widget, this.actionContext)\n\t\t},\n\n\t\t/**\n\t\t * The widget's manifest `bodyActions` as buttons, for a leaf that draws\n\t\t * them in its own button row (\"Partij toevoegen\" beside the contacts\n\t\t * tab's Link and New buttons).\n\t\t *\n\t\t * @return {Array<object>} The buttons.\n\t\t */\n\t\tdeclaredBodyActions() {\n\t\t\treturn resolveWidgetHeaderActions(this.widget, this.actionContext, 'bodyActions')\n\t\t},\n\n\t\t/**\n\t\t * What a header or body action resolves and dispatches with.\n\t\t *\n\t\t * @return {object} `{ object, objectId, translate, dispatch }`.\n\t\t */\n\t\tactionContext() {\n\t\t\treturn {\n\t\t\t\tobject: this.object || {},\n\t\t\t\tobjectId: this.objectId,\n\t\t\t\ttranslate: (key) => this.translateLabel(key),\n\t\t\t\trecordEdit: this.cnRecordEdit,\n\t\t\t\tdispatch: (action) => (typeof this.cnDispatchAction === 'function'\n\t\t\t\t\t? this.cnDispatchAction(action)\n\t\t\t\t\t: dispatchAction(action, { router: this.$router || null })),\n\t\t\t}\n\t\t},\n\n\t\tleafCardTitle() {\n\t\t\t// An empty title is a card without one (a `titleWhen` entry that says so).\n\t\t\tif (this.widget && this.widget.title === '') {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\tconst title = widgetTitleOf(this.widget)\n\t\t\treturn title ? this.translateLabel(title) : (this.integrationProvider?.label || '')\n\t\t},\n\n\t\t/** @return {string} The leaf card's icon: the manifest's, else the descriptor's. */\n\t\tleafCardIcon() {\n\t\t\treturn this.widget?.icon || this.integrationProvider?.icon || ''\n\t\t},\n\n\t\t/**\n\t\t * Whether this render is using a provider's widget as its bare surface.\n\t\t *\n\t\t * @return {boolean} True when bare AND the provider opted in.\n\t\t */\n\t\tusesBareWidget() {\n\t\t\treturn !!(this.isBare && this.integrationProvider?.bareWidget && this.integrationProvider?.widget)\n\t\t},\n\n\t\t/**\n\t\t * The component for a component-mode integration leaf. Bare mode takes\n\t\t * the provider's `tab`, which is its content without a card, unless the\n\t\t * provider opted into `bareWidget`.\n\t\t *\n\t\t * Each branch resolves through the registry composable rather than\n\t\t * reading `integrationProvider.widget` / `.tab`. The provider is the\n\t\t * shared registry's entry, and its component objects belong to the\n\t\t * bundle that registered it. For a lib-owned id registered by\n\t\t * OpenRegister's bundle, that object renders under the wrong Vue: its\n\t\t * `resolveComponent()` finds no current instance, so `NcButton` and\n\t\t * `CnDetailCard` reach the DOM as literal `<ncbutton>` /\n\t\t * `<cndetailcard>` elements, and a Files tab whose whole body sits\n\t\t * inside that card looks empty. The resolvers hand back this bundle's\n\t\t * own copy for lib-owned ids and the stored object for consumer ids.\n\t\t *\n\t\t * @return {object|null} The component, or null.\n\t\t */\n\t\tintegrationComponent() {\n\t\t\tif (!this.isIntegration) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst id = this.widget.integrationId\n\t\t\t// `bareWidget` lets a provider say its WIDGET is already bare, so a\n\t\t\t// tab panel gets the widget surface instead of the sidebar one.\n\t\t\t// The default below (prefer `tab`) assumes every `widget` draws its\n\t\t\t// own card, which is not true: `notes`' widget is an adapter around\n\t\t\t// CnNotesCard, whose root carries no border, background or padding.\n\t\t\t// Preferring `tab` there swapped an inline compose textarea for the\n\t\t\t// sidebar's collapsed \"Add note\" button and dressed the panel in\n\t\t\t// sidebar CSS, which is what made the tabbed leaves look like they\n\t\t\t// had lost their styling. Opt-in rather than a blanket switch: the\n\t\t\t// other providers keep today's behaviour until each is checked.\n\t\t\tif (this.usesBareWidget && typeof this.resolveRegistryBaseWidget === 'function') {\n\t\t\t\treturn this.resolveRegistryBaseWidget(id)\n\t\t\t}\n\t\t\tif (this.isBare && this.integrationProvider?.tab && typeof this.resolveRegistryTab === 'function') {\n\t\t\t\treturn this.resolveRegistryTab(id)\n\t\t\t}\n\t\t\tif (typeof this.resolveRegistryWidget !== 'function') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn this.resolveRegistryWidget(id, this.surface)\n\t\t},\n\n\t\t/**\n\t\t * The object context every integration surface is handed.\n\t\t *\n\t\t * @return {object} `{ register, schema, objectId }`.\n\t\t */\n\t\tderivedIntegrationContext() {\n\t\t\treturn this.integrationContext || {\n\t\t\t\tregister: this.register || '',\n\t\t\t\tschema: this.schema || this.objectType || '',\n\t\t\t\tobjectId: this.objectId ? String(this.objectId) : '',\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Props for an integration widget or tab.\n\t\t *\n\t\t * The title is forwarded because `CnIntegrationCard`'s `cardTitle` falls\n\t\t * back to the raw `integrationId` without it, so a widget the manifest\n\t\t * calls \"Class space\" rendered as \"talk\". It is placed BEFORE `def.props`\n\t\t * so an explicit per-widget prop still wins.\n\t\t *\n\t\t * @return {object} The prop bag.\n\t\t */\n\t\t/**\n\t\t * The widget's own `props` with their tokens resolved: `@objectId` and\n\t\t * `@object.<field>` from the record, `@config.<key>` from the page's\n\t\t * app config, at any depth. A manifest can so point an integration at\n\t\t * another object than the page's, such as the decisions on the case a\n\t\t * ticket became (`props: { objectId: \"@object.caseReference\" }`), and\n\t\t * name that object's register and schema from the instance's\n\t\t * configuration instead of as literals\n\t\t * (`register: \"@config.caseRegister\"`).\n\t\t *\n\t\t * @return {object} The resolved prop bag, `{}` when the widget declares none.\n\t\t */\n\t\tresolvedWidgetProps() {\n\t\t\tconst declared = this.widget?.props\n\t\t\tif (!declared || typeof declared !== 'object' || Array.isArray(declared)) {\n\t\t\t\treturn {}\n\t\t\t}\n\t\t\treturn resolveDeepTokens(declared, {\n\t\t\t\tobjectId: this.objectId,\n\t\t\t\tobject: this.object,\n\t\t\t\tconfig: unwrapAppConfig(this.cnAppConfig),\n\t\t\t\tcontext: (this.cnDetailVisibilityRows && this.cnDetailVisibilityRows.value) || null,\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * Whether a prop written as a token still has no value: the record is\n\t\t * not loaded, it does not hold the field, or the app config does not\n\t\t * hold the key. Only top-level props\n\t\t * written as a token count; a literal empty string is the author's.\n\t\t *\n\t\t * @return {boolean} true while the widget must not mount.\n\t\t */\n\t\twidgetPropsPending() {\n\t\t\tconst declared = this.widget?.props\n\t\t\tif (!declared || typeof declared !== 'object' || Array.isArray(declared)) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst resolved = this.resolvedWidgetProps\n\t\t\treturn Object.keys(declared).some((key) => {\n\t\t\t\tconst written = declared[key]\n\t\t\t\tif (typeof written !== 'string' || written.charAt(0) !== '@') {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t\tconst value = resolved[key]\n\t\t\t\treturn value === undefined || value === null || value === ''\n\t\t\t\t\t|| (typeof value === 'string' && value.charAt(0) === '@')\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * The object an integration is mounted for: the page's, unless the\n\t\t * widget's `props` name another `register`, `schema` or `objectId`.\n\t\t *\n\t\t * @return {object} `{ register, schema, objectId }`.\n\t\t */\n\t\twidgetIntegrationContext() {\n\t\t\tconst context = { ...this.derivedIntegrationContext }\n\t\t\tconst own = this.resolvedWidgetProps\n\t\t\tfor (const key of ['register', 'schema', 'objectId']) {\n\t\t\t\tif (own[key] !== undefined && own[key] !== null && own[key] !== '') {\n\t\t\t\t\tcontext[key] = String(own[key])\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn context\n\t\t},\n\n\t\t/**\n\t\t * The widget's title for a leaf that names its title `titleLabel`\n\t\t * (contacts, notes, tasks, contact moments): without it the leaf\n\t\t * printed its own default. Empty when the widget has no title, so the\n\t\t * leaf keeps that default.\n\t\t *\n\t\t * @return {{titleLabel?: string}} The prop, or nothing.\n\t\t * @spec openspec/changes/leaf-card-widget-title/specs/leaf-card-widget-title/spec.md#requirement-a-leaf-card-carries-the-widgets-title\n\t\t */\n\t\tleafTitleLabel() {\n\t\t\tconst title = this.translateLabel(this.widget?.title || '')\n\t\t\treturn title ? { titleLabel: title } : {}\n\t\t},\n\n\t\tintegrationProps() {\n\t\t\treturn {\n\t\t\t\tsurface: this.surface,\n\t\t\t\t// Through the host's translate: an integration card (CnDetailCard)\n\t\t\t\t// prints its title as given.\n\t\t\t\ttitle: this.translateLabel(this.widget?.title || ''),\n\t\t\t\t...this.leafTitleLabel,\n\t\t\t\t...(this.widgetSubtitle ? { subtitle: this.translateLabel(this.widgetSubtitle) } : {}),\n\t\t\t\t// A provider opting into `bareWidget` is being rendered where the\n\t\t\t\t// tab strip already supplies the card and the title, so tell it to\n\t\t\t\t// drop its own. Without this the panel gets a titled card inside\n\t\t\t\t// the tabs card, repeating the label the open tab already shows.\n\t\t\t\t...(this.usesBareWidget ? { chromeless: true } : {}),\n\t\t\t\t...this.derivedIntegrationContext,\n\t\t\t\t...this.resolvedWidgetProps,\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Props handed to a mount-mode leaf.\n\t\t *\n\t\t * @return {object} The mount prop bag.\n\t\t */\n\t\tintegrationMountProps() {\n\t\t\treturn {\n\t\t\t\tsurface: this.surface,\n\t\t\t\ttitle: this.translateLabel(this.widget?.title || ''),\n\t\t\t\t...this.leafTitleLabel,\n\t\t\t\t...this.derivedIntegrationContext,\n\t\t\t\t// The context follows the widget's own host, so a leaf that\n\t\t\t\t// reads `integrationContext.objectId` gets the same object as\n\t\t\t\t// one that reads `objectId`.\n\t\t\t\tintegrationContext: this.widgetIntegrationContext,\n\t\t\t\t...this.resolvedWidgetProps,\n\t\t\t\t// A carded leaf reports its title row and empty state here.\n\t\t\t\t...(this.wrapsMountLeaf ? { onHeader: this.onRendererHeader } : {}),\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Props for a catalog renderer: its content plus the object context, in\n\t\t * the shape CnWidgetGrid merges on the v2 widgets[] path. `content`\n\t\t * spreads last so explicit widget config still wins.\n\t\t *\n\t\t * @return {object} The prop bag.\n\t\t */\n\t\trendererProps() {\n\t\t\tconst base = {\n\t\t\t\tcontent: this.content,\n\t\t\t\tobjectId: this.objectId,\n\t\t\t\tregister: this.register,\n\t\t\t\tschema: this.schema,\n\t\t\t\tobjectData: this.object,\n\t\t\t\tobjectType: this.objectType,\n\t\t\t\tstore: this.store,\n\t\t\t}\n\t\t\t// A container widget renders other widgets, so it needs what a\n\t\t\t// surface knows and a leaf does not: the sibling definitions to\n\t\t\t// resolve its children against, and the context those children will\n\t\t\t// need. Handing this to every widget instead would put objects on\n\t\t\t// the DOM as stringified attributes for the ones that ignore them.\n\t\t\tif (this.isContainer) {\n\t\t\t\tObject.assign(base, {\n\t\t\t\t\tavailableWidgets: this.availableWidgets,\n\t\t\t\t\tschemaObject: this.schemaObject,\n\t\t\t\t\tintegrationContext: this.integrationContext,\n\t\t\t\t\tcnRegistry: this.cnRegistry,\n\t\t\t\t\tsurface: this.surface,\n\t\t\t\t})\n\t\t\t}\n\t\t\t// The board look: a self-titled card (an audit trail, a calendar)\n\t\t\t// takes the manifest title, so the side column's History card says\n\t\t\t// what the board says instead of the widget's own default.\n\t\t\tconst title = this.cardTitle\n\t\t\tif (title) {\n\t\t\t\tbase.title = title\n\t\t\t}\n\t\t\treturn { ...base, ...this.declaredContent, ...this.consumerWidgetProps }\n\t\t},\n\n\t\t/**\n\t\t * Whether the widget is the app's own (a consumer registry entry).\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tisConsumerWidget() {\n\t\t\tconst type = this.widget && this.widget.type\n\t\t\treturn Boolean(type && this.cnRegistry && this.cnRegistry[type])\n\t\t},\n\n\t\t/**\n\t\t * The props an app widget takes from its manifest `props`: literals,\n\t\t * and `@objectId` / `@object.<field>` / `@config.<key>` /\n\t\t * `@content.<path>` tokens. A token that does not resolve is left out,\n\t\t * so the component's own default holds; only declared props pass.\n\t\t *\n\t\t * @spec openspec/changes/consumer-widget-props/specs/detail-page/spec.md#requirement-an-app-widget-takes-its-props-from-the-manifest\n\t\t * @return {object} The prop bag, `{}` for any other widget.\n\t\t */\n\t\tconsumerWidgetProps() {\n\t\t\tconst declared = this.widget?.props\n\t\t\tif (!this.isConsumerWidget || !declared || typeof declared !== 'object' || Array.isArray(declared)) {\n\t\t\t\treturn {}\n\t\t\t}\n\t\t\tconst bag = {}\n\t\t\tfor (const [key, written] of Object.entries(declared)) {\n\t\t\t\tconst value = typeof written === 'string' && written.startsWith('@content.')\n\t\t\t\t\t? getByPath(this.content || {}, written.slice('@content.'.length))\n\t\t\t\t\t: this.resolvedWidgetProps[key]\n\t\t\t\tif (value === undefined || value === null || (typeof value === 'string' && value.charAt(0) === '@')) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tbag[key] = value\n\t\t\t}\n\t\t\treturn pickDeclaredProps(this.renderer, bag, this.widget.type)\n\t\t},\n\n\t\t/**\n\t\t * Whether an app widget that asks for `@objectId` has none yet.\n\t\t *\n\t\t * @spec openspec/changes/consumer-widget-props/specs/detail-page/spec.md#requirement-an-app-widget-takes-its-props-from-the-manifest\n\t\t * @return {boolean} true while the widget must not mount.\n\t\t */\n\t\tconsumerWidgetWaiting() {\n\t\t\tconst declared = this.widget?.props\n\t\t\tif (!this.isConsumerWidget || !declared || typeof declared !== 'object') {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst asksForId = Object.values(declared).includes('@objectId')\n\t\t\treturn asksForId && (this.objectId === null || this.objectId === undefined || this.objectId === '')\n\t\t},\n\n\t\t/**\n\t\t * The content keys the renderer declares as props. An undeclared key\n\t\t * would fall through as an attribute onto the renderer's root and could\n\t\t * override a value the widget computes there; the whole content still\n\t\t * arrives as `content`.\n\t\t *\n\t\t * `content.chartKind` is read as the chart's `type`, as the dashboard\n\t\t * dispatcher reads it, so a chart placed on a detail page draws.\n\t\t *\n\t\t * @return {object} The declared content keys.\n\t\t * @spec openspec/changes/declared-props-detail-index-sidebar/specs/widget-hosts/spec.md#requirement-a-widget-host-passes-only-the-keys-a-widget-declares\n\t\t * @spec openspec/changes/detail-chart-kind/specs/widget-hosts/spec.md#requirement-a-detail-chart-reads-chartkind-as-its-type\n\t\t */\n\t\tdeclaredContent() {\n\t\t\tlet bindings = this.content\n\t\t\tif (bindings && typeof bindings === 'object' && bindings.chartKind !== undefined && bindings.type === undefined) {\n\t\t\t\tconst { chartKind, ...rest } = bindings\n\t\t\t\tbindings = { ...rest, type: chartKind }\n\t\t\t}\n\t\t\treturn pickDeclaredProps(this.renderer, bindings, this.widget?.type || '')\n\t\t},\n\n\t\t/**\n\t\t * The title a self-titled renderer gets under the board look: the\n\t\t * manifest title through the host's translate, else History for the\n\t\t * activity widget. Empty outside the board look, in a tab panel, and\n\t\t * when `content.title` already names the card.\n\t\t *\n\t\t * @return {string} The title, or ''.\n\t\t * @spec openspec/changes/screens-detail-labels-parity/specs/detail-labels-board-look/spec.md#requirement-a-side-card-takes-its-manifest-title\n\t\t */\n\t\tcardTitle() {\n\t\t\tif (normalizeLook(this.cnLook) !== 'board' || this.isBare || !this.widget || this.isContentOnly || this.isCard) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\t// Only a renderer that takes a `title` prop: on any other the value\n\t\t\t// would land on its root element as a tooltip.\n\t\t\tconst declared = this.renderer && this.renderer.props\n\t\t\tconst takesTitle = Array.isArray(declared) ? declared.includes('title') : Boolean(declared && Object.hasOwn(declared, 'title'))\n\t\t\tif (!takesTitle) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\tif (typeof this.content.title === 'string' && this.content.title !== '') {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\tconst title = widgetTitleOf(this.widget)\n\t\t\tif (title) {\n\t\t\t\treturn this.translateLabel(title)\n\t\t\t}\n\t\t\treturn isActivityWidget(this.widget) ? t('nextcloud-vue', 'History') : ''\n\t\t},\n\n\t\t/**\n\t\t * Whether the type declares itself a container (registry `container`).\n\t\t *\n\t\t * @return {boolean} true for a widget that renders other widgets.\n\t\t */\n\t\tisContainer() {\n\t\t\tif (!this.widget?.type) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst entry = getWidgetTypeEntry(this.widget.type)\n\t\t\treturn Boolean(entry && entry.container === true)\n\t\t},\n\n\t\t/**\n\t\t * Whether a catalog list widget offers the Add action (ADR-062:\n\t\t * collections carry their create affordance in the card's Actions menu).\n\t\t * Files widgets carry their own upload toolbar, so they are excluded.\n\t\t *\n\t\t * @return {boolean} true when Add should render.\n\t\t */\n\t\tcatalogAddEnabled() {\n\t\t\tif (!['object-list', 'table'].includes(this.widget?.type)) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tif (this.content.allowCreate === false) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t// A declared `createAction` shows only where its visibleWhen holds,\n\t\t\t// the same answer the list gives for its own Add buttons.\n\t\t\treturn createActionState(this.content, this.object).visible\n\t\t},\n\n\t\t/**\n\t\t * Whether the catalog Add is a button in the card's title row: the board\n\t\t * look draws it there, right-aligned, instead of in the Actions menu and\n\t\t * the list's footer bar.\n\t\t *\n\t\t * @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\n\t\t * @return {boolean} true when the header button renders.\n\t\t */\n\t\tcatalogAddInHeader() {\n\t\t\treturn this.catalogAddEnabled && !this.isBare && normalizeLook(this.cnLook) === 'board'\n\t\t},\n\n\t\t/**\n\t\t * Whether the catalog Add is an item of the card's Actions menu, as\n\t\t * ADR-062 places it in the Nextcloud look.\n\t\t *\n\t\t * @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\n\t\t * @return {boolean} true when the menu item renders.\n\t\t */\n\t\tcatalogAddInMenu() {\n\t\t\treturn this.catalogAddEnabled && !this.catalogAddInHeader\n\t\t},\n\n\t\t/**\n\t\t * Whether the widget's overflow Actions menu renders: the definition's\n\t\t * own `showActions` when it is a boolean, else the surface's\n\t\t * `showActions`.\n\t\t *\n\t\t * @spec openspec/changes/zuiddrecht-pixel-gaps-3/specs/zuiddrecht-pixel-gaps-3/spec.md#requirement-a-detail-page-can-drop-the-widget-actions-menu\n\t\t * @return {boolean} true when the menu renders.\n\t\t */\n\t\tactionsShown() {\n\t\t\tconst own = this.widget && this.widget.showActions\n\t\t\treturn typeof own === 'boolean' ? own : this.showActions\n\t\t},\n\n\t\t/**\n\t\t * The card header rule, with the surface's layout-driven answer winning\n\t\t * when it supplied one.\n\t\t *\n\t\t * @return {boolean} true when the wrapper header renders.\n\t\t */\n\t\teffectiveShowCardTitle() {\n\t\t\tif (this.showCardTitle !== null) {\n\t\t\t\treturn this.showCardTitle\n\t\t\t}\n\t\t\tif (this.widget?.title === '' && this.content.title === undefined) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn this.widget?.title !== undefined || this.content.title !== undefined\n\t\t},\n\n\t\t/**\n\t\t * Label for the catalog Add action: the createAction's label, else the\n\t\t * list's own `addLabel`, as the list's Add reads it.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\taddLabel() {\n\t\t\tconst action = listCreateAction(this.content)\n\t\t\tconst label = action && typeof action.label === 'string' && action.label !== '' ? action.label : (typeof this.content.addLabel === 'string' ? this.content.addLabel : '')\n\t\t\tif (label !== '') {\n\t\t\t\treturn typeof this.cnTranslate === 'function' ? this.cnTranslate(label) : label\n\t\t\t}\n\t\t\treturn t('nextcloud-vue', 'Add')\n\t\t},\n\n\t\t/**\n\t\t * The items THIS HOST offers to the surface, as opposed to the ones the\n\t\t * widget inside it publishes.\n\t\t *\n\t\t * There is one: the catalog Add. It is drawn in the host's own card\n\t\t * header, and that header only exists off a panel, so a Documents or\n\t\t * Files tab simply had no way to add anything. The data widget's\n\t\t * Metadata went the same way until it was published, and this is the\n\t\t * same defect one widget type along.\n\t\t *\n\t\t * Empty off a panel, where the header draws the item itself and\n\t\t * publishing would put it in two menus at once.\n\t\t *\n\t\t * @return {object[]} PanelAction descriptors.\n\t\t */\n\t\townPanelActions() {\n\t\t\tif (!this.isBare || !this.catalogAddEnabled) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\treturn [{\n\t\t\t\tkey: 'catalog-add',\n\t\t\t\tlabel: this.addLabel,\n\t\t\t\ticon: 'Plus',\n\t\t\t\trun: () => this.invokeCatalogAdd(),\n\t\t\t}]\n\t\t},\n\t},\n\n\twatch: {\n\t\townPanelActions: {\n\t\t\thandler() {\n\t\t\t\tthis.publishOwnPanelActions()\n\t\t\t},\n\t\t},\n\t},\n\n\tmounted() {\n\t\tthis.publishOwnPanelActions()\n\t},\n\n\tbeforeUnmount() {\n\t\t// A closed tab's panel can be torn down while the strip lives on, and an\n\t\t// item whose host is gone would call into nothing.\n\t\tif (this.panelActionSink) {\n\t\t\tthis.panelActionSink.clear(this.widget?.id, 'host')\n\t\t}\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Take the header a content-only renderer, an app widget in the\n\t\t * titled card, or a carded mount-mode leaf (`onHeader`) reports.\n\t\t *\n\t\t * @param {{link?: object|null, note?: string, action?: {label: string, icon?: string, run: () => unknown}|null, actions?: Array<{label: string, icon?: string, run: () => unknown}>, count?: number, empty?: {name: string, description?: string}|null}} header The header parts.\n\t\t * @spec openspec/changes/screens-relation-pages/specs/relation-pages/spec.md#requirement-a-record-list-shows-the-objects-that-point-at-this-record\n\t\t * @spec openspec/changes/integration-leaf-card/specs/integration-leaf-card/spec.md#requirement-a-carded-leaf-reports-its-count-actions-and-empty-state\n\t\t */\n\t\tonRendererHeader(header) {\n\t\t\tconst link = header && header.link && typeof header.link === 'object' ? header.link : null\n\t\t\tconst note = header && typeof header.note === 'string' ? header.note : ''\n\t\t\tconst usable = (action) => action && typeof action.run === 'function' && action.label\n\t\t\t// `action` (one) and `actions` (several) both count, `action` first.\n\t\t\tconst actions = [header && header.action, ...((header && Array.isArray(header.actions)) ? header.actions : [])].filter(usable)\n\t\t\tconst pill = header && header.pill && typeof header.pill.label === 'string' && header.pill.label !== '' ? header.pill : null\n\t\t\tconst count = header && Number.isFinite(header.count) ? header.count : null\n\t\t\tconst empty = header && header.empty && typeof header.empty.name === 'string' && header.empty.name !== ''\n\t\t\t\t? { name: header.empty.name, description: typeof header.empty.description === 'string' ? header.empty.description : '' }\n\t\t\t\t: null\n\t\t\t// `subtitle`: a muted line under the card title (a task table's \"1 open, 3 done\").\n\t\t\tconst subtitle = header && typeof header.subtitle === 'string' ? header.subtitle : ''\n\t\t\t// `menuActions`: items for the card's Actions menu instead of the title row.\n\t\t\tconst menuActions = (header && Array.isArray(header.menuActions) ? header.menuActions : []).filter(usable)\n\t\t\tthis.rendererHeader = { link, note, subtitle, actions, pill, count, empty, menuActions }\n\t\t},\n\n\t\t/**\n\t\t * A manifest label through the host's translate; '' stays ''.\n\t\t *\n\t\t * @param {string} text The label as written in the manifest.\n\t\t * @return {string} The label in the user's language.\n\t\t * @spec openspec/changes/screens-detail-labels-parity/specs/detail-labels-board-look/spec.md#requirement-detail-labels-read-in-the-users-language\n\t\t */\n\t\ttranslateLabel(text) {\n\t\t\tif (typeof text !== 'string' || text === '') {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\treturn typeof this.cnTranslate === 'function' ? this.cnTranslate(text) : text\n\t\t},\n\n\t\t/**\n\t\t * Re-key a call on the channel this host provides onto the one it holds.\n\t\t * A widget publishes `set(items)`; a host nested in this one speaks the\n\t\t * surface's `set(id, items, source)`. Items are always an array and an\n\t\t * id never is, which tells the two apart.\n\t\t *\n\t\t * @param {Array} args The arguments as called.\n\t\t * @param {'set'|'clear'} kind Which channel method was called.\n\t\t * @return {Array} Arguments for the held channel.\n\t\t */\n\t\tnarrowPanelArgs(args, kind) {\n\t\t\tconst id = this.widget?.id\n\t\t\tif (kind === 'set') {\n\t\t\t\treturn Array.isArray(args[0])\n\t\t\t\t\t? [id, args[0], 'widget']\n\t\t\t\t\t: [id, args[1], args[2] || 'widget']\n\t\t\t}\n\t\t\treturn [id, args.length > 1 ? (args[1] || 'widget') : 'widget']\n\t\t},\n\n\t\t/**\n\t\t * Publish or withdraw this host's OWN items on the surface.\n\t\t *\n\t\t * Published under the `host` source so the widget inside the panel can\n\t\t * publish its own without either replacing the other.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tpublishOwnPanelActions() {\n\t\t\tif (!this.panelActionSink) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst id = this.widget?.id\n\t\t\tif (!id) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (this.ownPanelActions.length) {\n\t\t\t\tthis.panelActionSink.set(id, this.ownPanelActions, 'host')\n\t\t\t} else {\n\t\t\t\tthis.panelActionSink.clear(id, 'host')\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Re-emit the geo widget's save so the surface can reload the record.\n\t\t *\n\t\t * @param {object} geo The saved geometry.\n\t\t * @return {void}\n\t\t */\n\t\tonGeoSaved(geo) {\n\t\t\t/**\n\t\t\t * @event geo-saved Emitted when the geo widget saved a geometry.\n\t\t\t * @type {object}\n\t\t\t */\n\t\t\tthis.$emit('geo-saved', geo)\n\t\t},\n\n\t\t/**\n\t\t * Re-emit the related widget's request to open an integration.\n\t\t *\n\t\t * @param {string} integrationId The integration to open.\n\t\t * @return {void}\n\t\t */\n\t\tonOpenIntegration(integrationId) {\n\t\t\t/**\n\t\t\t * @event open-integration Emitted when the related widget asks to open an integration.\n\t\t\t * @type {string}\n\t\t\t */\n\t\t\tthis.$emit('open-integration', integrationId)\n\t\t},\n\n\t\t/**\n\t\t * Pass a related-object click up; the page decides where it opens. Heard\n\t\t * from the Related widget itself and from a registry widget that nests a\n\t\t * host of its own (a Tabs widget with a Related tab).\n\t\t *\n\t\t * @param {object} raw The clicked object as the related widget holds it.\n\t\t */\n\t\tonSelectObject(raw) {\n\t\t\t/**\n\t\t\t * @event select-object A related object was clicked in the related widget. Payload is the raw object; its `@self` names the register and schema.\n\t\t\t * @type {object}\n\t\t\t */\n\t\t\tthis.$emit('select-object', raw)\n\t\t},\n\n\t\t/**\n\t\t * Delegate to the rendered list widget's own create affordance, so the\n\t\t * card's Add action and the widget's footer button open the same form.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tinvokeCatalogAdd() {\n\t\t\tconst child = this.$refs.renderer\n\t\t\tconst target = Array.isArray(child) ? child[0] : child\n\t\t\tif (target && typeof target.openCreate === 'function') {\n\t\t\t\ttarget.openCreate()\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n/* A leaf card in a narrow cell keeps its title and count: the title row\n wraps and the actions move under it instead of squeezing the title out. */\n.cn-detail-page__leaf-card :deep(.cn-widget-wrapper__header) {\n\tflex-wrap: wrap;\n}\n\n.cn-detail-page__leaf-card :deep(.cn-widget-wrapper__header-left) {\n\tflex: 1 0 auto;\n}\n\n/* The count beside a card title: the grey 20px badge of the tab strip. */\n.cn-detail-page__catalog-count {\n\tbackground-color: var(--color-border);\n\tborder-radius: 10px;\n\tbox-sizing: border-box;\n\tcolor: var(--color-main-text);\n\tdisplay: inline-block;\n\tfont-size: 12px;\n\tfont-weight: 600;\n\tline-height: 20px;\n\tmin-width: 20px;\n\tpadding: 0 6px;\n\ttext-align: center;\n}\n\n.cn-detail-page__catalog-note {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 14px;\n\twhite-space: nowrap;\n}\n\n.cn-detail-widget-host,\n.cn-detail-widget-host > * {\n\theight: 100%;\n}\n\n/* A bare host is a tab panel's body: it fills the panel and lets the panel\n scroll, rather than growing a second scroll region of its own. */\n.cn-detail-widget-host--bare {\n\tmin-height: 0;\n}\n</style>\n"],"names":["CnDetailWidgetHeaderItems","CnIcon","CnIntegrationWidgetEmpty","CnLeafMountHost","CnObjectDataWidget","CnObjectGeoWidget","CnRelatedObjectsWidget","CnWidgetEmptyState","CnWidgetWrapper","CnEmptyContent","t","CnObjectFilesWidget"],"mappings":"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"}