Tag-maintenance sweep + bug-fix batch: #699 #700 #701 #709 #711 #712 #713 #714 #73

Merged
bvandeusen merged 11 commits from dev into main 2026-06-06 16:49:01 -04:00
3 changed files with 18 additions and 7 deletions
Showing only changes of commit 911d535f56 - Show all commits
@@ -49,9 +49,11 @@ function onCardClick() {
position: relative; position: relative;
display: grid; grid-template-columns: repeat(3, 1fr); display: grid; grid-template-columns: repeat(3, 1fr);
gap: 2px; aspect-ratio: 3 / 1; gap: 2px; aspect-ratio: 3 / 1;
/* Explicit floor + ceiling so tall source images can't escape the /* Floor so tall source images can't escape the slot. NO max-height: an
preview slot even on browsers where aspect-ratio doesn't compute. */ aspect-ratio box capped by max-height shrinks its own WIDTH to keep the
min-height: 150px; max-height: 220px; ratio, leaving dead space beside the previews on a wide (single-column)
card. The grid below keeps columns ≲400px so the strip stays a sane height. */
min-height: 120px;
overflow: hidden; overflow: hidden;
background: rgb(var(--v-theme-surface-light)); background: rgb(var(--v-theme-surface-light));
} }
+8 -1
View File
@@ -14,6 +14,10 @@ export const useArtistDirectoryStore = defineStore('artistDirectory', () => {
const q = ref('') const q = ref('')
const platform = ref(null) const platform = ref(null)
let started = false let started = false
// Has a load ATTEMPT completed yet? Gates the "No artists match" empty state
// so it can't flash on the very first render (loading is still false before
// onMounted fires the first loadMore) or between a query change and its fetch.
const loaded = ref(false)
// Typed "alice" then "alice bob" used to drop the second fetch // Typed "alice" then "alice bob" used to drop the second fetch
// entirely (loading flag still true from the first), so the UI // entirely (loading flag still true from the first), so the UI
// showed alice results while the input said "alice bob". Inflight // showed alice results while the input said "alice bob". Inflight
@@ -35,6 +39,7 @@ export const useArtistDirectoryStore = defineStore('artistDirectory', () => {
nextCursor.value = body.next_cursor nextCursor.value = body.next_cursor
started = true started = true
}) })
if (t.isCurrent()) loaded.value = true
} }
async function reset() { async function reset() {
@@ -42,6 +47,7 @@ export const useArtistDirectoryStore = defineStore('artistDirectory', () => {
cards.value = [] cards.value = []
nextCursor.value = null nextCursor.value = null
started = false started = false
loaded.value = false
await loadMore() await loadMore()
} }
@@ -50,7 +56,8 @@ export const useArtistDirectoryStore = defineStore('artistDirectory', () => {
const hasMore = computed(() => !started || nextCursor.value !== null) const hasMore = computed(() => !started || nextCursor.value !== null)
const isEmpty = computed( const isEmpty = computed(
() => !loading.value && cards.value.length === 0 && error.value === null () => loaded.value && !loading.value
&& cards.value.length === 0 && error.value === null
) )
return { return {
+5 -3
View File
@@ -76,9 +76,11 @@ onMounted(async () => {
} }
.fc-artists__grid { .fc-artists__grid {
display: grid; display: grid;
/* min(440px, 100%) so a card never exceeds the viewport — on phones the /* min(360px, 100%) so a card never exceeds the viewport (phones collapse to
min-track collapses to 100% (single column) instead of overflowing. */ one column). 360 keeps a LONE column under ~732px wide, so the 3/1 preview
grid-template-columns: repeat(auto-fill, minmax(min(440px, 100%), 1fr)); strip stays ≲244px tall and always fills the card width (no dead space),
while giving 2+ columns on a normal desktop. */
grid-template-columns: repeat(auto-fill, minmax(min(360px, 100%), 1fr));
gap: 12px; gap: 12px;
} }
.fc-artists__sentinel { .fc-artists__sentinel {