@cas0570/chat-widget 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/README.md +367 -0
- package/dist/components/ChatBubble.d.ts +8 -0
- package/dist/components/ChatWidget.d.ts +3 -0
- package/dist/components/ChatWindow.d.ts +18 -0
- package/dist/components/Icons.d.ts +26 -0
- package/dist/components/MarkdownRenderer.d.ts +6 -0
- package/dist/components/MessageInput.d.ts +8 -0
- package/dist/components/MessageList.d.ts +9 -0
- package/dist/components/PopoutWindow.d.ts +25 -0
- package/dist/components/ToggleButton.d.ts +9 -0
- package/dist/components/TypingIndicator.d.ts +1 -0
- package/dist/components/__tests__/ChatBubble.test.d.ts +1 -0
- package/dist/components/__tests__/ChatWidget.test.d.ts +1 -0
- package/dist/components/__tests__/ChatWindow.test.d.ts +1 -0
- package/dist/components/__tests__/Icons.test.d.ts +1 -0
- package/dist/components/__tests__/MarkdownRenderer.test.d.ts +1 -0
- package/dist/components/__tests__/MessageInput.test.d.ts +1 -0
- package/dist/components/__tests__/MessageList.test.d.ts +1 -0
- package/dist/components/__tests__/PopoutWindow.test.d.ts +1 -0
- package/dist/components/__tests__/ToggleButton.test.d.ts +1 -0
- package/dist/components/__tests__/TypingIndicator.test.d.ts +1 -0
- package/dist/components/__tests__/index.test.d.ts +1 -0
- package/dist/components/index.d.ts +9 -0
- package/dist/embed.d.ts +17 -0
- package/dist/geoapps-chat-widget.js +1471 -0
- package/dist/geoapps-chat-widget.umd.cjs +597 -0
- package/dist/hooks/__tests__/useChat.test.d.ts +1 -0
- package/dist/hooks/useChat.d.ts +17 -0
- package/dist/index.d.ts +9 -0
- package/dist/main.d.ts +1 -0
- package/dist/style.css +1 -0
- package/dist/test/setup.d.ts +1 -0
- package/dist/types.d.ts +70 -0
- package/dist/utils/__tests__/chatPersistence.test.d.ts +1 -0
- package/dist/utils/chatPersistence.d.ts +44 -0
- package/dist/utils/index.d.ts +1 -0
- package/package.json +80 -0
package/dist/style.css
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--gcw-color-white: #fff;--gcw-color-gray-50: #f9fafb;--gcw-color-gray-100: #f3f4f6;--gcw-color-gray-200: #e5e7eb;--gcw-color-gray-300: #d1d5db;--gcw-color-gray-400: #9ca3af;--gcw-color-gray-500: #6b7280;--gcw-color-gray-600: #4b5563;--gcw-color-gray-700: #374151;--gcw-color-gray-800: #1f2937;--gcw-color-gray-900: #111827;--gcw-color-primary: #3b82f6;--gcw-color-primary-hover: #2563eb;--gcw-color-primary-light: #eff6ff;--gcw-color-error: #ef4444;--gcw-color-success: #22c55e;--gcw-font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;--gcw-font-size-xs: .625rem;--gcw-font-size-sm: .75rem;--gcw-font-size-base: .875rem;--gcw-font-size-lg: 1rem;--gcw-spacing-1: .25rem;--gcw-spacing-2: .5rem;--gcw-spacing-3: .75rem;--gcw-spacing-4: 1rem;--gcw-spacing-5: 1.25rem;--gcw-spacing-6: 1.5rem;--gcw-radius-sm: .25rem;--gcw-radius-md: .5rem;--gcw-radius-lg: .75rem;--gcw-radius-xl: 1rem;--gcw-radius-2xl: 1.25rem;--gcw-radius-full: 9999px;--gcw-shadow-sm: 0 1px 2px 0 rgb(0 0 0 / .05);--gcw-shadow-md: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--gcw-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--gcw-shadow-xl: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--gcw-shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / .25);--gcw-transition-fast: .15s ease;--gcw-transition-base: .2s ease;--gcw-transition-slow: .3s ease;--gcw-z-widget: 9999}.gcw-widget,.gcw-widget *,.gcw-widget *:before,.gcw-widget *:after{box-sizing:border-box;margin:0;padding:0;font-family:var(--gcw-font-family);line-height:1.5}.gcw-widget{font-family:var(--gcw-font-family);font-size:var(--gcw-font-size-base);line-height:1.5;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:var(--gcw-color-gray-800);text-align:left;letter-spacing:normal;word-spacing:normal;text-transform:none;text-indent:0;text-shadow:none;font-weight:400;font-style:normal}.gcw-container{position:fixed;z-index:var(--gcw-z-widget);display:flex;flex-direction:column;align-items:flex-end;gap:var(--gcw-spacing-4)}.gcw-container--bottom-right{right:var(--gcw-spacing-4);bottom:var(--gcw-spacing-4)}.gcw-container--bottom-left{left:var(--gcw-spacing-4);bottom:var(--gcw-spacing-4)}.gcw-container--top-right{right:var(--gcw-spacing-4);top:var(--gcw-spacing-4)}.gcw-container--top-left{left:var(--gcw-spacing-4);top:var(--gcw-spacing-4)}.gcw-toggle{position:relative;width:3.5rem;height:3.5rem;border:none;border-radius:var(--gcw-radius-full);background-color:var(--gcw-color-primary);color:var(--gcw-color-white);cursor:pointer;display:flex;align-items:center;justify-content:center;box-shadow:var(--gcw-shadow-lg);transition:transform var(--gcw-transition-base),box-shadow var(--gcw-transition-base)}.gcw-toggle:hover{transform:scale(1.1);box-shadow:var(--gcw-shadow-xl)}.gcw-toggle:active{transform:scale(.95)}.gcw-toggle__icon{width:1.5rem;height:1.5rem;transition:transform var(--gcw-transition-slow)}.gcw-toggle__badge{position:absolute;top:-.25rem;right:-.25rem;width:1rem;height:1rem;border-radius:var(--gcw-radius-full);display:flex;align-items:center;justify-content:center;font-size:var(--gcw-font-size-xs);font-weight:700;animation:gcw-pulse 2s infinite}.gcw-toggle__badge--unread{background-color:var(--gcw-color-error);color:var(--gcw-color-white)}.gcw-toggle__badge--popout{background-color:var(--gcw-color-success)}.gcw-window{display:flex;flex-direction:column;background-color:var(--gcw-color-white);border-radius:var(--gcw-radius-2xl);box-shadow:var(--gcw-shadow-2xl);border:1px solid var(--gcw-color-gray-200);overflow:hidden;animation:gcw-slide-up var(--gcw-transition-slow) ease-out}.gcw-window--small{width:320px;height:450px}.gcw-window--medium{width:380px;height:560px}.gcw-window--large{width:480px;height:680px}.gcw-window--fullscreen{width:calc(100vw - 2rem);height:calc(100vh - 6rem);max-width:56rem}.gcw-window{max-height:90vh;transition:width var(--gcw-transition-base),height var(--gcw-transition-base)}.gcw-header{display:flex;align-items:center;justify-content:space-between;padding:var(--gcw-spacing-3) var(--gcw-spacing-4);color:var(--gcw-color-white);flex-shrink:0}.gcw-header__left{display:flex;align-items:center;gap:var(--gcw-spacing-3)}.gcw-header__avatar{width:2.5rem;height:2.5rem;border-radius:var(--gcw-radius-full);background-color:#fff3;display:flex;align-items:center;justify-content:center}.gcw-header__avatar-icon{width:1.25rem;height:1.25rem}.gcw-header__info{display:flex;flex-direction:column;min-width:0;flex:1}.gcw-header__title{font-size:var(--gcw-font-size-base);font-weight:600;line-height:1.4;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.gcw-header__subtitle{font-size:var(--gcw-font-size-sm);font-weight:400;line-height:1.4;opacity:.9;margin:0;word-wrap:break-word;overflow-wrap:break-word}.gcw-header__actions{display:flex;align-items:center;gap:.125rem}.gcw-header__btn{width:2rem;height:2rem;border:none;border-radius:var(--gcw-radius-full);background-color:transparent;color:inherit;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background-color var(--gcw-transition-fast)}.gcw-header__btn:hover{background-color:#fff3}.gcw-header__btn-icon{width:1rem;height:1rem}.gcw-messages{flex:1;overflow-y:auto;padding:var(--gcw-spacing-4);display:flex;flex-direction:column;gap:var(--gcw-spacing-4)}.gcw-messages::-webkit-scrollbar{width:6px}.gcw-messages::-webkit-scrollbar-track{background:transparent}.gcw-messages::-webkit-scrollbar-thumb{background-color:var(--gcw-color-gray-300);border-radius:3px}.gcw-messages::-webkit-scrollbar-thumb:hover{background-color:var(--gcw-color-gray-400)}.gcw-empty{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--gcw-spacing-6);color:var(--gcw-color-gray-400);text-align:center}.gcw-empty__icon{width:4rem;height:4rem;margin-bottom:var(--gcw-spacing-4);opacity:.5}.gcw-empty__text{font-size:var(--gcw-font-size-base);font-weight:400;line-height:1.5;margin:0}.gcw-bubble-row{display:flex}.gcw-bubble-row--user{justify-content:flex-end}.gcw-bubble-row--assistant{justify-content:flex-start}.gcw-bubble-wrapper{max-width:85%;display:flex;flex-direction:column}.gcw-bubble-wrapper--user{align-items:flex-end}.gcw-bubble-wrapper--assistant{align-items:flex-start}.gcw-bubble{padding:var(--gcw-spacing-2) var(--gcw-spacing-4);border-radius:var(--gcw-radius-2xl);font-size:var(--gcw-font-size-base);font-weight:400;line-height:1.6;letter-spacing:normal;word-wrap:break-word}.gcw-bubble--user{color:var(--gcw-color-white);border-bottom-right-radius:var(--gcw-radius-sm)}.gcw-bubble--assistant{background-color:var(--gcw-color-gray-100);color:var(--gcw-color-gray-800);border-bottom-left-radius:var(--gcw-radius-sm)}.gcw-bubble__timestamp{font-size:var(--gcw-font-size-xs);color:var(--gcw-color-gray-400);margin-top:var(--gcw-spacing-1);padding:0 var(--gcw-spacing-1)}.gcw-content p{margin-bottom:var(--gcw-spacing-2)}.gcw-content p:last-child{margin-bottom:0}.gcw-content strong{font-weight:600}.gcw-content em{font-style:italic}.gcw-content ul,.gcw-content ol{margin:var(--gcw-spacing-2) 0;padding-left:var(--gcw-spacing-6)}.gcw-content li{margin-bottom:var(--gcw-spacing-1)}.gcw-content code{background-color:#0000001a;padding:.125rem .375rem;border-radius:var(--gcw-radius-sm);font-size:.875em;font-family:SF Mono,Monaco,Consolas,monospace}.gcw-bubble--user .gcw-content code{background-color:#fff3}.gcw-content pre{background-color:var(--gcw-color-gray-800);color:var(--gcw-color-gray-100);padding:var(--gcw-spacing-3);border-radius:var(--gcw-radius-md);overflow-x:auto;margin:var(--gcw-spacing-2) 0}.gcw-content pre code{background-color:transparent;padding:0;font-size:var(--gcw-font-size-sm)}.gcw-content a{color:var(--gcw-color-primary);text-decoration:underline}.gcw-content a:hover{color:var(--gcw-color-primary-hover)}.gcw-bubble--user .gcw-content a{color:#ffffffe6}.gcw-md-heading{font-weight:600;margin-top:var(--gcw-spacing-3);margin-bottom:var(--gcw-spacing-1)}.gcw-md-heading--h2{font-size:var(--gcw-font-size-lg);font-weight:700}.gcw-md-heading--h3,.gcw-md-heading--h4{font-size:var(--gcw-font-size-base)}.gcw-md-heading--h5{font-size:var(--gcw-font-size-sm)}.gcw-md-paragraph{margin-bottom:var(--gcw-spacing-2)}.gcw-md-paragraph:last-child{margin-bottom:0}.gcw-md-list{margin:var(--gcw-spacing-2) 0;padding-left:var(--gcw-spacing-4)}.gcw-md-list--ul{list-style-type:disc}.gcw-md-list--ol{list-style-type:decimal}.gcw-md-list__item{font-size:var(--gcw-font-size-base);margin-bottom:var(--gcw-spacing-1)}.gcw-md-bold{font-weight:600}.gcw-md-italic{font-style:italic}.gcw-md-code{background-color:var(--gcw-color-gray-200);padding:.125rem var(--gcw-spacing-2);border-radius:var(--gcw-radius-sm);font-size:var(--gcw-font-size-sm);font-family:SF Mono,Monaco,Consolas,monospace}.gcw-bubble--user .gcw-md-code{background-color:#fff3}.gcw-md-code-block{background-color:var(--gcw-color-gray-800);color:var(--gcw-color-gray-100);padding:var(--gcw-spacing-3);border-radius:var(--gcw-radius-lg);font-size:var(--gcw-font-size-sm);overflow-x:auto;margin:var(--gcw-spacing-2) 0}.gcw-md-code-block code{font-family:SF Mono,Monaco,Consolas,monospace}.gcw-md-link{color:var(--gcw-color-primary);text-decoration:underline}.gcw-md-link:hover{color:var(--gcw-color-primary-hover)}.gcw-bubble--user .gcw-md-link{color:#ffffffe6}.gcw-sources{display:flex;flex-wrap:wrap;gap:var(--gcw-spacing-2);margin-top:var(--gcw-spacing-2)}.gcw-source{display:inline-flex;align-items:center;gap:var(--gcw-spacing-1);padding:var(--gcw-spacing-1) var(--gcw-spacing-2);border-radius:var(--gcw-radius-full);background-color:var(--gcw-color-primary-light);color:var(--gcw-color-primary);font-size:var(--gcw-font-size-sm);text-decoration:none;transition:background-color var(--gcw-transition-fast)}.gcw-source:hover{background-color:#dbeafe}.gcw-source__icon{width:.75rem;height:.75rem}.gcw-typing{display:flex;justify-content:flex-start}.gcw-typing__bubble{background-color:var(--gcw-color-gray-100);padding:var(--gcw-spacing-3) var(--gcw-spacing-4);border-radius:var(--gcw-radius-2xl);border-bottom-left-radius:var(--gcw-radius-sm)}.gcw-typing__dots{display:flex;gap:var(--gcw-spacing-1)}.gcw-typing__dot{width:.5rem;height:.5rem;background-color:var(--gcw-color-gray-400);border-radius:var(--gcw-radius-full);animation:gcw-typing-bounce 1.4s infinite ease-in-out both}.gcw-typing__dot:nth-child(1){animation-delay:-.32s}.gcw-typing__dot:nth-child(2){animation-delay:-.16s}.gcw-input-area{padding:var(--gcw-spacing-3);border-top:1px solid var(--gcw-color-gray-200);background-color:var(--gcw-color-white);flex-shrink:0}.gcw-input-row{display:flex;align-items:flex-end;gap:var(--gcw-spacing-2)}.gcw-input{flex:1;min-height:44px;max-height:120px;padding:var(--gcw-spacing-2) var(--gcw-spacing-4);border:1px solid var(--gcw-color-gray-200);border-radius:var(--gcw-radius-xl);background-color:var(--gcw-color-white);color:var(--gcw-color-gray-800);font-family:var(--gcw-font-family);font-size:var(--gcw-font-size-base);font-weight:400;line-height:1.5;letter-spacing:normal;resize:none;outline:none;transition:border-color var(--gcw-transition-fast),box-shadow var(--gcw-transition-fast)}.gcw-input:focus{border-color:var(--gcw-color-primary);box-shadow:0 0 0 3px #3b82f61a}.gcw-input:disabled{background-color:var(--gcw-color-gray-50);cursor:not-allowed}.gcw-input::placeholder{color:var(--gcw-color-gray-400)}.gcw-send-btn{width:2.5rem;height:2.5rem;flex-shrink:0;border:none;border-radius:var(--gcw-radius-lg);color:var(--gcw-color-white);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:opacity var(--gcw-transition-fast),transform var(--gcw-transition-fast)}.gcw-send-btn:hover:not(:disabled){opacity:.9}.gcw-send-btn:active:not(:disabled){transform:scale(.95)}.gcw-send-btn:disabled{opacity:.5;cursor:not-allowed}.gcw-send-btn__icon{width:1.25rem;height:1.25rem}.gcw-input-hint{font-size:var(--gcw-font-size-xs);color:var(--gcw-color-gray-400);text-align:center;margin-top:var(--gcw-spacing-2)}@keyframes gcw-slide-up{0%{opacity:0;transform:translateY(1rem)}to{opacity:1;transform:translateY(0)}}@keyframes gcw-pulse{0%,to{opacity:1}50%{opacity:.5}}@keyframes gcw-typing-bounce{0%,80%,to{transform:scale(0)}40%{transform:scale(1)}}@keyframes gcw-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.gcw-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.gcw-spin{animation:gcw-spin 1s linear infinite}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export interface Message {
|
|
2
|
+
id: string;
|
|
3
|
+
role: 'user' | 'assistant';
|
|
4
|
+
content: string;
|
|
5
|
+
timestamp: Date;
|
|
6
|
+
isStreaming?: boolean;
|
|
7
|
+
sources?: Source[];
|
|
8
|
+
}
|
|
9
|
+
export interface Source {
|
|
10
|
+
title: string;
|
|
11
|
+
url: string;
|
|
12
|
+
relevance?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface ChatConfig {
|
|
15
|
+
apiUrl: string;
|
|
16
|
+
tenantId?: string;
|
|
17
|
+
sessionId?: string;
|
|
18
|
+
headers?: Record<string, string>;
|
|
19
|
+
}
|
|
20
|
+
export type WidgetSize = 'small' | 'medium' | 'large' | 'fullscreen';
|
|
21
|
+
export interface ChatWidgetProps {
|
|
22
|
+
/** API endpoint URL */
|
|
23
|
+
apiUrl: string;
|
|
24
|
+
/** Optional tenant ID for multi-tenant setups */
|
|
25
|
+
tenantId?: string;
|
|
26
|
+
/** Widget title */
|
|
27
|
+
title?: string;
|
|
28
|
+
/** Widget subtitle */
|
|
29
|
+
subtitle?: string;
|
|
30
|
+
/** Input placeholder text */
|
|
31
|
+
placeholder?: string;
|
|
32
|
+
/** Initial greeting message */
|
|
33
|
+
greeting?: string;
|
|
34
|
+
/** Primary color (hex) */
|
|
35
|
+
primaryColor?: string;
|
|
36
|
+
/** Position of the widget */
|
|
37
|
+
position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
|
|
38
|
+
/** Default open state */
|
|
39
|
+
defaultOpen?: boolean;
|
|
40
|
+
/** Default widget size */
|
|
41
|
+
defaultSize?: WidgetSize;
|
|
42
|
+
/** Custom headers for API calls */
|
|
43
|
+
headers?: Record<string, string>;
|
|
44
|
+
/** Callback when chat is opened */
|
|
45
|
+
onOpen?: () => void;
|
|
46
|
+
/** Callback when chat is closed */
|
|
47
|
+
onClose?: () => void;
|
|
48
|
+
/** Callback when a message is sent */
|
|
49
|
+
onMessageSent?: (message: string) => void;
|
|
50
|
+
/** Callback when a response is received */
|
|
51
|
+
onResponseReceived?: (response: string) => void;
|
|
52
|
+
}
|
|
53
|
+
export interface ChatResponse {
|
|
54
|
+
message: {
|
|
55
|
+
role: string;
|
|
56
|
+
content: string;
|
|
57
|
+
citations?: Array<{
|
|
58
|
+
title: string;
|
|
59
|
+
url: string;
|
|
60
|
+
relevance_score?: number;
|
|
61
|
+
}>;
|
|
62
|
+
};
|
|
63
|
+
session_id: string;
|
|
64
|
+
}
|
|
65
|
+
export interface StreamChunk {
|
|
66
|
+
type: 'content' | 'sources' | 'done' | 'error';
|
|
67
|
+
content?: string;
|
|
68
|
+
sources?: Source[];
|
|
69
|
+
error?: string;
|
|
70
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Message } from '../types';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Save chat state to localStorage
|
|
5
|
+
*/
|
|
6
|
+
export declare function saveChatState(messages: Message[], sessionId: string | null, tenantId?: string): void;
|
|
7
|
+
/**
|
|
8
|
+
* Load chat state from localStorage
|
|
9
|
+
*/
|
|
10
|
+
export declare function loadChatState(tenantId?: string): {
|
|
11
|
+
messages: Message[];
|
|
12
|
+
sessionId: string | null;
|
|
13
|
+
} | null;
|
|
14
|
+
/**
|
|
15
|
+
* Clear chat state from localStorage
|
|
16
|
+
*/
|
|
17
|
+
export declare function clearChatState(tenantId?: string): void;
|
|
18
|
+
/**
|
|
19
|
+
* Subscribe to chat state changes from other windows/tabs
|
|
20
|
+
*/
|
|
21
|
+
export declare function subscribeToChatStateChanges(tenantId: string | undefined, onStateChange: (state: {
|
|
22
|
+
messages: Message[];
|
|
23
|
+
sessionId: string | null;
|
|
24
|
+
} | null) => void): () => void;
|
|
25
|
+
/**
|
|
26
|
+
* Save popout state to localStorage
|
|
27
|
+
*/
|
|
28
|
+
export declare function savePopoutState(isOpen: boolean, tenantId?: string): void;
|
|
29
|
+
/**
|
|
30
|
+
* Load popout state from localStorage
|
|
31
|
+
*/
|
|
32
|
+
export declare function loadPopoutState(tenantId?: string): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Save the ID of the last read message
|
|
35
|
+
*/
|
|
36
|
+
export declare function saveLastReadMessageId(messageId: string | null, tenantId?: string): void;
|
|
37
|
+
/**
|
|
38
|
+
* Load the ID of the last read message
|
|
39
|
+
*/
|
|
40
|
+
export declare function loadLastReadMessageId(tenantId?: string): string | null;
|
|
41
|
+
/**
|
|
42
|
+
* Check if there are unread messages
|
|
43
|
+
*/
|
|
44
|
+
export declare function hasUnreadMessages(messages: Message[], tenantId?: string): boolean;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { saveChatState, loadChatState, clearChatState, subscribeToChatStateChanges, savePopoutState, loadPopoutState, saveLastReadMessageId, loadLastReadMessageId, hasUnreadMessages, } from './chatPersistence';
|
package/package.json
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@cas0570/chat-widget",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Embeddable chat widget for GeoApps documentation assistant. Easy to integrate via npm",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/geoapps-chat-widget.umd.cjs",
|
|
7
|
+
"module": "./dist/geoapps-chat-widget.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/geoapps-chat-widget.js",
|
|
13
|
+
"require": "./dist/geoapps-chat-widget.umd.cjs"
|
|
14
|
+
},
|
|
15
|
+
"./style.css": "./dist/style.css"
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist",
|
|
19
|
+
"README.md"
|
|
20
|
+
],
|
|
21
|
+
"keywords": [
|
|
22
|
+
"chat",
|
|
23
|
+
"chatbot",
|
|
24
|
+
"widget",
|
|
25
|
+
"geoapps",
|
|
26
|
+
"react",
|
|
27
|
+
"embeddable",
|
|
28
|
+
"customer-support",
|
|
29
|
+
"documentation",
|
|
30
|
+
"ai-chat"
|
|
31
|
+
],
|
|
32
|
+
"author": "Cas Doorn",
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "https://github.com/Cas0570/geoapps-chat-widget.git"
|
|
36
|
+
},
|
|
37
|
+
"homepage": "https://github.com/Cas0570/geoapps-chat-widget#readme",
|
|
38
|
+
"bugs": {
|
|
39
|
+
"url": "https://github.com/Cas0570/geoapps-chat-widget/issues"
|
|
40
|
+
},
|
|
41
|
+
"scripts": {
|
|
42
|
+
"dev": "vite",
|
|
43
|
+
"build": "tsc && vite build",
|
|
44
|
+
"build:lib": "tsc && vite build --mode lib",
|
|
45
|
+
"preview": "vite preview",
|
|
46
|
+
"lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
|
|
47
|
+
"type-check": "tsc --noEmit",
|
|
48
|
+
"test": "vitest",
|
|
49
|
+
"test:run": "vitest run",
|
|
50
|
+
"test:coverage": "vitest run --coverage",
|
|
51
|
+
"prepublishOnly": "npm run build:lib"
|
|
52
|
+
},
|
|
53
|
+
"devDependencies": {
|
|
54
|
+
"@testing-library/jest-dom": "^6.9.1",
|
|
55
|
+
"@testing-library/react": "^16.3.2",
|
|
56
|
+
"@testing-library/user-event": "^14.6.1",
|
|
57
|
+
"@types/node": "^25.2.0",
|
|
58
|
+
"@types/react": "^18.2.66",
|
|
59
|
+
"@types/react-dom": "^18.2.22",
|
|
60
|
+
"@vitejs/plugin-react": "^4.2.1",
|
|
61
|
+
"@vitest/coverage-v8": "^4.0.18",
|
|
62
|
+
"eslint": "^8.57.0",
|
|
63
|
+
"eslint-plugin-react-hooks": "^4.6.0",
|
|
64
|
+
"eslint-plugin-react-refresh": "^0.4.6",
|
|
65
|
+
"jsdom": "^28.0.0",
|
|
66
|
+
"react": "^18.2.0",
|
|
67
|
+
"react-dom": "^18.2.0",
|
|
68
|
+
"typescript": "^5.4.2",
|
|
69
|
+
"vite": "^5.1.6",
|
|
70
|
+
"vite-plugin-dts": "^3.7.3",
|
|
71
|
+
"vitest": "^4.0.18"
|
|
72
|
+
},
|
|
73
|
+
"peerDependencies": {
|
|
74
|
+
"react": "^18.0.0 || ^19.0.0",
|
|
75
|
+
"react-dom": "^18.0.0 || ^19.0.0"
|
|
76
|
+
},
|
|
77
|
+
"sideEffects": [
|
|
78
|
+
"*.css"
|
|
79
|
+
]
|
|
80
|
+
}
|