```diff
[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:
@@ -83,7 +83,7 @@ vich_uploader:
|
||||
delete_on_update: true
|
||||
delete_on_remove: true
|
||||
fiche:
|
||||
uri_prefix: /fiche_candidat
|
||||
uri_prefix: /storage/fiche_candidat
|
||||
upload_destination: '%kernel.project_dir%/public/storage/fiche_candidat'
|
||||
namer: Vich\UploaderBundle\Naming\UniqidNamer # Replaced namer
|
||||
inject_on_load: true
|
||||
|
||||
@@ -16,6 +16,7 @@ use App\Entity\Ag\MainSigned;
|
||||
use App\Entity\Ag\MainVote;
|
||||
use App\Entity\Event;
|
||||
use App\Entity\InviteEPage;
|
||||
use App\Entity\Join;
|
||||
use App\Entity\Members;
|
||||
use App\Entity\MembersCotisations;
|
||||
use App\Entity\Products;
|
||||
@@ -71,9 +72,68 @@ class AdminController extends AbstractController
|
||||
{
|
||||
return $this->render('admin/dashboard.twig', [
|
||||
'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'])]
|
||||
public function adminProducts(Request $request,EntityManagerInterface $entityManager,ProductsRepository $productsRepository): Response
|
||||
{
|
||||
|
||||
@@ -37,6 +37,13 @@ class LegalController extends AbstractController
|
||||
{
|
||||
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)]
|
||||
public function rgpd(): Response
|
||||
{
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Dto\Contact;
|
||||
|
||||
use PixelOpen\CloudflareTurnstileBundle\Type\TurnstileType;
|
||||
use Symfony\Component\Form\AbstractType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\EmailType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
|
||||
|
||||
@@ -21,6 +21,35 @@ class JoinType extends AbstractType
|
||||
public function buildForm(FormBuilderInterface $builder, array $options)
|
||||
{
|
||||
$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, [
|
||||
'label' => 'form.label.name',
|
||||
'required' => true,
|
||||
@@ -118,7 +147,6 @@ class JoinType extends AbstractType
|
||||
'label' => 'form.label.who',
|
||||
'required' => true,
|
||||
])
|
||||
->add('security', TurnstileType::class, ['attr' => ['data-action' => 'contact', 'data-theme' => 'dark'], 'label' => false])
|
||||
;
|
||||
}
|
||||
|
||||
|
||||
@@ -93,6 +93,18 @@ class Join
|
||||
#[ORM\Column(nullable: true)]
|
||||
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
|
||||
@@ -459,4 +471,52 @@ class Join
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ use Symfony\Component\HttpKernel\KernelEvents;
|
||||
class LocaleListener implements EventSubscriberInterface
|
||||
{
|
||||
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)
|
||||
|
||||
@@ -25,7 +25,7 @@ class SitemapSubscriber
|
||||
$urlContainer = $event->getUrlContainer();
|
||||
$urlGenerator = $event->getUrlGenerator();
|
||||
|
||||
$langs = ["fr","en","cn"];
|
||||
$langs = ["fr","en","cn","ger","es"];
|
||||
|
||||
$urlHome = new UrlConcrete($urlGenerator->generate('app_about', [], UrlGeneratorInterface::ABSOLUTE_URL));
|
||||
$decoratedUrlHome = new GoogleImageUrlDecorator($urlHome);
|
||||
@@ -167,7 +167,14 @@ class SitemapSubscriber
|
||||
}
|
||||
$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 =[
|
||||
"Tergnier",
|
||||
"Beautor",
|
||||
|
||||
@@ -39,10 +39,10 @@ class Candidat extends Fpdf
|
||||
|
||||
$this->SetFont('Arial', 'B', 16);
|
||||
$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->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';
|
||||
if (file_exists($logoPath)) {
|
||||
@@ -63,7 +63,7 @@ class Candidat extends Fpdf
|
||||
$this->SetFont('Arial', 'B', 9);
|
||||
$this->Cell(0, 1, '', 'T', 1, 'L');
|
||||
$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->Cell(35, 4, utf8_decode('Association :'), 0, 0);
|
||||
$this->SetFont('Arial', 'B', 9);
|
||||
@@ -78,10 +78,19 @@ class Candidat extends Fpdf
|
||||
|
||||
public function contentDetails()
|
||||
{
|
||||
// --- SECTION 1 : ÉTAT CIVIL ---
|
||||
// --- SECTION 1 : IDENTITÉ COSPLAY ---
|
||||
$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 ---
|
||||
$birthDate = $this->join->getDateBirth();
|
||||
@@ -91,29 +100,31 @@ class Candidat extends Fpdf
|
||||
if ($birthDate) {
|
||||
$age = $this->calculateAge($birthDate);
|
||||
$dateStr = $birthDate->format('d/m/Y');
|
||||
|
||||
// Texte de la date
|
||||
$this->SetFont('Arial', 'B', 10);
|
||||
$this->Cell(30, 7, $dateStr, 0, 0);
|
||||
|
||||
// Affichage de l'âge avec couleur
|
||||
if ($age >= 16) {
|
||||
$this->SetTextColor(0, 150, 0); // Vert
|
||||
} else {
|
||||
$this->SetTextColor(200, 0, 0); // Rouge
|
||||
}
|
||||
if ($age >= 16) { $this->SetTextColor(0, 120, 0); }
|
||||
else { $this->SetTextColor(200, 0, 0); }
|
||||
|
||||
$this->Cell(0, 7, utf8_decode(" (" . $age . " ans)"), 0, 1);
|
||||
$this->SetTextColor(0, 0, 0); // Reset noir
|
||||
$this->SetTextColor(0, 0, 0);
|
||||
} else {
|
||||
$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->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);
|
||||
|
||||
// --- SECTION 2 : CONTACT ---
|
||||
@@ -131,13 +142,13 @@ class Candidat extends Fpdf
|
||||
|
||||
$this->Ln(2);
|
||||
$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->MultiCell(0, 5, utf8_decode($this->join->getWho() ?? "Aucune description fournie."), 1, 'L');
|
||||
$this->Ln(5);
|
||||
|
||||
// --- 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('Instagram :', $this->join->getInstaLink() ?? 'N/A');
|
||||
$this->infoRow('TikTok :', $this->join->getTiktokLink() ?? 'N/A');
|
||||
@@ -160,9 +171,11 @@ class Candidat extends Fpdf
|
||||
|
||||
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->Cell(0, 8, utf8_decode(' ' . $title), 0, 1, 'L', true);
|
||||
$this->Cell(0, 8, utf8_decode(' ' . $title), 'L', 1, 'L', true);
|
||||
$this->Ln(2);
|
||||
}
|
||||
|
||||
@@ -171,6 +184,6 @@ class Candidat extends Fpdf
|
||||
$this->SetY(-15);
|
||||
$this->SetFont('Arial', 'I', 8);
|
||||
$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');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
Dashboard
|
||||
</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) -->
|
||||
<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>
|
||||
|
||||
159
templates/admin/join_edit.twig
Normal file
159
templates/admin/join_edit.twig
Normal 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 %}
|
||||
72
templates/admin/joint.twig
Normal file
72
templates/admin/joint.twig
Normal 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 %}
|
||||
@@ -189,7 +189,7 @@
|
||||
{% set current_route = app.request.attributes.get('_route','app_home') %}
|
||||
{% set current_params = app.request.attributes.get('_route_params',[]) %}
|
||||
{% set current_query = app.request.query.all %}
|
||||
{% for lang in ['fr', 'en','cn'] %}
|
||||
{% for lang in ['fr', 'en','cn','ger','es'] %}
|
||||
{% set is_active_lang = (app.request.locale == 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 %}">
|
||||
@@ -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_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_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>
|
||||
|
||||
@@ -54,7 +54,6 @@
|
||||
<section class="py-16 bg-gray-50 border-b-4 border-black">
|
||||
<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>
|
||||
|
||||
<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="text-[#E63946] text-4xl font-black mb-4">{{ 'process.unanimous.percent'|trans }}</div>
|
||||
@@ -63,7 +62,6 @@
|
||||
{{ 'process.unanimous.description'|trans|raw }}
|
||||
</p>
|
||||
</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="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>
|
||||
@@ -105,7 +103,6 @@
|
||||
<section class="py-20">
|
||||
<div class="container mx-auto px-6">
|
||||
<div class="grid lg:grid-cols-2 gap-12">
|
||||
{# Portfolio #}
|
||||
<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>
|
||||
@@ -113,7 +110,6 @@
|
||||
<p class="text-gray-600 font-bold">{{ 'services.portfolio.description'|trans }}</p>
|
||||
</div>
|
||||
</div>
|
||||
{# Handicap #}
|
||||
<div class="flex gap-6 items-start p-6 bg-gray-100 border-l-8 border-[#E63946]">
|
||||
<div class="text-5xl">♿</div>
|
||||
<div>
|
||||
@@ -141,6 +137,18 @@
|
||||
|
||||
{{ 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É #}
|
||||
<div class="grid md:grid-cols-2 gap-6">
|
||||
<div class="flex flex-col">
|
||||
@@ -153,6 +161,18 @@
|
||||
</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 #}
|
||||
<div class="grid md:grid-cols-2 gap-6">
|
||||
<div class="flex flex-col">
|
||||
@@ -201,22 +221,24 @@
|
||||
<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>
|
||||
<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.instaLink, {'label': 'form.label.insta'|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'}}) }}
|
||||
{{ form_row(form.facebookLink, {'label': 'form.label.facebook'|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 font-bold'}}) }}
|
||||
{{ 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 font-bold'}}) }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{# RÔLE & MOTIVATION #}
|
||||
<div class="flex flex-col">
|
||||
{{ 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 class="flex flex-col">
|
||||
{{ 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>
|
||||
|
||||
{# BOUTON ENVOI #}
|
||||
|
||||
@@ -3,7 +3,8 @@
|
||||
{% block title %}{{'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 %}
|
||||
|
||||
{% block breadcrumb_schema %}
|
||||
@@ -30,71 +31,119 @@
|
||||
{% endblock %}
|
||||
|
||||
{% 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">
|
||||
<h1 class="text-3xl font-extrabold text-gray-900 border-b-2 border-red-600 pb-4 mb-8">{{'cgu_page_title'|trans}}</h1>
|
||||
<main id="cgu" class="max-w-6xl mx-auto px-4 py-12 font-sans text-gray-800 bg-[#fbfbfb]">
|
||||
|
||||
<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 #}
|
||||
<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">
|
||||
<div class="space-y-20">
|
||||
|
||||
{# 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%': '<a href="' ~ app.request.schemeAndHttpHost ~ '" class="text-red-600 hover:underline">e-cosplay.fr</a>'
|
||||
'%link%': '<span class="text-indigo-600 underline">e-cosplay.fr</span>'
|
||||
})|raw}}
|
||||
</p>
|
||||
<p class="text-gray-700 mt-2">{{'cgu_section1_p2'|trans}}</p>
|
||||
<p class="text-sm leading-relaxed">{{'cgu_section1_p2'|trans}}</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<hr class="my-8 border-gray-200">
|
||||
|
||||
{# SECTION 2 : SERVICES PROPOSÉS #}
|
||||
<section class="mb-8">
|
||||
<h2 class="text-2xl font-semibold text-gray-800 mb-3">{{'cgu_section2_title'|trans}}</h2>
|
||||
<p class="text-gray-700">{{'cgu_section2_p1'|trans}}</p>
|
||||
|
||||
<p class="text-gray-700 mt-2">{{'cgu_section2_p2'|trans}}</p>
|
||||
<ul class="list-disc list-inside ml-4 mt-2 text-gray-700 space-y-1">
|
||||
<li>{{'cgu_section2_list1'|trans}}</li>
|
||||
<li>{{'cgu_section2_list2'|trans}}</li>
|
||||
<li>{{'cgu_section2_list3'|trans}}</li>
|
||||
</ul>
|
||||
{# 2. SERVICES PROPOSÉS #}
|
||||
<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_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>
|
||||
|
||||
<hr class="my-8 border-gray-200">
|
||||
|
||||
{# SECTION 3 : ACCÈS ET UTILISATION #}
|
||||
<section class="mb-8">
|
||||
<h2 class="text-2xl font-semibold text-gray-800 mb-3">{{'cgu_section3_title'|trans}}</h2>
|
||||
<p class="text-gray-700">{{'cgu_section3_p1'|trans}}</p>
|
||||
|
||||
<p class="text-gray-700 mt-2 font-semibold">{{'cgu_section3_subtitle1'|trans}}</p>
|
||||
<p class="text-gray-700">{{'cgu_section3_p2'|trans}}</p>
|
||||
|
||||
<p class="text-gray-700 mt-2 font-semibold">{{'cgu_section3_subtitle2'|trans}}</p>
|
||||
<p class="text-gray-700">{{'cgu_section3_p3'|trans}}</p>
|
||||
{# 3. ACCÈS ET UTILISATION #}
|
||||
<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_section3_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="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">
|
||||
|
||||
{# 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>
|
||||
{# 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>
|
||||
|
||||
<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>
|
||||
{# 5. DROIT APPLICABLE #}
|
||||
<section class="relative">
|
||||
<div class="bg-gray-900 text-white p-10 rounded-lg border-b-8 border-indigo-600 shadow-xl italic text-center">
|
||||
<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>
|
||||
|
||||
</div>
|
||||
</main>
|
||||
{% endblock %}
|
||||
|
||||
@@ -3,7 +3,8 @@
|
||||
{% block title %}{{'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 %}
|
||||
|
||||
{% block breadcrumb_schema %}
|
||||
@@ -30,58 +31,141 @@
|
||||
{% endblock %}
|
||||
|
||||
{% 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">
|
||||
<h1 class="text-3xl font-extrabold text-gray-900 border-b-2 border-red-600 pb-4 mb-8">{{'cookie_page_title'|trans}}</h1>
|
||||
<main id="cookies" class="max-w-6xl mx-auto px-4 py-12 font-sans text-gray-800 bg-[#fbfbfb]">
|
||||
|
||||
<section class="mb-8">
|
||||
<h2 class="text-2xl font-semibold text-gray-800 mb-3">{{'cookie_section1_title'|trans}}</h2>
|
||||
<p class="text-gray-700">{{'cookie_section1_p1'|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">
|
||||
{{ '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>
|
||||
|
||||
<div class="space-y-24">
|
||||
|
||||
{# SECTION 1 : INTRODUCTION #}
|
||||
<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>
|
||||
|
||||
<hr class="my-8 border-gray-200">
|
||||
|
||||
<section class="mb-8">
|
||||
<h2 class="text-2xl font-semibold text-gray-800 mb-3">{{'cookie_section2_title'|trans}}</h2>
|
||||
|
||||
<p class="text-gray-700 font-bold mb-2">{{'cookie_section2_p1_commitment'|trans}}</p>
|
||||
|
||||
<p class="text-gray-700">{{'cookie_section2_p2_privacy'|trans}}</p>
|
||||
|
||||
<p class="text-gray-700 mt-4">{{'cookie_section2_p3_type_intro'|trans}}</p>
|
||||
<ul class="list-disc list-inside ml-4 mt-2 text-gray-700 space-y-1">
|
||||
<li>
|
||||
<strong>{{'cookie_type_functional_strong'|trans}} :</strong>
|
||||
{{'cookie_type_functional_details'|trans}}
|
||||
</li>
|
||||
</ul>
|
||||
{# 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>
|
||||
|
||||
<hr class="my-8 border-gray-200">
|
||||
{# 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>
|
||||
|
||||
<section class="mb-8">
|
||||
<h2 class="text-2xl font-semibold text-gray-800 mb-3">{{'cookie_section3_title'|trans}}</h2>
|
||||
<p class="text-gray-700">{{'cookie_section3_p1_browser_config'|trans}}</p>
|
||||
<p class="text-gray-700 mt-2">{{'cookie_section3_p2_refusal_impact'|trans}}</p>
|
||||
<p class="text-gray-700 mt-4">{{'cookie_section3_p3_instructions_intro'|trans}}</p>
|
||||
<ul class="list-disc list-inside ml-4 mt-2 text-gray-700 space-y-1">
|
||||
<li>
|
||||
{{'cookie_browser_chrome'|trans}} :
|
||||
<a href="https://support.google.com/chrome/answer/95647" target="_blank" class="text-red-600 hover:underline">{{'cookie_browser_link_chrome'|trans}}</a>
|
||||
</li>
|
||||
<li>
|
||||
{{'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 4 : PARTENAIRES 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. {{ 'cookie_security_title'|trans }}
|
||||
</span>
|
||||
</div>
|
||||
<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>
|
||||
|
||||
{# 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 6 : CONSENTEMENT FINAL #}
|
||||
<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. {{ 'cookie_consent_title'|trans }}
|
||||
</span>
|
||||
</div>
|
||||
<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">
|
||||
{{ 'cookie_consent_footer'|trans }}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
</main>
|
||||
{% endblock %}
|
||||
|
||||
@@ -3,79 +3,149 @@
|
||||
{% block title %}{{'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 %}
|
||||
<div class="max-w-4xl mx-auto py-12 px-4 sm:px-6 lg:px-8 bg-white shadow-lg rounded-lg">
|
||||
<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>
|
||||
<main id="hosting" class="max-w-6xl mx-auto px-4 py-12 font-sans text-gray-800 bg-[#fbfbfb]">
|
||||
|
||||
<section class="mb-8">
|
||||
<h2 class="text-2xl font-semibold text-gray-800 mb-3">{{'hosting_section1_title'|trans}}</h2>
|
||||
{# Header Dynamique Style Esport #}
|
||||
<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">
|
||||
{{'hosting_section1_p1'|trans({
|
||||
'%site_url%': app.request.schemeAndHttpHost
|
||||
})|raw}}
|
||||
<div class="space-y-24">
|
||||
|
||||
{# SECTION 1 : OPÉRATEUR 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">
|
||||
// 1. {{ 'hosting_tech_operator_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="bg-gray-50 p-6 border-l-4 border-gray-900 skew-x-[-2deg]">
|
||||
<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>
|
||||
|
||||
<ul class="list-disc list-inside ml-4 mt-4 text-gray-700 space-y-2">
|
||||
<li><strong>{{'hosting_label_host_name'|trans}} :</strong> Google Cloud Platform</li>
|
||||
<li><strong>{{'hosting_label_service_used'|trans}} :</strong> {{'hosting_service_compute_cloud'|trans}}</li>
|
||||
<li><strong>{{'hosting_label_company'|trans}} :</strong> Google LLC</li>
|
||||
<li><strong>{{'hosting_label_address'|trans}} :</strong> 1600 Amphitheatre Parkway, Mountain View, CA 94043, États-Unis</li>
|
||||
<li><strong>{{'hosting_label_data_location'|trans}} :</strong> {{'hosting_data_location_details'|trans}}</li>
|
||||
<li><strong>{{'hosting_label_contact'|trans}} :</strong> {{'hosting_contact_details'|trans}}</li>
|
||||
</ul>
|
||||
<p class="text-sm italic text-gray-500 mt-4">{{'hosting_section1_disclaimer'|trans}}</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">
|
||||
<h2 class="text-2xl font-semibold text-gray-800 mb-3">{{'hosting_section2_title'|trans}}</h2>
|
||||
{# SECTION 3 : ÉDITEUR DU SITE #}
|
||||
<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>
|
||||
<ul class="list-disc list-inside ml-4 mt-2 text-gray-700 space-y-1">
|
||||
<li><strong>{{'hosting_label_role'|trans}} :</strong> {{'hosting_cloudflare_role'|trans}}</li>
|
||||
<li><strong>{{'hosting_label_company'|trans}} :</strong> Cloudflare, Inc.</li>
|
||||
<li><strong>{{'hosting_label_address'|trans}} :</strong> 101 Townsend St, San Francisco, CA 94107, États-Unis.</li>
|
||||
</ul>
|
||||
<p class="text-sm italic text-gray-500 mt-1">{{'hosting_cloudflare_disclaimer'|trans}}</p>
|
||||
{# SECTION 5 : SYSTÈME DE MESSAGERIE #}
|
||||
<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. {{ 'hosting_mail_system_title'|trans }}
|
||||
</span>
|
||||
</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>
|
||||
<ul class="list-disc list-inside ml-4 mt-2 text-gray-700 space-y-1">
|
||||
<li><strong>{{'hosting_label_role'|trans}} :</strong> {{'hosting_aws_role'|trans}}</li>
|
||||
<li><strong>{{'hosting_label_company'|trans}} :</strong> Amazon Web Services, Inc.</li>
|
||||
<li><strong>{{'hosting_label_address'|trans}} :</strong> 410 Terry Avenue North, Seattle, WA 98109-5210, États-Unis.</li>
|
||||
</ul>
|
||||
<p class="text-sm italic text-gray-500 mt-1">{{'hosting_aws_disclaimer'|trans}}</p>
|
||||
{# SECTION 6 : CONFORMITÉ & SIGNALEMENT #}
|
||||
<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. {{ 'hosting_compliance_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-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>
|
||||
</main>
|
||||
{% endblock %}
|
||||
|
||||
@@ -3,7 +3,8 @@
|
||||
{% block title %}{{'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 %}
|
||||
|
||||
{% block breadcrumb_schema %}
|
||||
@@ -30,130 +31,133 @@
|
||||
{% endblock %}
|
||||
|
||||
{% 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">
|
||||
<h1 class="text-3xl font-extrabold text-gray-900 border-b-2 border-red-600 pb-4 mb-8">{{'legal_page_title'|trans}}</h1>
|
||||
<main id="legal" 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">
|
||||
{{ '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 #}
|
||||
<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>
|
||||
<div class="space-y-20">
|
||||
|
||||
<p class="text-gray-700 mt-2">{{'legal_section1_p2_intro'|trans}}</p>
|
||||
<ul class="list-disc list-inside ml-4 mt-2 text-gray-700 space-y-1">
|
||||
<li>{{'legal_section1_list1'|trans}}</li>
|
||||
<li>{{'legal_section1_list2'|trans}}</li>
|
||||
<li>{{'legal_section1_list3'|trans}}</li>
|
||||
<li><strong>{{'legal_section1_list4_strong'|trans}} :</strong> {{'legal_section1_list4_details'|trans}}</li>
|
||||
{# 1. OBJET DU SITE #}
|
||||
<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_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">
|
||||
<p class="mb-4 text-gray-900 font-bold">{{'legal_section1_p1'|trans({'%site_url%': app.request.schemeAndHttpHost})|raw}}</p>
|
||||
<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">
|
||||
|
||||
{# SECTION 2 : ÉDITEUR #}
|
||||
<section class="mb-8">
|
||||
<h2 class="text-2xl font-semibold text-gray-800 mb-3">{{'legal_section2_title'|trans}}</h2>
|
||||
<p class="text-gray-700">{{'legal_section2_p1_editor_intro'|trans}}</p>
|
||||
|
||||
<ul class="list-disc list-inside ml-4 mt-2 text-gray-700 space-y-1">
|
||||
<li><strong>{{'legal_label_association_name'|trans}} :</strong> E-Cosplay</li>
|
||||
<li><strong>{{'legal_label_legal_status'|trans}} :</strong> {{'legal_status_details'|trans}}</li>
|
||||
<li><strong>{{'legal_label_rna'|trans}} :</strong> W022006988</li>
|
||||
<li><strong>{{'legal_label_siren'|trans}} :</strong> 943121517</li>
|
||||
<li><strong>{{'legal_label_address'|trans}} :</strong> 42 rue de Saint-Quentin, 02800 Beautor, FRANCE</li>
|
||||
<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>
|
||||
<li><strong>{{'legal_label_publication_director'|trans}} :</strong> Serreau Jovann - ShokoCosplay</li>
|
||||
</ul>
|
||||
{# 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>
|
||||
|
||||
<hr class="my-8 border-gray-200">
|
||||
|
||||
{# SECTION 3 : HÉBERGEMENT #}
|
||||
<section class="mb-8">
|
||||
<h2 class="text-2xl font-semibold text-gray-800 mb-3">{{'legal_section3_title'|trans}}</h2>
|
||||
<p class="text-gray-700">{{'legal_section3_p1_host_intro'|trans}}</p>
|
||||
|
||||
<ul class="list-disc list-inside ml-4 mt-2 text-gray-700 space-y-1">
|
||||
<li><strong>{{'hosting_label_host_name'|trans}} :</strong> Google Cloud Platform</li>
|
||||
<li><strong>{{'hosting_label_company'|trans}} :</strong> Google LLC</li>
|
||||
<li><strong>{{'legal_label_address'|trans}} :</strong> {{'legal_host_address'|trans}}</li>
|
||||
<li><strong>{{'hosting_label_data_location'|trans}} :</strong> {{'legal_host_data_location'|trans}}</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<hr class="my-8 border-gray-200">
|
||||
|
||||
{# SECTION 4 : PROPRIÉTÉ INTELLECTUELLE ET DROIT À L'IMAGE #}
|
||||
<section class="mb-8">
|
||||
<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 #}
|
||||
{# 3. HÉBERGEMENT & 4. PROPRIÉTÉ #}
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-12">
|
||||
<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>
|
||||
<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>
|
||||
|
||||
<section>
|
||||
<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_section4_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="text-gray-700 leading-tight mb-2">{{'legal_section4_p1_ip'|trans}}</p>
|
||||
<p class="font-bold text-red-600 uppercase text-xs tracking-tighter">{{'legal_section4_p4_reproduction'|trans}}</p>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
{# 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>
|
||||
|
||||
{# 6. PARTENAIRES & 7. RESPONSABILITÉ #}
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-12">
|
||||
<section>
|
||||
<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>
|
||||
|
||||
<section>
|
||||
<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_section7_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_section7_p1_liability'|trans({'%site_url%': app.request.schemeAndHttpHost})|raw}}
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
{# 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>
|
||||
|
||||
</div>
|
||||
</main>
|
||||
{% endblock %}
|
||||
|
||||
@@ -3,158 +3,153 @@
|
||||
{% block title %}{{'rgpd_page_title'|trans}}{% endblock %}
|
||||
{% block meta_description %}{{'rgpd_page_title'|trans}}{% endblock %}
|
||||
|
||||
{% block canonical_url %}<link rel="canonical" href="{{ url('app_rgpd') }}" />
|
||||
{% 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": "{{'home_title'|trans }}",
|
||||
"item": "{{ app.request.schemeAndHttpHost }}{{ app.request.pathInfo }}"
|
||||
}
|
||||
]
|
||||
}
|
||||
</script>
|
||||
{% block canonical_url %}
|
||||
<link rel="canonical" href="{{ url('app_rgpd') }}" />
|
||||
{% endblock %}
|
||||
|
||||
{% 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">
|
||||
<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>
|
||||
<main id="rgpd" class="max-w-6xl mx-auto px-4 py-12 font-sans text-gray-800 bg-[#fbfbfb]">
|
||||
|
||||
<section class="mb-8">
|
||||
<h2 class="text-2xl font-semibold text-gray-800 mb-3">{{'rgpd_section1_title'|trans}}</h2>
|
||||
<p class="text-gray-700">{{'rgpd_section1_p1'|trans}}</p>
|
||||
{# Header Principal #}
|
||||
<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">
|
||||
// {{ '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>
|
||||
|
||||
<div class="space-y-24">
|
||||
|
||||
{# SECTION 1 #}
|
||||
<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>
|
||||
|
||||
<hr class="my-8 border-gray-200">
|
||||
|
||||
<section class="mb-8">
|
||||
<h2 class="text-2xl font-semibold text-gray-800 mb-3">{{'rgpd_section2_title'|trans}}</h2>
|
||||
|
||||
<p class="text-gray-700 font-bold mb-2">{{'rgpd_section2_p1_commitment'|trans}}</p>
|
||||
|
||||
<p class="text-gray-700">{{'rgpd_section2_p2_data_collected'|trans}}</p>
|
||||
|
||||
<ul class="list-disc list-inside ml-4 mt-4 text-gray-700 space-y-2">
|
||||
<li>
|
||||
<strong>{{'rgpd_contact_form_title'|trans}} :</strong>
|
||||
{{'rgpd_contact_form_details'|trans}}
|
||||
</li>
|
||||
<li>
|
||||
<strong>{{'rgpd_contest_form_title'|trans}} :</strong>
|
||||
{{'rgpd_contest_form_details'|trans}}
|
||||
</li>
|
||||
<li>
|
||||
<strong>{{'rgpd_no_other_collection_title'|trans}} :</strong>
|
||||
{{'rgpd_no_other_collection_details'|trans}}
|
||||
</li>
|
||||
</ul>
|
||||
{# 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>
|
||||
|
||||
<hr class="my-8 border-gray-200">
|
||||
|
||||
<section class="mb-8">
|
||||
<h2 class="text-2xl font-semibold text-gray-800 mb-3">{{'rgpd_section3_title'|trans}}</h2>
|
||||
|
||||
<h3 class="text-xl font-medium text-gray-800 mt-4">{{'rgpd_section3_subtitle1'|trans}}</h3>
|
||||
<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>
|
||||
<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">
|
||||
{# 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%': '<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>'
|
||||
'%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}}
|
||||
</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>
|
||||
</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>
|
||||
|
||||
<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>
|
||||
{# SECTION 4 #}
|
||||
<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_section4_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">
|
||||
<p class="text-sm italic leading-relaxed text-gray-600">{{'rgpd_section4_p1_rights_intro'|trans}}</p>
|
||||
<ul class="space-y-3 text-sm italic font-black uppercase tracking-tighter text-gray-900">
|
||||
<li class="flex items-center gap-2"><span class="w-2 h-2 bg-yellow-500"></span> {{'rgpd_right_access'|trans}}</li>
|
||||
<li class="flex items-center gap-2"><span class="w-2 h-2 bg-yellow-500"></span> {{'rgpd_right_rectification'|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>
|
||||
</div>
|
||||
</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">
|
||||
<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 6 (ADDITIF 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">
|
||||
// 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>
|
||||
|
||||
</div>
|
||||
|
||||
</main>
|
||||
{% endblock %}
|
||||
|
||||
190
templates/legal/rules.twig
Normal file
190
templates/legal/rules.twig
Normal 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 %}
|
||||
@@ -7,33 +7,37 @@
|
||||
{% block content %}
|
||||
<mj-section background-color="#ffffff" padding-top="20px">
|
||||
<mj-column width="100%">
|
||||
<mj-text font-size="20px" color="#2c3e50" font-weight="bold" align="center">
|
||||
Merci {{ join.name }} !
|
||||
{# Utilisation du Pseudo si disponible, sinon le Prénom #}
|
||||
<mj-text font-size="24px" color="#1A1A1A" font-weight="900" align="center" font-style="italic" text-transform="uppercase">
|
||||
MERCI {{ datas.join.pseudo|default(datas.join.name)|upper }} !
|
||||
</mj-text>
|
||||
<mj-text font-size="16px" color="#444444" line-height="24px" align="center">
|
||||
Nous avons bien reçu ta candidature pour rejoindre l'association <strong>E-Cosplay</strong>.
|
||||
Ta candidature pour rejoindre l'association <strong>E-Cosplay</strong> a bien été enregistrée.
|
||||
</mj-text>
|
||||
<mj-divider border-color="#2c3e50" border-width="2px" width="50px"></mj-divider>
|
||||
<mj-divider border-color="#FFC107" border-width="4px" width="60px"></mj-divider>
|
||||
</mj-column>
|
||||
</mj-section>
|
||||
|
||||
<mj-section background-color="#ffffff" padding-top="0px">
|
||||
<mj-column width="100%">
|
||||
<mj-text font-size="15px" color="#555555" 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.
|
||||
<mj-column width="90%" border="2px solid #1A1A1A" background-color="#FAFAFA" padding="15px">
|
||||
<mj-text font-size="15px" color="#1A1A1A" line-height="22px">
|
||||
Ton dossier est désormais entre les mains de notre équipe pour validation.
|
||||
</mj-text>
|
||||
<mj-text font-size="15px" color="#555555" line-height="22px">
|
||||
En attendant, n'hésite pas à nous suivre sur nos réseaux sociaux pour découvrir nos dernières activités !
|
||||
<mj-text font-size="15px" color="#1A1A1A" line-height="22px">
|
||||
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 font-size="15px" color="#1A1A1A" line-height="22px" font-weight="bold">
|
||||
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-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>
|
||||
Ceci est un message automatique, merci de ne pas y répondre directement.
|
||||
© {{ "now"|date("Y") }} - Ceci est un message automatique.
|
||||
</mj-text>
|
||||
</mj-column>
|
||||
</mj-section>
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
{% extends 'mails/base.twig' %}
|
||||
|
||||
{% block subject %}
|
||||
Nouvelle candidature
|
||||
[E-Cosplay] Nouvelle candidature : {{ datas.join.pseudo|default(datas.join.surname|upper) }}
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block content %}
|
||||
<mj-section background-color="#ffffff" padding-top="20px">
|
||||
<mj-column width="100%">
|
||||
@@ -13,37 +12,60 @@
|
||||
</mj-text>
|
||||
<mj-text font-size="16px" color="#555555" line-height="24px">
|
||||
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-column>
|
||||
</mj-section>
|
||||
|
||||
<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">
|
||||
<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 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 font-size="15px" color="#333333" padding-bottom="5px">
|
||||
<strong>Rôles :</strong>
|
||||
{% if join.role is iterable %}
|
||||
{{ join.role|join(', ') }}
|
||||
<strong>Rôles souhaités :</strong>
|
||||
{% if datas.join.role is iterable %}
|
||||
{{ datas.join.role|join(', ') }}
|
||||
{% else %}
|
||||
{{ join.role }}
|
||||
{{ datas.join.role }}
|
||||
{% endif %}
|
||||
</mj-text>
|
||||
<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-column>
|
||||
</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-text font-size="12px" color="#888888" align="center" padding-top="20px">
|
||||
Vous pouvez également retrouver le PDF généré en pièce jointe de ce mail.
|
||||
<mj-text font-size="12px" color="#E63946" font-weight="bold" align="center">
|
||||
Consultez le PDF joint pour le dossier complet et les liens réseaux sociaux.
|
||||
</mj-text>
|
||||
</mj-column>
|
||||
</mj-section>
|
||||
|
||||
52
templates/mails/candidat/refused.twig
Normal file
52
templates/mails/candidat/refused.twig
Normal 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 %}
|
||||
@@ -1,20 +1,26 @@
|
||||
{% extends 'mails/base.twig' %}
|
||||
|
||||
{% block subject %}
|
||||
Nouvelle candidature : {{ join.name }} {{ join.surname }}
|
||||
[NOUVELLE CANDIDATURE] - {{ join.pseudo|default(join.surname|upper) }} ({{ join.civ|upper }})
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
NOUVELLE CANDIDATURE REÇUE
|
||||
==========================
|
||||
NOUVELLE CANDIDATURE REÇUE - E-COSPLAY
|
||||
======================================
|
||||
|
||||
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 :
|
||||
---------------------
|
||||
- Nom complet : {{ join.surname|upper }} {{ join.name }}
|
||||
- Email : {{ join.email }}
|
||||
- Téléphone : {{ join.phone }}
|
||||
- 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é') }}
|
||||
- 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.
|
||||
© {{ "now"|date("Y") }} E-Cosplay Association
|
||||
{% endblock %}
|
||||
|
||||
28
templates/txt-mails/candidat/refused.twig
Normal file
28
templates/txt-mails/candidat/refused.twig
Normal 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 %}
|
||||
@@ -854,25 +854,29 @@ form:
|
||||
questioning: "探索中"
|
||||
other: "其他"
|
||||
pronouns:
|
||||
il: "他 (He)"
|
||||
elle: "她 (She)"
|
||||
iel: "他们 (They)"
|
||||
il: "他 (He/Him)"
|
||||
elle: "她 (She/Her)"
|
||||
iel: "他们 (They/Them)"
|
||||
autre: "其他 / 自定义"
|
||||
role:
|
||||
cosplay: "Cosplayer (角色扮演者)"
|
||||
helper: "Helper (后勤协助)"
|
||||
helper: "志愿者 (后勤协助)"
|
||||
photographer: "摄影师"
|
||||
other: "其他"
|
||||
header:
|
||||
title: "申请表"
|
||||
title: "入会申请"
|
||||
label:
|
||||
name: "姓"
|
||||
surname: "名"
|
||||
pseudo: "昵称"
|
||||
civ: "称呼"
|
||||
cross_cosplay: "你是否进行伪装/反串扮演 (Cross-Cosplay)?"
|
||||
trans: "是否提及跨性别身份?"
|
||||
name: "姓氏"
|
||||
surname: "名字"
|
||||
email: "电子邮件"
|
||||
phone: "联系电话"
|
||||
phone: "电话号码"
|
||||
birthdate: "出生日期"
|
||||
gender: "性别"
|
||||
pronouns: "首选代词"
|
||||
gender: "性取向"
|
||||
pronouns: "代词"
|
||||
address: "邮寄地址"
|
||||
zipcode: "邮政编码"
|
||||
city: "城市"
|
||||
@@ -880,23 +884,157 @@ form:
|
||||
insta: "Instagram 链接"
|
||||
tiktok: "TikTok 链接"
|
||||
facebook: "Facebook 链接"
|
||||
who: "你是谁?(简单自我介绍)"
|
||||
who: "你是谁? (自我介绍)"
|
||||
role: "你希望担任什么角色?"
|
||||
section:
|
||||
social: "社交媒体与作品集"
|
||||
button:
|
||||
submit: "提交申请"
|
||||
|
||||
# 反馈信息
|
||||
# 成功/错误提示 (Form Feedback)
|
||||
form_feedback:
|
||||
success: "您的申请已成功提交!委员会将尽快进行审核。"
|
||||
error: "发生错误,请检查您的信息。"
|
||||
success: "您的申请已成功发送!理事会将很快进行审核。"
|
||||
error: "发生错误,请检查您填写的信息。"
|
||||
join_at: 'messages'
|
||||
|
||||
confirmation:
|
||||
title: "申请已收到! - E-Cosplay"
|
||||
header: "收到申请!"
|
||||
message: "您的入会申请已正式提交给委员会。我们将认真审核您的申请。"
|
||||
header: "收到,长官!"
|
||||
message: "您的入会申请已正式提交给理事会。我们将仔细审核您的申请。"
|
||||
delay:
|
||||
label: "预计回复时间"
|
||||
value: "7 到 10 个工作日"
|
||||
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。"
|
||||
|
||||
@@ -929,44 +929,181 @@ form:
|
||||
autre: "Other / Custom"
|
||||
role:
|
||||
cosplay: "Cosplayer"
|
||||
helper: "Helper (Staff)"
|
||||
helper: "Helper (Logistics)"
|
||||
photographer: "Photographer"
|
||||
other: "Other"
|
||||
header:
|
||||
title: "Application"
|
||||
label:
|
||||
pseudo: "Username / Handle"
|
||||
civ: "Civility"
|
||||
cross_cosplay: "Do you practice Cross-Cosplay?"
|
||||
trans: "Mention transgender identity?"
|
||||
name: "Last Name"
|
||||
surname: "First Name"
|
||||
email: "Email"
|
||||
phone: "Phone Number"
|
||||
phone: "Phone"
|
||||
birthdate: "Date of Birth"
|
||||
gender: "Gender"
|
||||
gender: "Orientation"
|
||||
pronouns: "Pronouns"
|
||||
address: "Mailing Address"
|
||||
zipcode: "Zip Code"
|
||||
zipcode: "ZIP Code"
|
||||
city: "City"
|
||||
discord: "Discord Account"
|
||||
insta: "Instagram Link"
|
||||
tiktok: "TikTok Link"
|
||||
facebook: "Facebook Link"
|
||||
who: "Who are you? (Quick introduction)"
|
||||
role: "What role would you like to have?"
|
||||
who: "Who are you? (Quick intro)"
|
||||
role: "Which role would you like to take?"
|
||||
section:
|
||||
social: "Social Media & Portfolio"
|
||||
button:
|
||||
submit: "Submit my Application"
|
||||
submit: "Submit my application"
|
||||
|
||||
# Feedback Messages
|
||||
# Success / Error messages
|
||||
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."
|
||||
join_at: 'messages'
|
||||
|
||||
confirmation:
|
||||
title: "Application Received! - E-Cosplay"
|
||||
header: "Message Received!"
|
||||
message: "Your membership application is officially in the hands of the board. We will review it carefully."
|
||||
title: "Application received! - E-Cosplay"
|
||||
header: "Message received, Major!"
|
||||
message: "Your membership request is officially in the hands of the board. We will review it carefully."
|
||||
delay:
|
||||
label: "Estimated response time"
|
||||
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."
|
||||
|
||||
1106
translations/messages.es.yaml
Normal file
1106
translations/messages.es.yaml
Normal file
File diff suppressed because it is too large
Load Diff
@@ -936,12 +936,16 @@ form:
|
||||
header:
|
||||
title: "Candidature"
|
||||
label:
|
||||
pseudo: "Pseudo"
|
||||
civ: "Civilité"
|
||||
cross_cosplay: "Pratiques-tu le Cross-Cosplay ?"
|
||||
trans: "Mentionner une transidentité ?"
|
||||
name: "Nom"
|
||||
surname: "Prénom"
|
||||
email: "Email"
|
||||
phone: "Téléphone"
|
||||
birthdate: "Date de naissance"
|
||||
gender: "Sexe"
|
||||
gender: "Orientation"
|
||||
pronouns: "Pronoms"
|
||||
address: "Adresse postale"
|
||||
zipcode: "Code Postal"
|
||||
@@ -971,3 +975,151 @@ confirmation:
|
||||
label: "Délai de réponse estimé"
|
||||
value: "7 à 10 jours ouvrés"
|
||||
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 l’association doit déposer une candidature examinée <strong>uniquement par les membres du bureau</strong>."
|
||||
rules_art1_p2: "Chaque membre à l’exté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."
|
||||
|
||||
|
||||
1106
translations/messages.ger.yaml
Normal file
1106
translations/messages.ger.yaml
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user