@kookee/react 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +47 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/styles.css +2 -0
- package/dist/styles.css.map +1 -0
- package/dist/styles.d.cts +2 -0
- package/dist/styles.d.ts +2 -0
- package/package.json +59 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +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
|
|
2
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +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"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
interface KookeeChatProviderProps {
|
|
4
|
+
apiKey: string;
|
|
5
|
+
locale?: string;
|
|
6
|
+
children: React.ReactNode;
|
|
7
|
+
}
|
|
8
|
+
interface KookeeChatProps {
|
|
9
|
+
apiKey: string;
|
|
10
|
+
locale?: string;
|
|
11
|
+
suggestions?: string[];
|
|
12
|
+
placeholder?: string;
|
|
13
|
+
greeting?: string;
|
|
14
|
+
}
|
|
15
|
+
interface KookeeChatWidgetProps extends KookeeChatProps {
|
|
16
|
+
position?: 'bottom-right' | 'bottom-left';
|
|
17
|
+
theme?: 'light' | 'dark' | 'auto';
|
|
18
|
+
primaryColor?: string;
|
|
19
|
+
}
|
|
20
|
+
interface ChatMessage {
|
|
21
|
+
id: string;
|
|
22
|
+
role: 'user' | 'assistant';
|
|
23
|
+
content: string;
|
|
24
|
+
sources?: Array<{
|
|
25
|
+
id: string;
|
|
26
|
+
slug: string;
|
|
27
|
+
title: string;
|
|
28
|
+
}>;
|
|
29
|
+
}
|
|
30
|
+
interface KookeeChatContextValue {
|
|
31
|
+
messages: ChatMessage[];
|
|
32
|
+
isLoading: boolean;
|
|
33
|
+
isOpen: boolean;
|
|
34
|
+
sendMessage: (content: string) => Promise<void>;
|
|
35
|
+
open: () => void;
|
|
36
|
+
close: () => void;
|
|
37
|
+
toggle: () => void;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
declare function KookeeChatWidget({ apiKey, locale, position, theme, primaryColor, suggestions, placeholder, greeting, }: KookeeChatWidgetProps): react_jsx_runtime.JSX.Element;
|
|
41
|
+
|
|
42
|
+
declare function KookeeChat({ apiKey, locale, suggestions, placeholder, greeting }: KookeeChatProps): react_jsx_runtime.JSX.Element;
|
|
43
|
+
|
|
44
|
+
declare function KookeeChatProvider({ apiKey, locale, children }: KookeeChatProviderProps): react_jsx_runtime.JSX.Element;
|
|
45
|
+
declare function useKookeeChat(): KookeeChatContextValue;
|
|
46
|
+
|
|
47
|
+
export { KookeeChat, type KookeeChatProps, KookeeChatProvider, type KookeeChatProviderProps, KookeeChatWidget, type KookeeChatWidgetProps, useKookeeChat };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
interface KookeeChatProviderProps {
|
|
4
|
+
apiKey: string;
|
|
5
|
+
locale?: string;
|
|
6
|
+
children: React.ReactNode;
|
|
7
|
+
}
|
|
8
|
+
interface KookeeChatProps {
|
|
9
|
+
apiKey: string;
|
|
10
|
+
locale?: string;
|
|
11
|
+
suggestions?: string[];
|
|
12
|
+
placeholder?: string;
|
|
13
|
+
greeting?: string;
|
|
14
|
+
}
|
|
15
|
+
interface KookeeChatWidgetProps extends KookeeChatProps {
|
|
16
|
+
position?: 'bottom-right' | 'bottom-left';
|
|
17
|
+
theme?: 'light' | 'dark' | 'auto';
|
|
18
|
+
primaryColor?: string;
|
|
19
|
+
}
|
|
20
|
+
interface ChatMessage {
|
|
21
|
+
id: string;
|
|
22
|
+
role: 'user' | 'assistant';
|
|
23
|
+
content: string;
|
|
24
|
+
sources?: Array<{
|
|
25
|
+
id: string;
|
|
26
|
+
slug: string;
|
|
27
|
+
title: string;
|
|
28
|
+
}>;
|
|
29
|
+
}
|
|
30
|
+
interface KookeeChatContextValue {
|
|
31
|
+
messages: ChatMessage[];
|
|
32
|
+
isLoading: boolean;
|
|
33
|
+
isOpen: boolean;
|
|
34
|
+
sendMessage: (content: string) => Promise<void>;
|
|
35
|
+
open: () => void;
|
|
36
|
+
close: () => void;
|
|
37
|
+
toggle: () => void;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
declare function KookeeChatWidget({ apiKey, locale, position, theme, primaryColor, suggestions, placeholder, greeting, }: KookeeChatWidgetProps): react_jsx_runtime.JSX.Element;
|
|
41
|
+
|
|
42
|
+
declare function KookeeChat({ apiKey, locale, suggestions, placeholder, greeting }: KookeeChatProps): react_jsx_runtime.JSX.Element;
|
|
43
|
+
|
|
44
|
+
declare function KookeeChatProvider({ apiKey, locale, children }: KookeeChatProviderProps): react_jsx_runtime.JSX.Element;
|
|
45
|
+
declare function useKookeeChat(): KookeeChatContextValue;
|
|
46
|
+
|
|
47
|
+
export { KookeeChat, type KookeeChatProps, KookeeChatProvider, type KookeeChatProviderProps, KookeeChatWidget, type KookeeChatWidgetProps, useKookeeChat };
|
package/dist/index.js
ADDED
|
@@ -0,0 +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
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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"]}
|
package/dist/styles.css
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
:root{--kookee-primary: #6366f1;--kookee-primary-hover: #4f46e5;--kookee-bg: #ffffff;--kookee-bg-secondary: #f9fafb;--kookee-bg-user: #6366f1;--kookee-text: #111827;--kookee-text-secondary: #6b7280;--kookee-text-user: #ffffff;--kookee-border: #e5e7eb;--kookee-radius: 12px;--kookee-radius-sm: 8px;--kookee-shadow: 0 4px 24px rgba(0, 0, 0, .12);--kookee-shadow-sm: 0 1px 3px rgba(0, 0, 0, .08);--kookee-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;--kookee-font-size: 14px;--kookee-font-size-sm: 12px;--kookee-transition: .2s ease}.kookee-widget{position:fixed;z-index:9999;display:flex;flex-direction:column;align-items:flex-end;gap:12px;font-family:var(--kookee-font);font-size:var(--kookee-font-size);line-height:1.5;color:var(--kookee-text);box-sizing:border-box}.kookee-widget *,.kookee-widget *:before,.kookee-widget *:after{box-sizing:border-box}.kookee-widget-bottom-right{bottom:20px;right:20px}.kookee-widget-bottom-left{bottom:20px;left:20px;align-items:flex-start}.kookee-widget-bubble{width:56px;height:56px;border-radius:50%;border:none;background:var(--kookee-primary);color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;box-shadow:var(--kookee-shadow);transition:background var(--kookee-transition),transform var(--kookee-transition);flex-shrink:0}.kookee-widget-bubble:hover{background:var(--kookee-primary-hover);transform:scale(1.05)}.kookee-widget-bubble:active{transform:scale(.95)}.kookee-widget-panel{width:380px;max-height:520px;background:var(--kookee-bg);border-radius:var(--kookee-radius);box-shadow:var(--kookee-shadow);border:1px solid var(--kookee-border);display:flex;flex-direction:column;overflow:hidden;animation:kookee-slide-up .2s ease}@keyframes kookee-slide-up{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.kookee-widget-header{padding:16px;border-bottom:1px solid var(--kookee-border);font-weight:600;font-size:15px;flex-shrink:0}.kookee-widget-body{flex:1;overflow-y:auto;display:flex;flex-direction:column}.kookee-widget-footer{border-top:1px solid var(--kookee-border);flex-shrink:0}.kookee-chat{display:flex;flex-direction:column;height:100%;font-family:var(--kookee-font);font-size:var(--kookee-font-size);line-height:1.5;color:var(--kookee-text)}.kookee-chat-greeting{padding:24px 16px 8px;font-size:15px;font-weight:500;color:var(--kookee-text);text-align:center}.kookee-message-list{flex:1;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:12px}.kookee-message{display:flex;gap:8px;max-width:85%}.kookee-message-user{align-self:flex-end;flex-direction:row-reverse}.kookee-message-assistant{align-self:flex-start}.kookee-message-avatar{width:28px;height:28px;border-radius:50%;background:var(--kookee-bg-secondary);border:1px solid var(--kookee-border);display:flex;align-items:center;justify-content:center;flex-shrink:0;color:var(--kookee-text-secondary)}.kookee-message-content{display:flex;flex-direction:column;gap:4px;min-width:0}.kookee-message-bubble{padding:10px 14px;border-radius:var(--kookee-radius);word-break:break-word}.kookee-message-user .kookee-message-bubble{background:var(--kookee-bg-user);color:var(--kookee-text-user);border-bottom-right-radius:4px}.kookee-message-assistant .kookee-message-bubble{background:var(--kookee-bg-secondary);color:var(--kookee-text);border:1px solid var(--kookee-border);border-bottom-left-radius:4px}.kookee-message-text{white-space:pre-wrap}.kookee-loading-dots{display:flex;gap:4px;padding:4px 0}.kookee-loading-dot{width:6px;height:6px;border-radius:50%;background:var(--kookee-text-secondary);animation:kookee-dot-pulse 1.4s ease-in-out infinite}.kookee-loading-dot:nth-child(2){animation-delay:.2s}.kookee-loading-dot:nth-child(3){animation-delay:.4s}@keyframes kookee-dot-pulse{0%,80%,to{opacity:.3;transform:scale(.8)}40%{opacity:1;transform:scale(1)}}.kookee-sources{display:flex;flex-wrap:wrap;align-items:center;gap:4px;padding:0 2px}.kookee-sources-label{font-size:var(--kookee-font-size-sm);color:var(--kookee-text-secondary)}.kookee-sources-list{display:flex;flex-wrap:wrap;gap:4px}.kookee-source-link{font-size:var(--kookee-font-size-sm);color:var(--kookee-primary);background:none;border:none;cursor:default;padding:0}.kookee-message-actions{display:flex;gap:4px;padding:0 2px;opacity:0;transition:opacity var(--kookee-transition)}.kookee-message-content:hover .kookee-message-actions{opacity:1}.kookee-action-button{width:28px;height:28px;border-radius:var(--kookee-radius-sm);border:1px solid var(--kookee-border);background:var(--kookee-bg);color:var(--kookee-text-secondary);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:color var(--kookee-transition),border-color var(--kookee-transition)}.kookee-action-button:hover{color:var(--kookee-text);border-color:var(--kookee-text-secondary)}.kookee-suggestions{display:flex;flex-wrap:wrap;gap:8px;padding:8px 16px 12px}.kookee-suggestion-pill{padding:6px 14px;border-radius:999px;border:1px solid var(--kookee-border);background:var(--kookee-bg);color:var(--kookee-text);font-size:var(--kookee-font-size-sm);font-family:var(--kookee-font);cursor:pointer;transition:background var(--kookee-transition),border-color var(--kookee-transition);white-space:nowrap}.kookee-suggestion-pill:hover{background:var(--kookee-bg-secondary);border-color:var(--kookee-text-secondary)}.kookee-prompt-input{display:flex;align-items:flex-end;gap:8px;padding:12px}.kookee-prompt-textarea{flex:1;resize:none;border:1px solid var(--kookee-border);border-radius:var(--kookee-radius-sm);padding:8px 12px;font-family:var(--kookee-font);font-size:var(--kookee-font-size);line-height:1.5;color:var(--kookee-text);background:var(--kookee-bg);outline:none;min-height:38px;max-height:120px;transition:border-color var(--kookee-transition)}.kookee-prompt-textarea::placeholder{color:var(--kookee-text-secondary)}.kookee-prompt-textarea:focus{border-color:var(--kookee-primary)}.kookee-prompt-submit{width:36px;height:36px;border-radius:var(--kookee-radius-sm);border:none;background:var(--kookee-primary);color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:background var(--kookee-transition)}.kookee-prompt-submit:hover:not(:disabled){background:var(--kookee-primary-hover)}.kookee-prompt-submit:disabled{opacity:.4;cursor:not-allowed}.kookee-dark{--kookee-bg: #1f2937;--kookee-bg-secondary: #374151;--kookee-text: #f9fafb;--kookee-text-secondary: #9ca3af;--kookee-text-user: #ffffff;--kookee-border: #4b5563;--kookee-shadow: 0 4px 24px rgba(0, 0, 0, .3);--kookee-shadow-sm: 0 1px 3px rgba(0, 0, 0, .2)}@media(prefers-color-scheme:dark){.kookee-auto{--kookee-bg: #1f2937;--kookee-bg-secondary: #374151;--kookee-text: #f9fafb;--kookee-text-secondary: #9ca3af;--kookee-text-user: #ffffff;--kookee-border: #4b5563;--kookee-shadow: 0 4px 24px rgba(0, 0, 0, .3);--kookee-shadow-sm: 0 1px 3px rgba(0, 0, 0, .2)}}@media(max-width:440px){.kookee-widget-panel{width:calc(100vw - 24px);max-height:calc(100vh - 100px)}}
|
|
2
|
+
/*# sourceMappingURL=styles.css.map */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/styles.css"],"sourcesContent":["/* ========================================\n @kookee/react — Chat Widget Styles\n ======================================== */\n\n/* CSS Custom Properties */\n:root {\n --kookee-primary: #6366f1;\n --kookee-primary-hover: #4f46e5;\n --kookee-bg: #ffffff;\n --kookee-bg-secondary: #f9fafb;\n --kookee-bg-user: #6366f1;\n --kookee-text: #111827;\n --kookee-text-secondary: #6b7280;\n --kookee-text-user: #ffffff;\n --kookee-border: #e5e7eb;\n --kookee-radius: 12px;\n --kookee-radius-sm: 8px;\n --kookee-shadow: 0 4px 24px rgba(0, 0, 0, 0.12);\n --kookee-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.08);\n --kookee-font: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n --kookee-font-size: 14px;\n --kookee-font-size-sm: 12px;\n --kookee-transition: 200ms ease;\n}\n\n/* ========================================\n Widget Container (floating)\n ======================================== */\n\n.kookee-widget {\n position: fixed;\n z-index: 9999;\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 12px;\n font-family: var(--kookee-font);\n font-size: var(--kookee-font-size);\n line-height: 1.5;\n color: var(--kookee-text);\n box-sizing: border-box;\n}\n\n.kookee-widget *,\n.kookee-widget *::before,\n.kookee-widget *::after {\n box-sizing: border-box;\n}\n\n.kookee-widget-bottom-right {\n bottom: 20px;\n right: 20px;\n}\n\n.kookee-widget-bottom-left {\n bottom: 20px;\n left: 20px;\n align-items: flex-start;\n}\n\n/* ========================================\n Chat Bubble Button\n ======================================== */\n\n.kookee-widget-bubble {\n width: 56px;\n height: 56px;\n border-radius: 50%;\n border: none;\n background: var(--kookee-primary);\n color: #ffffff;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: var(--kookee-shadow);\n transition: background var(--kookee-transition), transform var(--kookee-transition);\n flex-shrink: 0;\n}\n\n.kookee-widget-bubble:hover {\n background: var(--kookee-primary-hover);\n transform: scale(1.05);\n}\n\n.kookee-widget-bubble:active {\n transform: scale(0.95);\n}\n\n/* ========================================\n Chat Panel (floating widget)\n ======================================== */\n\n.kookee-widget-panel {\n width: 380px;\n max-height: 520px;\n background: var(--kookee-bg);\n border-radius: var(--kookee-radius);\n box-shadow: var(--kookee-shadow);\n border: 1px solid var(--kookee-border);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n animation: kookee-slide-up 200ms ease;\n}\n\n@keyframes kookee-slide-up {\n from {\n opacity: 0;\n transform: translateY(8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.kookee-widget-header {\n padding: 16px;\n border-bottom: 1px solid var(--kookee-border);\n font-weight: 600;\n font-size: 15px;\n flex-shrink: 0;\n}\n\n.kookee-widget-body {\n flex: 1;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n}\n\n.kookee-widget-footer {\n border-top: 1px solid var(--kookee-border);\n flex-shrink: 0;\n}\n\n/* ========================================\n Inline Chat Container\n ======================================== */\n\n.kookee-chat {\n display: flex;\n flex-direction: column;\n height: 100%;\n font-family: var(--kookee-font);\n font-size: var(--kookee-font-size);\n line-height: 1.5;\n color: var(--kookee-text);\n}\n\n/* ========================================\n Greeting\n ======================================== */\n\n.kookee-chat-greeting {\n padding: 24px 16px 8px;\n font-size: 15px;\n font-weight: 500;\n color: var(--kookee-text);\n text-align: center;\n}\n\n/* ========================================\n Message List\n ======================================== */\n\n.kookee-message-list {\n flex: 1;\n overflow-y: auto;\n padding: 12px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n/* ========================================\n Message\n ======================================== */\n\n.kookee-message {\n display: flex;\n gap: 8px;\n max-width: 85%;\n}\n\n.kookee-message-user {\n align-self: flex-end;\n flex-direction: row-reverse;\n}\n\n.kookee-message-assistant {\n align-self: flex-start;\n}\n\n.kookee-message-avatar {\n width: 28px;\n height: 28px;\n border-radius: 50%;\n background: var(--kookee-bg-secondary);\n border: 1px solid var(--kookee-border);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: var(--kookee-text-secondary);\n}\n\n.kookee-message-content {\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 0;\n}\n\n.kookee-message-bubble {\n padding: 10px 14px;\n border-radius: var(--kookee-radius);\n word-break: break-word;\n}\n\n.kookee-message-user .kookee-message-bubble {\n background: var(--kookee-bg-user);\n color: var(--kookee-text-user);\n border-bottom-right-radius: 4px;\n}\n\n.kookee-message-assistant .kookee-message-bubble {\n background: var(--kookee-bg-secondary);\n color: var(--kookee-text);\n border: 1px solid var(--kookee-border);\n border-bottom-left-radius: 4px;\n}\n\n.kookee-message-text {\n white-space: pre-wrap;\n}\n\n/* ========================================\n Loading Indicator\n ======================================== */\n\n.kookee-loading-dots {\n display: flex;\n gap: 4px;\n padding: 4px 0;\n}\n\n.kookee-loading-dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--kookee-text-secondary);\n animation: kookee-dot-pulse 1.4s ease-in-out infinite;\n}\n\n.kookee-loading-dot:nth-child(2) {\n animation-delay: 0.2s;\n}\n\n.kookee-loading-dot:nth-child(3) {\n animation-delay: 0.4s;\n}\n\n@keyframes kookee-dot-pulse {\n 0%, 80%, 100% {\n opacity: 0.3;\n transform: scale(0.8);\n }\n 40% {\n opacity: 1;\n transform: scale(1);\n }\n}\n\n/* ========================================\n Sources\n ======================================== */\n\n.kookee-sources {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 4px;\n padding: 0 2px;\n}\n\n.kookee-sources-label {\n font-size: var(--kookee-font-size-sm);\n color: var(--kookee-text-secondary);\n}\n\n.kookee-sources-list {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n}\n\n.kookee-source-link {\n font-size: var(--kookee-font-size-sm);\n color: var(--kookee-primary);\n background: none;\n border: none;\n cursor: default;\n padding: 0;\n}\n\n/* ========================================\n Message Actions\n ======================================== */\n\n.kookee-message-actions {\n display: flex;\n gap: 4px;\n padding: 0 2px;\n opacity: 0;\n transition: opacity var(--kookee-transition);\n}\n\n.kookee-message-content:hover .kookee-message-actions {\n opacity: 1;\n}\n\n.kookee-action-button {\n width: 28px;\n height: 28px;\n border-radius: var(--kookee-radius-sm);\n border: 1px solid var(--kookee-border);\n background: var(--kookee-bg);\n color: var(--kookee-text-secondary);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: color var(--kookee-transition), border-color var(--kookee-transition);\n}\n\n.kookee-action-button:hover {\n color: var(--kookee-text);\n border-color: var(--kookee-text-secondary);\n}\n\n/* ========================================\n Suggestions\n ======================================== */\n\n.kookee-suggestions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n padding: 8px 16px 12px;\n}\n\n.kookee-suggestion-pill {\n padding: 6px 14px;\n border-radius: 999px;\n border: 1px solid var(--kookee-border);\n background: var(--kookee-bg);\n color: var(--kookee-text);\n font-size: var(--kookee-font-size-sm);\n font-family: var(--kookee-font);\n cursor: pointer;\n transition: background var(--kookee-transition), border-color var(--kookee-transition);\n white-space: nowrap;\n}\n\n.kookee-suggestion-pill:hover {\n background: var(--kookee-bg-secondary);\n border-color: var(--kookee-text-secondary);\n}\n\n/* ========================================\n Prompt Input\n ======================================== */\n\n.kookee-prompt-input {\n display: flex;\n align-items: flex-end;\n gap: 8px;\n padding: 12px;\n}\n\n.kookee-prompt-textarea {\n flex: 1;\n resize: none;\n border: 1px solid var(--kookee-border);\n border-radius: var(--kookee-radius-sm);\n padding: 8px 12px;\n font-family: var(--kookee-font);\n font-size: var(--kookee-font-size);\n line-height: 1.5;\n color: var(--kookee-text);\n background: var(--kookee-bg);\n outline: none;\n min-height: 38px;\n max-height: 120px;\n transition: border-color var(--kookee-transition);\n}\n\n.kookee-prompt-textarea::placeholder {\n color: var(--kookee-text-secondary);\n}\n\n.kookee-prompt-textarea:focus {\n border-color: var(--kookee-primary);\n}\n\n.kookee-prompt-submit {\n width: 36px;\n height: 36px;\n border-radius: var(--kookee-radius-sm);\n border: none;\n background: var(--kookee-primary);\n color: #ffffff;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: background var(--kookee-transition);\n}\n\n.kookee-prompt-submit:hover:not(:disabled) {\n background: var(--kookee-primary-hover);\n}\n\n.kookee-prompt-submit:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n/* ========================================\n Dark Theme\n ======================================== */\n\n.kookee-dark {\n --kookee-bg: #1f2937;\n --kookee-bg-secondary: #374151;\n --kookee-text: #f9fafb;\n --kookee-text-secondary: #9ca3af;\n --kookee-text-user: #ffffff;\n --kookee-border: #4b5563;\n --kookee-shadow: 0 4px 24px rgba(0, 0, 0, 0.3);\n --kookee-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.2);\n}\n\n@media (prefers-color-scheme: dark) {\n .kookee-auto {\n --kookee-bg: #1f2937;\n --kookee-bg-secondary: #374151;\n --kookee-text: #f9fafb;\n --kookee-text-secondary: #9ca3af;\n --kookee-text-user: #ffffff;\n --kookee-border: #4b5563;\n --kookee-shadow: 0 4px 24px rgba(0, 0, 0, 0.3);\n --kookee-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.2);\n }\n}\n\n/* ========================================\n Mobile Responsive\n ======================================== */\n\n@media (max-width: 440px) {\n .kookee-widget-panel {\n width: calc(100vw - 24px);\n max-height: calc(100vh - 100px);\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/styles.d.ts
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@kookee/react",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Official Kookee React Chat Widget - Embeddable AI-powered support chat",
|
|
5
|
+
"main": "./dist/index.cjs",
|
|
6
|
+
"module": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"require": "./dist/index.cjs"
|
|
13
|
+
},
|
|
14
|
+
"./styles.css": "./dist/styles.css"
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist",
|
|
18
|
+
"README.md"
|
|
19
|
+
],
|
|
20
|
+
"keywords": [
|
|
21
|
+
"kookee",
|
|
22
|
+
"react",
|
|
23
|
+
"chat-widget",
|
|
24
|
+
"ai",
|
|
25
|
+
"help-center",
|
|
26
|
+
"support"
|
|
27
|
+
],
|
|
28
|
+
"author": "",
|
|
29
|
+
"license": "MIT",
|
|
30
|
+
"repository": {
|
|
31
|
+
"type": "git",
|
|
32
|
+
"url": "https://github.com/kookee-dot-dev/kookee-react"
|
|
33
|
+
},
|
|
34
|
+
"homepage": "https://kookee.dev",
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"@kookee/sdk": "^0.0.22"
|
|
37
|
+
},
|
|
38
|
+
"peerDependencies": {
|
|
39
|
+
"react": "^18.0.0 || ^19.0.0",
|
|
40
|
+
"react-dom": "^18.0.0 || ^19.0.0"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@types/react": "^19.0.0",
|
|
44
|
+
"@types/react-dom": "^19.0.0",
|
|
45
|
+
"eslint": "^9.17.0",
|
|
46
|
+
"tsup": "^8.3.5",
|
|
47
|
+
"typescript": "^5.7.2",
|
|
48
|
+
"typescript-eslint": "^8.18.2"
|
|
49
|
+
},
|
|
50
|
+
"publishConfig": {
|
|
51
|
+
"access": "public"
|
|
52
|
+
},
|
|
53
|
+
"type": "module",
|
|
54
|
+
"scripts": {
|
|
55
|
+
"build": "tsup",
|
|
56
|
+
"dev": "tsup --watch",
|
|
57
|
+
"lint": "tsc --noEmit && eslint ."
|
|
58
|
+
}
|
|
59
|
+
}
|