Calcular el último día real del mes evita cobros que no salen o salen tarde. En febrero, ese fallo aparece dos veces al año.
Escrito línea a línea. Para ti.
Webs, paneles y aplicaciones internas construidos en torno a tu proceso. Sin plantillas ni plugins que arrastran peso.
// Fecha de cobro: el último día real del mesexport function chargeDate(key: string, offset = 0): string { const year = Number(key.slice(0, 4)) const month = Number(key.slice(5, 7)) const charge = new Date(year, month + offset - 1, 1) const cy = charge.getFullYear() const cm = charge.getMonth() + 1 // El día 0 del mes siguiente devuelve el último de este, // así un 31 nunca se desborda al mes que viene. const lastDay = new Date(cy, cm, 0).getDate() const mm = String(cm).padStart(2, "0") return `${cy}-${mm}-${lastDay}`}
// Contador animado. Si el usuario pide reducir// movimiento, se escribe la cifra final y punto.const animateCount = el => { const target = parseFloat(el.dataset.count) const t0 = performance.now(), dur = 1400 const tick = now => { const p = Math.min(1, (now - t0) / dur) el.textContent = Math.floor((1 - (1 - p) ** 3) * target) if (p < 1) requestAnimationFrame(tick) } requestAnimationFrame(tick)}// Solo arranca cuando la cifra entra en pantalla
// El brillo que sigue al cursor solo se activa donde// hay cursor real. En móvil ni se registra el evento,// que es donde más cuesta cada milisegundo de más.if (matchMedia('(pointer:fine)').matches) { document.querySelectorAll('[data-spotlight]').forEach(el => { el.addEventListener('mousemove', e => { const r = el.getBoundingClientRect() el.style.setProperty('--mx', (e.clientX - r.left) + 'px') el.style.setProperty('--my', (e.clientY - r.top) + 'px') }) })}// El CSS pinta el degradado en esas coordenadas
// Cada persona escribe su móvil de una forma.// Lo normalizamos al formato internacional antes// de enviarlo, para no perder un contacto.function normalizePhone(raw) { const d = raw.replace(/\D/g, '') if (d.startsWith('34') && d.length === 11) return '+' + d if (d.length === 9) return '+34' + d return '+' + d}// Y solo después se valida, ya normalizadoconst phone = normalizePhone(input.value.trim())if (phone.replace(/\D/g, '').length < 9) { return show('Introduce un número válido.')
Desde una web corporativa hasta el sistema que mueve tu operativa.
Mismo criterio técnico en todo, tanto si son cinco páginas como si es un panel con usuarios y permisos.
Cuatro decisiones que no se ven en una demo.
El código de arriba es real y está en producción. Esto es lo que evita cada fragmento, que es lo que de verdad te acaba importando.
Si alguien tiene activado reducir movimiento en su sistema, ve la cifra final directamente. La accesibilidad no es una casilla, es código.
El efecto que sigue al cursor ni siquiera se registra donde no hay cursor. Menos trabajo para el móvil, más fluidez donde más cuesta.
Cada persona escribe su móvil de una forma. Normalizarlo antes de enviarlo evita perder contactos por un espacio de más.
Todos prometen velocidad. Nosotros la medimos.
Web real que hemos construido, medida con Lighthouse, la herramienta del propio Google. Sin retoques.
El rendimiento no es un extra que se añade al final. Sale de decidir bien desde el principio: qué carga y cuándo, cuánto pesa cada imagen, qué scripts sobran de verdad.
Por eso una plantilla con quince plugins nunca llega a estos números, por mucho que se le instale un optimizador encima.
Tu web compite por dos cosas a la vez: que Google te coloque arriba y que quien entra no se marche antes de leerte. Las dos dependen de que cargue rápido. Por eso lo medimos y te enseñamos el informe, en vez de decirte que quedó muy bonita.
¿Tienes un proceso que ninguna herramienta cubre?
Cuéntanoslo y te decimos qué construiríamos, por fases y qué verías funcionando primero.
Decisiones técnicas que te ahorran dinero en dos años.
- Tipado estricto donde importa. TypeScript en la lógica de negocio: los errores aparecen al escribir el código, no cuando un cliente intenta pagar.
- Sin dependencias de más. Cada librería que se añade es peso, superficie de fallo y una actualización futura. Si se resuelve con veinte líneas propias, se escriben.
- Degradación elegante. Si falla un script externo o el usuario navega con el teclado, la web sigue siendo usable. No es opcional, es parte del trabajo.
- Datos estructurados y semántica correcta. Lo que hace que Google y las IA entiendan qué eres, en vez de adivinarlo.
- Todo versionado. Cada cambio queda registrado y es reversible. Si algo se rompe, se sabe qué lo rompió y se vuelve atrás.
Todo el mundo dice que el código es tuyo. Esto es lo que significa aquí.
Si un día decides seguir con otro equipo, te vas con todo funcionando. Sin rehenes.
Desde el primer commit, no un ZIP al final del proyecto. Ves cada cambio según se hace, no cuando te lo entregamos.
Cómo se despliega, cómo se configura y dónde está cada cosa. Para que otro equipo pueda continuar sin arqueología.
Dominio, hosting y cuentas de servicio a nombre de tu empresa, no de la agencia. Es tu infraestructura.
No hay contrato que te ate ni licencia propietaria que caduque si te vas. Nos quedamos porque quieras, no porque no puedas salir.
Con qué está hecho.
Elegimos según el problema, no según la moda. Si tu caso pide algo distinto de esta lista, lo decimos.
Lo que suele preguntarse antes de encargar un desarrollo.
¿Hacéis también páginas web, no solo aplicaciones? +
¿Por qué a medida y no una plantilla? +
¿El código es mío? +
¿Cuánto tarda? +
¿Nos cuentas qué necesitas construir?
En 15 minutos te decimos si tiene sentido hacerlo a medida y cómo lo enfocaríamos. Sin compromiso.
Cuéntanos tu caso →