@gouvfr-lasuite/ui-kit 0.24.0 → 0.25.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.
@@ -1 +1 @@
1
- {"version":3,"file":"PdfPreview-WRGeH0v3.cjs","sources":["../src/components/preview/viewers/pdf-preview/pdfPolyfills.ts","../src/components/preview/viewers/pdf-preview/usePdfNavigation.ts","../src/components/preview/viewers/pdf-preview/usePdfPageDimensions.ts","../src/components/preview/viewers/pdf-preview/PdfThumbnailSidebar.tsx","../src/components/preview/viewers/pdf-preview/PdfControls.tsx","../src/components/preview/viewers/pdf-preview/useDebouncedResize.ts","../src/components/preview/viewers/pdf-preview/PdfPageViewer.tsx","../src/components/preview/viewers/pdf-preview/useRedirectDisclaimer.tsx","../src/components/preview/viewers/pdf-preview/pdfOptions.ts","../src/components/preview/viewers/pdf-preview/PdfPreview.tsx"],"sourcesContent":["/**\n * Polyfills required by pdfjs-dist for older browsers (e.g. Edge)\n * that lack these newer APIs.\n *\n * They live in a dedicated file so they are imported as the very first\n * module in PdfPreview.tsx — before react-pdf or pdfjs-dist execute —\n * guaranteeing the APIs exist when PDF code initialises.\n * A separate file also makes it easy to remove once browser support\n * catches up.\n */\n\nif (\n typeof (URL as unknown as { parse?: unknown }).parse === \"undefined\"\n) {\n (URL as unknown as Record<string, unknown>).parse = function (\n url: string,\n base?: string,\n ) {\n try {\n return new URL(url, base);\n } catch {\n return null;\n }\n };\n}\n\nconst promiseCtor = Promise as unknown as Record<string, unknown>;\nif (typeof promiseCtor.withResolvers === \"undefined\") {\n promiseCtor.withResolvers = function <T>() {\n let resolve!: (value: T | PromiseLike<T>) => void;\n let reject!: (reason?: unknown) => void;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve, reject };\n };\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { PDFDocumentProxy } from \"pdfjs-dist\";\n\ninterface UsePdfNavigationParams {\n numPages: number;\n currentPage: number;\n scrollToPage: (page: number) => void;\n}\n\nexport const usePdfNavigation = ({\n numPages,\n currentPage,\n scrollToPage,\n}: UsePdfNavigationParams) => {\n const [pageInputValue, setPageInputValue] = useState<string>(\"1\");\n\n const goToPage = useCallback(\n (page: number) => {\n const clamped = Math.max(1, Math.min(numPages, page));\n setPageInputValue(String(clamped));\n scrollToPage(clamped);\n },\n [numPages, scrollToPage],\n );\n\n const onDocumentLoadSuccess = useCallback(\n ({ numPages: nextNumPages }: PDFDocumentProxy) => {\n setPageInputValue(\"1\");\n return nextNumPages;\n },\n [],\n );\n\n const handlePageInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setPageInputValue(e.target.value);\n };\n\n const handlePageInputSubmit = () => {\n const parsed = parseInt(pageInputValue, 10);\n if (isNaN(parsed)) {\n setPageInputValue(String(currentPage));\n return;\n }\n goToPage(parsed);\n };\n\n const handlePageInputKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n handlePageInputSubmit();\n }\n };\n\n // onItemClick handles internal PDF links (e.g. table of contents entries).\n // It is called by react-pdf's Document via a viewer ref that is created once\n // with useRef, so the callback is captured in a stale closure from the first\n // render. We use a ref to always access the latest goToPage (which depends\n // on numPages) so navigation targets the correct page.\n //\n // onClick (handlePdfClick) handles regular DOM clicks on the annotation layer\n // — it intercepts external links to show a redirect disclaimer modal.\n const goToPageRef = useRef(goToPage);\n useEffect(() => {\n goToPageRef.current = goToPage;\n }, [goToPage]);\n\n const onItemClick = useCallback((args: { pageNumber: number }) => {\n goToPageRef.current(args.pageNumber);\n }, []);\n\n return {\n goToPage,\n onDocumentLoadSuccess,\n pageInputValue,\n setPageInputValue,\n handlePageInputChange,\n handlePageInputSubmit,\n handlePageInputKeyDown,\n onItemClick,\n };\n};\n","import { useCallback, useRef, useState } from \"react\";\nimport type { PDFDocumentProxy } from \"pdfjs-dist\";\n\nexport interface PageDimension {\n w: number;\n h: number;\n}\n\n// Shared ratio fallback for rows whose dimensions have not yet been fetched.\n// Matches ISO 216 A4 portrait so first paint looks identical to the previous\n// hardcoded layout until real dimensions arrive.\nexport const FALLBACK_RATIO = 1.414;\n\nexport type PageDimensionsMap = ReadonlyMap<number, PageDimension>;\n\nexport interface UsePdfPageDimensionsResult {\n pageDimensions: PageDimensionsMap;\n requestPageDimension: (page: number) => void;\n // Ensures dimensions for the given pages are loaded. Resolves with the\n // up-to-date pageDimensions map once every requested page is cached —\n // callers use the resolved map directly to compute offsets without waiting\n // for React to commit the state update. Pages already cached or in flight\n // dedupe with existing work.\n ensurePageDimensions: (pages: number[]) => Promise<PageDimensionsMap>;\n setPdf: (pdf: PDFDocumentProxy | null) => void;\n}\n\n// Lazy per-page viewport cache. Consumers call requestPageDimension(page) when\n// a page scrolls into virtualization overscan; the returned pageDimensions map\n// is the read side of the cache. Once the page's dimensions are fetched, they\n// become available via pageDimensions, triggering a re-render of the PDF\n// previews with the correct dimension.\nexport function usePdfPageDimensions(): UsePdfPageDimensionsResult {\n const pdfRef = useRef<PDFDocumentProxy | null>(null);\n // Tracks fetches currently in progress so concurrent callers share one\n // getPage() round trip. Two distinct jobs:\n // - Dedup: onRowsRendered fires on every scroll tick, so the same page\n // can be requested many times before the first fetch resolves.\n // - Synchronisation: ensurePageDimensions([1..N]) (used by scrollToPage)\n // awaits Promise.all of fetchPageDimension(i). If another caller (e.g.\n // the overscan prefetch) has already started a fetch for page i, we\n // must return *that* Promise — otherwise `await` would resolve before\n // the stored fetch's .then() commits dimensions to pageDimensionsRef,\n // and scrollToPage would read stale dimensions when computing its\n // offset.\n const inFlightRef = useRef<Map<number, Promise<void>>>(new Map());\n // Mirror of pageDimensions state, read synchronously inside\n // requestPageDimension to dedupe fetches without stale-closure reads of\n // state.\n const pageDimensionsRef = useRef<Map<number, PageDimension>>(new Map());\n const [pageDimensions, setPageDimensions] = useState<\n Map<number, PageDimension>\n >(() => new Map());\n\n const setPdf = useCallback((pdf: PDFDocumentProxy | null) => {\n // Any cached dimensions belong to the previous document; reset on every\n // switch (including clear) so stale heights don't leak into the new doc.\n pdfRef.current = pdf;\n inFlightRef.current = new Map();\n pageDimensionsRef.current = new Map();\n setPageDimensions(new Map());\n }, []);\n\n const fetchPageDimension = useCallback((page: number): Promise<void> => {\n const pdf = pdfRef.current;\n if (!pdf) {\n return Promise.resolve();\n }\n if (pageDimensionsRef.current.has(page)) {\n return Promise.resolve();\n }\n const existing = inFlightRef.current.get(page);\n if (existing) {\n return existing;\n }\n\n const promise = pdf\n .getPage(page)\n .then((p) => {\n const vp = p.getViewport({ scale: 1 });\n const next = new Map(pageDimensionsRef.current);\n next.set(page, { w: vp.width, h: vp.height });\n pageDimensionsRef.current = next;\n setPageDimensions(next);\n })\n .catch((err) => {\n // Resolve (don't reject) on failure so ensurePageDimensions stays\n // usable: a page-input jump still scrolls, with FALLBACK_RATIO\n // standing in for the failed page via getRatio's map miss.\n console.warn(`Failed to fetch dimensions for PDF page ${page}`, err);\n })\n .finally(() => {\n inFlightRef.current.delete(page);\n });\n inFlightRef.current.set(page, promise);\n return promise;\n }, []);\n\n const requestPageDimension = useCallback(\n (page: number) => {\n void fetchPageDimension(page);\n },\n [fetchPageDimension],\n );\n\n const ensurePageDimensions = useCallback(\n async (pages: number[]): Promise<PageDimensionsMap> => {\n await Promise.all(pages.map((p) => fetchPageDimension(p)));\n return pageDimensionsRef.current;\n },\n [fetchPageDimension],\n );\n\n return {\n pageDimensions,\n requestPageDimension,\n ensurePageDimensions,\n setPdf,\n };\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Thumbnail } from \"react-pdf\";\nimport { AutoSizer, List } from \"react-virtualized\";\nimport type { ListRowRenderer } from \"react-virtualized\";\nimport {\n OPEN_DELAY,\n THUMBNAIL_GAP,\n THUMBNAIL_LABEL_SPACE,\n THUMBNAIL_WIDTH,\n TRANSITION_DELAY,\n} from \"./pdfConsts\";\nimport { FALLBACK_RATIO, type PageDimensionsMap } from \"./usePdfPageDimensions\";\n\ninterface PdfThumbnailSidebarProps {\n numPages: number;\n currentPage: number;\n goToPage: (page: number) => void;\n isOpen: boolean;\n pageDimensions: PageDimensionsMap;\n requestPageDimension: (page: number) => void;\n}\n\n// Two-phase mount/unmount to allow CSS transitions to play out:\n// Opening: mount immediately (unmount=false), then defer isOpenProxy=true\n// so the DOM is present before the \"open\" class triggers the transition.\n// Closing: remove the \"open\" class first (isOpenProxy=false), wait for the\n// transition to finish (TRANSITION_DELAY), then unmount the component.\n// When closed the component is not mounted, which is better for performance\n// as this component is quite heavy and is not needed when closed.\nexport function PdfThumbnailSidebar(props: PdfThumbnailSidebarProps) {\n const [unmount, setUnmount] = useState(true);\n const [isOpenProxy, setIsOpenProxy] = useState(props.isOpen);\n\n useEffect(() => {\n let timer: ReturnType<typeof setTimeout>;\n if (props.isOpen) {\n setUnmount(false);\n timer = setTimeout(() => setIsOpenProxy(true), OPEN_DELAY);\n } else {\n setIsOpenProxy(false);\n // The 1.1 is to allow for the transition to finish.\n // It is a safety margin to avoid the component being unmounted too early.\n timer = setTimeout(() => setUnmount(true), TRANSITION_DELAY * 1.1);\n }\n return () => clearTimeout(timer);\n }, [props.isOpen]);\n\n if (unmount) {\n return null;\n }\n\n return <PdfThumbnailSidebarContent {...props} isOpen={isOpenProxy} />;\n}\n\nexport function PdfThumbnailSidebarContent({\n numPages,\n currentPage,\n goToPage,\n isOpen,\n pageDimensions,\n requestPageDimension,\n}: PdfThumbnailSidebarProps) {\n const listRef = useRef<List>(null);\n // When true, the next currentPage change came from a thumbnail click\n // and should not trigger an auto-scroll of the sidebar.\n const isClickNavRef = useRef(false);\n // Scroll to the current page on first render, then clear so the prop\n // no longer forces scroll position on subsequent renders.\n const [initialScrollIndex, setInitialScrollIndex] = useState<\n number | undefined\n >(currentPage - 1);\n\n // Auto-scroll active thumbnail into view (only for scroll-initiated changes)\n useEffect(() => {\n if (!listRef.current) return;\n if (isClickNavRef.current) {\n isClickNavRef.current = false;\n return;\n }\n listRef.current.scrollToRow(currentPage - 1);\n }, [currentPage]);\n\n const getRatio = useCallback(\n (index: number) => {\n const d = pageDimensions.get(index + 1);\n return d ? d.h / d.w : FALLBACK_RATIO;\n },\n [pageDimensions],\n );\n\n const rowHeight = useCallback(\n ({ index }: { index: number }) => {\n const thumbH = THUMBNAIL_WIDTH * getRatio(index);\n const base = thumbH + THUMBNAIL_LABEL_SPACE + THUMBNAIL_GAP;\n // Every row reserves a gap above via paddingTop. The last row also\n // reserves one below so the final thumbnail has matching breathing\n // room at the bottom of the sidebar.\n return index === numPages - 1 ? base + THUMBNAIL_GAP : base;\n },\n [getRatio, numPages],\n );\n\n // Invalidate react-virtualized's row-height cache when dimensions update.\n useEffect(() => {\n listRef.current?.recomputeRowHeights();\n }, [pageDimensions, numPages]);\n\n const handleRowsRendered = useCallback(\n ({\n overscanStartIndex,\n overscanStopIndex,\n }: {\n overscanStartIndex: number;\n overscanStopIndex: number;\n }) => {\n for (let i = overscanStartIndex; i <= overscanStopIndex; i++) {\n requestPageDimension(i + 1);\n }\n if (initialScrollIndex !== undefined) setInitialScrollIndex(undefined);\n },\n [requestPageDimension, initialScrollIndex],\n );\n\n const rowRenderer: ListRowRenderer = ({ index, key, style }) => {\n const page = index + 1;\n const ratio = getRatio(index);\n const thumbnailSkeleton = (\n <div\n className=\"pdf-preview__thumbnail-skeleton\"\n style={{ width: THUMBNAIL_WIDTH, height: THUMBNAIL_WIDTH * ratio }}\n />\n );\n return (\n <div\n key={key}\n style={{\n ...style,\n paddingTop: THUMBNAIL_GAP,\n paddingBottom: index === numPages - 1 ? THUMBNAIL_GAP : 0,\n boxSizing: \"border-box\",\n }}\n >\n <button\n data-thumb-page={page}\n className={`pdf-preview__thumbnail${currentPage === page ? \" pdf-preview__thumbnail--active\" : \"\"}`}\n onClick={() => {\n isClickNavRef.current = true;\n goToPage(page);\n }}\n aria-label={`Go to page ${page}`}\n >\n <Thumbnail\n pageNumber={page}\n width={THUMBNAIL_WIDTH}\n loading={thumbnailSkeleton}\n />\n <span className=\"pdf-preview__thumbnail-number\">{page}</span>\n </button>\n </div>\n );\n };\n\n return (\n <div\n className={`pdf-preview__sidebar${!isOpen ? \" pdf-preview__sidebar--closed\" : \"\"}`}\n >\n <AutoSizer>\n {({ height, width }) => (\n <List\n ref={listRef}\n height={height}\n width={width}\n rowCount={numPages}\n rowHeight={rowHeight}\n estimatedRowSize={\n THUMBNAIL_WIDTH * FALLBACK_RATIO +\n THUMBNAIL_LABEL_SPACE +\n THUMBNAIL_GAP\n }\n overscanRowCount={5}\n rowRenderer={rowRenderer}\n scrollToIndex={initialScrollIndex}\n scrollToAlignment=\"center\"\n onRowsRendered={handleRowsRendered}\n style={{ outline: \"none\" }}\n />\n )}\n </AutoSizer>\n </div>\n );\n}\n","import { Button, Input } from \"@gouvfr-lasuite/cunningham-react\";\nimport { LeftSidebarIcon } from \"../../icons/LeftSidebarIcon\";\nimport { ZoomControls } from \"../../components/ZoomControls/ZoomControls\";\n\ninterface PdfControlsProps {\n numPages: number;\n pageInputValue: string;\n onToggleSidebar: () => void;\n onPageInputChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n onPageInputSubmit: () => void;\n onPageInputKeyDown: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n onZoomIn: () => void;\n onZoomReset: () => void;\n onZoomOut: () => void;\n}\n\nexport function PdfControls({\n numPages,\n pageInputValue,\n onToggleSidebar,\n onPageInputChange,\n onPageInputSubmit,\n onPageInputKeyDown,\n onZoomIn,\n onZoomReset,\n onZoomOut,\n}: PdfControlsProps) {\n return (\n <div className=\"file-preview__controls\">\n <Button\n variant=\"tertiary\"\n color=\"neutral\"\n onClick={onToggleSidebar}\n aria-label=\"Toggle sidebar\"\n size=\"small\"\n icon={<LeftSidebarIcon />}\n />\n <div className=\"file-preview__controls__separator\" />\n <div className=\"pdf-preview__page-nav\">\n <div className=\"pdf-preview__page-indicator\">\n <Input\n variant=\"classic\"\n value={pageInputValue}\n onChange={onPageInputChange}\n onBlur={onPageInputSubmit}\n onKeyDown={onPageInputKeyDown}\n aria-label=\"Current page\"\n size={pageInputValue.length || 1}\n />\n <span className=\"pdf-preview__page-total\">/ {numPages}</span>\n </div>\n </div>\n <div className=\"file-preview__controls__separator\" />\n <ZoomControls\n zoomOut={onZoomOut}\n zoomIn={onZoomIn}\n resetView={onZoomReset}\n />\n </div>\n );\n}\n","import { useEffect, useState } from \"react\";\n\nfunction debounce<T extends (...args: never[]) => unknown>(\n func: T,\n timeout = 300,\n): ((...args: Parameters<T>) => void) & { cancel: () => void } {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const debouncedFunc = (...args: Parameters<T>) => {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n timer = setTimeout(() => {\n func(...args);\n }, timeout);\n };\n debouncedFunc.cancel = () => {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n };\n return debouncedFunc;\n}\n\nexport const useDebouncedResize = () => {\n const [size, setSize] = useState({\n width: window.innerWidth,\n height: window.innerHeight,\n });\n\n useEffect(() => {\n const handleResize = debounce(() => {\n setSize({ width: window.innerWidth, height: window.innerHeight });\n }, 100);\n window.addEventListener(\"resize\", handleResize);\n return () => {\n handleResize.cancel();\n window.removeEventListener(\"resize\", handleResize);\n };\n }, []);\n\n return size;\n};\n","import {\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { Page } from \"react-pdf\";\nimport { AutoSizer, List } from \"react-virtualized\";\nimport type { ListRowRenderer, Index } from \"react-virtualized\";\nimport { useDebouncedResize } from \"./useDebouncedResize\";\nimport { FALLBACK_RATIO, type PageDimensionsMap } from \"./usePdfPageDimensions\";\n\nconst PAGE_GAP = 16;\nconst BASE_WIDTH = 800;\nconst PAGE_MARGIN = 32;\n\nexport interface PdfPageViewerHandle {\n scrollToPage: (page: number) => void;\n}\n\ninterface PdfPageViewerProps {\n numPages: number;\n zoom: number;\n onCurrentPageChange: (page: number) => void;\n onClick: (e: React.MouseEvent<HTMLDivElement>) => void;\n pageDimensions: PageDimensionsMap;\n requestPageDimension: (page: number) => void;\n ensurePageDimensions: (pages: number[]) => Promise<PageDimensionsMap>;\n}\n\nexport function PdfPageViewer({\n numPages,\n zoom,\n onCurrentPageChange,\n onClick,\n pageDimensions,\n requestPageDimension,\n ensurePageDimensions,\n ref,\n}: PdfPageViewerProps & { ref?: React.Ref<PdfPageViewerHandle> }) {\n const listRef = useRef<List>(null);\n const prevZoomRef = useRef(zoom);\n const [scrollTop, setScrollTop] = useState(0);\n const listHeightRef = useRef(0);\n // Each scrollToPage call bumps this counter and captures its own id.\n // When a later call supersedes an earlier one, the earlier one checks\n // the counter in its async tail and bails — otherwise dimensions arriving\n // late for a stale target can clobber the user's newest jump.\n const scrollJumpIdRef = useRef(0);\n\n const size = useDebouncedResize();\n\n const width = useMemo(() => {\n return BASE_WIDTH + PAGE_MARGIN > size.width\n ? size.width - PAGE_MARGIN\n : BASE_WIDTH;\n }, [size.width]);\n\n // Per-page aspect ratio (height / width) from pdfjs.\n const getRatio = useCallback(\n (index: number) => {\n const d = pageDimensions.get(index + 1);\n return d ? d.h / d.w : FALLBACK_RATIO;\n },\n [pageDimensions],\n );\n\n const rowHeightForIndex = useCallback(\n (index: number) => {\n const h = width * getRatio(index) * zoom;\n const gap = PAGE_GAP * zoom;\n // Every row reserves a gap above the page via paddingTop. The last\n // row additionally reserves a gap below it so the final page has\n // breathing room matching the space above every other page.\n return index === numPages - 1 ? h + 2 * gap : h + gap;\n },\n [width, getRatio, zoom, numPages],\n );\n\n // Wrapper around rowHeightForIndex with appropriate signature for react-virtualized.\n const rowHeight = useCallback(\n ({ index }: Index) => rowHeightForIndex(index),\n [rowHeightForIndex],\n );\n\n // When zoom, width, pageDimensions or numPages change, row heights must be\n // recalculated because react-virtualized caches them internally.\n // On zoom change we also scale scrollTop proportionally so the user stays\n // on the same part of the document (e.g. 2x zoom → 2x scroll offset).\n useEffect(() => {\n listRef.current?.recomputeRowHeights();\n\n if (prevZoomRef.current !== zoom && listRef.current) {\n const ratio = zoom / prevZoomRef.current;\n const newScrollTop = Math.round(scrollTop * ratio);\n\n listRef.current.scrollToPosition(newScrollTop);\n prevZoomRef.current = zoom;\n }\n }, [zoom, width, pageDimensions, numPages]);\n\n // Find which page contains the vertical center of the viewport by walking\n // cumulative row heights until we pass the midpoint.\n const currentPage = useMemo(() => {\n if (numPages === 0) return 1;\n\n const viewportCenter = scrollTop + listHeightRef.current / 2;\n\n let offset = 0;\n for (let i = 0; i < numPages; i++) {\n const h = rowHeightForIndex(i);\n if (offset + h > viewportCenter) {\n return i + 1;\n }\n offset += h;\n }\n\n return numPages;\n }, [scrollTop, numPages, rowHeightForIndex]);\n\n useEffect(() => {\n onCurrentPageChange(currentPage);\n }, [currentPage]);\n\n const scrollToPage = useCallback(\n (page: number) => {\n // Jump targets can land on a page whose predecessors haven't had their\n // dimensions fetched yet (the user never scrolled through them). Await\n // dimensions for the whole prefix before computing the offset so the\n // scroll lands on the real page, not an A4-fallback approximation. We\n // use the up-to-date map returned by ensurePageDimensions rather than\n // rowHeightForIndex because React may not have committed the state\n // update yet when the promise resolves.\n //\n // Jumps issued in quick succession (e.g. a user mashing the page input)\n // race: an earlier call's prefix may take longer than a later call's,\n // so a stale .then() could clobber the newest target. We tag each call\n // with an id and bail if a newer one has been issued.\n scrollJumpIdRef.current += 1;\n const jumpId = scrollJumpIdRef.current;\n\n const pages: number[] = [];\n for (let i = 1; i <= page; i++) pages.push(i);\n ensurePageDimensions(pages).then((dimensions) => {\n if (scrollJumpIdRef.current !== jumpId) return;\n if (!listRef.current) return;\n let offset = 0;\n for (let i = 0; i < page - 1; i++) {\n const d = dimensions.get(i + 1);\n const ratio = d ? d.h / d.w : FALLBACK_RATIO;\n offset += width * ratio * zoom + PAGE_GAP * zoom;\n }\n listRef.current.scrollToPosition(offset);\n });\n },\n [ensurePageDimensions, width, zoom],\n );\n\n useImperativeHandle(ref, () => ({ scrollToPage }), [scrollToPage]);\n\n const handleScroll = useCallback(\n ({\n scrollTop: st,\n clientHeight,\n }: {\n scrollTop: number;\n clientHeight: number;\n }) => {\n listHeightRef.current = clientHeight;\n setScrollTop(st);\n },\n [],\n );\n\n const handleRowsRendered = useCallback(\n ({\n overscanStartIndex,\n overscanStopIndex,\n }: {\n overscanStartIndex: number;\n overscanStopIndex: number;\n }) => {\n for (let i = overscanStartIndex; i <= overscanStopIndex; i++) {\n requestPageDimension(i + 1);\n }\n },\n [requestPageDimension],\n );\n\n const rowRenderer: ListRowRenderer = ({ index, key, style }) => {\n const ratio = getRatio(index);\n const pageSkeleton = (\n <div\n className=\"pdf-preview__page-skeleton pdf-preview__page-skeleton--measured\"\n style={{ height: width * ratio * zoom, width: width * zoom }}\n />\n );\n return (\n <div\n key={key}\n data-preview-backdrop=\"true\"\n className=\"pdf-preview__page-container\"\n style={{\n ...style,\n paddingTop: PAGE_GAP * zoom,\n paddingBottom: index === numPages - 1 ? PAGE_GAP * zoom : 0,\n }}\n >\n <Page\n pageNumber={index + 1}\n width={width}\n scale={zoom}\n loading={pageSkeleton}\n />\n </div>\n );\n };\n\n return (\n <div className=\"pdf-preview__container\" onClick={onClick}>\n <AutoSizer>\n {({ height, width: autoWidth }) => {\n // When zoomed in the page content may exceed the viewport width.\n // The wrapper div is clamped to the viewport (autoWidth) and scrolls\n // horizontally, while the List itself is sized to the full content\n // width so pages render uncropped.\n const listWidth = Math.max(autoWidth, width * zoom);\n return (\n <div\n style={{\n width: autoWidth,\n height,\n }}\n className=\"pdf-preview__horizontal-scroll\"\n >\n <List\n ref={listRef}\n height={height}\n width={listWidth}\n rowCount={numPages}\n rowHeight={rowHeight}\n estimatedRowSize={\n width * FALLBACK_RATIO * zoom + PAGE_GAP * zoom\n }\n overscanRowCount={3}\n onScroll={handleScroll}\n onRowsRendered={handleRowsRendered}\n rowRenderer={rowRenderer}\n style={{ outline: \"none\" }}\n />\n </div>\n );\n }}\n </AutoSizer>\n </div>\n );\n}\n","import { useCallback } from \"react\";\nimport { useModals } from \"@gouvfr-lasuite/cunningham-react\";\nimport { useCustomTranslations } from \":/hooks/useCustomTranslations\";\n\nconst SAFE_PROTOCOLS = [\"https:\", \"http:\"];\n\nexport const useRedirectDisclaimer = () => {\n const modals = useModals();\n const { t } = useCustomTranslations();\n const handlePdfClick = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n const target = e.target as HTMLElement;\n const anchor = target.closest(\"a\");\n if (anchor && anchor.href) {\n if (anchor.closest(\"[data-internal-link]\")) return;\n\n e.preventDefault();\n e.stopPropagation();\n\n try {\n const url = new URL(anchor.href);\n if (!SAFE_PROTOCOLS.includes(url.protocol)) return;\n } catch {\n return;\n }\n\n modals.confirmationModal({\n title: t(\"components.filePreview.externalLink.title\"),\n children: (\n <div>\n <p>{t(\"components.filePreview.externalLink.description\")}</p>\n <span className=\"pdf-preview__external-link\">{anchor.href}</span>\n <p>{t(\"components.filePreview.externalLink.confirmQuestion\")}</p>\n </div>\n ),\n onDecide: (decision) => {\n if (decision === \"yes\") {\n window.open(anchor.href, \"_blank\", \"noopener,noreferrer\");\n }\n },\n });\n }\n },\n [modals, t],\n );\n return { handlePdfClick };\n};\n","export const pdfOptions = {\n cMapUrl: \"/cmaps/\",\n standardFontDataUrl: \"/standard_fonts/\",\n wasmUrl: \"/wasm/\",\n isEvalSupported: false,\n};\n","import \"./pdfPolyfills\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { Document, pdfjs } from \"react-pdf\";\nimport type { PDFDocumentProxy } from \"pdfjs-dist\";\n\nimport { Icon, IconType } from \":/components/icon\";\nimport { useCustomTranslations } from \":/hooks/useCustomTranslations\";\n\nimport { usePdfNavigation } from \"./usePdfNavigation\";\nimport { PdfThumbnailSidebar } from \"./PdfThumbnailSidebar\";\nimport { PdfControls } from \"./PdfControls\";\nimport { PdfPageViewer } from \"./PdfPageViewer\";\nimport type { PdfPageViewerHandle } from \"./PdfPageViewer\";\nimport { useRedirectDisclaimer } from \"./useRedirectDisclaimer\";\nimport { OutdatedBrowserPreview } from \"./OutdatedBrowserPreview\";\nimport { pdfOptions } from \"./pdfOptions\";\nimport { usePdfPageDimensions } from \"./usePdfPageDimensions\";\nimport { DEFAULT_PDF_WORKER_SRC } from \"./pdfConsts\";\n\ninterface PdfPreviewProps {\n src: string;\n onThumbailSidebarOpen?: (isOpen: boolean) => void;\n pdfWorkerSrc?: string;\n}\n\nexport function PdfPreview({\n src,\n onThumbailSidebarOpen,\n pdfWorkerSrc = DEFAULT_PDF_WORKER_SRC,\n}: PdfPreviewProps) {\n // Set the worker source once per render — pdfjs reads this when loading\n // the next document. Last-write-wins if multiple consumers configure it.\n pdfjs.GlobalWorkerOptions.workerSrc = pdfWorkerSrc;\n\n const { t } = useCustomTranslations();\n const [numPages, setNumPages] = useState<number>(1);\n const [documentError, setDocumentError] = useState<\n \"generic\" | \"outdated\" | null\n >(null);\n const [currentPage, setCurrentPage] = useState(1);\n const [isSidebarOpen, setIsSidebarOpen] = useState(false);\n const viewerRef = useRef<PdfPageViewerHandle>(null);\n const { handlePdfClick } = useRedirectDisclaimer();\n\n const [zoom, setZoom] = useState(1);\n const { pageDimensions, requestPageDimension, ensurePageDimensions, setPdf } =\n usePdfPageDimensions();\n\n const zoomIn = useCallback(() => {\n setZoom((prev) => Math.min(3, prev + 0.25));\n }, []);\n const zoomOut = useCallback(() => {\n setZoom((prev) => Math.max(0.5, prev - 0.25));\n }, []);\n const zoomReset = useCallback(() => {\n setZoom(1);\n }, []);\n const toggleSidebar = useCallback(() => {\n setIsSidebarOpen((prev) => {\n onThumbailSidebarOpen?.(!prev);\n return !prev;\n });\n }, []);\n\n const scrollToPage = useCallback((page: number) => {\n viewerRef.current?.scrollToPage(page);\n }, []);\n\n const {\n goToPage,\n onDocumentLoadSuccess: onNavLoadSuccess,\n pageInputValue,\n setPageInputValue,\n handlePageInputChange,\n handlePageInputSubmit,\n handlePageInputKeyDown,\n onItemClick,\n } = usePdfNavigation({ numPages, currentPage, scrollToPage });\n\n useEffect(() => {\n setPageInputValue(String(currentPage));\n }, [currentPage, setPageInputValue]);\n\n const { data: file, error } = useQuery<File, Error>({\n queryKey: [\"pdf\", src],\n queryFn: async ({ signal }) => {\n const response = await fetch(src, {\n credentials: \"include\",\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch PDF: ${response.status}`);\n }\n\n const blob = await response.blob();\n const filename = src.split(\"/\").pop() || \"document.pdf\";\n return new File([blob], filename, { type: \"application/pdf\" });\n },\n staleTime: Infinity,\n });\n\n const onDocumentLoadSuccess = useCallback(\n (pdf: PDFDocumentProxy) => {\n const nextNumPages = onNavLoadSuccess(pdf);\n setNumPages(nextNumPages);\n setPdf(pdf);\n },\n [onNavLoadSuccess, setPdf],\n );\n\n const handleDocumentError = useCallback((error: Error) => {\n const pdfErrors = [\n \"InvalidPDFException\",\n \"FormatError\",\n \"PasswordException\",\n \"ResponseException\",\n ];\n console.log(error);\n setDocumentError(pdfErrors.includes(error.name) ? \"generic\" : \"outdated\");\n }, []);\n\n console.log(error);\n\n if (error?.message || documentError === \"generic\") {\n return (\n <div className=\"file-preview-unsupported\" data-preview-backdrop=\"true\">\n <div className=\"file-preview-unsupported__icon\">\n <Icon name=\"error\" type={IconType.OUTLINED} size={48} />\n </div>\n <p className=\"file-preview-unsupported__title\">\n {t(\"components.filePreview.error.title\")}\n </p>\n <p className=\"file-preview-unsupported__description\">\n {t(\"components.filePreview.error.description\")}\n </p>\n </div>\n );\n }\n\n if (documentError === \"outdated\") {\n return <OutdatedBrowserPreview />;\n }\n\n const loadingSkeleton = (\n <div className=\"pdf-preview__container-skeleton\">\n <div className=\"pdf-preview__page-skeleton\" />\n </div>\n );\n\n return (\n <div className=\"pdf-preview\">\n <div className=\"pdf-preview__body\" data-preview-backdrop=\"true\">\n {file ? (\n <Document\n file={file}\n onLoadSuccess={onDocumentLoadSuccess}\n onItemClick={onItemClick}\n options={pdfOptions}\n loading={loadingSkeleton}\n onLoadError={handleDocumentError}\n >\n <PdfThumbnailSidebar\n numPages={numPages}\n currentPage={currentPage}\n goToPage={goToPage}\n isOpen={isSidebarOpen}\n pageDimensions={pageDimensions}\n requestPageDimension={requestPageDimension}\n />\n <PdfPageViewer\n ref={viewerRef}\n numPages={numPages}\n zoom={zoom}\n onCurrentPageChange={setCurrentPage}\n onClick={handlePdfClick}\n pageDimensions={pageDimensions}\n requestPageDimension={requestPageDimension}\n ensurePageDimensions={ensurePageDimensions}\n />\n </Document>\n ) : (\n loadingSkeleton\n )}\n </div>\n <PdfControls\n numPages={numPages}\n pageInputValue={pageInputValue}\n onToggleSidebar={toggleSidebar}\n onPageInputChange={handlePageInputChange}\n onPageInputSubmit={handlePageInputSubmit}\n onPageInputKeyDown={handlePageInputKeyDown}\n onZoomIn={zoomIn}\n onZoomReset={zoomReset}\n onZoomOut={zoomOut}\n />\n </div>\n );\n}\n\nexport default PdfPreview;\n"],"names":["url","base","promiseCtor","resolve","reject","res","rej","usePdfNavigation","numPages","currentPage","scrollToPage","pageInputValue","setPageInputValue","useState","goToPage","useCallback","page","clamped","onDocumentLoadSuccess","nextNumPages","handlePageInputChange","e","handlePageInputSubmit","parsed","handlePageInputKeyDown","goToPageRef","useRef","useEffect","onItemClick","args","FALLBACK_RATIO","usePdfPageDimensions","pdfRef","inFlightRef","pageDimensionsRef","pageDimensions","setPageDimensions","setPdf","pdf","fetchPageDimension","existing","promise","p","vp","next","err","requestPageDimension","ensurePageDimensions","pages","PdfThumbnailSidebar","props","unmount","setUnmount","isOpenProxy","setIsOpenProxy","timer","OPEN_DELAY","TRANSITION_DELAY","jsx","PdfThumbnailSidebarContent","isOpen","listRef","isClickNavRef","initialScrollIndex","setInitialScrollIndex","getRatio","index","d","rowHeight","THUMBNAIL_WIDTH","THUMBNAIL_LABEL_SPACE","THUMBNAIL_GAP","_a","handleRowsRendered","overscanStartIndex","overscanStopIndex","i","rowRenderer","key","style","ratio","thumbnailSkeleton","jsxs","Thumbnail","AutoSizer","height","width","List","PdfControls","onToggleSidebar","onPageInputChange","onPageInputSubmit","onPageInputKeyDown","onZoomIn","onZoomReset","onZoomOut","Button","LeftSidebarIcon","Input","ZoomControls","debounce","func","timeout","debouncedFunc","useDebouncedResize","size","setSize","handleResize","PAGE_GAP","BASE_WIDTH","PAGE_MARGIN","PdfPageViewer","zoom","onCurrentPageChange","onClick","ref","prevZoomRef","scrollTop","setScrollTop","listHeightRef","scrollJumpIdRef","useMemo","rowHeightForIndex","h","gap","newScrollTop","viewportCenter","offset","jumpId","dimensions","useImperativeHandle","handleScroll","st","clientHeight","pageSkeleton","Page","autoWidth","listWidth","SAFE_PROTOCOLS","useRedirectDisclaimer","modals","useModals","useCustomTranslations","anchor","decision","pdfOptions","PdfPreview","src","onThumbailSidebarOpen","pdfWorkerSrc","DEFAULT_PDF_WORKER_SRC","pdfjs","t","setNumPages","documentError","setDocumentError","setCurrentPage","isSidebarOpen","setIsSidebarOpen","viewerRef","handlePdfClick","setZoom","zoomIn","prev","zoomOut","zoomReset","toggleSidebar","onNavLoadSuccess","file","error","useQuery","signal","response","blob","filename","handleDocumentError","pdfErrors","Icon","IconType","OutdatedBrowserPreview","loadingSkeleton","Document"],"mappings":"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"}
1
+ {"version":3,"file":"PdfPreview-CiefW-8Q.cjs","sources":["../src/components/preview/viewers/pdf-preview/pdfPolyfills.ts","../src/components/preview/viewers/pdf-preview/usePdfNavigation.ts","../src/components/preview/viewers/pdf-preview/usePdfPageDimensions.ts","../src/components/preview/viewers/pdf-preview/PdfThumbnailSidebar.tsx","../src/components/preview/viewers/pdf-preview/PdfControls.tsx","../src/components/preview/viewers/pdf-preview/useDebouncedResize.ts","../src/components/preview/viewers/pdf-preview/PdfPageViewer.tsx","../src/components/preview/viewers/pdf-preview/useRedirectDisclaimer.tsx","../src/components/preview/viewers/pdf-preview/pdfOptions.ts","../src/components/preview/viewers/pdf-preview/PdfPreview.tsx"],"sourcesContent":["/**\n * Polyfills required by pdfjs-dist for older browsers (e.g. Edge)\n * that lack these newer APIs.\n *\n * They live in a dedicated file so they are imported as the very first\n * module in PdfPreview.tsx — before react-pdf or pdfjs-dist execute —\n * guaranteeing the APIs exist when PDF code initialises.\n * A separate file also makes it easy to remove once browser support\n * catches up.\n */\n\nif (\n typeof (URL as unknown as { parse?: unknown }).parse === \"undefined\"\n) {\n (URL as unknown as Record<string, unknown>).parse = function (\n url: string,\n base?: string,\n ) {\n try {\n return new URL(url, base);\n } catch {\n return null;\n }\n };\n}\n\nconst promiseCtor = Promise as unknown as Record<string, unknown>;\nif (typeof promiseCtor.withResolvers === \"undefined\") {\n promiseCtor.withResolvers = function <T>() {\n let resolve!: (value: T | PromiseLike<T>) => void;\n let reject!: (reason?: unknown) => void;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve, reject };\n };\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { PDFDocumentProxy } from \"pdfjs-dist\";\n\ninterface UsePdfNavigationParams {\n numPages: number;\n currentPage: number;\n scrollToPage: (page: number) => void;\n}\n\nexport const usePdfNavigation = ({\n numPages,\n currentPage,\n scrollToPage,\n}: UsePdfNavigationParams) => {\n const [pageInputValue, setPageInputValue] = useState<string>(\"1\");\n\n const goToPage = useCallback(\n (page: number) => {\n const clamped = Math.max(1, Math.min(numPages, page));\n setPageInputValue(String(clamped));\n scrollToPage(clamped);\n },\n [numPages, scrollToPage],\n );\n\n const onDocumentLoadSuccess = useCallback(\n ({ numPages: nextNumPages }: PDFDocumentProxy) => {\n setPageInputValue(\"1\");\n return nextNumPages;\n },\n [],\n );\n\n const handlePageInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setPageInputValue(e.target.value);\n };\n\n const handlePageInputSubmit = () => {\n const parsed = parseInt(pageInputValue, 10);\n if (isNaN(parsed)) {\n setPageInputValue(String(currentPage));\n return;\n }\n goToPage(parsed);\n };\n\n const handlePageInputKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n handlePageInputSubmit();\n }\n };\n\n // onItemClick handles internal PDF links (e.g. table of contents entries).\n // It is called by react-pdf's Document via a viewer ref that is created once\n // with useRef, so the callback is captured in a stale closure from the first\n // render. We use a ref to always access the latest goToPage (which depends\n // on numPages) so navigation targets the correct page.\n //\n // onClick (handlePdfClick) handles regular DOM clicks on the annotation layer\n // — it intercepts external links to show a redirect disclaimer modal.\n const goToPageRef = useRef(goToPage);\n useEffect(() => {\n goToPageRef.current = goToPage;\n }, [goToPage]);\n\n const onItemClick = useCallback((args: { pageNumber: number }) => {\n goToPageRef.current(args.pageNumber);\n }, []);\n\n return {\n goToPage,\n onDocumentLoadSuccess,\n pageInputValue,\n setPageInputValue,\n handlePageInputChange,\n handlePageInputSubmit,\n handlePageInputKeyDown,\n onItemClick,\n };\n};\n","import { useCallback, useRef, useState } from \"react\";\nimport type { PDFDocumentProxy } from \"pdfjs-dist\";\n\nexport interface PageDimension {\n w: number;\n h: number;\n}\n\n// Shared ratio fallback for rows whose dimensions have not yet been fetched.\n// Matches ISO 216 A4 portrait so first paint looks identical to the previous\n// hardcoded layout until real dimensions arrive.\nexport const FALLBACK_RATIO = 1.414;\n\nexport type PageDimensionsMap = ReadonlyMap<number, PageDimension>;\n\nexport interface UsePdfPageDimensionsResult {\n pageDimensions: PageDimensionsMap;\n requestPageDimension: (page: number) => void;\n // Ensures dimensions for the given pages are loaded. Resolves with the\n // up-to-date pageDimensions map once every requested page is cached —\n // callers use the resolved map directly to compute offsets without waiting\n // for React to commit the state update. Pages already cached or in flight\n // dedupe with existing work.\n ensurePageDimensions: (pages: number[]) => Promise<PageDimensionsMap>;\n setPdf: (pdf: PDFDocumentProxy | null) => void;\n}\n\n// Lazy per-page viewport cache. Consumers call requestPageDimension(page) when\n// a page scrolls into virtualization overscan; the returned pageDimensions map\n// is the read side of the cache. Once the page's dimensions are fetched, they\n// become available via pageDimensions, triggering a re-render of the PDF\n// previews with the correct dimension.\nexport function usePdfPageDimensions(): UsePdfPageDimensionsResult {\n const pdfRef = useRef<PDFDocumentProxy | null>(null);\n // Tracks fetches currently in progress so concurrent callers share one\n // getPage() round trip. Two distinct jobs:\n // - Dedup: onRowsRendered fires on every scroll tick, so the same page\n // can be requested many times before the first fetch resolves.\n // - Synchronisation: ensurePageDimensions([1..N]) (used by scrollToPage)\n // awaits Promise.all of fetchPageDimension(i). If another caller (e.g.\n // the overscan prefetch) has already started a fetch for page i, we\n // must return *that* Promise — otherwise `await` would resolve before\n // the stored fetch's .then() commits dimensions to pageDimensionsRef,\n // and scrollToPage would read stale dimensions when computing its\n // offset.\n const inFlightRef = useRef<Map<number, Promise<void>>>(new Map());\n // Mirror of pageDimensions state, read synchronously inside\n // requestPageDimension to dedupe fetches without stale-closure reads of\n // state.\n const pageDimensionsRef = useRef<Map<number, PageDimension>>(new Map());\n const [pageDimensions, setPageDimensions] = useState<\n Map<number, PageDimension>\n >(() => new Map());\n\n const setPdf = useCallback((pdf: PDFDocumentProxy | null) => {\n // Any cached dimensions belong to the previous document; reset on every\n // switch (including clear) so stale heights don't leak into the new doc.\n pdfRef.current = pdf;\n inFlightRef.current = new Map();\n pageDimensionsRef.current = new Map();\n setPageDimensions(new Map());\n }, []);\n\n const fetchPageDimension = useCallback((page: number): Promise<void> => {\n const pdf = pdfRef.current;\n if (!pdf) {\n return Promise.resolve();\n }\n if (pageDimensionsRef.current.has(page)) {\n return Promise.resolve();\n }\n const existing = inFlightRef.current.get(page);\n if (existing) {\n return existing;\n }\n\n const promise = pdf\n .getPage(page)\n .then((p) => {\n const vp = p.getViewport({ scale: 1 });\n const next = new Map(pageDimensionsRef.current);\n next.set(page, { w: vp.width, h: vp.height });\n pageDimensionsRef.current = next;\n setPageDimensions(next);\n })\n .catch((err) => {\n // Resolve (don't reject) on failure so ensurePageDimensions stays\n // usable: a page-input jump still scrolls, with FALLBACK_RATIO\n // standing in for the failed page via getRatio's map miss.\n console.warn(`Failed to fetch dimensions for PDF page ${page}`, err);\n })\n .finally(() => {\n inFlightRef.current.delete(page);\n });\n inFlightRef.current.set(page, promise);\n return promise;\n }, []);\n\n const requestPageDimension = useCallback(\n (page: number) => {\n void fetchPageDimension(page);\n },\n [fetchPageDimension],\n );\n\n const ensurePageDimensions = useCallback(\n async (pages: number[]): Promise<PageDimensionsMap> => {\n await Promise.all(pages.map((p) => fetchPageDimension(p)));\n return pageDimensionsRef.current;\n },\n [fetchPageDimension],\n );\n\n return {\n pageDimensions,\n requestPageDimension,\n ensurePageDimensions,\n setPdf,\n };\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Thumbnail } from \"react-pdf\";\nimport { AutoSizer, List } from \"react-virtualized\";\nimport type { ListRowRenderer } from \"react-virtualized\";\nimport {\n OPEN_DELAY,\n THUMBNAIL_GAP,\n THUMBNAIL_LABEL_SPACE,\n THUMBNAIL_WIDTH,\n TRANSITION_DELAY,\n} from \"./pdfConsts\";\nimport { FALLBACK_RATIO, type PageDimensionsMap } from \"./usePdfPageDimensions\";\n\ninterface PdfThumbnailSidebarProps {\n numPages: number;\n currentPage: number;\n goToPage: (page: number) => void;\n isOpen: boolean;\n pageDimensions: PageDimensionsMap;\n requestPageDimension: (page: number) => void;\n}\n\n// Two-phase mount/unmount to allow CSS transitions to play out:\n// Opening: mount immediately (unmount=false), then defer isOpenProxy=true\n// so the DOM is present before the \"open\" class triggers the transition.\n// Closing: remove the \"open\" class first (isOpenProxy=false), wait for the\n// transition to finish (TRANSITION_DELAY), then unmount the component.\n// When closed the component is not mounted, which is better for performance\n// as this component is quite heavy and is not needed when closed.\nexport function PdfThumbnailSidebar(props: PdfThumbnailSidebarProps) {\n const [unmount, setUnmount] = useState(true);\n const [isOpenProxy, setIsOpenProxy] = useState(props.isOpen);\n\n useEffect(() => {\n let timer: ReturnType<typeof setTimeout>;\n if (props.isOpen) {\n setUnmount(false);\n timer = setTimeout(() => setIsOpenProxy(true), OPEN_DELAY);\n } else {\n setIsOpenProxy(false);\n // The 1.1 is to allow for the transition to finish.\n // It is a safety margin to avoid the component being unmounted too early.\n timer = setTimeout(() => setUnmount(true), TRANSITION_DELAY * 1.1);\n }\n return () => clearTimeout(timer);\n }, [props.isOpen]);\n\n if (unmount) {\n return null;\n }\n\n return <PdfThumbnailSidebarContent {...props} isOpen={isOpenProxy} />;\n}\n\nexport function PdfThumbnailSidebarContent({\n numPages,\n currentPage,\n goToPage,\n isOpen,\n pageDimensions,\n requestPageDimension,\n}: PdfThumbnailSidebarProps) {\n const listRef = useRef<List>(null);\n // When true, the next currentPage change came from a thumbnail click\n // and should not trigger an auto-scroll of the sidebar.\n const isClickNavRef = useRef(false);\n // Scroll to the current page on first render, then clear so the prop\n // no longer forces scroll position on subsequent renders.\n const [initialScrollIndex, setInitialScrollIndex] = useState<\n number | undefined\n >(currentPage - 1);\n\n // Auto-scroll active thumbnail into view (only for scroll-initiated changes)\n useEffect(() => {\n if (!listRef.current) return;\n if (isClickNavRef.current) {\n isClickNavRef.current = false;\n return;\n }\n listRef.current.scrollToRow(currentPage - 1);\n }, [currentPage]);\n\n const getRatio = useCallback(\n (index: number) => {\n const d = pageDimensions.get(index + 1);\n return d ? d.h / d.w : FALLBACK_RATIO;\n },\n [pageDimensions],\n );\n\n const rowHeight = useCallback(\n ({ index }: { index: number }) => {\n const thumbH = THUMBNAIL_WIDTH * getRatio(index);\n const base = thumbH + THUMBNAIL_LABEL_SPACE + THUMBNAIL_GAP;\n // Every row reserves a gap above via paddingTop. The last row also\n // reserves one below so the final thumbnail has matching breathing\n // room at the bottom of the sidebar.\n return index === numPages - 1 ? base + THUMBNAIL_GAP : base;\n },\n [getRatio, numPages],\n );\n\n // Invalidate react-virtualized's row-height cache when dimensions update.\n useEffect(() => {\n listRef.current?.recomputeRowHeights();\n }, [pageDimensions, numPages]);\n\n const handleRowsRendered = useCallback(\n ({\n overscanStartIndex,\n overscanStopIndex,\n }: {\n overscanStartIndex: number;\n overscanStopIndex: number;\n }) => {\n for (let i = overscanStartIndex; i <= overscanStopIndex; i++) {\n requestPageDimension(i + 1);\n }\n if (initialScrollIndex !== undefined) setInitialScrollIndex(undefined);\n },\n [requestPageDimension, initialScrollIndex],\n );\n\n const rowRenderer: ListRowRenderer = ({ index, key, style }) => {\n const page = index + 1;\n const ratio = getRatio(index);\n const thumbnailSkeleton = (\n <div\n className=\"pdf-preview__thumbnail-skeleton\"\n style={{ width: THUMBNAIL_WIDTH, height: THUMBNAIL_WIDTH * ratio }}\n />\n );\n return (\n <div\n key={key}\n style={{\n ...style,\n paddingTop: THUMBNAIL_GAP,\n paddingBottom: index === numPages - 1 ? THUMBNAIL_GAP : 0,\n boxSizing: \"border-box\",\n }}\n >\n <button\n data-thumb-page={page}\n className={`pdf-preview__thumbnail${currentPage === page ? \" pdf-preview__thumbnail--active\" : \"\"}`}\n onClick={() => {\n isClickNavRef.current = true;\n goToPage(page);\n }}\n aria-label={`Go to page ${page}`}\n >\n <Thumbnail\n pageNumber={page}\n width={THUMBNAIL_WIDTH}\n loading={thumbnailSkeleton}\n />\n <span className=\"pdf-preview__thumbnail-number\">{page}</span>\n </button>\n </div>\n );\n };\n\n return (\n <div\n className={`pdf-preview__sidebar${!isOpen ? \" pdf-preview__sidebar--closed\" : \"\"}`}\n >\n <AutoSizer>\n {({ height, width }) => (\n <List\n ref={listRef}\n height={height}\n width={width}\n rowCount={numPages}\n rowHeight={rowHeight}\n estimatedRowSize={\n THUMBNAIL_WIDTH * FALLBACK_RATIO +\n THUMBNAIL_LABEL_SPACE +\n THUMBNAIL_GAP\n }\n overscanRowCount={5}\n rowRenderer={rowRenderer}\n scrollToIndex={initialScrollIndex}\n scrollToAlignment=\"center\"\n onRowsRendered={handleRowsRendered}\n style={{ outline: \"none\" }}\n />\n )}\n </AutoSizer>\n </div>\n );\n}\n","import { Button, Input } from \"@gouvfr-lasuite/cunningham-react\";\nimport { LeftSidebarIcon } from \"../../icons/LeftSidebarIcon\";\nimport { ZoomControls } from \"../../components/ZoomControls/ZoomControls\";\n\ninterface PdfControlsProps {\n numPages: number;\n pageInputValue: string;\n onToggleSidebar: () => void;\n onPageInputChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n onPageInputSubmit: () => void;\n onPageInputKeyDown: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n onZoomIn: () => void;\n onZoomReset: () => void;\n onZoomOut: () => void;\n}\n\nexport function PdfControls({\n numPages,\n pageInputValue,\n onToggleSidebar,\n onPageInputChange,\n onPageInputSubmit,\n onPageInputKeyDown,\n onZoomIn,\n onZoomReset,\n onZoomOut,\n}: PdfControlsProps) {\n return (\n <div className=\"file-preview__controls\">\n <Button\n variant=\"tertiary\"\n color=\"neutral\"\n onClick={onToggleSidebar}\n aria-label=\"Toggle sidebar\"\n size=\"small\"\n icon={<LeftSidebarIcon />}\n />\n <div className=\"file-preview__controls__separator\" />\n <div className=\"pdf-preview__page-nav\">\n <div className=\"pdf-preview__page-indicator\">\n <Input\n variant=\"classic\"\n value={pageInputValue}\n onChange={onPageInputChange}\n onBlur={onPageInputSubmit}\n onKeyDown={onPageInputKeyDown}\n aria-label=\"Current page\"\n size={pageInputValue.length || 1}\n />\n <span className=\"pdf-preview__page-total\">/ {numPages}</span>\n </div>\n </div>\n <div className=\"file-preview__controls__separator\" />\n <ZoomControls\n zoomOut={onZoomOut}\n zoomIn={onZoomIn}\n resetView={onZoomReset}\n />\n </div>\n );\n}\n","import { useEffect, useState } from \"react\";\n\nfunction debounce<T extends (...args: never[]) => unknown>(\n func: T,\n timeout = 300,\n): ((...args: Parameters<T>) => void) & { cancel: () => void } {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const debouncedFunc = (...args: Parameters<T>) => {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n timer = setTimeout(() => {\n func(...args);\n }, timeout);\n };\n debouncedFunc.cancel = () => {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n };\n return debouncedFunc;\n}\n\nexport const useDebouncedResize = () => {\n const [size, setSize] = useState({\n width: window.innerWidth,\n height: window.innerHeight,\n });\n\n useEffect(() => {\n const handleResize = debounce(() => {\n setSize({ width: window.innerWidth, height: window.innerHeight });\n }, 100);\n window.addEventListener(\"resize\", handleResize);\n return () => {\n handleResize.cancel();\n window.removeEventListener(\"resize\", handleResize);\n };\n }, []);\n\n return size;\n};\n","import {\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { Page } from \"react-pdf\";\nimport { AutoSizer, List } from \"react-virtualized\";\nimport type { ListRowRenderer, Index } from \"react-virtualized\";\nimport { useDebouncedResize } from \"./useDebouncedResize\";\nimport { FALLBACK_RATIO, type PageDimensionsMap } from \"./usePdfPageDimensions\";\n\nconst PAGE_GAP = 16;\nconst BASE_WIDTH = 800;\nconst PAGE_MARGIN = 32;\n\nexport interface PdfPageViewerHandle {\n scrollToPage: (page: number) => void;\n}\n\ninterface PdfPageViewerProps {\n numPages: number;\n zoom: number;\n onCurrentPageChange: (page: number) => void;\n onClick: (e: React.MouseEvent<HTMLDivElement>) => void;\n pageDimensions: PageDimensionsMap;\n requestPageDimension: (page: number) => void;\n ensurePageDimensions: (pages: number[]) => Promise<PageDimensionsMap>;\n}\n\nexport function PdfPageViewer({\n numPages,\n zoom,\n onCurrentPageChange,\n onClick,\n pageDimensions,\n requestPageDimension,\n ensurePageDimensions,\n ref,\n}: PdfPageViewerProps & { ref?: React.Ref<PdfPageViewerHandle> }) {\n const listRef = useRef<List>(null);\n const prevZoomRef = useRef(zoom);\n const [scrollTop, setScrollTop] = useState(0);\n const listHeightRef = useRef(0);\n // Each scrollToPage call bumps this counter and captures its own id.\n // When a later call supersedes an earlier one, the earlier one checks\n // the counter in its async tail and bails — otherwise dimensions arriving\n // late for a stale target can clobber the user's newest jump.\n const scrollJumpIdRef = useRef(0);\n\n const size = useDebouncedResize();\n\n const width = useMemo(() => {\n return BASE_WIDTH + PAGE_MARGIN > size.width\n ? size.width - PAGE_MARGIN\n : BASE_WIDTH;\n }, [size.width]);\n\n // Per-page aspect ratio (height / width) from pdfjs.\n const getRatio = useCallback(\n (index: number) => {\n const d = pageDimensions.get(index + 1);\n return d ? d.h / d.w : FALLBACK_RATIO;\n },\n [pageDimensions],\n );\n\n const rowHeightForIndex = useCallback(\n (index: number) => {\n const h = width * getRatio(index) * zoom;\n const gap = PAGE_GAP * zoom;\n // Every row reserves a gap above the page via paddingTop. The last\n // row additionally reserves a gap below it so the final page has\n // breathing room matching the space above every other page.\n return index === numPages - 1 ? h + 2 * gap : h + gap;\n },\n [width, getRatio, zoom, numPages],\n );\n\n // Wrapper around rowHeightForIndex with appropriate signature for react-virtualized.\n const rowHeight = useCallback(\n ({ index }: Index) => rowHeightForIndex(index),\n [rowHeightForIndex],\n );\n\n // When zoom, width, pageDimensions or numPages change, row heights must be\n // recalculated because react-virtualized caches them internally.\n // On zoom change we also scale scrollTop proportionally so the user stays\n // on the same part of the document (e.g. 2x zoom → 2x scroll offset).\n useEffect(() => {\n listRef.current?.recomputeRowHeights();\n\n if (prevZoomRef.current !== zoom && listRef.current) {\n const ratio = zoom / prevZoomRef.current;\n const newScrollTop = Math.round(scrollTop * ratio);\n\n listRef.current.scrollToPosition(newScrollTop);\n prevZoomRef.current = zoom;\n }\n }, [zoom, width, pageDimensions, numPages]);\n\n // Find which page contains the vertical center of the viewport by walking\n // cumulative row heights until we pass the midpoint.\n const currentPage = useMemo(() => {\n if (numPages === 0) return 1;\n\n const viewportCenter = scrollTop + listHeightRef.current / 2;\n\n let offset = 0;\n for (let i = 0; i < numPages; i++) {\n const h = rowHeightForIndex(i);\n if (offset + h > viewportCenter) {\n return i + 1;\n }\n offset += h;\n }\n\n return numPages;\n }, [scrollTop, numPages, rowHeightForIndex]);\n\n useEffect(() => {\n onCurrentPageChange(currentPage);\n }, [currentPage]);\n\n const scrollToPage = useCallback(\n (page: number) => {\n // Jump targets can land on a page whose predecessors haven't had their\n // dimensions fetched yet (the user never scrolled through them). Await\n // dimensions for the whole prefix before computing the offset so the\n // scroll lands on the real page, not an A4-fallback approximation. We\n // use the up-to-date map returned by ensurePageDimensions rather than\n // rowHeightForIndex because React may not have committed the state\n // update yet when the promise resolves.\n //\n // Jumps issued in quick succession (e.g. a user mashing the page input)\n // race: an earlier call's prefix may take longer than a later call's,\n // so a stale .then() could clobber the newest target. We tag each call\n // with an id and bail if a newer one has been issued.\n scrollJumpIdRef.current += 1;\n const jumpId = scrollJumpIdRef.current;\n\n const pages: number[] = [];\n for (let i = 1; i <= page; i++) pages.push(i);\n ensurePageDimensions(pages).then((dimensions) => {\n if (scrollJumpIdRef.current !== jumpId) return;\n if (!listRef.current) return;\n let offset = 0;\n for (let i = 0; i < page - 1; i++) {\n const d = dimensions.get(i + 1);\n const ratio = d ? d.h / d.w : FALLBACK_RATIO;\n offset += width * ratio * zoom + PAGE_GAP * zoom;\n }\n listRef.current.scrollToPosition(offset);\n });\n },\n [ensurePageDimensions, width, zoom],\n );\n\n useImperativeHandle(ref, () => ({ scrollToPage }), [scrollToPage]);\n\n const handleScroll = useCallback(\n ({\n scrollTop: st,\n clientHeight,\n }: {\n scrollTop: number;\n clientHeight: number;\n }) => {\n listHeightRef.current = clientHeight;\n setScrollTop(st);\n },\n [],\n );\n\n const handleRowsRendered = useCallback(\n ({\n overscanStartIndex,\n overscanStopIndex,\n }: {\n overscanStartIndex: number;\n overscanStopIndex: number;\n }) => {\n for (let i = overscanStartIndex; i <= overscanStopIndex; i++) {\n requestPageDimension(i + 1);\n }\n },\n [requestPageDimension],\n );\n\n const rowRenderer: ListRowRenderer = ({ index, key, style }) => {\n const ratio = getRatio(index);\n const pageSkeleton = (\n <div\n className=\"pdf-preview__page-skeleton pdf-preview__page-skeleton--measured\"\n style={{ height: width * ratio * zoom, width: width * zoom }}\n />\n );\n return (\n <div\n key={key}\n data-preview-backdrop=\"true\"\n className=\"pdf-preview__page-container\"\n style={{\n ...style,\n paddingTop: PAGE_GAP * zoom,\n paddingBottom: index === numPages - 1 ? PAGE_GAP * zoom : 0,\n }}\n >\n <Page\n pageNumber={index + 1}\n width={width}\n scale={zoom}\n loading={pageSkeleton}\n />\n </div>\n );\n };\n\n return (\n <div className=\"pdf-preview__container\" onClick={onClick}>\n <AutoSizer>\n {({ height, width: autoWidth }) => {\n // When zoomed in the page content may exceed the viewport width.\n // The wrapper div is clamped to the viewport (autoWidth) and scrolls\n // horizontally, while the List itself is sized to the full content\n // width so pages render uncropped.\n const listWidth = Math.max(autoWidth, width * zoom);\n return (\n <div\n style={{\n width: autoWidth,\n height,\n }}\n className=\"pdf-preview__horizontal-scroll\"\n >\n <List\n ref={listRef}\n height={height}\n width={listWidth}\n rowCount={numPages}\n rowHeight={rowHeight}\n estimatedRowSize={\n width * FALLBACK_RATIO * zoom + PAGE_GAP * zoom\n }\n overscanRowCount={3}\n onScroll={handleScroll}\n onRowsRendered={handleRowsRendered}\n rowRenderer={rowRenderer}\n style={{ outline: \"none\" }}\n />\n </div>\n );\n }}\n </AutoSizer>\n </div>\n );\n}\n","import { useCallback } from \"react\";\nimport { useModals } from \"@gouvfr-lasuite/cunningham-react\";\nimport { useCustomTranslations } from \":/hooks/useCustomTranslations\";\n\nconst SAFE_PROTOCOLS = [\"https:\", \"http:\"];\n\nexport const useRedirectDisclaimer = () => {\n const modals = useModals();\n const { t } = useCustomTranslations();\n const handlePdfClick = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n const target = e.target as HTMLElement;\n const anchor = target.closest(\"a\");\n if (anchor && anchor.href) {\n if (anchor.closest(\"[data-internal-link]\")) return;\n\n e.preventDefault();\n e.stopPropagation();\n\n try {\n const url = new URL(anchor.href);\n if (!SAFE_PROTOCOLS.includes(url.protocol)) return;\n } catch {\n return;\n }\n\n modals.confirmationModal({\n title: t(\"components.filePreview.externalLink.title\"),\n children: (\n <div>\n <p>{t(\"components.filePreview.externalLink.description\")}</p>\n <span className=\"pdf-preview__external-link\">{anchor.href}</span>\n <p>{t(\"components.filePreview.externalLink.confirmQuestion\")}</p>\n </div>\n ),\n onDecide: (decision) => {\n if (decision === \"yes\") {\n window.open(anchor.href, \"_blank\", \"noopener,noreferrer\");\n }\n },\n });\n }\n },\n [modals, t],\n );\n return { handlePdfClick };\n};\n","export const pdfOptions = {\n cMapUrl: \"/cmaps/\",\n standardFontDataUrl: \"/standard_fonts/\",\n wasmUrl: \"/wasm/\",\n isEvalSupported: false,\n};\n","import \"./pdfPolyfills\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { Document, pdfjs } from \"react-pdf\";\nimport type { PDFDocumentProxy } from \"pdfjs-dist\";\n\nimport { Icon, IconType } from \":/components/icon\";\nimport { useCustomTranslations } from \":/hooks/useCustomTranslations\";\n\nimport { usePdfNavigation } from \"./usePdfNavigation\";\nimport { PdfThumbnailSidebar } from \"./PdfThumbnailSidebar\";\nimport { PdfControls } from \"./PdfControls\";\nimport { PdfPageViewer } from \"./PdfPageViewer\";\nimport type { PdfPageViewerHandle } from \"./PdfPageViewer\";\nimport { useRedirectDisclaimer } from \"./useRedirectDisclaimer\";\nimport { OutdatedBrowserPreview } from \"./OutdatedBrowserPreview\";\nimport { pdfOptions } from \"./pdfOptions\";\nimport { usePdfPageDimensions } from \"./usePdfPageDimensions\";\nimport { DEFAULT_PDF_WORKER_SRC } from \"./pdfConsts\";\n\ninterface PdfPreviewProps {\n src: string;\n onThumbailSidebarOpen?: (isOpen: boolean) => void;\n pdfWorkerSrc?: string;\n}\n\nexport function PdfPreview({\n src,\n onThumbailSidebarOpen,\n pdfWorkerSrc = DEFAULT_PDF_WORKER_SRC,\n}: PdfPreviewProps) {\n // Set the worker source once per render — pdfjs reads this when loading\n // the next document. Last-write-wins if multiple consumers configure it.\n pdfjs.GlobalWorkerOptions.workerSrc = pdfWorkerSrc;\n\n const { t } = useCustomTranslations();\n const [numPages, setNumPages] = useState<number>(1);\n const [documentError, setDocumentError] = useState<\n \"generic\" | \"outdated\" | null\n >(null);\n const [currentPage, setCurrentPage] = useState(1);\n const [isSidebarOpen, setIsSidebarOpen] = useState(false);\n const viewerRef = useRef<PdfPageViewerHandle>(null);\n const { handlePdfClick } = useRedirectDisclaimer();\n\n const [zoom, setZoom] = useState(1);\n const { pageDimensions, requestPageDimension, ensurePageDimensions, setPdf } =\n usePdfPageDimensions();\n\n const zoomIn = useCallback(() => {\n setZoom((prev) => Math.min(3, prev + 0.25));\n }, []);\n const zoomOut = useCallback(() => {\n setZoom((prev) => Math.max(0.5, prev - 0.25));\n }, []);\n const zoomReset = useCallback(() => {\n setZoom(1);\n }, []);\n const toggleSidebar = useCallback(() => {\n setIsSidebarOpen((prev) => {\n onThumbailSidebarOpen?.(!prev);\n return !prev;\n });\n }, []);\n\n const scrollToPage = useCallback((page: number) => {\n viewerRef.current?.scrollToPage(page);\n }, []);\n\n const {\n goToPage,\n onDocumentLoadSuccess: onNavLoadSuccess,\n pageInputValue,\n setPageInputValue,\n handlePageInputChange,\n handlePageInputSubmit,\n handlePageInputKeyDown,\n onItemClick,\n } = usePdfNavigation({ numPages, currentPage, scrollToPage });\n\n useEffect(() => {\n setPageInputValue(String(currentPage));\n }, [currentPage, setPageInputValue]);\n\n const { data: file, error } = useQuery<File, Error>({\n queryKey: [\"pdf\", src],\n queryFn: async ({ signal }) => {\n const response = await fetch(src, {\n credentials: \"include\",\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch PDF: ${response.status}`);\n }\n\n const blob = await response.blob();\n const filename = src.split(\"/\").pop() || \"document.pdf\";\n return new File([blob], filename, { type: \"application/pdf\" });\n },\n staleTime: Infinity,\n });\n\n const onDocumentLoadSuccess = useCallback(\n (pdf: PDFDocumentProxy) => {\n const nextNumPages = onNavLoadSuccess(pdf);\n setNumPages(nextNumPages);\n setPdf(pdf);\n },\n [onNavLoadSuccess, setPdf],\n );\n\n const handleDocumentError = useCallback((error: Error) => {\n const pdfErrors = [\n \"InvalidPDFException\",\n \"FormatError\",\n \"PasswordException\",\n \"ResponseException\",\n ];\n console.log(error);\n setDocumentError(pdfErrors.includes(error.name) ? \"generic\" : \"outdated\");\n }, []);\n\n console.log(error);\n\n if (error?.message || documentError === \"generic\") {\n return (\n <div className=\"file-preview-unsupported\" data-preview-backdrop=\"true\">\n <div className=\"file-preview-unsupported__icon\">\n <Icon name=\"error\" type={IconType.OUTLINED} size={48} />\n </div>\n <p className=\"file-preview-unsupported__title\">\n {t(\"components.filePreview.error.title\")}\n </p>\n <p className=\"file-preview-unsupported__description\">\n {t(\"components.filePreview.error.description\")}\n </p>\n </div>\n );\n }\n\n if (documentError === \"outdated\") {\n return <OutdatedBrowserPreview />;\n }\n\n const loadingSkeleton = (\n <div className=\"pdf-preview__container-skeleton\">\n <div className=\"pdf-preview__page-skeleton\" />\n </div>\n );\n\n return (\n <div className=\"pdf-preview\">\n <div className=\"pdf-preview__body\" data-preview-backdrop=\"true\">\n {file ? (\n <Document\n file={file}\n onLoadSuccess={onDocumentLoadSuccess}\n onItemClick={onItemClick}\n options={pdfOptions}\n loading={loadingSkeleton}\n onLoadError={handleDocumentError}\n >\n <PdfThumbnailSidebar\n numPages={numPages}\n currentPage={currentPage}\n goToPage={goToPage}\n isOpen={isSidebarOpen}\n pageDimensions={pageDimensions}\n requestPageDimension={requestPageDimension}\n />\n <PdfPageViewer\n ref={viewerRef}\n numPages={numPages}\n zoom={zoom}\n onCurrentPageChange={setCurrentPage}\n onClick={handlePdfClick}\n pageDimensions={pageDimensions}\n requestPageDimension={requestPageDimension}\n ensurePageDimensions={ensurePageDimensions}\n />\n </Document>\n ) : (\n loadingSkeleton\n )}\n </div>\n <PdfControls\n numPages={numPages}\n pageInputValue={pageInputValue}\n onToggleSidebar={toggleSidebar}\n onPageInputChange={handlePageInputChange}\n onPageInputSubmit={handlePageInputSubmit}\n onPageInputKeyDown={handlePageInputKeyDown}\n onZoomIn={zoomIn}\n onZoomReset={zoomReset}\n onZoomOut={zoomOut}\n />\n </div>\n );\n}\n\nexport default PdfPreview;\n"],"names":["url","base","promiseCtor","resolve","reject","res","rej","usePdfNavigation","numPages","currentPage","scrollToPage","pageInputValue","setPageInputValue","useState","goToPage","useCallback","page","clamped","onDocumentLoadSuccess","nextNumPages","handlePageInputChange","e","handlePageInputSubmit","parsed","handlePageInputKeyDown","goToPageRef","useRef","useEffect","onItemClick","args","FALLBACK_RATIO","usePdfPageDimensions","pdfRef","inFlightRef","pageDimensionsRef","pageDimensions","setPageDimensions","setPdf","pdf","fetchPageDimension","existing","promise","p","vp","next","err","requestPageDimension","ensurePageDimensions","pages","PdfThumbnailSidebar","props","unmount","setUnmount","isOpenProxy","setIsOpenProxy","timer","OPEN_DELAY","TRANSITION_DELAY","jsx","PdfThumbnailSidebarContent","isOpen","listRef","isClickNavRef","initialScrollIndex","setInitialScrollIndex","getRatio","index","d","rowHeight","THUMBNAIL_WIDTH","THUMBNAIL_LABEL_SPACE","THUMBNAIL_GAP","_a","handleRowsRendered","overscanStartIndex","overscanStopIndex","i","rowRenderer","key","style","ratio","thumbnailSkeleton","jsxs","Thumbnail","AutoSizer","height","width","List","PdfControls","onToggleSidebar","onPageInputChange","onPageInputSubmit","onPageInputKeyDown","onZoomIn","onZoomReset","onZoomOut","Button","LeftSidebarIcon","Input","ZoomControls","debounce","func","timeout","debouncedFunc","useDebouncedResize","size","setSize","handleResize","PAGE_GAP","BASE_WIDTH","PAGE_MARGIN","PdfPageViewer","zoom","onCurrentPageChange","onClick","ref","prevZoomRef","scrollTop","setScrollTop","listHeightRef","scrollJumpIdRef","useMemo","rowHeightForIndex","h","gap","newScrollTop","viewportCenter","offset","jumpId","dimensions","useImperativeHandle","handleScroll","st","clientHeight","pageSkeleton","Page","autoWidth","listWidth","SAFE_PROTOCOLS","useRedirectDisclaimer","modals","useModals","useCustomTranslations","anchor","decision","pdfOptions","PdfPreview","src","onThumbailSidebarOpen","pdfWorkerSrc","DEFAULT_PDF_WORKER_SRC","pdfjs","t","setNumPages","documentError","setDocumentError","setCurrentPage","isSidebarOpen","setIsSidebarOpen","viewerRef","handlePdfClick","setZoom","zoomIn","prev","zoomOut","zoomReset","toggleSidebar","onNavLoadSuccess","file","error","useQuery","signal","response","blob","filename","handleDocumentError","pdfErrors","Icon","IconType","OutdatedBrowserPreview","loadingSkeleton","Document"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import t1 from "react";
2
- var A = { exports: {} }, E = {};
2
+ var A = { exports: {} }, j = {};
3
3
  /**
4
4
  * @license React
5
5
  * react-jsx-runtime.production.js
@@ -11,15 +11,15 @@ var A = { exports: {} }, E = {};
11
11
  */
12
12
  var D;
13
13
  function n1() {
14
- if (D) return E;
14
+ if (D) return j;
15
15
  D = 1;
16
16
  var r = Symbol.for("react.transitional.element"), u = Symbol.for("react.fragment");
17
17
  function m(R, s, d) {
18
18
  var x = null;
19
19
  if (d !== void 0 && (x = "" + d), s.key !== void 0 && (x = "" + s.key), "key" in s) {
20
20
  d = {};
21
- for (var q in s)
22
- q !== "key" && (d[q] = s[q]);
21
+ for (var p in s)
22
+ p !== "key" && (d[p] = s[p]);
23
23
  } else d = s;
24
24
  return s = d.ref, {
25
25
  $$typeof: r,
@@ -29,9 +29,9 @@ function n1() {
29
29
  props: d
30
30
  };
31
31
  }
32
- return E.Fragment = u, E.jsx = m, E.jsxs = m, E;
32
+ return j.Fragment = u, j.jsx = m, j.jsxs = m, j;
33
33
  }
34
- var p = {};
34
+ var q = {};
35
35
  /**
36
36
  * @license React
37
37
  * react-jsx-runtime.development.js
@@ -54,7 +54,7 @@ function o1() {
54
54
  return "Fragment";
55
55
  case X:
56
56
  return "Profiler";
57
- case G:
57
+ case $:
58
58
  return "StrictMode";
59
59
  case Z:
60
60
  return "Suspense";
@@ -67,7 +67,7 @@ function o1() {
67
67
  switch (typeof e.tag == "number" && console.error(
68
68
  "Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."
69
69
  ), e.$$typeof) {
70
- case $:
70
+ case U:
71
71
  return "Portal";
72
72
  case J:
73
73
  return (e.displayName || "Context") + ".Provider";
@@ -132,7 +132,7 @@ function o1() {
132
132
  }
133
133
  return e.key !== void 0;
134
134
  }
135
- function q(e, l) {
135
+ function p(e, l) {
136
136
  function t() {
137
137
  z || (z = !0, console.error(
138
138
  "%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",
@@ -150,7 +150,7 @@ function o1() {
150
150
  "Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release."
151
151
  )), e = this.props.ref, e !== void 0 ? e : null;
152
152
  }
153
- function U(e, l, t, o, h, f, C, T) {
153
+ function G(e, l, t, o, h, f, b, T) {
154
154
  return t = f.ref, e = {
155
155
  $$typeof: g,
156
156
  type: e,
@@ -174,7 +174,7 @@ function o1() {
174
174
  configurable: !1,
175
175
  enumerable: !1,
176
176
  writable: !0,
177
- value: C
177
+ value: b
178
178
  }), Object.defineProperty(e, "_debugTask", {
179
179
  configurable: !1,
180
180
  enumerable: !1,
@@ -182,7 +182,7 @@ function o1() {
182
182
  value: T
183
183
  }), Object.freeze && (Object.freeze(e.props), Object.freeze(e)), e;
184
184
  }
185
- function S(e, l, t, o, h, f, C, T) {
185
+ function S(e, l, t, o, h, f, b, T) {
186
186
  var c = l.children;
187
187
  if (c !== void 0)
188
188
  if (o)
@@ -215,39 +215,39 @@ React keys must be passed directly to JSX without using spread:
215
215
  }
216
216
  if (c = null, t !== void 0 && (m(t), c = "" + t), x(l) && (m(l.key), c = "" + l.key), "key" in l) {
217
217
  t = {};
218
- for (var k in l)
219
- k !== "key" && (t[k] = l[k]);
218
+ for (var L in l)
219
+ L !== "key" && (t[L] = l[L]);
220
220
  } else t = l;
221
- return c && q(
221
+ return c && p(
222
222
  t,
223
223
  typeof e == "function" ? e.displayName || e.name || "Unknown" : e
224
- ), U(
224
+ ), G(
225
225
  e,
226
226
  c,
227
227
  f,
228
228
  h,
229
229
  s(),
230
230
  t,
231
- C,
231
+ b,
232
232
  T
233
233
  );
234
234
  }
235
235
  function w(e) {
236
236
  typeof e == "object" && e !== null && e.$$typeof === g && e._store && (e._store.validated = 1);
237
237
  }
238
- var j = t1, g = Symbol.for("react.transitional.element"), $ = Symbol.for("react.portal"), _ = Symbol.for("react.fragment"), G = Symbol.for("react.strict_mode"), X = Symbol.for("react.profiler"), W = Symbol.for("react.consumer"), J = Symbol.for("react.context"), B = Symbol.for("react.forward_ref"), Z = Symbol.for("react.suspense"), Q = Symbol.for("react.suspense_list"), K = Symbol.for("react.memo"), O = Symbol.for("react.lazy"), e1 = Symbol.for("react.activity"), r1 = Symbol.for("react.client.reference"), M = j.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE, P = Object.prototype.hasOwnProperty, a1 = Array.isArray, b = console.createTask ? console.createTask : function() {
238
+ var E = t1, g = Symbol.for("react.transitional.element"), U = Symbol.for("react.portal"), _ = Symbol.for("react.fragment"), $ = Symbol.for("react.strict_mode"), X = Symbol.for("react.profiler"), W = Symbol.for("react.consumer"), J = Symbol.for("react.context"), B = Symbol.for("react.forward_ref"), Z = Symbol.for("react.suspense"), Q = Symbol.for("react.suspense_list"), K = Symbol.for("react.memo"), O = Symbol.for("react.lazy"), e1 = Symbol.for("react.activity"), r1 = Symbol.for("react.client.reference"), M = E.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE, P = Object.prototype.hasOwnProperty, a1 = Array.isArray, C = console.createTask ? console.createTask : function() {
239
239
  return null;
240
240
  };
241
- j = {
241
+ E = {
242
242
  react_stack_bottom_frame: function(e) {
243
243
  return e();
244
244
  }
245
245
  };
246
- var z, V = {}, y = j.react_stack_bottom_frame.bind(
247
- j,
246
+ var z, V = {}, y = E.react_stack_bottom_frame.bind(
247
+ E,
248
248
  d
249
- )(), N = b(R(d)), H = {};
250
- p.Fragment = _, p.jsx = function(e, l, t, o, h) {
249
+ )(), N = C(R(d)), H = {};
250
+ q.Fragment = _, q.jsx = function(e, l, t, o, h) {
251
251
  var f = 1e4 > M.recentlyCreatedOwnerStacks++;
252
252
  return S(
253
253
  e,
@@ -257,9 +257,9 @@ React keys must be passed directly to JSX without using spread:
257
257
  o,
258
258
  h,
259
259
  f ? Error("react-stack-top-frame") : y,
260
- f ? b(R(e)) : N
260
+ f ? C(R(e)) : N
261
261
  );
262
- }, p.jsxs = function(e, l, t, o, h) {
262
+ }, q.jsxs = function(e, l, t, o, h) {
263
263
  var f = 1e4 > M.recentlyCreatedOwnerStacks++;
264
264
  return S(
265
265
  e,
@@ -269,17 +269,17 @@ React keys must be passed directly to JSX without using spread:
269
269
  o,
270
270
  h,
271
271
  f ? Error("react-stack-top-frame") : y,
272
- f ? b(R(e)) : N
272
+ f ? C(R(e)) : N
273
273
  );
274
274
  };
275
- }()), p;
275
+ }()), q;
276
276
  }
277
277
  var F;
278
278
  function c1() {
279
279
  return F || (F = 1, process.env.NODE_ENV === "production" ? A.exports = n1() : A.exports = o1()), A.exports;
280
280
  }
281
281
  var a = c1(), i = /* @__PURE__ */ ((r) => (r.X_SMALL = "xsmall", r.SMALL = "small", r.MEDIUM = "medium", r.LARGE = "large", r.X_LARGE = "xlarge", r))(i || {}), s1 = /* @__PURE__ */ ((r) => (r.OUTLINED = "outlined", r.FILLED = "filled", r))(s1 || {});
282
- const L = {
282
+ const k = {
283
283
  [i.X_SMALL]: 11,
284
284
  [i.SMALL]: 16,
285
285
  [i.MEDIUM]: 24,
@@ -291,9 +291,9 @@ const L = {
291
291
  [i.MEDIUM]: 32,
292
292
  [i.LARGE]: 40,
293
293
  [i.X_LARGE]: 48
294
- }, d1 = (r) => i1[r] ?? 24, f1 = (r) => L[r] ?? 24, n = (r) => {
294
+ }, d1 = (r) => i1[r] ?? 24, f1 = (r) => k[r] ?? 24, n = (r) => {
295
295
  let u;
296
- return typeof r.size == "number" ? u = r.size : r.size && L[r.size] ? u = L[r.size] : u = 24, /* @__PURE__ */ a.jsx(
296
+ return typeof r.size == "number" ? u = r.size : r.size && k[r.size] ? u = k[r.size] : u = 24, /* @__PURE__ */ a.jsx(
297
297
  "svg",
298
298
  {
299
299
  width: u,
@@ -366,7 +366,7 @@ const L = {
366
366
  clipRule: "evenodd"
367
367
  }
368
368
  )
369
- ] }), q1 = (r) => /* @__PURE__ */ a.jsxs(n, { ...r, children: [
369
+ ] }), p1 = (r) => /* @__PURE__ */ a.jsxs(n, { ...r, children: [
370
370
  /* @__PURE__ */ a.jsx(
371
371
  "path",
372
372
  {
@@ -390,7 +390,7 @@ const L = {
390
390
  d: "M9.444 9.13q.37 0 .579.199.216.198.215.568v5.522q0 .306-.18.513t-.505.208q-.316 0-.496-.198a.77.77 0 0 1-.181-.524V10.52H8.85l-.813.613q-.09.055-.17.091a.4.4 0 0 1-.181.036.45.45 0 0 1-.334-.135.5.5 0 0 1-.136-.36q0-.308.298-.533l.947-.695q.235-.18.46-.288.235-.118.523-.119"
391
391
  }
392
392
  )
393
- ] }), E1 = (r) => /* @__PURE__ */ a.jsxs(n, { ...r, children: [
393
+ ] }), j1 = (r) => /* @__PURE__ */ a.jsxs(n, { ...r, children: [
394
394
  /* @__PURE__ */ a.jsx(
395
395
  "path",
396
396
  {
@@ -414,25 +414,59 @@ const L = {
414
414
  d: "M9.444 9.13q.37 0 .579.199.216.198.215.568v5.522q0 .306-.18.513t-.505.208q-.316 0-.496-.198a.77.77 0 0 1-.181-.524V10.52H8.85l-.813.613q-.09.055-.17.091a.4.4 0 0 1-.181.036.45.45 0 0 1-.334-.135.5.5 0 0 1-.136-.36q0-.308.298-.533l.947-.695q.235-.18.46-.288.235-.118.523-.119"
415
415
  }
416
416
  )
417
- ] }), p1 = (r) => /* @__PURE__ */ a.jsx(n, { ...r, children: /* @__PURE__ */ a.jsx(
417
+ ] }), q1 = (r) => /* @__PURE__ */ a.jsxs(n, { ...r, children: [
418
+ /* @__PURE__ */ a.jsx(
419
+ "path",
420
+ {
421
+ fill: "currentColor",
422
+ fillRule: "evenodd",
423
+ d: "M12 8a4 4 0 1 1 0 8 4 4 0 0 1 0-8m0 2a2 2 0 1 0 0 4 2 2 0 0 0 0-4",
424
+ clipRule: "evenodd"
425
+ }
426
+ ),
427
+ /* @__PURE__ */ a.jsx(
428
+ "path",
429
+ {
430
+ fill: "currentColor",
431
+ fillRule: "evenodd",
432
+ d: "M12 1.018a3.34 3.34 0 0 1 3.281 2.716l.044.308v.006a1.34 1.34 0 0 0 1.277 1.22c.214.01.429-.033.624-.123l.297-.12a3.34 3.34 0 0 1 3.038 5.873l-.008.004a1.344 1.344 0 0 0-.126 2.094l.126.1.008.006a3.34 3.34 0 0 1-3.326 5.756l-.01-.003a1.34 1.34 0 0 0-1.9 1.096v.007a3.34 3.34 0 0 1-6.65 0l-.001-.007a1.34 1.34 0 0 0-1.9-1.096l-.01.003a3.341 3.341 0 0 1-4.646-3.746 3.34 3.34 0 0 1 1.32-2.01l.008-.005a1.342 1.342 0 0 0 0-2.195l-.009-.005a3.34 3.34 0 0 1 3.037-5.872l.288.115.01.005a1.34 1.34 0 0 0 1.695-.495 1.34 1.34 0 0 0 .205-.602q.005-.063.018-.122A3.34 3.34 0 0 1 12 1.018m0 2a1.34 1.34 0 0 0-1.334 1.212 1 1 0 0 1-.015.1 3.34 3.34 0 0 1-1.644 2.493 3.34 3.34 0 0 1-3.08.135 1.34 1.34 0 0 0-1.702.555 1.343 1.343 0 0 0 .378 1.758 3.338 3.338 0 0 1-.002 5.456l.001.002a1.341 1.341 0 0 0 1.334 2.31 3.34 3.34 0 0 1 4.22 1.233c.287.451.46.964.509 1.497a1.341 1.341 0 0 0 2.669 0 3.34 3.34 0 0 1 4.727-2.73l.116.045a1.344 1.344 0 0 0 1.6-.596 1.34 1.34 0 0 0-.38-1.76 3.344 3.344 0 0 1-1.038-4.269 3.34 3.34 0 0 1 1.045-1.193 1.341 1.341 0 0 0-1.343-2.304 3.342 3.342 0 0 1-4.728-2.737A1.34 1.34 0 0 0 12 3.018",
433
+ clipRule: "evenodd"
434
+ }
435
+ )
436
+ ] }), E1 = (r) => /* @__PURE__ */ a.jsxs(n, { ...r, children: [
437
+ /* @__PURE__ */ a.jsx(
438
+ "path",
439
+ {
440
+ fill: "currentColor",
441
+ d: "M9 2.5a1 1 0 0 1 0 2H5a1 1 0 0 0-1 1v14a1 1 0 0 0 1 1h4a1 1 0 1 1 0 2H5a3 3 0 0 1-3-3v-14a3 3 0 0 1 3-3z"
442
+ }
443
+ ),
444
+ /* @__PURE__ */ a.jsx(
445
+ "path",
446
+ {
447
+ fill: "currentColor",
448
+ d: "M15.293 6.793a1 1 0 0 1 1.414 0l5 5a1 1 0 0 1 .25.414l.015.062q.027.111.028.231-.001.084-.016.165a.991.991 0 0 1-.202.455 1 1 0 0 1-.075.087l-5 5a1 1 0 1 1-1.414-1.414l3.293-3.293H9a1 1 0 1 1 0-2h9.586l-3.293-3.293a1 1 0 0 1 0-1.414"
449
+ }
450
+ )
451
+ ] }), A1 = (r) => /* @__PURE__ */ a.jsx(n, { ...r, children: /* @__PURE__ */ a.jsx(
418
452
  "path",
419
453
  {
420
454
  fill: "currentColor",
421
455
  d: "M9.293 13.293a1 1 0 1 1 1.414 1.414L5.414 20H9a1 1 0 1 1 0 2H3a1 1 0 0 1-1-1v-6a1 1 0 1 1 2 0v3.586zM22 9a1 1 0 1 1-2 0V5.414l-5.293 5.293a1 1 0 1 1-1.414-1.414L18.586 4H15a1 1 0 1 1 0-2h6a1 1 0 0 1 1 1z"
422
456
  }
423
- ) }), j1 = (r) => /* @__PURE__ */ a.jsx(n, { ...r, children: /* @__PURE__ */ a.jsx(
457
+ ) }), _1 = (r) => /* @__PURE__ */ a.jsx(n, { ...r, children: /* @__PURE__ */ a.jsx(
424
458
  "path",
425
459
  {
426
460
  fill: "currentColor",
427
461
  d: "M9.315 3.5c.742 0 1.342.6 1.342 1.342v14.316c0 .741-.6 1.342-1.342 1.342H6.632c-.741 0-1.343-.6-1.343-1.342V4.842c0-.741.602-1.342 1.343-1.342zM17.368 3.5c.741 0 1.342.6 1.342 1.342v14.316c0 .741-.6 1.342-1.342 1.342h-2.684c-.741 0-1.342-.6-1.342-1.342V4.842c0-.741.6-1.342 1.342-1.342z"
428
462
  }
429
- ) }), A1 = (r) => /* @__PURE__ */ a.jsx(n, { ...r, children: /* @__PURE__ */ a.jsx(
463
+ ) }), M1 = (r) => /* @__PURE__ */ a.jsx(n, { ...r, children: /* @__PURE__ */ a.jsx(
430
464
  "path",
431
465
  {
432
466
  fill: "currentColor",
433
467
  d: "M7.64 3.5c.393.001.779.107 1.119.305l10.732 6.26a2.24 2.24 0 0 1 1.115 1.933 2.24 2.24 0 0 1-.987 1.856l-.124.078L8.76 20.195a2.236 2.236 0 0 1-3.364-1.933V5.737A2.24 2.24 0 0 1 7.64 3.5"
434
468
  }
435
- ) }), _1 = (r) => /* @__PURE__ */ a.jsx(n, { ...r, children: /* @__PURE__ */ a.jsx(
469
+ ) }), C1 = (r) => /* @__PURE__ */ a.jsx(n, { ...r, children: /* @__PURE__ */ a.jsx(
436
470
  "path",
437
471
  {
438
472
  fill: "currentColor",
@@ -440,7 +474,7 @@ const L = {
440
474
  d: "M12 2a1 1 0 0 1 1 1v1.385A16 16 0 0 0 20 6h1a1 1 0 1 1 0 2h-.932l2.868 7.648A1 1 0 0 1 22.6 16.8a6 6 0 0 1-7.199 0 1 1 0 0 1-.337-1.152l2.911-7.764A18 18 0 0 1 13 6.58V20h4a1 1 0 1 1 0 2H7a1 1 0 0 1 0-2h4V6.581a18 18 0 0 1-4.976 1.304l2.912 7.763A1 1 0 0 1 8.6 16.8a6 6 0 0 1-7.199 0 1 1 0 0 1-.337-1.152L3.931 8H3a1 1 0 0 1 0-2h1c2.428 0 4.82-.555 7-1.615V3a1 1 0 0 1 1-1M3.224 15.581C3.774 15.853 4.38 16 5 16c.619 0 1.225-.147 1.774-.419L5 10.85zm14 0c.55.272 1.156.419 1.776.419.619 0 1.225-.147 1.774-.419L19 10.85z",
441
475
  clipRule: "evenodd"
442
476
  }
443
- ) }), M1 = (r) => /* @__PURE__ */ a.jsxs(n, { ...r, children: [
477
+ ) }), b1 = (r) => /* @__PURE__ */ a.jsxs(n, { ...r, children: [
444
478
  /* @__PURE__ */ a.jsx(
445
479
  "path",
446
480
  {
@@ -464,7 +498,7 @@ const L = {
464
498
  d: "M21.832 10.92a1 1 0 0 1 .387 1.964l-3.025.597a1.001 1.001 0 0 1-.389-1.961z"
465
499
  }
466
500
  )
467
- ] }), b1 = (r) => /* @__PURE__ */ a.jsxs(n, { ...r, children: [
501
+ ] }), T1 = (r) => /* @__PURE__ */ a.jsxs(n, { ...r, children: [
468
502
  /* @__PURE__ */ a.jsx(
469
503
  "path",
470
504
  {
@@ -479,13 +513,13 @@ const L = {
479
513
  d: "M21 12a8 8 0 0 0-2.343-5.657 1 1 0 1 1 1.414-1.414 10 10 0 0 1 0 14.143 1 1 0 0 1-1.414-1.415A8 8 0 0 0 21 12"
480
514
  }
481
515
  )
482
- ] }), C1 = (r) => /* @__PURE__ */ a.jsx(n, { ...r, children: /* @__PURE__ */ a.jsx(
516
+ ] }), L1 = (r) => /* @__PURE__ */ a.jsx(n, { ...r, children: /* @__PURE__ */ a.jsx(
483
517
  "path",
484
518
  {
485
519
  fill: "currentColor",
486
520
  d: "M10.088 3.01c.25-.03.502-.005.741.074l.118.044.115.052c.224.113.42.274.576.472l.074.103.066.107c.145.255.221.544.222.838v14.597l-.005.126a1.704 1.704 0 0 1-2.907 1.08l-3.384-3.385A.4.4 0 0 0 5.42 17H3a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h2.419a.4.4 0 0 0 .285-.118l3.387-3.386c.238-.238.542-.4.872-.466zm11.205 5.283a1 1 0 1 1 1.414 1.414L20.414 12l2.293 2.293a1 1 0 1 1-1.414 1.414L19 13.414l-2.293 2.293a1 1 0 1 1-1.414-1.414L17.586 12l-2.293-2.293a1 1 0 1 1 1.414-1.414L19 10.586zM3 15h2.416a2.4 2.4 0 0 1 1.704.706l2.88 2.88V5.414l-2.88 2.88a2.4 2.4 0 0 1-1.704.705H3z"
487
521
  }
488
- ) }), T1 = (r) => /* @__PURE__ */ a.jsxs(n, { ...r, children: [
522
+ ) }), k1 = (r) => /* @__PURE__ */ a.jsxs(n, { ...r, children: [
489
523
  /* @__PURE__ */ a.jsx(
490
524
  "path",
491
525
  {
@@ -502,7 +536,7 @@ const L = {
502
536
  clipRule: "evenodd"
503
537
  }
504
538
  )
505
- ] }), k1 = (r) => /* @__PURE__ */ a.jsxs(n, { ...r, children: [
539
+ ] }), S1 = (r) => /* @__PURE__ */ a.jsxs(n, { ...r, children: [
506
540
  /* @__PURE__ */ a.jsx(
507
541
  "path",
508
542
  {
@@ -519,7 +553,7 @@ const L = {
519
553
  clipRule: "evenodd"
520
554
  }
521
555
  )
522
- ] }), L1 = (r) => /* @__PURE__ */ a.jsxs(n, { ...r, children: [
556
+ ] }), w1 = (r) => /* @__PURE__ */ a.jsxs(n, { ...r, children: [
523
557
  /* @__PURE__ */ a.jsx(
524
558
  "path",
525
559
  {
@@ -542,26 +576,28 @@ export {
542
576
  m1 as B,
543
577
  R1 as C,
544
578
  x1 as D,
545
- q1 as F,
579
+ p1 as F,
580
+ q1 as G,
546
581
  s1 as I,
547
- p1 as M,
548
- j1 as P,
549
- M1 as S,
550
- C1 as V,
551
- k1 as Z,
582
+ E1 as L,
583
+ A1 as M,
584
+ _1 as P,
585
+ b1 as S,
586
+ L1 as V,
587
+ S1 as Z,
552
588
  i as a,
553
589
  v1 as b,
554
- _1 as c,
555
- b1 as d,
556
- A1 as e,
557
- E1 as f,
558
- T1 as g,
559
- L1 as h,
590
+ C1 as c,
591
+ T1 as d,
592
+ M1 as e,
593
+ j1 as f,
594
+ k1 as g,
595
+ w1 as h,
560
596
  n as i,
561
597
  a as j,
562
- L as k,
598
+ k,
563
599
  i1 as l,
564
600
  d1 as m,
565
601
  f1 as n
566
602
  };
567
- //# sourceMappingURL=ZoomPlus-BpYaKE3S.js.map
603
+ //# sourceMappingURL=ZoomPlus-B6u2-sQg.js.map