@eternalheart/vue-file-preview 1.1.4 → 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.
- package/README.md +370 -0
- package/README.zh-CN.md +370 -0
- package/lib/FilePreviewContent.vue.d.ts.map +1 -1
- package/lib/FilePreviewEmbed.vue.d.ts +1 -1
- package/lib/FilePreviewEmbed.vue.d.ts.map +1 -1
- package/lib/index.cjs +73 -17
- package/lib/index.cjs.map +1 -1
- package/lib/index.css +1 -1
- package/lib/index.mjs +33559 -10092
- package/lib/index.mjs.map +1 -1
- package/lib/renderers/{TextRenderer.vue.d.ts → Audio/index.vue.d.ts} +1 -1
- package/lib/renderers/Audio/index.vue.d.ts.map +1 -0
- package/lib/renderers/{MsgRenderer.vue.d.ts → Docx/index.vue.d.ts} +1 -1
- package/lib/renderers/Docx/index.vue.d.ts.map +1 -0
- package/lib/renderers/{EpubRenderer.vue.d.ts → Epub/index.vue.d.ts} +1 -1
- package/lib/renderers/Epub/index.vue.d.ts.map +1 -0
- package/lib/renderers/Epub/toolbar.d.ts +14 -0
- package/lib/renderers/Epub/toolbar.d.ts.map +1 -0
- package/lib/renderers/{ImageRenderer.vue.d.ts → Image/index.vue.d.ts} +1 -1
- package/lib/renderers/Image/index.vue.d.ts.map +1 -0
- package/lib/renderers/Image/toolbar.d.ts +13 -0
- package/lib/renderers/Image/toolbar.d.ts.map +1 -0
- package/lib/renderers/{AudioRenderer.vue.d.ts → Json/index.vue.d.ts} +1 -1
- package/lib/renderers/Json/index.vue.d.ts.map +1 -0
- package/lib/renderers/{XlsxRenderer.vue.d.ts → Markdown/index.vue.d.ts} +1 -1
- package/lib/renderers/Markdown/index.vue.d.ts.map +1 -0
- package/lib/renderers/{DocxRenderer.vue.d.ts → Msg/index.vue.d.ts} +1 -1
- package/lib/renderers/Msg/index.vue.d.ts.map +1 -0
- package/lib/renderers/{PdfRenderer.vue.d.ts → Pdf/index.vue.d.ts} +1 -1
- package/lib/renderers/Pdf/index.vue.d.ts.map +1 -0
- package/lib/renderers/Pdf/toolbar.d.ts +9 -0
- package/lib/renderers/Pdf/toolbar.d.ts.map +1 -0
- package/lib/renderers/{PptxRenderer.vue.d.ts → Pptx/index.vue.d.ts} +1 -1
- package/lib/renderers/Pptx/index.vue.d.ts.map +1 -0
- package/lib/renderers/Text/index.vue.d.ts +7 -0
- package/lib/renderers/Text/index.vue.d.ts.map +1 -0
- package/lib/renderers/{UnsupportedRenderer.vue.d.ts → Unsupported/index.vue.d.ts} +1 -1
- package/lib/renderers/Unsupported/index.vue.d.ts.map +1 -0
- package/lib/renderers/{VideoRenderer.vue.d.ts → Video/index.vue.d.ts} +1 -1
- package/lib/renderers/Video/index.vue.d.ts.map +1 -0
- package/lib/renderers/{MarkdownRenderer.vue.d.ts → Xlsx/index.vue.d.ts} +2 -1
- package/lib/renderers/Xlsx/index.vue.d.ts.map +1 -0
- package/lib/renderers/toolbar.types.d.ts +18 -0
- package/lib/renderers/toolbar.types.d.ts.map +1 -0
- package/package.json +4 -4
- package/lib/renderers/AudioRenderer.vue.d.ts.map +0 -1
- package/lib/renderers/DocxRenderer.vue.d.ts.map +0 -1
- package/lib/renderers/EpubRenderer.vue.d.ts.map +0 -1
- package/lib/renderers/ImageRenderer.vue.d.ts.map +0 -1
- package/lib/renderers/MarkdownRenderer.vue.d.ts.map +0 -1
- package/lib/renderers/MsgRenderer.vue.d.ts.map +0 -1
- package/lib/renderers/PdfRenderer.vue.d.ts.map +0 -1
- package/lib/renderers/PptxRenderer.vue.d.ts.map +0 -1
- package/lib/renderers/TextRenderer.vue.d.ts.map +0 -1
- package/lib/renderers/UnsupportedRenderer.vue.d.ts.map +0 -1
- package/lib/renderers/VideoRenderer.vue.d.ts.map +0 -1
- package/lib/renderers/XlsxRenderer.vue.d.ts.map +0 -1
package/README.md
ADDED
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
# Vue File Preview [](https://www.npmjs.com/package/@eternalheart/vue-file-preview)[](https://github.com/wh131462/file-preview/blob/master/LICENSE)[](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)
|