@eternalheart/vue-file-preview 1.1.5 → 1.3.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 (90) hide show
  1. package/README.md +394 -0
  2. package/README.zh-CN.md +394 -0
  3. package/lib/FilePreviewContent.vue.d.ts +10 -1
  4. package/lib/FilePreviewContent.vue.d.ts.map +1 -1
  5. package/lib/FilePreviewEmbed.vue.d.ts +8 -2
  6. package/lib/FilePreviewEmbed.vue.d.ts.map +1 -1
  7. package/lib/FilePreviewModal.vue.d.ts +7 -1
  8. package/lib/FilePreviewModal.vue.d.ts.map +1 -1
  9. package/lib/components/ResizableSplit.vue.d.ts +35 -0
  10. package/lib/components/ResizableSplit.vue.d.ts.map +1 -0
  11. package/lib/composables/useTranslator.d.ts +14 -0
  12. package/lib/composables/useTranslator.d.ts.map +1 -0
  13. package/lib/i18n/localeKey.d.ts +8 -0
  14. package/lib/i18n/localeKey.d.ts.map +1 -0
  15. package/lib/index.cjs +248 -17
  16. package/lib/index.cjs.map +1 -1
  17. package/lib/index.css +1 -1
  18. package/lib/index.d.ts +3 -0
  19. package/lib/index.d.ts.map +1 -1
  20. package/lib/index.mjs +32077 -16316
  21. package/lib/index.mjs.map +1 -1
  22. package/lib/renderers/{TextRenderer.vue.d.ts → Audio/index.vue.d.ts} +1 -1
  23. package/lib/renderers/Audio/index.vue.d.ts.map +1 -0
  24. package/lib/renderers/{AudioRenderer.vue.d.ts → Csv/index.vue.d.ts} +1 -1
  25. package/lib/renderers/Csv/index.vue.d.ts.map +1 -0
  26. package/lib/renderers/{MsgRenderer.vue.d.ts → Docx/index.vue.d.ts} +1 -1
  27. package/lib/renderers/Docx/index.vue.d.ts.map +1 -0
  28. package/lib/renderers/{EpubRenderer.vue.d.ts → Epub/index.vue.d.ts} +3 -3
  29. package/lib/renderers/Epub/index.vue.d.ts.map +1 -0
  30. package/lib/renderers/Epub/toolbar.d.ts +16 -0
  31. package/lib/renderers/Epub/toolbar.d.ts.map +1 -0
  32. package/lib/renderers/{ImageRenderer.vue.d.ts → Image/index.vue.d.ts} +1 -1
  33. package/lib/renderers/Image/index.vue.d.ts.map +1 -0
  34. package/lib/renderers/Image/toolbar.d.ts +15 -0
  35. package/lib/renderers/Image/toolbar.d.ts.map +1 -0
  36. package/lib/renderers/Json/index.vue.d.ts +9 -0
  37. package/lib/renderers/Json/index.vue.d.ts.map +1 -0
  38. package/lib/renderers/{XlsxRenderer.vue.d.ts → Markdown/index.vue.d.ts} +1 -1
  39. package/lib/renderers/Markdown/index.vue.d.ts.map +1 -0
  40. package/lib/renderers/Mobi/index.vue.d.ts +19 -0
  41. package/lib/renderers/Mobi/index.vue.d.ts.map +1 -0
  42. package/lib/renderers/Mobi/toolbar.d.ts +16 -0
  43. package/lib/renderers/Mobi/toolbar.d.ts.map +1 -0
  44. package/lib/renderers/{DocxRenderer.vue.d.ts → Msg/index.vue.d.ts} +1 -1
  45. package/lib/renderers/Msg/index.vue.d.ts.map +1 -0
  46. package/lib/renderers/{PdfRenderer.vue.d.ts → Pdf/index.vue.d.ts} +1 -1
  47. package/lib/renderers/Pdf/index.vue.d.ts.map +1 -0
  48. package/lib/renderers/Pdf/toolbar.d.ts +11 -0
  49. package/lib/renderers/Pdf/toolbar.d.ts.map +1 -0
  50. package/lib/renderers/{PptxRenderer.vue.d.ts → Pptx/index.vue.d.ts} +1 -1
  51. package/lib/renderers/Pptx/index.vue.d.ts.map +1 -0
  52. package/lib/renderers/{MarkdownRenderer.vue.d.ts → Subtitle/index.vue.d.ts} +2 -1
  53. package/lib/renderers/Subtitle/index.vue.d.ts.map +1 -0
  54. package/lib/renderers/Text/index.vue.d.ts +12 -0
  55. package/lib/renderers/Text/index.vue.d.ts.map +1 -0
  56. package/lib/renderers/Text/toolbar.d.ts +12 -0
  57. package/lib/renderers/Text/toolbar.d.ts.map +1 -0
  58. package/lib/renderers/{UnsupportedRenderer.vue.d.ts → Unsupported/index.vue.d.ts} +1 -1
  59. package/lib/renderers/Unsupported/index.vue.d.ts.map +1 -0
  60. package/lib/renderers/{VideoRenderer.vue.d.ts → Video/index.vue.d.ts} +1 -1
  61. package/lib/renderers/Video/index.vue.d.ts.map +1 -0
  62. package/lib/renderers/Xlsx/index.vue.d.ts +7 -0
  63. package/lib/renderers/Xlsx/index.vue.d.ts.map +1 -0
  64. package/lib/renderers/Xml/index.vue.d.ts +7 -0
  65. package/lib/renderers/Xml/index.vue.d.ts.map +1 -0
  66. package/lib/renderers/Zip/TreeItem.vue.d.ts +24 -0
  67. package/lib/renderers/Zip/TreeItem.vue.d.ts.map +1 -0
  68. package/lib/renderers/Zip/index.vue.d.ts +15 -0
  69. package/lib/renderers/Zip/index.vue.d.ts.map +1 -0
  70. package/lib/renderers/Zip/toolbar.d.ts +13 -0
  71. package/lib/renderers/Zip/toolbar.d.ts.map +1 -0
  72. package/lib/renderers/toolbar.types.d.ts +18 -0
  73. package/lib/renderers/toolbar.types.d.ts.map +1 -0
  74. package/package.json +6 -4
  75. package/lib/__vite-browser-external-BcPniuRQ.cjs +0 -2
  76. package/lib/__vite-browser-external-BcPniuRQ.cjs.map +0 -1
  77. package/lib/__vite-browser-external-DYxpcVy9.js +0 -5
  78. package/lib/__vite-browser-external-DYxpcVy9.js.map +0 -1
  79. package/lib/renderers/AudioRenderer.vue.d.ts.map +0 -1
  80. package/lib/renderers/DocxRenderer.vue.d.ts.map +0 -1
  81. package/lib/renderers/EpubRenderer.vue.d.ts.map +0 -1
  82. package/lib/renderers/ImageRenderer.vue.d.ts.map +0 -1
  83. package/lib/renderers/MarkdownRenderer.vue.d.ts.map +0 -1
  84. package/lib/renderers/MsgRenderer.vue.d.ts.map +0 -1
  85. package/lib/renderers/PdfRenderer.vue.d.ts.map +0 -1
  86. package/lib/renderers/PptxRenderer.vue.d.ts.map +0 -1
  87. package/lib/renderers/TextRenderer.vue.d.ts.map +0 -1
  88. package/lib/renderers/UnsupportedRenderer.vue.d.ts.map +0 -1
  89. package/lib/renderers/VideoRenderer.vue.d.ts.map +0 -1
  90. package/lib/renderers/XlsxRenderer.vue.d.ts.map +0 -1
