@talk2view/sdk 0.3.2 → 0.5.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/dist/client.d.ts +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +4 -4
- package/dist/client.js.map +1 -1
- package/dist/event-emitter.d.ts +7 -0
- package/dist/event-emitter.d.ts.map +1 -0
- package/dist/event-emitter.js +23 -0
- package/dist/event-emitter.js.map +1 -0
- package/dist/index.d.ts +78 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +312 -6
- package/dist/index.js.map +1 -1
- package/dist/react/T2VProvider.js +1 -1
- package/dist/react/T2VProvider.js.map +1 -1
- package/dist/react/index.d.ts +2 -1
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/useT2VChat.d.ts +6 -22
- package/dist/react/useT2VChat.d.ts.map +1 -1
- package/dist/react/useT2VChat.js +34 -218
- package/dist/react/useT2VChat.js.map +1 -1
- package/dist/sessions.d.ts.map +1 -1
- package/dist/sessions.js +3 -0
- package/dist/sessions.js.map +1 -1
- package/dist/tools.d.ts +5 -0
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +16 -2
- package/dist/tools.js.map +1 -1
- package/dist/types.d.ts +45 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/components/ApprovalCard.d.ts +10 -0
- package/dist/ui/components/ApprovalCard.d.ts.map +1 -0
- package/dist/ui/components/ApprovalCard.js +60 -0
- package/dist/ui/components/ApprovalCard.js.map +1 -0
- package/dist/ui/components/{T2VChatHeader.d.ts → ChatHeader.d.ts} +4 -4
- package/dist/ui/components/ChatHeader.d.ts.map +1 -0
- package/dist/ui/components/ChatHeader.js +126 -0
- package/dist/ui/components/ChatHeader.js.map +1 -0
- package/dist/ui/components/ChatPanel.d.ts +9 -0
- package/dist/ui/components/ChatPanel.d.ts.map +1 -0
- package/dist/ui/components/ChatPanel.js +37 -0
- package/dist/ui/components/ChatPanel.js.map +1 -0
- package/dist/ui/components/ChatWidget.d.ts +5 -0
- package/dist/ui/components/ChatWidget.d.ts.map +1 -0
- package/dist/ui/components/ChatWidget.js +27 -0
- package/dist/ui/components/ChatWidget.js.map +1 -0
- package/dist/ui/components/CodeBlock.d.ts +6 -0
- package/dist/ui/components/CodeBlock.d.ts.map +1 -0
- package/dist/ui/components/CodeBlock.js +79 -0
- package/dist/ui/components/CodeBlock.js.map +1 -0
- package/dist/ui/components/Composer.d.ts +14 -0
- package/dist/ui/components/Composer.d.ts.map +1 -0
- package/dist/ui/components/Composer.js +172 -0
- package/dist/ui/components/Composer.js.map +1 -0
- package/dist/ui/components/LoginForm.d.ts +5 -0
- package/dist/ui/components/LoginForm.d.ts.map +1 -0
- package/dist/ui/components/LoginForm.js +37 -0
- package/dist/ui/components/LoginForm.js.map +1 -0
- package/dist/ui/components/MarkdownRenderer.d.ts +5 -0
- package/dist/ui/components/MarkdownRenderer.d.ts.map +1 -0
- package/dist/ui/components/MarkdownRenderer.js +28 -0
- package/dist/ui/components/MarkdownRenderer.js.map +1 -0
- package/dist/ui/components/MessageActions.d.ts +6 -0
- package/dist/ui/components/MessageActions.d.ts.map +1 -0
- package/dist/ui/components/MessageActions.js +43 -0
- package/dist/ui/components/MessageActions.js.map +1 -0
- package/dist/ui/components/MessageBubble.d.ts +16 -0
- package/dist/ui/components/MessageBubble.d.ts.map +1 -0
- package/dist/ui/components/MessageBubble.js +71 -0
- package/dist/ui/components/MessageBubble.js.map +1 -0
- package/dist/ui/components/MessageList.d.ts +10 -0
- package/dist/ui/components/MessageList.d.ts.map +1 -0
- package/dist/ui/components/MessageList.js +69 -0
- package/dist/ui/components/MessageList.js.map +1 -0
- package/dist/ui/components/SettingsPanel.d.ts +11 -0
- package/dist/ui/components/SettingsPanel.d.ts.map +1 -0
- package/dist/ui/components/{SettingsView.js → SettingsPanel.js} +27 -27
- package/dist/ui/components/SettingsPanel.js.map +1 -0
- package/dist/ui/components/Shimmer.d.ts +2 -0
- package/dist/ui/components/Shimmer.d.ts.map +1 -0
- package/dist/ui/components/Shimmer.js +10 -0
- package/dist/ui/components/Shimmer.js.map +1 -0
- package/dist/ui/components/Talk2View.d.ts +21 -0
- package/dist/ui/components/Talk2View.d.ts.map +1 -0
- package/dist/ui/components/Talk2View.js +79 -0
- package/dist/ui/components/Talk2View.js.map +1 -0
- package/dist/ui/components/ThinkingBlock.d.ts +7 -0
- package/dist/ui/components/ThinkingBlock.d.ts.map +1 -0
- package/dist/ui/components/ThinkingBlock.js +64 -0
- package/dist/ui/components/ThinkingBlock.js.map +1 -0
- package/dist/ui/components/ToolDisplay.d.ts +28 -0
- package/dist/ui/components/ToolDisplay.d.ts.map +1 -0
- package/dist/ui/components/ToolDisplay.js +123 -0
- package/dist/ui/components/ToolDisplay.js.map +1 -0
- package/dist/ui/components/WelcomeScreen.d.ts +6 -0
- package/dist/ui/components/WelcomeScreen.d.ts.map +1 -0
- package/dist/ui/components/WelcomeScreen.js +18 -0
- package/dist/ui/components/WelcomeScreen.js.map +1 -0
- package/dist/ui/context.d.ts +29 -0
- package/dist/ui/context.d.ts.map +1 -0
- package/dist/ui/context.js +16 -0
- package/dist/ui/context.js.map +1 -0
- package/dist/ui/index.d.ts +24 -37
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +23 -35
- package/dist/ui/index.js.map +1 -1
- package/dist/ui/styles.d.ts +2 -0
- package/dist/ui/styles.d.ts.map +1 -0
- package/dist/ui/styles.js +91 -0
- package/dist/ui/styles.js.map +1 -0
- package/dist/ui/theme.d.ts +11 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +70 -0
- package/dist/ui/theme.js.map +1 -0
- package/package.json +5 -10
- package/dist/ui/components/LoginModal.d.ts +0 -10
- package/dist/ui/components/LoginModal.d.ts.map +0 -1
- package/dist/ui/components/LoginModal.js +0 -138
- package/dist/ui/components/LoginModal.js.map +0 -1
- package/dist/ui/components/SettingsView.d.ts +0 -11
- package/dist/ui/components/SettingsView.d.ts.map +0 -1
- package/dist/ui/components/SettingsView.js.map +0 -1
- package/dist/ui/components/T2VAssistantModal.d.ts +0 -31
- package/dist/ui/components/T2VAssistantModal.d.ts.map +0 -1
- package/dist/ui/components/T2VAssistantModal.js +0 -151
- package/dist/ui/components/T2VAssistantModal.js.map +0 -1
- package/dist/ui/components/T2VAssistantProvider.d.ts +0 -42
- package/dist/ui/components/T2VAssistantProvider.d.ts.map +0 -1
- package/dist/ui/components/T2VAssistantProvider.js +0 -66
- package/dist/ui/components/T2VAssistantProvider.js.map +0 -1
- package/dist/ui/components/T2VChatHeader.d.ts.map +0 -1
- package/dist/ui/components/T2VChatHeader.js +0 -112
- package/dist/ui/components/T2VChatHeader.js.map +0 -1
- package/dist/ui/components/T2VComposer.d.ts +0 -11
- package/dist/ui/components/T2VComposer.d.ts.map +0 -1
- package/dist/ui/components/T2VComposer.js +0 -124
- package/dist/ui/components/T2VComposer.js.map +0 -1
- package/dist/ui/components/T2VDictationAdapter.d.ts +0 -18
- package/dist/ui/components/T2VDictationAdapter.d.ts.map +0 -1
- package/dist/ui/components/T2VDictationAdapter.js +0 -126
- package/dist/ui/components/T2VDictationAdapter.js.map +0 -1
- package/dist/ui/components/T2VLoginGate.d.ts +0 -23
- package/dist/ui/components/T2VLoginGate.d.ts.map +0 -1
- package/dist/ui/components/T2VLoginGate.js +0 -11
- package/dist/ui/components/T2VLoginGate.js.map +0 -1
- package/dist/ui/components/T2VThread.d.ts +0 -25
- package/dist/ui/components/T2VThread.d.ts.map +0 -1
- package/dist/ui/components/T2VThread.js +0 -66
- package/dist/ui/components/T2VThread.js.map +0 -1
- package/dist/ui/components/T2VToolFallback.d.ts +0 -11
- package/dist/ui/components/T2VToolFallback.d.ts.map +0 -1
- package/dist/ui/components/T2VToolFallback.js +0 -209
- package/dist/ui/components/T2VToolFallback.js.map +0 -1
- package/dist/ui/runtime/convertMessage.d.ts +0 -17
- package/dist/ui/runtime/convertMessage.d.ts.map +0 -1
- package/dist/ui/runtime/convertMessage.js +0 -77
- package/dist/ui/runtime/convertMessage.js.map +0 -1
- package/dist/ui/runtime/useT2VRuntime.d.ts +0 -42
- package/dist/ui/runtime/useT2VRuntime.d.ts.map +0 -1
- package/dist/ui/runtime/useT2VRuntime.js +0 -62
- package/dist/ui/runtime/useT2VRuntime.js.map +0 -1
- package/dist/ui/themes/tailwind-preset.d.ts +0 -43
- package/dist/ui/themes/tailwind-preset.d.ts.map +0 -1
- package/dist/ui/themes/tailwind-preset.js +0 -43
- package/dist/ui/themes/tailwind-preset.js.map +0 -1
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { Zap, ChevronDown } from 'lucide-react';
|
|
4
|
+
export function ApprovalCard({ toolName, toolCallId, args, description, onDecision }) {
|
|
5
|
+
const [showArgs, setShowArgs] = useState(false);
|
|
6
|
+
const [editing, setEditing] = useState(false);
|
|
7
|
+
const [editedArgs, setEditedArgs] = useState(JSON.stringify(args, null, 2));
|
|
8
|
+
const [editError, setEditError] = useState(null);
|
|
9
|
+
const [showDeny, setShowDeny] = useState(false);
|
|
10
|
+
const [denyFeedback, setDenyFeedback] = useState('');
|
|
11
|
+
const handleApprove = (action) => {
|
|
12
|
+
let updatedInput;
|
|
13
|
+
if (editing) {
|
|
14
|
+
try {
|
|
15
|
+
updatedInput = JSON.parse(editedArgs);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
setEditError('Invalid JSON');
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
Promise.resolve(onDecision({ action, updatedInput })).catch(() => { });
|
|
23
|
+
};
|
|
24
|
+
const handleDeny = () => {
|
|
25
|
+
Promise.resolve(onDecision({ action: 'deny', feedback: denyFeedback || undefined })).catch(() => { });
|
|
26
|
+
};
|
|
27
|
+
const cardStyle = {
|
|
28
|
+
border: '1px solid var(--t2v-border)',
|
|
29
|
+
borderRadius: 'calc(var(--t2v-radius) * 0.75px)',
|
|
30
|
+
overflow: 'hidden', margin: '8px 0',
|
|
31
|
+
animation: 't2v-fade-in 0.2s ease-out',
|
|
32
|
+
fontSize: '13px', fontFamily: 'var(--t2v-font)',
|
|
33
|
+
};
|
|
34
|
+
const btnBase = {
|
|
35
|
+
padding: '6px 12px', borderRadius: '6px', border: 'none',
|
|
36
|
+
cursor: 'pointer', fontSize: '12px', fontWeight: 500,
|
|
37
|
+
fontFamily: 'var(--t2v-font)', transition: 'all 0.15s',
|
|
38
|
+
};
|
|
39
|
+
return (_jsxs("div", { style: cardStyle, role: "region", "aria-label": `Tool approval required: ${toolName}`, children: [_jsxs("div", { style: {
|
|
40
|
+
display: 'flex', alignItems: 'center', gap: '8px',
|
|
41
|
+
padding: '10px 12px', background: 'var(--t2v-surface)',
|
|
42
|
+
borderBottom: '1px solid var(--t2v-border)', fontWeight: 500,
|
|
43
|
+
}, children: [_jsx("span", { style: { color: 'var(--t2v-accent)', display: 'inline-flex' }, children: _jsx(Zap, { size: 14 }) }), _jsx("span", { children: toolName }), description && (_jsxs("span", { style: { color: 'var(--t2v-muted)', fontWeight: 400, fontSize: '12px' }, children: ["\u2014 ", description] }))] }), _jsxs("div", { style: { padding: '10px 12px' }, children: [Object.keys(args).length > 0 && (_jsx("button", { onClick: () => { setShowArgs(!showArgs); setEditing(false); setEditError(null); }, style: { ...btnBase, background: 'transparent', color: 'var(--t2v-muted)', padding: '4px 0', fontSize: '12px' }, children: _jsxs(_Fragment, { children: [_jsx(ChevronDown, { size: 12, style: { transform: showArgs ? 'rotate(180deg)' : 'rotate(0deg)', transition: 'transform 0.2s ease', display: 'inline-block' } }), " ", showArgs ? 'Hide arguments' : 'Show arguments'] }) })), showArgs && (_jsxs("div", { style: { margin: '6px 0' }, children: [editing ? (_jsxs(_Fragment, { children: [_jsx("textarea", { value: editedArgs, onChange: (e) => { setEditedArgs(e.target.value); setEditError(null); }, style: {
|
|
44
|
+
width: '100%', minHeight: '80px', padding: '8px',
|
|
45
|
+
fontFamily: 'var(--t2v-font-mono)', fontSize: '12px',
|
|
46
|
+
border: `1px solid ${editError ? 'var(--t2v-error)' : 'var(--t2v-border)'}`,
|
|
47
|
+
borderRadius: '4px', resize: 'vertical',
|
|
48
|
+
background: 'var(--t2v-bg)', color: 'var(--t2v-foreground)',
|
|
49
|
+
} }), editError && _jsx("div", { style: { color: 'var(--t2v-error)', fontSize: '11px', marginTop: '4px' }, children: editError })] })) : (_jsx("pre", { style: {
|
|
50
|
+
padding: '8px', background: 'var(--t2v-surface)', borderRadius: '4px',
|
|
51
|
+
fontSize: '12px', fontFamily: 'var(--t2v-font-mono)',
|
|
52
|
+
overflow: 'auto', maxHeight: '120px', margin: 0,
|
|
53
|
+
}, children: JSON.stringify(args, null, 2) })), _jsx("button", { onClick: () => setEditing(!editing), style: { ...btnBase, background: 'transparent', color: 'var(--t2v-accent)', padding: '4px 0', fontSize: '11px', marginTop: '4px' }, children: editing ? 'Cancel edit' : 'Edit' })] })), showDeny && (_jsx("div", { style: { margin: '8px 0' }, children: _jsx("input", { type: "text", placeholder: "Reason for denying (optional)", value: denyFeedback, onChange: (e) => setDenyFeedback(e.target.value), onKeyDown: (e) => { if (e.key === 'Enter')
|
|
54
|
+
handleDeny(); }, style: {
|
|
55
|
+
width: '100%', padding: '6px 8px', border: '1px solid var(--t2v-border)',
|
|
56
|
+
borderRadius: '4px', fontSize: '12px', fontFamily: 'var(--t2v-font)',
|
|
57
|
+
background: 'var(--t2v-bg)', color: 'var(--t2v-foreground)',
|
|
58
|
+
} }) })), _jsxs("div", { style: { display: 'flex', gap: '6px', marginTop: '8px', flexWrap: 'wrap' }, children: [_jsx("button", { onClick: () => handleApprove('once'), className: "t2v-btn", style: { ...btnBase, background: 'var(--t2v-accent)', color: 'var(--t2v-accent-foreground)' }, children: "Allow Once" }), _jsx("button", { onClick: () => handleApprove('always'), className: "t2v-btn", style: { ...btnBase, background: 'transparent', border: '1px solid var(--t2v-accent)', color: 'var(--t2v-accent)' }, children: "Allow Always" }), showDeny ? (_jsx("button", { onClick: handleDeny, className: "t2v-btn", style: { ...btnBase, background: 'rgba(220,38,38,0.08)', color: 'var(--t2v-error)' }, children: "Confirm Deny" })) : (_jsx("button", { onClick: () => setShowDeny(true), className: "t2v-btn", style: { ...btnBase, background: 'transparent', color: 'var(--t2v-muted)' }, children: "Deny" }))] })] })] }));
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=ApprovalCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApprovalCard.js","sourceRoot":"","sources":["../../../src/ui/components/ApprovalCard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* ChatHeader — header bar for the chat panel.
|
|
3
3
|
*
|
|
4
4
|
* Shows the Talk2View logo + title, with a three-dot dropdown menu
|
|
5
5
|
* containing Settings and Sign Out options. In settings view, shows
|
|
6
6
|
* a back button instead.
|
|
7
7
|
*/
|
|
8
|
-
export interface
|
|
8
|
+
export interface ChatHeaderProps {
|
|
9
9
|
view: 'chat' | 'settings';
|
|
10
10
|
onSettingsClick: () => void;
|
|
11
11
|
onBackClick: () => void;
|
|
12
12
|
onNewChat: () => void;
|
|
13
13
|
onSignOut: () => void;
|
|
14
14
|
}
|
|
15
|
-
export declare function
|
|
16
|
-
//# sourceMappingURL=
|
|
15
|
+
export declare function ChatHeader({ view, onSettingsClick, onBackClick, onNewChat, onSignOut }: ChatHeaderProps): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
//# sourceMappingURL=ChatHeader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatHeader.d.ts","sourceRoot":"","sources":["../../../src/ui/components/ChatHeader.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IAC1B,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,wBAAgB,UAAU,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,eAAe,2CAkIvG"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* ChatHeader — header bar for the chat panel.
|
|
4
|
+
*
|
|
5
|
+
* Shows the Talk2View logo + title, with a three-dot dropdown menu
|
|
6
|
+
* containing Settings and Sign Out options. In settings view, shows
|
|
7
|
+
* a back button instead.
|
|
8
|
+
*/
|
|
9
|
+
import { useState, useEffect } from 'react';
|
|
10
|
+
import { Settings, LogOut, Plus, ArrowLeft, MoreVertical } from 'lucide-react';
|
|
11
|
+
import { LOGOS } from '../theme';
|
|
12
|
+
export function ChatHeader({ view, onSettingsClick, onBackClick, onNewChat, onSignOut }) {
|
|
13
|
+
const [menuOpen, setMenuOpen] = useState(false);
|
|
14
|
+
// Close dropdown on Escape key
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
if (!menuOpen)
|
|
17
|
+
return;
|
|
18
|
+
const handler = (e) => {
|
|
19
|
+
if (e.key === 'Escape')
|
|
20
|
+
setMenuOpen(false);
|
|
21
|
+
};
|
|
22
|
+
document.addEventListener('keydown', handler);
|
|
23
|
+
return () => document.removeEventListener('keydown', handler);
|
|
24
|
+
}, [menuOpen]);
|
|
25
|
+
return (_jsxs("div", { style: {
|
|
26
|
+
display: 'flex',
|
|
27
|
+
alignItems: 'center',
|
|
28
|
+
justifyContent: 'space-between',
|
|
29
|
+
padding: '10px 14px',
|
|
30
|
+
borderBottom: '1px solid var(--t2v-border)',
|
|
31
|
+
flexShrink: 0,
|
|
32
|
+
}, children: [_jsx("div", { style: { display: 'flex', alignItems: 'center', gap: '8px' }, children: view === 'settings' ? (_jsxs(_Fragment, { children: [_jsx(HeaderButton, { onClick: onBackClick, "aria-label": "Back to chat", children: _jsx(BackIcon, {}) }), _jsx("span", { style: {
|
|
33
|
+
fontSize: '14px',
|
|
34
|
+
fontWeight: 600,
|
|
35
|
+
fontFamily: 'var(--t2v-font)',
|
|
36
|
+
color: 'var(--t2v-foreground)',
|
|
37
|
+
}, children: "Settings" })] })) : (_jsxs(_Fragment, { children: [_jsx("img", { src: LOGOS.icon, alt: "", style: { width: 20, height: 20 } }), _jsx("span", { style: {
|
|
38
|
+
fontSize: '14px',
|
|
39
|
+
fontWeight: 600,
|
|
40
|
+
fontFamily: 'var(--t2v-font)',
|
|
41
|
+
color: 'var(--t2v-foreground)',
|
|
42
|
+
}, children: "Talk2View" })] })) }), view === 'chat' && (_jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '2px', position: 'relative' }, children: [_jsxs("button", { onClick: onNewChat, "aria-label": "New chat", style: {
|
|
43
|
+
display: 'flex',
|
|
44
|
+
alignItems: 'center',
|
|
45
|
+
gap: '4px',
|
|
46
|
+
padding: '4px 10px',
|
|
47
|
+
borderRadius: '6px',
|
|
48
|
+
border: '1px solid var(--t2v-border)',
|
|
49
|
+
backgroundColor: 'transparent',
|
|
50
|
+
color: 'var(--t2v-foreground)',
|
|
51
|
+
fontSize: '12px',
|
|
52
|
+
fontFamily: 'var(--t2v-font)',
|
|
53
|
+
fontWeight: 500,
|
|
54
|
+
cursor: 'pointer',
|
|
55
|
+
transition: 'background-color 0.15s ease',
|
|
56
|
+
}, onMouseEnter: (e) => { e.currentTarget.style.backgroundColor = 'var(--t2v-border)'; }, onMouseLeave: (e) => { e.currentTarget.style.backgroundColor = 'transparent'; }, children: [_jsx(NewChatIcon, {}), "Clear Chat"] }), _jsx(HeaderButton, { onClick: () => setMenuOpen((v) => !v), "aria-label": "Menu", children: _jsx(EllipsisIcon, {}) }), menuOpen && (_jsxs(_Fragment, { children: [_jsx("div", { onClick: () => setMenuOpen(false), style: { position: 'fixed', inset: 0, zIndex: 49 } }), _jsxs("div", { role: "menu", style: {
|
|
57
|
+
position: 'absolute',
|
|
58
|
+
top: '100%',
|
|
59
|
+
right: 0,
|
|
60
|
+
marginTop: '4px',
|
|
61
|
+
minWidth: '140px',
|
|
62
|
+
borderRadius: '8px',
|
|
63
|
+
border: '1px solid var(--t2v-border)',
|
|
64
|
+
backgroundColor: 'var(--t2v-bg)',
|
|
65
|
+
boxShadow: '0 4px 16px rgba(1, 22, 30, 0.12)',
|
|
66
|
+
zIndex: 50,
|
|
67
|
+
overflow: 'hidden',
|
|
68
|
+
animation: 't2v-fade-in 0.15s ease-out',
|
|
69
|
+
}, children: [_jsxs(DropdownItem, { onClick: () => { setMenuOpen(false); onSettingsClick(); }, children: [_jsx(SettingsIcon, {}), "Settings"] }), _jsxs(DropdownItem, { onClick: () => { setMenuOpen(false); onSignOut(); }, danger: true, children: [_jsx(SignOutIcon, {}), "Sign out"] })] })] }))] }))] }));
|
|
70
|
+
}
|
|
71
|
+
/* ── Small sub-components ─────────────────────────────────────── */
|
|
72
|
+
function HeaderButton(props) {
|
|
73
|
+
const [hovered, setHovered] = useState(false);
|
|
74
|
+
return (_jsx("button", { ...props, onMouseEnter: () => setHovered(true), onMouseLeave: () => setHovered(false), style: {
|
|
75
|
+
display: 'flex',
|
|
76
|
+
alignItems: 'center',
|
|
77
|
+
justifyContent: 'center',
|
|
78
|
+
width: '28px',
|
|
79
|
+
height: '28px',
|
|
80
|
+
borderRadius: '6px',
|
|
81
|
+
border: 'none',
|
|
82
|
+
backgroundColor: hovered ? 'var(--t2v-border)' : 'transparent',
|
|
83
|
+
color: 'var(--t2v-muted)',
|
|
84
|
+
cursor: 'pointer',
|
|
85
|
+
padding: 0,
|
|
86
|
+
transition: 'background-color 0.15s ease',
|
|
87
|
+
} }));
|
|
88
|
+
}
|
|
89
|
+
function DropdownItem({ children, onClick, danger, }) {
|
|
90
|
+
const [hovered, setHovered] = useState(false);
|
|
91
|
+
return (_jsx("button", { role: "menuitem", onClick: onClick, onMouseEnter: () => setHovered(true), onMouseLeave: () => setHovered(false), style: {
|
|
92
|
+
display: 'flex',
|
|
93
|
+
alignItems: 'center',
|
|
94
|
+
gap: '8px',
|
|
95
|
+
width: '100%',
|
|
96
|
+
padding: '8px 12px',
|
|
97
|
+
border: 'none',
|
|
98
|
+
backgroundColor: hovered
|
|
99
|
+
? danger ? 'rgba(220,38,38,0.06)' : 'var(--t2v-border)'
|
|
100
|
+
: 'transparent',
|
|
101
|
+
color: danger ? 'var(--t2v-error)' : 'var(--t2v-foreground)',
|
|
102
|
+
fontSize: '13px',
|
|
103
|
+
fontFamily: 'var(--t2v-font)',
|
|
104
|
+
fontWeight: 500,
|
|
105
|
+
cursor: 'pointer',
|
|
106
|
+
textAlign: 'left',
|
|
107
|
+
transition: 'background-color 0.15s ease',
|
|
108
|
+
}, children: children }));
|
|
109
|
+
}
|
|
110
|
+
/* ── Icons (Lucide React) ─────────────────────────────────────── */
|
|
111
|
+
function NewChatIcon() {
|
|
112
|
+
return _jsx(Plus, { size: 14 });
|
|
113
|
+
}
|
|
114
|
+
function BackIcon() {
|
|
115
|
+
return _jsx(ArrowLeft, { size: 16 });
|
|
116
|
+
}
|
|
117
|
+
function EllipsisIcon() {
|
|
118
|
+
return _jsx(MoreVertical, { size: 16 });
|
|
119
|
+
}
|
|
120
|
+
function SettingsIcon() {
|
|
121
|
+
return _jsx(Settings, { size: 14 });
|
|
122
|
+
}
|
|
123
|
+
function SignOutIcon() {
|
|
124
|
+
return _jsx(LogOut, { size: 14 });
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=ChatHeader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatHeader.js","sourceRoot":"","sources":["../../../src/ui/components/ChatHeader.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface ChatPanelProps {
|
|
2
|
+
welcome?: {
|
|
3
|
+
heading?: string;
|
|
4
|
+
suggestions?: string[];
|
|
5
|
+
};
|
|
6
|
+
signupUrl?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function ChatPanel({ welcome, signupUrl }: ChatPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
//# sourceMappingURL=ChatPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatPanel.d.ts","sourceRoot":"","sources":["../../../src/ui/components/ChatPanel.tsx"],"names":[],"mappings":"AAaA,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,SAAS,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,cAAc,2CAkD/D"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useEffect } from 'react';
|
|
3
|
+
import { useTalk2View, useChat } from '../context';
|
|
4
|
+
import { ChatHeader } from './ChatHeader';
|
|
5
|
+
import { LoginForm } from './LoginForm';
|
|
6
|
+
import { MessageList } from './MessageList';
|
|
7
|
+
import { Composer } from './Composer';
|
|
8
|
+
import { WelcomeScreen } from './WelcomeScreen';
|
|
9
|
+
import { SettingsPanel } from './SettingsPanel';
|
|
10
|
+
import { useUserPreferences } from '../../react/useUserPreferences';
|
|
11
|
+
import { usePartnerConfig } from '../../react/usePartnerConfig';
|
|
12
|
+
const FONT_SCALE = { small: 0.75, medium: 0.875, large: 1 };
|
|
13
|
+
export function ChatPanel({ welcome, signupUrl }) {
|
|
14
|
+
const { isAuthenticated, t2v } = useTalk2View();
|
|
15
|
+
const { messages, clearMessages } = useChat();
|
|
16
|
+
const { preferences } = useUserPreferences();
|
|
17
|
+
const { config: partnerConfig } = usePartnerConfig();
|
|
18
|
+
const [view, setView] = useState('chat');
|
|
19
|
+
const fontSize = FONT_SCALE[preferences.fontSize ?? 'medium'] ?? 0.875;
|
|
20
|
+
const modelId = preferences.model || t2v.config.model || partnerConfig?.default_llm_model || '';
|
|
21
|
+
const modelDisplay = modelId.replace(/^openrouter\//, '');
|
|
22
|
+
useEffect(() => { if (!isAuthenticated)
|
|
23
|
+
setView('chat'); }, [isAuthenticated]);
|
|
24
|
+
return (_jsxs("div", { style: {
|
|
25
|
+
display: 'flex', flexDirection: 'column', height: '100%',
|
|
26
|
+
background: 'var(--t2v-bg)', fontSize: `${fontSize}rem`, fontFamily: 'var(--t2v-font)',
|
|
27
|
+
}, children: [isAuthenticated && (_jsx(ChatHeader, { view: view, onSettingsClick: () => setView('settings'), onBackClick: () => setView('chat'), onNewChat: () => clearMessages(), onSignOut: () => t2v.auth.logout() })), !isAuthenticated ? (_jsx(LoginForm, { signupUrl: signupUrl })) : view === 'settings' ? (_jsx("div", { style: { flex: 1, overflow: 'auto' }, children: _jsx(SettingsPanel, { hideHeader: true }) })) : messages.length === 0 ? (_jsx(WelcomeScreen, { heading: welcome?.heading, suggestions: welcome?.suggestions })) : (_jsx(MessageList, {})), isAuthenticated && view === 'chat' && modelDisplay && (_jsx("div", { style: {
|
|
28
|
+
display: 'flex', alignItems: 'center', justifyContent: 'center',
|
|
29
|
+
padding: '4px 12px',
|
|
30
|
+
fontSize: '10px',
|
|
31
|
+
fontFamily: 'var(--t2v-font-mono)',
|
|
32
|
+
color: 'var(--t2v-muted)',
|
|
33
|
+
letterSpacing: '0.3px',
|
|
34
|
+
borderTop: '1px solid var(--t2v-border)',
|
|
35
|
+
}, children: modelDisplay })), isAuthenticated && view === 'chat' && _jsx(Composer, {})] }));
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=ChatPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatPanel.js","sourceRoot":"","sources":["../../../src/ui/components/ChatPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatWidget.d.ts","sourceRoot":"","sources":["../../../src/ui/components/ChatWidget.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAa,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7D,MAAM,WAAW,eAAgB,SAAQ,cAAc;CAAG;AAE1D,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,2CAmChD"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { X } from 'lucide-react';
|
|
4
|
+
import { ChatPanel } from './ChatPanel';
|
|
5
|
+
import { LOGOS } from '../theme';
|
|
6
|
+
export function ChatWidget(props) {
|
|
7
|
+
const [open, setOpen] = useState(false);
|
|
8
|
+
return (_jsxs(_Fragment, { children: [open && (_jsx("div", { style: {
|
|
9
|
+
position: 'fixed', bottom: 'clamp(70px, 5vw + 50px, 100px)',
|
|
10
|
+
right: 'clamp(16px, 3vw, 24px)',
|
|
11
|
+
width: 'min(400px, calc(100vw - 32px))',
|
|
12
|
+
height: 'min(70vh, 600px)',
|
|
13
|
+
borderRadius: 'calc(var(--t2v-radius) * 1px)',
|
|
14
|
+
border: '1px solid var(--t2v-border)',
|
|
15
|
+
boxShadow: '0 8px 32px rgba(0,0,0,0.12)',
|
|
16
|
+
overflow: 'hidden', zIndex: 999998,
|
|
17
|
+
animation: 't2v-fade-in 0.2s ease-out', background: 'var(--t2v-bg)',
|
|
18
|
+
}, children: _jsx(ChatPanel, { ...props }) })), _jsx("button", { onClick: () => setOpen(!open), className: "t2v-btn", style: {
|
|
19
|
+
position: 'fixed', bottom: 'clamp(16px, 3vw, 24px)', right: 'clamp(16px, 3vw, 24px)',
|
|
20
|
+
width: 52, height: 52, borderRadius: '50%', border: 'none', cursor: 'pointer',
|
|
21
|
+
background: 'var(--t2v-accent)', color: 'var(--t2v-accent-foreground)',
|
|
22
|
+
display: 'flex', alignItems: 'center', justifyContent: 'center',
|
|
23
|
+
boxShadow: '0 4px 16px rgba(0,0,0,0.15)', zIndex: 999999,
|
|
24
|
+
transition: 'transform 0.2s', transform: open ? 'scale(0.9)' : 'scale(1)',
|
|
25
|
+
}, children: open ? (_jsx(X, { size: 20 })) : (_jsx("img", { src: LOGOS.icon, alt: "Talk2View", style: { width: 28, height: 28 } })) })] }));
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=ChatWidget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatWidget.js","sourceRoot":"","sources":["../../../src/ui/components/ChatWidget.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AACjC,OAAO,EAAE,SAAS,EAAuB,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAIjC,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,OAAO,CACL,8BACG,IAAI,IAAI,CACP,cAAK,KAAK,EAAE;oBACV,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,gCAAgC;oBAC3D,KAAK,EAAE,wBAAwB;oBAC/B,KAAK,EAAE,gCAAgC;oBACvC,MAAM,EAAE,kBAAkB;oBAC1B,YAAY,EAAE,+BAA+B;oBAC7C,MAAM,EAAE,6BAA6B;oBACrC,SAAS,EAAE,6BAA6B;oBACxC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM;oBAClC,SAAS,EAAE,2BAA2B,EAAE,UAAU,EAAE,eAAe;iBACpE,YACC,KAAC,SAAS,OAAK,KAAK,GAAI,GACpB,CACP,EACD,iBAAQ,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,SAAS,EAAC,SAAS,EAAC,KAAK,EAAE;oBAChE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,wBAAwB,EAAE,KAAK,EAAE,wBAAwB;oBACpF,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS;oBAC7E,UAAU,EAAE,mBAAmB,EAAE,KAAK,EAAE,8BAA8B;oBACtE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ;oBAC/D,SAAS,EAAE,6BAA6B,EAAE,MAAM,EAAE,MAAM;oBACxD,UAAU,EAAE,gBAAgB,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU;iBAC1E,YACE,IAAI,CAAC,CAAC,CAAC,CACN,KAAC,CAAC,IAAC,IAAI,EAAE,EAAE,GAAI,CAChB,CAAC,CAAC,CAAC,CACF,cAAK,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAC,WAAW,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,GAAI,CAC3E,GACM,IACR,CACJ,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodeBlock.d.ts","sourceRoot":"","sources":["../../../src/ui/components/CodeBlock.tsx"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAgBD,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,cAAc,2CAmF3D"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useEffect, useRef } from 'react';
|
|
3
|
+
import { Copy, Check } from 'lucide-react';
|
|
4
|
+
let highlighterPromise = null;
|
|
5
|
+
async function getHighlighter() {
|
|
6
|
+
if (!highlighterPromise) {
|
|
7
|
+
highlighterPromise = import('shiki/bundle/web').then((mod) => mod.createHighlighter({
|
|
8
|
+
themes: ['github-light'],
|
|
9
|
+
langs: ['typescript', 'javascript', 'python', 'bash', 'json', 'html', 'css', 'sql', 'markdown', 'yaml', 'xml', 'java', 'go', 'rust', 'c', 'cpp'],
|
|
10
|
+
}));
|
|
11
|
+
}
|
|
12
|
+
return highlighterPromise;
|
|
13
|
+
}
|
|
14
|
+
export function CodeBlock({ code, language }) {
|
|
15
|
+
const [copied, setCopied] = useState(false);
|
|
16
|
+
const [highlightedHtml, setHighlightedHtml] = useState(null);
|
|
17
|
+
const timerRef = useRef(undefined);
|
|
18
|
+
// Clear timeout on unmount to prevent memory leak
|
|
19
|
+
useEffect(() => () => { clearTimeout(timerRef.current); }, []);
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
let cancelled = false;
|
|
22
|
+
getHighlighter()
|
|
23
|
+
.then((highlighter) => {
|
|
24
|
+
if (cancelled)
|
|
25
|
+
return;
|
|
26
|
+
const h = highlighter;
|
|
27
|
+
const lang = language?.toLowerCase() ?? 'text';
|
|
28
|
+
const loaded = h.getLoadedLanguages();
|
|
29
|
+
const safeLang = loaded.includes(lang) ? lang : 'text';
|
|
30
|
+
const html = h.codeToHtml(code, { lang: safeLang, theme: 'github-light' });
|
|
31
|
+
setHighlightedHtml(html);
|
|
32
|
+
})
|
|
33
|
+
.catch(() => { });
|
|
34
|
+
return () => { cancelled = true; };
|
|
35
|
+
}, [code, language]);
|
|
36
|
+
const handleCopy = () => {
|
|
37
|
+
navigator.clipboard.writeText(code).then(() => {
|
|
38
|
+
clearTimeout(timerRef.current);
|
|
39
|
+
setCopied(true);
|
|
40
|
+
timerRef.current = setTimeout(() => setCopied(false), 2000);
|
|
41
|
+
}).catch(() => {
|
|
42
|
+
// Fallback for insecure contexts (HTTP)
|
|
43
|
+
try {
|
|
44
|
+
const textarea = document.createElement('textarea');
|
|
45
|
+
textarea.value = code;
|
|
46
|
+
textarea.style.position = 'fixed';
|
|
47
|
+
textarea.style.opacity = '0';
|
|
48
|
+
document.body.appendChild(textarea);
|
|
49
|
+
textarea.select();
|
|
50
|
+
document.execCommand('copy');
|
|
51
|
+
document.body.removeChild(textarea);
|
|
52
|
+
clearTimeout(timerRef.current);
|
|
53
|
+
setCopied(true);
|
|
54
|
+
timerRef.current = setTimeout(() => setCopied(false), 2000);
|
|
55
|
+
}
|
|
56
|
+
catch { /* ignore */ }
|
|
57
|
+
});
|
|
58
|
+
};
|
|
59
|
+
return (_jsxs("div", { style: {
|
|
60
|
+
borderRadius: 'calc(var(--t2v-radius) * 0.5px)',
|
|
61
|
+
border: '1px solid var(--t2v-border)',
|
|
62
|
+
overflow: 'hidden', margin: '0.5em 0', fontSize: '13px',
|
|
63
|
+
}, children: [_jsxs("div", { style: {
|
|
64
|
+
display: 'flex', justifyContent: 'space-between', alignItems: 'center',
|
|
65
|
+
padding: '6px 12px', background: 'var(--t2v-surface)',
|
|
66
|
+
fontFamily: 'var(--t2v-font)', fontSize: '11px', color: 'var(--t2v-muted)',
|
|
67
|
+
borderBottom: '1px solid var(--t2v-border)',
|
|
68
|
+
}, children: [_jsx("span", { style: { fontWeight: 500, textTransform: 'lowercase' }, children: language ?? 'code' }), _jsx("button", { onClick: handleCopy, className: "t2v-btn-ghost", style: {
|
|
69
|
+
border: 'none', background: 'transparent', cursor: 'pointer',
|
|
70
|
+
padding: '2px 8px', borderRadius: '4px',
|
|
71
|
+
fontFamily: 'var(--t2v-font)', fontSize: '11px',
|
|
72
|
+
color: copied ? 'var(--t2v-accent)' : 'var(--t2v-muted)',
|
|
73
|
+
transition: 'color 0.15s',
|
|
74
|
+
}, children: copied ? _jsxs(_Fragment, { children: [_jsx(Check, { size: 12 }), " Copied"] }) : _jsxs(_Fragment, { children: [_jsx(Copy, { size: 12 }), " Copy"] }) })] }), highlightedHtml ? (_jsx("div", { dangerouslySetInnerHTML: { __html: highlightedHtml }, style: { overflowX: 'auto', fontSize: '13px', lineHeight: 1.6 } })) : (_jsx("pre", { style: { margin: 0, background: 'var(--t2v-surface)' }, children: _jsx("code", { style: {
|
|
75
|
+
display: 'block', padding: '12px 14px', overflowX: 'auto',
|
|
76
|
+
fontFamily: 'var(--t2v-font-mono)', fontSize: '13px', lineHeight: 1.6,
|
|
77
|
+
}, children: code }) }))] }));
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=CodeBlock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodeBlock.js","sourceRoot":"","sources":["../../../src/ui/components/CodeBlock.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Composer — text input + mic button for sending messages.
|
|
3
|
+
*
|
|
4
|
+
* - Auto-resizing textarea (min 1 row, max ~120px).
|
|
5
|
+
* - Send on Enter, Shift+Enter inserts newline.
|
|
6
|
+
* - Disabled while loading.
|
|
7
|
+
* - Mic button records audio via MediaRecorder, sends to t2v.transcribe(),
|
|
8
|
+
* and inserts the transcript into the textarea.
|
|
9
|
+
* - Prefers audio/webm;codecs=opus, falls back to audio/webm.
|
|
10
|
+
* - STT model/language from useUserPreferences + usePartnerConfig.
|
|
11
|
+
* - Send button uses accent color when text is present, border color when empty.
|
|
12
|
+
*/
|
|
13
|
+
export declare function Composer(): import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
//# sourceMappingURL=Composer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Composer.d.ts","sourceRoot":"","sources":["../../../src/ui/components/Composer.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,wBAAgB,QAAQ,4CA4MvB"}
|