@embedpdf/plugin-thumbnail 2.0.0-next.3 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../src/svelte/hooks/use-thumbnail.svelte.ts","../../src/svelte/components/ThumbImg.svelte","../../src/svelte/components/ThumbnailsPane.svelte"],"sourcesContent":["import { useCapability, usePlugin } from '@embedpdf/core/svelte';\nimport { ThumbnailPlugin } from '@embedpdf/plugin-thumbnail';\n\nexport const useThumbnailPlugin = () => usePlugin<ThumbnailPlugin>(ThumbnailPlugin.id);\nexport const useThumbnailCapability = () => useCapability<ThumbnailPlugin>(ThumbnailPlugin.id);\n","<script lang=\"ts\">\n import type { ThumbMeta } from '@embedpdf/plugin-thumbnail';\n import { ignore, PdfErrorCode } from '@embedpdf/models';\n import { useThumbnailCapability, useThumbnailPlugin } from '../hooks';\n import type { HTMLImgAttributes } from 'svelte/elements';\n\n interface Props extends HTMLImgAttributes {\n /**\n * The ID of the document that this thumbnail belongs to\n */\n documentId: string;\n meta: ThumbMeta;\n }\n\n const { documentId, meta, ...imgProps }: Props = $props();\n\n const thumbnailCapability = useThumbnailCapability();\n const thumbnailPlugin = useThumbnailPlugin();\n\n let url = $state<string | undefined>(undefined);\n let urlRef: string | null = null;\n let refreshTick = $state(0);\n\n // Listen for refresh events for this specific document\n $effect(() => {\n if (!thumbnailPlugin.plugin) return;\n const scope = thumbnailPlugin.plugin.provides().forDocument(documentId);\n return scope.onRefreshPages((pages) => {\n if (pages.includes(meta.pageIndex)) {\n refreshTick = refreshTick + 1;\n }\n });\n });\n\n // Render thumbnail for this specific document\n $effect(() => {\n // Track refreshTick so effect re-runs on refresh\n const _tick = refreshTick;\n\n if (!thumbnailCapability.provides) return;\n\n const scope = thumbnailCapability.provides.forDocument(documentId);\n const task = scope.renderThumb(meta.pageIndex, window.devicePixelRatio);\n\n task.wait((blob) => {\n const objectUrl = URL.createObjectURL(blob);\n urlRef = objectUrl;\n url = objectUrl;\n }, ignore);\n\n return () => {\n if (urlRef) {\n URL.revokeObjectURL(urlRef);\n urlRef = null;\n } else {\n task.abort({\n code: PdfErrorCode.Cancelled,\n message: 'canceled render task',\n });\n }\n };\n });\n\n const handleImageLoad = () => {\n if (urlRef) {\n URL.revokeObjectURL(urlRef);\n urlRef = null;\n }\n };\n</script>\n\n{#if url}\n <img src={url} onload={handleImageLoad} {...imgProps} alt=\"PDF thumbnail\" />\n{/if}\n","<script lang=\"ts\">\n import type { Snippet } from 'svelte';\n import type { ThumbMeta, WindowState } from '@embedpdf/plugin-thumbnail';\n import { useThumbnailPlugin } from '../hooks';\n import type { HTMLAttributes } from 'svelte/elements';\n\n interface Props extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {\n /**\n * The ID of the document that this thumbnail pane displays\n */\n documentId: string;\n children: Snippet<[ThumbMeta]>;\n }\n\n const { documentId, children, ...divProps }: Props = $props();\n\n const thumbnailPlugin = useThumbnailPlugin();\n\n let viewportRef: HTMLDivElement | undefined;\n\n // Store window data along with the documentId it came from\n let windowData = $state<{\n window: WindowState | null;\n docId: string | null;\n }>({ window: null, docId: null });\n\n // Only use the window if it matches the current documentId\n const window = $derived(windowData.docId === documentId ? windowData.window : null);\n\n // 1) subscribe to window updates for this document\n $effect(() => {\n if (!thumbnailPlugin.plugin) {\n windowData = { window: null, docId: null };\n return;\n }\n\n const scope = thumbnailPlugin.plugin.provides().forDocument(documentId);\n\n // Get initial window state immediately on mount\n const initialWindow = scope.getWindow();\n if (initialWindow) {\n windowData = { window: initialWindow, docId: documentId };\n }\n\n // Subscribe to future updates\n const unsubscribe = scope.onWindow((newWindow) => {\n windowData = { window: newWindow, docId: documentId };\n });\n\n // Clear state when documentId changes or component unmounts\n return () => {\n unsubscribe();\n windowData = { window: null, docId: null };\n };\n });\n\n // 2) keep plugin in sync while the user scrolls\n $effect(() => {\n const vp = viewportRef;\n if (!vp || !thumbnailPlugin.plugin) return;\n\n const scope = thumbnailPlugin.plugin.provides().forDocument(documentId);\n const onScroll = () => {\n scope.updateWindow(vp.scrollTop, vp.clientHeight);\n };\n\n vp.addEventListener('scroll', onScroll);\n return () => vp.removeEventListener('scroll', onScroll);\n });\n\n // 2.5) keep plugin in sync when viewport resizes (e.g., menu opens/closes)\n $effect(() => {\n const vp = viewportRef;\n if (!vp || !thumbnailPlugin.plugin) return;\n\n const scope = thumbnailPlugin.plugin.provides().forDocument(documentId);\n const resizeObserver = new ResizeObserver(() => {\n scope.updateWindow(vp.scrollTop, vp.clientHeight);\n });\n\n resizeObserver.observe(vp);\n return () => resizeObserver.disconnect();\n });\n\n // 3) kick-start after document change\n $effect(() => {\n const vp = viewportRef;\n if (!vp || !thumbnailPlugin.plugin || !window) return;\n\n const scope = thumbnailPlugin.plugin.provides().forDocument(documentId);\n // push initial metrics\n scope.updateWindow(vp.scrollTop, vp.clientHeight);\n });\n\n // 4) let plugin drive scroll – only after window is set, and only once\n $effect(() => {\n const vp = viewportRef;\n if (!vp || !thumbnailPlugin.plugin || !window) return;\n\n const scope = thumbnailPlugin.plugin.provides().forDocument(documentId);\n return scope.onScrollTo(({ top, behavior }) => {\n vp.scrollTo({ top, behavior });\n });\n });\n\n const paddingY = $derived(thumbnailPlugin?.plugin?.cfg.paddingY ?? 0);\n const totalHeight = $derived(window?.totalHeight ?? 0);\n const items = $derived(window?.items ?? []);\n</script>\n\n<div\n bind:this={viewportRef}\n style:overflow-y=\"auto\"\n style:position=\"relative\"\n style:padding-top=\"{paddingY}px\"\n style:padding-bottom=\"{paddingY}px\"\n style:height=\"100%\"\n {...divProps}\n>\n <div style:height=\"{totalHeight}px\" style:position=\"relative\">\n {#each items as meta (meta.pageIndex)}\n {@render children(meta)}\n {/each}\n </div>\n</div>\n"],"names":["useThumbnailPlugin","usePlugin","ThumbnailPlugin","id","useThumbnailCapability","useCapability","imgProps","$","rest_props","$$props","thumbnailCapability","thumbnailPlugin","url","urlRef","refreshTick","user_effect","plugin","provides","forDocument","documentId","onRefreshPages","pages","includes","meta","pageIndex","get","task","renderThumb","window","devicePixelRatio","wait","blob","objectUrl","URL","createObjectURL","set","ignore","revokeObjectURL","abort","code","PdfErrorCode","Cancelled","message","handleImageLoad","consequent","divProps","viewportRef","windowData","docId","derived","scope","initialWindow","getWindow","unsubscribe","onWindow","newWindow","vp","onScroll","updateWindow","scrollTop","clientHeight","addEventListener","removeEventListener","resizeObserver","ResizeObserver","observe","disconnect","onScrollTo","top","behavior","scrollTo","paddingY","_a","cfg","totalHeight","items","each","div_1","bind_this","div","$$value"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../src/svelte/hooks/use-thumbnail.svelte.ts","../../src/svelte/components/ThumbImg.svelte","../../src/svelte/components/ThumbnailsPane.svelte"],"sourcesContent":["import { useCapability, usePlugin } from '@embedpdf/core/svelte';\nimport { ThumbnailPlugin } from '@embedpdf/plugin-thumbnail';\n\nexport const useThumbnailPlugin = () => usePlugin<ThumbnailPlugin>(ThumbnailPlugin.id);\nexport const useThumbnailCapability = () => useCapability<ThumbnailPlugin>(ThumbnailPlugin.id);\n","<script lang=\"ts\">\n import type { ThumbMeta } from '@embedpdf/plugin-thumbnail';\n import { ignore, PdfErrorCode } from '@embedpdf/models';\n import { useThumbnailCapability, useThumbnailPlugin } from '../hooks';\n import type { HTMLImgAttributes } from 'svelte/elements';\n\n interface Props extends HTMLImgAttributes {\n /**\n * The ID of the document that this thumbnail belongs to\n */\n documentId: string;\n meta: ThumbMeta;\n }\n\n const { documentId, meta, ...imgProps }: Props = $props();\n\n const thumbnailCapability = useThumbnailCapability();\n const thumbnailPlugin = useThumbnailPlugin();\n\n let url = $state<string | undefined>(undefined);\n let urlRef: string | null = null;\n let refreshTick = $state(0);\n\n // Listen for refresh events for this specific document\n $effect(() => {\n if (!thumbnailPlugin.plugin) return;\n const scope = thumbnailPlugin.plugin.provides().forDocument(documentId);\n return scope.onRefreshPages((pages) => {\n if (pages.includes(meta.pageIndex)) {\n refreshTick = refreshTick + 1;\n }\n });\n });\n\n // Render thumbnail for this specific document\n $effect(() => {\n // Track refreshTick so effect re-runs on refresh\n const _tick = refreshTick;\n\n if (!thumbnailCapability.provides) return;\n\n const scope = thumbnailCapability.provides.forDocument(documentId);\n const task = scope.renderThumb(meta.pageIndex, window.devicePixelRatio);\n\n task.wait((blob) => {\n const objectUrl = URL.createObjectURL(blob);\n urlRef = objectUrl;\n url = objectUrl;\n }, ignore);\n\n return () => {\n if (urlRef) {\n URL.revokeObjectURL(urlRef);\n urlRef = null;\n } else {\n task.abort({\n code: PdfErrorCode.Cancelled,\n message: 'canceled render task',\n });\n }\n };\n });\n\n const handleImageLoad = () => {\n if (urlRef) {\n URL.revokeObjectURL(urlRef);\n urlRef = null;\n }\n };\n</script>\n\n{#if url}\n <img src={url} onload={handleImageLoad} {...imgProps} alt=\"PDF thumbnail\" />\n{/if}\n","<script lang=\"ts\">\n import type { Snippet } from 'svelte';\n import type { ThumbMeta, WindowState } from '@embedpdf/plugin-thumbnail';\n import { useThumbnailPlugin } from '../hooks';\n import type { HTMLAttributes } from 'svelte/elements';\n\n interface Props extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {\n /**\n * The ID of the document that this thumbnail pane displays\n */\n documentId: string;\n children: Snippet<[ThumbMeta]>;\n }\n\n const { documentId, children, ...divProps }: Props = $props();\n\n const thumbnailPlugin = useThumbnailPlugin();\n\n let viewportRef: HTMLDivElement | undefined;\n\n // Store window data along with the documentId it came from\n let windowData = $state<{\n window: WindowState | null;\n docId: string | null;\n }>({ window: null, docId: null });\n\n // Only use the window if it matches the current documentId\n const window = $derived(windowData.docId === documentId ? windowData.window : null);\n\n // 1) subscribe to window updates for this document\n $effect(() => {\n if (!thumbnailPlugin.plugin) {\n windowData = { window: null, docId: null };\n return;\n }\n\n const scope = thumbnailPlugin.plugin.provides().forDocument(documentId);\n\n // Get initial window state immediately on mount\n const initialWindow = scope.getWindow();\n if (initialWindow) {\n windowData = { window: initialWindow, docId: documentId };\n }\n\n // Subscribe to future updates\n const unsubscribe = scope.onWindow((newWindow) => {\n windowData = { window: newWindow, docId: documentId };\n });\n\n // Clear state when documentId changes or component unmounts\n return () => {\n unsubscribe();\n windowData = { window: null, docId: null };\n };\n });\n\n // 2) keep plugin in sync while the user scrolls\n $effect(() => {\n const vp = viewportRef;\n if (!vp || !thumbnailPlugin.plugin) return;\n\n const scope = thumbnailPlugin.plugin.provides().forDocument(documentId);\n const onScroll = () => {\n scope.updateWindow(vp.scrollTop, vp.clientHeight);\n };\n\n vp.addEventListener('scroll', onScroll);\n return () => vp.removeEventListener('scroll', onScroll);\n });\n\n // 2.5) keep plugin in sync when viewport resizes (e.g., menu opens/closes)\n $effect(() => {\n const vp = viewportRef;\n if (!vp || !thumbnailPlugin.plugin) return;\n\n const scope = thumbnailPlugin.plugin.provides().forDocument(documentId);\n const resizeObserver = new ResizeObserver(() => {\n scope.updateWindow(vp.scrollTop, vp.clientHeight);\n });\n\n resizeObserver.observe(vp);\n return () => resizeObserver.disconnect();\n });\n\n // 3) kick-start after document change\n $effect(() => {\n const vp = viewportRef;\n if (!vp || !thumbnailPlugin.plugin || !window) return;\n\n const scope = thumbnailPlugin.plugin.provides().forDocument(documentId);\n // push initial metrics\n scope.updateWindow(vp.scrollTop, vp.clientHeight);\n });\n\n // 4) let plugin drive scroll – only after window is set, and only once\n $effect(() => {\n const vp = viewportRef;\n if (!vp || !thumbnailPlugin.plugin || !window) return;\n\n const scope = thumbnailPlugin.plugin.provides().forDocument(documentId);\n return scope.onScrollTo(({ top, behavior }) => {\n vp.scrollTo({ top, behavior });\n });\n });\n\n const paddingY = $derived(thumbnailPlugin?.plugin?.cfg.paddingY ?? 0);\n const totalHeight = $derived(window?.totalHeight ?? 0);\n const items = $derived(window?.items ?? []);\n</script>\n\n<div\n bind:this={viewportRef}\n style:overflow-y=\"auto\"\n style:position=\"relative\"\n style:padding-top=\"{paddingY}px\"\n style:padding-bottom=\"{paddingY}px\"\n style:height=\"100%\"\n {...divProps}\n>\n <div style:height=\"{totalHeight}px\" style:position=\"relative\">\n {#each items as meta (meta.pageIndex)}\n {@render children(meta)}\n {/each}\n </div>\n</div>\n"],"names":["useThumbnailPlugin","usePlugin","ThumbnailPlugin","id","useThumbnailCapability","useCapability","imgProps","$","rest_props","$$props","thumbnailCapability","thumbnailPlugin","url","state","urlRef","refreshTick","user_effect","plugin","provides","forDocument","documentId","onRefreshPages","pages","includes","meta","pageIndex","get","task","renderThumb","window","devicePixelRatio","wait","blob","objectUrl","URL","createObjectURL","set","ignore","revokeObjectURL","abort","code","PdfErrorCode","Cancelled","message","handleImageLoad","img","root_1","consequent","divProps","viewportRef","windowData","proxy","docId","derived","scope","initialWindow","getWindow","unsubscribe","onWindow","newWindow","vp","onScroll","updateWindow","scrollTop","clientHeight","addEventListener","removeEventListener","resizeObserver","ResizeObserver","observe","disconnect","onScrollTo","top","behavior","scrollTo","paddingY","_a","cfg","totalHeight","items","div","root","div_1","$$anchor","$$value","styles"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/svelte/hooks/use-thumbnail.svelte.ts","../../src/svelte/components/ThumbImg.svelte","../../src/svelte/components/ThumbnailsPane.svelte"],"sourcesContent":["import { useCapability, usePlugin } from '@embedpdf/core/svelte';\nimport { ThumbnailPlugin } from '@embedpdf/plugin-thumbnail';\n\nexport const useThumbnailPlugin = () => usePlugin<ThumbnailPlugin>(ThumbnailPlugin.id);\nexport const useThumbnailCapability = () => useCapability<ThumbnailPlugin>(ThumbnailPlugin.id);\n","<script lang=\"ts\">\n import type { ThumbMeta } from '@embedpdf/plugin-thumbnail';\n import { ignore, PdfErrorCode } from '@embedpdf/models';\n import { useThumbnailCapability, useThumbnailPlugin } from '../hooks';\n import type { HTMLImgAttributes } from 'svelte/elements';\n\n interface Props extends HTMLImgAttributes {\n /**\n * The ID of the document that this thumbnail belongs to\n */\n documentId: string;\n meta: ThumbMeta;\n }\n\n const { documentId, meta, ...imgProps }: Props = $props();\n\n const thumbnailCapability = useThumbnailCapability();\n const thumbnailPlugin = useThumbnailPlugin();\n\n let url = $state<string | undefined>(undefined);\n let urlRef: string | null = null;\n let refreshTick = $state(0);\n\n // Listen for refresh events for this specific document\n $effect(() => {\n if (!thumbnailPlugin.plugin) return;\n const scope = thumbnailPlugin.plugin.provides().forDocument(documentId);\n return scope.onRefreshPages((pages) => {\n if (pages.includes(meta.pageIndex)) {\n refreshTick = refreshTick + 1;\n }\n });\n });\n\n // Render thumbnail for this specific document\n $effect(() => {\n // Track refreshTick so effect re-runs on refresh\n const _tick = refreshTick;\n\n if (!thumbnailCapability.provides) return;\n\n const scope = thumbnailCapability.provides.forDocument(documentId);\n const task = scope.renderThumb(meta.pageIndex, window.devicePixelRatio);\n\n task.wait((blob) => {\n const objectUrl = URL.createObjectURL(blob);\n urlRef = objectUrl;\n url = objectUrl;\n }, ignore);\n\n return () => {\n if (urlRef) {\n URL.revokeObjectURL(urlRef);\n urlRef = null;\n } else {\n task.abort({\n code: PdfErrorCode.Cancelled,\n message: 'canceled render task',\n });\n }\n };\n });\n\n const handleImageLoad = () => {\n if (urlRef) {\n URL.revokeObjectURL(urlRef);\n urlRef = null;\n }\n };\n</script>\n\n{#if url}\n <img src={url} onload={handleImageLoad} {...imgProps} alt=\"PDF thumbnail\" />\n{/if}\n","<script lang=\"ts\">\n import type { Snippet } from 'svelte';\n import type { ThumbMeta, WindowState } from '@embedpdf/plugin-thumbnail';\n import { useThumbnailPlugin } from '../hooks';\n import type { HTMLAttributes } from 'svelte/elements';\n\n interface Props extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {\n /**\n * The ID of the document that this thumbnail pane displays\n */\n documentId: string;\n children: Snippet<[ThumbMeta]>;\n }\n\n const { documentId, children, ...divProps }: Props = $props();\n\n const thumbnailPlugin = useThumbnailPlugin();\n\n let viewportRef: HTMLDivElement | undefined;\n\n // Store window data along with the documentId it came from\n let windowData = $state<{\n window: WindowState | null;\n docId: string | null;\n }>({ window: null, docId: null });\n\n // Only use the window if it matches the current documentId\n const window = $derived(windowData.docId === documentId ? windowData.window : null);\n\n // 1) subscribe to window updates for this document\n $effect(() => {\n if (!thumbnailPlugin.plugin) {\n windowData = { window: null, docId: null };\n return;\n }\n\n const scope = thumbnailPlugin.plugin.provides().forDocument(documentId);\n\n // Get initial window state immediately on mount\n const initialWindow = scope.getWindow();\n if (initialWindow) {\n windowData = { window: initialWindow, docId: documentId };\n }\n\n // Subscribe to future updates\n const unsubscribe = scope.onWindow((newWindow) => {\n windowData = { window: newWindow, docId: documentId };\n });\n\n // Clear state when documentId changes or component unmounts\n return () => {\n unsubscribe();\n windowData = { window: null, docId: null };\n };\n });\n\n // 2) keep plugin in sync while the user scrolls\n $effect(() => {\n const vp = viewportRef;\n if (!vp || !thumbnailPlugin.plugin) return;\n\n const scope = thumbnailPlugin.plugin.provides().forDocument(documentId);\n const onScroll = () => {\n scope.updateWindow(vp.scrollTop, vp.clientHeight);\n };\n\n vp.addEventListener('scroll', onScroll);\n return () => vp.removeEventListener('scroll', onScroll);\n });\n\n // 2.5) keep plugin in sync when viewport resizes (e.g., menu opens/closes)\n $effect(() => {\n const vp = viewportRef;\n if (!vp || !thumbnailPlugin.plugin) return;\n\n const scope = thumbnailPlugin.plugin.provides().forDocument(documentId);\n const resizeObserver = new ResizeObserver(() => {\n scope.updateWindow(vp.scrollTop, vp.clientHeight);\n });\n\n resizeObserver.observe(vp);\n return () => resizeObserver.disconnect();\n });\n\n // 3) kick-start after document change\n $effect(() => {\n const vp = viewportRef;\n if (!vp || !thumbnailPlugin.plugin || !window) return;\n\n const scope = thumbnailPlugin.plugin.provides().forDocument(documentId);\n // push initial metrics\n scope.updateWindow(vp.scrollTop, vp.clientHeight);\n });\n\n // 4) let plugin drive scroll – only after window is set, and only once\n $effect(() => {\n const vp = viewportRef;\n if (!vp || !thumbnailPlugin.plugin || !window) return;\n\n const scope = thumbnailPlugin.plugin.provides().forDocument(documentId);\n return scope.onScrollTo(({ top, behavior }) => {\n vp.scrollTo({ top, behavior });\n });\n });\n\n const paddingY = $derived(thumbnailPlugin?.plugin?.cfg.paddingY ?? 0);\n const totalHeight = $derived(window?.totalHeight ?? 0);\n const items = $derived(window?.items ?? []);\n</script>\n\n<div\n bind:this={viewportRef}\n style:overflow-y=\"auto\"\n style:position=\"relative\"\n style:padding-top=\"{paddingY}px\"\n style:padding-bottom=\"{paddingY}px\"\n style:height=\"100%\"\n {...divProps}\n>\n <div style:height=\"{totalHeight}px\" style:position=\"relative\">\n {#each items as meta (meta.pageIndex)}\n {@render children(meta)}\n {/each}\n </div>\n</div>\n"],"names":["window"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/svelte/hooks/use-thumbnail.svelte.ts","../../src/svelte/components/ThumbImg.svelte","../../src/svelte/components/ThumbnailsPane.svelte"],"sourcesContent":["import { useCapability, usePlugin } from '@embedpdf/core/svelte';\nimport { ThumbnailPlugin } from '@embedpdf/plugin-thumbnail';\n\nexport const useThumbnailPlugin = () => usePlugin<ThumbnailPlugin>(ThumbnailPlugin.id);\nexport const useThumbnailCapability = () => useCapability<ThumbnailPlugin>(ThumbnailPlugin.id);\n","<script lang=\"ts\">\n import type { ThumbMeta } from '@embedpdf/plugin-thumbnail';\n import { ignore, PdfErrorCode } from '@embedpdf/models';\n import { useThumbnailCapability, useThumbnailPlugin } from '../hooks';\n import type { HTMLImgAttributes } from 'svelte/elements';\n\n interface Props extends HTMLImgAttributes {\n /**\n * The ID of the document that this thumbnail belongs to\n */\n documentId: string;\n meta: ThumbMeta;\n }\n\n const { documentId, meta, ...imgProps }: Props = $props();\n\n const thumbnailCapability = useThumbnailCapability();\n const thumbnailPlugin = useThumbnailPlugin();\n\n let url = $state<string | undefined>(undefined);\n let urlRef: string | null = null;\n let refreshTick = $state(0);\n\n // Listen for refresh events for this specific document\n $effect(() => {\n if (!thumbnailPlugin.plugin) return;\n const scope = thumbnailPlugin.plugin.provides().forDocument(documentId);\n return scope.onRefreshPages((pages) => {\n if (pages.includes(meta.pageIndex)) {\n refreshTick = refreshTick + 1;\n }\n });\n });\n\n // Render thumbnail for this specific document\n $effect(() => {\n // Track refreshTick so effect re-runs on refresh\n const _tick = refreshTick;\n\n if (!thumbnailCapability.provides) return;\n\n const scope = thumbnailCapability.provides.forDocument(documentId);\n const task = scope.renderThumb(meta.pageIndex, window.devicePixelRatio);\n\n task.wait((blob) => {\n const objectUrl = URL.createObjectURL(blob);\n urlRef = objectUrl;\n url = objectUrl;\n }, ignore);\n\n return () => {\n if (urlRef) {\n URL.revokeObjectURL(urlRef);\n urlRef = null;\n } else {\n task.abort({\n code: PdfErrorCode.Cancelled,\n message: 'canceled render task',\n });\n }\n };\n });\n\n const handleImageLoad = () => {\n if (urlRef) {\n URL.revokeObjectURL(urlRef);\n urlRef = null;\n }\n };\n</script>\n\n{#if url}\n <img src={url} onload={handleImageLoad} {...imgProps} alt=\"PDF thumbnail\" />\n{/if}\n","<script lang=\"ts\">\n import type { Snippet } from 'svelte';\n import type { ThumbMeta, WindowState } from '@embedpdf/plugin-thumbnail';\n import { useThumbnailPlugin } from '../hooks';\n import type { HTMLAttributes } from 'svelte/elements';\n\n interface Props extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {\n /**\n * The ID of the document that this thumbnail pane displays\n */\n documentId: string;\n children: Snippet<[ThumbMeta]>;\n }\n\n const { documentId, children, ...divProps }: Props = $props();\n\n const thumbnailPlugin = useThumbnailPlugin();\n\n let viewportRef: HTMLDivElement | undefined;\n\n // Store window data along with the documentId it came from\n let windowData = $state<{\n window: WindowState | null;\n docId: string | null;\n }>({ window: null, docId: null });\n\n // Only use the window if it matches the current documentId\n const window = $derived(windowData.docId === documentId ? windowData.window : null);\n\n // 1) subscribe to window updates for this document\n $effect(() => {\n if (!thumbnailPlugin.plugin) {\n windowData = { window: null, docId: null };\n return;\n }\n\n const scope = thumbnailPlugin.plugin.provides().forDocument(documentId);\n\n // Get initial window state immediately on mount\n const initialWindow = scope.getWindow();\n if (initialWindow) {\n windowData = { window: initialWindow, docId: documentId };\n }\n\n // Subscribe to future updates\n const unsubscribe = scope.onWindow((newWindow) => {\n windowData = { window: newWindow, docId: documentId };\n });\n\n // Clear state when documentId changes or component unmounts\n return () => {\n unsubscribe();\n windowData = { window: null, docId: null };\n };\n });\n\n // 2) keep plugin in sync while the user scrolls\n $effect(() => {\n const vp = viewportRef;\n if (!vp || !thumbnailPlugin.plugin) return;\n\n const scope = thumbnailPlugin.plugin.provides().forDocument(documentId);\n const onScroll = () => {\n scope.updateWindow(vp.scrollTop, vp.clientHeight);\n };\n\n vp.addEventListener('scroll', onScroll);\n return () => vp.removeEventListener('scroll', onScroll);\n });\n\n // 2.5) keep plugin in sync when viewport resizes (e.g., menu opens/closes)\n $effect(() => {\n const vp = viewportRef;\n if (!vp || !thumbnailPlugin.plugin) return;\n\n const scope = thumbnailPlugin.plugin.provides().forDocument(documentId);\n const resizeObserver = new ResizeObserver(() => {\n scope.updateWindow(vp.scrollTop, vp.clientHeight);\n });\n\n resizeObserver.observe(vp);\n return () => resizeObserver.disconnect();\n });\n\n // 3) kick-start after document change\n $effect(() => {\n const vp = viewportRef;\n if (!vp || !thumbnailPlugin.plugin || !window) return;\n\n const scope = thumbnailPlugin.plugin.provides().forDocument(documentId);\n // push initial metrics\n scope.updateWindow(vp.scrollTop, vp.clientHeight);\n });\n\n // 4) let plugin drive scroll – only after window is set, and only once\n $effect(() => {\n const vp = viewportRef;\n if (!vp || !thumbnailPlugin.plugin || !window) return;\n\n const scope = thumbnailPlugin.plugin.provides().forDocument(documentId);\n return scope.onScrollTo(({ top, behavior }) => {\n vp.scrollTo({ top, behavior });\n });\n });\n\n const paddingY = $derived(thumbnailPlugin?.plugin?.cfg.paddingY ?? 0);\n const totalHeight = $derived(window?.totalHeight ?? 0);\n const items = $derived(window?.items ?? []);\n</script>\n\n<div\n bind:this={viewportRef}\n style:overflow-y=\"auto\"\n style:position=\"relative\"\n style:padding-top=\"{paddingY}px\"\n style:padding-bottom=\"{paddingY}px\"\n style:height=\"100%\"\n {...divProps}\n>\n <div style:height=\"{totalHeight}px\" style:position=\"relative\">\n {#each items as meta (meta.pageIndex)}\n {@render children(meta)}\n {/each}\n </div>\n</div>\n"],"names":["window","$$anchor"],"mappings":";;;;;;AAGa,MAAA,qBAAA,MAA2B,UAA2B,gBAAgB,EAAE;AACxE,MAAA,yBAAA,MAA+B,cAA+B,gBAAgB,EAAE;;qCCJ7F;;QAc+B,WAAQ,EAAA,WAAA,SAAA,CAAA,WAAA,YAAA,YAAA,cAAA,MAAA,CAAA;AAE/B,QAAA,sBAAsB,uBAAsB;AAC5C,QAAA,kBAAkB,mBAAkB;MAEtC,MAAM,EAAA,MAA2B,MAAS;AAC1C,MAAA,SAAwB;MACxB,cAAc,EAAA,MAAO,CAAC;AAG1B,IAAA,YAAO,MAAO;AACP,QAAA,CAAA,gBAAgB,OAAM;AACrB,UAAA,QAAQ,gBAAgB,OAAO,SAAQ,EAAG,YAAW,QAAA,UAAA;AACpD,WAAA,MAAM,eAAc,CAAE,UAAU;AACjC,UAAA,MAAM,SAAQ,QAAA,KAAM,SAAS,GAAG;cAClC,aAAW,EAAA,IAAG,WAAW,IAAG,CAAC;AAAA,MAC/B;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAGD,IAAA,YAAO,MAAO;UAEE,WAAW;AAEpB,QAAA,CAAA,oBAAoB,SAAQ;AAE3B,UAAA,QAAQ,oBAAoB,SAAS,YAAW,QAAA,UAAA;UAChD,OAAO,MAAM,yBAAiB,WAAW,OAAO,gBAAgB;AAEtE,SAAK;AAAA,MAAM,CAAA,SAAS;AACZ,cAAA,YAAY,IAAI,gBAAgB,IAAI;AAC1C,iBAAS;AACT,UAAA,IAAA,KAAM,WAAS,IAAA;AAAA,MACjB;AAAA,MAAG;AAAA;AAEU,WAAA,MAAA;AACP,UAAA,QAAQ;AACV,YAAI,gBAAgB,MAAM;AAC1B,iBAAS;AAAA,MACX,OAAO;AACL,aAAK,MAAK;AAAA,UACR,MAAM,aAAa;AAAA,UACnB,SAAS;AAAA;MAEb;AAAA,IACF;AAAA,EACF,CAAC;AAEK,QAAA,kBAAe,MAAS;AACxB,QAAA,QAAQ;AACV,UAAI,gBAAgB,MAAM;AAC1B,eAAS;AAAA,IACX;AAAA,EACF;;;;;UAIC,MAAG,OAAA;yBAAH,KAAG,OAAA;AAAA,mBAAM,GAAG;AAAA,gBAAU;AAAA,WAAqB;AAAA;;sBAA3C,GAAG;0BAAH,GAAG;AAAA;;gBADD,GAAG,EAAA,UAAA,UAAA;AAAA;;;;AAFR;;2CCrEA;;QAcmC,WAAQ,EAAA,WAAA,SAAA,CAAA,WAAA,YAAA,YAAA,cAAA,UAAA,CAAA;AAEnC,QAAA,kBAAkB,mBAAkB;MAEtC;MAGA,aAAa,QAAM,EAAA,MAAA,EAGlB,QAAQ,MAAM,OAAO,KAAI,CAAA,CAAA;QAGxBA,UAAM,EAAA,QAAA,MAAA,EAAA,IAAY,UAAU,EAAC,qCAAuB,UAAU,EAAC,SAAS,IAAI;AAGlF,IAAA,YAAO,MAAO;SACP,gBAAgB,QAAQ;AAC3B,QAAA,IAAA,cAAe,QAAQ,MAAM,OAAO,KAAI,GAAA,IAAA;;IAE1C;AAEM,UAAA,QAAQ,gBAAgB,OAAO,SAAQ,EAAG,YAAW,QAAA,UAAA;UAGrD,gBAAgB,MAAM,UAAS;AACjC,QAAA,eAAe;AACjB,QAAA,IAAA,YAAU,EAAK,QAAQ,eAAe,OAAK,QAAA,WAAA,GAAA,IAAA;AAAA,IAC7C;AAGM,UAAA,cAAc,MAAM,SAAQ,CAAE,cAAc;AAChD,QAAA,IAAA,YAAU,EAAK,QAAQ,WAAW,OAAK,QAAA,WAAA,GAAA,IAAA;AAAA,IACzC,CAAC;AAGY,WAAA,MAAA;AACX,kBAAW;AACX,QAAA,IAAA,cAAe,QAAQ,MAAM,OAAO,KAAI,GAAA,IAAA;AAAA,IAC1C;AAAA,EACF,CAAC;AAGD,IAAA,YAAO,MAAO;AACN,UAAA,KAAK;SACN,MAAE,CAAK,gBAAgB,OAAM;AAE5B,UAAA,QAAQ,gBAAgB,OAAO,SAAQ,EAAG,YAAW,QAAA,UAAA;AACrD,UAAA,WAAQ,MAAS;AACrB,YAAM,aAAa,GAAG,WAAW,GAAG,YAAY;AAAA,IAClD;AAEA,OAAG,iBAAiB,UAAU,QAAQ;AACzB,WAAA,MAAA,GAAG,oBAAoB,UAAU,QAAQ;AAAA,EACxD,CAAC;AAGD,IAAA,YAAO,MAAO;AACN,UAAA,KAAK;SACN,MAAE,CAAK,gBAAgB,OAAM;AAE5B,UAAA,QAAQ,gBAAgB,OAAO,SAAQ,EAAG,YAAW,QAAA,UAAA;UACrD,iBAAc,IAAO,eAAc,MAAO;AAC9C,YAAM,aAAa,GAAG,WAAW,GAAG,YAAY;AAAA,IAClD,CAAC;AAED,mBAAe,QAAQ,EAAE;AACZ,WAAA,MAAA,eAAe,WAAU;AAAA,EACxC,CAAC;AAGD,IAAA,YAAO,MAAO;AACN,UAAA,KAAK;AACN,QAAA,CAAA,MAAE,CAAK,gBAAgB,iBAAWA,OAAM,EAAA;AAEvC,UAAA,QAAQ,gBAAgB,OAAO,SAAQ,EAAG,YAAW,QAAA,UAAA;AAE3D,UAAM,aAAa,GAAG,WAAW,GAAG,YAAY;AAAA,EAClD,CAAC;AAGD,IAAA,YAAO,MAAO;AACN,UAAA,KAAK;AACN,QAAA,CAAA,MAAE,CAAK,gBAAgB,iBAAWA,OAAM,EAAA;AAEvC,UAAA,QAAQ,gBAAgB,OAAO,SAAQ,EAAG,YAAW,QAAA,UAAA;AACpD,WAAA,MAAM,WAAU,CAAA,EAAI,KAAK,SAAQ,MAAO;AAC7C,SAAG,SAAQ,EAAG,KAAK,SAAQ,CAAA;AAAA,IAC7B,CAAC;AAAA,EACH,CAAC;QAEK,WAAQ,EAAA,QAAA,MAAA;;AAAY,qEAAiB,WAAjB,mBAAyB,IAAI,aAAY;AAAA,GAAC;AAC9D,QAAA,cAAW,EAAA,QAAA,MAAA;;AAAA,oBAAA,IAAYA,OAAM,MAAlB,mBAAoB,gBAAe;AAAA,GAAC;QAC/C,QAAK,EAAA,QAAA,MAAA;;AAAA,oBAAA,IAAYA,OAAM,MAAlB,mBAAoB,UAAK;GAAA;MAGrC,MAAE,KAAA;qBAAF,KAAE,OAAA;AAAA,OAOG;AAAA;;;8BAHgB,QAAQ,KAAA,EAAA;AAAA,iCACL,QAAQ,KAAA,EAAA;AAAA;;;AAI9B,MAAA,gBATF,GAAE;;SASA,OAAG,IAAA,MAAA,EAAA,IACK,KAAK,GAAA,CAAI,SAAM,KAAK,WAAS,CAAAC,WAApB,SAAI;;;wDACA,IAAI,CAAA;;;UAFzB,KAAG;UATL,GAAE;cAAF,KAAE,CAAA,YACU,cAAW,SAAA,MAAX,WAAW;+CAQrB,OAAG,IAAA,QAAA;AAAA,qBAAgB,WAAW,KAAA,EAAA;AAAA;;qBAThC,GAAE;;AAFH;"}
@@ -5,7 +5,15 @@ interface ThumbnailsPaneProps {
5
5
  documentId: string;
6
6
  }
