{
  "version": 3,
  "sources": ["/cdn/shop/t/41/assets/alpha-image-loading-gallery.js"],
  "sourcesContent": ["/**\r\n * Covermatic Studio gallery controller.\r\n */\r\n(() => {\r\n  const runtime = window.CovermaticRuntime || window.AlphaRuntime || {};\r\n  window.CovermaticRuntime = runtime;\r\n  window.AlphaRuntime = runtime;\r\n  const { Config, State, Utils, Events } = runtime;\r\n  const serializeGalleryLog = (value) => {\r\n    if (value instanceof Error) return { name: value.name, message: value.message, stack: value.stack };\r\n    if (value && typeof value === 'object') {\r\n      const out = {};\r\n      Object.keys(value).forEach((key) => {\r\n        const item = value[key];\r\n        out[key] = item instanceof Error ? { name: item.name, message: item.message, stack: item.stack } : item;\r\n      });\r\n      return out;\r\n    }\r\n    return value;\r\n  };\r\n  const logGallery = (...args) => console.info('[Covermatic gallery]', ...args.map(serializeGalleryLog));\r\n  const warnGallery = (...args) => console.warn('[Covermatic gallery]', ...args.map(serializeGalleryLog));\r\n  const errorGallery = (...args) => console.error('[Covermatic gallery]', ...args.map(serializeGalleryLog));\r\n\r\n  const extractFileNameFromUrl = (rawUrl) => {\r\n    const value = String(rawUrl || '').trim();\r\n    if (!value) return null;\r\n\r\n    try {\r\n      const parsed = new URL(value, window.location.origin);\r\n      const lastSegment = parsed.pathname.split('/').filter(Boolean).pop() || '';\r\n      return lastSegment ? decodeURIComponent(lastSegment) : null;\r\n    } catch (_error) {\r\n      const cleaned = value.split('?')[0].split('#')[0];\r\n      const lastSegment = cleaned.split('/').filter(Boolean).pop() || '';\r\n      return lastSegment ? decodeURIComponent(lastSegment) : null;\r\n    }\r\n  };\r\n\r\n  class GalleryController {\r\n    constructor() {\r\n      this.grid = Utils.$('galleryGrid');\r\n      this.sentinel = Utils.$('fetchSentinel');\r\n      this.loading = Utils.$('fetchLoading');\r\n      this.end = Utils.$('fetchEnd');\r\n      this.activeFetchPromise = null;\r\n      this.initialFetchTimer = null;\r\n      this.lineageCache = new Map();\r\n      this.recordsByUrl = new Map();\r\n      this.recordsByFileName = new Map();\r\n      this.recordsById = new Map();\n      this.pendingCardsByTaskId = new Map();\n      this.pendingCardsByFingerprint = new Map();\n      this.searchInput = Utils.$('alpha-gallery-search');\n      this.searchClear = Utils.$('alpha-gallery-search-clear');\n      this.sizeInput = Utils.$('alpha-gallery-size');\n      this.sizeValue = Utils.$('alpha-gallery-size-value');\n      this.searchQuery = '';\n      this.searchDebounceTimer = null;\n      this.unsubscribers = [];\n\n      this.init();\n    }\n\r\n    init() {\r\n      this.unsubscribers.push(\r\n        Events.on('gallery:prepend-images', ({ detail }) => this.prependImages(detail.images)),\r\n        Events.on('gallery:apply-edit', ({ detail }) => this.applyEdit(detail.image)),\r\n        Events.on('gallery:refresh-requested', ({ detail }) => this.refreshFromHistory(detail || {})),\r\n        Events.on('task:created', ({ detail }) => this.addPendingTaskCards(detail.task)),\r\n        Events.on('task:failed', ({ detail }) => this.removePendingTaskCards(detail.task?.id)),\r\n        Events.on('task:removed', ({ detail }) => this.removePendingTaskCards(detail.id)),\r\n      );\r\n\r\n      if (!Utils.isLoggedIn()) {\n        this.renderGuestGallery();\n      } else {\n        this.initGalleryControls();\n        this.restorePendingTaskCards();\n        this.scheduleInitialFetch();\n\r\n        const obs = new IntersectionObserver((entries) => {\r\n          if (entries[0].isIntersecting) this.fetchNextPage();\r\n        }, { rootMargin: '400px' });\r\n        if (this.sentinel) obs.observe(this.sentinel);\r\n      }\r\n\r\n      document.addEventListener('click', (event) => {\r\n        const action = event.target.closest('[data-card-action]');\r\n        const card = event.target.closest('[data-covermatic-gallery-card][data-url], button[data-url]');\r\n        if (!card?.dataset.url) return;\r\n        const record = this.recordFromCard(card);\r\n        if (!record) return;\r\n\r\n        Events.emit('modal:image-open-requested', { record });\r\n      });\r\n\r\n      document.addEventListener('keydown', (event) => {\r\n        if (event.key !== 'Enter' && event.key !== ' ') return;\r\n        const card = event.target.closest('[data-covermatic-gallery-card][data-url]');\r\n        if (!card?.dataset.url || event.target.closest('[data-card-action]')) return;\r\n        event.preventDefault();\r\n        const record = this.recordFromCard(card);\r\n        if (record) Events.emit('modal:image-open-requested', { record });\r\n      });\n    }\n\n    initGalleryControls() {\n      this.initGridSizeControl();\n      this.initGallerySearch();\n    }\n\n    initGridSizeControl() {\n      if (!this.grid || !this.sizeInput) return;\n      const stored = Number(window.localStorage?.getItem('covermaticAlphaGalleryColumns') || 2);\n      const normalize = (value) => Math.min(4, Math.max(1, Number(value) || 2));\n      const apply = (value) => {\n        const columns = normalize(value);\n        this.grid.style.setProperty('--covermatic-gallery-columns', String(columns));\n        this.grid.dataset.galleryColumns = String(columns);\n        this.sizeInput.value = String(columns);\n        if (this.sizeValue) this.sizeValue.textContent = `${columns} ${columns === 1 ? 'across' : 'across'}`;\n        try { window.localStorage?.setItem('covermaticAlphaGalleryColumns', String(columns)); } catch (_error) { /* storage is optional */ }\n      };\n\n      apply(stored);\n      this.sizeInput.addEventListener('input', () => apply(this.sizeInput.value));\n    }\n\n    initGallerySearch() {\n      if (!this.searchInput) return;\n      const applySearch = () => {\n        const nextQuery = String(this.searchInput.value || '').trim();\n        if (nextQuery === this.searchQuery) return;\n        this.searchQuery = nextQuery;\n        this.searchClear?.classList.toggle('hidden', !this.searchQuery);\n        this.resetAndFetchHistory().catch((error) => {\n          errorGallery('Gallery search refresh failed', { query: this.searchQuery, error });\n        });\n      };\n\n      this.searchInput.addEventListener('input', () => {\n        window.clearTimeout(this.searchDebounceTimer);\n        this.searchDebounceTimer = window.setTimeout(applySearch, 300);\n      });\n\n      this.searchInput.addEventListener('keydown', (event) => {\n        if (event.key !== 'Enter') return;\n        event.preventDefault();\n        window.clearTimeout(this.searchDebounceTimer);\n        applySearch();\n      });\n\n      this.searchClear?.addEventListener('click', () => {\n        this.searchInput.value = '';\n        window.clearTimeout(this.searchDebounceTimer);\n        applySearch();\n        this.searchInput.focus();\n      });\n    }\n\r\n    scheduleInitialFetch() {\r\n      const run = () => {\r\n        this.initialFetchTimer = null;\r\n        this.fetchNextPage().catch((error) => {\r\n          errorGallery('Initial gallery fetch failed', { error });\r\n        });\r\n      };\r\n\r\n      this.initialFetchTimer = window.setTimeout(run, 250);\r\n    }\r\n\r\n    renderGuestGallery() {\r\n      const container = Utils.$('guestExamplesContainer');\r\n      if (container) {\r\n        Config.guestImages.forEach((img) => {\r\n          const btn = document.createElement('button');\r\n          btn.className = 'covermatic-gallery-card covermatic-gallery-card--guest group relative flex-none w-40 md:w-60 snap-center text-left';\r\n          btn.dataset.url = img.URL;\r\n          btn.innerHTML = `\r\n            <div class=\"covermatic-gallery-card__frame\">\r\n              <div class=\"covermatic-gallery-card__media\">\r\n                <img src=\"${img.URL}\" class=\"covermatic-gallery-card__image\" loading=\"lazy\" decoding=\"async\" />\r\n              </div>\r\n            </div>\r\n          `;\r\n          container.appendChild(btn);\r\n        });\r\n        this.initMarquee('guest-examples-container');\r\n      }\r\n\n      this.initMarquee('guest-premade-container');\n      this.initMarquee('guest-promo-container');\n    }\n\r\n    initMarquee(id) {\r\n      const el = Utils.$(`#${id}`);\r\n      if (!el || !el.children.length) return;\r\n\r\n      el.style.overflow = 'hidden';\r\n      const track = document.createElement('div');\r\n      track.style.cssText = 'display:flex;gap:1rem;width:max-content;will-change:transform;';\r\n\r\n      while (el.firstChild) track.appendChild(el.firstChild);\r\n      el.appendChild(track);\r\n      [...track.children].forEach((child) => track.appendChild(child.cloneNode(true)));\r\n\r\n      const width = track.scrollWidth / 2;\r\n      const duration = width / 50;\r\n      const style = document.createElement('style');\r\n      style.textContent = `@keyframes marquee-${id} { 0%{transform:translateX(0)} 100%{transform:translateX(-${width}px)} }`;\r\n      document.head.appendChild(style);\r\n      track.style.animation = `marquee-${id} ${duration}s linear infinite`;\r\n      el.onmouseenter = () => { track.style.animationPlayState = 'paused'; };\r\n      el.onmouseleave = () => { track.style.animationPlayState = 'running'; };\r\n    }\r\n\r\n    async refreshFromHistory(options = {}) {\n      if (!Utils.isLoggedIn()) return { added: 0, skipped: true };\n      if (this.activeFetchPromise) {\n        try { await this.activeFetchPromise; } catch (_error) { /* keep refresh best-effort */ }\n      }\n\n      return this.resetAndFetchHistory(options);\n    }\n\n    async resetAndFetchHistory(options = {}) {\n      if (this.activeFetchPromise) {\n        try { await this.activeFetchPromise; } catch (_error) { /* reset continues after failed fetch */ }\n      }\n\n      State.page = 0;\n      State.hasMore = true;\n      State.isFetching = false;\n      State.urlSet = new Set();\n      this.recordsByUrl = new Map();\n      this.recordsByFileName = new Map();\r\n      this.recordsById = new Map();\r\n      if (this.grid) {\r\n        Array.from(this.grid.children).forEach((child) => {\r\n          if (!child.dataset?.covermaticPendingTaskId) child.remove();\r\n        });\r\n      }\n      this.end?.classList.add('hidden');\n      if (this.end) this.end.textContent = this.searchQuery ? 'No matching artwork.' : 'No more artwork.';\n      const result = await this.fetchNextPage();\n      if (options.taskId && Number(result?.added || 0) > 0) this.removePendingTaskCards(options.taskId);\n      return result;\n    }\n\r\n    async fetchNextPage() {\r\n      if (this.activeFetchPromise) return this.activeFetchPromise;\r\n      if (State.isFetching || !State.hasMore) return { added: 0, hasMore: State.hasMore, skipped: true };\r\n\r\n      this.activeFetchPromise = (async () => {\r\n        State.isFetching = true;\r\n        this.loading?.classList.remove('hidden');\r\n        let added = 0;\r\n\r\n        try {\r\n          const data = await this.fetchHistoricalPage();\r\n          const images = this.extractRecords(data);\r\n          logGallery('Fetched gallery page', {\r\n            page: State.page,\r\n            count: images.length,\r\n            keys: data && typeof data === 'object' && !Array.isArray(data) ? Object.keys(data) : [],\r\n          });\r\n\r\n          images.forEach((item) => {\r\n            const record = this.resolveRecord(item);\r\n            if (record?.url && !State.urlSet.has(record.url) && this.grid) {\r\n              State.urlSet.add(record.url);\r\n              this.grid.appendChild(this.createCard(record));\r\n              added += 1;\r\n            }\r\n          });\r\n\r\n          State.hasMore = this.resolveHasMore(data, images.length);\r\n          State.page += 1;\r\n          if (!State.hasMore) this.end?.classList.remove('hidden');\r\n\r\n          return { added, hasMore: State.hasMore };\r\n        } catch (error) {\r\n          errorGallery('Failed to fetch gallery page', { page: State.page, error });\r\n          return { added, hasMore: State.hasMore, error: true };\r\n        } finally {\r\n          State.isFetching = false;\r\n          this.loading?.classList.add('hidden');\r\n          this.activeFetchPromise = null;\r\n        }\r\n      })();\r\n\r\n      return this.activeFetchPromise;\r\n    }\r\n\r\n    async fetchHistoricalPage() {\r\n      const apiBase = String(Config.apiBase || '/').replace(/\\/+$/, '');\r\n      const historicalQuery = new URLSearchParams({\n        customerId: Config.customerId || '',\n        limit: String(Config.perFetch),\n        offset: String(State.page * Config.perFetch),\n      });\n      if (this.searchQuery) historicalQuery.set('search', this.searchQuery);\n      ApiClient.appendToolContext?.(historicalQuery);\n      const historicalCandidates = [\r\n        `${apiBase}/app_proxy/historical-generations?${historicalQuery}`,\r\n        `${apiBase}/api/historical-generations?${historicalQuery}`,\r\n        `${apiBase}/historical-generations?${historicalQuery}`,\r\n      ];\r\n      logGallery('Requesting historical generations', {\r\n        page: State.page,\r\n        candidates: historicalCandidates,\r\n      });\r\n\r\n      const historicalFailures = [];\r\n      for (const historicalUrl of historicalCandidates) {\r\n        const historicalResponse = await Utils.withTimeout(\r\n          historicalUrl,\r\n          { credentials: 'same-origin' },\r\n          8000,\r\n        );\r\n        logGallery('Historical generations response', {\r\n          page: State.page,\r\n          url: historicalUrl,\r\n          status: historicalResponse.status,\r\n          ok: historicalResponse.ok,\r\n        });\r\n        if (historicalResponse.ok) {\r\n          const data = await historicalResponse.json();\r\n          logGallery('Historical generations payload received', {\r\n            page: State.page,\r\n            url: historicalUrl,\r\n            type: Array.isArray(data) ? 'array' : typeof data,\r\n          });\r\n          return data;\r\n        }\r\n\r\n        historicalFailures.push({\r\n          url: historicalUrl,\r\n          status: historicalResponse.status,\r\n        });\r\n\r\n        if (historicalResponse.status !== 401 && historicalResponse.status !== 404) {\r\n          const body = await historicalResponse.text().catch(() => '');\r\n          throw new Error(`Historical generations request failed with ${historicalResponse.status} for ${historicalUrl}: ${body.slice(0, 240)}`);\r\n        }\r\n      }\r\n\r\n      const legacyQuery = new URLSearchParams({\r\n        customerId: Config.customerId,\r\n        start: String(State.page * Config.perFetch),\r\n        count: String(Config.perFetch),\r\n      });\r\n      const legacyUrl = `${apiBase}/images?${legacyQuery}`;\r\n      warnGallery('Falling back to legacy images endpoint', {\r\n        page: State.page,\r\n        historicalFailures,\r\n        legacyUrl,\r\n      });\r\n      const legacyResponse = await Utils.withTimeout(\r\n        legacyUrl,\r\n        { credentials: 'same-origin' },\r\n        8000,\r\n      );\r\n      logGallery('Legacy images response', {\r\n        page: State.page,\r\n        status: legacyResponse.status,\r\n        ok: legacyResponse.ok,\r\n      });\r\n      if (!legacyResponse.ok) {\r\n        const body = await legacyResponse.text().catch(() => '');\r\n        throw new Error(`Legacy images request failed with ${legacyResponse.status} for ${legacyUrl}: ${body.slice(0, 240)}`);\r\n      }\r\n\r\n      const data = await legacyResponse.json();\r\n      logGallery('Legacy images payload received', {\r\n        page: State.page,\r\n        type: Array.isArray(data) ? 'array' : typeof data,\r\n      });\r\n      warnGallery('Legacy images payload has no lineage metadata; modal navigation will be degraded until a historical endpoint succeeds', {\r\n        page: State.page,\r\n      });\r\n      return data;\r\n    }\r\n\r\n    extractRecords(data) {\r\n      if (Array.isArray(data)) return data;\r\n      if (Array.isArray(data?.images)) return data.images;\r\n      if (Array.isArray(data?.items)) return data.items;\r\n      if (Array.isArray(data?.rows)) return data.rows;\r\n      if (Array.isArray(data?.generations)) return data.generations;\r\n      if (Array.isArray(data?.data)) return data.data;\r\n      return [];\r\n    }\r\n\r\n    resolveHasMore(data, count) {\r\n      if (typeof data?.pagination?.has_more === 'boolean') return data.pagination.has_more;\r\n      if (typeof data?.has_more === 'boolean') return data.has_more;\r\n      return count >= Config.perFetch;\r\n    }\r\n\r\n    normalizeRecord(item) {\r\n      if (!item) return null;\r\n      if (typeof item === 'string') {\r\n        const fileName = extractFileNameFromUrl(item);\r\n        return {\r\n          id: null,\r\n          url: item,\r\n          fileName,\r\n          uniqueFileName: fileName,\r\n          editId: null,\r\n          parentCoverId: null,\r\n          coverGroupId: null,\r\n          lineageDepth: null,\r\n          createdAt: null,\r\n          artistName: '',\r\n          songName: '',\r\n          coverArtIdea: '',\r\n          status: '',\r\n          isEdit: false,\r\n          assetFamily: null,\r\n          assetType: null,\r\n          sizePreset: null,\r\n          isFreeGeneration: false,\r\n          hasFreeWatermark: false,\r\n          freeQuotaSource: '',\r\n          logoFreeSourceUrl: '',\r\n          conversionType: '',\r\n          officializedFromCoverArtId: null,\r\n          sharedWithDsgfx: false,\r\n          shareCreditsAwarded: 0,\r\n          pendingTaskId: '',\r\n        };\r\n      }\r\n\r\n      const rawUrl = item.image_url || item.url || item.URL || '';\r\n      const url = typeof rawUrl === 'string' ? rawUrl.trim() : '';\r\n      if (!url) return null;\r\n\r\n      const normalizeNumber = (value) => {\r\n        const parsed = Number(value);\r\n        return Number.isFinite(parsed) ? parsed : null;\r\n      };\r\n\r\n      const fileName = String(item.file_name || item.unique_file_name || '').trim() || extractFileNameFromUrl(url);\r\n      const logs = item.logs && typeof item.logs === 'object' ? item.logs : {};\r\n      const isFreeGeneration = item.is_free_generation === true || item.isFreeGeneration === true || logs.is_free_generation === true;\r\n      const hasFreeWatermark = item.has_free_watermark === true || item.hasFreeWatermark === true || logs.has_free_watermark === true;\r\n\r\n      return {\r\n        id: normalizeNumber(item.id),\r\n        url,\r\n        fileName,\r\n        uniqueFileName: fileName,\r\n        editId: String(item.edit_id || '').trim() || null,\r\n        parentCoverId: normalizeNumber(item.parent_cover_id),\r\n        coverGroupId: normalizeNumber(item.cover_group_id),\r\n        lineageDepth: normalizeNumber(item.lineage_depth),\r\n        createdAt: String(item.created_at || '').trim() || null,\r\n        artistName: String(item.artist_name || '').trim(),\r\n        songName: String(item.song_name || '').trim(),\r\n        coverArtIdea: String(item.cover_art_idea || item.coverArtIdea || logs.cover_art_idea || '').trim(),\r\n        status: String(item.status || '').trim(),\r\n        isEdit: item.is_edit === true,\r\n        assetFamily: String(item.asset_family || '').trim() || null,\r\n        assetType: String(item.asset_type || '').trim() || null,\r\n        toolSlug: String(item.tool_slug || logs.tool_slug || '').trim() || null,\r\n        nicheSlug: String(item.niche_slug || logs.niche_slug || '').trim() || null,\r\n        styleSlug: String(item.style_slug || logs.style_slug || '').trim() || null,\r\n        styleName: String(item.style_name || logs.style_name || '').trim() || null,\r\n        canvasReady: item.canvas_ready === true || logs.canvas_ready === true,\r\n        sizePreset: String(item.size_preset || '').trim() || null,\r\n        isFreeGeneration,\r\n        hasFreeWatermark,\r\n        freeQuotaSource: String(item.free_quota_source || item.freeQuotaSource || logs.free_quota_source || '').trim(),\r\n        logoFreeSourceUrl: String(item.logo_free_source_url || item.logoFreeSourceUrl || logs.logo_free_source_url || '').trim(),\r\n        conversionType: String(item.conversion_type || item.conversionType || logs.conversion_type || '').trim(),\r\n        officializedFromCoverArtId: normalizeNumber(item.officialized_from_cover_art_id || item.officializedFromCoverArtId || logs.officialized_from_cover_art_id),\r\n        sharedWithDsgfx: item.shared_with_dsgfx === true || item.sharedWithDsgfx === true,\r\n        shareCreditsAwarded: normalizeNumber(item.share_credits_awarded || item.shareCreditsAwarded) || 0,\r\n        pendingTaskId: String(item.pending_task_id || item.pendingTaskId || item.taskId || '').trim(),\r\n      };\r\n    }\r\n\r\n    mergeRecord(existing, normalized) {\r\n      if (!existing) return normalized;\r\n      const prefer = (nextValue, previousValue) => {\r\n        if (nextValue === null || nextValue === undefined || nextValue === '') return previousValue ?? nextValue;\r\n        return nextValue;\r\n      };\r\n\r\n      return {\r\n        id: prefer(normalized.id, existing.id),\r\n        url: prefer(normalized.url, existing.url),\r\n        fileName: prefer(normalized.fileName, existing.fileName),\r\n        uniqueFileName: prefer(normalized.uniqueFileName, existing.uniqueFileName),\r\n        editId: prefer(normalized.editId, existing.editId),\r\n        parentCoverId: prefer(normalized.parentCoverId, existing.parentCoverId),\r\n        coverGroupId: prefer(normalized.coverGroupId, existing.coverGroupId),\r\n        lineageDepth: prefer(normalized.lineageDepth, existing.lineageDepth),\r\n        createdAt: prefer(normalized.createdAt, existing.createdAt),\r\n        artistName: prefer(normalized.artistName, existing.artistName),\r\n        songName: prefer(normalized.songName, existing.songName),\r\n        coverArtIdea: prefer(normalized.coverArtIdea, existing.coverArtIdea),\r\n        status: prefer(normalized.status, existing.status),\r\n        isEdit: normalized.isEdit === true || existing.isEdit === true,\r\n        assetFamily: prefer(normalized.assetFamily, existing.assetFamily),\r\n        assetType: prefer(normalized.assetType, existing.assetType),\r\n        toolSlug: prefer(normalized.toolSlug, existing.toolSlug),\r\n        nicheSlug: prefer(normalized.nicheSlug, existing.nicheSlug),\r\n        styleSlug: prefer(normalized.styleSlug, existing.styleSlug),\r\n        styleName: prefer(normalized.styleName, existing.styleName),\r\n        canvasReady: normalized.canvasReady === true || existing.canvasReady === true,\r\n        sizePreset: prefer(normalized.sizePreset, existing.sizePreset),\r\n        isFreeGeneration: normalized.isFreeGeneration === true || existing.isFreeGeneration === true,\r\n        hasFreeWatermark: normalized.hasFreeWatermark === true || existing.hasFreeWatermark === true,\r\n        freeQuotaSource: prefer(normalized.freeQuotaSource, existing.freeQuotaSource),\r\n        logoFreeSourceUrl: prefer(normalized.logoFreeSourceUrl, existing.logoFreeSourceUrl),\r\n        conversionType: prefer(normalized.conversionType, existing.conversionType),\r\n        officializedFromCoverArtId: prefer(normalized.officializedFromCoverArtId, existing.officializedFromCoverArtId),\r\n        sharedWithDsgfx: normalized.sharedWithDsgfx === true || existing.sharedWithDsgfx === true,\r\n        shareCreditsAwarded: Math.max(Number(normalized.shareCreditsAwarded || 0), Number(existing.shareCreditsAwarded || 0)),\r\n        pendingTaskId: prefer(normalized.pendingTaskId, existing.pendingTaskId),\r\n      };\r\n    }\r\n\r\n    resolveRecord(item) {\r\n      const normalized = this.normalizeRecord(item);\r\n      if (!normalized) return null;\r\n\r\n      const existingByFileName = normalized.fileName ? this.recordsByFileName.get(normalized.fileName) : null;\r\n      const existingByUrl = this.recordsByUrl.get(normalized.url);\r\n      const existingById = normalized.id != null ? this.recordsById.get(normalized.id) : null;\r\n      const existing = existingByFileName || existingById || existingByUrl;\r\n\r\n      const record = this.mergeRecord(existing, normalized);\r\n\r\n      if (record.url) this.recordsByUrl.set(record.url, record);\r\n      if (record.fileName) this.recordsByFileName.set(record.fileName, record);\r\n      if (record.id != null) this.recordsById.set(record.id, record);\r\n\r\n      return record;\r\n    }\r\n\r\n    normalizeLineagePayload(data, fileName) {\r\n      const rawSequence = Array.isArray(data?.sequence)\r\n        ? data.sequence\r\n        : Array.isArray(data?.rows)\r\n          ? data.rows\r\n          : Array.isArray(data?.data)\r\n            ? data.data\r\n            : Array.isArray(data)\r\n              ? data\r\n              : [];\r\n      const sequence = rawSequence\r\n        .map((item) => this.resolveRecord(item))\r\n        .filter(Boolean);\r\n      const current = this.resolveRecord(data?.current) || sequence.find((record) => record.fileName === fileName) || null;\r\n      const currentIndex = sequence.findIndex((record) => {\r\n        if (current?.id != null && record.id != null) return record.id === current.id;\r\n        if (current?.fileName && record.fileName) return record.fileName === current.fileName;\r\n        return record.url === current?.url;\r\n      });\r\n\r\n      logGallery('Normalized lineage payload', {\r\n        fileName,\r\n        sequenceSize: sequence.length,\r\n        currentFileName: current?.fileName || null,\r\n        currentIndex,\r\n        keys: data && typeof data === 'object' && !Array.isArray(data) ? Object.keys(data) : [],\r\n      });\r\n      return sequence;\r\n    }\r\n\r\n    async fetchLineage(fileName, options = {}) {\r\n      if (!fileName) return [];\r\n      const force = options && options.force === true;\r\n      if (!force && this.lineageCache.has(fileName)) {\r\n        const cachedSequence = this.lineageCache.get(fileName) || [];\r\n        logGallery('Using cached server lineage sequence', {\r\n          fileName,\r\n          sequenceSize: cachedSequence.length,\r\n        });\r\n        return cachedSequence;\r\n      }\r\n\r\n      const apiBase = String(Config.apiBase || '/').replace(/\\/+$/, '');\r\n      const lineageQuery = new URLSearchParams({ fileName });\r\n      ApiClient.appendToolContext?.(lineageQuery);\r\n      const lineageCandidates = [\r\n        `${apiBase}/app_proxy/cover-lineage?${lineageQuery}`,\r\n        `${apiBase}/api/cover-lineage?${lineageQuery}`,\r\n        `${apiBase}/cover-lineage?${lineageQuery}`,\r\n      ];\r\n      logGallery('Requesting server lineage', {\r\n        fileName,\r\n        candidates: lineageCandidates,\r\n      });\r\n\r\n      for (const lineageUrl of lineageCandidates) {\r\n        const lineageResponse = await Utils.withTimeout(lineageUrl, { credentials: 'same-origin' }, 8e3);\n        logGallery('Server lineage response', {\r\n          fileName,\r\n          url: lineageUrl,\r\n          status: lineageResponse.status,\r\n          ok: lineageResponse.ok,\r\n        });\r\n        if (!lineageResponse.ok) {\r\n          if (lineageResponse.status === 401 || lineageResponse.status === 404) continue;\r\n          throw new Error(`Cover lineage request failed with ${lineageResponse.status} for ${lineageUrl}`);\r\n        }\r\n\r\n        const data = await lineageResponse.json();\r\n        const sequence = this.normalizeLineagePayload(data, fileName);\r\n        sequence.forEach((record) => {\r\n          if (record.fileName) this.lineageCache.set(record.fileName, sequence);\r\n        });\r\n        if (!this.lineageCache.has(fileName)) this.lineageCache.set(fileName, sequence);\r\n        return sequence;\r\n      }\r\n\r\n      throw new Error('Cover lineage endpoint is unavailable');\n    }\r\n\r\n    getGroupSequence(record) {\n      const resolved = this.resolveRecord(record);\n      if (!resolved) return [];\n      const groupId = resolved.coverGroupId || resolved.id;\n      if (!groupId) return [];\n\n      const sequence = [...this.recordsByFileName.values()]\n        .filter((entry) => entry.coverGroupId === groupId || entry.id === groupId)\n        .sort((left, right) => {\r\n          const leftDepth = left.lineageDepth ?? Number.MAX_SAFE_INTEGER;\r\n          const rightDepth = right.lineageDepth ?? Number.MAX_SAFE_INTEGER;\r\n          if (leftDepth !== rightDepth) return leftDepth - rightDepth;\r\n\r\n          const leftTime = left.createdAt ? Date.parse(left.createdAt) : 0;\r\n          const rightTime = right.createdAt ? Date.parse(right.createdAt) : 0;\r\n          if (leftTime !== rightTime) return leftTime - rightTime;\r\n\r\n          return (left.id ?? 0) - (right.id ?? 0);\r\n        });\r\n\r\n      logGallery('Built lineage group sequence', {\r\n        coverGroupId: groupId,\n        activeFileName: resolved.fileName,\r\n        activeDepth: resolved.lineageDepth,\r\n        size: sequence.length,\r\n      });\r\n      return sequence;\r\n    }\r\n\r\n    recordFromCard(card) {\r\n      return this.resolveRecord({\r\n        url: card.dataset.url,\r\n        file_name: card.dataset.fileName || '',\r\n        unique_file_name: card.dataset.uniqueFileName || card.dataset.fileName || '',\r\n        id: card.dataset.recordId || null,\r\n        cover_group_id: card.dataset.coverGroupId || null,\r\n        parent_cover_id: card.dataset.parentCoverId || null,\r\n        lineage_depth: card.dataset.lineageDepth || null,\r\n        is_free_generation: card.dataset.freeGeneration === 'true',\r\n        has_free_watermark: card.dataset.freeWatermark === 'true',\r\n        logo_free_source_url: card.dataset.logoFreeSourceUrl || '',\r\n        conversion_type: card.dataset.conversionType || '',\r\n        officialized_from_cover_art_id: card.dataset.officializedFromCoverArtId || null,\r\n        shared_with_dsgfx: card.dataset.sharedWithDsgfx === 'true',\r\n        share_credits_awarded: card.dataset.shareCreditsAwarded || 0,\r\n      });\r\n    }\r\n\r\n    aspectRatioForPreset(sizePreset) {\r\n      const normalized = String(sizePreset || '').trim().toLowerCase();\r\n      const ratioMap = {\r\n        square_1_1: '1 / 1',\r\n        landscape_3_2: '3 / 2',\r\n        portrait_2_3: '2 / 3',\r\n        portrait_3_4: '3 / 4',\r\n        landscape_4_3: '4 / 3',\r\n        portrait_4_5: '4 / 5',\r\n        landscape_5_4: '5 / 4',\r\n        story_9_16: '9 / 16',\r\n        banner_16_9: '16 / 9',\r\n        ultrawide_21_9: '21 / 9',\r\n      };\r\n      return ratioMap[normalized] || '4 / 5';\r\n    }\r\n\r\n    cssEscape(value) {\r\n      if (window.CSS && typeof window.CSS.escape === 'function') return window.CSS.escape(String(value));\r\n      return String(value).replace(/[^a-zA-Z0-9_-]/g, '\\$&');\r\n    }\r\n\r\n    isEditTask(task) {\r\n      const type = String(task?.data?.type || '').trim();\r\n      return type === 'edit' || type === 'creative-edit';\r\n    }\r\n\r\n    isGalleryGenerationTask(task) {\r\n      const type = String(task?.data?.type || '').trim();\r\n      return type !== 'make-official';\r\n    }\r\n\r\n    expectedImageCount(task) {\r\n      if (this.isEditTask(task)) return 1;\r\n      const qty = Number(task?.data?.qty || 1);\r\n      return Math.max(1, Math.min(Number.isFinite(qty) ? Math.round(qty) : 1, 8));\r\n    }\r\n\r\n    pendingCardId(taskId, index = 0) {\r\n      return `${String(taskId || '').trim()}::${Number(index) || 0}`;\r\n    }\r\n\r\n    pendingTaskFingerprint(task, index = 0) {\r\n      const data = task?.data || {};\r\n      const photos = Array.isArray(data.photoInputs) ? data.photoInputs.filter(Boolean).join('|') : '';\r\n      const assets = Array.isArray(data.assetInputs) ? data.assetInputs.filter(Boolean).join('|') : '';\r\n      const concept = String(data.concept || data.coverArtIdea || '').trim().slice(0, 240);\r\n      return [\r\n        String(data.toolSlug || Config.toolSlug || '').trim(),\r\n        String(data.assetType || Config.assetType || '').trim(),\r\n        String(data.styleSlug || data.styleName || data.assetTypeLabel || '').trim(),\r\n        photos,\r\n        assets,\r\n        concept,\r\n        Number(index) || 0,\r\n      ].join('::');\r\n    }\r\n\r\n    restorePendingTaskCards() {\r\n      const tasks = runtime.TaskManager?.tasks;\r\n      if (!(tasks instanceof Map)) return;\r\n      tasks.forEach((task) => {\r\n        if (task?.status === 'pending' || task?.status === 'running') this.addPendingTaskCards(task);\r\n      });\r\n    }\r\n\r\n    addPendingTaskCards(task) {\r\n      if (!this.grid || !this.isGalleryGenerationTask(task) || !task?.id) return;\r\n      const count = this.expectedImageCount(task);\r\n      for (let index = count - 1; index >= 0; index -= 1) {\r\n        this.addPendingTaskCard(task, index);\r\n      }\r\n    }\r\n\r\n    addPendingTaskCard(task, index = 0) {\r\n      if (!this.grid || !this.isGalleryGenerationTask(task) || !task?.id) return;\r\n      const taskId = this.pendingCardId(task.id, index);\r\n      const fingerprint = this.pendingTaskFingerprint(task, index);\r\n      const escapedId = this.cssEscape(taskId);\r\n      const escapedFingerprint = this.cssEscape(fingerprint);\r\n      const existingByTask = this.pendingCardsByTaskId.get(taskId) || this.grid.querySelector(`[data-covermatic-pending-task-id=\"${escapedId}\"]`);\r\n      const existingByFingerprint = fingerprint ? this.pendingCardsByFingerprint.get(fingerprint) || this.grid.querySelector(`[data-covermatic-pending-key=\"${escapedFingerprint}\"]`) : null;\r\n      const existingCard = existingByTask || existingByFingerprint;\r\n      if (existingCard) {\r\n        this.pendingCardsByTaskId.set(taskId, existingCard);\r\n        if (fingerprint) this.pendingCardsByFingerprint.set(fingerprint, existingCard);\r\n        return;\r\n      }\r\n\r\n      const card = document.createElement('article');\r\n      card.className = 'covermatic-gallery-card covermatic-pending-card';\r\n      card.dataset.covermaticPendingTaskId = taskId;\r\n      card.dataset.covermaticPendingRootTaskId = String(task.id);\r\n      if (fingerprint) card.dataset.covermaticPendingKey = fingerprint;\r\n      card.setAttribute('aria-live', 'polite');\r\n      card.style.setProperty('--covermatic-card-aspect-ratio', this.aspectRatioForPreset(task.data?.sizePreset || Config.sizePreset || 'square_1_1'));\r\n      const label = this.pendingTaskLabel(task);\r\n      const detail = this.pendingTaskDetail(task, index);\r\n      card.innerHTML = `\r\n        <div class=\"covermatic-gallery-card__frame covermatic-pending-card__frame\">\r\n          <div class=\"covermatic-pending-card__canvas\">\r\n            <div class=\"covermatic-pending-card__glow\" aria-hidden=\"true\"></div>\r\n            <div class=\"covermatic-pending-card__mark\" aria-hidden=\"true\"><span></span><span></span><span></span></div>\r\n            <div class=\"covermatic-pending-card__status\">\r\n              <strong>${Utils.escapeHtml(label)}</strong>\r\n              <small>${Utils.escapeHtml(detail)}</small>\r\n            </div>\r\n          </div>\r\n          <div class=\"covermatic-gallery-card__footer covermatic-pending-card__footer\">${this.isEditTask(task) ? 'Applying edit...' : 'Generating artwork...'}</div>\r\n        </div>\r\n      `;\r\n      this.pendingCardsByTaskId.set(taskId, card);\r\n      if (fingerprint) this.pendingCardsByFingerprint.set(fingerprint, card);\r\n      this.grid.prepend(card);\r\n    }\r\n\r\n    pendingTaskLabel(task) {\r\n      if (task?.data?.type === 'creative-lab') return 'Creating promo graphic';\r\n      if (String(task?.data?.toolSlug || Config.toolSlug || '').trim() === 'photomatic') return 'Creating your portrait';\r\n      return 'Creating cover art';\r\n    }\r\n\r\n    pendingTaskDetail(task, index = 0) {\r\n      const data = task?.data || {};\r\n      const count = this.expectedImageCount(task);\r\n      const name = this.isEditTask(task)\r\n        ? String(data.editRequest || data.concept || data.title || 'Artwork edit').trim()\r\n        : String(data.assetTypeLabel || data.styleName || data.title || data.artist || Config.assetType || 'Artwork').trim();\r\n      return count > 1 ? `${name} ${Number(index) + 1}/${count}` : name;\r\n    }\r\n\r\n    removePendingTaskCards(taskId) {\r\n      const id = String(taskId || '').trim();\r\n      if (!id || !this.grid) return;\r\n      Array.from(this.grid.querySelectorAll(`[data-covermatic-pending-root-task-id=\"${this.cssEscape(id)}\"]`)).forEach((card) => {\r\n        const pendingId = card.dataset?.covermaticPendingTaskId || '';\r\n        const fingerprint = card.dataset?.covermaticPendingKey || '';\r\n        card.remove();\r\n        if (pendingId) this.pendingCardsByTaskId.delete(pendingId);\r\n        if (fingerprint) this.pendingCardsByFingerprint.delete(fingerprint);\r\n      });\r\n      Array.from(this.pendingCardsByTaskId.keys()).forEach((pendingId) => {\r\n        if (pendingId === id || pendingId.startsWith(`${id}::`)) this.pendingCardsByTaskId.delete(pendingId);\r\n      });\r\n    }\r\n\r\n    replacePendingTaskCard(taskId, card) {\r\n      const id = String(taskId || '').trim();\r\n      if (!id || !card || !this.grid) return false;\r\n      const candidates = [id, this.pendingCardId(id, 0)];\r\n      let pending = null;\r\n      let matchedId = '';\r\n      for (const candidate of candidates) {\r\n        pending = this.pendingCardsByTaskId.get(candidate) || this.grid.querySelector(`[data-covermatic-pending-task-id=\"${this.cssEscape(candidate)}\"]`);\r\n        if (pending) {\r\n          matchedId = candidate;\r\n          break;\r\n        }\r\n      }\r\n      if (!pending) {\r\n        pending = this.grid.querySelector(`[data-covermatic-pending-root-task-id=\"${this.cssEscape(id)}\"]`);\r\n        matchedId = pending?.dataset?.covermaticPendingTaskId || '';\r\n      }\r\n      if (!pending) return false;\r\n      const fingerprint = pending.dataset?.covermaticPendingKey || '';\r\n      card.classList.add('covermatic-gallery-card--revealed');\r\n      pending.replaceWith(card);\r\n      if (matchedId) this.pendingCardsByTaskId.delete(matchedId);\r\n      if (fingerprint) this.pendingCardsByFingerprint.delete(fingerprint);\r\n      return true;\r\n    }\r\n\r\n    createCard(record) {\r\n      const card = document.createElement('article');\r\n      card.className = 'covermatic-gallery-card group block w-full text-left';\r\n      card.style.setProperty('--covermatic-card-aspect-ratio', this.aspectRatioForPreset(record.sizePreset));\r\n      card.dataset.covermaticGalleryCard = 'true';\r\n      card.dataset.url = record.url;\r\n      card.dataset.sharedWithDsgfx = record.sharedWithDsgfx ? 'true' : 'false';\r\n      card.dataset.shareCreditsAwarded = String(record.shareCreditsAwarded || 0);\r\n      card.setAttribute('role', 'button');\r\n      card.setAttribute('tabindex', '0');\r\n      if (record.fileName) {\r\n        card.dataset.fileName = record.fileName;\r\n        card.dataset.uniqueFileName = record.uniqueFileName || record.fileName;\r\n      }\r\n      if (record.id != null) card.dataset.recordId = String(record.id);\r\n      if (record.sizePreset) card.dataset.sizePreset = record.sizePreset;\r\n      if (record.isFreeGeneration) card.dataset.freeGeneration = 'true';\r\n      if (record.hasFreeWatermark) card.dataset.freeWatermark = 'true';\r\n      if (record.logoFreeSourceUrl) card.dataset.logoFreeSourceUrl = record.logoFreeSourceUrl;\r\n      if (record.conversionType) card.dataset.conversionType = record.conversionType;\r\n      if (record.officializedFromCoverArtId != null) card.dataset.officializedFromCoverArtId = String(record.officializedFromCoverArtId);\r\n      if (record.coverGroupId != null) card.dataset.coverGroupId = String(record.coverGroupId);\r\n      if (record.parentCoverId != null) card.dataset.parentCoverId = String(record.parentCoverId);\r\n      if (record.lineageDepth != null) card.dataset.lineageDepth = String(record.lineageDepth);\r\n      card.innerHTML = `\r\n        <div class=\"covermatic-gallery-card__frame\">\r\n          <div class=\"covermatic-gallery-card__media\">\r\n            <img src=\"${Utils.escapeHtml(record.url)}\" loading=\"lazy\" decoding=\"async\" class=\"covermatic-gallery-card__image\" />\r\n          </div>\r\n          <div class=\"covermatic-gallery-card__footer\" aria-label=\"Artwork actions\">\r\n            <button type=\"button\" class=\"covermatic-gallery-card__action\" data-card-action=\"edit\">Edit</button>\r\n            <span aria-hidden=\"true\">&bull;</span>\r\n            <button type=\"button\" class=\"covermatic-gallery-card__action\" data-card-action=\"download\">Download</button>\r\n          </div>\r\n        </div>\r\n      `;\r\n      return card;\r\n    }\r\n\r\n    prependImages(items) {\r\n      const urls = Array.isArray(items) ? items : [items];\r\n      urls.forEach((item) => {\r\n        const record = this.resolveRecord(item);\r\n        if (record?.url) {\r\n          const hasExistingCard = this.grid\r\n            ? Array.from(this.grid.querySelectorAll('[data-covermatic-gallery-card][data-url]')).some((card) => card.dataset.url === record.url)\r\n            : false;\r\n          if (State.urlSet.has(record.url) && hasExistingCard) return;\r\n          State.urlSet.add(record.url);\r\n          const card = this.createCard(record);\r\n          const replaced = this.replacePendingTaskCard(record.pendingTaskId, card);\r\n          if (this.grid && !replaced) this.grid.prepend(card);\r\n        }\r\n      });\r\n    }\r\n\r\n    async applyEdit(urlObj) {\r\n      let record = this.resolveRecord(urlObj);\r\n      if (!record?.url) return;\r\n\r\n      if (record.fileName) {\r\n        try {\r\n          const sequence = await this.fetchLineage(record.fileName, { force: true });\r\n          const refreshedRecord = sequence.find((item) => {\r\n            if (record.fileName && item.fileName) return item.fileName === record.fileName;\r\n            return item.url === record.url;\r\n          });\r\n          if (refreshedRecord) record = this.resolveRecord(refreshedRecord) || refreshedRecord;\r\n        } catch (error) {\r\n          warnGallery('Failed to refresh edit lineage after completion', {\r\n            fileName: record.fileName,\r\n            url: record.url,\r\n            error: error?.message || String(error),\r\n          });\r\n        }\r\n      }\r\n\r\n      State.currentUrl = record.url;\r\n      State.currentImageRecord = record;\r\n      const modalImg = Utils.$('modalImage');\r\n      if (modalImg) modalImg.src = record.url;\r\n\r\n      this.prependImages([record]);\r\n      Events.emit('modal:image-open-requested', { record });\r\n      Utils.toast('Edit applied');\r\n    }\r\n  }\r\n\r\n  runtime.GalleryController = GalleryController;\r\n})();\r\n\r\n\r\n\r\n"],
  "mappings": "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",
  "names": ["data", "fileName", "card"]
}
