Outiref

Code source de l'URL : http://undesens.com

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta name="description" content="Undesens : site de rencontres libertines, échangistes et BDSM gratuit en France. Échangez et rencontrez des adultes consentants dans un espace sécurisé.">
        <meta name="robots" content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1">
            <meta name="keywords" content="site rencontre gratuit, rencontres libertines, rencontres bdsm, site bdsm gratuit france, rencontre libertine gratuite, domination soumission, bondage shibari, club libertin, site adulte bdsm, communauté bdsm, plateforme rencontre gratuite">
    
    <!-- Sécurité et HTTPS -->
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="csrf-token" content="8c62b5d81e9d00a4e008acedbe4ac965ed04137e2f47d0592c7665b3b24d660e">
        <base href="https://www.undesens.com/">

    <title>Site de rencontres libertines, échangistes & BDSM gratuit</title>

    <!-- OpenGraph pour le partage sur les réseaux sociaux -->
    <meta property="og:title" content="Site de rencontres libertines, échangistes &amp; BDSM gratuit">
    <meta property="og:description" content="Undesens : site de rencontres libertines, échangistes et BDSM gratuit en France. Échangez et rencontrez des adultes consentants dans un espace sécurisé.">
    <meta property="og:image" content="https://www.undesens.com/assets/images/og-image.png">
    <meta property="og:image:width" content="1200">
    <meta property="og:image:height" content="630">
    <meta property="og:image:type" content="image/png">
    <meta property="og:image:alt" content="Site de rencontres libertines, échangistes &amp; BDSM gratuit">
        <meta property="og:url" content="https://www.undesens.com/">
    <meta property="og:type" content="website">
    <meta property="og:site_name" content="Undesens | Rencontres Libertines échangistes & BDSM">
    <meta property="og:locale" content="fr_FR">

    <!-- Twitter Card -->
    <meta name="twitter:card" content="summary_large_image">
    <meta name="twitter:title" content="Site de rencontres libertines, échangistes & BDSM gratuit">
    <meta name="twitter:description" content="Undesens : site de rencontres libertines, échangistes et BDSM gratuit en France. Échangez et rencontrez des adultes consentants dans un espace sécurisé.">
    <meta name="twitter:image" content="https://www.undesens.com/assets/images/og-image-optimized.webp">
    <meta name="twitter:image:alt" content="Logo Undesens - Rencontres libertines et BDSM assumées">
    <meta name="twitter:site" content="@undesens">

    <!-- URL Canonique pour éviter le contenu dupliqué -->
    <link rel="canonical" href="https://www.undesens.com/">

    <!-- Favicons optimisés -->
    <link rel="shortcut icon" href="/favicon.ico">
    <link rel="icon" type="image/x-icon" href="/favicon.ico">
    <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
    <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
    <link rel="icon" type="image/png" sizes="180x180" href="/apple-touch-icon.png">
    <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
    <link rel="manifest" href="/site.webmanifest">
    <meta name="theme-color" content="#c71f37">
    
    <!-- PWA Configuration -->
    <meta name="mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
    <meta name="apple-mobile-web-app-title" content="Undesens">

    <!-- DNS prefetch et préconnexion pour performances -->
    <link rel="dns-prefetch" href="https://www.googletagmanager.com">
    <link rel="dns-prefetch" href="https://connect.facebook.net">
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>

    <!-- Meta Pixel Code -->
    <script nonce="qKGOSe6Cin52IeyjbMGydw">
    !function(f,b,e,v,n,t,s)
    {if(f.fbq)return;n=f.fbq=function(){n.callMethod?
    n.callMethod.apply(n,arguments):n.queue.push(arguments)};
    if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
    n.queue=[];t=b.createElement(e);t.async=!0;
    t.src=v;s=b.getElementsByTagName(e)[0];
    s.parentNode.insertBefore(t,s)}(window, document,'script',
    'https://connect.facebook.net/en_US/fbevents.js');
    fbq('init', '1195457818816945');
    fbq('track', 'PageView');
    </script>
    <noscript><img height="1" width="1" style="display:none"
    src="https://www.facebook.com/tr?id=1195457818816945&ev=PageView&noscript=1"
    alt="Facebook Pixel"
    /></noscript>
    <!-- End Meta Pixel Code -->

    <!-- CSS complet chargé de manière synchrone pour éviter le FOUC -->
    <link rel="stylesheet" href="/assets/css/combined.min.css?v=1773207609">

    <!-- CSS pour remplacer les styles en ligne (SEO) -->
    <link rel="stylesheet" href="/assets/css/inline-styles-replacement.min.css?v=1773207609">

    <!-- Styles pour le switch Visible/Invisible -->
    <style>
        .visibility-switch-container {
            display: flex;
            align-items: center;
            gap: 0.4rem;
            padding: 0;
            background: transparent;
            border: none;
            height: 28px;
        }
        
        .visibility-switch {
            position: relative;
            display: flex;
            align-items: center;
            width: 28px;
            height: 16px;
            cursor: pointer;
            flex-shrink: 0;
            margin-top: 5px;
        }
        
        .visibility-switch input {
            opacity: 0;
            width: 0;
            height: 0;
            position: absolute;
        }
        
        .visibility-slider {
            position: absolute;
            cursor: pointer;
            top: 0;
            left: 0;
            right: 0;
            bottom: 0;
            background: rgba(255, 255, 255, 0.12);
            border: 1px solid rgba(255, 255, 255, 0.08);
            transition: background 0.25s ease, border-color 0.25s ease;
            border-radius: 20px;
        }
        
        .visibility-slider:before {
            position: absolute;
            content: "";
            height: 11px;
            width: 11px;
            left: 2px;
            top: 2px;
            background: rgba(255, 255, 255, 0.45);
            transition: transform 0.25s ease, background 0.25s ease;
            border-radius: 50%;
        }
        
        .visibility-switch input:checked + .visibility-slider {
            background: rgba(199, 31, 55, 0.85);
            border-color: rgba(199, 31, 55, 0.4);
        }
        
        .visibility-switch input:checked + .visibility-slider:before {
            transform: translateX(12px);
            background: #fff;
        }
        
        .visibility-label {
            font-size: 0.7rem;
            font-weight: 500;
            color: rgba(255, 255, 255, 0.35);
            white-space: nowrap;
            transition: color 0.25s ease;
            letter-spacing: 0.03em;
        }
        
        .visibility-switch-container:has(input:checked) .visibility-label {
            color: rgba(255, 255, 255, 0.65);
        }
        
        .visibility-toast {
            position: fixed;
            bottom: 80px;
            left: 50%;
            transform: translateX(-50%) translateY(100px);
            background: rgba(18, 18, 24, 0.96);
            border: 1px solid rgba(199, 31, 55, 0.25);
            color: rgba(255, 255, 255, 0.85);
            padding: 0.55rem 1.1rem;
            border-radius: 50px;
            font-size: 0.82rem;
            font-weight: 500;
            box-shadow: 0 4px 20px rgba(0, 0, 0, 0.5);
            z-index: 10000;
            opacity: 0;
            transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
            pointer-events: none;
        }
        
        .visibility-toast.show {
            opacity: 1;
            transform: translateX(-50%) translateY(0);
        }

        @media (max-width: 1070px) {
            .nav-brand {
                display: none !important;
            }
        }
        
        @media (max-width: 768px) {
            .nav-logout .visibility-switch-container {
                display: none; /* Masquer le switch desktop sur mobile */
            }
            
            .mobile-visibility-switch-container {
                display: flex !important;
                align-items: center;
                gap: 0.3rem;
                padding: 0;
                background: transparent;
                border: none;
            }
            
            .mobile-visibility-switch-container .visibility-switch {
                width: 34px;
                height: 18px;
            }
            
            .mobile-visibility-switch-container .visibility-slider:before {
                height: 13px;
                width: 13px;
                left: 2px;
                top: 2px;
            }
            
            .mobile-visibility-switch-container .visibility-switch input:checked + .visibility-slider:before {
                transform: translateX(15px);
            }
            
            .mobile-visibility-switch-container .visibility-label {
                font-size: 0.65rem;
            }
        }
        
        /* Styles pour le bouton calendrier disponibilités */
        .availability-calendar-btn {
            background: transparent;
            border: none;
            border-radius: 8px;
            padding: 0;
            width: 34px;
            height: 34px;
            cursor: pointer;
            transition: background 0.2s ease, color 0.2s ease;
            color: rgba(255, 255, 255, 0.5);
            display: flex;
            align-items: center;
            justify-content: center;
            flex-shrink: 0;
        }
        
        .availability-calendar-btn:hover {
            background: rgba(255, 255, 255, 0.07);
            color: rgba(255, 255, 255, 0.88);
        }
        
        .availability-calendar-btn svg {
            display: block;
        }
        
        /* Afficher le bouton calendrier uniquement sur desktop */
        @media (min-width: 769px) {
            .availability-calendar-btn {
                display: flex !important;
            }
        }
        
        /* Modal Disponibilités */
        .availability-modal-overlay {
            position: fixed;
            top: 0;
            left: 0;
            right: 0;
            bottom: 0;
            background: rgba(0, 0, 0, 0.85);
            backdrop-filter: blur(8px);
            z-index: 100000;
            display: flex;
            align-items: center;
            justify-content: center;
            padding: 1rem;
            animation: fadeIn 0.3s ease;
        }
        
        .availability-modal-container {
            background: linear-gradient(135deg, rgba(26, 26, 40, 0.98) 0%, rgba(18, 18, 30, 0.98) 100%);
            border-radius: 16px;
            border: 1px solid rgba(147, 51, 234, 0.3);
            box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
            width: 100%;
            max-width: 800px;
            max-height: 90vh;
            overflow-y: auto;
            animation: slideUp 0.4s ease;
        }
        
        .availability-modal-header {
            display: flex;
            justify-content: space-between;
            align-items: center;
            padding: 1.5rem 2rem;
            border-bottom: 1px solid rgba(147, 51, 234, 0.2);
        }
        
        .availability-modal-title {
            font-size: 1.5rem;
            font-weight: 700;
            background: linear-gradient(135deg, #fff 0%, rgba(255, 255, 255, 0.8) 100%);
            -webkit-background-clip: text;
            -webkit-text-fill-color: transparent;
            background-clip: text;
        }
        
        .availability-modal-close {
            background: rgba(255, 255, 255, 0.05);
            border: 1px solid rgba(255, 255, 255, 0.1);
            border-radius: 8px;
            padding: 0.5rem;
            cursor: pointer;
            color: rgba(255, 255, 255, 0.7);
            transition: all 0.3s ease;
        }
        
        .availability-modal-close:hover {
            background: rgba(255, 68, 88, 0.2);
            border-color: rgba(255, 68, 88, 0.4);
            color: #ff4458;
        }
        
        .availability-save-indicator {
            display: flex;
            align-items: center;
            gap: 0.5rem;
            padding: 0.5rem 1rem;
            background: rgba(147, 51, 234, 0.1);
            border: 1px solid rgba(147, 51, 234, 0.3);
            border-radius: 20px;
            font-size: 0.875rem;
            font-weight: 600;
        }
        
        .availability-save-indicator .spinner {
            animation: spin 1s linear infinite;
        }
        
        .availability-save-indicator svg {
            color: #9333ea;
        }
        
        @keyframes spin {
            from { transform: rotate(0deg); }
            to { transform: rotate(360deg); }
        }
        
        .availability-modal-body {
            padding: 2rem;
        }
        
        .availability-days-selector {
            display: grid;
            grid-template-columns: repeat(7, 1fr);
            gap: 0.5rem;
            margin-bottom: 2rem;
        }
        
        .availability-day-tab {
            background: rgba(255, 255, 255, 0.05);
            border: 2px solid rgba(255, 255, 255, 0.1);
            border-radius: 12px;
            padding: 0.75rem 0.5rem;
            cursor: pointer;
            transition: all 0.3s ease;
            text-align: center;
            color: rgba(255, 255, 255, 0.7);
        }
        
        .availability-day-tab:hover {
            background: rgba(147, 51, 234, 0.15);
            border-color: rgba(147, 51, 234, 0.3);
        }
        
        .availability-day-tab.active {
            background: linear-gradient(135deg, rgba(147, 51, 234, 0.3) 0%, rgba(79, 70, 229, 0.3) 100%);
            border-color: rgba(147, 51, 234, 0.6);
            color: white;
        }
        
        .availability-day-tab.saved {
            animation: pulse-saved 1s ease;
        }
        
        .availability-day-tab .day-name {
            display: block;
            font-size: 0.75rem;
            font-weight: 600;
            margin-bottom: 0.25rem;
        }
        
        .availability-day-tab .day-number {
            display: block;
            font-size: 1.1rem;
            font-weight: 700;
        }
        
        .availability-section {
            margin-bottom: 2rem;
        }
        
        .availability-section-title {
            font-size: 1.1rem;
            font-weight: 700;
            color: rgba(255, 255, 255, 0.95);
            margin-bottom: 1rem;
        }
        
        .availability-timeslots {
            background: rgba(255, 255, 255, 0.03);
            border: 1px solid rgba(255, 255, 255, 0.08);
            border-radius: 12px;
            padding: 1.25rem;
        }
        
        .availability-checkbox-item {
            display: flex;
            align-items: center;
            gap: 0.75rem;
            padding: 0.75rem;
            margin-bottom: 0.5rem;
            background: rgba(255, 255, 255, 0.02);
            border: 1px solid rgba(255, 255, 255, 0.05);
            border-radius: 8px;
            cursor: pointer;
            transition: all 0.2s ease;
        }
        
        .availability-checkbox-item:hover {
            background: rgba(147, 51, 234, 0.1);
            border-color: rgba(147, 51, 234, 0.3);
        }
        
        .availability-checkbox-item.all-day {
            background: rgba(147, 51, 234, 0.1);
            border: 2px solid rgba(147, 51, 234, 0.3);
            font-weight: 600;
        }
        
        .availability-checkbox-item input[type="checkbox"] {
            display: none;
        }
        
        .checkbox-custom {
            width: 20px;
            height: 20px;
            border: 2px solid rgba(255, 255, 255, 0.3);
            border-radius: 4px;
            display: flex;
            align-items: center;
            justify-content: center;
            transition: all 0.2s ease;
            flex-shrink: 0;
        }
        
        .availability-checkbox-item input[type="checkbox"]:checked + .checkbox-custom {
            background: linear-gradient(135deg, #9333ea 0%, #4f46e5 100%);
            border-color: #9333ea;
        }
        
        .availability-checkbox-item input[type="checkbox"]:checked + .checkbox-custom::after {
            content: '✓';
            color: white;
            font-size: 0.9rem;
            font-weight: bold;
        }
        
        .checkbox-label {
            color: rgba(255, 255, 255, 0.9);
            font-size: 0.95rem;
        }
        
        .checkbox-label small {
            color: rgba(255, 255, 255, 0.5);
            font-size: 0.8rem;
            margin-left: 0.25rem;
        }
        
        .availability-timeslots-individual {
            margin-top: 0.75rem;
        }
        
        .availability-desires-header {
            display: flex;
            justify-content: space-between;
            align-items: center;
            margin-bottom: 1rem;
        }
        
        .availability-modify-link {
            color: #9333ea;
            font-size: 0.9rem;
            text-decoration: none;
            font-weight: 600;
            transition: all 0.2s ease;
        }
        
        .availability-modify-link:hover {
            color: #a855f7;
            text-decoration: underline;
        }
        
        .availability-desires {
            display: flex;
            flex-wrap: wrap;
            gap: 0.5rem;
        }
        
        .availability-desire-pill {
            display: inline-flex;
            align-items: center;
            gap: 0.5rem;
            padding: 0.5rem 1rem;
            background: rgba(255, 255, 255, 0.05);
            border: 1px solid rgba(255, 255, 255, 0.1);
            border-radius: 20px;
            cursor: pointer;
            transition: all 0.2s ease;
            font-size: 0.9rem;
        }
        
        .availability-desire-pill:hover {
            background: rgba(147, 51, 234, 0.15);
            border-color: rgba(147, 51, 234, 0.3);
        }
        
        .availability-desire-pill input[type="checkbox"] {
            display: none;
        }
        
        .availability-desire-pill input[type="checkbox"]:checked + .desire-label {
            color: #a855f7;
            font-weight: 600;
        }
        
        .availability-desire-pill input[type="checkbox"]:checked {
            background: linear-gradient(135deg, rgba(147, 51, 234, 0.3) 0%, rgba(79, 70, 229, 0.3) 100%);
        }
        
        .desire-label {
            color: rgba(255, 255, 255, 0.8);
            transition: all 0.2s ease;
        }
        
        .availability-loading,
        .availability-no-desires {
            color: rgba(255, 255, 255, 0.5);
            font-size: 0.9rem;
            text-align: center;
            padding: 1rem;
        }
        
        .availability-no-desires a {
            color: #9333ea;
            text-decoration: underline;
        }
        
        .availability-actions {
            display: flex;
            gap: 1rem;
            justify-content: flex-end;
            margin-top: 2rem;
        }
        
        .availability-btn-close,
        .availability-btn-delete {
            padding: 0.75rem 1.5rem;
            border-radius: 10px;
            font-weight: 600;
            font-size: 0.95rem;
            cursor: pointer;
            transition: all 0.3s ease;
            display: flex;
            align-items: center;
            gap: 0.5rem;
            border: none;
        }
        
        .availability-btn-close {
            background: rgba(255, 255, 255, 0.08);
            border: 1px solid rgba(255, 255, 255, 0.15);
            color: rgba(255, 255, 255, 0.9);
        }
        
        .availability-btn-close:hover {
            background: rgba(255, 255, 255, 0.12);
            border-color: rgba(255, 255, 255, 0.25);
            transform: translateY(-2px);
            box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
        }
        
        .availability-btn-delete {
            background: rgba(255, 68, 88, 0.15);
            border: 1px solid rgba(255, 68, 88, 0.3);
            color: #ff4458;
        }
        
        .availability-btn-delete:hover {
            background: rgba(255, 68, 88, 0.25);
            border-color: rgba(255, 68, 88, 0.5);
        }
        
        @keyframes fadeIn {
            from { opacity: 0; }
            to { opacity: 1; }
        }
        
        @keyframes slideUp {
            from {
                opacity: 0;
                transform: translateY(30px);
            }
            to {
                opacity: 1;
                transform: translateY(0);
            }
        }
        
        @keyframes pulse-saved {
            0%, 100% { transform: scale(1); }
            50% { transform: scale(1.05); box-shadow: 0 0 20px rgba(147, 51, 234, 0.5); }
        }
        
        .availability-warning-message {
            background: linear-gradient(135deg, rgba(255, 159, 10, 0.15), rgba(255, 159, 10, 0.1));
            border: 1px solid rgba(255, 159, 10, 0.4);
            border-radius: 10px;
            padding: 1rem 1.25rem;
            margin-bottom: 1rem;
            color: #ffb84d;
            font-size: 0.95rem;
            font-weight: 500;
            display: none;
            box-shadow: 0 4px 12px rgba(255, 159, 10, 0.15);
        }
        
        @keyframes shake-animation {
            0%, 100% { transform: translateX(0); }
            10%, 30%, 50%, 70%, 90% { transform: translateX(-5px); }
            20%, 40%, 60%, 80% { transform: translateX(5px); }
        }
        
        .shake-animation {
            animation: shake-animation 0.5s ease-in-out;
        }
        
        @media (max-width: 768px) {
            .availability-modal-container {
                max-height: 95vh;
                border-radius: 12px 12px 0 0;
                margin-top: auto;
            }
            
            .availability-modal-header {
                padding: 1rem 1.25rem;
            }
            
            .availability-modal-title {
                font-size: 1.2rem;
            }
            
            .availability-modal-body {
                padding: 1.25rem;
            }
            
            .availability-days-selector {
                gap: 0.25rem;
            }
            
            .availability-day-tab {
                padding: 0.5rem 0.25rem;
            }
            
            .availability-day-tab .day-name {
                font-size: 0.65rem;
            }
            
            .availability-day-tab .day-number {
                font-size: 0.95rem;
            }
        }
    </style>

    <!-- CSS critique inline - Uniquement ce qui est nécessaire pour l'above-the-fold de la page d'accueil -->
        <style>*{margin:0;padding:0;box-sizing:border-box;}body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;background:#0a0a0f;color:#fff;line-height:1.6;}.container{max-width:1200px;margin:0 auto;padding:0 2rem;}.hero{min-height:100vh;background:linear-gradient(135deg,#1a1a2e 0%,#16213e 100%);display:flex;align-items:center;justify-content:center;padding:2rem 0;}.hero-content{text-align:center;padding:2rem 0;}.hero h1{font-family:'Montserrat',sans-serif;font-size:clamp(2rem,5vw,4rem);margin-bottom:1.5rem;font-weight:900;line-height:1.1;text-transform:uppercase;letter-spacing:0.02em;background:linear-gradient(135deg,#ffffff 0%,#d4af37 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;text-shadow:0 4px 20px rgba(199,31,55,0.3);}.hero-subtitle{font-size:clamp(1rem,2vw,1.25rem);color:#a8a8b8;margin-bottom:2.5rem;max-width:800px;margin-left:auto;margin-right:auto;line-height:1.6;}.hero-actions{margin-bottom:3rem;}.btn{display:inline-block;padding:1rem 2.5rem;border-radius:8px;text-decoration:none;font-weight:600;font-size:1.1rem;transition:all 0.3s ease;border:none;cursor:pointer;}.btn-hero{background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);color:#fff;box-shadow:0 4px 15px rgba(102,126,234,0.4);}.btn-hero:hover{transform:translateY(-2px);box-shadow:0 6px 20px rgba(102,126,234,0.6);}.btn-secondary{background:rgba(255,255,255,0.2);color:#fff;border:1px solid rgba(255,255,255,0.4);backdrop-filter:blur(10px);}.btn-secondary:hover{background:rgba(255,255,255,0.25);border-color:rgba(255,255,255,0.5);}.hero-stats{display:flex;justify-content:center;gap:3rem;flex-wrap:wrap;}.stat{text-align:center;}.stat-number{font-family:'Montserrat',sans-serif;font-size:2.5rem;font-weight:900;color:#d4af37;margin-bottom:0.5rem;text-shadow:0 0 20px rgba(212,175,55,0.3);}.stat-label{font-size:0.9rem;color:#6b6b7b;text-transform:uppercase;letter-spacing:1px;font-weight:500;}@media (max-width:768px){.hero h1{font-size:2rem;}.hero-subtitle{font-size:1rem;}.btn{padding:0.9rem 2rem;font-size:1rem;}.hero-stats{gap:2rem;}.stat-number{font-size:2rem;}}</style>
    
    <!-- Microdonnées JSON-LD pour le SEO -->
    <script type="application/ld+json">
    {
        "@context": "https://schema.org",
        "@type": "WebSite",
        "name": "Undesens | Rencontres Libertines échangistes & BDSM",
        "url": "https://www.undesens.com",
        "description": "Site de rencontres libertines, BDSM, échangisme et plan cul en France. Plateforme sécurisée pour rencontres sexe entre coquins.",
        "inLanguage": "fr-FR"
    }
    </script>

    <script type="application/ld+json">
    {
        "@context": "https://schema.org",
        "@type": "Organization",
        "name": "Undesens.com",
        "url": "https://www.undesens.com",
        "logo": {
            "@type": "ImageObject",
            "url": "https://www.undesens.com/assets/images/logo.png",
            "width": 256,
            "height": 256
        },
        "description": "Plateforme de rencontres libertines, BDSM et plan cul en France. Site pour échangisme et sexe entre coquins.",
        "contactPoint": {
            "@type": "ContactPoint",
            "contactType": "customer service",
            "url": "https://www.undesens.com/contact",
            "availableLanguage": "French"
        },
        "sameAs": [
            "https://x.com/undesens",
            "https://www.youtube.com/@undesens",
            "https://www.facebook.com/profile.php?id=61586970771581"
        ]
    }
    </script>

        <script type="application/ld+json">
    {
        "@context": "https://schema.org",
        "@type": "WebApplication",
        "name": "Undesens.com",
        "url": "https://www.undesens.com",
        "description": "Plateforme de rencontres pour adultes consentants recherchant des relations libertines ou BDSM assumées, dans un cadre sécurisé et respectueux.",
        "applicationCategory": "LifestyleApplication",
        "operatingSystem": "Web",
        "offers": {
            "@type": "Offer",
            "price": "0",
            "priceCurrency": "EUR",
            "description": "Inscription gratuite"
        },
        "contentRating": "Adult"
    }
    </script>
    
    
    
    
    <!-- CSS pour l'animation de la cloche admin -->
    <style>
        @keyframes bellRing {
            0%, 100% { transform: rotate(0deg); }
            10%, 30% { transform: rotate(-15deg); }
            20%, 40% { transform: rotate(15deg); }
            50% { transform: rotate(0deg); }
        }

        @keyframes pulse {
            0%, 100% {
                transform: scale(1);
                box-shadow: 0 2px 6px rgba(245, 158, 11, 0.4);
            }
            50% {
                transform: scale(1.1);
                box-shadow: 0 2px 10px rgba(245, 158, 11, 0.6);
            }
        }

        .admin-alert-bell:hover {
            background: rgba(245, 158, 11, 0.1) !important;
            transform: translateY(-2px);
        }

        /* Animations pour la cloche admin */
        @keyframes ring-bell {
            0%, 90%, 100% { transform: rotate(0deg); }
            92% { transform: rotate(10deg); }
            94% { transform: rotate(-10deg); }
            96% { transform: rotate(10deg); }
            98% { transform: rotate(-10deg); }
        }

        @keyframes pulse-admin-badge {
            0%, 100% {
                box-shadow: 0 2px 8px rgba(255, 68, 88, 0.5);
                transform: scale(1);
            }
            50% {
                box-shadow: 0 4px 16px rgba(255, 68, 88, 0.8);
                transform: scale(1.1);
            }
        }

        .admin-notification-bell:hover span:first-child {
            transform: scale(1.1);
        }

        /* Footer sur 4 colonnes en une ligne sur PC */
        @media (min-width: 992px) {
            .footer-grid {
                grid-template-columns: repeat(4, 1fr) !important;
            }
        }
    </style>
</head>
<body>
    <!-- End Google Tag Manager (noscript) -->

    <!-- Fil d'Ariane visuel (sauf page d'accueil) -->
    
    <!-- Script Safari chargé de manière asynchrone -->
    <script nonce="qKGOSe6Cin52IeyjbMGydw">

        if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {
            window.addEventListener('DOMContentLoaded', function() {
                var link = document.createElement('link');
                link.rel = 'stylesheet';
                link.href = '/assets/css/safari-fix.min.css';
                document.head.appendChild(link);
            });
        }
    </script>
    
    <script nonce="qKGOSe6Cin52IeyjbMGydw">

    // PWA Installation
    document.addEventListener('DOMContentLoaded', function() {
        const pwaInstallBtn = document.getElementById('pwaInstallBtn');
        let deferredPrompt;
        let isStandalone = false;

        // Vérifier si déjà installé
        if (window.matchMedia('(display-mode: standalone)').matches || window.navigator.standalone === true) {
            isStandalone = true;
        }

        // Initialiser la visibilité du bouton
        if (pwaInstallBtn) {
            // Afficher le bouton par défaut sur mobile (sauf si déjà installé)
            // Safari iOS n'a pas beforeinstallprompt, donc le bouton doit être visible
            pwaInstallBtn.style.display = isStandalone ? 'none' : 'flex';
        }

        // Chrome/Edge - beforeinstallprompt
        window.addEventListener('beforeinstallprompt', (e) => {
            // Ne pas appeler preventDefault() pour éviter le warning Chrome
            // La bannière native s'affichera automatiquement
            deferredPrompt = e;
            // Le bouton est déjà visible, on garde juste la référence au prompt
        });

        // Gérer le clic sur le bouton d'installation
        if (pwaInstallBtn) {
            pwaInstallBtn.addEventListener('click', async function(e) {
                e.stopPropagation();

                // Pour Chrome/Edge avec beforeinstallprompt
                if (deferredPrompt) {
                    deferredPrompt.prompt();
                    const { outcome } = await deferredPrompt.userChoice;
                    if (outcome === 'accepted') {
                        pwaInstallBtn.style.display = 'none';
                    }
                    deferredPrompt = null;
                }
                // Pour Safari iOS - Afficher les instructions
                else if (/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream) {
                    const instructions = document.createElement('div');
                    instructions.id = 'safari-install-instructions';
                    instructions.innerHTML = `
                        <div class="safari-install-overlay">
                            <div class="safari-install-modal">
                                <button class="safari-install-close" aria-label="Fermer">&times;</button>
                                <h3>Ajouter l'application Undesens</h3>
                                <div class="safari-install-steps">
                                    <p><strong>Sur Safari :</strong></p>
                                    <ol>
                                        <li>Cliquez en bas à droite sur <strong>...</strong></li>
                                        <li>Puis <strong>Partager</strong></li>
                                        <li>Puis <strong>+ Sur l'écran d'accueil</strong> (cochez app web)</li>
                                    </ol>
                                    <p style="margin-top: 1.5rem;"><strong>Sur Chrome :</strong></p>
                                    <ol>
                                        <li>Cliquez sur <strong>Partager</strong> (en haut à droite de la barre d'adresse)</li>
                                        <li>Cliquez sur <strong>... Plus</strong></li>
                                        <li>Cliquez sur <strong>+ Sur l'écran d'accueil</strong> et cochez <strong>Ouvrir comme app web</strong></li>
                                    </ol>
                                </div>
                            </div>
                        </div>
                    `;
                    document.body.appendChild(instructions);

                    const closeBtn = instructions.querySelector('.safari-install-close');
                    const overlay = instructions.querySelector('.safari-install-overlay');

                    const closeInstructions = () => {
                        instructions.remove();
                    };

                    closeBtn.addEventListener('click', closeInstructions);
                    overlay.addEventListener('click', function(e) {
                        if (e.target === overlay) {
                            closeInstructions();
                        }
                    });
                }
                // Pour les autres navigateurs
                else {
                    alert('Pour installer cette application, utilisez les options de votre navigateur (menu > "Installer l\'application" ou "Ajouter à l\'écran d\'accueil")');
                }
            });
        }

        // Détection installation réussie
        window.addEventListener('appinstalled', () => {
            if (pwaInstallBtn) {
                pwaInstallBtn.style.display = 'none';
            }
        });
        
        // Gestion du switch de visibilité en ligne (desktop et mobile)
        const visibilityToggle = document.getElementById('visibility-toggle');
        const visibilityLabel = document.getElementById('visibility-label');
        const visibilityToggleMobile = document.getElementById('visibility-toggle-mobile');
        const visibilityLabelMobile = document.getElementById('visibility-label-mobile');
        
        // Fonction pour synchroniser les deux switches
        function syncVisibilitySwitches(isVisible) {
            if (visibilityToggle) {
                visibilityToggle.checked = isVisible;
                if (visibilityLabel) {
                    visibilityLabel.textContent = isVisible ? 'Visible' : 'Invisible';
                }
            }
            if (visibilityToggleMobile) {
                visibilityToggleMobile.checked = isVisible;
                if (visibilityLabelMobile) {
                    visibilityLabelMobile.textContent = isVisible ? 'Visible' : 'Invisible';
                }
            }
        }
        
        // Fonction pour gérer le changement de visibilité
        function handleVisibilityChange(isVisible, toggleElement, labelElement) {
            // Mettre à jour les deux switches immédiatement
            syncVisibilitySwitches(isVisible);
            
            // Envoyer la requête au serveur
            fetch('/api/toggle-online-visibility', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                    'X-CSRF-Token': '8c62b5d81e9d00a4e008acedbe4ac965ed04137e2f47d0592c7665b3b24d660e'
                },
                body: JSON.stringify({ is_visible: isVisible })
            })
            .then(response => response.json())
            .then(data => {
                if (data.success) {
                    // Sauvegarder dans localStorage
                    localStorage.setItem('onlineVisibility', isVisible.toString());
                    
                    // Afficher un message de confirmation subtil
                    const message = document.createElement('div');
                    message.className = 'visibility-toast';
                    message.textContent = data.message;
                    document.body.appendChild(message);
                    
                    setTimeout(() => {
                        message.classList.add('show');
                    }, 100);
                    
                    setTimeout(() => {
                        message.classList.remove('show');
                        setTimeout(() => message.remove(), 300);
                    }, 2000);
                } else {
                    // En cas d'erreur, remettre les switches dans leur état précédent
                    syncVisibilitySwitches(!isVisible);
                    console.error('Erreur:', data.message);
                }
            })
            .catch(error => {
                // En cas d'erreur réseau, remettre les switches dans leur état précédent
                syncVisibilitySwitches(!isVisible);
                console.error('Erreur réseau:', error);
            });
        }
        
        // L'état initial est déjà défini par PHP depuis la base de données
        // On synchronise simplement localStorage avec cet état
        const currentVisibility = visibilityToggle ? visibilityToggle.checked : (visibilityToggleMobile ? visibilityToggleMobile.checked : true);
        localStorage.setItem('onlineVisibility', currentVisibility.toString());
        
        // Écouter les changements du switch desktop
        if (visibilityToggle) {
            visibilityToggle.addEventListener('change', function() {
                handleVisibilityChange(this.checked, visibilityToggle, visibilityLabel);
            });
        }
        
        // Écouter les changements du switch mobile
        if (visibilityToggleMobile) {
            visibilityToggleMobile.addEventListener('change', function() {
                handleVisibilityChange(this.checked, visibilityToggleMobile, visibilityLabelMobile);
            });
        }
    });

    document.addEventListener('DOMContentLoaded', function() {
        const mobileBurger = document.getElementById('mobileBurger');
        const mobileNavMenu = document.getElementById('mobileNavMenu');

        if (mobileBurger && mobileNavMenu) {
            mobileBurger.addEventListener('click', function(e) {
                e.stopPropagation();
                mobileBurger.classList.toggle('active');
                mobileNavMenu.classList.toggle('active');
                document.body.classList.toggle('mobile-menu-open');
            });


            document.addEventListener('click', function(e) {
                if (!mobileNavMenu.contains(e.target) && !mobileBurger.contains(e.target)) {
                    mobileBurger.classList.remove('active');
                    mobileNavMenu.classList.remove('active');
                    document.body.classList.remove('mobile-menu-open');
                }
            });


            mobileNavMenu.querySelectorAll('a').forEach(link => {
                link.addEventListener('click', function() {
                    mobileBurger.classList.remove('active');
                    mobileNavMenu.classList.remove('active');
                    document.body.classList.remove('mobile-menu-open');
                });
            });
        }
    });





    document.addEventListener('DOMContentLoaded', function() {
        const dropdownBtn = document.getElementById('navDropdownBtn');
        const dropdownMenu = document.getElementById('navDropdownMenu');

        if (dropdownBtn && dropdownMenu) {
            dropdownBtn.addEventListener('click', function(e) {
                e.stopPropagation();
                dropdownMenu.classList.toggle('show');
            });


            document.addEventListener('click', function(e) {
                if (!dropdownBtn.contains(e.target) && !dropdownMenu.contains(e.target)) {
                    dropdownMenu.classList.remove('show');
                }
            });
        }
    });

    document.addEventListener('DOMContentLoaded', function() {
        const profileDropdownBtn = document.getElementById('profileDropdownBtn');
        const profileDropdownMenu = document.getElementById('profileDropdownMenu');

        if (profileDropdownBtn && profileDropdownMenu) {
            profileDropdownBtn.addEventListener('click', function(e) {
                e.stopPropagation();
                profileDropdownMenu.classList.toggle('show');
            });

            document.addEventListener('click', function(e) {
                if (!profileDropdownBtn.contains(e.target) && !profileDropdownMenu.contains(e.target)) {
                    profileDropdownMenu.classList.remove('show');
                }
            });
        }
    });

        </script>

    <!-- Flash Messages (masqués sur page d'accueil pour visiteurs non connectés) -->
        
    <!-- Main Content -->
    <main style="min-height: calc(100vh - 200px);">
        <style>

/* =========================================================
   HOME2 — Design alternatif moderne
   ========================================================= */

html, body {
    margin: 0 !important;
    padding: 0 !important;
    overflow-x: hidden !important;
    overflow-y: auto !important;
    overscroll-behavior-y: auto !important;
    scroll-behavior: smooth;
}
main { margin: 0 !important; padding: 0 !important; }
main::before, body > div.container:first-of-type { display: none !important; }
.desktop-nav, .mobile-nav { display: none !important; }
body::before { display: none !important; }
.modal:not(.show) { display: none !important; }
.modal.show { visibility: visible !important; }
.modal-overlay:not(.show) {
    display: none !important;
    pointer-events: none !important;
    visibility: hidden !important;
    opacity: 0 !important;
    z-index: -1 !important;
}
.modal-overlay.show {
    display: flex !important;
    pointer-events: auto !important;
    visibility: visible !important;
    opacity: 1 !important;
}
@media (min-width: 769px) {
    html, body {
        overflow-y: scroll !important;
        height: auto !important;
    }
    .modal-overlay:not(.show):not(.active),
    div[class*="modal"]:not(.show):not(.active) {
        pointer-events: none !important;
        display: none !important;
        visibility: hidden !important;
        z-index: -9999 !important;
    }
}

/* -------- Variables -------- */
:root {
    --red:    #c71f37;
    --gold:   #d4af37;
    --dark:   #080810;
    --dark2:  #0f0f1a;
    --dark3:  #141420;
    --text:   rgba(255,255,255,0.88);
    --muted:  rgba(255,255,255,0.5);
    --border: rgba(255,255,255,0.08);
    --radius: 16px;
    --font:   'Segoe UI', system-ui, sans-serif;
}

/* -------- Sticky nav -------- */
.h2-nav {
    position: fixed;
    top: 0; left: 0; right: 0;
    z-index: 900;
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 0.9rem 2rem;
    background: rgba(8,8,16,0.85);
    backdrop-filter: blur(14px);
    border-bottom: 1px solid var(--border);
    transition: background 0.3s;
}
.h2-nav-logo img {
    height: 28px;
    width: auto;
    display: block;
}
.h2-nav-actions {
    display: flex;
    gap: 0.75rem;
    align-items: center;
}
.h2-btn-outline {
    padding: 0.55rem 1.3rem;
    border: 1px solid rgba(255,255,255,0.25);
    border-radius: 50px;
    color: rgba(255,255,255,0.85);
    font-size: 0.9rem;
    font-weight: 500;
    text-decoration: none;
    transition: all 0.2s;
    font-family: var(--font);
}
.h2-btn-outline:hover {
    border-color: var(--red);
    color: #fff;
    background: rgba(199,31,55,0.1);
}
.h2-btn-cta {
    padding: 0.55rem 1.4rem;
    background: var(--red);
    border: 1px solid transparent;
    border-radius: 50px;
    color: #fff !important;
    -webkit-text-fill-color: #fff !important;
    font-size: 0.9rem;
    font-weight: 700;
    text-decoration: none;
    transition: all 0.2s;
    font-family: var(--font);
}
.h2-btn-cta:hover {
    background: #a01830;
    transform: translateY(-1px);
    box-shadow: 0 6px 20px rgba(199,31,55,0.45);
}

/* -------- Hero -------- */
.h2-hero {
    position: relative;
    min-height: 100vh;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    text-align: center;
    padding: 120px 24px 80px;
    background: var(--dark);
    overflow: hidden;
}

/* Mesh gradient animé */
.h2-hero::before {
    content: '';
    position: absolute;
    inset: 0;
    background:
        radial-gradient(ellipse 80% 60% at 20% 60%, rgba(199,31,55,0.18) 0%, transparent 60%),
        radial-gradient(ellipse 60% 50% at 80% 20%, rgba(212,175,55,0.1) 0%, transparent 55%),
        radial-gradient(ellipse 70% 80% at 50% 100%, rgba(60,60,120,0.12) 0%, transparent 60%);
    animation: meshShift 14s ease-in-out infinite alternate;
    pointer-events: none;
}

@keyframes meshShift {
    0%   { opacity: 1; transform: scale(1); }
    100% { opacity: 0.75; transform: scale(1.08) translateY(-20px); }
}

/* Grid texture subtile */
.h2-hero::after {
    content: '';
    position: absolute;
    inset: 0;
    background-image:
        linear-gradient(rgba(255,255,255,0.02) 1px, transparent 1px),
        linear-gradient(90deg, rgba(255,255,255,0.02) 1px, transparent 1px);
    background-size: 60px 60px;
    pointer-events: none;
}

.h2-hero-content {
    position: relative;
    z-index: 2;
    max-width: 820px;
}

.h2-hero-eyebrow {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.4rem 1rem;
    background: rgba(199,31,55,0.12);
    border: 1px solid rgba(199,31,55,0.3);
    border-radius: 50px;
    color: #e8617a;
    font-size: 0.82rem;
    font-weight: 600;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    margin-bottom: 1.75rem;
    animation: fadeUp 0.6s ease both;
}
.h2-hero-eyebrow span.dot {
    width: 6px; height: 6px;
    background: var(--red);
    border-radius: 50%;
    animation: pulse2 1.8s ease-in-out infinite;
}
@keyframes pulse2 {
    0%,100% { opacity:1; transform:scale(1); }
    50% { opacity:0.4; transform:scale(0.7); }
}

.h2-hero h1 {
    font-family: var(--font);
    font-size: clamp(2.6rem, 6vw, 5rem);
    font-weight: 900;
    line-height: 1.08;
    letter-spacing: -0.03em;
    color: #fff;
    margin: 0 0 1.5rem;
    animation: fadeUp 0.7s 0.1s ease both;
}
.h2-hero h1 em {
    font-style: normal;
    background: linear-gradient(135deg, var(--red) 0%, var(--gold) 100%);
    -webkit-background-clip: text;
    -webkit-text-fill-color: transparent;
    background-clip: text;
}

.h2-hero-sub {
    font-size: clamp(1rem, 2vw, 1.2rem);
    color: var(--muted);
    line-height: 1.7;
    max-width: 600px;
    margin: 0 auto 2.5rem;
    animation: fadeUp 0.7s 0.2s ease both;
}

.h2-hero-cta {
    display: flex;
    gap: 1rem;
    justify-content: center;
    flex-wrap: wrap;
    animation: fadeUp 0.7s 0.3s ease both;
}

.h2-btn-primary {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    padding: 1rem 2.4rem;
    background: linear-gradient(135deg, var(--red) 0%, #9a1828 100%);
    color: #fff !important;
    -webkit-text-fill-color: #fff !important;
    font-weight: 700;
    font-size: 1rem;
    text-decoration: none;
    border-radius: 50px;
    border: none;
    box-shadow: 0 8px 28px rgba(199,31,55,0.45);
    transition: all 0.25s;
    font-family: var(--font);
}
.h2-btn-primary:hover {
    transform: translateY(-3px);
    box-shadow: 0 14px 40px rgba(199,31,55,0.6);
}
.h2-btn-ghost {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    padding: 1rem 2.4rem;
    background: rgba(255,255,255,0.06);
    color: var(--text);
    font-weight: 600;
    font-size: 1rem;
    text-decoration: none;
    border-radius: 50px;
    border: 1px solid rgba(255,255,255,0.15);
    transition: all 0.25s;
    font-family: var(--font);
}
.h2-btn-ghost:hover {
    background: rgba(255,255,255,0.11);
    border-color: rgba(255,255,255,0.3);
    transform: translateY(-3px);
}

/* Trust badges */
.h2-trust {
    display: flex;
    gap: 1.5rem;
    justify-content: center;
    flex-wrap: wrap;
    margin-top: 2.5rem;
    animation: fadeUp 0.7s 0.45s ease both;
}
.h2-trust-item {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    color: var(--muted);
    font-size: 0.88rem;
    font-weight: 500;
}
.h2-trust-item svg { color: var(--gold); flex-shrink: 0; }

/* Stats bar */
.h2-stats-bar {
    position: absolute;
    bottom: 0; left: 0; right: 0;
    z-index: 2;
    display: flex;
    justify-content: center;
    gap: 0;
    background: rgba(255,255,255,0.03);
    border-top: 1px solid var(--border);
    animation: fadeUp 0.7s 0.55s ease both;
}
.h2-stat-item {
    flex: 1;
    max-width: 200px;
    padding: 1.4rem 1rem;
    text-align: center;
    border-right: 1px solid var(--border);
}
.h2-stat-item:last-child { border-right: none; }
.h2-stat-num {
    font-size: 1.9rem;
    font-weight: 900;
    color: var(--gold);
    font-family: var(--font);
    line-height: 1;
}
.h2-stat-lbl {
    font-size: 0.75rem;
    color: var(--muted);
    text-transform: uppercase;
    letter-spacing: 0.07em;
    margin-top: 0.3rem;
}

@keyframes fadeUp {
    from { opacity:0; transform:translateY(22px); }
    to   { opacity:1; transform:translateY(0); }
}

/* -------- Forum feed -------- */
.h2-feed {
    background: var(--dark2);
    padding: 60px 24px;
    border-top: 1px solid var(--border);
}
.h2-feed-inner {
    max-width: 760px;
    margin: 0 auto;
}
.h2-section-label {
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin-bottom: 1.25rem;
}
.h2-section-label h2 {
    font-size: 1.1rem;
    font-weight: 700;
    color: #fff;
    margin: 0;
    display: flex;
    align-items: center;
    gap: 0.5rem;
}
.h2-section-label a {
    font-size: 0.83rem;
    color: var(--red);
    text-decoration: none;
    font-weight: 600;
}
.h2-section-label a:hover { text-decoration: underline; }
.h2-feed-card {
    background: rgba(255,255,255,0.03);
    border: 1px solid var(--border);
    border-radius: var(--radius);
    overflow: hidden;
}
.h2-feed-item {
    display: flex;
    align-items: center;
    gap: 1rem;
    padding: 0.9rem 1.25rem;
    text-decoration: none;
    color: inherit;
    border-bottom: 1px solid var(--border);
    transition: background 0.2s;
}
.h2-feed-item:last-child { border-bottom: none; }
.h2-feed-item:hover { background: rgba(199,31,55,0.06); }
.h2-feed-avatar {
    width: 38px; height: 38px;
    border-radius: 50%;
    background: rgba(199,31,55,0.12);
    border: 1px solid rgba(199,31,55,0.2);
    display: flex; align-items: center; justify-content: center;
    color: var(--red);
    flex-shrink: 0;
}
.h2-feed-text { flex: 1; min-width: 0; }
.h2-feed-title {
    font-size: 0.92rem;
    font-weight: 600;
    color: #f1f5f9;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.h2-feed-meta {
    font-size: 0.76rem;
    color: var(--muted);
    margin-top: 0.15rem;
    display: flex;
    gap: 0.3rem;
    align-items: center;
}
.h2-feed-meta b { color: var(--red); font-weight: 600; }
.h2-feed-thumb {
    width: 58px; height: 44px;
    border-radius: 8px;
    overflow: hidden;
    border: 1px solid var(--border);
    flex-shrink: 0;
}
.h2-feed-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* -------- How it works -------- */
.h2-how {
    background: var(--dark3);
    padding: 90px 24px;
    text-align: center;
    border-top: 1px solid var(--border);
}
.h2-section-title {
    font-size: clamp(1.6rem, 3vw, 2.4rem);
    font-weight: 800;
    color: #fff;
    margin: 0 0 0.75rem;
    letter-spacing: -0.02em;
}
.h2-section-sub {
    font-size: 1.05rem;
    color: var(--muted);
    margin: 0 auto 3rem;
    max-width: 540px;
}
.h2-steps {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
    gap: 2rem;
    max-width: 900px;
    margin: 0 auto;
    position: relative;
}
.h2-steps::before {
    content: '';
    position: absolute;
    top: 36px;
    left: calc(33% - 10px);
    right: calc(33% - 10px);
    height: 1px;
    background: linear-gradient(90deg, transparent, var(--red), transparent);
    pointer-events: none;
}
.h2-step {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 1rem;
}
.h2-step-num {
    width: 72px; height: 72px;
    border-radius: 50%;
    background: linear-gradient(135deg, rgba(199,31,55,0.15) 0%, rgba(199,31,55,0.05) 100%);
    border: 2px solid rgba(199,31,55,0.3);
    display: flex; align-items: center; justify-content: center;
    font-size: 1.6rem;
    font-weight: 900;
    color: var(--red);
    font-family: var(--font);
    flex-shrink: 0;
    position: relative;
    z-index: 1;
}
.h2-step h3 {
    font-size: 1.05rem;
    font-weight: 700;
    color: #fff;
    margin: 0;
}
.h2-step p {
    font-size: 0.92rem;
    color: var(--muted);
    line-height: 1.6;
    margin: 0;
    max-width: 220px;
}

/* -------- Features -------- */
.h2-features {
    background: var(--dark2);
    padding: 90px 24px;
    border-top: 1px solid var(--border);
}
.h2-features-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
    gap: 1.5rem;
    max-width: 1100px;
    margin: 0 auto;
}
.h2-feat-card {
    background: rgba(255,255,255,0.02);
    border: 1px solid var(--border);
    border-radius: var(--radius);
    padding: 2rem 1.75rem;
    transition: border-color 0.25s, transform 0.25s, box-shadow 0.25s;
}
.h2-feat-card:hover {
    border-color: rgba(199,31,55,0.35);
    transform: translateY(-6px);
    box-shadow: 0 16px 48px rgba(199,31,55,0.12);
}
.h2-feat-icon {
    width: 52px; height: 52px;
    border-radius: 14px;
    display: flex; align-items: center; justify-content: center;
    margin-bottom: 1.25rem;
    font-size: 1.6rem;
}
.h2-feat-card h3 {
    font-size: 1.05rem;
    font-weight: 700;
    color: #fff;
    margin: 0 0 0.6rem;
}
.h2-feat-card p {
    font-size: 0.92rem;
    color: var(--muted);
    line-height: 1.65;
    margin: 0;
}

/* -------- Testimonial -------- */
.h2-testimonial {
    background: var(--dark);
    padding: 80px 24px;
    text-align: center;
    border-top: 1px solid var(--border);
    position: relative;
    overflow: hidden;
}
.h2-testimonial::before {
    content: '';
    position: absolute;
    inset: 0;
    background: radial-gradient(ellipse 60% 60% at 50% 0%, rgba(199,31,55,0.07) 0%, transparent 65%);
    pointer-events: none;
}
.h2-testimonial-card {
    max-width: 680px;
    margin: 0 auto;
    position: relative;
    z-index: 1;
}
.h2-testimonial-quote {
    font-size: clamp(1.1rem, 2vw, 1.35rem);
    font-style: italic;
    color: var(--text);
    line-height: 1.75;
    margin-bottom: 1.75rem;
}
.h2-testimonial-quote::before {
    content: '\201C';
    font-size: 5rem;
    line-height: 0;
    vertical-align: -2rem;
    color: var(--red);
    opacity: 0.6;
    margin-right: 0.1em;
    font-style: normal;
}
.h2-testimonial-author {
    font-size: 0.9rem;
    font-weight: 600;
    color: var(--gold);
    letter-spacing: 0.04em;
}
.h2-stars {
    color: var(--gold);
    font-size: 1.1rem;
    margin-bottom: 1.25rem;
    letter-spacing: 2px;
}

/* -------- CTA final -------- */
.h2-cta {
    background: var(--dark3);
    padding: 100px 24px;
    text-align: center;
    border-top: 1px solid var(--border);
    position: relative;
    overflow: hidden;
}
.h2-cta::before {
    content: '';
    position: absolute;
    inset: 0;
    background:
        radial-gradient(ellipse 70% 60% at 50% 50%, rgba(199,31,55,0.1) 0%, transparent 65%);
    pointer-events: none;
}
.h2-cta-inner { position: relative; z-index: 1; max-width: 640px; margin: 0 auto; }
.h2-cta h2 {
    font-size: clamp(2rem, 4vw, 3.2rem);
    font-weight: 900;
    color: #fff;
    letter-spacing: -0.03em;
    margin: 0 0 1rem;
    line-height: 1.1;
}
.h2-cta p {
    font-size: 1.1rem;
    color: var(--muted);
    line-height: 1.7;
    margin: 0 auto 2.5rem;
    max-width: 520px;
}

/* -------- Social strip -------- */
.h2-social {
    background: var(--dark);
    padding: 2.5rem 24px;
    border-top: 1px solid var(--border);
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 1rem;
    flex-wrap: wrap;
}
.h2-social-link {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.6rem 1.2rem;
    background: rgba(255,255,255,0.04);
    border: 1px solid var(--border);
    border-radius: 10px;
    color: var(--muted);
    text-decoration: none;
    font-size: 0.88rem;
    font-weight: 500;
    transition: all 0.2s;
}
.h2-social-link:hover {
    color: #fff;
    border-color: rgba(255,255,255,0.2);
    background: rgba(255,255,255,0.08);
    transform: translateY(-2px);
}

/* -------- Responsive -------- */
@media (max-width: 640px) {
    .h2-nav { padding: 0.75rem 1rem; }
    .h2-nav-logo img { height: 22px; }
    .h2-nav-actions { gap: 0.4rem; }
    .h2-btn-outline {
        padding: 0.35rem 0.7rem;
        font-size: 0.75rem;
    }
    .h2-btn-cta {
        padding: 0.35rem 0.75rem;
        font-size: 0.75rem;
    }
    .h2-hero { padding: 100px 16px 90px; }
    .h2-stats-bar { flex-wrap: wrap; position: static; margin-top: 2rem; }
    .h2-stat-item { border-right: none; border-bottom: 1px solid var(--border); flex: 0 0 50%; max-width: 50%; }
    .h2-steps::before { display: none; }
    .h2-trust { gap: 1rem; }
}
</style>


<script>
// Fix scroll — même cause que home.php : le layout bloque le scroll sur desktop
(function() {
    if (window.innerWidth < 769) return;
    document.documentElement.style.overflowY = 'scroll';
    document.documentElement.style.overscrollBehavior = 'auto';
    document.body.style.overflowY = 'scroll';
    document.body.style.height = 'auto';
    document.body.style.overscrollBehavior = 'auto';

    function neutralizeScrollBlockers() {
        document.querySelectorAll('.modal-overlay, [id*="modal"]').forEach(function(el) {
            if (!el.classList.contains('show') && !el.classList.contains('active')) {
                var s = window.getComputedStyle(el);
                if (s.display !== 'none') {
                    el.style.pointerEvents = 'none';
                    el.style.display = 'none';
                    el.style.zIndex = '-9999';
                }
            }
        });
        if (document.body.style.overflow === 'hidden') {
            var visible = document.querySelectorAll('.modal-overlay.show, .modal-overlay.active');
            if (!visible.length) {
                document.body.style.overflow = '';
                document.body.style.overflowY = 'scroll';
            }
        }
    }
    neutralizeScrollBlockers();
    setInterval(neutralizeScrollBlockers, 500);
    document.addEventListener('DOMContentLoaded', function() {
        neutralizeScrollBlockers();
        document.body.style.overflowY = 'scroll';
    });
})();
</script>

<!-- =============================================
     NAV STICKY
     ============================================= -->
<nav class="h2-nav">
    <a href="/" class="h2-nav-logo" title="Undesens - Rencontres libertines &amp; BDSM">
        <picture>
            <source srcset="/assets/images/undesens-text.webp" type="image/webp">
            <img src="/assets/images/undesens-text.png" alt="Undesens" width="160" height="25">
        </picture>
    </a>
    <div class="h2-nav-actions">
        <a href="/connexion" class="h2-btn-outline">Se connecter</a>
        <a href="/inscription" class="h2-btn-cta">Inscription gratuite</a>
    </div>
</nav>

<!-- =============================================
     HERO
     ============================================= -->
<section class="h2-hero">
    <div class="h2-hero-content">

        <div class="h2-hero-eyebrow">
            <span class="dot"></span>
            Plateforme 100&nbsp;% gratuite &nbsp;·&nbsp; France
        </div>

        <h1>
            Rencontres <em>libertines</em><br>
            &amp; <em>BDSM</em> assumées
        </h1>

        <p class="h2-hero-sub">
            Site de rencontres pour adultes consentants. Libertinage, échangisme, fétichisme, candaulisme, domination &amp; soumission — vivez vos désirs librement, en toute discrétion.
        </p>

        <div class="h2-hero-cta">
            <a href="/inscription" class="h2-btn-primary" title="Inscription gratuite Undesens">
                <svg width="18" height="18" fill="none" stroke="currentColor" stroke-width="2.5" viewbox="0 0 24 24"><path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><line x1="19" y1="8" x2="19" y2="14"/><line x1="22" y1="11" x2="16" y2="11"/></svg>
                Rejoindre gratuitement
            </a>
            <a href="/connexion" class="h2-btn-ghost" title="Se connecter">
                <svg width="18" height="18" fill="none" stroke="currentColor" stroke-width="2.5" viewbox="0 0 24 24"><path d="M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4"/><polyline points="10 17 15 12 10 7"/><line x1="15" y1="12" x2="3" y2="12"/></svg>
                Se connecter
            </a>
        </div>

        <div class="h2-trust">
            <div class="h2-trust-item">
                <svg width="15" height="15" fill="none" viewbox="0 0 24 24" stroke="currentColor" stroke-width="2.5"><polyline points="20 6 9 17 4 12"/></svg>
                100&nbsp;% gratuit
            </div>
            <div class="h2-trust-item">
                <svg width="15" height="15" fill="none" viewbox="0 0 24 24" stroke="currentColor" stroke-width="2.5"><rect x="3" y="11" width="18" height="11" rx="2"/><path d="M7 11V7a5 5 0 0 1 10 0v4"/></svg>
                Données chiffrées
            </div>
            <div class="h2-trust-item">
                <svg width="15" height="15" fill="none" viewbox="0 0 24 24" stroke="currentColor" stroke-width="2.5"><path d="M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24"/><line x1="1" y1="1" x2="23" y2="23"/></svg>
                Anonymat garanti
            </div>
            <div class="h2-trust-item">
                <svg width="15" height="15" fill="none" viewbox="0 0 24 24" stroke="currentColor" stroke-width="2.5"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/></svg>
                Sans engagement
            </div>
        </div>
    </div>

    <!-- Stats bar collée au bas du hero -->
    <div class="h2-stats-bar">
        <div class="h2-stat-item">
            <div class="h2-stat-num" id="js-members">345</div>
            <div class="h2-stat-lbl">Membres actifs</div>
        </div>
        <div class="h2-stat-item">
            <div class="h2-stat-num">
                3.7K            </div>
            <div class="h2-stat-lbl">Messages échangés</div>
        </div>
        <div class="h2-stat-item">
            <div class="h2-stat-num">98&nbsp;%</div>
            <div class="h2-stat-lbl">Satisfaction</div>
        </div>
    </div>
</section>

<!-- =============================================
     FORUM FEED
     ============================================= -->
<section class="h2-feed">
    <div class="h2-feed-inner">
        <div class="h2-section-label">
            <h2>
                <svg width="18" height="18" fill="none" stroke="#c71f37" stroke-width="2" viewbox="0 0 24 24"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/></svg>
                Derniers articles du forum
            </h2>
            <a href="/forum">Voir tout &rarr;</a>
        </div>
        <div class="h2-feed-card">
                        <a href="/forum/article/le-bdsm-comprendre-cet-univers-base-sur-la-confiance-et-le-consentement" class="h2-feed-item">
                <div class="h2-feed-avatar">
                    <svg width="18" height="18" viewbox="0 0 24 24" fill="currentColor"><path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/></svg>
                </div>
                <div class="h2-feed-text">
                    <div class="h2-feed-title">Le BDSM : comprendre cet univers basé sur la confiance et le consentement</div>
                    <div class="h2-feed-meta">
                        <b>francoisr69</b>
                                                    <span>&middot;</span>
                            <span>BDSM</span>
                                            </div>
                </div>
                                                <div class="h2-feed-thumb">
                    <img src="/uploads/forum/article_48_69aed9ce8ae82.jpeg" alt="Le BDSM : comprendre cet univers basé sur la confiance et le consentement" loading="lazy">
                </div>
                            </a>
                        <a href="/forum/article/la-foret" class="h2-feed-item">
                <div class="h2-feed-avatar">
                    <svg width="18" height="18" viewbox="0 0 24 24" fill="currentColor"><path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/></svg>
                </div>
                <div class="h2-feed-text">
                    <div class="h2-feed-title">La forêt</div>
                    <div class="h2-feed-meta">
                        <b>Undesens.com</b>
                                                    <span>&middot;</span>
                            <span>Vos aventures libertines</span>
                                            </div>
                </div>
                                                <div class="h2-feed-thumb">
                    <img src="/uploads/forum/article_45_69ad9b388dcff.jpg" alt="La forêt" loading="lazy">
                </div>
                            </a>
                        <a href="/forum/article/pegging-et-feminization" class="h2-feed-item">
                <div class="h2-feed-avatar">
                    <svg width="18" height="18" viewbox="0 0 24 24" fill="currentColor"><path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/></svg>
                </div>
                <div class="h2-feed-text">
                    <div class="h2-feed-title">Pegging et feminization</div>
                    <div class="h2-feed-meta">
                        <b>thom</b>
                                                    <span>&middot;</span>
                            <span>BDSM</span>
                                            </div>
                </div>
                                                <div class="h2-feed-thumb">
                    <img src="/uploads/forum/themes/69a3090250c2c_1772292354.png" alt="Pegging et feminization" loading="lazy">
                </div>
                            </a>
                        <a href="/forum/article/il-entre" class="h2-feed-item">
                <div class="h2-feed-avatar">
                    <svg width="18" height="18" viewbox="0 0 24 24" fill="currentColor"><path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/></svg>
                </div>
                <div class="h2-feed-text">
                    <div class="h2-feed-title">Il entre.</div>
                    <div class="h2-feed-meta">
                        <b>Undesens.com</b>
                                                    <span>&middot;</span>
                            <span>Vos aventures libertines</span>
                                            </div>
                </div>
                                                <div class="h2-feed-thumb">
                    <img src="/uploads/forum/article_40_69ab6398c3c38.jpg" alt="Il entre." loading="lazy">
                </div>
                            </a>
                        <a href="/forum/article/le-libertinage-dans-tous-ses-etats" class="h2-feed-item">
                <div class="h2-feed-avatar">
                    <svg width="18" height="18" viewbox="0 0 24 24" fill="currentColor"><path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/></svg>
                </div>
                <div class="h2-feed-text">
                    <div class="h2-feed-title">Le libertinage dans tous ses états</div>
                    <div class="h2-feed-meta">
                        <b>Eli-Na</b>
                                                    <span>&middot;</span>
                            <span>Le libertinage</span>
                                            </div>
                </div>
                                                <div class="h2-feed-thumb">
                    <img src="/uploads/forum/article_36_69a49dec72348.jpg" alt="Le libertinage dans tous ses états" loading="lazy">
                </div>
                            </a>
                    </div>
    </div>
</section>

<!-- =============================================
     COMMENT ÇA MARCHE
     ============================================= -->
<section class="h2-how">
    <h2 class="h2-section-title">Comment ça marche&nbsp;?</h2>
    <p class="h2-section-sub">Trois étapes pour commencer à rencontrer des membres qui partagent vos envies.</p>

    <div class="h2-steps">
        <div class="h2-step">
            <div class="h2-step-num">1</div>
            <h3>Créez votre profil</h3>
            <p>Inscription gratuite en quelques secondes. Décrivez vos envies et ce que vous recherchez.</p>
        </div>
        <div class="h2-step">
            <div class="h2-step-num">2</div>
            <h3>Découvrez les membres</h3>
            <p>Notre algorithme vous présente les profils compatibles avec vos préférences et pratiques.</p>
        </div>
        <div class="h2-step">
            <div class="h2-step-num">3</div>
            <h3>Rencontrez &amp; vivez</h3>
            <p>Échangez en toute sécurité et organisez vos rencontres selon vos conditions.</p>
        </div>
    </div>
</section>

<!-- =============================================
     FEATURES (6 cartes)
     ============================================= -->
<section class="h2-features">
    <div style="text-align:center;max-width:700px;margin:0 auto 3rem;">
        <h2 class="h2-section-title">Tout ce qu'il vous faut</h2>
        <p class="h2-section-sub" style="margin:0.5rem auto 0;">Une plateforme pensée pour des rencontres authentiques, respectueuses et sans prise de tête.</p>
    </div>

    <div class="h2-features-grid">
        <div class="h2-feat-card">
            <div class="h2-feat-icon" style="background:rgba(199,31,55,0.1);">🎯</div>
            <h3>Matching intelligent</h3>
            <p>Notre algorithme analyse vos préférences libertines ou BDSM pour vous proposer des profils vraiment compatibles.</p>
        </div>
        <div class="h2-feat-card">
            <div class="h2-feat-icon" style="background:rgba(102,126,234,0.1);">💬</div>
            <h3>Chat privé &amp; sécurisé</h3>
            <p>Messagerie chiffrée en temps réel. Vos conversations restent strictement privées.</p>
        </div>
        <div class="h2-feat-card">
            <div class="h2-feat-icon" style="background:rgba(212,175,55,0.1);">🔒</div>
            <h3>Confidentialité totale</h3>
            <p>Vos données sont chiffrées. Vous contrôlez qui peut vous voir et vous contacter.</p>
        </div>
        <div class="h2-feat-card">
            <div class="h2-feat-icon" style="background:rgba(199,31,55,0.1);">🗣️</div>
            <h3>Forum communautaire</h3>
            <p>Partagez vos expériences, fantasmes et découvertes dans un espace d'échange bienveillant.</p>
        </div>
        <div class="h2-feat-card">
            <div class="h2-feat-icon" style="background:rgba(102,126,234,0.1);">🛡️</div>
            <h3>Filtres avancés</h3>
            <p>Seuls les profils correspondant à vos critères et pratiques peuvent vous contacter.</p>
        </div>
        <div class="h2-feat-card">
            <div class="h2-feat-icon" style="background:rgba(212,175,55,0.1);">🎁</div>
            <h3>100&nbsp;% gratuit</h3>
            <p>Toutes les fonctionnalités sans abonnement. Inscription et utilisation entièrement gratuites.</p>
        </div>
    </div>
</section>

<!-- =============================================
     TÉMOIGNAGE
     ============================================= -->
<section class="h2-testimonial">
    <div class="h2-testimonial-card">
        <div class="h2-stars">★★★★★</div>
        <div class="h2-testimonial-quote">
            Undesens m'a permis de rencontrer des personnes qui partagent mes envies dans un cadre très bienveillant. L'algorithme de matching est vraiment efficace — mes premières conversations ont rapidement abouti et la suite n'est que plaisirs ...
        </div>
        <div class="h2-testimonial-author">— Aleia</div>
    </div>
</section>

<!-- =============================================
     FAQ (réutilise le partiel existant)
     ============================================= -->
<!-- Schema.org FAQPage pour le SEO -->
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "Qu'est ce que des rencontres libertines & échangistes ?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Le libertinage relève avant tout d'une philosophie de vie fondée sur la liberté, l'ouverture d'esprit et l'affranchissement des conventions établies. Vivre des rencontres libertines, c'est cultiver l'intensité de l'instant, explorer ses désirs en harmonie avec ceux de partenaires consentants. Undesens se positionne comme une plateforme française dédiée aux rencontres libertines, échangistes et BDSM, conçue pour rassembler des profils variés partageant une même vision : celle d'échanges sans tabou, fondés sur la confiance, la discrétion et le respect mutuel."
      }
    },
    {
      "@type": "Question",
      "name": "Comment explorer vos rencontres BDSM en toute confiance ?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "L'univers du BDSM recouvre un large éventail de pratiques fondées sur l'échange, le consentement éclairé et le respect mutuel. Undesens propose un espace dédié aux rencontres BDSM, pensé pour permettre aux adultes consentants d'exprimer leurs désirs et d'explorer leurs fantasmes dans un cadre sécurisé et maîtrisé. La plateforme favorise les mises en relation entre profils partageant des affinités communes, en accord avec leurs envies et leurs limites."
      }
    },
    {
      "@type": "Question",
      "name": "SM et BDSM c'est quoi ?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Le SM et le BDSM recouvrent des pratiques relationnelles et érotiques fondées sur des dynamiques de pouvoir, de contrainte et de consentement mutuel. Le terme BDSM est un acronyme regroupant les notions de Bondage, Discipline, Domination, Soumission et Sadomasochisme. Il désigne un ensemble de pratiques reposant sur un accord explicite entre partenaires, intégrant la contrainte physique ou psychologique, la mise en scène de rôles, l'humiliation symbolique ou la douleur contrôlée à des fins érotiques."
      }
    },
    {
      "@type": "Question",
      "name": "Undesens est-il ouvert à tous les profils libertins ?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "La plateforme s'adresse à l'ensemble des profils libertins, sans distinction : hommes, femmes, couples ou personnes seules, qu'ils soient néophytes ou expérimentés. Sur Undesens, aucune pratique n'est stigmatisée. Du libertinage traditionnel aux expériences plus affirmées telles que le dogging, le candaulisme, l'échangisme, l'exhibitionnisme, le voyeurisme ou encore le BDSM, la diversité des envies et des sensibilités est pleinement reconnue."
      }
    },
    {
      "@type": "Question",
      "name": "Le site Undesens.com est-il gratuit ?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "OUI ! Undesens est entièrement gratuit. Nous sommes convaincus que l'accès à une communauté libertine & BDSM de qualité doit être accessible à tous, sans frais. Vous pouvez vous inscrire, créer votre profil, rechercher des partenaires et échanger librement sans payer un centime."
      }
    },
    {
      "@type": "Question",
      "name": "Qui peut s'inscrire sur le site ?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "L'inscription est strictement réservée aux personnes majeures (18+). Le site accueille tous les profils : dominants, dominatrices, soumis, soumises, switches, et couples libertins. Que vous soyez débutant ou expérimenté dans les pratiques libertines & BDSM, vous êtes les bienvenus."
      }
    },
    {
      "@type": "Question",
      "name": "Le candaulisme : repères essentiels et modalités d'initiation",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Le candaulisme désigne une pratique relationnelle et intime fondée sur un consentement explicite et partagé au sein du couple. Cette pratique consiste à permettre à son ou sa partenaire de vivre une expérience avec une tierce personne, tandis que l'autre conjoint, en qualité d'observateur consentant ou de participant indirect, y trouve une source de stimulation et d'épanouissement personnel. À l'opposé du modèle exclusif traditionnel, cette approche valorise la confiance mutuelle, la communication et l'attention portée au plaisir de l'autre."
      }
    },
    {
      "@type": "Question",
      "name": "Undesens.com dispose-t-il de forums et d'espaces d'échanges ?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Oui, vous retrouverez sur https://www.undesens.com/forum nos forums de partages et d'échanges sur le libertinage, vos aventures libertines, vos fantasmes, le bdsm, vos photos coquines, les lieux d'exhibition, les clubs libertins."
      }
    }
  ]
}
</script>

