@cannyminds/dms-file-viewers 0.4.0 → 0.6.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 (101) hide show
  1. package/dist/{chunk-DOOYIHGW.js → chunk-56PP5GHZ.js} +70 -18
  2. package/dist/chunk-56PP5GHZ.js.map +1 -0
  3. package/dist/{chunk-7BLEPGZ4.mjs → chunk-7AUCINV2.mjs} +70 -18
  4. package/dist/chunk-7AUCINV2.mjs.map +1 -0
  5. package/dist/chunk-A2MSWOEM.js +159 -0
  6. package/dist/chunk-A2MSWOEM.js.map +1 -0
  7. package/dist/{chunk-SBEFC7HP.js → chunk-CQ3HSM5S.js} +70 -18
  8. package/dist/chunk-CQ3HSM5S.js.map +1 -0
  9. package/dist/{chunk-DDT3GC3C.js → chunk-D7LXG67Z.js} +482 -510
  10. package/dist/chunk-D7LXG67Z.js.map +1 -0
  11. package/dist/chunk-EAM7CURM.js +334 -0
  12. package/dist/chunk-EAM7CURM.js.map +1 -0
  13. package/dist/{chunk-SNEIVT4R.js → chunk-ETHSDRF5.js} +70 -18
  14. package/dist/chunk-ETHSDRF5.js.map +1 -0
  15. package/dist/{chunk-RE4XRGSV.js → chunk-FA5L62Y5.js} +52 -32
  16. package/dist/chunk-FA5L62Y5.js.map +1 -0
  17. package/dist/chunk-GMDRDOWP.mjs +159 -0
  18. package/dist/chunk-GMDRDOWP.mjs.map +1 -0
  19. package/dist/{chunk-4DJJINTB.mjs → chunk-KBST5Z5H.mjs} +69 -17
  20. package/dist/chunk-KBST5Z5H.mjs.map +1 -0
  21. package/dist/{chunk-WP55NYFS.js → chunk-LQVHD4FS.js} +71 -19
  22. package/dist/chunk-LQVHD4FS.js.map +1 -0
  23. package/dist/chunk-M57PSU4O.mjs +36 -0
  24. package/dist/chunk-M57PSU4O.mjs.map +1 -0
  25. package/dist/{chunk-YHMHDPLQ.mjs → chunk-PFJKVNUA.mjs} +69 -17
  26. package/dist/chunk-PFJKVNUA.mjs.map +1 -0
  27. package/dist/{chunk-677DWENS.mjs → chunk-THFHTTQX.mjs} +64 -17
  28. package/dist/chunk-THFHTTQX.mjs.map +1 -0
  29. package/dist/chunk-U4W524VZ.mjs +334 -0
  30. package/dist/chunk-U4W524VZ.mjs.map +1 -0
  31. package/dist/{chunk-77UARJVQ.js → chunk-UUM656JE.js} +66 -19
  32. package/dist/chunk-UUM656JE.js.map +1 -0
  33. package/dist/{chunk-QQDQJ7TS.mjs → chunk-VJFXCN5Z.mjs} +50 -30
  34. package/dist/chunk-VJFXCN5Z.mjs.map +1 -0
  35. package/dist/{chunk-BHMFZTZ7.mjs → chunk-WNZHGFNC.mjs} +69 -17
  36. package/dist/chunk-WNZHGFNC.mjs.map +1 -0
  37. package/dist/chunk-YEPEMLM3.js +36 -0
  38. package/dist/chunk-YEPEMLM3.js.map +1 -0
  39. package/dist/{chunk-J2YW5DHC.mjs → chunk-ZKGWS327.mjs} +517 -545
  40. package/dist/chunk-ZKGWS327.mjs.map +1 -0
  41. package/dist/components/viewers/AudioViewer.d.mts +1 -1
  42. package/dist/components/viewers/AudioViewer.d.ts +1 -1
  43. package/dist/components/viewers/AudioViewer.js +4 -3
  44. package/dist/components/viewers/AudioViewer.js.map +1 -1
  45. package/dist/components/viewers/AudioViewer.mjs +3 -2
  46. package/dist/components/viewers/DefaultViewer.d.mts +1 -1
  47. package/dist/components/viewers/DefaultViewer.d.ts +1 -1
  48. package/dist/components/viewers/DefaultViewer.js +4 -3
  49. package/dist/components/viewers/DefaultViewer.js.map +1 -1
  50. package/dist/components/viewers/DefaultViewer.mjs +3 -2
  51. package/dist/components/viewers/ImageViewer.d.mts +1 -1
  52. package/dist/components/viewers/ImageViewer.d.ts +1 -1
  53. package/dist/components/viewers/ImageViewer.js +4 -4
  54. package/dist/components/viewers/ImageViewer.mjs +3 -3
  55. package/dist/components/viewers/PDFViewer.d.mts +1 -1
  56. package/dist/components/viewers/PDFViewer.d.ts +1 -1
  57. package/dist/components/viewers/PDFViewer.js +5 -3
  58. package/dist/components/viewers/PDFViewer.js.map +1 -1
  59. package/dist/components/viewers/PDFViewer.mjs +4 -2
  60. package/dist/components/viewers/TIFFViewer.d.mts +1 -1
  61. package/dist/components/viewers/TIFFViewer.d.ts +1 -1
  62. package/dist/components/viewers/TIFFViewer.js +4 -3
  63. package/dist/components/viewers/TIFFViewer.js.map +1 -1
  64. package/dist/components/viewers/TIFFViewer.mjs +3 -2
  65. package/dist/components/viewers/TextViewer.d.mts +1 -1
  66. package/dist/components/viewers/TextViewer.d.ts +1 -1
  67. package/dist/components/viewers/TextViewer.js +4 -3
  68. package/dist/components/viewers/TextViewer.js.map +1 -1
  69. package/dist/components/viewers/TextViewer.mjs +3 -2
  70. package/dist/components/viewers/VideoViewer.d.mts +1 -1
  71. package/dist/components/viewers/VideoViewer.d.ts +1 -1
  72. package/dist/components/viewers/VideoViewer.js +4 -3
  73. package/dist/components/viewers/VideoViewer.js.map +1 -1
  74. package/dist/components/viewers/VideoViewer.mjs +3 -2
  75. package/dist/index.d.mts +2 -2
  76. package/dist/index.d.ts +2 -2
  77. package/dist/index.js +14 -11
  78. package/dist/index.js.map +1 -1
  79. package/dist/index.mjs +12 -9
  80. package/dist/index.mjs.map +1 -1
  81. package/dist/{types-C6IEfcTM.d.mts → types-BmZB9kkJ.d.mts} +13 -1
  82. package/dist/{types-C6IEfcTM.d.ts → types-BmZB9kkJ.d.ts} +13 -1
  83. package/package.json +1 -1
  84. package/dist/chunk-4DJJINTB.mjs.map +0 -1
  85. package/dist/chunk-677DWENS.mjs.map +0 -1
  86. package/dist/chunk-77UARJVQ.js.map +0 -1
  87. package/dist/chunk-7BLEPGZ4.mjs.map +0 -1
  88. package/dist/chunk-BHMFZTZ7.mjs.map +0 -1
  89. package/dist/chunk-BONT4K3R.mjs +0 -294
  90. package/dist/chunk-BONT4K3R.mjs.map +0 -1
  91. package/dist/chunk-DDT3GC3C.js.map +0 -1
  92. package/dist/chunk-DOOYIHGW.js.map +0 -1
  93. package/dist/chunk-J2YW5DHC.mjs.map +0 -1
  94. package/dist/chunk-QQDQJ7TS.mjs.map +0 -1
  95. package/dist/chunk-RE4XRGSV.js.map +0 -1
  96. package/dist/chunk-SBEFC7HP.js.map +0 -1
  97. package/dist/chunk-SNEIVT4R.js.map +0 -1
  98. package/dist/chunk-WP55NYFS.js.map +0 -1
  99. package/dist/chunk-YHMHDPLQ.mjs.map +0 -1
  100. package/dist/chunk-Z3IUTTJQ.js +0 -294
  101. package/dist/chunk-Z3IUTTJQ.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/viewers/PDFViewer.tsx","../src/components/viewers/pdf/StablePDFViewer.tsx","../src/components/viewers/pdf/PDFToolbar.tsx","../src/components/viewers/pdf/PDFHeader.tsx","../src/components/viewers/pdf/SearchSidebar.tsx","../src/components/viewers/pdf/PasswordDialog.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState, forwardRef, useImperativeHandle } from 'react';\r\nimport { FileViewerProps } from '../../types';\r\nimport { getFileExtension } from '../../utils/fileUtils';\r\nimport { mergeToolbarConfig } from '../../utils/toolbarUtils';\r\nimport {\r\n StablePDFViewer,\r\n PDFToolbar,\r\n PDFHeader,\r\n SearchSidebar,\r\n PasswordDialog,\r\n toolbarStyles,\r\n type CannyMindsPDFViewerRef\r\n} from './pdf';\r\n\r\ntype LoadingState = 'idle' | 'loading' | 'ready' | 'error';\r\n\r\n/**\r\n * IMPORTANT: The @cannyminds/pdf-viewer navigation API is not fully implemented.\r\n * Methods like getCurrentPage(), getTotalPages(), goToPage() return hardcoded values.\r\n * This component implements custom page tracking using DOM inspection and search detection.\r\n */\r\n\r\ninterface PDFViewerContentProps extends FileViewerProps {\r\n sourceDescription: string;\r\n}\r\n\r\nexport interface PDFViewerMethods {\r\n zoomIn: () => void;\r\n zoomOut: () => void;\r\n setZoom: (level: number) => void;\r\n resetZoom: () => void;\r\n getZoom: () => number;\r\n goToPage: (page: number) => void;\r\n getCurrentPage: () => number;\r\n getTotalPages: () => number;\r\n nextPage: () => void;\r\n previousPage: () => void;\r\n goToFirstPage: () => void;\r\n goToLastPage: () => void;\r\n searchText: (keyword: string) => Promise<any>;\r\n nextResult: () => number;\r\n previousResult: () => number;\r\n goToResult: (index: number) => number;\r\n stopSearch: () => void;\r\n getSearchState: () => any;\r\n getSelectedText: () => string;\r\n clearSelection: () => void;\r\n}\r\n\r\n\r\nconst PDFViewerContent = forwardRef<PDFViewerMethods, PDFViewerContentProps>((props, ref) => {\r\n const {\r\n file,\r\n onLoad,\r\n onError,\r\n fileName,\r\n showPageCount = true,\r\n showPageNavigation = true,\r\n showZoomControls = true,\r\n showDownload = true,\r\n showPrint = true,\r\n showSearch = true,\r\n showMetadata = true,\r\n showProperties = true,\r\n onMetadataClick,\r\n onPropertiesClick,\r\n onDownloadClick,\r\n onPrintClick,\r\n initialSearchText,\r\n initialSearchPages\r\n } = props;\r\n const [pdfBuffer, setPdfBuffer] = useState<ArrayBuffer | null>(null);\r\n const [state, setState] = useState<LoadingState>('idle');\r\n const [error, setError] = useState<string | null>(null);\r\n const pdfViewerRef = useRef<CannyMindsPDFViewerRef>(null);\r\n\r\n // File info\r\n const resolvedFileName = useMemo(() => {\r\n if (fileName) return fileName;\r\n if (file instanceof File) return file.name;\r\n if (typeof file === 'string') {\r\n const urlParts = file.split('/');\r\n return urlParts[urlParts.length - 1] || 'document.pdf';\r\n }\r\n return 'document.pdf';\r\n }, [file, fileName]);\r\n\r\n const fileExtension = useMemo(\r\n () => getFileExtension(resolvedFileName),\r\n [resolvedFileName]\r\n );\r\n\r\n // Toolbar state\r\n const [currentPage, setCurrentPage] = useState(1);\r\n const [totalPages, setTotalPages] = useState(0);\r\n const [zoom, setZoom] = useState(100);\r\n const [searchQuery, setSearchQuery] = useState('');\r\n const [isSearching, setIsSearching] = useState(false);\r\n const [pdfContainer, setPdfContainer] = useState<HTMLElement | null>(null);\r\n const [isSidebarOpen, setIsSidebarOpen] = useState(false);\r\n const [searchResults, setSearchResults] = useState<any[]>([]);\r\n const [currentSearchResultIndex, setCurrentSearchResultIndex] = useState(0);\r\n const [totalSearchResults, setTotalSearchResults] = useState(0);\r\n const [autoExecuteSearch, setAutoExecuteSearch] = useState(!!initialSearchText);\r\n const [isFullScreen, setIsFullScreen] = useState(false);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n // Password dialog state\r\n const [isPasswordDialogOpen, setIsPasswordDialogOpen] = useState(false);\r\n const [passwordError, setPasswordError] = useState<string>('');\r\n const [passwordResolve, setPasswordResolve] = useState<((password: string | null) => void) | null>(null);\r\n\r\n const hasExecutedInitialSearch = useRef(false);\r\n\r\n const handleToggleFullScreen = useCallback(() => {\r\n if (!isFullScreen && containerRef.current?.requestFullscreen) {\r\n containerRef.current.requestFullscreen();\r\n setIsFullScreen(true);\r\n } else if (isFullScreen && document.exitFullscreen) {\r\n document.exitFullscreen();\r\n setIsFullScreen(false);\r\n }\r\n }, [isFullScreen]);\r\n\r\n const toolbar = mergeToolbarConfig({ \r\n showDownload, \r\n showPrint, \r\n showMetadata, \r\n showProperties, \r\n onDownloadClick, \r\n onPrintClick, \r\n onMetadataClick, \r\n onPropertiesClick, \r\n toolbarActions: props.toolbarActions \r\n });\r\n\r\n // Create stable callback handlers to prevent re-renders\r\n const toolbarHandlers = useMemo(() => ({\r\n handleZoomIn: () => {\r\n pdfViewerRef.current?.zoom.zoomIn();\r\n requestAnimationFrame(() => {\r\n const zoomValue = pdfViewerRef.current?.zoom.getZoom();\r\n if (typeof zoomValue === 'number') {\r\n setZoom(Math.round(zoomValue * 100));\r\n }\r\n });\r\n },\r\n handleZoomOut: () => {\r\n pdfViewerRef.current?.zoom.zoomOut();\r\n requestAnimationFrame(() => {\r\n const zoomValue = pdfViewerRef.current?.zoom.getZoom();\r\n if (typeof zoomValue === 'number') {\r\n setZoom(Math.round(zoomValue * 100));\r\n }\r\n });\r\n },\r\n handleFitToWidth: () => {\r\n pdfViewerRef.current?.zoom.fitToWidth();\r\n requestAnimationFrame(() => {\r\n const zoomValue = pdfViewerRef.current?.zoom.getZoom();\r\n if (typeof zoomValue === 'number') {\r\n setZoom(Math.round(zoomValue * 100));\r\n }\r\n });\r\n },\r\n handleFitToPage: () => {\r\n pdfViewerRef.current?.zoom.fitToPage();\r\n requestAnimationFrame(() => {\r\n const zoomValue = pdfViewerRef.current?.zoom.getZoom();\r\n if (typeof zoomValue === 'number') {\r\n setZoom(Math.round(zoomValue * 100));\r\n }\r\n });\r\n },\r\n handlePreviousPage: () => {\r\n pdfViewerRef.current?.navigation.previousPage();\r\n requestAnimationFrame(() => {\r\n const current = pdfViewerRef.current?.navigation.getCurrentPage() || 1;\r\n setCurrentPage(current);\r\n });\r\n },\r\n handleNextPage: () => {\r\n pdfViewerRef.current?.navigation.nextPage();\r\n requestAnimationFrame(() => {\r\n const current = pdfViewerRef.current?.navigation.getCurrentPage() || 1;\r\n setCurrentPage(current);\r\n });\r\n },\r\n handleFirstPage: () => {\r\n pdfViewerRef.current?.navigation.goToFirstPage();\r\n requestAnimationFrame(() => {\r\n const current = pdfViewerRef.current?.navigation.getCurrentPage() || 1;\r\n setCurrentPage(current);\r\n });\r\n },\r\n handleLastPage: () => {\r\n pdfViewerRef.current?.navigation.goToLastPage();\r\n requestAnimationFrame(() => {\r\n const current = pdfViewerRef.current?.navigation.getCurrentPage() || 1;\r\n setCurrentPage(current);\r\n });\r\n },\r\n toggleSidebar: () => setIsSidebarOpen(!isSidebarOpen),\r\n handlePageInput: (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const value = e.target.value;\r\n if (/^\\d*$/.test(value)) {\r\n return;\r\n }\r\n const page = parseInt(value, 10);\r\n if (!isNaN(page) && page >= 1 && (totalPages === 0 || page <= totalPages)) {\r\n pdfViewerRef.current?.navigation.goToPage(page);\r\n setCurrentPage(page);\r\n }\r\n },\r\n handlePageInputKeyPress: (e: React.KeyboardEvent<HTMLInputElement>) => {\r\n if (e.key === 'Enter') {\r\n const value = (e.target as HTMLInputElement).value;\r\n const page = parseInt(value, 10);\r\n if (!isNaN(page) && page >= 1 && (totalPages === 0 || page <= totalPages)) {\r\n pdfViewerRef.current?.navigation.goToPage(page);\r\n setCurrentPage(page);\r\n }\r\n }\r\n },\r\n handleToggleFullScreen\r\n }), [isSidebarOpen, totalPages, handleToggleFullScreen]);\r\n\r\n useEffect(() => {\r\n console.log('came', initialSearchText, pdfViewerRef.current, hasExecutedInitialSearch.current)\r\n if (pdfViewerRef.current && !hasExecutedInitialSearch.current && initialSearchText) {\r\n hasExecutedInitialSearch.current = true;\r\n\r\n setIsSidebarOpen(true);\r\n setSearchQuery(initialSearchText);\r\n handleSidebarSearch(initialSearchText, initialSearchPages);\r\n setAutoExecuteSearch(false);\r\n // Execute search without state updates that trigger re-renders\r\n pdfViewerRef.current.search.searchText(initialSearchText).then(results => {\r\n console.log('results', results)\r\n // Handle results if needed, but avoid state updates that affect the ref\r\n if (results?.results?.length > 0) {\r\n pdfViewerRef.current?.navigation.goToPage(results.results[0].pageIndex + 1);\r\n }\r\n });\r\n }\r\n }, [pdfViewerRef.current, initialSearchText]);\r\n\r\n // Reset all state when file changes\r\n useEffect(() => {\r\n // Reset search state\r\n setSearchQuery('');\r\n setSearchResults([]);\r\n setCurrentSearchResultIndex(0);\r\n setTotalSearchResults(0);\r\n setIsSearching(false);\r\n setIsSidebarOpen(false);\r\n\r\n // Reset page state\r\n setCurrentPage(1);\r\n setTotalPages(0);\r\n setZoom(100);\r\n\r\n // Reset PDF state\r\n setState('idle');\r\n setError(null);\r\n setPdfBuffer(null);\r\n }, [file]);\r\n\r\n // Track the PDF container for page detection using MutationObserver\r\n useEffect(() => {\r\n if (state !== 'ready') return;\r\n\r\n const container = document.querySelector('[data-pdf-viewer], .embedpdf-viewport, [role=\"document\"]') as HTMLElement;\r\n if (container) {\r\n setPdfContainer(container);\r\n return;\r\n }\r\n\r\n // Use MutationObserver to wait for container to appear in DOM\r\n const observer = new MutationObserver(() => {\r\n const foundContainer = document.querySelector('[data-pdf-viewer], .embedpdf-viewport, [role=\"document\"]') as HTMLElement;\r\n if (foundContainer) {\r\n setPdfContainer(foundContainer);\r\n observer.disconnect();\r\n }\r\n });\r\n\r\n observer.observe(document.body, { childList: true, subtree: true });\r\n return () => observer.disconnect();\r\n }, [state]);\r\n\r\n // Initialize page count after PDF loads - using async polling with exponential backoff\r\n useEffect(() => {\r\n if (state !== 'ready' || totalPages > 0) return;\r\n\r\n const initializePageCount = async () => {\r\n // Wait for viewer ref with exponential backoff\r\n const waitForViewer = async (maxAttempts = 10): Promise<typeof pdfViewerRef.current> => {\r\n for (let i = 0; i < maxAttempts; i++) {\r\n if (pdfViewerRef.current) return pdfViewerRef.current;\r\n await new Promise(resolve => requestAnimationFrame(() =>\r\n setTimeout(resolve, Math.min(100 * Math.pow(2, i), 1000))\r\n ));\r\n }\r\n return null;\r\n };\r\n\r\n const viewer = await waitForViewer();\r\n if (!viewer) return;\r\n\r\n // Wait for pages to render using requestAnimationFrame\r\n await new Promise(resolve => requestAnimationFrame(resolve));\r\n\r\n // Try navigation API first\r\n try {\r\n const count = viewer.navigation?.getTotalPages?.();\r\n if (count && count > 1) {\r\n setTotalPages(count);\r\n return;\r\n }\r\n } catch (e) {\r\n // Continue to fallback methods\r\n }\r\n\r\n // Fallback: Search for common character and count unique pages\r\n try {\r\n const results = await viewer.search?.searchText?.('e');\r\n\r\n if (results?.results && results.results.length > 0) {\r\n const pageIndices = results.results\r\n .map((m: any) => m.pageIndex as number)\r\n .filter((idx: any): idx is number => typeof idx === 'number');\r\n const count = Math.max(...pageIndices) + 1;\r\n viewer.search?.stopSearch?.();\r\n setTotalPages(count);\r\n return;\r\n }\r\n } catch (error) {\r\n // Continue to next method\r\n }\r\n\r\n // DOM inspection fallback - count rendered pages\r\n try {\r\n const selectors = [\r\n '[data-page-index]',\r\n '[data-page-number]',\r\n '.embedpdf-page',\r\n '[role=\"article\"]',\r\n 'canvas[data-page]',\r\n '.react-pdf__Page'\r\n ];\r\n\r\n for (const selector of selectors) {\r\n const pages = document.querySelectorAll(selector);\r\n if (pages.length > 0) {\r\n setTotalPages(pages.length);\r\n return;\r\n }\r\n }\r\n } catch (error) {\r\n // Continue to fallback\r\n }\r\n\r\n // Ultimate fallback\r\n setTotalPages(1);\r\n };\r\n\r\n initializePageCount();\r\n }, [state, totalPages]);\r\n\r\n // Auto-execute search when initialSearchText is provided via props\r\n // useEffect(() => {\r\n // if (state !== 'ready' || !autoExecuteSearch || !initialSearchText) return;\r\n\r\n // // Use requestIdleCallback for better performance, fallback to rAF\r\n // const scheduleSearch = (callback: () => void) => {\r\n // if ('requestIdleCallback' in window) {\r\n // requestIdleCallback(callback, { timeout: 2000 });\r\n // } else {\r\n // requestAnimationFrame(() => setTimeout(callback, 0));\r\n // }\r\n // };\r\n\r\n // scheduleSearch(() => {\r\n // if (!pdfViewerRef.current) return;\r\n\r\n // setIsSidebarOpen(true);\r\n // setSearchQuery(initialSearchText);\r\n // handleSidebarSearch(initialSearchText, initialSearchPages);\r\n // setAutoExecuteSearch(false);\r\n // });\r\n // }, [state, autoExecuteSearch, initialSearchText, initialSearchPages]);\r\n\r\n // Update page info and search state periodically\r\n useEffect(() => {\r\n if (state === 'ready' && pdfViewerRef.current) {\r\n const updateInfo = () => {\r\n const current = pdfViewerRef.current?.navigation.getCurrentPage() || 1;\r\n const total = pdfViewerRef.current?.navigation.getTotalPages() || 0;\r\n const zoomValue = pdfViewerRef.current?.zoom.getZoom();\r\n const currentSearchState = pdfViewerRef.current?.search.getSearchState();\r\n\r\n setCurrentPage(current);\r\n\r\n // Update total pages if we got a valid count\r\n if (total > 0 && total !== totalPages) {\r\n setTotalPages(total);\r\n }\r\n\r\n if (typeof zoomValue === 'number') {\r\n setZoom(Math.round(zoomValue * 100));\r\n }\r\n };\r\n\r\n updateInfo();\r\n const interval = setInterval(updateInfo, 300);\r\n return () => clearInterval(interval);\r\n }\r\n }, [state, totalPages]);\r\n\r\n // Expose methods through ref\r\n useImperativeHandle(ref, () => ({\r\n zoomIn: () => {\r\n pdfViewerRef.current?.zoom.zoomIn();\r\n updateZoomDisplay();\r\n },\r\n zoomOut: () => {\r\n pdfViewerRef.current?.zoom.zoomOut();\r\n updateZoomDisplay();\r\n },\r\n setZoom: (level: number) => {\r\n pdfViewerRef.current?.zoom.setZoom(level);\r\n updateZoomDisplay();\r\n },\r\n resetZoom: () => {\r\n pdfViewerRef.current?.zoom.resetZoom();\r\n updateZoomDisplay();\r\n },\r\n getZoom: () => {\r\n const zoom = pdfViewerRef.current?.zoom.getZoom();\r\n return typeof zoom === 'number' ? zoom : 1.0;\r\n },\r\n goToPage: (page: number) => {\r\n pdfViewerRef.current?.navigation.goToPage(page);\r\n setCurrentPage(page);\r\n },\r\n getCurrentPage: () => pdfViewerRef.current?.navigation.getCurrentPage() || 1,\r\n getTotalPages: () => pdfViewerRef.current?.navigation.getTotalPages() || 0,\r\n nextPage: () => {\r\n pdfViewerRef.current?.navigation.nextPage();\r\n updatePageDisplay();\r\n },\r\n previousPage: () => {\r\n pdfViewerRef.current?.navigation.previousPage();\r\n updatePageDisplay();\r\n },\r\n goToFirstPage: () => {\r\n pdfViewerRef.current?.navigation.goToFirstPage();\r\n updatePageDisplay();\r\n },\r\n goToLastPage: () => {\r\n pdfViewerRef.current?.navigation.goToLastPage();\r\n updatePageDisplay();\r\n },\r\n searchText: async (keyword: string) => {\r\n setIsSearching(true);\r\n const results = await pdfViewerRef.current?.search.searchText(keyword);\r\n setIsSearching(false);\r\n setSearchQuery(keyword);\r\n // Search state will be updated by the interval\r\n return results;\r\n },\r\n nextResult: () => {\r\n const index = pdfViewerRef.current?.search.nextResult() || -1;\r\n return index;\r\n },\r\n previousResult: () => {\r\n const index = pdfViewerRef.current?.search.previousResult() || -1;\r\n return index;\r\n },\r\n goToResult: (index: number) => pdfViewerRef.current?.search.goToResult(index) || -1,\r\n stopSearch: () => {\r\n pdfViewerRef.current?.search.stopSearch();\r\n setSearchQuery('');\r\n },\r\n getSearchState: () => pdfViewerRef.current?.search.getSearchState() || null,\r\n getSelectedText: () => pdfViewerRef.current?.selection.getSelectedText() || '',\r\n clearSelection: () => pdfViewerRef.current?.selection.clearSelection(),\r\n }), []);\r\n\r\n const updatePageDisplay = () => {\r\n requestAnimationFrame(() => {\r\n const current = pdfViewerRef.current?.navigation.getCurrentPage() || 1;\r\n setCurrentPage(current);\r\n });\r\n };\r\n\r\n const updateZoomDisplay = () => {\r\n requestAnimationFrame(() => {\r\n const zoomValue = pdfViewerRef.current?.zoom.getZoom();\r\n if (typeof zoomValue === 'number') {\r\n setZoom(Math.round(zoomValue * 100));\r\n }\r\n });\r\n };\r\n\r\n\r\n const handleSearch = async () => {\r\n if (searchQuery.trim()) {\r\n setIsSearching(true);\r\n const results = await pdfViewerRef.current?.search.searchText(searchQuery);\r\n setIsSearching(false);\r\n\r\n // Store search results for sidebar\r\n if (results && results.results) {\r\n const formattedResults = results.results.map((result: any, index: number) => {\r\n // Extract text content - try different possible properties\r\n let textContent = '';\r\n let contextContent = '';\r\n\r\n if (typeof result === 'string') {\r\n textContent = result;\r\n contextContent = result;\r\n } else if (result.text) {\r\n textContent = String(result.text);\r\n contextContent = result.context ? String(result.context) : String(result.text);\r\n } else if (result.str) {\r\n textContent = String(result.str);\r\n contextContent = String(result.str);\r\n } else if (result.match) {\r\n textContent = String(result.match);\r\n contextContent = String(result.match);\r\n } else {\r\n textContent = JSON.stringify(result);\r\n contextContent = textContent;\r\n }\r\n\r\n return {\r\n pageNumber: (result.pageIndex ?? result.pageNumber ?? 0) + 1,\r\n text: textContent,\r\n context: contextContent,\r\n index: index\r\n };\r\n });\r\n\r\n setSearchResults(formattedResults);\r\n setTotalSearchResults(formattedResults.length);\r\n setCurrentSearchResultIndex(0);\r\n } else {\r\n setSearchResults([]);\r\n setTotalSearchResults(0);\r\n setCurrentSearchResultIndex(0);\r\n }\r\n }\r\n };\r\n\r\n const handleSearchKeyPress = (e: React.KeyboardEvent<HTMLInputElement>) => {\r\n if (e.key === 'Enter') {\r\n handleSearch();\r\n }\r\n };\r\n\r\n const handleSidebarSearch = async (keyword: string, pageNumbers?: number[]) => {\r\n setSearchQuery(keyword);\r\n if (keyword.trim()) {\r\n setIsSearching(true);\r\n const results = await pdfViewerRef.current?.search.searchText(keyword);\r\n setIsSearching(false);\r\n\r\n // Store search results for sidebar\r\n if (results && results.results && results.results.length > 0) {\r\n const formattedResults = results.results.map((result: any, index: number) => {\r\n // Extract text content from the context object\r\n let textContent = '';\r\n let contextContent = '';\r\n\r\n if (result.context && typeof result.context === 'object') {\r\n // Build the full context string\r\n const before = result.context.before || '';\r\n const match = result.context.match || '';\r\n const after = result.context.after || '';\r\n\r\n textContent = match;\r\n contextContent = `${before}${match}${after}`;\r\n } else if (typeof result === 'string') {\r\n textContent = result;\r\n contextContent = result;\r\n } else {\r\n textContent = String(result.match || result.text || '');\r\n contextContent = textContent;\r\n }\r\n\r\n return {\r\n pageNumber: (result.pageIndex ?? result.pageNumber ?? 0) + 1,\r\n text: textContent,\r\n context: contextContent,\r\n index: index\r\n };\r\n });\r\n\r\n setSearchResults(formattedResults);\r\n setTotalSearchResults(formattedResults.length);\r\n setCurrentSearchResultIndex(0);\r\n\r\n // Navigate to the first result's page\r\n if (formattedResults.length > 0) {\r\n const firstPageNumber = formattedResults[0].pageNumber;\r\n pdfViewerRef.current?.navigation.goToPage(firstPageNumber);\r\n setCurrentPage(firstPageNumber);\r\n }\r\n } else if (pageNumbers && pageNumbers.length > 0) {\r\n // If search didn't find results but we have page numbers from OCR, use them as fallback\r\n const fallbackResults = pageNumbers.map((pageNum, index) => ({\r\n pageNumber: pageNum,\r\n text: keyword,\r\n context: `\"${keyword}\" found on this page ${pageNum}`,\r\n index: index\r\n }));\r\n\r\n setSearchResults(fallbackResults);\r\n setTotalSearchResults(fallbackResults.length);\r\n setCurrentSearchResultIndex(0);\r\n\r\n // Navigate to the first fallback page\r\n pdfViewerRef.current?.navigation.goToPage(pageNumbers[0]);\r\n setCurrentPage(pageNumbers[0]);\r\n } else {\r\n setSearchResults([]);\r\n setTotalSearchResults(0);\r\n setCurrentSearchResultIndex(0);\r\n }\r\n } else {\r\n setSearchResults([]);\r\n pdfViewerRef.current?.search.stopSearch();\r\n setTotalSearchResults(0);\r\n setCurrentSearchResultIndex(0);\r\n }\r\n };\r\n\r\n const handleSearchResultClick = (pageNumber: number, resultIndex: number) => {\r\n // Navigate to the page first\r\n pdfViewerRef.current?.navigation.goToPage(pageNumber);\r\n setCurrentSearchResultIndex(resultIndex);\r\n setCurrentPage(pageNumber);\r\n\r\n // Then go to the specific result\r\n pdfViewerRef.current?.search.goToResult(resultIndex);\r\n };\r\n\r\n\r\n const handleNextSearchResult = () => {\r\n if (currentSearchResultIndex < totalSearchResults - 1) {\r\n const nextIndex = currentSearchResultIndex + 1;\r\n setCurrentSearchResultIndex(nextIndex);\r\n\r\n pdfViewerRef.current?.search.nextResult();\r\n\r\n // Navigate to the page of the next result\r\n if (searchResults[nextIndex]) {\r\n const pageNumber = searchResults[nextIndex].pageNumber;\r\n pdfViewerRef.current?.navigation.goToPage(pageNumber);\r\n setCurrentPage(pageNumber);\r\n }\r\n }\r\n };\r\n\r\n const handlePreviousSearchResult = () => {\r\n if (currentSearchResultIndex > 0) {\r\n const prevIndex = currentSearchResultIndex - 1;\r\n setCurrentSearchResultIndex(prevIndex);\r\n\r\n pdfViewerRef.current?.search.previousResult();\r\n\r\n // Navigate to the page of the previous result\r\n if (searchResults[prevIndex]) {\r\n const pageNumber = searchResults[prevIndex].pageNumber;\r\n pdfViewerRef.current?.navigation.goToPage(pageNumber);\r\n setCurrentPage(pageNumber);\r\n }\r\n }\r\n };\r\n\r\n // Load PDF from file\r\n useEffect(() => {\r\n if (!file) {\r\n setState('error');\r\n setError('No file provided');\r\n return;\r\n }\r\n\r\n const loadPDF = async () => {\r\n try {\r\n setState('loading');\r\n setError(null);\r\n\r\n let arrayBuffer: ArrayBuffer;\r\n\r\n if (file instanceof File) {\r\n arrayBuffer = await file.arrayBuffer();\r\n } else if (typeof file === 'string') {\r\n // Load from URL\r\n const response = await fetch(file);\r\n if (!response.ok) {\r\n throw new Error(`Failed to load PDF: ${response.statusText}`);\r\n }\r\n arrayBuffer = await response.arrayBuffer();\r\n } else if (file instanceof ArrayBuffer) {\r\n arrayBuffer = file;\r\n } else {\r\n throw new Error('Unsupported file type');\r\n }\r\n\r\n setPdfBuffer(arrayBuffer);\r\n setState('ready');\r\n onLoad?.();\r\n\r\n } catch (err: any) {\r\n const errorMessage = err.message || 'Failed to load PDF';\r\n setState('error');\r\n setError(errorMessage);\r\n onError?.(err);\r\n }\r\n };\r\n\r\n loadPDF();\r\n }, [file, onLoad, onError]);\r\n\r\n // Handle password request for encrypted PDFs\r\n const handlePasswordRequest = useCallback(async (fileName?: string): Promise<string | null> => {\r\n return new Promise((resolve) => {\r\n setPasswordResolve(() => resolve);\r\n setPasswordError('');\r\n setIsPasswordDialogOpen(true);\r\n });\r\n }, []);\r\n\r\n const handlePasswordSubmit = useCallback((password: string) => {\r\n if (passwordResolve) {\r\n passwordResolve(password);\r\n setPasswordResolve(null);\r\n setIsPasswordDialogOpen(false);\r\n setPasswordError('');\r\n }\r\n }, [passwordResolve]);\r\n\r\n const handlePasswordCancel = useCallback(() => {\r\n if (passwordResolve) {\r\n passwordResolve(null);\r\n setPasswordResolve(null);\r\n setIsPasswordDialogOpen(false);\r\n setPasswordError('');\r\n }\r\n }, [passwordResolve]);\r\n\r\n if (state === 'loading') {\r\n return (\r\n <div style={{\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n height: '100%',\r\n gap: '16px'\r\n }}>\r\n <div className=\"spinner\" style={{\r\n width: '48px',\r\n height: '48px',\r\n border: '4px solid #f3f3f3',\r\n borderTop: '4px solid #3498db',\r\n borderRadius: '50%',\r\n animation: 'spin 1s linear infinite'\r\n }} />\r\n <p>Loading PDF...</p>\r\n <style>{`\r\n @keyframes spin {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n }\r\n `}</style>\r\n </div>\r\n );\r\n }\r\n\r\n if (state === 'error' || error) {\r\n return (\r\n <div style={{\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n height: '100%',\r\n padding: '24px'\r\n }}>\r\n <div style={{\r\n maxWidth: '400px',\r\n padding: '16px',\r\n backgroundColor: '#fee',\r\n border: '1px solid #fcc',\r\n borderRadius: '4px'\r\n }}>\r\n <h3 style={{ marginTop: 0 }}>Failed to Load PDF</h3>\r\n <p>{error || 'Unknown error occurred'}</p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n if (!pdfBuffer || state !== 'ready') {\r\n return (\r\n <div style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n height: '100%'\r\n }}>\r\n <p>Preparing PDF...</p>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div ref={containerRef} className=\"pdf-viewer-container\">\r\n <style>{toolbarStyles}</style>\r\n\r\n {/* Header - File Info */}\r\n <PDFHeader\r\n fileName={resolvedFileName}\r\n fileExtension={fileExtension}\r\n />\r\n\r\n {/* Toolbar */}\r\n <PDFToolbar\r\n currentPage={currentPage}\r\n totalPages={totalPages}\r\n zoom={zoom}\r\n isSidebarOpen={isSidebarOpen}\r\n showPageNavigation={showPageNavigation}\r\n showPageCount={showPageCount}\r\n showZoomControls={showZoomControls}\r\n showSearch={showSearch}\r\n showMetadata={!toolbar.isHidden('metadata')}\r\n showProperties={!toolbar.isHidden('properties')}\r\n showDownload={!toolbar.isHidden('download')}\r\n showPrint={!toolbar.isHidden('print')}\r\n disabledMetadata={toolbar.isDisabled('metadata')}\r\n disabledProperties={toolbar.isDisabled('properties')}\r\n disabledDownload={toolbar.isDisabled('download')}\r\n disabledPrint={toolbar.isDisabled('print')}\r\n onFirstPage={toolbarHandlers.handleFirstPage}\r\n onPreviousPage={toolbarHandlers.handlePreviousPage}\r\n onNextPage={toolbarHandlers.handleNextPage}\r\n onLastPage={toolbarHandlers.handleLastPage}\r\n onPageInput={toolbarHandlers.handlePageInput}\r\n onPageInputKeyPress={toolbarHandlers.handlePageInputKeyPress}\r\n onZoomIn={toolbarHandlers.handleZoomIn}\r\n onZoomOut={toolbarHandlers.handleZoomOut}\r\n onFitToWidth={toolbarHandlers.handleFitToWidth}\r\n onFitToPage={toolbarHandlers.handleFitToPage}\r\n onToggleSidebar={toolbarHandlers.toggleSidebar}\r\n onToggleFullScreen={toolbarHandlers.handleToggleFullScreen}\r\n onDownloadClick={toolbar.getHandler('download', onDownloadClick)}\r\n onPrintClick={toolbar.getHandler('print', onPrintClick)}\r\n onMetadataClick={toolbar.getHandler('metadata', onMetadataClick)}\r\n onPropertiesClick={toolbar.getHandler('properties', onPropertiesClick)}\r\n />\r\n\r\n {/* Main Content Area with Sidebar */}\r\n <div className=\"pdf-viewer-main\">\r\n {/* PDF Viewer */}\r\n <div className=\"pdf-viewer-viewer-area\">\r\n <StablePDFViewer\r\n pdfBuffer={pdfBuffer}\r\n onPasswordRequest={handlePasswordRequest}\r\n pdfViewerRef={pdfViewerRef}\r\n />\r\n </div>\r\n\r\n {/* Search Sidebar */}\r\n <SearchSidebar\r\n isOpen={isSidebarOpen}\r\n onClose={() => setIsSidebarOpen(false)}\r\n onSearch={handleSidebarSearch}\r\n onSearchResultClick={handleSearchResultClick}\r\n onNextResult={handleNextSearchResult}\r\n onPreviousResult={handlePreviousSearchResult}\r\n currentResultIndex={currentSearchResultIndex}\r\n totalResults={totalSearchResults}\r\n searchKeyword={searchQuery}\r\n searchResults={searchResults}\r\n isSearching={isSearching}\r\n />\r\n </div>\r\n\r\n {/* Password Dialog */}\r\n <PasswordDialog\r\n open={isPasswordDialogOpen}\r\n fileName={resolvedFileName}\r\n onSubmit={handlePasswordSubmit}\r\n onCancel={handlePasswordCancel}\r\n error={passwordError}\r\n />\r\n </div>\r\n );\r\n});\r\n\r\nPDFViewerContent.displayName = 'PDFViewerContent';\r\n\r\nexport const PDFViewer = forwardRef<PDFViewerMethods, FileViewerProps>((props, ref) => {\r\n return <PDFViewerContent {...props} sourceDescription=\"doc.pdf\" ref={ref} />;\r\n});\r\n\r\nPDFViewer.displayName = 'PDFViewer';\r\n","import React from 'react';\nimport { PDFViewer as HeadlessPDFViewerImport } from '@cannyminds/pdf-viewer';\n\n// Ensure we have a valid component\nconst HeadlessPDFViewer: any = HeadlessPDFViewerImport;\n\ninterface CannyMindsPDFViewerRef {\n zoom: {\n zoomIn: () => void;\n zoomOut: () => void;\n setZoom: (level: number) => void;\n resetZoom: () => void;\n getZoom: () => number | any;\n fitToWidth: () => void;\n fitToPage: () => void;\n };\n navigation: {\n goToPage: (page: number) => void;\n getCurrentPage: () => number;\n getTotalPages: () => number;\n nextPage: () => void;\n previousPage: () => void;\n goToFirstPage: () => void;\n goToLastPage: () => void;\n };\n selection: {\n clearSelection: () => void;\n getSelectedText: () => string;\n };\n search: {\n searchText: (keyword: string) => Promise<any>;\n nextResult: () => number;\n previousResult: () => number;\n goToResult: (index: number) => number;\n stopSearch: () => void;\n startSearch: () => void;\n getSearchState: () => any;\n setShowAllResults: (show: boolean) => void;\n };\n document?: {\n isReady: () => boolean;\n isLoading: () => boolean;\n hasPassword: () => boolean;\n getDocumentInfo: () => any;\n };\n scroll?: {\n scrollToPage: (page: number) => void;\n };\n}\n\ninterface StablePDFViewerProps {\n pdfBuffer: ArrayBuffer;\n onPasswordRequest: (fileName?: string) => Promise<string | null>;\n pdfViewerRef: React.RefObject<CannyMindsPDFViewerRef | null>;\n}\n\n// Stable PDF Viewer Component - only re-renders when PDF data changes\nexport const StablePDFViewer = React.memo<StablePDFViewerProps>(({ \n pdfBuffer, \n onPasswordRequest, \n pdfViewerRef \n}) => {\n return (\n <HeadlessPDFViewer\n ref={pdfViewerRef}\n pdfBuffer={pdfBuffer}\n onPasswordRequest={onPasswordRequest}\n />\n );\n});\n\nStablePDFViewer.displayName = 'StablePDFViewer';\n\nexport type { CannyMindsPDFViewerRef };","import React from 'react';\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 SearchIcon from '@mui/icons-material/Search';\r\nimport FullscreenIcon from '@mui/icons-material/Fullscreen';\r\nimport DownloadIcon from '@mui/icons-material/Download';\r\nimport PrintIcon from '@mui/icons-material/Print';\r\nimport InfoIcon from '@mui/icons-material/Info';\r\nimport DescriptionIcon from '@mui/icons-material/Description';\r\n\r\ninterface PDFToolbarProps {\r\n currentPage: number;\r\n totalPages: number;\r\n zoom: number;\r\n isSidebarOpen: boolean;\r\n showPageNavigation: boolean;\r\n showPageCount: boolean;\r\n showZoomControls: boolean;\r\n showSearch: boolean;\r\n showMetadata: boolean;\r\n showProperties: boolean;\r\n showDownload: boolean;\r\n showPrint: boolean;\r\n disabledMetadata?: boolean;\r\n disabledProperties?: boolean;\r\n disabledDownload?: boolean;\r\n disabledPrint?: boolean;\r\n onFirstPage: () => void;\r\n onPreviousPage: () => void;\r\n onNextPage: () => void;\r\n onLastPage: () => void;\r\n onPageInput: (e: React.ChangeEvent<HTMLInputElement>) => void;\r\n onPageInputKeyPress: (e: React.KeyboardEvent<HTMLInputElement>) => void;\r\n onZoomIn: () => void;\r\n onZoomOut: () => void;\r\n onFitToWidth: () => void;\r\n onFitToPage: () => void;\r\n onToggleSidebar: () => void;\r\n onToggleFullScreen: () => void;\r\n onDownloadClick?: () => void;\r\n onPrintClick?: () => void;\r\n onMetadataClick?: () => void;\r\n onPropertiesClick?: () => void;\r\n}\r\n\r\nexport const PDFToolbar = React.memo<PDFToolbarProps>(({\r\n currentPage,\r\n totalPages,\r\n zoom,\r\n isSidebarOpen,\r\n showPageNavigation,\r\n showPageCount,\r\n showZoomControls,\r\n showSearch,\r\n showMetadata,\r\n showProperties,\r\n showDownload,\r\n showPrint,\r\n disabledMetadata,\r\n disabledProperties,\r\n disabledDownload,\r\n disabledPrint,\r\n onFirstPage,\r\n onPreviousPage,\r\n onNextPage,\r\n onLastPage,\r\n onPageInput,\r\n onPageInputKeyPress,\r\n onZoomIn,\r\n onZoomOut,\r\n onFitToWidth,\r\n onFitToPage,\r\n onToggleSidebar,\r\n onToggleFullScreen,\r\n onDownloadClick,\r\n onPrintClick,\r\n onMetadataClick,\r\n onPropertiesClick\r\n}) => {\r\n return (\r\n <div className=\"pdf-viewer-toolbar\">\r\n {showPageNavigation && (\r\n <>\r\n <div className=\"toolbar-separator\"></div>\r\n <div className=\"toolbar-section\">\r\n <button\r\n className=\"toolbar-button\"\r\n onClick={onFirstPage}\r\n disabled={currentPage <= 1}\r\n title=\"First Page\"\r\n >\r\n <FirstPageIcon fontSize=\"small\" />\r\n </button>\r\n <button\r\n className=\"toolbar-button\"\r\n onClick={onPreviousPage}\r\n disabled={currentPage <= 1}\r\n title=\"Previous Page\"\r\n >\r\n <ChevronLeftIcon fontSize=\"small\" />\r\n </button>\r\n <input\r\n type=\"number\"\r\n className=\"page-input\"\r\n value={currentPage}\r\n onChange={onPageInput}\r\n onKeyPress={onPageInputKeyPress}\r\n min={1}\r\n max={totalPages || undefined}\r\n />\r\n {showPageCount && <span className=\"page-info\">of {totalPages || '...'}</span>}\r\n <button\r\n className=\"toolbar-button\"\r\n onClick={onNextPage}\r\n disabled={currentPage >= totalPages}\r\n title=\"Next Page\"\r\n >\r\n <ChevronRightIcon fontSize=\"small\" />\r\n </button>\r\n <button\r\n className=\"toolbar-button\"\r\n onClick={onLastPage}\r\n disabled={currentPage >= totalPages}\r\n title=\"Last Page\"\r\n >\r\n <LastPageIcon fontSize=\"small\" />\r\n </button>\r\n </div>\r\n </>\r\n )}\r\n\r\n {showZoomControls && (\r\n <>\r\n <div className=\"toolbar-separator\"></div>\r\n <div className=\"toolbar-section\">\r\n <button\r\n className=\"toolbar-button\"\r\n onClick={onZoomOut}\r\n title=\"Zoom Out\"\r\n >\r\n <ZoomOutIcon fontSize=\"small\" />\r\n </button>\r\n <span className=\"zoom-display\">{zoom}%</span>\r\n <button\r\n className=\"toolbar-button\"\r\n onClick={onZoomIn}\r\n title=\"Zoom In\"\r\n >\r\n <ZoomInIcon fontSize=\"small\" />\r\n </button>\r\n <button\r\n className=\"toolbar-button\"\r\n onClick={onFitToWidth}\r\n title=\"Fit to Width\"\r\n >\r\n <AspectRatioIcon fontSize=\"small\" />\r\n </button>\r\n <button\r\n className=\"toolbar-button\"\r\n onClick={onFitToPage}\r\n title=\"Fit to Page\"\r\n >\r\n <FitScreenIcon fontSize=\"small\" />\r\n </button>\r\n </div>\r\n </>\r\n )}\r\n\r\n {showSearch && (\r\n <>\r\n <div className=\"toolbar-separator\"></div>\r\n <div className=\"toolbar-section\">\r\n <button\r\n className=\"toolbar-button\"\r\n onClick={onToggleSidebar}\r\n title=\"Search in PDF\"\r\n style={{\r\n backgroundColor: isSidebarOpen ? '#e3f2fd' : 'transparent',\r\n color: isSidebarOpen ? '#1976d2' : 'inherit'\r\n }}\r\n >\r\n <SearchIcon fontSize=\"small\" />\r\n </button>\r\n </div>\r\n </>\r\n )}\r\n\r\n <div className=\"toolbar-separator\"></div>\r\n <div className=\"toolbar-section\">\r\n <button\r\n className=\"toolbar-button\"\r\n onClick={onToggleFullScreen}\r\n title=\"Fullscreen\"\r\n >\r\n <FullscreenIcon fontSize=\"small\" />\r\n </button>\r\n </div>\r\n\r\n {(showMetadata || showProperties || showDownload || showPrint) && (\r\n <>\r\n <div className=\"toolbar-separator\"></div>\r\n <div className=\"toolbar-section\">\r\n {showDownload && (\r\n <button\r\n className=\"toolbar-button\"\r\n onClick={onDownloadClick}\r\n disabled={disabledDownload}\r\n title=\"Download PDF\"\r\n >\r\n <DownloadIcon fontSize=\"small\" />\r\n </button>\r\n )}\r\n {showPrint && (\r\n <button\r\n className=\"toolbar-button\"\r\n onClick={onPrintClick}\r\n disabled={disabledPrint}\r\n title=\"Print PDF\"\r\n >\r\n <PrintIcon fontSize=\"small\" />\r\n </button>\r\n )}\r\n {showMetadata && (\r\n <button\r\n className=\"toolbar-button\"\r\n onClick={onMetadataClick}\r\n disabled={disabledMetadata}\r\n title=\"Document Metadata\"\r\n >\r\n <DescriptionIcon fontSize=\"small\" />\r\n </button>\r\n )}\r\n {showProperties && (\r\n <button\r\n className=\"toolbar-button\"\r\n onClick={onPropertiesClick}\r\n disabled={disabledProperties}\r\n title=\"Document Properties\"\r\n >\r\n <InfoIcon fontSize=\"small\" />\r\n </button>\r\n )}\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n );\r\n});\r\n\r\nPDFToolbar.displayName = 'PDFToolbar';","import React from 'react';\nimport FileIcon from '../../FileIcon';\n\ninterface PDFHeaderProps {\n fileName: string;\n fileExtension: string;\n}\n\nexport const PDFHeader = React.memo<PDFHeaderProps>(({ fileName, fileExtension }) => {\n return (\n <div className=\"pdf-viewer-header\">\n <FileIcon ext={fileExtension} size={26} />\n <div className=\"header-file-name\" title={fileName}>\n {fileName}\n </div>\n </div>\n );\n});\n\nPDFHeader.displayName = 'PDFHeader';","import React, { useState, useLayoutEffect, useEffect, useRef } from 'react';\r\nimport {\r\n Box,\r\n Typography,\r\n TextField,\r\n IconButton,\r\n InputAdornment,\r\n Divider\r\n} from '@mui/material';\r\nimport SearchIcon from '@mui/icons-material/Search';\r\nimport CloseIcon from '@mui/icons-material/Close';\r\nimport KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp';\r\nimport KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\r\nimport ClearIcon from '@mui/icons-material/Clear';\r\nimport FindInPageIcon from '@mui/icons-material/FindInPage';\r\n\r\ninterface SearchResult {\r\n pageNumber: number;\r\n text: string;\r\n context: string;\r\n index: number;\r\n}\r\n\r\ninterface SearchSidebarProps {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n onSearch: (keyword: string) => void;\r\n onSearchResultClick: (pageNumber: number, resultIndex: number) => void;\r\n onNextResult: () => void;\r\n onPreviousResult: () => void;\r\n currentResultIndex: number;\r\n totalResults: number;\r\n searchKeyword: string;\r\n searchResults?: SearchResult[];\r\n isSearching?: boolean;\r\n isSyntheticResults?: boolean; // Indicates results are from OCR/document analysis\r\n}\r\n\r\nexport const SearchSidebar: React.FC<SearchSidebarProps> = ({\r\n isOpen,\r\n onClose,\r\n onSearch,\r\n onSearchResultClick,\r\n onNextResult,\r\n onPreviousResult,\r\n currentResultIndex,\r\n totalResults,\r\n searchKeyword,\r\n searchResults = [],\r\n isSearching = false,\r\n isSyntheticResults = false\r\n}) => {\r\n const [searchTerm, setSearchTerm] = useState(searchKeyword || '');\r\n const [hasSearched, setHasSearched] = useState(false);\r\n const contentRef = useRef<HTMLDivElement>(null);\r\n\r\n // Sync local search term with prop changes (for URL-based auto-search)\r\n useEffect(() => {\r\n if (searchKeyword && searchKeyword !== searchTerm) {\r\n setSearchTerm(searchKeyword);\r\n }\r\n }, [searchKeyword]);\r\n\r\n // Scrollbar hover handler\r\n useLayoutEffect(() => {\r\n const element = contentRef.current;\r\n if (!element) return;\r\n\r\n const handleMouseMove = (e: MouseEvent) => {\r\n const rect = element.getBoundingClientRect();\r\n const distanceFromRight = rect.right - e.clientX;\r\n const distanceFromBottom = rect.bottom - e.clientY;\r\n\r\n if (distanceFromRight <= 15 || distanceFromBottom <= 15) {\r\n element.classList.add('scrollbar-hover');\r\n } else {\r\n element.classList.remove('scrollbar-hover');\r\n }\r\n };\r\n\r\n const handleMouseLeave = () => element.classList.remove('scrollbar-hover');\r\n\r\n element.addEventListener('mousemove', handleMouseMove);\r\n element.addEventListener('mouseleave', handleMouseLeave);\r\n\r\n return () => {\r\n element.removeEventListener('mousemove', handleMouseMove);\r\n element.removeEventListener('mouseleave', handleMouseLeave);\r\n };\r\n }, []);\r\n\r\n // Inject scrollbar styles\r\n useLayoutEffect(() => {\r\n const style = document.createElement('style');\r\n style.id = 'search-sidebar-scrollbar';\r\n style.textContent = `\r\n @import url('https://fonts.googleapis.com/css2?family=Noto+Sans+Tamil:wght@400;600&family=Noto+Sans+Devanagari:wght@400;600&display=swap');\r\n \r\n .search-sidebar-content::-webkit-scrollbar {\r\n width: 12px;\r\n height: 12px;\r\n }\r\n .search-sidebar-content::-webkit-scrollbar-track {\r\n background-color: transparent;\r\n }\r\n .search-sidebar-content::-webkit-scrollbar-thumb {\r\n background-color: rgba(128, 128, 128, 0.3);\r\n border-radius: 8px;\r\n border: 4px solid transparent;\r\n background-clip: padding-box;\r\n transition: all 0.15s ease;\r\n }\r\n .search-sidebar-content.scrollbar-hover::-webkit-scrollbar-thumb {\r\n background-color: rgba(128, 128, 128, 0.5);\r\n border: 2px solid transparent;\r\n }\r\n .search-sidebar-content::-webkit-scrollbar-thumb:active {\r\n background-color: rgba(25, 118, 210, 0.8);\r\n border: 1px solid transparent;\r\n }\r\n\r\n @media (prefers-color-scheme: dark) {\r\n .search-sidebar-content::-webkit-scrollbar-thumb {\r\n background-color: rgba(255, 255, 255, 0.2);\r\n }\r\n .search-sidebar-content.scrollbar-hover::-webkit-scrollbar-thumb {\r\n background-color: rgba(255, 255, 255, 0.35);\r\n }\r\n }\r\n \r\n /* Tamil font support for search results */\r\n .search-result-text {\r\n font-family: 'Noto Sans Tamil', 'Noto Sans Devanagari', Arial, sans-serif !important;\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n return () => {\r\n const el = document.getElementById('search-sidebar-scrollbar');\r\n if (el) el.remove();\r\n };\r\n }, []);\r\n\r\n useLayoutEffect(() => {\r\n setSearchTerm(searchKeyword || '');\r\n if (searchKeyword) {\r\n setHasSearched(true);\r\n }\r\n }, [searchKeyword]);\r\n\r\n const handleSearchSubmit = (e?: React.FormEvent) => {\r\n if (e) e.preventDefault();\r\n\r\n if (searchTerm.trim()) {\r\n setHasSearched(true);\r\n onSearch(searchTerm.trim());\r\n }\r\n };\r\n\r\n const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const value = e.target.value;\r\n setSearchTerm(value);\r\n\r\n if (!value.trim()) {\r\n setHasSearched(false);\r\n onSearch('');\r\n }\r\n };\r\n\r\n const handleClearSearch = () => {\r\n setSearchTerm('');\r\n setHasSearched(false);\r\n onSearch('');\r\n };\r\n\r\n // Group results by page\r\n const resultsByPage = searchResults.reduce((acc, result) => {\r\n if (!acc[result.pageNumber]) {\r\n acc[result.pageNumber] = [];\r\n }\r\n acc[result.pageNumber].push(result);\r\n return acc;\r\n }, {} as Record<number, SearchResult[]>);\r\n\r\n const highlightText = (text: any, keyword: string) => {\r\n if (!keyword) return text;\r\n\r\n const textString = typeof text === 'string' ? text : String(text || '');\r\n if (!textString) return text;\r\n\r\n try {\r\n const escapedKeyword = keyword.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n const regex = new RegExp(`(${escapedKeyword})`, 'gi');\r\n const parts = textString.split(regex);\r\n\r\n return parts.map((part, index) =>\r\n regex.test(part) ? (\r\n <Box\r\n component=\"span\"\r\n key={index}\r\n sx={{\r\n color: 'primary.main',\r\n fontWeight: 600,\r\n fontSize: 'inherit'\r\n }}\r\n >\r\n {part}\r\n </Box>\r\n ) : (\r\n part\r\n )\r\n );\r\n } catch (error) {\r\n // Return plain text if highlighting fails\r\n return textString;\r\n }\r\n };\r\n\r\n if (!isOpen) return null;\r\n\r\n return (\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n flexDirection: 'column',\r\n height: '100%',\r\n width: '320px',\r\n backgroundColor: 'background.paper',\r\n borderLeft: '1px solid',\r\n borderColor: 'divider',\r\n overflow: 'hidden'\r\n }}\r\n >\r\n {/* Header */}\r\n <Box sx={{ px: 3, py: 2.5, backgroundColor: 'background.default' }}>\r\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', mb: 2 }}>\r\n <Typography variant=\"h6\" sx={{ fontSize: '1.125rem', fontWeight: 600, color: 'text.primary' }}>\r\n Search\r\n </Typography>\r\n <IconButton\r\n size=\"small\"\r\n onClick={onClose}\r\n sx={{\r\n color: 'text.secondary',\r\n padding: '6px'\r\n }}\r\n >\r\n <CloseIcon fontSize=\"small\" />\r\n </IconButton>\r\n </Box>\r\n\r\n {/* Search Input */}\r\n <form onSubmit={handleSearchSubmit}>\r\n <TextField\r\n fullWidth\r\n size=\"medium\"\r\n placeholder=\"Search in document...\"\r\n value={searchTerm}\r\n onChange={handleSearchChange}\r\n autoComplete=\"off\"\r\n InputProps={{\r\n startAdornment: (\r\n <InputAdornment position=\"start\">\r\n <SearchIcon sx={{ color: 'text.disabled', fontSize: 20 }} />\r\n </InputAdornment>\r\n ),\r\n endAdornment: searchTerm && (\r\n <InputAdornment position=\"end\">\r\n <IconButton\r\n size=\"small\"\r\n onClick={handleClearSearch}\r\n sx={{\r\n color: 'text.secondary',\r\n padding: '4px',\r\n '&:hover': {\r\n backgroundColor: 'action.hover'\r\n }\r\n }}\r\n >\r\n <ClearIcon sx={{ fontSize: 18 }} />\r\n </IconButton>\r\n </InputAdornment>\r\n )\r\n }}\r\n sx={{\r\n '& .MuiOutlinedInput-root': {\r\n fontSize: '0.9375rem',\r\n backgroundColor: 'background.paper',\r\n borderRadius: '8px',\r\n '& fieldset': {\r\n borderColor: 'divider'\r\n },\r\n '&.Mui-focused fieldset': {\r\n borderColor: 'primary.main',\r\n borderWidth: '2px'\r\n }\r\n },\r\n '& .MuiInputBase-input': {\r\n padding: '10px 14px'\r\n }\r\n }}\r\n />\r\n </form>\r\n\r\n {/* Results Summary and Navigation */}\r\n {totalResults > 0 && (\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n mt: 2,\r\n pt: 2,\r\n borderTop: '1px solid',\r\n borderColor: 'divider'\r\n }}\r\n >\r\n <Typography variant=\"body2\" sx={{ color: 'text.secondary', fontSize: '0.875rem', fontWeight: 500 }}>\r\n {currentResultIndex + 1} of {totalResults} results\r\n </Typography>\r\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\r\n <IconButton\r\n size=\"small\"\r\n onClick={onPreviousResult}\r\n disabled={currentResultIndex <= 0}\r\n sx={{\r\n color: currentResultIndex <= 0 ? 'text.disabled' : 'primary.main',\r\n padding: '6px',\r\n borderRadius: '6px',\r\n border: '1px solid',\r\n borderColor: currentResultIndex <= 0 ? 'divider' : 'primary.main'\r\n }}\r\n >\r\n <KeyboardArrowUpIcon sx={{ fontSize: 20 }} />\r\n </IconButton>\r\n <IconButton\r\n size=\"small\"\r\n onClick={onNextResult}\r\n disabled={currentResultIndex >= totalResults - 1}\r\n sx={{\r\n color: currentResultIndex >= totalResults - 1 ? 'text.disabled' : 'primary.main',\r\n padding: '6px',\r\n borderRadius: '6px',\r\n border: '1px solid',\r\n borderColor: currentResultIndex >= totalResults - 1 ? 'divider' : 'primary.main'\r\n }}\r\n >\r\n <KeyboardArrowDownIcon sx={{ fontSize: 20 }} />\r\n </IconButton>\r\n </Box>\r\n </Box>\r\n )}\r\n </Box>\r\n\r\n <Divider />\r\n\r\n {/* Search Results */}\r\n <Box ref={contentRef} className=\"search-sidebar-content\" sx={{\r\n flex: 1,\r\n overflow: 'auto',\r\n backgroundColor: 'background.default'\r\n }}>\r\n {!searchTerm && !hasSearched && (\r\n <Box sx={{ p: 4, textAlign: 'center', mt: 6 }}>\r\n <Box\r\n sx={{\r\n width: 80,\r\n height: 80,\r\n borderRadius: '50%',\r\n backgroundColor: 'action.hover',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n margin: '0 auto',\r\n mb: 3\r\n }}\r\n >\r\n <SearchIcon sx={{ fontSize: 40, color: 'text.disabled' }} />\r\n </Box>\r\n <Typography variant=\"body1\" sx={{ color: 'text.primary', fontWeight: 500, mb: 1 }}>\r\n Search in Document\r\n </Typography>\r\n <Typography variant=\"body2\" sx={{ color: 'text.secondary', lineHeight: 1.6 }}>\r\n Enter keywords to find text within the PDF document\r\n </Typography>\r\n </Box>\r\n )}\r\n\r\n {searchTerm && !hasSearched && (\r\n <Box sx={{ p: 4, textAlign: 'center', mt: 6 }}>\r\n <Box\r\n sx={{\r\n width: 80,\r\n height: 80,\r\n borderRadius: '50%',\r\n backgroundColor: 'primary.light',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n margin: '0 auto',\r\n mb: 3,\r\n opacity: 0.2\r\n }}\r\n >\r\n <FindInPageIcon sx={{ fontSize: 40, color: 'primary.main' }} />\r\n </Box>\r\n <Typography variant=\"body1\" sx={{ color: 'text.primary', fontWeight: 500, mb: 1 }}>\r\n Ready to Search\r\n </Typography>\r\n <Typography variant=\"body2\" sx={{ color: 'text.secondary', mb: 2, lineHeight: 1.6 }}>\r\n Press Enter to find\r\n </Typography>\r\n <Typography\r\n variant=\"body2\"\r\n sx={{\r\n color: 'white',\r\n fontWeight: 600,\r\n backgroundColor: (theme) => theme.palette.mode === 'dark'\r\n ? 'rgba(144, 202, 249, 0.16)'\r\n : 'primary.light',\r\n padding: '6px 16px',\r\n borderRadius: '16px',\r\n display: 'inline-block',\r\n opacity: 0.9\r\n }}\r\n >\r\n \"{searchTerm}\"\r\n </Typography>\r\n </Box>\r\n )}\r\n\r\n {hasSearched && totalResults === 0 && !isSearching && (\r\n <Box sx={{ p: 4, textAlign: 'center', mt: 6 }}>\r\n <Box\r\n sx={{\r\n width: 80,\r\n height: 80,\r\n borderRadius: '50%',\r\n backgroundColor: (theme) => theme.palette.mode === 'dark'\r\n ? 'rgba(255, 152, 0, 0.12)'\r\n : 'warning.light',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n margin: '0 auto',\r\n mb: 3,\r\n opacity: 0.6\r\n }}\r\n >\r\n <SearchIcon sx={{ fontSize: 40, color: 'warning.main' }} />\r\n </Box>\r\n <Typography variant=\"body1\" sx={{ color: 'text.primary', fontWeight: 500, mb: 1 }}>\r\n No Results Found\r\n </Typography>\r\n <Typography variant=\"body2\" sx={{ color: 'text.secondary', lineHeight: 1.6 }}>\r\n No matches found for <strong>\"{searchTerm}\"</strong>\r\n </Typography>\r\n </Box>\r\n )}\r\n\r\n {totalResults > 0 && (\r\n <Box sx={{ p: 2 }}>\r\n {Object.keys(resultsByPage)\r\n .sort((a, b) => parseInt(a) - parseInt(b))\r\n .map((pageNum) => {\r\n const pageNumber = parseInt(pageNum);\r\n const pageResults = resultsByPage[pageNumber];\r\n\r\n return (\r\n <Box key={pageNumber} sx={{ mb: 3 }}>\r\n {/* Page Header */}\r\n <Typography\r\n variant=\"subtitle2\"\r\n sx={{\r\n color: 'text.secondary',\r\n mb: 1.5,\r\n px: 1,\r\n fontSize: '0.8125rem',\r\n fontWeight: 600,\r\n textTransform: 'uppercase',\r\n letterSpacing: '0.5px'\r\n }}\r\n >\r\n Page {pageNumber}\r\n </Typography>\r\n\r\n {/* Results for this page */}\r\n {pageResults.map((result: SearchResult, index: number) => (\r\n <Box\r\n key={index}\r\n onClick={() => onSearchResultClick(result.pageNumber, result.index)}\r\n sx={{\r\n p: 2,\r\n mx: 1,\r\n mb: 1.5,\r\n borderRadius: '8px',\r\n border: '2px solid',\r\n borderColor: result.index === currentResultIndex ? 'primary.main' : 'divider',\r\n backgroundColor: 'background.paper',\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n boxShadow: (theme) => theme.palette.mode === 'dark'\r\n ? '0 1px 3px rgba(0, 0, 0, 0.3)'\r\n : '0 1px 3px rgba(0, 0, 0, 0.05)',\r\n '&:hover': {\r\n borderColor: 'primary.main',\r\n boxShadow: (theme) => theme.palette.mode === 'dark'\r\n ? '0 2px 8px rgba(255, 255, 255, 0.15)'\r\n : '0 2px 8px rgba(0, 0, 0, 0.1)',\r\n transform: 'translateY(-1px)'\r\n }\r\n }}\r\n >\r\n <Typography\r\n variant=\"body2\"\r\n className=\"search-result-text\"\r\n sx={{\r\n fontSize: '0.875rem',\r\n lineHeight: 1.6,\r\n color: result.index === currentResultIndex ? 'text.primary' : 'text.secondary'\r\n }}\r\n >\r\n {highlightText(result.context, searchTerm)}\r\n </Typography>\r\n </Box>\r\n ))}\r\n </Box>\r\n );\r\n })}\r\n </Box>\r\n )}\r\n </Box>\r\n </Box>\r\n );\r\n};\r\n","import React, { useState, useEffect } from 'react';\r\nimport {\r\n Dialog,\r\n DialogTitle,\r\n DialogContent,\r\n DialogActions,\r\n TextField,\r\n Button,\r\n Typography,\r\n IconButton,\r\n InputAdornment,\r\n Box,\r\n Alert\r\n} from '@mui/material';\r\nimport CloseIcon from '@mui/icons-material/Close';\r\nimport LockIcon from '@mui/icons-material/Lock';\r\nimport VisibilityIcon from '@mui/icons-material/Visibility';\r\nimport VisibilityOffIcon from '@mui/icons-material/VisibilityOff';\r\n\r\ninterface PasswordDialogProps {\r\n open: boolean;\r\n fileName?: string;\r\n onSubmit: (password: string) => void;\r\n onCancel: () => void;\r\n error?: string;\r\n}\r\n\r\nexport const PasswordDialog: React.FC<PasswordDialogProps> = ({\r\n open,\r\n fileName,\r\n onSubmit,\r\n onCancel,\r\n error\r\n}) => {\r\n const [password, setPassword] = useState('');\r\n const [showPassword, setShowPassword] = useState(false);\r\n\r\n // Reset password when dialog opens/closes\r\n useEffect(() => {\r\n if (open) {\r\n setPassword('');\r\n setShowPassword(false);\r\n }\r\n }, [open]);\r\n\r\n const handleSubmit = (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (password.trim()) {\r\n onSubmit(password);\r\n }\r\n };\r\n\r\n const handleTogglePasswordVisibility = () => {\r\n setShowPassword(!showPassword);\r\n };\r\n\r\n const handleKeyPress = (e: React.KeyboardEvent) => {\r\n if (e.key === 'Enter' && password.trim()) {\r\n handleSubmit(e as any);\r\n }\r\n };\r\n\r\n return (\r\n <Dialog\r\n open={open}\r\n onClose={onCancel}\r\n maxWidth=\"sm\"\r\n fullWidth\r\n PaperProps={{\r\n sx: {\r\n borderRadius: 2\r\n }\r\n }}\r\n >\r\n <DialogTitle sx={{ pb: 1 }}>\r\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\r\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1.5 }}>\r\n <Box\r\n sx={{\r\n width: 40,\r\n height: 40,\r\n borderRadius: '50%',\r\n backgroundColor: 'primary.light',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n opacity: 0.9\r\n }}\r\n >\r\n <LockIcon sx={{ color: 'white', fontSize: 20 }} />\r\n </Box>\r\n <Typography variant=\"h6\" component=\"div\" sx={{ fontWeight: 600 }}>\r\n Password Protected\r\n </Typography>\r\n </Box>\r\n <IconButton\r\n size=\"small\"\r\n onClick={onCancel}\r\n sx={{ color: 'text.secondary' }}\r\n aria-label=\"Close dialog\"\r\n >\r\n <CloseIcon fontSize=\"small\" />\r\n </IconButton>\r\n </Box>\r\n </DialogTitle>\r\n\r\n <DialogContent sx={{ pt: 2 }}>\r\n <Typography variant=\"body2\" sx={{ color: 'text.secondary', mb: 3 }}>\r\n This PDF is password protected. Please enter the password to view{' '}\r\n {fileName && <strong>\"{fileName}\"</strong>}\r\n </Typography>\r\n\r\n {error && (\r\n <Alert severity=\"error\" sx={{ mb: 2 }}>\r\n {error}\r\n </Alert>\r\n )}\r\n\r\n <form onSubmit={handleSubmit}>\r\n <TextField\r\n fullWidth\r\n autoFocus\r\n type={showPassword ? 'text' : 'password'}\r\n label=\"Password\"\r\n placeholder=\"Enter password\"\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n onKeyPress={handleKeyPress}\r\n error={Boolean(error)}\r\n InputProps={{\r\n endAdornment: (\r\n <InputAdornment position=\"end\">\r\n <IconButton\r\n onClick={handleTogglePasswordVisibility}\r\n edge=\"end\"\r\n size=\"small\"\r\n aria-label={showPassword ? 'Hide password' : 'Show password'}\r\n >\r\n {showPassword ? <VisibilityOffIcon /> : <VisibilityIcon />}\r\n </IconButton>\r\n </InputAdornment>\r\n )\r\n }}\r\n sx={{\r\n '& .MuiOutlinedInput-root': {\r\n borderRadius: 2\r\n }\r\n }}\r\n />\r\n </form>\r\n </DialogContent>\r\n\r\n <DialogActions sx={{ px: 3, pb: 3, pt: 2 }}>\r\n <Button\r\n onClick={onCancel}\r\n variant=\"outlined\"\r\n sx={{\r\n borderRadius: 2,\r\n textTransform: 'none',\r\n px: 3\r\n }}\r\n >\r\n Cancel\r\n </Button>\r\n <Button\r\n onClick={handleSubmit}\r\n variant=\"contained\"\r\n disabled={!password.trim()}\r\n sx={{\r\n borderRadius: 2,\r\n textTransform: 'none',\r\n px: 3,\r\n boxShadow: 2\r\n }}\r\n >\r\n Unlock PDF\r\n </Button>\r\n </DialogActions>\r\n </Dialog>\r\n );\r\n};"],"mappings":"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","names":["useEffect","useRef","useState","React","jsx","React","jsx","jsxs","React","SearchIcon","jsx","jsxs","useState","useEffect","TextField","Typography","IconButton","InputAdornment","Box","CloseIcon","jsx","jsxs","jsx","jsxs","useState","useRef","useEffect","error","zoom","fileName"]}
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { F as FileViewerProps } from '../../types-C6IEfcTM.mjs';
2
+ import { F as FileViewerProps } from '../../types-BmZB9kkJ.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-C6IEfcTM.js';
2
+ import { F as FileViewerProps } from '../../types-BmZB9kkJ.js';
3
3
 
4
4
  declare const AudioViewer: React.FC<FileViewerProps>;
5
5
 
@@ -1,9 +1,10 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
2
 
3
3
 
4
- var _chunkDOOYIHGWjs = require('../../chunk-DOOYIHGW.js');
5
- require('../../chunk-RE4XRGSV.js');
4
+ var _chunk56PP5GHZjs = require('../../chunk-56PP5GHZ.js');
5
+ require('../../chunk-YEPEMLM3.js');
6
+ require('../../chunk-FA5L62Y5.js');
6
7
 
7
8
 
8
- exports.AudioViewer = _chunkDOOYIHGWjs.AudioViewer;
9
+ exports.AudioViewer = _chunk56PP5GHZjs.AudioViewer;
9
10
  //# sourceMappingURL=AudioViewer.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["d:\\Projects\\DMS-File-Viewers\\packages\\lib\\dist\\components\\viewers\\AudioViewer.js"],"names":[],"mappings":"AAAA,qFAAY;AACZ;AACE;AACF,0DAAgC;AAChC,mCAAgC;AAChC;AACE;AACF,mDAAC","file":"D:\\Projects\\DMS-File-Viewers\\packages\\lib\\dist\\components\\viewers\\AudioViewer.js"}
1
+ {"version":3,"sources":["d:\\Projects\\DMS-File-Viewers\\packages\\lib\\dist\\components\\viewers\\AudioViewer.js"],"names":[],"mappings":"AAAA,qFAAY;AACZ;AACE;AACF,0DAAgC;AAChC,mCAAgC;AAChC,mCAAgC;AAChC;AACE;AACF,mDAAC","file":"D:\\Projects\\DMS-File-Viewers\\packages\\lib\\dist\\components\\viewers\\AudioViewer.js"}
@@ -1,8 +1,9 @@
1
1
  "use client";
2
2
  import {
3
3
  AudioViewer
4
- } from "../../chunk-4DJJINTB.mjs";
5
- import "../../chunk-QQDQJ7TS.mjs";
4
+ } from "../../chunk-KBST5Z5H.mjs";
5
+ import "../../chunk-M57PSU4O.mjs";
6
+ import "../../chunk-VJFXCN5Z.mjs";
6
7
  export {
7
8
  AudioViewer
8
9
  };
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { F as FileViewerProps } from '../../types-C6IEfcTM.mjs';
2
+ import { F as FileViewerProps } from '../../types-BmZB9kkJ.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-C6IEfcTM.js';
2
+ import { F as FileViewerProps } from '../../types-BmZB9kkJ.js';
3
3
 
4
4
  declare const DefaultViewer: React.FC<FileViewerProps>;
5
5
 
@@ -1,9 +1,10 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
2
 
3
3
 
4
- var _chunk77UARJVQjs = require('../../chunk-77UARJVQ.js');
5
- require('../../chunk-RE4XRGSV.js');
4
+ var _chunkUUM656JEjs = require('../../chunk-UUM656JE.js');
5
+ require('../../chunk-YEPEMLM3.js');
6
+ require('../../chunk-FA5L62Y5.js');
6
7
 
7
8
 
8
- exports.DefaultViewer = _chunk77UARJVQjs.DefaultViewer;
9
+ exports.DefaultViewer = _chunkUUM656JEjs.DefaultViewer;
9
10
  //# 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,mCAAgC;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,mCAAgC;AAChC;AACE;AACF,uDAAC","file":"D:\\Projects\\DMS-File-Viewers\\packages\\lib\\dist\\components\\viewers\\DefaultViewer.js"}
@@ -1,8 +1,9 @@
1
1
  "use client";
2
2
  import {
3
3
  DefaultViewer
4
- } from "../../chunk-677DWENS.mjs";
5
- import "../../chunk-QQDQJ7TS.mjs";
4
+ } from "../../chunk-THFHTTQX.mjs";
5
+ import "../../chunk-M57PSU4O.mjs";
6
+ import "../../chunk-VJFXCN5Z.mjs";
6
7
  export {
7
8
  DefaultViewer
8
9
  };
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { F as FileViewerProps } from '../../types-C6IEfcTM.mjs';
2
+ import { F as FileViewerProps } from '../../types-BmZB9kkJ.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-C6IEfcTM.js';
2
+ import { F as FileViewerProps } from '../../types-BmZB9kkJ.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 _chunkZ3IUTTJQjs = require('../../chunk-Z3IUTTJQ.js');
5
- require('../../chunk-DDT3GC3C.js');
6
- require('../../chunk-RE4XRGSV.js');
4
+ var _chunkEAM7CURMjs = require('../../chunk-EAM7CURM.js');
5
+ require('../../chunk-A2MSWOEM.js');
6
+ require('../../chunk-FA5L62Y5.js');
7
7
 
