{
  "version": 3,
  "sources": ["/cdn/shop/t/1064/assets/dtf-upload-tabs.js?auto=format%2Ccompress"],
  "sourcesContent": ["/* =========================================================\n   DTF Upload Tabs \u2014 behaviors\n   ---------------------------------------------------------\n   Scope:\n   - Tab switching (4 tabs).\n   - Browse/drop proxy so drops anywhere inside Tab 1 hit\n     the native #fileInput.\n   - Source buttons (Canva/Dropbox/Drive/OneDrive) fire a\n     \"coming soon\" toast. Wire real SDKs here when ready.\n   - Tab 4 options open the Design Studio in a full-screen\n     <dialog> iframe. \"Skip and start from scratch\" too.\n   - A MutationObserver watches the native #uploadArea state\n     and collapses the tabs once a file has been selected.\n   - Tab 2 (Recent Designs) is rendered by the my-designs-panel\n     snippet and bridged to the upload pipeline by\n     snippets/product-page-popups.liquid (md-picker:use-designs\n     event). This file is intentionally NOT involved.\n   - Tab 3 (Create with AI) is rendered by the aiImageGenerator\n     content-for; the native pink-box button launches the\n     existing dialog unchanged.\n   ========================================================= */\n\n/* PERF-LOCKED 2026-06-02: ai-create.css deferred loader (shared with dtf-ai-modal.js).\n   Do NOT restore eager load \u2014 saves ~3.3s anonymous Style & Layout. See perf-locked registry.\n   Injects the <link> on first AI-tab click or AI-modal open.\n   Callback queue handles rapid clicks; 4s timeout prevents a\n   permanent hang if the network request fails silently. */\n(function () {\n  if (window.__ensureAiCss) return;\n  window.__aiCssLoaded = false;\n  window.__aiCssLoading = false;\n  window.__aiCssCallbacks = [];\n  function flushCallbacks() {\n    if (window.__aiCssLoaded) return;\n    window.__aiCssLoaded = true;\n    window.__aiCssLoading = false;\n    var cbs = window.__aiCssCallbacks;\n    window.__aiCssCallbacks = [];\n    cbs.forEach(function (cb) { cb(); });\n  }\n  window.__ensureAiCss = function (callback) {\n    if (window.__aiCssLoaded) { callback(); return; }\n    window.__aiCssCallbacks.push(callback);\n    if (window.__aiCssLoading) return;\n    window.__aiCssLoading = true;\n    var root = document.querySelector('[data-dtfut-ai-css]');\n    // base sheet + the v2 look sheet (data-dtfut-ai-css2, 2026-09-08); callbacks\n    // flush once BOTH have loaded (or errored), still with the 4s fallback.\n    var hrefs = root ? [root.getAttribute('data-dtfut-ai-css'), root.getAttribute('data-dtfut-ai-css2')] : [];\n    hrefs = hrefs.filter(function (h) { return !!h; });\n    if (!hrefs.length) { flushCallbacks(); return; }\n    var pending = hrefs.length;\n    function one() { if (--pending <= 0) flushCallbacks(); }\n    hrefs.forEach(function (href) {\n      var link = document.createElement('link');\n      link.rel = 'stylesheet';\n      link.href = href;\n      link.onload = one;\n      link.onerror = one;\n      document.head.appendChild(link);\n    });\n    setTimeout(flushCallbacks, 4000);\n  };\n})();\n\n/* --- boxicons.min.css deferred loader ---\n   PERF-LOCKED 2026-06-02: boxicons deferred to post-paint. 1,591 CSS rules,\n   only 1 glyph used (bxs-file-blank), inside display:none upload area.\n   rIC pre-fetches; sync() trigger guarantees loaded before icon is visible.\n   See perf-locked registry. */\n(function () {\n  if (window.__boxiconsCssLoaded) return;\n  window.__boxiconsCssLoaded = false;\n  function load() {\n    if (window.__boxiconsCssLoaded) return;\n    var carrier = document.querySelector('[data-boxicons-css]');\n    if (!carrier) return;\n    var href = carrier.getAttribute('data-boxicons-css');\n    if (!href) return;\n    window.__boxiconsCssLoaded = true;\n    var link = document.createElement('link');\n    link.rel = 'stylesheet';\n    link.href = href;\n    document.head.appendChild(link);\n  }\n  window.__ensureBoxiconsCss = load;\n  if (typeof requestIdleCallback === 'function') {\n    requestIdleCallback(load);\n  } else {\n    setTimeout(load, 2000);\n  }\n})();\n\n/* --- v0-styles.css deferred loader ---\n   PERF-LOCKED 2026-06-02: v0-styles.css deferred to first Design Studio open.\n   670 rules, all under .editor-container (hidden until studio tab/link).\n   Callback-queue pattern \u2014 gate callers until CSS onload fires.\n   See perf-locked registry. */\n(function () {\n  if (window.__ensureV0Css) return;\n  var loaded = false;\n  var loading = false;\n  var callbacks = [];\n  function flush() {\n    if (loaded) return;\n    loaded = true;\n    loading = false;\n    var cbs = callbacks;\n    callbacks = [];\n    cbs.forEach(function (cb) { cb(); });\n  }\n  window.__v0CssLoaded = false;\n  window.__ensureV0Css = function (callback) {\n    if (loaded) { window.__v0CssLoaded = true; callback(); return; }\n    callbacks.push(callback);\n    if (loading) return;\n    loading = true;\n    var carrier = document.querySelector('[data-v0-css]');\n    var href = carrier && carrier.getAttribute('data-v0-css');\n    if (!href) { flush(); return; }\n    var link = document.createElement('link');\n    link.rel = 'stylesheet';\n    link.href = href;\n    link.onload = function () { window.__v0CssLoaded = true; flush(); };\n    link.onerror = flush;\n    setTimeout(flush, 4000);\n    document.head.appendChild(link);\n  };\n})();\n\n(function () {\n  'use strict';\n\n  if (window.__dtfUploadTabsInit) return;\n  window.__dtfUploadTabsInit = true;\n\n  /* Every prompt in this tab should:\n       1. Show up to 3 canned (existing) results from getGenerativeAiUploads.\n       2. Skip the batch generate-new POST if any canned came back.\n       3. Otherwise let the native code generate a fresh batch (batchSize=3).\n     We do this by intercepting both endpoints via fetch: cap the canned\n     response to 3 items, set __dtfutSkipNewAIGeneration when that array is\n     non-empty, and short-circuit postBatchGenerativeAiUpload when the flag\n     is set. The flag is consumed once per submit. */\n  if (!window.__dtfutFetchPatched && typeof window.fetch === 'function') {\n    window.__dtfutFetchPatched = true;\n    var origFetch = window.fetch;\n    window.fetch = function (url, options) {\n      try {\n        var urlStr = typeof url === 'string' ? url : (url && url.url) || '';\n\n        if (urlStr.indexOf('getGenerativeAiUploads.php') !== -1) {\n          return origFetch.apply(this, arguments).then(function (resp) {\n            return resp.clone().json().then(function (data) {\n              var capped = Array.isArray(data) ? data.slice(0, 3) : [];\n              if (capped.length > 0) {\n                window.__dtfutSkipNewAIGeneration = true;\n              }\n              return new Response(JSON.stringify(capped), {\n                status: resp.status,\n                headers: { 'Content-Type': 'application/json' }\n              });\n            }).catch(function () { return resp; });\n          });\n        }\n\n        if (window.__dtfutSkipNewAIGeneration && urlStr.indexOf('postBatchGenerativeAiUpload.php') !== -1) {\n          window.__dtfutSkipNewAIGeneration = false;\n          return Promise.resolve(new Response('[]', {\n            status: 200,\n            headers: { 'Content-Type': 'application/json' }\n          }));\n        }\n      } catch (e) { /* fall through */ }\n      return origFetch.apply(this, arguments);\n    };\n  }\n\n  /* ---------------- Toast ---------------- */\n  function toast(msg) {\n    var t = document.getElementById('dtfut-toast');\n    if (!t) {\n      t = document.createElement('div');\n      t.id = 'dtfut-toast';\n      t.style.cssText = 'position:fixed;left:50%;bottom:24px;transform:translate(-50%,10px);background:#111827;color:#fff;font:600 13px/1 \"DM Sans\",system-ui;padding:12px 18px;border-radius:999px;box-shadow:0 10px 30px rgba(0,0,0,.2);opacity:0;transition:opacity .2s ease,transform .2s ease;z-index:9999;pointer-events:none;';\n      document.body.appendChild(t);\n    }\n    t.textContent = msg;\n    requestAnimationFrame(function () {\n      t.style.opacity = '1';\n      t.style.transform = 'translate(-50%,0)';\n    });\n    clearTimeout(t.__dtfutTimer);\n    t.__dtfutTimer = setTimeout(function () {\n      t.style.opacity = '0';\n      t.style.transform = 'translate(-50%,10px)';\n    }, 2200);\n  }\n\n  /* ---------------- Tab switching ---------------- */\n  /* PERF-LOCKED 2026-06-02: gate ensures ai-create.css loads before AI tab renders. See perf-locked registry. */\n  function activateTab(root, name) {\n    if (name === 'ai' && !window.__aiCssLoaded) {\n      var btn = root.querySelector('[data-dtfut-tab=\"ai\"]');\n      if (btn) btn.classList.add('is-active');\n      window.__ensureAiCss(function () { activateTab(root, name); });\n      return;\n    }\n    if (name === 'create' && !window.__v0CssLoaded) {\n      var btn = root.querySelector('[data-dtfut-tab=\"create\"]');\n      if (btn) btn.classList.add('is-active');\n      window.__ensureV0Css(function () { activateTab(root, name); });\n      return;\n    }\n    /* PERF mt4: JS twin of the CSS gate above \u2014 fabric/webfont/v0-script load\n       on first studio open via __ensureV0Js (v0-editor.liquid). */\n    if (name === 'create' && window.__ensureV0Js && !window.__v0JsLoaded) {\n      var btnJ = root.querySelector('[data-dtfut-tab=\"create\"]');\n      if (btnJ) btnJ.classList.add('is-active');\n      window.__ensureV0Js(function () { activateTab(root, name); });\n      return;\n    }\n    var tabs = root.querySelectorAll('[data-dtfut-tab]');\n    var panels = root.querySelectorAll('[data-dtfut-panel]');\n    var activeTitle = '';\n    tabs.forEach(function (t) {\n      var isActive = t.getAttribute('data-dtfut-tab') === name;\n      t.classList.toggle('is-active', isActive);\n      t.setAttribute('aria-selected', isActive ? 'true' : 'false');\n      if (isActive) activeTitle = t.getAttribute('data-dtfut-title-text') || '';\n    });\n    panels.forEach(function (p) {\n      var isActive = p.getAttribute('data-dtfut-panel') === name;\n      p.classList.toggle('is-active', isActive);\n      if (isActive) p.removeAttribute('hidden');\n      else p.setAttribute('hidden', '');\n    });\n    // Deferred render: the Recent / Previous-Designs grid is not built on\n    // page load (perf \u2014 see my-designs-panel.liquid). Build it the first\n    // time its tab is activated. __mdRenderNow() is idempotent (no-op once\n    // unlocked), so this is safe to call on every recent-tab activation.\n    if (name === 'recent') {\n      var __mdc = root.querySelector('[data-dtfut-panel=\"recent\"] .md-container');\n      if (__mdc && typeof __mdc.__mdRenderNow === 'function') __mdc.__mdRenderNow();\n    }\n    if (activeTitle) {\n      var titleEl = root.querySelector('[data-dtfut-title]');\n      if (titleEl) titleEl.textContent = activeTitle;\n    }\n    root.dispatchEvent(new CustomEvent('dtfut:tab-change', { detail: { name: name }, bubbles: true }));\n  }\n\n  function wireTabs(root) {\n    root.addEventListener('click', function (e) {\n      var btn = e.target.closest('[data-dtfut-tab]');\n      if (!btn || !root.contains(btn)) return;\n      activateTab(root, btn.getAttribute('data-dtfut-tab'));\n    });\n  }\n\n  /* ---------------- Tab 1: drop forwarding ---------------- */\n  /* If the user drops a file onto the panel (but outside the\n     native dropzone inner circle), forward it to #fileInput so\n     the existing change-listener picks it up. */\n  function wireDropForward(root) {\n    var host = root.querySelector('[data-dtfut-panel=\"upload\"]');\n    if (!host) return;\n\n    host.addEventListener('dragover', function (e) {\n      if (e.dataTransfer && e.dataTransfer.types && e.dataTransfer.types.indexOf('Files') > -1) {\n        e.preventDefault();\n      }\n    });\n    host.addEventListener('drop', function (e) {\n      if (!e.dataTransfer || !e.dataTransfer.files || !e.dataTransfer.files.length) return;\n      // If the drop already hit the native dropzone, let it handle.\n      if (e.target.closest('#dropZoon')) return;\n      // Never hijack drops aimed at a second-design box (or the gang-sheet\n      // equivalent) \u2014 those elements own their drops.\n      if (e.target.closest('.secondDropZone, another-upload, .anotherUploadGangSheet')) return;\n      // Once a design is uploaded (body.image-uploaded \u2014 the reliable signal),\n      // stray drops must NOT forward to #fileInput: that silently REPLACES the\n      // first design. From that point the second design only accepts drops\n      // landed ON its own box. Multi-upload pages keep the forward \u2014 their\n      // pipeline handles additional files natively.\n      var isMultiUpload = document.querySelector('multi-upload, another-upload-multi, uploaded-files-block');\n      if (!isMultiUpload && document.body.classList.contains('image-uploaded')) {\n        e.preventDefault(); // still swallow it so the browser doesn't navigate to the file\n        return;\n      }\n      e.preventDefault();\n      var input = document.getElementById('fileInput');\n      if (!input) return;\n      try {\n        input.files = e.dataTransfer.files;\n        input.dispatchEvent(new Event('change', { bubbles: true }));\n      } catch (_) {\n        // Fallback: dispatch a synthetic drop on #dropZoon.\n        var dz = document.getElementById('dropZoon');\n        if (dz) {\n          var ev = new DragEvent('drop', { bubbles: true, cancelable: true, dataTransfer: e.dataTransfer });\n          dz.dispatchEvent(ev);\n        }\n      }\n    });\n  }\n\n  /* ---------------- Canva / Dropbox / Drive / OneDrive ---------------- */\n\n  /* Lazy-load the Dropbox Chooser script. Idempotent; parallel calls share\n     one script tag. Rejects if the app key is missing or the script fails\n     to load. */\n  var dropboxLoaderPromise = null;\n  function loadDropboxChooser(appKey) {\n    if (window.Dropbox && typeof window.Dropbox.choose === 'function') {\n      return Promise.resolve();\n    }\n    if (dropboxLoaderPromise) return dropboxLoaderPromise;\n    dropboxLoaderPromise = new Promise(function (resolve, reject) {\n      var s = document.createElement('script');\n      s.id = 'dropboxjs';\n      s.src = 'https://www.dropbox.com/static/api/2/dropins.js';\n      s.setAttribute('data-app-key', appKey);\n      s.onload = function () { resolve(); };\n      s.onerror = function () {\n        dropboxLoaderPromise = null;\n        reject(new Error('Failed to load Dropbox Chooser'));\n      };\n      document.head.appendChild(s);\n    });\n    return dropboxLoaderPromise;\n  }\n\n  /* Fetch a remote file URL, wrap as a File, and hand it to the native\n     upload pipeline (manageFiles on the newer upload-controls, uploadFile\n     on the legacy path). Same pattern used by the AI-image figure click\n     handler below. */\n  function importRemoteFile(url, fileName) {\n    var jq = window.jQuery || window.$;\n    return fetch(url)\n      .then(function (response) {\n        if (!response.ok) throw new Error('Download failed: ' + response.status);\n        var type = response.headers.get('Content-Type') || 'application/octet-stream';\n        return response.arrayBuffer().then(function (ab) {\n          return { type: type, buffer: ab };\n        });\n      })\n      .then(function (data) {\n        var blob = new Blob([data.buffer], { type: data.type });\n        var file = new File([blob], fileName, { type: data.type });\n        var isNewBySize = jq ? jq('upload-controls').length : 0;\n        if (isNewBySize > 0 && typeof window.manageFiles === 'function') {\n          window.manageFiles([file]);\n        } else if (typeof window.uploadFile === 'function') {\n          if (jq && jq('.step__2').hasClass('hidden')) {\n            window.uploadFile(file);\n          } else {\n            window.uploadFile(file, 'second_image');\n          }\n        }\n      });\n  }\n\n  function openDropboxChooser(appKey) {\n    loadDropboxChooser(appKey).then(function () {\n      window.Dropbox.choose({\n        linkType: 'direct',\n        multiselect: true,\n        extensions: ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.tiff', '.tif', '.svg', '.pdf'],\n        success: function (files) {\n          if (!files || !files.length) return;\n          files.forEach(function (f) {\n            importRemoteFile(f.link, f.name).catch(function (err) {\n              console.error('Dropbox import error:', err);\n              toast('Could not import ' + f.name);\n            });\n          });\n        },\n        cancel: function () {}\n      });\n    }).catch(function (err) {\n      console.error(err);\n      toast('Dropbox is temporarily unavailable');\n    });\n  }\n\n  /* ---- Google Drive Picker ---- */\n  /* Two scripts needed: Google Identity Services (for the OAuth token) and\n     gapi (for the Picker API). Both are loaded lazily and de-duped. */\n  var gisLoaderPromise = null;\n  function loadGoogleIdentity() {\n    if (window.google && window.google.accounts && window.google.accounts.oauth2) {\n      return Promise.resolve();\n    }\n    if (gisLoaderPromise) return gisLoaderPromise;\n    gisLoaderPromise = new Promise(function (resolve, reject) {\n      var s = document.createElement('script');\n      s.src = 'https://accounts.google.com/gsi/client';\n      s.async = true;\n      s.defer = true;\n      s.onload = function () { resolve(); };\n      s.onerror = function () {\n        gisLoaderPromise = null;\n        reject(new Error('Failed to load Google Identity Services'));\n      };\n      document.head.appendChild(s);\n    });\n    return gisLoaderPromise;\n  }\n\n  var gapiLoaderPromise = null;\n  function loadGapiPicker() {\n    if (window.gapi && window.google && window.google.picker) {\n      return Promise.resolve();\n    }\n    if (gapiLoaderPromise) return gapiLoaderPromise;\n    gapiLoaderPromise = new Promise(function (resolve, reject) {\n      var s = document.createElement('script');\n      s.src = 'https://apis.google.com/js/api.js';\n      s.async = true;\n      s.defer = true;\n      s.onload = function () {\n        window.gapi.load('picker', {\n          callback: function () { resolve(); },\n          onerror: function () {\n            gapiLoaderPromise = null;\n            reject(new Error('Failed to load Google Picker API'));\n          }\n        });\n      };\n      s.onerror = function () {\n        gapiLoaderPromise = null;\n        reject(new Error('Failed to load gapi'));\n      };\n      document.head.appendChild(s);\n    });\n    return gapiLoaderPromise;\n  }\n\n  /* Pull a Drive file's bytes using the access token, wrap as File, feed\n     into the same manageFiles/uploadFile pipeline as Dropbox. */\n  function fetchDriveFile(fileId, fileName, mimeType, accessToken) {\n    var jq = window.jQuery || window.$;\n    var url = 'https://www.googleapis.com/drive/v3/files/' + encodeURIComponent(fileId) +\n              '?alt=media&supportsAllDrives=true';\n    return fetch(url, {\n      headers: { Authorization: 'Bearer ' + accessToken }\n    })\n      .then(function (response) {\n        if (!response.ok) throw new Error('Drive download failed: ' + response.status);\n        return response.arrayBuffer();\n      })\n      .then(function (ab) {\n        var type = mimeType || 'application/octet-stream';\n        var blob = new Blob([ab], { type: type });\n        var file = new File([blob], fileName, { type: type });\n        var isNewBySize = jq ? jq('upload-controls').length : 0;\n        if (isNewBySize > 0 && typeof window.manageFiles === 'function') {\n          window.manageFiles([file]);\n        } else if (typeof window.uploadFile === 'function') {\n          if (jq && jq('.step__2').hasClass('hidden')) {\n            window.uploadFile(file);\n          } else {\n            window.uploadFile(file, 'second_image');\n          }\n        }\n      });\n  }\n\n  function openGoogleDrivePicker(clientId, apiKey, loginHint) {\n    Promise.all([loadGoogleIdentity(), loadGapiPicker()]).then(function () {\n      var tokenClient = window.google.accounts.oauth2.initTokenClient({\n        client_id: clientId,\n        scope: 'https://www.googleapis.com/auth/drive.file',\n        login_hint: loginHint || '',\n        callback: function (tokenResponse) {\n          if (!tokenResponse || !tokenResponse.access_token) {\n            toast('Google sign-in was cancelled');\n            return;\n          }\n          var accessToken = tokenResponse.access_token;\n          var mimeTypes = 'image/jpeg,image/png,image/gif,image/webp,image/svg+xml,image/tiff,application/pdf';\n          var docsView = new window.google.picker.DocsView(window.google.picker.ViewId.DOCS)\n            .setMimeTypes(mimeTypes)\n            .setIncludeFolders(true)\n            .setSelectFolderEnabled(false);\n          var uploadView = new window.google.picker.DocsUploadView();\n          // Project number (AKA appId) is the numeric prefix of the OAuth\n          // Client ID \u2014 required so drive.file scope recognizes picked files.\n          var projectNumber = (clientId || '').split('-')[0];\n          var picker = new window.google.picker.PickerBuilder()\n            .enableFeature(window.google.picker.Feature.MULTISELECT_ENABLED)\n            .enableFeature(window.google.picker.Feature.SUPPORT_DRIVES)\n            .setAppId(projectNumber)\n            .setOAuthToken(accessToken)\n            .setDeveloperKey(apiKey)\n            .addView(docsView)\n            .addView(uploadView)\n            .setCallback(function (data) {\n              if (data.action !== window.google.picker.Action.PICKED) return;\n              var docs = data.docs || [];\n              docs.forEach(function (doc) {\n                fetchDriveFile(doc.id, doc.name, doc.mimeType, accessToken).catch(function (err) {\n                  console.error('Drive import error:', err);\n                  toast('Could not import ' + doc.name);\n                });\n              });\n            })\n            .build();\n          picker.setVisible(true);\n        }\n      });\n      tokenClient.requestAccessToken({ prompt: '' });\n    }).catch(function (err) {\n      console.error(err);\n      toast('Google Drive is temporarily unavailable');\n    });\n  }\n\n  /* ---- OneDrive File Picker (OneDrive.js v7.2) ---- */\n  var oneDriveLoaderPromise = null;\n  function loadOneDrivePicker() {\n    if (window.OneDrive && typeof window.OneDrive.open === 'function') {\n      return Promise.resolve();\n    }\n    if (oneDriveLoaderPromise) return oneDriveLoaderPromise;\n    oneDriveLoaderPromise = new Promise(function (resolve, reject) {\n      var s = document.createElement('script');\n      s.src = 'https://js.live.net/v7.2/OneDrive.js';\n      s.async = true;\n      s.defer = true;\n      s.onload = function () { resolve(); };\n      s.onerror = function () {\n        oneDriveLoaderPromise = null;\n        reject(new Error('Failed to load OneDrive picker'));\n      };\n      document.head.appendChild(s);\n    });\n    return oneDriveLoaderPromise;\n  }\n\n  function openOneDrivePicker(clientId, redirectUri) {\n    loadOneDrivePicker().then(function () {\n      window.OneDrive.open({\n        clientId: clientId,\n        action: 'download',\n        multiSelect: true,\n        openInNewWindow: true,\n        advanced: {\n          redirectUri: redirectUri,\n          filter: '.png,.jpg,.jpeg,.gif,.webp,.svg,.tiff,.tif,.pdf'\n        },\n        success: function (response) {\n          var files = (response && response.value) || [];\n          files.forEach(function (f) {\n            var url = f['@microsoft.graph.downloadUrl'] || f.downloadUrl;\n            if (!url) return;\n            importRemoteFile(url, f.name).catch(function (err) {\n              console.error('OneDrive import error:', err);\n              toast('Could not import ' + f.name);\n            });\n          });\n        },\n        cancel: function () {},\n        error: function (err) {\n          console.error('OneDrive picker error:', err);\n          toast('OneDrive picker failed');\n        }\n      });\n    }).catch(function (err) {\n      console.error(err);\n      toast('OneDrive is temporarily unavailable');\n    });\n  }\n\n  function wireSources(root) {\n    root.addEventListener('click', function (e) {\n      var btn = e.target.closest('[data-dtfut-source]');\n      if (!btn) return;\n      var src = btn.getAttribute('data-dtfut-source');\n      if (src === 'dropbox') {\n        var appKey = root.getAttribute('data-dtfut-dropbox-key') || '';\n        if (!appKey || appKey === 'REPLACE_WITH_DROPBOX_APP_KEY') {\n          toast('Dropbox app key not configured');\n          return;\n        }\n        openDropboxChooser(appKey);\n        return;\n      }\n      if (src === 'drive') {\n        var clientId = root.getAttribute('data-dtfut-google-client-id') || '';\n        var apiKey = root.getAttribute('data-dtfut-google-api-key') || '';\n        var loginHint = root.getAttribute('data-dtfut-customer-email') || '';\n        if (!clientId || clientId === 'REPLACE_WITH_GOOGLE_CLIENT_ID' ||\n            !apiKey || apiKey === 'REPLACE_WITH_GOOGLE_API_KEY') {\n          toast('Google Drive is not configured');\n          return;\n        }\n        openGoogleDrivePicker(clientId, apiKey, loginHint);\n        return;\n      }\n      if (src === 'onedrive') {\n        var odClientId = root.getAttribute('data-dtfut-onedrive-client-id') || '';\n        var odRedirect = root.getAttribute('data-dtfut-shop-origin') || window.location.origin;\n        if (!odClientId || odClientId === 'REPLACE_WITH_ONEDRIVE_CLIENT_ID') {\n          toast('OneDrive is not configured');\n          return;\n        }\n        openOneDrivePicker(odClientId, odRedirect);\n        return;\n      }\n      toast((src === 'canva' ? 'Canva' : src) + ' import coming soon');\n    });\n  }\n\n  /* ---------------- Tab 4: Design Studio (v0-editor overlay) ----------------\n     The Ninja Design Studio is rendered into every page via layout/theme.liquid\n     (-> snippet 'v0-editor'). It lives hidden as '.customTabelPopup__overlay-editor'.\n     We open it the same way the native '.open-v0-editor' trigger does, except we\n     SKIP the '.customTabelPopup__overlay-modal' intro popup (the \"What would you\n     like to create?\" splash) because our Tab 4 already made that choice. After the\n     overlay is open we click the matching toolbar button so the user lands\n     directly in the intended flow (native file picker for upload, or the new\n     text object + text options panel for text). */\n  function openDesignStudio(mode) {\n    /* PERF mt4: the embedded create-tab path does not go through\n       .open-v0-editor, so it needs its own JS gate. */\n    if (window.__ensureV0Js && !window.__v0JsLoaded) {\n      window.__ensureV0Js(function () { openDesignStudio(mode); });\n      return;\n    }\n    var editorOverlay = document.querySelector('.customTabelPopup__overlay-editor');\n    var introOverlay  = document.querySelector('.customTabelPopup__overlay-modal');\n    if (!editorOverlay) return;\n\n    // Render the studio inline inside the Create tab panel (so it's part of the product page,\n    // not a fullscreen overlay). Tag the overlay with __inlineParent so the fullscreen toggle\n    // knows where to put it back after lifting it to body for fullscreen.\n    var createPanel = document.querySelector('.dtfut__panel[data-dtfut-panel=\"create\"]');\n    if (createPanel) {\n      editorOverlay.__inlineParent = createPanel;\n      if (editorOverlay.parentNode !== createPanel) {\n        createPanel.appendChild(editorOverlay);\n      }\n      createPanel.classList.add('dtfut__panel--studio-open');\n    }\n    editorOverlay.classList.add('studio-inline');\n    editorOverlay.classList.remove('studio-embedded');\n\n    // Mirror '.open-v0-editor' side effects (minus the intro popup).\n    editorOverlay.style.display = 'block';\n    if (introOverlay) introOverlay.style.display = 'none';\n    // NOTE: do NOT add `hide-chat` while inline \u2014 that class locks body scroll,\n    // which is correct for the fullscreen overlay but wrong when the studio is\n    // embedded inside the product page. The fullscreen toggle adds/removes it.\n\n    // v0-editor init uses a transparent-canvas swatch click to seed state.\n    var swatch = document.querySelector('.transparent-swatch.canvas-color-swatch');\n    if (swatch && typeof swatch.click === 'function') {\n      try { swatch.click(); } catch (_) {}\n    }\n\n    // Trigger the intended entry flow. Do this synchronously so we keep the\n    // user-activation gesture \u2014 #add-image-btn forwards to #file-input.click(),\n    // which needs a trusted gesture to open the native picker.\n    if (mode === 'upload') {\n      var uploadBtn = document.querySelector('#add-image-btn');\n      if (uploadBtn) uploadBtn.click();\n    } else if (mode === 'text') {\n      var textBtn = document.querySelector('#add-text-btn');\n      if (textBtn) textBtn.click();\n    }\n    // mode === 'blank' or anything else: just leave them on a clean canvas.\n\n    // Mobile: set the studio to a fixed 38% zoom and pin it there so the\n    // canvas lands centered without resizing. We pre-pin BEFORE the\n    // fullscreen toggle fires (in wireCreateOptions) so the very first\n    // paint targets the 38% layout. setStudioZoomWhenReady then defends\n    // against fitCanvasToArea (which runs ASYNC via MutationObserver)\n    // by re-asserting the target zoom for ~1.5s.\n    var isMobile = window.matchMedia && window.matchMedia('(max-width: 749px)').matches;\n    if (isMobile) {\n      // Tag for fitCanvasToArea to short-circuit (see patch below).\n      window.__dtfMobileZoomTarget = 38;\n      // Apply right now if the API is already on window \u2014 first paint\n      // will use this value instead of fitCanvasToArea's computed scale.\n      if (typeof window.setStudioZoom === 'function') {\n        try { window.setStudioZoom(38); } catch (_) {}\n      }\n      setStudioZoomWhenReady(38);\n    }\n  }\n\n  // Waits for the studio's zoom state to be ready, then sets an exact target\n  // percentage via window.setStudioZoom. Re-asserts for ~1.5s because\n  // fitCanvasToArea runs on a MutationObserver and can override our initial set.\n  function setStudioZoomWhenReady(targetPct, tries) {\n    if (typeof window.setStudioZoom !== 'function') {\n      tries = (tries || 0) + 1;\n      if (tries > 150) return; // PERF mt4: v0-script never arrived \u2014 stop after ~15s\n      setTimeout(function () { setStudioZoomWhenReady(targetPct, tries); }, 100);\n      return;\n    }\n    try { window.setStudioZoom(targetPct); } catch (_) {}\n    var attempts = 0;\n    var iv = setInterval(function () {\n      attempts++;\n      var display = document.getElementById('zoom-display');\n      var current = display && parseInt((display.textContent || '').replace('%', ''), 10);\n      if (current && current > 0 && current !== targetPct) {\n        window.setStudioZoom(targetPct);\n      }\n      if (attempts > 15 || (current === targetPct && attempts > 8)) {\n        clearInterval(iv);\n      }\n    }, 100);\n  }\n\n  // Monkey-patch v0-script's `fitCanvasToArea` so that on mobile, when\n  // we've pinned a target zoom, fitCanvasToArea defers to that value\n  // instead of recomputing a \"fit width\" that briefly zooms the canvas\n  // up before our setStudioZoom pulls it back to 38%. Runs once when\n  // window.fitCanvasToArea is available.\n  function installMobileFitOverride(tries) {\n    if (window.__dtfFitOverrideInstalled) return;\n    if (typeof window.fitCanvasToArea !== 'function') {\n      /* PERF mt4: v0-script is gated behind __ensureV0Js \u2014 park on the PASSIVE\n         __whenV0Js queue (fires at first studio open) instead of polling 100ms\n         forever for a script that may never load. MUST be __whenV0Js, not\n         __ensureV0Js: calling __ensureV0Js here would trigger the full script\n         load on every page view and defeat the gate. The gate is defined by an\n         inline script that parses after this file, so the first poll tick\n         routes us there. */\n      if (window.__whenV0Js && !window.__v0JsLoaded) {\n        window.__whenV0Js(function () { installMobileFitOverride(0); });\n        return;\n      }\n      tries = (tries || 0) + 1;\n      if (tries > 150) return; // no gate and no v0-script \u2014 stop after ~15s\n      setTimeout(function () { installMobileFitOverride(tries); }, 100);\n      return;\n    }\n    window.__dtfFitOverrideInstalled = true;\n    var origFit = window.fitCanvasToArea;\n    window.fitCanvasToArea = function () {\n      var isMobileFs = window.matchMedia && window.matchMedia('(max-width: 749px)').matches;\n      var target = window.__dtfMobileZoomTarget;\n      if (isMobileFs && typeof target === 'number' && typeof window.setStudioZoom === 'function') {\n        try { window.setStudioZoom(target); } catch (_) {}\n        return;\n      }\n      return origFit.apply(this, arguments);\n    };\n  }\n  installMobileFitOverride();\n\n  // Keep fitting width until the layout stabilises. fitStudioWidth measures the\n  // canvas-area width, so we want to re-measure as flex/containment settles.\n  function fitStudioWidthWhenReady() {\n    if (typeof window.fitStudioWidth !== 'function') {\n      setTimeout(fitStudioWidthWhenReady, 100);\n      return;\n    }\n    var attempts = 0;\n    var iv = setInterval(function () {\n      attempts++;\n      window.fitStudioWidth();\n      if (attempts >= 10) clearInterval(iv);\n    }, 120);\n  }\n\n  function isMobileViewport() {\n    return window.matchMedia && window.matchMedia('(max-width: 749px)').matches;\n  }\n\n  // On mobile fullscreen we want the floating pill (undo/redo/zoom) to sit inline\n  // inside the top toolbar \u2014 flex handles vertical centering automatically. Move\n  // it into .toolbar-right just before #fullscreen-toggle-btn when on mobile.\n  function alignFloatingPillInTopBar() {\n    if (!isMobileViewport()) return;\n    var floating = document.querySelector('.customTabelPopup__overlay-editor .floating_tools');\n    var toolbarRight = document.querySelector('.customTabelPopup__overlay-editor .editor-container .toolbar:not(._footer) .toolbar-right');\n    var fsBtn = document.querySelector('#fullscreen-toggle-btn');\n    if (!floating || !toolbarRight || !fsBtn) return;\n    if (floating.parentNode === toolbarRight) return;\n    toolbarRight.insertBefore(floating, fsBtn.nextSibling);\n  }\n\n  function wireCreateOptions(root) {\n    // Auto-open the studio the moment the Create tab becomes active. On\n    // mobile, also immediately lift it to fullscreen so the user lands\n    // directly in the studio experience \u2014 the legacy \"Give it a little\n    // more room?\" splash is gone. The fabric canvas is preserved across\n    // tab switches so coming back resumes where they left off.\n    root.addEventListener('dtfut:tab-change', function (e) {\n      if (e.detail && e.detail.name !== 'create') return;\n\n      // Set the mobile zoom target BEFORE openDesignStudio runs so the\n      // monkey-patched fitCanvasToArea (in installMobileFitOverride)\n      // already short-circuits to 38% on its first invocation.\n      if (isMobileViewport()) {\n        window.__dtfMobileZoomTarget = 38;\n        if (typeof window.setStudioZoom === 'function') {\n          try { window.setStudioZoom(38); } catch (_) {}\n        }\n      }\n\n      var overlay = document.querySelector('.customTabelPopup__overlay-editor');\n      var alreadyOpen = overlay && overlay.classList.contains('studio-inline') && overlay.offsetParent;\n      if (!alreadyOpen) openDesignStudio('blank');\n\n      if (isMobileViewport()) {\n        // Trigger fullscreen synchronously in the SAME tick as\n        // openDesignStudio so the browser never paints the inline state.\n        var ov = document.querySelector('.customTabelPopup__overlay-editor');\n        var btn = document.getElementById('fullscreen-toggle-btn');\n        if (ov && btn && ov.classList.contains('studio-inline')) {\n          btn.click();\n        }\n        // alignFloatingPillInTopBar still defers \u2014 it depends on fabric's\n        // resize handler running, which DOES yield to the event loop.\n        setTimeout(alignFloatingPillInTopBar, 200);\n      }\n    });\n\n    root.addEventListener('click', function (e) {\n      var trigger = e.target.closest('[data-dtfut-create]');\n      if (!trigger) return;\n      e.preventDefault();\n      openDesignStudio(trigger.getAttribute('data-dtfut-create'));\n    });\n\n    // Mobile-only: clicking the X (fullscreen toggle while in fullscreen)\n    // should close the studio AND switch back to the Upload tab. The fabric\n    // canvas state stays intact (just hidden under the upload panel) so\n    // re-entering Design Studio resumes where they left off.\n    document.addEventListener('click', function (e) {\n      if (!e.target || !e.target.closest) return;\n      var btn = e.target.closest('#fullscreen-toggle-btn');\n      if (!btn) return;\n      if (!isMobileViewport()) return;\n      var overlay = document.querySelector('.customTabelPopup__overlay-editor');\n      if (!overlay) return;\n      // Only intercept when currently fullscreen (no studio-inline class).\n      if (overlay.classList.contains('studio-inline')) return;\n      // Let the existing toggle handler run first (it returns the studio to\n      // inline mode); on the next tick, activate the Upload tab in dtfut.\n      setTimeout(function () {\n        var uploadTab = root.querySelector('[data-dtfut-tab=\"upload\"]');\n        if (uploadTab) uploadTab.click();\n      }, 50);\n    }, false);\n  }\n\n  /* ---------------- Tab 2: images-per-row picker ---------------- */\n  function wireColsPicker(root) {\n    var panel = root.querySelector('.dtfut__panel[data-dtfut-panel=\"recent\"]');\n    if (!panel) return;\n    var isMobile = window.matchMedia && window.matchMedia('(max-width: 749px)').matches;\n    var initialCols = isMobile ? '2' : '4';\n    panel.setAttribute('data-cols', initialCols);\n    syncActiveCol(panel, initialCols);\n    var mobileCols = panel.querySelector('.dtfut__cols--mobile');\n    var filtersRow = panel.querySelector('.md-filters__row');\n    if (mobileCols && filtersRow && !filtersRow.contains(mobileCols)) {\n      filtersRow.appendChild(mobileCols);\n    }\n    panel.addEventListener('click', function (e) {\n      var btn = e.target.closest('.dtfut__cols-btn');\n      if (!btn) return;\n      var cols = btn.getAttribute('data-dtfut-cols');\n      if (!cols) return;\n      panel.setAttribute('data-cols', cols);\n      syncActiveCol(panel, cols);\n    });\n  }\n\n  /* ---------------- Tab 2: search no-results state ----------------\n     The shared my-designs-panel always renders upload-tile HTML in\n     non-archive views, so its native .md-empty never fires in picker\n     mode. Observe the grid's children + search input and toggle\n     data-dtfut-empty-search on the panel; CSS shows .dtfut__no-results\n     when the attribute is \"true\". */\n  function wireNoResults(root) {\n    var panel = root.querySelector('.dtfut__panel[data-dtfut-panel=\"recent\"]');\n    if (!panel) return;\n    var search = panel.querySelector('.md-search-input');\n    var grid = panel.querySelector('.md-grid');\n    if (!search || !grid) return;\n\n    function refresh() {\n      var hasQuery = search.value.trim().length > 0;\n      var hasCard = grid.querySelector('.md-card') !== null;\n      panel.setAttribute('data-dtfut-empty-search', (hasQuery && !hasCard) ? 'true' : 'false');\n    }\n\n    search.addEventListener('input', refresh);\n    var mo = new MutationObserver(refresh);\n    mo.observe(grid, { childList: true });\n    refresh();\n  }\n  function syncActiveCol(panel, cols) {\n    panel.querySelectorAll('.dtfut__cols-btn').forEach(function (b) {\n      b.classList.toggle('is-active', b.getAttribute('data-dtfut-cols') === cols);\n    });\n  }\n\n  /* ---------------- Tab 2: hide tab when logged-in customer has 0 designs ----\n     Logged-out customers see the login CTA inside the panel \u2014 keep the tab.\n     Logged-in customers with zero designs after load \u2192 hide the tab so the\n     row only shows what's actionable. If the recent tab was active when it\n     gets hidden, fall back to the Upload tab. */\n  function wireRecentTabVisibility(root) {\n    var tabBtn = root.querySelector('[data-dtfut-tab=\"recent\"]');\n    var panel = root.querySelector('.dtfut__panel[data-dtfut-panel=\"recent\"]');\n    if (!tabBtn || !panel) return;\n    var grid = panel.querySelector('.md-grid');\n    if (!grid) return; // logged-out path: panel has login CTA, no grid\n\n    var refreshRaf = 0;\n    var lastShouldHide = null;\n    function scheduleRefresh() {\n      if (refreshRaf) return;\n      refreshRaf = requestAnimationFrame(function () {\n        refreshRaf = 0;\n        refresh();\n      });\n    }\n\n    function loadingVisible() {\n      var loading = panel.querySelector('.md-loading');\n      if (!loading) return false;\n      var cs = getComputedStyle(loading);\n      if (cs.display === 'none' || cs.visibility === 'hidden') return false;\n      var inline = (loading.getAttribute('style') || '').toLowerCase();\n      if (inline.indexOf('display:none') !== -1 || inline.indexOf('display: none') !== -1) return false;\n      return true;\n    }\n\n    function refresh() {\n      if (loadingVisible()) return;\n      var search = panel.querySelector('.md-search-input');\n      if (search && search.value.trim().length > 0) return; // search-filtered, not truly empty\n      // The grid is now deferred \u2014 cards aren't built until the tab opens \u2014\n      // so a `.md-card` query is unreliable for visibility. Prefer the\n      // `data-md-has-designs` flag published by my-designs-panel.liquid\n      // (set after the eager data fetch), and only fall back to the DOM\n      // query when the flag hasn't been set yet.\n      var __mdFlag = document.body.getAttribute('data-md-has-designs');\n      var hasCards = __mdFlag !== null ? (__mdFlag === '1') : (grid.querySelector('.md-card') !== null);\n      var shouldHide = !hasCards;\n      if (shouldHide === lastShouldHide) return;\n      lastShouldHide = shouldHide;\n      var currentlyHidden = tabBtn.style.display === 'none';\n      // Hide / restore all `.access_old_data` (\"Choose a previously\n      // uploaded design\") links \u2014 same empty-state condition applies on\n      // the legacy PDP, where this link lives outside the tab strip.\n      // Scoped to logged-in customers only; logged-out renders a Login\n      // CTA inside .access_old_data, which should always be visible.\n      var aods = document.querySelectorAll('.access_old_data');\n      for (var i = 0; i < aods.length; i++) {\n        var aod = aods[i];\n        var isLoginCta = aod.querySelector('.basic_link, .basic__link') !== null;\n        if (isLoginCta) continue;\n        // `!important` is needed to beat the existing rule\n        // `.dtfut .secondDropZone .access_old_data { display: block !important; }`.\n        // Use `visibility: hidden` so the link's vertical space is\n        // preserved (the upload card layout below stays put). The CSS\n        // rule `.dtfut .secondDropZone .access_old_data { display: block\n        // !important; }` already keeps the box laid out on v2; this just\n        // makes the box invisible. On the legacy PDP this also reserves\n        // the space below the upload area so nothing shifts up.\n        if (shouldHide) {\n          aod.style.setProperty('visibility', 'hidden', 'important');\n        } else {\n          aod.style.removeProperty('visibility');\n        }\n      }\n      if (shouldHide === currentlyHidden) return;\n      // The base CSS sets `display: inline-flex` on .dtfut__tab, which\n      // overrides the HTML `hidden` attribute. Use inline display:none to\n      // force visibility off; clear it to restore.\n      tabBtn.style.display = shouldHide ? 'none' : '';\n      tabBtn.hidden = shouldHide;\n      if (shouldHide && tabBtn.classList.contains('is-active')) {\n        activateTab(root, 'upload');\n      }\n    }\n\n    // Observe the grid for card add/remove\n    new MutationObserver(scheduleRefresh).observe(grid, { childList: true });\n    // Observe the loading element for any state change\n    var loadingEl = panel.querySelector('.md-loading');\n    if (loadingEl) {\n      new MutationObserver(scheduleRefresh).observe(loadingEl, { attributes: true, attributeFilter: ['style', 'class', 'hidden'] });\n    }\n    // Observe md-empty visibility (shown when zero designs after load completes)\n    var emptyEl = panel.querySelector('.md-empty');\n    if (emptyEl) {\n      new MutationObserver(scheduleRefresh).observe(emptyEl, { attributes: true, attributeFilter: ['style', 'class', 'hidden'] });\n    }\n    // Observe the panel itself for descendant additions (in case loading/empty get re-rendered)\n    new MutationObserver(scheduleRefresh).observe(panel, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class', 'hidden'] });\n    // With the grid deferred, card mutations no longer signal \"designs\n    // exist\". Re-evaluate visibility when the design count is published.\n    window.addEventListener('nt-md-count', scheduleRefresh);\n\n    refresh();\n    // Initial polling fallback \u2014 catches any state change in the first 30s\n    // regardless of how the my-designs JS chooses to signal load completion.\n    var poll = 0;\n    var pollIv = setInterval(function () {\n      poll++;\n      scheduleRefresh();\n      if (poll >= 30) clearInterval(pollIv);\n    }, 1000);\n  }\n\n  /* ---------------- Tab 3: AI hero ----------------\n     The chat UI markup + JS for Tab 3 (\"Create with AI\") lives in\n     assets/ai-chat-sandbox.js. This file only retains the fetch patching\n     at the top (cap getGenerativeAiUploads to 3, short-circuit the\n     batch-generate POST when canned existed) so that whichever code drives\n     the dialog form (legacy or the sandbox) gets the same behaviour. */\n\n  /* ---------------- Move .promo below tabs wrapper ---------------- */\n  /* The \"Buy 5 Blanks = Get 10 FREE Transfers\" block is a custom_liquid\n     template block; its own script moves it beside .generative-ai-area,\n     which puts it inside Tab 3 (Create with AI). We want it as a\n     sibling immediately AFTER the .dtfut tabs wrapper so it sits\n     between the upload box and the price calculator \u2014 outside the\n     blue container. Set p.__moved = true so the template script\n     leaves it alone, and drop the .promo--between class so its\n     \"between\" CSS doesn't apply. */\n  function placePromo(root) {\n    if (!root.parentNode) return false;\n\n    function attach() {\n      var promo = document.querySelector('.promo');\n      if (!promo) return false;\n      if (promo.__dtfutPlaced && promo.previousElementSibling === root) return true;\n      promo.classList.remove('promo--between');\n      promo.classList.add('dtfut-promo');\n      promo.__moved = true;\n      promo.__dtfutPlaced = true;\n      root.parentNode.insertBefore(promo, root.nextSibling);\n      return true;\n    }\n\n    if (attach()) return true;\n\n    var mo = new MutationObserver(function () {\n      if (attach()) mo.disconnect();\n    });\n    mo.observe(document.body, { childList: true, subtree: true });\n    setTimeout(attach, 600);\n    setTimeout(attach, 2000);\n    return false;\n  }\n\n  /* ---------------- Post-upload state observer ---------------- */\n  /* Signals that mean \"upload is done, show the order form\":\n       Legacy (non-multiupload) \u2014 #uploadArea gets `.hidden` class.\n       Multiupload (b.enableSettings) \u2014 <master-upload> inside\n         <upload-controls> gets `.hidden`; post-upload form lives\n         inside <upload-controls><next-element>.\n       Legacy .fileupload_custom \u2014 display toggled to block.\n     Any of those \u2192 add `.is-upload-active` on root so the CSS\n     strips the tab strip + panel chrome and the form renders\n     clean, exactly like the pre-tabs layout. */\n  function wireUploadStateObserver(root) {\n    var syncRaf = 0;\n    var lastActive = null;\n\n    var _elLegacy = null;\n    var _elMaster = null;\n    var _elNext = null;\n    var _elFile = null;\n\n    function sync() {\n      if (!_elLegacy) _elLegacy = document.getElementById('uploadArea');\n      if (!_elMaster) _elMaster = document.querySelector('upload-controls master-upload');\n      if (!_elNext) _elNext = document.querySelector('upload-controls next-element');\n      if (!_elFile) _elFile = document.querySelector('.fileupload_custom');\n\n      var legacyHidden = _elLegacy && _elLegacy.classList.contains('hidden');\n      var masterHidden = _elMaster && _elMaster.classList.contains('hidden');\n      var nextShown = _elNext && !_elNext.classList.contains('hidden');\n      var fileOpen = _elFile && _elFile.style.display === 'block';\n      if (fileOpen && window.__ensureBoxiconsCss) window.__ensureBoxiconsCss();\n\n      var active = !!(legacyHidden || masterHidden || nextShown || fileOpen);\n      if (active === lastActive) return;\n      lastActive = active;\n      root.classList.toggle('is-upload-active', active);\n    }\n\n    function scheduleSync() {\n      if (syncRaf) return;\n      syncRaf = requestAnimationFrame(function () {\n        syncRaf = 0;\n        sync();\n      });\n    }\n\n    sync();\n\n    var observed = [];\n    function watch(selector, filter) {\n      var el = typeof selector === 'string' ? document.querySelector(selector) : selector;\n      if (!el || observed.indexOf(el) > -1) return;\n      observed.push(el);\n      var mo = new MutationObserver(scheduleSync);\n      mo.observe(el, { attributes: true, attributeFilter: filter || ['class'] });\n    }\n\n    watch('#uploadArea', ['class']);\n    watch('upload-controls master-upload', ['class']);\n    watch('upload-controls next-element', ['class']);\n    watch('.fileupload_custom', ['class', 'style']);\n\n    var controls = document.querySelector('upload-controls');\n    if (controls) {\n      var mo = new MutationObserver(scheduleSync);\n      mo.observe(controls, { attributes: true, attributeFilter: ['current', 'class'] });\n    }\n\n    var bodyObserver = new MutationObserver(function () {\n      watch('#uploadArea', ['class']);\n      watch('upload-controls master-upload', ['class']);\n      watch('upload-controls next-element', ['class']);\n      watch('.fileupload_custom', ['class', 'style']);\n      if (observed.length >= 4) bodyObserver.disconnect();\n      scheduleSync();\n    });\n    bodyObserver.observe(document.body, { childList: true, subtree: true });\n\n    setTimeout(function () { bodyObserver.disconnect(); }, 5000);\n\n    document.addEventListener('md-picker:use-designs', function () { setTimeout(scheduleSync, 300); });\n    document.addEventListener('change', function (e) {\n      if (e.target && e.target.id === 'fileInput') setTimeout(scheduleSync, 300);\n    });\n  }\n\n  /* ---------------- AI prompt guide overlay ---------------- */\n  /* The inline AI tab hides #generative-ai-tips (Example Prompt / Output).\n     Clicking \"AI prompt guide\" clones that content into an overlay that\n     covers the Ninja AI Image Creator view within the tab. */\n  function openAiGuide(root) {\n    var host = root || document.querySelector('.dtfut__ai-host');\n    var overlay = host && host.querySelector('[data-dtfut-ai-guide]');\n    var body = overlay && overlay.querySelector('[data-dtfut-ai-guide-body]');\n    var tips = document.getElementById('generative-ai-tips');\n    if (!overlay || !body || !tips) return;\n    body.innerHTML = '';\n    var clone = tips.cloneNode(true);\n    clone.removeAttribute('id');\n    clone.style.display = 'block';\n    body.appendChild(clone);\n    overlay.hidden = false;\n    overlay.classList.add('is-open');\n  }\n  function closeAiGuide(overlay) {\n    var overlays = overlay ? [overlay] : document.querySelectorAll('[data-dtfut-ai-guide]');\n    overlays.forEach(function (o) {\n      o.classList.remove('is-open');\n      o.hidden = true;\n    });\n  }\n  function wireAiGuide() {\n    if (document.__dtfutAiGuideWired) return;\n    document.__dtfutAiGuideWired = true;\n    document.addEventListener('click', function (e) {\n      var opener = e.target.closest('[data-dtfut-ai-guide-open]');\n      if (opener) {\n        e.preventDefault();\n        var host = opener.closest('.dtfut__ai-host');\n        openAiGuide(host);\n        return;\n      }\n      var closer = e.target.closest('[data-dtfut-ai-guide-close]');\n      if (closer) {\n        e.preventDefault();\n        closeAiGuide(closer.closest('[data-dtfut-ai-guide]'));\n        return;\n      }\n    });\n  }\n\n  /* ---------------- AI search: hide recent-search dropdown on submit ---------------- */\n  /* The AI dialog's input shows a \"Recent Searches\" menu when focused;\n     it's supposed to hide on blur, but clicking Generate keeps focus on\n     the input (or hides too slowly) so the dropdown overlaps the results.\n     Force-close it on submit and whenever Generate is clicked. */\n  function wireAiSearchMenuClose() {\n    if (document.__dtfutAiMenuWired) return;\n    document.__dtfutAiMenuWired = true;\n\n    function closeMenu() {\n      var menu = document.getElementById('AISearchMenu');\n      var input = document.getElementById('AISearchInput');\n      if (menu) menu.classList.remove('active');\n      if (input && typeof input.blur === 'function') input.blur();\n    }\n\n    document.addEventListener('submit', function (e) {\n      var form = e.target;\n      if (form && form.closest && form.closest('#generative-ai-dialog')) {\n        closeMenu();\n      }\n    }, true);\n\n    document.addEventListener('click', function (e) {\n      var btn = e.target && e.target.closest && e.target.closest('#generative-ai-dialog form button[type=\"submit\"]');\n      if (btn) closeMenu();\n    });\n  }\n\n  /* ---------------- Responsive collapse ----------------\n     The desktop layout puts the \"Upload Your Artwork\" title to the\n     left of the four tabs on a single row. Once the row can't fit\n     (any collision), drop into a stacked layout: title above, tabs\n     below with icons stacked over labels. If the stacked tabs row\n     still can't fit the full labels, shorten them (\"Previous Designs\"\n     \u2192 \"Previous\", \"Create with AI\" \u2192 \"AI\", \"Design Studio\" \u2192 \"Studio\").\n\n     Container-driven via ResizeObserver \u2014 the tabs sit in a product\n     column whose width depends on the page layout, not just viewport. */\n  function wireResponsiveTabs(root) {\n    var header = root.querySelector('.dtfut__header');\n    var tabsEl = root.querySelector('.dtfut__tabs');\n    var titleEl = root.querySelector('.dtfut__header-title');\n    if (!header || !tabsEl) return;\n\n    function sumNaturalTabsWidth(tabsList, gapPx) {\n      var total = 0;\n      for (var i = 0; i < tabsList.length; i++) {\n        // scrollWidth on each tab is reliable because the labels\n        // have `white-space: nowrap`, so tab.scrollWidth == content width\n        // including padding, regardless of flex-shrink on the parent.\n        total += tabsList[i].scrollWidth;\n      }\n      if (tabsList.length > 1) total += (tabsList.length - 1) * gapPx;\n      return total;\n    }\n\n    // Measure the widest possible title text via an offscreen span. The title\n    // text swaps per active tab (\"Upload Your Artwork\" \u2192 \"Describe It, We'll\n    // Design It\" etc.); using `titleEl.scrollWidth` directly would shift the\n    // collision threshold whenever the user switched tabs, causing the row\n    // layout to flip into compact mode mid-interaction. Using the longest\n    // possible title fixes the threshold so the layout is stable.\n    function measureLongestTitleWidth() {\n      if (!titleEl) return 0;\n      var titles = [];\n      var titled = root.querySelectorAll('[data-dtfut-title-text]');\n      for (var i = 0; i < titled.length; i++) {\n        var t = titled[i].getAttribute('data-dtfut-title-text');\n        if (t) titles.push(t);\n      }\n      if (titles.length === 0) titles.push(titleEl.textContent || '');\n\n      var measurer = document.createElement('span');\n      var cs = getComputedStyle(titleEl);\n      measurer.style.position = 'absolute';\n      measurer.style.left = '-9999px';\n      measurer.style.top = '0';\n      measurer.style.visibility = 'hidden';\n      measurer.style.whiteSpace = 'nowrap';\n      measurer.style.fontFamily = cs.fontFamily;\n      measurer.style.fontSize = cs.fontSize;\n      measurer.style.fontWeight = cs.fontWeight;\n      measurer.style.fontStyle = cs.fontStyle;\n      measurer.style.letterSpacing = cs.letterSpacing;\n      measurer.style.textTransform = cs.textTransform;\n      document.body.appendChild(measurer);\n\n      var maxW = 0;\n      for (var j = 0; j < titles.length; j++) {\n        measurer.textContent = titles[j];\n        var w = measurer.getBoundingClientRect().width;\n        if (w > maxW) maxW = w;\n      }\n      document.body.removeChild(measurer);\n      return maxW;\n    }\n\n    var raf = 0;\n    var lastRootWidth = -1;\n    // Cache the longest title's natural width: it depends only on text +\n    // font, neither of which changes on resize. measureLongestTitleWidth()\n    // forces a reflow per call, so caching it removes that cost from every\n    // resize-driven recompute(). Invalidated on font-load (see fonts.ready).\n    var cachedTitleNatural = -1;\n    function recompute() {\n      raf = 0;\n      var w = root.offsetWidth;\n      if (w === lastRootWidth) return;\n      lastRootWidth = w;\n\n      // Reset to row layout to measure natural widths.\n      root.classList.remove('is-compact', 'is-narrow');\n      void header.offsetWidth; // force reflow\n\n      var tabs = tabsEl.querySelectorAll('.dtfut__tab');\n      var tabsCs = getComputedStyle(tabsEl);\n      var tabsGap = parseFloat(tabsCs.columnGap || tabsCs.gap || '0') || 0;\n      var headerCs = getComputedStyle(header);\n      var headerGap = parseFloat(headerCs.columnGap || headerCs.gap || '0') || 0;\n      var padX = (parseFloat(headerCs.paddingLeft) || 0) + (parseFloat(headerCs.paddingRight) || 0);\n      var avail = header.clientWidth - padX;\n\n      var titleNatural = cachedTitleNatural >= 0\n        ? cachedTitleNatural\n        : (cachedTitleNatural = measureLongestTitleWidth());\n      var tabsNatural = sumNaturalTabsWidth(tabs, tabsGap);\n      var rowNatural = titleNatural + headerGap + tabsNatural;\n\n      // Buffer (px) so we switch to compact slightly before an actual\n      // edge-touch collision \u2014 anything closer feels cramped visually.\n      var BUFFER = 16;\n\n      if (rowNatural + BUFFER > avail) {\n        root.classList.add('is-compact');\n        void tabsEl.offsetWidth; // reflow under new flex-direction\n\n        // In compact mode, each tab's scrollWidth becomes the wider of\n        // its icon vs label (column flex-direction). If the sum still\n        // can't fit the tabs strip's full width, swap to short labels.\n        var stackedNatural = sumNaturalTabsWidth(tabs, tabsGap);\n        if (stackedNatural > tabsEl.clientWidth - 1) {\n          root.classList.add('is-narrow');\n        }\n      }\n\n      // Mark as measured so the no-JS @media fallback steps aside.\n      root.classList.add('is-measured');\n    }\n\n    function schedule() {\n      if (raf) return;\n      raf = requestAnimationFrame(recompute);\n    }\n\n    if (typeof ResizeObserver === 'function') {\n      var ro = new ResizeObserver(schedule);\n      ro.observe(root);\n    } else {\n      window.addEventListener('resize', schedule);\n    }\n\n    if (document.fonts && document.fonts.ready && document.fonts.ready.then) {\n      document.fonts.ready.then(function () {\n        // Font swap can change glyph metrics \u2192 recompute the cached title\n        // width once fonts are ready. Reset both caches and re-measure.\n        cachedTitleNatural = -1;\n        lastRootWidth = -1;\n        schedule();\n      }).catch(function () {});\n    }\n\n    schedule();\n  }\n\n  /* ---------------- Init ---------------- */\n  function init(root) {\n    if (root.__dtfutInit) return;\n    root.__dtfutInit = true;\n\n    wireTabs(root);\n    wireDropForward(root);\n    wireSources(root);\n    wireCreateOptions(root);\n    wireColsPicker(root);\n    wireNoResults(root);\n    wireRecentTabVisibility(root);\n    placePromo(root);\n    wireUploadStateObserver(root);\n    wireAiSearchMenuClose();\n    wireAiGuide();\n    wireResponsiveTabs(root);\n  }\n\n  /* ---------------- Standalone access_old_data visibility ----------------\n     The legacy PDP (/products/dtf-transfers, template multiupload_vividpopular)\n     renders the my-designs grid + `.access_old_data` \"Choose a previously\n     uploaded design\" link but does NOT render the `.dtfut` tabs wrapper.\n     init() only fires for [data-dtfut] roots, so the empty-state hide\n     wouldn't run there. This bootstrap is page-wide: if `.md-grid` and any\n     `.access_old_data` exist, observe + poll just like wireRecentTabVisibility\n     and toggle the link visibility. */\n  function wireAccessOldDataGlobal() {\n    if (document.__dtfutAodWired) return;\n    var grid = document.querySelector('.md-grid');\n    var aods = document.querySelectorAll('.access_old_data');\n    if (!grid || aods.length === 0) return;\n    document.__dtfutAodWired = true;\n\n    var loading = grid.parentElement && grid.parentElement.querySelector('.md-loading');\n\n    var refreshRaf = 0;\n    var lastShouldHide = null;\n    function scheduleRefresh() {\n      if (refreshRaf) return;\n      refreshRaf = requestAnimationFrame(function () {\n        refreshRaf = 0;\n        refresh();\n      });\n    }\n\n    function loadingVisible() {\n      if (!loading) return false;\n      var cs = getComputedStyle(loading);\n      if (cs.display === 'none' || cs.visibility === 'hidden') return false;\n      var inline = (loading.getAttribute('style') || '').toLowerCase();\n      if (inline.indexOf('display:none') !== -1 || inline.indexOf('display: none') !== -1) return false;\n      return true;\n    }\n\n    function refresh() {\n      if (loadingVisible()) return;\n      // Deferred grid: prefer the published design-count flag over a DOM\n      // card query (cards aren't built until the Recent tab opens).\n      var __mdFlag = document.body.getAttribute('data-md-has-designs');\n      var hasCards = __mdFlag !== null ? (__mdFlag === '1') : (grid.querySelector('.md-card') !== null);\n      var shouldHide = !hasCards;\n      if (shouldHide === lastShouldHide) return;\n      lastShouldHide = shouldHide;\n      var nodes = document.querySelectorAll('.access_old_data');\n      for (var i = 0; i < nodes.length; i++) {\n        var aod = nodes[i];\n        var isLoginCta = aod.querySelector('.basic_link, .basic__link') !== null;\n        if (isLoginCta) continue;\n        // Use `visibility: hidden` so the link's vertical space is\n        // preserved (the upload card layout below stays put). The CSS\n        // rule `.dtfut .secondDropZone .access_old_data { display: block\n        // !important; }` already keeps the box laid out on v2; this just\n        // makes the box invisible. On the legacy PDP this also reserves\n        // the space below the upload area so nothing shifts up.\n        if (shouldHide) {\n          aod.style.setProperty('visibility', 'hidden', 'important');\n        } else {\n          aod.style.removeProperty('visibility');\n        }\n      }\n    }\n\n    new MutationObserver(scheduleRefresh).observe(grid, { childList: true });\n    if (loading) {\n      new MutationObserver(scheduleRefresh).observe(loading, { attributes: true, attributeFilter: ['style', 'class', 'hidden'] });\n    }\n    // Re-evaluate when the deferred design count is published (card\n    // mutations alone no longer fire, since the grid build is deferred).\n    window.addEventListener('nt-md-count', scheduleRefresh);\n    refresh();\n    var poll = 0;\n    var pollIv = setInterval(function () {\n      poll++;\n      scheduleRefresh();\n      if (poll >= 30) clearInterval(pollIv);\n    }, 1000);\n  }\n\n  function bootAll() {\n    document.querySelectorAll('[data-dtfut]').forEach(init);\n    wireAccessOldDataGlobal();\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', bootAll);\n  } else {\n    bootAll();\n  }\n\n  // Shopify theme editor re-render\n  document.addEventListener('shopify:section:load', bootAll);\n  document.addEventListener('shopify:block:select', bootAll);\n})();\n"],
  "mappings": "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",
  "names": ["mo"]
}
