@sesionario/blocks 1.31.1 → 1.31.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +3 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/pdf.cjs +86 -33
- package/dist/pdf.cjs.map +1 -1
- package/dist/pdf.d.cts +2 -1
- package/dist/pdf.d.ts +2 -1
- package/dist/pdf.js +87 -34
- package/dist/pdf.js.map +1 -1
- package/package.json +1 -1
package/dist/pdf.cjs
CHANGED
|
@@ -466,10 +466,11 @@ function PdfViewer({
|
|
|
466
466
|
const [numPages, setNumPages] = react.useState(0);
|
|
467
467
|
const [pageNumber, setPageNumber] = react.useState(initialPage);
|
|
468
468
|
const [zoomIndex, setZoomIndex] = react.useState(2);
|
|
469
|
-
const [fitMode, setFitMode] = react.useState("
|
|
469
|
+
const [fitMode, setFitMode] = react.useState("page");
|
|
470
470
|
const [rotation, setRotation] = react.useState(0);
|
|
471
471
|
const [containerWidth, setContainerWidth] = react.useState(0);
|
|
472
472
|
const [containerHeight, setContainerHeight] = react.useState(0);
|
|
473
|
+
const [pageNatural, setPageNatural] = react.useState(null);
|
|
473
474
|
const [isFullscreen, setIsFullscreen] = react.useState(false);
|
|
474
475
|
const [thumbsOpen, setThumbsOpen] = react.useState(false);
|
|
475
476
|
const [loadError, setLoadError] = react.useState(false);
|
|
@@ -516,37 +517,57 @@ function PdfViewer({
|
|
|
516
517
|
setPageNumber(initialPage);
|
|
517
518
|
setPageDraft(String(initialPage));
|
|
518
519
|
setZoomIndex(2);
|
|
519
|
-
setFitMode("
|
|
520
|
+
setFitMode("page");
|
|
520
521
|
setRotation(0);
|
|
521
522
|
setNumPages(0);
|
|
523
|
+
setPageNatural(null);
|
|
522
524
|
setLoadError(false);
|
|
523
525
|
setThumbsOpen(false);
|
|
524
526
|
reset();
|
|
525
527
|
}, [fileUrl, initialPage, reset]);
|
|
526
528
|
react.useEffect(() => {
|
|
527
529
|
reset();
|
|
530
|
+
setPageNatural(null);
|
|
528
531
|
}, [pageNumber, reset]);
|
|
532
|
+
const measureViewport = react.useCallback(() => {
|
|
533
|
+
const el = viewportRef.current;
|
|
534
|
+
if (!el) return;
|
|
535
|
+
const w = el.clientWidth;
|
|
536
|
+
const h = el.clientHeight;
|
|
537
|
+
if (w > 0) setContainerWidth(w);
|
|
538
|
+
if (h > 0) setContainerHeight(h);
|
|
539
|
+
}, []);
|
|
529
540
|
react.useEffect(() => {
|
|
530
541
|
if (!viewportRef.current) return;
|
|
531
542
|
const el = viewportRef.current;
|
|
532
543
|
const observer = new ResizeObserver((entries) => {
|
|
533
544
|
const rect = entries[0]?.contentRect;
|
|
534
545
|
if (!rect) return;
|
|
535
|
-
setContainerWidth(rect.width);
|
|
536
|
-
setContainerHeight(rect.height);
|
|
546
|
+
if (rect.width > 0) setContainerWidth(rect.width);
|
|
547
|
+
if (rect.height > 0) setContainerHeight(rect.height);
|
|
537
548
|
});
|
|
538
549
|
observer.observe(el);
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
550
|
+
measureViewport();
|
|
551
|
+
const raf = requestAnimationFrame(() => {
|
|
552
|
+
measureViewport();
|
|
553
|
+
requestAnimationFrame(measureViewport);
|
|
554
|
+
});
|
|
555
|
+
return () => {
|
|
556
|
+
observer.disconnect();
|
|
557
|
+
cancelAnimationFrame(raf);
|
|
558
|
+
};
|
|
559
|
+
}, [measureViewport]);
|
|
560
|
+
react.useEffect(() => {
|
|
561
|
+
measureViewport();
|
|
562
|
+
}, [thumbsOpen, measureViewport]);
|
|
543
563
|
react.useEffect(() => {
|
|
544
564
|
function onFullscreenChange() {
|
|
545
565
|
setIsFullscreen(document.fullscreenElement === shellRef.current);
|
|
566
|
+
requestAnimationFrame(measureViewport);
|
|
546
567
|
}
|
|
547
568
|
document.addEventListener("fullscreenchange", onFullscreenChange);
|
|
548
569
|
return () => document.removeEventListener("fullscreenchange", onFullscreenChange);
|
|
549
|
-
}, []);
|
|
570
|
+
}, [measureViewport]);
|
|
550
571
|
react.useEffect(() => {
|
|
551
572
|
function onKeyDown(e) {
|
|
552
573
|
const target = e.target;
|
|
@@ -616,8 +637,20 @@ function PdfViewer({
|
|
|
616
637
|
if (Number.isFinite(parsed)) goToPage(parsed);
|
|
617
638
|
else setPageDraft(String(pageNumber));
|
|
618
639
|
}
|
|
619
|
-
const
|
|
620
|
-
const
|
|
640
|
+
const PAD = 32;
|
|
641
|
+
const availW = Math.max(containerWidth - PAD, 240);
|
|
642
|
+
const availH = Math.max(containerHeight - PAD, 240);
|
|
643
|
+
const rotated = rotation % 180 !== 0 && pageNatural ? { width: pageNatural.height, height: pageNatural.width } : pageNatural;
|
|
644
|
+
let pageWidth;
|
|
645
|
+
if (fitMode === "width" || !rotated) {
|
|
646
|
+
pageWidth = availW * baseScale;
|
|
647
|
+
} else {
|
|
648
|
+
const scaleToFit = Math.min(
|
|
649
|
+
availW / rotated.width,
|
|
650
|
+
availH / rotated.height
|
|
651
|
+
);
|
|
652
|
+
pageWidth = rotated.width * scaleToFit * baseScale;
|
|
653
|
+
}
|
|
621
654
|
const rawDownload = downloadUrl ?? fileUrl;
|
|
622
655
|
const downloadHref = `${rawDownload}${rawDownload.includes("?") ? "&" : "?"}download=1`;
|
|
623
656
|
const { scale: gestureScale, tx, ty } = transform;
|
|
@@ -832,7 +865,7 @@ function PdfViewer({
|
|
|
832
865
|
"div",
|
|
833
866
|
{
|
|
834
867
|
ref: stageRef,
|
|
835
|
-
className: "flex min-h-full
|
|
868
|
+
className: "flex min-h-full min-w-full touch-none p-4",
|
|
836
869
|
style: {
|
|
837
870
|
transform: `translate(${tx}px, ${ty}px) scale(${gestureScale})`,
|
|
838
871
|
transition
|
|
@@ -842,7 +875,7 @@ function PdfViewer({
|
|
|
842
875
|
onPointerUp: handlers.onPointerUp,
|
|
843
876
|
onPointerCancel: handlers.onPointerCancel,
|
|
844
877
|
onTransitionEnd: clearSnapBack,
|
|
845
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
878
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "m-auto", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
846
879
|
reactPdf.Document,
|
|
847
880
|
{
|
|
848
881
|
file: fileUrl,
|
|
@@ -852,6 +885,7 @@ function PdfViewer({
|
|
|
852
885
|
const start = Math.min(Math.max(1, initialPage), pages);
|
|
853
886
|
setPageNumber(start);
|
|
854
887
|
setPageDraft(String(start));
|
|
888
|
+
setFitMode(pages === 1 ? "page" : "width");
|
|
855
889
|
},
|
|
856
890
|
onLoadError: () => setLoadError(true),
|
|
857
891
|
loading: /* @__PURE__ */ jsxRuntime.jsx(LoadingState, { label: labels.loading ?? "Cargando PDF\u2026" }),
|
|
@@ -867,14 +901,19 @@ function PdfViewer({
|
|
|
867
901
|
{
|
|
868
902
|
pageNumber,
|
|
869
903
|
width: pageWidth,
|
|
870
|
-
height: pageHeight,
|
|
871
904
|
rotate: rotation,
|
|
872
905
|
renderTextLayer: true,
|
|
873
|
-
renderAnnotationLayer: true
|
|
906
|
+
renderAnnotationLayer: true,
|
|
907
|
+
onLoadSuccess: (page) => {
|
|
908
|
+
setPageNatural({
|
|
909
|
+
width: page.originalWidth,
|
|
910
|
+
height: page.originalHeight
|
|
911
|
+
});
|
|
912
|
+
}
|
|
874
913
|
}
|
|
875
914
|
)
|
|
876
915
|
}
|
|
877
|
-
)
|
|
916
|
+
) })
|
|
878
917
|
}
|
|
879
918
|
)
|
|
880
919
|
}
|
|
@@ -988,7 +1027,9 @@ function MediaViewerDialog({
|
|
|
988
1027
|
{
|
|
989
1028
|
showCloseButton: false,
|
|
990
1029
|
className: cn(
|
|
991
|
-
|
|
1030
|
+
// flex-col is required: without it the single child is a row item
|
|
1031
|
+
// sized to max-content (toolbar width) and the viewport collapses.
|
|
1032
|
+
"inset-0 flex flex-col h-dvh max-h-dvh w-screen max-w-none translate-x-0 translate-y-0 top-0 left-0 gap-0 overflow-hidden rounded-none border-0 p-0 shadow-none sm:max-w-none",
|
|
992
1033
|
contentClassName,
|
|
993
1034
|
className
|
|
994
1035
|
),
|
|
@@ -1022,31 +1063,43 @@ function PdfViewerDialog({
|
|
|
1022
1063
|
labels
|
|
1023
1064
|
}) {
|
|
1024
1065
|
const viewerLabels = labels;
|
|
1066
|
+
const closeLabel = labels.close ?? "Cerrar";
|
|
1025
1067
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1026
1068
|
MediaViewerDialog,
|
|
1027
1069
|
{
|
|
1028
1070
|
open,
|
|
1029
1071
|
onOpenChange,
|
|
1072
|
+
showCloseButton: false,
|
|
1030
1073
|
labels: {
|
|
1031
|
-
close:
|
|
1074
|
+
close: closeLabel,
|
|
1032
1075
|
title,
|
|
1033
1076
|
description: labels.dialogDescription ?? title
|
|
1034
1077
|
},
|
|
1035
|
-
children: /* @__PURE__ */ jsxRuntime.
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1078
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1079
|
+
PdfViewer,
|
|
1080
|
+
{
|
|
1081
|
+
fileUrl,
|
|
1082
|
+
fileName: fileName ?? title,
|
|
1083
|
+
downloadUrl,
|
|
1084
|
+
workerSrc,
|
|
1085
|
+
initialPage,
|
|
1086
|
+
labels: viewerLabels,
|
|
1087
|
+
className: "min-h-0 w-full min-w-0 flex-1",
|
|
1088
|
+
closeAction: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
1089
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1090
|
+
"button",
|
|
1091
|
+
{
|
|
1092
|
+
type: "button",
|
|
1093
|
+
onClick: () => onOpenChange(false),
|
|
1094
|
+
"aria-label": closeLabel,
|
|
1095
|
+
className: "inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border bg-background text-foreground hover:bg-accent",
|
|
1096
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "h-4 w-4" })
|
|
1097
|
+
}
|
|
1098
|
+
),
|
|
1099
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "max-w-[min(40vw,16rem)] truncate text-sm font-medium text-foreground", children: title })
|
|
1100
|
+
] })
|
|
1101
|
+
}
|
|
1102
|
+
)
|
|
1050
1103
|
}
|
|
1051
1104
|
);
|
|
1052
1105
|
}
|
package/dist/pdf.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/utils.ts","../src/hooks/useZoomPanGestures.ts","../src/components/EmptyState.tsx","../src/components/pdf/LazyThumbnail.tsx","../src/components/pdf/worker.ts","../src/components/pdf/PdfViewer.tsx","../src/components/ui/dialog.tsx","../src/components/media/MediaViewerDialog.tsx","../src/components/pdf/PdfViewerDialog.tsx"],"names":["twMerge","clsx","useState","useRef","useCallback","useEffect","dx","dy","jsxs","jsx","Loader2","AlertTriangle","Thumbnail","pdfjs","Fragment","PanelLeftClose","PanelLeft","ChevronLeft","ChevronRight","ZoomOut","ZoomIn","RotateCw","Minimize2","Maximize2","Download","Document","Page","DialogPrimitive","XIcon","X"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGO,SAAS,MAAM,MAAA,EAAsB;AAC3C,EAAA,OAAOA,qBAAA,CAAQC,SAAA,CAAK,MAAM,CAAC,CAAA;AAC5B;ACMO,IAAM,kBAAA,GAAqB,CAAA;AAC3B,IAAM,kBAAA,GAAqB,CAAA;AAC3B,IAAM,sBAAA,GAAyB,GAAA;AAC/B,IAAM,sBAAA,GAAyB,CAAA;AAC/B,IAAM,wBAAA,GAA2B,EAAA;AACjC,IAAM,sBAAA,GAAyB,GAAA;AA2CtC,IAAM,WAA6B,EAAE,KAAA,EAAO,GAAG,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA,EAAE;AAE5D,SAAS,KAAA,CAAM,KAAA,EAAe,GAAA,EAAa,GAAA,EAAa;AACvD,EAAA,OAAO,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,CAAC,CAAA;AAC1C;AAEO,SAAS,UAAA,CACf,MACA,SAAA,EACA,OAAA,EACA,SACA,QAAA,GAAW,kBAAA,EACX,WAAW,kBAAA,EACQ;AACnB,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,SAAA,EAAW,QAAA,EAAU,QAAQ,CAAA;AACjD,EAAA,IAAI,UAAU,QAAA,EAAU,OAAO,EAAE,GAAG,QAAA,EAAU,OAAO,QAAA,EAAS;AAC9D,EAAA,MAAM,KAAA,GAAQ,QAAQ,IAAA,CAAK,KAAA;AAC3B,EAAA,OAAO;AAAA,IACN,KAAA;AAAA,IACA,EAAA,EAAI,OAAA,GAAA,CAAW,OAAA,GAAU,IAAA,CAAK,EAAA,IAAM,KAAA;AAAA,IACpC,EAAA,EAAI,OAAA,GAAA,CAAW,OAAA,GAAU,IAAA,CAAK,EAAA,IAAM;AAAA,GACrC;AACD;AAEA,SAAS,eAAA,CACR,GACA,CAAA,EACC;AACD,EAAA,OAAO,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AACvC;AAEO,SAAS,oBAAA,GAAuB;AACtC,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,MAAA,CAAO,YAAY,OAAO,KAAA;AAChE,EAAA,OAAO,MAAA,CAAO,UAAA,CAAW,kCAAkC,CAAA,CAAE,OAAA;AAC9D;AAOO,SAAS,kBAAA,CACf,OAAA,GAAqC,EAAC,EACX;AAC3B,EAAA,MAAM;AAAA,IACL,QAAA,GAAW,kBAAA;AAAA,IACX,QAAA,GAAW,kBAAA;AAAA,IACX,YAAA,GAAe,IAAA;AAAA,IACf,aAAA;AAAA,IACA,SAAA,GAAY,IAAA;AAAA,IACZ,SAAA,GAAY;AAAA,GACb,GAAI,OAAA;AAEJ,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIC,cAAA,CAA2B;AAAA,IAC5D,GAAG,QAAA;AAAA,IACH,KAAA,EAAO;AAAA,GACP,CAAA;AACD,EAAA,MAAM,YAAA,GAAeC,aAAO,SAAS,CAAA;AACrC,EAAA,YAAA,CAAa,OAAA,GAAU,SAAA;AAEvB,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAID,eAAS,KAAK,CAAA;AAC5D,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAS,KAAK,CAAA;AAE9C,EAAA,MAAM,QAAA,GAAWC,aAAuB,IAAI,CAAA;AAC5C,EAAA,MAAM,WAAA,GAAcA,YAAA,iBAAO,IAAI,GAAA,EAAuC,CAAA;AACtE,EAAA,MAAM,aAAA,GAAgBA,aAKZ,IAAI,CAAA;AACd,EAAA,MAAM,MAAA,GAASA,aAOL,IAAI,CAAA;AACd,EAAA,MAAM,QAAA,GAAWA,aAMP,IAAI,CAAA;AACd,EAAA,MAAM,UAAA,GAAaA,YAAA;AAAA,IAClB;AAAA,GACD;AACA,EAAA,MAAM,gBAAA,GAAmBA,aAAO,aAAa,CAAA;AAC7C,EAAA,gBAAA,CAAiB,OAAA,GAAU,aAAA;AAC3B,EAAA,MAAM,eAAA,GAAkBA,aAAO,YAAY,CAAA;AAC3C,EAAA,eAAA,CAAgB,OAAA,GAAU,YAAA;AAC1B,EAAA,MAAM,WAAA,GAAcA,aAAO,QAAQ,CAAA;AACnC,EAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AACtB,EAAA,MAAM,WAAA,GAAcA,aAAO,QAAQ,CAAA;AACnC,EAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AACtB,EAAA,MAAM,YAAA,GAAeA,aAAO,SAAS,CAAA;AACrC,EAAA,YAAA,CAAa,OAAA,GAAU,SAAA;AAEvB,EAAA,MAAM,KAAA,GAAQC,kBAAY,MAAM;AAC/B,IAAA,YAAA,CAAa,EAAE,GAAG,QAAA,EAAU,KAAA,EAAO,WAAA,CAAY,SAAS,CAAA;AACxD,IAAA,kBAAA,CAAmB,KAAK,CAAA;AACxB,IAAA,WAAA,CAAY,KAAK,CAAA;AAAA,EAClB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,QAAA,GAAWA,iBAAA,CAAY,CAAC,IAAA,KAAiB;AAC9C,IAAA,YAAA;AAAA,MAAa,CAAC,IAAA,KACb,UAAA,CAAW,IAAA,EAAM,IAAA,EAAM,GAAG,CAAA,EAAG,WAAA,CAAY,OAAA,EAAS,WAAA,CAAY,OAAO;AAAA,KACtE;AAAA,EACD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgBA,kBAAY,MAAM;AACvC,IAAA,WAAA,CAAY,KAAK,CAAA;AAAA,EAClB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,WAAA,GAAcA,iBAAA,CAAY,CAAC,OAAA,EAAiB,OAAA,KAAoB;AACrE,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAChC,IAAA,MAAM,IAAA,GAAO,MAAM,qBAAA,EAAsB;AACzC,IAAA,OAAO;AAAA,MACN,CAAA,EAAG,OAAA,GAAU,IAAA,CAAK,IAAA,GAAO,KAAK,KAAA,GAAQ,CAAA;AAAA,MACtC,CAAA,EAAG,OAAA,GAAU,IAAA,CAAK,GAAA,GAAM,KAAK,MAAA,GAAS;AAAA,KACvC;AAAA,EACD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAAC,eAAA,CAAU,MAAM;AACf,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAkB;AACtC,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,MAAM,OAAO,YAAA,CAAa,OAAA;AAC1B,MAAA,MAAM,MAAA,GAAS,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,GAAA;AACpC,MAAA,MAAM,EAAE,GAAG,CAAA,EAAE,GAAI,YAAY,CAAA,CAAE,OAAA,EAAS,EAAE,OAAO,CAAA;AACjD,MAAA,YAAA;AAAA,QACC,UAAA;AAAA,UACC,IAAA;AAAA,UACA,KAAK,KAAA,GAAQ,MAAA;AAAA,UACb,CAAA;AAAA,UACA,CAAA;AAAA,UACA,WAAA,CAAY,OAAA;AAAA,UACZ,WAAA,CAAY;AAAA;AACb,OACD;AAAA,IACD,CAAA;AAEA,IAAA,KAAA,CAAM,iBAAiB,OAAA,EAAS,WAAA,EAAa,EAAE,OAAA,EAAS,OAAO,CAAA;AAC/D,IAAA,OAAO,MAAM,KAAA,CAAM,mBAAA,CAAoB,OAAA,EAAS,WAAW,CAAA;AAAA,EAC5D,CAAA,EAAG,CAAC,WAAA,EAAa,SAAS,CAAC,CAAA;AAE3B,EAAA,SAAS,UAAA,GAAa;AACrB,IAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AACnB,IAAA,kBAAA,CAAmB,KAAK,CAAA;AAAA,EACzB;AAEA,EAAA,SAAS,UAAA,GAAa;AACrB,IAAA,MAAM,MAAM,CAAC,GAAG,WAAA,CAAY,OAAA,CAAQ,QAAQ,CAAA;AAC5C,IAAA,MAAM,CAAC,CAAA,EAAG,CAAC,CAAA,GAAI,GAAA;AACf,IAAA,IAAI,CAAC,CAAA,IAAK,CAAC,CAAA,EAAG;AACd,IAAA,MAAM,IAAA,GAAA,CAAQ,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,IAAK,CAAA;AAC3B,IAAA,MAAM,IAAA,GAAA,CAAQ,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,IAAK,CAAA;AAC3B,IAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAE,GAAI,WAAA,CAAY,MAAM,IAAI,CAAA;AACvC,IAAA,aAAA,CAAc,OAAA,GAAU;AAAA,MACvB,UAAU,IAAA,CAAK,GAAA,CAAI,gBAAgB,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAAA,MAC3C,OAAA,EAAS,CAAA;AAAA,MACT,OAAA,EAAS,CAAA;AAAA,MACT,SAAA,EAAW,EAAE,GAAG,YAAA,CAAa,OAAA;AAAQ,KACtC;AACA,IAAA,MAAA,CAAO,OAAA,GAAU,IAAA;AACjB,IAAA,UAAA,EAAW;AACX,IAAA,WAAA,CAAY,KAAK,CAAA;AAAA,EAClB;AAEA,EAAA,SAAS,cAAc,CAAA,EAAsC;AAC5D,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,IAAI,OAAO,KAAA,CAAM,iBAAA,KAAsB,UAAA,EAAY;AAClD,MAAA,KAAA,CAAM,iBAAA,CAAkB,EAAE,SAAS,CAAA;AAAA,IACpC;AACA,IAAA,WAAA,CAAY,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,SAAA,EAAW,EAAE,CAAA,EAAG,CAAA,CAAE,OAAA,EAAS,CAAA,EAAG,CAAA,CAAE,OAAA,EAAS,CAAA;AACnE,IAAA,WAAA,CAAY,KAAK,CAAA;AAEjB,IAAA,IAAI,WAAA,CAAY,OAAA,CAAQ,IAAA,KAAS,CAAA,EAAG;AACnC,MAAA,UAAA,EAAW;AACX,MAAA;AAAA,IACD;AAEA,IAAA,IAAI,YAAA,CAAa,OAAA,CAAQ,KAAA,GAAQ,WAAA,CAAY,OAAA,EAAS;AACrD,MAAA,MAAA,CAAO,OAAA,GAAU;AAAA,QAChB,WAAW,CAAA,CAAE,SAAA;AAAA,QACb,QAAQ,CAAA,CAAE,OAAA;AAAA,QACV,QAAQ,CAAA,CAAE,OAAA;AAAA,QACV,QAAA,EAAU,aAAa,OAAA,CAAQ,EAAA;AAAA,QAC/B,QAAA,EAAU,aAAa,OAAA,CAAQ,EAAA;AAAA,QAC/B,KAAA,EAAO;AAAA,OACR;AACA,MAAA;AAAA,IACD;AAEA,IAAA,IAAI,gBAAgB,OAAA,EAAS;AAC5B,MAAA,QAAA,CAAS,OAAA,GAAU;AAAA,QAClB,WAAW,CAAA,CAAE,SAAA;AAAA,QACb,QAAQ,CAAA,CAAE,OAAA;AAAA,QACV,QAAQ,CAAA,CAAE,OAAA;AAAA,QACV,KAAA,EAAO,KAAA;AAAA,QACP,IAAA,EAAM;AAAA,OACP;AACA,MAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,IACxB;AAAA,EACD;AAEA,EAAA,SAAS,cAAc,CAAA,EAAsC;AAC5D,IAAA,IAAI,CAAC,WAAA,CAAY,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAC3C,IAAA,WAAA,CAAY,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,SAAA,EAAW,EAAE,CAAA,EAAG,CAAA,CAAE,OAAA,EAAS,CAAA,EAAG,CAAA,CAAE,OAAA,EAAS,CAAA;AAEnE,IAAA,MAAM,aAAa,aAAA,CAAc,OAAA;AACjC,IAAA,IAAI,WAAA,CAAY,OAAA,CAAQ,IAAA,IAAQ,CAAA,IAAK,UAAA,EAAY;AAChD,MAAA,MAAM,MAAM,CAAC,GAAG,WAAA,CAAY,OAAA,CAAQ,QAAQ,CAAA;AAC5C,MAAA,MAAM,CAAC,CAAA,EAAG,CAAC,CAAA,GAAI,GAAA;AACf,MAAA,IAAI,CAAC,CAAA,IAAK,CAAC,CAAA,EAAG;AACd,MAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,gBAAgB,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAClD,MAAA,MAAM,SAAA,GACL,UAAA,CAAW,SAAA,CAAU,KAAA,IAAS,WAAW,UAAA,CAAW,QAAA,CAAA;AACrD,MAAA,YAAA;AAAA,QACC,UAAA;AAAA,UACC,UAAA,CAAW,SAAA;AAAA,UACX,SAAA;AAAA,UACA,UAAA,CAAW,OAAA;AAAA,UACX,UAAA,CAAW,OAAA;AAAA,UACX,WAAA,CAAY,OAAA;AAAA,UACZ,WAAA,CAAY;AAAA;AACb,OACD;AACA,MAAA;AAAA,IACD;AAEA,IAAA,MAAM,MAAM,MAAA,CAAO,OAAA;AACnB,IAAA,IAAI,GAAA,IAAO,GAAA,CAAI,SAAA,KAAc,CAAA,CAAE,SAAA,EAAW;AACzC,MAAA,MAAMC,GAAAA,GAAK,CAAA,CAAE,OAAA,GAAU,GAAA,CAAI,MAAA;AAC3B,MAAA,MAAMC,GAAAA,GAAK,CAAA,CAAE,OAAA,GAAU,GAAA,CAAI,MAAA;AAC3B,MAAA,IAAI,IAAA,CAAK,GAAA,CAAID,GAAE,CAAA,GAAI,CAAA,IAAK,IAAA,CAAK,GAAA,CAAIC,GAAE,CAAA,GAAI,CAAA,EAAG,GAAA,CAAI,KAAA,GAAQ,IAAA;AACtD,MAAA,YAAA,CAAa,CAAC,IAAA,MAAU;AAAA,QACvB,GAAG,IAAA;AAAA,QACH,EAAA,EAAI,IAAI,QAAA,GAAWD,GAAAA;AAAA,QACnB,EAAA,EAAI,IAAI,QAAA,GAAWC;AAAA,OACpB,CAAE,CAAA;AACF,MAAA;AAAA,IACD;AAEA,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,SAAA,KAAc,EAAE,SAAA,EAAW;AAE/C,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,KAAA,CAAM,MAAA;AAC7B,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,KAAA,CAAM,MAAA;AAC7B,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,GAAI,CAAA,IAAK,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,GAAI,CAAA,EAAG,KAAA,CAAM,KAAA,GAAQ,IAAA;AAExD,IAAA,IAAI,KAAA,CAAM,SAAS,IAAA,EAAM;AACxB,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACxB,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACxB,MAAA,IAAI,IAAA,GAAO,sBAAA,IAA0B,IAAA,GAAO,sBAAA,EAAwB;AACnE,QAAA;AAAA,MACD;AACA,MAAA,KAAA,CAAM,IAAA,GAAO,IAAA,IAAQ,IAAA,GAAO,GAAA,GAAM,GAAA;AAClC,MAAA,IAAI,KAAA,CAAM,SAAS,GAAA,EAAK;AACvB,QAAA,UAAA,EAAW;AACX,QAAA,YAAA,CAAa,EAAE,GAAG,QAAA,EAAU,KAAA,EAAO,WAAA,CAAY,SAAS,CAAA;AACxD,QAAA;AAAA,MACD;AAAA,IACD;AAEA,IAAA,IAAI,KAAA,CAAM,SAAS,GAAA,EAAK;AACvB,MAAA,YAAA,CAAa;AAAA,QACZ,OAAO,WAAA,CAAY,OAAA;AAAA,QACnB,EAAA,EAAI,EAAA;AAAA,QACJ,EAAA,EAAI;AAAA,OACJ,CAAA;AAAA,IACF;AAAA,EACD;AAEA,EAAA,SAAS,YAAY,CAAA,EAAsC;AAC1D,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,SAAA,KAAc,CAAA,CAAE,WAAW,OAAO,KAAA;AAEtD,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,KAAA,CAAM,MAAA;AAC7B,IAAA,MAAM,WAAW,KAAA,CAAM,KAAA;AACvB,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,IAAA,UAAA,EAAW;AAEX,IAAA,IAAI,SAAS,GAAA,IAAO,IAAA,CAAK,GAAA,CAAI,EAAE,KAAK,wBAAA,EAA0B;AAC7D,MAAA,gBAAA,CAAiB,OAAA,GAAU,EAAA,GAAK,CAAA,GAAI,MAAA,GAAS,MAAM,CAAA;AACnD,MAAA,OAAO,IAAA;AAAA,IACR;AAEA,IAAA,IAAI,QAAA,IAAY,YAAA,CAAa,OAAA,CAAQ,EAAA,KAAO,CAAA,EAAG;AAC9C,MAAA,IAAI,CAAC,oBAAA,EAAqB,EAAG,WAAA,CAAY,IAAI,CAAA;AAC7C,MAAA,YAAA,CAAa,EAAE,GAAG,QAAA,EAAU,KAAA,EAAO,WAAA,CAAY,SAAS,CAAA;AAAA,IACzD;AACA,IAAA,OAAO,QAAA;AAAA,EACR;AAEA,EAAA,SAAS,YAAY,CAAA,EAAsC;AAC1D,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,IACC,KAAA,IACA,OAAO,KAAA,CAAM,iBAAA,KAAsB,UAAA,IACnC,KAAA,CAAM,iBAAA,CAAkB,CAAA,CAAE,SAAS,CAAA,IACnC,OAAO,KAAA,CAAM,0BAA0B,UAAA,EACtC;AACD,MAAA,KAAA,CAAM,qBAAA,CAAsB,EAAE,SAAS,CAAA;AAAA,IACxC;AACA,IAAA,WAAA,CAAY,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAE,SAAS,CAAA;AAEtC,IAAA,IAAI,WAAA,CAAY,OAAA,CAAQ,IAAA,GAAO,CAAA,EAAG;AACjC,MAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AAAA,IACzB;AACA,IAAA,IAAI,WAAA,CAAY,OAAA,CAAQ,IAAA,KAAS,CAAA,EAAG;AACnC,MAAA,MAAM,SAAA,GAAY,CAAC,GAAG,WAAA,CAAY,QAAQ,OAAA,EAAS,EAAE,CAAC,CAAA;AACtD,MAAA,IAAI,SAAA,IAAa,YAAA,CAAa,OAAA,CAAQ,KAAA,GAAQ,YAAY,OAAA,EAAS;AAClE,QAAA,MAAM,CAAC,SAAA,EAAW,KAAK,CAAA,GAAI,SAAA;AAC3B,QAAA,MAAA,CAAO,OAAA,GAAU;AAAA,UAChB,SAAA;AAAA,UACA,QAAQ,KAAA,CAAM,CAAA;AAAA,UACd,QAAQ,KAAA,CAAM,CAAA;AAAA,UACd,QAAA,EAAU,aAAa,OAAA,CAAQ,EAAA;AAAA,UAC/B,QAAA,EAAU,aAAa,OAAA,CAAQ,EAAA;AAAA,UAC/B,KAAA,EAAO;AAAA,SACR;AAAA,MACD;AAAA,IACD;AAEA,IAAA,MAAM,YAAA,GAAe,YAAY,CAAC,CAAA;AAClC,IAAA,IAAI,YAAA,EAAc;AAElB,IAAA,MAAM,MAAM,MAAA,CAAO,OAAA;AACnB,IAAA,IAAI,GAAA,IAAO,GAAA,CAAI,SAAA,KAAc,CAAA,CAAE,SAAA,EAAW;AACzC,MAAA,MAAM,WAAW,GAAA,CAAI,KAAA;AACrB,MAAA,MAAA,CAAO,OAAA,GAAU,IAAA;AACjB,MAAA,IAAI,QAAA,EAAU;AAAA,IACf;AAEA,IAAA,IAAI,YAAY,OAAA,CAAQ,IAAA,KAAS,CAAA,IAAK,CAAA,CAAE,WAAW,CAAA,EAAG;AACrD,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,MAAM,OAAO,UAAA,CAAW,OAAA;AACxB,MAAA,IACC,QACA,GAAA,GAAM,IAAA,CAAK,IAAA,GAAO,sBAAA,IAClB,KAAK,KAAA,CAAM,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,GAAG,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,CAAC,IAAI,EAAA,EACpD;AACD,QAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AACrB,QAAA,IACC,aAAa,OAAA,KAAY,QAAA,IACzB,aAAa,OAAA,CAAQ,KAAA,IAAS,YAAY,OAAA,EACzC;AACD,UAAA,MAAM,EAAE,GAAG,CAAA,EAAE,GAAI,YAAY,CAAA,CAAE,OAAA,EAAS,EAAE,OAAO,CAAA;AACjD,UAAA,YAAA;AAAA,YACC,UAAA;AAAA,cACC,YAAA,CAAa,OAAA;AAAA,cACb,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,WAAA,CAAY,OAAO,CAAA;AAAA,cAC/B,CAAA;AAAA,cACA,CAAA;AAAA,cACA,WAAA,CAAY,OAAA;AAAA,cACZ,WAAA,CAAY;AAAA;AACb,WACD;AAAA,QACD,CAAA,MAAO;AACN,UAAA,KAAA,EAAM;AAAA,QACP;AACA,QAAA;AAAA,MACD;AACA,MAAA,UAAA,CAAW,OAAA,GAAU,EAAE,IAAA,EAAM,GAAA,EAAK,GAAG,CAAA,CAAE,OAAA,EAAS,CAAA,EAAG,CAAA,CAAE,OAAA,EAAQ;AAAA,IAC9D;AAAA,EACD;AAEA,EAAA,OAAO;AAAA,IACN,QAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA,EAAY,eAAA;AAAA,IACZ,QAAA;AAAA,IACA,QAAA,EAAU;AAAA,MACT,aAAA;AAAA,MACA,aAAA;AAAA,MACA,WAAA;AAAA,MACA,eAAA,EAAiB;AAAA,KAClB;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACD;AACD;ACrbO,SAAS,YAAA,CAAa;AAAA,EAC5B,KAAA,GAAQ,gBAAA;AAAA,EACR;AACD,CAAA,EAGG;AACF,EAAA,uBACCC,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,IAAA,EAAK,QAAA;AAAA,MACL,WAAA,EAAU,QAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACV,4EAAA;AAAA,QACA;AAAA,OACD;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAACC,mBAAA,EAAA,EAAQ,SAAA,EAAU,qBAAA,EAAsB,aAAA,EAAY,MAAA,EAAO,CAAA;AAAA,wBAC5DD,cAAA,CAAC,UAAM,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA,GACd;AAEF;AAEO,SAAS,UAAA,CAAW;AAAA,EAC1B,KAAA,GAAQ,mBAAA;AAAA,EACR,WAAA;AAAA,EACA,MAAA;AAAA,EACA;AACD,CAAA,EAKG;AACF,EAAA,uBACCD,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,IAAA,EAAK,OAAA;AAAA,MACL,SAAA,EAAW,EAAA;AAAA,QACV,2HAAA;AAAA,QACA;AAAA,OACD;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAACE,yBAAA,EAAA,EAAc,SAAA,EAAU,yBAAA,EAA0B,aAAA,EAAY,MAAA,EAAO,CAAA;AAAA,wCACrE,KAAA,EAAA,EACA,QAAA,EAAA;AAAA,0BAAAF,cAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,aAAA,EAAe,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,UACjC,8BACAA,cAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oCAAA,EAAsC,uBAAY,CAAA,GAC5D;AAAA,SAAA,EACL,CAAA;AAAA,QACC;AAAA;AAAA;AAAA,GACF;AAEF;AC/CO,SAAS,aAAA,CAAc;AAAA,EAC7B,UAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA;AACD,CAAA,EAAuB;AACtB,EAAA,MAAM,GAAA,GAAMN,aAA0B,IAAI,CAAA;AAC1C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAID,eAAS,KAAK,CAAA;AAE5C,EAAAG,gBAAU,MAAM;AACf,IAAA,MAAM,OAAO,GAAA,CAAI,OAAA;AACjB,IAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,oBAAA,KAAyB,WAAA,EAAa;AACzD,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA;AAAA,IACD;AACA,IAAA,MAAM,WAAW,IAAI,oBAAA;AAAA,MACpB,CAAC,OAAA,KAAY;AACZ,QAAA,IAAI,QAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,cAAc,CAAA,EAAG;AAC1C,UAAA,UAAA,CAAW,IAAI,CAAA;AACf,UAAA,QAAA,CAAS,UAAA,EAAW;AAAA,QACrB;AAAA,MACD,CAAA;AAAA,MACA,EAAE,YAAY,WAAA;AAAY,KAC3B;AACA,IAAA,QAAA,CAAS,QAAQ,IAAI,CAAA;AACrB,IAAA,OAAO,MAAM,SAAS,UAAA,EAAW;AAAA,EAClC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBACCG,eAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACA,GAAA;AAAA,MACA,IAAA,EAAK,QAAA;AAAA,MACL,OAAA;AAAA,MACA,YAAA,EAAY,SAAA;AAAA,MACZ,cAAA,EAAc,SAAS,MAAA,GAAS,MAAA;AAAA,MAChC,SAAA,EAAW,EAAA;AAAA,QACV,yGAAA;AAAA,QACA,SAAS,uCAAA,GAA0C;AAAA,OACpD;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,OAAA,mBACAC,eAACG,kBAAA,EAAA,EAAU,UAAA,EAAwB,OAAc,SAAA,EAAU,SAAA,EAAU,oBAErEH,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACA,SAAA,EAAU,kBAAA;AAAA,YACV,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAK,KAAA,CAAM,KAAA,GAAQ,GAAG,CAAA,EAAE;AAAA,YAChD,aAAA,EAAW;AAAA;AAAA,SACZ;AAAA,wBAEDA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4DACd,QAAA,EAAA,UAAA,EACF;AAAA;AAAA;AAAA,GACD;AAEF;ACrEA,IAAI,aAAA,GAA+B,IAAA;AAO5B,SAAS,mBAAmB,SAAA,EAAmB;AACrD,EAAA,IAAI,CAAC,SAAA,IAAa,aAAA,KAAkB,SAAA,EAAW;AAC/C,EAAAI,cAAA,CAAM,oBAAoB,SAAA,GAAY,SAAA;AACtC,EAAA,aAAA,GAAgB,SAAA;AACjB;ACmBA,IAAM,UAAA,GAAa,CAAC,GAAA,EAAK,IAAA,EAAM,GAAG,IAAA,EAAM,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAC,CAAA;AACtD,IAAM,WAAA,GAAc,GAAA;AA6Cb,SAAS,SAAA,CAAU;AAAA,EACzB,OAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA,GAAc,CAAA;AAAA,EACd,SAAA;AAAA,EACA,MAAA;AAAA,EACA;AACD,CAAA,EAAmB;AAClB,EAAA,kBAAA,CAAmB,SAAS,CAAA;AAE5B,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIX,eAAS,CAAC,CAAA;AAC1C,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAS,WAAW,CAAA;AACxD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,CAAC,CAAA;AAC5C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAA2B,OAAO,CAAA;AAChE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAS,CAAC,CAAA;AAC1C,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,eAAS,CAAC,CAAA;AACtD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,eAAS,CAAC,CAAA;AACxD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,IAAIA,cAAAA,CAAS,MAAA,CAAO,WAAW,CAAC,CAAA;AAE9D,EAAA,MAAM,WAAA,GAAcC,aAAuB,IAAI,CAAA;AAC/C,EAAA,MAAM,QAAA,GAAWA,aAAuB,IAAI,CAAA;AAC5C,EAAA,MAAM,aAAA,GAAgBA,aAAO,UAAU,CAAA;AACvC,EAAA,aAAA,CAAc,OAAA,GAAU,UAAA;AACxB,EAAA,MAAM,WAAA,GAAcA,aAAO,QAAQ,CAAA;AACnC,EAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AAEtB,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,SAAS,CAAA,IAAK,CAAA;AAE3C,EAAA,MAAM,QAAA,GAAWC,iBAAAA,CAAY,CAAC,IAAA,KAAiB;AAC9C,IAAA,MAAM,QAAQ,WAAA,CAAY,OAAA;AAC1B,IAAA,IAAI,SAAS,CAAA,EAAG;AAChB,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG,IAAI,GAAG,KAAK,CAAA;AACjD,IAAA,aAAA,CAAc,OAAO,CAAA;AACrB,IAAA,YAAA,CAAa,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,EAC7B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgBA,iBAAAA;AAAA,IACrB,CAAC,SAAA,KAA+B;AAC/B,MAAA,IAAI,cAAc,MAAA,EAAQ;AACzB,QAAA,QAAA,CAAS,aAAA,CAAc,UAAU,CAAC,CAAA;AAAA,MACnC,CAAA,MAAO;AACN,QAAA,QAAA,CAAS,aAAA,CAAc,UAAU,CAAC,CAAA;AAAA,MACnC;AAAA,IACD,CAAA;AAAA,IACA,CAAC,QAAQ;AAAA,GACV;AAEA,EAAA,MAAM;AAAA,IACL,QAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,MACG,kBAAA,CAAmB;AAAA,IACtB,cAAc,QAAA,GAAW,CAAA;AAAA,IACzB,aAAA;AAAA,IACA,SAAA,EAAW,IAAA;AAAA,IACX,SAAA,EAAW;AAAA,GACX,CAAA;AAED,EAAAC,gBAAU,MAAM;AACf,IAAA,aAAA,CAAc,WAAW,CAAA;AACzB,IAAA,YAAA,CAAa,MAAA,CAAO,WAAW,CAAC,CAAA;AAChC,IAAA,YAAA,CAAa,CAAC,CAAA;AACd,IAAA,UAAA,CAAW,OAAO,CAAA;AAClB,IAAA,WAAA,CAAY,CAAC,CAAA;AACb,IAAA,WAAA,CAAY,CAAC,CAAA;AACb,IAAA,YAAA,CAAa,KAAK,CAAA;AAClB,IAAA,aAAA,CAAc,KAAK,CAAA;AACnB,IAAA,KAAA,EAAM;AAAA,EACP,CAAA,EAAG,CAAC,OAAA,EAAS,WAAA,EAAa,KAAK,CAAC,CAAA;AAEhC,EAAAA,gBAAU,MAAM;AACf,IAAA,KAAA,EAAM;AAAA,EACP,CAAA,EAAG,CAAC,UAAA,EAAY,KAAK,CAAC,CAAA;AAEtB,EAAAA,gBAAU,MAAM;AACf,IAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AAC1B,IAAA,MAAM,KAAK,WAAA,CAAY,OAAA;AACvB,IAAA,MAAM,QAAA,GAAW,IAAI,cAAA,CAAe,CAAC,OAAA,KAAY;AAChD,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,CAAC,CAAA,EAAG,WAAA;AACzB,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,iBAAA,CAAkB,KAAK,KAAK,CAAA;AAC5B,MAAA,kBAAA,CAAmB,KAAK,MAAM,CAAA;AAAA,IAC/B,CAAC,CAAA;AACD,IAAA,QAAA,CAAS,QAAQ,EAAE,CAAA;AACnB,IAAA,iBAAA,CAAkB,GAAG,WAAW,CAAA;AAChC,IAAA,kBAAA,CAAmB,GAAG,YAAY,CAAA;AAClC,IAAA,OAAO,MAAM,SAAS,UAAA,EAAW;AAAA,EAClC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAAA,gBAAU,MAAM;AACf,IAAA,SAAS,kBAAA,GAAqB;AAC7B,MAAA,eAAA,CAAgB,QAAA,CAAS,iBAAA,KAAsB,QAAA,CAAS,OAAO,CAAA;AAAA,IAChE;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,oBAAoB,kBAAkB,CAAA;AAChE,IAAA,OAAO,MACN,QAAA,CAAS,mBAAA,CAAoB,kBAAA,EAAoB,kBAAkB,CAAA;AAAA,EACrE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAAA,gBAAU,MAAM;AACf,IAAA,SAAS,UAAU,CAAA,EAAkB;AACpC,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,MAAA,IACC,MAAA,KACC,OAAO,OAAA,KAAY,OAAA,IACnB,OAAO,OAAA,KAAY,UAAA,IACnB,OAAO,iBAAA,CAAA,EACP;AACD,QAAA;AAAA,MACD;AACA,MAAA,QAAQ,EAAE,GAAA;AAAK,QACd,KAAK,WAAA;AAAA,QACL,KAAK,QAAA;AACJ,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,QAAA,CAAS,aAAA,CAAc,UAAU,CAAC,CAAA;AAClC,UAAA;AAAA,QACD,KAAK,YAAA;AAAA,QACL,KAAK,UAAA;AACJ,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,QAAA,CAAS,aAAA,CAAc,UAAU,CAAC,CAAA;AAClC,UAAA;AAAA,QACD,KAAK,MAAA;AACJ,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,QAAA,CAAS,CAAC,CAAA;AACV,UAAA;AAAA,QACD,KAAK,KAAA;AACJ,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,QAAA,CAAS,YAAY,OAAO,CAAA;AAC5B,UAAA;AAAA,QACD,KAAK,GAAA;AAAA,QACL,KAAK,GAAA;AACJ,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,YAAA,CAAa,CAAC,MAAM,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG,UAAA,CAAW,MAAA,GAAS,CAAC,CAAC,CAAA;AAC1D,UAAA;AAAA,QACD,KAAK,GAAA;AACJ,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,YAAA,CAAa,CAAC,CAAA,KAAM,IAAA,CAAK,IAAI,CAAA,GAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AACtC,UAAA;AAEA;AACF,IACD;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC5C,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,SAAS,CAAA;AAAA,EAC7D,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,QAAA,GAAWD,kBAAY,MAAM;AAClC,IAAA,UAAA,CAAW,OAAO,CAAA;AAClB,IAAA,YAAA,CAAa,CAAC,CAAA;AACd,IAAA,KAAA,EAAM;AAAA,EACP,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,OAAA,GAAUA,kBAAY,MAAM;AACjC,IAAA,UAAA,CAAW,MAAM,CAAA;AACjB,IAAA,YAAA,CAAa,CAAC,CAAA;AACd,IAAA,KAAA,EAAM;AAAA,EACP,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,MAAA,GAASA,kBAAY,MAAM;AAChC,IAAA,YAAA,CAAa,CAAC,MAAM,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG,UAAA,CAAW,MAAA,GAAS,CAAC,CAAC,CAAA;AAAA,EAC3D,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,OAAA,GAAUA,kBAAY,MAAM;AACjC,IAAA,YAAA,CAAa,CAAC,CAAA,KAAM,IAAA,CAAK,IAAI,CAAA,GAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,EACvC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,gBAAA,GAAmBA,kBAAY,YAAY;AAChD,IAAA,IAAI,CAAC,SAAS,OAAA,EAAS;AACvB,IAAA,IAAI,QAAA,CAAS,iBAAA,KAAsB,QAAA,CAAS,OAAA,EAAS;AACpD,MAAA,MAAM,SAAS,cAAA,EAAe;AAAA,IAC/B,CAAA,MAAO;AACN,MAAA,MAAM,QAAA,CAAS,QAAQ,iBAAA,EAAkB;AAAA,IAC1C;AAAA,EACD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,SAAS,eAAe,CAAA,EAAc;AACrC,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,SAAA,EAAW,EAAE,CAAA;AAC5C,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,WAAY,MAAM,CAAA;AAAA,SACvC,YAAA,CAAa,MAAA,CAAO,UAAU,CAAC,CAAA;AAAA,EACrC;AAEA,EAAA,MAAM,SAAA,GACL,YAAY,OAAA,GACT,IAAA,CAAK,IAAI,cAAA,GAAiB,EAAA,EAAI,GAAG,CAAA,GAAI,SAAA,GACrC,MAAA;AACJ,EAAA,MAAM,UAAA,GACL,YAAY,MAAA,GACT,IAAA,CAAK,IAAI,eAAA,GAAkB,EAAA,EAAI,GAAG,CAAA,GAAI,SAAA,GACtC,MAAA;AAEJ,EAAA,MAAM,cAAc,WAAA,IAAe,OAAA;AACnC,EAAA,MAAM,YAAA,GAAe,GAAG,WAAW,CAAA,EAAG,YAAY,QAAA,CAAS,GAAG,CAAA,GAAI,GAAA,GAAM,GAAG,CAAA,UAAA,CAAA;AAE3E,EAAA,MAAM,EAAE,KAAA,EAAO,YAAA,EAAc,EAAA,EAAI,IAAG,GAAI,SAAA;AACxC,EAAA,MAAM,UAAA,GACL,YAAY,CAAC,UAAA,IAAc,CAAC,oBAAA,EAAqB,GAC9C,CAAA,UAAA,EAAa,sBAAsB,CAAA,WAAA,CAAA,GACnC,MAAA;AAEJ,EAAA,MAAM,MAAA,GACL,MAAA,CAAO,MAAA,GAAS,UAAA,EAAY,QAAQ,CAAA,KACnC,QAAA,GAAW,CAAA,GAAI,CAAA,EAAG,UAAU,CAAA,GAAA,EAAM,QAAQ,CAAA,CAAA,GAAK,QAAA,CAAA;AAEjD,EAAA,SAAS,gBAAgB,QAAA,EAA+B;AACvD,IAAA,uBACCK,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,QAAA,EAAS,EAAG,CAAC,GAAG,CAAA,KAAM;AAC3C,MAAA,MAAM,IAAI,CAAA,GAAI,CAAA;AACd,MAAA,uBACCA,cAAAA;AAAA,QAAC,aAAA;AAAA,QAAA;AAAA,UAEA,UAAA,EAAY,CAAA;AAAA,UACZ,QAAQ,CAAA,KAAM,UAAA;AAAA,UACd,KAAA,EAAO,WAAA;AAAA,UACP,OAAA,EAAS,MAAM,QAAA,CAAS,CAAC,CAAA;AAAA,UACzB,WAAW,MAAA,CAAO,aAAA,GAAgB,CAAC,CAAA,IAAK,aAAU,CAAC,CAAA;AAAA,SAAA;AAAA,QAL9C;AAAA,OAMN;AAAA,IAEF,CAAC,CAAA,EACF,CAAA;AAAA,EAEF;AAEA,EAAA,uBACCD,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,GAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAW,EAAA;AAAA,QACV,4DAAA;AAAA,QACA;AAAA,OACD;AAAA,MAEE,QAAA,EAAA;AAAA,QAAA,CAAA,WAAA,IAAe,CAAC,SAAA,qBACjBA,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qEAAA,EACb,QAAA,EAAA;AAAA,UAAA,WAAA,mBACAC,cAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACA,WAAA,EAAU,kBAAA;AAAA,cACV,SAAA,EAAU,iCAAA;AAAA,cAET,QAAA,EAAA;AAAA;AAAA,WACF,GACG,IAAA;AAAA,UACH,CAAC,SAAA,oBACDD,eAAAA,CAAAM,mBAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAL,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACA,IAAA,EAAK,QAAA;AAAA,gBACL,SAAA,EAAU,0HAAA;AAAA,gBACV,SAAS,MAAM,aAAA,CAAc,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,gBACtC,cACC,UAAA,GACI,MAAA,CAAO,cAAA,IAAkB,oBAAA,GACzB,OAAO,cAAA,IAAkB,oBAAA;AAAA,gBAE9B,cAAA,EAAc,UAAA;AAAA,gBAEb,QAAA,EAAA,UAAA,mBACAA,cAAAA,CAACM,0BAAA,EAAA,EAAe,SAAA,EAAU,SAAA,EAAU,CAAA,mBAEpCN,cAAAA,CAACO,qBAAA,EAAA,EAAU,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,aAEjC;AAAA,4BAEAP,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACA,IAAA,EAAK,QAAA;AAAA,gBACL,SAAA,EAAU,8HAAA;AAAA,gBACV,OAAA,EAAS,MAAM,QAAA,CAAS,UAAA,GAAa,CAAC,CAAA;AAAA,gBACtC,UAAU,UAAA,IAAc,CAAA;AAAA,gBACxB,YAAA,EAAY,OAAO,YAAA,IAAgB,oBAAA;AAAA,gBAEnC,QAAA,kBAAAA,cAAAA,CAACQ,uBAAA,EAAA,EAAY,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,aAClC;AAAA,4BAEAT,eAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACA,QAAA,EAAU,cAAA;AAAA,gBACV,SAAA,EAAU,gEAAA;AAAA,gBAEV,QAAA,EAAA;AAAA,kCAAAC,cAAAA,CAAC,WAAM,SAAA,EAAU,SAAA,EAAU,SAAQ,eAAA,EACjC,QAAA,EAAA,MAAA,CAAO,gBAAgB,gBAAA,EACzB,CAAA;AAAA,kCACAA,cAAAA;AAAA,oBAAC,OAAA;AAAA,oBAAA;AAAA,sBACA,EAAA,EAAG,eAAA;AAAA,sBACH,KAAA,EAAO,SAAA;AAAA,sBACP,UAAU,CAAC,CAAA,KAAM,YAAA,CAAa,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,sBAC5C,SAAA,EAAU,2EAAA;AAAA,sBACV,SAAA,EAAU;AAAA;AAAA,mBACX;AAAA,kCACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAA8B,QAAA,EAAA,MAAA,EAAO;AAAA;AAAA;AAAA,aACtD;AAAA,4BAEAA,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACA,IAAA,EAAK,QAAA;AAAA,gBACL,SAAA,EAAU,8HAAA;AAAA,gBACV,OAAA,EAAS,MAAM,QAAA,CAAS,UAAA,GAAa,CAAC,CAAA;AAAA,gBACtC,UAAU,UAAA,IAAc,QAAA;AAAA,gBACxB,YAAA,EAAY,OAAO,QAAA,IAAY,qBAAA;AAAA,gBAE/B,QAAA,kBAAAA,cAAAA,CAACS,wBAAA,EAAA,EAAa,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,aACnC;AAAA,4BAEAT,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACA,IAAA,EAAK,QAAA;AAAA,gBACL,SAAA,EAAU,8HAAA;AAAA,gBACV,OAAA,EAAS,OAAA;AAAA,gBACT,UAAU,SAAA,IAAa,CAAA;AAAA,gBACvB,YAAA,EAAY,OAAO,OAAA,IAAW,QAAA;AAAA,gBAE9B,QAAA,kBAAAA,cAAAA,CAACU,mBAAA,EAAA,EAAQ,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,aAC9B;AAAA,4BACAV,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACA,IAAA,EAAK,QAAA;AAAA,gBACL,SAAA,EAAU,mHAAA;AAAA,gBACV,OAAA,EAAS,OAAA,KAAY,OAAA,GAAU,OAAA,GAAU,QAAA;AAAA,gBAExC,sBAAY,OAAA,GACT,MAAA,CAAO,OAAA,IAAW,mBAAA,GAClB,OAAO,QAAA,IAAY;AAAA;AAAA,aACxB;AAAA,4BACAA,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACA,IAAA,EAAK,QAAA;AAAA,gBACL,SAAA,EAAU,8HAAA;AAAA,gBACV,OAAA,EAAS,MAAA;AAAA,gBACT,QAAA,EAAU,SAAA,IAAa,UAAA,CAAW,MAAA,GAAS,CAAA;AAAA,gBAC3C,YAAA,EAAY,OAAO,MAAA,IAAU,SAAA;AAAA,gBAE7B,QAAA,kBAAAA,cAAAA,CAACW,kBAAA,EAAA,EAAO,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,aAC7B;AAAA,4BAEAX,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACA,IAAA,EAAK,QAAA;AAAA,gBACL,SAAA,EAAU,0GAAA;AAAA,gBACV,SAAS,MAAM,WAAA,CAAY,CAAC,CAAA,KAAA,CAAO,CAAA,GAAI,MAAM,GAAG,CAAA;AAAA,gBAChD,YAAA,EAAY,OAAO,MAAA,IAAU,OAAA;AAAA,gBAE7B,QAAA,kBAAAA,cAAAA,CAACY,oBAAA,EAAA,EAAS,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,aAC/B;AAAA,4BAEAZ,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACA,IAAA,EAAK,QAAA;AAAA,gBACL,SAAA,EAAU,0GAAA;AAAA,gBACV,OAAA,EAAS,MAAM,KAAK,gBAAA,EAAiB;AAAA,gBACrC,cACC,YAAA,GACI,MAAA,CAAO,cAAA,IAAkB,4BAAA,GACzB,OAAO,eAAA,IAAmB,mBAAA;AAAA,gBAG9B,QAAA,EAAA,YAAA,mBACAA,cAAAA,CAACa,qBAAA,EAAA,EAAU,SAAA,EAAU,SAAA,EAAU,CAAA,mBAE/Bb,cAAAA,CAACc,qBAAA,EAAA,EAAU,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,aAEjC;AAAA,4BAEAf,eAAAA;AAAA,cAAC,GAAA;AAAA,cAAA;AAAA,gBACA,IAAA,EAAM,YAAA;AAAA,gBACN,QAAA,EAAU,QAAA;AAAA,gBACV,YAAA,EACC,MAAA,CAAO,YAAA,IAAgB,MAAA,CAAO,QAAA,IAAY,WAAA;AAAA,gBAE3C,SAAA,EAAU,0GAAA;AAAA,gBAEV,QAAA,EAAA;AAAA,kCAAAC,cAAAA,CAACe,oBAAA,EAAA,EAAS,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,kCAC9Bf,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,kBAAA,EACd,QAAA,EAAA,MAAA,CAAO,YAAY,WAAA,EACrB;AAAA;AAAA;AAAA;AACD,WAAA,EACD;AAAA,SAAA,EAEF,CAAA;AAAA,wBAGDD,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACb,QAAA,EAAA;AAAA,UAAA,QAAA,GAAW,qBACXC,cAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACA,SAAA,EAAW,EAAA;AAAA,gBACV,0EAAA;AAAA,gBACA,CAAC,UAAA,IAAc;AAAA,eAChB;AAAA,cAEC,0BAAgB,QAAQ;AAAA;AAAA,WAC1B;AAAA,UAGA,UAAA,IAAc,QAAA,GAAW,CAAA,oBACzBD,gBAAAM,mBAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAL,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACA,IAAA,EAAK,QAAA;AAAA,gBACL,cACC,MAAA,CAAO,cAAA,GACJ,CAAA,EAAG,MAAA,CAAO,cAAc,CAAA,QAAA,CAAA,GACxB,2BAAA;AAAA,gBAEJ,SAAA,EAAU,6CAAA;AAAA,gBACV,OAAA,EAAS,MAAM,aAAA,CAAc,KAAK;AAAA;AAAA,aACnC;AAAA,4BACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oGAAA,EACb,QAAA,EAAA,eAAA,CAAgB,CAAC,CAAA,KAAM;AACvB,cAAA,QAAA,CAAS,CAAC,CAAA;AACV,cAAA,aAAA,CAAc,KAAK,CAAA;AAAA,YACpB,CAAC,CAAA,EACF;AAAA,WAAA,EACD,CAAA;AAAA,0BAGDA,cAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACA,GAAA,EAAK,WAAA;AAAA,cACL,SAAA,EAAW,EAAA;AAAA,gBACV,qDAAA;AAAA,gBACA,YAAA,GAAe,kBAAA,KACb,UAAA,GAAa,iBAAA,GAAoB,aAAA;AAAA,eACpC;AAAA,cAEC,sCACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gEACd,QAAA,kBAAAA,cAAAA;AAAA,gBAAC,UAAA;AAAA,gBAAA;AAAA,kBACA,SAAA,EAAU,sBAAA;AAAA,kBACV,KAAA,EAAO,OAAO,SAAA,IAAa,0BAAA;AAAA,kBAC3B,WAAA,EACC,OAAO,oBAAA,IACP,wDAAA;AAAA,kBAED,wBACCA,cAAAA;AAAA,oBAAC,GAAA;AAAA,oBAAA;AAAA,sBACA,IAAA,EAAM,YAAA;AAAA,sBACN,QAAA,EAAU,QAAA;AAAA,sBACV,SAAA,EAAU,gCAAA;AAAA,sBAET,iBAAO,QAAA,IAAY;AAAA;AAAA;AACrB;AAAA,eAEF,EACD,oBAEAA,cAAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACA,GAAA,EAAK,QAAA;AAAA,kBACL,SAAA,EAAU,2DAAA;AAAA,kBACV,KAAA,EAAO;AAAA,oBACN,WAAW,CAAA,UAAA,EAAa,EAAE,CAAA,IAAA,EAAO,EAAE,aAAa,YAAY,CAAA,CAAA,CAAA;AAAA,oBAC5D;AAAA,mBACD;AAAA,kBACA,eAAe,QAAA,CAAS,aAAA;AAAA,kBACxB,eAAe,QAAA,CAAS,aAAA;AAAA,kBACxB,aAAa,QAAA,CAAS,WAAA;AAAA,kBACtB,iBAAiB,QAAA,CAAS,eAAA;AAAA,kBAC1B,eAAA,EAAiB,aAAA;AAAA,kBAEjB,QAAA,kBAAAA,cAAAA;AAAA,oBAACgB,iBAAA;AAAA,oBAAA;AAAA,sBACA,IAAA,EAAM,OAAA;AAAA,sBACN,aAAA,EAAe,CAAC,EAAE,QAAA,EAAU,OAAM,KAAM;AACvC,wBAAA,WAAA,CAAY,KAAK,CAAA;AACjB,wBAAA,YAAA,CAAa,KAAK,CAAA;AAClB,wBAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG,WAAW,GAAG,KAAK,CAAA;AACtD,wBAAA,aAAA,CAAc,KAAK,CAAA;AACnB,wBAAA,YAAA,CAAa,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,sBAC3B,CAAA;AAAA,sBACA,WAAA,EAAa,MAAM,YAAA,CAAa,IAAI,CAAA;AAAA,sBACpC,yBACChB,cAAAA,CAAC,gBAAa,KAAA,EAAO,MAAA,CAAO,WAAW,oBAAA,EAAiB,CAAA;AAAA,sBAEzD,uBACCA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gEACd,QAAA,kBAAAA,cAAAA;AAAA,wBAAC,UAAA;AAAA,wBAAA;AAAA,0BACA,SAAA,EAAU,sBAAA;AAAA,0BACV,KAAA,EAAO,OAAO,SAAA,IAAa;AAAA;AAAA,uBAC5B,EACD,CAAA;AAAA,sBAGA,QAAA,EAAA,QAAA,GAAW,qBACXA,cAAAA;AAAA,wBAACiB,aAAA;AAAA,wBAAA;AAAA,0BACA,UAAA;AAAA,0BACA,KAAA,EAAO,SAAA;AAAA,0BACP,MAAA,EAAQ,UAAA;AAAA,0BACR,MAAA,EAAQ,QAAA;AAAA,0BACR,eAAA,EAAe,IAAA;AAAA,0BACf,qBAAA,EAAqB;AAAA;AAAA;AACtB;AAAA;AAEF;AAAA;AACD;AAAA;AAEF,SAAA,EACD;AAAA;AAAA;AAAA,GACD;AAEF;ACtjBA,SAAS,MAAA,CAAO;AAAA,EACf,GAAG;AACJ,CAAA,EAAsD;AACrD,EAAA,uBAAOjB,cAAAA,CAAiBkB,0BAAA,CAAA,IAAA,EAAhB,EAAqB,WAAA,EAAU,QAAA,EAAU,GAAG,KAAA,EAAO,CAAA;AAC5D;AAQA,SAAS,YAAA,CAAa;AAAA,EACrB,GAAG;AACJ,CAAA,EAAwD;AACvD,EAAA,uBAAOlB,cAAAA,CAAiBkB,0BAAA,CAAA,MAAA,EAAhB,EAAuB,WAAA,EAAU,eAAA,EAAiB,GAAG,KAAA,EAAO,CAAA;AACrE;AAQA,SAAS,aAAA,CAAc;AAAA,EACtB,SAAA;AAAA,EACA,GAAG;AACJ,CAAA,EAAyD;AACxD,EAAA,uBACClB,cAAAA;AAAA,IAAiBkB,0BAAA,CAAA,OAAA;AAAA,IAAhB;AAAA,MACA,WAAA,EAAU,gBAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACV,wJAAA;AAAA,QACA;AAAA,OACD;AAAA,MACC,GAAG;AAAA;AAAA,GACL;AAEF;AAEA,SAAS,aAAA,CAAc;AAAA,EACtB,SAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA,GAAkB,IAAA;AAAA,EAClB,GAAG;AACJ,CAAA,EAEG;AACF,EAAA,uBACCnB,eAAAA,CAAC,YAAA,EAAA,EAAa,WAAA,EAAU,eAAA,EACvB,QAAA,EAAA;AAAA,oBAAAC,eAAC,aAAA,EAAA,EAAc,CAAA;AAAA,oBACfD,eAAAA;AAAA,MAAiBmB,0BAAA,CAAA,OAAA;AAAA,MAAhB;AAAA,QACA,WAAA,EAAU,gBAAA;AAAA,QACV,SAAA,EAAW,EAAA;AAAA,UACV,0XAAA;AAAA,UACA;AAAA,SACD;AAAA,QACC,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA;AAAA,UAAA,QAAA;AAAA,UACA,mCACAnB,eAAAA;AAAA,YAAiBmB,0BAAA,CAAA,KAAA;AAAA,YAAhB;AAAA,cACA,WAAA,EAAU,cAAA;AAAA,cACV,SAAA,EAAU,mWAAA;AAAA,cAEV,QAAA,EAAA;AAAA,gCAAAlB,eAACmB,iBAAA,EAAA,EAAM,CAAA;AAAA,gCACPnB,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAU,QAAA,EAAA,OAAA,EAAK;AAAA;AAAA;AAAA;AAChC;AAAA;AAAA;AAEF,GAAA,EACD,CAAA;AAEF;AAyBA,SAAS,WAAA,CAAY;AAAA,EACpB,SAAA;AAAA,EACA,GAAG;AACJ,CAAA,EAAuD;AACtD,EAAA,uBACCA,cAAAA;AAAA,IAAiBkB,0BAAA,CAAA,KAAA;AAAA,IAAhB;AAAA,MACA,WAAA,EAAU,cAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,oCAAA,EAAsC,SAAS,CAAA;AAAA,MAC5D,GAAG;AAAA;AAAA,GACL;AAEF;AAEA,SAAS,iBAAA,CAAkB;AAAA,EAC1B,SAAA;AAAA,EACA,GAAG;AACJ,CAAA,EAA6D;AAC5D,EAAA,uBACClB,cAAAA;AAAA,IAAiBkB,0BAAA,CAAA,WAAA;AAAA,IAAhB;AAAA,MACA,WAAA,EAAU,oBAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,+BAAA,EAAiC,SAAS,CAAA;AAAA,MACvD,GAAG;AAAA;AAAA,GACL;AAEF;AC9FO,SAAS,iBAAA,CAAkB;AAAA,EACjC,IAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA,GAAkB;AACnB,CAAA,EAA2B;AAC1B,EAAA,MAAM,UAAA,GAAa,QAAQ,KAAA,IAAS,QAAA;AACpC,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,OAAA;AAC/B,EAAA,MAAM,WAAA,GAAc,QAAQ,WAAA,IAAe,KAAA;AAE3C,EAAA,uBACClB,cAAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAY,cACnB,QAAA,kBAAAD,eAAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACA,eAAA,EAAiB,KAAA;AAAA,MACjB,SAAA,EAAW,EAAA;AAAA,QACV,qKAAA;AAAA,QACA,gBAAA;AAAA,QACA;AAAA,OACD;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAC,cAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,SAAA,EAAW,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,wBACxCA,cAAAA,CAAC,iBAAA,EAAA,EAAkB,SAAA,EAAU,WAAW,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,QACnD,mCACAA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACA,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,YAAA,CAAa,KAAK,CAAA;AAAA,YACjC,YAAA,EAAY,UAAA;AAAA,YACZ,SAAA,EAAU,yGAAA;AAAA,YAEV,QAAA,kBAAAA,cAAAA,CAACoB,aAAA,EAAA,EAAE,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,SACxB;AAAA,QAEA;AAAA;AAAA;AAAA,GACF,EACD,CAAA;AAEF;AC9CO,SAAS,eAAA,CAAgB;AAAA,EAC/B,IAAA;AAAA,EACA,YAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA;AACD,CAAA,EAAyB;AACxB,EAAA,MAAM,YAAA,GAAyC,MAAA;AAE/C,EAAA,uBACCpB,cAAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACA,IAAA;AAAA,MACA,YAAA;AAAA,MACA,MAAA,EAAQ;AAAA,QACP,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,KAAA;AAAA,QACA,WAAA,EAAa,OAAO,iBAAA,IAAqB;AAAA,OAC1C;AAAA,MAEA,QAAA,kBAAAD,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCAAA,EACd,QAAA,EAAA;AAAA,wBAAAC,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EACd,QAAA,kBAAAA,eAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8BAAA,EAAgC,QAAA,EAAA,KAAA,EAAM,CAAA,EACpD,CAAA;AAAA,wBACAA,cAAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACA,OAAA;AAAA,YACA,UAAU,QAAA,IAAY,KAAA;AAAA,YACtB,WAAA;AAAA,YACA,SAAA;AAAA,YACA,WAAA;AAAA,YACA,MAAA,EAAQ,YAAA;AAAA,YACR,SAAA,EAAU;AAAA;AAAA;AACX,OAAA,EACD;AAAA;AAAA,GACD;AAEF","file":"pdf.cjs","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport {\n\tuseCallback,\n\tuseEffect,\n\tuseRef,\n\tuseState,\n\ttype PointerEvent as ReactPointerEvent,\n\ttype RefObject,\n} from \"react\";\n\nexport const ZOOM_PAN_MIN_SCALE = 1;\nexport const ZOOM_PAN_MAX_SCALE = 4;\nexport const ZOOM_PAN_DOUBLE_TAP_MS = 300;\nexport const ZOOM_PAN_SWIPE_LOCK_PX = 8;\nexport const ZOOM_PAN_SWIPE_COMMIT_PX = 56;\nexport const ZOOM_PAN_SWIPE_SNAP_MS = 180;\n\nexport type ZoomPanTransform = {\n\tscale: number;\n\ttx: number;\n\tty: number;\n};\n\nexport type SwipeDirection = \"prev\" | \"next\";\n\nexport type UseZoomPanGesturesOptions = {\n\tminScale?: number;\n\tmaxScale?: number;\n\t/** When false, horizontal swipe never commits (still pans when zoomed). */\n\tswipeEnabled?: boolean;\n\tonSwipeCommit?: (direction: SwipeDirection) => void;\n\t/** When true, wheel zoom is attached to the stage. Defaults to true. */\n\twheelZoom?: boolean;\n\t/**\n\t * Double-tap behavior at min scale: \"reset\" (default — ImageLightbox) or\n\t * \"toggle\" (zoom in toward tap, then reset).\n\t */\n\tdoubleTap?: \"reset\" | \"toggle\";\n};\n\nexport type UseZoomPanGesturesResult = {\n\tstageRef: RefObject<HTMLDivElement | null>;\n\ttransform: ZoomPanTransform;\n\tisDragging: boolean;\n\tsnapBack: boolean;\n\thandlers: {\n\t\tonPointerDown: (e: ReactPointerEvent<HTMLDivElement>) => void;\n\t\tonPointerMove: (e: ReactPointerEvent<HTMLDivElement>) => void;\n\t\tonPointerUp: (e: ReactPointerEvent<HTMLDivElement>) => void;\n\t\tonPointerCancel: (e: ReactPointerEvent<HTMLDivElement>) => void;\n\t};\n\treset: () => void;\n\tsetScale: (scale: number) => void;\n\tclearSnapBack: () => void;\n};\n\ntype SwipeAxis = \"x\" | \"y\";\n\nconst IDENTITY: ZoomPanTransform = { scale: 1, tx: 0, ty: 0 };\n\nfunction clamp(value: number, min: number, max: number) {\n\treturn Math.min(max, Math.max(min, value));\n}\n\nexport function zoomToward(\n\tprev: ZoomPanTransform,\n\tnextScale: number,\n\toriginX: number,\n\toriginY: number,\n\tminScale = ZOOM_PAN_MIN_SCALE,\n\tmaxScale = ZOOM_PAN_MAX_SCALE,\n): ZoomPanTransform {\n\tconst scale = clamp(nextScale, minScale, maxScale);\n\tif (scale === minScale) return { ...IDENTITY, scale: minScale };\n\tconst ratio = scale / prev.scale;\n\treturn {\n\t\tscale,\n\t\ttx: originX - (originX - prev.tx) * ratio,\n\t\tty: originY - (originY - prev.ty) * ratio,\n\t};\n}\n\nfunction pointerDistance(\n\ta: { x: number; y: number },\n\tb: { x: number; y: number },\n) {\n\treturn Math.hypot(b.x - a.x, b.y - a.y);\n}\n\nexport function prefersReducedMotion() {\n\tif (typeof window === \"undefined\" || !window.matchMedia) return false;\n\treturn window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n}\n\n/**\n * Pointer-driven pinch zoom, double-tap zoom toggle/reset, pan while zoomed,\n * and horizontal swipe-to-commit. Shared by ImageLightbox, MediaCarousel and\n * PdfViewer.\n */\nexport function useZoomPanGestures(\n\toptions: UseZoomPanGesturesOptions = {},\n): UseZoomPanGesturesResult {\n\tconst {\n\t\tminScale = ZOOM_PAN_MIN_SCALE,\n\t\tmaxScale = ZOOM_PAN_MAX_SCALE,\n\t\tswipeEnabled = true,\n\t\tonSwipeCommit,\n\t\twheelZoom = true,\n\t\tdoubleTap = \"reset\",\n\t} = options;\n\n\tconst [transform, setTransform] = useState<ZoomPanTransform>({\n\t\t...IDENTITY,\n\t\tscale: minScale,\n\t});\n\tconst transformRef = useRef(transform);\n\ttransformRef.current = transform;\n\n\tconst [isSwipeDragging, setIsSwipeDragging] = useState(false);\n\tconst [snapBack, setSnapBack] = useState(false);\n\n\tconst stageRef = useRef<HTMLDivElement>(null);\n\tconst pointersRef = useRef(new Map<number, { x: number; y: number }>());\n\tconst pinchStartRef = useRef<{\n\t\tdistance: number;\n\t\toriginX: number;\n\t\toriginY: number;\n\t\ttransform: ZoomPanTransform;\n\t} | null>(null);\n\tconst panRef = useRef<{\n\t\tpointerId: number;\n\t\tstartX: number;\n\t\tstartY: number;\n\t\toriginTx: number;\n\t\toriginTy: number;\n\t\tmoved: boolean;\n\t} | null>(null);\n\tconst swipeRef = useRef<{\n\t\tpointerId: number;\n\t\tstartX: number;\n\t\tstartY: number;\n\t\tmoved: boolean;\n\t\taxis: SwipeAxis | null;\n\t} | null>(null);\n\tconst lastTapRef = useRef<{ time: number; x: number; y: number } | null>(\n\t\tnull,\n\t);\n\tconst onSwipeCommitRef = useRef(onSwipeCommit);\n\tonSwipeCommitRef.current = onSwipeCommit;\n\tconst swipeEnabledRef = useRef(swipeEnabled);\n\tswipeEnabledRef.current = swipeEnabled;\n\tconst minScaleRef = useRef(minScale);\n\tminScaleRef.current = minScale;\n\tconst maxScaleRef = useRef(maxScale);\n\tmaxScaleRef.current = maxScale;\n\tconst doubleTapRef = useRef(doubleTap);\n\tdoubleTapRef.current = doubleTap;\n\n\tconst reset = useCallback(() => {\n\t\tsetTransform({ ...IDENTITY, scale: minScaleRef.current });\n\t\tsetIsSwipeDragging(false);\n\t\tsetSnapBack(false);\n\t}, []);\n\n\tconst setScale = useCallback((next: number) => {\n\t\tsetTransform((prev) =>\n\t\t\tzoomToward(prev, next, 0, 0, minScaleRef.current, maxScaleRef.current),\n\t\t);\n\t}, []);\n\n\tconst clearSnapBack = useCallback(() => {\n\t\tsetSnapBack(false);\n\t}, []);\n\n\tconst stageOrigin = useCallback((clientX: number, clientY: number) => {\n\t\tconst stage = stageRef.current;\n\t\tif (!stage) return { x: 0, y: 0 };\n\t\tconst rect = stage.getBoundingClientRect();\n\t\treturn {\n\t\t\tx: clientX - rect.left - rect.width / 2,\n\t\t\ty: clientY - rect.top - rect.height / 2,\n\t\t};\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (!wheelZoom) return;\n\t\tconst stage = stageRef.current;\n\t\tif (!stage) return;\n\n\t\tconst handleWheel = (e: WheelEvent) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tconst prev = transformRef.current;\n\t\t\tconst factor = e.deltaY > 0 ? 0.9 : 1.1;\n\t\t\tconst { x, y } = stageOrigin(e.clientX, e.clientY);\n\t\t\tsetTransform(\n\t\t\t\tzoomToward(\n\t\t\t\t\tprev,\n\t\t\t\t\tprev.scale * factor,\n\t\t\t\t\tx,\n\t\t\t\t\ty,\n\t\t\t\t\tminScaleRef.current,\n\t\t\t\t\tmaxScaleRef.current,\n\t\t\t\t),\n\t\t\t);\n\t\t};\n\n\t\tstage.addEventListener(\"wheel\", handleWheel, { passive: false });\n\t\treturn () => stage.removeEventListener(\"wheel\", handleWheel);\n\t}, [stageOrigin, wheelZoom]);\n\n\tfunction clearSwipe() {\n\t\tswipeRef.current = null;\n\t\tsetIsSwipeDragging(false);\n\t}\n\n\tfunction beginPinch() {\n\t\tconst pts = [...pointersRef.current.values()];\n\t\tconst [a, b] = pts;\n\t\tif (!a || !b) return;\n\t\tconst midX = (a.x + b.x) / 2;\n\t\tconst midY = (a.y + b.y) / 2;\n\t\tconst { x, y } = stageOrigin(midX, midY);\n\t\tpinchStartRef.current = {\n\t\t\tdistance: Math.max(pointerDistance(a, b), 1),\n\t\t\toriginX: x,\n\t\t\toriginY: y,\n\t\t\ttransform: { ...transformRef.current },\n\t\t};\n\t\tpanRef.current = null;\n\t\tclearSwipe();\n\t\tsetSnapBack(false);\n\t}\n\n\tfunction onPointerDown(e: ReactPointerEvent<HTMLDivElement>) {\n\t\te.stopPropagation();\n\t\tconst stage = stageRef.current;\n\t\tif (!stage) return;\n\n\t\tif (typeof stage.setPointerCapture === \"function\") {\n\t\t\tstage.setPointerCapture(e.pointerId);\n\t\t}\n\t\tpointersRef.current.set(e.pointerId, { x: e.clientX, y: e.clientY });\n\t\tsetSnapBack(false);\n\n\t\tif (pointersRef.current.size === 2) {\n\t\t\tbeginPinch();\n\t\t\treturn;\n\t\t}\n\n\t\tif (transformRef.current.scale > minScaleRef.current) {\n\t\t\tpanRef.current = {\n\t\t\t\tpointerId: e.pointerId,\n\t\t\t\tstartX: e.clientX,\n\t\t\t\tstartY: e.clientY,\n\t\t\t\toriginTx: transformRef.current.tx,\n\t\t\t\toriginTy: transformRef.current.ty,\n\t\t\t\tmoved: false,\n\t\t\t};\n\t\t\treturn;\n\t\t}\n\n\t\tif (swipeEnabledRef.current) {\n\t\t\tswipeRef.current = {\n\t\t\t\tpointerId: e.pointerId,\n\t\t\t\tstartX: e.clientX,\n\t\t\t\tstartY: e.clientY,\n\t\t\t\tmoved: false,\n\t\t\t\taxis: null,\n\t\t\t};\n\t\t\tsetIsSwipeDragging(true);\n\t\t}\n\t}\n\n\tfunction onPointerMove(e: ReactPointerEvent<HTMLDivElement>) {\n\t\tif (!pointersRef.current.has(e.pointerId)) return;\n\t\tpointersRef.current.set(e.pointerId, { x: e.clientX, y: e.clientY });\n\n\t\tconst pinchStart = pinchStartRef.current;\n\t\tif (pointersRef.current.size >= 2 && pinchStart) {\n\t\t\tconst pts = [...pointersRef.current.values()];\n\t\t\tconst [a, b] = pts;\n\t\t\tif (!a || !b) return;\n\t\t\tconst distance = Math.max(pointerDistance(a, b), 1);\n\t\t\tconst nextScale =\n\t\t\t\tpinchStart.transform.scale * (distance / pinchStart.distance);\n\t\t\tsetTransform(\n\t\t\t\tzoomToward(\n\t\t\t\t\tpinchStart.transform,\n\t\t\t\t\tnextScale,\n\t\t\t\t\tpinchStart.originX,\n\t\t\t\t\tpinchStart.originY,\n\t\t\t\t\tminScaleRef.current,\n\t\t\t\t\tmaxScaleRef.current,\n\t\t\t\t),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst pan = panRef.current;\n\t\tif (pan && pan.pointerId === e.pointerId) {\n\t\t\tconst dx = e.clientX - pan.startX;\n\t\t\tconst dy = e.clientY - pan.startY;\n\t\t\tif (Math.abs(dx) > 2 || Math.abs(dy) > 2) pan.moved = true;\n\t\t\tsetTransform((prev) => ({\n\t\t\t\t...prev,\n\t\t\t\ttx: pan.originTx + dx,\n\t\t\t\tty: pan.originTy + dy,\n\t\t\t}));\n\t\t\treturn;\n\t\t}\n\n\t\tconst swipe = swipeRef.current;\n\t\tif (!swipe || swipe.pointerId !== e.pointerId) return;\n\n\t\tconst dx = e.clientX - swipe.startX;\n\t\tconst dy = e.clientY - swipe.startY;\n\t\tif (Math.abs(dx) > 2 || Math.abs(dy) > 2) swipe.moved = true;\n\n\t\tif (swipe.axis === null) {\n\t\t\tconst absX = Math.abs(dx);\n\t\t\tconst absY = Math.abs(dy);\n\t\t\tif (absX < ZOOM_PAN_SWIPE_LOCK_PX && absY < ZOOM_PAN_SWIPE_LOCK_PX) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tswipe.axis = absX >= absY ? \"x\" : \"y\";\n\t\t\tif (swipe.axis === \"y\") {\n\t\t\t\tclearSwipe();\n\t\t\t\tsetTransform({ ...IDENTITY, scale: minScaleRef.current });\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (swipe.axis === \"x\") {\n\t\t\tsetTransform({\n\t\t\t\tscale: minScaleRef.current,\n\t\t\t\ttx: dx,\n\t\t\t\tty: 0,\n\t\t\t});\n\t\t}\n\t}\n\n\tfunction finishSwipe(e: ReactPointerEvent<HTMLDivElement>) {\n\t\tconst swipe = swipeRef.current;\n\t\tif (!swipe || swipe.pointerId !== e.pointerId) return false;\n\n\t\tconst dx = e.clientX - swipe.startX;\n\t\tconst wasMoved = swipe.moved;\n\t\tconst axis = swipe.axis;\n\t\tclearSwipe();\n\n\t\tif (axis === \"x\" && Math.abs(dx) >= ZOOM_PAN_SWIPE_COMMIT_PX) {\n\t\t\tonSwipeCommitRef.current?.(dx < 0 ? \"next\" : \"prev\");\n\t\t\treturn true;\n\t\t}\n\n\t\tif (wasMoved || transformRef.current.tx !== 0) {\n\t\t\tif (!prefersReducedMotion()) setSnapBack(true);\n\t\t\tsetTransform({ ...IDENTITY, scale: minScaleRef.current });\n\t\t}\n\t\treturn wasMoved;\n\t}\n\n\tfunction onPointerUp(e: ReactPointerEvent<HTMLDivElement>) {\n\t\tconst stage = stageRef.current;\n\t\tif (\n\t\t\tstage &&\n\t\t\ttypeof stage.hasPointerCapture === \"function\" &&\n\t\t\tstage.hasPointerCapture(e.pointerId) &&\n\t\t\ttypeof stage.releasePointerCapture === \"function\"\n\t\t) {\n\t\t\tstage.releasePointerCapture(e.pointerId);\n\t\t}\n\t\tpointersRef.current.delete(e.pointerId);\n\n\t\tif (pointersRef.current.size < 2) {\n\t\t\tpinchStartRef.current = null;\n\t\t}\n\t\tif (pointersRef.current.size === 1) {\n\t\t\tconst remaining = [...pointersRef.current.entries()][0];\n\t\t\tif (remaining && transformRef.current.scale > minScaleRef.current) {\n\t\t\t\tconst [pointerId, point] = remaining;\n\t\t\t\tpanRef.current = {\n\t\t\t\t\tpointerId,\n\t\t\t\t\tstartX: point.x,\n\t\t\t\t\tstartY: point.y,\n\t\t\t\t\toriginTx: transformRef.current.tx,\n\t\t\t\t\toriginTy: transformRef.current.ty,\n\t\t\t\t\tmoved: true,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tconst swipeHandled = finishSwipe(e);\n\t\tif (swipeHandled) return;\n\n\t\tconst pan = panRef.current;\n\t\tif (pan && pan.pointerId === e.pointerId) {\n\t\t\tconst wasMoved = pan.moved;\n\t\t\tpanRef.current = null;\n\t\t\tif (wasMoved) return;\n\t\t}\n\n\t\tif (pointersRef.current.size === 0 && e.button === 0) {\n\t\t\tconst now = Date.now();\n\t\t\tconst last = lastTapRef.current;\n\t\t\tif (\n\t\t\t\tlast &&\n\t\t\t\tnow - last.time < ZOOM_PAN_DOUBLE_TAP_MS &&\n\t\t\t\tMath.hypot(e.clientX - last.x, e.clientY - last.y) < 24\n\t\t\t) {\n\t\t\t\tlastTapRef.current = null;\n\t\t\t\tif (\n\t\t\t\t\tdoubleTapRef.current === \"toggle\" &&\n\t\t\t\t\ttransformRef.current.scale <= minScaleRef.current\n\t\t\t\t) {\n\t\t\t\t\tconst { x, y } = stageOrigin(e.clientX, e.clientY);\n\t\t\t\t\tsetTransform(\n\t\t\t\t\t\tzoomToward(\n\t\t\t\t\t\t\ttransformRef.current,\n\t\t\t\t\t\t\tMath.min(2, maxScaleRef.current),\n\t\t\t\t\t\t\tx,\n\t\t\t\t\t\t\ty,\n\t\t\t\t\t\t\tminScaleRef.current,\n\t\t\t\t\t\t\tmaxScaleRef.current,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\treset();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlastTapRef.current = { time: now, x: e.clientX, y: e.clientY };\n\t\t}\n\t}\n\n\treturn {\n\t\tstageRef,\n\t\ttransform,\n\t\tisDragging: isSwipeDragging,\n\t\tsnapBack,\n\t\thandlers: {\n\t\t\tonPointerDown,\n\t\t\tonPointerMove,\n\t\t\tonPointerUp,\n\t\t\tonPointerCancel: onPointerUp,\n\t\t},\n\t\treset,\n\t\tsetScale,\n\t\tclearSnapBack,\n\t};\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { AlertTriangle, Inbox, Loader2 } from \"lucide-react\";\n\nimport { cn } from \"../lib/utils\";\nimport {\n\tEmpty,\n\tEmptyContent,\n\tEmptyDescription,\n\tEmptyHeader,\n\tEmptyMedia,\n\tEmptyTitle,\n} from \"./ui/empty\";\n\nexport function LoadingState({\n\tlabel = \"Cargando…\",\n\tclassName,\n}: {\n\tlabel?: string;\n\tclassName?: string;\n}) {\n\treturn (\n\t\t<div\n\t\t\trole=\"status\"\n\t\t\taria-live=\"polite\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex items-center justify-center gap-2 py-12 text-sm text-muted-foreground\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<Loader2 className=\"size-4 animate-spin\" aria-hidden=\"true\" />\n\t\t\t<span>{label}</span>\n\t\t</div>\n\t);\n}\n\nexport function ErrorState({\n\ttitle = \"Algo salió mal\",\n\tdescription,\n\taction,\n\tclassName,\n}: {\n\ttitle?: string;\n\tdescription?: string;\n\taction?: React.ReactNode;\n\tclassName?: string;\n}) {\n\treturn (\n\t\t<div\n\t\t\trole=\"alert\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-col items-center gap-3 rounded-xl border border-dashed border-destructive/40 bg-destructive/5 py-12 text-center\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<AlertTriangle className=\"size-6 text-destructive\" aria-hidden=\"true\" />\n\t\t\t<div>\n\t\t\t\t<p className=\"font-medium\">{title}</p>\n\t\t\t\t{description ? (\n\t\t\t\t\t<p className=\"mt-1 text-sm text-muted-foreground\">{description}</p>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t\t{action}\n\t\t</div>\n\t);\n}\n\n/** Accept any icon component with a className prop — avoids LucideIcon\n * version skew between blocks peers and consuming apps. */\nexport type EmptyStateIcon = React.ComponentType<{\n\tclassName?: string;\n\t\"aria-hidden\"?: boolean | \"true\" | \"false\";\n}>;\n\nexport type EmptyStateProps = {\n\ttitle: string;\n\tdescription?: string;\n\taction?: React.ReactNode;\n\ticon?: EmptyStateIcon;\n\tvariant?: \"default\" | \"compact\";\n\tclassName?: string;\n};\n\nexport function EmptyState({\n\ttitle,\n\tdescription,\n\taction,\n\ticon: Icon = Inbox,\n\tvariant = \"default\",\n\tclassName,\n}: EmptyStateProps) {\n\tconst isCompact = variant === \"compact\";\n\n\treturn (\n\t\t<Empty\n\t\t\tclassName={cn(\n\t\t\t\t\"gap-3\",\n\t\t\t\tisCompact\n\t\t\t\t\t? \"flex-none rounded-none px-4 py-6\"\n\t\t\t\t\t: \"flex-none rounded-xl border border-dashed px-6 py-12\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<EmptyHeader className=\"gap-3\">\n\t\t\t\t<EmptyMedia\n\t\t\t\t\tvariant=\"icon\"\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"mb-0 bg-transparent text-muted-foreground\",\n\t\t\t\t\t\tisCompact\n\t\t\t\t\t\t\t? \"size-auto [&_svg:not([class*='size-'])]:size-8 [&_svg]:opacity-50\"\n\t\t\t\t\t\t\t: \"size-auto [&_svg:not([class*='size-'])]:size-6\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<Icon aria-hidden=\"true\" />\n\t\t\t\t</EmptyMedia>\n\t\t\t\t<EmptyTitle\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"font-medium tracking-normal\",\n\t\t\t\t\t\tisCompact ? \"text-sm\" : \"text-base\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{title}\n\t\t\t\t</EmptyTitle>\n\t\t\t\t{description ? (\n\t\t\t\t\t<EmptyDescription className=\"mt-0\">{description}</EmptyDescription>\n\t\t\t\t) : null}\n\t\t\t</EmptyHeader>\n\t\t\t{action ? <EmptyContent className=\"gap-0\">{action}</EmptyContent> : null}\n\t\t</Empty>\n\t);\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { Thumbnail } from \"react-pdf\";\n\nimport { cn } from \"../../lib/utils\";\n\ntype LazyThumbnailProps = {\n\tpageNumber: number;\n\tactive: boolean;\n\twidth: number;\n\tonClick: () => void;\n\tariaLabel: string;\n};\n\n/**\n * Renders a react-pdf Thumbnail only after the slot intersects the viewport,\n * so large documents do not mount hundreds of canvases up front.\n */\nexport function LazyThumbnail({\n\tpageNumber,\n\tactive,\n\twidth,\n\tonClick,\n\tariaLabel,\n}: LazyThumbnailProps) {\n\tconst ref = useRef<HTMLButtonElement>(null);\n\tconst [visible, setVisible] = useState(false);\n\n\tuseEffect(() => {\n\t\tconst node = ref.current;\n\t\tif (!node || typeof IntersectionObserver === \"undefined\") {\n\t\t\tsetVisible(true);\n\t\t\treturn;\n\t\t}\n\t\tconst observer = new IntersectionObserver(\n\t\t\t(entries) => {\n\t\t\t\tif (entries.some((e) => e.isIntersecting)) {\n\t\t\t\t\tsetVisible(true);\n\t\t\t\t\tobserver.disconnect();\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ rootMargin: \"120px 0px\" },\n\t\t);\n\t\tobserver.observe(node);\n\t\treturn () => observer.disconnect();\n\t}, []);\n\n\treturn (\n\t\t<button\n\t\t\tref={ref}\n\t\t\ttype=\"button\"\n\t\t\tonClick={onClick}\n\t\t\taria-label={ariaLabel}\n\t\t\taria-current={active ? \"page\" : undefined}\n\t\t\tclassName={cn(\n\t\t\t\t\"block w-full overflow-hidden rounded-md border bg-background p-1 transition-colors hover:border-primary\",\n\t\t\t\tactive ? \"border-primary ring-2 ring-primary/30\" : \"border-border\",\n\t\t\t)}\n\t\t>\n\t\t\t{visible ? (\n\t\t\t\t<Thumbnail pageNumber={pageNumber} width={width} className=\"mx-auto\" />\n\t\t\t) : (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"mx-auto bg-muted\"\n\t\t\t\t\tstyle={{ width, height: Math.round(width * 1.4) }}\n\t\t\t\t\taria-hidden\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<span className=\"mt-1 block text-center text-[10px] text-muted-foreground\">\n\t\t\t\t{pageNumber}\n\t\t\t</span>\n\t\t</button>\n\t);\n}\n","import { pdfjs } from \"react-pdf\";\n\nimport \"react-pdf/dist/Page/TextLayer.css\";\nimport \"react-pdf/dist/Page/AnnotationLayer.css\";\n\nlet configuredSrc: string | null = null;\n\n/**\n * Apply the consumer-resolved pdfjs worker URL once. Bundler-specific\n * `new URL(..., import.meta.url)` must run in the app, not inside this\n * pre-built package.\n */\nexport function configurePdfWorker(workerSrc: string) {\n\tif (!workerSrc || configuredSrc === workerSrc) return;\n\tpdfjs.GlobalWorkerOptions.workerSrc = workerSrc;\n\tconfiguredSrc = workerSrc;\n}\n","\"use client\";\n\nimport {\n\tuseCallback,\n\tuseEffect,\n\tuseRef,\n\tuseState,\n\ttype FormEvent,\n\ttype ReactNode,\n} from \"react\";\nimport { Document, Page } from \"react-pdf\";\nimport {\n\tChevronLeft,\n\tChevronRight,\n\tDownload,\n\tMaximize2,\n\tMinimize2,\n\tPanelLeft,\n\tPanelLeftClose,\n\tRotateCw,\n\tZoomIn,\n\tZoomOut,\n} from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\nimport {\n\tZOOM_PAN_MIN_SCALE,\n\tZOOM_PAN_SWIPE_SNAP_MS,\n\tprefersReducedMotion,\n\tuseZoomPanGestures,\n} from \"../../hooks/useZoomPanGestures\";\nimport { ErrorState, LoadingState } from \"../EmptyState\";\nimport { LazyThumbnail } from \"./LazyThumbnail\";\nimport { configurePdfWorker } from \"./worker\";\n\nconst ZOOM_STEPS = [0.5, 0.75, 1, 1.25, 1.5, 2, 2.5, 3];\nconst THUMB_WIDTH = 120;\n\nexport type PdfViewerLabels = {\n\tloading?: string;\n\tloadError?: string;\n\tloadErrorDescription?: string;\n\tpreviousPage?: string;\n\tnextPage?: string;\n\tzoomIn?: string;\n\tzoomOut?: string;\n\tfitWidth?: string;\n\tfitPage?: string;\n\trotate?: string;\n\tenterFullscreen?: string;\n\texitFullscreen?: string;\n\tdownload?: string;\n\tdownloadAria?: string;\n\tshowThumbnails?: string;\n\thideThumbnails?: string;\n\tpageJumpAria?: string;\n\tthumbnailAria?: (page: number) => string;\n\tpageOf?: (current: number, total: number) => string;\n};\n\nexport type PdfViewerProps = {\n\tfileUrl: string;\n\tfileName: string;\n\tdownloadUrl?: string;\n\t/** Consumer-resolved pdfjs worker URL — bundler-specific. */\n\tworkerSrc: string;\n\tinitialPage?: number;\n\tclassName?: string;\n\tlabels: PdfViewerLabels;\n\t/**\n\t * Optional leading toolbar control (e.g. close / back). Rendered before\n\t * thumbnails so host chrome does not float over PDF tools.\n\t */\n\tcloseAction?: ReactNode;\n};\n\n/**\n * Full-featured single-page PDF surface: collapsible lazy thumbnail rail,\n * page nav + jump, zoom/fit/rotate, pinch+swipe gestures, fullscreen and\n * download. Layout-agnostic — fills its parent.\n */\nexport function PdfViewer({\n\tfileUrl,\n\tfileName,\n\tdownloadUrl,\n\tworkerSrc,\n\tinitialPage = 1,\n\tclassName,\n\tlabels,\n\tcloseAction,\n}: PdfViewerProps) {\n\tconfigurePdfWorker(workerSrc);\n\n\tconst [numPages, setNumPages] = useState(0);\n\tconst [pageNumber, setPageNumber] = useState(initialPage);\n\tconst [zoomIndex, setZoomIndex] = useState(2);\n\tconst [fitMode, setFitMode] = useState<\"width\" | \"page\">(\"width\");\n\tconst [rotation, setRotation] = useState(0);\n\tconst [containerWidth, setContainerWidth] = useState(0);\n\tconst [containerHeight, setContainerHeight] = useState(0);\n\tconst [isFullscreen, setIsFullscreen] = useState(false);\n\tconst [thumbsOpen, setThumbsOpen] = useState(false);\n\tconst [loadError, setLoadError] = useState(false);\n\tconst [pageDraft, setPageDraft] = useState(String(initialPage));\n\n\tconst viewportRef = useRef<HTMLDivElement>(null);\n\tconst shellRef = useRef<HTMLDivElement>(null);\n\tconst pageNumberRef = useRef(pageNumber);\n\tpageNumberRef.current = pageNumber;\n\tconst numPagesRef = useRef(numPages);\n\tnumPagesRef.current = numPages;\n\n\tconst baseScale = ZOOM_STEPS[zoomIndex] ?? 1;\n\n\tconst goToPage = useCallback((next: number) => {\n\t\tconst total = numPagesRef.current;\n\t\tif (total <= 0) return;\n\t\tconst clamped = Math.min(Math.max(1, next), total);\n\t\tsetPageNumber(clamped);\n\t\tsetPageDraft(String(clamped));\n\t}, []);\n\n\tconst onSwipeCommit = useCallback(\n\t\t(direction: \"prev\" | \"next\") => {\n\t\t\tif (direction === \"next\") {\n\t\t\t\tgoToPage(pageNumberRef.current + 1);\n\t\t\t} else {\n\t\t\t\tgoToPage(pageNumberRef.current - 1);\n\t\t\t}\n\t\t},\n\t\t[goToPage],\n\t);\n\n\tconst {\n\t\tstageRef,\n\t\ttransform,\n\t\tisDragging,\n\t\tsnapBack,\n\t\thandlers,\n\t\treset,\n\t\tclearSnapBack,\n\t} = useZoomPanGestures({\n\t\tswipeEnabled: numPages > 1,\n\t\tonSwipeCommit,\n\t\twheelZoom: true,\n\t\tdoubleTap: \"toggle\",\n\t});\n\n\tuseEffect(() => {\n\t\tsetPageNumber(initialPage);\n\t\tsetPageDraft(String(initialPage));\n\t\tsetZoomIndex(2);\n\t\tsetFitMode(\"width\");\n\t\tsetRotation(0);\n\t\tsetNumPages(0);\n\t\tsetLoadError(false);\n\t\tsetThumbsOpen(false);\n\t\treset();\n\t}, [fileUrl, initialPage, reset]);\n\n\tuseEffect(() => {\n\t\treset();\n\t}, [pageNumber, reset]);\n\n\tuseEffect(() => {\n\t\tif (!viewportRef.current) return;\n\t\tconst el = viewportRef.current;\n\t\tconst observer = new ResizeObserver((entries) => {\n\t\t\tconst rect = entries[0]?.contentRect;\n\t\t\tif (!rect) return;\n\t\t\tsetContainerWidth(rect.width);\n\t\t\tsetContainerHeight(rect.height);\n\t\t});\n\t\tobserver.observe(el);\n\t\tsetContainerWidth(el.clientWidth);\n\t\tsetContainerHeight(el.clientHeight);\n\t\treturn () => observer.disconnect();\n\t}, []);\n\n\tuseEffect(() => {\n\t\tfunction onFullscreenChange() {\n\t\t\tsetIsFullscreen(document.fullscreenElement === shellRef.current);\n\t\t}\n\t\tdocument.addEventListener(\"fullscreenchange\", onFullscreenChange);\n\t\treturn () =>\n\t\t\tdocument.removeEventListener(\"fullscreenchange\", onFullscreenChange);\n\t}, []);\n\n\tuseEffect(() => {\n\t\tfunction onKeyDown(e: KeyboardEvent) {\n\t\t\tconst target = e.target as HTMLElement | null;\n\t\t\tif (\n\t\t\t\ttarget &&\n\t\t\t\t(target.tagName === \"INPUT\" ||\n\t\t\t\t\ttarget.tagName === \"TEXTAREA\" ||\n\t\t\t\t\ttarget.isContentEditable)\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tswitch (e.key) {\n\t\t\t\tcase \"ArrowLeft\":\n\t\t\t\tcase \"PageUp\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tgoToPage(pageNumberRef.current - 1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"ArrowRight\":\n\t\t\t\tcase \"PageDown\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tgoToPage(pageNumberRef.current + 1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"Home\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tgoToPage(1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"End\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tgoToPage(numPagesRef.current);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"+\":\n\t\t\t\tcase \"=\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetZoomIndex((i) => Math.min(i + 1, ZOOM_STEPS.length - 1));\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"-\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetZoomIndex((i) => Math.max(i - 1, 0));\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\twindow.addEventListener(\"keydown\", onKeyDown);\n\t\treturn () => window.removeEventListener(\"keydown\", onKeyDown);\n\t}, [goToPage]);\n\n\tconst fitWidth = useCallback(() => {\n\t\tsetFitMode(\"width\");\n\t\tsetZoomIndex(2);\n\t\treset();\n\t}, [reset]);\n\n\tconst fitPage = useCallback(() => {\n\t\tsetFitMode(\"page\");\n\t\tsetZoomIndex(2);\n\t\treset();\n\t}, [reset]);\n\n\tconst zoomIn = useCallback(() => {\n\t\tsetZoomIndex((i) => Math.min(i + 1, ZOOM_STEPS.length - 1));\n\t}, []);\n\n\tconst zoomOut = useCallback(() => {\n\t\tsetZoomIndex((i) => Math.max(i - 1, 0));\n\t}, []);\n\n\tconst toggleFullscreen = useCallback(async () => {\n\t\tif (!shellRef.current) return;\n\t\tif (document.fullscreenElement === shellRef.current) {\n\t\t\tawait document.exitFullscreen();\n\t\t} else {\n\t\t\tawait shellRef.current.requestFullscreen();\n\t\t}\n\t}, []);\n\n\tfunction submitPageJump(e: FormEvent) {\n\t\te.preventDefault();\n\t\tconst parsed = Number.parseInt(pageDraft, 10);\n\t\tif (Number.isFinite(parsed)) goToPage(parsed);\n\t\telse setPageDraft(String(pageNumber));\n\t}\n\n\tconst pageWidth =\n\t\tfitMode === \"width\"\n\t\t\t? Math.max(containerWidth - 32, 240) * baseScale\n\t\t\t: undefined;\n\tconst pageHeight =\n\t\tfitMode === \"page\"\n\t\t\t? Math.max(containerHeight - 32, 240) * baseScale\n\t\t\t: undefined;\n\n\tconst rawDownload = downloadUrl ?? fileUrl;\n\tconst downloadHref = `${rawDownload}${rawDownload.includes(\"?\") ? \"&\" : \"?\"}download=1`;\n\n\tconst { scale: gestureScale, tx, ty } = transform;\n\tconst transition =\n\t\tsnapBack && !isDragging && !prefersReducedMotion()\n\t\t\t? `transform ${ZOOM_PAN_SWIPE_SNAP_MS}ms ease-out`\n\t\t\t: undefined;\n\n\tconst pageOf =\n\t\tlabels.pageOf?.(pageNumber, numPages) ??\n\t\t(numPages > 0 ? `${pageNumber} / ${numPages}` : \"—\");\n\n\tfunction renderThumbList(onSelect: (n: number) => void) {\n\t\treturn (\n\t\t\t<div className=\"space-y-2\">\n\t\t\t\t{Array.from({ length: numPages }, (_, i) => {\n\t\t\t\t\tconst n = i + 1;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<LazyThumbnail\n\t\t\t\t\t\t\tkey={n}\n\t\t\t\t\t\t\tpageNumber={n}\n\t\t\t\t\t\t\tactive={n === pageNumber}\n\t\t\t\t\t\t\twidth={THUMB_WIDTH}\n\t\t\t\t\t\t\tonClick={() => onSelect(n)}\n\t\t\t\t\t\t\tariaLabel={labels.thumbnailAria?.(n) ?? `Página ${n}`}\n\t\t\t\t\t\t/>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tref={shellRef}\n\t\t\tclassName={cn(\n\t\t\t\t\"relative flex h-full min-h-0 w-full flex-col bg-background\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{(closeAction || !loadError) && (\n\t\t\t\t<div className=\"flex shrink-0 items-center gap-1 overflow-x-auto border-b px-2 py-2\">\n\t\t\t\t\t{closeAction ? (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tdata-slot=\"pdf-close-action\"\n\t\t\t\t\t\t\tclassName=\"mr-1 flex shrink-0 items-center\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{closeAction}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{!loadError && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border bg-background text-foreground hover:bg-accent\"\n\t\t\t\t\t\t\t\tonClick={() => setThumbsOpen((v) => !v)}\n\t\t\t\t\t\t\t\taria-label={\n\t\t\t\t\t\t\t\t\tthumbsOpen\n\t\t\t\t\t\t\t\t\t\t? (labels.hideThumbnails ?? \"Ocultar miniaturas\")\n\t\t\t\t\t\t\t\t\t\t: (labels.showThumbnails ?? \"Mostrar miniaturas\")\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\taria-pressed={thumbsOpen}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{thumbsOpen ? (\n\t\t\t\t\t\t\t\t\t<PanelLeftClose className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<PanelLeft className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border bg-background hover:bg-accent disabled:opacity-50\"\n\t\t\t\t\t\t\t\tonClick={() => goToPage(pageNumber - 1)}\n\t\t\t\t\t\t\t\tdisabled={pageNumber <= 1}\n\t\t\t\t\t\t\t\taria-label={labels.previousPage ?? \"Página anterior\"}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ChevronLeft className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t<form\n\t\t\t\t\t\t\t\tonSubmit={submitPageJump}\n\t\t\t\t\t\t\t\tclassName=\"flex shrink-0 items-center gap-1 text-xs text-muted-foreground\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<label className=\"sr-only\" htmlFor=\"pdf-page-jump\">\n\t\t\t\t\t\t\t\t\t{labels.pageJumpAria ?? \"Ir a página\"}\n\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\tid=\"pdf-page-jump\"\n\t\t\t\t\t\t\t\t\tvalue={pageDraft}\n\t\t\t\t\t\t\t\t\tonChange={(e) => setPageDraft(e.target.value)}\n\t\t\t\t\t\t\t\t\tclassName=\"h-8 w-12 rounded-md border bg-background px-1 text-center text-foreground\"\n\t\t\t\t\t\t\t\t\tinputMode=\"numeric\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<span className=\"min-w-10 whitespace-nowrap\">{pageOf}</span>\n\t\t\t\t\t\t\t</form>\n\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border bg-background hover:bg-accent disabled:opacity-50\"\n\t\t\t\t\t\t\t\tonClick={() => goToPage(pageNumber + 1)}\n\t\t\t\t\t\t\t\tdisabled={pageNumber >= numPages}\n\t\t\t\t\t\t\t\taria-label={labels.nextPage ?? \"Página siguiente\"}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ChevronRight className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border bg-background hover:bg-accent disabled:opacity-50\"\n\t\t\t\t\t\t\t\tonClick={zoomOut}\n\t\t\t\t\t\t\t\tdisabled={zoomIndex <= 0}\n\t\t\t\t\t\t\t\taria-label={labels.zoomOut ?? \"Alejar\"}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ZoomOut className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName=\"inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-background px-2 text-xs hover:bg-accent\"\n\t\t\t\t\t\t\t\tonClick={fitMode === \"width\" ? fitPage : fitWidth}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{fitMode === \"width\"\n\t\t\t\t\t\t\t\t\t? (labels.fitPage ?? \"Ajustar página\")\n\t\t\t\t\t\t\t\t\t: (labels.fitWidth ?? \"Ajustar ancho\")}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border bg-background hover:bg-accent disabled:opacity-50\"\n\t\t\t\t\t\t\t\tonClick={zoomIn}\n\t\t\t\t\t\t\t\tdisabled={zoomIndex >= ZOOM_STEPS.length - 1}\n\t\t\t\t\t\t\t\taria-label={labels.zoomIn ?? \"Acercar\"}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ZoomIn className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border bg-background hover:bg-accent\"\n\t\t\t\t\t\t\t\tonClick={() => setRotation((r) => (r + 90) % 360)}\n\t\t\t\t\t\t\t\taria-label={labels.rotate ?? \"Rotar\"}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<RotateCw className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border bg-background hover:bg-accent\"\n\t\t\t\t\t\t\t\tonClick={() => void toggleFullscreen()}\n\t\t\t\t\t\t\t\taria-label={\n\t\t\t\t\t\t\t\t\tisFullscreen\n\t\t\t\t\t\t\t\t\t\t? (labels.exitFullscreen ?? \"Salir de pantalla completa\")\n\t\t\t\t\t\t\t\t\t\t: (labels.enterFullscreen ?? \"Pantalla completa\")\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{isFullscreen ? (\n\t\t\t\t\t\t\t\t\t<Minimize2 className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<Maximize2 className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\thref={downloadHref}\n\t\t\t\t\t\t\t\tdownload={fileName}\n\t\t\t\t\t\t\t\taria-label={\n\t\t\t\t\t\t\t\t\tlabels.downloadAria ?? labels.download ?? \"Descargar\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tclassName=\"inline-flex h-8 shrink-0 items-center gap-1 rounded-md border bg-background px-2 text-xs hover:bg-accent\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Download className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t<span className=\"hidden sm:inline\">\n\t\t\t\t\t\t\t\t\t{labels.download ?? \"Descargar\"}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<div className=\"relative flex min-h-0 flex-1\">\n\t\t\t\t{numPages > 0 && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"hidden w-40 shrink-0 overflow-y-auto border-r bg-background p-2 lg:block\",\n\t\t\t\t\t\t\t!thumbsOpen && \"lg:hidden\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{renderThumbList(goToPage)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{thumbsOpen && numPages > 0 && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\taria-label={\n\t\t\t\t\t\t\t\tlabels.hideThumbnails\n\t\t\t\t\t\t\t\t\t? `${labels.hideThumbnails} (fondo)`\n\t\t\t\t\t\t\t\t\t: \"Cerrar miniaturas (fondo)\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tclassName=\"absolute inset-0 z-20 bg-black/40 lg:hidden\"\n\t\t\t\t\t\t\tonClick={() => setThumbsOpen(false)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<div className=\"absolute inset-y-0 left-0 z-30 w-40 overflow-y-auto border-r bg-background p-2 shadow-lg lg:hidden\">\n\t\t\t\t\t\t\t{renderThumbList((n) => {\n\t\t\t\t\t\t\t\tgoToPage(n);\n\t\t\t\t\t\t\t\tsetThumbsOpen(false);\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\n\t\t\t\t<div\n\t\t\t\t\tref={viewportRef}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"relative min-h-0 flex-1 overflow-hidden bg-muted/40\",\n\t\t\t\t\t\tgestureScale > ZOOM_PAN_MIN_SCALE &&\n\t\t\t\t\t\t\t(isDragging ? \"cursor-grabbing\" : \"cursor-grab\"),\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{loadError ? (\n\t\t\t\t\t\t<div className=\"absolute inset-0 flex items-center justify-center p-6 sm:p-8\">\n\t\t\t\t\t\t\t<ErrorState\n\t\t\t\t\t\t\t\tclassName=\"w-full max-w-md px-4\"\n\t\t\t\t\t\t\t\ttitle={labels.loadError ?? \"No se pudo cargar el PDF\"}\n\t\t\t\t\t\t\t\tdescription={\n\t\t\t\t\t\t\t\t\tlabels.loadErrorDescription ??\n\t\t\t\t\t\t\t\t\t\"El archivo puede estar dañado, cifrado o bloqueado.\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\taction={\n\t\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\t\thref={downloadHref}\n\t\t\t\t\t\t\t\t\t\tdownload={fileName}\n\t\t\t\t\t\t\t\t\t\tclassName=\"text-sm text-primary underline\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{labels.download ?? \"Descargar\"}\n\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tref={stageRef}\n\t\t\t\t\t\t\tclassName=\"flex min-h-full touch-none items-start justify-center p-4\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\ttransform: `translate(${tx}px, ${ty}px) scale(${gestureScale})`,\n\t\t\t\t\t\t\t\ttransition,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonPointerDown={handlers.onPointerDown}\n\t\t\t\t\t\t\tonPointerMove={handlers.onPointerMove}\n\t\t\t\t\t\t\tonPointerUp={handlers.onPointerUp}\n\t\t\t\t\t\t\tonPointerCancel={handlers.onPointerCancel}\n\t\t\t\t\t\t\tonTransitionEnd={clearSnapBack}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Document\n\t\t\t\t\t\t\t\tfile={fileUrl}\n\t\t\t\t\t\t\t\tonLoadSuccess={({ numPages: pages }) => {\n\t\t\t\t\t\t\t\t\tsetNumPages(pages);\n\t\t\t\t\t\t\t\t\tsetLoadError(false);\n\t\t\t\t\t\t\t\t\tconst start = Math.min(Math.max(1, initialPage), pages);\n\t\t\t\t\t\t\t\t\tsetPageNumber(start);\n\t\t\t\t\t\t\t\t\tsetPageDraft(String(start));\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonLoadError={() => setLoadError(true)}\n\t\t\t\t\t\t\t\tloading={\n\t\t\t\t\t\t\t\t\t<LoadingState label={labels.loading ?? \"Cargando PDF…\"} />\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\terror={\n\t\t\t\t\t\t\t\t\t<div className=\"absolute inset-0 flex items-center justify-center p-6 sm:p-8\">\n\t\t\t\t\t\t\t\t\t\t<ErrorState\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"w-full max-w-md px-4\"\n\t\t\t\t\t\t\t\t\t\t\ttitle={labels.loadError ?? \"No se pudo cargar el PDF\"}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{numPages > 0 && (\n\t\t\t\t\t\t\t\t\t<Page\n\t\t\t\t\t\t\t\t\t\tpageNumber={pageNumber}\n\t\t\t\t\t\t\t\t\t\twidth={pageWidth}\n\t\t\t\t\t\t\t\t\t\theight={pageHeight}\n\t\t\t\t\t\t\t\t\t\trotate={rotation}\n\t\t\t\t\t\t\t\t\t\trenderTextLayer\n\t\t\t\t\t\t\t\t\t\trenderAnnotationLayer\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</Document>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { XIcon } from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Dialog({\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n\treturn <DialogPrimitive.Root data-slot=\"dialog\" {...props} />;\n}\n\nfunction DialogTrigger({\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n\treturn <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />;\n}\n\nfunction DialogPortal({\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n\treturn <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />;\n}\n\nfunction DialogClose({\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n\treturn <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />;\n}\n\nfunction DialogOverlay({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n\treturn (\n\t\t<DialogPrimitive.Overlay\n\t\t\tdata-slot=\"dialog-overlay\"\n\t\t\tclassName={cn(\n\t\t\t\t\"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DialogContent({\n\tclassName,\n\tchildren,\n\tshowCloseButton = true,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n\tshowCloseButton?: boolean;\n}) {\n\treturn (\n\t\t<DialogPortal data-slot=\"dialog-portal\">\n\t\t\t<DialogOverlay />\n\t\t\t<DialogPrimitive.Content\n\t\t\t\tdata-slot=\"dialog-content\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 outline-none sm:max-w-lg\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t\t{showCloseButton && (\n\t\t\t\t\t<DialogPrimitive.Close\n\t\t\t\t\t\tdata-slot=\"dialog-close\"\n\t\t\t\t\t\tclassName=\"ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<XIcon />\n\t\t\t\t\t\t<span className=\"sr-only\">Close</span>\n\t\t\t\t\t</DialogPrimitive.Close>\n\t\t\t\t)}\n\t\t\t</DialogPrimitive.Content>\n\t\t</DialogPortal>\n\t);\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"dialog-header\"\n\t\t\tclassName={cn(\"flex flex-col gap-2 text-center sm:text-left\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"dialog-footer\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DialogTitle({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n\treturn (\n\t\t<DialogPrimitive.Title\n\t\t\tdata-slot=\"dialog-title\"\n\t\t\tclassName={cn(\"text-lg leading-none font-semibold\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DialogDescription({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n\treturn (\n\t\t<DialogPrimitive.Description\n\t\t\tdata-slot=\"dialog-description\"\n\t\t\tclassName={cn(\"text-muted-foreground text-sm\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport {\n\tDialog,\n\tDialogClose,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogOverlay,\n\tDialogPortal,\n\tDialogTitle,\n\tDialogTrigger,\n};\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { X } from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogTitle,\n} from \"../ui/dialog\";\n\nexport type MediaViewerDialogLabels = {\n\tclose?: string;\n\ttitle?: string;\n\tdescription?: string;\n};\n\nexport type MediaViewerDialogProps = {\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n\tchildren: ReactNode;\n\tlabels?: MediaViewerDialogLabels;\n\tclassName?: string;\n\t/** Extra classes for the dialog content shell. */\n\tcontentClassName?: string;\n\tshowCloseButton?: boolean;\n};\n\n/**\n * Edge-to-edge fullscreen dialog shell for media viewers (post detail, PDF,\n * etc.). Uses the shared Radix dialog for focus trap, Esc and `aria-modal`.\n * Pass `contentClassName` to opt into a contained desktop card when needed.\n */\nexport function MediaViewerDialog({\n\topen,\n\tonOpenChange,\n\tchildren,\n\tlabels,\n\tclassName,\n\tcontentClassName,\n\tshowCloseButton = true,\n}: MediaViewerDialogProps) {\n\tconst closeLabel = labels?.close ?? \"Cerrar\";\n\tconst title = labels?.title ?? \"Visor\";\n\tconst description = labels?.description ?? title;\n\n\treturn (\n\t\t<Dialog open={open} onOpenChange={onOpenChange}>\n\t\t\t<DialogContent\n\t\t\t\tshowCloseButton={false}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"inset-0 flex h-dvh max-h-dvh w-screen max-w-none translate-x-0 translate-y-0 top-0 left-0 gap-0 overflow-hidden rounded-none border-0 p-0 shadow-none sm:max-w-none\",\n\t\t\t\t\tcontentClassName,\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<DialogTitle className=\"sr-only\">{title}</DialogTitle>\n\t\t\t\t<DialogDescription className=\"sr-only\">{description}</DialogDescription>\n\t\t\t\t{showCloseButton && (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={() => onOpenChange(false)}\n\t\t\t\t\t\taria-label={closeLabel}\n\t\t\t\t\t\tclassName=\"absolute top-3 right-3 z-20 rounded-full bg-black/50 p-2 text-white transition-colors hover:bg-black/70\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<X className=\"h-5 w-5\" />\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\t\t\t\t{children}\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t);\n}\n","\"use client\";\n\nimport { MediaViewerDialog } from \"../media/MediaViewerDialog\";\nimport {\n\tPdfViewer,\n\ttype PdfViewerLabels,\n\ttype PdfViewerProps,\n} from \"./PdfViewer\";\n\nexport type PdfViewerDialogProps = {\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n\ttitle: string;\n\tfileUrl: string;\n\tfileName?: string;\n\tdownloadUrl?: string;\n\tworkerSrc: string;\n\tinitialPage?: number;\n\tlabels: PdfViewerLabels & {\n\t\tclose?: string;\n\t\tdialogDescription?: string;\n\t};\n};\n\n/**\n * Drop-in dialog wrapper around {@link PdfViewer} using\n * {@link MediaViewerDialog} for the fullscreen-on-mobile shell.\n */\nexport function PdfViewerDialog({\n\topen,\n\tonOpenChange,\n\ttitle,\n\tfileUrl,\n\tfileName,\n\tdownloadUrl,\n\tworkerSrc,\n\tinitialPage,\n\tlabels,\n}: PdfViewerDialogProps) {\n\tconst viewerLabels: PdfViewerProps[\"labels\"] = labels;\n\n\treturn (\n\t\t<MediaViewerDialog\n\t\t\topen={open}\n\t\t\tonOpenChange={onOpenChange}\n\t\t\tlabels={{\n\t\t\t\tclose: labels.close,\n\t\t\t\ttitle,\n\t\t\t\tdescription: labels.dialogDescription ?? title,\n\t\t\t}}\n\t\t>\n\t\t\t<div className=\"flex h-full min-h-0 flex-col pt-12\">\n\t\t\t\t<div className=\"border-b px-4 py-2 pr-14\">\n\t\t\t\t\t<p className=\"truncate text-sm font-medium\">{title}</p>\n\t\t\t\t</div>\n\t\t\t\t<PdfViewer\n\t\t\t\t\tfileUrl={fileUrl}\n\t\t\t\t\tfileName={fileName ?? title}\n\t\t\t\t\tdownloadUrl={downloadUrl}\n\t\t\t\t\tworkerSrc={workerSrc}\n\t\t\t\t\tinitialPage={initialPage}\n\t\t\t\t\tlabels={viewerLabels}\n\t\t\t\t\tclassName=\"min-h-0 flex-1\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</MediaViewerDialog>\n\t);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/utils.ts","../src/hooks/useZoomPanGestures.ts","../src/components/EmptyState.tsx","../src/components/pdf/LazyThumbnail.tsx","../src/components/pdf/worker.ts","../src/components/pdf/PdfViewer.tsx","../src/components/ui/dialog.tsx","../src/components/media/MediaViewerDialog.tsx","../src/components/pdf/PdfViewerDialog.tsx"],"names":["twMerge","clsx","useState","useRef","useCallback","useEffect","dx","dy","jsxs","jsx","Loader2","AlertTriangle","Thumbnail","pdfjs","Fragment","PanelLeftClose","PanelLeft","ChevronLeft","ChevronRight","ZoomOut","ZoomIn","RotateCw","Minimize2","Maximize2","Download","Document","Page","DialogPrimitive","XIcon","X"],"mappings":"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","file":"pdf.cjs","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport {\n\tuseCallback,\n\tuseEffect,\n\tuseRef,\n\tuseState,\n\ttype PointerEvent as ReactPointerEvent,\n\ttype RefObject,\n} from \"react\";\n\nexport const ZOOM_PAN_MIN_SCALE = 1;\nexport const ZOOM_PAN_MAX_SCALE = 4;\nexport const ZOOM_PAN_DOUBLE_TAP_MS = 300;\nexport const ZOOM_PAN_SWIPE_LOCK_PX = 8;\nexport const ZOOM_PAN_SWIPE_COMMIT_PX = 56;\nexport const ZOOM_PAN_SWIPE_SNAP_MS = 180;\n\nexport type ZoomPanTransform = {\n\tscale: number;\n\ttx: number;\n\tty: number;\n};\n\nexport type SwipeDirection = \"prev\" | \"next\";\n\nexport type UseZoomPanGesturesOptions = {\n\tminScale?: number;\n\tmaxScale?: number;\n\t/** When false, horizontal swipe never commits (still pans when zoomed). */\n\tswipeEnabled?: boolean;\n\tonSwipeCommit?: (direction: SwipeDirection) => void;\n\t/** When true, wheel zoom is attached to the stage. Defaults to true. */\n\twheelZoom?: boolean;\n\t/**\n\t * Double-tap behavior at min scale: \"reset\" (default — ImageLightbox) or\n\t * \"toggle\" (zoom in toward tap, then reset).\n\t */\n\tdoubleTap?: \"reset\" | \"toggle\";\n};\n\nexport type UseZoomPanGesturesResult = {\n\tstageRef: RefObject<HTMLDivElement | null>;\n\ttransform: ZoomPanTransform;\n\tisDragging: boolean;\n\tsnapBack: boolean;\n\thandlers: {\n\t\tonPointerDown: (e: ReactPointerEvent<HTMLDivElement>) => void;\n\t\tonPointerMove: (e: ReactPointerEvent<HTMLDivElement>) => void;\n\t\tonPointerUp: (e: ReactPointerEvent<HTMLDivElement>) => void;\n\t\tonPointerCancel: (e: ReactPointerEvent<HTMLDivElement>) => void;\n\t};\n\treset: () => void;\n\tsetScale: (scale: number) => void;\n\tclearSnapBack: () => void;\n};\n\ntype SwipeAxis = \"x\" | \"y\";\n\nconst IDENTITY: ZoomPanTransform = { scale: 1, tx: 0, ty: 0 };\n\nfunction clamp(value: number, min: number, max: number) {\n\treturn Math.min(max, Math.max(min, value));\n}\n\nexport function zoomToward(\n\tprev: ZoomPanTransform,\n\tnextScale: number,\n\toriginX: number,\n\toriginY: number,\n\tminScale = ZOOM_PAN_MIN_SCALE,\n\tmaxScale = ZOOM_PAN_MAX_SCALE,\n): ZoomPanTransform {\n\tconst scale = clamp(nextScale, minScale, maxScale);\n\tif (scale === minScale) return { ...IDENTITY, scale: minScale };\n\tconst ratio = scale / prev.scale;\n\treturn {\n\t\tscale,\n\t\ttx: originX - (originX - prev.tx) * ratio,\n\t\tty: originY - (originY - prev.ty) * ratio,\n\t};\n}\n\nfunction pointerDistance(\n\ta: { x: number; y: number },\n\tb: { x: number; y: number },\n) {\n\treturn Math.hypot(b.x - a.x, b.y - a.y);\n}\n\nexport function prefersReducedMotion() {\n\tif (typeof window === \"undefined\" || !window.matchMedia) return false;\n\treturn window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n}\n\n/**\n * Pointer-driven pinch zoom, double-tap zoom toggle/reset, pan while zoomed,\n * and horizontal swipe-to-commit. Shared by ImageLightbox, MediaCarousel and\n * PdfViewer.\n */\nexport function useZoomPanGestures(\n\toptions: UseZoomPanGesturesOptions = {},\n): UseZoomPanGesturesResult {\n\tconst {\n\t\tminScale = ZOOM_PAN_MIN_SCALE,\n\t\tmaxScale = ZOOM_PAN_MAX_SCALE,\n\t\tswipeEnabled = true,\n\t\tonSwipeCommit,\n\t\twheelZoom = true,\n\t\tdoubleTap = \"reset\",\n\t} = options;\n\n\tconst [transform, setTransform] = useState<ZoomPanTransform>({\n\t\t...IDENTITY,\n\t\tscale: minScale,\n\t});\n\tconst transformRef = useRef(transform);\n\ttransformRef.current = transform;\n\n\tconst [isSwipeDragging, setIsSwipeDragging] = useState(false);\n\tconst [snapBack, setSnapBack] = useState(false);\n\n\tconst stageRef = useRef<HTMLDivElement>(null);\n\tconst pointersRef = useRef(new Map<number, { x: number; y: number }>());\n\tconst pinchStartRef = useRef<{\n\t\tdistance: number;\n\t\toriginX: number;\n\t\toriginY: number;\n\t\ttransform: ZoomPanTransform;\n\t} | null>(null);\n\tconst panRef = useRef<{\n\t\tpointerId: number;\n\t\tstartX: number;\n\t\tstartY: number;\n\t\toriginTx: number;\n\t\toriginTy: number;\n\t\tmoved: boolean;\n\t} | null>(null);\n\tconst swipeRef = useRef<{\n\t\tpointerId: number;\n\t\tstartX: number;\n\t\tstartY: number;\n\t\tmoved: boolean;\n\t\taxis: SwipeAxis | null;\n\t} | null>(null);\n\tconst lastTapRef = useRef<{ time: number; x: number; y: number } | null>(\n\t\tnull,\n\t);\n\tconst onSwipeCommitRef = useRef(onSwipeCommit);\n\tonSwipeCommitRef.current = onSwipeCommit;\n\tconst swipeEnabledRef = useRef(swipeEnabled);\n\tswipeEnabledRef.current = swipeEnabled;\n\tconst minScaleRef = useRef(minScale);\n\tminScaleRef.current = minScale;\n\tconst maxScaleRef = useRef(maxScale);\n\tmaxScaleRef.current = maxScale;\n\tconst doubleTapRef = useRef(doubleTap);\n\tdoubleTapRef.current = doubleTap;\n\n\tconst reset = useCallback(() => {\n\t\tsetTransform({ ...IDENTITY, scale: minScaleRef.current });\n\t\tsetIsSwipeDragging(false);\n\t\tsetSnapBack(false);\n\t}, []);\n\n\tconst setScale = useCallback((next: number) => {\n\t\tsetTransform((prev) =>\n\t\t\tzoomToward(prev, next, 0, 0, minScaleRef.current, maxScaleRef.current),\n\t\t);\n\t}, []);\n\n\tconst clearSnapBack = useCallback(() => {\n\t\tsetSnapBack(false);\n\t}, []);\n\n\tconst stageOrigin = useCallback((clientX: number, clientY: number) => {\n\t\tconst stage = stageRef.current;\n\t\tif (!stage) return { x: 0, y: 0 };\n\t\tconst rect = stage.getBoundingClientRect();\n\t\treturn {\n\t\t\tx: clientX - rect.left - rect.width / 2,\n\t\t\ty: clientY - rect.top - rect.height / 2,\n\t\t};\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (!wheelZoom) return;\n\t\tconst stage = stageRef.current;\n\t\tif (!stage) return;\n\n\t\tconst handleWheel = (e: WheelEvent) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tconst prev = transformRef.current;\n\t\t\tconst factor = e.deltaY > 0 ? 0.9 : 1.1;\n\t\t\tconst { x, y } = stageOrigin(e.clientX, e.clientY);\n\t\t\tsetTransform(\n\t\t\t\tzoomToward(\n\t\t\t\t\tprev,\n\t\t\t\t\tprev.scale * factor,\n\t\t\t\t\tx,\n\t\t\t\t\ty,\n\t\t\t\t\tminScaleRef.current,\n\t\t\t\t\tmaxScaleRef.current,\n\t\t\t\t),\n\t\t\t);\n\t\t};\n\n\t\tstage.addEventListener(\"wheel\", handleWheel, { passive: false });\n\t\treturn () => stage.removeEventListener(\"wheel\", handleWheel);\n\t}, [stageOrigin, wheelZoom]);\n\n\tfunction clearSwipe() {\n\t\tswipeRef.current = null;\n\t\tsetIsSwipeDragging(false);\n\t}\n\n\tfunction beginPinch() {\n\t\tconst pts = [...pointersRef.current.values()];\n\t\tconst [a, b] = pts;\n\t\tif (!a || !b) return;\n\t\tconst midX = (a.x + b.x) / 2;\n\t\tconst midY = (a.y + b.y) / 2;\n\t\tconst { x, y } = stageOrigin(midX, midY);\n\t\tpinchStartRef.current = {\n\t\t\tdistance: Math.max(pointerDistance(a, b), 1),\n\t\t\toriginX: x,\n\t\t\toriginY: y,\n\t\t\ttransform: { ...transformRef.current },\n\t\t};\n\t\tpanRef.current = null;\n\t\tclearSwipe();\n\t\tsetSnapBack(false);\n\t}\n\n\tfunction onPointerDown(e: ReactPointerEvent<HTMLDivElement>) {\n\t\te.stopPropagation();\n\t\tconst stage = stageRef.current;\n\t\tif (!stage) return;\n\n\t\tif (typeof stage.setPointerCapture === \"function\") {\n\t\t\tstage.setPointerCapture(e.pointerId);\n\t\t}\n\t\tpointersRef.current.set(e.pointerId, { x: e.clientX, y: e.clientY });\n\t\tsetSnapBack(false);\n\n\t\tif (pointersRef.current.size === 2) {\n\t\t\tbeginPinch();\n\t\t\treturn;\n\t\t}\n\n\t\tif (transformRef.current.scale > minScaleRef.current) {\n\t\t\tpanRef.current = {\n\t\t\t\tpointerId: e.pointerId,\n\t\t\t\tstartX: e.clientX,\n\t\t\t\tstartY: e.clientY,\n\t\t\t\toriginTx: transformRef.current.tx,\n\t\t\t\toriginTy: transformRef.current.ty,\n\t\t\t\tmoved: false,\n\t\t\t};\n\t\t\treturn;\n\t\t}\n\n\t\tif (swipeEnabledRef.current) {\n\t\t\tswipeRef.current = {\n\t\t\t\tpointerId: e.pointerId,\n\t\t\t\tstartX: e.clientX,\n\t\t\t\tstartY: e.clientY,\n\t\t\t\tmoved: false,\n\t\t\t\taxis: null,\n\t\t\t};\n\t\t\tsetIsSwipeDragging(true);\n\t\t}\n\t}\n\n\tfunction onPointerMove(e: ReactPointerEvent<HTMLDivElement>) {\n\t\tif (!pointersRef.current.has(e.pointerId)) return;\n\t\tpointersRef.current.set(e.pointerId, { x: e.clientX, y: e.clientY });\n\n\t\tconst pinchStart = pinchStartRef.current;\n\t\tif (pointersRef.current.size >= 2 && pinchStart) {\n\t\t\tconst pts = [...pointersRef.current.values()];\n\t\t\tconst [a, b] = pts;\n\t\t\tif (!a || !b) return;\n\t\t\tconst distance = Math.max(pointerDistance(a, b), 1);\n\t\t\tconst nextScale =\n\t\t\t\tpinchStart.transform.scale * (distance / pinchStart.distance);\n\t\t\tsetTransform(\n\t\t\t\tzoomToward(\n\t\t\t\t\tpinchStart.transform,\n\t\t\t\t\tnextScale,\n\t\t\t\t\tpinchStart.originX,\n\t\t\t\t\tpinchStart.originY,\n\t\t\t\t\tminScaleRef.current,\n\t\t\t\t\tmaxScaleRef.current,\n\t\t\t\t),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst pan = panRef.current;\n\t\tif (pan && pan.pointerId === e.pointerId) {\n\t\t\tconst dx = e.clientX - pan.startX;\n\t\t\tconst dy = e.clientY - pan.startY;\n\t\t\tif (Math.abs(dx) > 2 || Math.abs(dy) > 2) pan.moved = true;\n\t\t\tsetTransform((prev) => ({\n\t\t\t\t...prev,\n\t\t\t\ttx: pan.originTx + dx,\n\t\t\t\tty: pan.originTy + dy,\n\t\t\t}));\n\t\t\treturn;\n\t\t}\n\n\t\tconst swipe = swipeRef.current;\n\t\tif (!swipe || swipe.pointerId !== e.pointerId) return;\n\n\t\tconst dx = e.clientX - swipe.startX;\n\t\tconst dy = e.clientY - swipe.startY;\n\t\tif (Math.abs(dx) > 2 || Math.abs(dy) > 2) swipe.moved = true;\n\n\t\tif (swipe.axis === null) {\n\t\t\tconst absX = Math.abs(dx);\n\t\t\tconst absY = Math.abs(dy);\n\t\t\tif (absX < ZOOM_PAN_SWIPE_LOCK_PX && absY < ZOOM_PAN_SWIPE_LOCK_PX) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tswipe.axis = absX >= absY ? \"x\" : \"y\";\n\t\t\tif (swipe.axis === \"y\") {\n\t\t\t\tclearSwipe();\n\t\t\t\tsetTransform({ ...IDENTITY, scale: minScaleRef.current });\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (swipe.axis === \"x\") {\n\t\t\tsetTransform({\n\t\t\t\tscale: minScaleRef.current,\n\t\t\t\ttx: dx,\n\t\t\t\tty: 0,\n\t\t\t});\n\t\t}\n\t}\n\n\tfunction finishSwipe(e: ReactPointerEvent<HTMLDivElement>) {\n\t\tconst swipe = swipeRef.current;\n\t\tif (!swipe || swipe.pointerId !== e.pointerId) return false;\n\n\t\tconst dx = e.clientX - swipe.startX;\n\t\tconst wasMoved = swipe.moved;\n\t\tconst axis = swipe.axis;\n\t\tclearSwipe();\n\n\t\tif (axis === \"x\" && Math.abs(dx) >= ZOOM_PAN_SWIPE_COMMIT_PX) {\n\t\t\tonSwipeCommitRef.current?.(dx < 0 ? \"next\" : \"prev\");\n\t\t\treturn true;\n\t\t}\n\n\t\tif (wasMoved || transformRef.current.tx !== 0) {\n\t\t\tif (!prefersReducedMotion()) setSnapBack(true);\n\t\t\tsetTransform({ ...IDENTITY, scale: minScaleRef.current });\n\t\t}\n\t\treturn wasMoved;\n\t}\n\n\tfunction onPointerUp(e: ReactPointerEvent<HTMLDivElement>) {\n\t\tconst stage = stageRef.current;\n\t\tif (\n\t\t\tstage &&\n\t\t\ttypeof stage.hasPointerCapture === \"function\" &&\n\t\t\tstage.hasPointerCapture(e.pointerId) &&\n\t\t\ttypeof stage.releasePointerCapture === \"function\"\n\t\t) {\n\t\t\tstage.releasePointerCapture(e.pointerId);\n\t\t}\n\t\tpointersRef.current.delete(e.pointerId);\n\n\t\tif (pointersRef.current.size < 2) {\n\t\t\tpinchStartRef.current = null;\n\t\t}\n\t\tif (pointersRef.current.size === 1) {\n\t\t\tconst remaining = [...pointersRef.current.entries()][0];\n\t\t\tif (remaining && transformRef.current.scale > minScaleRef.current) {\n\t\t\t\tconst [pointerId, point] = remaining;\n\t\t\t\tpanRef.current = {\n\t\t\t\t\tpointerId,\n\t\t\t\t\tstartX: point.x,\n\t\t\t\t\tstartY: point.y,\n\t\t\t\t\toriginTx: transformRef.current.tx,\n\t\t\t\t\toriginTy: transformRef.current.ty,\n\t\t\t\t\tmoved: true,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tconst swipeHandled = finishSwipe(e);\n\t\tif (swipeHandled) return;\n\n\t\tconst pan = panRef.current;\n\t\tif (pan && pan.pointerId === e.pointerId) {\n\t\t\tconst wasMoved = pan.moved;\n\t\t\tpanRef.current = null;\n\t\t\tif (wasMoved) return;\n\t\t}\n\n\t\tif (pointersRef.current.size === 0 && e.button === 0) {\n\t\t\tconst now = Date.now();\n\t\t\tconst last = lastTapRef.current;\n\t\t\tif (\n\t\t\t\tlast &&\n\t\t\t\tnow - last.time < ZOOM_PAN_DOUBLE_TAP_MS &&\n\t\t\t\tMath.hypot(e.clientX - last.x, e.clientY - last.y) < 24\n\t\t\t) {\n\t\t\t\tlastTapRef.current = null;\n\t\t\t\tif (\n\t\t\t\t\tdoubleTapRef.current === \"toggle\" &&\n\t\t\t\t\ttransformRef.current.scale <= minScaleRef.current\n\t\t\t\t) {\n\t\t\t\t\tconst { x, y } = stageOrigin(e.clientX, e.clientY);\n\t\t\t\t\tsetTransform(\n\t\t\t\t\t\tzoomToward(\n\t\t\t\t\t\t\ttransformRef.current,\n\t\t\t\t\t\t\tMath.min(2, maxScaleRef.current),\n\t\t\t\t\t\t\tx,\n\t\t\t\t\t\t\ty,\n\t\t\t\t\t\t\tminScaleRef.current,\n\t\t\t\t\t\t\tmaxScaleRef.current,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\treset();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlastTapRef.current = { time: now, x: e.clientX, y: e.clientY };\n\t\t}\n\t}\n\n\treturn {\n\t\tstageRef,\n\t\ttransform,\n\t\tisDragging: isSwipeDragging,\n\t\tsnapBack,\n\t\thandlers: {\n\t\t\tonPointerDown,\n\t\t\tonPointerMove,\n\t\t\tonPointerUp,\n\t\t\tonPointerCancel: onPointerUp,\n\t\t},\n\t\treset,\n\t\tsetScale,\n\t\tclearSnapBack,\n\t};\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { AlertTriangle, Inbox, Loader2 } from \"lucide-react\";\n\nimport { cn } from \"../lib/utils\";\nimport {\n\tEmpty,\n\tEmptyContent,\n\tEmptyDescription,\n\tEmptyHeader,\n\tEmptyMedia,\n\tEmptyTitle,\n} from \"./ui/empty\";\n\nexport function LoadingState({\n\tlabel = \"Cargando…\",\n\tclassName,\n}: {\n\tlabel?: string;\n\tclassName?: string;\n}) {\n\treturn (\n\t\t<div\n\t\t\trole=\"status\"\n\t\t\taria-live=\"polite\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex items-center justify-center gap-2 py-12 text-sm text-muted-foreground\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<Loader2 className=\"size-4 animate-spin\" aria-hidden=\"true\" />\n\t\t\t<span>{label}</span>\n\t\t</div>\n\t);\n}\n\nexport function ErrorState({\n\ttitle = \"Algo salió mal\",\n\tdescription,\n\taction,\n\tclassName,\n}: {\n\ttitle?: string;\n\tdescription?: string;\n\taction?: React.ReactNode;\n\tclassName?: string;\n}) {\n\treturn (\n\t\t<div\n\t\t\trole=\"alert\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-col items-center gap-3 rounded-xl border border-dashed border-destructive/40 bg-destructive/5 py-12 text-center\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<AlertTriangle className=\"size-6 text-destructive\" aria-hidden=\"true\" />\n\t\t\t<div>\n\t\t\t\t<p className=\"font-medium\">{title}</p>\n\t\t\t\t{description ? (\n\t\t\t\t\t<p className=\"mt-1 text-sm text-muted-foreground\">{description}</p>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t\t{action}\n\t\t</div>\n\t);\n}\n\n/** Accept any icon component with a className prop — avoids LucideIcon\n * version skew between blocks peers and consuming apps. */\nexport type EmptyStateIcon = React.ComponentType<{\n\tclassName?: string;\n\t\"aria-hidden\"?: boolean | \"true\" | \"false\";\n}>;\n\nexport type EmptyStateProps = {\n\ttitle: string;\n\tdescription?: string;\n\taction?: React.ReactNode;\n\ticon?: EmptyStateIcon;\n\tvariant?: \"default\" | \"compact\";\n\tclassName?: string;\n};\n\nexport function EmptyState({\n\ttitle,\n\tdescription,\n\taction,\n\ticon: Icon = Inbox,\n\tvariant = \"default\",\n\tclassName,\n}: EmptyStateProps) {\n\tconst isCompact = variant === \"compact\";\n\n\treturn (\n\t\t<Empty\n\t\t\tclassName={cn(\n\t\t\t\t\"gap-3\",\n\t\t\t\tisCompact\n\t\t\t\t\t? \"flex-none rounded-none px-4 py-6\"\n\t\t\t\t\t: \"flex-none rounded-xl border border-dashed px-6 py-12\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<EmptyHeader className=\"gap-3\">\n\t\t\t\t<EmptyMedia\n\t\t\t\t\tvariant=\"icon\"\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"mb-0 bg-transparent text-muted-foreground\",\n\t\t\t\t\t\tisCompact\n\t\t\t\t\t\t\t? \"size-auto [&_svg:not([class*='size-'])]:size-8 [&_svg]:opacity-50\"\n\t\t\t\t\t\t\t: \"size-auto [&_svg:not([class*='size-'])]:size-6\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<Icon aria-hidden=\"true\" />\n\t\t\t\t</EmptyMedia>\n\t\t\t\t<EmptyTitle\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"font-medium tracking-normal\",\n\t\t\t\t\t\tisCompact ? \"text-sm\" : \"text-base\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{title}\n\t\t\t\t</EmptyTitle>\n\t\t\t\t{description ? (\n\t\t\t\t\t<EmptyDescription className=\"mt-0\">{description}</EmptyDescription>\n\t\t\t\t) : null}\n\t\t\t</EmptyHeader>\n\t\t\t{action ? <EmptyContent className=\"gap-0\">{action}</EmptyContent> : null}\n\t\t</Empty>\n\t);\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { Thumbnail } from \"react-pdf\";\n\nimport { cn } from \"../../lib/utils\";\n\ntype LazyThumbnailProps = {\n\tpageNumber: number;\n\tactive: boolean;\n\twidth: number;\n\tonClick: () => void;\n\tariaLabel: string;\n};\n\n/**\n * Renders a react-pdf Thumbnail only after the slot intersects the viewport,\n * so large documents do not mount hundreds of canvases up front.\n */\nexport function LazyThumbnail({\n\tpageNumber,\n\tactive,\n\twidth,\n\tonClick,\n\tariaLabel,\n}: LazyThumbnailProps) {\n\tconst ref = useRef<HTMLButtonElement>(null);\n\tconst [visible, setVisible] = useState(false);\n\n\tuseEffect(() => {\n\t\tconst node = ref.current;\n\t\tif (!node || typeof IntersectionObserver === \"undefined\") {\n\t\t\tsetVisible(true);\n\t\t\treturn;\n\t\t}\n\t\tconst observer = new IntersectionObserver(\n\t\t\t(entries) => {\n\t\t\t\tif (entries.some((e) => e.isIntersecting)) {\n\t\t\t\t\tsetVisible(true);\n\t\t\t\t\tobserver.disconnect();\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ rootMargin: \"120px 0px\" },\n\t\t);\n\t\tobserver.observe(node);\n\t\treturn () => observer.disconnect();\n\t}, []);\n\n\treturn (\n\t\t<button\n\t\t\tref={ref}\n\t\t\ttype=\"button\"\n\t\t\tonClick={onClick}\n\t\t\taria-label={ariaLabel}\n\t\t\taria-current={active ? \"page\" : undefined}\n\t\t\tclassName={cn(\n\t\t\t\t\"block w-full overflow-hidden rounded-md border bg-background p-1 transition-colors hover:border-primary\",\n\t\t\t\tactive ? \"border-primary ring-2 ring-primary/30\" : \"border-border\",\n\t\t\t)}\n\t\t>\n\t\t\t{visible ? (\n\t\t\t\t<Thumbnail pageNumber={pageNumber} width={width} className=\"mx-auto\" />\n\t\t\t) : (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"mx-auto bg-muted\"\n\t\t\t\t\tstyle={{ width, height: Math.round(width * 1.4) }}\n\t\t\t\t\taria-hidden\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<span className=\"mt-1 block text-center text-[10px] text-muted-foreground\">\n\t\t\t\t{pageNumber}\n\t\t\t</span>\n\t\t</button>\n\t);\n}\n","import { pdfjs } from \"react-pdf\";\n\nimport \"react-pdf/dist/Page/TextLayer.css\";\nimport \"react-pdf/dist/Page/AnnotationLayer.css\";\n\nlet configuredSrc: string | null = null;\n\n/**\n * Apply the consumer-resolved pdfjs worker URL once. Bundler-specific\n * `new URL(..., import.meta.url)` must run in the app, not inside this\n * pre-built package.\n */\nexport function configurePdfWorker(workerSrc: string) {\n\tif (!workerSrc || configuredSrc === workerSrc) return;\n\tpdfjs.GlobalWorkerOptions.workerSrc = workerSrc;\n\tconfiguredSrc = workerSrc;\n}\n","\"use client\";\n\nimport {\n\tuseCallback,\n\tuseEffect,\n\tuseRef,\n\tuseState,\n\ttype FormEvent,\n\ttype ReactNode,\n} from \"react\";\nimport { Document, Page } from \"react-pdf\";\nimport {\n\tChevronLeft,\n\tChevronRight,\n\tDownload,\n\tMaximize2,\n\tMinimize2,\n\tPanelLeft,\n\tPanelLeftClose,\n\tRotateCw,\n\tZoomIn,\n\tZoomOut,\n} from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\nimport {\n\tZOOM_PAN_MIN_SCALE,\n\tZOOM_PAN_SWIPE_SNAP_MS,\n\tprefersReducedMotion,\n\tuseZoomPanGestures,\n} from \"../../hooks/useZoomPanGestures\";\nimport { ErrorState, LoadingState } from \"../EmptyState\";\nimport { LazyThumbnail } from \"./LazyThumbnail\";\nimport { configurePdfWorker } from \"./worker\";\n\nconst ZOOM_STEPS = [0.5, 0.75, 1, 1.25, 1.5, 2, 2.5, 3];\nconst THUMB_WIDTH = 120;\n\nexport type PdfViewerLabels = {\n\tloading?: string;\n\tloadError?: string;\n\tloadErrorDescription?: string;\n\tpreviousPage?: string;\n\tnextPage?: string;\n\tzoomIn?: string;\n\tzoomOut?: string;\n\tfitWidth?: string;\n\tfitPage?: string;\n\trotate?: string;\n\tenterFullscreen?: string;\n\texitFullscreen?: string;\n\tdownload?: string;\n\tdownloadAria?: string;\n\tshowThumbnails?: string;\n\thideThumbnails?: string;\n\tpageJumpAria?: string;\n\tthumbnailAria?: (page: number) => string;\n\tpageOf?: (current: number, total: number) => string;\n};\n\nexport type PdfViewerProps = {\n\tfileUrl: string;\n\tfileName: string;\n\tdownloadUrl?: string;\n\t/** Consumer-resolved pdfjs worker URL — bundler-specific. */\n\tworkerSrc: string;\n\tinitialPage?: number;\n\tclassName?: string;\n\tlabels: PdfViewerLabels;\n\t/**\n\t * Optional leading toolbar control (e.g. close / back). Rendered before\n\t * thumbnails so host chrome does not float over PDF tools.\n\t */\n\tcloseAction?: ReactNode;\n};\n\n/**\n * Full-featured single-page PDF surface: collapsible lazy thumbnail rail,\n * page nav + jump, zoom/fit/rotate, pinch+swipe gestures, fullscreen and\n * download. Layout-agnostic — fills its parent.\n */\nexport function PdfViewer({\n\tfileUrl,\n\tfileName,\n\tdownloadUrl,\n\tworkerSrc,\n\tinitialPage = 1,\n\tclassName,\n\tlabels,\n\tcloseAction,\n}: PdfViewerProps) {\n\tconfigurePdfWorker(workerSrc);\n\n\tconst [numPages, setNumPages] = useState(0);\n\tconst [pageNumber, setPageNumber] = useState(initialPage);\n\tconst [zoomIndex, setZoomIndex] = useState(2);\n\tconst [fitMode, setFitMode] = useState<\"width\" | \"page\">(\"page\");\n\tconst [rotation, setRotation] = useState(0);\n\tconst [containerWidth, setContainerWidth] = useState(0);\n\tconst [containerHeight, setContainerHeight] = useState(0);\n\tconst [pageNatural, setPageNatural] = useState<{\n\t\twidth: number;\n\t\theight: number;\n\t} | null>(null);\n\tconst [isFullscreen, setIsFullscreen] = useState(false);\n\tconst [thumbsOpen, setThumbsOpen] = useState(false);\n\tconst [loadError, setLoadError] = useState(false);\n\tconst [pageDraft, setPageDraft] = useState(String(initialPage));\n\n\tconst viewportRef = useRef<HTMLDivElement>(null);\n\tconst shellRef = useRef<HTMLDivElement>(null);\n\tconst pageNumberRef = useRef(pageNumber);\n\tpageNumberRef.current = pageNumber;\n\tconst numPagesRef = useRef(numPages);\n\tnumPagesRef.current = numPages;\n\n\tconst baseScale = ZOOM_STEPS[zoomIndex] ?? 1;\n\n\tconst goToPage = useCallback((next: number) => {\n\t\tconst total = numPagesRef.current;\n\t\tif (total <= 0) return;\n\t\tconst clamped = Math.min(Math.max(1, next), total);\n\t\tsetPageNumber(clamped);\n\t\tsetPageDraft(String(clamped));\n\t}, []);\n\n\tconst onSwipeCommit = useCallback(\n\t\t(direction: \"prev\" | \"next\") => {\n\t\t\tif (direction === \"next\") {\n\t\t\t\tgoToPage(pageNumberRef.current + 1);\n\t\t\t} else {\n\t\t\t\tgoToPage(pageNumberRef.current - 1);\n\t\t\t}\n\t\t},\n\t\t[goToPage],\n\t);\n\n\tconst {\n\t\tstageRef,\n\t\ttransform,\n\t\tisDragging,\n\t\tsnapBack,\n\t\thandlers,\n\t\treset,\n\t\tclearSnapBack,\n\t} = useZoomPanGestures({\n\t\tswipeEnabled: numPages > 1,\n\t\tonSwipeCommit,\n\t\twheelZoom: true,\n\t\tdoubleTap: \"toggle\",\n\t});\n\n\tuseEffect(() => {\n\t\tsetPageNumber(initialPage);\n\t\tsetPageDraft(String(initialPage));\n\t\tsetZoomIndex(2);\n\t\tsetFitMode(\"page\");\n\t\tsetRotation(0);\n\t\tsetNumPages(0);\n\t\tsetPageNatural(null);\n\t\tsetLoadError(false);\n\t\tsetThumbsOpen(false);\n\t\treset();\n\t}, [fileUrl, initialPage, reset]);\n\n\tuseEffect(() => {\n\t\treset();\n\t\tsetPageNatural(null);\n\t}, [pageNumber, reset]);\n\n\tconst measureViewport = useCallback(() => {\n\t\tconst el = viewportRef.current;\n\t\tif (!el) return;\n\t\t// Ignore zero sizes so a pre-layout rAF/clientWidth=0 read cannot\n\t\t// overwrite a good ResizeObserver measurement (jsdom + dialog open).\n\t\tconst w = el.clientWidth;\n\t\tconst h = el.clientHeight;\n\t\tif (w > 0) setContainerWidth(w);\n\t\tif (h > 0) setContainerHeight(h);\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (!viewportRef.current) return;\n\t\tconst el = viewportRef.current;\n\t\tconst observer = new ResizeObserver((entries) => {\n\t\t\tconst rect = entries[0]?.contentRect;\n\t\t\tif (!rect) return;\n\t\t\tif (rect.width > 0) setContainerWidth(rect.width);\n\t\t\tif (rect.height > 0) setContainerHeight(rect.height);\n\t\t});\n\t\tobserver.observe(el);\n\t\tmeasureViewport();\n\t\t// Dialog shells animate (zoom-in-95); remeasure after layout settles.\n\t\tconst raf = requestAnimationFrame(() => {\n\t\t\tmeasureViewport();\n\t\t\trequestAnimationFrame(measureViewport);\n\t\t});\n\t\treturn () => {\n\t\t\tobserver.disconnect();\n\t\t\tcancelAnimationFrame(raf);\n\t\t};\n\t}, [measureViewport]);\n\n\tuseEffect(() => {\n\t\tmeasureViewport();\n\t}, [thumbsOpen, measureViewport]);\n\n\tuseEffect(() => {\n\t\tfunction onFullscreenChange() {\n\t\t\tsetIsFullscreen(document.fullscreenElement === shellRef.current);\n\t\t\t// Fullscreen toggles change available space; remeasure next frame.\n\t\t\trequestAnimationFrame(measureViewport);\n\t\t}\n\t\tdocument.addEventListener(\"fullscreenchange\", onFullscreenChange);\n\t\treturn () =>\n\t\t\tdocument.removeEventListener(\"fullscreenchange\", onFullscreenChange);\n\t}, [measureViewport]);\n\n\tuseEffect(() => {\n\t\tfunction onKeyDown(e: KeyboardEvent) {\n\t\t\tconst target = e.target as HTMLElement | null;\n\t\t\tif (\n\t\t\t\ttarget &&\n\t\t\t\t(target.tagName === \"INPUT\" ||\n\t\t\t\t\ttarget.tagName === \"TEXTAREA\" ||\n\t\t\t\t\ttarget.isContentEditable)\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tswitch (e.key) {\n\t\t\t\tcase \"ArrowLeft\":\n\t\t\t\tcase \"PageUp\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tgoToPage(pageNumberRef.current - 1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"ArrowRight\":\n\t\t\t\tcase \"PageDown\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tgoToPage(pageNumberRef.current + 1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"Home\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tgoToPage(1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"End\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tgoToPage(numPagesRef.current);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"+\":\n\t\t\t\tcase \"=\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetZoomIndex((i) => Math.min(i + 1, ZOOM_STEPS.length - 1));\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"-\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetZoomIndex((i) => Math.max(i - 1, 0));\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\twindow.addEventListener(\"keydown\", onKeyDown);\n\t\treturn () => window.removeEventListener(\"keydown\", onKeyDown);\n\t}, [goToPage]);\n\n\tconst fitWidth = useCallback(() => {\n\t\tsetFitMode(\"width\");\n\t\tsetZoomIndex(2);\n\t\treset();\n\t}, [reset]);\n\n\tconst fitPage = useCallback(() => {\n\t\tsetFitMode(\"page\");\n\t\tsetZoomIndex(2);\n\t\treset();\n\t}, [reset]);\n\n\tconst zoomIn = useCallback(() => {\n\t\tsetZoomIndex((i) => Math.min(i + 1, ZOOM_STEPS.length - 1));\n\t}, []);\n\n\tconst zoomOut = useCallback(() => {\n\t\tsetZoomIndex((i) => Math.max(i - 1, 0));\n\t}, []);\n\n\tconst toggleFullscreen = useCallback(async () => {\n\t\tif (!shellRef.current) return;\n\t\tif (document.fullscreenElement === shellRef.current) {\n\t\t\tawait document.exitFullscreen();\n\t\t} else {\n\t\t\tawait shellRef.current.requestFullscreen();\n\t\t}\n\t}, []);\n\n\tfunction submitPageJump(e: FormEvent) {\n\t\te.preventDefault();\n\t\tconst parsed = Number.parseInt(pageDraft, 10);\n\t\tif (Number.isFinite(parsed)) goToPage(parsed);\n\t\telse setPageDraft(String(pageNumber));\n\t}\n\n\tconst PAD = 32;\n\tconst availW = Math.max(containerWidth - PAD, 240);\n\tconst availH = Math.max(containerHeight - PAD, 240);\n\tconst rotated =\n\t\trotation % 180 !== 0 && pageNatural\n\t\t\t? { width: pageNatural.height, height: pageNatural.width }\n\t\t\t: pageNatural;\n\n\tlet pageWidth: number | undefined;\n\tif (fitMode === \"width\" || !rotated) {\n\t\tpageWidth = availW * baseScale;\n\t} else {\n\t\tconst scaleToFit = Math.min(\n\t\t\tavailW / rotated.width,\n\t\t\tavailH / rotated.height,\n\t\t);\n\t\tpageWidth = rotated.width * scaleToFit * baseScale;\n\t}\n\n\tconst rawDownload = downloadUrl ?? fileUrl;\n\tconst downloadHref = `${rawDownload}${rawDownload.includes(\"?\") ? \"&\" : \"?\"}download=1`;\n\n\tconst { scale: gestureScale, tx, ty } = transform;\n\tconst transition =\n\t\tsnapBack && !isDragging && !prefersReducedMotion()\n\t\t\t? `transform ${ZOOM_PAN_SWIPE_SNAP_MS}ms ease-out`\n\t\t\t: undefined;\n\n\tconst pageOf =\n\t\tlabels.pageOf?.(pageNumber, numPages) ??\n\t\t(numPages > 0 ? `${pageNumber} / ${numPages}` : \"—\");\n\n\tfunction renderThumbList(onSelect: (n: number) => void) {\n\t\treturn (\n\t\t\t<div className=\"space-y-2\">\n\t\t\t\t{Array.from({ length: numPages }, (_, i) => {\n\t\t\t\t\tconst n = i + 1;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<LazyThumbnail\n\t\t\t\t\t\t\tkey={n}\n\t\t\t\t\t\t\tpageNumber={n}\n\t\t\t\t\t\t\tactive={n === pageNumber}\n\t\t\t\t\t\t\twidth={THUMB_WIDTH}\n\t\t\t\t\t\t\tonClick={() => onSelect(n)}\n\t\t\t\t\t\t\tariaLabel={labels.thumbnailAria?.(n) ?? `Página ${n}`}\n\t\t\t\t\t\t/>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tref={shellRef}\n\t\t\tclassName={cn(\n\t\t\t\t\"relative flex h-full min-h-0 w-full flex-col bg-background\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{(closeAction || !loadError) && (\n\t\t\t\t<div className=\"flex shrink-0 items-center gap-1 overflow-x-auto border-b px-2 py-2\">\n\t\t\t\t\t{closeAction ? (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tdata-slot=\"pdf-close-action\"\n\t\t\t\t\t\t\tclassName=\"mr-1 flex shrink-0 items-center\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{closeAction}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{!loadError && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border bg-background text-foreground hover:bg-accent\"\n\t\t\t\t\t\t\t\tonClick={() => setThumbsOpen((v) => !v)}\n\t\t\t\t\t\t\t\taria-label={\n\t\t\t\t\t\t\t\t\tthumbsOpen\n\t\t\t\t\t\t\t\t\t\t? (labels.hideThumbnails ?? \"Ocultar miniaturas\")\n\t\t\t\t\t\t\t\t\t\t: (labels.showThumbnails ?? \"Mostrar miniaturas\")\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\taria-pressed={thumbsOpen}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{thumbsOpen ? (\n\t\t\t\t\t\t\t\t\t<PanelLeftClose className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<PanelLeft className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border bg-background hover:bg-accent disabled:opacity-50\"\n\t\t\t\t\t\t\t\tonClick={() => goToPage(pageNumber - 1)}\n\t\t\t\t\t\t\t\tdisabled={pageNumber <= 1}\n\t\t\t\t\t\t\t\taria-label={labels.previousPage ?? \"Página anterior\"}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ChevronLeft className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t<form\n\t\t\t\t\t\t\t\tonSubmit={submitPageJump}\n\t\t\t\t\t\t\t\tclassName=\"flex shrink-0 items-center gap-1 text-xs text-muted-foreground\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<label className=\"sr-only\" htmlFor=\"pdf-page-jump\">\n\t\t\t\t\t\t\t\t\t{labels.pageJumpAria ?? \"Ir a página\"}\n\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\tid=\"pdf-page-jump\"\n\t\t\t\t\t\t\t\t\tvalue={pageDraft}\n\t\t\t\t\t\t\t\t\tonChange={(e) => setPageDraft(e.target.value)}\n\t\t\t\t\t\t\t\t\tclassName=\"h-8 w-12 rounded-md border bg-background px-1 text-center text-foreground\"\n\t\t\t\t\t\t\t\t\tinputMode=\"numeric\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<span className=\"min-w-10 whitespace-nowrap\">{pageOf}</span>\n\t\t\t\t\t\t\t</form>\n\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border bg-background hover:bg-accent disabled:opacity-50\"\n\t\t\t\t\t\t\t\tonClick={() => goToPage(pageNumber + 1)}\n\t\t\t\t\t\t\t\tdisabled={pageNumber >= numPages}\n\t\t\t\t\t\t\t\taria-label={labels.nextPage ?? \"Página siguiente\"}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ChevronRight className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border bg-background hover:bg-accent disabled:opacity-50\"\n\t\t\t\t\t\t\t\tonClick={zoomOut}\n\t\t\t\t\t\t\t\tdisabled={zoomIndex <= 0}\n\t\t\t\t\t\t\t\taria-label={labels.zoomOut ?? \"Alejar\"}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ZoomOut className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName=\"inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-background px-2 text-xs hover:bg-accent\"\n\t\t\t\t\t\t\t\tonClick={fitMode === \"width\" ? fitPage : fitWidth}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{fitMode === \"width\"\n\t\t\t\t\t\t\t\t\t? (labels.fitPage ?? \"Ajustar página\")\n\t\t\t\t\t\t\t\t\t: (labels.fitWidth ?? \"Ajustar ancho\")}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border bg-background hover:bg-accent disabled:opacity-50\"\n\t\t\t\t\t\t\t\tonClick={zoomIn}\n\t\t\t\t\t\t\t\tdisabled={zoomIndex >= ZOOM_STEPS.length - 1}\n\t\t\t\t\t\t\t\taria-label={labels.zoomIn ?? \"Acercar\"}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ZoomIn className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border bg-background hover:bg-accent\"\n\t\t\t\t\t\t\t\tonClick={() => setRotation((r) => (r + 90) % 360)}\n\t\t\t\t\t\t\t\taria-label={labels.rotate ?? \"Rotar\"}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<RotateCw className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclassName=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border bg-background hover:bg-accent\"\n\t\t\t\t\t\t\t\tonClick={() => void toggleFullscreen()}\n\t\t\t\t\t\t\t\taria-label={\n\t\t\t\t\t\t\t\t\tisFullscreen\n\t\t\t\t\t\t\t\t\t\t? (labels.exitFullscreen ?? \"Salir de pantalla completa\")\n\t\t\t\t\t\t\t\t\t\t: (labels.enterFullscreen ?? \"Pantalla completa\")\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{isFullscreen ? (\n\t\t\t\t\t\t\t\t\t<Minimize2 className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<Maximize2 className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\thref={downloadHref}\n\t\t\t\t\t\t\t\tdownload={fileName}\n\t\t\t\t\t\t\t\taria-label={\n\t\t\t\t\t\t\t\t\tlabels.downloadAria ?? labels.download ?? \"Descargar\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tclassName=\"inline-flex h-8 shrink-0 items-center gap-1 rounded-md border bg-background px-2 text-xs hover:bg-accent\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Download className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t<span className=\"hidden sm:inline\">\n\t\t\t\t\t\t\t\t\t{labels.download ?? \"Descargar\"}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<div className=\"relative flex min-h-0 flex-1\">\n\t\t\t\t{numPages > 0 && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"hidden w-40 shrink-0 overflow-y-auto border-r bg-background p-2 lg:block\",\n\t\t\t\t\t\t\t!thumbsOpen && \"lg:hidden\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{renderThumbList(goToPage)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{thumbsOpen && numPages > 0 && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\taria-label={\n\t\t\t\t\t\t\t\tlabels.hideThumbnails\n\t\t\t\t\t\t\t\t\t? `${labels.hideThumbnails} (fondo)`\n\t\t\t\t\t\t\t\t\t: \"Cerrar miniaturas (fondo)\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tclassName=\"absolute inset-0 z-20 bg-black/40 lg:hidden\"\n\t\t\t\t\t\t\tonClick={() => setThumbsOpen(false)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<div className=\"absolute inset-y-0 left-0 z-30 w-40 overflow-y-auto border-r bg-background p-2 shadow-lg lg:hidden\">\n\t\t\t\t\t\t\t{renderThumbList((n) => {\n\t\t\t\t\t\t\t\tgoToPage(n);\n\t\t\t\t\t\t\t\tsetThumbsOpen(false);\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\n\t\t\t\t<div\n\t\t\t\t\tref={viewportRef}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"relative min-h-0 flex-1 overflow-hidden bg-muted/40\",\n\t\t\t\t\t\tgestureScale > ZOOM_PAN_MIN_SCALE &&\n\t\t\t\t\t\t\t(isDragging ? \"cursor-grabbing\" : \"cursor-grab\"),\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{loadError ? (\n\t\t\t\t\t\t<div className=\"absolute inset-0 flex items-center justify-center p-6 sm:p-8\">\n\t\t\t\t\t\t\t<ErrorState\n\t\t\t\t\t\t\t\tclassName=\"w-full max-w-md px-4\"\n\t\t\t\t\t\t\t\ttitle={labels.loadError ?? \"No se pudo cargar el PDF\"}\n\t\t\t\t\t\t\t\tdescription={\n\t\t\t\t\t\t\t\t\tlabels.loadErrorDescription ??\n\t\t\t\t\t\t\t\t\t\"El archivo puede estar dañado, cifrado o bloqueado.\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\taction={\n\t\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\t\thref={downloadHref}\n\t\t\t\t\t\t\t\t\t\tdownload={fileName}\n\t\t\t\t\t\t\t\t\t\tclassName=\"text-sm text-primary underline\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{labels.download ?? \"Descargar\"}\n\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tref={stageRef}\n\t\t\t\t\t\t\tclassName=\"flex min-h-full min-w-full touch-none p-4\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\ttransform: `translate(${tx}px, ${ty}px) scale(${gestureScale})`,\n\t\t\t\t\t\t\t\ttransition,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonPointerDown={handlers.onPointerDown}\n\t\t\t\t\t\t\tonPointerMove={handlers.onPointerMove}\n\t\t\t\t\t\t\tonPointerUp={handlers.onPointerUp}\n\t\t\t\t\t\t\tonPointerCancel={handlers.onPointerCancel}\n\t\t\t\t\t\t\tonTransitionEnd={clearSnapBack}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{/* m-auto centers without the flex-overflow clipping that items-center causes when zoomed. */}\n\t\t\t\t\t\t\t<div className=\"m-auto\">\n\t\t\t\t\t\t\t\t<Document\n\t\t\t\t\t\t\t\t\tfile={fileUrl}\n\t\t\t\t\t\t\t\t\tonLoadSuccess={({ numPages: pages }) => {\n\t\t\t\t\t\t\t\t\t\tsetNumPages(pages);\n\t\t\t\t\t\t\t\t\t\tsetLoadError(false);\n\t\t\t\t\t\t\t\t\t\tconst start = Math.min(Math.max(1, initialPage), pages);\n\t\t\t\t\t\t\t\t\t\tsetPageNumber(start);\n\t\t\t\t\t\t\t\t\t\tsetPageDraft(String(start));\n\t\t\t\t\t\t\t\t\t\t// Certificates are typically one landscape page — fit-page is the useful default.\n\t\t\t\t\t\t\t\t\t\t// Multi-page docs default to fit-width for continuous reading.\n\t\t\t\t\t\t\t\t\t\tsetFitMode(pages === 1 ? \"page\" : \"width\");\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tonLoadError={() => setLoadError(true)}\n\t\t\t\t\t\t\t\t\tloading={\n\t\t\t\t\t\t\t\t\t\t<LoadingState label={labels.loading ?? \"Cargando PDF…\"} />\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\terror={\n\t\t\t\t\t\t\t\t\t\t<div className=\"absolute inset-0 flex items-center justify-center p-6 sm:p-8\">\n\t\t\t\t\t\t\t\t\t\t\t<ErrorState\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"w-full max-w-md px-4\"\n\t\t\t\t\t\t\t\t\t\t\t\ttitle={labels.loadError ?? \"No se pudo cargar el PDF\"}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{numPages > 0 && (\n\t\t\t\t\t\t\t\t\t\t<Page\n\t\t\t\t\t\t\t\t\t\t\tpageNumber={pageNumber}\n\t\t\t\t\t\t\t\t\t\t\twidth={pageWidth}\n\t\t\t\t\t\t\t\t\t\t\trotate={rotation}\n\t\t\t\t\t\t\t\t\t\t\trenderTextLayer\n\t\t\t\t\t\t\t\t\t\t\trenderAnnotationLayer\n\t\t\t\t\t\t\t\t\t\t\tonLoadSuccess={(page) => {\n\t\t\t\t\t\t\t\t\t\t\t\tsetPageNatural({\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth: page.originalWidth,\n\t\t\t\t\t\t\t\t\t\t\t\t\theight: page.originalHeight,\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</Document>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { XIcon } from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\n\nfunction Dialog({\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n\treturn <DialogPrimitive.Root data-slot=\"dialog\" {...props} />;\n}\n\nfunction DialogTrigger({\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n\treturn <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />;\n}\n\nfunction DialogPortal({\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n\treturn <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />;\n}\n\nfunction DialogClose({\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n\treturn <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />;\n}\n\nfunction DialogOverlay({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n\treturn (\n\t\t<DialogPrimitive.Overlay\n\t\t\tdata-slot=\"dialog-overlay\"\n\t\t\tclassName={cn(\n\t\t\t\t\"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DialogContent({\n\tclassName,\n\tchildren,\n\tshowCloseButton = true,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n\tshowCloseButton?: boolean;\n}) {\n\treturn (\n\t\t<DialogPortal data-slot=\"dialog-portal\">\n\t\t\t<DialogOverlay />\n\t\t\t<DialogPrimitive.Content\n\t\t\t\tdata-slot=\"dialog-content\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 outline-none sm:max-w-lg\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t\t{showCloseButton && (\n\t\t\t\t\t<DialogPrimitive.Close\n\t\t\t\t\t\tdata-slot=\"dialog-close\"\n\t\t\t\t\t\tclassName=\"ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<XIcon />\n\t\t\t\t\t\t<span className=\"sr-only\">Close</span>\n\t\t\t\t\t</DialogPrimitive.Close>\n\t\t\t\t)}\n\t\t\t</DialogPrimitive.Content>\n\t\t</DialogPortal>\n\t);\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"dialog-header\"\n\t\t\tclassName={cn(\"flex flex-col gap-2 text-center sm:text-left\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"dialog-footer\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DialogTitle({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n\treturn (\n\t\t<DialogPrimitive.Title\n\t\t\tdata-slot=\"dialog-title\"\n\t\t\tclassName={cn(\"text-lg leading-none font-semibold\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DialogDescription({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n\treturn (\n\t\t<DialogPrimitive.Description\n\t\t\tdata-slot=\"dialog-description\"\n\t\t\tclassName={cn(\"text-muted-foreground text-sm\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport {\n\tDialog,\n\tDialogClose,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogOverlay,\n\tDialogPortal,\n\tDialogTitle,\n\tDialogTrigger,\n};\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { X } from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogTitle,\n} from \"../ui/dialog\";\n\nexport type MediaViewerDialogLabels = {\n\tclose?: string;\n\ttitle?: string;\n\tdescription?: string;\n};\n\nexport type MediaViewerDialogProps = {\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n\tchildren: ReactNode;\n\tlabels?: MediaViewerDialogLabels;\n\tclassName?: string;\n\t/** Extra classes for the dialog content shell. */\n\tcontentClassName?: string;\n\tshowCloseButton?: boolean;\n};\n\n/**\n * Edge-to-edge fullscreen dialog shell for media viewers (post detail, PDF,\n * etc.). Uses the shared Radix dialog for focus trap, Esc and `aria-modal`.\n * Pass `contentClassName` to opt into a contained desktop card when needed.\n */\nexport function MediaViewerDialog({\n\topen,\n\tonOpenChange,\n\tchildren,\n\tlabels,\n\tclassName,\n\tcontentClassName,\n\tshowCloseButton = true,\n}: MediaViewerDialogProps) {\n\tconst closeLabel = labels?.close ?? \"Cerrar\";\n\tconst title = labels?.title ?? \"Visor\";\n\tconst description = labels?.description ?? title;\n\n\treturn (\n\t\t<Dialog open={open} onOpenChange={onOpenChange}>\n\t\t\t<DialogContent\n\t\t\t\tshowCloseButton={false}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t// flex-col is required: without it the single child is a row item\n\t\t\t\t\t// sized to max-content (toolbar width) and the viewport collapses.\n\t\t\t\t\t\"inset-0 flex flex-col h-dvh max-h-dvh w-screen max-w-none translate-x-0 translate-y-0 top-0 left-0 gap-0 overflow-hidden rounded-none border-0 p-0 shadow-none sm:max-w-none\",\n\t\t\t\t\tcontentClassName,\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<DialogTitle className=\"sr-only\">{title}</DialogTitle>\n\t\t\t\t<DialogDescription className=\"sr-only\">{description}</DialogDescription>\n\t\t\t\t{showCloseButton && (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={() => onOpenChange(false)}\n\t\t\t\t\t\taria-label={closeLabel}\n\t\t\t\t\t\tclassName=\"absolute top-3 right-3 z-20 rounded-full bg-black/50 p-2 text-white transition-colors hover:bg-black/70\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<X className=\"h-5 w-5\" />\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\t\t\t\t{children}\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t);\n}\n","\"use client\";\n\nimport { X } from \"lucide-react\";\n\nimport { MediaViewerDialog } from \"../media/MediaViewerDialog\";\nimport {\n\tPdfViewer,\n\ttype PdfViewerLabels,\n\ttype PdfViewerProps,\n} from \"./PdfViewer\";\n\nexport type PdfViewerDialogProps = {\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n\ttitle: string;\n\tfileUrl: string;\n\tfileName?: string;\n\tdownloadUrl?: string;\n\tworkerSrc: string;\n\tinitialPage?: number;\n\tlabels: PdfViewerLabels & {\n\t\tclose?: string;\n\t\tdialogDescription?: string;\n\t};\n};\n\n/**\n * Drop-in dialog wrapper around {@link PdfViewer} using\n * {@link MediaViewerDialog} for the fullscreen shell. Title and close live\n * in the PDF toolbar (via `closeAction`) so chrome stays a single row.\n */\nexport function PdfViewerDialog({\n\topen,\n\tonOpenChange,\n\ttitle,\n\tfileUrl,\n\tfileName,\n\tdownloadUrl,\n\tworkerSrc,\n\tinitialPage,\n\tlabels,\n}: PdfViewerDialogProps) {\n\tconst viewerLabels: PdfViewerProps[\"labels\"] = labels;\n\tconst closeLabel = labels.close ?? \"Cerrar\";\n\n\treturn (\n\t\t<MediaViewerDialog\n\t\t\topen={open}\n\t\t\tonOpenChange={onOpenChange}\n\t\t\tshowCloseButton={false}\n\t\t\tlabels={{\n\t\t\t\tclose: closeLabel,\n\t\t\t\ttitle,\n\t\t\t\tdescription: labels.dialogDescription ?? title,\n\t\t\t}}\n\t\t>\n\t\t\t<PdfViewer\n\t\t\t\tfileUrl={fileUrl}\n\t\t\t\tfileName={fileName ?? title}\n\t\t\t\tdownloadUrl={downloadUrl}\n\t\t\t\tworkerSrc={workerSrc}\n\t\t\t\tinitialPage={initialPage}\n\t\t\t\tlabels={viewerLabels}\n\t\t\t\tclassName=\"min-h-0 w-full min-w-0 flex-1\"\n\t\t\t\tcloseAction={\n\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => onOpenChange(false)}\n\t\t\t\t\t\t\taria-label={closeLabel}\n\t\t\t\t\t\t\tclassName=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border bg-background text-foreground hover:bg-accent\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<X className=\"h-4 w-4\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<span className=\"max-w-[min(40vw,16rem)] truncate text-sm font-medium text-foreground\">\n\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t/>\n\t\t</MediaViewerDialog>\n\t);\n}\n"]}
|