8
8
 
9
- exports.ImageViewer = _chunkZ3IUTTJQjs.ImageViewer;
9
+ exports.ImageViewer = _chunkEAM7CURMjs.ImageViewer;
10
10
  //# sourceMappingURL=ImageViewer.js.map
@@ -1,9 +1,9 @@
1
1
  "use client";
2
2
  import {
3
3
  ImageViewer
4
- } from "../../chunk-BONT4K3R.mjs";
5
- import "../../chunk-J2YW5DHC.mjs";
6
- import "../../chunk-QQDQJ7TS.mjs";
4
+ } from "../../chunk-U4W524VZ.mjs";
5
+ import "../../chunk-GMDRDOWP.mjs";
6
+ import "../../chunk-VJFXCN5Z.mjs";
7
7
  export {
8
8
  ImageViewer
9
9
  };
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { F as FileViewerProps } from '../../types-C6IEfcTM.mjs';
2
+ import { F as FileViewerProps } from '../../types-BmZB9kkJ.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-C6IEfcTM.js';
2
+ import { F as FileViewerProps } from '../../types-BmZB9kkJ.js';
3
3
 
4
4
  interface PDFViewerMethods {
5
5
  zoomIn: () => void;
@@ -1,9 +1,11 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
2
 
3
3
 
4
- var _chunkDDT3GC3Cjs = require('../../chunk-DDT3GC3C.js');
5
- require('../../chunk-RE4XRGSV.js');
4
+ var _chunkD7LXG67Zjs = require('../../chunk-D7LXG67Z.js');
5
+ require('../../chunk-A2MSWOEM.js');
6
+ require('../../chunk-YEPEMLM3.js');
7
+ require('../../chunk-FA5L62Y5.js');
6
8
 
7
9
 
8
- exports.PDFViewer = _chunkDDT3GC3Cjs.PDFViewer;
10
+ exports.PDFViewer = _chunkD7LXG67Zjs.PDFViewer;
9
11
  //# sourceMappingURL=PDFViewer.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["d:\\Projects\\DMS-File-Viewers\\packages\\lib\\dist\\components\\viewers\\PDFViewer.js"],"names":[],"mappings":"AAAA,qFAAY;AACZ;AACE;AACF,0DAAgC;AAChC,mCAAgC;AAChC;AACE;AACF,+CAAC","file":"D:\\Projects\\DMS-File-Viewers\\packages\\lib\\dist\\components\\viewers\\PDFViewer.js"}
1
+ {"version":3,"sources":["d:\\Projects\\DMS-File-Viewers\\packages\\lib\\dist\\components\\viewers\\PDFViewer.js"],"names":[],"mappings":"AAAA,qFAAY;AACZ;AACE;AACF,0DAAgC;AAChC,mCAAgC;AAChC,mCAAgC;AAChC,mCAAgC;AAChC;AACE;AACF,+CAAC","file":"D:\\Projects\\DMS-File-Viewers\\packages\\lib\\dist\\components\\viewers\\PDFViewer.js"}
@@ -1,8 +1,10 @@
1
1
  "use client";
2
2
  import {
3
3
  PDFViewer
4
- } from "../../chunk-J2YW5DHC.mjs";
5
- import "../../chunk-QQDQJ7TS.mjs";
4
+ } from "../../chunk-ZKGWS327.mjs";
5
+ import "../../chunk-GMDRDOWP.mjs";
6
+ import "../../chunk-M57PSU4O.mjs";
7
+ import "../../chunk-VJFXCN5Z.mjs";
6
8
  export {
7
9
  PDFViewer
8
10
  };
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { F as FileViewerProps } from '../../types-C6IEfcTM.mjs';
2
+ import { F as FileViewerProps } from '../../types-BmZB9kkJ.mjs';
3
3
 
