/* ============================================================ SWIRL MASTER โ€” Ninja Swirl Receptencompanion Application Logic v1.0 ============================================================ */ // ============================================================ // RECIPE DATABASE โ€” Complete recepten voor Ninja Swirl by CREAMi // ============================================================ const PROGRAMS = { soft_serve: { name: 'Soft Serve', category: 'soft', icon: '๐Ÿฆ', desc: 'Zachte, draaiende iJs โ€” fair stijl.' }, scoop: { name: 'Scoop', category: 'scooped', icon: '๐Ÿจ', desc: 'Perfect gescoopt iJs in klassieke stijl.' }, ice_cream: { name: 'Ice Cream', category: 'scooped', icon: '๐Ÿจ', desc: 'Romige, scooped iJs โ€” de klassieker.' }, creamify: { name: 'Creamify', category: 'scooped', icon: 'โœจ', desc: 'Ultragladde romige textuur โ€” de alles-in-รฉรฉn mode.' }, lite_ice_cream: { name: 'Lite Ice Cream', category: 'scooped', icon: '๐Ÿฅ›', desc: 'Lichtere iJs met minder vet en suiker.' }, frozen_yogurt: { name: 'Frozen Yogurt', category: 'scooped', icon: '๐Ÿฅ›', desc: 'Frisse, romige bevroren yoghurt.' }, fruiti: { name: 'Fruiti', category: 'scooped', icon: '๐Ÿ“', desc: 'Luchtige, fruitige bevroren traktatie โ€” puur fruit.' }, soft_serve_gelato: { name: 'Soft Serve Gelato', category: 'soft', icon: '๐Ÿ‡ฎ๐Ÿ‡น', desc: 'Italiaanse dichte gelato als soft serve.' }, gelato: { name: 'Gelato', category: 'scooped', icon: '๐Ÿ‡ฎ๐Ÿ‡น', desc: 'Italiaanse dichte, zijdezachte iJs.' }, sorbet: { name: 'Sorbet', category: 'scooped', icon: '๐Ÿฅญ', desc: 'Fruitig, zuivelvrij en verfrissend.' }, milkshake: { name: 'Milkshake', category: 'scooped', icon: '๐Ÿฅค', desc: 'Dikke, drinkbare traktatie.' }, }; const RECIPES = [ { id: "ic-vanilla", type: "ice_cream", name: "Klassieke Vanille IJs", emoji: "\ud83c\udf68", description: "De ultieme basis. Romig, zoet en perfect vanille.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.9, popularity: 100, tags: ["beginner"], diet: [], program: "Ice Cream", ingredients: [ "1 kopje zware room (236ml)", "\u00bd kopje volle melk (118ml)", "\u2153 kopje suiker (66g)", "\u00bd eetlepel vanille-extract", "\u00bd theelepel vanille pasta (optioneel)" ], steps: [ "Mix alle ingredi\u00ebnten in een kom. Roer tot de suiker volledig is opgelost.", "Giet het mengsel in een Ninja Swirl pint. Laat 2,5 cm ruimte bovenaan.", "Plaats de deksel erop en zet in de vriezer voor minimaal 24 uur.", "Haal de pint uit de vriezer. Plaats in de outer bowl.", "Selecteer het \"Ice Cream\" programma en druk op START.", "Na het spoelen: als het ijs te hard is, voeg dan 1 eetlepel melk toe en gebruik RE-SPIN.", "Serveer direct of bewaar in de vriezer met de deksel." ], mixins: ["Chocolade stukjes", "Gehakte noten", "Vers fruit", "Caramel saus", "Cookie dough stukjes"], nutrition: { calories: 160, fat: "11g", carbs: "14g", protein: "2g" }, tips: "Gebruik echte vanille pasta voor zichtbare zaadjes. Voor rijkere smaak: vervang melk door extra room.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ic-chocolate", type: "ice_cream", name: "Death By Chocolate IJs", emoji: "\ud83c\udf6b", description: "Intens chocolade voor de echte chocoholic.", difficulty: "Beginner", difficultyScore: 1, prepTime: "15 min", freezeTime: "24u", totalTime: "24u 15m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.9, popularity: 95, tags: ["beginner"], diet: [], program: "Ice Cream", ingredients: [ "1 kopje zware room (236ml)", "\u00bd kopje volle melk (118ml)", "\u2153 kopje suiker (66g)", "\u00bc kopje cacaopoeder (16g)", "\u00bd theelepel vanille-extract", "Snufje zout" ], steps: [ "Zeef het cacaopoeder in een kom om klontjes te verwijderen.", "Verwarm \u00bd kopje room zachtjes (niet koken) en los de suiker en cacao erin op.", "Roer de rest van de room, melk, vanille en zout erdoor.", "Giet in de pint, sluit af en vries 24 uur.", "Plaats in de outer bowl, selecteer \"Ice Cream\" en START.", "RE-SPIN met 1 eetlepel melk als het te vast is." ], mixins: ["Chocolade chunks", "Brownie stukjes", "Oreo koekjes", "Chocolade saus", "Geroosterde hazelnoten"], nutrition: { calories: 170, fat: "12g", carbs: "16g", protein: "2g" }, tips: "Voor extra donkere chocolade: gebruik \u00bd kopje cacao. Voeg espresso-poeder toe voor diepere smaak.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ic-strawberry", type: "ice_cream", name: "Verse Aardbeienijs", emoji: "\ud83c\udf53", description: "Romig ijs met verse aardbeien \u2014 zomer in een pint.", difficulty: "Beginner", difficultyScore: 1, prepTime: "15 min", freezeTime: "24u", totalTime: "24u 15m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.8, popularity: 90, tags: ["beginner", "gluten_free"], diet: ["gluten_free"], program: "Ice Cream", ingredients: [ "1 kopje zware room (236ml)", "\u00bd kopje volle melk (118ml)", "\u2153 kopje suiker (66g)", "\u00be kopje verse aardbeien, gewassen en ontkroond (128g)", "\u00bd theelepel vanille-extract", "\u00bd eetlepel citroensap" ], steps: [ "Pureer de aardbeien met citroensap in een blender tot een gladde massa.", "Mix room, melk, suiker en vanille in een kom. Roer tot suiker oplost.", "Roer het aardbeienpuree erdoor.", "Giet in de pint, sluit af en vries 24 uur.", "Verwerk op \"Ice Cream\" programma.", "RE-SPIN indien nodig." ], mixins: ["Verse aardbei stukjes", "Witte chocolade stukjes", "Biscuit stukjes", "Balsamico glazuur", "Chocolade stukjes"], nutrition: { calories: 145, fat: "10g", carbs: "14g", protein: "2g" }, tips: "Bevroren aardbeien werken ook \u2014 laat ze volledig ontdooien. Voor intensere smaak: reduceer het puree tot de helft.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ic-mint-choc", type: "ice_cream", name: "Mint Chocolate Chip", emoji: "\ud83c\udf3f", description: "Verfrissende munt met knapperige chocolade stukjes.", difficulty: "Beginner", difficultyScore: 1, prepTime: "5 min", freezeTime: "24u", totalTime: "24u 5m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.7, popularity: 85, tags: ["beginner", "gluten_free"], diet: ["gluten_free"], program: "Ice Cream", ingredients: [ "1 kopje zware room (236ml)", "\u00bd kopje volle melk (118ml)", "\u2153 kopje suiker (66g)", "\u00be theelepel pepermunt extract", "3 druppels groene voedselkleuring (optioneel)", "\u00bc kopje donkere chocolade chips (28g)" ], steps: [ "Mix room, melk, suiker en munt extract tot suiker oplost.", "Voeg voedselkleuring toe voor een lichtgroene kleur (optioneel).", "Giet in de pint, sluit af en vries 24 uur.", "Verwerk op \"Ice Cream\" programma.", "Voeg na het spoelen de chocolade chips toe via de MIX-IN functie." ], mixins: ["Extra donkere chocolade", "Andes munt stukjes", "Cacao nibs", "Oreo stukjes", "Chocolade stukjes"], nutrition: { calories: 165, fat: "11g", carbs: "15g", protein: "2g" }, tips: "Mint extract is sterk \u2014 begin met minder. Verse muntblaadjes in de basis trekken geeft een subtielere smaak.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ic-cookies-cream", type: "ice_cream", name: "Cookies & Cream", emoji: "\ud83c\udf6a", description: "Klassieke vanille met royale stukjes chocolate cookie.", difficulty: "Beginner", difficultyScore: 1, prepTime: "5 min", freezeTime: "24u", totalTime: "24u 5m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.8, popularity: 92, tags: ["beginner"], diet: [], program: "Ice Cream", ingredients: [ "1 kopje zware room (236ml)", "\u00bd kopje volle melk (118ml)", "\u2153 kopje suiker (66g)", "\u00bd theelepel vanille-extract", "15 Oreo koekjes (of vergelijkbaar), grof gehakt" ], steps: [ "Mix room, melk, suiker en vanille tot suiker oplost.", "Giet in de pint, sluit af en vries 24 uur.", "Verwerk op \"Ice Cream\" programma.", "Voeg de gehakte koekjes toe via de MIX-IN functie.", "Bewaar een paar hele koekjes voor garnering." ], mixins: ["Extra koekjes", "Chocolade saus", "Brownie stukjes", "Marshmallow fluff", "Chocolade stukjes"], nutrition: { calories: 190, fat: "12g", carbs: "20g", protein: "2g" }, tips: "Hak de koekjes niet te fijn \u2014 grove stukjes geven de beste textuur. Vries koekjes vooraf voor minder papperigheid.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "gl-vanilla-bean", type: "gelato", name: "Vanilla Bean Gelato", emoji: "\ud83c\uddee\ud83c\uddf9", description: "Echte Italiaanse gelato met zichtbare vanillezaadjes.", difficulty: "Gemiddeld", difficultyScore: 2, prepTime: "25 min", freezeTime: "24u", totalTime: "24u 25m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.9, popularity: 88, tags: ["gluten_free"], diet: ["gluten_free"], program: "Gelato", ingredients: [ "1 kopje volle melk (236ml)", "\u215c kopje suiker (75g)", "2 eidooiers", "1 vanillestokje, opengesneden en uitgeschraapt", "\u00bd eetlepel maizena (optioneel, voor binding)" ], steps: [ "Verhit de melk met het vanillestokje en zaadjes tot net onder het kookpunt.", "Klop eidooiers met suiker tot bleek en luchtig.", "Giet langzaam de hete melk bij het eimengsel, al roerend.", "Giet terug in de pan en verwarm zachtjes (au bain-marie) tot het mengsel de lepel bedekt (82\u00b0C).", "Laat volledig afkoelen, minimaal 4 uur in de koelkast.", "Giet in de pint, sluit af en vries 24 uur.", "Verwerk op \"Gelato\" programma." ], mixins: ["Pistache noten", "Amaretti koekjes", "Espresso bonen", "Karamelized amandelen", "Pistaches"], nutrition: { calories: 140, fat: "6g", carbs: "19g", protein: "4g" }, tips: "De custardbasis is de sleutel. Gebruik een thermometer \u2014 boven 85\u00b0C gaan de eieren stollen. Zeef voor gladheid.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "gl-stracciatella", type: "gelato", name: "Stracciatella Gelato", emoji: "\ud83c\udf6b", description: "Italiaanse klassieker: romige gelato met chocoladeschaafsel.", difficulty: "Gemiddeld", difficultyScore: 2, prepTime: "25 min", freezeTime: "24u", totalTime: "24u 25m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.8, popularity: 80, tags: ["gluten_free"], diet: ["gluten_free"], program: "Gelato", ingredients: [ "1 kopje volle melk (236ml)", "\u215c kopje suiker (75g)", "2 eidooiers", "\u00bd theelepel vanille-extract", "\u00bc kopje gesmolten donkere chocolade (42g)" ], steps: [ "Maak een custardbasis: verwarm melk, klop eieren met suiker, combineer en thickly.", "Laat afkoelen en voeg vanille toe.", "Giet in de pint, sluit af en vries 24 uur.", "Verwerk op \"Gelato\" programma.", "Tijdens MIX-IN: drizzle de gesmolten chocolade erin voor dunne schilfers." ], mixins: ["Extra chocolade vlokken", "Hazelnoten paste", "Espresso", "Caramel stukjes", "Pistaches"], nutrition: { calories: 160, fat: "8g", carbs: "18g", protein: "4g" }, tips: "De truc is hete chocolade langzaam te drizzelen tijdens het mixen \u2014 dit cre\u00ebert de dunne scherfjes.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "gl-pistachio", type: "gelato", name: "Pistache Gelato", emoji: "\ud83d\udfe2", description: "Rijke, nootachtige gelato met echte pistaches.", difficulty: "Gemiddeld", difficultyScore: 2, prepTime: "30 min", freezeTime: "24u", totalTime: "24u 30m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.9, popularity: 82, tags: ["gluten_free"], diet: ["gluten_free"], program: "Gelato", ingredients: [ "1 kopje volle melk (236ml)", "\u215c kopje suiker (75g)", "2 eidooiers", "\u00bd kopje gepelde pistaches (60g), licht geroosterd", "\u00bd theelepel amandelextract", "Snufje zout" ], steps: [ "Maal de pistaches fijn in een food processor tot een grove pasta.", "Verhit de melk en voeg de pistachepasta toe. Laat 15 minuten trekken.", "Zeef de melk (voor gladde textuur) of laat voor rustieke stijl.", "Maak de custardbasis met eidooiers en suiker.", "Combineer, laat afkoelen, giet in pint en vries 24 uur.", "Verwerk op \"Gelato\" programma." ], mixins: ["Gehakte pistaches", "Amaretti stukjes", "Donkere chocolade", "Honing-karamel", "Pistaches"], nutrition: { calories: 180, fat: "10g", carbs: "19g", protein: "5g" }, tips: "Gebruik ongebrande, ongezouten pistaches voor de beste smaak. Siciliaanse pistaches zijn de goudstandaard.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "so-mango", type: "sorbet", name: "Mango Sorbet", emoji: "\ud83e\udd6d", description: "Tropische, zijdezachte sorbet met maar 2 ingredi\u00ebnten.", difficulty: "Beginner", difficultyScore: 1, prepTime: "5 min", freezeTime: "24u", totalTime: "24u 5m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.8, popularity: 87, tags: ["beginner", "vegan", "dairy_free", "gluten_free"], diet: ["vegan", "dairy_free", "gluten_free"], program: "Sorbet", ingredients: [ "\u00bd blik mango stukken in sap (288g) \u2014 of 2 verse mango's", "1 eetlepel suiker (optioneel, afhankelijk van zoetheid mango)", "\u00bd eetlepel citroensap" ], steps: [ "Giet het blik mango met sap in een blender. Blend tot glad.", "Proef en voeg suiker toe indien nodig.", "Voeg citroensap toe om de smaak op te helderen.", "Giet in de pint, sluit af en vries 24 uur.", "Verwerk op \"Sorbet\" programma.", "RE-SPIN met 1 eetlepel water als het te vast is." ], mixins: ["Lime zeste", "Chili vlokken", "Kokos rasp", "Verse munt", "Kokosvlokken"], nutrition: { calories: 70, fat: "0g", carbs: "18g", protein: "0g" }, tips: "Verse mango werkt fantastisch \u2014 kies rijpe, zachte vruchten. Ananas of passievrucht mengt perfect.", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, { id: "so-pineapple", type: "sorbet", name: "Ananas Sorbet", emoji: "\ud83c\udf4d", description: "Briljante, zonnige sorbet \u2014 puur fruit genot.", difficulty: "Beginner", difficultyScore: 1, prepTime: "5 min", freezeTime: "24u", totalTime: "24u 1m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.7, popularity: 75, tags: ["beginner", "vegan", "dairy_free", "gluten_free"], diet: ["vegan", "dairy_free", "gluten_free"], program: "Sorbet", ingredients: [ "\u00bd blik ananas stukken in sap (288g)", "\u00bd eetlepel citroensap", "\u00bd eetlepel suiker (optioneel)" ], steps: [ "Blend ananas met sap tot glad.", "Voeg citroensap en suiker naar smaak toe.", "Giet in pint, sluit en vries 24 uur.", "Verwerk op \"Sorbet\" programma." ], mixins: ["Kokosvlokken", "Rum-karamel", "Basilicum", "Chili zout", "Verse munt"], nutrition: { calories: 60, fat: "0g", carbs: "15g", protein: "0g" }, tips: "Voor een pina colada twist: vervang de helft van de ananas door kokosmelk.", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, { id: "so-raspberry", type: "sorbet", name: "Framboos Sorbet", emoji: "\ud83e\uded0", description: "Intens fruitige sorbet met levendige kleur.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.8, popularity: 78, tags: ["beginner", "vegan", "dairy_free", "gluten_free", "low_sugar"], diet: ["vegan", "dairy_free", "gluten_free", "low_sugar"], program: "Sorbet", ingredients: [ "150g diepgevroren frambozen (of vers)", "\u00bc kopje suiker (50g)", "\u215b kopje water (30ml)", "\u00bd eetlepel citroensap" ], steps: [ "Verhit suiker met water tot een siroop. Laat afkoelen.", "Blend frambozen met siroop en citroensap.", "Zeef voor gladde textuur (verwijder zaadjes).", "Giet in pint, sluit en vries 24 uur.", "Verwerk op \"Sorbet\" programma." ], mixins: ["Verse bessen", "Witte chocolade", "Munt", "Balsamico", "Verse munt"], nutrition: { calories: 65, fat: "0g", carbs: "16g", protein: "0g" }, tips: "De siroop basis is belangrijk \u2014 het voorkomt kristalvorming. Agave of honing werken ook.", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, { id: "so-lemon", type: "sorbet", name: "Citroen Sorbet", emoji: "\ud83c\udf4b", description: "Verfrissende, zurige sorbet \u2014 perfecte palate cleanser.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.6, popularity: 65, tags: ["beginner", "vegan", "dairy_free", "gluten_free", "low_sugar"], diet: ["vegan", "dairy_free", "gluten_free", "low_sugar"], program: "Sorbet", ingredients: [ "\u00bd kopje vers citroensap (4-5 citroenen)", "\u00be kopje suiker (150g)", "1 kopje water (236ml)", "\u00bd eetlepel citroen zeste" ], steps: [ "Maak een siroop: verhit water met suiker tot opgelost.", "Voeg citroensap en zeste toe. Laat afkoelen.", "Giet in pint, sluit en vries 24 uur.", "Verwerk op \"Sorbet\" programma." ], mixins: ["Lavendel", "Basilicum", "Vodka (voor zachtere textuur)", "Munt", "Verse munt"], nutrition: { calories: 90, fat: "0g", carbs: "23g", protein: "0g" }, tips: "Een scheutje vodka (1 eetlepel) verlaagt het vriespunt en maakt de sorbet smoother. Alcohol kookt niet uit \u2014 blijft aanwezig.", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, { id: "fy-one-ingredient", type: "frozen_yogurt", name: "One-Ingredient Frozen Yogurt", emoji: "\ud83e\udd5b", description: "Letterlijk alleen yoghurt. Simpel, snel, heerlijk.", difficulty: "Beginner", difficultyScore: 1, prepTime: "5 min", freezeTime: "24u", totalTime: "24u 5m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.7, popularity: 83, tags: ["beginner", "low_sugar"], diet: ["low_sugar"], program: "Frozen Yogurt", ingredients: ["1 pint (236ml) volle yoghurt (Griekse stijl)"], steps: [ "Roer de yoghurt glad.", "Giet in de pint, sluit af en vries 24 uur.", "Verwerk op \"Frozen Yogurt\" programma.", "RE-SPIN met 1 eetlepel melk indien te vast." ], mixins: ["Honing", "Vers fruit", "Granola", "Chocolade", "Pindakaas"], nutrition: { calories: 75, fat: "4g", carbs: "6g", protein: "4g" }, tips: "Volle, Griekse yoghurt geeft de beste textuur. Mager yoghurt wordt ijsachtig. Voeg honing voor zoetheid.", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, { id: "fy-classic-tart", type: "frozen_yogurt", name: "Classic Tart Frozen Yogurt", emoji: "\ud83c\udf66", description: "Pinkberry-stijl tart fro-yo met maar 4 ingredi\u00ebnten.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.9, popularity: 89, tags: ["beginner"], diet: [], program: "Frozen Yogurt", ingredients: [ "1 pint (236ml) volle yoghurt", "\u215b kopje karnemelk (30ml)", "1 eetlepel vers citroensap", "1\u00bd eetlepels suiker (optioneel)" ], steps: [ "Mix alle ingredi\u00ebnten in een kom tot glad.", "Giet in de pint, sluit af en vries 24 uur.", "Verwerk op \"Frozen Yogurt\" programma." ], mixins: ["Vers fruit", "Granola", "Chocolade chips", "Kokos", "Honing-amandel"], nutrition: { calories: 85, fat: "4g", carbs: "9g", protein: "4g" }, tips: "De karnemelk geeft de karakteristieke tartness. Geen karnemelk? Voeg extra citroensap toe.", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, { id: "fy-berry", type: "frozen_yogurt", name: "Mixed Berry Frozen Yogurt", emoji: "\ud83e\uded0", description: "Romige yoghurt met een mix van zomerbessen.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.7, popularity: 76, tags: ["beginner", "gluten_free"], diet: ["gluten_free"], program: "Frozen Yogurt", ingredients: [ "1 pint (236ml) volle Griekse yoghurt", "\u00bd kopje gemengde bessen (framboos, bosbes, aardbei) \u2014 vers of bevroren", "1\u00bd eetlepels honing (22g)", "\u00bd theelepel vanille-extract" ], steps: [ "Blend de bessen kort (laat wat stukjes zitten voor textuur).", "Mix yoghurt, honing en vanille.", "Roer het bessenmengsel erdoor (marmeren effect).", "Giet in pint, sluit en vries 24 uur.", "Verwerk op \"Frozen Yogurt\" programma." ], mixins: ["Granola", "Verse bessen", "Witte chocolade", "Chia zaad", "Honing drizzle"], nutrition: { calories: 90, fat: "4g", carbs: "11g", protein: "4g" }, tips: "Marmeren door niet volledig te mixen geeft een prachtig visueel effect en afwisselende smaak.", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, { id: "ss-vanilla", type: "soft_serve", name: "Easy Vanilla Soft Serve", emoji: "\ud83c\udf66", description: "Klassieke zachte vanille \u2014 zoals de kermis, maar beter.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.8, popularity: 91, tags: ["beginner"], diet: [], program: "Soft Serve", ingredients: [ "1 kopje zware room (236ml)", "\u00bd kopje volle melk (118ml)", "\u2153 kopje suiker (66g)", "1 theelepel vanille-extract", "Snufje zout" ], steps: [ "Mix alle ingredi\u00ebnten in een kom. Roer tot suiker oplost.", "Giet in de pint (met soft serve nozzle), sluit af en vries 24 uur.", "Plaats in de outer bowl met de swirl attachment.", "Selecteer \"Soft Serve\" en START.", "Doseer met de swirl knop voor mooie zwierige serving." ], mixins: ["Chocolade saus (spritz)", "Gehakte noten", "Kleurrijke sprinkles", "Caramel spiraal", "Chocolade saus"], nutrition: { calories: 155, fat: "11g", carbs: "13g", protein: "2g" }, tips: "Laat de pint 2 minuten op het aanrecht staan voor verwerking voor betere textuur. De swirl nozzle is de truc!", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ss-chocolate", type: "soft_serve", name: "Chocolade Soft Serve", emoji: "\ud83c\udf6b", description: "Zachte, romige chocolade soft serve in 10 minuten.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "0 (direct)", totalTime: "10m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.7, popularity: 86, tags: ["beginner"], diet: [], program: "Soft Serve", ingredients: [ "1 kopje zware room (236ml)", "\u00bd kopje volle melk (118ml)", "\u00bc kopje cacaopoeder (16g)", "\u2153 kopje suiker (66g)", "\u00bd theelepel vanille-extract" ], steps: [ "Zeef cacaopoeder in een kom.", "Verwarm \u00bd kopje melk en los cacao en suiker erin op.", "Roer room, vanille en de rest erdoor.", "Giet in pint, sluit en vries 24 uur.", "Verwerk op \"Soft Serve\" programma met swirl attachment." ], mixins: ["Chocolade saus spritz", "Brownie stukjes", "Oreo crumble", "Geroosterde amandelen", "Chocolade saus"], nutrition: { calories: 165, fat: "12g", carbs: "15g", protein: "2g" }, tips: "Voor extra rijkdom: voeg 2 eetlepels gesmolten donkere chocolade toe aan de basis.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ss-strawberry", type: "soft_serve", name: "Verse Aardbei Soft Serve", emoji: "\ud83c\udf53", description: "Zoete, romige aardbei soft serve met echt fruit.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.8, popularity: 84, tags: ["beginner"], diet: [], program: "Soft Serve", ingredients: [ "1 kopje zware room (236ml)", "\u00bd kopje volle melk (118ml)", "\u00bd kopje verse aardbeien, geblend (85g)", "\u2153 kopje suiker (66g)", "\u00bd theelepel vanille-extract" ], steps: [ "Blend aardbeien tot glad puree.", "Mix met room, melk, suiker en vanille.", "Giet in pint met nozzle, sluit en vries 24 uur.", "Verwerk op \"Soft Serve\" programma." ], mixins: ["Verse aardbei stukjes", "Witte chocolade saus", "Biscuit crumble", "Balsamico", "Chocolade saus"], nutrition: { calories: 145, fat: "10g", carbs: "13g", protein: "2g" }, tips: "De swirl geeft een prachtige roze spiralen. Garneer met een hele aardbei.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ms-classic", type: "milkshake", name: "Klassieke Chocolade Milkshake", emoji: "\ud83e\udd64", description: "Dikke, romige milkshake \u2014 diner stijl.", difficulty: "Beginner", difficultyScore: 1, prepTime: "5 min", freezeTime: "24u", totalTime: "24u 5m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.8, popularity: 82, tags: ["beginner"], diet: [], program: "Milkshake", ingredients: [ "2 kopjes vanille ijs basis (van bovenstaand recept)", "\u00bd kopje volle melk (120ml)", "3 eetlepels chocoladesiroop", "1 theelepel vanille-extract" ], steps: [ "Bereid de vanille ijs basis voor en vries 24 uur.", "Plaats de bevroren basis in de pint.", "Voeg melk en chocoladesiroop toe.", "Verwerk op \"Milkshake\" programma.", "Serveer direct in een hoog glas met een rietje." ], mixins: ["Whipped cream", "Chocolade saus", "Beschuitje", "Cherry", "Slagroom"], nutrition: { calories: 380, fat: "24g", carbs: "38g", protein: "6g" }, tips: "Pas de hoeveelheid melk aan voor gewenste dikte. Minder melk = dikkere shake.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ms-coffee", type: "milkshake", name: "Coffee Caramel Milkshake", emoji: "\u2615", description: "Espresso-liefhebbers droomshake met karamel.", difficulty: "Beginner", difficultyScore: 1, prepTime: "5 min", freezeTime: "24u", totalTime: "24u 5m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.9, popularity: 79, tags: ["beginner"], diet: [], program: "Milkshake", ingredients: [ "2 kopjes vanille ijs basis", "\u00bd kopje sterke espresso (afgekoeld)", "3 eetlepels karamelsiroop", "\u00bd kopje melk (120ml)" ], steps: [ "Bereid vanille ijs basis voor en vries 24 uur.", "Plaats basis in pint met espresso, karamel en melk.", "Verwerk op \"Milkshake\" programma." ], mixins: ["Karamel saus drizzle", "Espresso bonen (gehakt)", "Chocolade", "Whipped cream", "Slagroom"], nutrition: { calories: 360, fat: "22g", carbs: "36g", protein: "5g" }, tips: "Gebruik echte espresso voor de beste smaak. Instant koffie werkt maar is minder intens.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "sb-acai", type: "fruiti", name: "A\u00e7a\u00ed Bowl", emoji: "\ud83e\uded0", description: "Superfood breakfast bowl met a\u00e7a\u00ed en bessen.", difficulty: "Beginner", difficultyScore: 1, prepTime: "5 min", freezeTime: "24u", totalTime: "24u 5m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.7, popularity: 72, tags: ["beginner", "vegan", "dairy_free", "gluten_free"], diet: ["vegan", "dairy_free", "gluten_free"], program: "Fruiti", ingredients: [ "2 a\u00e7a\u00ed packets (bevroren, 200g totaal)", "1 banaan, bevroren", "\u00bd kopje bessenmix (bevroren)", "\u00bc kopje amandelmelk (60ml)", "1 eetlepel honing of agave" ], steps: [ "Blend alle ingredi\u00ebnten tot een dikke massa.", "Giet in pint, sluit en vries 24 uur.", "Verwerk op \"Fruiti\" programma.", "Garneer met gesneden fruit, granola en honing." ], mixins: ["Granola", "Vers fruit", "Chia zaad", "Kokos", "Cacao nibs"], nutrition: { calories: 220, fat: "5g", carbs: "42g", protein: "4g" }, tips: "Houd de base dik \u2014 minder vloeistof = beter lepelbaar. Toppings maken het af!", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, { id: "sb-green", type: "fruiti", name: "Green Goddess Bowl", emoji: "\ud83e\udd6c", description: "Spinazie, banaan en mango \u2014 gezond en kleurrijk.", difficulty: "Beginner", difficultyScore: 1, prepTime: "5 min", freezeTime: "24u", totalTime: "24u 5m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.5, popularity: 60, tags: ["beginner", "vegan", "dairy_free", "gluten_free"], diet: ["vegan", "dairy_free", "gluten_free"], program: "Fruiti", ingredients: [ "1 banaan, bevroren", "1 kopje mango stukken (bevroren)", "1 hand spinazie", "\u00bd avokado", "\u00bc kopje amandelmelk (60ml)", "1 eetlepel honing" ], steps: [ "Blend alles tot glad.", "Giet in pint, sluit en vries 24 uur.", "Verwerk op \"Fruiti\" programma.", "Garneer met chia, kokos en vers fruit." ], mixins: ["Chia zaad", "Hennep zaad", "Vers fruit", "Granola", "Noten boter"], nutrition: { calories: 200, fat: "7g", carbs: "34g", protein: "4g" }, tips: "Avokado maakt het extra romig. Bevroren banaan is essentieel voor de textuur.", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, { id: "cu-vanilla", type: "gelato", name: "Vanilla Gelato", emoji: "\ud83e\udd5a", description: "Rijke, eggnog-achtige soft serve met echte eidooiers.", difficulty: "Gemiddeld", difficultyScore: 2, prepTime: "20 min", freezeTime: "24u", totalTime: "24u 20m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.9, popularity: 81, tags: ["gluten_free"], diet: ["gluten_free"], program: "Gelato", ingredients: [ "1 kopje zware room (236ml)", "\u00bd kopje volle melk (118ml)", "2 eidooiers", "\u215c kopje suiker (75g)", "1 vanillestokje, uitgeschraapt", "Snufje zout" ], steps: [ "Verhit melk en room met vanille tot net onder kookpunt.", "Klop eidooiers met suiker en zout tot bleek.", "Temperer: giet langzaam hete melk bij eieren, al roerend.", "Verwarm au bain-marie tot 82\u00b0C (de lepel bedekt).", "Laat volledig afkoelen, minimaal 4 uur.", "Giet in pint met nozzle, sluit en vries 24 uur.", "Verwerk op \"Gelato\" programma." ], mixins: ["Nootmuscaat", "Gember koekjes", "Caramel swirl", "Geroosterde pecan", "Pistaches"], nutrition: { calories: 210, fat: "16g", carbs: "14g", protein: "4g" }, tips: "Custard moet echt au bain-marie \u2014 directe hitte stolt de eieren. Een thermometer is onmisbaar.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "fw-tropical", type: "fruiti", name: "Tropical Pineapple Mango Whip", emoji: "\ud83c\udf34", description: "Dole Whip stijl \u2014 tropisch, fruitig en licht.", difficulty: "Beginner", difficultyScore: 1, prepTime: "5 min", freezeTime: "24u", totalTime: "24u", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.9, popularity: 85, tags: ["beginner", "vegan", "dairy_free", "gluten_free"], diet: ["vegan", "dairy_free", "gluten_free"], program: "Fruiti", ingredients: [ "\u00bd kopje ananas stukken (bevroren of blik, 200g)", "\u00bd kopje mango stukken (bevroren of blik, 200g)", "1 eetlepel suiker (optioneel)", "\u00bd eetlepel citroensap" ], steps: [ "Blend alle ingredi\u00ebnts tot glad.", "Giet in pint, sluit en vries 24 uur.", "Verwerk op \"Fruiti\" programma." ], mixins: ["Kokosvlokken", "Lime zeste", "Munt", "Chili zout", "Rum"], nutrition: { calories: 55, fat: "0g", carbs: "14g", protein: "0g" }, tips: "Dit is de Dole Whip ervaring thuis! Zorg dat het fruit goed bevroren/uit blik is voor consistentie.", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, { id: "fw-strawberry", type: "fruiti", name: "Aardbei Fruiti", emoji: "\ud83c\udf53", description: "Luchtige, fruitige soft serve met verse aardbeien.", difficulty: "Beginner", difficultyScore: 1, prepTime: "5 min", freezeTime: "24u", totalTime: "24u 5m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.7, popularity: 77, tags: ["beginner", "vegan", "dairy_free", "gluten_free"], diet: ["vegan", "dairy_free", "gluten_free"], program: "Fruiti", ingredients: [ "1 kopje aardbeien (bevroren of vers, 340g)", "1 eetlepel suiker", "\u00bd eetlepel citroensap", "1 eetlepel water" ], steps: [ "Blend alle ingredi\u00ebnten tot glad.", "Giet in pint, sluit en vries 24 uur.", "Verwerk op \"Fruiti\" programma." ], mixins: ["Balsamico", "Verse munt", "Witte chocolade", "Basque cake stukjes", "Vers fruit"], nutrition: { calories: 40, fat: "0g", carbs: "10g", protein: "0g" }, tips: "Bevroren aardbeien geven intensere smaak. Voeg een scheutje kokosmelk voor romigheid.", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, { id: "hp-choc-pb", type: "lite_ice_cream", name: "Chocolate Peanut Butter Protein", emoji: "\ud83d\udcaa", description: "Eiwitrijke soft serve \u2014 perfect post-workout traktatie.", difficulty: "Beginner", difficultyScore: 1, prepTime: "5 min", freezeTime: "24u", totalTime: "24u 5m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.8, popularity: 80, tags: ["beginner"], diet: [], program: "Lite Ice Cream", ingredients: [ "1\u00bd kopjes chocolade eiwitschuddishek (kant-klaar, 355ml)", "\u00bd kopje Griekse yoghurt (120g)", "2 eetlepels pindakaas", "1 eetlepel chia zaad" ], steps: [ "Mix alle ingredi\u00ebnten in een kom tot glad.", "Giet in pint, sluit en vries 24 uur.", "Verwerk op \"Lite Ice Cream\" programma." ], mixins: ["Pindakaas drizzle", "Chocolade stukjes", "Banaan", "Granola", "Vers fruit"], nutrition: { calories: 240, fat: "10g", carbs: "16g", protein: "25g" }, tips: "Kant-klare eiwitschuddishek werkt beter dan poeder \u2014 de textuur is creamer. Premier Protein of Fairlife aanbevolen.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "hp-cinnamon", type: "lite_ice_cream", name: "Cinnamon Roll Protein IJs", emoji: "\ud83d\udcaa", description: "Kaneelbrood smaak in eiwitrijke soft serve.", difficulty: "Beginner", difficultyScore: 1, prepTime: "5 min", freezeTime: "24u", totalTime: "24u 5m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.6, popularity: 68, tags: ["beginner"], diet: [], program: "Lite Ice Cream", ingredients: [ "1\u00be kopje kaneelbrood eiwitschuddishek (415ml)", "2 eetlepels vanille pudding mix (suikervrij optioneel)", "\u00bd theelepel kaneel" ], steps: [ "Mix alle ingredi\u00ebnten tot glad.", "Giet in pint, sluit en vries 24 uur.", "Verwerk op \"Lite Ice Cream\" programma." ], mixins: ["Kaneel suiker", "Beschuitjes", "Karamel drizzle", "Pecan noten", "Vers fruit"], nutrition: { calories: 200, fat: "5g", carbs: "14g", protein: "28g" }, tips: "De pudding mix geeft de textuur van echt ijs. Probeer ook met andere smaken schuddishek.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "df-coconut-vanilla", type: "ice_cream", name: "Dairy-Free Vanilla Coconut IJs", emoji: "\ud83e\udd65", description: "Romige vegan ijs met kokosmelk als base.", difficulty: "Beginner", difficultyScore: 1, prepTime: "5 min", freezeTime: "24u", totalTime: "24u 5m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.6, popularity: 73, tags: ["beginner", "vegan", "dairy_free", "gluten_free"], diet: ["vegan", "dairy_free", "gluten_free"], program: "Ice Cream", ingredients: [ "\u00bd blik volle kokosmelk (200ml)", "\u00bc kopje amandelmelk (60ml)", "\u00bc kopje suiker (33g)", "\u00bd eetlepel coconut oil (gesmolten)", "\u00bd theelepel vanille-extract" ], steps: [ "Mix alle ingredi\u00ebnten in een kom. Roer tot suiker oplost.", "Giet in pint, sluit en vries 24 uur.", "Verwerk op \"Ice Cream\" programma." ], mixins: ["Geroosterde kokos", "Chocolade", "Mango", "Pistaches", "Lime zeste"], nutrition: { calories: 140, fat: "10g", carbs: "12g", protein: "1g" }, tips: "Volle kokosmelk (geen light) is essentieel. Het kokosvet zorgt voor de romige textuur.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "keto-vanilla", type: "lite_ice_cream", name: "Keto Vanille IJs", emoji: "\ud83e\udd51", description: "Suikervrije, keto-vriendelijke ijs met roomkaas.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.5, popularity: 65, tags: ["beginner", "keto", "low_sugar", "gluten_free"], diet: ["keto", "low_sugar", "gluten_free"], program: "Lite Ice Cream", ingredients: [ "1 kopje zware room (236ml)", "\u00bd kopje amandelmelk, ongezoet (118ml)", "30g roomkaas, verzacht", "\u00bc kopje erythritol of allulose (33g)", "\u00bd theelepel vanille-extract", "Snufje zout" ], steps: [ "Verwarm een beetje room en los de roomkaas in op.", "Roer alle ingredi\u00ebnten samen tot glad.", "Giet in pint, sluit en vries 24 uur.", "Verwerk op \"Lite Ice Cream\" programma." ], mixins: ["Pecan noten", "Suikervrije chocolade", "Kaneel", "Maca powder", "Vers fruit"], nutrition: { calories: 130, fat: "12g", carbs: "3g", protein: "2g" }, tips: "Allulose werkt het beste voor keto \u2014 het bevriest niet zo hard als erythritol. Confectionerende sweeter mixt beter.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ic-salted-caramel-pecan", type: "ice_cream", name: "Salted Caramel Pecan", emoji: "\ud83e\udd68", description: "Gouden karamel met geroosterde pecan en een snuf zeezout.", difficulty: "Gemiddeld", difficultyScore: 2, prepTime: "20 min", freezeTime: "24u", totalTime: "24u 20m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.9, popularity: 93, tags: [], diet: [], program: "Ice Cream", ingredients: [ "1 kopje zware room (236ml)", "\u00bd kopje volle melk (118ml)", "\u2153 kopje suiker (66g)", "4 el boter", "\u00bd tl zeezout", "1 tl vanille-extract", "\u215c kopje pecannoten, geroosterd en gehakt (45g)" ], steps: [ "Maak karamel: smelt suiker in een pan op middelhoog vuur tot goudbruin.", "Voeg voorzichtig boter en room toe (let op spatten).", "Roer het zout en vanille erdoor. Laat afkoelen.", "Voeg de melk toe en roer glad.", "Giet in pint, sluit en vries 24u.", "Verwerk op \"Ice Cream\". Voeg pecans toe via MIX-IN." ], mixins: ["Extra karamel saus", "Geroosterde amandelen", "Chocolade stukjes", "Caramel saus", "Gehakte noten"], nutrition: { calories: 210, fat: "16g", carbs: "15g", protein: "2g" }, tips: "De karamel moet donker zijn maar niet verbrand \u2014 goudbruin is het perfecte punt.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ic-earl-grey", type: "ice_cream", name: "Earl Grey Tea IJs", emoji: "\ud83e\uded6", description: "Verfijnd ijs met Earl Grey thee \u2014 bergamot en vanille.", difficulty: "Gemiddeld", difficultyScore: 2, prepTime: "20 min", freezeTime: "24u", totalTime: "24u 20m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.7, popularity: 72, tags: [], diet: [], program: "Ice Cream", ingredients: [ "1 kopje zware room (236ml)", "\u00bd kopje volle melk (118ml)", "\u2153 kopje suiker (66g)", "4 Earl Grey theeblaadjes (losse thee)", "1 tl vanille-extract" ], steps: [ "Verhit room en melk tot net onder kookpunt.", "Voeg theeblaadjes toe en laat 15 minuten trekken.", "Zeef de vloeistof en druk zoveel mogelijk smaak uit de blaadjes.", "Roer suiker en vanille erdoor tot opgelost.", "Giet in pint, sluit en vries 24u.", "Verwerk op \"Ice Cream\"." ], mixins: ["Shortbread koekjes", "Witte chocolade", "Hazelnoten", "Chocolade stukjes", "Caramel saus"], nutrition: { calories: 155, fat: "11g", carbs: "13g", protein: "2g" }, tips: "Lavender Earl Grey geeft een extra bloemige dimensie. Gebruik losse thee, niet zakjes.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ic-lavender-honey", type: "ice_cream", name: "Lavendel-Honing IJs", emoji: "\ud83d\udc9c", description: "Bloemig, delicaat ijs met gedroogde lavendel en zoete honing.", difficulty: "Gemiddeld", difficultyScore: 2, prepTime: "20 min", freezeTime: "24u", totalTime: "24u 20m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.6, popularity: 65, tags: [], diet: [], program: "Ice Cream", ingredients: [ "1 kopje zware room (236ml)", "\u00bd kopje volle melk (118ml)", "\u00bc kopje honing (58g)", "2 tl gedroogde culinaire lavendelbloemen", "1 tl vanille-extract" ], steps: [ "Verhit melk en room tot net onder kookpunt.", "Voeg lavendel toe, dek af en laat 20 minuten trekken.", "Zeef de lavendel eruit.", "Roer honing en vanille erdoor.", "Giet in pint, sluit en vries 24u.", "Verwerk op \"Ice Cream\"." ], mixins: ["Honing-amandel clusters", "Witte chocolade", "Verse bessen", "Chocolade stukjes", "Caramel saus"], nutrition: { calories: 165, fat: "11g", carbs: "14g", protein: "2g" }, tips: "Gebruik alleen culinaire lavendel (geen potpourri!). Te veel lavendel maakt het zeepachtig.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ic-matcha-white-choc", type: "ice_cream", name: "Matcha Witte Chocolade", emoji: "\ud83c\udf75", description: "Aardse matcha met romige witte chocolade stukjes.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.7, popularity: 78, tags: ["beginner"], diet: ["gluten_free"], program: "Ice Cream", ingredients: [ "1 kopje zware room (236ml)", "\u00bd kopje volle melk (118ml)", "\u2153 kopje suiker (66g)", "2 el ceremoniele matcha poeder", "1 tl vanille-extract", "\u00bc kopje witte chocolade stukjes (42g)" ], steps: [ "Zeef matcha poeder in een klein beetje warme melk. Roer tot een gladde pasta.", "Mix met rest van room, melk, suiker en vanille.", "Giet in pint, sluit en vries 24u.", "Verwerk op \"Ice Cream\". Voeg witte chocolade toe via MIX-IN." ], mixins: ["Zwarte sesam", "Geroosterde rijst", "Rode bonen paste", "Chocolade stukjes", "Caramel saus"], nutrition: { calories: 175, fat: "12g", carbs: "17g", protein: "2g" }, tips: "Ceremoniele matcha geeft de beste kleur en smaak. Culinaire matcha is bitterder.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ic-tiramisu", type: "ice_cream", name: "Tiramisu IJs", emoji: "\u2615", description: "Espresso, mascarpone en een vleugje amaretto \u2014 Italiaanse traktatie.", difficulty: "Gemiddeld", difficultyScore: 2, prepTime: "25 min", freezeTime: "24u", totalTime: "24u 25m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.9, popularity: 86, tags: [], diet: [], program: "Ice Cream", ingredients: [ "\u00bd kopje mascarpone (112g)", "\u00bd kopje zware room (118ml)", "\u00bc kopje suiker (50g)", "2 el sterke espresso, afgekoeld", "1 el amaretto (optioneel)", "1 tl vanille-extract", "\u00bd kopje ladyfingers, in stukken" ], steps: [ "Klop mascarpone met suiker glad.", "Voeg espresso, amaretto en vanille toe.", "Vouw de room erdoor.", "Giet in pint, sluit en vries 24u.", "Verwerk op \"Ice Cream\". Voeg ladyfinger stukjes toe via MIX-IN." ], mixins: ["Cacao poeder", "Espresso bonen", "Amaretto koekjes", "Chocolade stukjes", "Caramel saus"], nutrition: { calories: 190, fat: "13g", carbs: "16g", protein: "3g" }, tips: "Dompel de ladyfingers kort in extra espresso voor een authentieke smaak.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ic-cheesecake", type: "ice_cream", name: "New York Cheesecake IJs", emoji: "\ud83c\udf70", description: "Romige cheesecake smaak met stukjes graham cracker.", difficulty: "Beginner", difficultyScore: 1, prepTime: "15 min", freezeTime: "24u", totalTime: "24u 15m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.8, popularity: 84, tags: ["beginner"], diet: [], program: "Ice Cream", ingredients: [ "\u00bd kopje roomkaas, verzacht (112g)", "\u00be kopje zware room (178ml)", "\u2153 kopje suiker (66g)", "1 tl vanille-extract", "1 el citroensap", "\u00bd kopje graham crackers, gehakt" ], steps: [ "Mix roomkaas met suiker glad.", "Voeg room, vanille en citroensap toe. Roer tot suiker oplost.", "Giet in pint, sluit en vries 24u.", "Verwerk op \"Ice Cream\". Voeg graham crackers toe via MIX-IN." ], mixins: ["Verse bessen", "Karamel saus", "Blauwe bessen compote", "Chocolade stukjes", "Caramel saus"], nutrition: { calories: 195, fat: "14g", carbs: "16g", protein: "2g" }, tips: "Gebruik volle roomkaas voor de beste textuur. Light wordt ijsachtig.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ic-red-velvet", type: "ice_cream", name: "Red Velvet IJs", emoji: "\ud83d\udfe5", description: "Rode fluweel cake iJs met cacao en cream cheese swirl.", difficulty: "Gemiddeld", difficultyScore: 2, prepTime: "20 min", freezeTime: "24u", totalTime: "24u 20m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.7, popularity: 79, tags: [], diet: [], program: "Ice Cream", ingredients: [ "1 kopje zware room (236ml)", "\u00bd kopje volle melk (118ml)", "\u2153 kopje suiker (66g)", "2 el cacaopoeder", "1 tl rode voedselkleuring", "1 tl vanille-extract", "\u00bd kopje roomkaas (112g)", "\u00bd kopje red velvet cake stukjes" ], steps: [ "Mix room, melk, suiker, cacao en kleuring.", "Klop roomkaas los en vouw erdoor voor een marmer effect.", "Giet in pint, sluit en vries 24u.", "Verwerk op \"Ice Cream\". Voeg cake stukjes toe via MIX-IN." ], mixins: ["Witte chocolade chips", "Cream cheese glazuur", "Cake kruimels", "Chocolade stukjes", "Caramel saus"], nutrition: { calories: 190, fat: "12g", carbs: "18g", protein: "2g" }, tips: "Gebruik gekochte red velvet cake voor gemak, of bak zelf en vries de stukjes vooraf.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ic-nutella", type: "ice_cream", name: "Nutella Hazelnoot IJs", emoji: "\ud83c\udf6b", description: "Romige chocolade-hazelnoot spread als iJs. Hemels.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.9, popularity: 91, tags: ["beginner"], diet: [], program: "Ice Cream", ingredients: [ "\u00be kopje zware room (178ml)", "\u00bc kopje volle melk (60ml)", "\u215c kopje Nutella (105g)", "\u215b kopje suiker (25g)", "1 tl vanille-extract" ], steps: [ "Verwarm de melk zachtjes en los de Nutella erin op.", "Roer room, suiker en vanille erdoor.", "Giet in pint, sluit en vries 24u.", "Verwerk op \"Ice Cream\"." ], mixins: ["Gehakte hazelnoten", "Witte chocolade", "Brownie stukjes", "Chocolade stukjes", "Caramel saus"], nutrition: { calories: 210, fat: "14g", carbs: "20g", protein: "3g" }, tips: "Warm de Nutella iets op voor makkelijker mixen. Extra Nutella als swirl na het spoelen!", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ic-creme-brulee", type: "ice_cream", name: "Cr\u00e8me Br\u00fbl\u00e9e IJs", emoji: "\ud83d\udd25", description: "Rijke custard iJs met karamelized suiker stukjes.", difficulty: "Gemiddeld", difficultyScore: 2, prepTime: "30 min", freezeTime: "24u", totalTime: "24u 30m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.8, popularity: 81, tags: [], diet: [], program: "Ice Cream", ingredients: [ "1 kopje zware room (236ml)", "\u00bd kopje volle melk (118ml)", "2 eidooiers", "\u2153 kopje suiker (66g)", "1 vanillestokje, uitgeschraapt", "Extra suiker voor karamel" ], steps: [ "Maak een custardbasis: verwarm melk en room met vanille.", "Klop eidooiers met suiker, combineer en thickly tot 82\u00b0C.", "Laat afkoelen, giet in pint en vries 24u.", "Verwerk op \"Ice Cream\".", "Maak karamelstukjes: smelt suiker op bakpapier, breek in stukken.", "Voeg karamelstukjes toe via MIX-IN." ], mixins: ["Karamel stukjes", "Geroosterde amandelen", "Shortbread", "Chocolade stukjes", "Caramel saus"], nutrition: { calories: 200, fat: "14g", carbs: "17g", protein: "3g" }, tips: "De karamel stukjes geven de \"crack\" van cr\u00e8me br\u00fbl\u00e9e. Maak ze dun en breek in kleine scherfjes.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ic-smores", type: "ice_cream", name: "S'mores IJs", emoji: "\ud83c\udfd5\ufe0f", description: "Graham cracker, marshmallow en chocolade \u2014 kampvuur in een pint.", difficulty: "Beginner", difficultyScore: 1, prepTime: "15 min", freezeTime: "24u", totalTime: "24u 15m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.8, popularity: 83, tags: ["beginner"], diet: [], program: "Ice Cream", ingredients: [ "1 kopje zware room (236ml)", "\u00bd kopje volle melk (118ml)", "\u2153 kopje suiker (66g)", "3 el cacaopoeder", "1 tl vanille-extract", "Graham crackers, gehakt", "Mini marshmallows", "Chocolade chips" ], steps: [ "Mix room, melk, suiker, cacao en vanille.", "Giet in pint, sluit en vries 24u.", "Verwerk op \"Ice Cream\".", "Voeg graham crackers, marshmallows en chocolade toe via MIX-IN." ], mixins: ["Extra marshmallow fluff", "Chocolade saus", "Graham cracker kruimels", "Chocolade stukjes", "Caramel saus"], nutrition: { calories: 185, fat: "12g", carbs: "20g", protein: "2g" }, tips: "Rooster de marshmallows kort met een brander voor echte s'mores smaak.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ic-peanut-butter-cup", type: "ice_cream", name: "Peanut Butter Cup IJs", emoji: "\ud83e\udd5c", description: "Romige pindakaas iJs met chocolade-peanut butter stukjes.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.9, popularity: 88, tags: ["beginner"], diet: [], program: "Ice Cream", ingredients: [ "1 kopje zware room (236ml)", "\u00bd kopje volle melk (118ml)", "\u2153 kopje suiker (66g)", "\u00bc kopje pindakaas, glad (60g)", "1 tl vanille-extract", "\u00bd tl zout", "\u00bc kopje Reese's of pindakaas-chocolade cups, gehakt" ], steps: [ "Verwarm een deel van de melk en los de pindakaas erin op.", "Mix met room, suiker, vanille en zout.", "Giet in pint, sluit en vries 24u.", "Verwerk op \"Ice Cream\". Voeg peanut butter cups toe via MIX-IN." ], mixins: ["Extra pindakaas drizzle", "Chocolade saus", "Gehakte pinda's", "Chocolade stukjes", "Caramel saus"], nutrition: { calories: 220, fat: "16g", carbs: "15g", protein: "4g" }, tips: "Gebruik gladde pindakaas zonder stukjes. Crunchy geeft een andere textuur.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ic-dulce-de-leche", type: "ice_cream", name: "Dulce de Leche IJs", emoji: "\ud83c\udde6\ud83c\uddf7", description: "Argentijnse gekarameliseerde melk als romig iJs.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.8, popularity: 80, tags: ["beginner", "gluten_free"], diet: ["gluten_free"], program: "Ice Cream", ingredients: [ "1 kopje zware room (236ml)", "1 blikje Dulce de Leche (198g)", "\u00bc kopje volle melk (60ml)", "1 tl vanille-extract", "Snufje zout" ], steps: [ "Verwarm de melk zachtjes.", "Roer de Dulce de Leche erdoor tot glad.", "Voeg room, vanille en zout toe.", "Giet in pint, sluit en vries 24u.", "Verwerk op \"Ice Cream\"." ], mixins: ["Gehakte walnoten", "Chocolade stukjes", "Karamel popcorn", "Caramel saus", "Gehakte noten"], nutrition: { calories: 215, fat: "12g", carbs: "24g", protein: "3g" }, tips: "Koop een blikje Dulce de Leche (of maak zelf door gecondenseerde melk 3u te koken in de blik).", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ic-black-sesame", type: "ice_cream", name: "Zwarte Sesam IJs", emoji: "\u26ab", description: "Geroosterde zwarte sesam \u2014 nootachtig, uniek en elegant.", difficulty: "Gemiddeld", difficultyScore: 2, prepTime: "20 min", freezeTime: "24u", totalTime: "24u 20m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.6, popularity: 62, tags: [], diet: ["vegan", "dairy_free"], program: "Ice Cream", ingredients: [ "1 kopje kokosmelk (236ml)", "\u00bc kopje zwarte sesam pasta (60g)", "\u00bc kopje suiker (33g)", "2 el kokosolie", "1 tl vanille-extract", "Snufje zout" ], steps: [ "Rooster 2 el zwarte sesamzaadjes in een droge pan tot ze gaan poppen.", "Mix alle ingredi\u00ebnten in een blender tot glad.", "Giet in pint, sluit en vries 24u.", "Verwerk op \"Ice Cream\"." ], mixins: ["Witte chocolade", "Geroosterde rijst", "Matcha stukjes", "Chocolade stukjes", "Caramel saus"], nutrition: { calories: 170, fat: "13g", carbs: "11g", protein: "2g" }, tips: "Zwarte sesam pasta (nerigoma) is te koop bij Aziatische supermarkten. Prachtige grijze kleur!", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ic-cinnamon-roll", type: "ice_cream", name: "Cinnamon Roll IJs", emoji: "\ud83e\udd6e", description: "Kaneel, brown sugar en cream cheese glazuur smaken.", difficulty: "Beginner", difficultyScore: 1, prepTime: "15 min", freezeTime: "24u", totalTime: "24u 15m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.7, popularity: 76, tags: ["beginner"], diet: [], program: "Ice Cream", ingredients: [ "1 kopje zware room (236ml)", "\u00bd kopje volle melk (118ml)", "\u2153 kopje lichtbruine basterdsuiker (66g)", "1\u00bd el kaneel", "1 tl vanille-extract", "\u00bc kopje roomkaas (58g)", "\u00bd kopje kaneelbroodjes, in stukken" ], steps: [ "Mix room, melk, basterdsuiker, kaneel en vanille.", "Klop roomkaas los en vouw erdoor.", "Giet in pint, sluit en vries 24u.", "Verwerk op \"Ice Cream\". Voeg broodstukjes toe via MIX-IN." ], mixins: ["Kaneel suiker", "Pecan noten", "Cream cheese glazuur", "Chocolade stukjes", "Caramel saus"], nutrition: { calories: 190, fat: "12g", carbs: "19g", protein: "2g" }, tips: "Gebruik overgebleven kaneelbroodjes of koop kant-en-klaar. Vries ze vooraf.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ic-pumpkin-spice", type: "ice_cream", name: "Pumpkin Spice IJs", emoji: "\ud83c\udf83", description: "Herfst in een pint \u2014 pompoen, kaneel, nootmuskaat en kruidnagel.", difficulty: "Beginner", difficultyScore: 1, prepTime: "15 min", freezeTime: "24u", totalTime: "24u 15m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.6, popularity: 70, tags: ["beginner", "gluten_free"], diet: ["gluten_free"], program: "Ice Cream", ingredients: [ "1 kopje zware room (236ml)", "\u00bd kopje volle melk (118ml)", "\u00bd blik pompoenpuree (212g)", "\u2153 kopje suiker (66g)", "1 tl kaneel", "\u00bd tl nootmuskaat", "\u00bc tl kruidnagel", "\u00bc tl gemberpoeder", "1 tl vanille-extract" ], steps: [ "Mix alle ingredi\u00ebnten in een kom tot glad.", "Giet in pint, sluit en vries 24u.", "Verwerk op \"Ice Cream\"." ], mixins: ["Graham cracker stukjes", "Pecan noten", "Karamel saus", "Gember koekjes", "Chocolade stukjes"], nutrition: { calories: 150, fat: "10g", carbs: "14g", protein: "2g" }, tips: "Gebruik pompoenpuree (zoet of ongezouten). Geen pompoenkruidenmix? Gebruik 2 tl kaneel + 1 tl nootmuskaat.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "gl-taro", type: "gelato", name: "Taro Bubble Tea Gelato", emoji: "\ud83d\udfe3", description: "Populaire Aziatische taro smaak \u2014 paars, zoet en aards.", difficulty: "Gemiddeld", difficultyScore: 2, prepTime: "25 min", freezeTime: "24u", totalTime: "24u 25m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.6, popularity: 68, tags: [], diet: ["vegan", "dairy_free"], program: "Gelato", ingredients: [ "1 kopje kokosmelk (236ml)", "3 el taro poeder (22g)", "\u215b kopje suiker (25g)", "2 el tapioca parels (gekookt)", "1 tl vanille-extract" ], steps: [ "Verhit de kokosmelk en los taro poeder en suiker erin op.", "Laat afkoelen en voeg vanille toe.", "Giet in pint, sluit en vries 24u.", "Verwerk op \"Gelato\". Voeg tapioca parels toe via MIX-IN." ], mixins: ["Extra tapioca parels", "Zwarte sesam", "Condensed milk drizzle", "Pistaches", "Amaretti stukjes"], nutrition: { calories: 140, fat: "9g", carbs: "15g", protein: "1g" }, tips: "Taro poeder is te koop bij Aziatische winkels. Kook tapioca parels volgens verpakking.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "so-rose-wine", type: "sorbet", name: "Ros\u00e9 Wijn Sorbet", emoji: "\ud83c\udf77", description: "Elegante sorbet van droge ros\u00e9 wijn en citroen.", difficulty: "Gemiddeld", difficultyScore: 2, prepTime: "15 min", freezeTime: "24u", totalTime: "24u 15m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.7, popularity: 74, tags: [], diet: ["vegan", "dairy_free", "gluten_free"], program: "Sorbet", ingredients: [ "1 fles ros\u00e9 wijn (375ml)", "\u00bd kopje suiker (100g)", "\u00bc kopje water (60ml)", "2 el citroensap", "1 el citroen zeste" ], steps: [ "Maak een siroop: verhit water met suiker tot opgelost.", "Laat afkoelen en meng met ros\u00e9 en citroensap.", "Giet in pint, sluit en vries 24u.", "Verwerk op \"Sorbet\"." ], mixins: ["Verse frambozen", "Munt", "Prosecco drizzle", "Verse munt", "Chili vlokken"], nutrition: { calories: 90, fat: "0g", carbs: "14g", protein: "0g" }, tips: "De alcohol houdt de sorbet zachter dan fruit-only sorbets. Perfect voor een diner.", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, { id: "so-mojito", type: "sorbet", name: "Mojito Sorbet", emoji: "\ud83c\udf79", description: "Rum, limoen en munt \u2014 verfrissend als een Cubaanse cocktail.", difficulty: "Beginner", difficultyScore: 1, prepTime: "15 min", freezeTime: "24u", totalTime: "24u 15m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.6, popularity: 71, tags: ["beginner", "vegan", "dairy_free", "gluten_free"], diet: ["vegan", "dairy_free", "gluten_free"], program: "Sorbet", ingredients: [ "\u00bd kopje water (118ml)", "\u00bd kopje suiker (100g)", "\u00bc kopje vers limoensap (60ml)", "\u215b kopje witte rum (30ml)", "1 hand verse munt, fijngehakt", "Lime zeste" ], steps: [ "Maak een siroop van water en suiker. Laat afkoelen.", "Voeg limoensap, rum en munt toe.", "Giet in pint, sluit en vries 24u.", "Verwerk op \"Sorbet\"." ], mixins: ["Extra verse munt", "Lime partjes", "Bruiswater", "Verse munt", "Chili vlokken"], nutrition: { calories: 100, fat: "0g", carbs: "21g", protein: "0g" }, tips: "Zonder rum ook heerlijk als alcoholvrije versie. Voeg extra munt voor intensere smaak.", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, { id: "so-aperol-spritz", type: "sorbet", name: "Aperol Spritz Sorbet", emoji: "\ud83d\udfe0", description: "Bitterzoet oranje sorbet \u2014 Italiaanse happy hour in een pint.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.5, popularity: 66, tags: ["beginner", "vegan", "dairy_free", "gluten_free"], diet: ["vegan", "dairy_free", "gluten_free"], program: "Sorbet", ingredients: [ "\u00bd kopje Aperol (118ml)", "\u00bd kopje prosecco (118ml)", "\u00bd kopje water (118ml)", "\u2153 kopje suiker (66g)", "1 el citroensap", "Sinaasappel zeste" ], steps: [ "Maak een siroop van water en suiker. Laat afkoelen.", "Meng met Aperol, prosecco en citroensap.", "Giet in pint, sluit en vries 24u.", "Verwerk op \"Sorbet\"." ], mixins: ["Sinaasappel partjes", "Olijven (ja, echt)", "Bruiswater", "Verse munt"], nutrition: { calories: 95, fat: "0g", carbs: "19g", protein: "0g" }, tips: "De prosecco maakt het luchtig. Serveer in een coupe glas met een sinaasappelschijfje.", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, { id: "so-hibiscus", type: "sorbet", name: "Hibiscus Sorbet", emoji: "\ud83c\udf3a", description: "Diep rood, bloemig en tart \u2014 verfrissend exotisch.", difficulty: "Beginner", difficultyScore: 1, prepTime: "20 min", freezeTime: "24u", totalTime: "24u 20m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.6, popularity: 63, tags: ["beginner", "vegan", "dairy_free", "gluten_free"], diet: ["vegan", "dairy_free", "gluten_free"], program: "Sorbet", ingredients: [ "4 gedroogde hibiscusbloemen (of 2 theezakjes)", "1 kopje water (236ml)", "\u2153 kopje suiker (66g)", "2 el citroensap", "1 el honing" ], steps: [ "Breng water aan de kook. Giet over hibiscusbloemen.", "Laat 15 minuten trekken. Zeef.", "Roer suiker, honing en citroensap erdoor.", "Giet in pint, sluit en vries 24u.", "Verwerk op \"Sorbet\"." ], mixins: ["Verse munt", "Gember stukjes", "Lime zeste", "Chili vlokken", "Kokosvlokken"], nutrition: { calories: 60, fat: "0g", carbs: "15g", protein: "0g" }, tips: "Hibiscus thee (karkade) is intens van kleur en smaak. Te koop bij Turkse marokkaanse winkels.", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, { id: "so-passionfruit", type: "sorbet", name: "Passievrucht Sorbet", emoji: "\ud83d\udfe1", description: "Intens tropisch \u2014 zoet, zurig en vol karakter.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.7, popularity: 73, tags: ["beginner", "vegan", "dairy_free", "gluten_free"], diet: ["vegan", "dairy_free", "gluten_free"], program: "Sorbet", ingredients: [ "\u00bd blik passievrucht puree (175g) of 8 verse passievruchten", "\u00bc kopje suiker (50g)", "\u00bc kopje water (60ml)", "2 el limoensap" ], steps: [ "Maak een siroop van water en suiker. Laat afkoelen.", "Meng met passievrucht puree en limoensap.", "Giet in pint, sluit en vries 24u.", "Verwerk op \"Sorbet\"." ], mixins: ["Kokosvlokken", "Verse munt", "Chili zout", "Chili vlokken", "Lime zeste"], nutrition: { calories: 65, fat: "0g", carbs: "16g", protein: "0g" }, tips: "Passievrucht puree in blik is het makkelijkst. Verse geven een wat bitterdere smaak.", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, { id: "so-watermelon", type: "sorbet", name: "Watermeloen Sorbet", emoji: "\ud83c\udf49", description: "Zomerse verfrissing \u2014 puur watermeloen genot.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.5, popularity: 69, tags: ["beginner", "vegan", "dairy_free", "gluten_free"], diet: ["vegan", "dairy_free", "gluten_free"], program: "Sorbet", ingredients: [ "2 kopjes watermeloen, ontpit en in blokken (300g)", "\u00bc kopje suiker (33g)", "1 el limoensap", "1 el water" ], steps: [ "Pureer de watermeloen in een blender tot glad.", "Roer suiker, limoensap en water erdoor.", "Giet in pint, sluit en vries 24u.", "Verwerk op \"Sorbet\"." ], mixins: ["Verse munt", "Feta crumble (zoet-zout)", "Chili vlokken", "Lime zeste", "Kokosvlokken"], nutrition: { calories: 45, fat: "0g", carbs: "12g", protein: "0g" }, tips: "Watermeloen bevat veel water \u2014 minder suiker nodig. Voeg een snuf zout toe voor smaakdiepte.", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, { id: "fy-maple-walnut", type: "frozen_yogurt", name: "Maple Walnut Frozen Yogurt", emoji: "\ud83c\udf41", description: "Ahornsiroop en walnoten \u2014 herfstige FroYo classic.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.6, popularity: 67, tags: ["beginner"], diet: [], program: "Frozen Yogurt", ingredients: [ "1 pint (236ml) Griekse yoghurt", "\u00bc kopje echte ahornsiroop (58g)", "1 tl vanille-extract", "\u00bc kopje walnoten, gehakt (30g)" ], steps: [ "Mix yoghurt, ahornsiroop en vanille tot glad.", "Giet in pint, sluit en vries 24u.", "Verwerk op \"Frozen Yogurt\". Voeg walnoten toe via MIX-IN." ], mixins: ["Pecannoten", "Extra ahornsiroop drizzle", "Gember stukjes", "Granola", "Verse bessen"], nutrition: { calories: 110, fat: "5g", carbs: "12g", protein: "4g" }, tips: "Gebruik GRADE A Dark ahornsiroop voor de meest intense smaak.", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, { id: "ss-coconut-curry", type: "soft_serve", name: "Coconut Curry Soft Serve", emoji: "\ud83c\udf5b", description: "Avant-garde: kokos met een warme curry ondertoon. Gedurfd!", difficulty: "Gemiddeld", difficultyScore: 2, prepTime: "15 min", freezeTime: "24u", totalTime: "24u 15m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.3, popularity: 55, tags: [], diet: ["vegan", "dairy_free"], program: "Soft Serve", ingredients: [ "1 kopje kokosmelk (236ml)", "\u00bc kopje suiker (33g)", "1 el gele curry pasta (mild)", "1 tl gemberpoeder", "1 tl limoensap", "Snufje zout" ], steps: [ "Verhit een beetje kokosmelk en los de curry pasta erin op.", "Mix met rest van ingredi\u00ebnten.", "Giet in pint met nozzle, sluit en vries 24u.", "Verwerk op \"Soft Serve\"." ], mixins: ["Geroosterde cashewnoten", "Lime zeste", "Kokosvlokken", "Chili vlokken", "Chocolade saus"], nutrition: { calories: 140, fat: "10g", carbs: "11g", protein: "2g" }, tips: "Begin met minder curry pasta \u2014 je kan altijd meer toevoegen. Mild is de sleutel.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "fw-dragonfruit", type: "fruiti", name: "Dragonfruit (Pitaya) Whip", emoji: "\ud83d\udc09", description: "Fel roze, exotische fruit whip met dragonfruit.", difficulty: "Beginner", difficultyScore: 1, prepTime: "5 min", freezeTime: "24u", totalTime: "24u 5m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.7, popularity: 75, tags: ["beginner", "vegan", "dairy_free", "gluten_free"], diet: ["vegan", "dairy_free", "gluten_free"], program: "Fruiti", ingredients: [ "\u00bd kopje dragonfruit (pitaya) blokjes, bevroren (100g)", "\u00bd kopje ananas blokjes, bevroren (100g)", "2 el suiker", "1 el limoensap" ], steps: [ "Blend alle ingredi\u00ebnten tot glad.", "Giet in pint, sluit en vries 24u.", "Verwerk op \"Fruiti\"." ], mixins: ["Kokosvlokken", "Chia zaad", "Verse mango", "Verse munt", "Vers fruit"], nutrition: { calories: 55, fat: "0g", carbs: "14g", protein: "0g" }, tips: "Bevroren dragonfruit is te koop bij Aziatische markten. De kleur is ongeloofijk!", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, { id: "sb-avocado-lime", type: "fruiti", name: "Avocado-Lime Fruiti", emoji: "\ud83e\udd51", description: "Romige avocado met lime en honing \u2014 groen en goed.", difficulty: "Beginner", difficultyScore: 1, prepTime: "5 min", freezeTime: "24u", totalTime: "24u 5m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.4, popularity: 58, tags: ["beginner", "vegan", "dairy_free", "gluten_free"], diet: ["vegan", "dairy_free", "gluten_free"], program: "Fruiti", ingredients: [ "1 rijpe avocado", "1 banaan, bevroren", "\u00bd kopje spinazie", "\u00bc kopje amandelmelk (60ml)", "2 el limoensap", "1 el honing of agave" ], steps: [ "Blend alles tot een dikke massa.", "Giet in pint, sluit en vries 24u.", "Verwerk op \"Fruiti\".", "Garneer met chia, kokos en limoen." ], mixins: ["Chia zaad", "Kokos vlokken", "Hennep zaad", "Granola", "Verse munt"], nutrition: { calories: 230, fat: "12g", carbs: "30g", protein: "4g" }, tips: "Avocado maakt het extra romig zonder zuivel. Perfect voor vegan ontbijt.", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, { id: "hp-vanilla-almond", type: "lite_ice_cream", name: "Vanille Amandel Protein Soft", emoji: "\ud83d\udcaa", description: "Klassieke vanille-amandel protein soft serve.", difficulty: "Beginner", difficultyScore: 1, prepTime: "5 min", freezeTime: "24u", totalTime: "24u 5m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.6, popularity: 64, tags: ["beginner"], diet: [], program: "Lite Ice Cream", ingredients: [ "1\u00be kopje vanille eiwitschuddishek (415ml)", "2 el amandel boter", "1 tl kaneel", "1 el chia zaad" ], steps: [ "Mix alles tot glad.", "Giet in pint, sluit en vries 24u.", "Verwerk op \"Lite Ice Cream\"." ], mixins: ["Gehakte amandelen", "Chocolade stukjes", "Banaan", "Vers fruit", "Granola"], nutrition: { calories: 230, fat: "11g", carbs: "14g", protein: "26g" }, tips: "Amandel boter is romiger dan pindakaas. Cashew boter is nog subtieler.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "hp-strawberry-banana", type: "lite_ice_cream", name: "Aardbei-Banaan Protein Shake IJs", emoji: "\ud83d\udcaa", description: "Fruity protein soft serve met aardbei en banaan.", difficulty: "Beginner", difficultyScore: 1, prepTime: "5 min", freezeTime: "24u", totalTime: "24u 5m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.7, popularity: 70, tags: ["beginner"], diet: [], program: "Lite Ice Cream", ingredients: [ "1\u00be kopje aardbei eiwitschuddishek (415ml)", "1 rijpe banaan", "1 el chia zaad", "\u00bd tl vanille-extract" ], steps: [ "Blend de banaan met de schuddishek tot glad.", "Giet in pint, sluit en vries 24u.", "Verwerk op \"Lite Ice Cream\"." ], mixins: ["Verse aardbeien", "Granola", "Donkere chocolade", "Vers fruit", "Chocolade stukjes"], nutrition: { calories: 210, fat: "5g", carbs: "22g", protein: "28g" }, tips: "Bevroren banaan maakt het extra romig. Rijper = zoeter.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "df-coconut-lime", type: "ice_cream", name: "Coconut-Lime Vegan IJs", emoji: "\ud83e\udd65", description: "Tropische kokos met een pittige lime twist.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.6, popularity: 68, tags: ["beginner", "vegan", "dairy_free", "gluten_free"], diet: ["vegan", "dairy_free", "gluten_free"], program: "Ice Cream", ingredients: [ "\u00bd blik kokosmelk (200ml)", "\u00bc kopje amandelmelk (60ml)", "\u00bc kopje suiker (33g)", "3 el limoensap", "1 tl lime zeste", "1 el kokosolie" ], steps: [ "Mix alle ingredi\u00ebnten tot glad.", "Giet in pint, sluit en vries 24u.", "Verwerk op \"Ice Cream\"." ], mixins: ["Kokosvlokken", "Verse mango", "Chili zout", "Munt", "Chocolade stukjes"], nutrition: { calories: 140, fat: "10g", carbs: "12g", protein: "1g" }, tips: "De lime zeste geeft een intense citrus aromatic. Probeer ook met yuzu!", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "df-avocado-coconut", type: "ice_cream", name: "Avocado-Kokos Vegan IJs", emoji: "\ud83e\udd51", description: "Hemels romig door avocado \u2014 groen en voedzaam.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.5, popularity: 60, tags: ["beginner", "vegan", "dairy_free"], diet: ["vegan", "dairy_free"], program: "Ice Cream", ingredients: [ "\u00bd blik kokosmelk (200ml)", "1 rijpe avocado", "\u00bc kopje suiker (33g) of agave", "2 el limoensap", "1 tl vanille-extract" ], steps: [ "Blend alle ingredi\u00ebnten tot glad.", "Giet in pint, sluit en vries 24u.", "Verwerk op \"Ice Cream\"." ], mixins: ["Donkere chocolade stukjes", "Kokosvlokken", "Hazelnoten", "Chocolade stukjes", "Caramel saus"], nutrition: { calories: 145, fat: "10g", carbs: "12g", protein: "2g" }, tips: "Avocado maakt het ongelooflijk romig zonder zuivel. Zorg dat hij goed rijp is.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ic-blueberry-lavender", type: "lite_ice_cream", name: "Blauwe Bes-Lavendel Lite IJs", emoji: "\ud83e\uded0", description: "Bloemig en fruitig \u2014 paarse lavendel met blauwe bessen.", difficulty: "Beginner", difficultyScore: 1, prepTime: "15 min", freezeTime: "24u", totalTime: "24u 15m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.6, popularity: 64, tags: ["beginner"], diet: [], program: "Lite Ice Cream", ingredients: [ "\u00be kopje amandelmelk, ongezoet (178ml)", "\u00bd kopje Griekse yoghurt 0% (115g)", "\u00bd kopje blauwe bessen (75g)", "3 el honing (22g)", "1 tl gedroogde lavendelbloemen", "1 tl vanille-extract" ], steps: [ "Verhit \u00bc kopje amandelmelk en laat lavendel 10 min trekken. Zeef.", "Blend de bessen met de lavendelmelk, yoghurt, honing en vanille.", "Giet in pint, sluit en vries 24u.", "Verwerk op \"Lite Ice Cream\"." ], mixins: ["Verse blauwe bessen", "Honing drizzle", "Graham cracker stukjes", "Vers fruit", "Chocolade stukjes"], nutrition: { calories: 75, fat: "2g", carbs: "12g", protein: "4g" }, tips: "Lavendel kan overheersen \u2014 begin met minder. Blauwe bessen geven een prachtige kleur.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ic-rooibos-vanilla", type: "lite_ice_cream", name: "Rooibos-Vanille Lite IJs", emoji: "\ud83d\udd34", description: "Warm, aards rooibos met zoete vanille \u2014 Zuid-Afrikaanse inspiratie.", difficulty: "Beginner", difficultyScore: 1, prepTime: "20 min", freezeTime: "24u", totalTime: "24u 20m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.4, popularity: 52, tags: ["beginner", "low_sugar"], diet: ["low_sugar"], program: "Lite Ice Cream", ingredients: [ "\u00be kopje amandelmelk (178ml)", "\u00bd kopje Griekse yoghurt (115g)", "3 rooibos theezakjes", "3 el honing (22g)", "1 tl vanille-extract" ], steps: [ "Verhit amandelmelk tot net onder kookpunt.", "Voeg rooibos theezakjes toe, laat 15 min trekken.", "Verwijder zakjes, voeg yoghurt, honing en vanille toe.", "Giet in pint, sluit en vries 24u.", "Verwerk op \"Lite Ice Cream\"." ], mixins: ["Shortbread koekjes", "Pecan noten", "Gember stukjes", "Vers fruit", "Chocolade stukjes"], nutrition: { calories: 65, fat: "2g", carbs: "9g", protein: "4g" }, tips: "Rooibos is cafe\u00efnevrij en natuurlijk zoet. Probeer ook Honeybush theer.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ic-espresso-martini", type: "ice_cream", name: "Espresso Martini IJs", emoji: "\ud83c\udf78", description: "Koffie, vodka en kahlua \u2014 het after-dinner drankje als iJs.", difficulty: "Beginner", difficultyScore: 1, prepTime: "15 min", freezeTime: "24u", totalTime: "24u 15m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.7, popularity: 76, tags: ["beginner"], diet: ["gluten_free"], program: "Ice Cream", ingredients: [ "1 kopje zware room (236ml)", "\u00bd kopje volle melk (118ml)", "\u2153 kopje suiker (66g)", "2 el oploskoffie (5g)", "3 el wodka (22ml)", "2 el Kahlua (15ml)", "1 tl vanille-extract" ], steps: [ "Los koffie op in 2 el warme melk.", "Mix met room, suiker, wodka, Kahlua en vanille.", "Giet in pint, vries 24u.", "Verwerk op Ice Cream." ], mixins: ["Chocolade espresso bonen", "Karamel saus", "Brownie stukjes", "Chocolade stukjes", "Caramel saus"], nutrition: { calories: 160, fat: "11g", carbs: "13g", protein: "2g" }, tips: "De alcohol houdt het iJs iets zachter.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ic-stout-beer", type: "ice_cream", name: "Stout Bier IJs", emoji: "\ud83c\udf7a", description: "Donkere stout \u2014 karamel, koffie en chocolate noten.", difficulty: "Gemiddeld", difficultyScore: 2, prepTime: "25 min", freezeTime: "24u", totalTime: "24u 25m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.5, popularity: 58, tags: [], diet: [], program: "Ice Cream", ingredients: [ "\u00bd kopje zware room (118ml)", "\u00bd kopje volle melk (118ml)", "\u215c kopje suiker (75g)", "\u00bd kopje donkere stout bier (118ml)", "2 el cacaopoeder", "1 tl vanille-extract" ], steps: [ "Verwarm melk en los cacao op.", "Voeg suiker en stout toe.", "Voeg room en vanille toe.", "Giet in pint, vries 24u.", "Verwerk op Ice Cream." ], mixins: ["Pecan noten", "Donkere chocolade", "Karamel saus", "Chocolade stukjes", "Caramel saus"], nutrition: { calories: 145, fat: "8g", carbs: "16g", protein: "2g" }, tips: "Guinness werkt het beste. Vermijd IPA \u2014 te bitter.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ic-pecan-pie", type: "ice_cream", name: "Pecan Pie IJs", emoji: "\ud83e\udd67", description: "Butterscotch, geroosterde pecan en bourbon.", difficulty: "Gemiddeld", difficultyScore: 2, prepTime: "25 min", freezeTime: "24u", totalTime: "24u 25m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.8, popularity: 72, tags: [], diet: [], program: "Ice Cream", ingredients: [ "1 kopje zware room (236ml)", "\u00bd kopje volle melk (118ml)", "\u215c kopje basterdsuiker (75g)", "3 el bourbon", "1 tl vanille-extract", "\u00bd kopje pecannoten geroosterd (60g)" ], steps: [ "Verwarm melk en los suiker op.", "Voeg bourbon, room en vanille toe.", "Giet in pint, vries 24u.", "Verwerk op Ice Cream. Voeg pecans toe via MIX-IN." ], mixins: ["Extra pecans", "Karamel saus", "Shortbread stukjes", "Chocolade stukjes", "Caramel saus"], nutrition: { calories: 220, fat: "15g", carbs: "19g", protein: "2g" }, tips: "Rooster pecans 5 min op 180\u00b0C.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ic-carrot-cake", type: "ice_cream", name: "Carrot Cake IJs", emoji: "\ud83e\udd55", description: "Wortel, kaneel, ananas en roomkaas.", difficulty: "Gemiddeld", difficultyScore: 2, prepTime: "25 min", freezeTime: "24u", totalTime: "24u 25m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.6, popularity: 64, tags: [], diet: [], program: "Ice Cream", ingredients: [ "\u00be kopje zware room (178ml)", "\u00bc kopje roomkaas (58g)", "\u00bc kopje melk (60ml)", "\u2153 kopje suiker (66g)", "\u00bd kopje geraspte wortel (60g)", "1 tl kaneel", "\u00bd tl nootmuskaat", "\u00bc kopje ananas (40g)", "\u00bc kopje walnoten (30g)" ], steps: [ "Mix roomkaas met suiker glad.", "Voeg room, melk en specerijen toe.", "Roer wortel, ananas en walnoten erdoor.", "Giet in pint, vries 24u.", "Verwerk op Ice Cream." ], mixins: ["Cream cheese glazuur", "Walnoten", "Ananas stukjes", "Chocolade stukjes", "Caramel saus"], nutrition: { calories: 170, fat: "12g", carbs: "15g", protein: "2g" }, tips: "Knijp geraspte wortel uit om vocht te verwijderen.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ic-fig-honey", type: "ice_cream", name: "Vijg-Honing IJs", emoji: "\ud83c\udf3f", description: "Zoete vijgen, wilde honing en rozemarijn.", difficulty: "Gemiddeld", difficultyScore: 2, prepTime: "30 min", freezeTime: "24u", totalTime: "24u 30m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.6, popularity: 56, tags: [], diet: [], program: "Ice Cream", ingredients: [ "1 kopje zware room (236ml)", "\u00bd kopje volle melk (118ml)", "\u00bc kopje honing (58g)", "\u00bd kopje verse vijgen (75g)", "1 tl rozemarijn fijngehakt", "1 tl vanille-extract" ], steps: [ "Verhit melk en laat rozemarijn 10 min trekken. Zeef.", "Mix met room, honing en vanille.", "Voeg vijgen toe.", "Giet in pint, vries 24u.", "Verwerk op Ice Cream." ], mixins: ["Gehakte vijgen", "Honey-amandel clusters", "Pistaches", "Chocolade stukjes", "Caramel saus"], nutrition: { calories: 160, fat: "10g", carbs: "16g", protein: "2g" }, tips: "Gedroogde vijgen werken ook prima.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ic-white-choc-macadamia", type: "ice_cream", name: "Witte Choc-Macadamia IJs", emoji: "\ud83e\udd0d", description: "Romige witte chocolade met knapperige macadamia.", difficulty: "Beginner", difficultyScore: 1, prepTime: "15 min", freezeTime: "24u", totalTime: "24u 15m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.7, popularity: 74, tags: ["beginner"], diet: ["gluten_free"], program: "Ice Cream", ingredients: [ "1 kopje zware room (236ml)", "\u00bd kopje melk (118ml)", "\u2153 kopje suiker (66g)", "\u215c kopje witte chocolade gesmolten (65g)", "1 tl vanille-extract", "\u00bc kopje macadamia (35g)" ], steps: [ "Verwarm melk en los witte chocolade op.", "Mix met room en vanille.", "Giet in pint, vries 24u.", "Verwerk op Ice Cream. Voeg macadamia toe via MIX-IN." ], mixins: ["Extra witte chocolade", "Kokos vlokken", "Verse bessen", "Chocolade stukjes", "Caramel saus"], nutrition: { calories: 210, fat: "15g", carbs: "17g", protein: "2g" }, tips: "Gebruik echte witte chocolade met cacaoboter.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ic-gingerbread", type: "ice_cream", name: "Gingerbread IJs", emoji: "\ud83e\udeda", description: "Peperkoek \u2014 kaneel, gember, nootmuskaat en molasses.", difficulty: "Beginner", difficultyScore: 1, prepTime: "15 min", freezeTime: "24u", totalTime: "24u 15m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.6, popularity: 67, tags: ["beginner"], diet: [], program: "Ice Cream", ingredients: [ "1 kopje zware room (236ml)", "\u00bd kopje melk (118ml)", "\u00bc kopje suiker (50g)", "\u215b kopje molasses (30ml)", "2 tl kaneel", "1 tl gemberpoeder", "\u00bd tl nootmuskaat", "1 tl vanille-extract" ], steps: [ "Mix alle ingredi\u00ebnten.", "Giet in pint, vries 24u.", "Verwerk op Ice Cream." ], mixins: ["Speculaas stukjes", "Candied gember", "Witte chocolade", "Chocolade stukjes", "Caramel saus"], nutrition: { calories: 150, fat: "10g", carbs: "15g", protein: "2g" }, tips: "Molasses geeft diepe complexe zoetheid.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ic-capuccino", type: "ice_cream", name: "Cappuccino IJs", emoji: "\u2615", description: "Italiaanse koffie iJs met romige textuur.", difficulty: "Beginner", difficultyScore: 1, prepTime: "15 min", freezeTime: "24u", totalTime: "24u 15m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.6, popularity: 73, tags: ["beginner"], diet: ["gluten_free"], program: "Ice Cream", ingredients: [ "1 kopje zware room (236ml)", "\u00bd kopje melk (118ml)", "\u2153 kopje suiker (66g)", "3 el espresso (8g)", "1 tl vanille-extract" ], steps: [ "Los koffie op in warme melk.", "Mix met room, suiker en vanille.", "Giet in pint, vries 24u.", "Verwerk op Ice Cream." ], mixins: ["Chocolade stukjes", "Biscotti", "Espresso bonen", "Caramel saus", "Gehakte noten"], nutrition: { calories: 150, fat: "10g", carbs: "13g", protein: "2g" }, tips: "Voor extra kick: voeg 1 el Baileys toe.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ic-banana-nut", type: "ice_cream", name: "Banaan-Noten IJs", emoji: "\ud83c\udf4c", description: "Romige banaan met geroosterde walnoten en kaneel.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.6, popularity: 70, tags: ["beginner"], diet: [], program: "Ice Cream", ingredients: [ "1 kopje zware room (236ml)", "\u00bd kopje melk (118ml)", "2 rijpe bananen geprakt (120g)", "\u00bc kopje suiker (33g)", "1 tl kaneel", "1 tl vanille-extract", "\u00bc kopje walnoten (30g)" ], steps: [ "Prak bananen glad.", "Mix met room, melk, suiker en kaneel.", "Giet in pint, vries 24u.", "Verwerk op Ice Cream. Voeg walnoten toe via MIX-IN." ], mixins: ["Pecan noten", "Honig drizzle", "Chocolade stukjes", "Caramel saus", "Gehakte noten"], nutrition: { calories: 155, fat: "10g", carbs: "15g", protein: "2g" }, tips: "Rijpere bananen = zoeter en intenser.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ic-stracciatella", type: "gelato", name: "Stracciatella Gelato", emoji: "\ud83c\udf6b", description: "Romige vanille gelato met fijne chocolade vlokken.", difficulty: "Beginner", difficultyScore: 1, prepTime: "15 min", freezeTime: "24u", totalTime: "24u 15m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.8, popularity: 82, tags: ["beginner"], diet: ["gluten_free"], program: "Gelato", ingredients: [ "1 kopje volle melk (236ml)", "\u00bd kopje zware room (118ml)", "\u2153 kopje suiker (66g)", "1 vanillestokje", "\u00bc kopje donkere chocolade gesmolten (42g)" ], steps: [ "Verhit melk en room met vanille.", "Roer suiker erdoor.", "Laat afkoelen, giet in pint, vries 24u.", "Verwerk op Gelato.", "Drizzle gesmolten chocolade tijdens RE-SPIN." ], mixins: ["Chocolade vlokken", "Hazelnoten", "Espresso", "Pistaches", "Amaretti stukjes"], nutrition: { calories: 170, fat: "10g", carbs: "18g", protein: "2g" }, tips: "Voeg koude chocolade toe TIJDENS het spoelen voor stracciatella effect.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "gl-coffee-caramel", type: "gelato", name: "Koffie-Karamel Gelato", emoji: "\u2615", description: "Espresso gelato met karamel swirl.", difficulty: "Gemiddeld", difficultyScore: 2, prepTime: "20 min", freezeTime: "24u", totalTime: "24u 20m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.7, popularity: 75, tags: [], diet: [], program: "Gelato", ingredients: [ "1 kopje volle melk (236ml)", "\u00bd kopje zware room (118ml)", "\u2153 kopje suiker (66g)", "2 el espresso (15ml)", "3 el karamelsaus (22ml)", "1 tl vanille-extract" ], steps: [ "Verhit melk en los suiker op.", "Voeg espresso en room toe.", "Giet in pint, vries 24u.", "Verwerk op Gelato. Voeg karamel toe via MIX-IN." ], mixins: ["Karamel stukjes", "Chocolade bonen", "Shortbread", "Pistaches", "Amaretti stukjes"], nutrition: { calories: 155, fat: "8g", carbs: "19g", protein: "2g" }, tips: "Voor intensere smaak: 3 el espresso.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "so-coconut-lime", type: "sorbet", name: "Kokos-Lime Sorbet", emoji: "\ud83e\udd65", description: "Tropische kokos met pittige lime \u2014 zuivelvrij.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.6, popularity: 68, tags: ["beginner", "vegan", "dairy_free", "gluten_free"], diet: ["vegan", "dairy_free", "gluten_free"], program: "Sorbet", ingredients: [ "\u00bd blik kokosmelk (200ml)", "\u00bc kopje water (60ml)", "\u00bc kopje suiker (33g)", "3 el limoensap (22ml)", "1 tl lime zeste" ], steps: [ "Mix alles glad.", "Giet in pint, vries 24u.", "Verwerk op Sorbet." ], mixins: ["Kokosvlokken", "Verse munt", "Chili zout", "Chili vlokken", "Lime zeste"], nutrition: { calories: 110, fat: "6g", carbs: "14g", protein: "1g" }, tips: "Kokosmelk vet maakt deze sorbet extra romig.", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, { id: "so-raspberry-rose", type: "sorbet", name: "Framboos-Roos Sorbet", emoji: "\ud83c\udf39", description: "Romantische framboos met rozenwater.", difficulty: "Beginner", difficultyScore: 1, prepTime: "15 min", freezeTime: "24u", totalTime: "24u 15m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.7, popularity: 66, tags: ["beginner", "vegan", "dairy_free", "gluten_free"], diet: ["vegan", "dairy_free", "gluten_free"], program: "Sorbet", ingredients: [ "1 kopje frambozen (150g)", "\u215c kopje suiker (75g)", "\u00bc kopje water (60ml)", "1 tl rozenwater", "1 el citroensap" ], steps: [ "Maak siroop van water en suiker.", "Pureer frambozen en zeef.", "Mix met siroop en rozenwater.", "Giet in pint, vries 24u.", "Verwerk op Sorbet." ], mixins: ["Verse frambozen", "Eetbare bloemblaadjes", "Witte chocolade", "Verse munt", "Chili vlokken"], nutrition: { calories: 70, fat: "0g", carbs: "17g", protein: "0g" }, tips: "Rozenwater is sterk \u2014 1 tl is genoeg.", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, { id: "so-pomegranate", type: "sorbet", name: "Granaatappel Sorbet", emoji: "\ud83d\udd34", description: "Tart en zoet \u2014 diep robijnrood.", difficulty: "Beginner", difficultyScore: 1, prepTime: "15 min", freezeTime: "24u", totalTime: "24u 15m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.5, popularity: 58, tags: ["beginner", "vegan", "dairy_free", "gluten_free"], diet: ["vegan", "dairy_free", "gluten_free"], program: "Sorbet", ingredients: [ "1 kopje granaatappelsap (236ml)", "\u2153 kopje suiker (66g)", "\u215b kopje water (30ml)", "2 el citroensap", "1 el honing" ], steps: [ "Maak siroop. Mix met sap en citroen.", "Giet in pint, vries 24u.", "Verwerk op Sorbet." ], mixins: ["Granaatappel pitjes", "Verse munt", "Donkere chocolade", "Chili vlokken", "Lime zeste"], nutrition: { calories: 80, fat: "0g", carbs: "20g", protein: "0g" }, tips: "100% granaatappelsap geeft beste smaak.", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, { id: "ss-strawberry-cream", type: "soft_serve", name: "Aardbei-Cr\u00e8me Soft Serve", emoji: "\ud83c\udf53", description: "Klassieke zomerdag soft serve met echte aardbeien.", difficulty: "Beginner", difficultyScore: 1, prepTime: "15 min", freezeTime: "24u", totalTime: "24u 15m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.8, popularity: 84, tags: ["beginner"], diet: [], program: "Soft Serve", ingredients: [ "1 kopje zware room (236ml)", "\u00bd kopje melk (118ml)", "\u2153 kopje suiker (66g)", "\u00bd kopje aardbeien geblend (100g)", "1 tl vanille-extract" ], steps: [ "Blend aardbeien.", "Mix met room, melk en suiker.", "Giet in pint met nozzle, vries 24u.", "Verwerk op Soft Serve." ], mixins: ["Verse aardbeien", "Chocolade saus", "Sprinkles", "Gehakte noten", "Caramel spiraal"], nutrition: { calories: 160, fat: "11g", carbs: "14g", protein: "2g" }, tips: "Rijpe of bevroren aardbeien werken prima.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ss-mint-choc", type: "soft_serve", name: "Munt-Chocolade Soft Serve", emoji: "\ud83c\udf3f", description: "Verfrissende munt met chocolade stukjes.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.7, popularity: 77, tags: ["beginner"], diet: [], program: "Soft Serve", ingredients: [ "1 kopje zware room (236ml)", "\u00bd kopje melk (118ml)", "\u2153 kopje suiker (66g)", "1\u00bd tl pepermunt extract", "\u00bc kopje chocolade chips (42g)" ], steps: [ "Mix room, melk, suiker en pepermunt.", "Giet in pint met nozzle, vries 24u.", "Verwerk op Soft Serve. Voeg chocolade toe via MIX-IN." ], mixins: ["Extra chocolade", "Brownie stukjes", "Oreo kruimels", "Chocolade saus", "Gehakte noten"], nutrition: { calories: 165, fat: "11g", carbs: "15g", protein: "2g" }, tips: "Pepermunt extract is sterk! Begin met 1 tl.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "fy-lemon-curd", type: "frozen_yogurt", name: "Citroen-Curd Frozen Yogurt", emoji: "\ud83c\udf4b", description: "Frisse citroen met rijke lemon curd.", difficulty: "Beginner", difficultyScore: 1, prepTime: "15 min", freezeTime: "24u", totalTime: "24u 15m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.6, popularity: 65, tags: ["beginner"], diet: [], program: "Frozen Yogurt", ingredients: [ "1 pint Griekse yoghurt (236ml)", "\u00bc kopje lemon curd (58g)", "3 el suiker (22g)", "2 el citroensap", "1 tl citroen zeste" ], steps: [ "Mix yoghurt met lemon curd.", "Voeg suiker, citroen en zeste toe.", "Giet in pint, vries 24u.", "Verwerk op Frozen Yogurt." ], mixins: ["Shortbread stukjes", "Verse bessen", "Meringue stukjes", "Granola", "Chia zaad"], nutrition: { calories: 95, fat: "2g", carbs: "14g", protein: "4g" }, tips: "Lemon curd is te koop in potten.", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, { id: "fy-peach-cobbler", type: "frozen_yogurt", name: "Perzik-Cobbler Frozen Yogurt", emoji: "\ud83c\udf51", description: "Zomerse perzik met kaneel en vanille.", difficulty: "Beginner", difficultyScore: 1, prepTime: "15 min", freezeTime: "24u", totalTime: "24u 15m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.6, popularity: 63, tags: ["beginner"], diet: [], program: "Frozen Yogurt", ingredients: [ "1 pint Griekse yoghurt (236ml)", "\u00bd kopje perziken (75g)", "\u00bc kopje suiker (33g)", "1 tl kaneel", "1 tl vanille-extract" ], steps: [ "Pureer perziken.", "Mix met yoghurt, suiker en kaneel.", "Giet in pint, vries 24u.", "Verwerk op Frozen Yogurt." ], mixins: ["Cobbler topping", "Pecan noten", "Honing drizzle", "Granola", "Verse bessen"], nutrition: { calories: 85, fat: "2g", carbs: "13g", protein: "4g" }, tips: "Rijpe perziken zijn essentieel.", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, { id: "fw-mango-pineapple", type: "fruiti", name: "Mango-Ananas Whip", emoji: "\ud83e\udd6d", description: "Tropische Dole Whip stijl \u2014 puur fruit.", difficulty: "Beginner", difficultyScore: 1, prepTime: "5 min", freezeTime: "24u", totalTime: "24u 5m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.8, popularity: 82, tags: ["beginner", "vegan", "dairy_free", "gluten_free"], diet: ["vegan", "dairy_free", "gluten_free"], program: "Fruiti", ingredients: [ "\u00be kopje mango bevroren (112g)", "\u00be kopje ananas bevroren (112g)", "2 el suiker", "1 el limoensap" ], steps: [ "Blend alles glad.", "Giet in pint, vries 24u.", "Verwerk op \"Fruiti\"." ], mixins: ["Kokosvlokken", "Verse mango", "Chili zout", "Verse munt", "Vers fruit"], nutrition: { calories: 50, fat: "0g", carbs: "12g", protein: "0g" }, tips: "Dit is de beroemde Dole Whip smaak!", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, { id: "fw-strawberry-banana", type: "fruiti", name: "Aardbei-Banaan Whip", emoji: "\ud83c\udf53", description: "Klassieke fruit combo als luchtige soft serve.", difficulty: "Beginner", difficultyScore: 1, prepTime: "5 min", freezeTime: "24u", totalTime: "24u 5m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.6, popularity: 73, tags: ["beginner", "vegan", "dairy_free", "gluten_free"], diet: ["vegan", "dairy_free", "gluten_free"], program: "Fruiti", ingredients: [ "1 kopje aardbeien bevroren (150g)", "1 banaan bevroren (60g)", "2 el suiker", "1 el citroensap" ], steps: [ "Blend alles glad.", "Giet in pint, vries 24u.", "Verwerk op \"Fruiti\"." ], mixins: ["Verse bessen", "Granola", "Honing drizzle", "Verse munt", "Vers fruit"], nutrition: { calories: 45, fat: "0g", carbs: "11g", protein: "0g" }, tips: "Bevroren fruit is de sleutel.", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, { id: "sb-berry-granola", type: "fruiti", name: "Bessen-Granola Fruiti", emoji: "\ud83e\uded0", description: "Gezond ontbijt \u2014 romige bessen met knapperige granola.", difficulty: "Beginner", difficultyScore: 1, prepTime: "5 min", freezeTime: "24u", totalTime: "24u 5m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.5, popularity: 62, tags: ["beginner"], diet: [], program: "Fruiti", ingredients: [ "1 banaan bevroren", "1 kopje bessen bevroren (150g)", "\u00bd kopje Griekse yoghurt (115g)", "\u00bc kopje amandelmelk (60ml)", "1 el honing", "\u2153 kopje granola" ], steps: [ "Blend tot dik.", "Giet in pint, vries 24u.", "Verwerk op \"Fruiti\".", "Garneer met granola." ], mixins: ["Granola", "Chia zaad", "Verse bessen", "Kokos", "Verse munt"], nutrition: { calories: 250, fat: "5g", carbs: "42g", protein: "8g" }, tips: "De smoothie moet dik zijn.", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, { id: "hp-chocolate-peanut", type: "lite_ice_cream", name: "Chocolade-Pinda Protein IJs", emoji: "\ud83d\udcaa", description: "Klassieke choc-pinda combo met 28g eiwit.", difficulty: "Beginner", difficultyScore: 1, prepTime: "5 min", freezeTime: "24u", totalTime: "24u 5m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.7, popularity: 72, tags: ["beginner"], diet: [], program: "Lite Ice Cream", ingredients: [ "1\u00be kopje chocolade eiwitschuddishek (415ml)", "2 el pindakaas", "1 el cacaopoeder", "1 el chia zaad" ], steps: [ "Mix alles glad.", "Giet in pint, vries 24u.", "Verwerk op \"Lite Ice Cream\"." ], mixins: ["Gehakte pinda's", "Chocolade stukjes", "Banaan", "Vers fruit", "Granola"], nutrition: { calories: 250, fat: "12g", carbs: "12g", protein: "28g" }, tips: "Goede eiwitshake met 25g+ eiwit per fles.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "df-chocolate-avocado", type: "ice_cream", name: "Chocolade-Avocado Vegan IJs", emoji: "\ud83e\udd51", description: "Romige vegan chocolade \u2014 avocado maakt zijdezacht.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.6, popularity: 65, tags: ["beginner", "vegan", "dairy_free"], diet: ["vegan", "dairy_free"], program: "Ice Cream", ingredients: [ "\u00bd blik kokosmelk (200ml)", "1 rijpe avocado", "\u00bc kopje cacaopoeder (16g)", "\u00bc kopje suiker (33g)", "1 tl vanille-extract" ], steps: [ "Blend alles glad.", "Giet in pint, vries 24u.", "Verwerk op Ice Cream." ], mixins: ["Vegan chocolade", "Kokos vlokken", "Hazelnoten", "Chocolade stukjes", "Caramel saus"], nutrition: { calories: 140, fat: "9g", carbs: "14g", protein: "2g" }, tips: "Avocado proef je niet \u2014 alleen romigheid.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "df-coconut-mango", type: "ice_cream", name: "Kokos-Mango Vegan IJs", emoji: "\ud83e\udd6d", description: "Tropische droom \u2014 kokos met vers mango.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.7, popularity: 71, tags: ["beginner", "vegan", "dairy_free", "gluten_free"], diet: ["vegan", "dairy_free", "gluten_free"], program: "Ice Cream", ingredients: [ "\u00bd blik kokosmelk (200ml)", "\u00bd kopje mango puree (120g)", "\u00bc kopje suiker (33g)", "1 el citroensap", "1 tl vanille-extract" ], steps: [ "Blend alles glad.", "Giet in pint, vries 24u.", "Verwerk op Ice Cream." ], mixins: ["Verse mango", "Kokos vlokken", "Chili zout", "Chocolade stukjes", "Caramel saus"], nutrition: { calories: 125, fat: "7g", carbs: "16g", protein: "1g" }, tips: "Mango-kokos is een match made in heaven.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ms-salted-caramel", type: "milkshake", name: "Salted Caramel Milkshake", emoji: "\ud83e\udd64", description: "Romige milkshake met karamel en zeezout.", difficulty: "Beginner", difficultyScore: 1, prepTime: "5 min", freezeTime: "24u", totalTime: "24u 5m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.8, popularity: 78, tags: ["beginner"], diet: [], program: "Milkshake", ingredients: [ "1 kopje zware room (237ml)", "1 kopje melk (237ml)", "\u2153 kopje karamelsaus (115g)", "\u00bd tl zeezout", "2 el suiker", "1 tl vanille-extract" ], steps: [ "Mix alles.", "Giet in pint, vries 24u.", "Verwerk op Milkshake." ], mixins: ["Karamel saus", "Noten", "Chocolade saus", "Slagroom", "Cherry"], nutrition: { calories: 340, fat: "18g", carbs: "42g", protein: "5g" }, tips: "Serveer met slagroom en karamel drizzle.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ms-oreo", type: "milkshake", name: "Oreo Milkshake", emoji: "\ud83c\udf6a", description: "De ultieme cookies & cream milkshake.", difficulty: "Beginner", difficultyScore: 1, prepTime: "5 min", freezeTime: "24u", totalTime: "24u 5m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.9, popularity: 85, tags: ["beginner"], diet: [], program: "Milkshake", ingredients: [ "1 kopje zware room (237ml)", "1 kopje melk (237ml)", "\u2153 kopje suiker (66g)", "12 Oreo koekjes", "1 tl vanille-extract" ], steps: [ "Mix room, melk en suiker.", "Breek 8 Oreos en voeg toe.", "Giet in pint, vries 24u.", "Verwerk op Milkshake.", "Garneer met 4 fijngehakte Oreos." ], mixins: ["Extra Oreo kruimels", "Chocolade saus", "Slagroom", "Cherry", "Karamel drizzle"], nutrition: { calories: 380, fat: "20g", carbs: "45g", protein: "5g" }, tips: "Double Stuf Oreos = extra romig.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "ms-nutella", type: "milkshake", name: "Nutella Milkshake", emoji: "\ud83c\udf6b", description: "Chocolade-hazelnoot hemel in vloeibare vorm.", difficulty: "Beginner", difficultyScore: 1, prepTime: "5 min", freezeTime: "24u", totalTime: "24u 5m", servings: 1, pintInfo: "1 swirl pint (\u00b13 porties)", rating: 4.9, popularity: 83, tags: ["beginner"], diet: [], program: "Milkshake", ingredients: [ "1 kopje zware room (237ml)", "1 kopje melk (237ml)", "\u00bd kopje Nutella (140g)", "2 el suiker", "1 tl vanille-extract" ], steps: [ "Verwarm melk en los Nutella op.", "Mix met room en vanille.", "Giet in pint, vries 24u.", "Verwerk op Milkshake." ], mixins: ["Gehakte hazelnoten", "Chocolade saus", "Slagroom", "Cherry", "Karamel drizzle"], nutrition: { calories: 420, fat: "26g", carbs: "42g", protein: "7g" }, tips: "Warm Nutella op voor makkelijk mixen.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, // ===================== MilkshakeS ===================== { id: "fr-coffee-classic", type: "milkshake", name: "Classic Coffee Milkshake", emoji: "โ˜•", description: "De ultieme koffie milkshake โ€” romig, koud en vol van smaak. Geรฏnspireerd door Ninja Test Kitchen.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "50 min", totalTime: "55 min", servings: 4, rating: 4.9, popularity: 98, tags: ["beginner", "koffie", "popular"], diet: [], program: "Milkshake", ingredients: [ "1ยฝ kopjes half & half (355ml)", "3 kopjes zwarte koffie (afgekoeld)", "2 theelepels vanille-extract", "ยฝ kopje suiker (100g)", "Slagroom (optioneel)", "Chocoladesaus (optioneel)" ], steps: [ "Klop alle ingrediรซnten samen in een kan tot de suiker volledig is opgelost.", "Giet het mengsel in een Ninja Swirl pint tot 2,5 cm van de rand.", "Selecteer het Milkshake programma en druk op START.", "Zodra de machine 3x piept, direct serveren.", "Top af met slagroom en chocolade-/karamelsaus naar keuze." ], mixins: ["Chocoladesaus", "Karamelsaus", "Slagroom", "Cacao poeder", "Chocolade saus"], nutrition: { calories: 180, fat: "8g", carbs: "22g", protein: "2g" }, tips: "Voor dairy-free: vervang half & half door haver- of amandelmelk.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "fr-mocha", type: "milkshake", name: "Mocha Milkshake", emoji: "๐Ÿซ", description: "Espresso ontmoet chocolade in deze hemelse bevroren milkshake.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "50 min", totalTime: "55 min", servings: 4, rating: 4.8, popularity: 92, tags: ["beginner", "koffie", "chocolade"], diet: [], program: "Milkshake", ingredients: [ "1ยฝ kopjes half & half (355ml)", "2ยฝ kopjes zwarte koffie (afgekoeld)", "3 el cacaopoeder", "2 el gesmolten chocolade", "ยฝ kopje suiker (100g)", "1 tl vanille-extract" ], steps: [ "Mix koffie, cacaopoeder en suiker in een kom tot een glad mengsel.", "Voeg half & half, gesmolten chocolade en vanille toe.", "Giet in de vessel en selecteer Milkshake.", "Serveren zodra klaar. Top met slagroom en cacao." ], mixins: ["Chocoladesaus", "Slagroom", "Chocolade krullen", "Koffiebonen", "Chocolade saus"], nutrition: { calories: 210, fat: "9g", carbs: "28g", protein: "3g" }, tips: "Gebruik dark chocolate voor een intensere smaak.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "fr-caramel", type: "milkshake", name: "Caramel Milkshake", emoji: "๐Ÿฏ", description: "Boterzachte karamel verweven met koude koffie โ€” een koffiebarervaring thuis.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "50 min", totalTime: "1u", servings: 4, rating: 4.8, popularity: 88, tags: ["beginner", "koffie", "karamel"], diet: [], program: "Milkshake", ingredients: [ "1ยฝ kopjes half & half (355ml)", "3 kopjes zwarte koffie (afgekoeld)", "โ…“ kopje karamelsiroop", "2 el suiker", "1 tl vanille-extract" ], steps: [ "Klop koffie, karamelsiroop, suiker en vanille tot suiker is opgelost.", "Voeg half & half toe en roer goed.", "Giet in de vessel, selecteer Milkshake en start.", "Garneer met een draai karamelsaus en slagroom." ], mixins: ["Karamelsaus", "Slagroom", "Zeezout", "Pecannoten", "Chocolade saus"], nutrition: { calories: 220, fat: "8g", carbs: "30g", protein: "2g" }, tips: "Voeg een snufje zeezout toe voor een salted caramel variant.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, { id: "fr-pumpkin-spice", type: "milkshake", name: "Pumpkin Spice Milkshake", emoji: "๐ŸŽƒ", description: "Herfst in een glas โ€” pompoen, kaneel en koffie samengekomen in een frappรฉ.", difficulty: "Gemiddeld", difficultyScore: 2, prepTime: "15 min", freezeTime: "50 min", totalTime: "1u 5m", servings: 4, rating: 4.7, popularity: 75, tags: ["herfst", "koffie", "seizoensgebonden"], diet: [], program: "Milkshake", ingredients: [ "1ยฝ kopjes half & half (355ml)", "2ยฝ kopjes zwarte koffie (afgekoeld)", "3 el pompoenpuree", "2 el gecondenseerde melk", "1 tl pompoenkruiden", "2 el suiker" ], steps: [ "Mix pompoenpuree, gecondenseerde melk, kruiden en suiker tot glad.", "Voeg koffie en half & half toe. Goed roeren.", "Giet in de vessel en selecteer Milkshake.", "Garneer met slagroom en een snufje kaneel." ], mixins: ["Slagroom", "Kaneel", "Pecannoten", "Karamelsaus", "Chocolade saus"], nutrition: { calories: 195, fat: "8g", carbs: "25g", protein: "3g" }, tips: "Maak je eigen pompoenkruiden: 2 deel kaneel, 1 deel nootmuskaat, 1 deel gember, ยฝ deel kruidnagel.", pairings: ["so-mango", "so-pineapple", "so-raspberry"], }, // ===================== MOCKTAILS ===================== { id: "sl-pink-lemonade", type: "fruiti", name: "Pink Lemonade Fruiti", emoji: "๐Ÿฉท", description: "Zomerse klassieker โ€” zuur, zoet en heerlijk koud. Origineel Ninja Test Kitchen recept.", difficulty: "Beginner", difficultyScore: 1, prepTime: "5 min", freezeTime: "45 min", totalTime: "50 min", servings: 8, rating: 5.0, popularity: 95, tags: ["beginner", "zomer", "verfrissend", "popular"], diet: ["vegan", "dairy_free"], program: "Fruiti", ingredients: [ "5ยฝ kopjes water (1.3L)", "โ…” kopje + 4 tl pink lemonade poeder mix" ], steps: [ "Klop water en pink lemonade poiker samen tot poeder volledig is opgelost.", "Giet het mengsel in een Ninja Swirl pint tot 2,5 cm van de rand.", "Selecteer \"Fruiti\" en druk op START.", "Serveren zodra de machine 3x piept." ], mixins: ["Verse citroen partjes", "Munt", "Bessen", "Limoen", "Verse munt"], nutrition: { calories: 80, fat: "0g", carbs: "20g", protein: "0g" }, tips: "Voor een natuurlijke variant: vers citroensap, water en agavesiroop met cranberrysap.", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, { id: "sl-tropical-mango", type: "fruiti", name: "Tropical Mango Fruiti", emoji: "๐Ÿฅญ", description: "Alsof je op een tropisch eiland zit โ€” zoete mango gemixt met een vleugje limoen.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "45 min", totalTime: "55 min", servings: 4, rating: 4.8, popularity: 85, tags: ["beginner", "tropisch", "fruit"], diet: ["vegan", "dairy_free", "gluten_free"], program: "Fruiti", ingredients: [ "3 kopjes mango nectar (720ml)", "1 kopje water", "3 el limoensap", "2 el suiker (optioneel)", "Snufje zout" ], steps: [ "Mix alle ingrediรซnten in een kan tot suiker is opgelost.", "Giet in de vessel en selecteer \"Fruiti\".", "Serveren zodra klaar. Garneer met een partje limoen." ], mixins: ["Verse mango stukjes", "Limoen", "Chili poeder", "Munt", "Verse munt"], nutrition: { calories: 120, fat: "0g", carbs: "30g", protein: "1g" }, tips: "Voor een pittige twist: voeg Tajรญn of chili poeder toe aan de rand van het glas.", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, { id: "sl-strawberry-watermelon", type: "fruiti", name: "Strawberry Watermelon Fruiti", emoji: "๐Ÿ‰", description: "De ultieme zomerse verfrissing โ€” sappige watermeloen en zoete aardbeien.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "45 min", totalTime: "55 min", servings: 4, rating: 4.9, popularity: 90, tags: ["beginner", "zomer", "fruit", "verfrissend"], diet: ["vegan", "dairy_free", "gluten_free"], program: "Fruiti", ingredients: [ "4 kopjes watermeloen sap (960ml)", "1 kopje aardbeien (gepureerd)", "2 el limoensap", "2 el suiker of honing" ], steps: [ "Mix alle ingrediรซnten goed door elkaar.", "Giet in de vessel en selecteer \"Fruiti\".", "Serveren met een schijfje watermeloen en een aardbei." ], mixins: ["Verse munt", "Limoen", "Bessen", "Basilicum", "Vers fruit"], nutrition: { calories: 90, fat: "0g", carbs: "23g", protein: "1g" }, tips: "Gebruik zaadloze watermeloen voor een gladdere textuur.", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, { id: "sl-blue-raspberry", type: "fruiti", name: "Blue Raspberry Fruiti", emoji: "๐Ÿ”ต", description: "Elektrisch blauw, supervers โ€” een feestje in een glas.", difficulty: "Beginner", difficultyScore: 1, prepTime: "5 min", freezeTime: "45 min", totalTime: "50 min", servings: 6, rating: 4.6, popularity: 78, tags: ["feest", "kinderen", "kleurrijk"], diet: ["vegan", "dairy_free"], program: "Fruiti", ingredients: [ "5 kopjes water (1.2L)", "1 pakje blue raspberry drankpoeder", "3 el suiker", "1 el citroensap" ], steps: [ "Mix water, poeder, suiker en citroensap tot alles is opgelost.", "Giet in de vessel en selecteer \"Fruiti\".", "Serveren met een gekleurd rietje voor het feestelijke effect." ], mixins: ["Gummy beren", "Sprinkles", "Limoen", "Zure matten", "Verse munt"], nutrition: { calories: 70, fat: "0g", carbs: "18g", protein: "0g" }, tips: "Perfect voor kinderfeestjes. Voeg popping candy toe voor extra effect.", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, // ===================== MOCKTAILS ===================== { id: "mc-shirley-temple", type: "fruiti", name: "Frozen Shirley Temple", emoji: "๐Ÿ’", description: "De tijdloze klassieker โ€” bevroren en nog lekkerder. Gebaseerd op het recept uit de jaren '30.", difficulty: "Beginner", difficultyScore: 1, prepTime: "5 min", freezeTime: "40 min", totalTime: "45 min", servings: 2, rating: 4.9, popularity: 92, tags: ["beginner", "klassiek", "kinderen", "popular"], diet: ["vegan", "dairy_free", "gluten_free"], program: "Milkshake", ingredients: [ "1 kopje lemon-lime soda (Sprite/7-Up)", "1 kopje ijsblokjes", "2-3 el grenadinesiroop", "Scheutje vers limoensap (optioneel)", "Maraschinokerssen voor garnering" ], steps: [ "Combineer soda, grenadine en ijsblokjes in een blender.", "Blend tot een glad mengsel.", "Proef en pas aan met extra grenadine of limoensap.", "Giet in glazen, top met extra soda en garneer met een kers." ], mixins: ["Maraschinokerss", "Citroenpartje", "Sinaasappelschijf", "Munt", "Verse munt"], nutrition: { calories: 110, fat: "0g", carbs: "27g", protein: "0g" }, tips: "Voor een 'Dirty Shirley' cocktail: voeg 30-60ml wodka toe.", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, { id: "mc-virgin-mojito", type: "fruiti", name: "Virgin Mojito Sorbet", emoji: "๐ŸŒฟ", description: "Verfrissende munt en limoen โ€” Cubaanse sfeer zonder alcohol.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "40 min", totalTime: "50 min", servings: 2, rating: 4.7, popularity: 85, tags: ["beginner", "munt", "verfrissend", "zomer"], diet: ["vegan", "dairy_free", "gluten_free"], program: "Fruiti", ingredients: [ "20 muntbladeren (plus extra voor garnering)", "3 limoenen (sap en partjes)", "3 el suiker of agavesiroop", "2 kopjes soda water (480ml)", "2 kopjes ijsblokjes", "Snufje zout" ], steps: [ "Kneus muntbladeren en limoenpartjes met een pestel in een kan.", "Voeg suiker, soda water en ijsblokjes toe.", "Mix goed en giet in de vessel.", "Selecteer \"Fruiti\" en start.", "Garneer met een takje munt en een partje limoen." ], mixins: ["Munt", "Limoen", "Bessen", "Gemberbier", "Komkommer"], nutrition: { calories: 80, fat: "0g", carbs: "20g", protein: "0g" }, tips: "Kneus de munt zachtjes โ€” niet pureren, anders wordt het bitter.", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, { id: "mc-berry-basil-smash", type: "fruiti", name: "Berry Basil Smash", emoji: "๐Ÿ“", description: "Bloederige bessen ontmoeten verse basilicum โ€” complex, fruitig en verfijnd.", difficulty: "Gemiddeld", difficultyScore: 2, prepTime: "10 min", freezeTime: "40 min", totalTime: "50 min", servings: 2, rating: 4.8, popularity: 80, tags: ["berry", "kruidig", "elegant"], diet: ["vegan", "dairy_free", "gluten_free"], program: "Fruiti", ingredients: [ "1 kopje gemengde bessen (aardbeien, frambozen, bosbzen)", "10 basilicumblaadjes", "2 limoenen (sap)", "2 el honing of agavesiroop", "2 kopjes soda water (480ml)", "1 kopje ijsblokjes" ], steps: [ "Kneus bessen en basilicum in een kan met een pestel.", "Voeg limoensap, honing, soda water en ijs toe.", "Goed roeren en in de vessel gieten.", "Selecteer \"Fruiti\" en start.", "Garneer met een basilicumblaadje en enkele bessen." ], mixins: ["Bessen", "Basilicum", "Limoen", "Gember", "Rooswater"], nutrition: { calories: 95, fat: "0g", carbs: "24g", protein: "0g" }, tips: "Voor een feestelijke variant: voeg een scheutje alcoholvrije sparkelende wijn toe.", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, { id: "mc-pina-colada-mock", type: "fruiti", name: "Virgin Piรฑa Colada Sorbet", emoji: "๐Ÿฅฅ", description: "Caribische vibe zonder alcohol โ€” romige kokos en zoete ananas.", difficulty: "Beginner", difficultyScore: 1, prepTime: "5 min", freezeTime: "50 min", totalTime: "55 min", servings: 4, rating: 4.9, popularity: 88, tags: ["beginner", "tropisch", "ananas", "kokos"], diet: ["vegan", "dairy_free", "gluten_free"], program: "Fruiti", ingredients: [ "3 kopjes ananassap (720ml)", "1 kopje kokosmelk (licht)", "2 el kokoscreme", "2 el suiker of agavesiroop", "1 tl vanille-extract", "Snufje zout" ], steps: [ "Mix ananassap, kokosmelk, kokoscreme, suiker, vanille en zout goed door.", "Giet in de vessel en selecteer \"Fruiti\".", "Serveren met een ananaspartje en een maraschinokerss." ], mixins: ["Ananas stukjes", "Geraspte kokos", "Maraschinokerss", "Limoen", "Verse munt"], nutrition: { calories: 140, fat: "5g", carbs: "22g", protein: "1g" }, tips: "Gebruik volle kokosmelk voor een romigere textuur.", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, { id: "mc-sunrise-orange", type: "fruiti", name: "Frozen Orange Sunrise", emoji: "๐ŸŒ…", description: "Een prachtige gradient van sinaasappel en grenadine โ€” smaakt als een zonsopgang.", difficulty: "Beginner", difficultyScore: 1, prepTime: "5 min", freezeTime: "40 min", totalTime: "45 min", servings: 2, rating: 4.6, popularity: 72, tags: ["beginner", "zomer", "kleurrijk"], diet: ["vegan", "dairy_free", "gluten_free"], program: "Fruiti", ingredients: [ "2 kopjes sinaasappelsap (480ml)", "1 kopje ananassap", "1 el citroensap", "3 el grenadinesiroop", "2 kopjes ijsblokjes" ], steps: [ "Mix sinaasappelsap, ananassap en citroensap in een kan.", "Giet in de vessel en selecteer \"Fruiti\".", "Bij het serveren: giet langzaam grenadine langs de zijkant voor een sunset-effect.", "Garneer met een sinaasappelschijf." ], mixins: ["Sinaasappel", "Grenadine", "Munt", "Bessen", "Verse munt"], nutrition: { calories: 130, fat: "0g", carbs: "32g", protein: "1g" }, tips: "Voor het beste gradient-effect: gebruik de achterkant van een lepel bij het gieten van de grenadine.", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, { id: "mc-cucumber-mint-cooler", type: "fruiti", name: "Cucumber Mint Cooler", emoji: "๐Ÿฅ’", description: "Ultra-verfrissend โ€” koele komkommer, munt en een vleugje limoen. Spa-dag thuis.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "40 min", totalTime: "50 min", servings: 2, rating: 4.5, popularity: 68, tags: ["verfrissend", "light", "zomer"], diet: ["vegan", "dairy_free", "gluten_free", "low_sugar"], program: "Fruiti", ingredients: [ "1 komkommer (geschild en in stukjes)", "15 muntblaadjes", "2 limoenen (sap)", "1 el agavesiroop", "2 kopjes soda water (480ml)", "1 kopje ijsblokjes" ], steps: [ "Pureer komkommer met munt en limoensap in een blender.", "Zeef het mengsel door een fijne zeef.", "Voeg agavesiroop, soda water en ijs toe.", "Giet in de vessel en selecteer \"Fruiti\".", "Garneer met een komkommerlint en munt." ], mixins: ["Komkommer", "Munt", "Limoen", "Basilicum", "Verse munt"], nutrition: { calories: 45, fat: "0g", carbs: "11g", protein: "1g" }, tips: "Maak komkommerlinten met een dunschiller voor een elegante garnering.", pairings: ["ic-vanilla", "ic-chocolate", "ic-strawberry"], }, // ============================================================ // COCKTAIL SORBETS & GELATO โ€” Cocktail-inspiratie als lepelbaar iJs // Let op: alcohol verlaagt het vriespunt. Max 2-3 el alcohol per pint. // ============================================================ { id: "fc-margarita", type: "sorbet", name: "Margarita Sorbet", emoji: "๐Ÿธ", description: "Een verfrissende sorbet van tequila, limoen en zout. De klassieke Mexicaanse cocktail als lepelbaar iJs.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 2, pintInfo: "1 swirl pint (ยฑ3 porties)", rating: 4.8, popularity: 88, tags: ["cocktail", "alcohol", "feestelijk", "sorbet"], diet: ["gluten_free", "cocktail"], program: "Sorbet", ingredients: [ "200ml water", "80g suiker", "60ml vers limoensap", "2 el tequila (blanco)", "1 el triple sec (Cointreau)", "Snufje zout" ], steps: [ "Verwarm water en suiker tot de suiker oplost. Laat afkoelen.", "Mix de siroop met limoensap, tequila, triple sec en zout.", "Giet in een Ninja Swirl pint tot 2,5 cm van de rand.", "Plaats de deksel en vries minimaal 24 uur.", "Plaats in de outer bowl, selecteer \"Sorbet\" en START.", "RE-SPIN indien nodig met 1 el water." ], mixins: ["Limoenpartjes", "Chili zout", "Tamarinde pasta", "Jalapeรฑo plakjes", "Zeezout vlokken"], nutrition: { calories: 120, fat: "0g", carbs: "24g", protein: "0g" }, tips: "Alcohol verlaagt het vriespunt โ€” maximaal 2-3 el alcohol per pint voor een goede textuur. Blanco tequila geeft de zuiverste smaak.", pairings: ["fc-strawberry-daiquiri", "fc-paloma", "so-mango"] }, { id: "fc-strawberry-daiquiri", type: "sorbet", name: "Strawberry Daiquiri Sorbet", emoji: "๐Ÿ“", description: "Een fruitige sorbet van aardbeien, rum en limoen. Zomerse cocktail-smaak als lepelbaar iJs.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 2, pintInfo: "1 swirl pint (ยฑ3 porties)", rating: 4.9, popularity: 90, tags: ["cocktail", "alcohol", "aardbei", "zomer", "sorbet"], diet: ["gluten_free", "cocktail"], program: "Sorbet", ingredients: [ "1 kopje verse aardbeien (150g)", "150ml water", "70g suiker", "40ml vers limoensap", "2 el witte rum" ], steps: [ "Pureer de aardbeien met limoensap tot een gladde massa.", "Verwarm water en suiker tot siroop, laat afkoelen.", "Mix de siroop met het aardbeienpuree en rum.", "Giet in een Ninja Swirl pint tot 2,5 cm van de rand.", "Plaats de deksel en vries minimaal 24 uur.", "Plaats in de outer bowl, selecteer \"Sorbet\" en START." ], mixins: ["Verse aardbeien", "Basilicum", "Limoenzeste", "Chili vlokken", "Munt"], nutrition: { calories: 130, fat: "0g", carbs: "26g", protein: "0g" }, tips: "Bevroren aardbeien werken ook โ€” laat dan wat water achterwege. Alcohol verlaagt het vriespunt: max 2-3 el per pint.", pairings: ["fc-margarita", "so-raspberry", "ic-strawberry"] }, { id: "fc-pina-colada", type: "sorbet", name: "Piรฑa Colada Sorbet", emoji: "๐ŸŒด", description: "Tropische sorbet van ananas, kokos en een vleugje rum. Caribische vibe als lepelbaar iJs.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 2, pintInfo: "1 swirl pint (ยฑ3 porties)", rating: 4.8, popularity: 87, tags: ["cocktail", "alcohol", "tropisch", "kokos", "sorbet"], diet: ["gluten_free", "dairy_free", "cocktail"], program: "Sorbet", ingredients: [ "200ml ananassap", "100ml kokosmelk (licht)", "60g suiker", "2 el witte rum", "1 el vers limoensap" ], steps: [ "Mix ananassap, kokosmelk, suiker, rum en limoensap tot de suiker oplost.", "Giet in een Ninja Swirl pint tot 2,5 cm van de rand.", "Plaats de deksel en vries minimaal 24 uur.", "Plaats in de outer bowl, selecteer \"Sorbet\" en START.", "RE-SPIN indien nodig." ], mixins: ["Ananas stukjes", "Geroosterde kokos", "Maraschino kers", "Macaadamia noten", "Munt"], nutrition: { calories: 160, fat: "3g", carbs: "28g", protein: "0g" }, tips: "Kokosmelk geeft een heerlijke romige textuur zonder zuivel. Max 2-3 el alcohol per pint.", pairings: ["fc-mojito", "so-pineapple", "fc-bahama-mama"] }, { id: "fc-mojito", type: "sorbet", name: "Mojito Sorbet", emoji: "๐Ÿƒ", description: "Verfrissende munt-limoen sorbet met een vleugje rum. Cubaanse verfrissing als iJs.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 2, pintInfo: "1 swirl pint (ยฑ3 porties)", rating: 4.7, popularity: 85, tags: ["cocktail", "alcohol", "munt", "verfrissend", "sorbet"], diet: ["gluten_free", "dairy_free", "cocktail"], program: "Sorbet", ingredients: [ "200ml water", "70g suiker", "20 verse muntblaadjes", "40ml vers limoensap", "2 el witte rum" ], steps: [ "Verwarm water en suiker tot siroop. Voeg muntblaadjes toe en laat 10 minuten trekken.", "Zeef de siroop en laat afkoelen.", "Mix met limoensap en rum.", "Giet in een Ninja Swirl pint tot 2,5 cm van de rand.", "Plaats de deksel en vries minimaal 24 uur.", "Plaats in de outer bowl, selecteer \"Sorbet\" en START." ], mixins: ["Verse munt", "Limoenpartjes", "Basilicum", "Gember siroop", "Komkommer"], nutrition: { calories: 110, fat: "0g", carbs: "22g", protein: "0g" }, tips: "Bruiseer de munt niet te hard in de siroop โ€” anders wordt het bitter. Alcohol verlaagt het vriespunt: max 2-3 el per pint.", pairings: ["fc-pina-colada", "so-watermelon", "fc-margarita"] }, { id: "fc-aperol-spritz", type: "sorbet", name: "Aperol Spritz Sorbet", emoji: "๐ŸŸ ", description: "Bitterzoete sorbet van Aperol en Prosecco. Italiaanse aperitivo als lepelbaar iJs.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 2, pintInfo: "1 swirl pint (ยฑ3 porties)", rating: 4.6, popularity: 82, tags: ["cocktail", "alcohol", "bitter", "italiaans", "sorbet"], diet: ["gluten_free", "cocktail"], program: "Sorbet", ingredients: [ "150ml water", "70g suiker", "2 el Aperol", "1 el Prosecco", "1 el vers sinaasappelsap", "Sinaasappelschil" ], steps: [ "Verwarm water en suiker tot siroop. Laat afkoelen.", "Mix siroop met Aperol, Prosecco en sinaasappelsap.", "Giet in een Ninja Swirl pint tot 2,5 cm van de rand.", "Plaats de deksel en vries minimaal 24 uur.", "Plaats in de outer bowl, selecteer \"Sorbet\" en START." ], mixins: ["Sinaasappel partjes", "Rosemary", "Basilicum zaadjes", "Grapefruit", "Eetbare bloemblaadjes"], nutrition: { calories: 110, fat: "0g", carbs: "24g", protein: "0g" }, tips: "Prosecco verliest bubbels bij vriezen โ€” voeg een splash toe bij het serveren. Max 2-3 el alcohol per pint.", pairings: ["fc-negroni", "fw-prosecco-sorbet", "so-aperol-spritz"] }, { id: "fc-negroni", type: "sorbet", name: "Negroni Sorbet", emoji: "๐Ÿ”ด", description: "Bitterzoete sorbet van gin, Campari en vermouth. Een volwassen dessert voor de liefhebber.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 2, pintInfo: "1 swirl pint (ยฑ3 porties)", rating: 4.5, popularity: 78, tags: ["cocktail", "alcohol", "bitter", "klassiek", "sorbet"], diet: ["gluten_free", "cocktail"], program: "Sorbet", ingredients: [ "150ml water", "60g suiker", "1 el gin", "1 el Campari", "1 el zoete vermouth", "Sinaasappelschil" ], steps: [ "Verwarm water en suiker tot siroop. Laat afkoelen.", "Mix met gin, Campari, vermouth en een sinaasappelschil.", "Giet in een Ninja Swirl pint tot 2,5 cm van de rand.", "Plaats de deksel en vries minimaal 24 uur.", "Plaats in de outer bowl, selecteer \"Sorbet\" en START." ], mixins: ["Sinaasappel partjes", "Grapefruit", "Rosemary", "Jeneverbessen", "Angostura bitters"], nutrition: { calories: 120, fat: "0g", carbs: "22g", protein: "0g" }, tips: "Equal-parts verhouding geeft de meest uitgesproken smaak. Alcohol verlaagt het vriespunt aanzienlijk โ€” max 2-3 el per pint.", pairings: ["fc-aperol-spritz", "fc-margarita", "so-rose-wine"] }, { id: "fc-espresso-martini", type: "gelato", name: "Espresso Martini Gelato", emoji: "โ˜•", description: "Dichte, romige gelato van espresso, vodka en koffielikeur. Een elegant koffiedessert.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 2, pintInfo: "1 swirl pint (ยฑ3 porties)", rating: 4.8, popularity: 86, tags: ["cocktail", "alcohol", "koffie", "elegant", "gelato"], diet: ["gluten_free", "cocktail"], program: "Gelato", ingredients: [ "1 kopje volle melk (236ml)", "80ml zware room", "60g suiker", "1 shot verse espresso (30ml), afgekoeld", "1 el vodka", "1 el koffielikeur (Kahlua)", "Snufje zout" ], steps: [ "Zet een verse espresso en laat afkoelen.", "Mix melk, room, suiker, espresso, vodka, koffielikeur en zout tot de suiker oplost.", "Giet in een Ninja Swirl pint tot 2,5 cm van de rand.", "Plaats de deksel en vries minimaal 24 uur.", "Plaats in de outer bowl, selecteer \"Gelato\" en START.", "RE-SPIN met 1 el melk indien nodig." ], mixins: ["Koffiebonen", "Chocolade krullen", "Cacao nibs", "Vanille extract", "Espresso poeder"], nutrition: { calories: 160, fat: "6g", carbs: "18g", protein: "2g" }, tips: "Gebruik sterke espresso voor de beste smaak. Het Gelato programma geeft een dichte, zijdeachtige textuur. Max 2-3 el alcohol per pint.", pairings: ["fc-mudslide", "ms-coffee", "ic-tiramisu"] }, { id: "fc-cosmopolitan", type: "sorbet", name: "Cosmopolitan Sorbet", emoji: "๐ŸŒธ", description: "Fruitige sorbet van cranberry, vodka en citrus. Een stylish en verfrissend iJs.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 2, pintInfo: "1 swirl pint (ยฑ3 porties)", rating: 4.6, popularity: 80, tags: ["cocktail", "alcohol", "fruitig", "elegant", "sorbet"], diet: ["gluten_free", "cocktail"], program: "Sorbet", ingredients: [ "150ml cranberrysap", "100ml water", "60g suiker", "2 el vodka", "1 el triple sec (Cointreau)", "20ml vers limoensap" ], steps: [ "Verwarm water en suiker tot siroop. Laat afkoelen.", "Mix met cranberrysap, vodka, triple sec en limoensap.", "Giet in een Ninja Swirl pint tot 2,5 cm van de rand.", "Plaats de deksel en vries minimaal 24 uur.", "Plaats in de outer bowl, selecteer \"Sorbet\" en START." ], mixins: ["Cranberries", "Sinaasappel partjes", "Munt", "Rozenblaadjes", "Limoenzeste"], nutrition: { calories: 115, fat: "0g", carbs: "22g", protein: "0g" }, tips: "Gebruik 100% cranberrysap voor een intensere smaak. Alcohol verlaagt het vriespunt: max 2-3 el per pint.", pairings: ["fc-margarita", "so-raspberry", "fw-mimosa"] }, { id: "fc-bahama-mama", type: "sorbet", name: "Bahama Mama Sorbet", emoji: "๐Ÿ๏ธ", description: "Tropische sorbet van donkere rum, ananas en grenadine. Een vakantie in lepels.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 2, pintInfo: "1 swirl pint (ยฑ3 porties)", rating: 4.7, popularity: 83, tags: ["cocktail", "alcohol", "tropisch", "zoet", "sorbet"], diet: ["gluten_free", "cocktail"], program: "Sorbet", ingredients: [ "150ml ananassap", "100ml water", "60g suiker", "1 el donkere rum", "1 el kokosrum (Malibu)", "20ml grenadine", "20ml vers limoensap" ], steps: [ "Verwarm water en suiker tot siroop. Laat afkoelen.", "Mix met ananassap, beide rums, grenadine en limoensap.", "Giet in een Ninja Swirl pint tot 2,5 cm van de rand.", "Plaats de deksel en vries minimaal 24 uur.", "Plaats in de outer bowl, selecteer \"Sorbet\" en START." ], mixins: ["Ananas stukjes", "Maraschino kers", "Geroosterde kokos", "Mango stukjes", "Munt"], nutrition: { calories: 135, fat: "0g", carbs: "28g", protein: "0g" }, tips: "Grenadine geeft de mooie rode kleur. Max 2-3 el alcohol per pint.", pairings: ["fc-pina-colada", "so-passionfruit", "fc-mojito"] }, { id: "fc-mudslide", type: "milkshake", name: "Mudslide Milkshake", emoji: "๐ŸŸค", description: "Romige milkshake van vodka, Kahlua en Baileys. Een decadent dessert-iJs.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 2, pintInfo: "1 swirl pint (ยฑ3 porties)", rating: 4.9, popularity: 84, tags: ["cocktail", "alcohol", "chocolade", "romig", "milkshake"], diet: ["gluten_free", "cocktail"], program: "Milkshake", ingredients: [ "150ml zware room", "100ml volle melk", "40g suiker", "1 el vodka", "1 el Kahlua (koffielikeur)", "1 el Baileys Irish Cream", "1 el chocoladesiroop" ], steps: [ "Mix room, melk, suiker, vodka, Kahlua, Baileys en chocoladesiroop tot de suiker oplost.", "Giet in een Ninja Swirl pint tot 2,5 cm van de rand.", "Plaats de deksel en vries minimaal 24 uur.", "Plaats in de outer bowl, selecteer \"Milkshake\" en START.", "RE-SPIN met 1 el melk indien nodig." ], mixins: ["Chocolade krullen", "Espresso bonen", "Chocolade saus", "Vanille wafels", "Gehakte noten"], nutrition: { calories: 210, fat: "12g", carbs: "20g", protein: "2g" }, tips: "Baileys en room maken dit extra romig โ€” het Milkshake programma is perfect. Alcohol verlaagt het vriespunt: max 2-3 el per pint.", pairings: ["fc-espresso-martini", "ic-chocolate", "ms-nutella"] }, { id: "fc-bellini", type: "sorbet", name: "Bellini Sorbet", emoji: "๐Ÿฅ‚", description: "Elegante sorbet van Prosecco en perzik. Italiaanse brunch-smaak als lepelbaar iJs.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 2, pintInfo: "1 swirl pint (ยฑ3 porties)", rating: 4.7, popularity: 81, tags: ["cocktail", "alcohol", "perzik", "brunch", "sorbet"], diet: ["gluten_free", "cocktail"], program: "Sorbet", ingredients: [ "100g verse perzik, ontpit", "150ml water", "60g suiker", "2 el Prosecco", "1 el citroensap" ], steps: [ "Pureer de perzik met citroensap tot glad.", "Verwarm water en suiker tot siroop. Laat afkoelen.", "Mix siroop, perzikpuree en Prosecco.", "Giet in een Ninja Swirl pint tot 2,5 cm van de rand.", "Plaats de deksel en vries minimaal 24 uur.", "Plaats in de outer bowl, selecteer \"Sorbet\" en START." ], mixins: ["Perzik stukjes", "Rode bessen", "Munt", "Vanille extract", "Honingsiroop"], nutrition: { calories: 100, fat: "0g", carbs: "20g", protein: "0g" }, tips: "Gebruik rijpe perzikken voor de zoetste puree. Prosecco verliest bubbels bij vriezen. Max 2-3 el alcohol per pint.", pairings: ["fw-peach-bellini", "fw-mimosa", "fc-cosmopolitan"] }, { id: "fc-paloma", type: "sorbet", name: "Paloma Sorbet", emoji: "๐Ÿ‡", description: "Verfrissende sorbet van tequila en grapefruit. Mexicaanse favoriet als lepelbaar iJs.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 2, pintInfo: "1 swirl pint (ยฑ3 porties)", rating: 4.7, popularity: 79, tags: ["cocktail", "alcohol", "grapefruit", "verfrissend", "sorbet"], diet: ["gluten_free", "cocktail"], program: "Sorbet", ingredients: [ "200ml vers grapefruitsap", "100ml water", "60g suiker", "2 el tequila (blanco)", "20ml vers limoensap", "Snufje zout" ], steps: [ "Verwarm water en suiker tot siroop. Laat afkoelen.", "Mix met grapefruitsap, tequila, limoensap en zout.", "Giet in een Ninja Swirl pint tot 2,5 cm van de rand.", "Plaats de deksel en vries minimaal 24 uur.", "Plaats in de outer bowl, selecteer \"Sorbet\" en START.", "RE-SPIN met 1 el water indien nodig." ], mixins: ["Grapefruit partjes", "Chili zout", "Limoen", "Tamarinde", "Jalapeรฑo"], nutrition: { calories: 115, fat: "0g", carbs: "24g", protein: "0g" }, tips: "Vers grapefruitsap is veel beter dan packaged. Een snufje zout versterkt de grapefruitsmaak. Max 2-3 el alcohol per pint.", pairings: ["fc-margarita", "so-rose-wine", "fw-mimosa"] }, // ============================================================ // WINE SORBETS & IJS โ€” Wijn als basis voor sorbet en gelato // ============================================================ { id: "fw-rose-sorbet", type: "sorbet", name: "Rosรฉ Wine Sorbet", emoji: "๐Ÿท", description: "Verfrissende sorbet van droge rosรฉ wijn. De ultieme zomerse terras-traktatie als iJs.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 2, pintInfo: "1 swirl pint (ยฑ3 porties)", rating: 4.8, popularity: 85, tags: ["wine", "alcohol", "rosรฉ", "zomer", "sorbet"], diet: ["gluten_free", "dairy_free", "vegan", "cocktail"], program: "Sorbet", ingredients: [ "200ml rosรฉ wijn (droog)", "100ml water", "60g suiker", "1 el citroensap", "Verse frambozen voor garnering" ], steps: [ "Verwarm water en suiker tot siroop. Laat afkoelen.", "Mix met rosรฉ en citroensap.", "Giet in een Ninja Swirl pint tot 2,5 cm van de rand.", "Plaats de deksel en vries minimaal 24 uur.", "Plaats in de outer bowl, selecteer \"Sorbet\" en START.", "RE-SPIN indien nodig." ], mixins: ["Frambozen", "Aardbeien", "Munt", "Limoenzeste", "Prosecco splash"], nutrition: { calories: 110, fat: "0g", carbs: "18g", protein: "0g" }, tips: "Gebruik een droge, fruitige rosรฉ (Provence stijl). Max 2-3 el alcohol per pint. Voeg een splash prosecco toe bij serveren.", pairings: ["fw-sangria-white", "so-raspberry", "fc-bellini"] }, { id: "fw-prosecco-sorbet", type: "sorbet", name: "Prosecco Sorbet", emoji: "๐Ÿฅ‚", description: "Elegante sorbet van Prosecco โ€” licht, feestelijk en verfrissend.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 2, pintInfo: "1 swirl pint (ยฑ3 porties)", rating: 4.7, popularity: 80, tags: ["wine", "alcohol", "prosecco", "elegant", "sorbet"], diet: ["gluten_free", "dairy_free", "vegan", "cocktail"], program: "Sorbet", ingredients: [ "150ml Prosecco", "100ml water", "60g suiker", "1 el citroensap", "1 tl citroenzeste" ], steps: [ "Verwarm water en suiker tot siroop. Laat afkoelen.", "Mix met Prosecco, citroensap en zeste.", "Giet in een Ninja Swirl pint tot 2,5 cm van de rand.", "Plaats de deksel en vries minimaal 24 uur.", "Plaats in de outer bowl, selecteer \"Sorbet\" en START." ], mixins: ["Bessen", "Munt", "Citroenzeste", "Eetbare bloemblaadjes", "Prosecco splash"], nutrition: { calories: 110, fat: "0g", carbs: "18g", protein: "0g" }, tips: "Prosecco verliest bubbels bij vriezen โ€” dat is okรฉ voor sorbet. Gebruik Brut Prosecco voor minder zoetheid. Max 2-3 el alcohol per pint.", pairings: ["fw-mimosa", "fc-bellini", "so-lemon"] }, { id: "fw-sangria-red", type: "sorbet", name: "Sangria Sorbet (Rood)", emoji: "๐Ÿท", description: "Fruitige sorbet van rode wijn, citrus en vers fruit. Fiesta in een pint!", difficulty: "Beginner", difficultyScore: 1, prepTime: "15 min", freezeTime: "24u", totalTime: "24u 15m", servings: 2, pintInfo: "1 swirl pint (ยฑ3 porties)", rating: 4.7, popularity: 82, tags: ["wine", "alcohol", "rode wijn", "fruit", "sorbet"], diet: ["gluten_free", "dairy_free", "vegan", "cocktail"], program: "Sorbet", ingredients: [ "150ml rode wijn (Tempranillo of Rioja)", "100ml water", "60g suiker", "50ml sinaasappelsap", "20ml citroensap", "50g verse fruitmix (sinaasappel, citroen, bessen)" ], steps: [ "Snijd het fruit in kleine stukjes.", "Verwarm water en suiker tot siroop. Laat afkoelen.", "Mix siroop met wijn, sinaasappelsap, citroensap en fruit.", "Giet in een Ninja Swirl pint tot 2,5 cm van de rand.", "Plaats de deksel en vries minimaal 24 uur.", "Plaats in de outer bowl, selecteer \"Sorbet\" en START." ], mixins: ["Sinaasappel partjes", "Bessen", "Appel stukjes", "Kaneel stokje", "Brandy splash"], nutrition: { calories: 120, fat: "0g", carbs: "20g", protein: "0g" }, tips: "Een fruitige Spaanse wijn (Garnacha, Tempranillo) werkt het beste. Laat het fruit mee invriezen. Max 2-3 el alcohol per pint.", pairings: ["fw-sangria-white", "so-rose-wine", "fc-margarita"] }, { id: "fw-sangria-white", type: "sorbet", name: "Sangria Sorbet (Wit)", emoji: "๐Ÿฅ‚", description: "Lichte, verfrissende sorbet van witte wijn, perzik en mango.", difficulty: "Beginner", difficultyScore: 1, prepTime: "15 min", freezeTime: "24u", totalTime: "24u 15m", servings: 2, pintInfo: "1 swirl pint (ยฑ3 porties)", rating: 4.6, popularity: 79, tags: ["wine", "alcohol", "witte wijn", "fruit", "zomer", "sorbet"], diet: ["gluten_free", "dairy_free", "vegan", "cocktail"], program: "Sorbet", ingredients: [ "150ml witte wijn (Sauvignon Blanc of Pinot Grigio)", "100ml water", "60g suiker", "1 rijpe perzik, in stukjes", "ยฝ mango, in stukjes", "20ml citroensap" ], steps: [ "Pureer de perzik en mango.", "Verwarm water en suiker tot siroop. Laat afkoelen.", "Mix siroop met wijn, fruitpuree en citroensap.", "Giet in een Ninja Swirl pint tot 2,5 cm van de rand.", "Plaats de deksel en vries minimaal 24 uur.", "Plaats in de outer bowl, selecteer \"Sorbet\" en START." ], mixins: ["Perzik stukjes", "Mango stukjes", "Bessen", "Munt", "Witte wijn splash"], nutrition: { calories: 115, fat: "0g", carbs: "22g", protein: "0g" }, tips: "Gebruik een fruitige, niet-te-droge witte wijn. Riesling of Moscato werken ook heerlijk. Max 2-3 el alcohol per pint.", pairings: ["fw-rose-sorbet", "fw-peach-bellini", "so-mango"] }, { id: "fw-mulled-wine", type: "sorbet", name: "Mulled Wine Sorbet", emoji: "๐ŸŽ„", description: "Winterse sorbet van glรผhwein โ€” kruidnagel, kaneel en rode wijn. Een uniek winterdessert.", difficulty: "Intermediate", difficultyScore: 2, prepTime: "20 min", freezeTime: "24u", totalTime: "24u 20m", servings: 2, pintInfo: "1 swirl pint (ยฑ3 porties)", rating: 4.6, popularity: 75, tags: ["wine", "alcohol", "winter", "kruidig", "sorbet"], diet: ["gluten_free", "dairy_free", "vegan", "cocktail"], program: "Sorbet", ingredients: [ "150ml rode wijn (full-bodied)", "100ml water", "60g suiker", "2 kruidnagels", "1 kaneelstokje", "1 steranijs", "Sinaasappelschil", "1 el citroensap" ], steps: [ "Verwarm de rode wijn met kruidnagels, kaneel, steranijs en sinaasappelschil. Laat 10 minuten zachtjes trekken (niet koken).", "Zeef de wijn en los de suiker erin op. Laat afkoelen.", "Voeg citroensap en water toe.", "Giet in een Ninja Swirl pint tot 2,5 cm van de rand.", "Plaats de deksel en vries minimaal 24 uur.", "Plaats in de outer bowl, selecteer \"Sorbet\" en START." ], mixins: ["Kaneel", "Sinaasappel partjes", "Kruidnagel", "Gember", "Appel stukjes"], nutrition: { calories: 120, fat: "0g", carbs: "18g", protein: "0g" }, tips: "Perfect als winterse traktatie! Een Merlot of Cabernet werkt goed. Max 2-3 el alcohol per pint.", pairings: ["ic-gingerbread", "ic-pumpkin-spice", "fw-sangria-red"] }, { id: "fw-peach-bellini", type: "sorbet", name: "Peach Bellini Sorbet", emoji: "๐Ÿ‘", description: "Zoete perzik sorbet met Prosecco. Italiaanse brunch-vibe als lepelbaar iJs.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 2, pintInfo: "1 swirl pint (ยฑ3 porties)", rating: 4.8, popularity: 83, tags: ["wine", "alcohol", "perzik", "prosecco", "brunch", "sorbet"], diet: ["gluten_free", "cocktail"], program: "Sorbet", ingredients: [ "100g verse perzik, ontpit", "150ml water", "60g suiker", "2 el Prosecco", "1 el citroensap" ], steps: [ "Pureer de perzik met citroensap tot glad.", "Verwarm water en suiker tot siroop. Laat afkoelen.", "Mix siroop met perzikpuree en Prosecco.", "Giet in een Ninja Swirl pint tot 2,5 cm van de rand.", "Plaats de deksel en vries minimaal 24 uur.", "Plaats in de outer bowl, selecteer \"Sorbet\" en START." ], mixins: ["Perzik stukjes", "Rode bessen", "Munt", "Vanille", "Honingsiroop"], nutrition: { calories: 105, fat: "0g", carbs: "20g", protein: "0g" }, tips: "Gebruik rijpe witte perzikken voor de klassieke Venetiaanse smaak. Prosecco Brut geeft minder zoetheid. Max 2-3 el alcohol per pint.", pairings: ["fw-mimosa", "fc-bellini", "fw-prosecco-sorbet"] }, { id: "fw-mimosa", type: "sorbet", name: "Mimosa Sorbet", emoji: "๐ŸŠ", description: "Verfrissende sorbet van Champagne en sinaasappelsap. Brunch perfection als iJs!", difficulty: "Beginner", difficultyScore: 1, prepTime: "5 min", freezeTime: "24u", totalTime: "24u 5m", servings: 2, pintInfo: "1 swirl pint (ยฑ3 porties)", rating: 4.6, popularity: 78, tags: ["wine", "alcohol", "champagne", "sinaasappel", "brunch", "sorbet"], diet: ["gluten_free", "dairy_free", "vegan", "cocktail"], program: "Sorbet", ingredients: [ "100ml Champagne of Cava", "150ml vers sinaasappelsap", "50ml water", "40g suiker", "1 el citroensap" ], steps: [ "Verwarm water en suiker tot siroop. Laat afkoelen.", "Mix met Champagne, sinaasappelsap en citroensap.", "Giet in een Ninja Swirl pint tot 2,5 cm van de rand.", "Plaats de deksel en vries minimaal 24 uur.", "Plaats in de outer bowl, selecteer \"Sorbet\" en START." ], mixins: ["Sinaasappel partjes", "Bessen", "Munt", "Grapefruit", "Champagne splash"], nutrition: { calories: 100, fat: "0g", carbs: "18g", protein: "0g" }, tips: "Vers geperste sinaasappelsap maakt het verschil. Cava is een betaalbaar alternatief. Max 2-3 el alcohol per pint.", pairings: ["fw-peach-bellini", "fc-bellini", "fw-rose-sorbet"] }, { id: "fw-port-chocolate", type: "ice_cream", name: "Port Wine Chocolate IJs", emoji: "๐Ÿซ", description: "Romig chocolade-iJs met port wijn. Een decadent dessert voor de fijnproever.", difficulty: "Intermediate", difficultyScore: 2, prepTime: "15 min", freezeTime: "24u", totalTime: "24u 15m", servings: 2, pintInfo: "1 swirl pint (ยฑ3 porties)", rating: 4.9, popularity: 77, tags: ["wine", "alcohol", "port", "chocolade", "dessert", "ice_cream"], diet: ["gluten_free", "cocktail"], program: "Ice Cream", ingredients: [ "1 kopje zware room (236ml)", "ยฝ kopje volle melk (118ml)", "โ…“ kopje suiker (66g)", "ยผ kopje cacaopoeder (16g)", "2 el Port wijn (Tawny of Ruby)", "ยฝ tl vanille-extract", "Snufje zout" ], steps: [ "Verwarm zachtjes ยฝ kopje room met suiker en cacaopoeder.", "Roer tot een gladde chocoladebasis. Laat afkoelen.", "Voeg de rest van de room, melk, port, vanille en zout toe.", "Giet in de pint, sluit af en vries 24 uur.", "Plaats in de outer bowl, selecteer \"Ice Cream\" en START.", "RE-SPIN met 1 el melk indien nodig." ], mixins: ["Chocolade krullen", "Gehakte walnoten", "Zeezout vlokken", "Geroosterde amandelen", "Cacao nibs"], nutrition: { calories: 185, fat: "12g", carbs: "16g", protein: "2g" }, tips: "Tawny Port geeft een karamel-noot toon, Ruby Port is fruitiger. De alcohol maakt het iJs iets zachter. Max 2-3 el alcohol per pint.", pairings: ["ic-chocolate", "ic-pecan-pie", "gl-pistachio"] }, { id: "fw-riesling-lemon", type: "sorbet", name: "Riesling Lemon Sorbet", emoji: "๐Ÿ‹", description: "Heldere, citroenachtige sorbet met Riesling. Verfrissend en elegant.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 2, pintInfo: "1 swirl pint (ยฑ3 porties)", rating: 4.5, popularity: 72, tags: ["wine", "alcohol", "riesling", "citroen", "verfrissend", "sorbet"], diet: ["gluten_free", "dairy_free", "vegan", "cocktail"], program: "Sorbet", ingredients: [ "120ml Riesling", "120ml water", "60g suiker", "40ml vers citroensap", "1 tl citroenzeste", "Snufje zout" ], steps: [ "Verwarm water en suiker tot siroop. Laat afkoelen.", "Mix met Riesling, citroensap en zeste.", "Giet in een Ninja Swirl pint tot 2,5 cm van de rand.", "Plaats de deksel en vries minimaal 24 uur.", "Plaats in de outer bowl, selecteer \"Sorbet\" en START." ], mixins: ["Citroenzeste", "Bessen", "Munt", "Gember", "Eetbare bloemblaadjes"], nutrition: { calories: 105, fat: "0g", carbs: "18g", protein: "0g" }, tips: "Een half-droge Riesling (Kabinett) geeft de beste balans. Te droog wordt zuur, te zoet wordt muf. Max 2-3 el alcohol per pint.", pairings: ["fw-prosecco-sorbet", "so-lemon", "ic-lavender-honey"] }, { id: "fw-moscato-berry", type: "sorbet", name: "Moscato Berry Sorbet", emoji: "๐Ÿ‡", description: "Zoete sorbet van Moscato en gemengde bessen. Een fruitig wijn-dessert.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 2, pintInfo: "1 swirl pint (ยฑ3 porties)", rating: 4.7, popularity: 80, tags: ["wine", "alcohol", "moscato", "bessen", "zoet", "sorbet"], diet: ["gluten_free", "dairy_free", "vegan", "cocktail"], program: "Sorbet", ingredients: [ "120ml Moscato d'Asti", "120ml water", "50g suiker", "1 kopje gemengde bessen (150g)", "1 el citroensap" ], steps: [ "Pureer de bessen met citroensap.", "Verwarm water en suiker tot siroop. Laat afkoelen.", "Mix siroop met bessenpuree en Moscato.", "Giet in een Ninja Swirl pint tot 2,5 cm van de rand.", "Plaats de deksel en vries minimaal 24 uur.", "Plaats in de outer bowl, selecteer \"Sorbet\" en START." ], mixins: ["Bessen", "Munt", "Citroenzeste", "Eetbare bloemblaadjes", "Moscato splash"], nutrition: { calories: 110, fat: "0g", carbs: "20g", protein: "0g" }, tips: "Moscato d'Asti is licht en zoet โ€” perfect voor desserts. De lage alcohol maakt het vriesgedrag beter. Max 2-3 el alcohol per pint.", pairings: ["fw-rose-sorbet", "so-raspberry", "fw-sangria-white"] }, // ============================================================ // EXTRA COCKTAIL SORBETS & GELATO โ€” Creatieve cocktail-iJs combinaties // ============================================================ { id: "fc-amaretto-cherry", type: "sorbet", name: "Amaretto Cherry Sorbet", emoji: "๐Ÿ’", description: "Verfrissende sorbet van amaretto en sappige kersen. Amandel-kers pairing als lepelbaar iJs.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 2, pintInfo: "1 swirl pint (ยฑ3 porties)", rating: 4.7, popularity: 76, tags: ["cocktail", "alcohol", "kers", "amandel", "sorbet"], diet: ["gluten_free", "dairy_free", "cocktail"], program: "Sorbet", ingredients: [ "1 kopje verse kersen, ontpit (150g)", "150ml water", "60g suiker", "2 el amaretto (Disaronno)", "1 el citroensap", "ยผ tl amandelextract" ], steps: [ "Pureer de kersen met citroensap tot een gladde massa.", "Verwarm water en suiker tot siroop. Laat afkoelen.", "Mix siroop met kersenpuree, amaretto en amandelextract.", "Giet in een Ninja Swirl pint tot 2,5 cm van de rand.", "Plaats de deksel en vries minimaal 24 uur.", "Plaats in de outer bowl, selecteer \"Sorbet\" en START." ], mixins: ["Gehakte amandelen", "Kersen", "Chocolade krullen", "Amandelschaafsel", "Vanille"], nutrition: { calories: 125, fat: "0g", carbs: "24g", protein: "0g" }, tips: "Verse kersen zijn het beste, maar bevroren werkt ook. Amaretto en kersen zijn een klassieke Italiaanse combinatie. Max 2-3 el alcohol per pint.", pairings: ["fc-espresso-martini", "ic-chocolate", "fw-port-chocolate"] }, { id: "fc-bourbon-pecan", type: "gelato", name: "Bourbon Pecan Gelato", emoji: "๐Ÿฅƒ", description: "Dichte gelato van bourbon, pecannoten en bruine suiker. Southern comfort als iJs.", difficulty: "Intermediate", difficultyScore: 2, prepTime: "15 min", freezeTime: "24u", totalTime: "24u 15m", servings: 2, pintInfo: "1 swirl pint (ยฑ3 porties)", rating: 4.8, popularity: 78, tags: ["cocktail", "alcohol", "bourbon", "pecan", "gelato"], diet: ["gluten_free", "cocktail"], program: "Gelato", ingredients: [ "1 kopje volle melk (236ml)", "80ml zware room", "50g bruine suiker", "20g suiker", "2 el bourbon", "1 tl vanille-extract", "30g gehakte pecannoten, geroosterd", "Snufje zout" ], steps: [ "Verwarm melk en room tot lauw. Los bruine suiker en suiker erin op.", "Laat afkoelen en voeg bourbon, vanille en zout toe.", "Roer de geroosterde pecannoten erdoor.", "Giet in een Ninja Swirl pint tot 2,5 cm van de rand.", "Plaats de deksel en vries minimaal 24 uur.", "Plaats in de outer bowl, selecteer \"Gelato\" en START." ], mixins: ["Gehakte pecannoten", "Caramel saus", "Chocolade stukjes", "Geroosterde noten mix", "Zeezout vlokken"], nutrition: { calories: 210, fat: "10g", carbs: "24g", protein: "3g" }, tips: "Rooster de pecannoten in een droge pan voor extra smaak. Bourbon geeft een warme, karamellige toon. Max 2-3 el alcohol per pint.", pairings: ["fw-port-chocolate", "fc-mudslide", "ic-pecan-pie"] }, { id: "fc-gin-tonic", type: "sorbet", name: "Gin & Tonic Sorbet", emoji: "๐ŸŒฟ", description: "Verfrissende sorbet van gin, tonic en jeneverbes. De klassieke G&T als lepelbaar iJs.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 2, pintInfo: "1 swirl pint (ยฑ3 porties)", rating: 4.5, popularity: 74, tags: ["cocktail", "alcohol", "gin", "verfrissend", "sorbet"], diet: ["gluten_free", "dairy_free", "cocktail"], program: "Sorbet", ingredients: [ "150ml tonic water", "100ml water", "60g suiker", "2 el gin", "1 el vers limoensap", "5 jeneverbessen, licht geplet", "1 tl citroenzeste" ], steps: [ "Verwarm tonic, water en suiker tot de suiker oplost. Voeg jeneverbessen toe en laat 10 minuten trekken.", "Zeef en laat afkoelen.", "Mix met gin, limoensap en citroenzeste.", "Giet in een Ninja Swirl pint tot 2,5 cm van de rand.", "Plaats de deksel en vries minimaal 24 uur.", "Plaats in de outer bowl, selecteer \"Sorbet\" en START." ], mixins: ["Komkommer linten", "Verse munt", "Citroenpartjes", "Jeneverbessen", "Eetbare bloemblaadjes"], nutrition: { calories: 110, fat: "0g", carbs: "22g", protein: "0g" }, tips: "Tonic water bevat kinine wat een unieke bittere toon geeft. De jeneverbessen versterken de gin-smaak. Max 2-3 el alcohol per pint.", pairings: ["fc-negroni", "fw-prosecco-sorbet", "so-coconut-lime"] }, { id: "fc-baileys-coffee", type: "gelato", name: "Baileys Coffee Gelato", emoji: "โ˜•", description: "Zijdeachtige gelato van Baileys, espresso en room. Een Iers-koffie dessert in lepels.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 2, pintInfo: "1 swirl pint (ยฑ3 porties)", rating: 4.9, popularity: 82, tags: ["cocktail", "alcohol", "baileys", "koffie", "gelato"], diet: ["gluten_free", "cocktail"], program: "Gelato", ingredients: [ "150ml volle melk", "80ml zware room", "50g suiker", "1 shot verse espresso (30ml), afgekoeld", "2 el Baileys Irish Cream", "ยฝ tl vanille-extract", "Snufje zout" ], steps: [ "Mix melk, room en suiker tot de suiker oplost.", "Voeg espresso, Baileys, vanille en zout toe.", "Giet in een Ninja Swirl pint tot 2,5 cm van de rand.", "Plaats de deksel en vries minimaal 24 uur.", "Plaats in de outer bowl, selecteer \"Gelato\" en START.", "RE-SPIN met 1 el melk indien nodig." ], mixins: ["Koffiebonen", "Chocolade krullen", "Cacao nibs", "Gehakte walnoten", "Caramel saus"], nutrition: { calories: 175, fat: "8g", carbs: "18g", protein: "2g" }, tips: "Baileys maakt deze gelato extra romig. Gebruik sterke espresso voor de beste smaak. Max 2-3 el alcohol per pint.", pairings: ["fc-mudslide", "fc-espresso-martini", "ic-tiramisu"] }, { id: "fc-coconut-rum", type: "sorbet", name: "Coconut Rum Sorbet", emoji: "๐Ÿฅฅ", description: "Tropische sorbet van donkere rum, kokosmelk en ananas. Caribbean vibes als lepelbaar iJs.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 2, pintInfo: "1 swirl pint (ยฑ3 porties)", rating: 4.6, popularity: 77, tags: ["cocktail", "alcohol", "rum", "kokos", "tropisch", "sorbet"], diet: ["gluten_free", "dairy_free", "cocktail"], program: "Sorbet", ingredients: [ "200ml kokosmelk (full-fat)", "100ml ananassap", "60g suiker", "2 el donkere rum", "1 el vers limoensap", "Snufje zout" ], steps: [ "Mix kokosmelk, ananassap, suiker, rum, limoensap en zout tot de suiker oplost.", "Giet in een Ninja Swirl pint tot 2,5 cm van de rand.", "Plaats de deksel en vries minimaal 24 uur.", "Plaats in de outer bowl, selecteer \"Sorbet\" en START.", "RE-SPIN indien nodig." ], mixins: ["Ananas stukjes", "Geroosterde kokos", "Macaadamia noten", "Donkere chocolade stukjes", "Munt"], nutrition: { calories: 170, fat: "6g", carbs: "24g", protein: "1g" }, tips: "Full-fat kokosmelk geeft de beste textuur. Donkere rum geeft meer diepte dan lichte rum. Max 2-3 el alcohol per pint.", pairings: ["fc-pina-colada", "fc-bahama-mama", "so-pineapple"] }, { id: "fc-champagne-mango", type: "sorbet", name: "Champagne Mango Sorbet", emoji: "๐Ÿฅญ", description: "Feestelijke sorbet van Champagne en rijpe mango. Elegant, fruitig en luxueus.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 2, pintInfo: "1 swirl pint (ยฑ3 porties)", rating: 4.8, popularity: 81, tags: ["cocktail", "alcohol", "champagne", "mango", "feestelijk", "sorbet"], diet: ["gluten_free", "dairy_free", "vegan", "cocktail"], program: "Sorbet", ingredients: [ "1 rijpe mango, in stukjes (200g)", "100ml water", "50g suiker", "2 el Champagne of Cava", "1 el citroensap" ], steps: [ "Pureer de mango met citroensap tot glad.", "Verwarm water en suiker tot siroop. Laat afkoelen.", "Mix siroop met mango puree en Champagne.", "Giet in een Ninja Swirl pint tot 2,5 cm van de rand.", "Plaats de deksel en vries minimaal 24 uur.", "Plaats in de outer bowl, selecteer \"Sorbet\" en START." ], mixins: ["Mango stukjes", "Passievrucht", "Munt", "Chili vlokken", "Limoenzeste"], nutrition: { calories: 115, fat: "0g", carbs: "24g", protein: "0g" }, tips: "Gebruik een zeer rijpe mango voor maximale zoetheid. Champagne verliest bubbels bij vriezen. Max 2-3 el alcohol per pint.", pairings: ["fw-mimosa", "so-mango", "fc-bellini"] }, // ============================================================ // EXTRA WINE SORBETS & GELATO โ€” Creatieve wijn-iJs combinaties // ============================================================ { id: "fw-cabernet-chocolate", type: "gelato", name: "Cabernet Chocolate Gelato", emoji: "๐Ÿท", description: "Dichte gelato van Cabernet Sauvignon en donkere chocolade. Rood fruit en chocolade = hemels.", difficulty: "Intermediate", difficultyScore: 2, prepTime: "15 min", freezeTime: "24u", totalTime: "24u 15m", servings: 2, pintInfo: "1 swirl pint (ยฑ3 porties)", rating: 4.8, popularity: 78, tags: ["wine", "alcohol", "cabernet", "chocolade", "dessert", "gelato"], diet: ["gluten_free", "cocktail"], program: "Gelato", ingredients: [ "150ml volle melk", "80ml zware room", "50g suiker", "2 el Cabernet Sauvignon", "2 el cacaopoeder", "ยฝ tl vanille-extract", "Snufje zout" ], steps: [ "Verwarm melk en room. Los suiker en cacaopoeder erin op.", "Laat afkoelen en voeg Cabernet, vanille en zout toe.", "Giet in een Ninja Swirl pint tot 2,5 cm van de rand.", "Plaats de deksel en vries minimaal 24 uur.", "Plaats in de outer bowl, selecteer \"Gelato\" en START.", "RE-SPIN met 1 el melk indien nodig." ], mixins: ["Chocolade krullen", "Gehakte walnoten", "Zeezout vlokken", "Gedroogde kersen", "Cacao nibs"], nutrition: { calories: 175, fat: "8g", carbs: "18g", protein: "2g" }, tips: "Cabernet Sauvignon heeft zwarte-bessen tonen die perfect samengaan met chocolade. Max 2-3 el alcohol per pint.", pairings: ["fw-port-chocolate", "ic-chocolate", "fc-bourbon-pecan"] }, { id: "fw-gewurztraminer-lychee", type: "sorbet", name: "Gewรผrztraminer Lychee Sorbet", emoji: "๐ŸŒธ", description: "Bloemige sorbet van Gewรผrztraminer en lychee met een hint van rozenwater. Exotisch en elegant.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 2, pintInfo: "1 swirl pint (ยฑ3 porties)", rating: 4.6, popularity: 71, tags: ["wine", "alcohol", "exotisch", "bloemig", "sorbet"], diet: ["gluten_free", "dairy_free", "vegan", "cocktail"], program: "Sorbet", ingredients: [ "120ml Gewรผrztraminer", "120ml water", "50g suiker", "1 blikje lychees (uitgelekt, 200g)", "ยผ tl rozenwater", "1 el citroensap" ], steps: [ "Pureer de lychees met het citroensap tot glad.", "Verwarm water en suiker tot siroop. Laat afkoelen.", "Mix siroop met lychee puree, Gewรผrztraminer en rozenwater.", "Giet in een Ninja Swirl pint tot 2,5 cm van de rand.", "Plaats de deksel en vries minimaal 24 uur.", "Plaats in de outer bowl, selecteer \"Sorbet\" en START." ], mixins: ["Lychee stukjes", "Eetbare bloemblaadjes", "Munt", "Citroenzeste", "Gember"], nutrition: { calories: 115, fat: "0g", carbs: "24g", protein: "0g" }, tips: "Gewรผrztraminer heeft van nature lychee- en rozenaroma's โ€” een perfecte pairing. Wees spaarzaam met rozenwater. Max 2-3 el alcohol per pint.", pairings: ["fw-moscato-berry", "so-passionfruit", "fc-champagne-mango"] }, { id: "fw-sauternes-caramel", type: "gelato", name: "Sauternes Caramel Gelato", emoji: "๐Ÿฏ", description: "Luxueuze gelato van Sauternes, karamel en zeezout. Een dessert-wijn parexcellence.", difficulty: "Intermediate", difficultyScore: 2, prepTime: "20 min", freezeTime: "24u", totalTime: "24u 20m", servings: 2, pintInfo: "1 swirl pint (ยฑ3 porties)", rating: 4.9, popularity: 76, tags: ["wine", "alcohol", "sauternes", "karamel", "dessert", "gelato"], diet: ["gluten_free", "cocktail"], program: "Gelato", ingredients: [ "150ml volle melk", "80ml zware room", "40g suiker", "2 el Sauternes (zoete wijn)", "2 el karamel saus", "ยผ tl zeezout", "ยฝ tl vanille-extract" ], steps: [ "Verwarm melk en room. Los suiker erin op.", "Roer de karamel saus erdoor tot glad.", "Laat afkoelen en voeg Sauternes, zeezout en vanille toe.", "Giet in een Ninja Swirl pint tot 2,5 cm van de rand.", "Plaats de deksel en vries minimaal 24 uur.", "Plaats in de outer bowl, selecteer \"Gelato\" en START." ], mixins: ["Karamel stukjes", "Geroosterde amandelen", "Zeezout vlokken", "Chocolade krullen", "Gehakte pecannoten"], nutrition: { calories: 195, fat: "8g", carbs: "24g", protein: "2g" }, tips: "Sauternes is een van de beroemdste dessertwijnen ter wereld. De karamel en zeezout versterken de honing-tonen. Max 2-3 el alcohol per pint.", pairings: ["fw-port-chocolate", "fc-bourbon-pecan", "ic-pecan-pie"] }, { id: "fw-pinot-noir-berry", type: "sorbet", name: "Pinot Noir Berry Sorbet", emoji: "๐Ÿซ", description: "Elegante sorbet van Pinot Noir met bosbessen en frambozen. Rood fruit symfonie.", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 2, pintInfo: "1 swirl pint (ยฑ3 porties)", rating: 4.7, popularity: 75, tags: ["wine", "alcohol", "pinot noir", "bessen", "sorbet"], diet: ["gluten_free", "dairy_free", "vegan", "cocktail"], program: "Sorbet", ingredients: [ "120ml Pinot Noir", "120ml water", "50g suiker", "ยฝ kopje bosbessen (75g)", "ยฝ kopje frambozen (75g)", "1 el citroensap" ], steps: [ "Pureer de bessen met citroensap.", "Verwarm water en suiker tot siroop. Laat afkoelen.", "Mix siroop met bessenpuree en Pinot Noir.", "Giet in een Ninja Swirl pint tot 2,5 cm van de rand.", "Plaats de deksel en vries minimaal 24 uur.", "Plaats in de outer bowl, selecteer \"Sorbet\" en START." ], mixins: ["Verse bessen", "Munt", "Citroenzeste", "Eetbare bloemblaadjes", "Gehakte chocolade"], nutrition: { calories: 110, fat: "0g", carbs: "22g", protein: "0g" }, tips: "Pinot Noir is elegant en fruitig โ€” perfect met bessen. Een Bourgogne Pinot Noir werkt het beste. Max 2-3 el alcohol per pint.", pairings: ["fw-moscato-berry", "fw-rose-sorbet", "so-raspberry"] }, { id: "fw-asti-peach", type: "sorbet", name: "Asti Spumante Peach Sorbet", emoji: "๐Ÿ‘", description: "Italiaanse zoete sorbet van Asti Spumante en rijpe perzik. Dolce vita als iJs!", difficulty: "Beginner", difficultyScore: 1, prepTime: "10 min", freezeTime: "24u", totalTime: "24u 10m", servings: 2, pintInfo: "1 swirl pint (ยฑ3 porties)", rating: 4.7, popularity: 77, tags: ["wine", "alcohol", "asti", "perzik", "italiaans", "sorbet"], diet: ["gluten_free", "dairy_free", "vegan", "cocktail"], program: "Sorbet", ingredients: [ "120ml Asti Spumante", "100ml water", "50g suiker", "1 rijpe perzik, in stukjes (100g)", "ยฝ tl vanille-extract", "1 el citroensap" ], steps: [ "Pureer de perzik met citroensap en vanille.", "Verwarm water en suiker tot siroop. Laat afkoelen.", "Mix siroop met perzikpuree en Asti Spumante.", "Giet in een Ninja Swirl pint tot 2,5 cm van de rand.", "Plaats de deksel en vries minimaal 24 uur.", "Plaats in de outer bowl, selecteer \"Sorbet\" en START." ], mixins: ["Perzik stukjes", "Bessen", "Munt", "Eetbare bloemblaadjes", "Vanille"], nutrition: { calories: 105, fat: "0g", carbs: "22g", protein: "0g" }, tips: "Asti Spumante is zoet en fruitig โ€” ideaal voor desserts. De perzik en vanille maken het zomers. Max 2-3 el alcohol per pint.", pairings: ["fw-peach-bellini", "fc-bellini", "so-passionfruit"] } ]; // ============================================================ // MIX & MATCH DATA // ============================================================ const MIXMATCH_DATA = { bases: [ { id: 'heavy-cream', name: 'Zware room', emoji: '๐Ÿฅ›', desc: 'Klassiek, meest romig' }, { id: 'whole-milk', name: 'Volle melk', emoji: '๐Ÿ„', desc: 'Standaard, lichter' }, { id: 'coconut-milk', name: 'Kokosmelk', emoji: '๐Ÿฅฅ', desc: 'Vegan, tropisch' }, { id: 'almond-milk', name: 'Amandelmelk', emoji: '๐Ÿฅ›', desc: 'Low-cal, notig' }, { id: 'greek-yogurt', name: 'Griekse yoghurt', emoji: '๐Ÿฅ›', desc: 'Tart, eiwitrijk' }, { id: 'oat-milk', name: 'Havermelk', emoji: '๐ŸŒพ', desc: 'Vegan, romig' }, { id: 'cashew-milk', name: 'Cashewmelk', emoji: '๐Ÿฅœ', desc: 'Vegan, boterzig' }, { id: 'protein-shake', name: 'Eiwitshake', emoji: '๐Ÿ’ช', desc: 'Klaar-te-drinken' }, ], flavors: [ { id: 'vanilla', name: 'Vanille', emoji: '๐ŸŒธ', pairing: 95 }, { id: 'chocolate', name: 'Chocolade', emoji: '๐Ÿซ', pairing: 95 }, { id: 'strawberry', name: 'Aardbei', emoji: '๐Ÿ“', pairing: 88 }, { id: 'mango', name: 'Mango', emoji: '๐Ÿฅญ', pairing: 82 }, { id: 'pistachio', name: 'Pistache', emoji: '๐ŸŸข', pairing: 78 }, { id: 'coffee', name: 'Koffie', emoji: 'โ˜•', pairing: 85 }, { id: 'matcha', name: 'Matcha', emoji: '๐Ÿต', pairing: 72 }, { id: 'lemon', name: 'Citroen', emoji: '๐Ÿ‹', pairing: 68 }, { id: 'lavender', name: 'Lavendel', emoji: '๐Ÿ’œ', pairing: 55 }, { id: 'caramel', name: 'Karamel', emoji: '๐Ÿฏ', pairing: 90 }, { id: 'mint', name: 'Munt', emoji: '๐ŸŒฟ', pairing: 75 }, { id: 'blackberry', name: 'Bosbes', emoji: '๐Ÿซ', pairing: 80 }, { id: 'banana', name: 'Banaan', emoji: '๐ŸŒ', pairing: 78 }, { id: 'rose', name: 'Roos', emoji: '๐ŸŒน', pairing: 45 }, { id: 'cardamom', name: 'Kardemom', emoji: '๐ŸŸค', pairing: 50 }, { id: 'espresso', name: 'Espresso', emoji: 'โ˜•', pairing: 82 }, ], mixins: [ { id: 'choc-chunks', name: 'Chocolade stukjes', emoji: '๐Ÿซ', pairing: 92 }, { id: 'brownie', name: 'Brownie stukjes', emoji: '๐ŸŸซ', pairing: 88 }, { id: 'oreo', name: 'Oreo crumble', emoji: '๐Ÿช', pairing: 90 }, { id: 'caramel-swirl', name: 'Karamel swirl', emoji: '๐Ÿฏ', pairing: 85 }, { id: 'pecan', name: 'Pecan noten', emoji: '๐Ÿฅœ', pairing: 75 }, { id: 'cookie-dough', name: 'Cookie dough', emoji: '๐ŸŸก', pairing: 87 }, { id: 'fresh-berries', name: 'Verse bessen', emoji: '๐Ÿซ', pairing: 80 }, { id: 'granola', name: 'Granola', emoji: '๐Ÿฅฃ', pairing: 70 }, { id: 'coconut-flakes', name: 'Kokos vlokken', emoji: '๐Ÿฅฅ', pairing: 68 }, { id: 'almonds', name: 'Geroosterde amandelen', emoji: '๐Ÿฅœ', pairing: 72 }, { id: 'marshmallow', name: 'Marshmallow', emoji: 'โฌœ', pairing: 65 }, { id: 'pistachio-nuts', name: 'Pistaches', emoji: '๐ŸŸข', pairing: 70 }, { id: 'espresso-beans', name: 'Espresso bonen', emoji: '๐ŸŸค', pairing: 68 }, { id: 'mango-chunks', name: 'Mango stukjes', emoji: '๐Ÿฅญ', pairing: 60 }, { id: 'chili', name: 'Chili vlokken', emoji: '๐ŸŒถ๏ธ', pairing: 35 }, ], toppings: [ { id: 'hot-fudge', name: 'Warme chocoladesaus', emoji: '๐Ÿซ', pairing: 95 }, { id: 'caramel-sauce', name: 'Karamel saus', emoji: '๐Ÿฏ', pairing: 92 }, { id: 'whipped-cream', name: 'Slagroom', emoji: '๐Ÿฅ›', pairing: 90 }, { id: 'sprinkles', name: 'Sprinkles', emoji: '๐ŸŒˆ', pairing: 70 }, { id: 'cherry', name: 'Kers', emoji: '๐Ÿ’', pairing: 75 }, { id: 'mint-leaf', name: 'Verse munt', emoji: '๐ŸŒฟ', pairing: 60 }, { id: 'waffle-cone', name: 'Wafel hoorntje', emoji: '๐Ÿฆ', pairing: 88 }, { id: 'lime-zest', name: 'Lime rasp', emoji: '๐Ÿ‹', pairing: 50 }, { id: 'sea-salt', name: 'Zeezout vlokken', emoji: '๐Ÿง‚', pairing: 55 }, { id: 'honey', name: 'Honing', emoji: '๐Ÿฏ', pairing: 72 }, { id: 'berry-compote', name: 'Bessen compote', emoji: '๐Ÿซ', pairing: 78 }, { id: 'balsamic', name: 'Balsamico glazuur', emoji: '๐ŸŸค', pairing: 40 }, ], }; // ============================================================ // FLAVOR PAIRING MATRIX โ€” Voor Mix & Match compatibility scoring // ============================================================ const PAIRING_RULES = { // [flavor][mixin] = modifier (0.5 - 1.5) 'chocolate': { 'choc-chunks': 1.3, 'brownie': 1.4, 'caramel-swirl': 1.2, 'espresso-beans': 1.3, 'chili': 1.2 }, 'vanilla': { 'choc-chunks': 1.2, 'oreo': 1.3, 'cookie-dough': 1.3, 'fresh-berries': 1.2, 'caramel-swirl': 1.2 }, 'strawberry': { 'fresh-berries': 1.3, 'granola': 1.2, 'choc-chunks': 1.1, 'marshmallow': 1.2 }, 'mango': { 'coconut-flakes': 1.3, 'chili': 1.4, 'lime-zest': 1.3, 'fresh-berries': 0.8 }, 'pistachio': { 'pistachio-nuts': 1.4, 'almonds': 1.2, 'choc-chunks': 1.1, 'honey': 1.2 }, 'coffee': { 'espresso-beans': 1.4, 'choc-chunks': 1.3, 'caramel-swirl': 1.3, 'brownie': 1.2 }, 'matcha': { 'almonds': 1.2, 'coconut-flakes': 1.2, 'choc-chunks': 1.0, 'fresh-berries': 1.1 }, 'lemon': { 'fresh-berries': 1.3, 'mint-leaf': 1.2, 'lime-zest': 1.3, 'granola': 1.1 }, 'caramel': { 'caramel-swirl': 1.5, 'pecan': 1.3, 'sea-salt': 1.4, 'brownie': 1.2 }, 'mint': { 'choc-chunks': 1.4, 'brownie': 1.2, 'fresh-berries': 1.0 }, 'banana': { 'choc-chunks': 1.2, 'caramel-swirl': 1.2, 'pecan': 1.1, 'granola': 1.3 }, }; // ============================================================ // GUIDE CONTENT // ============================================================ const GUIDE_CONTENT = { programs: { title: '๐ŸŽ›๏ธ Alle 11 Programma\'s', html: `

