{"version":3,"file":"index.cjs","sources":["../../src/vue/hooks/use-tiling.ts","../../src/vue/components/tile-img.vue","../../src/vue/components/tiling-layer.vue"],"sourcesContent":["import { useCapability, usePlugin } from '@embedpdf/core/vue';\nimport { TilingPlugin } from '@embedpdf/plugin-tiling';\n\n/** Get the plugin instance itself (e.g. to read config) */\nexport const useTilingPlugin = () => usePlugin<TilingPlugin>(TilingPlugin.id);\n/** Get the *capability* the plugin exposes (renderTile, onTileRendering) */\nexport const useTilingCapability = () => useCapability<TilingPlugin>(TilingPlugin.id);\n","<script setup lang=\"ts\">\nimport { ref, computed, watch, onBeforeUnmount, toRaw } from 'vue';\nimport { ignore, PdfErrorCode } from '@embedpdf/models';\n\nimport type { Tile } from '@embedpdf/plugin-tiling';\nimport { useTilingCapability } from '../hooks';\n\ninterface Props {\n  documentId: string;\n  pageIndex: number;\n  tile: Tile;\n  scale: number;\n  dpr?: number;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n  dpr: () => (typeof window !== 'undefined' ? window.devicePixelRatio : 1),\n});\n\nconst { provides: tilingCapability } = useTilingCapability();\nconst url = ref<string>();\nconst relScale = computed(() => props.scale / props.tile.srcScale);\n\n// Track last rendered tile ID to prevent duplicates\nlet lastRenderedId: string | undefined;\nlet currentTask: any = null;\n\nwatch(\n  [() => props.tile.id, () => props.documentId, tilingCapability],\n  ([tileId, docId, capability], [prevTileId, prevDocId]) => {\n    if (!capability) return;\n\n    const scope = capability.forDocument(docId);\n\n    // CRITICAL: Clear image immediately when documentId changes\n    if (prevDocId !== undefined && prevDocId !== docId) {\n      if (url.value) {\n        URL.revokeObjectURL(url.value);\n        url.value = undefined;\n      }\n      if (currentTask) {\n        currentTask.abort({ code: PdfErrorCode.Cancelled, message: 'switching documents' });\n        currentTask = null;\n      }\n      lastRenderedId = undefined; // Reset so new document tiles render\n    }\n\n    // Already rendered this exact tile (for same document)\n    if (lastRenderedId === tileId && prevDocId === docId) return;\n\n    // Cancel previous task if any\n    if (currentTask) {\n      currentTask.abort({ code: PdfErrorCode.Cancelled, message: 'switching tiles' });\n      currentTask = null;\n    }\n\n    // Clean up old URL\n    if (url.value) {\n      URL.revokeObjectURL(url.value);\n      url.value = undefined;\n    }\n\n    lastRenderedId = tileId;\n\n    currentTask = scope.renderTile({\n      pageIndex: props.pageIndex,\n      tile: toRaw(props.tile),\n      dpr: props.dpr,\n    });\n\n    currentTask.wait((blob: Blob) => {\n      url.value = URL.createObjectURL(blob);\n      currentTask = null;\n    }, ignore);\n  },\n  { immediate: true },\n);\n\nonBeforeUnmount(() => {\n  if (currentTask) {\n    currentTask.abort({ code: PdfErrorCode.Cancelled, message: 'unmounting' });\n  }\n  if (url.value) {\n    URL.revokeObjectURL(url.value);\n  }\n});\n</script>\n\n<template>\n  <img\n    v-if=\"url\"\n    :src=\"url\"\n    :style=\"{\n      position: 'absolute',\n      left: `${tile.screenRect.origin.x * relScale}px`,\n      top: `${tile.screenRect.origin.y * relScale}px`,\n      width: `${tile.screenRect.size.width * relScale}px`,\n      height: `${tile.screenRect.size.height * relScale}px`,\n      display: 'block',\n    }\"\n  />\n</template>\n","<script setup lang=\"ts\">\nimport { ref, watch, computed } from 'vue';\nimport { useDocumentState } from '@embedpdf/core/vue';\nimport type { Tile } from '@embedpdf/plugin-tiling';\n\nimport { useTilingCapability } from '../hooks';\nimport TileImg from './tile-img.vue';\n\ninterface TilingLayerProps {\n  documentId: string;\n  pageIndex: number;\n  scale?: number;\n}\n\nconst props = defineProps<TilingLayerProps>();\n\nconst { provides: tilingProvides } = useTilingCapability();\nconst documentState = useDocumentState(() => props.documentId);\nconst tiles = ref<Tile[]>([]);\n\nconst actualScale = computed(() => {\n  if (props.scale !== undefined) return props.scale;\n  return documentState.value?.scale ?? 1;\n});\n\nwatch(\n  [tilingProvides, () => props.documentId, () => props.pageIndex],\n  ([provides, docId, pageIdx], _, onCleanup) => {\n    if (!provides) {\n      tiles.value = [];\n      return;\n    }\n\n    const unsubscribe = provides.onTileRendering((event) => {\n      if (event.documentId === docId) {\n        tiles.value = event.tiles[pageIdx] ?? [];\n      }\n    });\n\n    onCleanup(unsubscribe);\n  },\n  { immediate: true },\n);\n</script>\n\n<template>\n  <div v-bind=\"$attrs\">\n    <TileImg\n      v-for=\"tile in tiles\"\n      :key=\"tile.id\"\n      :documentId=\"documentId\"\n      :pageIndex=\"pageIndex\"\n      :tile=\"tile\"\n      :scale=\"actualScale\"\n    />\n  </div>\n</template>\n"],"names":["useTilingCapability","useCapability","TilingPlugin","id","props","__props","provides","tilingCapability","url","ref","relScale","computed","scale","tile","srcScale","lastRenderedId","currentTask","watch","documentId","tileId","docId","capability","prevTileId","prevDocId","scope","forDocument","value","URL","revokeObjectURL","abort","code","PdfErrorCode","Cancelled","message","renderTile","pageIndex","toRaw","dpr","wait","blob","createObjectURL","ignore","immediate","onBeforeUnmount","_createElementBlock","src","style","_normalizeStyle","left","screenRect","origin","x","top","y","width","size","height","tilingProvides","documentState","useDocumentState","tiles","actualScale","_a","pageIdx","_","onCleanup","onTileRendering","event","_openBlock","$attrs","_Fragment","_renderList","_createBlock","TileImg","key","usePlugin"],"mappings":"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"}