@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.
Files changed (50) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +161 -0
  3. package/dist/DocumentViewer.d.ts +3 -0
  4. package/dist/DocumentViewer.d.ts.map +1 -0
  5. package/dist/components/Toolbar.d.ts +23 -0
  6. package/dist/components/Toolbar.d.ts.map +1 -0
  7. package/dist/index.css +1 -0
  8. package/dist/index.d.ts +4 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +59332 -0
  11. package/dist/index.umd.cjs +257 -0
  12. package/dist/renderers/CsvRenderer.d.ts +3 -0
  13. package/dist/renderers/CsvRenderer.d.ts.map +1 -0
  14. package/dist/renderers/DocxRenderer.d.ts +3 -0
  15. package/dist/renderers/DocxRenderer.d.ts.map +1 -0
  16. package/dist/renderers/ImageRenderer.d.ts +3 -0
  17. package/dist/renderers/ImageRenderer.d.ts.map +1 -0
  18. package/dist/renderers/LegacyPptRenderer.d.ts +3 -0
  19. package/dist/renderers/LegacyPptRenderer.d.ts.map +1 -0
  20. package/dist/renderers/MarkdownRenderer.d.ts +3 -0
  21. package/dist/renderers/MarkdownRenderer.d.ts.map +1 -0
  22. package/dist/renderers/MediaRenderer.d.ts +3 -0
  23. package/dist/renderers/MediaRenderer.d.ts.map +1 -0
  24. package/dist/renderers/PdfRenderer.d.ts +3 -0
  25. package/dist/renderers/PdfRenderer.d.ts.map +1 -0
  26. package/dist/renderers/PptxRenderer.d.ts +3 -0
  27. package/dist/renderers/PptxRenderer.d.ts.map +1 -0
  28. package/dist/renderers/SpreadsheetRenderer.d.ts +3 -0
  29. package/dist/renderers/SpreadsheetRenderer.d.ts.map +1 -0
  30. package/dist/renderers/TextRenderer.d.ts +3 -0
  31. package/dist/renderers/TextRenderer.d.ts.map +1 -0
  32. package/dist/renderers/UnsupportedRenderer.d.ts +3 -0
  33. package/dist/renderers/UnsupportedRenderer.d.ts.map +1 -0
  34. package/dist/renderers/index.d.ts +15 -0
  35. package/dist/renderers/index.d.ts.map +1 -0
  36. package/dist/types.d.ts +121 -0
  37. package/dist/types.d.ts.map +1 -0
  38. package/dist/utils/highlight.d.ts +4 -0
  39. package/dist/utils/highlight.d.ts.map +1 -0
  40. package/dist/utils/mime.d.ts +8 -0
  41. package/dist/utils/mime.d.ts.map +1 -0
  42. package/dist/utils/sanitize.d.ts +3 -0
  43. package/dist/utils/sanitize.d.ts.map +1 -0
  44. package/dist/utils/source.d.ts +14 -0
  45. package/dist/utils/source.d.ts.map +1 -0
  46. package/dist/utils/xls.d.ts +10 -0
  47. package/dist/utils/xls.d.ts.map +1 -0
  48. package/dist/utils/xlsx.d.ts +28 -0
  49. package/dist/utils/xlsx.d.ts.map +1 -0
  50. 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}}
@@ -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"}