(()=>{var y=` @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap'); :host { --kab-primary: #9C27B0; --kab-primary-dark: #6A1B9A; --kab-teal: #00BCD4; --kab-teal-dark: #0097a7; --kab-dark: #004051; --kab-bg: #F0F4F8; --kab-surface: #FFFFFF; --kab-border: #D8E4EE; --kab-text: #1a2a30; --kab-text-muted: #64748b; --kab-text-light: #94a3b8; --kab-shadow: rgba(0, 64, 81, 0.08); --kab-radius: 16px; --kab-radius-sm: 12px; --kab-font: 'Inter', system-ui, -apple-system, sans-serif; all: initial; font-family: var(--kab-font); font-size: 14px; line-height: 1.5; color: var(--kab-text); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } /* ─── Floating Button ─────────────────────────────────────────────── */ .kab-trigger { position: fixed; z-index: 2147483646; width: 60px; height: 60px; border-radius: 50%; border: none; cursor: pointer; display: flex; align-items: center; justify-content: center; background: linear-gradient(135deg, var(--kab-primary) 0%, var(--kab-primary-dark) 100%); box-shadow: 0 4px 20px rgba(156, 39, 176, 0.4), 0 2px 8px rgba(0, 0, 0, 0.1); transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); animation: kab-pop-in 0.4s cubic-bezier(0.34, 1.56, 0.64, 1) both; animation-delay: 0.5s; } .kab-trigger:hover { transform: scale(1.08); box-shadow: 0 6px 28px rgba(156, 39, 176, 0.5), 0 4px 12px rgba(0, 0, 0, 0.15); } .kab-trigger:active { transform: scale(0.95); } .kab-trigger.bottom-right { bottom: 24px; right: 24px; } .kab-trigger.bottom-left { bottom: 24px; left: 24px; } .kab-trigger svg { width: 28px; height: 28px; fill: white; transition: transform 0.3s ease; } .kab-trigger.open svg { transform: rotate(90deg) scale(0.9); } /* ─── Chat Window ─────────────────────────────────────────────────── */ .kab-window { position: fixed; z-index: 2147483647; width: 380px; height: 560px; max-height: calc(100vh - 100px); max-width: calc(100vw - 32px); border-radius: var(--kab-radius); background: var(--kab-bg); box-shadow: 0 12px 48px rgba(0, 0, 0, 0.18), 0 4px 16px rgba(0, 0, 0, 0.08); display: flex; flex-direction: column; overflow: hidden; opacity: 0; transform: translateY(20px) scale(0.95); pointer-events: none; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); } .kab-window.open { opacity: 1; transform: translateY(0) scale(1); pointer-events: auto; } .kab-window.bottom-right { bottom: 96px; right: 24px; } .kab-window.bottom-left { bottom: 96px; left: 24px; } /* ─── Header ──────────────────────────────────────────────────────── */ .kab-header { display: flex; align-items: center; gap: 10px; padding: 14px 16px; background: linear-gradient(135deg, var(--kab-dark) 0%, #00303d 100%); color: white; flex-shrink: 0; } .kab-header-logo { width: 32px; height: 32px; border-radius: 8px; display: flex; align-items: center; justify-content: center; background: rgba(255, 255, 255, 0.15); flex-shrink: 0; } .kab-header-logo svg { width: 18px; height: 18px; fill: white; } .kab-header-text { flex: 1; min-width: 0; } .kab-header-title { font-size: 14px; font-weight: 600; line-height: 1.3; } .kab-header-subtitle { font-size: 11px; opacity: 0.7; line-height: 1.3; } .kab-close { width: 32px; height: 32px; border-radius: 8px; border: none; background: rgba(255, 255, 255, 0.1); color: white; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: background 0.2s; flex-shrink: 0; } .kab-close:hover { background: rgba(255, 255, 255, 0.2); } .kab-close svg { width: 16px; height: 16px; stroke: currentColor; fill: none; stroke-width: 2; } /* ─── Messages Area ───────────────────────────────────────────────── */ .kab-messages { flex: 1; overflow-y: auto; padding: 16px; display: flex; flex-direction: column; gap: 14px; scroll-behavior: smooth; } .kab-messages::-webkit-scrollbar { width: 4px; } .kab-messages::-webkit-scrollbar-track { background: transparent; } .kab-messages::-webkit-scrollbar-thumb { background: var(--kab-border); border-radius: 999px; } /* ─── Message Bubbles ─────────────────────────────────────────────── */ .kab-msg { display: flex; gap: 8px; animation: kab-slide-up 0.3s ease both; } .kab-msg.user { flex-direction: row-reverse; } .kab-avatar { width: 28px; height: 28px; border-radius: 50%; display: flex; align-items: center; justify-content: center; flex-shrink: 0; margin-top: 2px; } .kab-avatar svg { width: 14px; height: 14px; } .kab-avatar.bot { background: #EBF5F8; border: 1px solid var(--kab-border); } .kab-avatar.bot svg { fill: var(--kab-dark); } .kab-avatar.user { background: linear-gradient(135deg, var(--kab-primary), var(--kab-primary-dark)); } .kab-avatar.user svg { fill: white; } .kab-bubble { max-width: 78%; padding: 10px 14px; font-size: 13px; line-height: 1.55; white-space: pre-wrap; word-break: break-word; } .kab-bubble.bot { background: var(--kab-surface); color: var(--kab-text); border: 1px solid var(--kab-border); box-shadow: 0 1px 4px var(--kab-shadow); border-radius: 16px 16px 16px 4px; } .kab-bubble.user { background: var(--kab-primary); color: white; border-radius: 16px 16px 4px 16px; margin-left: auto; } /* ─── Sources ─────────────────────────────────────────────────────── */ .kab-sources { margin-top: 6px; max-width: 78%; } .kab-sources-label { font-size: 11px; font-weight: 600; color: var(--kab-dark); margin-bottom: 4px; } .kab-source-item { display: flex; align-items: center; gap: 6px; padding: 6px 10px; background: #F5F9FC; border: 1px solid var(--kab-border); border-radius: 8px; font-size: 11px; color: var(--kab-text-muted); margin-bottom: 3px; cursor: pointer; transition: background 0.15s; } .kab-source-item:hover { background: #EBF3F8; } .kab-source-item svg { width: 12px; height: 12px; fill: var(--kab-teal); flex-shrink: 0; } .kab-source-text { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .kab-source-score { color: var(--kab-primary); font-weight: 500; flex-shrink: 0; } .kab-source-expanded { padding: 8px 10px; background: #FAFCFE; border-top: 1px solid #EBF3F8; font-size: 11px; color: var(--kab-text); line-height: 1.5; white-space: pre-wrap; } /* ─── Typing Indicator ────────────────────────────────────────────── */ .kab-typing { display: flex; gap: 8px; animation: kab-fade-in 0.3s ease; } .kab-typing-dots { display: flex; gap: 4px; align-items: center; padding: 12px 16px; background: var(--kab-surface); border: 1px solid var(--kab-border); border-radius: 16px 16px 16px 4px; } .kab-typing-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--kab-teal); animation: kab-pulse 1.4s ease-in-out infinite; } .kab-typing-dot:nth-child(2) { animation-delay: 0.2s; } .kab-typing-dot:nth-child(3) { animation-delay: 0.4s; } /* ─── Welcome Message ─────────────────────────────────────────────── */ .kab-welcome { display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; padding: 32px 24px; flex: 1; } .kab-welcome-icon { width: 52px; height: 52px; border-radius: 14px; display: flex; align-items: center; justify-content: center; margin-bottom: 14px; background: linear-gradient(135deg, rgba(156,39,176,0.12), rgba(0,64,81,0.12)); border: 1px solid rgba(156,39,176,0.2); font-size: 24px; } .kab-welcome-title { font-size: 15px; font-weight: 600; color: var(--kab-dark); margin-bottom: 6px; } .kab-welcome-text { font-size: 13px; color: var(--kab-text-muted); line-height: 1.5; } /* ─── Footer / Branding ───────────────────────────────────────────── */ .kab-brand { display: flex; align-items: center; justify-content: center; gap: 6px; padding: 6px 16px; background: var(--kab-surface); border-top: 1px solid var(--kab-border); flex-shrink: 0; } .kab-brand a { font-size: 11px; color: var(--kab-primary); text-decoration: none; font-weight: 500; transition: color 0.2s; } .kab-brand a:hover { color: var(--kab-primary-dark); text-decoration: underline; } .kab-brand span { font-size: 10px; color: var(--kab-text-light); } /* ─── Input Area ──────────────────────────────────────────────────── */ .kab-input-area { padding: 10px 14px; background: var(--kab-surface); border-top: 1px solid var(--kab-border); flex-shrink: 0; } .kab-input-row { display: flex; align-items: flex-end; gap: 8px; } .kab-input { flex: 1; min-width: 0; min-height: 40px; max-height: 100px; padding: 9px 14px; border: 1px solid var(--kab-border); border-radius: var(--kab-radius-sm); font-family: var(--kab-font); font-size: 16px; line-height: 1.5; color: var(--kab-text); background: var(--kab-bg); resize: none; outline: none; box-sizing: border-box; transition: border-color 0.2s, box-shadow 0.2s; } .kab-input::placeholder { color: var(--kab-text-light); } .kab-input:focus { border-color: var(--kab-teal); box-shadow: 0 0 0 3px rgba(0, 188, 212, 0.12); } .kab-input:disabled { opacity: 0.5; cursor: not-allowed; } .kab-send { width: 40px; height: 40px; border-radius: 10px; border: none; cursor: pointer; display: flex; align-items: center; justify-content: center; background: var(--kab-border); color: var(--kab-text-light); transition: all 0.2s; flex-shrink: 0; } .kab-send.active { background: linear-gradient(135deg, var(--kab-primary) 0%, var(--kab-primary-dark) 100%); color: white; box-shadow: 0 2px 8px rgba(156, 39, 176, 0.3); } .kab-send.active:hover { transform: scale(1.05); } .kab-send:disabled { opacity: 0.4; cursor: not-allowed; transform: none !important; } .kab-send svg { width: 16px; height: 16px; fill: currentColor; } .kab-counter { text-align: center; font-size: 10px; color: var(--kab-text-light); margin-top: 6px; } .kab-counter.warning { color: #e65100; } .kab-counter.limit { color: #c62828; font-weight: 500; } /* ─── Mobile Responsive ───────────────────────────────────────────── */ @media (max-width: 480px) { .kab-window { width: 100vw; height: 100dvh; height: 100vh; /* fallback for older browsers */ max-height: 100dvh; max-width: 100vw; border-radius: 0; top: 0 !important; bottom: auto !important; left: 0 !important; right: 0 !important; } @supports (height: 100dvh) { .kab-window { height: 100dvh; max-height: 100dvh; } } .kab-input-area { padding: 8px 10px; padding-bottom: max(8px, env(safe-area-inset-bottom)); } .kab-input-row { gap: 6px; } .kab-input { font-size: 16px; padding: 8px 12px; } .kab-send { width: 42px; min-width: 42px; height: 42px; } .kab-trigger { width: 52px; height: 52px; bottom: 16px !important; } .kab-trigger.bottom-right { right: 16px; } .kab-trigger.bottom-left { left: 16px; } } /* ─── Animations ──────────────────────────────────────────────────── */ @keyframes kab-pop-in { from { opacity: 0; transform: scale(0.5); } to { opacity: 1; transform: scale(1); } } @keyframes kab-slide-up { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } @keyframes kab-fade-in { from { opacity: 0; } to { opacity: 1; } } @keyframes kab-pulse { 0%, 100% { opacity: 0.3; transform: scale(0.8); } 50% { opacity: 1; transform: scale(1); } } /* ─── RTL Support (Hebrew) ────────────────────────────────────────── */ :host([dir="rtl"]) { direction: rtl; text-align: right; } :host([dir="rtl"]) .kab-header { direction: rtl; } :host([dir="rtl"]) .kab-bubble.bot { border-radius: 16px 16px 4px 16px; } :host([dir="rtl"]) .kab-bubble.user { border-radius: 16px 16px 16px 4px; margin-left: 0; margin-right: auto; } :host([dir="rtl"]) .kab-msg.user { flex-direction: row-reverse; } :host([dir="rtl"]) .kab-typing-dots { border-radius: 16px 16px 4px 16px; } :host([dir="rtl"]) .kab-input { direction: rtl; text-align: right; } :host([dir="rtl"]) .kab-source-item { direction: rtl; } :host([dir="rtl"]) .kab-welcome { direction: rtl; } `;var C="";function _(i){C=i.replace(/\/+$/,"")}async function S(i,e,t,a){let r=`${C}/api/v1/chat/widget`,o={query:i,session_id:e};t&&(o.collection=t),a&&(o.fallback_collection=a),console.log("[KabWidget] POST",r,"session:",e,t?`collection: ${t}`:"",a?`fallback: ${a}`:"");try{let s=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)});if(s.status===429)throw new Error("RATE_LIMIT");if(!s.ok){let l=await s.json().catch(()=>({}));throw console.error("[KabWidget] API error:",s.status,l),new Error(l.detail||`HTTP ${s.status}`)}return s.json()}catch(s){throw console.error("[KabWidget] Fetch failed:",s.message),s}}var I='',$='',T='',m='',M='',L='',A={ru:{headerTitle:"AI Ассистент",headerSubtitle:"Международная Академия Каббалы",welcomeTitle:"Добро пожаловать!",welcomeText:"Задайте вопрос о каббале и духовном развитии. Я отвечу на основе материалов Международной Академии Каббалы.",placeholder:"Введите ваш вопрос...",sources:"Источники:",poweredBy:"Powered by",brandName:"KabAcademy AI",tryFull:"Полная версия →",remaining:i=>`Осталось ${i} из 20 сообщений`,rateLimit:"Слишком много запросов. Пожалуйста, подождите немного.",error:"Произошла ошибка. Попробуйте ещё раз.",limitReached:"Лимит сообщений достигнут."},en:{headerTitle:"AI Assistant",headerSubtitle:"International Academy of Kabbalah",welcomeTitle:"Welcome!",welcomeText:"Ask a question about Kabbalah and spiritual development. I'll answer based on materials from the International Academy of Kabbalah.",placeholder:"Type your question...",sources:"Sources:",poweredBy:"Powered by",brandName:"KabAcademy AI",tryFull:"Full version →",remaining:i=>`${i} of 20 messages remaining`,rateLimit:"Too many requests. Please wait a moment.",error:"An error occurred. Please try again.",limitReached:"Message limit reached."},he:{headerTitle:"עוזר AI",headerSubtitle:"קבלה לעם",welcomeTitle:"!ברוכים הבאים",welcomeText:"שאלו שאלה על קבלה והתפתחות רוחנית. אענה על סמך חומרים מהאקדמיה הבינלאומית לקבלה.",placeholder:"...כתבו את השאלה שלכם",sources:":מקורות",poweredBy:"Powered by",brandName:"KabAcademy AI",tryFull:"← גרסה מלאה",remaining:i=>`${i} מתוך 20 הודעות נותרו`,rateLimit:"יותר מדי בקשות. אנא המתינו.",error:".אירעה שגיאה. נסו שוב",limitReached:".הגעתם למגבלת ההודעות"},es:{headerTitle:"Asistente IA",headerSubtitle:"Academia Internacional de Cabalá",welcomeTitle:"¡Bienvenido!",welcomeText:"Haz una pregunta sobre la Cabalá y el desarrollo espiritual. Responderé basándome en materiales de la Academia Internacional de Cabalá.",placeholder:"Escribe tu pregunta...",sources:"Fuentes:",poweredBy:"Powered by",brandName:"KabAcademy AI",tryFull:"Versión completa →",remaining:i=>`${i} de 20 mensajes restantes`,rateLimit:"Demasiadas solicitudes. Por favor, espera un momento.",error:"Ocurrió un error. Inténtalo de nuevo.",limitReached:"Límite de mensajes alcanzado."},pt:{headerTitle:"Assistente IA",headerSubtitle:"Academia Internacional de Cabala",welcomeTitle:"Bem-vindo!",welcomeText:"Faça uma pergunta sobre Cabala e desenvolvimento espiritual. Responderei com base nos materiais da Academia Internacional de Cabala.",placeholder:"Digite sua pergunta...",sources:"Fontes:",poweredBy:"Powered by",brandName:"KabAcademy AI",tryFull:"Versão completa →",remaining:i=>`${i} de 20 mensagens restantes`,rateLimit:"Muitas solicitações. Por favor, aguarde um momento.",error:"Ocorreu um erro. Tente novamente.",limitReached:"Limite de mensagens atingido."}};function F(){var t;let i=((t=document.documentElement.lang)==null?void 0:t.toLowerCase())||"";if(i.startsWith("ru"))return"ru";if(i.startsWith("he")||i.startsWith("iw"))return"he";if(i.startsWith("en"))return"en";let e=(navigator.language||"").toLowerCase();return e.startsWith("ru")?"ru":e.startsWith("he")||e.startsWith("iw")?"he":"en"}var x=class{constructor(e,t={}){this.root=e,this.lang=t.lang||F(),this.position=t.position||"bottom-right",this.collection=t.collection||"",this.fallbackCollection=t.fallbackCollection||"",this.hideSources=t.hideSources||!1,this.registrationUrl=t.registrationUrl||"https://ai.kabacademy.com/register",this.sessionId=this._getOrCreateSessionId(),this.messages=this._loadMessages(),this.isOpen=!1,this.isTyping=!1,this.messagesRemaining=20,this.strings=A[this.lang]||A.en,t.subtitle&&(this.strings={...this.strings,headerSubtitle:t.subtitle}),this._build(),this._bindEvents()}_getOrCreateSessionId(){let e="kab_widget_session_id",t=null;try{t=localStorage.getItem(e)}catch(a){}if(!t){try{t=crypto.randomUUID()}catch(a){t=this._uuidv4()}try{localStorage.setItem(e,t)}catch(a){}}return t}_uuidv4(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}_loadMessages(){try{let e=sessionStorage.getItem("kab_widget_messages");return e?JSON.parse(e):[]}catch(e){return[]}}_saveMessages(){try{sessionStorage.setItem("kab_widget_messages",JSON.stringify(this.messages))}catch(e){}}_build(){this.trigger=this._el("button",`kab-trigger ${this.position}`),this.trigger.innerHTML=I,this.trigger.setAttribute("aria-label",this.strings.headerTitle),this.root.appendChild(this.trigger),this.window=this._el("div",`kab-window ${this.position}`),this.window.innerHTML=`