4
4
  declare const TIFFViewer: React.FC<FileViewerProps>;
5
5
 
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { F as FileViewerProps } from '../../types-C6IEfcTM.js';
2
+ import { F as FileViewerProps } from '../../types-BmZB9kkJ.js';
3
3
 
4
4
  declare const TIFFViewer: React.FC<FileViewerProps>;
5
5
 
@@ -1,9 +1,10 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
2
 
3
3
 
4
- var _chunkSBEFC7HPjs = require('../../chunk-SBEFC7HP.js');
5
- require('../../chunk-RE4XRGSV.js');
4
+ var _chunkCQ3HSM5Sjs = require('../../chunk-CQ3HSM5S.js');
5
+ require('../../chunk-YEPEMLM3.js');
6
+ require('../../chunk-FA5L62Y5.js');
6
7
 
7
8
 
8
- exports.TIFFViewer = _chunkSBEFC7HPjs.TIFFViewer;
9
+ exports.TIFFViewer = _chunkCQ3HSM5Sjs.TIFFViewer;
9
10
  //# sourceMappingURL=TIFFViewer.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["d:\\Projects\\DMS-File-Viewers\\packages\\lib\\dist\\components\\viewers\\TIFFViewer.js"],"names":[],"mappings":"AAAA,qFAAY;AACZ;AACE;AACF,0DAAgC;AAChC,mCAAgC;AAChC;AACE;AACF,iDAAC","file":"D:\\Projects\\DMS-File-Viewers\\packages\\lib\\dist\\components\\viewers\\TIFFViewer.js"}
