chore: update Angular cache and TypeScript build info

This commit is contained in:
2025-09-23 22:45:57 -04:00
parent 9a3983a253
commit fe35340948
15 changed files with 234 additions and 77 deletions
@@ -0,0 +1,80 @@
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
import { NgClass, NgIf } from '@angular/common';
export type ProviderKey = 'youtube' | 'dailymotion' | 'twitch' | 'peertube' | 'rumble' | 'odysee';
type ProviderPreset = { label: string; classes: string };
const PROVIDER_PRESETS: Record<ProviderKey, ProviderPreset> = {
youtube: {
label: 'YouTube',
classes: 'bg-gradient-to-r from-red-600/90 to-red-500/90 text-red-50 border border-red-400/60'
},
dailymotion: {
label: 'Dailymotion',
classes: 'bg-gradient-to-r from-sky-600/90 to-sky-500/90 text-sky-50 border border-sky-400/60'
},
twitch: {
label: 'Twitch',
classes: 'bg-gradient-to-r from-violet-600/90 to-purple-500/90 text-violet-50 border border-purple-400/60'
},
peertube: {
label: 'PeerTube',
classes: 'bg-gradient-to-r from-amber-500/90 to-yellow-400/90 text-amber-50 border border-amber-300/60'
},
rumble: {
label: 'Rumble',
classes: 'bg-gradient-to-r from-emerald-600/90 to-green-500/90 text-emerald-50 border border-emerald-400/60'
},
odysee: {
label: 'Odysee',
classes: 'bg-gradient-to-r from-pink-500/90 to-fuchsia-500/90 text-pink-50 border border-pink-300/60'
}
};
@Component({
selector: 'app-provider-badge',
standalone: true,
imports: [NgIf, NgClass],
template: `
<span *ngIf="badgeLabel"
class="inline-flex items-center gap-1 rounded-full px-2.5 py-1 text-xs font-semibold shadow-sm backdrop-blur-sm"
[ngClass]="badgeClasses"
[attr.aria-label]="badgeLabel">
<svg class="h-3.5 w-3.5" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
<path d="M4 4a2 2 0 012-2h8a2 2 0 012 2v14h-3v-4H7v4H4V4zm5 12h2v2H9v-2z" />
</svg>
<span>{{ badgeLabel }}</span>
</span>
`,
changeDetection: ChangeDetectionStrategy.OnPush
})
export class ProviderBadgeComponent {
@Input() provider: string | null | undefined;
@Input() label: string | null | undefined;
private normalizeProvider(): ProviderKey | null {
if (!this.provider) return null;
const key = this.provider.toLowerCase() as ProviderKey;
return (key in PROVIDER_PRESETS) ? key : null;
}
get badgeLabel(): string | null {
const presetKey = this.normalizeProvider();
if (presetKey) {
return PROVIDER_PRESETS[presetKey].label;
}
if (this.label && this.label.trim()) {
return this.label.trim();
}
return null;
}
get badgeClasses(): string {
const presetKey = this.normalizeProvider();
if (presetKey) {
return PROVIDER_PRESETS[presetKey].classes;
}
return 'bg-slate-800/80 text-slate-100 border border-slate-700';
}
}
@@ -1,6 +1,9 @@
<a [routerLink]="['/watch', video.id]" [queryParams]="buildQueryParams(video)" [state]="{ video }" class="group flex flex-col gap-2">
<div class="relative aspect-video w-full overflow-hidden rounded-lg bg-zinc-800">
<img [src]="video.thumbnailUrl" [alt]="video.title" class="h-full w-full object-cover transition-transform group-hover:scale-105" />
<div class="absolute top-1 right-1">
<app-provider-badge [provider]="video.provider"></app-provider-badge>
</div>
<span *ngIf="video.durationSec !== undefined" class="absolute bottom-1 right-1 rounded bg-black/80 px-1.5 py-0.5 text-xs text-white">
{{ video.durationSec | duration }}
</span>
@@ -3,13 +3,14 @@ import { VideoItem } from '../../models/video-item.model';
import { CommonModule } from '@angular/common';
import { RouterLink } from '@angular/router';
import { DurationPipe } from '../../pipes/duration.pipe';
import { ProviderBadgeComponent } from '../provider-badge/provider-badge.component';
@Component({
selector: 'app-video-card',
templateUrl: './video-card.component.html',
styleUrls: ['./video-card.component.scss'],
standalone: true,
imports: [CommonModule, RouterLink, DurationPipe],
imports: [CommonModule, RouterLink, DurationPipe, ProviderBadgeComponent],
})
export class VideoCardComponent {
@Input() video!: VideoItem;