<!-- Section FAQ réutilisable -->
<section class="faq-section" style="padding: 0;">
    <div class="container" style="max-width: 1400px; margin: 0 auto; padding: 0 20px;">
        <div style="max-width: 1200px; margin: 60px auto; padding: 50px 40px; background: linear-gradient(135deg, rgba(255, 255, 255, 0.02) 0%, rgba(255, 255, 255, 0.005) 100%); backdrop-filter: blur(5px); border: 1px solid rgba(255, 255, 255, 0.05); border-radius: 25px; box-shadow: 0 10px 40px rgba(0, 0, 0, 0.4); position: relative;">
            
            <h3 id="accordion-libertin-toggle" style="color: #ffffff; margin: 0; font-size: 1.15rem; font-weight: 600; letter-spacing: 0.3px; position: relative; text-align: left; cursor: pointer; user-select: none; padding: 18px 50px 18px 20px; background: rgba(255, 255, 255, 0.03); border-radius: 12px; border-left: 4px solid rgba(199, 31, 55, 0.7); transition: all 0.3s ease;" onclick="toggleAccordion('libertin')" onmouseover="this.style.background='rgba(255, 255, 255, 0.05)'" onmouseout="this.style.background='rgba(255, 255, 255, 0.03)'">
                Qu'est ce que des rencontres libertines & échangistes ?
                <span id="accordion-libertin-icon" style="position: absolute; right: 20px; top: 50%; transform: translateY(-50%); font-size: 1.2rem; transition: transform 0.3s ease; color: rgba(199, 31, 55, 0.8);">▼</span>
            </h3>
            
            <div id="accordion-libertin-content" style="overflow: hidden; max-height: 0px; transition: max-height 0.4s ease; padding: 0 20px;">
                <p style="margin-bottom: 25px; margin-top: 25px; color: rgba(255, 255, 255, 0.9); line-height: 2; font-size: 1.12rem; text-align: justify;">
                    Le <strong style="color: #ffffff; font-weight: 700;">libertinage</strong> relève avant tout d'une philosophie de vie fondée sur la liberté, l'ouverture d'esprit et l'affranchissement des conventions établies. Il s'inscrit dans une démarche où les choix affectifs, relationnels et sensuels s'expriment en dehors des cadres normatifs, dans le respect de soi et des autres.
                </p>

                <p style="margin-bottom: 25px; color: rgba(255, 255, 255, 0.9); line-height: 2; font-size: 1.12rem; text-align: justify;">
                    Vivre des <strong style="color: #ffffff; font-weight: 700;">rencontres libertines</strong>, c'est cultiver l'intensité de l'instant, explorer ses désirs en harmonie avec ceux de partenaires consentants, qu'il s'agisse d'hommes, de femmes, de couples ou de célibataires, dans une approche libre et assumée.
                </p>

                <p style="margin-bottom: 25px; color: rgba(255, 255, 255, 0.9); line-height: 2; font-size: 1.12rem; text-align: justify;">
                    <strong style="color: #ffffff; font-weight: 700;">Undesens</strong> se positionne comme une plateforme française dédiée aux <strong style="color: #ffffff; font-weight: 700;">rencontres libertines</strong>, <strong style="color: #ffffff; font-weight: 700;">échangistes</strong> et <strong style="color: #ffffff; font-weight: 700;">BDSM</strong>, conçue pour rassembler des profils variés partageant une même vision : celle d'échanges sans tabou, fondés sur la confiance, la discrétion et le respect mutuel. L'environnement proposé favorise des mises en relation sereines au sein d'une communauté ouverte et bienveillante.
                </p>

                <p style="margin-bottom: 25px; color: rgba(255, 255, 255, 0.9); line-height: 2; font-size: 1.12rem; text-align: justify;">
                    Pensée pour accompagner toutes les sensibilités, la plateforme s'adresse aussi bien aux couples souhaitant élargir leur expérience, qu'aux célibataires en quête de nouvelles découvertes, aux amateurs d'<strong style="color: #ffffff; font-weight: 700;">échangisme</strong>, aux adeptes du <strong style="color: #ffffff; font-weight: 700;">candaulisme</strong>, du <strong style="color: #ffffff; font-weight: 700;">BDSM</strong> ou des univers alternatifs, ainsi qu'aux passionnés de soirées privées et de relations non conventionnelles.
                </p>

                <p style="margin-bottom: 25px; color: rgba(255, 255, 255, 0.9); line-height: 2; font-size: 1.12rem; text-align: justify;">
                    <strong style="color: #ffffff; font-weight: 700;">Undesens</strong> réunit des personnes aux parcours et aux aspirations multiples, animées par une même volonté : vivre des <strong style="color: #ffffff; font-weight: 700;">rencontres adultes</strong> libres, authentiques et respectueuses, au sein d'un cadre sécurisé et confidentiel.
                </p>
            </div>

            
            <h3 id="accordion-bdsm-toggle" style="color: #ffffff; margin: 15px 0 0 0; font-size: 1.15rem; font-weight: 600; letter-spacing: 0.3px; position: relative; text-align: left; cursor: pointer; user-select: none; padding: 18px 50px 18px 20px; background: rgba(255, 255, 255, 0.03); border-radius: 12px; border-left: 4px solid rgba(199, 31, 55, 0.7); transition: all 0.3s ease;" onclick="toggleAccordion('bdsm')" onmouseover="this.style.background='rgba(255, 255, 255, 0.05)'" onmouseout="this.style.background='rgba(255, 255, 255, 0.03)'">
                Comment explorer vos rencontres BDSM en toute confiance ?
                <span id="accordion-bdsm-icon" style="position: absolute; right: 20px; top: 50%; transform: translateY(-50%); font-size: 1.2rem; transition: transform 0.3s ease; color: rgba(199, 31, 55, 0.8);">▼</span>
            </h3>
            
            <div id="accordion-bdsm-content" style="overflow: hidden; max-height: 0px; transition: max-height 0.4s ease; padding: 0 20px;">
                <p style="margin-bottom: 25px; margin-top: 25px; color: rgba(255, 255, 255, 0.9); line-height: 2; font-size: 1.12rem; text-align: justify;">
                    L'univers du <strong style="color: #ffffff; font-weight: 700;">BDSM</strong> — regroupant le bondage, la discipline, la domination, la soumission et le sadomasochisme — recouvre un large éventail de pratiques fondées sur l'échange, le consentement éclairé et le respect mutuel. Ces expériences reposent sur une communication sincère entre partenaires et une confiance partagée, éléments essentiels à toute démarche responsable.
                </p>

                <p style="margin-bottom: 25px; color: rgba(255, 255, 255, 0.9); line-height: 2; font-size: 1.12rem; text-align: justify;">
                    <strong style="color: #ffffff; font-weight: 700;">Undesens</strong> propose un espace dédié aux <strong style="color: #ffffff; font-weight: 700;">rencontres BDSM</strong>, pensé pour permettre aux adultes consentants d'exprimer leurs désirs et d'explorer leurs fantasmes dans un cadre sécurisé et maîtrisé. La plateforme favorise les mises en relation entre profils partageant des affinités communes, en accord avec leurs envies et leurs limites.
                </p>

                <p style="margin-bottom: 25px; color: rgba(255, 255, 255, 0.9); line-height: 2; font-size: 1.12rem; text-align: justify;">
                    Grâce à des fonctionnalités communautaires avancées, notamment les groupes thématiques, il devient aisé de rejoindre des membres animés par les mêmes centres d'intérêt et de dialoguer autour de pratiques <strong style="color: #ffffff; font-weight: 700;">BDSM</strong> variées, dans un environnement bienveillant.
                </p>

                <p style="margin-bottom: 0; color: rgba(255, 255, 255, 0.9); line-height: 2; font-size: 1.12rem; text-align: justify;">
                    <strong style="color: #ffffff; font-weight: 700;">Undesens</strong> invite ainsi chacun à découvrir de nouvelles expériences, à son rythme, au sein d'une communauté respectueuse, confidentielle et engagée en faveur d'une sexualité libre, consciente et assumée.
                </p>
            </div>

            
            <h3 id="accordion-sm-toggle" style="color: #ffffff; margin: 15px 0 0 0; font-size: 1.15rem; font-weight: 600; letter-spacing: 0.3px; position: relative; text-align: left; cursor: pointer; user-select: none; padding: 18px 50px 18px 20px; background: rgba(255, 255, 255, 0.03); border-radius: 12px; border-left: 4px solid rgba(199, 31, 55, 0.7); transition: all 0.3s ease;" onclick="toggleAccordion('sm')" onmouseover="this.style.background='rgba(255, 255, 255, 0.05)'" onmouseout="this.style.background='rgba(255, 255, 255, 0.03)'">
                SM et BDSM c'est quoi ?
                <span id="accordion-sm-icon" style="position: absolute; right: 20px; top: 50%; transform: translateY(-50%); font-size: 1.2rem; transition: transform 0.3s ease; color: rgba(199, 31, 55, 0.8);">▼</span>
            </h3>
            
            <div id="accordion-sm-content" style="overflow: hidden; max-height: 0px; transition: max-height 0.4s ease; padding: 0 20px;">
                <p style="margin-bottom: 25px; margin-top: 25px; color: rgba(255, 255, 255, 0.9); line-height: 2; font-size: 1.12rem; text-align: justify;">
                    Le <strong style="color: #ffffff; font-weight: 700;">SM</strong> et le <strong style="color: #ffffff; font-weight: 700;">BDSM</strong> recouvrent des pratiques relationnelles et érotiques fondées sur des dynamiques de pouvoir, de contrainte et de consentement mutuel.
                </p>

                <p style="margin-bottom: 25px; color: rgba(255, 255, 255, 0.9); line-height: 2; font-size: 1.12rem; text-align: justify;">
                    Le <strong style="color: #ffffff; font-weight: 700;">sadomasochisme</strong> trouve son origine étymologique dans les noms du marquis de Sade, dont les écrits évoquent la jouissance liée à l'exercice de la cruauté, et de Leopold von Sacher-Masoch, auteur ayant exploré le plaisir associé à la soumission. Dans ce cadre, le masochisme renvoie à la recherche d'excitation par la souffrance ou l'humiliation subie, tandis que le sadisme se caractérise par le plaisir tiré de l'infliction de douleur ou de l'abaissement d'autrui. Ces interactions s'inscrivent toutefois dans un cadre strictement consenti, codifié et ritualisé, excluant toute violence non désirée.
                </p>

                <p style="margin-bottom: 25px; color: rgba(255, 255, 255, 0.9); line-height: 2; font-size: 1.12rem; text-align: justify;">
                    Le terme <strong style="color: #ffffff; font-weight: 700;">BDSM</strong> est un acronyme regroupant les notions de Bondage, Discipline, Domination, Soumission et Sadomasochisme. Il désigne un ensemble de pratiques reposant sur un accord explicite entre partenaires, intégrant la contrainte physique ou psychologique, la mise en scène de rôles, l'humiliation symbolique ou la douleur contrôlée à des fins érotiques. Ce champ englobe une grande diversité d'usages et d'accessoires, tels que les liens, les entraves, les instruments de correction ou les dispositifs scénographiques.
                </p>

                <p style="margin-bottom: 25px; color: rgba(255, 255, 255, 0.9); line-height: 2; font-size: 1.12rem; text-align: justify;">
                    Ces pratiques s'exercent le plus souvent dans le cadre de relations de couple ou de partenaires réguliers, selon des configurations variées de domination et de soumission, indépendamment du genre. On distingue communément le <strong style="color: #ffffff; font-weight: 700;">SM dit "soft"</strong>, centré sur des jeux de pouvoir, de service ou d'humiliation sans atteinte corporelle significative, et le <strong style="color: #ffffff; font-weight: 700;">SM dit "hard"</strong>, qui implique une dimension plus marquée de douleur physique, toujours encadrée par des règles précises.
                </p>

                <p style="margin-bottom: 0; color: rgba(255, 255, 255, 0.9); line-height: 2; font-size: 1.12rem; text-align: justify;">
                    Le <strong style="color: #ffffff; font-weight: 700;">SM</strong> et le <strong style="color: #ffffff; font-weight: 700;">BDSM</strong> occupent également une place notable dans la culture littéraire et cinématographique. De nombreuses œuvres intègrent ponctuellement ces thématiques à travers des scènes de fessée, de contrainte ou de domination, sans en faire nécessairement le sujet central. D'autres productions en font au contraire l'axe principal, mettant en parallèle l'intensité du lien affectif entre les protagonistes et ces formes particulières de relations, contribuant ainsi à nourrir l'imaginaire et les fantasmes associés à ces pratiques.
                </p>
            </div>

            
            <h3 id="accordion-inscription-toggle" style="color: #ffffff; margin: 15px 0 0 0; font-size: 1.15rem; font-weight: 600; letter-spacing: 0.3px; position: relative; text-align: left; cursor: pointer; user-select: none; padding: 18px 50px 18px 20px; background: rgba(255, 255, 255, 0.03); border-radius: 12px; border-left: 4px solid rgba(199, 31, 55, 0.7); transition: all 0.3s ease; word-wrap: break-word; overflow-wrap: break-word;" onclick="toggleAccordion('inscription')" onmouseover="this.style.background='rgba(255, 255, 255, 0.05)'" onmouseout="this.style.background='rgba(255, 255, 255, 0.03)'">
                Undesens est-il ouvert à tous les profils libertins ?
                <span id="accordion-inscription-icon" style="position: absolute; right: 20px; top: 50%; transform: translateY(-50%); font-size: 1.2rem; transition: transform 0.3s ease; color: rgba(199, 31, 55, 0.8);">▼</span>
            </h3>
            
            <div id="accordion-inscription-content" style="overflow: hidden; max-height: 0px; transition: max-height 0.4s ease; padding: 0 20px;">
                <p style="margin-bottom: 25px; margin-top: 25px; color: rgba(255, 255, 255, 0.9); line-height: 2; font-size: 1.12rem; text-align: justify;">
                    La plateforme s'adresse à l'ensemble des profils libertins, sans distinction : hommes, femmes, couples ou personnes seules, qu'ils soient néophytes ou expérimentés. Que votre démarche relève de la recherche de rencontres coquines, de l'exploration de fantasmes ou de relations plus immédiates comme de simples plans culs et assumées, chacun peut y trouver un espace d'expression libre et respectueux.
                </p>

                <p style="margin-bottom: 25px; color: rgba(255, 255, 255, 0.9); line-height: 2; font-size: 1.12rem; text-align: justify;">
                    Sur <strong style="color: #ffffff; font-weight: 700;">Undesens</strong>, aucune pratique n'est stigmatisée. Du libertinage traditionnel aux expériences plus affirmées telles que le <strong style="color: #ffffff; font-weight: 700;">dogging</strong>, le <strong style="color: #ffffff; font-weight: 700;">candaulisme</strong>, l'<strong style="color: #ffffff; font-weight: 700;">échangisme</strong>, l'<strong style="color: #ffffff; font-weight: 700;">exhibitionnisme</strong>, le <strong style="color: #ffffff; font-weight: 700;">voyeurisme</strong> ou encore le <strong style="color: #ffffff; font-weight: 700;">BDSM</strong>, la diversité des envies et des sensibilités est pleinement reconnue. Chaque parcours, chaque expérience, trouve ici sa légitimité.
                </p>

                <p style="margin-bottom: 0; color: rgba(255, 255, 255, 0.9); line-height: 2; font-size: 1.12rem; text-align: justify;">
                    L'intégration à la communauté se fait en toute simplicité : une inscription en ligne, sa validation, puis l'accès aux profils et aux premiers échanges.
                </p>
            </div>

            
            <h3 id="accordion-gratuit-toggle" style="color: #ffffff; margin: 15px 0 0 0; font-size: 1.15rem; font-weight: 600; letter-spacing: 0.3px; position: relative; text-align: left; cursor: pointer; user-select: none; padding: 18px 50px 18px 20px; background: rgba(255, 255, 255, 0.03); border-radius: 12px; border-left: 4px solid rgba(199, 31, 55, 0.7); transition: all 0.3s ease;" onclick="toggleAccordion('gratuit')" onmouseover="this.style.background='rgba(255, 255, 255, 0.05)'" onmouseout="this.style.background='rgba(255, 255, 255, 0.03)'">
                Le site Undesens.com est-il gratuit ?
                <span id="accordion-gratuit-icon" style="position: absolute; right: 20px; top: 50%; transform: translateY(-50%); font-size: 1.2rem; transition: transform 0.3s ease; color: rgba(199, 31, 55, 0.8);">▼</span>
            </h3>
            
            <div id="accordion-gratuit-content" style="overflow: hidden; max-height: 0px; transition: max-height 0.4s ease; padding: 0 20px;">
                <p style="margin-bottom: 0; margin-top: 25px; color: rgba(255, 255, 255, 0.9); line-height: 2; font-size: 1.12rem; text-align: justify;">
                    <strong style="color: #ffffff; font-weight: 700;">OUI !</strong> Undesens est entièrement gratuit. Nous sommes convaincus que l'accès à une communauté libertine & BDSM de qualité doit être accessible à tous, sans frais. Vous pouvez vous inscrire, créer votre profil, rechercher des partenaires et échanger librement sans payer un centime.
                </p>
            </div>

            
            <h3 id="accordion-inscrire-toggle" style="color: #ffffff; margin: 15px 0 0 0; font-size: 1.15rem; font-weight: 600; letter-spacing: 0.3px; position: relative; text-align: left; cursor: pointer; user-select: none; padding: 18px 50px 18px 20px; background: rgba(255, 255, 255, 0.03); border-radius: 12px; border-left: 4px solid rgba(199, 31, 55, 0.7); transition: all 0.3s ease;" onclick="toggleAccordion('inscrire')" onmouseover="this.style.background='rgba(255, 255, 255, 0.05)'" onmouseout="this.style.background='rgba(255, 255, 255, 0.03)'">
                Qui peut s'inscrire sur le site ?
                <span id="accordion-inscrire-icon" style="position: absolute; right: 20px; top: 50%; transform: translateY(-50%); font-size: 1.2rem; transition: transform 0.3s ease; color: rgba(199, 31, 55, 0.8);">▼</span>
            </h3>
            
            <div id="accordion-inscrire-content" style="overflow: hidden; max-height: 0px; transition: max-height 0.4s ease; padding: 0 20px;">
                <p style="margin-bottom: 0; margin-top: 25px; color: rgba(255, 255, 255, 0.9); line-height: 2; font-size: 1.12rem; text-align: justify;">
                    L'inscription est strictement réservée aux personnes majeures (18+). Le site accueille tous les profils : dominants, dominatrices, soumis, soumises, switches, et couples libertins. Que vous soyez débutant ou expérimenté dans les pratiques libertines & BDSM, vous êtes les bienvenus.
                </p>
            </div>

            
            <h3 id="accordion-candaulisme-toggle" style="color: #ffffff; margin: 15px 0 0 0; font-size: 1.15rem; font-weight: 600; letter-spacing: 0.3px; position: relative; text-align: left; cursor: pointer; user-select: none; padding: 18px 50px 18px 20px; background: rgba(255, 255, 255, 0.03); border-radius: 12px; border-left: 4px solid rgba(199, 31, 55, 0.7); transition: all 0.3s ease;" onclick="toggleAccordion('candaulisme')" onmouseover="this.style.background='rgba(255, 255, 255, 0.05)'" onmouseout="this.style.background='rgba(255, 255, 255, 0.03)'">
                Le candaulisme : repères essentiels et modalités d'initiation
                <span id="accordion-candaulisme-icon" style="position: absolute; right: 20px; top: 50%; transform: translateY(-50%); font-size: 1.2rem; transition: transform 0.3s ease; color: rgba(199, 31, 55, 0.8);">▼</span>
            </h3>
            
            <div id="accordion-candaulisme-content" style="overflow: hidden; max-height: 0px; transition: max-height 0.4s ease; padding: 0 20px;">
                <p style="margin-bottom: 25px; margin-top: 25px; color: rgba(255, 255, 255, 0.9); line-height: 2; font-size: 1.12rem; text-align: justify;">
                    Le <strong style="color: #ffffff; font-weight: 700;">candaulisme</strong> désigne une pratique relationnelle et intime fondée sur un consentement explicite et partagé au sein du couple. Cette pratique consiste à permettre à son ou sa partenaire de vivre une expérience avec une tierce personne, tandis que l'autre conjoint, en qualité d'observateur consentant ou de participant indirect, y trouve une source de stimulation et d'épanouissement personnel.
                </p>

                <p style="margin-bottom: 25px; color: rgba(255, 255, 255, 0.9); line-height: 2; font-size: 1.12rem; text-align: justify;">
                    À l'opposé du modèle exclusif traditionnel, cette approche valorise la confiance mutuelle, la communication et l'attention portée au plaisir de l'autre. Les conditions de l'expérience sont librement définies par le couple, qu'il s'agisse d'une présence assumée, d'une mise en scène partagée ou d'une simple connaissance de la relation, dans le respect strict des limites établies en amont.
                </p>

                <p style="margin-bottom: 25px; color: rgba(255, 255, 255, 0.9); line-height: 2; font-size: 1.12rem; text-align: justify;">
                    Aujourd'hui, des plateformes spécialisées offrent un environnement adapté pour découvrir ou approfondir cette pratique. Elles favorisent les échanges entre personnes partageant une vision ouverte et assumée de la sexualité, reposant sur le respect, le dialogue et la recherche d'un plaisir réciproque.
                </p>

                <p style="margin-bottom: 25px; color: rgba(255, 255, 255, 0.9); line-height: 2; font-size: 1.12rem; text-align: justify;">
                    S'initier au <strong style="color: #ffffff; font-weight: 700;">candaulisme</strong> ne suppose aucune démarche complexe. La création d'un profil constitue la première étape, suivie par la découverte de la communauté, les échanges via les espaces de discussion et les conversations avec des couples déjà engagés dans cette dynamique. Ces interactions permettent de mieux comprendre les attentes, les équilibres relationnels et la richesse émotionnelle propres à cette pratique.
                </p>

                <p style="margin-bottom: 25px; color: rgba(255, 255, 255, 0.9); line-height: 2; font-size: 1.12rem; text-align: justify;">
                    Dans cet espace d'expression libre et bienveillant, libertins, couples complices et personnes curieuses d'explorer une sexualité consentie se retrouvent autour d'un intérêt commun pour le fantasme du partenaire offert, dans un climat d'ouverture et sans jugement.
                </p>

                <p style="margin-bottom: 0; color: rgba(255, 255, 255, 0.9); line-height: 2; font-size: 1.12rem; text-align: justify;">
                    Il convient toutefois de souligner que les rencontres de nature candauliste ne relèvent pas du simple hasard. Elles impliquent une démarche active, fondée sur la recherche de personnes partageant les mêmes envies et la même conception de l'intimité. Selon les affinités et les fantasmes de chacun, différentes déclinaisons peuvent être envisagées, telles que le <strong style="color: #ffffff; font-weight: 700;">candaulisme féminin</strong> ou <strong style="color: #ffffff; font-weight: 700;">inversé</strong>. Qu'il s'agisse de naturistes, de libertins confirmés ou de simples curieux en quête de nouvelles expériences, l'ouverture d'esprit demeure la clé d'un épanouissement partagé et assumé.
                </p>
            </div>

            
            <h3 id="accordion-forum-toggle" style="color: #ffffff; margin: 15px 0 0 0; font-size: 1.15rem; font-weight: 600; letter-spacing: 0.3px; position: relative; text-align: left; cursor: pointer; user-select: none; padding: 18px 50px 18px 20px; background: rgba(255, 255, 255, 0.03); border-radius: 12px; border-left: 4px solid rgba(199, 31, 55, 0.7); transition: all 0.3s ease;" onclick="toggleAccordion('forum')" onmouseover="this.style.background='rgba(255, 255, 255, 0.05)'" onmouseout="this.style.background='rgba(255, 255, 255, 0.03)'">
                Undesens.com dispose-t-il de forums et d'espaces d'échanges ?
                <span id="accordion-forum-icon" style="position: absolute; right: 20px; top: 50%; transform: translateY(-50%); font-size: 1.2rem; transition: transform 0.3s ease; color: rgba(199, 31, 55, 0.8);">▼</span>
            </h3>
            
            <div id="accordion-forum-content" style="overflow: hidden; max-height: 0px; transition: max-height 0.4s ease; padding: 0 20px;">
                <p style="margin-bottom: 0; margin-top: 25px; color: rgba(255, 255, 255, 0.9); line-height: 2; font-size: 1.12rem; text-align: justify;">
                    Oui, vous retrouverez sur <a href="https://www.undesens.com/forum" style="color: #c71f37; text-decoration: none; font-weight: 700;">https://www.undesens.com/forum</a> nos forums de partages et d'échanges sur le <strong style="color: #ffffff; font-weight: 700;">libertinage</strong>, vos <strong style="color: #ffffff; font-weight: 700;">aventures libertines</strong>, vos <strong style="color: #ffffff; font-weight: 700;">fantasmes</strong>, le <strong style="color: #ffffff; font-weight: 700;">BDSM</strong>, vos <strong style="color: #ffffff; font-weight: 700;">photos coquines</strong>, les <strong style="color: #ffffff; font-weight: 700;">lieux d'exhibition</strong>, les <strong style="color: #ffffff; font-weight: 700;">clubs libertins</strong>.
                </p>
            </div>
        </div>
    </div>
