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