/** * Seed: datadriven Season & Events Engine (spec §28). * Datumregler beräknas av recommendation-engine (midsommar, påsk, advent). */ export interface SeedSeasonEvent { id: string; slug: string; nameSv: string; nameLocalized: string; market: string; dateRule: | { kind: "fixed"; monthDay: string } | { kind: "range"; startMonthDay: string; endMonthDay: string } | { kind: "computed"; algorithm: "midsummer" | "easter" | "advent" | "custom" } | { kind: "easter-offset"; days: number } | { kind: "nth-weekday"; month: number; weekday: number; n: number | "last" }; leadDays: number; foodTags: string[]; recipeSlugs: string[]; priority: number; } export const SEED_SEASON_EVENTS: SeedSeasonEvent[] = [ { id: "se-midsommar", slug: "midsommar", nameSv: "Midsommar", nameLocalized: "", market: "SE", dateRule: { kind: "computed", algorithm: "midsummer" }, leadDays: 10, foodTags: ["sill", "färskpotatis", "jordgubbar", "grillat", "västerbottensostpaj"], recipeSlugs: ["sill-och-farskpotatis", "vasterbottensostpaj", "kottbullar-med-potatismos"], priority: 100, }, { id: "se-jul", slug: "jul", nameSv: "Jul", nameLocalized: "", market: "SE", dateRule: { kind: "range", startMonthDay: "12-20", endMonthDay: "12-26" }, leadDays: 21, foodTags: ["julbord", "köttbullar", "janssons", "sill", "skinka"], recipeSlugs: ["jansons-frestelse", "kottbullar-med-potatismos"], priority: 100, }, { id: "se-pask", slug: "påsk", nameSv: "Påsk", nameLocalized: "", market: "SE", dateRule: { kind: "computed", algorithm: "easter" }, leadDays: 10, foodTags: ["ägg", "sill", "lamm", "lax"], recipeSlugs: ["sill-och-farskpotatis", "ugnsbakad-lax-med-citron-och-dill"], priority: 90, }, { id: "se-nyar", slug: "nyår", nameSv: "Nyårsafton", nameLocalized: "", market: "SE", dateRule: { kind: "fixed", monthDay: "12-31" }, leadDays: 7, foodTags: ["fest", "skaldjur", "lyx"], recipeSlugs: [], priority: 80, }, { id: "se-kraftskiva", slug: "kraftskiva", nameSv: "Kräftskivepremiär", nameLocalized: "", market: "SE", dateRule: { kind: "range", startMonthDay: "08-01", endMonthDay: "08-31" }, leadDays: 7, foodTags: ["kräftor", "västerbottensostpaj", "knäckebröd"], recipeSlugs: ["vasterbottensostpaj"], priority: 70, }, { id: "se-surstromming", slug: "surstromming", nameSv: "Surströmmingspremiär", nameLocalized: "", market: "SE", dateRule: { kind: "fixed", monthDay: "08-15" }, leadDays: 5, foodTags: ["surströmming", "tunnbröd", "mandelpotatis"], recipeSlugs: [], priority: 40, }, { id: "se-lucia", slug: "lucia", nameSv: "Lucia", nameLocalized: "", market: "SE", dateRule: { kind: "fixed", monthDay: "12-13" }, leadDays: 7, foodTags: ["lussekatter", "pepparkakor", "glögg"], recipeSlugs: [], priority: 60, }, { id: "se-valborg", slug: "valborg", nameSv: "Valborg", nameLocalized: "", market: "SE", dateRule: { kind: "fixed", monthDay: "04-30" }, leadDays: 5, foodTags: ["grillat", "vårmat"], recipeSlugs: ["halloumiburgare"], priority: 50, }, { id: "se-grillsasong", slug: "grillsasong", nameSv: "Grillsäsong", nameLocalized: "", market: "SE", dateRule: { kind: "range", startMonthDay: "05-15", endMonthDay: "08-31" }, leadDays: 0, foodTags: ["grillat", "sallad", "sommarmat"], recipeSlugs: ["halloumiburgare", "grekisk-sallad"], priority: 30, }, { id: "se-skolstart", slug: "skolstart", nameSv: "Skolstart", nameLocalized: "", market: "SE", dateRule: { kind: "range", startMonthDay: "08-10", endMonthDay: "08-31" }, leadDays: 7, foodTags: ["matlåda", "vardagsmat", "snabbt"], recipeSlugs: ["spaghetti-med-kottfarssas", "chili-con-carne"], priority: 40, }, { id: "se-alla-hjartans", slug: "alla-hjartans-dag", nameSv: "Alla hjärtans dag", nameLocalized: "", market: "SE", dateRule: { kind: "fixed", monthDay: "02-14" }, leadDays: 5, foodTags: ["middag för två", "lyx", "dessert"], recipeSlugs: ["teriyakilax-med-ris"], priority: 50, }, { id: "int-halloween", slug: "halloween", nameSv: "Halloween", nameLocalized: "", market: "SE", dateRule: { kind: "fixed", monthDay: "10-31" }, leadDays: 7, foodTags: ["pumpa", "barnkalas", "höstmat"], recipeSlugs: ["tomatsoppa-med-basilika"], priority: 40, }, { id: "int-oktoberfest", slug: "oktoberfest", nameSv: "Oktoberfest", nameLocalized: "", market: "SE", dateRule: { kind: "range", startMonthDay: "09-20", endMonthDay: "10-05" }, leadDays: 5, foodTags: ["korv", "surkål", "öl"], recipeSlugs: [], priority: 20, }, { id: "int-thanksgiving", slug: "thanksgiving", nameSv: "Thanksgiving", nameLocalized: "", market: "US", dateRule: { kind: "range", startMonthDay: "11-20", endMonthDay: "11-28" }, leadDays: 10, foodTags: ["kalkon", "pumpapaj"], recipeSlugs: [], priority: 90, }, { id: "int-ramadan-eid", slug: "eid", nameSv: "Eid al-Fitr", nameLocalized: "", market: "SE", // Rörligt datum (månkalender) – uppdateras årligen av admin tills kalenderconnector finns. dateRule: { kind: "computed", algorithm: "custom" }, leadDays: 14, foodTags: ["fest", "lamm", "dadlar", "sötsaker"], recipeSlugs: [], priority: 90, }, // --- Norge (NO) --- { id: "no-julaften", slug: "julaften", nameSv: "Julaften", nameLocalized: "Julaften", market: "NO", dateRule: { kind: "fixed", monthDay: "12-24" }, leadDays: 21, foodTags: ["ribbe", "pinnekjott", "lutefisk", "surkal", "riskrem", "medisterkake"], recipeSlugs: [], priority: 100, }, { id: "no-paske", slug: "paske", nameSv: "Påske", nameLocalized: "Påske", market: "NO", dateRule: { kind: "computed", algorithm: "easter" }, leadDays: 10, foodTags: ["lam", "egg", "appelsin", "marsipan", "paskeol"], recipeSlugs: [], priority: 90, }, { id: "no-sankthans", slug: "sankthans", nameSv: "Sankthansaften", nameLocalized: "Sankthansaften", market: "NO", dateRule: { kind: "fixed", monthDay: "06-23" }, leadDays: 7, foodTags: ["grillmat", "rommegrot", "spekemat", "jordbaer", "reker"], recipeSlugs: [], priority: 80, }, { id: "no-nyttarsaften", slug: "nyttarsaften", nameSv: "Nyttårsaften", nameLocalized: "Nyttårsaften", market: "NO", dateRule: { kind: "fixed", monthDay: "12-31" }, leadDays: 7, foodTags: ["pinnekjott", "torsk", "reker", "kransekake"], recipeSlugs: [], priority: 90, }, { id: "no-farikal", slug: "farikalens-festdag", nameSv: "Fårikålens festdag", nameLocalized: "Fårikålens festdag", market: "NO", dateRule: { kind: "nth-weekday", month: 9, weekday: 4, n: "last" }, leadDays: 5, foodTags: ["far", "kal", "pepperkorn", "potet"], recipeSlugs: [], priority: 80, }, // --- Danmark (DK) --- { id: "dk-juleaften", slug: "juleaften", nameSv: "Juleaften", nameLocalized: "Juleaften", market: "DK", dateRule: { kind: "fixed", monthDay: "12-24" }, leadDays: 21, foodTags: ["flaeskesteg", "and", "rodkal", "brunede-kartofler", "risalamande"], recipeSlugs: [], priority: 100, }, { id: "dk-paske", slug: "paske", nameSv: "Påske", nameLocalized: "Påske", market: "DK", dateRule: { kind: "computed", algorithm: "easter" }, leadDays: 7, foodTags: ["sild", "aeg", "lammesteg", "nye-kartofler", "snaps"], recipeSlugs: [], priority: 90, }, { id: "dk-nytarsaften", slug: "nytarsaften", nameSv: "Nytårsaften", nameLocalized: "Nytårsaften", market: "DK", dateRule: { kind: "fixed", monthDay: "12-31" }, leadDays: 7, foodTags: ["kogt-torsk", "kransekage", "marcipan"], recipeSlugs: [], priority: 90, }, { id: "dk-julefrokost", slug: "julefrokost", nameSv: "Julefrokost", nameLocalized: "Julefrokost", market: "DK", dateRule: { kind: "range", startMonthDay: "12-01", endMonthDay: "12-30" }, leadDays: 7, foodTags: ["sild", "frikadeller", "leverpostej", "ribbensteg", "snaps"], recipeSlugs: [], priority: 80, }, { id: "dk-mortensaften", slug: "mortensaften", nameSv: "Mortensaften", nameLocalized: "Mortensaften", market: "DK", dateRule: { kind: "fixed", monthDay: "11-10" }, leadDays: 7, foodTags: ["and", "gas", "rodkal", "brunede-kartofler", "brun-sovs"], recipeSlugs: [], priority: 75, }, // --- Finland (FI) --- { id: "fi-joulu", slug: "joulu", nameSv: "Jouluaatto", nameLocalized: "Jouluaatto", market: "FI", dateRule: { kind: "fixed", monthDay: "12-24" }, leadDays: 21, foodTags: ["joulukinkku", "lanttulaatikko", "rosolli", "graavilohi", "joulutorttu"], recipeSlugs: [], priority: 100, }, { id: "fi-paasiainen", slug: "paasiainen", nameSv: "Pääsiäinen", nameLocalized: "Pääsiäinen", market: "FI", dateRule: { kind: "computed", algorithm: "easter" }, leadDays: 7, foodTags: ["mammi", "pasha", "lammas", "suklaamuna"], recipeSlugs: [], priority: 90, }, { id: "fi-juhannus", slug: "juhannus", nameSv: "Juhannus", nameLocalized: "Juhannus", market: "FI", dateRule: { kind: "computed", algorithm: "midsummer" }, leadDays: 7, foodTags: ["grillimakkara", "uudet-perunat", "silli", "graavilohi"], recipeSlugs: [], priority: 85, }, { id: "fi-rapujuhlat", slug: "rapujuhlat", nameSv: "Rapujuhlat", nameLocalized: "Rapujuhlat", market: "FI", dateRule: { kind: "range", startMonthDay: "07-21", endMonthDay: "09-30" }, leadDays: 7, foodTags: ["rapu", "tilli", "ruisleipa", "snapsi"], recipeSlugs: [], priority: 80, }, { id: "fi-vappu", slug: "vappu", nameSv: "Vappu", nameLocalized: "Vappu", market: "FI", dateRule: { kind: "fixed", monthDay: "05-01" }, leadDays: 7, foodTags: ["sima", "tippaleipa", "munkki"], recipeSlugs: [], priority: 75, }, // --- Island (IS) --- { id: "is-adfangadagur", slug: "adfangadagur", nameSv: "Aðfangadagur", nameLocalized: "Aðfangadagur", market: "IS", dateRule: { kind: "fixed", monthDay: "12-24" }, leadDays: 21, foodTags: ["hamborgarhryggur", "hangikjot", "laufabraud", "rjupa"], recipeSlugs: [], priority: 100, }, { id: "is-paskar", slug: "paskar", nameSv: "Páskar", nameLocalized: "Páskar", market: "IS", dateRule: { kind: "computed", algorithm: "easter" }, leadDays: 5, foodTags: ["lambakjot", "lambalaeri", "paskaegg"], recipeSlugs: [], priority: 90, }, { id: "is-thorrablot", slug: "thorrablot", nameSv: "Þorrablót", nameLocalized: "Þorrablót", market: "IS", dateRule: { kind: "range", startMonthDay: "01-23", endMonthDay: "02-22" }, leadDays: 7, foodTags: ["hakarl", "svid", "hangikjot", "hardfiskur", "brennivin"], recipeSlugs: [], priority: 80, }, { id: "is-sprengidagur", slug: "sprengidagur", nameSv: "Sprengidagur", nameLocalized: "Sprengidagur", market: "IS", dateRule: { kind: "easter-offset", days: -47 }, leadDays: 3, foodTags: ["saltkjot", "baunir", "gulrofa"], recipeSlugs: [], priority: 70, }, { id: "is-thorlaksmessa", slug: "thorlaksmessa", nameSv: "Þorláksmessa", nameLocalized: "Þorláksmessa", market: "IS", dateRule: { kind: "fixed", monthDay: "12-23" }, leadDays: 5, foodTags: ["skata", "hangikjot", "rugbraud"], recipeSlugs: [], priority: 70, }, // --- Tyskland (DE) --- { id: "de-weihnachten", slug: "weihnachten", nameSv: "Weihnachten", nameLocalized: "Weihnachten", market: "DE", dateRule: { kind: "fixed", monthDay: "12-24" }, leadDays: 21, foodTags: ["gans", "karpfen", "stollen", "lebkuchen", "wurstchen"], recipeSlugs: [], priority: 100, }, { id: "de-silvester", slug: "silvester", nameSv: "Silvester", nameLocalized: "Silvester", market: "DE", dateRule: { kind: "fixed", monthDay: "12-31" }, leadDays: 6, foodTags: ["berliner", "raclette", "fondue", "linsen", "heringssalat"], recipeSlugs: [], priority: 90, }, { id: "de-ostern", slug: "ostern", nameSv: "Ostern", nameLocalized: "Ostern", market: "DE", dateRule: { kind: "computed", algorithm: "easter" }, leadDays: 10, foodTags: ["lamm", "eier", "osterbrot", "schinken", "hefezopf"], recipeSlugs: [], priority: 90, }, { id: "de-oktoberfest", slug: "oktoberfest", nameSv: "Oktoberfest", nameLocalized: "Oktoberfest", market: "DE", dateRule: { kind: "range", startMonthDay: "09-19", endMonthDay: "10-04" }, leadDays: 7, foodTags: ["hendl", "schweinshaxe", "weisswurst", "brezn", "obatzda"], recipeSlugs: [], priority: 85, }, { id: "de-karneval", slug: "karneval", nameSv: "Karneval", nameLocalized: "Karneval", market: "DE", dateRule: { kind: "easter-offset", days: -48 }, leadDays: 5, foodTags: ["krapfen", "berliner", "mutzenmandeln"], recipeSlugs: [], priority: 70, }, { id: "de-spargelzeit", slug: "spargelzeit", nameSv: "Spargelzeit", nameLocalized: "Spargelzeit", market: "DE", dateRule: { kind: "range", startMonthDay: "04-15", endMonthDay: "06-24" }, leadDays: 4, foodTags: ["spargel", "sauce-hollandaise", "schinken", "kartoffeln"], recipeSlugs: [], priority: 75, }, // --- Frankrike (FR) --- { id: "fr-reveillon-noel", slug: "reveillon-de-noel", nameSv: "Réveillon de Noël", nameLocalized: "Réveillon de Noël", market: "FR", dateRule: { kind: "fixed", monthDay: "12-24" }, leadDays: 21, foodTags: ["huitres", "foie-gras", "chapon", "marrons", "buche"], recipeSlugs: [], priority: 100, }, { id: "fr-saint-sylvestre", slug: "saint-sylvestre", nameSv: "Saint-Sylvestre", nameLocalized: "Saint-Sylvestre", market: "FR", dateRule: { kind: "fixed", monthDay: "12-31" }, leadDays: 7, foodTags: ["foie-gras", "huitres", "fruits-de-mer", "saumon-fume", "champagne"], recipeSlugs: [], priority: 90, }, { id: "fr-epiphanie", slug: "epiphanie", nameSv: "Épiphanie", nameLocalized: "Épiphanie", market: "FR", dateRule: { kind: "fixed", monthDay: "01-06" }, leadDays: 5, foodTags: ["galette-des-rois", "frangipane", "feve", "brioche"], recipeSlugs: [], priority: 80, }, { id: "fr-chandeleur", slug: "chandeleur", nameSv: "Chandeleur", nameLocalized: "Chandeleur", market: "FR", dateRule: { kind: "fixed", monthDay: "02-02" }, leadDays: 3, foodTags: ["crepes", "sucre", "citron", "confiture"], recipeSlugs: [], priority: 70, }, { id: "fr-paques", slug: "paques", nameSv: "Pâques", nameLocalized: "Pâques", market: "FR", dateRule: { kind: "computed", algorithm: "easter" }, leadDays: 10, foodTags: ["agneau", "gigot", "oeufs-chocolat", "chocolat"], recipeSlugs: [], priority: 90, }, { id: "fr-mardi-gras", slug: "mardi-gras", nameSv: "Mardi Gras", nameLocalized: "Mardi Gras", market: "FR", dateRule: { kind: "easter-offset", days: -47 }, leadDays: 3, foodTags: ["beignets", "bugnes", "merveilles", "gaufres"], recipeSlugs: [], priority: 70, }, // --- Nederländerna (NL) --- { id: "nl-sinterklaas", slug: "sinterklaas", nameSv: "Sinterklaas", nameLocalized: "Sinterklaas", market: "NL", dateRule: { kind: "fixed", monthDay: "12-05" }, leadDays: 14, foodTags: ["kruidnoten", "pepernoten", "chocoladeletter", "speculaas", "banketstaaf"], recipeSlugs: [], priority: 95, }, { id: "nl-kerst", slug: "kerst", nameSv: "Kerst", nameLocalized: "Kerst", market: "NL", dateRule: { kind: "fixed", monthDay: "12-25" }, leadDays: 14, foodTags: ["gourmet", "rollade", "kerststol", "kerstkransjes"], recipeSlugs: [], priority: 100, }, { id: "nl-oud-en-nieuw", slug: "oud-en-nieuw", nameSv: "Oud en Nieuw", nameLocalized: "Oud en Nieuw", market: "NL", dateRule: { kind: "fixed", monthDay: "12-31" }, leadDays: 5, foodTags: ["oliebollen", "appelflappen", "appelbeignets"], recipeSlugs: [], priority: 90, }, { id: "nl-pasen", slug: "pasen", nameSv: "Pasen", nameLocalized: "Pasen", market: "NL", dateRule: { kind: "computed", algorithm: "easter" }, leadDays: 10, foodTags: ["eieren", "paasstol", "paasbrood", "lamsvlees"], recipeSlugs: [], priority: 85, }, { id: "nl-koningsdag", slug: "koningsdag", nameSv: "Koningsdag", nameLocalized: "Koningsdag", market: "NL", dateRule: { kind: "fixed", monthDay: "04-27" }, leadDays: 5, foodTags: ["tompouce", "oranje", "gebak"], recipeSlugs: [], priority: 65, }, ];