1
+ {"version":3,"sources":["d:\\Projects\\DMS-File-Viewers\\packages\\lib\\dist\\components\\viewers\\TIFFViewer.js"],"names":[],"mappings":"AAAA,qFAAY;AACZ;AACE;AACF,0DAAgC;AAChC,mCAAgC;AAChC,mCAAgC;AAChC;AACE;AACF,iDAAC","file":"D:\\Projects\\DMS-File-Viewers\\packages\\lib\\dist\\components\\viewers\\TIFFViewer.js"}
@@ -1,8 +1,9 @@
1
1
  "use client";
2
2
  import {
3
3
  TIFFViewer
4
- } from "../../chunk-YHMHDPLQ.mjs";
5
- import "../../chunk-QQDQJ7TS.mjs";
4
+ } from "../../chunk-PFJKVNUA.mjs";
5
+ import "../../chunk-M57PSU4O.mjs";
6
+ import "../../chunk-VJFXCN5Z.mjs";
6
7
  export {
7
8
  TIFFViewer
8
9
  };
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { F as FileViewerProps } from '../../types-C6IEfcTM.mjs';
2
+ import { F as FileViewerProps } from '../../types-BmZB9kkJ.mjs';
3
3
 
4
4
  declare const TextViewer: React.FC<FileViewerProps>;
