aboutsummaryrefslogtreecommitdiff
path: root/web/src/components/MainMenu.tsx
diff options
context:
space:
mode:
authorsrdusr <trevorgray@srdusr.com>2025-09-26 13:39:28 +0200
committersrdusr <trevorgray@srdusr.com>2025-09-26 13:39:28 +0200
commit8d60c7f93407988ee0232ea90980028f299cb0f3 (patch)
treeb343b691d1bce64fb3bc9b40324857486f2be244 /web/src/components/MainMenu.tsx
parent76f0d0e902e6ed164704572bd81faa5e5e560cf3 (diff)
downloadtyperpunk-8d60c7f93407988ee0232ea90980028f299cb0f3.tar.gz
typerpunk-8d60c7f93407988ee0232ea90980028f299cb0f3.zip
Initial Commit
Diffstat (limited to 'web/src/components/MainMenu.tsx')
-rw-r--r--web/src/components/MainMenu.tsx63
1 files changed, 63 insertions, 0 deletions
diff --git a/web/src/components/MainMenu.tsx b/web/src/components/MainMenu.tsx
new file mode 100644
index 0000000..b8daea0
--- /dev/null
+++ b/web/src/components/MainMenu.tsx
@@ -0,0 +1,63 @@
+import React from 'react';
+import { useTheme } from '../contexts/ThemeContext';
+import { Theme } from '../types';
+
+interface Props {
+ onStartGame: () => void;
+ categories?: string[];
+ selectedCategory?: string;
+ onSelectCategory?: (cat: string) => void;
+}
+
+const MainMenu: React.FC<Props> = ({ onStartGame, categories = [], selectedCategory = 'random', onSelectCategory }) => {
+ const { theme, toggleTheme } = useTheme();
+
+ return (
+ <div className="main-menu">
+ <h1>TyperPunk</h1>
+ <div className="menu-options">
+ <div style={{ marginBottom: '0.75rem' }}>
+ <label htmlFor="category" style={{ marginRight: 8 }}>Category:</label>
+ <select
+ id="category"
+ value={selectedCategory}
+ onChange={(e) => onSelectCategory && onSelectCategory(e.target.value)}
+ style={{ padding: '0.4rem 0.6rem' }}
+ >
+ <option value="random">Random</option>
+ {categories.map((c) => (
+ <option key={c} value={c}>{c}</option>
+ ))}
+ </select>
+ </div>
+ <button className="menu-button" onClick={onStartGame}>
+ Start Typing Test
+ </button>
+ <button className="menu-button" onClick={toggleTheme}>
+ Toggle {theme === Theme.Dark ? 'Light' : 'Dark'} Mode
+ </button>
+ </div>
+ <button onClick={toggleTheme} className="theme-toggle">
+ {theme === Theme.Dark ? (
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
+ <circle cx="12" cy="12" r="5"/>
+ <line x1="12" y1="1" x2="12" y2="3"/>
+ <line x1="12" y1="21" x2="12" y2="23"/>
+ <line x1="4.22" y1="4.22" x2="5.64" y2="5.64"/>
+ <line x1="18.36" y1="18.36" x2="19.78" y2="19.78"/>
+ <line x1="1" y1="12" x2="3" y2="12"/>
+ <line x1="21" y1="12" x2="23" y2="12"/>
+ <line x1="4.22" y1="19.78" x2="5.64" y2="18.36"/>
+ <line x1="18.36" y1="5.64" x2="19.78" y2="4.22"/>
+ </svg>
+ ) : (
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
+ <path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/>
+ </svg>
+ )}
+ </button>
+ </div>
+ );
+};
+
+export default MainMenu; \ No newline at end of file