acecoderz-chat-ui 1.0.0

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.
Files changed (62) hide show
  1. package/README.md +309 -0
  2. package/browser/index.ts +15 -0
  3. package/dist/adapters/react/ChatUI.d.ts +32 -0
  4. package/dist/adapters/react/ChatUI.d.ts.map +1 -0
  5. package/dist/adapters/react/ChatUI.js +170 -0
  6. package/dist/adapters/react/index.d.ts +5 -0
  7. package/dist/adapters/react/index.d.ts.map +1 -0
  8. package/dist/adapters/react/index.js +2 -0
  9. package/dist/adapters/react/useChat.d.ts +14 -0
  10. package/dist/adapters/react/useChat.d.ts.map +1 -0
  11. package/dist/adapters/react/useChat.js +64 -0
  12. package/dist/adapters/solid/createChat.d.ts +13 -0
  13. package/dist/adapters/solid/createChat.d.ts.map +1 -0
  14. package/dist/adapters/solid/createChat.js +34 -0
  15. package/dist/adapters/solid/index.d.ts +3 -0
  16. package/dist/adapters/solid/index.d.ts.map +1 -0
  17. package/dist/adapters/solid/index.js +1 -0
  18. package/dist/adapters/vanilla/index.d.ts +31 -0
  19. package/dist/adapters/vanilla/index.d.ts.map +1 -0
  20. package/dist/adapters/vanilla/index.js +346 -0
  21. package/dist/browser/Archive.zip +0 -0
  22. package/dist/browser/cdn-example.html +177 -0
  23. package/dist/browser/chatbot-ui.css +508 -0
  24. package/dist/browser/chatbot-ui.js +878 -0
  25. package/dist/browser/chatbot-ui.js.map +7 -0
  26. package/dist/browser/chatbot-ui.min.js +71 -0
  27. package/dist/browser/chatbot.html +100 -0
  28. package/dist/core/src/ChatEngine.d.ts +30 -0
  29. package/dist/core/src/ChatEngine.d.ts.map +1 -0
  30. package/dist/core/src/ChatEngine.js +357 -0
  31. package/dist/core/src/apiLogger.d.ts +47 -0
  32. package/dist/core/src/apiLogger.d.ts.map +1 -0
  33. package/dist/core/src/apiLogger.js +199 -0
  34. package/dist/core/src/index.d.ts +7 -0
  35. package/dist/core/src/index.d.ts.map +1 -0
  36. package/dist/core/src/index.js +3 -0
  37. package/dist/core/src/types.d.ts +62 -0
  38. package/dist/core/src/types.d.ts.map +1 -0
  39. package/dist/core/src/types.js +1 -0
  40. package/dist/core/src/urlWhitelist.d.ts +19 -0
  41. package/dist/core/src/urlWhitelist.d.ts.map +1 -0
  42. package/dist/core/src/urlWhitelist.js +66 -0
  43. package/dist/src/ChatUI.stories.d.ts +37 -0
  44. package/dist/src/ChatUI.stories.d.ts.map +1 -0
  45. package/dist/src/ChatUI.stories.js +65 -0
  46. package/dist/src/ChatUIThemes.stories.d.ts +28 -0
  47. package/dist/src/ChatUIThemes.stories.d.ts.map +1 -0
  48. package/dist/src/ChatUIThemes.stories.js +109 -0
  49. package/dist/src/ThemeProperties.stories.d.ts +92 -0
  50. package/dist/src/ThemeProperties.stories.d.ts.map +1 -0
  51. package/dist/src/ThemeProperties.stories.js +195 -0
  52. package/dist/src/UseChat.stories.d.ts +21 -0
  53. package/dist/src/UseChat.stories.d.ts.map +1 -0
  54. package/dist/src/UseChat.stories.js +66 -0
  55. package/dist/src/VanillaAdapter.stories.d.ts +39 -0
  56. package/dist/src/VanillaAdapter.stories.d.ts.map +1 -0
  57. package/dist/src/VanillaAdapter.stories.js +78 -0
  58. package/dist/src/index.d.ts +9 -0
  59. package/dist/src/index.d.ts.map +1 -0
  60. package/dist/src/index.js +8 -0
  61. package/package.json +117 -0
  62. package/styles/chat.css +508 -0
