Tu casa siempre lista. Sin que tengas que estar pendiente.
Equipo propio que limpia, lava y prepara cada vivienda antes del check-in.
Reportaje fotográfico de entrada y salida por WhatsApp, y facturación mensual
con cada ticket detallado.
);
}
// ===== Problem + Promise =====
function Problem() {
const qs = [
"Te tocó dejar una limpieza a medias.",
"Lavandería sin entregar el día del check-in.",
"Facturas opacas que nunca cuadran.",
];
const [active, setActive] = useState(-1);
const ref = React.useRef(null);
useEffect(() => {
if (!ref.current) return;
if (typeof IntersectionObserver === "undefined") {
setActive(qs.length);
return;
}
const obs = new IntersectionObserver((entries) => {
entries.forEach((e) => {
if (e.isIntersecting) {
qs.forEach((_, i) => {
setTimeout(() => setActive((a) => Math.max(a, i)), 200 + i * 420);
});
setTimeout(() => setActive((a) => Math.max(a, qs.length)), 200 + qs.length * 420);
obs.disconnect();
}
});
}, { threshold: 0.3 });
obs.observe(ref.current);
return () => obs.disconnect();
}, []);
return (
Lo que ya conoces
{qs.map((q, i) => (
= i ? "in" : ""}`} key={i}>
0{i+1}{q}
))}
= qs.length ? "in" : ""}`}>
Por eso existimos
Tú solo recibes reservas.
Del resto, nos ocupamos nosotros.
);
}
// ===== Servicio base =====
const BASE_SERVICES = [
{ icon: , name: "Limpieza de interiores y terraza",
desc: "Suelos, cocina, baños, salón, dormitorios y exterior. Cada estancia revisada con checklist propio antes de dar el servicio por cerrado." },
{ icon: , name: "Cambio de ropa de cama y toallas",
desc: "Sábanas, fundas, toallas grandes y de mano. Camas hechas con esquinas perfectas y toallas dobladas como en un hotel." },
{ icon: , name: "Lavandería y secado",
desc: "Recogida, lavado, secado y planchado. Trabajamos con stock rotatorio: nunca te quedas sin ropa de cama lista para la siguiente entrada." },
{ icon: , name: "Reposición de productos agotados",
desc: "Productos de limpieza y cortesía (gel, champú, papel higiénico, café, sal, aceite). Te avisamos siempre antes de comprar y pasamos los tickets en la factura mensual." },
{ icon: , name: "Reportaje fotográfico de entrada y salida",
desc: "Te llega por WhatsApp después de cada servicio. Una prueba visual de cómo dejamos la vivienda y de cómo la encontramos. Si algo no estaba bien al llegar, lo sabes en minutos.",
featured: true },
{ icon: , name: "Desplazamientos incluidos",
desc: "Sin coste extra por kilometraje dentro de nuestra zona habitual. Operamos en Madrid y alrededores todos los días del año." },
];
function BaseServices() {
return (
Servicio base
Qué incluye cada limpieza.
Un paquete claro y completo. Nada de letra pequeña, nada de "sorpresas"
en la factura. Esto entra siempre que nos contratas.
{BASE_SERVICES.map((s, i) => (
{String(i+1).padStart(2, "0")}
{s.icon}{s.name}
{s.desc}
))}
Entrada10:48
Salida13:21
);
}
// ===== Extras =====
const EXTRAS = [
{ icon: , title: "Mantenimiento",
items: ["Manitas y pequeñas reparaciones", "Albañilería puntual", "Carpintería y montajes", "Electricidad básica"] },
{ icon: , title: "Cuidado profundo",
items: ["Limpieza general fuera del paquete", "Tapicerías, sofás y colchones con máquina", "Lavandería extra: edredones, nórdicos, mantas"] },
{ icon: , title: "Decoración y puesta a punto",
items: ["Preparación de la vivienda al inicio de temporada", "Detalles de bienvenida y ambientación", "Reposición de menaje y textiles"] },
{ icon: , title: "Eventos en la vivienda",
items: ["Parrillero a domicilio", "Paellas", "Camareros para celebraciones", "DJs (bajo disponibilidad)"] },
];
function Extras() {
return (
Extras bajo presupuesto
Y todo lo demás, cuando lo necesitas.
Cubrimos lo que no entra en una limpieza habitual: una reparación,
una limpieza profunda fin de temporada, una preparación para una
celebración del propietario. Hablemos sobre lo que necesitas.
{EXTRAS.map((e, i) => (
{e.icon}
{e.title}
{e.items.map((it, k) =>
{it}
)}
))}
También gestionamos la asesoría energética de tu
vivienda para reducir la factura de la luz y el gas. Lo coordinamos nosotros.
);
}
// ===== Cómo trabajamos =====
const PROCESS = [
{ num: "01", title: "Coordinamos calendario",
desc: "Nos pasas las fechas o nos sincronizamos con tu calendario de reservas (Airbnb, Booking, tu PMS…). Sabemos cuándo entra el siguiente huésped antes que tú." },
{ num: "02", title: "Limpieza y puesta a punto",
desc: "Ejecutamos el servicio antes del check-in. Equipo propio, materiales propios, checklist completo." },
{ num: "03", title: "Reportaje fotográfico por WhatsApp",
desc: "Fotos de entrada y salida del servicio, por estancia. Te las enviamos por WhatsApp y quedan documentadas las incidencias si las hubiera." },
{ num: "04", title: "Factura mensual detallada",
desc: "Cada servicio listado con ticket de las compras realizadas. Cero opacidad, cero sorpresas a fin de mes." },
];
function Process() {
return (
Cómo trabajamos
Un proceso construido sobre la confianza.
Lo que más temen los propietarios es que un proveedor falle el día
del check-in. Nuestro proceso está pensado para que eso no pase.
{PROCESS.map((p) => (
{p.num}
{p.title}
{p.desc}
))}
);
}
function WhatsAppReport() {
return (
así te llega el reporte
DeTURIS Cleaning Services
ParaPropietario
Hoy11:42
Servicio completado · vivienda lista para el check-in
Hola, vivienda lista para el check-in de las 15:00.
Encontramos el sofá con una mancha de café, lo dejamos limpio. Adjuntamos fotos de entrada y salida. Reposición: papel higiénico (×4) y café (×1). Ticket en la factura mensual.
Garantizamos la realización de cada servicio.
Contamos con un equipo amplio que nunca deja una casa sin atender,
ni siquiera el día más complicado.
El equipo TURIS
TURIS Cleaning Services
);
}
// ===== Casas (galería de trabajo real) =====
// 15 huecos para viviendas. Rellena `src` con la foto cuando la tengas (mismo orden = mismo hueco).
// Fotos reales de viviendas que preparamos. Para añadir más: copia la imagen a
// assets/photos/ y añade aquí { src, cap } — la galería y el botón "ver completa"
// se ajustan solos.
const GALLERY = [
{ src: "assets/photos/piscina-pantano.jpg", cap: "Casa con piscina junto al embalse · San Martín de Valdeiglesias" },
{ src: "assets/photos/dormitorio.jpg", cap: "Dormitorio preparado con vistas a la sierra" },
{ src: "assets/photos/salon-cocina.jpg", cap: "Salón y cocina de chalet rural" },
{ src: "assets/photos/terraza-vistas.jpg", cap: "Terraza con vistas a la montaña" },
{ src: "assets/photos/example-living-before.jpg", cap: "Salón listo para el check-in" },
{ src: "assets/photos/example-bedroom-after.jpg", cap: "Habitación con toallas y cama hechas" },
];
const GALLERY_PREVIEW = 16;
function Gallery({ bare }) {
const photos = GALLERY.filter((g) => g && g.src);
const [showAll, setShowAll] = useState(false);
const visible = showAll ? photos : photos.slice(0, GALLERY_PREVIEW);
return (
{!bare && (
Nuestras viviendas
La variedad de casas que preparamos.
Pisos en ciudad, chalets en la sierra, casas con piscina junto al pantano.
Cada una con sus particularidades; todas listas a tiempo para el siguiente huésped.
);
}
// ===== FAQ =====
const FAQS = [
{ q: "¿Cobráis los desplazamientos?",
a: "No. Dentro de nuestra zona habitual —Madrid y alrededores— los desplazamientos van incluidos, sin coste por kilometraje." },
{ q: "¿Cómo es la facturación?",
a: "Una sola factura a final de mes con cada servicio detallado y los tickets de las compras (reposiciones). Te avisamos siempre antes de comprar nada y tú lo apruebas." },
{ q: "¿Trabajáis fines de semana y festivos?",
a: "Sí, todos los días del año salvo el 25 de diciembre y el 1 de enero. Atendemos urgencias e imprevistos cuando se entra o se sale en festivo." },
{ q: "¿Y si un huésped entra el mismo día que sale otro?",
a: "Lo coordinamos con tu calendario o tu PMS para que la vivienda esté lista antes del check-in. Contamos con un equipo amplio para no fallar ningún día, ni el más complicado." },
{ q: "¿Trabajáis con gestoras de alquiler vacacional?",
a: "Sí. Colaboramos con varias gestoras de la zona y nos adaptamos a su operativa y a sus tiempos." },
{ q: "¿Solo hacéis limpieza?",
a: "La limpieza es la base, pero también cubrimos lavandería, reposición, mantenimiento y manitas, decoración y puesta a punto, e incluso catering para eventos bajo consulta." },
];
function Faq() {
return (
Preguntas frecuentes
Lo que suelen preguntarnos.
Y si tienes cualquier otra duda, escríbenos por WhatsApp y te
contestamos en persona, sin centralitas ni esperas.
{FAQS.map((f, i) => (
{f.q}
{f.a}
))}
);
}
// ===== Contact (wizard de presupuesto, 5 pasos estilo Bliss) =====
const QUOTE_STEPS = [
{ key: "ubicacion", label: "Ubicación" },
{ key: "viviendas", label: "Viviendas" },
{ key: "servicios", label: "Servicios" },
{ key: "frecuencia", label: "Frecuencia" },
{ key: "contacto", label: "Contacto" },
];
const OPT_VIVIENDAS = ["1 vivienda", "2 – 3", "4 – 10", "11 – 25", "Más de 25"];
const OPT_SERVICIOS = ["Solo limpieza", "Limpieza + lavandería", "Pack completo (todo incluido)", "Aún no lo sé"];
const OPT_FRECUENCIA = ["Por cada reserva", "Semanal", "Quincenal", "Puntual · una vez", "Aún no lo sé"];
function Contact() {
const [step, setStep] = useState(0);
const [data, setData] = useState({ ubicacion: "", viviendas: "", servicios: "", frecuencia: "", nombre: "", telefono: "", email: "" });
const [consent, setConsent] = useState(false);
const [errors, setErrors] = useState({});
const [status, setStatus] = useState("idle");
const set = (k, v) => setData((d) => ({ ...d, [k]: v }));
const choose = (k, v) => {
set(k, v);
setErrors({});
setTimeout(() => setStep((s) => Math.min(s + 1, QUOTE_STEPS.length - 1)), 200);
};
const next = () => {
const e = {};
if (step === 0 && !data.ubicacion.trim()) e.ubicacion = "Indícanos la zona de tu vivienda";
if (step === 1 && !data.viviendas) e.choice = "Elige una opción para continuar";
if (step === 2 && !data.servicios) e.choice = "Elige una opción para continuar";
if (step === 3 && !data.frecuencia) e.choice = "Elige una opción para continuar";
setErrors(e);
if (Object.keys(e).length) return;
setStep((s) => Math.min(s + 1, QUOTE_STEPS.length - 1));
};
const back = () => { setErrors({}); setStep((s) => Math.max(s - 1, 0)); };
const submit = async (ev) => {
if (ev) ev.preventDefault();
const e = {};
if (!data.nombre.trim()) e.nombre = "Indícanos tu nombre";
const hasPhone = /^[\d +()-]{6,}$/.test(data.telefono);
const hasEmail = /^\S+@\S+\.\S+$/.test(data.email);
if (!hasPhone && !hasEmail) e.contact = "Déjanos un teléfono o un email para contactarte";
if (!consent) e.consent = "Necesitamos tu consentimiento para poder responderte";
setErrors(e);
if (Object.keys(e).length) return;
setStatus("sending");
await sendToTuris({
subject: "Presupuesto LIMPIEZA — solicitud desde la web",
fields: {
Concepto: "Presupuesto de limpieza",
Nombre: data.nombre,
Telefono: data.telefono || "—",
Email: data.email || "—",
Ubicacion: data.ubicacion || "—",
Viviendas: data.viviendas || "—",
Servicios: data.servicios || "—",
Frecuencia: data.frecuencia || "—",
Consentimiento: consent ? "Sí" : "No",
},
});
// Mostramos éxito al usuario en cualquier caso (si la clave Web3Forms no está
// configurada, queda en modo demo). Ver WEB3FORMS_ACCESS_KEY arriba.
setStatus("success");
};
if (status === "success") {
return (
Hemos recibido tu solicitud. Te respondemos en menos de 24 h con un presupuesto para {data.ubicacion ? {data.ubicacion} : "tu zona"}. Si lo prefieres, sigue por WhatsApp y te contestamos al momento.
);
}
// ===== Sketch filter (trazo a mano) — desplaza los trazos para que parezcan dibujados =====
function SketchDefs() {
return (
);
}
// ===== Floating WhatsApp (todas las páginas) =====
function WhatsAppFab() {
return (
¿Hablamos?
);
}
// ===== Servicios teaser (home) =====
function ServicesTeaser() {
return (
Qué hacemos
Todo lo que tu vivienda necesita.
Un paquete de limpieza claro y completo —limpieza, lavandería, reposición
y reportaje fotográfico— y todos los extras cuando hacen falta. Sin letra pequeña.
{BASE_SERVICES.map((s, i) => (
{s.icon}
{s.name}
))}
Y además: mantenimiento y manitas, decoración y puesta a punto, lavandería extra y eventos bajo consulta.
);
}
// ===== Pages =====
function HomePage() {
return (
);
}
function ServiciosPage() {
return (
);
}
function ZonasPage() {
return (
);
}
function CasasPage() {
return (
);
}
// ===== Asesoría energética (segundo formulario: luz/gas) =====
const OPT_ENERGIA = ["Luz", "Gas", "Luz y gas"];
function EnergyForm() {
const [interes, setInteres] = useState("");
const [data, setData] = useState({ nombre: "", telefono: "", email: "", suministro: "" });
const [consent, setConsent] = useState(false);
const [errors, setErrors] = useState({});
const [status, setStatus] = useState("idle");
const set = (k, v) => setData((d) => ({ ...d, [k]: v }));
const submit = async (ev) => {
if (ev) ev.preventDefault();
const e = {};
if (!interes) e.interes = "Dinos qué te interesa";
if (!data.nombre.trim()) e.nombre = "Indícanos tu nombre";
const hasPhone = /^[\d +()-]{6,}$/.test(data.telefono);
const hasEmail = /^\S+@\S+\.\S+$/.test(data.email);
if (!hasPhone && !hasEmail) e.contact = "Déjanos un teléfono o un email";
if (!consent) e.consent = "Necesitamos tu consentimiento para responderte";
setErrors(e);
if (Object.keys(e).length) return;
setStatus("sending");
await sendToTuris({
subject: "Presupuesto LUZ/GAS — solicitud desde la web",
fields: {
Concepto: "Presupuesto luz / gas (asesoría energética)",
Interes: interes,
Nombre: data.nombre,
Telefono: data.telefono || "—",
Email: data.email || "—",
Suministro_actual: data.suministro || "—",
Consentimiento: consent ? "Sí" : "No",
},
});
setStatus("success");
};
return (
Asesoría energética
¿Pagas de más por luz o gas?
Revisamos tu factura y te buscamos una tarifa mejor para la vivienda.
Sin compromiso y con un único interlocutor: nosotros. Es un trámite aparte
de la limpieza, por eso tiene su propio formulario.