@sesionario/blocks 1.31.0 → 1.31.2

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/pdf.cjs CHANGED
@@ -466,10 +466,11 @@ function PdfViewer({
466
466
  const [numPages, setNumPages] = react.useState(0);
467
467
  const [pageNumber, setPageNumber] = react.useState(initialPage);
468
468
  const [zoomIndex, setZoomIndex] = react.useState(2);
469
- const [fitMode, setFitMode] = react.useState("width");
469
+ const [fitMode, setFitMode] = react.useState("page");
470
470
  const [rotation, setRotation] = react.useState(0);
471
471
  const [containerWidth, setContainerWidth] = react.useState(0);
472
472
  const [containerHeight, setContainerHeight] = react.useState(0);
473
+ const [pageNatural, setPageNatural] = react.useState(null);
473
474
  const [isFullscreen, setIsFullscreen] = react.useState(false);
474
475
  const [thumbsOpen, setThumbsOpen] = react.useState(false);
475
476
  const [loadError, setLoadError] = react.useState(false);
@@ -516,37 +517,57 @@ function PdfViewer({
516
517
  setPageNumber(initialPage);
517
518
  setPageDraft(String(initialPage));
518
519
  setZoomIndex(2);
519
- setFitMode("width");
520
+ setFitMode("page");
520
521
  setRotation(0);
521
522
  setNumPages(0);
523
+ setPageNatural(null);
522
524
  setLoadError(false);
523
525
  setThumbsOpen(false);
524
526
  reset();
525
527
  }, [fileUrl, initialPage, reset]);
526
528
  react.useEffect(() => {
527
529
  reset();
530
+ setPageNatural(null);
528
531
  }, [pageNumber, reset]);
532
+ const measureViewport = react.useCallback(() => {
533
+ const el = viewportRef.current;
534
+ if (!el) return;
535
+ const w = el.clientWidth;
536
+ const h = el.clientHeight;
537
+ if (w > 0) setContainerWidth(w);
538
+ if (h > 0) setContainerHeight(h);
539
+ }, []);
529
540
  react.useEffect(() => {
530
541
  if (!viewportRef.current) return;
531
542
  const el = viewportRef.current;
532
543
  const observer = new ResizeObserver((entries) => {
533
544
  const rect = entries[0]?.contentRect;
534
545
  if (!rect) return;
535
- setContainerWidth(rect.width);
536
- setContainerHeight(rect.height);
546
+ if (rect.width > 0) setContainerWidth(rect.width);
547
+ if (rect.height > 0) setContainerHeight(rect.height);
537
548
  });
538
549
  observer.observe(el);
539
- setContainerWidth(el.clientWidth);
540
- setContainerHeight(el.clientHeight);
541
- return () => observer.disconnect();
542
- }, []);
550
+ measureViewport();
551
+ const raf = requestAnimationFrame(() => {
552
+ measureViewport();
553
+ requestAnimationFrame(measureViewport);
554
+ });
555
+ return () => {
556
+ observer.disconnect();
557
+ cancelAnimationFrame(raf);
558
+ };
559
+ }, [measureViewport]);
560
+ react.useEffect(() => {
561
+ measureViewport();
562
+ }, [thumbsOpen, measureViewport]);
543
563
  react.useEffect(() => {
544
564
  function onFullscreenChange() {
545
565
  setIsFullscreen(document.fullscreenElement === shellRef.current);
566
+ requestAnimationFrame(measureViewport);
546
567
  }
547
568
  document.addEventListener("fullscreenchange", onFullscreenChange);
548
569
  return () => document.removeEventListener("fullscreenchange", onFullscreenChange);
549
- }, []);
570
+ }, [measureViewport]);
550
571
  react.useEffect(() => {
551
572
  function onKeyDown(e) {
552
573
  const target = e.target;
@@ -616,8 +637,20 @@ function PdfViewer({
616
637
  if (Number.isFinite(parsed)) goToPage(parsed);
617
638
  else setPageDraft(String(pageNumber));
618
639
  }
619
- const pageWidth = fitMode === "width" ? Math.max(containerWidth - 32, 240) * baseScale : void 0;
620
- const pageHeight = fitMode === "page" ? Math.max(containerHeight - 32, 240) * baseScale : void 0;
640
+ const PAD = 32;
641
+ const availW = Math.max(containerWidth - PAD, 240);
642
+ const availH = Math.max(containerHeight - PAD, 240);
643
+ const rotated = rotation % 180 !== 0 && pageNatural ? { width: pageNatural.height, height: pageNatural.width } : pageNatural;
644
+ let pageWidth;
645
+ if (fitMode === "width" || !rotated) {
646
+ pageWidth = availW * baseScale;
647
+ } else {
648
+ const scaleToFit = Math.min(
649
+ availW / rotated.width,
650
+ availH / rotated.height
651
+ );
652
+ pageWidth = rotated.width * scaleToFit * baseScale;
653
+ }
621
654
  const rawDownload = downloadUrl ?? fileUrl;
622
655
  const downloadHref = `${rawDownload}${rawDownload.includes("?") ? "&" : "?"}download=1`;
623
656
  const { scale: gestureScale, tx, ty } = transform;
@@ -832,7 +865,7 @@ function PdfViewer({
832
865
  "div",
833
866
  {
834
867
  ref: stageRef,
835
- className: "flex min-h-full touch-none items-start justify-center p-4",
868
+ className: "flex min-h-full min-w-full touch-none p-4",
836
869
  style: {
837
870
  transform: `translate(${tx}px, ${ty}px) scale(${gestureScale})`,
838
871
  transition
@@ -842,7 +875,7 @@ function PdfViewer({
842
875
  onPointerUp: handlers.onPointerUp,
843
876
  onPointerCancel: handlers.onPointerCancel,
844
877
  onTransitionEnd: clearSnapBack,
845
- children: /* @__PURE__ */ jsxRuntime.jsx(
878
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "m-auto", children: /* @__PURE__ */ jsxRuntime.jsx(
846
879
  reactPdf.Document,
847
880
  {
848
881
  file: fileUrl,
@@ -852,6 +885,7 @@ function PdfViewer({
852
885
  const start = Math.min(Math.max(1, initialPage), pages);
853
886
  setPageNumber(start);
854
887
  setPageDraft(String(start));
888
+ setFitMode(pages === 1 ? "page" : "width");
855
889
  },
856
890
  onLoadError: () => setLoadError(true),
857
891
  loading: /* @__PURE__ */ jsxRuntime.jsx(LoadingState, { label: labels.loading ?? "Cargando PDF\u2026" }),
@@ -867,14 +901,19 @@ function PdfViewer({
867
901
  {
868
902
  pageNumber,
869
903
  width: pageWidth,
870
- height: pageHeight,
871
904
  rotate: rotation,
872
905
  renderTextLayer: true,
873
- renderAnnotationLayer: true
906
+ renderAnnotationLayer: true,
907
+ onLoadSuccess: (page) => {
908
+ setPageNatural({
909
+ width: page.originalWidth,
910
+ height: page.originalHeight
911
+ });
912
+ }
874
913
  }
875
914
  )
876
915
  }
877
- )
916
+ ) })
878
917
  }
879
918
  )
880
919
  }
@@ -988,7 +1027,9 @@ function MediaViewerDialog({
988
1027
  {
989
1028
  showCloseButton: false,
990
1029
  className: cn(
991
- "inset-0 flex 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",
1030
+ // flex-col is required: without it the single child is a row item
1031
+ // sized to max-content (toolbar width) and the viewport collapses.
1032
+ "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",
992
1033
  contentClassName,
993
1034
  className
994
1035
  ),
@@ -1022,31 +1063,43 @@ function PdfViewerDialog({
1022
1063
  labels
1023
1064
  }) {
1024
1065
  const viewerLabels = labels;
1066
+ const closeLabel = labels.close ?? "Cerrar";
1025
1067
  return /* @__PURE__ */ jsxRuntime.jsx(
1026
1068
  MediaViewerDialog,
1027
1069
  {
1028
1070
  open,
1029
1071
  onOpenChange,
1072
+ showCloseButton: false,
1030
1073
  labels: {
1031
- close: labels.close,
1074
+ close: closeLabel,
1032
1075
  title,
1033
1076
  description: labels.dialogDescription ?? title
1034
1077
  },
1035
- children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-full min-h-0 flex-col pt-12", children: [
1036
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "border-b px-4 py-2 pr-14", children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "truncate text-sm font-medium", children: title }) }),
1037
- /* @__PURE__ */ jsxRuntime.jsx(
1038
- PdfViewer,
1039
- {
1040
- fileUrl,
1041
- fileName: fileName ?? title,
1042
- downloadUrl,
1043
- workerSrc,
1044
- initialPage,
1045
- labels: viewerLabels,
1046
- className: "min-h-0 flex-1"
1047
- }
1048
- )
1049
- ] })
1078
+ children: /* @__PURE__ */ jsxRuntime.jsx(
1079
+ PdfViewer,
1080
+ {
1081
+ fileUrl,
1082
+ fileName: fileName ?? title,
1083
+ downloadUrl,
1084
+ workerSrc,
1085
+ initialPage,
1086
+ labels: viewerLabels,
1087
+ className: "min-h-0 w-full min-w-0 flex-1",
1088
+ closeAction: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
1089
+ /* @__PURE__ */ jsxRuntime.jsx(
1090
+ "button",
1091
+ {
1092
+ type: "button",
1093
+ onClick: () => onOpenChange(false),
1094
+ "aria-label": closeLabel,
1095
+ className: "inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border bg-background text-foreground hover:bg-accent",
1096
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "h-4 w-4" })
1097
+ }
1098
+ ),
1099
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "max-w-[min(40vw,16rem)] truncate text-sm font-medium text-foreground", children: title })
1100
+ ] })
1101
+ }
1102
+ )
1050
1103
  }
