<!-- Portada: la imagen es lo primero que se pinta. --> <section class="hero grid gap-6 py-24">- <img src="portada.jpg" class="w-full rounded-xl">+ <img src="portada.avif" class="w-full rounded-xl"+ width="1600" height="900" decoding="async"+ fetchpriority="high" alt="Cocina en Chamberí"> <h1 class="text-5xl font-semibold tracking-tight"> Reformas integrales en Madrid, sin sorpresas </h1> <p class="max-w-prose text-lg text-neutral-400"> Presupuesto cerrado en 48 horas laborables. </p> <a href="/contacto" class="btn">Pedir presupuesto</a> </section>
Tu web va lenta o se ha quedado vieja: la arreglo o te la hago nueva
Primero la reviso gratis y te digo qué le pasa. Si tiene arreglo, te paso un presupuesto cerrado. Si sale mejor hacerla nueva, la rehago con uno de los planes, paso tu contenido y mantengo tus visitas de Google sin coste extra.
Para quién es
- Webs que tardan en cargar y pierden visitas por ello
- Webs donde actualizar un plugin da miedo
- Quien ha perdido posiciones en Google desde el último cambio
Para quién no es
- Webs recién hechas cuyo problema es el contenido y no el código
- Tiendas con lógica compleja de WooCommerce: para eso está el desarrollo a medida
Cómo lo hago
Primero, la revisión gratis
La miro yo, a mano: lo que tarda en cargar, si se puede usar con teclado y lector de pantalla y lo que lee Google. En menos de 48 horas laborables te digo los tres problemas que más cuestan y por dónde empezaría, con su precio.
Si tiene arreglo, presupuesto cerrado
Te digo qué arreglo, cuánto cuesta y cuánto tardo, por escrito y antes de tocar nada.
Si no, una web nueva con tu contenido
La rehago con el plan que encaje y paso tus textos, tus imágenes y tus entradas sin coste extra.
Sin perder tus visitas de Google
Cada dirección antigua lleva a su página nueva, comprobada una a una. Es justo donde las migraciones baratas se llevan por delante el posicionamiento.
Lo que cambio cuando reviso una web.
Siete ejemplos del tipo de cambio que sale de una revisión. A la izquierda lo que suele haber; a la derecha lo que dejo. El código es de ejemplo: los problemas son los de siempre.
.listado { display: grid; gap: 1rem; } -/* Tres saltos, y ninguno sabe cuánto sitio hay. */+/* La tarjeta mide su hueco, no la ventana. */-.tarjeta { padding: 16px; font-size: 18px; }+.listado { container-type: inline-size; }-+-@media (max-width: 900px) {+.tarjeta {- .tarjeta { padding: 12px; font-size: 16px; }+ padding: clamp(0.5rem, 2cqi, 1rem);-}+ font-size: clamp(0.875rem, 1.6cqi, 1.125rem);-+ border-radius: clamp(0.25rem, 1cqi, 0.75rem);-@media (max-width: 600px) {+}- .tarjeta { padding: 8px; font-size: 14px; }+-}+@container (min-width: 30rem) {+ .tarjeta { grid-template-columns: 8rem 1fr; }+}
export async function cargarListado() { const items = await db.producto.findMany({ where: { activo: true },+ // La categoría entra en la misma ida.+ include: { categoria: true }, }); - // Una consulta, y luego otra por item.- for (const item of items) {- item.categoria = await db.categoria- .findUnique({ id: item.categoriaId });- } return items; }
-<div class="menu__abrir"+<button class="menu__abrir"- onclick="abrirMenu()">+ type="button"+ aria-expanded="false"+ aria-controls="menu">+ <span class="sr-only">Abrir el menú</span> <span></span> <span></span>-</div>+</button> <nav id="menu" class="menu"> <a href="/servicios">Servicios</a> <a href="/proyectos">Proyectos</a> <a href="/precios">Precios</a> <a href="/contacto">Contacto</a> </nav>
<form method="post" action="/contacto"> <label for="email">Correo</label>- <input id="email" type="email"+ <input id="email" type="email"- name="email">+ name="email"+ aria-invalid="true"+ aria-describedby="email-error"> - <span class="error">+ <span class="error" id="email-error"+ role="alert"> Escribe un correo válido </span> <button type="submit">Enviar</button> </form>
<section class="listado"> <?php foreach ( $productos as $p ) : ?> <article class="tarjeta">- <img src="<?php echo $p['imagen']; ?>" alt="">+ <img src="<?php echo esc_url( $p['imagen'] ); ?>"- <h2><?php echo $p['nombre']; ?></h2>+ alt="<?php echo esc_attr( $p['nombre'] ); ?>">- <p><?php echo $p['descripcion']; ?></p>+ <h2><?php echo esc_html( $p['nombre'] ); ?></h2>- <a href="<?php echo $p['url']; ?>">+ <p><?php echo wp_kses_post( $p['descripcion'] ); ?></p>- Ver ficha de <?php echo $p['nombre']; ?>+ <a href="<?php echo esc_url( $p['url'] ); ?>">- </a>+ Ver ficha de <?php echo esc_html( $p['nombre'] ); ?>+ </a> </article> <?php endforeach; ?> </section>
// El esquema estaba escrito y no lo miraba nadie. const Lead = z.object({ nombre: z.string().min(2).max(80), email: z.email(), mensaje: z.string().min(10).max(2000), }); export async function POST({ request }) {- const datos = await request.json();+ const lead = Lead.safeParse(await request.json());- await guardarLead(datos);+ if (!lead.success) {+ return new Response(null, { status: 422 });+ }+ await guardarLead(lead.data); return new Response(null, { status: 204 }); }
Por dónde empezar
Primero
Radiografía de tu web
gratis
Te miro la web y en menos de 48 horas laborables te digo qué le pasa y qué arreglaría primero.
Pedir radiografíaDespués
Rehacer tu web vieja
590 €desde
Si la tuya no tiene arreglo, la rehago con uno de los planes. Paso tu contenido y mantengo tus visitas de Google sin coste extra.
Pedir presupuesto gratisPara que dure
Mantenimiento continuo
49 €al mes
Copias, actualizaciones, seguridad y aviso si la web se cae, desde el primer mes. Tres tramos, según cuánto quieras cambiar cada mes.
Ver precios
Para leer antes de decidir
¿Hablamos de tu proyecto?
Cuéntame qué necesitas y te doy una primera valoración en menos de 24 horas laborables.
Respuesta en 24 h laborables