{
  "version": 3,
  "sources": ["/cdn/shop/t/31/assets/craftdiy-upload-limits-v1.js?craftdiy_release=v44-final.3"],
  "sourcesContent": ["(() => {\n  'use strict';\n\n  if (globalThis.__CRAFTDIY_UPLOAD_LIMITS_V1__) return;\n  globalThis.__CRAFTDIY_UPLOAD_LIMITS_V1__ = true;\n\n  const MIB = 1024 * 1024;\n  const MAX_FILES = 10;\n  const MAX_FILE_BYTES = 30 * MIB;\n  const RECOMMENDED_FILE_BYTES = 5 * MIB;\n  const MAX_TOTAL_BYTES = MAX_FILES * MAX_FILE_BYTES;\n  const SUPPORTED_TYPES = new Set(['image/jpeg', 'image/png', 'image/webp']);\n\n  function fileSize(bytes) {\n    const value = Number(bytes || 0) / MIB;\n    return `${value >= 10 ? value.toFixed(0) : value.toFixed(1)} MB`;\n  }\n\n  function selectedFiles(customizer, exceptIndex = -1) {\n    return (customizer.photoState || [])\n      .map((state, index) => (index === exceptIndex ? null : state?.file))\n      .filter(Boolean);\n  }\n\n  function errorForSelection(customizer, input, file) {\n    const index = Number(input.dataset.photoIndex);\n    if (!SUPPORTED_TYPES.has(file.type)) {\n      return 'Please choose a JPG, PNG or WebP image.';\n    }\n    if (file.size > MAX_FILE_BYTES) {\n      return `${file.name} is ${fileSize(file.size)}. Each photo must be 30 MB or smaller.`;\n    }\n\n    const otherFiles = selectedFiles(customizer, index);\n    if (otherFiles.length + 1 > MAX_FILES) {\n      return `You can upload up to ${MAX_FILES} photos for one item.`;\n    }\n\n    const totalBytes = otherFiles.reduce((sum, current) => sum + current.size, 0) + file.size;\n    if (totalBytes > MAX_TOTAL_BYTES) {\n      return `The selected photos total ${fileSize(totalBytes)}. The maximum total is ${fileSize(MAX_TOTAL_BYTES)}.`;\n    }\n    return '';\n  }\n\n  function validateSelectedFiles(customizer) {\n    const files = selectedFiles(customizer);\n    if (files.length > MAX_FILES) {\n      throw new Error(`You can upload up to ${MAX_FILES} photos for one item.`);\n    }\n\n    const oversized = files.find((file) => file.size > MAX_FILE_BYTES);\n    if (oversized) {\n      throw new Error(`${oversized.name} is ${fileSize(oversized.size)}. Each photo must be 30 MB or smaller.`);\n    }\n\n    const unsupported = files.find((file) => !SUPPORTED_TYPES.has(file.type));\n    if (unsupported) throw new Error('Please use JPG, PNG or WebP images only.');\n\n    const totalBytes = files.reduce((sum, file) => sum + file.size, 0);\n    if (totalBytes > MAX_TOTAL_BYTES) {\n      throw new Error(`The selected photos total ${fileSize(totalBytes)}. The maximum total is ${fileSize(MAX_TOTAL_BYTES)}.`);\n    }\n  }\n\n  function updateSummary(customizer) {\n    const summary = customizer.querySelector('[data-craftdiy-upload-summary]');\n    if (!summary) return;\n    const files = selectedFiles(customizer);\n    const totalBytes = files.reduce((sum, file) => sum + file.size, 0);\n    summary.textContent = `${files.length}/${MAX_FILES} photos selected \u00B7 ${fileSize(totalBytes)} total`;\n  }\n\n  function addStyles() {\n    if (document.querySelector('[data-craftdiy-upload-limit-styles]')) return;\n    const style = document.createElement('style');\n    style.dataset.craftdiyUploadLimitStyles = '';\n    style.textContent = `\n      craftdiy-customizer .craftdiy-upload-guidance {\n        margin: 8px 0 12px;\n        padding: 10px 12px;\n        border: 1px solid rgba(78, 63, 52, .14);\n        border-radius: 8px;\n        background: rgba(250, 247, 243, .82);\n        color: inherit;\n        font-size: 12px;\n        line-height: 1.45;\n      }    `;\n    document.head.append(style);\n  }\n\n  function decorate(customizer) {\n    if (!customizer || customizer.dataset.uploadLimitsReady === 'true') return;\n    const inputs = [...customizer.querySelectorAll('input[type=\"file\"][data-photo-index]')];\n    if (!inputs.length) return;\n\n    customizer.dataset.uploadLimitsReady = 'true';\n    addStyles();\n\n    const module = inputs[0].closest('.craftdiy-customizer__module');\n    const title = module?.querySelector('.craftdiy-customizer__module-title');\n    const guidance = document.createElement('p');\n    guidance.className = 'craftdiy-upload-guidance';\n    guidance.id = `craftdiy-upload-guidance-${Math.random().toString(36).slice(2, 9)}`;\n    guidance.innerHTML = 'Recommended: <strong>JPG, PNG or WebP</strong> \u00B7 <strong>5 MB or less per photo</strong>.';\n    if (title) title.insertAdjacentElement('afterend', guidance);\n    else module?.prepend(guidance);\n\n    inputs.forEach((input) => {\n      input.setAttribute('aria-describedby', guidance.id);\n      const format = input.closest('[data-upload-label]')?.querySelector('small');\n      if (format) format.textContent = 'JPG, PNG or WebP \u00B7 recommended \u2264 5 MB';\n    });\n\n    const originalValidate = customizer.validateForApply?.bind(customizer);\n    if (originalValidate) {\n      customizer.validateForApply = function validateForApplyWithUploadLimits() {\n        validateSelectedFiles(this);\n        return originalValidate();\n      };\n    }\n    updateSummary(customizer);\n  }\n\n  document.addEventListener('craftdiy:customizer-ready', (event) => {\n    decorate(event.detail?.customizer || event.target);\n  }, true);\n\n  document.addEventListener('change', (event) => {\n    const input = event.target.closest?.('craftdiy-customizer input[type=\"file\"][data-photo-index]');\n    const file = input?.files?.[0];\n    if (!input || !file) return;\n    const customizer = input.closest('craftdiy-customizer');\n    decorate(customizer);\n    const error = errorForSelection(customizer, input, file);\n    input.setCustomValidity(error);\n    if (!error) return;\n\n    input.value = '';\n    customizer.setStatus?.(error, 'error');\n    updateSummary(customizer);\n    event.preventDefault();\n    event.stopImmediatePropagation();\n  }, true);\n\n  document.addEventListener('craftdiy:photo-selected', (event) => {\n    const customizer = event.detail?.customizer || event.target;\n    updateSummary(customizer);\n    const file = event.detail?.file;\n    if (file?.size > RECOMMENDED_FILE_BYTES) {\n      customizer.setStatus?.(\n        `Photo ${Number(event.detail?.index || 0) + 1} added (${fileSize(file.size)}). For faster upload, 5 MB or less is recommended.`,\n        'warning',\n      );\n    }\n  }, true);\n\n  document.querySelectorAll('craftdiy-customizer').forEach(decorate);\n})();\n\r\n"],
  "mappings": "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",
  "names": []
}
