perf(ui): enable OnPush across hot list-rendering components

Audit found 10 list-rendering components (each >150 lines, all using
signal-based state) on default change detection. Default CD re-checks
every binding on every parent CD cycle (mouse moves, EPG progress
ticks, etc.); under OnPush these only re-check when their own signals
change or when explicitly markedForCheck.

All 10 use signals exclusively for state (no manual subscribe-and-mutate
patterns), so the conversion is straightforward and safe.

Components:
- recent-playlists (740L) — homepage playlist list with drag-drop
- vod-details-route (552L) — Xtream VOD detail page
- playlist-switcher (509L) — workspace shell playlist switcher
- season-container (444L) — Stalker/Xtream series episodes (DoCheck preserved)
- stalker-search (362L) — Stalker search results
- search-results (350L) — Xtream search results
- category-management-dialog (199L) — manage Xtream categories
- recently-added (162L) — Xtream recently-added rail
- category-content-view (Catalog) — category browse page
- grid-list (shared) — generic grid renderer used across portals

Tests: 124 passed across all touched lib projects.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Entire-Checkpoint: 2e1a36e2f0f6
This commit is contained in:
4grayandClaude Opus 4.7 committed 2026-05-01 23:24:10 +02:00
1 parent c44e4e6f83
commit 2f7406054d
10 files changed
+33 -3

No files matched your search

@@ -1,5 +1,6 @@
import { KeyValuePipe } from '@angular/common';
import {
ChangeDetectionStrategy,
Component,
DoCheck,
OnInit,
@@ -67,6 +68,7 @@ function parseDuration(duration: string | number | undefined): number {
selector: 'app-season-container',
templateUrl: './season-container.component.html',
styleUrls: ['./season-container.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [
KeyValuePipe,
MatButtonModule,