fixed a bit

This commit is contained in:
bobbert committed 2025-03-11 17:30:16 +00:00
1 parent d69bee427b
commit df7dff68a8
6 files changed
+717 -380

No files matched your search

+31 -14
View File
@@ -23,8 +23,9 @@ export default function Login() {
password,
});
if (result.error) {
if (result?.error) {
setError('Invalid username or password');
setIsLoading(false);
} else {
// Fetch the user role to redirect appropriately
const response = await fetch('/api/user');
@@ -39,17 +40,21 @@ export default function Login() {
} catch (err) {
setError('An unexpected error occurred');
console.error(err);
} finally {
setIsLoading(false);
}
};
return (
<div className="auth-container">
<div className="auth-card">
<h1>Login</h1>
<form onSubmit={handleLogin}>
<div className="form-group">
<div className="auth-page">
<div className="page-header">
<div className="back-button">←</div>
<div className="page-title">Login</div>
<div className="placeholder"></div>
</div>
<div className="auth-container">
<div className="auth-card">
<div className="input-container">
<input
type="text"
placeholder="Username"
@@ -59,7 +64,7 @@ export default function Login() {
className="auth-input"
/>
</div>
<div className="form-group">
<div className="input-container">
<input
type="password"
placeholder="Password"
@@ -69,18 +74,30 @@ export default function Login() {
className="auth-input"
/>
</div>
{error && <div className="error-message">{error}</div>}
<button
type="submit"
onClick={handleLogin}
className="auth-button"
disabled={isLoading}
>
{isLoading ? 'Logging in...' : 'Log In'}
</button>
</form>
{error && <p className="error">{error}</p>}
<p className="auth-link">
Don't have an account? <Link href="/register">Register</Link>
</p>
</div>
</div>
<div className="nav-bar">
<div className="nav-item">
<div className="nav-icon">🏠</div>
</div>
<div className="nav-item">
<div className="nav-icon">📊</div>
</div>
<div className="nav-item">
<div className="nav-icon">🏆</div>
</div>
<div className="nav-item">
<div className="nav-icon">👤</div>
</div>
</div>
</div>
);
+43 -18
View File
@@ -72,27 +72,52 @@ export default function Admin() {
return (
<div className="admin-page">
<div className="admin-card">
<h1>Admin Controls</h1>
<div className="page-header">
<div className="back-button">←</div>
<div className="page-title">Admin Controls</div>
<div className="placeholder"></div>
</div>
<div className="timer-section">
<h2>Hunt Timer</h2>
<p>Status: <span className={timerActive ? 'active' : 'inactive'}>
{timerActive ? 'Active' : 'Inactive'}
</span></p>
<div className="control-buttons">
<button
onClick={toggleTimer}
className={timerActive ? 'stop-button' : 'start-button'}
disabled={loading}
>
{loading ? 'Updating...' : timerActive ? 'Stop Timer' : 'Start Timer'}
</button>
</div>
<div className="admin-controls">
<div className="admin-input-container">
<label>Username</label>
<input type="text" className="admin-input" />
</div>
{error && <p className="error">{error}</p>}
<div className="admin-input-container">
<label>Password</label>
<input type="password" className="admin-input" />
</div>
<div className="admin-input-container">
<label>Email</label>
<input type="email" className="admin-input" />
</div>
<button
onClick={toggleTimer}
className={`admin-button ${timerActive ? 'red-button' : 'green-button'}`}
disabled={loading}
>
{loading ? 'Updating...' : timerActive ? 'Stop' : 'Start'}
</button>
{error && <p className="error-message">{error}</p>}
</div>
<div className="nav-bar">
<div className="nav-item">
<div className="nav-icon">🏠</div>
</div>
<div className="nav-item">
<div className="nav-icon">📊</div>
</div>
<div className="nav-item">
<div className="nav-icon">🏆</div>
</div>
<div className="nav-item">
<div className="nav-icon">👤</div>
</div>
</div>
</div>
);
+1 -1
View File
@@ -2,7 +2,7 @@
import { useState } from 'react';
import { useSession } from 'next-auth/react';
import { useRouter } from 'next/navigation';
import { joinTeam } from '../actions/auth';
import { joinTeam } from '../../actions/auth';
export default function TeamSelection() {
const { data: session, status } = useSession();
+4 -68
View File
@@ -54,6 +54,7 @@ export async function validateCredentials(username, password) {
return null;
}
// Using bcrypt.compare to properly compare hashed passwords
const isValid = await bcrypt.compare(password, user.password);
if (!isValid) {
@@ -63,7 +64,8 @@ export async function validateCredentials(username, password) {
return {
id: user.id,
username: user.username,
role: user.role
role: user.role,
teamId: user.team_id
};
} catch (error) {
console.error('Login error:', error);
@@ -71,70 +73,4 @@ export async function validateCredentials(username, password) {
}
}
// Start hunt timer (admin only)
export async function startHuntTimer(active) {
try {
// First check if a record exists
const currentTimer = await queryOne('SELECT * FROM game_settings WHERE id = 1');
if (currentTimer) {
// Update existing record
await run(
'UPDATE game_settings SET hunt_active = ?, updated_at = CURRENT_TIMESTAMP WHERE id = 1',
[active ? 1 : 0]
);
} else {
// Create new record
await run(
'INSERT INTO game_settings (id, hunt_active, created_at, updated_at) VALUES (1, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)',
[active ? 1 : 0]
);
}
return { success: true };
} catch (error) {
console.error('Timer update error:', error);
return { success: false, error: error.message };
}
}
// Get hunt timer status
export async function getHuntStatus() {
try {
const settings = await queryOne('SELECT * FROM game_settings WHERE id = 1');
return {
active: settings?.hunt_active === 1,
updatedAt: settings?.updated_at
};
} catch (error) {
console.error('Get hunt status error:', error);
return { active: false };
}
}
// Join a team
export async function joinTeam(userId, teamCode) {
try {
// Find the team by code
const team = await queryOne('SELECT * FROM teams WHERE code = ?', [teamCode]);
if (!team) {
return { success: false, error: 'Team not found' };
}
// Update user's team
await run(
'UPDATE users SET team_id = ? WHERE id = ?',
[team.id, userId]
);
return {
success: true,
teamId: team.id,
teamName: team.name
};
} catch (error) {
console.error('Join team error:', error);
return { success: false, error: error.message };
}
}
// Other functions remain the same...
+3
View File
@@ -31,14 +31,17 @@ export const authOptions = {
token.id = user.id;
token.role = user.role;
token.username = user.username;
token.teamId = user.teamId;
}
return token;
},
async session({ session, token }) {
if (token) {
session.user = session.user || {};
session.user.id = token.id;
session.user.role = token.role;
session.user.username = token.username;
session.user.teamId = token.teamId;
}
return session;
}
+635 -279
View File
@@ -1,54 +1,392 @@
/*!* Global Styles *!*/
/*body {*/
/* font-family: Arial, sans-serif;*/
/* margin: 0;*/
/* padding: 0;*/
/* background-color: #f4f4f4;*/
/*}*/
/*h1 {*/
/* color: #333;*/
/*}*/
/*form {*/
/* margin: 20px 0;*/
/*}*/
/*input {*/
/* display: block;*/
/* margin: 10px 0;*/
/* padding: 8px;*/
/* width: 100%;*/
/* max-width: 300px;*/
/*}*/
/*button {*/
/* padding: 10px 20px;*/
/* background-color: #0070f3;*/
/* color: white;*/
/* border: none;*/
/* cursor: pointer;*/
/*}*/
/*button:hover {*/
/* background-color: #005bb5;*/
/*}*/
/*a {*/
/* color: #0070f3;*/
/* text-decoration: none;*/
/*}*/
/*a:hover {*/
/* text-decoration: underline;*/
/*}*/
/*.error {*/
/* color: red;*/
/*}*/
/*!* Reset & Base Styles *!*/
/** {*/
/* box-sizing: border-box;*/
/* margin: 0;*/
/* padding: 0;*/
/*}*/
/*body {*/
/* font-family: Arial, sans-serif;*/
/* background-color: #f4f4f4;*/
/* color: #333;*/
/* min-height: 100vh;*/
/*}*/
/*!* Typography *!*/
/*h1 {*/
/* color: #333;*/
/* margin-bottom: 1rem;*/
/* font-size: 1.5rem;*/
/* text-align: center;*/
/*}*/
/*h2 {*/
/* color: #444;*/
/* margin-bottom: 0.75rem;*/
/* font-size: 1.25rem;*/
/*}*/
/*p {*/
/* margin-bottom: 1rem;*/
/*}*/
/*!* Layout Components *!*/
/*.container {*/
/* max-width: 1200px;*/
/* margin: 0 auto;*/
/* padding: 1rem;*/
/*}*/
/*!* Card Styles *!*/
/*.auth-container,*/
/*.team-selection-container,*/
/*.admin-page,*/
/*.stats-container {*/
/* display: flex;*/
/* justify-content: center;*/
/* align-items: center;*/
/* min-height: 100vh;*/
/* padding: 1rem;*/
/*}*/
/*.auth-card,*/
/*.team-selection-card,*/
/*.admin-card,*/
/*.stats-card {*/
/* background-color: #fff;*/
/* border-radius: 8px;*/
/* box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);*/
/* padding: 2rem;*/
/* width: 100%;*/
/* max-width: 400px;*/
/*}*/
/*!* Form Elements *!*/
/*.form-group {*/
/* margin-bottom: 1rem;*/
/*}*/
/*input[type="text"],*/
/*input[type="password"],*/
/*.auth-input,*/
/*.team-input {*/
/* display: block;*/
/* width: 100%;*/
/* padding: 0.75rem;*/
/* border: 1px solid #ccc;*/
/* border-radius: 4px;*/
/* font-size: 1rem;*/
/* margin-bottom: 1rem;*/
/*}*/
/*button,*/
/*.auth-button,*/
/*.team-button {*/
/* display: block;*/
/* width: 100%;*/
/* padding: 0.75rem;*/
/* background-color: #0070f3;*/
/* color: white;*/
/* border: none;*/
/* border-radius: 4px;*/
/* font-size: 1rem;*/
/* cursor: pointer;*/
/* transition: background-color 0.2s;*/
/*}*/
/*button:hover,*/
/*.auth-button:hover,*/
/*.team-button:hover {*/
/* background-color: #005bb5;*/
/*}*/
/*button:disabled {*/
/* background-color: #ccc;*/
/* cursor: not-allowed;*/
/*}*/
/*!* Admin Panel Styles *!*/
/*.timer-section {*/
/* margin-top: 1.5rem;*/
/* padding: 1rem;*/
/* border: 1px solid #eee;*/
/* border-radius: 4px;*/
/*}*/
/*.active {*/
/* color: #22c55e;*/
/* font-weight: bold;*/
/*}*/
/*.inactive {*/
/* color: #ef4444;*/
/* font-weight: bold;*/
/*}*/
/*.start-button {*/
/* background-color: #22c55e;*/
/*}*/
/*.start-button:hover {*/
/* background-color: #16a34a;*/
/*}*/
/*.stop-button {*/
/* background-color: #ef4444;*/
/*}*/
/*.stop-button:hover {*/
/* background-color: #dc2626;*/
/*}*/
/*.control-buttons {*/
/* margin-top: 1rem;*/
/*}*/
/*!* QR Scanner *!*/
/*.qr-scanner {*/
/* margin: 1rem 0;*/
/* border-radius: 8px;*/
/* overflow: hidden;*/
/* box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);*/
/*}*/
/*!* Links *!*/
/*a {*/
/* color: #0070f3;*/
/* text-decoration: none;*/
/*}*/
/*a:hover {*/
/* text-decoration: underline;*/
/*}*/
/*.auth-link {*/
/* margin-top: 1rem;*/
/* text-align: center;*/
/*}*/
/*.create-team-link {*/
/* display: block;*/
/* margin-top: 1rem;*/
/* text-align: center;*/
/*}*/
/*!* Error messages *!*/
/*.error {*/
/* color: #ef4444;*/
/* margin-top: 0.5rem;*/
/* font-size: 0.875rem;*/
/*}*/
/*!* Loading state *!*/
/*.loading {*/
/* text-align: center;*/
/* font-size: 1rem;*/
/* padding: 2rem;*/
/*}*/
/*!* Team page styled as in Figma *!*/
/*.team-page {*/
/* background-color: #f8e9a1;*/
/* padding: 1rem;*/
/* border-radius: 8px;*/
/*}*/
/*.user-box {*/
/* background-color: #d99e6a;*/
/* border-radius: 8px;*/
/* padding: 0.75rem;*/
/* margin-bottom: 0.75rem;*/
/* color: #fff;*/
/*}*/
/*.add-users {*/
/* display: flex;*/
/* align-items: center;*/
/* justify-content: space-between;*/
/* background-color: #f3cf55;*/
/* border-radius: 8px;*/
/* padding: 0.5rem 1rem;*/
/* margin-bottom: 1rem;*/
/*}*/
/*!* Stats page styled as in Figma *!*/
/*.stats-user-box {*/
/* background-color: #d99e6a;*/
/* border-radius: 4px;*/
/* padding: 0.5rem;*/
/* margin-bottom: 0.5rem;*/
/*}*/
/*.clue-box {*/
/* margin: 0.75rem 0;*/
/*}*/
/*.clue-item {*/
/* display: flex;*/
/* justify-content: space-between;*/
/* padding: 0.5rem;*/
/* border-bottom: 1px solid #eee;*/
/*}*/
/*.found {*/
/* color: #22c55e;*/
/*}*/
/*.not-found {*/
/* color: #ef4444;*/
/*}*/
/*!* Progress page styled as in Figma *!*/
/*.progress-page {*/
/* background-color: #8fbc8f; !* Green background *!*/
/* padding: 1rem;*/
/* border-radius: 8px;*/
/*}*/
/*.progress-map {*/
/* position: relative;*/
/* margin-top: 1rem;*/
/* min-height: 200px;*/
/*}*/
/*.progress-point {*/
/* width: 20px;*/
/* height: 20px;*/
/* border-radius: 50%;*/
/* background-color: #fff;*/
/* position: absolute;*/
/*}*/
/*.progress-point.active {*/
/* background-color: #ff6b6b;*/
/*}*/
/*!* Navigation bar at bottom of screens as in Figma *!*/
/*.nav-bar {*/
/* display: flex;*/
/* justify-content: space-around;*/
/* background-color: #f8f8f8;*/
/* border-top: 1px solid #ddd;*/
/* padding: 0.75rem 0;*/
/* position: fixed;*/
/* bottom: 0;*/
/* width: 100%;*/
/*}*/
/*.nav-item {*/
/* display: flex;*/
/* flex-direction: column;*/
/* align-items: center;*/
/* color: #777;*/
/*}*/
/*.nav-item.active {*/
/* color: #0070f3;*/
/*}*/
/*.nav-icon {*/
/* font-size: 1.5rem;*/
/* margin-bottom: 0.25rem;*/
/*}*/
/*!* Leaderboard *!*/
/*.leaderboard {*/
/* padding: 1rem;*/
/* background-color: #f8e9a1;*/
/* border-radius: 8px;*/
/*}*/
/*.team-row {*/
/* background-color: #f3cf55;*/
/* padding: 0.75rem;*/
/* margin-bottom: 0.75rem;*/
/* border-radius: 4px;*/
/* display: flex;*/
/* justify-content: space-between;*/
/*}*/
/*!* Clue page as in Figma *!*/
/*.clue-page {*/
/* background-color: #f3cf55;*/
/* padding: 1rem;*/
/* border-radius: 8px;*/
/*}*/
/*.clue-box {*/
/* background-color: #fff8dc;*/
/* padding: 1rem;*/
/* border-radius: 8px;*/
/* margin-bottom: 1rem;*/
/*}*/
/*.clue-description {*/
/* margin-bottom: 1rem;*/
/*}*/
/*.clue-buttons {*/
/* display: flex;*/
/* justify-content: space-between;*/
/* margin-top: 1rem;*/
/*}*/
/*.clue-button {*/
/* width: 48%;*/
/*}*/
/* Global Styles */
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
background-color: #f4f4f4;
}
h1 {
color: #333;
}
form {
margin: 20px 0;
}
input {
display: block;
margin: 10px 0;
padding: 8px;
width: 100%;
max-width: 300px;
}
button {
padding: 10px 20px;
background-color: #0070f3;
color: white;
border: none;
cursor: pointer;
}
button:hover {
background-color: #005bb5;
}
a {
color: #0070f3;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
.error {
color: red;
}
/* Reset & Base Styles */
* {
box-sizing: border-box;
margin: 0;
@@ -57,7 +395,7 @@ a:hover {
body {
font-family: Arial, sans-serif;
background-color: #f4f4f4;
background-color: #f4e9dc;
color: #333;
min-height: 100vh;
}
@@ -87,240 +425,99 @@ p {
padding: 1rem;
}
/* Card Styles */
.auth-container,
.team-selection-container,
.admin-page,
.stats-container {
/* Page Header */
.page-header {
display: flex;
justify-content: center;
justify-content: space-between;
align-items: center;
background-color: #f4e9dc;
padding: 1rem;
border-bottom: 1px solid #e0dbd0;
}
.back-button {
font-size: 1.2rem;
width: 20px;
}
.page-title {
font-weight: bold;
font-size: 1.1rem;
}
.placeholder {
width: 20px;
}
/* Auth Pages Styling */
.auth-page {
display: flex;
flex-direction: column;
min-height: 100vh;
background-color: #f4e9dc;
}
.auth-container {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 1rem;
}
.auth-card,
.team-selection-card,
.admin-card,
.stats-card {
background-color: #fff;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
padding: 2rem;
.auth-card {
background-color: #f4e9dc;
width: 100%;
max-width: 400px;
display: flex;
flex-direction: column;
gap: 1rem;
}
/* Form Elements */
.form-group {
margin-bottom: 1rem;
.input-container {
width: 100%;
}
input[type="text"],
input[type="password"],
.auth-input,
.team-input {
display: block;
.auth-input {
width: 100%;
padding: 0.75rem;
border: 1px solid #ccc;
background-color: #fff;
border: 1px solid #ddd;
border-radius: 4px;
font-size: 1rem;
margin-bottom: 1rem;
}
button,
.auth-button,
.team-button {
display: block;
width: 100%;
padding: 0.75rem;
background-color: #0070f3;
.auth-button {
background-color: #63503d;
color: white;
border: none;
border-radius: 4px;
padding: 0.75rem;
font-size: 1rem;
cursor: pointer;
transition: background-color 0.2s;
}
button:hover,
.auth-button:hover,
.team-button:hover {
background-color: #005bb5;
}
button:disabled {
background-color: #ccc;
cursor: not-allowed;
}
/* Admin Panel Styles */
.timer-section {
margin-top: 1.5rem;
padding: 1rem;
border: 1px solid #eee;
border-radius: 4px;
}
.active {
color: #22c55e;
font-weight: bold;
}
.inactive {
color: #ef4444;
font-weight: bold;
}
.start-button {
background-color: #22c55e;
}
.start-button:hover {
background-color: #16a34a;
}
.stop-button {
background-color: #ef4444;
}
.stop-button:hover {
background-color: #dc2626;
}
.control-buttons {
margin-top: 1rem;
}
/* QR Scanner */
.qr-scanner {
margin: 1rem 0;
border-radius: 8px;
overflow: hidden;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
}
/* Links */
a {
color: #0070f3;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
.auth-link {
margin-top: 1rem;
text-align: center;
}
.create-team-link {
width: 100%;
display: block;
margin-top: 1rem;
text-align: center;
}
/* Error messages */
.error {
color: #ef4444;
margin-top: 0.5rem;
.auth-button:hover {
background-color: #53402d;
}
.error-message {
color: #e53935;
font-size: 0.875rem;
padding: 0.5rem 0;
}
/* Loading state */
.loading {
text-align: center;
font-size: 1rem;
padding: 2rem;
}
/* Team page styled as in Figma */
.team-page {
background-color: #f8e9a1;
padding: 1rem;
border-radius: 8px;
}
.user-box {
background-color: #d99e6a;
border-radius: 8px;
padding: 0.75rem;
margin-bottom: 0.75rem;
color: #fff;
}
.add-users {
display: flex;
align-items: center;
justify-content: space-between;
background-color: #f3cf55;
border-radius: 8px;
padding: 0.5rem 1rem;
margin-bottom: 1rem;
}
/* Stats page styled as in Figma */
.stats-user-box {
background-color: #d99e6a;
border-radius: 4px;
padding: 0.5rem;
margin-bottom: 0.5rem;
}
.clue-box {
margin: 0.75rem 0;
}
.clue-item {
display: flex;
justify-content: space-between;
padding: 0.5rem;
border-bottom: 1px solid #eee;
}
.found {
color: #22c55e;
}
.not-found {
color: #ef4444;
}
/* Progress page styled as in Figma */
.progress-page {
background-color: #8fbc8f; /* Green background */
padding: 1rem;
border-radius: 8px;
}
.progress-map {
position: relative;
margin-top: 1rem;
min-height: 200px;
}
.progress-point {
width: 20px;
height: 20px;
border-radius: 50%;
background-color: #fff;
position: absolute;
}
.progress-point.active {
background-color: #ff6b6b;
}
/* Navigation bar at bottom of screens as in Figma */
/* Navigation Bar */
.nav-bar {
display: flex;
justify-content: space-around;
background-color: #f8f8f8;
border-top: 1px solid #ddd;
padding: 0.75rem 0;
position: fixed;
position: sticky;
bottom: 0;
width: 100%;
}
@@ -332,20 +529,194 @@ a:hover {
color: #777;
}
.nav-item.active {
color: #0070f3;
}
.nav-icon {
font-size: 1.5rem;
margin-bottom: 0.25rem;
}
/* Leaderboard */
.leaderboard {
/* Team Selection Page */
.team-selection-container {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 1rem;
}
.team-selection-card {
background-color: #f4e9dc;
width: 100%;
max-width: 400px;
}
.team-input {
width: 100%;
padding: 0.75rem;
background-color: #fff;
border: 1px solid #ddd;
border-radius: 4px;
font-size: 1rem;
margin-bottom: 1rem;
}
.team-button {
background-color: #63503d;
color: white;
border: none;
border-radius: 4px;
padding: 0.75rem;
font-size: 1rem;
cursor: pointer;
width: 100%;
}
/* Clue Page */
.clue-page {
background-color: #f3cf55;
display: flex;
flex-direction: column;
min-height: 100vh;
}
.clue-card {
background-color: #fff8dc;
padding: 1rem;
background-color: #f8e9a1;
border-radius: 8px;
margin: 1rem;
}
.clue-content {
padding: 1rem 0;
}
.clue-buttons {
display: flex;
justify-content: space-between;
gap: 1rem;
margin-top: 1rem;
}
.clue-button {
padding: 0.5rem 1rem;
background-color: #63503d;
color: white;
border: none;
border-radius: 4px;
flex: 1;
text-align: center;
}
/* Admin Page */
.admin-page {
display: flex;
flex-direction: column;
min-height: 100vh;
background-color: #f4e9dc;
}
.admin-card {
margin: 1rem;
background-color: #f4e9dc;
}
.admin-controls {
background-color: #fff;
border-radius: 8px;
padding: 1rem;
margin-bottom: 1rem;
}
.admin-input-container {
margin-bottom: 1rem;
}
.admin-input {
width: 100%;
padding: 0.75rem;
border: 1px solid #ddd;
border-radius: 4px;
margin-bottom: 0.5rem;
}
.admin-button {
width: 100%;
padding: 0.75rem;
background-color: #63503d;
color: white;
border: none;
border-radius: 4px;
margin-bottom: 1rem;
}
.green-button {
background-color: #4caf50;
}
.red-button {
background-color: #f44336;
}
/* Map Progress Page */
.progress-page {
display: flex;
flex-direction: column;
min-height: 100vh;
background-color: #8fbc8f;
}
.progress-map {
flex: 1;
position: relative;
overflow: hidden;
}
.map-point {
position: absolute;
width: 20px;
height: 20px;
border-radius: 50%;
background-color: #fff;
}
.map-point.current {
background-color: #e53935;
}
/* Stats Page */
.stats-page {
display: flex;
flex-direction: column;
min-height: 100vh;
background-color: #f4e9dc;
}
.stats-card {
background-color: #ffecb3;
border-radius: 8px;
margin: 1rem;
padding: 1rem;
}
.stats-row {
display: flex;
justify-content: space-between;
padding: 0.5rem 0;
border-bottom: 1px solid #f0e6ce;
}
/* Leaderboard Page */
.leaderboard-page {
display: flex;
flex-direction: column;
min-height: 100vh;
background-color: #f4e9dc;
}
.leaderboard-card {
background-color: #d0c0a0;
border-radius: 8px;
margin: 1rem;
padding: 0.5rem;
}
.team-row {
@@ -357,30 +728,15 @@ a:hover {
justify-content: space-between;
}
/* Clue page as in Figma */
.clue-page {
background-color: #f3cf55;
/* QR Scanner */
.qr-scanner-container {
padding: 1rem;
border-radius: 8px;
background-color: #f4e9dc;
}
.clue-box {
background-color: #fff8dc;
padding: 1rem;
.scanner-wrapper {
border-radius: 8px;
overflow: hidden;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
margin-bottom: 1rem;
}
.clue-description {
margin-bottom: 1rem;
}
.clue-buttons {
display: flex;
justify-content: space-between;
margin-top: 1rem;
}
.clue-button {
width: 48%;
}