add: Dribbblish v2
92
Dribbblish/README.md
Normal file
@ -0,0 +1,92 @@
|
||||
# Dribbblish
|
||||
|
||||
### base
|
||||
![base](base.png)
|
||||
### white
|
||||
![white](white.png)
|
||||
### dark
|
||||
![dark](dark.png)
|
||||
### nord-light
|
||||
![nord-light](nord-light.png)
|
||||
### nord-dark
|
||||
![nord-dark](nord-dark.png)
|
||||
### beach-sunset
|
||||
![beach-sunset](beach-sunset.png)
|
||||
### purple
|
||||
![purple](purple.png)
|
||||
### samourai
|
||||
![samourai](samourai.png)
|
||||
|
||||
## Features
|
||||
### Resizable sidebar
|
||||
|
||||
<img src="https://i.imgur.com/1zomkmd.png" alt="img" align="center" width="500px">
|
||||
|
||||
### Customizable sidebar
|
||||
Rearrange icons positions, stick icons to header or hide unnecessary to save space.
|
||||
Turn on Config mode in Profile menu and hover on icon to show control buttons.
|
||||
After you finish customizing, turn off Config mode in Profile menu to save.
|
||||
|
||||
<img src="https://i.imgur.com/86gqPe8.png" alt="img" align="center" width="500px">
|
||||
|
||||
### Playlist Folder image
|
||||
Right click at folder and choose images for your playlist folder. Every image formats supported by Chrome can be used, but do keep image size small and in compressed format.
|
||||
|
||||
<img src="https://i.imgur.com/WGQ7Bev.gif" alt="img" align="center" width="500px">
|
||||
|
||||
### Left/Right expanded cover
|
||||
In profile menu, toggle option "Right expanded cover" to change expaned current track cover image to left or right side, whereever you prefer.
|
||||
|
||||
## Install
|
||||
Make sure you are using spicetify v2 and Spotify v1.1.58 or later.
|
||||
|
||||
Run these commands:
|
||||
|
||||
### Linux and MacOS:
|
||||
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 apply
|
||||
```
|
||||
|
||||
### Windows
|
||||
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 apply
|
||||
```
|
||||
|
||||
## Change Color Schemes
|
||||
There are 9 color schemes you can choose: `base`, `white`, `dark`, `dracula`, `nord-dark`, `nord-light`, `samourai`, `purple`. Change scheme with commands:
|
||||
```
|
||||
spicetify config color_scheme <scheme name>
|
||||
spicetify apply
|
||||
```
|
||||
|
||||
## Hide Window Controls
|
||||
Windows user, please edit your Spotify shortcut and add flag `--transparent-window-controls` after the Spotify.exe:
|
||||
![instruction1](./windows-shortcut-instruction.png)
|
||||
|
||||
Alternatively, you can use `SpotifyNoControl.exe`, included in this theme package, to completely remove all windows controls and title menu (three dot at top left corner). Title menu still can be access via Alt key. Closing, minimizing can be done via right click menu at top window region.
|
||||
`SpotifyNoControl.exe` could be used as Spotify launcher, it opens Spotify and hides controls right after. You can drag and drop it to your taskbar but make sure you unpin the original Spotify icon first. Alternatively you can make a shortcut for it and add to desktop or start menu.
|
||||
Moreover, by default, Spotify adjusted sidebar items and profile menu icon to stay out of Windows native controls region. If you decided to use `SpotifyNoControl.exe` from now on, please open `user.css` file and change variable `--os-windows-icon-dodge` value to 0 as instruction to snap icons back to their original position.
|
||||
|
||||
![nocontrol](https://i.imgur.com/qdZyv1t.png)
|
||||
|
||||
## Uninstall
|
||||
|
||||
Remove the dribbblish script with the following commands
|
||||
|
||||
```
|
||||
spicetify config extensions dribbblish.js-
|
||||
spicetify apply
|
||||
```
|
BIN
Dribbblish/assets/glue-resources/fonts/Roboto.woff2
Normal file
BIN
Dribbblish/assets/glue-resources/fonts/RobotoMedium.woff2
Normal file
BIN
Dribbblish/base.png
Normal file
After Width: | Height: | Size: 772 KiB |
BIN
Dribbblish/beach-sunset.png
Normal file
After Width: | Height: | Size: 532 KiB |
162
Dribbblish/color.ini
Normal file
@ -0,0 +1,162 @@
|
||||
[base]
|
||||
text = FFFFFF
|
||||
subtext = F0F0F0
|
||||
sidebar-text = FFFFFF
|
||||
main = 000000
|
||||
sidebar = 1ed760
|
||||
player = 000000
|
||||
card = 000000
|
||||
shadow = 202020
|
||||
selected-row = 797979
|
||||
button = 1ed760
|
||||
button-active = 1ed760
|
||||
button-disabled = 535353
|
||||
tab-active = 166632
|
||||
notification = 1db954
|
||||
notification-error = e22134
|
||||
misc = BFBFBF
|
||||
|
||||
|
||||
[white]
|
||||
text = 363636
|
||||
subtext = 3D3D3D
|
||||
sidebar-text = FFF9F4
|
||||
main = FFF9F4
|
||||
sidebar = FFA789
|
||||
player = FFF9F4
|
||||
card = FFF9F4
|
||||
shadow = d3d3d3
|
||||
selected-row = 6D6D6D
|
||||
button = ff8367
|
||||
button-active = ff8367
|
||||
button-disabled = 535353
|
||||
tab-active = ffdace
|
||||
notification = FFA789
|
||||
notification-error = e22134
|
||||
misc = BFBFBF
|
||||
|
||||
[dark]
|
||||
text = F0F0F0
|
||||
subtext = F0F0F0
|
||||
sidebar-text = 0a0e14
|
||||
main = 0a0e14
|
||||
sidebar = C2D935
|
||||
player = 0a0e14
|
||||
card = 0a0e14
|
||||
shadow = 202020
|
||||
selected-row = DEDEDE
|
||||
button = C2D935
|
||||
button-active = C2D935
|
||||
button-disabled = 535353
|
||||
tab-active = 727d2b
|
||||
notification = C2D935
|
||||
notification-error = e22134
|
||||
misc = BFBFBF
|
||||
|
||||
[dracula]
|
||||
text = f8f8f2
|
||||
subtext = f8f8f2
|
||||
sidebar-text = F0F0F0
|
||||
main = 44475a
|
||||
sidebar = 6272a4
|
||||
player = 44475a
|
||||
card = 6272a4
|
||||
shadow = 000000
|
||||
selected-row = bd93f9
|
||||
button = ffb86c
|
||||
button-active = 8be9fd
|
||||
button-disabled = 535353
|
||||
tab-active = 6272a4
|
||||
notification = bd93f9
|
||||
notification-error = e22134
|
||||
misc = BFBFBF
|
||||
|
||||
[nord-light]
|
||||
text = 2e3440
|
||||
subtext = 3b4252
|
||||
sidebar-text = ECEFF4
|
||||
main = ECEFF4
|
||||
sidebar = 5E81AC
|
||||
player = ECEFF4
|
||||
card = ebcb8b
|
||||
shadow = eceff4
|
||||
selected-row = 4c566a
|
||||
button = 81a1c1
|
||||
button-active = 81a1c1
|
||||
button-disabled = c0c0c0
|
||||
tab-active = ebcb8b
|
||||
notification = a3be8c
|
||||
notification-error = bf616a
|
||||
misc = BFBFBF
|
||||
|
||||
[nord-dark]
|
||||
text = ECEFF4
|
||||
subtext = E5E9F0
|
||||
sidebar-text = 434c5e
|
||||
main = 2e3440
|
||||
sidebar = 88C0D0
|
||||
player = 2e3440
|
||||
card = 2e3440
|
||||
shadow = 2E3440
|
||||
selected-row = D8DEE9
|
||||
button = 81A1C1
|
||||
button-active = 81A1C1
|
||||
button-disabled = 434C5E
|
||||
tab-active = 434C5E
|
||||
notification = A3BE8C
|
||||
notification-error = BF616A
|
||||
misc = BFBFBF
|
||||
|
||||
[purple]
|
||||
text = f1eaff
|
||||
subtext = f1eaff
|
||||
sidebar-text = e0d0ff
|
||||
main = 0A0E14
|
||||
sidebar = 6F3C89
|
||||
player = 0A0E14
|
||||
card = 0A0E14
|
||||
shadow = 3a2645
|
||||
selected-row = EBDFFF
|
||||
button = c76af6
|
||||
button-active = 6F3C89
|
||||
button-disabled = 535353
|
||||
tab-active = 58306D
|
||||
notification = ff9e00
|
||||
notification-error = f61379
|
||||
misc = DEDEDE
|
||||
|
||||
[samourai]
|
||||
text = ebdbb2
|
||||
subtext = ebdbb2
|
||||
sidebar-text = 461217
|
||||
main = 461217
|
||||
sidebar = ebdbb2
|
||||
player = 461217
|
||||
card = 461217
|
||||
shadow = 3a2645
|
||||
selected-row = 909090
|
||||
button = e7a52d
|
||||
button-active = e7a52d
|
||||
button-disabled = 535353
|
||||
tab-active = e7a52d
|
||||
notification = e7a52d
|
||||
notification-error = e22134
|
||||
misc = BFBFBF
|
||||
|
||||
[beach-sunset]
|
||||
text = FFFFFF
|
||||
subtext = F0F0F0
|
||||
sidebar-text = F0F0F0
|
||||
main = 262626
|
||||
sidebar = bd3e3e
|
||||
player = 262626
|
||||
card = 262626
|
||||
shadow = 000000
|
||||
selected-row = d1d6e2
|
||||
button = f1a84f
|
||||
button-active = c98430
|
||||
button-disabled = 535353
|
||||
tab-active = f1a84f
|
||||
notification = c98430
|
||||
notification-error = e22134
|
||||
misc = BFBFBF
|
BIN
Dribbblish/dark.png
Normal file
After Width: | Height: | Size: 262 KiB |
398
Dribbblish/dribbblish.js
Normal file
@ -0,0 +1,398 @@
|
||||
// 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");
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
DribbblishShared.configMenu.register();
|
||||
DribbblishShared.configMenu.subItems.push(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([".main-rootlist-rootlistPlaylistsScrollNode ul"], ([query]) => {
|
||||
/** Replace Playlist name with their pictures */
|
||||
function loadPlaylistImage() {
|
||||
const sidebarItem = query.querySelectorAll("li.GlueDropTarget");
|
||||
for (let i = 0; i < sidebarItem.length; i++) {
|
||||
const item = sidebarItem[i];
|
||||
let link = item.querySelector("a");
|
||||
if (!link) continue;
|
||||
|
||||
let [_, app, uid ] = link.pathname.split("/");
|
||||
let uri;
|
||||
if (app === "playlist") {
|
||||
uri = Spicetify.URI.playlistV2URI(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);
|
||||
}
|
||||
if (base64) {
|
||||
img.src = base64;
|
||||
} else {
|
||||
img.src = "";
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
Spicetify.CosmosAsync.get(
|
||||
`sp://core-playlist/v1/playlist/${uri.toURI()}/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;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
DribbblishShared.loadPlaylistImage = loadPlaylistImage;
|
||||
loadPlaylistImage();
|
||||
|
||||
new MutationObserver(loadPlaylistImage)
|
||||
.observe(query, {childList: true});
|
||||
});
|
||||
|
||||
waitForElement([".Root__main-view"], ([mainView]) => {
|
||||
const shadow = document.createElement("div");
|
||||
shadow.id = "dribbblish-back-shadow";
|
||||
mainView.prepend(shadow);
|
||||
});
|
||||
|
||||
waitForElement([".main-rootlist-rootlistPlaylistsScrollNode"], (queries) => {
|
||||
const fade = document.createElement("div");
|
||||
fade.id = "dribbblish-sidebar-fade-in";
|
||||
queries[0].append(fade);
|
||||
});
|
||||
|
||||
waitForElement([
|
||||
".main-navBar-entryPoints",
|
||||
".main-rootlist-rootlistPlaylistsScrollNode .os-content",
|
||||
".main-rootlist-rootlistContent"
|
||||
], ([appItems, playlistItems, personalLibrary]) => {
|
||||
const HIDDEN = 0, SHOW = 1, STICKY = 2;
|
||||
|
||||
let buttons = [];
|
||||
let storage = [];
|
||||
let ordered;
|
||||
const list = document.createElement("ul");
|
||||
const hiddenList = document.createElement("ul");
|
||||
hiddenList.id = "dribs-hidden-list";
|
||||
hiddenList.classList.add("hidden-visually");
|
||||
const playlistList = playlistItems.querySelector("ul");
|
||||
playlistList.id = "dribs-playlist-list";
|
||||
playlistItems.prepend(list, hiddenList);
|
||||
|
||||
const up = document.createElement("button"); up.innerText = "Up";
|
||||
const down = document.createElement("button"); down.innerText = "Down";
|
||||
const hide = document.createElement("button");
|
||||
const stick = document.createElement("button");
|
||||
const container = document.createElement("div");
|
||||
container.id = "dribs-sidebar-config";
|
||||
container.append(up, down, hide, stick);
|
||||
|
||||
for (const ele of appItems.children) {
|
||||
ele.dataset.id = ele.querySelector("a").pathname;
|
||||
buttons.push(ele);
|
||||
}
|
||||
|
||||
for (const ele of personalLibrary.querySelectorAll("div.GlueDropTarget")) {
|
||||
const link = ele.querySelector("a");
|
||||
if (!link) {
|
||||
ele.dataset.id = "/add";
|
||||
} else {
|
||||
ele.dataset.id = link.pathname;
|
||||
}
|
||||
ele.classList.add("personal-library");
|
||||
buttons.push(ele);
|
||||
}
|
||||
|
||||
try {
|
||||
storage = JSON.parse(localStorage.getItem("dribs-sidebar-config"))
|
||||
if (!Array.isArray(storage)) throw "";
|
||||
} catch {
|
||||
storage = buttons.map(el => [el.dataset.id, SHOW]);
|
||||
}
|
||||
|
||||
function arrangeItems() {
|
||||
const newButtons = [...buttons];
|
||||
const orderedButtons = [];
|
||||
for (const ele of storage) {
|
||||
const index = newButtons.findIndex(a => ele[0] === a?.dataset.id);
|
||||
if (index !== -1) {
|
||||
orderedButtons.push([newButtons[index], ele[1]]);
|
||||
newButtons[index] = undefined;
|
||||
}
|
||||
}
|
||||
newButtons
|
||||
.filter(a => a)
|
||||
.forEach(a => orderedButtons.push([a, STICKY]));
|
||||
ordered = orderedButtons;
|
||||
}
|
||||
|
||||
function appendItems() {
|
||||
const toShow = [], toHide = [], toStick = [];
|
||||
for (const el of ordered) {
|
||||
const [ item, status ] = el;
|
||||
if (status === STICKY) {
|
||||
appItems.append(item);
|
||||
toStick.push(el);
|
||||
} else if (status === SHOW) {
|
||||
list.append(item);
|
||||
toShow.push(el);
|
||||
} else {
|
||||
hiddenList.append(item);
|
||||
toHide.push(el);
|
||||
}
|
||||
}
|
||||
ordered = [ ...toStick, ...toShow, ...toHide ];
|
||||
}
|
||||
|
||||
function writeStorage() {
|
||||
const array = ordered.map(a => [a[0].dataset.id, a[1]]);
|
||||
console.log(array);
|
||||
localStorage.setItem("dribs-sidebar-config", JSON.stringify(array));
|
||||
}
|
||||
|
||||
arrangeItems();
|
||||
appendItems();
|
||||
|
||||
const observer = new MutationObserver(() => {
|
||||
const residues = personalLibrary.querySelectorAll(".main-rootlist-rootlistContent > div.GlueDropTarget");
|
||||
for (const ele of residues) {
|
||||
ele.dataset.id = ele.querySelector("a").pathname;
|
||||
ele.classList.add("personal-library");
|
||||
buttons.push(ele);
|
||||
}
|
||||
arrangeItems();
|
||||
appendItems();
|
||||
});
|
||||
observer.observe(personalLibrary, { childList: true });
|
||||
setTimeout(() => observer.disconnect(), 10000);
|
||||
|
||||
function onSwap(item, dir) {
|
||||
container.remove();
|
||||
const curPos = ordered.findIndex(e => e[0] === item);
|
||||
const newPos = curPos + dir;
|
||||
if (newPos < 0 || newPos > (ordered.length - 1)) return;
|
||||
if (ordered[curPos][1] !== ordered[newPos][1]) return;
|
||||
[ordered[curPos], ordered[newPos]] = [ordered[newPos], ordered[curPos]];
|
||||
appendItems();
|
||||
}
|
||||
|
||||
function onChangeStatus(item, status) {
|
||||
container.remove();
|
||||
const curPos = ordered.findIndex(e => e[0] === item);
|
||||
ordered[curPos][1] = ordered[curPos][1] === status ? SHOW : status;
|
||||
appendItems();
|
||||
}
|
||||
|
||||
function injectInteraction() {
|
||||
document.documentElement.style.setProperty("--sidebar-width", "280px");
|
||||
document.documentElement.classList.remove("sidebar-hide-text");
|
||||
hiddenList.classList.remove("hidden-visually");
|
||||
for (const el of ordered) {
|
||||
el[0].onmouseover = () => {
|
||||
const [ item, status ] = el;
|
||||
const index = ordered.findIndex(a => a === el);
|
||||
if (index === 0 || ordered[index][1] !== ordered[index - 1][1]) {
|
||||
up.disabled = true;
|
||||
} else {
|
||||
up.disabled = false;
|
||||
up.onclick = () => onSwap(item, -1);
|
||||
}
|
||||
if (index === (ordered.length - 1) || ordered[index][1] !== ordered[index + 1][1]) {
|
||||
down.disabled = true;
|
||||
} else {
|
||||
down.disabled = false;
|
||||
down.onclick = () => onSwap(item, 1);
|
||||
}
|
||||
|
||||
stick.innerText = status === STICKY ? "Unstick" : "Stick";
|
||||
hide.innerText = status === HIDDEN ? "Unhide" : "Hide";
|
||||
hide.onclick = () => onChangeStatus(item, HIDDEN);
|
||||
stick.onclick = () => onChangeStatus(item, STICKY);
|
||||
|
||||
item.append(container);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
function removeInteraction() {
|
||||
hiddenList.classList.add("hidden-visually");
|
||||
container.remove();
|
||||
ordered.forEach(a => a[0].onmouseover = undefined);
|
||||
writeStorage();
|
||||
}
|
||||
|
||||
DribbblishShared.configMenu.subItems.push(new Spicetify.Menu.Item(
|
||||
"Sidebar config",
|
||||
false,
|
||||
(self) => {
|
||||
self.isEnabled = !self.isEnabled;
|
||||
if (self.isEnabled) {
|
||||
injectInteraction();
|
||||
} else {
|
||||
removeInteraction();
|
||||
}
|
||||
}
|
||||
));
|
||||
});
|
||||
|
||||
waitForElement([".Root__nav-bar .LayoutResizer__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();
|
||||
});
|
||||
|
||||
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");
|
||||
document.documentElement.style.setProperty(
|
||||
"--main-view-height", event.contentRect.height + "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() {
|
||||
const progBar = document.querySelector(".playback-bar");
|
||||
|
||||
if (!Spicetify.Player.origin || !progBar) {
|
||||
setTimeout(Dribbblish, 300);
|
||||
return;
|
||||
}
|
||||
|
||||
const tooltip = document.createElement("div");
|
||||
tooltip.className = "prog-tooltip";
|
||||
progBar.append(tooltip);
|
||||
|
||||
const progKnob = progBar.querySelector(".progress-bar__slider");
|
||||
|
||||
Spicetify.Player.addEventListener("onprogress", ({ 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());
|
||||
});
|
||||
|
||||
const filePickerForm = document.createElement("form");
|
||||
filePickerForm.setAttribute("aria-hidden", true);
|
||||
filePickerForm.innerHTML = '<input type="file" class="hidden-visually" />';
|
||||
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);
|
||||
}
|
||||
|
||||
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();
|
||||
})();
|
BIN
Dribbblish/nord-dark.png
Normal file
After Width: | Height: | Size: 919 KiB |
BIN
Dribbblish/nord-light.png
Normal file
After Width: | Height: | Size: 224 KiB |
BIN
Dribbblish/purple.png
Normal file
After Width: | Height: | Size: 657 KiB |
BIN
Dribbblish/samourai.png
Normal file
After Width: | Height: | Size: 169 KiB |
770
Dribbblish/user.css
Normal file
@ -0,0 +1,770 @@
|
||||
:root {
|
||||
--bar-height: 70px;
|
||||
--bar-cover-art-size: 40px;
|
||||
--main-gap: 10px;
|
||||
--main-corner-radius: 10px;
|
||||
--scrollbar-vertical-size: 8px;
|
||||
--cover-border-radius: 8px;
|
||||
--os-windows-icon-dodge: 0;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "Google Sans Display";
|
||||
src: url("https://local_resource_host/fonts/GoogleSansDisplayRegular.woff2") format("woff2");
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "Google Sans Display";
|
||||
src: url("https://local_resource_host/fonts/GoogleSansDisplayMedium.woff2") format("woff2");
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
src: url("https://local_resource_host/fonts/Roboto.woff2") format("woff2");
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
src: url("https://local_resource_host/fonts/RobotoMedium.woff2") format("woff2");
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
body {
|
||||
--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;
|
||||
font-family: var(--glue-font-family);
|
||||
letter-spacing: normal;
|
||||
}
|
||||
|
||||
.main-type-mesto,
|
||||
.main-type-mestoBold,
|
||||
.main-type-ballad,
|
||||
.main-type-balladBold,
|
||||
.main-type-canon {
|
||||
font-family: var(--info-font-family);
|
||||
letter-spacing: normal;
|
||||
}
|
||||
|
||||
.main-type-ballad {
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.lyrics-lyricsContainer-LyricsLine {
|
||||
font-family: var(--glue-font-family);
|
||||
letter-spacing: normal !important;
|
||||
}
|
||||
|
||||
.main-rootlist-rootlistDividerGradient {
|
||||
background: unset;
|
||||
}
|
||||
|
||||
input {
|
||||
background-color: unset !important;
|
||||
border-bottom: solid 1px var(--spice-text) !important;
|
||||
border-radius: 0 !important;
|
||||
padding: 6px 10px 6px 48px;
|
||||
color: var(--spice-text) !important;
|
||||
}
|
||||
|
||||
.x-searchInput-searchInputSearchIcon,
|
||||
.x-searchInput-searchInputClearButton {
|
||||
color: var(--spice-text) !important;
|
||||
}
|
||||
|
||||
.main-home-homeHeader,
|
||||
.x-entityHeader-overlay,
|
||||
.x-actionBarBackground-background,
|
||||
.main-actionBarBackground-background,
|
||||
.main-entityHeader-overlay,
|
||||
.main-entityHeader-backgroundColor
|
||||
{
|
||||
background-color: unset !important;
|
||||
background-image: unset !important;
|
||||
}
|
||||
|
||||
.main-playButton-PlayButton.main-playButton-primary {
|
||||
color: white;
|
||||
}
|
||||
|
||||
.connect-title, .connect-header {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.connect-device-list {
|
||||
margin: 0px -5px;
|
||||
}
|
||||
|
||||
/* Remove Topbar background colour */
|
||||
.main-topBar-background {
|
||||
background-color: unset !important;
|
||||
}
|
||||
.main-topBar-overlay {
|
||||
background-color: var(--spice-main);
|
||||
}
|
||||
|
||||
.main-entityHeader-shadow,
|
||||
.main-contextMenu-menu,
|
||||
.connect-device-list-container {
|
||||
box-shadow: 0 4px 20px #21212130;
|
||||
}
|
||||
|
||||
.main-trackList-playingIcon {
|
||||
filter: grayscale(1);
|
||||
}
|
||||
|
||||
span.artist-artistVerifiedBadge-badge svg:nth-child(1) {
|
||||
fill: black;
|
||||
}
|
||||
|
||||
/* Full window artist background */
|
||||
.main-entityHeader-background.main-entityHeader-gradient {
|
||||
opacity: 0.3;
|
||||
}
|
||||
|
||||
.main-entityHeader-container.main-entityHeader-withBackgroundImage,
|
||||
.main-entityHeader-background,
|
||||
.main-entityHeader-background.main-entityHeader-overlay:after {
|
||||
height: 100vh;
|
||||
}
|
||||
|
||||
.main-entityHeader-withBackgroundImage .main-entityHeader-headerText {
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.main-entityHeader-container.main-entityHeader-nonWrapped.main-entityHeader-withBackgroundImage {
|
||||
padding-left: 9%;
|
||||
}
|
||||
|
||||
.main-entityHeader-background.main-entityHeader-overlay:after {
|
||||
background-image: linear-gradient(transparent,transparent),linear-gradient(var(--spice-main), var(--spice-main));
|
||||
}
|
||||
|
||||
.artist-artistOverview-overview .main-entityHeader-withBackgroundImage h1 {
|
||||
font-size: 175px !important;
|
||||
line-height: 175px !important;
|
||||
}
|
||||
|
||||
/** Hightlight selected playlist */
|
||||
.main-rootlist-rootlistItemLink.main-rootlist-rootlistItemLinkActive {
|
||||
background: var(--spice-button);
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.main-navBar-navBarLinkActive {
|
||||
background: var(--spice-button);
|
||||
}
|
||||
|
||||
.main-contextMenu-menu {
|
||||
background-color: var(--spice-button);
|
||||
}
|
||||
|
||||
.main-contextMenu-menuHeading,
|
||||
.main-contextMenu-menuItemButton,
|
||||
.main-contextMenu-menuItemButton:not(.main-contextMenu-disabled):focus,
|
||||
.main-contextMenu-menuItemButton:not(.main-contextMenu-disabled):hover {
|
||||
color: var(--spice-main);
|
||||
}
|
||||
|
||||
.main-playPauseButton-button {
|
||||
background-color: var(--spice-button);
|
||||
color: white;
|
||||
}
|
||||
|
||||
/** Queue page header */
|
||||
.queue-queue-title,
|
||||
.queue-playHistory-title {
|
||||
color: var(--spice-text) !important;
|
||||
}
|
||||
|
||||
/** Artist page */
|
||||
.artist-artistOverview-heading {
|
||||
color: var(--spice-text) !important;
|
||||
}
|
||||
.artist-artistAbout-content .artist-artistAbout-cityBlock div,
|
||||
.artist-artistAbout-content .artist-artistAbout-stats div {
|
||||
color: var(--spice-text) !important;
|
||||
}
|
||||
.artist-artistAbout-content div {
|
||||
color: var(--spice-text) !important;
|
||||
}
|
||||
|
||||
/** Cards */
|
||||
.main-cardImage-imageWrapper {
|
||||
background-color: transparent;
|
||||
box-shadow: unset;
|
||||
-webkit-box-shadow: unset;
|
||||
}
|
||||
|
||||
.main-cardImage-imagePlaceholder, .main-cardImage-image {
|
||||
border-radius: var(--cover-border-radius);
|
||||
}
|
||||
|
||||
.main-rootlist-rootlistDivider {
|
||||
background-color: unset;
|
||||
}
|
||||
|
||||
.main-nowPlayingBar-nowPlayingBar {
|
||||
height: var(--bar-height);
|
||||
}
|
||||
|
||||
.Root__top-bar {
|
||||
border-radius: var(--main-corner-radius) var(--main-corner-radius) 0 0;
|
||||
}
|
||||
|
||||
.main-topBar-background {
|
||||
border-radius: var(--main-corner-radius) var(--main-corner-radius) 0 0;
|
||||
}
|
||||
|
||||
.Root__main-view {
|
||||
background-color: var(--spice-main);
|
||||
border-radius: var(--main-corner-radius) var(--main-corner-radius) 0 0;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.main-buddyFeed-buddyFeed {
|
||||
box-shadow: unset;
|
||||
-webkit-box-shadow: unset;
|
||||
z-index: 0;
|
||||
}
|
||||
|
||||
.main-buddyFeed-headerTitle,
|
||||
.main-buddyFeed-activityMetadata .main-buddyFeed-username a {
|
||||
color: var(--spice-sidebar-text);
|
||||
}
|
||||
|
||||
.main-buddyFeed-activityMetadata .main-buddyFeed-artistAndTrackName a,
|
||||
.main-buddyFeed-activityMetadata .main-buddyFeed-playbackContextLink,
|
||||
.main-buddyFeed-activityMetadata .main-buddyFeed-timestamp {
|
||||
color: rgba(var(--spice-rgb-sidebar-text), 0.8);
|
||||
}
|
||||
|
||||
.main-avatar-avatar,
|
||||
.main-buddyFeed-overlay {
|
||||
width: 32px !important;
|
||||
height: 32px !important;
|
||||
}
|
||||
|
||||
.main-buddyFeed-avatarContainer {
|
||||
padding-left: 4px;
|
||||
}
|
||||
|
||||
.main-avatar-avatar.main-avatar-withBadge:after {
|
||||
box-shadow: 0 0 0 2px var(--spice-sidebar);
|
||||
background-color: var(--spice-notification);
|
||||
right: 0;
|
||||
}
|
||||
|
||||
.Root__now-playing-bar {
|
||||
border-radius: 0 0 var(--main-corner-radius) var(--main-corner-radius);
|
||||
background-color: unset;
|
||||
}
|
||||
|
||||
.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-button), 0.55), var(--spice-main) 60%);
|
||||
border-top: 0;
|
||||
min-width: 518px;
|
||||
}
|
||||
|
||||
.main-connectBar-connectBar {
|
||||
border-radius: 0 0 var(--main-corner-radius) var(--main-corner-radius);
|
||||
border: 2px solid var(--spice-main);
|
||||
border-top: 0;
|
||||
}
|
||||
|
||||
@media(max-width:768px){
|
||||
/* .control-button{
|
||||
display: none;
|
||||
} */
|
||||
.volume-bar {
|
||||
flex: 0 1 40px;
|
||||
}
|
||||
.volume-bar .progress-bar-wrapper {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.Root__nav-bar {
|
||||
height: 100%;
|
||||
z-index: 1;
|
||||
width: var(--sidebar-width) !important;
|
||||
}
|
||||
|
||||
.main-buddyFeed-buddyFeedRoot {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.main-buddyFeed-buddyFeedRoot .os-content {
|
||||
padding-top: 0 !important;
|
||||
}
|
||||
|
||||
html,
|
||||
.Root__nav-bar,
|
||||
.main-buddyFeed-buddyFeed {
|
||||
background-color: var(--spice-sidebar) !important;
|
||||
}
|
||||
|
||||
.Root__nav-bar .link-subtle,
|
||||
.main-rootlist-rootlistItemLink:link,
|
||||
.main-rootlist-rootlistItemLink:visited,
|
||||
.main-rootlist-rootlistContent span,
|
||||
.main-navBar-entryPoints span {
|
||||
color: var(--spice-sidebar-text)
|
||||
}
|
||||
|
||||
.main-navBar-navBarItem svg {
|
||||
width: 24px !important;
|
||||
height: 24px !important;
|
||||
}
|
||||
|
||||
.main-navBar-navBarItem {
|
||||
padding: 0 8px;
|
||||
}
|
||||
|
||||
.main-rootlist-statusIcons {
|
||||
color: var(--spice-sidebar-text);
|
||||
padding-right: 16px;
|
||||
}
|
||||
|
||||
.main-rootlist-statusIcons .main-playButton-button {
|
||||
color: var(--spice-sidebar-text);
|
||||
}
|
||||
|
||||
.main-rootlist-expandArrow {
|
||||
position: absolute;
|
||||
top: 20px;
|
||||
right: 4px;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
color: var(--spice-sidebar-text) !important;
|
||||
background-color: var(--spice-button);
|
||||
border-radius: 50%;
|
||||
box-shadow: 0 0 0 2px var(--spice-sidebar);
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
li.GlueDropTarget:hover .main-rootlist-expandArrow {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
html:not(.sidebar-hide-text) .main-rootlist-expandArrow {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.main-rootlist-expandArrow::before {
|
||||
font-size: 10px;
|
||||
padding-bottom: 3px;
|
||||
}
|
||||
|
||||
html.sidebar-hide-text .main-navBar-navBarItem span,
|
||||
html.sidebar-hide-text .main-rootlist-rootlistContent span,
|
||||
html.sidebar-hide-text .main-rootlist-rootlistItem span,
|
||||
html.sidebar-hide-text .main-rootlist-statusIcons,
|
||||
html.sidebar-hide-text .GlueDropTarget span {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.main-rootlist-rootlist {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.Root__nav-bar .os-scrollbar-vertical,
|
||||
.main-buddyFeed-buddyFeedRoot .os-scrollbar-vertical {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/** */
|
||||
.main-topBar-historyButtons .main-topBar-button {
|
||||
background-color: unset;
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
}
|
||||
|
||||
.main-topBar-historyButtons svg {
|
||||
color: var(--spice-button);
|
||||
fill: var(--spice-button);
|
||||
}
|
||||
|
||||
.playback-bar__progress-time,
|
||||
.main-playbackBarRemainingTime-container {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.playback-bar {
|
||||
position: absolute;
|
||||
width: var(--main-view-width);
|
||||
left: var(--sidebar-width);
|
||||
bottom: calc(var(--main-gap) + var(--bar-height) - 12px / 2);
|
||||
}
|
||||
|
||||
.Root.is-connectBarVisible .playback-bar {
|
||||
bottom: calc(var(--main-gap) + var(--bar-height) + 24px - 12px / 2);
|
||||
}
|
||||
|
||||
.main-nowPlayingWidget-coverArt .cover-art {
|
||||
width: var(--bar-cover-art-size) !important;
|
||||
height: var(--bar-cover-art-size) !important;
|
||||
}
|
||||
|
||||
.player-controls__buttons {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.progress-bar {
|
||||
--progress-bar-height: 2px;
|
||||
--fg-color: var(--spice-button);
|
||||
--bg-color: rgba(var(--spice-rgb-text), .2);
|
||||
}
|
||||
|
||||
.minimal-player .player-controls__buttons {
|
||||
width: 120px;
|
||||
}
|
||||
.minimal-player .volume-bar {
|
||||
flex: 0 1 70px;
|
||||
}
|
||||
.extra-minimal-player .main-shuffleButton-button,
|
||||
.extra-minimal-player .main-repeatButton-button,
|
||||
.extra-minimal-player .ExtraControls__connect-device-picker,
|
||||
.extra-minimal-player .volume-bar .progress-bar-wrapper {
|
||||
display: none;
|
||||
}
|
||||
.extra-minimal-player .volume-bar {
|
||||
flex: 0 0 32px;
|
||||
}
|
||||
|
||||
.main-trackInfo-name {
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.main-topBar-topbarContent .main-playButton-PlayButton {
|
||||
--size: 35px !important;
|
||||
}
|
||||
|
||||
.main-entityHeader-image {
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.main-entityHeader-metaDataText,
|
||||
.main-duration-container {
|
||||
color: var(--spice-subtext);
|
||||
}
|
||||
|
||||
/** Sidebar */
|
||||
.main-rootlist-rootlist .os-content {
|
||||
padding: 0 0 8px 0 !important;
|
||||
}
|
||||
|
||||
.main-rootlist-rootlistDividerContainer {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.main-rootlist-rootlistItem a {
|
||||
align-items: center;
|
||||
border-radius: 4px;
|
||||
display: flex;
|
||||
height: 56px;
|
||||
padding: 0 12px;
|
||||
}
|
||||
|
||||
img.playlist-picture {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
flex: 0 0 32px;
|
||||
background-size: cover;
|
||||
background-position: center;
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
.main-rootlist-rootlistItem a span {
|
||||
margin-left: 24px;
|
||||
}
|
||||
|
||||
.main-rootlist-rootlistItem {
|
||||
padding-left: calc(var(--indentation)*var(--left-sidebar-item-indentation-width));
|
||||
padding-right: 0;
|
||||
}
|
||||
|
||||
html.sidebar-hide-text .main-rootlist-rootlistItem {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.main-rootlist-dropIndicator {
|
||||
background: var(--spice-selected-row);
|
||||
height: 2px;
|
||||
}
|
||||
|
||||
.main-navBar-navBarLink {
|
||||
height: 56px;
|
||||
}
|
||||
|
||||
.main-navBar-navBarLink .icon,
|
||||
.main-collectionLinkButton-icon,
|
||||
.main-createPlaylistButton-icon,
|
||||
.main-collectionLinkButton-icon {
|
||||
margin-right: 24px;
|
||||
}
|
||||
|
||||
li.GlueDropTarget {
|
||||
padding: 0 8px;
|
||||
}
|
||||
|
||||
/** OS-specific window controls dodge */
|
||||
.spotify__os--is-windows .main-navBar-navBar {
|
||||
padding-top: calc(var(--os-windows-icon-dodge) * 24px);
|
||||
}
|
||||
|
||||
.spotify__container--is-desktop:not(.fullscreen).spotify__os--is-windows .main-navBar-entryPoints {
|
||||
padding-top: calc(var(--os-windows-icon-dodge) * 12px + 12px);
|
||||
}
|
||||
|
||||
.spotify__os--is-windows .main-buddyFeed-header {
|
||||
padding-top: calc(var(--os-windows-icon-dodge) * 32px);
|
||||
}
|
||||
|
||||
.spotify__container--is-desktop.spotify__os--is-windows[dir=ltr] .main-topBar-container {
|
||||
padding-right: calc(var(--os-windows-icon-dodge) * 135px + 32px);
|
||||
}
|
||||
|
||||
.main-topBar-container {
|
||||
max-width: unset;
|
||||
}
|
||||
|
||||
/** Custom elements */
|
||||
#dribbblish-sidebar-fade-in {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
height: 20%;
|
||||
background: linear-gradient(to top, var(--spice-sidebar) 10%, transparent);
|
||||
z-index: 3;
|
||||
pointer-events: none;
|
||||
}
|
||||
#dribs-playlist-list {
|
||||
padding-bottom: 56px;
|
||||
}
|
||||
#dribbblish-back-shadow {
|
||||
position: fixed;
|
||||
width: var(--main-view-width);
|
||||
height: calc(var(--main-view-height) + var(--bar-height));
|
||||
box-shadow: 0 0 10px 3px #0000003b;
|
||||
border-radius: var(--main-corner-radius);
|
||||
z-index: 2;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.playback-bar .prog-tooltip {
|
||||
position: absolute;
|
||||
min-width: 100px;
|
||||
width: unset;
|
||||
height: 25px;
|
||||
top: -35px;
|
||||
padding: 0 5px;
|
||||
border-radius: 4px;
|
||||
text-align: center;
|
||||
color: var(--spice-text);
|
||||
background-color: var(--spice-button);
|
||||
opacity: 0;
|
||||
transition: opacity,left 0.2s ease;
|
||||
}
|
||||
|
||||
.playback-bar:hover .prog-tooltip {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
/** Rearrange player bar */
|
||||
.main-shuffleButton-button {
|
||||
order: 1;
|
||||
}
|
||||
|
||||
.main-nowPlayingBar-left {
|
||||
order: 1;
|
||||
flex: 1;
|
||||
width: auto;
|
||||
min-width: unset !important;
|
||||
}
|
||||
|
||||
.main-nowPlayingBar-center {
|
||||
order: 0;
|
||||
flex: 1;
|
||||
width: auto;
|
||||
min-width: unset !important;
|
||||
}
|
||||
|
||||
.main-nowPlayingBar-right {
|
||||
order: 2;
|
||||
flex: 1;
|
||||
width: auto;
|
||||
min-width: unset !important;
|
||||
}
|
||||
|
||||
.main-nowPlayingWidget-nowPlaying {
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.player-controls {
|
||||
justify-content: flex-start;
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.main-playPauseButton-button {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
.main-playPauseButton-button svg {
|
||||
width: 32px !important;
|
||||
height: 32px !important;
|
||||
color: var(--spice-button);
|
||||
}
|
||||
|
||||
/** Main container */
|
||||
.contentSpacing {
|
||||
padding-left: 64px;
|
||||
padding-right: 64px;
|
||||
}
|
||||
|
||||
@media (min-width: 1024px) {
|
||||
.contentSpacing {
|
||||
padding-left: 128px;
|
||||
padding-right: 128px;
|
||||
}
|
||||
}
|
||||
|
||||
.main-collectionLinkButton-collectionLinkButton .main-collectionLinkButton-icon,
|
||||
.main-collectionLinkButton-collectionLinkButton .main-collectionLinkButton-collectionLinkText,
|
||||
.main-createPlaylistButton-button {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.main-likedSongsButton-likedSongsIcon,
|
||||
.main-yourEpisodesButton-yourEpisodesIcon,
|
||||
.main-createPlaylistButton-createPlaylistIcon {
|
||||
background: unset !important;
|
||||
}
|
||||
|
||||
.main-createPlaylistButton-icon,
|
||||
.main-collectionLinkButton-icon,
|
||||
.main-createPlaylistButton-icon {
|
||||
height: 40px;
|
||||
}
|
||||
|
||||
.main-likedSongsButton-likedSongsIcon svg,
|
||||
.main-yourEpisodesButton-yourEpisodesIcon svg,
|
||||
.main-createPlaylistButton-createPlaylistIcon svg {
|
||||
fill: var(--spice-sidebar-text);
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
}
|
||||
.main-yourEpisodesButton-yourEpisodesIcon svg path {
|
||||
fill: var(--spice-sidebar-text);
|
||||
}
|
||||
|
||||
/** Grid */
|
||||
.Root__top-container {
|
||||
grid-template-areas:
|
||||
"nav-bar main-view buddy-feed"
|
||||
"nav-bar now-playing-bar buddy-feed";
|
||||
padding: var(--main-gap) 0;
|
||||
}
|
||||
|
||||
html:not(.buddyfeed-visible) .Root__top-container {
|
||||
padding-right: var(--main-gap);
|
||||
}
|
||||
|
||||
/** Minimal profile button */
|
||||
span.main-userWidget-displayName,
|
||||
.main-userWidget-box svg {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/** Sidebar config */
|
||||
#dribs-hidden-list {
|
||||
background-color: rgba(var(--spice-rgb-main), .3);
|
||||
}
|
||||
|
||||
#dribs-sidebar-config {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
height: 0;
|
||||
display: flex;
|
||||
justify-content: space-evenly;
|
||||
align-items: center;
|
||||
top: -30px;
|
||||
left: 0;
|
||||
}
|
||||
|
||||
#dribs-sidebar-config button {
|
||||
min-width: 60px;
|
||||
border-radius: 3px;
|
||||
background-color: var(--spice-main);
|
||||
color: var(--spice-text);
|
||||
border: 1px solid var(--spice-text);
|
||||
}
|
||||
#dribs-sidebar-config button:disabled {
|
||||
color: var(--spice-button-disabled);
|
||||
}
|
||||
|
||||
.main-navBar-entryPoints {
|
||||
--left-sidebar-padding-left: 24px;
|
||||
--left-sidebar-padding-right: 24px;
|
||||
}
|
||||
|
||||
div.GlueDropTarget.personal-library {
|
||||
padding: 0 8px;
|
||||
}
|
||||
div.GlueDropTarget.personal-library >* {
|
||||
padding: 0 16px;
|
||||
height: 56px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
div.GlueDropTarget.personal-library >*.active {
|
||||
background: var(--spice-button);
|
||||
}
|
||||
|
||||
/** Big cover, small cover */
|
||||
.main-coverSlotExpanded-container {
|
||||
position: fixed;
|
||||
z-index: 2;
|
||||
width: 250px;
|
||||
height: 250px;
|
||||
bottom: calc(var(--main-gap) + var(--bar-height) + 10px);
|
||||
left: calc(var(--sidebar-width) + 10px);
|
||||
}
|
||||
|
||||
.Root.is-connectBarVisible .main-coverSlotExpanded-container {
|
||||
bottom: calc(var(--main-gap) + var(--bar-height) + 24px + 10px);
|
||||
}
|
||||
|
||||
html.right-expanded-cover .main-coverSlotExpanded-container {
|
||||
right: calc(var(--main-gap) + 10px);
|
||||
left: unset;
|
||||
}
|
||||
|
||||
html.right-expanded-cover.buddyfeed-visible .main-coverSlotExpanded-container {
|
||||
right: calc(var(--main-gap) + var(--buddy-feed-width) + 10px);
|
||||
left: unset;
|
||||
}
|
||||
|
||||
.main-coverSlotExpanded-container img {
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.cover-art {
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.main-nowPlayingWidget-coverExpanded .main-coverSlotCollapsed-container {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.main-nowPlayingWidget-coverExpanded {
|
||||
transform: translateX(-27px);
|
||||
}
|
BIN
Dribbblish/white.png
Normal file
After Width: | Height: | Size: 136 KiB |