@botuyo/chat-widget-standalone 1.0.20 → 1.0.21
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/botuyo-chat.es.js +5 -5
- package/dist/botuyo-chat.es.js.map +1 -1
- package/dist/botuyo-chat.umd.js +1 -1
- package/dist/botuyo-chat.umd.js.map +1 -1
- package/dist/{chunk-audio-BC2C5zBr.js → chunk-audio-C0i6pIL6.js} +2 -2
- package/dist/{chunk-audio-BC2C5zBr.js.map → chunk-audio-C0i6pIL6.js.map} +1 -1
- package/dist/{chunk-chat-ui-B7kqQ_fa.js → chunk-chat-ui-_0LmcZf0.js} +32 -32
- package/dist/{chunk-chat-ui-B7kqQ_fa.js.map → chunk-chat-ui-_0LmcZf0.js.map} +1 -1
- package/dist/{chunk-gallery-CkQhlsCL.js → chunk-gallery-8F2X2Wky.js} +2 -2
- package/dist/{chunk-gallery-CkQhlsCL.js.map → chunk-gallery-8F2X2Wky.js.map} +1 -1
- package/dist/src/chat-widget/ChatWidget.d.ts.map +1 -1
- package/dist/src/chat-widget/components/ChatWindow.d.ts +5 -1
- package/dist/src/chat-widget/components/ChatWindow.d.ts.map +1 -1
- package/dist/src/chat-widget/components/VoiceCallOverlay.d.ts +6 -1
- package/dist/src/chat-widget/components/VoiceCallOverlay.d.ts.map +1 -1
- package/dist/stats-umd.html +1 -1
- package/dist/stats.html +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{jsx as e,jsxs as r,Fragment as a}from"react/jsx-runtime";import{memo as o,useState as l}from"react";import{u as t,c as s,Z as i,b as n,d as c,X as d}from"./chunk-chat-ui-
|
|
1
|
+
import{jsx as e,jsxs as r,Fragment as a}from"react/jsx-runtime";import{memo as o,useState as l}from"react";import{u as t,c as s,Z as i,b as n,d as c,X as d}from"./chunk-chat-ui-_0LmcZf0.js";const h=o(function({images:o,radius:d="rounded-lg"}){const{t:h}=t("extracted"),[m,b]=l(0),[g,p]=l(!1),v=()=>{b(e=>(e+1)%o.length)},f=()=>{b(e=>(e-1+o.length)%o.length)},x=e=>{b(e),p(!0)},[k,w]=l(/* @__PURE__ */new Set),N=e=>{w(r=>new Set(r).add(e))};return 1===o.length?/* @__PURE__ */e("div",{className:"my-3 relative group",children:k.has(0)?/* @__PURE__ */r("div",{className:s("w-full h-48 flex flex-col items-center justify-center","border bg-muted text-muted-foreground",d),style:{borderColor:"hsl(var(--border))"},children:[
|
|
2
2
|
/* @__PURE__ */e("svg",{className:"w-12 h-12 mb-2 opacity-50",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:/* @__PURE__ */e("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z"})}),
|
|
3
3
|
/* @__PURE__ */e("span",{className:"text-sm",children:"Imagen no disponible"})]}):/* @__PURE__ */r(a,{children:[
|
|
4
4
|
/* @__PURE__ */e("img",{src:o[0].src,alt:o[0].alt||"Imagen",className:s("w-full h-auto object-cover cursor-pointer transition-all duration-300","border shadow-soft-md hover:shadow-soft-lg hover:scale-[1.02]",d),style:{borderColor:"hsl(var(--border))"},loading:"lazy",onClick:()=>x(0),onError:()=>N(0)}),
|
|
@@ -21,4 +21,4 @@ return r("div",{className:"fixed inset-0 z-[100000] bg-black/95 backdrop-blur-sm
|
|
|
21
21
|
/* @__PURE__ */e("button",{onClick:e=>{e.stopPropagation(),h()},className:"absolute left-4 bg-white/10 hover:bg-white/20 p-3 rounded-full transition-all hover:scale-110 active:scale-95 z-10","aria-label":"Anterior",children:/* @__PURE__ */e(n,{size:32,className:"text-white"})}),
|
|
22
22
|
/* @__PURE__ */e("button",{onClick:e=>{e.stopPropagation(),i()},className:"absolute right-4 bg-white/10 hover:bg-white/20 p-3 rounded-full transition-all hover:scale-110 active:scale-95 z-10","aria-label":"Siguiente",children:/* @__PURE__ */e(c,{size:32,className:"text-white"})})]}),
|
|
23
23
|
/* @__PURE__ */e("img",{src:o[l].src,alt:o[l].alt||`Imagen ${l+1}`,className:"max-w-[90%] max-h-[90vh] object-contain",onClick:e=>e.stopPropagation()})]})}export{h as Gallery};
|
|
24
|
-
//# sourceMappingURL=chunk-gallery-
|
|
24
|
+
//# sourceMappingURL=chunk-gallery-8F2X2Wky.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk-gallery-CkQhlsCL.js","sources":["../src/chat-widget/components/Gallery.tsx"],"sourcesContent":["/**\r\n * @package @botuyo/chat-widget\r\n * Gallery - Componente visual para mostrar galerías de imágenes\r\n */\r\n\r\n'use client'\r\n\r\nimport { useState, memo } from 'react'\r\nimport { useTranslations } from '@/chat-widget/i18n'\r\nimport { ChevronLeft, ChevronRight, X, ZoomIn } from './Icons'\r\nimport { cn } from '@/lib/utils'\r\n\r\ninterface GalleryProps {\r\n images: Array<{ src: string; alt?: string }>\r\n radius?: string\r\n}\r\n\r\nexport type { GalleryProps }\r\n\r\nexport const Gallery = memo(function Gallery({ images, radius = 'rounded-lg' }: GalleryProps) {\r\n const { t } = useTranslations('extracted')\r\n const [currentIndex, setCurrentIndex] = useState(0)\r\n const [isLightboxOpen, setIsLightboxOpen] = useState(false)\r\n\r\n const nextImage = () => {\r\n setCurrentIndex(prev => (prev + 1) % images.length)\r\n }\r\n\r\n const prevImage = () => {\r\n setCurrentIndex(prev => (prev - 1 + images.length) % images.length)\r\n }\r\n\r\n const openLightbox = (index: number) => {\r\n setCurrentIndex(index)\r\n setIsLightboxOpen(true)\r\n }\r\n\r\n const [imageError, setImageError] = useState<Set<number>>(new Set())\r\n\r\n const handleImageError = (index: number) => {\r\n setImageError(prev => new Set(prev).add(index))\r\n }\r\n\r\n // Si solo hay 1 imagen, mostrar como imagen simple\r\n if (images.length === 1) {\r\n return (\r\n <div className=\"my-3 relative group\">\r\n {imageError.has(0) ? (\r\n <div\r\n className={cn(\r\n 'w-full h-48 flex flex-col items-center justify-center',\r\n 'border bg-muted text-muted-foreground',\r\n radius\r\n )}\r\n style={{ borderColor: 'hsl(var(--border))' }}\r\n >\r\n <svg\r\n className=\"w-12 h-12 mb-2 opacity-50\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\"\r\n />\r\n </svg>\r\n <span className=\"text-sm\">Imagen no disponible</span>\r\n </div>\r\n ) : (\r\n <>\r\n <img\r\n src={images[0].src}\r\n alt={images[0].alt || 'Imagen'}\r\n className={cn(\r\n 'w-full h-auto object-cover cursor-pointer transition-all duration-300',\r\n 'border shadow-soft-md hover:shadow-soft-lg hover:scale-[1.02]',\r\n radius\r\n )}\r\n style={{ borderColor: 'hsl(var(--border))' }}\r\n loading=\"lazy\"\r\n onClick={() => openLightbox(0)}\r\n onError={() => handleImageError(0)}\r\n />\r\n <div className=\"absolute top-2 right-2 bg-black/50 backdrop-blur-sm p-1.5 rounded-full opacity-0 group-hover:opacity-100 transition-opacity\">\r\n <ZoomIn size={16} className=\"text-white\" />\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n )\r\n }\r\n\r\n // Si hay 2-3 imágenes, mostrar grid horizontal\r\n if (images.length <= 3) {\r\n return (\r\n <div className={cn('my-3 grid gap-2', images.length === 2 ? 'grid-cols-2' : 'grid-cols-3')}>\r\n {images.map((img, idx) => (\r\n <div key={idx} className=\"relative group overflow-hidden\">\r\n {imageError.has(idx) ? (\r\n <div\r\n className={cn(\r\n 'w-full h-32 flex flex-col items-center justify-center',\r\n 'border bg-muted text-muted-foreground',\r\n radius\r\n )}\r\n >\r\n <svg\r\n className=\"w-8 h-8 opacity-50\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\"\r\n />\r\n </svg>\r\n </div>\r\n ) : (\r\n <>\r\n <img\r\n src={img.src}\r\n alt={img.alt || `Imagen ${idx + 1}`}\r\n className={cn(\r\n 'w-full h-32 object-cover cursor-pointer transition-all duration-300',\r\n 'border border-border shadow-soft-md hover:shadow-soft-lg hover:scale-110',\r\n radius\r\n )}\r\n loading=\"lazy\"\r\n onClick={() => openLightbox(idx)}\r\n onError={() => handleImageError(idx)}\r\n />\r\n <div className=\"absolute inset-0 bg-gradient-to-t from-black/40 to-transparent opacity-0 group-hover:opacity-100 transition-opacity flex items-end justify-end p-2\">\r\n <span className=\"text-white text-xs font-bold bg-black/50 backdrop-blur-sm px-2 py-1 rounded-full\">\r\n {idx + 1}/{images.length}\r\n </span>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n ))}\r\n\r\n {/* Lightbox */}\r\n {isLightboxOpen && (\r\n <Lightbox\r\n images={images}\r\n currentIndex={currentIndex}\r\n onClose={() => setIsLightboxOpen(false)}\r\n onNext={nextImage}\r\n onPrev={prevImage}\r\n />\r\n )}\r\n </div>\r\n )\r\n }\r\n\r\n // Si hay 4+ imágenes, mostrar carrusel con thumbnails\r\n return (\r\n <div className=\"my-3 space-y-2\">\r\n {/* Imagen Principal */}\r\n <div className=\"relative group\">\r\n {imageError.has(currentIndex) ? (\r\n <div\r\n className={cn(\r\n 'w-full h-56 flex flex-col items-center justify-center',\r\n 'border bg-muted text-muted-foreground',\r\n radius\r\n )}\r\n style={{ borderColor: 'hsl(var(--border))' }}\r\n >\r\n <svg\r\n className=\"w-12 h-12 mb-2 opacity-50\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\"\r\n />\r\n </svg>\r\n <span className=\"text-sm\">Imagen no disponible</span>\r\n </div>\r\n ) : (\r\n <>\r\n <img\r\n src={images[currentIndex].src}\r\n alt={images[currentIndex].alt || `Imagen ${currentIndex + 1}`}\r\n className={cn(\r\n 'w-full h-56 object-cover cursor-pointer transition-all duration-300',\r\n 'border shadow-soft-md',\r\n radius\r\n )}\r\n style={{ borderColor: 'hsl(var(--border))' }}\r\n loading=\"lazy\"\r\n onClick={() => openLightbox(currentIndex)}\r\n onError={() => handleImageError(currentIndex)}\r\n />\r\n\r\n {/* Overlay con controles */}\r\n <div className=\"absolute inset-0 bg-gradient-to-t from-black/60 via-transparent to-black/20 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-between px-3\">\r\n <button\r\n onClick={prevImage}\r\n className=\"p-2 rounded-full shadow-soft-lg transition-all hover:scale-110 active:scale-95\"\r\n style={{\r\n backgroundColor: 'hsl(var(--card) / 0.9)',\r\n color: 'hsl(var(--foreground))',\r\n }}\r\n aria-label={t('anterior')}\r\n >\r\n <ChevronLeft size={20} />\r\n </button>\r\n <button\r\n onClick={nextImage}\r\n className=\"p-2 rounded-full shadow-soft-lg transition-all hover:scale-110 active:scale-95\"\r\n style={{\r\n backgroundColor: 'hsl(var(--card) / 0.9)',\r\n color: 'hsl(var(--foreground))',\r\n }}\r\n aria-label={t('siguiente')}\r\n >\r\n <ChevronRight size={20} />\r\n </button>\r\n </div>\r\n\r\n {/* Badge con contador */}\r\n <div className=\"absolute top-3 right-3 bg-black/70 backdrop-blur-sm px-3 py-1 rounded-full\">\r\n <span className=\"text-white text-xs font-bold\">\r\n {currentIndex + 1} / {images.length}\r\n </span>\r\n </div>\r\n\r\n {/* Icono de zoom */}\r\n <div className=\"absolute bottom-3 right-3 bg-black/70 backdrop-blur-sm p-2 rounded-full opacity-0 group-hover:opacity-100 transition-opacity\">\r\n <ZoomIn size={16} className=\"text-white\" />\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n\r\n {/* Thumbnails */}\r\n <div className=\"flex gap-2 overflow-x-auto pb-2 scrollbar-thin scrollbar-thumb-border scrollbar-track-transparent\">\r\n {images.map((img, idx) => (\r\n <button\r\n key={idx}\r\n onClick={() => setCurrentIndex(idx)}\r\n className={cn(\r\n 'flex-shrink-0 w-16 h-16 overflow-hidden transition-all duration-300 relative',\r\n 'border-2 hover:scale-110',\r\n radius,\r\n currentIndex === idx\r\n ? 'border-[hsl(210,90%,50%)] ring-2 ring-[hsl(210,90%,50%)]/30 scale-105'\r\n : 'border-border hover:border-[hsl(210,90%,70%)] opacity-70 hover:opacity-100'\r\n )}\r\n >\r\n {imageError.has(idx) ? (\r\n <div className=\"w-full h-full flex items-center justify-center bg-muted\">\r\n <svg\r\n className=\"w-6 h-6 opacity-50\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\"\r\n />\r\n </svg>\r\n </div>\r\n ) : (\r\n <img\r\n src={img.src}\r\n alt={img.alt || `Thumbnail ${idx + 1}`}\r\n className=\"w-full h-full object-cover\"\r\n loading=\"lazy\"\r\n onError={() => handleImageError(idx)}\r\n />\r\n )}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Lightbox */}\r\n {isLightboxOpen && (\r\n <Lightbox\r\n images={images}\r\n currentIndex={currentIndex}\r\n onClose={() => setIsLightboxOpen(false)}\r\n onNext={nextImage}\r\n onPrev={prevImage}\r\n />\r\n )}\r\n </div>\r\n )\r\n})\r\n\r\n// ==========================================\r\n// 🔍 LIGHTBOX (Modal de Imagen)\r\n// ==========================================\r\n\r\ninterface LightboxProps {\r\n images: Array<{ src: string; alt?: string }>\r\n currentIndex: number\r\n onClose: () => void\r\n onNext: () => void\r\n onPrev: () => void\r\n}\r\n\r\nfunction Lightbox({ images, currentIndex, onClose, onNext, onPrev }: LightboxProps) {\r\n const { t } = useTranslations('extracted')\r\n return (\r\n <div\r\n className=\"fixed inset-0 z-[100000] bg-black/95 backdrop-blur-sm flex items-center justify-center animate-in fade-in duration-200\"\r\n onClick={onClose}\r\n >\r\n {/* Botón Cerrar */}\r\n <button\r\n onClick={onClose}\r\n className=\"absolute top-4 right-4 bg-white/10 hover:bg-white/20 p-2 rounded-full transition-all hover:scale-110 active:scale-95 z-10\"\r\n aria-label={t('cerrar')}\r\n >\r\n <X size={24} className=\"text-white\" />\r\n </button>\r\n\r\n {/* Contador */}\r\n <div className=\"absolute top-4 left-4 bg-white/10 backdrop-blur-sm px-4 py-2 rounded-full z-10\">\r\n <span className=\"text-white text-sm font-bold\">\r\n {currentIndex + 1} / {images.length}\r\n </span>\r\n </div>\r\n\r\n {/* Controles de Navegación */}\r\n {images.length > 1 && (\r\n <>\r\n <button\r\n onClick={e => {\r\n e.stopPropagation()\r\n onPrev()\r\n }}\r\n className=\"absolute left-4 bg-white/10 hover:bg-white/20 p-3 rounded-full transition-all hover:scale-110 active:scale-95 z-10\"\r\n aria-label=\"Anterior\"\r\n >\r\n <ChevronLeft size={32} className=\"text-white\" />\r\n </button>\r\n <button\r\n onClick={e => {\r\n e.stopPropagation()\r\n onNext()\r\n }}\r\n className=\"absolute right-4 bg-white/10 hover:bg-white/20 p-3 rounded-full transition-all hover:scale-110 active:scale-95 z-10\"\r\n aria-label=\"Siguiente\"\r\n >\r\n <ChevronRight size={32} className=\"text-white\" />\r\n </button>\r\n </>\r\n )}\r\n\r\n {/* Imagen */}\r\n <img\r\n src={images[currentIndex].src}\r\n alt={images[currentIndex].alt || `Imagen ${currentIndex + 1}`}\r\n className=\"max-w-[90%] max-h-[90vh] object-contain\"\r\n onClick={e => e.stopPropagation()}\r\n />\r\n </div>\r\n )\r\n}\r\n"],"names":["Gallery","memo","images","radius","t","useTranslations","currentIndex","setCurrentIndex","useState","isLightboxOpen","setIsLightboxOpen","nextImage","prev","length","prevImage","openLightbox","index","imageError","setImageError","Set","handleImageError","add","className","children","has","jsxs","cn","style","borderColor","jsx","fill","stroke","viewBox","strokeLinecap","strokeLinejoin","strokeWidth","d","Fragment","src","alt","loading","onClick","onError","ZoomIn","size","map","img","idx","Lightbox","onClose","onNext","onPrev","backgroundColor","color","ChevronLeft","ChevronRight","X","e","stopPropagation"],"mappings":"8LAmBO,MAAMA,EAAUC,EAAK,UAAiBC,OAAEA,EAAAC,OAAQA,EAAS,eAC9D,MAAMC,EAAEA,GAAMC,EAAgB,cACvBC,EAAcC,GAAmBC,EAAS,IAC1CC,EAAgBC,GAAqBF,GAAS,GAE/CG,EAAY,KAChBJ,EAAgBK,IAASA,EAAO,GAAKV,EAAOW,SAGxCC,EAAY,KAChBP,MAAyBK,EAAO,EAAIV,EAAOW,QAAUX,EAAOW,SAGxDE,EAAgBC,IACpBT,EAAgBS,GAChBN,GAAkB,KAGbO,EAAYC,GAAiBV,iBAAsB,IAAIW,KAExDC,EAAoBJ,IACxBE,KAAsB,IAAIC,IAAIP,GAAMS,IAAIL,KAI1C,OAAsB,IAAlBd,EAAOW,wBAEN,MAAA,CAAIS,UAAU,sBACZC,SAAAN,EAAWO,IAAI,kBACdC,EAAC,MAAA,CACCH,UAAWI,EACT,wDACA,wCACAvB,GAEFwB,MAAO,CAAEC,YAAa,sBAEtBL,SAAA;eAAAM,EAAC,MAAA,CACCP,UAAU,4BACVQ,KAAK,OACLC,OAAO,eACPC,QAAQ,YAERT,wBAAAM,EAAC,OAAA,CACCI,cAAc,QACdC,eAAe,QACfC,YAAa,EACbC,EAAE;iBAGL,OAAA,CAAKd,UAAU,UAAUC,SAAA,2CAG5BE,EAAAY,EAAA,CACEd,SAAA;eAAAM,EAAC,MAAA,CACCS,IAAKpC,EAAO,GAAGoC,IACfC,IAAKrC,EAAO,GAAGqC,KAAO,SACtBjB,UAAWI,EACT,wEACA,gEACAvB,GAEFwB,MAAO,CAAEC,YAAa,sBACtBY,QAAQ,OACRC,QAAS,IAAM1B,EAAa,GAC5B2B,QAAS,IAAMtB,EAAiB;eAElCS,EAAC,MAAA,CAAIP,UAAU,8HACbC,wBAAAM,EAACc,GAAOC,KAAM,GAAItB,UAAU,sBASpCpB,EAAOW,QAAU,iBAEjBY,EAAC,MAAA,CAAIH,UAAWI,EAAG,kBAAqC,IAAlBxB,EAAOW,OAAe,cAAgB,eACzEU,SAAA,CAAArB,EAAO2C,IAAI,CAACC,EAAKC,mBAChBlB,EAAC,MAAA,CAAcP,UAAU,iCACtBC,SAAAN,EAAWO,IAAIuB,kBACdlB,EAAC,MAAA,CACCP,UAAWI,EACT,wDACA,wCACAvB,GAGFoB,wBAAAM,EAAC,MAAA,CACCP,UAAU,qBACVQ,KAAK,OACLC,OAAO,eACPC,QAAQ,YAERT,wBAAAM,EAAC,OAAA,CACCI,cAAc,QACdC,eAAe,QACfC,YAAa,EACbC,EAAE,iLAKRX,EAAAY,EAAA,CACEd,SAAA;eAAAM,EAAC,MAAA,CACCS,IAAKQ,EAAIR,IACTC,IAAKO,EAAIP,KAAO,UAAUQ,EAAM,IAChCzB,UAAWI,EACT,sEACA,2EACAvB,GAEFqC,QAAQ,OACRC,QAAS,IAAM1B,EAAagC,GAC5BL,QAAS,IAAMtB,EAAiB2B;iBAEjC,MAAA,CAAIzB,UAAU,qJACbC,wBAAAE,EAAC,OAAA,CAAKH,UAAU,mFACbC,SAAA,CAAAwB,EAAM,EAAE,IAAE7C,EAAOW,gBAvClBkC,IAgDXtC,kBACCoB,EAACmB,EAAA,CACC9C,SACAI,eACA2C,QAAS,IAAMvC,GAAkB,GACjCwC,OAAQvC,EACRwC,OAAQrC,sBAShBW,EAAC,MAAA,CAAIH,UAAU,iBAEbC,SAAA;eAAAM,EAAC,OAAIP,UAAU,iBACZC,SAAAN,EAAWO,IAAIlB,kBACdmB,EAAC,MAAA,CACCH,UAAWI,EACT,wDACA,wCACAvB,GAEFwB,MAAO,CAAEC,YAAa,sBAEtBL,SAAA;eAAAM,EAAC,MAAA,CACCP,UAAU,4BACVQ,KAAK,OACLC,OAAO,eACPC,QAAQ,YAERT,wBAAAM,EAAC,OAAA,CACCI,cAAc,QACdC,eAAe,QACfC,YAAa,EACbC,EAAE;iBAGL,OAAA,CAAKd,UAAU,UAAUC,SAAA,2CAG5BE,EAAAY,EAAA,CACEd,SAAA;eAAAM,EAAC,MAAA,CACCS,IAAKpC,EAAOI,GAAcgC,IAC1BC,IAAKrC,EAAOI,GAAciC,KAAO,UAAUjC,EAAe,IAC1DgB,UAAWI,EACT,sEACA,wBACAvB,GAEFwB,MAAO,CAAEC,YAAa,sBACtBY,QAAQ,OACRC,QAAS,IAAM1B,EAAaT,GAC5BoC,QAAS,IAAMtB,EAAiBd;eAIlCmB,EAAC,MAAA,CAAIH,UAAU,0KACbC,SAAA;eAAAM,EAAC,SAAA,CACCY,QAAS3B,EACTQ,UAAU,iFACVK,MAAO,CACLyB,gBAAiB,yBACjBC,MAAO,0BAET,aAAYjD,EAAE,YAEdmB,wBAAAM,EAACyB,EAAA,CAAYV,KAAM;eAErBf,EAAC,SAAA,CACCY,QAAS9B,EACTW,UAAU,iFACVK,MAAO,CACLyB,gBAAiB,yBACjBC,MAAO,0BAET,aAAYjD,EAAE,aAEdmB,wBAAAM,EAAC0B,EAAA,CAAaX,KAAM;iBAKvB,MAAA,CAAItB,UAAU,6EACbC,wBAAAE,EAAC,OAAA,CAAKH,UAAU,+BACbC,SAAA,CAAAjB,EAAe,EAAE,MAAIJ,EAAOW;eAKjCgB,EAAC,MAAA,CAAIP,UAAU,+HACbC,wBAAAM,EAACc,GAAOC,KAAM,GAAItB,UAAU;eAOpCO,EAAC,OAAIP,UAAU,oGACZC,WAAOsB,IAAI,CAACC,EAAKC,mBAChBlB,EAAC,SAAA,CAECY,QAAS,IAAMlC,EAAgBwC,GAC/BzB,UAAWI,EACT,+EACA,2BACAvB,EACAG,IAAiByC,EACb,wEACA,8EAGLxB,WAAWC,IAAIuB,oBACb,MAAA,CAAIzB,UAAU,0DACbC,wBAAAM,EAAC,MAAA,CACCP,UAAU,qBACVQ,KAAK,OACLC,OAAO,eACPC,QAAQ,YAERT,wBAAAM,EAAC,OAAA,CACCI,cAAc,QACdC,eAAe,QACfC,YAAa,EACbC,EAAE,iLAKRP,EAAC,MAAA,CACCS,IAAKQ,EAAIR,IACTC,IAAKO,EAAIP,KAAO,aAAaQ,EAAM,IACnCzB,UAAU,6BACVkB,QAAQ,OACRE,QAAS,IAAMtB,EAAiB2B,MAjC/BA,MAyCVtC,kBACCoB,EAACmB,EAAA,CACC9C,SACAI,eACA2C,QAAS,IAAMvC,GAAkB,GACjCwC,OAAQvC,EACRwC,OAAQrC,MAKlB,GAcA,SAASkC,GAAS9C,OAAEA,EAAAI,aAAQA,UAAc2C,EAAAC,OAASA,EAAAC,OAAQA,IACzD,MAAM/C,EAAEA,GAAMC,EAAgB;AAC9B,OACEoB,EAAC,MAAA,CACCH,UAAU,yHACVmB,QAASQ,EAGT1B,SAAA;eAAAM,EAAC,SAAA,CACCY,QAASQ,EACT3B,UAAU,4HACV,aAAYlB,EAAE,UAEdmB,0BAACiC,EAAA,CAAEZ,KAAM,GAAItB,UAAU;iBAIxB,MAAA,CAAIA,UAAU,iFACbC,wBAAAE,EAAC,OAAA,CAAKH,UAAU,+BACbC,SAAA,CAAAjB,EAAe,EAAE,MAAIJ,EAAOW,YAKhCX,EAAOW,OAAS,kBACfY,EAAAY,EAAA,CACEd,SAAA;eAAAM,EAAC,SAAA,CACCY,QAASgB,IACPA,EAAEC,kBACFP,KAEF7B,UAAU,qHACV,aAAW,WAEXC,0BAAC+B,EAAA,CAAYV,KAAM,GAAItB,UAAU;eAEnCO,EAAC,SAAA,CACCY,QAASgB,IACPA,EAAEC,kBACFR,KAEF5B,UAAU,sHACV,aAAW,YAEXC,0BAACgC,EAAA,CAAaX,KAAM,GAAItB,UAAU;eAMxCO,EAAC,MAAA,CACCS,IAAKpC,EAAOI,GAAcgC,IAC1BC,IAAKrC,EAAOI,GAAciC,KAAO,UAAUjC,EAAe,IAC1DgB,UAAU,0CACVmB,QAASgB,GAAKA,EAAEC,sBAIxB"}
|
|
1
|
+
{"version":3,"file":"chunk-gallery-8F2X2Wky.js","sources":["../src/chat-widget/components/Gallery.tsx"],"sourcesContent":["/**\r\n * @package @botuyo/chat-widget\r\n * Gallery - Componente visual para mostrar galerías de imágenes\r\n */\r\n\r\n'use client'\r\n\r\nimport { useState, memo } from 'react'\r\nimport { useTranslations } from '@/chat-widget/i18n'\r\nimport { ChevronLeft, ChevronRight, X, ZoomIn } from './Icons'\r\nimport { cn } from '@/lib/utils'\r\n\r\ninterface GalleryProps {\r\n images: Array<{ src: string; alt?: string }>\r\n radius?: string\r\n}\r\n\r\nexport type { GalleryProps }\r\n\r\nexport const Gallery = memo(function Gallery({ images, radius = 'rounded-lg' }: GalleryProps) {\r\n const { t } = useTranslations('extracted')\r\n const [currentIndex, setCurrentIndex] = useState(0)\r\n const [isLightboxOpen, setIsLightboxOpen] = useState(false)\r\n\r\n const nextImage = () => {\r\n setCurrentIndex(prev => (prev + 1) % images.length)\r\n }\r\n\r\n const prevImage = () => {\r\n setCurrentIndex(prev => (prev - 1 + images.length) % images.length)\r\n }\r\n\r\n const openLightbox = (index: number) => {\r\n setCurrentIndex(index)\r\n setIsLightboxOpen(true)\r\n }\r\n\r\n const [imageError, setImageError] = useState<Set<number>>(new Set())\r\n\r\n const handleImageError = (index: number) => {\r\n setImageError(prev => new Set(prev).add(index))\r\n }\r\n\r\n // Si solo hay 1 imagen, mostrar como imagen simple\r\n if (images.length === 1) {\r\n return (\r\n <div className=\"my-3 relative group\">\r\n {imageError.has(0) ? (\r\n <div\r\n className={cn(\r\n 'w-full h-48 flex flex-col items-center justify-center',\r\n 'border bg-muted text-muted-foreground',\r\n radius\r\n )}\r\n style={{ borderColor: 'hsl(var(--border))' }}\r\n >\r\n <svg\r\n className=\"w-12 h-12 mb-2 opacity-50\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\"\r\n />\r\n </svg>\r\n <span className=\"text-sm\">Imagen no disponible</span>\r\n </div>\r\n ) : (\r\n <>\r\n <img\r\n src={images[0].src}\r\n alt={images[0].alt || 'Imagen'}\r\n className={cn(\r\n 'w-full h-auto object-cover cursor-pointer transition-all duration-300',\r\n 'border shadow-soft-md hover:shadow-soft-lg hover:scale-[1.02]',\r\n radius\r\n )}\r\n style={{ borderColor: 'hsl(var(--border))' }}\r\n loading=\"lazy\"\r\n onClick={() => openLightbox(0)}\r\n onError={() => handleImageError(0)}\r\n />\r\n <div className=\"absolute top-2 right-2 bg-black/50 backdrop-blur-sm p-1.5 rounded-full opacity-0 group-hover:opacity-100 transition-opacity\">\r\n <ZoomIn size={16} className=\"text-white\" />\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n )\r\n }\r\n\r\n // Si hay 2-3 imágenes, mostrar grid horizontal\r\n if (images.length <= 3) {\r\n return (\r\n <div className={cn('my-3 grid gap-2', images.length === 2 ? 'grid-cols-2' : 'grid-cols-3')}>\r\n {images.map((img, idx) => (\r\n <div key={idx} className=\"relative group overflow-hidden\">\r\n {imageError.has(idx) ? (\r\n <div\r\n className={cn(\r\n 'w-full h-32 flex flex-col items-center justify-center',\r\n 'border bg-muted text-muted-foreground',\r\n radius\r\n )}\r\n >\r\n <svg\r\n className=\"w-8 h-8 opacity-50\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\"\r\n />\r\n </svg>\r\n </div>\r\n ) : (\r\n <>\r\n <img\r\n src={img.src}\r\n alt={img.alt || `Imagen ${idx + 1}`}\r\n className={cn(\r\n 'w-full h-32 object-cover cursor-pointer transition-all duration-300',\r\n 'border border-border shadow-soft-md hover:shadow-soft-lg hover:scale-110',\r\n radius\r\n )}\r\n loading=\"lazy\"\r\n onClick={() => openLightbox(idx)}\r\n onError={() => handleImageError(idx)}\r\n />\r\n <div className=\"absolute inset-0 bg-gradient-to-t from-black/40 to-transparent opacity-0 group-hover:opacity-100 transition-opacity flex items-end justify-end p-2\">\r\n <span className=\"text-white text-xs font-bold bg-black/50 backdrop-blur-sm px-2 py-1 rounded-full\">\r\n {idx + 1}/{images.length}\r\n </span>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n ))}\r\n\r\n {/* Lightbox */}\r\n {isLightboxOpen && (\r\n <Lightbox\r\n images={images}\r\n currentIndex={currentIndex}\r\n onClose={() => setIsLightboxOpen(false)}\r\n onNext={nextImage}\r\n onPrev={prevImage}\r\n />\r\n )}\r\n </div>\r\n )\r\n }\r\n\r\n // Si hay 4+ imágenes, mostrar carrusel con thumbnails\r\n return (\r\n <div className=\"my-3 space-y-2\">\r\n {/* Imagen Principal */}\r\n <div className=\"relative group\">\r\n {imageError.has(currentIndex) ? (\r\n <div\r\n className={cn(\r\n 'w-full h-56 flex flex-col items-center justify-center',\r\n 'border bg-muted text-muted-foreground',\r\n radius\r\n )}\r\n style={{ borderColor: 'hsl(var(--border))' }}\r\n >\r\n <svg\r\n className=\"w-12 h-12 mb-2 opacity-50\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\"\r\n />\r\n </svg>\r\n <span className=\"text-sm\">Imagen no disponible</span>\r\n </div>\r\n ) : (\r\n <>\r\n <img\r\n src={images[currentIndex].src}\r\n alt={images[currentIndex].alt || `Imagen ${currentIndex + 1}`}\r\n className={cn(\r\n 'w-full h-56 object-cover cursor-pointer transition-all duration-300',\r\n 'border shadow-soft-md',\r\n radius\r\n )}\r\n style={{ borderColor: 'hsl(var(--border))' }}\r\n loading=\"lazy\"\r\n onClick={() => openLightbox(currentIndex)}\r\n onError={() => handleImageError(currentIndex)}\r\n />\r\n\r\n {/* Overlay con controles */}\r\n <div className=\"absolute inset-0 bg-gradient-to-t from-black/60 via-transparent to-black/20 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-between px-3\">\r\n <button\r\n onClick={prevImage}\r\n className=\"p-2 rounded-full shadow-soft-lg transition-all hover:scale-110 active:scale-95\"\r\n style={{\r\n backgroundColor: 'hsl(var(--card) / 0.9)',\r\n color: 'hsl(var(--foreground))',\r\n }}\r\n aria-label={t('anterior')}\r\n >\r\n <ChevronLeft size={20} />\r\n </button>\r\n <button\r\n onClick={nextImage}\r\n className=\"p-2 rounded-full shadow-soft-lg transition-all hover:scale-110 active:scale-95\"\r\n style={{\r\n backgroundColor: 'hsl(var(--card) / 0.9)',\r\n color: 'hsl(var(--foreground))',\r\n }}\r\n aria-label={t('siguiente')}\r\n >\r\n <ChevronRight size={20} />\r\n </button>\r\n </div>\r\n\r\n {/* Badge con contador */}\r\n <div className=\"absolute top-3 right-3 bg-black/70 backdrop-blur-sm px-3 py-1 rounded-full\">\r\n <span className=\"text-white text-xs font-bold\">\r\n {currentIndex + 1} / {images.length}\r\n </span>\r\n </div>\r\n\r\n {/* Icono de zoom */}\r\n <div className=\"absolute bottom-3 right-3 bg-black/70 backdrop-blur-sm p-2 rounded-full opacity-0 group-hover:opacity-100 transition-opacity\">\r\n <ZoomIn size={16} className=\"text-white\" />\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n\r\n {/* Thumbnails */}\r\n <div className=\"flex gap-2 overflow-x-auto pb-2 scrollbar-thin scrollbar-thumb-border scrollbar-track-transparent\">\r\n {images.map((img, idx) => (\r\n <button\r\n key={idx}\r\n onClick={() => setCurrentIndex(idx)}\r\n className={cn(\r\n 'flex-shrink-0 w-16 h-16 overflow-hidden transition-all duration-300 relative',\r\n 'border-2 hover:scale-110',\r\n radius,\r\n currentIndex === idx\r\n ? 'border-[hsl(210,90%,50%)] ring-2 ring-[hsl(210,90%,50%)]/30 scale-105'\r\n : 'border-border hover:border-[hsl(210,90%,70%)] opacity-70 hover:opacity-100'\r\n )}\r\n >\r\n {imageError.has(idx) ? (\r\n <div className=\"w-full h-full flex items-center justify-center bg-muted\">\r\n <svg\r\n className=\"w-6 h-6 opacity-50\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\"\r\n />\r\n </svg>\r\n </div>\r\n ) : (\r\n <img\r\n src={img.src}\r\n alt={img.alt || `Thumbnail ${idx + 1}`}\r\n className=\"w-full h-full object-cover\"\r\n loading=\"lazy\"\r\n onError={() => handleImageError(idx)}\r\n />\r\n )}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Lightbox */}\r\n {isLightboxOpen && (\r\n <Lightbox\r\n images={images}\r\n currentIndex={currentIndex}\r\n onClose={() => setIsLightboxOpen(false)}\r\n onNext={nextImage}\r\n onPrev={prevImage}\r\n />\r\n )}\r\n </div>\r\n )\r\n})\r\n\r\n// ==========================================\r\n// 🔍 LIGHTBOX (Modal de Imagen)\r\n// ==========================================\r\n\r\ninterface LightboxProps {\r\n images: Array<{ src: string; alt?: string }>\r\n currentIndex: number\r\n onClose: () => void\r\n onNext: () => void\r\n onPrev: () => void\r\n}\r\n\r\nfunction Lightbox({ images, currentIndex, onClose, onNext, onPrev }: LightboxProps) {\r\n const { t } = useTranslations('extracted')\r\n return (\r\n <div\r\n className=\"fixed inset-0 z-[100000] bg-black/95 backdrop-blur-sm flex items-center justify-center animate-in fade-in duration-200\"\r\n onClick={onClose}\r\n >\r\n {/* Botón Cerrar */}\r\n <button\r\n onClick={onClose}\r\n className=\"absolute top-4 right-4 bg-white/10 hover:bg-white/20 p-2 rounded-full transition-all hover:scale-110 active:scale-95 z-10\"\r\n aria-label={t('cerrar')}\r\n >\r\n <X size={24} className=\"text-white\" />\r\n </button>\r\n\r\n {/* Contador */}\r\n <div className=\"absolute top-4 left-4 bg-white/10 backdrop-blur-sm px-4 py-2 rounded-full z-10\">\r\n <span className=\"text-white text-sm font-bold\">\r\n {currentIndex + 1} / {images.length}\r\n </span>\r\n </div>\r\n\r\n {/* Controles de Navegación */}\r\n {images.length > 1 && (\r\n <>\r\n <button\r\n onClick={e => {\r\n e.stopPropagation()\r\n onPrev()\r\n }}\r\n className=\"absolute left-4 bg-white/10 hover:bg-white/20 p-3 rounded-full transition-all hover:scale-110 active:scale-95 z-10\"\r\n aria-label=\"Anterior\"\r\n >\r\n <ChevronLeft size={32} className=\"text-white\" />\r\n </button>\r\n <button\r\n onClick={e => {\r\n e.stopPropagation()\r\n onNext()\r\n }}\r\n className=\"absolute right-4 bg-white/10 hover:bg-white/20 p-3 rounded-full transition-all hover:scale-110 active:scale-95 z-10\"\r\n aria-label=\"Siguiente\"\r\n >\r\n <ChevronRight size={32} className=\"text-white\" />\r\n </button>\r\n </>\r\n )}\r\n\r\n {/* Imagen */}\r\n <img\r\n src={images[currentIndex].src}\r\n alt={images[currentIndex].alt || `Imagen ${currentIndex + 1}`}\r\n className=\"max-w-[90%] max-h-[90vh] object-contain\"\r\n onClick={e => e.stopPropagation()}\r\n />\r\n </div>\r\n )\r\n}\r\n"],"names":["Gallery","memo","images","radius","t","useTranslations","currentIndex","setCurrentIndex","useState","isLightboxOpen","setIsLightboxOpen","nextImage","prev","length","prevImage","openLightbox","index","imageError","setImageError","Set","handleImageError","add","className","children","has","jsxs","cn","style","borderColor","jsx","fill","stroke","viewBox","strokeLinecap","strokeLinejoin","strokeWidth","d","Fragment","src","alt","loading","onClick","onError","ZoomIn","size","map","img","idx","Lightbox","onClose","onNext","onPrev","backgroundColor","color","ChevronLeft","ChevronRight","X","e","stopPropagation"],"mappings":"8LAmBO,MAAMA,EAAUC,EAAK,UAAiBC,OAAEA,EAAAC,OAAQA,EAAS,eAC9D,MAAMC,EAAEA,GAAMC,EAAgB,cACvBC,EAAcC,GAAmBC,EAAS,IAC1CC,EAAgBC,GAAqBF,GAAS,GAE/CG,EAAY,KAChBJ,EAAgBK,IAASA,EAAO,GAAKV,EAAOW,SAGxCC,EAAY,KAChBP,MAAyBK,EAAO,EAAIV,EAAOW,QAAUX,EAAOW,SAGxDE,EAAgBC,IACpBT,EAAgBS,GAChBN,GAAkB,KAGbO,EAAYC,GAAiBV,iBAAsB,IAAIW,KAExDC,EAAoBJ,IACxBE,KAAsB,IAAIC,IAAIP,GAAMS,IAAIL,KAI1C,OAAsB,IAAlBd,EAAOW,wBAEN,MAAA,CAAIS,UAAU,sBACZC,SAAAN,EAAWO,IAAI,kBACdC,EAAC,MAAA,CACCH,UAAWI,EACT,wDACA,wCACAvB,GAEFwB,MAAO,CAAEC,YAAa,sBAEtBL,SAAA;eAAAM,EAAC,MAAA,CACCP,UAAU,4BACVQ,KAAK,OACLC,OAAO,eACPC,QAAQ,YAERT,wBAAAM,EAAC,OAAA,CACCI,cAAc,QACdC,eAAe,QACfC,YAAa,EACbC,EAAE;iBAGL,OAAA,CAAKd,UAAU,UAAUC,SAAA,2CAG5BE,EAAAY,EAAA,CACEd,SAAA;eAAAM,EAAC,MAAA,CACCS,IAAKpC,EAAO,GAAGoC,IACfC,IAAKrC,EAAO,GAAGqC,KAAO,SACtBjB,UAAWI,EACT,wEACA,gEACAvB,GAEFwB,MAAO,CAAEC,YAAa,sBACtBY,QAAQ,OACRC,QAAS,IAAM1B,EAAa,GAC5B2B,QAAS,IAAMtB,EAAiB;eAElCS,EAAC,MAAA,CAAIP,UAAU,8HACbC,wBAAAM,EAACc,GAAOC,KAAM,GAAItB,UAAU,sBASpCpB,EAAOW,QAAU,iBAEjBY,EAAC,MAAA,CAAIH,UAAWI,EAAG,kBAAqC,IAAlBxB,EAAOW,OAAe,cAAgB,eACzEU,SAAA,CAAArB,EAAO2C,IAAI,CAACC,EAAKC,mBAChBlB,EAAC,MAAA,CAAcP,UAAU,iCACtBC,SAAAN,EAAWO,IAAIuB,kBACdlB,EAAC,MAAA,CACCP,UAAWI,EACT,wDACA,wCACAvB,GAGFoB,wBAAAM,EAAC,MAAA,CACCP,UAAU,qBACVQ,KAAK,OACLC,OAAO,eACPC,QAAQ,YAERT,wBAAAM,EAAC,OAAA,CACCI,cAAc,QACdC,eAAe,QACfC,YAAa,EACbC,EAAE,iLAKRX,EAAAY,EAAA,CACEd,SAAA;eAAAM,EAAC,MAAA,CACCS,IAAKQ,EAAIR,IACTC,IAAKO,EAAIP,KAAO,UAAUQ,EAAM,IAChCzB,UAAWI,EACT,sEACA,2EACAvB,GAEFqC,QAAQ,OACRC,QAAS,IAAM1B,EAAagC,GAC5BL,QAAS,IAAMtB,EAAiB2B;iBAEjC,MAAA,CAAIzB,UAAU,qJACbC,wBAAAE,EAAC,OAAA,CAAKH,UAAU,mFACbC,SAAA,CAAAwB,EAAM,EAAE,IAAE7C,EAAOW,gBAvClBkC,IAgDXtC,kBACCoB,EAACmB,EAAA,CACC9C,SACAI,eACA2C,QAAS,IAAMvC,GAAkB,GACjCwC,OAAQvC,EACRwC,OAAQrC,sBAShBW,EAAC,MAAA,CAAIH,UAAU,iBAEbC,SAAA;eAAAM,EAAC,OAAIP,UAAU,iBACZC,SAAAN,EAAWO,IAAIlB,kBACdmB,EAAC,MAAA,CACCH,UAAWI,EACT,wDACA,wCACAvB,GAEFwB,MAAO,CAAEC,YAAa,sBAEtBL,SAAA;eAAAM,EAAC,MAAA,CACCP,UAAU,4BACVQ,KAAK,OACLC,OAAO,eACPC,QAAQ,YAERT,wBAAAM,EAAC,OAAA,CACCI,cAAc,QACdC,eAAe,QACfC,YAAa,EACbC,EAAE;iBAGL,OAAA,CAAKd,UAAU,UAAUC,SAAA,2CAG5BE,EAAAY,EAAA,CACEd,SAAA;eAAAM,EAAC,MAAA,CACCS,IAAKpC,EAAOI,GAAcgC,IAC1BC,IAAKrC,EAAOI,GAAciC,KAAO,UAAUjC,EAAe,IAC1DgB,UAAWI,EACT,sEACA,wBACAvB,GAEFwB,MAAO,CAAEC,YAAa,sBACtBY,QAAQ,OACRC,QAAS,IAAM1B,EAAaT,GAC5BoC,QAAS,IAAMtB,EAAiBd;eAIlCmB,EAAC,MAAA,CAAIH,UAAU,0KACbC,SAAA;eAAAM,EAAC,SAAA,CACCY,QAAS3B,EACTQ,UAAU,iFACVK,MAAO,CACLyB,gBAAiB,yBACjBC,MAAO,0BAET,aAAYjD,EAAE,YAEdmB,wBAAAM,EAACyB,EAAA,CAAYV,KAAM;eAErBf,EAAC,SAAA,CACCY,QAAS9B,EACTW,UAAU,iFACVK,MAAO,CACLyB,gBAAiB,yBACjBC,MAAO,0BAET,aAAYjD,EAAE,aAEdmB,wBAAAM,EAAC0B,EAAA,CAAaX,KAAM;iBAKvB,MAAA,CAAItB,UAAU,6EACbC,wBAAAE,EAAC,OAAA,CAAKH,UAAU,+BACbC,SAAA,CAAAjB,EAAe,EAAE,MAAIJ,EAAOW;eAKjCgB,EAAC,MAAA,CAAIP,UAAU,+HACbC,wBAAAM,EAACc,GAAOC,KAAM,GAAItB,UAAU;eAOpCO,EAAC,OAAIP,UAAU,oGACZC,WAAOsB,IAAI,CAACC,EAAKC,mBAChBlB,EAAC,SAAA,CAECY,QAAS,IAAMlC,EAAgBwC,GAC/BzB,UAAWI,EACT,+EACA,2BACAvB,EACAG,IAAiByC,EACb,wEACA,8EAGLxB,WAAWC,IAAIuB,oBACb,MAAA,CAAIzB,UAAU,0DACbC,wBAAAM,EAAC,MAAA,CACCP,UAAU,qBACVQ,KAAK,OACLC,OAAO,eACPC,QAAQ,YAERT,wBAAAM,EAAC,OAAA,CACCI,cAAc,QACdC,eAAe,QACfC,YAAa,EACbC,EAAE,iLAKRP,EAAC,MAAA,CACCS,IAAKQ,EAAIR,IACTC,IAAKO,EAAIP,KAAO,aAAaQ,EAAM,IACnCzB,UAAU,6BACVkB,QAAQ,OACRE,QAAS,IAAMtB,EAAiB2B,MAjC/BA,MAyCVtC,kBACCoB,EAACmB,EAAA,CACC9C,SACAI,eACA2C,QAAS,IAAMvC,GAAkB,GACjCwC,OAAQvC,EACRwC,OAAQrC,MAKlB,GAcA,SAASkC,GAAS9C,OAAEA,EAAAI,aAAQA,UAAc2C,EAAAC,OAASA,EAAAC,OAAQA,IACzD,MAAM/C,EAAEA,GAAMC,EAAgB;AAC9B,OACEoB,EAAC,MAAA,CACCH,UAAU,yHACVmB,QAASQ,EAGT1B,SAAA;eAAAM,EAAC,SAAA,CACCY,QAASQ,EACT3B,UAAU,4HACV,aAAYlB,EAAE,UAEdmB,0BAACiC,EAAA,CAAEZ,KAAM,GAAItB,UAAU;iBAIxB,MAAA,CAAIA,UAAU,iFACbC,wBAAAE,EAAC,OAAA,CAAKH,UAAU,+BACbC,SAAA,CAAAjB,EAAe,EAAE,MAAIJ,EAAOW,YAKhCX,EAAOW,OAAS,kBACfY,EAAAY,EAAA,CACEd,SAAA;eAAAM,EAAC,SAAA,CACCY,QAASgB,IACPA,EAAEC,kBACFP,KAEF7B,UAAU,qHACV,aAAW,WAEXC,0BAAC+B,EAAA,CAAYV,KAAM,GAAItB,UAAU;eAEnCO,EAAC,SAAA,CACCY,QAASgB,IACPA,EAAEC,kBACFR,KAEF5B,UAAU,sHACV,aAAW,YAEXC,0BAACgC,EAAA,CAAaX,KAAM,GAAItB,UAAU;eAMxCO,EAAC,MAAA,CACCS,IAAKpC,EAAOI,GAAcgC,IAC1BC,IAAKrC,EAAOI,GAAciC,KAAO,UAAUjC,EAAe,IAC1DgB,UAAU,0CACVmB,QAASgB,GAAKA,EAAEC,sBAIxB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatWidget.d.ts","sourceRoot":"","sources":["../../../src/chat-widget/ChatWidget.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAY9C,OAAO,iCAAiC,CAAA;AAExC,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"ChatWidget.d.ts","sourceRoot":"","sources":["../../../src/chat-widget/ChatWidget.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAY9C,OAAO,iCAAiC,CAAA;AAExC,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,2CAmMhD"}
|
|
@@ -23,7 +23,11 @@ export interface ChatWindowProps {
|
|
|
23
23
|
longitude: number;
|
|
24
24
|
}) => void;
|
|
25
25
|
getSocket?: () => any;
|
|
26
|
+
onAddVoiceMessage?: (message: {
|
|
27
|
+
sender: 'user' | 'bot';
|
|
28
|
+
content: string;
|
|
29
|
+
}) => void;
|
|
26
30
|
theme?: import('../types').ChatTheme;
|
|
27
31
|
}
|
|
28
|
-
export declare function ChatWindow({ isOpen, isConnected, isTyping, messages, botName, logoUrl, welcomeMessage, inputPlaceholder, primaryColor, mediaConfig, onClose, onSendMessage, bubbleStyles, avatars, onSendAttachment, onSendLocation, getSocket, theme, }: ChatWindowProps): import("react/jsx-runtime").JSX.Element | null;
|
|
32
|
+
export declare function ChatWindow({ isOpen, isConnected, isTyping, messages, botName, logoUrl, welcomeMessage, inputPlaceholder, primaryColor, mediaConfig, onClose, onSendMessage, bubbleStyles, avatars, onSendAttachment, onSendLocation, getSocket, onAddVoiceMessage, theme, }: ChatWindowProps): import("react/jsx-runtime").JSX.Element | null;
|
|
29
33
|
//# sourceMappingURL=ChatWindow.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatWindow.d.ts","sourceRoot":"","sources":["../../../../src/chat-widget/components/ChatWindow.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAOtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAI7C,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,OAAO,CAAA;IACf,WAAW,EAAE,OAAO,CAAA;IACpB,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,QAAQ,CAAC,EAAE,cAAc,GAAG,aAAa,CAAA;IACzC,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,OAAO,CAAC,EAAE,gBAAgB,CAAA;IAC1B,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,KAAK,IAAI,CAAA;IACzE,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;IAC5E,SAAS,CAAC,EAAE,MAAM,GAAG,CAAA;IACrB,KAAK,CAAC,EAAE,OAAO,UAAU,EAAE,SAAS,CAAA;CACrC;AAED,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,OAAe,EACf,OAAO,EACP,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,OAAO,EACP,aAAa,EACb,YAAY,EACZ,OAAO,EACP,gBAAgB,EAChB,cAAc,EACd,SAAS,EACT,KAAK,GACN,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"ChatWindow.d.ts","sourceRoot":"","sources":["../../../../src/chat-widget/components/ChatWindow.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAOtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAI7C,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,OAAO,CAAA;IACf,WAAW,EAAE,OAAO,CAAA;IACpB,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,QAAQ,CAAC,EAAE,cAAc,GAAG,aAAa,CAAA;IACzC,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,OAAO,CAAC,EAAE,gBAAgB,CAAA;IAC1B,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,KAAK,IAAI,CAAA;IACzE,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;IAC5E,SAAS,CAAC,EAAE,MAAM,GAAG,CAAA;IACrB,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;IAClF,KAAK,CAAC,EAAE,OAAO,UAAU,EAAE,SAAS,CAAA;CACrC;AAED,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,OAAe,EACf,OAAO,EACP,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,OAAO,EACP,aAAa,EACb,YAAY,EACZ,OAAO,EACP,gBAAgB,EAChB,cAAc,EACd,SAAS,EACT,iBAAiB,EACjB,KAAK,GACN,EAAE,eAAe,kDAoPjB"}
|
|
@@ -49,8 +49,13 @@ interface VoiceCallOverlayProps {
|
|
|
49
49
|
logoUrl?: string;
|
|
50
50
|
/** Voice overlay configuration for full customizability */
|
|
51
51
|
voiceConfig?: VoiceOverlayConfig;
|
|
52
|
+
/** Callback to persist voice transcripts to the main chat history */
|
|
53
|
+
onAddMessage?: (message: {
|
|
54
|
+
sender: 'user' | 'bot';
|
|
55
|
+
content: string;
|
|
56
|
+
}) => void;
|
|
52
57
|
}
|
|
53
58
|
type CallState = 'idle' | 'connecting' | 'listening' | 'speaking' | 'thinking';
|
|
54
|
-
export declare function VoiceCallOverlay({ isOpen, onClose, primaryColor, getSocket, avatars, logoUrl, voiceConfig, }: VoiceCallOverlayProps): import("react/jsx-runtime").JSX.Element | null;
|
|
59
|
+
export declare function VoiceCallOverlay({ isOpen, onClose, primaryColor, getSocket, avatars, logoUrl, voiceConfig, onAddMessage, }: VoiceCallOverlayProps): import("react/jsx-runtime").JSX.Element | null;
|
|
55
60
|
export {};
|
|
56
61
|
//# sourceMappingURL=VoiceCallOverlay.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VoiceCallOverlay.d.ts","sourceRoot":"","sources":["../../../../src/chat-widget/components/VoiceCallOverlay.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAGlD,8CAA8C;AAC9C,MAAM,WAAW,kBAAkB;IACjC,0DAA0D;IAC1D,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,8DAA8D;IAC9D,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,2DAA2D;IAC3D,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,4DAA4D;IAC5D,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,yEAAyE;IACzE,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,sEAAsE;IACtE,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,mDAAmD;IACnD,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,kDAAkD;IAClD,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,wDAAwD;IACxD,aAAa,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAC/C,qCAAqC;IACrC,YAAY,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAA;IACjD,0CAA0C;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,gDAAgD;IAChD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,gDAAgD;IAChD,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,UAAU,qBAAqB;IAC7B,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,CAAA;IACrB,OAAO,CAAC,EAAE,gBAAgB,CAAA;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"VoiceCallOverlay.d.ts","sourceRoot":"","sources":["../../../../src/chat-widget/components/VoiceCallOverlay.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAGlD,8CAA8C;AAC9C,MAAM,WAAW,kBAAkB;IACjC,0DAA0D;IAC1D,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,8DAA8D;IAC9D,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,2DAA2D;IAC3D,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,4DAA4D;IAC5D,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,yEAAyE;IACzE,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,sEAAsE;IACtE,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,mDAAmD;IACnD,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,kDAAkD;IAClD,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,wDAAwD;IACxD,aAAa,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAC/C,qCAAqC;IACrC,YAAY,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAA;IACjD,0CAA0C;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,gDAAgD;IAChD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,gDAAgD;IAChD,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,UAAU,qBAAqB;IAC7B,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,CAAA;IACrB,OAAO,CAAC,EAAE,gBAAgB,CAAA;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,kBAAkB,CAAA;IAChC,qEAAqE;IACrE,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;CAC9E;AAED,KAAK,SAAS,GAAG,MAAM,GAAG,YAAY,GAAG,WAAW,GAAG,UAAU,GAAG,UAAU,CAAA;AAwT9E,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,OAAO,EACP,YAAwB,EACxB,SAAS,EACT,OAAO,EACP,OAAO,EACP,WAAW,EACX,YAAY,GACb,EAAE,qBAAqB,kDA2pBvB"}
|