Coque rigide, vue 360°, montage en 1 minute. Compatible toutes barres de toit.
🏔 Vue 360°⚡ 1 min chrono👥 2 couchages🌧 Imperméable
En option : surf, stand-up paddle, kayak gonflable — 10€/jour
L'univers RB-CapSO
Voyager libre, c'est tout un art
Ancien pompier reconverti dans les Landes, je conçois des vans pour un usage réel. Chaque détail est pensé pour que vous profitiez pleinement — du premier au dernier jour.
Ajoutez ici votre vidéo de présentation (remplacez par <video> ou iframe YouTube)
Vans dans les Landes · RB-CapSO
À propos
Artisan du voyage
Reconverti dans le sud des Landes en 2025, j'ai créé RB-CapSO avec une envie simple : donner un autre sens à mon quotidien en réunissant ce qui m'anime profondément.
Autodidacte et passionné, je conçois et aménage des vans pensés pour un usage réel, avec une attention particulière au travail du bois et à l'optimisation de l'espace.
Surfeur, randonneur, vététiste et snowboardeur — je m'inspire du terrain pour créer des véhicules que j'utiliserais moi-même.
Aménagement bois sur mesure
Installations électriques
Plomberie & douche
Isolation thermique
Optimisation espace
Conseil voyage
Contact
Une question ? Un projet ?
Devis gratuit, réponse sous 24h. Que ce soit pour louer un van ou concevoir l'aménagement de votre fourgon, je suis là pour vous accompagner.
Chaque aménagement est pensé depuis zéro, selon votre véhicule, vos usages et vos envies. Fourgon, van, camion, camping-car, tiny house sur roues — je travaille sur tout type de véhicule avec la même exigence artisanale.
Du simple meuble de rangement à l'aménagement complet clé en main, chaque réalisation combine travail du bois, isolation, électricité et plomberie dans un espace optimisé au centimètre.
`;
}
grid.innerHTML = html;
}
function pickDay(ds) {
if (picking === 'start' || (picking === 'end' && ds <= selStart)) {
selStart = ds; selEnd = null; picking = 'end';
} else {
// Check no booked in range
let d = new Date(parseD(selStart)); d.setDate(d.getDate()+1);
let conflict = false;
while (toYMD(d) < ds) {
if (isBooked(currentVehicle, toYMD(d))) { conflict = true; break; }
d.setDate(d.getDate()+1);
}
if (conflict) { showToast('⚠️ Période contenant des dates réservées'); return; }
selEnd = ds; picking = 'start';
}
renderCal();
updateBookingBar();
}
function updateBookingBar() {
const bar = document.getElementById('bookingBar');
if (!selStart || !selEnd) { bar.classList.add('hidden'); return; }
bar.classList.remove('hidden');
const nights = diffDays(selStart, selEnd);
const total = nights * VEHICLE_PRICES[currentVehicle];
document.getElementById('bookingDates').textContent = fmtFR(selStart) + ' → ' + fmtFR(selEnd);
document.getElementById('bookingDetails').textContent = nights + ' nuit' + (nights>1?'s':'') + ' · ' + VEHICLE_NAMES[currentVehicle] + ' · Total estimé : ' + total + '€';
}
function hideBookingBar() { document.getElementById('bookingBar').classList.add('hidden'); }
function clearSelection() {
selStart = null; selEnd = null; picking = 'start';
hideBookingBar(); renderCal();
}
function scrollToContact() {
document.getElementById('contact').scrollIntoView({behavior:'smooth'});
}
function prevMonth() { calMonth--; if(calMonth<0){calMonth=11;calYear--;} renderCal(); }
function nextMonth() { calMonth++; if(calMonth>11){calMonth=0;calYear++;} renderCal(); }
// ═══════════════════════════════════════════════════════
// TABS
// ═══════════════════════════════════════════════════════
function switchCalTab(tab) {
document.querySelectorAll('.tab').forEach((t,i) => t.classList.toggle('active', (i===0 && tab==='locataire') || (i===1 && tab==='admin')));
document.getElementById('cal-tab-locataire').classList.toggle('active', tab==='locataire');
document.getElementById('cal-tab-admin').classList.toggle('active', tab==='admin');
}
// ═══════════════════════════════════════════════════════
// ADMIN
// ═══════════════════════════════════════════════════════
let currentFilter = 'all';
let editingId = null;
function adminLogin() {
const pwd = document.getElementById('adminPwd').value;
if (pwd === ADMIN_PASSWORD) {
document.getElementById('adminGate').style.display = 'none';
document.getElementById('adminPanel').classList.add('visible');
renderAdmin();
} else {
document.getElementById('loginError').style.display = 'block';
document.getElementById('adminPwd').value = '';
}
}
function adminLogout() {
document.getElementById('adminGate').style.display = 'block';
document.getElementById('adminPanel').classList.remove('visible');
document.getElementById('adminPwd').value = '';
document.getElementById('loginError').style.display = 'none';
}
function renderAdmin() {
renderStats();
renderResList();
}
function renderStats() {
const res = loadReservations();
const confirmed = res.filter(r => r.statut === 'confirmee');
const options = res.filter(r => r.statut === 'option');
const today = toYMD(new Date());
const upcoming = confirmed.filter(r => r.start >= today);
// Calcul CA
let ca = 0;
confirmed.forEach(r => {
const n = diffDays(r.start, r.end);
ca += n * (VEHICLE_PRICES[r.vehicle] || 0);
});
document.getElementById('statsGrid').innerHTML = `
${confirmed.length}
Réservations confirmées
${options.length}
Options en attente
${upcoming.length}
À venir
${ca.toLocaleString('fr-FR')}€
CA total estimé
`;
}
function renderResList() {
const all = loadReservations();
let res = all;
if (['penelop','peggy','tente'].includes(currentFilter)) res = all.filter(r => r.vehicle === currentFilter);
else if (['confirmee','option','annulee'].includes(currentFilter)) res = all.filter(r => r.statut === currentFilter);
// Sort by start date
res.sort((a,b) => a.start > b.start ? 1 : -1);
if (res.length === 0) {
document.getElementById('resList').innerHTML = '