@cannyminds/dms-file-viewers 0.3.0 → 0.5.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 (81) hide show
  1. package/dist/{chunk-FZYMVHF6.mjs → chunk-4DJJINTB.mjs} +54 -55
  2. package/dist/chunk-4DJJINTB.mjs.map +1 -0
  3. package/dist/chunk-677DWENS.mjs +133 -0
  4. package/dist/chunk-677DWENS.mjs.map +1 -0
  5. package/dist/{chunk-GNWU6XHH.js → chunk-6ZBHO5SP.js} +15 -9
  6. package/dist/{chunk-GNWU6XHH.js.map → chunk-6ZBHO5SP.js.map} +1 -1
  7. package/dist/chunk-77UARJVQ.js +133 -0
  8. package/dist/chunk-77UARJVQ.js.map +1 -0
  9. package/dist/{chunk-LKBM4O47.mjs → chunk-7BLEPGZ4.mjs} +67 -61
  10. package/dist/chunk-7BLEPGZ4.mjs.map +1 -0
  11. package/dist/{chunk-QRYIHDRT.mjs → chunk-BHMFZTZ7.mjs} +54 -55
  12. package/dist/chunk-BHMFZTZ7.mjs.map +1 -0
  13. package/dist/{chunk-EMP7RZM2.js → chunk-DOOYIHGW.js} +52 -53
  14. package/dist/chunk-DOOYIHGW.js.map +1 -0
  15. package/dist/{chunk-73ZIFR3P.mjs → chunk-K5SKH4SD.mjs} +798 -466
  16. package/dist/chunk-K5SKH4SD.mjs.map +1 -0
  17. package/dist/{chunk-3STHCDAC.js → chunk-QELOFQEB.js} +757 -425
  18. package/dist/chunk-QELOFQEB.js.map +1 -0
  19. package/dist/{chunk-BNHQYEZ7.js → chunk-SBEFC7HP.js} +203 -158
  20. package/dist/chunk-SBEFC7HP.js.map +1 -0
  21. package/dist/{chunk-4RL77HKO.js → chunk-SNEIVT4R.js} +52 -53
  22. package/dist/chunk-SNEIVT4R.js.map +1 -0
  23. package/dist/{chunk-XQBXRMB7.mjs → chunk-UX6U3H7J.mjs} +14 -8
  24. package/dist/chunk-UX6U3H7J.mjs.map +1 -0
  25. package/dist/{chunk-7JTIG6OU.js → chunk-WP55NYFS.js} +67 -61
  26. package/dist/chunk-WP55NYFS.js.map +1 -0
  27. package/dist/{chunk-NOLXOOIP.mjs → chunk-YHMHDPLQ.mjs} +200 -155
  28. package/dist/chunk-YHMHDPLQ.mjs.map +1 -0
  29. package/dist/components/viewers/AudioViewer.d.mts +1 -1
  30. package/dist/components/viewers/AudioViewer.d.ts +1 -1
  31. package/dist/components/viewers/AudioViewer.js +2 -2
  32. package/dist/components/viewers/AudioViewer.mjs +1 -1
  33. package/dist/components/viewers/DefaultViewer.d.mts +1 -1
  34. package/dist/components/viewers/DefaultViewer.d.ts +1 -1
  35. package/dist/components/viewers/DefaultViewer.js +3 -2
  36. package/dist/components/viewers/DefaultViewer.js.map +1 -1
  37. package/dist/components/viewers/DefaultViewer.mjs +2 -1
  38. package/dist/components/viewers/ImageViewer.d.mts +1 -1
  39. package/dist/components/viewers/ImageViewer.d.ts +1 -1
  40. package/dist/components/viewers/ImageViewer.js +3 -3
  41. package/dist/components/viewers/ImageViewer.mjs +2 -2
  42. package/dist/components/viewers/PDFViewer.d.mts +1 -1
  43. package/dist/components/viewers/PDFViewer.d.ts +1 -1
  44. package/dist/components/viewers/PDFViewer.js +2 -2
  45. package/dist/components/viewers/PDFViewer.mjs +1 -1
  46. package/dist/components/viewers/TIFFViewer.d.mts +1 -1
  47. package/dist/components/viewers/TIFFViewer.d.ts +1 -1
  48. package/dist/components/viewers/TIFFViewer.js +2 -2
  49. package/dist/components/viewers/TIFFViewer.mjs +1 -1
  50. package/dist/components/viewers/TextViewer.d.mts +1 -1
  51. package/dist/components/viewers/TextViewer.d.ts +1 -1
  52. package/dist/components/viewers/TextViewer.js +2 -2
  53. package/dist/components/viewers/TextViewer.mjs +1 -1
  54. package/dist/components/viewers/VideoViewer.d.mts +1 -1
  55. package/dist/components/viewers/VideoViewer.d.ts +1 -1
  56. package/dist/components/viewers/VideoViewer.js +2 -2
  57. package/dist/components/viewers/VideoViewer.mjs +1 -1
  58. package/dist/index.d.mts +2 -2
  59. package/dist/index.d.ts +2 -2
  60. package/dist/index.js +30 -9
  61. package/dist/index.js.map +1 -1
  62. package/dist/index.mjs +29 -8
  63. package/dist/index.mjs.map +1 -1
  64. package/dist/{types-CquKzJLE.d.mts → types-C6IEfcTM.d.mts} +13 -1
  65. package/dist/{types-CquKzJLE.d.ts → types-C6IEfcTM.d.ts} +13 -1
  66. package/package.json +1 -1
  67. package/dist/chunk-3STHCDAC.js.map +0 -1
  68. package/dist/chunk-4RL77HKO.js.map +0 -1
  69. package/dist/chunk-73ZIFR3P.mjs.map +0 -1
  70. package/dist/chunk-7JTIG6OU.js.map +0 -1
  71. package/dist/chunk-BNHQYEZ7.js.map +0 -1
  72. package/dist/chunk-EMP7RZM2.js.map +0 -1
  73. package/dist/chunk-FZYMVHF6.mjs.map +0 -1
  74. package/dist/chunk-LKBM4O47.mjs.map +0 -1
  75. package/dist/chunk-NOLXOOIP.mjs.map +0 -1
  76. package/dist/chunk-QLJKOQTP.mjs +0 -78
  77. package/dist/chunk-QLJKOQTP.mjs.map +0 -1
  78. package/dist/chunk-QRYIHDRT.mjs.map +0 -1
  79. package/dist/chunk-XQBXRMB7.mjs.map +0 -1
  80. package/dist/chunk-Z7FUO5RX.js +0 -78
  81. package/dist/chunk-Z7FUO5RX.js.map +0 -1
