Spaces:
Sleeping
Sleeping
gpt-engineer-app[bot]
commited on
Commit
·
6db79a0
1
Parent(s):
9953425
Move SettingsPanel to sidebar
Browse filesMove the SettingsPanel component to the left sidebar, positioned below the "+ New Script" button.
- src/components/ProjectSidebar.tsx +150 -4
- src/pages/Index.tsx +4 -6
src/components/ProjectSidebar.tsx
CHANGED
@@ -5,7 +5,13 @@ import { Input } from "@/components/ui/input";
|
|
5 |
import { Textarea } from "@/components/ui/textarea";
|
6 |
import { ScrollArea } from "@/components/ui/scroll-area";
|
7 |
import { Card, CardContent } from "@/components/ui/card";
|
8 |
-
import { Folder, FolderOpen, FileText, Plus, Search, Edit, Save } from "lucide-react";
|
|
|
|
|
|
|
|
|
|
|
|
|
9 |
|
10 |
interface Project {
|
11 |
id: string;
|
@@ -14,7 +20,12 @@ interface Project {
|
|
14 |
notes?: string;
|
15 |
}
|
16 |
|
17 |
-
|
|
|
|
|
|
|
|
|
|
|
18 |
const [projects, setProjects] = useState<Project[]>([
|
19 |
{
|
20 |
id: '1',
|
@@ -39,6 +50,7 @@ const ProjectSidebar: React.FC = () => {
|
|
39 |
const [selectedProject, setSelectedProject] = useState('1');
|
40 |
const [editingNotes, setEditingNotes] = useState(false);
|
41 |
const [currentNotes, setCurrentNotes] = useState('');
|
|
|
42 |
|
43 |
const filteredProjects = projects.filter(project =>
|
44 |
project.name.toLowerCase().includes(searchTerm.toLowerCase())
|
@@ -72,6 +84,10 @@ const ProjectSidebar: React.FC = () => {
|
|
72 |
|
73 |
const selectedProjectData = projects.find(p => p.id === selectedProject);
|
74 |
|
|
|
|
|
|
|
|
|
75 |
return (
|
76 |
<div className="w-64 bg-black border-r border-scriptRed/20 h-full flex flex-col">
|
77 |
<div className="p-4 border-b border-scriptRed/20">
|
@@ -154,17 +170,147 @@ const ProjectSidebar: React.FC = () => {
|
|
154 |
)}
|
155 |
</div>
|
156 |
|
157 |
-
|
|
|
158 |
<Button
|
159 |
onClick={addNewProject}
|
160 |
className="w-full bg-scriptRed hover:bg-scriptRed/80 text-white"
|
161 |
>
|
162 |
<Plus className="h-4 w-4 mr-1" /> New Script
|
163 |
</Button>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
164 |
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
165 |
</div>
|
166 |
);
|
167 |
};
|
168 |
|
169 |
export default ProjectSidebar;
|
170 |
-
|
|
|
5 |
import { Textarea } from "@/components/ui/textarea";
|
6 |
import { ScrollArea } from "@/components/ui/scroll-area";
|
7 |
import { Card, CardContent } from "@/components/ui/card";
|
8 |
+
import { Folder, FolderOpen, FileText, Plus, Search, Edit, Save, Settings } from "lucide-react";
|
9 |
+
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
|
10 |
+
import { Label } from "@/components/ui/label";
|
11 |
+
import { Switch } from "@/components/ui/switch";
|
12 |
+
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
|
13 |
+
import { Slider } from "@/components/ui/slider";
|
14 |
+
import { Book, Volume2 } from "lucide-react";
|
15 |
|
16 |
interface Project {
|
17 |
id: string;
|
|
|
20 |
notes?: string;
|
21 |
}
|
22 |
|
23 |
+
interface ProjectSidebarProps {
|
24 |
+
dyslexicMode: boolean;
|
25 |
+
setDyslexicMode: (value: boolean) => void;
|
26 |
+
}
|
27 |
+
|
28 |
+
const ProjectSidebar: React.FC<ProjectSidebarProps> = ({ dyslexicMode, setDyslexicMode }) => {
|
29 |
const [projects, setProjects] = useState<Project[]>([
|
30 |
{
|
31 |
id: '1',
|
|
|
50 |
const [selectedProject, setSelectedProject] = useState('1');
|
51 |
const [editingNotes, setEditingNotes] = useState(false);
|
52 |
const [currentNotes, setCurrentNotes] = useState('');
|
53 |
+
const [settingsOpen, setSettingsOpen] = useState(false);
|
54 |
|
55 |
const filteredProjects = projects.filter(project =>
|
56 |
project.name.toLowerCase().includes(searchTerm.toLowerCase())
|
|
|
84 |
|
85 |
const selectedProjectData = projects.find(p => p.id === selectedProject);
|
86 |
|
87 |
+
const toggleSettings = () => {
|
88 |
+
setSettingsOpen(!settingsOpen);
|
89 |
+
};
|
90 |
+
|
91 |
return (
|
92 |
<div className="w-64 bg-black border-r border-scriptRed/20 h-full flex flex-col">
|
93 |
<div className="p-4 border-b border-scriptRed/20">
|
|
|
170 |
)}
|
171 |
</div>
|
172 |
|
173 |
+
{/* Buttons section */}
|
174 |
+
<div className="p-4 space-y-3">
|
175 |
<Button
|
176 |
onClick={addNewProject}
|
177 |
className="w-full bg-scriptRed hover:bg-scriptRed/80 text-white"
|
178 |
>
|
179 |
<Plus className="h-4 w-4 mr-1" /> New Script
|
180 |
</Button>
|
181 |
+
|
182 |
+
<Button
|
183 |
+
onClick={toggleSettings}
|
184 |
+
variant={settingsOpen ? "default" : "outline"}
|
185 |
+
className={`w-full ${settingsOpen ? "bg-scriptRed hover:bg-scriptRed/80" : "border-scriptRed/50"} text-white`}
|
186 |
+
>
|
187 |
+
<Settings className="h-4 w-4 mr-1" /> Settings
|
188 |
+
</Button>
|
189 |
</div>
|
190 |
+
|
191 |
+
{/* Settings Panel - Now inside the sidebar */}
|
192 |
+
{settingsOpen && (
|
193 |
+
<div className="p-4 bg-gray-900 border-t border-scriptRed/20">
|
194 |
+
<Tabs defaultValue="voice" className="w-full">
|
195 |
+
<TabsList className="bg-black w-full grid grid-cols-3">
|
196 |
+
<TabsTrigger value="voice" className="data-[state=active]:bg-scriptRed">Voice</TabsTrigger>
|
197 |
+
<TabsTrigger value="accessibility" className="data-[state=active]:bg-scriptRed">Access</TabsTrigger>
|
198 |
+
<TabsTrigger value="export" className="data-[state=active]:bg-scriptRed">Export</TabsTrigger>
|
199 |
+
</TabsList>
|
200 |
+
|
201 |
+
<TabsContent value="voice" className="space-y-3 mt-3">
|
202 |
+
<div className="space-y-2">
|
203 |
+
<Label htmlFor="voice" className="text-white">Voice</Label>
|
204 |
+
<Select defaultValue="male1">
|
205 |
+
<SelectTrigger className="bg-black border-scriptRed/20">
|
206 |
+
<SelectValue placeholder="Select voice" />
|
207 |
+
</SelectTrigger>
|
208 |
+
<SelectContent className="bg-black border-scriptRed/20">
|
209 |
+
<SelectItem value="male1">Male Voice 1</SelectItem>
|
210 |
+
<SelectItem value="male2">Male Voice 2</SelectItem>
|
211 |
+
<SelectItem value="female1">Female Voice 1</SelectItem>
|
212 |
+
<SelectItem value="female2">Female Voice 2</SelectItem>
|
213 |
+
</SelectContent>
|
214 |
+
</Select>
|
215 |
+
</div>
|
216 |
+
|
217 |
+
<div className="space-y-2">
|
218 |
+
<Label htmlFor="language" className="text-white">Language</Label>
|
219 |
+
<Select defaultValue="en-US">
|
220 |
+
<SelectTrigger className="bg-black border-scriptRed/20">
|
221 |
+
<SelectValue placeholder="Select language" />
|
222 |
+
</SelectTrigger>
|
223 |
+
<SelectContent className="bg-black border-scriptRed/20">
|
224 |
+
<SelectItem value="en-US">English (US)</SelectItem>
|
225 |
+
<SelectItem value="en-UK">English (UK)</SelectItem>
|
226 |
+
<SelectItem value="es">Spanish</SelectItem>
|
227 |
+
<SelectItem value="fr">French</SelectItem>
|
228 |
+
</SelectContent>
|
229 |
+
</Select>
|
230 |
+
</div>
|
231 |
+
|
232 |
+
<div className="space-y-1">
|
233 |
+
<div className="flex items-center justify-between">
|
234 |
+
<Label className="text-white text-xs">Volume</Label>
|
235 |
+
<span className="text-xs text-white">80%</span>
|
236 |
+
</div>
|
237 |
+
<Slider defaultValue={[80]} max={100} step={1} className="w-full" />
|
238 |
+
</div>
|
239 |
+
|
240 |
+
<div className="space-y-1">
|
241 |
+
<Label className="text-white text-xs">Pitch</Label>
|
242 |
+
<Slider defaultValue={[50]} max={100} step={1} className="w-full" />
|
243 |
+
</div>
|
244 |
+
</TabsContent>
|
245 |
+
|
246 |
+
<TabsContent value="accessibility" className="space-y-3 mt-3">
|
247 |
+
<div className="flex items-center justify-between">
|
248 |
+
<Label htmlFor="dyslexic-mode" className="text-white text-xs">
|
249 |
+
Dyslexia Font
|
250 |
+
</Label>
|
251 |
+
<Switch
|
252 |
+
id="dyslexic-mode"
|
253 |
+
checked={dyslexicMode}
|
254 |
+
onCheckedChange={setDyslexicMode}
|
255 |
+
className="data-[state=checked]:bg-scriptRed"
|
256 |
+
/>
|
257 |
+
</div>
|
258 |
+
|
259 |
+
<div className="flex items-center justify-between">
|
260 |
+
<Label htmlFor="large-text" className="text-white text-xs">
|
261 |
+
Large Text
|
262 |
+
</Label>
|
263 |
+
<Switch
|
264 |
+
id="large-text"
|
265 |
+
className="data-[state=checked]:bg-scriptRed"
|
266 |
+
/>
|
267 |
+
</div>
|
268 |
+
|
269 |
+
<div className="flex items-center justify-between">
|
270 |
+
<Label htmlFor="high-contrast" className="text-white text-xs">
|
271 |
+
High Contrast
|
272 |
+
</Label>
|
273 |
+
<Switch
|
274 |
+
id="high-contrast"
|
275 |
+
className="data-[state=checked]:bg-scriptRed"
|
276 |
+
/>
|
277 |
+
</div>
|
278 |
+
</TabsContent>
|
279 |
+
|
280 |
+
<TabsContent value="export" className="space-y-3 mt-3">
|
281 |
+
<div className="space-y-2">
|
282 |
+
<Label htmlFor="export-format" className="text-white">Format</Label>
|
283 |
+
<Select defaultValue="mp3">
|
284 |
+
<SelectTrigger className="bg-black border-scriptRed/20">
|
285 |
+
<SelectValue placeholder="Select format" />
|
286 |
+
</SelectTrigger>
|
287 |
+
<SelectContent className="bg-black border-scriptRed/20">
|
288 |
+
<SelectItem value="mp3">MP3</SelectItem>
|
289 |
+
<SelectItem value="wav">WAV</SelectItem>
|
290 |
+
<SelectItem value="ogg">OGG</SelectItem>
|
291 |
+
</SelectContent>
|
292 |
+
</Select>
|
293 |
+
</div>
|
294 |
+
|
295 |
+
<div className="space-y-2">
|
296 |
+
<Label htmlFor="quality" className="text-white">Quality</Label>
|
297 |
+
<Select defaultValue="high">
|
298 |
+
<SelectTrigger className="bg-black border-scriptRed/20">
|
299 |
+
<SelectValue placeholder="Select quality" />
|
300 |
+
</SelectTrigger>
|
301 |
+
<SelectContent className="bg-black border-scriptRed/20">
|
302 |
+
<SelectItem value="low">Low (faster)</SelectItem>
|
303 |
+
<SelectItem value="medium">Medium</SelectItem>
|
304 |
+
<SelectItem value="high">High (slower)</SelectItem>
|
305 |
+
</SelectContent>
|
306 |
+
</Select>
|
307 |
+
</div>
|
308 |
+
</TabsContent>
|
309 |
+
</Tabs>
|
310 |
+
</div>
|
311 |
+
)}
|
312 |
</div>
|
313 |
);
|
314 |
};
|
315 |
|
316 |
export default ProjectSidebar;
|
|
src/pages/Index.tsx
CHANGED
@@ -2,7 +2,6 @@
|
|
2 |
import React, { useState } from 'react';
|
3 |
import ProjectSidebar from '@/components/ProjectSidebar';
|
4 |
import EditorPanel from '@/components/EditorPanel';
|
5 |
-
import SettingsPanel from '@/components/SettingsPanel';
|
6 |
|
7 |
const Index = () => {
|
8 |
const [dyslexicMode, setDyslexicMode] = useState<boolean>(false);
|
@@ -22,15 +21,14 @@ const Index = () => {
|
|
22 |
</header>
|
23 |
|
24 |
<main className="flex-1 flex">
|
25 |
-
<ProjectSidebar
|
|
|
|
|
|
|
26 |
<div className="flex-1 flex flex-col">
|
27 |
<div className="flex-1 p-4">
|
28 |
<EditorPanel dyslexicMode={dyslexicMode} />
|
29 |
</div>
|
30 |
-
<SettingsPanel
|
31 |
-
dyslexicMode={dyslexicMode}
|
32 |
-
setDyslexicMode={setDyslexicMode}
|
33 |
-
/>
|
34 |
</div>
|
35 |
</main>
|
36 |
</div>
|
|
|
2 |
import React, { useState } from 'react';
|
3 |
import ProjectSidebar from '@/components/ProjectSidebar';
|
4 |
import EditorPanel from '@/components/EditorPanel';
|
|
|
5 |
|
6 |
const Index = () => {
|
7 |
const [dyslexicMode, setDyslexicMode] = useState<boolean>(false);
|
|
|
21 |
</header>
|
22 |
|
23 |
<main className="flex-1 flex">
|
24 |
+
<ProjectSidebar
|
25 |
+
dyslexicMode={dyslexicMode}
|
26 |
+
setDyslexicMode={setDyslexicMode}
|
27 |
+
/>
|
28 |
<div className="flex-1 flex flex-col">
|
29 |
<div className="flex-1 p-4">
|
30 |
<EditorPanel dyslexicMode={dyslexicMode} />
|
31 |
</div>
|
|
|
|
|
|
|
|
|
32 |
</div>
|
33 |
</main>
|
34 |
</div>
|