{
  "version": 3,
  "sources": ["/cdn/shop/t/34/assets/zy-store.js?cb=1793924378744"],
  "sourcesContent": ["/* Warenkorb-Zustand: echter Shopify-Warenkorb \u00FCber die AJAX-API (/cart.js, /cart/add.js, /cart/change.js).\n   Preise, Staffel-Rabatte und Geschenke rechnet Shopify. Hier wird nur gelesen, hinzugef\u00FCgt und ge\u00E4ndert. */\n(function () {\n  const D = window.ZY;\n  const R = Object.assign({ root: '/', cart: '/cart' }, D.routes);\n  const url = p => R.root.replace(/\\/$/, '') + p;\n  const blank = { items: [], item_count: 0, total_price: 0, original_total_price: 0, items_subtotal_price: 0, total_discount: 0, cart_level_discount_applications: [] };\n\n  let state = blank;\n  const subs = new Set();\n  const cents = v => (v || 0) / 100;\n\n  // Raumduft-Test-Ad-Set (Seite /products/raumduft-150-ml?view=raumduft-1-1):\n  // RAUMDUFT11 = 2 D\u00FCfte, 1 bezahlen (44,95 \u20AC). RAUMDUFT3 = 3 D\u00FCfte f\u00FCr 59,95 \u20AC (3. Duft f\u00FCr 15 \u20AC mehr).\n  // Nur wer einen dieser Codes im Warenkorb hat, bekommt den Vorschlag und den automatischen Wechsel. Alle anderen Warenk\u00F6rbe bleiben unver\u00E4ndert.\n  const AD = { one: 'RAUMDUFT11', three: 'RAUMDUFT3', threeTotal: 59.95 };\n  const hasCode = code => (state.discount_codes || []).some(c => c && String(c.code).toUpperCase() === code);\n  const roomIdSet = () => new Set(D.scents.map(s => s.variant).filter(Boolean));\n  const roomCount = () => { const ids = roomIdSet(); return state.items.filter(i => ids.has(i.variant_id)).reduce((a, i) => a + i.quantity, 0); };\n\n  function totals() {\n    const total = cents(state.total_price);\n    const original = cents(state.original_total_price);\n    const unlocked = D.thresholds.filter(t => total >= t.amount);\n    const next = D.thresholds.find(t => total < t.amount) || null;\n    // Raumd\u00FCfte im Warenkorb (f\u00FCr den Staffel-Vorschlag)\n    const roomIds = new Set(D.scents.map(s => s.variant).filter(Boolean));\n    const roomQty = state.items.filter(i => roomIds.has(i.variant_id)).reduce((a, i) => a + i.quantity, 0);\n    let upsell = null;\n    const maxTier = D.tiers[D.tiers.length - 1].qty;\n    // Test-Ad-Set Raumduft: eigene Rechnung statt Staffel (2 f\u00FCr 44,95, 3 f\u00FCr 59,95)\n    const adCart = hasCode(AD.one) || hasCode(AD.three);\n    if (adCart) {\n      if (roomQty === 2) {\n        const inCart = new Set(state.items.map(i => i.variant_id));\n        const pick = D.scents.find(s => !s.soldOut && !inCart.has(s.variant)) || D.scents.find(s => !s.soldOut) || {};\n        const roomNow = state.items.filter(i => roomIds.has(i.variant_id)).reduce((a, i) => a + i.final_line_price, 0) / 100;\n        const delta = Math.round((AD.threeTotal - roomNow) * 100) / 100;\n        if (pick.id && delta > 0) upsell = { from: 2, to: 3, delta, scent: pick.id };\n      }\n    } else if (roomQty > 0 && roomQty < maxTier) {\n      const now = D.tier(roomQty), then = D.tier(roomQty + 1);\n      const inCart = new Set(state.items.map(i => i.variant_id));\n      const first = D.scents.find(s => s.variant === (state.items.find(i => roomIds.has(i.variant_id)) || {}).variant_id);\n      const pool = D.scents.filter(s => !s.soldOut && !inCart.has(s.variant));\n      const same = pool.filter(s => first && s.moment === first.moment);\n      // Vorschlag: am liebsten ein neuer Duft, sonst ein schon gew\u00E4hlter (zweimal derselbe ist erlaubt)\n      const scent = (same[0] || pool[0] || D.scents.find(s => !s.soldOut) || {}).id;\n      if (now && then && scent) upsell = { from: roomQty, to: roomQty + 1, delta: Math.round((then.price - now.price) * 100) / 100, scent };\n    }\n    return {\n      total, original, merch: total,\n      savings: Math.max(0, Math.round((original - total) * 100) / 100),\n      shipping: D.thresholds.some(t => t.key === 'shipping') ? (unlocked.some(t => t.key === 'shipping') ? 0 : null) : null,\n      unlocked, next, roomQty, upsell, items: state.item_count\n    };\n  }\n\n  function emit(meta) { const t = totals(); subs.forEach(fn => fn(state, t, meta || {})); }\n\n  async function request(path, body, extraHeaders) {\n    const res = await fetch(url(path), {\n      method: body ? 'POST' : 'GET',\n      headers: Object.assign({ 'Content-Type': 'application/json', Accept: 'application/json' }, extraHeaders || {}),\n      body: body ? JSON.stringify(body) : undefined,\n      credentials: 'same-origin'\n    });\n    const data = await res.json().catch(() => ({}));\n    if (!res.ok) throw new Error(data.description || data.message || 'Warenkorb nicht erreichbar');\n    return data;\n  }\n\n  // Test-Ad-Set Raumduft: passenden Code setzen, ab 3 Raumd\u00FCften RAUMDUFT3, darunter RAUMDUFT11.\n  // Gibt true zur\u00FCck, wenn der Code gewechselt wurde (der Warenkorb ist dann schon neu geladen).\n  let switching = false;\n  async function syncAdCode() {\n    if (switching || !(hasCode(AD.one) || hasCode(AD.three))) return false;\n    const want = roomCount() >= 3 ? AD.three : AD.one;\n    const codes = (state.discount_codes || []).map(c => String(c.code).toUpperCase());\n    if (codes.length === 1 && codes[0] === want) return false;\n    switching = true;\n    try {\n      await request('/cart/update.js', { discount: want });\n      state = await request('/cart.js');\n    } finally { switching = false; }\n    return true;\n  }\n\n  async function refresh(meta) {\n    state = await request('/cart.js');\n    await syncAdCode().catch(() => {});\n    emit(meta);\n    return state;\n  }\n\n  // items: [{ id: variantId, quantity }]\n  async function add(items, meta) {\n    items = items.filter(i => i && i.id);\n    if (!items.length) throw new Error('Dieser Artikel ist gerade nicht verf\u00FCgbar.');\n    const merged = {};\n    items.forEach(i => { merged[i.id] = (merged[i.id] || 0) + (i.quantity || 1); });\n    // Test-Ad-Set Raumduft: Code schon VOR dem Hinzuf\u00FCgen wechseln, damit der Warenkorb nie kurz bei 79,95 \u20AC steht\n    // (sonst legt der Geschenk-Schutz das Gratis-\u00D6l dazu).\n    if (hasCode(AD.one) || hasCode(AD.three)) {\n      const ids = roomIdSet();\n      const addRoom = Object.keys(merged).filter(id => ids.has(Number(id))).reduce((a, id) => a + merged[id], 0);\n      const want = roomCount() + addRoom >= 3 ? AD.three : AD.one;\n      const codes = (state.discount_codes || []).map(c => String(c.code).toUpperCase());\n      if (!(codes.length === 1 && codes[0] === want)) await request('/cart/update.js', { discount: want }).catch(() => {});\n    }\n    const res = await request('/cart/add.js', { items: Object.keys(merged).map(id => ({ id: Number(id), quantity: merged[id] })) });\n    const added = (res.items || []).map(i => i.key);\n    // Geschenke und Rabatte k\u00F6nnen sich ge\u00E4ndert haben: vollst\u00E4ndigen Warenkorb neu laden\n    await refresh(Object.assign({ added }, meta));\n    return added;\n  }\n\n  async function setQty(key, quantity) {\n    state = await request('/cart/change.js', { id: key, quantity: Math.max(0, Math.min(quantity, 20)) });\n    await syncAdCode().catch(() => {});\n    emit({ changed: key });\n  }\n\n  // Geschenk-Sorte tauschen: Wahl merken (f\u00FCr den Geschenk-Schutz) und die Zeile ersetzen.\n  // Mit dem Guard-Header, damit der Geschenk-Schutz den Zwischenstand ohne Geschenk nicht korrigiert.\n  async function swapGift(key, productId, variantId) {\n    const G = window.ZYD_GIFTS;\n    const h = G ? { [G.header]: '1' } : {};\n    try {\n      const choice = JSON.parse(localStorage.getItem(G ? G.choiceKey : 'zyd_gift_choice') || '{}') || {};\n      choice[productId] = variantId;\n      localStorage.setItem(G ? G.choiceKey : 'zyd_gift_choice', JSON.stringify(choice));\n    } catch (e) { /* privater Modus */ }\n    await request('/cart/change.js', { id: key, quantity: 0 }, h);\n    await request('/cart/add.js', { items: [{ id: variantId, quantity: 1 }] }, h);\n    await refresh({ changed: key });\n  }\n\n  // Rabattcodes setzen (ersetzt die Liste; leere Liste entfernt alle). Shopify meldet in cart.discount_codes, ob ein Code greift.\n  async function setCodes(codes) {\n    await request('/cart/update.js', { discount: codes.filter(Boolean).join(',') });\n    await refresh({ codes: true });\n    return state.discount_codes || [];\n  }\n\n  function subscribe(fn) { subs.add(fn); fn(state, totals(), { initial: true }); return () => subs.delete(fn); }\n\n  refresh({ initial: true }).catch(() => {});\n  // Andere Skripte (z. B. Geschenk-Schutz, Apps) \u00E4ndern den Warenkorb: beim Zur\u00FCckkehren in den Tab neu laden\n  document.addEventListener('visibilitychange', () => { if (!document.hidden) refresh().catch(() => {}); });\n\n  window.ZYStore = { get state() { return state; }, totals, subscribe, add, setQty, remove: key => setQty(key, 0), refresh, swapGift, setCodes };\n})();\n"],
  "mappings": "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",
  "names": []
}
