Elena de Gregorio®
Disponible para 2026
EN ES

Trabajo / Front-end / GMF Reformas · La web nueva

Una web a la altura de la mejor reputación del pueblo

GMF Construcciones y Reformas lleva desde 1998 en Aranjuez y tiene la mejor valoración de la zona en Google: un 5,0 con treinta y tres reseñas. Su web, en cambio, era un Google Sites sin un solo botón de llamar. La auditoría dejó treinta hallazgos; la Fase 1 convirtió los importantes en un diseño aprobado en Figma; y esta es la Fase 2: la web entera, escrita a mano en HTML, CSS y JavaScript sin una sola librería, con un formulario que llega de verdad y una medición que sólo arranca si el visitante lo permite.

Desarrollo front-end · HTML, CSS y JS nativos + PHP — 2026

Proyecto 10 de 30 del archivo 01 de 10 en Desarrollo front-end Ver la disciplina completa ↗

La portada de la web nueva de GMF Reformas: el titular «Reformas en Aranjuez con fecha de entrega firmada por contrato», la valoración de Google, los dos botones de presupuesto y un baño reformado con dos espejos redondos

Cliente

GMF Construcciones y Reformas · Aranjuez, Madrid

Disciplina

Desarrollo front-end

Año

2026 · en revisión con el cliente

Rol

Arquitectura, maquetación, accesibilidad, formulario y medición

Alcance

12 páginas · 6 de servicio · 8 comparadores · 21 fotos de obra · 12 reseñas

Stack

HTML, CSS y JavaScript sin dependencias · PHP 8 para el formulario · generador en Python

Entregable

Sitio estático: 70 KB de CSS y 31 KB de JavaScript, sin librerías

De dónde viene

Auditoría digital → Fase 1, diseño UX/UI en Figma → Fase 2, esta

La web, a tamaño real · con contraseña

Está colgada en este mismo dominio, en vista previa privada, para que el cliente la revise

Mientras GMF decide qué cambia y qué no, la web no es pública: vive en una carpeta de este sitio, no se indexa y pide una contraseña antes de enseñar nada. Si la tienes, el botón te lleva dentro; si no, verás la puerta y nada más. Las capturas de aquí abajo cuentan el resto.

(01) — De qué se parte

Treinta hallazgos, un diseño aprobado y cero librerías

La web anterior era un Google Sites de cuatro páginas: ni un botón ni un teléfono clicable fuera de la página de contacto, un Google Form incrustado en un iframe ajeno como único formulario, y una plataforma que no deja insertar una sola línea de medición. La auditoría digital lo ordenó en cuatro bloques —conversión, competencia, cliente y accesibilidad— y en treinta hallazgos, empezando por los que no cuestan dinero. Lo que vendía GMF no estaba en su web: estaba en sus reseñas.

La Fase 1 llevó eso a Figma —el diseño UX/UI de la web, en alta fidelidad— y el cliente lo aprobó. La Fase 2 es convertir ese diseño en una web que se pueda publicar en un hosting compartido corriente, sin frameworks, sin gestor de contenidos y sin ninguna dependencia que caduque: HTML, CSS y JavaScript propios, y un único fichero PHP para recibir el formulario. Lo que el cliente paga es la web, no una suscripción.

12

Páginas estáticas

Portada, seis de servicio, gracias, 404 y tres legales
0

Librerías de terceros

Ni jQuery, ni un framework, ni un plugin: 101 KB de CSS y JS propios
0

Incidencias en axe-core

WCAG 2.1 A/AA en las doce páginas, escritorio y móvil
100

Lighthouse en escritorio

Rendimiento 100 · accesibilidad 100 · buenas prácticas 96 · SEO 100. En móvil, 91 de rendimiento

La identidad viene de la marca, no se inventa aquí

El verde y la piedra del arco salen del logotipo; el dorado del lema «Superación y compromiso» se queda como color decorativo porque sobre fondo claro no llega al contraste exigible, y para el texto existe un dorado más oscuro que sí llega. Los titulares van en Poiret One, en mayúsculas e interletradas, y como esa familia sólo existe en un peso y sin cursiva, los destacados se marcan en verde con un subrayado dorado en vez de con una negrita que no existe. El texto es Manrope a 18 píxeles de base.

