{
  "version": 3,
  "sources": ["/cdn/shop/t/12/assets/mariowatches-configurator.js?esm=20261020-design-image-1"],
  "sourcesContent": ["(function () {\n  const data = window.EternalSeikoModsConfiguratorData;\n  if (!data || !Array.isArray(data.models)) return;\n\n  const currentScript = document.currentScript;\n  const assetUrl = (image) => {\n    if (!image) return \"\";\n    if (image.type === \"url\") return image.value;\n    return new URL(image.value, currentScript.src).href;\n  };\n\n  const normalize = (value) =>\n    String(value || \"\")\n      .toLowerCase()\n      .replace(/&/g, \"and\")\n      .replace(/configurator/g, \"\")\n      .replace(/[^a-z0-9]+/g, \" \")\n      .trim();\n\n  const findModel = (root) => {\n    if (root.dataset.isConfigurator !== \"true\") return undefined;\n\n    const title = normalize(root.dataset.productTitle);\n    const handle = normalize(root.dataset.productHandle);\n\n    const exactHandleMatch = data.models.find((model) => normalize(model.id) === handle);\n    if (exactHandleMatch) return exactHandleMatch;\n\n    return data.models.find((model) => {\n      const modelTitle = normalize(model.title);\n      return title === modelTitle || modelTitle === handle;\n    });\n  };\n\n  const LEGACY_PART_IDS = {\n    \"santeiko-configurator-nh35\": new Set([\"QUESTION-7mhcia\"]),\n  };\n\n  const partsForModel = (model) => {\n    const excluded = LEGACY_PART_IDS[model.id];\n    if (!excluded) return model.parts;\n    return model.parts.filter((part) => !excluded.has(part.id));\n  };\n\n  const selectedFromParts = (parts) => {\n    const selected = {};\n    parts.forEach((part) => {\n      const defaultAnswer = defaultAnswerForPart(part);\n      selected[part.id] = defaultAnswer.id;\n    });\n    return selected;\n  };\n\n  const partHasImages = (part) => part.answers.some((answer) => answer.image);\n\n  const shouldHideEmptyImageAnswers = (part) => {\n    const name = normalize(part.name);\n    return name === \"strap\" && partHasImages(part);\n  };\n\n  const answersForPart = (part) => {\n    if (!shouldHideEmptyImageAnswers(part)) return part.answers;\n    return part.answers.filter((answer) => answer.image);\n  };\n\n  const defaultAnswerForPart = (part) => {\n    const configured = part.answers.find((answer) => answer.id === part.defaultAnswerId);\n    if (configured && (!shouldHideEmptyImageAnswers(part) || configured.image)) return configured;\n    return answersForPart(part)[0] || part.answers[0];\n  };\n\n  const selectedAnswer = (part, selected) =>\n    answersForPart(part).find((answer) => answer.id === selected[part.id]) || defaultAnswerForPart(part);\n\n  const familyNameForPart = (part) => {\n    const name = normalize(part.name);\n    if (!name) return \"\";\n    if (/\\bcase\\b/.test(name)) return \"case\";\n    if (/\\bbracelet\\b|\\bbracelets\\b|\\bstrap\\b|\\bband\\b/.test(name)) return \"bracelet\";\n    if (/\\bbezel\\b/.test(name)) return \"bezel\";\n    return \"\";\n  };\n\n  const familyCountsForParts = (parts) =>\n    parts.reduce((counts, part) => {\n      const family = familyNameForPart(part);\n      if (family) counts[family] = (counts[family] || 0) + 1;\n      return counts;\n    }, {});\n\n  const layerZIndexForPart = (part) => {\n    const base = Number(part.position || 0) + 1;\n    if (familyNameForPart(part) === \"bezel\") return base + 100;\n    return base;\n  };\n\n  class EternalSeikoModsConfigurator {\n    constructor(root) {\n      this.root = root;\n      this.model = findModel(root);\n      if (!this.model) {\n        root.hidden = true;\n        return;\n      }\n      this.parts = partsForModel(this.model);\n      this.selected = selectedFromParts(this.parts);\n      this.familyCounts = familyCountsForParts(this.parts);\n      this.activeFamilyParts = this.initialActiveFamilyParts();\n      this.currentPartIndex = 0;\n      document.documentElement.classList.add(\"mw-configurator-page\");\n      document.body.classList.add(\"mw-configurator-page\");\n      this.syncViewportHeight();\n      this.render();\n    }\n\n    initialActiveFamilyParts() {\n      const active = {};\n      this.parts.forEach((part) => {\n        const family = familyNameForPart(part);\n        if (!family || this.familyCounts[family] <= 1 || active[family]) return;\n        active[family] = part.id;\n      });\n      return active;\n    }\n\n    isGroupedPart(part) {\n      const family = familyNameForPart(part);\n      return family && this.familyCounts[family] > 1;\n    }\n\n    activatePartFamily(partId) {\n      const part = this.parts.find((candidate) => candidate.id === partId);\n      if (!part || !this.isGroupedPart(part)) return;\n      this.activeFamilyParts[familyNameForPart(part)] = part.id;\n    }\n\n    isPartActive(part) {\n      if (!this.isGroupedPart(part)) return true;\n      return this.activeFamilyParts[familyNameForPart(part)] === part.id;\n    }\n\n    resetBezelWhenCaseChanges(part) {\n      const modelsWithIntegratedCaseBezel = [\"aqua-configurator-nh35\", \"nautiko-configurator-nh35\"];\n      if (!modelsWithIntegratedCaseBezel.includes(this.model.id) || familyNameForPart(part) !== \"case\") return;\n      const bezel = this.parts.find((candidate) => normalize(candidate.name) === \"bezel\");\n      if (!bezel) return;\n      const smooth = bezel.answers.find((answer) => !answer.image) || defaultAnswerForPart(bezel);\n      this.selected[bezel.id] = smooth.id;\n    }\n\n    syncViewportHeight() {\n      const setHeight = () => {\n        const header = document.querySelector(\".section-header, header\");\n        const headerBottom = header ? header.getBoundingClientRect().bottom : 0;\n        this.root.style.setProperty(\"--mw-configurator-top\", `${Math.max(0, headerBottom)}px`);\n      };\n\n      setHeight();\n      window.addEventListener(\"resize\", setHeight);\n    }\n\n    render() {\n      this.root.hidden = false;\n      this.root.innerHTML = `\n        <div class=\"mw-configurator__inner\">\n          <div class=\"mw-configurator__panel\">\n            <p class=\"mw-configurator__eyebrow\">EternalSeikoMods configurator</p>\n            <h1 class=\"mw-configurator__title\">${this.model.title}</h1>\n            <div class=\"mw-configurator__groups\" data-mw-groups></div>\n            <div class=\"mw-configurator__stepbar\" data-mw-stepbar>\n              <button type=\"button\" class=\"mw-configurator__step-button mw-configurator__step-button--prev\" data-mw-prev aria-label=\"Previous step\">\u2190</button>\n              <span class=\"mw-configurator__step-count\" data-mw-step-count></span>\n              <button type=\"button\" class=\"mw-configurator__step-button mw-configurator__step-button--next\" data-mw-next aria-label=\"Next step\">\u2192</button>\n            </div>\n            <div class=\"mw-configurator__summary\">\n              <h2 class=\"mw-configurator__summary-title\">Selected build</h2>\n              <dl class=\"mw-configurator__summary-list\" data-mw-summary></dl>\n            </div>\n          </div>\n          <div class=\"mw-configurator__stage\">\n            <div class=\"mw-configurator__stage-price\">\n              <span data-mw-price></span>\n              <span class=\"mw-configurator__compare\" data-mw-compare-price hidden></span>\n            </div>\n            <div class=\"mw-configurator__viewer\">\n              <div class=\"mw-configurator__layers\" data-mw-layers></div>\n            </div>\n            <div class=\"mw-configurator__actions\">\n              <button type=\"button\" class=\"mw-configurator__button\" data-mw-add>Add to cart</button>\n              <button type=\"button\" class=\"mw-configurator__button mw-configurator__button--secondary\" data-mw-reset>Reset</button>\n              <button type=\"button\" class=\"mw-configurator__button mw-configurator__button--secondary\" data-mw-download>Save design</button>\n            </div>\n            <div class=\"mw-configurator__status\" data-mw-status aria-live=\"polite\"></div>\n            <div class=\"mw-configurator__toolbar\">\n              <span>Live build preview</span>\n              <span>${this.parts.length} customizable areas</span>\n            </div>\n          </div>\n        </div>\n      `;\n\n      this.root.querySelector(\"[data-mw-price]\").textContent = this.root.dataset.productPriceFormatted;\n      const comparePrice = this.root.querySelector(\"[data-mw-compare-price]\");\n      comparePrice.textContent = this.root.dataset.comparePriceFormatted;\n      comparePrice.hidden = !(Number(this.root.dataset.comparePrice) > Number(this.root.dataset.productPrice));\n\n      this.groupsEl = this.root.querySelector(\"[data-mw-groups]\");\n      this.layersEl = this.root.querySelector(\"[data-mw-layers]\");\n      this.summaryEl = this.root.querySelector(\"[data-mw-summary]\");\n      this.statusEl = this.root.querySelector(\"[data-mw-status]\");\n      this.stepCountEl = this.root.querySelector(\"[data-mw-step-count]\");\n      this.prevStepButton = this.root.querySelector(\"[data-mw-prev]\");\n      this.nextStepButton = this.root.querySelector(\"[data-mw-next]\");\n\n      this.renderGroups();\n      this.updatePreview();\n      this.root.querySelector(\"[data-mw-add]\").addEventListener(\"click\", () => this.addToCart());\n      this.root.querySelector(\"[data-mw-download]\").addEventListener(\"click\", () => this.downloadDesign());\n      this.prevStepButton.addEventListener(\"click\", () => this.goToStep(this.currentPartIndex - 1));\n      this.nextStepButton.addEventListener(\"click\", () => {\n        if (this.currentPartIndex >= this.parts.length - 1) {\n          this.addToCart();\n          return;\n        }\n        this.goToStep(this.currentPartIndex + 1);\n      });\n      this.root.querySelector(\"[data-mw-reset]\").addEventListener(\"click\", () => {\n        this.selected = selectedFromParts(this.parts);\n        this.activeFamilyParts = this.initialActiveFamilyParts();\n        this.currentPartIndex = 0;\n        this.renderGroups();\n        this.updatePreview();\n      });\n    }\n\n    captureGroupScrollPositions() {\n      const positions = { top: this.groupsEl ? this.groupsEl.scrollTop : 0, lists: {} };\n      if (!this.groupsEl) return positions;\n      this.groupsEl.querySelectorAll(\"[data-part-id-list]\").forEach((list) => {\n        positions.lists[list.dataset.partIdList] = list.scrollLeft;\n      });\n      return positions;\n    }\n\n    restoreGroupScrollPositions(positions) {\n      if (!this.groupsEl) return;\n      this.groupsEl.scrollTop = positions.top || 0;\n      Object.entries(positions.lists || {}).forEach(([partId, scrollLeft]) => {\n        const list = this.groupsEl.querySelector(`[data-part-id-list=\"${partId}\"]`);\n        if (list) list.scrollLeft = scrollLeft;\n      });\n    }\n\n    renderGroups() {\n      const scrollPositions = this.captureGroupScrollPositions();\n      this.groupsEl.innerHTML = this.parts\n        .map((part, index) => {\n          const active = selectedAnswer(part, this.selected);\n          const answers = answersForPart(part)\n            .map((answer) => {\n              const pressed = answer.id === active.id ? \"true\" : \"false\";\n              const image = assetUrl(answer.image);\n              return `\n                <button type=\"button\" class=\"mw-option\" aria-pressed=\"${pressed}\" data-part-id=\"${part.id}\" data-answer-id=\"${answer.id}\">\n                  <span class=\"mw-option__thumb\">${image ? `<img src=\"${image}\" alt=\"\">` : \"\"}</span>\n                  <span class=\"mw-option__name\">${answer.name}</span>\n                </button>\n              `;\n            })\n            .join(\"\");\n          return `\n            <section class=\"mw-option-group${index === this.currentPartIndex ? \" is-active\" : \"\"}\" data-step-index=\"${index}\" data-part-id-group=\"${part.id}\">\n              <div class=\"mw-option-group__head\">\n                <h2 class=\"mw-option-group__name\">${part.name}</h2>\n                <span class=\"mw-option-group__selected\" data-mw-selected>${active.name}</span>\n              </div>\n              <div class=\"mw-option-list\" data-part-id-list=\"${part.id}\">${answers}</div>\n            </section>\n          `;\n        })\n        .join(\"\");\n      this.restoreGroupScrollPositions(scrollPositions);\n      requestAnimationFrame(() => this.restoreGroupScrollPositions(scrollPositions));\n\n      this.groupsEl.querySelectorAll(\"[data-answer-id]\").forEach((button) => {\n        button.addEventListener(\"click\", () => {\n          const part = this.parts.find((candidate) => candidate.id === button.dataset.partId);\n          this.selected[button.dataset.partId] = button.dataset.answerId;\n          this.activatePartFamily(button.dataset.partId);\n          if (part) this.resetBezelWhenCaseChanges(part);\n          this.updateGroupSelections();\n          this.updatePreview();\n        });\n      });\n      this.updateStepControls();\n    }\n\n    updateGroupSelections() {\n      this.groupsEl.querySelectorAll(\"[data-part-id-group]\").forEach((group) => {\n        const part = this.parts.find((candidate) => candidate.id === group.dataset.partIdGroup);\n        if (!part) return;\n        const active = selectedAnswer(part, this.selected);\n        const selectedLabel = group.querySelector(\"[data-mw-selected]\");\n        if (selectedLabel) selectedLabel.textContent = active.name;\n        group.querySelectorAll(\"[data-answer-id]\").forEach((button) => {\n          button.setAttribute(\"aria-pressed\", button.dataset.answerId === active.id ? \"true\" : \"false\");\n        });\n      });\n    }\n\n    goToStep(index) {\n      const lastIndex = this.parts.length - 1;\n      this.currentPartIndex = Math.min(Math.max(index, 0), lastIndex);\n      this.renderGroups();\n    }\n\n    updatePreview() {\n      const layers = [];\n      const summary = [];\n      this.parts.forEach((part) => {\n        if (!this.isPartActive(part)) return;\n        const answer = selectedAnswer(part, this.selected);\n        const image = assetUrl(answer.image);\n        if (image) {\n          layers.push(`<img class=\"mw-configurator__layer\" style=\"z-index:${layerZIndexForPart(part)}\" src=\"${image}\" alt=\"\">`);\n        }\n        summary.push(`<div><dt>${part.name}</dt><dd>${answer.name}</dd></div>`);\n      });\n      this.layersEl.innerHTML = layers.join(\"\");\n      this.summaryEl.innerHTML = summary.join(\"\");\n    }\n\n    updateStepControls() {\n      if (!this.stepCountEl) return;\n      const total = this.parts.length;\n      this.stepCountEl.textContent = `${this.currentPartIndex + 1}/${total}`;\n      this.prevStepButton.disabled = this.currentPartIndex === 0;\n      this.nextStepButton.textContent = this.currentPartIndex >= total - 1 ? \"Add to cart\" : \"\u2192\";\n      this.nextStepButton.setAttribute(\n        \"aria-label\",\n        this.currentPartIndex >= total - 1 ? \"Add configured watch to cart\" : \"Next step\"\n      );\n    }\n\n    properties() {\n      const props = {\n        \"_Configurator\": \"EternalSeikoMods\",\n        \"_Model\": this.model.title,\n      };\n      this.parts.forEach((part) => {\n        if (!this.isPartActive(part)) return;\n        const name = part.name.trim();\n        if (name) props[name] = selectedAnswer(part, this.selected).name;\n      });\n      return props;\n    }\n\n    setBusy(busy) {\n      this.busy = busy;\n      this.root.setAttribute(\"aria-busy\", String(busy));\n      this.root.querySelectorAll(\"button\").forEach((button) => { button.disabled = busy; });\n      if (!busy) this.updateStepControls();\n    }\n\n    async designFile() {\n      // Snapshot both the specifications and layers before any asynchronous image loads.\n      const properties = this.properties();\n      const layers = this.parts\n        .filter((part) => this.isPartActive(part))\n        .map((part) => ({\n          url: assetUrl(selectedAnswer(part, this.selected).image),\n          z: layerZIndexForPart(part),\n        }))\n        .filter((layer) => layer.url)\n        .sort((a, b) => a.z - b.z);\n      if (!layers.length) throw new Error(\"No design layers\");\n\n      const images = await Promise.all(layers.map((layer) => new Promise((resolve, reject) => {\n        const image = new Image();\n        const timer = setTimeout(() => reject(new Error(\"Design image timed out\")), 15000);\n        image.crossOrigin = \"anonymous\";\n        image.onload = () => {\n          clearTimeout(timer);\n          if (!image.naturalWidth || !image.naturalHeight) {\n            reject(new Error(\"Empty design layer\"));\n            return;\n          }\n          resolve(image);\n        };\n        image.onerror = () => { clearTimeout(timer); reject(new Error(\"Design image unavailable\")); };\n        image.src = layer.url;\n      })));\n\n      const specifications = Object.entries(properties).filter(([name]) => !name.startsWith(\"_\"));\n      const canvas = document.createElement(\"canvas\");\n      const size = 1200;\n      canvas.width = size;\n      canvas.height = size + 160 + specifications.length * 44;\n      const ctx = canvas.getContext(\"2d\");\n      if (!ctx) throw new Error(\"Image export unavailable\");\n      ctx.fillStyle = \"#f7f7f7\";\n      ctx.fillRect(0, 0, canvas.width, canvas.height);\n      images.forEach((image) => {\n        const scale = Math.min(size / image.naturalWidth, size / image.naturalHeight);\n        const width = image.naturalWidth * scale;\n        const height = image.naturalHeight * scale;\n        ctx.drawImage(image, (size - width) / 2, (size - height) / 2, width, height);\n      });\n      ctx.fillStyle = \"#171614\";\n      ctx.font = \"bold 30px Arial, sans-serif\";\n      ctx.fillText(this.model.title, 48, size + 42, size - 96);\n      ctx.font = \"24px Arial, sans-serif\";\n      specifications.forEach(([name, value], index) => {\n        ctx.fillText(name + \": \" + value, 48, size + 92 + index * 44, size - 96);\n      });\n      ctx.fillStyle = \"#666666\";\n      ctx.font = \"18px Arial, sans-serif\";\n      ctx.fillText(\"Configurator preview - refer to the specifications for exact finishes.\", 48, canvas.height - 30, size - 96);\n\n      const blob = await new Promise((resolve, reject) => {\n        canvas.toBlob((value) => value ? resolve(value) : reject(new Error(\"Image export failed\")), \"image/png\");\n      });\n      const filename = \"eternal-\" + this.root.dataset.productHandle + \"-design.png\";\n      return { file: new File([blob], filename, { type: \"image/png\" }), properties };\n    }\n\n    async downloadDesign() {\n      if (this.busy) return;\n      this.setBusy(true);\n      this.statusEl.textContent = \"Preparing your design image...\";\n      try {\n        const { file } = await this.designFile();\n        const url = URL.createObjectURL(file);\n        const link = document.createElement(\"a\");\n        link.href = url;\n        link.download = file.name;\n        document.body.appendChild(link);\n        link.click();\n        link.remove();\n        setTimeout(() => URL.revokeObjectURL(url), 60000);\n        this.statusEl.textContent = \"Design image ready.\";\n      } catch (_error) {\n        this.statusEl.textContent = \"Your design image could not be prepared. Please try again.\";\n      } finally {\n        this.setBusy(false);\n      }\n    }\n\n    async addToCart() {\n      if (this.busy) return;\n      const variantId = this.root.dataset.variantId;\n      if (!variantId) {\n        this.statusEl.textContent = \"Product variant is not available.\";\n        return;\n      }\n      this.setBusy(true);\n      this.statusEl.textContent = \"Saving your watch design...\";\n      let form;\n      try {\n        const { file, properties } = await this.designFile();\n        if (typeof DataTransfer !== \"function\") throw new Error(\"File upload unavailable\");\n        // Native multipart product submission preserves the generated file as a Shopify\n        // line-item upload. Never stringify the file or put a data URL into properties.\n        form = document.createElement(\"form\");\n        form.method = \"post\";\n        form.action = window.Shopify.routes.root + \"cart/add\";\n        form.enctype = \"multipart/form-data\";\n        form.style.display = \"none\";\n        const addField = (name, value) => {\n          const input = document.createElement(\"input\");\n          input.type = \"hidden\";\n          input.name = name;\n          input.value = value;\n          form.appendChild(input);\n        };\n        addField(\"form_type\", \"product\");\n        addField(\"utf8\", \"\u2713\");\n        addField(\"id\", variantId);\n        addField(\"quantity\", \"1\");\n        addField(\"return_to\", window.Shopify.routes.root + \"cart\");\n        Object.entries(properties).forEach(([name, value]) => addField(\"properties[\" + name + \"]\", value));\n        const input = document.createElement(\"input\");\n        input.type = \"file\";\n        input.name = \"properties[Design image]\";\n        input.accept = \"image/png\";\n        const transfer = new DataTransfer();\n        transfer.items.add(file);\n        input.files = transfer.files;\n        if (!input.files || input.files.length !== 1) throw new Error(\"Design attachment unavailable\");\n        form.appendChild(input);\n        document.body.appendChild(form);\n        this.statusEl.textContent = \"Adding your watch and design image...\";\n        form.submit();\n      } catch (_error) {\n        if (form) form.remove();\n        this.setBusy(false);\n        this.statusEl.textContent = \"Your design image could not be saved. Your watch has not been added. Please try again.\";\n      }\n    }\n  }\n\n  document.querySelectorAll(\"[data-mw-configurator]\").forEach((root) => {\n    new EternalSeikoModsConfigurator(root);\n  });\n})();\n"],
  "mappings": "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",
  "names": ["input"]
}