@@ -14,24 +14,28 @@ import {
14
14
  } from "react";
15
15
  import {
16
16
  Box,
17
- Button,
18
- ButtonGroup,
19
17
  Card,
20
- CardActions,
21
18
  CardContent,
22
19
  CardHeader,
23
20
  Divider,
24
21
  LinearProgress,
25
- MenuItem,
26
- Select,
27
22
  Stack,
28
23
  Typography,
29
- IconButton,
30
- Tooltip
24
+ IconButton
31
25
  } from "@mui/material";
32
26
  import DownloadIcon from "@mui/icons-material/Download";
27
+ import FirstPageIcon from "@mui/icons-material/FirstPage";
28
+ import LastPageIcon from "@mui/icons-material/LastPage";
29
+ import ChevronLeftIcon from "@mui/icons-material/ChevronLeft";
30
+ import ChevronRightIcon from "@mui/icons-material/ChevronRight";
31
+ import ZoomInIcon from "@mui/icons-material/ZoomIn";
32
+ import ZoomOutIcon from "@mui/icons-material/ZoomOut";
33
+ import FitScreenIcon from "@mui/icons-material/FitScreen";
34
+ import AspectRatioIcon from "@mui/icons-material/AspectRatio";
35
+ import InfoIcon from "@mui/icons-material/Info";
36
+ import DescriptionIcon from "@mui/icons-material/Description";
33
37
  import * as UTIF from "utif";
