{
  "version": 3,
  "sources": ["/cdn/shop/t/82/assets/gift-picker.js?x=1793624694908"],
  "sourcesContent": ["/**\n * <gift-picker> - gave ved koeb paa PDP (blocks/gift-offer). Aabner en modal\n * <dialog> med alle gaverne som radio-fliser; kunden markerer \u00E9n og\n * bekraefter, og valget skrives i det skjulte felt gift_id, der via form=\n * hoerer til produktformen. cart-drawer.js' onProductSubmit laeser feltet og\n * laegger gaven i kurven efter varen.\n *\n * Modalen er markup-drevet: <form method=\"dialog\"> lukker selv dialogen, og\n * knappens value bliver dialog.returnValue ('confirm' eller 'cancel'). Escape\n * og et klik paa baggrunden lukker uden at bekraefte. showModal giver native\n * fokusfaelde og inert baggrund; fokus sendes tilbage til den knap der\n * aabnede (samme moenster som sticky-buy-bar).\n *\n * Ingen tekst samles client-side ud over at saette en server-renderet,\n * oversat praefiks (\"Selected:\") foran fliseens egen label. Ingen priser.\n *\n * Progressive enhancement: CHOOSE er hidden i markup og vises foerst her.\n * Uden JS staar raekken som ren markering, og kurvens vaelger\n * (snippets/cart-gift) er fallback. Elementet reconnectes ved\n * shopify:section:load, saa connectedCallback er hele init'en.\n */\n\nclass GiftPicker extends HTMLElement {\n  connectedCallback() {\n    this.dialog = this.querySelector('[data-gift-dialog]');\n    this.input = this.querySelector('[data-gift-input]');\n    this.selected = this.querySelector('[data-gift-selected]');\n    this.defaultRow = this.querySelector('[data-gift-default]');\n    this.chosenRow = this.querySelector('[data-gift-chosen]');\n    this.confirm = this.querySelector('[data-gift-confirm]');\n    if (!this.dialog || !this.input || typeof this.dialog.showModal !== 'function') return;\n\n    this.committed = this.input.value || '';\n    this.opener = null;\n\n    this.querySelectorAll('[data-gift-open]').forEach((button) => button.removeAttribute('hidden'));\n    // Chosen-raekkens CHANGE skal kun vises sammen med raekken selv.\n    if (!this.committed && this.chosenRow) this.chosenRow.hidden = true;\n\n    this.addEventListener('click', this.#onClick);\n    this.dialog.addEventListener('change', this.#onChange);\n    this.dialog.addEventListener('pointerdown', this.#onPointerDown);\n    this.dialog.addEventListener('click', this.#onDialogClick);\n    this.dialog.addEventListener('close', this.#onClose);\n    document.addEventListener('cart:added', this.#onAdded);\n  }\n\n  disconnectedCallback() {\n    document.removeEventListener('cart:added', this.#onAdded);\n  }\n\n  #radios() {\n    return this.dialog.querySelectorAll('input[type=\"radio\"]');\n  }\n\n  #checked() {\n    return this.dialog.querySelector('input[type=\"radio\"]:checked');\n  }\n\n  #onClick = (event) => {\n    if (event.target.closest('[data-gift-clear]')) {\n      this.#radios().forEach((radio) => {\n        radio.checked = false;\n      });\n      this.#commit(null);\n      const choose = this.defaultRow && this.defaultRow.querySelector('[data-gift-open]');\n      if (choose) choose.focus();\n      return;\n    }\n    const opener = event.target.closest('[data-gift-open]');\n    if (!opener || this.dialog.open) return;\n    this.opener = opener;\n    this.dialog.returnValue = '';\n    this.dialog.showModal();\n    // Fokus paa den markerede flise, ellers den foerste: kunden starter i\n    // listen og ikke paa luk-krydset.\n    const target = this.#checked() || this.#radios()[0];\n    if (target) target.focus();\n  };\n\n  #onChange = () => {\n    this.#renderSelected();\n  };\n\n  // Baggrunden lukker kun hvis klikket ogsaa STARTEDE paa den - et traek der\n  // begynder i panelet og slipper udenfor (tekstmarkering) maa ikke lukke.\n  #onPointerDown = (event) => {\n    this.downOnBackdrop = event.target === this.dialog;\n  };\n\n  #onDialogClick = (event) => {\n    if (event.target === this.dialog) {\n      if (this.downOnBackdrop) this.dialog.close('cancel');\n      return;\n    }\n    if (event.target.closest('[data-gift-cancel]')) {\n      this.dialog.close('cancel');\n      return;\n    }\n    // Model-genvejene: rul inde i modalen uden at skrive #anker i URL'en og\n    // historikken. href'en bliver staaende som semantik og no-JS-fallback.\n    const link = event.target.closest('a[href^=\"#\"]');\n    if (link) {\n      const group = this.dialog.querySelector(`[id=\"${CSS.escape(link.hash.slice(1))}\"]`);\n      if (group) {\n        event.preventDefault();\n        group.scrollIntoView({ block: 'start' });\n        const first = group.querySelector('input[type=\"radio\"]');\n        if (first) first.focus({ preventScroll: true });\n      }\n    }\n  };\n\n  #onClose = () => {\n    if (this.dialog.returnValue === 'confirm' && this.#checked()) {\n      this.#commit(this.#checked());\n    } else {\n      // Fortrudt: radioerne tilbage til det bekraeftede valg.\n      this.#radios().forEach((radio) => {\n        radio.checked = radio.value === this.committed;\n      });\n      this.#renderSelected();\n    }\n    // Opener kan vaere skjult nu (CHOOSE -> CHANGE skifter raekke); fokus da\n    // paa den synlige raekkes knap.\n    const visible = [...this.querySelectorAll('[data-gift-open]')].find((button) => button.offsetParent !== null);\n    const target = this.opener && this.opener.offsetParent !== null ? this.opener : visible;\n    if (target) target.focus();\n    this.opener = null;\n  };\n\n  // Efter et add fra produktformen ligger gaven i kurven (eller er afvist og\n  // vises i kurvens fallback). Nulstil, saa et add mere ikke sender den igen.\n  #onAdded = (event) => {\n    const form = this.input.form;\n    if (!form || !this.committed || !(event.target instanceof Node)) return;\n    if (!form.contains(event.target) && event.target.getAttribute('form') !== form.id) return;\n    this.#radios().forEach((radio) => {\n      radio.checked = false;\n    });\n    this.#commit(null);\n  };\n\n  #commit(radio) {\n    this.committed = radio ? radio.value : '';\n    this.input.value = this.committed;\n    if (this.committed) {\n      this.input.setAttribute('name', 'gift_id');\n    } else {\n      this.input.removeAttribute('name');\n    }\n\n    if (this.defaultRow) this.defaultRow.hidden = Boolean(radio);\n    if (this.chosenRow) this.chosenRow.hidden = !radio;\n    if (!radio || !this.chosenRow) {\n      this.#renderSelected();\n      return;\n    }\n\n    const label = this.chosenRow.querySelector('[data-gift-chosen-label]');\n    if (label) label.textContent = radio.dataset.label || '';\n    const media = this.chosenRow.querySelector('[data-gift-chosen-media]');\n    const image = radio.closest('label')?.querySelector('img');\n    if (media) media.replaceChildren(...(image ? [image.cloneNode(false)] : []));\n    this.#renderSelected();\n  }\n\n  #renderSelected() {\n    const radio = this.#checked();\n    // Bekraeft er slaaet fra indtil en gave er markeret: et tomt \"Choose this\n    // gift\" lukkede ellers som en fortrydelse uden at sige noget.\n    if (this.confirm) this.confirm.disabled = !radio;\n    if (!this.selected) return;\n    this.selected.textContent = radio\n      ? `${this.dataset.textSelected || ''} ${radio.dataset.label || ''}`.trim()\n      : this.dataset.textNone || '';\n  }\n}\n\nif (!customElements.get('gift-picker')) {\n  customElements.define('gift-picker', GiftPicker);\n}\n"],
  "mappings": "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",
  "names": []
}
