The track list shared out its whole clientWidth across the resizable columns while every row spends 24px on the favourite column and 2x8px on its own padding before the first one starts, so the grid was always exactly 40px wider than the box holding it and the last column was clipped at every size (scrollWidth 1280 vs clientWidth 1240, measured). Both numbers now live in one place and are read by the two call sites that had written them out separately, which is how they came to disagree. The enforced minimum was 512x384, which the layout had never supported: at 700x480 the eleven sidebar items needed 406px of a 352px pane, overflow:hidden cut the last two off with nothing to scroll, and Settings and Jobs could not be reached at all. The pane scrolls now, the sidebar collapses to icons below 900px (its .collapsed mode existed and only a manual drag ever reached it), the subtitle hides at the same breakpoint so the title stops wrapping out of the 4em bar, and the minimum is 800x600 - measured as where the shell still works rather than picked as a round number.
185 lines
3.9 KiB
CSS
185 lines
3.9 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;
|
|
}
|
|
|
|
ul {
|
|
list-style-type: none;
|
|
}
|
|
|
|
.title {
|
|
font-size: 1.5em;
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
.subtitle {
|
|
font-size: 0.8em;
|
|
margin-top: 0;
|
|
}
|
|
|
|
/* The same breakpoint the sidebar collapses at (AUTO_COLLAPSE_VIEWPORT
|
|
in app-sidebar.ts). The subtitle wrapped to two lines below ~780 px,
|
|
which made the title block 98 px tall inside a 4em bar and pushed it
|
|
down into the nav (H-11). */
|
|
@media (max-width: 899px) {
|
|
.subtitle {
|
|
display: none;
|
|
}
|
|
}
|
|
|
|
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, 320px) 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;
|
|
}
|