Icons are now at fixed positions inside the pill (globe left, hard-drive right) with absolute positioning. The thumb slides between them. The active icon is the one NOT covered by the thumb: - Off: thumb left (covers globe), hard-drive visible - On: thumb right (covers hard-drive), globe visible Icons fade with opacity transitions. Thumb changes from white (off) to black (on) to contrast with the yellow active background.
243 lines
4.7 KiB
CSS
243 lines
4.7 KiB
CSS
*,
|
|
*::before,
|
|
*::after {
|
|
-webkit-user-select: none;
|
|
user-select: none;
|
|
}
|
|
|
|
html {
|
|
height: 100%;
|
|
}
|
|
|
|
body {
|
|
background-color: var(--yj-bg-base, black);
|
|
color: var(--yj-text-primary, white);
|
|
margin: 0;
|
|
height: 100vh;
|
|
display: grid;
|
|
grid-template: "top-bar top-bar" 4em "sidebar main-panel" 1fr "bottom-bar bottom-bar" 4em / auto 1fr;
|
|
overflow: hidden;
|
|
}
|
|
|
|
p {
|
|
margin: 0;
|
|
/* I want to set paragraph margins myself */
|
|
}
|
|
|
|
.top-bar {
|
|
grid-area: top-bar;
|
|
height: 100%;
|
|
padding-left: 2em;
|
|
padding-right: 2em;
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
background-color: var(--yj-bg-elevated, #343a40);
|
|
gap: 1em;
|
|
}
|
|
|
|
.top-bar search-bar {
|
|
flex: 0 1 320px;
|
|
}
|
|
|
|
.mode-toggle {
|
|
position: relative;
|
|
display: flex;
|
|
align-items: center;
|
|
width: 52px;
|
|
height: 26px;
|
|
border-radius: 13px;
|
|
background: var(--yj-bg-overlay, rgba(255, 255, 255, 0.1));
|
|
cursor: pointer;
|
|
flex-shrink: 0;
|
|
transition: background 0.2s ease;
|
|
}
|
|
|
|
.mode-toggle:hover {
|
|
background: rgba(255, 255, 255, 0.15);
|
|
}
|
|
|
|
.mode-toggle-thumb {
|
|
position: absolute;
|
|
top: 2px;
|
|
left: 2px;
|
|
width: 22px;
|
|
height: 22px;
|
|
border-radius: 50%;
|
|
background: var(--yj-text-primary, #fff);
|
|
transition: left 0.2s ease, background 0.2s ease;
|
|
z-index: 1;
|
|
}
|
|
|
|
.mode-toggle.active .mode-toggle-thumb {
|
|
left: 28px;
|
|
background: #000;
|
|
}
|
|
|
|
.mode-toggle.active {
|
|
background: var(--yj-accent, #ffd43b);
|
|
}
|
|
|
|
.mode-icon {
|
|
position: absolute;
|
|
top: 50%;
|
|
transform: translateY(-50%);
|
|
font-size: 12px;
|
|
z-index: 2;
|
|
transition: opacity 0.2s ease;
|
|
pointer-events: none;
|
|
}
|
|
|
|
.mode-icon-globe {
|
|
left: 7px;
|
|
color: #000;
|
|
opacity: 0;
|
|
}
|
|
|
|
.mode-icon-local {
|
|
right: 7px;
|
|
color: var(--yj-text-secondary, #b3b3b3);
|
|
opacity: 1;
|
|
}
|
|
|
|
.mode-toggle.active .mode-icon-globe {
|
|
opacity: 1;
|
|
}
|
|
|
|
.mode-toggle.active .mode-icon-local {
|
|
opacity: 0;
|
|
}
|
|
|
|
ul {
|
|
list-style-type: none;
|
|
}
|
|
|
|
.title {
|
|
font-size: 1.5em;
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
.subtitle {
|
|
font-size: 0.8em;
|
|
margin-top: 0;
|
|
}
|
|
|
|
body div.sidebar {
|
|
grid-area: sidebar;
|
|
background-color: var(--yj-bg-surface, #212529);
|
|
overflow: hidden;
|
|
contain: layout style paint;
|
|
}
|
|
|
|
.bottom-bar {
|
|
grid-area: bottom-bar;
|
|
padding: 0.25em;
|
|
background-color: var(--yj-bg-elevated, #343a40);
|
|
display: grid;
|
|
grid-template-columns: var(--now-playing-width, 200px) 1fr auto;
|
|
align-items: center;
|
|
contain: layout style;
|
|
|
|
#now-playing-info {
|
|
justify-self: start;
|
|
display: flex;
|
|
min-width: 0;
|
|
overflow: hidden;
|
|
|
|
#album-art {
|
|
width: 3.5em;
|
|
min-width: 3.5em;
|
|
height: 3.5em;
|
|
min-height: 3.5em;
|
|
border-radius: 0.25em;
|
|
background-color: var(--yj-accent, #ffd43b);
|
|
}
|
|
|
|
#track-info {
|
|
display: flex;
|
|
margin-left: 1em;
|
|
flex-direction: column;
|
|
font-size: 0.75em;
|
|
justify-content: center;
|
|
text-wrap-mode: nowrap;
|
|
overflow: hidden;
|
|
|
|
p {
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
}
|
|
}
|
|
}
|
|
|
|
now-playing {
|
|
overflow: hidden;
|
|
}
|
|
|
|
audio-player {
|
|
margin: 0.5em 1em;
|
|
}
|
|
|
|
#queue-button {
|
|
justify-self: end;
|
|
background: none;
|
|
border: none;
|
|
color: inherit;
|
|
cursor: pointer;
|
|
padding: 8px;
|
|
display: flex;
|
|
align-items: center;
|
|
}
|
|
|
|
#queue-button:hover {
|
|
color: var(--yj-accent, #ffd43b);
|
|
}
|
|
|
|
#queue-button.drag-over {
|
|
color: var(--yj-accent, #ffd43b);
|
|
outline: 2px dashed var(--yj-accent, #ffd43b);
|
|
outline-offset: -2px;
|
|
border-radius: 4px;
|
|
}
|
|
}
|
|
|
|
.content-area {
|
|
grid-area: main-panel;
|
|
display: flex;
|
|
overflow: hidden;
|
|
contain: layout style;
|
|
}
|
|
|
|
.main-panel {
|
|
flex: 1;
|
|
min-width: 0;
|
|
display: flex;
|
|
flex-direction: column;
|
|
background-color: var(--yj-bg-surface, #212529);
|
|
overflow: hidden;
|
|
contain: layout style paint;
|
|
}
|
|
|
|
.main-panel > * {
|
|
flex: 1;
|
|
min-height: 0;
|
|
box-sizing: border-box;
|
|
contain: layout style paint;
|
|
}
|
|
|
|
/* Hidden cached views: use visibility+size collapse instead of
|
|
display:none so scroll containers preserve their scrollTop.
|
|
display:none discards scroll state in WebKitGTK. */
|
|
.main-panel > .view-hidden {
|
|
visibility: hidden !important;
|
|
flex: 0 0 0px !important;
|
|
min-height: 0 !important;
|
|
max-height: 0 !important;
|
|
height: 0 !important;
|
|
padding: 0 !important;
|
|
margin: 0 !important;
|
|
border: none !important;
|
|
overflow: hidden !important;
|
|
pointer-events: none !important;
|
|
contain: strict !important;
|
|
}
|