@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.
Files changed (164) hide show
  1. package/dist/client.d.ts +1 -1
  2. package/dist/client.d.ts.map +1 -1
  3. package/dist/client.js +4 -4
  4. package/dist/client.js.map +1 -1
  5. package/dist/event-emitter.d.ts +7 -0
  6. package/dist/event-emitter.d.ts.map +1 -0
  7. package/dist/event-emitter.js +23 -0
  8. package/dist/event-emitter.js.map +1 -0
  9. package/dist/index.d.ts +78 -2
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +312 -6
  12. package/dist/index.js.map +1 -1
  13. package/dist/react/T2VProvider.js +1 -1
  14. package/dist/react/T2VProvider.js.map +1 -1
  15. package/dist/react/index.d.ts +2 -1
  16. package/dist/react/index.d.ts.map +1 -1
  17. package/dist/react/useT2VChat.d.ts +6 -22
  18. package/dist/react/useT2VChat.d.ts.map +1 -1
  19. package/dist/react/useT2VChat.js +34 -218
  20. package/dist/react/useT2VChat.js.map +1 -1
  21. package/dist/sessions.d.ts.map +1 -1
  22. package/dist/sessions.js +3 -0
  23. package/dist/sessions.js.map +1 -1
  24. package/dist/tools.d.ts +5 -0
  25. package/dist/tools.d.ts.map +1 -1
  26. package/dist/tools.js +16 -2
  27. package/dist/tools.js.map +1 -1
  28. package/dist/types.d.ts +45 -0
  29. package/dist/types.d.ts.map +1 -1
  30. package/dist/ui/components/ApprovalCard.d.ts +10 -0
  31. package/dist/ui/components/ApprovalCard.d.ts.map +1 -0
  32. package/dist/ui/components/ApprovalCard.js +60 -0
  33. package/dist/ui/components/ApprovalCard.js.map +1 -0
  34. package/dist/ui/components/{T2VChatHeader.d.ts → ChatHeader.d.ts} +4 -4
  35. package/dist/ui/components/ChatHeader.d.ts.map +1 -0
  36. package/dist/ui/components/ChatHeader.js +126 -0
  37. package/dist/ui/components/ChatHeader.js.map +1 -0
  38. package/dist/ui/components/ChatPanel.d.ts +9 -0
  39. package/dist/ui/components/ChatPanel.d.ts.map +1 -0
  40. package/dist/ui/components/ChatPanel.js +37 -0
  41. package/dist/ui/components/ChatPanel.js.map +1 -0
  42. package/dist/ui/components/ChatWidget.d.ts +5 -0
  43. package/dist/ui/components/ChatWidget.d.ts.map +1 -0
  44. package/dist/ui/components/ChatWidget.js +27 -0
  45. package/dist/ui/components/ChatWidget.js.map +1 -0
  46. package/dist/ui/components/CodeBlock.d.ts +6 -0
  47. package/dist/ui/components/CodeBlock.d.ts.map +1 -0
  48. package/dist/ui/components/CodeBlock.js +79 -0
  49. package/dist/ui/components/CodeBlock.js.map +1 -0
  50. package/dist/ui/components/Composer.d.ts +14 -0
  51. package/dist/ui/components/Composer.d.ts.map +1 -0
  52. package/dist/ui/components/Composer.js +172 -0
  53. package/dist/ui/components/Composer.js.map +1 -0
  54. package/dist/ui/components/LoginForm.d.ts +5 -0
  55. package/dist/ui/components/LoginForm.d.ts.map +1 -0
  56. package/dist/ui/components/LoginForm.js +37 -0
  57. package/dist/ui/components/LoginForm.js.map +1 -0
  58. package/dist/ui/components/MarkdownRenderer.d.ts +5 -0
  59. package/dist/ui/components/MarkdownRenderer.d.ts.map +1 -0
  60. package/dist/ui/components/MarkdownRenderer.js +28 -0
  61. package/dist/ui/components/MarkdownRenderer.js.map +1 -0
  62. package/dist/ui/components/MessageActions.d.ts +6 -0
  63. package/dist/ui/components/MessageActions.d.ts.map +1 -0
  64. package/dist/ui/components/MessageActions.js +43 -0
  65. package/dist/ui/components/MessageActions.js.map +1 -0
  66. package/dist/ui/components/MessageBubble.d.ts +16 -0
  67. package/dist/ui/components/MessageBubble.d.ts.map +1 -0
  68. package/dist/ui/components/MessageBubble.js +71 -0
  69. package/dist/ui/components/MessageBubble.js.map +1 -0
  70. package/dist/ui/components/MessageList.d.ts +10 -0
  71. package/dist/ui/components/MessageList.d.ts.map +1 -0
  72. package/dist/ui/components/MessageList.js +69 -0
  73. package/dist/ui/components/MessageList.js.map +1 -0
  74. package/dist/ui/components/SettingsPanel.d.ts +11 -0
  75. package/dist/ui/components/SettingsPanel.d.ts.map +1 -0
  76. package/dist/ui/components/{SettingsView.js → SettingsPanel.js} +27 -27
  77. package/dist/ui/components/SettingsPanel.js.map +1 -0
  78. package/dist/ui/components/Shimmer.d.ts +2 -0
  79. package/dist/ui/components/Shimmer.d.ts.map +1 -0
  80. package/dist/ui/components/Shimmer.js +10 -0
  81. package/dist/ui/components/Shimmer.js.map +1 -0
  82. package/dist/ui/components/Talk2View.d.ts +21 -0
  83. package/dist/ui/components/Talk2View.d.ts.map +1 -0
  84. package/dist/ui/components/Talk2View.js +79 -0
  85. package/dist/ui/components/Talk2View.js.map +1 -0
  86. package/dist/ui/components/ThinkingBlock.d.ts +7 -0
  87. package/dist/ui/components/ThinkingBlock.d.ts.map +1 -0
  88. package/dist/ui/components/ThinkingBlock.js +64 -0
  89. package/dist/ui/components/ThinkingBlock.js.map +1 -0
  90. package/dist/ui/components/ToolDisplay.d.ts +28 -0
  91. package/dist/ui/components/ToolDisplay.d.ts.map +1 -0
  92. package/dist/ui/components/ToolDisplay.js +123 -0
  93. package/dist/ui/components/ToolDisplay.js.map +1 -0
  94. package/dist/ui/components/WelcomeScreen.d.ts +6 -0
  95. package/dist/ui/components/WelcomeScreen.d.ts.map +1 -0
  96. package/dist/ui/components/WelcomeScreen.js +18 -0
  97. package/dist/ui/components/WelcomeScreen.js.map +1 -0
  98. package/dist/ui/context.d.ts +29 -0
  99. package/dist/ui/context.d.ts.map +1 -0
  100. package/dist/ui/context.js +16 -0
  101. package/dist/ui/context.js.map +1 -0
  102. package/dist/ui/index.d.ts +24 -37
  103. package/dist/ui/index.d.ts.map +1 -1
  104. package/dist/ui/index.js +23 -35
  105. package/dist/ui/index.js.map +1 -1
  106. package/dist/ui/styles.d.ts +2 -0
  107. package/dist/ui/styles.d.ts.map +1 -0
  108. package/dist/ui/styles.js +91 -0
  109. package/dist/ui/styles.js.map +1 -0
  110. package/dist/ui/theme.d.ts +11 -0
  111. package/dist/ui/theme.d.ts.map +1 -0
  112. package/dist/ui/theme.js +70 -0
  113. package/dist/ui/theme.js.map +1 -0
  114. package/package.json +5 -10
  115. package/dist/ui/components/LoginModal.d.ts +0 -10
  116. package/dist/ui/components/LoginModal.d.ts.map +0 -1
  117. package/dist/ui/components/LoginModal.js +0 -138
  118. package/dist/ui/components/LoginModal.js.map +0 -1
  119. package/dist/ui/components/SettingsView.d.ts +0 -11
  120. package/dist/ui/components/SettingsView.d.ts.map +0 -1
  121. package/dist/ui/components/SettingsView.js.map +0 -1
  122. package/dist/ui/components/T2VAssistantModal.d.ts +0 -31
  123. package/dist/ui/components/T2VAssistantModal.d.ts.map +0 -1
  124. package/dist/ui/components/T2VAssistantModal.js +0 -151
  125. package/dist/ui/components/T2VAssistantModal.js.map +0 -1
  126. package/dist/ui/components/T2VAssistantProvider.d.ts +0 -42
  127. package/dist/ui/components/T2VAssistantProvider.d.ts.map +0 -1
  128. package/dist/ui/components/T2VAssistantProvider.js +0 -66
  129. package/dist/ui/components/T2VAssistantProvider.js.map +0 -1
  130. package/dist/ui/components/T2VChatHeader.d.ts.map +0 -1
  131. package/dist/ui/components/T2VChatHeader.js +0 -112
  132. package/dist/ui/components/T2VChatHeader.js.map +0 -1
  133. package/dist/ui/components/T2VComposer.d.ts +0 -11
  134. package/dist/ui/components/T2VComposer.d.ts.map +0 -1
  135. package/dist/ui/components/T2VComposer.js +0 -124
  136. package/dist/ui/components/T2VComposer.js.map +0 -1
  137. package/dist/ui/components/T2VDictationAdapter.d.ts +0 -18
  138. package/dist/ui/components/T2VDictationAdapter.d.ts.map +0 -1
  139. package/dist/ui/components/T2VDictationAdapter.js +0 -126
  140. package/dist/ui/components/T2VDictationAdapter.js.map +0 -1
  141. package/dist/ui/components/T2VLoginGate.d.ts +0 -23
  142. package/dist/ui/components/T2VLoginGate.d.ts.map +0 -1
  143. package/dist/ui/components/T2VLoginGate.js +0 -11
  144. package/dist/ui/components/T2VLoginGate.js.map +0 -1
  145. package/dist/ui/components/T2VThread.d.ts +0 -25
  146. package/dist/ui/components/T2VThread.d.ts.map +0 -1
  147. package/dist/ui/components/T2VThread.js +0 -66
  148. package/dist/ui/components/T2VThread.js.map +0 -1
  149. package/dist/ui/components/T2VToolFallback.d.ts +0 -11
  150. package/dist/ui/components/T2VToolFallback.d.ts.map +0 -1
  151. package/dist/ui/components/T2VToolFallback.js +0 -209
  152. package/dist/ui/components/T2VToolFallback.js.map +0 -1
  153. package/dist/ui/runtime/convertMessage.d.ts +0 -17
  154. package/dist/ui/runtime/convertMessage.d.ts.map +0 -1
  155. package/dist/ui/runtime/convertMessage.js +0 -77
  156. package/dist/ui/runtime/convertMessage.js.map +0 -1
  157. package/dist/ui/runtime/useT2VRuntime.d.ts +0 -42
  158. package/dist/ui/runtime/useT2VRuntime.d.ts.map +0 -1
  159. package/dist/ui/runtime/useT2VRuntime.js +0 -62
  160. package/dist/ui/runtime/useT2VRuntime.js.map +0 -1
  161. package/dist/ui/themes/tailwind-preset.d.ts +0 -43
  162. package/dist/ui/themes/tailwind-preset.d.ts.map +0 -1
  163. package/dist/ui/themes/tailwind-preset.js +0 -43
  164. 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
