svelte-pdf-view 0.1.7 → 0.1.8
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.
- package/README.md +4 -2
- package/dist/PdfRenderer.svelte +16 -8
- package/dist/PdfRenderer.svelte.d.ts +6 -5
- package/dist/PdfToolbar.svelte +9 -1
- package/dist/PdfViewer.svelte +47 -3
- package/dist/PdfViewer.svelte.d.ts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/pdf-viewer/context.d.ts +5 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -60,11 +60,13 @@ This is especially important in monorepo setups where Vite's optimizer may incor
|
|
|
60
60
|
<div style="height: 100vh;">
|
|
61
61
|
<PdfViewer src="/document.pdf">
|
|
62
62
|
<PdfToolbar />
|
|
63
|
-
<PdfRenderer
|
|
63
|
+
<PdfRenderer />
|
|
64
64
|
</PdfViewer>
|
|
65
65
|
</div>
|
|
66
66
|
```
|
|
67
67
|
|
|
68
|
+
The `src` prop is passed to `PdfViewer` and automatically shared with `PdfRenderer` via context - no need to pass it twice!
|
|
69
|
+
|
|
68
70
|
### Loading from Different Sources
|
|
69
71
|
|
|
70
72
|
```svelte
|
|
@@ -94,7 +96,7 @@ This is especially important in monorepo setups where Vite's optimizer may incor
|
|
|
94
96
|
|
|
95
97
|
<PdfViewer src={pdfSource}>
|
|
96
98
|
<PdfToolbar />
|
|
97
|
-
<PdfRenderer
|
|
99
|
+
<PdfRenderer />
|
|
98
100
|
</PdfViewer>
|
|
99
101
|
```
|
|
100
102
|
|
package/dist/PdfRenderer.svelte
CHANGED
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { BROWSER } from 'esm-env';
|
|
3
3
|
import { onDestroy, onMount } from 'svelte';
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
getPdfViewerContext,
|
|
6
|
+
type PdfViewerActions,
|
|
7
|
+
type PdfSource
|
|
8
|
+
} from './pdf-viewer/context.js';
|
|
5
9
|
import { getPdfJs } from './pdf-viewer/pdfjs-singleton.js';
|
|
6
10
|
import { rendererStyles } from './pdf-viewer/renderer-styles.js';
|
|
7
11
|
|
|
8
|
-
|
|
9
|
-
export type PdfSource
|
|
12
|
+
// Re-export PdfSource type for convenience
|
|
13
|
+
export type { PdfSource };
|
|
10
14
|
|
|
11
15
|
interface Props {
|
|
12
|
-
/** PDF source - URL string, ArrayBuffer, Uint8Array, or Blob */
|
|
13
|
-
src
|
|
16
|
+
/** PDF source - URL string, ArrayBuffer, Uint8Array, or Blob. If not provided, uses src from PdfViewer context. */
|
|
17
|
+
src?: PdfSource;
|
|
14
18
|
/** Background color of the scroll container */
|
|
15
19
|
backgroundColor?: string;
|
|
16
20
|
/** Page shadow style */
|
|
@@ -26,7 +30,7 @@
|
|
|
26
30
|
}
|
|
27
31
|
|
|
28
32
|
let {
|
|
29
|
-
src,
|
|
33
|
+
src: srcProp,
|
|
30
34
|
backgroundColor = '#e8e8e8',
|
|
31
35
|
pageShadow = '0 2px 8px rgba(0, 0, 0, 0.12), 0 1px 3px rgba(0, 0, 0, 0.08)',
|
|
32
36
|
scrollbarTrackColor = '#f1f1f1',
|
|
@@ -35,7 +39,10 @@
|
|
|
35
39
|
scrollbarWidth = '10px'
|
|
36
40
|
}: Props = $props();
|
|
37
41
|
|
|
38
|
-
const { state: viewerState, _registerRenderer } = getPdfViewerContext();
|
|
42
|
+
const { state: viewerState, src: contextSrc, _registerRenderer } = getPdfViewerContext();
|
|
43
|
+
|
|
44
|
+
// Use prop src if provided, otherwise fall back to context src
|
|
45
|
+
let src = $derived(srcProp ?? contextSrc);
|
|
39
46
|
|
|
40
47
|
let hostEl: HTMLDivElement | undefined = $state();
|
|
41
48
|
let shadowRoot: ShadowRoot | null = null;
|
|
@@ -161,7 +168,8 @@
|
|
|
161
168
|
viewerState.searchCurrent = 0;
|
|
162
169
|
viewerState.searchTotal = 0;
|
|
163
170
|
}
|
|
164
|
-
}
|
|
171
|
+
},
|
|
172
|
+
download: () => {} // Download is handled by PdfViewer, not renderer
|
|
165
173
|
};
|
|
166
174
|
|
|
167
175
|
onMount(async () => {
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
export type PdfSource = string | ArrayBuffer | Uint8Array | Blob;
|
|
1
|
+
import { type PdfSource } from './pdf-viewer/context.js';
|
|
3
2
|
interface Props {
|
|
4
|
-
/** PDF source - URL string, ArrayBuffer, Uint8Array, or Blob */
|
|
5
|
-
src
|
|
3
|
+
/** PDF source - URL string, ArrayBuffer, Uint8Array, or Blob. If not provided, uses src from PdfViewer context. */
|
|
4
|
+
src?: PdfSource;
|
|
6
5
|
/** Background color of the scroll container */
|
|
7
6
|
backgroundColor?: string;
|
|
8
7
|
/** Page shadow style */
|
|
@@ -16,6 +15,8 @@ interface Props {
|
|
|
16
15
|
/** Scrollbar width */
|
|
17
16
|
scrollbarWidth?: string;
|
|
18
17
|
}
|
|
19
|
-
declare const PdfRenderer: import("svelte").Component<Props, {
|
|
18
|
+
declare const PdfRenderer: import("svelte").Component<Props, {
|
|
19
|
+
PdfSource: typeof PdfSource;
|
|
20
|
+
}, "">;
|
|
20
21
|
type PdfRenderer = ReturnType<typeof PdfRenderer>;
|
|
21
22
|
export default PdfRenderer;
|
package/dist/PdfToolbar.svelte
CHANGED
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
RotateCw,
|
|
7
7
|
Search,
|
|
8
8
|
ChevronLeft,
|
|
9
|
-
ChevronRight
|
|
9
|
+
ChevronRight,
|
|
10
|
+
Download
|
|
10
11
|
} from '@lucide/svelte';
|
|
11
12
|
import { getPdfViewerContext } from './pdf-viewer/context.js';
|
|
12
13
|
|
|
@@ -114,6 +115,13 @@
|
|
|
114
115
|
<span class="match-info">{viewerState.searchCurrent}/{viewerState.searchTotal}</span>
|
|
115
116
|
{/if}
|
|
116
117
|
</div>
|
|
118
|
+
|
|
119
|
+
<!-- Download -->
|
|
120
|
+
<div class="pdf-toolbar-group">
|
|
121
|
+
<button onclick={() => actions.download()} aria-label="Download PDF" title="Download">
|
|
122
|
+
<Download size={18} />
|
|
123
|
+
</button>
|
|
124
|
+
</div>
|
|
117
125
|
</div>
|
|
118
126
|
|
|
119
127
|
<style>
|
package/dist/PdfViewer.svelte
CHANGED
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
import {
|
|
10
10
|
setPdfViewerContext,
|
|
11
11
|
type PdfViewerState,
|
|
12
|
-
type PdfViewerActions
|
|
12
|
+
type PdfViewerActions,
|
|
13
|
+
type PdfSource
|
|
13
14
|
} from './pdf-viewer/context.js';
|
|
14
|
-
import type { PdfSource } from './PdfRenderer.svelte';
|
|
15
15
|
|
|
16
16
|
interface Props {
|
|
17
17
|
/** PDF source - URL string, ArrayBuffer, Uint8Array, or Blob */
|
|
@@ -43,6 +43,48 @@
|
|
|
43
43
|
// Renderer actions - will be populated when renderer mounts
|
|
44
44
|
let rendererActions: PdfViewerActions | null = null;
|
|
45
45
|
|
|
46
|
+
// Download helper function
|
|
47
|
+
function downloadPdf(filename?: string) {
|
|
48
|
+
const downloadName =
|
|
49
|
+
filename ||
|
|
50
|
+
(typeof src === 'string' ? src.split('/').pop() : 'document.pdf') ||
|
|
51
|
+
'document.pdf';
|
|
52
|
+
|
|
53
|
+
if (typeof src === 'string') {
|
|
54
|
+
// URL - fetch and download
|
|
55
|
+
const link = document.createElement('a');
|
|
56
|
+
link.href = src;
|
|
57
|
+
link.download = downloadName;
|
|
58
|
+
link.click();
|
|
59
|
+
} else if (src instanceof Blob) {
|
|
60
|
+
// Blob - create object URL
|
|
61
|
+
const url = URL.createObjectURL(src);
|
|
62
|
+
const link = document.createElement('a');
|
|
63
|
+
link.href = url;
|
|
64
|
+
link.download = downloadName;
|
|
65
|
+
link.click();
|
|
66
|
+
URL.revokeObjectURL(url);
|
|
67
|
+
} else if (src instanceof ArrayBuffer) {
|
|
68
|
+
// ArrayBuffer
|
|
69
|
+
const blob = new Blob([src], { type: 'application/pdf' });
|
|
70
|
+
const url = URL.createObjectURL(blob);
|
|
71
|
+
const link = document.createElement('a');
|
|
72
|
+
link.href = url;
|
|
73
|
+
link.download = downloadName;
|
|
74
|
+
link.click();
|
|
75
|
+
URL.revokeObjectURL(url);
|
|
76
|
+
} else {
|
|
77
|
+
// Uint8Array - create a copy as ArrayBuffer
|
|
78
|
+
const blob = new Blob([new Uint8Array(src)], { type: 'application/pdf' });
|
|
79
|
+
const url = URL.createObjectURL(blob);
|
|
80
|
+
const link = document.createElement('a');
|
|
81
|
+
link.href = url;
|
|
82
|
+
link.download = downloadName;
|
|
83
|
+
link.click();
|
|
84
|
+
URL.revokeObjectURL(url);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
46
88
|
// Actions that proxy to the renderer
|
|
47
89
|
const actions: PdfViewerActions = {
|
|
48
90
|
zoomIn: () => rendererActions?.zoomIn(),
|
|
@@ -58,13 +100,15 @@
|
|
|
58
100
|
},
|
|
59
101
|
searchNext: () => rendererActions?.searchNext(),
|
|
60
102
|
searchPrevious: () => rendererActions?.searchPrevious(),
|
|
61
|
-
clearSearch: () => rendererActions?.clearSearch()
|
|
103
|
+
clearSearch: () => rendererActions?.clearSearch(),
|
|
104
|
+
download: downloadPdf
|
|
62
105
|
};
|
|
63
106
|
|
|
64
107
|
// Set up context
|
|
65
108
|
setPdfViewerContext({
|
|
66
109
|
state,
|
|
67
110
|
actions,
|
|
111
|
+
src,
|
|
68
112
|
_registerRenderer: (renderer: PdfViewerActions) => {
|
|
69
113
|
rendererActions = renderer;
|
|
70
114
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { default as Toolbar } from './PdfToolbar.svelte';
|
|
2
2
|
export { default as Renderer } from './PdfRenderer.svelte';
|
|
3
3
|
import type { Snippet } from 'svelte';
|
|
4
|
-
import type
|
|
4
|
+
import { type PdfSource } from './pdf-viewer/context.js';
|
|
5
5
|
interface Props {
|
|
6
6
|
/** PDF source - URL string, ArrayBuffer, Uint8Array, or Blob */
|
|
7
7
|
src: PdfSource;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { default as PdfViewer, Toolbar as PdfToolbar, Renderer as PdfRenderer } from './PdfViewer.svelte';
|
|
2
|
-
export type { PdfSource } from './
|
|
2
|
+
export type { PdfSource } from './pdf-viewer/context.js';
|
|
3
3
|
export { getPdfViewerContext, type PdfViewerState, type PdfViewerActions, type PdfViewerContext } from './pdf-viewer/context.js';
|
|
4
4
|
export { destroyPdfJs } from './pdf-viewer/pdfjs-singleton.js';
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
/** PDF source - can be a URL string, ArrayBuffer, Uint8Array, or Blob */
|
|
2
|
+
export type PdfSource = string | ArrayBuffer | Uint8Array | Blob;
|
|
1
3
|
export interface PdfViewerState {
|
|
2
4
|
loading: boolean;
|
|
3
5
|
error: string | null;
|
|
@@ -21,10 +23,13 @@ export interface PdfViewerActions {
|
|
|
21
23
|
searchNext: () => void;
|
|
22
24
|
searchPrevious: () => void;
|
|
23
25
|
clearSearch: () => void;
|
|
26
|
+
download: (filename?: string) => void;
|
|
24
27
|
}
|
|
25
28
|
export interface PdfViewerContext {
|
|
26
29
|
state: PdfViewerState;
|
|
27
30
|
actions: PdfViewerActions;
|
|
31
|
+
/** The PDF source - shared from PdfViewer to PdfRenderer */
|
|
32
|
+
src: PdfSource;
|
|
28
33
|
_registerRenderer: (renderer: PdfViewerActions) => void;
|
|
29
34
|
}
|
|
30
35
|
export declare function setPdfViewerContext(ctx: PdfViewerContext): void;
|