{
  "version": 3,
  "sources": ["/cdn/shop/t/8/assets/neckle-dropzone.js?rev=20260901-1"],
  "sourcesContent": ["/*\n * Dropzone z podgladem dla pola zdjecia OwnPrint.\n *\n * To jest progresywne wzbogacenie, nie podmiana. Pole file nalezy do bloku\n * aplikacji OwnPrint - nie mamy jego markupu i nie wolno nam go odpiac od\n * formularza: neckle-product.js przechwytuje submit i przekazuje FormData\n * z prawdziwym inputem pliku. Dlatego oryginalny input zostaje dokladnie\n * tam, gdzie byl; jest tylko wizualnie ukryty, a my rysujemy warstwe obok.\n *\n * Kazda zmiana pliku - z klikniecia, z upuszczenia, z klawiatury - konczy sie\n * natywnym zdarzeniem 'change' na oryginalnym inpucie, wiec handler OwnPrint\n * dostaje dokladnie to, czego oczekuje.\n */\n(() => {\n  // Uwaga: NIE [data-ownprint-slot] (to nasz kontener na app block, dostaje\n  // tylko <style> OwnPrint). Prawdziwy formularz OwnPrint wstrzykuje jako\n  // rodzenstwo gdzies w buy-boxie, oznaczone przez [data-ownprint-personalization]\n  // - to samo zrodlo prawdy, ktorego uzywa juz neckle-ownprint-bridge.js.\n  const slot = document.querySelector('[data-ownprint-personalization]');\n  if (!slot) return;\n\n  const i18nNode = document.querySelector('[data-neckle-product-i18n]');\n  let i18n = {};\n  try { i18n = i18nNode ? JSON.parse(i18nNode.textContent) : {}; } catch (error) { i18n = {}; }\n  const tekst = (key, fallback) => i18n[key] || fallback;\n  const wstaw = (template, token, value) => template.replace(token, value);\n\n  const MAX_PODGLAD_BAJTY = 20 * 1024 * 1024;\n  const MIN_KRAWEDZ_PX = 1000;\n\n  const formatujRozmiar = (bajty) => {\n    if (bajty < 1024) return bajty + ' B';\n    if (bajty < 1024 * 1024) return Math.round(bajty / 1024) + ' KB';\n    return (bajty / (1024 * 1024)).toLocaleString(document.documentElement.lang || 'pl-PL', {\n      minimumFractionDigits: 1,\n      maximumFractionDigits: 1,\n    }) + ' MB';\n  };\n\n  const zbudujDropzone = (input) => {\n    if (input.dataset.neckleDropzone) return;\n    input.dataset.neckleDropzone = 'true';\n\n    const strefa = document.createElement('div');\n    strefa.className = 'neckle-dropzone';\n    strefa.dataset.neckleDropzoneRoot = 'true';\n\n    const opisId = 'neckle-dropzone-opis-' + Math.random().toString(36).slice(2, 8);\n\n    strefa.innerHTML = `\n      <button class=\"neckle-dropzone__trigger\" type=\"button\" aria-describedby=\"${opisId}\">\n        <span class=\"neckle-dropzone__ikona\" aria-hidden=\"true\">\n          <svg viewBox=\"0 0 24 24\"><path d=\"M12 16V4m0 0L7.5 8.5M12 4l4.5 4.5\"></path><path d=\"M5 14v4a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-4\"></path></svg>\n        </span>\n        <span class=\"neckle-dropzone__tresc\">\n          <strong>${tekst('dragPhoto', 'Przeci\u0105gnij zdj\u0119cie pupila')}</strong>\n          <span>${tekst('chooseFile', 'lub kliknij, \u017Ceby wybra\u0107 z dysku')}</span>\n        </span>\n      </button>\n      <p class=\"neckle-dropzone__opis\" id=\"${opisId}\">${tekst('photoHelp', 'Najlepiej sprawdzi si\u0119 ostre, dobrze o\u015Bwietlone zdj\u0119cie pyska (JPG, PNG lub HEIC, min. 1000\u00D71000px). Je\u015Bli nie nada si\u0119 do grawerunku, odezwiemy si\u0119 przed produkcj\u0105.')}</p>\n      <div class=\"neckle-dropzone__podglad\" hidden>\n        <img class=\"neckle-dropzone__miniatura\" alt=\"\">\n        <div class=\"neckle-dropzone__meta\">\n          <span class=\"neckle-dropzone__status\" role=\"status\">${tekst('photoAdded', 'Zdj\u0119cie dodane \u2713')}</span>\n          <strong class=\"neckle-dropzone__nazwa\"></strong>\n          <span class=\"neckle-dropzone__szczegoly\"></span>\n          <p class=\"neckle-dropzone__ostrzezenie\" hidden></p>\n        </div>\n        <button class=\"neckle-dropzone__zmien\" type=\"button\">${tekst('changePhoto', 'Zmie\u0144 zdj\u0119cie')}</button>\n      </div>\n      <p class=\"neckle-dropzone__blad\" role=\"alert\" hidden></p>\n    `;\n\n    input.parentNode.insertBefore(strefa, input);\n    strefa.appendChild(input);\n    input.classList.add('neckle-dropzone__input');\n    // Ukryty input nie moze byc drugim, niewidocznym przystankiem w tabulacji -\n    // rol\u0119 przycisku przejmuje trigger. Fokus programowy (np. walidacja\n    // OwnPrint) nadal dziala przy tabindex=\"-1\".\n    input.setAttribute('tabindex', '-1');\n\n    const trigger = strefa.querySelector('.neckle-dropzone__trigger');\n    const podglad = strefa.querySelector('.neckle-dropzone__podglad');\n    const miniatura = strefa.querySelector('.neckle-dropzone__miniatura');\n    const nazwa = strefa.querySelector('.neckle-dropzone__nazwa');\n    const szczegoly = strefa.querySelector('.neckle-dropzone__szczegoly');\n    const ostrzezenie = strefa.querySelector('.neckle-dropzone__ostrzezenie');\n    const blad = strefa.querySelector('.neckle-dropzone__blad');\n    const zmien = strefa.querySelector('.neckle-dropzone__zmien');\n\n    let aktywnyUrl = null;\n    const zwolnijUrl = () => {\n      if (aktywnyUrl) {\n        URL.revokeObjectURL(aktywnyUrl);\n        aktywnyUrl = null;\n      }\n    };\n\n    const pokazBlad = (tekst) => {\n      blad.textContent = tekst;\n      blad.hidden = !tekst;\n    };\n\n    const wyczyscPodglad = () => {\n      zwolnijUrl();\n      podglad.hidden = true;\n      podglad.classList.remove('is-visible');\n      miniatura.removeAttribute('src');\n      ostrzezenie.hidden = true;\n      strefa.classList.remove('is-wypelniona');\n    };\n\n    const pokazPodglad = (plik) => {\n      pokazBlad('');\n\n      if (!plik.type.startsWith('image/')) {\n        wyczyscPodglad();\n        pokazBlad(tekst('notImage', 'To nie jest plik graficzny. Wybierz zdj\u0119cie w formacie JPG, PNG lub HEIC.'));\n        return;\n      }\n\n      zwolnijUrl();\n      aktywnyUrl = URL.createObjectURL(plik);\n      miniatura.src = aktywnyUrl;\n      miniatura.alt = wstaw(\n        tekst('previewAlt', 'Podgl\u0105d wgranego zdj\u0119cia: __FILE__'),\n        '__FILE__',\n        plik.name,\n      );\n      nazwa.textContent = plik.name;\n      szczegoly.textContent = formatujRozmiar(plik.size);\n      podglad.hidden = false;\n      podglad.classList.remove('is-visible');\n      requestAnimationFrame(() => podglad.classList.add('is-visible'));\n      strefa.classList.add('is-wypelniona');\n\n      if (plik.size > MAX_PODGLAD_BAJTY) return;\n\n      // Ostrzezenie o rozdzielczosci jest miekkie z rozmyslu. OwnPrint nie podal\n      // twardego minimum px, wiec nie blokujemy zakupu - informujemy, bo to\n      // najczestsza przyczyna nieudanego grawerunku.\n      const sonda = new Image();\n      sonda.onload = () => {\n        const krawedz = Math.min(sonda.naturalWidth, sonda.naturalHeight);\n        szczegoly.textContent = sonda.naturalWidth + ' \u00D7 ' + sonda.naturalHeight + ' px \u00B7 ' + formatujRozmiar(plik.size);\n        if (krawedz && krawedz < MIN_KRAWEDZ_PX) {\n          ostrzezenie.textContent = tekst(\n            'smallPhoto',\n            'To zdj\u0119cie jest ma\u0142e. Grawer mo\u017Ce wyj\u015B\u0107 nieostry \u2014 je\u015Bli masz wyra\u017Aniejsze, lepiej u\u017Cy\u0107 tamtego.',\n          );\n          ostrzezenie.hidden = false;\n        } else {\n          ostrzezenie.hidden = true;\n        }\n      };\n      sonda.onerror = () => { ostrzezenie.hidden = true; };\n      sonda.src = aktywnyUrl;\n    };\n\n    const ustawPlik = (plik) => {\n      const transfer = new DataTransfer();\n      transfer.items.add(plik);\n      input.files = transfer.files;\n      // Handler OwnPrint slucha natywnego 'change' na swoim inpucie.\n      input.dispatchEvent(new Event('change', { bubbles: true }));\n    };\n\n    trigger.addEventListener('click', () => input.click());\n    zmien.addEventListener('click', () => input.click());\n\n    // Capture uruchamia podgl\u0105d przed b\u0105belkowaniem do OwnPrint. Aplikacja\n    // mo\u017Ce przebudowa\u0107 w\u0142asne pole po wyborze pliku, ale nie mo\u017Ce zatrzyma\u0107\n    // naszej miniatury i jej animacji na tym samym zdarzeniu.\n    input.addEventListener('change', () => {\n      const plik = input.files && input.files[0];\n      if (plik) pokazPodglad(plik);\n      else wyczyscPodglad();\n    }, true);\n\n    ['dragenter', 'dragover'].forEach((nazwaZdarzenia) => {\n      strefa.addEventListener(nazwaZdarzenia, (event) => {\n        event.preventDefault();\n        strefa.classList.add('is-nad');\n      });\n    });\n\n    ['dragleave', 'dragend'].forEach((nazwaZdarzenia) => {\n      strefa.addEventListener(nazwaZdarzenia, (event) => {\n        if (nazwaZdarzenia === 'dragleave' && strefa.contains(event.relatedTarget)) return;\n        strefa.classList.remove('is-nad');\n      });\n    });\n\n    strefa.addEventListener('drop', (event) => {\n      event.preventDefault();\n      strefa.classList.remove('is-nad');\n      const plik = event.dataTransfer && event.dataTransfer.files && event.dataTransfer.files[0];\n      if (!plik) return;\n      if (!plik.type.startsWith('image/')) {\n        pokazBlad(tekst('notImage', 'To nie jest plik graficzny. Wybierz zdj\u0119cie w formacie JPG, PNG lub HEIC.'));\n        return;\n      }\n      ustawPlik(plik);\n    });\n\n    window.addEventListener('pagehide', zwolnijUrl);\n\n    if (input.files && input.files.length) pokazPodglad(input.files[0]);\n  };\n\n  const skanuj = () => {\n    slot.querySelectorAll('input[type=\"file\"]').forEach(zbudujDropzone);\n  };\n\n  skanuj();\n\n  // Aplikacja renderuje swoje pola asynchronicznie i potrafi je przebudowac\n  // przy zmianie wariantu, wiec samo jednorazowe skanowanie nie wystarczy.\n  new MutationObserver(skanuj).observe(slot, { childList: true, subtree: true });\n})();\n"],
  "mappings": "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",
  "names": ["tekst"]
}
