Files
iptvnator/libs/ui/styles/_portal-layout.scss
T
4grayandClaude Fable 5 1c710d69ef chore(cleanup): delete nine dead components, orphaned i18n keys and unused deps (#1116)
* chore(cleanup): delete nine dead components, orphaned i18n keys and unused deps

Removes verified-dead components (0 class/selector references outside
their own files): EpgListComponent (+ epg-list-item), EpgViewComponent,
LiveEpgPanelComponent, StalkerCollectionChannelsListComponent,
NavigationComponent, FilterSortMenuComponent, video-player
ToolbarComponent, PortalCollectionShellComponent and
LoadingOverlayComponent, together with their barrel exports.

Alive code extracted from the deleted trees:
- LiveEpgPanelSummary -> libs/ui/shared-portals/src/lib/live-epg-panel-summary.ts
- EpgProgramActivationEvent -> libs/ui/epg/src/lib/epg-program-activation-event.ts
- epg-list.utils.ts trimmed to the three timeline-used helpers and moved
  to libs/ui/epg/src/lib/epg-program.utils.ts
- epg-item-description/ moved up out of the deleted epg-list/ folder

Also removes 18 i18n keys now unused (from all 18 locales), dead CSS
selectors targeting the deleted elements, and unused dependencies:
lodash (+ @types/lodash), semver, @ngrx/component-store and
@videojs/http-streaming (videojs-quality-selector-hls declares no peer
dependency on it; video.js 8 bundles VHS).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* chore(coverage): move shared-portals to Tier C, fix stale doc references

The Tier A gate failed in CI because deleting the dead epg-view and
live-epg-panel components removed the only specs in libs/ui/shared-portals.
The lib now contains a single type-only interface (LiveEpgPanelSummary),
so there is no runtime code to unit test; reclassify it to Tier C with a
documented reason, matching the gate's own guidance.

Also update remaining doc references to the deleted components in
docs/architecture/stalker-epg.md, iptvnator-ui-guidelines.md and
CLAUDE.md.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 11:09:50 +02:00

180 lines
5.4 KiB
SCSS

// ─── Shared mixin for live-stream portal layouts ──────────────────────────────
// Used by: xtream live-stream-layout and stalker live-stream-layout.
//
// Include this mixin in a component's SCSS to get the shared flex host+sidebar
// skeleton, then add only the component-specific rules underneath.
//
// Usage (after adding libs/ui/styles to stylePreprocessorOptions.includePaths):
// @use 'portal-layout' as portal;
// @include portal.live-layout;
@mixin live-layout {
:host {
display: flex;
flex-direction: row;
overflow: hidden;
height: 100%;
width: 100%;
}
// ─── Sidebar ─────────────────────────────────────────────────────────────
.sidebar {
// Width controlled by the resizable directive at runtime
width: 400px;
min-width: 250px;
max-width: 600px;
border-right: 1px solid var(--app-separator);
display: flex;
flex-direction: column;
flex-shrink: 0;
overflow: hidden;
position: relative;
container-type: inline-size;
transition:
width 0.18s ease,
min-width 0.18s ease,
border-color 0.18s ease;
&.sidebar-collapsed {
// Beats the inline width set by the resizable directive while
// preserving it so uncollapsing snaps back to the previous size.
width: 0 !important;
min-width: 0 !important;
border-right-color: transparent;
}
&.sidebar-collapsed .resize-handle {
display: none;
}
app-category-view {
flex: 1;
overflow-y: auto;
overflow-x: hidden;
margin-right: 2px;
}
}
// ─── Main content column ─────────────────────────────────────────────────
.content-container {
flex: 1;
display: flex;
flex-direction: column;
overflow: hidden;
min-height: 0;
position: relative;
}
// ─── Floating restore handle (visible when sidebar is collapsed) ─────────
// Anchored top-left of .content-container so it sits in roughly the same
// spot as the hide toggle that lived at the sidebar header's top-right.
.sidebar-restore {
position: absolute;
top: 6px;
left: 6px;
// Player internals, including diagnostic overlays, may use z-index 5
// inside the content area. Keep the restore affordance above them for
// both paint order and hit testing.
z-index: 6;
background: rgba(128, 128, 128, 0.18);
color: var(--mat-sys-on-surface, rgba(255, 255, 255, 0.75));
box-shadow: none;
opacity: 0.7;
transition:
opacity 0.15s ease,
background 0.15s ease;
.mat-mdc-button-persistent-ripple,
.mat-mdc-button-touch-target {
display: none;
}
mat-icon {
font-size: 20px;
width: 20px;
height: 20px;
line-height: 20px;
}
&:hover,
&:focus-visible {
opacity: 1;
background: rgba(128, 128, 128, 0.32);
}
}
.video-player {
flex: 1 1 0;
min-height: 0;
overflow: hidden;
display: flex;
> app-web-player-view {
flex: 1;
min-height: 0;
}
}
.epg {
flex: 1 1 0;
min-height: 0;
overflow: hidden;
display: flex;
flex-direction: column;
transition:
flex-basis 0.18s ease,
min-height 0.18s ease;
// Inline (player visible): the guide is a compact panel below the
// player, not half the screen. The responsive clamp keeps the player
// dominant on tall screens and shrinks the panel on short ones.
// External player: no .epg--inline → keeps flex:1 above and fills.
&.epg--inline {
flex: 0 0 var(--epg-inline-height, clamp(180px, 36vh, 264px));
}
// Vertical list view (epgViewMode = 'list'): rows need more height to
// be useful — raise the inline clamp only. Sets just the variable, so
// the later `.epg-collapsed` flex rule still wins when collapsed.
&.epg--list {
--epg-inline-height: clamp(280px, 46vh, 430px);
}
&.epg-collapsed {
flex: 0 0 56px;
min-height: 56px;
}
> app-epg-timeline,
> app-epg-list-view {
flex: 1;
min-height: 0;
}
}
.epg-content {
height: 100%;
min-height: 0;
overflow: hidden;
display: flex;
flex-direction: column;
> app-epg-timeline,
> app-epg-list-view {
flex: 1;
min-height: 0;
}
}
// ─── Fix artplayer sizing when nested inside .video-player ───────────────
::ng-deep {
.video-player
> app-web-player-view
> app-art-player
> .artplayer-container {
height: 100% !important;
width: 100% !important;
}
}
}