✨ feat(dons): Ajoute la fonctionnalité de dons avec Stripe et reçus PDF.
Ajoute une page de dons avec formulaire, intégration Stripe, webhooks,
génération de reçus PDF et envoi de mails de confirmation. Ajoute aussi
gestion des erreurs 404/500.
```
502 lines
27 KiB
Twig
502 lines
27 KiB
Twig
<!doctype html>
|
|
<html lang="{{ app.request.locale }}">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
|
|
<title>E-Cosplay | {% block title %}Accueil{% endblock %}</title>
|
|
<meta name="description" content="{% block meta_description '' %}">
|
|
|
|
{# OPEN GRAPH / TWITTER CARD / SEO META #}
|
|
<meta property="og:type" content="website">
|
|
<meta property="og:url"
|
|
content="{{ url(app.request.attributes.get('_route','app_home'), app.request.attributes.get('_route_params',[])) }}">
|
|
<meta property="og:title" content="E-Cosplay | {{ block('title') }}">
|
|
<meta property="og:description" content="{{ block('meta_description') }}">
|
|
<meta property="og:image" content="{{ asset('assets/images/logo.jpg') | imagine_filter('webp') }}">
|
|
|
|
<meta name="twitter:card" content="summary_large_image">
|
|
<meta name="twitter:url"
|
|
content="{{ url(app.request.attributes.get('_route','app_home'), app.request.attributes.get('_route_params',[])) }}">
|
|
<meta name="twitter:title" content="E-Cosplay | {{ block('title') }}">
|
|
<meta name="twitter:description" content="{{ block('meta_description') }}">
|
|
<meta name="twitter:image" content="{{ asset('assets/images/logo.jpg') | imagine_filter('webp') }}">
|
|
<meta name="twitter:site" content="@E_Cosplay_asso">
|
|
|
|
<meta name="author" content="Association E-Cosplay">
|
|
<meta name="keywords" content="cosplay, concours cosplay, organisation, événement, geek">
|
|
|
|
{% if no_index is defined %}
|
|
<meta name="robots" content="noindex, nofollow">
|
|
{% endif %}
|
|
|
|
{# FAVICONS & Manifest #}
|
|
<link rel="icon" type="image/png" href="{{ asset('favicon/favicon-96x96.png') }}" sizes="96x96"/>
|
|
<link rel="icon" type="image/svg+xml" href="{{ asset('favicon/favicon.svg') }}"/>
|
|
<link rel="shortcut icon" href="{{ asset('favicon/favicon.ico') }}"/>
|
|
<link rel="apple-touch-icon" sizes="180x180" href="{{ asset('favicon/apple-touch-icon.png') }}"/>
|
|
<meta name="apple-mobile-web-app-title" content="E-Cosplay"/>
|
|
<link rel="manifest" href="{{ asset('site.webmanifest') }}"/>
|
|
<link rel="stylesheet" href="{{ asset('assets/css/all.min.css') }}" crossorigin="anonymous"
|
|
referrerpolicy="no-referrer"/>
|
|
<meta name="google-site-verification" content="D6YvgLKg4oj2Ksk_cYhO3fijbmxZWib7wqqHTJyfftQ"/>
|
|
<script src="https://js.stripe.com/clover/stripe.js"></script>
|
|
<meta name="env" content="{{ app.environment }}">
|
|
{% block canonical_url %}{% endblock %}
|
|
|
|
{# SCHÉMAS JSON-LD #}
|
|
<script type="application/ld+json">
|
|
{
|
|
"@context": "https://schema.org",
|
|
"@type": "WebSite",
|
|
"name": "E-Cosplay",
|
|
"url": "{{ app.request.schemeAndHttpHost }}"
|
|
}
|
|
</script>
|
|
<script type="application/ld+json">
|
|
{
|
|
"@context": "https://schema.org",
|
|
"@type": "Organization",
|
|
"name": "Association E-Cosplay",
|
|
"url": "{{ app.request.schemeAndHttpHost }}",
|
|
"logo": "{{ asset('assets/images/logo.jpg') | imagine_filter('webp') }}",
|
|
"sameAs": [
|
|
"https://www.facebook.com/assocationecosplay",
|
|
"https://www.instagram.com/asso_ecosplay/"
|
|
],
|
|
"address": {
|
|
"@type": "PostalAddress",
|
|
"streetAddress": "42 rue de Saint-Quentin",
|
|
"addressLocality": "Beautor",
|
|
"postalCode": "02800",
|
|
"addressCountry": "FR"
|
|
}
|
|
}
|
|
</script>
|
|
<script type="application/ld+json">
|
|
{
|
|
"@context": "https://schema.org/",
|
|
"@type": "Person",
|
|
"name": "ShokoCosplay",
|
|
"image": "{{ asset('assets/images/shoko.jpg') | imagine_filter('webp') }}",
|
|
"jobTitle": "Président",
|
|
"sameAs": [
|
|
"https://www.instagram.com/cosplay_shoko/",
|
|
"https://www.tiktok.com/@cosshoko?lang=fr",
|
|
"https://www.facebook.com/CosplayShoko"
|
|
],
|
|
"worksFor": {
|
|
"@type": "Organization",
|
|
"name": "E-Cosplay"
|
|
}
|
|
}
|
|
</script>
|
|
<script type="application/ld+json">
|
|
{
|
|
"@context": "https://schema.org/",
|
|
"@type": "Person",
|
|
"name": "Marta Gator",
|
|
"image": "{{ asset('assets/images/marta.jpg') | imagine_filter('webp') }}",
|
|
"jobTitle": "Secrétaire",
|
|
"sameAs": [
|
|
"https://www.facebook.com/profile.php?id=100081002010111",
|
|
"https://www.tiktok.com/@marta_gator",
|
|
"https://www.instagram.com/marta_gator/"
|
|
],
|
|
"worksFor": {
|
|
"@type": "Organization",
|
|
"name": "E-Cosplay"
|
|
}
|
|
}
|
|
</script>
|
|
{% block breadcrumb_schema %}{% endblock %}
|
|
{% block stylesheets %}{% endblock %}
|
|
<script type="text/javascript" src="/ts.js" async></script>
|
|
{{ vite_asset('app.js', []) }}
|
|
{% if app.environment == "prod" %}
|
|
<script defer src="https://datas.e-cosplay.fr/vs.js"
|
|
data-website-id="b929d372-fbea-403e-9ae2-781433828787"></script> {% endif %}
|
|
|
|
</head>
|
|
{# Le corps aura un fond gris clair pour correspondre au fond du logo #}
|
|
<body class="flex flex-col min-h-screen bg-gray-100">
|
|
{% set menu_links = [
|
|
{ 'name': 'Accueil'|trans, 'route': 'app_home' },
|
|
{ 'name': 'Qui sommes-nous'|trans, 'route': 'app_about' },
|
|
{ 'name': 'Nos membres'|trans, 'route': 'app_members' },
|
|
{ 'name': 'Nos événements'|trans, 'route': 'app_events' },
|
|
{ 'name': 'Boutiques'|trans, 'route': 'app_shop' },
|
|
{ 'name': 'Dons'|trans, 'route': 'app_dons' },
|
|
{ 'name': 'Contact'|trans, 'route': 'app_contact' }
|
|
] %}
|
|
<header class="bg-white shadow-md sticky top-0 z-40">
|
|
<nav class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
|
<div class="flex justify-between items-center h-16">
|
|
{# LOGO / NOM DU SITE #}
|
|
<div class="flex-shrink-0 flex items-center">
|
|
<a href="{{ path('app_home') }}" class="flex items-center space-x-2 text-xl font-bold text-gray-900">
|
|
<img class="h-8 w-auto" src="{{ asset('assets/images/logo.jpg') | imagine_filter('webp') }}"
|
|
alt="E-Cosplay Logo">
|
|
{# Le texte du nom du site peut rester en noir pour la lisibilité #}
|
|
<span class="text-gray-900">E-Cosplay</span>
|
|
</a>
|
|
</div>
|
|
|
|
{# LIENS DE NAVIGATION (Desktop) #}
|
|
<div class="hidden md:flex md:space-x-4 items-center">
|
|
{# Liens de navigation #}
|
|
<div class="hidden md:flex md:space-x-1">
|
|
{% for link in menu_links %}
|
|
{% set is_active = (app.request.get('_route') == link.route) %}
|
|
|
|
<a href="{{ path(link.route) }}"
|
|
class="{% if is_active %}bg-gray-100 text-red-600{% else %}text-gray-700 hover:bg-gray-100 hover:text-red-600{% endif %} px-3 py-2 rounded-md text-sm font-medium">
|
|
{{ link.name }}
|
|
</a>
|
|
{% endfor %}
|
|
</div>
|
|
|
|
{# SÉLECTEUR DE LANGUE (Desktop) #}
|
|
<div class="flex items-center space-x-2 border-l border-gray-200 pl-4">
|
|
{% set current_route = app.request.attributes.get('_route','app_home') %}
|
|
{% set current_params = app.request.attributes.get('_route_params',[]) %}
|
|
|
|
{# Fonction pour générer le chemin avec le paramètre 'lang' (doit être définie dans une extension Twig) #}
|
|
{# En attendant, nous générons l'URL manuellement #}
|
|
{% set current_query = app.request.query.all %}
|
|
|
|
{% for lang in ['fr', 'en'] %}
|
|
{% set is_active_lang = (app.request.locale == lang) %}
|
|
{% set lang_params = current_params|merge(current_query)|merge({'lang': lang}) %}
|
|
{# Générer l'URL en conservant les paramètres existants + le paramètre 'lang' #}
|
|
{% set lang_url = path(current_route, lang_params) %}
|
|
|
|
<a href="{{ lang_url }}"
|
|
class="text-xs font-bold uppercase transition duration-150 ease-in-out {% if is_active_lang %}text-red-600 border-b-2 border-red-600{% else %}text-gray-500 hover:text-red-600{% endif %}">
|
|
{{ lang }}
|
|
</a>
|
|
{% endfor %}
|
|
</div>
|
|
|
|
{# BOUTON PANIER (Desktop) #}
|
|
<button id="openCartDesktop" type="button"
|
|
class="relative p-2 text-gray-700 hover:text-red-600 rounded-full transition duration-150 ease-in-out">
|
|
<span class="sr-only">{{ 'open_cart_sr'|trans }}</span>
|
|
<svg class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
|
d="M3 3h2l.4 2M7 13h10l4-8H5.4M7 13L5.4 5M7 13l-2.293 2.293c-.63.63-.184 1.707.707 1.707H17m0 0a2 2 0 100 4 2 2 0 000-4zm-8 2a2 2 0 11-4 0 2 2 0 014 0z"/>
|
|
</svg>
|
|
{# Compteur Panier - Initialisé à 0 #}
|
|
<span id="cartCountDesktop"
|
|
class="absolute top-0 right-0 inline-flex items-center justify-center px-2 py-1 text-xs font-bold leading-none text-white transform translate-x-1/2 -translate-y-1/2 bg-red-600 rounded-full">
|
|
0
|
|
</span>
|
|
</button>
|
|
|
|
{# NOUVEAU: COMPTE / MENU DÉROULANT (Desktop) #}
|
|
<div class="relative">
|
|
<button id="userMenuButtonDesktop" type="button"
|
|
class="p-2 text-gray-700 hover:text-red-600 rounded-full transition duration-150 ease-in-out"
|
|
aria-expanded="false" aria-haspopup="true">
|
|
<span class="sr-only">{{ 'open_user_menu_sr'|trans }}</span>
|
|
{# Icône de l'utilisateur (Heroicons 'User') #}
|
|
<svg class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
|
d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"/>
|
|
</svg>
|
|
</button>
|
|
|
|
{# Menu déroulant (Masqué par défaut avec 'hidden') #}
|
|
<div id="userMenuDesktop"
|
|
class="origin-top-right absolute right-0 mt-2 w-48 rounded-md shadow-lg bg-white ring-1 ring-black ring-opacity-5 hidden"
|
|
role="menu" aria-orientation="vertical" aria-labelledby="user-menu-button">
|
|
<div class="py-1" role="none">
|
|
{% if is_granted('ROLE_USER') %}
|
|
{# Afficher le nom de l'utilisateur et la déconnexion si connecté #}
|
|
<div
|
|
class="block px-4 py-2 text-sm text-gray-900 font-semibold border-b border-gray-100">
|
|
{{ 'logged_in_as'|trans }} {{ app.user.username|default('Compte') }}
|
|
</div>
|
|
<a href="{{ path('admin_dashboard') }}"
|
|
class="block px-4 py-2 text-sm text-cyan-600 hover:bg-gray-100" role="menuitem"
|
|
tabindex="-1">
|
|
{{ 'logged_admin'|trans }}
|
|
</a>
|
|
<a href="{{ path('app_logout') }}"
|
|
class="block px-4 py-2 text-sm text-red-600 hover:bg-gray-100" role="menuitem"
|
|
tabindex="-1">
|
|
{{ 'logout_link'|trans }}
|
|
</a>
|
|
{% else %}
|
|
{# Afficher la connexion si non connecté #}
|
|
<a href="{{ path('app_login') }}"
|
|
class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100" role="menuitem"
|
|
tabindex="-1" id="user-menu-item-0">
|
|
{{ 'login_link'|trans }}
|
|
</a>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{# BOUTONS MOBILE (Burger Icon, Panier, Langue, et Compte) #}
|
|
<div class="md:hidden flex items-center space-x-2">
|
|
{# NOUVEAU: COMPTE / MENU DÉROULANT (Mobile) #}
|
|
<div class="relative">
|
|
<button id="userMenuButtonMobile" type="button"
|
|
class="p-2 text-gray-700 hover:text-red-600 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500 rounded-md"
|
|
aria-expanded="false" aria-haspopup="true">
|
|
<span class="sr-only">{{ 'open_user_menu_sr'|trans }}</span>
|
|
{# Icône de l'utilisateur (Heroicons 'User') #}
|
|
<svg class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
|
d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"/>
|
|
</svg>
|
|
</button>
|
|
{# Le menu déroulant Mobile peut être affiché via le JS global si l'espace le permet #}
|
|
<div id="userMenuMobile"
|
|
class="origin-top-right absolute right-0 mt-2 w-48 rounded-md shadow-lg bg-white ring-1 ring-black ring-opacity-5 hidden"
|
|
role="menu" aria-orientation="vertical" aria-labelledby="user-menu-button-mobile">
|
|
<div class="py-1" role="none">
|
|
{% if is_granted('ROLE_USER') %}
|
|
<div
|
|
class="block px-4 py-2 text-sm text-gray-900 font-semibold border-b border-gray-100">
|
|
{{ 'logged_in_as'|trans }} {{ app.user.username|default('Compte') }}
|
|
</div>
|
|
<a href="{{ path('app_logout') }}"
|
|
class="block px-4 py-2 text-sm text-red-600 hover:bg-gray-100" role="menuitem"
|
|
tabindex="-1">
|
|
{{ 'logout_link'|trans }}
|
|
</a>
|
|
{% else %}
|
|
<a href="{{ path('app_login') }}"
|
|
class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100" role="menuitem"
|
|
tabindex="-1">
|
|
{{ 'login_link'|trans }}
|
|
</a>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{# SÉLECTEUR DE LANGUE (Mobile - Compact) #}
|
|
<div class="flex items-center space-x-2">
|
|
{% set current_route = app.request.attributes.get('_route','app_home') %}
|
|
{% set current_params = app.request.attributes.get('_route_params',[]) %}
|
|
{% set current_query = app.request.query.all %}
|
|
|
|
{% for lang in ['fr', 'en'] %}
|
|
{% set is_active_lang = (app.request.locale == lang) %}
|
|
{% set lang_params = current_params|merge(current_query)|merge({'lang': lang}) %}
|
|
{% set lang_url = path(current_route, lang_params) %}
|
|
|
|
<a href="{{ lang_url }}"
|
|
class="text-xs font-bold uppercase transition duration-150 ease-in-out {% if is_active_lang %}text-red-600 border-b-2 border-red-600{% else %}text-gray-500 hover:text-red-600{% endif %}">
|
|
{{ lang }}
|
|
</a>
|
|
{% endfor %}
|
|
</div>
|
|
|
|
{# BOUTON PANIER (Mobile) #}
|
|
<button id="openCartMobile" type="button"
|
|
class="relative p-2 text-gray-700 hover:text-red-600 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500 rounded-md">
|
|
<span class="sr-only">{{ 'open_cart_sr'|trans }}</span>
|
|
<svg class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
|
d="M3 3h2l.4 2M7 13h10l4-8H5.4M7 13L5.4 5M7 13l-2.293 2.293c-.63.63-.184 1.707.707 1.707H17m0 0a2 2 0 100 4 2 2 0 000-4zm-8 2a2 2 0 11-4 0 2 2 0 014 0z"/>
|
|
</svg>
|
|
{# Compteur Panier - Initialisé à 0 #}
|
|
<span id="cartCountMobile"
|
|
class="absolute top-0 right-0 inline-flex items-center justify-center px-2 py-1 text-xs font-bold leading-none text-white transform translate-x-1/2 -translate-y-1/2 bg-red-600 rounded-full">
|
|
0
|
|
</span>
|
|
</button>
|
|
|
|
{# BOUTON MOBILE (Burger Icon) #}
|
|
<button id="mobileMenuButton" type="button"
|
|
class="text-red-500 hover:text-red-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500 p-2 rounded-md"
|
|
aria-controls="mobile-menu" aria-expanded="false">
|
|
<span class="sr-only">{{ 'open_main_menu_sr'|trans }}</span>
|
|
<svg class="h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
|
|
stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
|
d="M4 6h16M4 12h16M4 18h16"/>
|
|
</svg>
|
|
</button>
|
|
</div>
|
|
|
|
</div>
|
|
</nav>
|
|
|
|
{# MENU MOBILE (Contenu caché) #}
|
|
<div class="md:hidden hidden" id="mobile-menu">
|
|
<div class="px-2 pt-2 pb-3 space-y-1 sm:px-3">
|
|
{% for link in menu_links %}
|
|
{% set is_active = (app.request.get('_route') == link.route) %}
|
|
|
|
<a href="{{ path(link.route) }}"
|
|
class="block {% if is_active %}bg-gray-100 text-red-600{% else %}text-gray-700 hover:bg-gray-100 hover:text-red-600{% endif %} px-3 py-2 rounded-md text-base font-medium">
|
|
{{ link.name }}
|
|
</a>
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
</header>
|
|
|
|
<main role="main" class="flex-grow">
|
|
|
|
{% block body %}{% endblock %}
|
|
</main>
|
|
|
|
{# ========================================================== #}
|
|
{# PANIER LATÉRAL (OFF-CANVAS CART) #}
|
|
{# Utilise Tailwind pour les transitions et l'accessibilité #}
|
|
{# Le panier sera masqué par défaut (translate-x-full) #}
|
|
<div id="cartSidebar"
|
|
class="fixed top-0 right-0 w-full md:w-96 h-full bg-white shadow-xl transform translate-x-full transition-transform duration-300 ease-in-out z-50 flex flex-col">
|
|
|
|
{# Entête du panier #}
|
|
<div class="p-4 border-b border-gray-200 flex justify-between items-center">
|
|
<h2 class="text-xl font-bold text-gray-900">{{ 'your_cart'|trans }}</h2>
|
|
<button id="closeCartButton" type="button"
|
|
class="text-gray-400 hover:text-gray-600 p-2 rounded-full transition duration-150 ease-in-out">
|
|
<span class="sr-only">{{ 'close_cart_sr'|trans }}</span>
|
|
<svg class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/>
|
|
</svg>
|
|
</button>
|
|
</div>
|
|
|
|
{# Contenu du Panier (Défilement) #}
|
|
<div id="cartItemsContainer" class="flex-grow overflow-y-auto p-4 space-y-4">
|
|
{# Espace pour les articles du panier - Contenu mocké pour l'exemple #}
|
|
<div class="text-center text-gray-500 py-12">
|
|
<svg class="mx-auto h-12 w-12 text-gray-400" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
|
d="M3 3h2l.4 2M7 13h10l4-8H5.4M7 13L5.4 5M7 13l-2.293 2.293c-.63.63-.184 1.707.707 1.707H17m0 0a2 2 0 100 4 2 2 0 000-4zm-8 2a2 2 0 11-4 0 2 2 0 014 0z"/>
|
|
</svg>
|
|
<p class="mt-1">{{ 'cart_empty'|trans }}</p>
|
|
</div>
|
|
</div>
|
|
|
|
{# Pied de page du panier (Total et Paiement) #}
|
|
<div class="p-4 border-t border-gray-200">
|
|
<div class="flex justify-between font-bold text-lg mb-4">
|
|
<span>{{ 'subtotal_label'|trans }}:</span>
|
|
<span id="cartSubtotal">0.00 €</span>
|
|
</div>
|
|
<a href=""
|
|
class="w-full block text-center bg-red-600 text-white py-3 rounded-md hover:bg-red-700 transition duration-150 ease-in-out font-semibold">
|
|
{{ 'checkout_button'|trans }}
|
|
</a>
|
|
<p class="text-xs text-gray-500 text-center mt-2">{{ 'shipping_disclaimer'|trans }}</p>
|
|
</div>
|
|
</div>
|
|
|
|
{# FONDU NOIR (Backdrop) - S'affiche lorsque le panier est ouvert #}
|
|
<div id="cartBackdrop" class="fixed inset-0 bg-op z-40 hidden transition-opacity duration-300 ease-in-out"
|
|
aria-hidden="true"></div>
|
|
{# ========================================================== #}
|
|
|
|
|
|
<footer class="bg-[#FABF04] text-gray-900 border-t border-red-600">
|
|
<div class="max-w-7xl mx-auto py-8 px-4 sm:px-6 lg:px-8">
|
|
|
|
{# BLOC DE CONTACT ET RÉSEAUX (Utilise le block footer pour l'emplacement) #}
|
|
{% block footer %}
|
|
<div class="grid grid-cols-1 md:grid-cols-3 gap-8 pb-6 mb-4 border-b border-gray-600">
|
|
|
|
{# 1. Coordonnées #}
|
|
<div>
|
|
<h3 class="text-lg font-semibold mb-3 text-gray-900">{{ 'footer_contact_title'|trans }}</h3>
|
|
<p class="text-sm text-gray-700">
|
|
42 rue de Saint-Quentin<br>
|
|
02800 Beautor, FRANCE
|
|
</p>
|
|
<p class="text-sm text-gray-700 mt-2">
|
|
<a href="mailto:contact@e-cosplay.fr"
|
|
class="hover:text-red-600 transition duration-150 ease-in-out">contact@e-cosplay.fr</a>
|
|
</p>
|
|
</div>
|
|
|
|
{# 2. Réseaux Sociaux #}
|
|
<div>
|
|
<h3 class="text-lg font-semibold mb-3 text-gray-900">{{ 'footer_follow_us_title'|trans }}</h3>
|
|
<div class="flex space-x-4">
|
|
<a href="https://www.facebook.com/assocationecosplay" target="_blank" rel="noopener noreferrer"
|
|
class="text-gray-700 hover:text-red-600 transition duration-150 ease-in-out"
|
|
aria-label="Facebook">
|
|
<svg class="h-6 w-6 fill-current" viewBox="0 0 24 24" fill="none"
|
|
xmlns="http://www.w3.org/2000/svg">
|
|
<path
|
|
d="M14.07 3.59h2.36v3.2h-2.36c-1.2 0-1.42.57-1.42 1.4v2.02h3.76l-.6 3.96h-3.16v9.81H8.56v-9.81H5.43v-3.96h3.13V7.12c0-3.1 1.84-4.78 4.7-4.78z"/>
|
|
</svg>
|
|
</a>
|
|
<a href="https://www.instagram.com/asso_ecosplay/" target="_blank" rel="noopener noreferrer"
|
|
class="text-gray-700 hover:text-red-600 transition duration-150 ease-in-out"
|
|
aria-label="Instagram">
|
|
<svg class="h-6 w-6 fill-current" viewBox="0 0 24 24" fill="none"
|
|
xmlns="http://www.w3.org/2000/svg">
|
|
<path
|
|
d="M7.8 2h8.4C18.15 2 20 3.85 20 6.2v8.4c0 2.35-1.85 4.2-4.2 4.2H7.8C5.45 18.8 3.6 16.95 3.6 14.6V6.2C3.6 3.85 5.45 2 7.8 2zm8.4 1.8H7.8C6.44 3.8 5.4 4.84 5.4 6.2v8.4c0 1.36 1.04 2.4 2.4 2.4h8.4c1.36 0 2.4-1.04 2.4-2.4V6.2c0-1.36-1.04-2.4-2.4-2.4z"/>
|
|
<path
|
|
d="M12 7.6c-2.43 0-4.4 1.97-4.4 4.4s1.97 4.4 4.4 4.4 4.4-1.97 4.4-4.4-1.97-4.4-4.4-4.4zm0 6.6c-1.21 0-2.2-0.99-2.2-2.2s0.99-2.2 2.2-2.2 2.2 0.99 2.2 2.2-0.99 2.2-2.2 2.2z"/>
|
|
<circle cx="16.4" cy="7.2" r="0.8"/>
|
|
</svg>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
|
|
{# 3. Bloc Personnalisable (E-Cosplay mission) #}
|
|
<div>
|
|
<h3 class="text-lg font-semibold mb-3 text-gray-900">E-Cosplay</h3>
|
|
{{ 'footer_mission_description'|trans|raw }}
|
|
<div class="trustpilot-widget" data-locale="fr-FR" data-template-id="56278e9abfbbba0bdcd568bc"
|
|
data-businessunit-id="687e8cb6a48c5eab447ca0f8" data-style-height="52px"
|
|
data-style-width="100%" data-token="797aa44d-2b0e-46f8-bfe9-fe0a75cbe557">
|
|
<a href="https://fr.trustpilot.com/review/e-cosplay.fr" target="_blank" rel="noopener">Trustpilot</a>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
{% endblock %}
|
|
|
|
{# LIGNE DE COPYRIGHT ET MENTIONS LÉGALES (Bas du footer) #}
|
|
<div class="md:flex md:justify-between md:items-center">
|
|
|
|
{# Copyright et Mention Légale Association #}
|
|
<div class="text-center md:text-left mb-4 md:mb-0">
|
|
<p class="text-sm text-gray-700">
|
|
© {{ "now"|date("Y") }} E-Cosplay. {{ 'all_rights_reserved'|trans }}.
|
|
</p>
|
|
<p class="text-xs text-gray-600 mt-1">
|
|
{{ 'association_status'|trans }} - RNA N°W022006988
|
|
</p>
|
|
</div>
|
|
|
|
{# Liens Légaux #}
|
|
<div class="flex flex-wrap justify-center md:justify-end space-x-4 text-sm font-medium">
|
|
<a href="{{ path('app_legal') }}"
|
|
class="text-gray-800 hover:text-red-600 transition duration-150 ease-in-out">{{ 'legal_notice_link'|trans }}</a>
|
|
<a href="{{ path('app_cookies') }}"
|
|
class="text-gray-800 hover:text-red-600 transition duration-150 ease-in-out">{{ 'cookie_policy_link'|trans }}</a>
|
|
<a href="{{ path('app_hosting') }}"
|
|
class="text-gray-800 hover:text-red-600 transition duration-150 ease-in-out">{{ 'hosting_link'|trans }}</a>
|
|
<a href="{{ path('app_rgpd') }}"
|
|
class="text-gray-800 hover:text-red-600 transition duration-150 ease-in-out">{{ 'rgpd_policy_link'|trans }}</a>
|
|
<a href="{{ path('app_cgu') }}"
|
|
class="text-gray-800 hover:text-red-600 transition duration-150 ease-in-out">{{ 'cgu_link'|trans }}</a>
|
|
<a href="{{ path('app_cgv') }}"
|
|
class="text-gray-800 hover:text-red-600 transition duration-150 ease-in-out">{{ 'cgv_link'|trans }}</a>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
</footer>
|
|
|
|
|
|
</body>
|
|
</html>
|