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
+709
-372
No files matched your search
+29
-12
@@ -23,8 +23,9 @@ export default function Login() {
|
|||||||
password,
|
password,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (result.error) {
|
if (result?.error) {
|
||||||
setError('Invalid username or password');
|
setError('Invalid username or password');
|
||||||
|
setIsLoading(false);
|
||||||
} else {
|
} else {
|
||||||
// Fetch the user role to redirect appropriately
|
// Fetch the user role to redirect appropriately
|
||||||
const response = await fetch('/api/user');
|
const response = await fetch('/api/user');
|
||||||
@@ -39,17 +40,21 @@ export default function Login() {
|
|||||||
} catch (err) {
|
} catch (err) {
|
||||||
setError('An unexpected error occurred');
|
setError('An unexpected error occurred');
|
||||||
console.error(err);
|
console.error(err);
|
||||||
} finally {
|
|
||||||
setIsLoading(false);
|
setIsLoading(false);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
<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-container">
|
||||||
<div className="auth-card">
|
<div className="auth-card">
|
||||||
<h1>Login</h1>
|
<div className="input-container">
|
||||||
<form onSubmit={handleLogin}>
|
|
||||||
<div className="form-group">
|
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
placeholder="Username"
|
placeholder="Username"
|
||||||
@@ -59,7 +64,7 @@ export default function Login() {
|
|||||||
className="auth-input"
|
className="auth-input"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="form-group">
|
<div className="input-container">
|
||||||
<input
|
<input
|
||||||
type="password"
|
type="password"
|
||||||
placeholder="Password"
|
placeholder="Password"
|
||||||
@@ -69,18 +74,30 @@ export default function Login() {
|
|||||||
className="auth-input"
|
className="auth-input"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
{error && <div className="error-message">{error}</div>}
|
||||||
<button
|
<button
|
||||||
type="submit"
|
onClick={handleLogin}
|
||||||
className="auth-button"
|
className="auth-button"
|
||||||
disabled={isLoading}
|
disabled={isLoading}
|
||||||
>
|
>
|
||||||
{isLoading ? 'Logging in...' : 'Log In'}
|
{isLoading ? 'Logging in...' : 'Log In'}
|
||||||
</button>
|
</button>
|
||||||
</form>
|
</div>
|
||||||
{error && <p className="error">{error}</p>}
|
</div>
|
||||||
<p className="auth-link">
|
|
||||||
Don't have an account? <Link href="/register">Register</Link>
|
<div className="nav-bar">
|
||||||
</p>
|
<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>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
+37
-12
@@ -72,27 +72,52 @@ export default function Admin() {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="admin-page">
|
<div className="admin-page">
|
||||||
<div className="admin-card">
|
<div className="page-header">
|
||||||
<h1>Admin Controls</h1>
|
<div className="back-button">←</div>
|
||||||
|
<div className="page-title">Admin Controls</div>
|
||||||
|
<div className="placeholder"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div className="timer-section">
|
<div className="admin-controls">
|
||||||
<h2>Hunt Timer</h2>
|
<div className="admin-input-container">
|
||||||
<p>Status: <span className={timerActive ? 'active' : 'inactive'}>
|
<label>Username</label>
|
||||||
{timerActive ? 'Active' : 'Inactive'}
|
<input type="text" className="admin-input" />
|
||||||
</span></p>
|
</div>
|
||||||
|
|
||||||
|
<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>
|
||||||
|
|
||||||
<div className="control-buttons">
|
|
||||||
<button
|
<button
|
||||||
onClick={toggleTimer}
|
onClick={toggleTimer}
|
||||||
className={timerActive ? 'stop-button' : 'start-button'}
|
className={`admin-button ${timerActive ? 'red-button' : 'green-button'}`}
|
||||||
disabled={loading}
|
disabled={loading}
|
||||||
>
|
>
|
||||||
{loading ? 'Updating...' : timerActive ? 'Stop Timer' : 'Start Timer'}
|
{loading ? 'Updating...' : timerActive ? 'Stop' : 'Start'}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
|
||||||
|
{error && <p className="error-message">{error}</p>}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{error && <p className="error">{error}</p>}
|
<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>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
import { useSession } from 'next-auth/react';
|
import { useSession } from 'next-auth/react';
|
||||||
import { useRouter } from 'next/navigation';
|
import { useRouter } from 'next/navigation';
|
||||||
import { joinTeam } from '../actions/auth';
|
import { joinTeam } from '../../actions/auth';
|
||||||
|
|
||||||
export default function TeamSelection() {
|
export default function TeamSelection() {
|
||||||
const { data: session, status } = useSession();
|
const { data: session, status } = useSession();
|
||||||
|
|||||||
+4
-68
@@ -54,6 +54,7 @@ export async function validateCredentials(username, password) {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Using bcrypt.compare to properly compare hashed passwords
|
||||||
const isValid = await bcrypt.compare(password, user.password);
|
const isValid = await bcrypt.compare(password, user.password);
|
||||||
|
|
||||||
if (!isValid) {
|
if (!isValid) {
|
||||||
@@ -63,7 +64,8 @@ export async function validateCredentials(username, password) {
|
|||||||
return {
|
return {
|
||||||
id: user.id,
|
id: user.id,
|
||||||
username: user.username,
|
username: user.username,
|
||||||
role: user.role
|
role: user.role,
|
||||||
|
teamId: user.team_id
|
||||||
};
|
};
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Login error:', error);
|
console.error('Login error:', error);
|
||||||
@@ -71,70 +73,4 @@ export async function validateCredentials(username, password) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start hunt timer (admin only)
|
// Other functions remain the same...
|
||||||
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 };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -31,14 +31,17 @@ export const authOptions = {
|
|||||||
token.id = user.id;
|
token.id = user.id;
|
||||||
token.role = user.role;
|
token.role = user.role;
|
||||||
token.username = user.username;
|
token.username = user.username;
|
||||||
|
token.teamId = user.teamId;
|
||||||
}
|
}
|
||||||
return token;
|
return token;
|
||||||
},
|
},
|
||||||
async session({ session, token }) {
|
async session({ session, token }) {
|
||||||
if (token) {
|
if (token) {
|
||||||
|
session.user = session.user || {};
|
||||||
session.user.id = token.id;
|
session.user.id = token.id;
|
||||||
session.user.role = token.role;
|
session.user.role = token.role;
|
||||||
session.user.username = token.username;
|
session.user.username = token.username;
|
||||||
|
session.user.teamId = token.teamId;
|
||||||
}
|
}
|
||||||
return session;
|
return session;
|
||||||
}
|
}
|
||||||
|
|||||||
+635
-279
@@ -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 */
|
/* 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;
|
box-sizing: border-box;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
@@ -57,7 +395,7 @@ a:hover {
|
|||||||
|
|
||||||
body {
|
body {
|
||||||
font-family: Arial, sans-serif;
|
font-family: Arial, sans-serif;
|
||||||
background-color: #f4f4f4;
|
background-color: #f4e9dc;
|
||||||
color: #333;
|
color: #333;
|
||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
}
|
}
|
||||||
@@ -87,240 +425,99 @@ p {
|
|||||||
padding: 1rem;
|
padding: 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Card Styles */
|
/* Page Header */
|
||||||
.auth-container,
|
.page-header {
|
||||||
.team-selection-container,
|
|
||||||
.admin-page,
|
|
||||||
.stats-container {
|
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: space-between;
|
||||||
align-items: center;
|
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;
|
min-height: 100vh;
|
||||||
|
background-color: #f4e9dc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.auth-container {
|
||||||
|
flex: 1;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
padding: 1rem;
|
padding: 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.auth-card,
|
.auth-card {
|
||||||
.team-selection-card,
|
background-color: #f4e9dc;
|
||||||
.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%;
|
width: 100%;
|
||||||
max-width: 400px;
|
max-width: 400px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Form Elements */
|
.input-container {
|
||||||
.form-group {
|
width: 100%;
|
||||||
margin-bottom: 1rem;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type="text"],
|
.auth-input {
|
||||||
input[type="password"],
|
|
||||||
.auth-input,
|
|
||||||
.team-input {
|
|
||||||
display: block;
|
|
||||||
width: 100%;
|
width: 100%;
|
||||||
padding: 0.75rem;
|
padding: 0.75rem;
|
||||||
border: 1px solid #ccc;
|
background-color: #fff;
|
||||||
|
border: 1px solid #ddd;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
font-size: 1rem;
|
font-size: 1rem;
|
||||||
margin-bottom: 1rem;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
button,
|
.auth-button {
|
||||||
.auth-button,
|
background-color: #63503d;
|
||||||
.team-button {
|
|
||||||
display: block;
|
|
||||||
width: 100%;
|
|
||||||
padding: 0.75rem;
|
|
||||||
background-color: #0070f3;
|
|
||||||
color: white;
|
color: white;
|
||||||
border: none;
|
border: none;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
|
padding: 0.75rem;
|
||||||
font-size: 1rem;
|
font-size: 1rem;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
transition: background-color 0.2s;
|
width: 100%;
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
display: block;
|
||||||
margin-top: 1rem;
|
|
||||||
text-align: center;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Error messages */
|
.auth-button:hover {
|
||||||
.error {
|
background-color: #53402d;
|
||||||
color: #ef4444;
|
}
|
||||||
margin-top: 0.5rem;
|
|
||||||
|
.error-message {
|
||||||
|
color: #e53935;
|
||||||
font-size: 0.875rem;
|
font-size: 0.875rem;
|
||||||
|
padding: 0.5rem 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Loading state */
|
/* Navigation Bar */
|
||||||
.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 {
|
.nav-bar {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-around;
|
justify-content: space-around;
|
||||||
background-color: #f8f8f8;
|
background-color: #f8f8f8;
|
||||||
border-top: 1px solid #ddd;
|
border-top: 1px solid #ddd;
|
||||||
padding: 0.75rem 0;
|
padding: 0.75rem 0;
|
||||||
position: fixed;
|
position: sticky;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
@@ -332,20 +529,194 @@ a:hover {
|
|||||||
color: #777;
|
color: #777;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-item.active {
|
|
||||||
color: #0070f3;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-icon {
|
.nav-icon {
|
||||||
font-size: 1.5rem;
|
font-size: 1.5rem;
|
||||||
margin-bottom: 0.25rem;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Leaderboard */
|
/* Team Selection Page */
|
||||||
.leaderboard {
|
.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;
|
padding: 1rem;
|
||||||
background-color: #f8e9a1;
|
|
||||||
border-radius: 8px;
|
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 {
|
.team-row {
|
||||||
@@ -357,30 +728,15 @@ a:hover {
|
|||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clue page as in Figma */
|
/* QR Scanner */
|
||||||
.clue-page {
|
.qr-scanner-container {
|
||||||
background-color: #f3cf55;
|
|
||||||
padding: 1rem;
|
padding: 1rem;
|
||||||
border-radius: 8px;
|
background-color: #f4e9dc;
|
||||||
}
|
}
|
||||||
|
|
||||||
.clue-box {
|
.scanner-wrapper {
|
||||||
background-color: #fff8dc;
|
|
||||||
padding: 1rem;
|
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
|
overflow: hidden;
|
||||||
|
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
|
||||||
margin-bottom: 1rem;
|
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