Init project

This commit is contained in:
2026-01-11 16:19:42 +01:00
commit df59325836
380 changed files with 33805 additions and 0 deletions

View File

@@ -0,0 +1,113 @@
{% extends 'base_admin.html.twig' %}
{% block body %}
<main class="py-10 lg:pl-72">
<div class="px-4 sm:px-6 lg:px-8">
<div
class="divide-y divide-gray-200 overflow-hidden rounded-lg bg-gray-200 shadow-sm sm:grid sm:grid-cols-2 sm:divide-y-0 dark:divide-white/10 dark:bg-gray-900 dark:shadow-none dark:outline dark:-outline-offset-1 dark:outline-white/20"
>
<div
class="group relative rounded-tl-lg rounded-tr-lg border-gray-200 bg-white p-6 focus-within:outline-2 focus-within:-outline-offset-2 focus-within:outline-indigo-600 sm:rounded-tr-none sm:odd:not-nth-last-2:border-b sm:even:border-l sm:even:not-last:border-b dark:border-white/10 dark:bg-gray-800/50 dark:focus-within:outline-indigo-500"
>
<div>
<span
class="inline-flex rounded-lg bg-teal-50 p-3 text-teal-700 dark:bg-teal-500/10 dark:text-teal-400"
>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewbox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="size-6"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M12 7.5h1.5m-1.5 3h1.5m-7.5 3h7.5m-7.5 3h7.5m3-9h3.375c.621 0 1.125.504 1.125 1.125V18a2.25 2.25 0 0 1-2.25 2.25M16.5 7.5V18a2.25 2.25 0 0 0 2.25 2.25M16.5 7.5V4.875c0-.621-.504-1.125-1.125-1.125H4.125C3.504 3.75 3 4.254 3 4.875V18a2.25 2.25 0 0 0 2.25 2.25h13.5M6 7.5h3v3H6v-3Z"
/>
</svg>
</span>
</div>
<div class="mt-8">
<h3 class="text-base font-semibold text-gray-900 dark:text-white">
<a
href="{{ path('admin_news_index') }}"
class="focus:outline-hidden"
>
<!-- Extend touch target to entire panel -->
<span aria-hidden="true" class="absolute inset-0"></span>
Actualité
</a>
</h3>
<p class="mt-2 text-sm text-gray-500 dark:text-gray-400">
Retrouvez ici les dernières actualités et informations
importantes. Ce module regroupe les nouveautés, annonces et
événements à ne pas manquer.
</p>
</div>
<span
aria-hidden="true"
class="pointer-events-none absolute top-6 right-6 text-gray-300 group-hover:text-gray-400 dark:text-gray-500 dark:group-hover:text-gray-200"
>
<svg viewbox="0 0 24 24" fill="currentColor" class="size-6">
<path
d="M20 4h1a1 1 0 00-1-1v1zm-1 12a1 1 0 102 0h-2zM8 3a1 1 0 000 2V3zM3.293 19.293a1 1 0 101.414 1.414l-1.414-1.414zM19 4v12h2V4h-2zm1-1H8v2h12V3zm-.707.293l-16 16 1.414 1.414 16-16-1.414-1.414z"
/>
</svg>
</span>
</div>
<div
class="group relative border-gray-200 bg-white p-6 focus-within:outline-2 focus-within:-outline-offset-2 focus-within:outline-indigo-600 sm:rounded-tr-lg sm:odd:not-nth-last-2:border-b sm:even:border-l sm:even:not-last:border-b dark:border-white/10 dark:bg-gray-800/50 dark:focus-within:outline-indigo-500"
>
<div>
<span
class="inline-flex rounded-lg bg-purple-50 p-3 text-purple-700 dark:bg-purple-500/10 dark:text-purple-400"
>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewbox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="size-6"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="m2.25 15.75 5.159-5.159a2.25 2.25 0 0 1 3.182 0l5.159 5.159m-1.5-1.5 1.409-1.409a2.25 2.25 0 0 1 3.182 0l2.909 2.909m-18 3.75h16.5a1.5 1.5 0 0 0 1.5-1.5V6a1.5 1.5 0 0 0-1.5-1.5H3.75A1.5 1.5 0 0 0 2.25 6v12a1.5 1.5 0 0 0 1.5 1.5Zm10.5-11.25h.008v.008h-.008V8.25Zm.375 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Z"
/>
</svg>
</span>
</div>
<div class="mt-8">
<h3 class="text-base font-semibold text-gray-900 dark:text-white">
<a
href="{{ path('admin_image_index') }}"
class="focus:outline-hidden"
>
<!-- Extend touch target to entire panel -->
<span aria-hidden="true" class="absolute inset-0"></span>
Image
</a>
</h3>
<p class="mt-2 text-sm text-gray-500 dark:text-gray-400">
Gérez facilement vos images grâce à ce module dédié. Téléversez,
classez, prévisualisez et organisez vos visuels en toute
simplicité pour les utiliser dans vos contenus.
</p>
</div>
<span
aria-hidden="true"
class="pointer-events-none absolute top-6 right-6 text-gray-300 group-hover:text-gray-400 dark:text-gray-500 dark:group-hover:text-gray-200"
>
<svg viewbox="0 0 24 24" fill="currentColor" class="size-6">
<path
d="M20 4h1a1 1 0 00-1-1v1zm-1 12a1 1 0 102 0h-2zM8 3a1 1 0 000 2V3zM3.293 19.293a1 1 0 101.414 1.414l-1.414-1.414zM19 4v12h2V4h-2zm1-1H8v2h12V3zm-.707.293l-16 16 1.414 1.414 16-16-1.414-1.414z"
/>
</svg>
</span>
</div>
</div>
</div>
</main>
{% endblock %}

View File

@@ -0,0 +1,377 @@
<el-dialog>
<dialog id="sidebar" class="backdrop:bg-transparent lg:hidden">
<el-dialog-backdrop
class="fixed inset-0 bg-gray-900/80 transition-opacity duration-300 ease-linear data-closed:opacity-0"
></el-dialog-backdrop>
<div tabindex="0" class="fixed inset-0 flex focus:outline-none">
<el-dialog-panel
class="group/dialog-panel relative mr-16 flex w-full max-w-xs flex-1 transform transition duration-300 ease-in-out data-closed:-translate-x-full"
>
<div
class="absolute top-0 left-full flex w-16 justify-center pt-5 duration-300 ease-in-out group-data-closed/dialog-panel:opacity-0"
>
<button
type="button"
command="close"
commandfor="sidebar"
class="-m-2.5 p-2.5"
>
<span class="sr-only">Fermer sidebar</span>
<svg
viewbox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.5"
data-slot="icon"
aria-hidden="true"
class="size-6 text-white"
>
<path
d="M6 18 18 6M6 6l12 12"
stroke-linecap="round"
stroke-linejoin="round"
/>
</svg>
</button>
</div>
<!-- Sidebar component, swap this element with another sidebar if you like -->
<div
class="relative flex grow flex-col gap-y-5 overflow-y-auto bg-white px-6 pb-2"
>
<div class="relative flex h-16 shrink-0 items-center">
<img src="/images/logo.jpg" alt="Your Company" class="h-8 w-auto" />
</div>
<nav class="relative flex flex-1 flex-col">
<ul role="list" class="flex flex-1 flex-col gap-y-7">
<li>
<ul role="list" class="-mx-2 space-y-1">
<li>
<!-- Current: "bg-gray-50 text-amber-600", Default: "text-gray-700 hover:text-amber-600 hover:bg-gray-50" -->
<a
href="{{ path('admin_dashboard') }}"
class="group flex gap-x-3 rounded-md p-2 text-sm/6 font-semibold{% if path == '/admin' %} bg-gray-50 text-amber-600 {% else %} text-gray-700 hover:text-amber-600 hover:bg-gray-50 {% endif %}"
>
<svg
viewbox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.5"
data-slot="icon"
aria-hidden="true"
class="size-6 shrink-0{% if path == '/admin' %} text-amber-600 {% else %} text-gray-400 group-hover:text-amber-600{% endif %}"
>
<path
d="m2.25 12 8.954-8.955c.44-.439 1.152-.439 1.591 0L21.75 12M4.5 9.75v10.125c0 .621.504 1.125 1.125 1.125H9.75v-4.875c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21h4.125c.621 0 1.125-.504 1.125-1.125V9.75M8.25 21h8.25"
stroke-linecap="round"
stroke-linejoin="round"
/>
</svg>Tableau de bord
</a>
</li>
<li>
<a
href="{{ path('admin_news_index') }}"
class="group flex gap-x-3 rounded-md p-2 text-sm/6 font-semibold {% if path starts with '/admin/news' %} bg-gray-50 text-amber-600 {% else %} text-gray-700 hover:text-amber-600 hover:bg-gray-50 {% endif %}"
>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewbox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="size-6 shrink-0 {% if path starts with '/admin/news' %} text-amber-600 {% else %} text-gray-400 group-hover:text-amber-600{% endif %}"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M12 7.5h1.5m-1.5 3h1.5m-7.5 3h7.5m-7.5 3h7.5m3-9h3.375c.621 0 1.125.504 1.125 1.125V18a2.25 2.25 0 0 1-2.25 2.25M16.5 7.5V18a2.25 2.25 0 0 0 2.25 2.25M16.5 7.5V4.875c0-.621-.504-1.125-1.125-1.125H4.125C3.504 3.75 3 4.254 3 4.875V18a2.25 2.25 0 0 0 2.25 2.25h13.5M6 7.5h3v3H6v-3Z"
/>
</svg>Actualité
</a>
</li>
<li>
<a
href="{{ path('admin_image_index') }}"
class="group flex gap-x-3 rounded-md p-2 text-sm/6 font-semibold {% if path starts with '/admin/image' %} bg-gray-50 text-amber-600 {% else %} text-gray-700 hover:text-amber-600 hover:bg-gray-50 {% endif %}"
>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewbox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="size-6 shrink-0 {% if path starts with '/admin/image' %} text-amber-600 {% else %} text-gray-400 group-hover:text-amber-600{% endif %}"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="m2.25 15.75 5.159-5.159a2.25 2.25 0 0 1 3.182 0l5.159 5.159m-1.5-1.5 1.409-1.409a2.25 2.25 0 0 1 3.182 0l2.909 2.909m-18 3.75h16.5a1.5 1.5 0 0 0 1.5-1.5V6a1.5 1.5 0 0 0-1.5-1.5H3.75A1.5 1.5 0 0 0 2.25 6v12a1.5 1.5 0 0 0 1.5 1.5Zm10.5-11.25h.008v.008h-.008V8.25Zm.375 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Z"
/>
</svg>Image
</a>
</li>
</ul>
</li>
<li>
<div class="text-xs/6 font-semibold text-gray-400">
Liens utiles
</div>
<ul role="list" class="-mx-2 mt-2 space-y-1">
<li>
<a
target="_blank"
href="{{ path('home') }}"
class="group flex gap-x-3 rounded-md p-2 text-sm/6 font-semibold 0 text-gray-700 hover:bg-gray-50 hover:text-amber-600"
>
<span
class="flex size-6 shrink-0 items-center justify-center rounded-lg border border-gray-200 bg-white text-[0.625rem] font-medium text-gray-400 group-hover:border-amber-600 group-hover:text-amber-600"
>
A
</span>
<span class="truncate">Accès au site</span>
</a>
</li>
<li>
<a
target="_blank"
href="/logout"
class="group flex gap-x-3 rounded-md p-2 text-sm/6 font-semibold 0 text-gray-700 hover:bg-gray-50 hover:text-amber-600"
>
<span
class="flex size-6 shrink-0 items-center justify-center rounded-lg border border-gray-200 bg-white text-[0.625rem] font-medium text-gray-400 group-hover:border-amber-600 group-hover:text-amber-600"
>
D
</span>
<span class="truncate">Déconnexion</span>
</a>
</li>
</ul>
</li>
{% if 'ROLE_DEVELOPER' in app.user.roles %}
<li>
<div class="text-xs/6 font-semibold text-gray-400">
Développeur
</div>
<ul role="list" class="-mx-2 mt-2 space-y-1">
<li>
<!-- Current: "bg-gray-50 text-amber-600", Default: "text-gray-700 hover:text-amber-600 hover:bg-gray-50" -->
<a
href="{{ path('admin_feature_index') }}"
class="group flex gap-x-3 rounded-md p-2 text-sm/6 font-semibold 0{% if path starts with '/admin/feature' %} bg-gray-50 text-amber-600 {% else %} text-gray-700 hover:bg-gray-50 hover:text-amber-600{% endif %}"
>
<span
class="flex size-6 shrink-0 items-center justify-center rounded-lg border border-gray-200 bg-white text-[0.625rem] font-medium {% if path starts with '/admin/feature' %} border-amber-600 text-amber-600 {% else %} text-gray-400 group-hover:border-amber-600 group-hover:text-amber-600{% endif %}"
>
F
</span>
<span class="truncate">Fonctionnalité</span>
</a>
</li>
</ul>
</li>
{% endif %}
</ul>
</nav>
</div>
</el-dialog-panel>
</div>
</dialog>
</el-dialog>
<!-- Static sidebar for desktop -->
<div class="hidden lg:fixed lg:inset-y-0 lg:z-50 lg:flex lg:w-72 lg:flex-col">
<!-- Sidebar component, swap this element with another sidebar if you like -->
<div
class="relative flex grow flex-col gap-y-5 overflow-y-auto border-r border-gray-200 bg-white px-6"
>
<div class="relative flex h-16 shrink-0 items-center">
<img src="/images/logo.jpg" alt="Your Company" class="h-8 w-auto" />
</div>
<nav class="relative flex flex-1 flex-col">
<ul role="list" class="flex flex-1 flex-col gap-y-7">
<li>
<ul role="list" class="-mx-2 space-y-1">
<li>
<!-- Current: "bg-gray-50 text-amber-600", Default: "text-gray-700 hover:text-amber-600 hover:bg-gray-50" -->
<a
href="{{ path('admin_dashboard') }}"
class="group flex gap-x-3 rounded-md p-2 text-sm/6 font-semibold {% if path == '/admin' %} bg-gray-50 text-amber-600 {% else %} text-gray-700 hover:text-amber-600 hover:bg-gray-50 {% endif %}"
>
<svg
viewbox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.5"
data-slot="icon"
aria-hidden="true"
class="size-6 shrink-0 {% if path == '/admin' %} text-amber-600 {% else %} text-gray-400 group-hover:text-amber-600{% endif %}"
>
<path
d="m2.25 12 8.954-8.955c.44-.439 1.152-.439 1.591 0L21.75 12M4.5 9.75v10.125c0 .621.504 1.125 1.125 1.125H9.75v-4.875c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21h4.125c.621 0 1.125-.504 1.125-1.125V9.75M8.25 21h8.25"
stroke-linecap="round"
stroke-linejoin="round"
/>
</svg>Tableau de bord
</a>
</li>
<li>
<a
href="{{ path('admin_news_index') }}"
class="group flex gap-x-3 rounded-md p-2 text-sm/6 font-semibold {% if path starts with '/admin/news' %} bg-gray-50 text-amber-600 {% else %} text-gray-700 hover:text-amber-600 hover:bg-gray-50 {% endif %}"
>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewbox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="size-6 shrink-0 {% if path starts with '/admin/news' %} text-amber-600 {% else %} text-gray-400 group-hover:text-amber-600{% endif %}"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M12 7.5h1.5m-1.5 3h1.5m-7.5 3h7.5m-7.5 3h7.5m3-9h3.375c.621 0 1.125.504 1.125 1.125V18a2.25 2.25 0 0 1-2.25 2.25M16.5 7.5V18a2.25 2.25 0 0 0 2.25 2.25M16.5 7.5V4.875c0-.621-.504-1.125-1.125-1.125H4.125C3.504 3.75 3 4.254 3 4.875V18a2.25 2.25 0 0 0 2.25 2.25h13.5M6 7.5h3v3H6v-3Z"
/>
</svg>Actualité
</a>
</li>
<li>
<a
href="{{ path('admin_image_index') }}"
class="group flex gap-x-3 rounded-md p-2 text-sm/6 font-semibold {% if path starts with '/admin/image' %} bg-gray-50 text-amber-600 {% else %} text-gray-700 hover:text-amber-600 hover:bg-gray-50 {% endif %}"
>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewbox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="size-6 shrink-0 {% if path starts with '/admin/image' %} text-amber-600 {% else %} text-gray-400 group-hover:text-amber-600{% endif %}"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="m2.25 15.75 5.159-5.159a2.25 2.25 0 0 1 3.182 0l5.159 5.159m-1.5-1.5 1.409-1.409a2.25 2.25 0 0 1 3.182 0l2.909 2.909m-18 3.75h16.5a1.5 1.5 0 0 0 1.5-1.5V6a1.5 1.5 0 0 0-1.5-1.5H3.75A1.5 1.5 0 0 0 2.25 6v12a1.5 1.5 0 0 0 1.5 1.5Zm10.5-11.25h.008v.008h-.008V8.25Zm.375 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Z"
/>
</svg>Image
</a>
</li>
</ul>
</li>
<li>
<div class="text-xs/6 font-semibold text-gray-400">
Liens utiles
</div>
<ul role="list" class="-mx-2 mt-2 space-y-1">
<li>
<a
target="_blank"
href="{{ path('home') }}"
class="group flex gap-x-3 rounded-md p-2 text-sm/6 font-semibold text-gray-700 hover:bg-gray-50 hover:text-amber-600"
>
<span
class="flex size-6 shrink-0 items-center justify-center rounded-lg border border-gray-200 bg-white text-[0.625rem] font-medium text-gray-400 group-hover:border-amber-600 group-hover:text-amber-600"
>
A
</span>
<span class="truncate">Accès au site</span>
</a>
</li>
<li>
<a
target="_blank"
href="/logout"
class="group flex gap-x-3 rounded-md p-2 text-sm/6 font-semibold text-gray-700 hover:bg-gray-50 hover:text-amber-600"
>
<span
class="flex size-6 shrink-0 items-center justify-center rounded-lg border border-gray-200 bg-white text-[0.625rem] font-medium text-gray-400 group-hover:border-amber-600 group-hover:text-amber-600"
>
D
</span>
<span class="truncate">Déconnexion</span>
</a>
</li>
</ul>
</li>
{% if 'ROLE_DEVELOPER' in app.user.roles %}
<li>
<div class="text-xs/6 font-semibold text-gray-400">
Développeur
</div>
<ul role="list" class="-mx-2 mt-2 space-y-1">
<li>
<a
href="{{ path('admin_feature_index') }}"
class="group flex gap-x-3 rounded-md p-2 text-sm/6 font-semibold hover:bg-gray-50 hover:text-amber-600{% if path starts with '/admin/feature' %} bg-gray-50 text-amber-600 {% else %} text-gray-700 hover:bg-gray-50 hover:text-amber-600{% endif %}"
>
<span
class="flex size-6 shrink-0 items-center justify-center rounded-lg border border-gray-200 bg-white text-[0.625rem] font-medium {% if path starts with '/admin/feature' %} border-amber-600 text-amber-600 {% else %} text-gray-400 group-hover:border-amber-600 group-hover:text-amber-600{% endif %}"
>
F
</span>
<span class="truncate">Fonctionnalité</span>
</a>
</li>
</ul>
</li>
{% endif %}
<li class="-mx-6 mt-auto">
<a
href="#"
class="flex items-center gap-x-4 px-6 py-3 text-sm/6 font-semibold text-gray-900 hover:bg-gray-50"
>
<img
src="/images/logo.jpg"
alt=""
class="size-8 rounded-full bg-gray-50 outline -outline-offset-1 outline-black/5"
/>
<span class="sr-only">Votre profile</span>
<span aria-hidden="true">Marie-Pierre</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
<div
class="sticky top-0 z-40 flex items-center gap-x-6 bg-white px-4 py-4 shadow-xs sm:px-6 lg:hidden"
>
<button
type="button"
command="show-modal"
commandfor="sidebar"
class="relative -m-2.5 p-2.5 text-gray-700 lg:hidden"
>
<span class="sr-only">Ouvrir barre de navigation latérale</span>
<svg
viewbox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.5"
data-slot="icon"
aria-hidden="true"
class="size-6"
>
<path
d="M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5"
stroke-linecap="round"
stroke-linejoin="round"
/>
</svg>
</button>
<div class="relative flex-1 text-sm/6 font-semibold text-gray-900">
{{ title }}
</div>
<a href="#" class="relative">
<span class="sr-only">Votre profile</span>
<img
src="/images/logo.jpg"
alt=""
class="size-8 rounded-full bg-gray-50 outline -outline-offset-1 outline-black/5"
/>
</a>
</div>

