{
  "version": 3,
  "sources": ["/cdn/shop/t/12/assets/ai-design-library.js"],
  "sourcesContent": ["/**\n * AI Design Library \u2014 shared localStorage layer used by both the designer\n * page (ai-designer.js) and the gallery page (my-designs.js).\n *\n * Storage shape (under key \"ai_design_library_v1\"):\n *   { version: 1, designs: [\n *       { id, prompt, draftUrl, thumbnail, createdAt, lastUsedAt }\n *   ] }\n *\n *   - id          \u2014 uuid string\n *   - prompt      \u2014 what the customer typed\n *   - draftUrl    \u2014 R2 URL of the 1024 draft PNG\n *   - thumbnail   \u2014 small (~10\u201320 KB) base64 JPEG used in the gallery\n *   - createdAt   \u2014 ms epoch when generated\n *   - lastUsedAt  \u2014 ms epoch when last downloaded / used (for sorting later)\n *\n * Cap: 30 designs. When over cap, oldest by createdAt is dropped first.\n */\n(function (global) {\n  // Guard against double-load. This script is referenced from multiple\n  // liquid snippets (sections + ai-design-attach + ai-promo-meta) so the\n  // IIFE evaluates twice on pages that include more than one of them. A\n  // second eval would replace global.AIDesignLibrary with a fresh closure\n  // \u2014 wiping any state already set (worker URL, magic-link bind, etc.)\n  // and causing later cloud calls to silently no-op.\n  if (global.AIDesignLibrary && global.AIDesignLibrary._v >= 2) return;\n\n  const STORAGE_KEY = \"ai_design_library_v1\";\n  const MAX_DESIGNS = 30;\n\n  // ============= Cloud sync \u2014 keys + config =============\n  // The cloud layer optionally backs the local library with a server-side copy\n  // tied to a customer's email address. Once the customer hands over their\n  // email, we get a magic-link token; that token lets us push/pull designs\n  // to /api/library/* on the Worker.\n  const TOKEN_KEY = \"ai_library_token\";        // string \u2014 magic-link token\n  const EMAIL_KEY = \"ai_library_email\";        // string \u2014 last bound email (display only)\n  const BANNER_KEY = \"ai_library_banner_state\"; // \"dismissed\" | \"subscribed\"\n  const SYNCED_KEY = \"ai_library_synced_ids\";  // JSON Set of design IDs already pushed\n  // Worker URL is resolved lazily on first use. ai-designer.js or any page\n  // that includes the library can call AIDesignLibrary.cloud.setWorkerUrl().\n  let cloudWorkerUrl = \"\";\n\n  function read() {\n    try {\n      const raw = localStorage.getItem(STORAGE_KEY);\n      if (!raw) return { version: 1, designs: [] };\n      const parsed = JSON.parse(raw);\n      if (!parsed || !Array.isArray(parsed.designs)) {\n        return { version: 1, designs: [] };\n      }\n      return parsed;\n    } catch (e) {\n      console.warn(\"AIDesignLibrary read failed\", e);\n      return { version: 1, designs: [] };\n    }\n  }\n\n  function write(state) {\n    try {\n      localStorage.setItem(STORAGE_KEY, JSON.stringify(state));\n      return true;\n    } catch (e) {\n      // QuotaExceededError \u2014 typically when localStorage is full.\n      // Try evicting half the designs and retry once.\n      console.warn(\"AIDesignLibrary write failed, attempting eviction\", e);\n      if (state.designs.length > 1) {\n        state.designs = state.designs.slice(0, Math.floor(state.designs.length / 2));\n        try {\n          localStorage.setItem(STORAGE_KEY, JSON.stringify(state));\n          return true;\n        } catch (_) {\n          return false;\n        }\n      }\n      return false;\n    }\n  }\n\n  function uuid() {\n    if (global.crypto && global.crypto.randomUUID) return global.crypto.randomUUID();\n    // Fallback for older browsers.\n    return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function (c) {\n      const r = (Math.random() * 16) | 0;\n      const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n      return v.toString(16);\n    });\n  }\n\n  function list() {\n    return read().designs.slice().sort(function (a, b) {\n      return (b.createdAt || 0) - (a.createdAt || 0);\n    });\n  }\n\n  function get(id) {\n    return read().designs.find(function (d) { return d.id === id; }) || null;\n  }\n\n  function save(input) {\n    const state = read();\n    const now = Date.now();\n    const design = {\n      id: uuid(),\n      prompt: String(input.prompt || \"\"),\n      draftUrl: String(input.draftUrl || \"\"),\n      thumbnail: input.thumbnail ? String(input.thumbnail) : \"\",\n      createdAt: now,\n      lastUsedAt: now,\n    };\n    state.designs.push(design);\n    // Cap by oldest createdAt\n    if (state.designs.length > MAX_DESIGNS) {\n      state.designs.sort(function (a, b) { return (b.createdAt || 0) - (a.createdAt || 0); });\n      state.designs = state.designs.slice(0, MAX_DESIGNS);\n    }\n    write(state);\n    // Mirror to cloud if signed in. Fire-and-forget; network failures don't\n    // break local saving \u2014 the next sync pass will pick it up.\n    if (cloudGetToken()) {\n      cloudAppend(design).catch(function (e) {\n        console.warn(\"AIDesignLibrary cloud append failed\", e);\n      });\n    }\n    return design;\n  }\n\n  function remove(id) {\n    const state = read();\n    const idx = state.designs.findIndex(function (d) { return d.id === id; });\n    if (idx === -1) return false;\n    state.designs.splice(idx, 1);\n    write(state);\n    return true;\n  }\n\n  function touch(id) {\n    const state = read();\n    const design = state.designs.find(function (d) { return d.id === id; });\n    if (!design) return false;\n    design.lastUsedAt = Date.now();\n    write(state);\n    return true;\n  }\n\n  function clear() {\n    try {\n      localStorage.removeItem(STORAGE_KEY);\n      return true;\n    } catch (_) {\n      return false;\n    }\n  }\n\n  // ============= Cloud sync \u2014 implementation =============\n  function cloudSetWorkerUrl(url) {\n    if (typeof url === \"string\" && url) cloudWorkerUrl = url.replace(/\\/$/, \"\");\n  }\n  function cloudGetWorkerUrl() {\n    return cloudWorkerUrl;\n  }\n  function cloudGetToken() {\n    try { return localStorage.getItem(TOKEN_KEY) || \"\"; } catch (_) { return \"\"; }\n  }\n  function cloudGetEmail() {\n    try { return localStorage.getItem(EMAIL_KEY) || \"\"; } catch (_) { return \"\"; }\n  }\n  function cloudIsSignedIn() {\n    return !!cloudGetToken();\n  }\n  function cloudBind(email, token) {\n    try {\n      if (token) localStorage.setItem(TOKEN_KEY, String(token));\n      if (email) localStorage.setItem(EMAIL_KEY, String(email).toLowerCase());\n    } catch (_) {}\n  }\n  function cloudSignOut() {\n    try {\n      localStorage.removeItem(TOKEN_KEY);\n      localStorage.removeItem(EMAIL_KEY);\n      localStorage.removeItem(SYNCED_KEY);\n    } catch (_) {}\n  }\n\n  function readSyncedIds() {\n    try {\n      const raw = localStorage.getItem(SYNCED_KEY);\n      if (!raw) return {};\n      const parsed = JSON.parse(raw);\n      return parsed && typeof parsed === \"object\" ? parsed : {};\n    } catch (_) { return {}; }\n  }\n  function writeSyncedIds(map) {\n    try { localStorage.setItem(SYNCED_KEY, JSON.stringify(map)); } catch (_) {}\n  }\n  function markSynced(id) {\n    if (!id) return;\n    const m = readSyncedIds();\n    m[id] = 1;\n    writeSyncedIds(m);\n  }\n\n  /**\n   * First-time email capture. Sends the current local library + the email\n   * to the worker. Worker mints a token, fires Klaviyo email, returns token.\n   * We store the token + email locally and remember which IDs were uploaded.\n   */\n  async function cloudSave(email) {\n    if (!cloudWorkerUrl) throw new Error(\"Cloud library not configured.\");\n    const designs = list().map(function (d) {\n      return {\n        id: d.id,\n        draftUrl: d.draftUrl,\n        prompt: d.prompt || \"\",\n        thumbnail: d.thumbnail || \"\",\n        createdAt: d.createdAt || Date.now(),\n        lastUsedAt: d.lastUsedAt || d.createdAt || Date.now(),\n      };\n    });\n    const resp = await fetch(cloudWorkerUrl + \"/api/library/save\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify({ email: email, designs: designs }),\n    });\n    let payload = null;\n    try { payload = await resp.json(); } catch (_) { payload = null; }\n    if (!resp.ok || !payload || !payload.ok) {\n      const msg = (payload && payload.error) || (\"Save failed (\" + resp.status + \")\");\n      throw new Error(msg);\n    }\n    cloudBind(email, payload.token || \"\");\n    // Mark every uploaded design as already-synced so the next append pass\n    // doesn't re-push them.\n    designs.forEach(function (d) { markSynced(d.id); });\n    return payload; // { ok, designCount, emailed, token }\n  }\n\n  /** Append a single newly-created design to the cloud library. */\n  async function cloudAppend(design) {\n    if (!cloudWorkerUrl) return null;\n    const token = cloudGetToken();\n    if (!token) return null;\n    const synced = readSyncedIds();\n    if (synced[design.id]) return null; // already pushed\n    const resp = await fetch(cloudWorkerUrl + \"/api/library/append\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify({\n        token: token,\n        design: {\n          id: design.id,\n          draftUrl: design.draftUrl,\n          prompt: design.prompt || \"\",\n          thumbnail: design.thumbnail || \"\",\n          createdAt: design.createdAt || Date.now(),\n          lastUsedAt: design.lastUsedAt || design.createdAt || Date.now(),\n        },\n      }),\n    });\n    let payload = null;\n    try { payload = await resp.json(); } catch (_) { payload = null; }\n    if (!resp.ok || !payload || !payload.ok) {\n      // Token expired or revoked \u2014 clear local auth state so the customer\n      // can re-bind. Don't throw; this is a background sync, not a user action.\n      if (resp.status === 401) cloudSignOut();\n      throw new Error((payload && payload.error) || (\"Append failed (\" + resp.status + \")\"));\n    }\n    markSynced(design.id);\n    return payload;\n  }\n\n  /**\n   * Pull the cloud library for the current token and merge into local\n   * storage. Used on /pages/my-designs to show designs from another device.\n   * Returns { ok, designs, merged: N }.\n   */\n  async function cloudPull() {\n    if (!cloudWorkerUrl) throw new Error(\"Cloud library not configured.\");\n    const token = cloudGetToken();\n    if (!token) throw new Error(\"Not signed in.\");\n    const resp = await fetch(cloudWorkerUrl + \"/api/library/list?token=\" + encodeURIComponent(token));\n    let payload = null;\n    try { payload = await resp.json(); } catch (_) { payload = null; }\n    if (!resp.ok || !payload || !payload.ok) {\n      if (resp.status === 401) cloudSignOut();\n      throw new Error((payload && payload.error) || (\"List failed (\" + resp.status + \")\"));\n    }\n    if (payload.email) {\n      try { localStorage.setItem(EMAIL_KEY, String(payload.email)); } catch (_) {}\n    }\n    // Merge cloud designs into local, de-duping by id. Cloud is the source\n    // of truth for shared identity, local wins on any field we don't replace.\n    const state = read();\n    const localById = {};\n    state.designs.forEach(function (d) { localById[d.id] = d; });\n    let merged = 0;\n    (payload.designs || []).forEach(function (d) {\n      if (!d || !d.id) return;\n      if (localById[d.id]) {\n        // Already have it locally \u2014 refresh lastUsedAt if cloud is newer.\n        if ((d.lastUsedAt || 0) > (localById[d.id].lastUsedAt || 0)) {\n          localById[d.id].lastUsedAt = d.lastUsedAt;\n        }\n        return;\n      }\n      state.designs.push({\n        id: d.id,\n        prompt: d.prompt || \"\",\n        draftUrl: d.draftUrl,\n        thumbnail: d.thumbnail || \"\",\n        createdAt: d.createdAt || Date.now(),\n        lastUsedAt: d.lastUsedAt || d.createdAt || Date.now(),\n      });\n      markSynced(d.id);\n      merged++;\n    });\n    // Honour cap on merge \u2014 keep newest if we overflow.\n    if (state.designs.length > MAX_DESIGNS) {\n      state.designs.sort(function (a, b) { return (b.createdAt || 0) - (a.createdAt || 0); });\n      state.designs = state.designs.slice(0, MAX_DESIGNS);\n    }\n    write(state);\n    return { ok: true, designs: payload.designs || [], merged: merged };\n  }\n\n  /**\n   * Ask the worker to re-send the magic-link email. Never reveals whether the\n   * email is in the system \u2014 always returns the same shape.\n   */\n  async function cloudRecover(email) {\n    if (!cloudWorkerUrl) throw new Error(\"Cloud library not configured.\");\n    const resp = await fetch(cloudWorkerUrl + \"/api/library/recover\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify({ email: email }),\n    });\n    let payload = null;\n    try { payload = await resp.json(); } catch (_) { payload = null; }\n    if (!resp.ok) {\n      throw new Error((payload && payload.error) || (\"Recover failed (\" + resp.status + \")\"));\n    }\n    return payload || { ok: true, sent: true };\n  }\n\n  /**\n   * Read ?lib=<token> from the current URL. If present, bind it locally,\n   * clean it out of the URL (so refreshes don't re-trigger), and trigger\n   * a pull if a worker URL has been registered.\n   *\n   * Runs once, on script load. Safe to call twice \u2014 second call is a no-op\n   * because the param has been stripped.\n   */\n  function handleMagicLinkInUrl() {\n    try {\n      const params = new URLSearchParams(global.location.search);\n      const token = params.get(\"lib\");\n      if (!token) return;\n      // Bind first so subsequent page navigations stay authenticated.\n      cloudBind(\"\", token);\n      // Strip the param from the URL \u2014 keeps it out of analytics + prevents\n      // accidental re-share. We don't replace the path, just the query.\n      params.delete(\"lib\");\n      const newQuery = params.toString();\n      const newUrl = global.location.pathname +\n        (newQuery ? \"?\" + newQuery : \"\") +\n        global.location.hash;\n      try { global.history.replaceState({}, \"\", newUrl); } catch (_) {}\n      // Pull cloud library if the worker URL is registered yet. If not,\n      // the consumer page (my-designs.js) will call cloudPull() once it\n      // has set the worker URL.\n      if (cloudWorkerUrl) {\n        cloudPull().catch(function (e) {\n          console.warn(\"Magic-link pull failed\", e);\n        });\n      }\n    } catch (e) {\n      console.warn(\"handleMagicLinkInUrl failed\", e);\n    }\n  }\n\n  // Banner state (designer page email-capture prompt) \u2014 small helpers so\n  // ai-designer.js doesn't have to know about the storage key.\n  function bannerDismissed() {\n    try { return localStorage.getItem(BANNER_KEY) === \"dismissed\"; } catch (_) { return false; }\n  }\n  function bannerSubscribed() {\n    try { return localStorage.getItem(BANNER_KEY) === \"subscribed\"; } catch (_) { return false; }\n  }\n  function markBannerDismissed() {\n    try { localStorage.setItem(BANNER_KEY, \"dismissed\"); } catch (_) {}\n  }\n  function markBannerSubscribed() {\n    try { localStorage.setItem(BANNER_KEY, \"subscribed\"); } catch (_) {}\n  }\n\n  global.AIDesignLibrary = {\n    _v: 2, // bumped when this file's public API changes \u2014 read by the\n           // double-load guard at the top of the IIFE\n    list: list,\n    get: get,\n    save: save,\n    remove: remove,\n    touch: touch,\n    clear: clear,\n    cloud: {\n      setWorkerUrl: cloudSetWorkerUrl,\n      getWorkerUrl: cloudGetWorkerUrl,\n      getToken: cloudGetToken,\n      getEmail: cloudGetEmail,\n      isSignedIn: cloudIsSignedIn,\n      bind: cloudBind,\n      signOut: cloudSignOut,\n      save: cloudSave,\n      append: cloudAppend,\n      pull: cloudPull,\n      recover: cloudRecover,\n      handleMagicLinkInUrl: handleMagicLinkInUrl,\n    },\n    banner: {\n      dismissed: bannerDismissed,\n      subscribed: bannerSubscribed,\n      markDismissed: markBannerDismissed,\n      markSubscribed: markBannerSubscribed,\n    },\n  };\n\n  // Auto-run magic-link detection on script load. The pull may not fire\n  // until the consumer page calls cloud.setWorkerUrl() \u2014 that's fine,\n  // the consumer is responsible for calling pull() once URL is set.\n  handleMagicLinkInUrl();\n\n  // ============= Cross-origin blob fetch (XHR-based) =============\n  /**\n   * Fetch a remote URL as a Blob, using XMLHttpRequest instead of window.fetch.\n   * This is the storefront's third-party-script-proof way to download files\n   * \u2014 Shopify's pixel scripts wrap window.fetch and break cross-origin\n   * responses, but XHR is left alone.\n   */\n  function fetchBlob(url, timeoutMs) {\n    return new Promise(function (resolve, reject) {\n      const xhr = new XMLHttpRequest();\n      xhr.open(\"GET\", url, true);\n      xhr.responseType = \"blob\";\n      xhr.timeout = timeoutMs || 60000;\n      xhr.onload = function () {\n        if (xhr.status >= 200 && xhr.status < 300) resolve(xhr.response);\n        else reject(new Error(\"HTTP \" + xhr.status));\n      };\n      xhr.onerror = function () { reject(new Error(\"Network error\")); };\n      xhr.ontimeout = function () { reject(new Error(\"Timed out\")); };\n      xhr.send();\n    });\n  }\n\n  global.AIDesignFetch = { fetchBlob: fetchBlob };\n\n  // ============= Branded share image composer =============\n  /**\n   * Compose a branded share image: original design on top, black footer\n   * strip below with \"60FT INK \u00B7 60ftink.com.au\". Returns a Blob.\n   *\n   * The footer continues the black background of the design so it looks\n   * intentional, not stuck-on. Marketing payload is baked into the pixels\n   * so it survives any sharing pipeline (IG Story, Messages, FB, anything).\n   */\n  function composeBrandedImage(originalBlob, opts) {\n    opts = opts || {};\n    const brandName = opts.brandName || \"60FT INK\";\n    const tagline = opts.tagline || \"AI Design \u00B7 60ftink.com.au\";\n\n    return new Promise(function (resolve, reject) {\n      const objectUrl = URL.createObjectURL(originalBlob);\n      const img = new Image();\n      img.onload = function () {\n        try {\n          const w = img.naturalWidth;\n          const h = img.naturalHeight;\n          // Footer ~12% of the design height. On 1024px = ~123px.\n          const footerH = Math.round(h * 0.12);\n          const canvas = document.createElement(\"canvas\");\n          canvas.width = w;\n          canvas.height = h + footerH;\n          const ctx = canvas.getContext(\"2d\");\n          if (!ctx) return reject(new Error(\"Canvas not supported\"));\n\n          // Solid black background (matches the design's black bg seamlessly)\n          ctx.fillStyle = \"#000000\";\n          ctx.fillRect(0, 0, canvas.width, canvas.height);\n          ctx.drawImage(img, 0, 0);\n\n          // Subtle horizontal divider line\n          ctx.fillStyle = \"rgba(255,255,255,0.10)\";\n          ctx.fillRect(0, h, w, 1);\n\n          // Brand name (bold, large)\n          const brandSize = Math.round(footerH * 0.32);\n          ctx.fillStyle = \"#ffffff\";\n          ctx.font = \"700 \" + brandSize + 'px -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif';\n          ctx.textAlign = \"center\";\n          ctx.textBaseline = \"middle\";\n          ctx.fillText(brandName, w / 2, h + footerH * 0.4);\n\n          // Tagline (smaller, muted)\n          const taglineSize = Math.round(footerH * 0.18);\n          ctx.fillStyle = \"#94a3b8\";\n          ctx.font = \"500 \" + taglineSize + 'px -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif';\n          ctx.fillText(tagline, w / 2, h + footerH * 0.72);\n\n          URL.revokeObjectURL(objectUrl);\n          canvas.toBlob(function (blob) {\n            if (blob) resolve(blob);\n            else reject(new Error(\"Couldn't compose branded image\"));\n          }, \"image/png\");\n        } catch (e) {\n          URL.revokeObjectURL(objectUrl);\n          reject(e);\n        }\n      };\n      img.onerror = function () {\n        URL.revokeObjectURL(objectUrl);\n        reject(new Error(\"Couldn't decode image for branding\"));\n      };\n      img.src = objectUrl;\n    });\n  }\n\n  // ============= Share helpers =============\n  /**\n   * Share a design via the Web Share API. On mobile this opens the native\n   * share sheet (Instagram, Messages, WhatsApp, etc.) with the image file\n   * attached. On desktop or older browsers, falls back to URL share or\n   * clipboard copy with a toast notification.\n   *\n   * Default share text drives traffic back to the store.\n   */\n  async function shareDesign(opts) {\n    const url = (opts && opts.url) || \"\";\n    const prompt = (opts && opts.prompt) || \"design\";\n    const storeUrl = (opts && opts.storeUrl) || \"https://60ftink.com.au\";\n    const title = \"My AI design from 60ft Ink\";\n    const text =\n      (opts && opts.text) ||\n      'Made this in 30 seconds with the AI designer at ' + storeUrl + ' \u2014 try it yourself!';\n\n    if (!url) {\n      showToast(\"Couldn't share \u2014 design URL missing.\");\n      return;\n    }\n\n    // Attempt 1 \u2014 share with the BRANDED image file (best mobile UX +\n    // baked-in marketing). We add a \"60FT INK \u00B7 60ftink.com.au\" footer\n    // strip so every share carries the store branding in the pixels \u2014\n    // survives any social pipeline (IG Story, Messages, FB, etc.)\n    if (navigator.canShare && navigator.share) {\n      try {\n        const rawBlob = await fetchBlob(url);\n        let shareBlob = rawBlob;\n        try {\n          shareBlob = await composeBrandedImage(rawBlob);\n        } catch (compErr) {\n          // If branding fails for any reason, fall back to raw image\n          console.warn(\"Branding failed, sharing raw image\", compErr);\n        }\n        const file = new File([shareBlob], \"60ft-Ink-AI-Design.png\", {\n          type: \"image/png\",\n        });\n        const shareData = { title: title, text: text, files: [file] };\n        if (navigator.canShare(shareData)) {\n          await navigator.share(shareData);\n          return;\n        }\n      } catch (e) {\n        if (e && e.name === \"AbortError\") return; // user cancelled\n        console.warn(\"File share failed, falling back\", e);\n      }\n    }\n\n    // Attempt 2 \u2014 URL share (no file)\n    if (navigator.share) {\n      try {\n        await navigator.share({ title: title, text: text, url: url });\n        return;\n      } catch (e) {\n        if (e && e.name === \"AbortError\") return;\n        console.warn(\"URL share failed, falling back to clipboard\", e);\n      }\n    }\n\n    // Attempt 3 \u2014 clipboard fallback\n    try {\n      await navigator.clipboard.writeText(text + \"\\n\" + url);\n      showToast(\"Link copied to clipboard \u2713\");\n    } catch (e) {\n      window.prompt(\"Copy this link to share:\", url);\n    }\n  }\n\n  /** Lightweight toast notification \u2014 appears, fades, removes itself. */\n  function showToast(message, durationMs) {\n    durationMs = durationMs || 2200;\n    let host = document.getElementById(\"ai-design-toast-host\");\n    if (!host) {\n      host = document.createElement(\"div\");\n      host.id = \"ai-design-toast-host\";\n      host.style.cssText = [\n        \"position:fixed\",\n        \"bottom:24px\",\n        \"left:50%\",\n        \"transform:translateX(-50%)\",\n        \"z-index:99999\",\n        \"display:flex\",\n        \"flex-direction:column\",\n        \"gap:8px\",\n        \"pointer-events:none\",\n      ].join(\";\");\n      document.body.appendChild(host);\n    }\n    const toast = document.createElement(\"div\");\n    toast.textContent = message;\n    toast.style.cssText = [\n      \"background:rgba(15,23,42,0.92)\",\n      \"color:#ffffff\",\n      \"padding:10px 16px\",\n      \"border-radius:10px\",\n      \"font:14px -apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif\",\n      \"box-shadow:0 8px 24px rgba(15,23,42,0.18)\",\n      \"pointer-events:auto\",\n      \"transition:opacity 0.2s ease, transform 0.2s ease\",\n      \"opacity:0\",\n      \"transform:translateY(8px)\",\n    ].join(\";\");\n    host.appendChild(toast);\n    requestAnimationFrame(function () {\n      toast.style.opacity = \"1\";\n      toast.style.transform = \"translateY(0)\";\n    });\n    setTimeout(function () {\n      toast.style.opacity = \"0\";\n      toast.style.transform = \"translateY(8px)\";\n      setTimeout(function () { toast.remove(); }, 250);\n    }, durationMs);\n  }\n\n  global.AIDesignShare = {\n    share: shareDesign,\n    toast: showToast,\n  };\n})(window);"],
  "mappings": "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",
  "names": []
}
