@kookee/react 0.0.1 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,137 @@
1
+ # @kookee/react
2
+
3
+ Official React chat widget for [Kookee](https://kookee.dev) - AI-powered support chat using your help center articles.
4
+
5
+ ## Features
6
+
7
+ - **AI Chat** - Answers questions using your help center content via RAG
8
+ - **Lightweight** - Small bundle, React as peer dependency
9
+ - **Two Modes** - Floating widget (Intercom-like) or inline chat component
10
+ - **Themeable** - Light, dark, auto themes with CSS variable customization
11
+ - **TypeScript-first** - Full type definitions out of the box
12
+ - **Open source** - [MIT licensed](https://github.com/kookee-dot-dev/kookee-react)
13
+
14
+ ## Installation
15
+
16
+ ```bash
17
+ npm install @kookee/react
18
+ # or
19
+ pnpm add @kookee/react
20
+ # or
21
+ yarn add @kookee/react
22
+ ```
23
+
24
+ Don't forget to import the styles:
25
+
26
+ ```typescript
27
+ import '@kookee/react/styles.css';
28
+ ```
29
+
30
+ ## Quick Start
31
+
32
+ ### Floating Widget (Intercom-like)
33
+
34
+ ```tsx
35
+ import { KookeeChatWidget } from '@kookee/react';
36
+ import '@kookee/react/styles.css';
37
+
38
+ function App() {
39
+ return (
40
+ <>
41
+ {/* Your app */}
42
+ <KookeeChatWidget
43
+ apiKey="your-api-key"
44
+ position="bottom-right"
45
+ theme="auto"
46
+ primaryColor="#6366f1"
47
+ greeting="Hi! How can I help?"
48
+ placeholder="Ask a question..."
49
+ suggestions={['How do I get started?', 'What are the pricing plans?']}
50
+ />
51
+ </>
52
+ );
53
+ }
54
+ ```
55
+
56
+ ### Inline Chat
57
+
58
+ ```tsx
59
+ import { KookeeChat } from '@kookee/react';
60
+ import '@kookee/react/styles.css';
61
+
62
+ function SupportPage() {
63
+ return (
64
+ <div style={{ height: 500 }}>
65
+ <KookeeChat
66
+ apiKey="your-api-key"
67
+ locale="en"
68
+ suggestions={['How do I get started?']}
69
+ />
70
+ </div>
71
+ );
72
+ }
73
+ ```
74
+
75
+ ## Components
76
+
77
+ ### `KookeeChatWidget`
78
+
79
+ Floating bubble + chat panel. Props:
80
+
81
+ | Prop | Type | Default | Description |
82
+ |---|---|---|---|
83
+ | `apiKey` | `string` | required | Your Kookee API key |
84
+ | `position` | `'bottom-right' \| 'bottom-left'` | `'bottom-right'` | Widget position |
85
+ | `theme` | `'light' \| 'dark' \| 'auto'` | `'light'` | Color theme |
86
+ | `primaryColor` | `string` | `#6366f1` | Accent color |
87
+ | `greeting` | `string` | — | Welcome message |
88
+ | `placeholder` | `string` | `'Ask a question...'` | Input placeholder |
89
+ | `locale` | `string` | — | Locale for responses |
90
+ | `suggestions` | `string[]` | — | Quick-start suggestion pills |
91
+
92
+ ### `KookeeChat`
93
+
94
+ Inline chat component (renders in parent container). Same props as above except `position` and `theme`.
95
+
96
+ ### `KookeeChatProvider` + `useKookeeChat`
97
+
98
+ For advanced usage with custom layouts:
99
+
100
+ ```tsx
101
+ import { KookeeChatProvider, useKookeeChat } from '@kookee/react';
102
+
103
+ function CustomChat() {
104
+ const { messages, isLoading, sendMessage, isOpen, toggle } = useKookeeChat();
105
+ // Build your own UI
106
+ }
107
+
108
+ function App() {
109
+ return (
110
+ <KookeeChatProvider apiKey="your-api-key">
111
+ <CustomChat />
112
+ </KookeeChatProvider>
113
+ );
114
+ }
115
+ ```
116
+
117
+ ## Theming
118
+
119
+ Customize via CSS variables:
120
+
121
+ ```css
122
+ :root {
123
+ --kookee-primary: #6366f1;
124
+ --kookee-primary-hover: #4f46e5;
125
+ --kookee-bg: #ffffff;
126
+ --kookee-bg-secondary: #f9fafb;
127
+ --kookee-text: #111827;
128
+ --kookee-text-secondary: #6b7280;
129
+ --kookee-border: #e5e7eb;
130
+ --kookee-radius: 12px;
131
+ --kookee-font-size: 14px;
132
+ }
133
+ ```
134
+
135
+ ## License
136
+
137
+ MIT
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');var U=react.createContext(null);function f({clientOptions: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(e)),r.current),[e]),A=react.useCallback(async K=>{let D={id:crypto.randomUUID(),role:"user",content:K};n(m=>[...m,D]),d(true);try{let m=V(),x=[...s,D].map(C=>({role:C.role,content:C.content})),H=await m.help.chat({messages:x,locale:o}),X={id:crypto.randomUUID(),role:"assistant",content:H.message,sources:H.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),[]),O=react.useCallback(()=>g(K=>!K),[]),Q=react.useMemo(()=>({messages:s,isLoading:a,isOpen:p,sendMessage:A,open:B,close:E,toggle:O}),[s,a,p,A,B,E,O]);return jsxRuntime.jsx(U.Provider,{value:Q,children:t})}function k(){let e=react.useContext(U);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({clientOptions: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,{clientOptions: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({clientOptions:e,locale:o,suggestions:t,placeholder:s,greeting:n}){return jsxRuntime.jsx(f,{clientOptions: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
2
2
  //# sourceMappingURL=index.cjs.map
@@ -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/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","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({ clientOptions, 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(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 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 clientOptions,\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 clientOptions={clientOptions} 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, 'clientOptions' | '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({ clientOptions, locale, suggestions, placeholder, greeting }: KookeeChatProps) {\n return (\n <KookeeChatProvider clientOptions={clientOptions} locale={locale}>\n <ChatInner suggestions={suggestions} placeholder={placeholder} greeting={greeting} />\n </KookeeChatProvider>\n );\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -1,12 +1,13 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { KookeeConfig } from '@kookee/sdk';
2
3
 
3
4
  interface KookeeChatProviderProps {
4
- apiKey: string;
5
+ clientOptions: KookeeConfig;
5
6
  locale?: string;
6
7
  children: React.ReactNode;
7
8
  }
8
9
  interface KookeeChatProps {
9
- apiKey: string;
10
+ clientOptions: KookeeConfig;
10
11
  locale?: string;
11
12
  suggestions?: string[];
12
13
  placeholder?: string;
@@ -37,11 +38,11 @@ interface KookeeChatContextValue {
37
38
  toggle: () => void;
38
39
  }
39
40
 
40
- declare function KookeeChatWidget({ apiKey, locale, position, theme, primaryColor, suggestions, placeholder, greeting, }: KookeeChatWidgetProps): react_jsx_runtime.JSX.Element;
41
+ declare function KookeeChatWidget({ clientOptions, locale, position, theme, primaryColor, suggestions, placeholder, greeting, }: KookeeChatWidgetProps): react_jsx_runtime.JSX.Element;
41
42
 
42
- declare function KookeeChat({ apiKey, locale, suggestions, placeholder, greeting }: KookeeChatProps): react_jsx_runtime.JSX.Element;
43
+ declare function KookeeChat({ clientOptions, locale, suggestions, placeholder, greeting }: KookeeChatProps): react_jsx_runtime.JSX.Element;
43
44
 
44
- declare function KookeeChatProvider({ apiKey, locale, children }: KookeeChatProviderProps): react_jsx_runtime.JSX.Element;
45
+ declare function KookeeChatProvider({ clientOptions, locale, children }: KookeeChatProviderProps): react_jsx_runtime.JSX.Element;
45
46
  declare function useKookeeChat(): KookeeChatContextValue;
46
47
 
47
48
  export { KookeeChat, type KookeeChatProps, KookeeChatProvider, type KookeeChatProviderProps, KookeeChatWidget, type KookeeChatWidgetProps, useKookeeChat };
package/dist/index.d.ts CHANGED
@@ -1,12 +1,13 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { KookeeConfig } from '@kookee/sdk';
2
3
 
3
4
  interface KookeeChatProviderProps {
4
- apiKey: string;
5
+ clientOptions: KookeeConfig;
5
6
  locale?: string;
6
7
  children: React.ReactNode;
7
8
  }
8
9
  interface KookeeChatProps {
9
- apiKey: string;
10
+ clientOptions: KookeeConfig;
10
11
  locale?: string;
11
12
  suggestions?: string[];
12
13
  placeholder?: string;
@@ -37,11 +38,11 @@ interface KookeeChatContextValue {
37
38
  toggle: () => void;
38
39
  }
39
40
 
40
- declare function KookeeChatWidget({ apiKey, locale, position, theme, primaryColor, suggestions, placeholder, greeting, }: KookeeChatWidgetProps): react_jsx_runtime.JSX.Element;
41
+ declare function KookeeChatWidget({ clientOptions, locale, position, theme, primaryColor, suggestions, placeholder, greeting, }: KookeeChatWidgetProps): react_jsx_runtime.JSX.Element;
41
42
 
42
- declare function KookeeChat({ apiKey, locale, suggestions, placeholder, greeting }: KookeeChatProps): react_jsx_runtime.JSX.Element;
43
+ declare function KookeeChat({ clientOptions, locale, suggestions, placeholder, greeting }: KookeeChatProps): react_jsx_runtime.JSX.Element;
43
44
 
44
- declare function KookeeChatProvider({ apiKey, locale, children }: KookeeChatProviderProps): react_jsx_runtime.JSX.Element;
45
+ declare function KookeeChatProvider({ clientOptions, locale, children }: KookeeChatProviderProps): react_jsx_runtime.JSX.Element;
45
46
  declare function useKookeeChat(): KookeeChatContextValue;
46
47
 
47
48
  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}from'react/jsx-runtime';var U=createContext(null);function f({clientOptions: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(e)),r.current),[e]),A=useCallback(async K=>{let D={id:crypto.randomUUID(),role:"user",content:K};n(m=>[...m,D]),d(true);try{let m=V(),x=[...s,D].map(C=>({role:C.role,content:C.content})),H=await m.help.chat({messages:x,locale:o}),X={id:crypto.randomUUID(),role:"assistant",content:H.message,sources:H.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),[]),O=useCallback(()=>g(K=>!K),[]),Q=useMemo(()=>({messages:s,isLoading:a,isOpen:p,sendMessage:A,open:B,close:E,toggle:O}),[s,a,p,A,B,E,O]);return jsx(U.Provider,{value:Q,children:t})}function k(){let e=useContext(U);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({clientOptions: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,{clientOptions: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({clientOptions:e,locale:o,suggestions:t,placeholder:s,greeting:n}){return jsx(f,{clientOptions: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
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/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","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({ clientOptions, 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(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 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 clientOptions,\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 clientOptions={clientOptions} 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, 'clientOptions' | '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({ clientOptions, locale, suggestions, placeholder, greeting }: KookeeChatProps) {\n return (\n <KookeeChatProvider clientOptions={clientOptions} locale={locale}>\n <ChatInner suggestions={suggestions} placeholder={placeholder} greeting={greeting} />\n </KookeeChatProvider>\n );\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kookee/react",
3
- "version": "0.0.1",
3
+ "version": "0.0.3",
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",