+ {/* Genres - always full row, can be many */}
+
}
+ value={filters.genres.length > 0 ? `${filters.genres.length} selected` : 'Any'}
+ >
+
+ {genres.map(g => (
+ toggleGenre(g.id)}
+ >
+ {g.label}
+
+ ))}
+
+
+
+ {/* Streaming providers - always full row */}
+
}
+ value={
+ filters.watchProviders.length > 0
+ ? `${filters.watchProviders.length} in ${filters.watchRegion || region}`
+ : 'Any'
+ }
+ >
+
+ {COMMON_PROVIDERS.map(p => (
+ toggleProvider(p.id)}
+ >
+ {p.label}
+
+ ))}
+
+
+
+ {/* Two-column grid for the smaller fields */}
+
+
}
+ value={
+ filters.yearFrom || filters.yearTo
+ ? `${filters.yearFrom ?? '...'} to ${filters.yearTo ?? '...'}`
+ : 'Any year'
+ }
+ >
+
+ set('yearFrom', v)}
+ placeholder="From"
+ />
+ to
+ set('yearTo', v)}
+ placeholder="To"
+ />
+
+
+
+
}
+ value={filters.voteAverageGte != null ? `${filters.voteAverageGte} / 10` : 'Any'}
+ >
+
+ set('voteAverageGte', Number(e.target.value) === 0 ? null : Number(e.target.value))}
+ aria-label="Minimum rating"
+ className="slider flex-1"
+ />
+
+ {filters.voteAverageGte ?? 0}
+
+
+
+
+
}
+ value={
+ filters.voteCountGte != null
+ ? `${filters.voteCountGte.toLocaleString()}+`
+ : 'Any'
+ }
+ >
+
+
+ )
+}
+
+function Field({
+ label,
+ icon,
+ value,
+ children,
+}: {
+ label: string
+ icon?: React.ReactNode
+ value?: string
+ children: React.ReactNode
+}) {
+ return (
+