@gouvfr-lasuite/ui-kit 0.23.2 → 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.
package/README.md CHANGED
@@ -342,12 +342,15 @@ const customTranslations = {
342
342
 
343
343
  ## Internationalization
344
344
 
345
- The UI Kit natively supports French and English.
345
+ The UI Kit natively supports French, English, Dutch, German and Spanish.
346
346
 
347
347
  ### Supported Languages
348
348
 
349
349
  - `fr-FR` - French (default)
350
350
  - `en-US` - English
351
+ - `nl-NL` - Dutch
352
+ - `de-DE` - German
353
+ - `es-ES` - Spanish
351
354
 
352
355
  ### Changing Language
353
356
 
@@ -1,8 +1,8 @@
1
- import { j as n, I as oe } from "./ZoomPlus-pBCoSTnV.js";
1
+ import { j as n, I as oe } from "./ZoomPlus-B6u2-sQg.js";
2
2
  import { useState as I, useCallback as u, useRef as b, useEffect as S, useMemo as W, useImperativeHandle as ie } from "react";
3
3
  import { useQuery as ce } from "@tanstack/react-query";
4
4
  import { Thumbnail as ae, Page as le, pdfjs as de, Document as ue } from "react-pdf";
5
- import { O as pe, T as fe, a as E, b as A, c as $, L as he, Z as we, u as Y, D as me, I as ge, d as ve } from "./index-B6GHSbZ5.js";
5
+ import { O as pe, T as fe, a as E, b as A, c as $, L as he, Z as we, u as Y, D as me, I as ge, d as ve } from "./index-BccxlMZn.js";
6
6
  import { AutoSizer as J, List as X } from "react-virtualized";
7
7
  import { Button as _e, Input as xe, useModals as Pe } from "@gouvfr-lasuite/cunningham-react";
8
8
  typeof URL.parse > "u" && (URL.parse = function(t, e) {
@@ -598,4 +598,4 @@ export {
598
598
  Ue as PdfPreview,
599
599
  Ue as default
600
600
  };
601
- //# sourceMappingURL=PdfPreview-BOBDAlTZ.js.map
601
+ //# sourceMappingURL=PdfPreview-BRLzv-qj.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PdfPreview-BOBDAlTZ.js","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","t","useCustomTranslations","anchor","decision","pdfOptions","PdfPreview","src","onThumbailSidebarOpen","pdfWorkerSrc","DEFAULT_PDF_WORKER_SRC","pdfjs","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-BRLzv-qj.js","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","t","useCustomTranslations","anchor","decision","pdfOptions","PdfPreview","src","onThumbailSidebarOpen","pdfWorkerSrc","DEFAULT_PDF_WORKER_SRC","pdfjs","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,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("./ZoomPlus-CiQptg56.cjs"),e=require("react"),ee=require("@tanstack/react-query"),M=require("react-pdf"),w=require("./index-Dw-xw-QF.cjs"),H=require("react-virtualized"),G=require("@gouvfr-lasuite/cunningham-react");typeof URL.parse>"u"&&(URL.parse=function(s,t){try{return new URL(s,t)}catch{return null}});const K=Promise;typeof K.withResolvers>"u"&&(K.withResolvers=function(){let s,t;return{promise:new Promise((l,o)=>{s=l,t=o}),resolve:s,reject:t}});const te=({numPages:s,currentPage:t,scrollToPage:r})=>{const[l,o]=e.useState("1"),c=e.useCallback(x=>{const v=Math.max(1,Math.min(s,x));o(String(v)),r(v)},[s,r]),p=e.useCallback(({numPages:x})=>(o("1"),x),[]),_=x=>{o(x.target.value)},h=()=>{const x=parseInt(l,10);if(isNaN(x)){o(String(t));return}c(x)},f=x=>{x.key==="Enter"&&h()},R=e.useRef(c);e.useEffect(()=>{R.current=c},[c]);const P=e.useCallback(x=>{R.current(x.pageNumber)},[]);return{goToPage:c,onDocumentLoadSuccess:p,pageInputValue:l,setPageInputValue:o,handlePageInputChange:_,handlePageInputSubmit:h,handlePageInputKeyDown:f,onItemClick:P}},A=1.414;function ne(){const s=e.useRef(null),t=e.useRef(new Map),r=e.useRef(new Map),[l,o]=e.useState(()=>new Map),c=e.useCallback(f=>{s.current=f,t.current=new Map,r.current=new Map,o(new Map)},[]),p=e.useCallback(f=>{const R=s.current;if(!R||r.current.has(f))return Promise.resolve();const P=t.current.get(f);if(P)return P;const x=R.getPage(f).then(v=>{const u=v.getViewport({scale:1}),i=new Map(r.current);i.set(f,{w:u.width,h:u.height}),r.current=i,o(i)}).catch(v=>{console.warn(`Failed to fetch dimensions for PDF page ${f}`,v)}).finally(()=>{t.current.delete(f)});return t.current.set(f,x),x},[]),_=e.useCallback(f=>{p(f)},[p]),h=e.useCallback(async f=>(await Promise.all(f.map(R=>p(R))),r.current),[p]);return{pageDimensions:l,requestPageDimension:_,ensurePageDimensions:h,setPdf:c}}function se(s){const[t,r]=e.useState(!0),[l,o]=e.useState(s.isOpen);return e.useEffect(()=>{let c;return s.isOpen?(r(!1),c=setTimeout(()=>o(!0),w.OPEN_DELAY)):(o(!1),c=setTimeout(()=>r(!0),w.TRANSITION_DELAY*1.1)),()=>clearTimeout(c)},[s.isOpen]),t?null:n.jsxRuntimeExports.jsx(re,{...s,isOpen:l})}function re({numPages:s,currentPage:t,goToPage:r,isOpen:l,pageDimensions:o,requestPageDimension:c}){const p=e.useRef(null),_=e.useRef(!1),[h,f]=e.useState(t-1);e.useEffect(()=>{if(p.current){if(_.current){_.current=!1;return}p.current.scrollToRow(t-1)}},[t]);const R=e.useCallback(u=>{const i=o.get(u+1);return i?i.h/i.w:A},[o]),P=e.useCallback(({index:u})=>{const g=w.THUMBNAIL_WIDTH*R(u)+w.THUMBNAIL_LABEL_SPACE+w.THUMBNAIL_GAP;return u===s-1?g+w.THUMBNAIL_GAP:g},[R,s]);e.useEffect(()=>{var u;(u=p.current)==null||u.recomputeRowHeights()},[o,s]);const x=e.useCallback(({overscanStartIndex:u,overscanStopIndex:i})=>{for(let g=u;g<=i;g++)c(g+1);h!==void 0&&f(void 0)},[c,h]),v=({index:u,key:i,style:g})=>{const E=u+1,S=R(u),I=n.jsxRuntimeExports.jsx("div",{className:"pdf-preview__thumbnail-skeleton",style:{width:w.THUMBNAIL_WIDTH,height:w.THUMBNAIL_WIDTH*S}});return n.jsxRuntimeExports.jsx("div",{style:{...g,paddingTop:w.THUMBNAIL_GAP,paddingBottom:u===s-1?w.THUMBNAIL_GAP:0,boxSizing:"border-box"},children:n.jsxRuntimeExports.jsxs("button",{"data-thumb-page":E,className:`pdf-preview__thumbnail${t===E?" pdf-preview__thumbnail--active":""}`,onClick:()=>{_.current=!0,r(E)},"aria-label":`Go to page ${E}`,children:[n.jsxRuntimeExports.jsx(M.Thumbnail,{pageNumber:E,width:w.THUMBNAIL_WIDTH,loading:I}),n.jsxRuntimeExports.jsx("span",{className:"pdf-preview__thumbnail-number",children:E})]})},i)};return n.jsxRuntimeExports.jsx("div",{className:`pdf-preview__sidebar${l?"":" pdf-preview__sidebar--closed"}`,children:n.jsxRuntimeExports.jsx(H.AutoSizer,{children:({height:u,width:i})=>n.jsxRuntimeExports.jsx(H.List,{ref:p,height:u,width:i,rowCount:s,rowHeight:P,estimatedRowSize:w.THUMBNAIL_WIDTH*A+w.THUMBNAIL_LABEL_SPACE+w.THUMBNAIL_GAP,overscanRowCount:5,rowRenderer:v,scrollToIndex:h,scrollToAlignment:"center",onRowsRendered:x,style:{outline:"none"}})})})}function oe({numPages:s,pageInputValue:t,onToggleSidebar:r,onPageInputChange:l,onPageInputSubmit:o,onPageInputKeyDown:c,onZoomIn:p,onZoomReset:_,onZoomOut:h}){return n.jsxRuntimeExports.jsxs("div",{className:"file-preview__controls",children:[n.jsxRuntimeExports.jsx(G.Button,{variant:"tertiary",color:"neutral",onClick:r,"aria-label":"Toggle sidebar",size:"small",icon:n.jsxRuntimeExports.jsx(w.LeftSidebarIcon,{})}),n.jsxRuntimeExports.jsx("div",{className:"file-preview__controls__separator"}),n.jsxRuntimeExports.jsx("div",{className:"pdf-preview__page-nav",children:n.jsxRuntimeExports.jsxs("div",{className:"pdf-preview__page-indicator",children:[n.jsxRuntimeExports.jsx(G.Input,{variant:"classic",value:t,onChange:l,onBlur:o,onKeyDown:c,"aria-label":"Current page",size:t.length||1}),n.jsxRuntimeExports.jsxs("span",{className:"pdf-preview__page-total",children:["/ ",s]})]})}),n.jsxRuntimeExports.jsx("div",{className:"file-preview__controls__separator"}),n.jsxRuntimeExports.jsx(w.ZoomControls,{zoomOut:h,zoomIn:p,resetView:_})]})}function ie(s,t=300){let r;const l=(...o)=>{r!==void 0&&clearTimeout(r),r=setTimeout(()=>{s(...o)},t)};return l.cancel=()=>{r!==void 0&&clearTimeout(r)},l}const ce=()=>{const[s,t]=e.useState({width:window.innerWidth,height:window.innerHeight});return e.useEffect(()=>{const r=ie(()=>{t({width:window.innerWidth,height:window.innerHeight})},100);return window.addEventListener("resize",r),()=>{r.cancel(),window.removeEventListener("resize",r)}},[]),s},L=16,V=800,Z=32;function ae({numPages:s,zoom:t,onCurrentPageChange:r,onClick:l,pageDimensions:o,requestPageDimension:c,ensurePageDimensions:p,ref:_}){const h=e.useRef(null),f=e.useRef(t),[R,P]=e.useState(0),x=e.useRef(0),v=e.useRef(0),u=ce(),i=e.useMemo(()=>V+Z>u.width?u.width-Z:V,[u.width]),g=e.useCallback(a=>{const d=o.get(a+1);return d?d.h/d.w:A},[o]),E=e.useCallback(a=>{const d=i*g(a)*t,m=L*t;return a===s-1?d+2*m:d+m},[i,g,t,s]),S=e.useCallback(({index:a})=>E(a),[E]);e.useEffect(()=>{var a;if((a=h.current)==null||a.recomputeRowHeights(),f.current!==t&&h.current){const d=t/f.current,m=Math.round(R*d);h.current.scrollToPosition(m),f.current=t}},[t,i,o,s]);const I=e.useMemo(()=>{if(s===0)return 1;const a=R+x.current/2;let d=0;for(let m=0;m<s;m++){const b=E(m);if(d+b>a)return m+1;d+=b}return s},[R,s,E]);e.useEffect(()=>{r(I)},[I]);const y=e.useCallback(a=>{v.current+=1;const d=v.current,m=[];for(let b=1;b<=a;b++)m.push(b);p(m).then(b=>{if(v.current!==d||!h.current)return;let k=0;for(let T=0;T<a-1;T++){const N=b.get(T+1),F=N?N.h/N.w:A;k+=i*F*t+L*t}h.current.scrollToPosition(k)})},[p,i,t]);e.useImperativeHandle(_,()=>({scrollToPage:y}),[y]);const U=e.useCallback(({scrollTop:a,clientHeight:d})=>{x.current=d,P(a)},[]),B=e.useCallback(({overscanStartIndex:a,overscanStopIndex:d})=>{for(let m=a;m<=d;m++)c(m+1)},[c]),O=({index:a,key:d,style:m})=>{const b=g(a),k=n.jsxRuntimeExports.jsx("div",{className:"pdf-preview__page-skeleton pdf-preview__page-skeleton--measured",style:{height:i*b*t,width:i*t}});return n.jsxRuntimeExports.jsx("div",{"data-preview-backdrop":"true",className:"pdf-preview__page-container",style:{...m,paddingTop:L*t,paddingBottom:a===s-1?L*t:0},children:n.jsxRuntimeExports.jsx(M.Page,{pageNumber:a+1,width:i,scale:t,loading:k})},d)};return n.jsxRuntimeExports.jsx("div",{className:"pdf-preview__container",onClick:l,children:n.jsxRuntimeExports.jsx(H.AutoSizer,{children:({height:a,width:d})=>{const m=Math.max(d,i*t);return n.jsxRuntimeExports.jsx("div",{style:{width:d,height:a},className:"pdf-preview__horizontal-scroll",children:n.jsxRuntimeExports.jsx(H.List,{ref:h,height:a,width:m,rowCount:s,rowHeight:S,estimatedRowSize:i*A*t+L*t,overscanRowCount:3,onScroll:U,onRowsRendered:B,rowRenderer:O,style:{outline:"none"}})})}})})}const le=["https:","http:"],ue=()=>{const s=G.useModals(),{t}=w.useCustomTranslations();return{handlePdfClick:e.useCallback(l=>{const c=l.target.closest("a");if(c&&c.href){if(c.closest("[data-internal-link]"))return;l.preventDefault(),l.stopPropagation();try{const p=new URL(c.href);if(!le.includes(p.protocol))return}catch{return}s.confirmationModal({title:t("components.filePreview.externalLink.title"),children:n.jsxRuntimeExports.jsxs("div",{children:[n.jsxRuntimeExports.jsx("p",{children:t("components.filePreview.externalLink.description")}),n.jsxRuntimeExports.jsx("span",{className:"pdf-preview__external-link",children:c.href}),n.jsxRuntimeExports.jsx("p",{children:t("components.filePreview.externalLink.confirmQuestion")})]}),onDecide:p=>{p==="yes"&&window.open(c.href,"_blank","noopener,noreferrer")}})}},[s,t])}},de={cMapUrl:"/cmaps/",standardFontDataUrl:"/standard_fonts/",wasmUrl:"/wasm/",isEvalSupported:!1};function z({src:s,onThumbailSidebarOpen:t,pdfWorkerSrc:r=w.DEFAULT_PDF_WORKER_SRC}){M.pdfjs.GlobalWorkerOptions.workerSrc=r;const{t:l}=w.useCustomTranslations(),[o,c]=e.useState(1),[p,_]=e.useState(null),[h,f]=e.useState(1),[R,P]=e.useState(!1),x=e.useRef(null),{handlePdfClick:v}=ue(),[u,i]=e.useState(1),{pageDimensions:g,requestPageDimension:E,ensurePageDimensions:S,setPdf:I}=ne(),y=e.useCallback(()=>{i(j=>Math.min(3,j+.25))},[]),U=e.useCallback(()=>{i(j=>Math.max(.5,j-.25))},[]),B=e.useCallback(()=>{i(1)},[]),O=e.useCallback(()=>{P(j=>(t==null||t(!j),!j))},[]),a=e.useCallback(j=>{var C;(C=x.current)==null||C.scrollToPage(j)},[]),{goToPage:d,onDocumentLoadSuccess:m,pageInputValue:b,setPageInputValue:k,handlePageInputChange:T,handlePageInputSubmit:N,handlePageInputKeyDown:F,onItemClick:Q}=te({numPages:o,currentPage:h,scrollToPage:a});e.useEffect(()=>{k(String(h))},[h,k]);const{data:W,error:D}=ee.useQuery({queryKey:["pdf",s],queryFn:async({signal:j})=>{const C=await fetch(s,{credentials:"include",signal:j});if(!C.ok)throw new Error(`Failed to fetch PDF: ${C.status}`);const J=await C.blob(),X=s.split("/").pop()||"document.pdf";return new File([J],X,{type:"application/pdf"})},staleTime:1/0}),Y=e.useCallback(j=>{const C=m(j);c(C),I(j)},[m,I]),$=e.useCallback(j=>{const C=["InvalidPDFException","FormatError","PasswordException","ResponseException"];console.log(j),_(C.includes(j.name)?"generic":"outdated")},[]);if(console.log(D),D!=null&&D.message||p==="generic")return n.jsxRuntimeExports.jsxs("div",{className:"file-preview-unsupported","data-preview-backdrop":"true",children:[n.jsxRuntimeExports.jsx("div",{className:"file-preview-unsupported__icon",children:n.jsxRuntimeExports.jsx(w.Icon,{name:"error",type:n.IconType.OUTLINED,size:48})}),n.jsxRuntimeExports.jsx("p",{className:"file-preview-unsupported__title",children:l("components.filePreview.error.title")}),n.jsxRuntimeExports.jsx("p",{className:"file-preview-unsupported__description",children:l("components.filePreview.error.description")})]});if(p==="outdated")return n.jsxRuntimeExports.jsx(w.OutdatedBrowserPreview,{});const q=n.jsxRuntimeExports.jsx("div",{className:"pdf-preview__container-skeleton",children:n.jsxRuntimeExports.jsx("div",{className:"pdf-preview__page-skeleton"})});return n.jsxRuntimeExports.jsxs("div",{className:"pdf-preview",children:[n.jsxRuntimeExports.jsx("div",{className:"pdf-preview__body","data-preview-backdrop":"true",children:W?n.jsxRuntimeExports.jsxs(M.Document,{file:W,onLoadSuccess:Y,onItemClick:Q,options:de,loading:q,onLoadError:$,children:[n.jsxRuntimeExports.jsx(se,{numPages:o,currentPage:h,goToPage:d,isOpen:R,pageDimensions:g,requestPageDimension:E}),n.jsxRuntimeExports.jsx(ae,{ref:x,numPages:o,zoom:u,onCurrentPageChange:f,onClick:v,pageDimensions:g,requestPageDimension:E,ensurePageDimensions:S})]}):q}),n.jsxRuntimeExports.jsx(oe,{numPages:o,pageInputValue:b,onToggleSidebar:O,onPageInputChange:T,onPageInputSubmit:N,onPageInputKeyDown:F,onZoomIn:y,onZoomReset:B,onZoomOut:U})]})}exports.PdfPreview=z;exports.default=z;
2
- //# sourceMappingURL=PdfPreview-C7taj-bH.cjs.map
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("./ZoomPlus-BKS1WH5u.cjs"),e=require("react"),ee=require("@tanstack/react-query"),M=require("react-pdf"),w=require("./index-7Uvc4sdP.cjs"),H=require("react-virtualized"),G=require("@gouvfr-lasuite/cunningham-react");typeof URL.parse>"u"&&(URL.parse=function(s,t){try{return new URL(s,t)}catch{return null}});const K=Promise;typeof K.withResolvers>"u"&&(K.withResolvers=function(){let s,t;return{promise:new Promise((l,o)=>{s=l,t=o}),resolve:s,reject:t}});const te=({numPages:s,currentPage:t,scrollToPage:r})=>{const[l,o]=e.useState("1"),c=e.useCallback(x=>{const v=Math.max(1,Math.min(s,x));o(String(v)),r(v)},[s,r]),p=e.useCallback(({numPages:x})=>(o("1"),x),[]),_=x=>{o(x.target.value)},h=()=>{const x=parseInt(l,10);if(isNaN(x)){o(String(t));return}c(x)},f=x=>{x.key==="Enter"&&h()},R=e.useRef(c);e.useEffect(()=>{R.current=c},[c]);const P=e.useCallback(x=>{R.current(x.pageNumber)},[]);return{goToPage:c,onDocumentLoadSuccess:p,pageInputValue:l,setPageInputValue:o,handlePageInputChange:_,handlePageInputSubmit:h,handlePageInputKeyDown:f,onItemClick:P}},A=1.414;function ne(){const s=e.useRef(null),t=e.useRef(new Map),r=e.useRef(new Map),[l,o]=e.useState(()=>new Map),c=e.useCallback(f=>{s.current=f,t.current=new Map,r.current=new Map,o(new Map)},[]),p=e.useCallback(f=>{const R=s.current;if(!R||r.current.has(f))return Promise.resolve();const P=t.current.get(f);if(P)return P;const x=R.getPage(f).then(v=>{const u=v.getViewport({scale:1}),i=new Map(r.current);i.set(f,{w:u.width,h:u.height}),r.current=i,o(i)}).catch(v=>{console.warn(`Failed to fetch dimensions for PDF page ${f}`,v)}).finally(()=>{t.current.delete(f)});return t.current.set(f,x),x},[]),_=e.useCallback(f=>{p(f)},[p]),h=e.useCallback(async f=>(await Promise.all(f.map(R=>p(R))),r.current),[p]);return{pageDimensions:l,requestPageDimension:_,ensurePageDimensions:h,setPdf:c}}function se(s){const[t,r]=e.useState(!0),[l,o]=e.useState(s.isOpen);return e.useEffect(()=>{let c;return s.isOpen?(r(!1),c=setTimeout(()=>o(!0),w.OPEN_DELAY)):(o(!1),c=setTimeout(()=>r(!0),w.TRANSITION_DELAY*1.1)),()=>clearTimeout(c)},[s.isOpen]),t?null:n.jsxRuntimeExports.jsx(re,{...s,isOpen:l})}function re({numPages:s,currentPage:t,goToPage:r,isOpen:l,pageDimensions:o,requestPageDimension:c}){const p=e.useRef(null),_=e.useRef(!1),[h,f]=e.useState(t-1);e.useEffect(()=>{if(p.current){if(_.current){_.current=!1;return}p.current.scrollToRow(t-1)}},[t]);const R=e.useCallback(u=>{const i=o.get(u+1);return i?i.h/i.w:A},[o]),P=e.useCallback(({index:u})=>{const g=w.THUMBNAIL_WIDTH*R(u)+w.THUMBNAIL_LABEL_SPACE+w.THUMBNAIL_GAP;return u===s-1?g+w.THUMBNAIL_GAP:g},[R,s]);e.useEffect(()=>{var u;(u=p.current)==null||u.recomputeRowHeights()},[o,s]);const x=e.useCallback(({overscanStartIndex:u,overscanStopIndex:i})=>{for(let g=u;g<=i;g++)c(g+1);h!==void 0&&f(void 0)},[c,h]),v=({index:u,key:i,style:g})=>{const E=u+1,S=R(u),I=n.jsxRuntimeExports.jsx("div",{className:"pdf-preview__thumbnail-skeleton",style:{width:w.THUMBNAIL_WIDTH,height:w.THUMBNAIL_WIDTH*S}});return n.jsxRuntimeExports.jsx("div",{style:{...g,paddingTop:w.THUMBNAIL_GAP,paddingBottom:u===s-1?w.THUMBNAIL_GAP:0,boxSizing:"border-box"},children:n.jsxRuntimeExports.jsxs("button",{"data-thumb-page":E,className:`pdf-preview__thumbnail${t===E?" pdf-preview__thumbnail--active":""}`,onClick:()=>{_.current=!0,r(E)},"aria-label":`Go to page ${E}`,children:[n.jsxRuntimeExports.jsx(M.Thumbnail,{pageNumber:E,width:w.THUMBNAIL_WIDTH,loading:I}),n.jsxRuntimeExports.jsx("span",{className:"pdf-preview__thumbnail-number",children:E})]})},i)};return n.jsxRuntimeExports.jsx("div",{className:`pdf-preview__sidebar${l?"":" pdf-preview__sidebar--closed"}`,children:n.jsxRuntimeExports.jsx(H.AutoSizer,{children:({height:u,width:i})=>n.jsxRuntimeExports.jsx(H.List,{ref:p,height:u,width:i,rowCount:s,rowHeight:P,estimatedRowSize:w.THUMBNAIL_WIDTH*A+w.THUMBNAIL_LABEL_SPACE+w.THUMBNAIL_GAP,overscanRowCount:5,rowRenderer:v,scrollToIndex:h,scrollToAlignment:"center",onRowsRendered:x,style:{outline:"none"}})})})}function oe({numPages:s,pageInputValue:t,onToggleSidebar:r,onPageInputChange:l,onPageInputSubmit:o,onPageInputKeyDown:c,onZoomIn:p,onZoomReset:_,onZoomOut:h}){return n.jsxRuntimeExports.jsxs("div",{className:"file-preview__controls",children:[n.jsxRuntimeExports.jsx(G.Button,{variant:"tertiary",color:"neutral",onClick:r,"aria-label":"Toggle sidebar",size:"small",icon:n.jsxRuntimeExports.jsx(w.LeftSidebarIcon,{})}),n.jsxRuntimeExports.jsx("div",{className:"file-preview__controls__separator"}),n.jsxRuntimeExports.jsx("div",{className:"pdf-preview__page-nav",children:n.jsxRuntimeExports.jsxs("div",{className:"pdf-preview__page-indicator",children:[n.jsxRuntimeExports.jsx(G.Input,{variant:"classic",value:t,onChange:l,onBlur:o,onKeyDown:c,"aria-label":"Current page",size:t.length||1}),n.jsxRuntimeExports.jsxs("span",{className:"pdf-preview__page-total",children:["/ ",s]})]})}),n.jsxRuntimeExports.jsx("div",{className:"file-preview__controls__separator"}),n.jsxRuntimeExports.jsx(w.ZoomControls,{zoomOut:h,zoomIn:p,resetView:_})]})}function ie(s,t=300){let r;const l=(...o)=>{r!==void 0&&clearTimeout(r),r=setTimeout(()=>{s(...o)},t)};return l.cancel=()=>{r!==void 0&&clearTimeout(r)},l}const ce=()=>{const[s,t]=e.useState({width:window.innerWidth,height:window.innerHeight});return e.useEffect(()=>{const r=ie(()=>{t({width:window.innerWidth,height:window.innerHeight})},100);return window.addEventListener("resize",r),()=>{r.cancel(),window.removeEventListener("resize",r)}},[]),s},L=16,V=800,Z=32;function ae({numPages:s,zoom:t,onCurrentPageChange:r,onClick:l,pageDimensions:o,requestPageDimension:c,ensurePageDimensions:p,ref:_}){const h=e.useRef(null),f=e.useRef(t),[R,P]=e.useState(0),x=e.useRef(0),v=e.useRef(0),u=ce(),i=e.useMemo(()=>V+Z>u.width?u.width-Z:V,[u.width]),g=e.useCallback(a=>{const d=o.get(a+1);return d?d.h/d.w:A},[o]),E=e.useCallback(a=>{const d=i*g(a)*t,m=L*t;return a===s-1?d+2*m:d+m},[i,g,t,s]),S=e.useCallback(({index:a})=>E(a),[E]);e.useEffect(()=>{var a;if((a=h.current)==null||a.recomputeRowHeights(),f.current!==t&&h.current){const d=t/f.current,m=Math.round(R*d);h.current.scrollToPosition(m),f.current=t}},[t,i,o,s]);const I=e.useMemo(()=>{if(s===0)return 1;const a=R+x.current/2;let d=0;for(let m=0;m<s;m++){const b=E(m);if(d+b>a)return m+1;d+=b}return s},[R,s,E]);e.useEffect(()=>{r(I)},[I]);const y=e.useCallback(a=>{v.current+=1;const d=v.current,m=[];for(let b=1;b<=a;b++)m.push(b);p(m).then(b=>{if(v.current!==d||!h.current)return;let k=0;for(let T=0;T<a-1;T++){const N=b.get(T+1),F=N?N.h/N.w:A;k+=i*F*t+L*t}h.current.scrollToPosition(k)})},[p,i,t]);e.useImperativeHandle(_,()=>({scrollToPage:y}),[y]);const U=e.useCallback(({scrollTop:a,clientHeight:d})=>{x.current=d,P(a)},[]),B=e.useCallback(({overscanStartIndex:a,overscanStopIndex:d})=>{for(let m=a;m<=d;m++)c(m+1)},[c]),O=({index:a,key:d,style:m})=>{const b=g(a),k=n.jsxRuntimeExports.jsx("div",{className:"pdf-preview__page-skeleton pdf-preview__page-skeleton--measured",style:{height:i*b*t,width:i*t}});return n.jsxRuntimeExports.jsx("div",{"data-preview-backdrop":"true",className:"pdf-preview__page-container",style:{...m,paddingTop:L*t,paddingBottom:a===s-1?L*t:0},children:n.jsxRuntimeExports.jsx(M.Page,{pageNumber:a+1,width:i,scale:t,loading:k})},d)};return n.jsxRuntimeExports.jsx("div",{className:"pdf-preview__container",onClick:l,children:n.jsxRuntimeExports.jsx(H.AutoSizer,{children:({height:a,width:d})=>{const m=Math.max(d,i*t);return n.jsxRuntimeExports.jsx("div",{style:{width:d,height:a},className:"pdf-preview__horizontal-scroll",children:n.jsxRuntimeExports.jsx(H.List,{ref:h,height:a,width:m,rowCount:s,rowHeight:S,estimatedRowSize:i*A*t+L*t,overscanRowCount:3,onScroll:U,onRowsRendered:B,rowRenderer:O,style:{outline:"none"}})})}})})}const le=["https:","http:"],ue=()=>{const s=G.useModals(),{t}=w.useCustomTranslations();return{handlePdfClick:e.useCallback(l=>{const c=l.target.closest("a");if(c&&c.href){if(c.closest("[data-internal-link]"))return;l.preventDefault(),l.stopPropagation();try{const p=new URL(c.href);if(!le.includes(p.protocol))return}catch{return}s.confirmationModal({title:t("components.filePreview.externalLink.title"),children:n.jsxRuntimeExports.jsxs("div",{children:[n.jsxRuntimeExports.jsx("p",{children:t("components.filePreview.externalLink.description")}),n.jsxRuntimeExports.jsx("span",{className:"pdf-preview__external-link",children:c.href}),n.jsxRuntimeExports.jsx("p",{children:t("components.filePreview.externalLink.confirmQuestion")})]}),onDecide:p=>{p==="yes"&&window.open(c.href,"_blank","noopener,noreferrer")}})}},[s,t])}},de={cMapUrl:"/cmaps/",standardFontDataUrl:"/standard_fonts/",wasmUrl:"/wasm/",isEvalSupported:!1};function z({src:s,onThumbailSidebarOpen:t,pdfWorkerSrc:r=w.DEFAULT_PDF_WORKER_SRC}){M.pdfjs.GlobalWorkerOptions.workerSrc=r;const{t:l}=w.useCustomTranslations(),[o,c]=e.useState(1),[p,_]=e.useState(null),[h,f]=e.useState(1),[R,P]=e.useState(!1),x=e.useRef(null),{handlePdfClick:v}=ue(),[u,i]=e.useState(1),{pageDimensions:g,requestPageDimension:E,ensurePageDimensions:S,setPdf:I}=ne(),y=e.useCallback(()=>{i(j=>Math.min(3,j+.25))},[]),U=e.useCallback(()=>{i(j=>Math.max(.5,j-.25))},[]),B=e.useCallback(()=>{i(1)},[]),O=e.useCallback(()=>{P(j=>(t==null||t(!j),!j))},[]),a=e.useCallback(j=>{var C;(C=x.current)==null||C.scrollToPage(j)},[]),{goToPage:d,onDocumentLoadSuccess:m,pageInputValue:b,setPageInputValue:k,handlePageInputChange:T,handlePageInputSubmit:N,handlePageInputKeyDown:F,onItemClick:Q}=te({numPages:o,currentPage:h,scrollToPage:a});e.useEffect(()=>{k(String(h))},[h,k]);const{data:W,error:D}=ee.useQuery({queryKey:["pdf",s],queryFn:async({signal:j})=>{const C=await fetch(s,{credentials:"include",signal:j});if(!C.ok)throw new Error(`Failed to fetch PDF: ${C.status}`);const J=await C.blob(),X=s.split("/").pop()||"document.pdf";return new File([J],X,{type:"application/pdf"})},staleTime:1/0}),Y=e.useCallback(j=>{const C=m(j);c(C),I(j)},[m,I]),$=e.useCallback(j=>{const C=["InvalidPDFException","FormatError","PasswordException","ResponseException"];console.log(j),_(C.includes(j.name)?"generic":"outdated")},[]);if(console.log(D),D!=null&&D.message||p==="generic")return n.jsxRuntimeExports.jsxs("div",{className:"file-preview-unsupported","data-preview-backdrop":"true",children:[n.jsxRuntimeExports.jsx("div",{className:"file-preview-unsupported__icon",children:n.jsxRuntimeExports.jsx(w.Icon,{name:"error",type:n.IconType.OUTLINED,size:48})}),n.jsxRuntimeExports.jsx("p",{className:"file-preview-unsupported__title",children:l("components.filePreview.error.title")}),n.jsxRuntimeExports.jsx("p",{className:"file-preview-unsupported__description",children:l("components.filePreview.error.description")})]});if(p==="outdated")return n.jsxRuntimeExports.jsx(w.OutdatedBrowserPreview,{});const q=n.jsxRuntimeExports.jsx("div",{className:"pdf-preview__container-skeleton",children:n.jsxRuntimeExports.jsx("div",{className:"pdf-preview__page-skeleton"})});return n.jsxRuntimeExports.jsxs("div",{className:"pdf-preview",children:[n.jsxRuntimeExports.jsx("div",{className:"pdf-preview__body","data-preview-backdrop":"true",children:W?n.jsxRuntimeExports.jsxs(M.Document,{file:W,onLoadSuccess:Y,onItemClick:Q,options:de,loading:q,onLoadError:$,children:[n.jsxRuntimeExports.jsx(se,{numPages:o,currentPage:h,goToPage:d,isOpen:R,pageDimensions:g,requestPageDimension:E}),n.jsxRuntimeExports.jsx(ae,{ref:x,numPages:o,zoom:u,onCurrentPageChange:f,onClick:v,pageDimensions:g,requestPageDimension:E,ensurePageDimensions:S})]}):q}),n.jsxRuntimeExports.jsx(oe,{numPages:o,pageInputValue:b,onToggleSidebar:O,onPageInputChange:T,onPageInputSubmit:N,onPageInputKeyDown:F,onZoomIn:y,onZoomReset:B,onZoomOut:U})]})}exports.PdfPreview=z;exports.default=z;
2
+ //# sourceMappingURL=PdfPreview-CiefW-8Q.cjs.map