MediaCard pasa a construir su propio arte (src/trackIds vía Artwork size="fill", o un snippet art a medida) y su botón de reproducir (onPlay, con scrim y PlayButton glass en hover) en vez de depender de que cada wrapper le pase un snippet. Sustituye a AlbumCard, PlaylistCard y MixTile, que se borran junto con MediaGrid.svelte (sus grids pasan a los @utility grid-cards/grid-cards-lg/grid-tiles/ grid-wide de P1). format.ts gana albumMeta() y playlistMeta() (antes cálculos ad-hoc dentro de cada tarjeta). El tile de género en Explorar pasa de un style= con el gradiente inline a la receta @utility genre-tile + --tile-hue. De paso, corrige la pluralización "seguidor/es" del perfil de usuario que quedó suelta. Delta documentado: el hover-zoom del arte y el scrim+PlayButton (antes exclusivos de MixTile) pasan a ser comportamiento de MediaCard condicionado a la prop onPlay — se aplicarían a cualquier tarjeta futura que la use, por consistencia. Verificado con npm run check/build; sin QA visual autenticada (Docker no disponible en esta sesión). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
42 lines
1.4 KiB
TypeScript
42 lines
1.4 KiB
TypeScript
export function fmtTime(seconds: number): string {
|
|
const total = Math.max(0, Math.floor(seconds || 0));
|
|
const minutes = Math.floor(total / 60);
|
|
const rest = total % 60;
|
|
return `${minutes}:${rest < 10 ? '0' : ''}${rest}`;
|
|
}
|
|
|
|
export function fmtDurationLong(seconds: number): string {
|
|
const total = Math.max(0, Math.floor(seconds || 0));
|
|
const hours = Math.floor(total / 3600);
|
|
const minutes = Math.floor((total % 3600) / 60);
|
|
return hours > 0 ? `${hours} H ${minutes} Min` : `${minutes} Min`;
|
|
}
|
|
|
|
const dateFormatter = new Intl.DateTimeFormat('es', { dateStyle: 'medium' });
|
|
|
|
export function fmtDate(value: string | number | Date): string {
|
|
return dateFormatter.format(new Date(value));
|
|
}
|
|
|
|
export function plural(n: number, one: string, many: string): string {
|
|
return `${n} ${n === 1 ? one : many}`;
|
|
}
|
|
|
|
export function fmtPlays(count: number | string | undefined): string {
|
|
const value = Math.max(0, Math.floor(Number(count ?? 0)));
|
|
return plural(value, 'reproducción', 'reproducciones');
|
|
}
|
|
|
|
export function albumMeta(releaseYear?: number, trackCount?: number): string {
|
|
return [
|
|
releaseYear ? String(releaseYear) : undefined,
|
|
trackCount === undefined ? undefined : plural(trackCount, 'canción', 'canciones')
|
|
]
|
|
.filter((part): part is string => !!part)
|
|
.join(' · ');
|
|
}
|
|
|
|
export function playlistMeta(trackCount: number): string {
|
|
return plural(trackCount, 'canción', 'canciones');
|
|
}
|