@sesionario/blocks 1.31.2 → 1.33.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/dist/avatar.cjs +1 -2
- package/dist/avatar.cjs.map +1 -1
- package/dist/avatar.js +1 -2
- package/dist/avatar.js.map +1 -1
- package/dist/charts.cjs +259 -254
- package/dist/charts.cjs.map +1 -1
- package/dist/charts.js +259 -254
- package/dist/charts.js.map +1 -1
- package/dist/index.cjs +3 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +3 -5
- package/dist/index.js.map +1 -1
- package/dist/pdf.cjs +25 -8
- package/dist/pdf.cjs.map +1 -1
- package/dist/pdf.js +25 -8
- package/dist/pdf.js.map +1 -1
- package/package.json +2 -2
package/dist/pdf.cjs
CHANGED
|
@@ -395,6 +395,7 @@ function LazyThumbnail({
|
|
|
395
395
|
pageNumber,
|
|
396
396
|
active,
|
|
397
397
|
width,
|
|
398
|
+
pdf,
|
|
398
399
|
onClick,
|
|
399
400
|
ariaLabel
|
|
400
401
|
}) {
|
|
@@ -431,7 +432,15 @@ function LazyThumbnail({
|
|
|
431
432
|
active ? "border-primary ring-2 ring-primary/30" : "border-border"
|
|
432
433
|
),
|
|
433
434
|
children: [
|
|
434
|
-
visible ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
435
|
+
visible ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
436
|
+
reactPdf.Thumbnail,
|
|
437
|
+
{
|
|
438
|
+
pageNumber,
|
|
439
|
+
width,
|
|
440
|
+
pdf,
|
|
441
|
+
className: "mx-auto"
|
|
442
|
+
}
|
|
443
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
435
444
|
"div",
|
|
436
445
|
{
|
|
437
446
|
className: "mx-auto bg-muted",
|
|
@@ -475,6 +484,7 @@ function PdfViewer({
|
|
|
475
484
|
const [thumbsOpen, setThumbsOpen] = react.useState(false);
|
|
476
485
|
const [loadError, setLoadError] = react.useState(false);
|
|
477
486
|
const [pageDraft, setPageDraft] = react.useState(String(initialPage));
|
|
487
|
+
const [pdfDocument, setPdfDocument] = react.useState(null);
|
|
478
488
|
const viewportRef = react.useRef(null);
|
|
479
489
|
const shellRef = react.useRef(null);
|
|
480
490
|
const pageNumberRef = react.useRef(pageNumber);
|
|
@@ -520,6 +530,7 @@ function PdfViewer({
|
|
|
520
530
|
setFitMode("page");
|
|
521
531
|
setRotation(0);
|
|
522
532
|
setNumPages(0);
|
|
533
|
+
setPdfDocument(null);
|
|
523
534
|
setPageNatural(null);
|
|
524
535
|
setLoadError(false);
|
|
525
536
|
setThumbsOpen(false);
|
|
@@ -656,7 +667,7 @@ function PdfViewer({
|
|
|
656
667
|
const { scale: gestureScale, tx, ty } = transform;
|
|
657
668
|
const transition = snapBack && !isDragging && !prefersReducedMotion() ? `transform ${ZOOM_PAN_SWIPE_SNAP_MS}ms ease-out` : void 0;
|
|
658
669
|
const pageOf = labels.pageOf?.(pageNumber, numPages) ?? (numPages > 0 ? `${pageNumber} / ${numPages}` : "\u2014");
|
|
659
|
-
function renderThumbList(onSelect) {
|
|
670
|
+
function renderThumbList(pdf, onSelect) {
|
|
660
671
|
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-2", children: Array.from({ length: numPages }, (_, i) => {
|
|
661
672
|
const n = i + 1;
|
|
662
673
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -665,6 +676,7 @@ function PdfViewer({
|
|
|
665
676
|
pageNumber: n,
|
|
666
677
|
active: n === pageNumber,
|
|
667
678
|
width: THUMB_WIDTH,
|
|
679
|
+
pdf,
|
|
668
680
|
onClick: () => onSelect(n),
|
|
669
681
|
ariaLabel: labels.thumbnailAria?.(n) ?? `P\xE1gina ${n}`
|
|
670
682
|
},
|
|
@@ -812,17 +824,17 @@ function PdfViewer({
|
|
|
812
824
|
] })
|
|
813
825
|
] }),
|
|
814
826
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative flex min-h-0 flex-1", children: [
|
|
815
|
-
numPages > 0 && /* @__PURE__ */ jsxRuntime.jsx(
|
|
827
|
+
pdfDocument && numPages > 0 && /* @__PURE__ */ jsxRuntime.jsx(
|
|
816
828
|
"div",
|
|
817
829
|
{
|
|
818
830
|
className: cn(
|
|
819
831
|
"hidden w-40 shrink-0 overflow-y-auto border-r bg-background p-2 lg:block",
|
|
820
832
|
!thumbsOpen && "lg:hidden"
|
|
821
833
|
),
|
|
822
|
-
children: renderThumbList(goToPage)
|
|
834
|
+
children: renderThumbList(pdfDocument, goToPage)
|
|
823
835
|
}
|
|
824
836
|
),
|
|
825
|
-
thumbsOpen && numPages > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
837
|
+
thumbsOpen && pdfDocument && numPages > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
826
838
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
827
839
|
"button",
|
|
828
840
|
{
|
|
@@ -832,7 +844,7 @@ function PdfViewer({
|
|
|
832
844
|
onClick: () => setThumbsOpen(false)
|
|
833
845
|
}
|
|
834
846
|
),
|
|
835
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-y-0 left-0 z-30 w-40 overflow-y-auto border-r bg-background p-2 shadow-lg lg:hidden", children: renderThumbList((n) => {
|
|
847
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-y-0 left-0 z-30 w-40 overflow-y-auto border-r bg-background p-2 shadow-lg lg:hidden", children: renderThumbList(pdfDocument, (n) => {
|
|
836
848
|
goToPage(n);
|
|
837
849
|
setThumbsOpen(false);
|
|
838
850
|
}) })
|
|
@@ -879,7 +891,9 @@ function PdfViewer({
|
|
|
879
891
|
reactPdf.Document,
|
|
880
892
|
{
|
|
881
893
|
file: fileUrl,
|
|
882
|
-
onLoadSuccess: (
|
|
894
|
+
onLoadSuccess: (pdf) => {
|
|
895
|
+
const pages = pdf.numPages;
|
|
896
|
+
setPdfDocument(pdf);
|
|
883
897
|
setNumPages(pages);
|
|
884
898
|
setLoadError(false);
|
|
885
899
|
const start = Math.min(Math.max(1, initialPage), pages);
|
|
@@ -887,7 +901,10 @@ function PdfViewer({
|
|
|
887
901
|
setPageDraft(String(start));
|
|
888
902
|
setFitMode(pages === 1 ? "page" : "width");
|
|
889
903
|
},
|
|
890
|
-
onLoadError: () =>
|
|
904
|
+
onLoadError: () => {
|
|
905
|
+
setPdfDocument(null);
|
|
906
|
+
setLoadError(true);
|
|
907
|
+
},
|
|
891
908
|
loading: /* @__PURE__ */ jsxRuntime.jsx(LoadingState, { label: labels.loading ?? "Cargando PDF\u2026" }),
|
|
892
909
|
error: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 flex items-center justify-center p-6 sm:p-8", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
893
910
|
ErrorState,
|
package/dist/pdf.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/utils.ts","../src/hooks/useZoomPanGestures.ts","../src/components/EmptyState.tsx","../src/components/pdf/LazyThumbnail.tsx","../src/components/pdf/worker.ts","../src/components/pdf/PdfViewer.tsx","../src/components/ui/dialog.tsx","../src/components/media/MediaViewerDialog.tsx","../src/components/pdf/PdfViewerDialog.tsx"],"names":["twMerge","clsx","useState","useRef","useCallback","useEffect","dx","dy","jsxs","jsx","Loader2","AlertTriangle","Thumbnail","pdfjs","Fragment","PanelLeftClose","PanelLeft","ChevronLeft","ChevronRight","ZoomOut","ZoomIn","RotateCw","Minimize2","Maximize2","Download","Document","Page","DialogPrimitive","XIcon","X"],"mappings":"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","file":"pdf.cjs","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport {\n\tuseCallback,\n\tuseEffect,\n\tuseRef,\n\tuseState,\n\ttype PointerEvent as ReactPointerEvent,\n\ttype RefObject,\n} from \"react\";\n\nexport const ZOOM_PAN_MIN_SCALE = 1;\nexport const ZOOM_PAN_MAX_SCALE = 4;\nexport const ZOOM_PAN_DOUBLE_TAP_MS = 300;\nexport const ZOOM_PAN_SWIPE_LOCK_PX = 8;\nexport const ZOOM_PAN_SWIPE_COMMIT_PX = 56;\nexport const ZOOM_PAN_SWIPE_SNAP_MS = 180;\n\nexport type ZoomPanTransform = {\n\tscale: number;\n\ttx: number;\n\tty: number;\n};\n\nexport type SwipeDirection = \"prev\" | \"next\";\n\nexport type UseZoomPanGesturesOptions = {\n\tminScale?: number;\n\tmaxScale?: number;\n\t/** When false, horizontal swipe never commits (still pans when zoomed). */\n\tswipeEnabled?: boolean;\n\tonSwipeCommit?: (direction: SwipeDirection) => void;\n\t/** When true, wheel zoom is attached to the stage. Defaults to true. */\n\twheelZoom?: boolean;\n\t/**\n\t * Double-tap behavior at min scale: \"reset\" (default — ImageLightbox) or\n\t * \"toggle\" (zoom in toward tap, then reset).\n\t */\n\tdoubleTap?: \"reset\" | \"toggle\";\n};\n\nexport type UseZoomPanGesturesResult = {\n\tstageRef: RefObject<HTMLDivElement | null>;\n\ttransform: ZoomPanTransform;\n\tisDragging: boolean;\n\tsnapBack: boolean;\n\thandlers: {\n\t\tonPointerDown: (e: ReactPointerEvent<HTMLDivElement>) => void;\n\t\tonPointerMove: (e: ReactPointerEvent<HTMLDivElement>) => void;\n\t\tonPointerUp: (e: ReactPointerEvent<HTMLDivElement>) => void;\n\t\tonPointerCancel: (e: ReactPointerEvent<HTMLDivElement>) => void;\n\t};\n\treset: () => void;\n\tsetScale: (scale: number) => void;\n\tclearSnapBack: () => void;\n};\n\ntype SwipeAxis = \"x\" | \"y\";\n\nconst IDENTITY: ZoomPanTransform = { scale: 1, tx: 0, ty: 0 };\n\nfunction clamp(value: number, min: number, max: number) {\n\treturn Math.min(max, Math.max(min, value));\n}\n\nexport function zoomToward(\n\tprev: ZoomPanTransform,\n\tnextScale: number,\n\toriginX: number,\n\toriginY: number,\n\tminScale = ZOOM_PAN_MIN_SCALE,\n\tmaxScale = ZOOM_PAN_MAX_SCALE,\n): ZoomPanTransform {\n\tconst scale = clamp(nextScale, minScale, maxScale);\n\tif (scale === minScale) return { ...IDENTITY, scale: minScale };\n\tconst ratio = scale / prev.scale;\n\treturn {\n\t\tscale,\n\t\ttx: originX - (originX - prev.tx) * ratio,\n\t\tty: originY - (originY - prev.ty) * ratio,\n\t};\n}\n\nfunction pointerDistance(\n\ta: { x: number; y: number },\n\tb: { x: number; y: number },\n) {\n\treturn Math.hypot(b.x - a.x, b.y - a.y);\n}\n\nexport function prefersReducedMotion() {\n\tif (typeof window === \"undefined\" || !window.matchMedia) return false;\n\treturn window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n}\n\n/**\n * Pointer-driven pinch zoom, double-tap zoom toggle/reset, pan while zoomed,\n * and horizontal swipe-to-commit. Shared by ImageLightbox, MediaCarousel and\n * PdfViewer.\n */\nexport function useZoomPanGestures(\n\toptions: UseZoomPanGesturesOptions = {},\n): UseZoomPanGesturesResult {\n\tconst {\n\t\tminScale = ZOOM_PAN_MIN_SCALE,\n\t\tmaxScale = ZOOM_PAN_MAX_SCALE,\n\t\tswipeEnabled = true,\n\t\tonSwipeCommit,\n\t\twheelZoom = true,\n\t\tdoubleTap = \"reset\",\n\t} = options;\n\n\tconst [transform, setTransform] = useState<ZoomPanTransform>({\n\t\t...IDENTITY,\n\t\tscale: minScale,\n\t});\n\tconst transformRef = useRef(transform);\n\ttransformRef.current = transform;\n\n\tconst [isSwipeDragging, setIsSwipeDragging] = useState(false);\n\tconst [snapBack, setSnapBack] = useState(false);\n\n\tconst stageRef = useRef<HTMLDivElement>(null);\n\tconst pointersRef = useRef(new Map<number, { x: number; y: number }>());\n\tconst pinchStartRef = useRef<{\n\t\tdistance: number;\n\t\toriginX: number;\n\t\toriginY: number;\n\t\ttransform: ZoomPanTransform;\n\t} | null>(null);\n\tconst panRef = useRef<{\n\t\tpointerId: number;\n\t\tstartX: number;\n\t\tstartY: number;\n\t\toriginTx: number;\n\t\toriginTy: number;\n\t\tmoved: boolean;\n\t} | null>(null);\n\tconst swipeRef = useRef<{\n\t\tpointerId: number;\n\t\tstartX: number;\n\t\tstartY: number;\n\t\tmoved: boolean;\n\t\taxis: SwipeAxis | null;\n\t} | null>(null);\n\tconst lastTapRef = useRef<{ time: number; x: number; y: number } | null>(\n\t\tnull,\n\t);\n\tconst onSwipeCommitRef = useRef(onSwipeCommit);\n\tonSwipeCommitRef.current = onSwipeCommit;\n\tconst swipeEnabledRef = useRef(swipeEnabled);\n\tswipeEnabledRef.current = swipeEnabled;\n\tconst minScaleRef = useRef(minScale);\n\tminScaleRef.current = minScale;\n\tconst maxScaleRef = useRef(maxScale);\n\tmaxScaleRef.current = maxScale;\n\tconst doubleTapRef = useRef(doubleTap);\n\tdoubleTapRef.current = doubleTap;\n\n\tconst reset = useCallback(() => {\n\t\tsetTransform({ ...IDENTITY, scale: minScaleRef.current });\n\t\tsetIsSwipeDragging(false);\n\t\tsetSnapBack(false);\n\t}, []);\n\n\tconst setScale = useCallback((next: number) => {\n\t\tsetTransform((prev) =>\n\t\t\tzoomToward(prev, next, 0, 0, minScaleRef.current, maxScaleRef.current),\n\t\t);\n\t}, []);\n\n\tconst clearSnapBack = useCallback(() => {\n\t\tsetSnapBack(false);\n\t}, []);\n\n\tconst stageOrigin = useCallback((clientX: number, clientY: number) => {\n\t\tconst stage = stageRef.current;\n\t\tif (!stage) return { x: 0, y: 0 };\n\t\tconst rect = stage.getBoundingClientRect();\n\t\treturn {\n\t\t\tx: clientX - rect.left - rect.width / 2,\n\t\t\ty: clientY - rect.top - rect.height / 2,\n\t\t};\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (!wheelZoom) return;\n\t\tconst stage = stageRef.current;\n\t\tif (!stage) return;\n\n\t\tconst handleWheel = (e: WheelEvent) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tconst prev = transformRef.current;\n\t\t\tconst factor = e.deltaY > 0 ? 0.9 : 1.1;\n\t\t\tconst { x, y } = stageOrigin(e.clientX, e.clientY);\n\t\t\tsetTransform(\n\t\t\t\tzoomToward(\n\t\t\t\t\tprev,\n\t\t\t\t\tprev.scale * factor,\n\t\t\t\t\tx,\n\t\t\t\t\ty,\n\t\t\t\t\tminScaleRef.current,\n\t\t\t\t\tmaxScaleRef.current,\n\t\t\t\t),\n\t\t\t);\n\t\t};\n\n\t\tstage.addEventListener(\"wheel\", handleWheel, { passive: false });\n\t\treturn () => stage.removeEventListener(\"wheel\", handleWheel);\n\t}, [stageOrigin, wheelZoom]);\n\n\tfunction clearSwipe() {\n\t\tswipeRef.current = null;\n\t\tsetIsSwipeDragging(false);\n\t}\n\n\tfunction beginPinch() {\n\t\tconst pts = [...pointersRef.current.values()];\n\t\tconst [a, b] = pts;\n\t\tif (!a || !b) return;\n\t\tconst midX = (a.x + b.x) / 2;\n\t\tconst midY = (a.y + b.y) / 2;\n\t\tconst { x, y } = stageOrigin(midX, midY);\n\t\tpinchStartRef.current = {\n\t\t\tdistance: Math.max(pointerDistance(a, b), 1),\n\t\t\toriginX: x,\n\t\t\toriginY: y,\n\t\t\ttransform: { ...transformRef.current },\n\t\t};\n\t\tpanRef.current = null;\n\t\tclearSwipe();\n\t\tsetSnapBack(false);\n\t}\n\n\tfunction onPointerDown(e: ReactPointerEvent<HTMLDivElement>) {\n\t\te.stopPropagation();\n\t\tconst stage = stageRef.current;\n\t\tif (!stage) return;\n\n\t\tif (typeof stage.setPointerCapture === \"function\") {\n\t\t\tstage.setPointerCapture(e.pointerId);\n\t\t}\n\t\tpointersRef.current.set(e.pointerId, { x: e.clientX, y: e.clientY });\n\t\tsetSnapBack(false);\n\n\t\tif (pointersRef.current.size === 2) {\n\t\t\tbeginPinch();\n\t\t\treturn;\n\t\t}\n\n\t\tif (transformRef.current.scale > minScaleRef.current) {\n\t\t\tpanRef.current = {\n\t\t\t\tpointerId: e.pointerId,\n\t\t\t\tstartX: e.clientX,\n\t\t\t\tstartY: e.clientY,\n\t\t\t\toriginTx: transformRef.current.tx,\n\t\t\t\toriginTy: transformRef.current.ty,\n\t\t\t\tmoved: false,\n\t\t\t};\n\t\t\treturn;\n\t\t}\n\n\t\tif (swipeEnabledRef.current) {\n\t\t\tswipeRef.current = {\n\t\t\t\tpointerId: e.pointerId,\n\t\t\t\tstartX: e.clientX,\n\t\t\t\tstartY: e.clientY,\n\t\t\t\tmoved: false,\n\t\t\t\taxis: null,\n\t\t\t};\n\t\t\tsetIsSwipeDragging(true);\n\t\t}\n\t}\n\n\tfunction onPointerMove(e: ReactPointerEvent<HTMLDivElement>) {\n\t\tif (!pointersRef.current.has(e.pointerId)) return;\n\t\tpointersRef.current.set(e.pointerId, { x: e.clientX, y: e.clientY });\n\n\t\tconst pinchStart = pinchStartRef.current;\n\t\tif (pointersRef.current.size >= 2 && pinchStart) {\n\t\t\tconst pts = [...pointersRef.current.values()];\n\t\t\tconst [a, b] = pts;\n\t\t\tif (!a || !b) return;\n\t\t\tconst distance = Math.max(pointerDistance(a, b), 1);\n\t\t\tconst nextScale =\n\t\t\t\tpinchStart.transform.scale * (distance / pinchStart.distance);\n\t\t\tsetTransform(\n\t\t\t\tzoomToward(\n\t\t\t\t\tpinchStart.transform,\n\t\t\t\t\tnextScale,\n\t\t\t\t\tpinchStart.originX,\n\t\t\t\t\tpinchStart.originY,\n\t\t\t\t\tminScaleRef.current,\n\t\t\t\t\tmaxScaleRef.current,\n\t\t\t\t),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst pan = panRef.current;\n\t\tif (pan && pan.pointerId === e.pointerId) {\n\t\t\tconst dx = e.clientX - pan.startX;\n\t\t\tconst dy = e.clientY - pan.startY;\n\t\t\tif (Math.abs(dx) > 2 || Math.abs(dy) > 2) pan.moved = true;\n\t\t\tsetTransform((prev) => ({\n\t\t\t\t...prev,\n\t\t\t\ttx: pan.originTx + dx,\n\t\t\t\tty: pan.originTy + dy,\n\t\t\t}));\n\t\t\treturn;\n\t\t}\n\n\t\tconst swipe = swipeRef.current;\n\t\tif (!swipe || swipe.pointerId !== e.pointerId) return;\n\n\t\tconst dx = e.clientX - swipe.startX;\n\t\tconst dy = e.clientY - swipe.startY;\n\t\tif (Math.abs(dx) > 2 || Math.abs(dy) > 2) swipe.moved = true;\n\n\t\tif (swipe.axis === null) {\n\t\t\tconst absX = Math.abs(dx);\n\t\t\tconst absY = Math.abs(dy);\n\t\t\tif (absX < ZOOM_PAN_SWIPE_LOCK_PX && absY < ZOOM_PAN_SWIPE_LOCK_PX) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tswipe.axis = absX >= absY ? \"x\" : \"y\";\n\t\t\tif (swipe.axis === \"y\") {\n\t\t\t\tclearSwipe();\n\t\t\t\tsetTransform({ ...IDENTITY, scale: minScaleRef.current });\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (swipe.axis === \"x\") {\n\t\t\tsetTransform({\n\t\t\t\tscale: minScaleRef.current,\n\t\t\t\ttx: dx,\n\t\t\t\tty: 0,\n\t\t\t});\n\t\t}\n\t}\n\n\tfunction finishSwipe(e: ReactPointerEvent<HTMLDivElement>) {\n\t\tconst swipe = swipeRef.current;\n\t\tif (!swipe || swipe.pointerId !== e.pointerId) return false;\n\n\t\tconst dx = e.clientX - swipe.startX;\n\t\tconst wasMoved = swipe.moved;\n\t\tconst axis = swipe.axis;\n\t\tclearSwipe();\n\n\t\tif (axis === \"x\" && Math.abs(dx) >= ZOOM_PAN_SWIPE_COMMIT_PX) {\n\t\t\tonSwipeCommitRef.current?.(dx < 0 ? \"next\" : \"prev\");\n\t\t\treturn true;\n\t\t}\n\n\t\tif (wasMoved || transformRef.current.tx !== 0) {\n\t\t\tif (!prefersReducedMotion()) setSnapBack(true);\n\t\t\tsetTransform({ ...IDENTITY, scale: minScaleRef.current });\n\t\t}\n\t\treturn wasMoved;\n\t}\n\n\tfunction onPointerUp(e: ReactPointerEvent<HTMLDivElement>) {\n\t\tconst stage = stageRef.current;\n\t\tif (\n\t\t\tstage &&\n\t\t\ttypeof stage.hasPointerCapture === \"function\" &&\n\t\t\tstage.hasPointerCapture(e.pointerId) &&\n\t\t\ttypeof stage.releasePointerCapture === \"function\"\n\t\t) {\n\t\t\tstage.releasePointerCapture(e.pointerId);\n\t\t}\n\t\tpointersRef.current.delete(e.pointerId);\n\n\t\tif (pointersRef.current.size < 2) {\n\t\t\tpinchStartRef.current = null;\n\t\t}\n\t\tif (pointersRef.current.size === 1) {\n\t\t\tconst remaining = [...pointersRef.current.entries()][0];\n\t\t\tif (remaining && transformRef.current.scale > minScaleRef.current) {\n\t\t\t\tconst [pointerId, point] = remaining;\n\t\t\t\tpanRef.current = {\n\t\t\t\t\tpointerId,\n\t\t\t\t\tstartX: point.x,\n\t\t\t\t\tstartY: point.y,\n\t\t\t\t\toriginTx: transformRef.current.tx,\n\t\t\t\t\toriginTy: transformRef.current.ty,\n\t\t\t\t\tmoved: true,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tconst swipeHandled = finishSwipe(e);\n\t\tif (swipeHandled) return;\n\n\t\tconst pan = panRef.current;\n\t\tif (pan && pan.pointerId === e.pointerId) {\n\t\t\tconst wasMoved = pan.moved;\n\t\t\tpanRef.current = null;\n\t\t\tif (wasMoved) return;\n\t\t}\n\n\t\tif (pointersRef.current.size === 0 && e.button === 0) {\n\t\t\tconst now = Date.now();\n\t\t\tconst last = lastTapRef.current;\n\t\t\tif (\n\t\t\t\tlast &&\n\t\t\t\tnow - last.time < ZOOM_PAN_DOUBLE_TAP_MS &&\n\t\t\t\tMath.hypot(e.clientX - last.x, e.clientY - last.y) < 24\n\t\t\t) {\n\t\t\t\tlastTapRef.current = null;\n\t\t\t\tif (\n\t\t\t\t\tdoubleTapRef.current === \"toggle\" &&\n\t\t\t\t\ttransformRef.current.scale <= minScaleRef.current\n\t\t\t\t) {\n\t\t\t\t\tconst { x, y } = stageOrigin(e.clientX, e.clientY);\n\t\t\t\t\tsetTransform(\n\t\t\t\t\t\tzoomToward(\n\t\t\t\t\t\t\ttransformRef.current,\n\t\t\t\t\t\t\tMath.min(2, maxScaleRef.current),\n\t\t\t\t\t\t\tx,\n\t\t\t\t\t\t\ty,\n\t\t\t\t\t\t\tminScaleRef.current,\n\t\t\t\t\t\t\tmaxScaleRef.current,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\treset();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlastTapRef.current = { time: now, x: e.clientX, y: e.clientY };\n\t\t}\n\t}\n\n\treturn {\n\t\tstageRef,\n\t\ttransform,\n\t\tisDragging: isSwipeDragging,\n\t\tsnapBack,\n\t\thandlers: {\n\t\t\tonPointerDown,\n\t\t\tonPointerMove,\n\t\t\tonPointerUp,\n\t\t\tonPointerCancel: onPointerUp,\n\t\t},\n\t\treset,\n\t\tsetScale,\n\t\tclearSnapBack,\n\t};\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { AlertTriangle, Inbox, Loader2 } from \"lucide-react\";\n\nimport { cn } from \"../lib/utils\";\nimport {\n\tEmpty,\n\tEmptyContent,\n\tEmptyDescription,\n\tEmptyHeader,\n\tEmptyMedia,\n\tEmptyTitle,\n} from \"./ui/empty\";\n\nexport function LoadingState({\n\tlabel = \"Cargando…\",\n\tclassName,\n}: {\n\tlabel?: string;\n\tclassName?: string;\n}) {\n\treturn (\n\t\t<div\n\t\t\trole=\"status\"\n\t\t\taria-live=\"polite\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex items-center justify-center gap-2 py-12 text-sm text-muted-foreground\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<Loader2 className=\"size-4 animate-spin\" aria-hidden=\"true\" />\n\t\t\t<span>{label}</span>\n\t\t</div>\n\t);\n}\n\nexport function ErrorState({\n\ttitle = \"Algo salió mal\",\n\tdescription,\n\taction,\n\tclassName,\n}: {\n\ttitle?: string;\n\tdescription?: string;\n\taction?: React.ReactNode;\n\tclassName?: string;\n}) {\n\treturn (\n\t\t<div\n\t\t\trole=\"alert\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-col items-center gap-3 rounded-xl border border-dashed border-destructive/40 bg-destructive/5 py-12 text-center\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<AlertTriangle className=\"size-6 text-destructive\" aria-hidden=\"true\" />\n\t\t\t<div>\n\t\t\t\t<p className=\"font-medium\">{title}</p>\n\t\t\t\t{description ? (\n\t\t\t\t\t<p className=\"mt-1 text-sm text-muted-foreground\">{description}</p>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t\t{action}\n\t\t</div>\n\t);\n}\n\n/** Accept any icon component with a className prop — avoids LucideIcon\n * version skew between blocks peers and consuming apps. */\nexport type EmptyStateIcon = React.ComponentType<{\n\tclassName?: string;\n\t\"aria-hidden\"?: boolean | \"true\" | \"false\";\n}>;\n\nexport type EmptyStateProps = {\n\ttitle: string;\n\tdescription?: string;\n\taction?: React.ReactNode;\n\ticon?: EmptyStateIcon;\n\tvariant?: \"default\" | \"compact\";\n\tclassName?: string;\n};\n\nexport function EmptyState({\n\ttitle,\n\tdescription,\n\taction,\n\ticon: Icon = Inbox,\n\tvariant = \"default\",\n\tclassName,\n}: EmptyStateProps) {\n\tconst isCompact = variant === \"compact\";\n\n\treturn (\n\t\t<Empty\n\t\t\tclassName={cn(\n\t\t\t\t\"gap-3\",\n\t\t\t\tisCompact\n\t\t\t\t\t? \"flex-none rounded-none px-4 py-6\"\n\t\t\t\t\t: \"flex-none rounded-xl border border-dashed px-6 py-12\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<EmptyHeader className=\"gap-3\">\n\t\t\t\t<EmptyMedia\n\t\t\t\t\tvariant=\"icon\"\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"mb-0 bg-transparent text-muted-foreground\",\n\t\t\t\t\t\tisCompact\n\t\t\t\t\t\t\t? \"size-auto [&_svg:not([class*='size-'])]:size-8 [&_svg]:opacity-50\"\n\t\t\t\t\t\t\t: \"size-auto [&_svg:not([class*='size-'])]:size-6\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<Icon aria-hidden=\"true\" />\n\t\t\t\t</EmptyMedia>\n\t\t\t\t<EmptyTitle\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"font-medium tracking-normal\",\n\t\t\t\t\t\tisCompact ? \"text-sm\" : \"text-base\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{title}\n\t\t\t\t</EmptyTitle>\n\t\t\t\t{description ? (\n\t\t\t\t\t<EmptyDescription className=\"mt-0\">{description}</EmptyDescription>\n\t\t\t\t) : null}\n\t\t\t</EmptyHeader>\n\t\t\t{action ? <EmptyContent className=\"gap-0\">{action}</EmptyContent> : null}\n\t\t</Empty>\n\t);\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { Thumbnail } from \"react-pdf\";\n\nimport { cn } from \"../../lib/utils\";\n\ntype LazyThumbnailProps = {\n\tpageNumber: number;\n\tactive: boolean;\n\twidth: number;\n\tonClick: () => void;\n\tariaLabel: string;\n};\n\n/**\n * Renders a react-pdf Thumbnail only after the slot intersects the viewport,\n * so large documents do not mount hundreds of canvases up front.\n */\nexport function LazyThumbnail({\n\tpageNumber,\n\tactive,\n\twidth,\n\tonClick,\n\tariaLabel,\n}: LazyThumbnailProps) {\n\tconst ref = useRef<HTMLButtonElement>(null);\n\tconst [visible, setVisible] = useState(false);\n\n\tuseEffect(() => {\n\t\tconst node = ref.current;\n\t\tif (!node || typeof IntersectionObserver === \"undefined\") {\n\t\t\tsetVisible(true);\n\t\t\treturn;\n\t\t}\n\t\tconst observer = new IntersectionObserver(\n\t\t\t(entries) => {\n\t\t\t\tif (entries.some((e) => e.isIntersecting)) {\n\t\t\t\t\tsetVisible(true);\n\t\t\t\t\tobserver.disconnect();\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ rootMargin: \"120px 0px\" },\n\t\t);\n\t\tobserver.observe(node);\n\t\treturn () => observer.disconnect();\n\t}, []);\n\n\treturn (\n\t\t<button\n\t\t\tref={ref}\n\t\t\ttype=\"button\"\n\t\t\tonClick={onClick}\n\t\t\taria-label={ariaLabel}\n\t\t\taria-current={active ? \"page\" : undefined}\n\t\t\tclassName={cn(\n\t\t\t\t\"block w-full overflow-hidden rounded-md border bg-background p-1 transition-colors hover:border-primary\",\n\t\t\t\tactive ? \"border-primary ring-2 ring-primary/30\" : \"border-border\",\n\t\t\t)}\n\t\t>\n\t\t\t{visible ? (\n\t\t\t\t<Thumbnail pageNumber={pageNumber} width={width} className=\"mx-auto\" />\n\t\t\t) : (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"mx-auto bg-muted\"\n\t\t\t\t\tstyle={{ width, height: Math.round(width * 1.4) }}\n\t\t\t\t\taria-hidden\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<span className=\"mt-1 block text-center text-[10px] text-muted-foreground\">\n\t\t\t\t{pageNumber}\n\t\t\t</span>\n\t\t</button>\n\t);\n}\n","import { pdfjs } from \"react-pdf\";\n\nimport \"react-pdf/dist/Page/TextLayer.css\";\nimport \"react-pdf/dist/Page/AnnotationLayer.css\";\n\nlet configuredSrc: string | null = null;\n\n/**\n * Apply the consumer-resolved pdfjs worker URL once. Bundler-specific\n * `new URL(..., import.meta.url)` must run in the app, not inside this\n * pre-built package.\n */\nexport function configurePdfWorker(workerSrc: string) {\n\tif (!workerSrc || configuredSrc === workerSrc) return;\n\tpdfjs.GlobalWorkerOptions.workerSrc = workerSrc;\n\tconfiguredSrc = workerSrc;\n}\n","\"use client\";\n\nimport {\n\tuseCallback,\n\tuseEffect,\n\tuseRef,\n\tuseState,\n\ttype FormEvent,\n\ttype ReactNode,\n} from \"react\";\nimport { Document, Page } from \"react-pdf\";\nimport {\n\tChevronLeft,\n\tChevronRight,\n\tDownload,\n\tMaximize2,\n\tMinimize2,\n\tPanelLeft,\n\tPanelLeftClose,\n\tRotateCw,\n\tZoomIn,\n\tZoomOut,\n} from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\nimport {\n\tZOOM_PAN_MIN_SCALE,\n\tZOOM_PAN_SWIPE_SNAP_MS,\n\tprefersReducedMotion,\n\tuseZoomPanGestures,\n} from \"../../hooks/useZoomPanGestures\";\nimport { ErrorState, LoadingState } from \"../EmptyState\";\nimport { LazyThumbnail } from \"./LazyThumbnail\";\nimport { configurePdfWorker } from \"./worker\";\n\nconst ZOOM_STEPS = [0.5, 0.75, 1, 1.25, 1.5, 2, 2.5, 3];\nconst THUMB_WIDTH = 120;\n\nexport type PdfViewerLabels = {\n\tloading?: string;\n\tloadError?: string;\n\tloadErrorDescription?: string;\n\tpreviousPage?: string;\n\tnextPage?: string;\n\tzoomIn?: string;\n\tzoomOut?: string;\n\tfitWidth?: string;\n\tfitPage?: string;\n\trotate?: string;\n\tenterFullscreen?: string;\n\texitFullscreen?: string;\n\tdownload?: string;\n\tdownloadAria?: string;\n\tshowThumbnails?: string;\n\thideThumbnails?: string;\n\tpageJumpAria?: string;\n\tthumbnailAria?: (page: number) => string;\n\tpageOf?: (current: number, total: number) => string;\n};\n\nexport type PdfViewerProps = {\n\tfileUrl: string;\n\tfileName: string;\n\tdownloadUrl?: string;\n\t/** Consumer-resolved pdfjs worker URL — bundler-specific. */\n\tworkerSrc: string;\n\tinitialPage?: number;\n\tclassName?: string;\n\tlabels: PdfViewerLabels;\n\t/**\n\t * Optional leading toolbar control (e.g. close / back). Rendered before\n\t * thumbnails so host chrome does not float over PDF tools.\n\t */\n\tcloseAction?: ReactNode;\n};\n\n/**\n * Full-featured single-page PDF surface: collapsible lazy thumbnail rail,\n * page nav + jump, zoom/fit/rotate, pinch+swipe gestures, fullscreen and\n * download. Layout-agnostic — fills its parent.\n */\nexport function PdfViewer({\n\tfileUrl,\n\tfileName,\n\tdownloadUrl,\n\tworkerSrc,\n\tinitialPage = 1,\n\tclassName,\n\tlabels,\n\tcloseAction,\n}: PdfViewerProps) {\n\tconfigurePdfWorker(workerSrc);\n\n\tconst [numPages, setNumPages] = useState(0);\n\tconst [pageNumber, setPageNumber] = useState(initialPage);\n\tconst [zoomIndex, setZoomIndex] = useState(2);\n\tconst [fitMode, setFitMode] = useState<\"width\" | \"page\">(\"page\");\n\tconst [rotation, setRotation] = useState(0);\n\tconst [containerWidth, setContainerWidth] = useState(0);\n\tconst [containerHeight, setContainerHeight] = useState(0);\n\tconst [pageNatural, setPageNatural] = useState<{\n\t\twidth: number;\n\t\theight: number;\n\t} | null>(null);\n\tconst [isFullscreen, setIsFullscreen] = useState(false);\n\tconst [thumbsOpen, setThumbsOpen] = useState(false);\n\tconst [loadError, setLoadError] = useState(false);\n\tconst [pageDraft, setPageDraft] = useState(String(initialPage));\n\n\tconst viewportRef = useRef<HTMLDivElement>(null);\n\tconst shellRef = useRef<HTMLDivElement>(null);\n\tconst pageNumberRef = useRef(pageNumber);\n\tpageNumberRef.current = pageNumber;\n\tconst numPagesRef = useRef(numPages);\n\tnumPagesRef.current = numPages;\n\n\tconst baseScale = ZOOM_STEPS[zoomIndex] ?? 1;\n\n\tconst goToPage = useCallback((next: number) => {\n\t\tconst total = numPagesRef.current;\n\t\tif (total <= 0) return;\n\t\tconst clamped = Math.min(Math.max(1, next), total);\n\t\tsetPageNumber(clamped);\n\t\tsetPageDraft(String(clamped));\n\t}, []);\n\n\tconst onSwipeCommit = useCallback(\n\t\t(direction: \"prev\" | \"next\") => {\n\t\t\tif (direction === \"next\") {\n\t\t\t\tgoToPage(pageNumberRef.current + 1);\n\t\t\t} else {\n\t\t\t\tgoToPage(pageNumberRef.current - 1);\n\t\t\t}\n\t\t},\n\t\t[goToPage],\n\t);\n\n\tconst {\n\t\tstageRef,\n\t\ttransform,\n\t\tisDragging,\n\t\tsnapBack,\n\t\thandlers,\n\t\treset,\n\t\tclearSnapBack,\n\t} = useZoomPanGestures({\n\t\tswipeEnabled: numPages > 1,\n\t\tonSwipeCommit,\n\t\twheelZoom: true,\n\t\tdoubleTap: \"toggle\",\n\t});\n\n\tuseEffect(() => {\n\t\tsetPageNumber(initialPage);\n\t\tsetPageDraft(String(initialPage));\n\t\tsetZoomIndex(2);\n\t\tsetFitMode(\"page\");\n\t\tsetRotation(0);\n\t\tsetNumPages(0);\n\t\tsetPageNatural(null);\n\t\tsetLoadError(false);\n\t\tsetThumbsOpen(false);\n\t\treset();\n\t}, [fileUrl, initialPage, reset]);\n\n\tuseEffect(() => {\n\t\treset();\n\t\tsetPageNatural(null);\n\t}, [pageNumber, reset]);\n\n\tconst measureViewport = useCallback(() => {\n\t\tconst el = viewportRef.current;\n\t\tif (!el) return;\n\t\t// Ignore zero sizes so a pre-layout rAF/clientWidth=0 read cannot\n\t\t// overwrite a good ResizeObserver measurement (jsdom + dialog open).\n\t\tconst w = el.clientWidth;\n\t\tconst h = el.clientHeight;\n\t\tif (w > 0) setContainerWidth(w);\n\t\tif (h > 0) setContainerHeight(h);\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (!viewportRef.current) return;\n\t\tconst el = viewportRef.current;\n\t\tconst observer = new ResizeObserver((entries) => {\n\t\t\tconst rect = entries[0]?.contentRect;\n\t\t\tif (!rect) return;\n\t\t\tif (rect.width > 0) setContainerWidth(rect.width);\n\t\t\tif (rect.height > 0) setContainerHeight(rect.height);\n\t\t});\n\t\tobserver.observe(el);\n\t\tmeasureViewport();\n\t\t// Dialog shells animate (zoom-in-95); remeasure after layout settles.\n\t\tconst raf = requestAnimationFrame(() => {\n\t\t\tmeasureViewport();\n\t\t\trequestAnimationFrame(measureViewport);\n\t\t});\n\t\treturn () => {\n\t\t\tobserver.disconnect();\n\t\t\tcancelAnimationFrame(raf);\n\t\t};\n\t}, [measureViewport]);\n\n\tuseEffect(() => {\n\t\tmeasureViewport();\n\t}, [thumbsOpen, measureViewport]);\n\n\tuseEffect(() => {\n\t\tfunction onFullscreenChange() {\n\t\t\tsetIsFullscreen(document.fullscreenElement === shellRef.current);\n\t\t\t// Fullscreen toggles change available space; remeasure next frame.\n\t\t\trequestAnimationFrame(measureViewport);\n\t\t}\n\t\tdocument.addEventListener(\"fullscreenchange\", onFullscreenChange);\n\t\treturn () =>\n\t\t\tdocument.removeEventListener(\"fullscreenchange\", onFullscreenChange);\n\t}, [measureViewport]);\n\n\tuseEffect(() => {\n\t\tfunction onKeyDown(e: KeyboardEvent) {\n\t\t\tconst target = e.target as HTMLElement | null;\n\t\t\tif (\n\t\t\t\ttarget &&\n\t\t\t\t(target.tagName === \"INPUT\" ||\n\t\t\t\t\ttarget.tagName === \"TEXTAREA\" ||\n\t\t\t\t\ttarget.isContentEditable)\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tswitch (e.key) {\n\t\t\t\tcase \"ArrowLeft\":\n\t\t\t\tcase \"PageUp\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tgoToPage(pageNumberRef.current - 1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"ArrowRight\":\n\t\t\t\tcase \"PageDown\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tgoToPage(pageNumberRef.current + 1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"Home\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tgoToPage(1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"End\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tgoToPage(numPagesRef.current);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"+\":\n\t\t\t\tcase \"=\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetZoomIndex((i) => Math.min(i + 1, ZOOM_STEPS.length - 1));\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"-\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetZoomIndex((i) => Math.max(i - 1, 0));\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\twindow.addEventListener(\"keydown\", onKeyDown);\n\t\treturn () => window.removeEventListener(\"keydown\", onKeyDown);\n\t}, [goToPage]);\n\n\tconst fitWidth = useCallback(() => {\n\t\tsetFitMode(\"width\");\n\t\tsetZoomIndex(2);\n\t\treset();\n\t}, [reset]);\n\n\tconst fitPage = useCallback(() => {\n\t\tsetFitMode(\"page\");\n\t\tsetZoomIndex(2);\n\t\treset();\n\t}, [reset]);\n\n\tconst zoomIn = useCallback(() => {\n\t\tsetZoomIndex((i) => Math.min(i + 1, ZOOM_STEPS.length - 1));\n\t}, []);\n\n\tconst zoomOut = useCallback(() => {\n\t\tsetZoomIndex((i) => Math.max(i - 1, 0));\n\t}, []);\n\n\tconst toggleFullscreen = useCallback(async () => {\n\t\tif (!shellRef.current) return;\n\t\tif (document.fullscreenElement === shellRef.current) {\n\t\t\tawait document.exitFullscreen();\n\t\t} else {\n\t\t\tawait shellRef.current.requestFullscreen();\n\t\t}\n\t}, []);\n\n\tfunction submitPageJump(e: FormEvent) {\n\t\te.preventDefault();\n\t\tconst parsed = Number.parseInt(pageDraft, 10);\n\t\tif (Number.isFinite(parsed)) goToPage(parsed);\n\t\telse setPageDraft(String(pageNumber));\n\t}\n\n\tconst PAD = 32;\n\tconst availW = Math.max(containerWidth - PAD, 240);\n\tconst availH = Math.max(containerHeight - PAD, 240);\n\tconst rotated =\n\t\trotation % 180 !== 0 && pageNatural\n\t\t\t? { width: pageNatural.height, height: pageNatural.width }\n\t\t\t: pageNatural;\n\n\tlet pageWidth: number | undefined;\n\tif (fitMode === \"width\" || !rotated) {\n\t\tpageWidth = availW * baseScale;\n\t} else {\n\t\tconst scaleToFit = Math.min(\n\t\t\tavailW / rotated.width,\n\t\t\tavailH / rotated.height,\n\t\t);\n\t\tpageWidth = rotated.width * scaleToFit * baseScale;\n\t}\n\n\tconst rawDownload = downloadUrl ?? fileUrl;\n\tconst downloadHref = `${rawDownload}${rawDownload.includes(\"?\") ? \"&\" : \"?\"}download=1`;\n\n\tconst { scale: gestureScale, tx, ty } = transform;\n\tconst transition =\n\t\tsnapBack && !isDragging && !prefersReducedMotion()\n\t\t\t? `transform ${ZOOM_PAN_SWIPE_SNAP_MS}ms ease-out`\n\t\t\t: undefined;\n\n\tconst pageOf =\n\t\tlabels.pageOf?.(pageNumber, numPages) ??\n\t\t(numPages > 0 ? `${pageNumber} / ${numPages}` : \"—\");\n\n\tfunction renderThumbList(onSelect: (n: number) => void) {\n\t\treturn (\n\t\t\t<div className=\"space-y-2\">\n\t\t\t\t{Array.from({ length: numPages }, (_, i) => {\n\t\t\t\t\tconst n = i + 1;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<LazyThumbnail\n\t\t\t\t\t\t\tkey={n}\n\t\t\t\t\t\t\tpageNumber={n}\n\t\t\t\t\t\t\tactive={n === pageNumber}\n\t\t\t\t\t\t\twidth={THUMB_WIDTH}\n\t\t\t\t\t\t\tonClick={() => onSelect(n)}\n\t\t\t\t\t\t\tariaLabel={labels.thumbnailAria?.(n) ?? `Página ${n}`}\n\t\t\t\t\t\t/>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tref={shellRef}\n\t\t\tclassName={cn(\n\t\t\t\t\"relative flex h-full min-h-0 w-full flex-col bg-background\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{(closeAction || !loadError) && (\n\t\t\t\t<div className=\"flex shrink-0 items-center gap-1 overflow-x-auto border-b px-2 py-2\">\n\t\t\t\t\t{closeAction ? (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tdata-slot=\"pdf-close-action\"\n\t\t\t\t\t\t\tclassName=\"mr-1 flex shrink-0 items-center\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{closeAction}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{!loadError && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border bg-background text-foreground hover:bg-accent\"\n\t\t\t\t\t\t\t\tonClick={() => setThumbsOpen((v) => !v)}\n\t\t\t\t\t\t\t\taria-label={\n\t\t\t\t\t\t\t\t\tthumbsOpen\n\t\t\t\t\t\t\t\t\t\t? (labels.hideThumbnails ?? \"Ocultar miniaturas\")\n\t\t\t\t\t\t\t\t\t\t: (labels.showThumbnails ?? \"Mostrar miniaturas\")\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\taria-pressed={thumbsOpen}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{thumbsOpen ? (\n\t\t\t\t\t\t\t\t\t<PanelLeftClose className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<PanelLeft className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border bg-background hover:bg-accent disabled:opacity-50\"\n\t\t\t\t\t\t\t\tonClick={() => goToPage(pageNumber - 1)}\n\t\t\t\t\t\t\t\tdisabled={pageNumber <= 1}\n\t\t\t\t\t\t\t\taria-label={labels.previousPage ?? \"Página anterior\"}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ChevronLeft className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t<form\n\t\t\t\t\t\t\t\tonSubmit={submitPageJump}\n\t\t\t\t\t\t\t\tclassName=\"flex shrink-0 items-center gap-1 text-xs text-muted-foreground\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<label className=\"sr-only\" htmlFor=\"pdf-page-jump\">\n\t\t\t\t\t\t\t\t\t{labels.pageJumpAria ?? \"Ir a página\"}\n\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\tid=\"pdf-page-jump\"\n\t\t\t\t\t\t\t\t\tvalue={pageDraft}\n\t\t\t\t\t\t\t\t\tonChange={(e) => setPageDraft(e.target.value)}\n\t\t\t\t\t\t\t\t\tclassName=\"h-8 w-12 rounded-md border bg-background px-1 text-center text-foreground\"\n\t\t\t\t\t\t\t\t\tinputMode=\"numeric\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<span className=\"min-w-10 whitespace-nowrap\">{pageOf}</span>\n\t\t\t\t\t\t\t</form>\n\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border bg-background hover:bg-accent disabled:opacity-50\"\n\t\t\t\t\t\t\t\tonClick={() => goToPage(pageNumber + 1)}\n\t\t\t\t\t\t\t\tdisabled={pageNumber >= numPages}\n\t\t\t\t\t\t\t\taria-label={labels.nextPage ?? \"Página siguiente\"}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ChevronRight className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border bg-background hover:bg-accent disabled:opacity-50\"\n\t\t\t\t\t\t\t\tonClick={zoomOut}\n\t\t\t\t\t\t\t\tdisabled={zoomIndex <= 0}\n\t\t\t\t\t\t\t\taria-label={labels.zoomOut ?? \"Alejar\"}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ZoomOut className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName=\"inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-background px-2 text-xs hover:bg-accent\"\n\t\t\t\t\t\t\t\tonClick={fitMode === \"width\" ? fitPage : fitWidth}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{fitMode === \"width\"\n\t\t\t\t\t\t\t\t\t? (labels.fitPage ?? \"Ajustar página\")\n\t\t\t\t\t\t\t\t\t: (labels.fitWidth ?? \"Ajustar ancho\")}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border bg-background hover:bg-accent disabled:opacity-50\"\n\t\t\t\t\t\t\t\tonClick={zoomIn}\n\t\t\t\t\t\t\t\tdisabled={zoomIndex >= ZOOM_STEPS.length - 1}\n\t\t\t\t\t\t\t\taria-label={labels.zoomIn ?? \"Acercar\"}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ZoomIn className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border bg-background hover:bg-accent\"\n\t\t\t\t\t\t\t\tonClick={() => setRotation((r) => (r + 90) % 360)}\n\t\t\t\t\t\t\t\taria-label={labels.rotate ?? \"Rotar\"}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<RotateCw className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border bg-background hover:bg-accent\"\n\t\t\t\t\t\t\t\tonClick={() => void toggleFullscreen()}\n\t\t\t\t\t\t\t\taria-label={\n\t\t\t\t\t\t\t\t\tisFullscreen\n\t\t\t\t\t\t\t\t\t\t? (labels.exitFullscreen ?? \"Salir de pantalla completa\")\n\t\t\t\t\t\t\t\t\t\t: (labels.enterFullscreen ?? \"Pantalla completa\")\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{isFullscreen ? (\n\t\t\t\t\t\t\t\t\t<Minimize2 className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<Maximize2 className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\thref={downloadHref}\n\t\t\t\t\t\t\t\tdownload={fileName}\n\t\t\t\t\t\t\t\taria-label={\n\t\t\t\t\t\t\t\t\tlabels.downloadAria ?? labels.download ?? \"Descargar\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tclassName=\"inline-flex h-8 shrink-0 items-center gap-1 rounded-md border bg-background px-2 text-xs hover:bg-accent\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Download className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t<span className=\"hidden sm:inline\">\n\t\t\t\t\t\t\t\t\t{labels.download ?? \"Descargar\"}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<div className=\"relative flex min-h-0 flex-1\">\n\t\t\t\t{numPages > 0 && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"hidden w-40 shrink-0 overflow-y-auto border-r bg-background p-2 lg:block\",\n\t\t\t\t\t\t\t!thumbsOpen && \"lg:hidden\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{renderThumbList(goToPage)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{thumbsOpen && numPages > 0 && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\taria-label={\n\t\t\t\t\t\t\t\tlabels.hideThumbnails\n\t\t\t\t\t\t\t\t\t? `${labels.hideThumbnails} (fondo)`\n\t\t\t\t\t\t\t\t\t: \"Cerrar miniaturas (fondo)\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tclassName=\"absolute inset-0 z-20 bg-black/40 lg:hidden\"\n\t\t\t\t\t\t\tonClick={() => setThumbsOpen(false)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<div className=\"absolute inset-y-0 left-0 z-30 w-40 overflow-y-auto border-r bg-background p-2 shadow-lg lg:hidden\">\n\t\t\t\t\t\t\t{renderThumbList((n) => {\n\t\t\t\t\t\t\t\tgoToPage(n);\n\t\t\t\t\t\t\t\tsetThumbsOpen(false);\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\n\t\t\t\t<div\n\t\t\t\t\tref={viewportRef}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"relative min-h-0 flex-1 overflow-hidden bg-muted/40\",\n\t\t\t\t\t\tgestureScale > ZOOM_PAN_MIN_SCALE &&\n\t\t\t\t\t\t\t(isDragging ? \"cursor-grabbing\" : \"cursor-grab\"),\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{loadError ? (\n\t\t\t\t\t\t<div className=\"absolute inset-0 flex items-center justify-center p-6 sm:p-8\">\n\t\t\t\t\t\t\t<ErrorState\n\t\t\t\t\t\t\t\tclassName=\"w-full max-w-md px-4\"\n\t\t\t\t\t\t\t\ttitle={labels.loadError ?? \"No se pudo cargar el PDF\"}\n\t\t\t\t\t\t\t\tdescription={\n\t\t\t\t\t\t\t\t\tlabels.loadErrorDescription ??\n\t\t\t\t\t\t\t\t\t\"El archivo puede estar dañado, cifrado o bloqueado.\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\taction={\n\t\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\t\thref={downloadHref}\n\t\t\t\t\t\t\t\t\t\tdownload={fileName}\n\t\t\t\t\t\t\t\t\t\tclassName=\"text-sm text-primary underline\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{labels.download ?? \"Descargar\"}\n\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tref={stageRef}\n\t\t\t\t\t\t\tclassName=\"flex min-h-full min-w-full touch-none p-4\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\ttransform: `translate(${tx}px, ${ty}px) scale(${gestureScale})`,\n\t\t\t\t\t\t\t\ttransition,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonPointerDown={handlers.onPointerDown}\n\t\t\t\t\t\t\tonPointerMove={handlers.onPointerMove}\n\t\t\t\t\t\t\tonPointerUp={handlers.onPointerUp}\n\t\t\t\t\t\t\tonPointerCancel={handlers.onPointerCancel}\n\t\t\t\t\t\t\tonTransitionEnd={clearSnapBack}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{/* m-auto centers without the flex-overflow clipping that items-center causes when zoomed. */}\n\t\t\t\t\t\t\t<div className=\"m-auto\">\n\t\t\t\t\t\t\t\t<Document\n\t\t\t\t\t\t\t\t\tfile={fileUrl}\n\t\t\t\t\t\t\t\t\tonLoadSuccess={({ numPages: pages }) => {\n\t\t\t\t\t\t\t\t\t\tsetNumPages(pages);\n\t\t\t\t\t\t\t\t\t\tsetLoadError(false);\n\t\t\t\t\t\t\t\t\t\tconst start = Math.min(Math.max(1, initialPage), pages);\n\t\t\t\t\t\t\t\t\t\tsetPageNumber(start);\n\t\t\t\t\t\t\t\t\t\tsetPageDraft(String(start));\n\t\t\t\t\t\t\t\t\t\t// Certificates are typically one landscape page — fit-page is the useful default.\n\t\t\t\t\t\t\t\t\t\t// Multi-page docs default to fit-width for continuous reading.\n\t\t\t\t\t\t\t\t\t\tsetFitMode(pages === 1 ? \"page\" : \"width\");\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tonLoadError={() => setLoadError(true)}\n\t\t\t\t\t\t\t\t\tloading={\n\t\t\t\t\t\t\t\t\t\t<LoadingState label={labels.loading ?? \"Cargando PDF…\"} />\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\terror={\n\t\t\t\t\t\t\t\t\t\t<div className=\"absolute inset-0 flex items-center justify-center p-6 sm:p-8\">\n\t\t\t\t\t\t\t\t\t\t\t<ErrorState\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"w-full max-w-md px-4\"\n\t\t\t\t\t\t\t\t\t\t\t\ttitle={labels.loadError ?? \"No se pudo cargar el PDF\"}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{numPages > 0 && (\n\t\t\t\t\t\t\t\t\t\t<Page\n\t\t\t\t\t\t\t\t\t\t\tpageNumber={pageNumber}\n\t\t\t\t\t\t\t\t\t\t\twidth={pageWidth}\n\t\t\t\t\t\t\t\t\t\t\trotate={rotation}\n\t\t\t\t\t\t\t\t\t\t\trenderTextLayer\n\t\t\t\t\t\t\t\t\t\t\trenderAnnotationLayer\n\t\t\t\t\t\t\t\t\t\t\tonLoadSuccess={(page) => {\n\t\t\t\t\t\t\t\t\t\t\t\tsetPageNatural({\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth: page.originalWidth,\n\t\t\t\t\t\t\t\t\t\t\t\t\theight: page.originalHeight,\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</Document>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { XIcon } from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Dialog({\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n\treturn <DialogPrimitive.Root data-slot=\"dialog\" {...props} />;\n}\n\nfunction DialogTrigger({\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n\treturn <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />;\n}\n\nfunction DialogPortal({\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n\treturn <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />;\n}\n\nfunction DialogClose({\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n\treturn <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />;\n}\n\nfunction DialogOverlay({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n\treturn (\n\t\t<DialogPrimitive.Overlay\n\t\t\tdata-slot=\"dialog-overlay\"\n\t\t\tclassName={cn(\n\t\t\t\t\"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DialogContent({\n\tclassName,\n\tchildren,\n\tshowCloseButton = true,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n\tshowCloseButton?: boolean;\n}) {\n\treturn (\n\t\t<DialogPortal data-slot=\"dialog-portal\">\n\t\t\t<DialogOverlay />\n\t\t\t<DialogPrimitive.Content\n\t\t\t\tdata-slot=\"dialog-content\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 outline-none sm:max-w-lg\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t\t{showCloseButton && (\n\t\t\t\t\t<DialogPrimitive.Close\n\t\t\t\t\t\tdata-slot=\"dialog-close\"\n\t\t\t\t\t\tclassName=\"ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<XIcon />\n\t\t\t\t\t\t<span className=\"sr-only\">Close</span>\n\t\t\t\t\t</DialogPrimitive.Close>\n\t\t\t\t)}\n\t\t\t</DialogPrimitive.Content>\n\t\t</DialogPortal>\n\t);\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"dialog-header\"\n\t\t\tclassName={cn(\"flex flex-col gap-2 text-center sm:text-left\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"dialog-footer\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DialogTitle({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n\treturn (\n\t\t<DialogPrimitive.Title\n\t\t\tdata-slot=\"dialog-title\"\n\t\t\tclassName={cn(\"text-lg leading-none font-semibold\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DialogDescription({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n\treturn (\n\t\t<DialogPrimitive.Description\n\t\t\tdata-slot=\"dialog-description\"\n\t\t\tclassName={cn(\"text-muted-foreground text-sm\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport {\n\tDialog,\n\tDialogClose,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogOverlay,\n\tDialogPortal,\n\tDialogTitle,\n\tDialogTrigger,\n};\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { X } from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogTitle,\n} from \"../ui/dialog\";\n\nexport type MediaViewerDialogLabels = {\n\tclose?: string;\n\ttitle?: string;\n\tdescription?: string;\n};\n\nexport type MediaViewerDialogProps = {\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n\tchildren: ReactNode;\n\tlabels?: MediaViewerDialogLabels;\n\tclassName?: string;\n\t/** Extra classes for the dialog content shell. */\n\tcontentClassName?: string;\n\tshowCloseButton?: boolean;\n};\n\n/**\n * Edge-to-edge fullscreen dialog shell for media viewers (post detail, PDF,\n * etc.). Uses the shared Radix dialog for focus trap, Esc and `aria-modal`.\n * Pass `contentClassName` to opt into a contained desktop card when needed.\n */\nexport function MediaViewerDialog({\n\topen,\n\tonOpenChange,\n\tchildren,\n\tlabels,\n\tclassName,\n\tcontentClassName,\n\tshowCloseButton = true,\n}: MediaViewerDialogProps) {\n\tconst closeLabel = labels?.close ?? \"Cerrar\";\n\tconst title = labels?.title ?? \"Visor\";\n\tconst description = labels?.description ?? title;\n\n\treturn (\n\t\t<Dialog open={open} onOpenChange={onOpenChange}>\n\t\t\t<DialogContent\n\t\t\t\tshowCloseButton={false}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t// flex-col is required: without it the single child is a row item\n\t\t\t\t\t// sized to max-content (toolbar width) and the viewport collapses.\n\t\t\t\t\t\"inset-0 flex flex-col h-dvh max-h-dvh w-screen max-w-none translate-x-0 translate-y-0 top-0 left-0 gap-0 overflow-hidden rounded-none border-0 p-0 shadow-none sm:max-w-none\",\n\t\t\t\t\tcontentClassName,\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<DialogTitle className=\"sr-only\">{title}</DialogTitle>\n\t\t\t\t<DialogDescription className=\"sr-only\">{description}</DialogDescription>\n\t\t\t\t{showCloseButton && (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={() => onOpenChange(false)}\n\t\t\t\t\t\taria-label={closeLabel}\n\t\t\t\t\t\tclassName=\"absolute top-3 right-3 z-20 rounded-full bg-black/50 p-2 text-white transition-colors hover:bg-black/70\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<X className=\"h-5 w-5\" />\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\t\t\t\t{children}\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t);\n}\n","\"use client\";\n\nimport { X } from \"lucide-react\";\n\nimport { MediaViewerDialog } from \"../media/MediaViewerDialog\";\nimport {\n\tPdfViewer,\n\ttype PdfViewerLabels,\n\ttype PdfViewerProps,\n} from \"./PdfViewer\";\n\nexport type PdfViewerDialogProps = {\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n\ttitle: string;\n\tfileUrl: string;\n\tfileName?: string;\n\tdownloadUrl?: string;\n\tworkerSrc: string;\n\tinitialPage?: number;\n\tlabels: PdfViewerLabels & {\n\t\tclose?: string;\n\t\tdialogDescription?: string;\n\t};\n};\n\n/**\n * Drop-in dialog wrapper around {@link PdfViewer} using\n * {@link MediaViewerDialog} for the fullscreen shell. Title and close live\n * in the PDF toolbar (via `closeAction`) so chrome stays a single row.\n */\nexport function PdfViewerDialog({\n\topen,\n\tonOpenChange,\n\ttitle,\n\tfileUrl,\n\tfileName,\n\tdownloadUrl,\n\tworkerSrc,\n\tinitialPage,\n\tlabels,\n}: PdfViewerDialogProps) {\n\tconst viewerLabels: PdfViewerProps[\"labels\"] = labels;\n\tconst closeLabel = labels.close ?? \"Cerrar\";\n\n\treturn (\n\t\t<MediaViewerDialog\n\t\t\topen={open}\n\t\t\tonOpenChange={onOpenChange}\n\t\t\tshowCloseButton={false}\n\t\t\tlabels={{\n\t\t\t\tclose: closeLabel,\n\t\t\t\ttitle,\n\t\t\t\tdescription: labels.dialogDescription ?? title,\n\t\t\t}}\n\t\t>\n\t\t\t<PdfViewer\n\t\t\t\tfileUrl={fileUrl}\n\t\t\t\tfileName={fileName ?? title}\n\t\t\t\tdownloadUrl={downloadUrl}\n\t\t\t\tworkerSrc={workerSrc}\n\t\t\t\tinitialPage={initialPage}\n\t\t\t\tlabels={viewerLabels}\n\t\t\t\tclassName=\"min-h-0 w-full min-w-0 flex-1\"\n\t\t\t\tcloseAction={\n\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => onOpenChange(false)}\n\t\t\t\t\t\t\taria-label={closeLabel}\n\t\t\t\t\t\t\tclassName=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border bg-background text-foreground hover:bg-accent\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<X className=\"h-4 w-4\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<span className=\"max-w-[min(40vw,16rem)] truncate text-sm font-medium text-foreground\">\n\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t/>\n\t\t</MediaViewerDialog>\n\t);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/utils.ts","../src/hooks/useZoomPanGestures.ts","../src/components/EmptyState.tsx","../src/components/pdf/LazyThumbnail.tsx","../src/components/pdf/worker.ts","../src/components/pdf/PdfViewer.tsx","../src/components/ui/dialog.tsx","../src/components/media/MediaViewerDialog.tsx","../src/components/pdf/PdfViewerDialog.tsx"],"names":["twMerge","clsx","useState","useRef","useCallback","useEffect","dx","dy","jsxs","jsx","Loader2","AlertTriangle","Thumbnail","pdfjs","Fragment","PanelLeftClose","PanelLeft","ChevronLeft","ChevronRight","ZoomOut","ZoomIn","RotateCw","Minimize2","Maximize2","Download","Document","Page","DialogPrimitive","XIcon","X"],"mappings":"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","file":"pdf.cjs","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport {\n\tuseCallback,\n\tuseEffect,\n\tuseRef,\n\tuseState,\n\ttype PointerEvent as ReactPointerEvent,\n\ttype RefObject,\n} from \"react\";\n\nexport const ZOOM_PAN_MIN_SCALE = 1;\nexport const ZOOM_PAN_MAX_SCALE = 4;\nexport const ZOOM_PAN_DOUBLE_TAP_MS = 300;\nexport const ZOOM_PAN_SWIPE_LOCK_PX = 8;\nexport const ZOOM_PAN_SWIPE_COMMIT_PX = 56;\nexport const ZOOM_PAN_SWIPE_SNAP_MS = 180;\n\nexport type ZoomPanTransform = {\n\tscale: number;\n\ttx: number;\n\tty: number;\n};\n\nexport type SwipeDirection = \"prev\" | \"next\";\n\nexport type UseZoomPanGesturesOptions = {\n\tminScale?: number;\n\tmaxScale?: number;\n\t/** When false, horizontal swipe never commits (still pans when zoomed). */\n\tswipeEnabled?: boolean;\n\tonSwipeCommit?: (direction: SwipeDirection) => void;\n\t/** When true, wheel zoom is attached to the stage. Defaults to true. */\n\twheelZoom?: boolean;\n\t/**\n\t * Double-tap behavior at min scale: \"reset\" (default — ImageLightbox) or\n\t * \"toggle\" (zoom in toward tap, then reset).\n\t */\n\tdoubleTap?: \"reset\" | \"toggle\";\n};\n\nexport type UseZoomPanGesturesResult = {\n\tstageRef: RefObject<HTMLDivElement | null>;\n\ttransform: ZoomPanTransform;\n\tisDragging: boolean;\n\tsnapBack: boolean;\n\thandlers: {\n\t\tonPointerDown: (e: ReactPointerEvent<HTMLDivElement>) => void;\n\t\tonPointerMove: (e: ReactPointerEvent<HTMLDivElement>) => void;\n\t\tonPointerUp: (e: ReactPointerEvent<HTMLDivElement>) => void;\n\t\tonPointerCancel: (e: ReactPointerEvent<HTMLDivElement>) => void;\n\t};\n\treset: () => void;\n\tsetScale: (scale: number) => void;\n\tclearSnapBack: () => void;\n};\n\ntype SwipeAxis = \"x\" | \"y\";\n\nconst IDENTITY: ZoomPanTransform = { scale: 1, tx: 0, ty: 0 };\n\nfunction clamp(value: number, min: number, max: number) {\n\treturn Math.min(max, Math.max(min, value));\n}\n\nexport function zoomToward(\n\tprev: ZoomPanTransform,\n\tnextScale: number,\n\toriginX: number,\n\toriginY: number,\n\tminScale = ZOOM_PAN_MIN_SCALE,\n\tmaxScale = ZOOM_PAN_MAX_SCALE,\n): ZoomPanTransform {\n\tconst scale = clamp(nextScale, minScale, maxScale);\n\tif (scale === minScale) return { ...IDENTITY, scale: minScale };\n\tconst ratio = scale / prev.scale;\n\treturn {\n\t\tscale,\n\t\ttx: originX - (originX - prev.tx) * ratio,\n\t\tty: originY - (originY - prev.ty) * ratio,\n\t};\n}\n\nfunction pointerDistance(\n\ta: { x: number; y: number },\n\tb: { x: number; y: number },\n) {\n\treturn Math.hypot(b.x - a.x, b.y - a.y);\n}\n\nexport function prefersReducedMotion() {\n\tif (typeof window === \"undefined\" || !window.matchMedia) return false;\n\treturn window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n}\n\n/**\n * Pointer-driven pinch zoom, double-tap zoom toggle/reset, pan while zoomed,\n * and horizontal swipe-to-commit. Shared by ImageLightbox, MediaCarousel and\n * PdfViewer.\n */\nexport function useZoomPanGestures(\n\toptions: UseZoomPanGesturesOptions = {},\n): UseZoomPanGesturesResult {\n\tconst {\n\t\tminScale = ZOOM_PAN_MIN_SCALE,\n\t\tmaxScale = ZOOM_PAN_MAX_SCALE,\n\t\tswipeEnabled = true,\n\t\tonSwipeCommit,\n\t\twheelZoom = true,\n\t\tdoubleTap = \"reset\",\n\t} = options;\n\n\tconst [transform, setTransform] = useState<ZoomPanTransform>({\n\t\t...IDENTITY,\n\t\tscale: minScale,\n\t});\n\tconst transformRef = useRef(transform);\n\ttransformRef.current = transform;\n\n\tconst [isSwipeDragging, setIsSwipeDragging] = useState(false);\n\tconst [snapBack, setSnapBack] = useState(false);\n\n\tconst stageRef = useRef<HTMLDivElement>(null);\n\tconst pointersRef = useRef(new Map<number, { x: number; y: number }>());\n\tconst pinchStartRef = useRef<{\n\t\tdistance: number;\n\t\toriginX: number;\n\t\toriginY: number;\n\t\ttransform: ZoomPanTransform;\n\t} | null>(null);\n\tconst panRef = useRef<{\n\t\tpointerId: number;\n\t\tstartX: number;\n\t\tstartY: number;\n\t\toriginTx: number;\n\t\toriginTy: number;\n\t\tmoved: boolean;\n\t} | null>(null);\n\tconst swipeRef = useRef<{\n\t\tpointerId: number;\n\t\tstartX: number;\n\t\tstartY: number;\n\t\tmoved: boolean;\n\t\taxis: SwipeAxis | null;\n\t} | null>(null);\n\tconst lastTapRef = useRef<{ time: number; x: number; y: number } | null>(\n\t\tnull,\n\t);\n\tconst onSwipeCommitRef = useRef(onSwipeCommit);\n\tonSwipeCommitRef.current = onSwipeCommit;\n\tconst swipeEnabledRef = useRef(swipeEnabled);\n\tswipeEnabledRef.current = swipeEnabled;\n\tconst minScaleRef = useRef(minScale);\n\tminScaleRef.current = minScale;\n\tconst maxScaleRef = useRef(maxScale);\n\tmaxScaleRef.current = maxScale;\n\tconst doubleTapRef = useRef(doubleTap);\n\tdoubleTapRef.current = doubleTap;\n\n\tconst reset = useCallback(() => {\n\t\tsetTransform({ ...IDENTITY, scale: minScaleRef.current });\n\t\tsetIsSwipeDragging(false);\n\t\tsetSnapBack(false);\n\t}, []);\n\n\tconst setScale = useCallback((next: number) => {\n\t\tsetTransform((prev) =>\n\t\t\tzoomToward(prev, next, 0, 0, minScaleRef.current, maxScaleRef.current),\n\t\t);\n\t}, []);\n\n\tconst clearSnapBack = useCallback(() => {\n\t\tsetSnapBack(false);\n\t}, []);\n\n\tconst stageOrigin = useCallback((clientX: number, clientY: number) => {\n\t\tconst stage = stageRef.current;\n\t\tif (!stage) return { x: 0, y: 0 };\n\t\tconst rect = stage.getBoundingClientRect();\n\t\treturn {\n\t\t\tx: clientX - rect.left - rect.width / 2,\n\t\t\ty: clientY - rect.top - rect.height / 2,\n\t\t};\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (!wheelZoom) return;\n\t\tconst stage = stageRef.current;\n\t\tif (!stage) return;\n\n\t\tconst handleWheel = (e: WheelEvent) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tconst prev = transformRef.current;\n\t\t\tconst factor = e.deltaY > 0 ? 0.9 : 1.1;\n\t\t\tconst { x, y } = stageOrigin(e.clientX, e.clientY);\n\t\t\tsetTransform(\n\t\t\t\tzoomToward(\n\t\t\t\t\tprev,\n\t\t\t\t\tprev.scale * factor,\n\t\t\t\t\tx,\n\t\t\t\t\ty,\n\t\t\t\t\tminScaleRef.current,\n\t\t\t\t\tmaxScaleRef.current,\n\t\t\t\t),\n\t\t\t);\n\t\t};\n\n\t\tstage.addEventListener(\"wheel\", handleWheel, { passive: false });\n\t\treturn () => stage.removeEventListener(\"wheel\", handleWheel);\n\t}, [stageOrigin, wheelZoom]);\n\n\tfunction clearSwipe() {\n\t\tswipeRef.current = null;\n\t\tsetIsSwipeDragging(false);\n\t}\n\n\tfunction beginPinch() {\n\t\tconst pts = [...pointersRef.current.values()];\n\t\tconst [a, b] = pts;\n\t\tif (!a || !b) return;\n\t\tconst midX = (a.x + b.x) / 2;\n\t\tconst midY = (a.y + b.y) / 2;\n\t\tconst { x, y } = stageOrigin(midX, midY);\n\t\tpinchStartRef.current = {\n\t\t\tdistance: Math.max(pointerDistance(a, b), 1),\n\t\t\toriginX: x,\n\t\t\toriginY: y,\n\t\t\ttransform: { ...transformRef.current },\n\t\t};\n\t\tpanRef.current = null;\n\t\tclearSwipe();\n\t\tsetSnapBack(false);\n\t}\n\n\tfunction onPointerDown(e: ReactPointerEvent<HTMLDivElement>) {\n\t\te.stopPropagation();\n\t\tconst stage = stageRef.current;\n\t\tif (!stage) return;\n\n\t\tif (typeof stage.setPointerCapture === \"function\") {\n\t\t\tstage.setPointerCapture(e.pointerId);\n\t\t}\n\t\tpointersRef.current.set(e.pointerId, { x: e.clientX, y: e.clientY });\n\t\tsetSnapBack(false);\n\n\t\tif (pointersRef.current.size === 2) {\n\t\t\tbeginPinch();\n\t\t\treturn;\n\t\t}\n\n\t\tif (transformRef.current.scale > minScaleRef.current) {\n\t\t\tpanRef.current = {\n\t\t\t\tpointerId: e.pointerId,\n\t\t\t\tstartX: e.clientX,\n\t\t\t\tstartY: e.clientY,\n\t\t\t\toriginTx: transformRef.current.tx,\n\t\t\t\toriginTy: transformRef.current.ty,\n\t\t\t\tmoved: false,\n\t\t\t};\n\t\t\treturn;\n\t\t}\n\n\t\tif (swipeEnabledRef.current) {\n\t\t\tswipeRef.current = {\n\t\t\t\tpointerId: e.pointerId,\n\t\t\t\tstartX: e.clientX,\n\t\t\t\tstartY: e.clientY,\n\t\t\t\tmoved: false,\n\t\t\t\taxis: null,\n\t\t\t};\n\t\t\tsetIsSwipeDragging(true);\n\t\t}\n\t}\n\n\tfunction onPointerMove(e: ReactPointerEvent<HTMLDivElement>) {\n\t\tif (!pointersRef.current.has(e.pointerId)) return;\n\t\tpointersRef.current.set(e.pointerId, { x: e.clientX, y: e.clientY });\n\n\t\tconst pinchStart = pinchStartRef.current;\n\t\tif (pointersRef.current.size >= 2 && pinchStart) {\n\t\t\tconst pts = [...pointersRef.current.values()];\n\t\t\tconst [a, b] = pts;\n\t\t\tif (!a || !b) return;\n\t\t\tconst distance = Math.max(pointerDistance(a, b), 1);\n\t\t\tconst nextScale =\n\t\t\t\tpinchStart.transform.scale * (distance / pinchStart.distance);\n\t\t\tsetTransform(\n\t\t\t\tzoomToward(\n\t\t\t\t\tpinchStart.transform,\n\t\t\t\t\tnextScale,\n\t\t\t\t\tpinchStart.originX,\n\t\t\t\t\tpinchStart.originY,\n\t\t\t\t\tminScaleRef.current,\n\t\t\t\t\tmaxScaleRef.current,\n\t\t\t\t),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst pan = panRef.current;\n\t\tif (pan && pan.pointerId === e.pointerId) {\n\t\t\tconst dx = e.clientX - pan.startX;\n\t\t\tconst dy = e.clientY - pan.startY;\n\t\t\tif (Math.abs(dx) > 2 || Math.abs(dy) > 2) pan.moved = true;\n\t\t\tsetTransform((prev) => ({\n\t\t\t\t...prev,\n\t\t\t\ttx: pan.originTx + dx,\n\t\t\t\tty: pan.originTy + dy,\n\t\t\t}));\n\t\t\treturn;\n\t\t}\n\n\t\tconst swipe = swipeRef.current;\n\t\tif (!swipe || swipe.pointerId !== e.pointerId) return;\n\n\t\tconst dx = e.clientX - swipe.startX;\n\t\tconst dy = e.clientY - swipe.startY;\n\t\tif (Math.abs(dx) > 2 || Math.abs(dy) > 2) swipe.moved = true;\n\n\t\tif (swipe.axis === null) {\n\t\t\tconst absX = Math.abs(dx);\n\t\t\tconst absY = Math.abs(dy);\n\t\t\tif (absX < ZOOM_PAN_SWIPE_LOCK_PX && absY < ZOOM_PAN_SWIPE_LOCK_PX) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tswipe.axis = absX >= absY ? \"x\" : \"y\";\n\t\t\tif (swipe.axis === \"y\") {\n\t\t\t\tclearSwipe();\n\t\t\t\tsetTransform({ ...IDENTITY, scale: minScaleRef.current });\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (swipe.axis === \"x\") {\n\t\t\tsetTransform({\n\t\t\t\tscale: minScaleRef.current,\n\t\t\t\ttx: dx,\n\t\t\t\tty: 0,\n\t\t\t});\n\t\t}\n\t}\n\n\tfunction finishSwipe(e: ReactPointerEvent<HTMLDivElement>) {\n\t\tconst swipe = swipeRef.current;\n\t\tif (!swipe || swipe.pointerId !== e.pointerId) return false;\n\n\t\tconst dx = e.clientX - swipe.startX;\n\t\tconst wasMoved = swipe.moved;\n\t\tconst axis = swipe.axis;\n\t\tclearSwipe();\n\n\t\tif (axis === \"x\" && Math.abs(dx) >= ZOOM_PAN_SWIPE_COMMIT_PX) {\n\t\t\tonSwipeCommitRef.current?.(dx < 0 ? \"next\" : \"prev\");\n\t\t\treturn true;\n\t\t}\n\n\t\tif (wasMoved || transformRef.current.tx !== 0) {\n\t\t\tif (!prefersReducedMotion()) setSnapBack(true);\n\t\t\tsetTransform({ ...IDENTITY, scale: minScaleRef.current });\n\t\t}\n\t\treturn wasMoved;\n\t}\n\n\tfunction onPointerUp(e: ReactPointerEvent<HTMLDivElement>) {\n\t\tconst stage = stageRef.current;\n\t\tif (\n\t\t\tstage &&\n\t\t\ttypeof stage.hasPointerCapture === \"function\" &&\n\t\t\tstage.hasPointerCapture(e.pointerId) &&\n\t\t\ttypeof stage.releasePointerCapture === \"function\"\n\t\t) {\n\t\t\tstage.releasePointerCapture(e.pointerId);\n\t\t}\n\t\tpointersRef.current.delete(e.pointerId);\n\n\t\tif (pointersRef.current.size < 2) {\n\t\t\tpinchStartRef.current = null;\n\t\t}\n\t\tif (pointersRef.current.size === 1) {\n\t\t\tconst remaining = [...pointersRef.current.entries()][0];\n\t\t\tif (remaining && transformRef.current.scale > minScaleRef.current) {\n\t\t\t\tconst [pointerId, point] = remaining;\n\t\t\t\tpanRef.current = {\n\t\t\t\t\tpointerId,\n\t\t\t\t\tstartX: point.x,\n\t\t\t\t\tstartY: point.y,\n\t\t\t\t\toriginTx: transformRef.current.tx,\n\t\t\t\t\toriginTy: transformRef.current.ty,\n\t\t\t\t\tmoved: true,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tconst swipeHandled = finishSwipe(e);\n\t\tif (swipeHandled) return;\n\n\t\tconst pan = panRef.current;\n\t\tif (pan && pan.pointerId === e.pointerId) {\n\t\t\tconst wasMoved = pan.moved;\n\t\t\tpanRef.current = null;\n\t\t\tif (wasMoved) return;\n\t\t}\n\n\t\tif (pointersRef.current.size === 0 && e.button === 0) {\n\t\t\tconst now = Date.now();\n\t\t\tconst last = lastTapRef.current;\n\t\t\tif (\n\t\t\t\tlast &&\n\t\t\t\tnow - last.time < ZOOM_PAN_DOUBLE_TAP_MS &&\n\t\t\t\tMath.hypot(e.clientX - last.x, e.clientY - last.y) < 24\n\t\t\t) {\n\t\t\t\tlastTapRef.current = null;\n\t\t\t\tif (\n\t\t\t\t\tdoubleTapRef.current === \"toggle\" &&\n\t\t\t\t\ttransformRef.current.scale <= minScaleRef.current\n\t\t\t\t) {\n\t\t\t\t\tconst { x, y } = stageOrigin(e.clientX, e.clientY);\n\t\t\t\t\tsetTransform(\n\t\t\t\t\t\tzoomToward(\n\t\t\t\t\t\t\ttransformRef.current,\n\t\t\t\t\t\t\tMath.min(2, maxScaleRef.current),\n\t\t\t\t\t\t\tx,\n\t\t\t\t\t\t\ty,\n\t\t\t\t\t\t\tminScaleRef.current,\n\t\t\t\t\t\t\tmaxScaleRef.current,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\treset();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlastTapRef.current = { time: now, x: e.clientX, y: e.clientY };\n\t\t}\n\t}\n\n\treturn {\n\t\tstageRef,\n\t\ttransform,\n\t\tisDragging: isSwipeDragging,\n\t\tsnapBack,\n\t\thandlers: {\n\t\t\tonPointerDown,\n\t\t\tonPointerMove,\n\t\t\tonPointerUp,\n\t\t\tonPointerCancel: onPointerUp,\n\t\t},\n\t\treset,\n\t\tsetScale,\n\t\tclearSnapBack,\n\t};\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { AlertTriangle, Inbox, Loader2 } from \"lucide-react\";\n\nimport { cn } from \"../lib/utils\";\nimport {\n\tEmpty,\n\tEmptyContent,\n\tEmptyDescription,\n\tEmptyHeader,\n\tEmptyMedia,\n\tEmptyTitle,\n} from \"./ui/empty\";\n\nexport function LoadingState({\n\tlabel = \"Cargando…\",\n\tclassName,\n}: {\n\tlabel?: string;\n\tclassName?: string;\n}) {\n\treturn (\n\t\t<div\n\t\t\trole=\"status\"\n\t\t\taria-live=\"polite\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex items-center justify-center gap-2 py-12 text-sm text-muted-foreground\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<Loader2 className=\"size-4 animate-spin\" aria-hidden=\"true\" />\n\t\t\t<span>{label}</span>\n\t\t</div>\n\t);\n}\n\nexport function ErrorState({\n\ttitle = \"Algo salió mal\",\n\tdescription,\n\taction,\n\tclassName,\n}: {\n\ttitle?: string;\n\tdescription?: string;\n\taction?: React.ReactNode;\n\tclassName?: string;\n}) {\n\treturn (\n\t\t<div\n\t\t\trole=\"alert\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-col items-center gap-3 rounded-xl border border-dashed border-destructive/40 bg-destructive/5 py-12 text-center\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<AlertTriangle className=\"size-6 text-destructive\" aria-hidden=\"true\" />\n\t\t\t<div>\n\t\t\t\t<p className=\"font-medium\">{title}</p>\n\t\t\t\t{description ? (\n\t\t\t\t\t<p className=\"mt-1 text-sm text-muted-foreground\">{description}</p>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t\t{action}\n\t\t</div>\n\t);\n}\n\n/** Accept any icon component with a className prop — avoids LucideIcon\n * version skew between blocks peers and consuming apps. */\nexport type EmptyStateIcon = React.ComponentType<{\n\tclassName?: string;\n\t\"aria-hidden\"?: boolean | \"true\" | \"false\";\n}>;\n\nexport type EmptyStateProps = {\n\ttitle: string;\n\tdescription?: string;\n\taction?: React.ReactNode;\n\ticon?: EmptyStateIcon;\n\tvariant?: \"default\" | \"compact\";\n\tclassName?: string;\n};\n\nexport function EmptyState({\n\ttitle,\n\tdescription,\n\taction,\n\ticon: Icon = Inbox,\n\tvariant = \"default\",\n\tclassName,\n}: EmptyStateProps) {\n\tconst isCompact = variant === \"compact\";\n\n\treturn (\n\t\t<Empty\n\t\t\tclassName={cn(\n\t\t\t\t\"gap-3\",\n\t\t\t\tisCompact\n\t\t\t\t\t? \"flex-none rounded-none px-4 py-6\"\n\t\t\t\t\t: \"flex-none rounded-xl border border-dashed px-6 py-12\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<EmptyHeader className=\"gap-3\">\n\t\t\t\t<EmptyMedia\n\t\t\t\t\tvariant=\"icon\"\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"mb-0 bg-transparent text-muted-foreground\",\n\t\t\t\t\t\tisCompact\n\t\t\t\t\t\t\t? \"size-auto [&_svg:not([class*='size-'])]:size-8 [&_svg]:opacity-50\"\n\t\t\t\t\t\t\t: \"size-auto [&_svg:not([class*='size-'])]:size-6\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<Icon aria-hidden=\"true\" />\n\t\t\t\t</EmptyMedia>\n\t\t\t\t<EmptyTitle\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"font-medium tracking-normal\",\n\t\t\t\t\t\tisCompact ? \"text-sm\" : \"text-base\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{title}\n\t\t\t\t</EmptyTitle>\n\t\t\t\t{description ? (\n\t\t\t\t\t<EmptyDescription className=\"mt-0\">{description}</EmptyDescription>\n\t\t\t\t) : null}\n\t\t\t</EmptyHeader>\n\t\t\t{action ? <EmptyContent className=\"gap-0\">{action}</EmptyContent> : null}\n\t\t</Empty>\n\t);\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport type { PDFDocumentProxy } from \"pdfjs-dist\";\nimport { Thumbnail } from \"react-pdf\";\n\nimport { cn } from \"../../lib/utils\";\n\ntype LazyThumbnailProps = {\n\tpageNumber: number;\n\tactive: boolean;\n\twidth: number;\n\t/** Loaded document — required because the rail sits outside `<Document>`. */\n\tpdf: PDFDocumentProxy;\n\tonClick: () => void;\n\tariaLabel: string;\n};\n\n/**\n * Renders a react-pdf Thumbnail only after the slot intersects the viewport,\n * so large documents do not mount hundreds of canvases up front.\n */\nexport function LazyThumbnail({\n\tpageNumber,\n\tactive,\n\twidth,\n\tpdf,\n\tonClick,\n\tariaLabel,\n}: LazyThumbnailProps) {\n\tconst ref = useRef<HTMLButtonElement>(null);\n\tconst [visible, setVisible] = useState(false);\n\n\tuseEffect(() => {\n\t\tconst node = ref.current;\n\t\tif (!node || typeof IntersectionObserver === \"undefined\") {\n\t\t\tsetVisible(true);\n\t\t\treturn;\n\t\t}\n\t\tconst observer = new IntersectionObserver(\n\t\t\t(entries) => {\n\t\t\t\tif (entries.some((e) => e.isIntersecting)) {\n\t\t\t\t\tsetVisible(true);\n\t\t\t\t\tobserver.disconnect();\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ rootMargin: \"120px 0px\" },\n\t\t);\n\t\tobserver.observe(node);\n\t\treturn () => observer.disconnect();\n\t}, []);\n\n\treturn (\n\t\t<button\n\t\t\tref={ref}\n\t\t\ttype=\"button\"\n\t\t\tonClick={onClick}\n\t\t\taria-label={ariaLabel}\n\t\t\taria-current={active ? \"page\" : undefined}\n\t\t\tclassName={cn(\n\t\t\t\t\"block w-full overflow-hidden rounded-md border bg-background p-1 transition-colors hover:border-primary\",\n\t\t\t\tactive ? \"border-primary ring-2 ring-primary/30\" : \"border-border\",\n\t\t\t)}\n\t\t>\n\t\t\t{visible ? (\n\t\t\t\t<Thumbnail\n\t\t\t\t\tpageNumber={pageNumber}\n\t\t\t\t\twidth={width}\n\t\t\t\t\tpdf={pdf}\n\t\t\t\t\tclassName=\"mx-auto\"\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"mx-auto bg-muted\"\n\t\t\t\t\tstyle={{ width, height: Math.round(width * 1.4) }}\n\t\t\t\t\taria-hidden\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<span className=\"mt-1 block text-center text-[10px] text-muted-foreground\">\n\t\t\t\t{pageNumber}\n\t\t\t</span>\n\t\t</button>\n\t);\n}\n","import { pdfjs } from \"react-pdf\";\n\nimport \"react-pdf/dist/Page/TextLayer.css\";\nimport \"react-pdf/dist/Page/AnnotationLayer.css\";\n\nlet configuredSrc: string | null = null;\n\n/**\n * Apply the consumer-resolved pdfjs worker URL once. Bundler-specific\n * `new URL(..., import.meta.url)` must run in the app, not inside this\n * pre-built package.\n */\nexport function configurePdfWorker(workerSrc: string) {\n\tif (!workerSrc || configuredSrc === workerSrc) return;\n\tpdfjs.GlobalWorkerOptions.workerSrc = workerSrc;\n\tconfiguredSrc = workerSrc;\n}\n","\"use client\";\n\nimport {\n\tuseCallback,\n\tuseEffect,\n\tuseRef,\n\tuseState,\n\ttype FormEvent,\n\ttype ReactNode,\n} from \"react\";\nimport type { PDFDocumentProxy } from \"pdfjs-dist\";\nimport { Document, Page } from \"react-pdf\";\nimport {\n\tChevronLeft,\n\tChevronRight,\n\tDownload,\n\tMaximize2,\n\tMinimize2,\n\tPanelLeft,\n\tPanelLeftClose,\n\tRotateCw,\n\tZoomIn,\n\tZoomOut,\n} from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\nimport {\n\tZOOM_PAN_MIN_SCALE,\n\tZOOM_PAN_SWIPE_SNAP_MS,\n\tprefersReducedMotion,\n\tuseZoomPanGestures,\n} from \"../../hooks/useZoomPanGestures\";\nimport { ErrorState, LoadingState } from \"../EmptyState\";\nimport { LazyThumbnail } from \"./LazyThumbnail\";\nimport { configurePdfWorker } from \"./worker\";\n\nconst ZOOM_STEPS = [0.5, 0.75, 1, 1.25, 1.5, 2, 2.5, 3];\nconst THUMB_WIDTH = 120;\n\nexport type PdfViewerLabels = {\n\tloading?: string;\n\tloadError?: string;\n\tloadErrorDescription?: string;\n\tpreviousPage?: string;\n\tnextPage?: string;\n\tzoomIn?: string;\n\tzoomOut?: string;\n\tfitWidth?: string;\n\tfitPage?: string;\n\trotate?: string;\n\tenterFullscreen?: string;\n\texitFullscreen?: string;\n\tdownload?: string;\n\tdownloadAria?: string;\n\tshowThumbnails?: string;\n\thideThumbnails?: string;\n\tpageJumpAria?: string;\n\tthumbnailAria?: (page: number) => string;\n\tpageOf?: (current: number, total: number) => string;\n};\n\nexport type PdfViewerProps = {\n\tfileUrl: string;\n\tfileName: string;\n\tdownloadUrl?: string;\n\t/** Consumer-resolved pdfjs worker URL — bundler-specific. */\n\tworkerSrc: string;\n\tinitialPage?: number;\n\tclassName?: string;\n\tlabels: PdfViewerLabels;\n\t/**\n\t * Optional leading toolbar control (e.g. close / back). Rendered before\n\t * thumbnails so host chrome does not float over PDF tools.\n\t */\n\tcloseAction?: ReactNode;\n};\n\n/**\n * Full-featured single-page PDF surface: collapsible lazy thumbnail rail,\n * page nav + jump, zoom/fit/rotate, pinch+swipe gestures, fullscreen and\n * download. Layout-agnostic — fills its parent.\n */\nexport function PdfViewer({\n\tfileUrl,\n\tfileName,\n\tdownloadUrl,\n\tworkerSrc,\n\tinitialPage = 1,\n\tclassName,\n\tlabels,\n\tcloseAction,\n}: PdfViewerProps) {\n\tconfigurePdfWorker(workerSrc);\n\n\tconst [numPages, setNumPages] = useState(0);\n\tconst [pageNumber, setPageNumber] = useState(initialPage);\n\tconst [zoomIndex, setZoomIndex] = useState(2);\n\tconst [fitMode, setFitMode] = useState<\"width\" | \"page\">(\"page\");\n\tconst [rotation, setRotation] = useState(0);\n\tconst [containerWidth, setContainerWidth] = useState(0);\n\tconst [containerHeight, setContainerHeight] = useState(0);\n\tconst [pageNatural, setPageNatural] = useState<{\n\t\twidth: number;\n\t\theight: number;\n\t} | null>(null);\n\tconst [isFullscreen, setIsFullscreen] = useState(false);\n\tconst [thumbsOpen, setThumbsOpen] = useState(false);\n\tconst [loadError, setLoadError] = useState(false);\n\tconst [pageDraft, setPageDraft] = useState(String(initialPage));\n\t/** Kept so the thumbnail rail (outside `<Document>`) can render pages. */\n\tconst [pdfDocument, setPdfDocument] = useState<PDFDocumentProxy | null>(null);\n\n\tconst viewportRef = useRef<HTMLDivElement>(null);\n\tconst shellRef = useRef<HTMLDivElement>(null);\n\tconst pageNumberRef = useRef(pageNumber);\n\tpageNumberRef.current = pageNumber;\n\tconst numPagesRef = useRef(numPages);\n\tnumPagesRef.current = numPages;\n\n\tconst baseScale = ZOOM_STEPS[zoomIndex] ?? 1;\n\n\tconst goToPage = useCallback((next: number) => {\n\t\tconst total = numPagesRef.current;\n\t\tif (total <= 0) return;\n\t\tconst clamped = Math.min(Math.max(1, next), total);\n\t\tsetPageNumber(clamped);\n\t\tsetPageDraft(String(clamped));\n\t}, []);\n\n\tconst onSwipeCommit = useCallback(\n\t\t(direction: \"prev\" | \"next\") => {\n\t\t\tif (direction === \"next\") {\n\t\t\t\tgoToPage(pageNumberRef.current + 1);\n\t\t\t} else {\n\t\t\t\tgoToPage(pageNumberRef.current - 1);\n\t\t\t}\n\t\t},\n\t\t[goToPage],\n\t);\n\n\tconst {\n\t\tstageRef,\n\t\ttransform,\n\t\tisDragging,\n\t\tsnapBack,\n\t\thandlers,\n\t\treset,\n\t\tclearSnapBack,\n\t} = useZoomPanGestures({\n\t\tswipeEnabled: numPages > 1,\n\t\tonSwipeCommit,\n\t\twheelZoom: true,\n\t\tdoubleTap: \"toggle\",\n\t});\n\n\tuseEffect(() => {\n\t\tsetPageNumber(initialPage);\n\t\tsetPageDraft(String(initialPage));\n\t\tsetZoomIndex(2);\n\t\tsetFitMode(\"page\");\n\t\tsetRotation(0);\n\t\tsetNumPages(0);\n\t\tsetPdfDocument(null);\n\t\tsetPageNatural(null);\n\t\tsetLoadError(false);\n\t\tsetThumbsOpen(false);\n\t\treset();\n\t}, [fileUrl, initialPage, reset]);\n\n\tuseEffect(() => {\n\t\treset();\n\t\tsetPageNatural(null);\n\t}, [pageNumber, reset]);\n\n\tconst measureViewport = useCallback(() => {\n\t\tconst el = viewportRef.current;\n\t\tif (!el) return;\n\t\t// Ignore zero sizes so a pre-layout rAF/clientWidth=0 read cannot\n\t\t// overwrite a good ResizeObserver measurement (jsdom + dialog open).\n\t\tconst w = el.clientWidth;\n\t\tconst h = el.clientHeight;\n\t\tif (w > 0) setContainerWidth(w);\n\t\tif (h > 0) setContainerHeight(h);\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (!viewportRef.current) return;\n\t\tconst el = viewportRef.current;\n\t\tconst observer = new ResizeObserver((entries) => {\n\t\t\tconst rect = entries[0]?.contentRect;\n\t\t\tif (!rect) return;\n\t\t\tif (rect.width > 0) setContainerWidth(rect.width);\n\t\t\tif (rect.height > 0) setContainerHeight(rect.height);\n\t\t});\n\t\tobserver.observe(el);\n\t\tmeasureViewport();\n\t\t// Dialog shells animate (zoom-in-95); remeasure after layout settles.\n\t\tconst raf = requestAnimationFrame(() => {\n\t\t\tmeasureViewport();\n\t\t\trequestAnimationFrame(measureViewport);\n\t\t});\n\t\treturn () => {\n\t\t\tobserver.disconnect();\n\t\t\tcancelAnimationFrame(raf);\n\t\t};\n\t}, [measureViewport]);\n\n\tuseEffect(() => {\n\t\tmeasureViewport();\n\t}, [thumbsOpen, measureViewport]);\n\n\tuseEffect(() => {\n\t\tfunction onFullscreenChange() {\n\t\t\tsetIsFullscreen(document.fullscreenElement === shellRef.current);\n\t\t\t// Fullscreen toggles change available space; remeasure next frame.\n\t\t\trequestAnimationFrame(measureViewport);\n\t\t}\n\t\tdocument.addEventListener(\"fullscreenchange\", onFullscreenChange);\n\t\treturn () =>\n\t\t\tdocument.removeEventListener(\"fullscreenchange\", onFullscreenChange);\n\t}, [measureViewport]);\n\n\tuseEffect(() => {\n\t\tfunction onKeyDown(e: KeyboardEvent) {\n\t\t\tconst target = e.target as HTMLElement | null;\n\t\t\tif (\n\t\t\t\ttarget &&\n\t\t\t\t(target.tagName === \"INPUT\" ||\n\t\t\t\t\ttarget.tagName === \"TEXTAREA\" ||\n\t\t\t\t\ttarget.isContentEditable)\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tswitch (e.key) {\n\t\t\t\tcase \"ArrowLeft\":\n\t\t\t\tcase \"PageUp\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tgoToPage(pageNumberRef.current - 1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"ArrowRight\":\n\t\t\t\tcase \"PageDown\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tgoToPage(pageNumberRef.current + 1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"Home\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tgoToPage(1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"End\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tgoToPage(numPagesRef.current);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"+\":\n\t\t\t\tcase \"=\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetZoomIndex((i) => Math.min(i + 1, ZOOM_STEPS.length - 1));\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"-\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetZoomIndex((i) => Math.max(i - 1, 0));\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\twindow.addEventListener(\"keydown\", onKeyDown);\n\t\treturn () => window.removeEventListener(\"keydown\", onKeyDown);\n\t}, [goToPage]);\n\n\tconst fitWidth = useCallback(() => {\n\t\tsetFitMode(\"width\");\n\t\tsetZoomIndex(2);\n\t\treset();\n\t}, [reset]);\n\n\tconst fitPage = useCallback(() => {\n\t\tsetFitMode(\"page\");\n\t\tsetZoomIndex(2);\n\t\treset();\n\t}, [reset]);\n\n\tconst zoomIn = useCallback(() => {\n\t\tsetZoomIndex((i) => Math.min(i + 1, ZOOM_STEPS.length - 1));\n\t}, []);\n\n\tconst zoomOut = useCallback(() => {\n\t\tsetZoomIndex((i) => Math.max(i - 1, 0));\n\t}, []);\n\n\tconst toggleFullscreen = useCallback(async () => {\n\t\tif (!shellRef.current) return;\n\t\tif (document.fullscreenElement === shellRef.current) {\n\t\t\tawait document.exitFullscreen();\n\t\t} else {\n\t\t\tawait shellRef.current.requestFullscreen();\n\t\t}\n\t}, []);\n\n\tfunction submitPageJump(e: FormEvent) {\n\t\te.preventDefault();\n\t\tconst parsed = Number.parseInt(pageDraft, 10);\n\t\tif (Number.isFinite(parsed)) goToPage(parsed);\n\t\telse setPageDraft(String(pageNumber));\n\t}\n\n\tconst PAD = 32;\n\tconst availW = Math.max(containerWidth - PAD, 240);\n\tconst availH = Math.max(containerHeight - PAD, 240);\n\tconst rotated =\n\t\trotation % 180 !== 0 && pageNatural\n\t\t\t? { width: pageNatural.height, height: pageNatural.width }\n\t\t\t: pageNatural;\n\n\tlet pageWidth: number | undefined;\n\tif (fitMode === \"width\" || !rotated) {\n\t\tpageWidth = availW * baseScale;\n\t} else {\n\t\tconst scaleToFit = Math.min(\n\t\t\tavailW / rotated.width,\n\t\t\tavailH / rotated.height,\n\t\t);\n\t\tpageWidth = rotated.width * scaleToFit * baseScale;\n\t}\n\n\tconst rawDownload = downloadUrl ?? fileUrl;\n\tconst downloadHref = `${rawDownload}${rawDownload.includes(\"?\") ? \"&\" : \"?\"}download=1`;\n\n\tconst { scale: gestureScale, tx, ty } = transform;\n\tconst transition =\n\t\tsnapBack && !isDragging && !prefersReducedMotion()\n\t\t\t? `transform ${ZOOM_PAN_SWIPE_SNAP_MS}ms ease-out`\n\t\t\t: undefined;\n\n\tconst pageOf =\n\t\tlabels.pageOf?.(pageNumber, numPages) ??\n\t\t(numPages > 0 ? `${pageNumber} / ${numPages}` : \"—\");\n\n\tfunction renderThumbList(\n\t\tpdf: PDFDocumentProxy,\n\t\tonSelect: (n: number) => void,\n\t) {\n\t\treturn (\n\t\t\t<div className=\"space-y-2\">\n\t\t\t\t{Array.from({ length: numPages }, (_, i) => {\n\t\t\t\t\tconst n = i + 1;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<LazyThumbnail\n\t\t\t\t\t\t\tkey={n}\n\t\t\t\t\t\t\tpageNumber={n}\n\t\t\t\t\t\t\tactive={n === pageNumber}\n\t\t\t\t\t\t\twidth={THUMB_WIDTH}\n\t\t\t\t\t\t\tpdf={pdf}\n\t\t\t\t\t\t\tonClick={() => onSelect(n)}\n\t\t\t\t\t\t\tariaLabel={labels.thumbnailAria?.(n) ?? `Página ${n}`}\n\t\t\t\t\t\t/>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tref={shellRef}\n\t\t\tclassName={cn(\n\t\t\t\t\"relative flex h-full min-h-0 w-full flex-col bg-background\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{(closeAction || !loadError) && (\n\t\t\t\t<div className=\"flex shrink-0 items-center gap-1 overflow-x-auto border-b px-2 py-2\">\n\t\t\t\t\t{closeAction ? (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tdata-slot=\"pdf-close-action\"\n\t\t\t\t\t\t\tclassName=\"mr-1 flex shrink-0 items-center\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{closeAction}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{!loadError && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border bg-background text-foreground hover:bg-accent\"\n\t\t\t\t\t\t\t\tonClick={() => setThumbsOpen((v) => !v)}\n\t\t\t\t\t\t\t\taria-label={\n\t\t\t\t\t\t\t\t\tthumbsOpen\n\t\t\t\t\t\t\t\t\t\t? (labels.hideThumbnails ?? \"Ocultar miniaturas\")\n\t\t\t\t\t\t\t\t\t\t: (labels.showThumbnails ?? \"Mostrar miniaturas\")\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\taria-pressed={thumbsOpen}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{thumbsOpen ? (\n\t\t\t\t\t\t\t\t\t<PanelLeftClose className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<PanelLeft className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border bg-background hover:bg-accent disabled:opacity-50\"\n\t\t\t\t\t\t\t\tonClick={() => goToPage(pageNumber - 1)}\n\t\t\t\t\t\t\t\tdisabled={pageNumber <= 1}\n\t\t\t\t\t\t\t\taria-label={labels.previousPage ?? \"Página anterior\"}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ChevronLeft className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t<form\n\t\t\t\t\t\t\t\tonSubmit={submitPageJump}\n\t\t\t\t\t\t\t\tclassName=\"flex shrink-0 items-center gap-1 text-xs text-muted-foreground\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<label className=\"sr-only\" htmlFor=\"pdf-page-jump\">\n\t\t\t\t\t\t\t\t\t{labels.pageJumpAria ?? \"Ir a página\"}\n\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\tid=\"pdf-page-jump\"\n\t\t\t\t\t\t\t\t\tvalue={pageDraft}\n\t\t\t\t\t\t\t\t\tonChange={(e) => setPageDraft(e.target.value)}\n\t\t\t\t\t\t\t\t\tclassName=\"h-8 w-12 rounded-md border bg-background px-1 text-center text-foreground\"\n\t\t\t\t\t\t\t\t\tinputMode=\"numeric\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<span className=\"min-w-10 whitespace-nowrap\">{pageOf}</span>\n\t\t\t\t\t\t\t</form>\n\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border bg-background hover:bg-accent disabled:opacity-50\"\n\t\t\t\t\t\t\t\tonClick={() => goToPage(pageNumber + 1)}\n\t\t\t\t\t\t\t\tdisabled={pageNumber >= numPages}\n\t\t\t\t\t\t\t\taria-label={labels.nextPage ?? \"Página siguiente\"}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ChevronRight className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border bg-background hover:bg-accent disabled:opacity-50\"\n\t\t\t\t\t\t\t\tonClick={zoomOut}\n\t\t\t\t\t\t\t\tdisabled={zoomIndex <= 0}\n\t\t\t\t\t\t\t\taria-label={labels.zoomOut ?? \"Alejar\"}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ZoomOut className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName=\"inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-background px-2 text-xs hover:bg-accent\"\n\t\t\t\t\t\t\t\tonClick={fitMode === \"width\" ? fitPage : fitWidth}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{fitMode === \"width\"\n\t\t\t\t\t\t\t\t\t? (labels.fitPage ?? \"Ajustar página\")\n\t\t\t\t\t\t\t\t\t: (labels.fitWidth ?? \"Ajustar ancho\")}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border bg-background hover:bg-accent disabled:opacity-50\"\n\t\t\t\t\t\t\t\tonClick={zoomIn}\n\t\t\t\t\t\t\t\tdisabled={zoomIndex >= ZOOM_STEPS.length - 1}\n\t\t\t\t\t\t\t\taria-label={labels.zoomIn ?? \"Acercar\"}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ZoomIn className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border bg-background hover:bg-accent\"\n\t\t\t\t\t\t\t\tonClick={() => setRotation((r) => (r + 90) % 360)}\n\t\t\t\t\t\t\t\taria-label={labels.rotate ?? \"Rotar\"}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<RotateCw className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border bg-background hover:bg-accent\"\n\t\t\t\t\t\t\t\tonClick={() => void toggleFullscreen()}\n\t\t\t\t\t\t\t\taria-label={\n\t\t\t\t\t\t\t\t\tisFullscreen\n\t\t\t\t\t\t\t\t\t\t? (labels.exitFullscreen ?? \"Salir de pantalla completa\")\n\t\t\t\t\t\t\t\t\t\t: (labels.enterFullscreen ?? \"Pantalla completa\")\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{isFullscreen ? (\n\t\t\t\t\t\t\t\t\t<Minimize2 className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<Maximize2 className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\thref={downloadHref}\n\t\t\t\t\t\t\t\tdownload={fileName}\n\t\t\t\t\t\t\t\taria-label={\n\t\t\t\t\t\t\t\t\tlabels.downloadAria ?? labels.download ?? \"Descargar\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tclassName=\"inline-flex h-8 shrink-0 items-center gap-1 rounded-md border bg-background px-2 text-xs hover:bg-accent\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Download className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t<span className=\"hidden sm:inline\">\n\t\t\t\t\t\t\t\t\t{labels.download ?? \"Descargar\"}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<div className=\"relative flex min-h-0 flex-1\">\n\t\t\t\t{pdfDocument && numPages > 0 && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"hidden w-40 shrink-0 overflow-y-auto border-r bg-background p-2 lg:block\",\n\t\t\t\t\t\t\t!thumbsOpen && \"lg:hidden\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{renderThumbList(pdfDocument, goToPage)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{thumbsOpen && pdfDocument && numPages > 0 && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\taria-label={\n\t\t\t\t\t\t\t\tlabels.hideThumbnails\n\t\t\t\t\t\t\t\t\t? `${labels.hideThumbnails} (fondo)`\n\t\t\t\t\t\t\t\t\t: \"Cerrar miniaturas (fondo)\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tclassName=\"absolute inset-0 z-20 bg-black/40 lg:hidden\"\n\t\t\t\t\t\t\tonClick={() => setThumbsOpen(false)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<div className=\"absolute inset-y-0 left-0 z-30 w-40 overflow-y-auto border-r bg-background p-2 shadow-lg lg:hidden\">\n\t\t\t\t\t\t\t{renderThumbList(pdfDocument, (n) => {\n\t\t\t\t\t\t\t\tgoToPage(n);\n\t\t\t\t\t\t\t\tsetThumbsOpen(false);\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\n\t\t\t\t<div\n\t\t\t\t\tref={viewportRef}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"relative min-h-0 flex-1 overflow-hidden bg-muted/40\",\n\t\t\t\t\t\tgestureScale > ZOOM_PAN_MIN_SCALE &&\n\t\t\t\t\t\t\t(isDragging ? \"cursor-grabbing\" : \"cursor-grab\"),\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{loadError ? (\n\t\t\t\t\t\t<div className=\"absolute inset-0 flex items-center justify-center p-6 sm:p-8\">\n\t\t\t\t\t\t\t<ErrorState\n\t\t\t\t\t\t\t\tclassName=\"w-full max-w-md px-4\"\n\t\t\t\t\t\t\t\ttitle={labels.loadError ?? \"No se pudo cargar el PDF\"}\n\t\t\t\t\t\t\t\tdescription={\n\t\t\t\t\t\t\t\t\tlabels.loadErrorDescription ??\n\t\t\t\t\t\t\t\t\t\"El archivo puede estar dañado, cifrado o bloqueado.\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\taction={\n\t\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\t\thref={downloadHref}\n\t\t\t\t\t\t\t\t\t\tdownload={fileName}\n\t\t\t\t\t\t\t\t\t\tclassName=\"text-sm text-primary underline\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{labels.download ?? \"Descargar\"}\n\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tref={stageRef}\n\t\t\t\t\t\t\tclassName=\"flex min-h-full min-w-full touch-none p-4\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\ttransform: `translate(${tx}px, ${ty}px) scale(${gestureScale})`,\n\t\t\t\t\t\t\t\ttransition,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonPointerDown={handlers.onPointerDown}\n\t\t\t\t\t\t\tonPointerMove={handlers.onPointerMove}\n\t\t\t\t\t\t\tonPointerUp={handlers.onPointerUp}\n\t\t\t\t\t\t\tonPointerCancel={handlers.onPointerCancel}\n\t\t\t\t\t\t\tonTransitionEnd={clearSnapBack}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{/* m-auto centers without the flex-overflow clipping that items-center causes when zoomed. */}\n\t\t\t\t\t\t\t<div className=\"m-auto\">\n\t\t\t\t\t\t\t\t<Document\n\t\t\t\t\t\t\t\t\tfile={fileUrl}\n\t\t\t\t\t\t\t\t\tonLoadSuccess={(pdf) => {\n\t\t\t\t\t\t\t\t\t\tconst pages = pdf.numPages;\n\t\t\t\t\t\t\t\t\t\tsetPdfDocument(pdf);\n\t\t\t\t\t\t\t\t\t\tsetNumPages(pages);\n\t\t\t\t\t\t\t\t\t\tsetLoadError(false);\n\t\t\t\t\t\t\t\t\t\tconst start = Math.min(Math.max(1, initialPage), pages);\n\t\t\t\t\t\t\t\t\t\tsetPageNumber(start);\n\t\t\t\t\t\t\t\t\t\tsetPageDraft(String(start));\n\t\t\t\t\t\t\t\t\t\t// Certificates are typically one landscape page — fit-page is the useful default.\n\t\t\t\t\t\t\t\t\t\t// Multi-page docs default to fit-width for continuous reading.\n\t\t\t\t\t\t\t\t\t\tsetFitMode(pages === 1 ? \"page\" : \"width\");\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tonLoadError={() => {\n\t\t\t\t\t\t\t\t\t\tsetPdfDocument(null);\n\t\t\t\t\t\t\t\t\t\tsetLoadError(true);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tloading={\n\t\t\t\t\t\t\t\t\t\t<LoadingState label={labels.loading ?? \"Cargando PDF…\"} />\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\terror={\n\t\t\t\t\t\t\t\t\t\t<div className=\"absolute inset-0 flex items-center justify-center p-6 sm:p-8\">\n\t\t\t\t\t\t\t\t\t\t\t<ErrorState\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"w-full max-w-md px-4\"\n\t\t\t\t\t\t\t\t\t\t\t\ttitle={labels.loadError ?? \"No se pudo cargar el PDF\"}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{numPages > 0 && (\n\t\t\t\t\t\t\t\t\t\t<Page\n\t\t\t\t\t\t\t\t\t\t\tpageNumber={pageNumber}\n\t\t\t\t\t\t\t\t\t\t\twidth={pageWidth}\n\t\t\t\t\t\t\t\t\t\t\trotate={rotation}\n\t\t\t\t\t\t\t\t\t\t\trenderTextLayer\n\t\t\t\t\t\t\t\t\t\t\trenderAnnotationLayer\n\t\t\t\t\t\t\t\t\t\t\tonLoadSuccess={(page) => {\n\t\t\t\t\t\t\t\t\t\t\t\tsetPageNatural({\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth: page.originalWidth,\n\t\t\t\t\t\t\t\t\t\t\t\t\theight: page.originalHeight,\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</Document>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { XIcon } from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Dialog({\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n\treturn <DialogPrimitive.Root data-slot=\"dialog\" {...props} />;\n}\n\nfunction DialogTrigger({\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n\treturn <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />;\n}\n\nfunction DialogPortal({\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n\treturn <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />;\n}\n\nfunction DialogClose({\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n\treturn <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />;\n}\n\nfunction DialogOverlay({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n\treturn (\n\t\t<DialogPrimitive.Overlay\n\t\t\tdata-slot=\"dialog-overlay\"\n\t\t\tclassName={cn(\n\t\t\t\t\"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DialogContent({\n\tclassName,\n\tchildren,\n\tshowCloseButton = true,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n\tshowCloseButton?: boolean;\n}) {\n\treturn (\n\t\t<DialogPortal data-slot=\"dialog-portal\">\n\t\t\t<DialogOverlay />\n\t\t\t<DialogPrimitive.Content\n\t\t\t\tdata-slot=\"dialog-content\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 outline-none sm:max-w-lg\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t\t{showCloseButton && (\n\t\t\t\t\t<DialogPrimitive.Close\n\t\t\t\t\t\tdata-slot=\"dialog-close\"\n\t\t\t\t\t\tclassName=\"ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<XIcon />\n\t\t\t\t\t\t<span className=\"sr-only\">Close</span>\n\t\t\t\t\t</DialogPrimitive.Close>\n\t\t\t\t)}\n\t\t\t</DialogPrimitive.Content>\n\t\t</DialogPortal>\n\t);\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"dialog-header\"\n\t\t\tclassName={cn(\"flex flex-col gap-2 text-center sm:text-left\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"dialog-footer\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DialogTitle({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n\treturn (\n\t\t<DialogPrimitive.Title\n\t\t\tdata-slot=\"dialog-title\"\n\t\t\tclassName={cn(\"text-lg leading-none font-semibold\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DialogDescription({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n\treturn (\n\t\t<DialogPrimitive.Description\n\t\t\tdata-slot=\"dialog-description\"\n\t\t\tclassName={cn(\"text-muted-foreground text-sm\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport {\n\tDialog,\n\tDialogClose,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogOverlay,\n\tDialogPortal,\n\tDialogTitle,\n\tDialogTrigger,\n};\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { X } from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogTitle,\n} from \"../ui/dialog\";\n\nexport type MediaViewerDialogLabels = {\n\tclose?: string;\n\ttitle?: string;\n\tdescription?: string;\n};\n\nexport type MediaViewerDialogProps = {\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n\tchildren: ReactNode;\n\tlabels?: MediaViewerDialogLabels;\n\tclassName?: string;\n\t/** Extra classes for the dialog content shell. */\n\tcontentClassName?: string;\n\tshowCloseButton?: boolean;\n};\n\n/**\n * Edge-to-edge fullscreen dialog shell for media viewers (post detail, PDF,\n * etc.). Uses the shared Radix dialog for focus trap, Esc and `aria-modal`.\n * Pass `contentClassName` to opt into a contained desktop card when needed.\n */\nexport function MediaViewerDialog({\n\topen,\n\tonOpenChange,\n\tchildren,\n\tlabels,\n\tclassName,\n\tcontentClassName,\n\tshowCloseButton = true,\n}: MediaViewerDialogProps) {\n\tconst closeLabel = labels?.close ?? \"Cerrar\";\n\tconst title = labels?.title ?? \"Visor\";\n\tconst description = labels?.description ?? title;\n\n\treturn (\n\t\t<Dialog open={open} onOpenChange={onOpenChange}>\n\t\t\t<DialogContent\n\t\t\t\tshowCloseButton={false}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t// flex-col is required: without it the single child is a row item\n\t\t\t\t\t// sized to max-content (toolbar width) and the viewport collapses.\n\t\t\t\t\t\"inset-0 flex flex-col h-dvh max-h-dvh w-screen max-w-none translate-x-0 translate-y-0 top-0 left-0 gap-0 overflow-hidden rounded-none border-0 p-0 shadow-none sm:max-w-none\",\n\t\t\t\t\tcontentClassName,\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<DialogTitle className=\"sr-only\">{title}</DialogTitle>\n\t\t\t\t<DialogDescription className=\"sr-only\">{description}</DialogDescription>\n\t\t\t\t{showCloseButton && (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={() => onOpenChange(false)}\n\t\t\t\t\t\taria-label={closeLabel}\n\t\t\t\t\t\tclassName=\"absolute top-3 right-3 z-20 rounded-full bg-black/50 p-2 text-white transition-colors hover:bg-black/70\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<X className=\"h-5 w-5\" />\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\t\t\t\t{children}\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t);\n}\n","\"use client\";\n\nimport { X } from \"lucide-react\";\n\nimport { MediaViewerDialog } from \"../media/MediaViewerDialog\";\nimport {\n\tPdfViewer,\n\ttype PdfViewerLabels,\n\ttype PdfViewerProps,\n} from \"./PdfViewer\";\n\nexport type PdfViewerDialogProps = {\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n\ttitle: string;\n\tfileUrl: string;\n\tfileName?: string;\n\tdownloadUrl?: string;\n\tworkerSrc: string;\n\tinitialPage?: number;\n\tlabels: PdfViewerLabels & {\n\t\tclose?: string;\n\t\tdialogDescription?: string;\n\t};\n};\n\n/**\n * Drop-in dialog wrapper around {@link PdfViewer} using\n * {@link MediaViewerDialog} for the fullscreen shell. Title and close live\n * in the PDF toolbar (via `closeAction`) so chrome stays a single row.\n */\nexport function PdfViewerDialog({\n\topen,\n\tonOpenChange,\n\ttitle,\n\tfileUrl,\n\tfileName,\n\tdownloadUrl,\n\tworkerSrc,\n\tinitialPage,\n\tlabels,\n}: PdfViewerDialogProps) {\n\tconst viewerLabels: PdfViewerProps[\"labels\"] = labels;\n\tconst closeLabel = labels.close ?? \"Cerrar\";\n\n\treturn (\n\t\t<MediaViewerDialog\n\t\t\topen={open}\n\t\t\tonOpenChange={onOpenChange}\n\t\t\tshowCloseButton={false}\n\t\t\tlabels={{\n\t\t\t\tclose: closeLabel,\n\t\t\t\ttitle,\n\t\t\t\tdescription: labels.dialogDescription ?? title,\n\t\t\t}}\n\t\t>\n\t\t\t<PdfViewer\n\t\t\t\tfileUrl={fileUrl}\n\t\t\t\tfileName={fileName ?? title}\n\t\t\t\tdownloadUrl={downloadUrl}\n\t\t\t\tworkerSrc={workerSrc}\n\t\t\t\tinitialPage={initialPage}\n\t\t\t\tlabels={viewerLabels}\n\t\t\t\tclassName=\"min-h-0 w-full min-w-0 flex-1\"\n\t\t\t\tcloseAction={\n\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => onOpenChange(false)}\n\t\t\t\t\t\t\taria-label={closeLabel}\n\t\t\t\t\t\t\tclassName=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border bg-background text-foreground hover:bg-accent\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<X className=\"h-4 w-4\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<span className=\"max-w-[min(40vw,16rem)] truncate text-sm font-medium text-foreground\">\n\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t/>\n\t\t</MediaViewerDialog>\n\t);\n}\n"]}
|