@embedpdf/plugin-render 1.3.15 → 1.4.0

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.
@@ -0,0 +1 @@
1
+ export * from './render-layer';
@@ -0,0 +1,16 @@
1
+ import { CSSProperties, HTMLAttributes } from '../../react/adapter.ts';
2
+ type RenderLayerProps = Omit<HTMLAttributes<HTMLImageElement>, 'style'> & {
3
+ pageIndex: number;
4
+ /**
5
+ * The scale factor for rendering the page.
6
+ */
7
+ scale?: number;
8
+ /**
9
+ * @deprecated Use `scale` instead. Will be removed in the next major release.
10
+ */
11
+ scaleFactor?: number;
12
+ dpr?: number;
13
+ style?: CSSProperties;
14
+ };
15
+ export declare function RenderLayer({ pageIndex, scale, scaleFactor, dpr, style, ...props }: RenderLayerProps): import("react/jsx-runtime").JSX.Element;
16
+ export {};
@@ -0,0 +1 @@
1
+ export * from './use-render';
@@ -0,0 +1,11 @@
1
+ import { RenderPlugin } from '../../index.ts';
2
+ export declare const useRenderPlugin: () => {
3
+ plugin: RenderPlugin | null;
4
+ isLoading: boolean;
5
+ ready: Promise<void>;
6
+ };
7
+ export declare const useRenderCapability: () => {
8
+ provides: Readonly<import('../../index.ts').RenderCapability> | null;
9
+ isLoading: boolean;
10
+ ready: Promise<void>;
11
+ };
@@ -0,0 +1,3 @@
1
+ export * from './components';
2
+ export * from './hooks';
3
+ export * from '../index.ts';
@@ -0,0 +1,10 @@
1
+ import { HTMLImgAttributes } from 'svelte/elements';
2
+ interface RenderLayerProps extends Omit<HTMLImgAttributes, 'style'> {
3
+ pageIndex: number;
4
+ scale?: number;
5
+ dpr?: number;
6
+ class?: string;
7
+ }
8
+ declare const RenderLayer: import('svelte', { with: { "resolution-mode": "import" } }).Component<RenderLayerProps, {}, "">;
9
+ type RenderLayer = ReturnType<typeof RenderLayer>;
10
+ export default RenderLayer;
@@ -0,0 +1 @@
1
+ export { default as RenderLayer } from './RenderLayer.svelte';
@@ -0,0 +1 @@
1
+ export * from './use-render';
@@ -0,0 +1,11 @@
1
+ import { RenderPlugin } from '../../lib/index.ts';
2
+ export declare const useRenderPlugin: () => {
3
+ plugin: RenderPlugin | null;
4
+ isLoading: boolean;
5
+ ready: Promise<void>;
6
+ };
7
+ export declare const useRenderCapability: () => {
8
+ provides: Readonly<import('../../lib/index.ts').RenderCapability> | null;
9
+ isLoading: boolean;
10
+ ready: Promise<void>;
11
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"}),require("svelte/internal/disclose-version");const e=require("svelte/internal/client"),t=require("@embedpdf/models"),r=require("@embedpdf/core/svelte"),n=require("@embedpdf/plugin-render");function s(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e)for(const r in e)if("default"!==r){const n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:()=>e[r]})}return t.default=e,Object.freeze(t)}const l=s(e),o=()=>r.usePlugin(n.RenderPlugin.id),i=()=>r.useCapability(n.RenderPlugin.id);var a=l.from_html("<img/>");exports.RenderLayer=function(e,r){l.push(r,!0);let n=l.rest_props(r,["$$slots","$$events","$$legacy","pageIndex","scale","dpr","class"]);const s=i(),c=o(),d=l.derived((()=>r.scale??1));let u=l.state(null),p=null,f=l.state(0);function g(){p&&(URL.revokeObjectURL(p),p=null)}l.user_effect((()=>{if(c.plugin)return c.plugin.onRefreshPages((e=>{e.includes(r.pageIndex)&&l.update(f)}))})),l.user_effect((()=>{l.get(f);const e=s.provides;if(!e)return;const n=e.renderPage({pageIndex:r.pageIndex,options:{scaleFactor:l.get(d),dpr:r.dpr||window.devicePixelRatio}});return n.wait((e=>{const t=URL.createObjectURL(e);p&&URL.revokeObjectURL(p),l.set(u,t,!0),p=t}),t.ignore),()=>{p?(URL.revokeObjectURL(p),p=null):n.abort({code:t.PdfErrorCode.Cancelled,message:"canceled render task"})}}));var b=l.comment(),v=l.first_child(b),y=e=>{var t=a();l.attribute_effect(t,(()=>({src:l.get(u),onload:g,...n,style:"width: 100%; height: 100%;",class:r.class,alt:""}))),l.replay_events(t),l.append(e,t)};l.if(v,(e=>{l.get(u)&&e(y)})),l.append(e,b),l.pop()},exports.useRenderCapability=i,exports.useRenderPlugin=o,Object.keys(n).forEach((e=>{"default"===e||Object.prototype.hasOwnProperty.call(exports,e)||Object.defineProperty(exports,e,{enumerable:!0,get:()=>n[e]})}));
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../../src/svelte/hooks/use-render.ts","../../src/svelte/components/RenderLayer.svelte"],"sourcesContent":["import { useCapability, usePlugin } from '@embedpdf/core/svelte';\nimport { RenderPlugin } from '@embedpdf/plugin-render';\n\nexport const useRenderPlugin = () => usePlugin<RenderPlugin>(RenderPlugin.id);\nexport const useRenderCapability = () => useCapability<RenderPlugin>(RenderPlugin.id);\n","<script lang=\"ts\">\n import type { HTMLImgAttributes } from 'svelte/elements';\n import { ignore, type PdfDocumentObject, PdfErrorCode } from '@embedpdf/models';\n import { useRenderCapability, useRenderPlugin } from '../hooks';\n\n interface RenderLayerProps extends Omit<HTMLImgAttributes, 'style'> {\n pageIndex: number;\n scale?: number;\n dpr?: number;\n class?: string;\n }\n\n let { pageIndex, scale, dpr, class: propsClass, ...props }: RenderLayerProps = $props();\n\n const renderCapability = useRenderCapability();\n const renderPlugin = useRenderPlugin();\n\n const actualScale = $derived(scale ?? 1);\n\n let imageUrl = $state<string | null>(null);\n let urlRef: string | null = null;\n let refreshTick = $state(0);\n\n // Subscribe/unsubscribe whenever the plugin instance changes (not just on mount)\n $effect(() => {\n if (!renderPlugin.plugin) return; // nothing yet; try again when it appears\n return renderPlugin.plugin.onRefreshPages((pages) => {\n if (pages.includes(pageIndex)) {\n refreshTick++; // trigger a re-render\n }\n });\n });\n\n // Render whenever inputs change (pageIndex, scale, dpr, provides, refreshTick)\n $effect(() => {\n // Explicitly read refreshTick so the effect tracks it\n const _tick = refreshTick;\n\n const provides = renderCapability.provides;\n if (!provides) return;\n\n const task = provides.renderPage({\n pageIndex,\n options: { scaleFactor: actualScale, dpr: dpr || window.devicePixelRatio },\n });\n\n task.wait((blob) => {\n const url = URL.createObjectURL(blob);\n // revoke any previous URL before swapping to avoid leaks\n if (urlRef) {\n URL.revokeObjectURL(urlRef);\n }\n\n imageUrl = url;\n urlRef = url;\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 function handleImageLoad() {\n // Additional safety: once the image has loaded, revoke the last ref if still present\n if (urlRef) {\n URL.revokeObjectURL(urlRef);\n urlRef = null;\n }\n }\n</script>\n\n{#if imageUrl}\n <img\n src={imageUrl}\n onload={handleImageLoad}\n {...props}\n style=\"width: 100%; height: 100%;\"\n class={propsClass}\n alt=\"\"\n />\n{/if}\n"],"names":["useRenderPlugin","usePlugin","RenderPlugin","id","useRenderCapability","useCapability","props","$","rest_props","$$props","renderCapability","renderPlugin","actualScale","imageUrl","urlRef","refreshTick","handleImageLoad","URL","revokeObjectURL","user_effect","plugin","onRefreshPages","pages","includes","pageIndex","provides","task","renderPage","options","scaleFactor","dpr","window","devicePixelRatio","wait","blob","url","createObjectURL","$__namespace","set","ignore","abort","code","PdfErrorCode","Cancelled","message","consequent"],"mappings":"oiBAGaA,EAAkB,IAAMC,YAAwBC,EAAAA,aAAaC,IAC7DC,EAAsB,IAAMC,gBAA4BH,EAAAA,aAAaC,+ECQ7B,IAAAG,EAAKC,EAAAC,WAAAC,EAAA,qEAElD,MAAAC,EAAmBN,IACnBO,EAAeX,IAEfY,0BAAgC,IAElC,IAAAC,UAAiC,MACjCC,EAAwB,KACxBC,UAAqB,GAiDhB,SAAAC,IAEHF,IACFG,IAAIC,gBAAgBJ,GACXA,EAAA,KAEb,CApDAP,EAAAY,aAAc,KACP,GAAAR,EAAaS,OACX,OAAAT,EAAaS,OAAOC,gBAAgBC,IACrCA,EAAMC,SAAqBd,EAAAe,qBAC7BT,EACF,GACD,IAIHR,EAAAY,aAAc,WAEEJ,SAERU,EAAWf,EAAiBe,aAC7BA,EAAQ,OAEP,MAAAC,EAAOD,EAASE,WAAU,CAC9BH,UAASf,EAAAe,UACTI,QAAO,CAAIC,kBAAajB,GAAakB,IAAGrB,EAAAqB,KAASC,OAAOC,oBAc7C,OAXRN,EAAAO,MAAMC,IACH,MAAAC,EAAMlB,IAAImB,gBAAgBF,GAE5BpB,GACFG,IAAIC,gBAAgBJ,GAGtBuB,EAAAC,IAAAzB,EAAWsB,GAAG,GACLrB,EAAAqB,CAAA,GACRI,EAAAA,QAEU,KACPzB,GACFG,IAAIC,gBAAgBJ,GACXA,EAAA,MAETY,EAAKc,MAAK,CACRC,KAAMC,EAAYA,aAACC,UACnBC,QAAS,wBAEb,CACD,+FAcI/B,UACGG,KACJV,kHAJHO,MAAQgC,EAAA,yBAFb"}
@@ -0,0 +1,3 @@
1
+ export * from './components';
2
+ export * from './hooks';
3
+ export * from '../lib/index.ts';
@@ -0,0 +1,106 @@
1
+ import "svelte/internal/disclose-version";
2
+ import * as $ from "svelte/internal/client";
3
+ import { ignore, PdfErrorCode } from "@embedpdf/models";
4
+ import { useCapability, usePlugin } from "@embedpdf/core/svelte";
5
+ import { RenderPlugin } from "@embedpdf/plugin-render";
6
+ export * from "@embedpdf/plugin-render";
7
+ const useRenderPlugin = () => usePlugin(RenderPlugin.id);
8
+ const useRenderCapability = () => useCapability(RenderPlugin.id);
9
+ var root_1 = $.from_html(`<img/>`);
10
+ function RenderLayer($$anchor, $$props) {
11
+ $.push($$props, true);
12
+ let props = $.rest_props($$props, [
13
+ "$$slots",
14
+ "$$events",
15
+ "$$legacy",
16
+ "pageIndex",
17
+ "scale",
18
+ "dpr",
19
+ "class"
20
+ ]);
21
+ const renderCapability = useRenderCapability();
22
+ const renderPlugin = useRenderPlugin();
23
+ const actualScale = $.derived(() => $$props.scale ?? 1);
24
+ let imageUrl = $.state(null);
25
+ let urlRef = null;
26
+ let refreshTick = $.state(0);
27
+ $.user_effect(() => {
28
+ if (!renderPlugin.plugin) return;
29
+ return renderPlugin.plugin.onRefreshPages((pages) => {
30
+ if (pages.includes($$props.pageIndex)) {
31
+ $.update(
32
+ refreshTick
33
+ // trigger a re-render
34
+ );
35
+ }
36
+ });
37
+ });
38
+ $.user_effect(() => {
39
+ $.get(refreshTick);
40
+ const provides = renderCapability.provides;
41
+ if (!provides) return;
42
+ const task = provides.renderPage({
43
+ pageIndex: $$props.pageIndex,
44
+ options: {
45
+ scaleFactor: $.get(actualScale),
46
+ dpr: $$props.dpr || window.devicePixelRatio
47
+ }
48
+ });
49
+ task.wait(
50
+ (blob) => {
51
+ const url = URL.createObjectURL(blob);
52
+ if (urlRef) {
53
+ URL.revokeObjectURL(urlRef);
54
+ }
55
+ $.set(imageUrl, url, true);
56
+ urlRef = url;
57
+ },
58
+ ignore
59
+ );
60
+ return () => {
61
+ if (urlRef) {
62
+ URL.revokeObjectURL(urlRef);
63
+ urlRef = null;
64
+ } else {
65
+ task.abort({
66
+ code: PdfErrorCode.Cancelled,
67
+ message: "canceled render task"
68
+ });
69
+ }
70
+ };
71
+ });
72
+ function handleImageLoad() {
73
+ if (urlRef) {
74
+ URL.revokeObjectURL(urlRef);
75
+ urlRef = null;
76
+ }
77
+ }
78
+ var fragment = $.comment();
79
+ var node = $.first_child(fragment);
80
+ {
81
+ var consequent = ($$anchor2) => {
82
+ var img = root_1();
83
+ $.attribute_effect(img, () => ({
84
+ src: $.get(imageUrl),
85
+ onload: handleImageLoad,
86
+ ...props,
87
+ style: "width: 100%; height: 100%;",
88
+ class: $$props.class,
89
+ alt: ""
90
+ }));
91
+ $.replay_events(img);
92
+ $.append($$anchor2, img);
93
+ };
94
+ $.if(node, ($$render) => {
95
+ if ($.get(imageUrl)) $$render(consequent);
96
+ });
97
+ }
98
+ $.append($$anchor, fragment);
99
+ $.pop();
100
+ }
101
+ export {
102
+ RenderLayer,
103
+ useRenderCapability,
104
+ useRenderPlugin
105
+ };
106
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/svelte/hooks/use-render.ts","../../src/svelte/components/RenderLayer.svelte"],"sourcesContent":["import { useCapability, usePlugin } from '@embedpdf/core/svelte';\nimport { RenderPlugin } from '@embedpdf/plugin-render';\n\nexport const useRenderPlugin = () => usePlugin<RenderPlugin>(RenderPlugin.id);\nexport const useRenderCapability = () => useCapability<RenderPlugin>(RenderPlugin.id);\n","<script lang=\"ts\">\n import type { HTMLImgAttributes } from 'svelte/elements';\n import { ignore, type PdfDocumentObject, PdfErrorCode } from '@embedpdf/models';\n import { useRenderCapability, useRenderPlugin } from '../hooks';\n\n interface RenderLayerProps extends Omit<HTMLImgAttributes, 'style'> {\n pageIndex: number;\n scale?: number;\n dpr?: number;\n class?: string;\n }\n\n let { pageIndex, scale, dpr, class: propsClass, ...props }: RenderLayerProps = $props();\n\n const renderCapability = useRenderCapability();\n const renderPlugin = useRenderPlugin();\n\n const actualScale = $derived(scale ?? 1);\n\n let imageUrl = $state<string | null>(null);\n let urlRef: string | null = null;\n let refreshTick = $state(0);\n\n // Subscribe/unsubscribe whenever the plugin instance changes (not just on mount)\n $effect(() => {\n if (!renderPlugin.plugin) return; // nothing yet; try again when it appears\n return renderPlugin.plugin.onRefreshPages((pages) => {\n if (pages.includes(pageIndex)) {\n refreshTick++; // trigger a re-render\n }\n });\n });\n\n // Render whenever inputs change (pageIndex, scale, dpr, provides, refreshTick)\n $effect(() => {\n // Explicitly read refreshTick so the effect tracks it\n const _tick = refreshTick;\n\n const provides = renderCapability.provides;\n if (!provides) return;\n\n const task = provides.renderPage({\n pageIndex,\n options: { scaleFactor: actualScale, dpr: dpr || window.devicePixelRatio },\n });\n\n task.wait((blob) => {\n const url = URL.createObjectURL(blob);\n // revoke any previous URL before swapping to avoid leaks\n if (urlRef) {\n URL.revokeObjectURL(urlRef);\n }\n\n imageUrl = url;\n urlRef = url;\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 function handleImageLoad() {\n // Additional safety: once the image has loaded, revoke the last ref if still present\n if (urlRef) {\n URL.revokeObjectURL(urlRef);\n urlRef = null;\n }\n }\n</script>\n\n{#if imageUrl}\n <img\n src={imageUrl}\n onload={handleImageLoad}\n {...props}\n style=\"width: 100%; height: 100%;\"\n class={propsClass}\n alt=\"\"\n />\n{/if}\n"],"names":[],"mappings":";;;;;;AAGO,MAAM,kBAAkB,MAAM,UAAwB,aAAa,EAAE;AACrE,MAAM,sBAAsB,MAAM,cAA4B,aAAa,EAAE;;wCCJpF;;MAYqD,QAAK,EAAA,WAAA,SAAA;AAAA;;;;;;;;AAElD,QAAA,mBAAmB,oBAAmB;AACtC,QAAA,eAAe,gBAAe;AAE9B,QAAA,+CAAgC,CAAC;AAEnC,MAAA,mBAAiC,IAAI;AACrC,MAAA,SAAwB;AACxB,MAAA,sBAAqB,CAAC;AAG1B,IAAA,YAAc,MAAA;AACP,QAAA,CAAA,aAAa,OAAM;AACjB,WAAA,aAAa,OAAO,eAAc,CAAE,UAAU;UAC/C,MAAM,SAAqB,QAAA,SAAA,GAAA;;UAC7B;AAAA;AAAA;MACF;AAAA,KACD;AAAA,GACF;AAGD,IAAA,YAAc,MAAA;UAEE,WAAW;UAEnB,WAAW,iBAAiB;SAC7B,SAAQ;UAEP,OAAO,SAAS,WAAU;AAAA,MAC9B,WAAS,QAAA;AAAA,MACT,SAAO;AAAA,QAAI,mBAAa,WAAW;AAAA,QAAE,KAAG,QAAA,OAAS,OAAO;AAAA;;AAG1D,SAAK;AAAA,MAAM,CAAA,SAAS;AACZ,cAAA,MAAM,IAAI,gBAAgB,IAAI;AAEhC,YAAA,QAAQ;AACV,cAAI,gBAAgB,MAAM;AAAA,QAC5B;AAEA,UAAA,IAAA,UAAW,KAAG,IAAA;AACd,iBAAS;AAAA,MACV;AAAA,MAAE;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,IACD;AAAA,GACF;AAEQ,WAAA,kBAAkB;AAErB,QAAA,QAAQ;AACV,UAAI,gBAAgB,MAAM;AAC1B,eAAS;AAAA,IACX;AAAA,EACF;;;;;;;mBAKO,QAAQ;AAAA,gBACL;AAAA,WACJ;AAAA;;;;;;;;gBAJH,QAAQ,EAAA,UAAA,UAAA;AAAA;;;;AAFb;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@embedpdf/plugin-render",
3
- "version": "1.3.15",
3
+ "version": "1.4.0",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "main": "./dist/index.cjs",
@@ -26,23 +26,30 @@
26
26
  "types": "./dist/vue/index.d.ts",
