/* RoomDetail.jsx — single room landing page Reads window.ROOM_ID ('01'..'05') set by the host HTML and renders a focused room sheet with photo, description, equipment and a "Reservar Habitación NN" CTA that deep-links to reservar.html?room=NN. Globals: React, Nav, Footer, Icon, useT, LangProvider */ function RoomDetailPage() { const { t, lang } = useT(); const id = window.ROOM_ID || '01'; const idx = parseInt(id, 10); const ROOMS = [ { id:'01', img:'img/hab-01.jpeg', tint:'#FFE4E0', floor:'pb', bath:'bath_private', baseLJ:90, baseVS:110, hk:'r01_h', subk:'r01_sub', dk:'r01_d', sizek:'r01_size', feat:['r01_f1','r01_f2','r01_f3','r01_f4','r01_f5'] }, { id:'02', img:'img/hab-02.jpeg', tint:'#F2EBDB', floor:'p1', bath:'bath_private', baseLJ:115, baseVS:140, hk:'r02_h', subk:'r02_sub', dk:'r02_d', sizek:'r02_size', feat:['r02_f1','r02_f2','r02_f3','r02_f4'] }, { id:'03', img:'img/hab-03.jpeg', tint:'#E5EAE0', floor:'p1', bath:'bath_shared_05', baseLJ:95, baseVS:115, hk:'r03_h', subk:'r03_sub', dk:'r03_d', sizek:'r03_size', feat:['r03_f3','r03_f4','r03_f5'] }, { id:'04', img:'img/hab-04.jpeg', tint:'#FFF3B8', floor:'p1', bath:'bath_private', baseLJ:105, baseVS:130, hk:'r04_h', subk:'r04_sub', dk:'r04_d', sizek:'r04_size', feat:['r04_f1','r04_f2','r04_f3','r04_f4','r04_f5'] }, { id:'05', img:'img/hab-05.jpeg', tint:'#F4F1EC', floor:'p1', bath:'bath_shared_03', baseLJ:85, baseVS:105, hk:'r05_h', subk:'r05_sub', dk:'r05_d', sizek:'r05_size', feat:['r05_f1','r05_f2','r05_f3','r05_f4','r05_f5'] }, ]; const room = ROOMS.find(r => r.id === id) || ROOMS[0]; const prev = ROOMS[(idx - 2 + ROOMS.length) % ROOMS.length]; const next = ROOMS[idx % ROOMS.length]; const floorTxt = t(room.floor === 'pb' ? 'floor_pb' : 'floor_p1'); const bathTxt = t(room.bath); const sizeTxt = t(room.sizek); const labelFrom = { es:'Consulta precio según fechas', en:'Price varies by dates', fr:'Prix selon les dates' }[lang] || 'Consulta precio según fechas'; const labelNight = { es:'/noche', en:'/night', fr:'/nuit' }[lang] || '/noche'; const labelCta = { es:`Reservar Habitación ${id}`, en:`Book Room ${id}`, fr:`Réserver Chambre ${id}` }[lang]; const labelBack = { es:'Volver al inicio', en:'Back to home', fr:'Retour à l\u2019accueil' }[lang]; const labelBuilding = { es:'¿Necesitas más espacio?', en:'Need more space?', fr:'Besoin de plus d\u2019espace ?' }[lang]; const labelBuildingP = { es:'Reserva el edificio completo para hasta 10 viajeros — cocina, salón, patio y las 5 habitaciones.', en:'Book the entire building for up to 10 guests — kitchen, lounge, courtyard and all 5 rooms.', fr:'Réservez le bâtiment entier pour 10 voyageurs — cuisine, salon, patio et 5 chambres.' }[lang]; const labelBuildingCta = { es:'Ver albergue completo', en:'See entire building', fr:'Voir l\u2019auberge entière' }[lang]; const labelOtherRooms = { es:'Otras habitaciones', en:'Other rooms', fr:'Autres chambres' }[lang]; const labelEquip = { es:'Equipamiento y características', en:'Equipment & features', fr:'Équipement et caractéristiques' }[lang]; const labelSpecs = { es:'Ficha rápida', en:'Quick specs', fr:'Fiche rapide' }[lang]; const labelDesc = { es:'La habitación', en:'About the room', fr:'À propos de la chambre' }[lang]; const labelSelf = { es:'Llave digital · Check-in autónomo', en:'Smart lock · Self check-in', fr:'Serrure digitale · Auto check-in' }[lang]; const labelDir = { es:'Reserva directa — sin comisiones', en:'Direct booking — no fees', fr:'Réservation directe — sans frais' }[lang]; const labelPromoH = { es:'10% extra con', en:'10% extra with', fr:'10% en plus avec' }[lang]; return (
); } function Spec({ k, v }) { return (
{k}
{v}
); } const D = { main:{ background:'#FAF8F2', minHeight:'100vh' }, /* hero */ hero:{ background:'#FAF8F2', padding:'40px 28px 56px' }, heroInner:{ maxWidth:1280, margin:'0 auto' }, back:{ display:'inline-flex', alignItems:'center', gap:8, fontFamily:'Montserrat, sans-serif', fontWeight:700, fontSize:12, letterSpacing:'.15em', textTransform:'uppercase', color:'#1A1A1A', textDecoration:'none', marginBottom:24, opacity:.7 }, heroGrid:{ display:'grid', gridTemplateColumns:'1.05fr 1fr', gap:48, alignItems:'center' }, imgWrap:{ position:'relative', aspectRatio:'4/5', borderRadius:24, overflow:'hidden', background:'#F4F4F4' }, img:{ position:'absolute', inset:0, width:'100%', height:'100%', objectFit:'cover' }, numTag:{ position:'absolute', top:18, left:18, fontFamily:'Montserrat, sans-serif', fontWeight:900, fontSize:30, padding:'4px 14px', color:'#1A1A1A', borderRadius:6, letterSpacing:'-0.02em' }, heroBody:{}, eyebrow:{ fontFamily:'Montserrat, sans-serif', fontWeight:700, fontSize:12, letterSpacing:'.25em', textTransform:'uppercase', color:'#9A9A9A' }, h1:{ fontFamily:'Montserrat, sans-serif', fontWeight:900, fontSize:'clamp(36px,4.5vw,64px)', lineHeight:.98, letterSpacing:'-0.02em', margin:'14px 0 10px', textTransform:'uppercase', color:'#1A1A1A' }, subTag:{ fontFamily:'Montserrat, sans-serif', fontWeight:700, fontSize:13, letterSpacing:'.1em', textTransform:'uppercase', color:'#FBB700', marginBottom:18 }, lede:{ fontFamily:'Inter, sans-serif', fontSize:17, lineHeight:1.55, color:'#2B2B2B', margin:'0 0 26px', maxWidth:560 }, specs:{ display:'grid', gridTemplateColumns:'repeat(2,1fr)', gap:'14px 24px', margin:0, padding:'18px 20px', background:'#fff', borderRadius:14, border:'1px solid #ECECEC' }, specItem:{ margin:0 }, specK:{ fontFamily:'Montserrat, sans-serif', fontWeight:700, fontSize:10, letterSpacing:'.15em', textTransform:'uppercase', color:'#9A9A9A', marginBottom:3 }, specV:{ margin:0, fontFamily:'Inter, sans-serif', fontSize:14, color:'#1A1A1A', fontWeight:500, lineHeight:1.4 }, /* detail */ detailWrap:{ padding:'56px 28px 80px', maxWidth:1280, margin:'0 auto' }, detailGrid:{ display:'grid', gridTemplateColumns:'1.5fr 1fr', gap:48, alignItems:'start' }, featLabel:{ fontFamily:'Montserrat, sans-serif', fontWeight:800, fontSize:12, letterSpacing:'.15em', textTransform:'uppercase', color:'#1A1A1A', marginBottom:16 }, feat:{ listStyle:'none', padding:0, margin:0, display:'flex', flexDirection:'column', gap:10 }, featLi:{ display:'flex', gap:12, alignItems:'flex-start', fontFamily:'Inter, sans-serif', fontSize:15, color:'#2B2B2B', lineHeight:1.5 }, featDot:{ flex:'0 0 auto', width:7, height:7, borderRadius:'50%', background:'#F5C801', marginTop:7 }, longP:{ fontFamily:'Inter, sans-serif', fontSize:16, lineHeight:1.65, color:'#2B2B2B', margin:0, maxWidth:640 }, /* price card */ priceCard:{ position:'sticky', top:24, background:'#fff', border:'1px solid #ECECEC', borderRadius:18, padding:'24px 22px 22px', boxShadow:'0 8px 28px rgba(0,0,0,.04)' }, priceTop:{ paddingBottom:18, marginBottom:18, borderBottom:'1px solid #ECECEC' }, priceLabel:{ fontFamily:'Montserrat, sans-serif', fontWeight:800, fontSize:13, letterSpacing:'.04em', textTransform:'uppercase', color:'#1A1A1A', marginBottom:8 }, priceRow:{ display:'flex', alignItems:'baseline', gap:6 }, priceN:{ fontFamily:'Montserrat, sans-serif', fontWeight:900, fontSize:42, lineHeight:1, color:'#1A1A1A', letterSpacing:'-0.02em' }, priceUnit:{ fontFamily:'ui-monospace, monospace', fontSize:13, color:'#6B6B6B' }, priceSub:{ fontFamily:'Inter, sans-serif', fontSize:13.5, color:'#6B6B6B', lineHeight:1.45 }, cta:{ display:'flex', alignItems:'center', justifyContent:'center', gap:10, width:'100%', background:'#1A1A1A', color:'#F5C801', padding:'15px 18px', borderRadius:999, fontFamily:'Montserrat, sans-serif', fontWeight:800, fontSize:14, letterSpacing:'.04em', textTransform:'uppercase', textDecoration:'none', marginBottom:18 }, bullets:{ listStyle:'none', padding:0, margin:0, display:'flex', flexDirection:'column', gap:8 }, promo:{ display:'flex', alignItems:'center', justifyContent:'center', gap:8, margin:'0 0 16px', padding:'8px 12px', background:'#FFFBEA', border:'1px dashed #1A1A1A', borderRadius:8 }, promoTxt:{ fontFamily:'Inter, sans-serif', fontSize:12.5, color:'#1A1A1A' }, promoCode:{ fontFamily:'ui-monospace, monospace', fontWeight:800, fontSize:13, letterSpacing:'.12em', color:'#1A1A1A', background:'#F5C801', padding:'2px 8px', borderRadius:4 }, divider:{ height:1, background:'#ECECEC', margin:'20px 0' }, buildingMini:{ background:'#FFFBEA', borderRadius:12, padding:'14px 16px' }, buildingMiniH:{ fontFamily:'Montserrat, sans-serif', fontWeight:800, fontSize:13, textTransform:'uppercase', letterSpacing:'.02em', color:'#1A1A1A', marginBottom:6 }, buildingMiniP:{ fontFamily:'Inter, sans-serif', fontSize:13, color:'#4A4A4A', lineHeight:1.5, margin:'0 0 10px' }, buildingMiniCta:{ fontFamily:'Montserrat, sans-serif', fontWeight:700, fontSize:12, color:'#1A1A1A', textDecoration:'none', letterSpacing:'.05em', textTransform:'uppercase', borderBottom:'2px solid #F5C801', paddingBottom:2 }, /* other rooms */ others:{ maxWidth:1280, margin:'0 auto', padding:'0 28px 80px' }, othersLabel:{ fontFamily:'Montserrat, sans-serif', fontWeight:800, fontSize:12, letterSpacing:'.15em', textTransform:'uppercase', color:'#1A1A1A', marginBottom:16 }, othersGrid:{ display:'grid', gridTemplateColumns:'1fr 1fr', gap:16 }, otherCard:{ display:'block', background:'#fff', border:'1px solid #ECECEC', borderRadius:14, padding:'22px 24px', textDecoration:'none', color:'#1A1A1A' }, otherDir:{ fontFamily:'Montserrat, sans-serif', fontWeight:700, fontSize:10, letterSpacing:'.2em', textTransform:'uppercase', color:'#9A9A9A', marginBottom:8 }, otherN:{ fontFamily:'Montserrat, sans-serif', fontWeight:900, fontSize:48, lineHeight:1, color:'#1A1A1A', letterSpacing:'-0.02em', marginBottom:6 }, otherH:{ fontFamily:'Montserrat, sans-serif', fontWeight:800, fontSize:14, textTransform:'uppercase', color:'#1A1A1A' }, }; window.RoomDetailPage = RoomDetailPage;