32
templates/base.html.twig Normal file
View File

@@ -0,0 +1,32 @@
<!DOCTYPE html>
<html class="h-full">
<head>
<meta charset="UTF-8" />
{% block metadata %}
{% endblock %}
<link
rel="icon"
href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 128 128%22><text y=%221.2em%22 font-size=%2296%22>⚫️</text><text y=%221.3em%22 x=%220.2em%22 font-size=%2276%22 fill=%22%23fff%22>sf</text></svg>"
/>
{% block stylesheets %}
{{ encore_entry_link_tags('app') }}
{% endblock %}
{% block javascripts %}
{{ encore_entry_script_tags('app') }}
<script
src="https://cdn.ckeditor.com/ckeditor5/47.3.0/ckeditor5.umd.js"
></script>
{% endblock %}
</head>
<body>
{{ render(controller('App\\Controller\\BaseController::header')) }}
{% block body %}
{% endblock %}
{{ render(controller('App\\Controller\\BaseController::footer')) }}
</body>
</html>

View File

@@ -0,0 +1,56 @@
<footer class="bg-amber-100">
<div class="mx-auto max-w-7xl overflow-hidden px-6 py-20 sm:py-24 lg:px-8">
<nav
aria-label="Footer"
class="-mb-6 flex flex-wrap justify-center gap-x-12 gap-y-3 text-sm/6"
>
<a
href="{{ path('legalmentions') }}"
class="text-gray-600 hover:text-gray-900"
>
Mentions légales
</a>
<a
href="{{ path('confidentialitypolicy') }}"
class="text-gray-600 hover:text-gray-900"
>
Politique de confidentialité
</a>
</nav>
<div class="mt-16 flex justify-center gap-x-10">
<a href="#" class="text-gray-600 hover:text-gray-800">
<span class="sr-only">Facebook</span>
<svg
viewBox="0 0 24 24"
fill="currentColor"
aria-hidden="true"
class="size-6"
>
<path
d="M22 12c0-5.523-4.477-10-10-10S2 6.477 2 12c0 4.991 3.657 9.128 8.438 9.878v-6.987h-2.54V12h2.54V9.797c0-2.506 1.492-3.89 3.777-3.89 1.094 0 2.238.195 2.238.195v2.46h-1.26c-1.243 0-1.63.771-1.63 1.562V12h2.773l-.443 2.89h-2.33v6.988C18.343 21.128 22 16.991 22 12z"
clip-rule="evenodd"
fill-rule="evenodd"
/>
</svg>
</a>
<a href="#" class="text-gray-600 hover:text-gray-800">
<span class="sr-only">YouTube</span>
<svg
viewBox="0 0 24 24"
fill="currentColor"
aria-hidden="true"
class="size-6"
>
<path
d="M19.812 5.418c.861.23 1.538.907 1.768 1.768C21.998 8.746 22 12 22 12s0 3.255-.418 4.814a2.504 2.504 0 0 1-1.768 1.768c-1.56.419-7.814.419-7.814.419s-6.255 0-7.814-.419a2.505 2.505 0 0 1-1.768-1.768C2 15.255 2 12 2 12s0-3.255.417-4.814a2.507 2.507 0 0 1 1.768-1.768C5.744 5 11.998 5 11.998 5s6.255 0 7.814.418ZM15.194 12 10 15V9l5.194 3Z"
clip-rule="evenodd"
fill-rule="evenodd"
/>
</svg>
</a>
</div>
<p class="mt-10 text-center text-sm/6 text-gray-600" data-controller="year">
&copy; Arts-ticule, Tous droits réservés.
</p>
</div>
</footer>

View File

@@ -0,0 +1,155 @@
<header class="bg-amber-100 relative z-50">
<nav
aria-label="Global"
class="mx-auto flex max-w-7xl items-center justify-between p-6 lg:px-8"
>
<a href="{{ path('home') }}" class="-m-1.5 p-1.5">
<span class="sr-only">Arts-ticule</span>
<img src="images/logo.jpg" alt="" class="h-8 w-auto" />
</a>
<div class="flex lg:hidden">
<button
type="button"
command="show-modal"
commandfor="mobile-menu"
class="-m-2.5 inline-flex items-center justify-center rounded-md p-2.5 text-gray-700"
>
<span class="sr-only">Ouvrir menu</span>
<svg
viewbox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.5"
data-slot="icon"
aria-hidden="true"
class="size-6"
>
<path
d="M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5"
stroke-linecap="round"
stroke-linejoin="round"
/>
</svg>
</button>
</div>
<div class="hidden lg:flex lg:gap-x-12 items-center">
<a
href="{{ path('home') }}"
class="text-sm/6 font-semibold text-gray-900"
>
Accueil
</a>
<a
href="{{ path('show') }}"
class="text-sm/6 font-semibold text-gray-900"
>
Spectacles jeune public
</a>
<a
href="{{ path('project') }}"
class="text-sm/6 font-semibold text-gray-900"
>
Projets artistiques
</a>
<a
href="{{ path('manualproject') }}"
class="text-sm/6 font-semibold text-gray-900"
>
Projets manuels et créatifs
</a>
<a
href="{{ path('about') }}"
class="text-sm/6 font-semibold text-gray-900"
>
Me connaître
</a>
<a
href="tel:+33672701956"
class="text-sm/6 font-semibold text-gray-900 bg-amber-300 rounded-2xl px-4 py-2 hover:bg-amber-400 transition-colors"
>
Me contacter
</a>
</div>
</nav>
<el-dialog>
<dialog id="mobile-menu" class="backdrop:bg-transparent lg:hidden">
<div tabindex="0" class="fixed inset-0 focus:outline-none">
<el-dialog-panel
class="fixed inset-y-0 right-0 z-50 w-full overflow-y-auto bg-white p-6 sm:max-w-sm sm:ring-1 sm:ring-gray-900/10"
>
<div class="flex items-center justify-between">
<a href="{{ path('home') }}" class="-m-1.5 p-1.5">
<span class="sr-only">Arts-ticule</span>
<img src="/images/logo.jpg" alt="" class="h-8 w-auto" />
</a>
<button
type="button"
command="close"
commandfor="mobile-menu"
class="-m-2.5 rounded-md p-2.5 text-gray-700"
>
<span class="sr-only">Fermer menu</span>
<svg
viewbox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.5"
data-slot="icon"
aria-hidden="true"
class="size-6"
>
<path
d="M6 18 18 6M6 6l12 12"
stroke-linecap="round"
stroke-linejoin="round"
/>
</svg>
</button>
</div>
<div class="mt-6 flow-root">
<div class="-my-6 divide-y divide-gray-500/10">
<div class="space-y-2 py-6">
<a
href="{{ path('home') }}"
class="-mx-3 block rounded-lg px-3 py-2 text-base/7 font-semibold text-gray-900 hover:bg-gray-50"
>
Accueil
</a>
<a
href="{{ path('show') }}"
class="-mx-3 block rounded-lg px-3 py-2 text-base/7 font-semibold text-gray-900 hover:bg-gray-50"
>
Spectacles jeune public
</a>
<a
href="{{ path('project') }}"
class="-mx-3 block rounded-lg px-3 py-2 text-base/7 font-semibold text-gray-900 hover:bg-gray-50"
>
Projets artistiques
</a>
<a
href="{{ path('manualproject') }}"
class="-mx-3 block rounded-lg px-3 py-2 text-base/7 font-semibold text-gray-900 hover:bg-gray-50"
>
Projets manuels et créatifs
</a>
<a
href="{{ path('about') }}"
class="-mx-3 block rounded-lg px-3 py-2 text-base/7 font-semibold text-gray-900 hover:bg-gray-50"
>
Me connaître
</a>
<a
href="tel:+33672701956"
class="-mx-3 block rounded-lg px-3 py-2 text-base/7 font-semibold text-gray-900 hover:bg-gray-50 bg-amber-300"
>
Me contacter
</a>
</div>
</div>
</div>
</el-dialog-panel>
</div>
</dialog>
</el-dialog>
</header>

View File

@@ -0,0 +1,45 @@
<!DOCTYPE html>
<html class="h-full">
<head>
<meta charset="UTF-8" />
<title>
{% block title %}
Administration de votre site web
{% endblock %}
</title>
<link
rel="icon"
href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 128 128%22><text y=%221.2em%22 font-size=%2296%22>⚫️</text><text y=%221.3em%22 x=%220.2em%22 font-size=%2276%22 fill=%22%23fff%22>sf</text></svg>"
/>
<link
rel="stylesheet"
href="https://cdn.ckeditor.com/ckeditor5/47.3.0/ckeditor5.css"
/>
{% block stylesheets %}
{{ encore_entry_link_tags('app') }}
{% endblock %}
{% block javascripts %}
{{ encore_entry_script_tags('app') }}
<script
src="https://cdn.ckeditor.com/ckeditor5/47.3.0/ckeditor5.umd.js"
></script>
{% endblock %}
<link rel="stylesheet" href="https://rsms.me/inter/inter.css" />
</head>
<body class="h-full bg-white">
{{
render(
controller(
'App\\Controller\\BaseAdminController::sidebar',
{
path: app.request.pathinfo
}
)
)
}}
{% block body %}
{% endblock %}
</body>
</html>

View File

