@admin-layout/demo-perplexity-browser 12.2.4-alpha.2 → 12.2.4-alpha.4

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 (79) hide show
  1. package/lib/api/index.d.ts +2 -0
  2. package/lib/api/index.d.ts.map +1 -0
  3. package/lib/api/llm.d.ts +34 -0
  4. package/lib/api/llm.d.ts.map +1 -0
  5. package/lib/api/llm.js +200 -0
  6. package/lib/api/llm.js.map +1 -0
  7. package/lib/api/stt.d.ts +21 -0
  8. package/lib/api/stt.d.ts.map +1 -0
  9. package/lib/api/stt.js +111 -0
  10. package/lib/api/stt.js.map +1 -0
  11. package/lib/components/AttachmentPreview.d.ts +10 -0
  12. package/lib/components/AttachmentPreview.d.ts.map +1 -0
  13. package/lib/components/AttachmentPreview.js +50 -0
  14. package/lib/components/AttachmentPreview.js.map +1 -0
  15. package/lib/components/AudioRecorder.d.ts +8 -0
  16. package/lib/components/AudioRecorder.d.ts.map +1 -0
  17. package/lib/components/AudioRecorder.js +221 -0
  18. package/lib/components/AudioRecorder.js.map +1 -0
  19. package/lib/components/AudioVisualizer.d.ts +7 -0
  20. package/lib/components/AudioVisualizer.d.ts.map +1 -0
  21. package/lib/components/AudioVisualizer.js +116 -0
  22. package/lib/components/AudioVisualizer.js.map +1 -0
  23. package/lib/components/ChatFiles.d.ts +8 -0
  24. package/lib/components/ChatFiles.d.ts.map +1 -0
  25. package/lib/components/ChatFiles.js +76 -0
  26. package/lib/components/ChatFiles.js.map +1 -0
  27. package/lib/components/ChatScreenshot.d.ts +7 -0
  28. package/lib/components/ChatScreenshot.d.ts.map +1 -0
  29. package/lib/components/ChatScreenshot.js +113 -0
  30. package/lib/components/ChatScreenshot.js.map +1 -0
  31. package/lib/components/SearchBar.d.ts +9 -1
  32. package/lib/components/SearchBar.d.ts.map +1 -1
  33. package/lib/components/SearchBar.js +176 -240
  34. package/lib/components/SearchBar.js.map +1 -1
  35. package/lib/config/constants.d.ts +108 -0
  36. package/lib/config/constants.d.ts.map +1 -0
  37. package/lib/config/constants.js +115 -0
  38. package/lib/config/constants.js.map +1 -0
  39. package/lib/config/env.d.ts +20 -0
  40. package/lib/config/env.d.ts.map +1 -0
  41. package/lib/config/env.js +22 -0
  42. package/lib/config/env.js.map +1 -0
  43. package/lib/config/index.d.ts +4 -0
  44. package/lib/config/index.d.ts.map +1 -0
  45. package/lib/config/providers.d.ts +54 -0
  46. package/lib/config/providers.d.ts.map +1 -0
  47. package/lib/config/providers.js +65 -0
  48. package/lib/config/providers.js.map +1 -0
  49. package/lib/pages/home/HomePage.d.ts +1 -3
  50. package/lib/pages/home/HomePage.d.ts.map +1 -1
  51. package/lib/pages/home/HomePage.js +232 -4
  52. package/lib/pages/home/HomePage.js.map +1 -1
  53. package/lib/platform/browser.d.ts +18 -0
  54. package/lib/platform/browser.d.ts.map +1 -0
  55. package/lib/platform/context.d.ts +76 -0
  56. package/lib/platform/context.d.ts.map +1 -0
  57. package/lib/platform/index.d.ts +25 -0
  58. package/lib/platform/index.d.ts.map +1 -0
  59. package/lib/platform/tauri.d.ts +35 -0
  60. package/lib/platform/tauri.d.ts.map +1 -0
  61. package/lib/platform/types.d.ts +164 -0
  62. package/lib/platform/types.d.ts.map +1 -0
  63. package/lib/state/chatMachine.d.ts +554 -0
  64. package/lib/state/chatMachine.d.ts.map +1 -0
  65. package/lib/state/chatMachine.js +458 -0
  66. package/lib/state/chatMachine.js.map +1 -0
  67. package/lib/state/index.d.ts +3 -0
  68. package/lib/state/index.d.ts.map +1 -0
  69. package/lib/state/useChatWithPlatform.d.ts +43 -0
  70. package/lib/state/useChatWithPlatform.d.ts.map +1 -0
  71. package/lib/types/chat.d.ts +56 -0
  72. package/lib/types/chat.d.ts.map +1 -0
  73. package/lib/types/index.d.ts +2 -0
  74. package/lib/types/index.d.ts.map +1 -0
  75. package/lib/utils/chatStorage.d.ts +25 -0
  76. package/lib/utils/chatStorage.d.ts.map +1 -0
  77. package/lib/utils/chatStorage.js +17 -0
  78. package/lib/utils/chatStorage.js.map +1 -0
  79. package/package.json +9 -5
