gcp-hockey-results/motm_app/templates/base.html

350 lines
12 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block title %}HKFC Men's C Team - MOTM System{% endblock %}</title>
<!-- Bootstrap 5 CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
<!-- Font Awesome Icons -->
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
<!-- Custom Styles -->
<style>
:root {
--primary-color: #0d6efd;
--secondary-color: #6c757d;
--success-color: #198754;
--danger-color: #dc3545;
--warning-color: #ffc107;
--info-color: #0dcaf0;
--light-color: #f8f9fa;
--dark-color: #212529;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background-color: #f8f9fa;
}
.navbar-brand {
font-weight: bold;
font-size: 1.5rem;
}
.page-header {
background: linear-gradient(135deg, var(--primary-color) 0%, #0056b3 100%);
color: white;
padding: 2rem 0;
margin-bottom: 2rem;
}
.page-header h1 {
margin: 0;
font-size: 2.5rem;
font-weight: 300;
}
.page-header p {
margin: 0.5rem 0 0 0;
opacity: 0.9;
font-size: 1.1rem;
}
.card {
border: none;
border-radius: 10px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
transition: transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out;
}
.card:hover {
transform: translateY(-2px);
box-shadow: 0 4px 20px rgba(0,0,0,0.15);
}
.card-header {
background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);
border-bottom: 1px solid #dee2e6;
border-radius: 10px 10px 0 0 !important;
font-weight: 600;
}
.btn {
border-radius: 6px;
font-weight: 500;
transition: all 0.2s ease-in-out;
}
.btn:hover {
transform: translateY(-1px);
}
.alert {
border: none;
border-radius: 8px;
border-left: 4px solid;
}
.alert-success {
border-left-color: var(--success-color);
background-color: #d1e7dd;
}
.alert-danger {
border-left-color: var(--danger-color);
background-color: #f8d7da;
}
.alert-warning {
border-left-color: var(--warning-color);
background-color: #fff3cd;
}
.alert-info {
border-left-color: var(--info-color);
background-color: #cff4fc;
}
.table {
border-radius: 8px;
overflow: hidden;
}
.table thead th {
background-color: #f8f9fa;
border-bottom: 2px solid #dee2e6;
font-weight: 600;
}
.form-control, .form-select {
border-radius: 6px;
border: 1px solid #ced4da;
transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
}
.form-control:focus, .form-select:focus {
border-color: var(--primary-color);
box-shadow: 0 0 0 0.2rem rgba(13, 110, 253, 0.25);
}
.footer {
background-color: var(--dark-color);
color: white;
padding: 2rem 0;
margin-top: 4rem;
}
.loading-spinner {
display: inline-block;
width: 1rem;
height: 1rem;
border: 0.125em solid currentColor;
border-right-color: transparent;
border-radius: 50%;
animation: spinner-border 0.75s linear infinite;
}
@keyframes spinner-border {
to { transform: rotate(360deg); }
}
.breadcrumb {
background-color: transparent;
padding: 0;
margin-bottom: 1rem;
}
.breadcrumb-item + .breadcrumb-item::before {
content: "";
color: #6c757d;
}
.status-indicator {
display: inline-block;
width: 8px;
height: 8px;
border-radius: 50%;
margin-right: 0.5rem;
}
.status-online { background-color: var(--success-color); }
.status-offline { background-color: var(--danger-color); }
.status-warning { background-color: var(--warning-color); }
</style>
{% block extra_head %}{% endblock %}
</head>
<body>
<!-- Navigation -->
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
<div class="container">
<a class="navbar-brand" href="/">
<i class="fas fa-trophy me-2"></i>HKFC MOTM System
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav me-auto">
<li class="nav-item">
<a class="nav-link" href="/">
<i class="fas fa-home me-1"></i>Home
</a>
</li>
{% if is_admin %}
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="adminDropdown" role="button" data-bs-toggle="dropdown">
<i class="fas fa-cog me-1"></i>Admin
</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="/admin">
<i class="fas fa-tachometer-alt me-2"></i>Dashboard
</a></li>
<li><a class="dropdown-item" href="/admin/clubs">
<i class="fas fa-users me-2"></i>Club Management
</a></li>
<li><a class="dropdown-item" href="/admin/players">
<i class="fas fa-user me-2"></i>Player Management
</a></li>
<li><a class="dropdown-item" href="/admin/teams">
<i class="fas fa-layer-group me-2"></i>Team Management
</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="/admin/s3-config">
<i class="fas fa-cloud me-2"></i>S3 Configuration
</a></li>
<li><a class="dropdown-item" href="/admin/profile">
<i class="fas fa-user-cog me-2"></i>Profile
</a></li>
</ul>
</li>
{% endif %}
</ul>
<ul class="navbar-nav">
{% if is_admin %}
<li class="nav-item">
<span class="navbar-text">
<i class="fas fa-user-shield me-1"></i>Admin
</span>
</li>
{% endif %}
</ul>
</div>
</div>
</nav>
<!-- Page Header -->
{% if page_title or page_subtitle %}
<div class="page-header">
<div class="container">
<div class="row">
<div class="col-12">
{% if breadcrumbs %}
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
{% for breadcrumb in breadcrumbs %}
<li class="breadcrumb-item {% if loop.last %}active{% endif %}">
{% if not loop.last and breadcrumb.url %}
<a href="{{ breadcrumb.url }}">{{ breadcrumb.title }}</a>
{% else %}
{{ breadcrumb.title }}
{% endif %}
</li>
{% endfor %}
</ol>
</nav>
{% endif %}
{% if page_title %}
<h1>{{ page_title }}</h1>
{% endif %}
{% if page_subtitle %}
<p>{{ page_subtitle }}</p>
{% endif %}
</div>
</div>
</div>
</div>
{% endif %}
<!-- Main Content -->
<div class="container">
<!-- Flash Messages -->
{% with messages = get_flashed_messages(with_categories=true) %}
{% if messages %}
<div class="row">
<div class="col-12">
{% for category, message in messages %}
<div class="alert alert-{{ 'danger' if category == 'error' else category }} alert-dismissible fade show" role="alert">
<i class="fas fa-{{ 'exclamation-triangle' if category == 'error' else 'info-circle' if category == 'info' else 'check-circle' if category == 'success' else 'exclamation-triangle' }} me-2"></i>
{{ message }}
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
</div>
{% endfor %}
</div>
</div>
{% endif %}
{% endwith %}
<!-- Page Content -->
{% block content %}{% endblock %}
</div>
<!-- Footer -->
<footer class="footer">
<div class="container">
<div class="row">
<div class="col-md-6">
<h5>HKFC Men's C Team MOTM System</h5>
<p class="mb-0">Man of the Match and Dick of the Day voting system</p>
</div>
<div class="col-md-6 text-md-end">
<p class="mb-0">
<i class="fas fa-calendar-alt me-1"></i>
{% if current_year %}{{ current_year }}{% else %}2025{% endif %}
</p>
</div>
</div>
</div>
</footer>
<!-- Bootstrap 5 JS -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
<!-- jQuery (for compatibility with existing scripts) -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<!-- Common JavaScript -->
<script>
// Common utility functions
function showLoading(element) {
element.html('<span class="loading-spinner"></span> Loading...');
}
function hideLoading(element, originalText) {
element.html(originalText);
}
// Auto-dismiss alerts after 5 seconds
$(document).ready(function() {
setTimeout(function() {
$('.alert:not(.alert-permanent)').fadeOut();
}, 5000);
});
// Confirm dialogs for destructive actions
$('[data-confirm]').on('click', function(e) {
if (!confirm($(this).data('confirm'))) {
e.preventDefault();
}
});
</script>
{% block extra_scripts %}{% endblock %}
</body>
</html>