{
  "version": 3,
  "sources": ["/cdn/shop/t/41/assets/dn-cart.js?x=19984"],
  "sourcesContent": ["/* dn-cart.js \u2014 Warenkorb im neuen Design (Klasse dn-cart-v2).\n\n   Aufgaben:\n     1. Plus-Knoepfe der Upsell-Karussells\n     2. Empfehlungen fuer die Karussells \u2014 erst beim ersten Oeffnen des Drawers\n     3. Leiste und Geschenkzeilen beim Oeffnen abgleichen (ohne Anfrage)\n   Warum nachladen: der Drawer wird auf jeder Seite mitgerendert. Der Abruf der\n   Empfehlungen kostete rund 970 ms Serverzeit pro Seitenaufruf, auch wenn den\n   Warenkorb niemand aufmachte. Jetzt passiert er beim Oeffnen. */\n(function () {\n  if (window.dnCartReady) return;\n  window.dnCartReady = true;\n\n  var speicher = {};\n  var geoeffnet = false;\n  /* Saat merken, damit nicht jede Warenkorb-Aenderung die Karussells neu holt (gemessen 733 ms,\n     die Karten springen). Aber (Roman, 2026-09-11): liegt die gemerkte Saat nicht mehr im Warenkorb\n     oder haben sich die Produktlinien geaendert (Gel Strips raus, Press Ons rein), muss neu geholt\n     werden - sonst standen Gel-Strips-Designs unter einem Press-Ons-Warenkorb. Das Element traegt dafuer\n     data-dn-items (Produkt-IDs im Warenkorb) und data-dn-lines (Linien, EU). */\n  var gemerkteSaat = null;\n  var gemerkteLinien = null;\n  /* Varianten, die ueber die Plus-Knoepfe dazukamen \u2014 ihre Karten fliegen aus\n     den Karussells, weil die zwischengespeicherte Fassung sie noch kennt. */\n  var eigeneZugaben = {};\n\n  function kartenAufraeumen(wurzel, imKorb) {\n    if (!wurzel) return;\n    Object.keys(eigeneZugaben).forEach(function (variante) {\n      var knopf = wurzel.querySelector('.dn-ups__add[data-dn-add=\"' + variante + '\"]');\n      var karte = knopf && knopf.closest ? knopf.closest('.dn-ups__card') : null;\n      if (karte) karte.remove();\n    });\n    /* Karten von Produkten, die inzwischen im Warenkorb liegen (auch von der Produktseite dazugelegt) */\n    if (imKorb) {\n      var karten = wurzel.querySelectorAll('.dn-ups__card[data-dn-produkt]');\n      for (var i = 0; i < karten.length; i++) {\n        if (imKorb.indexOf(',' + karten[i].getAttribute('data-dn-produkt') + ',') !== -1) karten[i].remove();\n      }\n    }\n    /* Reihe ohne Karten weg, sonst steht eine Ueberschrift ueber nichts */\n    var reihen = wurzel.querySelectorAll('.dn-ups');\n    for (var r = 0; r < reihen.length; r++) {\n      if (!reihen[r].querySelector('.dn-ups__card')) reihen[r].remove();\n    }\n  }\n\n  function holen(schluessel, url) {\n    if (!speicher[schluessel]) {\n      speicher[schluessel] = fetch(url)\n        .then(function (r) { return r.ok ? r.text() : ''; })\n        .catch(function () { return ''; });\n    }\n    return speicher[schluessel];\n  }\n\n  /* ---------- 2) Empfehlungen fuer die zwei Karussells ---------- */\n  class DnCartUpsells extends HTMLElement {\n    connectedCallback() { if (geoeffnet) this.laden(); }\n\n    laden() {\n      if (this.dataset.dnGeholt) return;\n      var abschnitt = this.getAttribute('section-id');\n      var saatNeu = this.getAttribute('product-id');\n      var linien = this.getAttribute('data-dn-lines') || '';\n      var imKorb = this.getAttribute('data-dn-items') || '';\n      /* gemerkte Saat nur weiterverwenden, wenn sie noch im Warenkorb liegt und die Linien gleich sind */\n      var produkt = saatNeu;\n      if (gemerkteSaat && linien === gemerkteLinien && imKorb.indexOf(',' + gemerkteSaat + ',') !== -1) produkt = gemerkteSaat;\n      if (!produkt || !abschnitt) return;\n      gemerkteSaat = produkt;\n      gemerkteLinien = linien;\n\n      var basis = (window.themeVariables && window.themeVariables.routes && window.themeVariables.routes.productRecommendationsUrl) || '/recommendations/products';\n      var selbst = this;\n      this.dataset.dnGeholt = 'laeuft';\n\n      var url = basis + '?product_id=' + produkt + '&limit=16&intent=related&section_id=' + abschnitt;\n      /* Zwischenspeicher je Saat UND Linien: dieselbe Saat mit neuer Linie im Warenkorb braucht neue Reihen */\n      holen(url + '|' + linien, url).then(function (html) {\n        if (!html) { selbst.dataset.dnGeholt = ''; return; }\n        var tmp = document.createElement('div');\n        tmp.innerHTML = html;\n        var neu = tmp.querySelector('dn-cart-upsells');\n        if (!neu) { selbst.dataset.dnGeholt = ''; return; }\n        selbst.innerHTML = neu.innerHTML;\n        kartenAufraeumen(selbst, imKorb);\n        selbst.dataset.dnGeholt = 'ja';\n      });\n    }\n  }\n\n  window.customElements.define('dn-cart-upsells', DnCartUpsells);\n\n  function nachladen() {\n    if (!geoeffnet) return;\n    var offen = document.querySelectorAll('#mini-cart dn-cart-upsells');\n    for (var i = 0; i < offen.length; i++) {\n      if (typeof offen[i].laden === 'function') offen[i].laden();\n    }\n  }\n\n  /* ---------- 3) Leiste und Geschenkzeilen beim Oeffnen abgleichen ----------\n     Ohne Anfrage, nur aus dem Markup: Steht eine Geschenk-Stufe auf \"erreicht\",\n     muss ihre Zeile da sein \u2014 und umgekehrt. Passt es nicht, laeuft die\n     Geschenk-Automatik (assets/theme.js). Das faengt Warenkoerbe auf, deren\n     Aenderung kein cart:updated gefeuert hat (Fremd-Skripte, /discount-Links,\n     Sitzungen mit einem stehen gebliebenen Geschenk aus einer alten Fassung). */\n  var warOffen = false;\n\n  function geschenkeAbgleichen() {\n    var drawer = document.getElementById('mini-cart');\n    if (!drawer || typeof window.cartUpdateGiftAddFun !== 'function') return;\n    var leiste = drawer.querySelector('free-shipping-bar.freegift_present');\n    if (!leiste) return;\n    var ware = parseFloat(leiste.getAttribute('cart-total'));\n    if (isNaN(ware)) return;\n\n    var stufen = [\n      [leiste.getAttribute('data-free-gift'), parseFloat(leiste.getAttribute('freegift-threshold'))],\n      [leiste.getAttribute('data-free-gift-two'), parseFloat(leiste.getAttribute('freegift-threshold-two'))]\n    ];\n    var erlaubt = [];\n    var passt = true;\n\n    stufen.forEach(function (stufe) {\n      var variante = stufe[0], schwelle = stufe[1];\n      if (!variante || isNaN(schwelle)) return;\n      erlaubt.push(variante);\n      var zeileDa = !!drawer.querySelector('line-item.dn-gift[data-key^=\"' + variante + ':\"]');\n      if ((ware >= schwelle) !== zeileDa) passt = false;\n    });\n    /* Bonus-Geschenke aus Rabattcodes gehoeren der Automatik ebenfalls, aber ohne Schwelle */\n    var bonus = drawer.querySelectorAll('.bonus_gift_code_input');\n    for (var b = 0; b < bonus.length; b++) if (bonus[b].value) erlaubt.push(bonus[b].value);\n\n    /* Geschenkzeile, die zu keiner Stufe (mehr) gehoert */\n    var zeilen = drawer.querySelectorAll('line-item.dn-gift[data-key]');\n    for (var z = 0; z < zeilen.length; z++) {\n      var variante = (zeilen[z].getAttribute('data-key') || '').split(':')[0];\n      if (erlaubt.indexOf(variante) === -1) passt = false;\n    }\n\n    if (!passt) window.cartUpdateGiftAddFun();\n  }\n\n  function drawerIstOffen() {\n    geoeffnet = true;\n    nachladen();\n    if (!warOffen) {\n      warOffen = true;\n      geschenkeAbgleichen();\n    }\n  }\n\n  /* Oeffnen erkennen: Klick auf einen Warenkorb-Umschalter \u2026 */\n  document.addEventListener('click', function (ereignis) {\n    var ziel = ereignis.target;\n    if (ziel && ziel.closest && ziel.closest('[aria-controls=\"mini-cart\"]')) {\n      window.setTimeout(drawerIstOffen, 60);\n    }\n  }, true);\n\n  /* \u2026 oder das open-Attribut am Drawer, etwa wenn er nach Add-to-Cart aufgeht */\n  if (window.MutationObserver) {\n    new MutationObserver(function () {\n      var drawer = document.getElementById('mini-cart');\n      if (!drawer) return;\n      if (drawer.hasAttribute('open')) drawerIstOffen();\n      else warOffen = false;\n    }).observe(document.documentElement, { subtree: true, attributes: true, attributeFilter: ['open'] });\n  }\n\n  /* Nach dem Neuzeichnen ruft der neue <dn-cart-upsells> sich selbst auf\n     (connectedCallback). Der Griff hier ist nur das Netz fuer Neuaufbauten,\n     die das Element stehen lassen \u2014 kurz danach, nicht erst nach einer halben\n     Sekunde, sonst stehen die Karussells solange leer da. */\n  document.documentElement.addEventListener('cart:updated', function () {\n    window.setTimeout(nachladen, 150);\n  });\n\n  /* ---------- 1) Plus-Knoepfe ---------- */\n  var laeuft = false;\n\n  function drawerNeuZeichnen() {\n    var meine = window.dnCartRenderAnfrage = (window.dnCartRenderAnfrage || 0) + 1;\n    return fetch('/?section_id=mini-cart')\n      .then(function (r) { return r.text(); })\n      .then(function (html) {\n        /* eine neuere Anfrage laeuft schon - diese Antwort ist alt und darf\n           den frischeren Stand nicht ueberschreiben */\n        if (meine !== window.dnCartRenderAnfrage) return;\n        var tmp = document.createElement('div');\n        tmp.innerHTML = html;\n        var alt = document.querySelector('#mini-cart');\n        var neu = tmp.querySelector('#mini-cart');\n        if (alt && neu) {\n          /* frischer Stand: ein noch wartendes Neuzeichnen des Themes darf nicht mehr darueber */\n          window.dnCartRenderVersion = (window.dnCartRenderVersion || 0) + 1;\n          alt.innerHTML = neu.innerHTML;\n        }\n      });\n  }\n\n  document.addEventListener('click', function (ereignis) {\n    var knopf = ereignis.target.closest ? ereignis.target.closest('.dn-ups__add') : null;\n    if (!knopf) return;\n    if (!knopf.closest('.dn-cart-v2')) return;\n\n    ereignis.preventDefault();\n    if (laeuft) return;\n\n    var variante = knopf.getAttribute('data-dn-add');\n    if (!variante) return;\n\n    laeuft = true;\n    knopf.classList.add('is-busy');\n    var spinner = knopf.querySelector('.dn-ups__spinner');\n    if (spinner) spinner.hidden = false;\n\n    fetch('/cart/add.js', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ id: Number(variante), quantity: 1 })\n    })\n      .then(function (antwort) {\n        if (!antwort.ok) throw new Error('add.js ' + antwort.status);\n        eigeneZugaben[variante] = true;\n        return drawerNeuZeichnen();\n      })\n      .then(function () {\n        kartenAufraeumen(document.querySelector('#mini-cart'));\n      })\n      .then(function () {\n        return fetch('/cart.js').then(function (r) { return r.json(); });\n      })\n      .then(function (warenkorb) {\n        /* dasselbe Ereignis wie das Theme: haengt Zaehler, Geschenk-Automatik und Apps an */\n        document.documentElement.dispatchEvent(new CustomEvent('cart:updated', {\n          bubbles: true,\n          detail: { cart: warenkorb }\n        }));\n      })\n      .catch(function (fehler) {\n        console.error('Upsell konnte nicht hinzugefuegt werden:', fehler);\n        knopf.classList.remove('is-busy');\n        if (spinner) spinner.hidden = true;\n      })\n      .finally(function () {\n        laeuft = false;\n      });\n  });\n})();\n\n/* ------------------------------------------------------------------\n   Schatten unter der Kopfzeile, sobald der Inhalt gescrollt ist \u2014\n   dann ist die Fortschrittsleiste weg und der Kopf braucht eine Kante.\n   Ein Zuhoerer in der Capture-Phase: scroll blubbert nicht, wird aber\n   erfasst, und so ueberlebt er jedes Neuzeichnen des Drawers.\n   ------------------------------------------------------------------ */\n(function () {\n  function pruefen(bereich) {\n    var drawer = bereich.closest('.dn-cart-v2');\n    if (!drawer) return;\n    drawer.classList.toggle('dn-scrolled', bereich.scrollTop > 4);\n  }\n\n  document.addEventListener('scroll', function (ereignis) {\n    var ziel = ereignis.target;\n    if (!ziel || !ziel.classList || !ziel.classList.contains('drawer__content')) return;\n    pruefen(ziel);\n  }, { capture: true, passive: true });\n\n  /* Nach Neuzeichnen oder Oeffnen steht der Inhalt wieder oben */\n  document.documentElement.addEventListener('cart:updated', function () {\n    document.querySelectorAll('.dn-cart-v2').forEach(function (drawer) {\n      var bereich = drawer.querySelector('.drawer__content');\n      drawer.classList.toggle('dn-scrolled', !!bereich && bereich.scrollTop > 4);\n    });\n  });\n})();\n\n/* ------------------------------------------------------------------\n   Ein Satz geht immer ganz.\n\n   Das neue Starter Set legt jede Position einzeln in den Warenkorb:\n   Designs mit `_discountAmount`, die Zugaben mit `_bundled-free`. Wer\n   daraus eine Zeile entfernt, haette sonst entweder Designs mit einem\n   Satzrabatt ohne Satz oder \u2014 schlimmer \u2014 die Zugaben gratis behalten.\n   Deshalb nimmt das X an einer Satzzeile alle Zeilen desselben Satzes\n   mit, in einem Aufruf. Seit der Set-Karte (snippets/dn-cart-set.liquid)\n   sitzt das X am Satz selbst (.dn-set__x); Einzelzeilen mit data-dn-set\n   bleiben als Rueckfall dabei.\n   ------------------------------------------------------------------ */\n(function () {\n  var laeuft = false;\n\n  document.addEventListener('click', function (ereignis) {\n    var ziel = ereignis.target;\n    var knopf = ziel && ziel.closest ? ziel.closest('.cart_title_remove_icon, .line-item__remove-button, .dn-set__x') : null;\n    if (!knopf) return;\n\n    var zeile = knopf.closest('line-item[data-dn-set], .dn-set[data-dn-set]');\n    if (!zeile || !zeile.closest('.dn-cart-v2')) return;\n    /*\n      Freie Saetze (Farbwaehler der Einzelproduktseite) gehen Zeile fuer\n      Zeile: die Staffel rechnet der Abgleich unten neu. Nur Saetze mit\n      Zugaben oder eigener Preislogik gehen ganz.\n    */\n    if (zeile.hasAttribute('data-dn-set-frei')) return;\n\n    var satz = zeile.getAttribute('data-dn-set');\n    if (!satz) return;\n\n    /* Vor dem Theme-Griff abbiegen, sonst entfernt der nur diese eine Zeile */\n    ereignis.preventDefault();\n    ereignis.stopPropagation();\n    ereignis.stopImmediatePropagation();\n    if (laeuft) return;\n\n    var geschwister = document.querySelectorAll('.dn-cart-v2 line-item[data-dn-set=\"' + satz + '\"], .dn-cart-v2 .dn-set[data-dn-set=\"' + satz + '\"]');\n    for (var i = 0; i < geschwister.length; i++) geschwister[i].classList.add('dn-satz-geht');\n\n    laeuft = true;\n    /*\n      Die Zeilen kommen aus /cart.js, nicht aus dem DOM: beim alten Set\n      stecken die Designs als Kaertchen in der Elternzeile und haben gar\n      kein eigenes <line-item>. Wer nur die sichtbaren Zeilen entfernt,\n      laesst sie mit vollem Preis im Warenkorb stehen (gemessen).\n      Alte Saetze fuehren die Kennung in `_set`, neue in `_set_id`.\n    */\n    fetch('/cart.js')\n      .then(function (r) { return r.json(); })\n      .then(function (warenkorb) {\n        var aenderungen = {};\n        var anzahl = 0;\n        (warenkorb.items || []).forEach(function (posten) {\n          var eig = posten.properties || {};\n          if (eig._set === satz || eig._set_id === satz) {\n            aenderungen[posten.key] = 0;\n            anzahl++;\n          }\n        });\n        if (!anzahl) throw new Error('keine Zeile zu Satz ' + satz);\n        return fetch('/cart/update.js', {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify({ updates: aenderungen })\n        });\n      })\n      .then(function (antwort) {\n        if (!antwort.ok) throw new Error('update.js ' + antwort.status);\n        return antwort.json();\n      })\n      .then(function (warenkorb) {\n        /* Ohne Schublade (z. B. /cart) reicht ein Neuladen */\n        if (!document.querySelector('#mini-cart')) {\n          window.location.reload();\n          return;\n        }\n        var meine = window.dnCartRenderAnfrage = (window.dnCartRenderAnfrage || 0) + 1;\n        return fetch('/?section_id=mini-cart')\n          .then(function (r) { return r.text(); })\n          .then(function (html) {\n            if (meine !== window.dnCartRenderAnfrage) return;\n            var tmp = document.createElement('div');\n            tmp.innerHTML = html;\n            var alt = document.querySelector('#mini-cart');\n            var neu = tmp.querySelector('#mini-cart');\n            if (alt && neu) {\n              window.dnCartRenderVersion = (window.dnCartRenderVersion || 0) + 1;\n              alt.innerHTML = neu.innerHTML;\n            }\n            document.documentElement.dispatchEvent(new CustomEvent('cart:updated', {\n              bubbles: true,\n              detail: { cart: warenkorb }\n            }));\n          });\n      })\n      .catch(function (fehler) {\n        console.error('Satz konnte nicht entfernt werden:', fehler);\n        for (var j = 0; j < geschwister.length; j++) geschwister[j].classList.remove('dn-satz-geht');\n      })\n      .finally(function () { laeuft = false; });\n  }, true);\n})();\n\n/* ------------------------------------------------------------------\n   Mengenstaffel warenkorbweit halten - seit 2026-09-14 (Roman) nur ueber\n   Designs: Zubehoer zaehlt nicht mit und bekommt keinen Abzug. (Der Taktwechsel im Warenkorb ist seit\n   2026-09-14 raus, Roman: der Plan steht je Zeile nur noch als Text, gewaehlt\n   wird er auf der Produktseite; das spart je Wechsel eine change.js-Anfrage\n   pro Abo-Zeile und das Auswahl-Markup bei jedem Neuzeichnen.)\n\n   Die Produktseiten geben eine Staffel nach Zahl der Designs, rechnen sie aber nur fuer die Auswahl auf der Seite\n   (Einzel-PDP dn-single-chooser-js noch 0/5/10/15/20/25 %, Mix & Match Set die Saetze des Sets). Hier gilt seit\n   2026-10-09 (Bilal) EINE Staffel fuer den ganzen Warenkorb: 1, 2 Designs -> 0, 5 %, Abo + 10 Punkte; ab 3 Designs die\n   Saetze des Sets (Tabelle data-dn-staffel-stufen: Einmalkauf bilalappfn.bundle-discount 15/20/25/30 %, Abo genau der\n   Plan \"Subscribe & Save (N Designs)\" 25/30/35/40 %), siehe PREISLEITER unten. Sie wird\n   fuer den ganzen Warenkorb nachgezogen, seit 2026-10-23 (Bilal) GETRENNT nach Kaufart:\n   die zaehlenden Einmalkauf-Designs ergeben die Einmalkauf-Stufe (nE), die zaehlenden\n   Abo-Designs die Abo-Stufe (nA) - vier Einmalkauf-Designs, eines davon ins Abo gestellt:\n   drei Einmalkauf-Zeilen mit der Stufe fuer 3 (15 %), die Abo-Zeile mit der fuer 1 (10 %),\n   nicht mehr beide mit der Stufe fuer 4. Jede freie Zeile bekommt den Abzug ihrer Stufe - im\n   Einmalkauf als `_discountAmount` (die Bundle-Funktion des Shops wendet\n   ihn an, gemessen: 21,95 mit 1,10 steht als 20,85 im Warenkorb), im Abo\n   als Loop-Plan der Stufe mit demselben Takt. Was zaehlt und was frei ist,\n   sagt das Manifest aus snippets/dn-cart-staffel.liquid; Starter Sets,\n   Mix & Match und Geschenke stehen dort gesperrt.\n\n   Ausgeloest wird der Abgleich durch jedes Neuzeichnen der Schublade (das\n   Theme zeichnet nach jeder Aenderung neu), es laeuft immer nur ein\n   Durchgang, und er endet, sobald das Manifest nichts mehr zu aendern\n   laesst. Solange er laeuft, ist der Kaufknopf gesperrt, damit niemand mit\n   einer alten Stufe in den Checkout geht.\n   ------------------------------------------------------------------ */\n(function () {\n  var laeuft = false;\n  var nochmal = false;\n  var timer = null;\n\n  function manifest() {\n    var el = document.querySelector('#mini-cart [data-dn-staffel]');\n    if (!el) return null;\n    try {\n      return { aktiv: el.getAttribute('data-dn-staffel-aktiv') === 'true', zeilen: JSON.parse(el.textContent) };\n    } catch (e) { return null; }\n  }\n  /*\n    PREISLEITER SEIT 2026-10-09 (Bilal: \"cart logic same as in the US live theme but discount percentage updated and selling\n    plans updated\"): dieselbe Staffel fuer jede zaehlende Design-Zeile, egal woher (Mix & Match Set, Einzel-PDP, Upsell im\n    Korb). Ab der ersten Stufe kommen die Saetze aus dem Mix & Match Set - Tabelle data-dn-staffel-stufen\n    (snippets/dn-cart-staffel): Einmalkauf = Metafeld bilalappfn.bundle-discount der Set-Variante (3 -> 15, 4 -> 20,\n    5 -> 25, ab 6 -> 30 %), Abo = genau der Loop-Plan der Gruppe \"Subscribe & Save (N Designs)\" im Takt (25 / 30 / 35 / 40 %;\n    an den Designs haengen alte Gruppen mit gleichem Satz, deshalb die genaue Kennung). Darunter wie bisher: 2 Designs 5 %,\n    Abo = Staffel + 10 Punkte (planWahl: hoechster Plan bis zum Ziel). Ohne Tabelle (Set nicht ladbar) dieselben Zahlen.\n    Vorher (Roman 2026-09-21): 3 -> 10, 4 -> 15, 5 -> 20, ab 6 -> 25 %, Abo + 10.\n  */\n  function stufenTabelle() {\n    var el = document.querySelector('#mini-cart [data-dn-staffel-stufen]');\n    if (!el) return null;\n    try {\n      var t = JSON.parse(el.textContent).filter(function (st) { return st && st.frei > 0; });\n      t.sort(function (a, b) { return a.frei - b.frei; });\n      return t.length ? t : null;\n    } catch (e) { return null; }\n  }\n  function stufeFuer(tab, n) {\n    var best = null;\n    (tab || []).forEach(function (st) { if (st.frei <= n && (!best || st.frei > best.frei)) best = st; });\n    return best;\n  }\n  function staffel(n) {\n    var st = stufeFuer(stufenTabelle(), n);\n    if (st) return st.einmal / 100;\n    if (n >= 6) return 0.30;\n    if (n >= 5) return 0.25;\n    if (n >= 4) return 0.20;\n    if (n >= 3) return 0.15;\n    if (n >= 2) return 0.05;\n    return 0;\n  }\n  function abo(d) { return d + 0.10; }\n  /* Getrennte Staffeln (Bilal 2026-10-23): Einmalkauf zaehlt nur Einmalkauf-Designs (e = nE), Abo nur Abo-Designs (a = nA). */\n  function zaehlen(zeilen) {\n    var e = 0, a = 0;\n    (zeilen || []).forEach(function (z) { if (z.zaehlt) { if (z.plan) a += z.qty || 0; else e += z.qty || 0; } });\n    return { e: e, a: a };\n  }\n  window.dnStaffelLeiter = '2026-10-23-getrennt';\n  window.dnStaffelStufen = { tabelle: stufenTabelle, stufe: stufeFuer, zaehlen: zaehlen };\n  /* Takt eines Plans in Wochen; \"every month\" (erster Plan von Loop 66650 \"(2 Designs)\") zaehlt als 4 Wochen. */\n  function planWochen(name) {\n    if (/every\\s+month/i.test(name || '')) return '4';\n    var m = /every\\s+(\\d+)\\s*week/i.exec(name || '');\n    return m ? m[1] : null;\n  }\n  /*\n    Abo fuer 1 und 2 Designs (Bilal 2026-10-10): genau die Plaene von Loop 66649 \"Subscribe & Save (1 Designs)\" (10 %) und\n    66650 \"(2 Designs)\" (15 %) - Tabelle data-dn-staffel-klein (snippets/dn-cart-staffel, dn-abo-stufen-klein). Einmalkauf\n    bleibt dort die Staffel (0 / 5 %).\n  */\n  function kleinTabelle() {\n    var el = document.querySelector('#mini-cart [data-dn-staffel-klein]');\n    if (!el) return [];\n    try { return JSON.parse(el.textContent).filter(function (x) { return x && x.frei > 0 && x.plaene && x.plaene.length; }); } catch (e) { return []; }\n  }\n  /* Abo-Stufe einer Anzahl: ab der ersten Set-Stufe die des Sets, darunter die fuer 1 oder 2 Designs. */\n  function aboStufeFuer(n) {\n    var st = stufeFuer(stufenTabelle(), n);\n    if (st) return st;\n    var k = null;\n    kleinTabelle().forEach(function (x) { if (x.frei === n) k = x; });\n    return k;\n  }\n  /* Abo-Satz in Prozent fuer n Abo-Designs (Knopf, Mix & Match-Zeile): Stufe des Sets bzw. \"(1|2 Designs)\", sonst Staffel + 10. */\n  function aboSatz(n) {\n    if (!(n > 0)) return 0;\n    var st = aboStufeFuer(n);\n    return st && st.abo > 0 ? st.abo : Math.round(abo(staffel(n)) * 100);\n  }\n  window.dnStaffelStufen.abo = aboSatz;\n  /*\n    Plan der Stufe im ersten passenden Takt aus `wochen` (Wert oder Liste, z. B. [Takt des Korbs, eigener Takt]). Fuer eine\n    Zeile nie still ein fremder Takt (dann null) und nur, wenn ihre Variante den Plan traegt (z.plaene); ohne Zeile (Knopf)\n    notfalls der erste Plan der Stufe.\n  */\n  function stufenPlan(st, wochen, zeile) {\n    if (!st || !st.plaene || !st.plaene.length) return null;\n    var liste = [].concat(wochen).filter(function (w) { return w !== null && w !== undefined && w !== ''; }).map(String);\n    var p = null;\n    liste.some(function (w) {\n      st.plaene.forEach(function (x) { if (!p && planWochen(x.name) === w) p = x; });\n      return !!p;\n    });\n    if (!p && !zeile) p = st.plaene[0];\n    if (!p) return null;\n    if (zeile && zeile.plaene && zeile.plaene.length && !zeile.plaene.some(function (x) { return x.id === p.id; })) return null;\n    return { id: p.id, proz: p.pz, wochen: planWochen(p.name) };\n  }\n  /*\n    Knopf \"Subscribe & save N%\" an Einmalkauf-Design-Zeilen (snippets/dn-cart-abo, Vorgabe der 10-%-Plan \"(1 Design)\"). Seit\n    2026-10-23 (getrennte Staffeln) nennt und setzt er die Abo-Stufe, in der die Zeile nach dem Klick landet: Abo-Designs im\n    Korb (nA) plus die Menge dieser Zeile, denn der Klick stellt die ganze Zeile um. Plan im Takt 8 Wochen wie die Vorauswahl\n    der Produktseite (Takt je Zeile seit 2026-10-23, kein Korb-Takt mehr). Daneben die Ersparnis wie im Entwurf: Einmalkauf-Preis der Zeile jetzt\n    minus Abo-Preis; ist das Abo nicht billiger (die Zeile verliert ihre Einmalkauf-Stufe), steht kein Betrag. Sofort nach\n    jedem Zeichnen gesetzt (knoepfeJetzt); Texte ueber die Textknoten, Betrag ueber hidden - das loest den Beobachter\n    (nur childList) nicht aus.\n  */\n  function geld(cent) {\n    /* shortcut: nur {{amount}} des Shop-Formats, reicht fuer US; EU-Stores haben eigene Repos */\n    var f = (window.themeVariables && window.themeVariables.settings && window.themeVariables.settings.moneyFormat) || '${{amount}}';\n    return f.replace(/\\{\\{\\s*amount\\s*\\}\\}/, (cent / 100).toFixed(2));\n  }\n  function textSetzen(el, text) {\n    if (!el || el.textContent === text) return;\n    if (el.childNodes.length === 1 && el.firstChild.nodeType === 3) el.firstChild.nodeValue = text; else el.textContent = text;\n  }\n  function stufenKnoepfe(m, nA) {\n    if (!m) return;\n    var zeilen = {};\n    m.zeilen.forEach(function (z) { if (z.frei && z.art === 'design' && !z.plan) zeilen[z.key] = z; });\n    document.querySelectorAll('#mini-cart line-item[data-key]').forEach(function (li) {\n      var z = zeilen[li.getAttribute('data-key')];\n      if (!z) return;\n      var k = li.querySelector('[data-dn-abo-plan]');\n      if (!k) return;\n      /*\n        Satz und Plan der Stufe nur, wenn die Variante den Plan traegt (Wochen-Plaene am Knopf). Sonst bleiben Plan und Satz\n        des Knopfes (Vorgabe aus Liquid) - nie einen Satz nennen, den die Zeile dann nicht bekommt (Review 2026-10-23).\n      */\n      var stK = aboStufeFuer(nA + (z.qty || 1));\n      var plan = stufenPlan(stK, '8', null);\n      var ids = k.getAttribute('data-dn-abo-plaene');\n      if (plan && (!ids || ids.indexOf(',' + plan.id + ',') > -1)) {\n        if (k.getAttribute('data-dn-abo-plan') !== String(plan.id)) k.setAttribute('data-dn-abo-plan', plan.id);\n        if (k.getAttribute('data-dn-abo-proz') !== String(stK.abo)) k.setAttribute('data-dn-abo-proz', stK.abo);\n      }\n      var satz = parseFloat(k.getAttribute('data-dn-abo-proz')) || 0;\n      if (!(satz > 0)) return;\n      textSetzen(k.querySelector('.dn-abo-knopf__text'), 'Subscribe & save ' + satz + '%');\n      /* Abo-Preis je Stueck gerundet wie Loop (Preis x Satz, halbe Cent auf), mal Menge */\n      var aboZeile = Math.round(z.preis * (100 - satz) / 100) * (z.qty || 1);\n      var spar = (z.final || 0) - aboZeile;\n      var betrag = k.querySelector('.dn-abo-knopf__spar');\n      if (betrag) {\n        if (spar > 0) textSetzen(betrag, '\u2212' + geld(spar));\n        if (betrag.hidden !== !(spar > 0)) betrag.hidden = !(spar > 0);\n      }\n    });\n  }\n  function knoepfeJetzt() {\n    var m = manifest();\n    if (!m || !m.aktiv) return;\n    stufenKnoepfe(m, zaehlen(m.zeilen).a);\n  }\n\n  function aendern(body, versuch) {\n    return fetch('/cart/change.js', {\n      method: 'POST',\n      credentials: 'same-origin',\n      headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n      body: JSON.stringify(body)\n    }).then(function (r) {\n      /* zu viele Anfragen auf einmal: einmal kurz warten und wiederholen */\n      if (r.status === 429 && !versuch) {\n        return new Promise(function (res) { setTimeout(res, 600); }).then(function () { return aendern(body, 1); });\n      }\n      if (!r.ok) throw new Error('change.js ' + r.status);\n      return r.json();\n    });\n  }\n  function angleichen(alt, neu) {\n    var ak = Array.prototype.slice.call(alt.childNodes).filter(function (k) {\n      return !(k.nodeType === 1 && k.classList && k.classList.contains('dn-nudge'));\n    });\n    var nk = Array.prototype.slice.call(neu.childNodes);\n    var anker = alt.querySelector(':scope > .dn-nudge');\n    for (var i = 0; i < Math.max(ak.length, nk.length); i++) {\n      var a = ak[i], n = nk[i];\n      if (!n) { if (a) alt.removeChild(a); continue; }\n      if (!a) { alt.appendChild(n.cloneNode(true)); continue; }\n      if (a.nodeType !== n.nodeType) { alt.replaceChild(n.cloneNode(true), a); continue; }\n      if (a.nodeType === 3 || a.nodeType === 8) { if (a.nodeValue !== n.nodeValue) a.nodeValue = n.nodeValue; continue; }\n      if (a.nodeType !== 1) continue;\n      if (a.tagName !== n.tagName) { alt.replaceChild(n.cloneNode(true), a); continue; }\n      if (a.outerHTML === n.outerHTML) continue;\n      /* Zeile mit anderem Schluessel, Skript oder Formularfeld: als Ganzes ersetzen. */\n      var ganz = (a.hasAttribute('data-key') && a.getAttribute('data-key') !== n.getAttribute('data-key')) ||\n                 a.tagName === 'SCRIPT' || a.tagName === 'STYLE' || a.tagName === 'INPUT' || a.tagName === 'SELECT' || a.tagName === 'TEXTAREA' || a.tagName === 'IFRAME' || a.tagName === 'SVG' || a.tagName === 'svg';\n      if (ganz) { alt.replaceChild(n.cloneNode(true), a); continue; }\n      var an = a.attributes, nn = n.attributes, k;\n      for (k = an.length - 1; k >= 0; k--) { if (!n.hasAttribute(an[k].name)) a.removeAttribute(an[k].name); }\n      for (k = 0; k < nn.length; k++) { if (a.getAttribute(nn[k].name) !== nn[k].value) a.setAttribute(nn[k].name, nn[k].value); }\n      angleichen(a, n);\n    }\n    if (anker && anker.parentNode === alt) {\n      /* Der Hinweiskasten bleibt hinter der Leiste stehen, auch wenn davor Knoten wechselten. */\n      var leiste = alt.querySelector(':scope > free-shipping-bar.dn-cp');\n      if (leiste && leiste.nextSibling !== anker) alt.insertBefore(anker, leiste.nextSibling);\n    }\n  }\n  function neuZeichnen(warenkorb) {\n    /* Zaehler gegen Ueberholen: das Theme zeichnet nach cart:refresh per\n       Fetch, der Abgleich kurz danach noch einmal - kommt die aeltere Antwort\n       spaeter an, zeigte die Schublade Zeilen mit toten Schluesseln. */\n    var meine = window.dnCartRenderAnfrage = (window.dnCartRenderAnfrage || 0) + 1;\n    var wk = warenkorb ? Promise.resolve(warenkorb)\n      : fetch('/cart.js', { headers: { 'Accept': 'application/json' } }).then(function (r) { return r.json(); });\n    return wk.then(function (c) { warenkorb = c; return fetch('/?section_id=mini-cart'); })\n      .then(function (r) { return r.text(); })\n      .then(function (html) {\n        if (meine !== window.dnCartRenderAnfrage) return;\n        var tmp = document.createElement('div');\n        tmp.innerHTML = html;\n        var alt = document.querySelector('#mini-cart');\n        var neu = tmp.querySelector('#mini-cart');\n        if (alt && neu) {\n          window.dnCartRenderVersion = (window.dnCartRenderVersion || 0) + 1;\n          /*\n            IN PLACE ANGLEICHEN, NICHT TAUSCHEN (Roman, 2026-09-14: \"der cart reloaded auch\n            mehrere male\"): innerHTML warf die ganze Schublade weg und baute sie neu -\n            sichtbar als zweites Aufblitzen nach dem Aufbau des Themes, Scrollstand und\n            Hinweiskasten weg. Jetzt werden nur Knoten angefasst, die sich unterscheiden\n            (Preise, Eigenschaften, Manifest); Zeilen mit neuem Schluessel werden als\n            Ganzes ersetzt, damit die Theme-Elemente ihren Zustand zum Schluessel behalten.\n          */\n          angleichen(alt, neu);\n          knoepfeJetzt();\n          if (gesperrt) sperren(true);\n        }\n        document.documentElement.dispatchEvent(new CustomEvent('cart:updated', {\n          bubbles: true,\n          detail: { cart: warenkorb }\n        }));\n      });\n  }\n  /*\n    Sperrzustand merken (Review 2026-10-23): das Neuzeichnen gleicht die Attribute des Kaufknopfs an das Server-Markup an\n    und nahm ihm so das disabled - zwischen Wechsel der Kaufart und Durchgang war der Kauf wieder offen, mit dem Abzug der\n    alten Stufe an den uebrigen Zeilen. Jetzt nach jedem Neuzeichnen erneut gesetzt, dazu ein Klick-/Submit-Riegel unten.\n  */\n  var gesperrt = false;\n  var sperrNotfall = null;\n  function sperren(an) {\n    gesperrt = !!an;\n    /* Notausgang: haengt die Sperre ohne laufenden Durchgang 15 s, gibt sie frei - lieber alter Abzug als kein Kauf */\n    clearTimeout(sperrNotfall);\n    if (an) sperrNotfall = setTimeout(function () { if (gesperrt && !laeuft) sperren(false); }, 15000);\n    document.querySelectorAll('#mini-cart .checkout-button').forEach(function (b) { b.disabled = !!an; });\n    /* sichtbare Rueckmeldung, solange Zeilen umgestellt werden (Klasse in dn-cart.css) */\n    var mc = document.querySelector('#mini-cart');\n    if (mc) mc.classList.toggle('is-dn-busy', !!an);\n  }\n  window.dnCartNeuZeichnen = neuZeichnen;\n  /*\n    Fuer den Knopf \"Subscribe & save\" (eigener Block unten): seit den getrennten Staffeln aendert ein Wechsel der Kaufart\n    auch die Stufe der ANDEREN Zeilen, das schreibt erst der naechste Durchgang. Bis dahin trugen die Einmalkauf-Zeilen\n    noch den Abzug der alten Stufe - der Kauf bleibt deshalb gesperrt, bis der Durchgang fertig ist (gibt am Ende frei).\n  */\n  window.dnStaffelSperren = sperren;\n  /*\n    Aufgaben NACHEINANDER. Gleichzeitig (Versuch 2026-09-07, PR #749) verlor\n    Shopify Aenderungen: bei vier parallelen change.js blieb eine Zeile auf dem\n    alten Kaufplan, und die einzelnen Anfragen wurden unter Last langsamer\n    (0,9 bis 2,4 s statt 0,8 s), der Gewinn war gering (4,7 -> 4,4 s). Der\n    Warenkorb wird je Anfrage als Ganzes gelesen und geschrieben, verschiedene\n    Zeilen schuetzen nicht. Ein Fehler an einer Zeile bricht die uebrigen nicht\n    ab (gemessen: ein 400 an der ersten Zeile liess alle weiteren\n    ungerabattiert). Ergebnis: letzter Warenkorb (bei Reihenfolge der Endstand),\n    Zahl der Fehler.\n  */\n  /*\n    UEBER DEN SCHLUESSEL, NICHT UEBER DIE POSITION (zurueck seit 2026-09-21). Vom\n    2026-09-14 bis dahin ging jede Aufgabe per `line` (1-basiert, aus dem /cart.js des\n    Durchgangs), weil ein Schluessel angeblich nach jedem change.js wechselte. Nachgemessen\n    2026-09-21 (auch unter der Bundle-Funktion, Zeilen mit _discountAmount): ein change.js\n    aendert NUR den Schluessel der geschriebenen Zeile, die anderen bleiben, die Reihenfolge\n    auch. Die Position dagegen verschiebt sich, sobald die Geschenk-Automatik (theme.js)\n    zwischen Momentaufnahme und Aufgabe eine Zeile oben einfuegt oder entfernt - dann traf\n    die Aufgabe eine fremde Zeile: der Limited Mystery Gift bekam Menge und Eigenschaften\n    eines Designs, verlor _isGift und stand bezahlt neben einem zweiten, freien Geschenk\n    (Roman, 2026-09-21). Ein veralteter Schluessel scheitert laut (4xx, fehler++, neuer\n    Durchgang), eine veraltete Position scheitert leise auf der falschen Zeile. `line`\n    nur noch, wenn eine Aufgabe keinen Schluessel hat.\n  */\n  function nacheinander(aufgaben) {\n    var stand = { warenkorb: null, fehler: 0, ok: 0 };\n    return aufgaben.reduce(function (kette, a) {\n      return kette.then(function () {\n        var body = {};\n        Object.keys(a).forEach(function (k) { if (k !== 'id' && k !== 'line') body[k] = a[k]; });\n        if (a.id) body.id = a.id; else if (a.line) body.line = a.line;\n        return aendern(body).then(function (c) { stand.warenkorb = c; stand.ok++; })\n          .catch(function (fehler) { stand.fehler++; console.warn('Warenkorbzeile nicht geaendert:', a.id, fehler.message); });\n      });\n    }, Promise.resolve()).then(function () { return stand; });\n  }\n\n  /*\n    ---------- Stapel ueber die Storefront API ----------\n    Die Cart-API aendert je change.js nur EINE Zeile (~0,8 s Serverzeit); zehn\n    Abo-Zeilen brauchten fuer einen Taktwechsel 5-8 s (Roman, 2026-09-07).\n    Parallel geht nicht (verlorene Aenderungen, #751), add.js im Stapel\n    feuert je Zeile ein product_added_to_cart-Pixel. Die Storefront API stellt\n    mit cartLinesUpdate alle Zeilen in EINEM Aufruf um, ohne Pixel-Ereignisse;\n    der Warenkorb der Cart-API ist dort als gid://shopify/Cart/<token>\n    erreichbar. Braucht den oeffentlichen Storefront-Token aus dem Feld\n    \"Storefront API token\" am Cart-Drawer-Abschnitt (data-dn-sf-token an\n    #mini-cart). Ohne Token, bei nur einer Aufgabe, bei Kaufplan null\n    (Einmalkauf) oder bei jedem Fehler: Zeile fuer Zeile wie bisher. Die\n    Zeilen der Storefront API werden den Cart-API-Schluesseln zugeordnet:\n    erst ueber den Schluessel in der Zeilen-ID, sonst ueber Variante,\n    Kaufplan, Menge und Eigenschaften. cartLinesUpdate ist ganz oder gar\n    nicht, ein Teilstand kann nicht entstehen.\n  */\n  var SF_VERSION = '2026-01';\n  function sfToken() {\n    var mc = document.querySelector('#mini-cart');\n    return mc ? (mc.getAttribute('data-dn-sf-token') || '').trim() : '';\n  }\n  function sfAbfrage(token, query, variables) {\n    return fetch('/api/' + SF_VERSION + '/graphql.json', {\n      method: 'POST',\n      credentials: 'same-origin',\n      headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', 'X-Shopify-Storefront-Access-Token': token },\n      body: JSON.stringify({ query: query, variables: variables })\n    }).then(function (r) {\n      if (!r.ok) throw new Error('storefront ' + r.status);\n      return r.json();\n    }).then(function (j) {\n      if (j.errors && j.errors.length) throw new Error(j.errors[0].message);\n      return j.data;\n    });\n  }\n  function eigenschaftenGleich(attrs, props) {\n    var a = {}; (attrs || []).forEach(function (x) { a[x.key] = String(x.value); });\n    var b = {}; Object.keys(props || {}).forEach(function (k) { b[k] = String(props[k]); });\n    var ka = Object.keys(a).sort(), kb = Object.keys(b).sort();\n    if (ka.length !== kb.length) return false;\n    for (var i = 0; i < ka.length; i++) { if (ka[i] !== kb[i] || a[ka[i]] !== b[kb[i]]) return false; }\n    return true;\n  }\n  function stapel(aufgaben) {\n    var token = sfToken();\n    var geeignet = token && aufgaben.length >= 2 && aufgaben.every(function (a) { return a.selling_plan !== null; });\n    if (!geeignet) return nacheinander(aufgaben);\n    var stand = { warenkorb: null, fehler: 0, ok: 0 };\n    return fetch('/cart.js', { credentials: 'same-origin', headers: { 'Accept': 'application/json' } })\n      .then(function (r) { return r.json(); })\n      .then(function (cart) {\n        var zeilen = {};\n        (cart.items || []).forEach(function (i) { zeilen[i.key] = i; });\n        var cartId = 'gid://shopify/Cart/' + cart.token;\n        var abfrage = 'query($id: ID!) { cart(id: $id) { id lines(first: 250) { nodes { id quantity merchandise { ... on ProductVariant { id } } sellingPlanAllocation { sellingPlan { id } } attributes { key value } } } } }';\n        return sfAbfrage(token, abfrage, { id: cartId }).then(function (data) {\n          if (!data || !data.cart) throw new Error('Warenkorb ueber die Storefront API nicht erreichbar');\n          var knoten = (data.cart.lines && data.cart.lines.nodes || []).slice();\n          var lines = [];\n          aufgaben.forEach(function (a) {\n            var z = zeilen[a.id];\n            if (!z) { stand.fehler++; console.warn('Warenkorbzeile nicht mehr da:', a.id); return; }\n            var treffer = null;\n            for (var i = 0; i < knoten.length; i++) {\n              if (knoten[i].id.indexOf('/CartLine/' + a.id) > -1) { treffer = knoten[i]; break; }\n            }\n            if (!treffer) {\n              var varGid = 'gid://shopify/ProductVariant/' + z.variant_id;\n              var planGid = z.selling_plan_allocation ? 'gid://shopify/SellingPlan/' + z.selling_plan_allocation.selling_plan.id : null;\n              for (var j = 0; j < knoten.length; j++) {\n                var n = knoten[j];\n                var nPlan = n.sellingPlanAllocation && n.sellingPlanAllocation.sellingPlan ? n.sellingPlanAllocation.sellingPlan.id : null;\n                if (n.merchandise && n.merchandise.id === varGid && nPlan === planGid && n.quantity === z.quantity && eigenschaftenGleich(n.attributes, z.properties)) { treffer = n; break; }\n              }\n            }\n            if (!treffer) throw new Error('Zeile nicht zugeordnet: ' + a.id);\n            knoten.splice(knoten.indexOf(treffer), 1);\n            var line = { id: treffer.id, quantity: a.quantity != null ? a.quantity : z.quantity };\n            if (a.selling_plan) line.sellingPlanId = 'gid://shopify/SellingPlan/' + a.selling_plan;\n            else if (z.selling_plan_allocation) line.sellingPlanId = 'gid://shopify/SellingPlan/' + z.selling_plan_allocation.selling_plan.id;\n            var props = a.properties !== undefined ? a.properties : (z.properties || {});\n            line.attributes = Object.keys(props || {}).filter(function (k) { return String(props[k]) !== ''; }).map(function (k) { return { key: k, value: String(props[k]) }; });\n            lines.push(line);\n          });\n          if (!lines.length) return stand;\n          var mutation = 'mutation($id: ID!, $lines: [CartLineUpdateInput!]!) { cartLinesUpdate(cartId: $id, lines: $lines) { cart { id } userErrors { field message } } }';\n          return sfAbfrage(token, mutation, { id: cartId, lines: lines }).then(function (d2) {\n            var fehler = d2 && d2.cartLinesUpdate ? (d2.cartLinesUpdate.userErrors || []) : [];\n            if (fehler.length) throw new Error(fehler[0].message);\n            stand.ok = lines.length;\n            return stand;\n          });\n        });\n      })\n      .catch(function (fehler) {\n        console.warn('Stapel ueber die Storefront API nicht moeglich, Zeile fuer Zeile:', fehler.message);\n        return nacheinander(aufgaben);\n      });\n  }\n\n  /*\n    Eigenschaften der Zeile als Objekt. Das Manifest liefert ein Objekt;\n    kaeme eine Liste von Paaren (so gibt Liquid `properties | json` aus),\n    wird sie umgebaut - sonst landen \"0\", \"1\", \"2\" als Schluessel an der\n    Zeile (gemessen 2026-09-06).\n  */\n  function eigenschaften(zeile) {\n    var props = {};\n    var q = zeile.props || {};\n    if (Array.isArray(q)) {\n      q.forEach(function (paar) { if (paar && paar.length === 2) props[paar[0]] = paar[1]; });\n    } else {\n      Object.keys(q).forEach(function (k) { if (!/^\\d+$/.test(k)) props[k] = q[k]; });\n    }\n    return props;\n  }\n\n  /*\n    change.js ersetzt die Eigenschaften nur, wenn das Objekt nicht leer ist -\n    ein leeres {} laesst alles stehen (gemessen: \"Subscription Discount\"\n    blieb nach dem Wechsel auf Einmalkauf). Sollen alle weg, geht eine\n    einzige leere, versteckte Eigenschaft mit.\n  */\n  function propsZumSenden(props) {\n    return Object.keys(props).length ? props : { '_dn': '' };\n  }\n\n  /*\n    Plan der Stufe: gleicher Takt, hoechster Prozentsatz bis zum Ziel.\n    Mit `zielWochen` wird der Takt vorgegeben (bis 2026-10-23 einheitlicher Takt im ganzen\n    Warenkorb, Roman 2026-09-08); kennt die Variante diesen Takt nicht,\n    bleibt ihr eigener.\n  */\n  function planWahl(zeile, zielProz, zielWochen) {\n    var akt = null;\n    (zeile.plaene || []).forEach(function (p) { if (p.id === zeile.plan) akt = p; });\n    var wochen = akt ? akt.wochen : zeile.wochen;\n    if (zielWochen && (zeile.plaene || []).some(function (p) { return p.wochen === zielWochen; })) wochen = zielWochen;\n    var beste = null;\n    (zeile.plaene || []).forEach(function (p) {\n      if (p.wochen !== wochen) return;\n      if (!(p.proz > 0) || p.proz > zielProz + 0.001) return;\n      if (!beste || p.proz > beste.proz) beste = p;\n    });\n    return beste;\n  }\n\n  /*\n    Das Manifest kommt aus dem letzten Zeichnen der Schublade und kann\n    hinter dem Warenkorb liegen (gemessen: eine Zeile war schon\n    umgeschrieben, ihr alter Schluessel stand noch im Manifest, change.js\n    antwortete 400, und weil danach nicht neu gezeichnet wurde, lief jeder\n    weitere Durchgang in denselben Fehler). Deshalb: vor dem Aendern die\n    Zeilen frisch aus /cart.js holen, Aufgaben nur fuer Schluessel, die es\n    noch gibt, danach in jedem Fall neu zeichnen. Hoechstens drei Anlaeufe\n    hintereinander mit Fehlern.\n\n    REIHENFOLGE MIT DER GESCHENK-AUTOMATIK (theme.js, seit 2026-09-21): erst die\n    Staffel, dann die Geschenke. Nach einer Mengenaenderung traegt die Zeile noch den\n    Abzug der alten Menge (_discountAmount gilt fuer die ganze Zeile), /cart.js zeigt\n    einen falschen Warenwert, und die Automatik warf Geschenke raus und legte sie eine\n    Sekunde spaeter wieder an (gemessen: 8 -> 5 Designs, Abzug 43,92 statt 18,65,\n    Warenwert 65,83 statt 91,10 $, beide Geschenke weg und wieder da). Deshalb meldet\n    `planen` mit window.dnStaffelSteht = true, dass ein Durchgang ansteht, und der\n    Abgleich nimmt die Meldung am Ende zurueck; die Automatik wartet darauf (begrenzt).\n    Umgekehrt wartet die Staffel nicht mehr auf window.dnGiftLaeuft: ihre Aufgaben\n    gehen per Schluessel, Geschenkzeilen, die die Automatik einfuegt oder entfernt,\n    aendern die Schluessel der uebrigen Zeilen nicht.\n  */\n  var fehlversuche = 0;\n  var veraltetFolge = 0;\n  function abgleichen() {\n    var m = manifest();\n    /* Frei geben auch hier: Knopf und Takt-Wechsel sperren den Kauf bis zum naechsten Durchgang (window.dnStaffelSperren). */\n    if (!m || !m.aktiv) { window.dnStaffelSteht = false; sperren(false); return; }\n    if (laeuft) { nochmal = true; return; }\n    if (fehlversuche >= 3) { window.dnStaffelSteht = false; sperren(false); return; }\n\n    /* Getrennte Staffeln (2026-10-23): Einmalkauf-Zeilen nach nE, Abo-Zeilen nach nA. */\n    var anzahl = zaehlen(m.zeilen);\n    var d = staffel(anzahl.e);\n    /* Ab der ersten Stufe: Einmalkauf bundle-discount der Set-Tabelle (staffel oben). */\n    var st = stufeFuer(stufenTabelle(), anzahl.e);\n    /* Abo: ab 3 Designs die Stufe des Sets, bei 1 und 2 Designs die Gruppen \"(1 Designs)\" / \"(2 Designs)\" (genaue Plaene). */\n    var stA = aboStufeFuer(anzahl.a);\n    var ziel = stA ? stA.abo : Math.round(abo(staffel(anzahl.a)) * 100);\n    stufenKnoepfe(m, anzahl.a);\n\n    laeuft = true;\n    fetch('/cart.js', { headers: { 'Accept': 'application/json' } })\n      .then(function (r) { return r.json(); })\n      .then(function (frisch) {\n        var vorhanden = {}, position = {};\n        (frisch.items || []).forEach(function (i, idx) { vorhanden[i.key] = i; position[i.key] = idx + 1; });\n        /*\n          TAKT JE ZEILE (Bilal 2026-10-23, Entwurf design/Cart Drawer dc.html): jede Abo-Zeile behaelt ihren Takt, der\n          Abgleich waehlt den Plan der Stufe im EIGENEN Takt der Zeile. Bis dahin galt \"ein Takt fuer alle\" (Roman\n          2026-09-08): der Takt der juengsten Abo-Zeile zog alle anderen mit - ein Design von der Einzel-PDP mit 4 Wochen\n          stellte jedes Abo im Korb auf 4 Wochen um.\n        */\n        var veraltet = false;\n        var aufgaben = [];\n        m.zeilen.forEach(function (z) {\n          var aktuell = vorhanden[z.key];\n          if (!aktuell) { veraltet = true; return; }\n          var props = eigenschaften({ props: aktuell.properties || {} });\n          var abzug = parseFloat(props['_discountAmount']) || 0;\n          if (!z.frei) {\n            /*\n              Nicht frei, aber auch nicht gesperrt (Zubehoer, Pflege): seit 2026-09-14\n              (Roman) ohne Staffelrabatt. Traegt die Zeile noch den Abzug aus der Zeit,\n              in der jede freie Zeile zaehlte, kommt er weg - Set-Kinder und Geschenke\n              (sperre) behalten ihre Eigenschaften.\n            */\n            if (z.sperre) return;\n            if (props['_discountAmount'] === undefined && props['_bundled-product'] === undefined) return;\n            delete props['_discountAmount'];\n            delete props['_bundled-product'];\n            aufgaben.push({ id: z.key, line: position[z.key], quantity: aktuell.quantity, properties: propsZumSenden(props) });\n            return;\n          }\n          var planId = aktuell.selling_plan_allocation ? aktuell.selling_plan_allocation.selling_plan.id : 0;\n          if (planId) {\n            /* Abo-Zeilen tragen keinen Einmalkauf-Abzug - sonst Rabatt doppelt (Plan und Bundle Discount) */\n            var doppelt = props['_discountAmount'] !== undefined || props['_bundled-product'] !== undefined;\n            /* Der genaue Plan der Stufe im eigenen Takt der Zeile; traegt die Variante ihn nicht, wie bisher der hoechste\n               Plan bis zum Ziel - ebenfalls im eigenen Takt. */\n            var eigeneW = planWochen(aktuell.selling_plan_allocation.selling_plan.name) || z.wochen;\n            var p = stA ? stufenPlan(stA, eigeneW, z) : null;\n            if (!p) p = planWahl({ plan: planId, plaene: z.plaene, wochen: z.wochen }, ziel, null);\n            var neuerPlan = p && p.id !== planId ? p : null;\n            if (!neuerPlan && !doppelt) return;\n            delete props['_discountAmount'];\n            delete props['_bundled-product'];\n            if (neuerPlan && props['Subscription Discount'] !== undefined) props['Subscription Discount'] = Math.round(neuerPlan.proz) + '%';\n            aufgaben.push({ id: z.key, line: position[z.key], quantity: aktuell.quantity, selling_plan: neuerPlan ? neuerPlan.id : planId, properties: propsZumSenden(props) });\n          } else {\n            /* Einmalkauf-Zeilen tragen keinen Abo-Vermerk (bleibt sonst nach dem Wechsel stehen) */\n            var vermerk = props['Subscription Discount'] !== undefined;\n            delete props['Subscription Discount'];\n            /*\n              _discountAmount gilt fuer die GANZE Zeile, nicht je Stueck\n              (gemessen 2026-09-08: 1,69 auf zwei Pockets = 169 Cent Abzug,\n              3,38 = 338). Also Abzug je Stueck mal Menge - sonst bekam ein\n              doppelt gewaehltes Produkt nur den halben Rabatt.\n            */\n            /* Ganzzahlig wie die Produktseiten (Preis x Satz / 100 gerundet), damit beide denselben Cent geben. */\n            var stueck = d > 0 ? Math.round(z.preis * d) : 0;\n            if (st) stueck = st.einmal > 0 ? Math.round(z.preis * st.einmal / 100) : 0;\n            var soll = stueck > 0 ? Math.round(stueck * (aktuell.quantity || z.qty || 1)) / 100 : 0;\n            if (Math.abs(soll - abzug) < 0.005 && !vermerk) return;\n            if (soll > 0) {\n              props['_bundled-product'] = true;\n              props['_discountAmount'] = soll;\n            } else {\n              delete props['_bundled-product'];\n              delete props['_discountAmount'];\n            }\n            aufgaben.push({ id: z.key, line: position[z.key], quantity: aktuell.quantity, properties: propsZumSenden(props) });\n          }\n        });\n        /*\n          Manifest hinkt dem Warenkorb hinterher: erst frisch zeichnen, dann rechnen. Seit den getrennten Staffeln haengt die\n          Stufe an der Kaufart jeder Zeile - mit einem alten Manifest (Zeile eben ins Abo gestellt, hier noch Einmalkauf)\n          schriebe der Durchgang einmal die falsche Richtung. Hoechstens zweimal hintereinander, dann wie bisher.\n        */\n        if (veraltet && veraltetFolge < 2) {\n          veraltetFolge++;\n          return neuZeichnen(frisch).then(function () { return { fehler: 0, ok: 0, veraltet: true }; });\n        }\n        veraltetFolge = 0;\n        if (!aufgaben.length) return { fehler: 0, ok: 0 };\n        sperren(true);\n        return stapel(aufgaben).then(function (stand) {\n          return neuZeichnen(stand.warenkorb || null).then(function () { return stand; });\n        });\n      })\n      .then(function (stand) {\n        if (stand && stand.fehler) { fehlversuche++; nochmal = true; }\n        else if (stand && stand.ok) { fehlversuche = 0; }\n      })\n      .catch(function (fehler) { console.error('Staffel im Warenkorb:', fehler); fehlversuche++; })\n      .then(function () {\n        laeuft = false;\n        sperren(false);\n        window.dnStaffelSteht = false;\n        if (nochmal) { nochmal = false; planen(fehlversuche ? 1200 : 250); }\n      });\n  }\n  function planen(wartezeit) {\n    /* Meldung an die Geschenk-Automatik (theme.js): ein Durchgang steht an, erst danach Geschenke pruefen */\n    window.dnStaffelSteht = true;\n    clearTimeout(timer);\n    timer = setTimeout(abgleichen, wartezeit || 250);\n  }\n\n  /*\n    TAKT UND EINMALKAUF AUS DEM WARENKORB (Roman, 2026-09-21: \"wenn ich produkt im abo\n    habe, brauche ich das als option drauf zu klicken und frequenz oder auf one time\n    wieder umzustellen\"). Das Auswahlfeld an freien Abo-Design-Zeilen (dn-cart-takt)\n    ruft hierher:\n      art 'wochen', wert \"4\"|\"8\"|\"12\", domKey: nur DIESE Zeile wechselt den Takt (Takt je\n        Zeile seit 2026-10-23, Entwurf; davor zogen alle freien Abo-Zeilen mit), der Plan\n        mit demselben Prozentsatz im neuen Takt, sonst der hoechste darunter; der Abgleich\n        danach setzt die Stufe.\n      art 'einmal', domKey: nur diese Zeile zurueck auf Einmalkauf (selling_plan null,\n        Abo-Vermerk weg); der Abgleich gibt ihr danach den Einmalkauf-Abzug der Staffel.\n    Frische Schluessel aus /cart.js, Stapel ueber die Storefront API wenn moeglich,\n    danach neu zeichnen. Solange das laeuft, wartet der Abgleich (laeuft).\n  */\n  window.dnCartTakt = function (art, wert, domKey) {\n    var m = manifest();\n    if (!m || laeuft) return Promise.resolve(false);\n    laeuft = true;\n    sperren(true);\n    return fetch('/cart.js', { credentials: 'same-origin', headers: { 'Accept': 'application/json' } })\n      .then(function (r) { return r.json(); })\n      .then(function (frisch) {\n        var vorhanden = {}, position = {};\n        (frisch.items || []).forEach(function (i, idx) { vorhanden[i.key] = i; position[i.key] = idx + 1; });\n        var aufgaben = [];\n        if (art === 'einmal') {\n          var aktuell = vorhanden[domKey] || null;\n          if (!aktuell) {\n            var variante = parseInt(domKey, 10);\n            (frisch.items || []).some(function (i) { if (i.variant_id === variante && i.selling_plan_allocation) { aktuell = i; return true; } return false; });\n          }\n          if (!aktuell || !aktuell.selling_plan_allocation) return neuZeichnen(frisch);\n          var props1 = eigenschaften({ props: aktuell.properties || {} });\n          delete props1['Subscription Discount']; delete props1['_discountAmount']; delete props1['_bundled-product'];\n          aufgaben.push({ id: aktuell.key, line: position[aktuell.key], quantity: aktuell.quantity, selling_plan: null, properties: propsZumSenden(props1) });\n        } else {\n          var tabT = (stufenTabelle() || []).concat(kleinTabelle());\n          if (!tabT.length) tabT = null;\n          /*\n            Takt je Zeile: die Manifest-Zeile des Auswahlfelds (gleicher Render wie der DOM, also Schluessel domKey); die\n            frische Zeile aus /cart.js per Schluessel, sonst dieselbe Variante mit DEMSELBEN Plan - seit es Takt je Zeile\n            gibt, kann ein Design zweimal im Abo liegen (4 und 8 Wochen), dann traf \"erste Zeile der Variante\" die falsche.\n          */\n          m.zeilen.forEach(function (z) {\n            if (z.key !== domKey) return;\n            if (!z.plan || z.sperre || z.art !== 'design') return;\n            var akt = vorhanden[z.key] || null;\n            if (!akt) (frisch.items || []).some(function (i) { if (i.variant_id === z.id && i.selling_plan_allocation && i.selling_plan_allocation.selling_plan.id === z.plan) { akt = i; return true; } return false; });\n            if (!akt || !akt.selling_plan_allocation) return;\n            var zielKey = akt.key;\n            /* Zeile auf einem Plan einer Stufe (Tabelle): derselbe Stufen-Plan im neuen Takt, genaue Kennung (2026-10-09). */\n            if (tabT) {\n              var stZ = null;\n              tabT.forEach(function (s) { (s.plaene || []).forEach(function (x) { if (x.id === z.plan) stZ = s; }); });\n              var sp = stZ ? stufenPlan(stZ, wert, z) : null;\n              if (sp) {\n                if (sp.id === z.plan) return;\n                var propsS = eigenschaften({ props: akt.properties || {} });\n                if (propsS['Subscription Discount'] !== undefined) propsS['Subscription Discount'] = Math.round(sp.proz) + '%';\n                aufgaben.push({ id: zielKey, line: position[zielKey], quantity: akt.quantity, selling_plan: sp.id, properties: propsZumSenden(propsS) });\n                return;\n              }\n            }\n            var jetzt = null;\n            (z.plaene || []).forEach(function (p) { if (p.id === z.plan) jetzt = p; });\n            var proz = jetzt ? jetzt.proz : null;\n            var imTakt = (z.plaene || []).filter(function (p) { return String(p.wochen) === String(wert); });\n            if (!imTakt.length) return;\n            var treffer = null;\n            imTakt.forEach(function (p) { if (proz !== null && Math.abs(p.proz - proz) < 0.01) treffer = p; });\n            if (!treffer) imTakt.forEach(function (p) { if ((proz === null || p.proz <= proz + 0.01) && (!treffer || p.proz > treffer.proz)) treffer = p; });\n            if (!treffer) treffer = imTakt[0];\n            if (treffer.id === z.plan) return;\n            var props2 = eigenschaften({ props: akt.properties || {} });\n            if (props2['Subscription Discount'] !== undefined) props2['Subscription Discount'] = Math.round(treffer.proz) + '%';\n            aufgaben.push({ id: zielKey, line: position[zielKey], quantity: akt.quantity, selling_plan: treffer.id, properties: propsZumSenden(props2) });\n          });\n        }\n        if (!aufgaben.length) return neuZeichnen(frisch);\n        return stapel(aufgaben).then(function (stand) { return neuZeichnen(stand.warenkorb || null); });\n      })\n      .catch(function (fehler) { console.error('Takt im Warenkorb:', fehler); })\n      /* Gesperrt lassen: zurueck auf Einmalkauf verschiebt beide Staffeln, der Durchgang danach schreibt sie und gibt frei. */\n      .then(function () { laeuft = false; planen(300); return true; });\n  };\n\n  var wurzel = document.querySelector('#mini-cart');\n  if (wurzel) {\n    /* gesperrt: auch das Neuzeichnen des Themes (innerHTML) bringt einen offenen Kaufknopf mit */\n    new MutationObserver(function () { knoepfeJetzt(); if (gesperrt) sperren(true); planen(); }).observe(wurzel, { childList: true, subtree: true });\n    planen();\n  }\n  /* Riegel unabhaengig vom Attribut: solange gesperrt, geht kein Klick und kein Absenden der Schublade an die Kasse */\n  ['click', 'submit'].forEach(function (art) {\n    document.addEventListener(art, function (e) {\n      if (!gesperrt) return;\n      var ziel = e.target && e.target.closest ? e.target.closest(art === 'click' ? '#mini-cart .checkout-button' : '#mini-cart-form') : null;\n      if (!ziel) return;\n      e.preventDefault();\n      e.stopImmediatePropagation();\n    }, true);\n  });\n  /*\n    Warenkorb-Ereignisse melden den Durchgang SOFORT (window.dnStaffelSteht in planen), nicht erst,\n    wenn der Beobachter das Neuzeichnen der Schublade sieht: die Geschenk-Automatik (theme.js,\n    dnStaffelAbwarten) startet mit demselben cart:updated und las sonst noch vor der Staffel einen\n    Warenkorb mit dem Abzug der alten Menge (gemessen 2026-09-21 nach US #1213: 8 -> 5 Designs warf\n    Brownie weiter kurz raus). Der Nachhall der Automatik (giftPass) zaehlt nicht.\n  */\n  ['cart:updated', 'cart:refresh'].forEach(function (name) {\n    document.documentElement.addEventListener(name, function (e) {\n      if (e && e.detail && e.detail.giftPass) return;\n      planen();\n    });\n  });\n\n})();\n\n/* ------------------------------------------------------------------\n   Freie Saetze gehen Zeile fuer Zeile.\n\n   Das Theme (theme.js, checkBundleQytChange) nullt bei JEDER\n   Mengenaenderung an einer Zeile mit `_set`/`_set_id` alle Zeilen des\n   Satzes - auch beim Schritt von 1 auf 2. Fuer Starter Set und Mix & Match\n   ist das gewollt, fuer die Saetze des Farbwaehlers der Einzelproduktseite\n   nicht mehr: ihr Rabatt ist seit der warenkorbweiten Staffel eine\n   Rechnung ueber den ganzen Warenkorb, nicht mehr ueber den Satz (gemessen:\n   das X an einer von zwei Zeilen nahm beide mit). Deshalb fangen X und\n   Mengenwahl an Zeilen mit data-dn-set-frei hier ab und aendern nur diese\n   eine Zeile; die Staffel rechnet der Abgleich oben danach neu.\n   ------------------------------------------------------------------ */\n(function () {\n  function freieZeile(el) {\n    var li = el && el.closest ? el.closest('line-item[data-dn-set-frei]') : null;\n    return li && li.closest('.dn-cart-v2') ? li : null;\n  }\n  function aendern(key, menge) {\n    return fetch('/cart/change.js', {\n      method: 'POST',\n      credentials: 'same-origin',\n      headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n      body: JSON.stringify({ id: key, quantity: menge })\n    }).then(function (r) {\n      if (!r.ok) throw new Error('change.js ' + r.status);\n      return r.json();\n    });\n  }\n  function fertig(warenkorb) {\n    if (typeof window.dnCartNeuZeichnen === 'function') return window.dnCartNeuZeichnen(warenkorb);\n    document.documentElement.dispatchEvent(new CustomEvent('cart:refresh', { bubbles: true, detail: { cart: warenkorb } }));\n  }\n  /* Der Schluessel im DOM kann veraltet sein: der Abgleich schreibt Properties\n     (Staffel, Kaufplan) und damit neue Schluessel, und zwei Neuzeichnungen\n     (Theme nach cart:refresh, Abgleich danach) koennen sich kreuzen. Ein Klick\n     mit altem Schluessel lief ins Leere und die Zeile blieb stehen (Roman,\n     2026-09-06). Deshalb vor jeder Aenderung den aktuellen Schluessel aus\n     /cart.js holen: gleicher Schluessel, sonst gleiche Variante im gleichen\n     Satz. Nichts gefunden heisst: die Zeile ist schon weg, nur neu zeichnen. */\n  function frischerKey(li) {\n    var domKey = li.getAttribute('data-key') || '';\n    var satz = li.getAttribute('data-dn-set') || '';\n    var variante = parseInt(domKey, 10);\n    return fetch('/cart.js', { credentials: 'same-origin', headers: { 'Accept': 'application/json' } })\n      .then(function (r) { return r.json(); })\n      .then(function (c) {\n        var items = (c && c.items) || [];\n        for (var i = 0; i < items.length; i++) if (items[i].key === domKey) return items[i].key;\n        for (var j = 0; j < items.length; j++) {\n          var it = items[j];\n          if (it.variant_id === variante && (!satz || (it.properties && String(it.properties._set_id) === satz))) return it.key;\n        }\n        return null;\n      });\n  }\n\n  document.addEventListener('click', function (ereignis) {\n    var ziel = ereignis.target;\n    var knopf = ziel && ziel.closest ? ziel.closest('.cart_title_remove_icon, .line-item__remove-button') : null;\n    if (!knopf) return;\n    var li = freieZeile(knopf);\n    if (!li) return;\n    var key = li.getAttribute('data-key');\n    if (!key) return;\n    ereignis.preventDefault();\n    ereignis.stopPropagation();\n    ereignis.stopImmediatePropagation();\n    li.classList.add('dn-satz-geht');\n    frischerKey(li).then(function (frisch) {\n      if (!frisch) return fertig();\n      return aendern(frisch, 0).then(fertig);\n    }).catch(function (fehler) {\n      console.error('Zeile konnte nicht entfernt werden:', fehler);\n      li.classList.remove('dn-satz-geht');\n    });\n  }, true);\n\n  document.addEventListener('change', function (ereignis) {\n    var feld = ereignis.target;\n    if (!feld || !feld.matches || !feld.matches('line-item-quantity select, line-item-quantity input')) return;\n    var li = freieZeile(feld);\n    if (!li) return;\n    var key = li.getAttribute('data-key');\n    var menge = parseInt(feld.value, 10);\n    if (!key || isNaN(menge) || menge < 0) return;\n    ereignis.stopPropagation();\n    ereignis.stopImmediatePropagation();\n    feld.disabled = true;\n    frischerKey(li).then(function (frisch) {\n      if (!frisch) return fertig();\n      return aendern(frisch, menge).then(fertig);\n    }).catch(function (fehler) {\n      console.error('Menge konnte nicht geaendert werden:', fehler);\n      feld.disabled = false;\n      /* Stepper zeigt die neue Zahl schon und ist gesperrt: vom Server neu zeichnen, damit Zahl und Knoepfe stimmen */\n      fertig();\n    });\n  }, true);\n})();\n\n/* ------------------------------------------------------------------\n   Einmalkauf-Zeile ins Abo (Roman, 2026-09-21: \"bei produkten die one time sind\n   im cart, schreibe statt one time Subscribe & Save 15% damit user das auch\n   direkt im cart subscriben koennen\").\n\n   snippets/dn-cart-abo.liquid (bis 2026-10-23 dn-cart-takt) rendert an Einmalkauf-Design-Zeilen den Knopf\n   [data-dn-abo-plan] mit dem 10-%-Plan der Loop-Gruppe \"Subscribe & Save (1 Design)\" (seit der Preisleiter\n   2026-09-21; davor der 15-%-Plan); stufenKnoepfe setzt die Abo-Stufe nA + Menge der Zeile. Klick: frischen\n   Schluessel aus /cart.js holen (change.js vergibt neue Schluessel, der DOM\n   kann veraltet sein - wie bei X und Menge oben), Eigenschaften der Zeile\n   uebernehmen ohne den Einmalkauf-Abzug der Staffel (_discountAmount,\n   _bundled-product) und mit dem Abo-Vermerk \"Subscription Discount\", dann\n   EINE change.js-Anfrage mit selling_plan. Danach neu zeichnen; der\n   Staffel-Abgleich (oben) stuft danach beide Seiten neu: die Abo-Zeilen nach\n   nA, die verbliebenen Einmalkauf-Zeilen nach nE (getrennte Staffeln seit 2026-10-23).\n   ------------------------------------------------------------------ */\n(function () {\n  var laeuft = false;\n  function props(item) {\n    var p = {}; var q = item.properties || {};\n    Object.keys(q).forEach(function (k) { if (q[k] !== null && q[k] !== undefined && String(q[k]) !== '') p[k] = String(q[k]); });\n    return p;\n  }\n  function fertig(warenkorb) {\n    if (typeof window.dnCartNeuZeichnen === 'function') return window.dnCartNeuZeichnen(warenkorb);\n    document.documentElement.dispatchEvent(new CustomEvent('cart:refresh', { bubbles: true, detail: { cart: warenkorb } }));\n  }\n  /* Auswahlfeld an Abo-Zeilen: Takt nur fuer diese Zeile (seit 2026-10-23), \"one\" stellt sie auf Einmalkauf */\n  document.addEventListener('change', function (ereignis) {\n    var feld = ereignis.target;\n    if (!feld || !feld.matches || !feld.matches('#mini-cart select[data-dn-takt-wahl]')) return;\n    ereignis.stopPropagation();\n    if (typeof window.dnCartTakt !== 'function') return;\n    var li = feld.closest('line-item');\n    var domKey = li ? (li.getAttribute('data-key') || '') : '';\n    var wert = feld.value;\n    feld.disabled = true;\n    feld.classList.add('is-dn-wait');\n    window.dnCartTakt(wert === 'one' ? 'einmal' : 'wochen', wert, domKey).then(function (ok) {\n      if (ok === false) { feld.disabled = false; feld.classList.remove('is-dn-wait'); }\n    });\n  }, true);\n  /* Haken \"Subscribed\" im Abo-Kasten (snippets/dn-cart-abo, Entwurf 2026-10-23): abwaehlen = diese Zeile zurueck auf Einmalkauf */\n  document.addEventListener('click', function (ereignis) {\n    var knopf = ereignis.target && ereignis.target.closest ? ereignis.target.closest('#mini-cart [data-dn-abo-aus]') : null;\n    if (!knopf) return;\n    ereignis.preventDefault();\n    ereignis.stopPropagation();\n    if (knopf.disabled || typeof window.dnCartTakt !== 'function') return;\n    var li = knopf.closest('line-item');\n    var domKey = li ? (li.getAttribute('data-key') || '') : '';\n    knopf.disabled = true;\n    knopf.classList.add('is-dn-wait');\n    /* Laeuft gerade ein Staffel-Durchgang, antwortet dnCartTakt mit false - dann kurz warten und erneut, statt den Klick zu verlieren */\n    (function versuchen(n) {\n      window.dnCartTakt('einmal', 'one', domKey).then(function (ok) {\n        if (ok !== false) return;\n        if (n < 8) { setTimeout(function () { versuchen(n + 1); }, 600); return; }\n        knopf.disabled = false; knopf.classList.remove('is-dn-wait');\n      });\n    })(0);\n  }, true);\n  document.addEventListener('click', function (ereignis) {\n    var knopf = ereignis.target && ereignis.target.closest ? ereignis.target.closest('#mini-cart [data-dn-abo-plan]') : null;\n    if (!knopf) return;\n    ereignis.preventDefault();\n    ereignis.stopPropagation();\n    if (laeuft) return;\n    var li = knopf.closest('line-item');\n    var domKey = li ? (li.getAttribute('data-key') || '') : '';\n    var variante = parseInt(knopf.getAttribute('data-dn-abo-variante'), 10) || parseInt(domKey, 10);\n    var plan = parseInt(knopf.getAttribute('data-dn-abo-plan'), 10);\n    var proz = parseInt(knopf.getAttribute('data-dn-abo-proz'), 10) || 10;\n    if (!plan) return;\n    laeuft = true;\n    knopf.classList.add('is-dn-wait');\n    knopf.disabled = true;\n    /* Kauf gesperrt bis der Staffel-Durchgang danach auch die uebrigen Zeilen umgestuft hat (gibt selbst frei) */\n    if (typeof window.dnStaffelSperren === 'function') window.dnStaffelSperren(true);\n    fetch('/cart.js', { credentials: 'same-origin', headers: { 'Accept': 'application/json' } })\n      .then(function (r) { return r.json(); })\n      .then(function (c) {\n        var items = (c && c.items) || [];\n        var item = null;\n        for (var i = 0; i < items.length; i++) { if (items[i].key === domKey) { item = items[i]; break; } }\n        if (!item) {\n          for (var k = 0; k < items.length; k++) {\n            if (items[k].variant_id === variante && !items[k].selling_plan_allocation) { item = items[k]; break; }\n          }\n        }\n        if (!item) return fertig();\n        if (item.selling_plan_allocation) return fertig();\n        var p = props(item);\n        delete p['_discountAmount'];\n        delete p['_bundled-product'];\n        p['Subscription Discount'] = proz + '%';\n        return fetch('/cart/change.js', {\n          method: 'POST',\n          credentials: 'same-origin',\n          headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n          body: JSON.stringify({ id: item.key, quantity: item.quantity, selling_plan: plan, properties: p })\n        }).then(function (r) {\n          if (!r.ok) throw new Error('change.js ' + r.status);\n          return r.json();\n        }).then(fertig);\n      })\n      .catch(function (fehler) {\n        console.error('Zeile konnte nicht ins Abo gestellt werden:', fehler);\n        knopf.classList.remove('is-dn-wait');\n        knopf.disabled = false;\n        if (typeof window.dnStaffelSperren === 'function') window.dnStaffelSperren(false);\n      })\n      .then(function () { laeuft = false; });\n  }, true);\n\n  /*\n    Mengen-Stepper \"- n +\" (Entwurf 2026-10-23) statt der Auswahlliste: setzt den Wert der versteckten Auswahl daneben und\n    meldet ein change. So laufen alle bisherigen Wege unveraendert - freie Saetze ueber den Block \"Freie Saetze\" oben (frischer\n    Schluessel, nur diese Zeile), alles andere ueber LineItemQuantity des Themes. Grenzen sind die Optionen der Auswahl (1-15).\n  */\n  document.addEventListener('click', function (ereignis) {\n    var knopf = ereignis.target && ereignis.target.closest ? ereignis.target.closest('#mini-cart [data-dn-schritt]') : null;\n    if (!knopf) return;\n    ereignis.preventDefault();\n    var box = knopf.closest('line-item-quantity');\n    var feld = box ? box.querySelector('select.qty-selector:not([disabled])') : null;\n    if (!feld || knopf.disabled) return;\n    /* Basis ist die gerenderte Menge (data-qty), nicht feld.value - der war bei Mengen ueber der Liste leer */\n    var jetzt = parseInt(feld.getAttribute('data-qty'), 10) || parseInt(feld.value, 10) || 1;\n    var neu = jetzt + (parseInt(knopf.getAttribute('data-dn-schritt'), 10) || 0);\n    if (neu < 1 || !feld.querySelector('option[value=\"' + neu + '\"]')) return;\n    feld.value = String(neu);\n    var wert = box.querySelector('.dn-stepper__wert');\n    if (wert && wert.firstChild) wert.firstChild.nodeValue = String(neu);\n    box.querySelectorAll('[data-dn-schritt]').forEach(function (b) { b.disabled = true; });\n    feld.dispatchEvent(new Event('change', { bubbles: true }));\n  });\n})();\n\n/* ------------------------------------------------------------------\n   Sichtbare Anzahl in der Kopf-Blase.\n\n   Das Theme schreibt nach jeder Aenderung `cart.item_count` in die\n   <cart-count>-Blasen - bei einem Starter Set also fuenf statt eins. Die\n   Schublade rendert die sichtbare Anzahl schon serverseitig\n   (snippets/dn-cart-anzahl.liquid); hier dieselbe Regel fuer die Blasen im\n   Kopf und im LP-Kopf, ausgeloest von denselben Ereignissen. Dieses Skript\n   laedt nach theme.js, seine Zuhoerer laufen deshalb nach denen des Themes\n   und ueberschreiben dessen Zahl.\n   ------------------------------------------------------------------ */\n(function () {\n  function istEltern(p) {\n    if (p['_bundle-parent'] || p['_starter-set-parent'] || p['_refill-bundle-parent'] || p['_childItemsJson']) return true;\n    return Object.keys(p).some(function (k) { return k.indexOf('_variants_set') > -1 || k.indexOf('_free_variants') > -1; });\n  }\n  function sichtbareAnzahl(cart) {\n    var items = (cart && cart.items) || [];\n    var eltern = {}, starter = {};\n    items.forEach(function (i) {\n      var p = i.properties || {};\n      var satz = p._set_id || p._set || '';\n      if (!satz) return;\n      if (istEltern(p)) eltern[satz] = true;\n      else if (p._set_handle || p._onetime_tag || p._subscription_tag) starter[satz] = true;\n    });\n    var n = 0, gezaehlt = {};\n    items.forEach(function (i) {\n      var p = i.properties || {};\n      var satz = p._set_id || p._set || '';\n      if (istEltern(p)) { n += i.quantity || 0; return; }\n      if (p['_bundled-collection']) return;\n      if (satz && eltern[satz]) return;\n      if (satz && starter[satz]) { if (!gezaehlt[satz]) { gezaehlt[satz] = true; n += 1; } return; }\n      n += i.quantity || 0;\n    });\n    return n;\n  }\n  function schreiben(n) {\n    document.querySelectorAll('cart-count').forEach(function (el) { el.innerText = n; });\n    document.querySelectorAll('[data-dn-lp-count]').forEach(function (el) { el.textContent = n; el.hidden = n === 0; });\n  }\n  function setzen(cart) {\n    if (cart && cart.items) {\n      schreiben(sichtbareAnzahl(cart));\n      return;\n    }\n    /* Ohne Warenkorb im Ereignis holt auch das Theme /cart.js und schreibt\n       item_count, sobald es antwortet - deshalb hier nach der Antwort und\n       noch einmal kurz danach. */\n    fetch('/cart.js', { headers: { 'Accept': 'application/json' } })\n      .then(function (r) { return r.json(); })\n      .then(function (c) {\n        var n = sichtbareAnzahl(c);\n        schreiben(n);\n        setTimeout(function () { schreiben(n); }, 800);\n      })\n      .catch(function () {});\n  }\n  ['cart:updated', 'cart:refresh'].forEach(function (name) {\n    document.documentElement.addEventListener(name, function (e) { setzen(e && e.detail && e.detail.cart); });\n  });\n  window.dnSichtbareAnzahl = sichtbareAnzahl;\n})();\n\n/* ------------------------------------------------------------------\n   MIX & MATCH-ZEILE (Roman, 2026-09-21: \"ok dann gehen wir mit deiner\n   empfehlung\"): eine dauerhafte Zeile unter der Versandleiste statt des\n   10-Sekunden-Hinweises vom 2026-09-14 (\"weil ist nur kurz eingeblendet,\n   deshalb muss klar sein auf einen blick\").\n\n   Kein Liquid, kein Dauer-Markup in der Section: das Skript liest die Zahl\n   der zaehlenden Designs aus dem Manifest (snippets/dn-cart-staffel) und\n   schreibt EINEN Satz - aktuelle Ersparnis und naechste Stufe - beim Laden,\n   beim Oeffnen und nach jedem Neuzeichnen in place. Ohne zaehlendes Design\n   (leer, nur Zubehoer, nur Sets) steht nichts. Kein Timer, keine Animation.\n\n   Prozente: nie Abo und Einmalkauf in einem Satz mischen (Roman 2026-09-21). Seit\n   den getrennten Staffeln (2026-10-23) zwei Zeilen: \"Mix & Match:\" mit der\n   Einmalkauf-Staffel der Einmalkauf-Designs (2/3/4/5/6 -> 5/15/20/25/30 %), und\n   wenn Abo-Designs im Korb liegen \"Subscribe & Save:\" mit der Abo-Staffel der\n   Abo-Designs (1-6 -> 10/15/25/30/35/40 %).\n   ------------------------------------------------------------------ */\n(function () {\n  var wurzel = document.querySelector('#mini-cart');\n  if (!wurzel) return;\n  var eigene = false;\n\n  function stand() {\n    var el = wurzel.querySelector('[data-dn-staffel]');\n    if (!el) return null;\n    var zeilen;\n    try { zeilen = JSON.parse(el.textContent); } catch (e) { return null; }\n    /* Getrennte Staffeln (2026-10-23): Mix & Match-Satz nach den Einmalkauf-Designs (e), Abo-Satz nach den Abo-Designs (a). */\n    var e = 0, a = 0;\n    zeilen.forEach(function (z) { if (z.zaehlt) { if (z.plan) a += z.qty || 0; else e += z.qty || 0; } });\n    return { e: e, a: a, aktiv: el.getAttribute('data-dn-staffel-aktiv') === 'true' };\n  }\n  /* Abo-Leiter 1-6 Designs (10/15/25/30/35/40 %) aus denselben Tabellen wie der Abgleich (dnStaffelStufen.abo). */\n  function aboLeiter() {\n    var basis = [[1, 10], [2, 15], [3, 25], [4, 30], [5, 35], [6, 40]];\n    var ss = window.dnStaffelStufen;\n    if (!ss || typeof ss.abo !== 'function') return basis;\n    return basis.map(function (x) { return [x[0], ss.abo(x[0]) || x[1]]; });\n  }\n  /* Leiter des Hinweises = die Staffel des Abgleichs (seit 2026-10-09 ab 3 Designs aus data-dn-staffel-stufen, Einmalkauf -\n     der Hinweis nennt immer den Einmalkauf, #1186); ohne Tabelle dieselben Zahlen. */\n  function leiterJetzt() {\n    var basis = [[2, 5], [3, 15], [4, 20], [5, 25], [6, 30]];\n    var ss = window.dnStaffelStufen, tab = ss ? ss.tabelle() : null;\n    if (!tab) return basis;\n    var erste = tab[0].frei;\n    return basis.filter(function (x) { return x[0] < erste; }).concat(tab.map(function (x) { return [x.frei, x.einmal]; }));\n  }\n  /*\n    Wortlaut mit Roman abgestimmt (2026-09-21); Marke schwarz fett, der Satz danach normal:\n      mittlere Stufe  \"Mix & Match: 10% off. Add 1 more design for 15%.\"\n      hoechste Stufe  \"Mix & Match: 25% off. Add more designs, keep 25%.\"\n                      (Roman 2026-09-22: kein Deckel-Wortlaut, sondern die Einladung, weiter zu legen; und kurz genug\n                      fuer eine Zeile auf dem Handy, die lange Fassung \"25% off on every design. Add more, the discount\n                      stays.\" brach bei 390 px um)\n      erstes Design   \"Mix & Match: add 1 more design and save 5%.\"\n  */\n  /*\n    Abo-Zeile (seit 2026-10-23, ersetzt \"N% off on top\" - mit getrennten Staffeln liegt das Abo nicht mehr auf der\n    Einmalkauf-Stufe): dieselben Muster, gezaehlt werden die Abo-Designs, der Schritt heisst \"Subscribe\" und ohne\n    \"design\" - mit dem Wort brach die Zeile bei 375 px um (gemessen), so bleibt sie eine Zeile:\n      \"Subscribe & Save: 10% off. Subscribe 1 more for 15%.\"   hoechste Stufe \"40% off. Subscribe more, keep 40%.\"\n  */\n  function satzFuer(leiter, n, tun, wort) {\n    var jetzt = 0;\n    leiter.forEach(function (x) { if (x[0] <= n) jetzt = x[1]; });\n    var naechste = null;\n    leiter.forEach(function (st) { if (!naechste && st[0] > n) naechste = st; });\n    if (!naechste) return jetzt + '% off. ' + tun + ' more' + (wort ? ' ' + wort + 's' : '') + ', keep ' + jetzt + '%.';\n    var fehlt = naechste[0] - n;\n    var designs = fehlt + ' more' + (wort ? ' ' + wort + (fehlt === 1 ? '' : 's') : '');\n    if (jetzt > 0) return jetzt + '% off. ' + tun + ' ' + designs + ' for ' + naechste[1] + '%.';\n    return tun.toLowerCase() + ' ' + designs + ' and save ' + naechste[1] + '%.';\n  }\n  function text(s) {\n    return (s.e > 0 ? '<p class=\"dn-nudge__text\"><span class=\"dn-nudge__marke\">Mix &amp; Match:</span> ' + satzFuer(leiterJetzt(), s.e, 'Add', 'design') + '</p>' : '') +\n      (s.a > 0 ? '<p class=\"dn-nudge__text' + (s.e > 0 ? ' dn-nudge__text--abo' : '') + '\"><span class=\"dn-nudge__marke\">Subscribe &amp; Save:</span> ' + satzFuer(aboLeiter(), s.a, 'Subscribe', '') + '</p>' : '');\n  }\n  function entfernen() {\n    wurzel.querySelectorAll('.dn-nudge').forEach(function (el) { el.remove(); });\n  }\n  function zeigen(s) {\n    var el = wurzel.querySelector('.dn-nudge');\n    var nudgeKey = String(s.e) + '|' + String(s.a);\n    if (el && el.getAttribute('data-dn-nudge-n') === nudgeKey) return;\n    eigene = true;\n    if (!el) {\n      el = document.createElement('div');\n      el.className = 'dn-nudge';\n      el.setAttribute('role', 'status');\n      var leiste = wurzel.querySelector('free-shipping-bar.dn-cp');\n      var inhaltBox = wurzel.querySelector('.drawer__content');\n      if (leiste && leiste.parentNode) leiste.parentNode.insertBefore(el, leiste.nextSibling);\n      else if (inhaltBox) inhaltBox.insertBefore(el, inhaltBox.firstChild);\n      else { eigene = false; return; }\n    }\n    el.setAttribute('data-dn-nudge-n', nudgeKey);\n    el.innerHTML = text(s);\n    eigene = false;\n  }\n  function pruefen() {\n    if (eigene) return;\n    var s = stand();\n    /* leere Schublade rendert kein Manifest -> nichts anzeigen; Staffel aus -> nichts anzeigen */\n    if (!s || !s.aktiv || s.e + s.a < 1) { entfernen(); return; }\n    zeigen(s);\n  }\n  var wartezeit = null;\n  new MutationObserver(function () {\n    if (eigene) return;\n    clearTimeout(wartezeit);\n    wartezeit = setTimeout(pruefen, 120);\n  }).observe(wurzel, { childList: true, subtree: true });\n  pruefen();\n})();\n"],
  "mappings": "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",
  "names": ["variante", "k"]
}
