aboutsummaryrefslogtreecommitdiffstats
path: root/frontend/src/pages
diff options
context:
space:
mode:
authorPinapelz <yukais@pinapelz.com>2025-09-23 15:05:48 -0700
committerPinapelz <yukais@pinapelz.com>2025-09-23 15:05:48 -0700
commit6df78f254d98453520e8644996b917d673ee3978 (patch)
tree9e2ed1a8cea6bbab145191e8f40b5b2c59b6c51c /frontend/src/pages
parentabca372d8ef3d9ab0154c3706d88e0c3772bacc3 (diff)
initial mobile CSS style
Diffstat (limited to 'frontend/src/pages')
-rw-r--r--frontend/src/pages/Home.tsx20
-rw-r--r--frontend/src/pages/Import.tsx24
-rw-r--r--frontend/src/pages/Landing.tsx50
-rw-r--r--frontend/src/pages/Score.tsx35
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>
);
send patches to the email below
yukais@pinapelz.com
include the subject [PATCH repo_name]
pinapelz.com
homepage