templates/base.html.twig line 1
<!DOCTYPE html><html lang="fr"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">{% block meta %}<meta name="author" content="DAIP"/><meta property="fb:app_id" content="1604133883317306" />{% endblock %}<title>{% block title %}DAIP - Direction de l'Apprentissage et de l'Insertion Professionnelle{% endblock %}</title><!-- Tailwind CSS --><script src="https://cdn.tailwindcss.com"></script><!-- Configuration du thème --><script>tailwind.config = {theme: {extend: {colors: {primary: {50: '#eef2ff',100: '#e0e7ff',200: '#c7d2fe',300: '#a5b4fc',400: '#818cf8',500: '#6366f1',600: '#4f46e5',700: '#4338ca',800: '#3730a3',900: '#312e81',},secondary: {50: '#f5f3ff',100: '#ede9fe',200: '#ddd6fe',300: '#c4b5fd',400: '#a78bfa',500: '#8b5cf6',600: '#7c3aed',700: '#6d28d9',800: '#5b21b6',900: '#4c1d95',}},animation: {'scroll': 'scroll 30s linear infinite','scroll-reverse': 'scroll 30s linear infinite reverse','fade-in': 'fadeIn 0.5s ease-in-out','slide-up': 'slideUp 0.6s ease-out',},keyframes: {scroll: {'0%': { transform: 'translateX(0)' },'100%': { transform: 'translateX(-50%)' }},fadeIn: {'0%': { opacity: '0' },'100%': { opacity: '1' }},slideUp: {'0%': { transform: 'translateY(20px)', opacity: '0' },'100%': { transform: 'translateY(0)', opacity: '1' }}}}}}</script><!-- Font Awesome --><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"><!-- Google Fonts --><link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@300;400;500;600;700;800&display=swap" rel="stylesheet"><style>body { font-family: 'Plus Jakarta Sans', sans-serif; }.gradient-text {background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);-webkit-background-clip: text;-webkit-text-fill-color: transparent;}.hero-gradient {background: radial-gradient(circle at top right, #667eea 0%, #764ba2 100%);}.card-hover {transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);}.card-hover:hover {transform: translateY(-8px) scale(1.02);box-shadow: 0 20px 40px -15px rgba(102, 126, 234, 0.3);}.glass-effect {background: rgba(255, 255, 255, 0.1);backdrop-filter: blur(10px);border: 1px solid rgba(255, 255, 255, 0.2);}@keyframes float {0%, 100% { transform: translateY(0); }50% { transform: translateY(-10px); }}.float { animation: float 6s ease-in-out infinite; }html {scroll-behavior: smooth;}</style>{% block stylesheets %}{% endblock %}</head><body class="bg-gray-50 overflow-x-hidden">{% include 'header.html.twig' %}<main>{% block body %}{% endblock %}</main>{% include 'footer.html.twig' %}{% block javascripts %}<!-- Alpine.js en premier (sans defer pour garantir l'ordre) --><script src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script><!-- jQuery ensuite --><script src="https://code.jquery.com/jquery-3.6.0.min.js"></script><!-- Script personnalisé pour forcer la réinitialisation d'Alpine --><script>document.addEventListener('DOMContentLoaded', function() {console.log('DOM chargé, Alpine.js disponible:', typeof Alpine !== 'undefined');// Auto-disparition des messages flashconst flashMessages = document.querySelectorAll('[data-flash-message]');flashMessages.forEach(function(message) {const delay = message.dataset.delay || 5000; // 5 secondes par défautsetTimeout(function() {// Ajouter une animation de fondumessage.style.transition = 'opacity 0.5s ease-out, transform 0.3s ease-out';message.style.opacity = '0';message.style.transform = 'translateY(-10px)';// Supprimer l'élément après l'animationsetTimeout(function() {message.remove();}, 500);}, delay);// Ajouter un bouton de fermeture manuelleconst closeButton = document.createElement('button');closeButton.innerHTML = '×';closeButton.className = 'ml-4 text-gray-400 hover:text-gray-600 text-xl font-bold transition-colors';closeButton.style.cursor = 'pointer';closeButton.onclick = function() {message.style.transition = 'opacity 0.3s ease-out, transform 0.3s ease-out';message.style.opacity = '0';message.style.transform = 'translateY(-10px)';setTimeout(function() {message.remove();}, 300);};// Ajouter le bouton au messageconst messageContent = message.querySelector('div');if (messageContent) {messageContent.appendChild(closeButton);}});// Forcer la réinitialisation des composants Alpine si nécessaireif (typeof Alpine !== 'undefined') {// Attendre un peu pour que tout soit bien chargésetTimeout(function() {// Réinitialiser les composants Alpine (optionnel)document.querySelectorAll('[x-data]').forEach(el => {Alpine.initTree(el);});console.log('Composants Alpine réinitialisés');}, 100);}});</script>{% endblock %}</body></html>