(02) — Cómo está montado

Una portada que vende lo que las reseñas ya decían

La portada recorre, en el orden en que un cliente decide, lo que la auditoría había señalado como argumento: la valoración de Google arriba del todo, la fecha de entrega firmada por contrato en el titular, cinco garantías por escrito, los seis tipos de obra, el antes y después, la obra real, el proceso en cinco pasos, las opiniones, los precios de partida, la zona y las preguntas que todo el mundo hace antes de reformar. Y al final, el formulario.

Los años de oficio no están escritos: se calculan desde 1998, para que la web no se quede vieja cada enero. Y las cifras se ven con JavaScript apagado, que era un fallo de la versión anterior: antes aparecía un «0».

01 · Seis servicios, seis páginas, un solo origen

Cada tarjeta de «Qué reformamos» abre su página: baños, cocinas, integrales, buhardillas y tejados, piscinas y exteriores, accesibilidad. Las seis tienen la misma estructura —portada con foto, qué incluye, antes y después, galería, plazos y precio, preguntas, otros servicios y el formulario con el tipo de reforma ya preseleccionado— y las seis salen de un único fichero Python que describe cada servicio y las genera.

Lo mismo pasa con la portada: se escribe en un HTML fuente con tres macros —IMG, CMP y GAL— y el generador las convierte en <picture> con sus tres anchos, en comparadores y en tarjetas de galería, leyendo el tamaño real de cada foto para escribir el width y el height. Nadie teclea un srcset a mano, y por eso ninguno está mal.

_src · build.py · servicios.py · index.src.htmlPillow lee las medidas · 418 ficheros de imagen generados

La sección «Qué reformamos»: seis tarjetas con fotografía —baño, cocina, reforma integral, buhardillas y tejados, piscinas y exteriores, accesibilidad— y un enlace a la página de cada una
Qué reformamos · seis tarjetas, seis páginasGeneradas desde servicios.py con el formulario preseleccionado

02 · El antes y después, con un control que entiende el teclado

Ocho comparadores de obras reales, cuatro a la vista y cuatro más al pulsar. Cada uno es un <input type="range"> invisible que cubre la foto: funciona con ratón, con el dedo y con las flechas del teclado, y le dice al lector de pantalla en qué punto está. No hay librería de comparación; hay un control nativo bien colocado.

Al entrar en pantalla, el separador se mueve solo una vez. Es la pista de que aquello se puede arrastrar, y no vuelve a hacerlo. Con «movimiento reducido» activado en el sistema, ni eso.

js/main.js · comparadoresUn range nativo por foto · teclado y lector de pantalla

La sección «El cambio, con tus propios ojos»: cuatro comparadores de antes y después con el separador en el centro, las etiquetas Antes y Después y el pie con la localidad y la duración de cada obra
Antes y después · ocho obras, cuatro visiblesEl separador es un range nativo: ratón, dedo y flechas

03 · Obra real, en casas reales: la galería y su visor

La auditoría lo decía sin rodeos: en una empresa de reformas, la foto es el argumento. Veintiuna fotografías de obra propia, ninguna de banco de imágenes, con filtros por tipo —baños, cocinas, integrales, exteriores, buhardillas— y un visor en <dialog> nativo que atrapa el foco, se cierra con Esc y pasa de foto con las flechas.

Y pesan lo que deben: cada foto existe en tres anchos —480, 960 y 1.400 píxeles— y en dos formatos, WebP con JPG de respaldo, con sus medidas escritas para que la página no salte al cargar. La única imagen que no espera es la del hero, que va precargada.

index.html · galería · js/main.js · visor21 fotos · 5 filtros · <dialog> con foco atrapado

La sección «Obra real, en casas reales»: la barra de filtros —Todos, Baños, Cocinas, Integrales, Exteriores, Buhardillas— y la cuadrícula de fotografías de obra con su etiqueta y localidad
Nuestros trabajos · 21 fotos con filtrosTres anchos y dos formatos por foto · visor accesible

04 · Las opiniones, en una banda oscura y con la nota de Google delante

Doce reseñas reales de Google, citadas con nombre e inicial, en un carrusel con controles, con el estado anunciado al lector de pantalla y que se para si el sistema pide movimiento reducido. La puntuación —5,0 con 33 reseñas— va en una tarjeta propia con el enlace a la ficha de Google Maps, porque la credibilidad de una nota está en poder comprobarla.