@@ -0,0 +1,44 @@
<el-dialog>
<dialog id="dialog" data-action="show->news--image-selector#onDialogOpen" aria-labelledby="dialog-title" class="fixed inset-0 size-auto max-h-none max-w-none overflow-y-auto bg-transparent backdrop:bg-transparent">
<el-dialog-backdrop class="fixed inset-0 bg-gray-500/75 transition-opacity data-closed:opacity-0 data-enter:duration-300 data-enter:ease-out data-leave:duration-200 data-leave:ease-in dark:bg-gray-900/50"></el-dialog-backdrop>
<div tabindex="0" class="flex min-h-full items-end justify-center p-4 text-center focus:outline-none sm:items-center sm:p-0">
<el-dialog-panel class="relative transform overflow-hidden rounded-lg bg-white px-4 pt-5 pb-4 text-left shadow-xl transition-all data-closed:translate-y-4 data-closed:opacity-0 data-enter:duration-300 data-enter:ease-out data-leave:duration-200 data-leave:ease-in sm:my-8 sm:w-full sm:max-w-3xl sm:p-6 data-closed:sm:translate-y-0 data-closed:sm:scale-95 dark:bg-gray-800 dark:outline dark:-outline-offset-1 dark:outline-white/10">
<div>
<div class="mx-auto flex size-12 items-center justify-center rounded-full bg-green-100 dark:bg-green-500/10">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-6 text-green-600 dark:text-green-400">
<path stroke-linecap="round" stroke-linejoin="round" d="M12 4.5v15m7.5-7.5h-15"/>
</svg>
</div>
<div class="mt-3 text-center sm:mt-5">
<h3 id="dialog-title" class="text-base font-semibold text-gray-900 dark:text-white">Ajouter des images</h3>
<div class="mt-2">
<p class="text-sm text-gray-500 dark:text-gray-400">Ajouter des images
</p>
</div>
<div class="grid grid-cols-4 gap-4 mt-4 max-h-96 overflow-y-auto p-2" data-news--image-selector-target="list">
{% for image in images %}
<label class="cursor-pointer block relative rounded-md overflow-hidden transition transform" data-action="click->news--image-selector#cardClick" data-news--image-selector-target="card" data-id="{{ image.id }}" data-url="{{ image.url }}">
<input type="checkbox" class="hidden" value="{{ image.id }}" data-action="change->news--image-selector#toggleCheckbox" data-news--image-selector-target="checkbox">
<img src="{{ image.url }}" alt="" class="w-full h-24 object-cover">
<div class="absolute inset-0 bg-black/20 hidden" data-news--image-selector-target="overlay"></div>
<span class="absolute top-2 right-2 hidden text-green-400" data-news--image-selector-target="checkIcon">
<svg xmlns="http://www.w3.org/2000/svg" class="size-5" viewbox="0 0 20 20" fill="currentColor">
<path fill-rule="evenodd" d="M16.707 5.293a1 1 0 00-1.414-1.414L7 12.172 4.707 9.879a1 1 0 00-1.414 1.414l3 3a1 1 0 001.414 0l9-9z" clip-rule="evenodd"/>
</svg>
</span>
</label>
{% else %}
<p class="col-span-4 text-center text-gray-500">Aucune image disponible</p>
{% endfor %}
</div>
<div class="mt-5 sm:mt-6 sm:grid sm:grid-flow-row-dense sm:grid-cols-2 sm:gap-3">
<button data-action="news--image-selector#validate" class="inline-flex w-full justify-center rounded-md bg-amber-600 px-3 py-2 text-sm font-semibold text-white shadow-xs hover:bg-amber-500 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-amber-600 sm:col-start-2 dark:bg-amber-500 dark:shadow-none dark:hover:bg-amber-400 dark:focus-visible:outline-amber-500">Valider</button>
<button type="button" command="close" commandfor="dialog" class="mt-3 inline-flex w-full justify-center rounded-md bg-white px-3 py-2 text-sm font-semibold text-gray-900 shadow-xs inset-ring-1 inset-ring-gray-300 hover:bg-gray-50 sm:col-start-1 sm:mt-0 dark:bg-white/10 dark:text-white dark:shadow-none dark:inset-ring-white/5 dark:hover:bg-white/20">Retour</button>
</div>
</el-dialog-panel>
</div>
</div>
</div>
</dialog>
</el-dialog>

View File

@@ -0,0 +1,22 @@
<div data-image--delete-img-modal-target="dialog" class="hidden fixed inset-0 z-50 items-center justify-center bg-black/50 p-4">
<div class="bg-white rounded-lg p-6 w-full max-w-md">
<h3 class="text-lg font-semibold text-gray-900 mb-4">Supprimer l'image</h3>
<p class="text-sm text-gray-500 mb-6">
Êtes-vous sûr de vouloir supprimer cette image ? Cette action est irréversible.
</p>
<div class="flex justify-end space-x-2">
<button type="button" data-action="image--delete-img-modal#close" class="bg-gray-200 text-gray-900 px-3 py-2 rounded hover:bg-gray-300">
Annuler
</button>
<form method="post" data-image--delete-img-modal-target="form">
<input type="hidden" name="_token" data-image--delete-img-modal-target="token">
<button type="submit" class="bg-red-600 text-white px-3 py-2 rounded hover:bg-red-500">
Supprimer
</button>
</form>
</div>
</div>
</div>

View File

@@ -0,0 +1,22 @@
<div data-news--delete-target="dialog" class="hidden fixed inset-0 z-50 items-center justify-center bg-black/50 p-4">
<div class="bg-white rounded-lg p-6 w-full max-w-md">
<h3 class="text-lg font-semibold text-gray-900 mb-4">Supprimer l'actualité</h3>
<p class="text-sm text-gray-500 mb-6">
Êtes-vous sûr de vouloir supprimer cette actualité ? Cette action est irréversible.
</p>
<div class="flex justify-end space-x-2">
<button type="button" data-action="news--delete#close" class="bg-gray-200 text-gray-900 px-3 py-2 rounded hover:bg-gray-300">
Annuler
</button>
<form method="post" data-news--delete-target="form">
<input type="hidden" name="_token" data-news--delete-target="token">
<button type="submit" class="bg-red-600 text-white px-3 py-2 rounded hover:bg-red-500">
Supprimer
</button>
</form>
</div>
</div>
</div>

View File

@@ -0,0 +1,44 @@
<el-dialog>
<dialog id="edit-news-image-dialog" data-action="show->news--edit-image-selector#onDialogOpen" aria-labelledby="dialog-title" class="fixed inset-0 size-auto max-h-none max-w-none overflow-y-auto bg-transparent backdrop:bg-transparent">
<el-dialog-backdrop class="fixed inset-0 bg-gray-500/75 transition-opacity data-closed:opacity-0 data-enter:duration-300 data-enter:ease-out data-leave:duration-200 data-leave:ease-in dark:bg-gray-900/50"></el-dialog-backdrop>
<div tabindex="0" class="flex min-h-full items-end justify-center p-4 text-center focus:outline-none sm:items-center sm:p-0">
<el-dialog-panel class="relative transform overflow-hidden rounded-lg bg-white px-4 pt-5 pb-4 text-left shadow-xl transition-all data-closed:translate-y-4 data-closed:opacity-0 data-enter:duration-300 data-enter:ease-out data-leave:duration-200 data-leave:ease-in sm:my-8 sm:w-full sm:max-w-3xl sm:p-6 data-closed:sm:translate-y-0 data-closed:sm:scale-95 dark:bg-gray-800 dark:outline dark:-outline-offset-1 dark:outline-white/10">
<div>
<div class="mx-auto flex size-12 items-center justify-center rounded-full bg-green-100 dark:bg-green-500/10">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewbox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-6 text-green-600 dark:text-green-400">
<path stroke-linecap="round" stroke-linejoin="round" d="M12 4.5v15m7.5-7.5h-15"/>
</svg>
</div>
<div class="mt-3 text-center sm:mt-5">
<h3 id="dialog-title" class="text-base font-semibold text-gray-900 dark:text-white">Ajouter des images</h3>
<div class="mt-2">
<p class="text-sm text-gray-500 dark:text-gray-400">Ajouter des images
</p>
</div>
<div class="grid grid-cols-4 gap-4 mt-4 max-h-96 overflow-y-auto p-2" data-news--edit-image-selector-target="list">
{% for image in images %}
<label class="cursor-pointer block relative rounded-md overflow-hidden transition transform" data-action="click->news--edit-image-selector#cardClick" data-news--edit-image-selector-target="card" data-id="{{ image.id }}" data-url="{{ image.url }}">
<input type="checkbox" class="hidden" value="{{ image.id }}" data-action="change->news--edit-image-selector#toggleCheckbox" data-news--edit-image-selector-target="checkbox">
<img src="{{ image.url }}" alt="" class="w-full h-24 object-cover">
<div class="absolute inset-0 bg-black/20 hidden" data-news--edit-image-selector-target="overlay"></div>
<span class="absolute top-2 right-2 hidden text-green-400" data-news--edit-image-selector-target="checkIcon">
<svg xmlns="http://www.w3.org/2000/svg" class="size-5" viewbox="0 0 20 20" fill="currentColor">
<path fill-rule="evenodd" d="M16.707 5.293a1 1 0 00-1.414-1.414L7 12.172 4.707 9.879a1 1 0 00-1.414 1.414l3 3a1 1 0 001.414 0l9-9z" clip-rule="evenodd"/>
</svg>
</span>
</label>
{% else %}
<p class="col-span-4 text-center text-gray-500">Aucune image disponible</p>
{% endfor %}
</div>
<div class="mt-5 sm:mt-6 sm:grid sm:grid-flow-row-dense sm:grid-cols-2 sm:gap-3">
<button data-action="news--edit-image-selector#validate" class="inline-flex w-full justify-center rounded-md bg-amber-600 px-3 py-2 text-sm font-semibold text-white shadow-xs hover:bg-amber-500 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-amber-600 sm:col-start-2 dark:bg-amber-500 dark:shadow-none dark:hover:bg-amber-400 dark:focus-visible:outline-amber-500">Valider</button>
<button type="button" command="close" commandfor="edit-news-image-dialog" class="mt-3 inline-flex w-full justify-center rounded-md bg-white px-3 py-2 text-sm font-semibold text-gray-900 shadow-xs inset-ring-1 inset-ring-gray-300 hover:bg-gray-50 sm:col-start-1 sm:mt-0 dark:bg-white/10 dark:text-white dark:shadow-none dark:inset-ring-white/5 dark:hover:bg-white/20">Retour</button>
</div>
</el-dialog-panel>
</div>
</div>
</div>
</dialog>
</el-dialog>

View File

@@ -0,0 +1,5 @@
<div data-component--loader-progress-bar-target="loaderWrapper" class="relative mb-4 hidden">
<div class="w-full bg-gray-200 rounded-full h-2">
<div data-component--loader-progress-bar-target="loaderProgressBar" class="bg-amber-500 h-2 rounded-full mt-60" style="width:0;"></div>
</div>
</div>

View File

@@ -0,0 +1,38 @@
<div id="loader" data-image--drop-zone-target="loader" class="loader" style="display:none;"></div>
<style>
.loader {
display: block;
--height-of-loader: 4px;
--loader-color: #f59e0b;
width: 130px;
height: var(--height-of-loader);
border-radius: 30px;
background-color: rgba(0, 0, 0, 0.2);
position: relative;
}
.loader::before {
content: "";
position: absolute;
background: var(--loader-color);
top: 0;
left: 0;
width: 0;
height: 100%;
border-radius: 30px;
animation: moving 1s ease-in-out infinite;
}
@keyframes moving {
50% {
width: 100%;
}
100% {
width: 0;
right: 0;
left: unset;
}
}
</style>

View File

@@ -0,0 +1,181 @@
{% extends 'base_admin.html.twig' %}
{% block body %}
<main class="lg:pl-72" data-controller="feature--toggle-feature-status">
<div class="xl:pr-96">
<div class="px-4 py-10 sm:px-6 lg:px-8 lg:py-6">
<!-- Main content -->
<div class="px-4 sm:px-6 lg:px-8">
<div class="sm:flex sm:items-center">
<div class="sm:flex-auto">
<h1 class="text-base font-semibold text-gray-900">
Fonctionnalités
</h1>
<p class="mt-2 text-sm text-gray-700">
Liste de toutes les fonctionnalités disponibles dans
l'application.
</p>
</div>
</div>
<div class="mt-8 flow-root">
<div class="-mx-4 -my-2 overflow-x-auto sm:-mx-6 lg:-mx-8">
<div
class="inline-block min-w-full py-2 align-middle sm:px-6 lg:px-8"
>
<div class="group/table relative">
<div
class="absolute top-0 left-14 z-10 hidden h-12 items-center space-x-3 bg-white group-has-checked/table:flex sm:left-12"
>
<button
type="button"
class="inline-flex items-center rounded-sm bg-white px-2 py-1 text-sm font-semibold text-gray-900 shadow-xs inset-ring inset-ring-gray-300 hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-30 disabled:hover:bg-white"
>
Activer
</button>
<button
type="button"
class="inline-flex items-center rounded-sm bg-white px-2 py-1 text-sm font-semibold text-gray-900 shadow-xs inset-ring inset-ring-gray-300 hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-30 disabled:hover:bg-white"
>
Désactiver
</button>
</div>
<table
id="users-table"
class="relative min-w-full table-fixed divide-y divide-gray-300"
>
<thead>
<tr>
<th scope="col" class="relative px-7 sm:w-12 sm:px-6">
<div
class="group absolute top-1/2 left-4 -mt-2 grid size-4 grid-cols-1"
>
<input
type="checkbox"
class="col-start-1 row-start-1 appearance-none rounded-sm border border-gray-300 bg-white checked:border-amber-600 checked:bg-amber-600 indeterminate:border-amber-600 indeterminate:bg-amber-600 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-amber-600 disabled:border-gray-300 disabled:bg-gray-100 disabled:checked:bg-gray-100 forced-colors:appearance-auto"
/>
<svg
viewBox="0 0 14 14"
fill="none"
class="pointer-events-none col-start-1 row-start-1 size-3.5 self-center justify-self-center stroke-white group-has-disabled:stroke-gray-950/25"
>
<path
d="M3 8L6 11L11 3.5"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
class="opacity-0 group-has-checked:opacity-100"
/>
<path
d="M3 7H11"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
class="opacity-0 group-has-indeterminate:opacity-100"
/>
</svg>
</div>
</th>
<th
scope="col"
class="min-w-48 py-3.5 pr-3 text-left text-sm font-semibold text-gray-900"
>
Nom
</th>
<th
scope="col"
class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900"
>
Statut
</th>
<th scope="col" class="py-3.5 pr-4 pl-3 sm:pr-3">
<span class="sr-only">Edit</span>
</th>
</tr>
</thead>
<tbody class="divide-y divide-gray-200 bg-white">
{% for feature in features %}
<tr class="group has-checked:bg-gray-50">
<td class="relative px-7 sm:w-12 sm:px-6">
<div
class="absolute inset-y-0 left-0 hidden w-0.5 bg-amber-600 group-has-checked:block"
></div>
<div
class="group absolute top-1/2 left-4 -mt-2 grid size-4 grid-cols-1"
>
<input
type="checkbox"
class="col-start-1 row-start-1 appearance-none rounded-sm border border-gray-300 bg-white checked:border-amber-600 checked:bg-amber-600 indeterminate:border-amber-600 indeterminate:bg-amber-600 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-amber-600 disabled:border-gray-300 disabled:bg-gray-100 disabled:checked:bg-gray-100 forced-colors:appearance-auto"
/>
<svg
viewBox="0 0 14 14"
fill="none"
class="pointer-events-none col-start-1 row-start-1 size-3.5 self-center justify-self-center stroke-white group-has-disabled:stroke-gray-950/25"
>
<path
d="M3 8L6 11L11 3.5"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
class="opacity-0 group-has-checked:opacity-100"
/>
<path
d="M3 7H11"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
class="opacity-0 group-has-indeterminate:opacity-100"
/>
</svg>
</div>
</td>
<td
class="py-4 pr-3 text-sm font-medium whitespace-nowrap text-gray-900 group-has-checked:text-amber-600"
>
{{ feature.name }}
</td>
<td
class="px-3 py-4 text-sm whitespace-nowrap text-gray-500 {{
feature.isActive
? 'text-green-500'
: 'text-red-500'
}}
"
>
{{ feature.isActive ? 'Actif' : 'Inactif' }}
</td>
<td
class="py-4 pr-4 pl-3 text-right text-sm font-medium whitespace-nowrap sm:pr-3"
>
<a
href="#"
class="text-amber-600 hover:text-amber-900"
>
Modifier<span class="sr-only">, {{ feature.name }}</span>
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</main>
<aside
class="fixed inset-y-0 right-0 hidden w-96 overflow-y-auto border-l border-gray-200 px-4 py-6 sm:px-6 lg:px-8 xl:block dark:border-white/10"
>
<!-- Secondary column (hidden on smaller screens) -->
<a
href="{{ path('admin_news_add') }}"
class="rounded-md bg-amber-600 px-4 py-2.5 text-sm font-semibold text-white shadow-xs hover:bg-amber-500 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-amber-600 dark:bg-amber-500 dark:shadow-none dark:hover:bg-amber-400 dark:focus-visible:outline-amber-500"
>
Ajouter une fonctionnalité
</a>
</aside>
{% endblock %}

View File

@@ -0,0 +1,5 @@
{% use 'tailwind_2_layout.html.twig' %}
{%- block form_row -%}
{%- set row_class = row_class|default('mb-4 flex flex-col space-y-1') -%}
{{- parent() -}}{%- endblock form_row -%}{%- block widget_attributes -%}{%- set widget_class = widget_class|default('block w-full rounded-lg border-gray-300 focus:border-amber-500 focus:ring-amber-500') -%}{%- set widget_disabled_class = widget_disabled_class|default('opacity-50 cursor-not-allowed') -%}{%- set widget_errors_class = widget_errors_class|default('border-red-500 ring-red-500') -%}{{- parent() -}}{%- endblock widget_attributes -%}{%- block form_label -%}{%- set label_class = label_class|default('font-medium text-gray-700') -%}{{- parent() -}}{%- endblock form_label -%}{%- block form_help -%}{%- set help_class = help_class|default('text-sm text-gray-500') -%}{{- parent() -}}{%- endblock form_help -%}{%- block form_errors -%}{%- set error_item_class = error_item_class|default('text-sm text-red-600') -%}{{- parent() -}}{%- endblock form_errors -%}

View File

@@ -0,0 +1,41 @@
{% extends 'base_admin.html.twig' %}
{% block body %}
<main class="lg:pl-72">
<div class="xl:pr-96">
<div
class="px-4 py-10 sm:px-6 lg:px-8 lg:py-6 ">
<!-- Main area -->
<div class="col-span-full mt-60">
<div id="drop-zone" data-controller="image--drop-zone" data-image--drop-zone-target="dropZone" class="flex justify-center rounded-lg border border-dashed border-gray-900/25 px-6 py-10">
<div class="text-center">
<svg viewbox="0 0 24 24" fill="currentColor" data-slot="icon" aria-hidden="true" class="mx-auto size-12 text-gray-300">
<path d="M1.5 6a2.25 2.25 0 0 1 2.25-2.25h16.5A2.25 2.25 0 0 1 22.5 6v12a2.25 2.25 0 0 1-2.25 2.25H3.75A2.25 2.25 0 0 1 1.5 18V6ZM3 16.06V18c0 .414.336.75.75.75h16.5A.75.75 0 0 0 21 18v-1.94l-2.69-2.689a1.5 1.5 0 0 0-2.12 0l-.88.879.97.97a.75.75 0 1 1-1.06 1.06l-5.16-5.159a1.5 1.5 0 0 0-2.12 0L3 16.061Zm10.125-7.81a1.125 1.125 0 1 1 2.25 0 1.125 1.125 0 0 1-2.25 0Z" clip-rule="evenodd" fill-rule="evenodd"/>
</svg>
<div class="mt-4 flex justify-center text-sm/6 text-gray-600">
<label for="file-upload" onclick="event.stopPropagation()" class="relative cursor-pointer rounded-md bg-white font-semibold text-amber-600 focus-within:outline-2 focus-within:outline-offset-2 focus-within:outline-amber-600 hover:text-amber-500">
<span>Télécharger des fichiers</span>
<input id="file-upload" type="file" name="file-upload[]" class="sr-only" multiple data-image--drop-zone-target="input"/>
</label>
<p class="pl-1">ou glisser-déposer</p>
</div>
<div>
<p class="text-xs/5 text-gray-600">PNG, JPG, GIF jusqu'à 10 Mo</p>
</div>
<div data-image--drop-zone-target="preview" class="mt-4 flex flex-wrap gap-2"></div>
<div class="mt-4 flex justify-center">
{% include "component/loader.html.twig" %}
</div>
</div>
</div>
</div>
</div>
</div>
</main>
<aside
class="fixed inset-y-0 right-0 hidden w-96 overflow-y-auto border-l border-gray-200 px-4 py-6 sm:px-6 lg:px-8 xl:block dark:border-white/10">
<!-- Secondary column (hidden on smaller screens) -->
<a href="{{ path('admin_image_index') }}" class="rounded-md bg-amber-600 px-4 py-2.5 text-sm font-semibold text-white shadow-xs hover:bg-amber-500 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-amber-600 dark:bg-amber-500 dark:shadow-none dark:hover:bg-amber-400 dark:focus-visible:outline-amber-500">Mes images</a>
</aside>
{% endblock %}

View File

@@ -0,0 +1,166 @@
{% extends 'base_admin.html.twig' %}
{% block body %}
<div data-controller="image--delete-img-modal">
<main class="lg:pl-72">
<div class="xl:pr-96">
<div
class="px-4 py-10 sm:px-6 lg:px-8 lg:py-6"
data-controller="component--loader-progress-bar"
>
<!-- Main area -->
{% for message in app.flashes('error') %}
<div class="mb-4 rounded-md bg-red-50 p-4">
<div class="flex">
<div class="shrink-0">
<svg
class="size-5 text-red-400"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewbox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
aria-hidden="true"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z"
/>
</svg>
</div>
<div class="ml-3">
<p class="text-sm font-medium text-red-800">
{{ message }}
</p>
</div>
</div>
</div>
{% endfor %}
{% if images is empty %}
<div class="text-center mt-60">
<svg
viewbox="0 0 24 24"
fill="none"
stroke="currentColor"
aria-hidden="true"
class="mx-auto size-12 text-gray-400"
>
<path
d="M9 13h6m-3-3v6m-9 1V7a2 2 0 012-2h6l2 2h6a2 2 0 012 2v8a2 2 0 01-2 2H5a2 2 0 01-2-2z"
stroke-width="2"
vector-effect="non-scaling-stroke"
stroke-linecap="round"
stroke-linejoin="round"
/>
</svg>
<h3 class="mt-2 text-sm font-semibold text-gray-900">
Pas d'image
</h3>
<p class="mt-1 text-sm text-gray-500">
Commencez par ajouter une nouvelle image.
</p>
<div class="mt-6">
<a
class="inline-flex items-center rounded-md bg-amber-600 px-3 py-2 text-sm font-semibold text-white shadow-xs hover:bg-amber-500 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-amber-600"
href="{{ path('admin_image_add') }}"
>
Ajouter des images
</a>
</div>
</div>
{% else %}
{% include 'component/loader-progress-bar.html.twig' %}
<div
data-component--loader-progress-bar-target="imagesWrapper"
style="opacity:0;"
>
<ul
role="list"
data-component--loader-progress-bar-target="list"
class="grid grid-cols-2 gap-x-4 gap-y-8 sm:grid-cols-3 sm:gap-x-6 lg:grid-cols-4 xl:gap-x-8"
>
{% for image in images %}
<li class="relative">
<div
class="group relative overflow-hidden rounded-lg bg-gray-100 dark:bg-gray-800"
>
<img
src="{{ image.url }}"
alt=""
class="pointer-events-none aspect-10/7 rounded-lg object-cover outline -outline-offset-1 outline-black/5 dark:outline-white/10"
/>
<!-- BANDEAU visible au hover -->
<div
class="absolute top-0 left-0 right-0 bg-black/50 h-10 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-end px-2 pointer-events-auto"
>
<button
type="button"
data-action="image--delete-img-modal#open"
data-url="{{
path(
'admin_image_delete',
{
id: image.id
}
)
}}"
data-token="{{
csrf_token(
'delete_image' ~ image.id
)
}}"
class="p-1 rounded hover:bg-white/20 transition text-amber-600"
>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="size-5"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="m14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0"
/>
</svg>
</button>
</div>
</div>
<p
class="mt-2 block truncate text-sm font-medium text-gray-900 dark:text-white"
>
{{ image.name }}
</p>
<p
class="block text-sm font-medium text-gray-500 dark:text-gray-400"
>
{{ (image.size / 1024 / 1024)|number_format(2) }}
MB
</p>
</li>
{% endfor %}
</ul>
</div>
{% endif %}
</div>
</div>
{% include 'component/confirm-delete-image.html.twig' %}
</main>
<aside
class="fixed inset-y-0 right-0 hidden w-96 overflow-y-auto border-l border-gray-200 px-4 py-6 sm:px-6 lg:px-8 xl:block dark:border-white/10"
>
<!-- Secondary column (hidden on smaller screens) -->
<a
href="{{ path('admin_image_add') }}"
class="rounded-md bg-amber-600 px-4 py-2.5 text-sm font-semibold text-white shadow-xs hover:bg-amber-500 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-amber-600 dark:bg-amber-500 dark:shadow-none dark:hover:bg-amber-400 dark:focus-visible:outline-amber-500"
>
Ajouter des images
</a>
</aside>
</div>
{% endblock %}

View File

@@ -0,0 +1,3 @@
{{ form_start(form) }}
{{ form_widget(form) }}
{{ form_end(form) }}

View File

@@ -0,0 +1,90 @@
{% extends 'base_admin.html.twig' %}
{% block body %}
<main class="lg:pl-72">
<div class="xl:pr-96">
<div
class="px-4 py-10 sm:px-6 lg:px-8 lg:py-6"
data-controller="news--image-selector"
data-image-selector-target="container"
>
{% for message in app.flashes('error') %}
<div class="mb-4 rounded-md bg-red-50 p-4">
<div class="flex">
<div class="shrink-0">
<svg
class="size-5 text-red-400"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewbox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
aria-hidden="true"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z"
/>
</svg>
</div>
<div class="ml-3">
<p class="text-sm font-medium text-red-800">
{{ message }}
</p>
</div>
</div>
</div>
{% endfor %}
{{ form_start(form) }}
{{ form_widget(form) }}
<div class="mt-4">
<button
command="show-modal"
commandfor="dialog"
type="button"
class="rounded-md bg-amber-600 px-4 py-2.5 text-sm font-semibold text-white"
>
Ajouter des images
</button>
<span
data-news--image-selector-target="count"
class="text-sm text-gray-700 dark:text-gray-300"
>
0 sélectionnée(s)
</span>
</div>
<div
id="selected-images-preview"
data-news--image-selector-target="preview"
class="mt-4 flex gap-3 flex-wrap"
></div>
<div class="mt-4">
<button
type="submit"
class="rounded-md bg-amber-600 px-4 py-2.5 text-sm font-semibold text-white"
>
Enregistrer l'actualité
</button>
</div>
{{ form_end(form) }}
{% include 'component/add-images-modal.html.twig' %}
</div>
</div>
</main>
<aside
class="fixed inset-y-0 right-0 hidden w-96 overflow-y-auto border-l border-gray-200 px-4 py-6 sm:px-6 lg:px-8 xl:block dark:border-white/10"
>
<!-- Secondary column (hidden on smaller screens) -->
<a
href="{{ path('admin_news_index') }}"
class="rounded-md bg-amber-600 px-4 py-2.5 text-sm font-semibold text-white shadow-xs hover:bg-amber-500 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-amber-600 dark:bg-amber-500 dark:shadow-none dark:hover:bg-amber-400 dark:focus-visible:outline-amber-500"
>
Retour
</a>
</aside>
{% endblock %}

View File

@@ -0,0 +1,79 @@
{% extends 'base_admin.html.twig' %}
{% block body %}
<main class="lg:pl-72">
<div class="xl:pr-96">
<div
class="px-4 py-10 sm:px-6 lg:px-8 lg:py-6"
data-controller="news--edit-image-selector"
data-news--edit-image-selector-target="container"
>
<!-- Main Area -->
{{ form_start(form) }}
{{ form_widget(form) }}
<div class="mt-4">
<button
command="show-modal"
commandfor="edit-news-image-dialog"
type="button"
class="rounded-md bg-amber-600 px-4 py-2.5 text-sm font-semibold text-white"
>
Modifier les images
</button>
<span
data-news--edit-image-selector-target="count"
class="text-sm text-gray-700 dark:text-gray-300"
>
0 sélectionnée(s)
</span>
</div>
<!-- Conteneur des inputs cachés gérés par Stimulus -->
<div id="hidden-inputs-container">
{% for img in selectedImages %}
<input type="hidden" name="selectedImages[]" value="{{ img.id }}" />
{% endfor %}
</div>
<!-- Zone de preview -->
<div
id="selected-images-preview"
data-news--edit-image-selector-target="preview"
class="mt-4 flex gap-3 flex-wrap"
>
{% for img in selectedImages %}
<img
src="{{ asset(img.url) }}"
data-id="{{ img.id }}"
class="w-20 h-20 rounded object-cover cursor-move"
/>
{% endfor %}
</div>
<div class="mt-4">
<button
type="submit"
class="rounded-md bg-amber-600 px-4 py-2.5 text-sm font-semibold text-white"
>
Enregistrer l'actualité
</button>
</div>
{{ form_end(form) }}
{% include 'component/edit-images-modal.html.twig' %}
</div>
</div>
</main>
<aside
class="fixed inset-y-0 right-0 hidden w-96 overflow-y-auto border-l border-gray-200 px-4 py-6 sm:px-6 lg:px-8 xl:block dark:border-white/10"
>
<!-- Secondary column (hidden on smaller screens) -->
<a
href="{{ path('admin_news_index') }}"
class="rounded-md bg-amber-600 px-4 py-2.5 text-sm font-semibold text-white shadow-xs hover:bg-amber-500 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-amber-600 dark:bg-amber-500 dark:shadow-none dark:hover:bg-amber-400 dark:focus-visible:outline-amber-500"
>
Retour
</a>
</aside>
{% endblock %}

View File

