Improve track dialog layout with responsive grid and cleaner status alignment
This commit is contained in:
parent
b021df31b4
commit
7815051e5d
2 changed files with 97 additions and 14 deletions
|
|
@ -198,10 +198,12 @@ async function openAlbumDialog(albumId, preselectedTrackNames = [], context = nu
|
||||||
row.className = 'track-row';
|
row.className = 'track-row';
|
||||||
const isChecked = preselected.size > 0 ? preselected.has(track.name) : true;
|
const isChecked = preselected.size > 0 ? preselected.has(track.name) : true;
|
||||||
row.innerHTML = `
|
row.innerHTML = `
|
||||||
<input type="checkbox" ${isChecked ? 'checked' : ''} data-track-name="${track.name.replace(/"/g, '"')}" data-exists="${Boolean(track.exists)}" />
|
<input class="track-check" type="checkbox" ${isChecked ? 'checked' : ''} data-track-name="${track.name.replace(/"/g, '"')}" data-exists="${Boolean(track.exists)}" />
|
||||||
<span>${track.trackNumber}. ${track.name}</span>
|
<span class="track-main">
|
||||||
<small>(${formatDuration(track.durationMs)})</small>
|
<span class="track-title">${track.trackNumber}. ${track.name}</span>
|
||||||
${pill(Boolean(track.exists))}
|
<span class="track-meta">${formatDuration(track.durationMs)}</span>
|
||||||
|
</span>
|
||||||
|
<span class="track-status">${pill(Boolean(track.exists))}</span>
|
||||||
`;
|
`;
|
||||||
const input = row.querySelector('input');
|
const input = row.querySelector('input');
|
||||||
input.addEventListener('change', updateDialogActionButton);
|
input.addEventListener('change', updateDialogActionButton);
|
||||||
|
|
|
||||||
|
|
@ -167,42 +167,123 @@ button:hover {
|
||||||
|
|
||||||
dialog {
|
dialog {
|
||||||
border: 1px solid var(--border);
|
border: 1px solid var(--border);
|
||||||
border-radius: 12px;
|
border-radius: 16px;
|
||||||
background: #0b1220;
|
background: #0b1220;
|
||||||
color: var(--text);
|
color: var(--text);
|
||||||
width: min(620px, 95vw);
|
width: min(760px, 96vw);
|
||||||
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dialog-content {
|
.dialog-content {
|
||||||
display: grid;
|
display: grid;
|
||||||
gap: 0.6rem;
|
gap: 0.8rem;
|
||||||
|
padding: 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.track-list {
|
.track-list {
|
||||||
max-height: 45vh;
|
max-height: min(58vh, 640px);
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
border: 1px solid var(--border);
|
border: 1px solid var(--border);
|
||||||
border-radius: 8px;
|
border-radius: 12px;
|
||||||
padding: 0.5rem;
|
padding: 0.6rem;
|
||||||
display: grid;
|
display: grid;
|
||||||
gap: 0.3rem;
|
gap: 0.45rem;
|
||||||
|
background: #0a1323;
|
||||||
}
|
}
|
||||||
|
|
||||||
.track-row {
|
.track-row {
|
||||||
display: flex;
|
display: grid;
|
||||||
|
grid-template-columns: 32px minmax(0, 1fr) auto;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 0.5rem;
|
gap: 0.65rem;
|
||||||
|
border: 1px solid #1f2f49;
|
||||||
|
border-radius: 10px;
|
||||||
|
padding: 0.5rem 0.6rem;
|
||||||
|
background: #0d1a2e;
|
||||||
|
}
|
||||||
|
|
||||||
|
.track-row:hover {
|
||||||
|
border-color: #34517a;
|
||||||
|
background: #10203a;
|
||||||
|
}
|
||||||
|
|
||||||
|
.track-check {
|
||||||
|
width: 22px;
|
||||||
|
height: 22px;
|
||||||
|
margin: 0;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.track-main {
|
||||||
|
min-width: 0;
|
||||||
|
display: grid;
|
||||||
|
gap: 0.1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.track-title {
|
||||||
|
font-size: 1.02rem;
|
||||||
|
font-weight: 600;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
|
.track-meta {
|
||||||
|
color: var(--muted);
|
||||||
|
font-size: 0.85rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.track-status {
|
||||||
|
justify-self: end;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dialog-actions {
|
.dialog-actions {
|
||||||
margin-top: 0.7rem;
|
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: flex-end;
|
justify-content: flex-end;
|
||||||
gap: 0.5rem;
|
gap: 0.5rem;
|
||||||
|
position: sticky;
|
||||||
|
bottom: 0;
|
||||||
|
background: linear-gradient(180deg, rgba(11, 18, 32, 0.7), rgba(11, 18, 32, 1));
|
||||||
|
padding-top: 0.6rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: 680px) {
|
@media (max-width: 680px) {
|
||||||
.search-row {
|
.search-row {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dialog {
|
||||||
|
width: 98vw;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dialog-content {
|
||||||
|
padding: 0.8rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.track-row {
|
||||||
|
grid-template-columns: 28px minmax(0, 1fr);
|
||||||
|
grid-template-areas:
|
||||||
|
"check title"
|
||||||
|
"check status";
|
||||||
|
align-items: start;
|
||||||
|
}
|
||||||
|
|
||||||
|
.track-check {
|
||||||
|
grid-area: check;
|
||||||
|
margin-top: 0.15rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.track-main {
|
||||||
|
grid-area: title;
|
||||||
|
}
|
||||||
|
|
||||||
|
.track-title {
|
||||||
|
white-space: normal;
|
||||||
|
line-height: 1.25;
|
||||||
|
}
|
||||||
|
|
||||||
|
.track-status {
|
||||||
|
grid-area: status;
|
||||||
|
justify-self: start;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue