[feat](src/Service/Pdf/Candidat.php): Améliore fiche d'adhésion avec infos communauté & associatif (en)

 feat(src/EventSubscriber/LocaleListener.php): Ajoute langues GER & ES (en)
 feat(src/EventSubscriber/SitemapSubscriber.php): Ajoute lien vers les règles (en)
 feat(templates/mails/candidat/refused.twig): Ajoute mail de refus (en)
 feat(translations/messages.ger.yaml): Ajoute traduction Allemande (en)
 feat(templates/txt-mails/candidat/refused.twig): Ajoute mail refus TXT (en)
 feat(src/Controller/LegalController.php): Ajoute la page des règles (en)
 feat(src/Dto/Join/JoinType.php): Ajoute champs civilité & communauté (en)
 feat(translations/messages.en.yaml): Ajoute traductions pour les règles (en)
 feat(translations/messages.es.yaml): Ajoute traductions Espagnoles (en)
 feat(templates/admin/joint.twig): Ajoute page de gestion des candidatures (en)
 feat(src/Dto/Contact/ContactType.php): Supprime captcha contact (en)
 feat(templates/admin/join_edit.twig): Ajoute page d'edition candidature (en)
 feat(templates/mails/candidat/new.twig): Améliore mail de notification (en)
 feat(templates/txt-mails/candidat/new.twig): Améliore mail de notification TXT (en)
 feat(templates/base.twig): Ajoute lien vers page des règles (en)
 feat(src/Controller/Admin/AdminController.php): Ajoute la gestion des candidatures (en)
 feat(templates/legal/rules.twig): Ajoute la page des règles (en)
```
This commit is contained in:
Serreau Jovann
2025-12-25 19:19:07 +01:00
parent 9b5718992d
commit 363b3f77a9
30 changed files with 4142 additions and 560 deletions

View File

@@ -83,7 +83,7 @@ vich_uploader:
delete_on_update: true delete_on_update: true
delete_on_remove: true delete_on_remove: true
fiche: fiche:
uri_prefix: /fiche_candidat uri_prefix: /storage/fiche_candidat
upload_destination: '%kernel.project_dir%/public/storage/fiche_candidat' upload_destination: '%kernel.project_dir%/public/storage/fiche_candidat'
namer: Vich\UploaderBundle\Naming\UniqidNamer # Replaced namer namer: Vich\UploaderBundle\Naming\UniqidNamer # Replaced namer
inject_on_load: true inject_on_load: true

View File

@@ -16,6 +16,7 @@ use App\Entity\Ag\MainSigned;
use App\Entity\Ag\MainVote; use App\Entity\Ag\MainVote;
use App\Entity\Event; use App\Entity\Event;
use App\Entity\InviteEPage; use App\Entity\InviteEPage;
use App\Entity\Join;
use App\Entity\Members; use App\Entity\Members;
use App\Entity\MembersCotisations; use App\Entity\MembersCotisations;
use App\Entity\Products; use App\Entity\Products;
@@ -71,9 +72,68 @@ class AdminController extends AbstractController
{ {
return $this->render('admin/dashboard.twig', [ return $this->render('admin/dashboard.twig', [
'memberCount' => $membersRepository->count(), 'memberCount' => $membersRepository->count(),
'joins' => $joinRepository->count(['state'=>'create'])+$joinRepository->count(['state'=>'waiting']), 'joins' => $joinRepository->count(['state'=>'create']),
]); ]);
} }
#[Route(path: '/admin/join', name: 'admin_join', options: ['sitemap' => false], methods: ['GET'])]
public function adminJoin(JoinRepository $joinRepository): Response
{
return $this->render('admin/joint.twig', [
'joins' => $joinRepository->findBy(['state'=>'create']),
]);
}
#[Route(path: '/admin/join/{id}', name: 'admin_join_edit', options: ['sitemap' => false], methods: ['GET'])]
public function adminJoinEdit(?Join $join): Response
{
if(!$join instanceof Join){
return $this->redirectToRoute('admin_join');
}
return $this->render('admin/join_edit.twig', [
'join' => $join,
]);
}
#[Route(path: '/admin/join/{id}/accept', name: 'admin_join_accept', options: ['sitemap' => false], methods: ['POST'])]
public function adminJoinAccepted(?Join $join,PaymentClient $paymentClient,EntityManagerInterface $entityManager): Response
{
$join->setState('accepted');
$entityManager->persist($join);
dd($join);
$m = new Members();
$m->setPseudo($join->getName());
$m->setName($join->getName());
$m->setSurname($join->getSurname());
$m->setEmail($join->getEmail());
$m->setUpdateAt(new \DateTimeImmutable());
$m->setCiv('Mme');
$m->setRole('Membre');
$m->setJoinedAt(new \DateTimeImmutable());
$m->setCrosscosplayer(false);
$m->setCosplayer(in_array('cosplay',$join->getRole()));
$entityManager->persist($m);
$entityManager->flush();
}
#[Route(path: '/admin/join/{id}/reject', name: 'admin_join_reject', options: ['sitemap' => false], methods: ['GET','POST'])]
public function adminJoinReject(?Join $join,EntityManagerInterface $entityManager,Request $request,Mailer $mailer): Response
{
$reason = $request->request->get('reason');
$join->setState("reject");
$entityManager->persist($join);
$entityManager->flush();
$mailer->send(
$join->getEmail(),
$join->getName()." ".$join->getSurname(),
'[E-Cosplay] - Candidature refusée',
'mails/candidat/refused.twig',
['join'=>$join,'reason'=>$reason]
);
return $this->redirectToRoute('admin_join');
}
#[Route(path: '/admin/products', name: 'admin_products', options: ['sitemap' => false], methods: ['GET'])] #[Route(path: '/admin/products', name: 'admin_products', options: ['sitemap' => false], methods: ['GET'])]
public function adminProducts(Request $request,EntityManagerInterface $entityManager,ProductsRepository $productsRepository): Response public function adminProducts(Request $request,EntityManagerInterface $entityManager,ProductsRepository $productsRepository): Response
{ {

View File

@@ -37,6 +37,13 @@ class LegalController extends AbstractController
{ {
return $this->render('legal/hosting.twig'); return $this->render('legal/hosting.twig');
} }
#[Route(path: '/rules', name: 'app_rules', options: ['sitemap' => false], methods: ['GET'],priority: 5)]
public function rules(): Response
{
return $this->render('legal/rules.twig');
}
#[Route(path: '/rgpd', name: 'app_rgpd', options: ['sitemap' => false], methods: ['GET'],priority: 5)] #[Route(path: '/rgpd', name: 'app_rgpd', options: ['sitemap' => false], methods: ['GET'],priority: 5)]
public function rgpd(): Response public function rgpd(): Response
{ {

View File

@@ -2,6 +2,7 @@
namespace App\Dto\Contact; namespace App\Dto\Contact;
use PixelOpen\CloudflareTurnstileBundle\Type\TurnstileType;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\EmailType; use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType; use Symfony\Component\Form\Extension\Core\Type\TextareaType;

View File

@@ -21,6 +21,35 @@ class JoinType extends AbstractType
public function buildForm(FormBuilderInterface $builder, array $options) public function buildForm(FormBuilderInterface $builder, array $options)
{ {
$builder $builder
->add('pseudo',TextType::class,[
'label' => 'form.label.pseudo',
'required' => true,
])
->add('civ',ChoiceType::class,[
'label' => 'form.label.civ',
'required' => true,
'choices' => [
'M' => 'M',
'Mme' => 'Mme',
'Autre' => 'Autre'
]
])
->add('trans',ChoiceType::class,[
'label' => 'form.label.trans',
'required' => true,
'choices' => [
'Non' => false,
'Oui' => true,
]
])
->add('crossCosplay',ChoiceType::class,[
'label' => 'form.label.crossCosplay',
'required' => true,
'choices' => [
'Non' => false,
'Oui' => true,
]
])
->add('name', TextType::class, [ ->add('name', TextType::class, [
'label' => 'form.label.name', 'label' => 'form.label.name',
'required' => true, 'required' => true,
@@ -118,7 +147,6 @@ class JoinType extends AbstractType
'label' => 'form.label.who', 'label' => 'form.label.who',
'required' => true, 'required' => true,
]) ])
->add('security', TurnstileType::class, ['attr' => ['data-action' => 'contact', 'data-theme' => 'dark'], 'label' => false])
; ;
} }

View File

@@ -93,6 +93,18 @@ class Join
#[ORM\Column(nullable: true)] #[ORM\Column(nullable: true)]
private ?\DateTimeImmutable $updateAt; private ?\DateTimeImmutable $updateAt;
#[ORM\Column(length: 255, nullable: true)]
private ?string $civ = null;
#[ORM\Column(nullable: true)]
private ?bool $crossCosplay = null;
#[ORM\Column(nullable: true)]
private ?bool $trans = null;
#[ORM\Column(length: 255, nullable: true)]
private ?string $pseudo = null;
/** /**
* @return \DateTimeImmutable|null * @return \DateTimeImmutable|null
@@ -459,4 +471,52 @@ class Join
return $this; return $this;
} }
public function getCiv(): ?string
{
return $this->civ;
}
public function setCiv(?string $civ): static
{
$this->civ = $civ;
return $this;
}
public function isCrossCosplay(): ?bool
{
return $this->crossCosplay;
}
public function setCrossCosplay(?bool $crossCosplay): static
{
$this->crossCosplay = $crossCosplay;
return $this;
}
public function isTrans(): ?bool
{
return $this->trans;
}
public function setTrans(?bool $trans): static
{
$this->trans = $trans;
return $this;
}
public function getPseudo(): ?string
{
return $this->pseudo;
}
public function setPseudo(?string $pseudo): static
{
$this->pseudo = $pseudo;
return $this;
}
} }

View File

@@ -9,7 +9,7 @@ use Symfony\Component\HttpKernel\KernelEvents;
class LocaleListener implements EventSubscriberInterface class LocaleListener implements EventSubscriberInterface
{ {
private $defaultLocale; private $defaultLocale;
private $allowedLocales = ['fr', 'en','cn']; // Locales autorisées private $allowedLocales = ['fr', 'en','cn','ger','es']; // Locales autorisées
/** /**
* @param string $defaultLocale La locale par défaut (configurée dans services.yaml) * @param string $defaultLocale La locale par défaut (configurée dans services.yaml)

View File

@@ -25,7 +25,7 @@ class SitemapSubscriber
$urlContainer = $event->getUrlContainer(); $urlContainer = $event->getUrlContainer();
$urlGenerator = $event->getUrlGenerator(); $urlGenerator = $event->getUrlGenerator();
$langs = ["fr","en","cn"]; $langs = ["fr","en","cn","ger","es"];
$urlHome = new UrlConcrete($urlGenerator->generate('app_about', [], UrlGeneratorInterface::ABSOLUTE_URL)); $urlHome = new UrlConcrete($urlGenerator->generate('app_about', [], UrlGeneratorInterface::ABSOLUTE_URL));
$decoratedUrlHome = new GoogleImageUrlDecorator($urlHome); $decoratedUrlHome = new GoogleImageUrlDecorator($urlHome);
@@ -167,7 +167,14 @@ class SitemapSubscriber
} }
$urlContainer->addUrl($decoratedUrlAbout, 'products'); $urlContainer->addUrl($decoratedUrlAbout, 'products');
} }
$urlMembers = new UrlConcrete($urlGenerator->generate('app_rules', [], UrlGeneratorInterface::ABSOLUTE_URL));
$decoratedUrlMembers = new GoogleImageUrlDecorator($urlMembers);
$decoratedUrlMembers->addImage(new GoogleImage($this->cacheManager->resolve('assets/images/logo.jpg','webp')));
$decoratedUrlMembers = new GoogleMultilangUrlDecorator($decoratedUrlMembers);
foreach ($langs as $lang) {
$decoratedUrlMembers->addLink($urlGenerator->generate('app_ruless',['lang'=>$lang], UrlGeneratorInterface::ABSOLUTE_URL), $lang);
}
$urlContainer->addUrl($decoratedUrlMembers, 'default');
$cites =[ $cites =[
"Tergnier", "Tergnier",
"Beautor", "Beautor",

View File

@@ -39,10 +39,10 @@ class Candidat extends Fpdf
$this->SetFont('Arial', 'B', 16); $this->SetFont('Arial', 'B', 16);
$this->SetTextColor(0, 0, 0); $this->SetTextColor(0, 0, 0);
$this->Cell(0, 7, utf8_decode("FICHE CANDIDAT"), 0, 1, 'C'); $this->Cell(0, 7, utf8_decode("FICHE CANDIDATURE E-COSPLAY"), 0, 1, 'C');
$this->SetFont('Arial', '', 10); $this->SetFont('Arial', '', 10);
$this->Cell(0, 6, utf8_decode("Générée le " . $agDate), 0, 1, 'C'); $this->Cell(0, 6, utf8_decode("Soumise le " . $agDate), 0, 1, 'C');
$logoPath = $this->kernel->getProjectDir() . '/public/assets/images/logo.jpg'; $logoPath = $this->kernel->getProjectDir() . '/public/assets/images/logo.jpg';
if (file_exists($logoPath)) { if (file_exists($logoPath)) {
@@ -63,7 +63,7 @@ class Candidat extends Fpdf
$this->SetFont('Arial', 'B', 9); $this->SetFont('Arial', 'B', 9);
$this->Cell(0, 1, '', 'T', 1, 'L'); $this->Cell(0, 1, '', 'T', 1, 'L');
$this->Ln(2); $this->Ln(2);
$this->Cell(0, 5, utf8_decode('INFORMATIONS LÉGALES'), 0, 1, 'C'); $this->Cell(0, 5, utf8_decode('CADRE ASSOCIATIF'), 0, 1, 'C');
$this->SetFont('Arial', '', 9); $this->SetFont('Arial', '', 9);
$this->Cell(35, 4, utf8_decode('Association :'), 0, 0); $this->Cell(35, 4, utf8_decode('Association :'), 0, 0);
$this->SetFont('Arial', 'B', 9); $this->SetFont('Arial', 'B', 9);
@@ -78,10 +78,19 @@ class Candidat extends Fpdf
public function contentDetails() public function contentDetails()
{ {
// --- SECTION 1 : ÉTAT CIVIL --- // --- SECTION 1 : IDENTITÉ COSPLAY ---
$this->drawSectionTitle('IDENTITÉ DU CANDIDAT'); $this->drawSectionTitle('IDENTITÉ DU CANDIDAT');
$this->infoRow('Nom / Prénom :', strtoupper($this->join->getSurname()) . ' ' . $this->join->getName(), true); // Affichage Civil + Nom/Prénom
$fullname = sprintf("[%s] %s %s",
strtoupper($this->join->getCiv() ?? 'N/C'),
strtoupper($this->join->getSurname()),
$this->join->getName()
);
$this->infoRow('Identité civile :', $fullname, true);
// Affichage Pseudo (Important pour l'asso)
$this->infoRow('Pseudo / Scène :', $this->join->getPseudo() ?? 'Non renseigné', true);
// --- CALCUL ET AFFICHAGE DE L'ÂGE --- // --- CALCUL ET AFFICHAGE DE L'ÂGE ---
$birthDate = $this->join->getDateBirth(); $birthDate = $this->join->getDateBirth();
@@ -91,29 +100,31 @@ class Candidat extends Fpdf
if ($birthDate) { if ($birthDate) {
$age = $this->calculateAge($birthDate); $age = $this->calculateAge($birthDate);
$dateStr = $birthDate->format('d/m/Y'); $dateStr = $birthDate->format('d/m/Y');
// Texte de la date
$this->SetFont('Arial', 'B', 10); $this->SetFont('Arial', 'B', 10);
$this->Cell(30, 7, $dateStr, 0, 0); $this->Cell(30, 7, $dateStr, 0, 0);
// Affichage de l'âge avec couleur if ($age >= 16) { $this->SetTextColor(0, 120, 0); }
if ($age >= 16) { else { $this->SetTextColor(200, 0, 0); }
$this->SetTextColor(0, 150, 0); // Vert
} else {
$this->SetTextColor(200, 0, 0); // Rouge
}
$this->Cell(0, 7, utf8_decode(" (" . $age . " ans)"), 0, 1); $this->Cell(0, 7, utf8_decode(" (" . $age . " ans)"), 0, 1);
$this->SetTextColor(0, 0, 0); // Reset noir $this->SetTextColor(0, 0, 0);
} else { } else {
$this->Cell(0, 7, 'N/C', 0, 1); $this->Cell(0, 7, 'N/C', 0, 1);
} }
$genreInfo = sprintf("Sexe : %s | Pronom : %s", $genreInfo = sprintf("Sexe/Orient. : %s | Pronom : %s",
$this->join->getSexe() ?? 'N/C', $this->join->getSexe() ?? 'N/C',
$this->join->getPronom() ?? 'N/C' $this->join->getPronom() ?? 'N/C'
); );
$this->infoRow('Genre :', $genreInfo); $this->infoRow('Inclusion :', $genreInfo);
// Nouveaux champs Trans & Cross
$commuInfo = sprintf("Cross-Cosplay : %s | Transidentité : %s",
strtoupper($this->join->getCrossCosplay() ?? 'N/C'),
strtoupper($this->join->getTrans() ?? 'N/C')
);
$this->infoRow('Communauté :', $commuInfo);
$this->Ln(3); $this->Ln(3);
// --- SECTION 2 : CONTACT --- // --- SECTION 2 : CONTACT ---
@@ -131,13 +142,13 @@ class Candidat extends Fpdf
$this->Ln(2); $this->Ln(2);
$this->SetFont('Arial', 'B', 10); $this->SetFont('Arial', 'B', 10);
$this->Cell(0, 6, utf8_decode("Présentation / Qui est-ce ?"), 0, 1); $this->Cell(0, 6, utf8_decode("Présentation du candidat :"), 0, 1);
$this->SetFont('Arial', '', 10); $this->SetFont('Arial', '', 10);
$this->MultiCell(0, 5, utf8_decode($this->join->getWho() ?? "Aucune description fournie."), 1, 'L'); $this->MultiCell(0, 5, utf8_decode($this->join->getWho() ?? "Aucune description fournie."), 1, 'L');
$this->Ln(5); $this->Ln(5);
// --- SECTION 4 : RÉSEAUX SOCIAUX --- // --- SECTION 4 : RÉSEAUX SOCIAUX ---
$this->drawSectionTitle('RÉSEAUX SOCIAUX'); $this->drawSectionTitle('PRÉSENCE NUMÉRIQUE');
$this->infoRow('Discord :', $this->join->getDiscordAccount() ?? 'Non renseigné'); $this->infoRow('Discord :', $this->join->getDiscordAccount() ?? 'Non renseigné');
$this->infoRow('Instagram :', $this->join->getInstaLink() ?? 'N/A'); $this->infoRow('Instagram :', $this->join->getInstaLink() ?? 'N/A');
$this->infoRow('TikTok :', $this->join->getTiktokLink() ?? 'N/A'); $this->infoRow('TikTok :', $this->join->getTiktokLink() ?? 'N/A');
@@ -160,9 +171,11 @@ class Candidat extends Fpdf
private function drawSectionTitle($title) private function drawSectionTitle($title)
{ {
$this->SetFillColor(240, 240, 240); // Couleur rappelant votre charte (Gris très clair pour le fond)
$this->SetFillColor(245, 245, 245);
$this->SetDrawColor(0, 0, 0);
$this->SetFont('Arial', 'B', 11); $this->SetFont('Arial', 'B', 11);
$this->Cell(0, 8, utf8_decode(' ' . $title), 0, 1, 'L', true); $this->Cell(0, 8, utf8_decode(' ' . $title), 'L', 1, 'L', true);
$this->Ln(2); $this->Ln(2);
} }
@@ -171,6 +184,6 @@ class Candidat extends Fpdf
$this->SetY(-15); $this->SetY(-15);
$this->SetFont('Arial', 'I', 8); $this->SetFont('Arial', 'I', 8);
$this->SetTextColor(128, 128, 128); $this->SetTextColor(128, 128, 128);
$this->Cell(0, 10, 'Fiche Candidat E-Cosplay - Page ' . $this->PageNo() . '/{nb}', 0, 0, 'C'); $this->Cell(0, 10, 'Fiche Adhesion E-Cosplay - Document Interne - Page ' . $this->PageNo() . '/{nb}', 0, 0, 'C');
} }
} }

View File

@@ -36,7 +36,10 @@ L'overflow-y-auto n'est plus nécessaire ici car c'est le <body> qui gère le sc
<svg class="w-5 h-5 mr-3" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6"></path></svg> <svg class="w-5 h-5 mr-3" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6"></path></svg>
Dashboard Dashboard
</a> </a>
<a href="{{ path('admin_join') }}" class="flex items-center py-2 px-6 text-gray-400 hover:bg-gray-700 hover:text-white transition duration-200 mt-1 rounded-r-lg">
<svg class="w-5 h-5 mr-3" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20h5v-2a3 3 0 00-5.356-1.857M17 20h5v-2a3 3 0 00-5.356-1.857M9 20H4v-2a3 3 0 015-2.236M9 20v-2a3 3 0 00-5-2.236M9 20h5m-5 0h5M12 4a4 4 0 100 8 4 4 0 000-8z"></path></svg>
Candidatures
</a>
<!-- Membres (Utilisateurs) --> <!-- Membres (Utilisateurs) -->
<a href="{{ path('admin_members') }}" class="flex items-center py-2 px-6 text-gray-400 hover:bg-gray-700 hover:text-white transition duration-200 mt-1 rounded-r-lg"> <a href="{{ path('admin_members') }}" class="flex items-center py-2 px-6 text-gray-400 hover:bg-gray-700 hover:text-white transition duration-200 mt-1 rounded-r-lg">
<svg class="w-5 h-5 mr-3" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20h5v-2a3 3 0 00-5.356-1.857M17 20h5v-2a3 3 0 00-5.356-1.857M9 20H4v-2a3 3 0 015-2.236M9 20v-2a3 3 0 00-5-2.236M9 20h5m-5 0h5M12 4a4 4 0 100 8 4 4 0 000-8z"></path></svg> <svg class="w-5 h-5 mr-3" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20h5v-2a3 3 0 00-5.356-1.857M17 20h5v-2a3 3 0 00-5.356-1.857M9 20H4v-2a3 3 0 015-2.236M9 20v-2a3 3 0 00-5-2.236M9 20h5m-5 0h5M12 4a4 4 0 100 8 4 4 0 000-8z"></path></svg>

View File

@@ -0,0 +1,159 @@
{% extends 'admin/base.twig' %}
{% block title %}
Candidature - {{ join.surname|upper }} {{ join.name }}
{% endblock %}
{% block page_title %}
<span class="text-slate-100">Détails de la candidature</span>
{% endblock %}
{% block body %}
<div class="min-h-screen bg-slate-950 p-4 md:p-8 text-slate-200">
{# --- HEADER --- #}
<div class="flex flex-col md:flex-row md:items-center justify-between mb-8 gap-6">
<div>
<h2 class="text-3xl font-extrabold text-white tracking-tight">
{{ join.surname|upper }} {{ join.name }}
</h2>
<div class="flex items-center gap-4 mt-2">
<p class="text-cyan-400 text-sm flex items-center font-medium">
<i class="fas fa-calendar-alt mr-2"></i>
Reçu le {{ join.createAt|date('d/m/Y à H:i') }}
</p>
{% set age = date().diff(date(join.dateBirth)).y %}
<span class="inline-flex items-center px-3 py-0.5 rounded-full text-xs font-bold {{ age >= 16 ? 'bg-emerald-500/10 text-emerald-500 border border-emerald-500/20' : 'bg-rose-500/10 text-rose-500 border border-rose-500/20' }}">
{{ age }} ans
</span>
</div>
</div>
<div class="flex gap-3">
<a href="{{ path('admin_join') }}" class="inline-flex items-center px-4 py-2 bg-slate-800 hover:bg-slate-700 text-white text-sm font-medium rounded-lg transition-all border border-slate-700">
<i class="fas fa-arrow-left mr-2"></i> Retour
</a>
<a href="{{ vich_uploader_asset(join,'fiche') }}" class="inline-flex items-center px-4 py-2 bg-rose-600 hover:bg-rose-700 text-white text-sm font-medium rounded-lg transition-all shadow-lg shadow-rose-900/30" target="_blank">
<i class="fas fa-file-pdf mr-2"></i> PDF
</a>
</div>
</div>
<div class="grid grid-cols-1 lg:grid-cols-12 gap-8">
{# --- COLONNE GAUCHE --- #}
<div class="lg:col-span-5 space-y-8">
<div class="bg-slate-900 border border-slate-800 rounded-2xl overflow-hidden shadow-2xl">
<div class="bg-slate-800/40 px-6 py-4 border-b border-slate-800">
<h3 class="text-cyan-400 font-bold uppercase tracking-widest text-xs">Identité & Contact</h3>
</div>
<div class="p-6">
<dl class="divide-y divide-slate-800">
<div class="flex justify-between py-3">
<dt class="text-slate-400">Naissance</dt>
<dd class="text-white">{{ join.dateBirth|date('d/m/Y') }}</dd>
</div>
<div class="flex justify-between py-3">
<dt class="text-slate-400">Genre</dt>
<dd>{{ join.sexe|default('N/C') }} <span class="text-cyan-500 ml-1">({{ join.pronom|default('N/C') }})</span></dd>
</div>
<div class="flex justify-between py-3">
<dt class="text-slate-400">Email</dt>
<dd><a href="mailto:{{ join.email }}" class="text-cyan-400 hover:underline">{{ join.email }}</a></dd>
</div>
<div class="flex justify-between py-3">
<dt class="text-slate-400">Téléphone</dt>
<dd class="font-mono text-white">{{ join.phone }}</dd>
</div>
<div class="flex flex-col py-3">
<dt class="text-slate-400 mb-1">Localisation</dt>
<dd class="text-white">
{{ join.address }}<br>
<span class="text-cyan-400 font-bold">{{ join.zipCode }} {{ join.city|upper }}</span>
</dd>
</div>
</dl>
</div>
</div>
<div class="bg-slate-900 border border-slate-800 rounded-2xl overflow-hidden shadow-2xl">
<div class="bg-slate-800/40 px-6 py-4 border-b border-slate-800">
<h3 class="text-cyan-400 font-bold uppercase tracking-widest text-xs">Réseaux Sociaux</h3>
</div>
<div class="p-6 grid grid-cols-3 gap-4">
<div class="flex flex-col items-center p-3 rounded-xl bg-slate-800/30 border border-slate-800 text-center">
<i class="fab fa-discord text-xl text-indigo-400 mb-1"></i>
<span class="text-[9px] uppercase text-slate-500 font-bold">Discord</span>
<span class="text-xs text-slate-300 truncate w-full mt-1">{{ join.discordAccount|default('N/A') }}</span>
</div>
<div class="flex flex-col items-center p-3 rounded-xl bg-slate-800/30 border border-slate-800 text-center">
<i class="fab fa-instagram text-xl text-pink-500 mb-1"></i>
<span class="text-[9px] uppercase text-slate-500 font-bold">Insta</span>
{% if join.instaLink %}
<a href="{{ join.instaLink }}" target="_blank" rel="nofollow noreferrer" class="text-xs text-cyan-400 hover:underline mt-1">Lien</a>
{% else %}<span class="text-xs text-slate-600 mt-1">N/A</span>{% endif %}
</div>
<div class="flex flex-col items-center p-3 rounded-xl bg-slate-800/30 border border-slate-800 text-center">
<i class="fab fa-tiktok text-xl text-white mb-1"></i>
<span class="text-[9px] uppercase text-slate-500 font-bold">TikTok</span>
{% if join.tiktokLink %}
<a href="{{ join.tiktokLink }}" target="_blank" rel="nofollow noreferrer" class="text-xs text-cyan-400 hover:underline mt-1">Lien</a>
{% else %}<span class="text-xs text-slate-600 mt-1">N/A</span>{% endif %}
</div>
</div>
</div>
</div>
{# --- COLONNE DROITE --- #}
<div class="lg:col-span-7 space-y-8">
<div class="bg-slate-900 border border-slate-800 rounded-2xl overflow-hidden shadow-2xl">
<div class="bg-slate-800/40 px-6 py-4 border-b border-slate-800 text-cyan-400 font-bold uppercase tracking-widest text-xs">Rôles visés</div>
<div class="p-6 flex flex-wrap gap-2">
{% for r in (join.role is iterable ? join.role : [join.role]) %}
<span class="px-4 py-1.5 bg-cyan-500/10 text-cyan-400 border border-cyan-500/20 rounded-lg font-semibold text-sm">{{ r }}</span>
{% endfor %}
</div>
</div>
<div class="bg-slate-900 border border-slate-800 rounded-2xl overflow-hidden shadow-2xl">
<div class="bg-slate-800/40 px-6 py-4 border-b border-slate-800 text-cyan-400 font-bold uppercase tracking-widest text-xs">Présentation</div>
<div class="p-6">
<p class="bg-slate-950/50 border border-slate-800 p-6 rounded-xl text-slate-300 leading-relaxed whitespace-pre-line italic text-sm">
"{{ join.who|default('Aucune présentation fournie.') }}"
</p>
</div>
</div>
{# --- ZONE DE DÉCISION DIRECTE --- #}
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
{# Bloc Accepter #}
<div class="bg-slate-900/50 border border-emerald-500/20 p-6 rounded-2xl flex flex-col justify-center shadow-lg shadow-emerald-950/10">
<h4 class="text-emerald-500 font-bold mb-4 flex items-center">
<i class="fas fa-user-check mr-2"></i> Valider le profil
</h4>
<form action="{{ path('admin_join_accept', {'id': join.id}) }}" method="POST">
<button type="submit" class="w-full py-4 bg-emerald-600 hover:bg-emerald-500 text-white font-bold rounded-xl transition-all">
Confirmer l'adhésion
</button>
</form>
</div>
{# Bloc Refuser avec Raison #}
<div class="bg-slate-900/50 border border-rose-500/20 p-6 rounded-2xl shadow-lg shadow-rose-950/10">
<h4 class="text-rose-500 font-bold mb-4 flex items-center">
<i class="fas fa-user-times mr-2"></i> Rejeter le profil
</h4>
<form action="{{ path('admin_join_reject', {'id': join.id}) }}" method="POST">
<textarea name="reason" rows="3" required
class="w-full bg-slate-950 border border-slate-700 rounded-xl p-3 text-sm text-slate-200 focus:ring-1 focus:ring-rose-500 outline-none transition-all placeholder-slate-700 mb-3"
placeholder="Raison du refus (obligatoire)..."></textarea>
<button type="submit" class="w-full py-2 bg-rose-600 hover:bg-rose-500 text-white text-sm font-bold rounded-lg transition-colors">
Refuser & Envoyer le mail
</button>
</form>
</div>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,72 @@
{% extends 'admin/base.twig' %}
{% block title 'candidatures(s)' %}
{% block page_title 'Liste des candidatures' %}
{% block body %}
<!-- Conteneur principal: utiliser bg-gray-900 pour l'arrière-plan du corps -->
<div class="bg-gray-900 text-gray-100 min-h-screen p-6">
<div class="flex justify-between items-center mb-6">
<!-- Titre en blanc -->
<h2 class="text-2xl font-semibold text-gray-100">Gestion des candidatures</h2>
</div>
<!-- Tableau des événements -->
<!-- Fond du tableau en gris foncé, ombre conservée -->
<div class="bg-gray-800 shadow-xl overflow-hidden sm:rounded-lg">
{% if joins is empty %}
<!-- Texte vide en gris clair -->
<div class="p-6 text-center text-gray-400">
Aucune candidature trouvé.
</div>
{% else %}
<div class="overflow-x-auto">
<table class="min-w-full divide-y divide-gray-700">
<!-- En-tête du tableau -->
<thead class="bg-gray-700">
<tr>
<!-- Texte de l'en-tête en gris clair/blanc -->
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-300 uppercase tracking-wider">
Nom Prénom
</th>
<th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-300 uppercase tracking-wider hidden sm:table-cell">
Email téléphone
</th>
<th scope="col" class="relative px-6 py-3">
<span class="sr-only">Actions</span>
</th>
</tr>
</thead>
<!-- Corps du tableau -->
<tbody class="bg-gray-800 divide-y divide-gray-700">
{% for join in joins %}
<!-- Ligne au survol en gris légèrement plus clair -->
<tr class="hover:bg-gray-700 transition duration-100">
<!-- Titre en blanc -->
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-100">
{{ join.name }} {{ join.surname }}
</td>
<!-- Texte des cellules en gris clair -->
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-400 hidden sm:table-cell">
{{ join.email }} {{ join.phone }}
</td>
<!-- Actions : lien Modifier en indigo, lien Supprimer en rouge -->
<td class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
<a href="{{ path('admin_join_edit', {id: join.id}) }}" class="text-indigo-400 hover:text-indigo-300 mr-3">
Voir
</a>
<a href="{{ vich_uploader_asset(join,'fiche') }}" download="fiche.pdf">
Télécharger la fiche
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endif %}
</div>
{% endblock %}

View File

@@ -189,7 +189,7 @@
{% set current_route = app.request.attributes.get('_route','app_home') %} {% set current_route = app.request.attributes.get('_route','app_home') %}
{% set current_params = app.request.attributes.get('_route_params',[]) %} {% set current_params = app.request.attributes.get('_route_params',[]) %}
{% set current_query = app.request.query.all %} {% set current_query = app.request.query.all %}
{% for lang in ['fr', 'en','cn'] %} {% for lang in ['fr', 'en','cn','ger','es'] %}
{% set is_active_lang = (app.request.locale == lang) %} {% set is_active_lang = (app.request.locale == lang) %}
{% set lang_url = path(current_route, current_params|merge(current_query)|merge({'lang': lang})) %} {% set lang_url = path(current_route, current_params|merge(current_query)|merge({'lang': lang})) %}
<a href="{{ lang_url }}" class="text-xs font-bold uppercase transition duration-150 {% if is_active_lang %}text-red-600 border-b-2 border-red-600{% else %}text-gray-500 hover:text-red-600{% endif %}"> <a href="{{ lang_url }}" class="text-xs font-bold uppercase transition duration-150 {% if is_active_lang %}text-red-600 border-b-2 border-red-600{% else %}text-gray-500 hover:text-red-600{% endif %}">
@@ -323,6 +323,9 @@
<a href="{{ path('app_legal') }}" class="px-2 hover:text-red-600">{{ 'legal_notice_link'|trans }}</a> <a href="{{ path('app_legal') }}" class="px-2 hover:text-red-600">{{ 'legal_notice_link'|trans }}</a>
<a href="{{ path('app_cookies') }}" class="px-2 hover:text-red-600">{{ 'cookie_policy_link'|trans }}</a> <a href="{{ path('app_cookies') }}" class="px-2 hover:text-red-600">{{ 'cookie_policy_link'|trans }}</a>
<a href="{{ path('app_cgu') }}" class="px-2 hover:text-red-600">{{ 'cgu_link'|trans }}</a> <a href="{{ path('app_cgu') }}" class="px-2 hover:text-red-600">{{ 'cgu_link'|trans }}</a>
<a href="{{ path('app_hosting') }}" class="px-2 hover:text-red-600">{{ 'hosting_link'|trans }}</a>
<a href="{{ path('app_rgpd') }}" class="px-2 hover:text-red-600">{{ 'rgpd_policy_link'|trans }}</a>
<a href="{{ path('app_rules') }}" class="px-2 hover:text-red-600">{{ 'rule_link'|trans }}</a>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -54,7 +54,6 @@
<section class="py-16 bg-gray-50 border-b-4 border-black"> <section class="py-16 bg-gray-50 border-b-4 border-black">
<div class="container mx-auto px-6 max-w-5xl"> <div class="container mx-auto px-6 max-w-5xl">
<h2 class="text-4xl font-black uppercase italic mb-10 tracking-tighter text-center">{{ 'process.title'|trans }}</h2> <h2 class="text-4xl font-black uppercase italic mb-10 tracking-tighter text-center">{{ 'process.title'|trans }}</h2>
<div class="grid md:grid-cols-2 gap-8 items-stretch"> <div class="grid md:grid-cols-2 gap-8 items-stretch">
<div class="bg-white border-4 border-black p-8 shadow-[10px_10px_0px_0px_rgba(26,26,26,1)]"> <div class="bg-white border-4 border-black p-8 shadow-[10px_10px_0px_0px_rgba(26,26,26,1)]">
<div class="text-[#E63946] text-4xl font-black mb-4">{{ 'process.unanimous.percent'|trans }}</div> <div class="text-[#E63946] text-4xl font-black mb-4">{{ 'process.unanimous.percent'|trans }}</div>
@@ -63,7 +62,6 @@
{{ 'process.unanimous.description'|trans|raw }} {{ 'process.unanimous.description'|trans|raw }}
</p> </p>
</div> </div>
<div class="bg-[#1A1A1A] border-4 border-[#FFC107] p-8 text-white shadow-[10px_10px_0px_0px_rgba(255,193,7,1)]"> <div class="bg-[#1A1A1A] border-4 border-[#FFC107] p-8 text-white shadow-[10px_10px_0px_0px_rgba(255,193,7,1)]">
<div class="text-[#FFC107] text-4xl font-black mb-4 text-center">{{ 'process.feedback.icon'|trans }}</div> <div class="text-[#FFC107] text-4xl font-black mb-4 text-center">{{ 'process.feedback.icon'|trans }}</div>
<h3 class="text-xl font-black uppercase mb-4 text-[#FFC107]">{{ 'process.feedback.title'|trans }}</h3> <h3 class="text-xl font-black uppercase mb-4 text-[#FFC107]">{{ 'process.feedback.title'|trans }}</h3>
@@ -105,7 +103,6 @@
<section class="py-20"> <section class="py-20">
<div class="container mx-auto px-6"> <div class="container mx-auto px-6">
<div class="grid lg:grid-cols-2 gap-12"> <div class="grid lg:grid-cols-2 gap-12">
{# Portfolio #}
<div class="flex gap-6 items-start"> <div class="flex gap-6 items-start">
<div class="bg-black text-[#FFC107] p-4 font-black text-2xl border-2 border-black">01</div> <div class="bg-black text-[#FFC107] p-4 font-black text-2xl border-2 border-black">01</div>
<div> <div>
@@ -113,7 +110,6 @@
<p class="text-gray-600 font-bold">{{ 'services.portfolio.description'|trans }}</p> <p class="text-gray-600 font-bold">{{ 'services.portfolio.description'|trans }}</p>
</div> </div>
</div> </div>
{# Handicap #}
<div class="flex gap-6 items-start p-6 bg-gray-100 border-l-8 border-[#E63946]"> <div class="flex gap-6 items-start p-6 bg-gray-100 border-l-8 border-[#E63946]">
<div class="text-5xl">♿</div> <div class="text-5xl">♿</div>
<div> <div>
@@ -141,6 +137,18 @@
{{ form_start(form, {'attr': {'class': 'space-y-8'}}) }} {{ form_start(form, {'attr': {'class': 'space-y-8'}}) }}
{# CIVilité & PSEUDO #}
<div class="grid md:grid-cols-2 gap-6">
<div class="flex flex-col">
{{ form_label(form.civ, 'form.label.civ'|trans, {'label_attr': {'class': 'font-black uppercase text-sm mb-2'}}) }}
{{ form_widget(form.civ, {'attr': {'class': 'border-4 border-black p-3 focus:bg-yellow-50 outline-none transition font-bold'}}) }}
</div>
<div class="flex flex-col">
{{ form_label(form.pseudo, 'form.label.pseudo'|trans, {'label_attr': {'class': 'font-black uppercase text-sm mb-2'}}) }}
{{ form_widget(form.pseudo, {'attr': {'class': 'border-4 border-black p-3 focus:bg-yellow-50 outline-none transition font-bold'}}) }}
</div>
</div>
{# IDENTITÉ #} {# IDENTITÉ #}
<div class="grid md:grid-cols-2 gap-6"> <div class="grid md:grid-cols-2 gap-6">
<div class="flex flex-col"> <div class="flex flex-col">
@@ -153,6 +161,18 @@
</div> </div>
</div> </div>
{# IDENTITÉ (SUITE) #}
<div class="grid md:grid-cols-2 gap-6">
<div class="flex flex-col">
{{ form_label(form.crossCosplay, 'form.label.cross_cosplay'|trans, {'label_attr': {'class': 'font-black uppercase text-sm mb-2'}}) }}
{{ form_widget(form.crossCosplay, {'attr': {'class': 'border-4 border-black p-3 focus:bg-yellow-50 outline-none transition font-bold cursor-pointer'}}) }}
</div>
<div class="flex flex-col">
{{ form_label(form.trans, 'form.label.trans'|trans, {'label_attr': {'class': 'font-black uppercase text-sm mb-2'}}) }}
{{ form_widget(form.trans, {'attr': {'class': 'border-4 border-black p-3 focus:bg-yellow-50 outline-none transition font-bold cursor-pointer'}}) }}
</div>
</div>
{# CONTACT #} {# CONTACT #}
<div class="grid md:grid-cols-2 gap-6"> <div class="grid md:grid-cols-2 gap-6">
<div class="flex flex-col"> <div class="flex flex-col">
@@ -201,22 +221,24 @@
<div class="p-6 bg-gray-100 border-4 border-black border-dashed"> <div class="p-6 bg-gray-100 border-4 border-black border-dashed">
<h3 class="font-black uppercase italic mb-4 text-[#E63946]">{{ 'form.section.social'|trans }}</h3> <h3 class="font-black uppercase italic mb-4 text-[#E63946]">{{ 'form.section.social'|trans }}</h3>
<div class="grid md:grid-cols-2 gap-4"> <div class="grid md:grid-cols-2 gap-4">
{{ form_row(form.discordAccount, {'label': 'form.label.discord'|trans, 'attr': {'class': 'border-2 border-black p-2 w-full'}}) }} {{ form_row(form.discordAccount, {'label': 'form.label.discord'|trans, 'attr': {'class': 'border-2 border-black p-2 w-full font-bold'}}) }}
{{ form_row(form.instaLink, {'label': 'form.label.insta'|trans, 'attr': {'class': 'border-2 border-black p-2 w-full'}}) }} {{ form_row(form.instaLink, {'label': 'form.label.insta'|trans, 'attr': {'class': 'border-2 border-black p-2 w-full font-bold'}}) }}
{{ form_row(form.tiktokLink, {'label': 'form.label.tiktok'|trans, 'attr': {'class': 'border-2 border-black p-2 w-full'}}) }} {{ form_row(form.tiktokLink, {'label': 'form.label.tiktok'|trans, 'attr': {'class': 'border-2 border-black p-2 w-full font-bold'}}) }}
{{ form_row(form.facebookLink, {'label': 'form.label.facebook'|trans, 'attr': {'class': 'border-2 border-black p-2 w-full'}}) }} {{ form_row(form.facebookLink, {'label': 'form.label.facebook'|trans, 'attr': {'class': 'border-2 border-black p-2 w-full font-bold'}}) }}
</div> </div>
</div> </div>
{# RÔLE & MOTIVATION #} {# RÔLE & MOTIVATION #}
<div class="flex flex-col"> <div class="flex flex-col">
{{ form_label(form.who, 'form.label.who'|trans, {'label_attr': {'class': 'font-black uppercase text-sm mb-2'}}) }} {{ form_label(form.who, 'form.label.who'|trans, {'label_attr': {'class': 'font-black uppercase text-sm mb-2'}}) }}
{{ form_widget(form.who, {'attr': {'class': 'border-4 border-black p-3 min-h-[100px]'}}) }} {{ form_widget(form.who, {'attr': {'class': 'border-4 border-black p-3 min-h-[120px]'}}) }}
</div> </div>
<div class="flex flex-col"> <div class="flex flex-col">
{{ form_label(form.role, 'form.label.role'|trans, {'label_attr': {'class': 'font-black uppercase text-sm mb-2'}}) }} {{ form_label(form.role, 'form.label.role'|trans, {'label_attr': {'class': 'font-black uppercase text-sm mb-2'}}) }}
{{ form_widget(form.role, {'attr': {'class': 'border-4 border-black p-3'}}) }} <div class="grid grid-cols-2 md:grid-cols-4 gap-4 mt-2">
{{ form_widget(form.role) }}
</div>
</div> </div>
{# BOUTON ENVOI #} {# BOUTON ENVOI #}

View File

@@ -3,7 +3,8 @@
{% block title %}{{'cgu_page_title'|trans}}{% endblock %} {% block title %}{{'cgu_page_title'|trans}}{% endblock %}
{% block meta_description %}{{'cgu_page_title'|trans}}{% endblock %} {% block meta_description %}{{'cgu_page_title'|trans}}{% endblock %}
{% block canonical_url %}<link rel="canonical" href="{{ url('app_cgu') }}" /> {% block canonical_url %}
<link rel="canonical" href="{{ url('app_cgu') }}" />
{% endblock %} {% endblock %}
{% block breadcrumb_schema %} {% block breadcrumb_schema %}
@@ -17,84 +18,132 @@
"position": 1, "position": 1,
"name": "{{'home_title'|trans }}", "name": "{{'home_title'|trans }}",
"item": "{{ app.request.schemeAndHttpHost }}" "item": "{{ app.request.schemeAndHttpHost }}"
}, },
{ {
"@type": "ListItem", "@type": "ListItem",
"position": 2, "position": 2,
"name": "{{'cgu_short_title'|trans}}", "name": "{{'cgu_short_title'|trans}}",
"item": "{{ app.request.schemeAndHttpHost }}{{ app.request.pathInfo }}" "item": "{{ app.request.schemeAndHttpHost }}{{ app.request.pathInfo }}"
} }
] ]
} }
</script> </script>
{% endblock %} {% endblock %}
{% block body %} {% block body %}
<div class="max-w-4xl mx-auto py-12 px-4 sm:px-6 lg:px-8 bg-white shadow-lg rounded-lg"> <main id="cgu" class="max-w-6xl mx-auto px-4 py-12 font-sans text-gray-800 bg-[#fbfbfb]">
<h1 class="text-3xl font-extrabold text-gray-900 border-b-2 border-red-600 pb-4 mb-8">{{'cgu_page_title'|trans}}</h1>
<p class="text-sm text-red-600 mb-6 italic">{{'cgu_intro_disclaimer'|trans}}</p> {# Header Dynamique Style Esport #}
<header class="mb-20 relative py-10">
<div class="relative z-10">
<h1 class="text-5xl md:text-7xl font-black text-gray-900 tracking-tighter uppercase italic leading-none esrgaa-voice">
{{ 'cgu_page_title'|trans }}
</h1>
<div class="mt-4 flex items-center gap-2">
<div class="h-2 w-24 bg-yellow-500 skew-x-[-20deg]"></div>
<div class="h-2 w-12 bg-gray-900 skew-x-[-20deg]"></div>
</div>
<p class="mt-6 text-xs font-bold text-red-600 uppercase tracking-widest italic bg-red-50 inline-block px-4 py-1 border-l-4 border-red-600">
{{ 'cgu_intro_disclaimer'|trans }}
</p>
</div>
<div class="absolute top-0 right-0 -mr-8 opacity-[0.03] pointer-events-none select-none hidden md:block">
<span class="text-[12rem] font-black italic uppercase tracking-tighter leading-none">TERMS</span>
</div>
</header>
{# SECTION 1 : ACCEPTATION #} <div class="space-y-20">
<section class="mb-8">
<h2 class="text-2xl font-semibold text-gray-800 mb-3">{{'cgu_section1_title'|trans}}</h2>
<p class="text-gray-700">
{{'cgu_section1_p1'|trans({
'%link%': '<a href="' ~ app.request.schemeAndHttpHost ~ '" class="text-red-600 hover:underline">e-cosplay.fr</a>'
})|raw}}
</p>
<p class="text-gray-700 mt-2">{{'cgu_section1_p2'|trans}}</p>
</section>
<hr class="my-8 border-gray-200"> {# 1. ACCEPTATION #}
<section class="relative">
<div class="inline-block bg-[#0f172a] text-yellow-500 px-6 py-3 font-black italic skew-x-[-15deg] mb-6 shadow-xl border-b-2 border-yellow-600">
<span class="skew-x-[15deg] block uppercase tracking-wider text-lg">// {{'cgu_section1_title'|trans}}</span>
</div>
<div class="bg-white border-2 border-gray-900 p-8 rounded-lg shadow-[8px_8px_0px_rgba(0,0,0,1)] italic">
<div class="space-y-4 text-gray-700">
<p class="text-lg font-bold text-gray-900">
{{'cgu_section1_p1'|trans({
'%link%': '<span class="text-indigo-600 underline">e-cosplay.fr</span>'
})|raw}}
</p>
<p class="text-sm leading-relaxed">{{'cgu_section1_p2'|trans}}</p>
</div>
</div>
</section>
{# SECTION 2 : SERVICES PROPOSÉS #} {# 2. SERVICES PROPOSÉS #}
<section class="mb-8"> <section class="relative">
<h2 class="text-2xl font-semibold text-gray-800 mb-3">{{'cgu_section2_title'|trans}}</h2> <div class="inline-block bg-[#0f172a] text-yellow-500 px-6 py-3 font-black italic skew-x-[-15deg] mb-6 shadow-xl border-b-2 border-yellow-600">
<p class="text-gray-700">{{'cgu_section2_p1'|trans}}</p> <span class="skew-x-[15deg] block uppercase tracking-wider text-lg">// {{'cgu_section2_title'|trans}}</span>
</div>
<div class="bg-gray-900 text-white p-8 rounded-lg border-r-8 border-yellow-500 shadow-xl italic">
<p class="mb-6 text-gray-300">{{'cgu_section2_p1'|trans}}</p>
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
<div class="bg-white/5 p-4 border border-white/10 hover:bg-white/10 transition-colors">
<span class="text-yellow-500 font-black block mb-2">01.</span>
<p class="text-xs uppercase font-bold tracking-tight">{{'cgu_section2_list1'|trans}}</p>
</div>
<div class="bg-white/5 p-4 border border-white/10 hover:bg-white/10 transition-colors">
<span class="text-yellow-500 font-black block mb-2">02.</span>
<p class="text-xs uppercase font-bold tracking-tight">{{'cgu_section2_list2'|trans}}</p>
</div>
<div class="bg-white/5 p-4 border border-white/10 hover:bg-white/10 transition-colors">
<span class="text-yellow-500 font-black block mb-2">03.</span>
<p class="text-xs uppercase font-bold tracking-tight">{{'cgu_section2_list3'|trans}}</p>
</div>
</div>
</div>
</section>
<p class="text-gray-700 mt-2">{{'cgu_section2_p2'|trans}}</p> {# 3. ACCÈS ET UTILISATION #}
<ul class="list-disc list-inside ml-4 mt-2 text-gray-700 space-y-1"> <section class="relative">
<li>{{'cgu_section2_list1'|trans}}</li> <div class="inline-block bg-[#0f172a] text-yellow-500 px-6 py-3 font-black italic skew-x-[-15deg] mb-6 shadow-xl border-b-2 border-yellow-600">
<li>{{'cgu_section2_list2'|trans}}</li> <span class="skew-x-[15deg] block uppercase tracking-wider text-lg">// {{'cgu_section3_title'|trans}}</span>
<li>{{'cgu_section2_list3'|trans}}</li> </div>
</ul> <div class="bg-white border-2 border-gray-900 p-8 rounded-lg shadow-[8px_8px_0px_rgba(0,0,0,1)] italic">
</section> <div class="grid grid-cols-1 md:grid-cols-2 gap-10">
<div class="space-y-3">
<h3 class="text-indigo-600 font-black uppercase text-xs tracking-widest border-b-2 border-indigo-50 pb-1">{{'cgu_section3_subtitle1'|trans}}</h3>
<p class="text-sm text-gray-600">{{'cgu_section3_p2'|trans}}</p>
</div>
<div class="space-y-3">
<h3 class="text-indigo-600 font-black uppercase text-xs tracking-widest border-b-2 border-indigo-50 pb-1">{{'cgu_section3_subtitle2'|trans}}</h3>
<p class="text-sm text-gray-600">{{'cgu_section3_p3'|trans}}</p>
</div>
</div>
</div>
</section>
<hr class="my-8 border-gray-200"> {# 4. RESPONSABILITÉ #}
<section class="relative">
<div class="inline-block bg-[#0f172a] text-yellow-500 px-6 py-3 font-black italic skew-x-[-15deg] mb-6 shadow-xl border-b-2 border-yellow-600">
<span class="skew-x-[15deg] block uppercase tracking-wider text-lg">// {{'cgu_section4_title'|trans}}</span>
</div>
<div class="bg-white border-2 border-gray-900 p-8 rounded-lg shadow-[8px_8px_0px_rgba(220,38,38,1)] italic">
<div class="space-y-6">
<div class="flex flex-col md:flex-row gap-6">
<p class="text-sm text-gray-600 flex-1">{{'cgu_section4_p1'|trans}}</p>
<p class="text-sm text-gray-600 flex-1">{{'cgu_section4_p2'|trans}}</p>
</div>
<div class="bg-red-50 p-6 border-l-4 border-red-600">
<h4 class="text-red-600 font-black uppercase text-xs mb-2 tracking-widest">{{'cgu_section4_subtitle1'|trans}}</h4>
<p class="text-sm font-bold text-gray-900">{{'cgu_section4_p3'|trans}}</p>
</div>
</div>
</div>
</section>
{# SECTION 3 : ACCÈS ET UTILISATION #} {# 5. DROIT APPLICABLE #}
<section class="mb-8"> <section class="relative">
<h2 class="text-2xl font-semibold text-gray-800 mb-3">{{'cgu_section3_title'|trans}}</h2> <div class="bg-gray-900 text-white p-10 rounded-lg border-b-8 border-indigo-600 shadow-xl italic text-center">
<p class="text-gray-700">{{'cgu_section3_p1'|trans}}</p> <h2 class="text-indigo-400 font-black uppercase tracking-widest mb-4 italic text-xl">// {{'cgu_section5_title'|trans}}</h2>
<div class="max-w-2xl mx-auto space-y-2">
<p class="text-lg font-black uppercase tracking-tighter">{{'cgu_section5_p1'|trans}}</p>
<p class="text-sm text-gray-400">{{'cgu_section5_p2'|trans}}</p>
</div>
</div>
</section>
<p class="text-gray-700 mt-2 font-semibold">{{'cgu_section3_subtitle1'|trans}}</p> </div>
<p class="text-gray-700">{{'cgu_section3_p2'|trans}}</p> </main>
<p class="text-gray-700 mt-2 font-semibold">{{'cgu_section3_subtitle2'|trans}}</p>
<p class="text-gray-700">{{'cgu_section3_p3'|trans}}</p>
</section>
<hr class="my-8 border-gray-200">
{# SECTION 4 : RESPONSABILITÉ #}
<section class="mb-8">
<h2 class="text-2xl font-semibold text-gray-800 mb-3">{{'cgu_section4_title'|trans}}</h2>
<p class="text-gray-700">{{'cgu_section4_p1'|trans}}</p>
<p class="text-gray-700 mt-2">{{'cgu_section4_p2'|trans}}</p>
<p class="text-gray-700 mt-4 font-bold">{{'cgu_section4_subtitle1'|trans}}</p>
<p class="text-gray-700">{{'cgu_section4_p3'|trans}}</p>
</section>
<hr class="my-8 border-gray-200">
{# SECTION 5 : DROIT APPLICABLE #}
<section>
<h2 class="text-2xl font-semibold text-gray-800 mb-3">{{'cgu_section5_title'|trans}}</h2>
<p class="text-gray-700">{{'cgu_section5_p1'|trans}}</p>
<p class="text-gray-700 mt-2">{{'cgu_section5_p2'|trans}}</p>
</section>
</div>
{% endblock %} {% endblock %}

View File

@@ -3,7 +3,8 @@
{% block title %}{{'cookie_page_title'|trans}}{% endblock %} {% block title %}{{'cookie_page_title'|trans}}{% endblock %}
{% block meta_description %}{{'cookie_page_title'|trans}}{% endblock %} {% block meta_description %}{{'cookie_page_title'|trans}}{% endblock %}
{% block canonical_url %}<link rel="canonical" href="{{ url('app_cookies') }}" /> {% block canonical_url %}
<link rel="canonical" href="{{ url('app_cookies') }}" />
{% endblock %} {% endblock %}
{% block breadcrumb_schema %} {% block breadcrumb_schema %}
@@ -17,71 +18,154 @@
"position": 1, "position": 1,
"name": "{{'home_title'|trans }}", "name": "{{'home_title'|trans }}",
"item": "{{ app.request.schemeAndHttpHost }}" "item": "{{ app.request.schemeAndHttpHost }}"
}, },
{ {
"@type": "ListItem", "@type": "ListItem",
"position": 2, "position": 2,
"name": "{{ 'cookie_short_title'|trans }}", "name": "{{ 'cookie_short_title'|trans }}",
"item": "{{ app.request.schemeAndHttpHost }}{{ app.request.pathInfo }}" "item": "{{ app.request.schemeAndHttpHost }}{{ app.request.pathInfo }}"
} }
] ]
} }
</script> </script>
{% endblock %} {% endblock %}
{% block body %} {% block body %}
<div class="max-w-4xl mx-auto py-12 px-4 sm:px-6 lg:px-8 bg-white shadow-lg rounded-lg"> <main id="cookies" class="max-w-6xl mx-auto px-4 py-12 font-sans text-gray-800 bg-[#fbfbfb]">
<h1 class="text-3xl font-extrabold text-gray-900 border-b-2 border-red-600 pb-4 mb-8">{{'cookie_page_title'|trans}}</h1>
<section class="mb-8"> {# Header Dynamique Style Esport #}
<h2 class="text-2xl font-semibold text-gray-800 mb-3">{{'cookie_section1_title'|trans}}</h2> <header class="mb-20 relative py-10">
<p class="text-gray-700">{{'cookie_section1_p1'|trans}}</p> <div class="relative z-10">
</section> <h1 class="text-5xl md:text-7xl font-black text-gray-900 tracking-tighter uppercase italic leading-none esrgaa-voice">
{{ 'cookie_title'|trans }}
</h1>
<div class="mt-4 flex items-center gap-2">
<div class="h-2 w-24 bg-yellow-500 skew-x-[-20deg]"></div>
<div class="h-2 w-12 bg-gray-900 skew-x-[-20deg]"></div>
</div>
</div>
<div class="absolute top-0 right-0 -mr-8 opacity-[0.03] pointer-events-none select-none hidden md:block">
<span class="text-[12rem] font-black italic uppercase tracking-tighter leading-none">TRACK</span>
</div>
</header>
<hr class="my-8 border-gray-200"> <div class="space-y-24">
<section class="mb-8"> {# SECTION 1 : INTRODUCTION #}
<h2 class="text-2xl font-semibold text-gray-800 mb-3">{{'cookie_section2_title'|trans}}</h2> <section class="relative">
<div class="inline-block bg-[#0f172a] text-yellow-500 px-6 py-3 font-black italic skew-x-[-15deg] mb-6 shadow-xl border-b-2 border-yellow-600">
<span class="skew-x-[15deg] block uppercase tracking-wider text-lg">
// 1. {{ 'cookie_intro_title'|trans }}
</span>
</div>
<div class="bg-white border-2 border-gray-900 p-8 rounded-lg shadow-[8px_8px_0px_rgba(0,0,0,1)]">
<p class="text-sm italic leading-relaxed text-gray-700">
{{ 'cookie_intro_text'|trans }}
</p>
</div>
</section>
<p class="text-gray-700 font-bold mb-2">{{'cookie_section2_p1_commitment'|trans}}</p> {# SECTION 2 : TYPES DE COOKIES #}
<section class="relative">
<div class="inline-block bg-[#0f172a] text-yellow-500 px-6 py-3 font-black italic skew-x-[-15deg] mb-6 shadow-xl border-b-2 border-yellow-600">
<span class="skew-x-[15deg] block uppercase tracking-wider text-lg">
// 2. {{ 'cookie_types_title'|trans }}
</span>
</div>
<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
<div class="bg-white border-2 border-gray-900 p-6 shadow-[4px_4px_0px_rgba(0,0,0,1)] italic">
<h3 class="font-black uppercase text-green-600 mb-2 border-b-2 border-green-100 pb-1">{{ 'cookie_essential_label'|trans }}</h3>
<p class="text-[11px] text-gray-600 leading-relaxed">{{ 'cookie_essential_desc'|trans }}</p>
</div>
<div class="bg-white border-2 border-gray-900 p-6 shadow-[4px_4px_0px_rgba(0,0,0,1)] italic">
<h3 class="font-black uppercase text-blue-600 mb-2 border-b-2 border-blue-100 pb-1">{{ 'cookie_analytics_label'|trans }}</h3>
<p class="text-[11px] text-gray-600 leading-relaxed">{{ 'cookie_analytics_desc'|trans }}</p>
</div>
<div class="bg-white border-2 border-gray-900 p-6 shadow-[4px_4px_0px_rgba(0,0,0,1)] italic">
<h3 class="font-black uppercase text-red-600 mb-2 border-b-2 border-red-100 pb-1">{{ 'cookie_marketing_label'|trans }}</h3>
<p class="text-[11px] text-gray-600 leading-relaxed">{{ 'cookie_marketing_desc'|trans }}</p>
</div>
</div>
</section>
<p class="text-gray-700">{{'cookie_section2_p2_privacy'|trans}}</p> {# SECTION 3 : LISTE TECHNIQUE #}
<section class="relative">
<div class="inline-block bg-[#0f172a] text-yellow-500 px-6 py-3 font-black italic skew-x-[-15deg] mb-6 shadow-xl border-b-2 border-yellow-600">
<span class="skew-x-[15deg] block uppercase tracking-wider text-lg">
// 3. {{ 'cookie_list_title'|trans }}
</span>
</div>
<div class="bg-white border-2 border-gray-900 rounded-lg shadow-[8px_8px_0px_rgba(0,0,0,1)] overflow-hidden italic">
<div class="overflow-x-auto">
<table class="min-w-full divide-y divide-gray-900">
<thead class="bg-gray-100">
<tr>
<th class="px-6 py-4 text-left text-xs font-black uppercase tracking-widest">{{ 'cookie_table_name'|trans }}</th>
<th class="px-6 py-4 text-left text-xs font-black uppercase tracking-widest">{{ 'cookie_table_purpose'|trans }}</th>
<th class="px-6 py-4 text-left text-xs font-black uppercase tracking-widest">{{ 'cookie_table_duration'|trans }}</th>
</tr>
</thead>
<tbody class="divide-y divide-gray-200 text-[11px] font-medium">
<tr class="hover:bg-yellow-50 transition-colors">
<td class="px-6 py-4 font-mono text-indigo-600">__Host-session</td>
<td class="px-6 py-4 text-gray-600">{{ 'cookie_table_session_desc'|trans }}</td>
<td class="px-6 py-4 uppercase font-bold tracking-tighter">Session</td>
</tr>
<tr class="hover:bg-yellow-50 transition-colors bg-gray-50/50">
<td class="px-6 py-4 font-mono text-indigo-600">__cf_bm</td>
<td class="px-6 py-4 text-gray-600">{{ 'cookie_table_cfbm_desc'|trans }}</td>
<td class="px-6 py-4 uppercase font-bold tracking-tighter">30 min</td>
</tr>
</tbody>
</table>
</div>
</div>
</section>
<p class="text-gray-700 mt-4">{{'cookie_section2_p3_type_intro'|trans}}</p> {# SECTION 4 : PARTENAIRES SÉCURITÉ #}
<ul class="list-disc list-inside ml-4 mt-2 text-gray-700 space-y-1"> <section class="relative">
<li> <div class="inline-block bg-[#0f172a] text-yellow-500 px-6 py-3 font-black italic skew-x-[-15deg] mb-6 shadow-xl border-b-2 border-yellow-600">
<strong>{{'cookie_type_functional_strong'|trans}} :</strong> <span class="skew-x-[15deg] block uppercase tracking-wider text-lg">
{{'cookie_type_functional_details'|trans}} // 4. {{ 'cookie_security_title'|trans }}
</li> </span>
</ul> </div>
</section> <div class="bg-gray-900 text-white p-8 rounded-lg border-l-8 border-indigo-500 shadow-xl italic">
<p class="text-sm text-gray-300 mb-6">{{ 'cookie_security_desc'|trans }}</p>
<a href="https://www.cloudflare.com/cookie-policy/" target="_blank" class="inline-flex items-center gap-2 bg-indigo-600 text-white px-6 py-3 font-black uppercase text-xs skew-x-[-10deg] hover:bg-white hover:text-gray-900 transition-all">
<span class="skew-x-[10deg] block tracking-tighter">{{ 'cookie_security_link'|trans }}</span>
</a>
</div>
</section>
<hr class="my-8 border-gray-200"> {# SECTION 5 : MAÎTRISE DU NAVIGATEUR #}
<section class="relative">
<div class="inline-block bg-[#0f172a] text-yellow-500 px-6 py-3 font-black italic skew-x-[-15deg] mb-6 shadow-xl border-b-2 border-yellow-600">
<span class="skew-x-[15deg] block uppercase tracking-wider text-lg">
// 5. {{ 'cookie_control_title'|trans }}
</span>
</div>
<div class="bg-white border-2 border-gray-900 p-8 rounded-lg shadow-[8px_8px_0px_rgba(0,0,0,1)] flex flex-col md:flex-row gap-8 items-center italic">
<div class="flex-1 text-sm text-gray-600">
{{ 'cookie_control_desc'|trans }}
</div>
<a href="https://www.cnil.fr/fr/cookies-les-outils-pour-les-maitriser" target="_blank" class="w-full md:w-auto bg-gray-900 text-yellow-500 px-8 py-4 font-black uppercase text-center skew-x-[-10deg] hover:bg-indigo-600 hover:text-white transition-all">
<span class="skew-x-[10deg] block tracking-tighter">{{ 'cookie_cnil_btn'|trans }}</span>
</a>
</div>
</section>
<section class="mb-8"> {# SECTION 6 : CONSENTEMENT FINAL #}
<h2 class="text-2xl font-semibold text-gray-800 mb-3">{{'cookie_section3_title'|trans}}</h2> <section class="relative">
<p class="text-gray-700">{{'cookie_section3_p1_browser_config'|trans}}</p> <div class="inline-block bg-[#0f172a] text-yellow-500 px-6 py-3 font-black italic skew-x-[-15deg] mb-6 shadow-xl border-b-2 border-yellow-600">
<p class="text-gray-700 mt-2">{{'cookie_section3_p2_refusal_impact'|trans}}</p> <span class="skew-x-[15deg] block uppercase tracking-wider text-lg">
<p class="text-gray-700 mt-4">{{'cookie_section3_p3_instructions_intro'|trans}}</p> // 6. {{ 'cookie_consent_title'|trans }}
<ul class="list-disc list-inside ml-4 mt-2 text-gray-700 space-y-1"> </span>
<li> </div>
{{'cookie_browser_chrome'|trans}} : <div class="bg-yellow-500 border-2 border-gray-900 p-8 rounded-lg shadow-[8px_8px_0px_rgba(0,0,0,1)] italic text-sm font-black text-gray-900 uppercase tracking-tighter">
<a href="https://support.google.com/chrome/answer/95647" target="_blank" class="text-red-600 hover:underline">{{'cookie_browser_link_chrome'|trans}}</a> {{ 'cookie_consent_footer'|trans }}
</li> </div>
<li> </section>
{{'cookie_browser_firefox'|trans}} :
<a href="https://support.mozilla.org/fr/kb/activer-desactiver-cookies" target="_blank" class="text-red-600 hover:underline">{{'cookie_browser_link_firefox'|trans}}</a>
</li>
<li>
{{'cookie_browser_edge'|trans}} :
<a href="https://support.microsoft.com/fr-fr/microsoft-edge/supprimer-les-cookies-dans-microsoft-edge-63947406-40ac-c3b8-57b9-2a946a29ae04" target="_blank" class="text-red-600 hover:underline">{{'cookie_browser_link_edge'|trans}}</a>
</li>
<li>
{{'cookie_browser_safari'|trans}} :
<a href="https://support.apple.com/fr-fr/guide/safari/sfri11471/mac" target="_blank" class="text-red-600 hover:underline">{{'cookie_browser_link_safari'|trans}}</a>
</li>
</ul>
</section>
</div> </div>
</main>
{% endblock %} {% endblock %}

View File

@@ -3,79 +3,149 @@
{% block title %}{{'hosting_page_title'|trans}}{% endblock %} {% block title %}{{'hosting_page_title'|trans}}{% endblock %}
{% block meta_description %}{{'hosting_page_title'|trans}}{% endblock %} {% block meta_description %}{{'hosting_page_title'|trans}}{% endblock %}
{% block canonical_url %}<link rel="canonical" href="{{ url('app_hosting') }}" />
{% endblock %}
{% block breadcrumb_schema %}
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "{{'home_title'|trans }}",
"item": "{{ app.request.schemeAndHttpHost }}"
},
{
"@type": "ListItem",
"position": 2,
"name": "{{'hosting_short_title'|trans}}",
"item": "{{ app.request.schemeAndHttpHost }}{{ app.request.pathInfo }}"
}
]
}
</script>
{% endblock %}
{% block body %} {% block body %}
<div class="max-w-4xl mx-auto py-12 px-4 sm:px-6 lg:px-8 bg-white shadow-lg rounded-lg"> <main id="hosting" class="max-w-6xl mx-auto px-4 py-12 font-sans text-gray-800 bg-[#fbfbfb]">
<h1 class="text-3xl font-extrabold text-gray-900 border-b-2 border-red-600 pb-4 mb-8">{{'hosting_page_title_long'|trans}}</h1>
<section class="mb-8"> {# Header Dynamique Style Esport #}
<h2 class="text-2xl font-semibold text-gray-800 mb-3">{{'hosting_section1_title'|trans}}</h2> <header class="mb-20 relative py-10">
<div class="relative z-10">
<h1 class="text-4xl md:text-6xl font-black text-gray-900 tracking-tighter uppercase italic leading-none esrgaa-voice">
{{ 'hosting_main_title'|trans }}
</h1>
<div class="mt-4 flex items-center gap-2">
<div class="h-2 w-24 bg-yellow-500 skew-x-[-20deg]"></div>
<div class="h-2 w-12 bg-gray-900 skew-x-[-20deg]"></div>
</div>
</div>
</header>
<p class="text-gray-700"> <div class="space-y-24">
{{'hosting_section1_p1'|trans({
'%site_url%': app.request.schemeAndHttpHost
})|raw}}
</p>
<ul class="list-disc list-inside ml-4 mt-4 text-gray-700 space-y-2"> {# SECTION 1 : OPÉRATEUR TECHNIQUE #}
<li><strong>{{'hosting_label_host_name'|trans}} :</strong> Google Cloud Platform</li> <section class="relative">
<li><strong>{{'hosting_label_service_used'|trans}} :</strong> {{'hosting_service_compute_cloud'|trans}}</li> <div class="inline-block bg-[#0f172a] text-yellow-500 px-6 py-3 font-black italic skew-x-[-15deg] mb-6 shadow-xl border-b-2 border-yellow-600">
<li><strong>{{'hosting_label_company'|trans}} :</strong> Google LLC</li> <span class="skew-x-[15deg] block uppercase tracking-wider text-lg">
<li><strong>{{'hosting_label_address'|trans}} :</strong> 1600 Amphitheatre Parkway, Mountain View, CA 94043, États-Unis</li> // 1. {{ 'hosting_tech_operator_title'|trans }}
<li><strong>{{'hosting_label_data_location'|trans}} :</strong> {{'hosting_data_location_details'|trans}}</li> </span>
<li><strong>{{'hosting_label_contact'|trans}} :</strong> {{'hosting_contact_details'|trans}}</li> </div>
</ul> <div class="bg-white border-2 border-gray-900 p-8 rounded-lg shadow-[8px_8px_0px_rgba(0,0,0,1)]">
<p class="text-sm italic text-gray-500 mt-4">{{'hosting_section1_disclaimer'|trans}}</p> <div class="bg-gray-50 p-6 border-l-4 border-gray-900 skew-x-[-2deg]">
</section> <p class="font-black text-xl text-gray-900 uppercase italic">{{ 'hosting_tech_operator_name'|trans }}</p>
<p class="text-sm italic leading-relaxed mt-2 text-gray-600">
{{ 'hosting_tech_operator_address'|trans|raw }}
</p>
<p class="text-[10px] mt-4 font-mono font-bold tracking-widest text-gray-400">
{{ 'hosting_tech_operator_siret'|trans }}
</p>
</div>
</div>
</section>
<hr class="my-8 border-gray-200"> {# SECTION 2 : INFRASTRUCTURE CLOUD #}
<section class="relative">
<div class="inline-block bg-[#0f172a] text-yellow-500 px-6 py-3 font-black italic skew-x-[-15deg] mb-6 shadow-xl border-b-2 border-yellow-600">
<span class="skew-x-[15deg] block uppercase tracking-wider text-lg">
// 2. {{ 'hosting_infrastructure_title'|trans }}
</span>
</div>
<div class="bg-gray-900 text-white p-8 rounded-lg border-r-8 border-yellow-500 shadow-xl overflow-hidden">
<div class="flex flex-col md:flex-row justify-between items-start md:items-center gap-6">
<div>
<p class="text-yellow-500 font-black text-2xl italic uppercase mb-2">{{ 'hosting_cloud_provider'|trans }}</p>
<p class="text-sm italic text-gray-400 leading-relaxed">{{ 'hosting_location_detail'|trans }}</p>
</div>
<div class="flex gap-4">
<span class="text-[10px] bg-white/10 px-3 py-1 font-mono uppercase border border-white/20">Region: eu-west4</span>
<span class="text-[10px] bg-green-500/20 text-green-400 px-3 py-1 font-mono uppercase border border-green-500/30">Tier 3+ Compliance</span>
</div>
</div>
</div>
</section>
<section class="mb-8"> {# SECTION 3 : ÉDITEUR DU SITE #}
<h2 class="text-2xl font-semibold text-gray-800 mb-3">{{'hosting_section2_title'|trans}}</h2> <section class="relative">
<div class="inline-block bg-[#0f172a] text-yellow-500 px-6 py-3 font-black italic skew-x-[-15deg] mb-6 shadow-xl border-b-2 border-yellow-600">
<span class="skew-x-[15deg] block uppercase tracking-wider text-lg">
// 3. {{ 'hosting_editor_title'|trans }}
</span>
</div>
<div class="bg-white border-2 border-gray-900 p-8 rounded-lg shadow-[8px_8px_0px_rgba(0,0,0,1)] grid grid-cols-1 md:grid-cols-2 gap-8">
<div>
<p class="font-black text-gray-900 uppercase text-xl italic mb-4">{{ 'hosting_editor_name'|trans }}</p>
<p class="text-sm italic text-gray-600 leading-relaxed">
{{ 'hosting_editor_address'|trans|raw }}
</p>
<p class="text-xs text-gray-400 mt-4 italic">{{ 'hosting_editor_note'|trans }}</p>
</div>
<div class="flex flex-col justify-center items-start md:items-end">
<a href="mailto:{{ 'hosting_editor_email'|trans }}" class="group bg-yellow-500 text-gray-900 px-8 py-4 font-black italic uppercase hover:bg-gray-900 hover:text-white transition-all skew-x-[-10deg] shadow-[4px_4px_0px_rgba(0,0,0,1)]">
<span class="skew-x-[10deg] block tracking-tighter">{{ 'hosting_editor_email'|trans }}</span>
</a>
</div>
</div>
</section>
<p class="text-gray-700">{{'hosting_section2_p1'|trans}}</p> {# SECTION 4 : STACK TECHNIQUE & SÉCURITÉ #}
<section class="relative">
<div class="inline-block bg-[#0f172a] text-yellow-500 px-6 py-3 font-black italic skew-x-[-15deg] mb-6 shadow-xl border-b-2 border-yellow-600">
<span class="skew-x-[15deg] block uppercase tracking-wider text-lg">
// 4. {{ 'hosting_security_title'|trans }}
</span>
</div>
<div class="bg-white border-2 border-gray-900 p-8 rounded-lg shadow-[8px_8px_0px_rgba(0,0,0,1)] grid grid-cols-1 md:grid-cols-3 gap-6">
<div class="p-6 border-l-4 border-orange-500 bg-orange-50/50 italic">
<strong class="block text-gray-900 uppercase text-xs tracking-widest mb-2">{{ 'hosting_cloudflare_label'|trans }}</strong>
<p class="text-[11px] text-gray-600">{{ 'hosting_cloudflare_desc'|trans }}</p>
</div>
<div class="p-6 border-l-4 border-purple-600 bg-purple-50/50 italic">
<strong class="block text-gray-900 uppercase text-xs tracking-widest mb-2">{{ 'hosting_registrars_label'|trans }}</strong>
<p class="text-[11px] text-gray-600">{{ 'hosting_registrar_name'|trans }} / {{ 'hosting_dns_provider'|trans }}</p>
</div>
<div class="p-6 border-l-4 border-blue-600 bg-blue-50/50 italic">
<strong class="block text-gray-900 uppercase text-xs tracking-widest mb-2">{{ 'hosting_monitoring_label'|trans }}</strong>
<p class="text-[11px] text-gray-600">{{ 'hosting_monitoring_desc'|trans }}</p>
</div>
</div>
</section>
<h3 class="text-xl font-medium text-gray-800 mt-4">{{'hosting_cloudflare_title'|trans}}</h3> {# SECTION 5 : SYSTÈME DE MESSAGERIE #}
<ul class="list-disc list-inside ml-4 mt-2 text-gray-700 space-y-1"> <section class="relative">
<li><strong>{{'hosting_label_role'|trans}} :</strong> {{'hosting_cloudflare_role'|trans}}</li> <div class="inline-block bg-[#0f172a] text-yellow-500 px-6 py-3 font-black italic skew-x-[-15deg] mb-6 shadow-xl border-b-2 border-yellow-600">
<li><strong>{{'hosting_label_company'|trans}} :</strong> Cloudflare, Inc.</li> <span class="skew-x-[15deg] block uppercase tracking-wider text-lg">
<li><strong>{{'hosting_label_address'|trans}} :</strong> 101 Townsend St, San Francisco, CA 94107, États-Unis.</li> // 5. {{ 'hosting_mail_system_title'|trans }}
</ul> </span>
<p class="text-sm italic text-gray-500 mt-1">{{'hosting_cloudflare_disclaimer'|trans}}</p> </div>
<div class="bg-gray-900 text-white p-8 rounded-lg border-l-8 border-red-600 shadow-xl">
<div class="grid grid-cols-1 md:grid-cols-2 gap-10 items-center">
<p class="text-sm italic text-gray-300 leading-relaxed">{{ 'hosting_mail_system_desc'|trans }}</p>
<div class="bg-white/5 p-5 border border-white/10 italic">
<p class="text-red-500 font-black uppercase text-xs mb-2 tracking-widest">{{ 'hosting_privacy_alert_label'|trans }}</p>
<p class="text-[10px] text-gray-400 leading-normal">{{ 'hosting_privacy_alert_desc'|trans }}</p>
</div>
</div>
</div>
</section>
<h3 class="text-xl font-medium text-gray-800 mt-4">{{'hosting_aws_title'|trans}}</h3> {# SECTION 6 : CONFORMITÉ & SIGNALEMENT #}
<ul class="list-disc list-inside ml-4 mt-2 text-gray-700 space-y-1"> <section class="relative">
<li><strong>{{'hosting_label_role'|trans}} :</strong> {{'hosting_aws_role'|trans}}</li> <div class="inline-block bg-[#0f172a] text-yellow-500 px-6 py-3 font-black italic skew-x-[-15deg] mb-6 shadow-xl border-b-2 border-yellow-600">
<li><strong>{{'hosting_label_company'|trans}} :</strong> Amazon Web Services, Inc.</li> <span class="skew-x-[15deg] block uppercase tracking-wider text-lg">
<li><strong>{{'hosting_label_address'|trans}} :</strong> 410 Terry Avenue North, Seattle, WA 98109-5210, États-Unis.</li> // 6. {{ 'hosting_compliance_title'|trans }}
</ul> </span>
<p class="text-sm italic text-gray-500 mt-1">{{'hosting_aws_disclaimer'|trans}}</p> </div>
</section> <div class="bg-white border-2 border-gray-900 p-8 rounded-lg shadow-[8px_8px_0px_rgba(0,0,0,1)] grid grid-cols-1 md:grid-cols-2 gap-12">
<div class="flex flex-col justify-center">
<p class="text-sm italic text-gray-600 leading-relaxed">{{ 'hosting_compliance_desc'|trans }}</p>
</div>
<div class="bg-gray-50 p-8 flex flex-col justify-center items-center border-2 border-dashed border-gray-300 text-center">
<p class="text-[10px] font-black uppercase mb-4 text-gray-400 tracking-widest italic">{{ 'hosting_signalement_label'|trans }}</p>
<a href="mailto:{{ 'hosting_signalement_email'|trans }}" class="text-red-600 font-black italic text-xl hover:text-gray-900 transition-colors">
{{ 'hosting_signalement_email'|trans }}
</a>
</div>
</div>
</section>
</div> </div>
</main>
{% endblock %} {% endblock %}

View File

@@ -3,7 +3,8 @@
{% block title %}{{'legal_page_title'|trans}}{% endblock %} {% block title %}{{'legal_page_title'|trans}}{% endblock %}
{% block meta_description %}{{'legal_page_title'|trans}}{% endblock %} {% block meta_description %}{{'legal_page_title'|trans}}{% endblock %}
{% block canonical_url %}<link rel="canonical" href="{{ url('app_legal') }}" /> {% block canonical_url %}
<link rel="canonical" href="{{ url('app_legal') }}" />
{% endblock %} {% endblock %}
{% block breadcrumb_schema %} {% block breadcrumb_schema %}
@@ -17,143 +18,146 @@
"position": 1, "position": 1,
"name": "{{'home_title'|trans }}", "name": "{{'home_title'|trans }}",
"item": "{{ app.request.schemeAndHttpHost }}" "item": "{{ app.request.schemeAndHttpHost }}"
}, },
{ {
"@type": "ListItem", "@type": "ListItem",
"position": 2, "position": 2,
"name": "{{'legal_short_title'|trans}}", "name": "{{'legal_short_title'|trans}}",
"item": "{{ app.request.schemeAndHttpHost }}{{ app.request.pathInfo }}" "item": "{{ app.request.schemeAndHttpHost }}{{ app.request.pathInfo }}"
} }
] ]
} }
</script> </script>
{% endblock %} {% endblock %}
{% block body %} {% block body %}
<div class="max-w-4xl mx-auto py-12 px-4 sm:px-6 lg:px-8 bg-white shadow-lg rounded-lg"> <main id="legal" class="max-w-6xl mx-auto px-4 py-12 font-sans text-gray-800 bg-[#fbfbfb]">
<h1 class="text-3xl font-extrabold text-gray-900 border-b-2 border-red-600 pb-4 mb-8">{{'legal_page_title'|trans}}</h1>
{# Header Dynamique Style Esport #}
<header class="mb-20 relative py-10">
<div class="relative z-10">
<h1 class="text-5xl md:text-7xl font-black text-gray-900 tracking-tighter uppercase italic leading-none esrgaa-voice">
{{ 'legal_page_title'|trans }}
</h1>
<div class="mt-4 flex items-center gap-2">
<div class="h-2 w-24 bg-yellow-500 skew-x-[-20deg]"></div>
<div class="h-2 w-12 bg-gray-900 skew-x-[-20deg]"></div>
</div>
</div>
<div class="absolute top-0 right-0 -mr-8 opacity-[0.03] pointer-events-none select-none hidden md:block">
<span class="text-[10rem] font-black italic uppercase tracking-tighter leading-none">LEGAL</span>
</div>
</header>
{# SECTION 1 : OBJET DU SITE #} <div class="space-y-20">
<section class="mb-8">
<h2 class="text-2xl font-semibold text-gray-800 mb-3">{{'legal_section1_title'|trans}}</h2>
<p class="text-gray-700">
{{'legal_section1_p1'|trans({
'%site_url%': app.request.schemeAndHttpHost
})|raw}}
</p>
<p class="text-gray-700 mt-2">{{'legal_section1_p2_intro'|trans}}</p> {# 1. OBJET DU SITE #}
<ul class="list-disc list-inside ml-4 mt-2 text-gray-700 space-y-1"> <section class="relative">
<li>{{'legal_section1_list1'|trans}}</li> <div class="inline-block bg-[#0f172a] text-yellow-500 px-6 py-3 font-black italic skew-x-[-15deg] mb-6 shadow-xl border-b-2 border-yellow-600">
<li>{{'legal_section1_list2'|trans}}</li> <span class="skew-x-[15deg] block uppercase tracking-wider text-lg">// {{'legal_section1_title'|trans}}</span>
<li>{{'legal_section1_list3'|trans}}</li> </div>
<li><strong>{{'legal_section1_list4_strong'|trans}} :</strong> {{'legal_section1_list4_details'|trans}}</li> <div class="bg-white border-2 border-gray-900 p-8 rounded-lg shadow-[8px_8px_0px_rgba(0,0,0,1)] italic">
</ul> <p class="mb-4 text-gray-900 font-bold">{{'legal_section1_p1'|trans({'%site_url%': app.request.schemeAndHttpHost})|raw}}</p>
</section> <ul class="space-y-2 text-sm text-gray-600">
<li class="flex items-center gap-2"><span class="text-yellow-500 font-black">/</span> {{'legal_section1_list1'|trans}}</li>
<li class="flex items-center gap-2"><span class="text-yellow-500 font-black">/</span> {{'legal_section1_list2'|trans}}</li>
<li class="flex items-center gap-2"><span class="text-yellow-500 font-black">/</span> {{'legal_section1_list3'|trans}}</li>
</ul>
</div>
</section>
<hr class="my-8 border-gray-200"> {# 2. ÉDITEUR #}
<section class="relative">
<div class="inline-block bg-[#0f172a] text-yellow-500 px-6 py-3 font-black italic skew-x-[-15deg] mb-6 shadow-xl border-b-2 border-yellow-600">
<span class="skew-x-[15deg] block uppercase tracking-wider text-lg">// {{'legal_section2_title'|trans}}</span>
</div>
<div class="bg-gray-900 text-white p-8 rounded-lg border-r-8 border-yellow-500 shadow-xl italic grid grid-cols-1 md:grid-cols-2 gap-8">
<div class="space-y-2 text-sm">
<p><strong class="text-yellow-500 uppercase tracking-widest text-xs">{{'legal_label_association_name'|trans}} :</strong> E-Cosplay</p>
<p><strong class="text-yellow-500 uppercase tracking-widest text-xs">{{'legal_label_rna'|trans}} :</strong> W022006988</p>
<p><strong class="text-yellow-500 uppercase tracking-widest text-xs">{{'legal_label_siren'|trans}} :</strong> 943121517</p>
<p><strong class="text-yellow-500 uppercase tracking-widest text-xs">{{'legal_label_address'|trans}} :</strong> 42 rue de Saint-Quentin, 02800 Beautor</p>
</div>
<div class="flex flex-col justify-center items-start md:items-end">
<p class="mb-2"><strong class="text-yellow-500 uppercase tracking-widest text-xs">{{'legal_label_publication_director'|trans}} :</strong></p>
<span class="text-xl font-black uppercase text-white">Serreau Jovann</span>
<a href="mailto:contact@e-cosplay.fr" class="text-yellow-500 font-bold hover:underline mt-2">contact@e-cosplay.fr</a>
</div>
</div>
</section>
{# SECTION 2 : ÉDITEUR #} {# 3. HÉBERGEMENT & 4. PROPRIÉTÉ #}
<section class="mb-8"> <div class="grid grid-cols-1 md:grid-cols-2 gap-12">
<h2 class="text-2xl font-semibold text-gray-800 mb-3">{{'legal_section2_title'|trans}}</h2> <section>
<p class="text-gray-700">{{'legal_section2_p1_editor_intro'|trans}}</p> <div class="inline-block bg-[#0f172a] text-yellow-500 px-6 py-2 font-black italic skew-x-[-15deg] mb-6 shadow-lg border-b-2 border-yellow-600">
<span class="skew-x-[15deg] block uppercase text-sm">// {{'legal_section3_title'|trans}}</span>
</div>
<div class="bg-white border-2 border-gray-900 p-6 rounded-lg shadow-[6px_6px_0px_rgba(0,0,0,1)] italic text-sm">
<p class="font-black text-gray-900 uppercase mb-2">Google Cloud Platform</p>
<p class="text-gray-600">{{'legal_host_address'|trans}}</p>
<p class="mt-4 text-[10px] font-mono bg-gray-100 p-2">{{'legal_host_data_location'|trans}}</p>
</div>
</section>
<ul class="list-disc list-inside ml-4 mt-2 text-gray-700 space-y-1"> <section>
<li><strong>{{'legal_label_association_name'|trans}} :</strong> E-Cosplay</li> <div class="inline-block bg-[#0f172a] text-yellow-500 px-6 py-2 font-black italic skew-x-[-15deg] mb-6 shadow-lg border-b-2 border-yellow-600">
<li><strong>{{'legal_label_legal_status'|trans}} :</strong> {{'legal_status_details'|trans}}</li> <span class="skew-x-[15deg] block uppercase text-sm">// {{'legal_section4_title'|trans}}</span>
<li><strong>{{'legal_label_rna'|trans}} :</strong> W022006988</li> </div>
<li><strong>{{'legal_label_siren'|trans}} :</strong> 943121517</li> <div class="bg-white border-2 border-gray-900 p-6 rounded-lg shadow-[6px_6px_0px_rgba(0,0,0,1)] italic text-sm">
<li><strong>{{'legal_label_address'|trans}} :</strong> 42 rue de Saint-Quentin, 02800 Beautor, FRANCE</li> <p class="text-gray-700 leading-tight mb-2">{{'legal_section4_p1_ip'|trans}}</p>
<li><strong>{{'legal_label_email'|trans}} :</strong> <a href="mailto:contact@e-cosplay.fr" class="text-red-600 hover:underline">contact@e-cosplay.fr</a></li> <p class="font-bold text-red-600 uppercase text-xs tracking-tighter">{{'legal_section4_p4_reproduction'|trans}}</p>
<li><strong>{{'legal_label_publication_director'|trans}} :</strong> Serreau Jovann - ShokoCosplay</li> </div>
</ul> </section>
</section> </div>
<hr class="my-8 border-gray-200"> {# 5. RGPD ET DPO #}
<section class="relative">
<div class="inline-block bg-[#0f172a] text-yellow-500 px-6 py-3 font-black italic skew-x-[-15deg] mb-6 shadow-xl border-b-2 border-yellow-600">
<span class="skew-x-[15deg] block uppercase tracking-wider text-lg">// {{'legal_section5_title'|trans}}</span>
</div>
<div class="bg-white border-2 border-gray-900 p-8 rounded-lg shadow-[8px_8px_0px_rgba(0,0,0,1)] grid grid-cols-1 md:grid-cols-2 gap-8 italic">
<div>
<p class="text-sm text-gray-600 mb-4">{{'legal_section5_p1_rgpd'|trans}}</p>
<a href="mailto:rgpd@e-cosplay.fr" class="inline-block bg-yellow-500 text-gray-900 px-6 py-2 font-black uppercase text-xs skew-x-[-10deg]">
<span class="skew-x-[10deg] block">Contact DPO</span>
</a>
</div>
<div class="bg-gray-50 p-6 border-l-4 border-indigo-600">
<p class="text-xs font-black uppercase text-indigo-600 mb-2 tracking-widest">Identifiant DPO</p>
<p class="text-xl font-black text-gray-900">DPO-167945</p>
</div>
</div>
</section>
{# SECTION 3 : HÉBERGEMENT #} {# 6. PARTENAIRES & 7. RESPONSABILITÉ #}
<section class="mb-8"> <div class="grid grid-cols-1 md:grid-cols-2 gap-12">
<h2 class="text-2xl font-semibold text-gray-800 mb-3">{{'legal_section3_title'|trans}}</h2> <section>
<p class="text-gray-700">{{'legal_section3_p1_host_intro'|trans}}</p> <div class="inline-block bg-[#0f172a] text-yellow-500 px-6 py-2 font-black italic skew-x-[-15deg] mb-6 shadow-lg border-b-2 border-yellow-600">
<span class="skew-x-[15deg] block uppercase text-sm">// {{'legal_section6_title'|trans}}</span>
</div>
<div class="bg-white border-2 border-gray-900 p-6 rounded-lg shadow-[6px_6px_0px_rgba(0,0,0,1)] italic text-sm text-gray-600">
{{'legal_section6_p1_partners'|trans}}
</div>
</section>
<ul class="list-disc list-inside ml-4 mt-2 text-gray-700 space-y-1"> <section>
<li><strong>{{'hosting_label_host_name'|trans}} :</strong> Google Cloud Platform</li> <div class="inline-block bg-[#0f172a] text-yellow-500 px-6 py-2 font-black italic skew-x-[-15deg] mb-6 shadow-lg border-b-2 border-yellow-600">
<li><strong>{{'hosting_label_company'|trans}} :</strong> Google LLC</li> <span class="skew-x-[15deg] block uppercase text-sm">// {{'legal_section7_title'|trans}}</span>
<li><strong>{{'legal_label_address'|trans}} :</strong> {{'legal_host_address'|trans}}</li> </div>
<li><strong>{{'hosting_label_data_location'|trans}} :</strong> {{'legal_host_data_location'|trans}}</li> <div class="bg-white border-2 border-gray-900 p-6 rounded-lg shadow-[6px_6px_0px_rgba(0,0,0,1)] italic text-sm text-gray-600">
</ul> {{'legal_section7_p1_liability'|trans({'%site_url%': app.request.schemeAndHttpHost})|raw}}
</section> </div>
</section>
</div>
<hr class="my-8 border-gray-200"> {# 8. DROIT APPLICABLE #}
<section class="relative">
<div class="bg-gray-900 text-white p-8 rounded-lg border-b-8 border-red-600 shadow-xl italic text-center">
<h2 class="text-red-500 font-black uppercase tracking-widest mb-4">// {{'legal_section8_title'|trans}}</h2>
<p class="text-sm font-bold">{{'legal_section8_p1_law'|trans({'%site_url%': app.request.schemeAndHttpHost})|raw}}</p>
</div>
</section>
{# SECTION 4 : PROPRIÉTÉ INTELLECTUELLE ET DROIT À L'IMAGE #} </div>
<section class="mb-8"> </main>
<h2 class="text-2xl font-semibold text-gray-800 mb-3">{{'legal_section4_title'|trans}}</h2>
<p class="text-gray-700">{{'legal_section4_p1_ip'|trans}}</p>
<p class="text-gray-700 mt-2">{{'legal_section4_p2_ip_details'|trans}}</p>
<p class="text-gray-700 mt-4 font-bold text-lg">{{'legal_section4_subtitle_image_rights'|trans}} :</p>
<ul class="list-disc list-inside ml-4 mt-2 text-gray-700 space-y-3">
<li><strong>{{'legal_section4_list1_strong'|trans}} :</strong> {{'legal_section4_list1_details'|trans}}</li>
<li><strong>{{'legal_section4_list2_strong'|trans}} :</strong> {{'legal_section4_list2_details'|trans}}</li>
<li><strong>{{'legal_section4_list3_strong'|trans}} :</strong> {{'legal_section4_list3_details'|trans}}</li>
</ul>
<p class="text-gray-700 mt-4 font-medium">{{'legal_section4_p3_visual_content'|trans}}</p>
<p class="text-gray-700 mt-3">{{'legal_section4_p4_reproduction'|trans}}</p>
</section>
<hr class="my-8 border-gray-200">
{# SECTION 5 : RGPD ET DPO #}
<section class="mb-8">
<h2 class="text-2xl font-semibold text-gray-800 mb-3">{{'legal_section5_title'|trans}}</h2>
<p class="text-gray-700">{{'legal_section5_p1_rgpd'|trans}}</p>
<ul class="list-disc list-inside ml-4 mt-2 text-gray-700 space-y-1">
<li><strong>{{'legal_label_dpo_name'|trans}} :</strong> Serreau Jovann</li>
<li><strong>{{'legal_label_dpo_num'|trans}} :</strong> DPO-167945</li>
<li><strong>{{'legal_label_dpo_contact'|trans}} :</strong> <a href="mailto:rgpd@e-cosplay.fr" class="text-red-600 hover:underline">rgpd@e-cosplay.fr</a></li>
</ul>
<p class="text-gray-700 mt-3">{{'legal_section5_p2_privacy_link'|trans}}</p>
</section>
<hr class="my-8 border-gray-200">
{# SECTION 6 : PARTENAIRES #}
<section class="mb-8">
<h2 class="text-2xl font-semibold text-gray-800 mb-3">{{'legal_section6_title'|trans}}</h2>
<p class="text-gray-700">{{'legal_section6_p1_partners'|trans}}</p>
<p class="text-gray-700 mt-2">{{'legal_section6_p2_agreement'|trans}}</p>
<p class="text-gray-700 mt-2">{{'legal_section6_p3_promotion'|trans}}</p>
</section>
<hr class="my-8 border-gray-200">
{# SECTION 7 : LIMITATIONS DE RESPONSABILITÉ #}
<section class="mb-8">
<h2 class="text-2xl font-semibold text-gray-800 mb-3">{{'legal_section7_title'|trans}}</h2>
<p class="text-gray-700">
{{'legal_section7_p1_liability'|trans({
'%site_url%': app.request.schemeAndHttpHost
})|raw}}
</p>
<p class="text-gray-700 mt-3">{{'legal_section7_p2_interactive'|trans}}</p>
</section>
<hr class="my-8 border-gray-200">
{# SECTION 8 : DROIT APPLICABLE #}
<section>
<h2 class="text-2xl font-semibold text-gray-800 mb-3">{{'legal_section8_title'|trans}}</h2>
<p class="text-gray-700">
{{'legal_section8_p1_law'|trans({
'%site_url%': app.request.schemeAndHttpHost
})|raw}}
</p>
</section>
</div>
{% endblock %} {% endblock %}

View File

@@ -3,158 +3,153 @@
{% block title %}{{'rgpd_page_title'|trans}}{% endblock %} {% block title %}{{'rgpd_page_title'|trans}}{% endblock %}
{% block meta_description %}{{'rgpd_page_title'|trans}}{% endblock %} {% block meta_description %}{{'rgpd_page_title'|trans}}{% endblock %}
{% block canonical_url %}<link rel="canonical" href="{{ url('app_rgpd') }}" /> {% block canonical_url %}
{% endblock %} <link rel="canonical" href="{{ url('app_rgpd') }}" />
{% block breadcrumb_schema %}
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": {{ "home_title"|trans }},
"item": "{{ app.request.schemeAndHttpHost }}"
},
{
"@type": "ListItem",
"position": 2,
"name": "{{'home_title'|trans }}",
"item": "{{ app.request.schemeAndHttpHost }}{{ app.request.pathInfo }}"
}
]
}
</script>
{% endblock %} {% endblock %}
{% block body %} {% block body %}
<div class="max-w-4xl mx-auto py-12 px-4 sm:px-6 lg:px-8 bg-white shadow-lg rounded-lg"> <main id="rgpd" class="max-w-6xl mx-auto px-4 py-12 font-sans text-gray-800 bg-[#fbfbfb]">
<h1 class="text-3xl font-extrabold text-gray-900 border-b-2 border-red-600 pb-4 mb-8">{{'rgpd_page_title_long'|trans}}</h1>
<section class="mb-8"> {# Header Principal #}
<h2 class="text-2xl font-semibold text-gray-800 mb-3">{{'rgpd_section1_title'|trans}}</h2> <header class="mb-20 relative py-10">
<p class="text-gray-700">{{'rgpd_section1_p1'|trans}}</p> <div class="relative z-10">
</section> <h1 class="text-4xl md:text-6xl font-black text-gray-900 tracking-tighter uppercase italic leading-none esrgaa-voice">
// {{ 'rgpd_page_title_long'|trans }}
</h1>
<div class="mt-4 flex items-center gap-2">
<div class="h-2 w-24 bg-yellow-500 skew-x-[-20deg]"></div>
<div class="h-2 w-12 bg-gray-900 skew-x-[-20deg]"></div>
</div>
</div>
</header>
<hr class="my-8 border-gray-200"> <div class="space-y-24">
<section class="mb-8"> {# SECTION 1 #}
<h2 class="text-2xl font-semibold text-gray-800 mb-3">{{'rgpd_section2_title'|trans}}</h2> <section class="relative">
<div class="inline-block bg-[#0f172a] text-yellow-500 px-6 py-3 font-black italic skew-x-[-15deg] mb-6 shadow-xl border-b-2 border-yellow-600">
<span class="skew-x-[15deg] block uppercase tracking-wider text-lg">
{{'rgpd_section1_title'|trans}}
</span>
</div>
<div class="bg-white border-2 border-gray-900 p-8 rounded-lg shadow-[8px_8px_0px_rgba(0,0,0,1)]">
<p class="text-sm italic leading-relaxed text-gray-700">{{'rgpd_section1_p1'|trans}}</p>
</div>
</section>
<p class="text-gray-700 font-bold mb-2">{{'rgpd_section2_p1_commitment'|trans}}</p> {# SECTION 2 #}
<section class="relative">
<div class="inline-block bg-[#0f172a] text-yellow-500 px-6 py-3 font-black italic skew-x-[-15deg] mb-6 shadow-xl border-b-2 border-yellow-600">
<span class="skew-x-[15deg] block uppercase tracking-wider text-lg">
// {{'rgpd_section2_title'|trans}}
</span>
</div>
<div class="bg-white border-2 border-gray-900 p-8 rounded-lg shadow-[8px_8px_0px_rgba(0,0,0,1)]">
<p class="font-black text-gray-900 mb-6 italic uppercase tracking-tight">{{'rgpd_section2_p1_commitment'|trans}}</p>
<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
<div class="p-4 bg-gray-50 border-l-4 border-yellow-500 italic">
<strong class="block text-gray-900 mb-1">{{'rgpd_contact_form_title'|trans}}</strong>
<span class="text-xs">{{'rgpd_contact_form_details'|trans}}</span>
</div>
<div class="p-4 bg-gray-50 border-l-4 border-yellow-500 italic">
<strong class="block text-gray-900 mb-1">{{'rgpd_contest_form_title'|trans}}</strong>
<span class="text-xs">{{'rgpd_contest_form_details'|trans}}</span>
</div>
<div class="p-4 bg-gray-50 border-l-4 border-yellow-500 italic">
<strong class="block text-gray-900 mb-1">{{'rgpd_no_other_collection_title'|trans}}</strong>
<span class="text-xs">{{'rgpd_no_other_collection_details'|trans}}</span>
</div>
</div>
</div>
</section>
<p class="text-gray-700">{{'rgpd_section2_p2_data_collected'|trans}}</p> {# SECTION 3 #}
<section class="relative">
<div class="inline-block bg-[#0f172a] text-yellow-500 px-6 py-3 font-black italic skew-x-[-15deg] mb-6 shadow-xl border-b-2 border-yellow-600">
<span class="skew-x-[15deg] block uppercase tracking-wider text-lg">
// {{'rgpd_section3_title'|trans}}
</span>
</div>
<div class="bg-gray-900 text-white p-8 rounded-lg border-r-8 border-yellow-500 shadow-xl overflow-hidden">
<div class="grid grid-cols-1 md:grid-cols-2 gap-10">
<div class="space-y-6 text-sm italic text-gray-300">
<p>{{'rgpd_section3_p1_no_resale'|trans}}</p>
<div class="bg-white/5 p-4 rounded border border-white/10 font-mono text-[11px] leading-relaxed">
{{'rgpd_section3_p4_advanced_security'|trans({
'%local_server%': '<span class="text-yellow-500">Local-Server</span>',
'%key_rotation%': '<span class="text-yellow-500">24h-Rotation</span>',
'%no_decryption_key%': '<span class="text-red-500 font-bold">No-Access-Policy</span>'
})|raw}}
</div>
</div>
<div class="bg-white/5 p-6 border-l-2 border-yellow-500/50">
<ul class="space-y-4 text-xs italic text-gray-300">
<li class="flex gap-2"><span class="text-yellow-500">»</span> <strong>{{'rgpd_breach_list1_strong'|trans}}</strong> : {{'rgpd_breach_list1_details'|trans}}</li>
<li class="flex gap-2"><span class="text-yellow-500">»</span> <strong>{{'rgpd_breach_list2_strong'|trans}}</strong> : {{'rgpd_breach_list2_details'|trans}}</li>
</ul>
</div>
</div>
</div>
</section>
<ul class="list-disc list-inside ml-4 mt-4 text-gray-700 space-y-2"> {# SECTION 4 #}
<li> <section class="relative">
<strong>{{'rgpd_contact_form_title'|trans}} :</strong> <div class="inline-block bg-[#0f172a] text-yellow-500 px-6 py-3 font-black italic skew-x-[-15deg] mb-6 shadow-xl border-b-2 border-yellow-600">
{{'rgpd_contact_form_details'|trans}} <span class="skew-x-[15deg] block uppercase tracking-wider text-lg">
</li> // {{'rgpd_section4_title'|trans}}
<li> </span>
<strong>{{'rgpd_contest_form_title'|trans}} :</strong> </div>
{{'rgpd_contest_form_details'|trans}} <div class="bg-white border-2 border-gray-900 p-8 rounded-lg shadow-[8px_8px_0px_rgba(0,0,0,1)] grid grid-cols-1 md:grid-cols-2 gap-8">
</li> <p class="text-sm italic leading-relaxed text-gray-600">{{'rgpd_section4_p1_rights_intro'|trans}}</p>
<li> <ul class="space-y-3 text-sm italic font-black uppercase tracking-tighter text-gray-900">
<strong>{{'rgpd_no_other_collection_title'|trans}} :</strong> <li class="flex items-center gap-2"><span class="w-2 h-2 bg-yellow-500"></span> {{'rgpd_right_access'|trans}}</li>
{{'rgpd_no_other_collection_details'|trans}} <li class="flex items-center gap-2"><span class="w-2 h-2 bg-yellow-500"></span> {{'rgpd_right_rectification'|trans}}</li>
</li> </ul>
</ul> </div>
</section> </section>
<hr class="my-8 border-gray-200"> {# SECTION 5 #}
<section class="relative">
<div class="inline-block bg-[#0f172a] text-yellow-500 px-6 py-3 font-black italic skew-x-[-15deg] mb-6 shadow-xl border-b-2 border-yellow-600">
<span class="skew-x-[15deg] block uppercase tracking-wider text-lg">
// {{'rgpd_section5_title'|trans}}
</span>
</div>
<div class="bg-white border-2 border-gray-900 p-8 rounded-lg shadow-[8px_8px_0px_rgba(0,0,0,1)] grid grid-cols-1 md:grid-cols-2 gap-8">
<div class="flex flex-col justify-center italic text-sm text-gray-600">
{{'rgpd_section5_p1_contact_intro'|trans}}
</div>
<div class="bg-gray-50 p-6 border-l-4 border-yellow-500">
<p class="text-lg font-black text-gray-900 mb-4 italic">Serreau Jovann</p>
<a href="mailto:rgpd@e-cosplay.fr" class="bg-gray-900 text-white px-6 py-2 font-black italic uppercase hover:bg-yellow-500 hover:text-gray-900 transition-colors inline-block text-xs skew-x-[-10deg]">
<span class="skew-x-[10deg] block">rgpd@e-cosplay.fr</span>
</a>
</div>
</div>
</section>
<section class="mb-8"> {# SECTION 6 (ADDITIF TECHNIQUE) #}
<h2 class="text-2xl font-semibold text-gray-800 mb-3">{{'rgpd_section3_title'|trans}}</h2> <section class="relative">
<div class="inline-block bg-[#0f172a] text-yellow-500 px-6 py-3 font-black italic skew-x-[-15deg] mb-6 shadow-xl border-b-2 border-yellow-600">
<span class="skew-x-[15deg] block uppercase tracking-wider text-lg">
// 6. {{ 'rgpd_additif_title'|trans }}
</span>
</div>
<div class="bg-white border-2 border-gray-900 p-8 rounded-lg shadow-[8px_8px_0px_rgba(0,0,0,1)] grid grid-cols-1 lg:grid-cols-3 gap-8">
<div class="lg:col-span-2 space-y-6 italic text-sm">
<p>{{ 'rgpd_additif_collecte_text'|trans }}</p>
<div class="bg-gray-900 text-white p-4 font-mono text-[10px] uppercase">
<span class="text-yellow-500">// SSL</span> CLOUDFLARE + LET'S ENCRYPT
</div>
</div>
<div class="bg-yellow-500 p-6 border-2 border-gray-900 h-fit">
<h3 class="font-black uppercase text-xs mb-4 italic tracking-widest border-b border-gray-900/20 pb-2">DPO SITECONSEIL</h3>
<p class="text-[10px] font-bold uppercase italic text-gray-900 leading-tight">LEGRAND Philippe<br>03 23 05 62 43</p>
</div>
</div>
</section>
<h3 class="text-xl font-medium text-gray-800 mt-4">{{'rgpd_section3_subtitle1'|trans}}</h3> </div>
<p class="text-gray-700">{{'rgpd_section3_p1_no_resale'|trans}}</p>
<h3 class="text-xl font-medium text-gray-800 mt-4">{{'rgpd_section3_subtitle2'|trans}}</h3> </main>
<p class="text-gray-700">
{{'rgpd_section3_p2_encryption'|trans({
'%https%': '<strong>HTTPS (Secure Socket Layer)</strong>'
})|raw}}
</p>
<p class="text-gray-700 mt-2">
{{'rgpd_section3_p3_contest_encryption'|trans({
'%encrypted%': '<strong>' ~ 'rgpd_encrypted_word'|trans ~ '</strong>'
})|raw}}
</p>
<p class="text-gray-700 mt-2">
{{'rgpd_section3_p4_advanced_security'|trans({
'%local_server%': '<strong>' ~ 'rgpd_local_server_text'|trans ~ '</strong>',
'%key_rotation%': '<strong>' ~ 'rgpd_key_rotation_text'|trans ~ '</strong>',
'%no_decryption_key%': '<strong>' ~ 'rgpd_no_decryption_key_text'|trans ~ '</strong>'
})|raw}}
</p>
<h3 class="text-xl font-medium text-gray-800 mt-4">{{'rgpd_section3_subtitle3'|trans}}</h3>
<p class="text-gray-700">{{'rgpd_section3_p5_breach_intro'|trans}}</p>
<ul class="list-disc list-inside ml-4 mt-2 text-gray-700 space-y-1">
<li>
<strong>{{'rgpd_breach_list1_strong'|trans}} :</strong>
{{'rgpd_breach_list1_details'|trans}}
</li>
<li>
<strong>{{'rgpd_breach_list2_strong'|trans}} :</strong>
{{'rgpd_breach_list2_details'|trans}}
</li>
<li>
<strong>{{'rgpd_breach_list3_strong'|trans}} :</strong>
{{'rgpd_breach_list3_details'|trans}}
</li>
</ul>
</section>
<hr class="my-8 border-gray-200">
<section class="mb-8">
<h2 class="text-2xl font-semibold text-gray-800 mb-3">{{'rgpd_section4_title'|trans}}</h2>
<h3 class="text-xl font-medium text-gray-800 mt-4">{{'rgpd_section4_subtitle1'|trans}}</h3>
<p class="text-gray-700">{{'rgpd_section4_p1_contest_data_intro'|trans}}</p>
<ul class="list-disc list-inside ml-4 mt-2 text-gray-700 space-y-1">
<li><strong>{{'rgpd_conservation_duration_label'|trans}} :</strong> {{'rgpd_conservation_duration_contest'|trans}}</li>
<li><strong>{{'rgpd_auto_deletion_label'|trans}} :</strong> {{'rgpd_auto_deletion_contest'|trans}}</li>
</ul>
<h3 class="text-xl font-medium text-gray-800 mt-4">{{'rgpd_section4_subtitle2'|trans}}</h3>
<p class="text-gray-700">{{'rgpd_section4_p2_image_rights_intro'|trans}}</p>
<ul class="list-disc list-inside ml-4 mt-2 text-gray-700 space-y-1">
<li><strong>{{'rgpd_file_conservation_label'|trans}} :</strong> {{'rgpd_file_conservation_details'|trans}}</li>
<li><strong>{{'rgpd_authorization_duration_label'|trans}} :</strong> {{'rgpd_authorization_duration_details'|trans}}</li>
</ul>
<h3 class="text-xl font-medium text-gray-800 mt-4">{{'rgpd_section4_subtitle3'|trans}}</h3>
<p class="text-gray-700">{{'rgpd_section4_p3_general_deletion'|trans}}</p>
<h3 class="text-xl font-medium text-gray-800 mt-4">{{'rgpd_section4_subtitle4'|trans}}</h3>
<p class="text-gray-700">{{'rgpd_section4_p4_other_data'|trans}}</p>
<p class="text-gray-700 mt-2">{{'rgpd_section4_p5_rights_reminder'|trans}}</p>
</section>
<hr class="my-8 border-gray-200">
<section class="mb-8">
<h2 class="text-2xl font-semibold text-gray-800 mb-3">{{'rgpd_section5_title'|trans}}</h2>
<p class="text-gray-700">{{'rgpd_section5_p1_rights_intro'|trans}}</p>
<ul class="list-disc list-inside ml-4 mt-2 text-gray-700 space-y-1">
<li>{{'rgpd_right_access'|trans}}</li>
<li>{{'rgpd_right_rectification'|trans}}</li>
<li>{{'rgpd_right_erasure'|trans}}</li>
<li>{{'rgpd_right_opposition'|trans}}</li>
</ul>
<p class="text-gray-700 mt-4">{{'rgpd_section5_p2_contact_dpo'|trans}}</p>
<ul class="list-disc list-inside ml-4 mt-2 text-gray-700 space-y-1">
<li><strong>{{'legal_label_dpo_name'|trans}} :</strong> Serreau Jovann</li>
<li><strong>{{'legal_label_dpo_num'|trans}} :</strong> DPO-167945</li>
<li><strong>{{'legal_label_dpo_contact'|trans}} :</strong> <a href="mailto:rgpd@e-cosplay.fr" class="text-red-600 hover:underline">rgpd@e-cosplay.fr</a></li>
</ul>
</section>
</div>
{% endblock %} {% endblock %}

190
templates/legal/rules.twig Normal file
View File

@@ -0,0 +1,190 @@
{% extends 'base.twig' %}
{% block title %}{{'rule_page_title'|trans}}{% endblock %}
{% block meta_description %}{{'rule_page_title'|trans}}{% endblock %}
{% block canonical_url %}
<link rel="canonical" href="{{ url('app_rules') }}" />
{% endblock %}
{% block breadcrumb_schema %}
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "{{ "home_title"|trans }}",
"item": "{{ app.request.schemeAndHttpHost }}"
},
{
"@type": "ListItem",
"position": 2,
"name": "{{ 'rule_title'|trans }}",
"item": "{{ app.request.schemeAndHttpHost }}{{ app.request.pathInfo }}"
}
]
}
</script>
{% endblock %}
{% block body %}
<main id="rules" class="max-w-6xl mx-auto px-4 py-12 font-sans text-gray-800 bg-[#fbfbfb]">
{# Header Dynamique Style Esport #}
<header class="mb-20 relative py-10">
<div class="relative z-10">
<h1 class="text-5xl md:text-7xl font-black text-gray-900 tracking-tighter uppercase italic leading-none esrgaa-voice">
{{ 'rule_title'|trans }}
</h1>
<div class="mt-4 flex items-center gap-2">
<div class="h-2 w-24 bg-yellow-500 skew-x-[-20deg]"></div>
<div class="h-2 w-12 bg-gray-900 skew-x-[-20deg]"></div>
</div>
</div>
<div class="absolute top-0 right-0 -mr-8 opacity-[0.03] pointer-events-none select-none hidden md:block">
<span class="text-[12rem] font-black italic uppercase tracking-tighter leading-none">RULES</span>
</div>
</header>
<div class="space-y-24">
{# PRÉAMBULE #}
<section class="relative">
<div class="bg-gray-900 text-white rounded-tr-3xl rounded-bl-3xl p-8 mb-16 shadow-2xl relative border-l-8 border-yellow-500 skew-x-[-1deg]">
<div class="skew-x-[1deg]">
<h2 class="text-xl font-bold uppercase tracking-widest text-yellow-500 mb-4 italic">
// {{ 'rules_preamble_title'|trans }}
</h2>
<p class="text-gray-300 leading-relaxed italic">
{{ 'rules_preamble_text'|trans({'%date%': '29 novembre 2025', '%entry_date%': '1er décembre 2025'})|raw }}
</p>
</div>
</div>
</section>
{# ARTICLE 01 #}
<section class="relative">
<div class="inline-block bg-[#0f172a] text-yellow-500 px-6 py-3 font-black italic skew-x-[-15deg] mb-6 shadow-xl border-b-2 border-yellow-600">
<span class="skew-x-[15deg] block uppercase tracking-wider text-lg">
// 01. {{ 'rules_art1_title'|trans }}
</span>
</div>
<div class="bg-white border-2 border-gray-900 p-8 rounded-lg shadow-[8px_8px_0px_rgba(0,0,0,1)]">
<div class="space-y-6 text-gray-600 font-medium italic">
<p>{{ 'rules_art1_p1'|trans|raw }}</p>
<p>{{ 'rules_art1_p2'|trans|raw }}</p>
<div class="bg-gray-50 border-l-4 border-gray-900 p-4 text-sm font-bold uppercase tracking-tight">
{{ 'rules_art1_transparency'|trans }}
</div>
</div>
</div>
</section>
{# ARTICLE 02 #}
<section class="relative">
<div class="inline-block bg-[#0f172a] text-yellow-500 px-6 py-3 font-black italic skew-x-[-15deg] mb-6 shadow-xl border-b-2 border-yellow-600">
<span class="skew-x-[15deg] block uppercase tracking-wider text-lg">
// 02. {{ 'rules_art2_main_title'|trans }}
</span>
</div>
<div class="grid grid-cols-1 gap-8">
<div class="bg-white border-2 border-gray-200 p-6 rounded-lg shadow-sm italic">
<h3 class="text-xl font-black uppercase text-blue-600 mb-3">2.1 {{ 'rules_art2_1_title'|trans }}</h3>
<p class="text-gray-600">{{ 'rules_art2_1_p1'|trans|raw }}</p>
<p class="mt-4 text-xs font-bold text-blue-800 bg-blue-50 inline-block px-3 py-1 skew-x-[-5deg]">{{ 'rules_art2_1_notice'|trans }}</p>
</div>
<div class="bg-gray-900 text-white p-8 rounded-lg relative overflow-hidden border-b-8 border-red-600 shadow-xl">
<h3 class="text-2xl font-black italic uppercase text-red-500 mb-6 tracking-tighter">// 2.2 {{ 'rules_art2_2_title'|trans }}</h3>
<ul class="space-y-3 italic text-sm md:text-base">
<li class="flex gap-3 items-center bg-white/5 p-3 border border-white/10 skew-x-[-3deg]"><span class="text-red-500 font-black">▶</span> {{ 'rules_art2_2_reason1'|trans }}</li>
<li class="flex gap-3 items-center bg-white/5 p-3 border border-white/10 skew-x-[-3deg] font-bold text-red-400"><span class="text-red-500 font-black">▶</span> {{ 'rules_art2_2_reason2'|trans }}</li>
<li class="flex gap-3 items-center bg-white/5 p-3 border border-white/10 skew-x-[-3deg]"><span class="text-red-500 font-black">▶</span> {{ 'rules_art2_2_reason4'|trans }}</li>
<li class="flex gap-3 items-center bg-white/5 p-3 border border-white/10 skew-x-[-3deg]"><span class="text-red-500 font-black">▶</span> {{ 'rules_art2_2_reason5'|trans }}</li>
</ul>
<div class="mt-8 p-4 bg-red-600/10 border-l-4 border-red-600 text-xs italic">
<p class="font-bold text-red-500 mb-1 uppercase tracking-widest">{{ 'rules_art2_2_procedure'|trans|raw }}</p>
<p class="text-gray-400">{{ 'rules_art2_2_transparency'|trans }}</p>
</div>
</div>
</div>
</section>
{# ARTICLE 03 #}
<section class="relative">
<div class="inline-block bg-[#0f172a] text-yellow-500 px-6 py-3 font-black italic skew-x-[-15deg] mb-6 shadow-xl border-b-2 border-yellow-600">
<span class="skew-x-[15deg] block uppercase tracking-wider text-lg">
// 03. {{ 'rules_art3_title'|trans }}
</span>
</div>
<div class="bg-white border-2 border-purple-700 p-8 rounded-lg shadow-[8px_8px_0px_#6b21a8]">
<div class="space-y-6 italic">
<p class="text-lg font-bold text-gray-900 border-l-4 border-purple-200 pl-4">{{ 'rules_art3_request'|trans|raw }}</p>
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
<div class="bg-purple-50 p-4 skew-x-[-5deg] border border-purple-100">
<p class="font-black uppercase text-xs text-purple-700">{{ 'rules_art3_ballot_title'|trans }}</p>
<p class="text-xs font-bold">{{ 'rules_art3_ballot_desc'|trans }}</p>
</div>
<div class="bg-purple-50 p-4 skew-x-[-5deg] border border-purple-100">
<p class="font-black uppercase text-xs text-purple-700">{{ 'rules_art3_majority_title'|trans }}</p>
<p class="text-xs font-bold">{{ 'rules_art3_majority_desc'|trans }}</p>
</div>
</div>
<div class="p-6 bg-gray-900 text-white rounded-lg border-b-4 border-purple-500 relative overflow-hidden">
<h4 class="text-purple-400 font-black uppercase text-xs mb-3 italic tracking-widest">// {{ 'rules_art3_tally_title'|trans }}</h4>
<p class="mb-4 text-sm text-gray-300">{{ 'rules_art3_tally_p1'|trans }}</p>
<div class="bg-white/10 p-4 rounded skew-x-[-2deg] border border-white/10">
<p class="text-xl text-yellow-500 font-black uppercase italic">{{ 'rules_art3_tally_p2'|trans }}</p>
</div>
</div>
</div>
</div>
</section>
{# ARTICLE 04 #}
<section class="relative">
<div class="inline-block bg-[#0f172a] text-yellow-500 px-6 py-3 font-black italic skew-x-[-15deg] mb-6 shadow-xl border-b-2 border-yellow-600">
<span class="skew-x-[15deg] block uppercase tracking-wider text-lg">
// 04. {{ 'rules_art4_title'|trans }}
</span>
</div>
<div class="bg-white border-2 border-gray-900 p-8 rounded-lg shadow-[8px_8px_0px_rgba(22,101,52,1)]">
<p class="mb-6 font-bold italic text-gray-700 underline decoration-green-200 decoration-4">{{ 'rules_art4_notice'|trans }}</p>
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
<div class="p-5 bg-green-50 border-l-4 border-green-600 italic">
<p class="font-black uppercase text-xs text-green-800 mb-1">{{ 'rules_art4_normal_title'|trans }}</p>
<p class="text-sm font-medium text-gray-600">{{ 'rules_art4_normal_desc'|trans }}</p>
</div>
<div class="p-5 bg-green-50 border-l-4 border-green-600 italic">
<p class="font-black uppercase text-xs text-green-800 mb-1">{{ 'rules_art4_extra_title'|trans }}</p>
<p class="text-sm font-medium text-gray-600">{{ 'rules_art4_extra_desc'|trans }}</p>
</div>
</div>
</div>
</section>
{# ARTICLE 05 #}
<section class="relative">
<div class="inline-block bg-[#0f172a] text-yellow-500 px-6 py-3 font-black italic skew-x-[-15deg] mb-6 shadow-xl border-b-2 border-yellow-600">
<span class="skew-x-[15deg] block uppercase tracking-wider text-lg">
// 05. {{ 'rules_art5_title'|trans }}
</span>
</div>
<div class="bg-white border-2 border-cyan-600 p-8 rounded-lg shadow-[8px_8px_0px_#0891b2]">
<div class="space-y-6 italic text-sm md:text-base">
<p class="font-bold text-gray-800">{{ 'rules_art5_p1'|trans|raw }}</p>
<div class="bg-gray-900 text-cyan-400 p-6 rounded-tr-3xl rounded-bl-3xl border-l-8 border-cyan-600 shadow-inner">
<h4 class="font-black text-white text-xs mb-3 uppercase tracking-widest">// {{ 'rules_art5_stand_title'|trans }}</h4>
<p class="text-sm leading-relaxed text-gray-300 font-medium">
{{ 'rules_art5_stand_desc'|trans }}
</p>
</div>
</div>
</div>
</section>
</div>
</main>
{% endblock %}

View File

@@ -5,36 +5,40 @@
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<mj-section background-color="#ffffff" padding-top="20px"> <mj-section background-color="#ffffff" padding-top="20px">
<mj-column width="100%"> <mj-column width="100%">
<mj-text font-size="20px" color="#2c3e50" font-weight="bold" align="center"> {# Utilisation du Pseudo si disponible, sinon le Prénom #}
Merci {{ join.name }} ! <mj-text font-size="24px" color="#1A1A1A" font-weight="900" align="center" font-style="italic" text-transform="uppercase">
</mj-text> MERCI {{ datas.join.pseudo|default(datas.join.name)|upper }} !
<mj-text font-size="16px" color="#444444" line-height="24px" align="center"> </mj-text>
Nous avons bien reçu ta candidature pour rejoindre l'association <strong>E-Cosplay</strong>. <mj-text font-size="16px" color="#444444" line-height="24px" align="center">
</mj-text> Ta candidature pour rejoindre l'association <strong>E-Cosplay</strong> a bien été enregistrée.
<mj-divider border-color="#2c3e50" border-width="2px" width="50px"></mj-divider> </mj-text>
</mj-column> <mj-divider border-color="#FFC107" border-width="4px" width="60px"></mj-divider>
</mj-section> </mj-column>
</mj-section>
<mj-section background-color="#ffffff" padding-top="0px"> <mj-section background-color="#ffffff" padding-top="0px">
<mj-column width="100%"> <mj-column width="90%" border="2px solid #1A1A1A" background-color="#FAFAFA" padding="15px">
<mj-text font-size="15px" color="#555555" line-height="22px"> <mj-text font-size="15px" color="#1A1A1A" line-height="22px">
Ton dossier est désormais entre les mains de notre équipe. Nous l'examinons avec attention et nous reviendrons vers toi <strong>sous peu</strong> par email ou via Discord pour la suite des événements. Ton dossier est désormais entre les mains de notre équipe pour validation.
</mj-text> </mj-text>
<mj-text font-size="15px" color="#555555" line-height="22px"> <mj-text font-size="15px" color="#1A1A1A" line-height="22px">
En attendant, n'hésite pas à nous suivre sur nos réseaux sociaux pour découvrir nos dernières activités ! Conformément à nos principes démocratiques, chaque membre du bureau doit voter. Tu recevras une réponse définitive <strong>sous 7 à 10 jours ouvrés</strong>.
</mj-text> </mj-text>
</mj-column> <mj-text font-size="15px" color="#1A1A1A" line-height="22px" font-weight="bold">
</mj-section> Reste à l'affût de tes emails ou de ton compte Discord !
</mj-text>
</mj-column>
</mj-section>
<mj-section padding-top="10px"> <mj-section padding-top="30px">
<mj-column width="100%"> <mj-column width="100%">
<mj-text font-size="11px" color="#999999" align="center"> <mj-text font-size="11px" color="#999999" align="center">
E-Cosplay Association loi 1901<br> <strong>E-Cosplay</strong> - Association loi 1901<br>
42 rue de saint-quentin, 02800 Beautor<br> 42 rue de saint-quentin, 02800 Beautor<br>
Ceci est un message automatique, merci de ne pas y répondre directement. © {{ "now"|date("Y") }} - Ceci est un message automatique.
</mj-text> </mj-text>
</mj-column> </mj-column>
</mj-section> </mj-section>
{% endblock %} {% endblock %}

View File

@@ -1,10 +1,9 @@
{% extends 'mails/base.twig' %} {% extends 'mails/base.twig' %}
{% block subject %} {% block subject %}
Nouvelle candidature [E-Cosplay] Nouvelle candidature : {{ datas.join.pseudo|default(datas.join.surname|upper) }}
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<mj-section background-color="#ffffff" padding-top="20px"> <mj-section background-color="#ffffff" padding-top="20px">
<mj-column width="100%"> <mj-column width="100%">
@@ -13,37 +12,60 @@
</mj-text> </mj-text>
<mj-text font-size="16px" color="#555555" line-height="24px"> <mj-text font-size="16px" color="#555555" line-height="24px">
Bonjour l'équipe, <br><br> Bonjour l'équipe, <br><br>
Un nouveau formulaire d'adhésion vient d'être soumis sur le site <strong>E-Cosplay</strong>. Voici les détails du candidat : Une nouvelle demande d'adhésion vient d'être soumise. Voici le profil de <strong>{{ datas.join.pseudo|default('ce candidat') }}</strong> :
</mj-text> </mj-text>
</mj-column> </mj-column>
</mj-section> </mj-section>
<mj-section background-color="#ffffff" padding="0px"> <mj-section background-color="#ffffff" padding="0px">
<mj-column width="90%" background-color="#fafafa" border="1px solid #e0e0e0" padding="15px"> <mj-column width="90%" background-color="#fafafa" border="2px solid #1a1a1a" padding="15px">
{# IDENTITÉ #}
<mj-text font-size="15px" color="#333333" padding-bottom="5px"> <mj-text font-size="15px" color="#333333" padding-bottom="5px">
<strong>Candidat :</strong> {{ join.surname|upper }} {{ join.name }} <strong>Pseudo / Scène :</strong> <span color="#E63946">{{ datas.join.pseudo|default('N/C') }}</span>
</mj-text> </mj-text>
<mj-text font-size="15px" color="#333333" padding-bottom="5px"> <mj-text font-size="15px" color="#333333" padding-bottom="5px">
<strong>Email :</strong> {{ join.email }} <strong>Identité :</strong> ({{ datas.join.civ|upper }}) {{ datas.join.surname|upper }} {{ datas.join.name }}
</mj-text>
{# COMMUNAUTÉ #}
<mj-text font-size="14px" color="#333333" padding-bottom="5px">
<strong>Cross-Cosplay :</strong> {{ datas.join.crossCosplay|upper }} |
<strong>Transidentité :</strong> {{ datas.join.trans|upper }}
</mj-text>
<mj-divider border-width="1px" border-style="dashed" border-color="#e0e0e0" />
{# CONTACT & RÔLES #}
<mj-text font-size="15px" color="#333333" padding-bottom="5px">
<strong>Email :</strong> {{ datas.join.email }}
</mj-text> </mj-text>
<mj-text font-size="15px" color="#333333" padding-bottom="5px"> <mj-text font-size="15px" color="#333333" padding-bottom="5px">
<strong>Rôles :</strong> <strong>Rôles souhaités :</strong>
{% if join.role is iterable %} {% if datas.join.role is iterable %}
{{ join.role|join(', ') }} {{ datas.join.role|join(', ') }}
{% else %} {% else %}
{{ join.role }} {{ datas.join.role }}
{% endif %} {% endif %}
</mj-text> </mj-text>
<mj-text font-size="15px" color="#333333"> <mj-text font-size="15px" color="#333333">
<strong>Date :</strong> {{ join.createAt|date('d/m/Y H:i') }} <strong>Soumis le :</strong> {{ datas.join.createAt|date('d/m/Y H:i') }}
</mj-text> </mj-text>
</mj-column> </mj-column>
</mj-section> </mj-section>
<mj-section background-color="#ffffff" padding-top="30px"> <mj-section background-color="#ffffff" padding-top="20px">
<mj-column width="90%">
<mj-text font-size="14px" color="#555555" font-style="italic">
"{{ datas.join.who|slice(0, 150) }}..."
</mj-text>
</mj-column>
</mj-section>
<mj-section background-color="#ffffff" padding-top="10px">
<mj-column width="100%"> <mj-column width="100%">
<mj-text font-size="12px" color="#888888" align="center" padding-top="20px"> <mj-text font-size="12px" color="#E63946" font-weight="bold" align="center">
Vous pouvez également retrouver le PDF généré en pièce jointe de ce mail. Consultez le PDF joint pour le dossier complet et les liens réseaux sociaux.
</mj-text> </mj-text>
</mj-column> </mj-column>
</mj-section> </mj-section>

View File

@@ -0,0 +1,52 @@
{% extends 'mails/base.twig' %}
{% block subject %}
Réponse à ta candidature - Association E-Cosplay
{% endblock %}
{% block content %}
<mj-section background-color="#ffffff" padding-top="20px">
<mj-column width="100%">
<mj-text font-size="20px" color="#333333" font-weight="bold">
Bonjour {{ datas.join.name }},
</mj-text>
<mj-text font-size="15px" color="#555555" line-height="24px">
Nous te remercions d'avoir pris le temps de postuler pour rejoindre l'association <strong>E-Cosplay</strong>.
</mj-text>
<mj-text font-size="15px" color="#555555" line-height="24px">
Après étude de ton dossier par notre équipe, nous avons le regret de t'informer que nous ne pouvons pas donner suite à ta candidature pour le moment.
</mj-text>
</mj-column>
</mj-section>
<mj-section background-color="#ffffff" padding-top="0px">
<mj-column width="100%" background-color="#fff5f5" border-left="4px solid #f56565" padding="10px 20px">
<mj-text font-size="14px" color="#c53030" font-weight="bold" padding-bottom="5px">
Motif de notre décision :
</mj-text>
<mj-text font-size="14px" color="#555555" line-height="20px" font-style="italic">
"{{ datas.reason }}"
</mj-text>
</mj-column>
</mj-section>
<mj-section background-color="#ffffff" padding-top="20px">
<mj-column width="100%">
<mj-text font-size="14px" color="#555555" line-height="22px">
Cette décision n'est pas un jugement sur ton talent ou ta motivation, mais correspond à nos besoins et critères actuels. Nous te souhaitons beaucoup de succès dans tes futurs projets cosplay.
</mj-text>
<mj-text font-size="14px" color="#333333" font-weight="bold" padding-top="20px">
L'équipe E-Cosplay
</mj-text>
</mj-column>
</mj-section>
<mj-section>
<mj-column width="100%">
<mj-text font-size="11px" color="#999999" align="center">
E-Cosplay - Beautor, France<br>
Ceci est un message automatique, merci de ne pas y répondre.
</mj-text>
</mj-column>
</mj-section>
{% endblock %}

View File

@@ -1,20 +1,26 @@
{% extends 'mails/base.twig' %} {% extends 'mails/base.twig' %}
{% block subject %} {% block subject %}
Nouvelle candidature : {{ join.name }} {{ join.surname }} [NOUVELLE CANDIDATURE] - {{ join.pseudo|default(join.surname|upper) }} ({{ join.civ|upper }})
{% endblock %} {% endblock %}
{% block content %} {% block content %}
NOUVELLE CANDIDATURE REÇUE NOUVELLE CANDIDATURE REÇUE - E-COSPLAY
========================== ======================================
Bonjour l'équipe, Bonjour l'équipe,
Une nouvelle candidature a été déposée sur le site E-Cosplay. Un nouveau formulaire d'adhésion vient d'être soumis sur le site.
Voici le profil complet du candidat :
IDENTITÉ COSPLAY :
------------------
- Pseudo / Scène : {{ join.pseudo|default('Non renseigné') }}
- Nom Complet : ({{ join.civ|upper }}) {{ join.surname|upper }} {{ join.name }}
- Identité : {{ join.crossCosplay|upper }} (Cross) | {{ join.trans|upper }} (Trans)
DÉTAILS DU CANDIDAT : DÉTAILS DU CANDIDAT :
--------------------- ---------------------
- Nom complet : {{ join.surname|upper }} {{ join.name }}
- Email : {{ join.email }} - Email : {{ join.email }}
- Téléphone : {{ join.phone }} - Téléphone : {{ join.phone }}
- Rôles souhaités : {% if join.role is iterable %}{{ join.role|join(', ') }}{% else %}{{ join.role }}{% endif %} - Rôles souhaités : {% if join.role is iterable %}{{ join.role|join(', ') }}{% else %}{{ join.role }}{% endif %}
@@ -28,10 +34,14 @@
------------------------ ------------------------
- Discord : {{ join.discordAccount|default('Non renseigné') }} - Discord : {{ join.discordAccount|default('Non renseigné') }}
- Instagram : {{ join.instaLink|default('N/A') }} - Instagram : {{ join.instaLink|default('N/A') }}
- TikTok : {{ join.tiktokLink|default('N/A') }}
- Facebook : {{ join.facebookLink|default('N/A') }}
Vous pouvez consulter cette fiche directement dans l'administration ----------------------------------------------------------
Note : Le dossier complet avec le calcul de l'âge est
disponible en pièce jointe (PDF).
----------------------------------------------------------
---
Ceci est un message automatique envoyé par le site E-Cosplay. Ceci est un message automatique envoyé par le site E-Cosplay.
© {{ "now"|date("Y") }} E-Cosplay Association © {{ "now"|date("Y") }} E-Cosplay Association
{% endblock %} {% endblock %}

View File

@@ -0,0 +1,28 @@
{% extends 'txt-mails/base.twig' %}
{% block content %}
Bonjour {{ datas.join.name }},
Nous te remercions d'avoir postulé pour rejoindre l'association E-Cosplay.
Après une étude attentive de ton dossier par les membres du bureau, nous avons le regret de t'informer que nous ne pouvons pas donner suite à ta candidature pour le moment.
MOTIF DE NOTRE DÉCISION :
----------------------------------------------------------------------
{{ datas.reason }}
----------------------------------------------------------------------
Cette décision n'est en aucun cas un jugement sur ton travail ou ta passion, mais elle est liée à nos besoins actuels ou à nos critères de recrutement spécifiques au moment présent.
Nous te souhaitons beaucoup de réussite dans tes futurs projets de cosplay et tes activités personnelles.
Cordialement,
L'équipe E-Cosplay
Association loi 1901 - Beautor
---
Ceci est un message automatique, merci de ne pas y répondre directement.
Pour toute question, contacte-nous via nos réseaux sociaux officiels.
{% endblock %}

View File

@@ -854,25 +854,29 @@ form:
questioning: "探索中" questioning: "探索中"
other: "其他" other: "其他"
pronouns: pronouns:
il: "他 (He)" il: "他 (He/Him)"
elle: "她 (She)" elle: "她 (She/Her)"
iel: "他们 (They)" iel: "他们 (They/Them)"
autre: "其他 / 自定义" autre: "其他 / 自定义"
role: role:
cosplay: "Cosplayer (角色扮演者)" cosplay: "Cosplayer (角色扮演者)"
helper: "Helper (后勤协助)" helper: "志愿者 (后勤协助)"
photographer: "摄影师" photographer: "摄影师"
other: "其他" other: "其他"
header: header:
title: "申请" title: "入会申请"
label: label:
name: "" pseudo: "昵称"
surname: "" civ: "称呼"
cross_cosplay: "你是否进行伪装/反串扮演 (Cross-Cosplay)"
trans: "是否提及跨性别身份?"
name: "姓氏"
surname: "名字"
email: "电子邮件" email: "电子邮件"
phone: "联系电话" phone: "电话号码"
birthdate: "出生日期" birthdate: "出生日期"
gender: "性" gender: "性取向"
pronouns: "首选代词" pronouns: "代词"
address: "邮寄地址" address: "邮寄地址"
zipcode: "邮政编码" zipcode: "邮政编码"
city: "城市" city: "城市"
@@ -880,23 +884,157 @@ form:
insta: "Instagram 链接" insta: "Instagram 链接"
tiktok: "TikTok 链接" tiktok: "TikTok 链接"
facebook: "Facebook 链接" facebook: "Facebook 链接"
who: "你是谁?(简单自我介绍" who: "你是谁? (自我介绍)"
role: "你希望担任什么角色?" role: "你希望担任什么角色?"
section: section:
social: "社交媒体与作品集" social: "社交媒体与作品集"
button: button:
submit: "提交申请" submit: "提交申请"
# 反馈信息 # 成功/错误提示 (Form Feedback)
form_feedback: form_feedback:
success: "您的申请已成功提交!委员会将快进行审核。" success: "您的申请已成功发送!理事会将快进行审核。"
error: "发生错误,请检查您的信息。" error: "发生错误,请检查您填写的信息。"
join_at: 'messages'
confirmation: confirmation:
title: "申请已收到! - E-Cosplay" title: "申请已收到! - E-Cosplay"
header: "收到申请" header: "收到,长官"
message: "您的入会申请已正式提交给委员会。我们将认真审核您的申请。" message: "您的入会申请已正式提交给理事会。我们将仔细审核您的申请。"
delay: delay:
label: "预计回复时间" label: "预计回复时间"
value: "7 到 10 个工作日" value: "7 到 10 个工作日"
back_home: "返回首页" back_home: "返回首页"
rule_link: "协会章程"
# 内部章程 (Internal Rules)
brand_name: "E-Cosplay"
rule_page_title: "内部管理章程"
rule_title: "内部管理章程"
# 前言 (Preamble)
rules_preamble_title: "前言"
rules_preamble_text: "协会理事会于 <span class='font-bold text-gray-900'>%date%</span> 的全体大会上召集,制定了本协会内部章程。章程已获投票通过,并于 <span class='font-bold text-yellow-600 italic'>%entry_date%</span> 起正式生效。"
# 第一条:入会
rules_art1_title: "第一条:会员入会"
rules_art1_p1: "任何希望加入协会的人员必须提交申请,并由<strong>理事会成员独家审核</strong>。"
rules_art1_p2: "理事会以外的每位成员均可对申请人发表意见。入会需经理事会<strong>全票通过</strong>且无创始成员反对,方可生效。"
rules_art1_transparency: "每位成员均可查阅包含具体投票结果的正式文件,如申请被拒绝,文件中将说明理由。"
# 第二条:退出、除名、身故
rules_art2_main_title: "第二条:退出 除名 身故"
rules_art2_1_title: "自愿退出"
rules_art2_1_p1: "会员可根据个人意愿,通过电子邮件 (contact@e-cosplay.fr)、信件、Discord 或 Messenger 提出退出申请。"
rules_art2_1_notice: "需提前 15 天通知,经理事会或会员申请可缩短此期限。"
rules_art2_2_title: "除名 (Exclusion)"
rules_art2_2_reason1: "在本年度内收到 3 次警告。"
rules_art2_2_reason2: "未缴纳会费 (逾期超过 2 个月)。"
rules_art2_2_reason3: "公开诋毁或严重损害协会形象。"
rules_art2_2_reason4: "破坏或窃取机密信息并提供给其他协会。"
rules_art2_2_reason5: "对协会成员有严重不尊重行为 (侮辱、攻击或伤害)。"
rules_art2_2_procedure: "除名由<strong>理事会在闭门会议中</strong>通过特别全体大会以<strong>简单多数</strong>决定。"
rules_art2_2_transparency: "正式文件将记录投票详情及除名的具体原因,供成员查阅。"
rules_art2_3_title: "身故"
rules_art2_3_p1: "如会员身故,其会员资格自动取消。会员身份仅限个人,不可由继承人继承。"
# 第三条:创始成员除名
rules_art3_title: "第三条:创始成员除名"
rules_art3_request: "除名创始成员必须由<strong>理事会和另一名创始成员</strong>共同提出申请。"
rules_art3_ballot_title: "秘密投票"
rules_art3_ballot_desc: "采用投票箱投票。完全匿名:票面上不会显示任何成员姓名,以保护投票者。"
rules_art3_majority_title: "双重多数"
rules_art3_majority_desc: "需同时获得理事会多数票和协会成员多数票。"
rules_art3_tally_title: "计票与透明度"
rules_art3_tally_p1: "只有提出申请的创始成员在计票开始前公开宣布其个人投票意向。"
rules_art3_tally_p2: "由该成员从票箱中抽取每张选票并大声宣布:“赞成”、“反对”或“弃权”。"
# 第四条:大会
rules_art4_title: "第四条:全体大会"
rules_art4_notice: "理事会应至少提前 1 个月通知成员,并注明地点、时间和议程。"
rules_art4_normal_title: "年度全体大会 (AG Normale)"
rules_art4_normal_desc: "每年举行一次,用于年度总结及理事会换届。"
rules_art4_extra_title: "特别全体大会"
rules_art4_extra_desc: "根据理事会需求或为准备特定活动而召开。"
# 第五条:费用报销
rules_art5_title: "第五条:报销津贴"
rules_art5_p1: "只有<strong>当选的理事会成员</strong>(或由理事会委派的成员)凭<strong>证明文件</strong>方可申请报销所产生的费用。"
rules_art5_stand_title: "关于活动与展位:"
rules_art5_stand_desc: "协会参展时,将优先要求主办方提供门票。如无法实现,理事会将根据财务状况研究是否予以资助。"
# 法律信息与托管
hosting_main_title: "法律信息与托管"
hosting_bg_text: "服务器 (SERVER)"
hosting_responsibilities_label: "责任声明"
hosting_tech_operator_title: "技术运营商"
hosting_tech_operator_name: "SARL SITECONSEIL"
hosting_tech_operator_address: "27 RUE LE SERURIER<br>02100 SAINT-QUENTIN"
hosting_tech_operator_siret: "SIRET: 41866405800025"
hosting_infrastructure_title: "云基础设施"
hosting_cloud_provider: "Google Cloud Platform (GCP)"
hosting_location_detail: "荷兰 (eu-west4)"
hosting_editor_title: "网站出版商"
hosting_editor_name: "E-Cosplay 协会"
hosting_editor_address: "42 rue de Saint-Quentin<br>02800 Beautor"
hosting_editor_email: "contact@e-cosplay.fr"
hosting_editor_note: "负责内容的法律合规性。"
hosting_tech_stack_title: "技术栈"
hosting_security_title: "安全"
hosting_services_label: "服务"
hosting_cloudflare_label: "Cloudflare"
hosting_cloudflare_desc: "CDN、代理及多层抗 DDoS 攻击保护。"
hosting_monitoring_label: "监控"
hosting_monitoring_desc: "自托管 Sentry实时错误检测。"
hosting_registrars_label: "域名注册商"
hosting_registrar_name: "Infomaniak Network SA"
hosting_dns_provider: "Cloudflare DNS"
hosting_mail_system_title: "邮件系统"
hosting_mail_system_desc: "内部邮件服务器通过 Amazon SES 转发,确保通知送达率。"
hosting_privacy_alert_label: "隐私权"
hosting_privacy_alert_desc: "我们的服务器和 Amazon SES 处理本网站发送的电子邮件内容和元数据。"
hosting_compliance_title: "合规与 GDPR"
hosting_compliance_desc: "基础设施配置符合欧盟境内的安全标准和 GDPR通用数据保护条例。"
hosting_signalement_label: "违规举报"
hosting_signalement_email: "signalement@siteconseil.fr"
# 技术补充 (Addendum)
rgpd_additif_title: "技术补充条款"
rgpd_additif_collecte_title: "极简与匿名化采集"
rgpd_additif_collecte_text: "网站严格限制采集运行所需的必要技术数据(错误日志、性能)。这些数据经过汇总处理,无法追溯到特定访问者。"
rgpd_additif_consent_title: "访问者分析"
rgpd_additif_consent_text: "仅在您通过 Cookie 栏明确同意后,才会进行详细的导航习惯分析。您可以自由拒绝。"
rgpd_additif_tls_title: "通信安全 (TLS/SSL)"
rgpd_additif_update: "技术补充条款更新于 2025年11月27日 17:00。"
rgpd_section5_p1_contact_intro: "如有任何个人数据相关问题或行使第 4 节所述权利,请联系我们的数据保护专员。"
rgpd_section5_p2_dpo_id: "官方 DPO 标识 (CNIL): DPO-167945"
rgpd_section4_p1_rights_intro: "根据欧洲法规,您对自己的数据拥有基本权利。我们承诺在 30 天法定限期内处理您的请求。"
# Cookie 政策
cookie_title: "Cookie 管理"
cookie_intro_title: "简介"
cookie_intro_text: "本政策旨在告知您在访问我们网站时,存放在您设备上的 Cookie 的性质、用途及管理方式。"
cookie_types_title: "Cookie 类型"
cookie_essential_label: "必要型"
cookie_essential_desc: "网站运行所必需的(会话、安全、购物车)。"
cookie_analytics_label: "性能型"
cookie_analytics_desc: "测量受众并分析导航以优化体验。"
cookie_marketing_label: "营销型"
cookie_marketing_desc: "用于展示相关广告的用户画像。"
cookie_list_title: "技术列表"
cookie_table_name: "Cookie 名称"
cookie_table_purpose: "用途"
cookie_table_duration: "有效期"
cookie_table_session_desc: "维护用户会话及表单安全。"
cookie_table_cfbm_desc: "防机器人保护 (由 Cloudflare 提供)。"
cookie_security_title: "安全合作伙伴"
cookie_security_desc: "我们使用 Cloudflare 保护基础设施免受攻击并优化性能。"
cookie_security_link: "Cloudflare 政策"
cookie_control_title: "浏览器控制"
cookie_control_desc: "您可以通过浏览器设置禁用 Cookie但这可能会影响网站的正常使用。"
cookie_cnil_btn: "管理 Cookie (CNIL 指南)"
cookie_consent_title: "同意声明"
cookie_consent_footer: "继续浏览即表示您同意使用服务运行所必需的 Cookie。"

View File

@@ -929,44 +929,181 @@ form:
autre: "Other / Custom" autre: "Other / Custom"
role: role:
cosplay: "Cosplayer" cosplay: "Cosplayer"
helper: "Helper (Staff)" helper: "Helper (Logistics)"
photographer: "Photographer" photographer: "Photographer"
other: "Other" other: "Other"
header: header:
title: "Application" title: "Application"
label: label:
pseudo: "Username / Handle"
civ: "Civility"
cross_cosplay: "Do you practice Cross-Cosplay?"
trans: "Mention transgender identity?"
name: "Last Name" name: "Last Name"
surname: "First Name" surname: "First Name"
email: "Email" email: "Email"
phone: "Phone Number" phone: "Phone"
birthdate: "Date of Birth" birthdate: "Date of Birth"
gender: "Gender" gender: "Orientation"
pronouns: "Pronouns" pronouns: "Pronouns"
address: "Mailing Address" address: "Mailing Address"
zipcode: "Zip Code" zipcode: "ZIP Code"
city: "City" city: "City"
discord: "Discord Account" discord: "Discord Account"
insta: "Instagram Link" insta: "Instagram Link"
tiktok: "TikTok Link" tiktok: "TikTok Link"
facebook: "Facebook Link" facebook: "Facebook Link"
who: "Who are you? (Quick introduction)" who: "Who are you? (Quick intro)"
role: "What role would you like to have?" role: "Which role would you like to take?"
section: section:
social: "Social Media & Portfolio" social: "Social Media & Portfolio"
button: button:
submit: "Submit my Application" submit: "Submit my application"
# Feedback Messages # Success / Error messages
form_feedback: form_feedback:
success: "Your application has been successfully submitted! The board will review it shortly." success: "Your application has been sent successfully! The board will review it soon."
error: "An error occurred. Please check your information." error: "An error occurred. Please check your information."
join_at: 'messages'
confirmation: confirmation:
title: "Application Received! - E-Cosplay" title: "Application received! - E-Cosplay"
header: "Message Received!" header: "Message received, Major!"
message: "Your membership application is officially in the hands of the board. We will review it carefully." message: "Your membership request is officially in the hands of the board. We will review it carefully."
delay: delay:
label: "Estimated response time" label: "Estimated response time"
value: "7 to 10 business days" value: "7 to 10 business days"
back_home: "Back to Home" back_home: "Back to home"
rule_link: "Association rules"
# Internal Rules
brand_name: "E-Cosplay"
rule_page_title: "Internal Rules"
rule_title: "Internal Rules"
# Preamble
rules_preamble_title: "Preamble"
rules_preamble_text: "The association board met on <span class='font-bold text-gray-900'>%date%</span> during the general assembly to establish the internal rules of the association. They were voted on and approved for official application starting from <span class='font-bold text-yellow-600 italic'>%entry_date%</span>."
# Article 1: Membership
rules_art1_title: "Member Membership"
rules_art1_p1: "Anyone wishing to join the association must submit an application reviewed <strong>only by the board members</strong>."
rules_art1_p2: "Each member outside the board may give their opinion on the candidate. Integration is validated if the board votes with <strong>full unanimity</strong> and no founding member opposes it."
rules_art1_transparency: "A final document showing who voted for and against will be available and consultable by each member with vote details, as well as the reason for rejection in case of refusal."
# Article 2: Resignation, Exclusion, Death
rules_art2_main_title: "Article 2: Resignation Exclusion Death"
rules_art2_1_title: "Resignation"
rules_art2_1_p1: "A member's resignation is possible by their own will via email (contact@e-cosplay.fr), letter, Discord, or Messenger."
rules_art2_1_notice: "A 15-day notice period is requested, which can be waived at the request of the board or the member."
rules_art2_2_title: "Exclusion"
rules_art2_2_reason1: "3 warnings received during the current year."
rules_art2_2_reason2: "Non-payment of membership fees (over 2 months late)."
rules_art2_2_reason3: "Public disparagement or serious damage to the association's image."
rules_art2_2_reason4: "Sabotage or theft of confidential information to give to other associations."
rules_art2_2_reason5: "Serious lack of respect toward an association member (insults, assault and battery)."
rules_art2_2_procedure: "Exclusion is decided by the <strong>board in a closed committee</strong> during an Extraordinary General Meeting by <strong>simple majority</strong>."
rules_art2_2_transparency: "A final document showing who voted for and against will be available and consultable by each member with the precise motive for exclusion."
rules_art2_3_title: "Death"
rules_art2_3_p1: "In case of death, the member's status is automatically revoked. Membership is strictly personal and not transferable to heirs."
# Article 3: Founder Exclusion
rules_art3_title: "Exclusion of a founding member"
rules_art3_request: "The exclusion of a founder must be requested jointly by <strong>the board and another founding member</strong>."
rules_art3_ballot_title: "Secret Ballot"
rules_art3_ballot_desc: "Ballot box vote. Total anonymity: no member's name will be given or written on the ballot to guarantee voter protection."
rules_art3_majority_title: "Double Majority"
rules_art3_majority_desc: "Requires a majority of the board combined with a majority of the association members."
rules_art3_tally_title: "Counting & Transparency"
rules_art3_tally_p1: "Only the founder who submitted the request publicly announces their personal voting intention before the count begins."
rules_art3_tally_p2: "They draw each ballot from the box and announce aloud: 'For', 'Against', or 'Blank'."
# Article 4: Assemblies
rules_art4_title: "General Assemblies"
rules_art4_notice: "Members are summoned by the board at least 1 month in advance with details of the location, time, and agenda."
rules_art4_normal_title: "Normal GA (Annual)"
rules_art4_normal_desc: "Held once a year for the annual report and board member renewal."
rules_art4_extra_title: "Extraordinary GA"
rules_art4_extra_desc: "Triggered according to the board's needs or for specific event preparations."
# Article 5: Reimbursements
rules_art5_title: "Reimbursement Allowances"
rules_art5_p1: "Only <strong>elected board members</strong> (or members commissioned by the board) can claim reimbursement for expenses incurred upon presentation of <strong>receipts</strong>."
rules_art5_stand_title: "During events & stands:"
rules_art5_stand_desc: "When a stand is held by the association, the organizer will be asked to cover the entry ticket first. If impossible, the board will study coverage based on treasury funds."
# Hosting
hosting_main_title: "Legal Information & Hosting"
hosting_bg_text: "SERVER"
hosting_responsibilities_label: "Responsibilities"
hosting_tech_operator_title: "Technical Operator"
hosting_tech_operator_name: "SARL SITECONSEIL"
hosting_tech_operator_address: "27 RUE LE SERURIER<br>02100 SAINT-QUENTIN"
hosting_tech_operator_siret: "SIRET: 41866405800025"
hosting_infrastructure_title: "Cloud Infrastructure"
hosting_cloud_provider: "Google Cloud Platform (GCP)"
hosting_location_detail: "Netherlands (eu-west4)"
hosting_editor_title: "Site Editor"
hosting_editor_name: "E-Cosplay Association"
hosting_editor_address: "42 rue de Saint-Quentin<br>02800 Beautor"
hosting_editor_email: "contact@e-cosplay.fr"
hosting_editor_note: "Responsible for legal compliance of content."
hosting_tech_stack_title: "Tech Stack"
hosting_security_title: "Security"
hosting_services_label: "Services"
hosting_cloudflare_label: "Cloudflare"
hosting_cloudflare_desc: "CDN, Proxy & Multi-layer Anti-DDoS Protection."
hosting_monitoring_label: "Monitoring"
hosting_monitoring_desc: "Self-Hosted Sentry: Real-time error detection."
hosting_registrars_label: "Registrars"
hosting_registrar_name: "Infomaniak Network SA"
hosting_dns_provider: "Cloudflare DNS"
hosting_mail_system_title: "Esy Mail System"
hosting_mail_system_desc: "Internal mail server (mail.esy-web.dev) with Amazon SES relay to guarantee notification deliverability."
hosting_privacy_alert_label: "Privacy"
hosting_privacy_alert_desc: "Our server and Amazon SES process the content and metadata of emails sent by the site."
hosting_compliance_title: "Compliance & GDPR"
hosting_compliance_desc: "Infrastructure (GCP, Cloudflare, Sentry) is configured to respect security standards and GDPR within the European Union."
hosting_signalement_label: "Report a violation"
hosting_signalement_email: "signalement@siteconseil.fr"
# Technical Addendum
rgpd_additif_title: "Technical Addendum"
rgpd_additif_collecte_title: "Minimal and Anonymized Collection"
rgpd_additif_collecte_text: "The site is strictly limited to collecting technical data necessary for proper functioning (error logs, performance). This data is aggregated so that it is impossible to trace back to a specific visitor."
rgpd_additif_consent_title: "Visitor Analysis"
rgpd_additif_consent_text: "Detailed analysis of browsing habits is carried out exclusively following explicit consent via our cookie banner. You are free to refuse."
rgpd_additif_tls_title: "Communication Security (TLS/SSL)"
rgpd_additif_update: "Technical Addendum updated on November 27, 2025 at 5:00 PM."
rgpd_section5_p1_contact_intro: "For any questions regarding your personal data or to exercise your rights mentioned in section 4, our delegate is at your disposal."
rgpd_section5_p2_dpo_id: "Official DPO Identifier (CNIL): DPO-167945"
rgpd_section4_p1_rights_intro: "In accordance with European regulations, you have fundamental rights over your data. We commit to processing any request within a legal period of 30 days."
# Cookies
cookie_title: "Cookie Management"
cookie_intro_title: "Introduction"
cookie_intro_text: "This policy informs you about the nature, use, and management of cookies placed on your terminal when you browse our site."
cookie_types_title: "Cookie Types"
cookie_essential_label: "Essential"
cookie_essential_desc: "Necessary for the site's operation (session, security, cart)."
cookie_analytics_label: "Performance"
cookie_analytics_desc: "Audience measurement and navigation analysis for improvement."
cookie_marketing_label: "Advertising"
cookie_marketing_desc: "Profiling for displaying relevant advertisements."
cookie_list_title: "Technical List"
cookie_table_name: "Cookie Name"
cookie_table_purpose: "Purpose"
cookie_table_duration: "Lifespan"
cookie_table_session_desc: "Maintaining user session and form security."
cookie_table_cf_bm_desc: "Protection against bots (provided by Cloudflare)."
cookie_security_title: "Security Partners"
cookie_security_desc: "We use Cloudflare to protect our infrastructure against attacks and optimize performance."
cookie_security_link: "Cloudflare Policy"
cookie_control_title: "Browser Control"
cookie_control_desc: "You can block cookies via your browser settings, but this may alter the site's operation."
cookie_cnil_btn: "How to control cookies (CNIL)"
cookie_consent_title: "Consent"
cookie_consent_footer: "By continuing to browse, you accept the use of cookies necessary for the operation of the service."

File diff suppressed because it is too large Load Diff

View File

@@ -936,12 +936,16 @@ form:
header: header:
title: "Candidature" title: "Candidature"
label: label:
pseudo: "Pseudo"
civ: "Civilité"
cross_cosplay: "Pratiques-tu le Cross-Cosplay ?"
trans: "Mentionner une transidentité ?"
name: "Nom" name: "Nom"
surname: "Prénom" surname: "Prénom"
email: "Email" email: "Email"
phone: "Téléphone" phone: "Téléphone"
birthdate: "Date de naissance" birthdate: "Date de naissance"
gender: "Sexe" gender: "Orientation"
pronouns: "Pronoms" pronouns: "Pronoms"
address: "Adresse postale" address: "Adresse postale"
zipcode: "Code Postal" zipcode: "Code Postal"
@@ -971,3 +975,151 @@ confirmation:
label: "Délai de réponse estimé" label: "Délai de réponse estimé"
value: "7 à 10 jours ouvrés" value: "7 à 10 jours ouvrés"
back_home: "Retour à l'accueil" back_home: "Retour à l'accueil"
rule_link: Réglement associations
# translations/messages.fr.yaml
brand_name: "E-Cosplay"
rule_page_title: "Règlement Intérieur"
rule_title: "Règlement Intérieur"
# Préambule
rules_preamble_title: "Préambule"
rules_preamble_text: "Le bureau de l'association s'est réuni le <span class='font-bold text-gray-900'>%date%</span> lors de l'assemblée générale afin d'établir le règlement intérieur de l'association. Il a été voté et approuvé pour une mise en application officielle à partir du <span class='font-bold text-yellow-600 italic'>%entry_date%</span>."
# Article 1 : Adhésion
rules_art1_title: "Adhésion d'un membre"
rules_art1_p1: "Toute personne voulant rejoindre lassociation doit déposer une candidature examinée <strong>uniquement par les membres du bureau</strong>."
rules_art1_p2: "Chaque membre à lextérieur du bureau pourra donner son avis sur la personne. L'intégration est validée si le bureau a voté à l<strong>unanimité complète</strong> et qu'aucun membre fondateur ne s'y est opposé."
rules_art1_transparency: "Un document définitif donnant qui a voté pour et contre sera disponible et consultable par chaque membre avec le détail des votes, ainsi que le motif du rejet en cas de refus."
# Article 2 : Démission, Exclusion, Décès
rules_art2_main_title: "Article 2 : Démission Exclusion Décès"
rules_art2_1_title: "La Démission"
rules_art2_1_p1: "La démission d'un membre est possible de sa propre volonté via mail (contact@e-cosplay.fr), lettre, Discord ou Messenger."
rules_art2_1_notice: "Un préavis de 15 jours est demandé, celui-ci peut être annulé sur demande du bureau ou du membre."
rules_art2_2_title: "L'Exclusion"
rules_art2_2_reason1: "3 avertissements reçus dans l'année en cours."
rules_art2_2_reason2: "Non-paiement de la cotisation (retard de +2 mois)."
rules_art2_2_reason3: "Dénigrement public ou atteinte grave à l'image de l'association."
rules_art2_2_reason4: "Sabotage ou vol d'informations confidentielles pour les donner à d'autres associations."
rules_art2_2_reason5: "Manque de respect grave à un membre de l'association (insultes, coups et blessures)."
rules_art2_2_procedure: "L'exclusion se fait sur <strong>décision du bureau en comité fermé</strong> lors d'une Assemblée Exceptionnelle à la <strong>majorité simple</strong>."
rules_art2_2_transparency: "Un document définitif donnant qui a voté pour et contre sera disponible et consultable par chaque membre avec le motif précis de l'exclusion."
rules_art2_3_title: "Le Décès"
rules_art2_3_p1: "En cas de décès, le statut du membre est révoqué de façon automatique. L'adhésion est strictement personnelle et n'est pas transmissible aux héritiers."
# Article 3 : Exclusion Fondateur
rules_art3_title: "Exclusion d'un membre fondateur"
rules_art3_request: "L'exclusion d'un fondateur doit être demandée conjointement par <strong>le bureau et un autre membre fondateur</strong>."
rules_art3_ballot_title: "Scrutin Secret"
rules_art3_ballot_desc: "Vote à l'urne. Anonymat total : aucun nom de membre ne sera donné ni écrit sur le bulletin pour garantir la protection des votants."
rules_art3_majority_title: "Double Majorité"
rules_art3_majority_desc: "Requiert la majorité du bureau cumulée à la majorité des membres de l'association."
rules_art3_tally_title: "Dépouillement & Transparence"
rules_art3_tally_p1: "Seul le fondateur ayant déposé la demande annonce publiquement son intention de vote personnelle avant le début du dépouillement."
rules_art3_tally_p2: "Il tire chaque bulletin de l'urne et annonce à voix haute : 'Pour', 'Contre' ou 'Blanc'."
# Article 4 : Assemblées
rules_art4_title: "Les Assemblées Générales"
rules_art4_notice: "Les membres sont convoqués par le bureau au moins 1 mois avant avec précision du lieu, de l'heure et de l'ordre du jour."
rules_art4_normal_title: "AG Normale (Annuelle)"
rules_art4_normal_desc: "A lieu une fois par an pour le bilan annuel et le renouvellement des membres du bureau."
rules_art4_extra_title: "AG Exceptionnelle"
rules_art4_extra_desc: "Déclenchée selon les besoins du bureau ou pour la préparation d'événements spécifiques."
# Article 5 : Indemnités
rules_art5_title: "Indemnités de remboursement"
rules_art5_p1: "Seuls les <strong>membres élus du bureau</strong> (ou membres missionnés par le bureau) peuvent prétendre au remboursement des frais engagés sur présentation de <strong>justificatifs</strong>."
rules_art5_stand_title: "Lors des événements & stands :"
rules_art5_stand_desc: "Lorsqu'un stand est tenu par l'association, la prise en charge du ticket d'entrée sera demandée en priorité à l'organisateur. Si impossible, le bureau étudiera une prise en charge selon la trésorerie."
hosting_main_title: "Informations Légales & Hébergement"
hosting_bg_text: "SERVER"
# Section Responsabilités
hosting_responsibilities_label: "Responsabilités"
# Opérateur Technique
hosting_tech_operator_title: "Opérateur Technique"
hosting_tech_operator_name: "SARL SITECONSEIL"
hosting_tech_operator_address: "27 RUE LE SERURIER<br>02100 SAINT-QUENTIN"
hosting_tech_operator_siret: "SIRET: 41866405800025"
# Infrastructure Cloud
hosting_infrastructure_title: "Infrastructure Cloud"
hosting_cloud_provider: "Google Cloud Platform (GCP)"
hosting_location_detail: "Pays-Bas (eu-west4)"
# Éditeur
hosting_editor_title: "Éditeur du Site"
hosting_editor_name: "Association E-Cosplay"
hosting_editor_address: "42 rue de Saint-Quentin<br>02800 Beautor"
hosting_editor_email: "contact@e-cosplay.fr"
hosting_editor_note: "Responsable de la conformité légale du contenu."
# Stack Technique
hosting_tech_stack_title: "Stack Technique"
hosting_security_title: "Sécurité"
hosting_services_label: "Services"
hosting_cloudflare_label: "Cloudflare"
hosting_cloudflare_desc: "CDN, Proxy & Protection Anti-DDoS multicouche."
hosting_monitoring_label: "Monitoring"
hosting_monitoring_desc: "Sentry Self-Hosted : Détection d'erreurs en temps réel."
hosting_registrars_label: "Registrars"
hosting_registrar_name: "Infomaniak Network SA"
hosting_dns_provider: "Cloudflare DNS"
# Système Mail
hosting_mail_system_title: "Esy Mail System"
hosting_mail_system_desc: "Serveur mail interne (mail.esy-web.dev) avec relais Amazon SES pour garantir la délivrabilité des notifications."
hosting_privacy_alert_label: "Confidentialité"
hosting_privacy_alert_desc: "Notre serveur et Amazon SES traitent le contenu et les métadonnées des e-mails envoyés par le site."
# Conformité
hosting_compliance_title: "Conformité & RGPD"
hosting_compliance_desc: "L'infrastructure (GCP, Cloudflare, Sentry) est configurée pour respecter les standards de sécurité et le RGPD au sein de l'Union Européenne."
hosting_signalement_label: "Signalement d'infraction"
hosting_signalement_email: "signalement@siteconseil.fr"
# --- ADDITIF TECHNIQUE SITECONSEIL ---
rgpd_additif_title: "Additif Technique"
rgpd_additif_collecte_title: "Collecte Minimale et Anonymisée"
rgpd_additif_collecte_text: "Le site se limite strictement à la collecte de données techniques nécessaires au bon fonctionnement (logs d'erreurs, performance). Ces données sont agrégées de manière à ce qu'il soit impossible de remonter à un visiteur spécifique."
rgpd_additif_consent_title: "Analyse des Visiteurs"
rgpd_additif_consent_text: "L'analyse détaillée des habitudes de navigation est effectuée exclusivement suite à un consentement explicite via notre bannière de cookies. Vous êtes libre de refuser."
rgpd_additif_tls_title: "Sécurité des Communications (TLS/SSL)"
rgpd_additif_update: "Additif Technique mis à jour le 27 Novembre 2025 à 17h00."
rgpd_section5_p1_contact_intro: "Pour toute question relative à vos données personnelles ou pour exercer vos droits cités en section 4, notre délégué est à votre disposition."
rgpd_section5_p2_dpo_id: "Identifiant DPO Officiel (CNIL) : DPO-167945"
rgpd_section4_p1_rights_intro: "Conformément à la réglementation européenne, vous disposez de droits fondamentaux sur vos données. Nous nous engageons à traiter toute demande dans un délai légal de 30 jours."
# --- PAGE COOKIES ---
cookie_title: "Gestion des Cookies"
cookie_intro_title: "Introduction"
cookie_intro_text: "Cette politique vous informe sur la nature, l'utilisation et la gestion des cookies déposés sur votre terminal lorsque vous naviguez sur notre site."
cookie_types_title: "Types de Cookies"
cookie_essential_label: "Essentiels"
cookie_essential_desc: "Nécessaires au fonctionnement du site (session, sécurité, panier)."
cookie_analytics_label: "Performance"
cookie_analytics_desc: "Mesure d'audience et analyse de la navigation pour amélioration."
cookie_marketing_label: "Publicité"
cookie_marketing_desc: "Profilage pour affichage de publicités pertinentes."
cookie_list_title: "Liste Technique"
cookie_table_name: "Nom du Cookie"
cookie_table_purpose: "Objectif"
cookie_table_duration: "Durée de Vie"
cookie_table_session_desc: "Maintien de la session utilisateur et sécurité des formulaires."
cookie_table_cfbm_desc: "Protection contre les bots (fourni par Cloudflare)."
cookie_security_title: "Partenaires Sécurité"
cookie_security_desc: "Nous utilisons Cloudflare pour protéger notre infrastructure contre les attaques et optimiser les performances."
cookie_security_link: "Politique de Cloudflare"
cookie_control_title: "Maîtrise du navigateur"
cookie_control_desc: "Vous pouvez bloquer les cookies via vos paramètres navigateur, mais cela peut altérer le fonctionnement du site."
cookie_cnil_btn: "Maîtriser les cookies (CNIL)"
cookie_consent_title: "Consentement"
cookie_consent_footer: "En continuant votre navigation, vous acceptez l'usage des cookies nécessaires au fonctionnement du service."

File diff suppressed because it is too large Load Diff