</section>

<script nonce="qKGOSe6Cin52IeyjbMGydw">
function toggleAccordion(section) {
    const sections = ['libertin', 'bdsm', 'sm', 'inscription', 'candaulisme', 'forum'];
    
    // Fermer tous les autres accordéons
    sections.forEach(function(s) {
        if (s !== section) {
            const otherContent = document.getElementById('accordion-' + s + '-content');
            const otherIcon = document.getElementById('accordion-' + s + '-icon');
            if (otherContent && otherIcon) {
                otherContent.style.maxHeight = '0px';
                otherIcon.style.transform = 'translateY(-50%) rotate(0deg)';
            }
        }
    });
    
    const content = document.getElementById('accordion-' + section + '-content');
    const icon = document.getElementById('accordion-' + section + '-icon');
    
    if (content.style.maxHeight === '0px') {
        // Ouvrir
        let maxHeight = '1000px';
        if (section === 'libertin') maxHeight = '1500px';
        if (section === 'sm') maxHeight = '1800px';
        content.style.maxHeight = maxHeight;
        icon.style.transform = 'translateY(-50%) rotate(180deg)';
    } else {
        // Fermer
        content.style.maxHeight = '0px';
        icon.style.transform = 'translateY(-50%) rotate(0deg)';
    }
}
</script>