La sección es oscura a propósito. Es la única de la portada que lo es, y por eso se ve: la Fase 1 la diseñó como el momento en que la página cambia de voz y habla el cliente.

index.html · opiniones · js/main.js · carrusel12 reseñas · controles, estado anunciado, pausa con movimiento reducido

La sección de opiniones sobre fondo verde oscuro: el titular «La mejor valoración de Aranjuez», la tarjeta con el 5,0 y las 33 reseñas verificadas en Google, y el carrusel con tres opiniones de clientes
Opiniones · doce reseñas reales de GoogleLa nota con enlace a la ficha: lo que se afirma, se puede comprobar

05 · Precios de partida y financiación, porque nadie en la zona los publica

La auditoría lo ponía en la tabla de lo que un cliente busca y no encontraba: orientación de precio, «no existe»; opiniones, «no existe». Aquí hay tres rangos orientativos —baño, cocina e integral— con lo que incluye cada uno y un aviso claro de que el precio cerrado llega tras la visita. Y un bloque de financiación, porque uno de cada tres clientes de reformas la pediría y, de las dieciséis empresas del corredor sur que miró el benchmarking, sólo una la ofrece.

Los importes están marcados como provisionales hasta que GMF los valide; la ficha lo dice más abajo, en lo que falta.

index.html · precios3 rangos · financiación · nota de que son orientativos

La sección «Cuánto cuesta tu reforma»: tres tarjetas de precio —baño desde 6.500 €, cocina desde 8.900 € destacada en dorado, e integral desde 550 €/m²— con lo que incluye cada una, y debajo el bloque de financiación
Precios orientativos · tres rangos y financiaciónCasi nadie en la zona publica un precio; esta web, sí

06 · Un formulario que llega, y que sabe decir cuando no

Cuatro campos obligatorios, un mensaje opcional y la casilla de privacidad. El navegador valida primero y pone el foco en el primer error; después el envío va por fetch a un único fichero PHP del propio hosting que vuelve a validar todo, porque la validación del navegador se puede saltar. Si el servidor rechaza un campo, el error aparece debajo de ese campo, no en un mensaje genérico.

Contra el spam, tres capas silenciosas: un campo trampa invisible, un tiempo mínimo de tres segundos —ningún humano rellena cuatro campos en menos— y un máximo de cinco envíos por hora e IP. Al bot se le dice que todo ha ido bien y no se hace nada. Cada solicitud se guarda además en un CSV por si el correo falla, y el consentimiento queda registrado con fecha, versión de la política e IP anonimizada con sal: lo que el RGPD pide y casi nadie hace.

api · presupuesto.php · config.phpValidación doble · 3 capas antispam · registro RGPD · copia en CSV

La sección de contacto: a la izquierda los tres canales —teléfono en oscuro, WhatsApp en verde y correo— con el horario y la dirección; a la derecha la tarjeta del formulario «Pide tu presupuesto gratis» con nombre, teléfono, tipo de reforma, localidad, mensaje y la casilla de privacidad
Contacto · tres canales y el formularioValidación en el navegador y otra vez en el servidor

07 · En el teléfono, que es donde se pide una reforma

Siete de cada diez visitas a una web de reformas llegan desde el móvil, y la auditoría describía el sitio anterior como «reducido a móvil, no optimizado», así que lo que más se midió fue a 390 píxeles. Una barra fija abajo con Llamar, WhatsApp y Presupuesto; un menú a pantalla completa, en oscuro, con esos tres canales siempre al final; y el aviso de cookies compacto, que ya no tapa ni el titular ni la barra.

Dos decisiones pequeñas que se notan: en móvil desaparece el botón flotante de WhatsApp, porque ya está en la barra y tapaba los botones; y la cabecera se compacta entre 961 y 1.520 píxeles para que «Presupuesto gratis» no se corte en un portátil. La v6.1 arregló además un menú que el desenfoque de la cabecera encerraba en una caja de 76 píxeles: los tres primeros enlaces quedaban fuera de pantalla sin poder pulsarse.

css/styles.css · bloque v6 · js/main.js · menúSin desbordamiento horizontal a 390 px en ninguna página

