Files
yellowjacket/frontend/index.css
T
yonlu 65a6a73d17 fix: pill toggle layout — icons absolutely positioned, thumb slides over
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.
2026-03-30 15:55:25 -04:00

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;
}