1051
1104
  );
1052
1105
  }
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\">(\"width\");\n\tconst [rotation, setRotation] = useState(0);\n\tconst [containerWidth, setContainerWidth] = useState(0);\n\tconst [containerHeight, setContainerHeight] = useState(0);\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(\"width\");\n\t\tsetRotation(0);\n\t\tsetNumPages(0);\n\t\tsetLoadError(false);\n\t\tsetThumbsOpen(false);\n\t\treset();\n\t}, [fileUrl, initialPage, reset]);\n\n\tuseEffect(() => {\n\t\treset();\n\t}, [pageNumber, reset]);\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\tsetContainerWidth(rect.width);\n\t\t\tsetContainerHeight(rect.height);\n\t\t});\n\t\tobserver.observe(el);\n\t\tsetContainerWidth(el.clientWidth);\n\t\tsetContainerHeight(el.clientHeight);\n\t\treturn () => observer.disconnect();\n\t}, []);\n\n\tuseEffect(() => {\n\t\tfunction onFullscreenChange() {\n\t\t\tsetIsFullscreen(document.fullscreenElement === shellRef.current);\n\t\t}\n\t\tdocument.addEventListener(\"fullscreenchange\", onFullscreenChange);\n\t\treturn () =>\n\t\t\tdocument.removeEventListener(\"fullscreenchange\", onFullscreenChange);\n\t}, []);\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 pageWidth =\n\t\tfitMode === \"width\"\n\t\t\t? Math.max(containerWidth - 32, 240) * baseScale\n\t\t\t: undefined;\n\tconst pageHeight =\n\t\tfitMode === \"page\"\n\t\t\t? Math.max(containerHeight - 32, 240) * baseScale\n\t\t\t: undefined;\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 touch-none items-start justify-center 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<Document\n\t\t\t\t\t\t\t\tfile={fileUrl}\n\t\t\t\t\t\t\t\tonLoadSuccess={({ numPages: pages }) => {\n\t\t\t\t\t\t\t\t\tsetNumPages(pages);\n\t\t\t\t\t\t\t\t\tsetLoadError(false);\n\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\tsetPageNumber(start);\n\t\t\t\t\t\t\t\t\tsetPageDraft(String(start));\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonLoadError={() => setLoadError(true)}\n\t\t\t\t\t\t\t\tloading={\n\t\t\t\t\t\t\t\t\t<LoadingState label={labels.loading ?? \"Cargando PDF…\"} />\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\terror={\n\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<ErrorState\n\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\ttitle={labels.loadError ?? \"No se pudo cargar el PDF\"}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</div>\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{numPages > 0 && (\n\t\t\t\t\t\t\t\t\t<Page\n\t\t\t\t\t\t\t\t\t\tpageNumber={pageNumber}\n\t\t\t\t\t\t\t\t\t\twidth={pageWidth}\n\t\t\t\t\t\t\t\t\t\theight={pageHeight}\n\t\t\t\t\t\t\t\t\t\trotate={rotation}\n\t\t\t\t\t\t\t\t\t\trenderTextLayer\n\t\t\t\t\t\t\t\t\t\trenderAnnotationLayer\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</Document>\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\"inset-0 flex 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 { 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-on-mobile shell.\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\n\treturn (\n\t\t<MediaViewerDialog\n\t\t\topen={open}\n\t\t\tonOpenChange={onOpenChange}\n\t\t\tlabels={{\n\t\t\t\tclose: labels.close,\n\t\t\t\ttitle,\n\t\t\t\tdescription: labels.dialogDescription ?? title,\n\t\t\t}}\n\t\t>\n\t\t\t<div className=\"flex h-full min-h-0 flex-col pt-12\">\n\t\t\t\t<div className=\"border-b px-4 py-2 pr-14\">\n\t\t\t\t\t<p className=\"truncate text-sm font-medium\">{title}</p>\n\t\t\t\t</div>\n\t\t\t\t<PdfViewer\n\t\t\t\t\tfileUrl={fileUrl}\n\t\t\t\t\tfileName={fileName ?? title}\n\t\t\t\t\tdownloadUrl={downloadUrl}\n\t\t\t\t\tworkerSrc={workerSrc}\n\t\t\t\t\tinitialPage={initialPage}\n\t\t\t\t\tlabels={viewerLabels}\n\t\t\t\t\tclassName=\"min-h-0 flex-1\"\n\t\t\t\t/>\n\t\t\t</div>\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 { 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"]}