La misma web a 390 píxeles en tres pantallas: la portada con la valoración de Google y el titular, el comparador de antes y después, y el formulario de presupuesto; en las tres, la barra fija de abajo con Llamar, WhatsApp y Presupuesto
La misma web a 390 px, en tres pantallasBarra fija con Llamar · WhatsApp · Presupuesto

08 · Las páginas de servicio, con la obra en vídeo

Cada servicio tiene su página con su foto precargada, su «qué incluye», sus comparadores, su galería, sus plazos y su precio. Dos de ellas llevan además vídeo de obra grabado por el propio equipo: un baño con lavadora integrada, por dentro, y en la de reformas integrales el mismo piso antes y después, en dos vídeos en pareja.

Los vídeos se reproducen en silencio al entrar en pantalla y se paran al salir; no arrancan si el sistema pide ahorro de datos o movimiento reducido; y el botón «Sonido» activa el audio de uno y silencia los demás. Vienen de originales de WhatsApp pasados por ffmpeg: de 8 y 15 MB a 3,9 y 4,9, con la portada sacada de un fotograma del propio vídeo y sus datos estructurados de VideoObject.

_src/servicios.py · clave video · js/main.js · vídeoReproducción al entrar en pantalla · un sonido a la vez

La portada de la página de reforma de baños: la miga «Inicio / Servicios / Baños», el titular «Baños nuevos en 2–3 semanas, con fecha firmada», el texto de apoyo, los botones de presupuesto y una fotografía de un baño reformado
Reforma de baños · la página de servicioFoto precargada, formulario preseleccionado, mismo esqueleto en las seis
La sección de vídeo de la página de baños: el titular «Un baño con lavadora integrada, por dentro», el texto que lo explica y el vídeo vertical con su portada y el botón de sonido
Un baño con lavadora integrada, por dentroDe 8 MB a 3,9 · silencio al entrar, sonido si se pide

Nada se carga sin permiso, y la medición tampoco

De serie, la web no habla con nadie más que con Google Fonts. Tag Manager y Microsoft Clarity sólo se cargan si el visitante acepta las cookies, con Consent Mode v2 denegado por defecto. Lo que sí hay desde el primer momento es el plan de medición de la auditoría, escrito en dataLayer: clic en teléfono, en WhatsApp y en los botones de presupuesto —con la zona de la página donde ocurre cada uno—, salida a Google Maps, inicio, error y envío del formulario, la conversión confirmada en la página de gracias y la profundidad de lectura al 25, 50, 75 y 90 %. Cuando GMF pegue sus identificadores, no habrá que tocar una línea.

(03) — Rendimiento, accesibilidad y buscadores

Lo que se comprobó antes de enseñarla

Una web de reformas se abre en el móvil, en la calle, con datos. Por eso el rendimiento no es una nota de Lighthouse: es que la foto del hero esté precargada, que todo lo demás se cargue cuando toca, que nada salte al aparecer —CLS de cero en todas las páginas medidas— y que los estáticos lleven un año de caché, con el número de versión en la URL para que un cambio se vea el primer día.

La accesibilidad se midió con axe-core en las doce páginas, en escritorio y en móvil, y quedó a cero. No por una pasada final: el contraste de cada color está calculado desde los tokens, el foco se ve, los objetivos táctiles miden 44 píxeles, y los dos componentes que suelen fallar —el comparador y el visor de fotos— se manejan con teclado y le cuentan al lector de pantalla lo que están haciendo.

0

De CLS

Ninguna página salta al cargar: cada imagen lleva sus medidas
91

Rendimiento en móvil

Y 100 · 96 · 100 en accesibilidad, buenas prácticas y SEO
4,5:1

Contraste mínimo

El verde sobre el papel llega a 5,5:1; el dorado del texto, a 5:1
11

Redirecciones 301

Las direcciones del Google Sites antiguo llegan a su sección nueva, no a un 404

Google no se entera de que la web ha cambiado de sitio

El .htaccess fuerza HTTPS y www —una sola dirección canónica— y redirige con 301 cada una de las URL antiguas, acentos incluidos, a la página o la sección que le corresponde ahora: «quiénes somos» a las garantías, «nuestros trabajos / reforma integral de baño» a la página de baños. Las páginas llevan datos estructurados de HomeAndConstructionBusiness con la nota de Google, el horario y los diez municipios, y la portada, además, un FAQPage con las ocho preguntas. El sitemap se fecha solo al construir.