27
27
  "import": "./dist/vue/index.js",
28
28
  "require": "./dist/vue/index.cjs"
29
+ },
30
+ "./svelte": {
31
+ "types": "./dist/svelte/index.d.ts",
32
+ "svelte": "./dist/svelte/index.js",
33
+ "import": "./dist/svelte/index.js",
34
+ "require": "./dist/svelte/index.cjs"
29
35
  }
30
36
  },
31
37
  "dependencies": {
32
- "@embedpdf/models": "1.3.15"
38
+ "@embedpdf/models": "1.4.0"
33
39
  },
34
40
  "devDependencies": {
35
41
  "@types/react": "^18.2.0",
36
42
  "typescript": "^5.0.0",
37
- "@embedpdf/build": "1.0.1",
38
- "@embedpdf/core": "1.3.15"
43
+ "@embedpdf/build": "1.1.0",
44
+ "@embedpdf/core": "1.4.0"
39
45
  },
40
46
  "peerDependencies": {
41
47
  "preact": "^10.26.4",
42
48
  "react": ">=16.8.0",
43
49
  "react-dom": ">=16.8.0",
44
50
  "vue": ">=3.2.0",
45
- "@embedpdf/core": "1.3.15"
51
+ "svelte": ">=5 <6",
52
+ "@embedpdf/core": "1.4.0"
46
53
  },
47
54
  "files": [
48
55
  "dist",
@@ -65,7 +72,8 @@
65
72
  "build:react": "vite build --mode react",
66
73
  "build:preact": "vite build --mode preact",
67
74
  "build:vue": "vite build --mode vue",
68
- "build": "pnpm run clean && concurrently -c auto -n base,react,preact,vue \"vite build --mode base\" \"vite build --mode react\" \"vite build --mode preact\" \"vite build --mode vue\"",
75
+ "build:svelte": "vite build --mode svelte",
76
+ "build": "pnpm run clean && concurrently -c auto -n base,react,preact,vue,svelte \"vite build --mode base\" \"vite build --mode react\" \"vite build --mode preact\" \"vite build --mode vue\" \"vite build --mode svelte\"",
69
77
  "clean": "rimraf dist",
70
78
  "lint": "eslint src --color",
71
79
  "lint:fix": "eslint src --color --fix"