{
  "version": 3,
  "sources": ["/cdn/shop/t/8/assets/onepage.js?cb=26869"],
  "sourcesContent": ["/*\n * Behaviour for the one-page layout: the anchor nav, the inline add-to-cart\n * that sends a whole order (wood plus its matching add-ons) in one request,\n * and the stacking and firestarter checkboxes on the cart page.\n *\n * Add-on variants come from the markup, which is rendered from the section\n * blocks, so the size pairing is fixed in theme config rather than worked out\n * here at runtime.\n */\n(() => {\n  const money = (cents) => {\n    const amount = (cents / 100).toFixed(2).replace(/\\.00$/, '');\n    return `$${amount}`;\n  };\n\n  /* ---- Sticky nav: mobile toggle + scrollspy --------------------------- */\n\n  const initNav = (nav) => {\n    const toggle = nav.querySelector('[data-mf-nav-toggle]');\n    const list = nav.querySelector('[data-mf-nav-links]');\n    const links = Array.from(nav.querySelectorAll('[data-mf-anchor]'));\n\n    const isMobile = () => window.matchMedia('(max-width: 1199px)').matches;\n\n    const setOpen = (open) => {\n      if (!toggle || !list) return;\n      toggle.setAttribute('aria-expanded', String(open));\n      list.hidden = isMobile() ? !open : false;\n    };\n\n    if (toggle && list) {\n      setOpen(false);\n      toggle.addEventListener('click', () => {\n        setOpen(toggle.getAttribute('aria-expanded') !== 'true');\n      });\n      list.addEventListener('click', (event) => {\n        if (event.target.closest('a') && isMobile()) setOpen(false);\n      });\n      window.addEventListener('resize', () => setOpen(false));\n    }\n\n    // Scrollspy. The nav is sticky, so a section counts as current once its\n    // top passes just below the nav rather than when it enters the viewport.\n    const targets = links\n      .map((link) => {\n        const id = link.getAttribute('href').split('#')[1];\n        const el = id && document.getElementById(id);\n        return el ? { link, el } : null;\n      })\n      .filter(Boolean);\n\n    if (!targets.length) return;\n\n    let ticking = false;\n    const spy = () => {\n      ticking = false;\n      const line = nav.offsetHeight + 24;\n      // Above the first section nothing is current yet, otherwise the hero\n      // reads as if the first nav item were already selected.\n      let current = null;\n      targets.forEach((entry) => {\n        if (entry.el.getBoundingClientRect().top <= line) current = entry;\n      });\n      // At the very bottom the last section may never cross the line.\n      if (window.innerHeight + window.scrollY >= document.body.scrollHeight - 2) {\n        current = targets[targets.length - 1];\n      }\n      targets.forEach(({ link }) => {\n        if (current && link === current.link) link.setAttribute('aria-current', 'true');\n        else link.removeAttribute('aria-current');\n      });\n    };\n\n    window.addEventListener(\n      'scroll',\n      () => {\n        if (ticking) return;\n        ticking = true;\n        window.requestAnimationFrame(spy);\n      },\n      { passive: true }\n    );\n    spy();\n  };\n\n  /* ---- Inline add to cart ---------------------------------------------- */\n\n  const initCard = (card) => {\n    const form = card.querySelector('[data-mf-add-form]');\n    if (!form) return;\n\n    const button = form.querySelector('[data-mf-add-button]');\n    const variantSelect = form.querySelector('[data-mf-variant-select]');\n    const variantInput = form.querySelector('[data-mf-variant-input]');\n    const priceEl = card.querySelector('[data-mf-price]');\n    const label = button.querySelector('[data-mf-add-label]');\n    const totalEl = card.querySelector('[data-mf-total]');\n    const addons = Array.from(form.querySelectorAll('[data-mf-addon]'));\n\n    // Read live rather than captured, so a variant change moves the total too.\n    const basePrice = () => Number(form.dataset.basePrice || 0);\n\n    const paintTotal = () => {\n      if (!totalEl) return;\n      const extra = addons\n        .filter((input) => input.checked)\n        .reduce((sum, input) => sum + Number(input.dataset.price || 0), 0);\n      totalEl.textContent = money(basePrice() + extra);\n    };\n\n    if (variantSelect) {\n      variantSelect.addEventListener('change', () => {\n        const chosen = variantSelect.selectedOptions[0];\n        form.dataset.variantId = chosen.value;\n        form.dataset.basePrice = chosen.dataset.price || '0';\n        if (variantInput) variantInput.value = chosen.value;\n        if (priceEl) priceEl.textContent = money(Number(chosen.dataset.price || 0));\n        paintTotal();\n      });\n    }\n\n    addons.forEach((input) => input.addEventListener('change', paintTotal));\n    paintTotal();\n\n    // Back from the cart restores this page from the bfcache as it was left,\n    // mid-add, with the button disabled.\n    const idleLabel = label.textContent;\n    window.addEventListener('pageshow', (event) => {\n      if (!event.persisted) return;\n      label.textContent = idleLabel;\n      button.disabled = false;\n    });\n\n    form.addEventListener('submit', async (event) => {\n      // Without fetch the form posts to /cart/add and still lands on the cart,\n      // but with the wood alone. The fetch sends the ticked add-ons with it.\n      event.preventDefault();\n\n      // Shopify puts each added line at the top of the cart, so the wood goes\n      // in last to land first, with its add-ons under it in card order.\n      const items = addons\n        .filter((input) => input.checked)\n        .map((input) => ({ id: Number(input.value), quantity: 1 }))\n        .reverse();\n      items.push({ id: Number(form.dataset.variantId), quantity: 1 });\n\n      button.disabled = true;\n      label.textContent = 'Adding...';\n\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) throw new Error(await response.text());\n\n        // Straight to the cart, like the product pages: a brief \"Added\" on the\n        // card was easy to miss, a second tap doubled the whole order, and\n        // /cart is where the \"where do you want it\" box lives.\n        window.location.assign(`${window.Shopify?.routes?.root || '/'}cart`);\n      } catch (error) {\n        console.error('[midnight-firewood] add to cart failed', error);\n        label.textContent = 'Try again';\n        button.disabled = false;\n        setTimeout(() => {\n          label.textContent = idleLabel;\n        }, 2400);\n      }\n    });\n  };\n\n  /* ---- Landing on a shared #anchor ------------------------------------- */\n\n  // The browser jumps to the hash before the images above it have loaded, and\n  // they then push the page out from under the target. Re-seat it once the\n  // page has settled. scroll-padding-top keeps it clear of the sticky nav.\n  const settleHash = () => {\n    if (!window.location.hash) return;\n    const target = document.getElementById(\n      decodeURIComponent(window.location.hash.slice(1))\n    );\n    if (!target) return;\n    const seat = () => {\n      // Arriving on a link should land, not animate down from the top, and\n      // Chrome lets the root's scroll-behavior beat the option passed here.\n      const root = document.documentElement;\n      const previous = root.style.scrollBehavior;\n      root.style.scrollBehavior = 'auto';\n      target.scrollIntoView({ block: 'start' });\n      root.style.scrollBehavior = previous;\n    };\n\n    // Twice: once when the images are in, and again when the display face has\n    // swapped in. The condensed face sets shorter than the fallback, so the\n    // content above the target shrinks and a single pass overshoots.\n    window.addEventListener('load', seat, { once: true });\n    if (document.fonts && document.fonts.ready) {\n      document.fonts.ready.then(() => requestAnimationFrame(seat));\n    }\n  };\n\n  /* ---- Cart page add-ons ------------------------------------------------ */\n\n  // Stacking and firestarter checkboxes on /cart. Each tick is a real cart\n  // change, repainted through Dawn's own section list so the lines, totals and\n  // checkboxes all come back from the server together.\n\n  const paintCartCount = (count) => {\n    document.querySelectorAll('.mf-nav__cart-count').forEach((el) => {\n      el.textContent = count;\n      el.hidden = count === 0;\n    });\n  };\n\n  // The boxes render disabled and are switched on here, after every paint,\n  // once this file and cart.js are both running.\n  const enableCartAddons = () => {\n    document.querySelectorAll('[data-mf-cart-addon][data-mf-can-enable]').forEach((input) => {\n      input.disabled = false;\n    });\n  };\n\n  const cartRequest = async (url, body) => {\n    const cartItems = document.querySelector('cart-items');\n    const sections = cartItems.getSectionsToRender();\n    const response = await fetch(url, {\n      ...fetchConfig(),\n      body: JSON.stringify({\n        ...body,\n        sections: sections.map((section) => section.section),\n        sections_url: window.location.pathname,\n      }),\n    });\n    const state = await response.json();\n    if (!response.ok || state.errors) throw new Error(state.description || state.errors);\n\n    sections.forEach((section) => {\n      const html = state.sections && state.sections[section.section];\n      if (!html) return;\n      const host = document.getElementById(section.id);\n      (host.querySelector(section.selector) || host).innerHTML = cartItems.getSectionInnerHTML(\n        html,\n        section.selector\n      );\n    });\n\n    enableCartAddons();\n\n    // /cart/add.js answers with the added line, not the cart, so the count\n    // comes from a second read.\n    const cart = await fetch(`${routes.cart_url}.js`).then((r) => r.json());\n    paintCartCount(cart.item_count);\n  };\n\n  // Stacking is per load, so a ticked box follows its load's quantity. Each\n  // correction repaints the cart, so this settles one line per pass.\n  const syncStacking = async (passes = 0) => {\n    if (passes > 4) return;\n    const drifted = Array.from(document.querySelectorAll('[data-mf-cart-addon][data-line-key]')).find(\n      (input) => input.dataset.lineQuantity !== input.dataset.quantity\n    );\n    if (!drifted) return;\n    await cartRequest(routes.cart_change_url, {\n      id: drifted.dataset.lineKey,\n      quantity: Number(drifted.dataset.quantity),\n    });\n    return syncStacking(passes + 1);\n  };\n\n  // Capture phase: the boxes sit inside Dawn's <cart-items>, which reads every\n  // change event under it as a quantity edit, so this has to get there first\n  // and stop it.\n  const onCartAddonChange = async (event) => {\n    const box = event.target.closest && event.target.closest('[data-mf-cart-addon]');\n    if (!box) return;\n    event.stopPropagation();\n    box.disabled = true;\n\n    try {\n      if (box.checked) {\n        await cartRequest(routes.cart_add_url, {\n          items: [{ id: Number(box.value), quantity: Number(box.dataset.quantity) }],\n        });\n      } else {\n        await cartRequest(routes.cart_change_url, { id: box.dataset.lineKey, quantity: 0 });\n      }\n    } catch (error) {\n      console.error('[midnight-firewood] cart add-on failed', error);\n      box.checked = !box.checked;\n      box.disabled = false;\n      const errors = document.getElementById('cart-errors');\n      if (errors) errors.textContent = window.cartStrings.error;\n    }\n  };\n\n  const initCartAddons = () => {\n    document.addEventListener('change', onCartAddonChange, true);\n    if (typeof subscribe === 'function') {\n      subscribe(PUB_SUB_EVENTS.cartUpdate, (event) => {\n        if (event.cartData) paintCartCount(event.cartData.item_count);\n        enableCartAddons();\n        syncStacking();\n      });\n    }\n    // cart.js loads after this file, so <cart-items> has no methods yet at\n    // boot. Without the wait, a cart that arrives already drifted - one load\n    // added with stacking, a second without - kept stacking for one load.\n    customElements.whenDefined('cart-items').then(() => {\n      enableCartAddons();\n      syncStacking();\n    });\n  };\n\n  const boot = () => {\n    document.querySelectorAll('[data-mf-nav]').forEach(initNav);\n    document.querySelectorAll('[data-mf-card]').forEach(initCard);\n    if (document.querySelector('cart-items [data-mf-cart-addon], cart-items .cart-item')) initCartAddons();\n    settleHash();\n  };\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', boot, { once: true });\n  } else {\n    boot();\n  }\n})();\n"],
  "mappings": "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",
  "names": []
}