De Ninja Swirl by CREAMi heeft 11 programma's: Scooped (9), Soft (2). Hieronder het volledige overzicht. Hieronder het volledige overzicht.

${Object.entries(PROGRAMS).map(([key, p]) => `
${p.icon} ${p.name} ${p.category === 'scooped' ? 'Scooped' : 'Soft'}

${p.desc}

Programma ID: ${key}

`).join('')}
`, }, howitworks: { title: 'โš™๏ธ Hoe de Ninja Swirl Werkt', html: `

De Ninja Swirl by CREAMi gebruikt een uniek systeem: in plaats van een traditioneel ijsmachine met ingebouwde vrieskom, vries je het mengsel in speciale pints. De machine gebruikt dan een roterende paddle (de "Creamifier") om het bevroren blok om te zetten in romig ijs.

Het proces in 5 stappen:

1

Mengsel maken

Blend of roer je ingrediรซnten. Giet in een Ninja Swirl pint tot 2,5 cm van de rand.

2

Vriezen (24 uur)

Plaats de afgedekte pint minimaal 24 uur in de vriezer op -18ยฐC of kouder. Het mengsel moet volledig hard bevroren zijn.

3

Installeren

Plaats de pint in de outer bowl. Sluit het deksel. Voor soft serve: installeer de swirl nozzle. Plaats de outer bowl op het platform en til omhoog.

