feat: replace showcase tag overlays with ghost count badge, refine nav hint

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-20 08:35:42 -04:00
parent 8ebba0ec55
commit d4258d2ff1
2 changed files with 42 additions and 8 deletions
+6 -7
View File
@@ -156,14 +156,13 @@
}
item.appendChild(imgEl);
// Filter out archive tags from display (they're still visible in modal)
const visibleTags = (img.tags || []).filter(t => t.kind !== 'archive');
// Filter out archive and source tags from display (they're still visible in modal)
const visibleTags = (img.tags || []).filter(t => t.kind !== 'archive' && t.kind !== 'source');
if (visibleTags.length > 0) {
const overlay = document.createElement('div');
overlay.className = 'tag-overlay';
// Use shared utility to create tag chips
overlay.innerHTML = visibleTags.map(t => createTagChipHtml(t)).join('');
item.appendChild(overlay);
const badge = document.createElement('span');
badge.className = 'tag-count-badge';
badge.textContent = `#${visibleTags.length}`;
item.appendChild(badge);
}
if (img.is_video) {
+36 -1
View File
@@ -1291,12 +1291,18 @@ header {
}
.showcase-nav .nav-hint {
color: rgba(255,255,255,0.4);
opacity: 0;
transition: opacity 0.2s ease;
font-size: 0.8rem;
color: var(--text-muted);
margin-top: 0.25rem;
pointer-events: none;
}
.showcase-nav:hover .nav-hint {
opacity: 1;
}
/* Masonry container - JS-managed columns */
.masonry-container {
display: flex;
@@ -1349,6 +1355,35 @@ header {
z-index: 2;
}
/* Ghost tag count badge on showcase items */
.tag-count-badge {
position: absolute;
bottom: 8px;
right: 8px;
padding: 2px 7px;
border-radius: 999px;
background: rgba(0, 0, 0, 0.45);
border: 1px solid rgba(255, 255, 255, 0.15);
color: rgba(255, 255, 255, 0.55);
font-size: 0.7rem;
font-weight: 500;
z-index: 2;
pointer-events: none;
opacity: 0;
transition: opacity 0.2s ease;
}
.masonry-item:hover .tag-count-badge {
opacity: 1;
}
/* Touch devices: always show badge */
@media (hover: none) {
.tag-count-badge {
opacity: 1;
}
}
/* Loading state for shuffle */
.masonry-container.loading {
opacity: 0.5;