<!-- Total ads in file: 3, Requested: 50, Returned: 3 --><!-- Display ads: 3, Remaining ads: 0 -->
<!DOCTYPE html>
<html lang="fr-FR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Rencontres trans à Bordeaux, France | Annonces locales</title>
<meta name="description" content="Rencontres trans à Bordeaux: annonces vérifiées, profils authentiques et sécurisés. Faites une rencontre trans locale à Bordeaux en toute discrétion, gratuitement.">
<link rel="icon" type="image/x-icon" href="images/trans-bordeaux/favicon.ico">
<!-- CSS critique en priorité -->
<link href="style.css" rel="stylesheet">
<!-- CSS non critiques chargés de manière asynchrone -->
<link rel="preload" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet"></noscript>
<link rel="preload" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet"></noscript>
<style>
/* Variables CSS dynamiques depuis la configuration du domaine */
:root {
--primary-color: #6d1aea;
--secondary-color: #9166d1;
--primary-gradient: linear-gradient(135deg, var(--primary-color) 0%, var(--secondary-color) 100%);
--primary-gradient-inverted: linear-gradient(135deg, var(--secondary-color) 0%, var(--primary-color) 100%);
}
/* Override pour utiliser vos couleurs personnalisées */
.fas.text-success, .fa.text-success { color: var(--primary-color) !important; }
.fas.text-danger, .fa.text-danger { color: var(--primary-color) !important; }
.fas.text-warning, .fa.text-warning { color: var(--primary-color) !important; }
.fas.text-info, .fa.text-info { color: #17a2b8 !important; }
.fas.text-primary, .fa.text-primary { color: var(--primary-color) !important; }
.fas.text-secondary, .fa.text-secondary { color: #6c757d !important; }
.fas.text-muted, .fa.text-muted { color: #6c757d !important; }
.credits-display {
color: white;
font-size: 0.9rem;
font-weight: 600;
display: flex;
align-items: center;
gap: 8px;
background: rgba(255, 255, 255, 0.1);
padding: 8px 12px;
border-radius: 20px;
border: 1px solid rgba(255, 255, 255, 0.2);
backdrop-filter: blur(10px);
cursor: pointer;
transition: all 0.3s ease;
text-decoration: none;
}
.credits-display:hover {
background: rgba(255, 255, 255, 0.2);
border-color: rgba(255, 215, 0, 0.5);
transform: scale(1.05);
color: white;
}
.credits-display i.fas.fa-coins {
color: #ffd700 !important;
font-size: 1rem;
}
.credits-number {
color: #ffd700;
font-weight: 700;
}
/* Styles pour le menu des conversations et départements */
.conversations-btn, .departments-btn {
background: rgba(255, 255, 255, 0.1);
border: 1px solid rgba(255, 255, 255, 0.2);
border-radius: 20px;
color: white;
padding: 8px 12px;
cursor: pointer;
transition: all 0.3s ease;
display: flex;
align-items: center;
gap: 8px;
backdrop-filter: blur(10px);
font-size: 0.9rem;
}
.conversations-btn:hover, .departments-btn:hover {
background: rgba(255, 255, 255, 0.2);
border-color: rgba(255, 255, 255, 0.4);
transform: scale(1.05);
}
.conversations-btn i, .departments-btn i {
color: #ffffff !important;
font-size: 1rem;
}
.conversations-count {
background: #ff4757;
color: white;
border-radius: 50%;
width: 20px;
height: 20px;
display: flex;
align-items: center;
justify-content: center;
font-size: 0.75rem;
font-weight: 700;
min-width: 20px;
}
.conversations-dropdown {
position: absolute;
top: 100%;
left: 0;
background: white;
border-radius: 10px;
box-shadow: 0 10px 30px rgba(0,0,0,0.2);
min-width: 320px;
max-width: 400px;
z-index: 1000;
opacity: 0;
visibility: hidden;
transform: translateY(-10px);
transition: all 0.3s ease;
margin-top: 10px;
}
.conversations-dropdown.show {
opacity: 1;
visibility: visible;
transform: translateY(0);
}
.conversations-header {
background: var(--primary-gradient);
color: white;
padding: 12px 15px;
border-radius: 10px 10px 0 0;
display: flex;
align-items: center;
gap: 8px;
font-weight: 600;
}
.conversations-list {
max-height: 300px;
overflow-y: auto;
}
.conversation-item {
padding: 12px 15px;
border-bottom: 1px solid #f0f0f0;
cursor: pointer;
transition: background-color 0.2s ease;
display: flex;
align-items: center;
gap: 12px;
}
.conversation-item:hover {
background-color: #f8f9fa;
}
.conversation-item:last-child {
border-bottom: none;
border-radius: 0 0 10px 10px;
}
.conversation-avatar {
width: 40px;
height: 40px;
border-radius: 50%;
object-fit: cover;
border: 2px solid #e9ecef;
}
.conversation-info {
flex: 1;
min-width: 0;
}
.conversation-name {
font-weight: 600;
color: #333;
margin-bottom: 2px;
font-size: 0.9rem;
}
.conversation-last-message {
color: #666;
font-size: 0.8rem;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.conversation-meta {
display: flex;
flex-direction: column;
align-items: flex-end;
gap: 4px;
}
.conversation-time {
color: #999;
font-size: 0.75rem;
}
.conversation-messages {
background: var(--primary-color);
color: white;
border-radius: 12px;
padding: 2px 6px;
font-size: 0.7rem;
font-weight: 600;
}
.no-conversations {
padding: 30px 15px;
text-align: center;
color: #999;
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
}
.no-conversations i {
font-size: 2rem;
opacity: 0.5;
}
/* Menu départements */
.departments-dropdown {
display: none;
background: var(--primary-gradient);
box-shadow: 0 5px 15px rgba(0,0,0,0.2);
max-height: 500px;
overflow-y: auto;
padding: 0;
width: 100%;
}
.departments-dropdown.show {
display: block;
}
.departments-list {
display: block;
}
.department-item {
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
}
.department-item:last-child {
border-bottom: none;
}
.department-header {
display: block;
width: 100%;
padding: 12px 15px;
background: transparent;
color: white;
border: none;
text-align: left;
cursor: pointer;
font-weight: 600;
font-size: 0.95rem;
transition: all 0.2s ease;
position: relative;
}
.department-header:hover {
background: rgba(255, 255, 255, 0.2);
}
.department-header i {
float: right;
transition: transform 0.2s ease;
}
.department-cities {
display: none;
background: rgba(255, 255, 255, 0.05);
}
.department-cities.show {
display: block;
}
.departments-dropdown .city-link {
display: block;
padding: 8px 30px;
color: white;
text-decoration: none;
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
transition: all 0.2s ease;
font-size: 0.9rem;
}
.departments-dropdown .city-link:hover {
background: rgba(255, 255, 255, 0.1);
color: white;
}
.departments-dropdown .city-link:last-child {
border-bottom: none;
}
.departments-dropdown .city-name {
font-weight: 500;
font-size: 0.95rem;
color: white;
}
/* Scrollbar personnalisée pour le menu départements */
.departments-dropdown::-webkit-scrollbar {
width: 8px;
}
.departments-dropdown::-webkit-scrollbar-track {
background: rgba(255, 255, 255, 0.1);
border-radius: 4px;
}
.departments-dropdown::-webkit-scrollbar-thumb {
background: rgba(255, 255, 255, 0.3);
border-radius: 4px;
transition: background 0.2s ease;
}
.departments-dropdown::-webkit-scrollbar-thumb:hover {
background: rgba(255, 255, 255, 0.5);
}
/* Pour Firefox */
.departments-dropdown {
scrollbar-width: thin;
scrollbar-color: rgba(255, 255, 255, 0.3) rgba(255, 255, 255, 0.1);
}
/* Styles pour la barre de recherche */
.search-container {
position: relative;
display: flex;
align-items: center;
flex: 1;
max-width: 400px;
}
.search-input {
background: rgba(255, 255, 255, 0.1);
border: 1px solid rgba(255, 255, 255, 0.2);
border-radius: 20px;
color: white;
padding: 8px 40px 8px 15px;
width: 100%;
font-size: 0.9rem;
backdrop-filter: blur(10px);
transition: all 0.3s ease;
}
.search-input::placeholder {
color: rgba(255, 255, 255, 0.7);
}
.search-input:focus {
outline: none;
background: rgba(255, 255, 255, 0.2);
border-color: rgba(255, 255, 255, 0.4);
box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.1);
}
.search-btn {
position: absolute;
right: 5px;
background: transparent;
border: none;
color: white;
padding: 5px 10px;
cursor: pointer;
border-radius: 15px;
transition: all 0.2s ease;
}
.search-btn:hover {
background: rgba(255, 255, 255, 0.1);
color: white;
}
.search-btn i {
color: white !important;
}
.search-results {
position: absolute;
top: 100%;
left: 0;
right: 0;
background: white;
border-radius: 0;
box-shadow: 0 10px 30px rgba(0,0,0,0.2);
max-height: 400px;
overflow-y: auto;
z-index: 1000;
margin-top: 5px;
display: none;
}
.search-results.show {
display: block;
}
.search-results-header {
background: var(--primary-gradient);
color: white;
padding: 10px 15px;
border-radius: 0;
font-weight: 600;
font-size: 0.9rem;
}
.search-category {
border-bottom: 1px solid #f0f0f0;
}
.search-category:last-child {
border-bottom: none;
}
.search-category-title {
background: #f8f9fa;
color: #666;
padding: 8px 15px;
font-weight: 600;
font-size: 0.8rem;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.search-item {
padding: 10px 15px;
cursor: pointer;
transition: background-color 0.2s ease;
display: flex;
align-items: center;
gap: 10px;
border-bottom: 1px solid #f8f9fa;
}
.search-item:hover {
background-color: #f8f9fa;
}
.search-item:last-child {
border-bottom: none;
}
.search-item-icon {
color: var(--primary-color);
width: 16px;
text-align: center;
}
.search-item-content {
flex: 1;
}
.search-item-name {
font-weight: 600;
color: #333;
font-size: 0.9rem;
}
.search-item-info {
color: #666;
font-size: 0.8rem;
margin-top: 2px;
}
.search-no-results {
padding: 30px 15px;
text-align: center;
color: #999;
font-style: italic;
}
.search-loading {
padding: 20px 15px;
text-align: center;
color: var(--primary-color);
display: flex;
align-items: center;
justify-content: center;
gap: 10px;
}
.search-loading i {
animation: spin 1s linear infinite;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
/* Conteneur parent des éléments du header */
.navbar .container {
display: flex !important;
align-items: center;
justify-content: space-between;
}
.navbar .container > div:last-child {
display: flex !important;
align-items: center;
gap: 15px;
flex: 1;
justify-content: flex-end;
}
@media (max-width: 991px) {
.navbar .container {
flex-direction: column;
align-items: center;
gap: 15px;
}
.navbar-brand {
justify-content: center;
text-align: center;
width: 100%;
}
.navbar .container > div:last-child {
width: 100%;
justify-content: center;
}
}
@media (max-width: 576px) {
.search-input {
font-size: 0.8rem;
}
.navbar .container > div:last-child {
gap: 10px;
}
}
/* Styles pour les sections avec design moderne */
.modern-section {
background: #f8f9fa;
padding: 25px;
border-radius: 15px;
border: 1px solid #e9ecef;
box-shadow: 0 2px 10px rgba(0,0,0,0.05);
}
.modern-section h2, .modern-section h3, .modern-section h4 {
color: var(--primary-color);
font-weight: 700;
margin-bottom: 20px;
display: flex;
align-items: center;
gap: 10px;
}
.modern-section h2 i, .modern-section h3 i, .modern-section h4 i {
color: var(--primary-color) !important;
}
.section-legend {
background: white;
padding: 15px;
border-radius: 8px;
border: 1px solid #dee2e6;
display: flex;
align-items: center;
justify-content: space-between;
}
.section-legend .legend-item {
display: flex;
align-items: center;
gap: 8px;
}
.section-stats {
color: var(--primary-color);
font-weight: 600;
}
/* Responsive pour les sections modernes */
@media (max-width: 768px) {
.modern-section {
padding: 15px;
}
.section-legend {
flex-direction: column;
gap: 10px;
text-align: center;
}
}
</style>
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-XXXXXXXXXX');
</script>
<script>
// Función para obtener y mostrar los créditos
async function updateCreditsDisplay() {
try {
const response = await fetch('get_credits.php');
const data = await response.json();
if (data.success) {
const creditsElement = document.getElementById('creditsNumber');
if (creditsElement) {
creditsElement.textContent = data.credits;
// Cambiar el color si los créditos son bajos
if (data.credits <= 2) {
creditsElement.style.color = '#ff6b6b';
} else if (data.credits <= 5) {
creditsElement.style.color = '#ffa726';
} else {
creditsElement.style.color = '#ffd700';
}
}
}
} catch (error) {
}
}
// Función para obtener y mostrar las conversaciones
async function updateConversationsDisplay() {
try {
const response = await fetch('get_conversations.php');
const data = await response.json();
if (data.success) {
const countElement = document.getElementById('conversationsCount');
const listElement = document.getElementById('conversationsList');
if (countElement) {
countElement.textContent = data.total;
// Ocultar el badge si no hay conversaciones
countElement.style.display = data.total > 0 ? 'flex' : 'none';
}
if (listElement) {
if (data.conversations.length === 0) {
listElement.innerHTML = `
<div class="no-conversations">
<i class="fas fa-comment-slash"></i>
<span>Aucune conversation en cours</span>
</div>
`;
} else {
listElement.innerHTML = data.conversations.map(conv => `
<div class="conversation-item" onclick="window.location.href='${conv.chat_url}'">
<img src="${conv.image}" alt="${conv.name}" class="conversation-avatar">
<div class="conversation-info">
<div class="conversation-name">${conv.name}</div>
<div class="conversation-last-message">${conv.last_message}</div>
</div>
</div>
`).join('');
}
}
}
} catch (error) {
console.error('Error al obtener las conversaciones:', error);
}
}
// Gestionar la apertura/cierre del menú de conversaciones
function toggleConversationsMenu() {
const dropdown = document.getElementById('conversationsDropdown');
if (dropdown) {
dropdown.classList.toggle('show');
}
}
// Gérer l'ouverture/fermeture du menu des départements
function toggleDepartmentsMenu() {
const dropdown = document.getElementById('departmentsDropdown');
if (dropdown) {
dropdown.classList.toggle('show');
}
}
// Gérer l'ouverture/fermeture des départements individuels
function toggleDepartment(deptId) {
const deptElement = document.getElementById(deptId);
const chevron = event.target.querySelector('i');
if (deptElement) {
if (deptElement.classList.contains('show')) {
deptElement.classList.remove('show');
if (chevron) chevron.style.transform = 'rotate(0deg)';
} else {
deptElement.classList.add('show');
if (chevron) chevron.style.transform = 'rotate(180deg)';
}
}
}
// Variable pour gérer les requêtes Ajax en cours
let currentSearchRequest = null;
// Fonction de recherche Ajax
async function performSearch(query) {
if (!query || query.length < 1) {
hideSearchResults();
return;
}
// Annuler la requête précédente si elle existe
if (currentSearchRequest) {
currentSearchRequest.abort();
}
// Afficher le chargement
displaySearchLoading(query);
try {
// Créer une nouvelle requête
currentSearchRequest = new AbortController();
const response = await fetch(`search_api.php?q=${encodeURIComponent(query)}`, {
signal: currentSearchRequest.signal
});
if (!response.ok) {
throw new Error('Erreur réseau');
}
const data = await response.json();
if (data.success) {
displaySearchResults(data.results, data.query);
} else {
displaySearchError(data.error || 'Erreur inconnue');
}
} catch (error) {
if (error.name !== 'AbortError') {
console.error('Erreur de recherche:', error);
displaySearchError('Erreur lors de la recherche');
}
} finally {
currentSearchRequest = null;
}
}
// Afficher l'indicateur de chargement
function displaySearchLoading(query) {
const resultsContainer = document.getElementById('searchResults');
resultsContainer.innerHTML = `
<div class="search-results-header">
<i class="fas fa-search"></i> Rechercher : "${query}"
</div>
<div class="search-loading">
<i class="fas fa-spinner"></i>
<span>Recherche en cours...</span>
</div>
`;
showSearchResults();
}
// Afficher une erreur de recherche
function displaySearchError(errorMessage) {
const resultsContainer = document.getElementById('searchResults');
resultsContainer.innerHTML = `
<div class="search-results-header">
<i class="fas fa-exclamation-triangle"></i> Erreur lors de la recherche </div>
<div class="search-no-results">
${errorMessage}
</div>
`;
showSearchResults();
}
// Afficher les résultats de recherche
function displaySearchResults(results, query) {
const resultsContainer = document.getElementById('searchResults');
if (results.length === 0) {
resultsContainer.innerHTML = `
<div class="search-results-header">
<i class="fas fa-search"></i> Rechercher : "${query}"
</div>
<div class="search-no-results">
Aucun résultat trouvé pour "${query}"
</div>
`;
} else {
// Séparer les départements et les villes
const departments = results.filter(item => item.type === 'department');
const cities = results.filter(item => item.type === 'city');
const resultText = results.length > 1 ? 'résultats pour' : 'résultat pour';
let html = `
<div class="search-results-header">
<i class="fas fa-search"></i> ${results.length} ${resultText} "${query}"
</div>
`;
if (departments.length > 0) {
html += `
<div class="search-category">
<div class="search-category-title">Départements</div>
`;
departments.forEach(dept => {
html += `
<div class="search-item" onclick="window.location.href='${dept.url}'">
<div class="search-item-icon">
<i class="fas fa-map-marker-alt"></i>
</div>
<div class="search-item-content">
<div class="search-item-name">${dept.name}</div>
<div class="search-item-info">Département ${dept.code}</div>
</div>
</div>
`;
});
html += `</div>`;
}
if (cities.length > 0) {
html += `
<div class="search-category">
<div class="search-category-title">Villes</div>
`;
// Limiter à 10 villes pour éviter une liste trop longue
const limitedCities = cities.slice(0, 10);
limitedCities.forEach(city => {
html += `
<div class="search-item" onclick="window.location.href='${city.url}'">
<div class="search-item-icon">
<i class="fas fa-city"></i>
</div>
<div class="search-item-content">
<div class="search-item-name">${city.name}</div>
<div class="search-item-info">${city.department} (${city.population.toLocaleString()} hab.)</div>
</div>
</div>
`;
});
if (cities.length > 10) {
const moreText = "et {count} autres villes".replace('{count}', cities.length - 10);
html += `
<div class="search-item" style="font-style: italic; color: #666;">
<div class="search-item-content">
... ${moreText}
</div>
</div>
`;
}
html += `</div>`;
}
resultsContainer.innerHTML = html;
}
showSearchResults();
}
// Afficher les résultats
function showSearchResults() {
const resultsContainer = document.getElementById('searchResults');
resultsContainer.classList.add('show');
}
// Masquer les résultats
function hideSearchResults() {
const resultsContainer = document.getElementById('searchResults');
resultsContainer.classList.remove('show');
}
// Fermer les menus si on clique ailleurs
document.addEventListener('click', function(event) {
const conversationsMenu = document.querySelector('.conversations-menu');
const conversationsDropdown = document.getElementById('conversationsDropdown');
const departmentsMenu = document.querySelector('.departments-menu');
const departmentsDropdown = document.getElementById('departmentsDropdown');
const searchContainer = document.querySelector('.search-container');
const searchResults = document.getElementById('searchResults');
if (conversationsMenu && conversationsDropdown && !conversationsMenu.contains(event.target)) {
conversationsDropdown.classList.remove('show');
}
if (departmentsMenu && departmentsDropdown && !departmentsMenu.contains(event.target)) {
departmentsDropdown.classList.remove('show');
}
// Fermer les résultats de recherche si on clique ailleurs
if (searchContainer && searchResults && !searchContainer.contains(event.target)) {
hideSearchResults();
}
});
// Charger les crédits et conversations au chargement de la page
document.addEventListener('DOMContentLoaded', function() {
//updateCreditsDisplay();
updateConversationsDisplay();
// Ajouter l'événement click au bouton conversations
const conversationsBtn = document.getElementById('conversationsBtn');
if (conversationsBtn) {
conversationsBtn.addEventListener('click', function(e) {
e.stopPropagation();
toggleConversationsMenu();
// Rafraîchir les conversations à chaque ouverture
updateConversationsDisplay();
});
}
// Ajouter l'événement click au bouton départements
const departmentsBtn = document.getElementById('departmentsBtn');
if (departmentsBtn) {
departmentsBtn.addEventListener('click', function(e) {
e.stopPropagation();
toggleDepartmentsMenu();
});
}
// Empêcher la fermeture des dropdowns quand on clique dedans
const departmentsDropdown = document.getElementById('departmentsDropdown');
if (departmentsDropdown) {
departmentsDropdown.addEventListener('click', function(e) {
e.stopPropagation();
});
}
// Gérer la barre de recherche
const searchInput = document.getElementById('searchInput');
const searchBtn = document.getElementById('searchBtn');
const searchResults = document.getElementById('searchResults');
if (searchInput) {
// Recherche en temps réel
let searchTimeout;
searchInput.addEventListener('input', function() {
clearTimeout(searchTimeout);
const query = this.value.trim();
// Délai pour éviter trop de requêtes
searchTimeout = setTimeout(() => {
performSearch(query);
}, 300);
});
// Recherche au focus si il y a déjà du texte
searchInput.addEventListener('focus', function() {
const query = this.value.trim();
if (query.length >= 1) {
performSearch(query);
}
});
// Recherche à l'appui sur Entrée
searchInput.addEventListener('keydown', function(e) {
if (e.key === 'Enter') {
e.preventDefault();
const query = this.value.trim();
if (query.length >= 1) {
performSearch(query);
}
}
// Fermer les résultats avec Escape
if (e.key === 'Escape') {
hideSearchResults();
this.blur();
}
});
}
if (searchBtn) {
searchBtn.addEventListener('click', function() {
const query = searchInput.value.trim();
if (query.length >= 1) {
performSearch(query);
}
});
}
// Empêcher la fermeture des résultats de recherche quand on clique dedans
if (searchResults) {
searchResults.addEventListener('click', function(e) {
e.stopPropagation();
});
}
});
</script>
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-dark custom-header">
<div class="container">
<a class="navbar-brand d-flex align-items-center" href="/">
<img src="images/trans-bordeaux/logo.webp" alt="Logo" class="navbar-logo me-2">
<span class="brand-text">Rencontres Trans Bordeaux</span>
</a>
<!-- Menu conversations et crédits -->
<div style="display: flex; align-items: center; gap: 15px;">
<!-- Menu des conversations -->
<div class="conversations-menu" style="position: relative;">
<button class="conversations-btn" id="conversationsBtn" title="Mes conversations">
<i class="fas fa-comments"></i>
<span class="conversations-count" id="conversationsCount">0</span>
</button>
<div class="conversations-dropdown" id="conversationsDropdown">
<div class="conversations-header">
<i class="fas fa-comments"></i>
<span>Mes conversations</span>
</div>
<div class="conversations-list" id="conversationsList">
<div class="no-conversations">
<i class="fas fa-comment-slash"></i>
<span>Aucune conversation en cours</span>
</div>
</div>
</div>
</div>
<!-- <a href="messages.php" class="credits-display" id="creditsDisplay" >
<i class="fas fa-coins" style="color: #ffd700 !important;"></i>
<span class="credits-number" id="creditsNumber">9</span>
</a> -->
</div>
</div>
</nav>
<!-- Menu départements (en dehors de la navbar) -->
<div class="departments-dropdown" id="departmentsDropdown">
<div class="departments-list">
<div style="color: rgba(255,255,255,0.7); padding: 20px; text-align: center;">
Aucun département disponible </div>
</div>
</div>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Accueil",
"item": "https://trans-bordeaux.fr/"
}
]
}
</script>
<!-- Hero Section Compact -->
<div class="hero-section" style="padding: 40px 0;">
<div class="container">
<div class="hero-content text-center">
<h1 style="font-size: 2rem; margin-bottom: 15px;">Rencontres trans à Bordeaux : trouvez l'amour près de chez vous</h1>
<p class="lead" style="font-size: 1.1rem;">
Découvrez des annonces de rencontres trans à Bordeaux </p>
</div>
</div>
</div>
<div class="container">
<!-- Ads Section -->
<div class="ads-section modern-section mb-5">
<h2>
<i class="fas fa-heart"></i>
Annonces récentes de rencontres trans à Bordeaux </h2>
<div class="row" id="ads-container">
<div class="col-lg-4 col-md-6 mb-4">
<div class="card ad-card h-100">
<img src="images/trans-bordeaux/2/1_small.webp" class="card-img-top ad-image" alt="Ophélie">
<div class="card-body">
<h5 class="card-title">
<a href="ad.php?id=2&city=Bordeaux" class="ad-title" >
Ophélie </a>
</h5>
<div class="ad-meta mb-2">
<small class="text-muted">
</small>
</div>
<div class="mb-2">
<span class="badge"><i class="fas fa-heart text-danger"></i> Plan régulier</span>
<span class="badge"><i class="fas fa-lock"></i> Discrétion absolue</span>
</div>
<p class="ad-preview">Regard intense, voix douce; partante pour un plan régulier complice et discret.</p>
<div class="text-center">
<a href="ad.php?id=2&city=Bordeaux" class="btn btn-primary btn-sm" >
Voir l'annonce complète </a>
</div>
</div>
</div>
</div>
<div class="col-lg-4 col-md-6 mb-4">
<div class="card ad-card h-100">
<img src="images/trans-bordeaux/1/1_small.webp" class="card-img-top ad-image" alt="Isaure">
<div class="card-body">
<h5 class="card-title">
<a href="ad.php?id=1&city=Bordeaux" class="ad-title" >
Isaure </a>
</h5>
<div class="ad-meta mb-2">
<small class="text-muted">
</small>
</div>
<div class="mb-2">
<span class="badge"><i class="fas fa-heart text-danger"></i> Rencontre occasionnelle</span>
<span class="badge"><i class="fas fa-lock"></i> Discrétion absolue</span>
</div>
<p class="ad-preview">Regard franc, voix douce, envie d’alchimie discrète pour une rencontre occasionnelle qui vibre fort.</p>
<div class="text-center">
<a href="ad.php?id=1&city=Bordeaux" class="btn btn-primary btn-sm" >
Voir l'annonce complète </a>
</div>
</div>
</div>
</div>
<div class="col-lg-4 col-md-6 mb-4">
<div class="card ad-card h-100">
<img src="images/trans-bordeaux/3/1_small.webp" class="card-img-top ad-image" alt="Naïma">
<div class="card-body">
<h5 class="card-title">
<a href="ad.php?id=3&city=Bordeaux" class="ad-title" >
Naïma </a>
</h5>
<div class="ad-meta mb-2">
<small class="text-muted">
</small>
</div>
<div class="mb-2">
<span class="badge"><i class="fas fa-heart text-danger"></i> Rencontre occasionnelle</span>
<span class="badge"><i class="fas fa-lock"></i> Discrétion absolue</span>
</div>
<p class="ad-preview">Regard franc, voix douce, pour une parenthèse complice, discrète et occasionnelle.</p>
<div class="text-center">
<a href="ad.php?id=3&city=Bordeaux" class="btn btn-primary btn-sm" >
Voir l'annonce complète </a>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Platform Features Section - Compact -->
<div class="features-section modern-section mb-4" style="background: #f8f9fa; padding: 30px 20px; border-radius: 10px;">
<div class="row g-3">
<div class="col-lg-4 col-md-6">
<div class="d-flex align-items-start">
<i class="fas fa-map-marker-alt fa-2x text-primary me-3 mt-1"></i>
<div>
<h5 class="mb-1">Rencontres trans locales à Bordeaux</h5>
<p class="mb-0 small text-muted">Toutes nos annonces sont à Bordeaux. Rencontrez des personnes trans près de chez vous à Bordeaux.</p>
</div>
</div>
</div>
<div class="col-lg-4 col-md-6">
<div class="d-flex align-items-start">
<i class="fas fa-check-circle fa-2x text-primary me-3 mt-1"></i>
<div>
<h5 class="mb-1">Profils vérifiés et authentiques</h5>
<p class="mb-0 small text-muted">Profils trans authentiques et vérifiés pour des rencontres en toute confiance.</p>
</div>
</div>
</div>
<div class="col-lg-4 col-md-6">
<div class="d-flex align-items-start">
<i class="fas fa-lock fa-2x text-primary me-3 mt-1"></i>
<div>
<h5 class="mb-1">Plateforme sécurisée et discrète</h5>
<p class="mb-0 small text-muted">Plateforme sécurisée et discrète pour des rencontres trans à Bordeaux.</p>
</div>
</div>
</div>
</div>
</div>
<!-- Where to Meet Section -->
<div class="where-to-meet-section modern-section mb-5">
<h2>
<i class="fas fa-map-marked-alt"></i>
Où rencontrer des personnes trans à Bordeaux ? </h2>
<div class="where-to-meet-content">
<p>Bordeaux offre de multiples lieux conviviaux et inclusifs pour organiser des rencontres trans réussies. Les quartiers de Saint-Pierre, des Chartrons et de La Bastide sont réputés pour leur ambiance ouverte, leurs rues animées et leurs établissements bienveillants, idéals pour un premier échange en toute sérénité.</p><p>Pour une rencontre en plein air, le <strong>Jardin Public</strong> (accès Cours de Verdun/Place Bardineau) est un classique : ambiance verdoyante et apaisée, public familial et mixte, nombreux bancs qui permettent de discuter sans pression. Les <strong>quais des Chartrons</strong> (Quai des Chartrons, entre Hangar 14 et la Bourse) offrent une promenade très fréquentée et bien éclairée, appréciée pour son atmosphère décontractée. Le <strong>Miroir d’eau</strong> (Place de la Bourse) attire un public varié et respectueux ; parfait pour briser la glace en observant l’animation urbaine.</p><p>Si vous préférez un café accueillant, le <strong>Café Utopia</strong> (5 Place Camille Jullian) rassemble un public curieux et ouvert, propice aux échanges authentiques après une séance au cinéma Utopia. Le <strong>SIP Coffee Bar</strong> (69 Rue des Ayres) propose une ambiance chaleureuse, idéale pour une rencontre décontractée autour d’un bon café. À deux pas, Karl (6 Place du Parlement) offre des pâtisseries et un cadre lumineux qui facilite une première conversation sans stress.</p><p>Pour une rencontre culturelle, le <strong>CAPC – Musée d’Art Contemporain</strong> (7 Rue Ferrère) permet de partager une expo et d’enchaîner par un café, tout en profitant d’un lieu respectueux de la diversité. La <strong>Cité du Vin</strong> (134 Quai de Bacalan) crée un cadre élégant et original pour échanger sur vos goûts, avec des espaces calmes et un personnel habitué à un public international et inclusif. Sur la rive droite, le Darwin Écosystème (87 Quai des Queyries) combine friches artistiques, cafés et espaces verts dans une atmosphère créative et bienveillante.</p><p>Envie de quelque chose de gourmand et informel ? Les <strong>Halles de Bacalan</strong> (10 Esplanade de Pontac) conviennent aux rencontres conviviales grâce à leurs stands variés, tables partagées et foule bienveillante. Le <strong>Marché des Capucins</strong> (Place des Capucins) est parfait le matin pour une balade colorée et accessible, où l’on se sent à l’aise pour discuter en toute simplicité. La Boca Foodcourt (208 Quai de Paludate) propose un vaste choix et des espaces spacieux, idéals pour garder le contrôle de l’ambiance et du temps passé ensemble.</p><p>Pour une soirée plus animée, l’<strong>IBOAT</strong> (Bassin à flot, Quai Armand Lalande) attire un public éclectique et tolérant, avec des événements musicaux où l’on se sent en sécurité. <strong>La Tencha</strong> (22 Quai de la Monnaie) est un bar festif et détendu, prisé pour sa clientèle diverse et son atmosphère inclusive. Privilégiez les lieux bien éclairés et accessibles en tram (lignes B et C vers les quais, ligne A vers la rive droite), et informez un proche de votre rendez-vous pour des rencontres trans sereines à Bordeaux.</p> </div>
</div>
<!-- FAQ Section - Compact -->
<div class="faq-section mb-4">
<h3 class="mb-3"><i class="fas fa-question-circle text-primary"></i> Questions fréquentes sur les rencontres trans</h3>
<div class="accordion" id="faqAccordion">
<div class="accordion-item">
<h2 class="accordion-header">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#faq1">
Comment fonctionne le site de rencontre ? </button>
</h2>
<div id="faq1" class="accordion-collapse collapse" data-bs-parent="#faqAccordion">
<div class="accordion-body">Notre plateforme permet de consulter gratuitement toutes les annonces de Bordeaux et des quartiers comme Saint-Pierre, Chartrons, Victoire ou La Bastide. Parcourez les profils, photos et descriptions, puis contactez la personne via la messagerie intégrée ou les coordonnées indiquées dans l’annonce. Lorsque le feeling est réciproque, proposez un rendez-vous dans un lieu public de Bordeaux (Jardin Public, quais des Chartrons, cafés de la Place du Parlement). Vous pouvez enregistrer vos favoris et revenir plus tard pour continuer la discussion. Le processus est simple, fluide et pensé pour faciliter les rencontres trans locales à Bordeaux.</div>
</div>
</div>
<div class="accordion-item">
<h2 class="accordion-header">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#faq2">
Le site est-il vraiment gratuit ? </button>
</h2>
<div id="faq2" class="accordion-collapse collapse" data-bs-parent="#faqAccordion">
<div class="accordion-body">Oui, la navigation et la consultation de toutes les annonces sont entièrement gratuites. Vous pouvez voir les profils, les photos et envoyer des messages sans frais cachés ni abonnement imposé. Aucune carte bancaire n’est requise pour utiliser les fonctionnalités essentielles. Si des options additionnelles sont proposées à l’avenir, elles resteront clairement indiquées et totalement facultatives. Notre priorité est de favoriser la rencontre, pas de créer des paiements surprises.</div>
</div>
</div>
<div class="accordion-item">
<h2 class="accordion-header">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#faq3">
Comment garantissez-vous ma sécurité et ma confidentialité ? </button>
</h2>
<div id="faq3" class="accordion-collapse collapse" data-bs-parent="#faqAccordion">
<div class="accordion-body">Nous prenons la sécurité et la confidentialité très au sérieux à Bordeaux : modération active, suppression des contenus douteux et vérifications renforcées des annonces trans. Pour vos premières rencontres à Bordeaux, privilégiez des lieux publics et fréquentés comme les quais des Chartrons, le Jardin Public ou les Halles de Bacalan, de préférence en journée ou en début de soirée. Évitez de partager trop vite des données sensibles (adresse, IBAN, documents). En cas de doute, utilisez le bouton Signaler présent sur chaque annonce ou conversation : notre équipe analyse chaque signalement avec attention. Nous vous recommandons aussi de venir en transport en commun (tram A/B/C) et de rester dans des zones bien éclairées.</div>
</div>
</div>
<div class="accordion-item">
<h2 class="accordion-header">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#faq4">
Puis-je rester anonyme et protéger ma vie privée ? </button>
</h2>
<div id="faq4" class="accordion-collapse collapse" data-bs-parent="#faqAccordion">
<div class="accordion-body">Vous gardez le contrôle total sur vos informations personnelles : vous choisissez quoi afficher dans votre profil et avec qui le partager. Aucune donnée sensible n’est visible publiquement sans votre accord, et la messagerie protège votre e‑mail et votre téléphone tant que vous ne les communiquez pas. Vous pouvez consulter toutes les annonces à Bordeaux en toute discrétion et supprimer vos contenus à tout moment. Nous appliquons des règles strictes de protection des données et ne transmettons rien à des tiers sans consentement. Votre anonymat est respecté à chaque étape de vos rencontres trans.</div>
</div>
</div>
</div>
</div>
</div>
<!-- JavaScript for Load More functionality -->
<script>
// Store remaining ads data
const remainingAds = [];
let adsOffset = 0;
// Helper function to get ad image
function getAdImage(ad) {
if (!ad.images || ad.images.length === 0) {
return 'images/trans-bordeaux/1_small.webp';
}
const firstImage = ad.images[0];
const lastDotIndex = firstImage.lastIndexOf('.');
const lastSlashIndex = firstImage.lastIndexOf('/');
if (lastDotIndex > lastSlashIndex) {
return firstImage.substring(0, lastDotIndex) + '_small' + firstImage.substring(lastDotIndex);
}
return firstImage + '_small';
}
function loadMoreAds() {
const container = document.getElementById('ads-container');
const button = document.getElementById('load-more-ads');
const adsToShow = remainingAds.slice(adsOffset, adsOffset + 3);
adsToShow.forEach(ad => {
const adHtml = `
<div class="col-lg-4 col-md-6 mb-4">
<div class="card ad-card h-100">
<img src="${getAdImage(ad)}" class="card-img-top ad-image" alt="${ad.title}">
<div class="card-body">
<h5 class="card-title">
<a href="ad.php?id=${ad.original_id}&city=Bordeaux" class="ad-title">
${ad.title}
</a>
</h5>
<div class="ad-meta mb-2">
<small class="text-muted">
${ad.age !== null ? `<i class="fas fa-user"></i> ${ad.age} ans` : ''}
</small>
</div>
<div class="mb-2">
${ad.relationship_type ? `<span class="badge"><i class="fas fa-heart text-danger"></i> ${ad.relationship_type}</span>` : ''}
${ad.can_host === 'oui' ? '<span class="badge"><i class="fas fa-home"></i> Peut recevoir</span>' : ''}
${ad.has_vehicle === 'oui' ? '<span class="badge"><i class="fas fa-car"></i> Véhiculé</span>' : ''}
${ad.discretion ? `<span class="badge"><i class="fas fa-lock"></i> ${ad.discretion}</span>` : ''}
</div>
<p class="ad-preview">${ad.preview}</p>
<div class="text-center">
<a href="ad.php?id=${ad.original_id}&city=Bordeaux" class="btn btn-primary btn-sm">
Voir l'annonce complète </a>
</div>
</div>
</div>
</div>
`;
container.insertAdjacentHTML('beforeend', adHtml);
});
adsOffset += 3;
if (adsOffset >= remainingAds.length) {
button.style.display = 'none';
}
}
</script>
<footer class="bg-dark text-light mt-5 py-4">
<div class="container">
<div class="row">
<div class="col-md-6">
<h5>Rencontres Trans Bordeaux</h5>
<p>Annonces et rencontres trans à Bordeaux, Gironde, France pour célibataires sérieux.</p>
</div>
<div class="col-md-6 text-md-end">
<div class="mb-2">
<a href="conditions-of-use.php" class="text-light me-3" >Conditions Générales</a>
<a href="legal-notices.php" class="text-light" >Mentions Légales</a>
</div>
<p>© 2025 Rencontres Trans Bordeaux. Tous droits réservés.</p>
</div>
</div>
</div>
</footer>
<!-- Scripts chargés en différé pour ne pas bloquer le rendu -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" defer></script>
</body>
</html>