@talk2view/sdk 0.1.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.
- package/LICENSE +7 -0
- package/README.md +594 -0
- package/dist/auth.d.ts +39 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +102 -0
- package/dist/auth.js.map +1 -0
- package/dist/client.d.ts +27 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +195 -0
- package/dist/client.js.map +1 -0
- package/dist/errors.d.ts +21 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +38 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +80 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +115 -0
- package/dist/index.js.map +1 -0
- package/dist/react/ChatInput.d.ts +13 -0
- package/dist/react/ChatInput.d.ts.map +1 -0
- package/dist/react/ChatInput.js +163 -0
- package/dist/react/ChatInput.js.map +1 -0
- package/dist/react/ChatMessage.d.ts +10 -0
- package/dist/react/ChatMessage.d.ts.map +1 -0
- package/dist/react/ChatMessage.js +53 -0
- package/dist/react/ChatMessage.js.map +1 -0
- package/dist/react/ChatPanel.d.ts +17 -0
- package/dist/react/ChatPanel.d.ts.map +1 -0
- package/dist/react/ChatPanel.js +385 -0
- package/dist/react/ChatPanel.js.map +1 -0
- package/dist/react/LoginModal.d.ts +10 -0
- package/dist/react/LoginModal.d.ts.map +1 -0
- package/dist/react/LoginModal.js +135 -0
- package/dist/react/LoginModal.js.map +1 -0
- package/dist/react/SettingsView.d.ts +9 -0
- package/dist/react/SettingsView.d.ts.map +1 -0
- package/dist/react/SettingsView.js +190 -0
- package/dist/react/SettingsView.js.map +1 -0
- package/dist/react/T2VProvider.d.ts +25 -0
- package/dist/react/T2VProvider.d.ts.map +1 -0
- package/dist/react/T2VProvider.js +38 -0
- package/dist/react/T2VProvider.js.map +1 -0
- package/dist/react/index.d.ts +38 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +28 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/theme.d.ts +32 -0
- package/dist/react/theme.d.ts.map +1 -0
- package/dist/react/theme.js +131 -0
- package/dist/react/theme.js.map +1 -0
- package/dist/react/useT2VAuth.d.ts +16 -0
- package/dist/react/useT2VAuth.d.ts.map +1 -0
- package/dist/react/useT2VAuth.js +52 -0
- package/dist/react/useT2VAuth.js.map +1 -0
- package/dist/react/useT2VChat.d.ts +28 -0
- package/dist/react/useT2VChat.d.ts.map +1 -0
- package/dist/react/useT2VChat.js +103 -0
- package/dist/react/useT2VChat.js.map +1 -0
- package/dist/react/useT2VTools.d.ts +11 -0
- package/dist/react/useT2VTools.d.ts.map +1 -0
- package/dist/react/useT2VTools.js +29 -0
- package/dist/react/useT2VTools.js.map +1 -0
- package/dist/react/useUserPreferences.d.ts +13 -0
- package/dist/react/useUserPreferences.d.ts.map +1 -0
- package/dist/react/useUserPreferences.js +40 -0
- package/dist/react/useUserPreferences.js.map +1 -0
- package/dist/sessions.d.ts +34 -0
- package/dist/sessions.d.ts.map +1 -0
- package/dist/sessions.js +95 -0
- package/dist/sessions.js.map +1 -0
- package/dist/storage.d.ts +16 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +84 -0
- package/dist/storage.js.map +1 -0
- package/dist/streaming.d.ts +9 -0
- package/dist/streaming.d.ts.map +1 -0
- package/dist/streaming.js +45 -0
- package/dist/streaming.js.map +1 -0
- package/dist/tools.d.ts +40 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +83 -0
- package/dist/tools.js.map +1 -0
- package/dist/types.d.ts +153 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* ChatInput — text input with mic and send buttons.
|
|
4
|
+
*
|
|
5
|
+
* Voice input uses MediaRecorder + Talk2View's /v1/audio/transcriptions endpoint.
|
|
6
|
+
*/
|
|
7
|
+
import { useCallback, useRef, useState } from 'react';
|
|
8
|
+
import { T2V_COLORS, T2V_FONTS } from './theme';
|
|
9
|
+
import { useT2V } from './T2VProvider';
|
|
10
|
+
import { useUserPreferences } from './useUserPreferences';
|
|
11
|
+
export function ChatInput({ onSend, disabled = false, placeholder = 'Type a message...', className = '', }) {
|
|
12
|
+
const { t2v } = useT2V();
|
|
13
|
+
const { preferences } = useUserPreferences();
|
|
14
|
+
const [value, setValue] = useState('');
|
|
15
|
+
const [inputFocused, setInputFocused] = useState(false);
|
|
16
|
+
const [btnHover, setBtnHover] = useState(false);
|
|
17
|
+
const [micHover, setMicHover] = useState(false);
|
|
18
|
+
const [isRecording, setIsRecording] = useState(false);
|
|
19
|
+
const [isTranscribing, setIsTranscribing] = useState(false);
|
|
20
|
+
const mediaRecorderRef = useRef(null);
|
|
21
|
+
const chunksRef = useRef([]);
|
|
22
|
+
const canSend = value.trim().length > 0 && !disabled;
|
|
23
|
+
const micDisabled = disabled || isTranscribing || !preferences.sttModel;
|
|
24
|
+
const handleSubmit = useCallback((e) => {
|
|
25
|
+
e.preventDefault();
|
|
26
|
+
const trimmed = value.trim();
|
|
27
|
+
if (!trimmed || disabled)
|
|
28
|
+
return;
|
|
29
|
+
onSend(trimmed);
|
|
30
|
+
setValue('');
|
|
31
|
+
}, [value, disabled, onSend]);
|
|
32
|
+
const handleKeyDown = useCallback((e) => {
|
|
33
|
+
if (e.key === 'Enter' && !e.shiftKey) {
|
|
34
|
+
e.preventDefault();
|
|
35
|
+
handleSubmit(e);
|
|
36
|
+
}
|
|
37
|
+
}, [handleSubmit]);
|
|
38
|
+
const transcribeAudio = useCallback(async (audioBlob) => {
|
|
39
|
+
setIsTranscribing(true);
|
|
40
|
+
try {
|
|
41
|
+
const ext = audioBlob.type.includes('mp4') ? 'mp4' : 'webm';
|
|
42
|
+
const formData = new FormData();
|
|
43
|
+
formData.append('file', audioBlob, `recording.${ext}`);
|
|
44
|
+
if (preferences.sttModel) {
|
|
45
|
+
formData.append('model', preferences.sttModel);
|
|
46
|
+
}
|
|
47
|
+
if (preferences.sttLanguage) {
|
|
48
|
+
formData.append('language', preferences.sttLanguage);
|
|
49
|
+
}
|
|
50
|
+
const data = await t2v.transcribe(formData);
|
|
51
|
+
const text = data.text?.trim();
|
|
52
|
+
if (text) {
|
|
53
|
+
onSend(text);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
console.error('Transcription error:', err);
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
setIsTranscribing(false);
|
|
61
|
+
}
|
|
62
|
+
}, [t2v, onSend, preferences.sttModel, preferences.sttLanguage]);
|
|
63
|
+
const toggleRecording = useCallback(async () => {
|
|
64
|
+
if (isRecording && mediaRecorderRef.current) {
|
|
65
|
+
mediaRecorderRef.current.stop();
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
let stream = null;
|
|
69
|
+
try {
|
|
70
|
+
stream = await navigator.mediaDevices.getUserMedia({ audio: true });
|
|
71
|
+
const mediaRecorder = new MediaRecorder(stream);
|
|
72
|
+
chunksRef.current = [];
|
|
73
|
+
mediaRecorder.ondataavailable = (e) => {
|
|
74
|
+
if (e.data.size > 0)
|
|
75
|
+
chunksRef.current.push(e.data);
|
|
76
|
+
};
|
|
77
|
+
mediaRecorder.onstop = () => {
|
|
78
|
+
const mimeType = mediaRecorder.mimeType || 'audio/webm';
|
|
79
|
+
const audioBlob = new Blob(chunksRef.current, { type: mimeType });
|
|
80
|
+
stream.getTracks().forEach((track) => track.stop());
|
|
81
|
+
chunksRef.current = [];
|
|
82
|
+
mediaRecorderRef.current = null;
|
|
83
|
+
setIsRecording(false);
|
|
84
|
+
if (audioBlob.size > 0) {
|
|
85
|
+
transcribeAudio(audioBlob);
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
mediaRecorderRef.current = mediaRecorder;
|
|
89
|
+
mediaRecorder.start(1000); // flush chunks every 1s — fixes Safari dropping early audio
|
|
90
|
+
setIsRecording(true);
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
stream?.getTracks().forEach((track) => track.stop());
|
|
94
|
+
console.error('Voice recording error:', err);
|
|
95
|
+
}
|
|
96
|
+
}, [isRecording, transcribeAudio]);
|
|
97
|
+
return (_jsxs("form", { onSubmit: handleSubmit, className: `t2v-chat-input ${className}`, style: {
|
|
98
|
+
display: 'flex',
|
|
99
|
+
gap: '8px',
|
|
100
|
+
padding: '12px',
|
|
101
|
+
borderTop: `1px solid ${T2V_COLORS.lightGray}`,
|
|
102
|
+
backgroundColor: T2V_COLORS.light,
|
|
103
|
+
}, children: [_jsx("input", { type: "text", value: value, onChange: (e) => setValue(e.target.value), onKeyDown: handleKeyDown, onFocus: () => setInputFocused(true), onBlur: () => setInputFocused(false), placeholder: isRecording ? 'Recording...' : isTranscribing ? 'Transcribing...' : placeholder, disabled: disabled, style: {
|
|
104
|
+
flex: 1,
|
|
105
|
+
padding: '10px 14px',
|
|
106
|
+
borderRadius: '8px',
|
|
107
|
+
border: `1.5px solid ${inputFocused ? T2V_COLORS.turquoise : T2V_COLORS.lightGray}`,
|
|
108
|
+
fontSize: '14px',
|
|
109
|
+
fontFamily: T2V_FONTS.body,
|
|
110
|
+
outline: 'none',
|
|
111
|
+
backgroundColor: disabled ? T2V_COLORS.lightGray : '#ffffff',
|
|
112
|
+
color: T2V_COLORS.dark,
|
|
113
|
+
boxShadow: inputFocused ? `0 0 0 3px rgba(64, 212, 182, 0.15)` : 'none',
|
|
114
|
+
transition: 'border-color 0.15s ease, box-shadow 0.15s ease',
|
|
115
|
+
} }), _jsx("button", { type: "button", onClick: toggleRecording, disabled: micDisabled, onMouseEnter: () => setMicHover(true), onMouseLeave: () => setMicHover(false), style: {
|
|
116
|
+
display: 'flex',
|
|
117
|
+
alignItems: 'center',
|
|
118
|
+
justifyContent: 'center',
|
|
119
|
+
width: '42px',
|
|
120
|
+
height: '42px',
|
|
121
|
+
borderRadius: '8px',
|
|
122
|
+
border: 'none',
|
|
123
|
+
backgroundColor: isRecording
|
|
124
|
+
? T2V_COLORS.errorRed
|
|
125
|
+
: isTranscribing
|
|
126
|
+
? T2V_COLORS.turquoise
|
|
127
|
+
: micHover
|
|
128
|
+
? T2V_COLORS.stormyTeal
|
|
129
|
+
: T2V_COLORS.lightGray,
|
|
130
|
+
color: isRecording || isTranscribing || micHover ? T2V_COLORS.light : T2V_COLORS.midGray,
|
|
131
|
+
cursor: micDisabled ? 'not-allowed' : 'pointer',
|
|
132
|
+
transition: 'background-color 0.15s ease, transform 0.15s ease',
|
|
133
|
+
transform: micHover && !micDisabled ? 'translateY(-1px)' : 'none',
|
|
134
|
+
flexShrink: 0,
|
|
135
|
+
}, title: !preferences.sttModel ? 'Select a Speech-to-Text model in Settings to enable voice input' : undefined, "aria-label": isRecording ? 'Stop recording' : isTranscribing ? 'Transcribing...' : !preferences.sttModel ? 'Voice input unavailable' : 'Start voice input', children: isTranscribing ? (_jsx("span", { style: {
|
|
136
|
+
display: 'inline-block',
|
|
137
|
+
width: '16px',
|
|
138
|
+
height: '16px',
|
|
139
|
+
border: `2px solid ${T2V_COLORS.light}`,
|
|
140
|
+
borderTopColor: 'transparent',
|
|
141
|
+
borderRadius: '50%',
|
|
142
|
+
animation: 't2v-spin 0.6s linear infinite',
|
|
143
|
+
} })) : (_jsxs("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("path", { d: "M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z" }), _jsx("path", { d: "M19 10v2a7 7 0 0 1-14 0v-2" }), _jsx("line", { x1: "12", y1: "19", x2: "12", y2: "23" }), _jsx("line", { x1: "8", y1: "23", x2: "16", y2: "23" })] })) }), _jsx("button", { type: "submit", disabled: !canSend, onMouseEnter: () => setBtnHover(true), onMouseLeave: () => setBtnHover(false), style: {
|
|
144
|
+
display: 'flex',
|
|
145
|
+
alignItems: 'center',
|
|
146
|
+
justifyContent: 'center',
|
|
147
|
+
width: '42px',
|
|
148
|
+
height: '42px',
|
|
149
|
+
borderRadius: '8px',
|
|
150
|
+
border: 'none',
|
|
151
|
+
backgroundColor: canSend
|
|
152
|
+
? btnHover
|
|
153
|
+
? T2V_COLORS.stormyTeal
|
|
154
|
+
: T2V_COLORS.accent
|
|
155
|
+
: T2V_COLORS.lightGray,
|
|
156
|
+
color: canSend ? T2V_COLORS.dark : T2V_COLORS.midGray,
|
|
157
|
+
cursor: canSend ? 'pointer' : 'not-allowed',
|
|
158
|
+
transition: 'background-color 0.15s ease, transform 0.15s ease',
|
|
159
|
+
transform: canSend && btnHover ? 'translateY(-1px)' : 'none',
|
|
160
|
+
flexShrink: 0,
|
|
161
|
+
}, "aria-label": "Send message", children: _jsxs("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("line", { x1: "22", y1: "2", x2: "11", y2: "13" }), _jsx("polygon", { points: "22 2 15 22 11 13 2 9 22 2" })] }) })] }));
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=ChatInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatInput.js","sourceRoot":"","sources":["../../src/react/ChatInput.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAc,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAS1D,MAAM,UAAU,SAAS,CAAC,EACxB,MAAM,EACN,QAAQ,GAAG,KAAK,EAChB,WAAW,GAAG,mBAAmB,EACjC,SAAS,GAAG,EAAE,GACC;IACf,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,WAAW,EAAE,GAAG,kBAAkB,EAAE,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5D,MAAM,gBAAgB,GAAG,MAAM,CAAuB,IAAI,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAG,MAAM,CAAS,EAAE,CAAC,CAAC;IAErC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;IACrD,MAAM,WAAW,GAAG,QAAQ,IAAI,cAAc,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;IAExE,MAAM,YAAY,GAAG,WAAW,CAC9B,CAAC,CAAkB,EAAE,EAAE;QACrB,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,OAAO,IAAI,QAAQ;YAAE,OAAO;QACjC,MAAM,CAAC,OAAO,CAAC,CAAC;QAChB,QAAQ,CAAC,EAAE,CAAC,CAAC;IACf,CAAC,EACD,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAC1B,CAAC;IAEF,MAAM,aAAa,GAAG,WAAW,CAC/B,CAAC,CAAsB,EAAE,EAAE;QACzB,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YACrC,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,YAAY,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,EACD,CAAC,YAAY,CAAC,CACf,CAAC;IAEF,MAAM,eAAe,GAAG,WAAW,CACjC,KAAK,EAAE,SAAe,EAAE,EAAE;QACxB,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;YAE5D,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;YAChC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,aAAa,GAAG,EAAE,CAAC,CAAC;YACvD,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;gBACzB,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;YACjD,CAAC;YACD,IAAI,WAAW,CAAC,WAAW,EAAE,CAAC;gBAC5B,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;YACvD,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;YAC/B,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,CAAC,IAAI,CAAC,CAAC;YACf,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;QAC7C,CAAC;gBAAS,CAAC;YACT,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC,EACD,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,CAAC,QAAQ,EAAE,WAAW,CAAC,WAAW,CAAC,CAC7D,CAAC;IAEF,MAAM,eAAe,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC7C,IAAI,WAAW,IAAI,gBAAgB,CAAC,OAAO,EAAE,CAAC;YAC5C,gBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAChC,OAAO;QACT,CAAC;QAED,IAAI,MAAM,GAAuB,IAAI,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACpE,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;YAChD,SAAS,CAAC,OAAO,GAAG,EAAE,CAAC;YAEvB,aAAa,CAAC,eAAe,GAAG,CAAC,CAAC,EAAE,EAAE;gBACpC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC;oBAAE,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACtD,CAAC,CAAC;YAEF,aAAa,CAAC,MAAM,GAAG,GAAG,EAAE;gBAC1B,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,IAAI,YAAY,CAAC;gBACxD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAClE,MAAO,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBACrD,SAAS,CAAC,OAAO,GAAG,EAAE,CAAC;gBACvB,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAC;gBAChC,cAAc,CAAC,KAAK,CAAC,CAAC;gBACtB,IAAI,SAAS,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;oBACvB,eAAe,CAAC,SAAS,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC,CAAC;YAEF,gBAAgB,CAAC,OAAO,GAAG,aAAa,CAAC;YACzC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,4DAA4D;YACvF,cAAc,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,EAAE,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACrD,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,EAAE,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC,CAAC;IAEnC,OAAO,CACL,gBACE,QAAQ,EAAE,YAAY,EACtB,SAAS,EAAE,kBAAkB,SAAS,EAAE,EACxC,KAAK,EAAE;YACL,OAAO,EAAE,MAAM;YACf,GAAG,EAAE,KAAK;YACV,OAAO,EAAE,MAAM;YACf,SAAS,EAAE,aAAa,UAAU,CAAC,SAAS,EAAE;YAC9C,eAAe,EAAE,UAAU,CAAC,KAAK;SAClC,aAED,gBACE,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACzC,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,EACpC,MAAM,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,EACpC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,WAAW,EAC5F,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE;oBACL,IAAI,EAAE,CAAC;oBACP,OAAO,EAAE,WAAW;oBACpB,YAAY,EAAE,KAAK;oBACnB,MAAM,EAAE,eAAe,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,EAAE;oBACnF,QAAQ,EAAE,MAAM;oBAChB,UAAU,EAAE,SAAS,CAAC,IAAI;oBAC1B,OAAO,EAAE,MAAM;oBACf,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;oBAC5D,KAAK,EAAE,UAAU,CAAC,IAAI;oBACtB,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,oCAAoC,CAAC,CAAC,CAAC,MAAM;oBACvE,UAAU,EAAE,gDAAgD;iBAC7D,GACD,EAEF,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,WAAW,EACrB,YAAY,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EACrC,YAAY,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,EACtC,KAAK,EAAE;oBACL,OAAO,EAAE,MAAM;oBACf,UAAU,EAAE,QAAQ;oBACpB,cAAc,EAAE,QAAQ;oBACxB,KAAK,EAAE,MAAM;oBACb,MAAM,EAAE,MAAM;oBACd,YAAY,EAAE,KAAK;oBACnB,MAAM,EAAE,MAAM;oBACd,eAAe,EAAE,WAAW;wBAC1B,CAAC,CAAC,UAAU,CAAC,QAAQ;wBACrB,CAAC,CAAC,cAAc;4BACd,CAAC,CAAC,UAAU,CAAC,SAAS;4BACtB,CAAC,CAAC,QAAQ;gCACR,CAAC,CAAC,UAAU,CAAC,UAAU;gCACvB,CAAC,CAAC,UAAU,CAAC,SAAS;oBAC5B,KAAK,EAAE,WAAW,IAAI,cAAc,IAAI,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO;oBACxF,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;oBAC/C,UAAU,EAAE,mDAAmD;oBAC/D,SAAS,EAAE,QAAQ,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,MAAM;oBACjE,UAAU,EAAE,CAAC;iBACd,EACD,KAAK,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,iEAAiE,CAAC,CAAC,CAAC,SAAS,gBAChG,WAAW,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,mBAAmB,YAExJ,cAAc,CAAC,CAAC,CAAC,CAChB,eACE,KAAK,EAAE;wBACL,OAAO,EAAE,cAAc;wBACvB,KAAK,EAAE,MAAM;wBACb,MAAM,EAAE,MAAM;wBACd,MAAM,EAAE,aAAa,UAAU,CAAC,KAAK,EAAE;wBACvC,cAAc,EAAE,aAAa;wBAC7B,YAAY,EAAE,KAAK;wBACnB,SAAS,EAAE,+BAA+B;qBAC3C,GACD,CACH,CAAC,CAAC,CAAC,CACF,eAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,KAAK,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,aAC9I,eAAM,CAAC,EAAC,sDAAsD,GAAG,EACjE,eAAM,CAAC,EAAC,4BAA4B,GAAG,EACvC,eAAM,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,GAAG,EACxC,eAAM,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,GAAG,IACnC,CACP,GACM,EAET,iBACE,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,CAAC,OAAO,EAClB,YAAY,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EACrC,YAAY,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,EACtC,KAAK,EAAE;oBACL,OAAO,EAAE,MAAM;oBACf,UAAU,EAAE,QAAQ;oBACpB,cAAc,EAAE,QAAQ;oBACxB,KAAK,EAAE,MAAM;oBACb,MAAM,EAAE,MAAM;oBACd,YAAY,EAAE,KAAK;oBACnB,MAAM,EAAE,MAAM;oBACd,eAAe,EAAE,OAAO;wBACtB,CAAC,CAAC,QAAQ;4BACR,CAAC,CAAC,UAAU,CAAC,UAAU;4BACvB,CAAC,CAAC,UAAU,CAAC,MAAM;wBACrB,CAAC,CAAC,UAAU,CAAC,SAAS;oBACxB,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO;oBACrD,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa;oBAC3C,UAAU,EAAE,mDAAmD;oBAC/D,SAAS,EAAE,OAAO,IAAI,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,MAAM;oBAC5D,UAAU,EAAE,CAAC;iBACd,gBACU,cAAc,YAGzB,eAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,KAAK,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,aAC9I,eAAM,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,GAAG,EACvC,kBAAS,MAAM,EAAC,2BAA2B,GAAG,IAC1C,GACC,IACJ,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ChatMessage — renders a single chat message bubble with markdown support.
|
|
3
|
+
*/
|
|
4
|
+
import type { DisplayMessage } from './useT2VChat';
|
|
5
|
+
export interface ChatMessageProps {
|
|
6
|
+
message: DisplayMessage;
|
|
7
|
+
className?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function ChatMessage({ message, className }: ChatMessageProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
//# sourceMappingURL=ChatMessage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatMessage.d.ts","sourceRoot":"","sources":["../../src/react/ChatMessage.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAMnD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,cAAc,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,SAAc,EAAE,EAAE,gBAAgB,2CAqExE"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* ChatMessage — renders a single chat message bubble with markdown support.
|
|
4
|
+
*/
|
|
5
|
+
import DOMPurify from 'dompurify';
|
|
6
|
+
import { marked } from 'marked';
|
|
7
|
+
import { useMemo } from 'react';
|
|
8
|
+
import { T2V_COLORS, T2V_FONTS } from './theme';
|
|
9
|
+
// Configure marked for inline-friendly output
|
|
10
|
+
marked.setOptions({ breaks: true, gfm: true });
|
|
11
|
+
export function ChatMessage({ message, className = '' }) {
|
|
12
|
+
const isUser = message.role === 'user';
|
|
13
|
+
const time = message.timestamp.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
|
|
14
|
+
const htmlContent = useMemo(() => {
|
|
15
|
+
if (isUser || !message.content)
|
|
16
|
+
return '';
|
|
17
|
+
const raw = marked.parse(message.content);
|
|
18
|
+
if (typeof raw !== 'string')
|
|
19
|
+
return '';
|
|
20
|
+
return DOMPurify.sanitize(raw);
|
|
21
|
+
}, [isUser, message.content]);
|
|
22
|
+
return (_jsx("div", { className: `t2v-message t2v-message--${message.role} ${className}`, style: {
|
|
23
|
+
display: 'flex',
|
|
24
|
+
justifyContent: isUser ? 'flex-end' : 'flex-start',
|
|
25
|
+
marginBottom: '12px',
|
|
26
|
+
animation: 't2v-fade-in 0.25s ease-out',
|
|
27
|
+
}, children: _jsxs("div", { style: {
|
|
28
|
+
maxWidth: '80%',
|
|
29
|
+
padding: '10px 14px',
|
|
30
|
+
borderRadius: isUser ? '14px 14px 4px 14px' : '14px 14px 14px 4px',
|
|
31
|
+
backgroundColor: isUser ? T2V_COLORS.dark : 'rgba(64, 212, 182, 0.08)',
|
|
32
|
+
color: isUser ? T2V_COLORS.light : T2V_COLORS.dark,
|
|
33
|
+
fontSize: '14px',
|
|
34
|
+
fontFamily: T2V_FONTS.body,
|
|
35
|
+
lineHeight: '1.55',
|
|
36
|
+
wordBreak: 'break-word',
|
|
37
|
+
...(isUser ? { whiteSpace: 'pre-wrap' } : {}),
|
|
38
|
+
}, children: [isUser ? (_jsx("div", { children: message.content })) : (_jsx("div", { className: "t2v-markdown", dangerouslySetInnerHTML: { __html: htmlContent } })), message.isStreaming && (_jsx("span", { style: {
|
|
39
|
+
display: 'inline-block',
|
|
40
|
+
width: '2px',
|
|
41
|
+
height: '14px',
|
|
42
|
+
backgroundColor: isUser ? T2V_COLORS.light : T2V_COLORS.turquoise,
|
|
43
|
+
marginLeft: '2px',
|
|
44
|
+
animation: 't2v-blink 1s infinite',
|
|
45
|
+
} })), _jsx("div", { style: {
|
|
46
|
+
fontSize: '10px',
|
|
47
|
+
fontFamily: T2V_FONTS.heading,
|
|
48
|
+
color: isUser ? 'rgba(248, 250, 252, 0.5)' : T2V_COLORS.midGray,
|
|
49
|
+
marginTop: '4px',
|
|
50
|
+
textAlign: 'right',
|
|
51
|
+
}, children: time })] }) }));
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=ChatMessage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatMessage.js","sourceRoot":"","sources":["../../src/react/ChatMessage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ChatPanel — self-contained, embeddable chat panel with tool support.
|
|
3
|
+
*
|
|
4
|
+
* Drop-in chat UI that handles authentication, tool registration,
|
|
5
|
+
* streaming, and the full interrupt/resume cycle.
|
|
6
|
+
*/
|
|
7
|
+
import React from 'react';
|
|
8
|
+
import type { ClientTool } from '../types';
|
|
9
|
+
export interface ChatPanelProps {
|
|
10
|
+
tools?: ClientTool[];
|
|
11
|
+
systemPrompt?: string;
|
|
12
|
+
signupUrl?: string;
|
|
13
|
+
className?: string;
|
|
14
|
+
style?: React.CSSProperties;
|
|
15
|
+
}
|
|
16
|
+
export declare function ChatPanel({ tools, systemPrompt, signupUrl, className, style, }: ChatPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
//# sourceMappingURL=ChatPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatPanel.d.ts","sourceRoot":"","sources":["../../src/react/ChatPanel.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAmD,MAAM,OAAO,CAAC;AACxE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AA0B3C,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED,wBAAgB,SAAS,CAAC,EACxB,KAAU,EACV,YAAY,EACZ,SAAS,EACT,SAAc,EACd,KAAK,GACN,EAAE,cAAc,2CA+lBhB"}
|