<style>
    /* Optimisations mobile modernes pour la FAQ */
    @media (max-width: 768px) {
        .faq-icon-desktop {
            display: none !important;
        }
        
        /* Container mobile optimisé */
        .faq-section .container {
            padding: 0 15px !important;
        }
        
        .faq-section .container > div {
            margin: 20px auto !important;
            padding: 20px 15px !important;
            border-radius: 15px !important;
            background: linear-gradient(135deg, rgba(255, 255, 255, 0.03) 0%, rgba(255, 255, 255, 0.01) 100%) !important;
            box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3) !important;
        }
        
        /* Titres FAQ modernes sur mobile */
        .faq-section h3[id*="accordion"] {
            font-size: 1.05rem !important;
            font-weight: 600 !important;
            text-align: left !important;
            margin-top: 0 !important;
            padding: 15px 40px 15px 15px !important;
            background: rgba(255, 255, 255, 0.03) !important;
            border-radius: 10px !important;
            border-left: 3px solid rgba(199, 31, 55, 0.6) !important;
            transition: all 0.3s ease !important;
            line-height: 1.4 !important;
        }
        
        .faq-section h3[id*="accordion"]:not(:first-child) {
            margin-top: 12px !important;
        }
        
        .faq-section h3[id*="accordion"]:active {
            background: rgba(255, 255, 255, 0.05) !important;
            transform: scale(0.98);
        }
        
        /* Icônes accordéon sur mobile */
        .faq-section h3[id*="accordion"] span {
            font-size: 1.2rem !important;
            right: 15px !important;
            color: rgba(199, 31, 55, 0.8) !important;
        }
        
        /* Contenu FAQ sur mobile */
        .faq-section div[id*="accordion-"][id$="-content"] {
            padding: 0 15px !important;
        }
        
        .faq-section div[id*="accordion-"][id$="-content"] p {
            font-size: 0.95rem !important;
            line-height: 1.6 !important;
            margin-top: 15px !important;
            margin-bottom: 15px !important;
            text-align: left !important;
        }
    }
    
    /* Tablettes */
    @media (min-width: 769px) and (max-width: 1024px) {
        .faq-section .container > div {
            padding: 35px 25px !important;
        }
        
        .faq-section h3[id*="accordion"] {
            font-size: 1.1rem !important;
            padding-left: 80px !important;
        }
    }
