diff --git a/src/client/components/CatalogSearchOverlay.tsx b/src/client/components/CatalogSearchOverlay.tsx index 74e9bcd..e6640ac 100644 --- a/src/client/components/CatalogSearchOverlay.tsx +++ b/src/client/components/CatalogSearchOverlay.tsx @@ -23,6 +23,7 @@ export function CatalogSearchOverlay() { const [debouncedQuery, setDebouncedQuery] = useState(""); const [selectedTags, setSelectedTags] = useState([]); const [filterOpen, setFilterOpen] = useState(false); + const [tagSearch, setTagSearch] = useState(""); const [viewMode, setViewMode] = useState("grid"); const [manualEntryMode, setManualEntryMode] = useState(false); const [savedItemName, setSavedItemName] = useState(null); @@ -87,6 +88,7 @@ export function CatalogSearchOverlay() { setDebouncedQuery(""); setSelectedTags([]); setFilterOpen(false); + setTagSearch(""); setWeightMin(0); setWeightMax(5000); setPriceMin(0); @@ -334,24 +336,48 @@ export function CatalogSearchOverlay() {

Tags

+ {tags.length > 8 && ( + setTagSearch(e.target.value)} + placeholder="Filter tags..." + className="w-full px-2 py-1 mb-2 border border-gray-200 rounded-md text-xs text-gray-900 placeholder-gray-400 focus:outline-none focus:ring-1 focus:ring-gray-300 focus:border-transparent transition-colors" + /> + )}
- {tags.map((tag) => { - const isActive = selectedTags.includes(tag.name); - return ( - - ); - })} + {(() => { + const q = tagSearch.trim().toLowerCase(); + const filteredTags = q + ? tags.filter((t) => + t.name.toLowerCase().includes(q), + ) + : tags; + if (filteredTags.length === 0) { + return ( +

+ No tags match +

+ ); + } + return filteredTags.map((tag) => { + const isActive = selectedTags.includes(tag.name); + return ( + + ); + }); + })()}