Skip to content

Commit cc3df0c

Browse files
authored
Merge pull request #17 from 0x3EF8/ui-enhancements
UI enhancements
2 parents 05a3209 + 23981db commit cc3df0c

13 files changed

Lines changed: 534 additions & 253 deletions

File tree

app/(auth)/login/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export default async function Login() {
1313
return (
1414
<div className="min-h-screen flex bg-[#0a0a1a] text-white">
1515
{/* Left Side - Visual / Branding */}
16-
<div className="hidden lg:flex lg:w-1/2 relative flex-col justify-between p-12 border-r border-white/5 bg-gradient-to-br from-[#0a0a1a] to-[#0a0a1a] overflow-hidden">
16+
<div className="hidden lg:flex lg:w-1/2 relative flex-col justify-between p-12 md:p-16 xl:p-24 border-r border-white/5 bg-gradient-to-br from-[#0a0a1a] to-[#0a0a1a] overflow-hidden">
1717
{/* Background elements */}
1818
<div className="absolute inset-0 grid-bg opacity-30" />
1919

app/(auth)/signup/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export default async function Signup() {
1313
return (
1414
<div className="min-h-screen flex bg-[#0a0a1a] text-white">
1515
{/* Left Side - Visual / Branding */}
16-
<div className="hidden lg:flex lg:w-1/2 relative flex-col justify-between p-12 border-r border-white/5 bg-gradient-to-br from-[#0a0a1a] to-[#0a0a1a] overflow-hidden">
16+
<div className="hidden lg:flex lg:w-1/2 relative flex-col justify-between p-12 md:p-16 xl:p-24 border-r border-white/5 bg-gradient-to-br from-[#0a0a1a] to-[#0a0a1a] overflow-hidden">
1717
{/* Background elements */}
1818
<div className="absolute inset-0 grid-bg opacity-30" />
1919

app/(public)/leaderboard/[slug]/page.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { createClient } from "../../../lib/supabase/server";
22
import LeaderboardTable from "../../../components/LeaderboardTable";
33
import LeaderboardHeader from "@/app/components/leaderboard/Header";
4+
import BackButton from "@/app/components/leaderboard/BackButton";
45
import Footer from "@/app/components/layout/Footer";
56
import CTA from "@/app/components/layout/CTA";
67

@@ -52,10 +53,10 @@ export default async function LeaderboardPage(props: {
5253
return (
5354
<div className="min-h-screen bg-[#0a0a1a] text-white grid-bg relative">
5455
<div className="max-w-5xl mx-auto p-6 md:p-10 relative z-10">
56+
<BackButton />
5557
<LeaderboardHeader leaderboard={leaderboard} isOwner={isOwner} />
5658
<LeaderboardTable
5759
members={members || []}
58-
isOwner={isOwner}
5960
ownerId={user?.id}
6061
/>
6162
</div>

app/(user)/dashboard/leaderboards/page.tsx

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import DashboardWithKey from "../../../components/dashboard/WithKey";
2-
import LeaderboardsList from "@/app/components/dashboard/LeaderbordList";
1+
import DashboardWithKey from "../../../components/dashboard/WithKey";
2+
import LeaderboardsList from "@/app/components/dashboard/LeaderbordList";
33
import { Metadata } from "next";
44

55
export const metadata: Metadata = {
@@ -9,21 +9,19 @@ export const metadata: Metadata = {
99

1010
export default function LeaderboardsPage() {
1111
return (
12-
<div className="space-y-6">
13-
<div>
14-
<h1 className="text-2xl font-bold text-white">Leaderboards</h1>
15-
<p className="text-sm text-gray-600">
16-
Create, join, and manage your coding leaderboards
17-
</p>
12+
<div className="space-y-6 max-w-5xl mx-auto">
13+
<div className="border-b border-white/5 pb-5 flex flex-col sm:flex-row sm:items-center justify-between gap-4">
14+
<div>
15+
<h1 className="text-2xl font-bold text-white tracking-tight">Leaderboards</h1>
16+
<p className="text-sm text-gray-500 font-medium tracking-wide mt-1">
17+
Create, join, and manage your coding servers
18+
</p>
19+
</div>
20+
<DashboardWithKey />
1821
</div>
1922

20-
<div className="grid grid-cols-1 xl:grid-cols-5 gap-6">
21-
<div className="xl:col-span-2">
22-
<DashboardWithKey />
23-
</div>
24-
<div className="xl:col-span-3">
25-
<LeaderboardsList />
26-
</div>
23+
<div className="w-full">
24+
<LeaderboardsList />
2725
</div>
2826
</div>
2927
);

app/components/BoardList.tsx

Lines changed: 68 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
"use client";
1+
"use client";
22

33
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
44
import { createClient } from "../lib/supabase/client";
55
import Link from "next/link";
66
import { useState } from "react";
7-
import { faKey, faRefresh, faTrash } from "@fortawesome/free-solid-svg-icons";
7+
import { faKey, faRotateRight, faTrashAlt, faChevronRight, faServer } from "@fortawesome/free-solid-svg-icons";
88
import { toast } from "react-toastify";
99
import { Leaderboard } from "./dashboard/LeaderbordList";
1010
import { User } from "@supabase/supabase-js";
@@ -18,7 +18,7 @@ export default function BoardList({
1818
}) {
1919
const supabase = createClient();
2020
const [showCodeModal, setShowCodeModal] = useState(false);
21-
const [selectedCode, setSelectedCode] = useState<string | null>(null);
21+
const [selectedCode, setSelectedCode] = useState<string | null>(null);
2222
const [showDeleteModal, setShowDeleteModal] = useState(false);
2323

2424
const handleDelete = async () => {
@@ -88,7 +88,7 @@ export default function BoardList({
8888
error: {
8989
render({ data }) {
9090
const err = data as Error;
91-
return err?.message || "Failed to get join code. Please try again.";
91+
return err?.message || "Failed to get join code. Please try again.";
9292
},
9393
},
9494
});
@@ -101,91 +101,106 @@ export default function BoardList({
101101

102102
return (
103103
<>
104-
<div
105-
key={board.id}
106-
className="stat-card flex justify-between items-center group"
107-
>
108-
<Link href={`/leaderboard/${board.slug}`} className="flex-1">
109-
<p className="font-medium text-gray-300 group-hover:text-indigo-400 transition">
110-
{board.name}
111-
</p>
104+
<div className="flex justify-between items-center group/card p-4 sm:p-5">
105+
<Link href={`/leaderboard/${board.slug}`} className="flex-1 flex items-center min-w-0 pr-4">
106+
<div className="w-10 h-10 rounded-lg bg-gradient-to-br from-white/5 to-white/10 border border-white/10 flex items-center justify-center shrink-0 mr-4 shadow-sm group-hover/card:border-indigo-500/30 transition-colors">
107+
<FontAwesomeIcon icon={faServer} className="text-gray-400 group-hover/card:text-indigo-400 transition-colors w-4 h-4" />
108+
</div>
109+
<div className="flex flex-col flex-1 min-w-0">
110+
<div className="flex items-center gap-2">
111+
<p className="font-bold text-gray-200 group-hover/card:text-white transition-colors tracking-tight truncate text-[15px]">
112+
{board.name}
113+
</p>
114+
</div>
115+
<p className="text-[11px] text-gray-500 font-mono tracking-wider truncate mt-0.5 group-hover/card:text-indigo-300/70 transition-colors">
116+
/{board.slug}
117+
</p>
118+
</div>
119+
120+
<div className="hidden sm:flex w-8 h-8 rounded-full border border-white/5 bg-white/5 items-center justify-center opacity-0 -translate-x-4 group-hover/card:opacity-100 group-hover/card:translate-x-0 transition-all duration-300 ml-4">
121+
<FontAwesomeIcon icon={faChevronRight} className="text-indigo-400 w-3 h-3" />
122+
</div>
112123
</Link>
113124

114125
{user.id === board.owner_id && (
115-
<div className="flex items-center gap-2">
126+
<div className="flex items-center gap-1 sm:gap-2 ml-2 pl-4 border-l border-white/10 shrink-0">
116127
<button
117-
onClick={() => setShowDeleteModal(true)}
118-
className="p-2 rounded-lg text-gray-600 hover:text-red-400 hover:bg-red-500/10 transition"
119-
title="Delete Leaderboard"
128+
onClick={() => getJoinCode(board.id)}
129+
className="w-8 h-8 flex items-center justify-center rounded-md text-gray-500 hover:text-indigo-400 hover:bg-indigo-500/10 transition-colors"
130+
title="View Join Code"
120131
>
121-
<FontAwesomeIcon icon={faTrash} className="text-xs" />
132+
<FontAwesomeIcon icon={faKey} className="w-3.5 h-3.5" />
122133
</button>
123134
<button
124135
onClick={() => regenerateJoinCode(board.id)}
125-
className="p-2 rounded-lg text-gray-600 hover:text-indigo-400 hover:bg-indigo-500/10 transition"
136+
className="w-8 h-8 flex items-center justify-center rounded-md text-gray-500 hover:text-blue-400 hover:bg-blue-500/10 transition-colors"
126137
title="Regenerate Join Code"
127138
>
128-
<FontAwesomeIcon icon={faRefresh} className="text-xs" />
139+
<FontAwesomeIcon icon={faRotateRight} className="w-3.5 h-3.5" />
129140
</button>
130141
<button
131-
onClick={() => getJoinCode(board.id)}
132-
className="p-2 rounded-lg text-gray-600 hover:text-indigo-400 hover:bg-indigo-500/10 transition"
133-
title="View Join Code"
142+
onClick={() => setShowDeleteModal(true)}
143+
className="w-8 h-8 flex items-center justify-center rounded-md text-gray-500 hover:text-red-400 hover:bg-red-500/10 transition-colors"
144+
title="Delete Leaderboard"
134145
>
135-
<FontAwesomeIcon icon={faKey} className="text-xs" />
146+
<FontAwesomeIcon icon={faTrashAlt} className="w-3.5 h-3.5" />
136147
</button>
137148
</div>
138149
)}
139150
</div>
140151

141152
{showCodeModal && (
142-
<div className="fixed inset-0 z-50 flex items-center justify-center backdrop-blur-sm">
143-
<div className="glass-card p-8 w-[90%] max-w-md">
144-
<h3 className="text-lg font-semibold mb-4 text-gray-200">
145-
Join Code
153+
<div className="fixed inset-0 z-[100] flex items-center justify-center bg-black/80 backdrop-blur-md p-4">
154+
<div className="glass-card p-8 w-full max-w-sm relative shadow-2xl border-indigo-500/20">
155+
<div className="absolute -top-10 -right-10 w-32 h-32 bg-indigo-500/20 rounded-full blur-3xl" />
156+
157+
<h3 className="text-[11px] font-bold tracking-widest uppercase text-indigo-400 mb-6 text-center flex items-center justify-center gap-2">
158+
<FontAwesomeIcon icon={faKey} /> Server Join Code
146159
</h3>
147-
148-
<div className="text-center text-3xl font-bold tracking-widest text-indigo-400 mb-6 py-4 stat-card">
149-
{selectedCode}
160+
161+
<div className="bg-black/50 border border-white/10 rounded-xl p-6 text-center relative overflow-hidden group">
162+
<div className="absolute inset-0 bg-gradient-to-tr from-indigo-500/5 to-transparent opacity-0 group-hover:opacity-100 transition-opacity" />
163+
<p className="text-3xl font-mono text-white tracking-[0.2em] font-bold relative z-10">
164+
{selectedCode}
165+
</p>
166+
</div>
167+
168+
<div className="mt-8 flex justify-center">
169+
<button
170+
onClick={() => setShowCodeModal(false)}
171+
className="w-full py-2.5 px-4 bg-white/5 hover:bg-white/10 border border-white/10 rounded-lg text-sm font-medium text-gray-300 transition-colors"
172+
>
173+
Close Window
174+
</button>
150175
</div>
151-
152-
<button
153-
onClick={() => setShowCodeModal(false)}
154-
className="btn-secondary w-full py-2.5"
155-
>
156-
Close
157-
</button>
158176
</div>
159177
</div>
160178
)}
161179

162180
{showDeleteModal && (
163-
<div className="fixed inset-0 z-50 flex items-center justify-center backdrop-blur-sm">
164-
<div className="glass-card p-8 w-[90%] max-w-md">
165-
<h3 className="text-lg font-semibold mb-4 text-gray-200">
166-
Delete Leaderboard?
181+
<div className="fixed inset-0 z-[100] flex items-center justify-center bg-black/80 backdrop-blur-md p-4">
182+
<div className="glass-card p-8 w-full max-w-sm relative shadow-2xl border-red-500/20">
183+
<div className="absolute -top-10 -right-10 w-32 h-32 bg-red-500/20 rounded-full blur-3xl" />
184+
185+
<h3 className="text-lg font-bold text-gray-200 mb-2">
186+
Delete Network
167187
</h3>
168-
169-
<div className="text-center text-xl font-bold text-indigo-400 mb-4 py-3 stat-card">
170-
{board.name}
171-
</div>
172-
173-
<p className="text-red-400/80 text-sm italic mb-6 text-center">
174-
This action is irreversible.
188+
<p className="text-sm text-gray-400 mb-6 leading-relaxed">
189+
Are you sure you want to delete <span className="font-mono text-gray-300 bg-white/5 px-1 rounded">{board.name}</span>? This action cannot be undone.
175190
</p>
176-
191+
177192
<div className="flex gap-3">
178193
<button
179194
onClick={() => setShowDeleteModal(false)}
180-
className="btn-secondary w-full py-2.5"
195+
className="flex-1 py-2.5 px-4 bg-white/5 hover:bg-white/10 border border-white/10 rounded-lg text-sm font-medium text-gray-300 transition-colors"
181196
>
182197
Cancel
183198
</button>
184199
<button
185-
onClick={() => handleDelete()}
186-
className="w-full py-2.5 rounded-xl font-semibold bg-red-500/20 border border-red-500/30 text-red-400 hover:bg-red-500/30 transition"
200+
onClick={handleDelete}
201+
className="flex-1 py-2.5 px-4 bg-red-500/10 hover:bg-red-500/20 border border-red-500/30 text-red-500 rounded-lg text-sm font-bold transition-colors"
187202
>
188-
Delete
203+
Confirm Delete
189204
</button>
190205
</div>
191206
</div>

0 commit comments

Comments
 (0)