4

Creamify!

Kies het juiste programma en druk op START. De machine draait ~2-4 minuten. Het geluidsniveau is hoog (80-85dB) โ€” dit is normaal.

5

Serveren & Mix-ins

Haal de pint eruit. Maak een kuiltje in het midden. Voeg mix-ins toe en gebruik het MIX-IN programma. Voor soft serve: dispenseer met de swirl knop.

๐Ÿ’ก Pro Tip: Als het ijs te hard is na het eerste programma, voeg dan 1 eetlepel melk/water toe en gebruik RE-SPIN. Dit is normaal!
`, }, preparation: { title: '๐ŸงŠ Voorbereiding & Pint Management', html: `

Vriezen

Een goede voorbereiding is cruciaal voor perfect resultaat. De pinten moeten minimaal 24 uur in de vriezer. De temperatuur moet consequent -18ยฐC of lager zijn. Een vries-vries combinatie werkt, maar de back-vriezer is betrouwbaarder dan de deur.

โฑ๏ธ Tijdens het wachten: Maak meerdere pinten tegelijk. Label ze met datum en smaak. Zo heb je altijd keuze!

Vulniveau

Vul de pint tot maximaal de MAX lijn (ongeveer 2,5 cm onder de rand). Te vol = het deksel past niet goed en de Creamifier kan het niet verwerken. Te weinig = de paddle bereikt het mengsel niet.

