feat: auto-classify AI recipes as dish/drink (v0.33.0)

generate, generate-from-idea, URL import, and photo import all now
have the AI set recipeType directly (defaulting to "dish" whenever
ambiguous, per instruction), with cookMins force-cleared for drinks
as a backstop in case the model doesn't follow the prompt guidance.
1-serving-by-default for unspecified drink quantities is left to the
model's own judgment of the request text, since there's no reliable
way to detect "was a serving count stated" without re-parsing intent.

Drink recipes get a distinct default icon (no cover photo case), and
Explore gains the same dish/drink Type filter My Recipes already had.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Arnaud
2026-07-14 15:17:33 +02:00
parent 3042d289a0
commit af92b8cc71
16 changed files with 80 additions and 17 deletions
+2 -1
View File
@@ -20,6 +20,7 @@ type Recipe = {
updatedAt: Date;
photos?: Array<{ storageKey: string; isCover: boolean }>;
sourceUrl?: string | null;
recipeType?: "dish" | "drink";
};
const VISIBILITY_ICON = {
@@ -56,7 +57,7 @@ export function RecipeCard({ recipe }: { recipe: Recipe }) {
</div>
) : (
<div className="aspect-video bg-gradient-to-br from-muted to-muted/50 flex items-center justify-center text-4xl">
🍽
{recipe.recipeType === "drink" ? "🍹" : "🍽️"}
</div>
)}
<CardHeader className="pb-2">
+2 -1
View File
@@ -49,6 +49,7 @@ type Recipe = {
isBatchCook?: boolean;
dishCount?: number;
sourceUrl?: string | null;
recipeType?: "dish" | "drink";
};
/** Stops the click from bubbling to the card's own Link/select handler. */
@@ -92,7 +93,7 @@ function RecipeThumb({ recipe, selectMode, selected, className }: { recipe: Reci
/>
) : (
<div className={cn("w-full h-full flex items-center justify-center text-2xl", selectMode && !selected && "opacity-60")}>
🍽
{recipe.recipeType === "drink" ? "🍹" : "🍽️"}
</div>
)}
{selectMode && selected && <div className="absolute inset-0 bg-primary/20" />}