feat(portals): add "View in portal" action to inline collection details

Details opened from the dashboard, global favorites/recent, or a portal's
own favorites/recent tabs render full-width without the category sidebar,
so there was no way back to the title's place in its portal.

A shared `app-view-in-portal-action` renders a separate-row action below
the main hero buttons. It is gated on the new `VIEW_IN_PORTAL_HANDOFF`
token, provided only by the two collection-detail wrappers, so
router-mounted portal details never show it without any URL sniffing.

Targets come from `getUnifiedCollectionDetailNavigation()`, which unlike
`getUnifiedCollectionNavigation` never degrades to a category- or
section-only route: an Xtream item without a resolvable category and
positive id keeps the action hidden rather than promising a jump to the
title and landing in a list. Unlike the download handoff it does not pass
`detailPresentation: 'provider-only'` — the item exists in the provider
catalog, so the full detail is wanted. Stalker carries `stalkerReturnTo`
so back returns to the originating collection.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
4grayandClaude Fable 5 committed 2026-08-12 07:58:28 +02:00
1 parent 4bcd4bd390
commit db1ec7cf5e
40 files changed
+716 -7

No files matched your search

@@ -39,6 +39,21 @@ Related:
the one-shot `detailPresentation: 'provider-only'` navigation state. The
destination keeps provider playback and whatever catalog the normal provider
host can resolve, but hides Offline/local/download presentation.
- Inline collection details (global favorites/recent — which also receive the
dashboard hero and Continue Watching handoffs — plus a portal's own
favorites/recent tabs) expose the same bridge as a separate-row hero action.
The shared `app-view-in-portal-action` (`libs/ui/components`) renders only
when a host provides `VIEW_IN_PORTAL_HANDOFF`; the two collection-detail
wrappers (`xtream-collection-detail.component.ts`,
`stalker-collection-detail.component.ts`) are the only providers, so
router-mounted category details never show the button. Targets come from
`getUnifiedCollectionDetailNavigation()` (`libs/portal/shared/util`), which
never degrades to a category- or section-only route: an Xtream item without a
resolvable category and positive item id keeps the button hidden. Unlike the
download handoff it does NOT pass `detailPresentation: 'provider-only'` — the
item exists in the provider catalog and the full normal detail is desired.
The Stalker handoff carries `stalkerReturnTo` so the portal detail's back
affordance returns to the originating collection.
- Do not force both portals into the same browse/detail behavior unless the full
portal detail architecture is being changed.