<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block title %}{{ site_setting('site_name', 'ActuFake') }} - {{ site_setting('site_tagline', 'L\'actualité satirique en temps réel') }}{% endblock %}</title>
<meta name="description" content="{% block description %}{{ site_setting('site_description', 'ActuFake est un site satirique et parodique. Les informations publiées sont FICTIVES et à but humoristique uniquement.') }}{% endblock %}">
{% set favicon_path = site_setting('site_favicon', 'build/favicon.ico') %}
<link rel="icon" href="{{ favicon_path starts with 'build/' ? asset(favicon_path) : base_path ~ '/' ~ favicon_path }}">
{% block stylesheets %}
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
{{ encore_entry_link_tags('app') }}
<style>
:root {
--primary-color: {{ site_setting('color_primary', '#000000') }};
--accent-color: {{ site_setting('color_accent', '#dc3545') }};
--bg-color: {{ site_setting('color_background', '#f5f5f5') }};
--text-color: {{ site_setting('color_text', '#1a1a1a') }};
}
body {
background-color: var(--bg-color);
}
.satirical-warning {
position: sticky;
top: 0;
z-index: 1030;
}
.navbar-brand {
color: var(--primary-color) !important;
}
.category-badge {
background: var(--accent-color);
color: white;
}
.featured-article-hero {
position: relative;
overflow: hidden;
border-radius: 0;
margin-bottom: 2rem;
}
.featured-article-hero img {
width: 100%;
height: 500px;
object-fit: cover;
}
.featured-overlay {
position: absolute;
bottom: 0;
left: 0;
right: 0;
background: linear-gradient(to top, rgba(0,0,0,0.9) 0%, rgba(0,0,0,0.5) 50%, transparent 100%);
padding: 3rem 2rem 2rem;
color: white;
}
.featured-overlay h1 {
font-size: 2.75rem;
margin-bottom: 1rem;
color: white;
text-shadow: 2px 2px 4px rgba(0,0,0,0.5);
}
.section-title {
font-size: 1.5rem;
font-weight: 900;
text-transform: uppercase;
border-bottom: 4px solid var(--accent-color);
padding-bottom: 0.5rem;
margin-bottom: 1.5rem;
letter-spacing: 1px;
}
.article-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 1.5rem;
}
.article-list-item {
border-bottom: 1px solid #e0e0e0;
padding-bottom: 1.5rem;
margin-bottom: 1.5rem;
}
.article-list-item:last-child {
border-bottom: none;
}
.text-red {
color: #dc3545;
}
.text-white {
color: #ffffff;
}
.bg-red {
background-color: #dc3545;
}
.bg-white {
background-color: #ffffff;
}
.text-yellow {
color: #ffc107;
}
</style>
{% endblock %}
</head>
<body>
{% if site_setting('header_warning_enabled', '1') == '1' %}
<div class="satirical-warning">
<i class="fas fa-exclamation-triangle"></i>
{{ site_setting('header_warning_text', 'SITE SATIRIQUE - CONTENU PARODIQUE ET FICTIF') }}
<i class="fas fa-exclamation-triangle"></i>
</div>
{% endif %}
<nav class="navbar navbar-light py-3 {% if site_setting('header_logo_centered', '0') == '1' %}navbar-logo-centered{% endif %}">
<div class="container bg-danger d-flex justify-content-center">
<a class="navbar-brand" href="{{ path('home') }}">
{% set banner_image = site_setting('site_banner_image', '') %}
{% set logo_image = site_setting('site_logo_image', '') %}
{% if banner_image %}
{% set banner_path = banner_image starts with '/' ? banner_image|slice(1) : banner_image %}
<img src="{{ base_path ~ '/' ~ banner_path }}" alt="{{ site_setting('site_name', 'ActuFake') }}" class="header-banner">
{% elseif logo_image %}
{% set logo_path = logo_image starts with '/' ? logo_image|slice(1) : logo_image %}
<img src="{{ base_path ~ '/' ~ logo_path }}" alt="{{ site_setting('site_name', 'ActuFake') }}" style="min-width: 400px; height: auto;">
{% else %}
{{ site_setting('site_logo_text', 'ActuFake') }}
{% endif %}
</a>
</div>
</nav>
{% if global_categories is defined and global_categories|length > 0 %}
<div class="categories-bar bg-danger border-bottom">
<div class="container">
<nav class="d-flex align-items-center justify-content-between py-2">
<div class="d-flex align-items-center">
{% for category in global_categories %}
<a href="{{ path('category_show', {slug: category.slug}) }}"
class="category-link text-decoration-none text-white px-3 py-2 d-flex align-items-center">
{% if category.icon %}
<i class="fas {{ category.icon }} me-2"></i>
{% endif %}
<span class="text-nowrap">{{ category.name }}</span>
</a>
{% endfor %}
</div>
<div class="d-flex align-items-center text-white gap-2">
<a class="nav-link px-2" href="{{ path('search') }}" title="Recherche">
<i class="fas fa-search"></i>
</a>
{% if is_granted('ROLE_ADMIN') or is_granted('ROLE_EDITOR') %}
<a class="btn btn-sm btn-danger text-yellow px-3" href="{{ path('admin_dashboard') }}">
<i class="fas fa-cog me-1"></i> Administration
</a>
<a class="nav-link px-2" href="{{ path('app_logout') }}" title="Déconnexion">
<i class="fas fa-sign-out-alt"></i>
</a>
{% else %}
<a class="btn btn-sm bg-white text-red px-3" href="{{ path('app_login') }}">
<i class="fas fa-sign-in-alt me-1"></i> Connexion
</a>
{% endif %}
</div>
</nav>
</div>
</div>
{% endif %}
<main>
{% for type, messages in app.flashes %}
<div class="container mt-3">
{% for message in messages %}
<div class="alert alert-{{ type == 'error' ? 'danger' : type }} alert-dismissible fade show">
{{ message }}
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
</div>
{% endfor %}
</div>
{% endfor %}
{% block body %}{% endblock %}
</main>
<footer class="bg-dark text-white mt-5 py-5">
<div class="container">
<div class="row g-4">
<div class="col-md-4">
{% set logo_image = site_setting('site_logo_image', '') %}
{% if logo_image %}
{% set logo_path = logo_image starts with '/' ? logo_image|slice(1) : logo_image %}
<img src="{{ base_path ~ '/' ~ logo_path }}" alt="{{ site_setting('site_name', 'ActuFake') }}" style="max-height: 100px; max-width: 300px; margin-bottom: 1rem;"class="btn btn-danger">
{% else %}
<h5 class="fw-bold mb-3" style="font-family: 'Impact', sans-serif; font-size: 1.5rem; letter-spacing: -0.5px;">
{{ site_setting('site_name', 'ActuFake') }}
</h5>
{% endif %}
<p class="mb-3" style="line-height: 1.7;">{{ site_setting('footer_about_text', 'L\'actualité satirique en temps réel') }}</p>
<div class="alert alert-warning bg-warning bg-opacity-25 border-warning border-2 mb-0">
<p class="small mb-0 text-white" style="line-height: 1.6; color:rgba(233, 227, 227, 0.9);">
<i class="fas fa-exclamation-triangle" style="color:rgb(246, 242, 26);"></i>
{{ site_setting('footer_disclaimer', 'Toutes les informations publiées sur ce site sont FICTIVES et à but humoristique uniquement.') }}
</p>
</div>
</div>
<div class="col-md-4">
<h6 class="fw-bold text-uppercase mb-3" style="letter-spacing: 1px; font-size: 0.85rem;">Navigation</h6>
<ul class="list-unstyled">
<li class="mb-2"><a href="{{ path('home') }}" class="text-white-50 text-decoration-none">Accueil</a></li>
<li class="mb-2"><a href="{{ path('about') }}" class="text-white-50 text-decoration-none">À propos</a></li>
<li class="mb-2"><a href="{{ path('legal') }}" class="text-white-50 text-decoration-none">Mentions légales</a></li>
<li class="mb-2"><a href="{{ path('privacy') }}" class="text-white-50 text-decoration-none">Politique de confidentialité</a></li>
<li class="mb-2"><a href="{{ path('contact') }}" class="text-white-50 text-decoration-none">Contact</a></li>
</ul>
</div>
<div class="col-md-4">
<h6 class="fw-bold text-uppercase mb-3" style="letter-spacing: 1px; font-size: 0.85rem;">Contact Rapide</h6>
<form id="footer-contact-form" action="{{ path('contact_submit') }}" method="post">
<div class="mb-2">
<input type="text" name="name" class="form-control form-control-sm bg-dark text-white border-secondary" placeholder="Votre nom" required>
</div>
<div class="mb-2">
<input type="email" name="email" class="form-control form-control-sm bg-dark text-white border-secondary" placeholder="Votre email" required>
</div>
<div class="mb-2">
<input type="text" name="subject" class="form-control form-control-sm bg-dark text-white border-secondary" placeholder="Sujet (optionnel)">
</div>
<div class="mb-2">
<textarea name="message" class="form-control form-control-sm bg-dark text-white border-secondary" rows="3" placeholder="Votre message..." required></textarea>
</div>
<input type="hidden" name="_token" value="{{ csrf_token('contact_submit') }}">
<button type="submit" class="btn btn-sm btn-danger w-100">
<i class="fas fa-paper-plane me-1"></i> Envoyer
</button>
</form>
<div class="social-links d-flex gap-3 mt-3">
<a href="{{ site_setting('social_twitter_url', '#') }}" class="text-white-50" target="_blank" title="Twitter">
<i class="fab fa-twitter fa-lg"></i>
</a>
<a href="{{ site_setting('social_instagram_url', '#') }}" class="text-white-50" target="_blank" title="Instagram">
<i class="fab fa-instagram fa-lg"></i>
</a>
<a href="{{ site_setting('social_threads_url', '#') }}" class="text-white-50" target="_blank" title="Threads">
<i class="fab fa-threads fa-lg"></i>
</a>
</div>
</div>
</div>
<hr class="border-secondary my-4">
<div class="d-flex flex-column flex-md-row justify-content-between align-items-center">
<p class="small mb-2 mb-md-0 text-white-50">
© {{ 'now'|date('Y') }} {{ site_setting('footer_copyright', 'ActuFake. Site satirique et parodique.') }}
</p>
<p class="small mb-0 text-white-50">
Propulsé par Symfony {{ constant('Symfony\\Component\\HttpKernel\\Kernel::VERSION') }}
</p>
</div>
</div>
</footer>
{% block javascripts %}
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
{{ encore_entry_script_tags('app') }}
<script>
document.addEventListener('DOMContentLoaded', function() {
const contactForm = document.getElementById('footer-contact-form');
if (contactForm) {
contactForm.addEventListener('submit', function(e) {
e.preventDefault();
const formData = new FormData(contactForm);
const submitBtn = contactForm.querySelector('button[type="submit"]');
const originalText = submitBtn.innerHTML;
submitBtn.disabled = true;
submitBtn.innerHTML = '<i class="fas fa-spinner fa-spin me-1"></i> Envoi...';
fetch(contactForm.action, {
method: 'POST',
body: formData,
headers: {
'X-Requested-With': 'XMLHttpRequest'
}
})
.then(response => response.json())
.then(data => {
if (data.success) {
submitBtn.innerHTML = '<i class="fas fa-check me-1"></i> Envoyé!';
submitBtn.classList.remove('btn-primary');
submitBtn.classList.add('btn-success');
contactForm.reset();
setTimeout(() => {
submitBtn.innerHTML = originalText;
submitBtn.classList.remove('btn-success');
submitBtn.classList.add('btn-primary');
submitBtn.disabled = false;
}, 3000);
}
})
.catch(error => {
submitBtn.innerHTML = '<i class="fas fa-times me-1"></i> Erreur';
submitBtn.classList.remove('btn-primary');
submitBtn.classList.add('btn-danger');
submitBtn.disabled = false;
setTimeout(() => {
submitBtn.innerHTML = originalText;
submitBtn.classList.remove('btn-danger');
submitBtn.classList.add('btn-primary');
}, 3000);
});
});
}
});
</script>
{% endblock %}
</body>
</html>