vue-office-pdf 0.0.1-beta

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 ADDED
@@ -0,0 +1,844 @@
1
+ # Vue3 Pdf App
2
+
3
+ Vue 3 PDF viewer based on Mozilla's PDFJS and built with vite. Forked from https://github.com/stellR42/vue3-pdf-app.
4
+
5
+ Chinese is the default language for panel.
6
+
7
+ [![npm (tag)](https://img.shields.io/npm/v/vue3-pdf-app/latest)](https://www.npmjs.com/package/vue3-pdf-app)
8
+
9
+ 100% PDFJS functionality:
10
+
11
+ - zoom
12
+ - open
13
+ - print
14
+ - download
15
+ - rotate
16
+ - text selection
17
+ - search panel
18
+ - pdf document password
19
+ - thumbnail, outline, attachments, annotation layers
20
+
21
+ Easily localized configurable toolbar
22
+
23
+ Toolbar custom UI
24
+
25
+ Cross-browser support
26
+
27
+ Color customization
28
+
29
+ Buttons icons customization
30
+
31
+ Light/dark themes
32
+
33
+ Built-in typescript support
34
+
35
+ ![pdf sample](./readme/sample.png "Pdf expample")
36
+
37
+ [Live demo](https://codesandbox.io/s/vue3-pdf-app-wnh9zs?file=/src/App.vue)
38
+
39
+ [FAQ](https://github.com/stellr42/vue3-pdf-app/blob/master/FAQ.md)
40
+
41
+ ## Installation
42
+ ```
43
+ npm install vue3-pdf-app
44
+ ```
45
+ ## Usage
46
+
47
+ ```vue
48
+ <template>
49
+ <!-- used `style="height: 100vh;"` because without it in the Firefox 89 and Chrome 91 (June 2021) the `vue-pdf-app` is not rendering on the page, just empty space without any errors (since `vue-pdf-app` does not have height and it is the top tag in the generated markup ) -->
50
+ <!-- or you can just wrap `vue-pdf-app` in <div> tag and set height for it via CSS (like in `Script tag (unpkg)` example below) -->
51
+ <vue-pdf-app style="height: 100vh;" pdf="https://file-examples-com.github.io/uploads/2017/10/file-example_PDF_1MB.pdf"></vue-pdf-app>
52
+ </template>
53
+
54
+ <script>
55
+ import VuePdfApp from "vue3-pdf-app";
56
+ // import this to use default icons for buttons
57
+ import "vue3-pdf-app/dist/icons/main.css";
58
+
59
+ export default {
60
+ components: {
61
+ VuePdfApp
62
+ }
63
+ };
64
+ </script>
65
+ ```
66
+
67
+ ## API
68
+
69
+ ### :pdf
70
+
71
+ - Type: `string | null | ArrayBuffer | TypedArray`
72
+ - Required: `false`
73
+ - Usage:
74
+
75
+ ```vue
76
+ <vue-pdf-app pdf="https://example.com/sample.pdf" />
77
+ <vue-pdf-app :pdf="ArrayBuffer" />
78
+ ```
79
+
80
+ ### :title
81
+
82
+ - Description: `true` renames document title to pdf file name.
83
+ - Type: `boolean`
84
+ - Required: `false`
85
+ - Default: `false`
86
+ - Usage:
87
+
88
+ ```vue
89
+ <vue-pdf-app :title="true" />
90
+ ```
91
+
92
+ ### :theme.sync
93
+
94
+ - Type: `"dark" | "light"`
95
+ - Required: `false`
96
+ - Usage:
97
+
98
+ ```vue
99
+ <vue-pdf-app theme="dark" />
100
+ <vue-pdf-app :theme="theme" />
101
+ <vue-pdf-app :theme.sync="theme" />
102
+ ```
103
+
104
+ ### :fileName
105
+
106
+ - Description: when pdf is passed like an array buffer default download file name is `document.pdf`. Set this prop to override it.
107
+ - Type: `string`
108
+ - Required: `false`
109
+ - Usage:
110
+
111
+ ```vue
112
+ <vue-pdf-app :pdf="ArrayBuffer" file-name="file name" />
113
+ ```
114
+
115
+ ### :pageScale
116
+
117
+ - Description: default page scale.
118
+ - Type: `number | "page-actual"| "page-width"| "page-height"| "page-fit"| "auto"`
119
+ - Required: `false`
120
+ - Usage:
121
+
122
+ ```vue
123
+ // 20%
124
+ <vue-pdf-app page-scale="20" />
125
+ <vue-pdf-app :page-scale="20" />
126
+ <vue-pdf-app :page-scale="page-actual" />
127
+ ```
128
+
129
+ ### :pageNumber
130
+
131
+ - Description: pdfjs stores last viewed page of a file in `window.localStorage.getItem("pdfjs.history")`. Specify the prop to override it.
132
+ - Type: `number`
133
+ - Required: `false`
134
+ - Usage:
135
+
136
+ ```vue
137
+ <vue-pdf-app :page-number="1" />
138
+ ```
139
+
140
+ ### :config
141
+
142
+ - Description: toolbar configuration. Toolbar is available by default. Specify `false` for buttons or whole group of buttons to disable them.
143
+ - Type: `toolbar config (see below)`
144
+ - Required: `false`
145
+ - Default: `toolbar config`
146
+ - Usage:
147
+
148
+ ```vue
149
+ <vue-pdf-app :config="config" />
150
+
151
+ <script>
152
+ export default {
153
+ data() {
154
+ return {
155
+ // disable "Previous page" button
156
+ config: {
157
+ toolbar: {
158
+ toolbarViewerLeft: {
159
+ previous: false
160
+ }
161
+ }
162
+ },
163
+
164
+ // disable whole page navigation panel
165
+ config2: {
166
+ toolbar: {
167
+ toolbarViewerLeft: false
168
+ }
169
+ },
170
+
171
+ // disable whole panel
172
+ config3: {
173
+ toolbar: false
174
+ }
175
+ };
176
+ }
177
+ };
178
+ </script>
179
+ ```
180
+
181
+ <details>
182
+ <summary>Config specification</summary>
183
+
184
+ ![Config legend](./readme/config-legend.jpg "Config legend")
185
+
186
+ <code>
187
+ <pre>
188
+ {
189
+ sidebar: {
190
+ viewThumbnail: true,
191
+ viewOutline: true,
192
+ viewAttachments: true,
193
+ },
194
+ secondaryToolbar: {
195
+ secondaryPresentationMode: true,
196
+ secondaryOpenFile: true,
197
+ secondaryPrint: true,
198
+ secondaryDownload: true,
199
+ secondaryViewBookmark: true,
200
+ firstPage: true,
201
+ lastPage: true,
202
+ pageRotateCw: true,
203
+ pageRotateCcw: true,
204
+ cursorSelectTool: true,
205
+ cursorHandTool: true,
206
+ scrollVertical: true,
207
+ scrollHorizontal: true,
208
+ scrollWrapped: true,
209
+ spreadNone: true,
210
+ spreadOdd: true,
211
+ spreadEven: true,
212
+ documentProperties: true,
213
+ },
214
+ toolbar: {
215
+ toolbarViewerLeft: {
216
+ findbar: true,
217
+ previous: true,
218
+ next: true,
219
+ pageNumber: true,
220
+ },
221
+ toolbarViewerRight: {
222
+ presentationMode: true,
223
+ openFile: true,
224
+ print: true,
225
+ download: true,
226
+ viewBookmark: true,
227
+ },
228
+ toolbarViewerMiddle: {
229
+ zoomOut: true,
230
+ zoomIn: true,
231
+ scaleSelectContainer: true,
232
+ },
233
+ },
234
+ errorWrapper: true,
235
+ };
236
+ </pre>
237
+ </code>
238
+ </details>
239
+
240
+ ### :id-config
241
+
242
+ - Description: If default toolbar UI doesn't suit you it is possible to build custom toolbar. The prop contains elements ID to which to bind functionality. If element ID is specified in this prop appropriate button will be hidden in a default toolbar. May not work with UI framework components. That is because pdfjs internally manages attributes specific to a certain HTML element (for instance pdfjs toggles `disabled` attribute of a button but it won't if a div is used instead of a button). So it is better to use native HTML element specified as recommended in ID config specification below. Four slots are specially designed to build custom toolbar (are situated near a pdf page): `viewer-header, viewer-prepend, viewer-append, viewer-footer` (refer slots API). It is also possible to use other slots or elements outside vue-pdf-app.
243
+ - Type: `ID config (see below)`
244
+ - Required: `false`
245
+ - Usage:
246
+
247
+ ```vue
248
+ <template>
249
+ <div>
250
+ <button :id="idConfig.zoomOut" type="button">Zoom out</button>
251
+ <vue-pdf-app :id-config="idConfig">
252
+ <template #viewer-prepend>
253
+ <div class="viewer-prepend">
254
+ <button :id="idConfig.zoomIn" type="button">Zoom in</button>
255
+ </div>
256
+ </template>
257
+ </vue-pdf-app>
258
+ </div>
259
+ </template>
260
+
261
+ <script>
262
+ export default {
263
+ data() {
264
+ return {
265
+ idConfig: { zoomIn: "zoomInId", zoomOut: "zoomOutId" }
266
+ };
267
+ }
268
+ };
269
+ </script>
270
+ ```
271
+
272
+ <details>
273
+ <summary>ID config specification</summary>
274
+ <code>
275
+ <pre>
276
+ {
277
+
278
+ cursorHandTool?: string; // &lt;button&gt; is recommended
279
+ cursorSelectTool?: string; // &lt;button&gt; is recommended
280
+ documentProperties?: string; // &lt;button&gt; is recommended
281
+ download?: string; // &lt;button&gt; is recommended
282
+ findbar?: string; // &lt;div&gt; is recommended
283
+ findEntireWord?: string; // &lt;input type="checkbox"&gt; is recommended
284
+ findHighlightAll?: string; // &lt;input type="checkbox"&gt; is recommended
285
+ findMessage?: string; // &lt;span&gt; is recommended
286
+ findInput?: string; // &lt;input type="text"&gt; is recommended
287
+ findMatchCase?: string; // &lt;input type="checkbox"&gt; is recommended
288
+ findNext?: string; // &lt;button&gt; is recommended
289
+ findPrevious?: string; // &lt;button&gt; is recommended
290
+ findResultsCount?: string; // &lt;span&gt; is recommended
291
+ firstPage?: string; // &lt;button&gt; is recommended
292
+ lastPage?: string; // &lt;button&gt; is recommended
293
+ nextPage?: string; // &lt;button&gt; is recommended
294
+ numPages?: string; // total pages qty. &lt;span&gt; is recommended
295
+ openFile?: string; // &lt;button&gt; is recommended
296
+ pageNumber?: string; // input for page number. &lt;input type="number"&gt; is recommended
297
+ pageRotateCcw?: string; // &lt;button&gt; is recommended
298
+ pageRotateCw?: string; // &lt;button&gt; is recommended
299
+ presentationMode?: string; // &lt;button&gt; is recommended
300
+ previousPage?: string; // &lt;button&gt; is recommended
301
+ print?: string; // &lt;button&gt; is recommended
302
+ scrollHorizontal?: string; // &lt;button&gt; is recommended
303
+ scrollVertical?: string; // &lt;button&gt; is recommended
304
+ scrollWrapped?: string; // &lt;button&gt; is recommended
305
+ sidebarToggle?: string; // &lt;button&gt; is recommended
306
+ spreadEven?: string; // &lt;button&gt; is recommended
307
+ spreadNone?: string; // &lt;button&gt; is recommended
308
+ spreadOdd?: string; // &lt;button&gt; is recommended
309
+ toggleFindbar?: string; // &lt;button&gt; is recommended
310
+ viewAttachments?: string; // &lt;button&gt; is recommended
311
+ viewBookmark?: string; // &lt;a&gt; tag is recommended
312
+ viewOutline?: string; // &lt;button&gt; tag is recommended
313
+ viewThumbnail?: string; // &lt;button&gt; tag is recommended
314
+ zoomIn?: string; // &lt;button&gt; tag is recommended
315
+ zoomOut?: string; // &lt;button&gt; tag is recommended
316
+ }
317
+
318
+ </pre>
319
+ </code>
320
+ </details>
321
+
322
+ > ℹ️ Note that elements must be in HTML document by the time vue-pdf-app is mounting (use `v-show` instead of `v-if` directive if necessary). Otherwise an error occurs.
323
+
324
+ ### @after-created(PDFViewerApplication)
325
+
326
+ - Description: emitted only once when Pdfjs library is binded to vue component. Can be used to set Pdfjs config before pdf document opening.
327
+ - Arguments:
328
+ - PDFViewerApplication - [pdf application](https://github.com/mozilla/pdf.js/blob/master/web/app.js#L198)
329
+ - Usage:
330
+
331
+ ```vue
332
+ <vue-pdf-app @after-created="afterCreated" />
333
+ ```
334
+
335
+ ### @open(PDFViewerApplication)
336
+
337
+ - Description: emitted when pdf is opened but pages are not rendered.
338
+ - Arguments:
339
+ - PDFViewerApplication - [pdf application](https://github.com/mozilla/pdf.js/blob/master/web/app.js#L198)
340
+ - Usage:
341
+
342
+ ```vue
343
+ <vue-pdf-app @open="openHandler" />
344
+ ```
345
+
346
+ ### @pages-rendered(PDFViewerApplication)
347
+
348
+ - Description: emitted when pdf document pages are rendered. Can be used to set default pages scale, for instance.
349
+ - Arguments:
350
+ - PDFViewerApplication - [pdf application](https://github.com/mozilla/pdf.js/blob/master/web/app.js#L198)
351
+ - Usage:
352
+
353
+ ```vue
354
+ <vue-pdf-app @pages-rendered="pagesRendered" />
355
+
356
+ <script>
357
+ export default {
358
+ methods: {
359
+ pagesRendered(pdfApp) {
360
+ setTimeout(() => (pdfApp.pdfViewer.currentScaleValue = "page-height"));
361
+ }
362
+ }
363
+ };
364
+ </script>
365
+ ```
366
+
367
+ > ℹ️ Events are triggered in the following order `after-created (once) => open => pages-rendered`
368
+
369
+ ### Slots
370
+
371
+ #### Slot names
372
+
373
+ - toolbar-left-prepend
374
+ - toolbar-left-append
375
+ - toolbar-middle-prepend
376
+ - toolbar-middle-append
377
+ - toolbar-right-prepend
378
+ - toolbar-right-append
379
+ - toolbar-sidebar-prepend
380
+ - toolbar-sidebar-append
381
+ - secondary-toolbar-prepend
382
+ - secondary-toolbar-append
383
+ - footer
384
+ - viewer-header: slot before `viewer-prepend` slot. Can be used to build custom toolbar.
385
+ - viewer-prepend: slot before `viewerContainer` div. Can be used to build custom toolbar.
386
+ - viewer-append: slot after `viewerContainer` div. Can be used to build custom toolbar.
387
+ - viewer-footer: slot after `viewer-append` slot. Can be used to build custom toolbar.
388
+
389
+ #### Slot props
390
+
391
+ Each slot has props:
392
+
393
+ 1. toggleTheme
394
+
395
+ Type: (): void.
396
+
397
+ Description: toggle theme handler
398
+
399
+ 1. isSidebarHidden
400
+
401
+ Type: boolean
402
+
403
+ Description: state of a sidebar (visible or hidden). Can be used to manage visibility of custom Attachments, Outline and Thumbnail buttons
404
+
405
+ 1. isFindbarHidden
406
+
407
+ Type: boolean
408
+
409
+ Description: state of a findbar (visible or hidden). Can be used to manage visibility of custom findbar
410
+
411
+ ```vue
412
+ <vue-pdf-app>
413
+ <template #toolbar-left-prepend="{ toggleTheme }">
414
+ <button @click="toggleTheme" type="button">Toggle theme</button>
415
+ </template>
416
+ </vue-pdf-app>
417
+ ```
418
+
419
+ ## Color customization
420
+
421
+ Colors of the pdf viewer are customized via custom css properties:
422
+
423
+ ```html
424
+ <style>
425
+ /* for dark theme */
426
+ .pdf-app.dark {
427
+ --pdf-toolbar-color: black;
428
+ }
429
+
430
+ /* for light theme */
431
+ .pdf-app.light {
432
+ --pdf-toolbar-color: white;
433
+ }
434
+ </style>
435
+ ```
436
+
437
+ <details>
438
+ <summary>Custom css properties specification</summary>
439
+ <table>
440
+ <tr>
441
+ <th>Property</th>
442
+ <th>Applied to selectors</th>
443
+ <th>Description</th>
444
+ </tr>
445
+ <tr>
446
+ <td>--pdf-app-background-color</td>
447
+ <td>.pdf-app</td>
448
+ <td>Background color for root pdf container</td>
449
+ </tr>
450
+ <tr>
451
+ <td>--pdf-button-hover-font-color</td>
452
+ <td>
453
+ .pdf-app .toolbarButton:hover
454
+ <hr>
455
+ .pdf-app .toolbarButton:focus
456
+ <hr>
457
+ .pdf-app .dropdownToolbarButton:hover
458
+ <hr>
459
+ .pdf-app .secondaryToolbarButton:hover
460
+ <hr>
461
+ .pdf-app .secondaryToolbarButton:focus
462
+ <hr>
463
+ </td>
464
+ <td>Hover color for buttons of toolbar and secondary toolbar</td>
465
+ </tr>
466
+ <tr>
467
+ <td>--pdf-button-toggled-color</td>
468
+ <td>
469
+ .pdf-app .toolbarButton.toggled
470
+ <hr>
471
+ .pdf-app .splitToolbarButton.toggled > .toolbarButton.toggled
472
+ <hr>
473
+ .pdf-app .secondaryToolbarButton.toggled
474
+ <hr>
475
+ .pdf-app .outlineItemToggler:hover
476
+ <hr>
477
+ .pdf-app .outlineItemToggler:hover + a
478
+ <hr>
479
+ .pdf-app .outlineItemToggler:hover ~ .outlineItems
480
+ <hr>
481
+ .pdf-app .outlineItem > a:hover
482
+ <hr>
483
+ .pdf-app .attachmentsItem > button:hover
484
+ </td>
485
+ <td>
486
+ Background color for toggleable buttons when selected, outline items on hover, attachment items on hover
487
+ <img src="./readme/toggleable-items.jpg" alt="toggleable items">
488
+ </td>
489
+ </tr>
490
+ <tr>
491
+ <td>--pdf-dialog-button-color</td>
492
+ <td>.pdf-app .dialog .overlayButton</td>
493
+ <td>
494
+ <img src="./readme/dialog-buttons.jpg" alt="dialog buttons">
495
+ </td>
496
+ </tr>
497
+ <tr>
498
+ <td>--pdf-dialog-button-font-color</td>
499
+ <td>.pdf-app .dialog .overlayButton</td>
500
+ <td>
501
+ <img src="./readme/dialog-buttons.jpg" alt="dialog buttons">
502
+ </td>
503
+ </tr>
504
+ <tr>
505
+ <td>--pdf-error-more-info-color</td>
506
+ <td>.pdf-app #errorMoreInfo</td>
507
+ <td>
508
+ <img src="./readme/error-more-info.jpg" alt="error more info">
509
+ </td>
510
+ </tr>
511
+ <tr>
512
+ <td>--pdf-error-more-info-font-color</td>
513
+ <td>.pdf-app #errorMoreInfo</td>
514
+ <td>
515
+ <img src="./readme/error-more-info.jpg" alt="error more info">
516
+ </td>
517
+ </tr>
518
+ <tr>
519
+ <td>--pdf-error-wrapper-color</td>
520
+ <td>.pdf-app #errorWrapper</td>
521
+ <td>
522
+ <img src="./readme/error-wrapper.jpg" alt="error wrapper">
523
+ </td>
524
+ </tr>
525
+ <tr>
526
+ <td>--pdf-find-input-placeholder-font-color</td>
527
+ <td>.pdf-app #findInput::placeholder</td>
528
+ <td>
529
+ <img src="./readme/find-input-placeholder.jpg" alt="find input placeholder">
530
+ </td>
531
+ </tr>
532
+ <tr>
533
+ <td>--pdf-find-message-font-color</td>
534
+ <td>.pdf-app #findMsg</td>
535
+ <td>
536
+ <img src="./readme/find-message.jpg" alt="find message">
537
+ </td>
538
+ </tr>
539
+ <tr>
540
+ <td>--pdf-find-results-count-color</td>
541
+ <td>.pdf-app #findResultsCount</td>
542
+ <td>
543
+ <img src="./readme/find-results-count.jpg" alt="find results count">
544
+ </td>
545
+ </tr>
546
+ <tr>
547
+ <td>--pdf-find-results-count-font-color</td>
548
+ <td>.pdf-app #findResultsCount</td>
549
+ <td>
550
+ <img src="./readme/find-results-count.jpg" alt="find results count">
551
+ </td>
552
+ </tr>
553
+ <tr>
554
+ <td>--pdf-horizontal-toolbar-separator-color</td>
555
+ <td>.pdf-app .horizontalToolbarSeparator</td>
556
+ <td>
557
+ <img src="./readme/horizontal-separator.jpg" alt="horizontal separator">
558
+ </td>
559
+ </tr>
560
+ <tr>
561
+ <td>--pdf-input-color</td>
562
+ <td>.pdf-app .toolbarField</td>
563
+ <td>
564
+ <img src="./readme/toolbar-field.jpg" alt="toolbar field">
565
+ </td>
566
+ </tr>
567
+ <tr>
568
+ <td>--pdf-input-font-color</td>
569
+ <td>.pdf-app .toolbarField</td>
570
+ <td>
571
+ <img src="./readme/toolbar-field.jpg" alt="toolbar field">
572
+ </td>
573
+ </tr>
574
+ <tr>
575
+ <td>--pdf-loading-bar-color</td>
576
+ <td>.pdf-app #loadingBar .progress</td>
577
+ <td>
578
+ <img src="./readme/loading-bar-color.jpg" alt="loading bar color">
579
+ </td>
580
+ </tr>
581
+ <tr>
582
+ <td>--pdf-loading-bar-secondary-color</td>
583
+ <td>.pdf-app #loadingBar .progress.indeterminate .glimmer</td>
584
+ <td>
585
+ <img src="./readme/loading-bar-secondary-color.jpg" alt="loading bar secondary color">
586
+ </td>
587
+ </tr>
588
+ <tr>
589
+ <td>--pdf-not-found-color</td>
590
+ <td>.pdf-app #findInput.notFound</td>
591
+ <td>
592
+ <img src="./readme/not-found.jpg" alt="not found">
593
+ </td>
594
+ </tr>
595
+ <tr>
596
+ <td>--pdf-overlay-container-color</td>
597
+ <td>.pdf-app #overlayContainer</td>
598
+ <td>Background color for overlay container of dialogs</td>
599
+ </tr>
600
+ <tr>
601
+ <td>--pdf-overlay-container-dialog-color</td>
602
+ <td>.pdf-app #overlayContainer > .container > .dialog</td>
603
+ <td>
604
+ Background color for document properties, password, print dialogs
605
+ </td>
606
+ </tr>
607
+ <tr>
608
+ <td>--pdf-overlay-container-dialog-font-color</td>
609
+ <td>.pdf-app #overlayContainer > .container > .dialog</td>
610
+ <td>
611
+ Font color for document properties, password, print dialogs
612
+ </td>
613
+ </tr>
614
+ <tr>
615
+ <td>--pdf-overlay-container-dialog-separator-color</td>
616
+ <td>.pdf-app .dialog .separator</td>
617
+ <td>
618
+ <img src="./readme/dialog-separator.jpg" alt="dialog separator">
619
+ </td>
620
+ </tr>
621
+ <tr>
622
+ <td>--pdf-sidebar-content-color</td>
623
+ <td>.pdf-app #sidebarContent</td>
624
+ <td>
625
+ Background color for sidebar
626
+ </td>
627
+ </tr>
628
+ <tr>
629
+ <td>--pdf-split-toolbar-button-separator-color</td>
630
+ <td>
631
+ .pdf-app .splitToolbarButtonSeparator
632
+ <hr>
633
+ .pdf-app .verticalToolbarSeparator
634
+ </td>
635
+ <td>
636
+ <img src="./readme/vertical-separator.jpg" alt="vertical separator">
637
+ </td>
638
+ </tr>
639
+ <tr>
640
+ <td>--pdf-thumbnail-selection-ring-selected-color</td>
641
+ <td>.pdf-app .thumbnail.selected > .thumbnailSelectionRing</td>
642
+ <td>
643
+ Border color for selected thumbnail
644
+ <img src="./readme/thumbnail-border.jpg" alt="thumbnail border">
645
+ </td>
646
+ </tr>
647
+ <tr>
648
+ <td>--pdf-thumbnail-selection-ring-color</td>
649
+ <td>
650
+ .pdf-app a:focus > .thumbnail > .thumbnailSelectionRing
651
+ <hr>
652
+ .pdf-app .thumbnail:hover > .thumbnailSelectionRing
653
+ </td>
654
+ <td>
655
+ Border color for thumbnail on hover and focus
656
+ <img src="./readme/thumbnail-border.jpg" alt="thumbnail border">
657
+ </td>
658
+ </tr>
659
+ <tr>
660
+ <td>--pdf-toolbar-color</td>
661
+ <td>
662
+ .pdf-app #toolbarContainer
663
+ <hr>
664
+ .pdf-app .findbar
665
+ <hr>
666
+ .pdf-app .secondaryToolbar
667
+ <hr>
668
+ .pdf-app .doorHanger:after
669
+ <hr>
670
+ .pdf-app .doorHangerRight:after
671
+ <hr>
672
+ .pdf-app .dropdownToolbarButton > select
673
+ <hr>
674
+ .pdf-app .dropdownToolbarButton > select > option
675
+ </td>
676
+ <td>
677
+ Background color for toolbar, findbar, secondary toolbar, page scale dropdown
678
+ </td>
679
+ </tr>
680
+ <tr>
681
+ <td>--pdf-toolbar-font-color</td>
682
+ <td>
683
+ .pdf-app .toolbarButton
684
+ <hr>
685
+ .pdf-app .dropdownToolbarButton
686
+ <hr>
687
+ .pdf-app .secondaryToolbarButton
688
+ <hr>
689
+ .pdf-app .dropdownToolbarButton > select
690
+ <hr>
691
+ .pdf-app .toolbarLabel
692
+ <hr>
693
+ .pdf-app .outlineItem > a
694
+ <hr>
695
+ .pdf-app .attachmentsItem > button
696
+ </td>
697
+ <td>
698
+ Font color for toolbar, findbar, secondary toolbar, page scale dropdown, attachments name</td>
699
+ </tr>
700
+ <tr>
701
+ <td>--pdf-toolbar-sidebar-color</td>
702
+ <td>.pdf-app #toolbarSidebar</td>
703
+ <td>
704
+ <img src="./readme/sidebar.jpg" alt="sidebar">
705
+ </td>
706
+ </tr>
707
+ </table>
708
+ </details>
709
+
710
+ ## Icons customization
711
+
712
+ To use default icons `import "vue3-pdf-app/dist/icons/main.css";`.
713
+
714
+ To use custom icons you have to implement [icons.css](https://github.com/sandanat/vue-pdf-app/blob/master/src/sass/icons.scss):
715
+
716
+ ```css
717
+ .vue-pdf-app-icon::before,
718
+ .vue-pdf-app-icon::after {
719
+ font-family: "your font family";
720
+ }
721
+
722
+ .vue-pdf-app-icon.zoom-out::before {
723
+ content: "icon code";
724
+ }
725
+ ```
726
+
727
+ ## Light/dark themes
728
+
729
+ <details>
730
+ <summary>Algorithm of theme apply</summary>
731
+ <img src="./readme/algorithm-of-theme-apply.jpg" alt="Algorithm of theme apply">
732
+ </details>
733
+
734
+ Toggle theme button is not implemented by default.
735
+ It's up to you to decide where to place it.
736
+ The button can be implemented with slots:
737
+
738
+ ```vue
739
+ <vue-pdf-app>
740
+ <template #footer="{ toggleTheme }">
741
+ <button @click="toggleTheme" type="button">Toggle theme</button>
742
+ </template>
743
+ </vue-pdf-app>
744
+ ```
745
+
746
+ ## Localized panel
747
+
748
+ English is the default language for panel.
749
+ Use `<link rel="resource" type="application/l10n" href="path-to-localization-file">` in your html for localization.
750
+ See [localization file examples](https://github.com/mozilla/pdf.js/tree/master/l10n "file examples").
751
+
752
+ ## Examples
753
+ ### Lazy loading
754
+
755
+ PDFJS is a huge package (see the library size table above).
756
+ So use lazy loading to split your bundle into small pieces.
757
+
758
+ ```vue
759
+ <template>
760
+ <div id="app">
761
+ <vue-pdf-app></vue-pdf-app>
762
+ </div>
763
+ </template>
764
+
765
+ <script>
766
+ import "vue3-pdf-app/dist/icons/main.css";
767
+ import Loader from "./components/Loader.vue";
768
+
769
+ export default {
770
+ name: "App",
771
+ components: {
772
+ "vue-pdf-app": () => ({
773
+ component: new Promise((res) => {
774
+ return setTimeout(
775
+ () => res(import(/* webpackChunkName: "pdf-viewer" */ "vue-pdf-app")),
776
+ 4000
777
+ );
778
+ }),
779
+ loading: Loader
780
+ })
781
+ }
782
+ };
783
+ </script>
784
+ ```
785
+
786
+ ### PDFJS interaction
787
+
788
+ You can interact with pdfjs library when pdf is opened via `open` event.
789
+
790
+ ```vue
791
+ <template>
792
+ <div id="app">
793
+ <div id="pdf-wrapper">
794
+ <vue-pdf-app pdf="/sample.pdf" @open="openHandler"></vue-pdf-app>
795
+ </div>
796
+ <div id="info">
797
+ <h1>PDF info:</h1>
798
+ <div v-for="item in info" :key="item.name">
799
+ <span>{{ item.name }}: {{ item.value }}</span>
800
+ <br />
801
+ </div>
802
+ </div>
803
+ </div>
804
+ </template>
805
+
806
+ <script>
807
+ import "vue3-pdf-app/dist/icons/main.css";
808
+ import VuePdfApp from "vue3-pdf-app";
809
+
810
+ export default {
811
+ name: "App",
812
+ components: {
813
+ VuePdfApp
814
+ },
815
+ data() {
816
+ return {
817
+ info: []
818
+ };
819
+ },
820
+ methods: {
821
+ async openHandler(pdfApp) {
822
+ this.info = [];
823
+ const info = await pdfApp.pdfDocument
824
+ .getMetadata()
825
+ .catch(console.error.bind(console));
826
+
827
+ if (!info) return;
828
+ const props = Object.keys(info.info);
829
+ props.forEach((prop) => {
830
+ const obj = {
831
+ name: prop,
832
+ value: info.info[prop]
833
+ };
834
+ this.info.push(obj);
835
+ });
836
+ }
837
+ }
838
+ };
839
+ </script>
840
+ ```
841
+
842
+ ## TODO
843
+
844
+ - [ ] Use 'link' tag to load localize properties in a dialog, it can't render the pdf when you open it at the second time. See the demo `PdfPreviewDialog.vue`