@kookee/react 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var react=require('react'),sdk=require('@kookee/sdk'),jsxRuntime=require('react/jsx-runtime'),l=require('highlight.js/lib/core'),ee=require('highlight.js/lib/languages/bash'),ye=require('highlight.js/lib/languages/css'),V=require('highlight.js/lib/languages/javascript'),be=require('highlight.js/lib/languages/json'),A=require('highlight.js/lib/languages/typescript'),oe=require('highlight.js/lib/languages/xml'),marked=require('marked'),markedHighlight=require('marked-highlight');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var l__default=/*#__PURE__*/_interopDefault(l);var ee__default=/*#__PURE__*/_interopDefault(ee);var ye__default=/*#__PURE__*/_interopDefault(ye);var V__default=/*#__PURE__*/_interopDefault(V);var be__default=/*#__PURE__*/_interopDefault(be);var A__default=/*#__PURE__*/_interopDefault(A);var oe__default=/*#__PURE__*/_interopDefault(oe);var Y=react.createContext(null);function K({clientOptions:e,locale:o,onSourceClick:t,children:n}){let[i,s]=react.useState([]),[k,d]=react.useState(false),[g,a]=react.useState(false),[C,N]=react.useState(false),P=react.useRef(null),I=react.useRef(crypto.randomUUID()),q=react.useCallback(()=>(P.current||(P.current=new sdk.Kookee(e)),P.current),[e]),Z=react.useCallback(async f=>{let y={id:crypto.randomUUID(),role:"user",content:f};s(h=>[...h,y]),d(true);let m=q(),c=[...i,y].map(h=>({role:h.role,content:h.content})),S=crypto.randomUUID();try{let h=m.help.chatStream({messages:c,locale:o,sessionId:I.current});s(x=>[...x,{id:S,role:"assistant",content:"",isStreaming:!0}]),d(!1);for await(let x of h)ke(x,S);}catch{try{let h=await m.help.chat({messages:c,locale:o,sessionId:I.current}),x={id:S,role:"assistant",content:h.message,sources:h.sources};s(R=>[...R.filter(ge=>ge.id!==S),x]);}catch{s(h=>[...h.filter(R=>R.id!==S),{id:S,role:"assistant",content:"Sorry, something went wrong. Please try again."}]);}}finally{d(false);}},[q,o,i]);function ke(f,y){switch(f.type){case "delta":s(m=>m.map(c=>c.id===y?{...c,content:c.content+f.content}:c));break;case "sources":s(m=>m.map(c=>c.id===y?{...c,sources:f.sources}:c));break;case "done":s(m=>m.map(c=>c.id===y?{...c,isStreaming:false}:c));break;case "error":s(m=>m.map(c=>c.id===y?{...c,content:"Sorry, something went wrong. Please try again.",isStreaming:false}:c));break}}let z=react.useCallback(()=>a(true),[]),F=react.useCallback(()=>a(false),[]),G=react.useCallback(()=>a(f=>!f),[]),J=react.useCallback(()=>N(f=>!f),[]),Q=react.useCallback(()=>{s([]),I.current=crypto.randomUUID();},[]),ue=react.useMemo(()=>({messages:i,isLoading:k,isOpen:g,isExpanded:C,sendMessage:Z,clearMessages:Q,open:z,close:F,toggle:G,toggleExpanded:J,onSourceClick:t}),[i,k,g,C,Z,Q,z,F,G,J,t]);return jsxRuntime.jsx(Y.Provider,{value:ue,children:n})}function w(){let e=react.useContext(Y);if(!e)throw new Error("useKookeeChat must be used within a KookeeChatProvider");return e}l__default.default.registerLanguage("bash",ee__default.default);l__default.default.registerLanguage("sh",ee__default.default);l__default.default.registerLanguage("css",ye__default.default);l__default.default.registerLanguage("javascript",V__default.default);l__default.default.registerLanguage("js",V__default.default);l__default.default.registerLanguage("json",be__default.default);l__default.default.registerLanguage("typescript",A__default.default);l__default.default.registerLanguage("ts",A__default.default);l__default.default.registerLanguage("tsx",A__default.default);l__default.default.registerLanguage("jsx",V__default.default);l__default.default.registerLanguage("xml",oe__default.default);l__default.default.registerLanguage("html",oe__default.default);var U=new marked.Renderer;U.code=({text:e,lang:o})=>`<div class="kookee-code-block">${`<div class="kookee-code-block__header">${o?`<span class="kookee-code-block__language">${o}</span>`:""}<button type="button" class="kookee-code-block__copy" onclick="(function(btn){var code=btn.closest('.kookee-code-block').querySelector('code').textContent;navigator.clipboard.writeText(code);btn.textContent='Copied!';setTimeout(function(){btn.textContent='Copy'},2000)})(this)" title="Copy code">Copy</button></div>`}<pre><code class="hljs">${e}</code></pre></div>`;U.link=({href:e,text:o})=>`<a href="${e}" target="_blank" rel="noopener noreferrer">${o}</a>`;var Me=new marked.Marked(markedHighlight.markedHighlight({emptyLangClass:"",langPrefix:"hljs language-",highlight(e,o){return o&&l__default.default.getLanguage(o)?l__default.default.highlight(e,{language:o}).value:l__default.default.highlightAuto(e).value}}),{renderer:U,gfm:true,breaks:true});function te(e){return e?Me.parse(e):""}function se({content:e}){let[o,t]=react.useState(false),n=react.useCallback(async()=>{try{await navigator.clipboard.writeText(e),t(!0),setTimeout(()=>t(!1),2e3);}catch{}},[e]);return jsxRuntime.jsx("div",{className:"kookee-message-actions",children:jsxRuntime.jsx("button",{type:"button",className:"kookee-action-button",onClick:n,"aria-label":o?"Copied":"Copy message",children:o?jsxRuntime.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:jsxRuntime.jsx("path",{d:"M20 6 9 17l-5-5"})}):jsxRuntime.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsxRuntime.jsx("rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2"}),jsxRuntime.jsx("path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"})]})})})}function re({sources:e,onSourceClick:o}){return jsxRuntime.jsxs("div",{className:"kookee-sources",children:[jsxRuntime.jsx("span",{className:"kookee-sources-label",children:"Based on:"}),jsxRuntime.jsx("div",{className:"kookee-sources-list",children:e.map(t=>jsxRuntime.jsx("button",{type:"button",className:`kookee-source-link${o?" kookee-source-link--clickable":""}`,onClick:()=>o?.(t),disabled:!o,children:t.title},t.id))})]})}function ne({message:e,onSourceClick:o}){let t=e.role==="user";return jsxRuntime.jsxs("div",{className:`kookee-message kookee-message-${e.role}`,children:[!t&&jsxRuntime.jsx("div",{className:"kookee-message-avatar",children:jsxRuntime.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsxRuntime.jsx("path",{d:"M12 8V4H8"}),jsxRuntime.jsx("rect",{width:"16",height:"12",x:"4",y:"8",rx:"2"}),jsxRuntime.jsx("path",{d:"M2 14h2"}),jsxRuntime.jsx("path",{d:"M20 14h2"}),jsxRuntime.jsx("path",{d:"M15 13v2"}),jsxRuntime.jsx("path",{d:"M9 13v2"})]})}),jsxRuntime.jsxs("div",{className:"kookee-message-content",children:[jsxRuntime.jsxs("div",{className:"kookee-message-bubble",children:[t?jsxRuntime.jsx("div",{className:"kookee-message-text kookee-message-text--plain",children:e.content}):jsxRuntime.jsx("div",{className:"kookee-message-text kookee-message-text--markdown",dangerouslySetInnerHTML:{__html:te(e.content)}}),e.isStreaming&&jsxRuntime.jsxs("span",{className:"kookee-streaming-dots",children:[jsxRuntime.jsx("span",{className:"kookee-streaming-dot"}),jsxRuntime.jsx("span",{className:"kookee-streaming-dot"}),jsxRuntime.jsx("span",{className:"kookee-streaming-dot"})]})]}),!t&&!e.isStreaming&&e.sources&&e.sources.length>0&&jsxRuntime.jsx(re,{sources:e.sources,onSourceClick:o}),!t&&!e.isStreaming&&jsxRuntime.jsx(se,{content:e.content})]})]})}function ae(){return jsxRuntime.jsxs("div",{className:"kookee-message kookee-message-assistant",children:[jsxRuntime.jsx("div",{className:"kookee-message-avatar",children:jsxRuntime.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsxRuntime.jsx("path",{d:"M12 8V4H8"}),jsxRuntime.jsx("rect",{width:"16",height:"12",x:"4",y:"8",rx:"2"}),jsxRuntime.jsx("path",{d:"M2 14h2"}),jsxRuntime.jsx("path",{d:"M20 14h2"}),jsxRuntime.jsx("path",{d:"M15 13v2"}),jsxRuntime.jsx("path",{d:"M9 13v2"})]})}),jsxRuntime.jsx("div",{className:"kookee-message-content",children:jsxRuntime.jsx("div",{className:"kookee-message-bubble",children:jsxRuntime.jsxs("div",{className:"kookee-loading-dots",children:[jsxRuntime.jsx("span",{className:"kookee-loading-dot"}),jsxRuntime.jsx("span",{className:"kookee-loading-dot"}),jsxRuntime.jsx("span",{className:"kookee-loading-dot"})]})})})]})}function B({messages:e,isLoading:o,emptyState:t,onSourceClick:n}){let i=react.useRef(null);return react.useEffect(()=>{i.current?.scrollIntoView({behavior:"smooth"});},[e,o]),jsxRuntime.jsxs("div",{className:"kookee-message-list",children:[jsxRuntime.jsx("div",{className:"kookee-message-list-spacer"}),t,e.map(s=>jsxRuntime.jsx(ne,{message:s,onSourceClick:n},s.id)),o&&!e.some(s=>s.isStreaming)&&jsxRuntime.jsx(ae,{}),jsxRuntime.jsx("div",{ref:i})]})}function $({placeholder:e="Ask a question...",onSubmit:o,disabled:t}){let[n,i]=react.useState(""),s=react.useRef(null),k=react.useCallback(()=>{let a=s.current;a&&(a.style.height="auto",a.style.height=`${Math.min(a.scrollHeight,120)}px`);},[]),d=react.useCallback(()=>{let a=n.trim();!a||t||(o(a),i(""),s.current&&(s.current.style.height="auto"));},[n,t,o]),g=react.useCallback(a=>{a.key==="Enter"&&!a.shiftKey&&(a.preventDefault(),d());},[d]);return jsxRuntime.jsxs("div",{className:"kookee-prompt-input",children:[jsxRuntime.jsx("textarea",{ref:s,className:"kookee-prompt-textarea",placeholder:e,value:n,onChange:a=>{i(a.target.value),k();},onKeyDown:g,disabled:t,rows:1}),jsxRuntime.jsx("button",{type:"button",className:"kookee-prompt-submit",onClick:d,disabled:t||!n.trim(),"aria-label":"Send message",children:jsxRuntime.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsxRuntime.jsx("path",{d:"m5 12 7-7 7 7"}),jsxRuntime.jsx("path",{d:"M12 19V5"})]})})]})}function j({suggestions:e,onSelect:o}){return e.length===0?null:jsxRuntime.jsx("div",{className:"kookee-suggestions",children:e.map(t=>jsxRuntime.jsx("button",{type:"button",className:"kookee-suggestion-pill",onClick:()=>o(t),children:t},t))})}function le(e){return !e||e==="light"?"":e==="dark"?"kookee-dark":"kookee-auto"}function de(e){if(e)return {"--kookee-primary":e,"--kookee-primary-hover":e,"--kookee-bg-user":e}}function Te(){let{isOpen:e,toggle:o}=w();return jsxRuntime.jsx("button",{type:"button",className:"kookee-widget-bubble",onClick:o,"aria-label":e?"Close chat":"Open chat",children:e?jsxRuntime.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsxRuntime.jsx("path",{d:"M18 6 6 18"}),jsxRuntime.jsx("path",{d:"m6 6 12 12"})]}):jsxRuntime.jsx("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:jsxRuntime.jsx("path",{d:"M7.9 20A9 9 0 1 0 4 16.1L2 22Z"})})})}function $e({suggestions:e,placeholder:o,greeting:t,title:n}){let{isOpen:i,isExpanded:s,messages:k,isLoading:d,sendMessage:g,toggleExpanded:a,close:C,onSourceClick:N}=w();if(!i)return null;let P=k.length===0&&e&&e.length>0;return jsxRuntime.jsxs("div",{className:`kookee-widget-panel${s?" kookee-widget-panel--expanded":""}`,children:[jsxRuntime.jsxs("div",{className:"kookee-widget-header",children:[jsxRuntime.jsx("span",{className:"kookee-widget-header-title",children:n||"Support"}),jsxRuntime.jsxs("div",{className:"kookee-widget-header-actions",children:[jsxRuntime.jsx("button",{type:"button",className:"kookee-widget-header-button",onClick:a,"aria-label":s?"Collapse chat":"Expand chat",children:s?jsxRuntime.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsxRuntime.jsx("polyline",{points:"4 14 10 14 10 20"}),jsxRuntime.jsx("polyline",{points:"20 10 14 10 14 4"}),jsxRuntime.jsx("line",{x1:"14",y1:"10",x2:"21",y2:"3"}),jsxRuntime.jsx("line",{x1:"3",y1:"21",x2:"10",y2:"14"})]}):jsxRuntime.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsxRuntime.jsx("polyline",{points:"15 3 21 3 21 9"}),jsxRuntime.jsx("polyline",{points:"9 21 3 21 3 15"}),jsxRuntime.jsx("line",{x1:"21",y1:"3",x2:"14",y2:"10"}),jsxRuntime.jsx("line",{x1:"3",y1:"21",x2:"10",y2:"14"})]})}),jsxRuntime.jsx("button",{type:"button",className:"kookee-widget-header-button",onClick:C,"aria-label":"Close chat",children:jsxRuntime.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsxRuntime.jsx("path",{d:"M18 6 6 18"}),jsxRuntime.jsx("path",{d:"m6 6 12 12"})]})})]})]}),jsxRuntime.jsxs("div",{className:"kookee-widget-body",children:[t&&k.length===0&&jsxRuntime.jsx("div",{className:"kookee-chat-greeting",children:t}),P&&jsxRuntime.jsx(j,{suggestions:e,onSelect:g}),jsxRuntime.jsx(B,{messages:k,isLoading:d,onSourceClick:N})]}),jsxRuntime.jsx("div",{className:"kookee-widget-footer",children:jsxRuntime.jsx($,{placeholder:o,onSubmit:g,disabled:d})})]})}function je({clientOptions:e,locale:o,position:t="bottom-right",theme:n,primaryColor:i,suggestions:s,placeholder:k,greeting:d,title:g,onSourceClick:a}){let C=le(n),N=`kookee-widget kookee-widget-${t}${C?` ${C}`:""}`;return jsxRuntime.jsx(K,{clientOptions:e,locale:o,onSourceClick:a,children:jsxRuntime.jsxs("div",{className:N,style:de(i),children:[jsxRuntime.jsx($e,{suggestions:s,placeholder:k,greeting:d,title:g}),jsxRuntime.jsx(Te,{})]})})}function Re({suggestions:e,placeholder:o,greeting:t}){let{messages:n,isLoading:i,sendMessage:s,onSourceClick:k}=w(),d=n.length===0&&e&&e.length>0,g=n.length===0;return jsxRuntime.jsxs("div",{className:"kookee-chat",children:[jsxRuntime.jsx(B,{messages:n,isLoading:i,onSourceClick:k,emptyState:g?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[t&&jsxRuntime.jsx("div",{className:"kookee-chat-greeting",children:t}),d&&jsxRuntime.jsx(j,{suggestions:e,onSelect:s})]}):void 0}),jsxRuntime.jsx($,{placeholder:o,onSubmit:s,disabled:i})]})}function Ve({clientOptions:e,locale:o,suggestions:t,placeholder:n,greeting:i,onSourceClick:s}){return jsxRuntime.jsx(K,{clientOptions:e,locale:o,onSourceClick:s,children:jsxRuntime.jsx(Re,{suggestions:t,placeholder:n,greeting:i})})}exports.KookeeChat=Ve;exports.KookeeChatProvider=K;exports.KookeeChatWidget=je;exports.useKookeeChat=w;//# sourceMappingURL=index.cjs.map
|
|
1
|
+
'use strict';var react=require('react'),sdk=require('@kookee/sdk'),jsxRuntime=require('react/jsx-runtime'),l=require('highlight.js/lib/core'),ee=require('highlight.js/lib/languages/bash'),ye=require('highlight.js/lib/languages/css'),R=require('highlight.js/lib/languages/javascript'),be=require('highlight.js/lib/languages/json'),A=require('highlight.js/lib/languages/typescript'),oe=require('highlight.js/lib/languages/xml'),marked=require('marked'),markedHighlight=require('marked-highlight');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var l__default=/*#__PURE__*/_interopDefault(l);var ee__default=/*#__PURE__*/_interopDefault(ee);var ye__default=/*#__PURE__*/_interopDefault(ye);var R__default=/*#__PURE__*/_interopDefault(R);var be__default=/*#__PURE__*/_interopDefault(be);var A__default=/*#__PURE__*/_interopDefault(A);var oe__default=/*#__PURE__*/_interopDefault(oe);var Y=react.createContext(null);function K({clientOptions:e,locale:o,onSourceClick:t,children:n}){let[i,s]=react.useState([]),[k,d]=react.useState(false),[g,a]=react.useState(false),[C,N]=react.useState(false),P=react.useRef(null),W=react.useRef(crypto.randomUUID()),q=react.useCallback(()=>(P.current||(P.current=new sdk.Kookee(e)),P.current),[e]),Z=react.useCallback(async f=>{let y={id:crypto.randomUUID(),role:"user",content:f};s(h=>[...h,y]),d(true);let m=q(),c=[...i,y].map(h=>({role:h.role,content:h.content})),S=crypto.randomUUID();try{let h=m.help.chatStream({messages:c,locale:o,sessionId:W.current});s(x=>[...x,{id:S,role:"assistant",content:"",isStreaming:!0}]),d(!1);for await(let x of h)ke(x,S);}catch{try{let h=await m.help.chat({messages:c,locale:o,sessionId:W.current}),x={id:S,role:"assistant",content:h.message,sources:h.sources};s(j=>[...j.filter(ge=>ge.id!==S),x]);}catch{s(h=>[...h.filter(j=>j.id!==S),{id:S,role:"assistant",content:"Sorry, something went wrong. Please try again."}]);}}finally{d(false);}},[q,o,i]);function ke(f,y){switch(f.type){case "delta":s(m=>m.map(c=>c.id===y?{...c,content:c.content+f.content}:c));break;case "sources":s(m=>m.map(c=>c.id===y?{...c,sources:f.sources}:c));break;case "done":s(m=>m.map(c=>c.id===y?{...c,isStreaming:false}:c));break;case "error":s(m=>m.map(c=>c.id===y?{...c,content:"Sorry, something went wrong. Please try again.",isStreaming:false}:c));break}}let z=react.useCallback(()=>a(true),[]),F=react.useCallback(()=>a(false),[]),G=react.useCallback(()=>a(f=>!f),[]),J=react.useCallback(()=>N(f=>!f),[]),Q=react.useCallback(()=>{s([]),W.current=crypto.randomUUID();},[]),ue=react.useMemo(()=>({messages:i,isLoading:k,isOpen:g,isExpanded:C,sendMessage:Z,clearMessages:Q,open:z,close:F,toggle:G,toggleExpanded:J,onSourceClick:t}),[i,k,g,C,Z,Q,z,F,G,J,t]);return jsxRuntime.jsx(Y.Provider,{value:ue,children:n})}function w(){let e=react.useContext(Y);if(!e)throw new Error("useKookeeChat must be used within a KookeeChatProvider");return e}l__default.default.registerLanguage("bash",ee__default.default);l__default.default.registerLanguage("sh",ee__default.default);l__default.default.registerLanguage("css",ye__default.default);l__default.default.registerLanguage("javascript",R__default.default);l__default.default.registerLanguage("js",R__default.default);l__default.default.registerLanguage("json",be__default.default);l__default.default.registerLanguage("typescript",A__default.default);l__default.default.registerLanguage("ts",A__default.default);l__default.default.registerLanguage("tsx",A__default.default);l__default.default.registerLanguage("jsx",R__default.default);l__default.default.registerLanguage("xml",oe__default.default);l__default.default.registerLanguage("html",oe__default.default);var U=new marked.Renderer;U.code=({text:e,lang:o})=>`<div class="kookee-code-block">${`<div class="kookee-code-block__header">${o?`<span class="kookee-code-block__language">${o}</span>`:""}<button type="button" class="kookee-code-block__copy" onclick="(function(btn){var code=btn.closest('.kookee-code-block').querySelector('code').textContent;navigator.clipboard.writeText(code);btn.textContent='Copied!';setTimeout(function(){btn.textContent='Copy'},2000)})(this)" title="Copy code">Copy</button></div>`}<pre><code class="hljs">${e}</code></pre></div>`;U.link=({href:e,text:o})=>`<a href="${e}" target="_blank" rel="noopener noreferrer">${o}</a>`;var Me=new marked.Marked(markedHighlight.markedHighlight({emptyLangClass:"",langPrefix:"hljs language-",highlight(e,o){return o&&l__default.default.getLanguage(o)?l__default.default.highlight(e,{language:o}).value:l__default.default.highlightAuto(e).value}}),{renderer:U,gfm:true,breaks:true});function te(e){return e?Me.parse(e):""}function se({content:e}){let[o,t]=react.useState(false),n=react.useCallback(async()=>{try{await navigator.clipboard.writeText(e),t(!0),setTimeout(()=>t(!1),2e3);}catch{}},[e]);return jsxRuntime.jsx("div",{className:"kookee-message-actions",children:jsxRuntime.jsx("button",{type:"button",className:"kookee-action-button",onClick:n,"aria-label":o?"Copied":"Copy message",children:o?jsxRuntime.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:jsxRuntime.jsx("path",{d:"M20 6 9 17l-5-5"})}):jsxRuntime.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsxRuntime.jsx("rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2"}),jsxRuntime.jsx("path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"})]})})})}function re({sources:e,onSourceClick:o}){return jsxRuntime.jsxs("div",{className:"kookee-sources",children:[jsxRuntime.jsx("span",{className:"kookee-sources-label",children:"Based on:"}),jsxRuntime.jsx("div",{className:"kookee-sources-list",children:e.map(t=>jsxRuntime.jsx("button",{type:"button",className:`kookee-source-link${o?" kookee-source-link--clickable":""}`,onClick:()=>o?.(t),disabled:!o,children:t.title},t.id))})]})}function ne({message:e,onSourceClick:o}){let t=e.role==="user";return jsxRuntime.jsxs("div",{className:`kookee-message kookee-message-${e.role}`,children:[!t&&jsxRuntime.jsx("div",{className:"kookee-message-avatar",children:jsxRuntime.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsxRuntime.jsx("path",{d:"M12 8V4H8"}),jsxRuntime.jsx("rect",{width:"16",height:"12",x:"4",y:"8",rx:"2"}),jsxRuntime.jsx("path",{d:"M2 14h2"}),jsxRuntime.jsx("path",{d:"M20 14h2"}),jsxRuntime.jsx("path",{d:"M15 13v2"}),jsxRuntime.jsx("path",{d:"M9 13v2"})]})}),jsxRuntime.jsxs("div",{className:"kookee-message-content",children:[jsxRuntime.jsxs("div",{className:"kookee-message-bubble",children:[t?jsxRuntime.jsx("div",{className:"kookee-message-text kookee-message-text--plain",children:e.content}):jsxRuntime.jsx("div",{className:"kookee-message-text kookee-message-text--markdown",dangerouslySetInnerHTML:{__html:te(e.content)}}),e.isStreaming&&jsxRuntime.jsxs("span",{className:"kookee-streaming-dots",children:[jsxRuntime.jsx("span",{className:"kookee-streaming-dot"}),jsxRuntime.jsx("span",{className:"kookee-streaming-dot"}),jsxRuntime.jsx("span",{className:"kookee-streaming-dot"})]})]}),!t&&!e.isStreaming&&e.sources&&e.sources.length>0&&jsxRuntime.jsx(re,{sources:e.sources,onSourceClick:o}),!t&&!e.isStreaming&&jsxRuntime.jsx(se,{content:e.content})]})]})}function ae(){return jsxRuntime.jsxs("div",{className:"kookee-message kookee-message-assistant",children:[jsxRuntime.jsx("div",{className:"kookee-message-avatar",children:jsxRuntime.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsxRuntime.jsx("path",{d:"M12 8V4H8"}),jsxRuntime.jsx("rect",{width:"16",height:"12",x:"4",y:"8",rx:"2"}),jsxRuntime.jsx("path",{d:"M2 14h2"}),jsxRuntime.jsx("path",{d:"M20 14h2"}),jsxRuntime.jsx("path",{d:"M15 13v2"}),jsxRuntime.jsx("path",{d:"M9 13v2"})]})}),jsxRuntime.jsx("div",{className:"kookee-message-content",children:jsxRuntime.jsx("div",{className:"kookee-message-bubble",children:jsxRuntime.jsxs("div",{className:"kookee-loading-dots",children:[jsxRuntime.jsx("span",{className:"kookee-loading-dot"}),jsxRuntime.jsx("span",{className:"kookee-loading-dot"}),jsxRuntime.jsx("span",{className:"kookee-loading-dot"})]})})})]})}function E({messages:e,isLoading:o,emptyState:t,onSourceClick:n}){let i=react.useRef(null);return react.useEffect(()=>{let s=i.current;s&&s.scrollTo({top:s.scrollHeight,behavior:"smooth"});},[e,o]),jsxRuntime.jsxs("div",{ref:i,className:"kookee-message-list",children:[jsxRuntime.jsx("div",{className:"kookee-message-list-spacer"}),t,e.map(s=>jsxRuntime.jsx(ne,{message:s,onSourceClick:n},s.id)),o&&!e.some(s=>s.isStreaming)&&jsxRuntime.jsx(ae,{})]})}function B({placeholder:e="Ask a question...",onSubmit:o,disabled:t}){let[n,i]=react.useState(""),s=react.useRef(null),k=react.useCallback(()=>{let a=s.current;a&&(a.style.height="auto",a.style.height=`${Math.min(a.scrollHeight,120)}px`);},[]),d=react.useCallback(()=>{let a=n.trim();!a||t||(o(a),i(""),s.current&&(s.current.style.height="auto"));},[n,t,o]),g=react.useCallback(a=>{a.key==="Enter"&&!a.shiftKey&&(a.preventDefault(),d());},[d]);return jsxRuntime.jsxs("div",{className:"kookee-prompt-input",children:[jsxRuntime.jsx("textarea",{ref:s,className:"kookee-prompt-textarea",placeholder:e,value:n,onChange:a=>{i(a.target.value),k();},onKeyDown:g,disabled:t,rows:1}),jsxRuntime.jsx("button",{type:"button",className:"kookee-prompt-submit",onClick:d,disabled:t||!n.trim(),"aria-label":"Send message",children:jsxRuntime.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsxRuntime.jsx("path",{d:"m5 12 7-7 7 7"}),jsxRuntime.jsx("path",{d:"M12 19V5"})]})})]})}function $({suggestions:e,onSelect:o}){return e.length===0?null:jsxRuntime.jsx("div",{className:"kookee-suggestions",children:e.map(t=>jsxRuntime.jsx("button",{type:"button",className:"kookee-suggestion-pill",onClick:()=>o(t),children:t},t))})}function le(e){return !e||e==="light"?"":e==="dark"?"kookee-dark":"kookee-auto"}function de(e){if(e)return {"--kookee-primary":e,"--kookee-primary-hover":e,"--kookee-bg-user":e}}function Be(){let{isOpen:e,toggle:o}=w();return jsxRuntime.jsx("button",{type:"button",className:"kookee-widget-bubble",onClick:o,"aria-label":e?"Close chat":"Open chat",children:e?jsxRuntime.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsxRuntime.jsx("path",{d:"M18 6 6 18"}),jsxRuntime.jsx("path",{d:"m6 6 12 12"})]}):jsxRuntime.jsx("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:jsxRuntime.jsx("path",{d:"M7.9 20A9 9 0 1 0 4 16.1L2 22Z"})})})}function $e({suggestions:e,placeholder:o,greeting:t,title:n}){let{isOpen:i,isExpanded:s,messages:k,isLoading:d,sendMessage:g,toggleExpanded:a,close:C,onSourceClick:N}=w();if(!i)return null;let P=k.length===0&&e&&e.length>0;return jsxRuntime.jsxs("div",{className:`kookee-widget-panel${s?" kookee-widget-panel--expanded":""}`,children:[jsxRuntime.jsxs("div",{className:"kookee-widget-header",children:[jsxRuntime.jsx("span",{className:"kookee-widget-header-title",children:n||"Support"}),jsxRuntime.jsxs("div",{className:"kookee-widget-header-actions",children:[jsxRuntime.jsx("button",{type:"button",className:"kookee-widget-header-button",onClick:a,"aria-label":s?"Collapse chat":"Expand chat",children:s?jsxRuntime.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsxRuntime.jsx("polyline",{points:"4 14 10 14 10 20"}),jsxRuntime.jsx("polyline",{points:"20 10 14 10 14 4"}),jsxRuntime.jsx("line",{x1:"14",y1:"10",x2:"21",y2:"3"}),jsxRuntime.jsx("line",{x1:"3",y1:"21",x2:"10",y2:"14"})]}):jsxRuntime.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsxRuntime.jsx("polyline",{points:"15 3 21 3 21 9"}),jsxRuntime.jsx("polyline",{points:"9 21 3 21 3 15"}),jsxRuntime.jsx("line",{x1:"21",y1:"3",x2:"14",y2:"10"}),jsxRuntime.jsx("line",{x1:"3",y1:"21",x2:"10",y2:"14"})]})}),jsxRuntime.jsx("button",{type:"button",className:"kookee-widget-header-button",onClick:C,"aria-label":"Close chat",children:jsxRuntime.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsxRuntime.jsx("path",{d:"M18 6 6 18"}),jsxRuntime.jsx("path",{d:"m6 6 12 12"})]})})]})]}),jsxRuntime.jsxs("div",{className:"kookee-widget-body",children:[t&&k.length===0&&jsxRuntime.jsx("div",{className:"kookee-chat-greeting",children:t}),P&&jsxRuntime.jsx($,{suggestions:e,onSelect:g}),jsxRuntime.jsx(E,{messages:k,isLoading:d,onSourceClick:N})]}),jsxRuntime.jsx("div",{className:"kookee-widget-footer",children:jsxRuntime.jsx(B,{placeholder:o,onSubmit:g,disabled:d})})]})}function je({clientOptions:e,locale:o,position:t="bottom-right",theme:n,primaryColor:i,suggestions:s,placeholder:k,greeting:d,title:g,onSourceClick:a}){let C=le(n),N=`kookee-widget kookee-widget-${t}${C?` ${C}`:""}`;return jsxRuntime.jsx(K,{clientOptions:e,locale:o,onSourceClick:a,children:jsxRuntime.jsxs("div",{className:N,style:de(i),children:[jsxRuntime.jsx($e,{suggestions:s,placeholder:k,greeting:d,title:g}),jsxRuntime.jsx(Be,{})]})})}function Re({suggestions:e,placeholder:o,greeting:t}){let{messages:n,isLoading:i,sendMessage:s,onSourceClick:k}=w(),d=n.length===0&&e&&e.length>0,g=n.length===0;return jsxRuntime.jsxs("div",{className:"kookee-chat",children:[jsxRuntime.jsx(E,{messages:n,isLoading:i,onSourceClick:k,emptyState:g?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[t&&jsxRuntime.jsx("div",{className:"kookee-chat-greeting",children:t}),d&&jsxRuntime.jsx($,{suggestions:e,onSelect:s})]}):void 0}),jsxRuntime.jsx(B,{placeholder:o,onSubmit:s,disabled:i})]})}function Ae({clientOptions:e,locale:o,suggestions:t,placeholder:n,greeting:i,onSourceClick:s}){return jsxRuntime.jsx(K,{clientOptions:e,locale:o,onSourceClick:s,children:jsxRuntime.jsx(Re,{suggestions:t,placeholder:n,greeting:i})})}exports.KookeeChat=Ae;exports.KookeeChatProvider=K;exports.KookeeChatWidget=je;exports.useKookeeChat=w;//# sourceMappingURL=index.cjs.map
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/kookee-chat-provider.tsx","../src/lib/utils/markdown.ts","../src/lib/components/message-actions.tsx","../src/lib/components/sources.tsx","../src/lib/components/message.tsx","../src/lib/components/loading-indicator.tsx","../src/lib/components/message-list.tsx","../src/lib/components/prompt-input.tsx","../src/lib/components/suggestions.tsx","../src/lib/theme.ts","../src/lib/kookee-chat-widget.tsx","../src/lib/kookee-chat.tsx"],"names":["KookeeChatContext","createContext","KookeeChatProvider","clientOptions","locale","onSourceClick","children","messages","setMessages","useState","isLoading","setIsLoading","isOpen","setIsOpen","isExpanded","setIsExpanded","clientRef","useRef","sessionIdRef","getClient","useCallback","Kookee","sendMessage","content","userMessage","prev","client","conversationMessages","m","assistantMessageId","stream","chunk","handleStreamChunk","response","assistantMessage","messageId","open","close","toggle","toggleExpanded","clearMessages","value","useMemo","jsx","useKookeeChat","context","useContext","hljs","bash","css","javascript","json","typescript","xml","renderer","Renderer","text","lang","href","marked","Marked","markedHighlight","code","parseMarkdown","MessageActions","copied","setCopied","handleCopy","jsxs","Sources","sources","source","Message","message","isUser","LoadingIndicator","MessageList","emptyState","bottomRef","useEffect","PromptInput","placeholder","onSubmit","disabled","setValue","textareaRef","adjustHeight","textarea","handleSubmit","trimmed","handleKeyDown","e","Suggestions","suggestions","onSelect","suggestion","getThemeClass","theme","getWidgetStyle","primaryColor","ChatBubble","ChatPanel","greeting","title","showSuggestions","KookeeChatWidget","position","themeClass","className","ChatInner","showEmptyState","Fragment","KookeeChat"],"mappings":"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","file":"index.cjs","sourcesContent":["import { createContext, useCallback, useContext, useMemo, useRef, useState } from 'react';\nimport { Kookee } from '@kookee/sdk';\nimport type { HelpChatStreamChunk } from '@kookee/sdk';\nimport type { ChatMessage, KookeeChatContextValue, KookeeChatProviderProps } from './types';\n\nconst KookeeChatContext = createContext<KookeeChatContextValue | null>(null);\n\nexport function KookeeChatProvider({ clientOptions, locale, onSourceClick, children }: KookeeChatProviderProps) {\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isOpen, setIsOpen] = useState(false);\n const [isExpanded, setIsExpanded] = useState(false);\n const clientRef = useRef<Kookee | null>(null);\n const sessionIdRef = useRef<string>(crypto.randomUUID());\n\n const getClient = useCallback(() => {\n if (!clientRef.current) {\n clientRef.current = new Kookee(clientOptions);\n }\n return clientRef.current;\n }, [clientOptions]);\n\n const sendMessage = useCallback(\n async (content: string) => {\n const userMessage: ChatMessage = {\n id: crypto.randomUUID(),\n role: 'user',\n content,\n };\n\n setMessages((prev) => [...prev, userMessage]);\n setIsLoading(true);\n\n const client = getClient();\n const conversationMessages = [...messages, userMessage].map((m) => ({\n role: m.role,\n content: m.content,\n }));\n\n const assistantMessageId = crypto.randomUUID();\n\n try {\n const stream = client.help.chatStream({\n messages: conversationMessages,\n locale,\n sessionId: sessionIdRef.current,\n });\n\n setMessages((prev) => [\n ...prev,\n { id: assistantMessageId, role: 'assistant', content: '', isStreaming: true },\n ]);\n setIsLoading(false);\n\n for await (const chunk of stream) {\n handleStreamChunk(chunk, assistantMessageId);\n }\n } catch {\n // Fallback to non-streaming API\n try {\n const response = await client.help.chat({\n messages: conversationMessages,\n locale,\n sessionId: sessionIdRef.current,\n });\n\n const assistantMessage: ChatMessage = {\n id: assistantMessageId,\n role: 'assistant',\n content: response.message,\n sources: response.sources,\n };\n\n setMessages((prev) => {\n const withoutStreaming = prev.filter((m) => m.id !== assistantMessageId);\n return [...withoutStreaming, assistantMessage];\n });\n } catch {\n setMessages((prev) => {\n const withoutStreaming = prev.filter((m) => m.id !== assistantMessageId);\n return [\n ...withoutStreaming,\n {\n id: assistantMessageId,\n role: 'assistant' as const,\n content: 'Sorry, something went wrong. Please try again.',\n },\n ];\n });\n }\n } finally {\n setIsLoading(false);\n }\n },\n [getClient, locale, messages],\n );\n\n function handleStreamChunk(chunk: HelpChatStreamChunk, messageId: string) {\n switch (chunk.type) {\n case 'delta':\n setMessages((prev) =>\n prev.map((m) => (m.id === messageId ? { ...m, content: m.content + chunk.content } : m)),\n );\n break;\n case 'sources':\n setMessages((prev) =>\n prev.map((m) => (m.id === messageId ? { ...m, sources: chunk.sources } : m)),\n );\n break;\n case 'done':\n setMessages((prev) =>\n prev.map((m) => (m.id === messageId ? { ...m, isStreaming: false } : m)),\n );\n break;\n case 'error':\n setMessages((prev) =>\n prev.map((m) =>\n m.id === messageId\n ? { ...m, content: 'Sorry, something went wrong. Please try again.', isStreaming: false }\n : m,\n ),\n );\n break;\n }\n }\n\n const open = useCallback(() => setIsOpen(true), []);\n const close = useCallback(() => setIsOpen(false), []);\n const toggle = useCallback(() => setIsOpen((prev) => !prev), []);\n const toggleExpanded = useCallback(() => setIsExpanded((prev) => !prev), []);\n const clearMessages = useCallback(() => {\n setMessages([]);\n sessionIdRef.current = crypto.randomUUID();\n }, []);\n\n const value = useMemo<KookeeChatContextValue>(\n () => ({ messages, isLoading, isOpen, isExpanded, sendMessage, clearMessages, open, close, toggle, toggleExpanded, onSourceClick }),\n [messages, isLoading, isOpen, isExpanded, sendMessage, clearMessages, open, close, toggle, toggleExpanded, onSourceClick],\n );\n\n return <KookeeChatContext.Provider value={value}>{children}</KookeeChatContext.Provider>;\n}\n\nexport function useKookeeChat(): KookeeChatContextValue {\n const context = useContext(KookeeChatContext);\n if (!context) {\n throw new Error('useKookeeChat must be used within a KookeeChatProvider');\n }\n return context;\n}\n","import hljs from 'highlight.js/lib/core';\nimport bash from 'highlight.js/lib/languages/bash';\nimport css from 'highlight.js/lib/languages/css';\nimport javascript from 'highlight.js/lib/languages/javascript';\nimport json from 'highlight.js/lib/languages/json';\nimport typescript from 'highlight.js/lib/languages/typescript';\nimport xml from 'highlight.js/lib/languages/xml';\nimport { Marked, Renderer } from 'marked';\nimport { markedHighlight } from 'marked-highlight';\n\nhljs.registerLanguage('bash', bash);\nhljs.registerLanguage('sh', bash);\nhljs.registerLanguage('css', css);\nhljs.registerLanguage('javascript', javascript);\nhljs.registerLanguage('js', javascript);\nhljs.registerLanguage('json', json);\nhljs.registerLanguage('typescript', typescript);\nhljs.registerLanguage('ts', typescript);\nhljs.registerLanguage('tsx', typescript);\nhljs.registerLanguage('jsx', javascript);\nhljs.registerLanguage('xml', xml);\nhljs.registerLanguage('html', xml);\n\nconst renderer = new Renderer();\n\nrenderer.code = ({ text, lang }) => {\n const langLabel = lang ? `<span class=\"kookee-code-block__language\">${lang}</span>` : '';\n const copyButton = `<button type=\"button\" class=\"kookee-code-block__copy\" onclick=\"(function(btn){var code=btn.closest('.kookee-code-block').querySelector('code').textContent;navigator.clipboard.writeText(code);btn.textContent='Copied!';setTimeout(function(){btn.textContent='Copy'},2000)})(this)\" title=\"Copy code\">Copy</button>`;\n const header = `<div class=\"kookee-code-block__header\">${langLabel}${copyButton}</div>`;\n return `<div class=\"kookee-code-block\">${header}<pre><code class=\"hljs\">${text}</code></pre></div>`;\n};\n\nrenderer.link = ({ href, text }) => {\n return `<a href=\"${href}\" target=\"_blank\" rel=\"noopener noreferrer\">${text}</a>`;\n};\n\nconst marked = new Marked(\n markedHighlight({\n emptyLangClass: '',\n langPrefix: 'hljs language-',\n highlight(code, lang) {\n if (lang && hljs.getLanguage(lang)) {\n return hljs.highlight(code, { language: lang }).value;\n }\n return hljs.highlightAuto(code).value;\n },\n }),\n {\n renderer,\n gfm: true,\n breaks: true,\n },\n);\n\nexport function parseMarkdown(text: string): string {\n if (!text) return '';\n return marked.parse(text) as string;\n}\n","import { useCallback, useState } from 'react';\n\ninterface MessageActionsProps {\n content: string;\n}\n\nexport function MessageActions({ content }: MessageActionsProps) {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(content);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // Clipboard API not available\n }\n }, [content]);\n\n return (\n <div className=\"kookee-message-actions\">\n <button\n type=\"button\"\n className=\"kookee-action-button\"\n onClick={handleCopy}\n aria-label={copied ? 'Copied' : 'Copy message'}\n >\n {copied ? (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n ) : (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\" />\n <path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\" />\n </svg>\n )}\n </button>\n </div>\n );\n}\n","import type { HelpChatSource } from '@kookee/sdk';\n\ninterface SourcesProps {\n sources: HelpChatSource[];\n onSourceClick?: (source: HelpChatSource) => void;\n}\n\nexport function Sources({ sources, onSourceClick }: SourcesProps) {\n return (\n <div className=\"kookee-sources\">\n <span className=\"kookee-sources-label\">Based on:</span>\n <div className=\"kookee-sources-list\">\n {sources.map((source) => (\n <button\n key={source.id}\n type=\"button\"\n className={`kookee-source-link${onSourceClick ? ' kookee-source-link--clickable' : ''}`}\n onClick={() => onSourceClick?.(source)}\n disabled={!onSourceClick}\n >\n {source.title}\n </button>\n ))}\n </div>\n </div>\n );\n}\n","import type { HelpChatSource } from '@kookee/sdk';\nimport type { ChatMessage } from '../types';\nimport { parseMarkdown } from '../utils/markdown';\nimport { MessageActions } from './message-actions';\nimport { Sources } from './sources';\n\ninterface MessageProps {\n message: ChatMessage;\n onSourceClick?: (source: HelpChatSource) => void;\n}\n\nexport function Message({ message, onSourceClick }: MessageProps) {\n const isUser = message.role === 'user';\n\n return (\n <div className={`kookee-message kookee-message-${message.role}`}>\n {!isUser && (\n <div className=\"kookee-message-avatar\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 8V4H8\" />\n <rect width=\"16\" height=\"12\" x=\"4\" y=\"8\" rx=\"2\" />\n <path d=\"M2 14h2\" />\n <path d=\"M20 14h2\" />\n <path d=\"M15 13v2\" />\n <path d=\"M9 13v2\" />\n </svg>\n </div>\n )}\n <div className=\"kookee-message-content\">\n <div className=\"kookee-message-bubble\">\n {isUser ? (\n <div className=\"kookee-message-text kookee-message-text--plain\">\n {message.content}\n </div>\n ) : (\n <div\n className=\"kookee-message-text kookee-message-text--markdown\"\n dangerouslySetInnerHTML={{ __html: parseMarkdown(message.content) }}\n />\n )}\n {message.isStreaming && (\n <span className=\"kookee-streaming-dots\">\n <span className=\"kookee-streaming-dot\" />\n <span className=\"kookee-streaming-dot\" />\n <span className=\"kookee-streaming-dot\" />\n </span>\n )}\n </div>\n {!isUser && !message.isStreaming && message.sources && message.sources.length > 0 && (\n <Sources sources={message.sources} onSourceClick={onSourceClick} />\n )}\n {!isUser && !message.isStreaming && <MessageActions content={message.content} />}\n </div>\n </div>\n );\n}\n","export function LoadingIndicator() {\n return (\n <div className=\"kookee-message kookee-message-assistant\">\n <div className=\"kookee-message-avatar\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 8V4H8\" />\n <rect width=\"16\" height=\"12\" x=\"4\" y=\"8\" rx=\"2\" />\n <path d=\"M2 14h2\" />\n <path d=\"M20 14h2\" />\n <path d=\"M15 13v2\" />\n <path d=\"M9 13v2\" />\n </svg>\n </div>\n <div className=\"kookee-message-content\">\n <div className=\"kookee-message-bubble\">\n <div className=\"kookee-loading-dots\">\n <span className=\"kookee-loading-dot\" />\n <span className=\"kookee-loading-dot\" />\n <span className=\"kookee-loading-dot\" />\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { useEffect, useRef } from 'react';\nimport type { ReactNode } from 'react';\nimport type { HelpChatSource } from '@kookee/sdk';\nimport type { ChatMessage } from '../types';\nimport { Message } from './message';\nimport { LoadingIndicator } from './loading-indicator';\n\ninterface MessageListProps {\n messages: ChatMessage[];\n isLoading: boolean;\n emptyState?: ReactNode;\n onSourceClick?: (source: HelpChatSource) => void;\n}\n\nexport function MessageList({ messages, isLoading, emptyState, onSourceClick }: MessageListProps) {\n const bottomRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n bottomRef.current?.scrollIntoView({ behavior: 'smooth' });\n }, [messages, isLoading]);\n\n return (\n <div className=\"kookee-message-list\">\n <div className=\"kookee-message-list-spacer\" />\n {emptyState}\n {messages.map((message) => (\n <Message key={message.id} message={message} onSourceClick={onSourceClick} />\n ))}\n {isLoading && !messages.some((m) => m.isStreaming) && <LoadingIndicator />}\n <div ref={bottomRef} />\n </div>\n );\n}\n","import { useCallback, useRef, useState, type KeyboardEvent } from 'react';\n\ninterface PromptInputProps {\n placeholder?: string;\n onSubmit: (content: string) => void;\n disabled?: boolean;\n}\n\nexport function PromptInput({ placeholder = 'Ask a question...', onSubmit, disabled }: PromptInputProps) {\n const [value, setValue] = useState('');\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n const adjustHeight = useCallback(() => {\n const textarea = textareaRef.current;\n if (!textarea) return;\n textarea.style.height = 'auto';\n textarea.style.height = `${Math.min(textarea.scrollHeight, 120)}px`;\n }, []);\n\n const handleSubmit = useCallback(() => {\n const trimmed = value.trim();\n if (!trimmed || disabled) return;\n onSubmit(trimmed);\n setValue('');\n if (textareaRef.current) {\n textareaRef.current.style.height = 'auto';\n }\n }, [value, disabled, onSubmit]);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n },\n [handleSubmit],\n );\n\n return (\n <div className=\"kookee-prompt-input\">\n <textarea\n ref={textareaRef}\n className=\"kookee-prompt-textarea\"\n placeholder={placeholder}\n value={value}\n onChange={(e) => {\n setValue(e.target.value);\n adjustHeight();\n }}\n onKeyDown={handleKeyDown}\n disabled={disabled}\n rows={1}\n />\n <button\n type=\"button\"\n className=\"kookee-prompt-submit\"\n onClick={handleSubmit}\n disabled={disabled || !value.trim()}\n aria-label=\"Send message\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"m5 12 7-7 7 7\" />\n <path d=\"M12 19V5\" />\n </svg>\n </button>\n </div>\n );\n}\n","interface SuggestionsProps {\n suggestions: string[];\n onSelect: (suggestion: string) => void;\n}\n\nexport function Suggestions({ suggestions, onSelect }: SuggestionsProps) {\n if (suggestions.length === 0) return null;\n\n return (\n <div className=\"kookee-suggestions\">\n {suggestions.map((suggestion) => (\n <button\n key={suggestion}\n type=\"button\"\n className=\"kookee-suggestion-pill\"\n onClick={() => onSelect(suggestion)}\n >\n {suggestion}\n </button>\n ))}\n </div>\n );\n}\n","import type { CSSProperties } from 'react';\n\ntype Theme = 'light' | 'dark' | 'auto';\n\nexport function getThemeClass(theme: Theme | undefined): string {\n if (!theme || theme === 'light') return '';\n if (theme === 'dark') return 'kookee-dark';\n return 'kookee-auto';\n}\n\nexport function getWidgetStyle(primaryColor: string | undefined): CSSProperties | undefined {\n if (!primaryColor) return undefined;\n return {\n '--kookee-primary': primaryColor,\n '--kookee-primary-hover': primaryColor,\n '--kookee-bg-user': primaryColor,\n } as CSSProperties;\n}\n","import { KookeeChatProvider, useKookeeChat } from './kookee-chat-provider';\nimport { MessageList } from './components/message-list';\nimport { PromptInput } from './components/prompt-input';\nimport { Suggestions } from './components/suggestions';\nimport { getThemeClass, getWidgetStyle } from './theme';\nimport type { KookeeChatWidgetProps } from './types';\n\nfunction ChatBubble() {\n const { isOpen, toggle } = useKookeeChat();\n\n return (\n <button\n type=\"button\"\n className=\"kookee-widget-bubble\"\n onClick={toggle}\n aria-label={isOpen ? 'Close chat' : 'Open chat'}\n >\n {isOpen ? (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n ) : (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M7.9 20A9 9 0 1 0 4 16.1L2 22Z\" />\n </svg>\n )}\n </button>\n );\n}\n\nfunction ChatPanel({\n suggestions,\n placeholder,\n greeting,\n title,\n}: Pick<KookeeChatWidgetProps, 'suggestions' | 'placeholder' | 'greeting' | 'title'>) {\n const { isOpen, isExpanded, messages, isLoading, sendMessage, toggleExpanded, close, onSourceClick } = useKookeeChat();\n\n if (!isOpen) return null;\n\n const showSuggestions = messages.length === 0 && suggestions && suggestions.length > 0;\n const panelClassName = `kookee-widget-panel${isExpanded ? ' kookee-widget-panel--expanded' : ''}`;\n\n return (\n <div className={panelClassName}>\n <div className=\"kookee-widget-header\">\n <span className=\"kookee-widget-header-title\">{title || 'Support'}</span>\n <div className=\"kookee-widget-header-actions\">\n <button\n type=\"button\"\n className=\"kookee-widget-header-button\"\n onClick={toggleExpanded}\n aria-label={isExpanded ? 'Collapse chat' : 'Expand chat'}\n >\n {isExpanded ? (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"4 14 10 14 10 20\" />\n <polyline points=\"20 10 14 10 14 4\" />\n <line x1=\"14\" y1=\"10\" x2=\"21\" y2=\"3\" />\n <line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\" />\n </svg>\n ) : (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"15 3 21 3 21 9\" />\n <polyline points=\"9 21 3 21 3 15\" />\n <line x1=\"21\" y1=\"3\" x2=\"14\" y2=\"10\" />\n <line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\" />\n </svg>\n )}\n </button>\n <button\n type=\"button\"\n className=\"kookee-widget-header-button\"\n onClick={close}\n aria-label=\"Close chat\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n </button>\n </div>\n </div>\n <div className=\"kookee-widget-body\">\n {greeting && messages.length === 0 && (\n <div className=\"kookee-chat-greeting\">{greeting}</div>\n )}\n {showSuggestions && (\n <Suggestions suggestions={suggestions} onSelect={sendMessage} />\n )}\n <MessageList messages={messages} isLoading={isLoading} onSourceClick={onSourceClick} />\n </div>\n <div className=\"kookee-widget-footer\">\n <PromptInput\n placeholder={placeholder}\n onSubmit={sendMessage}\n disabled={isLoading}\n />\n </div>\n </div>\n );\n}\n\nexport function KookeeChatWidget({\n clientOptions,\n locale,\n position = 'bottom-right',\n theme,\n primaryColor,\n suggestions,\n placeholder,\n greeting,\n title,\n onSourceClick,\n}: KookeeChatWidgetProps) {\n const themeClass = getThemeClass(theme);\n const className = `kookee-widget kookee-widget-${position}${themeClass ? ` ${themeClass}` : ''}`;\n\n return (\n <KookeeChatProvider clientOptions={clientOptions} locale={locale} onSourceClick={onSourceClick}>\n <div className={className} style={getWidgetStyle(primaryColor)}>\n <ChatPanel suggestions={suggestions} placeholder={placeholder} greeting={greeting} title={title} />\n <ChatBubble />\n </div>\n </KookeeChatProvider>\n );\n}\n","import { KookeeChatProvider, useKookeeChat } from './kookee-chat-provider';\nimport { MessageList } from './components/message-list';\nimport { PromptInput } from './components/prompt-input';\nimport { Suggestions } from './components/suggestions';\nimport type { KookeeChatProps } from './types';\n\nfunction ChatInner({ suggestions, placeholder, greeting }: Omit<KookeeChatProps, 'clientOptions' | 'locale' | 'onSourceClick'>) {\n const { messages, isLoading, sendMessage, onSourceClick } = useKookeeChat();\n const showSuggestions = messages.length === 0 && suggestions && suggestions.length > 0;\n const showEmptyState = messages.length === 0;\n\n return (\n <div className=\"kookee-chat\">\n <MessageList\n messages={messages}\n isLoading={isLoading}\n onSourceClick={onSourceClick}\n emptyState={\n showEmptyState ? (\n <>\n {greeting && <div className=\"kookee-chat-greeting\">{greeting}</div>}\n {showSuggestions && (\n <Suggestions suggestions={suggestions} onSelect={sendMessage} />\n )}\n </>\n ) : undefined\n }\n />\n <PromptInput\n placeholder={placeholder}\n onSubmit={sendMessage}\n disabled={isLoading}\n />\n </div>\n );\n}\n\nexport function KookeeChat({ clientOptions, locale, suggestions, placeholder, greeting, onSourceClick }: KookeeChatProps) {\n return (\n <KookeeChatProvider clientOptions={clientOptions} locale={locale} onSourceClick={onSourceClick}>\n <ChatInner suggestions={suggestions} placeholder={placeholder} greeting={greeting} />\n </KookeeChatProvider>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/kookee-chat-provider.tsx","../src/lib/utils/markdown.ts","../src/lib/components/message-actions.tsx","../src/lib/components/sources.tsx","../src/lib/components/message.tsx","../src/lib/components/loading-indicator.tsx","../src/lib/components/message-list.tsx","../src/lib/components/prompt-input.tsx","../src/lib/components/suggestions.tsx","../src/lib/theme.ts","../src/lib/kookee-chat-widget.tsx","../src/lib/kookee-chat.tsx"],"names":["KookeeChatContext","createContext","KookeeChatProvider","clientOptions","locale","onSourceClick","children","messages","setMessages","useState","isLoading","setIsLoading","isOpen","setIsOpen","isExpanded","setIsExpanded","clientRef","useRef","sessionIdRef","getClient","useCallback","Kookee","sendMessage","content","userMessage","prev","client","conversationMessages","m","assistantMessageId","stream","chunk","handleStreamChunk","response","assistantMessage","messageId","open","close","toggle","toggleExpanded","clearMessages","value","useMemo","jsx","useKookeeChat","context","useContext","hljs","bash","css","javascript","json","typescript","xml","renderer","Renderer","text","lang","href","marked","Marked","markedHighlight","code","parseMarkdown","MessageActions","copied","setCopied","handleCopy","jsxs","Sources","sources","source","Message","message","isUser","LoadingIndicator","MessageList","emptyState","containerRef","useEffect","container","PromptInput","placeholder","onSubmit","disabled","setValue","textareaRef","adjustHeight","textarea","handleSubmit","trimmed","handleKeyDown","e","Suggestions","suggestions","onSelect","suggestion","getThemeClass","theme","getWidgetStyle","primaryColor","ChatBubble","ChatPanel","greeting","title","showSuggestions","KookeeChatWidget","position","themeClass","className","ChatInner","showEmptyState","Fragment","KookeeChat"],"mappings":"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","file":"index.cjs","sourcesContent":["import { createContext, useCallback, useContext, useMemo, useRef, useState } from 'react';\nimport { Kookee } from '@kookee/sdk';\nimport type { HelpChatStreamChunk } from '@kookee/sdk';\nimport type { ChatMessage, KookeeChatContextValue, KookeeChatProviderProps } from './types';\n\nconst KookeeChatContext = createContext<KookeeChatContextValue | null>(null);\n\nexport function KookeeChatProvider({ clientOptions, locale, onSourceClick, children }: KookeeChatProviderProps) {\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isOpen, setIsOpen] = useState(false);\n const [isExpanded, setIsExpanded] = useState(false);\n const clientRef = useRef<Kookee | null>(null);\n const sessionIdRef = useRef<string>(crypto.randomUUID());\n\n const getClient = useCallback(() => {\n if (!clientRef.current) {\n clientRef.current = new Kookee(clientOptions);\n }\n return clientRef.current;\n }, [clientOptions]);\n\n const sendMessage = useCallback(\n async (content: string) => {\n const userMessage: ChatMessage = {\n id: crypto.randomUUID(),\n role: 'user',\n content,\n };\n\n setMessages((prev) => [...prev, userMessage]);\n setIsLoading(true);\n\n const client = getClient();\n const conversationMessages = [...messages, userMessage].map((m) => ({\n role: m.role,\n content: m.content,\n }));\n\n const assistantMessageId = crypto.randomUUID();\n\n try {\n const stream = client.help.chatStream({\n messages: conversationMessages,\n locale,\n sessionId: sessionIdRef.current,\n });\n\n setMessages((prev) => [\n ...prev,\n { id: assistantMessageId, role: 'assistant', content: '', isStreaming: true },\n ]);\n setIsLoading(false);\n\n for await (const chunk of stream) {\n handleStreamChunk(chunk, assistantMessageId);\n }\n } catch {\n // Fallback to non-streaming API\n try {\n const response = await client.help.chat({\n messages: conversationMessages,\n locale,\n sessionId: sessionIdRef.current,\n });\n\n const assistantMessage: ChatMessage = {\n id: assistantMessageId,\n role: 'assistant',\n content: response.message,\n sources: response.sources,\n };\n\n setMessages((prev) => {\n const withoutStreaming = prev.filter((m) => m.id !== assistantMessageId);\n return [...withoutStreaming, assistantMessage];\n });\n } catch {\n setMessages((prev) => {\n const withoutStreaming = prev.filter((m) => m.id !== assistantMessageId);\n return [\n ...withoutStreaming,\n {\n id: assistantMessageId,\n role: 'assistant' as const,\n content: 'Sorry, something went wrong. Please try again.',\n },\n ];\n });\n }\n } finally {\n setIsLoading(false);\n }\n },\n [getClient, locale, messages],\n );\n\n function handleStreamChunk(chunk: HelpChatStreamChunk, messageId: string) {\n switch (chunk.type) {\n case 'delta':\n setMessages((prev) =>\n prev.map((m) => (m.id === messageId ? { ...m, content: m.content + chunk.content } : m)),\n );\n break;\n case 'sources':\n setMessages((prev) =>\n prev.map((m) => (m.id === messageId ? { ...m, sources: chunk.sources } : m)),\n );\n break;\n case 'done':\n setMessages((prev) =>\n prev.map((m) => (m.id === messageId ? { ...m, isStreaming: false } : m)),\n );\n break;\n case 'error':\n setMessages((prev) =>\n prev.map((m) =>\n m.id === messageId\n ? { ...m, content: 'Sorry, something went wrong. Please try again.', isStreaming: false }\n : m,\n ),\n );\n break;\n }\n }\n\n const open = useCallback(() => setIsOpen(true), []);\n const close = useCallback(() => setIsOpen(false), []);\n const toggle = useCallback(() => setIsOpen((prev) => !prev), []);\n const toggleExpanded = useCallback(() => setIsExpanded((prev) => !prev), []);\n const clearMessages = useCallback(() => {\n setMessages([]);\n sessionIdRef.current = crypto.randomUUID();\n }, []);\n\n const value = useMemo<KookeeChatContextValue>(\n () => ({ messages, isLoading, isOpen, isExpanded, sendMessage, clearMessages, open, close, toggle, toggleExpanded, onSourceClick }),\n [messages, isLoading, isOpen, isExpanded, sendMessage, clearMessages, open, close, toggle, toggleExpanded, onSourceClick],\n );\n\n return <KookeeChatContext.Provider value={value}>{children}</KookeeChatContext.Provider>;\n}\n\nexport function useKookeeChat(): KookeeChatContextValue {\n const context = useContext(KookeeChatContext);\n if (!context) {\n throw new Error('useKookeeChat must be used within a KookeeChatProvider');\n }\n return context;\n}\n","import hljs from 'highlight.js/lib/core';\nimport bash from 'highlight.js/lib/languages/bash';\nimport css from 'highlight.js/lib/languages/css';\nimport javascript from 'highlight.js/lib/languages/javascript';\nimport json from 'highlight.js/lib/languages/json';\nimport typescript from 'highlight.js/lib/languages/typescript';\nimport xml from 'highlight.js/lib/languages/xml';\nimport { Marked, Renderer } from 'marked';\nimport { markedHighlight } from 'marked-highlight';\n\nhljs.registerLanguage('bash', bash);\nhljs.registerLanguage('sh', bash);\nhljs.registerLanguage('css', css);\nhljs.registerLanguage('javascript', javascript);\nhljs.registerLanguage('js', javascript);\nhljs.registerLanguage('json', json);\nhljs.registerLanguage('typescript', typescript);\nhljs.registerLanguage('ts', typescript);\nhljs.registerLanguage('tsx', typescript);\nhljs.registerLanguage('jsx', javascript);\nhljs.registerLanguage('xml', xml);\nhljs.registerLanguage('html', xml);\n\nconst renderer = new Renderer();\n\nrenderer.code = ({ text, lang }) => {\n const langLabel = lang ? `<span class=\"kookee-code-block__language\">${lang}</span>` : '';\n const copyButton = `<button type=\"button\" class=\"kookee-code-block__copy\" onclick=\"(function(btn){var code=btn.closest('.kookee-code-block').querySelector('code').textContent;navigator.clipboard.writeText(code);btn.textContent='Copied!';setTimeout(function(){btn.textContent='Copy'},2000)})(this)\" title=\"Copy code\">Copy</button>`;\n const header = `<div class=\"kookee-code-block__header\">${langLabel}${copyButton}</div>`;\n return `<div class=\"kookee-code-block\">${header}<pre><code class=\"hljs\">${text}</code></pre></div>`;\n};\n\nrenderer.link = ({ href, text }) => {\n return `<a href=\"${href}\" target=\"_blank\" rel=\"noopener noreferrer\">${text}</a>`;\n};\n\nconst marked = new Marked(\n markedHighlight({\n emptyLangClass: '',\n langPrefix: 'hljs language-',\n highlight(code, lang) {\n if (lang && hljs.getLanguage(lang)) {\n return hljs.highlight(code, { language: lang }).value;\n }\n return hljs.highlightAuto(code).value;\n },\n }),\n {\n renderer,\n gfm: true,\n breaks: true,\n },\n);\n\nexport function parseMarkdown(text: string): string {\n if (!text) return '';\n return marked.parse(text) as string;\n}\n","import { useCallback, useState } from 'react';\n\ninterface MessageActionsProps {\n content: string;\n}\n\nexport function MessageActions({ content }: MessageActionsProps) {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(content);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // Clipboard API not available\n }\n }, [content]);\n\n return (\n <div className=\"kookee-message-actions\">\n <button\n type=\"button\"\n className=\"kookee-action-button\"\n onClick={handleCopy}\n aria-label={copied ? 'Copied' : 'Copy message'}\n >\n {copied ? (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n ) : (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\" />\n <path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\" />\n </svg>\n )}\n </button>\n </div>\n );\n}\n","import type { HelpChatSource } from '@kookee/sdk';\n\ninterface SourcesProps {\n sources: HelpChatSource[];\n onSourceClick?: (source: HelpChatSource) => void;\n}\n\nexport function Sources({ sources, onSourceClick }: SourcesProps) {\n return (\n <div className=\"kookee-sources\">\n <span className=\"kookee-sources-label\">Based on:</span>\n <div className=\"kookee-sources-list\">\n {sources.map((source) => (\n <button\n key={source.id}\n type=\"button\"\n className={`kookee-source-link${onSourceClick ? ' kookee-source-link--clickable' : ''}`}\n onClick={() => onSourceClick?.(source)}\n disabled={!onSourceClick}\n >\n {source.title}\n </button>\n ))}\n </div>\n </div>\n );\n}\n","import type { HelpChatSource } from '@kookee/sdk';\nimport type { ChatMessage } from '../types';\nimport { parseMarkdown } from '../utils/markdown';\nimport { MessageActions } from './message-actions';\nimport { Sources } from './sources';\n\ninterface MessageProps {\n message: ChatMessage;\n onSourceClick?: (source: HelpChatSource) => void;\n}\n\nexport function Message({ message, onSourceClick }: MessageProps) {\n const isUser = message.role === 'user';\n\n return (\n <div className={`kookee-message kookee-message-${message.role}`}>\n {!isUser && (\n <div className=\"kookee-message-avatar\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 8V4H8\" />\n <rect width=\"16\" height=\"12\" x=\"4\" y=\"8\" rx=\"2\" />\n <path d=\"M2 14h2\" />\n <path d=\"M20 14h2\" />\n <path d=\"M15 13v2\" />\n <path d=\"M9 13v2\" />\n </svg>\n </div>\n )}\n <div className=\"kookee-message-content\">\n <div className=\"kookee-message-bubble\">\n {isUser ? (\n <div className=\"kookee-message-text kookee-message-text--plain\">\n {message.content}\n </div>\n ) : (\n <div\n className=\"kookee-message-text kookee-message-text--markdown\"\n dangerouslySetInnerHTML={{ __html: parseMarkdown(message.content) }}\n />\n )}\n {message.isStreaming && (\n <span className=\"kookee-streaming-dots\">\n <span className=\"kookee-streaming-dot\" />\n <span className=\"kookee-streaming-dot\" />\n <span className=\"kookee-streaming-dot\" />\n </span>\n )}\n </div>\n {!isUser && !message.isStreaming && message.sources && message.sources.length > 0 && (\n <Sources sources={message.sources} onSourceClick={onSourceClick} />\n )}\n {!isUser && !message.isStreaming && <MessageActions content={message.content} />}\n </div>\n </div>\n );\n}\n","export function LoadingIndicator() {\n return (\n <div className=\"kookee-message kookee-message-assistant\">\n <div className=\"kookee-message-avatar\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 8V4H8\" />\n <rect width=\"16\" height=\"12\" x=\"4\" y=\"8\" rx=\"2\" />\n <path d=\"M2 14h2\" />\n <path d=\"M20 14h2\" />\n <path d=\"M15 13v2\" />\n <path d=\"M9 13v2\" />\n </svg>\n </div>\n <div className=\"kookee-message-content\">\n <div className=\"kookee-message-bubble\">\n <div className=\"kookee-loading-dots\">\n <span className=\"kookee-loading-dot\" />\n <span className=\"kookee-loading-dot\" />\n <span className=\"kookee-loading-dot\" />\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { useEffect, useRef } from 'react';\nimport type { ReactNode } from 'react';\nimport type { HelpChatSource } from '@kookee/sdk';\nimport type { ChatMessage } from '../types';\nimport { Message } from './message';\nimport { LoadingIndicator } from './loading-indicator';\n\ninterface MessageListProps {\n messages: ChatMessage[];\n isLoading: boolean;\n emptyState?: ReactNode;\n onSourceClick?: (source: HelpChatSource) => void;\n}\n\nexport function MessageList({ messages, isLoading, emptyState, onSourceClick }: MessageListProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const container = containerRef.current;\n if (container) {\n container.scrollTo({\n top: container.scrollHeight,\n behavior: 'smooth',\n });\n }\n }, [messages, isLoading]);\n\n return (\n <div ref={containerRef} className=\"kookee-message-list\">\n <div className=\"kookee-message-list-spacer\" />\n {emptyState}\n {messages.map((message) => (\n <Message key={message.id} message={message} onSourceClick={onSourceClick} />\n ))}\n {isLoading && !messages.some((m) => m.isStreaming) && <LoadingIndicator />}\n </div>\n );\n}\n","import { useCallback, useRef, useState, type KeyboardEvent } from 'react';\n\ninterface PromptInputProps {\n placeholder?: string;\n onSubmit: (content: string) => void;\n disabled?: boolean;\n}\n\nexport function PromptInput({ placeholder = 'Ask a question...', onSubmit, disabled }: PromptInputProps) {\n const [value, setValue] = useState('');\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n const adjustHeight = useCallback(() => {\n const textarea = textareaRef.current;\n if (!textarea) return;\n textarea.style.height = 'auto';\n textarea.style.height = `${Math.min(textarea.scrollHeight, 120)}px`;\n }, []);\n\n const handleSubmit = useCallback(() => {\n const trimmed = value.trim();\n if (!trimmed || disabled) return;\n onSubmit(trimmed);\n setValue('');\n if (textareaRef.current) {\n textareaRef.current.style.height = 'auto';\n }\n }, [value, disabled, onSubmit]);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n },\n [handleSubmit],\n );\n\n return (\n <div className=\"kookee-prompt-input\">\n <textarea\n ref={textareaRef}\n className=\"kookee-prompt-textarea\"\n placeholder={placeholder}\n value={value}\n onChange={(e) => {\n setValue(e.target.value);\n adjustHeight();\n }}\n onKeyDown={handleKeyDown}\n disabled={disabled}\n rows={1}\n />\n <button\n type=\"button\"\n className=\"kookee-prompt-submit\"\n onClick={handleSubmit}\n disabled={disabled || !value.trim()}\n aria-label=\"Send message\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"m5 12 7-7 7 7\" />\n <path d=\"M12 19V5\" />\n </svg>\n </button>\n </div>\n );\n}\n","interface SuggestionsProps {\n suggestions: string[];\n onSelect: (suggestion: string) => void;\n}\n\nexport function Suggestions({ suggestions, onSelect }: SuggestionsProps) {\n if (suggestions.length === 0) return null;\n\n return (\n <div className=\"kookee-suggestions\">\n {suggestions.map((suggestion) => (\n <button\n key={suggestion}\n type=\"button\"\n className=\"kookee-suggestion-pill\"\n onClick={() => onSelect(suggestion)}\n >\n {suggestion}\n </button>\n ))}\n </div>\n );\n}\n","import type { CSSProperties } from 'react';\n\ntype Theme = 'light' | 'dark' | 'auto';\n\nexport function getThemeClass(theme: Theme | undefined): string {\n if (!theme || theme === 'light') return '';\n if (theme === 'dark') return 'kookee-dark';\n return 'kookee-auto';\n}\n\nexport function getWidgetStyle(primaryColor: string | undefined): CSSProperties | undefined {\n if (!primaryColor) return undefined;\n return {\n '--kookee-primary': primaryColor,\n '--kookee-primary-hover': primaryColor,\n '--kookee-bg-user': primaryColor,\n } as CSSProperties;\n}\n","import { KookeeChatProvider, useKookeeChat } from './kookee-chat-provider';\nimport { MessageList } from './components/message-list';\nimport { PromptInput } from './components/prompt-input';\nimport { Suggestions } from './components/suggestions';\nimport { getThemeClass, getWidgetStyle } from './theme';\nimport type { KookeeChatWidgetProps } from './types';\n\nfunction ChatBubble() {\n const { isOpen, toggle } = useKookeeChat();\n\n return (\n <button\n type=\"button\"\n className=\"kookee-widget-bubble\"\n onClick={toggle}\n aria-label={isOpen ? 'Close chat' : 'Open chat'}\n >\n {isOpen ? (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n ) : (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M7.9 20A9 9 0 1 0 4 16.1L2 22Z\" />\n </svg>\n )}\n </button>\n );\n}\n\nfunction ChatPanel({\n suggestions,\n placeholder,\n greeting,\n title,\n}: Pick<KookeeChatWidgetProps, 'suggestions' | 'placeholder' | 'greeting' | 'title'>) {\n const { isOpen, isExpanded, messages, isLoading, sendMessage, toggleExpanded, close, onSourceClick } = useKookeeChat();\n\n if (!isOpen) return null;\n\n const showSuggestions = messages.length === 0 && suggestions && suggestions.length > 0;\n const panelClassName = `kookee-widget-panel${isExpanded ? ' kookee-widget-panel--expanded' : ''}`;\n\n return (\n <div className={panelClassName}>\n <div className=\"kookee-widget-header\">\n <span className=\"kookee-widget-header-title\">{title || 'Support'}</span>\n <div className=\"kookee-widget-header-actions\">\n <button\n type=\"button\"\n className=\"kookee-widget-header-button\"\n onClick={toggleExpanded}\n aria-label={isExpanded ? 'Collapse chat' : 'Expand chat'}\n >\n {isExpanded ? (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"4 14 10 14 10 20\" />\n <polyline points=\"20 10 14 10 14 4\" />\n <line x1=\"14\" y1=\"10\" x2=\"21\" y2=\"3\" />\n <line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\" />\n </svg>\n ) : (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"15 3 21 3 21 9\" />\n <polyline points=\"9 21 3 21 3 15\" />\n <line x1=\"21\" y1=\"3\" x2=\"14\" y2=\"10\" />\n <line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\" />\n </svg>\n )}\n </button>\n <button\n type=\"button\"\n className=\"kookee-widget-header-button\"\n onClick={close}\n aria-label=\"Close chat\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n </button>\n </div>\n </div>\n <div className=\"kookee-widget-body\">\n {greeting && messages.length === 0 && (\n <div className=\"kookee-chat-greeting\">{greeting}</div>\n )}\n {showSuggestions && (\n <Suggestions suggestions={suggestions} onSelect={sendMessage} />\n )}\n <MessageList messages={messages} isLoading={isLoading} onSourceClick={onSourceClick} />\n </div>\n <div className=\"kookee-widget-footer\">\n <PromptInput\n placeholder={placeholder}\n onSubmit={sendMessage}\n disabled={isLoading}\n />\n </div>\n </div>\n );\n}\n\nexport function KookeeChatWidget({\n clientOptions,\n locale,\n position = 'bottom-right',\n theme,\n primaryColor,\n suggestions,\n placeholder,\n greeting,\n title,\n onSourceClick,\n}: KookeeChatWidgetProps) {\n const themeClass = getThemeClass(theme);\n const className = `kookee-widget kookee-widget-${position}${themeClass ? ` ${themeClass}` : ''}`;\n\n return (\n <KookeeChatProvider clientOptions={clientOptions} locale={locale} onSourceClick={onSourceClick}>\n <div className={className} style={getWidgetStyle(primaryColor)}>\n <ChatPanel suggestions={suggestions} placeholder={placeholder} greeting={greeting} title={title} />\n <ChatBubble />\n </div>\n </KookeeChatProvider>\n );\n}\n","import { KookeeChatProvider, useKookeeChat } from './kookee-chat-provider';\nimport { MessageList } from './components/message-list';\nimport { PromptInput } from './components/prompt-input';\nimport { Suggestions } from './components/suggestions';\nimport type { KookeeChatProps } from './types';\n\nfunction ChatInner({ suggestions, placeholder, greeting }: Omit<KookeeChatProps, 'clientOptions' | 'locale' | 'onSourceClick'>) {\n const { messages, isLoading, sendMessage, onSourceClick } = useKookeeChat();\n const showSuggestions = messages.length === 0 && suggestions && suggestions.length > 0;\n const showEmptyState = messages.length === 0;\n\n return (\n <div className=\"kookee-chat\">\n <MessageList\n messages={messages}\n isLoading={isLoading}\n onSourceClick={onSourceClick}\n emptyState={\n showEmptyState ? (\n <>\n {greeting && <div className=\"kookee-chat-greeting\">{greeting}</div>}\n {showSuggestions && (\n <Suggestions suggestions={suggestions} onSelect={sendMessage} />\n )}\n </>\n ) : undefined\n }\n />\n <PromptInput\n placeholder={placeholder}\n onSubmit={sendMessage}\n disabled={isLoading}\n />\n </div>\n );\n}\n\nexport function KookeeChat({ clientOptions, locale, suggestions, placeholder, greeting, onSourceClick }: KookeeChatProps) {\n return (\n <KookeeChatProvider clientOptions={clientOptions} locale={locale} onSourceClick={onSourceClick}>\n <ChatInner suggestions={suggestions} placeholder={placeholder} greeting={greeting} />\n </KookeeChatProvider>\n );\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {createContext,useState,useRef,useCallback,useMemo,useContext,useEffect}from'react';import {Kookee}from'@kookee/sdk';import {jsx,jsxs,Fragment}from'react/jsx-runtime';import l from'highlight.js/lib/core';import ee from'highlight.js/lib/languages/bash';import ye from'highlight.js/lib/languages/css';import V from'highlight.js/lib/languages/javascript';import be from'highlight.js/lib/languages/json';import A from'highlight.js/lib/languages/typescript';import oe from'highlight.js/lib/languages/xml';import {Renderer,Marked}from'marked';import {markedHighlight}from'marked-highlight';var Y=createContext(null);function K({clientOptions:e,locale:o,onSourceClick:t,children:n}){let[i,s]=useState([]),[k,d]=useState(false),[g,a]=useState(false),[C,N]=useState(false),P=useRef(null),I=useRef(crypto.randomUUID()),q=useCallback(()=>(P.current||(P.current=new Kookee(e)),P.current),[e]),Z=useCallback(async f=>{let y={id:crypto.randomUUID(),role:"user",content:f};s(h=>[...h,y]),d(true);let m=q(),c=[...i,y].map(h=>({role:h.role,content:h.content})),S=crypto.randomUUID();try{let h=m.help.chatStream({messages:c,locale:o,sessionId:I.current});s(x=>[...x,{id:S,role:"assistant",content:"",isStreaming:!0}]),d(!1);for await(let x of h)ke(x,S);}catch{try{let h=await m.help.chat({messages:c,locale:o,sessionId:I.current}),x={id:S,role:"assistant",content:h.message,sources:h.sources};s(R=>[...R.filter(ge=>ge.id!==S),x]);}catch{s(h=>[...h.filter(R=>R.id!==S),{id:S,role:"assistant",content:"Sorry, something went wrong. Please try again."}]);}}finally{d(false);}},[q,o,i]);function ke(f,y){switch(f.type){case "delta":s(m=>m.map(c=>c.id===y?{...c,content:c.content+f.content}:c));break;case "sources":s(m=>m.map(c=>c.id===y?{...c,sources:f.sources}:c));break;case "done":s(m=>m.map(c=>c.id===y?{...c,isStreaming:false}:c));break;case "error":s(m=>m.map(c=>c.id===y?{...c,content:"Sorry, something went wrong. Please try again.",isStreaming:false}:c));break}}let z=useCallback(()=>a(true),[]),F=useCallback(()=>a(false),[]),G=useCallback(()=>a(f=>!f),[]),J=useCallback(()=>N(f=>!f),[]),Q=useCallback(()=>{s([]),I.current=crypto.randomUUID();},[]),ue=useMemo(()=>({messages:i,isLoading:k,isOpen:g,isExpanded:C,sendMessage:Z,clearMessages:Q,open:z,close:F,toggle:G,toggleExpanded:J,onSourceClick:t}),[i,k,g,C,Z,Q,z,F,G,J,t]);return jsx(Y.Provider,{value:ue,children:n})}function w(){let e=useContext(Y);if(!e)throw new Error("useKookeeChat must be used within a KookeeChatProvider");return e}l.registerLanguage("bash",ee);l.registerLanguage("sh",ee);l.registerLanguage("css",ye);l.registerLanguage("javascript",V);l.registerLanguage("js",V);l.registerLanguage("json",be);l.registerLanguage("typescript",A);l.registerLanguage("ts",A);l.registerLanguage("tsx",A);l.registerLanguage("jsx",V);l.registerLanguage("xml",oe);l.registerLanguage("html",oe);var U=new Renderer;U.code=({text:e,lang:o})=>`<div class="kookee-code-block">${`<div class="kookee-code-block__header">${o?`<span class="kookee-code-block__language">${o}</span>`:""}<button type="button" class="kookee-code-block__copy" onclick="(function(btn){var code=btn.closest('.kookee-code-block').querySelector('code').textContent;navigator.clipboard.writeText(code);btn.textContent='Copied!';setTimeout(function(){btn.textContent='Copy'},2000)})(this)" title="Copy code">Copy</button></div>`}<pre><code class="hljs">${e}</code></pre></div>`;U.link=({href:e,text:o})=>`<a href="${e}" target="_blank" rel="noopener noreferrer">${o}</a>`;var Me=new Marked(markedHighlight({emptyLangClass:"",langPrefix:"hljs language-",highlight(e,o){return o&&l.getLanguage(o)?l.highlight(e,{language:o}).value:l.highlightAuto(e).value}}),{renderer:U,gfm:true,breaks:true});function te(e){return e?Me.parse(e):""}function se({content:e}){let[o,t]=useState(false),n=useCallback(async()=>{try{await navigator.clipboard.writeText(e),t(!0),setTimeout(()=>t(!1),2e3);}catch{}},[e]);return jsx("div",{className:"kookee-message-actions",children:jsx("button",{type:"button",className:"kookee-action-button",onClick:n,"aria-label":o?"Copied":"Copy message",children:o?jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:jsx("path",{d:"M20 6 9 17l-5-5"})}):jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsx("rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2"}),jsx("path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"})]})})})}function re({sources:e,onSourceClick:o}){return jsxs("div",{className:"kookee-sources",children:[jsx("span",{className:"kookee-sources-label",children:"Based on:"}),jsx("div",{className:"kookee-sources-list",children:e.map(t=>jsx("button",{type:"button",className:`kookee-source-link${o?" kookee-source-link--clickable":""}`,onClick:()=>o?.(t),disabled:!o,children:t.title},t.id))})]})}function ne({message:e,onSourceClick:o}){let t=e.role==="user";return jsxs("div",{className:`kookee-message kookee-message-${e.role}`,children:[!t&&jsx("div",{className:"kookee-message-avatar",children:jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsx("path",{d:"M12 8V4H8"}),jsx("rect",{width:"16",height:"12",x:"4",y:"8",rx:"2"}),jsx("path",{d:"M2 14h2"}),jsx("path",{d:"M20 14h2"}),jsx("path",{d:"M15 13v2"}),jsx("path",{d:"M9 13v2"})]})}),jsxs("div",{className:"kookee-message-content",children:[jsxs("div",{className:"kookee-message-bubble",children:[t?jsx("div",{className:"kookee-message-text kookee-message-text--plain",children:e.content}):jsx("div",{className:"kookee-message-text kookee-message-text--markdown",dangerouslySetInnerHTML:{__html:te(e.content)}}),e.isStreaming&&jsxs("span",{className:"kookee-streaming-dots",children:[jsx("span",{className:"kookee-streaming-dot"}),jsx("span",{className:"kookee-streaming-dot"}),jsx("span",{className:"kookee-streaming-dot"})]})]}),!t&&!e.isStreaming&&e.sources&&e.sources.length>0&&jsx(re,{sources:e.sources,onSourceClick:o}),!t&&!e.isStreaming&&jsx(se,{content:e.content})]})]})}function ae(){return jsxs("div",{className:"kookee-message kookee-message-assistant",children:[jsx("div",{className:"kookee-message-avatar",children:jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsx("path",{d:"M12 8V4H8"}),jsx("rect",{width:"16",height:"12",x:"4",y:"8",rx:"2"}),jsx("path",{d:"M2 14h2"}),jsx("path",{d:"M20 14h2"}),jsx("path",{d:"M15 13v2"}),jsx("path",{d:"M9 13v2"})]})}),jsx("div",{className:"kookee-message-content",children:jsx("div",{className:"kookee-message-bubble",children:jsxs("div",{className:"kookee-loading-dots",children:[jsx("span",{className:"kookee-loading-dot"}),jsx("span",{className:"kookee-loading-dot"}),jsx("span",{className:"kookee-loading-dot"})]})})})]})}function B({messages:e,isLoading:o,emptyState:t,onSourceClick:n}){let i=useRef(null);return useEffect(()=>{i.current?.scrollIntoView({behavior:"smooth"});},[e,o]),jsxs("div",{className:"kookee-message-list",children:[jsx("div",{className:"kookee-message-list-spacer"}),t,e.map(s=>jsx(ne,{message:s,onSourceClick:n},s.id)),o&&!e.some(s=>s.isStreaming)&&jsx(ae,{}),jsx("div",{ref:i})]})}function $({placeholder:e="Ask a question...",onSubmit:o,disabled:t}){let[n,i]=useState(""),s=useRef(null),k=useCallback(()=>{let a=s.current;a&&(a.style.height="auto",a.style.height=`${Math.min(a.scrollHeight,120)}px`);},[]),d=useCallback(()=>{let a=n.trim();!a||t||(o(a),i(""),s.current&&(s.current.style.height="auto"));},[n,t,o]),g=useCallback(a=>{a.key==="Enter"&&!a.shiftKey&&(a.preventDefault(),d());},[d]);return jsxs("div",{className:"kookee-prompt-input",children:[jsx("textarea",{ref:s,className:"kookee-prompt-textarea",placeholder:e,value:n,onChange:a=>{i(a.target.value),k();},onKeyDown:g,disabled:t,rows:1}),jsx("button",{type:"button",className:"kookee-prompt-submit",onClick:d,disabled:t||!n.trim(),"aria-label":"Send message",children:jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsx("path",{d:"m5 12 7-7 7 7"}),jsx("path",{d:"M12 19V5"})]})})]})}function j({suggestions:e,onSelect:o}){return e.length===0?null:jsx("div",{className:"kookee-suggestions",children:e.map(t=>jsx("button",{type:"button",className:"kookee-suggestion-pill",onClick:()=>o(t),children:t},t))})}function le(e){return !e||e==="light"?"":e==="dark"?"kookee-dark":"kookee-auto"}function de(e){if(e)return {"--kookee-primary":e,"--kookee-primary-hover":e,"--kookee-bg-user":e}}function Te(){let{isOpen:e,toggle:o}=w();return jsx("button",{type:"button",className:"kookee-widget-bubble",onClick:o,"aria-label":e?"Close chat":"Open chat",children:e?jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsx("path",{d:"M18 6 6 18"}),jsx("path",{d:"m6 6 12 12"})]}):jsx("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:jsx("path",{d:"M7.9 20A9 9 0 1 0 4 16.1L2 22Z"})})})}function $e({suggestions:e,placeholder:o,greeting:t,title:n}){let{isOpen:i,isExpanded:s,messages:k,isLoading:d,sendMessage:g,toggleExpanded:a,close:C,onSourceClick:N}=w();if(!i)return null;let P=k.length===0&&e&&e.length>0;return jsxs("div",{className:`kookee-widget-panel${s?" kookee-widget-panel--expanded":""}`,children:[jsxs("div",{className:"kookee-widget-header",children:[jsx("span",{className:"kookee-widget-header-title",children:n||"Support"}),jsxs("div",{className:"kookee-widget-header-actions",children:[jsx("button",{type:"button",className:"kookee-widget-header-button",onClick:a,"aria-label":s?"Collapse chat":"Expand chat",children:s?jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsx("polyline",{points:"4 14 10 14 10 20"}),jsx("polyline",{points:"20 10 14 10 14 4"}),jsx("line",{x1:"14",y1:"10",x2:"21",y2:"3"}),jsx("line",{x1:"3",y1:"21",x2:"10",y2:"14"})]}):jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsx("polyline",{points:"15 3 21 3 21 9"}),jsx("polyline",{points:"9 21 3 21 3 15"}),jsx("line",{x1:"21",y1:"3",x2:"14",y2:"10"}),jsx("line",{x1:"3",y1:"21",x2:"10",y2:"14"})]})}),jsx("button",{type:"button",className:"kookee-widget-header-button",onClick:C,"aria-label":"Close chat",children:jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsx("path",{d:"M18 6 6 18"}),jsx("path",{d:"m6 6 12 12"})]})})]})]}),jsxs("div",{className:"kookee-widget-body",children:[t&&k.length===0&&jsx("div",{className:"kookee-chat-greeting",children:t}),P&&jsx(j,{suggestions:e,onSelect:g}),jsx(B,{messages:k,isLoading:d,onSourceClick:N})]}),jsx("div",{className:"kookee-widget-footer",children:jsx($,{placeholder:o,onSubmit:g,disabled:d})})]})}function je({clientOptions:e,locale:o,position:t="bottom-right",theme:n,primaryColor:i,suggestions:s,placeholder:k,greeting:d,title:g,onSourceClick:a}){let C=le(n),N=`kookee-widget kookee-widget-${t}${C?` ${C}`:""}`;return jsx(K,{clientOptions:e,locale:o,onSourceClick:a,children:jsxs("div",{className:N,style:de(i),children:[jsx($e,{suggestions:s,placeholder:k,greeting:d,title:g}),jsx(Te,{})]})})}function Re({suggestions:e,placeholder:o,greeting:t}){let{messages:n,isLoading:i,sendMessage:s,onSourceClick:k}=w(),d=n.length===0&&e&&e.length>0,g=n.length===0;return jsxs("div",{className:"kookee-chat",children:[jsx(B,{messages:n,isLoading:i,onSourceClick:k,emptyState:g?jsxs(Fragment,{children:[t&&jsx("div",{className:"kookee-chat-greeting",children:t}),d&&jsx(j,{suggestions:e,onSelect:s})]}):void 0}),jsx($,{placeholder:o,onSubmit:s,disabled:i})]})}function Ve({clientOptions:e,locale:o,suggestions:t,placeholder:n,greeting:i,onSourceClick:s}){return jsx(K,{clientOptions:e,locale:o,onSourceClick:s,children:jsx(Re,{suggestions:t,placeholder:n,greeting:i})})}export{Ve as KookeeChat,K as KookeeChatProvider,je as KookeeChatWidget,w as useKookeeChat};//# sourceMappingURL=index.js.map
|
|
1
|
+
import {createContext,useState,useRef,useCallback,useMemo,useContext,useEffect}from'react';import {Kookee}from'@kookee/sdk';import {jsx,jsxs,Fragment}from'react/jsx-runtime';import l from'highlight.js/lib/core';import ee from'highlight.js/lib/languages/bash';import ye from'highlight.js/lib/languages/css';import R from'highlight.js/lib/languages/javascript';import be from'highlight.js/lib/languages/json';import A from'highlight.js/lib/languages/typescript';import oe from'highlight.js/lib/languages/xml';import {Renderer,Marked}from'marked';import {markedHighlight}from'marked-highlight';var Y=createContext(null);function K({clientOptions:e,locale:o,onSourceClick:t,children:n}){let[i,s]=useState([]),[k,d]=useState(false),[g,a]=useState(false),[C,N]=useState(false),P=useRef(null),W=useRef(crypto.randomUUID()),q=useCallback(()=>(P.current||(P.current=new Kookee(e)),P.current),[e]),Z=useCallback(async f=>{let y={id:crypto.randomUUID(),role:"user",content:f};s(h=>[...h,y]),d(true);let m=q(),c=[...i,y].map(h=>({role:h.role,content:h.content})),S=crypto.randomUUID();try{let h=m.help.chatStream({messages:c,locale:o,sessionId:W.current});s(x=>[...x,{id:S,role:"assistant",content:"",isStreaming:!0}]),d(!1);for await(let x of h)ke(x,S);}catch{try{let h=await m.help.chat({messages:c,locale:o,sessionId:W.current}),x={id:S,role:"assistant",content:h.message,sources:h.sources};s(j=>[...j.filter(ge=>ge.id!==S),x]);}catch{s(h=>[...h.filter(j=>j.id!==S),{id:S,role:"assistant",content:"Sorry, something went wrong. Please try again."}]);}}finally{d(false);}},[q,o,i]);function ke(f,y){switch(f.type){case "delta":s(m=>m.map(c=>c.id===y?{...c,content:c.content+f.content}:c));break;case "sources":s(m=>m.map(c=>c.id===y?{...c,sources:f.sources}:c));break;case "done":s(m=>m.map(c=>c.id===y?{...c,isStreaming:false}:c));break;case "error":s(m=>m.map(c=>c.id===y?{...c,content:"Sorry, something went wrong. Please try again.",isStreaming:false}:c));break}}let z=useCallback(()=>a(true),[]),F=useCallback(()=>a(false),[]),G=useCallback(()=>a(f=>!f),[]),J=useCallback(()=>N(f=>!f),[]),Q=useCallback(()=>{s([]),W.current=crypto.randomUUID();},[]),ue=useMemo(()=>({messages:i,isLoading:k,isOpen:g,isExpanded:C,sendMessage:Z,clearMessages:Q,open:z,close:F,toggle:G,toggleExpanded:J,onSourceClick:t}),[i,k,g,C,Z,Q,z,F,G,J,t]);return jsx(Y.Provider,{value:ue,children:n})}function w(){let e=useContext(Y);if(!e)throw new Error("useKookeeChat must be used within a KookeeChatProvider");return e}l.registerLanguage("bash",ee);l.registerLanguage("sh",ee);l.registerLanguage("css",ye);l.registerLanguage("javascript",R);l.registerLanguage("js",R);l.registerLanguage("json",be);l.registerLanguage("typescript",A);l.registerLanguage("ts",A);l.registerLanguage("tsx",A);l.registerLanguage("jsx",R);l.registerLanguage("xml",oe);l.registerLanguage("html",oe);var U=new Renderer;U.code=({text:e,lang:o})=>`<div class="kookee-code-block">${`<div class="kookee-code-block__header">${o?`<span class="kookee-code-block__language">${o}</span>`:""}<button type="button" class="kookee-code-block__copy" onclick="(function(btn){var code=btn.closest('.kookee-code-block').querySelector('code').textContent;navigator.clipboard.writeText(code);btn.textContent='Copied!';setTimeout(function(){btn.textContent='Copy'},2000)})(this)" title="Copy code">Copy</button></div>`}<pre><code class="hljs">${e}</code></pre></div>`;U.link=({href:e,text:o})=>`<a href="${e}" target="_blank" rel="noopener noreferrer">${o}</a>`;var Me=new Marked(markedHighlight({emptyLangClass:"",langPrefix:"hljs language-",highlight(e,o){return o&&l.getLanguage(o)?l.highlight(e,{language:o}).value:l.highlightAuto(e).value}}),{renderer:U,gfm:true,breaks:true});function te(e){return e?Me.parse(e):""}function se({content:e}){let[o,t]=useState(false),n=useCallback(async()=>{try{await navigator.clipboard.writeText(e),t(!0),setTimeout(()=>t(!1),2e3);}catch{}},[e]);return jsx("div",{className:"kookee-message-actions",children:jsx("button",{type:"button",className:"kookee-action-button",onClick:n,"aria-label":o?"Copied":"Copy message",children:o?jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:jsx("path",{d:"M20 6 9 17l-5-5"})}):jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsx("rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2"}),jsx("path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"})]})})})}function re({sources:e,onSourceClick:o}){return jsxs("div",{className:"kookee-sources",children:[jsx("span",{className:"kookee-sources-label",children:"Based on:"}),jsx("div",{className:"kookee-sources-list",children:e.map(t=>jsx("button",{type:"button",className:`kookee-source-link${o?" kookee-source-link--clickable":""}`,onClick:()=>o?.(t),disabled:!o,children:t.title},t.id))})]})}function ne({message:e,onSourceClick:o}){let t=e.role==="user";return jsxs("div",{className:`kookee-message kookee-message-${e.role}`,children:[!t&&jsx("div",{className:"kookee-message-avatar",children:jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsx("path",{d:"M12 8V4H8"}),jsx("rect",{width:"16",height:"12",x:"4",y:"8",rx:"2"}),jsx("path",{d:"M2 14h2"}),jsx("path",{d:"M20 14h2"}),jsx("path",{d:"M15 13v2"}),jsx("path",{d:"M9 13v2"})]})}),jsxs("div",{className:"kookee-message-content",children:[jsxs("div",{className:"kookee-message-bubble",children:[t?jsx("div",{className:"kookee-message-text kookee-message-text--plain",children:e.content}):jsx("div",{className:"kookee-message-text kookee-message-text--markdown",dangerouslySetInnerHTML:{__html:te(e.content)}}),e.isStreaming&&jsxs("span",{className:"kookee-streaming-dots",children:[jsx("span",{className:"kookee-streaming-dot"}),jsx("span",{className:"kookee-streaming-dot"}),jsx("span",{className:"kookee-streaming-dot"})]})]}),!t&&!e.isStreaming&&e.sources&&e.sources.length>0&&jsx(re,{sources:e.sources,onSourceClick:o}),!t&&!e.isStreaming&&jsx(se,{content:e.content})]})]})}function ae(){return jsxs("div",{className:"kookee-message kookee-message-assistant",children:[jsx("div",{className:"kookee-message-avatar",children:jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsx("path",{d:"M12 8V4H8"}),jsx("rect",{width:"16",height:"12",x:"4",y:"8",rx:"2"}),jsx("path",{d:"M2 14h2"}),jsx("path",{d:"M20 14h2"}),jsx("path",{d:"M15 13v2"}),jsx("path",{d:"M9 13v2"})]})}),jsx("div",{className:"kookee-message-content",children:jsx("div",{className:"kookee-message-bubble",children:jsxs("div",{className:"kookee-loading-dots",children:[jsx("span",{className:"kookee-loading-dot"}),jsx("span",{className:"kookee-loading-dot"}),jsx("span",{className:"kookee-loading-dot"})]})})})]})}function E({messages:e,isLoading:o,emptyState:t,onSourceClick:n}){let i=useRef(null);return useEffect(()=>{let s=i.current;s&&s.scrollTo({top:s.scrollHeight,behavior:"smooth"});},[e,o]),jsxs("div",{ref:i,className:"kookee-message-list",children:[jsx("div",{className:"kookee-message-list-spacer"}),t,e.map(s=>jsx(ne,{message:s,onSourceClick:n},s.id)),o&&!e.some(s=>s.isStreaming)&&jsx(ae,{})]})}function B({placeholder:e="Ask a question...",onSubmit:o,disabled:t}){let[n,i]=useState(""),s=useRef(null),k=useCallback(()=>{let a=s.current;a&&(a.style.height="auto",a.style.height=`${Math.min(a.scrollHeight,120)}px`);},[]),d=useCallback(()=>{let a=n.trim();!a||t||(o(a),i(""),s.current&&(s.current.style.height="auto"));},[n,t,o]),g=useCallback(a=>{a.key==="Enter"&&!a.shiftKey&&(a.preventDefault(),d());},[d]);return jsxs("div",{className:"kookee-prompt-input",children:[jsx("textarea",{ref:s,className:"kookee-prompt-textarea",placeholder:e,value:n,onChange:a=>{i(a.target.value),k();},onKeyDown:g,disabled:t,rows:1}),jsx("button",{type:"button",className:"kookee-prompt-submit",onClick:d,disabled:t||!n.trim(),"aria-label":"Send message",children:jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsx("path",{d:"m5 12 7-7 7 7"}),jsx("path",{d:"M12 19V5"})]})})]})}function $({suggestions:e,onSelect:o}){return e.length===0?null:jsx("div",{className:"kookee-suggestions",children:e.map(t=>jsx("button",{type:"button",className:"kookee-suggestion-pill",onClick:()=>o(t),children:t},t))})}function le(e){return !e||e==="light"?"":e==="dark"?"kookee-dark":"kookee-auto"}function de(e){if(e)return {"--kookee-primary":e,"--kookee-primary-hover":e,"--kookee-bg-user":e}}function Be(){let{isOpen:e,toggle:o}=w();return jsx("button",{type:"button",className:"kookee-widget-bubble",onClick:o,"aria-label":e?"Close chat":"Open chat",children:e?jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsx("path",{d:"M18 6 6 18"}),jsx("path",{d:"m6 6 12 12"})]}):jsx("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:jsx("path",{d:"M7.9 20A9 9 0 1 0 4 16.1L2 22Z"})})})}function $e({suggestions:e,placeholder:o,greeting:t,title:n}){let{isOpen:i,isExpanded:s,messages:k,isLoading:d,sendMessage:g,toggleExpanded:a,close:C,onSourceClick:N}=w();if(!i)return null;let P=k.length===0&&e&&e.length>0;return jsxs("div",{className:`kookee-widget-panel${s?" kookee-widget-panel--expanded":""}`,children:[jsxs("div",{className:"kookee-widget-header",children:[jsx("span",{className:"kookee-widget-header-title",children:n||"Support"}),jsxs("div",{className:"kookee-widget-header-actions",children:[jsx("button",{type:"button",className:"kookee-widget-header-button",onClick:a,"aria-label":s?"Collapse chat":"Expand chat",children:s?jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsx("polyline",{points:"4 14 10 14 10 20"}),jsx("polyline",{points:"20 10 14 10 14 4"}),jsx("line",{x1:"14",y1:"10",x2:"21",y2:"3"}),jsx("line",{x1:"3",y1:"21",x2:"10",y2:"14"})]}):jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsx("polyline",{points:"15 3 21 3 21 9"}),jsx("polyline",{points:"9 21 3 21 3 15"}),jsx("line",{x1:"21",y1:"3",x2:"14",y2:"10"}),jsx("line",{x1:"3",y1:"21",x2:"10",y2:"14"})]})}),jsx("button",{type:"button",className:"kookee-widget-header-button",onClick:C,"aria-label":"Close chat",children:jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsx("path",{d:"M18 6 6 18"}),jsx("path",{d:"m6 6 12 12"})]})})]})]}),jsxs("div",{className:"kookee-widget-body",children:[t&&k.length===0&&jsx("div",{className:"kookee-chat-greeting",children:t}),P&&jsx($,{suggestions:e,onSelect:g}),jsx(E,{messages:k,isLoading:d,onSourceClick:N})]}),jsx("div",{className:"kookee-widget-footer",children:jsx(B,{placeholder:o,onSubmit:g,disabled:d})})]})}function je({clientOptions:e,locale:o,position:t="bottom-right",theme:n,primaryColor:i,suggestions:s,placeholder:k,greeting:d,title:g,onSourceClick:a}){let C=le(n),N=`kookee-widget kookee-widget-${t}${C?` ${C}`:""}`;return jsx(K,{clientOptions:e,locale:o,onSourceClick:a,children:jsxs("div",{className:N,style:de(i),children:[jsx($e,{suggestions:s,placeholder:k,greeting:d,title:g}),jsx(Be,{})]})})}function Re({suggestions:e,placeholder:o,greeting:t}){let{messages:n,isLoading:i,sendMessage:s,onSourceClick:k}=w(),d=n.length===0&&e&&e.length>0,g=n.length===0;return jsxs("div",{className:"kookee-chat",children:[jsx(E,{messages:n,isLoading:i,onSourceClick:k,emptyState:g?jsxs(Fragment,{children:[t&&jsx("div",{className:"kookee-chat-greeting",children:t}),d&&jsx($,{suggestions:e,onSelect:s})]}):void 0}),jsx(B,{placeholder:o,onSubmit:s,disabled:i})]})}function Ae({clientOptions:e,locale:o,suggestions:t,placeholder:n,greeting:i,onSourceClick:s}){return jsx(K,{clientOptions:e,locale:o,onSourceClick:s,children:jsx(Re,{suggestions:t,placeholder:n,greeting:i})})}export{Ae as KookeeChat,K as KookeeChatProvider,je as KookeeChatWidget,w as useKookeeChat};//# sourceMappingURL=index.js.map
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/kookee-chat-provider.tsx","../src/lib/utils/markdown.ts","../src/lib/components/message-actions.tsx","../src/lib/components/sources.tsx","../src/lib/components/message.tsx","../src/lib/components/loading-indicator.tsx","../src/lib/components/message-list.tsx","../src/lib/components/prompt-input.tsx","../src/lib/components/suggestions.tsx","../src/lib/theme.ts","../src/lib/kookee-chat-widget.tsx","../src/lib/kookee-chat.tsx"],"names":["KookeeChatContext","createContext","KookeeChatProvider","clientOptions","locale","onSourceClick","children","messages","setMessages","useState","isLoading","setIsLoading","isOpen","setIsOpen","isExpanded","setIsExpanded","clientRef","useRef","sessionIdRef","getClient","useCallback","Kookee","sendMessage","content","userMessage","prev","client","conversationMessages","m","assistantMessageId","stream","chunk","handleStreamChunk","response","assistantMessage","messageId","open","close","toggle","toggleExpanded","clearMessages","value","useMemo","jsx","useKookeeChat","context","useContext","hljs","bash","css","javascript","json","typescript","xml","renderer","Renderer","text","lang","href","marked","Marked","markedHighlight","code","parseMarkdown","MessageActions","copied","setCopied","handleCopy","jsxs","Sources","sources","source","Message","message","isUser","LoadingIndicator","MessageList","emptyState","bottomRef","useEffect","PromptInput","placeholder","onSubmit","disabled","setValue","textareaRef","adjustHeight","textarea","handleSubmit","trimmed","handleKeyDown","e","Suggestions","suggestions","onSelect","suggestion","getThemeClass","theme","getWidgetStyle","primaryColor","ChatBubble","ChatPanel","greeting","title","showSuggestions","KookeeChatWidget","position","themeClass","className","ChatInner","showEmptyState","Fragment","KookeeChat"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, useCallback, useContext, useMemo, useRef, useState } from 'react';\nimport { Kookee } from '@kookee/sdk';\nimport type { HelpChatStreamChunk } from '@kookee/sdk';\nimport type { ChatMessage, KookeeChatContextValue, KookeeChatProviderProps } from './types';\n\nconst KookeeChatContext = createContext<KookeeChatContextValue | null>(null);\n\nexport function KookeeChatProvider({ clientOptions, locale, onSourceClick, children }: KookeeChatProviderProps) {\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isOpen, setIsOpen] = useState(false);\n const [isExpanded, setIsExpanded] = useState(false);\n const clientRef = useRef<Kookee | null>(null);\n const sessionIdRef = useRef<string>(crypto.randomUUID());\n\n const getClient = useCallback(() => {\n if (!clientRef.current) {\n clientRef.current = new Kookee(clientOptions);\n }\n return clientRef.current;\n }, [clientOptions]);\n\n const sendMessage = useCallback(\n async (content: string) => {\n const userMessage: ChatMessage = {\n id: crypto.randomUUID(),\n role: 'user',\n content,\n };\n\n setMessages((prev) => [...prev, userMessage]);\n setIsLoading(true);\n\n const client = getClient();\n const conversationMessages = [...messages, userMessage].map((m) => ({\n role: m.role,\n content: m.content,\n }));\n\n const assistantMessageId = crypto.randomUUID();\n\n try {\n const stream = client.help.chatStream({\n messages: conversationMessages,\n locale,\n sessionId: sessionIdRef.current,\n });\n\n setMessages((prev) => [\n ...prev,\n { id: assistantMessageId, role: 'assistant', content: '', isStreaming: true },\n ]);\n setIsLoading(false);\n\n for await (const chunk of stream) {\n handleStreamChunk(chunk, assistantMessageId);\n }\n } catch {\n // Fallback to non-streaming API\n try {\n const response = await client.help.chat({\n messages: conversationMessages,\n locale,\n sessionId: sessionIdRef.current,\n });\n\n const assistantMessage: ChatMessage = {\n id: assistantMessageId,\n role: 'assistant',\n content: response.message,\n sources: response.sources,\n };\n\n setMessages((prev) => {\n const withoutStreaming = prev.filter((m) => m.id !== assistantMessageId);\n return [...withoutStreaming, assistantMessage];\n });\n } catch {\n setMessages((prev) => {\n const withoutStreaming = prev.filter((m) => m.id !== assistantMessageId);\n return [\n ...withoutStreaming,\n {\n id: assistantMessageId,\n role: 'assistant' as const,\n content: 'Sorry, something went wrong. Please try again.',\n },\n ];\n });\n }\n } finally {\n setIsLoading(false);\n }\n },\n [getClient, locale, messages],\n );\n\n function handleStreamChunk(chunk: HelpChatStreamChunk, messageId: string) {\n switch (chunk.type) {\n case 'delta':\n setMessages((prev) =>\n prev.map((m) => (m.id === messageId ? { ...m, content: m.content + chunk.content } : m)),\n );\n break;\n case 'sources':\n setMessages((prev) =>\n prev.map((m) => (m.id === messageId ? { ...m, sources: chunk.sources } : m)),\n );\n break;\n case 'done':\n setMessages((prev) =>\n prev.map((m) => (m.id === messageId ? { ...m, isStreaming: false } : m)),\n );\n break;\n case 'error':\n setMessages((prev) =>\n prev.map((m) =>\n m.id === messageId\n ? { ...m, content: 'Sorry, something went wrong. Please try again.', isStreaming: false }\n : m,\n ),\n );\n break;\n }\n }\n\n const open = useCallback(() => setIsOpen(true), []);\n const close = useCallback(() => setIsOpen(false), []);\n const toggle = useCallback(() => setIsOpen((prev) => !prev), []);\n const toggleExpanded = useCallback(() => setIsExpanded((prev) => !prev), []);\n const clearMessages = useCallback(() => {\n setMessages([]);\n sessionIdRef.current = crypto.randomUUID();\n }, []);\n\n const value = useMemo<KookeeChatContextValue>(\n () => ({ messages, isLoading, isOpen, isExpanded, sendMessage, clearMessages, open, close, toggle, toggleExpanded, onSourceClick }),\n [messages, isLoading, isOpen, isExpanded, sendMessage, clearMessages, open, close, toggle, toggleExpanded, onSourceClick],\n );\n\n return <KookeeChatContext.Provider value={value}>{children}</KookeeChatContext.Provider>;\n}\n\nexport function useKookeeChat(): KookeeChatContextValue {\n const context = useContext(KookeeChatContext);\n if (!context) {\n throw new Error('useKookeeChat must be used within a KookeeChatProvider');\n }\n return context;\n}\n","import hljs from 'highlight.js/lib/core';\nimport bash from 'highlight.js/lib/languages/bash';\nimport css from 'highlight.js/lib/languages/css';\nimport javascript from 'highlight.js/lib/languages/javascript';\nimport json from 'highlight.js/lib/languages/json';\nimport typescript from 'highlight.js/lib/languages/typescript';\nimport xml from 'highlight.js/lib/languages/xml';\nimport { Marked, Renderer } from 'marked';\nimport { markedHighlight } from 'marked-highlight';\n\nhljs.registerLanguage('bash', bash);\nhljs.registerLanguage('sh', bash);\nhljs.registerLanguage('css', css);\nhljs.registerLanguage('javascript', javascript);\nhljs.registerLanguage('js', javascript);\nhljs.registerLanguage('json', json);\nhljs.registerLanguage('typescript', typescript);\nhljs.registerLanguage('ts', typescript);\nhljs.registerLanguage('tsx', typescript);\nhljs.registerLanguage('jsx', javascript);\nhljs.registerLanguage('xml', xml);\nhljs.registerLanguage('html', xml);\n\nconst renderer = new Renderer();\n\nrenderer.code = ({ text, lang }) => {\n const langLabel = lang ? `<span class=\"kookee-code-block__language\">${lang}</span>` : '';\n const copyButton = `<button type=\"button\" class=\"kookee-code-block__copy\" onclick=\"(function(btn){var code=btn.closest('.kookee-code-block').querySelector('code').textContent;navigator.clipboard.writeText(code);btn.textContent='Copied!';setTimeout(function(){btn.textContent='Copy'},2000)})(this)\" title=\"Copy code\">Copy</button>`;\n const header = `<div class=\"kookee-code-block__header\">${langLabel}${copyButton}</div>`;\n return `<div class=\"kookee-code-block\">${header}<pre><code class=\"hljs\">${text}</code></pre></div>`;\n};\n\nrenderer.link = ({ href, text }) => {\n return `<a href=\"${href}\" target=\"_blank\" rel=\"noopener noreferrer\">${text}</a>`;\n};\n\nconst marked = new Marked(\n markedHighlight({\n emptyLangClass: '',\n langPrefix: 'hljs language-',\n highlight(code, lang) {\n if (lang && hljs.getLanguage(lang)) {\n return hljs.highlight(code, { language: lang }).value;\n }\n return hljs.highlightAuto(code).value;\n },\n }),\n {\n renderer,\n gfm: true,\n breaks: true,\n },\n);\n\nexport function parseMarkdown(text: string): string {\n if (!text) return '';\n return marked.parse(text) as string;\n}\n","import { useCallback, useState } from 'react';\n\ninterface MessageActionsProps {\n content: string;\n}\n\nexport function MessageActions({ content }: MessageActionsProps) {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(content);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // Clipboard API not available\n }\n }, [content]);\n\n return (\n <div className=\"kookee-message-actions\">\n <button\n type=\"button\"\n className=\"kookee-action-button\"\n onClick={handleCopy}\n aria-label={copied ? 'Copied' : 'Copy message'}\n >\n {copied ? (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n ) : (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\" />\n <path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\" />\n </svg>\n )}\n </button>\n </div>\n );\n}\n","import type { HelpChatSource } from '@kookee/sdk';\n\ninterface SourcesProps {\n sources: HelpChatSource[];\n onSourceClick?: (source: HelpChatSource) => void;\n}\n\nexport function Sources({ sources, onSourceClick }: SourcesProps) {\n return (\n <div className=\"kookee-sources\">\n <span className=\"kookee-sources-label\">Based on:</span>\n <div className=\"kookee-sources-list\">\n {sources.map((source) => (\n <button\n key={source.id}\n type=\"button\"\n className={`kookee-source-link${onSourceClick ? ' kookee-source-link--clickable' : ''}`}\n onClick={() => onSourceClick?.(source)}\n disabled={!onSourceClick}\n >\n {source.title}\n </button>\n ))}\n </div>\n </div>\n );\n}\n","import type { HelpChatSource } from '@kookee/sdk';\nimport type { ChatMessage } from '../types';\nimport { parseMarkdown } from '../utils/markdown';\nimport { MessageActions } from './message-actions';\nimport { Sources } from './sources';\n\ninterface MessageProps {\n message: ChatMessage;\n onSourceClick?: (source: HelpChatSource) => void;\n}\n\nexport function Message({ message, onSourceClick }: MessageProps) {\n const isUser = message.role === 'user';\n\n return (\n <div className={`kookee-message kookee-message-${message.role}`}>\n {!isUser && (\n <div className=\"kookee-message-avatar\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 8V4H8\" />\n <rect width=\"16\" height=\"12\" x=\"4\" y=\"8\" rx=\"2\" />\n <path d=\"M2 14h2\" />\n <path d=\"M20 14h2\" />\n <path d=\"M15 13v2\" />\n <path d=\"M9 13v2\" />\n </svg>\n </div>\n )}\n <div className=\"kookee-message-content\">\n <div className=\"kookee-message-bubble\">\n {isUser ? (\n <div className=\"kookee-message-text kookee-message-text--plain\">\n {message.content}\n </div>\n ) : (\n <div\n className=\"kookee-message-text kookee-message-text--markdown\"\n dangerouslySetInnerHTML={{ __html: parseMarkdown(message.content) }}\n />\n )}\n {message.isStreaming && (\n <span className=\"kookee-streaming-dots\">\n <span className=\"kookee-streaming-dot\" />\n <span className=\"kookee-streaming-dot\" />\n <span className=\"kookee-streaming-dot\" />\n </span>\n )}\n </div>\n {!isUser && !message.isStreaming && message.sources && message.sources.length > 0 && (\n <Sources sources={message.sources} onSourceClick={onSourceClick} />\n )}\n {!isUser && !message.isStreaming && <MessageActions content={message.content} />}\n </div>\n </div>\n );\n}\n","export function LoadingIndicator() {\n return (\n <div className=\"kookee-message kookee-message-assistant\">\n <div className=\"kookee-message-avatar\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 8V4H8\" />\n <rect width=\"16\" height=\"12\" x=\"4\" y=\"8\" rx=\"2\" />\n <path d=\"M2 14h2\" />\n <path d=\"M20 14h2\" />\n <path d=\"M15 13v2\" />\n <path d=\"M9 13v2\" />\n </svg>\n </div>\n <div className=\"kookee-message-content\">\n <div className=\"kookee-message-bubble\">\n <div className=\"kookee-loading-dots\">\n <span className=\"kookee-loading-dot\" />\n <span className=\"kookee-loading-dot\" />\n <span className=\"kookee-loading-dot\" />\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { useEffect, useRef } from 'react';\nimport type { ReactNode } from 'react';\nimport type { HelpChatSource } from '@kookee/sdk';\nimport type { ChatMessage } from '../types';\nimport { Message } from './message';\nimport { LoadingIndicator } from './loading-indicator';\n\ninterface MessageListProps {\n messages: ChatMessage[];\n isLoading: boolean;\n emptyState?: ReactNode;\n onSourceClick?: (source: HelpChatSource) => void;\n}\n\nexport function MessageList({ messages, isLoading, emptyState, onSourceClick }: MessageListProps) {\n const bottomRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n bottomRef.current?.scrollIntoView({ behavior: 'smooth' });\n }, [messages, isLoading]);\n\n return (\n <div className=\"kookee-message-list\">\n <div className=\"kookee-message-list-spacer\" />\n {emptyState}\n {messages.map((message) => (\n <Message key={message.id} message={message} onSourceClick={onSourceClick} />\n ))}\n {isLoading && !messages.some((m) => m.isStreaming) && <LoadingIndicator />}\n <div ref={bottomRef} />\n </div>\n );\n}\n","import { useCallback, useRef, useState, type KeyboardEvent } from 'react';\n\ninterface PromptInputProps {\n placeholder?: string;\n onSubmit: (content: string) => void;\n disabled?: boolean;\n}\n\nexport function PromptInput({ placeholder = 'Ask a question...', onSubmit, disabled }: PromptInputProps) {\n const [value, setValue] = useState('');\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n const adjustHeight = useCallback(() => {\n const textarea = textareaRef.current;\n if (!textarea) return;\n textarea.style.height = 'auto';\n textarea.style.height = `${Math.min(textarea.scrollHeight, 120)}px`;\n }, []);\n\n const handleSubmit = useCallback(() => {\n const trimmed = value.trim();\n if (!trimmed || disabled) return;\n onSubmit(trimmed);\n setValue('');\n if (textareaRef.current) {\n textareaRef.current.style.height = 'auto';\n }\n }, [value, disabled, onSubmit]);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n },\n [handleSubmit],\n );\n\n return (\n <div className=\"kookee-prompt-input\">\n <textarea\n ref={textareaRef}\n className=\"kookee-prompt-textarea\"\n placeholder={placeholder}\n value={value}\n onChange={(e) => {\n setValue(e.target.value);\n adjustHeight();\n }}\n onKeyDown={handleKeyDown}\n disabled={disabled}\n rows={1}\n />\n <button\n type=\"button\"\n className=\"kookee-prompt-submit\"\n onClick={handleSubmit}\n disabled={disabled || !value.trim()}\n aria-label=\"Send message\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"m5 12 7-7 7 7\" />\n <path d=\"M12 19V5\" />\n </svg>\n </button>\n </div>\n );\n}\n","interface SuggestionsProps {\n suggestions: string[];\n onSelect: (suggestion: string) => void;\n}\n\nexport function Suggestions({ suggestions, onSelect }: SuggestionsProps) {\n if (suggestions.length === 0) return null;\n\n return (\n <div className=\"kookee-suggestions\">\n {suggestions.map((suggestion) => (\n <button\n key={suggestion}\n type=\"button\"\n className=\"kookee-suggestion-pill\"\n onClick={() => onSelect(suggestion)}\n >\n {suggestion}\n </button>\n ))}\n </div>\n );\n}\n","import type { CSSProperties } from 'react';\n\ntype Theme = 'light' | 'dark' | 'auto';\n\nexport function getThemeClass(theme: Theme | undefined): string {\n if (!theme || theme === 'light') return '';\n if (theme === 'dark') return 'kookee-dark';\n return 'kookee-auto';\n}\n\nexport function getWidgetStyle(primaryColor: string | undefined): CSSProperties | undefined {\n if (!primaryColor) return undefined;\n return {\n '--kookee-primary': primaryColor,\n '--kookee-primary-hover': primaryColor,\n '--kookee-bg-user': primaryColor,\n } as CSSProperties;\n}\n","import { KookeeChatProvider, useKookeeChat } from './kookee-chat-provider';\nimport { MessageList } from './components/message-list';\nimport { PromptInput } from './components/prompt-input';\nimport { Suggestions } from './components/suggestions';\nimport { getThemeClass, getWidgetStyle } from './theme';\nimport type { KookeeChatWidgetProps } from './types';\n\nfunction ChatBubble() {\n const { isOpen, toggle } = useKookeeChat();\n\n return (\n <button\n type=\"button\"\n className=\"kookee-widget-bubble\"\n onClick={toggle}\n aria-label={isOpen ? 'Close chat' : 'Open chat'}\n >\n {isOpen ? (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n ) : (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M7.9 20A9 9 0 1 0 4 16.1L2 22Z\" />\n </svg>\n )}\n </button>\n );\n}\n\nfunction ChatPanel({\n suggestions,\n placeholder,\n greeting,\n title,\n}: Pick<KookeeChatWidgetProps, 'suggestions' | 'placeholder' | 'greeting' | 'title'>) {\n const { isOpen, isExpanded, messages, isLoading, sendMessage, toggleExpanded, close, onSourceClick } = useKookeeChat();\n\n if (!isOpen) return null;\n\n const showSuggestions = messages.length === 0 && suggestions && suggestions.length > 0;\n const panelClassName = `kookee-widget-panel${isExpanded ? ' kookee-widget-panel--expanded' : ''}`;\n\n return (\n <div className={panelClassName}>\n <div className=\"kookee-widget-header\">\n <span className=\"kookee-widget-header-title\">{title || 'Support'}</span>\n <div className=\"kookee-widget-header-actions\">\n <button\n type=\"button\"\n className=\"kookee-widget-header-button\"\n onClick={toggleExpanded}\n aria-label={isExpanded ? 'Collapse chat' : 'Expand chat'}\n >\n {isExpanded ? (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"4 14 10 14 10 20\" />\n <polyline points=\"20 10 14 10 14 4\" />\n <line x1=\"14\" y1=\"10\" x2=\"21\" y2=\"3\" />\n <line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\" />\n </svg>\n ) : (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"15 3 21 3 21 9\" />\n <polyline points=\"9 21 3 21 3 15\" />\n <line x1=\"21\" y1=\"3\" x2=\"14\" y2=\"10\" />\n <line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\" />\n </svg>\n )}\n </button>\n <button\n type=\"button\"\n className=\"kookee-widget-header-button\"\n onClick={close}\n aria-label=\"Close chat\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n </button>\n </div>\n </div>\n <div className=\"kookee-widget-body\">\n {greeting && messages.length === 0 && (\n <div className=\"kookee-chat-greeting\">{greeting}</div>\n )}\n {showSuggestions && (\n <Suggestions suggestions={suggestions} onSelect={sendMessage} />\n )}\n <MessageList messages={messages} isLoading={isLoading} onSourceClick={onSourceClick} />\n </div>\n <div className=\"kookee-widget-footer\">\n <PromptInput\n placeholder={placeholder}\n onSubmit={sendMessage}\n disabled={isLoading}\n />\n </div>\n </div>\n );\n}\n\nexport function KookeeChatWidget({\n clientOptions,\n locale,\n position = 'bottom-right',\n theme,\n primaryColor,\n suggestions,\n placeholder,\n greeting,\n title,\n onSourceClick,\n}: KookeeChatWidgetProps) {\n const themeClass = getThemeClass(theme);\n const className = `kookee-widget kookee-widget-${position}${themeClass ? ` ${themeClass}` : ''}`;\n\n return (\n <KookeeChatProvider clientOptions={clientOptions} locale={locale} onSourceClick={onSourceClick}>\n <div className={className} style={getWidgetStyle(primaryColor)}>\n <ChatPanel suggestions={suggestions} placeholder={placeholder} greeting={greeting} title={title} />\n <ChatBubble />\n </div>\n </KookeeChatProvider>\n );\n}\n","import { KookeeChatProvider, useKookeeChat } from './kookee-chat-provider';\nimport { MessageList } from './components/message-list';\nimport { PromptInput } from './components/prompt-input';\nimport { Suggestions } from './components/suggestions';\nimport type { KookeeChatProps } from './types';\n\nfunction ChatInner({ suggestions, placeholder, greeting }: Omit<KookeeChatProps, 'clientOptions' | 'locale' | 'onSourceClick'>) {\n const { messages, isLoading, sendMessage, onSourceClick } = useKookeeChat();\n const showSuggestions = messages.length === 0 && suggestions && suggestions.length > 0;\n const showEmptyState = messages.length === 0;\n\n return (\n <div className=\"kookee-chat\">\n <MessageList\n messages={messages}\n isLoading={isLoading}\n onSourceClick={onSourceClick}\n emptyState={\n showEmptyState ? (\n <>\n {greeting && <div className=\"kookee-chat-greeting\">{greeting}</div>}\n {showSuggestions && (\n <Suggestions suggestions={suggestions} onSelect={sendMessage} />\n )}\n </>\n ) : undefined\n }\n />\n <PromptInput\n placeholder={placeholder}\n onSubmit={sendMessage}\n disabled={isLoading}\n />\n </div>\n );\n}\n\nexport function KookeeChat({ clientOptions, locale, suggestions, placeholder, greeting, onSourceClick }: KookeeChatProps) {\n return (\n <KookeeChatProvider clientOptions={clientOptions} locale={locale} onSourceClick={onSourceClick}>\n <ChatInner suggestions={suggestions} placeholder={placeholder} greeting={greeting} />\n </KookeeChatProvider>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/kookee-chat-provider.tsx","../src/lib/utils/markdown.ts","../src/lib/components/message-actions.tsx","../src/lib/components/sources.tsx","../src/lib/components/message.tsx","../src/lib/components/loading-indicator.tsx","../src/lib/components/message-list.tsx","../src/lib/components/prompt-input.tsx","../src/lib/components/suggestions.tsx","../src/lib/theme.ts","../src/lib/kookee-chat-widget.tsx","../src/lib/kookee-chat.tsx"],"names":["KookeeChatContext","createContext","KookeeChatProvider","clientOptions","locale","onSourceClick","children","messages","setMessages","useState","isLoading","setIsLoading","isOpen","setIsOpen","isExpanded","setIsExpanded","clientRef","useRef","sessionIdRef","getClient","useCallback","Kookee","sendMessage","content","userMessage","prev","client","conversationMessages","m","assistantMessageId","stream","chunk","handleStreamChunk","response","assistantMessage","messageId","open","close","toggle","toggleExpanded","clearMessages","value","useMemo","jsx","useKookeeChat","context","useContext","hljs","bash","css","javascript","json","typescript","xml","renderer","Renderer","text","lang","href","marked","Marked","markedHighlight","code","parseMarkdown","MessageActions","copied","setCopied","handleCopy","jsxs","Sources","sources","source","Message","message","isUser","LoadingIndicator","MessageList","emptyState","containerRef","useEffect","container","PromptInput","placeholder","onSubmit","disabled","setValue","textareaRef","adjustHeight","textarea","handleSubmit","trimmed","handleKeyDown","e","Suggestions","suggestions","onSelect","suggestion","getThemeClass","theme","getWidgetStyle","primaryColor","ChatBubble","ChatPanel","greeting","title","showSuggestions","KookeeChatWidget","position","themeClass","className","ChatInner","showEmptyState","Fragment","KookeeChat"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, useCallback, useContext, useMemo, useRef, useState } from 'react';\nimport { Kookee } from '@kookee/sdk';\nimport type { HelpChatStreamChunk } from '@kookee/sdk';\nimport type { ChatMessage, KookeeChatContextValue, KookeeChatProviderProps } from './types';\n\nconst KookeeChatContext = createContext<KookeeChatContextValue | null>(null);\n\nexport function KookeeChatProvider({ clientOptions, locale, onSourceClick, children }: KookeeChatProviderProps) {\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isOpen, setIsOpen] = useState(false);\n const [isExpanded, setIsExpanded] = useState(false);\n const clientRef = useRef<Kookee | null>(null);\n const sessionIdRef = useRef<string>(crypto.randomUUID());\n\n const getClient = useCallback(() => {\n if (!clientRef.current) {\n clientRef.current = new Kookee(clientOptions);\n }\n return clientRef.current;\n }, [clientOptions]);\n\n const sendMessage = useCallback(\n async (content: string) => {\n const userMessage: ChatMessage = {\n id: crypto.randomUUID(),\n role: 'user',\n content,\n };\n\n setMessages((prev) => [...prev, userMessage]);\n setIsLoading(true);\n\n const client = getClient();\n const conversationMessages = [...messages, userMessage].map((m) => ({\n role: m.role,\n content: m.content,\n }));\n\n const assistantMessageId = crypto.randomUUID();\n\n try {\n const stream = client.help.chatStream({\n messages: conversationMessages,\n locale,\n sessionId: sessionIdRef.current,\n });\n\n setMessages((prev) => [\n ...prev,\n { id: assistantMessageId, role: 'assistant', content: '', isStreaming: true },\n ]);\n setIsLoading(false);\n\n for await (const chunk of stream) {\n handleStreamChunk(chunk, assistantMessageId);\n }\n } catch {\n // Fallback to non-streaming API\n try {\n const response = await client.help.chat({\n messages: conversationMessages,\n locale,\n sessionId: sessionIdRef.current,\n });\n\n const assistantMessage: ChatMessage = {\n id: assistantMessageId,\n role: 'assistant',\n content: response.message,\n sources: response.sources,\n };\n\n setMessages((prev) => {\n const withoutStreaming = prev.filter((m) => m.id !== assistantMessageId);\n return [...withoutStreaming, assistantMessage];\n });\n } catch {\n setMessages((prev) => {\n const withoutStreaming = prev.filter((m) => m.id !== assistantMessageId);\n return [\n ...withoutStreaming,\n {\n id: assistantMessageId,\n role: 'assistant' as const,\n content: 'Sorry, something went wrong. Please try again.',\n },\n ];\n });\n }\n } finally {\n setIsLoading(false);\n }\n },\n [getClient, locale, messages],\n );\n\n function handleStreamChunk(chunk: HelpChatStreamChunk, messageId: string) {\n switch (chunk.type) {\n case 'delta':\n setMessages((prev) =>\n prev.map((m) => (m.id === messageId ? { ...m, content: m.content + chunk.content } : m)),\n );\n break;\n case 'sources':\n setMessages((prev) =>\n prev.map((m) => (m.id === messageId ? { ...m, sources: chunk.sources } : m)),\n );\n break;\n case 'done':\n setMessages((prev) =>\n prev.map((m) => (m.id === messageId ? { ...m, isStreaming: false } : m)),\n );\n break;\n case 'error':\n setMessages((prev) =>\n prev.map((m) =>\n m.id === messageId\n ? { ...m, content: 'Sorry, something went wrong. Please try again.', isStreaming: false }\n : m,\n ),\n );\n break;\n }\n }\n\n const open = useCallback(() => setIsOpen(true), []);\n const close = useCallback(() => setIsOpen(false), []);\n const toggle = useCallback(() => setIsOpen((prev) => !prev), []);\n const toggleExpanded = useCallback(() => setIsExpanded((prev) => !prev), []);\n const clearMessages = useCallback(() => {\n setMessages([]);\n sessionIdRef.current = crypto.randomUUID();\n }, []);\n\n const value = useMemo<KookeeChatContextValue>(\n () => ({ messages, isLoading, isOpen, isExpanded, sendMessage, clearMessages, open, close, toggle, toggleExpanded, onSourceClick }),\n [messages, isLoading, isOpen, isExpanded, sendMessage, clearMessages, open, close, toggle, toggleExpanded, onSourceClick],\n );\n\n return <KookeeChatContext.Provider value={value}>{children}</KookeeChatContext.Provider>;\n}\n\nexport function useKookeeChat(): KookeeChatContextValue {\n const context = useContext(KookeeChatContext);\n if (!context) {\n throw new Error('useKookeeChat must be used within a KookeeChatProvider');\n }\n return context;\n}\n","import hljs from 'highlight.js/lib/core';\nimport bash from 'highlight.js/lib/languages/bash';\nimport css from 'highlight.js/lib/languages/css';\nimport javascript from 'highlight.js/lib/languages/javascript';\nimport json from 'highlight.js/lib/languages/json';\nimport typescript from 'highlight.js/lib/languages/typescript';\nimport xml from 'highlight.js/lib/languages/xml';\nimport { Marked, Renderer } from 'marked';\nimport { markedHighlight } from 'marked-highlight';\n\nhljs.registerLanguage('bash', bash);\nhljs.registerLanguage('sh', bash);\nhljs.registerLanguage('css', css);\nhljs.registerLanguage('javascript', javascript);\nhljs.registerLanguage('js', javascript);\nhljs.registerLanguage('json', json);\nhljs.registerLanguage('typescript', typescript);\nhljs.registerLanguage('ts', typescript);\nhljs.registerLanguage('tsx', typescript);\nhljs.registerLanguage('jsx', javascript);\nhljs.registerLanguage('xml', xml);\nhljs.registerLanguage('html', xml);\n\nconst renderer = new Renderer();\n\nrenderer.code = ({ text, lang }) => {\n const langLabel = lang ? `<span class=\"kookee-code-block__language\">${lang}</span>` : '';\n const copyButton = `<button type=\"button\" class=\"kookee-code-block__copy\" onclick=\"(function(btn){var code=btn.closest('.kookee-code-block').querySelector('code').textContent;navigator.clipboard.writeText(code);btn.textContent='Copied!';setTimeout(function(){btn.textContent='Copy'},2000)})(this)\" title=\"Copy code\">Copy</button>`;\n const header = `<div class=\"kookee-code-block__header\">${langLabel}${copyButton}</div>`;\n return `<div class=\"kookee-code-block\">${header}<pre><code class=\"hljs\">${text}</code></pre></div>`;\n};\n\nrenderer.link = ({ href, text }) => {\n return `<a href=\"${href}\" target=\"_blank\" rel=\"noopener noreferrer\">${text}</a>`;\n};\n\nconst marked = new Marked(\n markedHighlight({\n emptyLangClass: '',\n langPrefix: 'hljs language-',\n highlight(code, lang) {\n if (lang && hljs.getLanguage(lang)) {\n return hljs.highlight(code, { language: lang }).value;\n }\n return hljs.highlightAuto(code).value;\n },\n }),\n {\n renderer,\n gfm: true,\n breaks: true,\n },\n);\n\nexport function parseMarkdown(text: string): string {\n if (!text) return '';\n return marked.parse(text) as string;\n}\n","import { useCallback, useState } from 'react';\n\ninterface MessageActionsProps {\n content: string;\n}\n\nexport function MessageActions({ content }: MessageActionsProps) {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(content);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // Clipboard API not available\n }\n }, [content]);\n\n return (\n <div className=\"kookee-message-actions\">\n <button\n type=\"button\"\n className=\"kookee-action-button\"\n onClick={handleCopy}\n aria-label={copied ? 'Copied' : 'Copy message'}\n >\n {copied ? (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n ) : (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\" />\n <path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\" />\n </svg>\n )}\n </button>\n </div>\n );\n}\n","import type { HelpChatSource } from '@kookee/sdk';\n\ninterface SourcesProps {\n sources: HelpChatSource[];\n onSourceClick?: (source: HelpChatSource) => void;\n}\n\nexport function Sources({ sources, onSourceClick }: SourcesProps) {\n return (\n <div className=\"kookee-sources\">\n <span className=\"kookee-sources-label\">Based on:</span>\n <div className=\"kookee-sources-list\">\n {sources.map((source) => (\n <button\n key={source.id}\n type=\"button\"\n className={`kookee-source-link${onSourceClick ? ' kookee-source-link--clickable' : ''}`}\n onClick={() => onSourceClick?.(source)}\n disabled={!onSourceClick}\n >\n {source.title}\n </button>\n ))}\n </div>\n </div>\n );\n}\n","import type { HelpChatSource } from '@kookee/sdk';\nimport type { ChatMessage } from '../types';\nimport { parseMarkdown } from '../utils/markdown';\nimport { MessageActions } from './message-actions';\nimport { Sources } from './sources';\n\ninterface MessageProps {\n message: ChatMessage;\n onSourceClick?: (source: HelpChatSource) => void;\n}\n\nexport function Message({ message, onSourceClick }: MessageProps) {\n const isUser = message.role === 'user';\n\n return (\n <div className={`kookee-message kookee-message-${message.role}`}>\n {!isUser && (\n <div className=\"kookee-message-avatar\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 8V4H8\" />\n <rect width=\"16\" height=\"12\" x=\"4\" y=\"8\" rx=\"2\" />\n <path d=\"M2 14h2\" />\n <path d=\"M20 14h2\" />\n <path d=\"M15 13v2\" />\n <path d=\"M9 13v2\" />\n </svg>\n </div>\n )}\n <div className=\"kookee-message-content\">\n <div className=\"kookee-message-bubble\">\n {isUser ? (\n <div className=\"kookee-message-text kookee-message-text--plain\">\n {message.content}\n </div>\n ) : (\n <div\n className=\"kookee-message-text kookee-message-text--markdown\"\n dangerouslySetInnerHTML={{ __html: parseMarkdown(message.content) }}\n />\n )}\n {message.isStreaming && (\n <span className=\"kookee-streaming-dots\">\n <span className=\"kookee-streaming-dot\" />\n <span className=\"kookee-streaming-dot\" />\n <span className=\"kookee-streaming-dot\" />\n </span>\n )}\n </div>\n {!isUser && !message.isStreaming && message.sources && message.sources.length > 0 && (\n <Sources sources={message.sources} onSourceClick={onSourceClick} />\n )}\n {!isUser && !message.isStreaming && <MessageActions content={message.content} />}\n </div>\n </div>\n );\n}\n","export function LoadingIndicator() {\n return (\n <div className=\"kookee-message kookee-message-assistant\">\n <div className=\"kookee-message-avatar\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 8V4H8\" />\n <rect width=\"16\" height=\"12\" x=\"4\" y=\"8\" rx=\"2\" />\n <path d=\"M2 14h2\" />\n <path d=\"M20 14h2\" />\n <path d=\"M15 13v2\" />\n <path d=\"M9 13v2\" />\n </svg>\n </div>\n <div className=\"kookee-message-content\">\n <div className=\"kookee-message-bubble\">\n <div className=\"kookee-loading-dots\">\n <span className=\"kookee-loading-dot\" />\n <span className=\"kookee-loading-dot\" />\n <span className=\"kookee-loading-dot\" />\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { useEffect, useRef } from 'react';\nimport type { ReactNode } from 'react';\nimport type { HelpChatSource } from '@kookee/sdk';\nimport type { ChatMessage } from '../types';\nimport { Message } from './message';\nimport { LoadingIndicator } from './loading-indicator';\n\ninterface MessageListProps {\n messages: ChatMessage[];\n isLoading: boolean;\n emptyState?: ReactNode;\n onSourceClick?: (source: HelpChatSource) => void;\n}\n\nexport function MessageList({ messages, isLoading, emptyState, onSourceClick }: MessageListProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const container = containerRef.current;\n if (container) {\n container.scrollTo({\n top: container.scrollHeight,\n behavior: 'smooth',\n });\n }\n }, [messages, isLoading]);\n\n return (\n <div ref={containerRef} className=\"kookee-message-list\">\n <div className=\"kookee-message-list-spacer\" />\n {emptyState}\n {messages.map((message) => (\n <Message key={message.id} message={message} onSourceClick={onSourceClick} />\n ))}\n {isLoading && !messages.some((m) => m.isStreaming) && <LoadingIndicator />}\n </div>\n );\n}\n","import { useCallback, useRef, useState, type KeyboardEvent } from 'react';\n\ninterface PromptInputProps {\n placeholder?: string;\n onSubmit: (content: string) => void;\n disabled?: boolean;\n}\n\nexport function PromptInput({ placeholder = 'Ask a question...', onSubmit, disabled }: PromptInputProps) {\n const [value, setValue] = useState('');\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n const adjustHeight = useCallback(() => {\n const textarea = textareaRef.current;\n if (!textarea) return;\n textarea.style.height = 'auto';\n textarea.style.height = `${Math.min(textarea.scrollHeight, 120)}px`;\n }, []);\n\n const handleSubmit = useCallback(() => {\n const trimmed = value.trim();\n if (!trimmed || disabled) return;\n onSubmit(trimmed);\n setValue('');\n if (textareaRef.current) {\n textareaRef.current.style.height = 'auto';\n }\n }, [value, disabled, onSubmit]);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n },\n [handleSubmit],\n );\n\n return (\n <div className=\"kookee-prompt-input\">\n <textarea\n ref={textareaRef}\n className=\"kookee-prompt-textarea\"\n placeholder={placeholder}\n value={value}\n onChange={(e) => {\n setValue(e.target.value);\n adjustHeight();\n }}\n onKeyDown={handleKeyDown}\n disabled={disabled}\n rows={1}\n />\n <button\n type=\"button\"\n className=\"kookee-prompt-submit\"\n onClick={handleSubmit}\n disabled={disabled || !value.trim()}\n aria-label=\"Send message\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"m5 12 7-7 7 7\" />\n <path d=\"M12 19V5\" />\n </svg>\n </button>\n </div>\n );\n}\n","interface SuggestionsProps {\n suggestions: string[];\n onSelect: (suggestion: string) => void;\n}\n\nexport function Suggestions({ suggestions, onSelect }: SuggestionsProps) {\n if (suggestions.length === 0) return null;\n\n return (\n <div className=\"kookee-suggestions\">\n {suggestions.map((suggestion) => (\n <button\n key={suggestion}\n type=\"button\"\n className=\"kookee-suggestion-pill\"\n onClick={() => onSelect(suggestion)}\n >\n {suggestion}\n </button>\n ))}\n </div>\n );\n}\n","import type { CSSProperties } from 'react';\n\ntype Theme = 'light' | 'dark' | 'auto';\n\nexport function getThemeClass(theme: Theme | undefined): string {\n if (!theme || theme === 'light') return '';\n if (theme === 'dark') return 'kookee-dark';\n return 'kookee-auto';\n}\n\nexport function getWidgetStyle(primaryColor: string | undefined): CSSProperties | undefined {\n if (!primaryColor) return undefined;\n return {\n '--kookee-primary': primaryColor,\n '--kookee-primary-hover': primaryColor,\n '--kookee-bg-user': primaryColor,\n } as CSSProperties;\n}\n","import { KookeeChatProvider, useKookeeChat } from './kookee-chat-provider';\nimport { MessageList } from './components/message-list';\nimport { PromptInput } from './components/prompt-input';\nimport { Suggestions } from './components/suggestions';\nimport { getThemeClass, getWidgetStyle } from './theme';\nimport type { KookeeChatWidgetProps } from './types';\n\nfunction ChatBubble() {\n const { isOpen, toggle } = useKookeeChat();\n\n return (\n <button\n type=\"button\"\n className=\"kookee-widget-bubble\"\n onClick={toggle}\n aria-label={isOpen ? 'Close chat' : 'Open chat'}\n >\n {isOpen ? (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n ) : (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M7.9 20A9 9 0 1 0 4 16.1L2 22Z\" />\n </svg>\n )}\n </button>\n );\n}\n\nfunction ChatPanel({\n suggestions,\n placeholder,\n greeting,\n title,\n}: Pick<KookeeChatWidgetProps, 'suggestions' | 'placeholder' | 'greeting' | 'title'>) {\n const { isOpen, isExpanded, messages, isLoading, sendMessage, toggleExpanded, close, onSourceClick } = useKookeeChat();\n\n if (!isOpen) return null;\n\n const showSuggestions = messages.length === 0 && suggestions && suggestions.length > 0;\n const panelClassName = `kookee-widget-panel${isExpanded ? ' kookee-widget-panel--expanded' : ''}`;\n\n return (\n <div className={panelClassName}>\n <div className=\"kookee-widget-header\">\n <span className=\"kookee-widget-header-title\">{title || 'Support'}</span>\n <div className=\"kookee-widget-header-actions\">\n <button\n type=\"button\"\n className=\"kookee-widget-header-button\"\n onClick={toggleExpanded}\n aria-label={isExpanded ? 'Collapse chat' : 'Expand chat'}\n >\n {isExpanded ? (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"4 14 10 14 10 20\" />\n <polyline points=\"20 10 14 10 14 4\" />\n <line x1=\"14\" y1=\"10\" x2=\"21\" y2=\"3\" />\n <line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\" />\n </svg>\n ) : (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"15 3 21 3 21 9\" />\n <polyline points=\"9 21 3 21 3 15\" />\n <line x1=\"21\" y1=\"3\" x2=\"14\" y2=\"10\" />\n <line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\" />\n </svg>\n )}\n </button>\n <button\n type=\"button\"\n className=\"kookee-widget-header-button\"\n onClick={close}\n aria-label=\"Close chat\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n </button>\n </div>\n </div>\n <div className=\"kookee-widget-body\">\n {greeting && messages.length === 0 && (\n <div className=\"kookee-chat-greeting\">{greeting}</div>\n )}\n {showSuggestions && (\n <Suggestions suggestions={suggestions} onSelect={sendMessage} />\n )}\n <MessageList messages={messages} isLoading={isLoading} onSourceClick={onSourceClick} />\n </div>\n <div className=\"kookee-widget-footer\">\n <PromptInput\n placeholder={placeholder}\n onSubmit={sendMessage}\n disabled={isLoading}\n />\n </div>\n </div>\n );\n}\n\nexport function KookeeChatWidget({\n clientOptions,\n locale,\n position = 'bottom-right',\n theme,\n primaryColor,\n suggestions,\n placeholder,\n greeting,\n title,\n onSourceClick,\n}: KookeeChatWidgetProps) {\n const themeClass = getThemeClass(theme);\n const className = `kookee-widget kookee-widget-${position}${themeClass ? ` ${themeClass}` : ''}`;\n\n return (\n <KookeeChatProvider clientOptions={clientOptions} locale={locale} onSourceClick={onSourceClick}>\n <div className={className} style={getWidgetStyle(primaryColor)}>\n <ChatPanel suggestions={suggestions} placeholder={placeholder} greeting={greeting} title={title} />\n <ChatBubble />\n </div>\n </KookeeChatProvider>\n );\n}\n","import { KookeeChatProvider, useKookeeChat } from './kookee-chat-provider';\nimport { MessageList } from './components/message-list';\nimport { PromptInput } from './components/prompt-input';\nimport { Suggestions } from './components/suggestions';\nimport type { KookeeChatProps } from './types';\n\nfunction ChatInner({ suggestions, placeholder, greeting }: Omit<KookeeChatProps, 'clientOptions' | 'locale' | 'onSourceClick'>) {\n const { messages, isLoading, sendMessage, onSourceClick } = useKookeeChat();\n const showSuggestions = messages.length === 0 && suggestions && suggestions.length > 0;\n const showEmptyState = messages.length === 0;\n\n return (\n <div className=\"kookee-chat\">\n <MessageList\n messages={messages}\n isLoading={isLoading}\n onSourceClick={onSourceClick}\n emptyState={\n showEmptyState ? (\n <>\n {greeting && <div className=\"kookee-chat-greeting\">{greeting}</div>}\n {showSuggestions && (\n <Suggestions suggestions={suggestions} onSelect={sendMessage} />\n )}\n </>\n ) : undefined\n }\n />\n <PromptInput\n placeholder={placeholder}\n onSubmit={sendMessage}\n disabled={isLoading}\n />\n </div>\n );\n}\n\nexport function KookeeChat({ clientOptions, locale, suggestions, placeholder, greeting, onSourceClick }: KookeeChatProps) {\n return (\n <KookeeChatProvider clientOptions={clientOptions} locale={locale} onSourceClick={onSourceClick}>\n <ChatInner suggestions={suggestions} placeholder={placeholder} greeting={greeting} />\n </KookeeChatProvider>\n );\n}\n"]}
|