{"version":3,"file":"main.umd.cjs","names":["currentImage: string | null","currentAlt: string | null","button: HTMLButtonElement | null","response: Response | null","blob: Blob | null"],"sources":["../src/main.ts"],"sourcesContent":["import type { VistaData, VistaExtension, VistaView } from 'vistaview';\nimport type { VistaBox } from 'vistaview';\n\n// okayy\nconst downloadIcon = `<svg viewBox=\"0 0 24 24\"><path d=\"M12 15V3\"/><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/><path d=\"m7 10 5 5 5-5\"/></svg>`;\n\nexport function getDownloadFileName(url: string, alt?: string | null): string {\n  const clean = url.split('?')[0].split('#')[0];\n  const lastSegment = clean.split('/').pop() || '';\n  const dotIndex = lastSegment.lastIndexOf('.');\n  if (dotIndex > -1) {\n    const ext = lastSegment.slice(dotIndex + 1);\n    if (alt) return `${alt}.${ext}`;\n    return lastSegment;\n  }\n  if (alt) return alt;\n  return lastSegment || 'download';\n}\n\nexport function download(): VistaExtension {\n  let currentImage: string | null = null;\n  let currentAlt: string | null = null;\n  let button: HTMLButtonElement | null = null;\n\n  return {\n    name: 'download',\n    control: () => {\n      button = document.createElement('button');\n      button.setAttribute('aria-label', 'Download');\n      button.innerHTML = downloadIcon;\n      button.addEventListener('click', async () => {\n        if (!currentImage) return;\n        if (button?.classList.contains('vvw--pulsing')) return; // prevent multiple clicks\n        button?.classList.add('vvw--pulsing');\n\n        let response: Response | null = await fetch(currentImage);\n        let blob: Blob | null = await response.blob();\n        const finalUrl = response.url; // This is the redirected URL\n\n        const fileName = getDownloadFileName(finalUrl, currentAlt);\n\n        const link = document.createElement('a');\n        link.href = URL.createObjectURL(blob);\n        link.download = fileName;\n        document.body.appendChild(link);\n        link.click();\n        document.body.removeChild(link);\n        blob = null;\n        response = null;\n        button?.classList.remove('vvw--pulsing');\n      });\n      return button;\n    },\n    onImageView: (vistaData: VistaData, _v: VistaView) => {\n      const centerImage = vistaData.images.to\n        ? vistaData.images.to[Math.floor(vistaData.images.to.length / 2)]\n        : null;\n\n      if (!centerImage) {\n        currentImage = null;\n        currentAlt = null;\n        return;\n      }\n      const { parsedSrcSet, config } = centerImage;\n\n      // get the biggest image || the current image\n      currentImage =\n        parsedSrcSet && parsedSrcSet.length > 0\n          ? parsedSrcSet[parsedSrcSet.length - 1].src\n          : config.src || null;\n\n      currentAlt = config.alt || null;\n    },\n    onDeactivateUi: (names: string[], _requestBy: VistaBox | null, _v: VistaView) => {\n      if (names.includes('download') && button) {\n        button.setAttribute('disabled', 'true');\n      }\n    },\n    onReactivateUi: (names: string[], _requestBy: VistaBox | null, _v: VistaView) => {\n      if (names.includes('download') && button) {\n        button.removeAttribute('disabled');\n      }\n    },\n    onClose: (_vistaView: VistaView) => {\n      button?.remove();\n      button = null;\n      currentImage = null;\n      currentAlt = null;\n    },\n  };\n}\n"],"mappings":"iOAIA,IAAM,EAAe,oIAErB,SAAgB,EAAoB,EAAa,EAA6B,CAE5E,IAAM,EADQ,EAAI,MAAM,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,GACjB,MAAM,IAAI,CAAC,KAAK,EAAI,GACxC,EAAW,EAAY,YAAY,IAAI,CAC7C,GAAI,EAAW,GAAI,CACjB,IAAM,EAAM,EAAY,MAAM,EAAW,EAAE,CAE3C,OADI,EAAY,GAAG,EAAI,GAAG,IACnB,EAGT,OADI,GACG,GAAe,WAGxB,SAAgB,GAA2B,CACzC,IAAIA,EAA8B,KAC9BC,EAA4B,KAC5BC,EAAmC,KAEvC,MAAO,CACL,KAAM,WACN,aACE,EAAS,SAAS,cAAc,SAAS,CACzC,EAAO,aAAa,aAAc,WAAW,CAC7C,EAAO,UAAY,EACnB,EAAO,iBAAiB,QAAS,SAAY,CAE3C,GADI,CAAC,GACD,GAAQ,UAAU,SAAS,eAAe,CAAE,OAChD,GAAQ,UAAU,IAAI,eAAe,CAErC,IAAIC,EAA4B,MAAM,MAAM,EAAa,CACrDC,EAAoB,MAAM,EAAS,MAAM,CACvC,EAAW,EAAS,IAEpB,EAAW,EAAoB,EAAU,EAAW,CAEpD,EAAO,SAAS,cAAc,IAAI,CACxC,EAAK,KAAO,IAAI,gBAAgB,EAAK,CACrC,EAAK,SAAW,EAChB,SAAS,KAAK,YAAY,EAAK,CAC/B,EAAK,OAAO,CACZ,SAAS,KAAK,YAAY,EAAK,CAC/B,EAAO,KACP,EAAW,KACX,GAAQ,UAAU,OAAO,eAAe,EACxC,CACK,GAET,aAAc,EAAsB,IAAkB,CACpD,IAAM,EAAc,EAAU,OAAO,GACjC,EAAU,OAAO,GAAG,KAAK,MAAM,EAAU,OAAO,GAAG,OAAS,EAAE,EAC9D,KAEJ,GAAI,CAAC,EAAa,CAChB,EAAe,KACf,EAAa,KACb,OAEF,GAAM,CAAE,eAAc,UAAW,EAGjC,EACE,GAAgB,EAAa,OAAS,EAClC,EAAa,EAAa,OAAS,GAAG,IACtC,EAAO,KAAO,KAEpB,EAAa,EAAO,KAAO,MAE7B,gBAAiB,EAAiB,EAA6B,IAAkB,CAC3E,EAAM,SAAS,WAAW,EAAI,GAChC,EAAO,aAAa,WAAY,OAAO,EAG3C,gBAAiB,EAAiB,EAA6B,IAAkB,CAC3E,EAAM,SAAS,WAAW,EAAI,GAChC,EAAO,gBAAgB,WAAW,EAGtC,QAAU,GAA0B,CAClC,GAAQ,QAAQ,CAChB,EAAS,KACT,EAAe,KACf,EAAa,MAEhB"}