chore: update Angular cache and TypeScript build info
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user