From ae187b6d75c8079da0be1dc288613bad8466fe61 Mon Sep 17 00:00:00 2001 From: RaindropsSys Date: Tue, 24 Oct 2023 17:43:37 +0200 Subject: Initial commit --- assets/.DS_Store | Bin 0 -> 10244 bytes assets/dark.css | 86 +++++++++ assets/favorites.svg | 244 ++++++++++++++++++++++++ assets/fuse.min.js | 9 + assets/icons/album.svg | 1 + assets/icons/explore.svg | 1 + assets/icons/favorite-off.svg | 1 + assets/icons/favorite-on.svg | 1 + assets/icons/favorites.svg | 1 + assets/icons/lossless.svg | 3 + assets/icons/lyrics.svg | 1 + assets/icons/next.svg | 1 + assets/icons/pause.svg | 1 + assets/icons/play.svg | 1 + assets/icons/playlist.svg | 1 + assets/icons/previous.svg | 1 + assets/icons/repeat-off.svg | 1 + assets/icons/repeat-on.svg | 1 + assets/icons/settings.svg | 1 + assets/icons/shuffle-off.svg | 1 + assets/icons/shuffle-on.svg | 1 + assets/icons/song.svg | 1 + assets/localforage.min.js | 7 + assets/logo-display.png | Bin 0 -> 18939 bytes assets/logo-display.svg | 75 ++++++++ assets/logo-round.svg | 75 ++++++++ assets/logo-transparent.svg | 61 ++++++ assets/logo.svg | 74 ++++++++ assets/native.css | 43 +++++ assets/nothing.svg | 254 +++++++++++++++++++++++++ assets/shortcuts.js | 26 +++ assets/styles.css | 432 ++++++++++++++++++++++++++++++++++++++++++ 32 files changed, 1406 insertions(+) create mode 100644 assets/.DS_Store create mode 100644 assets/dark.css create mode 100644 assets/favorites.svg create mode 100644 assets/fuse.min.js create mode 100644 assets/icons/album.svg create mode 100644 assets/icons/explore.svg create mode 100644 assets/icons/favorite-off.svg create mode 100644 assets/icons/favorite-on.svg create mode 100644 assets/icons/favorites.svg create mode 100644 assets/icons/lossless.svg create mode 100644 assets/icons/lyrics.svg create mode 100644 assets/icons/next.svg create mode 100644 assets/icons/pause.svg create mode 100644 assets/icons/play.svg create mode 100644 assets/icons/playlist.svg create mode 100644 assets/icons/previous.svg create mode 100644 assets/icons/repeat-off.svg create mode 100644 assets/icons/repeat-on.svg create mode 100644 assets/icons/settings.svg create mode 100644 assets/icons/shuffle-off.svg create mode 100644 assets/icons/shuffle-on.svg create mode 100644 assets/icons/song.svg create mode 100644 assets/localforage.min.js create mode 100644 assets/logo-display.png create mode 100644 assets/logo-display.svg create mode 100644 assets/logo-round.svg create mode 100644 assets/logo-transparent.svg create mode 100644 assets/logo.svg create mode 100644 assets/native.css create mode 100644 assets/nothing.svg create mode 100644 assets/shortcuts.js create mode 100644 assets/styles.css (limited to 'assets') diff --git a/assets/.DS_Store b/assets/.DS_Store new file mode 100644 index 0000000..eb23c80 Binary files /dev/null and b/assets/.DS_Store differ diff --git a/assets/dark.css b/assets/dark.css new file mode 100644 index 0000000..e969545 --- /dev/null +++ b/assets/dark.css @@ -0,0 +1,86 @@ +@media (prefers-color-scheme: dark) { + body.crossplatform, #loading { + background-color: black !important; + } + + body { + color: white !important; + } + + .icon { + filter: brightness(0%) invert(1) grayscale(1) !important; + } + + .navigation-item.active, .navigation-item:active { + background-color: rgba(255, 255, 255, .25) !important; + } + + .navigation-item:hover { + background-color: rgba(255, 255, 255, .1); + } + + .album:hover { + background-color: rgba(255, 255, 255, .1); + } + + #player.bg-white { + background-color: black !important; + } + + iframe#player { + border-bottom-color: rgba(255, 255, 255, .25) !important; + } + + .player-btn:hover { + background-color: rgba(255, 255, 255, .1); + } + + .player-btn:active { + background-color: rgba(255, 255, 255, .25); + } + + .desktop-player #album-art[src="/assets/nothing.svg"] { + filter: invert(1); + background-color: rgba(0, 0, 0, .1); + } + + .desktop-player #cover, .desktop-player #info { + border-color: rgba(255, 255, 255, .25) !important; + } + + .text-muted { + color: #666 !important; + } + + #filter, .list-group-item, .btn, .form-check-input, .link { + filter: invert(1) hue-rotate(180deg); + } + + .list-group-item img { + filter: invert(1) hue-rotate(180deg); + } + + .list-group-item .icon { + filter: none !important; + } + + .desktop-player #seekbar-container { + background-color: rgba(255, 255, 255, .1) !important; + } + + .desktop-player #seekbar { + background-color: rgba(255, 255, 255, .25) !important; + } + + #lyrics-synced-fade { + background-image: linear-gradient(rgba(0, 0, 0, 0) 25%, rgb(0, 0, 0) 100%) !important; + } + + #badge-hires .player-badge-desktop, #badge-cd .player-badge-desktop, #badge-lossy .player-badge-desktop { + background-color: black !important; + } + + #lyrics-outer #loading { + background-color: transparent !important; + } +} \ No newline at end of file diff --git a/assets/favorites.svg b/assets/favorites.svg new file mode 100644 index 0000000..0048092 --- /dev/null +++ b/assets/favorites.svg @@ -0,0 +1,244 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/fuse.min.js b/assets/fuse.min.js new file mode 100644 index 0000000..adc2835 --- /dev/null +++ b/assets/fuse.min.js @@ -0,0 +1,9 @@ +/** + * Fuse.js v6.6.2 - Lightweight fuzzy-search (http://fusejs.io) + * + * Copyright (c) 2022 Kiro Risk (http://kiro.me) + * All Rights Reserved. Apache Software License 2.0 + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +var e,t;e=this,t=function(){"use strict";function e(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function t(t){for(var n=1;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n0&&void 0!==arguments[0]?arguments[0]:1,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3,n=new Map,r=Math.pow(10,t);return{get:function(t){var i=t.match(C).length;if(n.has(i))return n.get(i);var o=1/Math.pow(i,.5*e),c=parseFloat(Math.round(o*r)/r);return n.set(i,c),c},clear:function(){n.clear()}}}var $=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=t.getFn,i=void 0===n?I.getFn:n,o=t.fieldNormWeight,c=void 0===o?I.fieldNormWeight:o;r(this,e),this.norm=E(c,3),this.getFn=i,this.isCreated=!1,this.setIndexRecords()}return o(e,[{key:"setSources",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.docs=e}},{key:"setIndexRecords",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.records=e}},{key:"setKeys",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.keys=t,this._keysMap={},t.forEach((function(t,n){e._keysMap[t.id]=n}))}},{key:"create",value:function(){var e=this;!this.isCreated&&this.docs.length&&(this.isCreated=!0,g(this.docs[0])?this.docs.forEach((function(t,n){e._addString(t,n)})):this.docs.forEach((function(t,n){e._addObject(t,n)})),this.norm.clear())}},{key:"add",value:function(e){var t=this.size();g(e)?this._addString(e,t):this._addObject(e,t)}},{key:"removeAt",value:function(e){this.records.splice(e,1);for(var t=e,n=this.size();t2&&void 0!==arguments[2]?arguments[2]:{},r=n.getFn,i=void 0===r?I.getFn:r,o=n.fieldNormWeight,c=void 0===o?I.fieldNormWeight:o,a=new $({getFn:i,fieldNormWeight:c});return a.setKeys(e.map(_)),a.setSources(t),a.create(),a}function R(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.errors,r=void 0===n?0:n,i=t.currentLocation,o=void 0===i?0:i,c=t.expectedLocation,a=void 0===c?0:c,s=t.distance,u=void 0===s?I.distance:s,h=t.ignoreLocation,l=void 0===h?I.ignoreLocation:h,f=r/e.length;if(l)return f;var d=Math.abs(a-o);return u?f+d/u:d?1:f}function N(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:I.minMatchCharLength,n=[],r=-1,i=-1,o=0,c=e.length;o=t&&n.push([r,i]),r=-1)}return e[o-1]&&o-r>=t&&n.push([r,o-1]),n}var P=32;function W(e){for(var t={},n=0,r=e.length;n1&&void 0!==arguments[1]?arguments[1]:{},o=i.location,c=void 0===o?I.location:o,a=i.threshold,s=void 0===a?I.threshold:a,u=i.distance,h=void 0===u?I.distance:u,l=i.includeMatches,f=void 0===l?I.includeMatches:l,d=i.findAllMatches,v=void 0===d?I.findAllMatches:d,g=i.minMatchCharLength,y=void 0===g?I.minMatchCharLength:g,p=i.isCaseSensitive,m=void 0===p?I.isCaseSensitive:p,k=i.ignoreLocation,M=void 0===k?I.ignoreLocation:k;if(r(this,e),this.options={location:c,threshold:s,distance:h,includeMatches:f,findAllMatches:v,minMatchCharLength:y,isCaseSensitive:m,ignoreLocation:M},this.pattern=m?t:t.toLowerCase(),this.chunks=[],this.pattern.length){var b=function(e,t){n.chunks.push({pattern:e,alphabet:W(e),startIndex:t})},x=this.pattern.length;if(x>P){for(var w=0,L=x%P,S=x-L;w3&&void 0!==arguments[3]?arguments[3]:{},i=r.location,o=void 0===i?I.location:i,c=r.distance,a=void 0===c?I.distance:c,s=r.threshold,u=void 0===s?I.threshold:s,h=r.findAllMatches,l=void 0===h?I.findAllMatches:h,f=r.minMatchCharLength,d=void 0===f?I.minMatchCharLength:f,v=r.includeMatches,g=void 0===v?I.includeMatches:v,y=r.ignoreLocation,p=void 0===y?I.ignoreLocation:y;if(t.length>P)throw new Error(w(P));for(var m,k=t.length,M=e.length,b=Math.max(0,Math.min(o,M)),x=u,L=b,S=d>1||g,_=S?Array(M):[];(m=e.indexOf(t,L))>-1;){var O=R(t,{currentLocation:m,expectedLocation:b,distance:a,ignoreLocation:p});if(x=Math.min(O,x),L=m+k,S)for(var j=0;j=z;q-=1){var B=q-1,J=n[e.charAt(B)];if(S&&(_[B]=+!!J),K[q]=(K[q+1]<<1|1)&J,F&&(K[q]|=(A[q+1]|A[q])<<1|1|A[q+1]),K[q]&$&&(C=R(t,{errors:F,currentLocation:B,expectedLocation:b,distance:a,ignoreLocation:p}))<=x){if(x=C,(L=B)<=b)break;z=Math.max(1,2*b-L)}}if(R(t,{errors:F+1,currentLocation:b,expectedLocation:b,distance:a,ignoreLocation:p})>x)break;A=K}var U={isMatch:L>=0,score:Math.max(.001,C)};if(S){var V=N(_,d);V.length?g&&(U.indices=V):U.isMatch=!1}return U}(e,n,i,{location:c+o,distance:a,threshold:s,findAllMatches:u,minMatchCharLength:h,includeMatches:r,ignoreLocation:l}),p=y.isMatch,m=y.score,k=y.indices;p&&(g=!0),v+=m,p&&k&&(d=[].concat(f(d),f(k)))}));var y={isMatch:g,score:g?v/this.chunks.length:1};return g&&r&&(y.indices=d),y}}]),e}(),z=function(){function e(t){r(this,e),this.pattern=t}return o(e,[{key:"search",value:function(){}}],[{key:"isMultiMatch",value:function(e){return D(e,this.multiRegex)}},{key:"isSingleMatch",value:function(e){return D(e,this.singleRegex)}}]),e}();function D(e,t){var n=e.match(t);return n?n[1]:null}var K=function(e){a(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){var t=e===this.pattern;return{isMatch:t,score:t?0:1,indices:[0,this.pattern.length-1]}}}],[{key:"type",get:function(){return"exact"}},{key:"multiRegex",get:function(){return/^="(.*)"$/}},{key:"singleRegex",get:function(){return/^=(.*)$/}}]),n}(z),q=function(e){a(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){var t=-1===e.indexOf(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}}],[{key:"type",get:function(){return"inverse-exact"}},{key:"multiRegex",get:function(){return/^!"(.*)"$/}},{key:"singleRegex",get:function(){return/^!(.*)$/}}]),n}(z),B=function(e){a(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){var t=e.startsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,this.pattern.length-1]}}}],[{key:"type",get:function(){return"prefix-exact"}},{key:"multiRegex",get:function(){return/^\^"(.*)"$/}},{key:"singleRegex",get:function(){return/^\^(.*)$/}}]),n}(z),J=function(e){a(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){var t=!e.startsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}}],[{key:"type",get:function(){return"inverse-prefix-exact"}},{key:"multiRegex",get:function(){return/^!\^"(.*)"$/}},{key:"singleRegex",get:function(){return/^!\^(.*)$/}}]),n}(z),U=function(e){a(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){var t=e.endsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[e.length-this.pattern.length,e.length-1]}}}],[{key:"type",get:function(){return"suffix-exact"}},{key:"multiRegex",get:function(){return/^"(.*)"\$$/}},{key:"singleRegex",get:function(){return/^(.*)\$$/}}]),n}(z),V=function(e){a(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){var t=!e.endsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}}],[{key:"type",get:function(){return"inverse-suffix-exact"}},{key:"multiRegex",get:function(){return/^!"(.*)"\$$/}},{key:"singleRegex",get:function(){return/^!(.*)\$$/}}]),n}(z),G=function(e){a(n,e);var t=l(n);function n(e){var i,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},c=o.location,a=void 0===c?I.location:c,s=o.threshold,u=void 0===s?I.threshold:s,h=o.distance,l=void 0===h?I.distance:h,f=o.includeMatches,d=void 0===f?I.includeMatches:f,v=o.findAllMatches,g=void 0===v?I.findAllMatches:v,y=o.minMatchCharLength,p=void 0===y?I.minMatchCharLength:y,m=o.isCaseSensitive,k=void 0===m?I.isCaseSensitive:m,M=o.ignoreLocation,b=void 0===M?I.ignoreLocation:M;return r(this,n),(i=t.call(this,e))._bitapSearch=new T(e,{location:a,threshold:u,distance:l,includeMatches:d,findAllMatches:g,minMatchCharLength:p,isCaseSensitive:k,ignoreLocation:b}),i}return o(n,[{key:"search",value:function(e){return this._bitapSearch.searchIn(e)}}],[{key:"type",get:function(){return"fuzzy"}},{key:"multiRegex",get:function(){return/^"(.*)"$/}},{key:"singleRegex",get:function(){return/^(.*)$/}}]),n}(z),H=function(e){a(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){for(var t,n=0,r=[],i=this.pattern.length;(t=e.indexOf(this.pattern,n))>-1;)n=t+i,r.push([t,n-1]);var o=!!r.length;return{isMatch:o,score:o?0:1,indices:r}}}],[{key:"type",get:function(){return"include"}},{key:"multiRegex",get:function(){return/^'"(.*)"$/}},{key:"singleRegex",get:function(){return/^'(.*)$/}}]),n}(z),Q=[K,H,B,J,V,U,q,G],X=Q.length,Y=/ +(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/;function Z(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return e.split("|").map((function(e){for(var n=e.trim().split(Y).filter((function(e){return e&&!!e.trim()})),r=[],i=0,o=n.length;i1&&void 0!==arguments[1]?arguments[1]:{},i=n.isCaseSensitive,o=void 0===i?I.isCaseSensitive:i,c=n.includeMatches,a=void 0===c?I.includeMatches:c,s=n.minMatchCharLength,u=void 0===s?I.minMatchCharLength:s,h=n.ignoreLocation,l=void 0===h?I.ignoreLocation:h,f=n.findAllMatches,d=void 0===f?I.findAllMatches:f,v=n.location,g=void 0===v?I.location:v,y=n.threshold,p=void 0===y?I.threshold:y,m=n.distance,k=void 0===m?I.distance:m;r(this,e),this.query=null,this.options={isCaseSensitive:o,includeMatches:a,minMatchCharLength:u,findAllMatches:d,ignoreLocation:l,location:g,threshold:p,distance:k},this.pattern=o?t:t.toLowerCase(),this.query=Z(this.pattern,this.options)}return o(e,[{key:"searchIn",value:function(e){var t=this.query;if(!t)return{isMatch:!1,score:1};var n=this.options,r=n.includeMatches;e=n.isCaseSensitive?e:e.toLowerCase();for(var i=0,o=[],c=0,a=0,s=t.length;a-1&&(n.refIndex=e.idx),t.matches.push(n)}}))}function ve(e,t){t.score=e.score}function ge(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.includeMatches,i=void 0===r?I.includeMatches:r,o=n.includeScore,c=void 0===o?I.includeScore:o,a=[];return i&&a.push(de),c&&a.push(ve),e.map((function(e){var n=e.idx,r={item:t[n],refIndex:n};return a.length&&a.forEach((function(t){t(e,r)})),r}))}var ye=function(){function e(n){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=arguments.length>2?arguments[2]:void 0;r(this,e),this.options=t(t({},I),i),this.options.useExtendedSearch,this._keyStore=new S(this.options.keys),this.setCollection(n,o)}return o(e,[{key:"setCollection",value:function(e,t){if(this._docs=e,t&&!(t instanceof $))throw new Error("Incorrect 'index' type");this._myIndex=t||F(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}},{key:"add",value:function(e){k(e)&&(this._docs.push(e),this._myIndex.add(e))}},{key:"remove",value:function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){return!1},t=[],n=0,r=this._docs.length;n1&&void 0!==arguments[1]?arguments[1]:{},n=t.limit,r=void 0===n?-1:n,i=this.options,o=i.includeMatches,c=i.includeScore,a=i.shouldSort,s=i.sortFn,u=i.ignoreFieldNorm,h=g(e)?g(this._docs[0])?this._searchStringList(e):this._searchObjectList(e):this._searchLogical(e);return fe(h,{ignoreFieldNorm:u}),a&&h.sort(s),y(r)&&r>-1&&(h=h.slice(0,r)),ge(h,this._docs,{includeMatches:o,includeScore:c})}},{key:"_searchStringList",value:function(e){var t=re(e,this.options),n=this._myIndex.records,r=[];return n.forEach((function(e){var n=e.v,i=e.i,o=e.n;if(k(n)){var c=t.searchIn(n),a=c.isMatch,s=c.score,u=c.indices;a&&r.push({item:n,idx:i,matches:[{score:s,value:n,norm:o,indices:u}]})}})),r}},{key:"_searchLogical",value:function(e){var t=this,n=function(e,t){var n=(arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}).auto,r=void 0===n||n,i=function e(n){var i=Object.keys(n),o=ue(n);if(!o&&i.length>1&&!se(n))return e(le(n));if(he(n)){var c=o?n[ce]:i[0],a=o?n[ae]:n[c];if(!g(a))throw new Error(x(c));var s={keyId:j(c),pattern:a};return r&&(s.searcher=re(a,t)),s}var u={children:[],operator:i[0]};return i.forEach((function(t){var r=n[t];v(r)&&r.forEach((function(t){u.children.push(e(t))}))})),u};return se(e)||(e=le(e)),i(e)}(e,this.options),r=function e(n,r,i){if(!n.children){var o=n.keyId,c=n.searcher,a=t._findMatches({key:t._keyStore.get(o),value:t._myIndex.getValueForItemAtKeyId(r,o),searcher:c});return a&&a.length?[{idx:i,item:r,matches:a}]:[]}for(var s=[],u=0,h=n.children.length;u1&&void 0!==arguments[1]?arguments[1]:{},n=t.getFn,r=void 0===n?I.getFn:n,i=t.fieldNormWeight,o=void 0===i?I.fieldNormWeight:i,c=e.keys,a=e.records,s=new $({getFn:r,fieldNormWeight:o});return s.setKeys(c),s.setIndexRecords(a),s},ye.config=I,function(){ne.push.apply(ne,arguments)}(te),ye},"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Fuse=t(); \ No newline at end of file diff --git a/assets/icons/album.svg b/assets/icons/album.svg new file mode 100644 index 0000000..1871fae --- /dev/null +++ b/assets/icons/album.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/explore.svg b/assets/icons/explore.svg new file mode 100644 index 0000000..165ebe2 --- /dev/null +++ b/assets/icons/explore.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/favorite-off.svg b/assets/icons/favorite-off.svg new file mode 100644 index 0000000..18e104c --- /dev/null +++ b/assets/icons/favorite-off.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/favorite-on.svg b/assets/icons/favorite-on.svg new file mode 100644 index 0000000..87b1d23 --- /dev/null +++ b/assets/icons/favorite-on.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/favorites.svg b/assets/icons/favorites.svg new file mode 100644 index 0000000..dc71a20 --- /dev/null +++ b/assets/icons/favorites.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/lossless.svg b/assets/icons/lossless.svg new file mode 100644 index 0000000..8138325 --- /dev/null +++ b/assets/icons/lossless.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/icons/lyrics.svg b/assets/icons/lyrics.svg new file mode 100644 index 0000000..7de6c55 --- /dev/null +++ b/assets/icons/lyrics.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/next.svg b/assets/icons/next.svg new file mode 100644 index 0000000..f352a47 --- /dev/null +++ b/assets/icons/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/pause.svg b/assets/icons/pause.svg new file mode 100644 index 0000000..d97bcb6 --- /dev/null +++ b/assets/icons/pause.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/play.svg b/assets/icons/play.svg new file mode 100644 index 0000000..b5ac393 --- /dev/null +++ b/assets/icons/play.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/playlist.svg b/assets/icons/playlist.svg new file mode 100644 index 0000000..471d3f2 --- /dev/null +++ b/assets/icons/playlist.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/previous.svg b/assets/icons/previous.svg new file mode 100644 index 0000000..854b952 --- /dev/null +++ b/assets/icons/previous.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/repeat-off.svg b/assets/icons/repeat-off.svg new file mode 100644 index 0000000..ef706ad --- /dev/null +++ b/assets/icons/repeat-off.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/repeat-on.svg b/assets/icons/repeat-on.svg new file mode 100644 index 0000000..667def9 --- /dev/null +++ b/assets/icons/repeat-on.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/settings.svg b/assets/icons/settings.svg new file mode 100644 index 0000000..759e748 --- /dev/null +++ b/assets/icons/settings.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/shuffle-off.svg b/assets/icons/shuffle-off.svg new file mode 100644 index 0000000..0eddee0 --- /dev/null +++ b/assets/icons/shuffle-off.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/shuffle-on.svg b/assets/icons/shuffle-on.svg new file mode 100644 index 0000000..d2327f6 --- /dev/null +++ b/assets/icons/shuffle-on.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/song.svg b/assets/icons/song.svg new file mode 100644 index 0000000..d365da2 --- /dev/null +++ b/assets/icons/song.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/localforage.min.js b/assets/localforage.min.js new file mode 100644 index 0000000..7403f8f --- /dev/null +++ b/assets/localforage.min.js @@ -0,0 +1,7 @@ +/*! + localForage -- Offline Storage, Improved + Version 1.10.0 + https://localforage.github.io/localForage + (c) 2013-2017 Mozilla, Apache License 2.0 +*/ +!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,b.localforage=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c||a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g=43)}}).catch(function(){return!1})}function n(a){return"boolean"==typeof xa?va.resolve(xa):m(a).then(function(a){return xa=a})}function o(a){var b=ya[a.name],c={};c.promise=new va(function(a,b){c.resolve=a,c.reject=b}),b.deferredOperations.push(c),b.dbReady?b.dbReady=b.dbReady.then(function(){return c.promise}):b.dbReady=c.promise}function p(a){var b=ya[a.name],c=b.deferredOperations.pop();if(c)return c.resolve(),c.promise}function q(a,b){var c=ya[a.name],d=c.deferredOperations.pop();if(d)return d.reject(b),d.promise}function r(a,b){return new va(function(c,d){if(ya[a.name]=ya[a.name]||B(),a.db){if(!b)return c(a.db);o(a),a.db.close()}var e=[a.name];b&&e.push(a.version);var f=ua.open.apply(ua,e);b&&(f.onupgradeneeded=function(b){var c=f.result;try{c.createObjectStore(a.storeName),b.oldVersion<=1&&c.createObjectStore(wa)}catch(c){if("ConstraintError"!==c.name)throw c;console.warn('The database "'+a.name+'" has been upgraded from version '+b.oldVersion+" to version "+b.newVersion+', but the storage "'+a.storeName+'" already exists.')}}),f.onerror=function(a){a.preventDefault(),d(f.error)},f.onsuccess=function(){var b=f.result;b.onversionchange=function(a){a.target.close()},c(b),p(a)}})}function s(a){return r(a,!1)}function t(a){return r(a,!0)}function u(a,b){if(!a.db)return!0;var c=!a.db.objectStoreNames.contains(a.storeName),d=a.versiona.db.version;if(d&&(a.version!==b&&console.warn('The database "'+a.name+"\" can't be downgraded from version "+a.db.version+" to version "+a.version+"."),a.version=a.db.version),e||c){if(c){var f=a.db.version+1;f>a.version&&(a.version=f)}return!0}return!1}function v(a){return new va(function(b,c){var d=new FileReader;d.onerror=c,d.onloadend=function(c){var d=btoa(c.target.result||"");b({__local_forage_encoded_blob:!0,data:d,type:a.type})},d.readAsBinaryString(a)})}function w(a){return g([l(atob(a.data))],{type:a.type})}function x(a){return a&&a.__local_forage_encoded_blob}function y(a){var b=this,c=b._initReady().then(function(){var a=ya[b._dbInfo.name];if(a&&a.dbReady)return a.dbReady});return i(c,a,a),c}function z(a){o(a);for(var b=ya[a.name],c=b.forages,d=0;d0&&(!a.db||"InvalidStateError"===e.name||"NotFoundError"===e.name))return va.resolve().then(function(){if(!a.db||"NotFoundError"===e.name&&!a.db.objectStoreNames.contains(a.storeName)&&a.version<=a.db.version)return a.db&&(a.version=a.db.version+1),t(a)}).then(function(){return z(a).then(function(){A(a,b,c,d-1)})}).catch(c);c(e)}}function B(){return{forages:[],db:null,dbReady:null,deferredOperations:[]}}function C(a){function b(){return va.resolve()}var c=this,d={db:null};if(a)for(var e in a)d[e]=a[e];var f=ya[d.name];f||(f=B(),ya[d.name]=f),f.forages.push(c),c._initReady||(c._initReady=c.ready,c.ready=y);for(var g=[],h=0;h>4,k[i++]=(15&d)<<4|e>>2,k[i++]=(3&e)<<6|63&f;return j}function O(a){var b,c=new Uint8Array(a),d="";for(b=0;b>2],d+=Da[(3&c[b])<<4|c[b+1]>>4],d+=Da[(15&c[b+1])<<2|c[b+2]>>6],d+=Da[63&c[b+2]];return c.length%3==2?d=d.substring(0,d.length-1)+"=":c.length%3==1&&(d=d.substring(0,d.length-2)+"=="),d}function P(a,b){var c="";if(a&&(c=Ua.call(a)),a&&("[object ArrayBuffer]"===c||a.buffer&&"[object ArrayBuffer]"===Ua.call(a.buffer))){var d,e=Ga;a instanceof ArrayBuffer?(d=a,e+=Ia):(d=a.buffer,"[object Int8Array]"===c?e+=Ka:"[object Uint8Array]"===c?e+=La:"[object Uint8ClampedArray]"===c?e+=Ma:"[object Int16Array]"===c?e+=Na:"[object Uint16Array]"===c?e+=Pa:"[object Int32Array]"===c?e+=Oa:"[object Uint32Array]"===c?e+=Qa:"[object Float32Array]"===c?e+=Ra:"[object Float64Array]"===c?e+=Sa:b(new Error("Failed to get type for BinaryArray"))),b(e+O(d))}else if("[object Blob]"===c){var f=new FileReader;f.onload=function(){var c=Ea+a.type+"~"+O(this.result);b(Ga+Ja+c)},f.readAsArrayBuffer(a)}else try{b(JSON.stringify(a))}catch(c){console.error("Couldn't convert value into a JSON string: ",a),b(null,c)}}function Q(a){if(a.substring(0,Ha)!==Ga)return JSON.parse(a);var b,c=a.substring(Ta),d=a.substring(Ha,Ta);if(d===Ja&&Fa.test(c)){var e=c.match(Fa);b=e[1],c=c.substring(e[0].length)}var f=N(c);switch(d){case Ia:return f;case Ja:return g([f],{type:b});case Ka:return new Int8Array(f);case La:return new Uint8Array(f);case Ma:return new Uint8ClampedArray(f);case Na:return new Int16Array(f);case Pa:return new Uint16Array(f);case Oa:return new Int32Array(f);case Qa:return new Uint32Array(f);case Ra:return new Float32Array(f);case Sa:return new Float64Array(f);default:throw new Error("Unkown type: "+d)}}function R(a,b,c,d){a.executeSql("CREATE TABLE IF NOT EXISTS "+b.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],c,d)}function S(a){var b=this,c={db:null};if(a)for(var d in a)c[d]="string"!=typeof a[d]?a[d].toString():a[d];var e=new va(function(a,d){try{c.db=openDatabase(c.name,String(c.version),c.description,c.size)}catch(a){return d(a)}c.db.transaction(function(e){R(e,c,function(){b._dbInfo=c,a()},function(a,b){d(b)})},d)});return c.serializer=Va,e}function T(a,b,c,d,e,f){a.executeSql(c,d,e,function(a,g){g.code===g.SYNTAX_ERR?a.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name = ?",[b.storeName],function(a,h){h.rows.length?f(a,g):R(a,b,function(){a.executeSql(c,d,e,f)},f)},f):f(a,g)},f)}function U(a,b){var c=this;a=j(a);var d=new va(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){T(c,e,"SELECT * FROM "+e.storeName+" WHERE key = ? LIMIT 1",[a],function(a,c){var d=c.rows.length?c.rows.item(0).value:null;d&&(d=e.serializer.deserialize(d)),b(d)},function(a,b){d(b)})})}).catch(d)});return h(d,b),d}function V(a,b){var c=this,d=new va(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){T(c,e,"SELECT * FROM "+e.storeName,[],function(c,d){for(var f=d.rows,g=f.length,h=0;h0)return void f(W.apply(e,[a,h,c,d-1]));g(b)}})})}).catch(g)});return h(f,c),f}function X(a,b,c){return W.apply(this,[a,b,c,1])}function Y(a,b){var c=this;a=j(a);var d=new va(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){T(c,e,"DELETE FROM "+e.storeName+" WHERE key = ?",[a],function(){b()},function(a,b){d(b)})})}).catch(d)});return h(d,b),d}function Z(a){var b=this,c=new va(function(a,c){b.ready().then(function(){var d=b._dbInfo;d.db.transaction(function(b){T(b,d,"DELETE FROM "+d.storeName,[],function(){a()},function(a,b){c(b)})})}).catch(c)});return h(c,a),c}function $(a){var b=this,c=new va(function(a,c){b.ready().then(function(){var d=b._dbInfo;d.db.transaction(function(b){T(b,d,"SELECT COUNT(key) as c FROM "+d.storeName,[],function(b,c){var d=c.rows.item(0).c;a(d)},function(a,b){c(b)})})}).catch(c)});return h(c,a),c}function _(a,b){var c=this,d=new va(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){T(c,e,"SELECT key FROM "+e.storeName+" WHERE id = ? LIMIT 1",[a+1],function(a,c){var d=c.rows.length?c.rows.item(0).key:null;b(d)},function(a,b){d(b)})})}).catch(d)});return h(d,b),d}function aa(a){var b=this,c=new va(function(a,c){b.ready().then(function(){var d=b._dbInfo;d.db.transaction(function(b){T(b,d,"SELECT key FROM "+d.storeName,[],function(b,c){for(var d=[],e=0;e '__WebKitDatabaseInfoTable__'",[],function(c,d){for(var e=[],f=0;f0}function ha(a){var b=this,c={};if(a)for(var d in a)c[d]=a[d];return c.keyPrefix=ea(a,b._defaultConfig),ga()?(b._dbInfo=c,c.serializer=Va,va.resolve()):va.reject()}function ia(a){var b=this,c=b.ready().then(function(){for(var a=b._dbInfo.keyPrefix,c=localStorage.length-1;c>=0;c--){var d=localStorage.key(c);0===d.indexOf(a)&&localStorage.removeItem(d)}});return h(c,a),c}function ja(a,b){var c=this;a=j(a);var d=c.ready().then(function(){var b=c._dbInfo,d=localStorage.getItem(b.keyPrefix+a);return d&&(d=b.serializer.deserialize(d)),d});return h(d,b),d}function ka(a,b){var c=this,d=c.ready().then(function(){for(var b=c._dbInfo,d=b.keyPrefix,e=d.length,f=localStorage.length,g=1,h=0;h=0;b--){var c=localStorage.key(b);0===c.indexOf(a)&&localStorage.removeItem(c)}}):va.reject("Invalid arguments"),h(d,b),d}function ra(a,b){a[b]=function(){var c=arguments;return a.ready().then(function(){return a[b].apply(a,c)})}}function sa(){for(var a=1;a + + + + + + + + + + + + + + + + + + + diff --git a/assets/logo-round.svg b/assets/logo-round.svg new file mode 100644 index 0000000..3917ccd --- /dev/null +++ b/assets/logo-round.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/assets/logo-transparent.svg b/assets/logo-transparent.svg new file mode 100644 index 0000000..734922c --- /dev/null +++ b/assets/logo-transparent.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + diff --git a/assets/logo.svg b/assets/logo.svg new file mode 100644 index 0000000..aa4f35a --- /dev/null +++ b/assets/logo.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/assets/native.css b/assets/native.css new file mode 100644 index 0000000..3e361ca --- /dev/null +++ b/assets/native.css @@ -0,0 +1,43 @@ +body, #player.bg-white { + background-color: transparent !important; +} + +body.navigation-body { + background-color: rgba(255, 255, 255, .1) !important; + border-right: 1px solid rgba(0, 0, 0, .1) !important; + position: fixed; + inset: 0; +} + +#navigation-gradient { + display: none !important; +} + +#filter, .list-group-item { + background-color: rgba(255, 255, 255, .25) !important; +} + +@media (prefers-color-scheme: dark) { + body, #player.bg-white { + background-color: transparent !important; + } + + body.navigation-body { + background-color: rgba(0, 0, 0, .1) !important; + border-right: 1px solid rgba(255, 255, 255, .1) !important; + position: fixed; + inset: 0; + } + + #navigation-gradient { + display: none !important; + } + + #filter, .list-group-item { + background-color: rgba(0, 0, 0, .25) !important; + } +} + +#lyrics-synced-fade { + display: none !important; +} \ No newline at end of file diff --git a/assets/nothing.svg b/assets/nothing.svg new file mode 100644 index 0000000..b4601c2 --- /dev/null +++ b/assets/nothing.svg @@ -0,0 +1,254 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/shortcuts.js b/assets/shortcuts.js new file mode 100644 index 0000000..2fa48ca --- /dev/null +++ b/assets/shortcuts.js @@ -0,0 +1,26 @@ +document.onkeydown = (e) => { + + if ((e.metaKey || e.ctrlKey) && e.key === ".") { + e.preventDefault(); + window.parent.stop(); + return false; + } + + if ((e.metaKey || e.ctrlKey) && e.key === "ArrowRight") { + e.preventDefault(); + window.parent.next(); + return false; + } + + if ((e.metaKey || e.ctrlKey) && e.key === "ArrowLeft") { + e.preventDefault(); + window.parent.previous(); + return false; + } + + if (e.key === " " && e.target.tagName !== "INPUT") { + e.preventDefault(); + window.parent.playPause(); + return false; + } +} \ No newline at end of file diff --git a/assets/styles.css b/assets/styles.css new file mode 100644 index 0000000..de4d33f --- /dev/null +++ b/assets/styles.css @@ -0,0 +1,432 @@ +iframe { + border: none; +} + +* { + user-select: none; + -webkit-user-drag: none; +} + +.player-btn:hover { + background-color: rgba(0, 0, 0, .05); +} + +.player-btn:active { + background-color: rgba(0, 0, 0, .1); +} + +.navigation-item { + padding: 5px 10px; +} + +.navigation-item.active, .navigation-item:active { + background-color: rgba(0, 0, 0, .1) !important; + border-top-left-radius: 10px; + border-bottom-left-radius: 10px; +} + +.navigation-item:hover { + background-color: rgba(0, 0, 0, .05); + border-top-left-radius: 10px; + border-bottom-left-radius: 10px; +} + +.album:hover { + background-color: rgba(0, 0, 0, .05); + border-radius: 5px; +} + +.player-btn.disabled { + opacity: .5; + pointer-events: none; +} + +@media (max-width: 1200px) { + #album-grid { + grid-template-columns: repeat(4, 1fr) !important; + } + + .album-list-item { + max-width: calc(80vw / 4) !important; + } +} + +@media (max-width: 1215px) { + #album-grid { + grid-template-columns: repeat(5, 1fr) !important; + } + + .album-list-item { + max-width: calc(80vw / 5) !important; + } +} + +@media (max-width: 1311px) { + #navigation { + width: 96px !important; + } + + iframe#player { + left: 96px !important; + width: calc(100vw - 96px) !important; + } + + #ui, #lyrics-page { + left: 96px !important; + width: calc(100vw - 96px) !important; + } +} + +@media (max-width: 1295px) { + #album-grid { + grid-template-columns: repeat(4, 1fr) !important; + } + + .album-list-item { + max-width: calc(80vw / 4) !important; + } +} + +@media (max-width: 96px) { + .navigation-desktop { + display: none; + } +} + +@media (max-width: 991px) { + #player.desktop-player .player-btn { + width: 32px !important; + } + + #player.desktop-player .player-badge-desktop { + display: none !important; + } + + #album-grid { + grid-template-columns: repeat(3, 1fr) !important; + } + + .album-list-item { + max-width: calc(80vw / 3) !important; + } +} + +@media (max-width: 767px) { + #album-grid { + grid-template-columns: repeat(2, 1fr) !important; + } + + .album-list-item { + max-width: calc(80vw / 2) !important; + } +} + +@media (max-width: 863px) { + #player.bg-white.desktop-player.mobilified .container { + grid-template-columns: 1fr !important; + } + + #player.desktop-player.mobilified .player-badge-desktop { + display: initial !important; + } + + #player.desktop-player.mobilified .player-btn { + width: 32px !important; + height: 32px !important; + } + + #player.bg-white.desktop-player.mobilified { + height: 144px !important; + } + + #player.bg-white.desktop-player.mobilified #info, #player.bg-white.desktop-player.mobilified #cover { + border: none !important; + } + + #player.desktop-player.mobilified #badge-hires, #player.desktop-player.mobilified #badge-cd, #player.desktop-player.mobilified #badge-lossy { + margin-top: 4px !important; + } + + #player.desktop-player.mobilified #badges { + text-align: center !important; + justify-content: center !important; + } + + #player.desktop-player.mobilified #buttons { + text-align: center; + height: 32px !important; + } + + #ui, #lyrics-page { + top: 145px !important; + height: calc(100vh - 145px) !important; + } + + iframe#player { + height: 144px !important; + } + + #navigation { + position: fixed !important; + top: unset !important; + bottom: 0 !important; + left: 0 !important; + right: 0 !important; + width: 100vw !important; + height: 48px !important; + border-top: 1px solid rgba(0, 0, 0, .25); + } + + iframe#player { + position: fixed !important; + top: unset !important; + bottom: 48px !important; + left: 0 !important; + right: 0 !important; + width: 100vw !important; + height: 48px !important; + border-top: 1px solid rgba(0, 0, 0, .25); + border-bottom: none !important; + } + + #player.bg-white.desktop-player.mobilified { + height: 48px !important; + } + + #player.desktop-player.mobilified #btn-shuffle.player-btn, #player.desktop-player.mobilified #btn-previous.player-btn, #player.desktop-player.mobilified #btn-repeat.player-btn, #player.desktop-player.mobilified #info-grid-sep, #player.desktop-player.mobilified #info-grid-info, #player.desktop-player.mobilified #seekbar-container, #player.desktop-player.mobilified #info-grid-time { + display: none !important; + } + + #player.desktop-player.mobilified #info-grid-title { + text-align: left !important; + justify-content: left !important; + align-items: center !important; + margin-left: 15px !important; + } + + #player.bg-white.desktop-player.mobilified #buttons { + position: fixed; + right: 10px; + } + + #player.desktop-player.mobilified #info, #player.desktop-player.mobilified #cover { + height: 48px !important; + grid-template-columns: 48px 1fr !important; + } + + #player.desktop-player.mobilified #info-grid { + grid-template-rows: 1fr !important; + } + + #player.desktop-player.mobilified #album-art { + height: 48px !important; + width: 48px !important; + } + + .list-actions { + display: flex; + align-items: center; + } + + #player.desktop-player.mobilified #desktop-player-action { + display: block !important; + top: 0; + position: fixed; + left: 0; + right: 86px; + bottom: 0; + } + + #player.desktop-player.mobilified .container { + margin: 0 !important; + padding: 0 !important; + width: 100% !important; + max-width: 100% !important; + } + + #ui, #lyrics-page { + top: 0 !important; + bottom: 97px !important; + left: 0 !important; + right: 0 !important; + width: 100vw !important; + height: calc(100vh - 97px) !important; + } + + iframe#lyrics-page { + display: block !important; + z-index: 100000 !important; + top: 96px !important; + left: 20px !important; + right: 20px !important; + width: calc(100vw - 40px) !important; + height: calc(100vh - 276px) !important; + opacity: 0; + pointer-events: none; + transition: opacity 200ms !important; + } + + iframe#lyrics-page.mobile-show { + transition: opacity 200ms linear 500ms !important; + opacity: 1; + pointer-events: auto !important; + } +} + +@media (min-width: 864px) { + #player-mobile-container { + display: none !important; + } +} + +@media (max-width: 1010px) { + #album-info { + grid-gap: 0 !important; + grid-template-columns: 1fr !important; + } + + #album-info-art { + display: block !important; + margin-left: auto !important; + margin-right: auto !important; + } + + #album-info-text { + text-align: center; + grid-gap: 10px; + } + + #filter { + display: none; + } +} + +@media (max-width: 575px) { + #album-info-buttons { + display: grid; + grid-template-columns: 1fr 1fr; + grid-gap: 10px; + } + + #album-info-buttons.nolibrary { + display: grid; + grid-template-columns: 1fr; + grid-gap: 10px; + } + + #album-info-buttons .btn { + width: 100% !important; + } +} + +.player-badge-icon { + width: 24px; + margin-right: 5px; +} + +#player #badge-hires .player-badge-desktop { + background: white; + color: rgb(182, 110, 2); + padding-left: 5px; + margin: -2px -5px -2px 5px; + display: flex; + align-items: center; + padding-right: 5px; + border-top-right-radius: 5px; + border-bottom-right-radius: 5px; +} + +#player #badge-cd .player-badge-desktop { + background: white; + color: #02b6a7; + padding-left: 5px; + margin: -2px -5px -2px 5px; + display: flex; + align-items: center; + padding-right: 5px; + border-top-right-radius: 5px; + border-bottom-right-radius: 5px; +} + +#player #badge-lossy .player-badge-desktop { + background: white; + color: #a402b6; + padding-left: 5px; + margin: -2px -5px -2px 5px; + display: flex; + align-items: center; + padding-right: 5px; + border-top-right-radius: 5px; + border-bottom-right-radius: 5px; +} + +.navigation-item img { + filter: brightness(0%); +} + +@media (max-height: 64px) { + #navigation-left, #navigation-version { + display: none !important; + } + + #navigation-container { + grid-template-columns: repeat(5, 1fr) !important; + display: grid !important; + margin-top: 2px; + } + + #navigation-container #lyrics { + display: none !important; + } + + .navigation-desktop { + display: none; + } + + div.navigation-item, div.navigation-item.active { + background-color: transparent !important; + border-radius: 10px; + } + + .navigation-container-inner { + margin: 0 !important; + padding: 0 !important; + width: 100% !important; + max-width: 100% !important; + } + + .navigation-item img { + display: block; + margin-left: auto; + margin-right: auto; + filter: brightness(0%); + } + + .navigation-item.active img { + filter: none !important; + } +} + +@media (max-width: 823px) { + #lyrics-outer, #lyrics-outer * { + color: rgba(255, 255, 255, .75); + } + + .synced-lyrics-item { + font-size: 26px !important; + } + + #lyrics-synced-fade { + display: none !important; + } +} + +@media (min-width: 992px) { + .container { + max-width: 95%; + } +} + +#badges { + -webkit-app-region: drag; +} \ No newline at end of file -- cgit