7
7
  declare var __VLS_1: {
8
- meta: any;
8
+ meta: {
9
+ pageIndex: number;
10
+ width: number;
11
+ height: number;
12
+ wrapperHeight: number;
13
+ top: number;
14
+ labelHeight: number;
15
+ padding?: number | undefined;
16
+ };
9
17
  };
10
18
  type __VLS_Slots = {} & {
11
19
  default?: (props: typeof __VLS_1) => any;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@embedpdf/plugin-thumbnail",
3
- "version": "2.0.0-next.3",
3
+ "version": "2.0.1",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "main": "./dist/index.cjs",
@@ -34,15 +34,15 @@
34
34
  }
35
35
  },
36
36
  "dependencies": {
37
- "@embedpdf/models": "2.0.0-next.3"
37
+ "@embedpdf/models": "2.0.1"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@types/react": "^18.2.0",
41
41
  "typescript": "^5.0.0",
42
- "@embedpdf/core": "2.0.0-next.3",
43
- "@embedpdf/plugin-render": "2.0.0-next.3",
44
- "@embedpdf/plugin-scroll": "2.0.0-next.3",
45
- "@embedpdf/build": "1.1.0"
42
+ "@embedpdf/plugin-render": "2.0.1",
43
+ "@embedpdf/build": "1.1.0",
44
+ "@embedpdf/plugin-scroll": "2.0.1",
45
+ "@embedpdf/core": "2.0.1"
46
46
  },
47
47
  "peerDependencies": {
48
48
  "react": ">=16.8.0",
@@ -50,8 +50,8 @@
50
50
  "preact": "^10.26.4",
51
51
  "vue": ">=3.2.0",
52
52
  "svelte": ">=5 <6",
53
- "@embedpdf/core": "2.0.0-next.3",
54
- "@embedpdf/plugin-render": "2.0.0-next.3"
53
+ "@embedpdf/core": "2.0.1",
54
+ "@embedpdf/plugin-render": "2.0.1"
55
55
  },
56
56
  "files": [
57
57
  "dist",