Opslag

Bewaar verwerkte ijs in de pint met het deksel. Bij juiste vriezer-temperatuur blijft het tot 2 weken goed. Voor soft serve: bewaar in de pint met nozzle-cap.

Pint Tips

Timing Cheat Sheet

24h+
Min. vries tijd
2-4 min
Verwerkingstijd
5-10 min
Mix-in tijd
2 weken
Max bewaar (pint)
`, }, cleaning: { title: '๐Ÿงฝ Onderhoud & Schoonmaak', html: `

Dagelijks

Wekelijks / Maandelijks

โš ๏ธ Let op: Gebruik nooit schurende schoonmaakmiddelen of staalwol op de onderdelen. Dit beschadigt de coating en kan de levensduur verkorten.

Speciale onderdelen

Swirl Press: Het oranje/grijze onderdeel in de dispense deksel moet na soft serve grondig worden uitgespoeld. Demonteer het door de dispense cap van het deksel te draaien. Week in warm water als restanten hard zijn.

Nozzle: De nozzle op de pint moet regelmatig worden gecheckt. Als de soft serve niet gelijkmatig uitkomt, kan de nozzle verstopt zijn. Week 15 minuten in warm water en reinig met een zachte borstel.

`, }, troubleshooting: { title: '๐Ÿ”ง Probleemoplossing', html: `

