mirror of
https://github.com/mudabbir-ahmad/peworkshop.git
synced 2026-10-08 03:50:21 +00:00
fixed a bit
This commit is contained in:
1 parent
d69bee427b
commit
df7dff68a8
6 files changed
+719
-382
No files matched your search
+31
-14
@@ -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
@@ -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>
|
||||
);
|
||||
|
||||
@@ -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
@@ -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...
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
+637
-281
@@ -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;
|
||||
padding: 1rem;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.clue-box {
|
||||
background-color: #fff8dc;
|
||||
/* QR Scanner */
|
||||
.qr-scanner-container {
|
||||
padding: 1rem;
|
||||
background-color: #f4e9dc;
|
||||
}
|
||||
|
||||
.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%;
|
||||
}
|
||||
Reference in new issue
Block a user