diff --git a/apps/web/src/features/recipes/IngredientPicker.tsx b/apps/web/src/features/recipes/IngredientPicker.tsx
index bb47d3f..6b24c22 100644
--- a/apps/web/src/features/recipes/IngredientPicker.tsx
+++ b/apps/web/src/features/recipes/IngredientPicker.tsx
@@ -5,6 +5,7 @@ import {
} from "@batch-cooking/shared";
import { useState } from "react";
import { useTranslation } from "react-i18next";
+import { AllergenIcon, DietPreferencesIcon } from "../../layouts/nav-icons";
import { AllergenBadges } from "./AllergenBadges";
import { DietBadges } from "./DietBadges";
import "./recipes.scss";
@@ -23,6 +24,11 @@ const ALL_CATEGORIES = "ALL" as const;
* rationale as `AllergySelect`/`DietSelect`. `excludeIds` (already-selected
* ingredients — a recipe's ingredient list, or a profile's disliked list)
* keeps the same one from being added twice.
+ *
+ * The two toggle buttons trailing the search input show/hide the
+ * allergen/diet badge rows on every card — a display preference local to
+ * this picker (not persisted), for whoever finds two rows of badges per
+ * card too noisy while just browsing/searching by name.
*/
export function IngredientPicker({
ingredients,
@@ -38,6 +44,13 @@ export function IngredientPicker({
ALL_CATEGORIES,
);
const [query, setQuery] = useState("");
+ // Purely a display preference for this picker's own card grid — doesn't
+ // touch which ingredients `visible` includes, only whether their
+ // allergen/diet badges render. Defaults to shown (the previous, only
+ // behavior); collapsing them is an opt-in for whoever finds two rows of
+ // badges per card too noisy while just browsing/searching by name.
+ const [showAllergens, setShowAllergens] = useState(true);
+ const [showDiets, setShowDiets] = useState(true);
const normalizedQuery = query.trim().toLowerCase();
const visible = ingredients.filter((ingredient) => {
@@ -63,6 +76,26 @@ export function IngredientPicker({
onChange={(e) => setQuery(e.target.value)}
placeholder={t("recipes.form.searchIngredientPlaceholder")}
/>
+