feat(recipes): refonte de la catégorisation des ingrédients façon rayons de supermarché
Remplace les 18 catégories plates (mélangeant rayons génériques et
cuisines d'origine — un ingrédient pouvait finir dans "légumes" ou
"cuisine italienne" selon l'angle choisi) par une hiérarchie à 2 niveaux
sur le modèle d'un supermarché français :
- 🥦 Produits frais (légumes, fruits, herbes fraîches)
- 🥩 Boucherie & poissonnerie (viandes, volailles, poissons,
crustacés & fruits de mer)
- 🥫 Épicerie sèche (féculents, légumineuses, graines & fruits secs,
autres produits secs/conserves)
- 🍞 Boulangerie (pains, pâtes à cuire — 4 nouveaux ingrédients :
pâte feuilletée/brisée/à pizza/à tarte sablée)
- 🧈 Crémerie & fromage (produits laitiers, œufs, alternatives
végétales)
- 🧂 Condiments & épices (épices, sauces, assaisonnements)
- 🍳 Aides culinaires (bases, épaississants, sucres)
- Schéma : nouvel enum IngredientCategory (7 valeurs) + nouvel enum
IngredientSubcategory (22 valeurs) + colonne Ingredient.subcategory.
Migration appliquée via reset (données de référence, aucune perte
réelle) car les anciennes valeurs d'enum n'existent plus dans les
nouvelles.
- reference-seed-data.ts entièrement réorganisé par (catégorie, sous-
catégorie), tous les 437 ingrédients recatégorisés un par un.
- packages/shared : INGREDIENT_CATEGORIES (7), INGREDIENT_SUBCATEGORIES
(22) et INGREDIENT_CATEGORY_SUBCATEGORIES (mapping catégorie →
sous-catégories, pour piloter le picker) remplacent l'ancienne liste
plate.
- IngredientPicker : drill-down à 2 niveaux — la ligne de sous-
catégories (couleur --color-tag, visuellement subordonnée) apparaît
une fois une catégorie choisie, et se réinitialise au changement de
catégorie.
- i18n : nouvelles clés recipes.form.category.* (7) et
recipes.form.subcategory.* (22).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>