34
- import { jsx, jsxs } from "react/jsx-runtime";
38
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
35
39
  var decodeTiff = (buffer) => {
36
40
  if (typeof window === "undefined") {
37
41
  return [];
@@ -89,21 +93,18 @@ var TIFFViewerContent = ({
89
93
  onLoad,
90
94
  onError,
91
95
  onDownloadClick,
92
- // Filter out props that shouldn't be passed to DOM
93
- mimeType: _mimeType,
94
- fileSize: _fileSize,
95
- showPageCount: _showPageCount,
96
- showPageNavigation: _showPageNavigation,
97
- showZoomControls: _showZoomControls,
98
- showDownload: _showDownload,
99
- showPrint: _showPrint,
100
- showSearch: _showSearch,
101
- showMetadata: _showMetadata,
102
- showProperties: _showProperties,
103
- onMetadataClick: _onMetadataClick,
104
- onPropertiesClick: _onPropertiesClick,
105
- onPrintClick: _onPrintClick,
106
- customRegistry: _customRegistry,
96
+ onMetadataClick,
97
+ onPropertiesClick,
98
+ showMetadata = true,
99
+ showProperties = true,
100
+ // Extract props that shouldn't be passed to DOM elements
101
+ mimeType,
102
+ fileSize,
103
+ initialSearchText,
104
+ initialSearchPages,
105
+ autoOpenSearch,
106
+ autoExecuteSearch,
107
+ onSearchComplete,
107
108
  ...props
108
109
  }) => {
109
110
  const [frames, setFrames] = useState([]);
@@ -171,35 +172,6 @@ var TIFFViewerContent = ({
171
172
  useEffect(() => {
172
173
  void loadTiff();
173
174
  }, [loadTiff]);
174
- const handleDownload = useCallback(async () => {
175
- if (!file && !url) return;
176
- try {
177
- let blob;
178
- let filename = resolvedFileName || "document.tiff";
179
- if (file) {
180
- blob = file;
181
- filename = file.name;
182
- } else if (url) {
183
- const response = await fetch(url);
184
- if (!response.ok) {
185
- throw new Error(`Failed to fetch TIFF (${response.status})`);
186
- }
187
- blob = await response.blob();
188
- } else {
189
- return;
190
- }
191
- const downloadUrl = URL.createObjectURL(blob);
192
- const link = document.createElement("a");
193
- link.href = downloadUrl;
194
- link.download = filename;
195
- document.body.appendChild(link);
196
- link.click();
197
- document.body.removeChild(link);
198
- URL.revokeObjectURL(downloadUrl);
199
- } catch (err) {
200
- onError?.(err instanceof Error ? err : new Error("Download failed"));
201
- }
202
- }, [file, url, resolvedFileName, onError]);
203
175
  const currentFrame = frames[currentIndex];
204
176
  const hasFrames = frames.length > 0;
205
177
  const hasMultipleFrames = frames.length > 1;
@@ -230,22 +202,34 @@ var TIFFViewerContent = ({
230
202
  observer.disconnect();
231
203
  };
232
204
  }, []);
233
- const handleZoomIn = () => {
205
+ const handleZoomIn = useCallback(() => {
234
206
  setFitMode("zoom");
235
207
  setZoom((value) => Math.min(Math.round((value + 0.25) * 100) / 100, 5));
236
- };
237
- const handleZoomOut = () => {
208
+ }, []);
209
+ const handleZoomOut = useCallback(() => {
238
210
  setFitMode("zoom");
239
211
  setZoom((value) => Math.max(Math.round((value - 0.25) * 100) / 100, 0.25));
240
- };
241
- const handleFitWidth = () => {
212
+ }, []);
213
+ const handleFitWidth = useCallback(() => {
242
214
  setFitMode("fit-width");
243
215
  setZoom(1);
244
- };
245
- const handleFitPage = () => {
216
+ }, []);
217
+ const handleFitPage = useCallback(() => {
246
218
  setFitMode("fit-page");
247
219
  setZoom(1);
248
- };
220
+ }, []);
221
+ const handleFirstPage = useCallback(() => {
222
+ setCurrentIndex(0);
223
+ }, []);
224
+ const handleLastPage = useCallback(() => {
225
+ setCurrentIndex(frames.length - 1);
226
+ }, [frames.length]);
227
+ const handlePreviousPage = useCallback(() => {
228
+ setCurrentIndex((index) => Math.max(index - 1, 0));
229
+ }, []);
230
+ const handleNextPage = useCallback(() => {
231
+ setCurrentIndex((index) => Math.min(index + 1, frames.length - 1));
232
+ }, [frames.length]);
249
233
  const effectiveScale = useMemo(() => {
250
234
  if (!currentFrame) {
251
235
  return 1;
@@ -304,73 +288,157 @@ var TIFFViewerContent = ({
304
288
  Box,
305
289
  {
306
290
  className: `tiff-viewer ${className}`,
307
- sx: { width, height, ...style },
291
+ sx: {
292
+ width,
293
+ height,
294
+ display: "flex",
295
+ flexDirection: "column",
296
+ overflow: "hidden",
297
+ ...style
298
+ },
308
299
  ...props,
309
- children: /* @__PURE__ */ jsxs(Card, { sx: { height: "100%", display: "flex", flexDirection: "column" }, elevation: 1, children: [
300
+ children: /* @__PURE__ */ jsxs(Card, { sx: { height: "100%", width: "100%", display: "flex", flexDirection: "column", overflow: "hidden" }, elevation: 1, children: [
310
301
  /* @__PURE__ */ jsx(
311
302
  CardHeader,
312
303
  {
313
304
  avatar: /* @__PURE__ */ jsx(FileIcon_default, { ext: fileExtension, size: 32 }),
314
- title: /* @__PURE__ */ jsxs(Typography, { variant: "subtitle1", fontWeight: 500, children: [
315
- resolvedFileName,
316
- frames.length > 0 && /* @__PURE__ */ jsxs(Typography, { component: "span", variant: "body2", color: "text.secondary", sx: { ml: 1 }, children: [
317
- "\u2022 Page ",
318
- currentIndex + 1,
319
- " of ",
320
- frames.length
321
- ] })
322
- ] }),
323
- action: /* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: 1, alignItems: "center", children: [
324
- /* @__PURE__ */ jsxs(ButtonGroup, { variant: "outlined", size: "small", disabled: !hasFrames, children: [
325
- /* @__PURE__ */ jsx(Button, { onClick: handleZoomOut, disabled: !hasFrames || zoom <= 0.25, children: "-" }),
326
- /* @__PURE__ */ jsx(Button, { onClick: handleZoomIn, disabled: !hasFrames || zoom >= 5, children: "+" })
327
- ] }),
328
- /* @__PURE__ */ jsx(
329
- Button,
330
- {
331
- variant: fitMode === "fit-width" ? "contained" : "outlined",
332
- size: "small",
333
- onClick: handleFitWidth,
334
- disabled: !hasFrames,
335
- children: "Fit Width"
336
- }
337
- ),
338
- /* @__PURE__ */ jsx(
339
- Button,
340
- {
341
- variant: fitMode === "fit-page" ? "contained" : "outlined",
342
- size: "small",
343
- onClick: handleFitPage,
344
- disabled: !hasFrames,
345
- children: "Fit Page"
346
- }
347
- ),
348
- /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", sx: { minWidth: 64, textAlign: "center" }, children: hasFrames ? `${displayScale}%` : "\u2014" }),
349
- /* @__PURE__ */ jsx(Tooltip, { title: "Download", children: /* @__PURE__ */ jsx(
350
- IconButton,
351
- {
352
- size: "small",
353
- onClick: onDownloadClick,
354
- children: /* @__PURE__ */ jsx(DownloadIcon, {})
355
- }
356
- ) }),
357
- hasMultipleFrames && /* @__PURE__ */ jsx(
358
- Select,
359
- {
360
- size: "small",
361
- value: String(currentIndex),
362
- onChange: (event) => setCurrentIndex(Number(event.target.value)),
363
- sx: { minWidth: 120 },
364
- children: frames.map((_, index) => /* @__PURE__ */ jsxs(MenuItem, { value: String(index), children: [
365
- "Page ",
366
- index + 1
367
- ] }, index))
368
- }
369
- )
370
- ] }),
305
+ title: /* @__PURE__ */ jsx(Typography, { variant: "subtitle1", fontWeight: 500, children: resolvedFileName }),
371
306
  sx: { pb: 1 }
372
307
  }
373
308
  ),
309
+ /* @__PURE__ */ jsx(Box, { sx: { px: 2, pb: 1, display: "flex", justifyContent: "center" }, children: /* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: 1, alignItems: "center", flexWrap: "wrap", gap: 1, children: [
310
+ hasMultipleFrames && /* @__PURE__ */ jsxs(Fragment, { children: [
311
+ /* @__PURE__ */ jsx(
312
+ IconButton,
313
+ {
314
+ size: "small",
315
+ onClick: handleFirstPage,
316
+ disabled: currentIndex === 0,
317
+ title: "First Page",
318
+ "aria-label": "Go to first page",
319
+ children: /* @__PURE__ */ jsx(FirstPageIcon, { fontSize: "small" })
320
+ }
321
+ ),
322
+ /* @__PURE__ */ jsx(
323
+ IconButton,
324
+ {
325
+ size: "small",
326
+ onClick: handlePreviousPage,
327
+ disabled: currentIndex === 0,
328
+ title: "Previous Page",
329
+ "aria-label": "Go to previous page",
330
+ children: /* @__PURE__ */ jsx(ChevronLeftIcon, { fontSize: "small" })
331
+ }
332
+ ),
333
+ /* @__PURE__ */ jsxs(Typography, { variant: "body2", color: "text.secondary", sx: { minWidth: 100, textAlign: "center" }, children: [
334
+ "Page ",
335
+ currentIndex + 1,
336
+ " of ",
337
+ frames.length
338
+ ] }),
339
+ /* @__PURE__ */ jsx(
340
+ IconButton,
341
+ {
342
+ size: "small",
343
+ onClick: handleNextPage,
344
+ disabled: currentIndex === frames.length - 1,
345
+ title: "Next Page",
346
+ "aria-label": "Go to next page",
347
+ children: /* @__PURE__ */ jsx(ChevronRightIcon, { fontSize: "small" })
348
+ }
349
+ ),
350
+ /* @__PURE__ */ jsx(
351
+ IconButton,
352
+ {
353
+ size: "small",
354
+ onClick: handleLastPage,
355
+ disabled: currentIndex === frames.length - 1,
356
+ title: "Last Page",
357
+ "aria-label": "Go to last page",
358
+ children: /* @__PURE__ */ jsx(LastPageIcon, { fontSize: "small" })
359
+ }
360
+ ),
361
+ /* @__PURE__ */ jsx(Divider, { orientation: "vertical", flexItem: true, sx: { mx: 1 } })
362
+ ] }),
363
+ /* @__PURE__ */ jsx(
364
+ IconButton,
365
+ {
366
+ size: "small",
367
+ onClick: handleZoomOut,
368
+ disabled: !hasFrames || zoom <= 0.25,
369
+ title: "Zoom Out",
370
+ "aria-label": "Zoom out",
371
+ children: /* @__PURE__ */ jsx(ZoomOutIcon, { fontSize: "small" })
372
+ }
373
+ ),
374
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", sx: { minWidth: 64, textAlign: "center" }, children: hasFrames ? `${displayScale}%` : "\u2014" }),
375
+ /* @__PURE__ */ jsx(
376
+ IconButton,
377
+ {
378
+ size: "small",
379
+ onClick: handleZoomIn,
380
+ disabled: !hasFrames || zoom >= 5,
381
+ title: "Zoom In",
382
+ "aria-label": "Zoom in",
383
+ children: /* @__PURE__ */ jsx(ZoomInIcon, { fontSize: "small" })
384
+ }
385
+ ),
386
+ /* @__PURE__ */ jsx(
387
+ IconButton,
388
+ {
389
+ size: "small",
390
+ onClick: handleFitWidth,
391
+ disabled: !hasFrames,
392
+ title: "Fit to Width",
393
+ "aria-label": "Fit to width",
394
+ color: fitMode === "fit-width" ? "primary" : "default",
395
+ children: /* @__PURE__ */ jsx(AspectRatioIcon, { fontSize: "small" })
396
+ }
397
+ ),
398
+ /* @__PURE__ */ jsx(
399
+ IconButton,
400
+ {
401
+ size: "small",
402
+ onClick: handleFitPage,
403
+ disabled: !hasFrames,
404
+ title: "Fit to Page",
405
+ "aria-label": "Fit to page",
406
+ color: fitMode === "fit-page" ? "primary" : "default",
407
+ children: /* @__PURE__ */ jsx(FitScreenIcon, { fontSize: "small" })
408
+ }
409
+ ),
410
+ /* @__PURE__ */ jsx(Divider, { orientation: "vertical", flexItem: true, sx: { mx: 1 } }),
411
+ /* @__PURE__ */ jsx(
412
+ IconButton,
413
+ {
414
+ size: "small",
415
+ onClick: onDownloadClick,
416
+ title: "Download",
417
+ "aria-label": "Download TIFF",
418
+ children: /* @__PURE__ */ jsx(DownloadIcon, { fontSize: "small" })
419
+ }
420
+ ),
421
+ showMetadata && /* @__PURE__ */ jsx(
422
+ IconButton,
423
+ {
424
+ size: "small",
425
+ onClick: onMetadataClick,
426
+ title: "Document Metadata",
427
+ "aria-label": "View document metadata",
428
+ children: /* @__PURE__ */ jsx(InfoIcon, { fontSize: "small" })
429
+ }
430
+ ),
431
+ showProperties && /* @__PURE__ */ jsx(
432
+ IconButton,
433
+ {
434
+ size: "small",
435
+ onClick: onPropertiesClick,
436
+ title: "Document Properties",
437
+ "aria-label": "View document properties",
438
+ children: /* @__PURE__ */ jsx(DescriptionIcon, { fontSize: "small" })
439
+ }
440
+ )
441
+ ] }) }),
374
442
  isLoading && /* @__PURE__ */ jsx(LinearProgress, { sx: { mx: 3, mb: 1 } }),
375
443
  error && /* @__PURE__ */ jsx(Typography, { color: "error", variant: "body2", sx: { px: 3, pb: 1 }, children: error }),
376
444
  /* @__PURE__ */ jsx(Divider, {}),
@@ -379,57 +447,34 @@ var TIFFViewerContent = ({
379
447
  {
380
448
  sx: {
381
449
  flexGrow: 1,
450
+ flexShrink: 1,
382
451
  minHeight: 0,
383
- display: "flex",
384
- flexDirection: "column",
385
- p: 0
452
+ p: 0,
453
+ overflow: "auto",
454
+ backgroundColor: "#f6f8fa",
455
+ position: "relative"
386
456
  },
387
457
  children: /* @__PURE__ */ jsx(
388
458
  Box,
389
459
  {
390
460
  ref: viewportRef,
391
461
  sx: {
392
- flex: 1,
393
- overflow: "auto",
462
+ position: "absolute",
463
+ top: 0,
464
+ left: 0,
465
+ right: 0,
466
+ bottom: 0,
394
467
  display: "flex",
395
468
  alignItems: "center",
396
469
  justifyContent: "center",
397
470
  p: 3,
398
- backgroundColor: "#f6f8fa"
471
+ overflow: "auto"
399
472
  },
400
473
  children: renderImage()
401
474
  }
402
475
  )
403
476
  }
404
- ),
405
- hasMultipleFrames && /* @__PURE__ */ jsx(CardActions, { sx: { justifyContent: "center", px: 3, py: 2 }, children: /* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: 1, alignItems: "center", children: [
406
- /* @__PURE__ */ jsx(
407
- Button,
408
- {
409
- variant: "outlined",
410
- size: "small",
411
- onClick: () => setCurrentIndex((index) => Math.max(index - 1, 0)),
412
- disabled: currentIndex === 0,
413
- children: "Previous"
414
- }
415
- ),
416
- /* @__PURE__ */ jsxs(Typography, { variant: "body2", color: "text.secondary", children: [
417
- "Page ",
418
- currentIndex + 1,
419
- " of ",
420
- frames.length
421
- ] }),
422
- /* @__PURE__ */ jsx(
423
- Button,
424
- {
425
- variant: "outlined",
426
- size: "small",
427
- onClick: () => setCurrentIndex((index) => Math.min(index + 1, frames.length - 1)),
428
- disabled: currentIndex === frames.length - 1,
429
- children: "Next"
430
- }
431
- )
432
- ] }) })
477
+ )
433
478
  ] })
434
479
  }
435
480
  );
@@ -445,4 +490,4 @@ var TIFFViewer = (props) => {
445
490
  export {
446
491
  TIFFViewer
447
492
  };
448
- //# sourceMappingURL=chunk-NOLXOOIP.mjs.map
493
+ //# sourceMappingURL=chunk-YHMHDPLQ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/viewers/TIFFViewer.tsx"],"sourcesContent":["import React, {\r\n useCallback,\r\n useEffect,\r\n useMemo,\r\n useRef,\r\n useState\r\n} from 'react';\r\nimport {\r\n Box,\r\n Button,\r\n ButtonGroup,\r\n Card,\r\n CardContent,\r\n CardHeader,\r\n Divider,\r\n LinearProgress,\r\n Stack,\r\n Typography,\r\n IconButton,\r\n Tooltip\r\n} from '@mui/material';\r\nimport DownloadIcon from '@mui/icons-material/Download';\r\nimport FirstPageIcon from '@mui/icons-material/FirstPage';\r\nimport LastPageIcon from '@mui/icons-material/LastPage';\r\nimport ChevronLeftIcon from '@mui/icons-material/ChevronLeft';\r\nimport ChevronRightIcon from '@mui/icons-material/ChevronRight';\r\nimport ZoomInIcon from '@mui/icons-material/ZoomIn';\r\nimport ZoomOutIcon from '@mui/icons-material/ZoomOut';\r\nimport FitScreenIcon from '@mui/icons-material/FitScreen';\r\nimport AspectRatioIcon from '@mui/icons-material/AspectRatio';\r\nimport InfoIcon from '@mui/icons-material/Info';\r\nimport DescriptionIcon from '@mui/icons-material/Description';\r\nimport * as UTIF from 'utif';\r\nimport { FileViewerProps } from '../../types';\r\nimport { getFileExtension } from '../../utils/fileUtils';\r\nimport FileIcon from '../FileIcon';\r\n\r\ninterface TiffFrame {\r\n dataUrl: string;\r\n width: number;\r\n height: number;\r\n}\r\n\r\nconst decodeTiff = (buffer: ArrayBuffer): TiffFrame[] => {\r\n if (typeof window === 'undefined') {\r\n return [];\r\n }\r\n\r\n const frames: TiffFrame[] = [];\r\n const images = UTIF.decode(buffer);\r\n\r\n images.forEach((image) => {\r\n try {\r\n UTIF.decodeImage(buffer, image);\r\n const rgba = UTIF.toRGBA8(image);\r\n const width = image.width || 0;\r\n const height = image.height || 0;\r\n\r\n if (!width || !height) {\r\n return;\r\n }\r\n\r\n const canvas = document.createElement('canvas');\r\n canvas.width = width;\r\n canvas.height = height;\r\n const context = canvas.getContext('2d');\r\n\r\n if (!context) {\r\n return;\r\n }\r\n\r\n const clamped = new Uint8ClampedArray(rgba.length);\r\n clamped.set(rgba);\r\n const imageData = new ImageData(clamped, width, height);\r\n context.putImageData(imageData, 0, 0);\r\n frames.push({ dataUrl: canvas.toDataURL('image/png'), width, height });\r\n } catch (error) {\r\n // Skip frames that fail to decode\r\n }\r\n });\r\n\r\n return frames;\r\n};\r\n\r\nconst resolveDocumentName = (file?: File, fileName?: string, url?: string) => {\r\n if (file?.name) {\r\n return file.name;\r\n }\r\n if (fileName) {\r\n return fileName;\r\n }\r\n if (url) {\r\n const parts = url.split('?')[0]?.split('#')[0]?.split('/') ?? [];\r\n return parts[parts.length - 1] || 'document.tiff';\r\n }\r\n return 'document.tiff';\r\n};\r\n\r\ninterface TIFFViewerContentProps extends FileViewerProps {\r\n sourceDescription: string;\r\n}\r\n\r\nconst TIFFViewerContent: React.FC<TIFFViewerContentProps> = ({\r\n sourceDescription,\r\n file,\r\n url,\r\n fileName,\r\n className = '',\r\n style = {},\r\n width = '100%',\r\n height = '100%',\r\n onLoad,\r\n onError,\r\n onDownloadClick,\r\n onMetadataClick,\r\n onPropertiesClick,\r\n showMetadata = true,\r\n showProperties = true,\r\n // Extract props that shouldn't be passed to DOM elements\r\n mimeType,\r\n fileSize,\r\n initialSearchText,\r\n initialSearchPages,\r\n autoOpenSearch,\r\n autoExecuteSearch,\r\n onSearchComplete,\r\n ...props\r\n}) => {\r\n const [frames, setFrames] = useState<TiffFrame[]>([]);\r\n const [currentIndex, setCurrentIndex] = useState(0);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [fitMode, setFitMode] = useState<'fit-width' | 'fit-page' | 'zoom'>('fit-page');\r\n const [zoom, setZoom] = useState(1);\r\n const [viewportWidth, setViewportWidth] = useState<number>(0);\r\n const [viewportHeight, setViewportHeight] = useState<number>(0);\r\n const viewportRef = useRef<HTMLDivElement | null>(null);\r\n\r\n const resolvedFileName = useMemo(\r\n () => fileName || sourceDescription,\r\n [fileName, sourceDescription]\r\n );\r\n\r\n const fileExtension = useMemo(\r\n () => getFileExtension(resolvedFileName || ''),\r\n [resolvedFileName]\r\n );\r\n\r\n const loadTiff = useCallback(async () => {\r\n if (!file && !url) {\r\n setFrames([]);\r\n setCurrentIndex(0);\r\n setError(null);\r\n return;\r\n }\r\n\r\n if (typeof window === 'undefined') {\r\n return;\r\n }\r\n\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n try {\r\n let buffer: ArrayBuffer;\r\n if (file) {\r\n buffer = await file.arrayBuffer();\r\n } else {\r\n const response = await fetch(url!);\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch TIFF (${response.status})`);\r\n }\r\n buffer = await response.arrayBuffer();\r\n }\r\n\r\n const decodedFrames = decodeTiff(buffer);\r\n setFrames(decodedFrames);\r\n setCurrentIndex(0);\r\n setFitMode('fit-page');\r\n setZoom(1);\r\n\r\n if (decodedFrames.length > 0) {\r\n onLoad?.();\r\n } else {\r\n setError('No displayable frames detected in TIFF file.');\r\n }\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : 'Unable to load TIFF file';\r\n setError(message);\r\n setFrames([]);\r\n setCurrentIndex(0);\r\n setFitMode('fit-page');\r\n setZoom(1);\r\n onError?.(new Error(message));\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n }, [file, url, onLoad, onError]);\r\n\r\n useEffect(() => {\r\n void loadTiff();\r\n }, [loadTiff]);\r\n\r\n const currentFrame = frames[currentIndex];\r\n const hasFrames = frames.length > 0;\r\n const hasMultipleFrames = frames.length > 1;\r\n\r\n useEffect(() => {\r\n if (hasFrames) {\r\n setZoom(1);\r\n setFitMode('fit-page');\r\n }\r\n }, [currentIndex, hasFrames]);\r\n\r\n useEffect(() => {\r\n if (typeof window === 'undefined' || typeof ResizeObserver === 'undefined') {\r\n return undefined;\r\n }\r\n\r\n if (!viewportRef.current) {\r\n return undefined;\r\n }\r\n\r\n const updateSize = () => {\r\n const bounds = viewportRef.current?.getBoundingClientRect();\r\n if (bounds) {\r\n setViewportWidth(bounds.width);\r\n setViewportHeight(bounds.height);\r\n }\r\n };\r\n\r\n updateSize();\r\n const observer = new ResizeObserver(updateSize);\r\n observer.observe(viewportRef.current);\r\n\r\n return () => {\r\n observer.disconnect();\r\n };\r\n }, []);\r\n\r\n const handleZoomIn = useCallback(() => {\r\n setFitMode('zoom');\r\n setZoom((value) => Math.min(Math.round((value + 0.25) * 100) / 100, 5));\r\n }, []);\r\n\r\n const handleZoomOut = useCallback(() => {\r\n setFitMode('zoom');\r\n setZoom((value) => Math.max(Math.round((value - 0.25) * 100) / 100, 0.25));\r\n }, []);\r\n\r\n const handleFitWidth = useCallback(() => {\r\n setFitMode('fit-width');\r\n setZoom(1);\r\n }, []);\r\n\r\n const handleFitPage = useCallback(() => {\r\n setFitMode('fit-page');\r\n setZoom(1);\r\n }, []);\r\n\r\n const handleFirstPage = useCallback(() => {\r\n setCurrentIndex(0);\r\n }, []);\r\n\r\n const handleLastPage = useCallback(() => {\r\n setCurrentIndex(frames.length - 1);\r\n }, [frames.length]);\r\n\r\n const handlePreviousPage = useCallback(() => {\r\n setCurrentIndex((index) => Math.max(index - 1, 0));\r\n }, []);\r\n\r\n const handleNextPage = useCallback(() => {\r\n setCurrentIndex((index) => Math.min(index + 1, frames.length - 1));\r\n }, [frames.length]);\r\n\r\n const effectiveScale = useMemo(() => {\r\n if (!currentFrame) {\r\n return 1;\r\n }\r\n\r\n if (fitMode === 'zoom') {\r\n return zoom;\r\n }\r\n\r\n const frameWidth = currentFrame.width;\r\n const frameHeight = currentFrame.height;\r\n\r\n if (!viewportWidth || !viewportHeight || !frameWidth || !frameHeight) {\r\n return 1;\r\n }\r\n\r\n if (fitMode === 'fit-page') {\r\n const ratio = Math.min(viewportWidth / frameWidth, viewportHeight / frameHeight);\r\n return ratio || 1;\r\n }\r\n\r\n const widthRatio = viewportWidth / frameWidth;\r\n return widthRatio || 1;\r\n }, [currentFrame, fitMode, viewportWidth, viewportHeight, zoom]);\r\n\r\n const displayScale = useMemo(() => Math.round(effectiveScale * 100), [effectiveScale]);\r\n\r\n const renderImage = () => {\r\n if (!currentFrame) {\r\n return (\r\n <Typography variant=\"body2\" color=\"text.secondary\">\r\n No TIFF frame available.\r\n </Typography>\r\n );\r\n }\r\n\r\n const widthPx = currentFrame.width * effectiveScale;\r\n const heightPx = currentFrame.height * effectiveScale;\r\n\r\n return (\r\n <Box\r\n sx={{\r\n position: 'relative',\r\n width: widthPx,\r\n height: heightPx,\r\n borderRadius: 1,\r\n boxShadow: 1,\r\n backgroundColor: '#fff'\r\n }}\r\n >\r\n <Box\r\n component=\"img\"\r\n src={currentFrame.dataUrl}\r\n alt={`${resolvedFileName} page ${currentIndex + 1}`}\r\n sx={{\r\n width: widthPx,\r\n height: heightPx,\r\n display: 'block',\r\n borderRadius: 1\r\n }}\r\n />\r\n </Box>\r\n );\r\n };\r\n\r\n return (\r\n <Box\r\n className={`tiff-viewer ${className}`}\r\n sx={{\r\n width,\r\n height,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n overflow: 'hidden',\r\n ...style\r\n }}\r\n {...props}\r\n >\r\n <Card sx={{ height: '100%', width: '100%', display: 'flex', flexDirection: 'column', overflow: 'hidden' }} elevation={1}>\r\n <CardHeader\r\n avatar={<FileIcon ext={fileExtension} size={32} />}\r\n title={\r\n <Typography variant=\"subtitle1\" fontWeight={500}>\r\n {resolvedFileName}\r\n </Typography>\r\n }\r\n sx={{ pb: 1 }}\r\n />\r\n\r\n {/* Toolbar - All Controls at Top (Centered) */}\r\n <Box sx={{ px: 2, pb: 1, display: 'flex', justifyContent: 'center' }}>\r\n <Stack direction=\"row\" spacing={1} alignItems=\"center\" flexWrap=\"wrap\" gap={1}>\r\n {/* Page Navigation */}\r\n {hasMultipleFrames && (\r\n <>\r\n <IconButton\r\n size=\"small\"\r\n onClick={handleFirstPage}\r\n disabled={currentIndex === 0}\r\n title=\"First Page\"\r\n aria-label=\"Go to first page\"\r\n >\r\n <FirstPageIcon fontSize=\"small\" />\r\n </IconButton>\r\n <IconButton\r\n size=\"small\"\r\n onClick={handlePreviousPage}\r\n disabled={currentIndex === 0}\r\n title=\"Previous Page\"\r\n aria-label=\"Go to previous page\"\r\n >\r\n <ChevronLeftIcon fontSize=\"small\" />\r\n </IconButton>\r\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ minWidth: 100, textAlign: 'center' }}>\r\n Page {currentIndex + 1} of {frames.length}\r\n </Typography>\r\n <IconButton\r\n size=\"small\"\r\n onClick={handleNextPage}\r\n disabled={currentIndex === frames.length - 1}\r\n title=\"Next Page\"\r\n aria-label=\"Go to next page\"\r\n >\r\n <ChevronRightIcon fontSize=\"small\" />\r\n </IconButton>\r\n <IconButton\r\n size=\"small\"\r\n onClick={handleLastPage}\r\n disabled={currentIndex === frames.length - 1}\r\n title=\"Last Page\"\r\n aria-label=\"Go to last page\"\r\n >\r\n <LastPageIcon fontSize=\"small\" />\r\n </IconButton>\r\n <Divider orientation=\"vertical\" flexItem sx={{ mx: 1 }} />\r\n </>\r\n )}\r\n\r\n {/* Zoom Controls */}\r\n <IconButton\r\n size=\"small\"\r\n onClick={handleZoomOut}\r\n disabled={!hasFrames || zoom <= 0.25}\r\n title=\"Zoom Out\"\r\n aria-label=\"Zoom out\"\r\n >\r\n <ZoomOutIcon fontSize=\"small\" />\r\n </IconButton>\r\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ minWidth: 64, textAlign: 'center' }}>\r\n {hasFrames ? `${displayScale}%` : '—'}\r\n </Typography>\r\n <IconButton\r\n size=\"small\"\r\n onClick={handleZoomIn}\r\n disabled={!hasFrames || zoom >= 5}\r\n title=\"Zoom In\"\r\n aria-label=\"Zoom in\"\r\n >\r\n <ZoomInIcon fontSize=\"small\" />\r\n </IconButton>\r\n\r\n <IconButton\r\n size=\"small\"\r\n onClick={handleFitWidth}\r\n disabled={!hasFrames}\r\n title=\"Fit to Width\"\r\n aria-label=\"Fit to width\"\r\n color={fitMode === 'fit-width' ? 'primary' : 'default'}\r\n >\r\n <AspectRatioIcon fontSize=\"small\" />\r\n </IconButton>\r\n\r\n <IconButton\r\n size=\"small\"\r\n onClick={handleFitPage}\r\n disabled={!hasFrames}\r\n title=\"Fit to Page\"\r\n aria-label=\"Fit to page\"\r\n color={fitMode === 'fit-page' ? 'primary' : 'default'}\r\n >\r\n <FitScreenIcon fontSize=\"small\" />\r\n </IconButton>\r\n\r\n <Divider orientation=\"vertical\" flexItem sx={{ mx: 1 }} />\r\n\r\n {/* Actions */}\r\n <IconButton\r\n size=\"small\"\r\n onClick={onDownloadClick}\r\n title=\"Download\"\r\n aria-label=\"Download TIFF\"\r\n >\r\n <DownloadIcon fontSize=\"small\" />\r\n </IconButton>\r\n\r\n {showMetadata && (\r\n <IconButton\r\n size=\"small\"\r\n onClick={onMetadataClick}\r\n title=\"Document Metadata\"\r\n aria-label=\"View document metadata\"\r\n >\r\n <InfoIcon fontSize=\"small\" />\r\n </IconButton>\r\n )}\r\n\r\n {showProperties && (\r\n <IconButton\r\n size=\"small\"\r\n onClick={onPropertiesClick}\r\n title=\"Document Properties\"\r\n aria-label=\"View document properties\"\r\n >\r\n <DescriptionIcon fontSize=\"small\" />\r\n </IconButton>\r\n )}\r\n </Stack>\r\n </Box>\r\n\r\n {isLoading && <LinearProgress sx={{ mx: 3, mb: 1 }} />}\r\n {error && (\r\n <Typography color=\"error\" variant=\"body2\" sx={{ px: 3, pb: 1 }}>\r\n {error}\r\n </Typography>\r\n )}\r\n <Divider />\r\n <CardContent\r\n sx={{\r\n flexGrow: 1,\r\n flexShrink: 1,\r\n minHeight: 0,\r\n p: 0,\r\n overflow: 'auto',\r\n backgroundColor: '#f6f8fa',\r\n position: 'relative'\r\n }}\r\n >\r\n <Box\r\n ref={viewportRef}\r\n sx={{\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n p: 3,\r\n overflow: 'auto'\r\n }}\r\n >\r\n {renderImage()}\r\n </Box>\r\n </CardContent>\r\n </Card>\r\n </Box>\r\n );\r\n};\r\n\r\nexport const TIFFViewer: React.FC<FileViewerProps> = (props) => {\r\n const sourceDescription = useMemo(\r\n () => resolveDocumentName(props.file, props.fileName, props.url),\r\n [props.file, props.fileName, props.url]\r\n );\r\n\r\n return <TIFFViewerContent {...props} sourceDescription={sourceDescription} />;\r\n};\r\n"],"mappings":"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","names":[]}
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { F as FileViewerProps } from '../../types-CquKzJLE.mjs';
2
+ import { F as FileViewerProps } from '../../types-C6IEfcTM.mjs';
3
3
 
4
4
  declare const AudioViewer: React.FC<FileViewerProps>;
5
5
 
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { F as FileViewerProps } from '../../types-CquKzJLE.js';
2
+ import { F as FileViewerProps } from '../../types-C6IEfcTM.js';
3
3
 
4
4
  declare const AudioViewer: React.FC<FileViewerProps>;
5
5
 
@@ -1,9 +1,9 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
2
 
3
3
 
4
- var _chunkEMP7RZM2js = require('../../chunk-EMP7RZM2.js');
4
+ var _chunkDOOYIHGWjs = require('../../chunk-DOOYIHGW.js');
5
5
  require('../../chunk-RE4XRGSV.js');
6
6
 
7
7
 
8
- exports.AudioViewer = _chunkEMP7RZM2js.AudioViewer;
8
+ exports.AudioViewer = _chunkDOOYIHGWjs.AudioViewer;
9
9
  //# sourceMappingURL=AudioViewer.js.map
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  AudioViewer
4
- } from "../../chunk-FZYMVHF6.mjs";
4
+ } from "../../chunk-4DJJINTB.mjs";
5
5
  import "../../chunk-QQDQJ7TS.mjs";
6
6
  export {
7
7
  AudioViewer
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { F as FileViewerProps } from '../../types-CquKzJLE.mjs';
2
+ import { F as FileViewerProps } from '../../types-C6IEfcTM.mjs';
3
3
 
4
4
  declare const DefaultViewer: React.FC<FileViewerProps>;
5
5
 
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { F as FileViewerProps } from '../../types-CquKzJLE.js';
2
+ import { F as FileViewerProps } from '../../types-C6IEfcTM.js';
3
3
 
4
4
  declare const DefaultViewer: React.FC<FileViewerProps>;
5
5
 
@@ -1,8 +1,9 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
2
 
3
3
 
4
- var _chunkZ7FUO5RXjs = require('../../chunk-Z7FUO5RX.js');
4
+ var _chunk77UARJVQjs = require('../../chunk-77UARJVQ.js');
5
+ require('../../chunk-RE4XRGSV.js');
5
6
 
6
7
 
7
- exports.DefaultViewer = _chunkZ7FUO5RXjs.DefaultViewer;
8
+ exports.DefaultViewer = _chunk77UARJVQjs.DefaultViewer;
8
9
  //# sourceMappingURL=DefaultViewer.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["d:\\Projects\\DMS-File-Viewers\\packages\\lib\\dist\\components\\viewers\\DefaultViewer.js"],"names":[],"mappings":"AAAA,qFAAY;AACZ;AACE;AACF,0DAAgC;AAChC;AACE;AACF,uDAAC","file":"D:\\Projects\\DMS-File-Viewers\\packages\\lib\\dist\\components\\viewers\\DefaultViewer.js"}
1
+ {"version":3,"sources":["d:\\Projects\\DMS-File-Viewers\\packages\\lib\\dist\\components\\viewers\\DefaultViewer.js"],"names":[],"mappings":"AAAA,qFAAY;AACZ;AACE;AACF,0DAAgC;AAChC,mCAAgC;AAChC;AACE;AACF,uDAAC","file":"D:\\Projects\\DMS-File-Viewers\\packages\\lib\\dist\\components\\viewers\\DefaultViewer.js"}
@@ -1,7 +1,8 @@
1
1
  "use client";
2
2
  import {
3
3
  DefaultViewer
4
- } from "../../chunk-QLJKOQTP.mjs";
4
+ } from "../../chunk-677DWENS.mjs";
5
+ import "../../chunk-QQDQJ7TS.mjs";
5
6
  export {
6
7
  DefaultViewer
7
8
  };
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { F as FileViewerProps } from '../../types-CquKzJLE.mjs';
2
+ import { F as FileViewerProps } from '../../types-C6IEfcTM.mjs';
3
3
 
4
4
  declare const ImageViewer: React.FC<FileViewerProps>;
5
5
 
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { F as FileViewerProps } from '../../types-CquKzJLE.js';
2
+ import { F as FileViewerProps } from '../../types-C6IEfcTM.js';
3
3
 
4
4
  declare const ImageViewer: React.FC<FileViewerProps>;
5
5
 
@@ -1,10 +1,10 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
2
 
3
3
 
4
- var _chunkGNWU6XHHjs = require('../../chunk-GNWU6XHH.js');
5
- require('../../chunk-3STHCDAC.js');
4
+ var _chunk6ZBHO5SPjs = require('../../chunk-6ZBHO5SP.js');
5
+ require('../../chunk-QELOFQEB.js');
6
6
  require('../../chunk-RE4XRGSV.js');
7
7
 
8
8
 
9
- exports.ImageViewer = _chunkGNWU6XHHjs.ImageViewer;
9
+ exports.ImageViewer = _chunk6ZBHO5SPjs.ImageViewer;
10
10
  //# sourceMappingURL=ImageViewer.js.map
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  import {
3
3
  ImageViewer
4
- } from "../../chunk-XQBXRMB7.mjs";
5
- import "../../chunk-73ZIFR3P.mjs";
4
+ } from "../../chunk-UX6U3H7J.mjs";
5
+ import "../../chunk-K5SKH4SD.mjs";
6
6
  import "../../chunk-QQDQJ7TS.mjs";
7
7
  export {
8
8
  ImageViewer
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { F as FileViewerProps } from '../../types-CquKzJLE.mjs';
2
+ import { F as FileViewerProps } from '../../types-C6IEfcTM.mjs';
3
3
 
4
4
  interface PDFViewerMethods {
5
5
  zoomIn: () => void;
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { F as FileViewerProps } from '../../types-CquKzJLE.js';
2
+ import { F as FileViewerProps } from '../../types-C6IEfcTM.js';
3
3
 
4
4
  interface PDFViewerMethods {
5
5
  zoomIn: () => void;