@cannymindstech/file-viewers 0.27.1

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 (91) hide show
  1. package/dist/chunk-2BLHLWNN.js +299 -0
  2. package/dist/chunk-2BLHLWNN.js.map +1 -0
  3. package/dist/chunk-6BRYDA3B.js +329 -0
  4. package/dist/chunk-6BRYDA3B.js.map +1 -0
  5. package/dist/chunk-6MV4VQQN.mjs +2269 -0
  6. package/dist/chunk-6MV4VQQN.mjs.map +1 -0
  7. package/dist/chunk-7JPF5AYR.mjs +488 -0
  8. package/dist/chunk-7JPF5AYR.mjs.map +1 -0
  9. package/dist/chunk-7LPCKPN2.js +2269 -0
  10. package/dist/chunk-7LPCKPN2.js.map +1 -0
  11. package/dist/chunk-7PMZ4GN5.mjs +290 -0
  12. package/dist/chunk-7PMZ4GN5.mjs.map +1 -0
  13. package/dist/chunk-B5NNB4KD.mjs +268 -0
  14. package/dist/chunk-B5NNB4KD.mjs.map +1 -0
  15. package/dist/chunk-CIWCHSAA.js +309 -0
  16. package/dist/chunk-CIWCHSAA.js.map +1 -0
  17. package/dist/chunk-D7SDEVDM.js +268 -0
  18. package/dist/chunk-D7SDEVDM.js.map +1 -0
  19. package/dist/chunk-ECZ6IBOS.js +424 -0
  20. package/dist/chunk-ECZ6IBOS.js.map +1 -0
  21. package/dist/chunk-EKNP342T.mjs +299 -0
  22. package/dist/chunk-EKNP342T.mjs.map +1 -0
  23. package/dist/chunk-EM63H4SA.js +290 -0
  24. package/dist/chunk-EM63H4SA.js.map +1 -0
  25. package/dist/chunk-IJMNPAXX.mjs +309 -0
  26. package/dist/chunk-IJMNPAXX.mjs.map +1 -0
  27. package/dist/chunk-KJNOBIUZ.mjs +36 -0
  28. package/dist/chunk-KJNOBIUZ.mjs.map +1 -0
  29. package/dist/chunk-KQCU7XW2.mjs +424 -0
  30. package/dist/chunk-KQCU7XW2.mjs.map +1 -0
  31. package/dist/chunk-MJYCPSD4.js +742 -0
  32. package/dist/chunk-MJYCPSD4.js.map +1 -0
  33. package/dist/chunk-OPJOCUSL.js +36 -0
  34. package/dist/chunk-OPJOCUSL.js.map +1 -0
  35. package/dist/chunk-QGL3ZOPD.mjs +742 -0
  36. package/dist/chunk-QGL3ZOPD.mjs.map +1 -0
  37. package/dist/chunk-QV63FULE.js +488 -0
  38. package/dist/chunk-QV63FULE.js.map +1 -0
  39. package/dist/chunk-XJQ5J2UF.mjs +329 -0
  40. package/dist/chunk-XJQ5J2UF.mjs.map +1 -0
  41. package/dist/components/viewers/AudioViewer.d.mts +6 -0
  42. package/dist/components/viewers/AudioViewer.d.ts +6 -0
  43. package/dist/components/viewers/AudioViewer.js +10 -0
  44. package/dist/components/viewers/AudioViewer.js.map +1 -0
  45. package/dist/components/viewers/AudioViewer.mjs +10 -0
  46. package/dist/components/viewers/AudioViewer.mjs.map +1 -0
  47. package/dist/components/viewers/DefaultViewer.d.mts +6 -0
  48. package/dist/components/viewers/DefaultViewer.d.ts +6 -0
  49. package/dist/components/viewers/DefaultViewer.js +10 -0
  50. package/dist/components/viewers/DefaultViewer.js.map +1 -0
  51. package/dist/components/viewers/DefaultViewer.mjs +10 -0
  52. package/dist/components/viewers/DefaultViewer.mjs.map +1 -0
  53. package/dist/components/viewers/ImageViewer.d.mts +6 -0
  54. package/dist/components/viewers/ImageViewer.d.ts +6 -0
  55. package/dist/components/viewers/ImageViewer.js +10 -0
  56. package/dist/components/viewers/ImageViewer.js.map +1 -0
  57. package/dist/components/viewers/ImageViewer.mjs +10 -0
  58. package/dist/components/viewers/ImageViewer.mjs.map +1 -0
  59. package/dist/components/viewers/PDFViewer.d.mts +51 -0
  60. package/dist/components/viewers/PDFViewer.d.ts +51 -0
  61. package/dist/components/viewers/PDFViewer.js +11 -0
  62. package/dist/components/viewers/PDFViewer.js.map +1 -0
  63. package/dist/components/viewers/PDFViewer.mjs +11 -0
  64. package/dist/components/viewers/PDFViewer.mjs.map +1 -0
  65. package/dist/components/viewers/TIFFViewer.d.mts +6 -0
  66. package/dist/components/viewers/TIFFViewer.d.ts +6 -0
  67. package/dist/components/viewers/TIFFViewer.js +10 -0
  68. package/dist/components/viewers/TIFFViewer.js.map +1 -0
  69. package/dist/components/viewers/TIFFViewer.mjs +10 -0
  70. package/dist/components/viewers/TIFFViewer.mjs.map +1 -0
  71. package/dist/components/viewers/TextViewer.d.mts +6 -0
  72. package/dist/components/viewers/TextViewer.d.ts +6 -0
  73. package/dist/components/viewers/TextViewer.js +10 -0
  74. package/dist/components/viewers/TextViewer.js.map +1 -0
  75. package/dist/components/viewers/TextViewer.mjs +10 -0
  76. package/dist/components/viewers/TextViewer.mjs.map +1 -0
  77. package/dist/components/viewers/VideoViewer.d.mts +6 -0
  78. package/dist/components/viewers/VideoViewer.d.ts +6 -0
  79. package/dist/components/viewers/VideoViewer.js +10 -0
  80. package/dist/components/viewers/VideoViewer.js.map +1 -0
  81. package/dist/components/viewers/VideoViewer.mjs +10 -0
  82. package/dist/components/viewers/VideoViewer.mjs.map +1 -0
  83. package/dist/index.d.mts +75 -0
  84. package/dist/index.d.ts +75 -0
  85. package/dist/index.js +305 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/index.mjs +305 -0
  88. package/dist/index.mjs.map +1 -0
  89. package/dist/types-AT684fjV.d.mts +96 -0
  90. package/dist/types-AT684fjV.d.ts +96 -0
  91. package/package.json +45 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/viewers/TIFFViewer.tsx"],"sourcesContent":["import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n Box,\n Button,\n ButtonGroup,\n Card,\n CardContent,\n CardHeader,\n Divider,\n LinearProgress,\n Stack,\n Typography,\n IconButton,\n Tooltip,\n} from \"@mui/material\";\nimport DownloadIcon from \"@mui/icons-material/Download\";\nimport PrintIcon from \"@mui/icons-material/Print\";\nimport FullscreenIcon from \"@mui/icons-material/Fullscreen\";\nimport FirstPageIcon from \"@mui/icons-material/FirstPage\";\nimport LastPageIcon from \"@mui/icons-material/LastPage\";\nimport ChevronLeftIcon from \"@mui/icons-material/ChevronLeft\";\nimport ChevronRightIcon from \"@mui/icons-material/ChevronRight\";\nimport ZoomInIcon from \"@mui/icons-material/ZoomIn\";\nimport ZoomOutIcon from \"@mui/icons-material/ZoomOut\";\nimport FitScreenIcon from \"@mui/icons-material/FitScreen\";\nimport AspectRatioIcon from \"@mui/icons-material/AspectRatio\";\nimport InfoIcon from \"@mui/icons-material/Info\";\nimport DescriptionIcon from \"@mui/icons-material/Description\";\nimport HistoryIcon from \"@mui/icons-material/History\";\nimport { LocalOffer } from \"@mui/icons-material\";\nimport { FileViewerProps } from \"../../types\";\nimport { getFileExtension } from \"../../utils/fileUtils\";\nimport { mergeToolbarConfig } from \"../../utils/toolbarUtils\";\nimport FileIcon from \"../FileIcon\";\n\nconst resolveDocumentName = (file?: File, fileName?: string, url?: string) => {\n if (file?.name) {\n return file.name;\n }\n if (fileName) {\n return fileName;\n }\n if (url) {\n const parts = url.split(\"?\")[0]?.split(\"#\")[0]?.split(\"/\") ?? [];\n return parts[parts.length - 1] || \"document.tiff\";\n }\n return \"document.tiff\";\n};\n\ninterface TIFFViewerContentProps extends FileViewerProps {\n sourceDescription: string;\n}\n\nconst TIFFViewerContent: React.FC<TIFFViewerContentProps> = ({\n sourceDescription,\n file,\n url,\n fileName,\n totalPages = 1,\n className = \"\",\n style = {},\n width = \"100%\",\n height = \"100%\",\n onLoad,\n onError,\n onDownloadClick,\n onPrintClick,\n onTagsClick,\n onMetadataClick,\n onPropertiesClick,\n onHistoryClick,\n pageLoader,\n showDownload = true,\n showPrint = true,\n showMetadata = false,\n showTags = true,\n showProperties = false,\n showHistory = true,\n // Extract props that shouldn't be passed to DOM elements\n mimeType,\n fileSize,\n showPageCount,\n showPageNavigation,\n showZoomControls,\n showSearch,\n customRegistry,\n initialSearchText,\n initialSearchPages,\n autoOpenSearch,\n autoExecuteSearch,\n onSearchComplete,\n toolbarActions,\n ...props\n}) => {\n const [currentPage, setCurrentPage] = useState(1);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [fitMode, setFitMode] = useState<\"fit-width\" | \"fit-page\" | \"zoom\">(\n \"fit-page\"\n );\n const [zoom, setZoom] = useState(100);\n const [viewportWidth, setViewportWidth] = useState<number>(0);\n const [viewportHeight, setViewportHeight] = useState<number>(0);\n const [isFullScreen, setIsFullScreen] = useState(false);\n const [imageUrl, setImageUrl] = useState<string | null>(null);\n const [pageImages, setPageImages] = useState<Map<number, string>>(new Map());\n const [internalLoading, setInternalLoading] = useState(false);\n const [imageSize, setImageSize] = useState<{\n width: number;\n height: number;\n } | null>(null);\n\n const viewportRef = useRef<HTMLDivElement | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const imgRef = useRef<HTMLImageElement | null>(null);\n\n // Store pageLoader in ref to prevent re-renders\n const pageLoaderRef = useRef(pageLoader);\n useEffect(() => {\n pageLoaderRef.current = pageLoader;\n }, [pageLoader]);\n\n // Update page image from ArrayBuffer data\n const updatePageImage = useCallback(\n (pageData: ArrayBuffer, pageNumber: number) => {\n const blob = new Blob([pageData]);\n const imageUrl = URL.createObjectURL(blob);\n\n setPageImages((prev) => {\n // Only clean up old URL if we're replacing with a different one\n const oldUrl = prev.get(pageNumber);\n if (oldUrl && oldUrl !== imageUrl) {\n URL.revokeObjectURL(oldUrl);\n }\n return new Map(prev).set(pageNumber, imageUrl);\n });\n setCurrentPage(pageNumber);\n setImageUrl(imageUrl);\n },\n []\n );\n\n // Load initial page when pageLoader is available\n useEffect(() => {\n const loadInitialPage = async () => {\n if (pageLoaderRef.current && !pageImages.has(1) && currentPage === 1) {\n setInternalLoading(true);\n setError(null);\n\n try {\n const pageData = await pageLoaderRef.current(1);\n if (pageData) {\n updatePageImage(pageData, 1);\n } else {\n setError(\"Failed to load page 1\");\n }\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Unable to load page 1\";\n setError(message);\n onError?.(new Error(message));\n } finally {\n setInternalLoading(false);\n }\n }\n };\n\n loadInitialPage();\n }, [pageImages, currentPage, updatePageImage, onError]);\n\n // Handle internal page navigation\n const handlePageChange = useCallback(\n async (newPageNumber: number) => {\n if (!pageLoaderRef.current) {\n console.warn(\"pageLoader not provided - page navigation disabled\");\n return;\n }\n\n // Check if page is already cached\n const cachedUrl = pageImages.get(newPageNumber);\n if (cachedUrl) {\n setCurrentPage(newPageNumber);\n setImageUrl(cachedUrl);\n return;\n }\n\n setInternalLoading(true);\n setError(null);\n\n try {\n const pageData = await pageLoaderRef.current(newPageNumber);\n if (pageData) {\n updatePageImage(pageData, newPageNumber);\n } else {\n setError(`Failed to load page ${newPageNumber}`);\n }\n } catch (err) {\n const message =\n err instanceof Error\n ? err.message\n : `Unable to load page ${newPageNumber}`;\n setError(message);\n onError?.(new Error(message));\n } finally {\n setInternalLoading(false);\n }\n },\n [pageImages, onError, updatePageImage]\n );\n\n const resolvedFileName = useMemo(\n () => fileName || sourceDescription,\n [fileName, sourceDescription]\n );\n\n const fileExtension = useMemo(\n () => getFileExtension(resolvedFileName || \"\"),\n [resolvedFileName]\n );\n\n const loadImage = useCallback(\n async (resetPage = false) => {\n if (!file && !url) {\n setImageUrl(null);\n if (resetPage) setCurrentPage(1);\n setError(null);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n let imageDataUrl: string;\n if (file) {\n imageDataUrl = URL.createObjectURL(file);\n } else if (url) {\n imageDataUrl = url;\n } else {\n throw new Error(\"No file or URL provided\");\n }\n\n setImageUrl(imageDataUrl);\n if (resetPage) {\n setCurrentPage(1);\n setFitMode(\"fit-page\");\n setZoom(100);\n }\n onLoad?.();\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Unable to load image file\";\n setError(message);\n setImageUrl(null);\n if (resetPage) {\n setCurrentPage(1);\n setFitMode(\"fit-width\");\n setZoom(100);\n }\n onError?.(new Error(message));\n } finally {\n setIsLoading(false);\n }\n },\n [file, url, onLoad, onError]\n );\n\n const [previousFileSource, setPreviousFileSource] = useState<{\n file?: File;\n url?: string;\n }>({});\n\n useEffect(() => {\n const currentFileSource = { file, url };\n const isNewFile =\n previousFileSource.file !== file || previousFileSource.url !== url;\n\n if (isNewFile) {\n setPreviousFileSource(currentFileSource);\n void loadImage(true); // Reset page on new file\n } else {\n void loadImage(false); // Don't reset page for same file\n }\n }, [file, url, loadImage, previousFileSource.file, previousFileSource.url]);\n\n useEffect(() => {\n return () => {\n // Clean up all cached page URLs only on unmount\n pageImages.forEach((url) => {\n URL.revokeObjectURL(url);\n });\n // Clean up current image URL if it's from a file (not from pageLoader)\n if (imageUrl && file && !pageImages.has(currentPage)) {\n URL.revokeObjectURL(imageUrl);\n }\n };\n }, []); // Empty dependency array - only cleanup on unmount\n\n const hasImage = !!imageUrl;\n const hasMultiplePages = totalPages > 1;\n\n // Constants for zoom calculation\n const MARGIN = 40;\n const MIN_ZOOM = 25;\n const MAX_ZOOM = 400;\n const ZOOM_LEVELS = [25, 50, 75, 100, 125, 150, 200, 300, 400];\n\n // Helper function to calculate zoom based on fit mode\n const calculateFitZoom = useCallback(\n (mode: \"fit-width\" | \"fit-page\"): number | null => {\n if (!imageSize || viewportWidth <= 0) return null;\n\n const availableWidth = viewportWidth - MARGIN;\n\n if (mode === \"fit-width\") {\n const calculatedZoom = Math.round(\n (availableWidth / imageSize.width) * 100\n );\n return Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, calculatedZoom));\n }\n\n if (mode === \"fit-page\" && viewportHeight > 0) {\n const availableHeight = viewportHeight - MARGIN;\n const scaleW = availableWidth / imageSize.width;\n const scaleH = availableHeight / imageSize.height;\n const calculatedZoom = Math.round(Math.min(scaleW, scaleH) * 100);\n return Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, calculatedZoom));\n }\n\n return null;\n },\n [imageSize, viewportWidth, viewportHeight]\n );\n\n // Recalculate zoom when changing pages in fit modes\n useEffect(() => {\n if (!hasImage || !imageSize) return;\n\n const newZoom = calculateFitZoom(fitMode as \"fit-width\" | \"fit-page\");\n if (newZoom !== null) {\n setZoom(newZoom);\n }\n }, [currentPage, hasImage, imageSize, fitMode, calculateFitZoom]);\n\n useEffect(() => {\n if (\n typeof window === \"undefined\" ||\n typeof ResizeObserver === \"undefined\"\n ) {\n return undefined;\n }\n\n if (!viewportRef.current) {\n return undefined;\n }\n\n const updateSize = () => {\n const bounds = viewportRef.current?.getBoundingClientRect();\n if (bounds) {\n setViewportWidth(bounds.width);\n setViewportHeight(bounds.height);\n }\n };\n\n updateSize();\n const observer = new ResizeObserver(updateSize);\n observer.observe(viewportRef.current);\n\n return () => {\n observer.disconnect();\n };\n }, []);\n\n const handleZoomIn = useCallback(() => {\n setFitMode(\"zoom\");\n setZoom((value) => {\n const nextLevel = ZOOM_LEVELS.find((level) => level > value);\n return nextLevel || MAX_ZOOM;\n });\n }, []);\n\n const handleZoomOut = useCallback(() => {\n setFitMode(\"zoom\");\n setZoom((value) => {\n const prevLevel = [...ZOOM_LEVELS]\n .reverse()\n .find((level) => level < value);\n return prevLevel || MIN_ZOOM;\n });\n }, []);\n\n const handleFitWidth = useCallback(() => {\n setFitMode(\"fit-width\");\n const newZoom = calculateFitZoom(\"fit-width\");\n if (newZoom !== null) {\n setZoom(newZoom);\n }\n }, [calculateFitZoom]);\n\n const handleFitPage = useCallback(() => {\n setFitMode(\"fit-page\");\n const newZoom = calculateFitZoom(\"fit-page\");\n if (newZoom !== null) {\n setZoom(newZoom);\n }\n }, [calculateFitZoom]);\n\n const handleFirstPage = useCallback(() => {\n handlePageChange(1);\n }, [handlePageChange]);\n\n const handleLastPage = useCallback(() => {\n handlePageChange(totalPages);\n }, [handlePageChange, totalPages]);\n\n const handlePreviousPage = useCallback(() => {\n const newPage = Math.max(currentPage - 1, 1);\n if (newPage !== currentPage) {\n handlePageChange(newPage);\n }\n }, [currentPage, handlePageChange]);\n\n const handleNextPage = useCallback(() => {\n const newPage = Math.min(currentPage + 1, totalPages);\n if (newPage !== currentPage) {\n handlePageChange(newPage);\n }\n }, [currentPage, totalPages, handlePageChange]);\n\n const handleToggleFullScreen = useCallback(() => {\n if (!isFullScreen && containerRef.current?.requestFullscreen) {\n containerRef.current.requestFullscreen();\n setIsFullScreen(true);\n } else if (isFullScreen && document.exitFullscreen) {\n document.exitFullscreen();\n setIsFullScreen(false);\n }\n }, [isFullScreen]);\n\n const toolbar = mergeToolbarConfig({\n showDownload,\n showPrint,\n showMetadata,\n showTags,\n showProperties,\n showHistory,\n onDownloadClick,\n onPrintClick,\n onTagsClick,\n onMetadataClick,\n onPropertiesClick,\n onHistoryClick,\n toolbarActions,\n });\n\n const displayScale = zoom;\n\n const handleImageLoad = useCallback(\n (e: React.SyntheticEvent<HTMLImageElement>) => {\n const img = e.currentTarget;\n setImageSize({ width: img.naturalWidth, height: img.naturalHeight });\n if (!hasImage) {\n onLoad?.();\n }\n },\n [hasImage, onLoad]\n );\n\n const renderImage = () => {\n if (!imageUrl) {\n return (\n <Typography variant=\"body2\" color=\"text.secondary\">\n No image available.\n </Typography>\n );\n }\n\n // Calculate scaled dimensions based on zoom\n let imgStyle: React.CSSProperties = {\n display: \"block\",\n borderRadius: \"4px\",\n };\n\n if (imageSize) {\n // Always use zoom-based calculation for consistent behavior\n const zoomFactor = zoom / 100;\n const scaledWidth = imageSize.width * zoomFactor;\n const scaledHeight = imageSize.height * zoomFactor;\n imgStyle = {\n ...imgStyle,\n width: `${scaledWidth}px`,\n height: `${scaledHeight}px`,\n maxWidth: \"none\",\n maxHeight: \"none\",\n };\n }\n\n return (\n <Box\n component=\"img\"\n ref={imgRef}\n src={imageUrl}\n alt={`${resolvedFileName} page ${currentPage}`}\n onLoad={handleImageLoad}\n onError={() => {\n setError(\"Failed to load image\");\n onError?.(new Error(\"Failed to load image\"));\n }}\n sx={{\n ...imgStyle,\n boxShadow: 1,\n backgroundColor: \"#fff\",\n margin: \"20px\",\n }}\n />\n );\n };\n\n return (\n <Box\n ref={containerRef}\n className={`tiff-viewer ${className}`}\n sx={{\n width,\n height,\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n ...style,\n }}\n {...props}\n >\n <Card\n sx={{\n height: \"100%\",\n width: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n }}\n elevation={1}\n >\n <CardHeader\n avatar={<FileIcon ext={fileExtension} size={32} />}\n title={\n <Typography variant=\"subtitle1\" fontWeight={500}>\n {resolvedFileName}\n </Typography>\n }\n sx={{ pb: 1 }}\n />\n\n {/* Toolbar - All Controls at Top (Centered) */}\n <Box sx={{ px: 2, pb: 1, display: \"flex\", justifyContent: \"center\" }}>\n <Stack\n direction=\"row\"\n spacing={1}\n alignItems=\"center\"\n flexWrap=\"wrap\"\n gap={1}\n >\n {/* Page Navigation */}\n {hasMultiplePages && (\n <>\n <IconButton\n size=\"small\"\n onClick={handleFirstPage}\n disabled={currentPage === 1}\n title=\"First Page\"\n aria-label=\"Go to first page\"\n >\n <FirstPageIcon fontSize=\"small\" />\n </IconButton>\n <IconButton\n size=\"small\"\n onClick={handlePreviousPage}\n disabled={currentPage === 1}\n title=\"Previous Page\"\n aria-label=\"Go to previous page\"\n >\n <ChevronLeftIcon fontSize=\"small\" />\n </IconButton>\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{ minWidth: 100, textAlign: \"center\" }}\n >\n Page {currentPage} of {totalPages}\n </Typography>\n <IconButton\n size=\"small\"\n onClick={handleNextPage}\n disabled={currentPage === totalPages}\n title=\"Next Page\"\n aria-label=\"Go to next page\"\n >\n <ChevronRightIcon fontSize=\"small\" />\n </IconButton>\n <IconButton\n size=\"small\"\n onClick={handleLastPage}\n disabled={currentPage === totalPages}\n title=\"Last Page\"\n aria-label=\"Go to last page\"\n >\n <LastPageIcon fontSize=\"small\" />\n </IconButton>\n <Divider orientation=\"vertical\" flexItem sx={{ mx: 1 }} />\n </>\n )}\n\n {/* Zoom Controls */}\n <IconButton\n size=\"small\"\n onClick={handleZoomOut}\n disabled={!hasImage || zoom <= 25}\n title=\"Zoom Out\"\n aria-label=\"Zoom out\"\n >\n <ZoomOutIcon fontSize=\"small\" />\n </IconButton>\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{ minWidth: 64, textAlign: \"center\" }}\n >\n {hasImage ? `${displayScale}%` : \"—\"}\n </Typography>\n <IconButton\n size=\"small\"\n onClick={handleZoomIn}\n disabled={!hasImage || zoom >= 400}\n title=\"Zoom In\"\n aria-label=\"Zoom in\"\n >\n <ZoomInIcon fontSize=\"small\" />\n </IconButton>\n\n <IconButton\n size=\"small\"\n onClick={handleFitWidth}\n disabled={!hasImage}\n title=\"Fit to Width\"\n aria-label=\"Fit to width\"\n color={fitMode === \"fit-width\" ? \"primary\" : \"default\"}\n >\n <AspectRatioIcon fontSize=\"small\" />\n </IconButton>\n\n <IconButton\n size=\"small\"\n onClick={handleFitPage}\n disabled={!hasImage}\n title=\"Fit to Page\"\n aria-label=\"Fit to page\"\n color={fitMode === \"fit-page\" ? \"primary\" : \"default\"}\n >\n <FitScreenIcon fontSize=\"small\" />\n </IconButton>\n\n <Divider orientation=\"vertical\" flexItem sx={{ mx: 1 }} />\n\n {/* Actions */}\n {!toolbar.isHidden(\"download\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\"download\", onDownloadClick)}\n disabled={toolbar.isDisabled(\"download\")}\n title={toolbar.getLabel(\"download\") || \"Download\"}\n aria-label=\"Download TIFF\"\n >\n {toolbar.getIcon(\"download\") || (\n <DownloadIcon fontSize=\"small\" />\n )}\n </IconButton>\n )}\n\n {!toolbar.isHidden(\"print\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\"print\", onPrintClick)}\n disabled={toolbar.isDisabled(\"print\")}\n title={toolbar.getLabel(\"print\") || \"Print\"}\n aria-label=\"Print TIFF\"\n >\n {toolbar.getIcon(\"print\") || <PrintIcon fontSize=\"small\" />}\n </IconButton>\n )}\n\n {!toolbar.isHidden(\"fullscreen\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\n \"fullscreen\",\n handleToggleFullScreen\n )}\n disabled={toolbar.isDisabled(\"fullscreen\")}\n title={toolbar.getLabel(\"fullscreen\") || \"Fullscreen\"}\n aria-label=\"Toggle fullscreen\"\n >\n {toolbar.getIcon(\"fullscreen\") || (\n <FullscreenIcon fontSize=\"small\" />\n )}\n </IconButton>\n )}\n\n {!toolbar.isHidden(\"metadata\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\"metadata\", onMetadataClick)}\n disabled={toolbar.isDisabled(\"metadata\")}\n title={toolbar.getLabel(\"metadata\") || \"Document Metadata\"}\n aria-label=\"View document metadata\"\n >\n {toolbar.getIcon(\"metadata\") || (\n <DescriptionIcon fontSize=\"small\" />\n )}\n </IconButton>\n )}\n\n {!toolbar.isHidden(\"properties\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\"properties\", onPropertiesClick)}\n disabled={toolbar.isDisabled(\"properties\")}\n title={toolbar.getLabel(\"properties\") || \"Document Properties\"}\n aria-label=\"View document properties\"\n >\n {toolbar.getIcon(\"properties\") || <InfoIcon fontSize=\"small\" />}\n </IconButton>\n )}\n\n {!toolbar.isHidden(\"tags\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\"tags\", onTagsClick)}\n disabled={toolbar.isDisabled(\"tags\")}\n title={toolbar.getLabel(\"tags\") || \"Document Tags\"}\n aria-label=\"View document tags\"\n >\n {toolbar.getIcon(\"tags\") || <LocalOffer fontSize=\"small\" />}\n </IconButton>\n )}\n\n {!toolbar.isHidden(\"history\") && (\n <IconButton\n size=\"small\"\n onClick={toolbar.getHandler(\"history\", onHistoryClick)}\n disabled={toolbar.isDisabled(\"history\")}\n title={toolbar.getLabel(\"history\") || \"Document History\"}\n aria-label=\"View document history\"\n >\n {toolbar.getIcon(\"history\") || (\n <HistoryIcon fontSize=\"small\" />\n )}\n </IconButton>\n )}\n </Stack>\n </Box>\n\n {(isLoading || internalLoading) && (\n <LinearProgress sx={{ mx: 3, mb: 1 }} />\n )}\n {error && (\n <Typography color=\"error\" variant=\"body2\" sx={{ px: 3, pb: 1 }}>\n {error}\n </Typography>\n )}\n <Divider />\n <CardContent\n sx={{\n flexGrow: 1,\n flexShrink: 1,\n minHeight: 0,\n p: 0,\n overflow: \"hidden\",\n backgroundColor: \"#f6f8fa\",\n position: \"relative\",\n }}\n >\n <Box\n ref={viewportRef}\n sx={{\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n overflow: \"auto\",\n }}\n >\n <Box\n sx={{\n minWidth: \"100%\",\n minHeight: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {renderImage()}\n </Box>\n </Box>\n </CardContent>\n </Card>\n </Box>\n );\n};\n\nexport const TIFFViewer: React.FC<FileViewerProps> = (props) => {\n const sourceDescription = useMemo(\n () => resolveDocumentName(props.file, props.fileName, props.url),\n [props.file, props.fileName, props.url]\n );\n\n return <TIFFViewerContent {...props} sourceDescription={sourceDescription} />;\n};\n"],"mappings":"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","names":["imageUrl","url"]}