๐Ÿ˜… Het ijs is te hard / brokkelig

Oorzaak: Te lang bevroren of mengsel te droog.
Oplossing: Voeg 1 eetlepel melk of water toe aan de pint en gebruik RE-SPIN. Herhaal indien nodig. Bij hardnekkige gevallen: laat de pint 2-5 minuten op het aanrecht staan.

๐Ÿ’ง Het ijs is te zacht / vloeibaar

Oorzaak: Mengsel niet genoeg bevroren of te veel suiker/alcohol.
Oplossing: Vries de pint opnieuw 2-4 uur. Verminder suiker in volgende batch. Alcohol verlaagt het vriespunt โ€” max 1-2 eetlepels per pint.

๐Ÿ”Š Machine maakt een luid klokgeluid

Oorzaak: Normaal! De Creamifier roteert met hoge snelheid tegen hard bevroren mengsel.
Oplossing: Geen actie nodig. Het geluid neemt af naarmate het ijs zachter wordt. Overweeg oordopjes als de machine naast je staat.

๐Ÿšซ Machine start niet / geeft error

Oorzaak: Outer bowl niet correct geรฏnstalleerd of platform niet omhoog.
Oplossing: Controleer of de outer bowl vastklikt. Til het platform volledig omhoog tot het klikt. De deksel moet pijlsgewijs zijn aangedraaid.