5
5
 
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { F as FileViewerProps } from '../../types-C6IEfcTM.js';
2
+ import { F as FileViewerProps } from '../../types-BmZB9kkJ.js';
3
3
 
4
4
  declare const TextViewer: React.FC<FileViewerProps>;
5
5
 
@@ -1,9 +1,10 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
2
 
3
3
 
4
- var _chunkWP55NYFSjs = require('../../chunk-WP55NYFS.js');
5
- require('../../chunk-RE4XRGSV.js');
4
+ var _chunkLQVHD4FSjs = require('../../chunk-LQVHD4FS.js');
5
+ require('../../chunk-YEPEMLM3.js');
6
+ require('../../chunk-FA5L62Y5.js');
6
7
 
7
8
 
8
- exports.TextViewer = _chunkWP55NYFSjs.TextViewer;
9
+ exports.TextViewer = _chunkLQVHD4FSjs.TextViewer;
9
10
  //# sourceMappingURL=TextViewer.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["d:\\Projects\\DMS-File-Viewers\\packages\\lib\\dist\\components\\viewers\\TextViewer.js"],"names":[],"mappings":"AAAA,qFAAY;AACZ;AACE;AACF,0DAAgC;AAChC,mCAAgC;AAChC;AACE;AACF,iDAAC","file":"D:\\Projects\\DMS-File-Viewers\\packages\\lib\\dist\\components\\viewers\\TextViewer.js"}
