svelte-pdf-view 0.1.7 → 0.1.9

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 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 src="/document.pdf" />
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 src={pdfSource} />
99
+ <PdfRenderer />
98
100
  </PdfViewer>
99
101
  ```
100
102
 
@@ -1,16 +1,17 @@
1
1
  <script lang="ts">
2
2
  import { BROWSER } from 'esm-env';
3
3
  import { onDestroy, onMount } from 'svelte';
4
- import { getPdfViewerContext, type PdfViewerActions } from './pdf-viewer/context.js';
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
- /** PDF source - can be a URL string, ArrayBuffer, Uint8Array, or Blob */
9
- export type PdfSource = string | ArrayBuffer | Uint8Array | Blob;
10
-
11
12
  interface Props {
12
- /** PDF source - URL string, ArrayBuffer, Uint8Array, or Blob */
13
- src: PdfSource;
13
+ /** PDF source - URL string, ArrayBuffer, Uint8Array, or Blob. If not provided, uses src from PdfViewer context. */
14
+ src?: PdfSource;
14
15
  /** Background color of the scroll container */
15
16
  backgroundColor?: string;
16
17
  /** Page shadow style */
@@ -26,7 +27,7 @@
26
27
  }
27
28
 
28
29
  let {
29
- src,
30
+ src: srcProp,
30
31
  backgroundColor = '#e8e8e8',
31
32
  pageShadow = '0 2px 8px rgba(0, 0, 0, 0.12), 0 1px 3px rgba(0, 0, 0, 0.08)',
32
33
  scrollbarTrackColor = '#f1f1f1',
@@ -35,7 +36,10 @@
35
36
  scrollbarWidth = '10px'
36
37
  }: Props = $props();
37
38
 
38
- const { state: viewerState, _registerRenderer } = getPdfViewerContext();
39
+ const { state: viewerState, src: contextSrc, _registerRenderer } = getPdfViewerContext();
40
+
41
+ // Use prop src if provided, otherwise fall back to context src
42
+ let src = $derived(srcProp ?? contextSrc);
39
43
 
40
44
  let hostEl: HTMLDivElement | undefined = $state();
41
45
  let shadowRoot: ShadowRoot | null = null;
@@ -161,7 +165,8 @@
161
165
  viewerState.searchCurrent = 0;
162
166
  viewerState.searchTotal = 0;
163
167
  }
164
- }
168
+ },
169
+ download: () => {} // Download is handled by PdfViewer, not renderer
165
170
  };
166
171
 
167
172
  onMount(async () => {
@@ -1,8 +1,7 @@
1
- /** PDF source - can be a URL string, ArrayBuffer, Uint8Array, or Blob */
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: PdfSource;
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 */
@@ -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>
@@ -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 { PdfSource } from './PdfRenderer.svelte';
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 './PdfRenderer.svelte';
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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "svelte-pdf-view",
3
- "version": "0.1.7",
3
+ "version": "0.1.9",
4
4
  "description": "A modern, modular PDF viewer component for Svelte 5. Built on PDF.js with TypeScript support",
5
5
  "author": "Louis Li",
6
6
  "license": "Apache-2.0",