</style>

<!-- =============================================
     CTA FINAL
     ============================================= -->
<section class="h2-cta">
    <div class="h2-cta-inner">
        <h2>Prêt à franchir le pas&nbsp;?</h2>
        <p>Rejoignez des milliers de membres qui vivent déjà leurs désirs en toute liberté. Inscription gratuite, sans carte bancaire.</p>
        <a href="/inscription" class="h2-btn-primary" title="Inscription gratuite Undesens" style="font-size:1.05rem;padding:1.1rem 2.8rem;">
            <svg width="18" height="18" fill="none" stroke="currentColor" stroke-width="2.5" viewbox="0 0 24 24"><path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><line x1="19" y1="8" x2="19" y2="14"/><line x1="22" y1="11" x2="16" y2="11"/></svg>
            Inscription gratuite
        </a>
    </div>
</section>

<!-- =============================================
     RÉSEAUX SOCIAUX
     ============================================= -->
<div class="h2-social">
    <span style="color:var(--muted);font-size:.82rem;letter-spacing:.05em;margin-right:.5rem;">Suivez-nous :</span>

    <a href="https://www.facebook.com/profile.php?id=61586970771581" target="_blank" rel="noopener noreferrer" class="h2-social-link" title="Undesens sur Facebook">
        <svg width="18" height="18" viewbox="0 0 24 24" fill="currentColor"><path d="M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z"/></svg>
        Facebook
    </a>

    <a href="https://x.com/undesens" target="_blank" rel="noopener noreferrer" class="h2-social-link" title="Undesens sur X (Twitter)">
        <svg width="18" height="18" viewbox="0 0 24 24" fill="currentColor"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"/></svg>
        @undesens
    </a>

    <a href="https://www.youtube.com/@undesens" target="_blank" rel="noopener noreferrer" class="h2-social-link" title="Undesens sur YouTube">
        <svg width="18" height="18" viewbox="0 0 24 24" fill="currentColor"><path d="M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z"/></svg>
        YouTube
    </a>
