diff --git a/Themes/Everforest/.config/spicetify/Extensions/adblock/README.md b/Themes/Everforest/.config/spicetify/Extensions/adblock/README.md new file mode 100644 index 0000000..641265f --- /dev/null +++ b/Themes/Everforest/.config/spicetify/Extensions/adblock/README.md @@ -0,0 +1,44 @@ +# Adblock +[Spicetify](https://github.com/khanhas/spicetify-cli) extension to block all audio ads and UI ads +* Simply run the extension and it will work! +## Install +Copy `adblock.js` into your [Spicetify](https://github.com/khanhas/spicetify-cli) extensions directory: +| **Platform** | **Path** | +|------------|-----------------------------------------------------------------------------------| +| **Linux** | `~/.config/spicetify/Extensions` or `$XDG_CONFIG_HOME/.config/spicetify/Extensions/` | +| **MacOS** | `~/spicetify_data/Extensions` or `$SPICETIFY_CONFIG/Extensions` | +| **Windows** | `%appdata%\spicetify\Extensions\` | + +After putting the extension file into the correct folder, run the following command to install the extension or install through marketplace: +``` +spicetify config extensions adblock.js +spicetify apply +``` +Note: Using the `config` command to add the extension will always append the file name to the existing extensions list. It does not replace the whole key's value. + +Or you can manually edit your `config-xpui.ini` file. Add your desired extension filenames in the extensions key, separated them by the | character. +Example: + +```ini +[AdditionalOptions] +... +extensions = autoSkipExplicit.js|shuffle+.js|trashbin.js|adblock.js +``` + +Then run: + +``` +spicetify apply +``` + +## Usage +Toggle in the Profile menu. + +![Screenshot](https://raw.githubusercontent.com/CharlieS1103/spicetify-extensions/main/adblock/adblock.png) + +## More +🌟 Like it? Gimme some love! +[![Github Stars badge](https://img.shields.io/github/stars/CharlieS1103/spicetify-extensions?logo=github&style=social)](https://github.com/CharlieS1103/spicetify-extensions/) + +If you find any bugs, please [create a new issue](https://github.com/CharlieS1103/spicetify-extensions/issues/new/choose) on the GitHub repo. +![https://github.com/CharlieS1103/spicetify-extensions/issues](https://img.shields.io/github/issues/CharlieS1103/spicetify-extensions?logo=github) diff --git a/Themes/Everforest/.config/spicetify/Extensions/adblock.js b/Themes/Everforest/.config/spicetify/Extensions/adblock/adblock.js old mode 100755 new mode 100644 similarity index 67% rename from Themes/Everforest/.config/spicetify/Extensions/adblock.js rename to Themes/Everforest/.config/spicetify/Extensions/adblock/adblock.js index 6220d04..5ed4b8e --- a/Themes/Everforest/.config/spicetify/Extensions/adblock.js +++ b/Themes/Everforest/.config/spicetify/Extensions/adblock/adblock.js @@ -7,17 +7,17 @@ /// (function adblock() { - const { Platform} = Spicetify; + const { Platform } = Spicetify; if (!(Platform)) { setTimeout(adblock, 300) return } - + var styleSheet = document.createElement("style") styleSheet.innerHTML = - ` - .MnW5SczTcbdFHxLZ_Z8j, .WiPggcPDzbwGxoxwLWFf, .ReyA3uE3K7oEz7PTTnAn, .main-leaderboardComponent-container, .sponsor-container, a.link-subtle.main-navBar-navBarLink.GKnnhbExo0U9l7Jz2rdc{ + ` + .MnW5SczTcbdFHxLZ_Z8j, .WiPggcPDzbwGxoxwLWFf, .ReyA3uE3K7oEz7PTTnAn, .main-leaderboardComponent-container, .sponsor-container, a.link-subtle.main-navBar-navBarLink.GKnnhbExo0U9l7Jz2rdc, button[title="Upgrade to Premium"], button[aria-label="Upgrade to Premium"], .main-contextMenu-menuItem a[href^="https://www.spotify.com/premium/"] { display: none !important; } ` @@ -29,7 +29,6 @@ // hook before call var ret = billboard.apply(this, arguments); // hook after call - console.log("Adblock.js: Billboard blocked! Leave a star!") Spicetify.Platform.AdManagers.billboard.finish() const observer = new MutationObserver((mutations, obs) => { const billboardAd = document.getElementById('view-billboard-ad'); @@ -51,9 +50,18 @@ Spicetify.Platform.AdManagers.audio.audioApi.cosmosConnector.increaseStreamTime(-100000000000) Spicetify.Platform.AdManagers.billboard.billboardApi.cosmosConnector.increaseStreamTime(-100000000000) } - setInterval(delayAds, 720 *10000); - - -})() - + setInterval(delayAds, 720 * 10000); + (async function disableEsperantoAds() { + if (!Spicetify.Platform?.UserAPI?._product_state) { + setTimeout(disableEsperantoAds, 300); + return; + } + await Spicetify.Platform.UserAPI._product_state.putValues({pairs: { ads: 0 }}); + Spicetify.Platform.UserAPI._product_state.subValues({ keys: ["ads"] }, ({ pairs }) => { + if (pairs.ads !== "0") { + Spicetify.Platform.UserAPI._product_state.putValues({ pairs: { ads: "0" }}); + } + }); + })(); +})() diff --git a/Themes/Everforest/.config/spicetify/Extensions/adblock/adblock.png b/Themes/Everforest/.config/spicetify/Extensions/adblock/adblock.png new file mode 100644 index 0000000..d347897 Binary files /dev/null and b/Themes/Everforest/.config/spicetify/Extensions/adblock/adblock.png differ diff --git a/Themes/Everforest/.config/spicetify/Themes/Dribbblish/EverForest(base).png b/Themes/Everforest/.config/spicetify/Themes/Dribbblish/EverForest(base).png new file mode 100644 index 0000000..927fa67 Binary files /dev/null and b/Themes/Everforest/.config/spicetify/Themes/Dribbblish/EverForest(base).png differ diff --git a/Themes/Everforest/.config/spicetify/Themes/Dribbblish/README.md b/Themes/Everforest/.config/spicetify/Themes/Dribbblish/README.md old mode 100755 new mode 100644 index b1c98f4..c5ec7a6 --- a/Themes/Everforest/.config/spicetify/Themes/Dribbblish/README.md +++ b/Themes/Everforest/.config/spicetify/Themes/Dribbblish/README.md @@ -57,11 +57,8 @@ Run these commands: In **Bash**: ```bash cd "$(dirname "$(spicetify -c)")/Themes/Dribbblish" -mkdir -p ../../Extensions -cp dribbblish.js ../../Extensions/. -spicetify config extensions dribbblish.js spicetify config current_theme Dribbblish color_scheme base -spicetify config inject_css 1 replace_colors 1 overwrite_assets 1 +spicetify config inject_css 1 replace_colors 1 overwrite_assets 1 inject_theme_js 1 spicetify apply ``` @@ -69,10 +66,8 @@ spicetify apply In **Powershell**: ```powershell cd "$(spicetify -c | Split-Path)\Themes\Dribbblish" -Copy-Item dribbblish.js ..\..\Extensions -spicetify config extensions dribbblish.js spicetify config current_theme Dribbblish color_scheme base -spicetify config inject_css 1 replace_colors 1 overwrite_assets 1 +spicetify config inject_css 1 replace_colors 1 overwrite_assets 1 inject_theme_js 1 spicetify apply ``` @@ -97,12 +92,9 @@ Invoke-WebRequest -UseBasicParsing "https://raw.githubusercontent.com/spicetify/ ``` ## Manual uninstall -Remove the dribbblish script with the following commands +Remove the dribbblish theme with the following commands ``` -spicetify config extensions dribbblish.js- -``` -And remove Patch lines you added in config file earlier. Finally, run: -``` +spicetify config current_theme " " color_scheme " " spicetify apply ``` diff --git a/Themes/Everforest/.config/spicetify/Themes/Dribbblish/assets/glue-resources/fonts/GoogleSansDisplayMedium.woff2 b/Themes/Everforest/.config/spicetify/Themes/Dribbblish/assets/glue-resources/fonts/GoogleSansDisplayMedium.woff2 old mode 100755 new mode 100644 diff --git a/Themes/Everforest/.config/spicetify/Themes/Dribbblish/assets/glue-resources/fonts/GoogleSansDisplayRegular.woff2 b/Themes/Everforest/.config/spicetify/Themes/Dribbblish/assets/glue-resources/fonts/GoogleSansDisplayRegular.woff2 old mode 100755 new mode 100644 diff --git a/Themes/Everforest/.config/spicetify/Themes/Dribbblish/assets/glue-resources/fonts/Roboto.woff2 b/Themes/Everforest/.config/spicetify/Themes/Dribbblish/assets/glue-resources/fonts/Roboto.woff2 old mode 100755 new mode 100644 diff --git a/Themes/Everforest/.config/spicetify/Themes/Dribbblish/assets/glue-resources/fonts/RobotoMedium.woff2 b/Themes/Everforest/.config/spicetify/Themes/Dribbblish/assets/glue-resources/fonts/RobotoMedium.woff2 old mode 100755 new mode 100644 diff --git a/Themes/Everforest/.config/spicetify/Themes/Dribbblish/color.ini b/Themes/Everforest/.config/spicetify/Themes/Dribbblish/color.ini old mode 100755 new mode 100644 index 4fc78bd..23b0d9a --- a/Themes/Everforest/.config/spicetify/Themes/Dribbblish/color.ini +++ b/Themes/Everforest/.config/spicetify/Themes/Dribbblish/color.ini @@ -18,7 +18,8 @@ misc = BFBFBF progress-fg = CAA9E0 progress-bg = 91B1F0 -[white] + +[...] text = 363636 subtext = 3D3D3D sidebar-text = FFF9F4 @@ -193,7 +194,7 @@ selected-row = 797979 button = 31748f button-active = 31748f button-disabled = 555169 -tab-active = ebbcba +tab-active = 31748f notification = 1db954 notification-error = eb6f92 misc = 6e6a86 diff --git a/Themes/Everforest/.config/spicetify/Themes/Dribbblish/dribbblish.js b/Themes/Everforest/.config/spicetify/Themes/Dribbblish/dribbblish.js deleted file mode 100755 index 969da73..0000000 --- a/Themes/Everforest/.config/spicetify/Themes/Dribbblish/dribbblish.js +++ /dev/null @@ -1,266 +0,0 @@ -// Hide popover message -// document.getElementById("popover-container").style.height = 0; -const DribbblishShared = { - configMenu: new Spicetify.Menu.SubMenu("Dribbblish", []), - rightBigCover: localStorage.getItem("dribs-right-big-cover") === "true", - setRightBigCover: () => { - if (DribbblishShared.rightBigCover) { - document.documentElement.classList.add("right-expanded-cover"); - } else { - document.documentElement.classList.remove("right-expanded-cover"); - } - } -}; - -// register drib menu item -DribbblishShared.configMenu.register(); -DribbblishShared.configMenu.addItem(new Spicetify.Menu.Item( - "Right expanded cover", - DribbblishShared.rightBigCover, - (self) => { - self.isEnabled = !self.isEnabled; - DribbblishShared.rightBigCover = self.isEnabled; - localStorage.setItem("dribs-right-big-cover", self.isEnabled); - DribbblishShared.setRightBigCover(); - } -)); -DribbblishShared.setRightBigCover(); - -function waitForElement(els, func, timeout = 100) { - const queries = els.map(el => document.querySelector(el)); - if (queries.every(a => a)) { - func(queries); - } else if (timeout > 0) { - setTimeout(waitForElement, 300, els, func, --timeout); - } -} - -waitForElement([ - `ul[tabindex="0"]`, - `ul[tabindex="0"] .GlueDropTarget--playlists.GlueDropTarget--folders` -], ([root, firstItem]) => { - const listElem = firstItem.parentElement; - root.classList.add("dribs-playlist-list"); - - /** Replace Playlist name with their pictures */ - function loadPlaylistImage() { - for (const item of listElem.children) { - let link = item.querySelector("a"); - if (!link) continue; - - let [_, app, uid ] = link.pathname.split("/"); - let uri; - if (app === "playlist") { - uri = `spotify:playlist:${uid}`; - } else if (app === "folder") { - const base64 = localStorage.getItem("dribbblish:folder-image:" + uid); - let img = link.querySelector("img"); - if (!img) { - img = document.createElement("img"); - img.classList.add("playlist-picture"); - link.prepend(img); - } - img.src = base64 || "https://cdn.jsdelivr.net/gh/spicetify/spicetify-themes@master/Dribbblish/images/tracklist-row-song-fallback.svg"; - continue; - } - - Spicetify.CosmosAsync.get( - `sp://core-playlist/v1/playlist/${uri}/metadata`, - { policy: { picture: true } } - ).then(res => { - const meta = res.metadata; - let img = link.querySelector("img"); - if (!img) { - img = document.createElement("img"); - img.classList.add("playlist-picture"); - link.prepend(img); - } - img.src = meta.picture || "https://cdn.jsdelivr.net/gh/spicetify/spicetify-themes@master/Dribbblish/images/tracklist-row-song-fallback.svg"; - }); - } - } - - DribbblishShared.loadPlaylistImage = loadPlaylistImage; - loadPlaylistImage(); - - new MutationObserver(loadPlaylistImage) - .observe(listElem, {childList: true}); -}); - -waitForElement([".Root__top-container"], ([topContainer]) => { - const shadow = document.createElement("div"); - shadow.id = "dribbblish-back-shadow"; - topContainer.prepend(shadow); -}); - -// allow resizing of the navbar -waitForElement([ - ".Root__nav-bar .LayoutResizer__input, .Root__nav-bar .LayoutResizer__resize-bar input" -], ([resizer]) => { - const observer = new MutationObserver(updateVariable); - observer.observe(resizer, { attributes: true, attributeFilter: ["value"]}); - function updateVariable() { - let value = resizer.value; - if (value < 121) { - value = 72; - document.documentElement.classList.add("sidebar-hide-text"); - } else { - document.documentElement.classList.remove("sidebar-hide-text"); - } - document.documentElement.style.setProperty( - "--sidebar-width", value + "px"); - } - updateVariable(); -}); - -// allow resizing of the buddy feed -waitForElement([".Root__right-sidebar .LayoutResizer__input, .Root__right-sidebar .LayoutResizer__resize-bar input"], ([resizer]) => { - const observer = new MutationObserver(updateVariable); - observer.observe(resizer, { attributes: true, attributeFilter: ["value"] }); - function updateVariable() { - let value = resizer.value; - if (value == 320) { - value = 72; - document.documentElement.classList.add("buddyFeed-hide-text"); - } else { - document.documentElement.classList.remove("buddyFeed-hide-text"); - } - } - updateVariable(); -}); - -// add fade effect on playlist/folder list -waitForElement([".main-navBar-navBar .os-viewport.os-viewport-native-scrollbars-invisible"], ([scrollNode]) => { - scrollNode.setAttribute("fade", "bottom"); - scrollNode.addEventListener("scroll", () => { - if (scrollNode.scrollTop == 0) { - scrollNode.setAttribute("fade", "bottom"); - } else if (scrollNode.scrollHeight - scrollNode.clientHeight - scrollNode.scrollTop == 0) { - scrollNode.setAttribute("fade", "top"); - } else { - scrollNode.setAttribute("fade", "full"); - } - }); -}); - -// improve styles at smaller sizes -waitForElement([".Root__main-view .os-resize-observer-host"], ([resizeHost]) => { - const observer = new ResizeObserver(updateVariable); - observer.observe(resizeHost); - function updateVariable([ event ]) { - document.documentElement.style.setProperty( - "--main-view-width", event.contentRect.width + "px"); - if (event.contentRect.width < 700) { - document.documentElement.classList.add("minimal-player"); - } else { - document.documentElement.classList.remove("minimal-player"); - } - if (event.contentRect.width < 550) { - document.documentElement.classList.add("extra-minimal-player"); - } else { - document.documentElement.classList.remove("extra-minimal-player"); - } - } -}); - -(function Dribbblish() { - // dynamic playback time tooltip - const progBar = document.querySelector(".playback-bar"); - const root = document.querySelector(".Root"); - - if (!Spicetify.Player.origin || !progBar || !root) { - setTimeout(Dribbblish, 300); - return; - } - - const tooltip = document.createElement("div"); - tooltip.className = "prog-tooltip"; - progBar.append(tooltip); - - const progKnob = progBar.querySelector(".progress-bar__slider"); - - function updateProgTime({ data: e }) { - const offsetX = progKnob.offsetLeft + progKnob.offsetWidth / 2; - const maxWidth = progBar.offsetWidth; - const curWidth = Spicetify.Player.getProgressPercent() * maxWidth; - const ttWidth = tooltip.offsetWidth / 2; - if (curWidth < ttWidth) { - tooltip.style.left = String(offsetX) + "px"; - } else if (curWidth > maxWidth - ttWidth) { - tooltip.style.left = String(offsetX - ttWidth * 2) + "px"; - } else { - tooltip.style.left = String(offsetX - ttWidth) + "px"; - } - tooltip.innerText = Spicetify.Player.formatTime(e) + " / " + - Spicetify.Player.formatTime(Spicetify.Player.getDuration()); - } - Spicetify.Player.addEventListener("onprogress", updateProgTime); - updateProgTime({ data: Spicetify.Player.getProgress() }); - - Spicetify.CosmosAsync.sub("sp://connect/v1", (state) => { - const isExternal = state.devices.some(a => a.is_active); - if (isExternal) { - root.classList.add("is-connectBarVisible"); - } else { - root.classList.remove("is-connectBarVisible"); - } - }); - - // filepicker for custom folder images - const filePickerForm = document.createElement("form"); - filePickerForm.setAttribute("aria-hidden", true); - filePickerForm.innerHTML = ''; - document.body.appendChild(filePickerForm); - /** @type {HTMLInputElement} */ - const filePickerInput = filePickerForm.childNodes[0]; - filePickerInput.accept = [ - "image/jpeg", - "image/apng", - "image/avif", - "image/gif", - "image/png", - "image/svg+xml", - "image/webp" - ].join(","); - - filePickerInput.onchange = () => { - if (!filePickerInput.files.length) return; - - const file = filePickerInput.files[0]; - const reader = new FileReader; - reader.onload = (event) => { - const result = event.target.result; - const id = Spicetify.URI.from(filePickerInput.uri).id; - try { - localStorage.setItem( - "dribbblish:folder-image:" + id, - result - ); - } catch { - Spicetify.showNotification("File too large"); - } - DribbblishShared.loadPlaylistImage?.call(); - } - reader.readAsDataURL(file); - } - - // context menu items for custom folder images - new Spicetify.ContextMenu.Item("Remove folder image", - ([uri]) => { - const id = Spicetify.URI.from(uri).id; - localStorage.removeItem("dribbblish:folder-image:" + id); - DribbblishShared.loadPlaylistImage?.call(); - }, - ([uri]) => Spicetify.URI.isFolder(uri), - "x", - ).register(); - new Spicetify.ContextMenu.Item("Choose folder image", - ([uri]) => { - filePickerInput.uri = uri; - filePickerForm.reset(); - filePickerInput.click(); - }, - ([uri]) => Spicetify.URI.isFolder(uri), - "edit", - ).register(); -})(); diff --git a/Themes/Everforest/.config/spicetify/Themes/Dribbblish/images/tracklist-row-song-fallback.svg b/Themes/Everforest/.config/spicetify/Themes/Dribbblish/images/tracklist-row-song-fallback.svg old mode 100755 new mode 100644 diff --git a/Themes/Everforest/.config/spicetify/Extensions/dribbblish.js b/Themes/Everforest/.config/spicetify/Themes/Dribbblish/theme.js old mode 100755 new mode 100644 similarity index 97% rename from Themes/Everforest/.config/spicetify/Extensions/dribbblish.js rename to Themes/Everforest/.config/spicetify/Themes/Dribbblish/theme.js index 969da73..1fdd629 --- a/Themes/Everforest/.config/spicetify/Extensions/dribbblish.js +++ b/Themes/Everforest/.config/spicetify/Themes/Dribbblish/theme.js @@ -1,266 +1,266 @@ -// Hide popover message -// document.getElementById("popover-container").style.height = 0; -const DribbblishShared = { - configMenu: new Spicetify.Menu.SubMenu("Dribbblish", []), - rightBigCover: localStorage.getItem("dribs-right-big-cover") === "true", - setRightBigCover: () => { - if (DribbblishShared.rightBigCover) { - document.documentElement.classList.add("right-expanded-cover"); - } else { - document.documentElement.classList.remove("right-expanded-cover"); - } - } -}; - -// register drib menu item -DribbblishShared.configMenu.register(); -DribbblishShared.configMenu.addItem(new Spicetify.Menu.Item( - "Right expanded cover", - DribbblishShared.rightBigCover, - (self) => { - self.isEnabled = !self.isEnabled; - DribbblishShared.rightBigCover = self.isEnabled; - localStorage.setItem("dribs-right-big-cover", self.isEnabled); - DribbblishShared.setRightBigCover(); - } -)); -DribbblishShared.setRightBigCover(); - -function waitForElement(els, func, timeout = 100) { - const queries = els.map(el => document.querySelector(el)); - if (queries.every(a => a)) { - func(queries); - } else if (timeout > 0) { - setTimeout(waitForElement, 300, els, func, --timeout); - } -} - -waitForElement([ - `ul[tabindex="0"]`, - `ul[tabindex="0"] .GlueDropTarget--playlists.GlueDropTarget--folders` -], ([root, firstItem]) => { - const listElem = firstItem.parentElement; - root.classList.add("dribs-playlist-list"); - - /** Replace Playlist name with their pictures */ - function loadPlaylistImage() { - for (const item of listElem.children) { - let link = item.querySelector("a"); - if (!link) continue; - - let [_, app, uid ] = link.pathname.split("/"); - let uri; - if (app === "playlist") { - uri = `spotify:playlist:${uid}`; - } else if (app === "folder") { - const base64 = localStorage.getItem("dribbblish:folder-image:" + uid); - let img = link.querySelector("img"); - if (!img) { - img = document.createElement("img"); - img.classList.add("playlist-picture"); - link.prepend(img); - } - img.src = base64 || "https://cdn.jsdelivr.net/gh/spicetify/spicetify-themes@master/Dribbblish/images/tracklist-row-song-fallback.svg"; - continue; - } - - Spicetify.CosmosAsync.get( - `sp://core-playlist/v1/playlist/${uri}/metadata`, - { policy: { picture: true } } - ).then(res => { - const meta = res.metadata; - let img = link.querySelector("img"); - if (!img) { - img = document.createElement("img"); - img.classList.add("playlist-picture"); - link.prepend(img); - } - img.src = meta.picture || "https://cdn.jsdelivr.net/gh/spicetify/spicetify-themes@master/Dribbblish/images/tracklist-row-song-fallback.svg"; - }); - } - } - - DribbblishShared.loadPlaylistImage = loadPlaylistImage; - loadPlaylistImage(); - - new MutationObserver(loadPlaylistImage) - .observe(listElem, {childList: true}); -}); - -waitForElement([".Root__top-container"], ([topContainer]) => { - const shadow = document.createElement("div"); - shadow.id = "dribbblish-back-shadow"; - topContainer.prepend(shadow); -}); - -// allow resizing of the navbar -waitForElement([ - ".Root__nav-bar .LayoutResizer__input, .Root__nav-bar .LayoutResizer__resize-bar input" -], ([resizer]) => { - const observer = new MutationObserver(updateVariable); - observer.observe(resizer, { attributes: true, attributeFilter: ["value"]}); - function updateVariable() { - let value = resizer.value; - if (value < 121) { - value = 72; - document.documentElement.classList.add("sidebar-hide-text"); - } else { - document.documentElement.classList.remove("sidebar-hide-text"); - } - document.documentElement.style.setProperty( - "--sidebar-width", value + "px"); - } - updateVariable(); -}); - -// allow resizing of the buddy feed -waitForElement([".Root__right-sidebar .LayoutResizer__input, .Root__right-sidebar .LayoutResizer__resize-bar input"], ([resizer]) => { - const observer = new MutationObserver(updateVariable); - observer.observe(resizer, { attributes: true, attributeFilter: ["value"] }); - function updateVariable() { - let value = resizer.value; - if (value == 320) { - value = 72; - document.documentElement.classList.add("buddyFeed-hide-text"); - } else { - document.documentElement.classList.remove("buddyFeed-hide-text"); - } - } - updateVariable(); -}); - -// add fade effect on playlist/folder list -waitForElement([".main-navBar-navBar .os-viewport.os-viewport-native-scrollbars-invisible"], ([scrollNode]) => { - scrollNode.setAttribute("fade", "bottom"); - scrollNode.addEventListener("scroll", () => { - if (scrollNode.scrollTop == 0) { - scrollNode.setAttribute("fade", "bottom"); - } else if (scrollNode.scrollHeight - scrollNode.clientHeight - scrollNode.scrollTop == 0) { - scrollNode.setAttribute("fade", "top"); - } else { - scrollNode.setAttribute("fade", "full"); - } - }); -}); - -// improve styles at smaller sizes -waitForElement([".Root__main-view .os-resize-observer-host"], ([resizeHost]) => { - const observer = new ResizeObserver(updateVariable); - observer.observe(resizeHost); - function updateVariable([ event ]) { - document.documentElement.style.setProperty( - "--main-view-width", event.contentRect.width + "px"); - if (event.contentRect.width < 700) { - document.documentElement.classList.add("minimal-player"); - } else { - document.documentElement.classList.remove("minimal-player"); - } - if (event.contentRect.width < 550) { - document.documentElement.classList.add("extra-minimal-player"); - } else { - document.documentElement.classList.remove("extra-minimal-player"); - } - } -}); - -(function Dribbblish() { - // dynamic playback time tooltip - const progBar = document.querySelector(".playback-bar"); - const root = document.querySelector(".Root"); - - if (!Spicetify.Player.origin || !progBar || !root) { - setTimeout(Dribbblish, 300); - return; - } - - const tooltip = document.createElement("div"); - tooltip.className = "prog-tooltip"; - progBar.append(tooltip); - - const progKnob = progBar.querySelector(".progress-bar__slider"); - - function updateProgTime({ data: e }) { - const offsetX = progKnob.offsetLeft + progKnob.offsetWidth / 2; - const maxWidth = progBar.offsetWidth; - const curWidth = Spicetify.Player.getProgressPercent() * maxWidth; - const ttWidth = tooltip.offsetWidth / 2; - if (curWidth < ttWidth) { - tooltip.style.left = String(offsetX) + "px"; - } else if (curWidth > maxWidth - ttWidth) { - tooltip.style.left = String(offsetX - ttWidth * 2) + "px"; - } else { - tooltip.style.left = String(offsetX - ttWidth) + "px"; - } - tooltip.innerText = Spicetify.Player.formatTime(e) + " / " + - Spicetify.Player.formatTime(Spicetify.Player.getDuration()); - } - Spicetify.Player.addEventListener("onprogress", updateProgTime); - updateProgTime({ data: Spicetify.Player.getProgress() }); - - Spicetify.CosmosAsync.sub("sp://connect/v1", (state) => { - const isExternal = state.devices.some(a => a.is_active); - if (isExternal) { - root.classList.add("is-connectBarVisible"); - } else { - root.classList.remove("is-connectBarVisible"); - } - }); - - // filepicker for custom folder images - const filePickerForm = document.createElement("form"); - filePickerForm.setAttribute("aria-hidden", true); - filePickerForm.innerHTML = ''; - document.body.appendChild(filePickerForm); - /** @type {HTMLInputElement} */ - const filePickerInput = filePickerForm.childNodes[0]; - filePickerInput.accept = [ - "image/jpeg", - "image/apng", - "image/avif", - "image/gif", - "image/png", - "image/svg+xml", - "image/webp" - ].join(","); - - filePickerInput.onchange = () => { - if (!filePickerInput.files.length) return; - - const file = filePickerInput.files[0]; - const reader = new FileReader; - reader.onload = (event) => { - const result = event.target.result; - const id = Spicetify.URI.from(filePickerInput.uri).id; - try { - localStorage.setItem( - "dribbblish:folder-image:" + id, - result - ); - } catch { - Spicetify.showNotification("File too large"); - } - DribbblishShared.loadPlaylistImage?.call(); - } - reader.readAsDataURL(file); - } - - // context menu items for custom folder images - new Spicetify.ContextMenu.Item("Remove folder image", - ([uri]) => { - const id = Spicetify.URI.from(uri).id; - localStorage.removeItem("dribbblish:folder-image:" + id); - DribbblishShared.loadPlaylistImage?.call(); - }, - ([uri]) => Spicetify.URI.isFolder(uri), - "x", - ).register(); - new Spicetify.ContextMenu.Item("Choose folder image", - ([uri]) => { - filePickerInput.uri = uri; - filePickerForm.reset(); - filePickerInput.click(); - }, - ([uri]) => Spicetify.URI.isFolder(uri), - "edit", - ).register(); -})(); +// Hide popover message +// document.getElementById("popover-container").style.height = 0; +const DribbblishShared = { + configMenu: new Spicetify.Menu.SubMenu("Dribbblish", []), + rightBigCover: localStorage.getItem("dribs-right-big-cover") === "true", + setRightBigCover: () => { + if (DribbblishShared.rightBigCover) { + document.documentElement.classList.add("right-expanded-cover"); + } else { + document.documentElement.classList.remove("right-expanded-cover"); + } + } +}; + +// register drib menu item +DribbblishShared.configMenu.register(); +DribbblishShared.configMenu.addItem(new Spicetify.Menu.Item( + "Right expanded cover", + DribbblishShared.rightBigCover, + (self) => { + self.isEnabled = !self.isEnabled; + DribbblishShared.rightBigCover = self.isEnabled; + localStorage.setItem("dribs-right-big-cover", self.isEnabled); + DribbblishShared.setRightBigCover(); + } +)); +DribbblishShared.setRightBigCover(); + +function waitForElement(els, func, timeout = 100) { + const queries = els.map(el => document.querySelector(el)); + if (queries.every(a => a)) { + func(queries); + } else if (timeout > 0) { + setTimeout(waitForElement, 300, els, func, --timeout); + } +} + +waitForElement([ + `ul[tabindex="0"]`, + `ul[tabindex="0"] .GlueDropTarget--playlists.GlueDropTarget--folders` +], ([root, firstItem]) => { + const listElem = firstItem.parentElement; + root.classList.add("dribs-playlist-list"); + + /** Replace Playlist name with their pictures */ + function loadPlaylistImage() { + for (const item of listElem.children) { + let link = item.querySelector("a"); + if (!link) continue; + + let [_, app, uid ] = link.pathname.split("/"); + let uri; + if (app === "playlist") { + uri = `spotify:playlist:${uid}`; + } else if (app === "folder") { + const base64 = localStorage.getItem("dribbblish:folder-image:" + uid); + let img = link.querySelector("img"); + if (!img) { + img = document.createElement("img"); + img.classList.add("playlist-picture"); + link.prepend(img); + } + img.src = base64 || "https://cdn.jsdelivr.net/gh/spicetify/spicetify-themes@master/Dribbblish/images/tracklist-row-song-fallback.svg"; + continue; + } + + Spicetify.CosmosAsync.get( + `sp://core-playlist/v1/playlist/${uri}/metadata`, + { policy: { picture: true } } + ).then(res => { + const meta = res.metadata; + let img = link.querySelector("img"); + if (!img) { + img = document.createElement("img"); + img.classList.add("playlist-picture"); + link.prepend(img); + } + img.src = meta.picture || "https://cdn.jsdelivr.net/gh/spicetify/spicetify-themes@master/Dribbblish/images/tracklist-row-song-fallback.svg"; + }); + } + } + + DribbblishShared.loadPlaylistImage = loadPlaylistImage; + loadPlaylistImage(); + + new MutationObserver(loadPlaylistImage) + .observe(listElem, {childList: true}); +}); + +waitForElement([".Root__top-container"], ([topContainer]) => { + const shadow = document.createElement("div"); + shadow.id = "dribbblish-back-shadow"; + topContainer.prepend(shadow); +}); + +// allow resizing of the navbar +waitForElement([ + ".Root__nav-bar .LayoutResizer__input, .Root__nav-bar .LayoutResizer__resize-bar input" +], ([resizer]) => { + const observer = new MutationObserver(updateVariable); + observer.observe(resizer, { attributes: true, attributeFilter: ["value"]}); + function updateVariable() { + let value = resizer.value; + if (value < 121) { + value = 72; + document.documentElement.classList.add("sidebar-hide-text"); + } else { + document.documentElement.classList.remove("sidebar-hide-text"); + } + document.documentElement.style.setProperty( + "--sidebar-width", value + "px"); + } + updateVariable(); +}); + +// allow resizing of the buddy feed +waitForElement([".Root__right-sidebar .LayoutResizer__input, .Root__right-sidebar .LayoutResizer__resize-bar input"], ([resizer]) => { + const observer = new MutationObserver(updateVariable); + observer.observe(resizer, { attributes: true, attributeFilter: ["value"] }); + function updateVariable() { + let value = resizer.value; + if (value == 280) { + value = 72; + document.documentElement.classList.add("buddyFeed-hide-text"); + } else { + document.documentElement.classList.remove("buddyFeed-hide-text"); + } + } + updateVariable(); +}); + +// add fade effect on playlist/folder list +waitForElement([".main-navBar-navBar .os-viewport.os-viewport-native-scrollbars-invisible"], ([scrollNode]) => { + scrollNode.setAttribute("fade", "bottom"); + scrollNode.addEventListener("scroll", () => { + if (scrollNode.scrollTop == 0) { + scrollNode.setAttribute("fade", "bottom"); + } else if (scrollNode.scrollHeight - scrollNode.clientHeight - scrollNode.scrollTop == 0) { + scrollNode.setAttribute("fade", "top"); + } else { + scrollNode.setAttribute("fade", "full"); + } + }); +}); + +// improve styles at smaller sizes +waitForElement([".Root__main-view .os-resize-observer-host"], ([resizeHost]) => { + const observer = new ResizeObserver(updateVariable); + observer.observe(resizeHost); + function updateVariable([ event ]) { + document.documentElement.style.setProperty( + "--main-view-width", event.contentRect.width + "px"); + if (event.contentRect.width < 700) { + document.documentElement.classList.add("minimal-player"); + } else { + document.documentElement.classList.remove("minimal-player"); + } + if (event.contentRect.width < 550) { + document.documentElement.classList.add("extra-minimal-player"); + } else { + document.documentElement.classList.remove("extra-minimal-player"); + } + } +}); + +(function Dribbblish() { + // dynamic playback time tooltip + const progBar = document.querySelector(".playback-bar"); + const root = document.querySelector(".Root"); + + if (!Spicetify.Player.origin || !progBar || !root) { + setTimeout(Dribbblish, 300); + return; + } + + const tooltip = document.createElement("div"); + tooltip.className = "prog-tooltip"; + progBar.append(tooltip); + + const progKnob = progBar.querySelector(".progress-bar__slider"); + + function updateProgTime({ data: e }) { + const offsetX = progKnob.offsetLeft + progKnob.offsetWidth / 2; + const maxWidth = progBar.offsetWidth; + const curWidth = Spicetify.Player.getProgressPercent() * maxWidth; + const ttWidth = tooltip.offsetWidth / 2; + if (curWidth < ttWidth) { + tooltip.style.left = String(offsetX) + "px"; + } else if (curWidth > maxWidth - ttWidth) { + tooltip.style.left = String(offsetX - ttWidth * 2) + "px"; + } else { + tooltip.style.left = String(offsetX - ttWidth) + "px"; + } + tooltip.innerText = Spicetify.Player.formatTime(e) + " / " + + Spicetify.Player.formatTime(Spicetify.Player.getDuration()); + } + Spicetify.Player.addEventListener("onprogress", updateProgTime); + updateProgTime({ data: Spicetify.Player.getProgress() }); + + Spicetify.CosmosAsync.sub("sp://connect/v1", (state) => { + const isExternal = state.devices.some(a => a.is_active); + if (isExternal) { + root.classList.add("is-connectBarVisible"); + } else { + root.classList.remove("is-connectBarVisible"); + } + }); + + // filepicker for custom folder images + const filePickerForm = document.createElement("form"); + filePickerForm.setAttribute("aria-hidden", true); + filePickerForm.innerHTML = ''; + document.body.appendChild(filePickerForm); + /** @type {HTMLInputElement} */ + const filePickerInput = filePickerForm.childNodes[0]; + filePickerInput.accept = [ + "image/jpeg", + "image/apng", + "image/avif", + "image/gif", + "image/png", + "image/svg+xml", + "image/webp" + ].join(","); + + filePickerInput.onchange = () => { + if (!filePickerInput.files.length) return; + + const file = filePickerInput.files[0]; + const reader = new FileReader; + reader.onload = (event) => { + const result = event.target.result; + const id = Spicetify.URI.from(filePickerInput.uri).id; + try { + localStorage.setItem( + "dribbblish:folder-image:" + id, + result + ); + } catch { + Spicetify.showNotification("File too large"); + } + DribbblishShared.loadPlaylistImage?.call(); + } + reader.readAsDataURL(file); + } + + // context menu items for custom folder images + new Spicetify.ContextMenu.Item("Remove folder image", + ([uri]) => { + const id = Spicetify.URI.from(uri).id; + localStorage.removeItem("dribbblish:folder-image:" + id); + DribbblishShared.loadPlaylistImage?.call(); + }, + ([uri]) => Spicetify.URI.isFolder(uri), + "x", + ).register(); + new Spicetify.ContextMenu.Item("Choose folder image", + ([uri]) => { + filePickerInput.uri = uri; + filePickerForm.reset(); + filePickerInput.click(); + }, + ([uri]) => Spicetify.URI.isFolder(uri), + "edit", + ).register(); +})(); diff --git a/Themes/Everforest/.config/spicetify/Themes/Dribbblish/user.css b/Themes/Everforest/.config/spicetify/Themes/Dribbblish/user.css old mode 100755 new mode 100644 index e6f35da..7f1558a --- a/Themes/Everforest/.config/spicetify/Themes/Dribbblish/user.css +++ b/Themes/Everforest/.config/spicetify/Themes/Dribbblish/user.css @@ -14,14 +14,16 @@ html.buddyFeed-hide-text { @font-face { font-family: "Google Sans Display"; - src: url("glue-resources/fonts/GoogleSansDisplayRegular.woff2") format("woff2"); + src: url("glue-resources/fonts/GoogleSansDisplayRegular.woff2") + format("woff2"); font-style: normal; font-weight: 400; } @font-face { font-family: "Google Sans Display"; - src: url("glue-resources/fonts/GoogleSansDisplayMedium.woff2") format("woff2"); + src: url("glue-resources/fonts/GoogleSansDisplayMedium.woff2") + format("woff2"); font-style: normal; font-weight: 500; } @@ -41,10 +43,14 @@ html.buddyFeed-hide-text { } body { - --glue-font-family: "Google Sans Display", "Roboto", spotify-circular, spotify-circular-cyrillic, spotify-circular-arabic, spotify-circular-hebrew, Helvetica Neue, helvetica, arial, + --glue-font-family: "Google Sans Display", "Roboto", spotify-circular, + spotify-circular-cyrillic, spotify-circular-arabic, + spotify-circular-hebrew, Helvetica Neue, helvetica, arial, Hiragino Kaku Gothic Pro, Meiryo, MS Gothic, sans-serif; - --info-font-family: "Roboto", spotify-circular, spotify-circular-cyrillic, spotify-circular-arabic, spotify-circular-hebrew, Helvetica Neue, helvetica, arial, Hiragino Kaku Gothic Pro, Meiryo, - MS Gothic, sans-serif; + --info-font-family: "Roboto", spotify-circular, spotify-circular-cyrillic, + spotify-circular-arabic, spotify-circular-hebrew, Helvetica Neue, + helvetica, arial, Hiragino Kaku Gothic Pro, Meiryo, MS Gothic, + sans-serif; font-family: var(--glue-font-family); letter-spacing: normal; } @@ -259,7 +265,11 @@ span.artist-artistVerifiedBadge-badge svg > path:last-of-type { .main-nowPlayingBar-container { border-radius: 0 0 var(--main-corner-radius) var(--main-corner-radius); background-color: unset; - background: radial-gradient(ellipse at right 50% bottom -80px, rgba(var(--spice-rgb-sidebar), 0.55), var(--spice-main) 60%); + background: radial-gradient( + ellipse at right 50% bottom -80px, + rgba(var(--spice-rgb-sidebar), 0.55), + var(--spice-main) 60% + ); border-top: 0; min-width: 518px; } @@ -488,7 +498,9 @@ img.playlist-picture[src$=".svg"] { } .main-rootlist-rootlistItem { - padding-left: calc(var(--indentation) * var(--left-sidebar-item-indentation-width)) !important; + padding-left: calc( + var(--indentation) * var(--left-sidebar-item-indentation-width) + ) !important; padding-right: 0 !important; transition: padding-left 0.5s ease; } @@ -532,7 +544,8 @@ li.GlueDropTarget { padding-top: calc(var(--os-windows-icon-dodge) * 24px); } -.spotify__container--is-desktop:not(.fullscreen).spotify__os--is-windows .main-navBar-entryPoints { +.spotify__container--is-desktop:not(.fullscreen).spotify__os--is-windows + .main-navBar-entryPoints { padding-top: calc(var(--os-windows-icon-dodge) * 12px + 12px); } @@ -540,7 +553,8 @@ li.GlueDropTarget { padding-top: calc(var(--os-windows-icon-dodge) * 32px); } -.spotify__container--is-desktop.spotify__os--is-windows[dir="ltr"] .main-topBar-container { +.spotify__container--is-desktop.spotify__os--is-windows[dir="ltr"] + .main-topBar-container { padding-right: calc(var(--os-windows-icon-dodge) * 135px + 32px); } @@ -549,8 +563,10 @@ li.GlueDropTarget { } /** Linux-specific remove padding */ -.spotify__container--is-desktop:not(.fullscreen).spotify__os--is-linux .main-navBar-entryPoints, -.spotify__container--is-desktop:not(.fullscreen).spotify__os--is-linux .main-navBar-navBar { +.spotify__container--is-desktop:not(.fullscreen).spotify__os--is-linux + .main-navBar-entryPoints, +.spotify__container--is-desktop:not(.fullscreen).spotify__os--is-linux + .main-navBar-navBar { padding-top: 0; } @@ -652,7 +668,8 @@ li.GlueDropTarget { } .main-collectionLinkButton-collectionLinkButton .main-collectionLinkButton-icon, -.main-collectionLinkButton-collectionLinkButton .main-collectionLinkButton-collectionLinkText, +.main-collectionLinkButton-collectionLinkButton + .main-collectionLinkButton-collectionLinkText, .main-createPlaylistButton-button { opacity: 1; } @@ -686,14 +703,27 @@ li.GlueDropTarget { padding: var(--main-gap) 0; } -.Root__top-container:has(> .main-buddyFeed-container ) { +.Root__top-container:has(> .main-buddyFeed-container):not( + .Root__top-container--right-sidebar-hidden + ) { grid-template-areas: "top-bar top-bar top-bar" "nav-bar main-view right-sidebar" "nav-bar now-playing-bar right-sidebar"; } -.Root__top-container:not(:has(> .main-buddyFeed-container )) { +/* for spotify v prior to 1.2.9 */ + +.Root__top-container:not(:has(> .main-buddyFeed-container)) { + grid-template-areas: + "top-bar top-bar" + "nav-bar main-view" + "nav-bar now-playing-bar"; + padding-right: var(--main-gap); +} + +/* for spotify v 1.2.9 */ +.Root__top-container.Root__top-container--right-sidebar-hidden { grid-template-areas: "top-bar top-bar" "nav-bar main-view" @@ -727,7 +757,9 @@ html.right-expanded-cover .main-coverSlotExpanded-container { left: unset; } -html.right-expanded-cover .Root__top-container--right-sidebar-visible .main-coverSlotExpanded-container { +html.right-expanded-cover + .Root__top-container--right-sidebar-visible + .main-coverSlotExpanded-container { right: calc(var(--main-gap) + var(--panel-width) + 10px); left: unset; } @@ -871,13 +903,21 @@ section.contentSpacing { } /* add fade to sidebar playlist list */ -.main-navBar-navBar .os-viewport.os-viewport-native-scrollbars-invisible[fade="full"] { - -webkit-mask-image: linear-gradient(transparent 0%, black 10%, black 90%, transparent 100%); +.main-navBar-navBar + .os-viewport.os-viewport-native-scrollbars-invisible[fade="full"] { + -webkit-mask-image: linear-gradient( + transparent 0%, + black 10%, + black 90%, + transparent 100% + ); } -.main-navBar-navBar .os-viewport.os-viewport-native-scrollbars-invisible[fade="top"] { +.main-navBar-navBar + .os-viewport.os-viewport-native-scrollbars-invisible[fade="top"] { -webkit-mask-image: linear-gradient(transparent 0%, black 10%); } -.main-navBar-navBar .os-viewport.os-viewport-native-scrollbars-invisible[fade="bottom"] { +.main-navBar-navBar + .os-viewport.os-viewport-native-scrollbars-invisible[fade="bottom"] { -webkit-mask-image: linear-gradient(black 90%, transparent 100%); } @@ -893,6 +933,11 @@ section.contentSpacing { } /* buddy feed w/ hidden text*/ + +.buddyFeed-hide-text .Root__right-sidebar { + width: 72px !important; +} + .buddyFeed-hide-text .NdQkQZhcYIEcJnRdAYcQ, .buddyFeed-hide-text .main-buddyFeed-header { display: none; @@ -926,12 +971,12 @@ section.contentSpacing { } .main-buddyFeed-actions button { - color: var(--spice-sidebar-text) + color: var(--spice-sidebar-text); } .NdQkQZhcYIEcJnRdAYcQ, .main-buddyFeed-header { - padding-left: 16px; + padding-left: 0; } .spotify__os--is-windows .zuwPpHAEtIqahnB2u9NR { @@ -988,7 +1033,8 @@ a.main-collectionLinkButton-collectionLinkButton.main-collectionLinkButton-selec } /* keep progress knob on page : important for js to work */ -.progress-bar:not(:hover):not(:focus):not(.DuvrswZugGajIFNXObAr) .progress-bar__slider { +.progress-bar:not(:hover):not(:focus):not(.DuvrswZugGajIFNXObAr) + .progress-bar__slider { display: block; visibility: hidden; } @@ -1002,15 +1048,29 @@ a.main-collectionLinkButton-collectionLinkButton.main-collectionLinkButton-selec transition: left 1s linear; } -.playback-progressbar-isInteractive .DuvrswZugGajIFNXObAr .x-progressBar-fillColor, -.playback-progressbar-isInteractive .DuvrswZugGajIFNXObAr .progress-bar__slider { +.playback-progressbar-isInteractive + .DuvrswZugGajIFNXObAr + .x-progressBar-fillColor, +.playback-progressbar-isInteractive + .DuvrswZugGajIFNXObAr + .progress-bar__slider { transition: none; } /* marketplace page */ .marketplace-header__left h1, .marketplace-card-type-heading { - font-family: var(--font-family, CircularSpTitle, CircularSpTitle-Tall, CircularSp-Arab, CircularSp-Hebr, CircularSp-Cyrl, CircularSp-Grek, CircularSp-Deva, var(--fallback-fonts, sans-serif)); + font-family: var( + --font-family, + CircularSpTitle, + CircularSpTitle-Tall, + CircularSp-Arab, + CircularSp-Hebr, + CircularSp-Cyrl, + CircularSp-Grek, + CircularSp-Deva, + var(--fallback-fonts, sans-serif) + ); } [dir="ltr"] .collection-collection-tabBar { diff --git a/Themes/Everforest/.config/spicetify/Themes/manifest.json b/Themes/Everforest/.config/spicetify/Themes/manifest.json deleted file mode 100755 index b12f8c8..0000000 --- a/Themes/Everforest/.config/spicetify/Themes/manifest.json +++ /dev/null @@ -1,159 +0,0 @@ -[ - { - "name": "BurntSienna", - "description": "BurntSienna", - "preview": "BurntSienna/screenshot.png", - "readme": "BurntSienna/README.md", - "usercss": "BurntSienna/user.css", - "schemes": "BurntSienna/color.ini", - "authors": [ - { - "name": "pjaspinski", - "url": "https://github.com/pjaspinski" - } - ] - }, - { - "name": "Default", - "description": "Default", - "preview": "Default/ocean.png", - "readme": "Default/README.md", - "usercss": "Default/user.css", - "schemes": "Default/color.ini", - "authors": [ - { - "name": "Blacksuan19", - "url": "https://github.com/Blacksuan19" - } - ] - }, - { - "name": "Dreary", - "description": "Dreary", - "preview": "Dreary/deeper.png", - "readme": "Dreary/README.md", - "usercss": "Dreary/user.css", - "schemes": "Dreary/color.ini", - "authors": [ - { - "name": "CharlieS1103", - "url": "https://github.com/CharlieS1103" - } - ] - }, - { - "name": "Dribbblish", - "description": "Dribbblish", - "preview": "Dribbblish/base.png", - "readme": "Dribbblish/README.md", - "usercss": "Dribbblish/user.css", - "schemes": "Dribbblish/color.ini", - "include": [ - "https://raw.githubusercontent.com/spicetify/spicetify-themes/master/Dribbblish/dribbblish.js" - ], - "authors": [ - { - "name": "khanhas", - "url": "https://github.com/khanhas" - } - ] - }, - { - "name": "Onepunch", - "description": "Onepunch", - "preview": "Onepunch/screenshots/dark_home.png", - "readme": "Onepunch/README.md", - "usercss": "Onepunch/user.css", - "schemes": "Onepunch/color.ini", - "authors": [ - { - "name": "okarin001", - "url": "https://github.com/okarin001" - } - ] - }, - { - "name": "Sleek", - "description": "Sleek", - "preview": "Sleek/coral.png", - "readme": "Sleek/README.md", - "usercss": "Sleek/user.css", - "schemes": "Sleek/color.ini", - "authors": [ - { - "name": "harbassan", - "url": "https://github.com/harbassan" - } - ] - }, - { - "name": "Turntable", - "description": "Turntable", - "preview": "Turntable/screenshots/turntable.png", - "readme": "Turntable/README.md", - "usercss": "Turntable/user.css", - "schemes": "Turntable/color.ini", - "include": [ - "https://raw.githubusercontent.com/spicetify/spicetify-themes/master/Turntable/turntable.js" - ], - "authors": [ - { - "name": "Grason Chan", - "url": "https://github.com/grasonchan" - } - ] - }, - { - "name": "Ziro", - "description": "a smooth theme inspired by zorin os", - "preview": "https://raw.githubusercontent.com/schnensch0/ziro/main/preview/mockup.png", - "readme": "Ziro/README.md", - "usercss": "Ziro/user.css", - "schemes": "Ziro/color.ini", - "authors": [ - { - "name": "schnensch0", - "url": "https://github.com/schnensch0" - } - ] - }, - { - "name": "Flow", - "description": "Spicetify theme that has linear gradient effect and vertical playbar", - "preview": "https://raw.githubusercontent.com/spicetify/spicetify-themes/master/Flow/screenshots/pink.png", - "readme": "Flow/README.md", - "usercss": "Flow/user.css", - "schemes": "Flow/color.ini", - "authors": [ - { - "name": "Ian Liao", - "url": "https://github.com/ian-Liaozy" - }, - { - "name": "Victoria Zhang", - "url": "https://github.com/Ruixi-Zhang" - }, - { - "name": "Yu Sung Lee", - "url": "https://github.com/yslDevelop" - }, - { - "name": "Alex Casieri", - "url": "https://github.com/alexcasieri30" - } - ] - }, - { - "name": "Blossom", - "description": "Blossom Theme, a simple theme.", - "preview": "https://user-images.githubusercontent.com/72624799/203471073-4a5e6cf0-a5dc-4ecc-9a12-56d5fc716ac4.png", - "readme": "Blossom/README.md", - "usercss": "Blossom/user.css", - "schemes": "Blossom/color.ini", - "authors": [ - { - "name": "Robatortas", "url": "https://github.com/Robatortas" - } - ] - } -]