1
+ {"version":3,"sources":["d:\\Projects\\DMS-File-Viewers\\packages\\lib\\dist\\components\\viewers\\TextViewer.js"],"names":[],"mappings":"AAAA,qFAAY;AACZ;AACE;AACF,0DAAgC;AAChC,mCAAgC;AAChC,mCAAgC;AAChC;AACE;AACF,iDAAC","file":"D:\\Projects\\DMS-File-Viewers\\packages\\lib\\dist\\components\\viewers\\TextViewer.js"}
@@ -1,8 +1,9 @@
1
1
  "use client";
2
2
  import {
3
3
  TextViewer
4
- } from "../../chunk-7BLEPGZ4.mjs";
5
- import "../../chunk-QQDQJ7TS.mjs";
4
+ } from "../../chunk-7AUCINV2.mjs";
5
+ import "../../chunk-M57PSU4O.mjs";
6
+ import "../../chunk-VJFXCN5Z.mjs";
6
7
  export {
7
8
  TextViewer
8
9
  };
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { F as FileViewerProps } from '../../types-C6IEfcTM.mjs';
2
+ import { F as FileViewerProps } from '../../types-BmZB9kkJ.mjs';
3
3
 
4
4
  declare const VideoViewer: React.FC<FileViewerProps>;
