Deuxième étape du chantier "onglet Sources" : l'UI de parcours, construite contre les endpoints backend de l'étape 1 (#45). L'onglet désactivé placeholder de RecipeTabs devient un vrai onglet fonctionnel. - RecipeTabs.tsx : nouveau type RecipesPageTab (RecipeTab | "sources") — gardé hors du type partagé RecipeTab puisque l'API n'a pas de tab=sources à valider. Un prop `tabs` optionnel restreint quels onglets s'affichent — RecipePickerDialog (choix d'une recette pour un planning) s'y restreint aux 4 onglets réels, parcourir des sources externes en plein milieu de ce dialogue n'a pas de sens sans le flux de revue/import. - Nouveau RecipeSourcesPanel.tsx : contenu de l'onglet "Sources" — autonome (son propre master-detail), ne partage pas le fetching RecipeTab de RecipesPage puisqu'il parcourt le catalogue *live* d'une source (GET /sources/:key/browse), pas la table Recipe sauvegardée. Sélecteur de source si le foyer en a activé plusieurs ; sélectionner un item déjà importé navigue directement vers la vraie recette (SourceItemTable + navigate), un item pas encore importé affiche un aperçu en lecture seule (SourceItemPreviewPanel, réutilise StepDescription — les tech steps sont donc déjà surlignés dans l'aperçu). - Bug trouvé et corrigé en écrivant le scénario Cypress : cliquer un item déjà importé changeait l'URL mais restait affiché sur l'onglet Sources (RecipesPage ne rend RecipeDetailPanel/RecipeTable qu'en dehors de l'onglet "sources"). RecipeSourcesPanel prend maintenant un callback `onViewImportedRecipe` pour repasser sur un onglet réel avant de naviguer. Tests : nouveau recipe-sources.feature (parcours utilisateur complet — onglet vide, parcours avec items importés/non importés, aperçu avec surlignage de technique) ; recipes.cy.ts corrigé (assertion obsolète sur l'ancien placeholder désactivé). Étape suivante (3/4) : écran de revue (corriger les ingrédients non résolus) + finalisation de l'import. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
29 lines
1.3 KiB
TypeScript
29 lines
1.3 KiB
TypeScript
// Sidebar/nav icon set — thin, named re-exports of lucide-react glyphs
|
||
// rather than importing `lucide-react` directly in every consumer. Keeps a
|
||
// single place documenting "which glyph stands for which app concept"
|
||
// (the mapping itself, decided once, isn't obvious from a bare `Settings`
|
||
// or `Home` import) and keeps consumer diffs small if a glyph ever needs
|
||
// to change. Previously a hand-drawn custom SVG set (24×24, stroke-based,
|
||
// no fill) — lucide-react uses the same stroke-based "line icon" language
|
||
// (default `strokeWidth={2}`, round caps/joins) so the switch is visually
|
||
// a no-op, just swaps who draws the paths.
|
||
//
|
||
// Every one of these is always paired with visible text (the nav label, or
|
||
// a `title` tooltip when the sidebar is collapsed) — purely decorative, so
|
||
// every consumer passes `aria-hidden="true"` itself (unlike the old custom
|
||
// `Icon` wrapper, lucide doesn't set this by default).
|
||
export {
|
||
Calendar as PlanningIcon,
|
||
BookOpen as RecipesIcon,
|
||
ShoppingCart as ShoppingListIcon,
|
||
Settings as SettingsIcon,
|
||
User as AccountIcon,
|
||
Leaf as DietPreferencesIcon,
|
||
Home as HouseholdIcon,
|
||
Palette as UserPreferencesIcon,
|
||
Info as CreditsIcon,
|
||
ChevronLeft as ChevronLeftIcon,
|
||
Star as FavoriteIcon,
|
||
Globe as PublicIcon,
|
||
Rss as SourcesIcon,
|
||
} from "lucide-react";
|