package/README.md ADDED
@@ -0,0 +1,394 @@
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
+ - **Config/Logs**: YAML, TOML, INI, ENV, LOG, DIFF, PATCH, etc.
239
+
240
+ ### Structured Data
241
+ - **JSON**: Auto formatting + syntax highlighting
242
+ - **CSV/TSV**: Zero-dependency parser, table view with headers and row/column stats
243
+ - **XML**: `DOMParser` validation + pretty print + syntax highlighting
244
+
245
+ ### Subtitles & Lyrics
246
+ - **SRT / WebVTT**: Zero-dependency parser, structured cue list (index, time range, text)
247
+ - **LRC / Enhanced LRC**: Lyric files with `[mm:ss.xx]` line stamps (and inline `<mm:ss.xx>` per-word stamps for ELRC), with `[ti:][ar:][al:]` metadata header
248
+ - **ASS / SSA**: Advanced SubStation Alpha — extracts Dialogue events, strips `\N` `\h` and `{...}` override codes, surfaces Style names
249
+ - **TTML / DFXP**: W3C / Apple Music XML captions, supports `begin` / `end` / `dur` and `<br/>`
250
+
251
+ ### Archives
252
+ - **ZIP**: Tree view + inline preview for text/code/image entries, download fallback for other types
253
+
254
+ ### Outlook Email
255
+ - **MSG**: Headers, body rendering, attachment list
256
+
257
+ ### E-books
258
+ - **EPUB**: Chapter navigation, pagination
259
+
260
+ ## 🎮 API Reference
261
+
262
+ ### FilePreviewModal Props
263
+
264
+ | Prop | Type | Required | Description |
265
+ |------|------|----------|-------------|
266
+ | `files` | `PreviewFileInput[]` | ✅ | Array of files (supports File objects, file objects, or URL strings) |
267
+ | `currentIndex` | `number` | ✅ | Current file index |
268
+ | `isOpen` | `boolean` | ✅ | Whether the modal is open |
269
+ | `customRenderers` | `CustomRenderer[]` | ❌ | Custom renderers for specific file types |
270
+ | `locale` | `Locale` | ❌ | UI language (`'zh-CN'` default, `'en-US'` built-in) |
271
+ | `messages` | `Partial<Record<Locale, Partial<Messages>>>` | ❌ | Custom translation overrides |
272
+
273
+ ### FilePreviewModal Events
274
+
275
+ | Event | Payload | Description |
276
+ |-------|---------|-------------|
277
+ | `close` | - | Emitted when the modal should close |
278
+ | `navigate` | `number` | Emitted when navigating to a different file index |
279
+
280
+ ### FilePreviewEmbed Props
281
+
282
+ | Prop | Type | Required | Default | Description |
283
+ |------|------|----------|---------|-------------|
284
+ | `files` | `PreviewFileInput[]` | ✅ | - | Array of files |
285
+ | `currentIndex` | `number` | ❌ | `0` | Current file index |
286
+ | `customRenderers` | `CustomRenderer[]` | ❌ | - | Custom renderers |
287
+ | `width` | `number \| string` | ❌ | `'100%'` | Container width |
288
+ | `height` | `number \| string` | ❌ | `'100%'` | Container height |
289
+ | `locale` | `Locale` | ❌ | `'zh-CN'` | UI language (`'zh-CN'` or `'en-US'`) |
290
+ | `messages` | `Partial<Record<Locale, Partial<Messages>>>` | ❌ | - | Custom translation overrides |
291
+
292
+ ### FilePreviewEmbed Events
293
+
294
+ | Event | Payload | Description |
295
+ |-------|---------|-------------|
296
+ | `navigate` | `number` | Emitted when navigating to a different file index |
297
+
298
+ ### FilePreviewContent (advanced)
299
+
300
+ Both `FilePreviewModal` and `FilePreviewEmbed` are thin wrappers around the exported lower-level `FilePreviewContent` component. Use it directly when building a fully custom wrapper:
301
+
302
+ ```vue
303
+ <FilePreviewContent
304
+ mode="embed"
305
+ :files="files"
306
+ :current-index="index"
307
+ @navigate="index = $event"
308
+ />
309
+ ```
310
+
311
+ ### File Type Definitions
312
+
313
+ ```typescript
314
+ // Supports three types of file input
315
+ type PreviewFileInput = File | PreviewFileLink | string;
316
+
317
+ // 1. Native File object (Browser File API)
318
+ const file: File = ...;
319
+
320
+ // 2. File object
321
+ interface PreviewFileLink {
322
+ id?: string; // Optional unique identifier
323
+ name: string; // File name
324
+ type: string; // MIME type
325
+ url: string; // File URL (supports blob URLs and HTTP URLs)
326
+ size?: number; // File size in bytes
327
+ }
328
+
329
+ // 3. HTTP URL string
330
+ const url: string = 'https://example.com/file.pdf';
331
+ ```
332
+
333
+ ## ⌨️ Keyboard Shortcuts
334
+
335
+ - `ESC` - Close preview
336
+ - `←` - Previous file
337
+ - `→` - Next file
338
+ - `Mouse Wheel` - Zoom image (image preview only)
339
+
340
+ ## 📚 Documentation
341
+
342
+ - [Full Documentation](https://wh131462.github.io/file-preview/docs/)
343
+ - [Vue Demo](https://wh131462.github.io/file-preview/vue/)
344
+ - [React Demo](https://wh131462.github.io/file-preview/)
345
+
346
+ ## 📦 Package Information
347
+
348
+ ### Peer Dependencies
349
+
350
+ - `vue`: ^3.4.0
351
+
352
+ ### Exports
353
+
354
+ ```json
355
+ {
356
+ ".": {
357
+ "types": "./lib/index.d.ts",
358
+ "import": "./lib/index.mjs",
359
+ "require": "./lib/index.cjs"
360
+ },
361
+ "./style.css": "./lib/index.css"
362
+ }
363
+ ```
364
+
365
+ ## 🛠️ Development
366
+
367
+ ```bash
368
+ # Clone repository
369
+ git clone https://github.com/wh131462/file-preview.git
370
+
371
+ # Install dependencies
372
+ pnpm install
373
+
374
+ # Start dev server (Vue demo app)
375
+ pnpm dev:vue-example
376
+
377
+ # Build library
378
+ pnpm build:vue
379
+ ```
380
+
381
+ ## 📄 License
382
+
383
+ [MIT](./LICENSE) © [EternalHeart](https://github.com/wh131462)
384
+
385
+ ## 🤝 Contributing
386
+
387
+ Issues and Pull Requests are welcome!
388
+
389
+ ## 🔗 Links
390
+
391
+ - [GitHub](https://github.com/wh131462/file-preview)
392
+ - [npm](https://www.npmjs.com/package/@eternalheart/vue-file-preview)
393
+ - [Vue Demo](https://wh131462.github.io/file-preview/vue/)
394
+ - [Issue Tracker](https://github.com/wh131462/file-preview/issues)