templates/base.html.twig line 1

  1. <!DOCTYPE html>
  2. <html>
  3.     <head>
  4.         <meta charset="UTF-8">
  5.         <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  6.         <link rel="icon" href="{{ asset('/images/logo_mdv_2022.webp') }}">
  7.         <link rel="apple-touch-icon" sizes="76x76" href="{{ asset('images/template-img/apple-icon.png') }}">
  8.             <link rel="preconnect" href="https://fonts.googleapis.com">
  9.             <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  10.             <!-- Fonts and icons -->
  11.             <link href="https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700" rel="stylesheet" />
  12.             <link href="https://fonts.googleapis.com/css2?family=Numans&display=swap" rel="stylesheet">
  13.             <!-- Nucleo Icons -->
  14.             <link href="{{ asset('css/nucleo-icons.css') }}" rel="stylesheet" />
  15.             <!-- Font Awesome Icons -->
  16.             <script src="https://kit.fontawesome.com/d50175b8a9.js" crossorigin="anonymous" type="text/javascript"></script>
  17.             <!-- CSS -->
  18.         <link href="{{ asset('bundles/paiement/paiement.css') }}" rel="stylesheet" type="text/css">
  19.             <link href="{{ asset('css/lib/bootstrap.min.css') }}" rel="stylesheet" type="text/css">
  20.             <link href="{{ asset('css/lib/bootstrap-material-datetimepicker.css') }}" rel="stylesheet" type="text/css">
  21.             <link href="{{ asset('icone/material_icon/material-icons.css') }}" rel="stylesheet" type="text/css">
  22.             <link href="https://cdn.jsdelivr.net/npm/fomantic-ui@2.9.0/dist/semantic.min.css" rel="stylesheet" type="text/css">
  23.             <link href="{{ asset('css/lib/select2.min.css') }}" rel="stylesheet" type="text/css">
  24.             <link href="{{ asset('css/lib/datatable.min.css') }}" rel="stylesheet" type="text/css">
  25.             <link href="{{ asset('css/lib/dataTable.responsive.bootstrap.min.css') }}" rel="stylesheet" type="text/css">
  26.             <link href="{{ asset('css/nucleo-icons.css') }}" rel="stylesheet" type="text/css">
  27.             <link href="{{ asset('css/template.min.css') }}" rel="stylesheet" type="text/css">
  28.             <link href="{{ asset('css/global.css') }}" rel="stylesheet" type="text/css">
  29.         <link href="https://cdn.jsdelivr.net/npm/quill@2.0.3/dist/quill.snow.css" rel="stylesheet">
  30.         {% block stylesheets %}
  31.         {% endblock %}
  32.         <title>{% block title %}Les motards du viaduc !{% endblock %}</title>
  33.     </head>
  34.     <body class="g-sidenav-show bg-gray-100">
  35.         {% block body %}
  36.             <header class="sidenav navbar navbar-vertical navbar-expand-xs border-0 border-radius-xl my-3 fixed-start ms-3 " id="sidenav-main">
  37.                 {% block header %}{% endblock %}
  38.             </header>
  39.             <main class="main-content position-relative max-height-vh-100 h-100 border-radius-lg">
  40.                 {% block main %}{% endblock %}
  41.             </main>
  42.             <footer>
  43.                 {% block footer %}{% endblock %}
  44.             </footer>
  45.         {% endblock %}
  46.         <script src="{{ asset('js/lib/moment.js') }}" type="text/javascript"></script>
  47.         <script src="{{ asset('js/lib/locale_fr.min.js') }}" type="text/javascript"></script>
  48.         <script src="{{ asset('js/lib/jquery.min.js') }}" type="text/javascript"></script>
  49.         <script src="{{ asset('js/lib/jquery-widget.min.js') }}" type="text/javascript"></script>
  50.         <script src="{{ asset('js/lib/jquery.mask.min.js') }}" type="text/javascript"></script>
  51.         <script src="{{ asset('js/lib/bootstrap.min.js') }}" type="text/javascript"></script>
  52.         <script src="{{ asset('js/lib/bootstrap-material-datetimepicker.js') }}" type="text/javascript"></script>
  53.         <script src="{{ asset('js/lib/semantic.min.js') }}" type="text/javascript"></script>
  54.             <script src="{{ asset('js/lib/select2.full.min.js') }}" type="text/javascript"></script>
  55.             <script src="{{ asset('js/lib/datatable.min.js') }}" type="text/javascript"></script>
  56.             <script src="{{ asset('js/lib/dataTables.responsive.min.js') }}" type="text/javascript"></script>
  57.             <script src="{{ asset('js/core/popper.min.js') }}" type="text/javascript"></script>
  58.             <script src="{{ asset('js/plugins/perfect-scrollbar.min.js') }}" type="text/javascript"></script>
  59.             <script src="{{ asset('js/plugins/smooth-scrollbar.min.js') }}" type="text/javascript"></script>
  60.             <script src="{{ asset('js/plugins/chartjs.min.js') }}" type="text/javascript"></script>
  61.             <script src="{{ asset('js/plugins/chartjs-plugin-datalabels.min.js') }}" type="text/javascript"></script>
  62.             <script async defer src="{{ asset('js/plugins/button-github.min.js') }}"></script>
  63.             <script src="{{ asset('js/template.min.js') }}" type="text/javascript"></script>
  64.             <script src="{{ asset('js/global.js') }}" type="text/javascript"></script>
  65.         <script src="https://cdn.jsdelivr.net/npm/quill@2.0.3/dist/quill.js"></script>
  66.         <script>
  67.             (function () {
  68.                 function initQuillEditors(scope) {
  69.                     const editors = (scope || document).querySelectorAll('[data-quill-editor="1"]');
  70.                     editors.forEach((editorEl) => {
  71.                         if (editorEl.__quill) return;
  72.                         const theme = editorEl.getAttribute('data-quill-theme') || 'snow';
  73.                         const toolbar = JSON.parse(editorEl.getAttribute('data-quill-toolbar') || '[]');
  74.                         const minHeight = parseInt(editorEl.getAttribute('data-quill-min-height') || '200', 10);
  75.                         editorEl.style.minHeight = minHeight + 'px';
  76.                         // textarea caché = élément précédent (comme dans le thème)
  77.                         const textarea = editorEl.previousElementSibling;
  78.                         if (!textarea || textarea.tagName.toLowerCase() !== 'textarea') return;
  79.                         const quill = new Quill(editorEl, {
  80.                             theme,
  81.                             modules: {
  82.                                 toolbar: toolbar
  83.                             }
  84.                         });
  85.                         editorEl.__quill = quill;
  86.                         // synchro au fil de l’eau
  87.                         const sync = () => {
  88.                             const html = quill.root.innerHTML;
  89.                             // Optionnel : si vide Quill => champ vide (évite <p><br></p>)
  90.                             textarea.value = (html === '<p><br></p>') ? '' : html;
  91.                         };
  92.                         quill.on('text-change', sync);
  93.                         sync();
  94.                         // synchro à la soumission (au cas où)
  95.                         const form = editorEl.closest('form');
  96.                         if (form && !form.__quillBound) {
  97.                             form.addEventListener('submit', () => {
  98.                                 form.querySelectorAll('[data-quill-editor="1"]').forEach(el => {
  99.                                     if (el.__quill) {
  100.                                         const ta = el.previousElementSibling;
  101.                                         const h = el.__quill.root.innerHTML;
  102.                                         ta.value = (h === '<p><br></p>') ? '' : h;
  103.                                     }
  104.                                 });
  105.                             });
  106.                             form.__quillBound = true;
  107.                         }
  108.                     });
  109.                 }
  110.                 document.addEventListener('DOMContentLoaded', () => initQuillEditors(document));
  111.             })();
  112.         </script>
  113.         {% block javascripts %}
  114.         {% endblock %}
  115.     </body>
  116. </html>