(04) — Lo que falta, y por qué se dice

Una web en revisión que no disimula que lo está

Esto no está publicado todavía: está en una vista previa privada, con contraseña, para que el cliente la recorra con calma y diga qué cambia. Lo que queda no depende del código. Faltan por validar los pies de foto y las localidades, las cifras de obra —«800 obras», «300 baños»—, los cuatro precios de partida, la razón social y el CIF del pie y de los textos legales, la revisión jurídica de esos textos, los nombres de las doce reseñas, los identificadores de medición y el destinatario definitivo del formulario.

Mientras tanto, cada una de esas cosas está marcada en el código y en el README, entre corchetes o con una casilla, y el formulario de la vista previa envía las solicitudes al estudio, no al cliente, para que se pueda probar de principio a fin sin que una prueba se convierta en un presupuesto. Cuando GMF dé el visto bueno, la publicación es copiar la carpeta al hosting de reformasgmf.com y rellenar un fichero de configuración.

117 MB

Pesa la vista previa entera (v9)

Casi todo son las fotos de obra en sus tres anchos y dos formatos, más los dos vídeos
1

Fichero de configuración

Destinatarios, remitente y sal: lo único que cambia al publicar
3

Versiones el mismo día

v6, v6.1 y v6.2: el menú móvil, «Inicio» en las interiores y los vídeos de la integral
9

Casillas pendientes del cliente

Textos, precios, CIF, legales, reseñas, formulario, analítica y dominio

Cómo se enseña una web que todavía no es pública

La vista previa vive en una carpeta de este mismo portfolio, detrás de una puerta en PHP: una contraseña, una cookie de treinta días y una regla de Apache que no deja pasar ninguna petición sin ella. Ocho intentos fallidos bloquean la IP un cuarto de hora. Las páginas llevan noindex y una cabecera que lo repite, y la carpeta está vetada en el robots.txt. El cliente ve la web en su dominio de verdad, con su formulario funcionando, y nadie más la encuentra.

La web, funcionando

Aquí debajo está la web entera, en el marco de siempre. Lo primero que verás es la puerta: escribe la contraseña y el marco carga la portada. Arrastra un comparador, filtra la galería, abre una foto en grande y prueba a enviar el formulario con un teléfono de ocho cifras.

Y usa el control de arriba a la derecha: pon el marco a tamaño teléfono y verás aparecer la barra fija de abajo y el menú a pantalla completa. No hay escalado; se le está entregando un ancho distinto.

Aviso · vista previa con contraseña

Esta copia es la versión 9 real, la última tras la revisión de contenidos con el cliente, con los datos que GMF aún no ha cerrado: los precios, las cifras de obra y los textos legales son provisionales, y la web lo dice donde toca. El formulario funciona de principio a fin, pero mientras dure la revisión las solicitudes llegan al estudio, no a GMF. Sin la contraseña, el marco se queda en la puerta.

reformasgmf.com — v9, vista previa

HTML, CSS y JS propios · PHP para el formulario · 70 KB de CSS y 31 KB de JavaScript · 0 librerías

De dónde sale

Esta ficha es la tercera de un mismo cliente. La primera es la auditoría digital: cuatro bloques, treinta hallazgos y la frase que lo resume —la mejor reputación del pueblo y la peor web del mercado—. La segunda es la identidad: el logotipo, el verde, la piedra del arco y el dorado del lema, que esta web hereda tal cual. Entre las dos y esta hubo una Fase 1 en Figma, el diseño UX/UI en alta fidelidad que el cliente aprobó.

Hacer las tres cosas cambia cómo se hace cada una. Quien escribe una auditoría sabiendo que la va a implementar deja de redactar recomendaciones y empieza a redactar cosas que se pueden terminar; y quien dibuja una marca sabiendo que la va a maquetar la dibuja con tokens. El resultado es una web que no tiene nada que no se haya decidido antes, y una vista previa en la que el cliente puede comprobar, botón a botón, que lo que se le prometió en un informe está ahí.

Siguiente en Desarrollo front-end

Retina · GAME TV — reconstrucción de interfaz en Next.js