5
5
 
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { F as FileViewerProps } from '../../types-C6IEfcTM.js';
2
+ import { F as FileViewerProps } from '../../types-BmZB9kkJ.js';
3
3
 
4
4
  declare const VideoViewer: React.FC<FileViewerProps>;
5
5
 
@@ -1,9 +1,10 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
2
 
3
3
 
4
- var _chunkSNEIVT4Rjs = require('../../chunk-SNEIVT4R.js');
5
- require('../../chunk-RE4XRGSV.js');
4
+ var _chunkETHSDRF5js = require('../../chunk-ETHSDRF5.js');
5
+ require('../../chunk-YEPEMLM3.js');
6
+ require('../../chunk-FA5L62Y5.js');
6
7
 
7
8
 
8
- exports.VideoViewer = _chunkSNEIVT4Rjs.VideoViewer;
9
+ exports.VideoViewer = _chunkETHSDRF5js.VideoViewer;
9
10
  //# sourceMappingURL=VideoViewer.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["d:\\Projects\\DMS-File-Viewers\\packages\\lib\\dist\\components\\viewers\\VideoViewer.js"],"names":[],"mappings":"AAAA,qFAAY;AACZ;AACE;AACF,0DAAgC;AAChC,mCAAgC;AAChC;AACE;AACF,mDAAC","file":"D:\\Projects\\DMS-File-Viewers\\packages\\lib\\dist\\components\\viewers\\VideoViewer.js"}
1
+ {"version":3,"sources":["d:\\Projects\\DMS-File-Viewers\\packages\\lib\\dist\\components\\viewers\\VideoViewer.js"],"names":[],"mappings":"AAAA,qFAAY;AACZ;AACE;AACF,0DAAgC;AAChC,mCAAgC;AAChC,mCAAgC;AAChC;AACE;AACF,mDAAC","file":"D:\\Projects\\DMS-File-Viewers\\packages\\lib\\dist\\components\\viewers\\VideoViewer.js"}
@@ -1,8 +1,9 @@
1
1
  "use client";
2
2
  import {
3
3
  VideoViewer
4
- } from "../../chunk-BHMFZTZ7.mjs";
5
- import "../../chunk-QQDQJ7TS.mjs";
4
+ } from "../../chunk-WNZHGFNC.mjs";
5
+ import "../../chunk-M57PSU4O.mjs";
6
+ import "../../chunk-VJFXCN5Z.mjs";
6
7
  export {
7
8
  VideoViewer
8
9
  };