codex/estilos-web-publica
codex/redisenio-dominio-musical
master
${ noResults }
4 Commits (master)
| Author | SHA1 | Message | Date |
|---|---|---|---|
|
|
34668a80e3 |
El panel se va a su propio dominio y su propio proceso
Estaba mal hecho y el síntoma era el `if` sobre `/admin` que acabó metido en el layout de la web pública: la web sabiendo que existe el panel, al revés de como debe ser. Ahora son dos aplicaciones del mismo repositorio. Lo que las separa son tres líneas de `vite.config.ts`: con `APP=panel`, las rutas salen de `src/panel/rutas`, los hooks de `src/panel/hooks.server.ts` y el resultado va a `build-panel/`. El servidor público se compila sin las rutas del panel, así que en `senzapaura.es` no es que `/admin` esté protegido: no existe, y hay una prueba que lo comprueba pidiéndolo. Comparten `src/lib` —esquema, consultas, acceso—, que es lo que evita mantener las migraciones por duplicado. Para que eso funcione, dos cosas que resolvían rutas del sitio salen de en medio: la navegación, a `$lib/navegacion`, y los tipos ambientales, que ahora son dos porque el `PageData` del sitio lleva carrito y favoritos y el del panel no. El precio de otro dominio es que el panel necesita su propia página de entrar: la cookie se emite para el host y no para el dominio padre, que es justo lo que hace que la sesión del panel no viaje en las peticiones de la web. Usa el mismo código de `$lib/server/auth`, con una diferencia: solo manda código a una cuenta que ya administre, y contesta lo mismo exista o no. Si dijera «esa cuenta no administra», el formulario sería una forma cómoda de averiguar cuál sí. Y con dominio propio, el 404 de ayer pasa a ser un 403 con el motivo escrito: esconder el panel de quien ya está en `admin.senzapaura.es` no engaña a nadie, y a esa rama solo llega alguien que administraba y ha dejado de administrar. Dos servidores en las pruebas, uno por proyecto, con su `baseURL`: una prueba del panel no puede pedir por accidente una página del sitio. Aparte, la prueba de contacto otra vez. El arreglo de ayer no valía —comprobar que el texto está escrito no impide que lo borren un instante después—, así que el layout marca con `data-hidratado` el momento en que Svelte toma el control y la prueba espera a eso. Quince pasadas con cuatro trabajadores, sin un fallo. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> |
4 weeks ago |
|
|
e26acff89e |
Página de «muy pronto» para quien llega de fuera
Con `PROXIMAMENTE=1`, quien no esté en la lista acaba en una página de espera con el mismo fondo animado que la portada. La red local entra siempre sin configurar nada: encender el portón y quedarse uno mismo fuera es la forma más rápida de no poder comprobar si funciona. Tres decisiones que salieron de probarlo: - **Redirige, no pinta la espera en la dirección pedida.** Se intentó lo segundo, que conserva la dirección en la barra, y no vale: el HTML sale compuesto para /proximamente y el navegador lo hidrata creyendo estar en otra ruta, así que al terminar de cargar volvía a pintar la cabecera y el pie que la espera no debe tener. - **503, no 200.** La web existe pero todavía no atiende. Es lo que impide que un buscador se lleve el cartel como si fuera el sitio. Y el robots.txt pasa a cerrar el paso entero mientras dure: si no, anunciaría un mapa lleno de direcciones que hoy contestan «muy pronto». - **Rutas de recursos absolutas.** Con las relativas que SvelteKit usa por defecto, la página servida en otra dirección pedía sus hojas de estilo en un sitio donde no hay ninguna. El reconocimiento de direcciones va aparte y con pruebas: una máscara mal interpretada no da ningún error, solo deja pasar a quien no debía. Ahí está el caso de `/0`, que en JavaScript se cuela porque el desplazamiento de 32 bits es un no-op. Y el portón está abierto mientras nadie diga lo contrario. Una web que se esconde sola porque falta una variable es peor fallo que una que se ve antes de tiempo: nadie mira una página que cree no publicada, así que puede pasar semanas caída sin que se note. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> |
4 weeks ago |
|
|
f248ad57da |
Llena el ancho de las páginas de texto en vez de ensancharlas
El ancho útil vuelve a 74rem (1184px). Se había subido a 88rem para aprovechar los monitores anchos y salió al revés: la prosa tiene una medida de lectura y no crece con el contenedor, así que lo único que creció fue el hueco a su derecha. Un vacío al lado de un texto no se tapa estirando el texto —probado: 129 caracteres por línea, ilegible— sino poniendo algo al lado: - Los textos legales van a tres columnas: los otros documentos, el que se lee y sus apartados. El índice de apartados sale del Markdown en bruto y las anclas las pone un plugin al compilarlo, así que hay pruebas de que las dos formas de calcularlas siguen coincidiendo. - El índice legal pasa de lista de renglones a rejilla de tarjetas, como el taller y los estilos; era el único listado que no se veía como los demás. - La bio lleva al lado lo que hay publicado —temas, discos y estilos, con sus enlaces—, sacado del catálogo y no escrito a mano, para que no se contradiga sola el día que se suba una canción. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> |
4 weeks ago |
|
|
c25d432d30 |
Web de Senza Paura: catálogo, taller, blog y tienda
Sitio del letrista y compositor, con SvelteKit 2 y Svelte 5. El catálogo es contenido, no base de datos: estilos, álbumes, canciones y capítulos son Markdown en `src/content/`, validados al compilar y compilados dentro del bundle, así que recorrer la música no hace ni una consulta. La base de datos guarda solo lo que generan las personas: cuentas, carritos, pedidos, compras, valoraciones y favoritos. Lo que hay: - Música agrupada por estilos, con página propia para cada estilo, álbum y tema, buscador y tabla ordenable. - Reproductor persistente que sobrevive a la navegación. Suena un fragmento; el archivo completo solo se obtiene comprando. - Taller de letras: los principios del oficio y una ficha de creación por estilo hispanoamericano. - Blog con feed RSS, y etiquetas que cruzan blog y catálogo. - Tienda con cuentas por código de correo, carrito, Stripe y descargas protegidas. - Panel de contenido en `/admin` que escribe los mismos Markdown. - Tema oscuro de marca y su inversión clara, aplicado antes de pintar. Lo que falta y no es código: las claves de Stripe y de correo, el tratamiento del IVA, las páginas de condiciones y privacidad, y el material real. Las canciones de ejemplo son inventadas y están para sustituirse; el audio son marcadores salvo un tema. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> |
1 month ago |