diff --git a/src/ui/dist/assets/Albums-794d6bcd.js b/src/ui/dist/assets/Albums-794d6bcd.js
deleted file mode 100644
index 95437598c..000000000
--- a/src/ui/dist/assets/Albums-794d6bcd.js
+++ /dev/null
@@ -1 +0,0 @@
-import{C as s}from"./CollectionHeader-b4dad28f.js";import{_ as c,c as t,g as a,o as n,l as _,m as d,a as p,e as l}from"./index-d3fba034.js";const r={components:{CollectionHeader:s},name:"Albums"},m=e=>(_("data-v-c5689964"),e=e(),d(),e),i={class:"padding-20"},u=m(()=>p("div",{class:"albums"}," Albums ",-1));function f(e,v,b,h,C,x){const o=l("CollectionHeader");return n(),t("div",i,[a(o),u])}const $=c(r,[["render",f],["__scopeId","data-v-c5689964"]]);export{$ as default};
diff --git a/src/ui/dist/assets/Albums-9b5db7b3.css b/src/ui/dist/assets/Albums-9b5db7b3.css
deleted file mode 100644
index 3fcdd3712..000000000
--- a/src/ui/dist/assets/Albums-9b5db7b3.css
+++ /dev/null
@@ -1 +0,0 @@
-.padding-20[data-v-c5689964]{padding:20px}
diff --git a/src/ui/dist/assets/Albums-b70df266.js b/src/ui/dist/assets/Albums-b70df266.js
new file mode 100644
index 000000000..9e1af3b84
--- /dev/null
+++ b/src/ui/dist/assets/Albums-b70df266.js
@@ -0,0 +1 @@
+import{C as s}from"./CollectionHeader-6f86fce9.js";import{_ as t,c as a,g as c,o as n,l as _,m as d,a as p,e as l}from"./index-1856ec92.js";const r={components:{CollectionHeader:s},name:"Albums"},m=e=>(_("data-v-f1ef2787"),e=e(),d(),e),i={class:"padding-20"},f=m(()=>p("div",{class:"albums"}," Albums ",-1));function u(e,v,b,h,C,x){const o=l("CollectionHeader");return n(),a("div",i,[c(o),f])}const $=t(r,[["render",u],["__scopeId","data-v-f1ef2787"]]);export{$ as default};
diff --git a/src/ui/dist/assets/Albums-cd4d9140.css b/src/ui/dist/assets/Albums-cd4d9140.css
new file mode 100644
index 000000000..87cbef211
--- /dev/null
+++ b/src/ui/dist/assets/Albums-cd4d9140.css
@@ -0,0 +1 @@
+.padding-20[data-v-f1ef2787]{padding:20px}
diff --git a/src/ui/dist/assets/Artist-31292ef3.js.gz b/src/ui/dist/assets/Artist-31292ef3.js.gz
deleted file mode 100644
index 37e882e1a..000000000
Binary files a/src/ui/dist/assets/Artist-31292ef3.js.gz and /dev/null differ
diff --git a/src/ui/dist/assets/Artist-31292ef3.js b/src/ui/dist/assets/Artist-e39ded91.js
similarity index 62%
rename from src/ui/dist/assets/Artist-31292ef3.js
rename to src/ui/dist/assets/Artist-e39ded91.js
index dc2320737..be718bd07 100644
--- a/src/ui/dist/assets/Artist-31292ef3.js
+++ b/src/ui/dist/assets/Artist-e39ded91.js
@@ -1 +1 @@
-import{n as B,o as t,f as r,w as x,b as H,t as v,C as w,_ as F,A as j,q as h,G as U,aP as D,c as o,bT as R,d as i,g as y,a,h as V,aH as A,F as _,i as g,u as q,T as z,bO as M,b$ as O,b_ as E,l as G,m as J,L as W,bD as Y,s as K,bv as Q}from"./index-d3fba034.js";import{F as P}from"./FactCard-6153b002.js";import{P as X}from"./PlaylistHeader-8dd53ec0.js";import{P as Z}from"./PlaylistEntry-0d2da2e2.js";import{E as ee}from"./ExternalEntry-8bf31741.js";import{s as te}from"./spotify-111ae6ad.js";import"./EditSong.vue_vue_type_script_setup_true_lang-28aa0cb5.js";import"./Template-deebb6b8.js";import"./IconButton-0d464118.js";import"./Form-f0cd8cf2.js";import"./Dropdown-b2449fcb.js";import"./playerInPicture-af203fdf.js";const ae=B({__name:"Tag",props:{tag:{type:String,required:!0},withHash:{type:Boolean,default:!1}},setup(c){return(b,$)=>(t(),r(w,{class:"tag px-4 py-2 cursor-pointer","with-hover":""},{default:x(()=>[H(v(c.withHash?"#":"")+v(c.tag),1)]),_:1}))}});const se=F(ae,[["__scopeId","data-v-2712639d"]]),k=c=>(G("data-v-49f5db63"),c=c(),J(),c),le={key:1,class:"fill-page"},oe={key:2,class:"artist p-4"},re={class:"wrap"},ne={class:"artist__data"},ie={class:"upper"},ue={class:"trac__info__details__normal"},de={key:0,class:"mt-0 mb-2 flex flex-row gap-2"},ce={class:"flex flew-row items-center"},pe={class:"font-black text-5xl ml-4"},_e={class:"features flex flex-row gap-4 mt-4 overflow-x-auto"},ve={class:"spotify-infos pt-4 pb-2"},me={class:"meta items-center"},fe={key:0,class:"flex flex-row align-items"},he=k(()=>a("span",{class:"material-symbols-rounded ms-fill mr-2"},"local_fire_department",-1)),ye={class:"font-bold"},ge=k(()=>a("hr",{class:"mb-4"},null,-1)),xe={class:"items"},we={key:0,class:"spotify-suggestions mt-4"},ke=k(()=>a("h2",null,"Top Tracks",-1)),be={class:"items"},$e=k(()=>a("h2",null,"Related Artists",-1)),Ce={class:"flex flex-row items-center gap-4"},Ie={class:"flex flex-col"},Te={class:"font-bold"},Se=B({__name:"Artist",setup(c){const b=M();K();const $=j(()=>b.params.name),e=h(null),m=h(null),u=h(null),f=h("url"),d=h(!1),C=async()=>{const n=await fetch(`/api/artists/${$.value}`);e.value=await n.json(),m.value=null,u.value="",d.value=!1,e.value.metadata.id.length==22&&(u.value="https://open.spotify.com/artist/"+e.value.metadata.id,d.value=!0),f.value="link"},I=async n=>{await fetch(`/api/artists/${$.value}`,{method:"PUT",body:JSON.stringify({spotifyId:n})}),e.value=null,await C()};U(u,()=>{var n,l;if(((l=(n=e.value)==null?void 0:n.metadata)==null?void 0:l.id)==E(u.value,"artist")){f.value="link";return}f.value="save"});const L=()=>{if(f.value=="link"){O(u.value);return}I(E(u.value,"artist"))};return D(C),U(()=>b.params.name,()=>{e.value=null,C()}),(n,l)=>{var T,S,N;return t(),o(_,null,[e.value?(t(),r(R,{key:0,src:e.value.cover,class:"-z-10"},null,8,["src"])):i("",!0),e.value?(t(),o("div",oe,[a("div",re,[a("div",ne,[a("div",ie,[y(V,{src:e.value.cover,class:"max-w-sm rounded-xl",placeholder:"person"},null,8,["src"]),a("div",{class:A([{"justify-end":e.value.metadata,"justify-center":!e.value.metadata},"track__info__details flex flex-col"])},[a("div",ue,[(T=e.value.metadata)!=null&&T.genres?(t(),o("div",de,[(t(!0),o(_,null,g(e.value.metadata.genres,s=>(t(),r(se,{tag:s,"with-hash":""},null,8,["tag"]))),256))])):i("",!0),a("div",ce,[a("h1",pe,v(e.value.name),1)])]),e.value.metadata?(t(),o(_,{key:0},[a("div",_e,[e.value.metadata.followers?(t(),r(P,{key:0,"primary-text":e.value.metadata.followers.toLocaleString(),class:"w-full","secondary-text":"Followers"},null,8,["primary-text"])):i("",!0),e.value.songs.length?(t(),r(P,{key:1,"primary-text":e.value.songs.length,class:"w-full","secondary-text":"Tracks in Your Library"},null,8,["primary-text"])):i("",!0)]),a("div",ve,[a("div",me,[e.value.metadata.popularity?(t(),o("span",fe,[he,a("span",ye,v(e.value.metadata.popularity),1)])):i("",!0)]),y(q(te),{class:A([{enabled:d.value},"spotify-enable"]),onClick:l[0]||(l[0]=s=>d.value=!d.value)},null,8,["class"]),d.value?(t(),r(z,{key:0,modelValue:u.value,"onUpdate:modelValue":l[1]||(l[1]=s=>u.value=s),icon:f.value,onClick:L},null,8,["modelValue","icon"])):i("",!0),a("span",{class:"material-symbols-rounded cursor-pointer",onClick:l[2]||(l[2]=s=>d.value?I(!1):I(!0))},v(d.value?"delete":"search"),1)])],64)):i("",!0)],2)]),y(X,{class:"hideIfMobile mt-8","with-album":"","with-more":""}),ge,a("div",xe,[(t(!0),o(_,null,g(e.value.songs,s=>Y((t(),r(Z,{index:e.value.songs.findIndex(p=>p.source==s.source),selected:m.value==s.id,song:s,"playlist-id":"track","with-album":"","with-cover":"","with-more":"",onClick:p=>m.value==s.id?m.value=-1:m.value=s.id,onUpdate:l[3]||(l[3]=p=>n.$emit("update"))},null,8,["index","selected","song","onClick"])),[[Q,!0]])),256))]),e.value.metadata?(t(),o("div",we,[(S=e.value.metadata.topTracks)!=null&&S.length?(t(),r(w,{key:0,class:"p-4"},{default:x(()=>[ke,a("div",be,[(t(!0),o(_,null,g(e.value.metadata.topTracks,(s,p)=>(t(),r(ee,{index:p,song:s,"can-import":"","cannot-add":"","with-album":"","with-cover":"","with-more":"",onUpdate:l[4]||(l[4]=Ne=>n.$emit("update"))},null,8,["index","song"]))),256))])]),_:1})):i("",!0),(N=e.value.metadata.related)!=null&&N.length?(t(),r(w,{key:1,class:"p-4 flex flex-col gap-2 related overflow-y-auto"},{default:x(()=>[$e,(t(!0),o(_,null,g(e.value.metadata.related,s=>(t(),r(w,{class:"cursor-pointer px-4 py-2","with-hover":"",onClick:p=>n.$router.push(`/artist/${s.name}`)},{default:x(()=>[a("div",Ce,[y(V,{src:s.cover,class:"w-8 h-8 rounded-xl",placeholder:"person"},null,8,["src"]),a("div",Ie,[a("h3",Te,v(s.name),1)])])]),_:2},1032,["onClick"]))),256))]),_:1})):i("",!0)])):i("",!0)])])])):(t(),o("div",le,[y(W)]))],64)}}});const qe=F(Se,[["__scopeId","data-v-49f5db63"]]);export{qe as default};
+import{n as B,o as t,f as r,w as x,b as H,t as v,C as w,_ as F,A as j,q as h,G as U,aP as D,c as o,bS as R,d as i,g as y,a,h as V,aH as A,F as _,i as g,u as q,T as z,bN as M,b_ as G,bZ as E,l as J,m as O,L as W,bD as Y,s as Z,bv as K}from"./index-1856ec92.js";import{F as P}from"./FactCard-e476ac4b.js";import{P as Q}from"./PlaylistHeader-40afea3c.js";import{P as X}from"./PlaylistEntry-18ad8a22.js";import{E as ee}from"./ExternalEntry-4cf58b98.js";import{s as te}from"./spotify-ddcce4ae.js";import"./EditSong.vue_vue_type_script_setup_true_lang-8a2aaef1.js";import"./Template-8c03613c.js";import"./IconButton-1670e129.js";import"./Form-d27a37bd.js";import"./Dropdown-16096009.js";import"./playerInPicture-af203fdf.js";const ae=B({__name:"Tag",props:{tag:{type:String,required:!0},withHash:{type:Boolean,default:!1}},setup(c){return(b,C)=>(t(),r(w,{class:"tag px-4 py-2 cursor-pointer","with-hover":""},{default:x(()=>[H(v(c.withHash?"#":"")+v(c.tag),1)]),_:1}))}});const se=F(ae,[["__scopeId","data-v-2712639d"]]),k=c=>(J("data-v-49f5db63"),c=c(),O(),c),le={key:1,class:"fill-page"},oe={key:2,class:"artist p-4"},re={class:"wrap"},ne={class:"artist__data"},ie={class:"upper"},ue={class:"trac__info__details__normal"},de={key:0,class:"mt-0 mb-2 flex flex-row gap-2"},ce={class:"flex flew-row items-center"},pe={class:"font-black text-5xl ml-4"},_e={class:"features flex flex-row gap-4 mt-4 overflow-x-auto"},ve={class:"spotify-infos pt-4 pb-2"},me={class:"meta items-center"},fe={key:0,class:"flex flex-row align-items"},he=k(()=>a("span",{class:"material-symbols-rounded ms-fill mr-2"},"local_fire_department",-1)),ye={class:"font-bold"},ge=k(()=>a("hr",{class:"mb-4"},null,-1)),xe={class:"items"},we={key:0,class:"spotify-suggestions mt-4"},ke=k(()=>a("h2",null,"Top Tracks",-1)),be={class:"items"},Ce=k(()=>a("h2",null,"Related Artists",-1)),$e={class:"flex flex-row items-center gap-4"},Ie={class:"flex flex-col"},Se={class:"font-bold"},Te=B({__name:"Artist",setup(c){const b=M();Z();const C=j(()=>b.params.name),e=h(null),m=h(null),u=h(null),f=h("url"),d=h(!1),$=async()=>{const n=await fetch(`/api/artists/${C.value}`);e.value=await n.json(),m.value=null,u.value="",d.value=!1,e.value.metadata.id.length==22&&(u.value="https://open.spotify.com/artist/"+e.value.metadata.id,d.value=!0),f.value="link"},I=async n=>{await fetch(`/api/artists/${C.value}`,{method:"PUT",body:JSON.stringify({spotifyId:n})}),e.value=null,await $()};U(u,()=>{var n,l;if(((l=(n=e.value)==null?void 0:n.metadata)==null?void 0:l.id)==E(u.value,"artist")){f.value="link";return}f.value="save"});const L=()=>{if(f.value=="link"){G(u.value);return}I(E(u.value,"artist"))};return D($),U(()=>b.params.name,()=>{e.value=null,$()}),(n,l)=>{var S,T,N;return t(),o(_,null,[e.value?(t(),r(R,{key:0,src:e.value.cover,class:"-z-10"},null,8,["src"])):i("",!0),e.value?(t(),o("div",oe,[a("div",re,[a("div",ne,[a("div",ie,[y(V,{src:e.value.cover,class:"max-w-sm rounded-xl",placeholder:"person"},null,8,["src"]),a("div",{class:A([{"justify-end":e.value.metadata,"justify-center":!e.value.metadata},"track__info__details flex flex-col"])},[a("div",ue,[(S=e.value.metadata)!=null&&S.genres?(t(),o("div",de,[(t(!0),o(_,null,g(e.value.metadata.genres,s=>(t(),r(se,{tag:s,"with-hash":""},null,8,["tag"]))),256))])):i("",!0),a("div",ce,[a("h1",pe,v(e.value.name),1)])]),e.value.metadata?(t(),o(_,{key:0},[a("div",_e,[e.value.metadata.followers?(t(),r(P,{key:0,"primary-text":e.value.metadata.followers.toLocaleString(),class:"w-full","secondary-text":"Followers"},null,8,["primary-text"])):i("",!0),e.value.songs.length?(t(),r(P,{key:1,"primary-text":e.value.songs.length,class:"w-full","secondary-text":"Tracks in Your Library"},null,8,["primary-text"])):i("",!0)]),a("div",ve,[a("div",me,[e.value.metadata.popularity?(t(),o("span",fe,[he,a("span",ye,v(e.value.metadata.popularity),1)])):i("",!0)]),y(q(te),{class:A([{enabled:d.value},"spotify-enable"]),onClick:l[0]||(l[0]=s=>d.value=!d.value)},null,8,["class"]),d.value?(t(),r(z,{key:0,modelValue:u.value,"onUpdate:modelValue":l[1]||(l[1]=s=>u.value=s),icon:f.value,onClick:L},null,8,["modelValue","icon"])):i("",!0),a("span",{class:"material-symbols-rounded cursor-pointer",onClick:l[2]||(l[2]=s=>d.value?I(!1):I(!0))},v(d.value?"delete":"search"),1)])],64)):i("",!0)],2)]),y(Q,{class:"hideIfMobile mt-8","with-album":"","with-more":""}),ge,a("div",xe,[(t(!0),o(_,null,g(e.value.songs,s=>Y((t(),r(X,{index:e.value.songs.findIndex(p=>p.source==s.source),selected:m.value==s.id,song:s,"playlist-id":"track","with-album":"","with-cover":"","with-more":"",onClick:p=>m.value==s.id?m.value=-1:m.value=s.id,onUpdate:l[3]||(l[3]=p=>n.$emit("update"))},null,8,["index","selected","song","onClick"])),[[K,!0]])),256))]),e.value.metadata?(t(),o("div",we,[(T=e.value.metadata.topTracks)!=null&&T.length?(t(),r(w,{key:0,class:"p-4"},{default:x(()=>[ke,a("div",be,[(t(!0),o(_,null,g(e.value.metadata.topTracks,(s,p)=>(t(),r(ee,{index:p,song:s,"can-import":"","cannot-add":"","with-album":"","with-cover":"","with-more":"",onUpdate:l[4]||(l[4]=Ne=>n.$emit("update"))},null,8,["index","song"]))),256))])]),_:1})):i("",!0),(N=e.value.metadata.related)!=null&&N.length?(t(),r(w,{key:1,class:"p-4 flex flex-col gap-2 related overflow-y-auto"},{default:x(()=>[Ce,(t(!0),o(_,null,g(e.value.metadata.related,s=>(t(),r(w,{class:"cursor-pointer px-4 py-2","with-hover":"",onClick:p=>n.$router.push(`/artist/${s.name}`)},{default:x(()=>[a("div",$e,[y(V,{src:s.cover,class:"w-8 h-8 rounded-xl",placeholder:"person"},null,8,["src"]),a("div",Ie,[a("h3",Se,v(s.name),1)])])]),_:2},1032,["onClick"]))),256))]),_:1})):i("",!0)])):i("",!0)])])])):(t(),o("div",le,[y(W)]))],64)}}});const qe=F(Te,[["__scopeId","data-v-49f5db63"]]);export{qe as default};
diff --git a/src/ui/dist/assets/Artist-e39ded91.js.gz b/src/ui/dist/assets/Artist-e39ded91.js.gz
new file mode 100644
index 000000000..ff7adf578
Binary files /dev/null and b/src/ui/dist/assets/Artist-e39ded91.js.gz differ
diff --git a/src/ui/dist/assets/ArtistItem-827840d3.js.gz b/src/ui/dist/assets/ArtistItem-827840d3.js.gz
deleted file mode 100644
index dbb642a92..000000000
Binary files a/src/ui/dist/assets/ArtistItem-827840d3.js.gz and /dev/null differ
diff --git a/src/ui/dist/assets/ArtistItem-827840d3.js b/src/ui/dist/assets/ArtistItem-d4be8c52.js
similarity index 94%
rename from src/ui/dist/assets/ArtistItem-827840d3.js
rename to src/ui/dist/assets/ArtistItem-d4be8c52.js
index 73bba9120..a0a267419 100644
--- a/src/ui/dist/assets/ArtistItem-827840d3.js
+++ b/src/ui/dist/assets/ArtistItem-d4be8c52.js
@@ -1 +1 @@
-import{_ as w,C as g,o as a,f as h,w as l,g as r,a as e,t as c,c as p,d as y,e as n}from"./index-d3fba034.js";const v={components:{Card:g},name:"ArtistItem",methods:{follow(s){s.stopPropagation();const o=this.following?"DELETE":"POST";fetch("/api/spotify/following",{method:o,body:JSON.stringify({artistId:this.id})}).then(t=>{t.status==200&&(this.following=!this.following)})}},data(){return{following:!1}},props:{cover:String,name:String,description:String,id:String,showFollowButton:Boolean}},k={class:"item"},B=["src"],C=["innerHTML"];function S(s,o,t,b,_,i){const d=n("add-artist-to-playlist"),m=n("Card"),f=n("router-link");return a(),h(f,{to:"/artist/"+t.name,class:"noLink"},{default:l(()=>[r(m,{class:"wrapper","with-hover":""},{default:l(()=>[r(d,{ref:"import",artist:{id:t.id,name:t.name,href:`https://open.spotify.com/artist/${t.id}`,image:t.cover}},null,8,["artist"]),e("div",k,[e("img",{src:t.cover},null,8,B),e("h4",null,c(t.name),1),e("p",{innerHTML:t.description},null,8,C),t.showFollowButton?(a(),p("button",{key:0,class:"followButton",onClick:o[0]||(o[0]=(...u)=>i.follow&&i.follow(...u))},c(_.following?"Following":"Follow"),1)):y("",!0)])]),_:1})]),_:1},8,["to"])}const I=w(v,[["render",S],["__scopeId","data-v-bb954325"]]);export{I as A};
+import{_ as w,C as g,o as a,f as h,w as l,g as r,a as e,t as c,c as p,d as y,e as n}from"./index-1856ec92.js";const v={components:{Card:g},name:"ArtistItem",methods:{follow(s){s.stopPropagation();const o=this.following?"DELETE":"POST";fetch("/api/spotify/following",{method:o,body:JSON.stringify({artistId:this.id})}).then(t=>{t.status==200&&(this.following=!this.following)})}},data(){return{following:!1}},props:{cover:String,name:String,description:String,id:String,showFollowButton:Boolean}},k={class:"item"},B=["src"],C=["innerHTML"];function S(s,o,t,b,_,i){const d=n("add-artist-to-playlist"),m=n("Card"),f=n("router-link");return a(),h(f,{to:"/artist/"+t.name,class:"noLink"},{default:l(()=>[r(m,{class:"wrapper","with-hover":""},{default:l(()=>[r(d,{ref:"import",artist:{id:t.id,name:t.name,href:`https://open.spotify.com/artist/${t.id}`,image:t.cover}},null,8,["artist"]),e("div",k,[e("img",{src:t.cover},null,8,B),e("h4",null,c(t.name),1),e("p",{innerHTML:t.description},null,8,C),t.showFollowButton?(a(),p("button",{key:0,class:"followButton",onClick:o[0]||(o[0]=(...u)=>i.follow&&i.follow(...u))},c(_.following?"Following":"Follow"),1)):y("",!0)])]),_:1})]),_:1},8,["to"])}const I=w(v,[["render",S],["__scopeId","data-v-bb954325"]]);export{I as A};
diff --git a/src/ui/dist/assets/ArtistItem-d4be8c52.js.gz b/src/ui/dist/assets/ArtistItem-d4be8c52.js.gz
new file mode 100644
index 000000000..bf8dd3ff5
Binary files /dev/null and b/src/ui/dist/assets/ArtistItem-d4be8c52.js.gz differ
diff --git a/src/ui/dist/assets/Artists-bce1a8b9.js b/src/ui/dist/assets/Artists-af83107b.js
similarity index 73%
rename from src/ui/dist/assets/Artists-bce1a8b9.js
rename to src/ui/dist/assets/Artists-af83107b.js
index eda8f855d..22d613621 100644
--- a/src/ui/dist/assets/Artists-bce1a8b9.js
+++ b/src/ui/dist/assets/Artists-af83107b.js
@@ -1 +1 @@
-import{F as p}from"./FullShelf-a8ad59b2.js";import{A as d}from"./ArtistItem-827840d3.js";import{C as f}from"./CollectionHeader-b4dad28f.js";import{_ as m,c as i,g as n,a as u,w as h,e,o,F as v,i as y,f as A}from"./index-d3fba034.js";const g={components:{CollectionHeader:f,ArtistItem:d,FullShelf:p},name:"Artists",data(){return fetch("/api/spotify/artists").then(t=>t.json()).then(t=>this.spotifyArtists.push(...t)),{spotifyArtists:[]}}},C={class:"padding-20"},w={class:"artists"};function x(t,F,k,B,r,H){const a=e("CollectionHeader"),c=e("artist-item"),_=e("full-shelf");return o(),i("div",C,[n(a),u("div",w,[n(_,{heading:"Following on Spotify"},{default:h(()=>[(o(!0),i(v,null,y(r.spotifyArtists,(s,l)=>(o(),A(c,{id:s.id,key:l,cover:s.cover,description:s.description,name:s.name,"show-follow-button":""},null,8,["id","cover","description","name"]))),128))]),_:1})])])}const V=m(g,[["render",x],["__scopeId","data-v-0e44c266"]]);export{V as default};
+import{F as p}from"./FullShelf-c8864a7a.js";import{A as d}from"./ArtistItem-d4be8c52.js";import{C as f}from"./CollectionHeader-6f86fce9.js";import{_ as m,c as i,g as n,a as u,w as h,e,o,F as v,i as y,f as A}from"./index-1856ec92.js";const g={components:{CollectionHeader:f,ArtistItem:d,FullShelf:p},name:"Artists",data(){return fetch("/api/spotify/artists").then(t=>t.json()).then(t=>this.spotifyArtists.push(...t)),{spotifyArtists:[]}}},C={class:"padding-20"},w={class:"artists"};function x(t,F,k,B,r,H){const a=e("CollectionHeader"),c=e("artist-item"),_=e("full-shelf");return o(),i("div",C,[n(a),u("div",w,[n(_,{heading:"Following on Spotify"},{default:h(()=>[(o(!0),i(v,null,y(r.spotifyArtists,(s,l)=>(o(),A(c,{id:s.id,key:l,cover:s.cover,description:s.description,name:s.name,"show-follow-button":""},null,8,["id","cover","description","name"]))),128))]),_:1})])])}const V=m(g,[["render",x],["__scopeId","data-v-0e44c266"]]);export{V as default};
diff --git a/src/ui/dist/assets/BigPlayer-21db25a4.js.gz b/src/ui/dist/assets/BigPlayer-21db25a4.js.gz
deleted file mode 100644
index 1c15041e5..000000000
Binary files a/src/ui/dist/assets/BigPlayer-21db25a4.js.gz and /dev/null differ
diff --git a/src/ui/dist/assets/BigPlayer-21db25a4.js b/src/ui/dist/assets/BigPlayer-e1c229ba.js
similarity index 82%
rename from src/ui/dist/assets/BigPlayer-21db25a4.js
rename to src/ui/dist/assets/BigPlayer-e1c229ba.js
index e6f6fd024..6396544e6 100644
--- a/src/ui/dist/assets/BigPlayer-21db25a4.js
+++ b/src/ui/dist/assets/BigPlayer-e1c229ba.js
@@ -1 +1 @@
-import{n as T,B as M,j as V,A as c,q as m,G as z,aP as A,c as u,u as t,F as h,a as s,g as k,aH as w,h as D,y,f as x,w as E,d as F,t as B,i as G,e as j,l as q,m as H,o,bG as L,_ as O}from"./index-d3fba034.js";import{_ as J}from"./Playlist.vue_vue_type_script_setup_true_lang-5613d1e1.js";import{P as K}from"./PlaylistItem-a7b148e6.js";import"./PlaylistEntry-0d2da2e2.js";import"./EditSong.vue_vue_type_script_setup_true_lang-28aa0cb5.js";import"./Template-deebb6b8.js";import"./IconButton-0d464118.js";import"./Form-f0cd8cf2.js";import"./Dropdown-b2449fcb.js";import"./playerInPicture-af203fdf.js";import"./PlaylistHeader-8dd53ec0.js";import"./Playlist-8c4c6944.js";import"./ExternalEntry-8bf31741.js";const C=r=>(q("data-v-0dc7138d"),r=r(),H(),r),Q={class:"bigPlayer"},R={class:"upNow"},U=C(()=>s("div",{style:{"animation-delay":"0s"},class:"block"},null,-1)),W={class:"settings"},X={key:1,class:"no-playlist-selected"},Y={class:"wrapper"},Z=C(()=>s("h2",null,"Nothing playing yet...",-1)),ss={class:"playlists"},es=T({__name:"BigPlayer",emits:["maximise"],setup(r,{emit:b}){const e=M(),P=V(),v=c(()=>e.playing),S=c(()=>e.song.cover),I=c(()=>e.song.id),f=c(()=>e.loaded?`${e.song.title} • ${e.song.artist}`:"reAudioPlayer One"),$=c(()=>P.playlists),g=m(null);document.title=f.value,z(f,i=>{document.title=i}),A(()=>{window.setTimeout(()=>{var a,p;if((a=g.value)!=null&&a.scrollTop)return;const i=(p=document.getElementById(`bplayer-entry-${I.value}`))==null?void 0:p.offsetTop;i>=354&&(g.value.scrollTop=i-354)},1e3)});let d=m(!1);const N=()=>{d.value=!d.value,b("maximise",d.value)},_=m(!1),l=m(!1);return(i,a)=>{const p=j("Card");return o(),u("div",Q,[t(e).loaded?(o(),u(h,{key:0},[s("div",R,[k(D,{class:w([{playing:t(v),animate:l.value},"drop-shadow-2xl"]),src:t(S),type:"track","with-ambient":""},null,8,["class","src"]),s("div",{class:w([{playing:t(v),animate:l.value},"blocks"])},[U,s("div",{style:y({"animation-delay":".25s"}),class:"block"},null,4),s("div",{style:y({"animation-delay":".5s"}),class:"block"},null,4)],2)]),t(e).playlist?(o(),x(p,{class:"playlist-overflow drop-shadow-2xl relative",key:t(e).playlist.id},{default:E(()=>[k(J,{playlist:t(e).playlist},null,8,["playlist"])]),_:1})):F("",!0),s("div",W,[s("span",{class:"iconButton material-symbols-rounded",onClick:N},B(t(d)?"fullscreen_exit":"fullscreen"),1),s("span",{style:y({transform:`rotate(${_.value?0:180}deg)`}),class:"iconButton material-symbols-rounded",onClick:a[0]||(a[0]=()=>_.value=!_.value)},"menu_open",4),s("span",{class:"iconButton material-symbols-rounded",onClick:a[1]||(a[1]=()=>l.value=!l.value)},B(l.value?"motion_photos_off":"animation"),1)])],64)):(o(),u("div",X,[s("div",Y,[Z,s("div",ss,[(o(!0),u(h,null,G(t($),n=>(o(),x(K,{key:n.id,cover:n.cover,description:n.description,title:n.name,onClick:L(()=>t(e).loadPlaylist(n.id),["stop"])},null,8,["cover","description","title","onClick"]))),128))])])]))])}}});const ys=O(es,[["__scopeId","data-v-0dc7138d"]]);export{ys as default};
+import{n as T,B as M,j as V,A as c,q as m,G as z,aP as A,c as u,u as t,F as h,a as s,g as k,aH as w,h as D,y,f as x,w as E,d as F,t as B,i as G,e as j,l as q,m as H,o,bG as L,_ as O}from"./index-1856ec92.js";import{_ as J}from"./Playlist.vue_vue_type_script_setup_true_lang-8d47af92.js";import{P as K}from"./PlaylistItem-035a1f18.js";import"./PlaylistEntry-18ad8a22.js";import"./EditSong.vue_vue_type_script_setup_true_lang-8a2aaef1.js";import"./Template-8c03613c.js";import"./IconButton-1670e129.js";import"./Form-d27a37bd.js";import"./Dropdown-16096009.js";import"./playerInPicture-af203fdf.js";import"./PlaylistHeader-40afea3c.js";import"./Playlist-f5edc8c9.js";import"./ExternalEntry-4cf58b98.js";const C=r=>(q("data-v-0dc7138d"),r=r(),H(),r),Q={class:"bigPlayer"},R={class:"upNow"},U=C(()=>s("div",{style:{"animation-delay":"0s"},class:"block"},null,-1)),W={class:"settings"},X={key:1,class:"no-playlist-selected"},Y={class:"wrapper"},Z=C(()=>s("h2",null,"Nothing playing yet...",-1)),ss={class:"playlists"},es=T({__name:"BigPlayer",emits:["maximise"],setup(r,{emit:b}){const e=M(),P=V(),v=c(()=>e.playing),S=c(()=>e.song.cover),I=c(()=>e.song.id),f=c(()=>e.loaded?`${e.song.title} • ${e.song.artist}`:"reAudioPlayer One"),$=c(()=>P.playlists),g=m(null);document.title=f.value,z(f,i=>{document.title=i}),A(()=>{window.setTimeout(()=>{var a,p;if((a=g.value)!=null&&a.scrollTop)return;const i=(p=document.getElementById(`bplayer-entry-${I.value}`))==null?void 0:p.offsetTop;i>=354&&(g.value.scrollTop=i-354)},1e3)});let d=m(!1);const N=()=>{d.value=!d.value,b("maximise",d.value)},_=m(!1),l=m(!1);return(i,a)=>{const p=j("Card");return o(),u("div",Q,[t(e).loaded?(o(),u(h,{key:0},[s("div",R,[k(D,{class:w([{playing:t(v),animate:l.value},"drop-shadow-2xl"]),src:t(S),type:"track","with-ambient":""},null,8,["class","src"]),s("div",{class:w([{playing:t(v),animate:l.value},"blocks"])},[U,s("div",{style:y({"animation-delay":".25s"}),class:"block"},null,4),s("div",{style:y({"animation-delay":".5s"}),class:"block"},null,4)],2)]),t(e).playlist?(o(),x(p,{class:"playlist-overflow drop-shadow-2xl relative",key:t(e).playlist.id},{default:E(()=>[k(J,{playlist:t(e).playlist},null,8,["playlist"])]),_:1})):F("",!0),s("div",W,[s("span",{class:"iconButton material-symbols-rounded",onClick:N},B(t(d)?"fullscreen_exit":"fullscreen"),1),s("span",{style:y({transform:`rotate(${_.value?0:180}deg)`}),class:"iconButton material-symbols-rounded",onClick:a[0]||(a[0]=()=>_.value=!_.value)},"menu_open",4),s("span",{class:"iconButton material-symbols-rounded",onClick:a[1]||(a[1]=()=>l.value=!l.value)},B(l.value?"motion_photos_off":"animation"),1)])],64)):(o(),u("div",X,[s("div",Y,[Z,s("div",ss,[(o(!0),u(h,null,G(t($),n=>(o(),x(K,{key:n.id,cover:n.cover,description:n.description,title:n.name,onClick:L(()=>t(e).loadPlaylist(n.id),["stop"])},null,8,["cover","description","title","onClick"]))),128))])])]))])}}});const ys=O(es,[["__scopeId","data-v-0dc7138d"]]);export{ys as default};
diff --git a/src/ui/dist/assets/BigPlayer-e1c229ba.js.gz b/src/ui/dist/assets/BigPlayer-e1c229ba.js.gz
new file mode 100644
index 000000000..5de025cb3
Binary files /dev/null and b/src/ui/dist/assets/BigPlayer-e1c229ba.js.gz differ
diff --git a/src/ui/dist/assets/Breaking-23286a64.js b/src/ui/dist/assets/Breaking-23286a64.js
deleted file mode 100644
index 6d83f6a35..000000000
--- a/src/ui/dist/assets/Breaking-23286a64.js
+++ /dev/null
@@ -1 +0,0 @@
-import{I as r}from"./index-24f8c98a.js";import{f as o,o as t}from"./index-d3fba034.js";import"./index.vue_vue_type_script_setup_true_lang-c89e37e5.js";import"./FactCard-6153b002.js";import"./PlaylistEntry-0d2da2e2.js";import"./EditSong.vue_vue_type_script_setup_true_lang-28aa0cb5.js";import"./Template-deebb6b8.js";import"./IconButton-0d464118.js";import"./Form-f0cd8cf2.js";import"./Dropdown-b2449fcb.js";import"./playerInPicture-af203fdf.js";import"./PlaylistHeader-8dd53ec0.js";const x={__name:"Breaking",setup(i){return(p,m)=>(t(),o(r,{id:"breaking",icon:"trending_up"}))}};export{x as default};
diff --git a/src/ui/dist/assets/Breaking-67b04924.js b/src/ui/dist/assets/Breaking-67b04924.js
new file mode 100644
index 000000000..e89ba73fe
--- /dev/null
+++ b/src/ui/dist/assets/Breaking-67b04924.js
@@ -0,0 +1 @@
+import{I as r}from"./index-2a21dcd1.js";import{f as o,o as t}from"./index-1856ec92.js";import"./index.vue_vue_type_script_setup_true_lang-ba86f86f.js";import"./FactCard-e476ac4b.js";import"./PlaylistEntry-18ad8a22.js";import"./EditSong.vue_vue_type_script_setup_true_lang-8a2aaef1.js";import"./Template-8c03613c.js";import"./IconButton-1670e129.js";import"./Form-d27a37bd.js";import"./Dropdown-16096009.js";import"./playerInPicture-af203fdf.js";import"./PlaylistHeader-40afea3c.js";const x={__name:"Breaking",setup(i){return(p,m)=>(t(),o(r,{id:"breaking",icon:"trending_up"}))}};export{x as default};
diff --git a/src/ui/dist/assets/CollectionHeader-6f86fce9.js b/src/ui/dist/assets/CollectionHeader-6f86fce9.js
new file mode 100644
index 000000000..f854f1bde
--- /dev/null
+++ b/src/ui/dist/assets/CollectionHeader-6f86fce9.js
@@ -0,0 +1 @@
+import{_ as l,o as n,c as _,g as s,w as t,d as i,e as d,l as r,m as p,a as c}from"./index-1856ec92.js";const u={name:"CollectionHeader",props:{href:String}},a=e=>(r("data-v-88d87bb1"),e=e(),p(),e),m={class:"wrapper"},f=a(()=>c("div",{class:"collection"}," Playlists ",-1)),h=a(()=>c("div",{class:"collection"}," Releases ",-1)),v=a(()=>c("div",{class:"collection"}," Artists ",-1));function k(e,C,b,x,w,y){const o=d("router-link");return n(),_("div",m,[s(o,{class:"link",to:"/collection/playlists"},{default:t(()=>[f]),_:1}),s(o,{class:"link",to:"/collection/releases"},{default:t(()=>[h]),_:1}),s(o,{class:"link",to:"/collection/artists"},{default:t(()=>[v]),_:1}),i("",!0)])}const S=l(u,[["render",k],["__scopeId","data-v-88d87bb1"]]);export{S as C};
diff --git a/src/ui/dist/assets/CollectionHeader-9c02c260.css b/src/ui/dist/assets/CollectionHeader-9c02c260.css
deleted file mode 100644
index 3dfc64959..000000000
--- a/src/ui/dist/assets/CollectionHeader-9c02c260.css
+++ /dev/null
@@ -1 +0,0 @@
-.wrapper[data-v-e1bef9dd]{display:flex;flex-direction:row;margin-bottom:20px}.link[data-v-e1bef9dd]{text-decoration:none}.collection[data-v-e1bef9dd]{padding:10px;border-radius:5px;font-weight:700;color:var(--fg-base);margin-right:10px;font-size:.85em}.collection[data-v-e1bef9dd]:hover{background:var(--bg-hover-dk)}.router-link-active div.collection[data-v-e1bef9dd]{background:var(--bg-hover)}
diff --git a/src/ui/dist/assets/CollectionHeader-b4dad28f.js b/src/ui/dist/assets/CollectionHeader-b4dad28f.js
deleted file mode 100644
index 6cd3dbaa2..000000000
--- a/src/ui/dist/assets/CollectionHeader-b4dad28f.js
+++ /dev/null
@@ -1 +0,0 @@
-import{_ as l,o as n,c as d,g as s,w as t,d as _,e as i,l as r,m as p,a as c}from"./index-d3fba034.js";const f={name:"CollectionHeader",props:{href:String}},a=e=>(r("data-v-e1bef9dd"),e=e(),p(),e),u={class:"wrapper"},m=a(()=>c("div",{class:"collection"}," Playlists ",-1)),h=a(()=>c("div",{class:"collection"}," Releases ",-1)),v=a(()=>c("div",{class:"collection"}," Artists ",-1));function k(e,C,x,w,y,I){const o=i("router-link");return n(),d("div",u,[s(o,{class:"link",to:"/collection/playlists"},{default:t(()=>[m]),_:1}),s(o,{class:"link",to:"/collection/releases"},{default:t(()=>[h]),_:1}),s(o,{class:"link",to:"/collection/artists"},{default:t(()=>[v]),_:1}),_("",!0)])}const $=l(f,[["render",k],["__scopeId","data-v-e1bef9dd"]]);export{$ as C};
diff --git a/src/ui/dist/assets/CollectionHeader-d7b2d6c7.css b/src/ui/dist/assets/CollectionHeader-d7b2d6c7.css
new file mode 100644
index 000000000..5549f82b3
--- /dev/null
+++ b/src/ui/dist/assets/CollectionHeader-d7b2d6c7.css
@@ -0,0 +1 @@
+.wrapper[data-v-88d87bb1]{display:flex;flex-direction:row;margin-bottom:20px}.link[data-v-88d87bb1]{text-decoration:none}.collection[data-v-88d87bb1]{padding:10px;border-radius:5px;font-weight:700;color:var(--fg-base);margin-right:10px;font-size:.85em}.collection[data-v-88d87bb1]:hover{background:var(--bg-hover-dk)}.router-link-active div.collection[data-v-88d87bb1]{background:var(--bg-hover)}
diff --git a/src/ui/dist/assets/Dropdown-b2449fcb.js b/src/ui/dist/assets/Dropdown-16096009.js
similarity index 96%
rename from src/ui/dist/assets/Dropdown-b2449fcb.js
rename to src/ui/dist/assets/Dropdown-16096009.js
index 5e7fe011b..db0bca3dc 100644
--- a/src/ui/dist/assets/Dropdown-b2449fcb.js
+++ b/src/ui/dist/assets/Dropdown-16096009.js
@@ -1 +1 @@
-import{n as B,q as i,G as w,A as C,o as n,c as l,a as d,t as r,d as _,u as V,aH as D,bG as y,f as S,F as q,i as G,U as L,aG as R,_ as A}from"./index-d3fba034.js";const E={class:"flex flex-row gap-2"},F={key:0,class:"material-symbols-rounded ms-wght-200"},H={class:"material-symbols-rounded"},N=["onClick"],T={class:"material-symbols-rounded"},$={key:0,class:"material-symbols-rounded"},z=B({__name:"Dropdown",props:{modelValue:{type:String,required:!0},options:{type:Array,required:!0},icon:{type:String,required:!1}},emits:["update:modelValue"],setup(c,{emit:h}){const p=c,u=i(p.modelValue),o=i(!1);w(p,t=>{u.value=t.modelValue},{deep:!0});const g=t=>{u.value=t,h("update:modelValue",t),o.value=!1},k=C(()=>{const t=p.options.find(a=>a.value==u.value);return t?t.label:""}),s=i(null),v=i(null);return w(o,t=>{R(()=>{if(t){const a=s.value.getBoundingClientRect(),e=v.value.getBoundingClientRect(),m=e.top,f=e.bottom,x=window.innerHeight-f,b=e.width;s.value.style.width=b+"px",s.value.style.left=e.left+"px",x>a.height?(s.value.style.top=f+"px",s.value.style.bottom="auto"):(s.value.style.top="auto",s.value.style.bottom=m-a.height+"px")}})}),window.addEventListener("click",()=>{o.value=!1}),(t,a)=>(n(),l("div",{ref_key:"container",ref:v,class:"dropdown"},[d("div",{class:D([{expanded:o.value},"dropdown__selected"]),onClick:a[0]||(a[0]=y(e=>o.value=!o.value,["stop"]))},[d("div",E,[c.icon?(n(),l("span",F,r(c.icon),1)):_("",!0),d("span",null,r(V(k)),1)]),d("i",H,r(o.value?"expand_less":"expand_more"),1)],2),(n(),S(L,{to:"#dropdown-target"},[o.value?(n(),l("div",{key:0,ref_key:"trueDropdown",ref:s,class:"dropdown__options"},[(n(!0),l(q,null,G(c.options,e=>(n(),l("div",{key:e.value,class:"dropdown__option",onClick:y(m=>g(e.value),["stop"])},[d("span",T,r(e.icon),1),d("span",null,r(e.label),1),u.value==e.value?(n(),l("span",$,"check")):_("",!0)],8,N))),128))],512)):_("",!0)]))],512))}});const U=A(z,[["__scopeId","data-v-186027d9"]]);export{U as D};
+import{n as B,q as i,G as w,A as C,o as n,c as l,a as d,t as r,d as _,u as V,aH as D,bG as y,f as S,F as q,i as G,U as L,aG as R,_ as A}from"./index-1856ec92.js";const E={class:"flex flex-row gap-2"},F={key:0,class:"material-symbols-rounded ms-wght-200"},H={class:"material-symbols-rounded"},N=["onClick"],T={class:"material-symbols-rounded"},$={key:0,class:"material-symbols-rounded"},z=B({__name:"Dropdown",props:{modelValue:{type:String,required:!0},options:{type:Array,required:!0},icon:{type:String,required:!1}},emits:["update:modelValue"],setup(c,{emit:h}){const p=c,u=i(p.modelValue),o=i(!1);w(p,t=>{u.value=t.modelValue},{deep:!0});const g=t=>{u.value=t,h("update:modelValue",t),o.value=!1},k=C(()=>{const t=p.options.find(a=>a.value==u.value);return t?t.label:""}),s=i(null),v=i(null);return w(o,t=>{R(()=>{if(t){const a=s.value.getBoundingClientRect(),e=v.value.getBoundingClientRect(),m=e.top,f=e.bottom,x=window.innerHeight-f,b=e.width;s.value.style.width=b+"px",s.value.style.left=e.left+"px",x>a.height?(s.value.style.top=f+"px",s.value.style.bottom="auto"):(s.value.style.top="auto",s.value.style.bottom=m-a.height+"px")}})}),window.addEventListener("click",()=>{o.value=!1}),(t,a)=>(n(),l("div",{ref_key:"container",ref:v,class:"dropdown"},[d("div",{class:D([{expanded:o.value},"dropdown__selected"]),onClick:a[0]||(a[0]=y(e=>o.value=!o.value,["stop"]))},[d("div",E,[c.icon?(n(),l("span",F,r(c.icon),1)):_("",!0),d("span",null,r(V(k)),1)]),d("i",H,r(o.value?"expand_less":"expand_more"),1)],2),(n(),S(L,{to:"#dropdown-target"},[o.value?(n(),l("div",{key:0,ref_key:"trueDropdown",ref:s,class:"dropdown__options"},[(n(!0),l(q,null,G(c.options,e=>(n(),l("div",{key:e.value,class:"dropdown__option",onClick:y(m=>g(e.value),["stop"])},[d("span",T,r(e.icon),1),d("span",null,r(e.label),1),u.value==e.value?(n(),l("span",$,"check")):_("",!0)],8,N))),128))],512)):_("",!0)]))],512))}});const U=A(z,[["__scopeId","data-v-186027d9"]]);export{U as D};
diff --git a/src/ui/dist/assets/Dropdown-16096009.js.gz b/src/ui/dist/assets/Dropdown-16096009.js.gz
new file mode 100644
index 000000000..4db17a25a
Binary files /dev/null and b/src/ui/dist/assets/Dropdown-16096009.js.gz differ
diff --git a/src/ui/dist/assets/Dropdown-b2449fcb.js.gz b/src/ui/dist/assets/Dropdown-b2449fcb.js.gz
deleted file mode 100644
index 2c3169dd8..000000000
Binary files a/src/ui/dist/assets/Dropdown-b2449fcb.js.gz and /dev/null differ
diff --git a/src/ui/dist/assets/EditSong.vue_vue_type_script_setup_true_lang-28aa0cb5.js.gz b/src/ui/dist/assets/EditSong.vue_vue_type_script_setup_true_lang-28aa0cb5.js.gz
deleted file mode 100644
index 3612e3f36..000000000
Binary files a/src/ui/dist/assets/EditSong.vue_vue_type_script_setup_true_lang-28aa0cb5.js.gz and /dev/null differ
diff --git a/src/ui/dist/assets/EditSong.vue_vue_type_script_setup_true_lang-28aa0cb5.js b/src/ui/dist/assets/EditSong.vue_vue_type_script_setup_true_lang-8a2aaef1.js
similarity index 80%
rename from src/ui/dist/assets/EditSong.vue_vue_type_script_setup_true_lang-28aa0cb5.js
rename to src/ui/dist/assets/EditSong.vue_vue_type_script_setup_true_lang-8a2aaef1.js
index 4bbd09b86..0f71b8242 100644
--- a/src/ui/dist/assets/EditSong.vue_vue_type_script_setup_true_lang-28aa0cb5.js
+++ b/src/ui/dist/assets/EditSong.vue_vue_type_script_setup_true_lang-8a2aaef1.js
@@ -1 +1 @@
-import{T as g}from"./Template-deebb6b8.js";import{F as y}from"./Form-f0cd8cf2.js";import{n as w,q as s,G as b,f as _,w as h,ci as x,bR as S,o as k,g as q}from"./index-d3fba034.js";const j=w({__name:"EditSong",props:{song:{type:Object,required:!0}},emits:["close","update"],setup(c,{expose:l,emit:p}){const a=c,r=async(t,e)=>{const o=new FormData,d="."+e.name.split(".").pop();var v=e.slice(0,e.size,e.type),f=new File([v],a.song.id+d,{type:e.type});return o.append("file",f),await(await fetch(t,{method:"POST",body:o})).text()},n=s([{name:"source",type:"upload",icon:"music_note",accept:"audio/mp3",required:!0,onUpload:t=>{r("/api/config/tracks",t).then(e=>n.value.find(o=>o.name=="source").value=e)},value:a.song.source},{name:"title",type:"text",icon:"title",required:!0,value:a.song.title},{name:"artist",type:"text",icon:"person",required:!0,value:a.song.artist},{name:"album",type:"text",icon:"album",value:a.song.album},{name:"cover",type:"upload",icon:"art_track",accept:"image/*",imagePreview:!0,value:a.song.cover,onUpload:t=>{r("/api/config/images",t).then(e=>n.value.find(o=>o.name=="cover").value=e)}}]),m=async()=>{const t=u.value.toObject();await x({...a.song,...t}),p("update"),S.addSuccess(t.title,"Updated",3e3)},i=s(null),u=s(null);return l({show:()=>{i.value.show()}}),b(a,()=>{var t;for(const e of n.value.map(o=>o.name))n.value.find(o=>o.name==e).value=(t=a.song)==null?void 0:t[e]},{deep:!0}),(t,e)=>(k(),_(g,{ref_key:"modal",ref:i,submit:{label:"Save",icon:"save"},name:"Edit Song",onClose:e[0]||(e[0]=o=>t.$emit("close")),onSubmit:m},{default:h(()=>[q(y,{ref_key:"form",ref:u,options:n.value},null,8,["options"])]),_:1},512))}});export{j as _};
+import{T as g}from"./Template-8c03613c.js";import{F as y}from"./Form-d27a37bd.js";import{n as w,q as s,G as b,f as h,w as _,ch as x,bQ as S,o as k,g as q}from"./index-1856ec92.js";const j=w({__name:"EditSong",props:{song:{type:Object,required:!0}},emits:["close","update"],setup(c,{expose:l,emit:p}){const a=c,r=async(t,e)=>{const o=new FormData,d="."+e.name.split(".").pop();var v=e.slice(0,e.size,e.type),f=new File([v],a.song.id+d,{type:e.type});return o.append("file",f),await(await fetch(t,{method:"POST",body:o})).text()},n=s([{name:"source",type:"upload",icon:"music_note",accept:"audio/mp3",required:!0,onUpload:t=>{r("/api/config/tracks",t).then(e=>n.value.find(o=>o.name=="source").value=e)},value:a.song.source},{name:"title",type:"text",icon:"title",required:!0,value:a.song.title},{name:"artist",type:"text",icon:"person",required:!0,value:a.song.artist},{name:"album",type:"text",icon:"album",value:a.song.album},{name:"cover",type:"upload",icon:"art_track",accept:"image/*",imagePreview:!0,value:a.song.cover,onUpload:t=>{r("/api/config/images",t).then(e=>n.value.find(o=>o.name=="cover").value=e)}}]),m=async()=>{const t=u.value.toObject();await x({...a.song,...t}),p("update"),S.addSuccess(t.title,"Updated",3e3)},i=s(null),u=s(null);return l({show:()=>{i.value.show()}}),b(a,()=>{var t;for(const e of n.value.map(o=>o.name))n.value.find(o=>o.name==e).value=(t=a.song)==null?void 0:t[e]},{deep:!0}),(t,e)=>(k(),h(g,{ref_key:"modal",ref:i,submit:{label:"Save",icon:"save"},name:"Edit Song",onClose:e[0]||(e[0]=o=>t.$emit("close")),onSubmit:m},{default:_(()=>[q(y,{ref_key:"form",ref:u,options:n.value},null,8,["options"])]),_:1},512))}});export{j as _};
diff --git a/src/ui/dist/assets/EditSong.vue_vue_type_script_setup_true_lang-8a2aaef1.js.gz b/src/ui/dist/assets/EditSong.vue_vue_type_script_setup_true_lang-8a2aaef1.js.gz
new file mode 100644
index 000000000..b92f1899c
Binary files /dev/null and b/src/ui/dist/assets/EditSong.vue_vue_type_script_setup_true_lang-8a2aaef1.js.gz differ
diff --git a/src/ui/dist/assets/Editor-084cdbfc.js b/src/ui/dist/assets/Editor-084cdbfc.js
deleted file mode 100644
index d03086ce6..000000000
--- a/src/ui/dist/assets/Editor-084cdbfc.js
+++ /dev/null
@@ -1 +0,0 @@
-import{I as V}from"./IconButton-0d464118.js";import{n as w,E as I,q as C,G as k,H as x,I as E,c as i,a as l,g as s,T as d,J as g,t as p,F as m,i as _,l as S,m as P,o as n,w as U,C as B,_ as $}from"./index-d3fba034.js";import{_ as A}from"./Playlist.vue_vue_type_script_setup_true_lang-5613d1e1.js";import"./PlaylistEntry-0d2da2e2.js";import"./EditSong.vue_vue_type_script_setup_true_lang-28aa0cb5.js";import"./Template-deebb6b8.js";import"./Form-f0cd8cf2.js";import"./Dropdown-b2449fcb.js";import"./playerInPicture-af203fdf.js";import"./PlaylistHeader-8dd53ec0.js";const v=a=>(S("data-v-bb487a54"),a=a(),P(),a),D={class:"playlist-editor"},T=v(()=>l("h1",null,"Smart Playlist Editor",-1)),F={class:"editor"},N=v(()=>l("hr",null,null,-1)),O={class:"sort"},q={class:"filters"},G={class:"items"},H={class:"item"},J=["onClick"],L={class:"preview"},R=w({__name:"Editor",setup(a){const t=I({name:"",description:"",direction:"asc",sort:"id",filter:{title:[],artist:[],album:[],duration:{}}}),c=C();k([()=>t.sort,()=>t.filter,()=>t.direction],x.debounce(async()=>{c.value=await E(t)},3*1e3),{deep:!0});const b=[{value:"title",label:"Title",icon:"title"},{value:"artist",label:"Artist",icon:"person"},{value:"album",label:"Album",icon:"album"},{value:"duration",label:"Duration",icon:"timer"},{value:"index",label:"Added",icon:"date_range"}],h=["title","artist","album"],f={title:"title",artist:"person",album:"album"};return(W,o)=>(n(),i("div",D,[T,l("div",F,[l("h2",null,[s(d,{modelValue:t.name,"onUpdate:modelValue":o[0]||(o[0]=e=>t.name=e),placeholder:"Playlist title..."},null,8,["modelValue"])]),l("p",null,[s(d,{modelValue:t.description,"onUpdate:modelValue":o[1]||(o[1]=e=>t.description=e),placeholder:"Playlist description..."},null,8,["modelValue"])]),N,l("div",O,[s(g,{modelValue:t.sort,"onUpdate:modelValue":o[2]||(o[2]=e=>t.sort=e),options:b,icon:"filter_list"},null,8,["modelValue"]),l("span",{class:"cursor-pointer material-symbols-rounded ms-wght-100 text-5xl",onClick:o[3]||(o[3]=e=>t.direction=t.direction=="asc"?"desc":"asc")},p(t.direction=="asc"?"arrow_drop_up":"arrow_drop_down"),1)]),l("div",q,[(n(),i(m,null,_(h,e=>s(B,{class:"filter"},{default:U(()=>[l("h3",null,p(e),1),l("div",G,[(n(!0),i(m,null,_(t.filter[e],(y,r)=>(n(),i("div",H,[s(d,{modelValue:t.filter[e][r],"onUpdate:modelValue":u=>t.filter[e][r]=u,icon:f[e]},null,8,["modelValue","onUpdate:modelValue","icon"]),l("span",{class:"material-symbols-rounded",onClick:u=>t.filter[e].splice(r,1)}," delete ",8,J)]))),256)),s(V,{label:"OR",icon:"add",onClick:y=>t.filter[e].push("")},null,8,["onClick"])])]),_:2},1024)),64))])]),l("div",L,[s(A,{playlist:c.value},null,8,["playlist"])])]))}});const lt=$(R,[["__scopeId","data-v-bb487a54"]]);export{lt as default};
diff --git a/src/ui/dist/assets/Editor-084cdbfc.js.gz b/src/ui/dist/assets/Editor-084cdbfc.js.gz
deleted file mode 100644
index 2c1c4b2d4..000000000
Binary files a/src/ui/dist/assets/Editor-084cdbfc.js.gz and /dev/null differ
diff --git a/src/ui/dist/assets/Editor-0bd65813.css b/src/ui/dist/assets/Editor-0bd65813.css
deleted file mode 100644
index b06c7e75e..000000000
--- a/src/ui/dist/assets/Editor-0bd65813.css
+++ /dev/null
@@ -1 +0,0 @@
-.playlist-editor[data-v-bb487a54]{display:grid;grid-template-columns:1fr 1fr;gap:1em;padding:1em}.playlist-editor .sort[data-v-bb487a54]{display:flex;align-items:center;gap:.5em}.playlist-editor h1[data-v-bb487a54]{grid-column:1/span 2}.playlist-editor .filters .item[data-v-bb487a54]{display:grid;grid-template-columns:1fr auto;gap:1em;align-items:center}.playlist-editor .filters .items[data-v-bb487a54],.playlist-editor .filters[data-v-bb487a54]{display:flex;flex-direction:column;gap:1em}.playlist-editor .filter[data-v-bb487a54]{padding:1em}.playlist-editor .filter h3[data-v-bb487a54]{text-transform:capitalize}.playlist-editor .material-symbols-rounded[data-v-bb487a54]{cursor:pointer}
diff --git a/src/ui/dist/assets/Editor-155c92ee.css b/src/ui/dist/assets/Editor-155c92ee.css
new file mode 100644
index 000000000..d32303175
--- /dev/null
+++ b/src/ui/dist/assets/Editor-155c92ee.css
@@ -0,0 +1 @@
+.playlist-editor[data-v-b735f5db]{display:grid;align-items:start;grid-template-columns:1fr 1fr;gap:1em;padding:1em}.playlist-editor .sort[data-v-b735f5db]{display:flex;align-items:center;gap:.5em}.playlist-editor h1[data-v-b735f5db]{grid-column:1/span 2}.playlist-editor .filters .item[data-v-b735f5db]{display:grid;grid-template-columns:1fr auto;gap:1em;align-items:center}.playlist-editor .filters .items[data-v-b735f5db],.playlist-editor .filters[data-v-b735f5db]{display:flex;flex-direction:column;gap:1em}.playlist-editor .filter[data-v-b735f5db]{padding:1em}.playlist-editor .filter h3[data-v-b735f5db]{text-transform:capitalize}.playlist-editor .material-symbols-rounded[data-v-b735f5db]{cursor:pointer}.playlist-editor .editor[data-v-b735f5db]{position:sticky;top:0}
diff --git a/src/ui/dist/assets/Editor-715f8a20.js b/src/ui/dist/assets/Editor-715f8a20.js
new file mode 100644
index 000000000..f31c6e916
--- /dev/null
+++ b/src/ui/dist/assets/Editor-715f8a20.js
@@ -0,0 +1 @@
+import{I as V}from"./IconButton-1670e129.js";import{n as w,E as I,q as C,G as k,H as x,I as E,c as i,a as l,g as s,T as d,J as g,t as p,F as m,i as _,l as S,m as P,o as n,w as U,C as B,_ as $}from"./index-1856ec92.js";import{_ as A}from"./Playlist.vue_vue_type_script_setup_true_lang-8d47af92.js";import"./PlaylistEntry-18ad8a22.js";import"./EditSong.vue_vue_type_script_setup_true_lang-8a2aaef1.js";import"./Template-8c03613c.js";import"./Form-d27a37bd.js";import"./Dropdown-16096009.js";import"./playerInPicture-af203fdf.js";import"./PlaylistHeader-40afea3c.js";const v=a=>(S("data-v-b735f5db"),a=a(),P(),a),D={class:"playlist-editor"},T=v(()=>l("h1",null,"Smart Playlist Editor",-1)),F={class:"editor"},N=v(()=>l("hr",null,null,-1)),O={class:"sort"},q={class:"filters"},G={class:"uppercase mt-0"},H={class:"items"},J={class:"item"},L=["onClick"],R={class:"preview"},W=w({__name:"Editor",setup(a){const t=I({name:"",description:"",direction:"asc",sort:"id",filter:{title:[],artist:[],album:[],duration:{}}}),c=C();k([()=>t.sort,()=>t.filter,()=>t.direction],x.debounce(async()=>{c.value=await E(t)},3*1e3),{deep:!0});const b=[{value:"title",label:"Title",icon:"title"},{value:"artist",label:"Artist",icon:"person"},{value:"album",label:"Album",icon:"album"},{value:"duration",label:"Duration",icon:"timer"},{value:"id",label:"Added",icon:"date_range"}],f=["title","artist","album"],h={title:"title",artist:"person",album:"album"};return(j,o)=>(n(),i("div",D,[T,l("div",F,[l("h2",null,[s(d,{modelValue:t.name,"onUpdate:modelValue":o[0]||(o[0]=e=>t.name=e),placeholder:"Playlist title..."},null,8,["modelValue"])]),l("p",null,[s(d,{modelValue:t.description,"onUpdate:modelValue":o[1]||(o[1]=e=>t.description=e),placeholder:"Playlist description..."},null,8,["modelValue"])]),N,l("div",O,[s(g,{modelValue:t.sort,"onUpdate:modelValue":o[2]||(o[2]=e=>t.sort=e),options:b,icon:"filter_list"},null,8,["modelValue"]),l("span",{class:"cursor-pointer material-symbols-rounded ms-wght-100 text-5xl",onClick:o[3]||(o[3]=e=>t.direction=t.direction=="asc"?"desc":"asc")},p(t.direction=="asc"?"arrow_drop_up":"arrow_drop_down"),1)]),l("div",q,[(n(),i(m,null,_(f,e=>s(B,{class:"filter"},{default:U(()=>[l("h4",G,p(e),1),l("div",H,[(n(!0),i(m,null,_(t.filter[e],(y,r)=>(n(),i("div",J,[s(d,{modelValue:t.filter[e][r],"onUpdate:modelValue":u=>t.filter[e][r]=u,icon:h[e]},null,8,["modelValue","onUpdate:modelValue","icon"]),l("span",{class:"material-symbols-rounded",onClick:u=>t.filter[e].splice(r,1)}," delete ",8,L)]))),256)),s(V,{label:"OR",icon:"add",onClick:y=>t.filter[e].push("")},null,8,["onClick"])])]),_:2},1024)),64))])]),l("div",R,[s(A,{playlist:c.value},null,8,["playlist"])])]))}});const ot=$(W,[["__scopeId","data-v-b735f5db"]]);export{ot as default};
diff --git a/src/ui/dist/assets/Editor-715f8a20.js.gz b/src/ui/dist/assets/Editor-715f8a20.js.gz
new file mode 100644
index 000000000..f4e8aa561
Binary files /dev/null and b/src/ui/dist/assets/Editor-715f8a20.js.gz differ
diff --git a/src/ui/dist/assets/Explore-1b45015b.css.gz b/src/ui/dist/assets/Explore-1b45015b.css.gz
deleted file mode 100644
index cad750120..000000000
Binary files a/src/ui/dist/assets/Explore-1b45015b.css.gz and /dev/null differ
diff --git a/src/ui/dist/assets/Explore-3eec1a96.js.gz b/src/ui/dist/assets/Explore-3eec1a96.js.gz
deleted file mode 100644
index 472e3affc..000000000
Binary files a/src/ui/dist/assets/Explore-3eec1a96.js.gz and /dev/null differ
diff --git a/src/ui/dist/assets/Explore-3eec1a96.js b/src/ui/dist/assets/Explore-afae2971.js
similarity index 55%
rename from src/ui/dist/assets/Explore-3eec1a96.js
rename to src/ui/dist/assets/Explore-afae2971.js
index 842fb8be0..dd75c1d8c 100644
--- a/src/ui/dist/assets/Explore-3eec1a96.js
+++ b/src/ui/dist/assets/Explore-afae2971.js
@@ -1 +1 @@
-import{_,o as r,c as n,a as t,r as u,y as h,l as f,m,F as y,i as k,p,z as v,g as a,w as c,M as d,u as g,e as S}from"./index-d3fba034.js";const $={props:{src:String}},x=s=>(f("data-v-0c755b69"),s=s(),m(),s),C=x(()=>t("div",{class:"filter"},null,-1)),I={class:"info"};function b(s,o,l,i,e,N){return r(),n("div",{class:"image",style:h({backgroundImage:"url("+l.src+")"})},[C,t("div",I,[u(s.$slots,"default",{},void 0,!0)])],4)}const O=_($,[["render",b],["__scopeId","data-v-0c755b69"]]);const w={class:"songContent"},E={class:"play"},H=["onClick"],M={class:"info"},P={data(){return fetch("/api/playlists").then(async s=>{this.playlists=await s.json(),this.pick()}),{playlists:[],picks:[]}},mounted(){},methods:{parseCover:p,pick(){console.log("pick"),this.songs=this.playlists.map(s=>s.songs).flat();for(let s=0;s<4;s++)this.picks.push(this.songs[Math.floor(Math.random()*this.songs.length)])},onScroll(){this.$refs.container.clientHeight+this.$refs.container.scrollTop>=this.$refs.container.scrollHeight-100&&this.pick()},href(s){return`/track/${v(s.id)}`},loadPlaylist(s){console.log(s),fetch("/api/player/load",{method:"POST",body:JSON.stringify({id:s,type:"track"})})}}},B=Object.assign(P,{__name:"Explore",setup(s){return(o,l)=>{const i=S("router-link");return r(),n("div",{ref:"container",class:"explore",onScroll:l[0]||(l[0]=(...e)=>o.onScroll&&o.onScroll(...e))},[(r(!0),n(y,null,k(o.picks,e=>(r(),n("div",{key:e.name,class:"item"},[a(O,{src:g(p)(e.cover)},{default:c(()=>[t("div",w,[t("div",E,[t("span",{id:"loadPlaylist",class:"material-symbols-rounded play",onClick:()=>o.loadPlaylist(e.id)},"play_circle",8,H)]),t("div",M,[a(i,{to:o.href(e),class:"linkOnHover"},{default:c(()=>[t("h1",null,[a(d,{text:e.title},null,8,["text"])])]),_:2},1032,["to"]),a(i,{to:`/search/${e.artist}`,class:"linkOnHover"},{default:c(()=>[t("p",null,[a(d,{text:e.artist},null,8,["text"])])]),_:2},1032,["to"])])])]),_:2},1032,["src"])]))),128))],544)}}}),j=_(B,[["__scopeId","data-v-579c8068"]]);export{j as default};
+import{_,o as r,c as n,a as t,r as u,y as h,l as f,m,F as y,i as k,p,z as v,g as o,w as c,M as d,u as g,e as S}from"./index-1856ec92.js";const $={props:{src:String}},x=s=>(f("data-v-34da3e65"),s=s(),m(),s),C=x(()=>t("div",{class:"filter"},null,-1)),I={class:"info"};function O(s,a,l,i,e,N){return r(),n("div",{class:"image",style:h({backgroundImage:"url("+l.src+")"})},[C,t("div",I,[u(s.$slots,"default",{},void 0,!0)])],4)}const b=_($,[["render",O],["__scopeId","data-v-34da3e65"]]);const w={class:"songContent"},E={class:"play"},H=["onClick"],M={class:"info"},P={data(){return fetch("/api/playlists").then(async s=>{this.playlists=await s.json(),this.pick()}),{playlists:[],picks:[]}},mounted(){},methods:{parseCover:p,pick(){console.log("pick"),this.songs=this.playlists.map(s=>s.songs).flat();for(let s=0;s<4;s++)this.picks.push(this.songs[Math.floor(Math.random()*this.songs.length)])},onScroll(){this.$refs.container.clientHeight+this.$refs.container.scrollTop>=this.$refs.container.scrollHeight-100&&this.pick()},href(s){return`/track/${v(s.id)}`},loadPlaylist(s){console.log(s),fetch("/api/player/load",{method:"POST",body:JSON.stringify({id:s,type:"track"})})}}},B=Object.assign(P,{__name:"Explore",setup(s){return(a,l)=>{const i=S("router-link");return r(),n("div",{ref:"container",class:"explore",onScroll:l[0]||(l[0]=(...e)=>a.onScroll&&a.onScroll(...e))},[(r(!0),n(y,null,k(a.picks,e=>(r(),n("div",{key:e.name,class:"item"},[o(b,{src:g(p)(e.cover)},{default:c(()=>[t("div",w,[t("div",E,[t("span",{id:"loadPlaylist",class:"material-symbols-rounded play",onClick:()=>a.loadPlaylist(e.id)},"play_circle",8,H)]),t("div",M,[o(i,{to:a.href(e),class:"linkOnHover"},{default:c(()=>[t("h1",null,[o(d,{text:e.title},null,8,["text"])])]),_:2},1032,["to"]),o(i,{to:`/search/${e.artist}`,class:"linkOnHover"},{default:c(()=>[t("p",null,[o(d,{text:e.artist},null,8,["text"])])]),_:2},1032,["to"])])])]),_:2},1032,["src"])]))),128))],544)}}}),j=_(B,[["__scopeId","data-v-579c8068"]]);export{j as default};
diff --git a/src/ui/dist/assets/Explore-afae2971.js.gz b/src/ui/dist/assets/Explore-afae2971.js.gz
new file mode 100644
index 000000000..68b4a0ba8
Binary files /dev/null and b/src/ui/dist/assets/Explore-afae2971.js.gz differ
diff --git a/src/ui/dist/assets/Explore-1b45015b.css b/src/ui/dist/assets/Explore-e4c09a4f.css
similarity index 77%
rename from src/ui/dist/assets/Explore-1b45015b.css
rename to src/ui/dist/assets/Explore-e4c09a4f.css
index 65da40ee3..549966c31 100644
--- a/src/ui/dist/assets/Explore-1b45015b.css
+++ b/src/ui/dist/assets/Explore-e4c09a4f.css
@@ -1 +1 @@
-.filter[data-v-0c755b69],.info[data-v-0c755b69],.video[data-v-0c755b69]{position:absolute;top:0;left:0;width:100%;height:100%;color:var(--font-accent-contrast)}.image[data-v-0c755b69]{background-attachment:fixed;background-position:center;background-size:cover;background-repeat:no-repeat;width:100%;height:100%;position:absolute;top:0;left:0}.filter[data-v-0c755b69]{-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px)}.item[data-v-579c8068]{height:40vh;color:#fff;position:relative;width:100%}.item[data-v-579c8068] :hover{color:#fff}.item .info[data-v-579c8068]{width:calc(100% - 104px)}.item h1[data-v-579c8068]{margin-bottom:0;width:calc(100% - 20px);position:relative}.item p[data-v-579c8068]{margin:0;width:calc(100% - 20px)}.songContent[data-v-579c8068]{display:flex;flex-direction:row;align-items:flex-end;padding-left:20px;margin-top:28vh}.songContent .play[data-v-579c8068]{font-size:2em;margin-right:20px;transform:translateY(6px);font-variation-settings:"FILL" 1;text-align:center}.songContent .play[data-v-579c8068]:hover{font-variation-settings:"FILL" 0;cursor:pointer}.explore[data-v-579c8068]{overflow-y:auto;height:100%}
+.filter[data-v-34da3e65],.info[data-v-34da3e65],.video[data-v-34da3e65]{position:absolute;top:0;left:0;width:100%;height:100%;color:var(--font-accent-contrast)}.image[data-v-34da3e65]{background-attachment:fixed;background-position:center;background-size:cover;background-repeat:no-repeat;width:100%;height:100%;position:absolute;top:0;left:0}.filter[data-v-34da3e65]{-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px)}.item[data-v-579c8068]{height:40vh;color:#fff;position:relative;width:100%}.item[data-v-579c8068] :hover{color:#fff}.item .info[data-v-579c8068]{width:calc(100% - 104px)}.item h1[data-v-579c8068]{margin-bottom:0;width:calc(100% - 20px);position:relative}.item p[data-v-579c8068]{margin:0;width:calc(100% - 20px)}.songContent[data-v-579c8068]{display:flex;flex-direction:row;align-items:flex-end;padding-left:20px;margin-top:28vh}.songContent .play[data-v-579c8068]{font-size:2em;margin-right:20px;transform:translateY(6px);font-variation-settings:"FILL" 1;text-align:center}.songContent .play[data-v-579c8068]:hover{font-variation-settings:"FILL" 0;cursor:pointer}.explore[data-v-579c8068]{overflow-y:auto;height:100%}
diff --git a/src/ui/dist/assets/Explore-e4c09a4f.css.gz b/src/ui/dist/assets/Explore-e4c09a4f.css.gz
new file mode 100644
index 000000000..97a5330a5
Binary files /dev/null and b/src/ui/dist/assets/Explore-e4c09a4f.css.gz differ
diff --git a/src/ui/dist/assets/Export-5964ea8b.js.gz b/src/ui/dist/assets/Export-5964ea8b.js.gz
deleted file mode 100644
index f7e822a72..000000000
Binary files a/src/ui/dist/assets/Export-5964ea8b.js.gz and /dev/null differ
diff --git a/src/ui/dist/assets/Export-5964ea8b.js b/src/ui/dist/assets/Export-c1d2ed46.js
similarity index 95%
rename from src/ui/dist/assets/Export-5964ea8b.js
rename to src/ui/dist/assets/Export-c1d2ed46.js
index c884a55f9..7664283ef 100644
--- a/src/ui/dist/assets/Export-5964ea8b.js
+++ b/src/ui/dist/assets/Export-c1d2ed46.js
@@ -1,6 +1,6 @@
-import{h as Vt,C as Yt,p as qt,bN as Wt,_ as wt,o as D,f as xt,w as Jt,a as _,g as Y,t as $,b as yt,c as q,F as Bt,d as dt,e as W,cb as Ht,j as Xt,i as zt,l as Kt,m as Zt}from"./index-d3fba034.js";import{G as Z}from"./gistClient-a7b793ac.js";import{I as Qt}from"./IconButton-0d464118.js";var gt={},J={};J.byteLength=rr;J.toByteArray=er;J.fromByteArray=sr;var R=[],T=[],vt=typeof Uint8Array<"u"?Uint8Array:Array,Q="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";for(var M=0,tr=Q.length;M
0)throw new Error("Invalid string. Length must be a multiple of 4");var h=c.indexOf("=");h===-1&&(h=l);var y=h===l?0:4-h%4;return[h,y]}function rr(c){var l=mt(c),h=l[0],y=l[1];return(h+y)*3/4-y}function ir(c,l,h){return(l+h)*3/4-h}function er(c){var l,h=mt(c),y=h[0],p=h[1],f=new vt(ir(c,y,p)),a=0,o=p>0?y-4:y,w;for(w=0;w>16&255,f[a++]=l>>8&255,f[a++]=l&255;return p===2&&(l=T[c.charCodeAt(w)]<<2|T[c.charCodeAt(w+1)]>>4,f[a++]=l&255),p===1&&(l=T[c.charCodeAt(w)]<<10|T[c.charCodeAt(w+1)]<<4|T[c.charCodeAt(w+2)]>>2,f[a++]=l>>8&255,f[a++]=l&255),f}function nr(c){return R[c>>18&63]+R[c>>12&63]+R[c>>6&63]+R[c&63]}function or(c,l,h){for(var y,p=[],f=l;fo?o:a+f));return y===1?(l=c[h-1],p.push(R[l>>2]+R[l<<4&63]+"==")):y===2&&(l=(c[h-2]<<8)+c[h-1],p.push(R[l>>10]+R[l>>4&63]+R[l<<2&63]+"=")),p.join("")}var v={};/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */v.read=function(c,l,h,y,p){var f,a,o=p*8-y-1,w=(1<>1,I=-7,F=h?p-1:0,P=h?-1:1,A=c[l+F];for(F+=P,f=A&(1<<-I)-1,A>>=-I,I+=o;I>0;f=f*256+c[l+F],F+=P,I-=8);for(a=f&(1<<-I)-1,f>>=-I,I+=y;I>0;a=a*256+c[l+F],F+=P,I-=8);if(f===0)f=1-C;else{if(f===w)return a?NaN:(A?-1:1)*(1/0);a=a+Math.pow(2,y),f=f-C}return(A?-1:1)*a*Math.pow(2,f-y)};v.write=function(c,l,h,y,p,f){var a,o,w,C=f*8-p-1,I=(1<>1,P=p===23?Math.pow(2,-24)-Math.pow(2,-77):0,A=y?0:f-1,O=y?1:-1,G=l<0||l===0&&1/l<0?1:0;for(l=Math.abs(l),isNaN(l)||l===1/0?(o=isNaN(l)?1:0,a=I):(a=Math.floor(Math.log(l)/Math.LN2),l*(w=Math.pow(2,-a))<1&&(a--,w*=2),a+F>=1?l+=P/w:l+=P*Math.pow(2,1-F),l*w>=2&&(a++,w/=2),a+F>=I?(o=0,a=I):a+F>=1?(o=(l*w-1)*Math.pow(2,p),a=a+F):(o=l*Math.pow(2,F-1)*Math.pow(2,p),a=0));p>=8;c[h+A]=o&255,A+=O,o/=256,p-=8);for(a=a<
0;c[h+A]=a&255,A+=O,a/=256,C-=8);c[h+A-O]|=G*128};/*!
+import{h as Vt,C as Yt,p as qt,bM as Wt,_ as wt,o as D,f as xt,w as Jt,a as _,g as Y,t as $,b as yt,c as q,F as Bt,d as dt,e as W,ca as Ht,j as Xt,i as zt,l as Kt,m as Zt}from"./index-1856ec92.js";import{G as Z}from"./gistClient-de54a050.js";import{I as Qt}from"./IconButton-1670e129.js";var gt={},J={};J.byteLength=rr;J.toByteArray=er;J.fromByteArray=sr;var R=[],T=[],vt=typeof Uint8Array<"u"?Uint8Array:Array,Q="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";for(var M=0,tr=Q.length;M
0)throw new Error("Invalid string. Length must be a multiple of 4");var h=c.indexOf("=");h===-1&&(h=l);var y=h===l?0:4-h%4;return[h,y]}function rr(c){var l=mt(c),h=l[0],y=l[1];return(h+y)*3/4-y}function ir(c,l,h){return(l+h)*3/4-h}function er(c){var l,h=mt(c),y=h[0],p=h[1],f=new vt(ir(c,y,p)),a=0,o=p>0?y-4:y,w;for(w=0;w>16&255,f[a++]=l>>8&255,f[a++]=l&255;return p===2&&(l=T[c.charCodeAt(w)]<<2|T[c.charCodeAt(w+1)]>>4,f[a++]=l&255),p===1&&(l=T[c.charCodeAt(w)]<<10|T[c.charCodeAt(w+1)]<<4|T[c.charCodeAt(w+2)]>>2,f[a++]=l>>8&255,f[a++]=l&255),f}function nr(c){return R[c>>18&63]+R[c>>12&63]+R[c>>6&63]+R[c&63]}function or(c,l,h){for(var y,p=[],f=l;fo?o:a+f));return y===1?(l=c[h-1],p.push(R[l>>2]+R[l<<4&63]+"==")):y===2&&(l=(c[h-2]<<8)+c[h-1],p.push(R[l>>10]+R[l>>4&63]+R[l<<2&63]+"=")),p.join("")}var v={};/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */v.read=function(c,l,h,y,p){var f,a,o=p*8-y-1,w=(1<>1,I=-7,F=h?p-1:0,P=h?-1:1,A=c[l+F];for(F+=P,f=A&(1<<-I)-1,A>>=-I,I+=o;I>0;f=f*256+c[l+F],F+=P,I-=8);for(a=f&(1<<-I)-1,f>>=-I,I+=y;I>0;a=a*256+c[l+F],F+=P,I-=8);if(f===0)f=1-C;else{if(f===w)return a?NaN:(A?-1:1)*(1/0);a=a+Math.pow(2,y),f=f-C}return(A?-1:1)*a*Math.pow(2,f-y)};v.write=function(c,l,h,y,p,f){var a,o,w,C=f*8-p-1,I=(1<>1,P=p===23?Math.pow(2,-24)-Math.pow(2,-77):0,A=y?0:f-1,O=y?1:-1,G=l<0||l===0&&1/l<0?1:0;for(l=Math.abs(l),isNaN(l)||l===1/0?(o=isNaN(l)?1:0,a=I):(a=Math.floor(Math.log(l)/Math.LN2),l*(w=Math.pow(2,-a))<1&&(a--,w*=2),a+F>=1?l+=P/w:l+=P*Math.pow(2,1-F),l*w>=2&&(a++,w/=2),a+F>=I?(o=0,a=I):a+F>=1?(o=(l*w-1)*Math.pow(2,p),a=a+F):(o=l*Math.pow(2,F-1)*Math.pow(2,p),a=0));p>=8;c[h+A]=o&255,A+=O,o/=256,p-=8);for(a=a<
0;c[h+A]=a&255,A+=O,a/=256,C-=8);c[h+A-O]|=G*128};/*!
* The buffer module from node.js, for the browser.
*
* @author Feross Aboukhadijeh
* @license MIT
- */(function(c){const l=J,h=v,y=typeof Symbol=="function"&&typeof Symbol.for=="function"?Symbol.for("nodejs.util.inspect.custom"):null;c.Buffer=o,c.SlowBuffer=It,c.INSPECT_MAX_BYTES=50;const p=2147483647;c.kMaxLength=p,o.TYPED_ARRAY_SUPPORT=f(),!o.TYPED_ARRAY_SUPPORT&&typeof console<"u"&&typeof console.error=="function"&&console.error("This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support.");function f(){try{const i=new Uint8Array(1),t={foo:function(){return 42}};return Object.setPrototypeOf(t,Uint8Array.prototype),Object.setPrototypeOf(i,t),i.foo()===42}catch{return!1}}Object.defineProperty(o.prototype,"parent",{enumerable:!0,get:function(){if(o.isBuffer(this))return this.buffer}}),Object.defineProperty(o.prototype,"offset",{enumerable:!0,get:function(){if(o.isBuffer(this))return this.byteOffset}});function a(i){if(i>p)throw new RangeError('The value "'+i+'" is invalid for option "size"');const t=new Uint8Array(i);return Object.setPrototypeOf(t,o.prototype),t}function o(i,t,r){if(typeof i=="number"){if(typeof t=="string")throw new TypeError('The "string" argument must be of type string. Received type number');return F(i)}return w(i,t,r)}o.poolSize=8192;function w(i,t,r){if(typeof i=="string")return P(i,t);if(ArrayBuffer.isView(i))return O(i);if(i==null)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof i);if(S(i,ArrayBuffer)||i&&S(i.buffer,ArrayBuffer)||typeof SharedArrayBuffer<"u"&&(S(i,SharedArrayBuffer)||i&&S(i.buffer,SharedArrayBuffer)))return G(i,t,r);if(typeof i=="number")throw new TypeError('The "value" argument must not be of type number. Received type number');const e=i.valueOf&&i.valueOf();if(e!=null&&e!==i)return o.from(e,t,r);const n=Et(i);if(n)return n;if(typeof Symbol<"u"&&Symbol.toPrimitive!=null&&typeof i[Symbol.toPrimitive]=="function")return o.from(i[Symbol.toPrimitive]("string"),t,r);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof i)}o.from=function(i,t,r){return w(i,t,r)},Object.setPrototypeOf(o.prototype,Uint8Array.prototype),Object.setPrototypeOf(o,Uint8Array);function C(i){if(typeof i!="number")throw new TypeError('"size" argument must be of type number');if(i<0)throw new RangeError('The value "'+i+'" is invalid for option "size"')}function I(i,t,r){return C(i),i<=0?a(i):t!==void 0?typeof r=="string"?a(i).fill(t,r):a(i).fill(t):a(i)}o.alloc=function(i,t,r){return I(i,t,r)};function F(i){return C(i),a(i<0?0:H(i)|0)}o.allocUnsafe=function(i){return F(i)},o.allocUnsafeSlow=function(i){return F(i)};function P(i,t){if((typeof t!="string"||t==="")&&(t="utf8"),!o.isEncoding(t))throw new TypeError("Unknown encoding: "+t);const r=rt(i,t)|0;let e=a(r);const n=e.write(i,t);return n!==r&&(e=e.slice(0,n)),e}function A(i){const t=i.length<0?0:H(i.length)|0,r=a(t);for(let e=0;e=p)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+p.toString(16)+" bytes");return i|0}function It(i){return+i!=i&&(i=0),o.alloc(+i)}o.isBuffer=function(t){return t!=null&&t._isBuffer===!0&&t!==o.prototype},o.compare=function(t,r){if(S(t,Uint8Array)&&(t=o.from(t,t.offset,t.byteLength)),S(r,Uint8Array)&&(r=o.from(r,r.offset,r.byteLength)),!o.isBuffer(t)||!o.isBuffer(r))throw new TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');if(t===r)return 0;let e=t.length,n=r.length;for(let s=0,u=Math.min(e,n);sn.length?(o.isBuffer(u)||(u=o.from(u)),u.copy(n,s)):Uint8Array.prototype.set.call(n,u,s);else if(o.isBuffer(u))u.copy(n,s);else throw new TypeError('"list" argument must be an Array of Buffers');s+=u.length}return n};function rt(i,t){if(o.isBuffer(i))return i.length;if(ArrayBuffer.isView(i)||S(i,ArrayBuffer))return i.byteLength;if(typeof i!="string")throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof i);const r=i.length,e=arguments.length>2&&arguments[2]===!0;if(!e&&r===0)return 0;let n=!1;for(;;)switch(t){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":return z(i).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return r*2;case"hex":return r>>>1;case"base64":return pt(i).length;default:if(n)return e?-1:z(i).length;t=(""+t).toLowerCase(),n=!0}}o.byteLength=rt;function Ft(i,t,r){let e=!1;if((t===void 0||t<0)&&(t=0),t>this.length||((r===void 0||r>this.length)&&(r=this.length),r<=0)||(r>>>=0,t>>>=0,r<=t))return"";for(i||(i="utf8");;)switch(i){case"hex":return kt(this,t,r);case"utf8":case"utf-8":return nt(this,t,r);case"ascii":return Pt(this,t,r);case"latin1":case"binary":return bt(this,t,r);case"base64":return St(this,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Nt(this,t,r);default:if(e)throw new TypeError("Unknown encoding: "+i);i=(i+"").toLowerCase(),e=!0}}o.prototype._isBuffer=!0;function k(i,t,r){const e=i[t];i[t]=i[r],i[r]=e}o.prototype.swap16=function(){const t=this.length;if(t%2!==0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let r=0;rr&&(t+=" ... "),""},y&&(o.prototype[y]=o.prototype.inspect),o.prototype.compare=function(t,r,e,n,s){if(S(t,Uint8Array)&&(t=o.from(t,t.offset,t.byteLength)),!o.isBuffer(t))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof t);if(r===void 0&&(r=0),e===void 0&&(e=t?t.length:0),n===void 0&&(n=0),s===void 0&&(s=this.length),r<0||e>t.length||n<0||s>this.length)throw new RangeError("out of range index");if(n>=s&&r>=e)return 0;if(n>=s)return-1;if(r>=e)return 1;if(r>>>=0,e>>>=0,n>>>=0,s>>>=0,this===t)return 0;let u=s-n,d=e-r;const g=Math.min(u,d),B=this.slice(n,s),m=t.slice(r,e);for(let x=0;x2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),r=+r,K(r)&&(r=n?0:i.length-1),r<0&&(r=i.length+r),r>=i.length){if(n)return-1;r=i.length-1}else if(r<0)if(n)r=0;else return-1;if(typeof t=="string"&&(t=o.from(t,e)),o.isBuffer(t))return t.length===0?-1:et(i,t,r,e,n);if(typeof t=="number")return t=t&255,typeof Uint8Array.prototype.indexOf=="function"?n?Uint8Array.prototype.indexOf.call(i,t,r):Uint8Array.prototype.lastIndexOf.call(i,t,r):et(i,[t],r,e,n);throw new TypeError("val must be string, number or Buffer")}function et(i,t,r,e,n){let s=1,u=i.length,d=t.length;if(e!==void 0&&(e=String(e).toLowerCase(),e==="ucs2"||e==="ucs-2"||e==="utf16le"||e==="utf-16le")){if(i.length<2||t.length<2)return-1;s=2,u/=2,d/=2,r/=2}function g(m,x){return s===1?m[x]:m.readUInt16BE(x*s)}let B;if(n){let m=-1;for(B=r;Bu&&(r=u-d),B=r;B>=0;B--){let m=!0;for(let x=0;xn&&(e=n)):e=n;const s=t.length;e>s/2&&(e=s/2);let u;for(u=0;u>>0,isFinite(e)?(e=e>>>0,n===void 0&&(n="utf8")):(n=e,e=void 0);else throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");const s=this.length-r;if((e===void 0||e>s)&&(e=s),t.length>0&&(e<0||r<0)||r>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");let u=!1;for(;;)switch(n){case"hex":return _t(this,t,r,e);case"utf8":case"utf-8":return At(this,t,r,e);case"ascii":case"latin1":case"binary":return Ut(this,t,r,e);case"base64":return Ct(this,t,r,e);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Tt(this,t,r,e);default:if(u)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),u=!0}},o.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function St(i,t,r){return t===0&&r===i.length?l.fromByteArray(i):l.fromByteArray(i.slice(t,r))}function nt(i,t,r){r=Math.min(i.length,r);const e=[];let n=t;for(;n239?4:s>223?3:s>191?2:1;if(n+d<=r){let g,B,m,x;switch(d){case 1:s<128&&(u=s);break;case 2:g=i[n+1],(g&192)===128&&(x=(s&31)<<6|g&63,x>127&&(u=x));break;case 3:g=i[n+1],B=i[n+2],(g&192)===128&&(B&192)===128&&(x=(s&15)<<12|(g&63)<<6|B&63,x>2047&&(x<55296||x>57343)&&(u=x));break;case 4:g=i[n+1],B=i[n+2],m=i[n+3],(g&192)===128&&(B&192)===128&&(m&192)===128&&(x=(s&15)<<18|(g&63)<<12|(B&63)<<6|m&63,x>65535&&x<1114112&&(u=x))}}u===null?(u=65533,d=1):u>65535&&(u-=65536,e.push(u>>>10&1023|55296),u=56320|u&1023),e.push(u),n+=d}return Rt(e)}const ot=4096;function Rt(i){const t=i.length;if(t<=ot)return String.fromCharCode.apply(String,i);let r="",e=0;for(;ee)&&(r=e);let n="";for(let s=t;se&&(t=e),r<0?(r+=e,r<0&&(r=0)):r>e&&(r=e),rr)throw new RangeError("Trying to access beyond buffer length")}o.prototype.readUintLE=o.prototype.readUIntLE=function(t,r,e){t=t>>>0,r=r>>>0,e||E(t,r,this.length);let n=this[t],s=1,u=0;for(;++u>>0,r=r>>>0,e||E(t,r,this.length);let n=this[t+--r],s=1;for(;r>0&&(s*=256);)n+=this[t+--r]*s;return n},o.prototype.readUint8=o.prototype.readUInt8=function(t,r){return t=t>>>0,r||E(t,1,this.length),this[t]},o.prototype.readUint16LE=o.prototype.readUInt16LE=function(t,r){return t=t>>>0,r||E(t,2,this.length),this[t]|this[t+1]<<8},o.prototype.readUint16BE=o.prototype.readUInt16BE=function(t,r){return t=t>>>0,r||E(t,2,this.length),this[t]<<8|this[t+1]},o.prototype.readUint32LE=o.prototype.readUInt32LE=function(t,r){return t=t>>>0,r||E(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+this[t+3]*16777216},o.prototype.readUint32BE=o.prototype.readUInt32BE=function(t,r){return t=t>>>0,r||E(t,4,this.length),this[t]*16777216+(this[t+1]<<16|this[t+2]<<8|this[t+3])},o.prototype.readBigUInt64LE=b(function(t){t=t>>>0,L(t,"offset");const r=this[t],e=this[t+7];(r===void 0||e===void 0)&&j(t,this.length-8);const n=r+this[++t]*2**8+this[++t]*2**16+this[++t]*2**24,s=this[++t]+this[++t]*2**8+this[++t]*2**16+e*2**24;return BigInt(n)+(BigInt(s)<>>0,L(t,"offset");const r=this[t],e=this[t+7];(r===void 0||e===void 0)&&j(t,this.length-8);const n=r*2**24+this[++t]*2**16+this[++t]*2**8+this[++t],s=this[++t]*2**24+this[++t]*2**16+this[++t]*2**8+e;return(BigInt(n)<>>0,r=r>>>0,e||E(t,r,this.length);let n=this[t],s=1,u=0;for(;++u=s&&(n-=Math.pow(2,8*r)),n},o.prototype.readIntBE=function(t,r,e){t=t>>>0,r=r>>>0,e||E(t,r,this.length);let n=r,s=1,u=this[t+--n];for(;n>0&&(s*=256);)u+=this[t+--n]*s;return s*=128,u>=s&&(u-=Math.pow(2,8*r)),u},o.prototype.readInt8=function(t,r){return t=t>>>0,r||E(t,1,this.length),this[t]&128?(255-this[t]+1)*-1:this[t]},o.prototype.readInt16LE=function(t,r){t=t>>>0,r||E(t,2,this.length);const e=this[t]|this[t+1]<<8;return e&32768?e|4294901760:e},o.prototype.readInt16BE=function(t,r){t=t>>>0,r||E(t,2,this.length);const e=this[t+1]|this[t]<<8;return e&32768?e|4294901760:e},o.prototype.readInt32LE=function(t,r){return t=t>>>0,r||E(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},o.prototype.readInt32BE=function(t,r){return t=t>>>0,r||E(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},o.prototype.readBigInt64LE=b(function(t){t=t>>>0,L(t,"offset");const r=this[t],e=this[t+7];(r===void 0||e===void 0)&&j(t,this.length-8);const n=this[t+4]+this[t+5]*2**8+this[t+6]*2**16+(e<<24);return(BigInt(n)<>>0,L(t,"offset");const r=this[t],e=this[t+7];(r===void 0||e===void 0)&&j(t,this.length-8);const n=(r<<24)+this[++t]*2**16+this[++t]*2**8+this[++t];return(BigInt(n)<>>0,r||E(t,4,this.length),h.read(this,t,!0,23,4)},o.prototype.readFloatBE=function(t,r){return t=t>>>0,r||E(t,4,this.length),h.read(this,t,!1,23,4)},o.prototype.readDoubleLE=function(t,r){return t=t>>>0,r||E(t,8,this.length),h.read(this,t,!0,52,8)},o.prototype.readDoubleBE=function(t,r){return t=t>>>0,r||E(t,8,this.length),h.read(this,t,!1,52,8)};function U(i,t,r,e,n,s){if(!o.isBuffer(i))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>n||ti.length)throw new RangeError("Index out of range")}o.prototype.writeUintLE=o.prototype.writeUIntLE=function(t,r,e,n){if(t=+t,r=r>>>0,e=e>>>0,!n){const d=Math.pow(2,8*e)-1;U(this,t,r,e,d,0)}let s=1,u=0;for(this[r]=t&255;++u>>0,e=e>>>0,!n){const d=Math.pow(2,8*e)-1;U(this,t,r,e,d,0)}let s=e-1,u=1;for(this[r+s]=t&255;--s>=0&&(u*=256);)this[r+s]=t/u&255;return r+e},o.prototype.writeUint8=o.prototype.writeUInt8=function(t,r,e){return t=+t,r=r>>>0,e||U(this,t,r,1,255,0),this[r]=t&255,r+1},o.prototype.writeUint16LE=o.prototype.writeUInt16LE=function(t,r,e){return t=+t,r=r>>>0,e||U(this,t,r,2,65535,0),this[r]=t&255,this[r+1]=t>>>8,r+2},o.prototype.writeUint16BE=o.prototype.writeUInt16BE=function(t,r,e){return t=+t,r=r>>>0,e||U(this,t,r,2,65535,0),this[r]=t>>>8,this[r+1]=t&255,r+2},o.prototype.writeUint32LE=o.prototype.writeUInt32LE=function(t,r,e){return t=+t,r=r>>>0,e||U(this,t,r,4,4294967295,0),this[r+3]=t>>>24,this[r+2]=t>>>16,this[r+1]=t>>>8,this[r]=t&255,r+4},o.prototype.writeUint32BE=o.prototype.writeUInt32BE=function(t,r,e){return t=+t,r=r>>>0,e||U(this,t,r,4,4294967295,0),this[r]=t>>>24,this[r+1]=t>>>16,this[r+2]=t>>>8,this[r+3]=t&255,r+4};function st(i,t,r,e,n){ft(t,e,n,i,r,7);let s=Number(t&BigInt(4294967295));i[r++]=s,s=s>>8,i[r++]=s,s=s>>8,i[r++]=s,s=s>>8,i[r++]=s;let u=Number(t>>BigInt(32)&BigInt(4294967295));return i[r++]=u,u=u>>8,i[r++]=u,u=u>>8,i[r++]=u,u=u>>8,i[r++]=u,r}function ut(i,t,r,e,n){ft(t,e,n,i,r,7);let s=Number(t&BigInt(4294967295));i[r+7]=s,s=s>>8,i[r+6]=s,s=s>>8,i[r+5]=s,s=s>>8,i[r+4]=s;let u=Number(t>>BigInt(32)&BigInt(4294967295));return i[r+3]=u,u=u>>8,i[r+2]=u,u=u>>8,i[r+1]=u,u=u>>8,i[r]=u,r+8}o.prototype.writeBigUInt64LE=b(function(t,r=0){return st(this,t,r,BigInt(0),BigInt("0xffffffffffffffff"))}),o.prototype.writeBigUInt64BE=b(function(t,r=0){return ut(this,t,r,BigInt(0),BigInt("0xffffffffffffffff"))}),o.prototype.writeIntLE=function(t,r,e,n){if(t=+t,r=r>>>0,!n){const g=Math.pow(2,8*e-1);U(this,t,r,e,g-1,-g)}let s=0,u=1,d=0;for(this[r]=t&255;++s>0)-d&255;return r+e},o.prototype.writeIntBE=function(t,r,e,n){if(t=+t,r=r>>>0,!n){const g=Math.pow(2,8*e-1);U(this,t,r,e,g-1,-g)}let s=e-1,u=1,d=0;for(this[r+s]=t&255;--s>=0&&(u*=256);)t<0&&d===0&&this[r+s+1]!==0&&(d=1),this[r+s]=(t/u>>0)-d&255;return r+e},o.prototype.writeInt8=function(t,r,e){return t=+t,r=r>>>0,e||U(this,t,r,1,127,-128),t<0&&(t=255+t+1),this[r]=t&255,r+1},o.prototype.writeInt16LE=function(t,r,e){return t=+t,r=r>>>0,e||U(this,t,r,2,32767,-32768),this[r]=t&255,this[r+1]=t>>>8,r+2},o.prototype.writeInt16BE=function(t,r,e){return t=+t,r=r>>>0,e||U(this,t,r,2,32767,-32768),this[r]=t>>>8,this[r+1]=t&255,r+2},o.prototype.writeInt32LE=function(t,r,e){return t=+t,r=r>>>0,e||U(this,t,r,4,2147483647,-2147483648),this[r]=t&255,this[r+1]=t>>>8,this[r+2]=t>>>16,this[r+3]=t>>>24,r+4},o.prototype.writeInt32BE=function(t,r,e){return t=+t,r=r>>>0,e||U(this,t,r,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),this[r]=t>>>24,this[r+1]=t>>>16,this[r+2]=t>>>8,this[r+3]=t&255,r+4},o.prototype.writeBigInt64LE=b(function(t,r=0){return st(this,t,r,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))}),o.prototype.writeBigInt64BE=b(function(t,r=0){return ut(this,t,r,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))});function lt(i,t,r,e,n,s){if(r+e>i.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function ct(i,t,r,e,n){return t=+t,r=r>>>0,n||lt(i,t,r,4),h.write(i,t,r,e,23,4),r+4}o.prototype.writeFloatLE=function(t,r,e){return ct(this,t,r,!0,e)},o.prototype.writeFloatBE=function(t,r,e){return ct(this,t,r,!1,e)};function at(i,t,r,e,n){return t=+t,r=r>>>0,n||lt(i,t,r,8),h.write(i,t,r,e,52,8),r+8}o.prototype.writeDoubleLE=function(t,r,e){return at(this,t,r,!0,e)},o.prototype.writeDoubleBE=function(t,r,e){return at(this,t,r,!1,e)},o.prototype.copy=function(t,r,e,n){if(!o.isBuffer(t))throw new TypeError("argument should be a Buffer");if(e||(e=0),!n&&n!==0&&(n=this.length),r>=t.length&&(r=t.length),r||(r=0),n>0&&n=this.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-r>>0,e=e===void 0?this.length:e>>>0,t||(t=0);let s;if(typeof t=="number")for(s=r;s2**32?n=ht(String(r)):typeof r=="bigint"&&(n=String(r),(r>BigInt(2)**BigInt(32)||r<-(BigInt(2)**BigInt(32)))&&(n=ht(n)),n+="n"),e+=` It must be ${t}. Received ${n}`,e},RangeError);function ht(i){let t="",r=i.length;const e=i[0]==="-"?1:0;for(;r>=e+4;r-=3)t=`_${i.slice(r-3,r)}${t}`;return`${i.slice(0,r)}${t}`}function Lt(i,t,r){L(t,"offset"),(i[t]===void 0||i[t+r]===void 0)&&j(t,i.length-(r+1))}function ft(i,t,r,e,n,s){if(i>r||i3?t===0||t===BigInt(0)?d=`>= 0${u} and < 2${u} ** ${(s+1)*8}${u}`:d=`>= -(2${u} ** ${(s+1)*8-1}${u}) and < 2 ** ${(s+1)*8-1}${u}`:d=`>= ${t}${u} and <= ${r}${u}`,new N.ERR_OUT_OF_RANGE("value",d,i)}Lt(e,n,s)}function L(i,t){if(typeof i!="number")throw new N.ERR_INVALID_ARG_TYPE(t,"number",i)}function j(i,t,r){throw Math.floor(i)!==i?(L(i,r),new N.ERR_OUT_OF_RANGE(r||"offset","an integer",i)):t<0?new N.ERR_BUFFER_OUT_OF_BOUNDS:new N.ERR_OUT_OF_RANGE(r||"offset",`>= ${r?1:0} and <= ${t}`,i)}const $t=/[^+/0-9A-Za-z-_]/g;function Mt(i){if(i=i.split("=")[0],i=i.trim().replace($t,""),i.length<2)return"";for(;i.length%4!==0;)i=i+"=";return i}function z(i,t){t=t||1/0;let r;const e=i.length;let n=null;const s=[];for(let u=0;u55295&&r<57344){if(!n){if(r>56319){(t-=3)>-1&&s.push(239,191,189);continue}else if(u+1===e){(t-=3)>-1&&s.push(239,191,189);continue}n=r;continue}if(r<56320){(t-=3)>-1&&s.push(239,191,189),n=r;continue}r=(n-55296<<10|r-56320)+65536}else n&&(t-=3)>-1&&s.push(239,191,189);if(n=null,r<128){if((t-=1)<0)break;s.push(r)}else if(r<2048){if((t-=2)<0)break;s.push(r>>6|192,r&63|128)}else if(r<65536){if((t-=3)<0)break;s.push(r>>12|224,r>>6&63|128,r&63|128)}else if(r<1114112){if((t-=4)<0)break;s.push(r>>18|240,r>>12&63|128,r>>6&63|128,r&63|128)}else throw new Error("Invalid code point")}return s}function Dt(i){const t=[];for(let r=0;r>8,n=r%256,s.push(n),s.push(e);return s}function pt(i){return l.toByteArray(Mt(i))}function V(i,t,r,e){let n;for(n=0;n=t.length||n>=i.length);++n)t[n+r]=i[n];return n}function S(i,t){return i instanceof t||i!=null&&i.constructor!=null&&i.constructor.name!=null&&i.constructor.name===t.name}function K(i){return i!==i}const Gt=function(){const i="0123456789abcdef",t=new Array(256);for(let r=0;r<16;++r){const e=r*16;for(let n=0;n<16;++n)t[e+n]=i[r]+i[n]}return t}();function b(i){return typeof BigInt>"u"?jt:i}function jt(){throw new Error("BigInt not supported")}})(gt);const ur={name:"cloudPlaylist",components:{Cover:Vt,Card:Yt},props:{playlist:Object,localPlaylists:Array,cloudPlaylists:Array},data(){return{statusText:"",toAdd:[]}},methods:{parseCover:qt,async import(){if(this.statusIcon!="cloud_done"){if(this.statusIcon=="cloud_sync"){for(let c=0;cp.name==this.playlist.name))==null?void 0:h[0];if(!l)return this.localPlaylists?"cloud":"cloud_off";if(this.playlist.description!=l.description)return"cloud_sync";this.toAdd=[];for(let p=0;p[_("span",{class:"close material-symbols-rounded",onClick:l[0]||(l[0]=()=>c.$emit("remove"))},"close"),Y(a,{src:f.cover},null,8,["src"]),_("div",lr,[_("h2",null,$(h.playlist.name),1),_("div",cr,[yt($(h.playlist.songs.length)+" "+$(h.playlist.songs.length==1?"song":"songs"),1),h.playlist.description?(D(),q(Bt,{key:0},[yt(" • "),_("i",null,$(h.playlist.description),1)],64)):dt("",!0)]),_("div",ar,[_("span",hr,$(f.statusIcon),1),p.statusText?(D(),q("div",fr,[_("i",null,$(p.statusText),1)])):dt("",!0)])])]),_:1})}const yr=wt(ur,[["render",pr],["__scopeId","data-v-c0711eb3"]]);window.Buffer=gt.Buffer;new Ht("reapApollo");const dr={name:"import",methods:{downloadFile(){var c="data:text/json;charset=utf-8,"+encodeURIComponent(JSON.stringify(this.playlists)),l=document.getElementById("downloadAnchorElem");l.setAttribute("href",c),l.setAttribute("download","lib.one.json"),l.click()},async openGist(){window.open(await Z.gistUrl(),"_blank")},async upload(){console.log(await Z.saveOrUpdate(this.playlists)),this.fetchGists()},async fetchGists(){this.cloudPlaylists=await Z.getContent()},async fetchLocalPlaylists(){var c;if(!this.loadingPlaylists){this.loadingPlaylists=!0,this.playlists=[];for(const l of(c=this.dataStore)==null?void 0:c.playlists)try{const y=await(await fetch(`/api/playlists/${l.id}`)).json();this.playlists.push(y)}catch(h){console.error(h)}this.loadingPlaylists=!1}}},watch:{dataStore:{handler(c,l){this.fetchLocalPlaylists()},deep:!0}},mounted(){this.fetchLocalPlaylists()},data(){return this.fetchGists(),{playlists:[],loadingPlaylists:!1,userData:{},cloudPlaylists:[],dataStore:Xt()}},components:{IconButton:Qt,CloudPlaylist:yr}},tt=c=>(Kt("data-v-5394d716"),c=c(),Zt(),c),wr={class:"export"},xr={class:"action"},Br=tt(()=>_("h1",null,"Save to File",-1)),gr=tt(()=>_("a",{id:"downloadAnchorElem",style:{display:"none"}},null,-1)),mr={class:"action"},Er=tt(()=>_("h1",null,"Save to Github Gists",-1)),Ir={class:"flex flex-row gap-2"},Fr={class:"data"};function _r(c,l,h,y,p,f){const a=W("IconButton"),o=W("CloudPlaylist");return D(),q("div",wr,[_("div",xr,[Br,gr,Y(a,{icon:"file_download",label:"Save",onClick:f.downloadFile},null,8,["onClick"])]),_("div",mr,[Er,_("div",Ir,[Y(a,{icon:"cloud_upload",label:"Synchronise",onClick:f.upload},null,8,["onClick"]),Y(a,{icon:"link",label:"Browse",onClick:f.openGist},null,8,["onClick"])])]),_("div",Fr,[(D(!0),q(Bt,null,zt(p.playlists,(w,C)=>(D(),xt(o,{key:C,cloudPlaylists:p.cloudPlaylists,playlist:w,onRemove:()=>p.playlists.splice(C,1)},null,8,["cloudPlaylists","playlist","onRemove"]))),128))])])}const Sr=wt(dr,[["render",_r],["__scopeId","data-v-5394d716"]]);export{Sr as default};
+ */(function(c){const l=J,h=v,y=typeof Symbol=="function"&&typeof Symbol.for=="function"?Symbol.for("nodejs.util.inspect.custom"):null;c.Buffer=o,c.SlowBuffer=It,c.INSPECT_MAX_BYTES=50;const p=2147483647;c.kMaxLength=p,o.TYPED_ARRAY_SUPPORT=f(),!o.TYPED_ARRAY_SUPPORT&&typeof console<"u"&&typeof console.error=="function"&&console.error("This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support.");function f(){try{const i=new Uint8Array(1),t={foo:function(){return 42}};return Object.setPrototypeOf(t,Uint8Array.prototype),Object.setPrototypeOf(i,t),i.foo()===42}catch{return!1}}Object.defineProperty(o.prototype,"parent",{enumerable:!0,get:function(){if(o.isBuffer(this))return this.buffer}}),Object.defineProperty(o.prototype,"offset",{enumerable:!0,get:function(){if(o.isBuffer(this))return this.byteOffset}});function a(i){if(i>p)throw new RangeError('The value "'+i+'" is invalid for option "size"');const t=new Uint8Array(i);return Object.setPrototypeOf(t,o.prototype),t}function o(i,t,r){if(typeof i=="number"){if(typeof t=="string")throw new TypeError('The "string" argument must be of type string. Received type number');return F(i)}return w(i,t,r)}o.poolSize=8192;function w(i,t,r){if(typeof i=="string")return P(i,t);if(ArrayBuffer.isView(i))return O(i);if(i==null)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof i);if(S(i,ArrayBuffer)||i&&S(i.buffer,ArrayBuffer)||typeof SharedArrayBuffer<"u"&&(S(i,SharedArrayBuffer)||i&&S(i.buffer,SharedArrayBuffer)))return G(i,t,r);if(typeof i=="number")throw new TypeError('The "value" argument must not be of type number. Received type number');const e=i.valueOf&&i.valueOf();if(e!=null&&e!==i)return o.from(e,t,r);const n=Et(i);if(n)return n;if(typeof Symbol<"u"&&Symbol.toPrimitive!=null&&typeof i[Symbol.toPrimitive]=="function")return o.from(i[Symbol.toPrimitive]("string"),t,r);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof i)}o.from=function(i,t,r){return w(i,t,r)},Object.setPrototypeOf(o.prototype,Uint8Array.prototype),Object.setPrototypeOf(o,Uint8Array);function C(i){if(typeof i!="number")throw new TypeError('"size" argument must be of type number');if(i<0)throw new RangeError('The value "'+i+'" is invalid for option "size"')}function I(i,t,r){return C(i),i<=0?a(i):t!==void 0?typeof r=="string"?a(i).fill(t,r):a(i).fill(t):a(i)}o.alloc=function(i,t,r){return I(i,t,r)};function F(i){return C(i),a(i<0?0:H(i)|0)}o.allocUnsafe=function(i){return F(i)},o.allocUnsafeSlow=function(i){return F(i)};function P(i,t){if((typeof t!="string"||t==="")&&(t="utf8"),!o.isEncoding(t))throw new TypeError("Unknown encoding: "+t);const r=rt(i,t)|0;let e=a(r);const n=e.write(i,t);return n!==r&&(e=e.slice(0,n)),e}function A(i){const t=i.length<0?0:H(i.length)|0,r=a(t);for(let e=0;e=p)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+p.toString(16)+" bytes");return i|0}function It(i){return+i!=i&&(i=0),o.alloc(+i)}o.isBuffer=function(t){return t!=null&&t._isBuffer===!0&&t!==o.prototype},o.compare=function(t,r){if(S(t,Uint8Array)&&(t=o.from(t,t.offset,t.byteLength)),S(r,Uint8Array)&&(r=o.from(r,r.offset,r.byteLength)),!o.isBuffer(t)||!o.isBuffer(r))throw new TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');if(t===r)return 0;let e=t.length,n=r.length;for(let s=0,u=Math.min(e,n);sn.length?(o.isBuffer(u)||(u=o.from(u)),u.copy(n,s)):Uint8Array.prototype.set.call(n,u,s);else if(o.isBuffer(u))u.copy(n,s);else throw new TypeError('"list" argument must be an Array of Buffers');s+=u.length}return n};function rt(i,t){if(o.isBuffer(i))return i.length;if(ArrayBuffer.isView(i)||S(i,ArrayBuffer))return i.byteLength;if(typeof i!="string")throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof i);const r=i.length,e=arguments.length>2&&arguments[2]===!0;if(!e&&r===0)return 0;let n=!1;for(;;)switch(t){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":return z(i).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return r*2;case"hex":return r>>>1;case"base64":return pt(i).length;default:if(n)return e?-1:z(i).length;t=(""+t).toLowerCase(),n=!0}}o.byteLength=rt;function Ft(i,t,r){let e=!1;if((t===void 0||t<0)&&(t=0),t>this.length||((r===void 0||r>this.length)&&(r=this.length),r<=0)||(r>>>=0,t>>>=0,r<=t))return"";for(i||(i="utf8");;)switch(i){case"hex":return bt(this,t,r);case"utf8":case"utf-8":return nt(this,t,r);case"ascii":return Pt(this,t,r);case"latin1":case"binary":return kt(this,t,r);case"base64":return St(this,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Nt(this,t,r);default:if(e)throw new TypeError("Unknown encoding: "+i);i=(i+"").toLowerCase(),e=!0}}o.prototype._isBuffer=!0;function b(i,t,r){const e=i[t];i[t]=i[r],i[r]=e}o.prototype.swap16=function(){const t=this.length;if(t%2!==0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let r=0;rr&&(t+=" ... "),""},y&&(o.prototype[y]=o.prototype.inspect),o.prototype.compare=function(t,r,e,n,s){if(S(t,Uint8Array)&&(t=o.from(t,t.offset,t.byteLength)),!o.isBuffer(t))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof t);if(r===void 0&&(r=0),e===void 0&&(e=t?t.length:0),n===void 0&&(n=0),s===void 0&&(s=this.length),r<0||e>t.length||n<0||s>this.length)throw new RangeError("out of range index");if(n>=s&&r>=e)return 0;if(n>=s)return-1;if(r>=e)return 1;if(r>>>=0,e>>>=0,n>>>=0,s>>>=0,this===t)return 0;let u=s-n,d=e-r;const g=Math.min(u,d),B=this.slice(n,s),m=t.slice(r,e);for(let x=0;x2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),r=+r,K(r)&&(r=n?0:i.length-1),r<0&&(r=i.length+r),r>=i.length){if(n)return-1;r=i.length-1}else if(r<0)if(n)r=0;else return-1;if(typeof t=="string"&&(t=o.from(t,e)),o.isBuffer(t))return t.length===0?-1:et(i,t,r,e,n);if(typeof t=="number")return t=t&255,typeof Uint8Array.prototype.indexOf=="function"?n?Uint8Array.prototype.indexOf.call(i,t,r):Uint8Array.prototype.lastIndexOf.call(i,t,r):et(i,[t],r,e,n);throw new TypeError("val must be string, number or Buffer")}function et(i,t,r,e,n){let s=1,u=i.length,d=t.length;if(e!==void 0&&(e=String(e).toLowerCase(),e==="ucs2"||e==="ucs-2"||e==="utf16le"||e==="utf-16le")){if(i.length<2||t.length<2)return-1;s=2,u/=2,d/=2,r/=2}function g(m,x){return s===1?m[x]:m.readUInt16BE(x*s)}let B;if(n){let m=-1;for(B=r;Bu&&(r=u-d),B=r;B>=0;B--){let m=!0;for(let x=0;xn&&(e=n)):e=n;const s=t.length;e>s/2&&(e=s/2);let u;for(u=0;u>>0,isFinite(e)?(e=e>>>0,n===void 0&&(n="utf8")):(n=e,e=void 0);else throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");const s=this.length-r;if((e===void 0||e>s)&&(e=s),t.length>0&&(e<0||r<0)||r>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");let u=!1;for(;;)switch(n){case"hex":return _t(this,t,r,e);case"utf8":case"utf-8":return At(this,t,r,e);case"ascii":case"latin1":case"binary":return Ut(this,t,r,e);case"base64":return Ct(this,t,r,e);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Tt(this,t,r,e);default:if(u)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),u=!0}},o.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function St(i,t,r){return t===0&&r===i.length?l.fromByteArray(i):l.fromByteArray(i.slice(t,r))}function nt(i,t,r){r=Math.min(i.length,r);const e=[];let n=t;for(;n239?4:s>223?3:s>191?2:1;if(n+d<=r){let g,B,m,x;switch(d){case 1:s<128&&(u=s);break;case 2:g=i[n+1],(g&192)===128&&(x=(s&31)<<6|g&63,x>127&&(u=x));break;case 3:g=i[n+1],B=i[n+2],(g&192)===128&&(B&192)===128&&(x=(s&15)<<12|(g&63)<<6|B&63,x>2047&&(x<55296||x>57343)&&(u=x));break;case 4:g=i[n+1],B=i[n+2],m=i[n+3],(g&192)===128&&(B&192)===128&&(m&192)===128&&(x=(s&15)<<18|(g&63)<<12|(B&63)<<6|m&63,x>65535&&x<1114112&&(u=x))}}u===null?(u=65533,d=1):u>65535&&(u-=65536,e.push(u>>>10&1023|55296),u=56320|u&1023),e.push(u),n+=d}return Rt(e)}const ot=4096;function Rt(i){const t=i.length;if(t<=ot)return String.fromCharCode.apply(String,i);let r="",e=0;for(;ee)&&(r=e);let n="";for(let s=t;se&&(t=e),r<0?(r+=e,r<0&&(r=0)):r>e&&(r=e),rr)throw new RangeError("Trying to access beyond buffer length")}o.prototype.readUintLE=o.prototype.readUIntLE=function(t,r,e){t=t>>>0,r=r>>>0,e||E(t,r,this.length);let n=this[t],s=1,u=0;for(;++u>>0,r=r>>>0,e||E(t,r,this.length);let n=this[t+--r],s=1;for(;r>0&&(s*=256);)n+=this[t+--r]*s;return n},o.prototype.readUint8=o.prototype.readUInt8=function(t,r){return t=t>>>0,r||E(t,1,this.length),this[t]},o.prototype.readUint16LE=o.prototype.readUInt16LE=function(t,r){return t=t>>>0,r||E(t,2,this.length),this[t]|this[t+1]<<8},o.prototype.readUint16BE=o.prototype.readUInt16BE=function(t,r){return t=t>>>0,r||E(t,2,this.length),this[t]<<8|this[t+1]},o.prototype.readUint32LE=o.prototype.readUInt32LE=function(t,r){return t=t>>>0,r||E(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+this[t+3]*16777216},o.prototype.readUint32BE=o.prototype.readUInt32BE=function(t,r){return t=t>>>0,r||E(t,4,this.length),this[t]*16777216+(this[t+1]<<16|this[t+2]<<8|this[t+3])},o.prototype.readBigUInt64LE=k(function(t){t=t>>>0,L(t,"offset");const r=this[t],e=this[t+7];(r===void 0||e===void 0)&&j(t,this.length-8);const n=r+this[++t]*2**8+this[++t]*2**16+this[++t]*2**24,s=this[++t]+this[++t]*2**8+this[++t]*2**16+e*2**24;return BigInt(n)+(BigInt(s)<>>0,L(t,"offset");const r=this[t],e=this[t+7];(r===void 0||e===void 0)&&j(t,this.length-8);const n=r*2**24+this[++t]*2**16+this[++t]*2**8+this[++t],s=this[++t]*2**24+this[++t]*2**16+this[++t]*2**8+e;return(BigInt(n)<>>0,r=r>>>0,e||E(t,r,this.length);let n=this[t],s=1,u=0;for(;++u=s&&(n-=Math.pow(2,8*r)),n},o.prototype.readIntBE=function(t,r,e){t=t>>>0,r=r>>>0,e||E(t,r,this.length);let n=r,s=1,u=this[t+--n];for(;n>0&&(s*=256);)u+=this[t+--n]*s;return s*=128,u>=s&&(u-=Math.pow(2,8*r)),u},o.prototype.readInt8=function(t,r){return t=t>>>0,r||E(t,1,this.length),this[t]&128?(255-this[t]+1)*-1:this[t]},o.prototype.readInt16LE=function(t,r){t=t>>>0,r||E(t,2,this.length);const e=this[t]|this[t+1]<<8;return e&32768?e|4294901760:e},o.prototype.readInt16BE=function(t,r){t=t>>>0,r||E(t,2,this.length);const e=this[t+1]|this[t]<<8;return e&32768?e|4294901760:e},o.prototype.readInt32LE=function(t,r){return t=t>>>0,r||E(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},o.prototype.readInt32BE=function(t,r){return t=t>>>0,r||E(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},o.prototype.readBigInt64LE=k(function(t){t=t>>>0,L(t,"offset");const r=this[t],e=this[t+7];(r===void 0||e===void 0)&&j(t,this.length-8);const n=this[t+4]+this[t+5]*2**8+this[t+6]*2**16+(e<<24);return(BigInt(n)<>>0,L(t,"offset");const r=this[t],e=this[t+7];(r===void 0||e===void 0)&&j(t,this.length-8);const n=(r<<24)+this[++t]*2**16+this[++t]*2**8+this[++t];return(BigInt(n)<>>0,r||E(t,4,this.length),h.read(this,t,!0,23,4)},o.prototype.readFloatBE=function(t,r){return t=t>>>0,r||E(t,4,this.length),h.read(this,t,!1,23,4)},o.prototype.readDoubleLE=function(t,r){return t=t>>>0,r||E(t,8,this.length),h.read(this,t,!0,52,8)},o.prototype.readDoubleBE=function(t,r){return t=t>>>0,r||E(t,8,this.length),h.read(this,t,!1,52,8)};function U(i,t,r,e,n,s){if(!o.isBuffer(i))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>n||ti.length)throw new RangeError("Index out of range")}o.prototype.writeUintLE=o.prototype.writeUIntLE=function(t,r,e,n){if(t=+t,r=r>>>0,e=e>>>0,!n){const d=Math.pow(2,8*e)-1;U(this,t,r,e,d,0)}let s=1,u=0;for(this[r]=t&255;++u>>0,e=e>>>0,!n){const d=Math.pow(2,8*e)-1;U(this,t,r,e,d,0)}let s=e-1,u=1;for(this[r+s]=t&255;--s>=0&&(u*=256);)this[r+s]=t/u&255;return r+e},o.prototype.writeUint8=o.prototype.writeUInt8=function(t,r,e){return t=+t,r=r>>>0,e||U(this,t,r,1,255,0),this[r]=t&255,r+1},o.prototype.writeUint16LE=o.prototype.writeUInt16LE=function(t,r,e){return t=+t,r=r>>>0,e||U(this,t,r,2,65535,0),this[r]=t&255,this[r+1]=t>>>8,r+2},o.prototype.writeUint16BE=o.prototype.writeUInt16BE=function(t,r,e){return t=+t,r=r>>>0,e||U(this,t,r,2,65535,0),this[r]=t>>>8,this[r+1]=t&255,r+2},o.prototype.writeUint32LE=o.prototype.writeUInt32LE=function(t,r,e){return t=+t,r=r>>>0,e||U(this,t,r,4,4294967295,0),this[r+3]=t>>>24,this[r+2]=t>>>16,this[r+1]=t>>>8,this[r]=t&255,r+4},o.prototype.writeUint32BE=o.prototype.writeUInt32BE=function(t,r,e){return t=+t,r=r>>>0,e||U(this,t,r,4,4294967295,0),this[r]=t>>>24,this[r+1]=t>>>16,this[r+2]=t>>>8,this[r+3]=t&255,r+4};function st(i,t,r,e,n){ft(t,e,n,i,r,7);let s=Number(t&BigInt(4294967295));i[r++]=s,s=s>>8,i[r++]=s,s=s>>8,i[r++]=s,s=s>>8,i[r++]=s;let u=Number(t>>BigInt(32)&BigInt(4294967295));return i[r++]=u,u=u>>8,i[r++]=u,u=u>>8,i[r++]=u,u=u>>8,i[r++]=u,r}function ut(i,t,r,e,n){ft(t,e,n,i,r,7);let s=Number(t&BigInt(4294967295));i[r+7]=s,s=s>>8,i[r+6]=s,s=s>>8,i[r+5]=s,s=s>>8,i[r+4]=s;let u=Number(t>>BigInt(32)&BigInt(4294967295));return i[r+3]=u,u=u>>8,i[r+2]=u,u=u>>8,i[r+1]=u,u=u>>8,i[r]=u,r+8}o.prototype.writeBigUInt64LE=k(function(t,r=0){return st(this,t,r,BigInt(0),BigInt("0xffffffffffffffff"))}),o.prototype.writeBigUInt64BE=k(function(t,r=0){return ut(this,t,r,BigInt(0),BigInt("0xffffffffffffffff"))}),o.prototype.writeIntLE=function(t,r,e,n){if(t=+t,r=r>>>0,!n){const g=Math.pow(2,8*e-1);U(this,t,r,e,g-1,-g)}let s=0,u=1,d=0;for(this[r]=t&255;++s>0)-d&255;return r+e},o.prototype.writeIntBE=function(t,r,e,n){if(t=+t,r=r>>>0,!n){const g=Math.pow(2,8*e-1);U(this,t,r,e,g-1,-g)}let s=e-1,u=1,d=0;for(this[r+s]=t&255;--s>=0&&(u*=256);)t<0&&d===0&&this[r+s+1]!==0&&(d=1),this[r+s]=(t/u>>0)-d&255;return r+e},o.prototype.writeInt8=function(t,r,e){return t=+t,r=r>>>0,e||U(this,t,r,1,127,-128),t<0&&(t=255+t+1),this[r]=t&255,r+1},o.prototype.writeInt16LE=function(t,r,e){return t=+t,r=r>>>0,e||U(this,t,r,2,32767,-32768),this[r]=t&255,this[r+1]=t>>>8,r+2},o.prototype.writeInt16BE=function(t,r,e){return t=+t,r=r>>>0,e||U(this,t,r,2,32767,-32768),this[r]=t>>>8,this[r+1]=t&255,r+2},o.prototype.writeInt32LE=function(t,r,e){return t=+t,r=r>>>0,e||U(this,t,r,4,2147483647,-2147483648),this[r]=t&255,this[r+1]=t>>>8,this[r+2]=t>>>16,this[r+3]=t>>>24,r+4},o.prototype.writeInt32BE=function(t,r,e){return t=+t,r=r>>>0,e||U(this,t,r,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),this[r]=t>>>24,this[r+1]=t>>>16,this[r+2]=t>>>8,this[r+3]=t&255,r+4},o.prototype.writeBigInt64LE=k(function(t,r=0){return st(this,t,r,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))}),o.prototype.writeBigInt64BE=k(function(t,r=0){return ut(this,t,r,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))});function lt(i,t,r,e,n,s){if(r+e>i.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function ct(i,t,r,e,n){return t=+t,r=r>>>0,n||lt(i,t,r,4),h.write(i,t,r,e,23,4),r+4}o.prototype.writeFloatLE=function(t,r,e){return ct(this,t,r,!0,e)},o.prototype.writeFloatBE=function(t,r,e){return ct(this,t,r,!1,e)};function at(i,t,r,e,n){return t=+t,r=r>>>0,n||lt(i,t,r,8),h.write(i,t,r,e,52,8),r+8}o.prototype.writeDoubleLE=function(t,r,e){return at(this,t,r,!0,e)},o.prototype.writeDoubleBE=function(t,r,e){return at(this,t,r,!1,e)},o.prototype.copy=function(t,r,e,n){if(!o.isBuffer(t))throw new TypeError("argument should be a Buffer");if(e||(e=0),!n&&n!==0&&(n=this.length),r>=t.length&&(r=t.length),r||(r=0),n>0&&n=this.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-r>>0,e=e===void 0?this.length:e>>>0,t||(t=0);let s;if(typeof t=="number")for(s=r;s2**32?n=ht(String(r)):typeof r=="bigint"&&(n=String(r),(r>BigInt(2)**BigInt(32)||r<-(BigInt(2)**BigInt(32)))&&(n=ht(n)),n+="n"),e+=` It must be ${t}. Received ${n}`,e},RangeError);function ht(i){let t="",r=i.length;const e=i[0]==="-"?1:0;for(;r>=e+4;r-=3)t=`_${i.slice(r-3,r)}${t}`;return`${i.slice(0,r)}${t}`}function Lt(i,t,r){L(t,"offset"),(i[t]===void 0||i[t+r]===void 0)&&j(t,i.length-(r+1))}function ft(i,t,r,e,n,s){if(i>r||i3?t===0||t===BigInt(0)?d=`>= 0${u} and < 2${u} ** ${(s+1)*8}${u}`:d=`>= -(2${u} ** ${(s+1)*8-1}${u}) and < 2 ** ${(s+1)*8-1}${u}`:d=`>= ${t}${u} and <= ${r}${u}`,new N.ERR_OUT_OF_RANGE("value",d,i)}Lt(e,n,s)}function L(i,t){if(typeof i!="number")throw new N.ERR_INVALID_ARG_TYPE(t,"number",i)}function j(i,t,r){throw Math.floor(i)!==i?(L(i,r),new N.ERR_OUT_OF_RANGE(r||"offset","an integer",i)):t<0?new N.ERR_BUFFER_OUT_OF_BOUNDS:new N.ERR_OUT_OF_RANGE(r||"offset",`>= ${r?1:0} and <= ${t}`,i)}const $t=/[^+/0-9A-Za-z-_]/g;function Mt(i){if(i=i.split("=")[0],i=i.trim().replace($t,""),i.length<2)return"";for(;i.length%4!==0;)i=i+"=";return i}function z(i,t){t=t||1/0;let r;const e=i.length;let n=null;const s=[];for(let u=0;u55295&&r<57344){if(!n){if(r>56319){(t-=3)>-1&&s.push(239,191,189);continue}else if(u+1===e){(t-=3)>-1&&s.push(239,191,189);continue}n=r;continue}if(r<56320){(t-=3)>-1&&s.push(239,191,189),n=r;continue}r=(n-55296<<10|r-56320)+65536}else n&&(t-=3)>-1&&s.push(239,191,189);if(n=null,r<128){if((t-=1)<0)break;s.push(r)}else if(r<2048){if((t-=2)<0)break;s.push(r>>6|192,r&63|128)}else if(r<65536){if((t-=3)<0)break;s.push(r>>12|224,r>>6&63|128,r&63|128)}else if(r<1114112){if((t-=4)<0)break;s.push(r>>18|240,r>>12&63|128,r>>6&63|128,r&63|128)}else throw new Error("Invalid code point")}return s}function Dt(i){const t=[];for(let r=0;r>8,n=r%256,s.push(n),s.push(e);return s}function pt(i){return l.toByteArray(Mt(i))}function V(i,t,r,e){let n;for(n=0;n=t.length||n>=i.length);++n)t[n+r]=i[n];return n}function S(i,t){return i instanceof t||i!=null&&i.constructor!=null&&i.constructor.name!=null&&i.constructor.name===t.name}function K(i){return i!==i}const Gt=function(){const i="0123456789abcdef",t=new Array(256);for(let r=0;r<16;++r){const e=r*16;for(let n=0;n<16;++n)t[e+n]=i[r]+i[n]}return t}();function k(i){return typeof BigInt>"u"?jt:i}function jt(){throw new Error("BigInt not supported")}})(gt);const ur={name:"cloudPlaylist",components:{Cover:Vt,Card:Yt},props:{playlist:Object,localPlaylists:Array,cloudPlaylists:Array},data(){return{statusText:"",toAdd:[]}},methods:{parseCover:qt,async import(){if(this.statusIcon!="cloud_done"){if(this.statusIcon=="cloud_sync"){for(let c=0;cp.name==this.playlist.name))==null?void 0:h[0];if(!l)return this.localPlaylists?"cloud":"cloud_off";if(this.playlist.description!=l.description)return"cloud_sync";this.toAdd=[];for(let p=0;p[_("span",{class:"close material-symbols-rounded",onClick:l[0]||(l[0]=()=>c.$emit("remove"))},"close"),Y(a,{src:f.cover},null,8,["src"]),_("div",lr,[_("h2",null,$(h.playlist.name),1),_("div",cr,[yt($(h.playlist.songs.length)+" "+$(h.playlist.songs.length==1?"song":"songs"),1),h.playlist.description?(D(),q(Bt,{key:0},[yt(" • "),_("i",null,$(h.playlist.description),1)],64)):dt("",!0)]),_("div",ar,[_("span",hr,$(f.statusIcon),1),p.statusText?(D(),q("div",fr,[_("i",null,$(p.statusText),1)])):dt("",!0)])])]),_:1})}const yr=wt(ur,[["render",pr],["__scopeId","data-v-c0711eb3"]]);window.Buffer=gt.Buffer;new Ht("reapApollo");const dr={name:"import",methods:{downloadFile(){var c="data:text/json;charset=utf-8,"+encodeURIComponent(JSON.stringify(this.playlists)),l=document.getElementById("downloadAnchorElem");l.setAttribute("href",c),l.setAttribute("download","lib.one.json"),l.click()},async openGist(){window.open(await Z.gistUrl(),"_blank")},async upload(){console.log(await Z.saveOrUpdate(this.playlists)),this.fetchGists()},async fetchGists(){this.cloudPlaylists=await Z.getContent()},async fetchLocalPlaylists(){var c;if(!this.loadingPlaylists){this.loadingPlaylists=!0,this.playlists=[];for(const l of(c=this.dataStore)==null?void 0:c.playlists)try{const y=await(await fetch(`/api/playlists/${l.id}`)).json();this.playlists.push(y)}catch(h){console.error(h)}this.loadingPlaylists=!1}}},watch:{dataStore:{handler(c,l){this.fetchLocalPlaylists()},deep:!0}},mounted(){this.fetchLocalPlaylists()},data(){return this.fetchGists(),{playlists:[],loadingPlaylists:!1,userData:{},cloudPlaylists:[],dataStore:Xt()}},components:{IconButton:Qt,CloudPlaylist:yr}},tt=c=>(Kt("data-v-5394d716"),c=c(),Zt(),c),wr={class:"export"},xr={class:"action"},Br=tt(()=>_("h1",null,"Save to File",-1)),gr=tt(()=>_("a",{id:"downloadAnchorElem",style:{display:"none"}},null,-1)),mr={class:"action"},Er=tt(()=>_("h1",null,"Save to Github Gists",-1)),Ir={class:"flex flex-row gap-2"},Fr={class:"data"};function _r(c,l,h,y,p,f){const a=W("IconButton"),o=W("CloudPlaylist");return D(),q("div",wr,[_("div",xr,[Br,gr,Y(a,{icon:"file_download",label:"Save",onClick:f.downloadFile},null,8,["onClick"])]),_("div",mr,[Er,_("div",Ir,[Y(a,{icon:"cloud_upload",label:"Synchronise",onClick:f.upload},null,8,["onClick"]),Y(a,{icon:"link",label:"Browse",onClick:f.openGist},null,8,["onClick"])])]),_("div",Fr,[(D(!0),q(Bt,null,zt(p.playlists,(w,C)=>(D(),xt(o,{key:C,cloudPlaylists:p.cloudPlaylists,playlist:w,onRemove:()=>p.playlists.splice(C,1)},null,8,["cloudPlaylists","playlist","onRemove"]))),128))])])}const Sr=wt(dr,[["render",_r],["__scopeId","data-v-5394d716"]]);export{Sr as default};
diff --git a/src/ui/dist/assets/Export-c1d2ed46.js.gz b/src/ui/dist/assets/Export-c1d2ed46.js.gz
new file mode 100644
index 000000000..9b85a93e3
Binary files /dev/null and b/src/ui/dist/assets/Export-c1d2ed46.js.gz differ
diff --git a/src/ui/dist/assets/ExternalEntry-625169b8.css b/src/ui/dist/assets/ExternalEntry-1ad4a4e1.css
similarity index 80%
rename from src/ui/dist/assets/ExternalEntry-625169b8.css
rename to src/ui/dist/assets/ExternalEntry-1ad4a4e1.css
index c502ae09d..2348dc8bd 100644
--- a/src/ui/dist/assets/ExternalEntry-625169b8.css
+++ b/src/ui/dist/assets/ExternalEntry-1ad4a4e1.css
@@ -1,4 +1,4 @@
-.playlisteditor[data-v-46f31e97]{display:flex;flex-direction:row;margin-bottom:20px;align-items:center}.playlisteditor img[data-v-46f31e97]{width:20%;margin-right:20px;border-radius:5px}@media screen and (max-width: 950px){.playlisteditor[data-v-46f31e97]{flex-direction:column}.playlisteditor img[data-v-46f31e97]{align-self:center;width:40%;margin-right:0}}.playlisteditor>.details[data-v-46f31e97]{flex:1;display:flex;flex-direction:column;justify-content:flex-end;align-self:end}.playlisteditor>.details>h1[data-v-46f31e97]{font-size:2em;margin-top:10px;margin-bottom:10px}@media screen and (max-width: 950px){.playlisteditor>.details>h1[data-v-46f31e97]{font-size:1.4em}}.playlisteditor>.details>.detailswrapper[data-v-46f31e97]{font-size:.8em;display:flex;flex-direction:row;justify-content:flex-start}@media screen and (max-width: 950px){.playlisteditor>.details>.detailswrapper[data-v-46f31e97]{justify-content:center}}.playlisteditor>.details>.detailswrapper>.material-icons-round[data-v-46f31e97]{line-height:15px;font-size:15px;cursor:pointer}.playlisteditor>.details>.detailswrapper>.material-icons-round[data-v-46f31e97]:not(:first-child){margin-left:10px}.playlisteditor>.details>h5[data-v-46f31e97]{font-size:.8em;margin:0}/*!
+.playlisteditor[data-v-eab2eaeb]{display:flex;flex-direction:row;margin-bottom:20px;align-items:center}.playlisteditor img[data-v-eab2eaeb]{width:20%;margin-right:20px;border-radius:5px}@media screen and (max-width: 950px){.playlisteditor[data-v-eab2eaeb]{flex-direction:column}.playlisteditor img[data-v-eab2eaeb]{align-self:center;width:40%;margin-right:0}}.playlisteditor>.details[data-v-eab2eaeb]{flex:1;display:flex;flex-direction:column;justify-content:flex-end;align-self:end}.playlisteditor>.details>h1[data-v-eab2eaeb]{font-size:2em;margin-top:10px;margin-bottom:10px}@media screen and (max-width: 950px){.playlisteditor>.details>h1[data-v-eab2eaeb]{font-size:1.4em}}.playlisteditor>.details>.detailswrapper[data-v-eab2eaeb]{font-size:.8em;display:flex;flex-direction:row;justify-content:flex-start}@media screen and (max-width: 950px){.playlisteditor>.details>.detailswrapper[data-v-eab2eaeb]{justify-content:center}}.playlisteditor>.details>.detailswrapper>.material-icons-round[data-v-eab2eaeb]{line-height:15px;font-size:15px;cursor:pointer}.playlisteditor>.details>.detailswrapper>.material-icons-round[data-v-eab2eaeb]:not(:first-child){margin-left:10px}.playlisteditor>.details>h5[data-v-eab2eaeb]{font-size:.8em;margin:0}/*!
* Copyright (c) 2023, reAudioPlayer ONE.
* Licenced under the GNU General Public License v3.0
*/.playlist-entry[data-v-2482bde4]{display:grid;grid-template-columns:50px 40px 1fr 1fr 40px;gap:10px;padding:10px 0;border-radius:20px;border:1px solid transparent}.playlist-entry .artist-title[data-v-2482bde4]{grid-column:3/4}.playlist-entry:not(.withCover) .artist-title[data-v-2482bde4]{grid-column-start:2}.playlist-entry:not(.withAlbum) .artist-title[data-v-2482bde4]{grid-column-end:5}.playlist-entry div[data-v-2482bde4]{overflow:hidden}.playlist-entry .index[data-v-2482bde4],.playlist-entry .album[data-v-2482bde4],.playlist-entry .duration[data-v-2482bde4],.playlist-entry .icon[data-v-2482bde4]{margin:auto 0;font-size:.9rem;color:var(--fg-base-dk)}.playlist-entry .index.index[data-v-2482bde4],.playlist-entry .album.index[data-v-2482bde4],.playlist-entry .duration.index[data-v-2482bde4],.playlist-entry .icon.index[data-v-2482bde4]{cursor:pointer}.playlist-entry .index.icon[data-v-2482bde4],.playlist-entry .album.icon[data-v-2482bde4],.playlist-entry .duration.icon[data-v-2482bde4],.playlist-entry .icon.icon[data-v-2482bde4]{font-size:1.3rem;cursor:pointer;font-variation-settings:"wght" 500}.playlist-entry .index.icon.favourite[data-v-2482bde4],.playlist-entry .album.icon.favourite[data-v-2482bde4],.playlist-entry .duration.icon.favourite[data-v-2482bde4],.playlist-entry .icon.icon.favourite[data-v-2482bde4]{font-variation-settings:"FILL" 1}.playlist-entry.hovering[data-v-2482bde4]{background-color:var(--bg-hover-dk);border:var(--border-container)}.playlist-entry.hovering .index[data-v-2482bde4]{font-size:1.5rem;font-variation-settings:"FILL" 1}.playlist-entry.selected[data-v-2482bde4]{background-color:var(--bg-hover)}.playlist-entry .favourite-icon[data-v-2482bde4]{grid-column:5}.playlist-entry .duration[data-v-2482bde4]{grid-column:6}.playlist-entry .cover[data-v-2482bde4]{display:flex;justify-content:center}.playlist-entry img[data-v-2482bde4]{border-radius:4px;margin:auto 0}.playlist-entry .artist-title[data-v-2482bde4]{display:grid;grid-template-rows:1fr 1fr}.playlist-entry .artist-title .artist[data-v-2482bde4]{font-size:.8rem;color:var(--fg-base-dk)}.playlist-entry .artist-title span[data-v-2482bde4]{max-width:-moz-min-content;max-width:min-content;overflow:hidden}.playlist-entry.playing .title[data-v-2482bde4],.playlist-entry.playing .index[data-v-2482bde4]{color:var(--fg-secondary)}.playlist-entry.hovering .artist[data-v-2482bde4],.playlist-entry.hovering .album[data-v-2482bde4],.playlist-entry.selected .artist[data-v-2482bde4],.playlist-entry.selected .album[data-v-2482bde4]{color:var(--fg-base)}@media screen and (max-width: 768px){.playlist-entry[data-v-2482bde4]{padding:5px 0;border-radius:10px;grid-template-columns:30px 40px 1fr 1fr 30px 40px}.playlist-entry .index[data-v-2482bde4],.playlist-entry .duration[data-v-2482bde4]{font-size:.7rem}.playlist-entry .artist-title[data-v-2482bde4]{grid-column-end:5;font-size:.8rem}.playlist-entry .artist-title .artist[data-v-2482bde4]{font-size:.65rem}}
diff --git a/src/ui/dist/assets/ExternalEntry-1ad4a4e1.css.gz b/src/ui/dist/assets/ExternalEntry-1ad4a4e1.css.gz
new file mode 100644
index 000000000..ed7c55edd
Binary files /dev/null and b/src/ui/dist/assets/ExternalEntry-1ad4a4e1.css.gz differ
diff --git a/src/ui/dist/assets/ExternalEntry-8bf31741.js b/src/ui/dist/assets/ExternalEntry-4cf58b98.js
similarity index 67%
rename from src/ui/dist/assets/ExternalEntry-8bf31741.js
rename to src/ui/dist/assets/ExternalEntry-4cf58b98.js
index f3a1d220e..1b23b1506 100644
--- a/src/ui/dist/assets/ExternalEntry-8bf31741.js
+++ b/src/ui/dist/assets/ExternalEntry-4cf58b98.js
@@ -1 +1 @@
-import{n as x,o as r,c as m,a as n,F as A,i as N,t as y,_ as E,j as M,q as d,f as k,w as I,g as f,u as _,b$ as P,bN as T,bR as O,x as j,B as D,A as S,d as b,aH as q,h as F,M as $,b1 as V,bW as W,cg as H,bG as z,cj as G}from"./index-d3fba034.js";import{T as J}from"./Template-deebb6b8.js";import{F as L}from"./Form-f0cd8cf2.js";const R={class:"padding-20 playlisteditor"},K=["src"],Q={class:"details"},U={class:"detailswrapper"},X=["onClick"],Y=x({__name:"TrackInfo",props:{title:{type:String,required:!0},subtitle:{type:String,required:!0},cover:{type:String,required:!0},icons:{type:Array,required:!0}},setup(e){return(g,t)=>(r(),m("div",R,[n("img",{src:e.cover,class:"cover"},null,8,K),n("div",Q,[n("div",U,[(r(!0),m(A,null,N(e.icons,(l,i)=>(r(),m("span",{key:i,class:"material-icons-round",onClick:l.onClick},y(l.name),9,X))),128))]),n("h1",null,y(e.title),1),n("h6",null,y(e.subtitle),1)])]))}});const Z=E(Y,[["__scopeId","data-v-46f31e97"]]),ee=x({__name:"ImportSpotifySong",props:{song:{type:Object,required:!0}},setup(e,{expose:g}){const t=e,l=M(),i=d([{name:"playlist",type:"dropdown",icon:"playlist_add",required:!0,value:null,options:l.playlistsAsDropdown}]),a=d(null),v=d(null),c=d(null),p=async()=>{if(c.value){a.value.show();return}const o=await a.value.fetch("/api/browse/track",{method:"POST",body:JSON.stringify({url:t.song.href})});o&&(a.value.load(),c.value=await o.json(),a.value.show())},C=()=>{const o=new CustomEvent("player.play",{detail:{artist:t.song.artist,title:t.song.title,source:t.song.href}});window.dispatchEvent(o)},u=async o=>{if(o==="new"){const s=await j(t.song.title,t.song.artist,t.song.cover);return i.value[0].options=l.playlistsAsDropdown,i.value[0].value=s,s}return o},h=async(o,s=null)=>{var w;s??(s=v.value.toObject().playlist),console.log(s),s=await u(s),await T(s,c.value),t.song.added=!0,O.addSuccess(c.value.title,`Added to ${(w=l.playlists.find(B=>B.id==s))==null?void 0:w.name}`,3e3)};return g({show:p}),(o,s)=>(r(),k(J,{ref_key:"modal",ref:a,submit:{label:"Add",icon:"add"},name:"Import Song",onClose:s[0]||(s[0]=w=>o.$emit("close")),onSubmit:h},{default:I(()=>[f(Z,{cover:e.song.cover,icons:[{name:"share",onClick:()=>_(P)(e.song.href)},{name:"play_arrow",onClick:C}],title:e.song.title},null,8,["cover","icons","title"]),f(L,{ref_key:"form",ref:v,options:i.value},null,8,["options"])]),_:1},512))}}),te={key:0,class:"cover"},se={class:"artist-title"},ae={class:"title"},ne={class:"artist"},oe={key:1,class:"album"},le=["onClick"],re=x({__name:"ExternalEntry",props:{song:{type:Object,required:!0},index:{type:Number,required:!0},withCover:{type:Boolean,required:!1,default:!1},withAlbum:{type:Boolean,required:!1,default:!1},selected:{type:Boolean,required:!1,default:!1},playlistId:{type:Number,required:!1,default:null},canImport:{type:Boolean,required:!1,default:!1}},emits:["update","add"],setup(e,{emit:g}){const t=e,l=D(),i=S(()=>t.song.id==l.song.id),a=d(!1);S(()=>t.playlistId==null?l.playlist.id:t.playlistId);const v=()=>{G(t.song.title,t.song.artist,t.song.source||t.song.href)},c=d(null),p=()=>{t.canImport?c.value.show():g("add")};return(C,u)=>(r(),m(A,null,[e.canImport?(r(),k(ee,{key:0,ref_key:"updatePopup",ref:c,song:e.song},null,8,["song"])):b("",!0),n("div",{class:q([{playing:_(i),selected:e.selected,hovering:a.value,withCover:e.withCover,withAlbum:e.withAlbum},"playlist-entry"]),onDblclick:v,onMouseenter:u[0]||(u[0]=h=>a.value=!0),onMouseleave:u[1]||(u[1]=h=>a.value=!1)},[n("div",{class:q([{"material-symbols-rounded":a.value},"index text-right"]),onClick:v},y(a.value?"play_arrow":e.index+1),3),e.withCover?(r(),m("div",te,[f(F,{src:e.song.cover,type:"track"},null,8,["src"])])):b("",!0),n("div",se,[n("span",ae,[(r(),k(V(e.song.href.startsWith("http")?"a":"router-link"),{href:e.song.href,to:e.song.href,class:"linkOnHover"},{default:I(()=>[f($,{text:e.song.title},null,8,["text"])]),_:1},8,["href","to"]))]),n("span",ne,[f(W,{artist:e.song.artist,class:"text-muted text-xs"},null,8,["artist"])])]),e.withAlbum&&!_(H)?(r(),m("div",oe,[f($,{text:e.song.album},null,8,["text"])])):b("",!0),n("div",{class:"icon text-left material-symbols-rounded",onClick:z(p,["stop"])},y(e.song.added?"done":"add"),9,le)],34)],64))}});const de=E(re,[["__scopeId","data-v-2482bde4"]]);export{de as E,Z as T,ee as _};
+import{n as x,o as r,c as m,a as n,F as A,i as M,t as y,_ as E,j as N,q as d,f as k,w as I,g as f,u as _,b_ as P,bM as T,bQ as O,x as D,B as j,A as S,d as w,aH as q,h as F,M as $,b1 as V,bV as H,cf as W,bG as z,ci as G}from"./index-1856ec92.js";import{T as J}from"./Template-8c03613c.js";import{F as L}from"./Form-d27a37bd.js";const Q={class:"padding-20 playlisteditor"},K=["src"],R={class:"details"},U={class:"detailswrapper"},X=["onClick"],Y=x({__name:"TrackInfo",props:{title:{type:String,required:!0},subtitle:{type:String,required:!0},cover:{type:String,required:!0},icons:{type:Array,required:!0}},setup(e){return(g,t)=>(r(),m("div",Q,[n("img",{src:e.cover,class:"cover"},null,8,K),n("div",R,[n("div",U,[(r(!0),m(A,null,M(e.icons,(l,i)=>(r(),m("span",{key:i,class:"material-icons-round",onClick:l.onClick},y(l.name),9,X))),128))]),n("h1",null,y(e.title),1),n("h6",null,y(e.subtitle),1)])]))}});const Z=E(Y,[["__scopeId","data-v-eab2eaeb"]]),ee=x({__name:"ImportSpotifySong",props:{song:{type:Object,required:!0}},setup(e,{expose:g}){const t=e,l=N(),i=d([{name:"playlist",type:"dropdown",icon:"playlist_add",required:!0,value:null,options:l.playlistsAsDropdown}]),a=d(null),v=d(null),c=d(null),p=async()=>{if(c.value){a.value.show();return}const o=await a.value.fetch("/api/browse/track",{method:"POST",body:JSON.stringify({url:t.song.href})});o&&(a.value.load(),c.value=await o.json(),a.value.show())},C=()=>{const o=new CustomEvent("player.play",{detail:{artist:t.song.artist,title:t.song.title,source:t.song.href}});window.dispatchEvent(o)},u=async o=>{if(o==="new"){const s=await D(t.song.title,t.song.artist,t.song.cover);return i.value[0].options=l.playlistsAsDropdown,i.value[0].value=s,s}return o},h=async(o,s=null)=>{var b;s??(s=v.value.toObject().playlist),console.log(s),s=await u(s),await T(s,c.value),t.song.added=!0,O.addSuccess(c.value.title,`Added to ${(b=l.playlists.find(B=>B.id==s))==null?void 0:b.name}`,3e3)};return g({show:p}),(o,s)=>(r(),k(J,{ref_key:"modal",ref:a,submit:{label:"Add",icon:"add"},name:"Import Song",onClose:s[0]||(s[0]=b=>o.$emit("close")),onSubmit:h},{default:I(()=>[f(Z,{cover:e.song.cover,icons:[{name:"share",onClick:()=>_(P)(e.song.href)},{name:"play_arrow",onClick:C}],title:e.song.title},null,8,["cover","icons","title"]),f(L,{ref_key:"form",ref:v,options:i.value},null,8,["options"])]),_:1},512))}}),te={key:0,class:"cover"},se={class:"artist-title"},ae={class:"title"},ne={class:"artist"},oe={key:1,class:"album"},le=["onClick"],re=x({__name:"ExternalEntry",props:{song:{type:Object,required:!0},index:{type:Number,required:!0},withCover:{type:Boolean,required:!1,default:!1},withAlbum:{type:Boolean,required:!1,default:!1},selected:{type:Boolean,required:!1,default:!1},playlistId:{type:Number,required:!1,default:null},canImport:{type:Boolean,required:!1,default:!1}},emits:["update","add"],setup(e,{emit:g}){const t=e,l=j(),i=S(()=>t.song.id==l.song.id),a=d(!1);S(()=>t.playlistId==null?l.playlist.id:t.playlistId);const v=()=>{G(t.song.title,t.song.artist,t.song.source||t.song.href)},c=d(null),p=()=>{t.canImport?c.value.show():g("add")};return(C,u)=>(r(),m(A,null,[e.canImport?(r(),k(ee,{key:0,ref_key:"updatePopup",ref:c,song:e.song},null,8,["song"])):w("",!0),n("div",{class:q([{playing:_(i),selected:e.selected,hovering:a.value,withCover:e.withCover,withAlbum:e.withAlbum},"playlist-entry"]),onDblclick:v,onMouseenter:u[0]||(u[0]=h=>a.value=!0),onMouseleave:u[1]||(u[1]=h=>a.value=!1)},[n("div",{class:q([{"material-symbols-rounded":a.value},"index text-right"]),onClick:v},y(a.value?"play_arrow":e.index+1),3),e.withCover?(r(),m("div",te,[f(F,{src:e.song.cover,type:"track"},null,8,["src"])])):w("",!0),n("div",se,[n("span",ae,[(r(),k(V(e.song.href.startsWith("http")?"a":"router-link"),{href:e.song.href,to:e.song.href,class:"linkOnHover"},{default:I(()=>[f($,{text:e.song.title},null,8,["text"])]),_:1},8,["href","to"]))]),n("span",ne,[f(H,{artist:e.song.artist,class:"text-muted text-xs"},null,8,["artist"])])]),e.withAlbum&&!_(W)?(r(),m("div",oe,[f($,{text:e.song.album},null,8,["text"])])):w("",!0),n("div",{class:"icon text-left material-symbols-rounded",onClick:z(p,["stop"])},y(e.song.added?"done":"add"),9,le)],34)],64))}});const de=E(re,[["__scopeId","data-v-2482bde4"]]);export{de as E,Z as T,ee as _};
diff --git a/src/ui/dist/assets/ExternalEntry-4cf58b98.js.gz b/src/ui/dist/assets/ExternalEntry-4cf58b98.js.gz
new file mode 100644
index 000000000..3bde85a4c
Binary files /dev/null and b/src/ui/dist/assets/ExternalEntry-4cf58b98.js.gz differ
diff --git a/src/ui/dist/assets/ExternalEntry-625169b8.css.gz b/src/ui/dist/assets/ExternalEntry-625169b8.css.gz
deleted file mode 100644
index d450fd73e..000000000
Binary files a/src/ui/dist/assets/ExternalEntry-625169b8.css.gz and /dev/null differ
diff --git a/src/ui/dist/assets/ExternalEntry-8bf31741.js.gz b/src/ui/dist/assets/ExternalEntry-8bf31741.js.gz
deleted file mode 100644
index 54c35636d..000000000
Binary files a/src/ui/dist/assets/ExternalEntry-8bf31741.js.gz and /dev/null differ
diff --git a/src/ui/dist/assets/FactCard-6153b002.js b/src/ui/dist/assets/FactCard-e476ac4b.js
similarity index 88%
rename from src/ui/dist/assets/FactCard-6153b002.js
rename to src/ui/dist/assets/FactCard-e476ac4b.js
index 106f62124..36cdd9cb1 100644
--- a/src/ui/dist/assets/FactCard-6153b002.js
+++ b/src/ui/dist/assets/FactCard-e476ac4b.js
@@ -1 +1 @@
-import{n as s,f as c,w as o,C as r,o as t,a as n,t as a,c as d,d as l,_}from"./index-d3fba034.js";const i={class:"mx-4"},m={key:0,class:"my-0 text-muted"},p=s({__name:"FactCard",props:{withHover:{type:Boolean,default:!1},primaryText:{type:null,default:""},secondaryText:{type:String,default:"",required:!1}},setup(e){return(u,y)=>(t(),c(r,{"with-hover":e.withHover,class:"card p-4"},{default:o(()=>[n("h2",i,a(e.primaryText),1),e.secondaryText?(t(),d("p",m,a(e.secondaryText),1)):l("",!0)]),_:1},8,["with-hover"]))}});const f=_(p,[["__scopeId","data-v-23b147ec"]]);export{f as F};
+import{n as s,f as c,w as o,C as r,o as t,a as n,t as a,c as d,d as l,_}from"./index-1856ec92.js";const i={class:"mx-4"},m={key:0,class:"my-0 text-muted"},p=s({__name:"FactCard",props:{withHover:{type:Boolean,default:!1},primaryText:{type:null,default:""},secondaryText:{type:String,default:"",required:!1}},setup(e){return(u,y)=>(t(),c(r,{"with-hover":e.withHover,class:"card p-4"},{default:o(()=>[n("h2",i,a(e.primaryText),1),e.secondaryText?(t(),d("p",m,a(e.secondaryText),1)):l("",!0)]),_:1},8,["with-hover"]))}});const f=_(p,[["__scopeId","data-v-23b147ec"]]);export{f as F};
diff --git a/src/ui/dist/assets/Form-d27a37bd.js b/src/ui/dist/assets/Form-d27a37bd.js
new file mode 100644
index 000000000..0179e9eff
--- /dev/null
+++ b/src/ui/dist/assets/Form-d27a37bd.js
@@ -0,0 +1 @@
+import{n as f,o as l,c as s,F as m,i as g,a as n,t as C,u,cj as V,g as o,T as _,p as k,b_ as i,h as b,d as p,f as v,bD as U,br as w,_ as x}from"./index-1856ec92.js";import{D}from"./Dropdown-16096009.js";const F={class:"form"},$={class:"content"},j=["onClick"],q=["accept","onChange"],B={key:0,class:"imagePreview"},I=["onUpdate:modelValue","type","onChange"],N=f({__name:"Form",props:{options:{type:Array,required:!0}},setup(d,{expose:h}){const y=d;return h({toObject:()=>{const c={};return y.options.forEach(r=>{c[r.name]=r.value}),c}}),(c,r)=>(l(),s("div",F,[(l(!0),s(m,null,g(d.options,e=>(l(),s("div",{key:e.name,class:"option"},[n("h4",null,C(u(V)(e.name)),1),n("div",$,[e.type=="upload"?(l(),s(m,{key:0},[n("span",{class:"material-symbols-rounded icon-button",onClick:()=>{var a,t;return(t=(a=c.$refs["upload-"+e.name])==null?void 0:a[0])==null?void 0:t.click()}}," file_upload ",8,j),n("input",{ref_for:!0,ref:"upload-"+e.name,accept:e.accept,style:{display:"none"},type:"file",onChange:a=>e==null?void 0:e.onUpload(a.target.files[0])},null,40,q),o(_,{ref_for:!0,ref:"cover",modelValue:e.value,"onUpdate:modelValue":a=>e.value=a,icon:e.icon,class:"addSong cover",type:"text",onChange:a=>e==null?void 0:e.onChange(e.value)},null,8,["modelValue","onUpdate:modelValue","icon","onChange"]),e.imagePreview?(l(),s("div",B,[o(b,{src:u(k)(e.value),class:"cover",onClick:a=>u(i)(e.value)},null,8,["src","onClick"])])):p("",!0)],64)):e.type=="dropdown"?(l(),v(D,{key:1,modelValue:e.value,"onUpdate:modelValue":a=>e.value=a,icon:e.icon,options:e.options},null,8,["modelValue","onUpdate:modelValue","icon","options"])):e.type=="text"?(l(),v(_,{key:2,modelValue:e.value,"onUpdate:modelValue":a=>e.value=a,icon:e.icon,placeholder:e.placeholder,required:e.required,type:e.type,onChange:a=>e.onChange?e==null?void 0:e.onChange(e.value):null},null,8,["modelValue","onUpdate:modelValue","icon","placeholder","required","type","onChange"])):U((l(),s("input",{key:3,"onUpdate:modelValue":a=>e.value=a,type:e.type,onChange:a=>e.onChange?e==null?void 0:e.onChange(e.value):null},null,40,I)),[[w,e.value]])])]))),128))]))}});const P=x(N,[["__scopeId","data-v-f7f90291"]]);export{P as F};
diff --git a/src/ui/dist/assets/Form-d27a37bd.js.gz b/src/ui/dist/assets/Form-d27a37bd.js.gz
new file mode 100644
index 000000000..af8695d93
Binary files /dev/null and b/src/ui/dist/assets/Form-d27a37bd.js.gz differ
diff --git a/src/ui/dist/assets/Form-f0cd8cf2.js b/src/ui/dist/assets/Form-f0cd8cf2.js
deleted file mode 100644
index 3d378390f..000000000
--- a/src/ui/dist/assets/Form-f0cd8cf2.js
+++ /dev/null
@@ -1 +0,0 @@
-import{n as f,o as l,c as s,F as m,i as g,a as n,t as C,u,ck as V,g as o,T as _,p as k,b$ as i,h as b,d as p,f as v,bD as U,br as $,_ as w}from"./index-d3fba034.js";import{D as x}from"./Dropdown-b2449fcb.js";const D={class:"form"},F={class:"content"},q=["onClick"],B=["accept","onChange"],I={key:0,class:"imagePreview"},N=["onUpdate:modelValue","type","onChange"],T=f({__name:"Form",props:{options:{type:Array,required:!0}},setup(d,{expose:h}){const y=d;return h({toObject:()=>{const c={};return y.options.forEach(r=>{c[r.name]=r.value}),c}}),(c,r)=>(l(),s("div",D,[(l(!0),s(m,null,g(d.options,e=>(l(),s("div",{key:e.name,class:"option"},[n("h4",null,C(u(V)(e.name)),1),n("div",F,[e.type=="upload"?(l(),s(m,{key:0},[n("span",{class:"material-symbols-rounded icon-button",onClick:()=>{var a,t;return(t=(a=c.$refs["upload-"+e.name])==null?void 0:a[0])==null?void 0:t.click()}}," file_upload ",8,q),n("input",{ref_for:!0,ref:"upload-"+e.name,accept:e.accept,style:{display:"none"},type:"file",onChange:a=>e==null?void 0:e.onUpload(a.target.files[0])},null,40,B),o(_,{ref_for:!0,ref:"cover",modelValue:e.value,"onUpdate:modelValue":a=>e.value=a,icon:e.icon,class:"addSong cover",type:"text",onChange:a=>e==null?void 0:e.onChange(e.value)},null,8,["modelValue","onUpdate:modelValue","icon","onChange"]),e.imagePreview?(l(),s("div",I,[o(b,{src:u(k)(e.value),class:"cover",onClick:a=>u(i)(e.value)},null,8,["src","onClick"])])):p("",!0)],64)):e.type=="dropdown"?(l(),v(x,{key:1,modelValue:e.value,"onUpdate:modelValue":a=>e.value=a,icon:e.icon,options:e.options},null,8,["modelValue","onUpdate:modelValue","icon","options"])):e.type=="text"?(l(),v(_,{key:2,modelValue:e.value,"onUpdate:modelValue":a=>e.value=a,icon:e.icon,placeholder:e.placeholder,required:e.required,type:e.type,onChange:a=>e.onChange?e==null?void 0:e.onChange(e.value):null},null,8,["modelValue","onUpdate:modelValue","icon","placeholder","required","type","onChange"])):U((l(),s("input",{key:3,"onUpdate:modelValue":a=>e.value=a,type:e.type,onChange:a=>e.onChange?e==null?void 0:e.onChange(e.value):null},null,40,N)),[[$,e.value]])])]))),128))]))}});const P=w(T,[["__scopeId","data-v-f7f90291"]]);export{P as F};
diff --git a/src/ui/dist/assets/Form-f0cd8cf2.js.gz b/src/ui/dist/assets/Form-f0cd8cf2.js.gz
deleted file mode 100644
index 2a1642b7b..000000000
Binary files a/src/ui/dist/assets/Form-f0cd8cf2.js.gz and /dev/null differ
diff --git a/src/ui/dist/assets/FullShelf-261568ae.css b/src/ui/dist/assets/FullShelf-261568ae.css
new file mode 100644
index 000000000..a12580825
--- /dev/null
+++ b/src/ui/dist/assets/FullShelf-261568ae.css
@@ -0,0 +1 @@
+span.icon[data-v-fceb85d9]{transform:translateY(3px);margin-left:20px}.header[data-v-fceb85d9]{margin:10px 10px 0;display:flex;flex-direction:row;justify-content:space-between}.header>h2[data-v-fceb85d9]{align-self:flex-start;margin-top:0;margin-bottom:10px}.header>h5[data-v-fceb85d9]{text-transform:uppercase;align-self:center;margin:0}.header>h5[data-v-fceb85d9]:hover{cursor:pointer}.items[data-v-fceb85d9]{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));grid-template-rows:1fr;gap:1em;overflow-y:auto}
diff --git a/src/ui/dist/assets/FullShelf-62d1d109.css b/src/ui/dist/assets/FullShelf-62d1d109.css
deleted file mode 100644
index a1780feba..000000000
--- a/src/ui/dist/assets/FullShelf-62d1d109.css
+++ /dev/null
@@ -1 +0,0 @@
-span.icon[data-v-8fb8961a]{transform:translateY(3px);margin-left:20px}.header[data-v-8fb8961a]{margin:10px 10px 0;display:flex;flex-direction:row;justify-content:space-between}.header>h2[data-v-8fb8961a]{align-self:flex-start;margin-top:0;margin-bottom:10px}.header>h5[data-v-8fb8961a]{text-transform:uppercase;align-self:center;margin:0}.header>h5[data-v-8fb8961a]:hover{cursor:pointer}.items[data-v-8fb8961a]{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));grid-template-rows:1fr;gap:1em;overflow-y:auto}
diff --git a/src/ui/dist/assets/FullShelf-a8ad59b2.js b/src/ui/dist/assets/FullShelf-a8ad59b2.js
deleted file mode 100644
index 5c1018844..000000000
--- a/src/ui/dist/assets/FullShelf-a8ad59b2.js
+++ /dev/null
@@ -1 +0,0 @@
-import{_ as c,o as t,c as a,a as s,b as i,t as n,d as l,r as _}from"./index-d3fba034.js";const d={name:"FullShelf",props:{heading:String,icon:String}},r={class:"shelf"},u={class:"header"},f={key:0,class:"icon material-icons-outlined"},h={class:"items"};function m(o,p,e,S,g,v){return t(),a("div",r,[s("div",u,[s("h2",null,[i(n(e.heading),1),e.icon?(t(),a("span",f,n(e.icon),1)):l("",!0)])]),s("div",h,[_(o.$slots,"default",{},void 0,!0)])])}const y=c(d,[["render",m],["__scopeId","data-v-8fb8961a"]]);export{y as F};
diff --git a/src/ui/dist/assets/FullShelf-c8864a7a.js b/src/ui/dist/assets/FullShelf-c8864a7a.js
new file mode 100644
index 000000000..f97b90a76
--- /dev/null
+++ b/src/ui/dist/assets/FullShelf-c8864a7a.js
@@ -0,0 +1 @@
+import{_ as c,c as t,a as s,b as d,t as n,d as i,r as l,o}from"./index-1856ec92.js";const _={name:"FullShelf",props:{heading:String,icon:String}},r={class:"shelf"},u={class:"header"},f={key:0,class:"icon material-icons-outlined"},h={class:"items"};function m(a,p,e,S,g,v){return o(),t("div",r,[s("div",u,[s("h2",null,[d(n(e.heading),1),e.icon?(o(),t("span",f,n(e.icon),1)):i("",!0)])]),s("div",h,[l(a.$slots,"default",{},void 0,!0)])])}const y=c(_,[["render",m],["__scopeId","data-v-fceb85d9"]]);export{y as F};
diff --git a/src/ui/dist/assets/IconButton-0d464118.js b/src/ui/dist/assets/IconButton-1670e129.js
similarity index 57%
rename from src/ui/dist/assets/IconButton-0d464118.js
rename to src/ui/dist/assets/IconButton-1670e129.js
index 39f317cd1..8ba5aa37e 100644
--- a/src/ui/dist/assets/IconButton-0d464118.js
+++ b/src/ui/dist/assets/IconButton-1670e129.js
@@ -1 +1 @@
-import{n as o,c as t,aH as n,t as s,d as l,o as a,_ as c}from"./index-d3fba034.js";const r={key:1},i=o({__name:"IconButton",props:{icon:{type:String,required:!1},label:{type:String,required:!0},disabled:{type:Boolean,required:!1,default:!1},type:{type:String,required:!1,default:"negative"}},setup(e){return(d,u)=>(a(),t("button",{class:n([(e.disabled?"disabled ":"")+e.type,"flex items-center justify-center h-12 p-4 mt-4 rounded-full"])},[e.icon?(a(),t("span",{key:0,class:n([{"mr-2":e.label},"material-symbols-rounded"])},s(e.icon),3)):l("",!0),e.label?(a(),t("span",r,s(e.label),1)):l("",!0)],2))}});const f=c(i,[["__scopeId","data-v-c2778705"]]);export{f as I};
+import{n as o,c as t,aH as n,t as s,d as l,o as a,_ as r}from"./index-1856ec92.js";const c={key:1},i=o({__name:"IconButton",props:{icon:{type:String,required:!1},label:{type:String,required:!0},disabled:{type:Boolean,required:!1,default:!1},type:{type:String,required:!1,default:"negative"}},setup(e){return(d,u)=>(a(),t("button",{class:n([(e.disabled?"disabled ":"")+e.type,"flex items-center justify-center h-12 p-4 mt-4 rounded-full"])},[e.icon?(a(),t("span",{key:0,class:n([{"mr-2":e.label},"material-symbols-rounded"])},s(e.icon),3)):l("",!0),e.label?(a(),t("span",c,s(e.label),1)):l("",!0)],2))}});const f=r(i,[["__scopeId","data-v-5a61b939"]]);export{f as I};
diff --git a/src/ui/dist/assets/IconButton-d122f795.css b/src/ui/dist/assets/IconButton-d122f795.css
deleted file mode 100644
index 117ecea35..000000000
--- a/src/ui/dist/assets/IconButton-d122f795.css
+++ /dev/null
@@ -1,4 +0,0 @@
-/*!
- * Copyright (c) 2023, reAudioPlayer ONE.
- * Licenced under the GNU General Public License v3.0
- */.bg-bg[data-v-c2778705]{background-color:var(--background)}.bg-fg[data-v-c2778705]{background-color:var(--font-colour)}.text-bg[data-v-c2778705]{color:var(--background)}.text-fg[data-v-c2778705]{color:var(--font-colour)}button span.material-symbols-rounded[data-v-c2778705]{font-variation-settings:"wght" 400}button.disabled[data-v-c2778705]{cursor:not-allowed}button.positive[data-v-c2778705]{background-color:var(--bg-base);color:var(--fg-base)}button.positive.disabled[data-v-c2778705]{background-color:var(--fg-base-dk);color:var(--bg-hover-ltr)}button.negative[data-v-c2778705]{background-color:var(--bg-contrast);color:var(--fg-contrast)}button.negative.disabled[data-v-c2778705]{background-color:var(--fg-base-dk);color:var(--bg-hover-ltr)}button.danger[data-v-c2778705]{color:#f5f5f5;background-color:#c73c3c}button.danger.disabled[data-v-c2778705]{background-color:#a22e2e;color:#a9a9a9}
diff --git a/src/ui/dist/assets/IconButton-ff1e50bb.css b/src/ui/dist/assets/IconButton-ff1e50bb.css
new file mode 100644
index 000000000..f079a1b95
--- /dev/null
+++ b/src/ui/dist/assets/IconButton-ff1e50bb.css
@@ -0,0 +1,4 @@
+/*!
+ * Copyright (c) 2023, reAudioPlayer ONE.
+ * Licenced under the GNU General Public License v3.0
+ */.bg-bg[data-v-5a61b939]{background-color:var(--background)}.bg-fg[data-v-5a61b939]{background-color:var(--font-colour)}.text-bg[data-v-5a61b939]{color:var(--background)}.text-fg[data-v-5a61b939]{color:var(--font-colour)}button span.material-symbols-rounded[data-v-5a61b939]{font-variation-settings:"wght" 400}button.disabled[data-v-5a61b939]{cursor:not-allowed}button.positive[data-v-5a61b939]{background-color:var(--bg-base);color:var(--fg-base)}button.positive.disabled[data-v-5a61b939]{background-color:var(--fg-base-dk);color:var(--bg-hover-ltr)}button.negative[data-v-5a61b939]{background-color:var(--bg-contrast);color:var(--fg-contrast)}button.negative.disabled[data-v-5a61b939]{background-color:var(--fg-base-dk);color:var(--bg-hover-ltr)}button.danger[data-v-5a61b939]{color:#f5f5f5;background-color:#c73c3c}button.danger.disabled[data-v-5a61b939]{background-color:#a22e2e;color:#a9a9a9}
diff --git a/src/ui/dist/assets/Import-868656c0.js b/src/ui/dist/assets/Import-35a1fa51.js
similarity index 85%
rename from src/ui/dist/assets/Import-868656c0.js
rename to src/ui/dist/assets/Import-35a1fa51.js
index 81da0cc34..0a856bfef 100644
--- a/src/ui/dist/assets/Import-868656c0.js
+++ b/src/ui/dist/assets/Import-35a1fa51.js
@@ -1 +1 @@
-import{n as M,A as F,u as k,o as l,c as g,g as S,h as z,a as c,M as J,bW as K,t as E,F as B,i as q,aH as T,d as w,_ as G,f as j,w as I,b as N,C as D,q as b,j as Q,G as R,aP as U,l as X,m as Y,L as Z,x as ee,bS as se,bN as ae,c9 as te,ca as ne}from"./index-d3fba034.js";import{G as W}from"./gistClient-a7b793ac.js";import{I as oe}from"./IconButton-0d464118.js";const de=(e,r)=>{const s={source:e.source,id:e.id,changed:{}},n=s.changed,i=["id","href","duration","plays","artists"];for(const o of Object.keys(e))if(!i.includes(o)){if(o==="metadata"){const f=e.metadata,a=r.metadata;if(f&&a){if(!f.spotify&&!a.spotify)continue;if(!f.spotify&&a.spotify){n.metadata={from:f,to:a};continue}if(f.spotify&&!a.spotify){n.metadata={from:f,to:a};continue}f.spotify.id!==a.spotify.id&&(n.metadata={from:f,to:a})}else(f||a)&&(n.metadata={from:f,to:a});continue}o!=="id"&&e[o]!==r[o]&&(n[o]={from:e[o],to:r[o]})}return Object.keys(n).length?s:null},ie=(e,r)=>{const s={name:e.name,id:e.id,added:[],removed:[],modified:[]};for(const n of e.songs){const i=r.songs.find(o=>o.source===n.source);if(i){const o=de(n,i);o&&s.modified.push(o)}else s.removed.push(n)}for(const n of r.songs)e.songs.find(o=>o.source===n.source)||s.added.push(n);return s.added.length||s.removed.length||s.modified.length?s:null},le=(e,r)=>{const s={added:[],removed:[],modified:[]};for(const n of e){const i=r.find(o=>o.name===n.name);if(i){const o=ie(n,i);o&&s.modified.push(o)}else s.removed.push(n)}for(const n of r)e.find(o=>o.name===n.name)||s.added.push(n);return s},ce={class:"overflow-hidden"},re={class:"title my-0"},ue={key:0,class:"info"},fe={class:"key"},me={class:"value"},ge=M({__name:"SongDiff",props:{song:{type:Object,required:!0},diff:{type:Object,required:!0},isBase:{type:Boolean,required:!1},expanded:{type:Object,required:!1}},emits:["exclude","toggle-expanded"],setup(e,{emit:r}){const s=e,n=F(()=>s.diff.removed.some(a=>a.source===s.song.source)?"removed":s.diff.modified.some(a=>a.source===s.song.source)?"modified":s.isBase?"base":s.diff.added.some(a=>a.source===s.song.source)?"added":"base"),i=()=>{r("toggle-expanded",s.song)},o=["title","artist","album","source","cover","favourite","metadata"],f=a=>{var x,h,_;const p=(h=(x=s.diff.modified.find($=>$.source===s.song.source))==null?void 0:x.changed)==null?void 0:h[a],y=s.isBase?"from":"to",v=(p==null?void 0:p[y])??s.song[a];return a=="metadata"?(_=v==null?void 0:v.spotify)==null?void 0:_.id:v};return(a,p)=>{var y,v;return!e.isBase&&k(n)=="removed"?w("",!0):(l(),g("div",{key:0,class:T([k(n),"song px-4 py-2"])},[S(z,{src:e.song.cover,class:"rounded-md"},null,8,["src"]),c("div",ce,[c("p",re,[S(J,{text:e.song.title},null,8,["text"])]),S(K,{artist:e.song.artist,class:"artist text-muted"},null,8,["artist"])]),c("span",{class:"material-symbols-rounded cursor-pointer",onClick:i},E(((y=e.expanded)==null?void 0:y.source)==e.song.source?"expand_less":"expand_more"),1),((v=e.expanded)==null?void 0:v.source)==e.song.source?(l(),g("div",ue,[(l(),g(B,null,q(o,x=>{var h,_;return c("div",{key:x,class:T([{modified:(_=(h=e.diff.modified.find($=>$.source===e.song.source))==null?void 0:h.changed)==null?void 0:_[x]},"info__table"])},[c("span",fe,E(x),1),c("span",me,E(f(x)),1)],2)}),64))])):w("",!0)],2))}}});const pe=G(ge,[["__scopeId","data-v-1805c709"]]),ye={class:"info"},ve={class:"my-0"},xe={key:0,class:"text-muted"},he={class:"flex flex-row justify-between items-center"},_e={class:"text-very-muted"},be=M({__name:"PlaylistDiff",props:{playlist:{type:Object,required:!0},diff:{type:Object,required:!0},isBase:{type:Boolean,required:!1},expanded:{type:Boolean,required:!1},expandedSong:{type:Object,required:!1}},emits:["exclude","toggle-expanded","toggle-expanded-song"],setup(e,{emit:r}){const s=e,n=F(()=>s.diff.removed.some(a=>a.name===s.playlist.name)?"removed":s.diff.modified.some(a=>a.name===s.playlist.name)?"modified":s.isBase?"base":s.diff.added.some(a=>a.name===s.playlist.name)?"added":"base"),i=()=>{r("toggle-expanded",s.playlist)},o=a=>{r("toggle-expanded-song",a)},f=a=>{const p=s.diff.modified.find(y=>y.name===a.name);return p||{name:a.name,added:[],removed:[],modified:[]}};return(a,p)=>(l(),j(D,{class:T([k(n),"playlist p-4 rounded-xl relative"])},{default:I(()=>[S(z,{src:e.playlist.cover,class:"rounded-xl self-start"},null,8,["src"]),c("div",ye,[c("h2",ve,E(e.playlist.name),1),e.playlist.description?(l(),g("p",xe,E(e.playlist.description),1)):w("",!0),c("div",he,[c("p",_e,[c("strong",null,E(e.playlist.songs.length),1),N(" tracks ")]),c("span",{class:"material-symbols-rounded cursor-pointer",title:"Expand",onClick:i},E(e.expanded?"expand_less":"expand_more"),1)])]),e.expanded?(l(),j(D,{key:0,class:"col-span-2 flex flex-col gap-2 z-10 p-4"},{default:I(()=>[(l(!0),g(B,null,q(e.playlist.songs,y=>(l(),j(pe,{key:y.source,diff:f(e.playlist),expanded:e.expandedSong,"is-base":e.isBase,song:y,onToggleExpanded:o},null,8,["diff","expanded","is-base","song"]))),128))]),_:1})):w("",!0),k(n)!="base"?(l(),g("span",{key:1,class:"material-symbols-rounded exclude",title:"Exclude",onClick:p[0]||(p[0]=y=>a.$emit("exclude",e.playlist))}," block ")):w("",!0)]),_:1},8,["class"]))}});const O=G(be,[["__scopeId","data-v-321aa4c3"]]),L=e=>(X("data-v-8ce823ef"),e=e(),Y(),e),ke={class:"pb-4 pr-4 flex flex-col gap-4 h-full"},Se={class:"flex flex-row justify-end"},we=L(()=>c("div",{class:"grid grid-cols-2 gap-4"},[c("h1",null,"Local"),c("h1",null,"Incoming")],-1)),Pe={key:1,class:"fill-page"},Ee={key:1,class:"fill-page !grid !grid-cols-2 gap-4"},Be=L(()=>c("h2",null,[c("span",{class:"material-symbols-rounded"},"file_upload"),N(" From File ")],-1)),je=L(()=>c("h2",null,[c("span",{class:"material-symbols-rounded"},"cloud_download"),N(" GitHub Gist ")],-1)),$e=M({__name:"Import",setup(e){const r=b(!1),s=b(null),n=b([]),i=b([]),o=F(()=>le(n.value,i.value)),f=Q();let a=!1;const p=async()=>{if(r.value||a)return;a=!0;const d=[];for(const m of f.playlists)try{const u=await(await fetch(`/api/playlists/${m.id}`)).json();d.push(u)}catch(t){console.error(t)}n.value=d,a=!1};R(()=>f.playlists,p),U(p);const y=d=>{n.value=n.value.filter(m=>m.name!==d.name),i.value=i.value.filter(m=>m.name!==d.name)},v=b(null),x=b(null),h=d=>{var m;((m=v.value)==null?void 0:m.name)===d.name?v.value=null:v.value=d},_=d=>{var m;((m=x.value)==null?void 0:m.id)===d.id?x.value=null:x.value=d},$=async()=>{r.value=!0;const d=[],m=t=>{for(const u of t.added)d.push(ae(t.id,u));for(const u of t.removed)d.push(te(t.id,u.id));for(const u of t.modified)for(const P of Object.keys(u.changed))d.push(ne(u.id,P,u.changed[P].to))};for(const t of o.value.added)n.value.push(t),d.push(ee(t.name,t.description,t.cover).then(u=>{t.id=u,m({id:t.id,name:t.name,added:t.songs,removed:[],modified:[]})}));for(const t of o.value.modified)m(t);for(const t of o.value.removed)d.push(se(t.id));await Promise.all(d),window.setTimeout(async()=>{await f.fetchPlaylists(),r.value=!1,await p()},1e3)},V=b(!1);W.connected().then(d=>V.value=d);const A=async()=>{const d=document.createElement("input");d.type="file",d.accept=".json",d.name="lib.one.json",d.onchange=async()=>{if(!d.files)return;const t=await d.files[0].text(),u=JSON.parse(t);i.value=u,s.value="file"},d.click()},H=async()=>{i.value=await W.getContent(),s.value="gist"};return b(null),(d,m)=>(l(),g("div",ke,[c("div",Se,[S(oe,{icon:"merge",label:"Merge",onClick:$})]),s.value?(l(),g(B,{key:0},[r.value?(l(),g("div",Pe,[S(Z)])):(l(),g(B,{key:0},[we,(l(!0),g(B,null,q(n.value,t=>{var u,P;return l(),g("div",{key:t.name,class:"grid grid-cols-2 gap-4"},[n.value.some(C=>C.name===t.name)?(l(),j(O,{key:0,diff:k(o),expanded:((u=v.value)==null?void 0:u.name)===t.name,"expanded-song":x.value,playlist:t,class:"grid-1","is-base":"",onExclude:y,onToggleExpanded:h,onToggleExpandedSong:_},null,8,["diff","expanded","expanded-song","playlist"])):w("",!0),i.value.some(C=>C.name===t.name)?(l(),j(O,{key:1,diff:k(o),expanded:((P=v.value)==null?void 0:P.name)===t.name,"expanded-song":x.value,playlist:i.value.find(C=>C.name===t.name),class:"grid-2",onExclude:y,onToggleExpanded:h,onToggleExpandedSong:_},null,8,["diff","expanded","expanded-song","playlist"])):w("",!0)])}),128)),(l(!0),g(B,null,q(k(o).added,t=>{var u;return l(),g("div",{key:t.name,class:"grid grid-cols-2 gap-4"},[i.value.some(P=>P.name===t.name)?(l(),j(O,{key:0,diff:k(o),expanded:((u=v.value)==null?void 0:u.name)===t.name,"expanded-song":x.value,playlist:t,class:"grid-2",onExclude:y,onToggleExpanded:h,onToggleExpandedSong:_},null,8,["diff","expanded","expanded-song","playlist"])):w("",!0)])}),128))],64))],64)):(l(),g("div",Ee,[S(D,{"with-hover":"",class:"cursor-pointer",onClick:A},{default:I(()=>[Be]),_:1}),S(D,{disabled:!V.value,"with-hover":"",class:"cursor-pointer",onClick:H},{default:I(()=>[je]),_:1},8,["disabled"])]))]))}});const De=G($e,[["__scopeId","data-v-8ce823ef"]]);export{De as default};
+import{n as M,A as F,u as k,o as l,c as g,g as S,h as A,a as c,M as J,bV as K,t as E,F as B,i as q,aH as T,d as w,_ as G,f as j,w as I,b as L,C as D,q as b,j as R,G as Q,aP as U,l as X,m as Y,L as Z,x as ee,bR as se,bM as ae,c8 as te,c9 as ne}from"./index-1856ec92.js";import{G as z}from"./gistClient-de54a050.js";import{I as oe}from"./IconButton-1670e129.js";const de=(e,r)=>{const s={source:e.source,id:e.id,changed:{}},n=s.changed,i=["id","href","duration","plays","artists"];for(const o of Object.keys(e))if(!i.includes(o)){if(o==="metadata"){const f=e.metadata,a=r.metadata;if(f&&a){if(!f.spotify&&!a.spotify)continue;if(!f.spotify&&a.spotify){n.metadata={from:f,to:a};continue}if(f.spotify&&!a.spotify){n.metadata={from:f,to:a};continue}f.spotify.id!==a.spotify.id&&(n.metadata={from:f,to:a})}else(f||a)&&(n.metadata={from:f,to:a});continue}o!=="id"&&e[o]!==r[o]&&(n[o]={from:e[o],to:r[o]})}return Object.keys(n).length?s:null},ie=(e,r)=>{const s={name:e.name,id:e.id,added:[],removed:[],modified:[]};for(const n of e.songs){const i=r.songs.find(o=>o.source===n.source);if(i){const o=de(n,i);o&&s.modified.push(o)}else s.removed.push(n)}for(const n of r.songs)e.songs.find(o=>o.source===n.source)||s.added.push(n);return s.added.length||s.removed.length||s.modified.length?s:null},le=(e,r)=>{const s={added:[],removed:[],modified:[]};for(const n of e){const i=r.find(o=>o.name===n.name);if(i){const o=ie(n,i);o&&s.modified.push(o)}else s.removed.push(n)}for(const n of r)e.find(o=>o.name===n.name)||s.added.push(n);return s},ce={class:"overflow-hidden"},re={class:"title my-0"},ue={key:0,class:"info"},fe={class:"key"},me={class:"value"},ge=M({__name:"SongDiff",props:{song:{type:Object,required:!0},diff:{type:Object,required:!0},isBase:{type:Boolean,required:!1},expanded:{type:Object,required:!1}},emits:["exclude","toggle-expanded"],setup(e,{emit:r}){const s=e,n=F(()=>s.diff.removed.some(a=>a.source===s.song.source)?"removed":s.diff.modified.some(a=>a.source===s.song.source)?"modified":s.isBase?"base":s.diff.added.some(a=>a.source===s.song.source)?"added":"base"),i=()=>{r("toggle-expanded",s.song)},o=["title","artist","album","source","cover","favourite","metadata"],f=a=>{var x,h,_;const p=(h=(x=s.diff.modified.find($=>$.source===s.song.source))==null?void 0:x.changed)==null?void 0:h[a],y=s.isBase?"from":"to",v=(p==null?void 0:p[y])??s.song[a];return a=="metadata"?(_=v==null?void 0:v.spotify)==null?void 0:_.id:v};return(a,p)=>{var y,v;return!e.isBase&&k(n)=="removed"?w("",!0):(l(),g("div",{key:0,class:T([k(n),"song px-4 py-2"])},[S(A,{src:e.song.cover,class:"rounded-md"},null,8,["src"]),c("div",ce,[c("p",re,[S(J,{text:e.song.title},null,8,["text"])]),S(K,{artist:e.song.artist,class:"artist text-muted"},null,8,["artist"])]),c("span",{class:"material-symbols-rounded cursor-pointer",onClick:i},E(((y=e.expanded)==null?void 0:y.source)==e.song.source?"expand_less":"expand_more"),1),((v=e.expanded)==null?void 0:v.source)==e.song.source?(l(),g("div",ue,[(l(),g(B,null,q(o,x=>{var h,_;return c("div",{key:x,class:T([{modified:(_=(h=e.diff.modified.find($=>$.source===e.song.source))==null?void 0:h.changed)==null?void 0:_[x]},"info__table"])},[c("span",fe,E(x),1),c("span",me,E(f(x)),1)],2)}),64))])):w("",!0)],2))}}});const pe=G(ge,[["__scopeId","data-v-1805c709"]]),ye={class:"info"},ve={class:"my-0"},xe={key:0,class:"text-muted"},he={class:"flex flex-row justify-between items-center"},_e={class:"text-very-muted"},be=M({__name:"PlaylistDiff",props:{playlist:{type:Object,required:!0},diff:{type:Object,required:!0},isBase:{type:Boolean,required:!1},expanded:{type:Boolean,required:!1},expandedSong:{type:Object,required:!1}},emits:["exclude","toggle-expanded","toggle-expanded-song"],setup(e,{emit:r}){const s=e,n=F(()=>s.diff.removed.some(a=>a.name===s.playlist.name)?"removed":s.diff.modified.some(a=>a.name===s.playlist.name)?"modified":s.isBase?"base":s.diff.added.some(a=>a.name===s.playlist.name)?"added":"base"),i=()=>{r("toggle-expanded",s.playlist)},o=a=>{r("toggle-expanded-song",a)},f=a=>{const p=s.diff.modified.find(y=>y.name===a.name);return p||{name:a.name,added:[],removed:[],modified:[]}};return(a,p)=>(l(),j(D,{class:T([k(n),"playlist p-4 rounded-xl relative"])},{default:I(()=>[S(A,{src:e.playlist.cover,class:"rounded-xl self-start"},null,8,["src"]),c("div",ye,[c("h2",ve,E(e.playlist.name),1),e.playlist.description?(l(),g("p",xe,E(e.playlist.description),1)):w("",!0),c("div",he,[c("p",_e,[c("strong",null,E(e.playlist.songs.length),1),L(" tracks ")]),c("span",{class:"material-symbols-rounded cursor-pointer",title:"Expand",onClick:i},E(e.expanded?"expand_less":"expand_more"),1)])]),e.expanded?(l(),j(D,{key:0,class:"col-span-2 flex flex-col gap-2 z-10 p-4"},{default:I(()=>[(l(!0),g(B,null,q(e.playlist.songs,y=>(l(),j(pe,{key:y.source,diff:f(e.playlist),expanded:e.expandedSong,"is-base":e.isBase,song:y,onToggleExpanded:o},null,8,["diff","expanded","is-base","song"]))),128))]),_:1})):w("",!0),k(n)!="base"?(l(),g("span",{key:1,class:"material-symbols-rounded exclude",title:"Exclude",onClick:p[0]||(p[0]=y=>a.$emit("exclude",e.playlist))}," block ")):w("",!0)]),_:1},8,["class"]))}});const O=G(be,[["__scopeId","data-v-321aa4c3"]]),N=e=>(X("data-v-8ce823ef"),e=e(),Y(),e),ke={class:"pb-4 pr-4 flex flex-col gap-4 h-full"},Se={class:"flex flex-row justify-end"},we=N(()=>c("div",{class:"grid grid-cols-2 gap-4"},[c("h1",null,"Local"),c("h1",null,"Incoming")],-1)),Pe={key:1,class:"fill-page"},Ee={key:1,class:"fill-page !grid !grid-cols-2 gap-4"},Be=N(()=>c("h2",null,[c("span",{class:"material-symbols-rounded"},"file_upload"),L(" From File ")],-1)),je=N(()=>c("h2",null,[c("span",{class:"material-symbols-rounded"},"cloud_download"),L(" GitHub Gist ")],-1)),$e=M({__name:"Import",setup(e){const r=b(!1),s=b(null),n=b([]),i=b([]),o=F(()=>le(n.value,i.value)),f=R();let a=!1;const p=async()=>{if(r.value||a)return;a=!0;const d=[];for(const m of f.playlists)try{const u=await(await fetch(`/api/playlists/${m.id}`)).json();d.push(u)}catch(t){console.error(t)}n.value=d,a=!1};Q(()=>f.playlists,p),U(p);const y=d=>{n.value=n.value.filter(m=>m.name!==d.name),i.value=i.value.filter(m=>m.name!==d.name)},v=b(null),x=b(null),h=d=>{var m;((m=v.value)==null?void 0:m.name)===d.name?v.value=null:v.value=d},_=d=>{var m;((m=x.value)==null?void 0:m.id)===d.id?x.value=null:x.value=d},$=async()=>{r.value=!0;const d=[],m=t=>{for(const u of t.added)d.push(ae(t.id,u));for(const u of t.removed)d.push(te(t.id,u.id));for(const u of t.modified)for(const P of Object.keys(u.changed))d.push(ne(u.id,P,u.changed[P].to))};for(const t of o.value.added)n.value.push(t),d.push(ee(t.name,t.description,t.cover).then(u=>{t.id=u,m({id:t.id,name:t.name,added:t.songs,removed:[],modified:[]})}));for(const t of o.value.modified)m(t);for(const t of o.value.removed)d.push(se(t.id));await Promise.all(d),window.setTimeout(async()=>{await f.fetchPlaylists(),r.value=!1,await p()},1e3)},V=b(!1);z.connected().then(d=>V.value=d);const H=async()=>{const d=document.createElement("input");d.type="file",d.accept=".json",d.name="lib.one.json",d.onchange=async()=>{if(!d.files)return;const t=await d.files[0].text(),u=JSON.parse(t);i.value=u,s.value="file"},d.click()},W=async()=>{i.value=await z.getContent(),s.value="gist"};return b(null),(d,m)=>(l(),g("div",ke,[c("div",Se,[S(oe,{icon:"merge",label:"Merge",onClick:$})]),s.value?(l(),g(B,{key:0},[r.value?(l(),g("div",Pe,[S(Z)])):(l(),g(B,{key:0},[we,(l(!0),g(B,null,q(n.value,t=>{var u,P;return l(),g("div",{key:t.name,class:"grid grid-cols-2 gap-4"},[n.value.some(C=>C.name===t.name)?(l(),j(O,{key:0,diff:k(o),expanded:((u=v.value)==null?void 0:u.name)===t.name,"expanded-song":x.value,playlist:t,class:"grid-1","is-base":"",onExclude:y,onToggleExpanded:h,onToggleExpandedSong:_},null,8,["diff","expanded","expanded-song","playlist"])):w("",!0),i.value.some(C=>C.name===t.name)?(l(),j(O,{key:1,diff:k(o),expanded:((P=v.value)==null?void 0:P.name)===t.name,"expanded-song":x.value,playlist:i.value.find(C=>C.name===t.name),class:"grid-2",onExclude:y,onToggleExpanded:h,onToggleExpandedSong:_},null,8,["diff","expanded","expanded-song","playlist"])):w("",!0)])}),128)),(l(!0),g(B,null,q(k(o).added,t=>{var u;return l(),g("div",{key:t.name,class:"grid grid-cols-2 gap-4"},[i.value.some(P=>P.name===t.name)?(l(),j(O,{key:0,diff:k(o),expanded:((u=v.value)==null?void 0:u.name)===t.name,"expanded-song":x.value,playlist:t,class:"grid-2",onExclude:y,onToggleExpanded:h,onToggleExpandedSong:_},null,8,["diff","expanded","expanded-song","playlist"])):w("",!0)])}),128))],64))],64)):(l(),g("div",Ee,[S(D,{"with-hover":"",class:"cursor-pointer",onClick:H},{default:I(()=>[Be]),_:1}),S(D,{disabled:!V.value,"with-hover":"",class:"cursor-pointer",onClick:W},{default:I(()=>[je]),_:1},8,["disabled"])]))]))}});const De=G($e,[["__scopeId","data-v-8ce823ef"]]);export{De as default};
diff --git a/src/ui/dist/assets/Import-35a1fa51.js.gz b/src/ui/dist/assets/Import-35a1fa51.js.gz
new file mode 100644
index 000000000..483587194
Binary files /dev/null and b/src/ui/dist/assets/Import-35a1fa51.js.gz differ
diff --git a/src/ui/dist/assets/Import-868656c0.js.gz b/src/ui/dist/assets/Import-868656c0.js.gz
deleted file mode 100644
index 32e283cec..000000000
Binary files a/src/ui/dist/assets/Import-868656c0.js.gz and /dev/null differ
diff --git a/src/ui/dist/assets/ImportSpotifyAlbum.vue_vue_type_script_setup_true_lang-8201752a.js b/src/ui/dist/assets/ImportSpotifyAlbum.vue_vue_type_script_setup_true_lang-2307b3a0.js
similarity index 62%
rename from src/ui/dist/assets/ImportSpotifyAlbum.vue_vue_type_script_setup_true_lang-8201752a.js
rename to src/ui/dist/assets/ImportSpotifyAlbum.vue_vue_type_script_setup_true_lang-2307b3a0.js
index 31d09576d..abeb6d77c 100644
--- a/src/ui/dist/assets/ImportSpotifyAlbum.vue_vue_type_script_setup_true_lang-8201752a.js
+++ b/src/ui/dist/assets/ImportSpotifyAlbum.vue_vue_type_script_setup_true_lang-2307b3a0.js
@@ -1 +1 @@
-import{T as w}from"./Template-deebb6b8.js";import{F as h}from"./Form-f0cd8cf2.js";import{P as g}from"./Playlist-8c4c6944.js";import{T as A}from"./ExternalEntry-8bf31741.js";import{n as $,j as k,q as n,o as C,f as j,w as N,g as c,u as S,b$ as P,a as T,bN as D,bR as O,x as _}from"./index-d3fba034.js";const q=T("br",null,null,-1),I=$({__name:"ImportSpotifyAlbum",props:{album:{type:Object,required:!0}},setup(o,{expose:p}){const t=o,r=k(),u=n([{name:"playlist",type:"dropdown",icon:"playlist_add",required:!0,value:null,options:r.playlistsAsDropdown}]),i=n(null),s=n(null),l=n([]),f=async()=>{if(l.value.length>0){i.value.show();return}const a=await i.value.fetch(`/api/spotify/albums/${t.album.id}`);a&&(l.value=await a.json())},v=()=>{const a=new CustomEvent("player.play",{detail:{artist:t.album.artist,title:t.album.title,source:t.album.href}});window.dispatchEvent(a)},m=async a=>{if(a==="new"){const e=await _(t.album.title,`${t.album.releaseDate}, ${t.album.artist}`,t.album.cover);return u.value[0].options=r.playlistsAsDropdown,u.value[0].value=e,e}return Number(a)},d=async(a,e=null)=>{l.value[a].added||(e??(e=s.value.toObject().playlist),e=await m(e),await D(e??s.value.toObject().playlist,l.value[a]),l.value[a].added=!0)},y=async()=>{let a=s.value.toObject().playlist;a=await m(a),l.value.forEach((e,b)=>{d(b,a)}),O.addSuccess(t.album.title,`Added ${l.value.length} songs to ${r.playlists[a].name}`,3e3)};return p({show:f}),(a,e)=>(C(),j(w,{ref_key:"modal",ref:i,submit:{label:"Add All",icon:"add"},name:"Import Album",onClose:e[0]||(e[0]=b=>a.$emit("close")),onSubmit:y},{default:N(()=>[c(A,{cover:o.album.cover,icons:[{name:"share",onClick:()=>S(P)(o.album.href)},{name:"play_arrow",onClick:v}],subtitle:o.album.artist,title:o.album.title},null,8,["cover","icons","subtitle","title"]),c(h,{ref_key:"form",ref:s,options:u.value},null,8,["options"]),q,c(g,{songs:l.value,noCover:"",onAdd:d},null,8,["songs"])]),_:1},512))}});export{I as _};
+import{T as w}from"./Template-8c03613c.js";import{F as h}from"./Form-d27a37bd.js";import{P as g}from"./Playlist-f5edc8c9.js";import{T as A}from"./ExternalEntry-4cf58b98.js";import{n as $,j as k,q as n,o as C,f as j,w as S,g as c,u as N,b_ as P,a as T,bM as _,bQ as D,x as O}from"./index-1856ec92.js";const q=T("br",null,null,-1),x=$({__name:"ImportSpotifyAlbum",props:{album:{type:Object,required:!0}},setup(o,{expose:p}){const t=o,r=k(),u=n([{name:"playlist",type:"dropdown",icon:"playlist_add",required:!0,value:null,options:r.playlistsAsDropdown}]),i=n(null),s=n(null),l=n([]),f=async()=>{if(l.value.length>0){i.value.show();return}const a=await i.value.fetch(`/api/spotify/albums/${t.album.id}`);a&&(l.value=await a.json())},v=()=>{const a=new CustomEvent("player.play",{detail:{artist:t.album.artist,title:t.album.title,source:t.album.href}});window.dispatchEvent(a)},m=async a=>{if(a==="new"){const e=await O(t.album.title,`${t.album.releaseDate}, ${t.album.artist}`,t.album.cover);return u.value[0].options=r.playlistsAsDropdown,u.value[0].value=e,e}return Number(a)},d=async(a,e=null)=>{l.value[a].added||(e??(e=s.value.toObject().playlist),e=await m(e),await _(e??s.value.toObject().playlist,l.value[a]),l.value[a].added=!0)},y=async()=>{let a=s.value.toObject().playlist;a=await m(a),l.value.forEach((e,b)=>{d(b,a)}),D.addSuccess(t.album.title,`Added ${l.value.length} songs to ${r.playlists[a].name}`,3e3)};return p({show:f}),(a,e)=>(C(),j(w,{ref_key:"modal",ref:i,submit:{label:"Add All",icon:"add"},name:"Import Album",onClose:e[0]||(e[0]=b=>a.$emit("close")),onSubmit:y},{default:S(()=>[c(A,{cover:o.album.cover,icons:[{name:"share",onClick:()=>N(P)(o.album.href)},{name:"play_arrow",onClick:v}],subtitle:o.album.artist,title:o.album.title},null,8,["cover","icons","subtitle","title"]),c(h,{ref_key:"form",ref:s,options:u.value},null,8,["options"]),q,c(g,{songs:l.value,noCover:"",onAdd:d},null,8,["songs"])]),_:1},512))}});export{x as _};
diff --git a/src/ui/dist/assets/ImportSpotifyAlbum.vue_vue_type_script_setup_true_lang-2307b3a0.js.gz b/src/ui/dist/assets/ImportSpotifyAlbum.vue_vue_type_script_setup_true_lang-2307b3a0.js.gz
new file mode 100644
index 000000000..7dfe8451f
Binary files /dev/null and b/src/ui/dist/assets/ImportSpotifyAlbum.vue_vue_type_script_setup_true_lang-2307b3a0.js.gz differ
diff --git a/src/ui/dist/assets/ImportSpotifyAlbum.vue_vue_type_script_setup_true_lang-8201752a.js.gz b/src/ui/dist/assets/ImportSpotifyAlbum.vue_vue_type_script_setup_true_lang-8201752a.js.gz
deleted file mode 100644
index f375bd37c..000000000
Binary files a/src/ui/dist/assets/ImportSpotifyAlbum.vue_vue_type_script_setup_true_lang-8201752a.js.gz and /dev/null differ
diff --git a/src/ui/dist/assets/LocalData-a9059c25.js.gz b/src/ui/dist/assets/LocalData-a9059c25.js.gz
deleted file mode 100644
index 25ea91420..000000000
Binary files a/src/ui/dist/assets/LocalData-a9059c25.js.gz and /dev/null differ
diff --git a/src/ui/dist/assets/LocalData-a9059c25.js b/src/ui/dist/assets/LocalData-aae308a1.js
similarity index 83%
rename from src/ui/dist/assets/LocalData-a9059c25.js
rename to src/ui/dist/assets/LocalData-aae308a1.js
index 48c3c8a09..4b4a5e9d0 100644
--- a/src/ui/dist/assets/LocalData-a9059c25.js
+++ b/src/ui/dist/assets/LocalData-aae308a1.js
@@ -1 +1 @@
-import{T as v}from"./TrackCompact-7a7a3cb3.js";import{_ as S,q as y,B as j,c,a as t,F as i,i as r,o,f as n,w as k,g as p,h as B,M as g,u as b,C as w,l as D,m as T}from"./index-d3fba034.js";import"./ImportSpotifyAlbum.vue_vue_type_script_setup_true_lang-8201752a.js";import"./Template-deebb6b8.js";import"./IconButton-0d464118.js";import"./Form-f0cd8cf2.js";import"./Dropdown-b2449fcb.js";import"./Playlist-8c4c6944.js";import"./PlaylistHeader-8dd53ec0.js";import"./ExternalEntry-8bf31741.js";const x=l=>(D("data-v-6f841b26"),l=l(),T(),l),$={class:"wrap"},I={class:"covers"},N=x(()=>t("h2",null,"Local covers",-1)),q={class:"items grid grid-cols-2 md:grid-cols-4 lg:grid-cols-6 gap-4"},F={class:"flex justify-between w-full mb-4"},J={class:"overflow-hidden"},M=["onClick"],O={class:"tracks"},V=x(()=>t("h2",null,"Local tracks",-1)),z={class:"items grid grid-cols-2 md:grid-cols-4 gap-4"},A={class:"flex justify-between w-full mb-4"},G={class:"overflow-hidden"},H=["onClick"],K={class:"flex justify-center w-full mb-4"},Q=["src"],R={__name:"LocalData",setup(l){const m=y([]),f=y([]),C=j(),d=()=>{fetch("/api/config/images").then(e=>e.json()).then(e=>m.value=e),fetch("/api/config/tracks").then(e=>e.json()).then(e=>f.value=e)},L=async e=>{await fetch("/api/config/images",{method:"DELETE",body:JSON.stringify({name:e})}),d()},E=async e=>{fetch("/api/config/tracks",{method:"DELETE",body:JSON.stringify({name:e})}),d()},h=e=>{C.loadPlaylist("track",e)};return d(),(e,U)=>(o(),c("div",$,[t("div",I,[N,t("div",q,[(o(!0),c(i,null,r(m.value,(a,_)=>(o(),n(w,{key:_,class:"cover-wrapper"},{default:k(()=>[p(B,{src:a.name,class:"rounded-xl mb-4"},null,8,["src"]),t("div",F,[t("p",J,[p(g,{text:a.name},null,8,["text"])]),t("span",{class:"ml-2 material-symbols-rounded cursor-pointer",onClick:s=>L(a.name)},"delete",8,M)]),(o(!0),c(i,null,r(a.songs,(s,u)=>(o(),n(b(v),{id:s.id,key:u,artist:s.artist,cover:s.cover,title:s.title,onPlay:P=>h(s.id)},null,8,["id","artist","cover","title","onPlay"]))),128))]),_:2},1024))),128))])]),t("div",O,[V,t("div",z,[(o(!0),c(i,null,r(f.value,(a,_)=>(o(),n(w,{key:_,class:"track"},{default:k(()=>[t("div",A,[t("p",G,[p(g,{text:a.name},null,8,["text"])]),t("span",{class:"material-symbols-rounded cursor-pointer",onClick:s=>E(a.name)},"delete",8,H)]),t("div",K,[t("audio",{src:"/api/"+a.name.replace("local:","/src/tracks/"),controls:""},null,8,Q)]),(o(!0),c(i,null,r(a.songs,(s,u)=>(o(),n(b(v),{id:s.id,key:u,artist:s.artist,cover:s.cover,title:s.title,onPlay:P=>h(s.id)},null,8,["id","artist","cover","title","onPlay"]))),128))]),_:2},1024))),128))])])]))}},le=S(R,[["__scopeId","data-v-6f841b26"]]);export{le as default};
+import{T as v}from"./TrackCompact-30025f11.js";import{_ as S,q as y,B as j,c,a as t,F as i,i as r,o,f as n,w as k,g as p,h as B,M as g,u as b,C as w,l as D,m as T}from"./index-1856ec92.js";import"./ImportSpotifyAlbum.vue_vue_type_script_setup_true_lang-2307b3a0.js";import"./Template-8c03613c.js";import"./IconButton-1670e129.js";import"./Form-d27a37bd.js";import"./Dropdown-16096009.js";import"./Playlist-f5edc8c9.js";import"./PlaylistHeader-40afea3c.js";import"./ExternalEntry-4cf58b98.js";const x=l=>(D("data-v-6f841b26"),l=l(),T(),l),$={class:"wrap"},I={class:"covers"},N=x(()=>t("h2",null,"Local covers",-1)),q={class:"items grid grid-cols-2 md:grid-cols-4 lg:grid-cols-6 gap-4"},F={class:"flex justify-between w-full mb-4"},J={class:"overflow-hidden"},M=["onClick"],O={class:"tracks"},V=x(()=>t("h2",null,"Local tracks",-1)),z={class:"items grid grid-cols-2 md:grid-cols-4 gap-4"},A={class:"flex justify-between w-full mb-4"},G={class:"overflow-hidden"},H=["onClick"],K={class:"flex justify-center w-full mb-4"},Q=["src"],R={__name:"LocalData",setup(l){const m=y([]),f=y([]),C=j(),d=()=>{fetch("/api/config/images").then(e=>e.json()).then(e=>m.value=e),fetch("/api/config/tracks").then(e=>e.json()).then(e=>f.value=e)},L=async e=>{await fetch("/api/config/images",{method:"DELETE",body:JSON.stringify({name:e})}),d()},E=async e=>{fetch("/api/config/tracks",{method:"DELETE",body:JSON.stringify({name:e})}),d()},h=e=>{C.loadPlaylist("track",e)};return d(),(e,U)=>(o(),c("div",$,[t("div",I,[N,t("div",q,[(o(!0),c(i,null,r(m.value,(a,_)=>(o(),n(w,{key:_,class:"cover-wrapper"},{default:k(()=>[p(B,{src:a.name,class:"rounded-xl mb-4"},null,8,["src"]),t("div",F,[t("p",J,[p(g,{text:a.name},null,8,["text"])]),t("span",{class:"ml-2 material-symbols-rounded cursor-pointer",onClick:s=>L(a.name)},"delete",8,M)]),(o(!0),c(i,null,r(a.songs,(s,u)=>(o(),n(b(v),{id:s.id,key:u,artist:s.artist,cover:s.cover,title:s.title,onPlay:P=>h(s.id)},null,8,["id","artist","cover","title","onPlay"]))),128))]),_:2},1024))),128))])]),t("div",O,[V,t("div",z,[(o(!0),c(i,null,r(f.value,(a,_)=>(o(),n(w,{key:_,class:"track"},{default:k(()=>[t("div",A,[t("p",G,[p(g,{text:a.name},null,8,["text"])]),t("span",{class:"material-symbols-rounded cursor-pointer",onClick:s=>E(a.name)},"delete",8,H)]),t("div",K,[t("audio",{src:"/api/"+a.name.replace("local:","/src/tracks/"),controls:""},null,8,Q)]),(o(!0),c(i,null,r(a.songs,(s,u)=>(o(),n(b(v),{id:s.id,key:u,artist:s.artist,cover:s.cover,title:s.title,onPlay:P=>h(s.id)},null,8,["id","artist","cover","title","onPlay"]))),128))]),_:2},1024))),128))])])]))}},le=S(R,[["__scopeId","data-v-6f841b26"]]);export{le as default};
diff --git a/src/ui/dist/assets/LocalData-aae308a1.js.gz b/src/ui/dist/assets/LocalData-aae308a1.js.gz
new file mode 100644
index 000000000..6f197941a
Binary files /dev/null and b/src/ui/dist/assets/LocalData-aae308a1.js.gz differ
diff --git a/src/ui/dist/assets/News-2132672c.js b/src/ui/dist/assets/News-2132672c.js
new file mode 100644
index 000000000..3dce94161
--- /dev/null
+++ b/src/ui/dist/assets/News-2132672c.js
@@ -0,0 +1 @@
+import{F as C}from"./FullShelf-c8864a7a.js";import{_ as f,C as T,o as n,f as m,w,c as o,d as y,a as r,t as p,e as c,L as N,g as $,F as h,i as g,l as k,m as I}from"./index-1856ec92.js";const x={name:"NewsItemBig",components:{Card:T},methods:{redirect(){this.$router.push(this.href)}},computed:{updatedTimestamp(){const e=new Date(this.updated),s=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],t=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];return`${s[e.getUTCDay()]} ${e.getUTCDate()} ${t[e.getUTCMonth()]} ${e.getUTCFullYear()} ${e.getUTCHours()}.${e.getUTCMinutes()} GMT`}},props:{image:String,title:String,summary:String,href:String,updated:String,source:String}},M=["src"],B=["innerHTML"],F={class:"small"};function L(e,s,t,i,d,u){const _=c("Card");return n(),m(_,{class:"p-4 col-span-2 cursor-pointer","with-hover":"",onClick:u.redirect},{default:w(()=>[t.image?(n(),o("img",{key:0,src:t.image},null,8,M)):y("",!0),r("h4",null,p(t.title),1),r("p",{class:"newsSummary",innerHTML:t.summary},null,8,B),r("p",F,p(`${u.updatedTimestamp}, ${t.source}`),1)]),_:1},8,["onClick"])}const D=f(x,[["render",L],["__scopeId","data-v-15299eaa"]]);const U={components:{Loader:N,FullShelf:C,NewsItemBig:D},name:"News",data(){return{news:[]}},mounted(){fetch("/api/news/articles").then(e=>e.json()).then(e=>{this.news.length=0;for(const s of e){const t=this.news.findIndex(i=>i.source==s.source);t>=0?this.news[t].items.push(s):this.news.push({source:s.source,items:[s]})}})}},H=e=>(k("data-v-55d1a00d"),e=e(),I(),e),b={class:"padding-20"},A={class:"news"},J=H(()=>r("h1",null,"News",-1)),V={key:0,class:"fillPage"};function O(e,s,t,i,d,u){const _=c("Loader"),S=c("news-item-big"),v=c("full-shelf");return n(),o("div",b,[r("div",A,[J,d.news.length?y("",!0):(n(),o("div",V,[$(_)])),(n(!0),o(h,null,g(d.news,l=>(n(),m(v,{key:l.source,heading:l.source,class:"mt-10"},{default:w(()=>[(n(!0),o(h,null,g(l.items,a=>(n(),m(S,{key:a.url,href:a.link,image:a.image,source:a.source,summary:a.summary,title:a.title,updated:a.updated},null,8,["href","image","source","summary","title","updated"]))),128))]),_:2},1032,["heading"]))),128))])])}const E=f(U,[["render",O],["__scopeId","data-v-55d1a00d"]]);export{E as default};
diff --git a/src/ui/dist/assets/News-2132672c.js.gz b/src/ui/dist/assets/News-2132672c.js.gz
new file mode 100644
index 000000000..7cbec6833
Binary files /dev/null and b/src/ui/dist/assets/News-2132672c.js.gz differ
diff --git a/src/ui/dist/assets/News-6e372f93.js b/src/ui/dist/assets/News-6e372f93.js
deleted file mode 100644
index 7a6a5c5a9..000000000
--- a/src/ui/dist/assets/News-6e372f93.js
+++ /dev/null
@@ -1 +0,0 @@
-import{F as C}from"./FullShelf-a8ad59b2.js";import{_ as f,C as T,o as n,f as m,w,c as a,d as y,a as c,t as p,e as r,L as N,g as $,F as h,i as g,l as k,m as I}from"./index-d3fba034.js";const x={name:"NewsItemBig",components:{Card:T},methods:{redirect(){this.$router.push(this.href)}},computed:{updatedTimestamp(){const e=new Date(this.updated),s=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],t=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];return`${s[e.getUTCDay()]} ${e.getUTCDate()} ${t[e.getUTCMonth()]} ${e.getUTCFullYear()} ${e.getUTCHours()}.${e.getUTCMinutes()} GMT`}},props:{image:String,title:String,summary:String,href:String,updated:String,source:String}},M=["src"],B=["innerHTML"],F={class:"small"};function L(e,s,t,i,d,u){const _=r("Card");return n(),m(_,{class:"p-4 col-span-2 cursor-pointer","with-hover":"",onClick:u.redirect},{default:w(()=>[t.image?(n(),a("img",{key:0,src:t.image},null,8,M)):y("",!0),c("h4",null,p(t.title),1),c("p",{class:"newsSummary",innerHTML:t.summary},null,8,B),c("p",F,p(`${u.updatedTimestamp}, ${t.source}`),1)]),_:1},8,["onClick"])}const D=f(x,[["render",L],["__scopeId","data-v-95eced2f"]]);const U={components:{Loader:N,FullShelf:C,NewsItemBig:D},name:"News",data(){return{news:[]}},mounted(){fetch("/api/news/articles").then(e=>e.json()).then(e=>{this.news.length=0;for(const s of e){const t=this.news.findIndex(i=>i.source==s.source);t>=0?this.news[t].items.push(s):this.news.push({source:s.source,items:[s]})}})}},H=e=>(k("data-v-dc6d7520"),e=e(),I(),e),b={class:"padding-20"},A={class:"news"},J=H(()=>c("h1",null,"News",-1)),V={key:0,class:"fillPage"};function O(e,s,t,i,d,u){const _=r("Loader"),S=r("news-item-big"),v=r("full-shelf");return n(),a("div",b,[c("div",A,[J,d.news.length?y("",!0):(n(),a("div",V,[$(_)])),(n(!0),a(h,null,g(d.news,l=>(n(),m(v,{key:l.source,heading:l.source,class:"mt-10"},{default:w(()=>[(n(!0),a(h,null,g(l.items,o=>(n(),m(S,{key:o.url,href:o.link,image:o.image,source:o.source,summary:o.summary,title:o.title,updated:o.updated},null,8,["href","image","source","summary","title","updated"]))),128))]),_:2},1032,["heading"]))),128))])])}const E=f(U,[["render",O],["__scopeId","data-v-dc6d7520"]]);export{E as default};
diff --git a/src/ui/dist/assets/News-6e372f93.js.gz b/src/ui/dist/assets/News-6e372f93.js.gz
deleted file mode 100644
index 414323b08..000000000
Binary files a/src/ui/dist/assets/News-6e372f93.js.gz and /dev/null differ
diff --git a/src/ui/dist/assets/News-815a31c4.css b/src/ui/dist/assets/News-815a31c4.css
new file mode 100644
index 000000000..b8b3d61f5
--- /dev/null
+++ b/src/ui/dist/assets/News-815a31c4.css
@@ -0,0 +1 @@
+p.note[data-v-15299eaa]{font-size:.8em}.wrapper[data-v-15299eaa]{display:flex;flex-direction:column;justify-content:flex-end;height:100%}img[data-v-15299eaa]{border-radius:12px;margin-bottom:20px}h4[data-v-15299eaa]{margin:0;font-size:1em}p[data-v-15299eaa]{margin:0;color:var(--fg-base-dk);font-size:.9em;display:-webkit-box;-webkit-line-clamp:5;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.small[data-v-15299eaa]{font-size:.6em;margin:auto auto 0 0}p.newsSummary a,p.newsSummary a:hover{color:var(--fg-base-dk)}font{display:none}.padding-20[data-v-55d1a00d]{padding:20px}.fillPage[data-v-55d1a00d]{display:flex;flex-direction:column;justify-content:center;align-items:center;height:calc(100vh - var(--h-header) - var(--h-player) - 200px)}
diff --git a/src/ui/dist/assets/News-99169f9d.css b/src/ui/dist/assets/News-99169f9d.css
deleted file mode 100644
index fca7e3153..000000000
--- a/src/ui/dist/assets/News-99169f9d.css
+++ /dev/null
@@ -1 +0,0 @@
-p.note[data-v-95eced2f]{font-size:.8em}.wrapper[data-v-95eced2f]{display:flex;flex-direction:column;justify-content:flex-end;height:100%}img[data-v-95eced2f]{border-radius:12px;margin-bottom:20px}h4[data-v-95eced2f]{margin:0;font-size:1em}p[data-v-95eced2f]{margin:0;color:var(--fg-base-dk);font-size:.9em;display:-webkit-box;-webkit-line-clamp:5;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.small[data-v-95eced2f]{font-size:.6em;margin:auto auto 0 0}p.newsSummary a,p.newsSummary a:hover{color:var(--fg-base-dk)}font{display:none}.padding-20[data-v-dc6d7520]{padding:20px}.fillPage[data-v-dc6d7520]{display:flex;flex-direction:column;justify-content:center;align-items:center;height:calc(100vh - var(--h-header) - var(--h-player) - 200px)}
diff --git a/src/ui/dist/assets/NewsArticle-01323fcd.js.gz b/src/ui/dist/assets/NewsArticle-01323fcd.js.gz
deleted file mode 100644
index 388c8fac3..000000000
Binary files a/src/ui/dist/assets/NewsArticle-01323fcd.js.gz and /dev/null differ
diff --git a/src/ui/dist/assets/NewsArticle-03a45240.css.gz b/src/ui/dist/assets/NewsArticle-03a45240.css.gz
deleted file mode 100644
index 74bc0dae6..000000000
Binary files a/src/ui/dist/assets/NewsArticle-03a45240.css.gz and /dev/null differ
diff --git a/src/ui/dist/assets/NewsArticle-01323fcd.js b/src/ui/dist/assets/NewsArticle-37e40eeb.js
similarity index 72%
rename from src/ui/dist/assets/NewsArticle-01323fcd.js
rename to src/ui/dist/assets/NewsArticle-37e40eeb.js
index 8757d7856..3183a873e 100644
--- a/src/ui/dist/assets/NewsArticle-01323fcd.js
+++ b/src/ui/dist/assets/NewsArticle-37e40eeb.js
@@ -1 +1 @@
-import{_ as p,o as i,c as _,a as r,L as m,f as d,t as a,b as y,d as h,aH as g,e as u}from"./index-d3fba034.js";const w={name:"Error",props:{msg:String},methods:{toggleSidebar(){this.$emit("toggleSidebar")}}},v={class:"error"},b=["innerHTML"];function L(s,t,o,l,e,c){return i(),_("div",v,[r("h1",{innerHTML:o.msg},null,8,b)])}const k=p(w,[["render",L],["__scopeId","data-v-99b2e9f2"]]);const x={name:"NewsArticle",components:{Loader:m,Error:k},data(){return{error:"",article:{},fullWidth:!1}},methods:{updateData(){fetch(`/api/news/articles/${this.$route.params.url}`).then(async s=>{if(s.status==404){this.error="This wouldn't have happened if you had clicked on the links we provided! ヽ(ಠ_ಠ)ノ",setTimeout(this.updateData,1e3);return}if(s.status==400){window.open(await s.text()),this.$router.push("/news");return}if(s.status==200){if(this.article=await s.json(),this.article.headline==="N/A"){window.open(this.article.href),this.$router.push("/news");return}let t=this.article.body.split(" ").filter(e=>e.includes('href="/'));t=t.map(e=>e.split('href="')[1].split('"')[0]);const o=this.article.href.split("/")[2],l=t.map(e=>"https://"+o+e);for(const e in t){let c=l[e];fetch("/api/news/articles",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:l[e]})}).then(async n=>{n.status==200?c=await n.text():console.error(await n.text()),this.article.body=this.article.body.replaceAll(t[e],c)})}return}this.error=s.statusText})}},mounted(){this.updateData()}},T={key:2,class:"padding-20 newsArticle"},H=["innerHTML"],N={class:"leading-tight headline"},M=["innerHTML"],A={key:0,class:"date"},E=["href"],S={key:1,class:"my-4"},W=["innerHTML"];function C(s,t,o,l,e,c){const n=u("Error"),f=u("Loader");return e.error?(i(),d(n,{key:0,msg:e.error},null,8,["msg"])):e.article.headline?(i(),_("div",T,[r("span",{class:"toggleWidth material-icons-round",onClick:t[0]||(t[0]=B=>e.fullWidth=!e.fullWidth)},a(e.fullWidth?"close_fullscreen":"open_in_full"),1),r("div",{class:g([{slim:!e.fullWidth},"wrapper"])},[r("h6",{class:"accentLink topic",innerHTML:e.article.topic},null,8,H),r("h1",N,a(e.article.headline),1),r("h4",{class:"standfirst",innerHTML:e.article.standfirst},null,8,M),e.article.date?(i(),_("h6",A,[y(a(e.article.date)+", ",1),r("a",{href:e.article.href},a(e.article.href),9,E)])):h("",!0),e.article.body?(i(),_("hr",S)):h("",!0),r("div",{class:"body leading-relaxed text-md",innerHTML:e.article.body},null,8,W)],2)])):(i(),d(f,{key:1}))}const V=p(x,[["render",C],["__scopeId","data-v-32bc12c0"]]);export{V as default};
+import{_ as p,o as i,c as _,a as r,L as m,f as d,t as c,b as y,d as h,aH as g,e as u}from"./index-1856ec92.js";const w={name:"Error",props:{msg:String},methods:{toggleSidebar(){this.$emit("toggleSidebar")}}},v={class:"error"},b=["innerHTML"];function L(s,t,o,l,e,a){return i(),_("div",v,[r("h1",{innerHTML:o.msg},null,8,b)])}const k=p(w,[["render",L],["__scopeId","data-v-409a6b55"]]);const x={name:"NewsArticle",components:{Loader:m,Error:k},data(){return{error:"",article:{},fullWidth:!1}},methods:{updateData(){fetch(`/api/news/articles/${this.$route.params.url}`).then(async s=>{if(s.status==404){this.error="This wouldn't have happened if you had clicked on the links we provided! ヽ(ಠ_ಠ)ノ",setTimeout(this.updateData,1e3);return}if(s.status==400){window.open(await s.text()),this.$router.push("/news");return}if(s.status==200){if(this.article=await s.json(),this.article.headline==="N/A"){window.open(this.article.href),this.$router.push("/news");return}let t=this.article.body.split(" ").filter(e=>e.includes('href="/'));t=t.map(e=>e.split('href="')[1].split('"')[0]);const o=this.article.href.split("/")[2],l=t.map(e=>"https://"+o+e);for(const e in t){let a=l[e];fetch("/api/news/articles",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:l[e]})}).then(async n=>{n.status==200?a=await n.text():console.error(await n.text()),this.article.body=this.article.body.replaceAll(t[e],a)})}return}this.error=s.statusText})}},mounted(){this.updateData()}},T={key:2,class:"padding-20 newsArticle"},H=["innerHTML"],N={class:"leading-tight headline"},M=["innerHTML"],A={key:0,class:"date"},E=["href"],S={key:1,class:"my-4"},W=["innerHTML"];function C(s,t,o,l,e,a){const n=u("Error"),f=u("Loader");return e.error?(i(),d(n,{key:0,msg:e.error},null,8,["msg"])):e.article.headline?(i(),_("div",T,[r("span",{class:"toggleWidth material-icons-round",onClick:t[0]||(t[0]=B=>e.fullWidth=!e.fullWidth)},c(e.fullWidth?"close_fullscreen":"open_in_full"),1),r("div",{class:g([{slim:!e.fullWidth},"wrapper"])},[r("h6",{class:"accentLink topic",innerHTML:e.article.topic},null,8,H),r("h1",N,c(e.article.headline),1),r("h4",{class:"standfirst",innerHTML:e.article.standfirst},null,8,M),e.article.date?(i(),_("h6",A,[y(c(e.article.date)+", ",1),r("a",{href:e.article.href},c(e.article.href),9,E)])):h("",!0),e.article.body?(i(),_("hr",S)):h("",!0),r("div",{class:"body leading-relaxed text-md",innerHTML:e.article.body},null,8,W)],2)])):(i(),d(f,{key:1}))}const V=p(x,[["render",C],["__scopeId","data-v-32bc12c0"]]);export{V as default};
diff --git a/src/ui/dist/assets/NewsArticle-37e40eeb.js.gz b/src/ui/dist/assets/NewsArticle-37e40eeb.js.gz
new file mode 100644
index 000000000..a921bef74
Binary files /dev/null and b/src/ui/dist/assets/NewsArticle-37e40eeb.js.gz differ
diff --git a/src/ui/dist/assets/NewsArticle-03a45240.css b/src/ui/dist/assets/NewsArticle-f71d5ef8.css
similarity index 94%
rename from src/ui/dist/assets/NewsArticle-03a45240.css
rename to src/ui/dist/assets/NewsArticle-f71d5ef8.css
index 621e75ced..905098bce 100644
--- a/src/ui/dist/assets/NewsArticle-03a45240.css
+++ b/src/ui/dist/assets/NewsArticle-f71d5ef8.css
@@ -1 +1 @@
-.error h1 p.smaller{font-weight:400;font-size:.5em}.error h1 p.muted{color:var(--fg-base-dk)}.error h1 p.accent{color:var(--fg-secondary)}.mobileMenu[data-v-99b2e9f2]{display:flex;flex-direction:row;justify-content:center}.error[data-v-99b2e9f2]{width:100%;height:100%;display:flex;justify-content:center;flex-direction:column;align-content:center;text-align:center}.padding-20[data-v-32bc12c0]{padding:20px}.toggleWidth[data-v-32bc12c0]{position:absolute;right:20px;top:calc(var(--h-header) + 20px)}.toggleWidth[data-v-32bc12c0]:hover{cursor:pointer}.newsArticle[data-v-32bc12c0]{display:flex;flex-direction:column;justify-content:center;align-items:center;width:calc(100% - 40px)}.newsArticle .wrapper[data-v-32bc12c0]{width:100%}.newsArticle .wrapper.slim[data-v-32bc12c0]{max-width:600px}div.body[data-v-32bc12c0]{display:flex;flex-direction:column}.date[data-v-32bc12c0]{font-size:.7em;margin:0;font-weight:400;color:var(--fg-base-dk)}.date *[data-v-32bc12c0]{color:var(--fg-base-dk)}.headline[data-v-32bc12c0]{font-size:3em;margin:10px 0;font-weight:900}.standfirst[data-v-32bc12c0]{margin:10px 0;font-weight:700;font-size:1.7em}.topic[data-v-32bc12c0]{margin:10px 0;font-size:1.4em}h4.standfirst img,div.newsArticle div.body img,div.newsArticle div.body amp-img{max-width:100%;height:auto;border-radius:10px}div.newsArticle a{color:var(--fg-base)}div.newsArticle .accentLink,div.newsArticle .accentLink *{color:var(--fg-secondary);text-decoration:none}figure{max-width:50%;margin:0;color:var(--fg-base-dk)!important;font-size:.8em}figure svg{fill:var(--fg-base-dk)!important;margin-right:5px}div.article-body-viewer-selector{display:flex;flex-direction:column}.related{background:var(--bg-base-lt);padding:20px;border-radius:10px;border:var(--border-container)}.related li{list-style-type:none;margin:0}.related ul{margin:20px 0 0;display:flex;flex-direction:column;list-style:inside;padding:0}.related ul a{margin-left:0;display:flex;flex-direction:row;justify-content:flex-start}.related ul a span:not(:last-child){margin-right:20px}p:not(:last-child){margin-bottom:1em}svg.logo-stamp{width:20px;height:20px;margin-right:10px}div.newsletter-component,form{display:none}iframe{position:inherit!important}
+.error h1 p.smaller{font-weight:400;font-size:.5em}.error h1 p.muted{color:var(--fg-base-dk)}.error h1 p.accent{color:var(--fg-secondary)}.mobileMenu[data-v-409a6b55]{display:flex;flex-direction:row;justify-content:center}.error[data-v-409a6b55]{width:100%;height:100%;display:flex;justify-content:center;flex-direction:column;align-content:center;text-align:center}.padding-20[data-v-32bc12c0]{padding:20px}.toggleWidth[data-v-32bc12c0]{position:absolute;right:20px;top:calc(var(--h-header) + 20px)}.toggleWidth[data-v-32bc12c0]:hover{cursor:pointer}.newsArticle[data-v-32bc12c0]{display:flex;flex-direction:column;justify-content:center;align-items:center;width:calc(100% - 40px)}.newsArticle .wrapper[data-v-32bc12c0]{width:100%}.newsArticle .wrapper.slim[data-v-32bc12c0]{max-width:600px}div.body[data-v-32bc12c0]{display:flex;flex-direction:column}.date[data-v-32bc12c0]{font-size:.7em;margin:0;font-weight:400;color:var(--fg-base-dk)}.date *[data-v-32bc12c0]{color:var(--fg-base-dk)}.headline[data-v-32bc12c0]{font-size:3em;margin:10px 0;font-weight:900}.standfirst[data-v-32bc12c0]{margin:10px 0;font-weight:700;font-size:1.7em}.topic[data-v-32bc12c0]{margin:10px 0;font-size:1.4em}h4.standfirst img,div.newsArticle div.body img,div.newsArticle div.body amp-img{max-width:100%;height:auto;border-radius:10px}div.newsArticle a{color:var(--fg-base)}div.newsArticle .accentLink,div.newsArticle .accentLink *{color:var(--fg-secondary);text-decoration:none}figure{max-width:50%;margin:0;color:var(--fg-base-dk)!important;font-size:.8em}figure svg{fill:var(--fg-base-dk)!important;margin-right:5px}div.article-body-viewer-selector{display:flex;flex-direction:column}.related{background:var(--bg-base-lt);padding:20px;border-radius:10px;border:var(--border-container)}.related li{list-style-type:none;margin:0}.related ul{margin:20px 0 0;display:flex;flex-direction:column;list-style:inside;padding:0}.related ul a{margin-left:0;display:flex;flex-direction:row;justify-content:flex-start}.related ul a span:not(:last-child){margin-right:20px}p:not(:last-child){margin-bottom:1em}svg.logo-stamp{width:20px;height:20px;margin-right:10px}div.newsletter-component,form{display:none}iframe{position:inherit!important}
diff --git a/src/ui/dist/assets/NewsArticle-f71d5ef8.css.gz b/src/ui/dist/assets/NewsArticle-f71d5ef8.css.gz
new file mode 100644
index 000000000..bd8278f17
Binary files /dev/null and b/src/ui/dist/assets/NewsArticle-f71d5ef8.css.gz differ
diff --git a/src/ui/dist/assets/Playlist-8c4c6944.js b/src/ui/dist/assets/Playlist-8c4c6944.js
deleted file mode 100644
index b3ad86552..000000000
--- a/src/ui/dist/assets/Playlist-8c4c6944.js
+++ /dev/null
@@ -1 +0,0 @@
-import{P as r}from"./PlaylistHeader-8dd53ec0.js";import{E as l}from"./ExternalEntry-8bf31741.js";import{n as i,o as s,c as a,g as c,a as d,F as _,i as p,f as u,l as m,m as y,_ as v}from"./index-d3fba034.js";const h=e=>(m("data-v-a918d839"),e=e(),y(),e),f={class:"playlist"},g=h(()=>d("hr",null,null,-1)),P={class:"entries"},B=i({__name:"Playlist",props:{songs:{type:Array,required:!0},noCover:{type:Boolean,default:!1}},setup(e){return(n,w)=>(s(),a("div",f,[c(r,{"without-duration":""}),g,d("div",P,[(s(!0),a(_,null,p(e.songs,(t,o)=>(s(),u(l,{key:t.source,added:t.added,index:o,song:t,title:t.title,"with-cover":!e.noCover,onAdd:x=>n.$emit("add",o)},null,8,["added","index","song","title","with-cover","onAdd"]))),128))])]))}});const C=v(B,[["__scopeId","data-v-a918d839"]]);export{C as P};
diff --git a/src/ui/dist/assets/Playlist-b839cbd8.css b/src/ui/dist/assets/Playlist-b839cbd8.css
new file mode 100644
index 000000000..57dcccb75
--- /dev/null
+++ b/src/ui/dist/assets/Playlist-b839cbd8.css
@@ -0,0 +1 @@
+.playlist[data-v-43692079]{position:relative}.playlist .entries[data-v-43692079]{position:relative;overflow-y:auto;display:flex;flex-direction:column;height:100%;max-height:30vh}
diff --git a/src/ui/dist/assets/Playlist-c4a6975e.css b/src/ui/dist/assets/Playlist-c4a6975e.css
deleted file mode 100644
index 6e3b30498..000000000
--- a/src/ui/dist/assets/Playlist-c4a6975e.css
+++ /dev/null
@@ -1 +0,0 @@
-.playlist[data-v-a918d839]{position:relative}.playlist .entries[data-v-a918d839]{position:relative;overflow-y:auto;display:flex;flex-direction:column;height:100%;max-height:30vh}
diff --git a/src/ui/dist/assets/Playlist-f5edc8c9.js b/src/ui/dist/assets/Playlist-f5edc8c9.js
new file mode 100644
index 000000000..61aeb6c0a
--- /dev/null
+++ b/src/ui/dist/assets/Playlist-f5edc8c9.js
@@ -0,0 +1 @@
+import{P as r}from"./PlaylistHeader-40afea3c.js";import{E as l}from"./ExternalEntry-4cf58b98.js";import{n as i,o as s,c as a,g as c,a as n,F as _,i as p,f as u,l as m,m as y,_ as v}from"./index-1856ec92.js";const h=e=>(m("data-v-43692079"),e=e(),y(),e),f={class:"playlist"},g=h(()=>n("hr",null,null,-1)),P={class:"entries"},B=i({__name:"Playlist",props:{songs:{type:Array,required:!0},noCover:{type:Boolean,default:!1}},setup(e){return(d,w)=>(s(),a("div",f,[c(r,{"without-duration":""}),g,n("div",P,[(s(!0),a(_,null,p(e.songs,(t,o)=>(s(),u(l,{key:t.source,added:t.added,index:o,song:t,title:t.title,"with-cover":!e.noCover,onAdd:x=>d.$emit("add",o)},null,8,["added","index","song","title","with-cover","onAdd"]))),128))])]))}});const C=v(B,[["__scopeId","data-v-43692079"]]);export{C as P};
diff --git a/src/ui/dist/assets/Playlist.vue_vue_type_script_setup_true_lang-5613d1e1.js b/src/ui/dist/assets/Playlist.vue_vue_type_script_setup_true_lang-8d47af92.js
similarity index 71%
rename from src/ui/dist/assets/Playlist.vue_vue_type_script_setup_true_lang-5613d1e1.js
rename to src/ui/dist/assets/Playlist.vue_vue_type_script_setup_true_lang-8d47af92.js
index 275c23e52..d70dc2b8c 100644
--- a/src/ui/dist/assets/Playlist.vue_vue_type_script_setup_true_lang-5613d1e1.js
+++ b/src/ui/dist/assets/Playlist.vue_vue_type_script_setup_true_lang-8d47af92.js
@@ -1 +1 @@
-import{P as o}from"./PlaylistEntry-0d2da2e2.js";import{P as i}from"./PlaylistHeader-8dd53ec0.js";import{n as c,q as n,c as l,g as d,F as p,i as u,d as y,o as a,f}from"./index-d3fba034.js";const m={key:0,ref:"playlist-scroll",class:"playlist"},h=c({__name:"Playlist",props:{playlist:{type:Object,required:!1}},setup(t){const s=n(-1);return(k,v)=>t.playlist?(a(),l("div",m,[d(i),(a(!0),l(p,null,u(t.playlist.songs,(e,r)=>(a(),f(o,{id:"bplayer-entry-"+e.id,key:e.source,index:r,selected:s.value==e.id,song:e,"with-cover":"",onClick:_=>s.value==e.id?s.value=-1:s.value=e.id},null,8,["id","index","selected","song","onClick"]))),128))],512)):y("",!0)}});export{h as _};
+import{P as o}from"./PlaylistEntry-18ad8a22.js";import{P as i}from"./PlaylistHeader-40afea3c.js";import{n as c,q as n,c as l,g as d,F as p,i as u,d as y,o as a,f}from"./index-1856ec92.js";const m={key:0,ref:"playlist-scroll",class:"playlist"},h=c({__name:"Playlist",props:{playlist:{type:Object,required:!1}},setup(t){const s=n(-1);return(k,v)=>t.playlist?(a(),l("div",m,[d(i),(a(!0),l(p,null,u(t.playlist.songs,(e,r)=>(a(),f(o,{id:"bplayer-entry-"+e.id,key:e.source,index:r,selected:s.value==e.id,song:e,"with-cover":"",onClick:_=>s.value==e.id?s.value=-1:s.value=e.id},null,8,["id","index","selected","song","onClick"]))),128))],512)):y("",!0)}});export{h as _};
diff --git a/src/ui/dist/assets/PlaylistEntry-0d2da2e2.js.gz b/src/ui/dist/assets/PlaylistEntry-0d2da2e2.js.gz
deleted file mode 100644
index 8775ce0f2..000000000
Binary files a/src/ui/dist/assets/PlaylistEntry-0d2da2e2.js.gz and /dev/null differ
diff --git a/src/ui/dist/assets/PlaylistEntry-0d2da2e2.js b/src/ui/dist/assets/PlaylistEntry-18ad8a22.js
similarity index 75%
rename from src/ui/dist/assets/PlaylistEntry-0d2da2e2.js
rename to src/ui/dist/assets/PlaylistEntry-18ad8a22.js
index 73576299d..96fc4b29d 100644
--- a/src/ui/dist/assets/PlaylistEntry-0d2da2e2.js
+++ b/src/ui/dist/assets/PlaylistEntry-18ad8a22.js
@@ -1 +1 @@
-import{n as V,j as W,A as _,q as A,bD as Y,o as l,c as y,r as X,g as o,w as a,b as f,F as O,i as R,f as P,t as p,u as c,d as w,c2 as G,bN as J,bR as K,x as Q,c9 as Z,e as b,b0 as ee,B as te,a as m,aH as N,h as oe,M as T,z as se,bW as ne,cg as ae,c1 as ie,ch as le,_ as ue}from"./index-d3fba034.js";import{_ as re}from"./EditSong.vue_vue_type_script_setup_true_lang-28aa0cb5.js";import{p as de}from"./playerInPicture-af203fdf.js";const ce=V({__name:"SongContext",props:{song:{type:Object,required:!0},playlistId:{type:String,required:!1,default:""}},emits:["update","edit"],setup(e,{expose:B,emit:n}){const t=e,I=W(),u=_(()=>I.playlists),C=_(()=>t.playlistId==-1),k=()=>{de(t.song.artist,t.song.title,t.song.source)},h=async s=>{var r;s!=-1&&(await J(s,t.song),K.addSuccess(t.song.title,`Added to ${(r=u.value.find(i=>i.id==s))==null?void 0:r.name}`,3e3),n("update"))},$=async()=>{const s=await Q(t.song.title,t.song.artist,t.song.cover);await h(s),n("update")},D=async()=>{await Z(t.playlistId,t.song.id),n("update")},S=A(null),g=A(null),v=()=>{g.value.visible?q():x()},q=()=>{g.value.hide()},x=()=>{const s=S.value.getBoundingClientRect(),r={top:s.height+s.top+window.scrollY,left:s.width+s.left+window.scrollX};g.value.show(r)};B({show:x,toggle:v,hide:q});const E=_(()=>({Soundcloud:`https://soundcloud.com/search?q=${t.song.artist} ${t.song.title}`,Audius:`https://audius.co/search/${t.song.artist} ${t.song.title}`,"Youtube Music":`https://music.youtube.com/search?q=${t.song.artist} ${t.song.title}`,Spotify:`https://open.spotify.com/search/${t.song.artist} ${t.song.title}`})),F=()=>{n("edit")},L=s=>{window.open(E.value[s]),F()};return(s,r)=>{const i=b("v-contextmenu-item"),j=b("v-contextmenu-submenu"),M=b("v-contextmenu-divider"),U=b("v-contextmenu"),z=ee("contextmenu");return Y((l(),y("div",{ref_key:"box",ref:S},[X(s.$slots,"default"),o(U,{ref_key:"contextmenu",ref:g},{default:a(()=>[o(i,{onClick:k},{default:a(()=>[f(" Preview ")]),_:1}),o(j,{title:"Find source"},{default:a(()=>[(l(!0),y(O,null,R(Object.keys(c(E)),d=>(l(),P(i,{key:d,onClick:H=>L(d)},{default:a(()=>[f(p(d),1)]),_:2},1032,["onClick"]))),128))]),_:1}),o(M),o(i,{onClick:r[0]||(r[0]=d=>s.$emit("like"))},{default:a(()=>[f(p((e.song.favourite?"Remove from":"Save to")+" your Liked Songs"),1)]),_:1}),c(C)?w("",!0):(l(),P(i,{key:0,onClick:D},{default:a(()=>[f(" Remove from this playlist ")]),_:1})),o(j,{title:"Add to playlist"},{default:a(()=>[o(i,{onClick:$},{default:a(()=>[f("Add to new playlist")]),_:1}),o(M),(l(!0),y(O,null,R(c(u),d=>(l(),P(i,{key:d.id,onClick:H=>h(d.id)},{default:a(()=>[f(p(d.name),1)]),_:2},1032,["onClick"]))),128))]),_:1}),o(M),o(i,{onClick:F},{default:a(()=>[f(" Update Metadata ")]),_:1}),o(M),o(i,{onClick:r[1]||(r[1]=d=>c(G)(e.song.id))},{default:a(()=>[f("Download")]),_:1})]),_:1},512)])),[[z,void 0,"contextmenu"]])}}}),ve={key:0,class:"cover"},fe={class:"artist-title"},ge={class:"title"},me={class:"artist"},ye={key:1,class:"album"},pe={class:"duration text-center"},ke=V({__name:"PlaylistEntry",props:{song:{type:Object,required:!0},index:{type:Number,required:!0},withCover:{type:Boolean,required:!1,default:!1},withAlbum:{type:Boolean,required:!1,default:!1},withMore:{type:Boolean,required:!1,default:!1},selected:{type:Boolean,required:!1,default:!1},playlistId:{type:String,required:!1,default:null}},emits:["update"],setup(e,{emit:B}){const n=e,t=te(),I=_(()=>n.song.id==t.song.id),u=A(!1),C=()=>{n.song.favourite=!n.song.favourite,le(n.song.id,n.song.favourite)},k=_(()=>n.playlistId==null?t.playlist.id:n.playlistId),h=()=>{if(k.value=="track"){t.loadPlaylist("track",n.song.id);return}t.loadSong(k.value,n.index)},$=A(null),D=()=>{$.value.show()},S=()=>{B("update")};return(g,v)=>{const q=b("router-link");return l(),P(ce,{ref:"ctxMenu",liked:e.song.favourite,playlistId:c(k),song:e.song,onEdit:D,onLike:C,onUpdate:S},{default:a(()=>[o(re,{ref_key:"updatePopup",ref:$,song:e.song,onUpdate:v[0]||(v[0]=x=>g.$emit("update"))},null,8,["song"]),m("div",{class:N([{playing:c(I),selected:e.selected,hovering:u.value,withCover:e.withCover,withAlbum:e.withAlbum,withMore:e.withMore},"playlist-entry"]),onDblclick:h,onMouseenter:v[2]||(v[2]=x=>u.value=!0),onMouseleave:v[3]||(v[3]=x=>u.value=!1)},[m("div",{class:N([{"material-symbols-rounded":u.value},"index text-right"]),onClick:h},p(u.value?"play_arrow":e.index+1),3),e.withCover?(l(),y("div",ve,[o(oe,{src:e.song.cover,type:"track"},null,8,["src"])])):w("",!0),m("div",fe,[m("span",ge,[o(q,{to:`/track/${c(se)(e.song.id)}`,class:"linkOnHover"},{default:a(()=>[o(T,{text:e.song.title},null,8,["text"])]),_:1},8,["to"])]),m("span",me,[o(ne,{artist:e.song.artist,class:"text-muted text-xs"},null,8,["artist"])])]),e.withAlbum&&!c(ae)?(l(),y("div",ye,[o(T,{text:e.song.album},null,8,["text"])])):w("",!0),e.selected||u.value||e.song.favourite?(l(),y("div",{key:2,class:N([{favourite:e.song.favourite},"favourite-icon icon text-right material-symbols-rounded"]),onClick:C},p(e.song.favourite?"favorite":"heart_plus"),3)):w("",!0),m("div",pe,p(c(ie)(e.song.duration)),1),w("",!0)],34)]),_:1},8,["liked","playlistId","song"])}}});const be=ue(ke,[["__scopeId","data-v-718c5b3c"]]);export{be as P};
+import{n as L,j as Y,A as _,q as A,bD as Q,o as l,c as y,r as W,g as o,w as a,b as f,F as j,i as O,f as P,t as p,u as c,d as w,c1 as X,bM as G,bQ as J,x as K,c8 as Z,e as b,b0 as ee,B as te,a as m,aH as N,h as oe,M as T,z as se,bV as ne,cf as ae,c0 as ie,cg as le,_ as ue}from"./index-1856ec92.js";import{_ as re}from"./EditSong.vue_vue_type_script_setup_true_lang-8a2aaef1.js";import{p as de}from"./playerInPicture-af203fdf.js";const ce=L({__name:"SongContext",props:{song:{type:Object,required:!0},playlistId:{type:String,required:!1,default:""}},emits:["update","edit"],setup(e,{expose:B,emit:n}){const t=e,I=Y(),u=_(()=>I.playlists),C=_(()=>t.playlistId==-1),k=()=>{de(t.song.artist,t.song.title,t.song.source)},h=async s=>{var r;s!=-1&&(await G(s,t.song),J.addSuccess(t.song.title,`Added to ${(r=u.value.find(i=>i.id==s))==null?void 0:r.name}`,3e3),n("update"))},$=async()=>{const s=await K(t.song.title,t.song.artist,t.song.cover);await h(s),n("update")},D=async()=>{await Z(t.playlistId,t.song.id),n("update")},S=A(null),g=A(null),v=()=>{g.value.visible?q():x()},q=()=>{g.value.hide()},x=()=>{const s=S.value.getBoundingClientRect(),r={top:s.height+s.top+window.scrollY,left:s.width+s.left+window.scrollX};g.value.show(r)};B({show:x,toggle:v,hide:q});const E=_(()=>({Soundcloud:`https://soundcloud.com/search?q=${t.song.artist} ${t.song.title}`,Audius:`https://audius.co/search/${t.song.artist} ${t.song.title}`,"Youtube Music":`https://music.youtube.com/search?q=${t.song.artist} ${t.song.title}`,Spotify:`https://open.spotify.com/search/${t.song.artist} ${t.song.title}`})),F=()=>{n("edit")},R=s=>{window.open(E.value[s]),F()};return(s,r)=>{const i=b("v-contextmenu-item"),V=b("v-contextmenu-submenu"),M=b("v-contextmenu-divider"),U=b("v-contextmenu"),z=ee("contextmenu");return Q((l(),y("div",{ref_key:"box",ref:S},[W(s.$slots,"default"),o(U,{ref_key:"contextmenu",ref:g},{default:a(()=>[o(i,{onClick:k},{default:a(()=>[f(" Preview ")]),_:1}),o(V,{title:"Find source"},{default:a(()=>[(l(!0),y(j,null,O(Object.keys(c(E)),d=>(l(),P(i,{key:d,onClick:H=>R(d)},{default:a(()=>[f(p(d),1)]),_:2},1032,["onClick"]))),128))]),_:1}),o(M),o(i,{onClick:r[0]||(r[0]=d=>s.$emit("like"))},{default:a(()=>[f(p((e.song.favourite?"Remove from":"Save to")+" your Liked Songs"),1)]),_:1}),c(C)?w("",!0):(l(),P(i,{key:0,onClick:D},{default:a(()=>[f(" Remove from this playlist ")]),_:1})),o(V,{title:"Add to playlist"},{default:a(()=>[o(i,{onClick:$},{default:a(()=>[f("Add to new playlist")]),_:1}),o(M),(l(!0),y(j,null,O(c(u),d=>(l(),P(i,{key:d.id,onClick:H=>h(d.id)},{default:a(()=>[f(p(d.name),1)]),_:2},1032,["onClick"]))),128))]),_:1}),o(M),o(i,{onClick:F},{default:a(()=>[f(" Update Metadata ")]),_:1}),o(M),o(i,{onClick:r[1]||(r[1]=d=>c(X)(e.song.id))},{default:a(()=>[f("Download")]),_:1})]),_:1},512)])),[[z,void 0,"contextmenu"]])}}}),ve={key:0,class:"cover"},fe={class:"artist-title"},ge={class:"title"},me={class:"artist"},ye={key:1,class:"album"},pe={class:"duration text-center"},ke=L({__name:"PlaylistEntry",props:{song:{type:Object,required:!0},index:{type:Number,required:!0},withCover:{type:Boolean,required:!1,default:!1},withAlbum:{type:Boolean,required:!1,default:!1},withMore:{type:Boolean,required:!1,default:!1},selected:{type:Boolean,required:!1,default:!1},playlistId:{type:String,required:!1,default:null}},emits:["update"],setup(e,{emit:B}){const n=e,t=te(),I=_(()=>n.song.id==t.song.id),u=A(!1),C=()=>{n.song.favourite=!n.song.favourite,le(n.song.id,n.song.favourite)},k=_(()=>n.playlistId==null?t.playlist.id:n.playlistId),h=()=>{if(k.value=="track"){t.loadPlaylist("track",n.song.id);return}t.loadSong(k.value,n.index)},$=A(null),D=()=>{$.value.show()},S=()=>{B("update")};return(g,v)=>{const q=b("router-link");return l(),P(ce,{ref:"ctxMenu",liked:e.song.favourite,playlistId:c(k),song:e.song,onEdit:D,onLike:C,onUpdate:S},{default:a(()=>[o(re,{ref_key:"updatePopup",ref:$,song:e.song,onUpdate:v[0]||(v[0]=x=>g.$emit("update"))},null,8,["song"]),m("div",{class:N([{playing:c(I),selected:e.selected,hovering:u.value,withCover:e.withCover,withAlbum:e.withAlbum,withMore:e.withMore},"playlist-entry"]),onDblclick:h,onMouseenter:v[2]||(v[2]=x=>u.value=!0),onMouseleave:v[3]||(v[3]=x=>u.value=!1)},[m("div",{class:N([{"material-symbols-rounded":u.value},"index text-right"]),onClick:h},p(u.value?"play_arrow":e.index+1),3),e.withCover?(l(),y("div",ve,[o(oe,{src:e.song.cover,type:"track"},null,8,["src"])])):w("",!0),m("div",fe,[m("span",ge,[o(q,{to:`/track/${c(se)(e.song.id)}`,class:"linkOnHover"},{default:a(()=>[o(T,{text:e.song.title},null,8,["text"])]),_:1},8,["to"])]),m("span",me,[o(ne,{artist:e.song.artist,class:"text-muted text-xs"},null,8,["artist"])])]),e.withAlbum&&!c(ae)?(l(),y("div",ye,[o(T,{text:e.song.album},null,8,["text"])])):w("",!0),e.selected||u.value||e.song.favourite?(l(),y("div",{key:2,class:N([{favourite:e.song.favourite},"favourite-icon icon text-right material-symbols-rounded"]),onClick:C},p(e.song.favourite?"favorite":"heart_plus"),3)):w("",!0),m("div",pe,p(c(ie)(e.song.duration)),1),w("",!0)],34)]),_:1},8,["liked","playlistId","song"])}}});const be=ue(ke,[["__scopeId","data-v-718c5b3c"]]);export{be as P};
diff --git a/src/ui/dist/assets/PlaylistEntry-18ad8a22.js.gz b/src/ui/dist/assets/PlaylistEntry-18ad8a22.js.gz
new file mode 100644
index 000000000..9c3667867
Binary files /dev/null and b/src/ui/dist/assets/PlaylistEntry-18ad8a22.js.gz differ
diff --git a/src/ui/dist/assets/PlaylistHeader-8dd53ec0.js b/src/ui/dist/assets/PlaylistHeader-40afea3c.js
similarity index 92%
rename from src/ui/dist/assets/PlaylistHeader-8dd53ec0.js
rename to src/ui/dist/assets/PlaylistHeader-40afea3c.js
index baddd1585..8c4d0db8b 100644
--- a/src/ui/dist/assets/PlaylistHeader-8dd53ec0.js
+++ b/src/ui/dist/assets/PlaylistHeader-40afea3c.js
@@ -1 +1 @@
-import{n as i,c as t,d as l,aH as d,o as a,l as c,m as r,a as s,_ as n}from"./index-d3fba034.js";const o=e=>(c("data-v-f8e4524a"),e=e(),r(),e),u=o(()=>s("div",{class:"index text-right"},"#",-1)),_=o(()=>s("div",{class:"artist-title"}," title ",-1)),h={key:0,class:"album"},m={key:1,class:"duration"},f=o(()=>s("span",{class:"material-symbols-rounded"},"schedule",-1)),p=[f],y=i({__name:"PlaylistHeader",props:{withAlbum:{type:Boolean,required:!1,default:!1},withMore:{type:Boolean,required:!1,default:!1},withoutDuration:{type:Boolean,required:!1,default:!1}},setup(e){return(w,v)=>(a(),t("div",{class:d([{withAlbum:e.withAlbum,withMore:e.withMore},"playlist-header"])},[u,_,e.withAlbum?(a(),t("div",h," album ")):l("",!0),e.withoutDuration?l("",!0):(a(),t("div",m,p))],2))}});const x=n(y,[["__scopeId","data-v-f8e4524a"]]);export{x as P};
+import{n as i,c as t,d as l,aH as d,o as a,l as c,m as r,a as s,_ as n}from"./index-1856ec92.js";const o=e=>(c("data-v-f8e4524a"),e=e(),r(),e),u=o(()=>s("div",{class:"index text-right"},"#",-1)),_=o(()=>s("div",{class:"artist-title"}," title ",-1)),h={key:0,class:"album"},m={key:1,class:"duration"},f=o(()=>s("span",{class:"material-symbols-rounded"},"schedule",-1)),p=[f],y=i({__name:"PlaylistHeader",props:{withAlbum:{type:Boolean,required:!1,default:!1},withMore:{type:Boolean,required:!1,default:!1},withoutDuration:{type:Boolean,required:!1,default:!1}},setup(e){return(w,v)=>(a(),t("div",{class:d([{withAlbum:e.withAlbum,withMore:e.withMore},"playlist-header"])},[u,_,e.withAlbum?(a(),t("div",h," album ")):l("",!0),e.withoutDuration?l("",!0):(a(),t("div",m,p))],2))}});const x=n(y,[["__scopeId","data-v-f8e4524a"]]);export{x as P};
diff --git a/src/ui/dist/assets/PlaylistItem-a7b148e6.js b/src/ui/dist/assets/PlaylistItem-035a1f18.js
similarity index 82%
rename from src/ui/dist/assets/PlaylistItem-a7b148e6.js
rename to src/ui/dist/assets/PlaylistItem-035a1f18.js
index 67628a018..4815209da 100644
--- a/src/ui/dist/assets/PlaylistItem-a7b148e6.js
+++ b/src/ui/dist/assets/PlaylistItem-035a1f18.js
@@ -1 +1 @@
-import{n as k,j as T,q as d,o as p,f as v,w as P,g as u,u as x,b$ as A,a as i,bN as I,x as j,_ as N,C as B,h as D,p as M,e as _,d as g,c as O,t as b}from"./index-d3fba034.js";import{T as q}from"./Template-deebb6b8.js";import{F as V}from"./Form-f0cd8cf2.js";import{P as E}from"./Playlist-8c4c6944.js";import{T as F}from"./ExternalEntry-8bf31741.js";import{p as H}from"./playerInPicture-af203fdf.js";const L=i("br",null,null,-1),W=k({__name:"ImportSpotifyPlaylist",props:{playlist:{type:Object,required:!0}},setup(n,{expose:r}){const t=n,y=T(),c=d([{name:"playlist",type:"dropdown",required:!0,value:null,options:y.playlistsAsDropdown}]),l=d(null),o=d(null),s=d([]),m=async()=>{if(l.value.load(),s.value.length==0){const e=await fetch(`/api/spotify/playlists/${t.playlist.id}`);s.value=await e.json()}l.value.show()},f=()=>{H("Spotify Playlist",t.playlist.name,t.playlist.href)},h=async e=>{if(e==="new"){const a=await j(t.playlist.name,t.playlist.description,t.playlist.cover);return c.value[0].options=y.playlistsAsDropdown,c.value[0].value=a,a}return Number(e)},w=async(e,a=null)=>{s.value[e].added||(a??(a=o.value.toObject().playlist),a=await h(a),await I(a??o.value.toObject().playlist,s.value[e]),s.value[e].added=!0)},S=async()=>{let e=o.value.toObject().playlist;e=await h(e),s.value.forEach((a,C)=>{w(C,e)})};return r({show:m}),(e,a)=>(p(),v(q,{ref_key:"modal",ref:l,submit:{label:"Add All",icon:"add"},name:"Import Playlist",onClose:a[0]||(a[0]=C=>e.$emit("close")),onSubmit:S},{default:P(()=>[u(F,{cover:n.playlist.cover,icons:[{name:"share",onClick:()=>x(A)(n.playlist.href)},{name:"play_arrow",onClick:f}],title:n.playlist.name},null,8,["cover","icons","title"]),u(V,{ref_key:"form",ref:o,options:c.value},null,8,["options"]),L,u(E,{songs:s.value,onAdd:w},null,8,["songs"])]),_:1},512))}});const z={components:{Card:B,Cover:D,AddPlaylistToPlaylist:W},name:"PlaylistItem",methods:{parseCover:M,redirect(){this.spotify?this.$refs.import.show():this.$router.push(this.href)}},props:{cover:String,title:String,description:String,href:String,spotify:Boolean,id:String,type:{type:String,default:"classic"}}},G={class:"title"},J={key:0,class:"material-symbols-rounded"},K=["innerHTML"];function Q(n,r,t,y,c,l){const o=_("add-playlist-to-playlist"),s=_("Cover"),m=_("Card");return p(),v(m,{class:"wrapper drop-shadow-md","with-hover":""},{default:P(()=>[t.spotify?(p(),v(o,{key:0,ref:"import",playlist:{cover:t.cover,name:t.title,description:t.description,id:t.id,href:t.href}},null,8,["playlist"])):g("",!0),i("div",{class:"item",onClick:r[0]||(r[0]=(...f)=>l.redirect&&l.redirect(...f))},[u(s,{src:l.parseCover(t.cover),type:"playlist"},null,8,["src"]),i("div",G,[t.type!="classic"?(p(),O("span",J,b(t.type=="smart"?"neurology":"bolt"),1)):g("",!0),i("h4",null,b(t.title),1)]),i("p",{class:"text-muted text-xs hideIfMobile",innerHTML:t.description},null,8,K)])]),_:1})}const tt=N(z,[["render",Q],["__scopeId","data-v-7d67aac6"]]);export{tt as P};
+import{n as k,j as T,q as d,o as p,f as v,w as P,g as u,u as x,b_ as A,a as i,bM as I,x as j,_ as B,C as M,h as N,p as D,e as _,d as g,c as O,t as b}from"./index-1856ec92.js";import{T as q}from"./Template-8c03613c.js";import{F as V}from"./Form-d27a37bd.js";import{P as E}from"./Playlist-f5edc8c9.js";import{T as F}from"./ExternalEntry-4cf58b98.js";import{p as H}from"./playerInPicture-af203fdf.js";const L=i("br",null,null,-1),W=k({__name:"ImportSpotifyPlaylist",props:{playlist:{type:Object,required:!0}},setup(n,{expose:r}){const t=n,y=T(),c=d([{name:"playlist",type:"dropdown",required:!0,value:null,options:y.playlistsAsDropdown}]),l=d(null),o=d(null),s=d([]),m=async()=>{if(l.value.load(),s.value.length==0){const e=await fetch(`/api/spotify/playlists/${t.playlist.id}`);s.value=await e.json()}l.value.show()},f=()=>{H("Spotify Playlist",t.playlist.name,t.playlist.href)},h=async e=>{if(e==="new"){const a=await j(t.playlist.name,t.playlist.description,t.playlist.cover);return c.value[0].options=y.playlistsAsDropdown,c.value[0].value=a,a}return Number(e)},w=async(e,a=null)=>{s.value[e].added||(a??(a=o.value.toObject().playlist),a=await h(a),await I(a??o.value.toObject().playlist,s.value[e]),s.value[e].added=!0)},S=async()=>{let e=o.value.toObject().playlist;e=await h(e),s.value.forEach((a,C)=>{w(C,e)})};return r({show:m}),(e,a)=>(p(),v(q,{ref_key:"modal",ref:l,submit:{label:"Add All",icon:"add"},name:"Import Playlist",onClose:a[0]||(a[0]=C=>e.$emit("close")),onSubmit:S},{default:P(()=>[u(F,{cover:n.playlist.cover,icons:[{name:"share",onClick:()=>x(A)(n.playlist.href)},{name:"play_arrow",onClick:f}],title:n.playlist.name},null,8,["cover","icons","title"]),u(V,{ref_key:"form",ref:o,options:c.value},null,8,["options"]),L,u(E,{songs:s.value,onAdd:w},null,8,["songs"])]),_:1},512))}});const z={components:{Card:M,Cover:N,AddPlaylistToPlaylist:W},name:"PlaylistItem",methods:{parseCover:D,redirect(){this.spotify?this.$refs.import.show():this.$router.push(this.href)}},props:{cover:String,title:String,description:String,href:String,spotify:Boolean,id:String,type:{type:String,default:"classic"}}},G={class:"title"},J={key:0,class:"material-symbols-rounded"},K=["innerHTML"];function Q(n,r,t,y,c,l){const o=_("add-playlist-to-playlist"),s=_("Cover"),m=_("Card");return p(),v(m,{class:"wrapper drop-shadow-md","with-hover":""},{default:P(()=>[t.spotify?(p(),v(o,{key:0,ref:"import",playlist:{cover:t.cover,name:t.title,description:t.description,id:t.id,href:t.href}},null,8,["playlist"])):g("",!0),i("div",{class:"item",onClick:r[0]||(r[0]=(...f)=>l.redirect&&l.redirect(...f))},[u(s,{src:l.parseCover(t.cover),type:"playlist"},null,8,["src"]),i("div",G,[t.type!="classic"?(p(),O("span",J,b(t.type=="smart"?"neurology":"bolt"),1)):g("",!0),i("h4",null,b(t.title),1)]),i("p",{class:"text-muted text-xs hideIfMobile",innerHTML:t.description},null,8,K)])]),_:1})}const tt=B(z,[["render",Q],["__scopeId","data-v-7d67aac6"]]);export{tt as P};
diff --git a/src/ui/dist/assets/PlaylistItem-035a1f18.js.gz b/src/ui/dist/assets/PlaylistItem-035a1f18.js.gz
new file mode 100644
index 000000000..8a9044dff
Binary files /dev/null and b/src/ui/dist/assets/PlaylistItem-035a1f18.js.gz differ
diff --git a/src/ui/dist/assets/PlaylistItem-a7b148e6.js.gz b/src/ui/dist/assets/PlaylistItem-a7b148e6.js.gz
deleted file mode 100644
index d9b8eb478..000000000
Binary files a/src/ui/dist/assets/PlaylistItem-a7b148e6.js.gz and /dev/null differ
diff --git a/src/ui/dist/assets/Playlists-29292de0.js b/src/ui/dist/assets/Playlists-29292de0.js
deleted file mode 100644
index 1c5180a24..000000000
--- a/src/ui/dist/assets/Playlists-29292de0.js
+++ /dev/null
@@ -1 +0,0 @@
-import{F as p}from"./FullShelf-a8ad59b2.js";import{P as _}from"./PlaylistItem-a7b148e6.js";import{_ as g,o as s,c as a,a as o,t as d,d as f,j as P,A as S,g as B,u,f as n,w as y,F as h,i as m}from"./index-d3fba034.js";import{C as k}from"./CollectionHeader-b4dad28f.js";import"./Template-deebb6b8.js";import"./IconButton-0d464118.js";import"./Form-f0cd8cf2.js";import"./Dropdown-b2449fcb.js";import"./Playlist-8c4c6944.js";import"./PlaylistHeader-8dd53ec0.js";import"./ExternalEntry-8bf31741.js";import"./playerInPicture-af203fdf.js";const b={name:"ReleaseItemBig",methods:{redirect(){this.$router.push(this.href)}},props:{title:String,description:String,href:String,icon:String}},I={class:"itemBig drop-shadow-md"},j={key:0,class:"icon"},w={class:"material-symbols-rounded"},x={class:"wrapper"};function C(e,l,i,c,v,t){return s(),a("div",I,[o("div",{class:"item h-full flex justify-between",onClick:l[0]||(l[0]=(...r)=>t.redirect&&t.redirect(...r))},[i.icon?(s(),a("div",j,[o("span",w,d(i.icon),1)])):f("",!0),o("div",x,[o("h4",null,d(i.title),1),o("p",null,d(i.description),1)])])])}const F=g(b,[["render",C],["__scopeId","data-v-f523b4f4"]]);const T={class:"padding-20"},N={class:"playlists"},V={components:{CollectionHeader:k,PlaylistItem:_,FullShelf:p,PlaylistItemBig:F},data(){return fetch("/api/me/liked").then(e=>e.json()).then(e=>{this.likedTracks=e}),fetch("/api/me/new").then(e=>e.json()).then(e=>{this.breakingTracks=e}),fetch("/api/spotify/playlists").then(e=>e.json()).then(e=>{this.spotifyPlaylists=e}),{likedTracks:null,breakingTracks:null,spotifyPlaylists:[]}}},$=Object.assign(V,{__name:"Playlists",setup(e){const l=P(),i=S(()=>l.playlists);return(c,v)=>(s(),a("div",T,[B(k),o("div",N,[u(i).length?(s(),n(p,{key:0,heading:"Playlists"},{default:y(()=>[(s(!0),a(h,null,m(u(i),(t,r)=>(s(),n(_,{key:r,href:t.href,cover:t.cover,description:t.description,title:t.name,type:t.type,spotify:!1},null,8,["href","cover","description","title","type"]))),128))]),_:1})):f("",!0),c.spotifyPlaylists.length?(s(),n(p,{key:1,heading:"Import From Spotify"},{default:y(()=>[(s(!0),a(h,null,m(c.spotifyPlaylists,(t,r)=>(s(),n(_,{key:r,cover:t.cover,description:t.description,title:t.name,id:t.id,spotify:!0,href:`https://open.spotify.com/playlist/${t.id}`},null,8,["cover","description","title","id","href"]))),128))]),_:1})):f("",!0)])]))}}),M=g($,[["__scopeId","data-v-8fa0125e"]]);export{M as default};
diff --git a/src/ui/dist/assets/Playlists-29292de0.js.gz b/src/ui/dist/assets/Playlists-29292de0.js.gz
deleted file mode 100644
index 285587621..000000000
Binary files a/src/ui/dist/assets/Playlists-29292de0.js.gz and /dev/null differ
diff --git a/src/ui/dist/assets/Playlists-326fe3b1.js b/src/ui/dist/assets/Playlists-326fe3b1.js
new file mode 100644
index 000000000..130660ab0
--- /dev/null
+++ b/src/ui/dist/assets/Playlists-326fe3b1.js
@@ -0,0 +1 @@
+import{F as p}from"./FullShelf-c8864a7a.js";import{P as c}from"./PlaylistItem-035a1f18.js";import{C as m}from"./CollectionHeader-6f86fce9.js";import{n as h,j as v,A as g,q as k,c as r,g as P,a as x,u as n,f as o,w as d,d as _,o as e,F as f,i as u,_ as C}from"./index-1856ec92.js";import"./Template-8c03613c.js";import"./IconButton-1670e129.js";import"./Form-d27a37bd.js";import"./Dropdown-16096009.js";import"./Playlist-f5edc8c9.js";import"./PlaylistHeader-40afea3c.js";import"./ExternalEntry-4cf58b98.js";import"./playerInPicture-af203fdf.js";const F={class:"padding-20"},B={class:"playlists"},S=h({__name:"Playlists",setup(I){const y=v(),l=g(()=>y.playlists),a=k([]);return fetch("/api/spotify/playlists").then(s=>s.json()).then(s=>{a.value=s}),(s,N)=>(e(),r("div",F,[P(m),x("div",B,[n(l).length?(e(),o(p,{key:0,heading:"Playlists"},{default:d(()=>[(e(!0),r(f,null,u(n(l),(t,i)=>(e(),o(c,{key:i,href:t.href,cover:t.cover,description:t.description,title:t.name,type:t.type,spotify:!1},null,8,["href","cover","description","title","type"]))),128))]),_:1})):_("",!0),a.value.length?(e(),o(p,{key:1,heading:"Import From Spotify"},{default:d(()=>[(e(!0),r(f,null,u(a.value,(t,i)=>(e(),o(c,{key:i,cover:t.cover,description:t.description,title:t.name,id:t.id,spotify:!0,href:`https://open.spotify.com/playlist/${t.id}`},null,8,["cover","description","title","id","href"]))),128))]),_:1})):_("",!0)])]))}});const G=C(S,[["__scopeId","data-v-ab79a140"]]);export{G as default};
diff --git a/src/ui/dist/assets/Playlists-326fe3b1.js.gz b/src/ui/dist/assets/Playlists-326fe3b1.js.gz
new file mode 100644
index 000000000..87264d0b3
Binary files /dev/null and b/src/ui/dist/assets/Playlists-326fe3b1.js.gz differ
diff --git a/src/ui/dist/assets/Playlists-45260996.css b/src/ui/dist/assets/Playlists-45260996.css
deleted file mode 100644
index 6ae8e4a60..000000000
--- a/src/ui/dist/assets/Playlists-45260996.css
+++ /dev/null
@@ -1 +0,0 @@
-p.note[data-v-f523b4f4]{font-size:.8em}.icon[data-v-f523b4f4]{text-align:center;height:100%;display:flex;flex-direction:column;justify-content:center}.material-symbols-rounded[data-v-f523b4f4]{font-variation-settings:"FILL" 1;font-size:5em}.itemBig[data-v-f523b4f4]{grid-column:span 2;background:var(--bg-gradient);border-radius:5px;min-height:10vh;margin:10px;color:var(--bg-contrast)}@media screen and (max-width: 750px){.itemBig[data-v-f523b4f4]{grid-column:span 1}}.item[data-v-f523b4f4]{display:flex;flex-direction:column;justify-content:flex-end;padding:20px}@media screen and (max-width: 750px){.item[data-v-f523b4f4]{display:grid;grid-template-columns:1fr 3fr;gap:.5em}}.wrapper[data-v-f523b4f4]{display:flex;flex-direction:column;justify-content:flex-end}.itemBig[data-v-f523b4f4]:hover{cursor:pointer}img[data-v-f523b4f4]{width:50%;border-radius:2px}@media screen and (min-width: 750px){h4[data-v-f523b4f4]{font-size:2em}}h4[data-v-f523b4f4],p[data-v-f523b4f4]{margin:0}.padding-20[data-v-8fa0125e]{padding:20px}
diff --git a/src/ui/dist/assets/Playlists-819d9966.css b/src/ui/dist/assets/Playlists-819d9966.css
new file mode 100644
index 000000000..3b49f46f2
--- /dev/null
+++ b/src/ui/dist/assets/Playlists-819d9966.css
@@ -0,0 +1 @@
+.padding-20[data-v-ab79a140]{padding:20px}
diff --git a/src/ui/dist/assets/ReleaseItem-a1f4efdb.js b/src/ui/dist/assets/ReleaseItem-3e04d873.js
similarity index 90%
rename from src/ui/dist/assets/ReleaseItem-a1f4efdb.js
rename to src/ui/dist/assets/ReleaseItem-3e04d873.js
index b0cebe8ab..72e425dc1 100644
--- a/src/ui/dist/assets/ReleaseItem-a1f4efdb.js
+++ b/src/ui/dist/assets/ReleaseItem-3e04d873.js
@@ -1 +1 @@
-import{_ as m}from"./ImportSpotifyAlbum.vue_vue_type_script_setup_true_lang-8201752a.js";import{_ as h,C as f,o,f as u,w as p,g as v,a as t,t as a,c as b,d as g,e as c}from"./index-d3fba034.js";const y={name:"ReleaseItem",components:{Card:f,AddAlbumToPlaylist:m},methods:{redirect(){this.$refs.addAlbum.show()}},props:{cover:String,title:String,artist:String,href:String,releaseDate:String}},C=["src"],D={key:0,class:"note"};function S(k,s,e,w,x,r){const n=c("add-album-to-playlist"),d=c("Card");return o(),u(d,{class:"wrapper","with-hover":""},{default:p(()=>{var i,l;return[v(n,{id:(i=this.href)==null?void 0:i.replace("https://open.spotify.com/album/",""),ref:"addAlbum",album:{id:(l=this.href)==null?void 0:l.replace("https://open.spotify.com/album/",""),title:this.title,artist:this.artist,cover:this.cover,href:this.href,releaseDate:this.releaseDate},artist:e.artist,cover:e.cover,href:e.href,title:e.title},null,8,["id","album","artist","cover","href","title"]),t("div",{class:"item",onClick:s[0]||(s[0]=(..._)=>r.redirect&&r.redirect(..._))},[t("img",{src:e.cover},null,8,C),t("h4",null,a(e.title),1),t("p",null,a(e.artist),1),e.releaseDate?(o(),b("p",D,"Released on "+a(e.releaseDate),1)):g("",!0)])]}),_:1})}const B=h(y,[["render",S],["__scopeId","data-v-448c5702"]]);export{B as I};
+import{_ as m}from"./ImportSpotifyAlbum.vue_vue_type_script_setup_true_lang-2307b3a0.js";import{_ as h,C as f,o,f as u,w as p,g as v,a as t,t as a,c as b,d as g,e as c}from"./index-1856ec92.js";const y={name:"ReleaseItem",components:{Card:f,AddAlbumToPlaylist:m},methods:{redirect(){this.$refs.addAlbum.show()}},props:{cover:String,title:String,artist:String,href:String,releaseDate:String}},C=["src"],D={key:0,class:"note"};function S(k,s,e,w,x,r){const n=c("add-album-to-playlist"),d=c("Card");return o(),u(d,{class:"wrapper","with-hover":""},{default:p(()=>{var i,l;return[v(n,{id:(i=this.href)==null?void 0:i.replace("https://open.spotify.com/album/",""),ref:"addAlbum",album:{id:(l=this.href)==null?void 0:l.replace("https://open.spotify.com/album/",""),title:this.title,artist:this.artist,cover:this.cover,href:this.href,releaseDate:this.releaseDate},artist:e.artist,cover:e.cover,href:e.href,title:e.title},null,8,["id","album","artist","cover","href","title"]),t("div",{class:"item",onClick:s[0]||(s[0]=(..._)=>r.redirect&&r.redirect(..._))},[t("img",{src:e.cover},null,8,C),t("h4",null,a(e.title),1),t("p",null,a(e.artist),1),e.releaseDate?(o(),b("p",D,"Released on "+a(e.releaseDate),1)):g("",!0)])]}),_:1})}const B=h(y,[["render",S],["__scopeId","data-v-448c5702"]]);export{B as I};
diff --git a/src/ui/dist/assets/ReleaseItem-3e04d873.js.gz b/src/ui/dist/assets/ReleaseItem-3e04d873.js.gz
new file mode 100644
index 000000000..950235b99
Binary files /dev/null and b/src/ui/dist/assets/ReleaseItem-3e04d873.js.gz differ
diff --git a/src/ui/dist/assets/ReleaseItem-a1f4efdb.js.gz b/src/ui/dist/assets/ReleaseItem-a1f4efdb.js.gz
deleted file mode 100644
index cbd5ed07c..000000000
Binary files a/src/ui/dist/assets/ReleaseItem-a1f4efdb.js.gz and /dev/null differ
diff --git a/src/ui/dist/assets/Releases-eef63173.css b/src/ui/dist/assets/Releases-46f16e90.css
similarity index 92%
rename from src/ui/dist/assets/Releases-eef63173.css
rename to src/ui/dist/assets/Releases-46f16e90.css
index 36e182f28..36b739db4 100644
--- a/src/ui/dist/assets/Releases-eef63173.css
+++ b/src/ui/dist/assets/Releases-46f16e90.css
@@ -1 +1 @@
-p.note[data-v-a069bd39]{font-size:.8em}.itemBig[data-v-a069bd39]{grid-column:span 2;background:var(--bg-base-lt);border-radius:20px;min-height:10vh;margin:10px}.item[data-v-a069bd39]{display:flex;flex-direction:row;padding:20px;height:100%}.wrapper[data-v-a069bd39]{margin-left:20px;display:flex;flex-direction:column;justify-content:flex-end}.itemBig[data-v-a069bd39]:hover{cursor:pointer;background:var(--bg-hover-dk)}img[data-v-a069bd39]{width:50%;border-radius:12px}h4[data-v-a069bd39]{margin:0;font-size:1.2em}p[data-v-a069bd39]{margin:0;color:var(--fg-base-dk);font-size:.9em}.padding-20[data-v-313f4ecd]{padding:20px}
+p.note[data-v-a069bd39]{font-size:.8em}.itemBig[data-v-a069bd39]{grid-column:span 2;background:var(--bg-base-lt);border-radius:20px;min-height:10vh;margin:10px}.item[data-v-a069bd39]{display:flex;flex-direction:row;padding:20px;height:100%}.wrapper[data-v-a069bd39]{margin-left:20px;display:flex;flex-direction:column;justify-content:flex-end}.itemBig[data-v-a069bd39]:hover{cursor:pointer;background:var(--bg-hover-dk)}img[data-v-a069bd39]{width:50%;border-radius:12px}h4[data-v-a069bd39]{margin:0;font-size:1.2em}p[data-v-a069bd39]{margin:0;color:var(--fg-base-dk);font-size:.9em}.padding-20[data-v-164dabf1]{padding:20px}
diff --git a/src/ui/dist/assets/Releases-d6b59725.js.gz b/src/ui/dist/assets/Releases-d6b59725.js.gz
deleted file mode 100644
index ef391481d..000000000
Binary files a/src/ui/dist/assets/Releases-d6b59725.js.gz and /dev/null differ
diff --git a/src/ui/dist/assets/Releases-d6b59725.js b/src/ui/dist/assets/Releases-f8fb68d7.js
similarity index 83%
rename from src/ui/dist/assets/Releases-d6b59725.js
rename to src/ui/dist/assets/Releases-f8fb68d7.js
index e48b761f3..18efce871 100644
--- a/src/ui/dist/assets/Releases-d6b59725.js
+++ b/src/ui/dist/assets/Releases-f8fb68d7.js
@@ -1 +1 @@
-import{F as S}from"./FullShelf-a8ad59b2.js";import{I}from"./ReleaseItem-a1f4efdb.js";import{_ as B}from"./ImportSpotifyAlbum.vue_vue_type_script_setup_true_lang-8201752a.js";import{_ as w,C as A,o,f as l,w as m,g as k,a as i,t as D,c as u,d as _,e as a,L as N,F as f,i as b}from"./index-d3fba034.js";import{C as x}from"./CollectionHeader-b4dad28f.js";import"./Template-deebb6b8.js";import"./IconButton-0d464118.js";import"./Form-f0cd8cf2.js";import"./Dropdown-b2449fcb.js";import"./Playlist-8c4c6944.js";import"./PlaylistHeader-8dd53ec0.js";import"./ExternalEntry-8bf31741.js";const R={components:{Card:A,AddAlbumToPlaylist:B},name:"ReleaseItemBig",methods:{redirect(){this.$refs.addAlbum.show()}},props:{cover:String,title:String,artist:String,href:String,releaseDate:String}},F=["src"],L={class:"wrapper"},j={key:0,class:"note"};function H(d,s,t,n,r,p){const g=a("add-album-to-playlist"),v=a("Card");return o(),l(v,{class:"itemBig","with-hover":""},{default:m(()=>{var h,c;return[k(g,{id:(h=this.href)==null?void 0:h.replace("https://open.spotify.com/album/",""),ref:"addAlbum",album:{id:(c=this.href)==null?void 0:c.replace("https://open.spotify.com/album/",""),title:this.title,artist:this.artist,cover:this.cover,href:this.href,releaseDate:this.releaseDate},artist:t.artist,cover:t.cover,href:t.href,title:t.title},null,8,["id","album","artist","cover","href","title"]),i("div",{class:"item",onClick:s[0]||(s[0]=(...y)=>p.redirect&&p.redirect(...y))},[i("img",{src:t.cover},null,8,F),i("div",L,[i("h4",null,D(t.title),1),i("p",null,D(t.artist),1),t.releaseDate?(o(),u("p",j,"Released on "+D(t.releaseDate),1)):_("",!0)])])]}),_:1})}const V=w(R,[["render",H],["__scopeId","data-v-a069bd39"]]);const M={components:{Loader:N,CollectionHeader:x,FullShelf:S,Item:I,ItemBig:V},name:"Releases",data(){return{outSoon:[],outNow:[],outAlready:[],loading:!0}},mounted(){this.loading=!0,fetch("/api/releases").then(d=>d.json()).then(d=>{const s=new Date;for(const t of d){const n=new Date(t.releaseDate);s[(o(!0),u(f,null,b(r.outSoon,e=>(o(),l(h,{key:e.url,artist:e.artists.join(", "),cover:e.cover,href:e.url,releaseDate:e.releaseDate,title:e.title},null,8,["artist","cover","href","releaseDate","title"]))),128))]),_:1})):_("",!0),r.outNow.length?(o(),l(c,{key:1,heading:"Out Now"},{default:m(()=>[(o(!0),u(f,null,b(r.outNow,e=>(o(),l(y,{key:e.url,artist:e.artists.join(", "),cover:e.cover,href:e.url,releaseDate:e.releaseDate,title:e.title},null,8,["artist","cover","href","releaseDate","title"]))),128))]),_:1})):_("",!0),r.outAlready.length?(o(),l(c,{key:2,heading:"Releases"},{default:m(()=>[(o(!0),u(f,null,b(r.outAlready,e=>(o(),l(C,{key:e.url,artist:e.artists.join(", "),cover:e.cover,href:e.url,releaseDate:e.releaseDate,title:e.title},null,8,["artist","cover","href","releaseDate","title"]))),128))]),_:1})):_("",!0)])])],64)}const ee=w(M,[["render",P],["__scopeId","data-v-313f4ecd"]]);export{ee as default};
+import{F as S}from"./FullShelf-c8864a7a.js";import{I}from"./ReleaseItem-3e04d873.js";import{_ as B}from"./ImportSpotifyAlbum.vue_vue_type_script_setup_true_lang-2307b3a0.js";import{_ as w,C as A,o,f as l,w as m,g as k,a as i,t as D,c as u,d as _,e as a,L as N,F as f,i as b}from"./index-1856ec92.js";import{C as x}from"./CollectionHeader-6f86fce9.js";import"./Template-8c03613c.js";import"./IconButton-1670e129.js";import"./Form-d27a37bd.js";import"./Dropdown-16096009.js";import"./Playlist-f5edc8c9.js";import"./PlaylistHeader-40afea3c.js";import"./ExternalEntry-4cf58b98.js";const R={components:{Card:A,AddAlbumToPlaylist:B},name:"ReleaseItemBig",methods:{redirect(){this.$refs.addAlbum.show()}},props:{cover:String,title:String,artist:String,href:String,releaseDate:String}},F=["src"],L={class:"wrapper"},j={key:0,class:"note"};function H(d,s,t,n,r,p){const g=a("add-album-to-playlist"),v=a("Card");return o(),l(v,{class:"itemBig","with-hover":""},{default:m(()=>{var h,c;return[k(g,{id:(h=this.href)==null?void 0:h.replace("https://open.spotify.com/album/",""),ref:"addAlbum",album:{id:(c=this.href)==null?void 0:c.replace("https://open.spotify.com/album/",""),title:this.title,artist:this.artist,cover:this.cover,href:this.href,releaseDate:this.releaseDate},artist:t.artist,cover:t.cover,href:t.href,title:t.title},null,8,["id","album","artist","cover","href","title"]),i("div",{class:"item",onClick:s[0]||(s[0]=(...y)=>p.redirect&&p.redirect(...y))},[i("img",{src:t.cover},null,8,F),i("div",L,[i("h4",null,D(t.title),1),i("p",null,D(t.artist),1),t.releaseDate?(o(),u("p",j,"Released on "+D(t.releaseDate),1)):_("",!0)])])]}),_:1})}const V=w(R,[["render",H],["__scopeId","data-v-a069bd39"]]);const M={components:{Loader:N,CollectionHeader:x,FullShelf:S,Item:I,ItemBig:V},name:"Releases",data(){return{outSoon:[],outNow:[],outAlready:[],loading:!0}},mounted(){this.loading=!0,fetch("/api/releases").then(d=>d.json()).then(d=>{const s=new Date;for(const t of d){const n=new Date(t.releaseDate);s[(o(!0),u(f,null,b(r.outSoon,e=>(o(),l(h,{key:e.url,artist:e.artists.join(", "),cover:e.cover,href:e.url,releaseDate:e.releaseDate,title:e.title},null,8,["artist","cover","href","releaseDate","title"]))),128))]),_:1})):_("",!0),r.outNow.length?(o(),l(c,{key:1,heading:"Out Now"},{default:m(()=>[(o(!0),u(f,null,b(r.outNow,e=>(o(),l(y,{key:e.url,artist:e.artists.join(", "),cover:e.cover,href:e.url,releaseDate:e.releaseDate,title:e.title},null,8,["artist","cover","href","releaseDate","title"]))),128))]),_:1})):_("",!0),r.outAlready.length?(o(),l(c,{key:2,heading:"Releases"},{default:m(()=>[(o(!0),u(f,null,b(r.outAlready,e=>(o(),l(C,{key:e.url,artist:e.artists.join(", "),cover:e.cover,href:e.url,releaseDate:e.releaseDate,title:e.title},null,8,["artist","cover","href","releaseDate","title"]))),128))]),_:1})):_("",!0)])])],64)}const ee=w(M,[["render",P],["__scopeId","data-v-164dabf1"]]);export{ee as default};
diff --git a/src/ui/dist/assets/Releases-f8fb68d7.js.gz b/src/ui/dist/assets/Releases-f8fb68d7.js.gz
new file mode 100644
index 000000000..39006e881
Binary files /dev/null and b/src/ui/dist/assets/Releases-f8fb68d7.js.gz differ
diff --git a/src/ui/dist/assets/Search-d64c8ce8.css b/src/ui/dist/assets/Search-25e5af5d.css
similarity index 69%
rename from src/ui/dist/assets/Search-d64c8ce8.css
rename to src/ui/dist/assets/Search-25e5af5d.css
index d657a2bc4..434f00bca 100644
--- a/src/ui/dist/assets/Search-d64c8ce8.css
+++ b/src/ui/dist/assets/Search-25e5af5d.css
@@ -1 +1 @@
-p.note[data-v-1172913f]{font-size:.7em}.wrapper[data-v-1172913f]{background:var(--bg-base-lt);min-height:10vh;margin:10px;border-radius:20px;padding:20px}.wrapper[data-v-1172913f]:hover{cursor:pointer;background:var(--bg-hover-dk)}.item[data-v-1172913f]{height:100%}img[data-v-1172913f]{width:100%;border-radius:12px;margin-bottom:1em}h4[data-v-1172913f]{margin:0}p[data-v-1172913f]{margin:0;color:var(--fg-base-dk);font-size:.8em}.header[data-v-6e3dd207]{margin:10px 10px 0;display:flex;flex-direction:row;justify-content:space-between}.header>h2[data-v-6e3dd207]{align-self:flex-start;margin-top:0;margin-bottom:10px}.header>h5[data-v-6e3dd207]{text-transform:uppercase;align-self:center;margin:0}.header>h5[data-v-6e3dd207]:hover{cursor:pointer}.items[data-v-6e3dd207]{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));grid-auto-rows:0;grid-template-rows:1fr;overflow-y:hidden}p.note[data-v-ca575a01]{font-size:.7em}.wrapper[data-v-ca575a01]{background:var(--bg-base-lt);border-radius:20px;padding:20px;min-height:10vh;margin:10px}.wrapper[data-v-ca575a01]:hover{cursor:pointer;background:var(--bg-hover-dk)}.item[data-v-ca575a01]{height:calc(100% - 40px)}img[data-v-ca575a01]{width:100%;border-radius:12px;margin-bottom:1em}h4[data-v-ca575a01]{margin:0}p[data-v-ca575a01]{margin:0;color:var(--font-darker);font-size:.8em}.search[data-v-de01a207]{padding:20px;height:calc(100% - 40px)}input[data-v-de01a207]{margin-left:10px;margin-bottom:20px;width:20vw!important}
+p.note[data-v-1172913f]{font-size:.7em}.wrapper[data-v-1172913f]{background:var(--bg-base-lt);min-height:10vh;margin:10px;border-radius:20px;padding:20px}.wrapper[data-v-1172913f]:hover{cursor:pointer;background:var(--bg-hover-dk)}.item[data-v-1172913f]{height:100%}img[data-v-1172913f]{width:100%;border-radius:12px;margin-bottom:1em}h4[data-v-1172913f]{margin:0}p[data-v-1172913f]{margin:0;color:var(--fg-base-dk);font-size:.8em}.header[data-v-a60bb56d]{margin:10px 10px 0;display:flex;flex-direction:row;justify-content:space-between}.header>h2[data-v-a60bb56d]{align-self:flex-start;margin-top:0;margin-bottom:10px}.header>h5[data-v-a60bb56d]{text-transform:uppercase;align-self:center;margin:0}.header>h5[data-v-a60bb56d]:hover{cursor:pointer}.items[data-v-a60bb56d]{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));grid-auto-rows:0;grid-template-rows:1fr;overflow-y:hidden}p.note[data-v-ca575a01]{font-size:.7em}.wrapper[data-v-ca575a01]{background:var(--bg-base-lt);border-radius:20px;padding:20px;min-height:10vh;margin:10px}.wrapper[data-v-ca575a01]:hover{cursor:pointer;background:var(--bg-hover-dk)}.item[data-v-ca575a01]{height:calc(100% - 40px)}img[data-v-ca575a01]{width:100%;border-radius:12px;margin-bottom:1em}h4[data-v-ca575a01]{margin:0}p[data-v-ca575a01]{margin:0;color:var(--font-darker);font-size:.8em}.search[data-v-de01a207]{padding:20px;height:calc(100% - 40px)}input[data-v-de01a207]{margin-left:10px;margin-bottom:20px;width:20vw!important}
diff --git a/src/ui/dist/assets/Search-25e5af5d.css.gz b/src/ui/dist/assets/Search-25e5af5d.css.gz
new file mode 100644
index 000000000..12cc37ba3
Binary files /dev/null and b/src/ui/dist/assets/Search-25e5af5d.css.gz differ
diff --git a/src/ui/dist/assets/Search-95a423a8.js.gz b/src/ui/dist/assets/Search-95a423a8.js.gz
deleted file mode 100644
index 6bc4e9f2c..000000000
Binary files a/src/ui/dist/assets/Search-95a423a8.js.gz and /dev/null differ
diff --git a/src/ui/dist/assets/Search-95a423a8.js b/src/ui/dist/assets/Search-c0e46b0a.js
similarity index 85%
rename from src/ui/dist/assets/Search-95a423a8.js
rename to src/ui/dist/assets/Search-c0e46b0a.js
index e62ea597e..411a4bb0a 100644
--- a/src/ui/dist/assets/Search-95a423a8.js
+++ b/src/ui/dist/assets/Search-c0e46b0a.js
@@ -1 +1 @@
-import{A as b}from"./ArtistItem-827840d3.js";import{I as q}from"./ReleaseItem-a1f4efdb.js";import{_ as B}from"./ExternalEntry-8bf31741.js";import{_ as S,C as T,h as w,o as e,f as o,w as d,g as k,a,t as p,c as n,d as f,e as c,r as L,L as D,F as y,i as v,l as N,m as F}from"./index-d3fba034.js";import"./ImportSpotifyAlbum.vue_vue_type_script_setup_true_lang-8201752a.js";import"./Template-deebb6b8.js";import"./IconButton-0d464118.js";import"./Form-f0cd8cf2.js";import"./Dropdown-b2449fcb.js";import"./Playlist-8c4c6944.js";import"./PlaylistHeader-8dd53ec0.js";const V={components:{Card:T,Cover:w,AddSongToPlaylist:B},name:"SearchItem",methods:{redirect(){this.$refs.addAlbum.show()}},props:{cover:String,title:String,artist:String,releaseDate:String,href:String,preview:String}},E={key:0,class:"note"};function O(r,l,s,I,i,h){const _=c("add-song-to-playlist"),m=c("Cover"),u=c("Card");return e(),o(u,{class:"wrapper","with-hover":""},{default:d(()=>[k(_,{ref:"addAlbum",song:{cover:s.cover,artist:s.artist,title:s.title,preview:s.preview,href:s.href}},null,8,["song"]),a("div",{class:"item",onClick:l[0]||(l[0]=(...g)=>h.redirect&&h.redirect(...g))},[k(m,{src:s.cover},null,8,["src"]),a("h4",null,p(s.title),1),a("p",null,p(s.artist),1),s.releaseDate?(e(),n("p",E,"Released on "+p(s.releaseDate),1)):f("",!0)])]),_:1})}const P=S(V,[["render",O],["__scopeId","data-v-1172913f"]]);const j={name:"Shelf",props:{heading:String,href:String},methods:{redirect(){this.href&&this.$router.push(this.href)}}},J={class:"shelf"},R={key:0,class:"header"},Y={class:"items"};function $(r,l,s,I,i,h){return e(),n("div",J,[s.heading?(e(),n("div",R,[a("h2",null,p(s.heading),1),a("h5",{onClick:l[0]||(l[0]=(..._)=>h.redirect&&h.redirect(..._))},"See All")])):f("",!0),a("div",Y,[L(r.$slots,"default",{},void 0,!0)])])}const z=S(j,[["render",$],["__scopeId","data-v-6e3dd207"]]);const G={name:"TrackItem",components:{Card:T,Cover:w},methods:{redirect(){console.log("redirect"),this.$router.push(this.href)}},props:{cover:String,title:String,artist:String,href:String}};function H(r,l,s,I,i,h){const _=c("Cover"),m=c("Card");return e(),o(m,{class:"wrapper","with-hover":""},{default:d(()=>[a("div",{class:"item",onClick:l[0]||(l[0]=(...u)=>h.redirect&&h.redirect(...u))},[k(_,{src:s.cover},null,8,["src"]),a("h4",null,p(s.title),1),a("p",null,p(s.artist),1)])]),_:1})}const K=S(G,[["render",H],["__scopeId","data-v-ca575a01"]]);const M={name:"Search",components:{Shelf:z,Item:q,SearchItem:P,ArtistItem:b,TrackItem:K,Loader:D},data(){return{query:"",spotifyTracks:[],spotifyArtists:[],tracks:[],artists:[],youtubeTracks:[],loading:!1,error:null}},methods:{search(){this.query=this.$route.params.query,this.query&&(this.loading=!0,this.error=null,fetch("/api/search",{method:"POST",body:JSON.stringify({query:this.query,scope:["local","spotify"]})}).then(r=>r.json()).then(r=>{this.spotifyTracks.length=0,this.spotifyArtists.length=0,this.tracks.length=0,this.artists.length=0,this.youtubeTracks.length=0,this.spotifyTracks.push(...r.spotifyTracks||[]),this.spotifyArtists.push(...r.spotifyArtists||[]),this.tracks.push(...r.tracks||[]),this.artists.push(...r.artists||[]),this.youtubeTracks.push(...r.youtubeTracks||[]),this.loading=!1}).catch(r=>{this.error=r,this.loading=!1}))},enterText(r){r.key==="Enter"&&this.$router.push("/search/"+this.query)}},watch:{$route(){this.search()}},mounted(){this.search()}},Q=r=>(N("data-v-de01a207"),r=r(),F(),r),U={class:"search"},W={key:0,class:"fill-page"},X={key:1,class:"fill-page"},Z=Q(()=>a("h1",null,"Something went wrong",-1));function tt(r,l,s,I,i,h){const _=c("Loader"),m=c("TrackItem"),u=c("Shelf"),g=c("search-item"),C=c("Item"),A=c("artist-item");return e(),n("div",U,[i.loading?(e(),n("div",W,[k(_)])):i.error?(e(),n("div",X,[Z,a("p",null,p(i.error),1)])):(e(),n(y,{key:2},[i.tracks.length?(e(),o(u,{key:0,heading:"Songs"},{default:d(()=>[(e(!0),n(y,null,v(i.tracks,t=>(e(),o(m,{key:t.url,artist:t.artists.join(", "),cover:t.cover,href:t.href,title:t.title},null,8,["artist","cover","href","title"]))),128))]),_:1})):f("",!0),i.spotifyTracks.length?(e(),o(u,{key:1,heading:"Songs (Spotify)"},{default:d(()=>[(e(!0),n(y,null,v(i.spotifyTracks,t=>(e(),o(g,{key:t.url,artist:t.artists.join(", "),cover:t.cover,href:t.url,preview:t.preview,title:t.title},null,8,["artist","cover","href","preview","title"]))),128))]),_:1})):f("",!0),i.youtubeTracks.length?(e(),o(u,{key:2,heading:"Songs (Youtube)"},{default:d(()=>[(e(!0),n(y,null,v(i.youtubeTracks,t=>(e(),o(g,{key:t.url,artist:t.artists.join(", "),cover:t.cover,href:t.url,title:t.title},null,8,["artist","cover","href","title"]))),128))]),_:1})):f("",!0),i.artists.length?(e(),o(u,{key:3,heading:"Artists"},{default:d(()=>[(e(!0),n(y,null,v(i.artists,t=>(e(),o(C,{key:t.url,artist:t.artists.join(", "),cover:t.cover,href:t.url,title:t.title},null,8,["artist","cover","href","title"]))),128))]),_:1})):f("",!0),i.spotifyArtists.length?(e(),o(u,{key:4,heading:"Artists (Spotify)"},{default:d(()=>[(e(!0),n(y,null,v(i.spotifyArtists,(t,x)=>(e(),o(A,{id:t.id,key:x,cover:t.cover,description:t.description,name:t.name,showFollowButton:!0},null,8,["id","cover","description","name"]))),128))]),_:1})):f("",!0)],64))])}const _t=S(M,[["render",tt],["__scopeId","data-v-de01a207"]]);export{_t as default};
+import{A as x}from"./ArtistItem-d4be8c52.js";import{I as q}from"./ReleaseItem-3e04d873.js";import{_ as B}from"./ExternalEntry-4cf58b98.js";import{_ as S,C as T,h as w,o as e,f as o,w as d,g as k,a,t as p,c as n,d as f,e as c,r as L,L as D,F as y,i as v,l as N,m as F}from"./index-1856ec92.js";import"./ImportSpotifyAlbum.vue_vue_type_script_setup_true_lang-2307b3a0.js";import"./Template-8c03613c.js";import"./IconButton-1670e129.js";import"./Form-d27a37bd.js";import"./Dropdown-16096009.js";import"./Playlist-f5edc8c9.js";import"./PlaylistHeader-40afea3c.js";const V={components:{Card:T,Cover:w,AddSongToPlaylist:B},name:"SearchItem",methods:{redirect(){this.$refs.addAlbum.show()}},props:{cover:String,title:String,artist:String,releaseDate:String,href:String,preview:String}},E={key:0,class:"note"};function O(r,l,s,I,i,h){const _=c("add-song-to-playlist"),m=c("Cover"),u=c("Card");return e(),o(u,{class:"wrapper","with-hover":""},{default:d(()=>[k(_,{ref:"addAlbum",song:{cover:s.cover,artist:s.artist,title:s.title,preview:s.preview,href:s.href}},null,8,["song"]),a("div",{class:"item",onClick:l[0]||(l[0]=(...g)=>h.redirect&&h.redirect(...g))},[k(m,{src:s.cover},null,8,["src"]),a("h4",null,p(s.title),1),a("p",null,p(s.artist),1),s.releaseDate?(e(),n("p",E,"Released on "+p(s.releaseDate),1)):f("",!0)])]),_:1})}const P=S(V,[["render",O],["__scopeId","data-v-1172913f"]]);const j={name:"Shelf",props:{heading:String,href:String},methods:{redirect(){this.href&&this.$router.push(this.href)}}},J={class:"shelf"},R={key:0,class:"header"},Y={class:"items"};function $(r,l,s,I,i,h){return e(),n("div",J,[s.heading?(e(),n("div",R,[a("h2",null,p(s.heading),1),a("h5",{onClick:l[0]||(l[0]=(..._)=>h.redirect&&h.redirect(..._))},"See All")])):f("",!0),a("div",Y,[L(r.$slots,"default",{},void 0,!0)])])}const z=S(j,[["render",$],["__scopeId","data-v-a60bb56d"]]);const G={name:"TrackItem",components:{Card:T,Cover:w},methods:{redirect(){console.log("redirect"),this.$router.push(this.href)}},props:{cover:String,title:String,artist:String,href:String}};function H(r,l,s,I,i,h){const _=c("Cover"),m=c("Card");return e(),o(m,{class:"wrapper","with-hover":""},{default:d(()=>[a("div",{class:"item",onClick:l[0]||(l[0]=(...u)=>h.redirect&&h.redirect(...u))},[k(_,{src:s.cover},null,8,["src"]),a("h4",null,p(s.title),1),a("p",null,p(s.artist),1)])]),_:1})}const K=S(G,[["render",H],["__scopeId","data-v-ca575a01"]]);const M={name:"Search",components:{Shelf:z,Item:q,SearchItem:P,ArtistItem:x,TrackItem:K,Loader:D},data(){return{query:"",spotifyTracks:[],spotifyArtists:[],tracks:[],artists:[],youtubeTracks:[],loading:!1,error:null}},methods:{search(){this.query=this.$route.params.query,this.query&&(this.loading=!0,this.error=null,fetch("/api/search",{method:"POST",body:JSON.stringify({query:this.query,scope:["local","spotify"]})}).then(r=>r.json()).then(r=>{this.spotifyTracks.length=0,this.spotifyArtists.length=0,this.tracks.length=0,this.artists.length=0,this.youtubeTracks.length=0,this.spotifyTracks.push(...r.spotifyTracks||[]),this.spotifyArtists.push(...r.spotifyArtists||[]),this.tracks.push(...r.tracks||[]),this.artists.push(...r.artists||[]),this.youtubeTracks.push(...r.youtubeTracks||[]),this.loading=!1}).catch(r=>{this.error=r,this.loading=!1}))},enterText(r){r.key==="Enter"&&this.$router.push("/search/"+this.query)}},watch:{$route(){this.search()}},mounted(){this.search()}},Q=r=>(N("data-v-de01a207"),r=r(),F(),r),U={class:"search"},W={key:0,class:"fill-page"},X={key:1,class:"fill-page"},Z=Q(()=>a("h1",null,"Something went wrong",-1));function tt(r,l,s,I,i,h){const _=c("Loader"),m=c("TrackItem"),u=c("Shelf"),g=c("search-item"),C=c("Item"),b=c("artist-item");return e(),n("div",U,[i.loading?(e(),n("div",W,[k(_)])):i.error?(e(),n("div",X,[Z,a("p",null,p(i.error),1)])):(e(),n(y,{key:2},[i.tracks.length?(e(),o(u,{key:0,heading:"Songs"},{default:d(()=>[(e(!0),n(y,null,v(i.tracks,t=>(e(),o(m,{key:t.url,artist:t.artists.join(", "),cover:t.cover,href:t.href,title:t.title},null,8,["artist","cover","href","title"]))),128))]),_:1})):f("",!0),i.spotifyTracks.length?(e(),o(u,{key:1,heading:"Songs (Spotify)"},{default:d(()=>[(e(!0),n(y,null,v(i.spotifyTracks,t=>(e(),o(g,{key:t.url,artist:t.artists.join(", "),cover:t.cover,href:t.url,preview:t.preview,title:t.title},null,8,["artist","cover","href","preview","title"]))),128))]),_:1})):f("",!0),i.youtubeTracks.length?(e(),o(u,{key:2,heading:"Songs (Youtube)"},{default:d(()=>[(e(!0),n(y,null,v(i.youtubeTracks,t=>(e(),o(g,{key:t.url,artist:t.artists.join(", "),cover:t.cover,href:t.url,title:t.title},null,8,["artist","cover","href","title"]))),128))]),_:1})):f("",!0),i.artists.length?(e(),o(u,{key:3,heading:"Artists"},{default:d(()=>[(e(!0),n(y,null,v(i.artists,t=>(e(),o(C,{key:t.url,artist:t.artists.join(", "),cover:t.cover,href:t.url,title:t.title},null,8,["artist","cover","href","title"]))),128))]),_:1})):f("",!0),i.spotifyArtists.length?(e(),o(u,{key:4,heading:"Artists (Spotify)"},{default:d(()=>[(e(!0),n(y,null,v(i.spotifyArtists,(t,A)=>(e(),o(b,{id:t.id,key:A,cover:t.cover,description:t.description,name:t.name,showFollowButton:!0},null,8,["id","cover","description","name"]))),128))]),_:1})):f("",!0)],64))])}const _t=S(M,[["render",tt],["__scopeId","data-v-de01a207"]]);export{_t as default};
diff --git a/src/ui/dist/assets/Search-c0e46b0a.js.gz b/src/ui/dist/assets/Search-c0e46b0a.js.gz
new file mode 100644
index 000000000..a02900a84
Binary files /dev/null and b/src/ui/dist/assets/Search-c0e46b0a.js.gz differ
diff --git a/src/ui/dist/assets/Search-d64c8ce8.css.gz b/src/ui/dist/assets/Search-d64c8ce8.css.gz
deleted file mode 100644
index d8d473df7..000000000
Binary files a/src/ui/dist/assets/Search-d64c8ce8.css.gz and /dev/null differ
diff --git a/src/ui/dist/assets/Sports-cc72e59d.js b/src/ui/dist/assets/Sports-07156e24.js
similarity index 89%
rename from src/ui/dist/assets/Sports-cc72e59d.js
rename to src/ui/dist/assets/Sports-07156e24.js
index a0c364790..a0e7cd56d 100644
--- a/src/ui/dist/assets/Sports-cc72e59d.js
+++ b/src/ui/dist/assets/Sports-07156e24.js
@@ -1 +1 @@
-import{F as C}from"./FullShelf-a8ad59b2.js";import{_ as k,C as D,o as p,f as v,w as T,a as o,t as _,aH as A,e as w,T as b,bR as F,c as m,g as N,F as S,i as y,d as V,l as B,m as H}from"./index-d3fba034.js";const O={name:"FootballItem",components:{Card:D},methods:{redirect(){window.open(this.oref)},remove(e){e.stopPropagation(),this.$emit("remove")}},props:{result:String,date:String,competition:String,href:String,oref:String,team1:String,team2:String,progress:String}},j={class:"wrapper topalign"},L={class:"wrapper"},J=["innerHTML"],P=["innerHTML"],U=["innerHTML"],W={class:"wrapper bottomalign"},$={class:"small"};function R(e,s,t,c,n,r){const h=w("Card");return p(),v(h,{class:"itemBig","with-hover":""},{default:T(()=>{var u;return[o("div",{class:"item",onClick:s[1]||(s[1]=(...i)=>r.redirect&&r.redirect(...i))},[o("div",j,[o("p",null,_(t.competition),1),o("p",{class:A([{accent:(u=t.progress)==null?void 0:u.includes("'")},"right progress"])},_(t.progress),3)]),o("div",L,[o("p",{class:"team",innerHTML:t.team1},null,8,J),o("h4",{class:"result",innerHTML:t.result},null,8,P),o("p",{class:"team",innerHTML:t.team2},null,8,U)]),o("div",W,[o("p",$,_(t.date)+", "+_(t.href),1),o("span",{class:"deleteIcon small material-icons-round",onClick:s[0]||(s[0]=(...i)=>r.remove&&r.remove(...i))},"clear")])])]}),_:1})}const E=k(O,[["render",R],["__scopeId","data-v-b3cf3eea"]]);const K={components:{TextInputWithIcon:b,FullShelf:C,FootballItem:E},name:"Sports",data(){return{sports:[],watchMatches:[],sourceToAdd:"",supportedSources:["https://onefootball.com/en/team/","https://onefootball.com/en/match/","https://onefootball.com/en/competition/","https://www.cev.eu/match-centres/","https://championsleague.cev.eu/en/match-centres/","https://www.cev.eu/calendar/","https://cev-nex.tk/#/match/","https://cevnex.tk/#/match/"]}},mounted(){this.watchMatches=JSON.parse(window.localStorage.getItem("sports.watchMatches"))||[],this.updateMatches()},computed:{volleyMatches(){return this.watchMatches.filter(e=>e.includes("cev")).map(e=>{let s=e;return e.includes("nex.tk")&&(s=e.split("/match/")[1]),{src:s,ref:e}})},notVolleyMatches(){return this.watchMatches.filter(e=>!e.includes("cev"))}},methods:{removeSource(e,s,t){this.watchMatches.splice(this.watchMatches.indexOf(e),1),this.sports[s].items.splice(t,1),window.localStorage.setItem("sports.watchMatches",JSON.stringify(this.watchMatches))},removeSourceD(e){this.watchMatches.splice(this.watchMatches.indexOf(e),1),window.localStorage.setItem("sports.watchMatches",JSON.stringify(this.watchMatches))},tryAddSource(){for(const e of this.supportedSources)if(this.sourceToAdd.startsWith(e)){this.addSource();return}F.addError("unsupported source")},addSource(){this.watchMatches.push(this.sourceToAdd),window.localStorage.setItem("sports.watchMatches",JSON.stringify(this.watchMatches)),this.sourceToAdd=""},updateMatches(){if(!(this.$route.path=="/sports"||this.$route.path=="/sports/")){console.log("not update",this.$route.path);return}fetch("/api/sports",{method:"POST",body:JSON.stringify({urls:this.notVolleyMatches})}).then(e=>e.json()).then(e=>{this.sports=[];for(const s of e){const t=this.sports.findIndex(c=>c.sport==s.sport);t>=0?this.sports[t].items.push(s):this.sports.push({sport:s.sport,icon:s.sportIcon,items:[s]})}for(const s of this.sports)s.items.sort((t,c)=>{if(t.progress=t.progress.replace("Half time","45'"),c.progress=c.progress.replace("Half time","45'"),(t.progress.includes("Pens")||t.progress.includes("N/A"))&&(t.progress="Full time"),(c.progress.includes("Pens")||c.progress.includes("N/A"))&&(c.progress="Full time"),t.progress.includes("'")&&!c.progress.includes("'"))return-1;if(!t.progress.includes("'")&&c.progress.includes("'"))return 1;if(t.progress.includes("'")&&c.progress.includes("'")){const g=Number(t.progress.replace("'","").replace("+","")),x=Number(c.progress.replace("'","").replace("+",""));return gg.toISOString().split("T")[0];n=n.replace("Today",a(i)).split("/").reverse().join("-"),n=n.replace("Tomorrow",a(l)).split("/").reverse().join("-"),n=n.replace("Yesterday",a(d)).split("/").reverse().join("-"),r=r.replace("Today",a(i)).split("/").reverse().join("-"),r=r.replace("Tomorrow",a(l)).split("/").reverse().join("-"),r=r.replace("Yesterday",a(d)).split("/").reverse().join("-");let f=new Date(`${n}T${h}`.replace(" ","")),I=new Date(`${r}T${u}`.replace(" ",""));return f>I?-1:f==I?0:1})}),setTimeout(this.updateMatches,1e3*45)}}},M=e=>(B("data-v-2339d0be"),e=e(),H(),e),Y={class:"news"},z=M(()=>o("div",{class:"padding-20"},[o("h1",null,"Sports")],-1)),q=M(()=>o("hr",null,null,-1)),G={class:"padding-20"},Q={class:"small"},X={class:"addWrapper"},Z=M(()=>o("hr",null,null,-1)),ee=["src"],te=["onClick"];function se(e,s,t,c,n,r){const h=w("TextInputWithIcon"),u=w("football-item"),i=w("full-shelf");return p(),m("div",Y,[z,q,o("div",G,[o("p",Q,"Supported urls: "+_(n.supportedSources.join("*, ")),1),o("div",X,[N(h,{modelValue:n.sourceToAdd,"onUpdate:modelValue":s[0]||(s[0]=l=>n.sourceToAdd=l),icon:"link",onKeyup:e.enterText},null,8,["modelValue","onKeyup"]),o("span",{id:"addToPlaylist",class:"material-icons-outlined",onClick:s[1]||(s[1]=(...l)=>r.tryAddSource&&r.tryAddSource(...l))},"add_circle")]),Z,(p(!0),m(S,null,y(n.sports,(l,d)=>(p(),v(i,{key:l.sport,heading:l.sport,icon:l.icon},{default:T(()=>[(p(!0),m(S,null,y(l.items,(a,f)=>(p(),v(u,{key:a.href,competition:a.competition,date:a.date,href:a.href,oref:a.oref,progress:a.progress,result:a.result,team1:a.team1,team2:a.team2,onRemove:()=>r.removeSource(a.sref,d,f)},null,8,["competition","date","href","oref","progress","result","team1","team2","onRemove"]))),128))]),_:2},1032,["heading","icon"]))),128)),r.volleyMatches.length?(p(),v(i,{key:0,heading:"Volleyball",icon:"sports_volleyball"},{default:T(()=>[(p(!0),m(S,null,y(r.volleyMatches,(l,d)=>(p(),m("div",{key:d,class:"wrapIframe"},[o("iframe",{src:`https://cev-nex.tk/#/embed?match=${l.src}`},null,8,ee),o("span",{class:"deleteIcon small material-symbols-rounded",onClick:()=>r.removeSourceD(l.ref)},"clear",8,te)]))),128))]),_:1})):V("",!0)])])}const ae=k(K,[["render",se],["__scopeId","data-v-2339d0be"]]);export{ae as default};
+import{F as C}from"./FullShelf-c8864a7a.js";import{_ as k,C as D,o as p,f as v,w as T,a as o,t as _,aH as A,e as w,T as b,bQ as F,c as m,g as N,F as S,i as y,d as V,l as B,m as H}from"./index-1856ec92.js";const O={name:"FootballItem",components:{Card:D},methods:{redirect(){window.open(this.oref)},remove(e){e.stopPropagation(),this.$emit("remove")}},props:{result:String,date:String,competition:String,href:String,oref:String,team1:String,team2:String,progress:String}},j={class:"wrapper topalign"},L={class:"wrapper"},J=["innerHTML"],P=["innerHTML"],U=["innerHTML"],W={class:"wrapper bottomalign"},$={class:"small"};function E(e,s,t,c,n,r){const h=w("Card");return p(),v(h,{class:"itemBig","with-hover":""},{default:T(()=>{var u;return[o("div",{class:"item",onClick:s[1]||(s[1]=(...i)=>r.redirect&&r.redirect(...i))},[o("div",j,[o("p",null,_(t.competition),1),o("p",{class:A([{accent:(u=t.progress)==null?void 0:u.includes("'")},"right progress"])},_(t.progress),3)]),o("div",L,[o("p",{class:"team",innerHTML:t.team1},null,8,J),o("h4",{class:"result",innerHTML:t.result},null,8,P),o("p",{class:"team",innerHTML:t.team2},null,8,U)]),o("div",W,[o("p",$,_(t.date)+", "+_(t.href),1),o("span",{class:"deleteIcon small material-icons-round",onClick:s[0]||(s[0]=(...i)=>r.remove&&r.remove(...i))},"clear")])])]}),_:1})}const K=k(O,[["render",E],["__scopeId","data-v-b3cf3eea"]]);const R={components:{TextInputWithIcon:b,FullShelf:C,FootballItem:K},name:"Sports",data(){return{sports:[],watchMatches:[],sourceToAdd:"",supportedSources:["https://onefootball.com/en/team/","https://onefootball.com/en/match/","https://onefootball.com/en/competition/","https://www.cev.eu/match-centres/","https://championsleague.cev.eu/en/match-centres/","https://www.cev.eu/calendar/","https://cev-nex.tk/#/match/","https://cevnex.tk/#/match/"]}},mounted(){this.watchMatches=JSON.parse(window.localStorage.getItem("sports.watchMatches"))||[],this.updateMatches()},computed:{volleyMatches(){return this.watchMatches.filter(e=>e.includes("cev")).map(e=>{let s=e;return e.includes("nex.tk")&&(s=e.split("/match/")[1]),{src:s,ref:e}})},notVolleyMatches(){return this.watchMatches.filter(e=>!e.includes("cev"))}},methods:{removeSource(e,s,t){this.watchMatches.splice(this.watchMatches.indexOf(e),1),this.sports[s].items.splice(t,1),window.localStorage.setItem("sports.watchMatches",JSON.stringify(this.watchMatches))},removeSourceD(e){this.watchMatches.splice(this.watchMatches.indexOf(e),1),window.localStorage.setItem("sports.watchMatches",JSON.stringify(this.watchMatches))},tryAddSource(){for(const e of this.supportedSources)if(this.sourceToAdd.startsWith(e)){this.addSource();return}F.addError("unsupported source")},addSource(){this.watchMatches.push(this.sourceToAdd),window.localStorage.setItem("sports.watchMatches",JSON.stringify(this.watchMatches)),this.sourceToAdd=""},updateMatches(){if(!(this.$route.path=="/sports"||this.$route.path=="/sports/")){console.log("not update",this.$route.path);return}fetch("/api/sports",{method:"POST",body:JSON.stringify({urls:this.notVolleyMatches})}).then(e=>e.json()).then(e=>{this.sports=[];for(const s of e){const t=this.sports.findIndex(c=>c.sport==s.sport);t>=0?this.sports[t].items.push(s):this.sports.push({sport:s.sport,icon:s.sportIcon,items:[s]})}for(const s of this.sports)s.items.sort((t,c)=>{if(t.progress=t.progress.replace("Half time","45'"),c.progress=c.progress.replace("Half time","45'"),(t.progress.includes("Pens")||t.progress.includes("N/A"))&&(t.progress="Full time"),(c.progress.includes("Pens")||c.progress.includes("N/A"))&&(c.progress="Full time"),t.progress.includes("'")&&!c.progress.includes("'"))return-1;if(!t.progress.includes("'")&&c.progress.includes("'"))return 1;if(t.progress.includes("'")&&c.progress.includes("'")){const g=Number(t.progress.replace("'","").replace("+","")),x=Number(c.progress.replace("'","").replace("+",""));return gg.toISOString().split("T")[0];n=n.replace("Today",a(i)).split("/").reverse().join("-"),n=n.replace("Tomorrow",a(l)).split("/").reverse().join("-"),n=n.replace("Yesterday",a(d)).split("/").reverse().join("-"),r=r.replace("Today",a(i)).split("/").reverse().join("-"),r=r.replace("Tomorrow",a(l)).split("/").reverse().join("-"),r=r.replace("Yesterday",a(d)).split("/").reverse().join("-");let f=new Date(`${n}T${h}`.replace(" ","")),I=new Date(`${r}T${u}`.replace(" ",""));return f>I?-1:f==I?0:1})}),setTimeout(this.updateMatches,1e3*45)}}},M=e=>(B("data-v-2339d0be"),e=e(),H(),e),Y={class:"news"},z=M(()=>o("div",{class:"padding-20"},[o("h1",null,"Sports")],-1)),Q=M(()=>o("hr",null,null,-1)),q={class:"padding-20"},G={class:"small"},X={class:"addWrapper"},Z=M(()=>o("hr",null,null,-1)),ee=["src"],te=["onClick"];function se(e,s,t,c,n,r){const h=w("TextInputWithIcon"),u=w("football-item"),i=w("full-shelf");return p(),m("div",Y,[z,Q,o("div",q,[o("p",G,"Supported urls: "+_(n.supportedSources.join("*, ")),1),o("div",X,[N(h,{modelValue:n.sourceToAdd,"onUpdate:modelValue":s[0]||(s[0]=l=>n.sourceToAdd=l),icon:"link",onKeyup:e.enterText},null,8,["modelValue","onKeyup"]),o("span",{id:"addToPlaylist",class:"material-icons-outlined",onClick:s[1]||(s[1]=(...l)=>r.tryAddSource&&r.tryAddSource(...l))},"add_circle")]),Z,(p(!0),m(S,null,y(n.sports,(l,d)=>(p(),v(i,{key:l.sport,heading:l.sport,icon:l.icon},{default:T(()=>[(p(!0),m(S,null,y(l.items,(a,f)=>(p(),v(u,{key:a.href,competition:a.competition,date:a.date,href:a.href,oref:a.oref,progress:a.progress,result:a.result,team1:a.team1,team2:a.team2,onRemove:()=>r.removeSource(a.sref,d,f)},null,8,["competition","date","href","oref","progress","result","team1","team2","onRemove"]))),128))]),_:2},1032,["heading","icon"]))),128)),r.volleyMatches.length?(p(),v(i,{key:0,heading:"Volleyball",icon:"sports_volleyball"},{default:T(()=>[(p(!0),m(S,null,y(r.volleyMatches,(l,d)=>(p(),m("div",{key:d,class:"wrapIframe"},[o("iframe",{src:`https://cev-nex.tk/#/embed?match=${l.src}`},null,8,ee),o("span",{class:"deleteIcon small material-symbols-rounded",onClick:()=>r.removeSourceD(l.ref)},"clear",8,te)]))),128))]),_:1})):V("",!0)])])}const ae=k(R,[["render",se],["__scopeId","data-v-2339d0be"]]);export{ae as default};
diff --git a/src/ui/dist/assets/Sports-07156e24.js.gz b/src/ui/dist/assets/Sports-07156e24.js.gz
new file mode 100644
index 000000000..169770c89
Binary files /dev/null and b/src/ui/dist/assets/Sports-07156e24.js.gz differ
diff --git a/src/ui/dist/assets/Sports-cc72e59d.js.gz b/src/ui/dist/assets/Sports-cc72e59d.js.gz
deleted file mode 100644
index aa477fb78..000000000
Binary files a/src/ui/dist/assets/Sports-cc72e59d.js.gz and /dev/null differ
diff --git a/src/ui/dist/assets/Template-deebb6b8.js b/src/ui/dist/assets/Template-8c03613c.js
similarity index 93%
rename from src/ui/dist/assets/Template-deebb6b8.js
rename to src/ui/dist/assets/Template-8c03613c.js
index 416f3a1d9..8e4f59725 100644
--- a/src/ui/dist/assets/Template-deebb6b8.js
+++ b/src/ui/dist/assets/Template-8c03613c.js
@@ -1 +1 @@
-import{n as I,q as m,f as c,a,bG as r,t as S,L as B,c as f,r as T,d as i,U as q,o,l as j,m as D,_ as L}from"./index-d3fba034.js";import{I as h}from"./IconButton-0d464118.js";const M=s=>(j("data-v-0ca4e489"),s=s(),D(),s),N={class:"header bg-secondary rounded-t-2xl p-3"},O={class:"title font-black"},V=M(()=>a("span",{class:"title material-icons-round"}," close ",-1)),$=[V],E={key:1},G={key:2,class:"p-4 pt-0 flex flex-col overflow-x-hidden overflow-y-auto"},U={key:0,class:"confirm"},z=I({__name:"Template",props:{name:{type:String,required:!0},submit:{type:Object,required:!0},secondary:{type:Object,required:!1,default:null}},emits:["submit","close","secondary"],setup(s,{expose:w,emit:d}){const e=s,u=m(!1),l=m(!1),v=m(""),_=()=>l.value=!1,b=()=>{u.value=!1,l.value=!0},k=()=>{u.value=!0,l.value=!0},x=async(y,t)=>{k();const n=await window.fetch(y,t);return b(),n.ok?n:(v.value=await n.text(),null)},p=()=>{_(),d("close")},C=()=>{d("submit"),p()},g=()=>{d("secondary"),p()};return w({show:b,hide:_,load:k,fetch:x}),(y,t)=>l.value?(o(),c(q,{key:0,to:"#popup-target"},[a("div",{class:"modal",onClick:t[1]||(t[1]=r(n=>l.value=!1,["stop"])),onContextmenu:t[2]||(t[2]=r(()=>{},["stop"])),onDrag:t[3]||(t[3]=r(()=>{},["stop"]))},[a("div",{class:"modal-content",onClick:t[0]||(t[0]=r(()=>{},["stop"]))},[a("div",N,[a("h3",O,S(s.name),1),a("button",{class:"modal-close",onClick:p},$)]),u.value?(o(),c(B,{key:0})):v.value?(o(),f("div",E)):(o(),f("div",G,[T(y.$slots,"default",{},void 0,!0),e.submit||e.secondary?(o(),f("div",U,[e.secondary?(o(),c(h,{key:0,icon:e.secondary.icon,label:e.secondary.label,type:e.secondary.type,onClick:g},null,8,["icon","label","type"])):i("",!0),e.submit?(o(),c(h,{key:1,icon:e.submit.icon,label:e.submit.label,type:e.submit.type,onClick:C},null,8,["icon","label","type"])):i("",!0)])):i("",!0)]))])],32)])):i("",!0)}});const H=L(z,[["__scopeId","data-v-0ca4e489"]]);export{H as T};
+import{n as I,q as m,f as c,a,bG as r,t as S,L as B,c as f,r as T,d as i,U as q,o,l as j,m as D,_ as L}from"./index-1856ec92.js";import{I as h}from"./IconButton-1670e129.js";const M=s=>(j("data-v-0ca4e489"),s=s(),D(),s),N={class:"header bg-secondary rounded-t-2xl p-3"},O={class:"title font-black"},V=M(()=>a("span",{class:"title material-icons-round"}," close ",-1)),$=[V],E={key:1},G={key:2,class:"p-4 pt-0 flex flex-col overflow-x-hidden overflow-y-auto"},U={key:0,class:"confirm"},z=I({__name:"Template",props:{name:{type:String,required:!0},submit:{type:Object,required:!0},secondary:{type:Object,required:!1,default:null}},emits:["submit","close","secondary"],setup(s,{expose:w,emit:d}){const e=s,u=m(!1),l=m(!1),v=m(""),_=()=>l.value=!1,b=()=>{u.value=!1,l.value=!0},k=()=>{u.value=!0,l.value=!0},x=async(y,t)=>{k();const n=await window.fetch(y,t);return b(),n.ok?n:(v.value=await n.text(),null)},p=()=>{_(),d("close")},C=()=>{d("submit"),p()},g=()=>{d("secondary"),p()};return w({show:b,hide:_,load:k,fetch:x}),(y,t)=>l.value?(o(),c(q,{key:0,to:"#popup-target"},[a("div",{class:"modal",onClick:t[1]||(t[1]=r(n=>l.value=!1,["stop"])),onContextmenu:t[2]||(t[2]=r(()=>{},["stop"])),onDrag:t[3]||(t[3]=r(()=>{},["stop"]))},[a("div",{class:"modal-content",onClick:t[0]||(t[0]=r(()=>{},["stop"]))},[a("div",N,[a("h3",O,S(s.name),1),a("button",{class:"modal-close",onClick:p},$)]),u.value?(o(),c(B,{key:0})):v.value?(o(),f("div",E)):(o(),f("div",G,[T(y.$slots,"default",{},void 0,!0),e.submit||e.secondary?(o(),f("div",U,[e.secondary?(o(),c(h,{key:0,icon:e.secondary.icon,label:e.secondary.label,type:e.secondary.type,onClick:g},null,8,["icon","label","type"])):i("",!0),e.submit?(o(),c(h,{key:1,icon:e.submit.icon,label:e.submit.label,type:e.submit.type,onClick:C},null,8,["icon","label","type"])):i("",!0)])):i("",!0)]))])],32)])):i("",!0)}});const H=L(z,[["__scopeId","data-v-0ca4e489"]]);export{H as T};
diff --git a/src/ui/dist/assets/Template-8c03613c.js.gz b/src/ui/dist/assets/Template-8c03613c.js.gz
new file mode 100644
index 000000000..7e4053f27
Binary files /dev/null and b/src/ui/dist/assets/Template-8c03613c.js.gz differ
diff --git a/src/ui/dist/assets/Template-deebb6b8.js.gz b/src/ui/dist/assets/Template-deebb6b8.js.gz
deleted file mode 100644
index 448fffe4a..000000000
Binary files a/src/ui/dist/assets/Template-deebb6b8.js.gz and /dev/null differ
diff --git a/src/ui/dist/assets/Track-7c1d0a5c.css b/src/ui/dist/assets/Track-50ce7320.css
similarity index 86%
rename from src/ui/dist/assets/Track-7c1d0a5c.css
rename to src/ui/dist/assets/Track-50ce7320.css
index 1d0e1ac3a..09336efa6 100644
--- a/src/ui/dist/assets/Track-7c1d0a5c.css
+++ b/src/ui/dist/assets/Track-50ce7320.css
@@ -1 +1 @@
-.radialProgress[data-v-6e1a8d6b]{--holesize: 55%;--progress: 20%;min-width:2px;min-height:2px;display:grid;align-items:center;justify-items:center;place-items:center;position:relative}.radialProgress[data-v-6e1a8d6b]:before{content:"";position:absolute;top:0;bottom:0;left:0;right:0;border-radius:50%;background:conic-gradient(var(--fg-secondary),var(--fg-secondary),var(--fg-secondary) var(--progress),var(--fg-base-dk) var(--progress) 100%);-webkit-mask-image:radial-gradient(transparent var(--holesize),black calc(var(--holesize) + .5px));mask-image:radial-gradient(transparent var(--holesize),black calc(var(--holesize) + .5px))}span.material-symbols-rounded[data-v-98bfdf17]{font-size:3rem;border-radius:1000vmax;width:70px;line-height:70px;text-align:center;vertical-align:middle;cursor:pointer;margin-bottom:1.25rem;transition:all .2s ease-in-out}span.material-symbols-rounded[data-v-98bfdf17]:hover{background:var(--bg-hover-lt);color:var(--fg-secondary);transition:none}.track__data .spotify-enable{width:24px;height:24px;cursor:pointer}.track__data .spotify-enable path{fill:var(--fg-base)!important}.track__data .spotify-enable.enabled path{fill:var(--fg-secondary)!important}.track__data .upper[data-v-56a3b0f7]{display:grid;grid-template-columns:fit-content(100%) minmax(500px,1fr);gap:2rem}.track__data .upper .cover[data-v-56a3b0f7]{min-width:384px;aspect-ratio:1/1}@media (max-width: 1000px){.track__data .upper[data-v-56a3b0f7]{grid-template-columns:1fr;justify-items:center;overflow:hidden}.track__data .upper .cover[data-v-56a3b0f7]{min-width:20vw}.track__data .upper .track__info__details[data-v-56a3b0f7]{overflow:auto;width:100%}}.spotify-infos[data-v-56a3b0f7]{display:grid;grid-template-columns:fit-content(100%) 24px 1fr;gap:1rem;align-items:center;height:46px}.spotify-infos .meta[data-v-56a3b0f7]{display:grid;grid-template-columns:repeat(3,fit-content(100%))}.spotify-infos .meta>*[data-v-56a3b0f7]:not(:last-child){margin-right:1rem}.features div[data-v-56a3b0f7]{min-width:150px}.card p[data-v-56a3b0f7],.card h2[data-v-56a3b0f7]{text-align:center}.spotify__features__circles[data-v-56a3b0f7]{display:flex;flex-wrap:wrap;flex-direction:row;justify-content:flex-end;gap:1rem}.spotify__features__circles div[data-v-56a3b0f7]{min-width:100px;flex:1}.spotify__features__circles .circle[data-v-56a3b0f7]{width:50%;margin-left:auto;margin-right:auto}.spotify__features__circles p[data-v-56a3b0f7]{text-align:center}
+.radialProgress[data-v-2329319f]{--holesize: 55%;--progress: 20%;min-width:2px;min-height:2px;display:grid;align-items:center;justify-items:center;place-items:center;position:relative}.radialProgress[data-v-2329319f]:before{content:"";position:absolute;top:0;bottom:0;left:0;right:0;border-radius:50%;background:conic-gradient(var(--fg-secondary),var(--fg-secondary),var(--fg-secondary) var(--progress),var(--fg-base-dk) var(--progress) 100%);-webkit-mask-image:radial-gradient(transparent var(--holesize),black calc(var(--holesize) + .5px));mask-image:radial-gradient(transparent var(--holesize),black calc(var(--holesize) + .5px))}span.material-symbols-rounded[data-v-1b7199f2]{font-size:3rem;border-radius:1000vmax;width:70px;line-height:70px;text-align:center;vertical-align:middle;cursor:pointer;margin-bottom:1.25rem;transition:all .2s ease-in-out}span.material-symbols-rounded[data-v-1b7199f2]:hover{background:var(--bg-hover-lt);color:var(--fg-secondary);transition:none}.track__data .spotify-enable{width:24px;height:24px;cursor:pointer}.track__data .spotify-enable path{fill:var(--fg-base)!important}.track__data .spotify-enable.enabled path{fill:var(--fg-secondary)!important}.track__data .upper[data-v-56a3b0f7]{display:grid;grid-template-columns:fit-content(100%) minmax(500px,1fr);gap:2rem}.track__data .upper .cover[data-v-56a3b0f7]{min-width:384px;aspect-ratio:1/1}@media (max-width: 1000px){.track__data .upper[data-v-56a3b0f7]{grid-template-columns:1fr;justify-items:center;overflow:hidden}.track__data .upper .cover[data-v-56a3b0f7]{min-width:20vw}.track__data .upper .track__info__details[data-v-56a3b0f7]{overflow:auto;width:100%}}.spotify-infos[data-v-56a3b0f7]{display:grid;grid-template-columns:fit-content(100%) 24px 1fr;gap:1rem;align-items:center;height:46px}.spotify-infos .meta[data-v-56a3b0f7]{display:grid;grid-template-columns:repeat(3,fit-content(100%))}.spotify-infos .meta>*[data-v-56a3b0f7]:not(:last-child){margin-right:1rem}.features div[data-v-56a3b0f7]{min-width:150px}.card p[data-v-56a3b0f7],.card h2[data-v-56a3b0f7]{text-align:center}.spotify__features__circles[data-v-56a3b0f7]{display:flex;flex-wrap:wrap;flex-direction:row;justify-content:flex-end;gap:1rem}.spotify__features__circles div[data-v-56a3b0f7]{min-width:100px;flex:1}.spotify__features__circles .circle[data-v-56a3b0f7]{width:50%;margin-left:auto;margin-right:auto}.spotify__features__circles p[data-v-56a3b0f7]{text-align:center}
diff --git a/src/ui/dist/assets/Track-50ce7320.css.gz b/src/ui/dist/assets/Track-50ce7320.css.gz
new file mode 100644
index 000000000..faf929d31
Binary files /dev/null and b/src/ui/dist/assets/Track-50ce7320.css.gz differ
diff --git a/src/ui/dist/assets/Track-7c1d0a5c.css.gz b/src/ui/dist/assets/Track-7c1d0a5c.css.gz
deleted file mode 100644
index d183df692..000000000
Binary files a/src/ui/dist/assets/Track-7c1d0a5c.css.gz and /dev/null differ
diff --git a/src/ui/dist/assets/Track-a007b3f2.js b/src/ui/dist/assets/Track-7c617b04.js
similarity index 74%
rename from src/ui/dist/assets/Track-a007b3f2.js
rename to src/ui/dist/assets/Track-7c617b04.js
index 300073f9a..ed9cf5690 100644
--- a/src/ui/dist/assets/Track-a007b3f2.js
+++ b/src/ui/dist/assets/Track-7c617b04.js
@@ -1 +1 @@
-import{n as I,q as v,G as P,aP as D,o as t,c as _,_ as T,f as n,w as S,C as B,a as s,t as f,d as r,B as A,A as F,bT as H,g as x,h as O,aH as U,bW as W,u as h,F as V,T as K,i as M,bO as R,bX as G,bY as X,bZ as Y,b_ as q,b$ as Z,l as J,m as Q,c0 as ee,c1 as ae,c2 as te,c3 as se,b as le,L as oe}from"./index-d3fba034.js";import{E as ne}from"./ExternalEntry-8bf31741.js";import{F as b}from"./FactCard-6153b002.js";import{_ as ue}from"./EditSong.vue_vue_type_script_setup_true_lang-28aa0cb5.js";import{s as re}from"./spotify-111ae6ad.js";import"./Template-deebb6b8.js";import"./IconButton-0d464118.js";import"./Form-f0cd8cf2.js";import"./Dropdown-b2449fcb.js";const ie=["aria-valuemax","aria-valuenow"],de=I({__name:"ProgressCircle",props:{max:{type:Number,required:!1,default:100},modelValue:{type:Number,required:!1,default:0},displayValue:{type:String,required:!0}},setup(u){const m=u,d=v(null),g=()=>{if(d.value){const c=m.modelValue/m.max*100;d.value.style.setProperty("--progress",`${c}%`),d.value.innerHTML=m.displayValue}};P(m,g,{deep:!0});const l=()=>{d.value&&(d.value.style.height=d.value.offsetWidth+"px")};return D(()=>{l(),g()}),window.addEventListener("resize",l),(c,y)=>(t(),_("div",{ref_key:"radialProgress",ref:d,"aria-valuemax":u.max,"aria-valuenow":u.modelValue,"aria-valuemin":"0",class:"radialProgress",role:"progressbar"},null,8,ie))}});const E=T(de,[["__scopeId","data-v-6e1a8d6b"]]),ce={class:"material-symbols-rounded ms-fill"},pe={key:0,class:"text-muted"},_e=I({__name:"ButtonCard",props:{icon:{type:String,required:!0},label:{type:String,required:!1}},setup(u){return(m,d)=>(t(),n(B,{class:"p-4 flex flex-col w-full items-center justify-center"},{default:S(()=>[s("span",ce,f(u.icon),1),u.label?(t(),_("span",pe,f(u.label),1)):r("",!0)]),_:1}))}});const N=T(_e,[["__scopeId","data-v-98bfdf17"]]),j=u=>(J("data-v-56a3b0f7"),u=u(),Q(),u),me={class:"track p-4"},ve={key:2},fe={class:"track__data"},ye={class:"upper"},xe={class:"trac__info__details__normal"},he={class:"text-secondary my-0 text-2xl font-bold"},ke={class:"text-muted text-base ml-4 font-light"},be={class:"flex flew-row items-center"},ge={class:"font-black text-5xl ml-4"},we={key:0,class:"features flex flex-row gap-4 pt-4 pb-2 overflow-x-auto"},Ce={class:"spotify-infos mt-4"},Ve={class:"meta items-center"},$e={class:"text-muted"},Pe={key:0,class:"material-symbols-rounded ms-fill"},Se={class:"flex flex-row align-items"},Be=j(()=>s("span",{class:"material-symbols-rounded ms-fill mr-2"},"local_fire_department",-1)),Ie={class:"font-bold"},Te={class:"relative w-full mt-4"},Ue={class:"spotify__features__circles"},Me={class:"text-muted mb-0 text-center text-sm capitalize flex justify-center"},qe={class:"material-symbols-rounded mr-2"},Ee=j(()=>s("h2",{class:"!text-left"},"Similar Songs",-1)),Ne=I({__name:"Track",setup(u){const m=R(),d=A(),g=F(()=>m.params.hash),l=v(null),c=v(null),y=v("url"),a=v(null),w=v([]),$=v([]),k=v(!1),L={acousticness:"piano",danceability:"nightlife",energy:"electric_bolt",happiness:"mood",instrumentalness:"mic_off",liveness:"groups_2",speechiness:"mic",loudness:"volume_up"},C=async(p=null)=>{var o;l.value=null,a.value=null,w.value=[],l.value=await G(g.value),window.document.title=`${l.value.title} - reAudioPlayer One`,a.value=await X(l.value.id,!!p,p),c.value=`https://open.spotify.com/track/${a.value.spotify.id}`,y.value="link",k.value=((o=a.value.spotify.id)==null?void 0:o.length)==22,w.value=await Y(l.value.id),$.value=[];for(let[e,i]of Object.entries(a.value.spotify.features))["key","mode","tempo","duration_ms","time_signature"].includes(e)||typeof i=="number"&&(e=e.replaceAll("_"," "),e=e.replace("valence","happiness"),e==="loudness"&&(i=60+i),$.value.push({key:e,value:i,icon:L[e]}))};D(C),P(m,()=>C(),{deep:!0}),P(c,()=>{var p,o;if(((o=(p=a.value)==null?void 0:p.spotify)==null?void 0:o.id)==q(c.value,"track")){y.value="link";return}y.value="save"});const z=()=>{if(y.value==="save"){const p=q(c.value,"track");if(!p)return;C(p);return}Z(c.value)};return(p,o)=>(t(),_(V,null,[l.value?(t(),n(H,{key:0,src:l.value.cover,class:"-z-10"},null,8,["src"])):r("",!0),s("div",me,[l.value?(t(),n(ue,{key:0,ref:"updatePopup",song:l.value,onUpdate:o[0]||(o[0]=()=>C())},null,8,["song"])):r("",!0),l.value?(t(),_("div",ve,[s("div",fe,[s("div",ye,[x(O,{src:l.value.cover,class:"max-w-sm rounded-xl"},null,8,["src"]),s("div",{class:U([{"justify-end":a.value,"justify-center":!a.value},"track__info__details flex flex-col"])},[s("div",xe,[s("h3",he,[x(W,{artist:l.value.artist,class:"inline"},null,8,["artist"]),s("span",ke,f(l.value.album),1)]),s("div",be,[s("span",{class:"text-5xl cursor-pointer material-symbols-rounded ms-fill my-auto",onClick:o[1]||(o[1]=e=>h(d).loadPlaylist("track",l.value.id))}," play_circle "),s("h1",ge,f(l.value.title),1)])]),a.value&&a.value.spotify.features?(t(),_(V,{key:0},[a.value&&a.value.spotify.features?(t(),_("div",we,[a.value?(t(),n(b,{key:0,"primary-text":a.value.spotify.features.key+" "+a.value.spotify.features.mode,class:"w-full","secondary-text":"Key"},null,8,["primary-text"])):r("",!0),a.value?(t(),n(b,{key:1,"primary-text":h(ee)(a.value),class:"w-full","secondary-text":"Camelot"},null,8,["primary-text"])):r("",!0),a.value?(t(),n(b,{key:2,"primary-text":Math.round(a.value.spotify.features.tempo),class:"w-full","secondary-text":"BPM"},null,8,["primary-text"])):r("",!0),x(b,{"primary-text":h(ae)(l.value.duration),class:"w-full","secondary-text":"Duration"},null,8,["primary-text"]),a.value?(t(),n(b,{key:3,"primary-text":a.value.plays,class:"w-full","secondary-text":"Plays"},null,8,["primary-text"])):r("",!0),x(N,{icon:"edit",label:"Edit",onClick:o[2]||(o[2]=e=>p.$refs.updatePopup.show())}),x(N,{icon:"download",label:"Download",onClick:o[3]||(o[3]=e=>h(te)(l.value.id))})])):r("",!0),s("div",Ce,[s("div",Ve,[s("span",$e,f(h(se)(a.value.spotify.releaseDate)),1),a.value.spotify.explicit?(t(),_("span",Pe,"explicit")):r("",!0),s("span",Se,[Be,s("span",Ie,f(a.value.spotify.popularity),1)])]),x(h(re),{class:U([{enabled:k.value},"spotify-enable"]),onClick:o[4]||(o[4]=e=>k.value=!k.value)},null,8,["class"]),k.value?(t(),n(K,{key:0,modelValue:c.value,"onUpdate:modelValue":o[5]||(o[5]=e=>c.value=e),icon:y.value,onClick:z},null,8,["modelValue","icon"])):r("",!0)])],64)):r("",!0)],2)])]),s("div",Te,[s("div",Ue,[(t(!0),_(V,null,M($.value,e=>(t(),n(B,{class:"p-2"},{default:S(()=>[e.key==="loudness"?(t(),n(E,{key:0,modelValue:e.value,"onUpdate:modelValue":i=>e.value=i,"display-value":Math.round(-60+e.value)+"dB",class:"circle",max:"60"},null,8,["modelValue","onUpdate:modelValue","display-value"])):(t(),n(E,{key:1,modelValue:e.value,"onUpdate:modelValue":i=>e.value=i,"display-value":Math.round(e.value*100)+"%",class:"circle",max:"1"},null,8,["modelValue","onUpdate:modelValue","display-value"])),s("p",Me,[s("span",qe,f(e.icon),1),le(" "+f(e.key),1)])]),_:2},1024))),256))])]),w.value.length?(t(),n(B,{key:0,class:"p-4 mt-4"},{default:S(()=>[Ee,(t(!0),_(V,null,M(w.value,(e,i)=>(t(),n(ne,{key:i,index:i,song:e,"can-import":"","cannot-add":"","with-album":"","with-cover":""},null,8,["index","song"]))),128))]),_:1})):r("",!0)])):(t(),n(oe,{key:1}))])],64))}});const Ke=T(Ne,[["__scopeId","data-v-56a3b0f7"]]);export{Ke as default};
+import{n as I,q as v,G as P,aP as D,o as t,c as _,_ as T,f as n,w as S,C as B,a as s,t as f,d as r,B as A,A as F,bS as H,g as x,h as W,aH as U,bV as K,u as h,F as V,T as O,i as M,bN as R,bW as G,bX as X,bY as Y,bZ as N,b_ as Z,l as J,m as Q,b$ as ee,c0 as ae,c1 as te,c2 as se,b as le,L as oe}from"./index-1856ec92.js";import{E as ne}from"./ExternalEntry-4cf58b98.js";import{F as b}from"./FactCard-e476ac4b.js";import{_ as ue}from"./EditSong.vue_vue_type_script_setup_true_lang-8a2aaef1.js";import{s as re}from"./spotify-ddcce4ae.js";import"./Template-8c03613c.js";import"./IconButton-1670e129.js";import"./Form-d27a37bd.js";import"./Dropdown-16096009.js";const ie=["aria-valuemax","aria-valuenow"],de=I({__name:"ProgressCircle",props:{max:{type:Number,required:!1,default:100},modelValue:{type:Number,required:!1,default:0},displayValue:{type:String,required:!0}},setup(u){const m=u,d=v(null),g=()=>{if(d.value){const c=m.modelValue/m.max*100;d.value.style.setProperty("--progress",`${c}%`),d.value.innerHTML=m.displayValue}};P(m,g,{deep:!0});const l=()=>{d.value&&(d.value.style.height=d.value.offsetWidth+"px")};return D(()=>{l(),g()}),window.addEventListener("resize",l),(c,y)=>(t(),_("div",{ref_key:"radialProgress",ref:d,"aria-valuemax":u.max,"aria-valuenow":u.modelValue,"aria-valuemin":"0",class:"radialProgress",role:"progressbar"},null,8,ie))}});const q=T(de,[["__scopeId","data-v-2329319f"]]),ce={class:"material-symbols-rounded ms-fill"},pe={key:0,class:"text-muted"},_e=I({__name:"ButtonCard",props:{icon:{type:String,required:!0},label:{type:String,required:!1}},setup(u){return(m,d)=>(t(),n(B,{class:"p-4 flex flex-col w-full items-center justify-center"},{default:S(()=>[s("span",ce,f(u.icon),1),u.label?(t(),_("span",pe,f(u.label),1)):r("",!0)]),_:1}))}});const E=T(_e,[["__scopeId","data-v-1b7199f2"]]),j=u=>(J("data-v-56a3b0f7"),u=u(),Q(),u),me={class:"track p-4"},ve={key:2},fe={class:"track__data"},ye={class:"upper"},xe={class:"trac__info__details__normal"},he={class:"text-secondary my-0 text-2xl font-bold"},ke={class:"text-muted text-base ml-4 font-light"},be={class:"flex flew-row items-center"},ge={class:"font-black text-5xl ml-4"},we={key:0,class:"features flex flex-row gap-4 pt-4 pb-2 overflow-x-auto"},Ce={class:"spotify-infos mt-4"},Ve={class:"meta items-center"},$e={class:"text-muted"},Pe={key:0,class:"material-symbols-rounded ms-fill"},Se={class:"flex flex-row align-items"},Be=j(()=>s("span",{class:"material-symbols-rounded ms-fill mr-2"},"local_fire_department",-1)),Ie={class:"font-bold"},Te={class:"relative w-full mt-4"},Ue={class:"spotify__features__circles"},Me={class:"text-muted mb-0 text-center text-sm capitalize flex justify-center"},Ne={class:"material-symbols-rounded mr-2"},qe=j(()=>s("h2",{class:"!text-left"},"Similar Songs",-1)),Ee=I({__name:"Track",setup(u){const m=R(),d=A(),g=F(()=>m.params.hash),l=v(null),c=v(null),y=v("url"),a=v(null),w=v([]),$=v([]),k=v(!1),L={acousticness:"piano",danceability:"nightlife",energy:"electric_bolt",happiness:"mood",instrumentalness:"mic_off",liveness:"groups_2",speechiness:"mic",loudness:"volume_up"},C=async(p=null)=>{var o;l.value=null,a.value=null,w.value=[],l.value=await G(g.value),window.document.title=`${l.value.title} - reAudioPlayer One`,a.value=await X(l.value.id,!!p,p),c.value=`https://open.spotify.com/track/${a.value.spotify.id}`,y.value="link",k.value=((o=a.value.spotify.id)==null?void 0:o.length)==22,w.value=await Y(l.value.id),$.value=[];for(let[e,i]of Object.entries(a.value.spotify.features))["key","mode","tempo","duration_ms","time_signature"].includes(e)||typeof i=="number"&&(e=e.replaceAll("_"," "),e=e.replace("valence","happiness"),e==="loudness"&&(i=60+i),$.value.push({key:e,value:i,icon:L[e]}))};D(C),P(m,()=>C(),{deep:!0}),P(c,()=>{var p,o;if(((o=(p=a.value)==null?void 0:p.spotify)==null?void 0:o.id)==N(c.value,"track")){y.value="link";return}y.value="save"});const z=()=>{if(y.value==="save"){const p=N(c.value,"track");if(!p)return;C(p);return}Z(c.value)};return(p,o)=>(t(),_(V,null,[l.value?(t(),n(H,{key:0,src:l.value.cover,class:"-z-10"},null,8,["src"])):r("",!0),s("div",me,[l.value?(t(),n(ue,{key:0,ref:"updatePopup",song:l.value,onUpdate:o[0]||(o[0]=()=>C())},null,8,["song"])):r("",!0),l.value?(t(),_("div",ve,[s("div",fe,[s("div",ye,[x(W,{src:l.value.cover,class:"max-w-sm rounded-xl"},null,8,["src"]),s("div",{class:U([{"justify-end":a.value,"justify-center":!a.value},"track__info__details flex flex-col"])},[s("div",xe,[s("h3",he,[x(K,{artist:l.value.artist,class:"inline"},null,8,["artist"]),s("span",ke,f(l.value.album),1)]),s("div",be,[s("span",{class:"text-5xl cursor-pointer material-symbols-rounded ms-fill my-auto",onClick:o[1]||(o[1]=e=>h(d).loadPlaylist("track",l.value.id))}," play_circle "),s("h1",ge,f(l.value.title),1)])]),a.value&&a.value.spotify.features?(t(),_(V,{key:0},[a.value&&a.value.spotify.features?(t(),_("div",we,[a.value?(t(),n(b,{key:0,"primary-text":a.value.spotify.features.key+" "+a.value.spotify.features.mode,class:"w-full","secondary-text":"Key"},null,8,["primary-text"])):r("",!0),a.value?(t(),n(b,{key:1,"primary-text":h(ee)(a.value),class:"w-full","secondary-text":"Camelot"},null,8,["primary-text"])):r("",!0),a.value?(t(),n(b,{key:2,"primary-text":Math.round(a.value.spotify.features.tempo),class:"w-full","secondary-text":"BPM"},null,8,["primary-text"])):r("",!0),x(b,{"primary-text":h(ae)(l.value.duration),class:"w-full","secondary-text":"Duration"},null,8,["primary-text"]),a.value?(t(),n(b,{key:3,"primary-text":a.value.plays,class:"w-full","secondary-text":"Plays"},null,8,["primary-text"])):r("",!0),x(E,{icon:"edit",label:"Edit",onClick:o[2]||(o[2]=e=>p.$refs.updatePopup.show())}),x(E,{icon:"download",label:"Download",onClick:o[3]||(o[3]=e=>h(te)(l.value.id))})])):r("",!0),s("div",Ce,[s("div",Ve,[s("span",$e,f(h(se)(a.value.spotify.releaseDate)),1),a.value.spotify.explicit?(t(),_("span",Pe,"explicit")):r("",!0),s("span",Se,[Be,s("span",Ie,f(a.value.spotify.popularity),1)])]),x(h(re),{class:U([{enabled:k.value},"spotify-enable"]),onClick:o[4]||(o[4]=e=>k.value=!k.value)},null,8,["class"]),k.value?(t(),n(O,{key:0,modelValue:c.value,"onUpdate:modelValue":o[5]||(o[5]=e=>c.value=e),icon:y.value,onClick:z},null,8,["modelValue","icon"])):r("",!0)])],64)):r("",!0)],2)])]),s("div",Te,[s("div",Ue,[(t(!0),_(V,null,M($.value,e=>(t(),n(B,{class:"p-2"},{default:S(()=>[e.key==="loudness"?(t(),n(q,{key:0,modelValue:e.value,"onUpdate:modelValue":i=>e.value=i,"display-value":Math.round(-60+e.value)+"dB",class:"circle",max:"60"},null,8,["modelValue","onUpdate:modelValue","display-value"])):(t(),n(q,{key:1,modelValue:e.value,"onUpdate:modelValue":i=>e.value=i,"display-value":Math.round(e.value*100)+"%",class:"circle",max:"1"},null,8,["modelValue","onUpdate:modelValue","display-value"])),s("p",Me,[s("span",Ne,f(e.icon),1),le(" "+f(e.key),1)])]),_:2},1024))),256))])]),w.value.length?(t(),n(B,{key:0,class:"p-4 mt-4"},{default:S(()=>[qe,(t(!0),_(V,null,M(w.value,(e,i)=>(t(),n(ne,{key:i,index:i,song:e,"can-import":"","cannot-add":"","with-album":"","with-cover":""},null,8,["index","song"]))),128))]),_:1})):r("",!0)])):(t(),n(oe,{key:1}))])],64))}});const Oe=T(Ee,[["__scopeId","data-v-56a3b0f7"]]);export{Oe as default};
diff --git a/src/ui/dist/assets/Track-7c617b04.js.gz b/src/ui/dist/assets/Track-7c617b04.js.gz
new file mode 100644
index 000000000..cbff044de
Binary files /dev/null and b/src/ui/dist/assets/Track-7c617b04.js.gz differ
diff --git a/src/ui/dist/assets/Track-a007b3f2.js.gz b/src/ui/dist/assets/Track-a007b3f2.js.gz
deleted file mode 100644
index 2d793807d..000000000
Binary files a/src/ui/dist/assets/Track-a007b3f2.js.gz and /dev/null differ
diff --git a/src/ui/dist/assets/TrackCompact-7a7a3cb3.js b/src/ui/dist/assets/TrackCompact-30025f11.js
similarity index 91%
rename from src/ui/dist/assets/TrackCompact-7a7a3cb3.js
rename to src/ui/dist/assets/TrackCompact-30025f11.js
index 8d75fedc3..ab9f5853e 100644
--- a/src/ui/dist/assets/TrackCompact-7a7a3cb3.js
+++ b/src/ui/dist/assets/TrackCompact-30025f11.js
@@ -1 +1 @@
-import{_ as x,s as I,z as $,q as i,G as T,A as B,c8 as u,e as H,o as r,c as p,f as d,u as l,d as g,g as n,w as m,a as t,y as N,M as _,t as D,C as M,l as O,m as R}from"./index-d3fba034.js";import{_ as V}from"./ImportSpotifyAlbum.vue_vue_type_script_setup_true_lang-8201752a.js";import{_ as q}from"./ExternalEntry-8bf31741.js";const z=e=>(O("data-v-7b3e8b4c"),e=e(),R(),e),A={class:"home-track-compact-wrapper"},E=["src"],G=z(()=>t("div",{class:"play"},[t("span",{class:"material-symbols-rounded"},"play_arrow")],-1)),P={class:"info"},j={class:"title"},F=["href"],J={class:"artist"},K={__name:"TrackCompact",props:{title:String,artist:String,cover:String,id:Number,href:String},emits:["play"],setup(e,{emit:b}){const a=e,S=I(),f=`/track/${$(String(a.id))}`,h=i(null),v=i(null),C=o=>{o.stopPropagation(),b("play")},w=()=>{var o,c;if(!((o=a.href)!=null&&o.includes("spotify.com"))){S.push(f);return}if((c=a.href)!=null&&c.includes("spotify.com/album/")){v.value.show();return}h.value.show()},s=i(a.cover);T(()=>a.cover,()=>{s.value=a.cover});const k=B(()=>u(s.value));return(o,c)=>{const y=H("router-link");return r(),p("div",A,[e.href.includes("spotify.com/album/")?(r(),d(V,{key:0,ref_key:"addRelease",ref:v,album:{cover:l(k),name:e.title,artist:e.artist,id:e.href.replace("https://open.spotify.com/album/",""),href:e.href,releaseDate:null}},null,8,["album"])):g("",!0),e.href.includes("spotify.com/track/")?(r(),d(q,{key:1,ref_key:"addSong",ref:h,song:{cover:l(k),title:e.title,artist:e.artist,id:e.href.replace("https://open.spotify.com/track/",""),href:e.href,releaseDate:null}},null,8,["song"])):g("",!0),n(M,{class:"home-track-compact","with-hover":"",onClick:w},{default:m(()=>[t("div",{style:N({backgroundImage:`url(${l(u)(s.value)})`}),class:"cover",onClick:C},[t("img",{src:l(u)(s.value),class:"hidden",onError:c[0]||(c[0]=Q=>s.value=null)},null,40,E),G],4),t("div",P,[t("span",j,[e.href?(r(),p("a",{key:1,href:e.href,class:"linkOnHover"},[n(_,{text:e.title},null,8,["text"])],8,F)):(r(),d(y,{key:0,to:f,class:"linkOnHover"},{default:m(()=>[n(_,{text:e.title},null,8,["text"])]),_:1}))]),n(y,{to:`/search/artist:${e.artist}`,class:"linkOnHover"},{default:m(()=>[t("span",J,D(e.artist),1)]),_:1},8,["to"])])]),_:1})])}}},Y=x(K,[["__scopeId","data-v-7b3e8b4c"]]);export{Y as T};
+import{_ as x,s as I,z as $,q as i,G as T,A as B,c7 as u,e as H,o as r,c as p,f as d,u as l,d as g,g as n,w as m,a as t,y as N,M as _,t as D,C as M,l as O,m as R}from"./index-1856ec92.js";import{_ as V}from"./ImportSpotifyAlbum.vue_vue_type_script_setup_true_lang-2307b3a0.js";import{_ as q}from"./ExternalEntry-4cf58b98.js";const z=e=>(O("data-v-7b3e8b4c"),e=e(),R(),e),A={class:"home-track-compact-wrapper"},E=["src"],G=z(()=>t("div",{class:"play"},[t("span",{class:"material-symbols-rounded"},"play_arrow")],-1)),P={class:"info"},j={class:"title"},F=["href"],J={class:"artist"},K={__name:"TrackCompact",props:{title:String,artist:String,cover:String,id:Number,href:String},emits:["play"],setup(e,{emit:b}){const a=e,S=I(),f=`/track/${$(String(a.id))}`,h=i(null),v=i(null),C=o=>{o.stopPropagation(),b("play")},w=()=>{var o,c;if(!((o=a.href)!=null&&o.includes("spotify.com"))){S.push(f);return}if((c=a.href)!=null&&c.includes("spotify.com/album/")){v.value.show();return}h.value.show()},s=i(a.cover);T(()=>a.cover,()=>{s.value=a.cover});const k=B(()=>u(s.value));return(o,c)=>{const y=H("router-link");return r(),p("div",A,[e.href.includes("spotify.com/album/")?(r(),d(V,{key:0,ref_key:"addRelease",ref:v,album:{cover:l(k),name:e.title,artist:e.artist,id:e.href.replace("https://open.spotify.com/album/",""),href:e.href,releaseDate:null}},null,8,["album"])):g("",!0),e.href.includes("spotify.com/track/")?(r(),d(q,{key:1,ref_key:"addSong",ref:h,song:{cover:l(k),title:e.title,artist:e.artist,id:e.href.replace("https://open.spotify.com/track/",""),href:e.href,releaseDate:null}},null,8,["song"])):g("",!0),n(M,{class:"home-track-compact","with-hover":"",onClick:w},{default:m(()=>[t("div",{style:N({backgroundImage:`url(${l(u)(s.value)})`}),class:"cover",onClick:C},[t("img",{src:l(u)(s.value),class:"hidden",onError:c[0]||(c[0]=Q=>s.value=null)},null,40,E),G],4),t("div",P,[t("span",j,[e.href?(r(),p("a",{key:1,href:e.href,class:"linkOnHover"},[n(_,{text:e.title},null,8,["text"])],8,F)):(r(),d(y,{key:0,to:f,class:"linkOnHover"},{default:m(()=>[n(_,{text:e.title},null,8,["text"])]),_:1}))]),n(y,{to:`/search/artist:${e.artist}`,class:"linkOnHover"},{default:m(()=>[t("span",J,D(e.artist),1)]),_:1},8,["to"])])]),_:1})])}}},Y=x(K,[["__scopeId","data-v-7b3e8b4c"]]);export{Y as T};
diff --git a/src/ui/dist/assets/TrackCompact-30025f11.js.gz b/src/ui/dist/assets/TrackCompact-30025f11.js.gz
new file mode 100644
index 000000000..ebf7578aa
Binary files /dev/null and b/src/ui/dist/assets/TrackCompact-30025f11.js.gz differ
diff --git a/src/ui/dist/assets/TrackCompact-7a7a3cb3.js.gz b/src/ui/dist/assets/TrackCompact-7a7a3cb3.js.gz
deleted file mode 100644
index ff5e4bdb0..000000000
Binary files a/src/ui/dist/assets/TrackCompact-7a7a3cb3.js.gz and /dev/null differ
diff --git a/src/ui/dist/assets/Tracks-5449d295.js b/src/ui/dist/assets/Tracks-5449d295.js
deleted file mode 100644
index 1a95fd3a6..000000000
--- a/src/ui/dist/assets/Tracks-5449d295.js
+++ /dev/null
@@ -1 +0,0 @@
-import{I as r}from"./index-24f8c98a.js";import{f as o,o as t}from"./index-d3fba034.js";import"./index.vue_vue_type_script_setup_true_lang-c89e37e5.js";import"./FactCard-6153b002.js";import"./PlaylistEntry-0d2da2e2.js";import"./EditSong.vue_vue_type_script_setup_true_lang-28aa0cb5.js";import"./Template-deebb6b8.js";import"./IconButton-0d464118.js";import"./Form-f0cd8cf2.js";import"./Dropdown-b2449fcb.js";import"./playerInPicture-af203fdf.js";import"./PlaylistHeader-8dd53ec0.js";const B={__name:"Tracks",setup(p){return(m,i)=>(t(),o(r,{id:"liked"}))}};export{B as default};
diff --git a/src/ui/dist/assets/Tracks-9e2d1601.js b/src/ui/dist/assets/Tracks-9e2d1601.js
new file mode 100644
index 000000000..db4f488bf
--- /dev/null
+++ b/src/ui/dist/assets/Tracks-9e2d1601.js
@@ -0,0 +1 @@
+import{I as r}from"./index-2a21dcd1.js";import{f as o,o as t}from"./index-1856ec92.js";import"./index.vue_vue_type_script_setup_true_lang-ba86f86f.js";import"./FactCard-e476ac4b.js";import"./PlaylistEntry-18ad8a22.js";import"./EditSong.vue_vue_type_script_setup_true_lang-8a2aaef1.js";import"./Template-8c03613c.js";import"./IconButton-1670e129.js";import"./Form-d27a37bd.js";import"./Dropdown-16096009.js";import"./playerInPicture-af203fdf.js";import"./PlaylistHeader-40afea3c.js";const B={__name:"Tracks",setup(p){return(m,i)=>(t(),o(r,{id:"liked"}))}};export{B as default};
diff --git a/src/ui/dist/assets/Welcome-b3be9f3c.js b/src/ui/dist/assets/Welcome-4b13f644.js
similarity index 97%
rename from src/ui/dist/assets/Welcome-b3be9f3c.js
rename to src/ui/dist/assets/Welcome-4b13f644.js
index 478dd4649..c55cc5d1e 100644
--- a/src/ui/dist/assets/Welcome-b3be9f3c.js
+++ b/src/ui/dist/assets/Welcome-4b13f644.js
@@ -1 +1 @@
-import{_ as p,c4 as r,o as i,c,a as e,aH as v,ce as C,v as g,cf as S,F as T,i as b,b as u,bD as h,bu as _,d as k,f as w,l as I,m as R,e as x}from"./index-d3fba034.js";const A={name:"ThemeSmall",props:{name:String},methods:{selected(){return r.getCurrentTheme()==this.name},select(){r.setTheme(this.name),this.$emit("selected")}}},E=["src"];function B(n,s,m,f,o,l){return i(),c("div",{onClick:s[0]||(s[0]=(...a)=>l.select&&l.select(...a)),class:"wrapper"},[e("img",{src:`/assets/img/themes/${this.name}.svg`,class:v({selected:l.selected()})},null,10,E)])}const N=p(A,[["render",B],["__scopeId","data-v-321833b6"]]);const V={components:{ThemeSmall:N},methods:{updateThemes(){this.mode++},redirect(n){r.open(n)},finalRedirectRestricted(){this.spotifyClientId||this.spotifyClientSecret||fetch("/api/config/spotify",{method:"POST",body:JSON.stringify({id:"restricted",secret:"restricted"})}).then(n=>{n.status==200&&(setTimeout(()=>fetch("/api/releases"),1e3),this.mode++,setTimeout(()=>{this.$router.push("/")},6*1e3))})},async finalRedirect(){!this.spotifyClientId||!this.spotifyClientSecret||(await C(this.spotifyClientId,this.spotifyClientSecret),setTimeout(()=>fetch("/api/releases"),1e3),setTimeout(()=>fetch("/api/news/articles"),1e3),this.mode++,setTimeout(async()=>{await g(),this.$router.push("/")},6*1e3))}},data(){setInterval(()=>{if(this.mode<3){this.mode++;return}},7*1e3);const n=["dynamic","dark","light"],s=r.getCurrentTheme();return{mode:0,themes:n,themeSelected:s,spotifyClientId:"",spotifyClientSecret:""}},async mounted(){await S()||this.$router.push("/")}},t=n=>(I("data-v-9aa97202"),n=n(),R(),n),Y={class:"welcome bouncy centred-column"},D={key:0,class:"first centred-column"},O=t(()=>e("p",null,"Welcome to",-1)),F=t(()=>e("h1",null,"reAudioPlayer ONE",-1)),H=[O,F],L={key:1,class:"first centred-column"},P=t(()=>e("p",null,"The free audio player with the most extensive catalogue",-1)),U=t(()=>e("h1",null,"ARE YOU READY?",-1)),W=[P,U],M={key:2,class:"first centred-column"},z=t(()=>e("h1",null,"Almost There",-1)),G=t(()=>e("p",null,"After a few configurations you're ready to go",-1)),J=[z,G],j={key:3,class:"permanent centred-column"},q=t(()=>e("h1",null,"Pick a Theme",-1)),K=t(()=>e("p",null,"You'll be able to change the theme at any point later on",-1)),Q=t(()=>e("br",null,null,-1)),X={class:"centred-column appear-delayed"},Z={key:4,class:"permanent centred-column"},$=t(()=>e("h1",null,"Let's integrate Spotify then!",-1)),ee=t(()=>e("p",null,"You'll be able to change the tokens at any point later on",-1)),te=t(()=>e("br",null,null,-1)),se={class:"centred-column appear-delayed"},oe=t(()=>e("p",null,"2) Create An App",-1)),ne=t(()=>e("p",null,"3) Enter any name and any description",-1)),ie=t(()=>e("p",null,[u("4) Edit the settings: set the redirect url to "),e("a",{href:"http://reap.ml/"},"http://reap.ml/")],-1)),le=t(()=>e("p",null,"5) Copy and enter the client id and secret into the corresponding input field",-1)),ce=t(()=>e("br",null,null,-1)),de={class:"wrapTogether"},re=t(()=>e("p",null,"Client ID: ",-1)),ae={class:"wrapTogether"},he=t(()=>e("p",null,"Client Secret: ",-1)),_e={class:"wrapTogether spaceBetween"},pe={key:5,class:"centred-column"},ue=t(()=>e("h1",null,"ALRIGHT!",-1)),me=t(()=>e("p",null,"You're ready to go",-1)),fe=[ue,me];function ye(n,s,m,f,o,l){const a=x("theme-small");return i(),c("div",Y,[o.mode==0?(i(),c("div",D,H)):o.mode==1?(i(),c("div",L,W)):o.mode==2?(i(),c("div",M,J)):o.mode==3?(i(),c("div",j,[q,K,Q,e("div",X,[(i(),c("div",{class:"themes",key:o.themeSelected},[(i(!0),c(T,null,b(o.themes,(d,y)=>(i(),w(a,{onSelected:l.updateThemes,key:y,name:d},null,8,["onSelected","name"]))),128))]))])])):o.mode==4?(i(),c("div",Z,[$,ee,te,e("div",se,[e("p",null,[u("1) Head over to the "),e("a",{onClick:s[0]||(s[0]=()=>l.redirect("https://developer.spotify.com/dashboard/applications"))},"spotify developer dashboard")]),oe,ne,ie,le,ce,e("div",de,[re,h(e("input",{type:"text","onUpdate:modelValue":s[1]||(s[1]=d=>o.spotifyClientId=d)},null,512),[[_,o.spotifyClientId]])]),e("div",ae,[he,h(e("input",{type:"text","onUpdate:modelValue":s[2]||(s[2]=d=>o.spotifyClientSecret=d)},null,512),[[_,o.spotifyClientSecret]])]),e("div",_e,[e("button",{onClick:s[3]||(s[3]=(...d)=>l.finalRedirect&&l.finalRedirect(...d))},"continue"),e("button",{onClick:s[4]||(s[4]=(...d)=>l.finalRedirectRestricted&&l.finalRedirectRestricted(...d)),class:"restrictedMode"},"enter restricted mode")])])])):o.mode==5?(i(),c("div",pe,fe)):k("",!0)])}const Ce=p(V,[["render",ye],["__scopeId","data-v-9aa97202"]]);export{Ce as default};
+import{_ as p,c3 as r,o as i,c,a as e,aH as v,cd as C,v as g,ce as S,F as T,i as b,b as u,bD as h,bu as _,d as k,f as w,l as I,m as R,e as x}from"./index-1856ec92.js";const A={name:"ThemeSmall",props:{name:String},methods:{selected(){return r.getCurrentTheme()==this.name},select(){r.setTheme(this.name),this.$emit("selected")}}},E=["src"];function B(n,s,m,f,o,l){return i(),c("div",{onClick:s[0]||(s[0]=(...a)=>l.select&&l.select(...a)),class:"wrapper"},[e("img",{src:`/assets/img/themes/${this.name}.svg`,class:v({selected:l.selected()})},null,10,E)])}const N=p(A,[["render",B],["__scopeId","data-v-321833b6"]]);const V={components:{ThemeSmall:N},methods:{updateThemes(){this.mode++},redirect(n){r.open(n)},finalRedirectRestricted(){this.spotifyClientId||this.spotifyClientSecret||fetch("/api/config/spotify",{method:"POST",body:JSON.stringify({id:"restricted",secret:"restricted"})}).then(n=>{n.status==200&&(setTimeout(()=>fetch("/api/releases"),1e3),this.mode++,setTimeout(()=>{this.$router.push("/")},6*1e3))})},async finalRedirect(){!this.spotifyClientId||!this.spotifyClientSecret||(await C(this.spotifyClientId,this.spotifyClientSecret),setTimeout(()=>fetch("/api/releases"),1e3),setTimeout(()=>fetch("/api/news/articles"),1e3),this.mode++,setTimeout(async()=>{await g(),this.$router.push("/")},6*1e3))}},data(){setInterval(()=>{if(this.mode<3){this.mode++;return}},7*1e3);const n=["dynamic","dark","light"],s=r.getCurrentTheme();return{mode:0,themes:n,themeSelected:s,spotifyClientId:"",spotifyClientSecret:""}},async mounted(){await S()||this.$router.push("/")}},t=n=>(I("data-v-9aa97202"),n=n(),R(),n),Y={class:"welcome bouncy centred-column"},D={key:0,class:"first centred-column"},O=t(()=>e("p",null,"Welcome to",-1)),F=t(()=>e("h1",null,"reAudioPlayer ONE",-1)),H=[O,F],L={key:1,class:"first centred-column"},P=t(()=>e("p",null,"The free audio player with the most extensive catalogue",-1)),U=t(()=>e("h1",null,"ARE YOU READY?",-1)),W=[P,U],M={key:2,class:"first centred-column"},z=t(()=>e("h1",null,"Almost There",-1)),G=t(()=>e("p",null,"After a few configurations you're ready to go",-1)),J=[z,G],j={key:3,class:"permanent centred-column"},q=t(()=>e("h1",null,"Pick a Theme",-1)),K=t(()=>e("p",null,"You'll be able to change the theme at any point later on",-1)),Q=t(()=>e("br",null,null,-1)),X={class:"centred-column appear-delayed"},Z={key:4,class:"permanent centred-column"},$=t(()=>e("h1",null,"Let's integrate Spotify then!",-1)),ee=t(()=>e("p",null,"You'll be able to change the tokens at any point later on",-1)),te=t(()=>e("br",null,null,-1)),se={class:"centred-column appear-delayed"},oe=t(()=>e("p",null,"2) Create An App",-1)),ne=t(()=>e("p",null,"3) Enter any name and any description",-1)),ie=t(()=>e("p",null,[u("4) Edit the settings: set the redirect url to "),e("a",{href:"http://reap.ml/"},"http://reap.ml/")],-1)),le=t(()=>e("p",null,"5) Copy and enter the client id and secret into the corresponding input field",-1)),ce=t(()=>e("br",null,null,-1)),de={class:"wrapTogether"},re=t(()=>e("p",null,"Client ID: ",-1)),ae={class:"wrapTogether"},he=t(()=>e("p",null,"Client Secret: ",-1)),_e={class:"wrapTogether spaceBetween"},pe={key:5,class:"centred-column"},ue=t(()=>e("h1",null,"ALRIGHT!",-1)),me=t(()=>e("p",null,"You're ready to go",-1)),fe=[ue,me];function ye(n,s,m,f,o,l){const a=x("theme-small");return i(),c("div",Y,[o.mode==0?(i(),c("div",D,H)):o.mode==1?(i(),c("div",L,W)):o.mode==2?(i(),c("div",M,J)):o.mode==3?(i(),c("div",j,[q,K,Q,e("div",X,[(i(),c("div",{class:"themes",key:o.themeSelected},[(i(!0),c(T,null,b(o.themes,(d,y)=>(i(),w(a,{onSelected:l.updateThemes,key:y,name:d},null,8,["onSelected","name"]))),128))]))])])):o.mode==4?(i(),c("div",Z,[$,ee,te,e("div",se,[e("p",null,[u("1) Head over to the "),e("a",{onClick:s[0]||(s[0]=()=>l.redirect("https://developer.spotify.com/dashboard/applications"))},"spotify developer dashboard")]),oe,ne,ie,le,ce,e("div",de,[re,h(e("input",{type:"text","onUpdate:modelValue":s[1]||(s[1]=d=>o.spotifyClientId=d)},null,512),[[_,o.spotifyClientId]])]),e("div",ae,[he,h(e("input",{type:"text","onUpdate:modelValue":s[2]||(s[2]=d=>o.spotifyClientSecret=d)},null,512),[[_,o.spotifyClientSecret]])]),e("div",_e,[e("button",{onClick:s[3]||(s[3]=(...d)=>l.finalRedirect&&l.finalRedirect(...d))},"continue"),e("button",{onClick:s[4]||(s[4]=(...d)=>l.finalRedirectRestricted&&l.finalRedirectRestricted(...d)),class:"restrictedMode"},"enter restricted mode")])])])):o.mode==5?(i(),c("div",pe,fe)):k("",!0)])}const Ce=p(V,[["render",ye],["__scopeId","data-v-9aa97202"]]);export{Ce as default};
diff --git a/src/ui/dist/assets/Welcome-4b13f644.js.gz b/src/ui/dist/assets/Welcome-4b13f644.js.gz
new file mode 100644
index 000000000..bd69e8d45
Binary files /dev/null and b/src/ui/dist/assets/Welcome-4b13f644.js.gz differ
diff --git a/src/ui/dist/assets/Welcome-b3be9f3c.js.gz b/src/ui/dist/assets/Welcome-b3be9f3c.js.gz
deleted file mode 100644
index aa2e7c298..000000000
Binary files a/src/ui/dist/assets/Welcome-b3be9f3c.js.gz and /dev/null differ
diff --git a/src/ui/dist/assets/ffmpeg/ffmpeg-worker-mp4.js.gz b/src/ui/dist/assets/ffmpeg/ffmpeg-worker-mp4.js.gz
index bbcc54e18..ae80527d9 100644
Binary files a/src/ui/dist/assets/ffmpeg/ffmpeg-worker-mp4.js.gz and b/src/ui/dist/assets/ffmpeg/ffmpeg-worker-mp4.js.gz differ
diff --git a/src/ui/dist/assets/gistClient-a7b793ac.js.gz b/src/ui/dist/assets/gistClient-a7b793ac.js.gz
deleted file mode 100644
index 0bcefff0a..000000000
Binary files a/src/ui/dist/assets/gistClient-a7b793ac.js.gz and /dev/null differ
diff --git a/src/ui/dist/assets/gistClient-a7b793ac.js b/src/ui/dist/assets/gistClient-de54a050.js
similarity index 96%
rename from src/ui/dist/assets/gistClient-a7b793ac.js
rename to src/ui/dist/assets/gistClient-de54a050.js
index 3574bba47..13c007af1 100644
--- a/src/ui/dist/assets/gistClient-a7b793ac.js
+++ b/src/ui/dist/assets/gistClient-de54a050.js
@@ -1 +1 @@
-import{c5 as g,bR as c}from"./index-d3fba034.js";const e=async(t=null)=>{const s=await g(),a=t??s.github.githubPat;if(!a)throw new Error("No GitHub PAT found");return{Authorization:"Bearer "+a}},h=(t,s="one.lib.json")=>{const a={};return a[s]={content:JSON.stringify(t)},JSON.stringify({files:a})},r=async()=>(await g()).github.gistId,o=async()=>{const t=await e(),s=await fetch(`https://api.github.com/gists/${await r()}`,{headers:t});try{return await s.json()}catch{return null}},d=async(t,s="one.lib.json")=>{const a=await e(),n=await fetch(`https://api.github.com/gists/${await r()}`,{method:"PATCH",headers:a,body:h(t,s)});if(!n.ok)return c.addError("Failed to update gist","",3e3),null;const i=await n.json();return c.addSuccess("Gist updated","",3e3),i},u=async(t,s="one.lib.json")=>{const a=await e(),n=await fetch("https://api.github.com/gists",{method:"POST",headers:a,body:h(t,s)});if(!n.ok)return c.addError("Failed to create gist","",3e3),null;const i=await n.json();i.id&&await fetch("/api/config",{method:"PUT",body:JSON.stringify({github:{gistId:i.id}})}),c.addSuccess("Gist created","",3e3)},l={connected:async()=>!!await r(),get:o,getContent:async(t="one.lib.json")=>{var n,i;const a=(i=(n=(await o()).files)==null?void 0:n[t])==null?void 0:i.content;return a?JSON.parse(a):[]},saveOrUpdate:async(t,s="one.lib.json")=>(await o()).files?await d(t,s):await u(t,s),save:u,update:d,delete:async()=>{const t=await e();return await(await fetch(`https://api.github.com/gists/${await r()}`,{method:"DELETE",headers:t})).json()},search:async(t=null)=>{var i;const s=await e(t),n=await(await fetch("https://api.github.com/gists?filename=one.lib.json",{headers:s})).json();return(i=n==null?void 0:n[0])==null?void 0:i.id},gistUrl:async()=>{const t=await o();return t==null?void 0:t.html_url}};export{l as G};
+import{c4 as g,bQ as c}from"./index-1856ec92.js";const e=async(t=null)=>{const s=await g(),a=t??s.github.githubPat;if(!a)throw new Error("No GitHub PAT found");return{Authorization:"Bearer "+a}},h=(t,s="one.lib.json")=>{const a={};return a[s]={content:JSON.stringify(t)},JSON.stringify({files:a})},r=async()=>(await g()).github.gistId,o=async()=>{const t=await e(),s=await fetch(`https://api.github.com/gists/${await r()}`,{headers:t});try{return await s.json()}catch{return null}},d=async(t,s="one.lib.json")=>{const a=await e(),n=await fetch(`https://api.github.com/gists/${await r()}`,{method:"PATCH",headers:a,body:h(t,s)});if(!n.ok)return c.addError("Failed to update gist","",3e3),null;const i=await n.json();return c.addSuccess("Gist updated","",3e3),i},u=async(t,s="one.lib.json")=>{const a=await e(),n=await fetch("https://api.github.com/gists",{method:"POST",headers:a,body:h(t,s)});if(!n.ok)return c.addError("Failed to create gist","",3e3),null;const i=await n.json();i.id&&await fetch("/api/config",{method:"PUT",body:JSON.stringify({github:{gistId:i.id}})}),c.addSuccess("Gist created","",3e3)},l={connected:async()=>!!await r(),get:o,getContent:async(t="one.lib.json")=>{var n,i;const a=(i=(n=(await o()).files)==null?void 0:n[t])==null?void 0:i.content;return a?JSON.parse(a):[]},saveOrUpdate:async(t,s="one.lib.json")=>(await o()).files?await d(t,s):await u(t,s),save:u,update:d,delete:async()=>{const t=await e();return await(await fetch(`https://api.github.com/gists/${await r()}`,{method:"DELETE",headers:t})).json()},search:async(t=null)=>{var i;const s=await e(t),n=await(await fetch("https://api.github.com/gists?filename=one.lib.json",{headers:s})).json();return(i=n==null?void 0:n[0])==null?void 0:i.id},gistUrl:async()=>{const t=await o();return t==null?void 0:t.html_url}};export{l as G};
diff --git a/src/ui/dist/assets/gistClient-de54a050.js.gz b/src/ui/dist/assets/gistClient-de54a050.js.gz
new file mode 100644
index 000000000..5e48af67d
Binary files /dev/null and b/src/ui/dist/assets/gistClient-de54a050.js.gz differ
diff --git a/src/ui/dist/assets/index-067eb8b3.js b/src/ui/dist/assets/index-067eb8b3.js
new file mode 100644
index 000000000..aa33d8d31
--- /dev/null
+++ b/src/ui/dist/assets/index-067eb8b3.js
@@ -0,0 +1 @@
+import{n as q,cb as N,q as x,c as n,a as e,F as u,i as S,u as p,g as f,w as y,C as h,bO as B,o as s,f as C,b as d,t as a,h as F,d as r,cc as D,y as O,L as T,aH as V,bQ as $,l as L,m as j,_ as z}from"./index-1856ec92.js";import{I as A}from"./IconButton-1670e129.js";import{F as E}from"./Form-d27a37bd.js";import"./Dropdown-16096009.js";const t=v=>(L("data-v-0651bc0d"),v=v(),j(),v),H={class:"downloader py-2 pr-2 grid gap-4 grid-cols-2 items-start"},M={class:"downloads"},P={class:"main"},Q={class:"m-0 mb-4"},Y={class:"status"},G={class:"flex flex-col"},J={key:0,class:"info"},K=t(()=>e("span",{class:"material-symbols-rounded"},"cloud",-1)),R={key:1,class:"info"},U=t(()=>e("span",{class:"material-symbols-rounded"},"file_download",-1)),W={class:"info"},X=t(()=>e("span",{class:"material-symbols-rounded"},"percent",-1)),Z={key:2,class:"info"},oo=t(()=>e("span",{class:"material-symbols-rounded"},"speed",-1)),eo={key:3,class:"info"},so=t(()=>e("span",{class:"material-symbols-rounded"},"timer",-1)),no=t(()=>e("div",{class:"error"},[e("span",null,"This song could not be downloaded:"),e("ul",{class:"block list-disc ml-8"},[e("li",null," verify that the source link is working "),e("li",null," try again later ")])],-1)),ao={key:0,class:"info"},lo=t(()=>e("span",{class:"material-symbols-rounded"},"link",-1)),ro=["href"],to={class:"wrap-progress"},io=["aria-valuenow"],co={key:1,class:"material-symbols-rounded downloading"},uo=["onClick"],_o=["onClick"],mo=["onClick"],po={key:1,class:"col-span-2 flex flex-row justify-center items-center"},fo={class:"new-download"},vo=q({__name:"index",setup(v){const _=N(),g=l=>{$.addYesNo("Are you sure you want to redownload this song?",null,null,()=>{console.log("[downloader] reDownload",l),_.downloadFromDb(l)})},m={title:"",artist:"",album:"",cover:"",source:"",href:""},w=x(null),i=x([{name:"source",type:"text",accept:"audio/mp3",required:!0,onChange:async l=>{const c=await B(l);i.value.find(o=>o.name==="title").value=c.title,i.value.find(o=>o.name==="artist").value=c.artist,i.value.find(o=>o.name==="album").value=c.album,i.value.find(o=>o.name==="cover").value=c.cover,i.value.find(o=>o.name==="source").value=c.source},value:m.source},{name:"title",type:"text",icon:"title",required:!0,value:m.title},{name:"artist",type:"text",icon:"person",required:!0,value:m.artist},{name:"album",type:"text",icon:"album",value:m.album},{name:"cover",type:"upload",accept:"image/*",imagePreview:!0,value:m.cover}]),I=async()=>{const l=w.value.toObject();l.id=new Date().getTime(),console.log("[downloader] requestDownload",l),_.downloadOther(l)};return(l,c)=>(s(),n("div",H,[e("div",M,[(s(!0),n(u,null,S(p(_).states,o=>{var k;return s(),C(h,{key:o.songId,class:V([["song",{downloading:((k=p(_).states[o.songId])==null?void 0:k.status)=="downloading"}],"p-4 card items-center"])},{default:y(()=>[o.status!=="pending"?(s(),n(u,{key:0},[e("main",P,[e("h2",Q,[o.song?(s(),n(u,{key:0},[d(a(o.song.title),1)],64)):(s(),n(u,{key:1},[d(a(o.filename),1)],64))]),e("div",Y,[o.song?(s(),C(h,{key:0,class:"info p-4"},{default:y(()=>[f(F,{src:o.song.cover,class:"cover"},null,8,["src"]),e("div",G,[e("span",null,a(o.song.album),1),e("span",null,a(o.song.artist),1)])]),_:2},1024)):r("",!0),o.status!=="error"?(s(),n(u,{key:1},[o.downloaded||o.total?(s(),n("div",J,[K,d(" "+a(p(D)(o.downloaded))+" / "+a(p(D)(o.total)),1)])):r("",!0),o.chunk?(s(),n("div",R,[U,d(" "+a(o.chunk),1)])):r("",!0),e("div",W,[X,d(" "+a(o.status==="downloading"?o.percent:100)+"% ",1)]),o.speed!=="0"?(s(),n("div",Z,[oo,d(" "+a(o.speed),1)])):r("",!0),o.elapsed!=="0"||o.eta!==0?(s(),n("div",eo,[so,d(" "+a(o.elapsed)+" / "+a(o.eta)+"s ",1)])):r("",!0)],64)):(s(),n(u,{key:2},[no,o.song?(s(),n("div",ao,[lo,e("a",{href:o.song.source,target:"_blank",rel:"noopener noreferrer"},a(o.song.source),9,ro)])):r("",!0)],64))])]),e("aside",null,[e("div",to,[o.status=="downloading"?(s(),n("div",{key:0,class:"progress-bar",role:"progressbar","aria-valuenow":o.percent,"aria-valuemin":"0","aria-valuemax":"100",style:O({"--progress":o.percent+"%"})},null,12,io)):r("",!0),o.status=="downloading"?(s(),n("span",co," south ")):o.status=="finished"?(s(),n("span",{key:2,class:"material-symbols-rounded cursor-pointer finished",onClick:b=>p(_).download(o.songId)}," download_for_offline ",8,uo)):o.status=="downloaded"?(s(),n("span",{key:3,class:"material-symbols-rounded cursor-pointer downloaded",onClick:b=>g(o.songId)}," download_done ",8,_o)):o.status=="error"?(s(),n("span",{key:4,class:"material-symbols-rounded cursor-pointer error",onClick:b=>g(o.songId)}," error ",8,mo)):r("",!0)])])],64)):(s(),n("div",po,[f(T)]))]),_:2},1032,["class"])}),128))]),e("div",fo,[f(h,{class:"custom p-4 flex flex-col"},{default:y(()=>[f(E,{ref_key:"form",ref:w,options:i.value},null,8,["options"]),f(A,{icon:"download_for_offline",label:"Download",class:"w-full mt-8",onClick:I})]),_:1})])]))}});const ko=z(vo,[["__scopeId","data-v-0651bc0d"]]);export{ko as default};
diff --git a/src/ui/dist/assets/index-067eb8b3.js.gz b/src/ui/dist/assets/index-067eb8b3.js.gz
new file mode 100644
index 000000000..fdadf44d2
Binary files /dev/null and b/src/ui/dist/assets/index-067eb8b3.js.gz differ
diff --git a/src/ui/dist/assets/index-090c50ff.js.gz b/src/ui/dist/assets/index-090c50ff.js.gz
deleted file mode 100644
index bfae3856b..000000000
Binary files a/src/ui/dist/assets/index-090c50ff.js.gz and /dev/null differ
diff --git a/src/ui/dist/assets/index-d3fba034.js b/src/ui/dist/assets/index-1856ec92.js
similarity index 76%
rename from src/ui/dist/assets/index-d3fba034.js
rename to src/ui/dist/assets/index-1856ec92.js
index 122a6da63..7fd5542d3 100644
--- a/src/ui/dist/assets/index-d3fba034.js
+++ b/src/ui/dist/assets/index-1856ec92.js
@@ -1,32 +1,32 @@
-var p2=Object.defineProperty;var g2=(e,t,r)=>t in e?p2(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var xi=(e,t,r)=>(g2(e,typeof t!="symbol"?t+"":t,r),r);(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))s(o);new MutationObserver(o=>{for(const l of o)if(l.type==="childList")for(const u of l.addedNodes)u.tagName==="LINK"&&u.rel==="modulepreload"&&s(u)}).observe(document,{childList:!0,subtree:!0});function r(o){const l={};return o.integrity&&(l.integrity=o.integrity),o.referrerpolicy&&(l.referrerPolicy=o.referrerpolicy),o.crossorigin==="use-credentials"?l.credentials="include":o.crossorigin==="anonymous"?l.credentials="omit":l.credentials="same-origin",l}function s(o){if(o.ep)return;o.ep=!0;const l=r(o);fetch(o.href,l)}})();function m2(e,t){const r=Object.create(null),s=e.split(",");for(let o=0;o!!r[o.toLowerCase()]:o=>!!r[o]}const v2=()=>{},Vu=Object.assign,y2=Object.prototype.hasOwnProperty,pa=(e,t)=>y2.call(e,t),rr=Array.isArray,jo=e=>Pp(e)==="[object Map]",_2=e=>typeof e=="function",b2=e=>typeof e=="string",Hu=e=>typeof e=="symbol",ga=e=>e!==null&&typeof e=="object",w2=Object.prototype.toString,Pp=e=>w2.call(e),A2=e=>Pp(e).slice(8,-1),Uu=e=>b2(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,ju=(e,t)=>!Object.is(e,t),P2=(e,t,r)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:r})};let un;class xp{constructor(t=!1){this.active=!0,this.effects=[],this.cleanups=[],!t&&un&&(this.parent=un,this.index=(un.scopes||(un.scopes=[])).push(this)-1)}run(t){if(this.active){const r=un;try{return un=this,t()}finally{un=r}}}on(){un=this}off(){un=this.parent}stop(t){if(this.active){let r,s;for(r=0,s=this.effects.length;r{const t=new Set(e);return t.w=0,t.n=0,t},kp=e=>(e.w&Or)>0,Sp=e=>(e.n&Or)>0,E2=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let r=0;for(let s=0;s{(h==="length"||h>=s)&&c.push(d)});else switch(r!==void 0&&c.push(u.get(r)),t){case"add":rr(e)?Uu(r)&&c.push(u.get("length")):(c.push(u.get(Qr)),jo(e)&&c.push(u.get(mu)));break;case"delete":rr(e)||(c.push(u.get(Qr)),jo(e)&&c.push(u.get(mu)));break;case"set":jo(e)&&c.push(u.get(Qr));break}if(c.length===1)c[0]&&vu(c[0]);else{const d=[];for(const h of c)h&&d.push(...h);vu(qu(d))}}function vu(e,t){const r=rr(e)?e:[...e];for(const s of r)s.computed&&Yd(s);for(const s of r)s.computed||Yd(s)}function Yd(e,t){(e!==Sn||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}const S2=m2("__proto__,__v_isRef,__isVue"),Tp=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Hu)),O2=va(),R2=va(!1,!0),T2=va(!0),M2=va(!0,!0),Jd=I2();function I2(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...r){const s=Ze(this);for(let l=0,u=this.length;l{e[t]=function(...r){ii();const s=Ze(this)[t].apply(this,r);return si(),s}}),e}function va(e=!1,t=!1){return function(s,o,l){if(o==="__v_isReactive")return!e;if(o==="__v_isReadonly")return e;if(o==="__v_isShallow")return t;if(o==="__v_raw"&&l===(e?t?Np:Dp:t?Bp:$p).get(s))return s;const u=rr(s);if(!e&&u&&pa(Jd,o))return Reflect.get(Jd,o,l);const c=Reflect.get(s,o,l);return(Hu(o)?Tp.has(o):S2(o))||(e||fn(s,"get",o),t)?c:vt(c)?u&&Uu(o)?c:c.value:ga(c)?e?Wp(c):oi(c):c}}const L2=Mp(),$2=Mp(!0);function Mp(e=!1){return function(r,s,o,l){let u=r[s];if(Ii(u)&&vt(u)&&!vt(o))return!1;if(!e&&(!Xo(o)&&!Ii(o)&&(u=Ze(u),o=Ze(o)),!rr(r)&&vt(u)&&!vt(o)))return u.value=o,!0;const c=rr(r)&&Uu(s)?Number(s)e,ya=e=>Reflect.getPrototypeOf(e);function Mo(e,t,r=!1,s=!1){e=e.__v_raw;const o=Ze(e),l=Ze(t);r||(t!==l&&fn(o,"get",t),fn(o,"get",l));const{has:u}=ya(o),c=s?Ku:r?zu:Os;if(u.call(o,t))return c(e.get(t));if(u.call(o,l))return c(e.get(l));e!==o&&e.get(t)}function Io(e,t=!1){const r=this.__v_raw,s=Ze(r),o=Ze(e);return t||(e!==o&&fn(s,"has",e),fn(s,"has",o)),e===o?r.has(e):r.has(e)||r.has(o)}function Lo(e,t=!1){return e=e.__v_raw,!t&&fn(Ze(e),"iterate",Qr),Reflect.get(e,"size",e)}function Xd(e){e=Ze(e);const t=Ze(this);return ya(t).has.call(t,e)||(t.add(e),sr(t,"add",e,e)),this}function Qd(e,t){t=Ze(t);const r=Ze(this),{has:s,get:o}=ya(r);let l=s.call(r,e);l||(e=Ze(e),l=s.call(r,e));const u=o.call(r,e);return r.set(e,t),l?ju(t,u)&&sr(r,"set",e,t):sr(r,"add",e,t),this}function eh(e){const t=Ze(this),{has:r,get:s}=ya(t);let o=r.call(t,e);o||(e=Ze(e),o=r.call(t,e)),s&&s.call(t,e);const l=t.delete(e);return o&&sr(t,"delete",e,void 0),l}function th(){const e=Ze(this),t=e.size!==0,r=e.clear();return t&&sr(e,"clear",void 0,void 0),r}function $o(e,t){return function(s,o){const l=this,u=l.__v_raw,c=Ze(u),d=t?Ku:e?zu:Os;return!e&&fn(c,"iterate",Qr),u.forEach((h,g)=>s.call(o,d(h),d(g),l))}}function Bo(e,t,r){return function(...s){const o=this.__v_raw,l=Ze(o),u=jo(l),c=e==="entries"||e===Symbol.iterator&&u,d=e==="keys"&&u,h=o[e](...s),g=r?Ku:t?zu:Os;return!t&&fn(l,"iterate",d?mu:Qr),{next(){const{value:m,done:p}=h.next();return p?{value:m,done:p}:{value:c?[g(m[0]),g(m[1])]:g(m),done:p}},[Symbol.iterator](){return this}}}}function vr(e){return function(...t){return e==="delete"?!1:this}}function V2(){const e={get(l){return Mo(this,l)},get size(){return Lo(this)},has:Io,add:Xd,set:Qd,delete:eh,clear:th,forEach:$o(!1,!1)},t={get(l){return Mo(this,l,!1,!0)},get size(){return Lo(this)},has:Io,add:Xd,set:Qd,delete:eh,clear:th,forEach:$o(!1,!0)},r={get(l){return Mo(this,l,!0)},get size(){return Lo(this,!0)},has(l){return Io.call(this,l,!0)},add:vr("add"),set:vr("set"),delete:vr("delete"),clear:vr("clear"),forEach:$o(!0,!1)},s={get(l){return Mo(this,l,!0,!0)},get size(){return Lo(this,!0)},has(l){return Io.call(this,l,!0)},add:vr("add"),set:vr("set"),delete:vr("delete"),clear:vr("clear"),forEach:$o(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(l=>{e[l]=Bo(l,!1,!1),r[l]=Bo(l,!0,!1),t[l]=Bo(l,!1,!0),s[l]=Bo(l,!0,!0)}),[e,r,t,s]}const[H2,U2,j2,q2]=V2();function _a(e,t){const r=t?e?q2:j2:e?U2:H2;return(s,o,l)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?s:Reflect.get(pa(r,o)&&o in s?r:s,o,l)}const K2={get:_a(!1,!1)},z2={get:_a(!1,!0)},Z2={get:_a(!0,!1)},G2={get:_a(!0,!0)},$p=new WeakMap,Bp=new WeakMap,Dp=new WeakMap,Np=new WeakMap;function Y2(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function J2(e){return e.__v_skip||!Object.isExtensible(e)?0:Y2(A2(e))}function oi(e){return Ii(e)?e:ba(e,!1,Ip,K2,$p)}function X2(e){return ba(e,!1,W2,z2,Bp)}function Wp(e){return ba(e,!0,Lp,Z2,Dp)}function QE(e){return ba(e,!0,F2,G2,Np)}function ba(e,t,r,s,o){if(!ga(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const l=o.get(e);if(l)return l;const u=J2(e);if(u===0)return e;const c=new Proxy(e,u===2?s:r);return o.set(e,c),c}function kr(e){return Ii(e)?kr(e.__v_raw):!!(e&&e.__v_isReactive)}function Ii(e){return!!(e&&e.__v_isReadonly)}function Xo(e){return!!(e&&e.__v_isShallow)}function Fp(e){return kr(e)||Ii(e)}function Ze(e){const t=e&&e.__v_raw;return t?Ze(t):e}function Li(e){return P2(e,"__v_skip",!0),e}const Os=e=>ga(e)?oi(e):e,zu=e=>ga(e)?Wp(e):e;function Zu(e){Er&&Sn&&(e=Ze(e),Rp(e.dep||(e.dep=qu())))}function wa(e,t){e=Ze(e),e.dep&&vu(e.dep)}function vt(e){return!!(e&&e.__v_isRef===!0)}function $e(e){return Vp(e,!1)}function Q2(e){return Vp(e,!0)}function Vp(e,t){return vt(e)?e:new eA(e,t)}class eA{constructor(t,r){this.__v_isShallow=r,this.dep=void 0,this.__v_isRef=!0,this._rawValue=r?t:Ze(t),this._value=r?t:Os(t)}get value(){return Zu(this),this._value}set value(t){const r=this.__v_isShallow||Xo(t)||Ii(t);t=r?t:Ze(t),ju(t,this._rawValue)&&(this._rawValue=t,this._value=r?t:Os(t),wa(this))}}function ek(e){wa(e)}function Q(e){return vt(e)?e.value:e}const tA={get:(e,t,r)=>Q(Reflect.get(e,t,r)),set:(e,t,r,s)=>{const o=e[t];return vt(o)&&!vt(r)?(o.value=r,!0):Reflect.set(e,t,r,s)}};function Hp(e){return kr(e)?e:new Proxy(e,tA)}class nA{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:r,set:s}=t(()=>Zu(this),()=>wa(this));this._get=r,this._set=s}get value(){return this._get()}set value(t){this._set(t)}}function tk(e){return new nA(e)}function rA(e){const t=rr(e)?new Array(e.length):{};for(const r in e)t[r]=sA(e,r);return t}class iA{constructor(t,r,s){this._object=t,this._key=r,this._defaultValue=s,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}}function sA(e,t,r){const s=e[t];return vt(s)?s:new iA(e,t,r)}var Up;class oA{constructor(t,r,s,o){this._setter=r,this.dep=void 0,this.__v_isRef=!0,this[Up]=!1,this._dirty=!0,this.effect=new ma(t,()=>{this._dirty||(this._dirty=!0,wa(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!o,this.__v_isReadonly=s}get value(){const t=Ze(this);return Zu(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}Up="__v_isReadonly";function aA(e,t,r=!1){let s,o;const l=_2(e);return l?(s=e,o=v2):(s=e.get,o=e.set),new oA(s,o,l||!o,r)}function jp(e,t){const r=Object.create(null),s=e.split(",");for(let o=0;o!!r[o.toLowerCase()]:o=>!!r[o]}const lA="Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt",uA=jp(lA);function Lr(e){if(He(e)){const t={};for(let r=0;r{if(r){const s=r.split(fA);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function it(e){let t="";if(St(e))t=e;else if(He(e))for(let r=0;rSt(e)?e:e==null?"":He(e)||At(e)&&(e.toString===Gp||!De(e.toString))?JSON.stringify(e,qp,2):String(e),qp=(e,t)=>t&&t.__v_isRef?qp(e,t.value):zp(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((r,[s,o])=>(r[`${s} =>`]=o,r),{})}:Zp(t)?{[`Set(${t.size})`]:[...t.values()]}:At(t)&&!He(t)&&!Yp(t)?String(t):t,at={},Si=[],Wn=()=>{},hA=()=>!1,pA=/^on[^a-z]/,Aa=e=>pA.test(e),Kp=e=>e.startsWith("onUpdate:"),en=Object.assign,Gu=(e,t)=>{const r=e.indexOf(t);r>-1&&e.splice(r,1)},gA=Object.prototype.hasOwnProperty,Qe=(e,t)=>gA.call(e,t),He=Array.isArray,zp=e=>Ju(e)==="[object Map]",Zp=e=>Ju(e)==="[object Set]",De=e=>typeof e=="function",St=e=>typeof e=="string",At=e=>e!==null&&typeof e=="object",Yu=e=>At(e)&&De(e.then)&&De(e.catch),Gp=Object.prototype.toString,Ju=e=>Gp.call(e),Yp=e=>Ju(e)==="[object Object]",_s=jp(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Pa=e=>{const t=Object.create(null);return r=>t[r]||(t[r]=e(r))},mA=/-(\w)/g,Fn=Pa(e=>e.replace(mA,(t,r)=>r?r.toUpperCase():"")),vA=/\B([A-Z])/g,xa=Pa(e=>e.replace(vA,"-$1").toLowerCase()),Xu=Pa(e=>e.charAt(0).toUpperCase()+e.slice(1)),qo=Pa(e=>e?`on${Xu(e)}`:""),yu=(e,t)=>!Object.is(e,t),bs=(e,t)=>{for(let r=0;r{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:r})},Jp=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let nh;const yA=()=>nh||(nh=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{}),ws=[];function _A(e,...t){ii();const r=ws.length?ws[ws.length-1].component:null,s=r&&r.appContext.config.warnHandler,o=bA();if(s)ir(s,r,11,[e+t.join(""),r&&r.proxy,o.map(({vnode:l})=>`at <${Og(r,l.type)}>`).join(`
+var h2=Object.defineProperty;var p2=(e,t,r)=>t in e?h2(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var xi=(e,t,r)=>(p2(e,typeof t!="symbol"?t+"":t,r),r);(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))s(o);new MutationObserver(o=>{for(const l of o)if(l.type==="childList")for(const u of l.addedNodes)u.tagName==="LINK"&&u.rel==="modulepreload"&&s(u)}).observe(document,{childList:!0,subtree:!0});function r(o){const l={};return o.integrity&&(l.integrity=o.integrity),o.referrerpolicy&&(l.referrerPolicy=o.referrerpolicy),o.crossorigin==="use-credentials"?l.credentials="include":o.crossorigin==="anonymous"?l.credentials="omit":l.credentials="same-origin",l}function s(o){if(o.ep)return;o.ep=!0;const l=r(o);fetch(o.href,l)}})();function g2(e,t){const r=Object.create(null),s=e.split(",");for(let o=0;o!!r[o.toLowerCase()]:o=>!!r[o]}const m2=()=>{},Vu=Object.assign,v2=Object.prototype.hasOwnProperty,pa=(e,t)=>v2.call(e,t),rr=Array.isArray,jo=e=>Pp(e)==="[object Map]",y2=e=>typeof e=="function",_2=e=>typeof e=="string",Hu=e=>typeof e=="symbol",ga=e=>e!==null&&typeof e=="object",b2=Object.prototype.toString,Pp=e=>b2.call(e),w2=e=>Pp(e).slice(8,-1),Uu=e=>_2(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,ju=(e,t)=>!Object.is(e,t),A2=(e,t,r)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:r})};let un;class xp{constructor(t=!1){this.active=!0,this.effects=[],this.cleanups=[],!t&&un&&(this.parent=un,this.index=(un.scopes||(un.scopes=[])).push(this)-1)}run(t){if(this.active){const r=un;try{return un=this,t()}finally{un=r}}}on(){un=this}off(){un=this.parent}stop(t){if(this.active){let r,s;for(r=0,s=this.effects.length;r{const t=new Set(e);return t.w=0,t.n=0,t},kp=e=>(e.w&Or)>0,Sp=e=>(e.n&Or)>0,C2=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let r=0;for(let s=0;s{(h==="length"||h>=s)&&c.push(d)});else switch(r!==void 0&&c.push(u.get(r)),t){case"add":rr(e)?Uu(r)&&c.push(u.get("length")):(c.push(u.get(Qr)),jo(e)&&c.push(u.get(mu)));break;case"delete":rr(e)||(c.push(u.get(Qr)),jo(e)&&c.push(u.get(mu)));break;case"set":jo(e)&&c.push(u.get(Qr));break}if(c.length===1)c[0]&&vu(c[0]);else{const d=[];for(const h of c)h&&d.push(...h);vu(qu(d))}}function vu(e,t){const r=rr(e)?e:[...e];for(const s of r)s.computed&&Yd(s);for(const s of r)s.computed||Yd(s)}function Yd(e,t){(e!==Sn||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}const k2=g2("__proto__,__v_isRef,__isVue"),Tp=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Hu)),S2=va(),O2=va(!1,!0),R2=va(!0),T2=va(!0,!0),Jd=M2();function M2(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...r){const s=Ze(this);for(let l=0,u=this.length;l{e[t]=function(...r){ii();const s=Ze(this)[t].apply(this,r);return si(),s}}),e}function va(e=!1,t=!1){return function(s,o,l){if(o==="__v_isReactive")return!e;if(o==="__v_isReadonly")return e;if(o==="__v_isShallow")return t;if(o==="__v_raw"&&l===(e?t?Np:Dp:t?Bp:$p).get(s))return s;const u=rr(s);if(!e&&u&&pa(Jd,o))return Reflect.get(Jd,o,l);const c=Reflect.get(s,o,l);return(Hu(o)?Tp.has(o):k2(o))||(e||fn(s,"get",o),t)?c:vt(c)?u&&Uu(o)?c:c.value:ga(c)?e?Wp(c):oi(c):c}}const I2=Mp(),L2=Mp(!0);function Mp(e=!1){return function(r,s,o,l){let u=r[s];if(Ii(u)&&vt(u)&&!vt(o))return!1;if(!e&&(!Xo(o)&&!Ii(o)&&(u=Ze(u),o=Ze(o)),!rr(r)&&vt(u)&&!vt(o)))return u.value=o,!0;const c=rr(r)&&Uu(s)?Number(s)e,ya=e=>Reflect.getPrototypeOf(e);function Mo(e,t,r=!1,s=!1){e=e.__v_raw;const o=Ze(e),l=Ze(t);r||(t!==l&&fn(o,"get",t),fn(o,"get",l));const{has:u}=ya(o),c=s?Ku:r?zu:Os;if(u.call(o,t))return c(e.get(t));if(u.call(o,l))return c(e.get(l));e!==o&&e.get(t)}function Io(e,t=!1){const r=this.__v_raw,s=Ze(r),o=Ze(e);return t||(e!==o&&fn(s,"has",e),fn(s,"has",o)),e===o?r.has(e):r.has(e)||r.has(o)}function Lo(e,t=!1){return e=e.__v_raw,!t&&fn(Ze(e),"iterate",Qr),Reflect.get(e,"size",e)}function Xd(e){e=Ze(e);const t=Ze(this);return ya(t).has.call(t,e)||(t.add(e),sr(t,"add",e,e)),this}function Qd(e,t){t=Ze(t);const r=Ze(this),{has:s,get:o}=ya(r);let l=s.call(r,e);l||(e=Ze(e),l=s.call(r,e));const u=o.call(r,e);return r.set(e,t),l?ju(t,u)&&sr(r,"set",e,t):sr(r,"add",e,t),this}function eh(e){const t=Ze(this),{has:r,get:s}=ya(t);let o=r.call(t,e);o||(e=Ze(e),o=r.call(t,e)),s&&s.call(t,e);const l=t.delete(e);return o&&sr(t,"delete",e,void 0),l}function th(){const e=Ze(this),t=e.size!==0,r=e.clear();return t&&sr(e,"clear",void 0,void 0),r}function $o(e,t){return function(s,o){const l=this,u=l.__v_raw,c=Ze(u),d=t?Ku:e?zu:Os;return!e&&fn(c,"iterate",Qr),u.forEach((h,g)=>s.call(o,d(h),d(g),l))}}function Bo(e,t,r){return function(...s){const o=this.__v_raw,l=Ze(o),u=jo(l),c=e==="entries"||e===Symbol.iterator&&u,d=e==="keys"&&u,h=o[e](...s),g=r?Ku:t?zu:Os;return!t&&fn(l,"iterate",d?mu:Qr),{next(){const{value:m,done:p}=h.next();return p?{value:m,done:p}:{value:c?[g(m[0]),g(m[1])]:g(m),done:p}},[Symbol.iterator](){return this}}}}function vr(e){return function(...t){return e==="delete"?!1:this}}function F2(){const e={get(l){return Mo(this,l)},get size(){return Lo(this)},has:Io,add:Xd,set:Qd,delete:eh,clear:th,forEach:$o(!1,!1)},t={get(l){return Mo(this,l,!1,!0)},get size(){return Lo(this)},has:Io,add:Xd,set:Qd,delete:eh,clear:th,forEach:$o(!1,!0)},r={get(l){return Mo(this,l,!0)},get size(){return Lo(this,!0)},has(l){return Io.call(this,l,!0)},add:vr("add"),set:vr("set"),delete:vr("delete"),clear:vr("clear"),forEach:$o(!0,!1)},s={get(l){return Mo(this,l,!0,!0)},get size(){return Lo(this,!0)},has(l){return Io.call(this,l,!0)},add:vr("add"),set:vr("set"),delete:vr("delete"),clear:vr("clear"),forEach:$o(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(l=>{e[l]=Bo(l,!1,!1),r[l]=Bo(l,!0,!1),t[l]=Bo(l,!1,!0),s[l]=Bo(l,!0,!0)}),[e,r,t,s]}const[V2,H2,U2,j2]=F2();function _a(e,t){const r=t?e?j2:U2:e?H2:V2;return(s,o,l)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?s:Reflect.get(pa(r,o)&&o in s?r:s,o,l)}const q2={get:_a(!1,!1)},K2={get:_a(!1,!0)},z2={get:_a(!0,!1)},Z2={get:_a(!0,!0)},$p=new WeakMap,Bp=new WeakMap,Dp=new WeakMap,Np=new WeakMap;function G2(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Y2(e){return e.__v_skip||!Object.isExtensible(e)?0:G2(w2(e))}function oi(e){return Ii(e)?e:ba(e,!1,Ip,q2,$p)}function J2(e){return ba(e,!1,N2,K2,Bp)}function Wp(e){return ba(e,!0,Lp,z2,Dp)}function QE(e){return ba(e,!0,W2,Z2,Np)}function ba(e,t,r,s,o){if(!ga(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const l=o.get(e);if(l)return l;const u=Y2(e);if(u===0)return e;const c=new Proxy(e,u===2?s:r);return o.set(e,c),c}function kr(e){return Ii(e)?kr(e.__v_raw):!!(e&&e.__v_isReactive)}function Ii(e){return!!(e&&e.__v_isReadonly)}function Xo(e){return!!(e&&e.__v_isShallow)}function Fp(e){return kr(e)||Ii(e)}function Ze(e){const t=e&&e.__v_raw;return t?Ze(t):e}function Li(e){return A2(e,"__v_skip",!0),e}const Os=e=>ga(e)?oi(e):e,zu=e=>ga(e)?Wp(e):e;function Zu(e){Er&&Sn&&(e=Ze(e),Rp(e.dep||(e.dep=qu())))}function wa(e,t){e=Ze(e),e.dep&&vu(e.dep)}function vt(e){return!!(e&&e.__v_isRef===!0)}function $e(e){return Vp(e,!1)}function X2(e){return Vp(e,!0)}function Vp(e,t){return vt(e)?e:new Q2(e,t)}class Q2{constructor(t,r){this.__v_isShallow=r,this.dep=void 0,this.__v_isRef=!0,this._rawValue=r?t:Ze(t),this._value=r?t:Os(t)}get value(){return Zu(this),this._value}set value(t){const r=this.__v_isShallow||Xo(t)||Ii(t);t=r?t:Ze(t),ju(t,this._rawValue)&&(this._rawValue=t,this._value=r?t:Os(t),wa(this))}}function ek(e){wa(e)}function Q(e){return vt(e)?e.value:e}const eA={get:(e,t,r)=>Q(Reflect.get(e,t,r)),set:(e,t,r,s)=>{const o=e[t];return vt(o)&&!vt(r)?(o.value=r,!0):Reflect.set(e,t,r,s)}};function Hp(e){return kr(e)?e:new Proxy(e,eA)}class tA{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:r,set:s}=t(()=>Zu(this),()=>wa(this));this._get=r,this._set=s}get value(){return this._get()}set value(t){this._set(t)}}function tk(e){return new tA(e)}function nA(e){const t=rr(e)?new Array(e.length):{};for(const r in e)t[r]=iA(e,r);return t}class rA{constructor(t,r,s){this._object=t,this._key=r,this._defaultValue=s,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}}function iA(e,t,r){const s=e[t];return vt(s)?s:new rA(e,t,r)}var Up;class sA{constructor(t,r,s,o){this._setter=r,this.dep=void 0,this.__v_isRef=!0,this[Up]=!1,this._dirty=!0,this.effect=new ma(t,()=>{this._dirty||(this._dirty=!0,wa(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!o,this.__v_isReadonly=s}get value(){const t=Ze(this);return Zu(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}Up="__v_isReadonly";function oA(e,t,r=!1){let s,o;const l=y2(e);return l?(s=e,o=m2):(s=e.get,o=e.set),new sA(s,o,l||!o,r)}function jp(e,t){const r=Object.create(null),s=e.split(",");for(let o=0;o!!r[o.toLowerCase()]:o=>!!r[o]}const aA="Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt",lA=jp(aA);function Lr(e){if(He(e)){const t={};for(let r=0;r{if(r){const s=r.split(cA);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function it(e){let t="";if(St(e))t=e;else if(He(e))for(let r=0;rSt(e)?e:e==null?"":He(e)||At(e)&&(e.toString===Gp||!De(e.toString))?JSON.stringify(e,qp,2):String(e),qp=(e,t)=>t&&t.__v_isRef?qp(e,t.value):zp(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((r,[s,o])=>(r[`${s} =>`]=o,r),{})}:Zp(t)?{[`Set(${t.size})`]:[...t.values()]}:At(t)&&!He(t)&&!Yp(t)?String(t):t,at={},Si=[],Wn=()=>{},dA=()=>!1,hA=/^on[^a-z]/,Aa=e=>hA.test(e),Kp=e=>e.startsWith("onUpdate:"),en=Object.assign,Gu=(e,t)=>{const r=e.indexOf(t);r>-1&&e.splice(r,1)},pA=Object.prototype.hasOwnProperty,Qe=(e,t)=>pA.call(e,t),He=Array.isArray,zp=e=>Ju(e)==="[object Map]",Zp=e=>Ju(e)==="[object Set]",De=e=>typeof e=="function",St=e=>typeof e=="string",At=e=>e!==null&&typeof e=="object",Yu=e=>At(e)&&De(e.then)&&De(e.catch),Gp=Object.prototype.toString,Ju=e=>Gp.call(e),Yp=e=>Ju(e)==="[object Object]",_s=jp(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Pa=e=>{const t=Object.create(null);return r=>t[r]||(t[r]=e(r))},gA=/-(\w)/g,Fn=Pa(e=>e.replace(gA,(t,r)=>r?r.toUpperCase():"")),mA=/\B([A-Z])/g,xa=Pa(e=>e.replace(mA,"-$1").toLowerCase()),Xu=Pa(e=>e.charAt(0).toUpperCase()+e.slice(1)),qo=Pa(e=>e?`on${Xu(e)}`:""),yu=(e,t)=>!Object.is(e,t),bs=(e,t)=>{for(let r=0;r{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:r})},Jp=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let nh;const vA=()=>nh||(nh=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{}),ws=[];function yA(e,...t){ii();const r=ws.length?ws[ws.length-1].component:null,s=r&&r.appContext.config.warnHandler,o=_A();if(s)ir(s,r,11,[e+t.join(""),r&&r.proxy,o.map(({vnode:l})=>`at <${Og(r,l.type)}>`).join(`
`),o]);else{const l=[`[Vue warn]: ${e}`,...t];o.length&&l.push(`
-`,...wA(o)),console.warn(...l)}si()}function bA(){let e=ws[ws.length-1];if(!e)return[];const t=[];for(;e;){const r=t[0];r&&r.vnode===e?r.recurseCount++:t.push({vnode:e,recurseCount:0});const s=e.component&&e.component.parent;e=s&&s.vnode}return t}function wA(e){const t=[];return e.forEach((r,s)=>{t.push(...s===0?[]:[`
-`],...AA(r))}),t}function AA({vnode:e,recurseCount:t}){const r=t>0?`... (${t} recursive calls)`:"",s=e.component?e.component.parent==null:!1,o=` at <${Og(e.component,e.type,s)}`,l=">"+r;return e.props?[o,...PA(e.props),l]:[o+l]}function PA(e){const t=[],r=Object.keys(e);return r.slice(0,3).forEach(s=>{t.push(...Xp(s,e[s]))}),r.length>3&&t.push(" ..."),t}function Xp(e,t,r){return St(t)?(t=JSON.stringify(t),r?t:[`${e}=${t}`]):typeof t=="number"||typeof t=="boolean"||t==null?r?t:[`${e}=${t}`]:vt(t)?(t=Xp(e,Ze(t.value),!0),r?t:[`${e}=Ref<`,t,">"]):De(t)?[`${e}=fn${t.name?`<${t.name}>`:""}`]:(t=Ze(t),r?t:[`${e}=`,t])}function ir(e,t,r,s){let o;try{o=s?e(...s):e()}catch(l){Hi(l,t,r)}return o}function An(e,t,r,s){if(De(e)){const l=ir(e,t,r,s);return l&&Yu(l)&&l.catch(u=>{Hi(u,t,r)}),l}const o=[];for(let l=0;l>>1;Ts($t[s])Bn&&$t.splice(t,1)}function tg(e){He(e)?Oi.push(...e):(!er||!er.includes(e,e.allowRecurse?Yr+1:Yr))&&Oi.push(e),eg()}function rh(e,t=Rs?Bn+1:0){for(;t<$t.length;t++){const r=$t[t];r&&r.pre&&($t.splice(t,1),t--,r())}}function Qo(e){if(Oi.length){const t=[...new Set(Oi)];if(Oi.length=0,er){er.push(...t);return}for(er=t,er.sort((r,s)=>Ts(r)-Ts(s)),Yr=0;Yre.id==null?1/0:e.id,kA=(e,t)=>{const r=Ts(e)-Ts(t);if(r===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return r};function ng(e){bu=!1,Rs=!0,$t.sort(kA);const t=Wn;try{for(Bn=0;Bn<$t.length;Bn++){const r=$t[Bn];r&&r.active!==!1&&ir(r,null,14)}}finally{Bn=0,$t.length=0,Qo(),Rs=!1,Qu=null,($t.length||Oi.length)&&ng()}}let is,Do=[];function SA(e,t){var r,s;is=e,is?(is.enabled=!0,Do.forEach(({event:o,args:l})=>is.emit(o,...l)),Do=[]):typeof window<"u"&&window.HTMLElement&&!(!((s=(r=window.navigator)===null||r===void 0?void 0:r.userAgent)===null||s===void 0)&&s.includes("jsdom"))?((t.__VUE_DEVTOOLS_HOOK_REPLAY__=t.__VUE_DEVTOOLS_HOOK_REPLAY__||[]).push(l=>{SA(l,t)}),setTimeout(()=>{is||(t.__VUE_DEVTOOLS_HOOK_REPLAY__=null,Do=[])},3e3)):Do=[]}function OA(e,t,...r){if(e.isUnmounted)return;const s=e.vnode.props||at;let o=r;const l=t.startsWith("update:"),u=l&&t.slice(7);if(u&&u in s){const g=`${u==="modelValue"?"model":u}Modifiers`,{number:m,trim:p}=s[g]||at;p&&(o=r.map(x=>x.trim())),m&&(o=r.map(Jp))}let c,d=s[c=qo(t)]||s[c=qo(Fn(t))];!d&&l&&(d=s[c=qo(xa(t))]),d&&An(d,e,6,o);const h=s[c+"Once"];if(h){if(!e.emitted)e.emitted={};else if(e.emitted[c])return;e.emitted[c]=!0,An(h,e,6,o)}}function rg(e,t,r=!1){const s=t.emitsCache,o=s.get(e);if(o!==void 0)return o;const l=e.emits;let u={},c=!1;if(!De(e)){const d=h=>{const g=rg(h,t,!0);g&&(c=!0,en(u,g))};!r&&t.mixins.length&&t.mixins.forEach(d),e.extends&&d(e.extends),e.mixins&&e.mixins.forEach(d)}return!l&&!c?(At(e)&&s.set(e,null),null):(He(l)?l.forEach(d=>u[d]=null):en(u,l),At(e)&&s.set(e,u),u)}function Ea(e,t){return!e||!Aa(t)?!1:(t=t.slice(2).replace(/Once$/,""),Qe(e,t[0].toLowerCase()+t.slice(1))||Qe(e,xa(t))||Qe(e,t))}let Bt=null,ka=null;function Ms(e){const t=Bt;return Bt=e,ka=e&&e.type.__scopeId||null,t}function Sa(e){ka=e}function Oa(){ka=null}const rk=e=>Ht;function Ht(e,t=Bt,r){if(!t||e._n)return e;const s=(...o)=>{s._d&&mh(-1);const l=Ms(t),u=e(...o);return Ms(l),s._d&&mh(1),u};return s._n=!0,s._c=!0,s._d=!0,s}function Ko(e){const{type:t,vnode:r,proxy:s,withProxy:o,props:l,propsOptions:[u],slots:c,attrs:d,emit:h,render:g,renderCache:m,data:p,setupState:x,ctx:E,inheritAttrs:B}=e;let $,k;const y=Ms(e);try{if(r.shapeFlag&4){const W=o||s;$=cn(g.call(W,W,m,l,x,p,E)),k=d}else{const W=t;$=cn(W.length>1?W(l,{attrs:d,slots:c,emit:h}):W(l,null)),k=t.props?d:TA(d)}}catch(W){Ps.length=0,Hi(W,e,1),$=ge(jt)}let O=$;if(k&&B!==!1){const W=Object.keys(k),{shapeFlag:U}=O;W.length&&U&7&&(u&&W.some(Kp)&&(k=MA(k,u)),O=or(O,k))}return r.dirs&&(O=or(O),O.dirs=O.dirs?O.dirs.concat(r.dirs):r.dirs),r.transition&&(O.transition=r.transition),$=O,Ms(y),$}function RA(e){let t;for(let r=0;r{let t;for(const r in e)(r==="class"||r==="style"||Aa(r))&&((t||(t={}))[r]=e[r]);return t},MA=(e,t)=>{const r={};for(const s in e)(!Kp(s)||!(s.slice(9)in t))&&(r[s]=e[s]);return r};function IA(e,t,r){const{props:s,children:o,component:l}=e,{props:u,children:c,patchFlag:d}=t,h=l.emitsOptions;if(t.dirs||t.transition)return!0;if(r&&d>=0){if(d&1024)return!0;if(d&16)return s?ih(s,u,h):!!u;if(d&8){const g=t.dynamicProps;for(let m=0;me.__isSuspense,LA={name:"Suspense",__isSuspense:!0,process(e,t,r,s,o,l,u,c,d,h){e==null?$A(t,r,s,o,l,u,c,d,h):BA(e,t,r,s,o,u,c,d,h)},hydrate:DA,create:tc,normalize:NA},ik=LA;function Is(e,t){const r=e.props&&e.props[t];De(r)&&r()}function $A(e,t,r,s,o,l,u,c,d){const{p:h,o:{createElement:g}}=d,m=g("div"),p=e.suspense=tc(e,o,s,t,m,r,l,u,c,d);h(null,p.pendingBranch=e.ssContent,m,null,s,p,l,u),p.deps>0?(Is(e,"onPending"),Is(e,"onFallback"),h(null,e.ssFallback,t,r,s,null,l,u),Ri(p,e.ssFallback)):p.resolve()}function BA(e,t,r,s,o,l,u,c,{p:d,um:h,o:{createElement:g}}){const m=t.suspense=e.suspense;m.vnode=t,t.el=e.el;const p=t.ssContent,x=t.ssFallback,{activeBranch:E,pendingBranch:B,isInFallback:$,isHydrating:k}=m;if(B)m.pendingBranch=p,Dn(p,B)?(d(B,p,m.hiddenContainer,null,o,m,l,u,c),m.deps<=0?m.resolve():$&&(d(E,x,r,s,o,null,l,u,c),Ri(m,x))):(m.pendingId++,k?(m.isHydrating=!1,m.activeBranch=B):h(B,o,m),m.deps=0,m.effects.length=0,m.hiddenContainer=g("div"),$?(d(null,p,m.hiddenContainer,null,o,m,l,u,c),m.deps<=0?m.resolve():(d(E,x,r,s,o,null,l,u,c),Ri(m,x))):E&&Dn(p,E)?(d(E,p,r,s,o,m,l,u,c),m.resolve(!0)):(d(null,p,m.hiddenContainer,null,o,m,l,u,c),m.deps<=0&&m.resolve()));else if(E&&Dn(p,E))d(E,p,r,s,o,m,l,u,c),Ri(m,p);else if(Is(t,"onPending"),m.pendingBranch=p,m.pendingId++,d(null,p,m.hiddenContainer,null,o,m,l,u,c),m.deps<=0)m.resolve();else{const{timeout:y,pendingId:O}=m;y>0?setTimeout(()=>{m.pendingId===O&&m.fallback(x)},y):y===0&&m.fallback(x)}}function tc(e,t,r,s,o,l,u,c,d,h,g=!1){const{p:m,m:p,um:x,n:E,o:{parentNode:B,remove:$}}=h,k=Jp(e.props&&e.props.timeout),y={vnode:e,parent:t,parentComponent:r,isSVG:u,container:s,hiddenContainer:o,anchor:l,deps:0,pendingId:0,timeout:typeof k=="number"?k:-1,activeBranch:null,pendingBranch:null,isInFallback:!0,isHydrating:g,isUnmounted:!1,effects:[],resolve(O=!1){const{vnode:W,activeBranch:U,pendingBranch:z,pendingId:H,effects:I,parentComponent:q,container:Z}=y;if(y.isHydrating)y.isHydrating=!1;else if(!O){const T=U&&z.transition&&z.transition.mode==="out-in";T&&(U.transition.afterLeave=()=>{H===y.pendingId&&p(z,Z,L,0)});let{anchor:L}=y;U&&(L=E(U),x(U,q,y,!0)),T||p(z,Z,L,0)}Ri(y,z),y.pendingBranch=null,y.isInFallback=!1;let V=y.parent,w=!1;for(;V;){if(V.pendingBranch){V.effects.push(...I),w=!0;break}V=V.parent}w||tg(I),y.effects=[],Is(W,"onResolve")},fallback(O){if(!y.pendingBranch)return;const{vnode:W,activeBranch:U,parentComponent:z,container:H,isSVG:I}=y;Is(W,"onFallback");const q=E(U),Z=()=>{y.isInFallback&&(m(null,O,H,q,z,null,I,c,d),Ri(y,O))},V=O.transition&&O.transition.mode==="out-in";V&&(U.transition.afterLeave=Z),y.isInFallback=!0,x(U,z,null,!0),V||Z()},move(O,W,U){y.activeBranch&&p(y.activeBranch,O,W,U),y.container=O},next(){return y.activeBranch&&E(y.activeBranch)},registerDep(O,W){const U=!!y.pendingBranch;U&&y.deps++;const z=O.vnode.el;O.asyncDep.catch(H=>{Hi(H,O,0)}).then(H=>{if(O.isUnmounted||y.isUnmounted||y.pendingId!==O.suspenseId)return;O.asyncResolved=!0;const{vnode:I}=O;ku(O,H,!1),z&&(I.el=z);const q=!z&&O.subTree.el;W(O,I,B(z||O.subTree.el),z?null:E(O.subTree),y,u,d),q&&$(q),ec(O,I.el),U&&--y.deps===0&&y.resolve()})},unmount(O,W){y.isUnmounted=!0,y.activeBranch&&x(y.activeBranch,r,O,W),y.pendingBranch&&x(y.pendingBranch,r,O,W)}};return y}function DA(e,t,r,s,o,l,u,c,d){const h=t.suspense=tc(t,s,r,e.parentNode,document.createElement("div"),null,o,l,u,c,!0),g=d(e,h.pendingBranch=t.ssContent,r,h,l,u);return h.deps===0&&h.resolve(),g}function NA(e){const{shapeFlag:t,children:r}=e,s=t&32;e.ssContent=sh(s?r.default:r),e.ssFallback=s?sh(r.fallback):ge(jt)}function sh(e){let t;if(De(e)){const r=ti&&e._c;r&&(e._d=!1,pe()),e=e(),r&&(e._d=!0,t=Jt,wg())}return He(e)&&(e=RA(e)),e=cn(e),t&&!e.dynamicChildren&&(e.dynamicChildren=t.filter(r=>r!==e)),e}function sg(e,t){t&&t.pendingBranch?He(e)?t.effects.push(...e):t.effects.push(e):tg(e)}function Ri(e,t){e.activeBranch=t;const{vnode:r,parentComponent:s}=e,o=r.el=t.el;s&&s.subTree===r&&(s.vnode.el=o,ec(s,o))}function Cr(e,t){if(Et){let r=Et.provides;const s=Et.parent&&Et.parent.provides;s===r&&(r=Et.provides=Object.create(s)),r[e]=t}}function Xt(e,t,r=!1){const s=Et||Bt;if(s){const o=s.parent==null?s.vnode.appContext&&s.vnode.appContext.provides:s.parent.provides;if(o&&e in o)return o[e];if(arguments.length>1)return r&&De(t)?t.call(s.proxy):t}}function sk(e,t){return Ns(e,null,t)}function WA(e,t){return Ns(e,null,{flush:"post"})}function ok(e,t){return Ns(e,null,{flush:"sync"})}const oh={};function ht(e,t,r){return Ns(e,t,r)}function Ns(e,t,{immediate:r,deep:s,flush:o,onTrack:l,onTrigger:u}=at){const c=Et;let d,h=!1,g=!1;if(vt(e)?(d=()=>e.value,h=Xo(e)):kr(e)?(d=()=>e,s=!0):He(e)?(g=!0,h=e.some(k=>kr(k)||Xo(k)),d=()=>e.map(k=>{if(vt(k))return k.value;if(kr(k))return Xr(k);if(De(k))return ir(k,c,2)})):De(e)?t?d=()=>ir(e,c,2):d=()=>{if(!(c&&c.isUnmounted))return m&&m(),An(e,c,3,[p])}:d=Wn,t&&s){const k=d;d=()=>Xr(k())}let m,p=k=>{m=$.onStop=()=>{ir(k,c,4)}};if(Di)return p=Wn,t?r&&An(t,c,3,[d(),g?[]:void 0,p]):d(),Wn;let x=g?[]:oh;const E=()=>{if($.active)if(t){const k=$.run();(s||h||(g?k.some((y,O)=>yu(y,x[O])):yu(k,x)))&&(m&&m(),An(t,c,3,[k,x===oh?void 0:x,p]),x=k)}else $.run()};E.allowRecurse=!!t;let B;o==="sync"?B=E:o==="post"?B=()=>Mt(E,c&&c.suspense):(E.pre=!0,c&&(E.id=c.uid),B=()=>Ca(E));const $=new ma(d,B);return t?r?E():x=$.run():o==="post"?Mt($.run.bind($),c&&c.suspense):$.run(),()=>{$.stop(),c&&c.scope&&Gu(c.scope.effects,$)}}function FA(e,t,r){const s=this.proxy,o=St(e)?e.includes(".")?og(s,e):()=>s[e]:e.bind(s,s);let l;De(t)?l=t:(l=t.handler,r=t);const u=Et;Tr(this);const c=Ns(o,l.bind(s),r);return u?Tr(u):Sr(),c}function og(e,t){const r=t.split(".");return()=>{let s=e;for(let o=0;o{Xr(r,t)});else if(Yp(e))for(const r in e)Xr(e[r],t);return e}function ag(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Ut(()=>{e.isMounted=!0}),Ta(()=>{e.isUnmounting=!0}),e}const wn=[Function,Array],VA={name:"BaseTransition",props:{mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:wn,onEnter:wn,onAfterEnter:wn,onEnterCancelled:wn,onBeforeLeave:wn,onLeave:wn,onAfterLeave:wn,onLeaveCancelled:wn,onBeforeAppear:wn,onAppear:wn,onAfterAppear:wn,onAppearCancelled:wn},setup(e,{slots:t}){const r=Br(),s=ag();let o;return()=>{const l=t.default&&nc(t.default(),!0);if(!l||!l.length)return;let u=l[0];if(l.length>1){for(const B of l)if(B.type!==jt){u=B;break}}const c=Ze(e),{mode:d}=c;if(s.isLeaving)return nu(u);const h=ah(u);if(!h)return nu(u);const g=Ls(h,c,s,r);$i(h,g);const m=r.subTree,p=m&&ah(m);let x=!1;const{getTransitionKey:E}=h.type;if(E){const B=E();o===void 0?o=B:B!==o&&(o=B,x=!0)}if(p&&p.type!==jt&&(!Dn(h,p)||x)){const B=Ls(p,c,s,r);if($i(p,B),d==="out-in")return s.isLeaving=!0,B.afterLeave=()=>{s.isLeaving=!1,r.update()},nu(u);d==="in-out"&&h.type!==jt&&(B.delayLeave=($,k,y)=>{const O=ug(s,p);O[String(p.key)]=p,$._leaveCb=()=>{k(),$._leaveCb=void 0,delete g.delayedLeave},g.delayedLeave=y})}return u}}},lg=VA;function ug(e,t){const{leavingVNodes:r}=e;let s=r.get(t.type);return s||(s=Object.create(null),r.set(t.type,s)),s}function Ls(e,t,r,s){const{appear:o,mode:l,persisted:u=!1,onBeforeEnter:c,onEnter:d,onAfterEnter:h,onEnterCancelled:g,onBeforeLeave:m,onLeave:p,onAfterLeave:x,onLeaveCancelled:E,onBeforeAppear:B,onAppear:$,onAfterAppear:k,onAppearCancelled:y}=t,O=String(e.key),W=ug(r,e),U=(I,q)=>{I&&An(I,s,9,q)},z=(I,q)=>{const Z=q[1];U(I,q),He(I)?I.every(V=>V.length<=1)&&Z():I.length<=1&&Z()},H={mode:l,persisted:u,beforeEnter(I){let q=c;if(!r.isMounted)if(o)q=B||c;else return;I._leaveCb&&I._leaveCb(!0);const Z=W[O];Z&&Dn(e,Z)&&Z.el._leaveCb&&Z.el._leaveCb(),U(q,[I])},enter(I){let q=d,Z=h,V=g;if(!r.isMounted)if(o)q=$||d,Z=k||h,V=y||g;else return;let w=!1;const T=I._enterCb=L=>{w||(w=!0,L?U(V,[I]):U(Z,[I]),H.delayedLeave&&H.delayedLeave(),I._enterCb=void 0)};q?z(q,[I,T]):T()},leave(I,q){const Z=String(e.key);if(I._enterCb&&I._enterCb(!0),r.isUnmounting)return q();U(m,[I]);let V=!1;const w=I._leaveCb=T=>{V||(V=!0,q(),T?U(E,[I]):U(x,[I]),I._leaveCb=void 0,W[Z]===e&&delete W[Z])};W[Z]=e,p?z(p,[I,w]):w()},clone(I){return Ls(I,t,r,s)}};return H}function nu(e){if(Ws(e))return e=or(e),e.children=null,e}function ah(e){return Ws(e)?e.children?e.children[0]:void 0:e}function $i(e,t){e.shapeFlag&6&&e.component?$i(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function nc(e,t=!1,r){let s=[],o=0;for(let l=0;l1)for(let l=0;l!!e.type.__asyncLoader;function ak(e){De(e)&&(e={loader:e});const{loader:t,loadingComponent:r,errorComponent:s,delay:o=200,timeout:l,suspensible:u=!0,onError:c}=e;let d=null,h,g=0;const m=()=>(g++,d=null,p()),p=()=>{let x;return d||(x=d=t().catch(E=>{if(E=E instanceof Error?E:new Error(String(E)),c)return new Promise((B,$)=>{c(E,()=>B(m()),()=>$(E),g+1)});throw E}).then(E=>x!==d&&d?d:(E&&(E.__esModule||E[Symbol.toStringTag]==="Module")&&(E=E.default),h=E,E)))};return ct({name:"AsyncComponentWrapper",__asyncLoader:p,get __asyncResolved(){return h},setup(){const x=Et;if(h)return()=>ru(h,x);const E=y=>{d=null,Hi(y,x,13,!s)};if(u&&x.suspense||Di)return p().then(y=>()=>ru(y,x)).catch(y=>(E(y),()=>s?ge(s,{error:y}):null));const B=$e(!1),$=$e(),k=$e(!!o);return o&&setTimeout(()=>{k.value=!1},o),l!=null&&setTimeout(()=>{if(!B.value&&!$.value){const y=new Error(`Async component timed out after ${l}ms.`);E(y),$.value=y}},l),p().then(()=>{B.value=!0,x.parent&&Ws(x.parent.vnode)&&Ca(x.parent.update)}).catch(y=>{E(y),$.value=y}),()=>{if(B.value&&h)return ru(h,x);if($.value&&s)return ge(s,{error:$.value});if(r&&!k.value)return ge(r)}}})}function ru(e,{vnode:{ref:t,props:r,children:s,shapeFlag:o},parent:l}){const u=ge(e,r,s);return u.ref=t,u}const Ws=e=>e.type.__isKeepAlive,HA={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){const r=Br(),s=r.ctx;if(!s.renderer)return()=>{const y=t.default&&t.default();return y&&y.length===1?y[0]:y};const o=new Map,l=new Set;let u=null;const c=r.suspense,{renderer:{p:d,m:h,um:g,o:{createElement:m}}}=s,p=m("div");s.activate=(y,O,W,U,z)=>{const H=y.component;h(y,O,W,0,c),d(H.vnode,y,O,W,H,c,U,y.slotScopeIds,z),Mt(()=>{H.isDeactivated=!1,H.a&&bs(H.a);const I=y.props&&y.props.onVnodeMounted;I&&Yt(I,H.parent,y)},c)},s.deactivate=y=>{const O=y.component;h(y,p,null,1,c),Mt(()=>{O.da&&bs(O.da);const W=y.props&&y.props.onVnodeUnmounted;W&&Yt(W,O.parent,y),O.isDeactivated=!0},c)};function x(y){iu(y),g(y,r,c,!0)}function E(y){o.forEach((O,W)=>{const U=oa(O.type);U&&(!y||!y(U))&&B(W)})}function B(y){const O=o.get(y);!u||O.type!==u.type?x(O):u&&iu(u),o.delete(y),l.delete(y)}ht(()=>[e.include,e.exclude],([y,O])=>{y&&E(W=>hs(y,W)),O&&E(W=>!hs(O,W))},{flush:"post",deep:!0});let $=null;const k=()=>{$!=null&&o.set($,su(r.subTree))};return Ut(k),rc(k),Ta(()=>{o.forEach(y=>{const{subTree:O,suspense:W}=r,U=su(O);if(y.type===U.type){iu(U);const z=U.component.da;z&&Mt(z,W);return}x(y)})}),()=>{if($=null,!t.default)return null;const y=t.default(),O=y[0];if(y.length>1)return u=null,y;if(!Rr(O)||!(O.shapeFlag&4)&&!(O.shapeFlag&128))return u=null,O;let W=su(O);const U=W.type,z=oa(ei(W)?W.type.__asyncResolved||{}:U),{include:H,exclude:I,max:q}=e;if(H&&(!z||!hs(H,z))||I&&z&&hs(I,z))return u=W,O;const Z=W.key==null?U:W.key,V=o.get(Z);return W.el&&(W=or(W),O.shapeFlag&128&&(O.ssContent=W)),$=Z,V?(W.el=V.el,W.component=V.component,W.transition&&$i(W,W.transition),W.shapeFlag|=512,l.delete(Z),l.add(Z)):(l.add(Z),q&&l.size>parseInt(q,10)&&B(l.values().next().value)),W.shapeFlag|=256,u=W,ig(O.type)?O:W}}},lk=HA;function hs(e,t){return He(e)?e.some(r=>hs(r,t)):St(e)?e.split(",").includes(t):e.test?e.test(t):!1}function UA(e,t){cg(e,"a",t)}function jA(e,t){cg(e,"da",t)}function cg(e,t,r=Et){const s=e.__wdc||(e.__wdc=()=>{let o=r;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(Ra(t,s,r),r){let o=r.parent;for(;o&&o.parent;)Ws(o.parent.vnode)&&qA(s,t,r,o),o=o.parent}}function qA(e,t,r,s){const o=Ra(t,e,s,!0);ic(()=>{Gu(s[t],o)},r)}function iu(e){let t=e.shapeFlag;t&256&&(t-=256),t&512&&(t-=512),e.shapeFlag=t}function su(e){return e.shapeFlag&128?e.ssContent:e}function Ra(e,t,r=Et,s=!1){if(r){const o=r[e]||(r[e]=[]),l=t.__weh||(t.__weh=(...u)=>{if(r.isUnmounted)return;ii(),Tr(r);const c=An(t,r,e,u);return Sr(),si(),c});return s?o.unshift(l):o.push(l),l}}const ar=e=>(t,r=Et)=>(!Di||e==="sp")&&Ra(e,(...s)=>t(...s),r),KA=ar("bm"),Ut=ar("m"),zA=ar("bu"),rc=ar("u"),Ta=ar("bum"),ic=ar("um"),ZA=ar("sp"),GA=ar("rtg"),YA=ar("rtc");function JA(e,t=Et){Ra("ec",e,t)}function ea(e,t){const r=Bt;if(r===null)return e;const s=La(r)||r.proxy,o=e.dirs||(e.dirs=[]);for(let l=0;lt(u,c,void 0,l&&l[c]));else{const u=Object.keys(e);o=new Array(u.length);for(let c=0,d=u.length;c{const l=s.fn(...o);return l&&(l.key=s.key),l}:s.fn)}return e}function ta(e,t,r={},s,o){if(Bt.isCE||Bt.parent&&ei(Bt.parent)&&Bt.parent.isCE)return ge("slot",t==="default"?null:{name:t},s&&s());let l=e[t];l&&l._c&&(l._d=!1),pe();const u=l&&dg(l(r)),c=ut(st,{key:r.key||u&&u.key||`_${t}`},u||(s?s():[]),u&&e._===1?64:-2);return!o&&c.scopeId&&(c.slotScopeIds=[c.scopeId+"-s"]),l&&l._c&&(l._d=!0),c}function dg(e){return e.some(t=>Rr(t)?!(t.type===jt||t.type===st&&!dg(t.children)):!0)?e:null}function dk(e,t){const r={};for(const s in e)r[t&&/[A-Z]/.test(s)?`on:${s}`:qo(s)]=e[s];return r}const wu=e=>e?Cg(e)?La(e)||e.proxy:wu(e.parent):null,na=en(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>wu(e.parent),$root:e=>wu(e.root),$emit:e=>e.emit,$options:e=>ac(e),$forceUpdate:e=>e.f||(e.f=()=>Ca(e.update)),$nextTick:e=>e.n||(e.n=$r.bind(e.proxy)),$watch:e=>FA.bind(e)}),Au={get({_:e},t){const{ctx:r,setupState:s,data:o,props:l,accessCache:u,type:c,appContext:d}=e;let h;if(t[0]!=="$"){const x=u[t];if(x!==void 0)switch(x){case 1:return s[t];case 2:return o[t];case 4:return r[t];case 3:return l[t]}else{if(s!==at&&Qe(s,t))return u[t]=1,s[t];if(o!==at&&Qe(o,t))return u[t]=2,o[t];if((h=e.propsOptions[0])&&Qe(h,t))return u[t]=3,l[t];if(r!==at&&Qe(r,t))return u[t]=4,r[t];Pu&&(u[t]=0)}}const g=na[t];let m,p;if(g)return t==="$attrs"&&fn(e,"get",t),g(e);if((m=c.__cssModules)&&(m=m[t]))return m;if(r!==at&&Qe(r,t))return u[t]=4,r[t];if(p=d.config.globalProperties,Qe(p,t))return p[t]},set({_:e},t,r){const{data:s,setupState:o,ctx:l}=e;return o!==at&&Qe(o,t)?(o[t]=r,!0):s!==at&&Qe(s,t)?(s[t]=r,!0):Qe(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(l[t]=r,!0)},has({_:{data:e,setupState:t,accessCache:r,ctx:s,appContext:o,propsOptions:l}},u){let c;return!!r[u]||e!==at&&Qe(e,u)||t!==at&&Qe(t,u)||(c=l[0])&&Qe(c,u)||Qe(s,u)||Qe(na,u)||Qe(o.config.globalProperties,u)},defineProperty(e,t,r){return r.get!=null?e._.accessCache[t]=0:Qe(r,"value")&&this.set(e,t,r.value,null),Reflect.defineProperty(e,t,r)}},QA=en({},Au,{get(e,t){if(t!==Symbol.unscopables)return Au.get(e,t,e)},has(e,t){return t[0]!=="_"&&!uA(t)}});let Pu=!0;function e5(e){const t=ac(e),r=e.proxy,s=e.ctx;Pu=!1,t.beforeCreate&&uh(t.beforeCreate,e,"bc");const{data:o,computed:l,methods:u,watch:c,provide:d,inject:h,created:g,beforeMount:m,mounted:p,beforeUpdate:x,updated:E,activated:B,deactivated:$,beforeDestroy:k,beforeUnmount:y,destroyed:O,unmounted:W,render:U,renderTracked:z,renderTriggered:H,errorCaptured:I,serverPrefetch:q,expose:Z,inheritAttrs:V,components:w,directives:T,filters:L}=t;if(h&&t5(h,s,null,e.appContext.config.unwrapInjectedRef),u)for(const F in u){const R=u[F];De(R)&&(s[F]=R.bind(r))}if(o){const F=o.call(r,r);At(F)&&(e.data=oi(F))}if(Pu=!0,l)for(const F in l){const R=l[F],b=De(R)?R.bind(r,r):De(R.get)?R.get.bind(r,r):Wn,Y=!De(R)&&De(R.set)?R.set.bind(r):Wn,se=Ge({get:b,set:Y});Object.defineProperty(s,F,{enumerable:!0,configurable:!0,get:()=>se.value,set:me=>se.value=me})}if(c)for(const F in c)hg(c[F],s,r,F);if(d){const F=De(d)?d.call(r):d;Reflect.ownKeys(F).forEach(R=>{Cr(R,F[R])})}g&&uh(g,e,"c");function A(F,R){He(R)?R.forEach(b=>F(b.bind(r))):R&&F(R.bind(r))}if(A(KA,m),A(Ut,p),A(zA,x),A(rc,E),A(UA,B),A(jA,$),A(JA,I),A(YA,z),A(GA,H),A(Ta,y),A(ic,W),A(ZA,q),He(Z))if(Z.length){const F=e.exposed||(e.exposed={});Z.forEach(R=>{Object.defineProperty(F,R,{get:()=>r[R],set:b=>r[R]=b})})}else e.exposed||(e.exposed={});U&&e.render===Wn&&(e.render=U),V!=null&&(e.inheritAttrs=V),w&&(e.components=w),T&&(e.directives=T)}function t5(e,t,r=Wn,s=!1){He(e)&&(e=xu(e));for(const o in e){const l=e[o];let u;At(l)?"default"in l?u=Xt(l.from||o,l.default,!0):u=Xt(l.from||o):u=Xt(l),vt(u)&&s?Object.defineProperty(t,o,{enumerable:!0,configurable:!0,get:()=>u.value,set:c=>u.value=c}):t[o]=u}}function uh(e,t,r){An(He(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,r)}function hg(e,t,r,s){const o=s.includes(".")?og(r,s):()=>r[s];if(St(e)){const l=t[e];De(l)&&ht(o,l)}else if(De(e))ht(o,e.bind(r));else if(At(e))if(He(e))e.forEach(l=>hg(l,t,r,s));else{const l=De(e.handler)?e.handler.bind(r):t[e.handler];De(l)&&ht(o,l,e)}}function ac(e){const t=e.type,{mixins:r,extends:s}=t,{mixins:o,optionsCache:l,config:{optionMergeStrategies:u}}=e.appContext,c=l.get(t);let d;return c?d=c:!o.length&&!r&&!s?d=t:(d={},o.length&&o.forEach(h=>ra(d,h,u,!0)),ra(d,t,u)),At(t)&&l.set(t,d),d}function ra(e,t,r,s=!1){const{mixins:o,extends:l}=t;l&&ra(e,l,r,!0),o&&o.forEach(u=>ra(e,u,r,!0));for(const u in t)if(!(s&&u==="expose")){const c=n5[u]||r&&r[u];e[u]=c?c(e[u],t[u]):t[u]}return e}const n5={data:ch,props:Gr,emits:Gr,methods:Gr,computed:Gr,beforeCreate:Vt,created:Vt,beforeMount:Vt,mounted:Vt,beforeUpdate:Vt,updated:Vt,beforeDestroy:Vt,beforeUnmount:Vt,destroyed:Vt,unmounted:Vt,activated:Vt,deactivated:Vt,errorCaptured:Vt,serverPrefetch:Vt,components:Gr,directives:Gr,watch:i5,provide:ch,inject:r5};function ch(e,t){return t?e?function(){return en(De(e)?e.call(this,this):e,De(t)?t.call(this,this):t)}:t:e}function r5(e,t){return Gr(xu(e),xu(t))}function xu(e){if(He(e)){const t={};for(let r=0;r0)&&!(u&16)){if(u&8){const g=e.vnode.dynamicProps;for(let m=0;m{d=!0;const[p,x]=gg(m,t,!0);en(u,p),x&&c.push(...x)};!r&&t.mixins.length&&t.mixins.forEach(g),e.extends&&g(e.extends),e.mixins&&e.mixins.forEach(g)}if(!l&&!d)return At(e)&&s.set(e,Si),Si;if(He(l))for(let g=0;g-1,x[1]=B<0||E-1||Qe(x,"default"))&&c.push(m)}}}const h=[u,c];return At(e)&&s.set(e,h),h}function fh(e){return e[0]!=="$"}function dh(e){const t=e&&e.toString().match(/^\s*function (\w+)/);return t?t[1]:e===null?"null":""}function hh(e,t){return dh(e)===dh(t)}function ph(e,t){return He(t)?t.findIndex(r=>hh(r,e)):De(t)&&hh(t,e)?0:-1}const mg=e=>e[0]==="_"||e==="$stable",lc=e=>He(e)?e.map(cn):[cn(e)],a5=(e,t,r)=>{if(t._n)return t;const s=Ht((...o)=>lc(t(...o)),r);return s._c=!1,s},vg=(e,t,r)=>{const s=e._ctx;for(const o in e){if(mg(o))continue;const l=e[o];if(De(l))t[o]=a5(o,l,s);else if(l!=null){const u=lc(l);t[o]=()=>u}}},yg=(e,t)=>{const r=lc(t);e.slots.default=()=>r},l5=(e,t)=>{if(e.vnode.shapeFlag&32){const r=t._;r?(e.slots=Ze(t),_u(t,"_",r)):vg(t,e.slots={})}else e.slots={},t&&yg(e,t);_u(e.slots,Ma,1)},u5=(e,t,r)=>{const{vnode:s,slots:o}=e;let l=!0,u=at;if(s.shapeFlag&32){const c=t._;c?r&&c===1?l=!1:(en(o,t),!r&&c===1&&delete o._):(l=!t.$stable,vg(t,o)),u=t}else t&&(yg(e,t),u={default:1});if(l)for(const c in o)!mg(c)&&!(c in u)&&delete o[c]};function _g(){return{app:null,config:{isNativeTag:hA,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let c5=0;function f5(e,t){return function(s,o=null){De(s)||(s=Object.assign({},s)),o!=null&&!At(o)&&(o=null);const l=_g(),u=new Set;let c=!1;const d=l.app={_uid:c5++,_component:s,_props:o,_container:null,_context:l,_instance:null,version:T5,get config(){return l.config},set config(h){},use(h,...g){return u.has(h)||(h&&De(h.install)?(u.add(h),h.install(d,...g)):De(h)&&(u.add(h),h(d,...g))),d},mixin(h){return l.mixins.includes(h)||l.mixins.push(h),d},component(h,g){return g?(l.components[h]=g,d):l.components[h]},directive(h,g){return g?(l.directives[h]=g,d):l.directives[h]},mount(h,g,m){if(!c){const p=ge(s,o);return p.appContext=l,g&&t?t(p,h):e(p,h,m),c=!0,d._container=h,h.__vue_app__=d,La(p.component)||p.component.proxy}},unmount(){c&&(e(null,d._container),delete d._container.__vue_app__)},provide(h,g){return l.provides[h]=g,d}};return d}}function ia(e,t,r,s,o=!1){if(He(e)){e.forEach((p,x)=>ia(p,t&&(He(t)?t[x]:t),r,s,o));return}if(ei(s)&&!o)return;const l=s.shapeFlag&4?La(s.component)||s.component.proxy:s.el,u=o?null:l,{i:c,r:d}=e,h=t&&t.r,g=c.refs===at?c.refs={}:c.refs,m=c.setupState;if(h!=null&&h!==d&&(St(h)?(g[h]=null,Qe(m,h)&&(m[h]=null)):vt(h)&&(h.value=null)),De(d))ir(d,c,12,[u,g]);else{const p=St(d),x=vt(d);if(p||x){const E=()=>{if(e.f){const B=p?g[d]:d.value;o?He(B)&&Gu(B,l):He(B)?B.includes(l)||B.push(l):p?(g[d]=[l],Qe(m,d)&&(m[d]=g[d])):(d.value=[l],e.k&&(g[e.k]=d.value))}else p?(g[d]=u,Qe(m,d)&&(m[d]=u)):x&&(d.value=u,e.k&&(g[e.k]=u))};u?(E.id=-1,Mt(E,r)):E()}}}let yr=!1;const No=e=>/svg/.test(e.namespaceURI)&&e.tagName!=="foreignObject",Wo=e=>e.nodeType===8;function d5(e){const{mt:t,p:r,o:{patchProp:s,createText:o,nextSibling:l,parentNode:u,remove:c,insert:d,createComment:h}}=e,g=(k,y)=>{if(!y.hasChildNodes()){r(null,k,y),Qo(),y._vnode=k;return}yr=!1,m(y.firstChild,k,null,null,null),Qo(),y._vnode=k,yr&&console.error("Hydration completed but contains mismatches.")},m=(k,y,O,W,U,z=!1)=>{const H=Wo(k)&&k.data==="[",I=()=>B(k,y,O,W,U,H),{type:q,ref:Z,shapeFlag:V,patchFlag:w}=y;let T=k.nodeType;y.el=k,w===-2&&(z=!1,y.dynamicChildren=null);let L=null;switch(q){case $s:T!==3?y.children===""?(d(y.el=o(""),u(k),k),L=k):L=I():(k.data!==y.children&&(yr=!0,k.data=y.children),L=l(k));break;case jt:T!==8||H?L=I():L=l(k);break;case Ti:if(H&&(k=l(k),T=k.nodeType),T===1||T===3){L=k;const C=!y.children.length;for(let A=0;A{z=z||!!y.dynamicChildren;const{type:H,props:I,patchFlag:q,shapeFlag:Z,dirs:V}=y,w=H==="input"&&V||H==="option";if(w||q!==-1){if(V&&$n(y,null,O,"created"),I)if(w||!z||q&48)for(const L in I)(w&&L.endsWith("value")||Aa(L)&&!_s(L))&&s(k,L,null,I[L],!1,void 0,O);else I.onClick&&s(k,"onClick",null,I.onClick,!1,void 0,O);let T;if((T=I&&I.onVnodeBeforeMount)&&Yt(T,O,y),V&&$n(y,null,O,"beforeMount"),((T=I&&I.onVnodeMounted)||V)&&sg(()=>{T&&Yt(T,O,y),V&&$n(y,null,O,"mounted")},W),Z&16&&!(I&&(I.innerHTML||I.textContent))){let L=x(k.firstChild,y,k,O,W,U,z);for(;L;){yr=!0;const C=L;L=L.nextSibling,c(C)}}else Z&8&&k.textContent!==y.children&&(yr=!0,k.textContent=y.children)}return k.nextSibling},x=(k,y,O,W,U,z,H)=>{H=H||!!y.dynamicChildren;const I=y.children,q=I.length;for(let Z=0;Z{const{slotScopeIds:H}=y;H&&(U=U?U.concat(H):H);const I=u(k),q=x(l(k),y,I,O,W,U,z);return q&&Wo(q)&&q.data==="]"?l(y.anchor=q):(yr=!0,d(y.anchor=h("]"),I,q),q)},B=(k,y,O,W,U,z)=>{if(yr=!0,y.el=null,z){const q=$(k);for(;;){const Z=l(k);if(Z&&Z!==q)c(Z);else break}}const H=l(k),I=u(k);return c(k),r(null,y,I,H,O,W,No(I),U),H},$=k=>{let y=0;for(;k;)if(k=l(k),k&&Wo(k)&&(k.data==="["&&y++,k.data==="]")){if(y===0)return l(k);y--}return k};return[g,m]}const Mt=sg;function h5(e){return bg(e)}function p5(e){return bg(e,d5)}function bg(e,t){const r=yA();r.__VUE__=!0;const{insert:s,remove:o,patchProp:l,createElement:u,createText:c,createComment:d,setText:h,setElementText:g,parentNode:m,nextSibling:p,setScopeId:x=Wn,insertStaticContent:E}=e,B=(S,N,J,ee=null,oe=null,ce=null,ye=!1,de=null,he=!!N.dynamicChildren)=>{if(S===N)return;S&&!Dn(S,N)&&(ee=ue(S),me(S,oe,ce,!0),S=null),N.patchFlag===-2&&(he=!1,N.dynamicChildren=null);const{type:ae,ref:Ee,shapeFlag:Pe}=N;switch(ae){case $s:$(S,N,J,ee);break;case jt:k(S,N,J,ee);break;case Ti:S==null&&y(N,J,ee,ye);break;case st:w(S,N,J,ee,oe,ce,ye,de,he);break;default:Pe&1?U(S,N,J,ee,oe,ce,ye,de,he):Pe&6?T(S,N,J,ee,oe,ce,ye,de,he):(Pe&64||Pe&128)&&ae.process(S,N,J,ee,oe,ce,ye,de,he,Ae)}Ee!=null&&oe&&ia(Ee,S&&S.ref,ce,N||S,!N)},$=(S,N,J,ee)=>{if(S==null)s(N.el=c(N.children),J,ee);else{const oe=N.el=S.el;N.children!==S.children&&h(oe,N.children)}},k=(S,N,J,ee)=>{S==null?s(N.el=d(N.children||""),J,ee):N.el=S.el},y=(S,N,J,ee)=>{[S.el,S.anchor]=E(S.children,N,J,ee,S.el,S.anchor)},O=({el:S,anchor:N},J,ee)=>{let oe;for(;S&&S!==N;)oe=p(S),s(S,J,ee),S=oe;s(N,J,ee)},W=({el:S,anchor:N})=>{let J;for(;S&&S!==N;)J=p(S),o(S),S=J;o(N)},U=(S,N,J,ee,oe,ce,ye,de,he)=>{ye=ye||N.type==="svg",S==null?z(N,J,ee,oe,ce,ye,de,he):q(S,N,oe,ce,ye,de,he)},z=(S,N,J,ee,oe,ce,ye,de)=>{let he,ae;const{type:Ee,props:Pe,shapeFlag:ke,transition:Re,dirs:Ve}=S;if(he=S.el=u(S.type,ce,Pe&&Pe.is,Pe),ke&8?g(he,S.children):ke&16&&I(S.children,he,null,ee,oe,ce&&Ee!=="foreignObject",ye,de),Ve&&$n(S,null,ee,"created"),Pe){for(const Ke in Pe)Ke!=="value"&&!_s(Ke)&&l(he,Ke,null,Pe[Ke],ce,S.children,ee,oe,ne);"value"in Pe&&l(he,"value",null,Pe.value),(ae=Pe.onVnodeBeforeMount)&&Yt(ae,ee,S)}H(he,S,S.scopeId,ye,ee),Ve&&$n(S,null,ee,"beforeMount");const Ye=(!oe||oe&&!oe.pendingBranch)&&Re&&!Re.persisted;Ye&&Re.beforeEnter(he),s(he,N,J),((ae=Pe&&Pe.onVnodeMounted)||Ye||Ve)&&Mt(()=>{ae&&Yt(ae,ee,S),Ye&&Re.enter(he),Ve&&$n(S,null,ee,"mounted")},oe)},H=(S,N,J,ee,oe)=>{if(J&&x(S,J),ee)for(let ce=0;ce{for(let ae=he;ae{const de=N.el=S.el;let{patchFlag:he,dynamicChildren:ae,dirs:Ee}=N;he|=S.patchFlag&16;const Pe=S.props||at,ke=N.props||at;let Re;J&&zr(J,!1),(Re=ke.onVnodeBeforeUpdate)&&Yt(Re,J,N,S),Ee&&$n(N,S,J,"beforeUpdate"),J&&zr(J,!0);const Ve=oe&&N.type!=="foreignObject";if(ae?Z(S.dynamicChildren,ae,de,J,ee,Ve,ce):ye||R(S,N,de,null,J,ee,Ve,ce,!1),he>0){if(he&16)V(de,N,Pe,ke,J,ee,oe);else if(he&2&&Pe.class!==ke.class&&l(de,"class",null,ke.class,oe),he&4&&l(de,"style",Pe.style,ke.style,oe),he&8){const Ye=N.dynamicProps;for(let Ke=0;Ke{Re&&Yt(Re,J,N,S),Ee&&$n(N,S,J,"updated")},ee)},Z=(S,N,J,ee,oe,ce,ye)=>{for(let de=0;de{if(J!==ee){if(J!==at)for(const de in J)!_s(de)&&!(de in ee)&&l(S,de,J[de],null,ye,N.children,oe,ce,ne);for(const de in ee){if(_s(de))continue;const he=ee[de],ae=J[de];he!==ae&&de!=="value"&&l(S,de,ae,he,ye,N.children,oe,ce,ne)}"value"in ee&&l(S,"value",J.value,ee.value)}},w=(S,N,J,ee,oe,ce,ye,de,he)=>{const ae=N.el=S?S.el:c(""),Ee=N.anchor=S?S.anchor:c("");let{patchFlag:Pe,dynamicChildren:ke,slotScopeIds:Re}=N;Re&&(de=de?de.concat(Re):Re),S==null?(s(ae,J,ee),s(Ee,J,ee),I(N.children,J,Ee,oe,ce,ye,de,he)):Pe>0&&Pe&64&&ke&&S.dynamicChildren?(Z(S.dynamicChildren,ke,J,oe,ce,ye,de),(N.key!=null||oe&&N===oe.subTree)&&uc(S,N,!0)):R(S,N,J,Ee,oe,ce,ye,de,he)},T=(S,N,J,ee,oe,ce,ye,de,he)=>{N.slotScopeIds=de,S==null?N.shapeFlag&512?oe.ctx.activate(N,J,ee,ye,he):L(N,J,ee,oe,ce,ye,he):C(S,N,he)},L=(S,N,J,ee,oe,ce,ye)=>{const de=S.component=xg(S,ee,oe);if(Ws(S)&&(de.ctx.renderer=Ae),Eg(de),de.asyncDep){if(oe&&oe.registerDep(de,A),!S.el){const he=de.subTree=ge(jt);k(null,he,N,J)}return}A(de,S,N,J,oe,ce,ye)},C=(S,N,J)=>{const ee=N.component=S.component;if(IA(S,N,J))if(ee.asyncDep&&!ee.asyncResolved){F(ee,N,J);return}else ee.next=N,EA(ee.update),ee.update();else N.el=S.el,ee.vnode=N},A=(S,N,J,ee,oe,ce,ye)=>{const de=()=>{if(S.isMounted){let{next:Ee,bu:Pe,u:ke,parent:Re,vnode:Ve}=S,Ye=Ee,Ke;zr(S,!1),Ee?(Ee.el=Ve.el,F(S,Ee,ye)):Ee=Ve,Pe&&bs(Pe),(Ke=Ee.props&&Ee.props.onVnodeBeforeUpdate)&&Yt(Ke,Re,Ee,Ve),zr(S,!0);const pt=Ko(S),Dt=S.subTree;S.subTree=pt,B(Dt,pt,m(Dt.el),ue(Dt),S,oe,ce),Ee.el=pt.el,Ye===null&&ec(S,pt.el),ke&&Mt(ke,oe),(Ke=Ee.props&&Ee.props.onVnodeUpdated)&&Mt(()=>Yt(Ke,Re,Ee,Ve),oe)}else{let Ee;const{el:Pe,props:ke}=N,{bm:Re,m:Ve,parent:Ye}=S,Ke=ei(N);if(zr(S,!1),Re&&bs(Re),!Ke&&(Ee=ke&&ke.onVnodeBeforeMount)&&Yt(Ee,Ye,N),zr(S,!0),Pe&&Ce){const pt=()=>{S.subTree=Ko(S),Ce(Pe,S.subTree,S,oe,null)};Ke?N.type.__asyncLoader().then(()=>!S.isUnmounted&&pt()):pt()}else{const pt=S.subTree=Ko(S);B(null,pt,J,ee,S,oe,ce),N.el=pt.el}if(Ve&&Mt(Ve,oe),!Ke&&(Ee=ke&&ke.onVnodeMounted)){const pt=N;Mt(()=>Yt(Ee,Ye,pt),oe)}(N.shapeFlag&256||Ye&&ei(Ye.vnode)&&Ye.vnode.shapeFlag&256)&&S.a&&Mt(S.a,oe),S.isMounted=!0,N=J=ee=null}},he=S.effect=new ma(de,()=>Ca(ae),S.scope),ae=S.update=()=>he.run();ae.id=S.uid,zr(S,!0),ae()},F=(S,N,J)=>{N.component=S;const ee=S.vnode.props;S.vnode=N,S.next=null,o5(S,N.props,ee,J),u5(S,N.children,J),ii(),rh(),si()},R=(S,N,J,ee,oe,ce,ye,de,he=!1)=>{const ae=S&&S.children,Ee=S?S.shapeFlag:0,Pe=N.children,{patchFlag:ke,shapeFlag:Re}=N;if(ke>0){if(ke&128){Y(ae,Pe,J,ee,oe,ce,ye,de,he);return}else if(ke&256){b(ae,Pe,J,ee,oe,ce,ye,de,he);return}}Re&8?(Ee&16&&ne(ae,oe,ce),Pe!==ae&&g(J,Pe)):Ee&16?Re&16?Y(ae,Pe,J,ee,oe,ce,ye,de,he):ne(ae,oe,ce,!0):(Ee&8&&g(J,""),Re&16&&I(Pe,J,ee,oe,ce,ye,de,he))},b=(S,N,J,ee,oe,ce,ye,de,he)=>{S=S||Si,N=N||Si;const ae=S.length,Ee=N.length,Pe=Math.min(ae,Ee);let ke;for(ke=0;keEe?ne(S,oe,ce,!0,!1,Pe):I(N,J,ee,oe,ce,ye,de,he,Pe)},Y=(S,N,J,ee,oe,ce,ye,de,he)=>{let ae=0;const Ee=N.length;let Pe=S.length-1,ke=Ee-1;for(;ae<=Pe&&ae<=ke;){const Re=S[ae],Ve=N[ae]=he?Pr(N[ae]):cn(N[ae]);if(Dn(Re,Ve))B(Re,Ve,J,null,oe,ce,ye,de,he);else break;ae++}for(;ae<=Pe&&ae<=ke;){const Re=S[Pe],Ve=N[ke]=he?Pr(N[ke]):cn(N[ke]);if(Dn(Re,Ve))B(Re,Ve,J,null,oe,ce,ye,de,he);else break;Pe--,ke--}if(ae>Pe){if(ae<=ke){const Re=ke+1,Ve=Reke)for(;ae<=Pe;)me(S[ae],oe,ce,!0),ae++;else{const Re=ae,Ve=ae,Ye=new Map;for(ae=Ve;ae<=ke;ae++){const Ot=N[ae]=he?Pr(N[ae]):cn(N[ae]);Ot.key!=null&&Ye.set(Ot.key,ae)}let Ke,pt=0;const Dt=ke-Ve+1;let Rn=!1,ai=0;const Hn=new Array(Dt);for(ae=0;ae