@@ -1,4 +1,4 @@
1
- import {jsx,jsxs}from'react/jsx-runtime';import*as React from'react';import {Paperclip,ArrowUpRight,AudioLines,ChevronRight,Globe,Search,Sparkles,Lightbulb,Grid3X3}from'lucide-react';import {cn}from'../utils/index.js';function IconButton({
1
+ import {jsxs,Fragment,jsx}from'react/jsx-runtime';import {useState,useRef,useCallback,useEffect}from'react';import {ArrowUpRight,Mic,Search,Sparkles,Lightbulb,Globe}from'lucide-react';import {cn}from'../utils/index.js';import {AttachmentPreview}from'./AttachmentPreview.js';import {AudioRecorder}from'./AudioRecorder.js';import {ChatFiles}from'./ChatFiles.js';import {ChatScreenshot}from'./ChatScreenshot.js';function IconButton({
2
2
  icon,
3
3
  label,
4
4
  variant = 'ghost',
@@ -6,13 +6,15 @@ import {jsx,jsxs}from'react/jsx-runtime';import*as React from'react';import {Pap
6
6
  type = 'button',
7
7
  className,
8
8
  onClick,
9
- isActive = false
9
+ isActive = false,
10
+ disabled = false
10
11
  }) {
11
12
  return jsx("button", {
12
13
  type: type,
13
14
  "aria-label": label,
14
15
  onClick: onClick,
15
- className: cn('inline-flex items-center justify-center rounded-full transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background', size === 'sm' && 'h-9 w-9', size === 'md' && 'h-10 w-10', size === 'lg' && 'h-11 w-11', variant === 'ghost' && 'bg-transparent text-muted-foreground hover:bg-secondary/70', variant === 'primary' && 'bg-primary text-primary-foreground hover:bg-primary/90', variant === 'outline' && !isActive && 'border border-primary/50 bg-card text-primary hover:border-primary hover:text-primary', variant === 'outline' && isActive && 'border border-primary bg-primary text-primary-foreground', className),
16
+ disabled: disabled,
17
+ className: cn('inline-flex items-center justify-center rounded-full transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:opacity-50 disabled:pointer-events-none', size === 'sm' && 'h-7 w-7', size === 'md' && 'h-8 w-8', size === 'lg' && 'h-9 w-9', variant === 'ghost' && 'bg-transparent text-muted-foreground hover:bg-secondary/70', variant === 'primary' && 'bg-primary text-primary-foreground hover:bg-primary/90', variant === 'outline' && !isActive && 'border border-primary/50 bg-card text-primary hover:border-primary hover:text-primary', variant === 'outline' && isActive && 'border border-primary bg-primary text-primary-foreground', className),
16
18
  children: icon
17
19
  });
18
20
  }
@@ -22,19 +24,19 @@ function IconToggleGroup({
22
24
  }) {
23
25
  const toggles = [{
24
26
  icon: jsx(Search, {
25
- className: "h-4 w-4"
27
+ className: "h-3.5 w-3.5"
26
28
  }),
27
29
  label: 'Search mode',
28
30
  mode: 'search'
29
31
  }, {
30
32
  icon: jsx(Sparkles, {
31
- className: "h-4 w-4"
33
+ className: "h-3.5 w-3.5"
32
34
  }),
33
35
  label: 'Creative mode',
34
36
  mode: 'creative'
35
37
  }, {
36
38
  icon: jsx(Lightbulb, {
37
- className: "h-4 w-4"
39
+ className: "h-3.5 w-3.5"
38
40
  }),
39
41
  label: 'Insights mode',
40
42
  mode: 'insights'
@@ -57,287 +59,221 @@ function IconToggleGroup({
57
59
  });
58
60
  }
59
61
  function UtilityActions({
60
- onAction
62
+ onScreenshot,
63
+ onFilesSelected,
64
+ onMicClick,
65
+ currentFileCount
61
66
  }) {
62
- const fileInputRef = React.useRef(null);
63
- const actions = [{
64
- icon: jsx(Globe, {
65
- className: "h-5 w-5"
66
- }),
67
- label: 'Global scope',
68
- action: 'global'
69
- }, {
70
- icon: jsx(Grid3X3, {
71
- className: "h-5 w-5"
72
- }),
73
- label: 'Discover',
74
- action: 'discover'
75
- }, {
76
- icon: jsx(Paperclip, {
77
- className: "h-5 w-5"
78
- }),
79
- label: 'Add file',
80
- action: 'file'
81
- }];
82
- const handleFileClick = () => {
83
- fileInputRef.current?.click();
84
- };
85
- const handleFileChange = event => {
86
- const files = event.target.files;
87
- if (files && files.length > 0) {
88
- const file = files[0];
89
- onAction(`file:${file.name}:${file.size}`);
90
- }
91
- // Reset the input so the same file can be selected again if needed
92
- event.target.value = '';
93
- };
94
67
  return jsxs("div", {
95
68
  className: "flex flex-wrap items-center gap-1 text-muted-foreground",
96
- children: [actions.map(action => jsx("button", {
69
+ children: [jsx("button", {
97
70
  type: "button",
98
- "aria-label": action.label,
99
- onClick: action.action === 'file' ? handleFileClick : () => onAction(action.action),
100
- className: "inline-flex h-9 w-9 items-center justify-center rounded-2xl transition-colors hover:bg-secondary/70 active:bg-secondary",
101
- children: action.icon
102
- }, action.label)), jsx("input", {
103
- ref: fileInputRef,
104
- type: "file",
105
- accept: "*/*",
106
- onChange: handleFileChange,
107
- className: "hidden"
71
+ "aria-label": "Global scope",
72
+ onClick: () => console.log('Global scope'),
73
+ className: "inline-flex h-7 w-7 items-center justify-center rounded-2xl transition-colors hover:bg-secondary/70 active:bg-secondary",
74
+ children: jsx(Globe, {
75
+ className: "h-4 w-4"
76
+ })
77
+ }), jsx(ChatScreenshot, {
78
+ onScreenshot: onScreenshot
79
+ }), jsx(ChatFiles, {
80
+ onFilesSelected: onFilesSelected,
81
+ currentFileCount: currentFileCount
108
82
  })]
109
83
  });
110
84
  }
111
- const suggestionPool = [{
112
- label: 'AD',
113
- icon: jsx(Globe, {
114
- className: "h-4 w-4"
115
- })
116
- }, {
117
- label: 'D',
118
- icon: jsx(Globe, {
119
- className: "h-4 w-4"
120
- })
121
- }, {
122
- label: 'delta airlines',
123
- icon: jsx(Search, {
124
- className: "h-4 w-4"
125
- })
126
- }, {
127
- label: 'deepl',
128
- icon: jsx(Sparkles, {
129
- className: "h-4 w-4"
130
- })
131
- }, {
132
- label: 'dmv',
133
- icon: jsx(Search, {
134
- className: "h-4 w-4"
135
- })
136
- }, {
137
- label: 'daum',
138
- icon: jsx(Globe, {
139
- className: "h-4 w-4"
140
- })
141
- }];
142
- function PerplexitySearch() {
143
- const [query, setQuery] = React.useState('');
144
- const [activeMode, setActiveMode] = React.useState('search');
145
- const [focusEnabled, setFocusEnabled] = React.useState(false);
146
- const [spacesEnabled, setSpacesEnabled] = React.useState(false);
147
- const [isRecording, setIsRecording] = React.useState(false);
148
- const [statusMessage, setStatusMessage] = React.useState('');
149
- const [attachedFile, setAttachedFile] = React.useState(null);
85
+ function PerplexitySearch({
86
+ onSubmit,
87
+ isLoading = false,
88
+ disabled = false
89
+ }) {
90
+ const [query, setQuery] = useState('');
91
+ const [activeMode, setActiveMode] = useState('search');
92
+ const [statusMessage, setStatusMessage] = useState('');
93
+ const [attachments, setAttachments] = useState([]);
94
+ const [showAudioRecorder, setShowAudioRecorder] = useState(false);
95
+ const textareaRef = useRef(null);
150
96
  const trimmedQuery = query.trim();
151
97
  const hasQuery = trimmedQuery.length > 0;
152
- const filteredSuggestions = React.useMemo(() => {
153
- if (!hasQuery) {
154
- return [];
155
- }
156
- const normalized = trimmedQuery.toLowerCase();
157
- const matches = suggestionPool.filter(suggestion => suggestion.label.toLowerCase().includes(normalized));
158
- return matches.length > 0 ? matches : suggestionPool;
159
- }, [hasQuery, trimmedQuery]);
160
- const showStatus = message => {
98
+ const hasAttachments = attachments.length > 0;
99
+ const canSubmit = hasQuery || hasAttachments;
100
+ const showStatus = useCallback(message => {
161
101
  setStatusMessage(message);
162
102
  setTimeout(() => setStatusMessage(''), 2000);
163
- };
164
- const handleSubmit = React.useCallback(event => {
103
+ }, []);
104
+ const generateId = () => `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
105
+ const adjustTextareaHeight = useCallback(() => {
106
+ if (textareaRef.current) {
107
+ textareaRef.current.style.height = 'auto';
108
+ textareaRef.current.style.height = textareaRef.current.scrollHeight + 'px';
109
+ }
110
+ }, []);
111
+ const handleScreenshot = useCallback(dataUrl => {
112
+ const newAttachment = {
113
+ id: generateId(),
114
+ name: `Screenshot ${new Date().toLocaleTimeString()}`,
115
+ type: 'screenshot',
116
+ dataUrl
117
+ };
118
+ setAttachments(prev => [...prev, newAttachment]);
119
+ showStatus('Screenshot captured!');
120
+ }, [showStatus]);
121
+ const handleFilesSelected = useCallback(async files => {
122
+ // Read all files as base64 data URLs for AI processing
123
+ const readFileAsDataUrl = file => {
124
+ return new Promise((resolve, reject) => {
125
+ const reader = new FileReader();
126
+ reader.onload = () => resolve(reader.result);
127
+ reader.onerror = () => reject(new Error(`Failed to read file: ${file.name}`));
128
+ reader.readAsDataURL(file);
129
+ });
130
+ };
131
+ try {
132
+ const newAttachments = await Promise.all(files.map(async file => {
133
+ // Read all files as base64 so AI can access their content
134
+ const dataUrl = await readFileAsDataUrl(file);
135
+ return {
136
+ id: generateId(),
137
+ name: file.name,
138
+ size: file.size,
139
+ type: 'file',
140
+ file,
141
+ dataUrl
142
+ };
143
+ }));
144
+ setAttachments(prev => [...prev, ...newAttachments]);
145
+ showStatus(`${files.length} file(s) attached!`);
146
+ } catch (error) {
147
+ console.error('Error reading files:', error);
148
+ showStatus('Error reading files');
149
+ }
150
+ }, [showStatus]);
151
+ const handleRemoveAttachment = useCallback(id => {
152
+ setAttachments(prev => prev.filter(a => a.id !== id));
153
+ }, []);
154
+ const handleClearAttachments = useCallback(() => {
155
+ setAttachments([]);
156
+ }, []);
157
+ const handleSubmit = useCallback(event => {
165
158
  event.preventDefault();
166
- if (hasQuery) {
167
- showStatus(`Searching "${trimmedQuery}" in ${activeMode} mode...`);
159
+ if (canSubmit && !isLoading && !disabled) {
160
+ onSubmit(trimmedQuery, activeMode, attachments.length > 0 ? attachments : undefined);
161
+ setQuery('');
162
+ handleClearAttachments();
163
+ adjustTextareaHeight();
168
164
  }
169
- }, [trimmedQuery, activeMode, focusEnabled, spacesEnabled, hasQuery]);
170
- const handleVoiceAction = React.useCallback(() => {
171
- if (hasQuery) {
172
- showStatus(`Sending message: "${trimmedQuery}"`);
173
- } else {
174
- setIsRecording(!isRecording);
175
- if (!isRecording) {
176
- showStatus('Recording started... Speak now!');
177
- setTimeout(() => {
178
- setIsRecording(false);
179
- setQuery('What is the weather today?');
180
- showStatus('Voice input received!');
181
- }, 3000);
182
- } else {
183
- showStatus('Recording stopped.');
165
+ }, [trimmedQuery, activeMode, canSubmit, isLoading, disabled, onSubmit, attachments, handleClearAttachments, adjustTextareaHeight]);
166
+ const handleKeyDown = useCallback(event => {
167
+ if (event.key === 'Enter' && !event.shiftKey) {
168
+ event.preventDefault();
169
+ if (canSubmit && !isLoading && !disabled) {
170
+ onSubmit(trimmedQuery, activeMode, attachments.length > 0 ? attachments : undefined);
171
+ setQuery('');
172
+ handleClearAttachments();
173
+ adjustTextareaHeight();
184
174
  }
185
175
  }
186
- }, [hasQuery, trimmedQuery, isRecording]);
187
- const handleUtilityAction = React.useCallback(action => {
188
- switch (action) {
189
- case 'global':
190
- showStatus('Switched to global scope');
191
- break;
192
- case 'discover':
193
- showStatus('Discovery panel opened');
194
- break;
195
- case 'settings':
196
- showStatus('Settings opened');
197
- break;
198
- case 'link':
199
- const url = prompt('Enter URL to attach:');
200
- if (url) {
201
- showStatus(`Link attached: ${url}`);
202
- }
203
- break;
204
- default:
205
- if (action.startsWith('file:')) {
206
- const fileParts = action.substring(5).split(':');
207
- const fileName = fileParts[0];
208
- const fileSize = fileParts.length > 1 ? parseInt(fileParts[1]) : undefined;
209
- setAttachedFile({
210
- name: fileName,
211
- size: fileSize
212
- });
213
- showStatus(`File attached: ${fileName}`);
214
- }
176
+ }, [canSubmit, isLoading, disabled, trimmedQuery, activeMode, onSubmit, attachments, handleClearAttachments, adjustTextareaHeight]);
177
+ const handleChange = useCallback(event => {
178
+ setQuery(event.target.value);
179
+ setTimeout(adjustTextareaHeight, 0);
180
+ }, [adjustTextareaHeight]);
181
+ const handleMicClick = useCallback(() => {
182
+ if (!hasQuery) {
183
+ setShowAudioRecorder(true);
215
184
  }
185
+ }, [hasQuery]);
186
+ const handleTranscriptionComplete = useCallback(text => {
187
+ setQuery(prev => prev ? `${prev} ${text}` : text);
188
+ setShowAudioRecorder(false);
189
+ textareaRef.current?.focus();
190
+ setTimeout(adjustTextareaHeight, 0);
191
+ }, [adjustTextareaHeight]);
192
+ const handleAudioCancel = useCallback(() => {
193
+ setShowAudioRecorder(false);
216
194
  }, []);
217
- const handleSuggestionSelect = React.useCallback(suggestion => {
218
- setQuery(suggestion.label);
219
- showStatus(`Selected: ${suggestion.label}`);
220
- setTimeout(() => {
221
- showStatus(`Auto-searching: ${suggestion.label}`);
222
- }, 100);
223
- }, [activeMode]);
224
- return jsxs("div", {
225
- className: "flex min-h-[80vh] w-full flex-col items-center justify-center gap-10 px-6",
226
- children: [jsx("header", {
227
- className: "text-center",
228
- children: jsx("p", {
229
- className: "text-balance text-4xl font-semibold tracking-tight text-foreground",
230
- children: "perplexity"
231
- })
232
- }), statusMessage && jsx("div", {
195
+ // Focus textarea on mount
196
+ useEffect(() => {
197
+ textareaRef.current?.focus();
198
+ adjustTextareaHeight();
199
+ }, [adjustTextareaHeight]);
200
+ return jsxs(Fragment, {
201
+ children: [statusMessage && jsx("div", {
233
202
  className: "fixed top-4 right-4 z-50 max-w-sm rounded-lg bg-primary px-4 py-2 text-sm text-primary-foreground shadow-lg",
234
203
  children: statusMessage
235
204
  }), jsxs("section", {
236
- className: "w-full max-w-3xl overflow-hidden rounded-[28px] border border-border/70 bg-card shadow-[0_32px_80px_rgba(15,45,42,0.12)]",
237
- children: [jsxs("form", {
205
+ className: "w-full overflow-hidden rounded-[24px] border border-border/70 bg-card shadow-md",
206
+ children: [showAudioRecorder && jsx("div", {
207
+ className: "px-4 pt-4 sm:px-5 sm:pt-5",
208
+ children: jsx(AudioRecorder, {
209
+ onTranscriptionComplete: handleTranscriptionComplete,
210
+ onCancel: handleAudioCancel,
211
+ onError: error => showStatus(`Error: ${error}`)
212
+ })
213
+ }), jsxs("form", {
238
214
  onSubmit: handleSubmit,
239
- className: "flex flex-col gap-4 px-5 py-5 sm:px-6 sm:py-6",
215
+ className: "flex flex-col gap-2 px-3 py-3 sm:px-4 sm:py-4",
240
216
  "aria-label": "Perplexity style search",
241
- children: [attachedFile && jsxs("div", {
242
- className: "relative inline-flex items-center gap-2 rounded-lg bg-secondary/50 px-3 py-2 text-sm text-muted-foreground",
243
- children: [jsxs("div", {
244
- className: "flex items-center gap-2",
245
- children: [jsx(Paperclip, {
246
- className: "h-4 w-4"
247
- }), jsx("span", {
248
- children: attachedFile.name
249
- }), attachedFile.size && jsxs("span", {
250
- className: "text-xs",
251
- children: [(attachedFile.size / 1024).toFixed(1), " KB"]
252
- })]
253
- }), jsx("button", {
217
+ children: [hasAttachments && jsxs("div", {
218
+ className: "flex flex-wrap items-center gap-2",
219
+ children: [attachments.map(attachment => jsx(AttachmentPreview, {
220
+ attachment: attachment,
221
+ onRemove: handleRemoveAttachment,
222
+ showPreview: attachments.length === 1,
223
+ isCancellable: true
224
+ }, attachment.id)), attachments.length > 1 && jsx("button", {
254
225
  type: "button",
255
- onClick: () => setAttachedFile(null),
256
- className: "ml-2 rounded-full p-1 hover:bg-secondary",
257
- "aria-label": "Remove attached file",
258
- children: jsxs("svg", {
259
- width: "16",
260
- height: "16",
261
- viewBox: "0 0 24 24",
262
- fill: "none",
263
- stroke: "currentColor",
264
- strokeWidth: "2",
265
- strokeLinecap: "round",
266
- strokeLinejoin: "round",
267
- children: [jsx("line", {
268
- x1: "18",
269
- y1: "6",
270
- x2: "6",
271
- y2: "18"
272
- }), jsx("line", {
273
- x1: "6",
274
- y1: "6",
275
- x2: "18",
276
- y2: "18"
277
- })]
278
- })
226
+ onClick: handleClearAttachments,
227
+ className: "text-xs text-muted-foreground hover:text-destructive transition-colors px-2 py-1",
228
+ children: "Clear all"
279
229
  })]
280
230
  }), jsxs("div", {
281
231
  children: [jsx("label", {
282
232
  htmlFor: "search-input",
283
233
  className: "sr-only",
284
- children: "Ask anything or @mention a Space"
285
- }), jsx("input", {
234
+ children: "Ask anything"
235
+ }), jsx("textarea", {
236
+ ref: textareaRef,
286
237
  id: "search-input",
287
238
  name: "query",
288
- type: "text",
289
239
  value: query,
290
- onChange: event => setQuery(event.target.value),
291
- placeholder: "Ask anything or @mention a Space",
292
- className: "w-full outline-none border-none bg-transparent text-lg text-foreground placeholder:text-muted-foreground"
240
+ onChange: handleChange,
241
+ onKeyDown: handleKeyDown,
242
+ placeholder: "Ask anything...",
243
+ disabled: isLoading || disabled || showAudioRecorder,
244
+ rows: 1,
245
+ className: "w-full outline-none border-none ring-0 focus:outline-none focus:ring-0 bg-transparent text-base text-foreground placeholder:text-muted-foreground disabled:opacity-50 resize-none overflow-hidden"
293
246
  })]
294
247
  }), jsxs("div", {
295
- className: "flex flex-wrap items-center gap-3 border-t border-border/60 pt-3",
248
+ className: "flex flex-wrap items-center gap-3 border-t border-border/60 pt-2",
296
249
  children: [jsx(IconToggleGroup, {
297
250
  activeMode: activeMode,
298
251
  onModeChange: setActiveMode
299
252
  }), jsxs("div", {
300
253
  className: "flex flex-1 flex-wrap items-center justify-end gap-2",
301
254
  children: [jsx(UtilityActions, {
302
- onAction: handleUtilityAction
255
+ onScreenshot: handleScreenshot,
256
+ onFilesSelected: handleFilesSelected,
257
+ onMicClick: handleMicClick,
258
+ currentFileCount: attachments.length
303
259
  }), jsx(IconButton, {
304
- icon: hasQuery ? jsx(ArrowUpRight, {
305
- className: "h-5 w-5"
306
- }) : isRecording ? jsx("div", {
307
- className: "h-5 w-5 animate-pulse rounded-full bg-red-500"
308
- }) : jsx(AudioLines, {
309
- className: "h-5 w-5"
260
+ icon: isLoading ? jsx("div", {
261
+ className: "h-4 w-4 animate-spin rounded-full border-2 border-primary-foreground border-t-transparent"
262
+ }) : canSubmit ? jsx(ArrowUpRight, {
263
+ className: "h-4 w-4"
264
+ }) : jsx(Mic, {
265
+ className: "h-4 w-4"
310
266
  }),
311
- label: hasQuery ? 'Send message' : isRecording ? 'Recording...' : 'Start audio search',
267
+ label: isLoading ? 'Loading...' : canSubmit ? 'Send message' : 'Start audio search',
312
268
  variant: "primary",
313
269
  size: "lg",
314
- type: hasQuery ? 'submit' : 'button',
315
- onClick: !hasQuery ? handleVoiceAction : undefined,
270
+ type: canSubmit ? 'submit' : 'button',
271
+ onClick: !canSubmit ? handleMicClick : undefined,
272
+ disabled: isLoading || disabled || showAudioRecorder,
316
273
  className: "rounded-2xl"
317
274
  })]
318
275
  })]
319
276
  })]
320
- }), filteredSuggestions.length > 0 && jsx("div", {
321
- className: "border-t border-border/60 bg-card/95 px-4 py-2 sm:px-6 sm:py-3",
322
- children: jsx("ul", {
323
- className: "flex flex-col gap-1",
324
- children: filteredSuggestions.map(suggestion => jsx("li", {
325
- children: jsxs("button", {
326
- type: "button",
327
- onClick: () => handleSuggestionSelect(suggestion),
328
- className: "flex w-full items-center justify-between rounded-2xl px-2 py-2 text-left transition-colors hover:bg-secondary/70 active:bg-secondary",
329
- children: [jsxs("span", {
330
- className: "flex items-center gap-3 text-sm text-foreground",
331
- children: [jsx("span", {
332
- className: "inline-flex h-8 w-8 items-center justify-center rounded-full bg-secondary text-muted-foreground",
333
- children: suggestion.icon
334
- }), suggestion.label]
335
- }), jsx(ChevronRight, {
336
- className: "h-4 w-4 text-muted-foreground"
337
- })]
338
- })
339
- }, suggestion.label))
340
- })
341
277
  })]
342
278
  })]
343
279
  });
@@ -1 +1 @@
1
- {"version":3,"file":"SearchBar.js","sources":["../../src/components/SearchBar.tsx"],"sourcesContent":[null],"names":["_jsx","_jsxs"],"mappings":"0NA2BA,SAAS,UAAU,CAAC;MAUhB;AAagB,EAAA,KAAA;AACA,EAAA,OAAA,GAAA,OAAA;AAQpB,EAAC,IAAA,GAAA,IAAA;AAID,EAAA,IAAA,GAAS;AAOL,EAAA;AACI,EAAA,OAAA;AACA,EAAA,QAAE;AACF,CAAA,EAAA;SACFA,GAAA,CAAA,QAAA,EAAA;AAEF,IAAA,IAAA,EAAA,IACI;AAeR,IAAC,YAAA,EAAA,KAAA;AAED,IAAA,OAAS,EAAA,OAAA;IACL,SAAM,EAAA,EAAA,CAAA,iNAAoD,EAAA,IAAA,KAAA,IAAA,IAAA,SAAA,EAAA,IAAA,KAAA,IAAA,IAAA,WAAA,EAAA,IAAA,KAAA,IAAA,IAAA,WAAA,EAAA,OAAA,KAAA,OAAA,IAAA,4DAAA,EAAA,OAAA,KAAA,SAAA,IAAA,wDAAA,EAAA,OAAA,KAAA,SAAA,IAAA,CAAA,QAAA,IAAA,uFAAA,EAAA,OAAA,KAAA,SAAA,IAAA,QAAA,IAAA,0DAAA,EAAA,SAAA,CAAA;AAE1D,IAAA;AACI,GAAA,CAAA;AACA;AACA,SAAA,eAAS,CAAA;YACX;;AAGE,CAAA,EAAA;AACJ,EAAA,MAAE,OAAA,GAAA,CAAA;AAEF,IAAA,IAAA,EAAMA,GAAA,CAAA,MAAA,EAAA;AACF,MAAA;;AAEI,IAAA,KAAA,EAAA,aAAU;;;QAGd,EAAAA,GAAA,CAAA,QAAA,EAAA;AACA,MAAA,SAAM,EAAA;AACV,KAAC,CAAC;AAEF,IAAA,KAAA,EAAO,eACH;AAeR,IAAC,IAAA,EAAA;AAOD,GAAA,EAAA;AACI,IAAA,IAAE,EAAAA,GAAO,CAAA,SAAU,EAAE;AACrB,MAAE,SAAO,EAAG;AACZ,KAAA,CAAE;AACF,IAAA,KAAE,EAAK,eAAe;AACtB,IAAA,IAAE,EAAA;AACF,GAAA,CAAA;EACF,OAAAA,GAAA,CAAA,KAAA,EAAA;AAOF,IAAA,wEAAgC;AAC5B,IAAA,QAAO,EAAA,OAAO,CAAA,GAAA,CAAQ,CAAC,MAAG,EAAK,KAAC,KAASC,IAAI,CAAA,KAAA,EAAA;AAC7C,MAAA,SAAO,EAAA,mBAAyB;AAChC,MAAA,QAAO,EAAA,CAAAD,GAAA,CAAA,UAAc,EAAA;AACrB,QAAA,GAAO,MAAA;AACP,QAAA,IAAO,EAAA,IAAA;AACP,QAAA,OAAO,EAAA,SAAe;AACtB,QAAA,QAAO,EAAA,UAAc,KAAA,MAAA,CAAe,IAAI;AAExC,QAAA,eAAkB,YAAa,OAAG,CAAA,IAAA;AAClC,OAAA,CAAA,EAAM,QAAQ,OAAG,CAAA,MAAA,GAAa,CAAA,IAAMA,GAAI,CAAC,MAAA,EAAA;AAEzC,QAAA,qBAAyB;QACrB,SAAK,EAAA;AACD,OAAA,CAAA;aACH,CAAA,KAAA,CAAA;AAED,GAAA,CAAA;;AAGA,SAAA,cAAe,CAAA;AACnB,EAAA;AAEA,CAAA,EAAA;QACI,YAAA,GAAA,KAAiB,CAAA,MAAS,CAAA,IAAA,CAAA;QAC1B,OAAA,GAAU,CAAC;AACf,IAAA,IAAE,EAAAA,GAAA,CAAA,KAAA,EAAA;MAEF,SAAM,EAAA;;SAGE,EAAA,cAAe;AACX,IAAA,MAAA,EAAA;;AAER,IAAA,IACC,EAAAA,GAAA,CAAA,OAAc,EAAA;AAGnB,MAAA;;AAEQ,IAAA,KAAA,EAAA,UAAA;UACH,EAAA;;AACG,IAAA,IAAA,EAAAA,GAAA,CAAA,SAAA,EAAc;eACd,EAAK;;qBAED;;;uBAGI,GAAA,MAAW;gBACf,CAAC,OAAO,EAAC,KAAA,EAAA;;wBACL,GAAA,KAAA,IAAA;kBACJ,KAAA,CAAA,MAAW,CAAA,KAAA;aACd,IAAA,KAAA,CAAA,MAAA,GAAA,CAAA,EAAA;YACJ,IAAA,GAAA,KAAA,CAAA,CAAA,CAAA;MACJ,QAAG,CAAA,CAAQ,gBAAgB,CAAA,CAAA,EAAA,IAAA,CAAA,IAAa,CAAC,CAAA,CAAA;IAE1C;;AAEQ,IAAA,KAAA,CAAA,MAAA,CAAK,KAAA,GAAQ,EAAA;;mBAET,EAAM;AACV,IAAA,SAAA,EAAA,yDAAe;sBACX,CAAA,GAAU,CAAC,MAAA,IAAAA,GAAA,CAAA,QAAA,EAAyB;oBACpC;AACJ,MAAA,YAAK,EAAA,MAAA,CAAU,KAAA;qBACX,CAAA,MAAW,KAAA,MAAA,GAAA,eAAmB,GAAA,MAAA,QAAA,CAAA,MAAA,CAAA,MAAA,CAAA;iBAC9B,yHAAM;AACV,MAAA,QAAA,EAAA,MAAK,CAAM;AACP,KAAA,EAAA,MAAA,CAAA,KAAA,CAAA,CAAA,KAAS,CAAG,OAAO,EAAA;uBACZ;AACH,MAAA,IAAA,EAAA,MAAA;mBACH;gBACD,gBAAM;AACV,MAAA,SAAA,EAAA;AACI,KAAA,CAAA;AACI,GAAA,CAAA;AACA;oBACA,GAAA,CAAA;;AAEA,EAAA,IAAA,EAAAA,GAAA,CAAA,KAAA,EAAA;;;;OAKhB,EAAA,GAAM;AAEE,EAAA,IAAA,EAAAA,GAAA,CAAA,KAAS,EAAA;AACT,IAAA,SAAA,EAAA;;AAEI,CAAA,EAAA;SACH,gBAAO;AACZ,EAAA,IAAC,EACAA,GAAA,CAAA,MAAW,EACd;IAEF,SACI,EAAA;AAmHR,GAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"SearchBar.js","sources":["../../src/components/SearchBar.tsx"],"sourcesContent":[null],"names":["_jsx","_jsxs"],"mappings":"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"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Perplexity Demo Module Configuration
3
+ */
4
+ export declare const STORAGE_KEYS: {
5
+ readonly CHAT_HISTORY: "perplexity_chat_history";
6
+ readonly SCREENSHOT_CONFIG: "perplexity_screenshot_config";
7
+ readonly CUSTOM_AI_PROVIDERS: "perplexity_custom_ai_providers";
8
+ readonly SELECTED_AI_PROVIDER: "perplexity_selected_ai_provider";
9
+ readonly SYSTEM_PROMPT: "perplexity_system_prompt";
10
+ };
11
+ export declare const MAX_FILES = 6;
12
+ export declare const MAX_FILE_SIZE_BYTES: number;
13
+ export declare const ACCEPTED_FILE_TYPES: {
14
+ readonly DOCUMENTS: readonly [".pdf", ".doc", ".docx", ".txt", ".md"];
15
+ readonly IMAGES: readonly [".png", ".jpg", ".jpeg", ".gif", ".webp"];
16
+ };
17
+ export declare const ACCEPTED_FILE_TYPES_STRING: string;
18
+ /**
19
+ * Centralized LLM Provider Configuration
20
+ * All API endpoints, models, and provider settings
21
+ */
22
+ export declare const LLM_CONFIG: {
23
+ readonly ENDPOINTS: {
24
+ readonly GROQ_BASE: "https://api.groq.com/openai/v1";
25
+ readonly GROQ_STT: "https://api.groq.com/openai/v1/audio/transcriptions";
26
+ readonly OPENROUTER_BASE: "https://openrouter.ai/api/v1";
27
+ readonly TOGETHER_BASE: "https://api.together.xyz/v1";
28
+ };
29
+ readonly ENV_KEYS: {
30
+ readonly GROQ_API_KEY: "GROQ_API_KEY";
31
+ readonly OPENROUTER_API_KEY: "OPENROUTER_API_KEY";
32
+ readonly TOGETHER_API_KEY: "TOGETHER_API_KEY";
33
+ };
34
+ readonly MODELS: {
35
+ readonly GROQ_VISION_SCOUT: {
36
+ readonly id: "meta-llama/llama-4-scout-17b-16e-instruct";
37
+ readonly name: "Meta Llama 4 Scout 17B (Vision)";
38
+ readonly contextWindow: 128000;
39
+ readonly supportsVision: true;
40
+ readonly description: "Vision-capable model for image and file processing";
41
+ };
42
+ readonly GROQ_GPT_OSS: {
43
+ readonly id: "openai/gpt-oss-120B";
44
+ readonly name: "GPT OSS 120B";
45
+ readonly contextWindow: 128000;
46
+ readonly supportsVision: false;
47
+ readonly description: "Best quality text-only model";
48
+ };
49
+ readonly OPENROUTER_LLAMA_8B: {
50
+ readonly id: "meta-llama/llama-3.1-8b-instruct:free";
51
+ readonly name: "Llama 3.1 8B (Free)";
52
+ readonly contextWindow: 131072;
53
+ readonly supportsVision: false;
54
+ readonly description: "Free tier model";
55
+ };
56
+ readonly OPENROUTER_GEMMA_9B: {
57
+ readonly id: "google/gemma-2-9b-it:free";
58
+ readonly name: "Gemma 2 9B (Free)";
59
+ readonly contextWindow: 8192;
60
+ readonly supportsVision: false;
61
+ readonly description: "Free tier model";
62
+ };
63
+ readonly OPENROUTER_MISTRAL_7B: {
64
+ readonly id: "mistralai/mistral-7b-instruct:free";
65
+ readonly name: "Mistral 7B (Free)";
66
+ readonly contextWindow: 32768;
67
+ readonly supportsVision: false;
68
+ readonly description: "Free tier model";
69
+ };
70
+ readonly OPENROUTER_QWEN_7B: {
71
+ readonly id: "qwen/qwen-2-7b-instruct:free";
72
+ readonly name: "Qwen 2 7B (Free)";
73
+ readonly contextWindow: 32768;
74
+ readonly supportsVision: false;
75
+ readonly description: "Free tier model";
76
+ };
77
+ readonly TOGETHER_LLAMA_8B: {
78
+ readonly id: "meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo";
79
+ readonly name: "Llama 3.1 8B Turbo";
80
+ readonly contextWindow: 131072;
81
+ readonly supportsVision: false;
82
+ readonly description: "Fast and efficient";
83
+ };
84
+ readonly TOGETHER_LLAMA_70B: {
85
+ readonly id: "meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo";
86
+ readonly name: "Llama 3.1 70B Turbo";
87
+ readonly contextWindow: 131072;
88
+ readonly supportsVision: false;
89
+ readonly description: "Best quality";
90
+ };
91
+ readonly TOGETHER_MIXTRAL: {
92
+ readonly id: "mistralai/Mixtral-8x7B-Instruct-v0.1";
93
+ readonly name: "Mixtral 8x7B";
94
+ readonly contextWindow: 32768;
95
+ readonly supportsVision: false;
96
+ readonly description: "Good balance";
97
+ };
98
+ };
99
+ readonly STT: {
100
+ readonly MODEL: "whisper-large-v3-turbo";
101
+ readonly DEFAULT_LANGUAGE: "en";
102
+ };
103
+ readonly DEFAULTS: {
104
+ readonly PROVIDER_ID: "groq";
105
+ readonly MODEL_ID: "openai/gpt-oss-120B";
106
+ };
107
+ };
108
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/config/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,eAAO,MAAM,YAAY;;;;;;CAMf,CAAC;AAKX,eAAO,MAAM,SAAS,IAAI,CAAC;AAG3B,eAAO,MAAM,mBAAmB,QAAmB,CAAC;AAGpD,eAAO,MAAM,mBAAmB;;;CAGtB,CAAC;AAGX,eAAO,MAAM,0BAA0B,QAA8E,CAAC;AAItH;;;GAGG;AACH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkGb,CAAC"}