@cyber-harbour/ui 2.1.9 → 2.1.11

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.
@@ -0,0 +1,3 @@
1
+ import {a,z,Pa,ob,ma}from'./chunk-F7QBTZ73.mjs';import {useState,useRef,useCallback,useMemo,useEffect}from'react';import _ from'lodash.debounce';import {pdfjs,Document,Page}from'react-pdf';import'react-pdf/dist/Page/AnnotationLayer.css';import'react-pdf/dist/Page/TextLayer.css';import {Virtuoso}from'react-virtuoso';import {jsx,jsxs}from'react/jsx-runtime';var f="/pdfjs";typeof window<"u"&&typeof document<"u"&&(pdfjs.GlobalWorkerOptions.workerSrc=`${f}/pdf.worker.min.js`);var ne=1e3,oe=400,se=150,ae=70,ie=1.414,P=400,he=a(({url:j})=>{let[s,U]=useState(0),[a,v]=useState(1),[M,D]=useState(true),[I,O]=useState(null),[h,z$1]=useState(P),[B,H]=useState(P),[i,L]=useState(1),[b,F]=useState(P),[E,$]=useState(ie),l=useRef(null),R=useRef(null),w=useRef(false),d=useRef(null),x=useRef(false),p=useCallback((e,r=true)=>{e<1||e>s||(w.current=true,R.current?.scrollToIndex({index:e-1,align:"start",behavior:r?"smooth":"auto"}),d.current&&clearTimeout(d.current),d.current=setTimeout(()=>{x.current&&(w.current=false);},ne));},[s]),N=useMemo(()=>_((e,r=false)=>{p(e,r);},oe),[p]),W=useCallback(()=>{L(e=>Math.min(e+.25,4));},[]),Z=useCallback(()=>{L(e=>Math.max(e-.25,.25));},[]);useEffect(()=>{if(!l.current)return;let e=_(()=>{l.current&&(z$1(l.current.offsetWidth-ae),H(l.current.clientHeight));},se);e();let r=new ResizeObserver(e);return r.observe(l.current),()=>{r.disconnect(),e.cancel();}},[]);let V=useMemo(()=>({cMapPacked:true,cMapUrl:`${f}/cmaps/`,standardFontDataUrl:`${f}/standard_fonts/`,wasmUrl:`${f}/wasm/`,iccUrl:`${f}/icc/`}),[]),G=useCallback(({numPages:e})=>{U(e),D(false);},[]),Y=useCallback(e=>{O(`Failed to load PDF: ${e.message}`),D(false);},[]),g=useCallback(e=>{let r=a+e;v(r),p(r);},[a,p]),J=useCallback(()=>{g(-1);},[g]),q=useCallback(()=>{g(1);},[g]),K=useCallback(e=>{if(w.current)return;let r=e.startIndex+1;r!==a&&v(r);},[a]);return useEffect(()=>(x.current=true,()=>{x.current=false,N.cancel(),d.current&&clearTimeout(d.current);}),[N]),useEffect(()=>{F(h*i*E);},[h,i,E]),I?jsx("div",{className:"flex items-center justify-center h-full w-full",children:jsx("div",{className:"text-red-500 text-center",children:jsx("p",{children:I})})}):jsxs("div",{className:"h-full w-full flex flex-col overflow-hidden pb-5",children:[M&&jsx("div",{className:"flex items-center justify-center h-full",children:jsx("div",{className:"text-gray-500",children:"Loading PDF..."})}),s>0&&jsxs("div",{className:"flex items-center justify-center md:justify-between flex-wrap gap-3 p-4",children:[jsxs("div",{className:"flex items-center justify-center gap-3",children:[jsx(z,{variant:"outlined","aria-label":"previous page",color:"secondary",size:"small",type:"button",disabled:a<=1,onClick:J,p:5,icon:jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:jsx("path",{d:"m15 18-6-6 6-6"})})}),jsxs("span",{className:"flex items-center gap-2",children:[jsx("input",{type:"number",min:1,max:s,value:a,onChange:e=>{let r=parseInt(e.target.value,10);r>=1&&r<=s&&(v(r),N(r,false));},className:"w-15 px-1 py-1 border border-gray-400! rounded text-center"}),"/ ",s]}),jsx(z,{variant:"outlined","aria-label":"next page",color:"secondary",size:"small",type:"button",disabled:a>=s,onClick:q,p:7,icon:jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:jsx("path",{d:"m9 18 6-6-6-6"})})})]}),jsxs("div",{className:"flex items-center justify-center gap-3",children:[jsx(z,{variant:"outlined","aria-label":"zoom-out",color:"secondary",size:"small",icon:jsx(Pa,{style:{width:20,height:20}}),onClick:Z,disabled:i<=.25,p:7}),jsxs(ob,{py:5,px:8,children:[i*100,"%"]}),jsx(z,{variant:"outlined","aria-label":"zoom-in",size:"small",color:"secondary",icon:jsx(ma,{style:{width:14,height:14}}),onClick:W,disabled:i>=4,p:8})]})]}),jsx("div",{ref:l,className:"flex-1 overflow-hidden min-h-0",children:jsx(Document,{options:V,file:j,onLoadSuccess:G,onLoadError:Y,loading:jsx("div",{className:"flex items-center justify-center",style:{height:b},children:jsx("div",{className:"h-10 w-10 rounded-full border border-2 border-gray-200 animate-spin border-s-transparent"})}),children:jsx(Virtuoso,{ref:R,style:{height:B||"calc(100dvh - 190px)",width:"100%"},totalCount:s,rangeChanged:K,defaultItemHeight:b,itemContent:e=>jsx("div",{className:"mx-auto w-fit mb-4",children:jsx(Page,{pageNumber:e+1,renderTextLayer:true,renderAnnotationLayer:true,width:h*i,onLoadSuccess:r=>{if(e===0){let Q=r.height/r.width;$(Q);}},loading:jsx("div",{className:"flex items-center justify-center",style:{height:b},children:jsx("div",{className:"h-10 w-10 rounded-full border border-2 border-gray-200 animate-spin border-s-transparent"})}),className:"h-auto w-full transition-[width] duration-[600ms] ease-in-out"})})})})})]})},"PdfDriver");
2
+ export{he as PdfDriver};//# sourceMappingURL=PdfDriver-6JQ3D3E6.mjs.map
3
+ //# sourceMappingURL=PdfDriver-6JQ3D3E6.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/FileViewer/drivers/PdfDriver/PdfDriver.tsx"],"names":["BASE_DIR","pdfjs","SCROLL_ANIMATION_DURATION","INPUT_DEBOUNCE_DELAY","RESIZE_DEBOUNCE_DELAY","CONTAINER_PADDING","DEFAULT_RATIO_A4","DEFAULT_MIN_SIZE","PdfDriver","__name","url","numPages","setNumPages","useState","pageNumber","setPageNumber","loading","setLoading","error","setError","width","setWidth","height","setHeight","scale","setScale","defaultPageHeight","setDefaultPageHeight","pageAspectRatio","setPageAspectRatio","containerRef","useRef","virtuosoRef","isUserScrollingRef","scrollTimeoutRef","isMountedRef","scrollToPage","useCallback","page","smooth","debouncedScroll","useMemo","debounce","handleZoomIn","prev","handleZoomOut","useEffect","updateSize","observer","options","onDocumentLoadSuccess","onDocumentLoadError","changePage","offset","newPage","previousPage","nextPage","handleRangeChanged","range","visiblePage","jsx","jsxs","Button","MinusIcon","Box","PlusIcon","Document","Virtuoso","index","Page","ratio"],"mappings":"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","file":"PdfDriver-6JQ3D3E6.mjs","sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport debounce from 'lodash.debounce';\nimport { Document, Page, pdfjs } from 'react-pdf';\nimport 'react-pdf/dist/Page/AnnotationLayer.css';\nimport 'react-pdf/dist/Page/TextLayer.css';\nimport { Virtuoso, VirtuosoHandle } from 'react-virtuoso';\nimport { Box, Button, MinusIcon, PlusIcon } from '../../../Core';\n\nconst BASE_DIR = '/pdfjs';\n\n// Set up the worker - self-hosted configuration (client-side only)\nif (typeof window !== 'undefined' && typeof document !== 'undefined') {\n pdfjs.GlobalWorkerOptions.workerSrc = `${BASE_DIR}/pdf.worker.min.js`;\n}\n\ninterface PdfDriverProps {\n url: string;\n}\nconst SCROLL_ANIMATION_DURATION = 1000;\nconst INPUT_DEBOUNCE_DELAY = 400;\nconst RESIZE_DEBOUNCE_DELAY = 150;\nconst CONTAINER_PADDING = 70;\nconst DEFAULT_RATIO_A4 = 1.414;\nconst DEFAULT_MIN_SIZE = 400;\n\nexport const PdfDriver: React.FC<PdfDriverProps> = ({ url }) => {\n const [numPages, setNumPages] = useState<number>(0);\n const [pageNumber, setPageNumber] = useState<number>(1);\n const [loading, setLoading] = useState<boolean>(true);\n const [error, setError] = useState<string | null>(null);\n const [width, setWidth] = useState<number>(DEFAULT_MIN_SIZE);\n const [height, setHeight] = useState<number>(DEFAULT_MIN_SIZE);\n const [scale, setScale] = useState(1);\n const [defaultPageHeight, setDefaultPageHeight] = useState(DEFAULT_MIN_SIZE);\n const [pageAspectRatio, setPageAspectRatio] = useState(DEFAULT_RATIO_A4);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const virtuosoRef = useRef<VirtuosoHandle>(null);\n const isUserScrollingRef = useRef<boolean>(false);\n const scrollTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const isMountedRef = useRef(false);\n\n const scrollToPage = useCallback(\n (page: number, smooth = true) => {\n if (page < 1 || page > numPages) return;\n\n isUserScrollingRef.current = true;\n virtuosoRef.current?.scrollToIndex({\n index: page - 1,\n align: 'start',\n behavior: smooth ? 'smooth' : 'auto',\n });\n\n if (scrollTimeoutRef.current) {\n clearTimeout(scrollTimeoutRef.current);\n }\n\n scrollTimeoutRef.current = setTimeout(() => {\n if (isMountedRef.current) isUserScrollingRef.current = false;\n }, SCROLL_ANIMATION_DURATION);\n },\n [numPages]\n );\n\n const debouncedScroll = useMemo(() => {\n return debounce((page: number, smooth = false) => {\n scrollToPage(page, smooth);\n }, INPUT_DEBOUNCE_DELAY);\n }, [scrollToPage]);\n\n const handleZoomIn = useCallback(() => {\n setScale((prev) => Math.min(prev + 0.25, 4));\n }, []);\n\n const handleZoomOut = useCallback(() => {\n setScale((prev) => Math.max(prev - 0.25, 0.25));\n }, []);\n\n useEffect(() => {\n if (!containerRef.current) return;\n const updateSize = debounce(() => {\n if (containerRef.current) {\n setWidth(containerRef.current.offsetWidth - CONTAINER_PADDING);\n setHeight(containerRef.current.clientHeight);\n }\n }, RESIZE_DEBOUNCE_DELAY);\n updateSize();\n const observer = new ResizeObserver(updateSize);\n observer.observe(containerRef.current);\n return () => {\n observer.disconnect();\n updateSize.cancel();\n };\n }, []);\n\n const options = useMemo(\n () => ({\n cMapPacked: true,\n cMapUrl: `${BASE_DIR}/cmaps/`,\n standardFontDataUrl: `${BASE_DIR}/standard_fonts/`,\n wasmUrl: `${BASE_DIR}/wasm/`,\n iccUrl: `${BASE_DIR}/icc/`,\n }),\n []\n );\n\n const onDocumentLoadSuccess = useCallback(({ numPages }: { numPages: number }): void => {\n setNumPages(numPages);\n setLoading(false);\n }, []);\n\n const onDocumentLoadError = useCallback((error: Error): void => {\n setError(`Failed to load PDF: ${error.message}`);\n setLoading(false);\n }, []);\n\n const changePage = useCallback(\n (offset: number): void => {\n const newPage = pageNumber + offset;\n setPageNumber(newPage);\n scrollToPage(newPage);\n },\n [pageNumber, scrollToPage]\n );\n\n const previousPage = useCallback((): void => {\n changePage(-1);\n }, [changePage]);\n\n const nextPage = useCallback((): void => {\n changePage(1);\n }, [changePage]);\n\n const handleRangeChanged = useCallback(\n (range: { startIndex: number; endIndex: number }) => {\n if (isUserScrollingRef.current) {\n return;\n }\n const visiblePage = range.startIndex + 1;\n if (visiblePage !== pageNumber) {\n setPageNumber(visiblePage);\n }\n },\n [pageNumber]\n );\n\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n debouncedScroll.cancel();\n if (scrollTimeoutRef.current) {\n clearTimeout(scrollTimeoutRef.current);\n }\n };\n }, [debouncedScroll]);\n\n useEffect(() => {\n setDefaultPageHeight(width * scale * pageAspectRatio);\n }, [width, scale, pageAspectRatio]);\n\n if (error) {\n return (\n <div className=\"flex items-center justify-center h-full w-full\">\n <div className=\"text-red-500 text-center\">\n <p>{error}</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"h-full w-full flex flex-col overflow-hidden pb-5\">\n {loading && (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"text-gray-500\">Loading PDF...</div>\n </div>\n )}\n {numPages > 0 && (\n <div className=\"flex items-center justify-center md:justify-between flex-wrap gap-3 p-4\">\n <div className=\"flex items-center justify-center gap-3\">\n <Button\n variant=\"outlined\"\n aria-label=\"previous page\"\n color=\"secondary\"\n size=\"small\"\n type=\"button\"\n disabled={pageNumber <= 1}\n onClick={previousPage}\n p={5}\n icon={\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n }\n />\n\n <span className=\"flex items-center gap-2\">\n <input\n type=\"number\"\n min={1}\n max={numPages}\n value={pageNumber}\n onChange={(e) => {\n const page = parseInt(e.target.value, 10);\n if (page >= 1 && page <= numPages) {\n setPageNumber(page);\n debouncedScroll(page, false);\n }\n }}\n className=\"w-15 px-1 py-1 border border-gray-400! rounded text-center\"\n />\n / {numPages}\n </span>\n <Button\n variant=\"outlined\"\n aria-label=\"next page\"\n color=\"secondary\"\n size=\"small\"\n type=\"button\"\n disabled={pageNumber >= numPages}\n onClick={nextPage}\n p={7}\n icon={\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n }\n />\n </div>\n <div className=\"flex items-center justify-center gap-3\">\n <Button\n variant=\"outlined\"\n aria-label=\"zoom-out\"\n color=\"secondary\"\n size=\"small\"\n icon={<MinusIcon style={{ width: 20, height: 20 }} />}\n onClick={handleZoomOut}\n disabled={scale <= 0.25}\n p={7}\n />\n <Box py={5} px={8}>\n {scale * 100}%\n </Box>\n <Button\n variant=\"outlined\"\n aria-label=\"zoom-in\"\n size=\"small\"\n color=\"secondary\"\n icon={<PlusIcon style={{ width: 14, height: 14 }} />}\n onClick={handleZoomIn}\n disabled={scale >= 4}\n p={8}\n />\n </div>\n </div>\n )}\n <div ref={containerRef} className=\"flex-1 overflow-hidden min-h-0\">\n <Document\n options={options}\n file={url}\n onLoadSuccess={onDocumentLoadSuccess}\n onLoadError={onDocumentLoadError}\n loading={\n <div className=\"flex items-center justify-center\" style={{ height: defaultPageHeight }}>\n <div className=\"h-10 w-10 rounded-full border border-2 border-gray-200 animate-spin border-s-transparent\" />\n </div>\n }\n >\n <Virtuoso\n ref={virtuosoRef}\n style={{ height: height || 'calc(100dvh - 190px)', width: '100%' }}\n totalCount={numPages}\n rangeChanged={handleRangeChanged}\n defaultItemHeight={defaultPageHeight}\n itemContent={(index) => (\n <div className=\"mx-auto w-fit mb-4\">\n <Page\n pageNumber={index + 1}\n renderTextLayer={true}\n renderAnnotationLayer={true}\n width={width * scale}\n onLoadSuccess={(page) => {\n if (index === 0) {\n const ratio = page.height / page.width;\n setPageAspectRatio(ratio);\n }\n }}\n loading={\n <div className=\"flex items-center justify-center\" style={{ height: defaultPageHeight }}>\n <div className=\"h-10 w-10 rounded-full border border-2 border-gray-200 animate-spin border-s-transparent\" />\n </div>\n }\n className=\"h-auto w-full transition-[width] duration-[600ms] ease-in-out\"\n />\n </div>\n )}\n />\n </Document>\n </div>\n </div>\n );\n};\n"]}
@@ -0,0 +1,3 @@
1
+ 'use strict';var chunkBZYQS7OV_js=require('./chunk-BZYQS7OV.js'),react=require('react'),_=require('lodash.debounce'),reactPdf=require('react-pdf');require('react-pdf/dist/Page/AnnotationLayer.css'),require('react-pdf/dist/Page/TextLayer.css');var reactVirtuoso=require('react-virtuoso'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var ___default=/*#__PURE__*/_interopDefault(_);var f="/pdfjs";typeof window<"u"&&typeof document<"u"&&(reactPdf.pdfjs.GlobalWorkerOptions.workerSrc=`${f}/pdf.worker.min.js`);var ne=1e3,oe=400,se=150,ae=70,ie=1.414,P=400,be=chunkBZYQS7OV_js.a(({url:j})=>{let[s,U]=react.useState(0),[a,v]=react.useState(1),[M,D]=react.useState(true),[I,O]=react.useState(null),[h,z]=react.useState(P),[B,H]=react.useState(P),[i,L]=react.useState(1),[b,F]=react.useState(P),[E,$]=react.useState(ie),l=react.useRef(null),R=react.useRef(null),w=react.useRef(false),d=react.useRef(null),x=react.useRef(false),p=react.useCallback((e,r=true)=>{e<1||e>s||(w.current=true,R.current?.scrollToIndex({index:e-1,align:"start",behavior:r?"smooth":"auto"}),d.current&&clearTimeout(d.current),d.current=setTimeout(()=>{x.current&&(w.current=false);},ne));},[s]),N=react.useMemo(()=>___default.default((e,r=false)=>{p(e,r);},oe),[p]),W=react.useCallback(()=>{L(e=>Math.min(e+.25,4));},[]),Z=react.useCallback(()=>{L(e=>Math.max(e-.25,.25));},[]);react.useEffect(()=>{if(!l.current)return;let e=___default.default(()=>{l.current&&(z(l.current.offsetWidth-ae),H(l.current.clientHeight));},se);e();let r=new ResizeObserver(e);return r.observe(l.current),()=>{r.disconnect(),e.cancel();}},[]);let V=react.useMemo(()=>({cMapPacked:true,cMapUrl:`${f}/cmaps/`,standardFontDataUrl:`${f}/standard_fonts/`,wasmUrl:`${f}/wasm/`,iccUrl:`${f}/icc/`}),[]),G=react.useCallback(({numPages:e})=>{U(e),D(false);},[]),Y=react.useCallback(e=>{O(`Failed to load PDF: ${e.message}`),D(false);},[]),g=react.useCallback(e=>{let r=a+e;v(r),p(r);},[a,p]),J=react.useCallback(()=>{g(-1);},[g]),q=react.useCallback(()=>{g(1);},[g]),K=react.useCallback(e=>{if(w.current)return;let r=e.startIndex+1;r!==a&&v(r);},[a]);return react.useEffect(()=>(x.current=true,()=>{x.current=false,N.cancel(),d.current&&clearTimeout(d.current);}),[N]),react.useEffect(()=>{F(h*i*E);},[h,i,E]),I?jsxRuntime.jsx("div",{className:"flex items-center justify-center h-full w-full",children:jsxRuntime.jsx("div",{className:"text-red-500 text-center",children:jsxRuntime.jsx("p",{children:I})})}):jsxRuntime.jsxs("div",{className:"h-full w-full flex flex-col overflow-hidden pb-5",children:[M&&jsxRuntime.jsx("div",{className:"flex items-center justify-center h-full",children:jsxRuntime.jsx("div",{className:"text-gray-500",children:"Loading PDF..."})}),s>0&&jsxRuntime.jsxs("div",{className:"flex items-center justify-center md:justify-between flex-wrap gap-3 p-4",children:[jsxRuntime.jsxs("div",{className:"flex items-center justify-center gap-3",children:[jsxRuntime.jsx(chunkBZYQS7OV_js.z,{variant:"outlined","aria-label":"previous page",color:"secondary",size:"small",type:"button",disabled:a<=1,onClick:J,p:5,icon:jsxRuntime.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:jsxRuntime.jsx("path",{d:"m15 18-6-6 6-6"})})}),jsxRuntime.jsxs("span",{className:"flex items-center gap-2",children:[jsxRuntime.jsx("input",{type:"number",min:1,max:s,value:a,onChange:e=>{let r=parseInt(e.target.value,10);r>=1&&r<=s&&(v(r),N(r,false));},className:"w-15 px-1 py-1 border border-gray-400! rounded text-center"}),"/ ",s]}),jsxRuntime.jsx(chunkBZYQS7OV_js.z,{variant:"outlined","aria-label":"next page",color:"secondary",size:"small",type:"button",disabled:a>=s,onClick:q,p:7,icon:jsxRuntime.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:jsxRuntime.jsx("path",{d:"m9 18 6-6-6-6"})})})]}),jsxRuntime.jsxs("div",{className:"flex items-center justify-center gap-3",children:[jsxRuntime.jsx(chunkBZYQS7OV_js.z,{variant:"outlined","aria-label":"zoom-out",color:"secondary",size:"small",icon:jsxRuntime.jsx(chunkBZYQS7OV_js.Pa,{style:{width:20,height:20}}),onClick:Z,disabled:i<=.25,p:7}),jsxRuntime.jsxs(chunkBZYQS7OV_js.ob,{py:5,px:8,children:[i*100,"%"]}),jsxRuntime.jsx(chunkBZYQS7OV_js.z,{variant:"outlined","aria-label":"zoom-in",size:"small",color:"secondary",icon:jsxRuntime.jsx(chunkBZYQS7OV_js.ma,{style:{width:14,height:14}}),onClick:W,disabled:i>=4,p:8})]})]}),jsxRuntime.jsx("div",{ref:l,className:"flex-1 overflow-hidden min-h-0",children:jsxRuntime.jsx(reactPdf.Document,{options:V,file:j,onLoadSuccess:G,onLoadError:Y,loading:jsxRuntime.jsx("div",{className:"flex items-center justify-center",style:{height:b},children:jsxRuntime.jsx("div",{className:"h-10 w-10 rounded-full border border-2 border-gray-200 animate-spin border-s-transparent"})}),children:jsxRuntime.jsx(reactVirtuoso.Virtuoso,{ref:R,style:{height:B||"calc(100dvh - 190px)",width:"100%"},totalCount:s,rangeChanged:K,defaultItemHeight:b,itemContent:e=>jsxRuntime.jsx("div",{className:"mx-auto w-fit mb-4",children:jsxRuntime.jsx(reactPdf.Page,{pageNumber:e+1,renderTextLayer:true,renderAnnotationLayer:true,width:h*i,onLoadSuccess:r=>{if(e===0){let Q=r.height/r.width;$(Q);}},loading:jsxRuntime.jsx("div",{className:"flex items-center justify-center",style:{height:b},children:jsxRuntime.jsx("div",{className:"h-10 w-10 rounded-full border border-2 border-gray-200 animate-spin border-s-transparent"})}),className:"h-auto w-full transition-[width] duration-[600ms] ease-in-out"})})})})})]})},"PdfDriver");
2
+ exports.PdfDriver=be;//# sourceMappingURL=PdfDriver-NPQFFUSQ.js.map
3
+ //# sourceMappingURL=PdfDriver-NPQFFUSQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/FileViewer/drivers/PdfDriver/PdfDriver.tsx"],"names":["BASE_DIR","pdfjs","SCROLL_ANIMATION_DURATION","INPUT_DEBOUNCE_DELAY","RESIZE_DEBOUNCE_DELAY","CONTAINER_PADDING","DEFAULT_RATIO_A4","DEFAULT_MIN_SIZE","PdfDriver","__name","url","numPages","setNumPages","useState","pageNumber","setPageNumber","loading","setLoading","error","setError","width","setWidth","height","setHeight","scale","setScale","defaultPageHeight","setDefaultPageHeight","pageAspectRatio","setPageAspectRatio","containerRef","useRef","virtuosoRef","isUserScrollingRef","scrollTimeoutRef","isMountedRef","scrollToPage","useCallback","page","smooth","debouncedScroll","useMemo","debounce","handleZoomIn","prev","handleZoomOut","useEffect","updateSize","observer","options","onDocumentLoadSuccess","onDocumentLoadError","changePage","offset","newPage","previousPage","nextPage","handleRangeChanged","range","visiblePage","jsx","jsxs","Button","MinusIcon","Box","PlusIcon","Document","Virtuoso","index","Page","ratio"],"mappings":"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","file":"PdfDriver-NPQFFUSQ.js","sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport debounce from 'lodash.debounce';\nimport { Document, Page, pdfjs } from 'react-pdf';\nimport 'react-pdf/dist/Page/AnnotationLayer.css';\nimport 'react-pdf/dist/Page/TextLayer.css';\nimport { Virtuoso, VirtuosoHandle } from 'react-virtuoso';\nimport { Box, Button, MinusIcon, PlusIcon } from '../../../Core';\n\nconst BASE_DIR = '/pdfjs';\n\n// Set up the worker - self-hosted configuration (client-side only)\nif (typeof window !== 'undefined' && typeof document !== 'undefined') {\n pdfjs.GlobalWorkerOptions.workerSrc = `${BASE_DIR}/pdf.worker.min.js`;\n}\n\ninterface PdfDriverProps {\n url: string;\n}\nconst SCROLL_ANIMATION_DURATION = 1000;\nconst INPUT_DEBOUNCE_DELAY = 400;\nconst RESIZE_DEBOUNCE_DELAY = 150;\nconst CONTAINER_PADDING = 70;\nconst DEFAULT_RATIO_A4 = 1.414;\nconst DEFAULT_MIN_SIZE = 400;\n\nexport const PdfDriver: React.FC<PdfDriverProps> = ({ url }) => {\n const [numPages, setNumPages] = useState<number>(0);\n const [pageNumber, setPageNumber] = useState<number>(1);\n const [loading, setLoading] = useState<boolean>(true);\n const [error, setError] = useState<string | null>(null);\n const [width, setWidth] = useState<number>(DEFAULT_MIN_SIZE);\n const [height, setHeight] = useState<number>(DEFAULT_MIN_SIZE);\n const [scale, setScale] = useState(1);\n const [defaultPageHeight, setDefaultPageHeight] = useState(DEFAULT_MIN_SIZE);\n const [pageAspectRatio, setPageAspectRatio] = useState(DEFAULT_RATIO_A4);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const virtuosoRef = useRef<VirtuosoHandle>(null);\n const isUserScrollingRef = useRef<boolean>(false);\n const scrollTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const isMountedRef = useRef(false);\n\n const scrollToPage = useCallback(\n (page: number, smooth = true) => {\n if (page < 1 || page > numPages) return;\n\n isUserScrollingRef.current = true;\n virtuosoRef.current?.scrollToIndex({\n index: page - 1,\n align: 'start',\n behavior: smooth ? 'smooth' : 'auto',\n });\n\n if (scrollTimeoutRef.current) {\n clearTimeout(scrollTimeoutRef.current);\n }\n\n scrollTimeoutRef.current = setTimeout(() => {\n if (isMountedRef.current) isUserScrollingRef.current = false;\n }, SCROLL_ANIMATION_DURATION);\n },\n [numPages]\n );\n\n const debouncedScroll = useMemo(() => {\n return debounce((page: number, smooth = false) => {\n scrollToPage(page, smooth);\n }, INPUT_DEBOUNCE_DELAY);\n }, [scrollToPage]);\n\n const handleZoomIn = useCallback(() => {\n setScale((prev) => Math.min(prev + 0.25, 4));\n }, []);\n\n const handleZoomOut = useCallback(() => {\n setScale((prev) => Math.max(prev - 0.25, 0.25));\n }, []);\n\n useEffect(() => {\n if (!containerRef.current) return;\n const updateSize = debounce(() => {\n if (containerRef.current) {\n setWidth(containerRef.current.offsetWidth - CONTAINER_PADDING);\n setHeight(containerRef.current.clientHeight);\n }\n }, RESIZE_DEBOUNCE_DELAY);\n updateSize();\n const observer = new ResizeObserver(updateSize);\n observer.observe(containerRef.current);\n return () => {\n observer.disconnect();\n updateSize.cancel();\n };\n }, []);\n\n const options = useMemo(\n () => ({\n cMapPacked: true,\n cMapUrl: `${BASE_DIR}/cmaps/`,\n standardFontDataUrl: `${BASE_DIR}/standard_fonts/`,\n wasmUrl: `${BASE_DIR}/wasm/`,\n iccUrl: `${BASE_DIR}/icc/`,\n }),\n []\n );\n\n const onDocumentLoadSuccess = useCallback(({ numPages }: { numPages: number }): void => {\n setNumPages(numPages);\n setLoading(false);\n }, []);\n\n const onDocumentLoadError = useCallback((error: Error): void => {\n setError(`Failed to load PDF: ${error.message}`);\n setLoading(false);\n }, []);\n\n const changePage = useCallback(\n (offset: number): void => {\n const newPage = pageNumber + offset;\n setPageNumber(newPage);\n scrollToPage(newPage);\n },\n [pageNumber, scrollToPage]\n );\n\n const previousPage = useCallback((): void => {\n changePage(-1);\n }, [changePage]);\n\n const nextPage = useCallback((): void => {\n changePage(1);\n }, [changePage]);\n\n const handleRangeChanged = useCallback(\n (range: { startIndex: number; endIndex: number }) => {\n if (isUserScrollingRef.current) {\n return;\n }\n const visiblePage = range.startIndex + 1;\n if (visiblePage !== pageNumber) {\n setPageNumber(visiblePage);\n }\n },\n [pageNumber]\n );\n\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n debouncedScroll.cancel();\n if (scrollTimeoutRef.current) {\n clearTimeout(scrollTimeoutRef.current);\n }\n };\n }, [debouncedScroll]);\n\n useEffect(() => {\n setDefaultPageHeight(width * scale * pageAspectRatio);\n }, [width, scale, pageAspectRatio]);\n\n if (error) {\n return (\n <div className=\"flex items-center justify-center h-full w-full\">\n <div className=\"text-red-500 text-center\">\n <p>{error}</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"h-full w-full flex flex-col overflow-hidden pb-5\">\n {loading && (\n <div className=\"flex items-center justify-center h-full\">\n <div className=\"text-gray-500\">Loading PDF...</div>\n </div>\n )}\n {numPages > 0 && (\n <div className=\"flex items-center justify-center md:justify-between flex-wrap gap-3 p-4\">\n <div className=\"flex items-center justify-center gap-3\">\n <Button\n variant=\"outlined\"\n aria-label=\"previous page\"\n color=\"secondary\"\n size=\"small\"\n type=\"button\"\n disabled={pageNumber <= 1}\n onClick={previousPage}\n p={5}\n icon={\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n }\n />\n\n <span className=\"flex items-center gap-2\">\n <input\n type=\"number\"\n min={1}\n max={numPages}\n value={pageNumber}\n onChange={(e) => {\n const page = parseInt(e.target.value, 10);\n if (page >= 1 && page <= numPages) {\n setPageNumber(page);\n debouncedScroll(page, false);\n }\n }}\n className=\"w-15 px-1 py-1 border border-gray-400! rounded text-center\"\n />\n / {numPages}\n </span>\n <Button\n variant=\"outlined\"\n aria-label=\"next page\"\n color=\"secondary\"\n size=\"small\"\n type=\"button\"\n disabled={pageNumber >= numPages}\n onClick={nextPage}\n p={7}\n icon={\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n }\n />\n </div>\n <div className=\"flex items-center justify-center gap-3\">\n <Button\n variant=\"outlined\"\n aria-label=\"zoom-out\"\n color=\"secondary\"\n size=\"small\"\n icon={<MinusIcon style={{ width: 20, height: 20 }} />}\n onClick={handleZoomOut}\n disabled={scale <= 0.25}\n p={7}\n />\n <Box py={5} px={8}>\n {scale * 100}%\n </Box>\n <Button\n variant=\"outlined\"\n aria-label=\"zoom-in\"\n size=\"small\"\n color=\"secondary\"\n icon={<PlusIcon style={{ width: 14, height: 14 }} />}\n onClick={handleZoomIn}\n disabled={scale >= 4}\n p={8}\n />\n </div>\n </div>\n )}\n <div ref={containerRef} className=\"flex-1 overflow-hidden min-h-0\">\n <Document\n options={options}\n file={url}\n onLoadSuccess={onDocumentLoadSuccess}\n onLoadError={onDocumentLoadError}\n loading={\n <div className=\"flex items-center justify-center\" style={{ height: defaultPageHeight }}>\n <div className=\"h-10 w-10 rounded-full border border-2 border-gray-200 animate-spin border-s-transparent\" />\n </div>\n }\n >\n <Virtuoso\n ref={virtuosoRef}\n style={{ height: height || 'calc(100dvh - 190px)', width: '100%' }}\n totalCount={numPages}\n rangeChanged={handleRangeChanged}\n defaultItemHeight={defaultPageHeight}\n itemContent={(index) => (\n <div className=\"mx-auto w-fit mb-4\">\n <Page\n pageNumber={index + 1}\n renderTextLayer={true}\n renderAnnotationLayer={true}\n width={width * scale}\n onLoadSuccess={(page) => {\n if (index === 0) {\n const ratio = page.height / page.width;\n setPageAspectRatio(ratio);\n }\n }}\n loading={\n <div className=\"flex items-center justify-center\" style={{ height: defaultPageHeight }}>\n <div className=\"h-10 w-10 rounded-full border border-2 border-gray-200 animate-spin border-s-transparent\" />\n </div>\n }\n className=\"h-auto w-full transition-[width] duration-[600ms] ease-in-out\"\n />\n </div>\n )}\n />\n </Document>\n </div>\n </div>\n );\n};\n"]}