@shahajimbhosle/local-doc-viewer 1.0.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/LICENSE +21 -0
- package/README.md +161 -0
- package/dist/DocumentViewer.d.ts +3 -0
- package/dist/DocumentViewer.d.ts.map +1 -0
- package/dist/components/Toolbar.d.ts +23 -0
- package/dist/components/Toolbar.d.ts.map +1 -0
- package/dist/index.css +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +59332 -0
- package/dist/index.umd.cjs +257 -0
- package/dist/renderers/CsvRenderer.d.ts +3 -0
- package/dist/renderers/CsvRenderer.d.ts.map +1 -0
- package/dist/renderers/DocxRenderer.d.ts +3 -0
- package/dist/renderers/DocxRenderer.d.ts.map +1 -0
- package/dist/renderers/ImageRenderer.d.ts +3 -0
- package/dist/renderers/ImageRenderer.d.ts.map +1 -0
- package/dist/renderers/LegacyPptRenderer.d.ts +3 -0
- package/dist/renderers/LegacyPptRenderer.d.ts.map +1 -0
- package/dist/renderers/MarkdownRenderer.d.ts +3 -0
- package/dist/renderers/MarkdownRenderer.d.ts.map +1 -0
- package/dist/renderers/MediaRenderer.d.ts +3 -0
- package/dist/renderers/MediaRenderer.d.ts.map +1 -0
- package/dist/renderers/PdfRenderer.d.ts +3 -0
- package/dist/renderers/PdfRenderer.d.ts.map +1 -0
- package/dist/renderers/PptxRenderer.d.ts +3 -0
- package/dist/renderers/PptxRenderer.d.ts.map +1 -0
- package/dist/renderers/SpreadsheetRenderer.d.ts +3 -0
- package/dist/renderers/SpreadsheetRenderer.d.ts.map +1 -0
- package/dist/renderers/TextRenderer.d.ts +3 -0
- package/dist/renderers/TextRenderer.d.ts.map +1 -0
- package/dist/renderers/UnsupportedRenderer.d.ts +3 -0
- package/dist/renderers/UnsupportedRenderer.d.ts.map +1 -0
- package/dist/renderers/index.d.ts +15 -0
- package/dist/renderers/index.d.ts.map +1 -0
- package/dist/types.d.ts +121 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/utils/highlight.d.ts +4 -0
- package/dist/utils/highlight.d.ts.map +1 -0
- package/dist/utils/mime.d.ts +8 -0
- package/dist/utils/mime.d.ts.map +1 -0
- package/dist/utils/sanitize.d.ts +3 -0
- package/dist/utils/sanitize.d.ts.map +1 -0
- package/dist/utils/source.d.ts +14 -0
- package/dist/utils/source.d.ts.map +1 -0
- package/dist/utils/xls.d.ts +10 -0
- package/dist/utils/xls.d.ts.map +1 -0
- package/dist/utils/xlsx.d.ts +28 -0
- package/dist/utils/xlsx.d.ts.map +1 -0
- package/package.json +66 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 shahajimbhosle and Local Document Viewer contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
# Local Document Viewer for React
|
|
2
|
+
|
|
3
|
+
A privacy-first React document viewer that renders files in the browser without uploading them to Google Docs, Office Online, a SaaS preview API, or any third-party domain.
|
|
4
|
+
|
|
5
|
+
The package is designed for confidential documents. It accepts `File`, `Blob`, `ArrayBuffer`, `Uint8Array`, `blob:` URLs, and `data:` URLs. `http://` and `https://` document URLs are rejected by default.
|
|
6
|
+
|
|
7
|
+
## Built-In Formats
|
|
8
|
+
|
|
9
|
+
- PDF, rendered with a bundled PDF.js worker
|
|
10
|
+
- Images: PNG, JPG, GIF, WebP, BMP, TIFF browser support permitting
|
|
11
|
+
- Text/code: TXT, JSON, XML, YAML, HTML as text/sanitized content, logs, JS/TS/CSS
|
|
12
|
+
- Markdown, rendered locally and sanitized
|
|
13
|
+
- CSV/TSV
|
|
14
|
+
- DOCX, rendered locally with Word-style layout and embedded styles where browser rendering permits
|
|
15
|
+
- XLS/XLSX, parsed locally in the browser
|
|
16
|
+
- PPTX, rendered locally to canvas with slide navigation and text search counts
|
|
17
|
+
- DOCX comments and XLSX notes/comments are shown locally when present
|
|
18
|
+
- Audio/video formats supported by the browser
|
|
19
|
+
|
|
20
|
+
Legacy binary Word/PowerPoint documents, ODS spreadsheets, strict Office fidelity edge cases, encrypted documents, CAD files, and uncommon enterprise formats need a custom renderer or a private/on-prem conversion service. The viewer exposes a renderer registry for that purpose.
|
|
21
|
+
|
|
22
|
+
### About `.ppt`
|
|
23
|
+
|
|
24
|
+
Legacy `.ppt` files are not the same format as `.pptx`. The built-in presentation renderer handles `.pptx` in-browser. For `.ppt`, use a local/private converter such as your own LibreOffice or Microsoft Office automation service to produce PDF or `.pptx`, then pass the converted file into this viewer through a custom renderer.
|
|
25
|
+
|
|
26
|
+
## Install
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
npm install @shahajimbhosle/local-doc-viewer
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Import the component and CSS:
|
|
33
|
+
|
|
34
|
+
```tsx
|
|
35
|
+
import { DocumentViewer } from '@shahajimbhosle/local-doc-viewer';
|
|
36
|
+
import '@shahajimbhosle/local-doc-viewer/style.css';
|
|
37
|
+
|
|
38
|
+
export function SecurePreview({ file }: { file: File }) {
|
|
39
|
+
return <DocumentViewer source={file} height={720} />;
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Blob sources are supported directly. If the Blob has no reliable `type`, pass a filename or MIME type; otherwise the viewer will sniff common local formats such as PDF, DOCX, XLSX, and PPTX from the bytes.
|
|
44
|
+
|
|
45
|
+
```tsx
|
|
46
|
+
<DocumentViewer source={blob} />
|
|
47
|
+
|
|
48
|
+
<DocumentViewer
|
|
49
|
+
source={{
|
|
50
|
+
blob,
|
|
51
|
+
fileName: 'mid-term-report.xlsx',
|
|
52
|
+
}}
|
|
53
|
+
/>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Privacy Model
|
|
57
|
+
|
|
58
|
+
By default, the viewer:
|
|
59
|
+
|
|
60
|
+
- Does not upload files
|
|
61
|
+
- Does not call third-party document preview services
|
|
62
|
+
- Rejects `http://` and `https://` document URLs
|
|
63
|
+
- Uses local `Blob` URLs for preview/download/print flows
|
|
64
|
+
- Sanitizes generated HTML and removes remote resource references from rendered HTML
|
|
65
|
+
- Removes external PPTX relationships before rendering so linked resources are not fetched
|
|
66
|
+
- Uses a bundled PDF.js worker instead of a CDN worker
|
|
67
|
+
|
|
68
|
+
If your app serves confidential documents from its own trusted private endpoint, opt in explicitly:
|
|
69
|
+
|
|
70
|
+
```tsx
|
|
71
|
+
<DocumentViewer
|
|
72
|
+
allowRemoteUrls
|
|
73
|
+
fetchCredentials="include"
|
|
74
|
+
source={{
|
|
75
|
+
url: '/api/private-documents/123',
|
|
76
|
+
fileName: 'board-pack.pdf',
|
|
77
|
+
mimeType: 'application/pdf',
|
|
78
|
+
}}
|
|
79
|
+
/>
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
For highly sensitive deployments, pair this with a strict Content Security Policy that blocks outbound connections except your own origin.
|
|
83
|
+
|
|
84
|
+
## Controls
|
|
85
|
+
|
|
86
|
+
The default control surface includes:
|
|
87
|
+
|
|
88
|
+
- File name
|
|
89
|
+
- Page/slide navigation where available
|
|
90
|
+
- Zoom in/out/reset
|
|
91
|
+
- Fit width and fit page
|
|
92
|
+
- PDF rotate left/right
|
|
93
|
+
- Search where the renderer can extract text
|
|
94
|
+
- Print
|
|
95
|
+
- Download
|
|
96
|
+
- Fullscreen
|
|
97
|
+
- PPTX slide thumbnails
|
|
98
|
+
|
|
99
|
+
Controls are also filtered by renderer capability. For example, media files hide zoom, fit, search, print, page navigation, and rotate; images hide search, page navigation, and rotate; text/table renderers hide fit/page navigation/rotate; legacy or unsupported files keep only the generic actions such as file name, download, and fullscreen.
|
|
100
|
+
|
|
101
|
+
Disable controls selectively:
|
|
102
|
+
|
|
103
|
+
```tsx
|
|
104
|
+
<DocumentViewer
|
|
105
|
+
controls={{
|
|
106
|
+
download: false,
|
|
107
|
+
print: false,
|
|
108
|
+
thumbnails: false,
|
|
109
|
+
}}
|
|
110
|
+
source={file}
|
|
111
|
+
/>
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Every `controls` key is optional. Omitted controls use the default behavior.
|
|
115
|
+
|
|
116
|
+
## Custom Renderers
|
|
117
|
+
|
|
118
|
+
Register a renderer for regulated formats or for a local conversion flow:
|
|
119
|
+
|
|
120
|
+
```tsx
|
|
121
|
+
import type { DocumentRenderer } from '@shahajimbhosle/local-doc-viewer';
|
|
122
|
+
|
|
123
|
+
const PrivateLegacyPptRenderer: DocumentRenderer = {
|
|
124
|
+
id: 'private-legacy-ppt',
|
|
125
|
+
label: 'Private legacy PPT',
|
|
126
|
+
priority: 100,
|
|
127
|
+
canRender: (file) => file.extension === 'ppt',
|
|
128
|
+
Component: ({ file }) => {
|
|
129
|
+
return <div>Render {file.fileName} with your local renderer here.</div>;
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
<DocumentViewer renderers={[PrivateLegacyPptRenderer]} source={file} />;
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Local Development
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
npm install
|
|
140
|
+
npm run dev
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Open the printed local URL and choose a file from disk. The example passes the browser `File` object directly to the viewer.
|
|
144
|
+
|
|
145
|
+
Build the package:
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
npm run build
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## License
|
|
152
|
+
|
|
153
|
+
This package is released under the MIT License.
|
|
154
|
+
|
|
155
|
+
MIT is a permissive public license. It allows users to use, copy, modify, merge, publish, distribute, sublicense, and sell copies of the software, as long as the copyright notice and license text are included in substantial copies of the software.
|
|
156
|
+
|
|
157
|
+
## Disclaimer
|
|
158
|
+
|
|
159
|
+
This software is provided "as is", without warranty of any kind. The authors, contributors, and package publisher are not responsible or liable for any direct, indirect, incidental, special, consequential, or other damages, data loss, security incidents, compliance issues, business interruption, or any other claims arising from use, misuse, inability to use, or distribution of this package.
|
|
160
|
+
|
|
161
|
+
You are responsible for validating whether this package is suitable for your security, privacy, legal, regulatory, browser-support, and document-fidelity requirements before using it in any environment.
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { DocumentViewerProps } from './types';
|
|
2
|
+
export declare function DocumentViewer({ source, fileName, mimeType, className, style, height, renderers, allowRemoteUrls, fetchCredentials, minZoom, maxZoom, initialZoom, initialPage, controls, labels, emptyState, onLoad, onError, }: DocumentViewerProps): import("react").JSX.Element;
|
|
3
|
+
//# sourceMappingURL=DocumentViewer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DocumentViewer.d.ts","sourceRoot":"","sources":["../src/DocumentViewer.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAKV,mBAAmB,EAKpB,MAAM,SAAS,CAAC;AAEjB,OAAO,cAAc,CAAC;AAmMtB,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,KAAK,EACL,MAAY,EACZ,SAAS,EACT,eAAuB,EACvB,gBAAgC,EAChC,OAAc,EACd,OAAW,EACX,WAAe,EACf,WAAe,EACf,QAAQ,EACR,MAAM,EACN,UAAU,EACV,MAAM,EACN,OAAO,GACR,EAAE,mBAAmB,+BAmSrB"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { DocumentViewerLabels, FitMode, ResolvedDocumentViewerControls, SearchStats, ViewerRuntimeState } from '../types';
|
|
2
|
+
interface ToolbarProps {
|
|
3
|
+
controls: ResolvedDocumentViewerControls;
|
|
4
|
+
fileName?: string;
|
|
5
|
+
isFullscreen: boolean;
|
|
6
|
+
labels: DocumentViewerLabels;
|
|
7
|
+
searchStats: SearchStats;
|
|
8
|
+
state: ViewerRuntimeState;
|
|
9
|
+
onDownload: () => void;
|
|
10
|
+
onFitModeChange: (fitMode: FitMode) => void;
|
|
11
|
+
onFullscreenToggle: () => void;
|
|
12
|
+
onPageChange: (page: number) => void;
|
|
13
|
+
onPrint: () => void;
|
|
14
|
+
onRotateLeft: () => void;
|
|
15
|
+
onRotateRight: () => void;
|
|
16
|
+
onSearchChange: (value: string) => void;
|
|
17
|
+
onZoomIn: () => void;
|
|
18
|
+
onZoomOut: () => void;
|
|
19
|
+
onZoomReset: () => void;
|
|
20
|
+
}
|
|
21
|
+
export declare function Toolbar({ controls, fileName, isFullscreen, labels, searchStats, state, onDownload, onFitModeChange, onFullscreenToggle, onPageChange, onPrint, onRotateLeft, onRotateRight, onSearchChange, onZoomIn, onZoomOut, onZoomReset, }: ToolbarProps): import("react").JSX.Element;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=Toolbar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toolbar.d.ts","sourceRoot":"","sources":["../../src/components/Toolbar.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EACV,oBAAoB,EACpB,OAAO,EACP,8BAA8B,EAC9B,WAAW,EACX,kBAAkB,EACnB,MAAM,UAAU,CAAC;AAElB,UAAU,YAAY;IACpB,QAAQ,EAAE,8BAA8B,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,oBAAoB,CAAC;IAC7B,WAAW,EAAE,WAAW,CAAC;IACzB,KAAK,EAAE,kBAAkB,CAAC;IAC1B,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,eAAe,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB;AA0BD,wBAAgB,OAAO,CAAC,EACtB,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,MAAM,EACN,WAAW,EACX,KAAK,EACL,UAAU,EACV,eAAe,EACf,kBAAkB,EAClB,YAAY,EACZ,OAAO,EACP,YAAY,EACZ,aAAa,EACb,cAAc,EACd,QAAQ,EACR,SAAS,EACT,WAAW,GACZ,EAAE,YAAY,+BA0Hd"}
|
package/dist/index.css
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.ldv-root{--ldv-bg: #f4f6f8;--ldv-panel: #ffffff;--ldv-panel-muted: #f8fafc;--ldv-border: #d8dee6;--ldv-border-strong: #aab4c0;--ldv-text: #17202a;--ldv-muted: #5f6f82;--ldv-accent: #0f766e;--ldv-accent-soft: #d8f3ef;--ldv-danger: #b42318;--ldv-warning: #8a4b0f;--ldv-highlight: #fff1a8;box-sizing:border-box;display:flex;min-height:320px;flex-direction:column;overflow:hidden;border:1px solid var(--ldv-border);border-radius:8px;background:var(--ldv-bg);color:var(--ldv-text);font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;letter-spacing:0}.ldv-root *,.ldv-root *:before,.ldv-root *:after{box-sizing:border-box}.ldv-root:fullscreen{width:100vw;height:100vh!important;border-radius:0}.ldv-toolbar{display:flex;flex:0 0 auto;flex-wrap:wrap;align-items:center;gap:8px;min-height:52px;padding:8px;border-bottom:1px solid var(--ldv-border);background:var(--ldv-panel-muted)}.ldv-toolbar-spacer{flex:1 1 24px}.ldv-control-group{display:inline-flex;align-items:center;gap:4px;padding:2px;border:1px solid var(--ldv-border);border-radius:7px;background:var(--ldv-panel)}.ldv-file-name{display:inline-flex;min-width:160px;max-width:min(280px,35vw);align-items:center;gap:8px;color:var(--ldv-text);font-size:13px;font-weight:600;white-space:nowrap}.ldv-file-name span{overflow:hidden;text-overflow:ellipsis}.ldv-icon-button,.ldv-zoom-reset,.ldv-sheet-tab{display:inline-flex;align-items:center;justify-content:center;border:0;background:transparent;color:var(--ldv-text);cursor:pointer;font:inherit}.ldv-icon-button{width:32px;height:32px;flex:0 0 32px;border-radius:6px}.ldv-icon-button:hover,.ldv-zoom-reset:hover,.ldv-sheet-tab:hover{background:#edf2f7}.ldv-icon-button:focus-visible,.ldv-zoom-reset:focus-visible,.ldv-sheet-tab:focus-visible,.ldv-page-control input:focus-visible,.ldv-search-control input:focus-visible{outline:2px solid var(--ldv-accent);outline-offset:2px}.ldv-icon-button[aria-pressed=true]{background:var(--ldv-accent-soft);color:#075e57}.ldv-icon-button:disabled{color:#9aa6b2;cursor:not-allowed}.ldv-zoom-reset{min-width:76px;height:32px;gap:6px;padding:0 8px;border-radius:6px;color:var(--ldv-text);font-size:12px;font-weight:650}.ldv-page-control{display:inline-flex;align-items:center;gap:6px;padding:0 6px;color:var(--ldv-muted);font-size:12px;white-space:nowrap}.ldv-page-control input{width:58px;height:30px;border:1px solid var(--ldv-border);border-radius:5px;color:var(--ldv-text);font:inherit;text-align:center}.ldv-search-control{display:inline-flex;min-width:220px;max-width:360px;flex:1 1 240px;align-items:center;gap:8px;height:38px;padding:0 10px;border:1px solid var(--ldv-border);border-radius:7px;background:var(--ldv-panel);color:var(--ldv-muted)}.ldv-search-control input{min-width:80px;flex:1 1 auto;border:0;background:transparent;color:var(--ldv-text);font:inherit;outline:none}.ldv-search-status{max-width:120px;overflow:hidden;color:var(--ldv-muted);font-size:12px;text-overflow:ellipsis;white-space:nowrap}.ldv-viewport{position:relative;flex:1 1 auto;overflow:auto;padding:4px;background:#e8edf2}.ldv-renderer-pptx .ldv-viewport,.ldv-renderer-spreadsheet .ldv-viewport,.ldv-renderer-csv .ldv-viewport{padding:0}.ldv-renderer-media .ldv-viewport{overflow:hidden;padding:0}.ldv-renderer-image:has(.ldv-image-fit-page) .ldv-viewport{overflow:hidden}.ldv-renderer-status,.ldv-empty-state,.ldv-error,.ldv-unsupported{display:grid;min-height:100%;place-items:center;align-content:center;justify-items:center;gap:10px;padding:28px;color:var(--ldv-muted);text-align:center}.ldv-error{color:var(--ldv-danger)}.ldv-error strong,.ldv-unsupported h2{color:var(--ldv-text);font-size:18px}.ldv-unsupported p{max-width:640px;margin:0;color:var(--ldv-muted);line-height:1.55}.ldv-pdf-stage,.ldv-image-stage,.ldv-media-stage{display:flex;min-height:100%;align-items:flex-start;justify-content:center}.ldv-media-stage{width:100%;height:100%;align-items:center;padding:12px}.ldv-pdf-canvas,.ldv-pptx-slide-frame,.ldv-image-document,.ldv-video-document,.ldv-rich-document,.ldv-text-document,.ldv-table-document table{background:var(--ldv-panel);box-shadow:0 10px 28px #0f172a29}.ldv-pdf-canvas{display:block}.ldv-pptx-shell{display:grid;width:100%;height:100%;min-height:100%;grid-template-columns:168px minmax(0,1fr);background:#e8edf2}.ldv-pptx-shell.ldv-pptx-sidebar-collapsed{grid-template-columns:44px minmax(0,1fr)}.ldv-pptx-shell.ldv-pptx-sidebar-disabled{grid-template-columns:minmax(0,1fr)}.ldv-pptx-sidebar{display:flex;min-width:0;flex-direction:column;overflow:hidden;border-right:1px solid var(--ldv-border);background:#f8fafc}.ldv-pptx-sidebar-toggle{display:inline-flex;width:32px;height:32px;flex:0 0 32px;align-items:center;justify-content:center;align-self:flex-end;margin:6px;border:0;border-radius:6px;background:transparent;color:var(--ldv-text);cursor:pointer}.ldv-pptx-sidebar-collapsed .ldv-pptx-sidebar-toggle{align-self:center}.ldv-pptx-sidebar-toggle:hover{background:#edf2f7}.ldv-pptx-sidebar-toggle:focus-visible,.ldv-pptx-thumbnail:focus-visible{outline:2px solid var(--ldv-accent);outline-offset:2px}.ldv-pptx-thumbnail-list{display:grid;gap:8px;overflow:auto;padding:0 8px 12px}.ldv-pptx-thumbnail{display:grid;grid-template-columns:24px minmax(0,1fr);gap:6px;align-items:start;padding:6px;border:1px solid transparent;border-radius:6px;background:transparent;color:var(--ldv-text);cursor:pointer;font:inherit;text-align:left}.ldv-pptx-thumbnail:hover{background:#eef3f8}.ldv-pptx-thumbnail[aria-current=page]{border-color:var(--ldv-accent);background:#e8f5f3}.ldv-pptx-thumbnail-number{display:inline-flex;min-height:24px;align-items:center;justify-content:center;color:#4a5868;font-size:12px;font-weight:700}.ldv-pptx-thumbnail-canvas{display:block;max-width:100%;border:1px solid #cfd8e3;background:var(--ldv-panel);box-shadow:0 2px 8px #0f172a1f}.ldv-pptx-main{min-width:0;overflow:auto;padding:12px}.ldv-pptx-stage{display:flex;min-height:100%;align-items:center;justify-content:flex-start}.ldv-pptx-slide-frame{position:relative;flex:0 0 auto;background:var(--ldv-panel)}.ldv-pptx-canvas{display:block;width:100%;height:100%;background:var(--ldv-panel)}.ldv-pptx-render-status{position:absolute;top:0;right:0;bottom:0;left:0;display:grid;place-items:center;background:#ffffffb8;color:var(--ldv-muted);font-size:13px;font-weight:600}.ldv-image-stage{align-items:center}.ldv-image-document{display:block;max-width:none;transform-origin:center}.ldv-image-fit-width .ldv-image-document{width:100%;height:auto}.ldv-image-fit-page .ldv-image-document{max-width:100%;object-fit:contain}.ldv-video-document{width:100%;height:100%;max-width:100%;max-height:100%;background:#000;object-fit:contain}.ldv-audio-document{width:min(100%,640px)}.ldv-text-shell{display:flex;min-height:100%;justify-content:center}.ldv-text-document{width:min(100%,980px);min-height:100%;margin:0;padding:4px;overflow:auto;border:1px solid var(--ldv-border);border-radius:4px;color:#1d2733;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;-moz-tab-size:2;tab-size:2;white-space:pre-wrap;word-break:break-word}.ldv-rich-document{width:min(100%,860px);min-height:100%;margin:0 auto;padding:4px;border:1px solid var(--ldv-border);border-radius:4px;color:#1d2733;line-height:1.65}.ldv-rich-document h1,.ldv-rich-document h2,.ldv-rich-document h3{color:#111827;line-height:1.2}.ldv-rich-document img{max-width:100%}.ldv-docx-preview-shell{width:max-content;max-width:none;margin:0 auto}.ldv-docx-document{color:#111827}.ldv-docx-document .docx-wrapper{padding:0!important;background:transparent!important}.ldv-docx-document .docx-wrapper>section.docx{margin:0 auto 20px!important;box-shadow:0 10px 28px #0f172a29!important}.ldv-docx-document img,.ldv-docx-document svg,.ldv-docx-document canvas{max-width:none}.ldv-docx-vml-textbox{display:inline-flex;align-items:center;box-sizing:border-box;overflow:hidden;padding:0 2pt;vertical-align:middle}.ldv-docx-vml-textbox p{width:100%;min-height:0!important;margin:0!important}.ldv-docx-vml-textbox span{line-height:1.05}.ldv-rich-document table{width:100%;border-collapse:collapse}.ldv-rich-document th,.ldv-rich-document td{padding:4px;border:1px solid var(--ldv-border);text-align:left;vertical-align:top}.ldv-warning{margin-bottom:18px;padding:10px 12px;border:1px solid #f4c27b;border-radius:6px;background:#fff8eb;color:var(--ldv-warning);font-size:13px}.ldv-spreadsheet-document{width:max-content;min-width:max-content}.ldv-sheet-tabs{position:sticky;top:0;z-index:1;display:flex;gap:4px;padding:8px 0;background:#e8edf2}.ldv-sheet-tab{height:30px;padding:0 10px;border:1px solid var(--ldv-border);border-radius:6px;background:var(--ldv-panel);color:var(--ldv-text);font-size:12px}.ldv-sheet-tab[aria-selected=true]{border-color:var(--ldv-accent);background:var(--ldv-accent-soft);color:#075e57}.ldv-table-document{display:flex;min-width:max-content;justify-content:center}.ldv-grid-document{display:block;justify-content:flex-start}.ldv-table-document table{border-collapse:collapse;border-spacing:0;color:#1d2733;empty-cells:show}.ldv-spreadsheet-grid{table-layout:fixed;background:var(--ldv-panel)}.ldv-table-document th,.ldv-table-document td{position:relative;min-width:96px;max-width:360px;padding:0!important;border:1px solid var(--ldv-border);overflow-wrap:anywhere;text-align:left;vertical-align:top}.ldv-spreadsheet-grid .ldv-sheet-corner,.ldv-spreadsheet-grid .ldv-row-header{width:48px;min-width:48px;max-width:48px;background:#f2f6fa;color:#4a5868;font-weight:700;text-align:center;vertical-align:middle}.ldv-spreadsheet-grid .ldv-sheet-corner{position:sticky;top:0;left:0;z-index:4;height:30px}.ldv-spreadsheet-grid .ldv-column-header{height:30px;background:#f2f6fa;color:#4a5868;font-weight:700;text-align:center;vertical-align:middle}.ldv-spreadsheet-grid .ldv-row-header{position:sticky;top:auto;left:0;z-index:2;height:30px}.ldv-spreadsheet-grid td{height:30px;background:#fff}.ldv-spreadsheet-grid .ldv-cell-has-comment{overflow:visible}.ldv-cell-comment{position:absolute;top:0;right:0;width:12px;height:12px;outline:none}.ldv-cell-comment-marker{position:absolute;top:0;right:0;width:0;height:0;border-top:10px solid #d83b01;border-left:10px solid transparent}.ldv-cell-comment-popover{position:absolute;top:12px;right:0;z-index:20;display:none;width:260px;max-width:min(320px,80vw);padding:8px 10px;border:1px solid #c8d1dc;border-radius:6px;background:#fff;box-shadow:0 8px 24px #0f172a2e;color:#1d2733;font-size:12px;line-height:1.4;white-space:pre-wrap}.ldv-cell-comment:hover .ldv-cell-comment-popover,.ldv-cell-comment:focus .ldv-cell-comment-popover,.ldv-cell-comment:focus-within .ldv-cell-comment-popover{display:grid;gap:8px}.ldv-cell-comment-item{display:grid;gap:2px}.ldv-cell-comment-item strong{color:#111827;font-size:12px}.ldv-cell-comment-item small{color:var(--ldv-muted);font-size:11px}.ldv-table-document th{position:sticky;top:0;z-index:1;background:#f2f6fa;color:#111827;font-weight:700}.ldv-spreadsheet-grid .ldv-sheet-corner{top:0;left:0;z-index:4}.ldv-spreadsheet-grid .ldv-column-header{top:0;z-index:3;text-align:center}.ldv-spreadsheet-grid .ldv-row-header{top:auto;left:0;z-index:2;color:#4a5868}.ldv-highlight{border-radius:3px;background:var(--ldv-highlight);color:inherit}.ldv-print-root{padding:4px}@media(max-width:720px){.ldv-root{border-radius:0}.ldv-toolbar{align-items:stretch}.ldv-file-name{max-width:100%;flex:1 1 100%}.ldv-search-control{max-width:none;flex-basis:100%}.ldv-viewport{padding:4px}.ldv-renderer-pptx .ldv-viewport,.ldv-renderer-spreadsheet .ldv-viewport,.ldv-renderer-csv .ldv-viewport{padding:0}.ldv-pptx-shell{grid-template-columns:148px minmax(280px,1fr)}.ldv-pptx-shell.ldv-pptx-sidebar-collapsed{grid-template-columns:44px minmax(280px,1fr)}.ldv-pptx-main{padding:8px}.ldv-rich-document,.ldv-text-document{padding:4px}}@media print{.ldv-toolbar{display:none}.ldv-root{height:auto!important;border:0}.ldv-viewport{overflow:visible;padding:0;background:#fff}.ldv-pdf-canvas,.ldv-image-document,.ldv-video-document,.ldv-rich-document,.ldv-text-document,.ldv-table-document table{box-shadow:none}}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { DocumentViewer } from './DocumentViewer';
|
|
2
|
+
export { builtInRenderers } from './renderers';
|
|
3
|
+
export type { BinaryDocumentData, DocumentInfo, DocumentRenderer, DocumentRendererProps, DocumentSource, DocumentViewerControls, DocumentViewerLabels, DocumentViewerProps, FitMode, RendererActions, ResolvedDocument, ResolvedDocumentViewerControls, SearchStats, ViewerRuntimeState, } from './types';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAY,EACV,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,EACd,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACnB,OAAO,EACP,eAAe,EACf,gBAAgB,EAChB,8BAA8B,EAC9B,WAAW,EACX,kBAAkB,GACnB,MAAM,SAAS,CAAC"}
|