Add Impressum and QR code management templates
- Created a new Impressum page with legal information and contact details. - Developed admin link page for linking QR codes to events with form functionality. - Implemented QR code dashboard for managing QR code sets, including creation and quick actions. - Added detailed view for QR code sets, allowing addition of QR codes and management actions. - Introduced static file serving for favicon and related images. - Established views for static content pages (about, contact, privacy, terms). - Implemented translation management scripts for compiling and updating translations.
This commit is contained in:
+249
-144
@@ -1,151 +1,256 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" class="h-full">
|
||||
<html lang="{{ locale }}">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>LeagueLedger</title>
|
||||
<!-- Fonts -->
|
||||
<link href="https://fonts.googleapis.com/css2?family=EB+Garamond:wght@400;600;700&family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
||||
<!-- Font Awesome Icons -->
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
|
||||
<!-- Tailwind CSS -->
|
||||
<script src="https://cdn.tailwindcss.com"></script>
|
||||
<script>
|
||||
tailwind.config = {
|
||||
theme: {
|
||||
extend: {
|
||||
colors: {
|
||||
'irish-green': '#006837',
|
||||
'golden-ale': '#FFB400',
|
||||
'cream-white': '#F5F0E1',
|
||||
'black-stout': '#1A1A1A',
|
||||
'guinness-red': '#B22222',
|
||||
},
|
||||
fontFamily: {
|
||||
'garamond': ['"EB Garamond"', 'serif'],
|
||||
'inter': ['"Inter"', 'sans-serif'],
|
||||
}
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{% block title %}LeagueLedger - Pub Quiz Tracking{% endblock %}</title>
|
||||
|
||||
<!-- Favicon -->
|
||||
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/static/images/favicon/apple-touch-icon.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/static/images/favicon/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/static/images/favicon/favicon-16x16.png">
|
||||
<link rel="manifest" href="/static/images/favicon/site.webmanifest">
|
||||
|
||||
|
||||
<!-- Font Awesome for icons -->
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
|
||||
|
||||
<!-- Google Fonts -->
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;600;700&display=swap" rel="stylesheet">
|
||||
|
||||
<!-- Tailwind CSS -->
|
||||
<script src="https://cdn.tailwindcss.com"></script>
|
||||
<script>
|
||||
tailwind.config = {
|
||||
theme: {
|
||||
extend: {
|
||||
colors: {
|
||||
'irish-green': '#006837',
|
||||
'golden-ale': '#FFB400',
|
||||
'cream-white': '#F5F0E1',
|
||||
'black-stout': '#1A1A1A',
|
||||
'guinness-red': '#B22222',
|
||||
},
|
||||
fontFamily: {
|
||||
'garamond': ['Garamond', 'Georgia', 'serif'],
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style>
|
||||
body {
|
||||
font-family: 'Inter', sans-serif;
|
||||
}
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
font-family: 'EB Garamond', serif;
|
||||
}
|
||||
</style>
|
||||
</script>
|
||||
|
||||
<!-- Custom CSS -->
|
||||
<link rel="stylesheet" href="{{ url_for('static', path='css/styles.css') }}">
|
||||
|
||||
<!-- HTML5 QR Code Scanner library -->
|
||||
<script src="https://unpkg.com/html5-qrcode"></script>
|
||||
|
||||
{% block extra_head %}{% endblock %}
|
||||
</head>
|
||||
<body class="flex flex-col min-h-screen bg-cream-white text-black-stout">
|
||||
<header class="bg-irish-green text-cream-white shadow-md">
|
||||
<div class="container mx-auto px-4">
|
||||
<!-- Desktop Navigation -->
|
||||
<div class="flex justify-between items-center py-4">
|
||||
<div class="flex items-center space-x-3">
|
||||
<img src="https://picsum.photos/40" alt="LeagueLedger Logo" class="h-10 w-10">
|
||||
<h1 class="text-2xl font-bold font-garamond">LeagueLedger</h1>
|
||||
<body class="bg-gray-100 min-h-screen flex flex-col">
|
||||
<!-- Navigation -->
|
||||
<nav class="bg-irish-green text-white shadow-md">
|
||||
<div class="container mx-auto px-4 py-3">
|
||||
<div class="flex justify-between items-center">
|
||||
<!-- Logo and site name -->
|
||||
<div class="flex items-center space-x-2">
|
||||
<a href="/" class="flex items-center">
|
||||
<img src="{{ url_for('static', path='images/logos/monogram.png') }}" alt="LeagueLedger Logo" class="h-12">
|
||||
<span class="ml-2 text-xl font-bold">LeagueLedger</span>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<!-- Desktop Navigation -->
|
||||
<div class="hidden md:flex space-x-6 items-center">
|
||||
<a href="/" class="hover:text-golden-ale transition">{{ _("Home") }}</a>
|
||||
<a href="/teams" class="hover:text-golden-ale transition">{{ _("Teams") }}</a>
|
||||
<a href="/leaderboard" class="hover:text-golden-ale transition">{{ _("Leaderboard") }}</a>
|
||||
<a href="/scan" class="hover:text-golden-ale transition">{{ _("Scan QR Code") }}</a>
|
||||
|
||||
<!-- Language Selector -->
|
||||
<div class="relative dropdown">
|
||||
<button class="dropdown-toggle flex items-center space-x-1 hover:text-golden-ale transition">
|
||||
<i class="fas fa-globe text-lg"></i>
|
||||
<span>{{ SUPPORTED_LANGUAGES[locale] }}</span>
|
||||
<i class="fas fa-chevron-down text-xs"></i>
|
||||
</button>
|
||||
<div class="dropdown-menu hidden absolute right-0 mt-2 w-48 bg-white rounded-md shadow-lg py-1 z-50">
|
||||
{% for code, name in SUPPORTED_LANGUAGES.items() %}
|
||||
<a href="/set-language/{{ code }}" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 {% if locale == code %}font-bold{% endif %}">
|
||||
{{ name }}
|
||||
</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if user %}
|
||||
<div class="relative dropdown">
|
||||
<button class="dropdown-toggle flex items-center space-x-1 hover:text-golden-ale transition">
|
||||
<i class="fas fa-user-circle text-lg"></i>
|
||||
<span>{{ user.username }}</span>
|
||||
<i class="fas fa-chevron-down text-xs"></i>
|
||||
</button>
|
||||
<div class="dropdown-menu hidden absolute right-0 mt-2 w-48 bg-white rounded-md shadow-lg py-1 z-50">
|
||||
<a href="/profile" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100">
|
||||
<i class="fas fa-user mr-2"></i> {{ _("Profile") }}
|
||||
</a>
|
||||
<a href="/dashboard" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100">
|
||||
<i class="fas fa-tachometer-alt mr-2"></i> {{ _("Dashboard") }}
|
||||
</a>
|
||||
{% if user.is_admin %}
|
||||
<a href="/admin" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100">
|
||||
<i class="fas fa-cog mr-2"></i> {{ _("Admin") }}
|
||||
</a>
|
||||
{% endif %}
|
||||
<div class="border-t border-gray-100 my-1"></div>
|
||||
<a href="/logout" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100">
|
||||
<i class="fas fa-sign-out-alt mr-2"></i> {{ _("Logout") }}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
{% else %}
|
||||
<a href="/login" class="bg-golden-ale hover:bg-opacity-90 text-black-stout px-4 py-2 rounded-md transition">{{ _("Sign In") }}</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<!-- Mobile menu button -->
|
||||
<div class="md:hidden flex items-center space-x-4">
|
||||
<!-- Mobile Language Selector -->
|
||||
<div class="relative dropdown">
|
||||
<button class="dropdown-toggle flex items-center hover:text-golden-ale transition">
|
||||
<i class="fas fa-globe text-lg"></i>
|
||||
</button>
|
||||
<div class="dropdown-menu hidden absolute right-0 mt-2 w-32 bg-white rounded-md shadow-lg py-1 z-50">
|
||||
{% for code, name in SUPPORTED_LANGUAGES.items() %}
|
||||
<a href="/set-language/{{ code }}" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 {% if locale == code %}font-bold{% endif %}">
|
||||
{{ name }}
|
||||
</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button id="mobile-menu-button" class="text-white hover:text-golden-ale transition">
|
||||
<i class="fas fa-bars text-2xl"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Mobile Navigation -->
|
||||
<div id="mobile-menu" class="hidden md:hidden mt-3 pb-3 border-t border-irish-green border-opacity-30">
|
||||
<div class="flex flex-col space-y-2 mt-3">
|
||||
<a href="/" class="hover:text-golden-ale transition py-2">{{ _("Home") }}</a>
|
||||
<a href="/teams" class="hover:text-golden-ale transition py-2">{{ _("Teams") }}</a>
|
||||
<a href="/leaderboard" class="hover:text-golden-ale transition py-2">{{ _("Leaderboard") }}</a>
|
||||
<a href="/scan" class="hover:text-golden-ale transition py-2">{{ _("Scan QR Code") }}</a>
|
||||
{% if user %}
|
||||
<a href="/profile" class="hover:text-golden-ale transition py-2">{{ _("Profile") }}</a>
|
||||
<a href="/dashboard" class="hover:text-golden-ale transition py-2">{{ _("Dashboard") }}</a>
|
||||
{% if user.is_admin %}
|
||||
<a href="/admin" class="hover:text-golden-ale transition py-2">{{ _("Admin") }}</a>
|
||||
{% endif %}
|
||||
<a href="/logout" class="hover:text-golden-ale transition py-2">{{ _("Logout") }}</a>
|
||||
{% else %}
|
||||
<a href="/login" class="bg-golden-ale hover:bg-opacity-90 text-black-stout px-4 py-2 rounded-md transition text-center">{{ _("Sign In") }}</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Desktop Navigation Links -->
|
||||
<nav class="hidden md:flex items-center space-x-6">
|
||||
<a href="/" class="hover:text-golden-ale transition-colors duration-200">
|
||||
<i class="fas fa-home"></i> Home
|
||||
</a>
|
||||
<a href="/teams/" class="hover:text-golden-ale transition-colors duration-200">
|
||||
<i class="fas fa-users"></i> Teams
|
||||
</a>
|
||||
<a href="/leaderboard" class="hover:text-golden-ale transition-colors duration-200">
|
||||
<i class="fas fa-trophy"></i> Leaderboard
|
||||
</a>
|
||||
<a href="/dashboard" class="hover:text-golden-ale transition-colors duration-200">
|
||||
<i class="fas fa-tachometer-alt"></i> Dashboard
|
||||
</a>
|
||||
<a href="/admin/" class="hover:text-golden-ale transition-colors duration-200">
|
||||
<i class="fas fa-lock"></i> Admin
|
||||
</a>
|
||||
<a href="/about" class="hover:text-golden-ale transition-colors duration-200">
|
||||
About
|
||||
</a>
|
||||
<a href="/contact" class="hover:text-golden-ale transition-colors duration-200">
|
||||
Contact
|
||||
</a>
|
||||
</nav>
|
||||
|
||||
<!-- Mobile Menu Button -->
|
||||
<button id="mobile-menu-button" class="md:hidden text-cream-white focus:outline-none">
|
||||
<i class="fas fa-bars text-2xl"></i>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<!-- Mobile Navigation Menu -->
|
||||
<div id="mobile-menu" class="md:hidden hidden pb-4">
|
||||
<nav class="flex flex-col space-y-3">
|
||||
<a href="/" class="hover:bg-green-800 py-2 px-3 rounded-md transition-colors duration-200">
|
||||
<i class="fas fa-home"></i> Home
|
||||
</a>
|
||||
<a href="/teams/" class="hover:bg-green-800 py-2 px-3 rounded-md transition-colors duration-200">
|
||||
<i class="fas fa-users"></i> Teams
|
||||
</a>
|
||||
<a href="/leaderboard" class="hover:bg-green-800 py-2 px-3 rounded-md transition-colors duration-200">
|
||||
<i class="fas fa-trophy"></i> Leaderboard
|
||||
</a>
|
||||
<a href="/dashboard" class="hover:bg-green-800 py-2 px-3 rounded-md transition-colors duration-200">
|
||||
<i class="fas fa-tachometer-alt"></i> Dashboard
|
||||
</a>
|
||||
<a href="/admin/" class="hover:bg-green-800 py-2 px-3 rounded-md transition-colors duration-200">
|
||||
<i class="fas fa-lock"></i> Admin
|
||||
</a>
|
||||
<a href="/about" class="hover:bg-green-800 py-2 px-3 rounded-md transition-colors duration-200">
|
||||
About
|
||||
</a>
|
||||
<a href="/contact" class="hover:bg-green-800 py-2 px-3 rounded-md transition-colors duration-200">
|
||||
Contact
|
||||
</a>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- Main Content -->
|
||||
<main class="flex-grow container mx-auto px-4 py-6">
|
||||
{% block content %}{% endblock %}
|
||||
</main>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer class="bg-black-stout text-cream-white mt-auto">
|
||||
<div class="container mx-auto px-4 py-8">
|
||||
<div class="flex flex-col md:flex-row justify-between items-center">
|
||||
<div class="mb-4 md:mb-0">
|
||||
<h3 class="text-xl font-garamond">LeagueLedger</h3>
|
||||
<p class="text-sm text-cream-white opacity-70">Track Your Triumphs. Celebrate the Quiz.</p>
|
||||
</nav>
|
||||
|
||||
<!-- Main Content -->
|
||||
<main class="flex-grow py-6">
|
||||
{% block content %}{% endblock %}
|
||||
</main>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer class="bg-black-stout text-cream-white py-8 mt-auto">
|
||||
<div class="container mx-auto px-4">
|
||||
<div class="flex flex-col md:flex-row justify-between">
|
||||
<div class="mb-6 md:mb-0">
|
||||
<div class="flex items-center mb-4">
|
||||
<img src="{{ url_for('static', path='images/logos/monogram.png') }}" alt="LeagueLedger Logo" class="h-12">
|
||||
<span class="ml-2 text-xl font-bold">LeagueLedger</span>
|
||||
</div>
|
||||
<p class="text-sm">{{ _("Track your pub quiz team's progress.") }}<br>{{ _("Scan QR codes to earn points.") }}</p>
|
||||
</div>
|
||||
|
||||
<div class="grid grid-cols-2 md:grid-cols-3 gap-8">
|
||||
<div>
|
||||
<h3 class="text-golden-ale font-bold mb-4">{{ _("Navigation") }}</h3>
|
||||
<ul class="space-y-2">
|
||||
<li><a href="/" class="hover:text-golden-ale transition">{{ _("Home") }}</a></li>
|
||||
<li><a href="/teams" class="hover:text-golden-ale transition">{{ _("Teams") }}</a></li>
|
||||
<li><a href="/leaderboard" class="hover:text-golden-ale transition">{{ _("Leaderboard") }}</a></li>
|
||||
<li><a href="/scan" class="hover:text-golden-ale transition">{{ _("Scan QR Code") }}</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<h3 class="text-golden-ale font-bold mb-4">{{ _("Account") }}</h3>
|
||||
<ul class="space-y-2">
|
||||
<li><a href="/login" class="hover:text-golden-ale transition">{{ _("Sign In") }}</a></li>
|
||||
<li><a href="/register" class="hover:text-golden-ale transition">{{ _("Register") }}</a></li>
|
||||
<li><a href="/profile" class="hover:text-golden-ale transition">{{ _("Profile") }}</a></li>
|
||||
<li><a href="/dashboard" class="hover:text-golden-ale transition">{{ _("Dashboard") }}</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<h3 class="text-golden-ale font-bold mb-4">{{ _("Legal") }}</h3>
|
||||
<ul class="space-y-2">
|
||||
<li><a href="/about" class="hover:text-golden-ale transition">{{ _("About") }}</a></li>
|
||||
<li><a href="/contact" class="hover:text-golden-ale transition">{{ _("Contact") }}</a></li>
|
||||
<li><a href="/terms" class="hover:text-golden-ale transition">{{ _("Terms of Service") }}</a></li>
|
||||
<li><a href="/privacy" class="hover:text-golden-ale transition">{{ _("Privacy Policy") }}</a></li>
|
||||
<li><a href="/cookies" class="hover:text-golden-ale transition">{{ _("Cookie Policy") }}</a></li>
|
||||
<li><a href="/impressum" class="hover:text-golden-ale transition">{{ _("Imprint") }}</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="border-t border-gray-800 mt-8 pt-8 flex flex-col md:flex-row justify-between items-center">
|
||||
<div class="flex items-center space-x-4">
|
||||
<p class="text-sm">© 2025 LeagueLedger. {{ _("Licensed under Apache License 2.0") }}</p>
|
||||
</div>
|
||||
<div class="flex space-x-4 mt-4 md:mt-0">
|
||||
{% for code, name in SUPPORTED_LANGUAGES.items() %}
|
||||
<a href="/set-language/{{ code }}" class="hover:text-golden-ale transition {% if locale == code %}font-bold{% endif %}">
|
||||
{{ name }}
|
||||
</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="footer-links">
|
||||
<a href="/about" class="text-cream-white hover:text-golden-ale transition-colors duration-200">About</a>
|
||||
<a href="/contact" class="text-cream-white hover:text-golden-ale transition-colors duration-200">Contact</a>
|
||||
<a href="/privacy" class="text-cream-white hover:text-golden-ale transition-colors duration-200">Privacy</a>
|
||||
<a href="/terms" class="text-cream-white hover:text-golden-ale transition-colors duration-200">Terms</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="border-t border-gray-700 mt-6 pt-6 text-center text-sm text-cream-white opacity-70">
|
||||
© {{ now().year }} LeagueLedger. All rights reserved.
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script>
|
||||
// Mobile menu toggle
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const menuButton = document.getElementById('mobile-menu-button');
|
||||
const mobileMenu = document.getElementById('mobile-menu');
|
||||
|
||||
menuButton.addEventListener('click', function() {
|
||||
mobileMenu.classList.toggle('hidden');
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</footer>
|
||||
<!-- Custom JavaScript -->
|
||||
<script src="{{ url_for('static', path='js/main.js') }}"></script>
|
||||
<!-- Mobile menu toggle script -->
|
||||
<script>
|
||||
document.getElementById('mobile-menu-button').addEventListener('click', function() {
|
||||
const menu = document.getElementById('mobile-menu');
|
||||
menu.classList.toggle('hidden');
|
||||
});
|
||||
</script>
|
||||
<!-- Email Protection Script -->
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
// Decrypt email addresses
|
||||
const emailElements = document.querySelectorAll('.email-protection');
|
||||
emailElements.forEach(function(element) {
|
||||
const email = element.dataset.email;
|
||||
// Create clickable email link
|
||||
const link = document.createElement('a');
|
||||
link.href = 'mailto:' + email;
|
||||
link.textContent = email;
|
||||
link.className = element.className;
|
||||
// Replace placeholder with actual email link
|
||||
element.parentNode.replaceChild(link, element);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{% block extra_scripts %}{% endblock %}
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
Reference in New Issue
Block a user