</div>
    </main>

    
    <!-- Footer -->
        <footer id="site-footer" style="background: var(--bg-secondary); border-top: 1px solid var(--border-color); padding: 3rem 0 2rem; margin-top: 4rem;">
        <div class="container">
            <div class="footer-grid" style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 3rem; margin-bottom: 2rem;">
                <div>
                    <h4 style="color: var(--primary-color); margin-bottom: 1rem; font-size: 1.25rem;">🔗 <a href="https://www.undesens.com" style="color: var(--primary-color); text-decoration: none;">Undesens.com</a></h4>
                    <p style="color: var(--text-muted); font-size: 0.938rem; line-height: 1.6;">
                        La plateforme exclusive pour du libertinage & BDSM authentique, débridé et respectueux.
                        Confidentialité, sécurité et discrétion garanties.
                    </p>
                </div>
                <div>
                    <h5 style="margin-bottom: 1rem;">Découvrir</h5>
                    <ul style="list-style: none;">
                        <li style="margin-bottom: 0.5rem;"><a href="/a-propos" style="color: var(--text-secondary);">À propos</a></li>
                        <li style="margin-bottom: 0.5rem;"><a href="/comment-ca-marche" style="color: var(--text-secondary);">Comment ça marche</a></li>
                        <li style="margin-bottom: 0.5rem;"><a href="/confidentialite" style="color: var(--text-secondary);">Sécurité & Confidentialité</a></li>
                    </ul>
                </div>
                <div>
                    <h5 style="margin-bottom: 1rem;">Légal</h5>
                    <ul style="list-style: none;">
                        <li style="margin-bottom: 0.5rem;"><a href="/conditions-utilisation" style="color: var(--text-secondary);">Conditions d'utilisation</a></li>
                        <li style="margin-bottom: 0.5rem;"><a href="/confidentialite" style="color: var(--text-secondary);">Politique de confidentialité</a></li>
                        <li style="margin-bottom: 0.5rem;"><a href="/cookies" style="color: var(--text-secondary);">Gestion des cookies</a></li>
                        <li style="margin-bottom: 0.5rem;"><a href="/charte" style="color: var(--text-secondary);">Charte de la communauté</a></li>
                    </ul>
                </div>
                <div>
                    <h5 style="margin-bottom: 1rem;">Support</h5>
                    <ul style="list-style: none;">
                        <li style="margin-bottom: 0.5rem;"><a href="/contact" style="color: var(--text-secondary);">Contact</a></li>
                        <li style="margin-bottom: 0.5rem;"><a href="/questions-frequentes" style="color: var(--text-secondary);">FAQ</a></li>
                        <li style="margin-bottom: 0.5rem;"><a href="/aide" style="color: var(--text-secondary);">Centre d'aide</a></li>
                    </ul>
                </div>
            </div>
            <div style="text-align: center; padding-top: 2rem; border-top: 1px solid var(--divider);">
                <p style="color: var(--text-muted); font-size: 0.875rem;">
                    &copy; 2026 Undesens.com. Tous droits réservés.
                    <span style="color: var(--primary-color);">❤️</span>
                    Pour une communauté respectueuse et consentante.
                </p>
            </div>
        </div>
    </footer>
    
    
    <!-- JavaScript de base pour tous (defer pour ne pas bloquer le rendu) -->
        <script src="/assets/js/app.min.js?v=1772401004" defer></script>
    
    
    <!-- Chargement des polices Google avec font-display:swap pour éviter le FOUT -->
    <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Montserrat:wght@300;400;500;600;700;800;900&family=Poppins:wght@300;400;500;600;700;800&display=swap">

    <!-- Capture des erreurs JavaScript pour logging côté serveur -->
    <script nonce="qKGOSe6Cin52IeyjbMGydw">
        // Capturer les erreurs JavaScript globales
        window.addEventListener('error', function(event) {
            // Ignorer les erreurs GTM Service Worker
            const msg = event.message || event.error?.message || '';
            const url = event.filename || '';
            if (msg.includes('service_worker') || msg.includes('sw.js') || url.includes('googletagmanager.com/static/service_worker')) {
                return;
            }
            
            fetch('/log-js-error', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                },
                body: JSON.stringify({
                    type: 'JavaScript Error',
                    message: event.message || event.error?.message || 'Unknown error',
                    url: event.filename || window.location.href,
                    line: event.lineno || 0,
                    col: event.colno || 0,
                    stack: event.error?.stack || 'No stack trace'
                })
            }).catch(() => {}); // Ignorer les erreurs de logging
        }, true);

        // Capturer les erreurs de chargement de ressources
        window.addEventListener('error', function(event) {
            if (event.target !== window && (event.target.tagName === 'SCRIPT' || event.target.tagName === 'LINK')) {
                const src = event.target.src || event.target.href || '';
                // Ignorer les erreurs GTM Service Worker
                if (src.includes('service_worker') || src.includes('sw.js') || src.includes('googletagmanager.com/static/service_worker')) {
                    return;
                }
                
                fetch('/log-js-error', {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json',
                    },
                    body: JSON.stringify({
                        type: 'Resource Loading Error',
                        message: 'Failed to load: ' + (event.target.src || event.target.href),
                        url: window.location.href,
                        line: 0,
                        col: 0
                    })
                }).catch(() => {});
            }
        }, true);

        // Capturer les promesses rejetées non gérées
        window.addEventListener('unhandledrejection', function(event) {
            // Ignorer les erreurs GTM Service Worker
            const reason = event.reason?.message || event.reason || '';
            if (typeof reason === 'string' && (reason.includes('service_worker') || reason.includes('sw.js') || reason.includes('googletagmanager'))) {
                return;
            }
            
            fetch('/log-js-error', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                },
                body: JSON.stringify({
                    type: 'Unhandled Promise Rejection',
                    message: event.reason?.message || event.reason || 'Promise rejected',
                    url: window.location.href,
                    line: 0,
                    col: 0
                })
            }).catch(() => {});
        });
    </script>