@@ -0,0 +1,66 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useChat } from '../adapters/react/useChat';
3
+ function UseChatDemo({ apiUrl }) {
4
+ const { messages, input, isLoading, sendMessage, setInput, clearMessages } = useChat({
5
+ apiUrl,
6
+ });
7
+ return (_jsxs("div", { style: { padding: '1rem', maxWidth: '600px', margin: '0 auto' }, children: [_jsx("h3", { style: { marginBottom: '1rem' }, children: "useChat Hook Demo" }), _jsxs("div", { style: {
8
+ border: '1px solid #e2e8f0',
9
+ borderRadius: '0.5rem',
10
+ padding: '1rem',
11
+ marginBottom: '1rem',
12
+ minHeight: '300px',
13
+ maxHeight: '400px',
14
+ overflowY: 'auto',
15
+ backgroundColor: '#f8fafc'
16
+ }, children: [messages.length === 0 ? (_jsx("p", { style: { color: '#64748b', textAlign: 'center', marginTop: '2rem' }, children: "No messages yet. Send a message to start!" })) : (messages.map((msg) => (_jsxs("div", { style: {
17
+ marginBottom: '1rem',
18
+ padding: '0.75rem',
19
+ borderRadius: '0.5rem',
20
+ backgroundColor: msg.role === 'user' ? '#3b82f6' : '#f1f5f9',
21
+ color: msg.role === 'user' ? 'white' : '#1e293b',
22
+ textAlign: msg.role === 'user' ? 'right' : 'left',
23
+ }, children: [_jsx("div", { style: { fontWeight: 'bold', marginBottom: '0.25rem' }, children: msg.role === 'user' ? 'You' : 'Assistant' }), _jsx("div", { children: msg.content }), _jsx("div", { style: { fontSize: '0.75rem', opacity: 0.7, marginTop: '0.25rem' }, children: new Date(msg.timestamp).toLocaleTimeString() })] }, msg.id)))), isLoading && (_jsx("div", { style: { padding: '0.75rem', color: '#64748b' }, children: "Thinking..." }))] }), _jsxs("div", { style: { display: 'flex', gap: '0.5rem' }, children: [_jsx("input", { type: "text", value: input, onChange: (e) => setInput(e.target.value), onKeyDown: (e) => {
24
+ if (e.key === 'Enter' && !isLoading && input.trim()) {
25
+ sendMessage(input);
26
+ }
27
+ }, placeholder: "Type a message...", disabled: isLoading, style: {
28
+ flex: 1,
29
+ padding: '0.75rem',
30
+ border: '1px solid #e2e8f0',
31
+ borderRadius: '0.5rem',
32
+ fontSize: '1rem',
33
+ } }), _jsx("button", { onClick: () => sendMessage(input), disabled: isLoading || !input.trim(), style: {
34
+ padding: '0.75rem 1.5rem',
35
+ backgroundColor: '#3b82f6',
36
+ color: 'white',
37
+ border: 'none',
38
+ borderRadius: '0.5rem',
39
+ cursor: isLoading || !input.trim() ? 'not-allowed' : 'pointer',
40
+ opacity: isLoading || !input.trim() ? 0.5 : 1,
41
+ }, children: "Send" }), _jsx("button", { onClick: clearMessages, style: {
42
+ padding: '0.75rem 1rem',
43
+ backgroundColor: '#ef4444',
44
+ color: 'white',
45
+ border: 'none',
46
+ borderRadius: '0.5rem',
47
+ cursor: 'pointer',
48
+ }, children: "Clear" })] })] }));
49
+ }
50
+ const meta = {
51
+ title: 'React/useChat Hook',
52
+ component: UseChatDemo,
53
+ parameters: {
54
+ layout: 'centered',
55
+ },
56
+ tags: ['autodocs'],
57
+ argTypes: {
58
+ apiUrl: { control: 'text' },
59
+ },
60
+ };
61
+ export default meta;
62
+ export const Default = {
63
+ args: {
64
+ apiUrl: 'http://localhost:3000/api/chat',
65
+ },
66
+ };
@@ -0,0 +1,39 @@
1
+ import type { StoryObj } from '@storybook/react';
2
+ import type { ChatTheme } from '../core/src/types';
3
+ declare function VanillaAdapterDemo({ apiUrl, theme, enableMarkdown, placeholder, showTimestamp, showAvatar, initialGreeting }: {
4
+ apiUrl: string;
5
+ theme?: ChatTheme;
6
+ enableMarkdown?: boolean;
7
+ placeholder?: string;
8
+ showTimestamp?: boolean;
9
+ showAvatar?: boolean;
10
+ initialGreeting?: string;
11
+ }): import("react/jsx-runtime").JSX.Element;
12
+ declare const meta: {
13
+ title: string;
14
+ component: typeof VanillaAdapterDemo;
15
+ parameters: {
16
+ layout: string;
17
+ };
18
+ tags: string[];
19
+ argTypes: {
20
+ apiUrl: {
21
+ control: "text";
22
+ };
23
+ enableMarkdown: {
24
+ control: "boolean";
25
+ };
26
+ showTimestamp: {
27
+ control: "boolean";
28
+ };
29
+ showAvatar: {
30
+ control: "boolean";
31
+ };
32
+ };
33
+ };
34
+ export default meta;
35
+ type Story = StoryObj<typeof meta>;
36
+ export declare const Default: Story;
37
+ export declare const CustomTheme: Story;
38
+ export declare const NoMarkdown: Story;
39
+ //# sourceMappingURL=VanillaAdapter.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VanillaAdapter.stories.d.ts","sourceRoot":"","sources":["../../src/VanillaAdapter.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAGtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAElD,iBAAS,kBAAkB,CAAC,EAC1B,MAAM,EACN,KAAK,EACL,cAAc,EACd,WAAW,EACX,aAAa,EACb,UAAU,EACV,eAAe,EAChB,EAAE;IACD,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB,2CA8CA;AAED,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;CAaiC,CAAA;AAE3C,eAAe,IAAI,CAAA;AACnB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAA;AAElC,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAA;AAED,eAAO,MAAM,WAAW,EAAE,KAUzB,CAAA;AAED,eAAO,MAAM,UAAU,EAAE,KAKxB,CAAA"}
@@ -0,0 +1,78 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useEffect, useRef } from 'react';
3
+ import { createChatUI } from '../adapters/vanilla/index';
4
+ function VanillaAdapterDemo({ apiUrl, theme, enableMarkdown, placeholder, showTimestamp, showAvatar, initialGreeting }) {
5
+ const containerRef = useRef(null);
6
+ const instanceRef = useRef(null);
7
+ useEffect(() => {
8
+ if (containerRef.current && !instanceRef.current) {
9
+ const instance = createChatUI({
10
+ container: containerRef.current,
11
+ config: {
12
+ apiUrl: apiUrl || 'http://localhost:3000/api/chat',
13
+ },
14
+ theme,
15
+ enableMarkdown: enableMarkdown !== false,
16
+ placeholder: placeholder || 'Type your message...',
17
+ showTimestamp: showTimestamp !== false,
18
+ showAvatar: showAvatar !== false,
19
+ emptyStateMessage: initialGreeting ? undefined : 'Start a conversation...',
20
+ loadingMessage: 'Thinking...',
21
+ });
22
+ instanceRef.current = instance;
23
+ // Add initial greeting if provided
24
+ if (initialGreeting) {
25
+ instance.engine.addMessage({
26
+ id: `greeting-${Date.now()}`,
27
+ content: initialGreeting,
28
+ role: 'assistant',
29
+ timestamp: new Date(),
30
+ });
31
+ }
32
+ }
33
+ return () => {
34
+ if (instanceRef.current) {
35
+ instanceRef.current.destroy();
36
+ instanceRef.current = null;
37
+ }
38
+ };
39
+ }, []);
40
+ return (_jsx("div", { style: { width: '600px', height: '600px', margin: '0 auto' }, children: _jsx("div", { ref: containerRef, style: { width: '100%', height: '100%' } }) }));
41
+ }
42
+ const meta = {
43
+ title: 'Vanilla JS/createChatUI',
44
+ component: VanillaAdapterDemo,
45
+ parameters: {
46
+ layout: 'centered',
47
+ },
48
+ tags: ['autodocs'],
49
+ argTypes: {
50
+ apiUrl: { control: 'text' },
51
+ enableMarkdown: { control: 'boolean' },
52
+ showTimestamp: { control: 'boolean' },
53
+ showAvatar: { control: 'boolean' },
54
+ },
55
+ };
56
+ export default meta;
57
+ export const Default = {
58
+ args: {
59
+ apiUrl: 'http://localhost:3000/api/chat',
60
+ },
61
+ };
62
+ export const CustomTheme = {
63
+ args: {
64
+ apiUrl: 'http://localhost:3000/api/chat',
65
+ theme: {
66
+ primaryColor: '#8b5cf6',
67
+ userMessageColor: '#8b5cf6',
68
+ assistantMessageColor: '#ede9fe',
69
+ borderRadius: '1rem',
70
+ },
71
+ },
72
+ };
73
+ export const NoMarkdown = {
74
+ args: {
75
+ apiUrl: 'http://localhost:3000/api/chat',
76
+ enableMarkdown: false,
77
+ },
78
+ };
@@ -0,0 +1,9 @@
1
+ export { ChatEngine } from '../core/src/ChatEngine';
2
+ export type { Message, ChatConfig, ChatTheme, ChatEventType, ChatEventListener } from '../core/src/types';
3
+ export { ChatUI, useChat } from '../adapters/react';
4
+ export type { ChatUIProps, UseChatReturn } from '../adapters/react';
5
+ export { createChat } from '../adapters/solid';
6
+ export type { CreateChatReturn } from '../adapters/solid';
7
+ export { createChatUI } from '../adapters/vanilla';
8
+ export type { ChatUIOptions, ChatUIInstance } from '../adapters/vanilla';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAG1G,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGpE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,8 @@
1
+ // Core exports
2
+ export { ChatEngine } from '../core/src/ChatEngine';
3
+ // React adapter
4
+ export { ChatUI, useChat } from '../adapters/react';
5
+ // Solid adapter
6
+ export { createChat } from '../adapters/solid';
7
+ // Vanilla JS adapter
8
+ export { createChatUI } from '../adapters/vanilla';
package/package.json ADDED
@@ -0,0 +1,117 @@
1
+ {
2
+ "name": "acecoderz-chat-ui",
3
+ "version": "1.0.0",
4
+ "description": "A framework-agnostic, fully customizable chat UI package that works with React, Solid, Vanilla JS, and any other framework",
5
+ "keywords": [
6
+ "chat",
7
+ "ui",
8
+ "react",
9
+ "solid",
10
+ "vanilla",
11
+ "chatbot",
12
+ "conversation",
13
+ "messaging",
14
+ "typescript",
15
+ "framework-agnostic"
16
+ ],
17
+ "author": "",
18
+ "license": "MIT",
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "git@bitbucket.org:sudhir_pratap_/chatbot.git",
22
+ "directory": "packages/chat-ui"
23
+ },
24
+ "bugs": {
25
+ "url": "https://bitbucket.org/sudhir_pratap_/chatbot/issues"
26
+ },
27
+ "homepage": "https://bitbucket.org/sudhir_pratap_/chatbot#readme",
28
+ "type": "module",
29
+ "main": "./dist/index.js",
30
+ "types": "./dist/index.d.ts",
31
+ "exports": {
32
+ ".": {
33
+ "import": "./dist/index.js",
34
+ "types": "./dist/index.d.ts"
35
+ },
36
+ "./core": {
37
+ "import": "./dist/core/src/index.js",
38
+ "types": "./dist/core/src/index.d.ts"
39
+ },
40
+ "./react": {
41
+ "import": "./dist/adapters/react/index.js",
42
+ "types": "./dist/adapters/react/index.d.ts"
43
+ },
44
+ "./solid": {
45
+ "import": "./dist/adapters/solid/index.js",
46
+ "types": "./dist/adapters/solid/index.d.ts"
47
+ },
48
+ "./vanilla": {
49
+ "import": "./dist/adapters/vanilla/index.js",
50
+ "types": "./dist/adapters/vanilla/index.d.ts"
51
+ },
52
+ "./styles": "./styles/chat.css",
53
+ "./browser": {
54
+ "import": "./dist/browser/chatbot-ui.js",
55
+ "types": "./browser/index.ts"
56
+ },
57
+ "./cdn": {
58
+ "import": "./dist/browser/chatbot-ui.min.js",
59
+ "types": "./browser/index.ts"
60
+ },
61
+ "./cdn/css": "./styles/chat.css"
62
+ },
63
+ "scripts": {
64
+ "build": "tsc",
65
+ "build:browser": "node build-browser.js",
66
+ "build:all": "pnpm build && pnpm build:browser",
67
+ "dev": "tsc --watch",
68
+ "check-types": "tsc --noEmit",
69
+ "docs:storybook": "storybook dev -p 6006",
70
+ "docs:storybook:build": "storybook build",
71
+ "docs:typedoc": "typedoc",
72
+ "docs:build": "pnpm docs:typedoc && pnpm docs:storybook:build"
73
+ },
74
+ "devDependencies": {
75
+ "@storybook/addon-essentials": "^8.6.15",
76
+ "@storybook/addon-interactions": "^8.6.15",
77
+ "@storybook/addon-links": "^8.6.15",
78
+ "@storybook/blocks": "^8.6.15",
79
+ "@storybook/react": "^8.6.15",
80
+ "@storybook/react-vite": "^8.6.15",
81
+ "@storybook/test": "^8.6.15",
82
+ "@types/react": "^19.2.5",
83
+ "@types/react-dom": "^19.2.3",
84
+ "@vitejs/plugin-react": "^4.3.1",
85
+ "esbuild": "^0.24.2",
86
+ "react": "^19.0.0",
87
+ "react-dom": "^19.0.0",
88
+ "storybook": "^8.6.15",
89
+ "typedoc": "^0.26.0",
90
+ "typescript": "~5.9.3",
91
+ "vite": "^5.4.0"
92
+ },
93
+ "peerDependencies": {
94
+ "react": "^18.0.0 || ^19.0.0",
95
+ "react-dom": "^18.0.0 || ^19.0.0",
96
+ "react-markdown": "^10.0.0",
97
+ "remark-gfm": "^4.0.0",
98
+ "solid-js": "^1.0.0"
99
+ },
100
+ "peerDependenciesMeta": {
101
+ "react-markdown": {
102
+ "optional": true
103
+ },
104
+ "remark-gfm": {
105
+ "optional": true
106
+ }
107
+ },
108
+ "files": [
109
+ "dist",
110
+ "styles",
111
+ "browser",
112
+ "README.md"
113
+ ],
114
+ "engines": {
115
+ "node": ">=18"
116
+ }
117
+ }