@@ -0,0 +1,488 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }"use client";
2
+
3
+
4
+ var _chunkECZ6IBOSjs = require('./chunk-ECZ6IBOS.js');
5
+
6
+
7
+
8
+ var _chunkEM63H4SAjs = require('./chunk-EM63H4SA.js');
9
+
10
+ // src/components/viewers/ImageViewer.tsx
11
+ var _react = require('react'); var _react2 = _interopRequireDefault(_react);
12
+
13
+ // src/components/viewers/image/ImageToolbar.tsx
14
+
15
+ var _ZoomIn = require('@mui/icons-material/ZoomIn'); var _ZoomIn2 = _interopRequireDefault(_ZoomIn);
16
+ var _ZoomOut = require('@mui/icons-material/ZoomOut'); var _ZoomOut2 = _interopRequireDefault(_ZoomOut);
17
+ var _RotateLeft = require('@mui/icons-material/RotateLeft'); var _RotateLeft2 = _interopRequireDefault(_RotateLeft);
18
+ var _RotateRight = require('@mui/icons-material/RotateRight'); var _RotateRight2 = _interopRequireDefault(_RotateRight);
19
+ var _FitScreen = require('@mui/icons-material/FitScreen'); var _FitScreen2 = _interopRequireDefault(_FitScreen);
20
+ var _AspectRatio = require('@mui/icons-material/AspectRatio'); var _AspectRatio2 = _interopRequireDefault(_AspectRatio);
21
+ var _Fullscreen = require('@mui/icons-material/Fullscreen'); var _Fullscreen2 = _interopRequireDefault(_Fullscreen);
22
+ var _Download = require('@mui/icons-material/Download'); var _Download2 = _interopRequireDefault(_Download);
23
+ var _Print = require('@mui/icons-material/Print'); var _Print2 = _interopRequireDefault(_Print);
24
+ var _Info = require('@mui/icons-material/Info'); var _Info2 = _interopRequireDefault(_Info);
25
+ var _Description = require('@mui/icons-material/Description'); var _Description2 = _interopRequireDefault(_Description);
26
+ var _History = require('@mui/icons-material/History'); var _History2 = _interopRequireDefault(_History);
27
+ var _iconsmaterial = require('@mui/icons-material');
28
+ var _jsxruntime = require('react/jsx-runtime');
29
+ var ImageToolbar = _react2.default.memo(
30
+ ({
31
+ zoom,
32
+ rotation,
33
+ onZoomIn,
34
+ onZoomOut,
35
+ onFitToWidth,
36
+ onFitToPage,
37
+ onRotateLeft,
38
+ onRotateRight,
39
+ onToggleFullScreen,
40
+ showDownload,
41
+ showPrint,
42
+ showMetadata,
43
+ showTags,
44
+ showProperties,
45
+ showHistory,
46
+ disabledDownload,
47
+ disabledPrint,
48
+ disabledMetadata,
49
+ disabledProperties,
50
+ disabledTags,
51
+ disabledHistory,
52
+ onDownloadClick,
53
+ onPrintClick,
54
+ onTagsClick,
55
+ onMetadataClick,
56
+ onPropertiesClick,
57
+ onHistoryClick
58
+ }) => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "pdf-viewer-toolbar", children: [
59
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "toolbar-separator" }),
60
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "toolbar-section", children: [
61
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "button", { className: "toolbar-button", onClick: onZoomOut, title: "Zoom Out", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _ZoomOut2.default, { fontSize: "small" }) }),
62
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "zoom-display", children: [
63
+ zoom,
64
+ "%"
65
+ ] }),
66
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "button", { className: "toolbar-button", onClick: onZoomIn, title: "Zoom In", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _ZoomIn2.default, { fontSize: "small" }) }),
67
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
68
+ "button",
69
+ {
70
+ className: "toolbar-button",
71
+ onClick: onFitToWidth,
72
+ title: "Fit to Width",
73
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _AspectRatio2.default, { fontSize: "small" })
74
+ }
75
+ ),
76
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
77
+ "button",
78
+ {
79
+ className: "toolbar-button",
80
+ onClick: onFitToPage,
81
+ title: "Fit to Page",
82
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _FitScreen2.default, { fontSize: "small" })
83
+ }
84
+ )
85
+ ] }),
86
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "toolbar-separator" }),
87
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "toolbar-section", children: [
88
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
89
+ "button",
90
+ {
91
+ className: "toolbar-button",
92
+ onClick: onRotateLeft,
93
+ title: "Rotate Left",
94
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _RotateLeft2.default, { fontSize: "small" })
95
+ }
96
+ ),
97
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
98
+ "button",
99
+ {
100
+ className: "toolbar-button",
101
+ onClick: onRotateRight,
102
+ title: "Rotate Right",
103
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _RotateRight2.default, { fontSize: "small" })
104
+ }
105
+ ),
106
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "page-info", children: [
107
+ "Rotation: ",
108
+ rotation,
109
+ "\xB0"
110
+ ] })
111
+ ] }),
112
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "toolbar-separator" }),
113
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "toolbar-section", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
114
+ "button",
115
+ {
116
+ className: "toolbar-button",
117
+ onClick: onToggleFullScreen,
118
+ title: "Fullscreen",
119
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _Fullscreen2.default, { fontSize: "small" })
120
+ }
121
+ ) }),
122
+ (showDownload || showPrint || showMetadata || showProperties || showTags || showHistory) && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
123
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "toolbar-separator" }),
124
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "toolbar-section", children: [
125
+ showDownload && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
126
+ "button",
127
+ {
128
+ className: "toolbar-button",
129
+ onClick: onDownloadClick,
130
+ disabled: disabledDownload,
131
+ title: "Download Image",
132
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _Download2.default, { fontSize: "small" })
133
+ }
134
+ ),
135
+ showPrint && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
136
+ "button",
137
+ {
138
+ className: "toolbar-button",
139
+ onClick: onPrintClick,
140
+ disabled: disabledPrint,
141
+ title: "Print Image",
142
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _Print2.default, { fontSize: "small" })
143
+ }
144
+ ),
145
+ showMetadata && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
146
+ "button",
147
+ {
148
+ className: "toolbar-button",
149
+ onClick: onMetadataClick,
150
+ disabled: disabledMetadata,
151
+ title: "Image Metadata",
152
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _Description2.default, { fontSize: "small" })
153
+ }
154
+ ),
155
+ showProperties && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
156
+ "button",
157
+ {
158
+ className: "toolbar-button",
159
+ onClick: onPropertiesClick,
160
+ disabled: disabledProperties,
161
+ title: "Image Properties",
162
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _Info2.default, { fontSize: "small" })
163
+ }
164
+ ),
165
+ showTags && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
166
+ "button",
167
+ {
168
+ className: "toolbar-button",
169
+ onClick: onTagsClick,
170
+ disabled: disabledTags,
171
+ title: "Image Tags",
172
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _iconsmaterial.LocalOffer, { fontSize: "small" })
173
+ }
174
+ ),
175
+ showHistory && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
176
+ "button",
177
+ {
178
+ className: "toolbar-button",
179
+ onClick: onHistoryClick,
180
+ disabled: disabledHistory,
181
+ title: "Image History",
182
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _History2.default, { fontSize: "small" })
183
+ }
184
+ )
185
+ ] })
186
+ ] })
187
+ ] })
188
+ );
189
+ ImageToolbar.displayName = "ImageToolbar";
190
+
191
+ // src/components/viewers/image/ImageHeader.tsx
192
+
193
+
194
+ var ImageHeader = _react2.default.memo(({ fileName, fileExtension }) => {
195
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "pdf-viewer-header", children: [
196
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkEM63H4SAjs.FileIcon_default, { ext: fileExtension, size: 26 }),
197
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "header-file-name", title: fileName, children: fileName })
198
+ ] });
199
+ });
200
+ ImageHeader.displayName = "ImageHeader";
201
+
202
+ // src/components/viewers/ImageViewer.tsx
203
+
204
+ var ImageViewer = ({
205
+ file,
206
+ url,
207
+ fileName,
208
+ width = "100%",
209
+ height = "100%",
210
+ className = "",
211
+ style = {},
212
+ showDownload = true,
213
+ showPrint = true,
214
+ showMetadata = false,
215
+ showTags = true,
216
+ showProperties = false,
217
+ showHistory = true,
218
+ onDownloadClick,
219
+ onPrintClick,
220
+ onTagsClick,
221
+ onMetadataClick,
222
+ onPropertiesClick,
223
+ onHistoryClick,
224
+ // Extract props that shouldn't be passed to DOM elements
225
+ mimeType,
226
+ fileSize,
227
+ showPageCount,
228
+ showPageNavigation,
229
+ showZoomControls,
230
+ showSearch,
231
+ customRegistry,
232
+ initialSearchText,
233
+ initialSearchPages,
234
+ autoOpenSearch,
235
+ autoExecuteSearch,
236
+ onSearchComplete,
237
+ toolbarActions,
238
+ ...props
239
+ }) => {
240
+ const containerRef = _react.useRef.call(void 0, null);
241
+ const imageAreaRef = _react.useRef.call(void 0, null);
242
+ const [imageSize, setImageSize] = _react.useState.call(void 0, { width: 0, height: 0 });
243
+ const [zoom, setZoom] = _react.useState.call(void 0, 100);
244
+ const [rotation, setRotation] = _react.useState.call(void 0, 0);
245
+ const [pendingFit, setPendingFit] = _react.useState.call(void 0, null);
246
+ const didAutoFit = _react.useRef.call(void 0, false);
247
+ const [isDragging, setIsDragging] = _react.useState.call(void 0, false);
248
+ const [dragStart, setDragStart] = _react.useState.call(void 0, { x: 0, y: 0 });
249
+ const [scrollStart, setScrollStart] = _react.useState.call(void 0, { left: 0, top: 0 });
250
+ const [isFullScreen, setIsFullScreen] = _react.useState.call(void 0, false);
251
+ const src = _react.useMemo.call(void 0, () => {
252
+ if (file) {
253
+ const objectUrl = URL.createObjectURL(file);
254
+ return objectUrl;
255
+ }
256
+ return url || "";
257
+ }, [file, url]);
258
+ _react.useEffect.call(void 0, () => {
259
+ return () => {
260
+ if (file && src) {
261
+ URL.revokeObjectURL(src);
262
+ }
263
+ };
264
+ }, [file, src]);
265
+ const handleImageLoad = (e) => {
266
+ const img = e.currentTarget;
267
+ setImageSize({ width: img.naturalWidth, height: img.naturalHeight });
268
+ if (!didAutoFit.current) {
269
+ setPendingFit("page");
270
+ didAutoFit.current = true;
271
+ }
272
+ };
273
+ _react.useEffect.call(void 0, () => {
274
+ if (!imageAreaRef.current || !imageSize.width || !imageSize.height || !pendingFit)
275
+ return;
276
+ const containerWidth = imageAreaRef.current.offsetWidth;
277
+ const containerHeight = imageAreaRef.current.offsetHeight;
278
+ const rot2 = rotation % 360;
279
+ const rotated2 = rot2 === 90 || rot2 === 270;
280
+ const imgW = rotated2 ? imageSize.height : imageSize.width;
281
+ const imgH = rotated2 ? imageSize.width : imageSize.height;
282
+ if (pendingFit === "width") {
283
+ setZoom(Math.round(containerWidth / imgW * 100));
284
+ } else if (pendingFit === "page") {
285
+ const scaleW = containerWidth / imgW;
286
+ const scaleH = containerHeight / imgH;
287
+ setZoom(Math.round(Math.min(scaleW, scaleH) * 100));
288
+ }
289
+ setPendingFit(null);
290
+ }, [pendingFit, imageSize, rotation]);
291
+ const handleZoomIn = () => setZoom((z) => Math.min(z + 10, 400));
292
+ const handleZoomOut = () => setZoom((z) => Math.max(z - 10, 10));
293
+ const handleFitToWidth = () => setPendingFit("width");
294
+ const handleFitToPage = () => setPendingFit("page");
295
+ const handleRotateLeft = () => setRotation((r) => (r - 90 + 360) % 360);
296
+ const handleRotateRight = () => setRotation((r) => (r + 90) % 360);
297
+ const handleToggleFullScreen = () => {
298
+ if (!isFullScreen && _optionalChain([containerRef, 'access', _ => _.current, 'optionalAccess', _2 => _2.requestFullscreen])) {
299
+ containerRef.current.requestFullscreen();
300
+ setIsFullScreen(true);
301
+ } else if (isFullScreen && document.exitFullscreen) {
302
+ document.exitFullscreen();
303
+ setIsFullScreen(false);
304
+ }
305
+ };
306
+ const handleMouseDown = (e) => {
307
+ if (imageAreaRef.current) {
308
+ setIsDragging(true);
309
+ setDragStart({ x: e.clientX, y: e.clientY });
310
+ setScrollStart({
311
+ left: imageAreaRef.current.scrollLeft,
312
+ top: imageAreaRef.current.scrollTop
313
+ });
314
+ }
315
+ };
316
+ const handleMouseMove = (e) => {
317
+ if (!isDragging || !imageAreaRef.current) return;
318
+ const dx = e.clientX - dragStart.x;
319
+ const dy = e.clientY - dragStart.y;
320
+ imageAreaRef.current.scrollLeft = scrollStart.left - dx;
321
+ imageAreaRef.current.scrollTop = scrollStart.top - dy;
322
+ };
323
+ const handleMouseUp = () => setIsDragging(false);
324
+ const handleMouseLeave = () => setIsDragging(false);
325
+ const toolbar = _chunkEM63H4SAjs.mergeToolbarConfig.call(void 0, {
326
+ showDownload,
327
+ showPrint,
328
+ showMetadata,
329
+ showTags,
330
+ showProperties,
331
+ showHistory,
332
+ onDownloadClick,
333
+ onPrintClick,
334
+ onTagsClick,
335
+ onMetadataClick,
336
+ onPropertiesClick,
337
+ onHistoryClick,
338
+ toolbarActions
339
+ });
340
+ _react.useEffect.call(void 0, () => {
341
+ const handleKeyDown = (e) => {
342
+ if (e.key === "+") setZoom((z) => Math.min(z + 10, 400));
343
+ if (e.key === "-") setZoom((z) => Math.max(z - 10, 10));
344
+ if (e.key === "r") setRotation((r) => (r + 90) % 360);
345
+ if (e.key === "R") setRotation((r) => (r - 90 + 360) % 360);
346
+ if (e.key === "Escape" && isFullScreen && document.exitFullscreen) {
347
+ document.exitFullscreen();
348
+ setIsFullScreen(false);
349
+ }
350
+ };
351
+ const handleFullscreenChange = () => {
352
+ setIsFullScreen(!!document.fullscreenElement);
353
+ };
354
+ window.addEventListener("keydown", handleKeyDown);
355
+ document.addEventListener("fullscreenchange", handleFullscreenChange);
356
+ return () => {
357
+ window.removeEventListener("keydown", handleKeyDown);
358
+ document.removeEventListener("fullscreenchange", handleFullscreenChange);
359
+ };
360
+ }, [isFullScreen]);
361
+ if (!src) {
362
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "pdf-viewer-container", style: { width, height, ...style }, children: [
363
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "style", { children: _chunkECZ6IBOSjs.toolbarStyles }),
364
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
365
+ "div",
366
+ {
367
+ style: {
368
+ height: "100%",
369
+ display: "flex",
370
+ alignItems: "center",
371
+ justifyContent: "center",
372
+ color: "#666"
373
+ },
374
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "strong", { children: "No image source provided" })
375
+ }
376
+ )
377
+ ] });
378
+ }
379
+ const displayName = fileName || _optionalChain([file, 'optionalAccess', _3 => _3.name]) || "image";
380
+ const ext = displayName.split(".").pop() || "";
381
+ const rot = rotation % 360;
382
+ const rotated = rot === 90 || rot === 270;
383
+ const displayWidth = rotated ? imageSize.height : imageSize.width;
384
+ const displayHeight = rotated ? imageSize.width : imageSize.height;
385
+ const scaledWidth = displayWidth * (zoom / 100);
386
+ const scaledHeight = displayHeight * (zoom / 100);
387
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
388
+ "div",
389
+ {
390
+ ref: containerRef,
391
+ className: "pdf-viewer-container",
392
+ style: { width, height, ...style },
393
+ children: [
394
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "style", { children: _chunkECZ6IBOSjs.toolbarStyles }),
395
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ImageHeader, { fileName: displayName, fileExtension: ext }),
396
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
397
+ ImageToolbar,
398
+ {
399
+ zoom,
400
+ rotation,
401
+ onZoomIn: handleZoomIn,
402
+ onZoomOut: handleZoomOut,
403
+ onFitToWidth: handleFitToWidth,
404
+ onFitToPage: handleFitToPage,
405
+ onRotateLeft: handleRotateLeft,
406
+ onRotateRight: handleRotateRight,
407
+ onToggleFullScreen: handleToggleFullScreen,
408
+ showDownload: !toolbar.isHidden("download"),
409
+ showPrint: !toolbar.isHidden("print"),
410
+ showMetadata: !toolbar.isHidden("metadata"),
411
+ showProperties: !toolbar.isHidden("properties"),
412
+ showTags: !toolbar.isHidden("tags"),
413
+ showHistory: !toolbar.isHidden("history"),
414
+ disabledDownload: toolbar.isDisabled("download"),
415
+ disabledPrint: toolbar.isDisabled("print"),
416
+ disabledMetadata: toolbar.isDisabled("metadata"),
417
+ disabledProperties: toolbar.isDisabled("properties"),
418
+ disabledTags: toolbar.isDisabled("tags"),
419
+ disabledHistory: toolbar.isDisabled("history"),
420
+ onDownloadClick: toolbar.getHandler("download", onDownloadClick),
421
+ onPrintClick: toolbar.getHandler("print", onPrintClick),
422
+ onMetadataClick: toolbar.getHandler("metadata", onMetadataClick),
423
+ onPropertiesClick: toolbar.getHandler("properties", onPropertiesClick),
424
+ onTagsClick: toolbar.getHandler("tags", onTagsClick),
425
+ onHistoryClick: toolbar.getHandler("history", onHistoryClick)
426
+ }
427
+ ),
428
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
429
+ "div",
430
+ {
431
+ ref: imageAreaRef,
432
+ className: "pdf-viewer-content",
433
+ style: {
434
+ cursor: isDragging ? "grabbing" : "grab",
435
+ overflow: "auto",
436
+ background: "#f5f5f5"
437
+ },
438
+ onMouseDown: handleMouseDown,
439
+ onMouseMove: handleMouseMove,
440
+ onMouseUp: handleMouseUp,
441
+ onMouseLeave: handleMouseLeave,
442
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
443
+ "div",
444
+ {
445
+ style: {
446
+ minWidth: `${scaledWidth}px`,
447
+ minHeight: `${scaledHeight}px`,
448
+ width: `${scaledWidth}px`,
449
+ height: `${scaledHeight}px`,
450
+ margin: "auto",
451
+ display: "flex",
452
+ alignItems: "center",
453
+ justifyContent: "center",
454
+ position: "relative"
455
+ },
456
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
457
+ "img",
458
+ {
459
+ src,
460
+ alt: displayName,
461
+ onLoad: handleImageLoad,
462
+ crossOrigin: "anonymous",
463
+ style: {
464
+ transform: `rotate(${rotation}deg)`,
465
+ transformOrigin: "center center",
466
+ maxWidth: "100%",
467
+ maxHeight: "100%",
468
+ width: "100%",
469
+ height: "100%",
470
+ objectFit: "contain",
471
+ pointerEvents: "none",
472
+ userSelect: "none"
473
+ }
474
+ }
475
+ )
476
+ }
477
+ )
478
+ }
479
+ )
480
+ ]
481
+ }
482
+ );
483
+ };
484
+
485
+
486
+
487
+ exports.ImageViewer = ImageViewer;
488
+ //# sourceMappingURL=chunk-QV63FULE.js.map