@@ -0,0 +1,276 @@
{% extends 'base_admin.html.twig' %}
{% block body %}
<div data-controller="news--delete">
<main class="lg:pl-72">
<div class="xl:pr-96">
<div class="px-4 py-10 sm:px-6 lg:px-8 lg:py-6">
<!-- Main area -->
<div class="bg-white py-6 sm:py-8">
<div class="mx-auto max-w-7xl px-6 lg:px-8">
{% if news is empty %}
<div class="text-center mt-60">
<svg
viewbox="0 0 24 24"
fill="none"
stroke="currentColor"
aria-hidden="true"
class="mx-auto size-12 text-gray-400"
>
<path
d="M9 13h6m-3-3v6m-9 1V7a2 2 0 012-2h6l2 2h6a2 2 0 012 2v8a2 2 0 01-2 2H5a2 2 0 01-2-2z"
stroke-width="2"
vector-effect="non-scaling-stroke"
stroke-linecap="round"
stroke-linejoin="round"
/>
</svg>
<h3 class="mt-2 text-sm font-semibold text-gray-900">
Pas d'actualité
</h3>
<p class="mt-1 text-sm text-gray-500">
Commencez par ajouter une nouvelle actualité.
</p>
<div class="mt-6">
<a
class="inline-flex items-center rounded-md bg-amber-600 px-3 py-2 text-sm font-semibold text-white shadow-xs hover:bg-amber-500 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-amber-600"
href="{{ path('admin_news_add') }}"
>
Ajouter des actualités
</a>
</div>
</div>
{% else %}
<div
class="mx-auto mt-16 grid max-w-2xl auto-rows-fr grid-cols-1 gap-8 sm:mt-20 lg:mx-0 lg:max-w-none lg:grid-cols-3"
data-controller="news--sortable"
data-news--sortable-url-value="{{
path(
'admin_news_reorder'
)
}}"
>
{% for new in news %}
<article
class="relative isolate flex flex-col justify-end overflow-hidden rounded-2xl bg-gray-900 px-8 pt-80 pb-8 sm:pt-48 lg:pt-80"
data-news--sortable-target="item"
data-id="{{ new.id }}"
>
{% if new.getNewsImages is not empty %}
<img
src="{{ new.getNewsImages[0].getImage().getUrl() }}"
alt=""
class="absolute inset-0 -z-10 size-full object-cover"
/>
{% else %}
<div
class="flex justify-center items-center absolute inset-0 -z-10 text-amber-500"
>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewbox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="w-1/2 h-1/2 object-cover"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="m2.25 15.75 5.159-5.159a2.25 2.25 0 0 1 3.182 0l5.159 5.159m-1.5-1.5 1.409-1.409a2.25 2.25 0 0 1 3.182 0l2.909 2.909m-18 3.75h16.5a1.5 1.5 0 0 0 1.5-1.5V6a1.5 1.5 0 0 0-1.5-1.5H3.75A1.5 1.5 0 0 0 2.25 6v12a1.5 1.5 0 0 0 1.5 1.5Zm10.5-11.25h.008v.008h-.008V8.25Zm.375 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Z"
/>
</svg>
</div>
{% endif %}
<!-- BANDEAU -->
<div
class="absolute top-0 left-0 w-full flex justify-end p-3 bg-black/40 backdrop-blur-sm opacity-100 z-50 items-center"
>
<!-- Icône move -->
<span
class="text-amber-500 cursor-move mx-2"
data-news--sortable-target="handle"
>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewbox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="size-6"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M3.75 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15"
/>
</svg>
</span>
<form
action="{{
path(
'admin_news_toggle_active',
{
id: new.id
}
)
}}"
method="POST"
class="flex items-center"
>
<input
type="hidden"
name="_token"
value="{{ csrf_token('toggle' ~ new.id) }}"
/>
<input
type="hidden"
name="active"
value="{{ new.isActive ? 1 : 0 }}"
/>
<button type="submit" class="mx-2 cursor-pointer">
{% if new.isActive %}
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewbox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="size-6 text-red-500"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M6 18 18 6M6 6l12 12"
/>
</svg>
{% else %}
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewbox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="size-6 text-green-500"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="m4.5 12.75 6 6 9-13.5"
/>
</svg>
{% endif %}
</button>
</form>
<!-- Icône éditer -->
<a
href="{{
path(
'admin_news_edit',
{
id: new.id
}
)
}}"
class="text-amber-500 mx-2"
>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewbox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="size-6"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125"
/>
</svg>
</a>
<!-- Icône supprimer -->
<button
class="text-red-500 cursor-pointer mx-2"
data-action="news--delete#open"
data-url="{{
path(
'admin_news_delete',
{
id: new.id
}
)
}}"
data-token="{{ csrf_token('delete' ~ new.id) }}"
>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewbox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="size-6"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="m14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0"
/>
</svg>
</button>
</div>
{% if new.isActive == 0 %}
<div
class="absolute inset-0 -z-10 bg-linear-to-t from-gray-900 via-gray-800/70"
></div>
<div
class="absolute inset-0 -z-10 rounded-2xl inset-ring inset-ring-gray-800/30"
></div>
{% else %}
<div
class="absolute inset-0 -z-10 bg-linear-to-t from-gray-900 via-gray-900/40"
></div>
<div
class="absolute inset-0 -z-10 rounded-2xl inset-ring inset-ring-gray-900/10"
></div>
{% endif %}
<!-- FOOTER -->
<div
class="flex flex-wrap items-center gap-y-1 overflow-hidden text-sm/6 text-gray-300"
>
<time
datetime="{{ new.updatedAt|date('Y-m-d') }}"
class="mr-8"
>
{{ new.updatedAt|date('d M Y') }}
</time>
</div>
<h3 class="mt-3 text-lg/6 font-semibold text-white">
<a href="#">
<span class="absolute inset-0"></span>
{{ new.title }}
</a>
</h3>
</article>
{% endfor %}
</div>
{% endif %}
</div>
</div>
</div>
</div>
{% include 'component/confirm-delete-news.html.twig' %}
</main>
</div>
<aside
class="fixed inset-y-0 right-0 hidden w-96 overflow-y-auto border-l border-gray-200 px-4 py-6 sm:px-6 lg:px-8 xl:block dark:border-white/10"
>
<!-- Secondary column (hidden on smaller screens) -->
<a
href="{{ path('admin_news_add') }}"
class="rounded-md bg-amber-600 px-4 py-2.5 text-sm font-semibold text-white shadow-xs hover:bg-amber-500 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-amber-600 dark:bg-amber-500 dark:shadow-none dark:hover:bg-amber-400 dark:focus-visible:outline-amber-500"
>
Ajouter une actualité
</a>
</aside>
{% endblock %}

View File