๐Ÿฆ Soft serve komt er niet uit

Oorzaak: Swirl nozzle verstopt of dispense cap niet correct geรฏnstalleerd.
Oplossing: Controleer de swirl press. Demonteer en reinig de nozzle. Zorg dat de dispense cap volledig is aangedraaid. Probeer de RE-SPIN om het ijs zachter te maken.

๐ŸงŠ IJs is ijsachtig / kristallig

Oorzaak: Te weinig vet of suiker in de basis, of niet lang genoeg bevroren.
Oplossing: Gebruik volle melk en room (minstens 35% vet). Suiker en alcohol voorkomen kristalvorming. Vries minimaal 24 uur.

โš ๏ธ "ADD LIQUID" melding

Oorzaak: De machine detecteert dat het mengsel te vast is om te verwerken.
Oplossing: Voeg 1-2 eetlepels vloeistof toe (melk, water, of sap) en druk op RE-SPIN.

`, }, tips: { title: '๐Ÿ’ก Pro Tips โ€” Van Amateur naar IJsmeester', html: `
๐Ÿฅ› Vet is je vriend: Vollere room (35%+) geeft de romigste textuur. Light room werkt maar resulteert in ijsachtiger ijs.
๐Ÿฏ Suiker doet meer dan zoeten: Suiker verlaagt het vriespunt en voorkomt kristallen. Te weinig suiker = hard, kristallig ijs. Te veel = te zacht.
๐Ÿฅƒ Alcohol trick: 1 eetlepel vodka of likeur per pint maakt het ijs smoother zonder het te beรฏnvloeden qua smaak.
โฑ๏ธ 24 uur is een minimum: Bij twijfel: vries langer. 48 uur is ideaal voor een stevige, homogene blok.
๐Ÿ”„ RE-SPIN is normaal: Verwacht dat je bijna altijd een RE-SPIN nodig hebt met extra vloeistof. Dit is hoe de machine werkt โ€” niet een fout.
๐Ÿฅฃ Maak een basis: Maak 3-4 pinten vanille basis tegelijk. Voeg verschillende smaken toe via mix-ins voor variatie zonder telkens te mixen.
๐Ÿ“ Meten is weten: Gebruik een keukenweegschaal. Verschillen van 10% in suiker of vet hebben grote impact op textuur.
๐ŸงŠ Vries temperatuur: Controleer je vriezer met een thermometer. Boven -15ยฐC? Het ijs wordt niet hard genoeg. Onder -22ยฐC? IJs wordt te hard voor RE-SPIN.
๐ŸŽจ Marmeren: Giet twee smaken in de pint (bijv. vanille + chocolade) voor een mooi marmer-effect. Niet volledig mixen!
๐Ÿฅ— Vegan bases: Kokosmelk is de beste vegan base. Voeg 1 eetlepel kokosolie toe voor extra romigheid. Cashewmelk is tweede keus.
`, }, }; // ============================================================ // DAILY TIPS โ€” Roteert dagelijks // ============================================================ const DAILY_TIPS = [ 'Laat je pint 2 minuten op het aanrecht staan voor verwerking. Het ijs bereidt beter bij -15ยฐC dan bij -22ยฐC.', 'Maak meerdere pinten tegelijk. Eรฉn voorraad = keuze elke dag van een andere smaak!', 'Kokosmelk + vanille = de beste vegan base. Voeg kokosolie toe voor extra romigheid.', 'Een scheutje vodka (1 el) in je sorbet maakt hem smoother zonder beรฏnvloeding van smaak.', 'RE-SPIN is niet een foutmelding โ€” het is hoe de CREAMi werkt. Verwacht het, omarm het.', 'Voor keto iJs: allulose bevriest zachter dan erythritol. Minder kristallen, betere textuur.', 'Label je pinten met datum en smaak. Een niet-geverifieerde pint is een verrassingspudding.', 'Witte chocolade stukjes in een aardbeieniJs = een hemelse combinatie. Probeer het!', 'Kaneel in je vanille-basis geeft een subtiele warmte. Perfect voor herfst.', 'Espresso-poeder in je chocolade-basis? Ja. Het verdiept de chocoladesmaak aanzienlijk.', 'Marmeren: schenk twee smaken in de pint zonder te mixen. Prachtig effect na het spoelen.', 'Je kan meer pinten kopen. Dit is het geheim: altijd 6-8 pinten in de vriezer = keuze.', 'Zout is niet alleen voor hartig. Een snufje in je iJs-basis maakt alle smaken helderder.', 'Voor Dole Whip thuis: alleen ananas + citroen. Geen melk, geen room. Puur fruit.', ]; // ============================================================ // QUIZ DATA โ€” "Welk type past bij jou?" // ============================================================ const QUIZ_QUESTIONS = [ { question: 'Hoe wil je je iJs eten?', options: [ { text: '๐Ÿฆ Uit een hoorntje, zacht en draaiend', type: 'soft_serve' }, { text: '๐Ÿจ Met een lepel uit een bakje', type: 'ice_cream' }, { text: '๐Ÿฅค Drinkend door een rietje', type: 'milkshake' }, { text: '๐Ÿ“ Fruiti en fruitig', type: 'fruiti' }, ], }, { question: 'Wat is je belangrijkste prio?', options: [ { text: '๐Ÿฅ› Licht en gezond', type: 'lite_ice_cream' }, { text: '๐ŸŒฑ Vegan / zuivelvrij', type: 'sorbet' }, { text: '๐Ÿซ Max smaak, romigheid', type: 'gelato' }, { text: '๐Ÿฅ› Licht en fris', type: 'frozen_yogurt' }, ], }, { question: 'Hoeveel tijd wil je besteden aan voorbereiding?', options: [ { text: 'โšก Minimaal โ€” snel en simppel', type: 'soft_serve' }, { text: '๐Ÿ‘ฉโ€๐Ÿณ Ik neem de tijd voor perfectie', type: 'gelato' }, { text: '๐Ÿฅ„ Gemiddeld is prima', type: 'ice_cream' }, { text: '๐Ÿคท Maakt niet uit', type: 'frozen_yogurt' }, ], }, ]; // ============================================================ // APPLICATION STATE // ============================================================ const state = { currentTab: 'dashboard', recipeFilter: { type: 'all', diet: null, search: '', sort: 'popular' }, favorites: [], favFilter: 'all', mmSelections: { base: null, flavor: null, mixin: null, topping: null }, guideSection: 'programs', quizAnswers: [], darkMode: localStorage.getItem('swirl-theme') === 'dark', }; // ============================================================ // INIT // ============================================================ document.addEventListener('DOMContentLoaded', () => { loadFavorites(); applyTheme(); setupTabs(); setupDarkMode(); setupRecipeFilters(); setupBuilder(); setupGuide(); setupFavorites(); setupQuiz(); renderDashboard(); renderRecipes(); renderGuide(); }); // ============================================================ // THEME // ============================================================ function applyTheme() { document.documentElement.setAttribute('data-theme', state.darkMode ? 'dark' : 'light'); document.getElementById('darkModeToggle').textContent = state.darkMode ? 'โ˜€๏ธ' : '๐ŸŒ™'; } function setupDarkMode() { document.getElementById('darkModeToggle').addEventListener('click', () => { state.darkMode = !state.darkMode; localStorage.setItem('swirl-theme', state.darkMode ? 'dark' : 'light'); applyTheme(); }); } // ============================================================ // TABS // ============================================================ function setupTabs() { document.querySelectorAll('.tab-btn').forEach(btn => { btn.addEventListener('click', () => switchTab(btn.dataset.tab)); }); } function switchTab(tabName) { state.currentTab = tabName; document.querySelectorAll('.tab-btn').forEach(b => { b.classList.toggle('active', b.dataset.tab === tabName); b.setAttribute('aria-selected', b.dataset.tab === tabName); }); document.querySelectorAll('.tab-panel').forEach(p => p.classList.remove('active')); const panel = document.getElementById('tab-' + tabName); if (panel) panel.classList.add('active'); if (tabName === 'favorites') renderFavorites(); if (tabName === 'dashboard') renderDashboard(); } // ============================================================ // DASHBOARD // ============================================================ function renderDashboard() { // Stats document.getElementById('stat-total-recipes').textContent = RECIPES.length; document.getElementById('stat-total-favs').textContent = state.favorites.length; // Featured recipes (top 4 by popularity) const featured = [...RECIPES].sort((a, b) => b.popularity - a.popularity).slice(0, 4); const featuredHtml = featured.map(r => ` `).join(''); document.getElementById('dash-featured-recipes').innerHTML = featuredHtml; // Quick types const quickTypes = ['ice_cream', 'gelato', 'sorbet', 'frozen_yogurt', 'soft_serve', 'fruiti']; const qtHtml = quickTypes.map(t => `
${PROGRAMS[t].icon} ${PROGRAMS[t].name}
`).join(''); document.getElementById('dash-quick-types').innerHTML = qtHtml; // Daily tip const tipIndex = Math.floor(Date.now() / 86400000) % DAILY_TIPS.length; document.getElementById('dash-tip').innerHTML = `๐Ÿ’ก Tip: ${DAILY_TIPS[tipIndex]}`; } function filterAndGo(type) { state.recipeFilter.type = type; document.querySelectorAll('#type-filters .filter-btn').forEach(b => { b.classList.toggle('active', b.dataset.type === type); }); switchTab('recipes'); renderRecipes(); } // ============================================================ // QUIZ // ============================================================ function setupQuiz() { document.getElementById('quiz-restart').addEventListener('click', () => { state.quizAnswers = []; renderQuiz(); }); renderQuiz(); } function renderQuiz() { const container = document.getElementById('quiz-content'); const idx = state.quizAnswers.length; if (idx >= QUIZ_QUESTIONS.length) { // Calculate result const scores = {}; state.quizAnswers.forEach(type => { scores[type] = (scores[type] || 0) + 1; }); const winner = Object.entries(scores).sort((a, b) => b[1] - a[1])[0][0]; const prog = PROGRAMS[winner]; container.innerHTML = `
${prog.icon}

