@akropolys/kiku 2.2.2 → 2.2.3
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/chunk-NRT5W2SK.mjs +3 -0
- package/dist/chunk-NRT5W2SK.mjs.map +1 -0
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/lazy-CDXIO5AJ.mjs +39 -0
- package/dist/lazy-CDXIO5AJ.mjs.map +1 -0
- package/dist/styles.css +1 -1
- package/dist/styles.css.map +1 -1
- package/package.json +65 -65
- package/dist/chunk-RWGHGIF7.mjs +0 -3
- package/dist/chunk-RWGHGIF7.mjs.map +0 -1
- package/dist/lazy-HMHFTX2M.mjs +0 -39
- package/dist/lazy-HMHFTX2M.mjs.map +0 -1
package/dist/index.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import{a as
|
|
2
|
+
import{a as z,c as E,d as K,e as Y,h as Z,o as j}from"./chunk-NRT5W2SK.mjs";import{useState as ee,useEffect as te,useRef as oe}from"react";import{useSearch as ye,useAkropolysContext as ge,useCardFields as ke}from"@akropolys/sdk";import{Fragment as se,jsx as o,jsxs as i}from"react/jsx-runtime";var ne=()=>i("svg",{width:"15",height:"15",viewBox:"0 0 20 20",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",children:[o("circle",{cx:"8.5",cy:"8.5",r:"5.5"}),o("line",{x1:"13",y1:"13",x2:"18",y2:"18"})]});function be({placeholder:u="Search products\u2026",limit:b=10,debounceMs:w=150,onSelect:v,className:p,inputClassName:C,dropdownClassName:N,renderResult:S,theme:a,classNames:h={}}){let[n,m]=ee(""),[s,r]=ee(!1),{results:c,loading:A,search:H,clear:f}=ye({debounceMs:w}),g=ge(),R=ke(),P=oe(null),F=oe(!1);te(()=>{if(F.current){F.current=!1;return}if(!n.trim()){f(),r(!1);return}r(!0),H(n,b)},[n]),te(()=>{let e=L=>{P.current&&!P.current.contains(L.target)&&r(!1)};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[]);let l=e=>{n.trim()&&g.api.searchVector(n,1,void 0,!0).catch(()=>{}),F.current=!0,r(!1),m(e.entity.title??e.entity.name??""),v?.(e)},q=()=>{n.trim()&&(g.api.searchVector(n,1,void 0,!0).catch(()=>{}),c.length>0&&l(c[0]))},U=s&&n.trim().length>0,T={...a?.primaryColor&&{"--hsk-primary":a.primaryColor},...a?.backgroundColor&&{"--hsk-bg":a.backgroundColor},...a?.textColor&&{"--hsk-text":a.textColor},...a?.fontFamily&&{"--hsk-font":a.fontFamily},...a?.borderRadius&&{"--hsk-border-radius":a.borderRadius}};return i("div",{className:E("hsk-sb-wrap",h.root,p),ref:P,style:T,children:[o("span",{className:"hsk-sb-icon",children:o(ne,{})}),o("input",{className:E("hsk-sb-input",h.input,C),type:"text",value:n,placeholder:u,onChange:e=>m(e.target.value),onFocus:()=>c.length>0&&n.trim()&&r(!0),onKeyDown:e=>{e.key==="Enter"&&q()},autoComplete:"off",spellCheck:!1}),U&&i("div",{className:E("hsk-sb-drop",h.dropdown,N),style:{position:"absolute"},children:[A&&o("div",{className:"hsk-sb-loading-bar"}),A&&c.length===0?i(se,{children:[i("div",{className:"hsk-sb-skeleton-row",children:[o("span",{className:"hsk-sb-skeleton-icon"}),i("div",{className:"hsk-sb-row-body",children:[o("div",{className:"hsk-sb-skeleton-text1"}),o("div",{className:"hsk-sb-skeleton-text2"})]})]}),i("div",{className:"hsk-sb-skeleton-row",children:[o("span",{className:"hsk-sb-skeleton-icon"}),i("div",{className:"hsk-sb-row-body",children:[o("div",{className:"hsk-sb-skeleton-text1",style:{width:"45%"}}),o("div",{className:"hsk-sb-skeleton-text2",style:{width:"25%"}})]})]})]}):i(se,{children:[c.length===0&&!A&&i("div",{className:"hsk-sb-empty",children:["No results for \u201C",n,"\u201D"]}),c.map((e,L)=>{if(S)return o("div",{onClick:()=>l(e),className:"hsk-sb-fade",style:{animationDelay:`${L*18}ms`},children:S(e)},e.id);let B=e.entity.image??e.entity.thumbnail??e.entity.images?.[0];return i("div",{className:E("hsk-sb-row hsk-sb-fade",h.row),style:{animationDelay:`${L*18}ms`},onClick:()=>l(e),children:[o("span",{className:"hsk-sb-row-thumb",children:B?o("img",{src:B,alt:"",loading:"lazy",onError:D=>{D.currentTarget.style.display="none"}}):o(ne,{})}),i("div",{className:"hsk-sb-row-body",children:[o("div",{className:"hsk-sb-row-title",children:e.entity.title??e.entity.name}),z({fields:e.entity.fields??e.entity},R)[0]&&o("div",{className:"hsk-sb-row-sub",children:z({fields:e.entity.fields??e.entity},R)[0].value})]})]},e.id)})]})]})]})}import{useState as _,useEffect as ie,useCallback as O,useRef as G}from"react";import{createPortal as le}from"react-dom";import{useEffect as ae,useRef as we,useState as ve}from"react";import{jsx as d,jsxs as M}from"react/jsx-runtime";function re({title:u,logo:b,theme:w,backdropColor:v,backdropBlur:p,failed:C,onClose:N,onRetry:S}){let[a,h]=ve(!1),n=we(null),{vars:m}=K(w);return ae(()=>{if(h(!1),C)return;let s=setTimeout(()=>h(!0),250);return()=>clearTimeout(s)},[C]),ae(()=>{let s=document.body.style.overflow;return document.body.style.overflow="hidden",n.current?.focus(),()=>{document.body.style.overflow=s}},[]),d("div",{className:"hsk-opening-shell","data-hsk-theme":Y(w),role:"dialog","aria-modal":"true","aria-label":u||"Kiku chat",style:{...m,...v?{background:v}:{},...p?{backdropFilter:`blur(${typeof p=="number"?`${p}px`:p})`}:{}},onKeyDown:s=>{if(s.key==="Escape"&&(s.preventDefault(),s.stopPropagation(),N()),s.key==="Tab"){let r=Array.from(s.currentTarget.querySelectorAll("button:not(:disabled)")),c=r.indexOf(document.activeElement);s.preventDefault(),r[(c+(s.shiftKey?-1:1)+r.length)%r.length]?.focus()}},children:M("div",{className:"hsk-opening-panel",children:[M("header",{className:"hsk-opening-header",children:[b?d("img",{src:b,alt:u||"Kiku",className:"hsk-opening-logo"}):d("span",{children:u||"Kiku"}),d("button",{ref:n,type:"button",className:"hsk-opening-close",onClick:N,"aria-label":"Close chat",children:"\xD7"})]}),d("div",{className:"hsk-opening-content",children:C?M("div",{className:"hsk-opening-feedback",role:"alert",children:[d("p",{children:"Chat couldn\u2019t load."}),d("button",{type:"button",className:"hsk-opening-retry",onClick:S,children:"Try again"})]}):a?M("div",{className:"hsk-opening-feedback",role:"status",children:[M("svg",{className:"hsk-cb-opening-spinner",width:"20",height:"20",viewBox:"0 0 24 24",fill:"none","aria-hidden":"true",children:[d("circle",{cx:"12",cy:"12",r:"9",stroke:"currentColor",strokeWidth:"2",opacity:"0.2"}),d("path",{d:"M12 3a9 9 0 0 1 9 9",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"})]}),d("span",{children:"Loading chat\u2026"})]}):null})]})})}import{useAkropolysContext as Ce}from"@akropolys/sdk";import{Fragment as ce,jsx as V,jsxs as J}from"react/jsx-runtime";var Q=null;function Ne(){return Q??(Q=import("./lazy-CDXIO5AJ.mjs").catch(u=>{throw Q=null,u})),Q}function Se({label:u="Ask AI",children:b,icon:w,title:v,logo:p,placeholder:C,backdropColor:N,backdropBlur:S,className:a,onSelectSource:h,chips:n,theme:m,classNames:s={},enableVoice:r=!1,voiceLang:c,ttsVoice:A,enableVision:H=!1}){let f=Ce(),[g,R]=_(!1),[P,F]=_(null),[l,q]=_(null),[U,T]=_(!1),e=G(!0),L=G(!1),[B,D]=_(0);ie(()=>{if(g){D(0);return}let t=!0;return f?.api?.unreadFromTeam?.().then(k=>{t&&D(k)}).catch(()=>{}),()=>{t=!1}},[g,f]);let y=O(()=>{Ne().then(t=>{t.getShadowContainer(),e.current&&(q(t),T(!1)),t.warmChrome(f,f?.getShopperLanguage?.()??"",t.DEFAULT_UI_STRINGS),f?.api?.widgetSettings?.().then(k=>{k?.detectedLanguage&&k.detectedLanguage.toLowerCase()!=="english"&&t.warmLanguage(f,k.detectedLanguage,t.DEFAULT_UI_STRINGS)}).catch(()=>{})}).catch(()=>{e.current&&T(!0)})},[f]),$=G(null),de=O(()=>{let t=$.current?.getBoundingClientRect();F(t?{x:t.left+t.width/2,y:t.top+t.height/2}:null),L.current=!l,T(!1),R(!0),y();try{Z()}catch{}},[y,l]);ie(()=>{e.current=!0;let t=window.requestIdleCallback,k=t?t(y,{timeout:2e3}):setTimeout(y,300);if(typeof window<"u"&&!window.__akropolys_nav_patched){window.__akropolys_nav_patched=!0;let x=window.location.pathname,me=window.history.pushState,fe=window.history.replaceState;window.history.pushState=function(...W){me.apply(this,W),window.location.pathname!==x&&(x=window.location.pathname,window.dispatchEvent(new CustomEvent("akropolys:navigation")))},window.history.replaceState=function(...W){fe.apply(this,W),window.location.pathname!==x&&(x=window.location.pathname,window.dispatchEvent(new CustomEvent("akropolys:navigation")))}}let I=()=>{R(!1)};return window.addEventListener("popstate",I),window.addEventListener("akropolys:navigation",I),()=>{e.current=!1;let x=window.cancelIdleCallback;t&&x?x(k):clearTimeout(k),window.removeEventListener("popstate",I),window.removeEventListener("akropolys:navigation",I)}},[y]);let X=O(()=>{R(!1),requestAnimationFrame(()=>$.current?.focus())},[]),ue=O(()=>{T(!1),y()},[y]),{themeAttr:pe,vars:he}=K(m);return j(m),J(ce,{children:[J("button",{ref:$,className:E("hsk-cb-btn",s.button,a),onClick:de,onPointerEnter:y,onPointerDown:y,style:he,"data-hsk-theme":pe,"aria-label":"Open AI chat","aria-haspopup":"dialog","aria-expanded":g,children:[b!==void 0?b:J(ce,{children:[w?V("span",{className:"hsk-cb-btn-icon",style:{display:"flex",alignItems:"center"},children:w}):null,u]}),B>0&&V("span",{className:"hsk-cb-btn-badge","aria-label":`${B} new replies`,children:B})]}),g&&!l&&le(V(re,{title:v,logo:p,theme:m,failed:U,backdropColor:N,backdropBlur:S,onClose:X,onRetry:ue}),document.body),g&&l&&le(V(l.ChatModal,{title:v,logo:p,placeholder:C,backdropColor:N,backdropBlur:S,origin:L.current?void 0:P,onClose:X,onSelectSource:h,chips:n??l.DEFAULT_CHIPS,theme:m,classNames:s,enableVoice:r,voiceLang:c,enableVision:H,ttsVoice:A}),l.getShadowContainer()??document.body)]})}export{Se as KikuButton,be as SearchBar};
|
|
3
3
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/SearchBar.tsx","../src/components/KikuButton.tsx"],"sourcesContent":["import React, { useState, useEffect, useRef } from 'react';\r\nimport { useSearch, SearchResult, AkropolysTheme, useAkropolysContext, useCardFields } from '@akropolys/sdk';\r\nimport { detailsOf } from '../utils/cardDetails';\r\nimport { cn } from '../utils/cn';\r\n\r\nexport interface SearchBarProps {\r\n placeholder?: string;\r\n limit?: number;\r\n debounceMs?: number;\r\n onSelect?: (result: SearchResult) => void;\r\n className?: string;\r\n inputClassName?: string;\r\n dropdownClassName?: string;\r\n renderResult?: (result: SearchResult) => React.ReactNode;\r\n theme?: AkropolysTheme;\r\n classNames?: {\r\n root?: string;\r\n input?: string;\r\n dropdown?: string;\r\n row?: string;\r\n };\r\n}\r\n\r\nconst SearchIcon = () => (\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\">\r\n <circle cx=\"8.5\" cy=\"8.5\" r=\"5.5\"/>\r\n <line x1=\"13\" y1=\"13\" x2=\"18\" y2=\"18\"/>\r\n </svg>\r\n);\r\n\r\nexport function SearchBar({\r\n placeholder = 'Search products…',\r\n limit = 10,\r\n debounceMs = 150,\r\n onSelect,\r\n className,\r\n inputClassName,\r\n dropdownClassName,\r\n renderResult,\r\n theme,\r\n classNames = {},\r\n}: SearchBarProps) {\r\n const [query, setQuery] = useState('');\r\n const [open, setOpen] = useState(false);\r\n const { results, loading, search, clear } = useSearch({ debounceMs });\r\n const client = useAkropolysContext();\r\n const cardFields = useCardFields();\r\n const wrap = useRef<HTMLDivElement>(null);\r\n const ignoreNextQueryChange = useRef(false);\r\n\r\n useEffect(() => {\r\n if (ignoreNextQueryChange.current) {\r\n ignoreNextQueryChange.current = false;\r\n return;\r\n }\r\n if (!query.trim()) {\r\n clear();\r\n setOpen(false);\r\n return;\r\n }\r\n setOpen(true); // open immediately (stale results show while fetching)\r\n search(query, limit);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [query]);\r\n\r\n useEffect(() => {\r\n const h = (e: MouseEvent) => {\r\n if (wrap.current && !wrap.current.contains(e.target as Node)) setOpen(false);\r\n };\r\n document.addEventListener('mousedown', h);\r\n return () => document.removeEventListener('mousedown', h);\r\n }, []);\r\n\r\n const handleSelect = (r: SearchResult) => {\r\n if (query.trim()) {\r\n client.api.searchVector(query, 1, undefined, true).catch(() => {});\r\n }\r\n ignoreNextQueryChange.current = true;\r\n setOpen(false);\r\n setQuery(r.entity.title ?? r.entity.name ?? '');\r\n onSelect?.(r);\r\n };\r\n\r\n const handleCommitSearch = () => {\r\n if (!query.trim()) return;\r\n client.api.searchVector(query, 1, undefined, true).catch(() => {});\r\n if (results.length > 0) {\r\n handleSelect(results[0]);\r\n }\r\n };\r\n\r\n const showDrop = open && query.trim().length > 0;\r\n\r\n const customStyles = {\r\n ...(theme?.primaryColor && { '--hsk-primary': theme.primaryColor }),\r\n ...(theme?.backgroundColor && { '--hsk-bg': theme.backgroundColor }),\r\n ...(theme?.textColor && { '--hsk-text': theme.textColor }),\r\n ...(theme?.fontFamily && { '--hsk-font': theme.fontFamily }),\r\n ...(theme?.borderRadius && { '--hsk-border-radius': theme.borderRadius }),\r\n } as React.CSSProperties;\r\n\r\n return (\r\n <div className={cn(\"hsk-sb-wrap\", classNames.root, className)} ref={wrap} style={customStyles}>\r\n <span className=\"hsk-sb-icon\"><SearchIcon /></span>\r\n <input\r\n className={cn(\"hsk-sb-input\", classNames.input, inputClassName)}\r\n type=\"text\"\r\n value={query}\r\n placeholder={placeholder}\r\n onChange={e => setQuery(e.target.value)}\r\n onFocus={() => results.length > 0 && query.trim() && setOpen(true)}\r\n onKeyDown={e => {\r\n if (e.key === 'Enter') {\r\n handleCommitSearch();\r\n }\r\n }}\r\n autoComplete=\"off\"\r\n spellCheck={false}\r\n />\r\n {showDrop && (\r\n <div className={cn(\"hsk-sb-drop\", classNames.dropdown, dropdownClassName)} style={{ position: 'absolute' }}>\r\n {loading && <div className=\"hsk-sb-loading-bar\" />}\r\n\r\n {loading && results.length === 0 ? (\r\n <>\r\n <div className=\"hsk-sb-skeleton-row\">\r\n <span className=\"hsk-sb-skeleton-icon\" />\r\n <div className=\"hsk-sb-row-body\">\r\n <div className=\"hsk-sb-skeleton-text1\" />\r\n <div className=\"hsk-sb-skeleton-text2\" />\r\n </div>\r\n </div>\r\n <div className=\"hsk-sb-skeleton-row\">\r\n <span className=\"hsk-sb-skeleton-icon\" />\r\n <div className=\"hsk-sb-row-body\">\r\n <div className=\"hsk-sb-skeleton-text1\" style={{ width: '45%' }} />\r\n <div className=\"hsk-sb-skeleton-text2\" style={{ width: '25%' }} />\r\n </div>\r\n </div>\r\n </>\r\n ) : (\r\n <>\r\n {results.length === 0 && !loading && (\r\n <div className=\"hsk-sb-empty\">No results for “{query}”</div>\r\n )}\r\n\r\n {results.map((r, i) => {\r\n if (renderResult) {\r\n return (\r\n <div\r\n key={r.id}\r\n onClick={() => handleSelect(r)}\r\n className=\"hsk-sb-fade\"\r\n style={{ animationDelay: `${i * 18}ms` }}\r\n >\r\n {renderResult(r)}\r\n </div>\r\n );\r\n }\r\n const thumb = r.entity.image ?? r.entity.thumbnail ?? r.entity.images?.[0];\r\n return (\r\n <div\r\n key={r.id}\r\n className={cn(\"hsk-sb-row hsk-sb-fade\", classNames.row)}\r\n style={{ animationDelay: `${i * 18}ms` }}\r\n onClick={() => handleSelect(r)}\r\n >\r\n <span className=\"hsk-sb-row-thumb\">\r\n {thumb ? (\r\n <img\r\n src={thumb}\r\n alt=\"\"\r\n loading=\"lazy\"\r\n onError={e => { e.currentTarget.style.display = 'none'; }}\r\n />\r\n ) : (\r\n <SearchIcon />\r\n )}\r\n </span>\r\n <div className=\"hsk-sb-row-body\">\r\n <div className=\"hsk-sb-row-title\">{r.entity.title ?? r.entity.name}</div>\r\n {detailsOf({ fields: r.entity.fields ?? r.entity }, cardFields)[0] && (\r\n <div className=\"hsk-sb-row-sub\">\r\n {detailsOf({ fields: r.entity.fields ?? r.entity }, cardFields)[0].value}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","'use client';\n\nimport React, { useState, useEffect, useCallback, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport { primeChimes } from '../utils/chime';\nimport type { AkropolysTheme, ChatSource } from '@akropolys/sdk';\nimport { useAkropolysContext } from '@akropolys/sdk';\nimport { cn } from '../utils/cn';\nimport { resolveTheme } from '../utils/theme';\nimport { useHostFontFace } from '../utils/hostFont';\nimport type { ModalOrigin } from './ChatModal/types';\n\ntype Chat = typeof import('./ChatModal/lazy');\nlet chat: Promise<Chat> | null = null;\n\nfunction loadChat(): Promise<Chat> {\n chat ??= import('./ChatModal/lazy').catch(err => { chat = null; throw err; });\n return chat;\n}\n\nexport interface KikuButtonProps {\n label?: React.ReactNode;\n children?: React.ReactNode;\n icon?: React.ReactNode;\n title?: string;\n\n /** Wordmark shown in place of the name in the topbar. */\n logo?: string;\n placeholder?: string;\n backdropColor?: string;\n backdropBlur?: string | number;\n className?: string;\n onSelectSource?: (source: ChatSource) => void;\n chips?: string[];\n theme?: 'light' | 'dark' | AkropolysTheme;\n classNames?: {\n button?: string;\n overlay?: string;\n panel?: string;\n input?: string;\n sendButton?: string;\n };\n\n enableVoice?: boolean;\n\n voiceLang?: string;\n\n enableVision?: boolean;\n\n ttsVoice?: string;\n}\n\nexport function KikuButton({\n label = 'Ask AI',\n children,\n icon,\n title,\n logo,\n placeholder,\n backdropColor,\n backdropBlur,\n className,\n onSelectSource,\n chips,\n theme,\n classNames = {},\n enableVoice = false,\n voiceLang,\n ttsVoice,\n enableVision = false,\n}: KikuButtonProps) {\n const client = useAkropolysContext();\n const [open, setOpen] = useState(false);\n const [origin, setOrigin] = useState<ModalOrigin | null>(null);\n const [Chat, setChat] = useState<Chat | null>(null);\n const live = useRef(true);\n // Replies from the team that arrived while the chat was closed.\n const [unread, setUnread] = useState(0);\n useEffect(() => {\n if (open) { setUnread(0); return; }\n let current = true;\n client?.api?.unreadFromTeam?.().then((n: number) => { if (current) setUnread(n); }).catch(() => {});\n return () => { current = false; };\n }, [open, client]);\n\n const warmShadow = useCallback(() => {\n loadChat().then(c => {\n c.getShadowContainer();\n if (live.current) setChat(c);\n c.warmChrome(client, client?.getShopperLanguage?.() ?? '', c.DEFAULT_UI_STRINGS);\n client?.api?.widgetSettings?.().then((settings: any) => {\n if (settings?.detectedLanguage && settings.detectedLanguage.toLowerCase() !== 'english') {\n c.warmLanguage(client, settings.detectedLanguage, c.DEFAULT_UI_STRINGS);\n }\n }).catch(() => {});\n }).catch(() => {});\n }, [client]);\n\n const btnRef = useRef<HTMLButtonElement>(null);\n\n const openFrom = useCallback(() => {\n const b = btnRef.current?.getBoundingClientRect();\n setOrigin(b ? { x: b.left + b.width / 2, y: b.top + b.height / 2 } : null);\n setOpen(true);\n warmShadow();\n try { primeChimes(); } catch {}\n }, [warmShadow]);\n\n useEffect(() => {\n live.current = true;\n const ric = (window as any).requestIdleCallback;\n const warmId = ric ? ric(warmShadow, { timeout: 2000 }) : setTimeout(warmShadow, 300);\n\n if (typeof window !== 'undefined' && !(window as any).__akropolys_nav_patched) {\n (window as any).__akropolys_nav_patched = true;\n let lastPath = window.location.pathname;\n const originalPush = window.history.pushState;\n const originalReplace = window.history.replaceState;\n\n window.history.pushState = function(...args) {\n originalPush.apply(this, args);\n if (window.location.pathname !== lastPath) {\n lastPath = window.location.pathname;\n window.dispatchEvent(new CustomEvent('akropolys:navigation'));\n }\n };\n\n window.history.replaceState = function(...args) {\n originalReplace.apply(this, args);\n if (window.location.pathname !== lastPath) {\n lastPath = window.location.pathname;\n window.dispatchEvent(new CustomEvent('akropolys:navigation'));\n }\n };\n }\n\n const handleNavigation = () => {\n setOpen(false);\n };\n\n window.addEventListener('popstate', handleNavigation);\n window.addEventListener('akropolys:navigation', handleNavigation);\n\n return () => {\n live.current = false;\n const cic = (window as any).cancelIdleCallback;\n if (ric && cic) cic(warmId); else clearTimeout(warmId as any);\n window.removeEventListener('popstate', handleNavigation);\n window.removeEventListener('akropolys:navigation', handleNavigation);\n };\n }, [warmShadow]);\n\n const { themeAttr: hskThemeAttr, vars: customStyles } = resolveTheme(theme);\n useHostFontFace(theme);\n\n return (\n <>\n <button\n ref={btnRef}\n className={cn(\"hsk-cb-btn\", classNames.button, className)}\n onClick={openFrom}\n onPointerEnter={warmShadow}\n onPointerDown={warmShadow}\n style={customStyles}\n data-hsk-theme={hskThemeAttr}\n aria-label=\"Open AI chat\"\n >\n {children !== undefined ? (\n children\n ) : (\n <>\n {icon ? (\n <span className=\"hsk-cb-btn-icon\" style={{ display: 'flex', alignItems: 'center' }}>\n {icon}\n </span>\n ) : null}\n {label}\n </>\n )}\n {unread > 0 && <span className=\"hsk-cb-btn-badge\" aria-label={`${unread} new replies`}>{unread}</span>}\n </button>\n {open && Chat && createPortal(\n <Chat.ChatModal\n title={title}\n logo={logo}\n placeholder={placeholder}\n backdropColor={backdropColor}\n backdropBlur={backdropBlur}\n origin={origin}\n onClose={() => setOpen(false)}\n onSelectSource={onSelectSource}\n chips={chips ?? Chat.DEFAULT_CHIPS}\n theme={theme}\n classNames={classNames}\n enableVoice={enableVoice}\n voiceLang={voiceLang}\n enableVision={enableVision}\n ttsVoice={ttsVoice}\n />,\n Chat.getShadowContainer() ?? document.body\n )}\n </>\n );\n}\n"],"mappings":"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","names":["useState","useEffect","useRef","useSearch","useAkropolysContext","useCardFields","Fragment","jsx","jsxs","SearchIcon","SearchBar","placeholder","limit","debounceMs","onSelect","className","inputClassName","dropdownClassName","renderResult","theme","classNames","query","setQuery","useState","open","setOpen","results","loading","search","clear","useSearch","client","useAkropolysContext","cardFields","useCardFields","wrap","useRef","ignoreNextQueryChange","useEffect","h","e","handleSelect","r","handleCommitSearch","showDrop","customStyles","cn","i","thumb","detailsOf","useState","useEffect","useCallback","useRef","createPortal","useAkropolysContext","Fragment","jsx","jsxs","chat","loadChat","err","KikuButton","label","children","icon","title","logo","placeholder","backdropColor","backdropBlur","className","onSelectSource","chips","theme","classNames","enableVoice","voiceLang","ttsVoice","enableVision","client","useAkropolysContext","open","setOpen","useState","origin","setOrigin","Chat","setChat","live","useRef","unread","setUnread","useEffect","current","n","warmShadow","useCallback","c","settings","btnRef","openFrom","b","primeChimes","ric","warmId","lastPath","originalPush","originalReplace","args","handleNavigation","cic","hskThemeAttr","customStyles","resolveTheme","useHostFontFace","cn","createPortal"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/SearchBar.tsx","../src/components/KikuButton.tsx","../src/components/ChatLoadingShell.tsx"],"sourcesContent":["import React, { useState, useEffect, useRef } from 'react';\r\nimport { useSearch, SearchResult, AkropolysTheme, useAkropolysContext, useCardFields } from '@akropolys/sdk';\r\nimport { detailsOf } from '../utils/cardDetails';\r\nimport { cn } from '../utils/cn';\r\n\r\nexport interface SearchBarProps {\r\n placeholder?: string;\r\n limit?: number;\r\n debounceMs?: number;\r\n onSelect?: (result: SearchResult) => void;\r\n className?: string;\r\n inputClassName?: string;\r\n dropdownClassName?: string;\r\n renderResult?: (result: SearchResult) => React.ReactNode;\r\n theme?: AkropolysTheme;\r\n classNames?: {\r\n root?: string;\r\n input?: string;\r\n dropdown?: string;\r\n row?: string;\r\n };\r\n}\r\n\r\nconst SearchIcon = () => (\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\">\r\n <circle cx=\"8.5\" cy=\"8.5\" r=\"5.5\"/>\r\n <line x1=\"13\" y1=\"13\" x2=\"18\" y2=\"18\"/>\r\n </svg>\r\n);\r\n\r\nexport function SearchBar({\r\n placeholder = 'Search products…',\r\n limit = 10,\r\n debounceMs = 150,\r\n onSelect,\r\n className,\r\n inputClassName,\r\n dropdownClassName,\r\n renderResult,\r\n theme,\r\n classNames = {},\r\n}: SearchBarProps) {\r\n const [query, setQuery] = useState('');\r\n const [open, setOpen] = useState(false);\r\n const { results, loading, search, clear } = useSearch({ debounceMs });\r\n const client = useAkropolysContext();\r\n const cardFields = useCardFields();\r\n const wrap = useRef<HTMLDivElement>(null);\r\n const ignoreNextQueryChange = useRef(false);\r\n\r\n useEffect(() => {\r\n if (ignoreNextQueryChange.current) {\r\n ignoreNextQueryChange.current = false;\r\n return;\r\n }\r\n if (!query.trim()) {\r\n clear();\r\n setOpen(false);\r\n return;\r\n }\r\n setOpen(true); // open immediately (stale results show while fetching)\r\n search(query, limit);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [query]);\r\n\r\n useEffect(() => {\r\n const h = (e: MouseEvent) => {\r\n if (wrap.current && !wrap.current.contains(e.target as Node)) setOpen(false);\r\n };\r\n document.addEventListener('mousedown', h);\r\n return () => document.removeEventListener('mousedown', h);\r\n }, []);\r\n\r\n const handleSelect = (r: SearchResult) => {\r\n if (query.trim()) {\r\n client.api.searchVector(query, 1, undefined, true).catch(() => {});\r\n }\r\n ignoreNextQueryChange.current = true;\r\n setOpen(false);\r\n setQuery(r.entity.title ?? r.entity.name ?? '');\r\n onSelect?.(r);\r\n };\r\n\r\n const handleCommitSearch = () => {\r\n if (!query.trim()) return;\r\n client.api.searchVector(query, 1, undefined, true).catch(() => {});\r\n if (results.length > 0) {\r\n handleSelect(results[0]);\r\n }\r\n };\r\n\r\n const showDrop = open && query.trim().length > 0;\r\n\r\n const customStyles = {\r\n ...(theme?.primaryColor && { '--hsk-primary': theme.primaryColor }),\r\n ...(theme?.backgroundColor && { '--hsk-bg': theme.backgroundColor }),\r\n ...(theme?.textColor && { '--hsk-text': theme.textColor }),\r\n ...(theme?.fontFamily && { '--hsk-font': theme.fontFamily }),\r\n ...(theme?.borderRadius && { '--hsk-border-radius': theme.borderRadius }),\r\n } as React.CSSProperties;\r\n\r\n return (\r\n <div className={cn(\"hsk-sb-wrap\", classNames.root, className)} ref={wrap} style={customStyles}>\r\n <span className=\"hsk-sb-icon\"><SearchIcon /></span>\r\n <input\r\n className={cn(\"hsk-sb-input\", classNames.input, inputClassName)}\r\n type=\"text\"\r\n value={query}\r\n placeholder={placeholder}\r\n onChange={e => setQuery(e.target.value)}\r\n onFocus={() => results.length > 0 && query.trim() && setOpen(true)}\r\n onKeyDown={e => {\r\n if (e.key === 'Enter') {\r\n handleCommitSearch();\r\n }\r\n }}\r\n autoComplete=\"off\"\r\n spellCheck={false}\r\n />\r\n {showDrop && (\r\n <div className={cn(\"hsk-sb-drop\", classNames.dropdown, dropdownClassName)} style={{ position: 'absolute' }}>\r\n {loading && <div className=\"hsk-sb-loading-bar\" />}\r\n\r\n {loading && results.length === 0 ? (\r\n <>\r\n <div className=\"hsk-sb-skeleton-row\">\r\n <span className=\"hsk-sb-skeleton-icon\" />\r\n <div className=\"hsk-sb-row-body\">\r\n <div className=\"hsk-sb-skeleton-text1\" />\r\n <div className=\"hsk-sb-skeleton-text2\" />\r\n </div>\r\n </div>\r\n <div className=\"hsk-sb-skeleton-row\">\r\n <span className=\"hsk-sb-skeleton-icon\" />\r\n <div className=\"hsk-sb-row-body\">\r\n <div className=\"hsk-sb-skeleton-text1\" style={{ width: '45%' }} />\r\n <div className=\"hsk-sb-skeleton-text2\" style={{ width: '25%' }} />\r\n </div>\r\n </div>\r\n </>\r\n ) : (\r\n <>\r\n {results.length === 0 && !loading && (\r\n <div className=\"hsk-sb-empty\">No results for “{query}”</div>\r\n )}\r\n\r\n {results.map((r, i) => {\r\n if (renderResult) {\r\n return (\r\n <div\r\n key={r.id}\r\n onClick={() => handleSelect(r)}\r\n className=\"hsk-sb-fade\"\r\n style={{ animationDelay: `${i * 18}ms` }}\r\n >\r\n {renderResult(r)}\r\n </div>\r\n );\r\n }\r\n const thumb = r.entity.image ?? r.entity.thumbnail ?? r.entity.images?.[0];\r\n return (\r\n <div\r\n key={r.id}\r\n className={cn(\"hsk-sb-row hsk-sb-fade\", classNames.row)}\r\n style={{ animationDelay: `${i * 18}ms` }}\r\n onClick={() => handleSelect(r)}\r\n >\r\n <span className=\"hsk-sb-row-thumb\">\r\n {thumb ? (\r\n <img\r\n src={thumb}\r\n alt=\"\"\r\n loading=\"lazy\"\r\n onError={e => { e.currentTarget.style.display = 'none'; }}\r\n />\r\n ) : (\r\n <SearchIcon />\r\n )}\r\n </span>\r\n <div className=\"hsk-sb-row-body\">\r\n <div className=\"hsk-sb-row-title\">{r.entity.title ?? r.entity.name}</div>\r\n {detailsOf({ fields: r.entity.fields ?? r.entity }, cardFields)[0] && (\r\n <div className=\"hsk-sb-row-sub\">\r\n {detailsOf({ fields: r.entity.fields ?? r.entity }, cardFields)[0].value}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport React, { useState, useEffect, useCallback, useRef } from 'react';\r\nimport { createPortal } from 'react-dom';\r\nimport { ChatLoadingShell } from './ChatLoadingShell';\r\nimport { primeChimes } from '../utils/chime';\r\nimport type { AkropolysTheme, ChatSource } from '@akropolys/sdk';\r\nimport { useAkropolysContext } from '@akropolys/sdk';\r\nimport { cn } from '../utils/cn';\r\nimport { resolveTheme } from '../utils/theme';\r\nimport { useHostFontFace } from '../utils/hostFont';\r\nimport type { ModalOrigin } from './ChatModal/types';\r\n\r\ntype Chat = typeof import('./ChatModal/lazy');\r\nlet chat: Promise<Chat> | null = null;\r\n\r\nfunction loadChat(): Promise<Chat> {\r\n chat ??= import('./ChatModal/lazy').catch(err => { chat = null; throw err; });\r\n return chat;\r\n}\r\n\r\nexport interface KikuButtonProps {\r\n label?: React.ReactNode;\r\n children?: React.ReactNode;\r\n icon?: React.ReactNode;\r\n title?: string;\r\n\r\n /** Wordmark shown in place of the name in the topbar. */\r\n logo?: string;\r\n placeholder?: string;\r\n backdropColor?: string;\r\n backdropBlur?: string | number;\r\n className?: string;\r\n onSelectSource?: (source: ChatSource) => void;\r\n chips?: string[];\r\n theme?: 'light' | 'dark' | AkropolysTheme;\r\n classNames?: {\r\n button?: string;\r\n overlay?: string;\r\n panel?: string;\r\n input?: string;\r\n sendButton?: string;\r\n };\r\n\r\n enableVoice?: boolean;\r\n\r\n voiceLang?: string;\r\n\r\n enableVision?: boolean;\r\n\r\n ttsVoice?: string;\r\n}\r\n\r\nexport function KikuButton({\r\n label = 'Ask AI',\r\n children,\r\n icon,\r\n title,\r\n logo,\r\n placeholder,\r\n backdropColor,\r\n backdropBlur,\r\n className,\r\n onSelectSource,\r\n chips,\r\n theme,\r\n classNames = {},\r\n enableVoice = false,\r\n voiceLang,\r\n ttsVoice,\r\n enableVision = false,\r\n}: KikuButtonProps) {\r\n const client = useAkropolysContext();\r\n const [open, setOpen] = useState(false);\r\n const [origin, setOrigin] = useState<ModalOrigin | null>(null);\r\n const [Chat, setChat] = useState<Chat | null>(null);\r\n const [loadError, setLoadError] = useState(false);\r\n const live = useRef(true);\r\n const shellShown = useRef(false);\r\n // Replies from the team that arrived while the chat was closed.\r\n const [unread, setUnread] = useState(0);\r\n useEffect(() => {\r\n if (open) { setUnread(0); return; }\r\n let current = true;\r\n client?.api?.unreadFromTeam?.().then((n: number) => { if (current) setUnread(n); }).catch(() => {});\r\n return () => { current = false; };\r\n }, [open, client]);\r\n\r\n const warmShadow = useCallback(() => {\r\n loadChat().then(c => {\r\n c.getShadowContainer();\r\n if (live.current) { setChat(c); setLoadError(false); }\r\n c.warmChrome(client, client?.getShopperLanguage?.() ?? '', c.DEFAULT_UI_STRINGS);\r\n client?.api?.widgetSettings?.().then((settings: any) => {\r\n if (settings?.detectedLanguage && settings.detectedLanguage.toLowerCase() !== 'english') {\r\n c.warmLanguage(client, settings.detectedLanguage, c.DEFAULT_UI_STRINGS);\r\n }\r\n }).catch(() => {});\r\n }).catch(() => { if (live.current) setLoadError(true); });\r\n }, [client]);\r\n\r\n const btnRef = useRef<HTMLButtonElement>(null);\r\n\r\n const openFrom = useCallback(() => {\r\n const b = btnRef.current?.getBoundingClientRect();\r\n setOrigin(b ? { x: b.left + b.width / 2, y: b.top + b.height / 2 } : null);\r\n shellShown.current = !Chat;\r\n setLoadError(false);\r\n setOpen(true);\r\n warmShadow();\r\n try { primeChimes(); } catch {}\r\n }, [warmShadow, Chat]);\r\n\r\n useEffect(() => {\r\n live.current = true;\r\n const ric = (window as any).requestIdleCallback;\r\n const warmId = ric ? ric(warmShadow, { timeout: 2000 }) : setTimeout(warmShadow, 300);\r\n\r\n if (typeof window !== 'undefined' && !(window as any).__akropolys_nav_patched) {\r\n (window as any).__akropolys_nav_patched = true;\r\n let lastPath = window.location.pathname;\r\n const originalPush = window.history.pushState;\r\n const originalReplace = window.history.replaceState;\r\n\r\n window.history.pushState = function(...args) {\r\n originalPush.apply(this, args);\r\n if (window.location.pathname !== lastPath) {\r\n lastPath = window.location.pathname;\r\n window.dispatchEvent(new CustomEvent('akropolys:navigation'));\r\n }\r\n };\r\n\r\n window.history.replaceState = function(...args) {\r\n originalReplace.apply(this, args);\r\n if (window.location.pathname !== lastPath) {\r\n lastPath = window.location.pathname;\r\n window.dispatchEvent(new CustomEvent('akropolys:navigation'));\r\n }\r\n };\r\n }\r\n\r\n const handleNavigation = () => {\r\n setOpen(false);\r\n };\r\n\r\n window.addEventListener('popstate', handleNavigation);\r\n window.addEventListener('akropolys:navigation', handleNavigation);\r\n\r\n return () => {\r\n live.current = false;\r\n const cic = (window as any).cancelIdleCallback;\r\n if (ric && cic) cic(warmId); else clearTimeout(warmId as any);\r\n window.removeEventListener('popstate', handleNavigation);\r\n window.removeEventListener('akropolys:navigation', handleNavigation);\r\n };\r\n }, [warmShadow]);\r\n\r\n const close = useCallback(() => {\r\n setOpen(false);\r\n requestAnimationFrame(() => btnRef.current?.focus());\r\n }, []);\r\n\r\n const retry = useCallback(() => {\r\n setLoadError(false);\r\n warmShadow();\r\n }, [warmShadow]);\r\n\r\n const { themeAttr: hskThemeAttr, vars: customStyles } = resolveTheme(theme);\r\n useHostFontFace(theme);\r\n\r\n return (\r\n <>\r\n <button\r\n ref={btnRef}\r\n className={cn(\"hsk-cb-btn\", classNames.button, className)}\r\n onClick={openFrom}\r\n onPointerEnter={warmShadow}\r\n onPointerDown={warmShadow}\r\n style={customStyles}\r\n data-hsk-theme={hskThemeAttr}\r\n aria-label=\"Open AI chat\"\r\n aria-haspopup=\"dialog\"\r\n aria-expanded={open}\r\n >\r\n {children !== undefined ? (\r\n children\r\n ) : (\r\n <>\r\n {icon ? (\r\n <span className=\"hsk-cb-btn-icon\" style={{ display: 'flex', alignItems: 'center' }}>\r\n {icon}\r\n </span>\r\n ) : null}\r\n {label}\r\n </>\r\n )}\r\n {unread > 0 && <span className=\"hsk-cb-btn-badge\" aria-label={`${unread} new replies`}>{unread}</span>}\r\n </button>\r\n {open && !Chat && createPortal(\r\n <ChatLoadingShell title={title} logo={logo} theme={theme} failed={loadError}\r\n backdropColor={backdropColor} backdropBlur={backdropBlur}\r\n onClose={close} onRetry={retry} />,\r\n document.body\r\n )}\r\n {open && Chat && createPortal(\r\n <Chat.ChatModal\r\n title={title}\r\n logo={logo}\r\n placeholder={placeholder}\r\n backdropColor={backdropColor}\r\n backdropBlur={backdropBlur}\r\n origin={shellShown.current ? undefined : origin}\r\n onClose={close}\r\n onSelectSource={onSelectSource}\r\n chips={chips ?? Chat.DEFAULT_CHIPS}\r\n theme={theme}\r\n classNames={classNames}\r\n enableVoice={enableVoice}\r\n voiceLang={voiceLang}\r\n enableVision={enableVision}\r\n ttsVoice={ttsVoice}\r\n />,\r\n Chat.getShadowContainer() ?? document.body\r\n )}\r\n </>\r\n );\r\n}\r\n","import React, { useEffect, useRef, useState } from 'react';\r\nimport type { AkropolysTheme } from '@akropolys/sdk';\r\nimport { resolveTheme } from '../utils/theme';\r\nimport { initialTheme } from '../utils/themePreference';\r\n\r\ninterface Props {\r\n title?: string;\r\n logo?: string;\r\n theme?: 'light' | 'dark' | AkropolysTheme;\r\n backdropColor?: string;\r\n backdropBlur?: string | number;\r\n failed: boolean;\r\n onClose: () => void;\r\n onRetry: () => void;\r\n}\r\n\r\n// Eager and independent of the large chat chunk and its shadow stylesheet.\r\nexport function ChatLoadingShell({ title, logo, theme, backdropColor, backdropBlur, failed, onClose, onRetry }: Props) {\r\n const [showLoader, setShowLoader] = useState(false);\r\n const closeRef = useRef<HTMLButtonElement>(null);\r\n const { vars } = resolveTheme(theme);\r\n useEffect(() => {\r\n setShowLoader(false);\r\n if (failed) return;\r\n const timer = setTimeout(() => setShowLoader(true), 250);\r\n return () => clearTimeout(timer);\r\n }, [failed]);\r\n useEffect(() => {\r\n const previous = document.body.style.overflow;\r\n document.body.style.overflow = 'hidden';\r\n closeRef.current?.focus();\r\n return () => { document.body.style.overflow = previous; };\r\n }, []);\r\n\r\n return <div className=\"hsk-opening-shell\" data-hsk-theme={initialTheme(theme)} role=\"dialog\" aria-modal=\"true\" aria-label={title || 'Kiku chat'}\r\n style={{ ...vars, ...(backdropColor ? { background: backdropColor } : {}), ...(backdropBlur ? { backdropFilter: `blur(${typeof backdropBlur === 'number' ? `${backdropBlur}px` : backdropBlur})` } : {}) }}\r\n onKeyDown={event => {\r\n if (event.key === 'Escape') { event.preventDefault(); event.stopPropagation(); onClose(); }\r\n if (event.key === 'Tab') {\r\n const buttons = Array.from(event.currentTarget.querySelectorAll<HTMLButtonElement>('button:not(:disabled)'));\r\n const index = buttons.indexOf(document.activeElement as HTMLButtonElement);\r\n event.preventDefault();\r\n buttons[(index + (event.shiftKey ? -1 : 1) + buttons.length) % buttons.length]?.focus();\r\n }\r\n }}>\r\n <div className=\"hsk-opening-panel\">\r\n <header className=\"hsk-opening-header\">\r\n {logo ? <img src={logo} alt={title || 'Kiku'} className=\"hsk-opening-logo\" /> : <span>{title || 'Kiku'}</span>}\r\n <button ref={closeRef} type=\"button\" className=\"hsk-opening-close\" onClick={onClose} aria-label=\"Close chat\">×</button>\r\n </header>\r\n <div className=\"hsk-opening-content\">\r\n {failed ? <div className=\"hsk-opening-feedback\" role=\"alert\"><p>Chat couldn’t load.</p><button type=\"button\" className=\"hsk-opening-retry\" onClick={onRetry}>Try again</button></div>\r\n : showLoader ? <div className=\"hsk-opening-feedback\" role=\"status\"><svg className=\"hsk-cb-opening-spinner\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" strokeWidth=\"2\" opacity=\"0.2\" /><path d=\"M12 3a9 9 0 0 1 9 9\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" /></svg><span>Loading chat…</span></div> : null}\r\n </div>\r\n </div>\r\n </div>;\r\n}\r\n"],"mappings":"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","names":["useState","useEffect","useRef","useSearch","useAkropolysContext","useCardFields","Fragment","jsx","jsxs","SearchIcon","SearchBar","placeholder","limit","debounceMs","onSelect","className","inputClassName","dropdownClassName","renderResult","theme","classNames","query","setQuery","useState","open","setOpen","results","loading","search","clear","useSearch","client","useAkropolysContext","cardFields","useCardFields","wrap","useRef","ignoreNextQueryChange","useEffect","h","e","handleSelect","r","handleCommitSearch","showDrop","customStyles","cn","i","thumb","detailsOf","useState","useEffect","useCallback","useRef","createPortal","useEffect","useRef","useState","jsx","jsxs","ChatLoadingShell","title","logo","theme","backdropColor","backdropBlur","failed","onClose","onRetry","showLoader","setShowLoader","useState","closeRef","useRef","vars","resolveTheme","useEffect","timer","previous","initialTheme","event","buttons","index","useAkropolysContext","Fragment","jsx","jsxs","chat","loadChat","err","KikuButton","label","children","icon","title","logo","placeholder","backdropColor","backdropBlur","className","onSelectSource","chips","theme","classNames","enableVoice","voiceLang","ttsVoice","enableVision","client","useAkropolysContext","open","setOpen","useState","origin","setOrigin","Chat","setChat","loadError","setLoadError","live","useRef","shellShown","unread","setUnread","useEffect","current","n","warmShadow","useCallback","c","settings","btnRef","openFrom","b","primeChimes","ric","warmId","lastPath","originalPush","originalReplace","args","handleNavigation","cic","close","retry","hskThemeAttr","customStyles","resolveTheme","useHostFontFace","cn","createPortal","ChatLoadingShell"]}
|