@@ -0,0 +1,226 @@
{% extends 'base.html.twig' %}
{% block metadata %}
{# ============================
METADATA / SEO
============================ #}
{% set meta_title = meta_title is defined
? meta_title
: 'À propos Parcours artistique et engagement culturel'
%}
{% set meta_description = meta_description is defined
? meta_description
: 'Découvrez le parcours professionnel et artistique à lorigine de projets culturels et pédagogiques destinés aux écoles, collectivités et structures daccueil.'
%}
{% set meta_image = meta_image is defined
? meta_image
: asset('images/logo.jpg')
%}
{% set meta_url = meta_url is defined ? meta_url : app.request.uri %}
{% set meta_site_name = meta_site_name is defined
? meta_site_name
: 'Nom du site'
%}
{% set meta_type = meta_type is defined ? meta_type : 'website' %}
<title>
{{ meta_title }}
</title>
<meta name="description" content="{{ meta_description }}" />
<meta name="robots" content="index, follow" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta charset="utf-8" />
<link rel="canonical" href="{{ meta_url }}" />
{# ============================
OPEN GRAPH (Facebook, LinkedIn…)
============================ #}
<meta property="og:title" content="{{ meta_title }}" />
<meta property="og:description" content="{{ meta_description }}" />
<meta property="og:type" content="{{ meta_type }}" />
<meta property="og:url" content="{{ meta_url }}" />
<meta property="og:image" content="{{ meta_image }}" />
<meta property="og:site_name" content="{{ meta_site_name }}" />
<meta property="og:locale" content="fr_FR" />
{# Optionnel mais recommandé #}
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
{# ============================
TWITTER CARDS
============================ #}
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="{{ meta_title }}" />
<meta name="twitter:description" content="{{ meta_description }}" />
<meta name="twitter:image" content="{{ meta_image }}" />
{% endblock %}
{% block body %}
<main class="isolate">
<!-- Hero section -->
<div class="relative isolate -z-10">
<svg
aria-hidden="true"
class="absolute inset-x-0 top-0 -z-10 h-256 w-full mask-[radial-gradient(32rem_32rem_at_center,white,transparent)] stroke-gray-200"
>
<defs>
<pattern
id="1f932ae7-37de-4c0a-a8b0-a6e3b4d44b84"
width="200"
height="200"
x="50%"
y="-1"
patternUnits="userSpaceOnUse"
>
<path d="M.5 200V.5H200" fill="none" />
</pattern>
</defs>
<svg x="50%" y="-1" class="overflow-visible fill-gray-50">
<path
d="M-200 0h201v201h-201Z M600 0h201v201h-201Z M-400 600h201v201h-201Z M200 800h201v201h-201Z"
stroke-width="0"
/>
</svg>
<rect
width="100%"
height="100%"
fill="url(#1f932ae7-37de-4c0a-a8b0-a6e3b4d44b84)"
stroke-width="0"
/>
</svg>
<div
aria-hidden="true"
class="absolute top-0 right-0 left-1/2 -z-10 -ml-24 transform-gpu overflow-hidden blur-3xl lg:ml-24 xl:ml-48"
>
<div
style="clip-path: polygon(63.1% 29.5%, 100% 17.1%, 76.6% 3%, 48.4% 0%, 44.6% 4.7%, 54.5% 25.3%, 59.8% 49%, 55.2% 57.8%, 44.4% 57.2%, 27.8% 47.9%, 35.1% 81.5%, 0% 97.7%, 39.2% 100%, 35.2% 81.4%, 97.2% 52.8%, 63.1% 29.5%)"
class="aspect-801/1036 w-200.25 bg-linear-to-tr from-[#ff80b5] to-[#F59E0B] opacity-30"
></div>
</div>
<div class="overflow-hidden">
<div
class="mx-auto max-w-7xl px-6 pt-36 pb-32 sm:pt-60 lg:px-8 lg:pt-32"
>
<div
class="mx-auto max-w-2xl gap-x-14 lg:mx-0 lg:flex lg:max-w-none lg:items-center"
>
<div class="relative w-full lg:max-w-xl lg:shrink-0 xl:max-w-2xl">
<h1
class="text-5xl font-semibold tracking-tight text-pretty text-gray-900 sm:text-7xl"
>
A titre professionnel
</h1>
<p
class="mt-8 text-lg font-medium text-pretty text-gray-500 sm:max-w-md sm:text-xl/8 lg:max-w-none"
>
Après une carrière au sein de lEducation Nationale, je souhaite
poursuivre mon activité et mettre au service de chacun mes
expériences acquises. Grâce à ma formation de professeur
déducation manuelle et technique je maîtrise les bases dans
différentes disciplines dont le cartonnage et la couture.
Enseignante jai initié de nombreux projets artistiques et
culturels et notamment avec des élèves les plus en difficulté.
Coordinatrice de léducation artistique à la DSDEN de lAin jai
approché le fonctionnement des compagnies artistiques et
rencontré des partenaires institutionnels.
</p>
<h2
class="text-5xl font-semibold tracking-tight text-pretty text-gray-900 sm:text-7xl mt-5"
>
A titre personnel
</h2>
<p
class="mt-8 text-lg font-medium text-pretty text-gray-500 sm:max-w-md sm:text-xl/8 lg:max-w-none"
>
Jai étudié solfège et piano durant plusieurs années. Avec deux
amies nous avons créé le Trio « Sans rendez-vous », chants et
mise en scène Jai créé un One woman show : jai perdu ma voie :
écriture des textes, jeu scénique, accompagnement à la création,
Sylvie Delom atelier du Réverbère Passionnée par les arts
vivants, jai participé à plusieurs formations autour du clown
(Christine Girod), du jeu scénique (Sylvie Delom, Nathalie
Stora), lécriture de chansons (les Trapettistes)
</p>
<p
class="mt-8 text-lg font-medium text-pretty text-gray-500 sm:max-w-md sm:text-xl/8 lg:max-w-none"
>
Très manuelle, je cherche à donner vie et exploiter les
matériaux qui sont à ma disposition et à moindre coût.
Initiation à la création artistique avec de jeunes enfants « le
chevalier de la Chalaronne »
</p>
</div>
<div
class="mt-14 flex justify-end gap-8 sm:-mt-44 sm:justify-start sm:pl-20 lg:mt-0 lg:pl-0"
>
<div
class="ml-auto w-44 flex-none space-y-8 pt-32 sm:ml-0 sm:pt-80 lg:order-last lg:pt-36 xl:order-0 xl:pt-80"
>
<div class="relative">
<img
src="images/about/mp-photo-affiche.jpg"
alt=""
class="aspect-2/3 w-full rounded-xl bg-gray-900/5 object-cover shadow-lg"
/>
<div
class="pointer-events-none absolute inset-0 rounded-xl ring-1 ring-gray-900/10 ring-inset"
></div>
</div>
</div>
<div
class="mr-auto w-44 flex-none space-y-8 sm:mr-0 sm:pt-52 lg:pt-36"
>
<div class="relative">
<img
src="images/about/sans-rendez-vous-concert-MJC-2004.jpg"
alt=""
class="aspect-2/3 w-full rounded-xl bg-gray-900/5 object-cover shadow-lg"
/>
<div
class="pointer-events-none absolute inset-0 rounded-xl ring-1 ring-gray-900/10 ring-inset"
></div>
</div>
<div class="relative">
<img
src="images/about/mp-photo-affiche.jpg"
alt=""
class="aspect-2/3 w-full rounded-xl bg-gray-900/5 object-cover shadow-lg"
/>
<div
class="pointer-events-none absolute inset-0 rounded-xl ring-1 ring-gray-900/10 ring-inset"
></div>
</div>
</div>
<div class="w-44 flex-none space-y-8 pt-32 sm:pt-0">
<div class="relative">
<img
src="images/about/mp-carton-invitation-4.jpg"
alt=""
class="aspect-2/3 w-full rounded-xl bg-gray-900/5 object-cover shadow-lg"
/>
<div
class="pointer-events-none absolute inset-0 rounded-xl ring-1 ring-gray-900/10 ring-inset"
></div>
</div>
<div class="relative">
<img
src="images/about/sans-rendez-vous-duo-recadré.jpg"
alt=""
class="aspect-2/3 w-full rounded-xl bg-gray-900/5 object-cover shadow-lg"
/>
<div
class="pointer-events-none absolute inset-0 rounded-xl ring-1 ring-gray-900/10 ring-inset"
></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</main>
{% endblock %}

View File

@@ -0,0 +1,69 @@
{% extends 'base.html.twig' %}
{# === Metadata (No Index pour le SEO) === #}
{% block metadata %}
<meta name="robots" content="noindex, nofollow" />
<title>
Politique de confidentialité - Arts-ticule
</title>
{% endblock %}
{# === Contenu principal === #}
{% block body %}
<section class="max-w-4xl mx-auto px-4 py-16">
<h1 class="text-3xl font-bold mb-6 text-center">
Politique de confidentialité
</h1>
<p class="mb-4">
Chez Arts-ticule, nous respectons votre vie privée et nous nous engageons
à protéger vos informations personnelles. Cette politique explique comment
nous collectons, utilisons et protégeons vos données.
</p>
<h2 class="text-xl font-semibold mt-6 mb-2">
1. Collecte des informations
</h2>
<p class="mb-4">
Nous pouvons collecter certaines informations lorsque vous utilisez notre
site, notamment votre nom, votre adresse e-mail, et toute donnée que vous
nous fournissez volontairement via nos formulaires de contact.
</p>
<h2 class="text-xl font-semibold mt-6 mb-2">
2. Utilisation des informations
</h2>
<p class="mb-4">
Les informations collectées sont utilisées pour :<ul
class="list-disc list-inside ml-4"
>
<li>Répondre à vos demandes et questions</li>
<li>Améliorer notre site et nos services</li>
<li>
Vous envoyer des communications importantes si vous y avez consenti
</li>
</ul>
</p>
<h2 class="text-xl font-semibold mt-6 mb-2">3. Partage des informations</h2>
<p class="mb-4">
Nous ne vendons ni ne louons vos informations personnelles à des tiers.
Vos données peuvent être partagées uniquement avec des prestataires de
confiance pour le fonctionnement du site ou si la loi l'exige.
</p>
<h2 class="text-xl font-semibold mt-6 mb-2">4. Sécurité des données</h2>
<p class="mb-4">
Nous mettons en œuvre des mesures techniques et organisationnelles pour
protéger vos données contre tout accès non autorisé, modification ou
suppression.
</p>
<h2 class="text-xl font-semibold mt-6 mb-2">5. Vos droits</h2>
<p class="mb-4">
Vous pouvez accéder, rectifier ou demander la suppression de vos données
personnelles. Pour exercer ces droits, contactez-nous via notre formulaire
de contact.
</p>
</section>
{% endblock %}

View File

@@ -0,0 +1,179 @@
{% extends 'base.html.twig' %}
{% block metadata %}
{# ============================
METADATA / SEO
============================ #}
{% set meta_title = meta_title is defined
? meta_title
: 'Spectacles vivants et artisanat au service des collectivités'
%}
{% set meta_description = meta_description is defined
? meta_description
: 'Découvrez des spectacles vivants et des fabrications artisanales conçus pour les collectivités, écoles et lieux culturels, alliant création, transmission et savoir-faire.'
%}
{% set meta_image = meta_image is defined
? meta_image
: asset('images/logo.jpg')
%}
{% set meta_url = meta_url is defined ? meta_url : app.request.uri %}
{% set meta_site_name = meta_site_name is defined
? meta_site_name
: 'Nom du site'
%}
{% set meta_type = meta_type is defined ? meta_type : 'website' %}
<title>
{{ meta_title }}
</title>
<meta name="description" content="{{ meta_description }}" />
<meta name="robots" content="index, follow" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta charset="utf-8" />
<link rel="canonical" href="{{ meta_url }}" />
{# ============================
OPEN GRAPH (Facebook, LinkedIn…)
============================ #}
<meta property="og:title" content="{{ meta_title }}" />
<meta property="og:description" content="{{ meta_description }}" />
<meta property="og:type" content="{{ meta_type }}" />
<meta property="og:url" content="{{ meta_url }}" />
<meta property="og:image" content="{{ meta_image }}" />
<meta property="og:site_name" content="{{ meta_site_name }}" />
<meta property="og:locale" content="fr_FR" />
{# Optionnel mais recommandé #}
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
{# ============================
TWITTER CARDS
============================ #}
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="{{ meta_title }}" />
<meta name="twitter:description" content="{{ meta_description }}" />
<meta name="twitter:image" content="{{ meta_image }}" />
{% endblock %}
{% block body %}
<!-- Header -->
<main class="isolate py-15">
<!-- Hero section -->
<div class="relative pt-14">
<div
aria-hidden="true"
class="absolute inset-x-0 -top-40 -z-10 transform-gpu overflow-hidden blur-3xl sm:-top-80"
>
<div
style="clip-path: polygon(74.1% 44.1%, 100% 61.6%, 97.5% 26.9%, 85.5% 0.1%, 80.7% 2%, 72.5% 32.5%, 60.2% 62.4%, 52.4% 68.1%, 47.5% 58.3%, 45.2% 34.5%, 27.5% 76.7%, 0.1% 64.9%, 17.9% 100%, 27.6% 76.8%, 76.1% 97.7%, 74.1% 44.1%)"
class="relative left-[calc(50%-11rem)] aspect-1155/678 w-144.5 -translate-x-1/2 rotate-30 bg-linear-to-tr from-[#ff80b5] to-[#F59E0B] opacity-30 sm:left-[calc(50%-30rem)] sm:w-288.75"
></div>
</div>
<div class="py-5 sm:py-6 lg:pb-7">
<div class="mx-auto max-w-7xl px-6 lg:px-8">
<div class="mx-auto max-w-2xl text-center">
<h1
class="text-5xl font-semibold tracking-tight text-balance text-gray-900 sm:text-7xl"
>
Spectacles vivants et fabrications artisanales
</h1>
<p
class="mt-8 text-lg font-medium text-pretty text-gray-500 sm:text-xl/8"
>
Les voyages, les projets de classe font partie de nos bons
souvenirs décole.
Alors poursuivons et proposons aux plus jeunes de vivre <strong>
des projets artistiques
</strong> !
</p>
<div class="mt-10 flex items-center justify-center gap-x-6">
<a
href="{{ path('show') }}"
class="rounded-md bg-amber-600 px-3.5 py-2.5 text-sm font-semibold text-white shadow-xs hover:bg-amber-500 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-amber-600"
>
Mes spectacles
</a>
<a
href="{{ path('about') }}"
class="text-sm/6 font-semibold text-gray-900"
>
Me connaître <span aria-hidden="true">→</span>
</a>
</div>
</div>
</div>
</div>
<div
aria-hidden="true"
class="absolute inset-x-0 top-[calc(100%-13rem)] -z-10 transform-gpu overflow-hidden blur-3xl sm:top-[calc(100%-30rem)]"
>
<div
style="clip-path: polygon(74.1% 44.1%, 100% 61.6%, 97.5% 26.9%, 85.5% 0.1%, 80.7% 2%, 72.5% 32.5%, 60.2% 62.4%, 52.4% 68.1%, 47.5% 58.3%, 45.2% 34.5%, 27.5% 76.7%, 0.1% 64.9%, 17.9% 100%, 27.6% 76.8%, 76.1% 97.7%, 74.1% 44.1%)"
class="relative left-[calc(50%+3rem)] aspect-1155/678 w-144.5 -translate-x-1/2 bg-linear-to-tr from-[#ff80b5] to-[#F59E0B] opacity-30 sm:left-[calc(50%+36rem)] sm:w-288.75"
></div>
</div>
</div>
<!-- Testimonial section -->
<div class="mx-auto mt-6 max-w-7xl sm:mt-12 sm:px-6 lg:px-8">
<div
class="relative overflow-hidden bg-gray-900 px-6 py-20 shadow-xl sm:rounded-3xl sm:px-10 sm:py-24 md:px-12 lg:px-20"
>
<img
src="images/mp-photo-affiche-gros-plan.jpg"
alt=""
class="absolute inset-0 size-full object-cover brightness-150 saturate-0"
/>
<div class="absolute inset-0 bg-gray-900/90 mix-blend-multiply"></div>
<div
aria-hidden="true"
class="absolute -top-56 -left-80 transform-gpu blur-3xl"
>
<div
style="clip-path: polygon(74.1% 44.1%, 100% 61.6%, 97.5% 26.9%, 85.5% 0.1%, 80.7% 2%, 72.5% 32.5%, 60.2% 62.4%, 52.4% 68.1%, 47.5% 58.3%, 45.2% 34.5%, 27.5% 76.7%, 0.1% 64.9%, 17.9% 100%, 27.6% 76.8%, 76.1% 97.7%, 74.1% 44.1%)"
class="aspect-1097/845 w-274.25 bg-linear-to-r from-[#ff4694] to-[#F59E0B] opacity-[0.45]"
></div>
</div>
<div
aria-hidden="true"
class="hidden md:absolute md:bottom-16 md:left-200 md:block md:transform-gpu md:blur-3xl"
>
<div
style="clip-path: polygon(74.1% 44.1%, 100% 61.6%, 97.5% 26.9%, 85.5% 0.1%, 80.7% 2%, 72.5% 32.5%, 60.2% 62.4%, 52.4% 68.1%, 47.5% 58.3%, 45.2% 34.5%, 27.5% 76.7%, 0.1% 64.9%, 17.9% 100%, 27.6% 76.8%, 76.1% 97.7%, 74.1% 44.1%)"
class="aspect-1097/845 w-274.25 bg-linear-to-r from-[#ff4694] to-[#F59E0B] opacity-25"
></div>
</div>
<div class="relative mx-auto max-w-2xl lg:mx-0">
<figure>
<blockquote
class="mt-6 text-lg font-semibold text-white sm:text-xl/8"
>
<p>
“Dans un monde de plus en plus technologique, au rythme
précipité, laissons de la place à limaginaire et la créativité.
Acceptons de se donner des bulles suspendues de création et
dévasion Mettons en valeur et en commun nos savoir-faire, nos
savoir-être Retrouvons de lhumanité, de lécoute, du partage,
de la cohésion ”
</p>
</blockquote>
<figcaption class="mt-6 text-base text-white">
<div class="font-semibold">
Marie-Pierre NAUCHE
</div>
<div class="mt-1">
Fondatrice de Arts-ticule
</div>
</figcaption>
</figure>
</div>
</div>
</div>
</main>
{% endblock %}

View File

@@ -0,0 +1,61 @@
{% extends 'base.html.twig' %}
{# === Metadata (No Index pour le SEO) === #}
{% block metadata %}
<meta name="robots" content="noindex, nofollow" />
<title>
Mentions légales - Arts-ticule
</title>
{% endblock %}
{# === Contenu principal === #}
{% block body %}
<section class="max-w-4xl mx-auto px-4 py-16">
<h1 class="text-3xl font-bold mb-6 text-center">Mentions légales</h1>
<p class="mb-4">
Conformément à la législation en vigueur, voici les informations légales
concernant le site <strong>Arts-ticule</strong>.
</p>
<h2 class="text-xl font-semibold mt-6 mb-2">1. Éditeur du site</h2>
<p class="mb-4">
Arts-ticule<br />
Adresse : 8 rue de la Dombes, Saint Etienne sur Chalaronne<br />
Directeur de la publication : Marie-Pierre NAUCHE
</p>
<h2 class="text-xl font-semibold mt-6 mb-2">2. Hébergeur</h2>
<p class="mb-4">
Le site est hébergé par :<br />
Contabo GmbH<br />
Adresse : Welfenstrasse 22 81541 Munich Germany<br />
Téléphone : +49 89 3564717 70
</p>
<h2 class="text-xl font-semibold mt-6 mb-2">3. Propriété intellectuelle</h2>
<p class="mb-4">
Tous les contenus présents sur le site (textes, images, vidéos, logos)
sont la propriété exclusive dArts-ticule ou de leurs auteurs respectifs.
Toute reproduction, modification ou distribution sans autorisation est
interdite.
</p>
<h2 class="text-xl font-semibold mt-6 mb-2">4. Données personnelles</h2>
<p class="mb-4">
Pour plus dinformations sur la collecte et le traitement des données
personnelles, veuillez consulter notre <a
href="{{ path('confidentialitypolicy') }}"
class="text-amber-600 underline"
>
Politique de confidentialité
</a>.
</p>
<h2 class="text-xl font-semibold mt-6 mb-2">5. Responsabilité</h2>
<p class="mb-4">
Arts-ticule ne saurait être tenu responsable des dommages directs ou
indirects pouvant survenir suite à laccès ou à lutilisation du site.
</p>
</section>
{% endblock %}

View File

@@ -0,0 +1,217 @@
{% extends 'base.html.twig' %}
{% block metadata %}
{# ============================
METADATA / SEO
============================ #}
{% set meta_title = meta_title is defined
? meta_title
: 'Ateliers artisanaux et créations manuelles pour collectivités'
%}
{% set meta_description = meta_description is defined
? meta_description
: 'Conception et animation dateliers artisanaux pour collectivités et écoles, autour de la couture, du cartonnage et de la création dobjets à partir de matériaux variés.'
%}
{% set meta_image = meta_image is defined
? meta_image
: asset('images/logo.jpg')
%}
{% set meta_url = meta_url is defined ? meta_url : app.request.uri %}
{% set meta_site_name = meta_site_name is defined
? meta_site_name
: 'Nom du site'
%}
{% set meta_type = meta_type is defined ? meta_type : 'website' %}
<title>
{{ meta_title }}
</title>
<meta name="description" content="{{ meta_description }}" />
<meta name="robots" content="index, follow" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta charset="utf-8" />
<link rel="canonical" href="{{ meta_url }}" />
{# ============================
OPEN GRAPH (Facebook, LinkedIn…)
============================ #}
<meta property="og:title" content="{{ meta_title }}" />
<meta property="og:description" content="{{ meta_description }}" />
<meta property="og:type" content="{{ meta_type }}" />
<meta property="og:url" content="{{ meta_url }}" />
<meta property="og:image" content="{{ meta_image }}" />
<meta property="og:site_name" content="{{ meta_site_name }}" />
<meta property="og:locale" content="fr_FR" />
{# Optionnel mais recommandé #}
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
{# ============================
TWITTER CARDS
============================ #}
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="{{ meta_title }}" />
<meta name="twitter:description" content="{{ meta_description }}" />
<meta name="twitter:image" content="{{ meta_image }}" />
{% endblock %}
{% block body %}
<div class="overflow-hidden bg-white py-12 sm:py-16">
<div class="mx-auto max-w-2xl px-6 lg:max-w-7xl lg:px-8">
<div class="max-w-4xl">
<p class="text-base/7 font-semibold text-amber-600">
Projets manuels et créatifs
</p>
<h1
class="mt-2 text-4xl font-semibold tracking-tight text-pretty text-gray-900 sm:text-5xl"
>
Co-construction et Accompagnement
</h1>
<p class="mt-6 text-xl/8 text-balance text-gray-700">
Vous avez des idées de « bricolage » avec vos élèves, vos enfants, vos
résidents, vous souhaitez réaliser des objets pour une occasion
spécifique, mais ils sont trop nombreux, vous avez peu de temps, peu
de place, peu de moyens, vous ne savez pas comment vous y prendre ? Je
suis là pour vous aider ! Proposition daccompagnement à la conduite
dateliers de créations manuelles plus spécifiquement en lien avec la
couture et le cartonnage : enfants dans le milieu scolaire rural ou
urbain, personnes âgées en structure daccueil… Matériaux privilégiés
: les matériaux souples tels que les tissus, fils, laines, cordes…les
matériaux semi-rigides tels que les papiers, cartons…
</p>
</div>
<section
class="mt-20 grid grid-cols-1 lg:grid-cols-2 lg:gap-x-8 lg:gap-y-16"
>
<div class="lg:pr-8">
<h2
class="mt-8 text-2xl font-semibold tracking-tight text-pretty text-gray-900"
>
Le déroulé
</h2>
<ul class="mt-5 text-base/7 text-gray-600">
<li>Recherche et choix des objets à réaliser</li>
<li>Définition du calendrier et des modalités dintervention</li>
<li>Mise en œuvre des réalisations</li>
<li>
Présentation de la fin des travaux, mise en valeur des objets
réalisés
</li>
</ul>
<h2
class="mt-8 text-2xl font-semibold tracking-tight text-pretty text-gray-900"
>
Objectifs
</h2>
<p class="mt-5 text-base/7 text-gray-600">
Allier exigence et bienveillance, développer des qualités de
rigueur, de concentration et découte, de partage.
</p>
<h2
class="mt-8 text-2xl font-semibold tracking-tight text-pretty text-gray-900"
>
Construction de soi
</h2>
<p class="mt-5 text-base/7 text-gray-600">
Développer sa propre motricité, sa rigueur, sa sensibilité, son
goût, exploiter et faire référence à ses compétences en calcul et
mesures, enrichir sa culture intellectuelle et artistique.
</p>
</div>
<div class="pt-16 lg:row-span-2 lg:-mr-16 xl:mr-auto">
<div
class="-mx-8 grid grid-cols-2 gap-4 sm:-mx-16 sm:grid-cols-4 lg:mx-0 lg:grid-cols-2 xl:gap-8"
>
<div
class="aspect-square overflow-hidden rounded-xl shadow-xl outline-1 -outline-offset-1 outline-black/10"
>
<img
src="/images/manual-project/COUT-coussin-champignon.jpg"
alt=""
class="block size-full object-cover"
/>
</div>
<div
class="-mt-8 aspect-square overflow-hidden rounded-xl shadow-xl outline-1 -outline-offset-1 outline-black/10 lg:-mt-40"
>
<img
src="/images/manual-project/COUT-tigre-enzo.jpg"
alt=""
class="block size-full object-cover"
/>
</div>
<div
class="aspect-square overflow-hidden rounded-xl shadow-xl outline-1 -outline-offset-1 outline-black/10"
>
<img
src="/images/manual-project/COUT-yan-tigre.jpg"
alt=""
class="block size-full object-cover"
/>
</div>
<div
class="-mt-8 aspect-square overflow-hidden rounded-xl shadow-xl outline-1 -outline-offset-1 outline-black/10 lg:-mt-40"
>
<img
src="/images/manual-project/TM-LAPINS-POMPOM.jpg"
alt=""
class="block size-full object-cover"
/>
</div>
</div>
</div>
</section>
</div>
</div>
<div class="bg-white py-6 sm:py-10">
<div class="mx-auto max-w-7xl px-6 lg:px-8">
<dl
class="mx-auto mt-16 grid max-w-2xl grid-cols-1 gap-x-8 gap-y-16 text-base/7 sm:grid-cols-2 lg:mx-0 lg:max-w-none lg:grid-cols-3"
>
<div>
<dt class="font-semibold text-gray-900">
Gestion du groupe
</dt>
<dd class="mt-1 text-gray-600">
rigueur, bienveillance, exigence, mettre en exergue pour chaque
participant une de ses qualités
</dd>
</div>
<div>
<dt class="font-semibold text-gray-900">
Economie et environnement
</dt>
<dd class="mt-1 text-gray-600">
travailler pour partie avec des matériaux récupérés
</dd>
</div>
<div>
<dt class="font-semibold text-gray-900">
Qualité
</dt>
<dd class="mt-1 text-gray-600">soin, esthétisme</dd>
</div>
<div>
<dt class="font-semibold text-gray-900">
Valorisation
</dt>
<dd class="mt-1 text-gray-600">
donner à voir les travaux aboutis sous forme dexposition publique,
dinvitation de partenaires
</dd>
</div>
<div>
<dt class="font-semibold text-gray-900">
Transmission
</dt>
<dd class="mt-1 text-gray-600">partage de savoir-faire</dd>
</div>
</dl>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,130 @@
{% extends 'base.html.twig' %}
{% block body %}
{% set images = news.newsImages|default([]) %}
{% set mainImage = images|first %}
{% set secondaryImages = images|slice(1) %}
<div class="bg-white py-32">
<div class="mx-auto max-w-7xl px-6 lg:px-8">
<div
class="mx-auto flex max-w-2xl flex-col justify-between gap-16 lg:mx-0 lg:max-w-none lg:flex-row"
>
<div class="w-full lg:max-w-lg lg:flex-auto">
<h2
class="text-3xl font-semibold tracking-tight text-pretty text-gray-900 sm:text-4xl"
>
{{ news.title }}
</h2>
{% if mainImage %}
<img
src="{{ mainImage.image.url }}"
alt="{{ news.title }}"
class="mt-16 aspect-6/5 w-full rounded-2xl object-cover outline-1 -outline-offset-1 outline-black/5 lg:aspect-auto lg:h-138"
/>
{% endif %}
{% if secondaryImages is not empty %}
<div class="flex gap-2 mt-6">
{% for image in secondaryImages %}
<img
src="{{ image.image.url }}"
alt="{{ news.title }}"
class="w-20 h-20 object-cover rounded-lg"
/>
{% endfor %}
</div>
{% endif %}
<div
class="mt-6 flex border-t border-gray-900/5 pt-6 items-center gap-x-2"
>
<span class="text-sm font-medium text-gray-700">Partager :</span>
{% set shareUrl =
absolute_url(
path(
'actualites',
{
slug: news.slug
}
)
)
%}
<!-- LinkedIn -->
<a
href="https://www.linkedin.com/sharing/share-offsite/?url={{
shareUrl
}}"
target="_blank"
rel="noopener noreferrer"
class="flex items-center justify-center size-9 rounded-full bg-gray-100 text-gray-600 hover:bg-amber-500/10 hover:text-amber-500 transition"
aria-label="Partager sur LinkedIn"
>
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
class="bi bi-linkedin"
viewbox="0 0 16 16"
>
<path
d="M0 1.146C0 .513.526 0 1.175 0h13.65C15.474 0 16 .513 16 1.146v13.708c0 .633-.526 1.146-1.175 1.146H1.175C.526 16 0 15.487 0 14.854zm4.943 12.248V6.169H2.542v7.225zm-1.2-8.212c.837 0 1.358-.554 1.358-1.248-.015-.709-.52-1.248-1.342-1.248S2.4 3.226 2.4 3.934c0 .694.521 1.248 1.327 1.248zm4.908 8.212V9.359c0-.216.016-.432.08-.586.173-.431.568-.878 1.232-.878.869 0 1.216.662 1.216 1.634v3.865h2.401V9.25c0-2.22-1.184-3.252-2.764-3.252-1.274 0-1.845.7-2.165 1.193v.025h-.016l.016-.025V6.169h-2.4c.03.678 0 7.225 0 7.225z"
/>
</svg>
</a>
<!-- Facebook -->
<a
href="https://www.facebook.com/sharer/sharer.php?u={{ shareUrl }}"
target="_blank"
rel="noopener noreferrer"
class="flex items-center justify-center size-9 rounded-full bg-gray-100 text-gray-600 hover:bg-amber-500/10 hover:text-amber-500 transition"
aria-label="Partager sur Facebook"
>
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
class="bi bi-facebook"
viewbox="0 0 16 16"
>
<path
d="M16 8.049c0-4.446-3.582-8.05-8-8.05C3.58 0-.002 3.603-.002 8.05c0 4.017 2.926 7.347 6.75 7.951v-5.625h-2.03V8.05H6.75V6.275c0-2.017 1.195-3.131 3.022-3.131.876 0 1.791.157 1.791.157v1.98h-1.009c-.993 0-1.303.621-1.303 1.258v1.51h2.218l-.354 2.326H9.25V16c3.824-.604 6.75-3.934 6.75-7.951"
/>
</svg>
</a>
<!-- Twitter / X -->
<a
href="https://twitter.com/intent/tweet?url={{
shareUrl
}}&text={{ news.title|url_encode }}"
target="_blank"
rel="noopener noreferrer"
class="flex items-center justify-center size-9 rounded-full bg-gray-100 text-gray-600 hover:bg-amber-500/10 hover:text-amber-500 transition"
aria-label="Partager sur Twitter"
>
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
class="bi bi-twitter"
viewbox="0 0 16 16"
>
<path
d="M5.026 15c6.038 0 9.341-5.003 9.341-9.334q.002-.211-.006-.422A6.7 6.7 0 0 0 16 3.542a6.7 6.7 0 0 1-1.889.518 3.3 3.3 0 0 0 1.447-1.817 6.5 6.5 0 0 1-2.087.793A3.286 3.286 0 0 0 7.875 6.03a9.32 9.32 0 0 1-6.767-3.429 3.29 3.29 0 0 0 1.018 4.382A3.3 3.3 0 0 1 .64 6.575v.045a3.29 3.29 0 0 0 2.632 3.218 3.2 3.2 0 0 1-.865.115 3 3 0 0 1-.614-.057 3.28 3.28 0 0 0 3.067 2.277A6.6 6.6 0 0 1 .78 13.58a6 6 0 0 1-.78-.045A9.34 9.34 0 0 0 5.026 15"
/>
</svg>
</a>
</div>
</div>
<div class="w-full lg:max-w-xl lg:flex-auto">
{{ news.description|raw }}
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,267 @@
{% extends 'base.html.twig' %}
{% block metadata %}
{# ============================
METADATA / SEO
============================ #}
{% set meta_title = meta_title is defined
? meta_title
: 'Projets artistiques participatifs pour écoles et collectivités'
%}
{% set meta_description = meta_description is defined
? meta_description
: 'Accompagnement et co-construction de projets artistiques pour écoles, collectivités et structures daccueil : création, scénographie et mise en jeu adaptées à chaque public.'
%}
{% set meta_image = meta_image is defined
? meta_image
: asset('images/logo.jpg')
%}
{% set meta_url = meta_url is defined ? meta_url : app.request.uri %}
{% set meta_site_name = meta_site_name is defined
? meta_site_name
: 'Nom du site'
%}
{% set meta_type = meta_type is defined ? meta_type : 'website' %}
<title>
{{ meta_title }}
</title>
<meta name="description" content="{{ meta_description }}" />
<meta name="robots" content="index, follow" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta charset="utf-8" />
<link rel="canonical" href="{{ meta_url }}" />
{# ============================
OPEN GRAPH (Facebook, LinkedIn…)
============================ #}
<meta property="og:title" content="{{ meta_title }}" />
<meta property="og:description" content="{{ meta_description }}" />
<meta property="og:type" content="{{ meta_type }}" />
<meta property="og:url" content="{{ meta_url }}" />
<meta property="og:image" content="{{ meta_image }}" />
<meta property="og:site_name" content="{{ meta_site_name }}" />
<meta property="og:locale" content="fr_FR" />
{# Optionnel mais recommandé #}
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
{# ============================
TWITTER CARDS
============================ #}
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="{{ meta_title }}" />
<meta name="twitter:description" content="{{ meta_description }}" />
<meta name="twitter:image" content="{{ meta_image }}" />
{% endblock %}
{% block body %}
<div class="overflow-hidden bg-white py-12 sm:py-16">
<div class="mx-auto max-w-2xl px-6 lg:max-w-7xl lg:px-8">
<div class="max-w-4xl">
<p class="text-base/7 font-semibold text-amber-600">
Projets artistiques
</p>
<h1
class="mt-2 text-4xl font-semibold tracking-tight text-pretty text-gray-900 sm:text-5xl"
>
Co-construction et Accompagnement
</h1>
<p class="mt-6 text-xl/8 text-balance text-gray-700">
Vous avez un projet de classe, un projet décole, un thème défini ou
non, des idées dun scénario avec vos élèves, vos enfants, vos
résidents pour une occasion spécifique, vous visualisez
approximativement la fin du projet mais ils sont trop nombreux,
novices, pas toujours très autonomes et vous avez peu de temps, peu de
place, peu de moyens, vous ne savez pas comment vous y prendre… Je
suis là pour vous aider ! Proposition daccompagnement à la création
et la mise en jeu de projets artistiques à destination des enfants
dans le milieu scolaire rural ou urbain, des personnes âgées en
structure daccueil…
</p>
</div>
<section
class="mt-20 grid grid-cols-1 lg:grid-cols-2 lg:gap-x-8 lg:gap-y-16"
>
<div class="lg:pr-8">
<h2
class="mt-8 text-2xl font-semibold tracking-tight text-pretty text-gray-900"
>
Le déroulé
</h2>
<ul class="mt-5 text-base/7 text-gray-600">
<li>Définition du cahier des charges</li>
<li>Définition du calendrier et des modalités dintervention</li>
<li>
Co-écriture de textes avec les acteurs du projet Recherche et
co-construction déléments de décors et accessoires
</li>
<li>
Mise en jeu dans un espace dédié Présentation de la fin des
travaux ou dun spectacle en fin de parcours
</li>
</ul>
<h2
class="mt-8 text-2xl font-semibold tracking-tight text-pretty text-gray-900"
>
Objectifs
</h2>
<p class="mt-5 text-base/7 text-gray-600">
Faire émerger et valoriser les compétences de chaque participant,
allier exigence et bienveillance, développer des qualités de
rigueur, de partage, découte et de concentration.
</p>
<h2
class="mt-8 text-2xl font-semibold tracking-tight text-pretty text-gray-900"
>
Construction de soi
</h2>
<p class="mt-5 text-base/7 text-gray-600">
Développer sa propre sensibilité, son imaginaire, sa créativité,
enrichir sa culture artistique et intellectuelle, faire naître ou
conforter lestime de soi, la confiance en soi.
</p>
</div>
<div class="pt-16 lg:row-span-2 lg:-mr-16 xl:mr-auto">
<div
class="-mx-8 grid grid-cols-2 gap-4 sm:-mx-16 sm:grid-cols-4 lg:mx-0 lg:grid-cols-2 xl:gap-8"
>
<div
class="aspect-square overflow-hidden rounded-xl shadow-xl outline-1 -outline-offset-1 outline-black/10"
>
<img
src="/images/project/TM-création-décor-baleine.jpg"
alt=""
class="block size-full object-cover"
/>
</div>
<div
class="-mt-8 aspect-square overflow-hidden rounded-xl shadow-xl outline-1 -outline-offset-1 outline-black/10 lg:-mt-40"
>
<img
src="/images/project/TM-pieuvre.JPG"
alt=""
class="block size-full object-cover"
/>
</div>
<div
class="aspect-square overflow-hidden rounded-xl shadow-xl outline-1 -outline-offset-1 outline-black/10"
>
<img
src="/images/project/TM-hector-papier-maché.jpg"
alt=""
class="block size-full object-cover"
/>
</div>
<div
class="-mt-8 aspect-square overflow-hidden rounded-xl shadow-xl outline-1 -outline-offset-1 outline-black/10 lg:-mt-40"
>
<img
src="/images/project/TM-création-décor-baleine.jpg"
alt=""
class="block size-full object-cover"
/>
</div>
</div>
</div>
</section>
</div>
</div>
<div class="bg-white py-6 sm:py-8">
<div class="mx-auto max-w-7xl px-6 lg:px-8">
<div class="mx-auto mt-16 max-w-2xl sm:mt-20 lg:mt-24 lg:max-w-none">
<dl
class="grid max-w-xl grid-cols-1 gap-x-8 gap-y-16 lg:max-w-none lg:grid-cols-3"
>
<div class="flex flex-col">
<dt class="text-base/7 font-semibold text-gray-900">
<div
class="mb-6 flex size-10 items-center justify-center rounded-lg bg-amber-600"
>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="size-6 text-white"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M7.5 21 3 16.5m0 0L7.5 12M3 16.5h13.5m0-13.5L21 7.5m0 0L16.5 12M21 7.5H7.5"
/>
</svg>
</div>Adaptabilité
</dt>
<dd class="mt-1 flex flex-auto flex-col text-base/7 text-gray-600">
<p class="flex-auto">
à votre budget, votre localisation, votre thème.
</p>
</dd>
</div>
<div class="flex flex-col">
<dt class="text-base/7 font-semibold text-gray-900">
<div
class="mb-6 flex size-10 items-center justify-center rounded-lg bg-amber-600"
>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="size-6 text-white"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="m7.848 8.25 1.536.887M7.848 8.25a3 3 0 1 1-5.196-3 3 3 0 0 1 5.196 3Zm1.536.887a2.165 2.165 0 0 1 1.083 1.839c.005.351.054.695.14 1.024M9.384 9.137l2.077 1.199M7.848 15.75l1.536-.887m-1.536.887a3 3 0 1 1-5.196 3 3 3 0 0 1 5.196-3Zm1.536-.887a2.165 2.165 0 0 0 1.083-1.838c.005-.352.054-.695.14-1.025m-1.223 2.863 2.077-1.199m0-3.328a4.323 4.323 0 0 1 2.068-1.379l5.325-1.628a4.5 4.5 0 0 1 2.48-.044l.803.215-7.794 4.5m-2.882-1.664A4.33 4.33 0 0 0 10.607 12m3.736 0 7.794 4.5-.802.215a4.5 4.5 0 0 1-2.48-.043l-5.326-1.629a4.324 4.324 0 0 1-2.068-1.379M14.343 12l-2.882 1.664"
/>
</svg>
</div>Sur mesure
</dt>
<dd class="mt-1 flex flex-auto flex-col text-base/7 text-gray-600">
<p class="flex-auto">
projet unique et personnalisé.
</p>
</dd>
</div>
<div class="flex flex-col">
<dt class="text-base/7 font-semibold text-gray-900">
<div
class="mb-6 flex size-10 items-center justify-center rounded-lg bg-amber-600"
>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="size-6 text-white"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M9.813 15.904 9 18.75l-.813-2.846a4.5 4.5 0 0 0-3.09-3.09L2.25 12l2.846-.813a4.5 4.5 0 0 0 3.09-3.09L9 5.25l.813 2.846a4.5 4.5 0 0 0 3.09 3.09L15.75 12l-2.846.813a4.5 4.5 0 0 0-3.09 3.09ZM18.259 8.715 18 9.75l-.259-1.035a3.375 3.375 0 0 0-2.455-2.456L14.25 6l1.036-.259a3.375 3.375 0 0 0 2.455-2.456L18 2.25l.259 1.035a3.375 3.375 0 0 0 2.456 2.456L21.75 6l-1.035.259a3.375 3.375 0 0 0-2.456 2.456ZM16.894 20.567 16.5 21.75l-.394-1.183a2.25 2.25 0 0 0-1.423-1.423L13.5 18.75l1.183-.394a2.25 2.25 0 0 0 1.423-1.423l.394-1.183.394 1.183a2.25 2.25 0 0 0 1.423 1.423l1.183.394-1.183.394a2.25 2.25 0 0 0-1.423 1.423Z"
/>
</svg>
</div>Originalité et créativité
</dt>
<dd class="mt-1 flex flex-auto flex-col text-base/7 text-gray-600">
<p class="flex-auto">
accessoires et scénographie créés avec les participants .
</p>
</dd>
</div>
</dl>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,189 @@
{% extends 'base.html.twig' %}
{% block metadata %}
{# ============================
METADATA / SEO
============================ #}
{% set meta_title = meta_title is defined
? meta_title
: 'Spectacles vivants et artisanat au service des collectivités'
%}
{% set meta_description = meta_description is defined
? meta_description
: 'Découvrez des spectacles vivants et des fabrications artisanales conçus pour les collectivités, écoles et lieux culturels, alliant création, transmission et savoir-faire.'
%}
{% set meta_image = meta_image is defined
? meta_image
: asset('images/logo.jpg')
%}
{% set meta_url = meta_url is defined ? meta_url : app.request.uri %}
{% set meta_site_name = meta_site_name is defined
? meta_site_name
: 'Nom du site'
%}
{% set meta_type = meta_type is defined ? meta_type : 'website' %}
<title>
{{ meta_title }}
</title>
<meta name="description" content="{{ meta_description }}" />
<meta name="robots" content="index, follow" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta charset="utf-8" />
<link rel="canonical" href="{{ meta_url }}" />
{# ============================
OPEN GRAPH (Facebook, LinkedIn…)
============================ #}
<meta property="og:title" content="{{ meta_title }}" />
<meta property="og:description" content="{{ meta_description }}" />
<meta property="og:type" content="{{ meta_type }}" />
<meta property="og:url" content="{{ meta_url }}" />
<meta property="og:image" content="{{ meta_image }}" />
<meta property="og:site_name" content="{{ meta_site_name }}" />
<meta property="og:locale" content="fr_FR" />
{# Optionnel mais recommandé #}
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
{# ============================
TWITTER CARDS
============================ #}
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="{{ meta_title }}" />
<meta name="twitter:description" content="{{ meta_description }}" />
<meta name="twitter:image" content="{{ meta_image }}" />
{% endblock %}
{% block body %}
<div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
<!-- We've used 3xl here, but feel free to try other max-widths based on your needs -->
<div class="mx-auto max-w-7xl">
<!-- Content goes here -->
{{
render(
controller(
'App\\Controller\\RenderFeatureController::news',
{
isCarousel: true
}
)
)
}}
</div>
</div>
<div class="bg-white py-6 sm:py-8">
<div class="mx-auto max-w-7xl px-6 lg:px-8">
<div class="mx-auto max-w-2xl lg:mx-0">
<h2
class="text-4xl font-semibold tracking-tight text-pretty text-gray-900 sm:text-5xl"
>
Conte et marionnettes
</h2>
<p class="mt-6 text-lg/8 text-gray-600">
Une démarche de création pour introduire, enrichir, conclure des
projets de classe, des projets décole ou sinscrire dans la
thématique dune manifestation ou dun projet global. Un spectacle
pour sinitier à lécoute, la concentration et devenir un spectateur
averti. Un texte avec des mots choisis pour élargir le vocabulaire du
jeune public. Des thématiques autour de problématiques actuelles,
-relation avec les autres, respect de lenvironnement- pour ouvrir
débat et questionnement. Des choix scénographiques privilégiant des
décors construits à partir déléments existants ou transformés.
</p>
</div>
<div class="mx-auto mt-16 max-w-2xl sm:mt-20 lg:mt-24 lg:max-w-none">
<dl
class="grid max-w-xl grid-cols-1 gap-x-8 gap-y-16 lg:max-w-none lg:grid-cols-3"
>
<div class="flex flex-col">
<dt class="text-base/7 font-semibold text-gray-900">
<div
class="mb-6 flex size-10 items-center justify-center rounded-lg bg-amber-600"
>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="size-6 text-white"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M9.813 15.904 9 18.75l-.813-2.846a4.5 4.5 0 0 0-3.09-3.09L2.25 12l2.846-.813a4.5 4.5 0 0 0 3.09-3.09L9 5.25l.813 2.846a4.5 4.5 0 0 0 3.09 3.09L15.75 12l-2.846.813a4.5 4.5 0 0 0-3.09 3.09ZM18.259 8.715 18 9.75l-.259-1.035a3.375 3.375 0 0 0-2.455-2.456L14.25 6l1.036-.259a3.375 3.375 0 0 0 2.455-2.456L18 2.25l.259 1.035a3.375 3.375 0 0 0 2.456 2.456L21.75 6l-1.035.259a3.375 3.375 0 0 0-2.456 2.456ZM16.894 20.567 16.5 21.75l-.394-1.183a2.25 2.25 0 0 0-1.423-1.423L13.5 18.75l1.183-.394a2.25 2.25 0 0 0 1.423-1.423l.394-1.183.394 1.183a2.25 2.25 0 0 0 1.423 1.423l1.183.394-1.183.394a2.25 2.25 0 0 0-1.423 1.423Z"
/>
</svg>
</div>Créativité
</dt>
<dd class="mt-1 flex flex-auto flex-col text-base/7 text-gray-600">
<p class="flex-auto">
conte créé à partir dexpériences vécues ; des objets de seconde
vie prennent forment dans ce conte.
</p>
</dd>
</div>
<div class="flex flex-col">
<dt class="text-base/7 font-semibold text-gray-900">
<div
class="mb-6 flex size-10 items-center justify-center rounded-lg bg-amber-600"
>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="size-6 text-white"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="m21 21-5.197-5.197m0 0A7.5 7.5 0 1 0 5.196 5.196a7.5 7.5 0 0 0 10.607 10.607ZM10.5 7.5v6m3-3h-6"
/>
</svg>
</div>Disponibilité
</dt>
<dd class="mt-1 flex flex-auto flex-col text-base/7 text-gray-600">
<p class="flex-auto">
déplacement partout en France pour partager un temps artistique.
</p>
</dd>
</div>
<div class="flex flex-col">
<dt class="text-base/7 font-semibold text-gray-900">
<div
class="mb-6 flex size-10 items-center justify-center rounded-lg bg-amber-600"
>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="size-6 text-white"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M7.5 21 3 16.5m0 0L7.5 12M3 16.5h13.5m0-13.5L21 7.5m0 0L16.5 12M21 7.5H7.5"
/>
</svg>
</div>Adaptabilité
</dt>
<dd class="mt-1 flex flex-auto flex-col text-base/7 text-gray-600">
<p class="flex-auto">
Jeu et interactions en fonction du public
</p>
</dd>
</div>
</dl>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,237 @@
{% block body %}
{% if (news|length) > 0 %}
{% if isCarousel == false %}
<div class="bg-white py-24 sm:py-32">
<div class="mx-auto max-w-7xl px-6 lg:px-8">
<div class="mx-auto max-w-2xl lg:max-w-4xl">
<h2
class="text-4xl font-semibold tracking-tight text-pretty text-gray-900 sm:text-5xl"
>
Les spectacles
</h2>
<p class="mt-2 text-lg/8 text-gray-600">
Retrouvez mes derniers spectacles.
</p>
<div class="mt-16 space-y-20 lg:mt-20">
{% for new in news %}
<article
class="relative isolate flex flex-col gap-8 lg:flex-row"
>
{% if new.newsImages is defined %}
<div
class="relative aspect-video sm:aspect-2/1 lg:aspect-square lg:w-64 lg:shrink-0"
>
<img
src="{{ new.newsImages[0].image.url }}"
alt=""
class="absolute inset-0 size-full rounded-2xl bg-gray-50 object-cover"
/>
<div
class="absolute inset-0 rounded-2xl inset-ring inset-ring-gray-900/10"
></div>
</div>
{% endif %}
<div>
<div class="flex items-center gap-x-4 text-xs">
<time
datetime="{{ new.updatedAt|date('Y-m-d') }}"
class="text-gray-500"
>
{{ new.updatedAt|date('d M Y') }}
</time>
</div>
<div class="group relative max-w-xl">
<h3
class="mt-3 text-lg/6 font-semibold text-gray-900 group-hover:text-gray-600"
>
<a href="#">
<span class="absolute inset-0"></span>
{{ new.title }}
</a>
</h3>
<p class="mt-5 text-sm/6 text-gray-600">
{{ new.description|u.truncate(300, '…', false)|raw }}
</p>
</div>
<div
class="mt-6 flex border-t border-gray-900/5 pt-6 items-center gap-x-2"
>
<span class="text-sm font-medium text-gray-700">
Partager :
</span>
{% set shareUrl =
absolute_url(
path(
'actualites',
{
slug: news.slug
}
)
)
%}
<!-- LinkedIn -->
<a
href="https://www.linkedin.com/sharing/share-offsite/?url={{
shareUrl
}}"
target="_blank"
rel="noopener noreferrer"
class="flex items-center justify-center size-9 rounded-full bg-gray-100 text-gray-600 hover:bg-amber-500/10 hover:text-amber-500 transition"
aria-label="Partager sur LinkedIn"
>
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
class="bi bi-linkedin"
viewbox="0 0 16 16"
>
<path
d="M0 1.146C0 .513.526 0 1.175 0h13.65C15.474 0 16 .513 16 1.146v13.708c0 .633-.526 1.146-1.175 1.146H1.175C.526 16 0 15.487 0 14.854zm4.943 12.248V6.169H2.542v7.225zm-1.2-8.212c.837 0 1.358-.554 1.358-1.248-.015-.709-.52-1.248-1.342-1.248S2.4 3.226 2.4 3.934c0 .694.521 1.248 1.327 1.248zm4.908 8.212V9.359c0-.216.016-.432.08-.586.173-.431.568-.878 1.232-.878.869 0 1.216.662 1.216 1.634v3.865h2.401V9.25c0-2.22-1.184-3.252-2.764-3.252-1.274 0-1.845.7-2.165 1.193v.025h-.016l.016-.025V6.169h-2.4c.03.678 0 7.225 0 7.225z"
/>
</svg>
</a>
<!-- Facebook -->
<a
href="https://www.facebook.com/sharer/sharer.php?u={{
shareUrl
}}"
target="_blank"
rel="noopener noreferrer"
class="flex items-center justify-center size-9 rounded-full bg-gray-100 text-gray-600 hover:bg-amber-500/10 hover:text-amber-500 transition"
aria-label="Partager sur Facebook"
>
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
class="bi bi-facebook"
viewbox="0 0 16 16"
>
<path
d="M16 8.049c0-4.446-3.582-8.05-8-8.05C3.58 0-.002 3.603-.002 8.05c0 4.017 2.926 7.347 6.75 7.951v-5.625h-2.03V8.05H6.75V6.275c0-2.017 1.195-3.131 3.022-3.131.876 0 1.791.157 1.791.157v1.98h-1.009c-.993 0-1.303.621-1.303 1.258v1.51h2.218l-.354 2.326H9.25V16c3.824-.604 6.75-3.934 6.75-7.951"
/>
</svg>
</a>
<!-- Twitter / X -->
<a
href="https://twitter.com/intent/tweet?url={{
shareUrl
}}&text={{ new.title|url_encode }}"
target="_blank"
rel="noopener noreferrer"
class="flex items-center justify-center size-9 rounded-full bg-gray-100 text-gray-600 hover:bg-amber-500/10 hover:text-amber-500 transition"
aria-label="Partager sur Twitter"
>
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="currentColor"
class="bi bi-twitter"
viewbox="0 0 16 16"
>
<path
d="M5.026 15c6.038 0 9.341-5.003 9.341-9.334q.002-.211-.006-.422A6.7 6.7 0 0 0 16 3.542a6.7 6.7 0 0 1-1.889.518 3.3 3.3 0 0 0 1.447-1.817 6.5 6.5 0 0 1-2.087.793A3.286 3.286 0 0 0 7.875 6.03a9.32 9.32 0 0 1-6.767-3.429 3.29 3.29 0 0 0 1.018 4.382A3.3 3.3 0 0 1 .64 6.575v.045a3.29 3.29 0 0 0 2.632 3.218 3.2 3.2 0 0 1-.865.115 3 3 0 0 1-.614-.057 3.28 3.28 0 0 0 3.067 2.277A6.6 6.6 0 0 1 .78 13.58a6 6 0 0 1-.78-.045A9.34 9.34 0 0 0 5.026 15"
/>
</svg>
</a>
</div>
</div>
</article>
{% endfor %}
</div>
</div>
</div>
</div>
{% else %}
<div class="bg-white py-24 sm:py-32">
<div class="mx-auto px-6 lg:px-8">
<h2 class="text-4xl font-semibold text-gray-900 sm:text-5xl">
Les spectacles
</h2>
<p class="mt-2 text-lg text-gray-600">
Retrouvez mes derniers spectacles.
</p>
<div class="mt-16 flex">
<div class="swiper" data-controller="render-feature--news-carousel">
<div class="swiper-wrapper">
{% for new in news %}
{% set images = new.newsImages|default([]) %}
{% set mainImage = images|first %}
{% set secondaryImages = images|slice(1) %}
<div class="swiper-slide">
<article class="flex flex-col lg:flex-row rounded-2xl">
{# Image à gauche #}
{% if mainImage %}
<div
class="w-full lg:w-1/2 h-100 pl-20 pr-20 lg:pr-10 py-10"
>
<img
src="{{ new.newsImages[0].image.url }}"
alt="{{ new.title }}"
class="w-full h-full object-cover"
/>
{% if secondaryImages is not empty %}
<div class="flex gap-2 mt-6">
{% for image in secondaryImages %}
<img
src="{{ image.image.url }}"
alt="{{ new.title }}"
class="w-20 h-20 object-cover rounded-lg"
/>
{% endfor %}
</div>
{% endif %}
</div>
{% endif %}
{# Contenu à droite #}
<div
class="flex flex-col justify-center w-full lg:w-1/2 pr-20 pl-20 lg:pl-10"
>
<time class="text-xs text-gray-500">
{{ new.updatedAt|date('d M Y') }}
</time>
<a
class="mt-2 text-xl font-semibold text-gray-900"
href="{{
path(
'actualites',
{
slug: new.slug
}
)
}}"
>
{{ new.title }}
</a>
<p class="mt-4 text-sm text-gray-600">
{{
new.description|striptags|u.truncate(220, '…', true)
}}
</p>
</div>
</article>
</div>
{% endfor %}
</div>
<div class="swiper-pagination"></div>
<div class="swiper-button-prev"></div>
<div class="swiper-button-next"></div>
</div>
</div>
</div>
</div>
{% endif %}
{% endif %}
{% endblock %}

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?><urlset
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
>
{% for url in urls %}
<url>
<loc>
{{ absolute_url(url.loc) }}
</loc>
<changefreq>
weekly
</changefreq>
<priority>
{{ url.priority }}
</priority>
</url>
{% endfor %}
</urlset>