Jouw match: ${prog.name}!

${prog.desc}

`; return; } const q = QUIZ_QUESTIONS[idx]; container.innerHTML = `
${idx + 1}. ${q.question}
${q.options.map(o => `
${o.text}
`).join('')}
${QUIZ_QUESTIONS.map((_, i) => `
`).join('')}
`; } // Expose for inline onclick window.answerQuiz = function(type) { state.quizAnswers.push(type); renderQuiz(); }; // ============================================================ // RECIPES // ============================================================ function setupRecipeFilters() { // Type filters document.querySelectorAll('#type-filters .filter-btn').forEach(btn => { btn.addEventListener('click', () => { document.querySelectorAll('#type-filters .filter-btn').forEach(b => b.classList.remove('active')); btn.classList.add('active'); state.recipeFilter.type = btn.dataset.type; renderRecipes(); }); }); // Diet chips document.querySelectorAll('[data-diet]').forEach(chip => { chip.addEventListener('click', () => { chip.classList.toggle('active'); // Collect active diets const diets = []; document.querySelectorAll('[data-diet].active').forEach(c => diets.push(c.dataset.diet)); state.recipeFilter.diet = diets.length ? diets : null; renderRecipes(); }); }); // Search document.getElementById('recipe-search').addEventListener('input', (e) => { state.recipeFilter.search = e.target.value.toLowerCase(); renderRecipes(); }); // Sort document.getElementById('sort-select').addEventListener('change', (e) => { state.recipeFilter.sort = e.target.value; renderRecipes(); }); // Modal close document.querySelector('#recipe-modal .modal-close').addEventListener('click', closeRecipeModal); document.getElementById('recipe-modal').addEventListener('click', (e) => { if (e.target.id === 'recipe-modal') closeRecipeModal(); }); } function getFilteredRecipes() { let list = [...RECIPES]; // Type filter if (state.recipeFilter.type !== 'all') { list = list.filter(r => r.type === state.recipeFilter.type); } // Diet filters if (state.recipeFilter.diet) { list = list.filter(r => { return state.recipeFilter.diet.every(d => r.diet.includes(d)); }); } // Search if (state.recipeFilter.search) { const s = state.recipeFilter.search; list = list.filter(r => r.name.toLowerCase().includes(s) || r.description.toLowerCase().includes(s) || r.ingredients.some(i => i.toLowerCase().includes(s)) || r.tags.some(t => t.toLowerCase().includes(s)) ); } // Sort switch (state.recipeFilter.sort) { case 'easy': list.sort((a, b) => a.difficultyScore - b.difficultyScore); break; case 'quick': list.sort((a, b) => a.prepTime.localeCompare(b.prepTime)); break; case 'rating': list.sort((a, b) => b.rating - a.rating); break; case 'name': list.sort((a, b) => a.name.localeCompare(b.name)); break; default: list.sort((a, b) => b.popularity - a.popularity); } return list; } function renderRecipes() { const list = getFilteredRecipes(); const grid = document.getElementById('recipe-grid'); const count = document.getElementById('recipe-count'); count.textContent = `${list.length} recept${list.length !== 1 ? 'en' : ''} gevonden`; if (list.length === 0) { grid.innerHTML = '

๐Ÿ”

Geen recepten gevonden

Pas je filters aan of probeer een andere zoekterm.

'; return; } grid.innerHTML = list.map(r => { const isFav = state.favorites.includes(r.id); const dietTags = r.diet.map(d => `${dietLabel(d)}`).join(''); return `
${r.emoji}

${r.name}

${r.description}

${PROGRAMS[r.type].name} ${dietTags}
`; }).join(''); } function dietLabel(diet) { const labels = { vegan: '๐ŸŒฑ Vegan', dairy_free: '๐Ÿšซ๐Ÿฅ› Lactosevrij', low_sugar: '๐Ÿ“‰ Suikerarm', keto: '๐Ÿฅ‘ Keto', gluten_free: '๐ŸŒพ Glutenvrij', beginner: 'โญ Beginner', cocktail: '๐Ÿธ Met Alcohol', }; return labels[diet] || diet; } window.openRecipe = function(id) { const r = RECIPES.find(x => x.id === id); if (!r) return; const prog = PROGRAMS[r.type]; const isFav = state.favorites.includes(r.id); const modal = document.getElementById('recipe-modal'); const body = document.getElementById('recipe-detail-body'); body.innerHTML = `
${r.emoji}

${r.name}

${r.description}

${prog.name} ${r.diet.map(d => `${dietLabel(d)}`).join('')}
โฑ๏ธ
${r.prepTime}
Voorbereiding
๐ŸงŠ
${r.freezeTime}
Vriezen
๐Ÿฝ๏ธ
${r.servings}
Porties
๐Ÿ“Š
${r.difficulty}
Niveau
โญ
${r.rating}
Beoordeling
๐ŸŽ›๏ธ
${r.program}
Programma

