@eternalheart/vue-file-preview 1.1.5 → 1.2.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.
Files changed (57) hide show
  1. package/README.md +370 -0
  2. package/README.zh-CN.md +370 -0
  3. package/lib/FilePreviewContent.vue.d.ts.map +1 -1
  4. package/lib/FilePreviewEmbed.vue.d.ts +1 -1
  5. package/lib/FilePreviewEmbed.vue.d.ts.map +1 -1
  6. package/lib/index.cjs +73 -17
  7. package/lib/index.cjs.map +1 -1
  8. package/lib/index.css +1 -1
  9. package/lib/index.mjs +33192 -10177
  10. package/lib/index.mjs.map +1 -1
  11. package/lib/renderers/{TextRenderer.vue.d.ts → Audio/index.vue.d.ts} +1 -1
  12. package/lib/renderers/Audio/index.vue.d.ts.map +1 -0
  13. package/lib/renderers/{MsgRenderer.vue.d.ts → Docx/index.vue.d.ts} +1 -1
  14. package/lib/renderers/Docx/index.vue.d.ts.map +1 -0
  15. package/lib/renderers/{EpubRenderer.vue.d.ts → Epub/index.vue.d.ts} +1 -1
  16. package/lib/renderers/Epub/index.vue.d.ts.map +1 -0
  17. package/lib/renderers/Epub/toolbar.d.ts +14 -0
  18. package/lib/renderers/Epub/toolbar.d.ts.map +1 -0
  19. package/lib/renderers/{ImageRenderer.vue.d.ts → Image/index.vue.d.ts} +1 -1
  20. package/lib/renderers/Image/index.vue.d.ts.map +1 -0
  21. package/lib/renderers/Image/toolbar.d.ts +13 -0
  22. package/lib/renderers/Image/toolbar.d.ts.map +1 -0
  23. package/lib/renderers/{AudioRenderer.vue.d.ts → Json/index.vue.d.ts} +1 -1
  24. package/lib/renderers/Json/index.vue.d.ts.map +1 -0
  25. package/lib/renderers/{XlsxRenderer.vue.d.ts → Markdown/index.vue.d.ts} +1 -1
  26. package/lib/renderers/Markdown/index.vue.d.ts.map +1 -0
  27. package/lib/renderers/{DocxRenderer.vue.d.ts → Msg/index.vue.d.ts} +1 -1
  28. package/lib/renderers/Msg/index.vue.d.ts.map +1 -0
  29. package/lib/renderers/{PdfRenderer.vue.d.ts → Pdf/index.vue.d.ts} +1 -1
  30. package/lib/renderers/Pdf/index.vue.d.ts.map +1 -0
  31. package/lib/renderers/Pdf/toolbar.d.ts +9 -0
  32. package/lib/renderers/Pdf/toolbar.d.ts.map +1 -0
  33. package/lib/renderers/{PptxRenderer.vue.d.ts → Pptx/index.vue.d.ts} +1 -1
  34. package/lib/renderers/Pptx/index.vue.d.ts.map +1 -0
  35. package/lib/renderers/Text/index.vue.d.ts +7 -0
  36. package/lib/renderers/Text/index.vue.d.ts.map +1 -0
  37. package/lib/renderers/{UnsupportedRenderer.vue.d.ts → Unsupported/index.vue.d.ts} +1 -1
  38. package/lib/renderers/Unsupported/index.vue.d.ts.map +1 -0
  39. package/lib/renderers/{VideoRenderer.vue.d.ts → Video/index.vue.d.ts} +1 -1
  40. package/lib/renderers/Video/index.vue.d.ts.map +1 -0
  41. package/lib/renderers/{MarkdownRenderer.vue.d.ts → Xlsx/index.vue.d.ts} +2 -1
  42. package/lib/renderers/Xlsx/index.vue.d.ts.map +1 -0
  43. package/lib/renderers/toolbar.types.d.ts +18 -0
  44. package/lib/renderers/toolbar.types.d.ts.map +1 -0
  45. package/package.json +2 -2
  46. package/lib/renderers/AudioRenderer.vue.d.ts.map +0 -1
  47. package/lib/renderers/DocxRenderer.vue.d.ts.map +0 -1
  48. package/lib/renderers/EpubRenderer.vue.d.ts.map +0 -1
  49. package/lib/renderers/ImageRenderer.vue.d.ts.map +0 -1
  50. package/lib/renderers/MarkdownRenderer.vue.d.ts.map +0 -1
  51. package/lib/renderers/MsgRenderer.vue.d.ts.map +0 -1
  52. package/lib/renderers/PdfRenderer.vue.d.ts.map +0 -1
  53. package/lib/renderers/PptxRenderer.vue.d.ts.map +0 -1
  54. package/lib/renderers/TextRenderer.vue.d.ts.map +0 -1
  55. package/lib/renderers/UnsupportedRenderer.vue.d.ts.map +0 -1
  56. package/lib/renderers/VideoRenderer.vue.d.ts.map +0 -1
  57. package/lib/renderers/XlsxRenderer.vue.d.ts.map +0 -1