<!-- Script pour la gestion des disponibilités hebdomadaires -->
<script nonce="qKGOSe6Cin52IeyjbMGydw">
// Variables globales pour la gestion du modal
let availabilityCurrentDate = null;
let availabilityCurrentDayIndex = 0;
let availabilityWeekData = {};
let availabilityUserDesires = [];
let availabilityAutoSaveTimeout = null;
let availabilityIsSaving = false;

// Ouvrir le modal
function openAvailabilityModal() {
    const modal = document.getElementById('availability-modal');
    modal.style.display = 'flex';
    document.body.style.overflow = 'hidden';
    
    // Initialiser la semaine
    initializeWeekDates();
    
    // Charger les envies de l'utilisateur
    loadUserDesires();
    
    // Charger les disponibilités sauvegardées
    loadWeekAvailability();
}

// Fermer le modal
function closeAvailabilityModal() {
    const modal = document.getElementById('availability-modal');
    modal.style.display = 'none';
    document.body.style.overflow = '';
}

// Initialiser les dates de la semaine à partir d'aujourd'hui
function initializeWeekDates() {
    const today = new Date();
    const dayTabs = document.querySelectorAll('.availability-day-tab');
    
    // Commencer à partir d'aujourd'hui
    const startDate = new Date(today);
    
    // Noms des jours de la semaine (format court)
    const dayNames = ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'];
    
    // Remplir les dates pour chaque jour (à partir d'aujourd'hui pour 7 jours)
    dayTabs.forEach((tab, index) => {
        const date = new Date(startDate);
        date.setDate(startDate.getDate() + index);
        
        const dayNumber = date.getDate();
        const dayOfWeek = date.getDay(); // 0 = Dimanche, 1 = Lundi, etc.
        const dayName = dayNames[dayOfWeek];
        const formattedDate = formatDate(date);
        
        tab.setAttribute('data-date', formattedDate);
        tab.setAttribute('data-day', dayName);
        tab.querySelector('.day-name').textContent = dayName;
        tab.querySelector('.day-number').textContent = dayNumber;
        
        // Gestionnaire de clic pour changer de jour
        tab.onclick = () => selectDay(index, formattedDate);
    });
    
    // Sélectionner le premier jour par défaut (aujourd'hui)
    const firstDate = dayTabs[0].getAttribute('data-date');
    selectDay(0, firstDate);
}

// Sélectionner un jour
function selectDay(index, date) {
    availabilityCurrentDayIndex = index;
    availabilityCurrentDate = date;
    
    // Mettre à jour l'interface
    document.querySelectorAll('.availability-day-tab').forEach((tab, i) => {
        tab.classList.toggle('active', i === index);
    });
    
    // Charger les données sauvegardées pour ce jour
    loadDayData(date);
}

// Charger les envies de l'utilisateur
async function loadUserDesires() {
    try {
        const response = await fetch('/api/availability/user-desires');
        const data = await response.json();
        
        if (data.success) {
            availabilityUserDesires = data.desires || [];
            renderDesires();
        }
    } catch (error) {
        console.error('Erreur lors du chargement des envies:', error);
    }
}

// Afficher les envies
function renderDesires() {
    const container = document.getElementById('availability-desires-container');
    
    if (availabilityUserDesires.length === 0) {
        container.innerHTML = '<p class="availability-no-desires">Aucune envie configurée. <a href="/profile/edit#tab-practices">Configurer mes envies</a></p>';
        return;
    }
    
    container.innerHTML = availabilityUserDesires.map(desire => `
        <label class="availability-desire-pill">
            <input type="checkbox" name="desire" value="${desire}" checked>
            <span class="desire-label">${desire}</span>
        </label>
    `).join('');
    
    // Ajouter les écouteurs pour l'auto-save
    setupAutoSaveListeners();
}

// Charger les disponibilités de la semaine
async function loadWeekAvailability() {
    try {
        const response = await fetch('/api/availability/week');
        const data = await response.json();
        
        if (data.success) {
            // Stocker les données par date
            data.data.forEach(item => {
                availabilityWeekData[item.day_date] = {
                    time_slots: item.time_slots || [],
                    desires_ids: item.desires_ids || []
                };
            });
            
            // Recharger le jour actuel
            if (availabilityCurrentDate) {
                loadDayData(availabilityCurrentDate);
            }
        }
    } catch (error) {
        console.error('Erreur lors du chargement des disponibilités:', error);
    }
}

// Charger les données d'un jour spécifique
function loadDayData(date) {
    const dayData = availabilityWeekData[date];
    
    if (dayData) {
        // Cocher les créneaux horaires
        const timeSlots = dayData.time_slots || [];
        document.querySelectorAll('input[name="timeslot"]').forEach(checkbox => {
            checkbox.checked = timeSlots.includes(checkbox.value);
        });
        
        // Cocher les envies
        const desiresIds = dayData.desires_ids || [];
        document.querySelectorAll('input[name="desire"]').forEach(checkbox => {
            checkbox.checked = desiresIds.includes(checkbox.value);
        });
    } else {
        // Réinitialiser tout
        document.querySelectorAll('input[name="timeslot"]').forEach(checkbox => {
            checkbox.checked = false;
        });
        
        // Cocher toutes les envies par défaut
        document.querySelectorAll('input[name="desire"]').forEach(checkbox => {
            checkbox.checked = true;
        });
    }
    
    // Masquer le message d'avertissement lors du changement de jour
    const warningDiv = document.querySelector('.availability-warning-message');
    if (warningDiv) {
        warningDiv.style.display = 'none';
    }
    
    // Re-configurer les écouteurs d'événements pour l'auto-save
    setupAutoSaveListeners();
}

