diff --git a/.env b/.env index e67e847..ac2472a 100644 --- a/.env +++ b/.env @@ -1,2 +1,3 @@ -VITE_API_BASE_URL=http://localhost:3002/api +VITE_API_BASE_URL=http://localhost:3000/api +VITE_SERVER_URL=http://localhost:3000 VITE_APP_NAME=NOCTUNE diff --git a/.env.example b/.env.example index 0344b5a..ac2472a 100644 --- a/.env.example +++ b/.env.example @@ -1,2 +1,3 @@ -VITE_API_BASE_URL=http://localhost:3001/api +VITE_API_BASE_URL=http://localhost:3000/api +VITE_SERVER_URL=http://localhost:3000 VITE_APP_NAME=NOCTUNE diff --git a/dist/assets/index-iVZX2_zV.js b/dist/assets/index-C2ZrghzO.js similarity index 60% rename from dist/assets/index-iVZX2_zV.js rename to dist/assets/index-C2ZrghzO.js index 3816971..1e346c5 100644 --- a/dist/assets/index-iVZX2_zV.js +++ b/dist/assets/index-C2ZrghzO.js @@ -6,4 +6,4 @@ var e=Object.defineProperty,t=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=nu `);return e===-1?``:t.stack.slice(e+1)})();try{if(!e.stack)e.stack=n;else if(n){let t=n.indexOf(` `),r=t===-1?-1:n.indexOf(` `,t+1),i=r===-1?``:n.slice(r+1);String(e.stack).endsWith(i)||(e.stack+=` -`+n)}}catch{}}throw e}}_request(e,t){typeof e==`string`?(t||={},t.url=e):t=e||{},t=Qd(this.defaults,t);let{transitional:n,paramsSerializer:r,headers:i}=t;n!==void 0&&Of.assertOptions(n,{silentJSONParsing:kf.transitional(kf.boolean),forcedJSONParsing:kf.transitional(kf.boolean),clarifyTimeoutError:kf.transitional(kf.boolean),legacyInterceptorReqResOrdering:kf.transitional(kf.boolean)},!1),r!=null&&(Y.isFunction(r)?t.paramsSerializer={serialize:r}:Of.assertOptions(r,{encode:kf.function,serialize:kf.function},!0)),t.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls===void 0?t.allowAbsoluteUrls=!0:t.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls),Of.assertOptions(t,{baseUrl:kf.spelling(`baseURL`),withXsrfToken:kf.spelling(`withXSRFToken`)},!0),t.method=(t.method||this.defaults.method||`get`).toLowerCase();let a=i&&Y.merge(i.common,i[t.method]);i&&Y.forEach([`delete`,`get`,`head`,`post`,`put`,`patch`,`query`,`common`],e=>{delete i[e]}),t.headers=id.concat(a,i);let o=[],s=!0;this.interceptors.request.forEach(function(e){if(typeof e.runWhen==`function`&&e.runWhen(t)===!1)return;s&&=e.synchronous;let n=t.transitional||bd;n&&n.legacyInterceptorReqResOrdering?o.unshift(e.fulfilled,e.rejected):o.push(e.fulfilled,e.rejected)});let c=[];this.interceptors.response.forEach(function(e){c.push(e.fulfilled,e.rejected)});let l,u=0,d;if(!s){let e=[wf.bind(this),void 0];for(e.unshift(...o),e.push(...c),d=e.length,l=Promise.resolve(t);u{if(!n._listeners)return;let t=n._listeners.length;for(;t-- >0;)n._listeners[t](e);n._listeners=null}),this.promise.then=e=>{let t,r=new Promise(e=>{n.subscribe(e),t=e}).then(e);return r.cancel=function(){n.unsubscribe(t)},r},e(function(e,r,i){n.reason||(n.reason=new Rd(e,r,i),t(n.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){if(this.reason){e(this.reason);return}this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;let t=this._listeners.indexOf(e);t!==-1&&this._listeners.splice(t,1)}toAbortSignal(){let e=new AbortController,t=t=>{e.abort(t)};return this.subscribe(t),e.signal.unsubscribe=()=>this.unsubscribe(t),e.signal}static source(){let t;return{token:new e(function(e){t=e}),cancel:t}}};function Mf(e){return function(t){return e.apply(null,t)}}function Nf(e){return Y.isObject(e)&&e.isAxiosError===!0}var Pf={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(Pf).forEach(([e,t])=>{Pf[t]=e});function Ff(e){let t=new Af(e),n=Al(Af.prototype.request,t);return Y.extend(n,Af.prototype,t,{allOwnKeys:!0}),Y.extend(n,t,null,{allOwnKeys:!0}),n.create=function(t){return Ff(Qd(e,t))},n}var Z=Ff(Fd);Z.Axios=Af,Z.CanceledError=Rd,Z.CancelToken=jf,Z.isCancel=Ld,Z.VERSION=df,Z.toFormData=pd,Z.AxiosError=X,Z.Cancel=Z.CanceledError,Z.all=function(e){return Promise.all(e)},Z.spread=Mf,Z.isAxiosError=Nf,Z.mergeConfig=Qd,Z.AxiosHeaders=id,Z.formToJSON=e=>Md(Y.isHTMLForm(e)?new FormData(e):e),Z.getAdapter=Sf.getAdapter,Z.HttpStatusCode=Pf,Z.default=Z;var Q=Z.create({baseURL:`http://localhost:3002/api`,withCredentials:!0,headers:{"Content-Type":`application/json`}});Q.interceptors.response.use(e=>e,async e=>{let t=e.config;if(e.response?.status===401&&!t._retry){t._retry=!0;try{return await Z.post(`${Q.defaults.baseURL}/auth/refresh`,{},{withCredentials:!0}),Q(t)}catch{return Promise.reject(e)}}return Promise.reject(e)});var If=Es(`auth`,()=>{let e=I(null),t=I(!1),n=G(()=>!!e.value),r=G(()=>e.value?.role===`admin`),i=G(()=>e.value?.role===`artist`),a=G(()=>new Set(e.value?.likedTracks||[]));async function o(){try{let{data:t}=await Q.get(`/auth/me`);t.success&&(e.value=t.data)}catch{e.value=null}}async function s(n,r){t.value=!0;try{let{data:t}=await Q.post(`/auth/login`,{identifier:n,password:r});return t.success&&(e.value=t.data.user),{success:!0}}catch(e){return{success:!1,message:e.response?.data?.message||`Login failed`}}finally{t.value=!1}}async function c(n){t.value=!0;try{let{data:t}=await Q.post(`/auth/register`,n);return t.success&&(e.value=t.data.user),{success:!0}}catch(e){return{success:!1,message:e.response?.data?.message||`Registration failed`}}finally{t.value=!1}}async function l(){try{await Q.post(`/auth/logout`)}finally{e.value=null}}async function u(n){t.value=!0;try{let{data:t}=await Q.put(`/auth/profile`,n,{headers:{"Content-Type":`multipart/form-data`}});return t.success&&(e.value=t.data),{success:!0}}catch(e){return{success:!1,message:e.response?.data?.message||`Update failed`}}finally{t.value=!1}}async function d(t){let n=a.value.has(t);try{n?(await Q.delete(`/tracks/${t}/like`),e.value&&(e.value.likedTracks=e.value.likedTracks.filter(e=>e!==t))):(await Q.post(`/tracks/${t}/like`),e.value&&e.value.likedTracks.push(t))}catch{}}return{user:e,loading:t,isLoggedIn:n,isAdmin:r,isArtist:i,likedTrackIds:a,checkSession:o,login:s,register:c,logout:l,updateProfile:u,toggleLike:d}}),Lf=Es(`ui`,()=>{let e=I([]),t=0;function n(n,r=`info`){let i=++t;e.value.push({id:i,message:n,type:r}),setTimeout(()=>{e.value=e.value.filter(e=>e.id!==i)},3e3)}function r(t){e.value=e.value.filter(e=>e.id!==t)}return{toasts:e,showToast:n,dismissToast:r}}),Rf=t((e=>{(function(){var t=function(){this.init()};t.prototype={init:function(){var e=this||n;return e._counter=1e3,e._html5AudioPool=[],e.html5PoolSize=10,e._codecs={},e._howls=[],e._muted=!1,e._volume=1,e._canPlayEvent=`canplaythrough`,e._navigator=typeof window<`u`&&window.navigator?window.navigator:null,e.masterGain=null,e.noAudio=!1,e.usingWebAudio=!0,e.autoSuspend=!0,e.ctx=null,e.autoUnlock=!0,e._setup(),e},volume:function(e){var t=this||n;if(e=parseFloat(e),t.ctx||u(),e!==void 0&&e>=0&&e<=1){if(t._volume=e,t._muted)return t;t.usingWebAudio&&t.masterGain.gain.setValueAtTime(e,n.ctx.currentTime);for(var r=0;r=0;t--)e._howls[t].unload();return e.usingWebAudio&&e.ctx&&e.ctx.close!==void 0&&(e.ctx.close(),e.ctx=null,u()),e},codecs:function(e){return(this||n)._codecs[e.replace(/^x-/,``)]},_setup:function(){var e=this||n;if(e.state=e.ctx&&e.ctx.state||`suspended`,e._autoSuspend(),!e.usingWebAudio)if(typeof Audio<`u`)try{var t=new Audio;t.oncanplaythrough===void 0&&(e._canPlayEvent=`canplay`)}catch{e.noAudio=!0}else e.noAudio=!0;try{var t=new Audio;t.muted&&(e.noAudio=!0)}catch{}return e.noAudio||e._setupCodecs(),e},_setupCodecs:function(){var e=this||n,t=null;try{t=typeof Audio<`u`?new Audio:null}catch{return e}if(!t||typeof t.canPlayType!=`function`)return e;var r=t.canPlayType(`audio/mpeg;`).replace(/^no$/,``),i=e._navigator?e._navigator.userAgent:``,a=i.match(/OPR\/(\d+)/g),o=a&&parseInt(a[0].split(`/`)[1],10)<33,s=i.indexOf(`Safari`)!==-1&&i.indexOf(`Chrome`)===-1,c=i.match(/Version\/(.*?) /),l=s&&c&&parseInt(c[1],10)<15;return e._codecs={mp3:!!(!o&&(r||t.canPlayType(`audio/mp3;`).replace(/^no$/,``))),mpeg:!!r,opus:!!t.canPlayType(`audio/ogg; codecs="opus"`).replace(/^no$/,``),ogg:!!t.canPlayType(`audio/ogg; codecs="vorbis"`).replace(/^no$/,``),oga:!!t.canPlayType(`audio/ogg; codecs="vorbis"`).replace(/^no$/,``),wav:!!(t.canPlayType(`audio/wav; codecs="1"`)||t.canPlayType(`audio/wav`)).replace(/^no$/,``),aac:!!t.canPlayType(`audio/aac;`).replace(/^no$/,``),caf:!!t.canPlayType(`audio/x-caf;`).replace(/^no$/,``),m4a:!!(t.canPlayType(`audio/x-m4a;`)||t.canPlayType(`audio/m4a;`)||t.canPlayType(`audio/aac;`)).replace(/^no$/,``),m4b:!!(t.canPlayType(`audio/x-m4b;`)||t.canPlayType(`audio/m4b;`)||t.canPlayType(`audio/aac;`)).replace(/^no$/,``),mp4:!!(t.canPlayType(`audio/x-mp4;`)||t.canPlayType(`audio/mp4;`)||t.canPlayType(`audio/aac;`)).replace(/^no$/,``),weba:!!(!l&&t.canPlayType(`audio/webm; codecs="vorbis"`).replace(/^no$/,``)),webm:!!(!l&&t.canPlayType(`audio/webm; codecs="vorbis"`).replace(/^no$/,``)),dolby:!!t.canPlayType(`audio/mp4; codecs="ec-3"`).replace(/^no$/,``),flac:!!(t.canPlayType(`audio/x-flac;`)||t.canPlayType(`audio/flac;`)).replace(/^no$/,``)},e},_unlockAudio:function(){var e=this||n;if(!(e._audioUnlocked||!e.ctx)){e._audioUnlocked=!1,e.autoUnlock=!1,!e._mobileUnloaded&&e.ctx.sampleRate!==44100&&(e._mobileUnloaded=!0,e.unload()),e._scratchBuffer=e.ctx.createBuffer(1,1,22050);var t=function(n){for(;e._html5AudioPool.length0?s._seek:r._sprite[e][0]/1e3),u=Math.max(0,(r._sprite[e][0]+r._sprite[e][1])/1e3-l),d=u*1e3/Math.abs(s._rate),f=r._sprite[e][0]/1e3,p=(r._sprite[e][0]+r._sprite[e][1])/1e3;s._sprite=e,s._ended=!1;var m=function(){s._paused=!1,s._seek=l,s._start=f,s._stop=p,s._loop=!!(s._loop||r._sprite[e][2])};if(l>=p){r._ended(s);return}var h=s._node;if(r._webAudio){var g=function(){r._playLock=!1,m(),r._refreshBuffer(s);var e=s._muted||r._muted?0:s._volume;h.gain.setValueAtTime(e,n.ctx.currentTime),s._playStart=n.ctx.currentTime,h.bufferSource.start===void 0?s._loop?h.bufferSource.noteGrainOn(0,l,86400):h.bufferSource.noteGrainOn(0,l,u):s._loop?h.bufferSource.start(0,l,86400):h.bufferSource.start(0,l,u),d!==1/0&&(r._endTimers[s._id]=setTimeout(r._ended.bind(r,s),d)),t||setTimeout(function(){r._emit(`play`,s._id),r._loadQueue()},0)};n.state===`running`&&n.ctx.state!==`interrupted`?g():(r._playLock=!0,r.once(`resume`,g),r._clearTimer(s._id))}else{var _=function(){h.currentTime=l,h.muted=s._muted||r._muted||n._muted||h.muted,h.volume=s._volume*n.volume(),h.playbackRate=s._rate;try{var i=h.play();if(i&&typeof Promise<`u`&&(i instanceof Promise||typeof i.then==`function`)?(r._playLock=!0,m(),i.then(function(){r._playLock=!1,h._unlocked=!0,t?r._loadQueue():r._emit(`play`,s._id)}).catch(function(){r._playLock=!1,r._emit(`playerror`,s._id,`Playback was unable to start. This is most commonly an issue on mobile devices and Chrome where playback was not within a user interaction.`),s._ended=!0,s._paused=!0})):t||(r._playLock=!1,m(),r._emit(`play`,s._id)),h.playbackRate=s._rate,h.paused){r._emit(`playerror`,s._id,`Playback was unable to start. This is most commonly an issue on mobile devices and Chrome where playback was not within a user interaction.`);return}e!==`__default`||s._loop?r._endTimers[s._id]=setTimeout(r._ended.bind(r,s),d):(r._endTimers[s._id]=function(){r._ended(s),h.removeEventListener(`ended`,r._endTimers[s._id],!1)},h.addEventListener(`ended`,r._endTimers[s._id],!1))}catch(e){r._emit(`playerror`,s._id,e)}};h.src===`data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA`&&(h.src=r._src,h.load());var v=window&&window.ejecta||!h.readyState&&n._navigator.isCocoonJS;if(h.readyState>=3||v)_();else{r._playLock=!0,r._state=`loading`;var y=function(){r._state=`loaded`,_(),h.removeEventListener(n._canPlayEvent,y,!1)};h.addEventListener(n._canPlayEvent,y,!1),r._clearTimer(s._id)}}return s._id},pause:function(e){var t=this;if(t._state!==`loaded`||t._playLock)return t._queue.push({event:`pause`,action:function(){t.pause(e)}}),t;for(var n=t._getSoundIds(e),r=0;r=0?i=parseInt(t[0],10):r=parseFloat(t[0]):t.length>=2&&(r=parseFloat(t[0]),i=parseInt(t[1],10));var a;if(r!==void 0&&r>=0&&r<=1){if(e._state!==`loaded`||e._playLock)return e._queue.push({event:`volume`,action:function(){e.volume.apply(e,t)}}),e;i===void 0&&(e._volume=r),i=e._getSoundIds(i);for(var o=0;o0?r/l:r),d=Date.now();e._fadeTo=n,e._interval=setInterval(function(){var i=(Date.now()-d)/r;d=Date.now(),s+=c*i,s=Math.round(s*100)/100,s=c<0?Math.max(n,s):Math.min(n,s),o._webAudio?e._volume=s:o.volume(s,e._id,!0),a&&(o._volume=s),(nt&&s>=n)&&(clearInterval(e._interval),e._interval=null,e._fadeTo=null,o.volume(n,e._id),o._emit(`fade`,e._id))},u)},_stopFade:function(e){var t=this,r=t._soundById(e);return r&&r._interval&&(t._webAudio&&r._node.gain.cancelScheduledValues(n.ctx.currentTime),clearInterval(r._interval),r._interval=null,t.volume(r._fadeTo,e),r._fadeTo=null,t._emit(`fade`,e)),t},loop:function(){var e=this,t=arguments,n,r,i;if(t.length===0)return e._loop;if(t.length===1)if(typeof t[0]==`boolean`)n=t[0],e._loop=n;else return i=e._soundById(parseInt(t[0],10)),i?i._loop:!1;else t.length===2&&(n=t[0],r=parseInt(t[1],10));for(var a=e._getSoundIds(r),o=0;o=0?i=parseInt(t[0],10):r=parseFloat(t[0]):t.length===2&&(r=parseFloat(t[0]),i=parseInt(t[1],10));var a;if(typeof r==`number`){if(e._state!==`loaded`||e._playLock)return e._queue.push({event:`rate`,action:function(){e.rate.apply(e,t)}}),e;i===void 0&&(e._rate=r),i=e._getSoundIds(i);for(var o=0;o=0?i=parseInt(t[0],10):e._sounds.length&&(i=e._sounds[0]._id,r=parseFloat(t[0])):t.length===2&&(r=parseFloat(t[0]),i=parseInt(t[1],10)),i===void 0)return 0;if(typeof r==`number`&&(e._state!==`loaded`||e._playLock))return e._queue.push({event:`seek`,action:function(){e.seek.apply(e,t)}}),e;var a=e._soundById(i);if(a)if(typeof r==`number`&&r>=0){var o=e.playing(i);o&&e.pause(i,!0),a._seek=r,a._ended=!1,e._clearTimer(i),!e._webAudio&&a._node&&!isNaN(a._node.duration)&&(a._node.currentTime=r);var s=function(){o&&e.play(i,!0),e._emit(`seek`,i)};if(o&&!e._webAudio){var c=function(){e._playLock?setTimeout(c,0):s()};setTimeout(c,0)}else s()}else if(e._webAudio){var l=e.playing(i)?n.ctx.currentTime-a._playStart:0,u=a._rateSeek?a._rateSeek-a._seek:0;return a._seek+(u+l*Math.abs(a._rate))}else return a._node.currentTime;return e},playing:function(e){var t=this;if(typeof e==`number`){var n=t._soundById(e);return n?!n._paused:!1}for(var r=0;r=0&&n._howls.splice(i,1);var o=!0;for(r=0;r=0){o=!1;break}return a&&o&&delete a[e._src],n.noAudio=!1,e._state=`unloaded`,e._sounds=[],e=null,null},on:function(e,t,n,r){var i=this,a=i[`_on`+e];return typeof t==`function`&&a.push(r?{id:n,fn:t,once:r}:{id:n,fn:t}),i},off:function(e,t,n){var r=this,i=r[`_on`+e],a=0;if(typeof t==`number`&&(n=t,t=null),t||n)for(a=0;a=0;a--)(!i[a].id||i[a].id===t||e===`load`)&&(setTimeout(function(e){e.call(this,t,n)}.bind(r,i[a].fn),0),i[a].once&&r.off(e,i[a].fn,i[a].id));return r._loadQueue(e),r},_loadQueue:function(e){var t=this;if(t._queue.length>0){var n=t._queue[0];n.event===e&&(t._queue.shift(),t._loadQueue()),e||n.action()}return t},_ended:function(e){var t=this,r=e._sprite;if(!t._webAudio&&e._node&&!e._node.paused&&!e._node.ended&&e._node.currentTime=0;r--){if(n<=t)return;e._sounds[r]._ended&&(e._webAudio&&e._sounds[r]._node&&e._sounds[r]._node.disconnect(0),e._sounds.splice(r,1),n--)}}},_getSoundIds:function(e){var t=this;if(e===void 0){for(var n=[],r=0;r=0;if(!e.bufferSource)return t;if(n._scratchBuffer&&e.bufferSource&&(e.bufferSource.onended=null,e.bufferSource.disconnect(0),r))try{e.bufferSource.buffer=n._scratchBuffer}catch{}return e.bufferSource=null,t},_clearSound:function(e){/MSIE |Trident\//.test(n._navigator&&n._navigator.userAgent)||(e.src=`data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA`)}};var i=function(e){this._parent=e,this.init()};i.prototype={init:function(){var e=this,t=e._parent;return e._muted=t._muted,e._loop=t._loop,e._volume=t._volume,e._rate=t._rate,e._seek=0,e._paused=!0,e._ended=!0,e._sprite=`__default`,e._id=++n._counter,t._sounds.push(e),e.create(),e},create:function(){var e=this,t=e._parent,r=n._muted||e._muted||e._parent._muted?0:e._volume;return t._webAudio?(e._node=n.ctx.createGain===void 0?n.ctx.createGainNode():n.ctx.createGain(),e._node.gain.setValueAtTime(r,n.ctx.currentTime),e._node.paused=!0,e._node.connect(n.masterGain)):n.noAudio||(e._node=n._obtainHtml5Audio(),e._errorFn=e._errorListener.bind(e),e._node.addEventListener(`error`,e._errorFn,!1),e._loadFn=e._loadListener.bind(e),e._node.addEventListener(n._canPlayEvent,e._loadFn,!1),e._endFn=e._endListener.bind(e),e._node.addEventListener(`ended`,e._endFn,!1),e._node.src=t._src,e._node.preload=t._preload===!0?`auto`:t._preload,e._node.volume=r*n.volume(),e._node.load()),e},reset:function(){var e=this,t=e._parent;return e._muted=t._muted,e._loop=t._loop,e._volume=t._volume,e._rate=t._rate,e._seek=0,e._rateSeek=0,e._paused=!0,e._ended=!0,e._sprite=`__default`,e._id=++n._counter,e},_errorListener:function(){var e=this;e._parent._emit(`loaderror`,e._id,e._node.error?e._node.error.code:0),e._node.removeEventListener(`error`,e._errorFn,!1)},_loadListener:function(){var e=this,t=e._parent;t._duration=Math.ceil(e._node.duration*10)/10,Object.keys(t._sprite).length===0&&(t._sprite={__default:[0,t._duration*1e3]}),t._state!==`loaded`&&(t._state=`loaded`,t._emit(`load`),t._loadQueue()),e._node.removeEventListener(n._canPlayEvent,e._loadFn,!1)},_endListener:function(){var e=this,t=e._parent;t._duration===1/0&&(t._duration=Math.ceil(e._node.duration*10)/10,t._sprite.__default[1]===1/0&&(t._sprite.__default[1]=t._duration*1e3),t._ended(e)),e._node.removeEventListener(`ended`,e._endFn,!1)}};var a={},o=function(e){var t=e._src;if(a[t]){e._duration=a[t].duration,l(e);return}if(/^data:[^;]+;base64,/.test(t)){for(var n=atob(t.split(`,`)[1]),r=new Uint8Array(n.length),i=0;i0?(a[t._src]=e,l(t,e)):r()};typeof Promise<`u`&&n.ctx.decodeAudioData.length===1?n.ctx.decodeAudioData(e).then(i).catch(r):n.ctx.decodeAudioData(e,i,r)},l=function(e,t){t&&!e._duration&&(e._duration=t.duration),Object.keys(e._sprite).length===0&&(e._sprite={__default:[0,e._duration*1e3]}),e._state!==`loaded`&&(e._state=`loaded`,e._emit(`load`),e._loadQueue())},u=function(){if(n.usingWebAudio){try{typeof AudioContext<`u`?n.ctx=new AudioContext:typeof webkitAudioContext<`u`?n.ctx=new webkitAudioContext:n.usingWebAudio=!1}catch{n.usingWebAudio=!1}n.ctx||(n.usingWebAudio=!1);var e=/iP(hone|od|ad)/.test(n._navigator&&n._navigator.platform),t=n._navigator&&n._navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/),r=t?parseInt(t[1],10):null;if(e&&r&&r<9){var i=/safari/.test(n._navigator&&n._navigator.userAgent.toLowerCase());n._navigator&&!i&&(n.usingWebAudio=!1)}n.usingWebAudio&&(n.masterGain=n.ctx.createGain===void 0?n.ctx.createGainNode():n.ctx.createGain(),n.masterGain.gain.setValueAtTime(n._muted?0:n._volume,n.ctx.currentTime),n.masterGain.connect(n.ctx.destination)),n._setup()}};typeof define==`function`&&define.amd&&define([],function(){return{Howler:n,Howl:r}}),e!==void 0&&(e.Howler=n,e.Howl=r),typeof global<`u`?(global.HowlerGlobal=t,global.Howler=n,global.Howl=r,global.Sound=i):typeof window<`u`&&(window.HowlerGlobal=t,window.Howler=n,window.Howl=r,window.Sound=i)})(),(function(){HowlerGlobal.prototype._pos=[0,0,0],HowlerGlobal.prototype._orientation=[0,0,-1,0,1,0],HowlerGlobal.prototype.stereo=function(e){var t=this;if(!t.ctx||!t.ctx.listener)return t;for(var n=t._howls.length-1;n>=0;n--)t._howls[n].stereo(e);return t},HowlerGlobal.prototype.pos=function(e,t,n){var r=this;if(!r.ctx||!r.ctx.listener)return r;if(t=typeof t==`number`?t:r._pos[1],n=typeof n==`number`?n:r._pos[2],typeof e==`number`)r._pos=[e,t,n],r.ctx.listener.positionX===void 0?r.ctx.listener.setPosition(r._pos[0],r._pos[1],r._pos[2]):(r.ctx.listener.positionX.setTargetAtTime(r._pos[0],Howler.ctx.currentTime,.1),r.ctx.listener.positionY.setTargetAtTime(r._pos[1],Howler.ctx.currentTime,.1),r.ctx.listener.positionZ.setTargetAtTime(r._pos[2],Howler.ctx.currentTime,.1));else return r._pos;return r},HowlerGlobal.prototype.orientation=function(e,t,n,r,i,a){var o=this;if(!o.ctx||!o.ctx.listener)return o;var s=o._orientation;if(t=typeof t==`number`?t:s[1],n=typeof n==`number`?n:s[2],r=typeof r==`number`?r:s[3],i=typeof i==`number`?i:s[4],a=typeof a==`number`?a:s[5],typeof e==`number`)o._orientation=[e,t,n,r,i,a],o.ctx.listener.forwardX===void 0?o.ctx.listener.setOrientation(e,t,n,r,i,a):(o.ctx.listener.forwardX.setTargetAtTime(e,Howler.ctx.currentTime,.1),o.ctx.listener.forwardY.setTargetAtTime(t,Howler.ctx.currentTime,.1),o.ctx.listener.forwardZ.setTargetAtTime(n,Howler.ctx.currentTime,.1),o.ctx.listener.upX.setTargetAtTime(r,Howler.ctx.currentTime,.1),o.ctx.listener.upY.setTargetAtTime(i,Howler.ctx.currentTime,.1),o.ctx.listener.upZ.setTargetAtTime(a,Howler.ctx.currentTime,.1));else return s;return o},Howl.prototype.init=(function(e){return function(t){var n=this;return n._orientation=t.orientation||[1,0,0],n._stereo=t.stereo||null,n._pos=t.pos||null,n._pannerAttr={coneInnerAngle:t.coneInnerAngle===void 0?360:t.coneInnerAngle,coneOuterAngle:t.coneOuterAngle===void 0?360:t.coneOuterAngle,coneOuterGain:t.coneOuterGain===void 0?0:t.coneOuterGain,distanceModel:t.distanceModel===void 0?`inverse`:t.distanceModel,maxDistance:t.maxDistance===void 0?1e4:t.maxDistance,panningModel:t.panningModel===void 0?`HRTF`:t.panningModel,refDistance:t.refDistance===void 0?1:t.refDistance,rolloffFactor:t.rolloffFactor===void 0?1:t.rolloffFactor},n._onstereo=t.onstereo?[{fn:t.onstereo}]:[],n._onpos=t.onpos?[{fn:t.onpos}]:[],n._onorientation=t.onorientation?[{fn:t.onorientation}]:[],e.call(this,t)}})(Howl.prototype.init),Howl.prototype.stereo=function(t,n){var r=this;if(!r._webAudio)return r;if(r._state!==`loaded`)return r._queue.push({event:`stereo`,action:function(){r.stereo(t,n)}}),r;var i=Howler.ctx.createStereoPanner===void 0?`spatial`:`stereo`;if(n===void 0)if(typeof t==`number`)r._stereo=t,r._pos=[t,0,0];else return r._stereo;for(var a=r._getSoundIds(n),o=0;oBf.onPlay?.(),onpause:()=>Bf.onPause?.(),onend:()=>Bf.onEnd?.(),onloaderror:()=>Bf.onError?.(),onplayerror:()=>Bf.onError?.()})}function Uf(){zf?.play()}function Wf(){zf?.pause()}function Gf(){zf?.playing()?zf.pause():zf.play()}function Kf(e){zf&&zf.seek(e)}function qf(){return zf?zf.seek():0}function Jf(e){return e!==void 0&&Howler.volume(e/100),Howler.volume()*100}function Yf(){return zf?zf.duration():0}function Xf(){return zf?zf.playing():!1}function Zf(e,t){Bf[e]=t}function Qf(e){delete Bf[e]}function $f(){zf&&=(zf.unload(),null),Bf={}}var $={load:Hf,play:Uf,pause:Wf,togglePlay:Gf,seek:Kf,getSeek:qf,volume:Jf,duration:Yf,playing:Xf,on:Zf,off:Qf,destroy:$f,formatTime:Vf},ep=Es(`player`,()=>{let e=I(null),t=I(!1),n=I(0),r=I(0),i=I(80),a=I(null),o=I(null),s=G(()=>$.formatTime(n.value)),c=G(()=>$.formatTime(r.value));function l(i){if(!i)return;e.value=i,n.value=0,r.value=0,t.value=!1,g();let a=i.audioUrl.startsWith(`http`)?i.audioUrl:`http://localhost:3001${i.audioUrl}`;$.load(a),$.on(`play`,()=>{t.value=!0}),$.on(`pause`,()=>{t.value=!1}),$.on(`end`,()=>{t.value=!1,g(),o.value&&o.value()}),$.on(`error`,()=>{t.value=!1})}function u(e){o.value=e}function d(){e.value&&($.playing()?($.pause(),g()):($.play(),h()))}function f(){e.value&&($.play(),h())}function p(e){$.seek(e),n.value=e}function m(e){i.value=e,$.volume(e)}function h(){g(),a.value=setInterval(()=>{$.playing()&&(n.value=$.getSeek(),r.value=$.duration())},500)}function g(){a.value&&=(clearInterval(a.value),null)}function _(){g(),$.destroy(),e.value=null,t.value=!1,n.value=0,r.value=0,o.value=null}return{currentTrack:e,isPlaying:t,progress:n,duration:r,volume:i,formattedProgress:s,formattedDuration:c,setTrack:l,onEnd:u,togglePlay:d,play:f,seek:p,setVolume:m,$reset:_}}),tp=Es(`queue`,()=>{let e=I([]),t=I(-1),n=I(!1),r=I(`off`),i=G(()=>t.value<0||t.value>=e.value.length?null:e.value[t.value]);function a(n,r=0){e.value=n,t.value=r}function o(){if(e.value.length===0)return null;if(r.value===`one`)return e.value[t.value];let i;if(i=n.value?Math.floor(Math.random()*e.value.length):t.value+1,i>=e.value.length)if(r.value===`all`)i=0;else return null;return t.value=i,e.value[i]}function s(){if(e.value.length===0)return null;if(r.value===`one`)return e.value[t.value];let i;if(i=n.value?Math.floor(Math.random()*e.value.length):t.value-1,i<0)if(r.value===`all`)i=e.value.length-1;else return null;return t.value=i,e.value[i]}function c(){n.value=!n.value}function l(){let e=[`off`,`all`,`one`];r.value=e[(e.indexOf(r.value)+1)%e.length]}function u(){e.value=[],t.value=-1,n.value=!1,r.value=`off`}return{queue:e,currentIndex:t,shuffle:n,repeat:r,currentTrack:i,setQueue:a,nextTrack:o,prevTrack:s,toggleShuffle:c,cycleRepeat:l,$reset:u}}),np={class:`bg-noctune-teal px-4 py-3 flex items-center justify-between border-b-4 border-black`},rp={class:`flex items-center gap-4`},ip={class:`flex-1 max-w-md mx-8 relative`},ap={class:`relative`},op={key:0,class:`absolute top-full mt-2 left-0 right-0 bg-white border-2 border-black rounded-lg shadow-[4px_4px_0px_0px_#000] max-h-96 overflow-y-auto z-50`},sp={key:0,class:`p-2`},cp=[`onClick`],lp={class:`w-8 h-8 bg-gray-300 rounded border border-black flex-shrink-0 overflow-hidden`},up=[`src`],dp={class:`min-w-0 flex-1`},fp={class:`text-sm font-medium text-black truncate`},pp={class:`text-xs text-gray-500`},mp={key:1,class:`p-2 border-t border-gray-200`},hp=[`onClick`],gp={key:2,class:`p-4 text-center text-gray-500 text-sm`},_p={class:`flex items-center gap-4`},vp={class:`w-8 h-8 rounded-full bg-noctune-dark overflow-hidden border-2 border-black`},yp=[`src`],bp={key:1,class:`w-full h-full flex items-center justify-center`},xp={__name:`AppHeader`,setup(e){let t=Ol(),n=If(),r=ep(),i=tp(),a=I(``),o=I(null),s=null;function c(e){return e?e.startsWith(`http`)?e:`http://localhost:3001${e}`:``}function l(){if(clearTimeout(s),!a.value.trim()){o.value=null;return}s=setTimeout(async()=>{try{let{data:e}=await Q.get(`/search?q=${encodeURIComponent(a.value)}`);e.success&&(o.value=e.data)}catch{o.value=null}},300)}function u(){a.value=``,o.value=null}function d(e){u(),i.setQueue([e],0),r.setTrack(e),r.play()}function f(){t.push(`/library`)}return(e,r)=>{let i=wr(`router-link`);return z(),B(`header`,np,[V(`div`,rp,[H(i,{to:`/home`,class:`text-black font-bold text-2xl tracking-wider font-mono`},{default:Ln(()=>[...r[1]||=[U(`NOCTUNE`,-1)]]),_:1})]),V(`div`,ip,[V(`div`,ap,[r[2]||=V(`div`,{class:`absolute inset-y-0 left-3 flex items-center pointer-events-none`},[V(`svg`,{class:`w-5 h-5 text-gray-500`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z`})])],-1),Rn(V(`input`,{type:`text`,"onUpdate:modelValue":r[0]||=e=>a.value=e,onInput:l,onKeydown:Vo(u,[`escape`]),placeholder:`Search music, artist, album...`,class:`w-full bg-noctune-cream py-2 pl-10 pr-4 rounded-full text-sm focus:outline-none focus:ring-2 focus:ring-black`},null,544),[[Eo,a.value]])]),o.value&&a.value?(z(),B(`div`,op,[o.value.tracks?.length?(z(),B(`div`,sp,[r[3]||=V(`p`,{class:`text-xs font-bold text-gray-500 px-2 py-1`},`TRACKS`,-1),(z(!0),B(R,null,Or(o.value.tracks.slice(0,5),e=>(z(),B(`div`,{key:e._id,onClick:t=>d(e),class:`flex items-center gap-3 px-2 py-2 hover:bg-gray-100 rounded cursor-pointer`},[V(`div`,lp,[e.coverUrl?(z(),B(`img`,{key:0,src:c(e.coverUrl),class:`w-full h-full object-cover`},null,8,up)):W(``,!0)]),V(`div`,dp,[V(`p`,fp,j(e.title),1),V(`p`,pp,j(e.artist),1)])],8,cp))),128))])):W(``,!0),o.value.artists?.length?(z(),B(`div`,mp,[r[4]||=V(`p`,{class:`text-xs font-bold text-gray-500 px-2 py-1`},`ARTISTS`,-1),(z(!0),B(R,null,Or(o.value.artists.slice(0,3),e=>(z(),B(`div`,{key:e.name,onClick:n=>L(t).push(`/home?artist=${e.name}`),class:`px-2 py-2 hover:bg-gray-100 rounded cursor-pointer text-sm font-medium text-black`},j(e.name),9,hp))),128))])):W(``,!0),!o.value.tracks?.length&&!o.value.artists?.length?(z(),B(`div`,gp,`No results found`)):W(``,!0)])):W(``,!0)]),V(`div`,_p,[V(`button`,{onClick:f,class:`text-black hover:opacity-80`},[...r[5]||=[V(`svg`,{class:`w-7 h-7`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z`})],-1)]]),H(i,{to:`/profile`,class:`text-black hover:opacity-80`},{default:Ln(()=>[V(`div`,vp,[L(n).user?.avatarUrl?(z(),B(`img`,{key:0,src:c(L(n).user.avatarUrl),class:`w-full h-full object-cover`},null,8,yp)):(z(),B(`div`,bp,[...r[6]||=[V(`svg`,{class:`w-5 h-5 text-white`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z`})],-1)]]))])]),_:1})])])}}},Sp={class:`bg-noctune-cream flex flex-col h-full`},Cp={class:`p-4 space-y-2`},wp={class:`relative group`},Tp={class:`absolute left-0 top-full mt-1 w-56 bg-white border-2 border-black rounded-lg shadow-[4px_4px_0px_0px_#000] opacity-0 invisible group-hover:opacity-100 group-hover:visible transition-all duration-200 z-50 max-h-72 overflow-y-auto`},Ep={key:0,class:`p-2`},Dp=[`onClick`],Op={class:`truncate`},kp={key:1,class:`p-4 text-center text-sm text-gray-500`},Ap={class:`border-t-2 border-gray-200 p-2`},jp={__name:`Sidebar`,setup(e){let t=kl(),n=Ol(),r=If(),i=I([]),a=e=>t.path===e,o=e=>t.path.startsWith(e);async function s(){if(r.isLoggedIn)try{let{data:e}=await Q.get(`/playlists`);e.success&&(i.value=e.data)}catch{}}async function c(){let e=prompt(`Playlist name:`);if(e?.trim())try{let{data:t}=await Q.post(`/playlists`,{name:e.trim()});t.success&&i.value.push(t.data)}catch{}}return mr(s),(e,t)=>{let s=wr(`router-link`);return z(),B(`aside`,Sp,[V(`nav`,Cp,[H(s,{to:`/home`,class:A([`flex items-center gap-3 px-4 py-3 rounded-lg font-bold text-black hover:bg-noctune-teal/20 transition-colors`,{"bg-noctune-teal text-black":a(`/home`)}])},{default:Ln(()=>[...t[0]||=[V(`svg`,{class:`w-6 h-6`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z`})],-1),V(`span`,{class:`tracking-wide`},`HOME`,-1)]]),_:1},8,[`class`]),H(s,{to:`/library`,class:A([`flex items-center gap-3 px-4 py-3 rounded-lg font-bold text-black hover:bg-noctune-teal/20 transition-colors`,{"bg-noctune-teal text-black":a(`/library`)}])},{default:Ln(()=>[...t[1]||=[V(`svg`,{class:`w-6 h-6`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M3 13h2v-2H3v2zm0 4h2v-2H3v2zm0-8h2V7H3v2zm4 4h14v-2H7v2zm0 4h14v-2H7v2zM7 7v2h14V7H7z`})],-1),V(`span`,{class:`tracking-wide`},`LIBRARY`,-1)]]),_:1},8,[`class`]),V(`div`,wp,[H(s,{to:`/playlist`,class:A([`flex items-center gap-3 px-4 py-3 rounded-lg font-bold text-black hover:bg-noctune-teal/20 transition-colors`,{"bg-noctune-teal text-black":a(`/playlist`)||o(`/playlist/`)}])},{default:Ln(()=>[...t[2]||=[V(`svg`,{class:`w-6 h-6`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M3 10h11v2H3v-2zm0-4h11v2H3V6zm0 8h7v2H3v-2zm13-1v8l6-4-6-4z`})],-1),V(`span`,{class:`tracking-wide`},`PLAYLIST`,-1),V(`svg`,{class:`w-4 h-4 ml-auto text-gray-500 group-hover:rotate-180 transition-transform`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M7 10l5 5 5-5z`})],-1)]]),_:1},8,[`class`]),V(`div`,Tp,[i.value.length?(z(),B(`div`,Ep,[(z(!0),B(R,null,Or(i.value,e=>(z(),B(`div`,{key:e._id,onClick:t=>L(n).push(`/playlist/${e._id}`),class:`flex items-center gap-2 px-3 py-2 rounded-lg cursor-pointer hover:bg-noctune-teal/20 transition-colors text-sm font-medium text-black`},[t[3]||=V(`svg`,{class:`w-4 h-4 flex-shrink-0 text-gray-500`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M3 10h11v2H3v-2zm0-4h11v2H3V6zm0 8h7v2H3v-2zm13-1v8l6-4-6-4z`})],-1),V(`span`,Op,j(e.name),1)],8,Dp))),128))])):(z(),B(`div`,kp,`No playlists yet`)),V(`div`,Ap,[H(s,{to:`/playlist`,class:`block px-3 py-2 rounded-lg text-sm font-bold text-noctune-teal hover:bg-noctune-teal/20 transition-colors text-center`},{default:Ln(()=>[...t[4]||=[U(` Browse All Playlists `,-1)]]),_:1})])])]),L(r).isAdmin?(z(),Zi(s,{key:0,to:`/admin/tracks`,class:A([`flex items-center gap-3 px-4 py-3 rounded-lg font-bold text-black hover:bg-noctune-orange/20 transition-colors`,{"bg-noctune-orange text-black":a(`/admin/tracks`)}])},{default:Ln(()=>[...t[5]||=[V(`svg`,{class:`w-6 h-6`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm-3 17l-4-4 1.41-1.41L11 16.17l6.59-6.59L19 11l-8 8z`})],-1),V(`span`,{class:`tracking-wide`},`UPLOAD TRACK`,-1)]]),_:1},8,[`class`])):W(``,!0)]),t[7]||=V(`div`,{class:`mx-4 border-t-2 border-gray-300 my-2`},null,-1),V(`div`,{class:`px-4`},[V(`button`,{onClick:c,class:`w-full bg-noctune-yellow border-2 border-black rounded-lg py-3 px-4 font-bold flex items-center gap-2 hover:bg-yellow-400 transition-colors`},[...t[6]||=[V(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`3`,d:`M12 4v16m8-8H4`})],-1),V(`span`,{class:`tracking-wide`},`CREATE PLAYLIST`,-1)]])]),t[8]||=V(`div`,{class:`flex-1`},null,-1)])}}},Mp=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},Np={key:0,class:`fixed bottom-0 left-0 right-0 bg-noctune-dark border-t-4 border-black z-50`},Pp={class:`flex items-center px-4 py-2 max-w-screen-2xl mx-auto`},Fp={class:`flex items-center gap-3 w-80`},Ip={class:`w-12 h-12 bg-black rounded-lg overflow-hidden flex-shrink-0 border border-white/20`},Lp=[`src`],Rp={key:1,class:`w-full h-full flex items-center justify-center`},zp={class:`min-w-0`},Bp={class:`text-sm font-bold text-white truncate`},Vp={class:`text-xs text-gray-400 truncate`},Hp={class:`flex-1 flex flex-col items-center`},Up={class:`flex items-center gap-4 mb-1`},Wp={key:0,class:`w-5 h-5 text-black`,fill:`currentColor`,viewBox:`0 0 24 24`},Gp={key:1,class:`w-5 h-5 text-black ml-0.5`,fill:`currentColor`,viewBox:`0 0 24 24`},Kp={key:0,class:`absolute -top-2 -right-2 text-[9px] font-bold`},qp={class:`flex items-center gap-3 w-full max-w-lg`},Jp={class:`text-xs text-gray-400 w-10 text-right`},Yp=[`value`,`max`],Xp={class:`text-xs text-gray-400 w-10`},Zp={class:`w-80 flex items-center justify-end gap-3`},Qp={class:`flex items-center gap-2`},$p=[`value`],em=Mp({__name:`PlayerBar`,setup(e){let t=ep(),n=tp(),r=If(),i=I(!1);function a(){let e=n.nextTrack();e&&(t.setTrack(e),t.play())}mr(()=>{t.onEnd(a)});let o=G(()=>{let e=t.currentTrack?.coverUrl;return e?e.startsWith(`http`)?e:`http://localhost:3001${e}`:``});function s(e){t.seek(parseFloat(e.target.value))}function c(e){t.setVolume(parseInt(e.target.value))}function l(){let e=n.nextTrack();e&&(t.setTrack(e),t.play())}function u(){let e=n.prevTrack();e&&(t.setTrack(e),t.play())}async function d(){if(!t.currentTrack)return;let e=t.currentTrack._id||t.currentTrack.id;await r.toggleLike(e)}return Gn(()=>t.currentTrack?._id,e=>{i.value=e?r.likedTrackIds.has(e):!1},{immediate:!0}),Gn(()=>r.user?.likedTracks?.length,()=>{let e=t.currentTrack?._id;e&&(i.value=r.likedTrackIds.has(e))}),(e,r)=>L(t).currentTrack?(z(),B(`div`,Np,[V(`div`,Pp,[V(`div`,Fp,[V(`div`,Ip,[L(t).currentTrack.coverUrl?(z(),B(`img`,{key:0,src:o.value,alt:``,class:`w-full h-full object-cover`},null,8,Lp)):(z(),B(`div`,Rp,[...r[5]||=[aa(``,1)]]))]),V(`div`,zp,[V(`p`,Bp,j(L(t).currentTrack.title),1),V(`p`,Vp,j(L(t).currentTrack.artist),1)])]),V(`div`,Hp,[V(`div`,Up,[V(`button`,{onClick:r[0]||=e=>L(n).toggleShuffle(),class:A([`text-sm transition-colors`,L(n).shuffle?`text-noctune-teal`:`text-gray-400 hover:text-white`])},[...r[6]||=[V(`svg`,{class:`w-4 h-4`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M10.59 9.17L5.41 4 4 5.41l5.17 5.17 1.42-1.41zM14.5 4l2.04 2.04L4 18.59 5.41 20 17.96 7.46 20 9.5V4h-5.5zm.33 9.41l-1.41 1.41 3.13 3.13L14.5 20H20v-5.5l-2.04 2.04-3.13-3.13z`})],-1)]],2),V(`button`,{onClick:r[1]||=e=>u(),class:`text-gray-400 hover:text-white transition-colors`},[...r[7]||=[V(`svg`,{class:`w-5 h-5`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M6 6h2v12H6zm3.5 6l8.5 6V6z`})],-1)]]),V(`button`,{onClick:r[2]||=e=>L(t).togglePlay(),class:`w-10 h-10 bg-white rounded-full flex items-center justify-center hover:scale-105 transition-transform`},[L(t).isPlaying?(z(),B(`svg`,Wp,[...r[8]||=[V(`path`,{d:`M6 19h4V5H6v14zm8-14v14h4V5h-4z`},null,-1)]])):(z(),B(`svg`,Gp,[...r[9]||=[V(`path`,{d:`M8 5v14l11-7z`},null,-1)]]))]),V(`button`,{onClick:r[3]||=e=>l(),class:`text-gray-400 hover:text-white transition-colors`},[...r[10]||=[V(`svg`,{class:`w-5 h-5`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M6 18l8.5-6L6 6v12zM16 6v12h2V6h-2z`})],-1)]]),V(`button`,{onClick:r[4]||=e=>L(n).cycleRepeat(),class:A([`text-sm transition-colors`,L(n).repeat===`off`?`text-gray-400 hover:text-white`:`text-noctune-teal`,L(n).repeat===`one`?`relative`:``])},[r[11]||=V(`svg`,{class:`w-4 h-4`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M7 7h10v3l4-4-4-4v3H5v6h2V7zm10 10H7v-3l-4 4 4 4v-3h12v-6h-2v4z`})],-1),L(n).repeat===`one`?(z(),B(`span`,Kp,`1`)):W(``,!0)],2)]),V(`div`,qp,[V(`span`,Jp,j(L(t).formattedProgress),1),V(`input`,{type:`range`,value:L(t).progress,onInput:s,min:`0`,max:L(t).duration||1,step:`0.1`,class:`flex-1 h-1 bg-gray-600 rounded-full appearance-none cursor-pointer range-player`},null,40,Yp),V(`span`,Xp,j(L(t).formattedDuration),1)])]),V(`div`,Zp,[V(`button`,{onClick:d,class:`transition-colors`},[(z(),B(`svg`,{class:A([`w-5 h-5`,i.value?`fill-red-400 text-red-400`:`text-gray-400 hover:text-red-400`]),fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[...r[12]||=[V(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z`},null,-1)]],2))]),V(`div`,Qp,[r[13]||=V(`svg`,{class:`w-4 h-4 text-gray-400`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02z`})],-1),V(`input`,{type:`range`,value:L(t).volume,onInput:c,min:`0`,max:`100`,class:`w-20 h-1 bg-gray-600 rounded-full appearance-none cursor-pointer range-vol`},null,40,$p)])])])])):W(``,!0)}},[[`__scopeId`,`data-v-e17af23f`]]),tm={class:`min-h-screen bg-noctune-cream`},nm={key:0},rm={class:`flex`},im={class:`fixed top-4 right-4 z-[100] space-y-2`},am={class:`flex items-center gap-2`},om=[`onClick`],sm={__name:`App`,setup(e){let t=kl(),n=If(),r=Lf(),i=ep(),a=G(()=>t.meta?.guest===!0||t.path===`/register`),o=G(()=>!!i.currentTrack);function s(e){return{info:`bg-noctune-teal text-black`,success:`bg-green-400 text-black`,error:`bg-red-400 text-white`}[e]||`bg-noctune-yellow text-black`}return mr(async()=>{await n.checkSession()}),(e,t)=>{let n=wr(`router-view`);return z(),B(`div`,tm,[a.value?(z(),Zi(n,{key:1})):(z(),B(`div`,nm,[H(xp,{class:`sticky top-0 z-30`}),V(`div`,rm,[H(jp,{class:`fixed left-0 top-[57px] bottom-0 w-64 border-r-4 border-black overflow-y-auto z-20`}),V(`main`,{class:A([`ml-64 flex-1 min-h-[calc(100vh-57px)]`,{"pb-20":o.value}])},[H(n)],2)]),H(em)])),V(`div`,im,[(z(!0),B(R,null,Or(L(r).toasts,e=>(z(),B(`div`,{key:e.id,class:A([`px-4 py-3 rounded-lg border-2 border-black font-bold text-sm shadow-[4px_4px_0px_0px_#000] transition-all animate-slide-in`,s(e.type)])},[V(`div`,am,[V(`span`,null,j(e.message),1),V(`button`,{onClick:t=>L(r).dismissToast(e.id),class:`ml-2 opacity-60 hover:opacity-100`},` × `,8,om)])],2))),128))])])}}},cm={class:`min-h-screen bg-noctune-cream flex items-center justify-center p-8`},lm={class:`w-full max-w-5xl bg-noctune-teal rounded-3xl border-4 border-black overflow-hidden flex shadow-2xl`},um={class:`w-1/2 p-12 relative`},dm={class:`absolute top-8 right-12 grid grid-cols-4 gap-1`},fm={class:`absolute top-20 right-8 grid grid-cols-4 gap-1`},pm={class:`absolute bottom-12 left-12 grid grid-cols-3 gap-1`},mm={class:`w-1/2 bg-white rounded-3xl m-4 p-10`},hm={key:0,class:`text-red-500 text-sm mb-4 font-medium`},gm={class:`mb-6`},_m={class:`flex border-2 border-black rounded-lg overflow-hidden`},vm={class:`mb-4`},ym={class:`flex border-2 border-black rounded-lg overflow-hidden`},bm=[`type`],xm={key:0,class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},Sm={key:1,class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},Cm=[`disabled`],wm={key:0,class:`inline-block w-5 h-5 border-2 border-white border-t-transparent rounded-full animate-spin`},Tm={class:`text-center mt-8 text-gray-600`},Em={__name:`LoginPage`,setup(e){let t=Ol(),n=If(),r=I(``),i=I(``),a=I(!1),o=I(!1),s=I(``);async function c(){s.value=``,o.value=!0;let e=await n.login(r.value,i.value);o.value=!1,e.success?t.push(`/home`):s.value=e.message}return(e,t)=>{let n=wr(`router-link`);return z(),B(`div`,cm,[V(`div`,lm,[V(`div`,um,[V(`div`,dm,[(z(),B(R,null,Or(16,e=>V(`span`,{key:e,class:`w-2 h-2 bg-black/40 rounded-full`})),64))]),V(`div`,fm,[(z(),B(R,null,Or(12,e=>V(`span`,{key:e,class:`w-2 h-2 bg-black/40 rounded-full`})),64))]),t[3]||=V(`div`,{class:`absolute top-16 left-20 text-black/60 text-4xl font-bold`},`+`,-1),t[4]||=V(`div`,{class:`absolute bottom-24 right-20 text-black/60 text-4xl font-bold`},`+`,-1),V(`div`,pm,[(z(),B(R,null,Or(12,e=>V(`span`,{key:e,class:`w-2 h-2 bg-black/40 rounded-full`})),64))]),t[5]||=aa(`