package/README.md ADDED
@@ -0,0 +1,370 @@
1
+ # Vue File Preview [![npm version](https://img.shields.io/npm/v/@eternalheart/vue-file-preview.svg)](https://www.npmjs.com/package/@eternalheart/vue-file-preview)[![license](https://img.shields.io/npm/l/@eternalheart/vue-file-preview.svg)](https://github.com/wh131462/file-preview/blob/master/LICENSE)[![downloads](https://img.shields.io/npm/dm/@eternalheart/vue-file-preview.svg)](https://www.npmjs.com/package/@eternalheart/vue-file-preview)
2
+
3
+ English | [简体中文](./README.zh-CN.md)
4
+
5
+ A modern, feature-rich file preview component for Vue 3 with support for images, videos, audio, PDFs, Office documents (Word, Excel, PowerPoint), Markdown, and code files.
6
+
7
+ ## ✨ Features
8
+
9
+ - 🎨 **Modern UI** - Apple-inspired minimalist design with glassmorphism effects
10
+ - 📁 **Multi-format Support** - Supports 20+ file formats
11
+ - 🪟 **Two Display Modes** - Full-screen modal **or** inline embedded preview
12
+ - 🖼️ **Powerful Image Viewer** - Zoom, rotate, drag, mouse wheel zoom
13
+ - 🎬 **Custom Video Player** - Built on Video.js, supports multiple video formats
14
+ - 🎵 **Custom Audio Player** - Beautiful audio control interface
15
+ - 📄 **PDF Viewer** - Pagination support
16
+ - 📊 **Office Documents Support** - Word, Excel, PowerPoint file preview
17
+ - 📝 **Markdown Rendering** - GitHub Flavored Markdown support
18
+ - 💻 **Code Highlighting** - Supports 40+ programming languages
19
+ - 📱 **Responsive Design** - Adapts to all screen sizes
20
+ - ⌨️ **Keyboard Navigation** - Arrow keys and ESC support
21
+ - 🎯 **Drag & Drop** - File upload via drag and drop
22
+
23
+ ## 📦 Installation
24
+
25
+ ```bash
26
+ # Using npm
27
+ npm install @eternalheart/vue-file-preview
28
+
29
+ # Using yarn
30
+ yarn add @eternalheart/vue-file-preview
31
+
32
+ # Using pnpm
33
+ pnpm add @eternalheart/vue-file-preview
34
+ ```
35
+
36
+ **Important:** You also need to import the CSS file:
37
+
38
+ ```ts
39
+ import '@eternalheart/vue-file-preview/style.css';
40
+ ```
41
+
42
+ ### PDF.js Configuration (Optional)
43
+
44
+ If you need to preview PDF files, it's recommended to configure PDF.js to use local static files for better performance and stability:
45
+
46
+ #### Method 1: Use CDN (Default)
47
+
48
+ By default, the component automatically uses unpkg CDN to load PDF.js, no additional configuration needed.
49
+
50
+ #### Method 2: Use Local Static Files (Recommended for Production)
51
+
52
+ 1. Copy PDF.js files to your public directory:
53
+
54
+ ```bash
55
+ cp -r node_modules/pdfjs-dist/build/pdf.worker.min.mjs public/pdfjs/
56
+ cp -r node_modules/pdfjs-dist/cmaps public/pdfjs/
57
+ ```
58
+
59
+ 2. Configure PDF.js in your app entry:
60
+
61
+ ```ts
62
+ import * as pdfjsLib from 'pdfjs-dist/build/pdf.mjs';
63
+ import { configurePdfWorker } from '@eternalheart/vue-file-preview';
64
+
65
+ configurePdfWorker(pdfjsLib, {
66
+ workerSrc: '/pdfjs/pdf.worker.min.mjs',
67
+ cMapUrl: '/pdfjs/cmaps/',
68
+ cMapPacked: true,
69
+ });
70
+ ```
71
+
72
+ #### Auto-copy with Vite (Recommended)
73
+
74
+ Configure auto-copy in `vite.config.ts`:
75
+
76
+ ```ts
77
+ import { defineConfig } from 'vite';
78
+ import { viteStaticCopy } from 'vite-plugin-static-copy';
79
+
80
+ export default defineConfig({
81
+ plugins: [
82
+ viteStaticCopy({
83
+ targets: [
84
+ {
85
+ src: 'node_modules/pdfjs-dist/build/pdf.worker.min.mjs',
86
+ dest: 'pdfjs'
87
+ },
88
+ {
89
+ src: 'node_modules/pdfjs-dist/cmaps',
90
+ dest: 'pdfjs'
91
+ }
92
+ ]
93
+ })
94
+ ]
95
+ });
96
+ ```
97
+
98
+ ## 🚀 Quick Start
99
+
100
+ ### Basic Usage
101
+
102
+ ```vue
103
+ <script setup lang="ts">
104
+ import { ref } from 'vue';
105
+ import { FilePreviewModal } from '@eternalheart/vue-file-preview';
106
+ import '@eternalheart/vue-file-preview/style.css';
107
+
108
+ const files = ref<File[]>([]);
109
+ const currentIndex = ref(0);
110
+ const isOpen = ref(false);
111
+
112
+ const handleFileSelect = (e: Event) => {
113
+ const file = (e.target as HTMLInputElement).files?.[0];
114
+ if (file) {
115
+ files.value = [file];
116
+ currentIndex.value = 0;
117
+ isOpen.value = true;
118
+ }
119
+ };
120
+ </script>
121
+
122
+ <template>
123
+ <input type="file" @change="handleFileSelect" />
124
+
125
+ <FilePreviewModal
126
+ :files="files"
127
+ :current-index="currentIndex"
128
+ :is-open="isOpen"
129
+ @close="isOpen = false"
130
+ @navigate="currentIndex = $event"
131
+ />
132
+ </template>
133
+ ```
134
+
135
+ ### Multiple Input Types
136
+
137
+ The component supports three types of file inputs:
138
+
139
+ ```vue
140
+ <script setup lang="ts">
141
+ import { ref } from 'vue';
142
+ import { FilePreviewModal, type PreviewFileInput } from '@eternalheart/vue-file-preview';
143
+ import '@eternalheart/vue-file-preview/style.css';
144
+
145
+ const files: PreviewFileInput[] = [
146
+ // 1. Native File object
147
+ file1,
148
+
149
+ // 2. HTTP URL string
150
+ 'https://example.com/image.jpg',
151
+
152
+ // 3. File object with metadata
153
+ {
154
+ name: 'document.pdf',
155
+ type: 'application/pdf',
156
+ url: '/path/to/document.pdf',
157
+ size: 1024,
158
+ },
159
+ ];
160
+
161
+ const isOpen = ref(true);
162
+ </script>
163
+
164
+ <template>
165
+ <FilePreviewModal
166
+ :files="files"
167
+ :current-index="0"
168
+ :is-open="isOpen"
169
+ @close="isOpen = false"
170
+ />
171
+ </template>
172
+ ```
173
+
174
+ ### Embedded Mode (`FilePreviewEmbed`)
175
+
176
+ Besides the full-screen modal, the library also ships an **embedded** variant that renders the preview inline inside any container. Useful for detail panels, side-by-side layouts, dashboards, etc.
177
+
178
+ ```vue
179
+ <script setup lang="ts">
180
+ import { ref } from 'vue';
181
+ import { FilePreviewEmbed } from '@eternalheart/vue-file-preview';
182
+ import '@eternalheart/vue-file-preview/style.css';
183
+
184
+ const index = ref(0);
185
+
186
+ const files = [
187
+ 'https://example.com/image.jpg',
188
+ { name: 'document.pdf', type: 'application/pdf', url: '/doc.pdf' },
189
+ ];
190
+ </script>
191
+
192
+ <template>
193
+ <div style="width: 100%; height: 520px">
194
+ <FilePreviewEmbed
195
+ :files="files"
196
+ :current-index="index"
197
+ @navigate="index = $event"
198
+ />
199
+ </div>
200
+ </template>
201
+ ```
202
+
203
+ Differences from `FilePreviewModal`:
204
+
205
+ - No teleport, no full-screen overlay, no `isOpen` / `@close`
206
+ - Does **not** show the close button in the toolbar
207
+ - Keyboard navigation (←/→) is scoped to the embed container (focus-based)
208
+ - Size defaults to `width: 100%; height: 100%`; override via `width` / `height` props
209
+
210
+ ```vue
211
+ <!-- Explicit size -->
212
+ <FilePreviewEmbed :files="files" :width="800" :height="500" />
213
+ ```
214
+
215
+ ## 📖 Supported File Formats
216
+
217
+ ### Images
218
+ - **Formats**: JPG, PNG, GIF, WebP, SVG, BMP, ICO
219
+ - **Features**: Zoom (0.1x - 10x), rotate, drag, mouse wheel zoom, double-click reset
220
+
221
+ ### Videos
222
+ - **Formats**: MP4, WebM, OGG, MOV, AVI, MKV, M4V, 3GP, FLV
223
+ - **Features**: Custom player, progress control, volume adjustment, fullscreen
224
+
225
+ ### Audio
226
+ - **Formats**: MP3, WAV, OGG, M4A, AAC, FLAC
227
+ - **Features**: Custom player, progress bar, volume control, skip forward/backward
228
+
229
+ ### Documents
230
+ - **PDF**: Pagination, zoom
231
+ - **Word**: DOCX format support
232
+ - **Excel**: XLSX format support
233
+ - **PowerPoint**: PPTX/PPT format support, slide preview
234
+
235
+ ### Code & Text
236
+ - **Markdown**: GitHub Flavored Markdown, code highlighting
237
+ - **Code Files**: JS, TS, Python, Java, C++, Go, Rust, and 40+ languages
238
+ - **Text Files**: TXT, LOG, CSV, JSON, YAML, XML, etc.
239
+
240
+ ## 🎮 API Reference
241
+
242
+ ### FilePreviewModal Props
243
+
244
+ | Prop | Type | Required | Description |
245
+ |------|------|----------|-------------|
246
+ | `files` | `PreviewFileInput[]` | ✅ | Array of files (supports File objects, file objects, or URL strings) |
247
+ | `currentIndex` | `number` | ✅ | Current file index |
248
+ | `isOpen` | `boolean` | ✅ | Whether the modal is open |
249
+ | `customRenderers` | `CustomRenderer[]` | ❌ | Custom renderers for specific file types |
250
+
251
+ ### FilePreviewModal Events
252
+
253
+ | Event | Payload | Description |
254
+ |-------|---------|-------------|
255
+ | `close` | - | Emitted when the modal should close |
256
+ | `navigate` | `number` | Emitted when navigating to a different file index |
257
+
258
+ ### FilePreviewEmbed Props
259
+
260
+ | Prop | Type | Required | Default | Description |
261
+ |------|------|----------|---------|-------------|
262
+ | `files` | `PreviewFileInput[]` | ✅ | - | Array of files |
263
+ | `currentIndex` | `number` | ❌ | `0` | Current file index |
264
+ | `customRenderers` | `CustomRenderer[]` | ❌ | - | Custom renderers |
265
+ | `width` | `number \| string` | ❌ | `'100%'` | Container width |
266
+ | `height` | `number \| string` | ❌ | `'100%'` | Container height |
267
+
268
+ ### FilePreviewEmbed Events
269
+
270
+ | Event | Payload | Description |
271
+ |-------|---------|-------------|
272
+ | `navigate` | `number` | Emitted when navigating to a different file index |
273
+
274
+ ### FilePreviewContent (advanced)
275
+
276
+ Both `FilePreviewModal` and `FilePreviewEmbed` are thin wrappers around the exported lower-level `FilePreviewContent` component. Use it directly when building a fully custom wrapper:
277
+
278
+ ```vue
279
+ <FilePreviewContent
280
+ mode="embed"
281
+ :files="files"
282
+ :current-index="index"
283
+ @navigate="index = $event"
284
+ />
285
+ ```
286
+
287
+ ### File Type Definitions
288
+
289
+ ```typescript
290
+ // Supports three types of file input
291
+ type PreviewFileInput = File | PreviewFileLink | string;
292
+
293
+ // 1. Native File object (Browser File API)
294
+ const file: File = ...;
295
+
296
+ // 2. File object
297
+ interface PreviewFileLink {
298
+ id?: string; // Optional unique identifier
299
+ name: string; // File name
300
+ type: string; // MIME type
301
+ url: string; // File URL (supports blob URLs and HTTP URLs)
302
+ size?: number; // File size in bytes
303
+ }
304
+
305
+ // 3. HTTP URL string
306
+ const url: string = 'https://example.com/file.pdf';
307
+ ```
308
+
309
+ ## ⌨️ Keyboard Shortcuts
310
+
311
+ - `ESC` - Close preview
312
+ - `←` - Previous file
313
+ - `→` - Next file
314
+ - `Mouse Wheel` - Zoom image (image preview only)
315
+
316
+ ## 📚 Documentation
317
+
318
+ - [Full Documentation](https://wh131462.github.io/file-preview/docs/)
319
+ - [Vue Demo](https://wh131462.github.io/file-preview/vue/)
320
+ - [React Demo](https://wh131462.github.io/file-preview/)
321
+
322
+ ## 📦 Package Information
323
+
324
+ ### Peer Dependencies
325
+
326
+ - `vue`: ^3.4.0
327
+
328
+ ### Exports
329
+
330
+ ```json
331
+ {
332
+ ".": {
333
+ "types": "./lib/index.d.ts",
334
+ "import": "./lib/index.mjs",
335
+ "require": "./lib/index.cjs"
336
+ },
337
+ "./style.css": "./lib/index.css"
338
+ }
339
+ ```
340
+
341
+ ## 🛠️ Development
342
+
343
+ ```bash
344
+ # Clone repository
345
+ git clone https://github.com/wh131462/file-preview.git
346
+
347
+ # Install dependencies
348
+ pnpm install
349
+
350
+ # Start dev server (Vue demo app)
351
+ pnpm dev:vue-example
352
+
353
+ # Build library
354
+ pnpm build:vue
355
+ ```
356
+
357
+ ## 📄 License
358
+
359
+ [MIT](./LICENSE) © [EternalHeart](https://github.com/wh131462)
360
+
361
+ ## 🤝 Contributing
362
+
363
+ Issues and Pull Requests are welcome!
364
+
365
+ ## 🔗 Links
366
+
367
+ - [GitHub](https://github.com/wh131462/file-preview)
368
+ - [npm](https://www.npmjs.com/package/@eternalheart/vue-file-preview)
369
+ - [Vue Demo](https://wh131462.github.io/file-preview/vue/)
370
+ - [Issue Tracker](https://github.com/wh131462/file-preview/issues)