{
  "version": 3,
  "sources": ["/cdn/shop/t/10/assets/r-meat-planner.js?rev=20260823-luna"],
  "sourcesContent": ["(() => {\n  const BASE_GRAMS = {\n    grill: 300,\n    steak: 220,\n    pan: 220,\n    braise: 250,\n    roast: 250,\n    burger: 200,\n  };\n\n  const LABELS = {\n    grill: 'Grillen',\n    steak: 'Steak',\n    pan: 'Pfannengericht',\n    braise: 'Schmoren',\n    roast: 'Braten',\n    burger: 'Burger',\n  };\n\n  const PREFERENCES = {\n    grill: {\n      lede: 'Soll es abwechslungsreich werden oder soll eine Fleischart den Ton angeben?',\n      options: [\n        { value: 'mixed', eyebrow: 'F\u00FCr jeden etwas', label: 'Gemischte Runde', description: 'Rind, Schwein und Lamm als abwechslungsreiche Auswahl.' },\n        { value: 'beef', eyebrow: 'Steaks im Mittelpunkt', label: 'Rind auf dem Rost', description: 'Rib-Eye und Flank f\u00FCr starke Hitze und saftige Scheiben.', handles: ['rib-eye', 'flanksteak-vom-rind'] },\n        { value: 'pork-lamb', eyebrow: 'Jenseits vom Steak', label: 'Schwein & Lamm', description: 'Saftiger Halsgrat und kleine Lamm-Cuts f\u00FCr eine gemischte Platte.', handles: ['halsgrat-vom-schwein', 'lammkotelett'] },\n      ],\n    },\n    steak: {\n      lede: 'Beim Steak entscheidet nicht nur die Menge, sondern vor allem Textur, Fett und Zuschnitt.',\n      options: [\n        { value: 'juicy', eyebrow: 'Marmoriert', label: 'Saftig & voll', description: 'Rib-Eye mit kr\u00E4ftigem Eigengeschmack.', handles: ['rib-eye'] },\n        { value: 'tender', eyebrow: 'Feine Faser', label: 'Zart & elegant', description: 'Filet und Lammkotelett f\u00FCr einen feineren Hauptgang.', handles: ['rinderfilet', 'lammkotelett'] },\n        { value: 'bold', eyebrow: 'Zum Aufschneiden', label: 'Kr\u00E4ftig & teilbar', description: 'Flanksteak f\u00FCr die Platte und den Schnitt quer zur Faser.', handles: ['flanksteak-vom-rind'] },\n      ],\n    },\n    pan: {\n      lede: 'W\u00E4hle zwischen kr\u00E4ftigem Rind, mildem Gefl\u00FCgel oder einer Auswahl f\u00FCr unterschiedliche Vorlieben.',\n      options: [\n        { value: 'mixed', eyebrow: 'Zwei Richtungen', label: 'Gemischte Pfanne', description: 'Rind und Gefl\u00FCgel getrennt oder nacheinander zubereiten.' },\n        { value: 'beef', eyebrow: 'Sehr kurz gebraten', label: 'Kr\u00E4ftiges Rind', description: 'Ochsenfetzen f\u00FCr starke Hitze und kurze Garzeit.', handles: ['ochsenfetzen'] },\n        { value: 'poultry', eyebrow: 'Mild & vielseitig', label: 'Gefl\u00FCgel', description: 'Putenschnitzel f\u00FCr Pfanne, Streifen oder Geschnetzeltes.', handles: ['putenschnitzel'] },\n      ],\n    },\n    braise: {\n      lede: 'Beim Schmoren entscheidet der Zuschnitt dar\u00FCber, wie viel Zeit und Vorbereitung du brauchst.',\n      options: [\n        { value: 'mixed', eyebrow: 'Freie Auswahl', label: 'Schmortopf planen', description: 'Wir kombinieren passende Rind-Cuts f\u00FCr deine Zielmenge.' },\n        { value: 'wade', eyebrow: 'Kr\u00E4ftige Struktur', label: 'Rinderwade', description: 'F\u00FCr langes, ruhiges Schmoren und eine gehaltvolle Sauce.', handles: ['rinderwade'] },\n        { value: 'goulash', eyebrow: 'Schon zugeschnitten', label: 'Gulasch', description: 'Weniger Vorbereitung, direkt passend f\u00FCr den Topf.', handles: ['gulasch-vom-rind'] },\n      ],\n    },\n    roast: {\n      lede: 'W\u00E4hle zuerst den Charakter des Bratens. Gewicht und verf\u00FCgbare Variante passen wir danach an.',\n      options: [\n        { value: 'mixed', eyebrow: 'Noch offen', label: '\u00DCberrasche mich', description: 'Wir schlagen eine passende Kombination f\u00FCr deine Runde vor.' },\n        { value: 'lamb', eyebrow: 'Festlicher', label: 'Lamm aus dem Ofen', description: 'Lammkeule als gemeinsamer Hauptgang f\u00FCr den Tisch.', handles: ['lammkeule'] },\n        { value: 'pork', eyebrow: 'Saftig & vertraut', label: 'Schweinebraten', description: 'Halsgrat oder Bratenst\u00FCck f\u00FCr Ofen und Br\u00E4ter.', handles: ['halsgrat-vom-schwein', 'schweinebraten'] },\n      ],\n    },\n    burger: {\n      lede: 'F\u00FCr Burger und Frikadellen kannst du zwischen purem Rind und einer saftigen Mischung w\u00E4hlen.',\n      options: [\n        { value: 'mixed', eyebrow: 'F\u00FCr die Runde', label: 'Beides anbieten', description: 'Rinderhack und gemischtes Hack als flexible Auswahl.' },\n        { value: 'beef', eyebrow: 'Klassischer Burger', label: 'Rind pur', description: 'Reines Rinderhack f\u00FCr Patties mit kr\u00E4ftigem Fleischgeschmack.', handles: ['rinderhackfleisch'] },\n        { value: 'blend', eyebrow: 'Saftiger Mix', label: 'Gemischtes Hack', description: 'F\u00FCr Frikadellen, Fleischpflanzerl und weichere Patties.', handles: ['hackfleisch-gemischt'] },\n      ],\n    },\n  };\n\n  const SIDE_FACTORS = { many: 0.82, normal: 1, few: 1.15 };\n  const MAX_ITEM_QUANTITY = 99;\n  const money = new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' });\n\n  const roundTo = (value, step) => Math.max(step, Math.round(value / step) * step);\n  const boundedInteger = (value, minimum, maximum, fallback) => {\n    const parsed = Number(value);\n    return Number.isFinite(parsed)\n      ? Math.max(minimum, Math.min(maximum, Math.round(parsed)))\n      : fallback;\n  };\n  const gramsLabel = (grams) => grams >= 1000\n    ? `${(grams / 1000).toLocaleString('de-DE', { maximumFractionDigits: 2 })} kg`\n    : `${grams} g`;\n  const escapeHtml = (value) => String(value ?? '').replace(/[&<>'\"]/g, (character) => ({\n    '&': '&amp;', '<': '&lt;', '>': '&gt;', \"'\": '&#39;', '\"': '&quot;',\n  }[character]));\n\n  const plannerRoots = document.querySelectorAll('[data-r-meat-planner]');\n  if (!plannerRoots.length) return;\n  document.documentElement.classList.add('r-meat-planner-page');\n  window.dataLayer = window.dataLayer || [];\n\n  plannerRoots.forEach((root) => {\n    const productNode = root.querySelector('[data-r-meat-planner-products]');\n    const form = root.querySelector('[data-r-meat-planner-form]');\n    const result = root.querySelector('[data-r-meat-planner-result]');\n    const resultTitle = root.querySelector('[data-r-meat-result-title]');\n    const list = root.querySelector('[data-r-meat-recommendations]');\n    const planSwitch = root.querySelector('[data-r-meat-plan-switch]');\n    const preferenceGrid = root.querySelector('[data-r-preference-grid]');\n    const preferenceInput = form.elements.preference;\n    const packageOption = root.querySelector('[data-r-shopping-option=\"package\"]');\n    const addButton = root.querySelector('[data-r-meat-add-cart]');\n    const copyButton = root.querySelector('[data-r-meat-copy-link]');\n    const status = root.querySelector('[data-r-meat-status]');\n    let products = [];\n    let current = null;\n    let planType = 'cuts';\n    let plannerStarted = false;\n\n    try {\n      products = JSON.parse(productNode.textContent).map((product) => ({\n        ...product,\n        variants: product.variants.filter((variant) => variant.available && variant.grams > 0),\n      }));\n    } catch (error) {\n      status.textContent = 'Die Produktauswahl konnte gerade nicht geladen werden.';\n      return;\n    }\n\n    const formValue = (name) => new FormData(form).get(name);\n    const quantityValue = (input, writeBack = false) => {\n      const quantity = boundedInteger(input.value, 1, MAX_ITEM_QUANTITY, 1);\n      if (writeBack) input.value = quantity;\n      return quantity;\n    };\n    const modePreference = (mode, value = preferenceInput.value) => (\n      PREFERENCES[mode].options.find((option) => option.value === value) || PREFERENCES[mode].options[0]\n    );\n\n    const activeProducts = (mode, group = null) => products.filter((product) => (\n      product.modes.includes(mode)\n      && product.variants.length > 0\n      && (!group || product.group === group)\n    ));\n\n    const modeHasPackage = (mode) => activeProducts(mode, 'package').length > 0;\n\n    const showStep = (step, scroll = false) => {\n      let activePanel = null;\n      root.querySelectorAll('[data-r-planner-step]').forEach((panel) => {\n        const active = Number(panel.dataset.rPlannerStep) === step;\n        panel.hidden = !active;\n        panel.classList.toggle('is-active', active);\n        if (active) activePanel = panel;\n      });\n      root.querySelectorAll('[data-r-step-marker]').forEach((marker) => {\n        const markerStep = Number(marker.dataset.rStepMarker);\n        marker.classList.toggle('is-active', markerStep === step);\n        marker.classList.toggle('is-complete', markerStep < step);\n        markerStep === step ? marker.setAttribute('aria-current', 'step') : marker.removeAttribute('aria-current');\n      });\n      if (scroll) {\n        form.scrollIntoView({ behavior: 'smooth', block: 'start' });\n        activePanel?.focus({ preventScroll: true });\n      }\n    };\n\n    const renderPreferences = (preferredValue = null) => {\n      const mode = formValue('occasion') || 'grill';\n      const config = PREFERENCES[mode];\n      const selectedValue = config.options.some((option) => option.value === preferredValue)\n        ? preferredValue\n        : config.options[0].value;\n      root.querySelector('[data-r-preference-lede]').textContent = config.lede;\n      preferenceGrid.innerHTML = config.options.map((option, index) => `\n        <label class=\"r-meat-planner__preference-card\">\n          <input type=\"radio\" name=\"preference_choice\" value=\"${escapeHtml(option.value)}\"${option.value === selectedValue ? ' checked' : ''}>\n          <span>\n            <small>${String(index + 1).padStart(2, '0')} \u00B7 ${escapeHtml(option.eyebrow)}</small>\n            <strong>${escapeHtml(option.label)}</strong>\n            <span>${escapeHtml(option.description)}</span>\n          </span>\n        </label>\n      `).join('');\n      preferenceInput.value = selectedValue;\n      preferenceGrid.querySelectorAll('input').forEach((input) => input.addEventListener('change', () => {\n        preferenceInput.value = input.value;\n      }));\n\n      const hasPackage = modeHasPackage(mode);\n      packageOption.hidden = !hasPackage;\n      packageOption.querySelector('input').disabled = !hasPackage;\n      if (!hasPackage || formValue('shopping_style') === null) {\n        form.elements.shopping_style.value = 'cuts';\n      }\n    };\n\n    const chooseVariant = (product, targetGrams) => {\n      let best = null;\n      product.variants.forEach((variant) => {\n        const maxQuantity = Math.min(MAX_ITEM_QUANTITY, Math.max(1, Math.ceil(targetGrams / variant.grams) + 1));\n        for (let quantity = 1; quantity <= maxQuantity; quantity += 1) {\n          const planned = variant.grams * quantity;\n          const shortfallPenalty = planned < targetGrams ? (targetGrams - planned) * 0.45 : 0;\n          const score = Math.abs(planned - targetGrams) + shortfallPenalty;\n          if (\n            !best\n            || score < best.score\n            || (score === best.score && (quantity < best.quantity || (quantity === best.quantity && planned < best.planned)))\n          ) {\n            best = { variant, quantity, planned, score };\n          }\n        }\n      });\n      return best;\n    };\n\n    const packagePlan = () => activeProducts(current.mode, 'package')\n      .map((product) => ({ product, choice: chooseVariant(product, current.total) }))\n      .filter((item) => item.choice)\n      .sort((a, b) => a.choice.score - b.choice.score)\n      .slice(0, 1);\n\n    const cutPlan = () => {\n      const preference = modePreference(current.mode, current.preference);\n      const allCuts = activeProducts(current.mode, 'cut');\n      const cuts = preference.handles\n        ? allCuts.filter((product) => preference.handles.includes(product.handle))\n        : allCuts;\n      if (!cuts.length) return [];\n      const preferredCount = current.mode === 'grill' && !preference.handles ? 3 : 2;\n      const count = Math.min(preferredCount, cuts.length);\n      const target = current.total / count;\n      return cuts.slice(0, count).map((product) => ({\n        product,\n        choice: chooseVariant(product, target),\n      })).filter((item) => item.choice);\n    };\n\n    const recommendationCard = ({ product, choice }) => {\n      const options = product.variants.map((variant) => (\n        `<option value=\"${variant.id}\" data-grams=\"${variant.grams}\" data-price=\"${variant.price}\"${variant.id === choice.variant.id ? ' selected' : ''}>${escapeHtml(variant.title === 'Default Title' ? gramsLabel(variant.grams) : variant.title)} \u00B7 ${money.format(variant.price / 100)}</option>`\n      )).join('');\n      return `\n        <article class=\"r-meat-planner__product\" data-r-meat-product>\n          <img class=\"r-meat-planner__product-image\" src=\"${escapeHtml(product.image)}\" alt=\"${escapeHtml(product.title)}\" loading=\"lazy\" width=\"112\" height=\"112\">\n          <div class=\"r-meat-planner__product-copy\">\n            <h4><a href=\"${escapeHtml(product.url)}\">${escapeHtml(product.title)}</a></h4>\n            <p>${escapeHtml(product.note)}</p>\n          </div>\n          <div class=\"r-meat-planner__product-choice\">\n            <label class=\"r-meat-planner__product-toggle\">\n              <input type=\"checkbox\" data-r-product-selected checked>\n              <span>In Metzgerliste</span>\n            </label>\n            <select aria-label=\"Gewicht f\u00FCr ${escapeHtml(product.title)}\" data-r-product-variant>${options}</select>\n            <input type=\"number\" aria-label=\"Anzahl f\u00FCr ${escapeHtml(product.title)}\" min=\"1\" max=\"${MAX_ITEM_QUANTITY}\" step=\"1\" value=\"${choice.quantity}\" data-r-product-quantity>\n          </div>\n        </article>\n      `;\n    };\n\n    const updateBasket = () => {\n      let weight = 0;\n      let price = 0;\n      list.querySelectorAll('[data-r-meat-product]').forEach((card) => {\n        if (!card.querySelector('[data-r-product-selected]').checked) return;\n        const option = card.querySelector('[data-r-product-variant]').selectedOptions[0];\n        const quantity = quantityValue(card.querySelector('[data-r-product-quantity]'));\n        weight += Number(option.dataset.grams) * quantity;\n        price += Number(option.dataset.price) * quantity;\n      });\n      root.querySelector('[data-r-meat-basket-weight]').textContent = gramsLabel(weight);\n      root.querySelector('[data-r-meat-basket-price]').textContent = money.format(price / 100);\n      const delta = weight - (current?.total || weight);\n      const deltaNode = root.querySelector('[data-r-meat-basket-delta]');\n      deltaNode.textContent = delta === 0\n        ? 'Produktsumme und Planungsmenge passen genau zusammen.'\n        : `Die aktuelle Produktauswahl liegt ${gramsLabel(Math.abs(delta))} ${delta < 0 ? 'unter' : '\u00FCber'} dem Planungswert.`;\n      addButton.disabled = weight === 0;\n    };\n\n    const renderPlan = () => {\n      const plan = planType === 'package' ? packagePlan() : cutPlan();\n      list.innerHTML = plan.length\n        ? plan.map(recommendationCard).join('')\n        : '<p>F\u00FCr diese Richtung ist gerade kein verf\u00FCgbarer Artikel hinterlegt. W\u00E4hle bitte eine andere Richtung oder \u00F6ffne das Sortiment.</p>';\n      list.querySelectorAll('input, select').forEach((control) => control.addEventListener('change', updateBasket));\n      list.querySelectorAll('[data-r-product-quantity]').forEach((input) => input.addEventListener('change', () => {\n        quantityValue(input, true);\n      }));\n      updateBasket();\n    };\n\n    const updateUrl = () => {\n      const params = new URLSearchParams(window.location.search);\n      params.delete('ux');\n      params.delete('qa');\n      params.delete('final');\n      params.set('plan', current.mode);\n      params.set('preference', current.preference);\n      params.set('style', planType);\n      params.set('adults', current.adults);\n      params.set('children', current.children);\n      params.set('sides', current.sides);\n      params.set('appetite', current.appetite);\n      current.leftovers ? params.set('leftovers', '1') : params.delete('leftovers');\n      history.replaceState({}, '', `${window.location.pathname}?${params.toString()}#fleischplaner`);\n    };\n\n    const calculate = () => {\n      const mode = formValue('occasion') || 'grill';\n      const preference = preferenceInput.value || PREFERENCES[mode].options[0].value;\n      const adults = boundedInteger(formValue('adults'), 1, 30, 1);\n      const children = boundedInteger(formValue('children'), 0, 30, 0);\n      form.elements.adults.value = adults;\n      form.elements.children.value = children;\n      const sides = formValue('sides') || 'normal';\n      const appetite = formValue('appetite') || 'normal';\n      const leftovers = formValue('leftovers') === 'yes';\n      const equivalentPeople = adults + (children * 0.55);\n      const factor = SIDE_FACTORS[sides] * (appetite === 'large' ? 1.2 : 1) * (leftovers ? 1.15 : 1);\n      const total = roundTo(equivalentPeople * BASE_GRAMS[mode] * factor, 50);\n      const perAdult = roundTo(total / equivalentPeople, 10);\n      const packages = activeProducts(mode, 'package');\n      const preferredPlanType = formValue('shopping_style') || 'cuts';\n      planType = preferredPlanType === 'package' && packages.length ? 'package' : 'cuts';\n      current = { mode, preference, adults, children, sides, appetite, leftovers, total, perAdult };\n\n      const guests = adults + children;\n      const preferenceLabel = modePreference(mode, preference).label;\n      root.querySelector('[data-r-meat-total]').textContent = gramsLabel(total);\n      resultTitle.textContent = `${LABELS[mode]} f\u00FCr ${guests} ${guests === 1 ? 'Person' : 'Personen'}.`;\n      root.querySelector('[data-r-meat-explanation]').textContent = `Die Planung startet hier bei rund ${gramsLabel(perAdult)} pro erwachsener Portion. Kinder, Beilagen, Appetit und gew\u00FCnschte Reste sind bereits ber\u00FCcksichtigt.`;\n      root.querySelector('[data-r-result-mode]').textContent = LABELS[mode];\n      root.querySelector('[data-r-result-preference]').textContent = preferenceLabel;\n      root.querySelector('[data-r-result-guests]').textContent = `${adults} Erw. \u00B7 ${children === 1 ? '1 Kind' : `${children} Kinder`}`;\n      result.hidden = false;\n      planSwitch.hidden = !packages.length;\n      planSwitch.querySelectorAll('[data-r-plan-type]').forEach((button) => {\n        const active = button.dataset.rPlanType === planType;\n        button.classList.toggle('is-active', active);\n        button.setAttribute('aria-pressed', String(active));\n      });\n      status.textContent = '';\n      renderPlan();\n      updateUrl();\n      window.dataLayer?.push({\n        event: 'meat_planner_calculated',\n        planner_mode: mode,\n        planner_preference: preference,\n        planner_style: planType,\n        planner_grams: total,\n      });\n    };\n\n    root.querySelectorAll('[name=\"occasion\"]').forEach((input) => input.addEventListener('change', () => {\n      renderPreferences();\n    }));\n\n    root.querySelectorAll('[data-r-step-next]').forEach((button) => button.addEventListener('click', () => {\n      const target = Number(button.dataset.rStepNext);\n      if (target === 2) renderPreferences();\n      showStep(target, true);\n      if (!plannerStarted) {\n        plannerStarted = true;\n        window.dataLayer?.push({ event: 'meat_planner_started', planner_mode: formValue('occasion') || 'grill' });\n      }\n      window.dataLayer?.push({ event: 'meat_planner_step_view', planner_step: target, planner_direction: 'forward' });\n    }));\n\n    root.querySelectorAll('[data-r-step-back]').forEach((button) => button.addEventListener('click', () => {\n      const target = Number(button.dataset.rStepBack);\n      showStep(target, true);\n      window.dataLayer?.push({ event: 'meat_planner_step_view', planner_step: target, planner_direction: 'back' });\n    }));\n\n    root.querySelectorAll('[data-r-stepper]').forEach((button) => button.addEventListener('click', () => {\n      const input = form.elements[button.dataset.rStepper];\n      const direction = button.dataset.direction === 'up' ? 1 : -1;\n      const minimum = Number(input.min);\n      const maximum = Number(input.max);\n      input.value = boundedInteger(input.value, minimum, maximum, minimum) + direction;\n      input.value = boundedInteger(input.value, minimum, maximum, minimum);\n      input.dispatchEvent(new Event('change', { bubbles: true }));\n    }));\n\n    form.addEventListener('submit', (event) => {\n      event.preventDefault();\n      calculate();\n      result.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      resultTitle.focus({ preventScroll: true });\n    });\n\n    planSwitch.querySelectorAll('[data-r-plan-type]').forEach((button) => {\n      button.addEventListener('click', () => {\n        planType = button.dataset.rPlanType;\n        form.elements.shopping_style.value = planType;\n        planSwitch.querySelectorAll('[data-r-plan-type]').forEach((item) => {\n          const active = item === button;\n          item.classList.toggle('is-active', active);\n          item.setAttribute('aria-pressed', String(active));\n        });\n        renderPlan();\n        updateUrl();\n        window.dataLayer?.push({ event: 'meat_planner_style_changed', planner_style: planType });\n      });\n    });\n\n    root.querySelector('[data-r-edit-plan]').addEventListener('click', () => {\n      showStep(1, true);\n    });\n\n    addButton.addEventListener('click', async () => {\n      const items = [];\n      list.querySelectorAll('[data-r-meat-product]').forEach((card) => {\n        if (!card.querySelector('[data-r-product-selected]').checked) return;\n        const variant = card.querySelector('[data-r-product-variant]').value;\n        const quantity = quantityValue(card.querySelector('[data-r-product-quantity]'), true);\n        items.push({\n          id: Number(variant),\n          quantity,\n          properties: {\n            _Fleischplaner: `${LABELS[current.mode]} \u00B7 ${modePreference(current.mode, current.preference).label} \u00B7 ${current.adults} Erwachsene \u00B7 ${current.children} Kinder`,\n          },\n        });\n      });\n      if (!items.length) return;\n\n      addButton.disabled = true;\n      addButton.setAttribute('aria-busy', 'true');\n      status.textContent = 'Die Metzgerliste wird in den Warenkorb gelegt \u2026';\n      try {\n        const response = await fetch(`${window.Shopify?.routes?.root || '/'}cart/add.js`, {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n          body: JSON.stringify({ items }),\n        });\n        if (!response.ok) {\n          throw new Error('planner_inventory_changed');\n        }\n        window.dataLayer?.push({\n          event: 'meat_planner_add_to_cart',\n          planner_mode: current.mode,\n          planner_preference: current.preference,\n          planner_items: items.length,\n        });\n        window.location.assign(`${window.Shopify?.routes?.root || '/'}cart`);\n      } catch (error) {\n        status.textContent = error.message === 'planner_inventory_changed'\n          ? 'Der Bestand hat sich m\u00F6glicherweise ge\u00E4ndert. Bitte lade die Seite neu und erstelle deine Metzgerliste noch einmal.'\n          : 'Der Warenkorb konnte gerade nicht erstellt werden. Bitte versuche es erneut oder \u00F6ffne die Produkte einzeln.';\n        addButton.disabled = false;\n        addButton.removeAttribute('aria-busy');\n      }\n    });\n\n    copyButton.addEventListener('click', async () => {\n      try {\n        await navigator.clipboard.writeText(window.location.href);\n        status.textContent = 'Der Ergebnislink ist kopiert.';\n        window.dataLayer?.push({ event: 'meat_planner_link_copied', planner_mode: current?.mode || formValue('occasion') || 'grill' });\n      } catch (error) {\n        status.textContent = 'Kopiere den Link bitte direkt aus der Adresszeile.';\n      }\n    });\n\n    renderPreferences();\n\n    const params = new URLSearchParams(window.location.search);\n    if (params.has('plan') && PREFERENCES[params.get('plan')]) {\n      const modeInput = form.querySelector(`[name=\"occasion\"][value=\"${params.get('plan')}\"]`);\n      if (modeInput) modeInput.checked = true;\n      renderPreferences(params.get('preference'));\n      ['adults', 'children'].forEach((name) => {\n        if (params.has(name)) form.elements[name].value = params.get(name);\n      });\n      ['sides', 'appetite'].forEach((name) => {\n        if (params.has(name)) form.elements[name].value = params.get(name);\n      });\n      if (params.get('style') === 'package' && modeHasPackage(params.get('plan'))) {\n        form.elements.shopping_style.value = 'package';\n      }\n      form.elements.leftovers.checked = params.get('leftovers') === '1';\n      showStep(3);\n      calculate();\n    }\n  });\n})();\n"],
  "mappings": "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",
  "names": ["params"]
}