- * T2VChatHeader — Shared header bar for T2VThread and T2VAssistantModal.
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 T2VChatHeaderProps {
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 T2VChatHeader({ view, onSettingsClick, onBackClick, onNewChat, onSignOut }: T2VChatHeaderProps): import("react/jsx-runtime").JSX.Element;
16
- //# sourceMappingURL=T2VChatHeader.d.ts.map
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,5 @@
1
+ import { type ChatPanelProps } from './ChatPanel';
2
+ export interface ChatWidgetProps extends ChatPanelProps {
3
+ }
4
+ export declare function ChatWidget(props: ChatWidgetProps): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=ChatWidget.d.ts.map
@@ -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,6 @@
1
+ export interface CodeBlockProps {
2
+ code: string;
3
+ language?: string;
4
+ }
5
+ export declare function CodeBlock({ code, language }: CodeBlockProps): import("react/jsx-runtime").JSX.Element;
6
+ //# sourceMappingURL=CodeBlock.d.ts.map
@@ -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":";AAAA,OAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAO3C,IAAI,kBAAkB,GAA4B,IAAI,CAAC;AAEvD,KAAK,UAAU,cAAc;IAC3B,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAC3D,GAAG,CAAC,iBAAiB,CAAC;YACpB,MAAM,EAAE,CAAC,cAAc,CAAC;YACxB,KAAK,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC;SACjJ,CAAC,CACH,CAAC;IACJ,CAAC;IACD,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAkB;IAC1D,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAC5E,MAAM,QAAQ,GAAG,MAAM,CAA4C,SAAS,CAAC,CAAC;IAE9E,kDAAkD;IAClD,SAAS,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAE/D,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,cAAc,EAAE;aACb,IAAI,CAAC,CAAC,WAAoB,EAAE,EAAE;YAC7B,IAAI,SAAS;gBAAE,OAAO;YACtB,MAAM,CAAC,GAAG,WAAkI,CAAC;YAC7I,MAAM,IAAI,GAAG,QAAQ,EAAE,WAAW,EAAE,IAAI,MAAM,CAAC;YAC/C,MAAM,MAAM,GAAG,CAAC,CAAC,kBAAkB,EAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;YACvD,MAAM,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;YAC3E,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACnB,OAAO,GAAG,EAAE,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAErB,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;YAC5C,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC/B,SAAS,CAAC,IAAI,CAAC,CAAC;YAChB,QAAQ,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YACZ,wCAAwC;YACxC,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;gBACpD,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC;gBACtB,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC;gBAClC,QAAQ,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;gBAC7B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;gBACpC,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAClB,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;gBAC7B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;gBACpC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC/B,SAAS,CAAC,IAAI,CAAC,CAAC;gBAChB,QAAQ,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;YAC9D,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO,CACL,eAAK,KAAK,EAAE;YACV,YAAY,EAAE,iCAAiC;YAC/C,MAAM,EAAE,6BAA6B;YACrC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM;SACxD,aACC,eAAK,KAAK,EAAE;oBACV,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,UAAU,EAAE,QAAQ;oBACtE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,oBAAoB;oBACrD,UAAU,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB;oBAC1E,YAAY,EAAE,6BAA6B;iBAC5C,aACC,eAAM,KAAK,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,EAAE,WAAW,EAAE,YAAG,QAAQ,IAAI,MAAM,GAAQ,EACzF,iBAAQ,OAAO,EAAE,UAAU,EAAE,SAAS,EAAC,eAAe,EAAC,KAAK,EAAE;4BAC5D,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS;4BAC5D,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK;4BACvC,UAAU,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM;4BAC/C,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,kBAAkB;4BACxD,UAAU,EAAE,aAAa;yBAC1B,YACE,MAAM,CAAC,CAAC,CAAC,8BAAE,KAAC,KAAK,IAAC,IAAI,EAAE,EAAE,GAAI,eAAU,CAAC,CAAC,CAAC,8BAAE,KAAC,IAAI,IAAC,IAAI,EAAE,EAAE,GAAI,aAAQ,GACjE,IACL,EACL,eAAe,CAAC,CAAC,CAAC,CACjB,cAAK,uBAAuB,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,EACvD,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,GAAI,CACtE,CAAC,CAAC,CAAC,CACF,cAAK,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,oBAAoB,EAAE,YACzD,eAAM,KAAK,EAAE;wBACX,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM;wBACzD,UAAU,EAAE,sBAAsB,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG;qBACtE,YAAG,IAAI,GAAQ,GACZ,CACP,IACG,CACP,CAAC;AACJ,CAAC"}
@@ -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"}