/** * Catégories recettes Ben-to (alignées produit : familles & variantes typiques). * Utilisé par `build-recipes.mjs` pour associer chaque recette à une « base » du catalogue. */ /** @typedef {'sweet' | 'savory'} BaseFlavor */ /** Ordre d’affichage dans le builder (étape « base »). */ export const RECIPE_BASE_DISPLAY_ORDER = [ "base:onigiri", "base:gimbap", "base:mandu", "base:empanadas-savory", "base:empanadas-sweet", "base:galettes", "base:bao", "base:muffin", "base:mini-cakes", "base:biscuits-secs", "base:fluffy-cakes", "base:cakes", "base:carnet" ]; /** Flavour du bandeau salé / sucré pour la carte « base » (une valeur par catégorie). */ export const RECIPE_BASE_FLAVOR = /** @type {Readonly>} */ ({ "base:onigiri": "savory", "base:gimbap": "savory", "base:mandu": "savory", "base:empanadas-savory": "savory", "base:empanadas-sweet": "sweet", "base:galettes": "savory", "base:bao": "savory", "base:muffin": "sweet", "base:mini-cakes": "sweet", "base:biscuits-secs": "sweet", "base:fluffy-cakes": "sweet", "base:cakes": "sweet", "base:carnet": "savory" }); const normSlug = (slug) => slug.toLowerCase(); const normTags = (tags) => tags.map((t) => t.trim().toLowerCase()).filter(Boolean); /** * Associe une recette à un identifiant de base catalogue. * Règles évaluées du plus spécifique au plus général ; la première correspondance l’emporte. * * @param {string} slug * @param {ReadonlyArray} tags Tags bentext (section tags), déjà en minuscules possible * @returns {string} */ export const resolveRecipeBaseId = (slug, tags) => { const s = normSlug(slug); const tg = normTags([...tags]); if ( tg.includes("carnet") || tg.includes('cheesecake') || tg.includes('carrot-cake') ) return "base:carnet"; if (s.includes("inarizushi") || s.includes("musubi") || s.includes("onigiri")) return "base:onigiri"; if ( s.includes("gimbap") || s.includes("kimbap") || (s.includes("maki") && !s.includes("makisu")) ) { return "base:gimbap"; } if (s.includes("mandu") || s.includes("gyoza") || s.includes("jiaozi") || s.includes("mandoo")) { return "base:mandu"; } if (s.includes("empanadas-citron") || s.includes("empanada-citron")) return "base:empanadas-sweet"; if (s.includes("empanad")) return "base:empanadas-savory"; if ( s.includes("dan-bing") || s.includes("danbing") || s.includes("blini") || s.includes("naan") || s.includes("jeon") || s.includes("paratha") || s.includes("cong-you") || s.includes("congyou") ) { return "base:galettes"; } if (/\b(mantou|baozi)\b/i.test(slug) || /\bbao\b/i.test(slug)) return "base:bao"; if (s.includes("muffin")) return "base:muffin"; if (s.includes("madeleine") || s.includes("financier")) return "base:mini-cakes"; if (s.includes("biscuit")) return "base:biscuits-secs"; if ( s.includes("savoie") || s.includes("fluffy") || s.includes("gateau") || s.includes("gâteau") ) { return "base:fluffy-cakes"; } if (s.includes("cake") || s.includes("banana") || s.includes("cremeux") || s.includes("crémeux")) { return "base:cakes"; } return "base:carnet"; };