noctune

`,1)]),V(`div`,mm,[t[16]||=V(`h2`,{class:`text-4xl font-black text-black mb-2`},`WELCOME!`,-1),t[17]||=V(`p`,{class:`text-gray-600 mb-8`},`Login to continue`,-1),s.value?(z(),B(`p`,hm,j(s.value),1)):W(``,!0),V(`div`,gm,[t[7]||=V(`label`,{class:`block text-xs font-bold text-gray-600 mb-2 tracking-wider`},`EMAIL/USERNAME`,-1),V(`div`,_m,[t[6]||=V(`div`,{class:`bg-noctune-teal p-3 border-r-2 border-black`},[V(`svg`,{class:`w-6 h-6 text-black`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z`})])],-1),Rn(V(`input`,{type:`text`,"onUpdate:modelValue":t[0]||=e=>r.value=e,onKeyup:Vo(c,[`enter`]),class:`flex-1 px-4 py-3 focus:outline-none text-black`,placeholder:`Enter your email`},null,544),[[Eo,r.value]])])]),V(`div`,vm,[t[11]||=V(`label`,{class:`block text-xs font-bold text-gray-600 mb-2 tracking-wider`},`PASSWORD`,-1),V(`div`,ym,[t[10]||=V(`div`,{class:`bg-amber-200 p-3 border-r-2 border-black`},[V(`svg`,{class:`w-6 h-6 text-black`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zm-6 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm3.1-9H8.9V6c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2z`})])],-1),Rn(V(`input`,{type:a.value?`text`:`password`,"onUpdate:modelValue":t[1]||=e=>i.value=e,onKeyup:Vo(c,[`enter`]),class:`flex-1 px-4 py-3 focus:outline-none text-black`,placeholder:`Enter your password`},null,40,bm),[[Po,i.value]]),V(`button`,{onClick:t[2]||=e=>a.value=!a.value,class:`px-4 text-gray-500 hover:text-gray-700`},[a.value?(z(),B(`svg`,Sm,[...t[9]||=[V(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M15 12a3 3 0 11-6 0 3 3 0 016 0z`},null,-1),V(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z`},null,-1)]])):(z(),B(`svg`,xm,[...t[8]||=[V(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21`},null,-1)]]))])])]),t[18]||=V(`div`,{class:`text-right mb-6`},[V(`a`,{href:`#`,class:`text-sm text-gray-600 hover:text-black`},`Forgot password?`)],-1),V(`button`,{onClick:c,disabled:o.value,class:`w-full bg-noctune-orange border-2 border-black rounded-lg py-4 font-bold text-white text-xl flex items-center justify-center gap-3 hover:bg-orange-600 transition-colors disabled:opacity-50`},[o.value?(z(),B(`span`,wm)):(z(),B(R,{key:1},[t[12]||=V(`div`,{class:`bg-white/20 rounded p-1`},[V(`svg`,{class:`w-5 h-5`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z`})])],-1),t[13]||=U(` LOGIN `,-1)],64))],8,Cm),t[19]||=aa(`
OR SIGN IN WITH
`,2),V(`p`,Tm,[t[15]||=U(` Don't have an account yet? `,-1),H(n,{to:`/register`,class:`text-noctune-orange font-bold hover:underline`},{default:Ln(()=>[...t[14]||=[U(`Register now`,-1)]]),_:1})])])])])}}},Dm={class:`min-h-screen bg-noctune-cream flex items-center justify-center p-8`},Om={class:`w-full max-w-5xl bg-noctune-teal rounded-3xl border-4 border-black overflow-hidden flex shadow-2xl`},km={class:`w-1/2 p-12 relative`},Am={class:`absolute top-8 right-12 grid grid-cols-4 gap-1`},jm={class:`w-1/2 bg-white rounded-3xl m-4 p-10`},Mm={key:0,class:`text-red-500 text-sm mb-4 font-medium`},Nm={class:`mb-4`},Pm={class:`mb-4`},Fm={class:`mb-4`},Im={class:`mb-6`},Lm=[`disabled`],Rm={key:0,class:`inline-block w-5 h-5 border-2 border-white border-t-transparent rounded-full animate-spin`},zm={key:1},Bm={class:`text-center mt-6 text-gray-600`},Vm={__name:`RegisterPage`,setup(e){let t=Ol(),n=If(),r=I(``),i=I(``),a=I(``),o=I(``),s=I(!1),c=I(``);async function l(){c.value=``,s.value=!0;let e=await n.register({name:r.value,username:i.value,email:a.value,password:o.value});s.value=!1,e.success?t.push(`/home`):c.value=e.message}return(e,t)=>{let n=wr(`router-link`);return z(),B(`div`,Dm,[V(`div`,Om,[V(`div`,km,[V(`div`,Am,[(z(),B(R,null,Or(16,e=>V(`span`,{key:e,class:`w-2 h-2 bg-black/40 rounded-full`})),64))]),t[4]||=aa(`

noctune

`,1)]),V(`div`,jm,[t[11]||=V(`h2`,{class:`text-4xl font-black text-black mb-2`},`JOIN US!`,-1),t[12]||=V(`p`,{class:`text-gray-600 mb-6`},`Create your account`,-1),c.value?(z(),B(`p`,Mm,j(c.value),1)):W(``,!0),V(`div`,Nm,[t[5]||=V(`label`,{class:`block text-xs font-bold text-gray-600 mb-2 tracking-wider`},`NAME`,-1),Rn(V(`input`,{type:`text`,"onUpdate:modelValue":t[0]||=e=>r.value=e,class:`w-full border-2 border-black rounded-lg px-4 py-3 focus:outline-none text-black`,placeholder:`Your name`},null,512),[[Eo,r.value]])]),V(`div`,Pm,[t[6]||=V(`label`,{class:`block text-xs font-bold text-gray-600 mb-2 tracking-wider`},`USERNAME`,-1),Rn(V(`input`,{type:`text`,"onUpdate:modelValue":t[1]||=e=>i.value=e,class:`w-full border-2 border-black rounded-lg px-4 py-3 focus:outline-none text-black`,placeholder:`Choose a username`},null,512),[[Eo,i.value]])]),V(`div`,Fm,[t[7]||=V(`label`,{class:`block text-xs font-bold text-gray-600 mb-2 tracking-wider`},`EMAIL`,-1),Rn(V(`input`,{type:`email`,"onUpdate:modelValue":t[2]||=e=>a.value=e,class:`w-full border-2 border-black rounded-lg px-4 py-3 focus:outline-none text-black`,placeholder:`Enter your email`},null,512),[[Eo,a.value]])]),V(`div`,Im,[t[8]||=V(`label`,{class:`block text-xs font-bold text-gray-600 mb-2 tracking-wider`},`PASSWORD`,-1),Rn(V(`input`,{type:`password`,"onUpdate:modelValue":t[3]||=e=>o.value=e,class:`w-full border-2 border-black rounded-lg px-4 py-3 focus:outline-none text-black`,placeholder:`Create a password`},null,512),[[Eo,o.value]])]),V(`button`,{onClick:l,disabled:s.value,class:`w-full bg-noctune-orange border-2 border-black rounded-lg py-4 font-bold text-white text-xl flex items-center justify-center gap-3 hover:bg-orange-600 transition-colors disabled:opacity-50`},[s.value?(z(),B(`span`,Rm)):(z(),B(`span`,zm,`REGISTER`))],8,Lm),V(`p`,Bm,[t[10]||=U(` Already have an account? `,-1),H(n,{to:`/`,class:`text-noctune-orange font-bold hover:underline`},{default:Ln(()=>[...t[9]||=[U(`Login`,-1)]]),_:1})])])])])}}},Hm={class:`p-8`},Um={key:0,class:`text-center py-12 text-gray-500`},Wm={key:1,class:`grid grid-cols-4 gap-4`},Gm=[`onClick`],Km={class:`aspect-square bg-gray-300 relative overflow-hidden`},qm=[`src`],Jm={class:`absolute inset-0 bg-black/0 group-hover:bg-black/20 transition-colors flex items-center justify-center`},Ym={key:0,class:`w-6 h-6 text-black`,fill:`currentColor`,viewBox:`0 0 24 24`},Xm={key:1,class:`w-6 h-6 ml-1 text-black`,fill:`currentColor`,viewBox:`0 0 24 24`},Zm={class:`p-3`},Qm={class:`flex items-center justify-between`},$m={class:`flex-1 min-w-0`},eh={class:`text-sm font-bold text-black truncate`},th={class:`text-xs text-gray-500 truncate`},nh=[`onClick`],rh={__name:`LandingPage`,setup(e){let t=ep(),n=tp(),r=If(),i=I([]),a=I(!0);function o(e){return e?e.startsWith(`http`)?e:`http://localhost:3001${e}`:``}function s(e){return t.currentTrack?._id===e._id}function c(e){return r.likedTrackIds?.has(e._id)}function l(e){if(s(e)){t.togglePlay();return}let r=i.value.findIndex(t=>t._id===e._id);n.setQueue(i.value,r),t.setTrack(e),t.play()}function u(){i.value.length&&l(i.value[0])}async function d(e){await r.toggleLike(e._id)}return mr(async()=>{try{let{data:e}=await Q.get(`/tracks`);e.success&&(i.value=e.data)}catch{}finally{a.value=!1}}),(e,n)=>(z(),B(`div`,Hm,[V(`div`,{class:`flex items-start gap-8 mb-12`},[V(`div`,{class:`flex-1`},[n[1]||=V(`h1`,{class:`text-5xl font-black text-black leading-tight mb-2`},[U(`MUSIC`),V(`br`),U(`THAT HITS`)],-1),n[2]||=V(`div`,{class:`inline-block bg-noctune-orange px-4 py-2 mb-4 border-b-4 border-black`},[V(`span`,{class:`text-4xl font-black text-black`},`DIFFERENT.`)],-1),n[3]||=V(`p`,{class:`text-gray-600 mb-6`},`You Vibe. Your sound. Only on Noctune.`,-1),V(`div`,{class:`flex gap-4`},[V(`button`,{onClick:u,class:`bg-noctune-yellow border-2 border-black px-6 py-3 font-bold hover:bg-yellow-400 transition-colors rounded-lg`},`PLAY NOW`),n[0]||=V(`button`,{class:`bg-gray-200 border-2 border-black px-6 py-3 font-bold hover:bg-gray-300 transition-colors rounded-lg`},`EXPLORE`,-1)])]),n[4]||=V(`div`,{class:`w-80 h-80 rounded-2xl overflow-hidden border-4 border-black flex-shrink-0`},[V(`img`,{src:`https://images.unsplash.com/photo-1470225620780-dba8ba36b745?w=400&h=400&fit=crop`,alt:`Music illustration`,class:`w-full h-full object-cover`})],-1)]),V(`section`,null,[n[8]||=V(`h2`,{class:`text-2xl font-black text-black mb-6 flex items-center`},[U(` TRENDING NOW `),V(`svg`,{class:`w-5 h-5 ml-2`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z`})])],-1),a.value?(z(),B(`div`,Um,`Loading tracks...`)):(z(),B(`div`,Wm,[(z(!0),B(R,null,Or(i.value,e=>(z(),B(`div`,{key:e._id,onClick:t=>l(e),class:`bg-white rounded-2xl border-2 border-black overflow-hidden hover:scale-[1.02] transition-transform cursor-pointer group`},[V(`div`,Km,[e.coverUrl?(z(),B(`img`,{key:0,src:o(e.coverUrl),class:`w-full h-full object-cover`},null,8,qm)):W(``,!0),V(`div`,Jm,[V(`div`,{class:A([`w-12 h-12 rounded-full flex items-center justify-center border-2 border-black opacity-0 group-hover:opacity-100 transition-opacity`,s(e)?`bg-white`:`bg-noctune-yellow`])},[s(e)&&L(t).isPlaying?(z(),B(`svg`,Ym,[...n[5]||=[V(`path`,{d:`M6 19h4V5H6v14zm8-14v14h4V5h-4z`},null,-1)]])):(z(),B(`svg`,Xm,[...n[6]||=[V(`path`,{d:`M8 5v14l11-7z`},null,-1)]]))],2)])]),V(`div`,Zm,[V(`div`,Qm,[V(`div`,$m,[V(`p`,eh,j(e.title),1),V(`p`,th,j(e.artist),1)]),V(`button`,{onClick:zo(t=>d(e),[`stop`]),class:`ml-2 flex-shrink-0`},[(z(),B(`svg`,{class:A([`w-5 h-5`,c(e)?`fill-red-400 text-red-400`:`text-gray-400 hover:text-red-400`]),fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[...n[7]||=[V(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z`},null,-1)]],2))],8,nh)])])],8,Gm))),128))]))])]))}},ih={class:`p-8`},ah={class:`mb-12`},oh={key:0,class:`text-center py-12 text-gray-500`},sh={key:1,class:`text-center py-12`},ch={key:2,class:`grid grid-cols-4 gap-6`},lh=[`onClick`],uh={class:`aspect-square bg-gray-300 relative overflow-hidden`},dh=[`src`],fh={key:0,class:`w-5 h-5 text-black`,fill:`currentColor`,viewBox:`0 0 24 24`},ph={key:1,class:`w-5 h-5 ml-0.5 text-black`,fill:`currentColor`,viewBox:`0 0 24 24`},mh={class:`p-3`},hh={class:`text-sm font-bold text-black truncate`},gh={class:`text-xs text-gray-500 truncate`},_h={key:0,class:`text-center py-8 text-gray-500`},vh={key:1,class:`bg-white rounded-2xl border-4 border-black overflow-hidden`},yh={class:`divide-y divide-gray-200`},bh=[`onClick`],xh={class:`flex-1 flex items-center gap-3`},Sh={class:`text-sm text-gray-400 w-6`},Ch={key:0,class:`w-4 h-4 text-noctune-teal inline`,fill:`currentColor`,viewBox:`0 0 24 24`},wh={key:1},Th={class:`w-10 h-10 rounded-lg flex-shrink-0 overflow-hidden bg-gray-300 border border-black`},Eh=[`src`],Dh={class:`w-40 text-center text-gray-600 text-sm truncate`},Oh={class:`w-32 text-center text-gray-600 text-sm truncate`},kh=[`onClick`],Ah={__name:`LibraryPage`,setup(e){let t=ep(),n=tp(),r=If(),i=I([]),a=I([]),o=I(!0),s=I(!0);function c(e){return e?e.startsWith(`http`)?e:`http://localhost:3001${e}`:``}function l(e){return t.currentTrack?._id===e._id}function u(e){return r.likedTrackIds?.has(e._id)}function d(e,r=!1,o){if(l(e)){t.togglePlay();return}let s=r?i.value:a.value,c=o??s.findIndex(t=>t._id===e._id);n.setQueue(s,c),t.setTrack(e),t.play()}async function f(e){let t=u(e);await r.toggleLike(e._id),t&&(i.value=i.value.filter(t=>t._id!==e._id))}return mr(async()=>{try{let{data:e}=await Q.get(`/tracks/liked`);e.success&&(i.value=e.data||[])}catch{}finally{o.value=!1}try{let{data:e}=await Q.get(`/tracks`);e.success&&(a.value=e.data)}catch{}finally{s.value=!1}}),(e,n)=>{let r=wr(`router-link`);return z(),B(`div`,ih,[V(`section`,ah,[n[4]||=V(`h2`,{class:`text-3xl font-black text-black mb-6`},`Liked Tracks`,-1),o.value?(z(),B(`div`,oh,`Loading...`)):i.value.length===0?(z(),B(`div`,sh,[n[1]||=V(`p`,{class:`text-gray-500 mb-4`},`No liked tracks yet`,-1),H(r,{to:`/home`,class:`bg-noctune-yellow border-2 border-black px-6 py-3 font-bold inline-block hover:bg-yellow-400 transition-colors rounded-lg`},{default:Ln(()=>[...n[0]||=[U(`Discover Music`,-1)]]),_:1})])):(z(),B(`div`,ch,[(z(!0),B(R,null,Or(i.value,e=>(z(),B(`div`,{key:e._id,onClick:t=>d(e,!0),class:`group cursor-pointer bg-white rounded-2xl border-2 border-black overflow-hidden hover:scale-[1.02] transition-transform`},[V(`div`,uh,[e.coverUrl?(z(),B(`img`,{key:0,src:c(e.coverUrl),class:`w-full h-full object-cover`},null,8,dh)):W(``,!0),V(`div`,{class:A([`absolute bottom-2 right-2 w-10 h-10 rounded-full flex items-center justify-center border-2 border-black opacity-0 group-hover:opacity-100 transition-opacity`,l(e)?`bg-white`:`bg-noctune-yellow`])},[l(e)&&L(t).isPlaying?(z(),B(`svg`,fh,[...n[2]||=[V(`path`,{d:`M6 19h4V5H6v14zm8-14v14h4V5h-4z`},null,-1)]])):(z(),B(`svg`,ph,[...n[3]||=[V(`path`,{d:`M8 5v14l11-7z`},null,-1)]]))],2)]),V(`div`,mh,[V(`p`,hh,j(e.title),1),V(`p`,gh,j(e.artist),1)])],8,lh))),128))]))]),V(`section`,null,[n[8]||=V(`h2`,{class:`text-2xl font-black text-black mb-6 flex items-center`},[U(` All Tracks `),V(`svg`,{class:`w-5 h-5 ml-2`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z`})])],-1),s.value?(z(),B(`div`,_h,`Loading...`)):(z(),B(`div`,vh,[n[7]||=aa(`
TITLEARTISTALBUM
`,1),V(`div`,yh,[(z(!0),B(R,null,Or(a.value,(e,r)=>(z(),B(`div`,{key:e._id,onClick:t=>d(e,!1,r),class:`px-6 py-3 flex items-center hover:bg-gray-50 transition-colors cursor-pointer`},[V(`div`,xh,[V(`span`,Sh,[l(e)&&L(t).isPlaying?(z(),B(`svg`,Ch,[...n[5]||=[V(`path`,{d:`M6 19h4V5H6v14zm8-14v14h4V5h-4z`},null,-1)]])):(z(),B(`span`,wh,j(r+1),1))]),V(`div`,Th,[e.coverUrl?(z(),B(`img`,{key:0,src:c(e.coverUrl),class:`w-full h-full object-cover`},null,8,Eh)):W(``,!0)]),V(`span`,{class:A([`font-medium text-sm truncate`,l(e)?`text-noctune-teal`:`text-black`])},j(e.title),3)]),V(`span`,Dh,j(e.artist),1),V(`span`,Oh,j(e.album),1),V(`button`,{onClick:zo(t=>f(e),[`stop`]),class:`w-12 flex justify-center transition-colors`},[(z(),B(`svg`,{class:A([`w-5 h-5`,u(e)?`fill-red-400 text-red-400`:`text-gray-400 hover:text-red-400`]),fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[...n[6]||=[V(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z`},null,-1)]],2))],8,kh)],8,bh))),128))])]))])])}}},jh={class:`p-8`},Mh={key:0,class:`text-center py-20 text-gray-500`},Nh={class:`flex items-start gap-8 mb-8`},Ph={class:`w-56 h-56 rounded-2xl overflow-hidden border-4 border-black flex-shrink-0 bg-black`},Fh=[`src`],Ih={key:1,class:`w-full h-full flex items-center justify-center`},Lh={class:`flex-1`},Rh={class:`text-4xl font-black text-black mb-4 leading-tight`},zh={key:0,class:`text-gray-600 mb-4`},Bh={class:`flex items-center gap-3 text-gray-600 mb-6`},Vh={class:`font-medium`},Hh={class:`flex gap-4`},Uh=[`disabled`],Wh={class:`bg-white rounded-2xl border-4 border-black overflow-hidden`},Gh={class:`divide-y divide-gray-200`},Kh=[`onClick`],qh={class:`w-12 text-center`},Jh={key:0,class:`w-4 h-4 text-noctune-teal mx-auto`,fill:`currentColor`,viewBox:`0 0 24 24`},Yh={key:1,class:`text-gray-500`},Xh={class:`flex-1 flex items-center gap-4`},Zh={class:`w-12 h-12 rounded-lg flex-shrink-0 overflow-hidden bg-gray-300 border border-black`},Qh=[`src`],$h={class:`w-48 text-center text-gray-600 text-sm truncate`},eg=[`onClick`],tg={key:0,class:`p-8 text-center text-gray-500`},ng={key:2,class:`text-center py-20 text-gray-500`},rg={__name:`PlaylistPage`,setup(e){let t=kl(),n=ep(),r=tp(),i=If(),a=I(null),o=I(!0);function s(e){return e?e.startsWith(`http`)?e:`http://localhost:3001${e}`:``}function c(e){return n.currentTrack?._id===e._id}function l(e){return i.likedTrackIds?.has(e._id)}function u(e){if(!a.value?.tracks?.length)return;let t=a.value.tracks[e];if(c(t)){n.togglePlay();return}let i=a.value.tracks;r.setQueue(i,e),n.setTrack(t),n.play()}function d(){a.value?.tracks?.length&&u(0)}async function f(e){await i.toggleLike(e._id)}return mr(async()=>{let e=t.params.id;try{if(e){let{data:t}=await Q.get(`/playlists/${e}`);t.success&&(a.value=t.data)}else{let{data:e}=await Q.get(`/playlists`);if(e.success&&e.data.length){let{data:t}=await Q.get(`/playlists/${e.data[0]._id}`);t.success&&(a.value=t.data)}else a.value={name:`My Playlist`,tracks:[]}}}catch{a.value=null}finally{o.value=!1}}),(e,t)=>(z(),B(`div`,jh,[o.value?(z(),B(`div`,Mh,`Loading playlist...`)):a.value?(z(),B(R,{key:1},[V(`div`,Nh,[V(`div`,Ph,[a.value.coverUrl?(z(),B(`img`,{key:0,src:s(a.value.coverUrl),class:`w-full h-full object-cover`},null,8,Fh)):(z(),B(`div`,Ih,[...t[0]||=[aa(``,1)]]))]),V(`div`,Lh,[t[2]||=V(`span`,{class:`inline-block bg-noctune-teal text-black text-xs font-bold px-3 py-1 rounded mb-3 border border-black`},`PLAYLIST`,-1),V(`h1`,Rh,j(a.value.name),1),a.value.description?(z(),B(`p`,zh,j(a.value.description),1)):W(``,!0),V(`div`,Bh,[V(`span`,Vh,j(a.value.tracks?.length||0)+` songs`,1)]),V(`div`,Hh,[V(`button`,{onClick:d,disabled:!a.value.tracks?.length,class:`bg-noctune-teal border-2 border-black px-6 py-2 font-bold flex items-center gap-2 rounded-lg hover:bg-teal-600 transition-colors disabled:opacity-50`},[...t[1]||=[V(`svg`,{class:`w-4 h-4`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M8 5v14l11-7z`})],-1),U(` PLAY `,-1)]],8,Uh)])])]),V(`div`,Wh,[t[5]||=aa(`
#TITLEARTIST
`,1),V(`div`,Gh,[(z(!0),B(R,null,Or(a.value.tracks,(e,r)=>(z(),B(`div`,{key:e._id,onClick:e=>u(r),class:`px-6 py-3 flex items-center hover:bg-gray-50 transition-colors cursor-pointer`},[V(`span`,qh,[c(e)&&L(n).isPlaying?(z(),B(`svg`,Jh,[...t[3]||=[V(`path`,{d:`M6 19h4V5H6v14zm8-14v14h4V5h-4z`},null,-1)]])):(z(),B(`span`,Yh,j(r+1),1))]),V(`div`,Xh,[V(`div`,Zh,[e.coverUrl?(z(),B(`img`,{key:0,src:s(e.coverUrl),class:`w-full h-full object-cover`},null,8,Qh)):W(``,!0)]),V(`span`,{class:A([`font-medium text-sm truncate`,c(e)?`text-noctune-teal`:`text-black`])},j(e.title),3)]),V(`span`,$h,j(e.artist),1),V(`button`,{onClick:zo(t=>f(e),[`stop`]),class:`w-12 flex justify-center transition-colors`},[(z(),B(`svg`,{class:A([`w-5 h-5`,l(e)?`fill-red-400 text-red-400`:`text-gray-400 hover:text-red-400`]),fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[...t[4]||=[V(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z`},null,-1)]],2))],8,eg)],8,Kh))),128)),a.value.tracks?.length?W(``,!0):(z(),B(`div`,tg,`No tracks in this playlist yet`))])])],64)):(z(),B(`div`,ng,`Playlist not found`))]))}},ig={class:`p-8`},ag={class:`bg-white rounded-2xl border-4 border-black p-6 mb-6 flex items-center gap-8`},og={class:`w-40 h-40 rounded-full border-4 border-black overflow-hidden flex-shrink-0 bg-gray-300`},sg=[`src`],cg={key:1,class:`w-full h-full flex items-center justify-center`},lg={class:`flex-1`},ug={class:`text-3xl font-black text-black mb-1`},dg={class:`text-gray-600 mb-3`},fg={class:`inline-flex items-center gap-2 border-2 border-noctune-orange text-noctune-orange px-3 py-1 rounded-full mb-4`},pg={class:`text-sm font-medium`},mg={class:`flex gap-4`},hg={key:0,class:`bg-white rounded-2xl border-4 border-black p-6 mb-6`},gg={key:0,class:`text-red-500 text-sm mb-4`},_g={key:1,class:`text-green-600 text-sm mb-4`},vg={class:`space-y-4 max-w-md`},yg=[`disabled`],bg={key:0,class:`inline-block w-4 h-4 border-2 border-black border-t-transparent rounded-full animate-spin mr-1`},xg={class:`bg-white rounded-2xl border-4 border-black p-6 mb-6 flex justify-center gap-12`},Sg={class:`flex items-center gap-4`},Cg={class:`text-2xl font-black text-black`},wg={__name:`ProfilePage`,setup(e){let t=Ol(),n=If(),r=I(!1),i=I(``),a=I(``),o=I(``),s=I(null),c=I(!1),l=I(``),u=I(``),d=I(0),f=G(()=>n.user?.name||n.user?.username||`User`);function p(e){return e?e.startsWith(`http`)?e:`http://localhost:3001${e}`:``}function m(){r.value=!r.value,r.value&&(i.value=n.user?.name||``,a.value=n.user?.username||``,o.value=n.user?.email||``,s.value=null,l.value=``,u.value=``)}function h(e){s.value=e.target.files[0]||null}async function g(){l.value=``,u.value=``,c.value=!0;try{let e=new FormData;e.append(`name`,i.value),e.append(`username`,a.value),e.append(`email`,o.value),s.value&&e.append(`avatar`,s.value);let t=await n.updateProfile(e);t.success?(u.value=`Profile updated!`,setTimeout(()=>{r.value=!1},1500)):l.value=t.message}catch{l.value=`Update failed`}finally{c.value=!1}}async function _(){await n.logout(),t.push(`/`)}return mr(async()=>{try{let{data:e}=await Q.get(`/tracks/liked`);e.success&&(d.value=e.data.likedTracks?.length||0)}catch{}}),(e,t)=>(z(),B(`div`,ig,[V(`div`,ag,[V(`div`,og,[L(n).user?.avatarUrl?(z(),B(`img`,{key:0,src:p(L(n).user.avatarUrl),alt:`Profile`,class:`w-full h-full object-cover`},null,8,sg)):(z(),B(`div`,cg,[...t[3]||=[V(`svg`,{class:`w-16 h-16 text-gray-400`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z`})],-1)]]))]),V(`div`,lg,[V(`h1`,ug,j(f.value),1),V(`p`,dg,`@`+j(L(n).user?.username||`username`),1),V(`div`,fg,[t[4]||=V(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z`})],-1),V(`span`,pg,j(L(n).user?.role===`admin`?`Admin`:`Premium Member`),1)]),V(`div`,mg,[V(`button`,{onClick:m,class:`border-2 border-black px-4 py-2 rounded-lg font-medium flex items-center gap-2 hover:bg-gray-100 transition-colors`},[t[5]||=V(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z`})],-1),U(` `+j(r.value?`Cancel`:`Edit Profile`),1)])])])]),r.value?(z(),B(`div`,hg,[t[11]||=V(`h3`,{class:`text-xl font-black text-black mb-4`},`Edit Profile`,-1),l.value?(z(),B(`p`,gg,j(l.value),1)):W(``,!0),u.value?(z(),B(`p`,_g,j(u.value),1)):W(``,!0),V(`div`,vg,[V(`div`,null,[t[6]||=V(`label`,{class:`block text-xs font-bold text-gray-600 mb-1`},`NAME`,-1),Rn(V(`input`,{type:`text`,"onUpdate:modelValue":t[0]||=e=>i.value=e,class:`w-full border-2 border-black rounded-lg px-4 py-2 focus:outline-none text-black`},null,512),[[Eo,i.value]])]),V(`div`,null,[t[7]||=V(`label`,{class:`block text-xs font-bold text-gray-600 mb-1`},`USERNAME`,-1),Rn(V(`input`,{type:`text`,"onUpdate:modelValue":t[1]||=e=>a.value=e,class:`w-full border-2 border-black rounded-lg px-4 py-2 focus:outline-none text-black`},null,512),[[Eo,a.value]])]),V(`div`,null,[t[8]||=V(`label`,{class:`block text-xs font-bold text-gray-600 mb-1`},`EMAIL`,-1),Rn(V(`input`,{type:`email`,"onUpdate:modelValue":t[2]||=e=>o.value=e,class:`w-full border-2 border-black rounded-lg px-4 py-2 focus:outline-none text-black`},null,512),[[Eo,o.value]])]),V(`div`,null,[t[9]||=V(`label`,{class:`block text-xs font-bold text-gray-600 mb-1`},`AVATAR`,-1),V(`input`,{type:`file`,accept:`image/*`,onChange:h,class:`w-full text-sm`},null,32)]),V(`button`,{onClick:g,disabled:c.value,class:`bg-noctune-teal border-2 border-black px-6 py-2 font-bold rounded-lg hover:bg-teal-600 transition-colors disabled:opacity-50`},[c.value?(z(),B(`span`,bg)):W(``,!0),t[10]||=U(` Save Changes `,-1)],8,yg)])])):W(``,!0),V(`div`,xg,[V(`div`,Sg,[t[13]||=V(`div`,{class:`w-14 h-14 bg-noctune-orange rounded-xl flex items-center justify-center border-2 border-black`},[V(`svg`,{class:`w-7 h-7 text-white`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M12 3v10.55c-.59-.34-1.27-.55-2-.55-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4V7h4V3h-6z`})])],-1),V(`div`,null,[V(`p`,Cg,j(d.value),1),t[12]||=V(`p`,{class:`text-sm text-gray-500`},`Liked Songs`,-1)])])]),V(`button`,{onClick:_,class:`w-full bg-noctune-orange border-4 border-black rounded-2xl py-4 font-bold text-black flex items-center justify-center gap-3 hover:bg-orange-600 transition-colors`},[...t[14]||=[V(`svg`,{class:`w-6 h-6`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1`})],-1),U(` Logout `,-1)]])]))}},Tg={class:`min-h-screen bg-noctune-cream flex flex-col`},Eg={class:`flex flex-1`},Dg={class:`flex-1 p-8 overflow-auto`},Og={class:`max-w-2xl mx-auto`},kg={key:0,class:`text-red-500 text-sm mb-4 font-medium`},Ag={key:1,class:`text-green-600 text-sm mb-4 font-medium`},jg={class:`bg-white rounded-2xl border-4 border-black p-8 space-y-6`},Mg=[`src`],Ng={key:1,class:`text-gray-500`},Pg={key:0,class:`text-black font-medium`},Fg={key:1,class:`text-gray-500`},Ig=[`disabled`],Lg={key:0,class:`inline-block w-5 h-5 border-2 border-white border-t-transparent rounded-full animate-spin mr-2`},Rg=[{path:`/`,name:`Login`,component:Em,meta:{guest:!0}},{path:`/register`,name:`Register`,component:Vm,meta:{guest:!0}},{path:`/home`,name:`Home`,component:rh,meta:{auth:!0}},{path:`/library`,name:`Library`,component:Ah,meta:{auth:!0}},{path:`/playlist`,name:`Playlist`,component:rg,meta:{auth:!0}},{path:`/playlist/:id`,name:`PlaylistDetail`,component:rg,meta:{auth:!0}},{path:`/profile`,name:`Profile`,component:wg,meta:{auth:!0}},{path:`/admin/tracks`,name:`AdminTracks`,component:{__name:`AdminPage`,setup(e){let t=Ol(),n=I(``),r=I(``),i=I(``),a=I(``),o=I(null),s=I(``),c=I(null),l=I(!1),u=I(``),d=I(``),f=I(null),p=I(null);function m(e){let t=e.target.files[0];t&&(o.value=t,s.value=URL.createObjectURL(t))}function h(e){let t=e.target.files[0];t&&(c.value=t)}async function g(){if(u.value=``,d.value=``,!n.value||!r.value||!i.value||!a.value||!o.value||!c.value){u.value=`All fields are required`;return}l.value=!0;try{let e=new FormData;e.append(`title`,n.value),e.append(`artist`,r.value),e.append(`album`,i.value),e.append(`genre`,a.value),e.append(`cover`,o.value),e.append(`audio`,c.value);let{data:l}=await Q.post(`/admin/tracks`,e,{headers:{"Content-Type":`multipart/form-data`}});l.success&&(d.value=`Track uploaded successfully!`,n.value=``,r.value=``,i.value=``,a.value=``,o.value=null,s.value=``,c.value=null,setTimeout(()=>t.push(`/home`),1500))}catch(e){u.value=e.response?.data?.message||`Upload failed`}finally{l.value=!1}}return(e,t)=>(z(),B(`div`,Tg,[V(`div`,Eg,[V(`main`,Dg,[V(`div`,Og,[t[12]||=V(`h1`,{class:`text-4xl font-black text-black mb-2`},`Upload Track`,-1),t[13]||=V(`p`,{class:`text-gray-600 mb-8`},`Add a new track to the library`,-1),u.value?(z(),B(`p`,kg,j(u.value),1)):W(``,!0),d.value?(z(),B(`p`,Ag,j(d.value),1)):W(``,!0),V(`div`,jg,[V(`div`,null,[t[6]||=V(`label`,{class:`block text-xs font-bold text-gray-600 mb-2 tracking-wider`},`TITLE`,-1),Rn(V(`input`,{type:`text`,"onUpdate:modelValue":t[0]||=e=>n.value=e,class:`w-full border-2 border-black rounded-lg px-4 py-3 focus:outline-none text-black`,placeholder:`Track title`},null,512),[[Eo,n.value]])]),V(`div`,null,[t[7]||=V(`label`,{class:`block text-xs font-bold text-gray-600 mb-2 tracking-wider`},`ARTIST`,-1),Rn(V(`input`,{type:`text`,"onUpdate:modelValue":t[1]||=e=>r.value=e,class:`w-full border-2 border-black rounded-lg px-4 py-3 focus:outline-none text-black`,placeholder:`Artist name`},null,512),[[Eo,r.value]])]),V(`div`,null,[t[8]||=V(`label`,{class:`block text-xs font-bold text-gray-600 mb-2 tracking-wider`},`ALBUM`,-1),Rn(V(`input`,{type:`text`,"onUpdate:modelValue":t[2]||=e=>i.value=e,class:`w-full border-2 border-black rounded-lg px-4 py-3 focus:outline-none text-black`,placeholder:`Album name`},null,512),[[Eo,i.value]])]),V(`div`,null,[t[9]||=V(`label`,{class:`block text-xs font-bold text-gray-600 mb-2 tracking-wider`},`GENRE`,-1),Rn(V(`input`,{type:`text`,"onUpdate:modelValue":t[3]||=e=>a.value=e,class:`w-full border-2 border-black rounded-lg px-4 py-3 focus:outline-none text-black`,placeholder:`e.g. Pop, Rock, Jazz`},null,512),[[Eo,a.value]])]),V(`div`,null,[t[10]||=V(`label`,{class:`block text-xs font-bold text-gray-600 mb-2 tracking-wider`},`COVER IMAGE`,-1),V(`div`,{class:`border-2 border-dashed border-black rounded-lg p-6 text-center cursor-pointer hover:bg-gray-50`,onClick:t[4]||=e=>f.value.click()},[s.value?(z(),B(`img`,{key:0,src:s.value,class:`w-32 h-32 object-cover mx-auto mb-2 rounded-lg border-2 border-black`},null,8,Mg)):(z(),B(`p`,Ng,`Click to upload cover image`)),V(`input`,{ref_key:`coverInput`,ref:f,type:`file`,accept:`image/*`,onChange:m,class:`hidden`},null,544)])]),V(`div`,null,[t[11]||=V(`label`,{class:`block text-xs font-bold text-gray-600 mb-2 tracking-wider`},`AUDIO FILE`,-1),V(`div`,{class:`border-2 border-dashed border-black rounded-lg p-6 text-center cursor-pointer hover:bg-gray-50`,onClick:t[5]||=e=>p.value.click()},[c.value?(z(),B(`p`,Pg,j(c.value.name),1)):(z(),B(`p`,Fg,` Click to upload audio file (MP3, WAV, FLAC) `)),V(`input`,{ref_key:`audioInput`,ref:p,type:`file`,accept:`.mp3,.wav,.flac`,onChange:h,class:`hidden`},null,544)])]),V(`button`,{onClick:g,disabled:l.value,class:`w-full bg-noctune-orange border-2 border-black rounded-lg py-4 font-bold text-white text-xl hover:bg-orange-600 transition-colors disabled:opacity-50`},[l.value?(z(),B(`span`,Lg)):W(``,!0),U(` `+j(l.value?`Uploading...`:`UPLOAD TRACK`),1)],8,Ig)])])])])]))}},meta:{auth:!0,admin:!0}}],zg=Dl({history:qc(),routes:Rg});zg.beforeEach((e,t,n)=>{let r=If();if(e.meta.admin&&!r.isAdmin)return n(`/home`);if(e.meta.auth&&!r.isLoggedIn)return n(`/`);if(e.meta.guest&&r.isLoggedIn)return n(`/home`);n()});var Bg=Go(sm),Vg=fs();Bg.use(Vg),Bg.use(zg),If(Vg).checkSession().finally(()=>{Bg.mount(`#app`)}); \ No newline at end of file +`+n)}}catch{}}throw e}}_request(e,t){typeof e==`string`?(t||={},t.url=e):t=e||{},t=Qd(this.defaults,t);let{transitional:n,paramsSerializer:r,headers:i}=t;n!==void 0&&Of.assertOptions(n,{silentJSONParsing:kf.transitional(kf.boolean),forcedJSONParsing:kf.transitional(kf.boolean),clarifyTimeoutError:kf.transitional(kf.boolean),legacyInterceptorReqResOrdering:kf.transitional(kf.boolean)},!1),r!=null&&(Y.isFunction(r)?t.paramsSerializer={serialize:r}:Of.assertOptions(r,{encode:kf.function,serialize:kf.function},!0)),t.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls===void 0?t.allowAbsoluteUrls=!0:t.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls),Of.assertOptions(t,{baseUrl:kf.spelling(`baseURL`),withXsrfToken:kf.spelling(`withXSRFToken`)},!0),t.method=(t.method||this.defaults.method||`get`).toLowerCase();let a=i&&Y.merge(i.common,i[t.method]);i&&Y.forEach([`delete`,`get`,`head`,`post`,`put`,`patch`,`query`,`common`],e=>{delete i[e]}),t.headers=id.concat(a,i);let o=[],s=!0;this.interceptors.request.forEach(function(e){if(typeof e.runWhen==`function`&&e.runWhen(t)===!1)return;s&&=e.synchronous;let n=t.transitional||bd;n&&n.legacyInterceptorReqResOrdering?o.unshift(e.fulfilled,e.rejected):o.push(e.fulfilled,e.rejected)});let c=[];this.interceptors.response.forEach(function(e){c.push(e.fulfilled,e.rejected)});let l,u=0,d;if(!s){let e=[wf.bind(this),void 0];for(e.unshift(...o),e.push(...c),d=e.length,l=Promise.resolve(t);u{if(!n._listeners)return;let t=n._listeners.length;for(;t-- >0;)n._listeners[t](e);n._listeners=null}),this.promise.then=e=>{let t,r=new Promise(e=>{n.subscribe(e),t=e}).then(e);return r.cancel=function(){n.unsubscribe(t)},r},e(function(e,r,i){n.reason||(n.reason=new Rd(e,r,i),t(n.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){if(this.reason){e(this.reason);return}this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;let t=this._listeners.indexOf(e);t!==-1&&this._listeners.splice(t,1)}toAbortSignal(){let e=new AbortController,t=t=>{e.abort(t)};return this.subscribe(t),e.signal.unsubscribe=()=>this.unsubscribe(t),e.signal}static source(){let t;return{token:new e(function(e){t=e}),cancel:t}}};function Mf(e){return function(t){return e.apply(null,t)}}function Nf(e){return Y.isObject(e)&&e.isAxiosError===!0}var Pf={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(Pf).forEach(([e,t])=>{Pf[t]=e});function Ff(e){let t=new Af(e),n=Al(Af.prototype.request,t);return Y.extend(n,Af.prototype,t,{allOwnKeys:!0}),Y.extend(n,t,null,{allOwnKeys:!0}),n.create=function(t){return Ff(Qd(e,t))},n}var Z=Ff(Fd);Z.Axios=Af,Z.CanceledError=Rd,Z.CancelToken=jf,Z.isCancel=Ld,Z.VERSION=df,Z.toFormData=pd,Z.AxiosError=X,Z.Cancel=Z.CanceledError,Z.all=function(e){return Promise.all(e)},Z.spread=Mf,Z.isAxiosError=Nf,Z.mergeConfig=Qd,Z.AxiosHeaders=id,Z.formToJSON=e=>Md(Y.isHTMLForm(e)?new FormData(e):e),Z.getAdapter=Sf.getAdapter,Z.HttpStatusCode=Pf,Z.default=Z;var Q=Z.create({baseURL:`http://localhost:3000/api`,withCredentials:!0,headers:{"Content-Type":`application/json`}});Q.interceptors.response.use(e=>e,async e=>{let t=e.config;if(e.response?.status===401&&!t._retry){t._retry=!0;try{return await Z.post(`${Q.defaults.baseURL}/auth/refresh`,{},{withCredentials:!0}),Q(t)}catch{return Promise.reject(e)}}return Promise.reject(e)});var If=Es(`auth`,()=>{let e=I(null),t=I(!1),n=G(()=>!!e.value),r=G(()=>e.value?.role===`admin`),i=G(()=>e.value?.role===`artist`),a=G(()=>new Set(e.value?.likedTracks||[]));async function o(){try{let{data:t}=await Q.get(`/auth/me`);t.success&&(e.value=t.data.user)}catch{e.value=null}}async function s(n,r){t.value=!0;try{let{data:t}=await Q.post(`/auth/login`,{identifier:n,password:r});return t.success&&(e.value=t.data.user),{success:!0}}catch(e){return{success:!1,message:e.response?.data?.message||`Login failed`}}finally{t.value=!1}}async function c(n){t.value=!0;try{let{data:t}=await Q.post(`/auth/register`,n);return t.success&&(e.value=t.data.user),{success:!0}}catch(e){return{success:!1,message:e.response?.data?.message||`Registration failed`}}finally{t.value=!1}}async function l(){try{await Q.post(`/auth/logout`)}finally{e.value=null}}async function u(n){t.value=!0;try{let{data:t}=await Q.put(`/auth/profile`,n,{headers:{"Content-Type":`multipart/form-data`}});return t.success&&(e.value=t.data),{success:!0}}catch(e){return{success:!1,message:e.response?.data?.message||`Update failed`}}finally{t.value=!1}}async function d(t){let n=a.value.has(t);try{n?(await Q.delete(`/tracks/${t}/like`),e.value&&(e.value.likedTracks=e.value.likedTracks.filter(e=>e!==t))):(await Q.post(`/tracks/${t}/like`),e.value&&e.value.likedTracks.push(t))}catch{}}return{user:e,loading:t,isLoggedIn:n,isAdmin:r,isArtist:i,likedTrackIds:a,checkSession:o,login:s,register:c,logout:l,updateProfile:u,toggleLike:d}}),Lf=Es(`ui`,()=>{let e=I([]),t=0;function n(n,r=`info`){let i=++t;e.value.push({id:i,message:n,type:r}),setTimeout(()=>{e.value=e.value.filter(e=>e.id!==i)},3e3)}function r(t){e.value=e.value.filter(e=>e.id!==t)}return{toasts:e,showToast:n,dismissToast:r}}),Rf=t((e=>{(function(){var t=function(){this.init()};t.prototype={init:function(){var e=this||n;return e._counter=1e3,e._html5AudioPool=[],e.html5PoolSize=10,e._codecs={},e._howls=[],e._muted=!1,e._volume=1,e._canPlayEvent=`canplaythrough`,e._navigator=typeof window<`u`&&window.navigator?window.navigator:null,e.masterGain=null,e.noAudio=!1,e.usingWebAudio=!0,e.autoSuspend=!0,e.ctx=null,e.autoUnlock=!0,e._setup(),e},volume:function(e){var t=this||n;if(e=parseFloat(e),t.ctx||u(),e!==void 0&&e>=0&&e<=1){if(t._volume=e,t._muted)return t;t.usingWebAudio&&t.masterGain.gain.setValueAtTime(e,n.ctx.currentTime);for(var r=0;r=0;t--)e._howls[t].unload();return e.usingWebAudio&&e.ctx&&e.ctx.close!==void 0&&(e.ctx.close(),e.ctx=null,u()),e},codecs:function(e){return(this||n)._codecs[e.replace(/^x-/,``)]},_setup:function(){var e=this||n;if(e.state=e.ctx&&e.ctx.state||`suspended`,e._autoSuspend(),!e.usingWebAudio)if(typeof Audio<`u`)try{var t=new Audio;t.oncanplaythrough===void 0&&(e._canPlayEvent=`canplay`)}catch{e.noAudio=!0}else e.noAudio=!0;try{var t=new Audio;t.muted&&(e.noAudio=!0)}catch{}return e.noAudio||e._setupCodecs(),e},_setupCodecs:function(){var e=this||n,t=null;try{t=typeof Audio<`u`?new Audio:null}catch{return e}if(!t||typeof t.canPlayType!=`function`)return e;var r=t.canPlayType(`audio/mpeg;`).replace(/^no$/,``),i=e._navigator?e._navigator.userAgent:``,a=i.match(/OPR\/(\d+)/g),o=a&&parseInt(a[0].split(`/`)[1],10)<33,s=i.indexOf(`Safari`)!==-1&&i.indexOf(`Chrome`)===-1,c=i.match(/Version\/(.*?) /),l=s&&c&&parseInt(c[1],10)<15;return e._codecs={mp3:!!(!o&&(r||t.canPlayType(`audio/mp3;`).replace(/^no$/,``))),mpeg:!!r,opus:!!t.canPlayType(`audio/ogg; codecs="opus"`).replace(/^no$/,``),ogg:!!t.canPlayType(`audio/ogg; codecs="vorbis"`).replace(/^no$/,``),oga:!!t.canPlayType(`audio/ogg; codecs="vorbis"`).replace(/^no$/,``),wav:!!(t.canPlayType(`audio/wav; codecs="1"`)||t.canPlayType(`audio/wav`)).replace(/^no$/,``),aac:!!t.canPlayType(`audio/aac;`).replace(/^no$/,``),caf:!!t.canPlayType(`audio/x-caf;`).replace(/^no$/,``),m4a:!!(t.canPlayType(`audio/x-m4a;`)||t.canPlayType(`audio/m4a;`)||t.canPlayType(`audio/aac;`)).replace(/^no$/,``),m4b:!!(t.canPlayType(`audio/x-m4b;`)||t.canPlayType(`audio/m4b;`)||t.canPlayType(`audio/aac;`)).replace(/^no$/,``),mp4:!!(t.canPlayType(`audio/x-mp4;`)||t.canPlayType(`audio/mp4;`)||t.canPlayType(`audio/aac;`)).replace(/^no$/,``),weba:!!(!l&&t.canPlayType(`audio/webm; codecs="vorbis"`).replace(/^no$/,``)),webm:!!(!l&&t.canPlayType(`audio/webm; codecs="vorbis"`).replace(/^no$/,``)),dolby:!!t.canPlayType(`audio/mp4; codecs="ec-3"`).replace(/^no$/,``),flac:!!(t.canPlayType(`audio/x-flac;`)||t.canPlayType(`audio/flac;`)).replace(/^no$/,``)},e},_unlockAudio:function(){var e=this||n;if(!(e._audioUnlocked||!e.ctx)){e._audioUnlocked=!1,e.autoUnlock=!1,!e._mobileUnloaded&&e.ctx.sampleRate!==44100&&(e._mobileUnloaded=!0,e.unload()),e._scratchBuffer=e.ctx.createBuffer(1,1,22050);var t=function(n){for(;e._html5AudioPool.length0?s._seek:r._sprite[e][0]/1e3),u=Math.max(0,(r._sprite[e][0]+r._sprite[e][1])/1e3-l),d=u*1e3/Math.abs(s._rate),f=r._sprite[e][0]/1e3,p=(r._sprite[e][0]+r._sprite[e][1])/1e3;s._sprite=e,s._ended=!1;var m=function(){s._paused=!1,s._seek=l,s._start=f,s._stop=p,s._loop=!!(s._loop||r._sprite[e][2])};if(l>=p){r._ended(s);return}var h=s._node;if(r._webAudio){var g=function(){r._playLock=!1,m(),r._refreshBuffer(s);var e=s._muted||r._muted?0:s._volume;h.gain.setValueAtTime(e,n.ctx.currentTime),s._playStart=n.ctx.currentTime,h.bufferSource.start===void 0?s._loop?h.bufferSource.noteGrainOn(0,l,86400):h.bufferSource.noteGrainOn(0,l,u):s._loop?h.bufferSource.start(0,l,86400):h.bufferSource.start(0,l,u),d!==1/0&&(r._endTimers[s._id]=setTimeout(r._ended.bind(r,s),d)),t||setTimeout(function(){r._emit(`play`,s._id),r._loadQueue()},0)};n.state===`running`&&n.ctx.state!==`interrupted`?g():(r._playLock=!0,r.once(`resume`,g),r._clearTimer(s._id))}else{var _=function(){h.currentTime=l,h.muted=s._muted||r._muted||n._muted||h.muted,h.volume=s._volume*n.volume(),h.playbackRate=s._rate;try{var i=h.play();if(i&&typeof Promise<`u`&&(i instanceof Promise||typeof i.then==`function`)?(r._playLock=!0,m(),i.then(function(){r._playLock=!1,h._unlocked=!0,t?r._loadQueue():r._emit(`play`,s._id)}).catch(function(){r._playLock=!1,r._emit(`playerror`,s._id,`Playback was unable to start. This is most commonly an issue on mobile devices and Chrome where playback was not within a user interaction.`),s._ended=!0,s._paused=!0})):t||(r._playLock=!1,m(),r._emit(`play`,s._id)),h.playbackRate=s._rate,h.paused){r._emit(`playerror`,s._id,`Playback was unable to start. This is most commonly an issue on mobile devices and Chrome where playback was not within a user interaction.`);return}e!==`__default`||s._loop?r._endTimers[s._id]=setTimeout(r._ended.bind(r,s),d):(r._endTimers[s._id]=function(){r._ended(s),h.removeEventListener(`ended`,r._endTimers[s._id],!1)},h.addEventListener(`ended`,r._endTimers[s._id],!1))}catch(e){r._emit(`playerror`,s._id,e)}};h.src===`data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA`&&(h.src=r._src,h.load());var v=window&&window.ejecta||!h.readyState&&n._navigator.isCocoonJS;if(h.readyState>=3||v)_();else{r._playLock=!0,r._state=`loading`;var y=function(){r._state=`loaded`,_(),h.removeEventListener(n._canPlayEvent,y,!1)};h.addEventListener(n._canPlayEvent,y,!1),r._clearTimer(s._id)}}return s._id},pause:function(e){var t=this;if(t._state!==`loaded`||t._playLock)return t._queue.push({event:`pause`,action:function(){t.pause(e)}}),t;for(var n=t._getSoundIds(e),r=0;r=0?i=parseInt(t[0],10):r=parseFloat(t[0]):t.length>=2&&(r=parseFloat(t[0]),i=parseInt(t[1],10));var a;if(r!==void 0&&r>=0&&r<=1){if(e._state!==`loaded`||e._playLock)return e._queue.push({event:`volume`,action:function(){e.volume.apply(e,t)}}),e;i===void 0&&(e._volume=r),i=e._getSoundIds(i);for(var o=0;o0?r/l:r),d=Date.now();e._fadeTo=n,e._interval=setInterval(function(){var i=(Date.now()-d)/r;d=Date.now(),s+=c*i,s=Math.round(s*100)/100,s=c<0?Math.max(n,s):Math.min(n,s),o._webAudio?e._volume=s:o.volume(s,e._id,!0),a&&(o._volume=s),(nt&&s>=n)&&(clearInterval(e._interval),e._interval=null,e._fadeTo=null,o.volume(n,e._id),o._emit(`fade`,e._id))},u)},_stopFade:function(e){var t=this,r=t._soundById(e);return r&&r._interval&&(t._webAudio&&r._node.gain.cancelScheduledValues(n.ctx.currentTime),clearInterval(r._interval),r._interval=null,t.volume(r._fadeTo,e),r._fadeTo=null,t._emit(`fade`,e)),t},loop:function(){var e=this,t=arguments,n,r,i;if(t.length===0)return e._loop;if(t.length===1)if(typeof t[0]==`boolean`)n=t[0],e._loop=n;else return i=e._soundById(parseInt(t[0],10)),i?i._loop:!1;else t.length===2&&(n=t[0],r=parseInt(t[1],10));for(var a=e._getSoundIds(r),o=0;o=0?i=parseInt(t[0],10):r=parseFloat(t[0]):t.length===2&&(r=parseFloat(t[0]),i=parseInt(t[1],10));var a;if(typeof r==`number`){if(e._state!==`loaded`||e._playLock)return e._queue.push({event:`rate`,action:function(){e.rate.apply(e,t)}}),e;i===void 0&&(e._rate=r),i=e._getSoundIds(i);for(var o=0;o=0?i=parseInt(t[0],10):e._sounds.length&&(i=e._sounds[0]._id,r=parseFloat(t[0])):t.length===2&&(r=parseFloat(t[0]),i=parseInt(t[1],10)),i===void 0)return 0;if(typeof r==`number`&&(e._state!==`loaded`||e._playLock))return e._queue.push({event:`seek`,action:function(){e.seek.apply(e,t)}}),e;var a=e._soundById(i);if(a)if(typeof r==`number`&&r>=0){var o=e.playing(i);o&&e.pause(i,!0),a._seek=r,a._ended=!1,e._clearTimer(i),!e._webAudio&&a._node&&!isNaN(a._node.duration)&&(a._node.currentTime=r);var s=function(){o&&e.play(i,!0),e._emit(`seek`,i)};if(o&&!e._webAudio){var c=function(){e._playLock?setTimeout(c,0):s()};setTimeout(c,0)}else s()}else if(e._webAudio){var l=e.playing(i)?n.ctx.currentTime-a._playStart:0,u=a._rateSeek?a._rateSeek-a._seek:0;return a._seek+(u+l*Math.abs(a._rate))}else return a._node.currentTime;return e},playing:function(e){var t=this;if(typeof e==`number`){var n=t._soundById(e);return n?!n._paused:!1}for(var r=0;r=0&&n._howls.splice(i,1);var o=!0;for(r=0;r=0){o=!1;break}return a&&o&&delete a[e._src],n.noAudio=!1,e._state=`unloaded`,e._sounds=[],e=null,null},on:function(e,t,n,r){var i=this,a=i[`_on`+e];return typeof t==`function`&&a.push(r?{id:n,fn:t,once:r}:{id:n,fn:t}),i},off:function(e,t,n){var r=this,i=r[`_on`+e],a=0;if(typeof t==`number`&&(n=t,t=null),t||n)for(a=0;a=0;a--)(!i[a].id||i[a].id===t||e===`load`)&&(setTimeout(function(e){e.call(this,t,n)}.bind(r,i[a].fn),0),i[a].once&&r.off(e,i[a].fn,i[a].id));return r._loadQueue(e),r},_loadQueue:function(e){var t=this;if(t._queue.length>0){var n=t._queue[0];n.event===e&&(t._queue.shift(),t._loadQueue()),e||n.action()}return t},_ended:function(e){var t=this,r=e._sprite;if(!t._webAudio&&e._node&&!e._node.paused&&!e._node.ended&&e._node.currentTime=0;r--){if(n<=t)return;e._sounds[r]._ended&&(e._webAudio&&e._sounds[r]._node&&e._sounds[r]._node.disconnect(0),e._sounds.splice(r,1),n--)}}},_getSoundIds:function(e){var t=this;if(e===void 0){for(var n=[],r=0;r=0;if(!e.bufferSource)return t;if(n._scratchBuffer&&e.bufferSource&&(e.bufferSource.onended=null,e.bufferSource.disconnect(0),r))try{e.bufferSource.buffer=n._scratchBuffer}catch{}return e.bufferSource=null,t},_clearSound:function(e){/MSIE |Trident\//.test(n._navigator&&n._navigator.userAgent)||(e.src=`data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA`)}};var i=function(e){this._parent=e,this.init()};i.prototype={init:function(){var e=this,t=e._parent;return e._muted=t._muted,e._loop=t._loop,e._volume=t._volume,e._rate=t._rate,e._seek=0,e._paused=!0,e._ended=!0,e._sprite=`__default`,e._id=++n._counter,t._sounds.push(e),e.create(),e},create:function(){var e=this,t=e._parent,r=n._muted||e._muted||e._parent._muted?0:e._volume;return t._webAudio?(e._node=n.ctx.createGain===void 0?n.ctx.createGainNode():n.ctx.createGain(),e._node.gain.setValueAtTime(r,n.ctx.currentTime),e._node.paused=!0,e._node.connect(n.masterGain)):n.noAudio||(e._node=n._obtainHtml5Audio(),e._errorFn=e._errorListener.bind(e),e._node.addEventListener(`error`,e._errorFn,!1),e._loadFn=e._loadListener.bind(e),e._node.addEventListener(n._canPlayEvent,e._loadFn,!1),e._endFn=e._endListener.bind(e),e._node.addEventListener(`ended`,e._endFn,!1),e._node.src=t._src,e._node.preload=t._preload===!0?`auto`:t._preload,e._node.volume=r*n.volume(),e._node.load()),e},reset:function(){var e=this,t=e._parent;return e._muted=t._muted,e._loop=t._loop,e._volume=t._volume,e._rate=t._rate,e._seek=0,e._rateSeek=0,e._paused=!0,e._ended=!0,e._sprite=`__default`,e._id=++n._counter,e},_errorListener:function(){var e=this;e._parent._emit(`loaderror`,e._id,e._node.error?e._node.error.code:0),e._node.removeEventListener(`error`,e._errorFn,!1)},_loadListener:function(){var e=this,t=e._parent;t._duration=Math.ceil(e._node.duration*10)/10,Object.keys(t._sprite).length===0&&(t._sprite={__default:[0,t._duration*1e3]}),t._state!==`loaded`&&(t._state=`loaded`,t._emit(`load`),t._loadQueue()),e._node.removeEventListener(n._canPlayEvent,e._loadFn,!1)},_endListener:function(){var e=this,t=e._parent;t._duration===1/0&&(t._duration=Math.ceil(e._node.duration*10)/10,t._sprite.__default[1]===1/0&&(t._sprite.__default[1]=t._duration*1e3),t._ended(e)),e._node.removeEventListener(`ended`,e._endFn,!1)}};var a={},o=function(e){var t=e._src;if(a[t]){e._duration=a[t].duration,l(e);return}if(/^data:[^;]+;base64,/.test(t)){for(var n=atob(t.split(`,`)[1]),r=new Uint8Array(n.length),i=0;i0?(a[t._src]=e,l(t,e)):r()};typeof Promise<`u`&&n.ctx.decodeAudioData.length===1?n.ctx.decodeAudioData(e).then(i).catch(r):n.ctx.decodeAudioData(e,i,r)},l=function(e,t){t&&!e._duration&&(e._duration=t.duration),Object.keys(e._sprite).length===0&&(e._sprite={__default:[0,e._duration*1e3]}),e._state!==`loaded`&&(e._state=`loaded`,e._emit(`load`),e._loadQueue())},u=function(){if(n.usingWebAudio){try{typeof AudioContext<`u`?n.ctx=new AudioContext:typeof webkitAudioContext<`u`?n.ctx=new webkitAudioContext:n.usingWebAudio=!1}catch{n.usingWebAudio=!1}n.ctx||(n.usingWebAudio=!1);var e=/iP(hone|od|ad)/.test(n._navigator&&n._navigator.platform),t=n._navigator&&n._navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/),r=t?parseInt(t[1],10):null;if(e&&r&&r<9){var i=/safari/.test(n._navigator&&n._navigator.userAgent.toLowerCase());n._navigator&&!i&&(n.usingWebAudio=!1)}n.usingWebAudio&&(n.masterGain=n.ctx.createGain===void 0?n.ctx.createGainNode():n.ctx.createGain(),n.masterGain.gain.setValueAtTime(n._muted?0:n._volume,n.ctx.currentTime),n.masterGain.connect(n.ctx.destination)),n._setup()}};typeof define==`function`&&define.amd&&define([],function(){return{Howler:n,Howl:r}}),e!==void 0&&(e.Howler=n,e.Howl=r),typeof global<`u`?(global.HowlerGlobal=t,global.Howler=n,global.Howl=r,global.Sound=i):typeof window<`u`&&(window.HowlerGlobal=t,window.Howler=n,window.Howl=r,window.Sound=i)})(),(function(){HowlerGlobal.prototype._pos=[0,0,0],HowlerGlobal.prototype._orientation=[0,0,-1,0,1,0],HowlerGlobal.prototype.stereo=function(e){var t=this;if(!t.ctx||!t.ctx.listener)return t;for(var n=t._howls.length-1;n>=0;n--)t._howls[n].stereo(e);return t},HowlerGlobal.prototype.pos=function(e,t,n){var r=this;if(!r.ctx||!r.ctx.listener)return r;if(t=typeof t==`number`?t:r._pos[1],n=typeof n==`number`?n:r._pos[2],typeof e==`number`)r._pos=[e,t,n],r.ctx.listener.positionX===void 0?r.ctx.listener.setPosition(r._pos[0],r._pos[1],r._pos[2]):(r.ctx.listener.positionX.setTargetAtTime(r._pos[0],Howler.ctx.currentTime,.1),r.ctx.listener.positionY.setTargetAtTime(r._pos[1],Howler.ctx.currentTime,.1),r.ctx.listener.positionZ.setTargetAtTime(r._pos[2],Howler.ctx.currentTime,.1));else return r._pos;return r},HowlerGlobal.prototype.orientation=function(e,t,n,r,i,a){var o=this;if(!o.ctx||!o.ctx.listener)return o;var s=o._orientation;if(t=typeof t==`number`?t:s[1],n=typeof n==`number`?n:s[2],r=typeof r==`number`?r:s[3],i=typeof i==`number`?i:s[4],a=typeof a==`number`?a:s[5],typeof e==`number`)o._orientation=[e,t,n,r,i,a],o.ctx.listener.forwardX===void 0?o.ctx.listener.setOrientation(e,t,n,r,i,a):(o.ctx.listener.forwardX.setTargetAtTime(e,Howler.ctx.currentTime,.1),o.ctx.listener.forwardY.setTargetAtTime(t,Howler.ctx.currentTime,.1),o.ctx.listener.forwardZ.setTargetAtTime(n,Howler.ctx.currentTime,.1),o.ctx.listener.upX.setTargetAtTime(r,Howler.ctx.currentTime,.1),o.ctx.listener.upY.setTargetAtTime(i,Howler.ctx.currentTime,.1),o.ctx.listener.upZ.setTargetAtTime(a,Howler.ctx.currentTime,.1));else return s;return o},Howl.prototype.init=(function(e){return function(t){var n=this;return n._orientation=t.orientation||[1,0,0],n._stereo=t.stereo||null,n._pos=t.pos||null,n._pannerAttr={coneInnerAngle:t.coneInnerAngle===void 0?360:t.coneInnerAngle,coneOuterAngle:t.coneOuterAngle===void 0?360:t.coneOuterAngle,coneOuterGain:t.coneOuterGain===void 0?0:t.coneOuterGain,distanceModel:t.distanceModel===void 0?`inverse`:t.distanceModel,maxDistance:t.maxDistance===void 0?1e4:t.maxDistance,panningModel:t.panningModel===void 0?`HRTF`:t.panningModel,refDistance:t.refDistance===void 0?1:t.refDistance,rolloffFactor:t.rolloffFactor===void 0?1:t.rolloffFactor},n._onstereo=t.onstereo?[{fn:t.onstereo}]:[],n._onpos=t.onpos?[{fn:t.onpos}]:[],n._onorientation=t.onorientation?[{fn:t.onorientation}]:[],e.call(this,t)}})(Howl.prototype.init),Howl.prototype.stereo=function(t,n){var r=this;if(!r._webAudio)return r;if(r._state!==`loaded`)return r._queue.push({event:`stereo`,action:function(){r.stereo(t,n)}}),r;var i=Howler.ctx.createStereoPanner===void 0?`spatial`:`stereo`;if(n===void 0)if(typeof t==`number`)r._stereo=t,r._pos=[t,0,0];else return r._stereo;for(var a=r._getSoundIds(n),o=0;oBf.onPlay?.(),onpause:()=>Bf.onPause?.(),onend:()=>Bf.onEnd?.(),onloaderror:()=>Bf.onError?.(),onplayerror:()=>Bf.onError?.()})}function Uf(){zf?.play()}function Wf(){zf?.pause()}function Gf(){zf?.playing()?zf.pause():zf.play()}function Kf(e){zf&&zf.seek(e)}function qf(){return zf?zf.seek():0}function Jf(e){return e!==void 0&&Howler.volume(e/100),Howler.volume()*100}function Yf(){return zf?zf.duration():0}function Xf(){return zf?zf.playing():!1}function Zf(e,t){Bf[e]=t}function Qf(e){delete Bf[e]}function $f(){zf&&=(zf.unload(),null),Bf={}}var $={load:Hf,play:Uf,pause:Wf,togglePlay:Gf,seek:Kf,getSeek:qf,volume:Jf,duration:Yf,playing:Xf,on:Zf,off:Qf,destroy:$f,formatTime:Vf},ep=`http://localhost:3000`;function tp(e){return e?e.startsWith(`http`)?e:`${ep}${e}`:``}var np=Es(`player`,()=>{let e=I(null),t=I(!1),n=I(0),r=I(0),i=I(80),a=I(null),o=I(null),s=G(()=>$.formatTime(n.value)),c=G(()=>$.formatTime(r.value));function l(i){if(!i)return;e.value=i,n.value=0,r.value=0,t.value=!1,g();let a=tp(i.audioUrl);$.load(a),$.on(`play`,()=>{t.value=!0}),$.on(`pause`,()=>{t.value=!1}),$.on(`end`,()=>{t.value=!1,g(),o.value&&o.value()}),$.on(`error`,()=>{t.value=!1})}function u(e){o.value=e}function d(){e.value&&($.playing()?($.pause(),g()):($.play(),h()))}function f(){e.value&&($.play(),h())}function p(e){$.seek(e),n.value=e}function m(e){i.value=e,$.volume(e)}function h(){g(),a.value=setInterval(()=>{$.playing()&&(n.value=$.getSeek(),r.value=$.duration())},500)}function g(){a.value&&=(clearInterval(a.value),null)}function _(){g(),$.destroy(),e.value=null,t.value=!1,n.value=0,r.value=0,o.value=null}return{currentTrack:e,isPlaying:t,progress:n,duration:r,volume:i,formattedProgress:s,formattedDuration:c,setTrack:l,onEnd:u,togglePlay:d,play:f,seek:p,setVolume:m,$reset:_}}),rp=Es(`queue`,()=>{let e=I([]),t=I(-1),n=I(!1),r=I(`off`),i=G(()=>t.value<0||t.value>=e.value.length?null:e.value[t.value]);function a(n,r=0){e.value=n,t.value=r}function o(){if(e.value.length===0)return null;if(r.value===`one`)return e.value[t.value];let i;if(i=n.value?Math.floor(Math.random()*e.value.length):t.value+1,i>=e.value.length)if(r.value===`all`)i=0;else return null;return t.value=i,e.value[i]}function s(){if(e.value.length===0)return null;if(r.value===`one`)return e.value[t.value];let i;if(i=n.value?Math.floor(Math.random()*e.value.length):t.value-1,i<0)if(r.value===`all`)i=e.value.length-1;else return null;return t.value=i,e.value[i]}function c(){n.value=!n.value}function l(){let e=[`off`,`all`,`one`];r.value=e[(e.indexOf(r.value)+1)%e.length]}function u(){e.value=[],t.value=-1,n.value=!1,r.value=`off`}return{queue:e,currentIndex:t,shuffle:n,repeat:r,currentTrack:i,setQueue:a,nextTrack:o,prevTrack:s,toggleShuffle:c,cycleRepeat:l,$reset:u}}),ip={class:`bg-noctune-teal px-4 py-3 flex items-center justify-between border-b-4 border-black`},ap={class:`flex items-center gap-4`},op={class:`flex-1 max-w-md mx-8 relative`},sp={class:`relative`},cp={key:0,class:`absolute top-full mt-2 left-0 right-0 bg-white border-2 border-black rounded-lg shadow-[4px_4px_0px_0px_#000] max-h-96 overflow-y-auto z-50`},lp={key:0,class:`p-2`},up=[`onClick`],dp={class:`w-8 h-8 bg-gray-300 rounded border border-black flex-shrink-0 overflow-hidden`},fp=[`src`],pp={class:`min-w-0 flex-1`},mp={class:`text-sm font-medium text-black truncate`},hp={class:`text-xs text-gray-500`},gp={key:1,class:`p-2 border-t border-gray-200`},_p=[`onClick`],vp={key:2,class:`p-4 text-center text-gray-500 text-sm`},yp={class:`flex items-center gap-4`},bp={class:`w-8 h-8 rounded-full bg-noctune-dark overflow-hidden border-2 border-black`},xp=[`src`],Sp={key:1,class:`w-full h-full flex items-center justify-center`},Cp={__name:`AppHeader`,setup(e){let t=Ol(),n=If(),r=np(),i=rp(),a=I(``),o=I(null),s=null;function c(){if(clearTimeout(s),!a.value.trim()){o.value=null;return}s=setTimeout(async()=>{try{let{data:e}=await Q.get(`/search?q=${encodeURIComponent(a.value)}`);e.success&&(o.value=e.data)}catch{o.value=null}},300)}function l(){a.value=``,o.value=null}function u(e){l(),i.setQueue([e],0),r.setTrack(e),r.play()}function d(){t.push(`/library`)}return(e,r)=>{let i=wr(`router-link`);return z(),B(`header`,ip,[V(`div`,ap,[H(i,{to:`/home`,class:`text-black font-bold text-2xl tracking-wider font-mono`},{default:Ln(()=>[...r[1]||=[U(`NOCTUNE`,-1)]]),_:1})]),V(`div`,op,[V(`div`,sp,[r[2]||=V(`div`,{class:`absolute inset-y-0 left-3 flex items-center pointer-events-none`},[V(`svg`,{class:`w-5 h-5 text-gray-500`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z`})])],-1),Rn(V(`input`,{type:`text`,"onUpdate:modelValue":r[0]||=e=>a.value=e,onInput:c,onKeydown:Vo(l,[`escape`]),placeholder:`Search music, artist, album...`,class:`w-full bg-noctune-cream py-2 pl-10 pr-4 rounded-full text-sm focus:outline-none focus:ring-2 focus:ring-black`},null,544),[[Eo,a.value]])]),o.value&&a.value?(z(),B(`div`,cp,[o.value.tracks?.length?(z(),B(`div`,lp,[r[3]||=V(`p`,{class:`text-xs font-bold text-gray-500 px-2 py-1`},`TRACKS`,-1),(z(!0),B(R,null,Or(o.value.tracks.slice(0,5),e=>(z(),B(`div`,{key:e._id,onClick:t=>u(e),class:`flex items-center gap-3 px-2 py-2 hover:bg-gray-100 rounded cursor-pointer`},[V(`div`,dp,[e.coverUrl?(z(),B(`img`,{key:0,src:L(tp)(e.coverUrl),class:`w-full h-full object-cover`},null,8,fp)):W(``,!0)]),V(`div`,pp,[V(`p`,mp,j(e.title),1),V(`p`,hp,j(e.artist),1)])],8,up))),128))])):W(``,!0),o.value.artists?.length?(z(),B(`div`,gp,[r[4]||=V(`p`,{class:`text-xs font-bold text-gray-500 px-2 py-1`},`ARTISTS`,-1),(z(!0),B(R,null,Or(o.value.artists.slice(0,3),e=>(z(),B(`div`,{key:e.name,onClick:n=>L(t).push(`/home?artist=${e.name}`),class:`px-2 py-2 hover:bg-gray-100 rounded cursor-pointer text-sm font-medium text-black`},j(e.name),9,_p))),128))])):W(``,!0),!o.value.tracks?.length&&!o.value.artists?.length?(z(),B(`div`,vp,`No results found`)):W(``,!0)])):W(``,!0)]),V(`div`,yp,[V(`button`,{onClick:d,class:`text-black hover:opacity-80`},[...r[5]||=[V(`svg`,{class:`w-7 h-7`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z`})],-1)]]),H(i,{to:`/profile`,class:`text-black hover:opacity-80`},{default:Ln(()=>[V(`div`,bp,[L(n).user?.avatarUrl?(z(),B(`img`,{key:0,src:L(tp)(L(n).user.avatarUrl),class:`w-full h-full object-cover`},null,8,xp)):(z(),B(`div`,Sp,[...r[6]||=[V(`svg`,{class:`w-5 h-5 text-white`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z`})],-1)]]))])]),_:1})])])}}},wp={class:`bg-noctune-cream flex flex-col h-full`},Tp={class:`p-4 space-y-2`},Ep={class:`relative group`},Dp={class:`absolute left-0 top-full mt-1 w-56 bg-white border-2 border-black rounded-lg shadow-[4px_4px_0px_0px_#000] opacity-0 invisible group-hover:opacity-100 group-hover:visible transition-all duration-200 z-50 max-h-72 overflow-y-auto`},Op={key:0,class:`p-2`},kp=[`onClick`],Ap={class:`truncate`},jp={key:1,class:`p-4 text-center text-sm text-gray-500`},Mp={class:`border-t-2 border-gray-200 p-2`},Np={__name:`Sidebar`,setup(e){let t=kl(),n=Ol(),r=If(),i=I([]),a=e=>t.path===e,o=e=>t.path.startsWith(e);async function s(){if(r.isLoggedIn)try{let{data:e}=await Q.get(`/playlists`);e.success&&(i.value=e.data)}catch{}}async function c(){let e=prompt(`Playlist name:`);if(e?.trim())try{let{data:t}=await Q.post(`/playlists`,{name:e.trim()});t.success&&i.value.push(t.data)}catch{}}return mr(s),(e,t)=>{let s=wr(`router-link`);return z(),B(`aside`,wp,[V(`nav`,Tp,[H(s,{to:`/home`,class:A([`flex items-center gap-3 px-4 py-3 rounded-lg font-bold text-black hover:bg-noctune-teal/20 transition-colors`,{"bg-noctune-teal text-black":a(`/home`)}])},{default:Ln(()=>[...t[0]||=[V(`svg`,{class:`w-6 h-6`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z`})],-1),V(`span`,{class:`tracking-wide`},`HOME`,-1)]]),_:1},8,[`class`]),H(s,{to:`/library`,class:A([`flex items-center gap-3 px-4 py-3 rounded-lg font-bold text-black hover:bg-noctune-teal/20 transition-colors`,{"bg-noctune-teal text-black":a(`/library`)}])},{default:Ln(()=>[...t[1]||=[V(`svg`,{class:`w-6 h-6`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M3 13h2v-2H3v2zm0 4h2v-2H3v2zm0-8h2V7H3v2zm4 4h14v-2H7v2zm0 4h14v-2H7v2zM7 7v2h14V7H7z`})],-1),V(`span`,{class:`tracking-wide`},`LIBRARY`,-1)]]),_:1},8,[`class`]),V(`div`,Ep,[H(s,{to:`/playlist`,class:A([`flex items-center gap-3 px-4 py-3 rounded-lg font-bold text-black hover:bg-noctune-teal/20 transition-colors`,{"bg-noctune-teal text-black":a(`/playlist`)||o(`/playlist/`)}])},{default:Ln(()=>[...t[2]||=[V(`svg`,{class:`w-6 h-6`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M3 10h11v2H3v-2zm0-4h11v2H3V6zm0 8h7v2H3v-2zm13-1v8l6-4-6-4z`})],-1),V(`span`,{class:`tracking-wide`},`PLAYLIST`,-1),V(`svg`,{class:`w-4 h-4 ml-auto text-gray-500 group-hover:rotate-180 transition-transform`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M7 10l5 5 5-5z`})],-1)]]),_:1},8,[`class`]),V(`div`,Dp,[i.value.length?(z(),B(`div`,Op,[(z(!0),B(R,null,Or(i.value,e=>(z(),B(`div`,{key:e._id,onClick:t=>L(n).push(`/playlist/${e._id}`),class:`flex items-center gap-2 px-3 py-2 rounded-lg cursor-pointer hover:bg-noctune-teal/20 transition-colors text-sm font-medium text-black`},[t[3]||=V(`svg`,{class:`w-4 h-4 flex-shrink-0 text-gray-500`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M3 10h11v2H3v-2zm0-4h11v2H3V6zm0 8h7v2H3v-2zm13-1v8l6-4-6-4z`})],-1),V(`span`,Ap,j(e.name),1)],8,kp))),128))])):(z(),B(`div`,jp,`No playlists yet`)),V(`div`,Mp,[H(s,{to:`/playlist`,class:`block px-3 py-2 rounded-lg text-sm font-bold text-noctune-teal hover:bg-noctune-teal/20 transition-colors text-center`},{default:Ln(()=>[...t[4]||=[U(` Browse All Playlists `,-1)]]),_:1})])])]),L(r).isAdmin?(z(),Zi(s,{key:0,to:`/admin/tracks`,class:A([`flex items-center gap-3 px-4 py-3 rounded-lg font-bold text-black hover:bg-noctune-orange/20 transition-colors`,{"bg-noctune-orange text-black":a(`/admin/tracks`)}])},{default:Ln(()=>[...t[5]||=[V(`svg`,{class:`w-6 h-6`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm-3 17l-4-4 1.41-1.41L11 16.17l6.59-6.59L19 11l-8 8z`})],-1),V(`span`,{class:`tracking-wide`},`UPLOAD TRACK`,-1)]]),_:1},8,[`class`])):W(``,!0)]),t[7]||=V(`div`,{class:`mx-4 border-t-2 border-gray-300 my-2`},null,-1),V(`div`,{class:`px-4`},[V(`button`,{onClick:c,class:`w-full bg-noctune-yellow border-2 border-black rounded-lg py-3 px-4 font-bold flex items-center gap-2 hover:bg-yellow-400 transition-colors`},[...t[6]||=[V(`svg`,{class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`3`,d:`M12 4v16m8-8H4`})],-1),V(`span`,{class:`tracking-wide`},`CREATE PLAYLIST`,-1)]])]),t[8]||=V(`div`,{class:`flex-1`},null,-1)])}}},Pp=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},Fp={key:0,class:`fixed bottom-0 left-0 right-0 bg-noctune-dark border-t-4 border-black z-50`},Ip={class:`flex items-center px-4 py-2 max-w-screen-2xl mx-auto`},Lp={class:`flex items-center gap-3 w-80`},Rp={class:`w-12 h-12 bg-black rounded-lg overflow-hidden flex-shrink-0 border border-white/20`},zp=[`src`],Bp={key:1,class:`w-full h-full flex items-center justify-center`},Vp={class:`min-w-0`},Hp={class:`text-sm font-bold text-white truncate`},Up={class:`text-xs text-gray-400 truncate`},Wp={class:`flex-1 flex flex-col items-center`},Gp={class:`flex items-center gap-4 mb-1`},Kp={key:0,class:`w-5 h-5 text-black`,fill:`currentColor`,viewBox:`0 0 24 24`},qp={key:1,class:`w-5 h-5 text-black ml-0.5`,fill:`currentColor`,viewBox:`0 0 24 24`},Jp={key:0,class:`absolute -top-2 -right-2 text-[9px] font-bold`},Yp={class:`flex items-center gap-3 w-full max-w-lg`},Xp={class:`text-xs text-gray-400 w-10 text-right`},Zp=[`value`,`max`],Qp={class:`text-xs text-gray-400 w-10`},$p={class:`w-80 flex items-center justify-end gap-3`},em={class:`flex items-center gap-2`},tm=[`value`],nm=Pp({__name:`PlayerBar`,setup(e){let t=np(),n=rp(),r=If(),i=I(!1);function a(){let e=n.nextTrack();e&&(t.setTrack(e),t.play())}mr(()=>{t.onEnd(a)});let o=G(()=>tp(t.currentTrack?.coverUrl));function s(e){t.seek(parseFloat(e.target.value))}function c(e){t.setVolume(parseInt(e.target.value))}function l(){let e=n.nextTrack();e&&(t.setTrack(e),t.play())}function u(){let e=n.prevTrack();e&&(t.setTrack(e),t.play())}async function d(){if(!t.currentTrack)return;let e=t.currentTrack._id||t.currentTrack.id;await r.toggleLike(e)}return Gn(()=>t.currentTrack?._id,e=>{i.value=e?r.likedTrackIds.has(e):!1},{immediate:!0}),Gn(()=>r.user?.likedTracks?.length,()=>{let e=t.currentTrack?._id;e&&(i.value=r.likedTrackIds.has(e))}),(e,r)=>L(t).currentTrack?(z(),B(`div`,Fp,[V(`div`,Ip,[V(`div`,Lp,[V(`div`,Rp,[L(t).currentTrack.coverUrl?(z(),B(`img`,{key:0,src:o.value,alt:``,class:`w-full h-full object-cover`},null,8,zp)):(z(),B(`div`,Bp,[...r[5]||=[aa(``,1)]]))]),V(`div`,Vp,[V(`p`,Hp,j(L(t).currentTrack.title),1),V(`p`,Up,j(L(t).currentTrack.artist),1)])]),V(`div`,Wp,[V(`div`,Gp,[V(`button`,{onClick:r[0]||=e=>L(n).toggleShuffle(),class:A([`text-sm transition-colors`,L(n).shuffle?`text-noctune-teal`:`text-gray-400 hover:text-white`])},[...r[6]||=[V(`svg`,{class:`w-4 h-4`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M10.59 9.17L5.41 4 4 5.41l5.17 5.17 1.42-1.41zM14.5 4l2.04 2.04L4 18.59 5.41 20 17.96 7.46 20 9.5V4h-5.5zm.33 9.41l-1.41 1.41 3.13 3.13L14.5 20H20v-5.5l-2.04 2.04-3.13-3.13z`})],-1)]],2),V(`button`,{onClick:r[1]||=e=>u(),class:`text-gray-400 hover:text-white transition-colors`},[...r[7]||=[V(`svg`,{class:`w-5 h-5`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M6 6h2v12H6zm3.5 6l8.5 6V6z`})],-1)]]),V(`button`,{onClick:r[2]||=e=>L(t).togglePlay(),class:`w-10 h-10 bg-white rounded-full flex items-center justify-center hover:scale-105 transition-transform`},[L(t).isPlaying?(z(),B(`svg`,Kp,[...r[8]||=[V(`path`,{d:`M6 19h4V5H6v14zm8-14v14h4V5h-4z`},null,-1)]])):(z(),B(`svg`,qp,[...r[9]||=[V(`path`,{d:`M8 5v14l11-7z`},null,-1)]]))]),V(`button`,{onClick:r[3]||=e=>l(),class:`text-gray-400 hover:text-white transition-colors`},[...r[10]||=[V(`svg`,{class:`w-5 h-5`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M6 18l8.5-6L6 6v12zM16 6v12h2V6h-2z`})],-1)]]),V(`button`,{onClick:r[4]||=e=>L(n).cycleRepeat(),class:A([`text-sm transition-colors`,L(n).repeat===`off`?`text-gray-400 hover:text-white`:`text-noctune-teal`,L(n).repeat===`one`?`relative`:``])},[r[11]||=V(`svg`,{class:`w-4 h-4`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M7 7h10v3l4-4-4-4v3H5v6h2V7zm10 10H7v-3l-4 4 4 4v-3h12v-6h-2v4z`})],-1),L(n).repeat===`one`?(z(),B(`span`,Jp,`1`)):W(``,!0)],2)]),V(`div`,Yp,[V(`span`,Xp,j(L(t).formattedProgress),1),V(`input`,{type:`range`,value:L(t).progress,onInput:s,min:`0`,max:L(t).duration||1,step:`0.1`,class:`flex-1 h-1 bg-gray-600 rounded-full appearance-none cursor-pointer range-player`},null,40,Zp),V(`span`,Qp,j(L(t).formattedDuration),1)])]),V(`div`,$p,[V(`button`,{onClick:d,class:`transition-colors`},[(z(),B(`svg`,{class:A([`w-5 h-5`,i.value?`fill-red-400 text-red-400`:`text-gray-400 hover:text-red-400`]),fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[...r[12]||=[V(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z`},null,-1)]],2))]),V(`div`,em,[r[13]||=V(`svg`,{class:`w-4 h-4 text-gray-400`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02z`})],-1),V(`input`,{type:`range`,value:L(t).volume,onInput:c,min:`0`,max:`100`,class:`w-20 h-1 bg-gray-600 rounded-full appearance-none cursor-pointer range-vol`},null,40,tm)])])])])):W(``,!0)}},[[`__scopeId`,`data-v-ed9db691`]]),rm={class:`min-h-screen bg-noctune-cream`},im={key:0},am={class:`flex`},om={class:`fixed top-4 right-4 z-[100] space-y-2`},sm={class:`flex items-center gap-2`},cm=[`onClick`],lm={__name:`App`,setup(e){let t=kl(),n=If(),r=Lf(),i=np(),a=G(()=>t.meta?.guest===!0||t.path===`/register`),o=G(()=>!!i.currentTrack);function s(e){return{info:`bg-noctune-teal text-black`,success:`bg-green-400 text-black`,error:`bg-red-400 text-white`}[e]||`bg-noctune-yellow text-black`}return mr(async()=>{await n.checkSession()}),(e,t)=>{let n=wr(`router-view`);return z(),B(`div`,rm,[a.value?(z(),Zi(n,{key:1})):(z(),B(`div`,im,[H(Cp,{class:`sticky top-0 z-30`}),V(`div`,am,[H(Np,{class:`fixed left-0 top-[57px] bottom-0 w-64 border-r-4 border-black overflow-y-auto z-20`}),V(`main`,{class:A([`ml-64 flex-1 min-h-[calc(100vh-57px)]`,{"pb-20":o.value}])},[H(n)],2)]),H(nm)])),V(`div`,om,[(z(!0),B(R,null,Or(L(r).toasts,e=>(z(),B(`div`,{key:e.id,class:A([`px-4 py-3 rounded-lg border-2 border-black font-bold text-sm shadow-[4px_4px_0px_0px_#000] transition-all animate-slide-in`,s(e.type)])},[V(`div`,sm,[V(`span`,null,j(e.message),1),V(`button`,{onClick:t=>L(r).dismissToast(e.id),class:`ml-2 opacity-60 hover:opacity-100`},` × `,8,cm)])],2))),128))])])}}},um={class:`min-h-screen bg-noctune-cream flex items-center justify-center p-8`},dm={class:`w-full max-w-5xl bg-noctune-teal rounded-3xl border-4 border-black overflow-hidden flex shadow-2xl`},fm={class:`w-1/2 p-12 relative`},pm={class:`absolute top-8 right-12 grid grid-cols-4 gap-1`},mm={class:`absolute top-20 right-8 grid grid-cols-4 gap-1`},hm={class:`absolute bottom-12 left-12 grid grid-cols-3 gap-1`},gm={class:`w-1/2 bg-white rounded-3xl m-4 p-10`},_m={key:0,class:`text-red-500 text-sm mb-4 font-medium`},vm={class:`mb-6`},ym={class:`flex border-2 border-black rounded-lg overflow-hidden`},bm={class:`mb-4`},xm={class:`flex border-2 border-black rounded-lg overflow-hidden`},Sm=[`type`],Cm={key:0,class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},wm={key:1,class:`w-5 h-5`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},Tm=[`disabled`],Em={key:0,class:`inline-block w-5 h-5 border-2 border-white border-t-transparent rounded-full animate-spin`},Dm={class:`text-center mt-8 text-gray-600`},Om={__name:`LoginPage`,setup(e){let t=Ol(),n=If(),r=I(``),i=I(``),a=I(!1),o=I(!1),s=I(``);async function c(){s.value=``,o.value=!0;let e=await n.login(r.value,i.value);o.value=!1,e.success?t.push(`/home`):s.value=e.message}return(e,t)=>{let n=wr(`router-link`);return z(),B(`div`,um,[V(`div`,dm,[V(`div`,fm,[V(`div`,pm,[(z(),B(R,null,Or(16,e=>V(`span`,{key:e,class:`w-2 h-2 bg-black/40 rounded-full`})),64))]),V(`div`,mm,[(z(),B(R,null,Or(12,e=>V(`span`,{key:e,class:`w-2 h-2 bg-black/40 rounded-full`})),64))]),t[3]||=V(`div`,{class:`absolute top-16 left-20 text-black/60 text-4xl font-bold`},`+`,-1),t[4]||=V(`div`,{class:`absolute bottom-24 right-20 text-black/60 text-4xl font-bold`},`+`,-1),V(`div`,hm,[(z(),B(R,null,Or(12,e=>V(`span`,{key:e,class:`w-2 h-2 bg-black/40 rounded-full`})),64))]),t[5]||=aa(`

noctune

`,1)]),V(`div`,gm,[t[16]||=V(`h2`,{class:`text-4xl font-black text-black mb-2`},`WELCOME!`,-1),t[17]||=V(`p`,{class:`text-gray-600 mb-8`},`Login to continue`,-1),s.value?(z(),B(`p`,_m,j(s.value),1)):W(``,!0),V(`div`,vm,[t[7]||=V(`label`,{class:`block text-xs font-bold text-gray-600 mb-2 tracking-wider`},`EMAIL/USERNAME`,-1),V(`div`,ym,[t[6]||=V(`div`,{class:`bg-noctune-teal p-3 border-r-2 border-black`},[V(`svg`,{class:`w-6 h-6 text-black`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z`})])],-1),Rn(V(`input`,{type:`text`,"onUpdate:modelValue":t[0]||=e=>r.value=e,onKeyup:Vo(c,[`enter`]),class:`flex-1 px-4 py-3 focus:outline-none text-black`,placeholder:`Enter your email`},null,544),[[Eo,r.value]])])]),V(`div`,bm,[t[11]||=V(`label`,{class:`block text-xs font-bold text-gray-600 mb-2 tracking-wider`},`PASSWORD`,-1),V(`div`,xm,[t[10]||=V(`div`,{class:`bg-amber-200 p-3 border-r-2 border-black`},[V(`svg`,{class:`w-6 h-6 text-black`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zm-6 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm3.1-9H8.9V6c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2z`})])],-1),Rn(V(`input`,{type:a.value?`text`:`password`,"onUpdate:modelValue":t[1]||=e=>i.value=e,onKeyup:Vo(c,[`enter`]),class:`flex-1 px-4 py-3 focus:outline-none text-black`,placeholder:`Enter your password`},null,40,Sm),[[Po,i.value]]),V(`button`,{onClick:t[2]||=e=>a.value=!a.value,class:`px-4 text-gray-500 hover:text-gray-700`},[a.value?(z(),B(`svg`,wm,[...t[9]||=[V(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M15 12a3 3 0 11-6 0 3 3 0 016 0z`},null,-1),V(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z`},null,-1)]])):(z(),B(`svg`,Cm,[...t[8]||=[V(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21`},null,-1)]]))])])]),t[18]||=V(`div`,{class:`text-right mb-6`},[V(`a`,{href:`#`,class:`text-sm text-gray-600 hover:text-black`},`Forgot password?`)],-1),V(`button`,{onClick:c,disabled:o.value,class:`w-full bg-noctune-orange border-2 border-black rounded-lg py-4 font-bold text-white text-xl flex items-center justify-center gap-3 hover:bg-orange-600 transition-colors disabled:opacity-50`},[o.value?(z(),B(`span`,Em)):(z(),B(R,{key:1},[t[12]||=V(`div`,{class:`bg-white/20 rounded p-1`},[V(`svg`,{class:`w-5 h-5`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z`})])],-1),t[13]||=U(` LOGIN `,-1)],64))],8,Tm),t[19]||=aa(`
OR SIGN IN WITH
`,2),V(`p`,Dm,[t[15]||=U(` Don't have an account yet? `,-1),H(n,{to:`/register`,class:`text-noctune-orange font-bold hover:underline`},{default:Ln(()=>[...t[14]||=[U(`Register now`,-1)]]),_:1})])])])])}}},km={class:`min-h-screen bg-noctune-cream flex items-center justify-center p-8`},Am={class:`w-full max-w-5xl bg-noctune-teal rounded-3xl border-4 border-black overflow-hidden flex shadow-2xl`},jm={class:`w-1/2 p-12 relative`},Mm={class:`absolute top-8 right-12 grid grid-cols-4 gap-1`},Nm={class:`w-1/2 bg-white rounded-3xl m-4 p-10`},Pm={key:0,class:`text-red-500 text-sm mb-4 font-medium`},Fm={class:`mb-4`},Im={class:`mb-4`},Lm={class:`mb-4`},Rm={class:`mb-6`},zm=[`disabled`],Bm={key:0,class:`inline-block w-5 h-5 border-2 border-white border-t-transparent rounded-full animate-spin`},Vm={key:1},Hm={class:`text-center mt-6 text-gray-600`},Um={__name:`RegisterPage`,setup(e){let t=Ol(),n=If(),r=I(``),i=I(``),a=I(``),o=I(``),s=I(!1),c=I(``);async function l(){c.value=``,s.value=!0;let e=await n.register({name:r.value,username:i.value,email:a.value,password:o.value});s.value=!1,e.success?t.push(`/home`):c.value=e.message}return(e,t)=>{let n=wr(`router-link`);return z(),B(`div`,km,[V(`div`,Am,[V(`div`,jm,[V(`div`,Mm,[(z(),B(R,null,Or(16,e=>V(`span`,{key:e,class:`w-2 h-2 bg-black/40 rounded-full`})),64))]),t[4]||=aa(`

noctune

`,1)]),V(`div`,Nm,[t[11]||=V(`h2`,{class:`text-4xl font-black text-black mb-2`},`JOIN US!`,-1),t[12]||=V(`p`,{class:`text-gray-600 mb-6`},`Create your account`,-1),c.value?(z(),B(`p`,Pm,j(c.value),1)):W(``,!0),V(`div`,Fm,[t[5]||=V(`label`,{class:`block text-xs font-bold text-gray-600 mb-2 tracking-wider`},`NAME`,-1),Rn(V(`input`,{type:`text`,"onUpdate:modelValue":t[0]||=e=>r.value=e,class:`w-full border-2 border-black rounded-lg px-4 py-3 focus:outline-none text-black`,placeholder:`Your name`},null,512),[[Eo,r.value]])]),V(`div`,Im,[t[6]||=V(`label`,{class:`block text-xs font-bold text-gray-600 mb-2 tracking-wider`},`USERNAME`,-1),Rn(V(`input`,{type:`text`,"onUpdate:modelValue":t[1]||=e=>i.value=e,class:`w-full border-2 border-black rounded-lg px-4 py-3 focus:outline-none text-black`,placeholder:`Choose a username`},null,512),[[Eo,i.value]])]),V(`div`,Lm,[t[7]||=V(`label`,{class:`block text-xs font-bold text-gray-600 mb-2 tracking-wider`},`EMAIL`,-1),Rn(V(`input`,{type:`email`,"onUpdate:modelValue":t[2]||=e=>a.value=e,class:`w-full border-2 border-black rounded-lg px-4 py-3 focus:outline-none text-black`,placeholder:`Enter your email`},null,512),[[Eo,a.value]])]),V(`div`,Rm,[t[8]||=V(`label`,{class:`block text-xs font-bold text-gray-600 mb-2 tracking-wider`},`PASSWORD`,-1),Rn(V(`input`,{type:`password`,"onUpdate:modelValue":t[3]||=e=>o.value=e,class:`w-full border-2 border-black rounded-lg px-4 py-3 focus:outline-none text-black`,placeholder:`Create a password`},null,512),[[Eo,o.value]])]),V(`button`,{onClick:l,disabled:s.value,class:`w-full bg-noctune-orange border-2 border-black rounded-lg py-4 font-bold text-white text-xl flex items-center justify-center gap-3 hover:bg-orange-600 transition-colors disabled:opacity-50`},[s.value?(z(),B(`span`,Bm)):(z(),B(`span`,Vm,`REGISTER`))],8,zm),V(`p`,Hm,[t[10]||=U(` Already have an account? `,-1),H(n,{to:`/`,class:`text-noctune-orange font-bold hover:underline`},{default:Ln(()=>[...t[9]||=[U(`Login`,-1)]]),_:1})])])])])}}},Wm={class:`p-8`},Gm={key:0,class:`text-center py-12 text-gray-500`},Km={key:1,class:`grid grid-cols-4 gap-4`},qm=[`onClick`],Jm={class:`aspect-square bg-gray-300 relative overflow-hidden`},Ym=[`src`],Xm={class:`absolute inset-0 bg-black/0 group-hover:bg-black/20 transition-colors flex items-center justify-center`},Zm={key:0,class:`w-6 h-6 text-black`,fill:`currentColor`,viewBox:`0 0 24 24`},Qm={key:1,class:`w-6 h-6 ml-1 text-black`,fill:`currentColor`,viewBox:`0 0 24 24`},$m={class:`p-3`},eh={class:`flex items-center justify-between`},th={class:`flex-1 min-w-0`},nh={class:`text-sm font-bold text-black truncate`},rh={class:`text-xs text-gray-500 truncate`},ih=[`onClick`],ah={__name:`LandingPage`,setup(e){let t=np(),n=rp(),r=If(),i=I([]),a=I(!0);function o(e){return t.currentTrack?._id===e._id}function s(e){return r.likedTrackIds?.has(e._id)}function c(e){if(o(e)){t.togglePlay();return}let r=i.value.findIndex(t=>t._id===e._id);n.setQueue(i.value,r),t.setTrack(e),t.play()}function l(){i.value.length&&c(i.value[0])}async function u(e){await r.toggleLike(e._id)}return mr(async()=>{try{let{data:e}=await Q.get(`/tracks`);e.success&&(i.value=e.data)}catch{}finally{a.value=!1}}),(e,n)=>(z(),B(`div`,Wm,[V(`div`,{class:`flex items-start gap-8 mb-12`},[V(`div`,{class:`flex-1`},[n[1]||=V(`h1`,{class:`text-5xl font-black text-black leading-tight mb-2`},[U(`MUSIC`),V(`br`),U(`THAT HITS`)],-1),n[2]||=V(`div`,{class:`inline-block bg-noctune-orange px-4 py-2 mb-4 border-b-4 border-black`},[V(`span`,{class:`text-4xl font-black text-black`},`DIFFERENT.`)],-1),n[3]||=V(`p`,{class:`text-gray-600 mb-6`},`You Vibe. Your sound. Only on Noctune.`,-1),V(`div`,{class:`flex gap-4`},[V(`button`,{onClick:l,class:`bg-noctune-yellow border-2 border-black px-6 py-3 font-bold hover:bg-yellow-400 transition-colors rounded-lg`},`PLAY NOW`),n[0]||=V(`button`,{class:`bg-gray-200 border-2 border-black px-6 py-3 font-bold hover:bg-gray-300 transition-colors rounded-lg`},`EXPLORE`,-1)])]),n[4]||=V(`div`,{class:`w-80 h-80 rounded-2xl overflow-hidden border-4 border-black flex-shrink-0`},[V(`img`,{src:`https://images.unsplash.com/photo-1470225620780-dba8ba36b745?w=400&h=400&fit=crop`,alt:`Music illustration`,class:`w-full h-full object-cover`})],-1)]),V(`section`,null,[n[8]||=V(`h2`,{class:`text-2xl font-black text-black mb-6 flex items-center`},[U(` TRENDING NOW `),V(`svg`,{class:`w-5 h-5 ml-2`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z`})])],-1),a.value?(z(),B(`div`,Gm,`Loading tracks...`)):(z(),B(`div`,Km,[(z(!0),B(R,null,Or(i.value,e=>(z(),B(`div`,{key:e._id,onClick:t=>c(e),class:`bg-white rounded-2xl border-2 border-black overflow-hidden hover:scale-[1.02] transition-transform cursor-pointer group`},[V(`div`,Jm,[e.coverUrl?(z(),B(`img`,{key:0,src:L(tp)(e.coverUrl),class:`w-full h-full object-cover`},null,8,Ym)):W(``,!0),V(`div`,Xm,[V(`div`,{class:A([`w-12 h-12 rounded-full flex items-center justify-center border-2 border-black opacity-0 group-hover:opacity-100 transition-opacity`,o(e)?`bg-white`:`bg-noctune-yellow`])},[o(e)&&L(t).isPlaying?(z(),B(`svg`,Zm,[...n[5]||=[V(`path`,{d:`M6 19h4V5H6v14zm8-14v14h4V5h-4z`},null,-1)]])):(z(),B(`svg`,Qm,[...n[6]||=[V(`path`,{d:`M8 5v14l11-7z`},null,-1)]]))],2)])]),V(`div`,$m,[V(`div`,eh,[V(`div`,th,[V(`p`,nh,j(e.title),1),V(`p`,rh,j(e.artist),1)]),V(`button`,{onClick:zo(t=>u(e),[`stop`]),class:`ml-2 flex-shrink-0`},[(z(),B(`svg`,{class:A([`w-5 h-5`,s(e)?`fill-red-400 text-red-400`:`text-gray-400 hover:text-red-400`]),fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[...n[7]||=[V(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z`},null,-1)]],2))],8,ih)])])],8,qm))),128))]))])]))}},oh={class:`p-8`},sh={class:`mb-12`},ch={key:0,class:`text-center py-12 text-gray-500`},lh={key:1,class:`text-center py-12`},uh={key:2,class:`grid grid-cols-4 gap-6`},dh=[`onClick`],fh={class:`aspect-square bg-gray-300 relative overflow-hidden`},ph=[`src`],mh={key:0,class:`w-5 h-5 text-black`,fill:`currentColor`,viewBox:`0 0 24 24`},hh={key:1,class:`w-5 h-5 ml-0.5 text-black`,fill:`currentColor`,viewBox:`0 0 24 24`},gh={class:`p-3`},_h={class:`text-sm font-bold text-black truncate`},vh={class:`text-xs text-gray-500 truncate`},yh={key:0,class:`text-center py-8 text-gray-500`},bh={key:1,class:`bg-white rounded-2xl border-4 border-black overflow-hidden`},xh={class:`divide-y divide-gray-200`},Sh=[`onClick`],Ch={class:`flex-1 flex items-center gap-3`},wh={class:`text-sm text-gray-400 w-6`},Th={key:0,class:`w-4 h-4 text-noctune-teal inline`,fill:`currentColor`,viewBox:`0 0 24 24`},Eh={key:1},Dh={class:`w-10 h-10 rounded-lg flex-shrink-0 overflow-hidden bg-gray-300 border border-black`},Oh=[`src`],kh={class:`w-40 text-center text-gray-600 text-sm truncate`},Ah={class:`w-32 text-center text-gray-600 text-sm truncate`},jh=[`onClick`],Mh={__name:`LibraryPage`,setup(e){let t=np(),n=rp(),r=If(),i=I([]),a=I([]),o=I(!0),s=I(!0);function c(e){return t.currentTrack?._id===e._id}function l(e){return r.likedTrackIds?.has(e._id)}function u(e,r=!1,o){if(c(e)){t.togglePlay();return}let s=r?i.value:a.value,l=o??s.findIndex(t=>t._id===e._id);n.setQueue(s,l),t.setTrack(e),t.play()}async function d(e){let t=l(e);await r.toggleLike(e._id),t&&(i.value=i.value.filter(t=>t._id!==e._id))}return mr(async()=>{try{let{data:e}=await Q.get(`/tracks/liked`);e.success&&(i.value=e.data||[])}catch{}finally{o.value=!1}try{let{data:e}=await Q.get(`/tracks`);e.success&&(a.value=e.data)}catch{}finally{s.value=!1}}),(e,n)=>{let r=wr(`router-link`);return z(),B(`div`,oh,[V(`section`,sh,[n[4]||=V(`h2`,{class:`text-3xl font-black text-black mb-6`},`Liked Tracks`,-1),o.value?(z(),B(`div`,ch,`Loading...`)):i.value.length===0?(z(),B(`div`,lh,[n[1]||=V(`p`,{class:`text-gray-500 mb-4`},`No liked tracks yet`,-1),H(r,{to:`/home`,class:`bg-noctune-yellow border-2 border-black px-6 py-3 font-bold inline-block hover:bg-yellow-400 transition-colors rounded-lg`},{default:Ln(()=>[...n[0]||=[U(`Discover Music`,-1)]]),_:1})])):(z(),B(`div`,uh,[(z(!0),B(R,null,Or(i.value,e=>(z(),B(`div`,{key:e._id,onClick:t=>u(e,!0),class:`group cursor-pointer bg-white rounded-2xl border-2 border-black overflow-hidden hover:scale-[1.02] transition-transform`},[V(`div`,fh,[e.coverUrl?(z(),B(`img`,{key:0,src:L(tp)(e.coverUrl),class:`w-full h-full object-cover`},null,8,ph)):W(``,!0),V(`div`,{class:A([`absolute bottom-2 right-2 w-10 h-10 rounded-full flex items-center justify-center border-2 border-black opacity-0 group-hover:opacity-100 transition-opacity`,c(e)?`bg-white`:`bg-noctune-yellow`])},[c(e)&&L(t).isPlaying?(z(),B(`svg`,mh,[...n[2]||=[V(`path`,{d:`M6 19h4V5H6v14zm8-14v14h4V5h-4z`},null,-1)]])):(z(),B(`svg`,hh,[...n[3]||=[V(`path`,{d:`M8 5v14l11-7z`},null,-1)]]))],2)]),V(`div`,gh,[V(`p`,_h,j(e.title),1),V(`p`,vh,j(e.artist),1)])],8,dh))),128))]))]),V(`section`,null,[n[8]||=V(`h2`,{class:`text-2xl font-black text-black mb-6 flex items-center`},[U(` All Tracks `),V(`svg`,{class:`w-5 h-5 ml-2`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z`})])],-1),s.value?(z(),B(`div`,yh,`Loading...`)):(z(),B(`div`,bh,[n[7]||=aa(`
TITLEARTISTALBUM
`,1),V(`div`,xh,[(z(!0),B(R,null,Or(a.value,(e,r)=>(z(),B(`div`,{key:e._id,onClick:t=>u(e,!1,r),class:`px-6 py-3 flex items-center hover:bg-gray-50 transition-colors cursor-pointer`},[V(`div`,Ch,[V(`span`,wh,[c(e)&&L(t).isPlaying?(z(),B(`svg`,Th,[...n[5]||=[V(`path`,{d:`M6 19h4V5H6v14zm8-14v14h4V5h-4z`},null,-1)]])):(z(),B(`span`,Eh,j(r+1),1))]),V(`div`,Dh,[e.coverUrl?(z(),B(`img`,{key:0,src:L(tp)(e.coverUrl),class:`w-full h-full object-cover`},null,8,Oh)):W(``,!0)]),V(`span`,{class:A([`font-medium text-sm truncate`,c(e)?`text-noctune-teal`:`text-black`])},j(e.title),3)]),V(`span`,kh,j(e.artist),1),V(`span`,Ah,j(e.album),1),V(`button`,{onClick:zo(t=>d(e),[`stop`]),class:`w-12 flex justify-center transition-colors`},[(z(),B(`svg`,{class:A([`w-5 h-5`,l(e)?`fill-red-400 text-red-400`:`text-gray-400 hover:text-red-400`]),fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[...n[6]||=[V(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z`},null,-1)]],2))],8,jh)],8,Sh))),128))])]))])])}}},Nh={class:`p-8`},Ph={key:0,class:`text-center py-20 text-gray-500`},Fh={class:`flex items-start gap-8 mb-8`},Ih={class:`w-56 h-56 rounded-2xl overflow-hidden border-4 border-black flex-shrink-0 bg-black`},Lh=[`src`],Rh={key:1,class:`w-full h-full flex items-center justify-center`},zh={class:`flex-1`},Bh={class:`text-4xl font-black text-black mb-4 leading-tight`},Vh={key:0,class:`text-gray-600 mb-4`},Hh={class:`flex items-center gap-3 text-gray-600 mb-6`},Uh={class:`font-medium`},Wh={class:`flex gap-4`},Gh=[`disabled`],Kh={class:`bg-white rounded-2xl border-4 border-black overflow-hidden`},qh={class:`divide-y divide-gray-200`},Jh=[`onClick`],Yh={class:`w-12 text-center`},Xh={key:0,class:`w-4 h-4 text-noctune-teal mx-auto`,fill:`currentColor`,viewBox:`0 0 24 24`},Zh={key:1,class:`text-gray-500`},Qh={class:`flex-1 flex items-center gap-4`},$h={class:`w-12 h-12 rounded-lg flex-shrink-0 overflow-hidden bg-gray-300 border border-black`},eg=[`src`],tg={class:`w-48 text-center text-gray-600 text-sm truncate`},ng=[`onClick`],rg={key:0,class:`p-8 text-center text-gray-500`},ig={key:2,class:`text-center py-20 text-gray-500`},ag={__name:`PlaylistPage`,setup(e){let t=kl(),n=np(),r=rp(),i=If(),a=I(null),o=I(!0);function s(e){return n.currentTrack?._id===e._id}function c(e){return i.likedTrackIds?.has(e._id)}function l(e){if(!a.value?.tracks?.length)return;let t=a.value.tracks[e];if(s(t)){n.togglePlay();return}let i=a.value.tracks;r.setQueue(i,e),n.setTrack(t),n.play()}function u(){a.value?.tracks?.length&&l(0)}async function d(e){await i.toggleLike(e._id)}return mr(async()=>{let e=t.params.id;try{if(e){let{data:t}=await Q.get(`/playlists/${e}`);t.success&&(a.value=t.data)}else{let{data:e}=await Q.get(`/playlists`);if(e.success&&e.data.length){let{data:t}=await Q.get(`/playlists/${e.data[0]._id}`);t.success&&(a.value=t.data)}else a.value={name:`My Playlist`,tracks:[]}}}catch{a.value=null}finally{o.value=!1}}),(e,t)=>(z(),B(`div`,Nh,[o.value?(z(),B(`div`,Ph,`Loading playlist...`)):a.value?(z(),B(R,{key:1},[V(`div`,Fh,[V(`div`,Ih,[a.value.coverUrl?(z(),B(`img`,{key:0,src:L(tp)(a.value.coverUrl),class:`w-full h-full object-cover`},null,8,Lh)):(z(),B(`div`,Rh,[...t[0]||=[aa(``,1)]]))]),V(`div`,zh,[t[2]||=V(`span`,{class:`inline-block bg-noctune-teal text-black text-xs font-bold px-3 py-1 rounded mb-3 border border-black`},`PLAYLIST`,-1),V(`h1`,Bh,j(a.value.name),1),a.value.description?(z(),B(`p`,Vh,j(a.value.description),1)):W(``,!0),V(`div`,Hh,[V(`span`,Uh,j(a.value.tracks?.length||0)+` songs`,1)]),V(`div`,Wh,[V(`button`,{onClick:u,disabled:!a.value.tracks?.length,class:`bg-noctune-teal border-2 border-black px-6 py-2 font-bold flex items-center gap-2 rounded-lg hover:bg-teal-600 transition-colors disabled:opacity-50`},[...t[1]||=[V(`svg`,{class:`w-4 h-4`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M8 5v14l11-7z`})],-1),U(` PLAY `,-1)]],8,Gh)])])]),V(`div`,Kh,[t[5]||=aa(`
#TITLEARTIST
`,1),V(`div`,qh,[(z(!0),B(R,null,Or(a.value.tracks,(e,r)=>(z(),B(`div`,{key:e._id,onClick:e=>l(r),class:`px-6 py-3 flex items-center hover:bg-gray-50 transition-colors cursor-pointer`},[V(`span`,Yh,[s(e)&&L(n).isPlaying?(z(),B(`svg`,Xh,[...t[3]||=[V(`path`,{d:`M6 19h4V5H6v14zm8-14v14h4V5h-4z`},null,-1)]])):(z(),B(`span`,Zh,j(r+1),1))]),V(`div`,Qh,[V(`div`,$h,[e.coverUrl?(z(),B(`img`,{key:0,src:L(tp)(e.coverUrl),class:`w-full h-full object-cover`},null,8,eg)):W(``,!0)]),V(`span`,{class:A([`font-medium text-sm truncate`,s(e)?`text-noctune-teal`:`text-black`])},j(e.title),3)]),V(`span`,tg,j(e.artist),1),V(`button`,{onClick:zo(t=>d(e),[`stop`]),class:`w-12 flex justify-center transition-colors`},[(z(),B(`svg`,{class:A([`w-5 h-5`,c(e)?`fill-red-400 text-red-400`:`text-gray-400 hover:text-red-400`]),fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[...t[4]||=[V(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z`},null,-1)]],2))],8,ng)],8,Jh))),128)),a.value.tracks?.length?W(``,!0):(z(),B(`div`,rg,`No tracks in this playlist yet`))])])],64)):(z(),B(`div`,ig,`Playlist not found`))]))}},og={class:`p-8`},sg={class:`bg-white rounded-2xl border-4 border-black p-6 mb-6 flex items-center gap-8`},cg={class:`w-40 h-40 rounded-full border-4 border-black overflow-hidden flex-shrink-0 bg-gray-300`},lg=[`src`],ug={key:1,class:`w-full h-full flex items-center justify-center`},dg={class:`flex-1`},fg={class:`text-3xl font-black text-black mb-1`},pg={class:`text-gray-600 mb-3`},mg={class:`inline-flex items-center gap-2 border-2 border-noctune-orange text-noctune-orange px-3 py-1 rounded-full mb-4`},hg={class:`text-sm font-medium`},gg={class:`flex gap-4`},_g={key:0,class:`bg-white rounded-2xl border-4 border-black p-6 mb-6`},vg={key:0,class:`text-red-500 text-sm mb-4`},yg={key:1,class:`text-green-600 text-sm mb-4`},bg={class:`space-y-4 max-w-md`},xg=[`disabled`],Sg={key:0,class:`inline-block w-4 h-4 border-2 border-black border-t-transparent rounded-full animate-spin mr-1`},Cg={class:`bg-white rounded-2xl border-4 border-black p-6 mb-6 flex justify-center gap-12`},wg={class:`flex items-center gap-4`},Tg={class:`text-2xl font-black text-black`},Eg={__name:`ProfilePage`,setup(e){let t=Ol(),n=If(),r=I(!1),i=I(``),a=I(``),o=I(``),s=I(null),c=I(!1),l=I(``),u=I(``),d=I(0),f=G(()=>n.user?.name||n.user?.username||`User`);function p(){r.value=!r.value,r.value&&(i.value=n.user?.name||``,a.value=n.user?.username||``,o.value=n.user?.email||``,s.value=null,l.value=``,u.value=``)}function m(e){s.value=e.target.files[0]||null}async function h(){l.value=``,u.value=``,c.value=!0;try{let e=new FormData;e.append(`name`,i.value),e.append(`username`,a.value),e.append(`email`,o.value),s.value&&e.append(`avatar`,s.value);let t=await n.updateProfile(e);t.success?(u.value=`Profile updated!`,setTimeout(()=>{r.value=!1},1500)):l.value=t.message}catch{l.value=`Update failed`}finally{c.value=!1}}async function g(){await n.logout(),t.push(`/`)}return mr(async()=>{try{let{data:e}=await Q.get(`/tracks/liked`);e.success&&(d.value=e.data.likedTracks?.length||0)}catch{}}),(e,t)=>(z(),B(`div`,og,[V(`div`,sg,[V(`div`,cg,[L(n).user?.avatarUrl?(z(),B(`img`,{key:0,src:L(tp)(L(n).user.avatarUrl),alt:`Profile`,class:`w-full h-full object-cover`},null,8,lg)):(z(),B(`div`,ug,[...t[3]||=[V(`svg`,{class:`w-16 h-16 text-gray-400`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z`})],-1)]]))]),V(`div`,dg,[V(`h1`,fg,j(f.value),1),V(`p`,pg,`@`+j(L(n).user?.username||`username`),1),V(`div`,mg,[t[4]||=V(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z`})],-1),V(`span`,hg,j(L(n).user?.role===`admin`?`Admin`:`Premium Member`),1)]),V(`div`,gg,[V(`button`,{onClick:p,class:`border-2 border-black px-4 py-2 rounded-lg font-medium flex items-center gap-2 hover:bg-gray-100 transition-colors`},[t[5]||=V(`svg`,{class:`w-4 h-4`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z`})],-1),U(` `+j(r.value?`Cancel`:`Edit Profile`),1)])])])]),r.value?(z(),B(`div`,_g,[t[11]||=V(`h3`,{class:`text-xl font-black text-black mb-4`},`Edit Profile`,-1),l.value?(z(),B(`p`,vg,j(l.value),1)):W(``,!0),u.value?(z(),B(`p`,yg,j(u.value),1)):W(``,!0),V(`div`,bg,[V(`div`,null,[t[6]||=V(`label`,{class:`block text-xs font-bold text-gray-600 mb-1`},`NAME`,-1),Rn(V(`input`,{type:`text`,"onUpdate:modelValue":t[0]||=e=>i.value=e,class:`w-full border-2 border-black rounded-lg px-4 py-2 focus:outline-none text-black`},null,512),[[Eo,i.value]])]),V(`div`,null,[t[7]||=V(`label`,{class:`block text-xs font-bold text-gray-600 mb-1`},`USERNAME`,-1),Rn(V(`input`,{type:`text`,"onUpdate:modelValue":t[1]||=e=>a.value=e,class:`w-full border-2 border-black rounded-lg px-4 py-2 focus:outline-none text-black`},null,512),[[Eo,a.value]])]),V(`div`,null,[t[8]||=V(`label`,{class:`block text-xs font-bold text-gray-600 mb-1`},`EMAIL`,-1),Rn(V(`input`,{type:`email`,"onUpdate:modelValue":t[2]||=e=>o.value=e,class:`w-full border-2 border-black rounded-lg px-4 py-2 focus:outline-none text-black`},null,512),[[Eo,o.value]])]),V(`div`,null,[t[9]||=V(`label`,{class:`block text-xs font-bold text-gray-600 mb-1`},`AVATAR`,-1),V(`input`,{type:`file`,accept:`image/*`,onChange:m,class:`w-full text-sm`},null,32)]),V(`button`,{onClick:h,disabled:c.value,class:`bg-noctune-teal border-2 border-black px-6 py-2 font-bold rounded-lg hover:bg-teal-600 transition-colors disabled:opacity-50`},[c.value?(z(),B(`span`,Sg)):W(``,!0),t[10]||=U(` Save Changes `,-1)],8,xg)])])):W(``,!0),V(`div`,Cg,[V(`div`,wg,[t[13]||=V(`div`,{class:`w-14 h-14 bg-noctune-orange rounded-xl flex items-center justify-center border-2 border-black`},[V(`svg`,{class:`w-7 h-7 text-white`,fill:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{d:`M12 3v10.55c-.59-.34-1.27-.55-2-.55-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4V7h4V3h-6z`})])],-1),V(`div`,null,[V(`p`,Tg,j(d.value),1),t[12]||=V(`p`,{class:`text-sm text-gray-500`},`Liked Songs`,-1)])])]),V(`button`,{onClick:g,class:`w-full bg-noctune-orange border-4 border-black rounded-2xl py-4 font-bold text-black flex items-center justify-center gap-3 hover:bg-orange-600 transition-colors`},[...t[14]||=[V(`svg`,{class:`w-6 h-6`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[V(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1`})],-1),U(` Logout `,-1)]])]))}},Dg={class:`min-h-screen bg-noctune-cream flex flex-col`},Og={class:`flex flex-1`},kg={class:`flex-1 p-8 overflow-auto`},Ag={class:`max-w-2xl mx-auto`},jg={key:0,class:`text-red-500 text-sm mb-4 font-medium`},Mg={key:1,class:`text-green-600 text-sm mb-4 font-medium`},Ng={class:`bg-white rounded-2xl border-4 border-black p-8 space-y-6`},Pg=[`src`],Fg={key:1,class:`text-gray-500`},Ig={key:0,class:`text-black font-medium`},Lg={key:1,class:`text-gray-500`},Rg=[`disabled`],zg={key:0,class:`inline-block w-5 h-5 border-2 border-white border-t-transparent rounded-full animate-spin mr-2`},Bg=[{path:`/`,name:`Login`,component:Om,meta:{guest:!0}},{path:`/register`,name:`Register`,component:Um,meta:{guest:!0}},{path:`/home`,name:`Home`,component:ah,meta:{auth:!0}},{path:`/library`,name:`Library`,component:Mh,meta:{auth:!0}},{path:`/playlist`,name:`Playlist`,component:ag,meta:{auth:!0}},{path:`/playlist/:id`,name:`PlaylistDetail`,component:ag,meta:{auth:!0}},{path:`/profile`,name:`Profile`,component:Eg,meta:{auth:!0}},{path:`/admin/tracks`,name:`AdminTracks`,component:{__name:`AdminPage`,setup(e){let t=Ol(),n=I(``),r=I(``),i=I(``),a=I(``),o=I(null),s=I(``),c=I(null),l=I(!1),u=I(``),d=I(``),f=I(null),p=I(null);function m(e){let t=e.target.files[0];t&&(o.value=t,s.value=URL.createObjectURL(t))}function h(e){let t=e.target.files[0];t&&(c.value=t)}async function g(){if(u.value=``,d.value=``,!n.value||!r.value||!i.value||!a.value||!o.value||!c.value){u.value=`All fields are required`;return}l.value=!0;try{let e=new FormData;e.append(`title`,n.value),e.append(`artist`,r.value),e.append(`album`,i.value),e.append(`genre`,a.value),e.append(`cover`,o.value),e.append(`audio`,c.value);let{data:l}=await Q.post(`/admin/tracks`,e,{headers:{"Content-Type":`multipart/form-data`}});l.success&&(d.value=`Track uploaded successfully!`,n.value=``,r.value=``,i.value=``,a.value=``,o.value=null,s.value=``,c.value=null,setTimeout(()=>t.push(`/home`),1500))}catch(e){u.value=e.response?.data?.message||`Upload failed`}finally{l.value=!1}}return(e,t)=>(z(),B(`div`,Dg,[V(`div`,Og,[V(`main`,kg,[V(`div`,Ag,[t[12]||=V(`h1`,{class:`text-4xl font-black text-black mb-2`},`Upload Track`,-1),t[13]||=V(`p`,{class:`text-gray-600 mb-8`},`Add a new track to the library`,-1),u.value?(z(),B(`p`,jg,j(u.value),1)):W(``,!0),d.value?(z(),B(`p`,Mg,j(d.value),1)):W(``,!0),V(`div`,Ng,[V(`div`,null,[t[6]||=V(`label`,{class:`block text-xs font-bold text-gray-600 mb-2 tracking-wider`},`TITLE`,-1),Rn(V(`input`,{type:`text`,"onUpdate:modelValue":t[0]||=e=>n.value=e,class:`w-full border-2 border-black rounded-lg px-4 py-3 focus:outline-none text-black`,placeholder:`Track title`},null,512),[[Eo,n.value]])]),V(`div`,null,[t[7]||=V(`label`,{class:`block text-xs font-bold text-gray-600 mb-2 tracking-wider`},`ARTIST`,-1),Rn(V(`input`,{type:`text`,"onUpdate:modelValue":t[1]||=e=>r.value=e,class:`w-full border-2 border-black rounded-lg px-4 py-3 focus:outline-none text-black`,placeholder:`Artist name`},null,512),[[Eo,r.value]])]),V(`div`,null,[t[8]||=V(`label`,{class:`block text-xs font-bold text-gray-600 mb-2 tracking-wider`},`ALBUM`,-1),Rn(V(`input`,{type:`text`,"onUpdate:modelValue":t[2]||=e=>i.value=e,class:`w-full border-2 border-black rounded-lg px-4 py-3 focus:outline-none text-black`,placeholder:`Album name`},null,512),[[Eo,i.value]])]),V(`div`,null,[t[9]||=V(`label`,{class:`block text-xs font-bold text-gray-600 mb-2 tracking-wider`},`GENRE`,-1),Rn(V(`input`,{type:`text`,"onUpdate:modelValue":t[3]||=e=>a.value=e,class:`w-full border-2 border-black rounded-lg px-4 py-3 focus:outline-none text-black`,placeholder:`e.g. Pop, Rock, Jazz`},null,512),[[Eo,a.value]])]),V(`div`,null,[t[10]||=V(`label`,{class:`block text-xs font-bold text-gray-600 mb-2 tracking-wider`},`COVER IMAGE`,-1),V(`div`,{class:`border-2 border-dashed border-black rounded-lg p-6 text-center cursor-pointer hover:bg-gray-50`,onClick:t[4]||=e=>f.value.click()},[s.value?(z(),B(`img`,{key:0,src:s.value,class:`w-32 h-32 object-cover mx-auto mb-2 rounded-lg border-2 border-black`},null,8,Pg)):(z(),B(`p`,Fg,`Click to upload cover image`)),V(`input`,{ref_key:`coverInput`,ref:f,type:`file`,accept:`image/*`,onChange:m,class:`hidden`},null,544)])]),V(`div`,null,[t[11]||=V(`label`,{class:`block text-xs font-bold text-gray-600 mb-2 tracking-wider`},`AUDIO FILE`,-1),V(`div`,{class:`border-2 border-dashed border-black rounded-lg p-6 text-center cursor-pointer hover:bg-gray-50`,onClick:t[5]||=e=>p.value.click()},[c.value?(z(),B(`p`,Ig,j(c.value.name),1)):(z(),B(`p`,Lg,` Click to upload audio file (MP3, WAV, FLAC) `)),V(`input`,{ref_key:`audioInput`,ref:p,type:`file`,accept:`.mp3,.wav,.flac`,onChange:h,class:`hidden`},null,544)])]),V(`button`,{onClick:g,disabled:l.value,class:`w-full bg-noctune-orange border-2 border-black rounded-lg py-4 font-bold text-white text-xl hover:bg-orange-600 transition-colors disabled:opacity-50`},[l.value?(z(),B(`span`,zg)):W(``,!0),U(` `+j(l.value?`Uploading...`:`UPLOAD TRACK`),1)],8,Rg)])])])])]))}},meta:{auth:!0,admin:!0}}],Vg=Dl({history:qc(),routes:Bg});Vg.beforeEach((e,t,n)=>{let r=If();if(e.meta.admin&&!r.isAdmin)return n(`/home`);if(e.meta.auth&&!r.isLoggedIn)return n(`/`);if(e.meta.guest&&r.isLoggedIn)return n(`/home`);n()});var Hg=Go(lm),Ug=fs();Hg.use(Ug),Hg.use(Vg),If(Ug).checkSession().finally(()=>{Hg.mount(`#app`)}); \ No newline at end of file diff --git a/dist/assets/index-3bN2l3Ol.css b/dist/assets/index-eqvJxEw1.css similarity index 99% rename from dist/assets/index-3bN2l3Ol.css rename to dist/assets/index-eqvJxEw1.css index 77de414..d7106ee 100644 --- a/dist/assets/index-3bN2l3Ol.css +++ b/dist/assets/index-eqvJxEw1.css @@ -1 +1 @@ -.range-player[data-v-e17af23f]::-webkit-slider-thumb{-webkit-appearance:none;cursor:pointer;background:#fff;border-radius:50%;width:12px;height:12px}.range-vol[data-v-e17af23f]::-webkit-slider-thumb{-webkit-appearance:none;cursor:pointer;background:#fff;border-radius:50%;width:12px;height:12px}.animate-slide-in{animation:.3s ease-out slideIn}@keyframes slideIn{0%{opacity:0;transform:translate(100%)}to{opacity:1;transform:translate(0)}}*,:before,:after,::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border:0 solid #e5e7eb}:before,:after{--tw-content:""}html,:host{-webkit-text-size-adjust:100%;tab-size:4;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent;font-family:Inter,system-ui,sans-serif;line-height:1.5}body{line-height:inherit;margin:0}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-feature-settings:normal;font-variation-settings:normal;font-family:Space Mono,monospace;font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-feature-settings:inherit;font-variation-settings:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:#0000;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{margin:0;padding:0;list-style:none}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder{opacity:1;color:#9ca3af}textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.pointer-events-none{pointer-events:none}.invisible{visibility:hidden}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-y-0{top:0;bottom:0}.-right-2{right:-.5rem}.-top-2{top:-.5rem}.bottom-0{bottom:0}.bottom-12{bottom:3rem}.bottom-2{bottom:.5rem}.bottom-24{bottom:6rem}.left-0{left:0}.left-12{left:3rem}.left-20{left:5rem}.left-3{left:.75rem}.right-0{right:0}.right-12{right:3rem}.right-2{right:.5rem}.right-20{right:5rem}.right-4{right:1rem}.right-8{right:2rem}.top-0{top:0}.top-16{top:4rem}.top-20{top:5rem}.top-4{top:1rem}.top-8{top:2rem}.top-\[57px\]{top:57px}.top-full{top:100%}.z-20{z-index:20}.z-30{z-index:30}.z-50{z-index:50}.z-\[100\]{z-index:100}.m-4{margin:1rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-8{margin-left:2rem;margin-right:2rem}.mx-auto{margin-left:auto;margin-right:auto}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.mb-1{margin-bottom:.25rem}.mb-12{margin-bottom:3rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-0\.5{margin-left:.125rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-64{margin-left:16rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.aspect-square{aspect-ratio:1}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-24{height:6rem}.h-32{height:8rem}.h-4{height:1rem}.h-40{height:10rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-56{height:14rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-80{height:20rem}.h-full{height:100%}.max-h-72{max-height:18rem}.max-h-96{max-height:24rem}.min-h-\[calc\(100vh-57px\)\]{min-height:calc(100vh - 57px)}.min-h-screen{min-height:100vh}.w-1\/2{width:50%}.w-10{width:2.5rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-20{width:5rem}.w-32{width:8rem}.w-4{width:1rem}.w-40{width:10rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-80{width:20rem}.w-full{width:100%}.min-w-0{min-width:0}.max-w-2xl{max-width:42rem}.max-w-5xl{max-width:64rem}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-screen-2xl{max-width:1536px}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.transform{transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:1s linear infinite spin}.cursor-pointer{cursor:pointer}.appearance-none{appearance:none}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.flex-col{flex-direction:column}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-12{gap:3rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(229 231 235/var(--tw-divide-opacity,1))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-2{border-width:2px}.border-4{border-width:4px}.border-b{border-bottom-width:1px}.border-b-4{border-bottom-width:4px}.border-r-2{border-right-width:2px}.border-r-4{border-right-width:4px}.border-t{border-top-width:1px}.border-t-2{border-top-width:2px}.border-t-4{border-top-width:4px}.border-dashed{border-style:dashed}.border-black{--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1))}.border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.border-noctune-orange{--tw-border-opacity:1;border-color:rgb(255 107 53/var(--tw-border-opacity,1))}.border-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity,1))}.border-white\/20{border-color:#fff3}.border-t-transparent{border-top-color:#0000}.bg-amber-200{--tw-bg-opacity:1;background-color:rgb(253 230 138/var(--tw-bg-opacity,1))}.bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.bg-black\/0{background-color:#0000}.bg-black\/30{background-color:#0000004d}.bg-black\/40{background-color:#0006}.bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.bg-gray-300{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity,1))}.bg-gray-600{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.bg-green-400{--tw-bg-opacity:1;background-color:rgb(74 222 128/var(--tw-bg-opacity,1))}.bg-noctune-cream{--tw-bg-opacity:1;background-color:rgb(245 240 220/var(--tw-bg-opacity,1))}.bg-noctune-dark{--tw-bg-opacity:1;background-color:rgb(26 26 26/var(--tw-bg-opacity,1))}.bg-noctune-orange{--tw-bg-opacity:1;background-color:rgb(255 107 53/var(--tw-bg-opacity,1))}.bg-noctune-teal{--tw-bg-opacity:1;background-color:rgb(26 155 143/var(--tw-bg-opacity,1))}.bg-noctune-yellow{--tw-bg-opacity:1;background-color:rgb(255 215 0/var(--tw-bg-opacity,1))}.bg-red-400{--tw-bg-opacity:1;background-color:rgb(248 113 113/var(--tw-bg-opacity,1))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-white\/20{background-color:#fff3}.fill-red-400{fill:#f87171}.object-cover{-o-object-fit:cover;object-fit:cover}.p-1{padding:.25rem}.p-10{padding:2.5rem}.p-12{padding:3rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-20{padding-top:5rem;padding-bottom:5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-20{padding-bottom:5rem}.pl-10{padding-left:2.5rem}.pr-4{padding-right:1rem}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:Space Mono,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-5xl{font-size:3rem;line-height:1}.text-\[9px\]{font-size:9px}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-black{font-weight:900}.font-bold{font-weight:700}.font-medium{font-weight:500}.leading-tight{line-height:1.25}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.text-black\/60{color:#0009}.text-black\/70{color:#000000b3}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity,1))}.text-noctune-dark{--tw-text-opacity:1;color:rgb(26 26 26/var(--tw-text-opacity,1))}.text-noctune-orange{--tw-text-opacity:1;color:rgb(255 107 53/var(--tw-text-opacity,1))}.text-noctune-teal{--tw-text-opacity:1;color:rgb(26 155 143/var(--tw-text-opacity,1))}.text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-white\/60{color:#fff9}.opacity-0{opacity:0}.opacity-60{opacity:.6}.shadow-2xl{--tw-shadow:0 25px 50px -12px #00000040;--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.shadow-\[4px_4px_0px_0px_\#000\]{--tw-shadow:4px 4px 0px 0px #000;--tw-shadow-colored:4px 4px 0px 0px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-all{transition-property:all;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-opacity{transition-property:opacity;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-transform{transition-property:transform;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-200{transition-duration:.2s}*{box-sizing:border-box}body{margin:0;padding:0;font-family:Inter,system-ui,sans-serif}input[type=range]{appearance:none;background:#1a1a1a;border-radius:3px;height:6px}input[type=range]::-webkit-slider-thumb{appearance:none;cursor:pointer;background:#1a1a1a;border-radius:50%;width:14px;height:14px}input[type=range]::-moz-range-thumb{cursor:pointer;background:#1a1a1a;border:none;border-radius:50%;width:14px;height:14px}.hover\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:scale-\[1\.02\]:hover{--tw-scale-x:1.02;--tw-scale-y:1.02;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.hover\:bg-gray-300:hover{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity,1))}.hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.hover\:bg-noctune-orange\/20:hover{background-color:#ff6b3533}.hover\:bg-noctune-teal\/20:hover{background-color:#1a9b8f33}.hover\:bg-orange-600:hover{--tw-bg-opacity:1;background-color:rgb(234 88 12/var(--tw-bg-opacity,1))}.hover\:bg-teal-600:hover{--tw-bg-opacity:1;background-color:rgb(13 148 136/var(--tw-bg-opacity,1))}.hover\:bg-yellow-400:hover{--tw-bg-opacity:1;background-color:rgb(250 204 21/var(--tw-bg-opacity,1))}.hover\:text-black:hover{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.hover\:text-red-400:hover{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.hover\:text-white:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.hover\:opacity-70:hover{opacity:.7}.hover\:opacity-80:hover{opacity:.8}.focus\:outline-none:focus{outline-offset:2px;outline:2px solid #0000}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000)}.focus\:ring-black:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity,1))}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:visible{visibility:visible}.group:hover .group-hover\:rotate-180{--tw-rotate:180deg;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:bg-black\/20{background-color:#0003}.group:hover .group-hover\:opacity-100{opacity:1} +.range-player[data-v-ed9db691]::-webkit-slider-thumb{-webkit-appearance:none;cursor:pointer;background:#fff;border-radius:50%;width:12px;height:12px}.range-vol[data-v-ed9db691]::-webkit-slider-thumb{-webkit-appearance:none;cursor:pointer;background:#fff;border-radius:50%;width:12px;height:12px}.animate-slide-in{animation:.3s ease-out slideIn}@keyframes slideIn{0%{opacity:0;transform:translate(100%)}to{opacity:1;transform:translate(0)}}*,:before,:after,::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border:0 solid #e5e7eb}:before,:after{--tw-content:""}html,:host{-webkit-text-size-adjust:100%;tab-size:4;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent;font-family:Inter,system-ui,sans-serif;line-height:1.5}body{line-height:inherit;margin:0}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-feature-settings:normal;font-variation-settings:normal;font-family:Space Mono,monospace;font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-feature-settings:inherit;font-variation-settings:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:#0000;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{margin:0;padding:0;list-style:none}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder{opacity:1;color:#9ca3af}textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.pointer-events-none{pointer-events:none}.invisible{visibility:hidden}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-y-0{top:0;bottom:0}.-right-2{right:-.5rem}.-top-2{top:-.5rem}.bottom-0{bottom:0}.bottom-12{bottom:3rem}.bottom-2{bottom:.5rem}.bottom-24{bottom:6rem}.left-0{left:0}.left-12{left:3rem}.left-20{left:5rem}.left-3{left:.75rem}.right-0{right:0}.right-12{right:3rem}.right-2{right:.5rem}.right-20{right:5rem}.right-4{right:1rem}.right-8{right:2rem}.top-0{top:0}.top-16{top:4rem}.top-20{top:5rem}.top-4{top:1rem}.top-8{top:2rem}.top-\[57px\]{top:57px}.top-full{top:100%}.z-20{z-index:20}.z-30{z-index:30}.z-50{z-index:50}.z-\[100\]{z-index:100}.m-4{margin:1rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-8{margin-left:2rem;margin-right:2rem}.mx-auto{margin-left:auto;margin-right:auto}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.mb-1{margin-bottom:.25rem}.mb-12{margin-bottom:3rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-0\.5{margin-left:.125rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-64{margin-left:16rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.aspect-square{aspect-ratio:1}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-24{height:6rem}.h-32{height:8rem}.h-4{height:1rem}.h-40{height:10rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-56{height:14rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-80{height:20rem}.h-full{height:100%}.max-h-72{max-height:18rem}.max-h-96{max-height:24rem}.min-h-\[calc\(100vh-57px\)\]{min-height:calc(100vh - 57px)}.min-h-screen{min-height:100vh}.w-1\/2{width:50%}.w-10{width:2.5rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-20{width:5rem}.w-32{width:8rem}.w-4{width:1rem}.w-40{width:10rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-80{width:20rem}.w-full{width:100%}.min-w-0{min-width:0}.max-w-2xl{max-width:42rem}.max-w-5xl{max-width:64rem}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-screen-2xl{max-width:1536px}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.transform{transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:1s linear infinite spin}.cursor-pointer{cursor:pointer}.appearance-none{appearance:none}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.flex-col{flex-direction:column}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-12{gap:3rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(229 231 235/var(--tw-divide-opacity,1))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-2{border-width:2px}.border-4{border-width:4px}.border-b{border-bottom-width:1px}.border-b-4{border-bottom-width:4px}.border-r-2{border-right-width:2px}.border-r-4{border-right-width:4px}.border-t{border-top-width:1px}.border-t-2{border-top-width:2px}.border-t-4{border-top-width:4px}.border-dashed{border-style:dashed}.border-black{--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1))}.border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.border-noctune-orange{--tw-border-opacity:1;border-color:rgb(255 107 53/var(--tw-border-opacity,1))}.border-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity,1))}.border-white\/20{border-color:#fff3}.border-t-transparent{border-top-color:#0000}.bg-amber-200{--tw-bg-opacity:1;background-color:rgb(253 230 138/var(--tw-bg-opacity,1))}.bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.bg-black\/0{background-color:#0000}.bg-black\/30{background-color:#0000004d}.bg-black\/40{background-color:#0006}.bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.bg-gray-300{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity,1))}.bg-gray-600{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.bg-green-400{--tw-bg-opacity:1;background-color:rgb(74 222 128/var(--tw-bg-opacity,1))}.bg-noctune-cream{--tw-bg-opacity:1;background-color:rgb(245 240 220/var(--tw-bg-opacity,1))}.bg-noctune-dark{--tw-bg-opacity:1;background-color:rgb(26 26 26/var(--tw-bg-opacity,1))}.bg-noctune-orange{--tw-bg-opacity:1;background-color:rgb(255 107 53/var(--tw-bg-opacity,1))}.bg-noctune-teal{--tw-bg-opacity:1;background-color:rgb(26 155 143/var(--tw-bg-opacity,1))}.bg-noctune-yellow{--tw-bg-opacity:1;background-color:rgb(255 215 0/var(--tw-bg-opacity,1))}.bg-red-400{--tw-bg-opacity:1;background-color:rgb(248 113 113/var(--tw-bg-opacity,1))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-white\/20{background-color:#fff3}.fill-red-400{fill:#f87171}.object-cover{-o-object-fit:cover;object-fit:cover}.p-1{padding:.25rem}.p-10{padding:2.5rem}.p-12{padding:3rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-20{padding-top:5rem;padding-bottom:5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-20{padding-bottom:5rem}.pl-10{padding-left:2.5rem}.pr-4{padding-right:1rem}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:Space Mono,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-5xl{font-size:3rem;line-height:1}.text-\[9px\]{font-size:9px}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-black{font-weight:900}.font-bold{font-weight:700}.font-medium{font-weight:500}.leading-tight{line-height:1.25}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.text-black\/60{color:#0009}.text-black\/70{color:#000000b3}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity,1))}.text-noctune-dark{--tw-text-opacity:1;color:rgb(26 26 26/var(--tw-text-opacity,1))}.text-noctune-orange{--tw-text-opacity:1;color:rgb(255 107 53/var(--tw-text-opacity,1))}.text-noctune-teal{--tw-text-opacity:1;color:rgb(26 155 143/var(--tw-text-opacity,1))}.text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-white\/60{color:#fff9}.opacity-0{opacity:0}.opacity-60{opacity:.6}.shadow-2xl{--tw-shadow:0 25px 50px -12px #00000040;--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.shadow-\[4px_4px_0px_0px_\#000\]{--tw-shadow:4px 4px 0px 0px #000;--tw-shadow-colored:4px 4px 0px 0px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-all{transition-property:all;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-opacity{transition-property:opacity;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-transform{transition-property:transform;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-200{transition-duration:.2s}*{box-sizing:border-box}body{margin:0;padding:0;font-family:Inter,system-ui,sans-serif}input[type=range]{appearance:none;background:#1a1a1a;border-radius:3px;height:6px}input[type=range]::-webkit-slider-thumb{appearance:none;cursor:pointer;background:#1a1a1a;border-radius:50%;width:14px;height:14px}input[type=range]::-moz-range-thumb{cursor:pointer;background:#1a1a1a;border:none;border-radius:50%;width:14px;height:14px}.hover\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:scale-\[1\.02\]:hover{--tw-scale-x:1.02;--tw-scale-y:1.02;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.hover\:bg-gray-300:hover{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity,1))}.hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.hover\:bg-noctune-orange\/20:hover{background-color:#ff6b3533}.hover\:bg-noctune-teal\/20:hover{background-color:#1a9b8f33}.hover\:bg-orange-600:hover{--tw-bg-opacity:1;background-color:rgb(234 88 12/var(--tw-bg-opacity,1))}.hover\:bg-teal-600:hover{--tw-bg-opacity:1;background-color:rgb(13 148 136/var(--tw-bg-opacity,1))}.hover\:bg-yellow-400:hover{--tw-bg-opacity:1;background-color:rgb(250 204 21/var(--tw-bg-opacity,1))}.hover\:text-black:hover{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.hover\:text-red-400:hover{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.hover\:text-white:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.hover\:opacity-70:hover{opacity:.7}.hover\:opacity-80:hover{opacity:.8}.focus\:outline-none:focus{outline-offset:2px;outline:2px solid #0000}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000)}.focus\:ring-black:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity,1))}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:visible{visibility:visible}.group:hover .group-hover\:rotate-180{--tw-rotate:180deg;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:bg-black\/20{background-color:#0003}.group:hover .group-hover\:opacity-100{opacity:1} diff --git a/dist/index.html b/dist/index.html index 1eb34e7..49ed1fe 100644 --- a/dist/index.html +++ b/dist/index.html @@ -6,8 +6,8 @@ Noctune - Music That Hits Different - - + +
diff --git a/src/components/AppHeader.vue b/src/components/AppHeader.vue index 3178550..fa36f97 100644 --- a/src/components/AppHeader.vue +++ b/src/components/AppHeader.vue @@ -60,6 +60,7 @@ import { useAuthStore } from '../stores/authStore.js' import { usePlayerStore } from '../stores/playerStore.js' import { useQueueStore } from '../stores/queueStore.js' import api from '../lib/api.js' +import { formatUrl } from '../lib/utils.js' const router = useRouter() const authStore = useAuthStore() @@ -70,11 +71,6 @@ const query = ref('') const searchResults = ref(null) let searchTimeout = null -function formatUrl(url) { - if (!url) return '' - return url.startsWith('http') ? url : `http://localhost:3001${url}` -} - function onSearch() { clearTimeout(searchTimeout) if (!query.value.trim()) { diff --git a/src/components/PlayerBar.vue b/src/components/PlayerBar.vue index 1e73406..50a972b 100644 --- a/src/components/PlayerBar.vue +++ b/src/components/PlayerBar.vue @@ -59,6 +59,7 @@ import { ref, computed, watch, onMounted } from 'vue' import { usePlayerStore } from '../stores/playerStore.js' import { useQueueStore } from '../stores/queueStore.js' import { useAuthStore } from '../stores/authStore.js' +import { formatUrl } from '../lib/utils.js' const playerStore = usePlayerStore() const queueStore = useQueueStore() @@ -78,11 +79,7 @@ onMounted(() => { playerStore.onEnd(onTrackEnd) }) -const coverSrc = computed(() => { - const url = playerStore.currentTrack?.coverUrl - if (!url) return '' - return url.startsWith('http') ? url : `http://localhost:3001${url}` -}) +const coverSrc = computed(() => formatUrl(playerStore.currentTrack?.coverUrl)) function onSeek(e) { playerStore.seek(parseFloat(e.target.value)) diff --git a/src/lib/utils.js b/src/lib/utils.js new file mode 100644 index 0000000..fdd37f0 --- /dev/null +++ b/src/lib/utils.js @@ -0,0 +1,6 @@ +const SERVER_URL = import.meta.env.VITE_SERVER_URL || 'http://localhost:3000' + +export function formatUrl(url) { + if (!url) return '' + return url.startsWith('http') ? url : `${SERVER_URL}${url}` +} diff --git a/src/stores/authStore.js b/src/stores/authStore.js index ee5d4fa..b8d814f 100644 --- a/src/stores/authStore.js +++ b/src/stores/authStore.js @@ -14,7 +14,7 @@ export const useAuthStore = defineStore('auth', () => { async function checkSession() { try { const { data } = await api.get('/auth/me') - if (data.success) user.value = data.data + if (data.success) user.value = data.data.user } catch { user.value = null } diff --git a/src/stores/playerStore.js b/src/stores/playerStore.js index 17ee58a..7bb698d 100644 --- a/src/stores/playerStore.js +++ b/src/stores/playerStore.js @@ -1,6 +1,7 @@ import { defineStore } from 'pinia' import { ref, computed } from 'vue' import audioEngine from '../lib/audioEngine.js' +import { formatUrl } from '../lib/utils.js' export const usePlayerStore = defineStore('player', () => { const currentTrack = ref(null) @@ -22,9 +23,7 @@ export const usePlayerStore = defineStore('player', () => { isPlaying.value = false stopSeekInterval() - const audioUrl = track.audioUrl.startsWith('http') - ? track.audioUrl - : `http://localhost:3001${track.audioUrl}` + const audioUrl = formatUrl(track.audioUrl) audioEngine.load(audioUrl) audioEngine.on('play', () => { isPlaying.value = true }) diff --git a/src/views/LandingPage.vue b/src/views/LandingPage.vue index 321bd71..9ee4bea 100644 --- a/src/views/LandingPage.vue +++ b/src/views/LandingPage.vue @@ -61,6 +61,7 @@ import { usePlayerStore } from '../stores/playerStore.js' import { useQueueStore } from '../stores/queueStore.js' import { useAuthStore } from '../stores/authStore.js' import api from '../lib/api.js' +import { formatUrl } from '../lib/utils.js' const playerStore = usePlayerStore() const queueStore = useQueueStore() @@ -69,11 +70,6 @@ const authStore = useAuthStore() const tracks = ref([]) const loading = ref(true) -function formatUrl(url) { - if (!url) return '' - return url.startsWith('http') ? url : `http://localhost:3001${url}` -} - function isCurrentTrack(track) { return playerStore.currentTrack?._id === track._id } diff --git a/src/views/LibraryPage.vue b/src/views/LibraryPage.vue index 0275e41..b2052da 100644 --- a/src/views/LibraryPage.vue +++ b/src/views/LibraryPage.vue @@ -74,6 +74,7 @@ import { usePlayerStore } from '../stores/playerStore.js' import { useQueueStore } from '../stores/queueStore.js' import { useAuthStore } from '../stores/authStore.js' import api from '../lib/api.js' +import { formatUrl } from '../lib/utils.js' const playerStore = usePlayerStore() const queueStore = useQueueStore() @@ -84,11 +85,6 @@ const allTracks = ref([]) const loading = ref(true) const allLoading = ref(true) -function formatUrl(url) { - if (!url) return '' - return url.startsWith('http') ? url : `http://localhost:3001${url}` -} - function isCurrentTrack(track) { return playerStore.currentTrack?._id === track._id } diff --git a/src/views/PlaylistPage.vue b/src/views/PlaylistPage.vue index 47d6205..6f62ffb 100644 --- a/src/views/PlaylistPage.vue +++ b/src/views/PlaylistPage.vue @@ -82,6 +82,7 @@ import { usePlayerStore } from '../stores/playerStore.js' import { useQueueStore } from '../stores/queueStore.js' import { useAuthStore } from '../stores/authStore.js' import api from '../lib/api.js' +import { formatUrl } from '../lib/utils.js' const route = useRoute() const playerStore = usePlayerStore() @@ -91,11 +92,6 @@ const authStore = useAuthStore() const playlist = ref(null) const loading = ref(true) -function formatUrl(url) { - if (!url) return '' - return url.startsWith('http') ? url : `http://localhost:3001${url}` -} - function isCurrentTrack(track) { return playerStore.currentTrack?._id === track._id } diff --git a/src/views/ProfilePage.vue b/src/views/ProfilePage.vue index 1e58c50..561ad13 100644 --- a/src/views/ProfilePage.vue +++ b/src/views/ProfilePage.vue @@ -76,6 +76,7 @@ import { ref, computed, onMounted } from 'vue' import { useRouter } from 'vue-router' import { useAuthStore } from '../stores/authStore.js' import api from '../lib/api.js' +import { formatUrl } from '../lib/utils.js' const router = useRouter() const authStore = useAuthStore() @@ -94,11 +95,6 @@ const userDisplayName = computed(() => { return authStore.user?.name || authStore.user?.username || 'User' }) -function formatUrl(url) { - if (!url) return '' - return url.startsWith('http') ? url : `http://localhost:3001${url}` -} - function toggleEdit() { editing.value = !editing.value if (editing.value) {