๐Ÿ“‹ Ingrediรซnten

๐Ÿ‘จโ€๐Ÿณ Bereiding

    ${r.steps.map(s => `
  1. ${s}
  2. `).join('')}

๐Ÿซ Mix-in Suggesties

${r.mixins.map(m => `${m}`).join('')}
${r.pairings && r.pairings.length > 0 ? `

๐Ÿค Lekker in combinatie met

${r.pairings.map(pid => { const p = RECIPES.find(x => x.id === pid); return p ? `${p.emoji} ${p.name}` : ''; }).join('')}
` : ''}

๐Ÿ“Š Voeding (per portie)

${r.nutrition.calories}
kcal
${r.nutrition.fat}
Vet
${r.nutrition.carbs}
Koolhydr.
${r.nutrition.protein}
Eiwit
๐Ÿ’ก Pro Tip: ${r.tips}
`; modal.classList.remove('hidden'); }; function closeRecipeModal() { document.getElementById('recipe-modal').classList.add('hidden'); } window.closeRecipeModal = closeRecipeModal; window.toggleFav = function(id, btn) { const idx = state.favorites.indexOf(id); if (idx > -1) { state.favorites.splice(idx, 1); btn.textContent = 'โ˜†'; btn.classList.remove('active'); } else { state.favorites.push(id); btn.textContent = 'โญ'; btn.classList.add('active'); } saveFavorites(); updateFavCount(); }; window.toggleFavDetail = function(id) { const idx = state.favorites.indexOf(id); if (idx > -1) { state.favorites.splice(idx, 1); } else { state.favorites.push(id); } saveFavorites(); updateFavCount(); // Re-render detail to update button openRecipe(id); }; function updateFavCount() { document.getElementById('stat-total-favs').textContent = state.favorites.length; } // ============================================================ // FAVORITES (localStorage) // ============================================================ function loadFavorites() { try { const saved = localStorage.getItem('swirl-favorites'); if (saved) state.favorites = JSON.parse(saved); } catch (e) { state.favorites = []; } } function saveFavorites() { localStorage.setItem('swirl-favorites', JSON.stringify(state.favorites)); } function setupFavorites() { document.querySelectorAll('[data-fav-filter]').forEach(btn => { btn.addEventListener('click', () => { document.querySelectorAll('[data-fav-filter]').forEach(b => b.classList.remove('active')); btn.classList.add('active'); state.favFilter = btn.dataset.favFilter; renderFavorites(); }); }); document.getElementById('fav-clear').addEventListener('click', () => { if (confirm('Weet je zeker dat je alle favorieten wilt wissen?')) { state.favorites = []; saveFavorites(); updateFavCount(); renderFavorites(); } }); } function renderFavorites() { const grid = document.getElementById('fav-grid'); const empty = document.getElementById('fav-empty'); if (state.favorites.length === 0) { grid.innerHTML = ''; empty.classList.remove('hidden'); return; } empty.classList.add('hidden'); const list = state.favorites .map(id => RECIPES.find(r => r.id === id)) .filter(r => r); grid.innerHTML = list.map(r => { const isFav = true; return `
โญ FAV
${r.emoji}

${r.name}

${r.description}

${PROGRAMS[r.type].name}
`; }).join(''); } // ============================================================ // MIX & MATCH // ============================================================ function setupMixMatch() { renderMixMatchOptions(); document.getElementById('mm-generate').addEventListener('click', generateMixMatch); document.getElementById('mm-random').addEventListener('click', randomMixMatch); document.getElementById('mm-clear').addEventListener('click', clearMixMatch); } function renderMixMatchOptions() { const renderColumn = (containerId, category, dataKey) => { const container = document.getElementById(containerId); container.innerHTML = MIXMATCH_DATA[dataKey].map(item => `
${item.emoji} ${item.name}
`).join(''); }; renderColumn('mm-base', 'base', 'bases'); renderColumn('mm-flavor', 'flavor', 'flavors'); renderColumn('mm-mixin', 'mixin', 'mixins'); renderColumn('mm-topping', 'topping', 'toppings'); } window.selectMMOption = function(category, id, name, emoji) { state.mmSelections[category] = { id, name, emoji }; // Update UI const selectedEl = document.getElementById(`mm-selected-${category}`); selectedEl.innerHTML = `${emoji} ${name}`; // Update option styling document.querySelectorAll(`.mm-option[data-category="${category}"]`).forEach(opt => { opt.classList.toggle('selected', opt.dataset.id === id); }); }; function calculateCompatibility() { const { flavor, mixin, topping } = state.mmSelections; let score = 60; // Base score // Flavor + Mixin pairing if (flavor && mixin && PAIRING_RULES[flavor.id] && PAIRING_RULES[flavor.id][mixin.id]) { score *= PAIRING_RULES[flavor.id][mixin.id]; } else if (flavor) { // Use default pairing score from data const flavorData = MIXMATCH_DATA.flavors.find(f => f.id === flavor.id); if (flavorData) score = (score + flavorData.pairing) / 1.5; } // Topping bonus if (topping) { const toppingData = MIXMATCH_DATA.toppings.find(t => t.id === topping.id); if (toppingData) score += (toppingData.pairing - 50) * 0.3; } // Clamp return Math.min(98, Math.max(45, Math.round(score))); } function recommendProgram() { const { base, flavor, mixin } = state.mmSelections; // Logic to recommend the best program if (!base) return PROGRAMS.ice_cream; if (base.id === 'greek-yogurt') return PROGRAMS.frozen_yogurt; if (base.id === 'protein-shake') return PROGRAMS.lite_ice_cream; if (base.id === 'heavy-cream') return PROGRAMS.ice_cream; if (base.id === 'coconut-milk' || base.id === 'almond-milk' || base.id === 'oat-milk') { if (flavor && ['mango', 'lemon', 'strawberry'].includes(flavor.id)) return PROGRAMS.sorbet; return PROGRAMS.ice_cream; } return PROGRAMS.ice_cream; } function generateMixMatch() { const { base, flavor, mixin, topping } = state.mmSelections; if (!base && !flavor && !mixin && !topping) { showMMResult('

Selecteer minimaal รฉรฉn optie om een recept te genereren!

'); return; } const compat = calculateCompatibility(); const program = recommendProgram(); const compatLabel = compat >= 85 ? '๐ŸŒŸ Perfecte match!' : compat >= 70 ? '๐Ÿ‘ Goede combi!' : '๐Ÿค” Avant-garde...'; const compatColor = compat >= 85 ? 'var(--mint-primary)' : compat >= 70 ? 'var(--mango)' : 'var(--berry)'; // Build ingredient list const ingredients = []; if (base) { const baseData = MIXMATCH_DATA.bases.find(b => b.id === base.id); ingredients.push(`2 kopjes ${baseData.name.toLowerCase()} (473ml)`); } else { ingredients.push('2 kopjes zware room (473ml)'); } ingredients.push('1 kopje volle melk of plantaardige melk (237ml)'); ingredients.push('โ…” kopje suiker of natuurlijke zoetstof (133g)'); if (flavor) { const flavorIngredients = { vanilla: '1 eetlepel vanille-extract', chocolate: 'โ…“ kopje cacaopoeder (33g)', strawberry: '1 kopje verse aardbeien, geblend', mango: '1 kopje mango puree', pistachio: '1 kopje gepureerde pistaches', coffee: '2 eetlepels oploskoffie of espresso', matcha: '2 eetlepels matcha poeder', lemon: '3 eetlepels vers citroensap + zeste', lavender: '2 theelepels gedroogde lavendelbloemen', caramel: '3 eetlepels karamelsiroop', mint: '1 theelepel pepermunt extract', blackberry: '1 kopje bosbes puree', banana: '2 rijpe bananen, geprakt', rose: '1 theelepel rozenwater', cardamom: '1 theelepel gemalen kardemom', espresso: '2 eetlepels espresso, afgekoeld', }; if (flavorIngredients[flavor.id]) ingredients.push(flavorIngredients[flavor.id]); } if (mixin) ingredients.push(`${mixin.emoji} ${mixin.name} (naar smaak)`); ingredients.push('Snufje zout'); const recipeName = [ flavor ? flavor.name : 'Romige', base && base.id === 'greek-yogurt' ? 'Frozen Yogurt' : 'IJs', mixin ? `met ${mixin.name}` : '', ].filter(Boolean).join(' '); showMMResult(`
${flavor ? flavor.emoji : '๐Ÿฆ'}

${recipeName}

${base ? base.emoji + ' ' + base.name : ''} ${base && flavor ? ' + ' : ''} ${flavor ? flavor.emoji + ' ' + flavor.name : ''} ${mixin ? ' + ' + mixin.emoji + ' ' + mixin.name : ''} ${topping ? ' + ' + topping.emoji + ' ' + topping.name : ''}

${compat}% ${compatLabel}
๐ŸŽ›๏ธ Aanbevolen programma: ${program.name}

๐Ÿ“‹ Jouw Recept

๐Ÿ‘จโ€๐Ÿณ Bereiding

  1. Mix alle ingrediรซnten in een kom. Roer tot een gladde massa.
  2. Giet in een Ninja Swirl pint tot 2,5 cm van de rand.
  3. Plaats de deksel en vries minimaal 24 uur.
  4. Plaats in de outer bowl, selecteer "${program.name}" en START.
  5. Bij te hard iJs: voeg 1 el melk toe en RE-SPIN.
  6. ${mixin ? `Voeg ${mixin.name} toe via MIX-IN functie. ` : ''}${topping ? `Garneer met ${topping.name}.` : 'Serveer direct.'}
`); } function showMMResult(html) { document.getElementById('mm-result-container').innerHTML = html; } function randomMixMatch() { clearMixMatch(); const pick = arr => arr[Math.floor(Math.random() * arr.length)]; const base = pick(MIXMATCH_DATA.bases); const flavor = pick(MIXMATCH_DATA.flavors); const mixin = pick(MIXMATCH_DATA.mixins); const topping = pick(MIXMATCH_DATA.toppings); selectMMOption('base', base.id, base.name, base.emoji); selectMMOption('flavor', flavor.id, flavor.name, flavor.emoji); selectMMOption('mixin', mixin.id, mixin.name, mixin.emoji); selectMMOption('topping', topping.id, topping.name, topping.emoji); setTimeout(generateMixMatch, 300); } function clearMixMatch() { state.mmSelections = { base: null, flavor: null, mixin: null, topping: null }; document.querySelectorAll('.mm-option').forEach(o => o.classList.remove('selected')); document.querySelectorAll('[id^="mm-selected-"]').forEach(el => el.innerHTML = 'โ€”'); showMMResult(''); } window.saveMMFavorite = function() { const { base, flavor, mixin, topping } = state.mmSelections; const compat = calculateCompatibility(); const custom = { id: 'custom-' + Date.now(), type: 'custom', name: [flavor ? flavor.name : 'Romige', 'IJs', mixin ? `met ${mixin.name}` : ''].filter(Boolean).join(' '), emoji: flavor ? flavor.emoji : '๐Ÿฆ', description: `Eigen mix โ€” ${compat}% compatibiliteit`, selections: { ...state.mmSelections }, compat, }; // Store in favorites as custom let customs = []; try { customs = JSON.parse(localStorage.getItem('swirl-custom') || '[]'); } catch(e) { customs = []; } customs.push(custom); localStorage.setItem('swirl-custom', JSON.stringify(customs)); // Also add to general favorites display const note = document.createElement('div'); note.className = 'tip-box mt-1'; note.innerHTML = 'โœ… Opgeslagen! Je creatie is toegevoegd aan favorieten.'; document.querySelector('.mm-result-card').appendChild(note); }; // ============================================================ // GUIDE // ============================================================ function setupGuide() { document.querySelectorAll('.guide-nav-card').forEach(card => { card.addEventListener('click', () => { document.querySelectorAll('.guide-nav-card').forEach(c => c.classList.remove('active')); card.classList.add('active'); state.guideSection = card.dataset.guide; renderGuide(); }); }); } function renderGuide() { const content = GUIDE_CONTENT[state.guideSection]; if (!content) return; document.getElementById('guide-content').innerHTML = `

${content.title}

${content.html} `; } // ============================================================ // RECEPT BOUWER โ€” Wizard Logic // ============================================================ const BUILDER_FLAVORS = [ { id: 'vanilla', name: 'Vanille', emoji: '๐ŸŒธ', keywords: ['vanil', 'vanilla'] }, { id: 'chocolate', name: 'Chocolade', emoji: '๐Ÿซ', keywords: ['choc', 'cacao', 'nutella', 'cocoa'] }, { id: 'caramel', name: 'Karamel', emoji: '๐Ÿฏ', keywords: ['caramel', 'dulce', 'butterscotch'] }, { id: 'strawberry', name: 'Aardbei', emoji: '๐Ÿ“', keywords: ['aardbei', 'strawberr'] }, { id: 'berry', name: 'Bessen', emoji: '๐Ÿซ', keywords: ['bes', 'berr', 'framboos', 'bosbes', 'blueberr', 'raspberr'] }, { id: 'mango', name: 'Mango', emoji: '๐Ÿฅญ', keywords: ['mango'] }, { id: 'tropical', name: 'Tropisch', emoji: '๐ŸŒด', keywords: ['passie', 'passion', 'ananas', 'pineapple', 'dragon', 'lychee', 'tropi'] }, { id: 'coffee', name: 'Koffie', emoji: 'โ˜•', keywords: ['koffie', 'coffee', 'espresso', 'cappuccino', 'tiramisu'] }, { id: 'tea', name: 'Thee', emoji: '๐Ÿซ–', keywords: ['tea', 'thee', 'earl', 'grey', 'matcha', 'rooibos', 'chai'] }, { id: 'nut', name: 'Noten', emoji: '๐Ÿฅœ', keywords: ['pistache', 'pistachio', 'hazelnut', 'hazel', 'amandel', 'almond', 'pecan', 'walnut', 'pinda', 'peanut', 'sesam', 'sesame', 'macadamia'] }, { id: 'mint', name: 'Munt', emoji: '๐ŸŒฟ', keywords: ['mint', 'munt', 'pepperm'] }, { id: 'citrus', name: 'Citrus', emoji: '๐Ÿ‹', keywords: ['citroen', 'lemon', 'lime', 'yuzu', 'limoen'] }, { id: 'floral', name: 'Bloemig', emoji: '๐Ÿ’œ', keywords: ['lavendel', 'lavender', 'roos', 'rose', 'hibiscus', 'blossom'] }, { id: 'spice', name: 'Kruidig', emoji: '๐ŸŸค', keywords: ['kaneel', 'cinnamon', 'pumpkin', 'speculaas', 'ginger', 'gember', 'kardemom', 'curry', 'speculoos'] }, { id: 'cake', name: 'Cake/Dessert', emoji: '๐Ÿฐ', keywords: ['cheesecake', 'cake', 'red velvet', 'cinnamon roll', 'pecan pie', 'carrot', 's\'more', 'cookie'] }, { id: 'alcohol', name: 'Met Alcohol', emoji: '๐Ÿท', keywords: ['rosรฉ', 'wine', 'wijn', 'rum', 'mojito', 'aperol', 'prosecco', 'stout', 'beer', 'bier', 'amaretto'] }, { id: 'cocktail', name: 'Cocktail', emoji: '๐Ÿธ', keywords: ['margarita', 'daiquiri', 'mojito', 'colada', 'aperol', 'negroni', 'cosmopolitan', 'mudslide', 'paloma', 'bellini', 'cocktail'] }, { id: 'wine', name: 'Wijn', emoji: '๐Ÿท', keywords: ['rosรฉ', 'rose', 'prosecco', 'sangria', 'bellini', 'mimosa', 'port', 'riesling', 'moscato', 'mulled', 'sorb', 'wine', 'wijn'] }, ]; const BUILDER_MIXINS = [ { id: 'none', name: 'Geen', emoji: '๐Ÿšซ', desc: 'Puur iJs' }, { id: 'choc-chunks', name: 'Chocolade stukjes', emoji: '๐Ÿซ', desc: 'Knapperig' }, { id: 'brownie', name: 'Brownie', emoji: '๐ŸŸซ', desc: 'Fudgy' }, { id: 'oreo', name: 'Oreo', emoji: '๐Ÿช', desc: 'Klassiek' }, { id: 'caramel-swirl', name: 'Karamel swirl', emoji: '๐Ÿฏ', desc: 'Zoet' }, { id: 'nuts', name: 'Noten', emoji: '๐Ÿฅœ', desc: 'Knapperig' }, { id: 'cookie-dough', name: 'Cookie dough', emoji: '๐ŸŸก', desc: 'Zacht' }, { id: 'fresh-fruit', name: 'Vers fruit', emoji: '๐Ÿ“', desc: 'Fris' }, { id: 'granola', name: 'Granola', emoji: '๐Ÿฅฃ', desc: 'Knapperig' }, { id: 'coconut', name: 'Kokos', emoji: '๐Ÿฅฅ', desc: 'Tropisch' }, { id: 'marshmallow', name: 'Marshmallow', emoji: 'โฌœ', desc: 'Zacht' }, { id: 'cake-bits', name: 'Cake stukjes', emoji: '๐Ÿฐ', desc: 'Zoet' }, ]; const BUILDER_DIETS = [ { id: 'none', name: 'Geen voorkeur', emoji: 'โœ…', desc: ' Alles is goed' }, { id: 'vegan', name: 'Vegan', emoji: '๐ŸŒฑ', desc: 'Plantaardig' }, { id: 'dairy_free', name: 'Lactosevrij', emoji: '๐Ÿšซ๐Ÿฅ›', desc: 'Geen zuivel' }, { id: 'low_sugar', name: 'Suikerarm', emoji: '๐Ÿ“‰', desc: 'Minder suiker' }, { id: 'keto', name: 'Keto', emoji: '๐Ÿฅ‘', desc: 'Koolhydraatarm' }, { id: 'gluten_free', name: 'Glutenvrij', emoji: '๐ŸŒพ', desc: 'Geen gluten' }, ]; const BUILDER_TYPES = Object.entries(PROGRAMS).map(([key, p]) => ({ id: key, name: p.name, emoji: p.icon, desc: p.desc, category: p.category, })); function setupBuilder() { state.builderStep = 1; state.builderSelections = { type: null, flavor: null, mixins: [], diet: null }; renderBuilderType(); renderBuilderFlavor(); renderBuilderMixin(); renderBuilderDiet(); document.getElementById('builder-prev').addEventListener('click', () => builderGoTo(state.builderStep - 1)); document.getElementById('builder-next').addEventListener('click', () => { if (state.builderStep < 4) { builderGoTo(state.builderStep + 1); } else { runBuilderSearch(); } }); document.getElementById('builder-find').addEventListener('click', runBuilderSearch); } function builderGoTo(step) { state.builderStep = step; // Update pages document.querySelectorAll('.builder-page').forEach(p => p.classList.remove('active')); const page = document.getElementById('builder-page-' + step); if (page) page.classList.add('active'); // Update progress dots document.querySelectorAll('.builder-step-dot').forEach((dot, i) => { dot.classList.toggle('active', i + 1 <= step); dot.classList.toggle('done', i + 1 < step); }); // Update buttons document.getElementById('builder-prev').disabled = step === 1; const nextBtn = document.getElementById('builder-next'); const findBtn = document.getElementById('builder-find'); if (step === 4) { nextBtn.classList.add('hidden'); findBtn.classList.remove('hidden'); } else { nextBtn.classList.remove('hidden'); findBtn.classList.add('hidden'); } updateBuilderSelections(); } function renderBuilderType() { const grid = document.getElementById('builder-type-grid'); grid.innerHTML = BUILDER_TYPES.map(t => `
${t.emoji}
${t.name}
${t.desc}
`).join(''); } function selectBuilderType(typeId) { state.builderSelections.type = typeId; document.querySelectorAll('#builder-type-grid .builder-card').forEach(c => { c.classList.toggle('selected', c.dataset.type === typeId); }); updateBuilderSelections(); // Auto-advance after short delay setTimeout(() => { if (state.builderStep === 1) builderGoTo(2); }, 300); }; function renderBuilderFlavor() { const grid = document.getElementById('builder-flavor-grid'); grid.innerHTML = BUILDER_FLAVORS.map(f => `
${f.emoji}
${f.name}
`).join(''); } function selectBuilderFlavor(flavorId) { state.builderSelections.flavor = flavorId; document.querySelectorAll('#builder-flavor-grid .builder-card').forEach(c => { c.classList.toggle('selected', c.dataset.flavor === flavorId); }); updateBuilderSelections(); }; function renderBuilderMixin() { const grid = document.getElementById('builder-mixin-grid'); grid.innerHTML = BUILDER_MIXINS.map(m => `
${m.emoji}
${m.name}
${m.desc}
`).join(''); } function toggleBuilderMixin(mixinId) { const arr = state.builderSelections.mixins; if (mixinId === 'none') { state.builderSelections.mixins = []; } else { const idx = arr.indexOf(mixinId); if (idx > -1) { arr.splice(idx, 1); } else { if (arr.length >= 3) return; arr.push(mixinId); } } // Update visual document.querySelectorAll('#builder-mixin-grid .builder-card').forEach(c => { const id = c.dataset.mixin; if (id === 'none') { c.classList.toggle('selected', arr.length === 0); } else { c.classList.toggle('selected', arr.includes(id)); } }); updateBuilderSelections(); }; function renderBuilderDiet() { const grid = document.getElementById('builder-diet-grid'); grid.innerHTML = BUILDER_DIETS.map(d => `
${d.emoji}
${d.name}
${d.desc}
`).join(''); // Default select 'none' selectBuilderDiet('none'); } function selectBuilderDiet(dietId) { state.builderSelections.diet = dietId === 'none' ? null : dietId; document.querySelectorAll('#builder-diet-grid .builder-card').forEach(c => { c.classList.toggle('selected', c.dataset.diet === dietId); }); updateBuilderSelections(); }; function updateBuilderSelections() { const s = state.builderSelections; const parts = []; if (s.type) { const t = BUILDER_TYPES.find(x => x.id === s.type); parts.push(`${t.emoji} ${t.name}`); } if (s.flavor) { const f = BUILDER_FLAVORS.find(x => x.id === s.flavor); parts.push(`${f.emoji} ${f.name}`); } if (s.mixins.length > 0) { const names = s.mixins.map(id => { const m = BUILDER_MIXINS.find(x => x.id === id); return m ? `${m.emoji}` : ''; }).join(''); parts.push(`Mix: ${names}`); } if (s.diet) { const d = BUILDER_DIETS.find(x => x.id === s.diet); if (d) parts.push(`${d.emoji} ${d.name}`); } document.getElementById('builder-selections').innerHTML = parts.length ? parts.map(p => `${p}`).join('') : 'Maak een keuze...'; } function runBuilderSearch() { const sel = state.builderSelections; const results = document.getElementById('builder-results'); if (!sel.type && !sel.flavor) { results.innerHTML = '

๐ŸŽฏ

Kies minimaal een type en smaak

Ga terug om je keuzes te maken.

'; return; } // Get flavor keywords for matching const flavorData = BUILDER_FLAVORS.find(f => f.id === sel.flavor); const keywords = flavorData ? flavorData.keywords : []; // Search matching recipes let matches = RECIPES.filter(r => { // Type must match if selected if (sel.type && r.type !== sel.type) return false; // Diet must match if selected if (sel.diet && !r.diet.includes(sel.diet)) return false; // Flavor keywords match against name, description, ingredients if (keywords.length > 0) { const haystack = (r.name + ' ' + r.description + ' ' + r.ingredients.join(' ') + ' ' + r.tags.join(' ')).toLowerCase(); return keywords.some(kw => haystack.includes(kw)); } return true; }); // Sort by popularity matches.sort((a, b) => b.popularity - a.popularity); let html = ''; // Database matches if (matches.length > 0) { html += `

โœจ ${matches.length} matchende recept${matches.length > 1 ? 'en' : ''} gevonden!

Direct te maken uit de database:

`; html += '
'; html += matches.map(r => { const isFav = state.favorites.includes(r.id); const dietTags = r.diet.map(d => `${dietLabel(d)}`).join(''); return `
${r.emoji}

${r.name}

${r.description}

${PROGRAMS[r.type] ? PROGRAMS[r.type].name : r.type} ${dietTags}
`; }).join(''); html += '
'; } // Generated recipe const genHtml = generateBuilderRecipe(sel, flavorData, matches.length === 0); if (genHtml) { if (matches.length === 0) { html += `

๐ŸŽฏ Geen exacte match โ€” hier is een gegenereerd recept!

Op basis van jouw keuzes samengesteld:

`; } else { html += `

๐ŸŽฒ Of laat ons iets nieuws genereren...

`; } html += genHtml; } if (!html) { html = '

๐Ÿคท

Geen recepten gevonden

Probeer andere keuzes.

'; } results.innerHTML = html; results.scrollIntoView({ behavior: 'smooth', block: 'start' }); } function generateBuilderRecipe(sel, flavorData, isPrimary) { if (!sel.type && !flavorData) return ''; const prog = PROGRAMS[sel.type] || PROGRAMS.ice_cream; const flavorName = flavorData ? flavorData.name : 'Romige'; const flavorEmoji = flavorData ? flavorData.emoji : '๐Ÿฆ'; // Base ingredients let base, liquid; if (sel.diet === 'vegan' || sel.diet === 'dairy_free') { base = '2 kopjes kokosmelk (473ml)'; liquid = 'ยฝ kopje amandelmelk (120ml)'; } else if (sel.diet === 'keto' || sel.diet === 'low_sugar') { base = '2 kopjes zware room (473ml)'; liquid = '1 kopje amandelmelk, ongezoet (237ml)'; } else if (sel.type === 'frozen_yogurt') { base = '1 pint (473ml) Griekse yoghurt'; liquid = 'ยผ kopje melk (60ml)'; } else { base = '2 kopjes zware room (473ml)'; liquid = '1 kopje volle melk (237ml)'; } // Sweetener const sweetener = (sel.diet === 'keto') ? 'โ…“ kopje erythritol of allulose (66g)' : (sel.diet === 'vegan') ? 'โ…“ kopje agave siroop of suiker (66g)' : 'โ…” kopje suiker (133g)'; // Flavor additions const flavorMap = { vanilla: '1 el vanille-extract', chocolate: 'โ…“ kopje cacaopoeder (33g)', caramel: '3 el karamelsiroop', strawberry: '1 kopje aardbeien, geblend', berry: '1 kopjes gemengde bessen, geblend', mango: '1 kopje mango puree', tropical: '1 kopje passievrucht of mango puree', coffee: '2 el oploskoffie in 2 el heet water', tea: '4 theezakjes, 15 min getrokken in warme melk', nut: 'ยฝ kopje gemalen noten (pistache, hazelnoot of amandel)', mint: '1 tl pepermunt extract', citrus: '3 el vers citroen/lime sap + zeste', floral: '2 tl gedroogde lavendel of 1 tl rozenwater', spice: '1 tl kaneel + ยฝ tl gemberpoeder', cake: '1 kopje cake/koekjes stukken (via MIX-IN)', alcohol: '3 el likeur naar keuze (rosรฉ, rum, Aperol)', }; const ingredients = [base, liquid, sweetener]; if (flavorData && flavorMap[flavorData.id]) { ingredients.push(flavorMap[flavorData.id]); } ingredients.push('Snufje zout'); // Mix-in ingredients const mixinMap = { 'choc-chunks': 'โ…“ kopje chocolade stukjes', 'brownie': 'โ…“ kopje brownie stukjes', 'oreo': '8 Oreo koekjes, gehakt', 'caramel-swirl': '3 el karamel saus', 'nuts': 'โ…“ kopje gehakte noten', 'cookie-dough': 'โ…“ kopje cookie dough stukjes', 'fresh-fruit': 'ยฝ kopje vers fruit', 'granola': 'โ…“ kopje granola', 'coconut': 'โ…“ kopje kokosvlokken', 'marshmallow': 'โ…“ kopje mini marshmallows', 'cake-bits': 'โ…“ kopje cake kruimels', }; const mixinIngredients = sel.mixins.filter(id => id !== 'none').map(id => mixinMap[id]).filter(Boolean); const mixinNames = sel.mixins.filter(id => id !== 'none').map(id => { const m = BUILDER_MIXINS.find(x => x.id === id); return m ? m.name : ''; }).filter(Boolean); const recipeName = `${flavorName} ${prog.name}`; const compat = 60 + Math.floor(Math.random() * 35); return `
${flavorEmoji}

${recipeName}

${base.split('(')[0]} + ${flavorName}${mixinNames.length ? ' + ' + mixinNames.join(', ') : ''}

${compat}% ๐Ÿ”ฅ Gegenieerd recept
๐ŸŽ›๏ธ Programma: ${prog.name}

๐Ÿ“‹ Ingrediรซnten

๐Ÿ‘จโ€๐Ÿณ Bereiding

  1. Mix alle ingrediรซnten in een kom tot een gladde massa.
  2. Giet in een Ninja Swirl pint tot 2,5 cm van de rand.
  3. Plaats de deksel en vries minimaal 24 uur.
  4. Plaats in de outer bowl, selecteer "${prog.name}" en START.
  5. Bij te hard iJs: voeg 1 el melk toe en RE-SPIN.
  6. ${mixinIngredients.length ? `
  7. Voeg mix-ins toe via de MIX-IN functie.
  8. ` : ''}
  9. Serveer direct en enjoy! ๐Ÿฆ
`; }