From 6066278fe6b73ffe36c7a358db90f84c89d39c41 Mon Sep 17 00:00:00 2001 From: afkarxyz Date: Thu, 2 Apr 2026 08:46:34 +0700 Subject: [PATCH] .icon --- frontend/src/assets/icons/amazon-music.png | Bin 0 -> 1411 bytes frontend/src/assets/icons/qobuz.png | Bin 0 -> 2795 bytes frontend/src/assets/icons/tidal.png | Bin 0 -> 345 bytes frontend/src/components/PlatformIcons.tsx | 103 +++++++++++++++++---- frontend/src/components/SettingsPage.tsx | 25 +---- frontend/src/components/TrackInfo.tsx | 8 +- frontend/src/components/TrackList.tsx | 8 +- 7 files changed, 98 insertions(+), 46 deletions(-) create mode 100644 frontend/src/assets/icons/amazon-music.png create mode 100644 frontend/src/assets/icons/qobuz.png create mode 100644 frontend/src/assets/icons/tidal.png diff --git a/frontend/src/assets/icons/amazon-music.png b/frontend/src/assets/icons/amazon-music.png new file mode 100644 index 0000000000000000000000000000000000000000..92d42cfd1ed6948fe4c1a681e70a4489cab5ada0 GIT binary patch literal 1411 zcmV-}1$_F6P)C0000FP)t-sKIZNz z)!sDS<^co+ABT*0fL&w&00l2eL_t(|ob6cclG`u{1futU<|ei!?Jmg9U1$2IA~}CZ zz%C1RIyKw2ZQHhO+qP}nwr$(CZQK59i}Mh6ea{8hlk4dc?2;V{AU$Ts!6$|nUuXER z${}VXCeWi{ByZTvTVE3eBam8wsE(W^ZWYMIU^1dPYDXms1p@v^#iD3+$ubBD)uI%D zf&zAu08s?@b&<|6Mp9tt$Uup*+JSyjG1MNMDK&_M4vQsjEKBQ zyh&Gy!TfnIXj5sG1wr{mMP-(XkHpUTxl^dnQsQOd67;+){KO@tsy|7+g;QcvQM^f# z#953)CbJ@)5-d3{%7st5SxT`EyIFot1qu}F5&c^WQQkgLs8f*ZSebi=O*V3{0In36 z63s&d#90g{Wj!6GAR;7G7j?>v*2`O4Q zC+8;=mXz%CY`?}M_WD9tnBDeQ%760vguOC86F>%e7Jh=>;SbnSfJK4!Li?o*1O0mW zRL{V2dh``Genq~-HbB2nc?6#b6fe=%;yV)f^EclqRy~6^1QxH+<~J;k_gzcOPtaC2 zAQSL$NI#@NqrYBi0-pcVo+m#mD29jYu!BIbH!kqb;ZawCK3|Ifc*r z^Qy%vda6sELqif5lw+)zRH%qJ z$7i((rV3fExGq^*k=seH(x)N{Hw$E3w1@qIkALOA&cmP2FZma4&o$kD)?2n>-{BBC zT}@JJjO5Nqj1fkVBLh)MZz+bC=GHuS-}7uh1`|ionsE?k1j_pKbRZKxptg{j1Q2|` za?BcWX;eeuBK*8D-CVdszD%hgEh$NViZPe;8YfePC1#OuAX3&^Qu73=%tx6dgX%m& zfmzO)<85v)@Zm4yCXoaMiY$R8^cz#0WiW(e3B-{*?#Urba43+x*kUFJkQ|4-nop?y zjilF&rAiQ{4DZ2d(2t2;GfziunBAeo4_Wp32XwJz$UN>`~lasLWz;P REA0RP002ovPDHLkV1oQ+j8Fgo literal 0 HcmV?d00001 diff --git a/frontend/src/assets/icons/qobuz.png b/frontend/src/assets/icons/qobuz.png new file mode 100644 index 0000000000000000000000000000000000000000..d4a3be103fef7fff09e29c03d303ecb8db3d6059 GIT binary patch literal 2795 zcmVC0000^P)t-sM{rCF z3kv`M000002?+@a2?+rK0YO1Q5fKpp000000RR90kB^TQ78akMpR%&DZfgwvp$H&}ByW0Q&019+cPE!C()U=rrF#dDvL7C6_000U? zNkl-|SkI0GU?W(smFPu z5XxVI@VpcCL$!sviL6^w6~7IEjDD(?waaRERBWT#ec|?Fe|&oN!*-zCgJ?Vrw;z%4 z+&#Y-m$T|Yw${1B>j!qYxZxMoXX*jM=pfv_jLFB{W}W^E^$5WtxR&4Of8Oll?RMmN zIq9~+C8jU*JNlb%)dPg;TVE{ggL6LU&HGWLpDZ>YuAe!A)j!plm+Qp0Y)xH_V>^yI zF>XsXLv$nN=+_4+;Zcf_Z}Qzd?b!xI6>ZgQX}WAy_yB>8{yF9Rol*Wyi=HKt4!aDW zA+Y0b6XRK{q0eZyAv@Hm$38+}^;hv&mYHzgPdFpPTs$dn5tT}s?Rf;KUq$ZME$u$c zX=sh>Y1uaOUtJT7?cm*FT%xBjDP4~dT<{f<{-sh>yOFvE3|hS@N=!uT7*rjyuwq6y zj7FP(LjJqjhI3!ct&Y5L^!gj8Un6Me!a^9r1hygvH(CD!^Y0iu?2NC~&l*4r04M?k zp!J*D3?Zn{i939WoRu*E!}Qmn=c{5EQUG=fXwlyf&JcZ=MlgJ(nF$?m;QFoglrBUE zhJXRE7BKpUy+92-X$1tYyc?hcOdPm%el-L<{i>~&o$837BRlz!C% z0-(S-LBxQw01#jvPzeM}pN~b1fGwq8DMo<>P!Ryk0!V6yn=1Aj{;#OEu@0IN;D z$|3L+SSR2NFam7f9%U66(>2!r00JhKL2Xf~ECoHGfB>*A5D>7dH+hw@nn?y1AfS%f zA{#DN8ASypMeu09T)n%>uGDZduBInG)jU=wr?XSPGMTz2urdP=f!P z8qyATYu!75!jqv5TpU0tNGriw(C^g$4W*V)qtG#$&u&sKjSGuM#TgOWf!Tkx$ZH_-qGcn5A*;Ax znAofX0OFweG#LCaDI$H;(8gNmg-{C+>&QNMv}!BECtg@_05$(6EA!#Hsb~YD#)rY3 zLzB}`oB=}-@skMN0YE{nh;bxG?gI;~TOF=WE)oFJu7kV6Y+w{B|Kd){>A~6sayTrz+;;{D04WN`M63HQ7%d`$WB{;Oao369VMak(msJ`8&%!SEvxZLeA(99n z6Bz)10sta~9Dp+xOU~kylmhSr2HdPUeht9n;*WfQ18{{4i_K2Th13Uj27)M9r6}N) zh@G~Ag(#_-m=jL;C(HxV3kIGCma2dERj{lmJe~~02!J@91c|6y*Kn&woD7J!_(TM$ z*hi9FSk-@zM9k!=R2B$HHkfuSNP>*)7#mQVHr{l075oeS4BWmnw0kI$T5gRtnfNU8@KI86jj_zet4( zrF5b@T}_~k&3KvA~^cF1D!1Aam$y2D7!N^WAO zIO=IoYV!OmaM%WumpxNpUZ-h(C6vmA6w{L;kk zH3q`KvHuPND%kxe_wVrl3G>6l<>${4;2YB?81MwglKB1aAwUCU&T!!7UBR2}bEUyq z1XwmlTj$&e!6~NSM1UUmXSlS>sROW`$xr?>;gxue8zs2>@}7H+i;w_{PVo~Tb7yI zZpICEBhV$Qs~@6uX+Y4Nu|Kr~f$%P>W{a*bAPpu#wxprF(tDSWa`!}M|Fin_!wiC% z?##s=&xKZP?)e4G_UWu}*8ez!@XjZkwKpd_;Y|NfOu-qhTNyV$7Qr|Ak%rs* zq~z|r5{Lfc^4Xtr_kP7&zdM5O^aBRr=JN|KUyIaQPyAlL1z|3KFMcNSy}b<^$H3KA|fKWxw-oK`ihE*Mn*>8-`^x8Bv)5gsi~=ae0c{|2P5*F*Nw!Zk$5mNUpIiy2Jp#1 zzGi68G3vaiyiP@>*WboG;nNz-2GwQ)w&m0O`zJJFa}CC3G<~$jqme(Gjl|< ( - - - ); -export const QobuzIcon = ({ className = "w-4 h-4" }: { - className?: string; -}) => ( - - - ); -export const AmazonIcon = ({ className = "w-4 h-4" }: { - className?: string; -}) => ( - - - ); +}; + +function sanitizeClassName(className: string): string { + return className + .split(/\s+/) + .filter(Boolean) + .filter((part) => part !== "fill-current" && part !== "fill-muted-foreground" && !part.startsWith("text-")) + .join(" "); +} + +function hasRoundedClass(className: string): boolean { + return className + .split(/\s+/) + .some((part) => part.startsWith("rounded")); +} + +function getStatusClasses(className: string): string { + if (className.includes("text-green-500")) { + return "ring-2 ring-green-500 rounded-sm"; + } + + if (className.includes("text-red-500")) { + return "ring-2 ring-red-500 rounded-sm opacity-70"; + } + + return ""; +} + +function PlatformIcon({ src, alt, className = "w-4 h-4", defaultClassName = "" }: { src: string; alt: string; className?: string; defaultClassName?: string; }) { + const cleanedClassName = sanitizeClassName(className); + const statusClasses = getStatusClasses(className); + const imageClassName = [ + cleanedClassName || "w-4 h-4", + "inline-block shrink-0 object-contain", + !hasRoundedClass(cleanedClassName) ? defaultClassName : "", + statusClasses, + ] + .filter(Boolean) + .join(" "); + + return {alt}; +} + +export function TidalIcon({ className = "w-4 h-4" }: PlatformIconProps) { + return ; +} + +export function QobuzIcon({ className = "w-4 h-4" }: PlatformIconProps) { + return ; +} + +export function AmazonIcon({ className = "w-4 h-4" }: PlatformIconProps) { + return ; +} + +export function TidalAvailabilityIcon({ className = "w-4 h-4" }: PlatformIconProps) { + return + + + ; +} + +export function QobuzAvailabilityIcon({ className = "w-4 h-4" }: PlatformIconProps) { + return + + + ; +} + +export function AmazonAvailabilityIcon({ className = "w-4 h-4" }: PlatformIconProps) { + return + + + ; +} diff --git a/frontend/src/components/SettingsPage.tsx b/frontend/src/components/SettingsPage.tsx index 9836577..77a2ece 100644 --- a/frontend/src/components/SettingsPage.tsx +++ b/frontend/src/components/SettingsPage.tsx @@ -13,24 +13,7 @@ import { themes, applyTheme } from "@/lib/themes"; import { SelectFolder, OpenConfigFolder } from "../../wailsjs/go/main/App"; import { toastWithSound as toast } from "@/lib/toast-with-sound"; import { ApiStatusTab } from "./ApiStatusTab"; -const TidalIcon = ({ className }: { - className?: string; -}) => ( - - - ); -const QobuzIcon = ({ className }: { - className?: string; -}) => ( - - - ); -const AmazonIcon = ({ className }: { - className?: string; -}) => ( - - - ); +import { AmazonIcon, QobuzIcon, TidalIcon } from "./PlatformIcons"; interface SettingsPageProps { onUnsavedChangesChange?: (hasUnsavedChanges: boolean) => void; onResetRequest?: (resetFn: () => void) => void; @@ -260,19 +243,19 @@ export function SettingsPage({ onUnsavedChangesChange, onResetRequest, }: Settin Auto - + Tidal - + Qobuz - + Amazon Music diff --git a/frontend/src/components/TrackInfo.tsx b/frontend/src/components/TrackInfo.tsx index 132f515..a9ae3a7 100644 --- a/frontend/src/components/TrackInfo.tsx +++ b/frontend/src/components/TrackInfo.tsx @@ -4,7 +4,7 @@ import { Download, FolderOpen, CheckCircle, XCircle, FileText, FileCheck, Globe, import { Spinner } from "@/components/ui/spinner"; import { Tooltip, TooltipContent, TooltipTrigger, } from "@/components/ui/tooltip"; import type { TrackMetadata, TrackAvailability } from "@/types/api"; -import { TidalIcon, QobuzIcon, AmazonIcon } from "./PlatformIcons"; +import { TidalAvailabilityIcon, QobuzAvailabilityIcon, AmazonAvailabilityIcon } from "./PlatformIcons"; import { usePreview } from "@/hooks/usePreview"; interface TrackInfoProps { track: TrackMetadata & { @@ -140,9 +140,9 @@ export function TrackInfo({ track, isDownloading, downloadingTrack, isDownloaded {availability ? (
- - - + + +
) : (

Check Availability

)}
)} diff --git a/frontend/src/components/TrackList.tsx b/frontend/src/components/TrackList.tsx index 5eab214..3fefc06 100644 --- a/frontend/src/components/TrackList.tsx +++ b/frontend/src/components/TrackList.tsx @@ -5,7 +5,7 @@ import { Spinner } from "@/components/ui/spinner"; import { Tooltip, TooltipContent, TooltipTrigger, } from "@/components/ui/tooltip"; import { Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, } from "@/components/ui/pagination"; import type { TrackMetadata, TrackAvailability } from "@/types/api"; -import { TidalIcon, QobuzIcon, AmazonIcon } from "./PlatformIcons"; +import { TidalAvailabilityIcon, QobuzAvailabilityIcon, AmazonAvailabilityIcon } from "./PlatformIcons"; import { usePreview } from "@/hooks/usePreview"; interface TrackListProps { tracks: TrackMetadata[]; @@ -328,9 +328,9 @@ export function TrackList({ tracks, searchQuery, sortBy, selectedTracks, downloa {availabilityMap?.has(track.spotify_id) ? (
- - - + + +
) : (

Check Availability

)}
)}