From 01d4813c73f303acc32f23e4c35bd57499d090de Mon Sep 17 00:00:00 2001 From: Ritik Khatri Date: Sat, 25 Oct 2025 17:00:02 +0530 Subject: [PATCH 1/5] feat: add theme switcher and theme provider to speaker-recognition-ui --- extras/speaker-recognition/webui/src/App.tsx | 31 ++++++++++--------- .../webui/src/components/ThemeSwitcher.tsx | 12 +++++++ .../webui/src/components/layout/Layout.tsx | 3 ++ .../webui/src/styles/components.css | 13 ++++++++ 4 files changed, 45 insertions(+), 14 deletions(-) create mode 100644 extras/speaker-recognition/webui/src/components/ThemeSwitcher.tsx diff --git a/extras/speaker-recognition/webui/src/App.tsx b/extras/speaker-recognition/webui/src/App.tsx index 9d4650b5..1bfd1f60 100644 --- a/extras/speaker-recognition/webui/src/App.tsx +++ b/extras/speaker-recognition/webui/src/App.tsx @@ -9,24 +9,27 @@ import Inference from './pages/Inference' import InferLive from './pages/InferLive' import InferLiveSimplified from './pages/InferLiveSimplified' import './App.css' +import { ThemeProvider } from './contexts/ThemeContext' function App() { return ( - - - - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - - - + + + + + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + + + + ) } diff --git a/extras/speaker-recognition/webui/src/components/ThemeSwitcher.tsx b/extras/speaker-recognition/webui/src/components/ThemeSwitcher.tsx new file mode 100644 index 00000000..a8d42b2d --- /dev/null +++ b/extras/speaker-recognition/webui/src/components/ThemeSwitcher.tsx @@ -0,0 +1,12 @@ +import { useTheme } from "../contexts/ThemeContext"; +import { Moon, Sun } from 'lucide-react'; + +export const ThemeSwitcher = () => { + const { isDark, toggleTheme } = useTheme(); + return ; +} \ No newline at end of file diff --git a/extras/speaker-recognition/webui/src/components/layout/Layout.tsx b/extras/speaker-recognition/webui/src/components/layout/Layout.tsx index 29c8d681..4dd01fb5 100644 --- a/extras/speaker-recognition/webui/src/components/layout/Layout.tsx +++ b/extras/speaker-recognition/webui/src/components/layout/Layout.tsx @@ -3,6 +3,7 @@ import { Link, useLocation } from 'react-router-dom' import { Mic, Music, FileText, Users, Brain, User, Radio, Wifi } from 'lucide-react' import UserSelector from '../UserSelector' import ConnectionStatus from '../ConnectionStatus' +import { ThemeSwitcher } from '../ThemeSwitcher' interface LayoutProps { children: React.ReactNode @@ -35,6 +36,8 @@ export default function Layout({ children }: LayoutProps) {
+
+
diff --git a/extras/speaker-recognition/webui/src/styles/components.css b/extras/speaker-recognition/webui/src/styles/components.css index 3fbd648b..bb6e5a03 100644 --- a/extras/speaker-recognition/webui/src/styles/components.css +++ b/extras/speaker-recognition/webui/src/styles/components.css @@ -2,6 +2,19 @@ @tailwind components; @tailwind utilities; +:root { + --bg: #fff; + --text: #222; +} +[data-theme="dark"] { + --bg: #222; + --text: #fff; +} +body { + background: var(--bg); + color: var(--text); +} + @layer components { /* Card/Container styles */ .card { From 3e0c38571918efbbd58afc8897bd41619e425456 Mon Sep 17 00:00:00 2001 From: Ritik Khatri Date: Sat, 25 Oct 2025 22:49:46 +0530 Subject: [PATCH 2/5] feat: speaker recognition web ui theme styling throughout --- .../src/components/AudioRecordingControls.tsx | 10 +- .../webui/src/components/ConnectionStatus.tsx | 2 +- .../webui/src/components/FileUploader.tsx | 12 +- .../src/components/ProcessingModeSelector.tsx | 66 +++--- .../src/components/SpeakerResultsDisplay.tsx | 6 +- .../webui/src/components/ThemeSwitcher.tsx | 4 +- .../webui/src/components/UserSelector.tsx | 30 +-- .../webui/src/components/layout/Layout.tsx | 20 +- .../webui/src/pages/Annotation.tsx | 114 +++++----- .../webui/src/pages/AudioViewer.tsx | 52 ++--- .../webui/src/pages/Enrollment.tsx | 98 ++++----- .../webui/src/pages/InferLive.tsx | 50 ++--- .../webui/src/pages/InferLiveSimplified.tsx | 74 +++---- .../webui/src/pages/Inference.tsx | 76 +++---- .../webui/src/pages/Speakers.tsx | 200 +++++++++--------- .../webui/src/styles/components.css | 46 +++- .../webui/tailwind.config.js | 1 + 17 files changed, 443 insertions(+), 418 deletions(-) diff --git a/extras/speaker-recognition/webui/src/components/AudioRecordingControls.tsx b/extras/speaker-recognition/webui/src/components/AudioRecordingControls.tsx index 2e2e1022..4130f62d 100644 --- a/extras/speaker-recognition/webui/src/components/AudioRecordingControls.tsx +++ b/extras/speaker-recognition/webui/src/components/AudioRecordingControls.tsx @@ -129,14 +129,14 @@ export const AudioRecordingControls: React.FC = ({ return (
-

🎤 Record Audio

+

🎤 Record Audio

{/* Recording Status */}
{/* Status Indicator */}
{getStatusIcon()} - {getStatusText()} + {getStatusText()}
{/* Recording Controls */} @@ -171,7 +171,7 @@ export const AudioRecordingControls: React.FC = ({
{/* Browser Compatibility Info */} -
+

Record audio for speaker identification

{location.protocol !== 'https:' && location.hostname !== 'localhost' @@ -200,11 +200,11 @@ export const AudioRecordingControls: React.FC = ({

-
Duration
+
Duration
{formatDuration(processedAudio.buffer.duration * 1000)}
-
Sample Rate
+
Sample Rate
{(processedAudio.buffer.sampleRate / 1000).toFixed(1)} kHz
diff --git a/extras/speaker-recognition/webui/src/components/ConnectionStatus.tsx b/extras/speaker-recognition/webui/src/components/ConnectionStatus.tsx index 7960e664..8242f5dc 100644 --- a/extras/speaker-recognition/webui/src/components/ConnectionStatus.tsx +++ b/extras/speaker-recognition/webui/src/components/ConnectionStatus.tsx @@ -102,7 +102,7 @@ export default function ConnectionStatus() { onClick={() => checkBackendConnection()} > - {getStatusText()} + {getStatusText()}
) } diff --git a/extras/speaker-recognition/webui/src/components/FileUploader.tsx b/extras/speaker-recognition/webui/src/components/FileUploader.tsx index 26299ba0..f236c147 100644 --- a/extras/speaker-recognition/webui/src/components/FileUploader.tsx +++ b/extras/speaker-recognition/webui/src/components/FileUploader.tsx @@ -127,14 +127,14 @@ export default function FileUploader({
-

+

{isDragOver ? 'Drop files here' : (title || 'Upload Audio Files')}

-

+

Drag and drop or click to select files

{accept.includes('audio') && ( -

+

Supported: WAV, FLAC, MP3, M4A, OGG

)} @@ -149,7 +149,7 @@ export default function FileUploader({ {/* Selected Files List */} {selectedFiles.length > 0 && (
-

Selected Files:

+

Selected Files:

{selectedFiles.map((file, index) => (
-

{file.name}

-

{formatFileSize(file.size)}

+

{file.name}

+

{formatFileSize(file.size)}

; } \ No newline at end of file diff --git a/extras/speaker-recognition/webui/src/components/UserSelector.tsx b/extras/speaker-recognition/webui/src/components/UserSelector.tsx index ece819bb..52727a9d 100644 --- a/extras/speaker-recognition/webui/src/components/UserSelector.tsx +++ b/extras/speaker-recognition/webui/src/components/UserSelector.tsx @@ -37,7 +37,7 @@ export default function UserSelector() { if (isLoading) { return ( -
+
Loading...
@@ -49,42 +49,42 @@ export default function UserSelector() { {/* Current User Display / Dropdown Trigger */} {/* Dropdown Menu */} {isDropdownOpen && ( -
+
{/* Existing Users */} {users.length > 0 && ( <> -
+
Select User
{users.map((u) => ( ))} -
+
)} @@ -92,7 +92,7 @@ export default function UserSelector() { {!isCreating ? ( @@ -123,7 +123,7 @@ export default function UserSelector() { setIsCreating(false) setNewUsername('') }} - className="flex-1 px-2 py-1 text-xs bg-gray-300 text-gray-700 rounded hover:bg-gray-400" + className="btn-secondary" disabled={isSubmitting} > Cancel diff --git a/extras/speaker-recognition/webui/src/components/layout/Layout.tsx b/extras/speaker-recognition/webui/src/components/layout/Layout.tsx index 4dd01fb5..93eb4578 100644 --- a/extras/speaker-recognition/webui/src/components/layout/Layout.tsx +++ b/extras/speaker-recognition/webui/src/components/layout/Layout.tsx @@ -23,22 +23,22 @@ export default function Layout({ children }: LayoutProps) { ] return ( -
+
{/* Header */} -
+
- -

+ +

Speaker Recognition System

-
+
-
+
@@ -57,8 +57,8 @@ export default function Layout({ children }: LayoutProps) { to={path} className={`flex items-center space-x-3 px-3 py-2 rounded-md text-sm font-medium transition-colors ${ location.pathname === path - ? 'bg-blue-100 text-blue-900' - : 'text-gray-700 hover:bg-gray-100' + ? 'bg-blue-100 text-blue-900 dark:bg-blue-900 dark:text-blue-100' + : 'input-label hover-bg' }`} > @@ -80,9 +80,9 @@ export default function Layout({ children }: LayoutProps) {
{/* Footer */} -