diff options
| author | Pinapelz <yukais@pinapelz.com> | 2025-09-23 15:05:48 -0700 |
|---|---|---|
| committer | Pinapelz <yukais@pinapelz.com> | 2025-09-23 15:05:48 -0700 |
| commit | 6df78f254d98453520e8644996b917d673ee3978 (patch) | |
| tree | 9e2ed1a8cea6bbab145191e8f40b5b2c59b6c51c /frontend/src/pages | |
| parent | abca372d8ef3d9ab0154c3706d88e0c3772bacc3 (diff) | |
initial mobile CSS style
Diffstat (limited to 'frontend/src/pages')
| -rw-r--r-- | frontend/src/pages/Home.tsx | 20 | ||||
| -rw-r--r-- | frontend/src/pages/Import.tsx | 24 | ||||
| -rw-r--r-- | frontend/src/pages/Landing.tsx | 50 | ||||
| -rw-r--r-- | frontend/src/pages/Score.tsx | 35 |
4 files changed, 67 insertions, 62 deletions
diff --git a/frontend/src/pages/Home.tsx b/frontend/src/pages/Home.tsx index 71ba772..4eb1c59 100644 --- a/frontend/src/pages/Home.tsx +++ b/frontend/src/pages/Home.tsx @@ -75,22 +75,22 @@ const Home = () => { <NavBar user={user} handleLogout={handleLogout} currentPage="home"/> {/* Main Content */} - <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8"> + <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-4 sm:py-8"> {/* Header */} - <div className="mb-8"> - <h1 className="text-3xl font-bold text-white mb-2">Dashboard</h1> - <p className="text-slate-400"> + <div className="mb-6 sm:mb-8"> + <h1 className="text-2xl sm:text-3xl font-bold text-white mb-2">Dashboard</h1> + <p className="text-sm sm:text-base text-slate-400"> Track your rhythm game progress and performance </p> </div> {/* Supported Games */} - <div className="mb-12"> - <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6"> + <div className="mb-8 sm:mb-12"> + <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4 sm:gap-6"> {supportedGames.map((game) => ( <div key={game.internalName} - className="bg-slate-900 rounded-xl border border-slate-700 overflow-hidden hover:border-violet-500 hover:shadow-lg hover:shadow-violet-500/10 transition-all duration-300 group cursor-pointer" + className="bg-slate-900 rounded-lg sm:rounded-xl border border-slate-700 overflow-hidden hover:border-violet-500 hover:shadow-lg hover:shadow-violet-500/10 transition-all duration-300 group cursor-pointer" onClick={() => navigate(`/score?game=${game.internalName}`)} > <div className="aspect-video bg-slate-800 relative overflow-hidden"> @@ -120,11 +120,11 @@ const Home = () => { </div> )} </div> - <div className="p-6"> - <h3 className="text-xl font-semibold text-white mb-2 group-hover:text-violet-400 transition-colors"> + <div className="p-4 sm:p-6"> + <h3 className="text-lg sm:text-xl font-semibold text-white mb-2 group-hover:text-violet-400 transition-colors"> {game.formattedName} </h3> - <p className="text-slate-400 text-sm leading-relaxed"> + <p className="text-slate-400 text-xs sm:text-sm leading-relaxed"> {game.description} </p> </div> diff --git a/frontend/src/pages/Import.tsx b/frontend/src/pages/Import.tsx index fe2501f..08976c7 100644 --- a/frontend/src/pages/Import.tsx +++ b/frontend/src/pages/Import.tsx @@ -92,8 +92,8 @@ const Import = () => { }; const JsonUploadCard = () => ( - <div className="bg-slate-800 rounded-lg border border-slate-700 p-6 hover:border-violet-500 transition-colors"> - <div className="w-12 h-12 bg-violet-600/20 rounded-lg flex items-center justify-center mb-4"> + <div className="bg-slate-800 rounded-lg border border-slate-700 p-4 sm:p-6 hover:border-violet-500 transition-colors"> + <div className="w-10 sm:w-12 h-10 sm:h-12 bg-violet-600/20 rounded-lg flex items-center justify-center mb-3 sm:mb-4"> <svg className="w-6 h-6 text-violet-400" fill="none" @@ -114,7 +114,7 @@ const Import = () => { </p> <button onClick={() => setIsJsonModalOpen(true)} - className="w-full bg-violet-600 hover:bg-violet-700 text-white py-2 px-4 rounded-md font-medium transition-colors" + className="w-full bg-violet-600 hover:bg-violet-700 text-white py-2 px-3 sm:px-4 rounded-md text-sm sm:text-base font-medium transition-colors" > Upload JSON </button> @@ -148,7 +148,7 @@ const Import = () => { </p> <button onClick={() => setIsEamusementModalOpen(true)} - className="w-full bg-blue-600 hover:bg-blue-700 text-white py-2 px-4 rounded-md font-medium transition-colors" + className="w-full bg-blue-600 hover:bg-blue-700 text-white py-2 px-3 sm:px-4 rounded-md text-sm sm:text-base font-medium transition-colors" > Connect e-amusement </button> @@ -193,11 +193,11 @@ const Import = () => { <NavBar user={user} handleLogout={handleLogout} currentPage="import"/> {/* Main Content */} - <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8"> + <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-4 sm:py-8"> {/* Header */} - <div className="mb-8"> - <h1 className="text-3xl font-bold text-white mb-2">Import Data</h1> - <p className="text-slate-400"> + <div className="mb-6 sm:mb-8"> + <h1 className="text-2xl sm:text-3xl font-bold text-white mb-2">Import Data</h1> + <p className="text-sm sm:text-base text-slate-400"> Import your game scores and progress from various sources </p> </div> @@ -224,10 +224,10 @@ const Import = () => { )} {/* Game Selection Card */} - <div className="bg-slate-900 rounded-lg border border-slate-700 p-8"> - <div className="mb-8"> - <h2 className="text-xl font-bold text-white mb-4">Select Game</h2> - <p className="text-slate-400 text-sm mb-6"> + <div className="bg-slate-900 rounded-lg border border-slate-700 p-4 sm:p-6 lg:p-8"> + <div className="mb-6 sm:mb-8"> + <h2 className="text-lg sm:text-xl font-bold text-white mb-3 sm:mb-4">Select Game</h2> + <p className="text-slate-400 text-xs sm:text-sm mb-4 sm:mb-6"> Choose the game you want to import data for </p> diff --git a/frontend/src/pages/Landing.tsx b/frontend/src/pages/Landing.tsx index c607cee..5ca4459 100644 --- a/frontend/src/pages/Landing.tsx +++ b/frontend/src/pages/Landing.tsx @@ -14,16 +14,16 @@ const Landing = () => { </div> <span className="text-white font-semibold text-lg">Mirage</span> </div> - <div className="flex items-center space-x-4"> + <div className="flex items-center space-x-2 sm:space-x-4"> <Link to="/login" - className="text-slate-300 hover:text-white px-3 py-2 rounded-md text-sm font-medium transition-colors" + className="text-slate-300 hover:text-white px-2 sm:px-3 py-2 rounded-md text-sm font-medium transition-colors" > Log In </Link> <Link to="/register" - className="bg-violet-600 hover:bg-violet-700 text-white px-4 py-2 rounded-md text-sm font-medium transition-colors" + className="bg-violet-600 hover:bg-violet-700 text-white px-3 sm:px-4 py-2 rounded-md text-sm font-medium transition-colors" > Create Account </Link> @@ -32,7 +32,7 @@ const Landing = () => { </div> </nav> - <section className="relative py-18 lg:py-24 overflow-hidden"> + <section className="relative py-12 sm:py-18 lg:py-24 overflow-hidden"> {/* Background Image */} <div className="absolute inset-0 bg-cover bg-center bg-no-repeat opacity-30" @@ -48,10 +48,10 @@ const Landing = () => { {/* Content */} <div className="relative max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> <div className="max-w-4xl"> - <h1 className="text-5xl md:text-6xl font-bold text-white mb-6 leading-tight"> + <h1 className="text-3xl sm:text-4xl md:text-5xl lg:text-6xl font-bold text-white mb-4 sm:mb-6 leading-tight"> Welcome to <span className="text-violet-400">Mirage!</span> </h1> - <p className="text-xl text-slate-300 mb-8 leading-relaxed"> + <p className="text-lg sm:text-xl text-slate-300 mb-6 sm:mb-8 leading-relaxed"> Looks like you're not logged in. If you've got an account,{" "} <Link to="/login" @@ -65,17 +65,17 @@ const Landing = () => { </section> {/* Introduction Section */} - <section className="py-8 border-t border-slate-800"> + <section className="py-6 sm:py-8 border-t border-slate-800"> <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> <div className="max-w-4xl"> - <h2 className="text-3xl md:text-4xl font-bold text-white mb-6"> + <h2 className="text-2xl sm:text-3xl md:text-4xl font-bold text-white mb-4 sm:mb-6"> What is this? </h2> - <p className="text-lg text-slate-300 leading-relaxed"> + <p className="text-base sm:text-lg text-slate-300 leading-relaxed"> <span className="font-semibold text-violet-300">Mirage</span> is a flexible Rhythm Game Score Tracker that works without relying on predefined seeds. It offers a lightweight alternative that can act - as a holdover for tracking scores when chart metadata isn’t + as a holdover for tracking scores when chart metadata isn't readily available. </p> </div> @@ -83,13 +83,13 @@ const Landing = () => { </section> {/* Track Your Scores Section */} - <section className="py-8 border-t border-slate-800"> + <section className="py-6 sm:py-8 border-t border-slate-800"> <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> <div className="max-w-4xl"> - <h2 className="text-3xl md:text-4xl font-bold text-white mb-6"> + <h2 className="text-2xl sm:text-3xl md:text-4xl font-bold text-white mb-4 sm:mb-6"> <span className="text-violet-400">Track</span> Your Scores </h2> - <p className="text-lg text-slate-300 leading-relaxed"> + <p className="text-base sm:text-lg text-slate-300 leading-relaxed"> Mirage lets you import scores from the games you play for safe-keeping, so you can prevent losing them to the void should anything ever happen. @@ -99,13 +99,13 @@ const Landing = () => { </section> {/* Add your own games */} - <section className="py-8 border-t border-slate-800"> + <section className="py-6 sm:py-8 border-t border-slate-800"> <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> <div className="max-w-4xl"> - <h2 className="text-3xl md:text-4xl font-bold text-white mb-6"> + <h2 className="text-2xl sm:text-3xl md:text-4xl font-bold text-white mb-4 sm:mb-6"> <span className="text-purple-400">Add</span> Your Own Games </h2> - <p className="text-lg text-slate-300 leading-relaxed"> + <p className="text-base sm:text-lg text-slate-300 leading-relaxed"> While not as robust as other seed-based systems. Mirage makes it easy for you to track and keep score for any game, no matter how niche it is. @@ -115,13 +115,13 @@ const Landing = () => { </section> {/* Join with others */} - <section className="py-8 border-t border-slate-800"> + <section className="py-6 sm:py-8 border-t border-slate-800"> <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> <div className="max-w-4xl"> - <h2 className="text-3xl md:text-4xl font-bold text-white mb-6"> + <h2 className="text-2xl sm:text-3xl md:text-4xl font-bold text-white mb-4 sm:mb-6"> Mirage <span className="text-violet-400">Together</span> </h2> - <p className="text-lg text-slate-300 leading-relaxed"> + <p className="text-base sm:text-lg text-slate-300 leading-relaxed"> Mirage is easily self-hostable and can be used locally for a single person or hosted so you can track scores with your friends. Everything is open-source. </p> </div> @@ -129,22 +129,22 @@ const Landing = () => { </section> {/* Call to Action Section */} - <section className="py-12 border-t border-slate-800 bg-slate-900"> + <section className="py-8 sm:py-12 border-t border-slate-800 bg-slate-900"> <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> <div className="text-center max-w-2xl mx-auto"> - <h2 className="text-3xl md:text-4xl font-bold text-white mb-8"> + <h2 className="text-2xl sm:text-3xl md:text-4xl font-bold text-white mb-6 sm:mb-8"> Ready to Start <span className="text-violet-400">Tracking?</span> </h2> <div className="flex flex-col sm:flex-row items-center justify-center gap-4"> <Link to="/register" - className="bg-violet-600 hover:bg-violet-700 text-white px-8 py-3 rounded-md text-lg font-medium transition-colors min-w-[200px] shadow-lg shadow-violet-600/25" + className="w-full sm:w-auto bg-violet-600 hover:bg-violet-700 text-white px-6 sm:px-8 py-3 rounded-md text-base sm:text-lg font-medium transition-colors min-w-[200px] shadow-lg shadow-violet-600/25 text-center" > Create Account </Link> <Link to="/login" - className="border border-slate-600 hover:border-violet-500 text-slate-300 hover:text-white px-8 py-3 rounded-md text-lg font-medium transition-colors min-w-[200px]" + className="w-full sm:w-auto border border-slate-600 hover:border-violet-500 text-slate-300 hover:text-white px-6 sm:px-8 py-3 rounded-md text-base sm:text-lg font-medium transition-colors min-w-[200px] text-center" > Log In </Link> @@ -154,7 +154,7 @@ const Landing = () => { </section> {/* Footer */} - <footer className="border-t border-slate-800 py-12 bg-slate-950"> + <footer className="border-t border-slate-800 py-8 sm:py-12 bg-slate-950"> <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> <div className="text-center text-slate-400"> <a className="hover:underline" href=""> @@ -167,4 +167,4 @@ const Landing = () => { ); }; -export default Landing; +export default Landing;
\ No newline at end of file diff --git a/frontend/src/pages/Score.tsx b/frontend/src/pages/Score.tsx index 0d18d7a..d842cb0 100644 --- a/frontend/src/pages/Score.tsx +++ b/frontend/src/pages/Score.tsx @@ -39,12 +39,12 @@ const Score = () => { const renderRequestFilterMenu = () => { const filterOptions = getFilterOptions(gameName); return ( - <div className="flex items-center space-x-2 bg-slate-900/50 backdrop-blur-sm rounded-xl p-1 border border-slate-800/50"> + <div className="flex flex-wrap items-center gap-2 bg-slate-900/50 backdrop-blur-sm rounded-xl p-1 border border-slate-800/50"> {filterOptions.map((option) => ( <button key={option.value} onClick={() => setRequestOrder(option.value)} - className={`px-4 py-2 rounded-lg text-sm font-medium transition-all duration-200 ${ + className={`px-3 sm:px-4 py-2 rounded-lg text-xs sm:text-sm font-medium transition-all duration-200 whitespace-nowrap ${ requestOrder === option.value ? "bg-violet-600 text-white shadow-lg shadow-violet-500/25" : "text-slate-300 hover:text-white hover:bg-slate-800/50" @@ -153,16 +153,16 @@ const Score = () => { return ( <div className="min-h-screen bg-gradient-to-br from-slate-950 via-slate-900 to-slate-950 text-white"> <NavBar user={user} handleLogout={handleLogout} currentPage="score" /> - <main className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12"> - <div className="mb-12"> - <div className="flex items-center justify-between mb-4"> - <h1 className="text-4xl font-bold bg-gradient-to-r from-violet-400 to-violet-600 bg-clip-text text-transparent"> + <main className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-6 sm:py-12"> + <div className="mb-6 sm:mb-12"> + <div className="flex flex-col sm:flex-row items-start sm:items-center justify-between gap-4 mb-4"> + <h1 className="text-2xl sm:text-3xl md:text-4xl font-bold bg-gradient-to-r from-violet-400 to-violet-600 bg-clip-text text-transparent"> Your Scores </h1> - <div className="flex items-center space-x-2 bg-slate-900/50 backdrop-blur-sm rounded-xl p-1 border border-slate-800/50"> + <div className="flex items-center space-x-1 sm:space-x-2 bg-slate-900/50 backdrop-blur-sm rounded-xl p-1 border border-slate-800/50"> <button onClick={() => setViewMode("cards")} - className={`px-4 py-2 rounded-lg text-sm font-medium transition-all duration-200 ${ + className={`px-3 sm:px-4 py-2 rounded-lg text-xs sm:text-sm font-medium transition-all duration-200 ${ viewMode === "cards" ? "bg-violet-600 text-white shadow-lg shadow-violet-500/25" : "text-slate-300 hover:text-white hover:bg-slate-800/50" @@ -172,7 +172,7 @@ const Score = () => { </button> <button onClick={() => setViewMode("table")} - className={`px-4 py-2 rounded-lg text-sm font-medium transition-all duration-200 ${ + className={`px-3 sm:px-4 py-2 rounded-lg text-xs sm:text-sm font-medium transition-all duration-200 ${ viewMode === "table" ? "bg-violet-600 text-white shadow-lg shadow-violet-500/25" : "text-slate-300 hover:text-white hover:bg-slate-800/50" @@ -184,8 +184,8 @@ const Score = () => { </div> {/* Filter Menu */} - <div className="flex items-center justify-between mb-6"> - <div className="flex items-center space-x-4"> + <div className="flex items-center justify-between mb-4 sm:mb-6"> + <div className="w-full sm:w-auto"> {renderRequestFilterMenu()} </div> </div> @@ -219,13 +219,13 @@ const Score = () => { })()} {numPages > 1 && ( - <div className="flex justify-center mt-12"> - <div className="flex space-x-2 bg-slate-900/50 backdrop-blur-sm rounded-xl p-2 border border-slate-800/50"> + <div className="flex justify-center mt-8 sm:mt-12"> + <div className="flex flex-wrap gap-1 sm:gap-2 bg-slate-900/50 backdrop-blur-sm rounded-xl p-2 border border-slate-800/50 max-w-full overflow-x-auto"> {[...Array(numPages)].map((_, i) => ( <button key={i} onClick={() => fetchScores(i + 1)} - className={`px-4 py-2 rounded-lg text-sm font-medium transition-all duration-200 ${ + className={`px-3 sm:px-4 py-2 rounded-lg text-xs sm:text-sm font-medium transition-all duration-200 ${ currentPage === i + 1 ? "bg-violet-600 text-white shadow-lg shadow-violet-500/25" : "text-slate-300 hover:text-white hover:bg-slate-800/50" @@ -237,9 +237,14 @@ const Score = () => { </div> </div> )} - <p className="text-slate-400 mt-4 text-lg"> + <p className="text-slate-400 mt-4 text-sm sm:text-base md:text-lg text-center"> Displaying {scores.length} scores • Page {currentPage} of {numPages} </p> + {viewMode === "table" && ( + <p className="text-slate-500 mt-2 text-xs text-center md:hidden"> + ← Swipe horizontally to see more → + </p> + )} </main> </div> ); |
