@sesionario/blocks 1.24.0 → 1.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/pdf.cjs CHANGED
@@ -801,9 +801,10 @@ function PdfViewer({
801
801
  "relative min-h-0 flex-1 overflow-hidden bg-muted/40",
802
802
  gestureScale > ZOOM_PAN_MIN_SCALE && (isDragging ? "cursor-grabbing" : "cursor-grab")
803
803
  ),
804
- children: loadError ? /* @__PURE__ */ jsxRuntime.jsx(
804
+ children: loadError ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 flex items-center justify-center p-6 sm:p-8", children: /* @__PURE__ */ jsxRuntime.jsx(
805
805
  ErrorState,
806
806
  {
807
+ className: "w-full max-w-md px-4",
807
808
  title: labels.loadError ?? "No se pudo cargar el PDF",
808
809
  description: labels.loadErrorDescription ?? "El archivo puede estar da\xF1ado, cifrado o bloqueado.",
809
810
  action: /* @__PURE__ */ jsxRuntime.jsx(
@@ -816,7 +817,7 @@ function PdfViewer({
816
817
  }
817
818
  )
818
819
  }
819
- ) : /* @__PURE__ */ jsxRuntime.jsx(
820
+ ) }) : /* @__PURE__ */ jsxRuntime.jsx(
820
821
  "div",
821
822
  {
822
823
  ref: stageRef,
@@ -843,12 +844,13 @@ function PdfViewer({
843
844
  },
844
845
  onLoadError: () => setLoadError(true),
845
846
  loading: /* @__PURE__ */ jsxRuntime.jsx(LoadingState, { label: labels.loading ?? "Cargando PDF\u2026" }),
846
- error: /* @__PURE__ */ jsxRuntime.jsx(
847
+ error: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 flex items-center justify-center p-6 sm:p-8", children: /* @__PURE__ */ jsxRuntime.jsx(
847
848
  ErrorState,
848
849
  {
850
+ className: "w-full max-w-md px-4",
849
851
  title: labels.loadError ?? "No se pudo cargar el PDF"
850
852
  }
851
- ),
853
+ ) }),
852
854
  children: numPages > 0 && /* @__PURE__ */ jsxRuntime.jsx(
853
855
  reactPdf.Page,
854
856
  {
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","PanelLeftClose","PanelLeft","ChevronLeft","ChevronRight","ZoomOut","ZoomIn","RotateCw","Minimize2","Maximize2","Download","Fragment","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;ACkBA,IAAM,UAAA,GAAa,CAAC,GAAA,EAAK,IAAA,EAAM,GAAG,IAAA,EAAM,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAC,CAAA;AACtD,IAAM,WAAA,GAAc,GAAA;AAwCb,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;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,MAEA,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qEAAA,EACd,QAAA,EAAA;AAAA,0BAAAC,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACA,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,0HAAA;AAAA,cACV,SAAS,MAAM,aAAA,CAAc,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,cACtC,cACC,UAAA,GACI,MAAA,CAAO,cAAA,IAAkB,oBAAA,GACzB,OAAO,cAAA,IAAkB,oBAAA;AAAA,cAE9B,cAAA,EAAc,UAAA;AAAA,cAEb,QAAA,EAAA,UAAA,mBACAA,cAAAA,CAACK,0BAAA,EAAA,EAAe,SAAA,EAAU,SAAA,EAAU,CAAA,mBAEpCL,cAAAA,CAACM,qBAAA,EAAA,EAAU,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,WAEjC;AAAA,0BAEAN,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACA,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,8HAAA;AAAA,cACV,OAAA,EAAS,MAAM,QAAA,CAAS,UAAA,GAAa,CAAC,CAAA;AAAA,cACtC,UAAU,UAAA,IAAc,CAAA;AAAA,cACxB,YAAA,EAAY,OAAO,YAAA,IAAgB,oBAAA;AAAA,cAEnC,QAAA,kBAAAA,cAAAA,CAACO,uBAAA,EAAA,EAAY,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,WAClC;AAAA,0BAEAR,eAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACA,QAAA,EAAU,cAAA;AAAA,cACV,SAAA,EAAU,gEAAA;AAAA,cAEV,QAAA,EAAA;AAAA,gCAAAC,cAAAA,CAAC,WAAM,SAAA,EAAU,SAAA,EAAU,SAAQ,eAAA,EACjC,QAAA,EAAA,MAAA,CAAO,gBAAgB,gBAAA,EACzB,CAAA;AAAA,gCACAA,cAAAA;AAAA,kBAAC,OAAA;AAAA,kBAAA;AAAA,oBACA,EAAA,EAAG,eAAA;AAAA,oBACH,KAAA,EAAO,SAAA;AAAA,oBACP,UAAU,CAAC,CAAA,KAAM,YAAA,CAAa,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,oBAC5C,SAAA,EAAU,2EAAA;AAAA,oBACV,SAAA,EAAU;AAAA;AAAA,iBACX;AAAA,gCACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAA8B,QAAA,EAAA,MAAA,EAAO;AAAA;AAAA;AAAA,WACtD;AAAA,0BAEAA,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACA,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,8HAAA;AAAA,cACV,OAAA,EAAS,MAAM,QAAA,CAAS,UAAA,GAAa,CAAC,CAAA;AAAA,cACtC,UAAU,UAAA,IAAc,QAAA;AAAA,cACxB,YAAA,EAAY,OAAO,QAAA,IAAY,qBAAA;AAAA,cAE/B,QAAA,kBAAAA,cAAAA,CAACQ,wBAAA,EAAA,EAAa,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,WACnC;AAAA,0BAEAR,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACA,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,8HAAA;AAAA,cACV,OAAA,EAAS,OAAA;AAAA,cACT,UAAU,SAAA,IAAa,CAAA;AAAA,cACvB,YAAA,EAAY,OAAO,OAAA,IAAW,QAAA;AAAA,cAE9B,QAAA,kBAAAA,cAAAA,CAACS,mBAAA,EAAA,EAAQ,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,WAC9B;AAAA,0BACAT,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACA,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,mHAAA;AAAA,cACV,OAAA,EAAS,OAAA,KAAY,OAAA,GAAU,OAAA,GAAU,QAAA;AAAA,cAExC,sBAAY,OAAA,GACT,MAAA,CAAO,OAAA,IAAW,mBAAA,GAClB,OAAO,QAAA,IAAY;AAAA;AAAA,WACxB;AAAA,0BACAA,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACA,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,8HAAA;AAAA,cACV,OAAA,EAAS,MAAA;AAAA,cACT,QAAA,EAAU,SAAA,IAAa,UAAA,CAAW,MAAA,GAAS,CAAA;AAAA,cAC3C,YAAA,EAAY,OAAO,MAAA,IAAU,SAAA;AAAA,cAE7B,QAAA,kBAAAA,cAAAA,CAACU,kBAAA,EAAA,EAAO,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,WAC7B;AAAA,0BAEAV,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACA,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,0GAAA;AAAA,cACV,SAAS,MAAM,WAAA,CAAY,CAAC,CAAA,KAAA,CAAO,CAAA,GAAI,MAAM,GAAG,CAAA;AAAA,cAChD,YAAA,EAAY,OAAO,MAAA,IAAU,OAAA;AAAA,cAE7B,QAAA,kBAAAA,cAAAA,CAACW,oBAAA,EAAA,EAAS,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,WAC/B;AAAA,0BAEAX,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACA,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,0GAAA;AAAA,cACV,OAAA,EAAS,MAAM,KAAK,gBAAA,EAAiB;AAAA,cACrC,cACC,YAAA,GACI,MAAA,CAAO,cAAA,IAAkB,4BAAA,GACzB,OAAO,eAAA,IAAmB,mBAAA;AAAA,cAG9B,QAAA,EAAA,YAAA,mBACAA,cAAAA,CAACY,qBAAA,EAAA,EAAU,SAAA,EAAU,SAAA,EAAU,CAAA,mBAE/BZ,cAAAA,CAACa,qBAAA,EAAA,EAAU,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,WAEjC;AAAA,0BAEAd,eAAAA;AAAA,YAAC,GAAA;AAAA,YAAA;AAAA,cACA,IAAA,EAAM,YAAA;AAAA,cACN,QAAA,EAAU,QAAA;AAAA,cACV,YAAA,EAAY,MAAA,CAAO,YAAA,IAAgB,MAAA,CAAO,QAAA,IAAY,WAAA;AAAA,cACtD,SAAA,EAAU,0GAAA;AAAA,cAEV,QAAA,EAAA;AAAA,gCAAAC,cAAAA,CAACc,oBAAA,EAAA,EAAS,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,gCAC9Bd,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,kBAAA,EACd,QAAA,EAAA,MAAA,CAAO,YAAY,WAAA,EACrB;AAAA;AAAA;AAAA;AACD,SAAA,EACD,CAAA;AAAA,wBAEAD,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,gBAAAgB,mBAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAf,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;AAAA,gBAAC,UAAA;AAAA,gBAAA;AAAA,kBACA,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,kCAIFA,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;AAAA,wBAAC,UAAA;AAAA,wBAAA;AAAA,0BACA,KAAA,EAAO,OAAO,SAAA,IAAa;AAAA;AAAA,uBAC5B;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;ACzhBA,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, type LucideIcon } 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\nexport type EmptyStateProps = {\n\ttitle: string;\n\tdescription?: string;\n\taction?: React.ReactNode;\n\ticon?: LucideIcon;\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} 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};\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}: 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<div className=\"flex shrink-0 items-center gap-1 overflow-x-auto border-b px-2 py-2\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\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\tonClick={() => setThumbsOpen((v) => !v)}\n\t\t\t\t\taria-label={\n\t\t\t\t\t\tthumbsOpen\n\t\t\t\t\t\t\t? (labels.hideThumbnails ?? \"Ocultar miniaturas\")\n\t\t\t\t\t\t\t: (labels.showThumbnails ?? \"Mostrar miniaturas\")\n\t\t\t\t\t}\n\t\t\t\t\taria-pressed={thumbsOpen}\n\t\t\t\t>\n\t\t\t\t\t{thumbsOpen ? (\n\t\t\t\t\t\t<PanelLeftClose className=\"h-4 w-4\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<PanelLeft className=\"h-4 w-4\" />\n\t\t\t\t\t)}\n\t\t\t\t</button>\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\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\tonClick={() => goToPage(pageNumber - 1)}\n\t\t\t\t\tdisabled={pageNumber <= 1}\n\t\t\t\t\taria-label={labels.previousPage ?? \"Página anterior\"}\n\t\t\t\t>\n\t\t\t\t\t<ChevronLeft className=\"h-4 w-4\" />\n\t\t\t\t</button>\n\n\t\t\t\t<form\n\t\t\t\t\tonSubmit={submitPageJump}\n\t\t\t\t\tclassName=\"flex shrink-0 items-center gap-1 text-xs text-muted-foreground\"\n\t\t\t\t>\n\t\t\t\t\t<label className=\"sr-only\" htmlFor=\"pdf-page-jump\">\n\t\t\t\t\t\t{labels.pageJumpAria ?? \"Ir a página\"}\n\t\t\t\t\t</label>\n\t\t\t\t\t<input\n\t\t\t\t\t\tid=\"pdf-page-jump\"\n\t\t\t\t\t\tvalue={pageDraft}\n\t\t\t\t\t\tonChange={(e) => setPageDraft(e.target.value)}\n\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\tinputMode=\"numeric\"\n\t\t\t\t\t/>\n\t\t\t\t\t<span className=\"min-w-10 whitespace-nowrap\">{pageOf}</span>\n\t\t\t\t</form>\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\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\tonClick={() => goToPage(pageNumber + 1)}\n\t\t\t\t\tdisabled={pageNumber >= numPages}\n\t\t\t\t\taria-label={labels.nextPage ?? \"Página siguiente\"}\n\t\t\t\t>\n\t\t\t\t\t<ChevronRight className=\"h-4 w-4\" />\n\t\t\t\t</button>\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\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\tonClick={zoomOut}\n\t\t\t\t\tdisabled={zoomIndex <= 0}\n\t\t\t\t\taria-label={labels.zoomOut ?? \"Alejar\"}\n\t\t\t\t>\n\t\t\t\t\t<ZoomOut className=\"h-4 w-4\" />\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\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\tonClick={fitMode === \"width\" ? fitPage : fitWidth}\n\t\t\t\t>\n\t\t\t\t\t{fitMode === \"width\"\n\t\t\t\t\t\t? (labels.fitPage ?? \"Ajustar página\")\n\t\t\t\t\t\t: (labels.fitWidth ?? \"Ajustar ancho\")}\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\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\tonClick={zoomIn}\n\t\t\t\t\tdisabled={zoomIndex >= ZOOM_STEPS.length - 1}\n\t\t\t\t\taria-label={labels.zoomIn ?? \"Acercar\"}\n\t\t\t\t>\n\t\t\t\t\t<ZoomIn className=\"h-4 w-4\" />\n\t\t\t\t</button>\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\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\tonClick={() => setRotation((r) => (r + 90) % 360)}\n\t\t\t\t\taria-label={labels.rotate ?? \"Rotar\"}\n\t\t\t\t>\n\t\t\t\t\t<RotateCw className=\"h-4 w-4\" />\n\t\t\t\t</button>\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\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\tonClick={() => void toggleFullscreen()}\n\t\t\t\t\taria-label={\n\t\t\t\t\t\tisFullscreen\n\t\t\t\t\t\t\t? (labels.exitFullscreen ?? \"Salir de pantalla completa\")\n\t\t\t\t\t\t\t: (labels.enterFullscreen ?? \"Pantalla completa\")\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{isFullscreen ? (\n\t\t\t\t\t\t<Minimize2 className=\"h-4 w-4\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Maximize2 className=\"h-4 w-4\" />\n\t\t\t\t\t)}\n\t\t\t\t</button>\n\n\t\t\t\t<a\n\t\t\t\t\thref={downloadHref}\n\t\t\t\t\tdownload={fileName}\n\t\t\t\t\taria-label={labels.downloadAria ?? labels.download ?? \"Descargar\"}\n\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>\n\t\t\t\t\t<Download className=\"h-4 w-4\" />\n\t\t\t\t\t<span className=\"hidden sm:inline\">\n\t\t\t\t\t\t{labels.download ?? \"Descargar\"}\n\t\t\t\t\t</span>\n\t\t\t\t</a>\n\t\t\t</div>\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<ErrorState\n\t\t\t\t\t\t\ttitle={labels.loadError ?? \"No se pudo cargar el PDF\"}\n\t\t\t\t\t\t\tdescription={\n\t\t\t\t\t\t\t\tlabels.loadErrorDescription ??\n\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}\n\t\t\t\t\t\t\taction={\n\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\thref={downloadHref}\n\t\t\t\t\t\t\t\t\tdownload={fileName}\n\t\t\t\t\t\t\t\t\tclassName=\"text-sm text-primary underline\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{labels.download ?? \"Descargar\"}\n\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t/>\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<ErrorState\n\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/>\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","PanelLeftClose","PanelLeft","ChevronLeft","ChevronRight","ZoomOut","ZoomIn","RotateCw","Minimize2","Maximize2","Download","Fragment","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, type LucideIcon } 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\nexport type EmptyStateProps = {\n\ttitle: string;\n\tdescription?: string;\n\taction?: React.ReactNode;\n\ticon?: LucideIcon;\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} 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};\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}: 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<div className=\"flex shrink-0 items-center gap-1 overflow-x-auto border-b px-2 py-2\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\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\tonClick={() => setThumbsOpen((v) => !v)}\n\t\t\t\t\taria-label={\n\t\t\t\t\t\tthumbsOpen\n\t\t\t\t\t\t\t? (labels.hideThumbnails ?? \"Ocultar miniaturas\")\n\t\t\t\t\t\t\t: (labels.showThumbnails ?? \"Mostrar miniaturas\")\n\t\t\t\t\t}\n\t\t\t\t\taria-pressed={thumbsOpen}\n\t\t\t\t>\n\t\t\t\t\t{thumbsOpen ? (\n\t\t\t\t\t\t<PanelLeftClose className=\"h-4 w-4\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<PanelLeft className=\"h-4 w-4\" />\n\t\t\t\t\t)}\n\t\t\t\t</button>\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\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\tonClick={() => goToPage(pageNumber - 1)}\n\t\t\t\t\tdisabled={pageNumber <= 1}\n\t\t\t\t\taria-label={labels.previousPage ?? \"Página anterior\"}\n\t\t\t\t>\n\t\t\t\t\t<ChevronLeft className=\"h-4 w-4\" />\n\t\t\t\t</button>\n\n\t\t\t\t<form\n\t\t\t\t\tonSubmit={submitPageJump}\n\t\t\t\t\tclassName=\"flex shrink-0 items-center gap-1 text-xs text-muted-foreground\"\n\t\t\t\t>\n\t\t\t\t\t<label className=\"sr-only\" htmlFor=\"pdf-page-jump\">\n\t\t\t\t\t\t{labels.pageJumpAria ?? \"Ir a página\"}\n\t\t\t\t\t</label>\n\t\t\t\t\t<input\n\t\t\t\t\t\tid=\"pdf-page-jump\"\n\t\t\t\t\t\tvalue={pageDraft}\n\t\t\t\t\t\tonChange={(e) => setPageDraft(e.target.value)}\n\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\tinputMode=\"numeric\"\n\t\t\t\t\t/>\n\t\t\t\t\t<span className=\"min-w-10 whitespace-nowrap\">{pageOf}</span>\n\t\t\t\t</form>\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\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\tonClick={() => goToPage(pageNumber + 1)}\n\t\t\t\t\tdisabled={pageNumber >= numPages}\n\t\t\t\t\taria-label={labels.nextPage ?? \"Página siguiente\"}\n\t\t\t\t>\n\t\t\t\t\t<ChevronRight className=\"h-4 w-4\" />\n\t\t\t\t</button>\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\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\tonClick={zoomOut}\n\t\t\t\t\tdisabled={zoomIndex <= 0}\n\t\t\t\t\taria-label={labels.zoomOut ?? \"Alejar\"}\n\t\t\t\t>\n\t\t\t\t\t<ZoomOut className=\"h-4 w-4\" />\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\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\tonClick={fitMode === \"width\" ? fitPage : fitWidth}\n\t\t\t\t>\n\t\t\t\t\t{fitMode === \"width\"\n\t\t\t\t\t\t? (labels.fitPage ?? \"Ajustar página\")\n\t\t\t\t\t\t: (labels.fitWidth ?? \"Ajustar ancho\")}\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\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\tonClick={zoomIn}\n\t\t\t\t\tdisabled={zoomIndex >= ZOOM_STEPS.length - 1}\n\t\t\t\t\taria-label={labels.zoomIn ?? \"Acercar\"}\n\t\t\t\t>\n\t\t\t\t\t<ZoomIn className=\"h-4 w-4\" />\n\t\t\t\t</button>\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\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\tonClick={() => setRotation((r) => (r + 90) % 360)}\n\t\t\t\t\taria-label={labels.rotate ?? \"Rotar\"}\n\t\t\t\t>\n\t\t\t\t\t<RotateCw className=\"h-4 w-4\" />\n\t\t\t\t</button>\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\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\tonClick={() => void toggleFullscreen()}\n\t\t\t\t\taria-label={\n\t\t\t\t\t\tisFullscreen\n\t\t\t\t\t\t\t? (labels.exitFullscreen ?? \"Salir de pantalla completa\")\n\t\t\t\t\t\t\t: (labels.enterFullscreen ?? \"Pantalla completa\")\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{isFullscreen ? (\n\t\t\t\t\t\t<Minimize2 className=\"h-4 w-4\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Maximize2 className=\"h-4 w-4\" />\n\t\t\t\t\t)}\n\t\t\t\t</button>\n\n\t\t\t\t<a\n\t\t\t\t\thref={downloadHref}\n\t\t\t\t\tdownload={fileName}\n\t\t\t\t\taria-label={labels.downloadAria ?? labels.download ?? \"Descargar\"}\n\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>\n\t\t\t\t\t<Download className=\"h-4 w-4\" />\n\t\t\t\t\t<span className=\"hidden sm:inline\">\n\t\t\t\t\t\t{labels.download ?? \"Descargar\"}\n\t\t\t\t\t</span>\n\t\t\t\t</a>\n\t\t\t</div>\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"]}
package/dist/pdf.js CHANGED
@@ -779,9 +779,10 @@ function PdfViewer({
779
779
  "relative min-h-0 flex-1 overflow-hidden bg-muted/40",
780
780
  gestureScale > ZOOM_PAN_MIN_SCALE && (isDragging ? "cursor-grabbing" : "cursor-grab")
781
781
  ),
782
- children: loadError ? /* @__PURE__ */ jsx(
782
+ children: loadError ? /* @__PURE__ */ jsx("div", { className: "absolute inset-0 flex items-center justify-center p-6 sm:p-8", children: /* @__PURE__ */ jsx(
783
783
  ErrorState,
784
784
  {
785
+ className: "w-full max-w-md px-4",
785
786
  title: labels.loadError ?? "No se pudo cargar el PDF",
786
787
  description: labels.loadErrorDescription ?? "El archivo puede estar da\xF1ado, cifrado o bloqueado.",
787
788
  action: /* @__PURE__ */ jsx(
@@ -794,7 +795,7 @@ function PdfViewer({
794
795
  }
795
796
  )
796
797
  }
797
- ) : /* @__PURE__ */ jsx(
798
+ ) }) : /* @__PURE__ */ jsx(
798
799
  "div",
799
800
  {
800
801
  ref: stageRef,
@@ -821,12 +822,13 @@ function PdfViewer({
821
822
  },
822
823
  onLoadError: () => setLoadError(true),
823
824
  loading: /* @__PURE__ */ jsx(LoadingState, { label: labels.loading ?? "Cargando PDF\u2026" }),
824
- error: /* @__PURE__ */ jsx(
825
+ error: /* @__PURE__ */ jsx("div", { className: "absolute inset-0 flex items-center justify-center p-6 sm:p-8", children: /* @__PURE__ */ jsx(
825
826
  ErrorState,
826
827
  {
828
+ className: "w-full max-w-md px-4",
827
829
  title: labels.loadError ?? "No se pudo cargar el PDF"
828
830
  }
829
- ),
831
+ ) }),
830
832
  children: numPages > 0 && /* @__PURE__ */ jsx(
831
833
  Page,
832
834
  {
package/dist/pdf.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/utils.ts","../src/hooks/useZoomPanGestures.ts","../src/components/EmptyState.tsx","../src/components/pdf/LazyThumbnail.tsx","../src/components/pdf/worker.ts","../src/components/pdf/PdfViewer.tsx","../src/components/ui/dialog.tsx","../src/components/media/MediaViewerDialog.tsx","../src/components/pdf/PdfViewerDialog.tsx"],"names":["dx","dy","useRef","useState","useEffect","jsxs","jsx","useCallback"],"mappings":";;;;;;;;;;AAGO,SAAS,MAAM,MAAA,EAAsB;AAC3C,EAAA,OAAO,OAAA,CAAQ,IAAA,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,GAAI,QAAA,CAA2B;AAAA,IAC5D,GAAG,QAAA;AAAA,IACH,KAAA,EAAO;AAAA,GACP,CAAA;AACD,EAAA,MAAM,YAAA,GAAe,OAAO,SAAS,CAAA;AACrC,EAAA,YAAA,CAAa,OAAA,GAAU,SAAA;AAEvB,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,SAAS,KAAK,CAAA;AAC5D,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,KAAK,CAAA;AAE9C,EAAA,MAAM,QAAA,GAAW,OAAuB,IAAI,CAAA;AAC5C,EAAA,MAAM,WAAA,GAAc,MAAA,iBAAO,IAAI,GAAA,EAAuC,CAAA;AACtE,EAAA,MAAM,aAAA,GAAgB,OAKZ,IAAI,CAAA;AACd,EAAA,MAAM,MAAA,GAAS,OAOL,IAAI,CAAA;AACd,EAAA,MAAM,QAAA,GAAW,OAMP,IAAI,CAAA;AACd,EAAA,MAAM,UAAA,GAAa,MAAA;AAAA,IAClB;AAAA,GACD;AACA,EAAA,MAAM,gBAAA,GAAmB,OAAO,aAAa,CAAA;AAC7C,EAAA,gBAAA,CAAiB,OAAA,GAAU,aAAA;AAC3B,EAAA,MAAM,eAAA,GAAkB,OAAO,YAAY,CAAA;AAC3C,EAAA,eAAA,CAAgB,OAAA,GAAU,YAAA;AAC1B,EAAA,MAAM,WAAA,GAAc,OAAO,QAAQ,CAAA;AACnC,EAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AACtB,EAAA,MAAM,WAAA,GAAc,OAAO,QAAQ,CAAA;AACnC,EAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AACtB,EAAA,MAAM,YAAA,GAAe,OAAO,SAAS,CAAA;AACrC,EAAA,YAAA,CAAa,OAAA,GAAU,SAAA;AAEvB,EAAA,MAAM,KAAA,GAAQ,YAAY,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,GAAW,WAAA,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,GAAgB,YAAY,MAAM;AACvC,IAAA,WAAA,CAAY,KAAK,CAAA;AAAA,EAClB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,WAAA,GAAc,WAAA,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,EAAA,SAAA,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,MAAMA,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,uBACC,IAAA;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,wBAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,qBAAA,EAAsB,aAAA,EAAY,MAAA,EAAO,CAAA;AAAA,wBAC5D,GAAA,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,uBACC,IAAA;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,wBAAA,GAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAU,yBAAA,EAA0B,aAAA,EAAY,MAAA,EAAO,CAAA;AAAA,6BACrE,KAAA,EAAA,EACA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,aAAA,EAAe,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,UACjC,8BACA,GAAA,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,GAAMC,OAA0B,IAAI,CAAA;AAC1C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIC,SAAS,KAAK,CAAA;AAE5C,EAAAC,UAAU,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,uBACCC,IAAAA;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,IAAC,SAAA,EAAA,EAAU,UAAA,EAAwB,OAAc,SAAA,EAAU,SAAA,EAAU,oBAErEA,GAAAA;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,GAAAA,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,EAAA,KAAA,CAAM,oBAAoB,SAAA,GAAY,SAAA;AACtC,EAAA,aAAA,GAAgB,SAAA;AACjB;ACkBA,IAAM,UAAA,GAAa,CAAC,GAAA,EAAK,IAAA,EAAM,GAAG,IAAA,EAAM,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAC,CAAA;AACtD,IAAM,WAAA,GAAc,GAAA;AAwCb,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;AACD,CAAA,EAAmB;AAClB,EAAA,kBAAA,CAAmB,SAAS,CAAA;AAE5B,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIH,SAAS,CAAC,CAAA;AAC1C,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,WAAW,CAAA;AACxD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,CAAC,CAAA;AAC5C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAA2B,OAAO,CAAA;AAChE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,CAAC,CAAA;AAC1C,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,SAAS,CAAC,CAAA;AACtD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,SAAS,CAAC,CAAA;AACxD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,IAAIA,QAAAA,CAAS,MAAA,CAAO,WAAW,CAAC,CAAA;AAE9D,EAAA,MAAM,WAAA,GAAcD,OAAuB,IAAI,CAAA;AAC/C,EAAA,MAAM,QAAA,GAAWA,OAAuB,IAAI,CAAA;AAC5C,EAAA,MAAM,aAAA,GAAgBA,OAAO,UAAU,CAAA;AACvC,EAAA,aAAA,CAAc,OAAA,GAAU,UAAA;AACxB,EAAA,MAAM,WAAA,GAAcA,OAAO,QAAQ,CAAA;AACnC,EAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AAEtB,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,SAAS,CAAA,IAAK,CAAA;AAE3C,EAAA,MAAM,QAAA,GAAWK,WAAAA,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,WAAAA;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,EAAAH,UAAU,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,UAAU,MAAM;AACf,IAAA,KAAA,EAAM;AAAA,EACP,CAAA,EAAG,CAAC,UAAA,EAAY,KAAK,CAAC,CAAA;AAEtB,EAAAA,UAAU,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,UAAU,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,UAAU,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,GAAWG,YAAY,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,YAAY,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,YAAY,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,YAAY,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,YAAY,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,uBACCD,GAAAA,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,GAAAA;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,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,GAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAW,EAAA;AAAA,QACV,4DAAA;AAAA,QACA;AAAA,OACD;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qEAAA,EACd,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACA,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,0HAAA;AAAA,cACV,SAAS,MAAM,aAAA,CAAc,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,cACtC,cACC,UAAA,GACI,MAAA,CAAO,cAAA,IAAkB,oBAAA,GACzB,OAAO,cAAA,IAAkB,oBAAA;AAAA,cAE9B,cAAA,EAAc,UAAA;AAAA,cAEb,QAAA,EAAA,UAAA,mBACAA,GAAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,SAAA,EAAU,CAAA,mBAEpCA,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,WAEjC;AAAA,0BAEAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACA,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,8HAAA;AAAA,cACV,OAAA,EAAS,MAAM,QAAA,CAAS,UAAA,GAAa,CAAC,CAAA;AAAA,cACtC,UAAU,UAAA,IAAc,CAAA;AAAA,cACxB,YAAA,EAAY,OAAO,YAAA,IAAgB,oBAAA;AAAA,cAEnC,QAAA,kBAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,WAClC;AAAA,0BAEAD,IAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACA,QAAA,EAAU,cAAA;AAAA,cACV,SAAA,EAAU,gEAAA;AAAA,cAEV,QAAA,EAAA;AAAA,gCAAAC,GAAAA,CAAC,WAAM,SAAA,EAAU,SAAA,EAAU,SAAQ,eAAA,EACjC,QAAA,EAAA,MAAA,CAAO,gBAAgB,gBAAA,EACzB,CAAA;AAAA,gCACAA,GAAAA;AAAA,kBAAC,OAAA;AAAA,kBAAA;AAAA,oBACA,EAAA,EAAG,eAAA;AAAA,oBACH,KAAA,EAAO,SAAA;AAAA,oBACP,UAAU,CAAC,CAAA,KAAM,YAAA,CAAa,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,oBAC5C,SAAA,EAAU,2EAAA;AAAA,oBACV,SAAA,EAAU;AAAA;AAAA,iBACX;AAAA,gCACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAA8B,QAAA,EAAA,MAAA,EAAO;AAAA;AAAA;AAAA,WACtD;AAAA,0BAEAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACA,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,8HAAA;AAAA,cACV,OAAA,EAAS,MAAM,QAAA,CAAS,UAAA,GAAa,CAAC,CAAA;AAAA,cACtC,UAAU,UAAA,IAAc,QAAA;AAAA,cACxB,YAAA,EAAY,OAAO,QAAA,IAAY,qBAAA;AAAA,cAE/B,QAAA,kBAAAA,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,WACnC;AAAA,0BAEAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACA,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,8HAAA;AAAA,cACV,OAAA,EAAS,OAAA;AAAA,cACT,UAAU,SAAA,IAAa,CAAA;AAAA,cACvB,YAAA,EAAY,OAAO,OAAA,IAAW,QAAA;AAAA,cAE9B,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,WAC9B;AAAA,0BACAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACA,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,mHAAA;AAAA,cACV,OAAA,EAAS,OAAA,KAAY,OAAA,GAAU,OAAA,GAAU,QAAA;AAAA,cAExC,sBAAY,OAAA,GACT,MAAA,CAAO,OAAA,IAAW,mBAAA,GAClB,OAAO,QAAA,IAAY;AAAA;AAAA,WACxB;AAAA,0BACAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACA,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,8HAAA;AAAA,cACV,OAAA,EAAS,MAAA;AAAA,cACT,QAAA,EAAU,SAAA,IAAa,UAAA,CAAW,MAAA,GAAS,CAAA;AAAA,cAC3C,YAAA,EAAY,OAAO,MAAA,IAAU,SAAA;AAAA,cAE7B,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,WAC7B;AAAA,0BAEAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACA,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,0GAAA;AAAA,cACV,SAAS,MAAM,WAAA,CAAY,CAAC,CAAA,KAAA,CAAO,CAAA,GAAI,MAAM,GAAG,CAAA;AAAA,cAChD,YAAA,EAAY,OAAO,MAAA,IAAU,OAAA;AAAA,cAE7B,QAAA,kBAAAA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,WAC/B;AAAA,0BAEAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACA,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,0GAAA;AAAA,cACV,OAAA,EAAS,MAAM,KAAK,gBAAA,EAAiB;AAAA,cACrC,cACC,YAAA,GACI,MAAA,CAAO,cAAA,IAAkB,4BAAA,GACzB,OAAO,eAAA,IAAmB,mBAAA;AAAA,cAG9B,QAAA,EAAA,YAAA,mBACAA,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,SAAA,EAAU,CAAA,mBAE/BA,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,WAEjC;AAAA,0BAEAD,IAAAA;AAAA,YAAC,GAAA;AAAA,YAAA;AAAA,cACA,IAAA,EAAM,YAAA;AAAA,cACN,QAAA,EAAU,QAAA;AAAA,cACV,YAAA,EAAY,MAAA,CAAO,YAAA,IAAgB,MAAA,CAAO,QAAA,IAAY,WAAA;AAAA,cACtD,SAAA,EAAU,0GAAA;AAAA,cAEV,QAAA,EAAA;AAAA,gCAAAC,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,gCAC9BA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,kBAAA,EACd,QAAA,EAAA,MAAA,CAAO,YAAY,WAAA,EACrB;AAAA;AAAA;AAAA;AACD,SAAA,EACD,CAAA;AAAA,wBAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACb,QAAA,EAAA;AAAA,UAAA,QAAA,GAAW,qBACXC,GAAAA;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,KAAA,QAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAC,GAAAA;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,GAAAA,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,GAAAA;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,GAAAA;AAAA,gBAAC,UAAA;AAAA,gBAAA;AAAA,kBACA,KAAA,EAAO,OAAO,SAAA,IAAa,0BAAA;AAAA,kBAC3B,WAAA,EACC,OAAO,oBAAA,IACP,wDAAA;AAAA,kBAED,wBACCA,GAAAA;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,kCAIFA,GAAAA;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,GAAAA;AAAA,oBAAC,QAAA;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,yBACCA,GAAAA,CAAC,gBAAa,KAAA,EAAO,MAAA,CAAO,WAAW,oBAAA,EAAiB,CAAA;AAAA,sBAEzD,uBACCA,GAAAA;AAAA,wBAAC,UAAA;AAAA,wBAAA;AAAA,0BACA,KAAA,EAAO,OAAO,SAAA,IAAa;AAAA;AAAA,uBAC5B;AAAA,sBAGA,QAAA,EAAA,QAAA,GAAW,qBACXA,GAAAA;AAAA,wBAAC,IAAA;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;ACzhBA,SAAS,MAAA,CAAO;AAAA,EACf,GAAG;AACJ,CAAA,EAAsD;AACrD,EAAA,uBAAOA,GAAAA,CAAiB,eAAA,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,uBAAOA,GAAAA,CAAiB,eAAA,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,uBACCA,GAAAA;AAAA,IAAiB,eAAA,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,uBACCD,IAAAA,CAAC,YAAA,EAAA,EAAa,WAAA,EAAU,eAAA,EACvB,QAAA,EAAA;AAAA,oBAAAC,IAAC,aAAA,EAAA,EAAc,CAAA;AAAA,oBACfD,IAAAA;AAAA,MAAiB,eAAA,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,mCACAA,IAAAA;AAAA,YAAiB,eAAA,CAAA,KAAA;AAAA,YAAhB;AAAA,cACA,WAAA,EAAU,cAAA;AAAA,cACV,SAAA,EAAU,mWAAA;AAAA,cAEV,QAAA,EAAA;AAAA,gCAAAC,IAAC,KAAA,EAAA,EAAM,CAAA;AAAA,gCACPA,GAAAA,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,GAAAA;AAAA,IAAiB,eAAA,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,uBACCA,GAAAA;AAAA,IAAiB,eAAA,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,uBACCA,GAAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAY,cACnB,QAAA,kBAAAD,IAAAA;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,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,SAAA,EAAW,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,wBACxCA,GAAAA,CAAC,iBAAA,EAAA,EAAkB,SAAA,EAAU,WAAW,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,QACnD,mCACAA,GAAAA;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,GAAAA,CAAC,CAAA,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,uBACCA,GAAAA;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,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCAAA,EACd,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EACd,QAAA,kBAAAA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8BAAA,EAAgC,QAAA,EAAA,KAAA,EAAM,CAAA,EACpD,CAAA;AAAA,wBACAA,GAAAA;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.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport {\n\tuseCallback,\n\tuseEffect,\n\tuseRef,\n\tuseState,\n\ttype PointerEvent as ReactPointerEvent,\n\ttype RefObject,\n} from \"react\";\n\nexport const ZOOM_PAN_MIN_SCALE = 1;\nexport const ZOOM_PAN_MAX_SCALE = 4;\nexport const ZOOM_PAN_DOUBLE_TAP_MS = 300;\nexport const ZOOM_PAN_SWIPE_LOCK_PX = 8;\nexport const ZOOM_PAN_SWIPE_COMMIT_PX = 56;\nexport const ZOOM_PAN_SWIPE_SNAP_MS = 180;\n\nexport type ZoomPanTransform = {\n\tscale: number;\n\ttx: number;\n\tty: number;\n};\n\nexport type SwipeDirection = \"prev\" | \"next\";\n\nexport type UseZoomPanGesturesOptions = {\n\tminScale?: number;\n\tmaxScale?: number;\n\t/** When false, horizontal swipe never commits (still pans when zoomed). */\n\tswipeEnabled?: boolean;\n\tonSwipeCommit?: (direction: SwipeDirection) => void;\n\t/** When true, wheel zoom is attached to the stage. Defaults to true. */\n\twheelZoom?: boolean;\n\t/**\n\t * Double-tap behavior at min scale: \"reset\" (default — ImageLightbox) or\n\t * \"toggle\" (zoom in toward tap, then reset).\n\t */\n\tdoubleTap?: \"reset\" | \"toggle\";\n};\n\nexport type UseZoomPanGesturesResult = {\n\tstageRef: RefObject<HTMLDivElement | null>;\n\ttransform: ZoomPanTransform;\n\tisDragging: boolean;\n\tsnapBack: boolean;\n\thandlers: {\n\t\tonPointerDown: (e: ReactPointerEvent<HTMLDivElement>) => void;\n\t\tonPointerMove: (e: ReactPointerEvent<HTMLDivElement>) => void;\n\t\tonPointerUp: (e: ReactPointerEvent<HTMLDivElement>) => void;\n\t\tonPointerCancel: (e: ReactPointerEvent<HTMLDivElement>) => void;\n\t};\n\treset: () => void;\n\tsetScale: (scale: number) => void;\n\tclearSnapBack: () => void;\n};\n\ntype SwipeAxis = \"x\" | \"y\";\n\nconst IDENTITY: ZoomPanTransform = { scale: 1, tx: 0, ty: 0 };\n\nfunction clamp(value: number, min: number, max: number) {\n\treturn Math.min(max, Math.max(min, value));\n}\n\nexport function zoomToward(\n\tprev: ZoomPanTransform,\n\tnextScale: number,\n\toriginX: number,\n\toriginY: number,\n\tminScale = ZOOM_PAN_MIN_SCALE,\n\tmaxScale = ZOOM_PAN_MAX_SCALE,\n): ZoomPanTransform {\n\tconst scale = clamp(nextScale, minScale, maxScale);\n\tif (scale === minScale) return { ...IDENTITY, scale: minScale };\n\tconst ratio = scale / prev.scale;\n\treturn {\n\t\tscale,\n\t\ttx: originX - (originX - prev.tx) * ratio,\n\t\tty: originY - (originY - prev.ty) * ratio,\n\t};\n}\n\nfunction pointerDistance(\n\ta: { x: number; y: number },\n\tb: { x: number; y: number },\n) {\n\treturn Math.hypot(b.x - a.x, b.y - a.y);\n}\n\nexport function prefersReducedMotion() {\n\tif (typeof window === \"undefined\" || !window.matchMedia) return false;\n\treturn window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n}\n\n/**\n * Pointer-driven pinch zoom, double-tap zoom toggle/reset, pan while zoomed,\n * and horizontal swipe-to-commit. Shared by ImageLightbox, MediaCarousel and\n * PdfViewer.\n */\nexport function useZoomPanGestures(\n\toptions: UseZoomPanGesturesOptions = {},\n): UseZoomPanGesturesResult {\n\tconst {\n\t\tminScale = ZOOM_PAN_MIN_SCALE,\n\t\tmaxScale = ZOOM_PAN_MAX_SCALE,\n\t\tswipeEnabled = true,\n\t\tonSwipeCommit,\n\t\twheelZoom = true,\n\t\tdoubleTap = \"reset\",\n\t} = options;\n\n\tconst [transform, setTransform] = useState<ZoomPanTransform>({\n\t\t...IDENTITY,\n\t\tscale: minScale,\n\t});\n\tconst transformRef = useRef(transform);\n\ttransformRef.current = transform;\n\n\tconst [isSwipeDragging, setIsSwipeDragging] = useState(false);\n\tconst [snapBack, setSnapBack] = useState(false);\n\n\tconst stageRef = useRef<HTMLDivElement>(null);\n\tconst pointersRef = useRef(new Map<number, { x: number; y: number }>());\n\tconst pinchStartRef = useRef<{\n\t\tdistance: number;\n\t\toriginX: number;\n\t\toriginY: number;\n\t\ttransform: ZoomPanTransform;\n\t} | null>(null);\n\tconst panRef = useRef<{\n\t\tpointerId: number;\n\t\tstartX: number;\n\t\tstartY: number;\n\t\toriginTx: number;\n\t\toriginTy: number;\n\t\tmoved: boolean;\n\t} | null>(null);\n\tconst swipeRef = useRef<{\n\t\tpointerId: number;\n\t\tstartX: number;\n\t\tstartY: number;\n\t\tmoved: boolean;\n\t\taxis: SwipeAxis | null;\n\t} | null>(null);\n\tconst lastTapRef = useRef<{ time: number; x: number; y: number } | null>(\n\t\tnull,\n\t);\n\tconst onSwipeCommitRef = useRef(onSwipeCommit);\n\tonSwipeCommitRef.current = onSwipeCommit;\n\tconst swipeEnabledRef = useRef(swipeEnabled);\n\tswipeEnabledRef.current = swipeEnabled;\n\tconst minScaleRef = useRef(minScale);\n\tminScaleRef.current = minScale;\n\tconst maxScaleRef = useRef(maxScale);\n\tmaxScaleRef.current = maxScale;\n\tconst doubleTapRef = useRef(doubleTap);\n\tdoubleTapRef.current = doubleTap;\n\n\tconst reset = useCallback(() => {\n\t\tsetTransform({ ...IDENTITY, scale: minScaleRef.current });\n\t\tsetIsSwipeDragging(false);\n\t\tsetSnapBack(false);\n\t}, []);\n\n\tconst setScale = useCallback((next: number) => {\n\t\tsetTransform((prev) =>\n\t\t\tzoomToward(prev, next, 0, 0, minScaleRef.current, maxScaleRef.current),\n\t\t);\n\t}, []);\n\n\tconst clearSnapBack = useCallback(() => {\n\t\tsetSnapBack(false);\n\t}, []);\n\n\tconst stageOrigin = useCallback((clientX: number, clientY: number) => {\n\t\tconst stage = stageRef.current;\n\t\tif (!stage) return { x: 0, y: 0 };\n\t\tconst rect = stage.getBoundingClientRect();\n\t\treturn {\n\t\t\tx: clientX - rect.left - rect.width / 2,\n\t\t\ty: clientY - rect.top - rect.height / 2,\n\t\t};\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (!wheelZoom) return;\n\t\tconst stage = stageRef.current;\n\t\tif (!stage) return;\n\n\t\tconst handleWheel = (e: WheelEvent) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tconst prev = transformRef.current;\n\t\t\tconst factor = e.deltaY > 0 ? 0.9 : 1.1;\n\t\t\tconst { x, y } = stageOrigin(e.clientX, e.clientY);\n\t\t\tsetTransform(\n\t\t\t\tzoomToward(\n\t\t\t\t\tprev,\n\t\t\t\t\tprev.scale * factor,\n\t\t\t\t\tx,\n\t\t\t\t\ty,\n\t\t\t\t\tminScaleRef.current,\n\t\t\t\t\tmaxScaleRef.current,\n\t\t\t\t),\n\t\t\t);\n\t\t};\n\n\t\tstage.addEventListener(\"wheel\", handleWheel, { passive: false });\n\t\treturn () => stage.removeEventListener(\"wheel\", handleWheel);\n\t}, [stageOrigin, wheelZoom]);\n\n\tfunction clearSwipe() {\n\t\tswipeRef.current = null;\n\t\tsetIsSwipeDragging(false);\n\t}\n\n\tfunction beginPinch() {\n\t\tconst pts = [...pointersRef.current.values()];\n\t\tconst [a, b] = pts;\n\t\tif (!a || !b) return;\n\t\tconst midX = (a.x + b.x) / 2;\n\t\tconst midY = (a.y + b.y) / 2;\n\t\tconst { x, y } = stageOrigin(midX, midY);\n\t\tpinchStartRef.current = {\n\t\t\tdistance: Math.max(pointerDistance(a, b), 1),\n\t\t\toriginX: x,\n\t\t\toriginY: y,\n\t\t\ttransform: { ...transformRef.current },\n\t\t};\n\t\tpanRef.current = null;\n\t\tclearSwipe();\n\t\tsetSnapBack(false);\n\t}\n\n\tfunction onPointerDown(e: ReactPointerEvent<HTMLDivElement>) {\n\t\te.stopPropagation();\n\t\tconst stage = stageRef.current;\n\t\tif (!stage) return;\n\n\t\tif (typeof stage.setPointerCapture === \"function\") {\n\t\t\tstage.setPointerCapture(e.pointerId);\n\t\t}\n\t\tpointersRef.current.set(e.pointerId, { x: e.clientX, y: e.clientY });\n\t\tsetSnapBack(false);\n\n\t\tif (pointersRef.current.size === 2) {\n\t\t\tbeginPinch();\n\t\t\treturn;\n\t\t}\n\n\t\tif (transformRef.current.scale > minScaleRef.current) {\n\t\t\tpanRef.current = {\n\t\t\t\tpointerId: e.pointerId,\n\t\t\t\tstartX: e.clientX,\n\t\t\t\tstartY: e.clientY,\n\t\t\t\toriginTx: transformRef.current.tx,\n\t\t\t\toriginTy: transformRef.current.ty,\n\t\t\t\tmoved: false,\n\t\t\t};\n\t\t\treturn;\n\t\t}\n\n\t\tif (swipeEnabledRef.current) {\n\t\t\tswipeRef.current = {\n\t\t\t\tpointerId: e.pointerId,\n\t\t\t\tstartX: e.clientX,\n\t\t\t\tstartY: e.clientY,\n\t\t\t\tmoved: false,\n\t\t\t\taxis: null,\n\t\t\t};\n\t\t\tsetIsSwipeDragging(true);\n\t\t}\n\t}\n\n\tfunction onPointerMove(e: ReactPointerEvent<HTMLDivElement>) {\n\t\tif (!pointersRef.current.has(e.pointerId)) return;\n\t\tpointersRef.current.set(e.pointerId, { x: e.clientX, y: e.clientY });\n\n\t\tconst pinchStart = pinchStartRef.current;\n\t\tif (pointersRef.current.size >= 2 && pinchStart) {\n\t\t\tconst pts = [...pointersRef.current.values()];\n\t\t\tconst [a, b] = pts;\n\t\t\tif (!a || !b) return;\n\t\t\tconst distance = Math.max(pointerDistance(a, b), 1);\n\t\t\tconst nextScale =\n\t\t\t\tpinchStart.transform.scale * (distance / pinchStart.distance);\n\t\t\tsetTransform(\n\t\t\t\tzoomToward(\n\t\t\t\t\tpinchStart.transform,\n\t\t\t\t\tnextScale,\n\t\t\t\t\tpinchStart.originX,\n\t\t\t\t\tpinchStart.originY,\n\t\t\t\t\tminScaleRef.current,\n\t\t\t\t\tmaxScaleRef.current,\n\t\t\t\t),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst pan = panRef.current;\n\t\tif (pan && pan.pointerId === e.pointerId) {\n\t\t\tconst dx = e.clientX - pan.startX;\n\t\t\tconst dy = e.clientY - pan.startY;\n\t\t\tif (Math.abs(dx) > 2 || Math.abs(dy) > 2) pan.moved = true;\n\t\t\tsetTransform((prev) => ({\n\t\t\t\t...prev,\n\t\t\t\ttx: pan.originTx + dx,\n\t\t\t\tty: pan.originTy + dy,\n\t\t\t}));\n\t\t\treturn;\n\t\t}\n\n\t\tconst swipe = swipeRef.current;\n\t\tif (!swipe || swipe.pointerId !== e.pointerId) return;\n\n\t\tconst dx = e.clientX - swipe.startX;\n\t\tconst dy = e.clientY - swipe.startY;\n\t\tif (Math.abs(dx) > 2 || Math.abs(dy) > 2) swipe.moved = true;\n\n\t\tif (swipe.axis === null) {\n\t\t\tconst absX = Math.abs(dx);\n\t\t\tconst absY = Math.abs(dy);\n\t\t\tif (absX < ZOOM_PAN_SWIPE_LOCK_PX && absY < ZOOM_PAN_SWIPE_LOCK_PX) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tswipe.axis = absX >= absY ? \"x\" : \"y\";\n\t\t\tif (swipe.axis === \"y\") {\n\t\t\t\tclearSwipe();\n\t\t\t\tsetTransform({ ...IDENTITY, scale: minScaleRef.current });\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (swipe.axis === \"x\") {\n\t\t\tsetTransform({\n\t\t\t\tscale: minScaleRef.current,\n\t\t\t\ttx: dx,\n\t\t\t\tty: 0,\n\t\t\t});\n\t\t}\n\t}\n\n\tfunction finishSwipe(e: ReactPointerEvent<HTMLDivElement>) {\n\t\tconst swipe = swipeRef.current;\n\t\tif (!swipe || swipe.pointerId !== e.pointerId) return false;\n\n\t\tconst dx = e.clientX - swipe.startX;\n\t\tconst wasMoved = swipe.moved;\n\t\tconst axis = swipe.axis;\n\t\tclearSwipe();\n\n\t\tif (axis === \"x\" && Math.abs(dx) >= ZOOM_PAN_SWIPE_COMMIT_PX) {\n\t\t\tonSwipeCommitRef.current?.(dx < 0 ? \"next\" : \"prev\");\n\t\t\treturn true;\n\t\t}\n\n\t\tif (wasMoved || transformRef.current.tx !== 0) {\n\t\t\tif (!prefersReducedMotion()) setSnapBack(true);\n\t\t\tsetTransform({ ...IDENTITY, scale: minScaleRef.current });\n\t\t}\n\t\treturn wasMoved;\n\t}\n\n\tfunction onPointerUp(e: ReactPointerEvent<HTMLDivElement>) {\n\t\tconst stage = stageRef.current;\n\t\tif (\n\t\t\tstage &&\n\t\t\ttypeof stage.hasPointerCapture === \"function\" &&\n\t\t\tstage.hasPointerCapture(e.pointerId) &&\n\t\t\ttypeof stage.releasePointerCapture === \"function\"\n\t\t) {\n\t\t\tstage.releasePointerCapture(e.pointerId);\n\t\t}\n\t\tpointersRef.current.delete(e.pointerId);\n\n\t\tif (pointersRef.current.size < 2) {\n\t\t\tpinchStartRef.current = null;\n\t\t}\n\t\tif (pointersRef.current.size === 1) {\n\t\t\tconst remaining = [...pointersRef.current.entries()][0];\n\t\t\tif (remaining && transformRef.current.scale > minScaleRef.current) {\n\t\t\t\tconst [pointerId, point] = remaining;\n\t\t\t\tpanRef.current = {\n\t\t\t\t\tpointerId,\n\t\t\t\t\tstartX: point.x,\n\t\t\t\t\tstartY: point.y,\n\t\t\t\t\toriginTx: transformRef.current.tx,\n\t\t\t\t\toriginTy: transformRef.current.ty,\n\t\t\t\t\tmoved: true,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tconst swipeHandled = finishSwipe(e);\n\t\tif (swipeHandled) return;\n\n\t\tconst pan = panRef.current;\n\t\tif (pan && pan.pointerId === e.pointerId) {\n\t\t\tconst wasMoved = pan.moved;\n\t\t\tpanRef.current = null;\n\t\t\tif (wasMoved) return;\n\t\t}\n\n\t\tif (pointersRef.current.size === 0 && e.button === 0) {\n\t\t\tconst now = Date.now();\n\t\t\tconst last = lastTapRef.current;\n\t\t\tif (\n\t\t\t\tlast &&\n\t\t\t\tnow - last.time < ZOOM_PAN_DOUBLE_TAP_MS &&\n\t\t\t\tMath.hypot(e.clientX - last.x, e.clientY - last.y) < 24\n\t\t\t) {\n\t\t\t\tlastTapRef.current = null;\n\t\t\t\tif (\n\t\t\t\t\tdoubleTapRef.current === \"toggle\" &&\n\t\t\t\t\ttransformRef.current.scale <= minScaleRef.current\n\t\t\t\t) {\n\t\t\t\t\tconst { x, y } = stageOrigin(e.clientX, e.clientY);\n\t\t\t\t\tsetTransform(\n\t\t\t\t\t\tzoomToward(\n\t\t\t\t\t\t\ttransformRef.current,\n\t\t\t\t\t\t\tMath.min(2, maxScaleRef.current),\n\t\t\t\t\t\t\tx,\n\t\t\t\t\t\t\ty,\n\t\t\t\t\t\t\tminScaleRef.current,\n\t\t\t\t\t\t\tmaxScaleRef.current,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\treset();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlastTapRef.current = { time: now, x: e.clientX, y: e.clientY };\n\t\t}\n\t}\n\n\treturn {\n\t\tstageRef,\n\t\ttransform,\n\t\tisDragging: isSwipeDragging,\n\t\tsnapBack,\n\t\thandlers: {\n\t\t\tonPointerDown,\n\t\t\tonPointerMove,\n\t\t\tonPointerUp,\n\t\t\tonPointerCancel: onPointerUp,\n\t\t},\n\t\treset,\n\t\tsetScale,\n\t\tclearSnapBack,\n\t};\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { AlertTriangle, Inbox, Loader2, type LucideIcon } 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\nexport type EmptyStateProps = {\n\ttitle: string;\n\tdescription?: string;\n\taction?: React.ReactNode;\n\ticon?: LucideIcon;\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} 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};\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}: 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<div className=\"flex shrink-0 items-center gap-1 overflow-x-auto border-b px-2 py-2\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\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\tonClick={() => setThumbsOpen((v) => !v)}\n\t\t\t\t\taria-label={\n\t\t\t\t\t\tthumbsOpen\n\t\t\t\t\t\t\t? (labels.hideThumbnails ?? \"Ocultar miniaturas\")\n\t\t\t\t\t\t\t: (labels.showThumbnails ?? \"Mostrar miniaturas\")\n\t\t\t\t\t}\n\t\t\t\t\taria-pressed={thumbsOpen}\n\t\t\t\t>\n\t\t\t\t\t{thumbsOpen ? (\n\t\t\t\t\t\t<PanelLeftClose className=\"h-4 w-4\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<PanelLeft className=\"h-4 w-4\" />\n\t\t\t\t\t)}\n\t\t\t\t</button>\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\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\tonClick={() => goToPage(pageNumber - 1)}\n\t\t\t\t\tdisabled={pageNumber <= 1}\n\t\t\t\t\taria-label={labels.previousPage ?? \"Página anterior\"}\n\t\t\t\t>\n\t\t\t\t\t<ChevronLeft className=\"h-4 w-4\" />\n\t\t\t\t</button>\n\n\t\t\t\t<form\n\t\t\t\t\tonSubmit={submitPageJump}\n\t\t\t\t\tclassName=\"flex shrink-0 items-center gap-1 text-xs text-muted-foreground\"\n\t\t\t\t>\n\t\t\t\t\t<label className=\"sr-only\" htmlFor=\"pdf-page-jump\">\n\t\t\t\t\t\t{labels.pageJumpAria ?? \"Ir a página\"}\n\t\t\t\t\t</label>\n\t\t\t\t\t<input\n\t\t\t\t\t\tid=\"pdf-page-jump\"\n\t\t\t\t\t\tvalue={pageDraft}\n\t\t\t\t\t\tonChange={(e) => setPageDraft(e.target.value)}\n\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\tinputMode=\"numeric\"\n\t\t\t\t\t/>\n\t\t\t\t\t<span className=\"min-w-10 whitespace-nowrap\">{pageOf}</span>\n\t\t\t\t</form>\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\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\tonClick={() => goToPage(pageNumber + 1)}\n\t\t\t\t\tdisabled={pageNumber >= numPages}\n\t\t\t\t\taria-label={labels.nextPage ?? \"Página siguiente\"}\n\t\t\t\t>\n\t\t\t\t\t<ChevronRight className=\"h-4 w-4\" />\n\t\t\t\t</button>\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\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\tonClick={zoomOut}\n\t\t\t\t\tdisabled={zoomIndex <= 0}\n\t\t\t\t\taria-label={labels.zoomOut ?? \"Alejar\"}\n\t\t\t\t>\n\t\t\t\t\t<ZoomOut className=\"h-4 w-4\" />\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\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\tonClick={fitMode === \"width\" ? fitPage : fitWidth}\n\t\t\t\t>\n\t\t\t\t\t{fitMode === \"width\"\n\t\t\t\t\t\t? (labels.fitPage ?? \"Ajustar página\")\n\t\t\t\t\t\t: (labels.fitWidth ?? \"Ajustar ancho\")}\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\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\tonClick={zoomIn}\n\t\t\t\t\tdisabled={zoomIndex >= ZOOM_STEPS.length - 1}\n\t\t\t\t\taria-label={labels.zoomIn ?? \"Acercar\"}\n\t\t\t\t>\n\t\t\t\t\t<ZoomIn className=\"h-4 w-4\" />\n\t\t\t\t</button>\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\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\tonClick={() => setRotation((r) => (r + 90) % 360)}\n\t\t\t\t\taria-label={labels.rotate ?? \"Rotar\"}\n\t\t\t\t>\n\t\t\t\t\t<RotateCw className=\"h-4 w-4\" />\n\t\t\t\t</button>\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\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\tonClick={() => void toggleFullscreen()}\n\t\t\t\t\taria-label={\n\t\t\t\t\t\tisFullscreen\n\t\t\t\t\t\t\t? (labels.exitFullscreen ?? \"Salir de pantalla completa\")\n\t\t\t\t\t\t\t: (labels.enterFullscreen ?? \"Pantalla completa\")\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{isFullscreen ? (\n\t\t\t\t\t\t<Minimize2 className=\"h-4 w-4\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Maximize2 className=\"h-4 w-4\" />\n\t\t\t\t\t)}\n\t\t\t\t</button>\n\n\t\t\t\t<a\n\t\t\t\t\thref={downloadHref}\n\t\t\t\t\tdownload={fileName}\n\t\t\t\t\taria-label={labels.downloadAria ?? labels.download ?? \"Descargar\"}\n\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>\n\t\t\t\t\t<Download className=\"h-4 w-4\" />\n\t\t\t\t\t<span className=\"hidden sm:inline\">\n\t\t\t\t\t\t{labels.download ?? \"Descargar\"}\n\t\t\t\t\t</span>\n\t\t\t\t</a>\n\t\t\t</div>\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<ErrorState\n\t\t\t\t\t\t\ttitle={labels.loadError ?? \"No se pudo cargar el PDF\"}\n\t\t\t\t\t\t\tdescription={\n\t\t\t\t\t\t\t\tlabels.loadErrorDescription ??\n\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}\n\t\t\t\t\t\t\taction={\n\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\thref={downloadHref}\n\t\t\t\t\t\t\t\t\tdownload={fileName}\n\t\t\t\t\t\t\t\t\tclassName=\"text-sm text-primary underline\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{labels.download ?? \"Descargar\"}\n\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t/>\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<ErrorState\n\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/>\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":["dx","dy","useRef","useState","useEffect","jsxs","jsx","useCallback"],"mappings":"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","file":"pdf.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport {\n\tuseCallback,\n\tuseEffect,\n\tuseRef,\n\tuseState,\n\ttype PointerEvent as ReactPointerEvent,\n\ttype RefObject,\n} from \"react\";\n\nexport const ZOOM_PAN_MIN_SCALE = 1;\nexport const ZOOM_PAN_MAX_SCALE = 4;\nexport const ZOOM_PAN_DOUBLE_TAP_MS = 300;\nexport const ZOOM_PAN_SWIPE_LOCK_PX = 8;\nexport const ZOOM_PAN_SWIPE_COMMIT_PX = 56;\nexport const ZOOM_PAN_SWIPE_SNAP_MS = 180;\n\nexport type ZoomPanTransform = {\n\tscale: number;\n\ttx: number;\n\tty: number;\n};\n\nexport type SwipeDirection = \"prev\" | \"next\";\n\nexport type UseZoomPanGesturesOptions = {\n\tminScale?: number;\n\tmaxScale?: number;\n\t/** When false, horizontal swipe never commits (still pans when zoomed). */\n\tswipeEnabled?: boolean;\n\tonSwipeCommit?: (direction: SwipeDirection) => void;\n\t/** When true, wheel zoom is attached to the stage. Defaults to true. */\n\twheelZoom?: boolean;\n\t/**\n\t * Double-tap behavior at min scale: \"reset\" (default — ImageLightbox) or\n\t * \"toggle\" (zoom in toward tap, then reset).\n\t */\n\tdoubleTap?: \"reset\" | \"toggle\";\n};\n\nexport type UseZoomPanGesturesResult = {\n\tstageRef: RefObject<HTMLDivElement | null>;\n\ttransform: ZoomPanTransform;\n\tisDragging: boolean;\n\tsnapBack: boolean;\n\thandlers: {\n\t\tonPointerDown: (e: ReactPointerEvent<HTMLDivElement>) => void;\n\t\tonPointerMove: (e: ReactPointerEvent<HTMLDivElement>) => void;\n\t\tonPointerUp: (e: ReactPointerEvent<HTMLDivElement>) => void;\n\t\tonPointerCancel: (e: ReactPointerEvent<HTMLDivElement>) => void;\n\t};\n\treset: () => void;\n\tsetScale: (scale: number) => void;\n\tclearSnapBack: () => void;\n};\n\ntype SwipeAxis = \"x\" | \"y\";\n\nconst IDENTITY: ZoomPanTransform = { scale: 1, tx: 0, ty: 0 };\n\nfunction clamp(value: number, min: number, max: number) {\n\treturn Math.min(max, Math.max(min, value));\n}\n\nexport function zoomToward(\n\tprev: ZoomPanTransform,\n\tnextScale: number,\n\toriginX: number,\n\toriginY: number,\n\tminScale = ZOOM_PAN_MIN_SCALE,\n\tmaxScale = ZOOM_PAN_MAX_SCALE,\n): ZoomPanTransform {\n\tconst scale = clamp(nextScale, minScale, maxScale);\n\tif (scale === minScale) return { ...IDENTITY, scale: minScale };\n\tconst ratio = scale / prev.scale;\n\treturn {\n\t\tscale,\n\t\ttx: originX - (originX - prev.tx) * ratio,\n\t\tty: originY - (originY - prev.ty) * ratio,\n\t};\n}\n\nfunction pointerDistance(\n\ta: { x: number; y: number },\n\tb: { x: number; y: number },\n) {\n\treturn Math.hypot(b.x - a.x, b.y - a.y);\n}\n\nexport function prefersReducedMotion() {\n\tif (typeof window === \"undefined\" || !window.matchMedia) return false;\n\treturn window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n}\n\n/**\n * Pointer-driven pinch zoom, double-tap zoom toggle/reset, pan while zoomed,\n * and horizontal swipe-to-commit. Shared by ImageLightbox, MediaCarousel and\n * PdfViewer.\n */\nexport function useZoomPanGestures(\n\toptions: UseZoomPanGesturesOptions = {},\n): UseZoomPanGesturesResult {\n\tconst {\n\t\tminScale = ZOOM_PAN_MIN_SCALE,\n\t\tmaxScale = ZOOM_PAN_MAX_SCALE,\n\t\tswipeEnabled = true,\n\t\tonSwipeCommit,\n\t\twheelZoom = true,\n\t\tdoubleTap = \"reset\",\n\t} = options;\n\n\tconst [transform, setTransform] = useState<ZoomPanTransform>({\n\t\t...IDENTITY,\n\t\tscale: minScale,\n\t});\n\tconst transformRef = useRef(transform);\n\ttransformRef.current = transform;\n\n\tconst [isSwipeDragging, setIsSwipeDragging] = useState(false);\n\tconst [snapBack, setSnapBack] = useState(false);\n\n\tconst stageRef = useRef<HTMLDivElement>(null);\n\tconst pointersRef = useRef(new Map<number, { x: number; y: number }>());\n\tconst pinchStartRef = useRef<{\n\t\tdistance: number;\n\t\toriginX: number;\n\t\toriginY: number;\n\t\ttransform: ZoomPanTransform;\n\t} | null>(null);\n\tconst panRef = useRef<{\n\t\tpointerId: number;\n\t\tstartX: number;\n\t\tstartY: number;\n\t\toriginTx: number;\n\t\toriginTy: number;\n\t\tmoved: boolean;\n\t} | null>(null);\n\tconst swipeRef = useRef<{\n\t\tpointerId: number;\n\t\tstartX: number;\n\t\tstartY: number;\n\t\tmoved: boolean;\n\t\taxis: SwipeAxis | null;\n\t} | null>(null);\n\tconst lastTapRef = useRef<{ time: number; x: number; y: number } | null>(\n\t\tnull,\n\t);\n\tconst onSwipeCommitRef = useRef(onSwipeCommit);\n\tonSwipeCommitRef.current = onSwipeCommit;\n\tconst swipeEnabledRef = useRef(swipeEnabled);\n\tswipeEnabledRef.current = swipeEnabled;\n\tconst minScaleRef = useRef(minScale);\n\tminScaleRef.current = minScale;\n\tconst maxScaleRef = useRef(maxScale);\n\tmaxScaleRef.current = maxScale;\n\tconst doubleTapRef = useRef(doubleTap);\n\tdoubleTapRef.current = doubleTap;\n\n\tconst reset = useCallback(() => {\n\t\tsetTransform({ ...IDENTITY, scale: minScaleRef.current });\n\t\tsetIsSwipeDragging(false);\n\t\tsetSnapBack(false);\n\t}, []);\n\n\tconst setScale = useCallback((next: number) => {\n\t\tsetTransform((prev) =>\n\t\t\tzoomToward(prev, next, 0, 0, minScaleRef.current, maxScaleRef.current),\n\t\t);\n\t}, []);\n\n\tconst clearSnapBack = useCallback(() => {\n\t\tsetSnapBack(false);\n\t}, []);\n\n\tconst stageOrigin = useCallback((clientX: number, clientY: number) => {\n\t\tconst stage = stageRef.current;\n\t\tif (!stage) return { x: 0, y: 0 };\n\t\tconst rect = stage.getBoundingClientRect();\n\t\treturn {\n\t\t\tx: clientX - rect.left - rect.width / 2,\n\t\t\ty: clientY - rect.top - rect.height / 2,\n\t\t};\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (!wheelZoom) return;\n\t\tconst stage = stageRef.current;\n\t\tif (!stage) return;\n\n\t\tconst handleWheel = (e: WheelEvent) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tconst prev = transformRef.current;\n\t\t\tconst factor = e.deltaY > 0 ? 0.9 : 1.1;\n\t\t\tconst { x, y } = stageOrigin(e.clientX, e.clientY);\n\t\t\tsetTransform(\n\t\t\t\tzoomToward(\n\t\t\t\t\tprev,\n\t\t\t\t\tprev.scale * factor,\n\t\t\t\t\tx,\n\t\t\t\t\ty,\n\t\t\t\t\tminScaleRef.current,\n\t\t\t\t\tmaxScaleRef.current,\n\t\t\t\t),\n\t\t\t);\n\t\t};\n\n\t\tstage.addEventListener(\"wheel\", handleWheel, { passive: false });\n\t\treturn () => stage.removeEventListener(\"wheel\", handleWheel);\n\t}, [stageOrigin, wheelZoom]);\n\n\tfunction clearSwipe() {\n\t\tswipeRef.current = null;\n\t\tsetIsSwipeDragging(false);\n\t}\n\n\tfunction beginPinch() {\n\t\tconst pts = [...pointersRef.current.values()];\n\t\tconst [a, b] = pts;\n\t\tif (!a || !b) return;\n\t\tconst midX = (a.x + b.x) / 2;\n\t\tconst midY = (a.y + b.y) / 2;\n\t\tconst { x, y } = stageOrigin(midX, midY);\n\t\tpinchStartRef.current = {\n\t\t\tdistance: Math.max(pointerDistance(a, b), 1),\n\t\t\toriginX: x,\n\t\t\toriginY: y,\n\t\t\ttransform: { ...transformRef.current },\n\t\t};\n\t\tpanRef.current = null;\n\t\tclearSwipe();\n\t\tsetSnapBack(false);\n\t}\n\n\tfunction onPointerDown(e: ReactPointerEvent<HTMLDivElement>) {\n\t\te.stopPropagation();\n\t\tconst stage = stageRef.current;\n\t\tif (!stage) return;\n\n\t\tif (typeof stage.setPointerCapture === \"function\") {\n\t\t\tstage.setPointerCapture(e.pointerId);\n\t\t}\n\t\tpointersRef.current.set(e.pointerId, { x: e.clientX, y: e.clientY });\n\t\tsetSnapBack(false);\n\n\t\tif (pointersRef.current.size === 2) {\n\t\t\tbeginPinch();\n\t\t\treturn;\n\t\t}\n\n\t\tif (transformRef.current.scale > minScaleRef.current) {\n\t\t\tpanRef.current = {\n\t\t\t\tpointerId: e.pointerId,\n\t\t\t\tstartX: e.clientX,\n\t\t\t\tstartY: e.clientY,\n\t\t\t\toriginTx: transformRef.current.tx,\n\t\t\t\toriginTy: transformRef.current.ty,\n\t\t\t\tmoved: false,\n\t\t\t};\n\t\t\treturn;\n\t\t}\n\n\t\tif (swipeEnabledRef.current) {\n\t\t\tswipeRef.current = {\n\t\t\t\tpointerId: e.pointerId,\n\t\t\t\tstartX: e.clientX,\n\t\t\t\tstartY: e.clientY,\n\t\t\t\tmoved: false,\n\t\t\t\taxis: null,\n\t\t\t};\n\t\t\tsetIsSwipeDragging(true);\n\t\t}\n\t}\n\n\tfunction onPointerMove(e: ReactPointerEvent<HTMLDivElement>) {\n\t\tif (!pointersRef.current.has(e.pointerId)) return;\n\t\tpointersRef.current.set(e.pointerId, { x: e.clientX, y: e.clientY });\n\n\t\tconst pinchStart = pinchStartRef.current;\n\t\tif (pointersRef.current.size >= 2 && pinchStart) {\n\t\t\tconst pts = [...pointersRef.current.values()];\n\t\t\tconst [a, b] = pts;\n\t\t\tif (!a || !b) return;\n\t\t\tconst distance = Math.max(pointerDistance(a, b), 1);\n\t\t\tconst nextScale =\n\t\t\t\tpinchStart.transform.scale * (distance / pinchStart.distance);\n\t\t\tsetTransform(\n\t\t\t\tzoomToward(\n\t\t\t\t\tpinchStart.transform,\n\t\t\t\t\tnextScale,\n\t\t\t\t\tpinchStart.originX,\n\t\t\t\t\tpinchStart.originY,\n\t\t\t\t\tminScaleRef.current,\n\t\t\t\t\tmaxScaleRef.current,\n\t\t\t\t),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst pan = panRef.current;\n\t\tif (pan && pan.pointerId === e.pointerId) {\n\t\t\tconst dx = e.clientX - pan.startX;\n\t\t\tconst dy = e.clientY - pan.startY;\n\t\t\tif (Math.abs(dx) > 2 || Math.abs(dy) > 2) pan.moved = true;\n\t\t\tsetTransform((prev) => ({\n\t\t\t\t...prev,\n\t\t\t\ttx: pan.originTx + dx,\n\t\t\t\tty: pan.originTy + dy,\n\t\t\t}));\n\t\t\treturn;\n\t\t}\n\n\t\tconst swipe = swipeRef.current;\n\t\tif (!swipe || swipe.pointerId !== e.pointerId) return;\n\n\t\tconst dx = e.clientX - swipe.startX;\n\t\tconst dy = e.clientY - swipe.startY;\n\t\tif (Math.abs(dx) > 2 || Math.abs(dy) > 2) swipe.moved = true;\n\n\t\tif (swipe.axis === null) {\n\t\t\tconst absX = Math.abs(dx);\n\t\t\tconst absY = Math.abs(dy);\n\t\t\tif (absX < ZOOM_PAN_SWIPE_LOCK_PX && absY < ZOOM_PAN_SWIPE_LOCK_PX) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tswipe.axis = absX >= absY ? \"x\" : \"y\";\n\t\t\tif (swipe.axis === \"y\") {\n\t\t\t\tclearSwipe();\n\t\t\t\tsetTransform({ ...IDENTITY, scale: minScaleRef.current });\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (swipe.axis === \"x\") {\n\t\t\tsetTransform({\n\t\t\t\tscale: minScaleRef.current,\n\t\t\t\ttx: dx,\n\t\t\t\tty: 0,\n\t\t\t});\n\t\t}\n\t}\n\n\tfunction finishSwipe(e: ReactPointerEvent<HTMLDivElement>) {\n\t\tconst swipe = swipeRef.current;\n\t\tif (!swipe || swipe.pointerId !== e.pointerId) return false;\n\n\t\tconst dx = e.clientX - swipe.startX;\n\t\tconst wasMoved = swipe.moved;\n\t\tconst axis = swipe.axis;\n\t\tclearSwipe();\n\n\t\tif (axis === \"x\" && Math.abs(dx) >= ZOOM_PAN_SWIPE_COMMIT_PX) {\n\t\t\tonSwipeCommitRef.current?.(dx < 0 ? \"next\" : \"prev\");\n\t\t\treturn true;\n\t\t}\n\n\t\tif (wasMoved || transformRef.current.tx !== 0) {\n\t\t\tif (!prefersReducedMotion()) setSnapBack(true);\n\t\t\tsetTransform({ ...IDENTITY, scale: minScaleRef.current });\n\t\t}\n\t\treturn wasMoved;\n\t}\n\n\tfunction onPointerUp(e: ReactPointerEvent<HTMLDivElement>) {\n\t\tconst stage = stageRef.current;\n\t\tif (\n\t\t\tstage &&\n\t\t\ttypeof stage.hasPointerCapture === \"function\" &&\n\t\t\tstage.hasPointerCapture(e.pointerId) &&\n\t\t\ttypeof stage.releasePointerCapture === \"function\"\n\t\t) {\n\t\t\tstage.releasePointerCapture(e.pointerId);\n\t\t}\n\t\tpointersRef.current.delete(e.pointerId);\n\n\t\tif (pointersRef.current.size < 2) {\n\t\t\tpinchStartRef.current = null;\n\t\t}\n\t\tif (pointersRef.current.size === 1) {\n\t\t\tconst remaining = [...pointersRef.current.entries()][0];\n\t\t\tif (remaining && transformRef.current.scale > minScaleRef.current) {\n\t\t\t\tconst [pointerId, point] = remaining;\n\t\t\t\tpanRef.current = {\n\t\t\t\t\tpointerId,\n\t\t\t\t\tstartX: point.x,\n\t\t\t\t\tstartY: point.y,\n\t\t\t\t\toriginTx: transformRef.current.tx,\n\t\t\t\t\toriginTy: transformRef.current.ty,\n\t\t\t\t\tmoved: true,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tconst swipeHandled = finishSwipe(e);\n\t\tif (swipeHandled) return;\n\n\t\tconst pan = panRef.current;\n\t\tif (pan && pan.pointerId === e.pointerId) {\n\t\t\tconst wasMoved = pan.moved;\n\t\t\tpanRef.current = null;\n\t\t\tif (wasMoved) return;\n\t\t}\n\n\t\tif (pointersRef.current.size === 0 && e.button === 0) {\n\t\t\tconst now = Date.now();\n\t\t\tconst last = lastTapRef.current;\n\t\t\tif (\n\t\t\t\tlast &&\n\t\t\t\tnow - last.time < ZOOM_PAN_DOUBLE_TAP_MS &&\n\t\t\t\tMath.hypot(e.clientX - last.x, e.clientY - last.y) < 24\n\t\t\t) {\n\t\t\t\tlastTapRef.current = null;\n\t\t\t\tif (\n\t\t\t\t\tdoubleTapRef.current === \"toggle\" &&\n\t\t\t\t\ttransformRef.current.scale <= minScaleRef.current\n\t\t\t\t) {\n\t\t\t\t\tconst { x, y } = stageOrigin(e.clientX, e.clientY);\n\t\t\t\t\tsetTransform(\n\t\t\t\t\t\tzoomToward(\n\t\t\t\t\t\t\ttransformRef.current,\n\t\t\t\t\t\t\tMath.min(2, maxScaleRef.current),\n\t\t\t\t\t\t\tx,\n\t\t\t\t\t\t\ty,\n\t\t\t\t\t\t\tminScaleRef.current,\n\t\t\t\t\t\t\tmaxScaleRef.current,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\treset();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlastTapRef.current = { time: now, x: e.clientX, y: e.clientY };\n\t\t}\n\t}\n\n\treturn {\n\t\tstageRef,\n\t\ttransform,\n\t\tisDragging: isSwipeDragging,\n\t\tsnapBack,\n\t\thandlers: {\n\t\t\tonPointerDown,\n\t\t\tonPointerMove,\n\t\t\tonPointerUp,\n\t\t\tonPointerCancel: onPointerUp,\n\t\t},\n\t\treset,\n\t\tsetScale,\n\t\tclearSnapBack,\n\t};\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { AlertTriangle, Inbox, Loader2, type LucideIcon } 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\nexport type EmptyStateProps = {\n\ttitle: string;\n\tdescription?: string;\n\taction?: React.ReactNode;\n\ticon?: LucideIcon;\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} 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};\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}: 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<div className=\"flex shrink-0 items-center gap-1 overflow-x-auto border-b px-2 py-2\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\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\tonClick={() => setThumbsOpen((v) => !v)}\n\t\t\t\t\taria-label={\n\t\t\t\t\t\tthumbsOpen\n\t\t\t\t\t\t\t? (labels.hideThumbnails ?? \"Ocultar miniaturas\")\n\t\t\t\t\t\t\t: (labels.showThumbnails ?? \"Mostrar miniaturas\")\n\t\t\t\t\t}\n\t\t\t\t\taria-pressed={thumbsOpen}\n\t\t\t\t>\n\t\t\t\t\t{thumbsOpen ? (\n\t\t\t\t\t\t<PanelLeftClose className=\"h-4 w-4\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<PanelLeft className=\"h-4 w-4\" />\n\t\t\t\t\t)}\n\t\t\t\t</button>\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\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\tonClick={() => goToPage(pageNumber - 1)}\n\t\t\t\t\tdisabled={pageNumber <= 1}\n\t\t\t\t\taria-label={labels.previousPage ?? \"Página anterior\"}\n\t\t\t\t>\n\t\t\t\t\t<ChevronLeft className=\"h-4 w-4\" />\n\t\t\t\t</button>\n\n\t\t\t\t<form\n\t\t\t\t\tonSubmit={submitPageJump}\n\t\t\t\t\tclassName=\"flex shrink-0 items-center gap-1 text-xs text-muted-foreground\"\n\t\t\t\t>\n\t\t\t\t\t<label className=\"sr-only\" htmlFor=\"pdf-page-jump\">\n\t\t\t\t\t\t{labels.pageJumpAria ?? \"Ir a página\"}\n\t\t\t\t\t</label>\n\t\t\t\t\t<input\n\t\t\t\t\t\tid=\"pdf-page-jump\"\n\t\t\t\t\t\tvalue={pageDraft}\n\t\t\t\t\t\tonChange={(e) => setPageDraft(e.target.value)}\n\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\tinputMode=\"numeric\"\n\t\t\t\t\t/>\n\t\t\t\t\t<span className=\"min-w-10 whitespace-nowrap\">{pageOf}</span>\n\t\t\t\t</form>\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\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\tonClick={() => goToPage(pageNumber + 1)}\n\t\t\t\t\tdisabled={pageNumber >= numPages}\n\t\t\t\t\taria-label={labels.nextPage ?? \"Página siguiente\"}\n\t\t\t\t>\n\t\t\t\t\t<ChevronRight className=\"h-4 w-4\" />\n\t\t\t\t</button>\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\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\tonClick={zoomOut}\n\t\t\t\t\tdisabled={zoomIndex <= 0}\n\t\t\t\t\taria-label={labels.zoomOut ?? \"Alejar\"}\n\t\t\t\t>\n\t\t\t\t\t<ZoomOut className=\"h-4 w-4\" />\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\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\tonClick={fitMode === \"width\" ? fitPage : fitWidth}\n\t\t\t\t>\n\t\t\t\t\t{fitMode === \"width\"\n\t\t\t\t\t\t? (labels.fitPage ?? \"Ajustar página\")\n\t\t\t\t\t\t: (labels.fitWidth ?? \"Ajustar ancho\")}\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\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\tonClick={zoomIn}\n\t\t\t\t\tdisabled={zoomIndex >= ZOOM_STEPS.length - 1}\n\t\t\t\t\taria-label={labels.zoomIn ?? \"Acercar\"}\n\t\t\t\t>\n\t\t\t\t\t<ZoomIn className=\"h-4 w-4\" />\n\t\t\t\t</button>\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\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\tonClick={() => setRotation((r) => (r + 90) % 360)}\n\t\t\t\t\taria-label={labels.rotate ?? \"Rotar\"}\n\t\t\t\t>\n\t\t\t\t\t<RotateCw className=\"h-4 w-4\" />\n\t\t\t\t</button>\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\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\tonClick={() => void toggleFullscreen()}\n\t\t\t\t\taria-label={\n\t\t\t\t\t\tisFullscreen\n\t\t\t\t\t\t\t? (labels.exitFullscreen ?? \"Salir de pantalla completa\")\n\t\t\t\t\t\t\t: (labels.enterFullscreen ?? \"Pantalla completa\")\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{isFullscreen ? (\n\t\t\t\t\t\t<Minimize2 className=\"h-4 w-4\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Maximize2 className=\"h-4 w-4\" />\n\t\t\t\t\t)}\n\t\t\t\t</button>\n\n\t\t\t\t<a\n\t\t\t\t\thref={downloadHref}\n\t\t\t\t\tdownload={fileName}\n\t\t\t\t\taria-label={labels.downloadAria ?? labels.download ?? \"Descargar\"}\n\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>\n\t\t\t\t\t<Download className=\"h-4 w-4\" />\n\t\t\t\t\t<span className=\"hidden sm:inline\">\n\t\t\t\t\t\t{labels.download ?? \"Descargar\"}\n\t\t\t\t\t</span>\n\t\t\t\t</a>\n\t\t\t</div>\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sesionario/blocks",
3
- "version": "1.24.0",
3
+ "version": "1.25.0",
4
4
  "description": "Shared UI components for Sesionario applications",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",