feat(folder-browser): Miller columns directory navigation

New page /folders with macOS Finder-style column layout:
- getMusicDirectory / getMusicIndexes / getMusicFolders Subsonic API methods
- Root level uses getIndexes.view (music folder IDs are not getMusicDirectory IDs)
- Columns fill available width with flex: 1, min-width: 200px
- Auto-scroll to rightmost column on expand
- Cancelled-flag prevents stale state on fast navigation
- Clicking a track plays it in the context of the current column's tracks
- FolderOpen/Folder/Music icons, accent-colored selection, ellipsis truncation
- Hidden in sidebar by default (user can enable in Settings)
- i18n: EN DE FR NL NB ZH RU

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Psychotoxical
2026-04-08 14:40:29 +02:00
parent 0a0dde057d
commit 5848c621fd
13 changed files with 387 additions and 7 deletions
+108
View File
@@ -6767,3 +6767,111 @@
transform: scale(1.2);
box-shadow: 0 0 0 4px color-mix(in srgb, var(--accent) 20%, transparent);
}
/* ── Folder Browser (Miller Columns) ──────────────────────────────────────── */
.folder-browser {
display: flex;
flex-direction: column;
padding: 0;
height: 100%;
}
.folder-browser-title {
padding: 1.5rem 1.5rem 0.75rem;
flex-shrink: 0;
}
.folder-browser-columns {
flex: 1;
min-height: 0;
display: flex;
flex-direction: row;
overflow-x: auto;
overflow-y: hidden;
/* height fallback for browsers that don't support flex: 1 correctly here */
height: calc(100vh - var(--player-height, 88px) - var(--titlebar-height, 0px) - 70px);
border-top: 1px solid var(--border-subtle);
}
.folder-browser-columns::-webkit-scrollbar {
height: 6px;
}
.folder-col {
flex: 1;
min-width: 200px;
height: 100%;
overflow-y: auto;
overflow-x: hidden;
border-right: 1px solid var(--border-subtle);
}
.folder-col-status {
display: flex;
align-items: center;
justify-content: center;
height: 80px;
color: var(--text-muted);
font-size: 0.8rem;
padding: 1rem;
text-align: center;
}
.folder-col-error {
color: var(--danger, #f38ba8);
}
.folder-col-row {
display: flex;
align-items: center;
gap: 0.5rem;
width: 100%;
padding: 0.38rem 0.6rem 0.38rem 0.75rem;
background: none;
border: none;
border-radius: 0;
cursor: pointer;
color: var(--text-primary);
font-size: 0.8rem;
text-align: left;
transition: background 0.1s;
}
.folder-col-row:hover {
background: var(--bg-hover, color-mix(in srgb, var(--accent) 8%, transparent));
}
.folder-col-row.selected {
background: var(--accent);
color: #fff;
}
.folder-col-row.selected .folder-col-chevron {
color: rgba(255, 255, 255, 0.7);
}
.folder-col-icon {
flex-shrink: 0;
opacity: 0.75;
display: flex;
align-items: center;
}
.folder-col-row.selected .folder-col-icon {
opacity: 1;
}
.folder-col-name {
flex: 1;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.folder-col-chevron {
flex-shrink: 0;
color: var(--text-muted);
margin-left: auto;
}