// Sauvegarder la disponibilité du jour actuel
async function saveCurrentDayAvailability(silent = false) {
    // Éviter les sauvegardes simultanées
    if (availabilityIsSaving) {
        return;
    }
    
    // Récupérer les créneaux sélectionnés
    const timeSlots = [];
    document.querySelectorAll('input[name="timeslot"]:checked').forEach(checkbox => {
        timeSlots.push(checkbox.value);
    });
    
    // Récupérer les envies sélectionnées
    const desiresIds = [];
    document.querySelectorAll('input[name="desire"]:checked').forEach(checkbox => {
        desiresIds.push(checkbox.value);
    });
    
    // Si toutes les cases sont décochées, supprimer la disponibilité de cette journée
    if (timeSlots.length === 0 || desiresIds.length === 0) {
        // Vérifier s'il y avait des données enregistrées pour ce jour
        const hadData = availabilityWeekData[availabilityCurrentDate] !== undefined;
        
        if (hadData) {
            // Supprimer silencieusement la disponibilité
            availabilityIsSaving = true;
            if (!silent) {
                showSavingIndicator();
            }
            
            try {
                const response = await fetch('/api/availability/delete', {
                    method: 'DELETE',
                    headers: {
                        'Content-Type': 'application/json',
                        'X-CSRF-Token': document.querySelector('meta[name="csrf-token"]')?.content ?? ''
                    },
                    body: JSON.stringify({
                        date: availabilityCurrentDate
                    })
                });
                
                const data = await response.json();
                
                if (data.success) {
                    // Supprimer du cache local
                    delete availabilityWeekData[availabilityCurrentDate];
                    
                    // Feedback visuel
                    showSavedIndicator();
                } else {
                    console.error('Erreur de suppression:', data.message);
                    hideSavingIndicator();
                    if (!silent) {
                        alert('Erreur: ' + (data.message || 'Impossible de supprimer'));
                    }
                }
            } catch (error) {
                console.error('Erreur lors de la suppression:', error);
                hideSavingIndicator();
                if (!silent) {
                    alert('Erreur lors de la suppression.');
                }
            } finally {
                availabilityIsSaving = false;
            }
        }
        // Si pas de données enregistrées, ne rien faire (silencieux)
        return;
    }
    
    availabilityIsSaving = true;
    if (!silent) {
        showSavingIndicator();
    }
    
    try {
        console.log('Sauvegarde des données:', {
            date: availabilityCurrentDate,
            time_slots: timeSlots,
            desires_ids: desiresIds
        });
        
        const response = await fetch('/api/availability/save', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'X-CSRF-Token': document.querySelector('meta[name="csrf-token"]')?.content ?? ''
            },
            body: JSON.stringify({
                date: availabilityCurrentDate,
                time_slots: timeSlots,
                desires_ids: desiresIds
            })
        });
        
        console.log('Réponse HTTP:', response.status);
        
        const data = await response.json();
        console.log('Données reçues:', data);
        
        if (data.success) {
            // Sauvegarder dans le cache local
            availabilityWeekData[availabilityCurrentDate] = {
                time_slots: timeSlots,
                desires_ids: desiresIds
            };
            
            // Feedback visuel
            showSavedIndicator();
        } else {
            console.error('Erreur de sauvegarde:', data.message);
            hideSavingIndicator();
            if (!silent) {
                alert('Erreur: ' + (data.message || 'Impossible de sauvegarder'));
            }
        }
    } catch (error) {
        console.error('Erreur lors de la sauvegarde:', error);
        hideSavingIndicator();
        if (!silent) {
            alert('Erreur lors de la sauvegarde. Vérifiez la console pour plus de détails.');
        }
    } finally {
        availabilityIsSaving = false;
    }
}

// Supprimer la disponibilité du jour actuel
async function deleteCurrentDayAvailability() {
    if (!confirm('Voulez-vous vraiment supprimer vos disponibilités pour ce jour ?')) {
        return;
    }
    
    try {
        const response = await fetch('/api/availability/delete', {
            method: 'DELETE',
            headers: {
                'Content-Type': 'application/json',
                'X-CSRF-Token': document.querySelector('meta[name="csrf-token"]')?.content ?? ''
            },
            body: JSON.stringify({
                date: availabilityCurrentDate
            })
        });
        
        const data = await response.json();
        
        if (data.success) {
            // Supprimer du cache local
            delete availabilityWeekData[availabilityCurrentDate];
            
            // Réinitialiser l'interface
            loadDayData(availabilityCurrentDate);
            
            // Feedback
            alert('Disponibilité supprimée');
        }
    } catch (error) {
        console.error('Erreur lors de la suppression:', error);
        alert('Erreur lors de la suppression');
    }
}

// Afficher/masquer l'indicateur de sauvegarde
function showSavingIndicator() {
    const indicator = document.getElementById('availability-save-indicator');
    const text = document.getElementById('availability-save-text');
    if (indicator && text) {
        indicator.style.display = 'flex';
        text.textContent = 'Sauvegarde...';
        text.style.color = 'rgba(255, 255, 255, 0.7)';
    }
}

function showSavedIndicator() {
    const indicator = document.getElementById('availability-save-indicator');
    const text = document.getElementById('availability-save-text');
    if (indicator && text) {
        indicator.style.display = 'flex';
        text.textContent = '✓ Sauvegardé';
        text.style.color = '#00d9a8';
        
        // Animation sur l'onglet du jour
        const dayTab = document.querySelectorAll('.availability-day-tab')[availabilityCurrentDayIndex];
        dayTab.classList.add('saved');
        
        // Masquer après 2 secondes
        setTimeout(() => {
            indicator.style.display = 'none';
            dayTab.classList.remove('saved');
        }, 2000);
    }
}

function hideSavingIndicator() {
    const indicator = document.getElementById('availability-save-indicator');
    if (indicator) {
        indicator.style.display = 'none';
    }
}

// Afficher un message de succès (legacy)
function showAvailabilitySaveSuccess() {
    showSavedIndicator();
}

// Configurer les écouteurs pour l'auto-save
function setupAutoSaveListeners() {
    // Créneaux horaires
    document.querySelectorAll('input[name="timeslot"]').forEach(checkbox => {
        checkbox.removeEventListener('change', triggerAutoSave); // Éviter les doublons
        checkbox.addEventListener('change', triggerAutoSave);
    });
    
    // Envies - avec vérification qu'une disponibilité est sélectionnée
    document.querySelectorAll('input[name="desire"]').forEach(checkbox => {
        checkbox.removeEventListener('change', handleDesireChange);
        checkbox.addEventListener('change', handleDesireChange);
    });
}

// Gérer le changement d'une envie
function handleDesireChange(event) {
    console.log('handleDesireChange appelé');
    const hasTimeSlotSelected = Array.from(document.querySelectorAll('input[name="timeslot"]')).some(cb => cb.checked);
    console.log('Créneau sélectionné:', hasTimeSlotSelected);
    
    if (!hasTimeSlotSelected) {
        console.log('Aucun créneau sélectionné, affichage du message');
        // Annuler le changement
        event.target.checked = !event.target.checked;
        
        // Afficher le message d'avertissement
        const warningDiv = document.querySelector('.availability-warning-message');
        if (warningDiv) {
            warningDiv.style.display = 'block';
            warningDiv.classList.add('shake-animation');
            
            setTimeout(() => {
                warningDiv.classList.remove('shake-animation');
            }, 500);
        }
        
        return;
    }
    
    // Si un créneau est sélectionné, masquer le message si présent
    const warningDiv = document.querySelector('.availability-warning-message');
    if (warningDiv) {
        warningDiv.style.display = 'none';
    }
    
    // Continuer avec l'auto-save normale
    triggerAutoSave();
}

// Déclencher l'auto-save avec debounce
function triggerAutoSave() {
    // Masquer le message d'avertissement si présent (car un créneau a été sélectionné)
    const warningDiv = document.querySelector('.availability-warning-message');
    if (warningDiv) {
        warningDiv.style.display = 'none';
    }
    
    // Annuler le timeout précédent
    if (availabilityAutoSaveTimeout) {
        clearTimeout(availabilityAutoSaveTimeout);
    }
    
    // Afficher immédiatement l'indicateur
    showSavingIndicator();
    
    // Sauvegarder après 800ms d'inactivité
    availabilityAutoSaveTimeout = setTimeout(() => {
        saveCurrentDayAvailability(true); // Mode silencieux
    }, 800);
}

// Gérer la checkbox "Toute la journée"
document.addEventListener('DOMContentLoaded', function() {
    const allDayCheckbox = document.getElementById('timeslot-all-day');
    
    if (allDayCheckbox) {
        allDayCheckbox.addEventListener('change', function() {
            const individualCheckboxes = document.querySelectorAll('.availability-timeslots-individual input[name="timeslot"]');
            
            if (this.checked) {
                // Décocher tous les créneaux individuels
                individualCheckboxes.forEach(cb => {
                    cb.checked = false;
                    cb.disabled = true;
                });
            } else {
                // Réactiver les créneaux individuels
                individualCheckboxes.forEach(cb => {
                    cb.disabled = false;
                });
            }
            
            // Déclencher l'auto-save
            triggerAutoSave();
        });
    }
    
    // Gérer les checkboxes individuelles
    document.querySelectorAll('.availability-timeslots-individual input[name="timeslot"]').forEach(checkbox => {
        checkbox.addEventListener('change', function() {
            if (this.checked) {
                // Décocher "Toute la journée"
                if (allDayCheckbox) allDayCheckbox.checked = false;
            }
        });
    });
});

// Formater une date au format Y-m-d
function formatDate(date) {
    const year = date.getFullYear();
    const month = String(date.getMonth() + 1).padStart(2, '0');
    const day = String(date.getDate()).padStart(2, '0');
    return `${year}-${month}-${day}`;
}

// Fermer le modal en cliquant sur l'overlay
document.addEventListener('click', function(e) {
    const modal = document.getElementById('availability-modal');
    if (e.target === modal) {
        closeAvailabilityModal();
    }
});
</script>

<!-- Google Tag Manager (chargé après window.load) -->
<script nonce="qKGOSe6Cin52IeyjbMGydw">
window.addEventListener('load', function() {
    (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
    new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
    j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
    'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
    })(window,document,'script','dataLayer','GTM-N9DXJP4R');
});
</script>

<!-- Enregistrement du Service Worker pour PWA -->
<script nonce="qKGOSe6Cin52IeyjbMGydw">
if ('serviceWorker' in navigator) {
    window.addEventListener('load', () => {
        navigator.serviceWorker.register('/sw.js', { scope: '/', updateViaCache: 'none' })
            .then((registration) => {
                // Stocker la registration globalement pour l'utiliser dans chat.js
                window.swRegistration = registration;

                // Forcer une vérification de mise à jour immédiate (contourne le délai de 24h)
                registration.update().catch(() => {});

                // Forcer l'activation immédiate si une nouvelle version attend
                if (registration.waiting) {
                    registration.waiting.postMessage({ type: 'SKIP_WAITING' });
                }
                registration.addEventListener('updatefound', () => {
                    const newWorker = registration.installing;
                    if (newWorker) {
                        newWorker.addEventListener('statechange', () => {
                            if (newWorker.state === 'installed') {
                                // Forcer activation même sans rechargement de page
                                newWorker.postMessage({ type: 'SKIP_WAITING' });
                            }
                        });
                    }
                });

                // Rechargement automatique quand le nouveau SW prend le contrôle
                navigator.serviceWorker.addEventListener('controllerchange', () => {
                    // Ne recharger qu'une seule fois
                    if (!sessionStorage.getItem('sw_updated')) {
                        sessionStorage.setItem('sw_updated', '1');
                        window.location.reload();
                    }
                });
            })
            .catch(() => {});
    });
}
</script>

<!-- Modal Disponibilités Hebdomadaires -->
<div id="availability-modal" class="availability-modal-overlay" style="display: none;">
    <div class="availability-modal-container">
        <div class="availability-modal-header">
            <div style="display: flex; align-items: center; gap: 1rem;">
                <h2 class="availability-modal-title">Sélectionnez vos dispos, et vos envies</h2>
                <div id="availability-save-indicator" class="availability-save-indicator" style="display: none;">
                    <svg class="spinner" width="16" height="16" viewbox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
                        <circle cx="12" cy="12" r="10" stroke="currentColor" stroke-width="3" stroke-dasharray="32" stroke-dashoffset="32" stroke-linecap="round">
                            <animate attributename="stroke-dashoffset" values="32;0" dur="1s" repeatcount="indefinite" />
                        </circle>
                    </svg>
                    <span id="availability-save-text">Sauvegarde...</span>
                </div>
            </div>
            <button class="availability-modal-close" onclick="closeAvailabilityModal()" title="Fermer">
                <svg width="24" height="24" viewbox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
                    <path d="M18 6L6 18M6 6L18 18" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
                </svg>
            </button>
        </div>
        
        <div class="availability-modal-body">
            <!-- Sélecteur de jours de la semaine -->
            <div class="availability-days-selector">
                <button class="availability-day-tab active" data-date="" data-day="Lun">
                    <span class="day-name">Lun</span>
                    <span class="day-number">--</span>
                </button>
                <button class="availability-day-tab" data-date="" data-day="Mar">
                    <span class="day-name">Mar</span>
                    <span class="day-number">--</span>
                </button>
                <button class="availability-day-tab" data-date="" data-day="Mer">
                    <span class="day-name">Mer</span>
                    <span class="day-number">--</span>
                </button>
                <button class="availability-day-tab" data-date="" data-day="Jeu">
                    <span class="day-name">Jeu</span>
                    <span class="day-number">--</span>
                </button>
                <button class="availability-day-tab" data-date="" data-day="Ven">
                    <span class="day-name">Ven</span>
                    <span class="day-number">--</span>
                </button>
                <button class="availability-day-tab" data-date="" data-day="Sam">
                    <span class="day-name">Sam</span>
                    <span class="day-number">--</span>
                </button>
                <button class="availability-day-tab" data-date="" data-day="Dim">
                    <span class="day-name">Dim</span>
                    <span class="day-number">--</span>
                </button>
            </div>
            
            <!-- Section Disponibilités -->
            <div class="availability-section">
                <h3 class="availability-section-title">📅 Mes disponibilités</h3>
                <div class="availability-timeslots">
                    <label class="availability-checkbox-item all-day">
                        <input type="checkbox" name="timeslot" value="all_day" id="timeslot-all-day">
                        <span class="checkbox-custom"></span>
                        <span class="checkbox-label">Toute la journée</span>
                    </label>
                    <div class="availability-timeslots-individual">
                        <label class="availability-checkbox-item">
                            <input type="checkbox" name="timeslot" value="morning">
                            <span class="checkbox-custom"></span>
                            <span class="checkbox-label">Matin <small>(06h00-12h00)</small></span>
                        </label>
                        <label class="availability-checkbox-item">
                            <input type="checkbox" name="timeslot" value="lunch">
                            <span class="checkbox-custom"></span>
                            <span class="checkbox-label">Midi <small>(12h00-14h00)</small></span>
                        </label>
                        <label class="availability-checkbox-item">
                            <input type="checkbox" name="timeslot" value="afternoon">
                            <span class="checkbox-custom"></span>
                            <span class="checkbox-label">Après-midi <small>(14h00-18h00)</small></span>
                        </label>
                        <label class="availability-checkbox-item">
                            <input type="checkbox" name="timeslot" value="evening">
                            <span class="checkbox-custom"></span>
                            <span class="checkbox-label">Soir <small>(18h00-22h00)</small></span>
                        </label>
                        <label class="availability-checkbox-item">
                            <input type="checkbox" name="timeslot" value="night">
                            <span class="checkbox-custom"></span>
                            <span class="checkbox-label">Nuit <small>(22h00-06h00)</small></span>
                        </label>
                    </div>
                </div>
            </div>
            
            <!-- Section Envies -->
            <div class="availability-section">
                <div class="availability-warning-message" style="display: none;">
                    ⚠️ Veuillez d'abord sélectionner au moins un créneau horaire avant de choisir vos envies.
                </div>
                <div class="availability-desires-header">
                    <h3 class="availability-section-title">💖 Mes envies</h3>
                    <a href="/profile/edit#tab-practices" class="availability-modify-link">Modifier</a>
                </div>
                <div class="availability-desires" id="availability-desires-container">
                    <!-- Les envies seront chargées dynamiquement via JavaScript -->
                    <p class="availability-loading">Chargement de vos envies...</p>
                </div>
            </div>
            
            <!-- Boutons d'action -->
            <div class="availability-actions">
                <button class="availability-btn-delete" onclick="deleteCurrentDayAvailability()">
                    <svg width="18" height="18" viewbox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
                        <path d="M3 6h18M8 6V4c0-1.1.9-2 2-2h4c1.1 0 2 .9 2 2v2m3 0v14c0 1.1-.9 2-2 2H7c-1.1 0-2-.9-2-2V6h14z" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
                    </svg>
                    Supprimer
                </button>
                <button class="availability-btn-close" onclick="closeAvailabilityModal()">
                    <svg width="18" height="18" viewbox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
                        <path d="M18 6L6 18M6 6L18 18" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
                    </svg>
                    Fermer
                </button>
            </div>
        </div>
    </div>
</div>

<script>
(function () {
    /* Fallback : si aucun panel de la page ne définit openOnlineMembersModal,
       on redirige vers le dashboard qui possède le vrai modal complet. */
    if (typeof window.openOnlineMembersModal !== 'function') {
        window.openOnlineMembersModal = function () {
            sessionStorage.setItem('autoOpenMembresModal', '1');
            window.location.href = '/dashboard';
        };
    }
}());
</script>

</body>
</html>