templates/base_public.html.twig line 1

Open in your IDE?
  1. <!DOCTYPE html>
  2. <html lang="fr">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>{% block title %}Cassa Clock — Un service de pointage fiable, rapide et pensé pour vous !{% endblock %}</title>
  7. <link rel="icon" type="image/png" href="{{ asset('favicon.png') }}">
  8. <link rel="preconnect" href="https://fonts.googleapis.com">
  9. <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  10. <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&family=Sora:wght@600;700;800&display=swap" rel="stylesheet">
  11. <link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.css" rel="stylesheet">
  12. <style>
  13. :root{
  14.   --bg:#FAFAFB;
  15.   --bg-soft:#F4F4F7;
  16.   --ink:#0B0B14;
  17.   --ink-2:#1B1B28;
  18.   --muted:#6B7280;
  19.   --muted-2:#9CA3AF;
  20.   --line:rgba(11,11,20,.08);
  21.   --line-2:rgba(11,11,20,.06);
  22.   --brand-1:#6366F1;
  23.   --brand-2:#8B5CF6;
  24.   --brand-3:#EC4899;
  25.   --brand-4:#F59E0B;
  26.   --grad: linear-gradient(135deg,#6366F1 0%,#8B5CF6 45%,#EC4899 100%);
  27.   --grad-soft: linear-gradient(135deg,rgba(99,102,241,.12) 0%,rgba(236,72,153,.12) 100%);
  28.   --shadow-sm: 0 1px 2px rgba(11,11,20,.04), 0 1px 1px rgba(11,11,20,.03);
  29.   --shadow-md: 0 8px 24px -8px rgba(11,11,20,.12), 0 4px 12px -4px rgba(11,11,20,.06);
  30.   --shadow-lg: 0 24px 60px -20px rgba(99,102,241,.25), 0 12px 30px -10px rgba(236,72,153,.18);
  31.   --r-sm:10px; --r-md:14px; --r-lg:20px; --r-xl:28px;
  32. }
  33. *{box-sizing:border-box;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}
  34. html,body{margin:0;padding:0}
  35. body{
  36.   font-family:'Inter',system-ui,sans-serif;
  37.   background:var(--bg);
  38.   color:var(--ink);
  39.   font-size:16px;
  40.   line-height:1.55;
  41.   overflow-x:hidden;
  42. }
  43. h1,h2,h3,h4{font-family:'Sora','Inter',sans-serif;letter-spacing:-0.025em;line-height:1.1;margin:0}
  44. p{margin:0;color:var(--muted)}
  45. a{text-decoration:none;color:inherit}
  46. img{max-width:100%;display:block}
  47. .container-x{max-width:1180px;margin:0 auto;padding:0 24px}
  48. /* Decorative */
  49. .bg-grid{
  50.   position:absolute;inset:0;
  51.   background-image:radial-gradient(circle at 1px 1px, rgba(11,11,20,.07) 1px, transparent 0);
  52.   background-size:28px 28px;
  53.   mask-image:radial-gradient(ellipse at top, black 30%, transparent 70%);
  54.   pointer-events:none;
  55. }
  56. .blob{position:absolute;border-radius:50%;filter:blur(80px);opacity:.55;pointer-events:none;z-index:0}
  57. .blob.b1{width:520px;height:520px;background:#6366F1;top:-160px;left:-120px}
  58. .blob.b2{width:480px;height:480px;background:#EC4899;top:-80px;right:-140px;opacity:.4}
  59. .blob.b3{width:380px;height:380px;background:#F59E0B;bottom:-180px;left:30%;opacity:.25}
  60. /* Navbar */
  61. .nav-wrap{position:sticky;top:0;z-index:50;padding:14px 0;backdrop-filter:saturate(180%) blur(14px);background:rgba(250,250,251,.78);border-bottom:1px solid var(--line-2)}
  62. .nav-bar{display:flex;align-items:center;justify-content:space-between;gap:24px}
  63. .brand{display:flex;align-items:center;gap:10px;font-family:'Sora';font-weight:800;font-size:20px;letter-spacing:-0.02em;color:var(--ink)}
  64. .brand-dot{width:30px;height:30px;border-radius:9px;background:var(--grad);box-shadow:0 6px 18px -4px rgba(99,102,241,.55);display:grid;place-items:center;color:#fff;font-size:14px}
  65. .nav-links{display:flex;gap:32px;align-items:center}
  66. .nav-links a{color:var(--ink-2);font-weight:500;font-size:14.5px;opacity:.85;transition:opacity .15s}
  67. .nav-links a:hover{opacity:1}
  68. .nav-cta{display:flex;align-items:center;gap:10px}
  69. .nav-toggle{display:none;background:none;border:0;font-size:22px;color:var(--ink);cursor:pointer}
  70. /* Buttons */
  71. .btn-x{display:inline-flex;align-items:center;justify-content:center;gap:8px;padding:12px 20px;border-radius:12px;font-weight:600;font-size:14.5px;border:1px solid transparent;cursor:pointer;transition:all .2s ease;white-space:nowrap}
  72. .btn-primary-x{background:var(--ink);color:#fff;box-shadow:var(--shadow-md)}
  73. .btn-primary-x:hover{transform:translateY(-1px);box-shadow:var(--shadow-lg);color:#fff}
  74. .btn-grad{background:var(--grad);color:#fff;box-shadow:0 10px 30px -10px rgba(99,102,241,.6)}
  75. .btn-grad:hover{transform:translateY(-1px);box-shadow:0 16px 38px -10px rgba(236,72,153,.6);color:#fff}
  76. .btn-ghost{background:transparent;color:var(--ink);border:1px solid var(--line)}
  77. .btn-ghost:hover{background:#fff;border-color:var(--ink);box-shadow:var(--shadow-sm);color:var(--ink)}
  78. .btn-white{background:#fff;color:var(--ink);box-shadow:var(--shadow-sm)}
  79. .btn-white:hover{color:var(--ink);transform:translateY(-1px);box-shadow:var(--shadow-md)}
  80. .btn-sm{padding:9px 14px;font-size:13.5px;border-radius:10px}
  81. /* Section commun */
  82. .sec{padding:96px 0;position:relative}
  83. .sec-head{text-align:center;max-width:680px;margin:0 auto 56px}
  84. .sec-eyebrow{display:inline-block;font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.12em;background:var(--grad);-webkit-background-clip:text;background-clip:text;color:transparent;margin-bottom:14px}
  85. .sec-title{font-size:clamp(30px,3.5vw,46px);font-weight:700;letter-spacing:-0.03em;margin-bottom:16px;color:var(--ink)}
  86. .sec-lead{font-size:17px;color:var(--muted);line-height:1.6}
  87. /* Page header (pour pages secondaires) */
  88. .page-header{position:relative;padding:120px 0 64px;overflow:hidden;text-align:center}
  89. .page-header .bg-grid{opacity:.6}
  90. .page-header .blob.b1{top:-220px}
  91. .page-header > .container-x{position:relative;z-index:2}
  92. .page-header h1{font-size:clamp(36px,4.4vw,56px);font-weight:800;letter-spacing:-0.035em;margin-bottom:14px}
  93. .page-header h1 .grad{background:var(--grad);-webkit-background-clip:text;background-clip:text;color:transparent}
  94. .page-header .lead{font-size:17px;color:var(--muted);max-width:640px;margin:0 auto}
  95. .crumbs{display:inline-flex;align-items:center;gap:6px;font-size:13px;color:var(--muted-2);margin-bottom:20px;font-weight:500}
  96. .crumbs a{color:var(--muted)}
  97. .crumbs a:hover{color:var(--ink)}
  98. .crumbs i{font-size:11px}
  99. /* Footer */
  100. footer.public-footer{padding:64px 0 32px;background:#fff;border-top:1px solid var(--line-2)}
  101. .foot{display:grid;grid-template-columns:1.4fr 1fr 1fr 1fr;gap:48px;margin-bottom:48px}
  102. .foot h5{font-size:13px;font-weight:700;color:var(--ink);margin-bottom:18px;letter-spacing:-0.01em;font-family:'Inter'}
  103. .foot ul{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:10px}
  104. .foot a{font-size:14px;color:var(--muted);transition:color .15s}
  105. .foot a:hover{color:var(--ink)}
  106. .foot .about{color:var(--muted);font-size:14.5px;line-height:1.65;margin-top:12px;max-width:300px}
  107. .foot-bottom{display:flex;justify-content:space-between;align-items:center;padding-top:24px;border-top:1px solid var(--line-2);font-size:13px;color:var(--muted)}
  108. .foot-bottom .socials{display:flex;gap:10px}
  109. .foot-bottom .socials a{width:36px;height:36px;border-radius:10px;border:1px solid var(--line);display:grid;place-items:center;font-size:15px;color:var(--ink-2)}
  110. .foot-bottom .socials a:hover{background:var(--ink);color:#fff;border-color:var(--ink)}
  111. /* Mobile menu */
  112. .mobile-menu{display:none;position:fixed;inset:0;background:rgba(11,11,20,.55);z-index:999;opacity:0;transition:opacity .25s}
  113. .mobile-menu.open{opacity:1}
  114. .mobile-menu .panel{position:absolute;top:0;right:0;width:84%;max-width:340px;height:100%;background:#fff;padding:24px;display:flex;flex-direction:column;gap:6px;transform:translateX(100%);transition:transform .3s}
  115. .mobile-menu.open .panel{transform:translateX(0)}
  116. .mobile-menu .panel a{padding:14px 12px;border-radius:10px;color:var(--ink-2);font-weight:500;font-size:15px}
  117. .mobile-menu .panel a:hover{background:var(--bg-soft)}
  118. .mobile-menu .panel .close{align-self:flex-end;background:none;border:0;font-size:24px;cursor:pointer;color:var(--ink);margin-bottom:12px}
  119. /* Responsive */
  120. @media (max-width: 980px){
  121.   .nav-links{display:none}
  122.   .nav-toggle{display:inline-flex}
  123.   .foot{grid-template-columns:1fr 1fr;gap:32px}
  124.   .sec{padding:64px 0}
  125.   .page-header{padding:80px 0 48px}
  126. }
  127. @media (max-width: 620px){
  128.   .foot{grid-template-columns:1fr}
  129.   .nav-cta .btn-ghost{display:none}
  130. }
  131. /* Fade reveal */
  132. .fade-up{opacity:0;transform:translateY(20px);transition:opacity .7s ease, transform .7s ease}
  133. .fade-up.in{opacity:1;transform:none}
  134. .brand-text {
  135.     white-space: nowrap; /* empêche retour à la ligne */
  136. }
  137. /* Mobile */
  138. @media (max-width: 576px) {
  139.     .brand-text {
  140.         font-size: 14px; /* réduit la taille */
  141.     }
  142. }
  143. </style>
  144. {% block stylesheets %}{% endblock %}
  145. </head>
  146. <body>
  147. <!-- Navbar -->
  148. <div class="nav-wrap">
  149.   <div class="container-x nav-bar">
  150.     <a class="brand brand-text" href="{{ path('home') }}">
  151.   <span class="brand-dot"><i class="bi bi-clock-history"></i></span>
  152.   Cassa Clock
  153. </a>
  154.     <nav class="nav-links">
  155.       <a href="{{ path('home') }}#apropos">À propos</a>
  156.       <a href="{{ path('home') }}#features">Produit</a>
  157.       <a href="{{ path('app_tarification_index') }}">Tarifs</a>
  158.       <a href="{{ path('home') }}#comment-ca-marche">Comment ça marche</a>
  159.       <a href="{{ path('contact') }}">Contact</a>
  160.     </nav>
  161.     <div class="nav-cta">
  162.       {% if app.user %}
  163.         <a class="btn-x btn-ghost btn-sm" href="/admin"><i class="bi bi-grid"></i> Mon espace</a>
  164.         <a class="btn-x btn-grad btn-sm" href="{{ path('app_logout') }}">Déconnexion</a>
  165.       {% else %}
  166.         <a class="btn-x btn-ghost btn-sm" href="{{ path('app_login') }}">Connexion</a>
  167.         <a class="btn-x btn-grad btn-sm" href="{{ path('company_wizard') }}">Essai gratuit <i class="bi bi-arrow-up-right"></i></a>
  168.       {% endif %}
  169.       <button class="nav-toggle" id="navToggle" aria-label="Menu"><i class="bi bi-list"></i></button>
  170.     </div>
  171.   </div>
  172. </div>
  173. <!-- Mobile menu -->
  174. <div class="mobile-menu" id="mobileMenu">
  175.   <div class="panel">
  176.     <button class="close" id="navClose" aria-label="Fermer"><i class="bi bi-x"></i></button>
  177.     <a href="{{ path('home') }}">Accueil</a>
  178.     <a href="{{ path('home') }}#apropos">À propos</a>
  179.     <a href="{{ path('home') }}#features">Produit</a>
  180.     <a href="{{ path('home') }}#pricing">Tarifs</a>
  181.     <a href="{{ path('home') }}#comment-ca-marche">Comment ça marche</a>
  182.     <a href="{{ path('contact') }}">Contact</a>
  183.     <hr style="border:0;border-top:1px solid var(--line-2);margin:14px 0">
  184.     {% if app.user %}
  185.       <a href="/admin" class="btn-x btn-ghost" style="justify-content:flex-start"><i class="bi bi-grid"></i> Mon espace</a>
  186.       <a href="{{ path('app_logout') }}" class="btn-x btn-grad" style="justify-content:flex-start"><i class="bi bi-box-arrow-right"></i> Déconnexion</a>
  187.     {% else %}
  188.       <a href="{{ path('app_login') }}" class="btn-x btn-ghost" style="justify-content:flex-start"><i class="bi bi-box-arrow-in-right"></i> Connexion</a>
  189.       <a href="{{ path('company_wizard') }}" class="btn-x btn-grad" style="justify-content:flex-start"><i class="bi bi-arrow-up-right"></i> Essai gratuit</a>
  190.     {% endif %}
  191.   </div>
  192. </div>
  193. {% block body %}{% endblock %}
  194. <!-- Footer -->
  195. <footer class="public-footer">
  196.   <div class="container-x">
  197.     <div class="foot">
  198.       <div>
  199.         <a class="brand" href="{{ path('home') }}">
  200.           <span class="brand-dot"><i class="bi bi-clock-history"></i></span>
  201.           Cassa Clock
  202.         </a>
  203.         <p class="about">Un service de pointage fiable, rapide et pensé pour les équipes africaines.</p>
  204.       </div>
  205.       <div>
  206.         <h5>Produit</h5>
  207.         <ul>
  208.           <li><a href="{{ path('home') }}#features">Fonctionnalités</a></li>
  209.           <li><a href="{{ path('home') }}#pricing">Tarifs</a></li>
  210.           <li><a href="{{ path('app_services_index') }}">Services</a></li>
  211.           <li><a href="{{ path('home') }}#comment-ca-marche">Comment ça marche</a></li>
  212.         </ul>
  213.       </div>
  214.       <div>
  215.         <h5>Société</h5>
  216.         <ul>
  217.           <li><a href="{{ path('app_aboutus_index') }}">À propos</a></li>
  218.           <li><a href="{{ path('contact') }}">Contact</a></li>
  219.           <li><a href="{{ path('app_tarification_index') }}">Tarification</a></li>
  220.           <li><a href="{{ path('app_programmefidelite_index') }}">Programme fidélité</a></li>
  221.         </ul>
  222.       </div>
  223.       <div>
  224.         <h5>Légal</h5>
  225.         <ul>
  226.           <li><a href="{{ path('app_cgi_index') }}">Conditions générales</a></li>
  227.           <li><a href="{{ path('app_privacy_index') }}">Confidentialité</a></li>
  228.         </ul>
  229.       </div>
  230.     </div>
  231.     <div class="foot-bottom">
  232.       <div>© {{ "now"|date("Y") }} Cassa Clock — Tous droits réservés.</div>
  233.       <div class="socials">
  234.         <a href="#" aria-label="Facebook"><i class="bi bi-facebook"></i></a>
  235.         <a href="#" aria-label="LinkedIn"><i class="bi bi-linkedin"></i></a>
  236.         <a href="#" aria-label="Twitter / X"><i class="bi bi-twitter-x"></i></a>
  237.         <a href="#" aria-label="WhatsApp"><i class="bi bi-whatsapp"></i></a>
  238.       </div>
  239.     </div>
  240.   </div>
  241. </footer>
  242. <script>
  243.   // Mobile menu
  244.   function openMobileMenu() {
  245.     const m = document.getElementById('mobileMenu');
  246.     m.style.display = 'flex';
  247.     requestAnimationFrame(() => requestAnimationFrame(() => m.classList.add('open')));
  248.     document.body.style.overflow = 'hidden';
  249.   }
  250.   function closeMobileMenu() {
  251.     const m = document.getElementById('mobileMenu');
  252.     m.classList.remove('open');
  253.     document.body.style.overflow = '';
  254.     m.addEventListener('transitionend', () => { m.style.display = 'none'; }, { once: true });
  255.   }
  256.   document.getElementById('navToggle')?.addEventListener('click', openMobileMenu);
  257.   document.getElementById('navClose')?.addEventListener('click', closeMobileMenu);
  258.   document.getElementById('mobileMenu')?.addEventListener('click', (e) => { if (e.target.id === 'mobileMenu') closeMobileMenu(); });
  259.   // Fade reveal
  260.   const io = new IntersectionObserver((entries) => {
  261.     entries.forEach(e => { if (e.isIntersecting) e.target.classList.add('in'); });
  262.   }, { threshold: 0.12 });
  263.   document.querySelectorAll('.fade-up').forEach(el => io.observe(el));
  264. </script>
  265. {% block javascripts %}{% endblock %}
  266. </body>
  267. </html>