@kookee/react 0.0.2 → 0.0.4
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/README.md +5 -4
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +16 -10
- package/dist/index.d.ts +16 -10
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/styles.css.map +1 -1
- package/package.json +6 -2
package/README.md
CHANGED
|
@@ -40,7 +40,7 @@ function App() {
|
|
|
40
40
|
<>
|
|
41
41
|
{/* Your app */}
|
|
42
42
|
<KookeeChatWidget
|
|
43
|
-
apiKey
|
|
43
|
+
clientOptions={{ apiKey: 'your-api-key' }}
|
|
44
44
|
position="bottom-right"
|
|
45
45
|
theme="auto"
|
|
46
46
|
primaryColor="#6366f1"
|
|
@@ -63,7 +63,7 @@ function SupportPage() {
|
|
|
63
63
|
return (
|
|
64
64
|
<div style={{ height: 500 }}>
|
|
65
65
|
<KookeeChat
|
|
66
|
-
apiKey
|
|
66
|
+
clientOptions={{ apiKey: 'your-api-key' }}
|
|
67
67
|
locale="en"
|
|
68
68
|
suggestions={['How do I get started?']}
|
|
69
69
|
/>
|
|
@@ -80,7 +80,7 @@ Floating bubble + chat panel. Props:
|
|
|
80
80
|
|
|
81
81
|
| Prop | Type | Default | Description |
|
|
82
82
|
|---|---|---|---|
|
|
83
|
-
| `
|
|
83
|
+
| `clientOptions` | `{ apiKey: string }` | required | SDK client configuration |
|
|
84
84
|
| `position` | `'bottom-right' \| 'bottom-left'` | `'bottom-right'` | Widget position |
|
|
85
85
|
| `theme` | `'light' \| 'dark' \| 'auto'` | `'light'` | Color theme |
|
|
86
86
|
| `primaryColor` | `string` | `#6366f1` | Accent color |
|
|
@@ -88,6 +88,7 @@ Floating bubble + chat panel. Props:
|
|
|
88
88
|
| `placeholder` | `string` | `'Ask a question...'` | Input placeholder |
|
|
89
89
|
| `locale` | `string` | — | Locale for responses |
|
|
90
90
|
| `suggestions` | `string[]` | — | Quick-start suggestion pills |
|
|
91
|
+
| `onSourceClick` | `(source: HelpChatSource) => void` | — | Callback when user clicks a source |
|
|
91
92
|
|
|
92
93
|
### `KookeeChat`
|
|
93
94
|
|
|
@@ -107,7 +108,7 @@ function CustomChat() {
|
|
|
107
108
|
|
|
108
109
|
function App() {
|
|
109
110
|
return (
|
|
110
|
-
<KookeeChatProvider apiKey
|
|
111
|
+
<KookeeChatProvider clientOptions={{ apiKey: 'your-api-key' }}>
|
|
111
112
|
<CustomChat />
|
|
112
113
|
</KookeeChatProvider>
|
|
113
114
|
);
|
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');var O=react.createContext(null);function f({apiKey:e,locale:o,children:t}){let[s,n]=react.useState([]),[a,d]=react.useState(false),[p,g]=react.useState(false),r=react.useRef(null),V=react.useCallback(()=>(r.current||(r.current=new sdk.Kookee({apiKey:e})),r.current),[e]),A=react.useCallback(async w=>{let H={id:crypto.randomUUID(),role:"user",content:w};n(m=>[...m,H]),d(true);try{let m=V(),x=[...s,H].map(C=>({role:C.role,content:C.content})),U=await m.help.chat({messages:x,locale:o}),X={id:crypto.randomUUID(),role:"assistant",content:U.message,sources:U.sources};n(C=>[...C,X]);}catch{let m={id:crypto.randomUUID(),role:"assistant",content:"Sorry, something went wrong. Please try again."};n(x=>[...x,m]);}finally{d(false);}},[V,o,s]),B=react.useCallback(()=>g(true),[]),E=react.useCallback(()=>g(false),[]),D=react.useCallback(()=>g(w=>!w),[]),Q=react.useMemo(()=>({messages:s,isLoading:a,isOpen:p,sendMessage:A,open:B,close:E,toggle:D}),[s,a,p,A,B,E,D]);return jsxRuntime.jsx(O.Provider,{value:Q,children:t})}function k(){let e=react.useContext(O);if(!e)throw new Error("useKookeeChat must be used within a KookeeChatProvider");return e}function R({content:e}){let[o,t]=react.useState(false),s=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:s,"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 $({sources:e}){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(o=>jsxRuntime.jsx("span",{className:"kookee-source-link",children:o.title},o.id))})]})}function q({message:e}){let o=e.role==="user";return jsxRuntime.jsxs("div",{className:`kookee-message kookee-message-${e.role}`,children:[!o&&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.jsx("div",{className:"kookee-message-bubble",children:jsxRuntime.jsx("div",{className:"kookee-message-text",children:e.content})}),!o&&e.sources&&e.sources.length>0&&jsxRuntime.jsx($,{sources:e.sources}),!o&&jsxRuntime.jsx(R,{content:e.content})]})]})}function Z(){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 y({messages:e,isLoading:o}){let t=react.useRef(null);return react.useEffect(()=>{t.current?.scrollIntoView({behavior:"smooth"});},[e,o]),jsxRuntime.jsxs("div",{className:"kookee-message-list",children:[e.map(s=>jsxRuntime.jsx(q,{message:s},s.id)),o&&jsxRuntime.jsx(Z,{}),jsxRuntime.jsx("div",{ref:t})]})}function b({placeholder:e="Ask a question...",onSubmit:o,disabled:t}){let[s,n]=react.useState(""),a=react.useRef(null),d=react.useCallback(()=>{let r=a.current;r&&(r.style.height="auto",r.style.height=`${Math.min(r.scrollHeight,120)}px`);},[]),p=react.useCallback(()=>{let r=s.trim();!r||t||(o(r),n(""),a.current&&(a.current.style.height="auto"));},[s,t,o]),g=react.useCallback(r=>{r.key==="Enter"&&!r.shiftKey&&(r.preventDefault(),p());},[p]);return jsxRuntime.jsxs("div",{className:"kookee-prompt-input",children:[jsxRuntime.jsx("textarea",{ref:a,className:"kookee-prompt-textarea",placeholder:e,value:s,onChange:r=>{n(r.target.value),d();},onKeyDown:g,disabled:t,rows:1}),jsxRuntime.jsx("button",{type:"button",className:"kookee-prompt-submit",onClick:p,disabled:t||!s.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 P({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 G(e){return !e||e==="light"?"":e==="dark"?"kookee-dark":"kookee-auto"}function J(e){if(e)return {"--kookee-primary":e,"--kookee-primary-hover":e,"--kookee-bg-user":e}}function ge(){let{isOpen:e,toggle:o}=k();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 ke({suggestions:e,placeholder:o,greeting:t}){let{isOpen:s,messages:n,isLoading:a,sendMessage:d}=k();if(!s)return null;let p=n.length===0&&e&&e.length>0;return jsxRuntime.jsxs("div",{className:"kookee-widget-panel",children:[jsxRuntime.jsx("div",{className:"kookee-widget-header",children:jsxRuntime.jsx("span",{className:"kookee-widget-header-title",children:"Support"})}),jsxRuntime.jsxs("div",{className:"kookee-widget-body",children:[t&&n.length===0&&jsxRuntime.jsx("div",{className:"kookee-chat-greeting",children:t}),p&&jsxRuntime.jsx(P,{suggestions:e,onSelect:d}),jsxRuntime.jsx(y,{messages:n,isLoading:a})]}),jsxRuntime.jsx("div",{className:"kookee-widget-footer",children:jsxRuntime.jsx(b,{placeholder:o,onSubmit:d,disabled:a})})]})}function ue({apiKey:e,locale:o,position:t="bottom-right",theme:s,primaryColor:n,suggestions:a,placeholder:d,greeting:p}){let g=G(s),r=`kookee-widget kookee-widget-${t}${g?` ${g}`:""}`;return jsxRuntime.jsx(f,{apiKey:e,locale:o,children:jsxRuntime.jsxs("div",{className:r,style:J(n),children:[jsxRuntime.jsx(ke,{suggestions:a,placeholder:d,greeting:p}),jsxRuntime.jsx(ge,{})]})})}function he({suggestions:e,placeholder:o,greeting:t}){let{messages:s,isLoading:n,sendMessage:a}=k(),d=s.length===0&&e&&e.length>0;return jsxRuntime.jsxs("div",{className:"kookee-chat",children:[t&&s.length===0&&jsxRuntime.jsx("div",{className:"kookee-chat-greeting",children:t}),d&&jsxRuntime.jsx(P,{suggestions:e,onSelect:a}),jsxRuntime.jsx(y,{messages:s,isLoading:n}),jsxRuntime.jsx(b,{placeholder:o,onSubmit:a,disabled:n})]})}function me({apiKey:e,locale:o,suggestions:t,placeholder:s,greeting:n}){return jsxRuntime.jsx(f,{apiKey:e,locale:o,children:jsxRuntime.jsx(he,{suggestions:t,placeholder:s,greeting:n})})}exports.KookeeChat=me;exports.KookeeChatProvider=f;exports.KookeeChatWidget=ue;exports.useKookeeChat=k;//# 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'),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
|
|
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/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","apiKey","locale","children","messages","setMessages","useState","isLoading","setIsLoading","isOpen","setIsOpen","clientRef","useRef","getClient","useCallback","Kookee","sendMessage","content","userMessage","prev","client","conversationMessages","m","response","assistantMessage","errorMessage","open","close","toggle","value","useMemo","jsx","useKookeeChat","context","useContext","MessageActions","copied","setCopied","handleCopy","jsxs","Sources","sources","source","Message","message","isUser","LoadingIndicator","MessageList","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","showSuggestions","KookeeChatWidget","position","themeClass","className","ChatInner","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 { ChatMessage, KookeeChatContextValue, KookeeChatProviderProps } from './types';\n\nconst KookeeChatContext = createContext<KookeeChatContextValue | null>(null);\n\nexport function KookeeChatProvider({ apiKey, locale, children }: KookeeChatProviderProps) {\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isOpen, setIsOpen] = useState(false);\n const clientRef = useRef<Kookee | null>(null);\n\n const getClient = useCallback(() => {\n if (!clientRef.current) {\n clientRef.current = new Kookee({ apiKey });\n }\n return clientRef.current;\n }, [apiKey]);\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 try {\n const client = getClient();\n const conversationMessages = [...messages, userMessage].map((m) => ({\n role: m.role,\n content: m.content,\n }));\n\n const response = await client.help.chat({\n messages: conversationMessages,\n locale,\n });\n\n const assistantMessage: ChatMessage = {\n id: crypto.randomUUID(),\n role: 'assistant',\n content: response.message,\n sources: response.sources,\n };\n\n setMessages((prev) => [...prev, assistantMessage]);\n } catch {\n const errorMessage: ChatMessage = {\n id: crypto.randomUUID(),\n role: 'assistant',\n content: 'Sorry, something went wrong. Please try again.',\n };\n setMessages((prev) => [...prev, errorMessage]);\n } finally {\n setIsLoading(false);\n }\n },\n [getClient, locale, messages],\n );\n\n const open = useCallback(() => setIsOpen(true), []);\n const close = useCallback(() => setIsOpen(false), []);\n const toggle = useCallback(() => setIsOpen((prev) => !prev), []);\n\n const value = useMemo<KookeeChatContextValue>(\n () => ({ messages, isLoading, isOpen, sendMessage, open, close, toggle }),\n [messages, isLoading, isOpen, sendMessage, open, close, toggle],\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 { 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","interface SourcesProps {\n sources: Array<{ id: string; slug: string; title: string }>;\n}\n\nexport function Sources({ sources }: 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 <span key={source.id} className=\"kookee-source-link\">\n {source.title}\n </span>\n ))}\n </div>\n </div>\n );\n}\n","import type { ChatMessage } from '../types';\nimport { MessageActions } from './message-actions';\nimport { Sources } from './sources';\n\ninterface MessageProps {\n message: ChatMessage;\n}\n\nexport function Message({ message }: 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 <div className=\"kookee-message-text\">{message.content}</div>\n </div>\n {!isUser && message.sources && message.sources.length > 0 && (\n <Sources sources={message.sources} />\n )}\n {!isUser && <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 { ChatMessage } from '../types';\nimport { Message } from './message';\nimport { LoadingIndicator } from './loading-indicator';\n\ninterface MessageListProps {\n messages: ChatMessage[];\n isLoading: boolean;\n}\n\nexport function MessageList({ messages, isLoading }: 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 {messages.map((message) => (\n <Message key={message.id} message={message} />\n ))}\n {isLoading && <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}: Pick<KookeeChatWidgetProps, 'suggestions' | 'placeholder' | 'greeting'>) {\n const { isOpen, messages, isLoading, sendMessage } = useKookeeChat();\n\n if (!isOpen) return null;\n\n const showSuggestions = messages.length === 0 && suggestions && suggestions.length > 0;\n\n return (\n <div className=\"kookee-widget-panel\">\n <div className=\"kookee-widget-header\">\n <span className=\"kookee-widget-header-title\">Support</span>\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} />\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 apiKey,\n locale,\n position = 'bottom-right',\n theme,\n primaryColor,\n suggestions,\n placeholder,\n greeting,\n}: KookeeChatWidgetProps) {\n const themeClass = getThemeClass(theme);\n const className = `kookee-widget kookee-widget-${position}${themeClass ? ` ${themeClass}` : ''}`;\n\n return (\n <KookeeChatProvider apiKey={apiKey} locale={locale}>\n <div className={className} style={getWidgetStyle(primaryColor)}>\n <ChatPanel suggestions={suggestions} placeholder={placeholder} greeting={greeting} />\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, 'apiKey' | 'locale'>) {\n const { messages, isLoading, sendMessage } = useKookeeChat();\n const showSuggestions = messages.length === 0 && suggestions && suggestions.length > 0;\n\n return (\n <div className=\"kookee-chat\">\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} />\n <PromptInput\n placeholder={placeholder}\n onSubmit={sendMessage}\n disabled={isLoading}\n />\n </div>\n );\n}\n\nexport function KookeeChat({ apiKey, locale, suggestions, placeholder, greeting }: KookeeChatProps) {\n return (\n <KookeeChatProvider apiKey={apiKey} locale={locale}>\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","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"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,16 +1,21 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { KookeeConfig, HelpChatSource } from '@kookee/sdk';
|
|
3
|
+
export { HelpChatSource } from '@kookee/sdk';
|
|
2
4
|
|
|
3
5
|
interface KookeeChatProviderProps {
|
|
4
|
-
|
|
6
|
+
clientOptions: KookeeConfig;
|
|
5
7
|
locale?: string;
|
|
8
|
+
onSourceClick?: (source: HelpChatSource) => void;
|
|
6
9
|
children: React.ReactNode;
|
|
7
10
|
}
|
|
8
11
|
interface KookeeChatProps {
|
|
9
|
-
|
|
12
|
+
clientOptions: KookeeConfig;
|
|
10
13
|
locale?: string;
|
|
11
14
|
suggestions?: string[];
|
|
12
15
|
placeholder?: string;
|
|
13
16
|
greeting?: string;
|
|
17
|
+
title?: string;
|
|
18
|
+
onSourceClick?: (source: HelpChatSource) => void;
|
|
14
19
|
}
|
|
15
20
|
interface KookeeChatWidgetProps extends KookeeChatProps {
|
|
16
21
|
position?: 'bottom-right' | 'bottom-left';
|
|
@@ -21,27 +26,28 @@ interface ChatMessage {
|
|
|
21
26
|
id: string;
|
|
22
27
|
role: 'user' | 'assistant';
|
|
23
28
|
content: string;
|
|
24
|
-
sources?:
|
|
25
|
-
|
|
26
|
-
slug: string;
|
|
27
|
-
title: string;
|
|
28
|
-
}>;
|
|
29
|
+
sources?: HelpChatSource[];
|
|
30
|
+
isStreaming?: boolean;
|
|
29
31
|
}
|
|
30
32
|
interface KookeeChatContextValue {
|
|
31
33
|
messages: ChatMessage[];
|
|
32
34
|
isLoading: boolean;
|
|
33
35
|
isOpen: boolean;
|
|
36
|
+
isExpanded: boolean;
|
|
34
37
|
sendMessage: (content: string) => Promise<void>;
|
|
38
|
+
clearMessages: () => void;
|
|
35
39
|
open: () => void;
|
|
36
40
|
close: () => void;
|
|
37
41
|
toggle: () => void;
|
|
42
|
+
toggleExpanded: () => void;
|
|
43
|
+
onSourceClick?: (source: HelpChatSource) => void;
|
|
38
44
|
}
|
|
39
45
|
|
|
40
|
-
declare function KookeeChatWidget({
|
|
46
|
+
declare function KookeeChatWidget({ clientOptions, locale, position, theme, primaryColor, suggestions, placeholder, greeting, title, onSourceClick, }: KookeeChatWidgetProps): react_jsx_runtime.JSX.Element;
|
|
41
47
|
|
|
42
|
-
declare function KookeeChat({
|
|
48
|
+
declare function KookeeChat({ clientOptions, locale, suggestions, placeholder, greeting, onSourceClick }: KookeeChatProps): react_jsx_runtime.JSX.Element;
|
|
43
49
|
|
|
44
|
-
declare function KookeeChatProvider({
|
|
50
|
+
declare function KookeeChatProvider({ clientOptions, locale, onSourceClick, children }: KookeeChatProviderProps): react_jsx_runtime.JSX.Element;
|
|
45
51
|
declare function useKookeeChat(): KookeeChatContextValue;
|
|
46
52
|
|
|
47
53
|
export { KookeeChat, type KookeeChatProps, KookeeChatProvider, type KookeeChatProviderProps, KookeeChatWidget, type KookeeChatWidgetProps, useKookeeChat };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,16 +1,21 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { KookeeConfig, HelpChatSource } from '@kookee/sdk';
|
|
3
|
+
export { HelpChatSource } from '@kookee/sdk';
|
|
2
4
|
|
|
3
5
|
interface KookeeChatProviderProps {
|
|
4
|
-
|
|
6
|
+
clientOptions: KookeeConfig;
|
|
5
7
|
locale?: string;
|
|
8
|
+
onSourceClick?: (source: HelpChatSource) => void;
|
|
6
9
|
children: React.ReactNode;
|
|
7
10
|
}
|
|
8
11
|
interface KookeeChatProps {
|
|
9
|
-
|
|
12
|
+
clientOptions: KookeeConfig;
|
|
10
13
|
locale?: string;
|
|
11
14
|
suggestions?: string[];
|
|
12
15
|
placeholder?: string;
|
|
13
16
|
greeting?: string;
|
|
17
|
+
title?: string;
|
|
18
|
+
onSourceClick?: (source: HelpChatSource) => void;
|
|
14
19
|
}
|
|
15
20
|
interface KookeeChatWidgetProps extends KookeeChatProps {
|
|
16
21
|
position?: 'bottom-right' | 'bottom-left';
|
|
@@ -21,27 +26,28 @@ interface ChatMessage {
|
|
|
21
26
|
id: string;
|
|
22
27
|
role: 'user' | 'assistant';
|
|
23
28
|
content: string;
|
|
24
|
-
sources?:
|
|
25
|
-
|
|
26
|
-
slug: string;
|
|
27
|
-
title: string;
|
|
28
|
-
}>;
|
|
29
|
+
sources?: HelpChatSource[];
|
|
30
|
+
isStreaming?: boolean;
|
|
29
31
|
}
|
|
30
32
|
interface KookeeChatContextValue {
|
|
31
33
|
messages: ChatMessage[];
|
|
32
34
|
isLoading: boolean;
|
|
33
35
|
isOpen: boolean;
|
|
36
|
+
isExpanded: boolean;
|
|
34
37
|
sendMessage: (content: string) => Promise<void>;
|
|
38
|
+
clearMessages: () => void;
|
|
35
39
|
open: () => void;
|
|
36
40
|
close: () => void;
|
|
37
41
|
toggle: () => void;
|
|
42
|
+
toggleExpanded: () => void;
|
|
43
|
+
onSourceClick?: (source: HelpChatSource) => void;
|
|
38
44
|
}
|
|
39
45
|
|
|
40
|
-
declare function KookeeChatWidget({
|
|
46
|
+
declare function KookeeChatWidget({ clientOptions, locale, position, theme, primaryColor, suggestions, placeholder, greeting, title, onSourceClick, }: KookeeChatWidgetProps): react_jsx_runtime.JSX.Element;
|
|
41
47
|
|
|
42
|
-
declare function KookeeChat({
|
|
48
|
+
declare function KookeeChat({ clientOptions, locale, suggestions, placeholder, greeting, onSourceClick }: KookeeChatProps): react_jsx_runtime.JSX.Element;
|
|
43
49
|
|
|
44
|
-
declare function KookeeChatProvider({
|
|
50
|
+
declare function KookeeChatProvider({ clientOptions, locale, onSourceClick, children }: KookeeChatProviderProps): react_jsx_runtime.JSX.Element;
|
|
45
51
|
declare function useKookeeChat(): KookeeChatContextValue;
|
|
46
52
|
|
|
47
53
|
export { KookeeChat, type KookeeChatProps, KookeeChatProvider, type KookeeChatProviderProps, KookeeChatWidget, type KookeeChatWidgetProps, useKookeeChat };
|
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}from'react/jsx-runtime';var O=createContext(null);function f({apiKey:e,locale:o,children:t}){let[s,n]=useState([]),[a,d]=useState(false),[p,g]=useState(false),r=useRef(null),V=useCallback(()=>(r.current||(r.current=new Kookee({apiKey:e})),r.current),[e]),A=useCallback(async w=>{let H={id:crypto.randomUUID(),role:"user",content:w};n(m=>[...m,H]),d(true);try{let m=V(),x=[...s,H].map(C=>({role:C.role,content:C.content})),U=await m.help.chat({messages:x,locale:o}),X={id:crypto.randomUUID(),role:"assistant",content:U.message,sources:U.sources};n(C=>[...C,X]);}catch{let m={id:crypto.randomUUID(),role:"assistant",content:"Sorry, something went wrong. Please try again."};n(x=>[...x,m]);}finally{d(false);}},[V,o,s]),B=useCallback(()=>g(true),[]),E=useCallback(()=>g(false),[]),D=useCallback(()=>g(w=>!w),[]),Q=useMemo(()=>({messages:s,isLoading:a,isOpen:p,sendMessage:A,open:B,close:E,toggle:D}),[s,a,p,A,B,E,D]);return jsx(O.Provider,{value:Q,children:t})}function k(){let e=useContext(O);if(!e)throw new Error("useKookeeChat must be used within a KookeeChatProvider");return e}function R({content:e}){let[o,t]=useState(false),s=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:s,"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 $({sources:e}){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(o=>jsx("span",{className:"kookee-source-link",children:o.title},o.id))})]})}function q({message:e}){let o=e.role==="user";return jsxs("div",{className:`kookee-message kookee-message-${e.role}`,children:[!o&&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:[jsx("div",{className:"kookee-message-bubble",children:jsx("div",{className:"kookee-message-text",children:e.content})}),!o&&e.sources&&e.sources.length>0&&jsx($,{sources:e.sources}),!o&&jsx(R,{content:e.content})]})]})}function Z(){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 y({messages:e,isLoading:o}){let t=useRef(null);return useEffect(()=>{t.current?.scrollIntoView({behavior:"smooth"});},[e,o]),jsxs("div",{className:"kookee-message-list",children:[e.map(s=>jsx(q,{message:s},s.id)),o&&jsx(Z,{}),jsx("div",{ref:t})]})}function b({placeholder:e="Ask a question...",onSubmit:o,disabled:t}){let[s,n]=useState(""),a=useRef(null),d=useCallback(()=>{let r=a.current;r&&(r.style.height="auto",r.style.height=`${Math.min(r.scrollHeight,120)}px`);},[]),p=useCallback(()=>{let r=s.trim();!r||t||(o(r),n(""),a.current&&(a.current.style.height="auto"));},[s,t,o]),g=useCallback(r=>{r.key==="Enter"&&!r.shiftKey&&(r.preventDefault(),p());},[p]);return jsxs("div",{className:"kookee-prompt-input",children:[jsx("textarea",{ref:a,className:"kookee-prompt-textarea",placeholder:e,value:s,onChange:r=>{n(r.target.value),d();},onKeyDown:g,disabled:t,rows:1}),jsx("button",{type:"button",className:"kookee-prompt-submit",onClick:p,disabled:t||!s.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 P({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 G(e){return !e||e==="light"?"":e==="dark"?"kookee-dark":"kookee-auto"}function J(e){if(e)return {"--kookee-primary":e,"--kookee-primary-hover":e,"--kookee-bg-user":e}}function ge(){let{isOpen:e,toggle:o}=k();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 ke({suggestions:e,placeholder:o,greeting:t}){let{isOpen:s,messages:n,isLoading:a,sendMessage:d}=k();if(!s)return null;let p=n.length===0&&e&&e.length>0;return jsxs("div",{className:"kookee-widget-panel",children:[jsx("div",{className:"kookee-widget-header",children:jsx("span",{className:"kookee-widget-header-title",children:"Support"})}),jsxs("div",{className:"kookee-widget-body",children:[t&&n.length===0&&jsx("div",{className:"kookee-chat-greeting",children:t}),p&&jsx(P,{suggestions:e,onSelect:d}),jsx(y,{messages:n,isLoading:a})]}),jsx("div",{className:"kookee-widget-footer",children:jsx(b,{placeholder:o,onSubmit:d,disabled:a})})]})}function ue({apiKey:e,locale:o,position:t="bottom-right",theme:s,primaryColor:n,suggestions:a,placeholder:d,greeting:p}){let g=G(s),r=`kookee-widget kookee-widget-${t}${g?` ${g}`:""}`;return jsx(f,{apiKey:e,locale:o,children:jsxs("div",{className:r,style:J(n),children:[jsx(ke,{suggestions:a,placeholder:d,greeting:p}),jsx(ge,{})]})})}function he({suggestions:e,placeholder:o,greeting:t}){let{messages:s,isLoading:n,sendMessage:a}=k(),d=s.length===0&&e&&e.length>0;return jsxs("div",{className:"kookee-chat",children:[t&&s.length===0&&jsx("div",{className:"kookee-chat-greeting",children:t}),d&&jsx(P,{suggestions:e,onSelect:a}),jsx(y,{messages:s,isLoading:n}),jsx(b,{placeholder:o,onSubmit:a,disabled:n})]})}function me({apiKey:e,locale:o,suggestions:t,placeholder:s,greeting:n}){return jsx(f,{apiKey:e,locale:o,children:jsx(he,{suggestions:t,placeholder:s,greeting:n})})}export{me as KookeeChat,f as KookeeChatProvider,ue as KookeeChatWidget,k 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 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
|
|
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/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","apiKey","locale","children","messages","setMessages","useState","isLoading","setIsLoading","isOpen","setIsOpen","clientRef","useRef","getClient","useCallback","Kookee","sendMessage","content","userMessage","prev","client","conversationMessages","m","response","assistantMessage","errorMessage","open","close","toggle","value","useMemo","jsx","useKookeeChat","context","useContext","MessageActions","copied","setCopied","handleCopy","jsxs","Sources","sources","source","Message","message","isUser","LoadingIndicator","MessageList","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","showSuggestions","KookeeChatWidget","position","themeClass","className","ChatInner","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 { ChatMessage, KookeeChatContextValue, KookeeChatProviderProps } from './types';\n\nconst KookeeChatContext = createContext<KookeeChatContextValue | null>(null);\n\nexport function KookeeChatProvider({ apiKey, locale, children }: KookeeChatProviderProps) {\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isOpen, setIsOpen] = useState(false);\n const clientRef = useRef<Kookee | null>(null);\n\n const getClient = useCallback(() => {\n if (!clientRef.current) {\n clientRef.current = new Kookee({ apiKey });\n }\n return clientRef.current;\n }, [apiKey]);\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 try {\n const client = getClient();\n const conversationMessages = [...messages, userMessage].map((m) => ({\n role: m.role,\n content: m.content,\n }));\n\n const response = await client.help.chat({\n messages: conversationMessages,\n locale,\n });\n\n const assistantMessage: ChatMessage = {\n id: crypto.randomUUID(),\n role: 'assistant',\n content: response.message,\n sources: response.sources,\n };\n\n setMessages((prev) => [...prev, assistantMessage]);\n } catch {\n const errorMessage: ChatMessage = {\n id: crypto.randomUUID(),\n role: 'assistant',\n content: 'Sorry, something went wrong. Please try again.',\n };\n setMessages((prev) => [...prev, errorMessage]);\n } finally {\n setIsLoading(false);\n }\n },\n [getClient, locale, messages],\n );\n\n const open = useCallback(() => setIsOpen(true), []);\n const close = useCallback(() => setIsOpen(false), []);\n const toggle = useCallback(() => setIsOpen((prev) => !prev), []);\n\n const value = useMemo<KookeeChatContextValue>(\n () => ({ messages, isLoading, isOpen, sendMessage, open, close, toggle }),\n [messages, isLoading, isOpen, sendMessage, open, close, toggle],\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 { 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","interface SourcesProps {\n sources: Array<{ id: string; slug: string; title: string }>;\n}\n\nexport function Sources({ sources }: 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 <span key={source.id} className=\"kookee-source-link\">\n {source.title}\n </span>\n ))}\n </div>\n </div>\n );\n}\n","import type { ChatMessage } from '../types';\nimport { MessageActions } from './message-actions';\nimport { Sources } from './sources';\n\ninterface MessageProps {\n message: ChatMessage;\n}\n\nexport function Message({ message }: 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 <div className=\"kookee-message-text\">{message.content}</div>\n </div>\n {!isUser && message.sources && message.sources.length > 0 && (\n <Sources sources={message.sources} />\n )}\n {!isUser && <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 { ChatMessage } from '../types';\nimport { Message } from './message';\nimport { LoadingIndicator } from './loading-indicator';\n\ninterface MessageListProps {\n messages: ChatMessage[];\n isLoading: boolean;\n}\n\nexport function MessageList({ messages, isLoading }: 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 {messages.map((message) => (\n <Message key={message.id} message={message} />\n ))}\n {isLoading && <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}: Pick<KookeeChatWidgetProps, 'suggestions' | 'placeholder' | 'greeting'>) {\n const { isOpen, messages, isLoading, sendMessage } = useKookeeChat();\n\n if (!isOpen) return null;\n\n const showSuggestions = messages.length === 0 && suggestions && suggestions.length > 0;\n\n return (\n <div className=\"kookee-widget-panel\">\n <div className=\"kookee-widget-header\">\n <span className=\"kookee-widget-header-title\">Support</span>\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} />\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 apiKey,\n locale,\n position = 'bottom-right',\n theme,\n primaryColor,\n suggestions,\n placeholder,\n greeting,\n}: KookeeChatWidgetProps) {\n const themeClass = getThemeClass(theme);\n const className = `kookee-widget kookee-widget-${position}${themeClass ? ` ${themeClass}` : ''}`;\n\n return (\n <KookeeChatProvider apiKey={apiKey} locale={locale}>\n <div className={className} style={getWidgetStyle(primaryColor)}>\n <ChatPanel suggestions={suggestions} placeholder={placeholder} greeting={greeting} />\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, 'apiKey' | 'locale'>) {\n const { messages, isLoading, sendMessage } = useKookeeChat();\n const showSuggestions = messages.length === 0 && suggestions && suggestions.length > 0;\n\n return (\n <div className=\"kookee-chat\">\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} />\n <PromptInput\n placeholder={placeholder}\n onSubmit={sendMessage}\n disabled={isLoading}\n />\n </div>\n );\n}\n\nexport function KookeeChat({ apiKey, locale, suggestions, placeholder, greeting }: KookeeChatProps) {\n return (\n <KookeeChatProvider apiKey={apiKey} locale={locale}>\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","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"]}
|
package/dist/styles.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
:root{--kookee-primary: #6366f1;--kookee-primary-hover: #4f46e5;--kookee-bg: #ffffff;--kookee-bg-secondary: #f9fafb;--kookee-bg-user: #6366f1;--kookee-text: #111827;--kookee-text-secondary: #6b7280;--kookee-text-user: #ffffff;--kookee-border: #e5e7eb;--kookee-radius: 12px;--kookee-radius-sm: 8px;--kookee-shadow: 0 4px 24px rgba(0, 0, 0, .12);--kookee-shadow-sm: 0 1px 3px rgba(0, 0, 0, .08);--kookee-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;--kookee-font-size: 14px;--kookee-font-size-sm: 12px;--kookee-transition: .2s ease}.kookee-widget{position:fixed;z-index:9999;display:flex;flex-direction:column;align-items:flex-end;gap:12px;font-family:var(--kookee-font);font-size:var(--kookee-font-size);line-height:1.5;color:var(--kookee-text);box-sizing:border-box}.kookee-widget *,.kookee-widget *:before,.kookee-widget *:after{box-sizing:border-box}.kookee-widget-bottom-right{bottom:20px;right:20px}.kookee-widget-bottom-left{bottom:20px;left:20px;align-items:flex-start}.kookee-widget-bubble{width:56px;height:56px;border-radius:50%;border:none;background:var(--kookee-primary);color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;box-shadow:var(--kookee-shadow);transition:background var(--kookee-transition),transform var(--kookee-transition);flex-shrink:0}.kookee-widget-bubble:hover{background:var(--kookee-primary-hover);transform:scale(1.05)}.kookee-widget-bubble:active{transform:scale(.95)}.kookee-widget-panel{width:380px;max-height:520px;background:var(--kookee-bg);border-radius:var(--kookee-radius);box-shadow:var(--kookee-shadow);border:1px solid var(--kookee-border);display:flex;flex-direction:column;overflow:hidden;animation:kookee-slide-up .2s ease}@keyframes kookee-slide-up{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.kookee-widget-header{padding:16px;border-bottom:1px solid var(--kookee-border);font-weight:600;font-size:15px;flex-shrink:0}.kookee-widget-body{flex:1;overflow-y:auto;display:flex;flex-direction:column}.kookee-widget-footer{border-top:1px solid var(--kookee-border);flex-shrink:0}.kookee-chat{display:flex;flex-direction:column;height:100%;font-family:var(--kookee-font);font-size:var(--kookee-font-size);line-height:1.5;color:var(--kookee-text)}.kookee-chat-greeting{padding:24px 16px 8px;font-size:15px;font-weight:500;color:var(--kookee-text);text-align:center}.kookee-message-list{flex:1;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:12px}.kookee-message{display:flex;gap:8px;max-width:85%}.kookee-message-user{align-self:flex-end;flex-direction:row-reverse}.kookee-message-assistant{align-self:flex-start}.kookee-message-avatar{width:28px;height:28px;border-radius:50%;background:var(--kookee-bg-secondary);border:1px solid var(--kookee-border);display:flex;align-items:center;justify-content:center;flex-shrink:0;color:var(--kookee-text-secondary)}.kookee-message-content{display:flex;flex-direction:column;gap:4px;min-width:0}.kookee-message-bubble{padding:10px 14px;border-radius:var(--kookee-radius);word-break:break-word}.kookee-message-user .kookee-message-bubble{background:var(--kookee-bg-user);color:var(--kookee-text-user);border-bottom-right-radius:4px}.kookee-message-assistant .kookee-message-bubble{background:var(--kookee-bg-secondary);color:var(--kookee-text);border:1px solid var(--kookee-border);border-bottom-left-radius:4px}.kookee-message-text{white-space:pre-wrap}.kookee-loading-dots{display:flex;gap:4px;padding:4px 0}.kookee-loading-dot{width:6px;height:6px;border-radius:50%;background:var(--kookee-text-secondary);animation:kookee-dot-pulse 1.4s ease-in-out infinite}.kookee-loading-dot:nth-child(2){animation-delay:.2s}.kookee-loading-dot:nth-child(3){animation-delay:.4s}@keyframes kookee-dot-pulse{0%,80%,to{opacity:.3;transform:scale(.8)}40%{opacity:1;transform:scale(1)}}.kookee-sources{display:flex;flex-wrap:wrap;align-items:center;gap:4px;padding:0 2px}.kookee-sources-label{font-size:var(--kookee-font-size-sm);color:var(--kookee-text-secondary)}.kookee-sources-list{display:flex;flex-wrap:wrap;gap:4px}.kookee-source-link{font-size:var(--kookee-font-size-sm);color:var(--kookee-primary);background:none;border:none;cursor:default;padding:0}.kookee-message-actions{display:flex;gap:4px;padding:0 2px;opacity:0;transition:opacity var(--kookee-transition)}.kookee-message-content:hover .kookee-message-actions{opacity:1}.kookee-action-button{width:28px;height:28px;border-radius:var(--kookee-radius-sm);border:1px solid var(--kookee-border);background:var(--kookee-bg);color:var(--kookee-text-secondary);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:color var(--kookee-transition),border-color var(--kookee-transition)}.kookee-action-button:hover{color:var(--kookee-text);border-color:var(--kookee-text-secondary)}.kookee-suggestions{display:flex;flex-wrap:wrap;gap:8px;padding:8px 16px 12px}.kookee-suggestion-pill{padding:6px 14px;border-radius:999px;border:1px solid var(--kookee-border);background:var(--kookee-bg);color:var(--kookee-text);font-size:var(--kookee-font-size-sm);font-family:var(--kookee-font);cursor:pointer;transition:background var(--kookee-transition),border-color var(--kookee-transition);white-space:nowrap}.kookee-suggestion-pill:hover{background:var(--kookee-bg-secondary);border-color:var(--kookee-text-secondary)}.kookee-prompt-input{display:flex;align-items:flex-end;gap:8px;padding:12px}.kookee-prompt-textarea{flex:1;resize:none;border:1px solid var(--kookee-border);border-radius:var(--kookee-radius-sm);padding:8px 12px;font-family:var(--kookee-font);font-size:var(--kookee-font-size);line-height:1.5;color:var(--kookee-text);background:var(--kookee-bg);outline:none;min-height:38px;max-height:120px;transition:border-color var(--kookee-transition)}.kookee-prompt-textarea::placeholder{color:var(--kookee-text-secondary)}.kookee-prompt-textarea:focus{border-color:var(--kookee-primary)}.kookee-prompt-submit{width:36px;height:36px;border-radius:var(--kookee-radius-sm);border:none;background:var(--kookee-primary);color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:background var(--kookee-transition)}.kookee-prompt-submit:hover:not(:disabled){background:var(--kookee-primary-hover)}.kookee-prompt-submit:disabled{opacity:.4;cursor:not-allowed}.kookee-dark{--kookee-bg: #1f2937;--kookee-bg-secondary: #374151;--kookee-text: #f9fafb;--kookee-text-secondary: #9ca3af;--kookee-text-user: #ffffff;--kookee-border: #4b5563;--kookee-shadow: 0 4px 24px rgba(0, 0, 0, .3);--kookee-shadow-sm: 0 1px 3px rgba(0, 0, 0, .2)}@media(prefers-color-scheme:dark){.kookee-auto{--kookee-bg: #1f2937;--kookee-bg-secondary: #374151;--kookee-text: #f9fafb;--kookee-text-secondary: #9ca3af;--kookee-text-user: #ffffff;--kookee-border: #4b5563;--kookee-shadow: 0 4px 24px rgba(0, 0, 0, .3);--kookee-shadow-sm: 0 1px 3px rgba(0, 0, 0, .2)}}@media(max-width:440px){.kookee-widget-panel{width:calc(100vw - 24px);max-height:calc(100vh - 100px)}}
|
|
1
|
+
:root{--kookee-primary: #6366f1;--kookee-primary-hover: #4f46e5;--kookee-bg: #ffffff;--kookee-bg-secondary: #f9fafb;--kookee-bg-user: #6366f1;--kookee-text: #111827;--kookee-text-secondary: #6b7280;--kookee-text-user: #ffffff;--kookee-border: #e5e7eb;--kookee-radius: 12px;--kookee-radius-sm: 8px;--kookee-shadow: 0 4px 24px rgba(0, 0, 0, .12);--kookee-shadow-sm: 0 1px 3px rgba(0, 0, 0, .08);--kookee-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;--kookee-font-size: 14px;--kookee-font-size-sm: 12px;--kookee-transition: .2s ease}.kookee-widget{position:fixed;z-index:9999;display:flex;flex-direction:column;align-items:flex-end;gap:12px;font-family:var(--kookee-font);font-size:var(--kookee-font-size);line-height:1.5;color:var(--kookee-text);box-sizing:border-box}.kookee-widget *,.kookee-widget *:before,.kookee-widget *:after{box-sizing:border-box}.kookee-widget-bottom-right{bottom:20px;right:20px}.kookee-widget-bottom-left{bottom:20px;left:20px;align-items:flex-start}.kookee-widget-bubble{width:56px;height:56px;border-radius:50%;border:none;background:var(--kookee-primary);color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;box-shadow:var(--kookee-shadow);transition:background var(--kookee-transition),transform var(--kookee-transition);flex-shrink:0}.kookee-widget-bubble:hover{background:var(--kookee-primary-hover);transform:scale(1.05)}.kookee-widget-bubble:active{transform:scale(.95)}.kookee-widget-panel{width:380px;max-height:520px;background:var(--kookee-bg);border-radius:var(--kookee-radius);box-shadow:var(--kookee-shadow);border:1px solid var(--kookee-border);display:flex;flex-direction:column;overflow:hidden;animation:kookee-slide-up .2s ease}@keyframes kookee-slide-up{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.kookee-widget-panel--expanded{width:600px;max-height:calc(100vh - 100px)}.kookee-widget-header{padding:16px;border-bottom:1px solid var(--kookee-border);font-weight:600;font-size:15px;flex-shrink:0;display:flex;align-items:center;justify-content:space-between}.kookee-widget-header-actions{display:flex;gap:6px}.kookee-widget-header-button{width:28px;height:28px;border-radius:var(--kookee-radius-sm);border:1px solid var(--kookee-border);background:var(--kookee-bg);color:var(--kookee-text-secondary);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:color var(--kookee-transition),border-color var(--kookee-transition)}.kookee-widget-header-button:hover{color:var(--kookee-text);border-color:var(--kookee-text-secondary)}.kookee-widget-body{flex:1;overflow-y:auto;display:flex;flex-direction:column}.kookee-widget-footer{border-top:1px solid var(--kookee-border);flex-shrink:0}.kookee-chat{display:flex;flex-direction:column;height:100%;font-family:var(--kookee-font);font-size:var(--kookee-font-size);line-height:1.5;color:var(--kookee-text)}.kookee-chat-greeting{padding:16px;font-size:15px;font-weight:500;color:var(--kookee-text);text-align:center}.kookee-message-list{flex:1;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:12px;min-height:0}.kookee-message-list-spacer{flex:1;min-height:0}.kookee-message{display:flex;gap:8px;max-width:85%}.kookee-message-user{align-self:flex-end;flex-direction:row-reverse}.kookee-message-assistant{align-self:flex-start}.kookee-message-avatar{width:28px;height:28px;border-radius:50%;background:var(--kookee-bg-secondary);border:1px solid var(--kookee-border);display:flex;align-items:center;justify-content:center;flex-shrink:0;color:var(--kookee-text-secondary)}.kookee-message-content{display:flex;flex-direction:column;gap:4px;min-width:0}.kookee-message-bubble{padding:10px 14px;border-radius:var(--kookee-radius);word-break:break-word}.kookee-message-user .kookee-message-bubble{background:var(--kookee-bg-user);color:var(--kookee-text-user);border-bottom-right-radius:4px}.kookee-message-assistant .kookee-message-bubble{background:var(--kookee-bg-secondary);color:var(--kookee-text);border:1px solid var(--kookee-border);border-bottom-left-radius:4px}.kookee-message-text--plain{white-space:pre-wrap}.kookee-message-text--markdown p{margin:0 0 .5em}.kookee-message-text--markdown p:last-child{margin-bottom:0}.kookee-message-text--markdown h1,.kookee-message-text--markdown h2,.kookee-message-text--markdown h3{margin:.75em 0 .25em;line-height:1.3}.kookee-message-text--markdown h1:first-child,.kookee-message-text--markdown h2:first-child,.kookee-message-text--markdown h3:first-child{margin-top:0}.kookee-message-text--markdown h1{font-size:1.25em}.kookee-message-text--markdown h2{font-size:1.125em}.kookee-message-text--markdown h3{font-size:1em}.kookee-message-text--markdown ul,.kookee-message-text--markdown ol{margin:.25em 0 .5em;padding-left:1.5em}.kookee-message-text--markdown ul{list-style-type:disc}.kookee-message-text--markdown ol{list-style-type:decimal}.kookee-message-text--markdown li{margin:.15em 0;display:list-item}.kookee-message-text--markdown hr{border:none;border-top:1px solid var(--kookee-border);margin:.75em 0}.kookee-message-text--markdown a{color:var(--kookee-primary);text-decoration:underline}.kookee-message-text--markdown a:hover{color:var(--kookee-primary-hover)}.kookee-message-text--markdown code:not(pre code){background-color:#f8e8ea;color:#c41e3a;padding:.125rem .375rem;border-radius:.25rem;font-family:JetBrains Mono,Fira Code,ui-monospace,SFMono-Regular,Menlo,Monaco,Courier New,monospace;font-size:.875em;border:1px solid #f0d0d4}.kookee-message-text--markdown .kookee-code-block{position:relative;margin:.5rem 0;border-radius:.5rem;overflow:hidden;background:#1e1e1e}.kookee-message-text--markdown .kookee-code-block__header{display:flex;align-items:center;justify-content:space-between;padding:.5rem .75rem;background:#2d2d2d;border-bottom:1px solid #3d3d3d}.kookee-message-text--markdown .kookee-code-block__copy{font-size:.75rem;color:#a0a0a0;background:transparent;border:none;cursor:pointer;padding:.25rem .5rem;border-radius:.25rem;font-family:system-ui,-apple-system,sans-serif;transition:background-color .15s,color .15s}.kookee-message-text--markdown .kookee-code-block__copy:hover{background:#3d3d3d;color:#d4d4d4}.kookee-message-text--markdown .kookee-code-block__language{font-size:.75rem;color:#a0a0a0;font-family:system-ui,-apple-system,sans-serif}.kookee-message-text--markdown .kookee-code-block pre{margin:0;padding:.75rem;background:transparent;overflow-x:auto;line-height:1.6}.kookee-message-text--markdown .kookee-code-block pre code{display:block;background:none;font-family:JetBrains Mono,Fira Code,ui-monospace,SFMono-Regular,Menlo,Monaco,Courier New,monospace;font-size:.8125rem;color:#d4d4d4;padding:0;border:none}.kookee-code-block .hljs-comment,.kookee-code-block .hljs-quote{color:#6a9955;font-style:italic}.kookee-code-block .hljs-keyword,.kookee-code-block .hljs-selector-tag,.kookee-code-block .hljs-addition{color:#569cd6}.kookee-code-block .hljs-number,.kookee-code-block .hljs-string,.kookee-code-block .hljs-meta .hljs-meta-string,.kookee-code-block .hljs-literal,.kookee-code-block .hljs-doctag,.kookee-code-block .hljs-regexp{color:#ce9178}.kookee-code-block .hljs-title,.kookee-code-block .hljs-section,.kookee-code-block .hljs-name,.kookee-code-block .hljs-selector-id,.kookee-code-block .hljs-selector-class{color:#dcdcaa}.kookee-code-block .hljs-attribute,.kookee-code-block .hljs-attr,.kookee-code-block .hljs-variable,.kookee-code-block .hljs-template-variable,.kookee-code-block .hljs-class .hljs-title,.kookee-code-block .hljs-type{color:#4ec9b0}.kookee-code-block .hljs-symbol,.kookee-code-block .hljs-bullet,.kookee-code-block .hljs-subst,.kookee-code-block .hljs-meta,.kookee-code-block .hljs-meta .hljs-keyword,.kookee-code-block .hljs-selector-attr,.kookee-code-block .hljs-selector-pseudo,.kookee-code-block .hljs-link{color:#d7ba7d}.kookee-code-block .hljs-built_in,.kookee-code-block .hljs-deletion{color:#ce9178}.kookee-code-block .hljs-emphasis{font-style:italic}.kookee-code-block .hljs-strong{font-weight:700}.kookee-code-block .hljs-property{color:#9cdcfe}.kookee-code-block .hljs-punctuation,.kookee-code-block .hljs-params{color:#d4d4d4}.kookee-code-block .hljs-template-tag{color:#569cd6}.kookee-streaming-dots{display:inline-flex;gap:3px;margin-left:4px;vertical-align:middle}.kookee-streaming-dot{width:5px;height:5px;border-radius:50%;background:var(--kookee-text-secondary);animation:kookee-streaming-dot-pulse 1.4s ease-in-out infinite}.kookee-streaming-dot:nth-child(2){animation-delay:.2s}.kookee-streaming-dot:nth-child(3){animation-delay:.4s}@keyframes kookee-streaming-dot-pulse{0%,80%,to{opacity:.3;transform:scale(.8)}40%{opacity:1;transform:scale(1)}}.kookee-loading-dots{display:flex;gap:4px;padding:4px 0}.kookee-loading-dot{width:6px;height:6px;border-radius:50%;background:var(--kookee-text-secondary);animation:kookee-dot-pulse 1.4s ease-in-out infinite}.kookee-loading-dot:nth-child(2){animation-delay:.2s}.kookee-loading-dot:nth-child(3){animation-delay:.4s}@keyframes kookee-dot-pulse{0%,80%,to{opacity:.3;transform:scale(.8)}40%{opacity:1;transform:scale(1)}}.kookee-sources{display:flex;flex-wrap:wrap;align-items:center;gap:4px;padding:0 2px}.kookee-sources-label{font-size:var(--kookee-font-size-sm);color:var(--kookee-text-secondary)}.kookee-sources-list{display:flex;flex-wrap:wrap;gap:4px}.kookee-source-link{font-size:var(--kookee-font-size-sm);color:var(--kookee-primary);background:none;border:none;cursor:default;padding:0;font-family:inherit}.kookee-source-link--clickable{cursor:pointer;text-decoration:underline;text-underline-offset:2px}.kookee-source-link--clickable:hover{opacity:.8}.kookee-source-link:disabled{cursor:default;text-decoration:none}.kookee-message-actions{display:flex;gap:4px;padding:0 2px;opacity:0;transition:opacity var(--kookee-transition)}.kookee-message-content:hover .kookee-message-actions{opacity:1}.kookee-action-button{width:28px;height:28px;border-radius:var(--kookee-radius-sm);border:1px solid var(--kookee-border);background:var(--kookee-bg);color:var(--kookee-text-secondary);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:color var(--kookee-transition),border-color var(--kookee-transition)}.kookee-action-button:hover{color:var(--kookee-text);border-color:var(--kookee-text-secondary)}.kookee-suggestions{display:flex;flex-wrap:wrap;gap:8px;padding:8px 16px 12px}.kookee-suggestion-pill{padding:6px 14px;border-radius:999px;border:1px solid var(--kookee-border);background:var(--kookee-bg);color:var(--kookee-text);font-size:var(--kookee-font-size-sm);font-family:var(--kookee-font);cursor:pointer;transition:background var(--kookee-transition),border-color var(--kookee-transition);white-space:nowrap}.kookee-suggestion-pill:hover{background:var(--kookee-bg-secondary);border-color:var(--kookee-text-secondary)}.kookee-prompt-input{display:flex;align-items:flex-end;gap:8px;padding:12px}.kookee-prompt-textarea{flex:1;resize:none;border:1px solid var(--kookee-border);border-radius:var(--kookee-radius-sm);padding:8px 12px;font-family:var(--kookee-font);font-size:var(--kookee-font-size);line-height:1.5;color:var(--kookee-text);background:var(--kookee-bg);outline:none;min-height:38px;max-height:120px;transition:border-color var(--kookee-transition)}.kookee-prompt-textarea::placeholder{color:var(--kookee-text-secondary)}.kookee-prompt-textarea:focus{border-color:var(--kookee-primary)}.kookee-prompt-submit{width:36px;height:36px;border-radius:var(--kookee-radius-sm);border:none;background:var(--kookee-primary);color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:background var(--kookee-transition)}.kookee-prompt-submit:hover:not(:disabled){background:var(--kookee-primary-hover)}.kookee-prompt-submit:disabled{opacity:.4;cursor:not-allowed}.kookee-dark{--kookee-bg: #1f2937;--kookee-bg-secondary: #374151;--kookee-text: #f9fafb;--kookee-text-secondary: #9ca3af;--kookee-text-user: #ffffff;--kookee-border: #4b5563;--kookee-shadow: 0 4px 24px rgba(0, 0, 0, .3);--kookee-shadow-sm: 0 1px 3px rgba(0, 0, 0, .2)}@media(prefers-color-scheme:dark){.kookee-auto{--kookee-bg: #1f2937;--kookee-bg-secondary: #374151;--kookee-text: #f9fafb;--kookee-text-secondary: #9ca3af;--kookee-text-user: #ffffff;--kookee-border: #4b5563;--kookee-shadow: 0 4px 24px rgba(0, 0, 0, .3);--kookee-shadow-sm: 0 1px 3px rgba(0, 0, 0, .2)}}@media(max-width:640px){.kookee-widget-panel,.kookee-widget-panel--expanded{width:calc(100vw - 24px);max-height:calc(100vh - 100px)}}
|
|
2
2
|
/*# sourceMappingURL=styles.css.map */
|
package/dist/styles.css.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/styles.css"],"sourcesContent":["/* ========================================\n @kookee/react — Chat Widget Styles\n ======================================== */\n\n/* CSS Custom Properties */\n:root {\n --kookee-primary: #6366f1;\n --kookee-primary-hover: #4f46e5;\n --kookee-bg: #ffffff;\n --kookee-bg-secondary: #f9fafb;\n --kookee-bg-user: #6366f1;\n --kookee-text: #111827;\n --kookee-text-secondary: #6b7280;\n --kookee-text-user: #ffffff;\n --kookee-border: #e5e7eb;\n --kookee-radius: 12px;\n --kookee-radius-sm: 8px;\n --kookee-shadow: 0 4px 24px rgba(0, 0, 0, 0.12);\n --kookee-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.08);\n --kookee-font: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n --kookee-font-size: 14px;\n --kookee-font-size-sm: 12px;\n --kookee-transition: 200ms ease;\n}\n\n/* ========================================\n Widget Container (floating)\n ======================================== */\n\n.kookee-widget {\n position: fixed;\n z-index: 9999;\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 12px;\n font-family: var(--kookee-font);\n font-size: var(--kookee-font-size);\n line-height: 1.5;\n color: var(--kookee-text);\n box-sizing: border-box;\n}\n\n.kookee-widget *,\n.kookee-widget *::before,\n.kookee-widget *::after {\n box-sizing: border-box;\n}\n\n.kookee-widget-bottom-right {\n bottom: 20px;\n right: 20px;\n}\n\n.kookee-widget-bottom-left {\n bottom: 20px;\n left: 20px;\n align-items: flex-start;\n}\n\n/* ========================================\n Chat Bubble Button\n ======================================== */\n\n.kookee-widget-bubble {\n width: 56px;\n height: 56px;\n border-radius: 50%;\n border: none;\n background: var(--kookee-primary);\n color: #ffffff;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: var(--kookee-shadow);\n transition: background var(--kookee-transition), transform var(--kookee-transition);\n flex-shrink: 0;\n}\n\n.kookee-widget-bubble:hover {\n background: var(--kookee-primary-hover);\n transform: scale(1.05);\n}\n\n.kookee-widget-bubble:active {\n transform: scale(0.95);\n}\n\n/* ========================================\n Chat Panel (floating widget)\n ======================================== */\n\n.kookee-widget-panel {\n width: 380px;\n max-height: 520px;\n background: var(--kookee-bg);\n border-radius: var(--kookee-radius);\n box-shadow: var(--kookee-shadow);\n border: 1px solid var(--kookee-border);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n animation: kookee-slide-up 200ms ease;\n}\n\n@keyframes kookee-slide-up {\n from {\n opacity: 0;\n transform: translateY(8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.kookee-widget-header {\n padding: 16px;\n border-bottom: 1px solid var(--kookee-border);\n font-weight: 600;\n font-size: 15px;\n flex-shrink: 0;\n}\n\n.kookee-widget-body {\n flex: 1;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n}\n\n.kookee-widget-footer {\n border-top: 1px solid var(--kookee-border);\n flex-shrink: 0;\n}\n\n/* ========================================\n Inline Chat Container\n ======================================== */\n\n.kookee-chat {\n display: flex;\n flex-direction: column;\n height: 100%;\n font-family: var(--kookee-font);\n font-size: var(--kookee-font-size);\n line-height: 1.5;\n color: var(--kookee-text);\n}\n\n/* ========================================\n Greeting\n ======================================== */\n\n.kookee-chat-greeting {\n padding: 24px 16px 8px;\n font-size: 15px;\n font-weight: 500;\n color: var(--kookee-text);\n text-align: center;\n}\n\n/* ========================================\n Message List\n ======================================== */\n\n.kookee-message-list {\n flex: 1;\n overflow-y: auto;\n padding: 12px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n/* ========================================\n Message\n ======================================== */\n\n.kookee-message {\n display: flex;\n gap: 8px;\n max-width: 85%;\n}\n\n.kookee-message-user {\n align-self: flex-end;\n flex-direction: row-reverse;\n}\n\n.kookee-message-assistant {\n align-self: flex-start;\n}\n\n.kookee-message-avatar {\n width: 28px;\n height: 28px;\n border-radius: 50%;\n background: var(--kookee-bg-secondary);\n border: 1px solid var(--kookee-border);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: var(--kookee-text-secondary);\n}\n\n.kookee-message-content {\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 0;\n}\n\n.kookee-message-bubble {\n padding: 10px 14px;\n border-radius: var(--kookee-radius);\n word-break: break-word;\n}\n\n.kookee-message-user .kookee-message-bubble {\n background: var(--kookee-bg-user);\n color: var(--kookee-text-user);\n border-bottom-right-radius: 4px;\n}\n\n.kookee-message-assistant .kookee-message-bubble {\n background: var(--kookee-bg-secondary);\n color: var(--kookee-text);\n border: 1px solid var(--kookee-border);\n border-bottom-left-radius: 4px;\n}\n\n.kookee-message-text {\n white-space: pre-wrap;\n}\n\n/* ========================================\n Loading Indicator\n ======================================== */\n\n.kookee-loading-dots {\n display: flex;\n gap: 4px;\n padding: 4px 0;\n}\n\n.kookee-loading-dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--kookee-text-secondary);\n animation: kookee-dot-pulse 1.4s ease-in-out infinite;\n}\n\n.kookee-loading-dot:nth-child(2) {\n animation-delay: 0.2s;\n}\n\n.kookee-loading-dot:nth-child(3) {\n animation-delay: 0.4s;\n}\n\n@keyframes kookee-dot-pulse {\n 0%, 80%, 100% {\n opacity: 0.3;\n transform: scale(0.8);\n }\n 40% {\n opacity: 1;\n transform: scale(1);\n }\n}\n\n/* ========================================\n Sources\n ======================================== */\n\n.kookee-sources {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 4px;\n padding: 0 2px;\n}\n\n.kookee-sources-label {\n font-size: var(--kookee-font-size-sm);\n color: var(--kookee-text-secondary);\n}\n\n.kookee-sources-list {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n}\n\n.kookee-source-link {\n font-size: var(--kookee-font-size-sm);\n color: var(--kookee-primary);\n background: none;\n border: none;\n cursor: default;\n padding: 0;\n}\n\n/* ========================================\n Message Actions\n ======================================== */\n\n.kookee-message-actions {\n display: flex;\n gap: 4px;\n padding: 0 2px;\n opacity: 0;\n transition: opacity var(--kookee-transition);\n}\n\n.kookee-message-content:hover .kookee-message-actions {\n opacity: 1;\n}\n\n.kookee-action-button {\n width: 28px;\n height: 28px;\n border-radius: var(--kookee-radius-sm);\n border: 1px solid var(--kookee-border);\n background: var(--kookee-bg);\n color: var(--kookee-text-secondary);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: color var(--kookee-transition), border-color var(--kookee-transition);\n}\n\n.kookee-action-button:hover {\n color: var(--kookee-text);\n border-color: var(--kookee-text-secondary);\n}\n\n/* ========================================\n Suggestions\n ======================================== */\n\n.kookee-suggestions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n padding: 8px 16px 12px;\n}\n\n.kookee-suggestion-pill {\n padding: 6px 14px;\n border-radius: 999px;\n border: 1px solid var(--kookee-border);\n background: var(--kookee-bg);\n color: var(--kookee-text);\n font-size: var(--kookee-font-size-sm);\n font-family: var(--kookee-font);\n cursor: pointer;\n transition: background var(--kookee-transition), border-color var(--kookee-transition);\n white-space: nowrap;\n}\n\n.kookee-suggestion-pill:hover {\n background: var(--kookee-bg-secondary);\n border-color: var(--kookee-text-secondary);\n}\n\n/* ========================================\n Prompt Input\n ======================================== */\n\n.kookee-prompt-input {\n display: flex;\n align-items: flex-end;\n gap: 8px;\n padding: 12px;\n}\n\n.kookee-prompt-textarea {\n flex: 1;\n resize: none;\n border: 1px solid var(--kookee-border);\n border-radius: var(--kookee-radius-sm);\n padding: 8px 12px;\n font-family: var(--kookee-font);\n font-size: var(--kookee-font-size);\n line-height: 1.5;\n color: var(--kookee-text);\n background: var(--kookee-bg);\n outline: none;\n min-height: 38px;\n max-height: 120px;\n transition: border-color var(--kookee-transition);\n}\n\n.kookee-prompt-textarea::placeholder {\n color: var(--kookee-text-secondary);\n}\n\n.kookee-prompt-textarea:focus {\n border-color: var(--kookee-primary);\n}\n\n.kookee-prompt-submit {\n width: 36px;\n height: 36px;\n border-radius: var(--kookee-radius-sm);\n border: none;\n background: var(--kookee-primary);\n color: #ffffff;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: background var(--kookee-transition);\n}\n\n.kookee-prompt-submit:hover:not(:disabled) {\n background: var(--kookee-primary-hover);\n}\n\n.kookee-prompt-submit:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n/* ========================================\n Dark Theme\n ======================================== */\n\n.kookee-dark {\n --kookee-bg: #1f2937;\n --kookee-bg-secondary: #374151;\n --kookee-text: #f9fafb;\n --kookee-text-secondary: #9ca3af;\n --kookee-text-user: #ffffff;\n --kookee-border: #4b5563;\n --kookee-shadow: 0 4px 24px rgba(0, 0, 0, 0.3);\n --kookee-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.2);\n}\n\n@media (prefers-color-scheme: dark) {\n .kookee-auto {\n --kookee-bg: #1f2937;\n --kookee-bg-secondary: #374151;\n --kookee-text: #f9fafb;\n --kookee-text-secondary: #9ca3af;\n --kookee-text-user: #ffffff;\n --kookee-border: #4b5563;\n --kookee-shadow: 0 4px 24px rgba(0, 0, 0, 0.3);\n --kookee-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.2);\n }\n}\n\n/* ========================================\n Mobile Responsive\n ======================================== */\n\n@media (max-width: 440px) {\n .kookee-widget-panel {\n width: calc(100vw - 24px);\n max-height: calc(100vh - 100px);\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/styles.css"],"sourcesContent":["/* ========================================\n @kookee/react — Chat Widget Styles\n ======================================== */\n\n/* CSS Custom Properties */\n:root {\n --kookee-primary: #6366f1;\n --kookee-primary-hover: #4f46e5;\n --kookee-bg: #ffffff;\n --kookee-bg-secondary: #f9fafb;\n --kookee-bg-user: #6366f1;\n --kookee-text: #111827;\n --kookee-text-secondary: #6b7280;\n --kookee-text-user: #ffffff;\n --kookee-border: #e5e7eb;\n --kookee-radius: 12px;\n --kookee-radius-sm: 8px;\n --kookee-shadow: 0 4px 24px rgba(0, 0, 0, 0.12);\n --kookee-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.08);\n --kookee-font: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n --kookee-font-size: 14px;\n --kookee-font-size-sm: 12px;\n --kookee-transition: 200ms ease;\n}\n\n/* ========================================\n Widget Container (floating)\n ======================================== */\n\n.kookee-widget {\n position: fixed;\n z-index: 9999;\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 12px;\n font-family: var(--kookee-font);\n font-size: var(--kookee-font-size);\n line-height: 1.5;\n color: var(--kookee-text);\n box-sizing: border-box;\n}\n\n.kookee-widget *,\n.kookee-widget *::before,\n.kookee-widget *::after {\n box-sizing: border-box;\n}\n\n.kookee-widget-bottom-right {\n bottom: 20px;\n right: 20px;\n}\n\n.kookee-widget-bottom-left {\n bottom: 20px;\n left: 20px;\n align-items: flex-start;\n}\n\n/* ========================================\n Chat Bubble Button\n ======================================== */\n\n.kookee-widget-bubble {\n width: 56px;\n height: 56px;\n border-radius: 50%;\n border: none;\n background: var(--kookee-primary);\n color: #ffffff;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: var(--kookee-shadow);\n transition: background var(--kookee-transition), transform var(--kookee-transition);\n flex-shrink: 0;\n}\n\n.kookee-widget-bubble:hover {\n background: var(--kookee-primary-hover);\n transform: scale(1.05);\n}\n\n.kookee-widget-bubble:active {\n transform: scale(0.95);\n}\n\n/* ========================================\n Chat Panel (floating widget)\n ======================================== */\n\n.kookee-widget-panel {\n width: 380px;\n max-height: 520px;\n background: var(--kookee-bg);\n border-radius: var(--kookee-radius);\n box-shadow: var(--kookee-shadow);\n border: 1px solid var(--kookee-border);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n animation: kookee-slide-up 200ms ease;\n}\n\n@keyframes kookee-slide-up {\n from {\n opacity: 0;\n transform: translateY(8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.kookee-widget-panel--expanded {\n width: 600px;\n max-height: calc(100vh - 100px);\n}\n\n.kookee-widget-header {\n padding: 16px;\n border-bottom: 1px solid var(--kookee-border);\n font-weight: 600;\n font-size: 15px;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.kookee-widget-header-actions {\n display: flex;\n gap: 6px;\n}\n\n.kookee-widget-header-button {\n width: 28px;\n height: 28px;\n border-radius: var(--kookee-radius-sm);\n border: 1px solid var(--kookee-border);\n background: var(--kookee-bg);\n color: var(--kookee-text-secondary);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: color var(--kookee-transition), border-color var(--kookee-transition);\n}\n\n.kookee-widget-header-button:hover {\n color: var(--kookee-text);\n border-color: var(--kookee-text-secondary);\n}\n\n.kookee-widget-body {\n flex: 1;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n}\n\n.kookee-widget-footer {\n border-top: 1px solid var(--kookee-border);\n flex-shrink: 0;\n}\n\n/* ========================================\n Inline Chat Container\n ======================================== */\n\n.kookee-chat {\n display: flex;\n flex-direction: column;\n height: 100%;\n font-family: var(--kookee-font);\n font-size: var(--kookee-font-size);\n line-height: 1.5;\n color: var(--kookee-text);\n}\n\n/* ========================================\n Greeting\n ======================================== */\n\n.kookee-chat-greeting {\n padding: 16px;\n font-size: 15px;\n font-weight: 500;\n color: var(--kookee-text);\n text-align: center;\n}\n\n/* ========================================\n Message List\n ======================================== */\n\n.kookee-message-list {\n flex: 1;\n overflow-y: auto;\n padding: 12px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n min-height: 0;\n}\n\n.kookee-message-list-spacer {\n flex: 1;\n min-height: 0;\n}\n\n/* ========================================\n Message\n ======================================== */\n\n.kookee-message {\n display: flex;\n gap: 8px;\n max-width: 85%;\n}\n\n.kookee-message-user {\n align-self: flex-end;\n flex-direction: row-reverse;\n}\n\n.kookee-message-assistant {\n align-self: flex-start;\n}\n\n.kookee-message-avatar {\n width: 28px;\n height: 28px;\n border-radius: 50%;\n background: var(--kookee-bg-secondary);\n border: 1px solid var(--kookee-border);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: var(--kookee-text-secondary);\n}\n\n.kookee-message-content {\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 0;\n}\n\n.kookee-message-bubble {\n padding: 10px 14px;\n border-radius: var(--kookee-radius);\n word-break: break-word;\n}\n\n.kookee-message-user .kookee-message-bubble {\n background: var(--kookee-bg-user);\n color: var(--kookee-text-user);\n border-bottom-right-radius: 4px;\n}\n\n.kookee-message-assistant .kookee-message-bubble {\n background: var(--kookee-bg-secondary);\n color: var(--kookee-text);\n border: 1px solid var(--kookee-border);\n border-bottom-left-radius: 4px;\n}\n\n.kookee-message-text--plain {\n white-space: pre-wrap;\n}\n\n/* ========================================\n Markdown Content (assistant messages)\n ======================================== */\n\n.kookee-message-text--markdown p {\n margin: 0 0 0.5em;\n}\n\n.kookee-message-text--markdown p:last-child {\n margin-bottom: 0;\n}\n\n.kookee-message-text--markdown h1,\n.kookee-message-text--markdown h2,\n.kookee-message-text--markdown h3 {\n margin: 0.75em 0 0.25em;\n line-height: 1.3;\n}\n\n.kookee-message-text--markdown h1:first-child,\n.kookee-message-text--markdown h2:first-child,\n.kookee-message-text--markdown h3:first-child {\n margin-top: 0;\n}\n\n.kookee-message-text--markdown h1 {\n font-size: 1.25em;\n}\n\n.kookee-message-text--markdown h2 {\n font-size: 1.125em;\n}\n\n.kookee-message-text--markdown h3 {\n font-size: 1em;\n}\n\n.kookee-message-text--markdown ul,\n.kookee-message-text--markdown ol {\n margin: 0.25em 0 0.5em;\n padding-left: 1.5em;\n}\n\n.kookee-message-text--markdown ul {\n list-style-type: disc;\n}\n\n.kookee-message-text--markdown ol {\n list-style-type: decimal;\n}\n\n.kookee-message-text--markdown li {\n margin: 0.15em 0;\n display: list-item;\n}\n\n.kookee-message-text--markdown hr {\n border: none;\n border-top: 1px solid var(--kookee-border);\n margin: 0.75em 0;\n}\n\n.kookee-message-text--markdown a {\n color: var(--kookee-primary);\n text-decoration: underline;\n}\n\n.kookee-message-text--markdown a:hover {\n color: var(--kookee-primary-hover);\n}\n\n/* Inline code - Slack-style */\n.kookee-message-text--markdown code:not(pre code) {\n background-color: #f8e8ea;\n color: #c41e3a;\n padding: 0.125rem 0.375rem;\n border-radius: 0.25rem;\n font-family: 'JetBrains Mono', 'Fira Code', ui-monospace, SFMono-Regular, Menlo, Monaco, 'Courier New', monospace;\n font-size: 0.875em;\n border: 1px solid #f0d0d4;\n}\n\n/* Code blocks */\n.kookee-message-text--markdown .kookee-code-block {\n position: relative;\n margin: 0.5rem 0;\n border-radius: 0.5rem;\n overflow: hidden;\n background: #1e1e1e;\n}\n\n.kookee-message-text--markdown .kookee-code-block__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.5rem 0.75rem;\n background: #2d2d2d;\n border-bottom: 1px solid #3d3d3d;\n}\n\n.kookee-message-text--markdown .kookee-code-block__copy {\n font-size: 0.75rem;\n color: #a0a0a0;\n background: transparent;\n border: none;\n cursor: pointer;\n padding: 0.25rem 0.5rem;\n border-radius: 0.25rem;\n font-family: system-ui, -apple-system, sans-serif;\n transition: background-color 0.15s, color 0.15s;\n}\n\n.kookee-message-text--markdown .kookee-code-block__copy:hover {\n background: #3d3d3d;\n color: #d4d4d4;\n}\n\n.kookee-message-text--markdown .kookee-code-block__language {\n font-size: 0.75rem;\n color: #a0a0a0;\n font-family: system-ui, -apple-system, sans-serif;\n}\n\n.kookee-message-text--markdown .kookee-code-block pre {\n margin: 0;\n padding: 0.75rem;\n background: transparent;\n overflow-x: auto;\n line-height: 1.6;\n}\n\n.kookee-message-text--markdown .kookee-code-block pre code {\n display: block;\n background: none;\n font-family: 'JetBrains Mono', 'Fira Code', ui-monospace, SFMono-Regular, Menlo, Monaco, 'Courier New', monospace;\n font-size: 0.8125rem;\n color: #d4d4d4;\n padding: 0;\n border: none;\n}\n\n/* Syntax highlighting — VS Code Dark+ theme */\n.kookee-code-block .hljs-comment,\n.kookee-code-block .hljs-quote {\n color: #6a9955;\n font-style: italic;\n}\n\n.kookee-code-block .hljs-keyword,\n.kookee-code-block .hljs-selector-tag,\n.kookee-code-block .hljs-addition {\n color: #569cd6;\n}\n\n.kookee-code-block .hljs-number,\n.kookee-code-block .hljs-string,\n.kookee-code-block .hljs-meta .hljs-meta-string,\n.kookee-code-block .hljs-literal,\n.kookee-code-block .hljs-doctag,\n.kookee-code-block .hljs-regexp {\n color: #ce9178;\n}\n\n.kookee-code-block .hljs-title,\n.kookee-code-block .hljs-section,\n.kookee-code-block .hljs-name,\n.kookee-code-block .hljs-selector-id,\n.kookee-code-block .hljs-selector-class {\n color: #dcdcaa;\n}\n\n.kookee-code-block .hljs-attribute,\n.kookee-code-block .hljs-attr,\n.kookee-code-block .hljs-variable,\n.kookee-code-block .hljs-template-variable,\n.kookee-code-block .hljs-class .hljs-title,\n.kookee-code-block .hljs-type {\n color: #4ec9b0;\n}\n\n.kookee-code-block .hljs-symbol,\n.kookee-code-block .hljs-bullet,\n.kookee-code-block .hljs-subst,\n.kookee-code-block .hljs-meta,\n.kookee-code-block .hljs-meta .hljs-keyword,\n.kookee-code-block .hljs-selector-attr,\n.kookee-code-block .hljs-selector-pseudo,\n.kookee-code-block .hljs-link {\n color: #d7ba7d;\n}\n\n.kookee-code-block .hljs-built_in,\n.kookee-code-block .hljs-deletion {\n color: #ce9178;\n}\n\n.kookee-code-block .hljs-emphasis {\n font-style: italic;\n}\n\n.kookee-code-block .hljs-strong {\n font-weight: bold;\n}\n\n.kookee-code-block .hljs-property {\n color: #9cdcfe;\n}\n\n.kookee-code-block .hljs-punctuation {\n color: #d4d4d4;\n}\n\n.kookee-code-block .hljs-params {\n color: #d4d4d4;\n}\n\n.kookee-code-block .hljs-template-tag {\n color: #569cd6;\n}\n\n/* ========================================\n Streaming Dots (inline loading indicator)\n ======================================== */\n\n.kookee-streaming-dots {\n display: inline-flex;\n gap: 3px;\n margin-left: 4px;\n vertical-align: middle;\n}\n\n.kookee-streaming-dot {\n width: 5px;\n height: 5px;\n border-radius: 50%;\n background: var(--kookee-text-secondary);\n animation: kookee-streaming-dot-pulse 1.4s ease-in-out infinite;\n}\n\n.kookee-streaming-dot:nth-child(2) {\n animation-delay: 0.2s;\n}\n\n.kookee-streaming-dot:nth-child(3) {\n animation-delay: 0.4s;\n}\n\n@keyframes kookee-streaming-dot-pulse {\n 0%, 80%, 100% {\n opacity: 0.3;\n transform: scale(0.8);\n }\n 40% {\n opacity: 1;\n transform: scale(1);\n }\n}\n\n/* ========================================\n Loading Indicator\n ======================================== */\n\n.kookee-loading-dots {\n display: flex;\n gap: 4px;\n padding: 4px 0;\n}\n\n.kookee-loading-dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--kookee-text-secondary);\n animation: kookee-dot-pulse 1.4s ease-in-out infinite;\n}\n\n.kookee-loading-dot:nth-child(2) {\n animation-delay: 0.2s;\n}\n\n.kookee-loading-dot:nth-child(3) {\n animation-delay: 0.4s;\n}\n\n@keyframes kookee-dot-pulse {\n 0%, 80%, 100% {\n opacity: 0.3;\n transform: scale(0.8);\n }\n 40% {\n opacity: 1;\n transform: scale(1);\n }\n}\n\n/* ========================================\n Sources\n ======================================== */\n\n.kookee-sources {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 4px;\n padding: 0 2px;\n}\n\n.kookee-sources-label {\n font-size: var(--kookee-font-size-sm);\n color: var(--kookee-text-secondary);\n}\n\n.kookee-sources-list {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n}\n\n.kookee-source-link {\n font-size: var(--kookee-font-size-sm);\n color: var(--kookee-primary);\n background: none;\n border: none;\n cursor: default;\n padding: 0;\n font-family: inherit;\n}\n\n.kookee-source-link--clickable {\n cursor: pointer;\n text-decoration: underline;\n text-underline-offset: 2px;\n}\n\n.kookee-source-link--clickable:hover {\n opacity: 0.8;\n}\n\n.kookee-source-link:disabled {\n cursor: default;\n text-decoration: none;\n}\n\n/* ========================================\n Message Actions\n ======================================== */\n\n.kookee-message-actions {\n display: flex;\n gap: 4px;\n padding: 0 2px;\n opacity: 0;\n transition: opacity var(--kookee-transition);\n}\n\n.kookee-message-content:hover .kookee-message-actions {\n opacity: 1;\n}\n\n.kookee-action-button {\n width: 28px;\n height: 28px;\n border-radius: var(--kookee-radius-sm);\n border: 1px solid var(--kookee-border);\n background: var(--kookee-bg);\n color: var(--kookee-text-secondary);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: color var(--kookee-transition), border-color var(--kookee-transition);\n}\n\n.kookee-action-button:hover {\n color: var(--kookee-text);\n border-color: var(--kookee-text-secondary);\n}\n\n/* ========================================\n Suggestions\n ======================================== */\n\n.kookee-suggestions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n padding: 8px 16px 12px;\n}\n\n.kookee-suggestion-pill {\n padding: 6px 14px;\n border-radius: 999px;\n border: 1px solid var(--kookee-border);\n background: var(--kookee-bg);\n color: var(--kookee-text);\n font-size: var(--kookee-font-size-sm);\n font-family: var(--kookee-font);\n cursor: pointer;\n transition: background var(--kookee-transition), border-color var(--kookee-transition);\n white-space: nowrap;\n}\n\n.kookee-suggestion-pill:hover {\n background: var(--kookee-bg-secondary);\n border-color: var(--kookee-text-secondary);\n}\n\n/* ========================================\n Prompt Input\n ======================================== */\n\n.kookee-prompt-input {\n display: flex;\n align-items: flex-end;\n gap: 8px;\n padding: 12px;\n}\n\n.kookee-prompt-textarea {\n flex: 1;\n resize: none;\n border: 1px solid var(--kookee-border);\n border-radius: var(--kookee-radius-sm);\n padding: 8px 12px;\n font-family: var(--kookee-font);\n font-size: var(--kookee-font-size);\n line-height: 1.5;\n color: var(--kookee-text);\n background: var(--kookee-bg);\n outline: none;\n min-height: 38px;\n max-height: 120px;\n transition: border-color var(--kookee-transition);\n}\n\n.kookee-prompt-textarea::placeholder {\n color: var(--kookee-text-secondary);\n}\n\n.kookee-prompt-textarea:focus {\n border-color: var(--kookee-primary);\n}\n\n.kookee-prompt-submit {\n width: 36px;\n height: 36px;\n border-radius: var(--kookee-radius-sm);\n border: none;\n background: var(--kookee-primary);\n color: #ffffff;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: background var(--kookee-transition);\n}\n\n.kookee-prompt-submit:hover:not(:disabled) {\n background: var(--kookee-primary-hover);\n}\n\n.kookee-prompt-submit:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n/* ========================================\n Dark Theme\n ======================================== */\n\n.kookee-dark {\n --kookee-bg: #1f2937;\n --kookee-bg-secondary: #374151;\n --kookee-text: #f9fafb;\n --kookee-text-secondary: #9ca3af;\n --kookee-text-user: #ffffff;\n --kookee-border: #4b5563;\n --kookee-shadow: 0 4px 24px rgba(0, 0, 0, 0.3);\n --kookee-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.2);\n}\n\n@media (prefers-color-scheme: dark) {\n .kookee-auto {\n --kookee-bg: #1f2937;\n --kookee-bg-secondary: #374151;\n --kookee-text: #f9fafb;\n --kookee-text-secondary: #9ca3af;\n --kookee-text-user: #ffffff;\n --kookee-border: #4b5563;\n --kookee-shadow: 0 4px 24px rgba(0, 0, 0, 0.3);\n --kookee-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.2);\n }\n}\n\n/* ========================================\n Mobile Responsive\n ======================================== */\n\n@media (max-width: 640px) {\n .kookee-widget-panel,\n .kookee-widget-panel--expanded {\n width: calc(100vw - 24px);\n max-height: calc(100vh - 100px);\n }\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kookee/react",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.4",
|
|
4
4
|
"description": "Official Kookee React Chat Widget - Embeddable AI-powered support chat",
|
|
5
5
|
"main": "./dist/index.cjs",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -33,13 +33,17 @@
|
|
|
33
33
|
},
|
|
34
34
|
"homepage": "https://kookee.dev",
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"
|
|
36
|
+
"highlight.js": "^11.11.1",
|
|
37
|
+
"marked": "^15.0.6",
|
|
38
|
+
"marked-highlight": "^2.2.1"
|
|
37
39
|
},
|
|
38
40
|
"peerDependencies": {
|
|
41
|
+
"@kookee/sdk": "^0.0.25",
|
|
39
42
|
"react": "^18.0.0 || ^19.0.0",
|
|
40
43
|
"react-dom": "^18.0.0 || ^19.0.0"
|
|
41
44
|
},
|
|
42
45
|
"devDependencies": {
|
|
46
|
+
"@kookee/sdk": "^0.0.25",
|
|
43
47
|
"@types/react": "^19.0.0",
|
|
44
48
|
"@types/react-dom": "^19.0.0",
|
|
45
49
|
"eslint": "^9.17.0",
|