diff --git a/docs/auditoria-estilos-2026-09-13.md b/docs/auditoria-estilos-2026-09-13.md new file mode 100644 index 0000000..fa44d03 --- /dev/null +++ b/docs/auditoria-estilos-2026-09-13.md @@ -0,0 +1,278 @@ +# Auditoría y normalización de estilos + +Fecha de corte: 13 de septiembre de 2026. + +## Objetivo y criterio de aceptación + +La aplicación debe comportarse como un único sistema visual, no como una colección de páginas con CSS independiente. Un lote de normalización solo se considera terminado cuando: + +- reutiliza los tokens y patrones compartidos; +- no introduce marcos decorativos ni nuevas excepciones locales; +- conserva la jerarquía tipográfica y el significado de cada control; +- funciona en claro y oscuro; +- se comprueba a 390, 768, 1024 y 1440 px; +- supera `npm run audit:styles -- --strict` y las comprobaciones de Svelte correspondientes. + +## Línea base medida + +La medición procede de `scripts/auditar-estilos.mjs` sobre los archivos CSS y Svelte de `src`. La auditoría queda disponible mediante `npm run audit:styles`; con `--strict` falla si encuentra variables CSS sin declarar o pesos tipográficos que no existen en las fuentes cargadas. + +| Indicador | Línea base | +| ------------------------------- | ---------------------------------: | +| Archivos CSS/Svelte analizados | 132 | +| Archivos Svelte con estilos | 118 | +| Bloques ` diff --git a/src/lib/components/FormularioAcceso.svelte b/src/lib/components/FormularioAcceso.svelte index ac5b9b3..390b951 100644 --- a/src/lib/components/FormularioAcceso.svelte +++ b/src/lib/components/FormularioAcceso.svelte @@ -272,7 +272,7 @@ width: fit-content; font-family: var(--font-mono); font-size: var(--fs-base); - font-weight: 700; + font-weight: var(--font-weight-semibold); letter-spacing: 0.08em; } diff --git a/src/lib/components/Heroe.svelte b/src/lib/components/Heroe.svelte index 721386e..41bb033 100644 --- a/src/lib/components/Heroe.svelte +++ b/src/lib/components/Heroe.svelte @@ -186,7 +186,7 @@ margin-bottom: var(--sp-2); } .entradilla { - font-size: var(--fs-md); + font-size: var(--fs-base); } .disposicion { grid-template-columns: minmax(0, 1fr); diff --git a/src/lib/components/Icono.svelte b/src/lib/components/Icono.svelte index 9cec6ac..10723b3 100644 --- a/src/lib/components/Icono.svelte +++ b/src/lib/components/Icono.svelte @@ -66,6 +66,10 @@ cerrar: { tipo: 'linea', d: ['M6 6l12 12', 'M18 6 6 18'] }, menu: { tipo: 'linea', d: ['M4 7h16', 'M4 12h16', 'M4 17h16'] }, buscar: { tipo: 'linea', d: ['M21 21l-4.35-4.35', 'M19 11a8 8 0 1 1-16 0 8 8 0 0 1 16 0Z'] }, + filtros: { + tipo: 'linea', + d: ['M4 6h16', 'M4 12h16', 'M4 18h16', 'M8 3v6', 'M16 9v6', 'M10 15v6'] + }, externo: { tipo: 'linea', d: ['M14 3h7v7', 'M10 14 21 3', 'M19 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2h6'] diff --git a/src/lib/components/ListaVersiones.svelte b/src/lib/components/ListaVersiones.svelte index 7b7e524..9d3d4a9 100644 --- a/src/lib/components/ListaVersiones.svelte +++ b/src/lib/components/ListaVersiones.svelte @@ -94,7 +94,7 @@ } .nombre { - font-weight: 650; + font-weight: var(--font-weight-semibold); } .metadatos, diff --git a/src/lib/components/MapaDeGeneros.svelte b/src/lib/components/MapaDeGeneros.svelte index 44c1611..d87e222 100644 --- a/src/lib/components/MapaDeGeneros.svelte +++ b/src/lib/components/MapaDeGeneros.svelte @@ -408,8 +408,8 @@ */ vector-effect: non-scaling-stroke; transition: - fill 0.15s var(--suave), - stroke 0.15s var(--suave); + fill 0.15s var(--ease-standard), + stroke 0.15s var(--ease-standard); } /* Un país sin géneros no se pulsa, así que tampoco se ilumina. */ @@ -479,7 +479,7 @@ .punto { fill: transparent; stroke: none; - transition: opacity 0.15s var(--suave); + transition: opacity 0.15s var(--ease-standard); opacity: 0; } diff --git a/src/lib/components/ModalAcceso.svelte b/src/lib/components/ModalAcceso.svelte index 48012ab..7941ec0 100644 --- a/src/lib/components/ModalAcceso.svelte +++ b/src/lib/components/ModalAcceso.svelte @@ -62,7 +62,7 @@ --> acceso.cerrar()} @@ -73,7 +73,7 @@ if (evento.target === dialogo) acceso.cerrar(); }} > - + - acceso.cerrar()} aria-label="Cerrar"> + acceso.cerrar()} + aria-label="Cerrar" + > @@ -136,19 +141,6 @@ * `.marco`, centrado. Así el clic fuera se detecta sin poner un div extra * que tape el fondo nativo. */ - .acceso { - width: 100%; - max-width: 100%; - height: 100%; - max-height: 100%; - margin: 0; - padding: var(--sp-4); - border: none; - background: transparent; - overflow: auto; - place-items: center; - } - /* * El `display` va SOLO en el estado abierto. * @@ -159,26 +151,11 @@ * páginas del sitio, invisibles pero con su scroll y con su encabezado * contando en el esquema de la página. */ - .acceso[open] { - display: grid; - } - - .acceso::backdrop { - /* En variable: el minificador junta las funciones del filtro sin espacio. */ - background: rgb(3 8 20 / 72%); - backdrop-filter: blur(4px); - } - .marco { display: grid; grid-template-columns: 20rem minmax(0, 24rem); - width: 100%; max-width: 44rem; overflow: hidden; - border: 1px solid var(--c-border); - border-radius: var(--radius-tarjeta); - background: var(--c-bg-raised); - box-shadow: 0 24px 64px rgb(0 0 0 / 45%); } /* --- La mitad de la imagen ------------------------------------------- */ @@ -213,8 +190,8 @@ padding: var(--sp-5); background: linear-gradient( to top, - color-mix(in oklab, #030814 88%, transparent) 0%, - color-mix(in oklab, #030814 40%, transparent) 45%, + color-mix(in oklab, var(--c-scrim-base) 88%, transparent) 0%, + color-mix(in oklab, var(--c-scrim-base) 40%, transparent) 45%, transparent 75% ); } @@ -223,7 +200,7 @@ margin: 0; font-family: var(--font-display); font-size: var(--fs-xl); - background: var(--oro); + background: var(--gradiente-oro); background-clip: text; -webkit-background-clip: text; color: transparent; @@ -234,7 +211,7 @@ font-size: var(--fs-sm); line-height: 1.5; /* Sobre la imagen el color va fijo: no lo cambia el tema. */ - color: rgb(255 255 255 / 78%); + color: var(--c-text-on-media-muted); } /* --- La mitad del formulario ----------------------------------------- */ @@ -259,30 +236,6 @@ line-height: 1.5; } - .cerrar { - position: absolute; - top: var(--sp-3); - right: var(--sp-3); - display: inline-flex; - align-items: center; - justify-content: center; - /* 2.25rem: lo mínimo para acertarle con el dedo. */ - width: 2.25rem; - height: 2.25rem; - padding: 0; - border: none; - border-radius: var(--radius-boton); - background: transparent; - color: var(--c-text-muted); - cursor: pointer; - transition: color 0.2s var(--suave); - } - - .cerrar:hover, - .cerrar:focus-visible { - color: var(--c-text); - } - /* * En pantallas estrechas la imagen pasa a ser una franja arriba: dos * columnas de diez centímetros no son dos columnas, son dos rendijas. diff --git a/src/lib/components/ModalBusqueda.svelte b/src/lib/components/ModalBusqueda.svelte index b118504..330fdc5 100644 --- a/src/lib/components/ModalBusqueda.svelte +++ b/src/lib/components/ModalBusqueda.svelte @@ -26,6 +26,7 @@ busquedaModal.cerrar()} @@ -33,7 +34,7 @@ if (evento.target === dialogo) busquedaModal.cerrar(); }} > - + Buscar en Senza Paura Música, historias y recursos. Encuentra lo que buscas en todo el sitio. @@ -43,7 +44,7 @@ {/if} busquedaModal.cerrar()} > @@ -53,35 +54,10 @@ diff --git a/src/routes/(sitio)/musica/+page.svelte b/src/routes/(sitio)/musica/+page.svelte index db00dfa..5d04739 100644 --- a/src/routes/(sitio)/musica/+page.svelte +++ b/src/routes/(sitio)/musica/+page.svelte @@ -160,8 +160,8 @@ Música - Todos los álbumes y canciones del catálogo. Usa los estilos o idiomas de la - izquierda y el desplegable de etiquetas del buscador para acotar la colección. + Todos los álbumes y canciones del catálogo. Usa los estilos o idiomas de la izquierda y el + desplegable de etiquetas del buscador para acotar la colección. Conocer a los intérpretes → @@ -321,7 +321,7 @@ .entradilla { max-width: 56ch; font-size: var(--fs-lg); - font-weight: 300; + font-weight: var(--font-weight-regular); } /* @@ -393,8 +393,8 @@ white-space: nowrap; cursor: pointer; transition: - background-color 0.2s var(--suave), - color 0.2s var(--suave); + background-color 0.2s var(--ease-standard), + color 0.2s var(--ease-standard); } /* diff --git a/src/routes/(sitio)/suscripciones/+page.svelte b/src/routes/(sitio)/suscripciones/+page.svelte index 69176fd..6cb70ff 100644 --- a/src/routes/(sitio)/suscripciones/+page.svelte +++ b/src/routes/(sitio)/suscripciones/+page.svelte @@ -178,7 +178,7 @@ margin-bottom: 0; color: var(--c-text-muted); font-size: var(--fs-lg); - font-weight: 300; + font-weight: var(--font-weight-regular); } .planes, @@ -274,9 +274,9 @@ 0 1.5rem 3rem -2.25rem color-mix(in oklab, var(--c-text) 45%, transparent), inset 0 1px 0 color-mix(in oklab, white 10%, transparent); transition: - transform 0.35s var(--sal), - border-color 0.25s var(--suave), - box-shadow 0.35s var(--sal); + transform 0.35s var(--ease-emphasized), + border-color 0.25s var(--ease-standard), + box-shadow 0.35s var(--ease-emphasized); } .plan::before { @@ -323,7 +323,7 @@ margin: 0; color: var(--tono-plan); font-size: var(--fs-xs); - font-weight: 700; + font-weight: var(--font-weight-semibold); letter-spacing: 0.12em; text-transform: uppercase; } @@ -378,7 +378,7 @@ .precio strong { font-family: var(--font-body); font-size: clamp(2.25rem, 4vw, 3rem); - font-weight: 650; + font-weight: var(--font-weight-semibold); font-variant-numeric: tabular-nums; letter-spacing: -0.045em; line-height: 1; @@ -415,7 +415,7 @@ .prestaciones li::before { color: var(--tono-plan); content: '✓'; - font-weight: 700; + font-weight: var(--font-weight-semibold); } .plan > .btn { diff --git a/src/routes/+error.svelte b/src/routes/+error.svelte index c170fb4..9578229 100644 --- a/src/routes/+error.svelte +++ b/src/routes/+error.svelte @@ -250,7 +250,7 @@ color: inherit; font-size: var(--boton-texto); cursor: pointer; - transition: border-color 0.3s var(--suave); + transition: border-color 0.3s var(--ease-standard); } .poner:hover, diff --git a/src/routes/proximamente/+page.svelte b/src/routes/proximamente/+page.svelte index 97b1c49..35a8241 100644 --- a/src/routes/proximamente/+page.svelte +++ b/src/routes/proximamente/+page.svelte @@ -65,7 +65,7 @@ margin: 0; font-size: clamp(2.5rem, 9vw, 4.5rem); line-height: 1.05; - background: var(--oro); + background: var(--gradiente-oro); background-clip: text; -webkit-background-clip: text; color: transparent; diff --git a/src/tokens.css b/src/tokens.css new file mode 100644 index 0000000..fce26a8 --- /dev/null +++ b/src/tokens.css @@ -0,0 +1,41 @@ +/* + * Contrato visual compartido por la web pública, el panel y Estudio. + * + * Estos tokens describen funciones, no páginas concretas. Un componente puede + * elegir entre ellos, pero no debe inventar otra escala para resolver el mismo + * papel. Los colores base y las familias pertenecen a `marca.css`; aquí viven + * tipografía, interacción, geometría, movimiento y elevación. + */ +:root { + --font-weight-regular: 400; + --font-weight-medium: 500; + --font-weight-semibold: 600; + + --leading-heading: 1.1; + --leading-ui: 1.35; + --leading-body: 1.65; + + --control-height-compact: 2.25rem; + --control-height: 2.75rem; + --control-height-touch: 3rem; + --icon-size-sm: 1.25rem; + --icon-size-md: 1.5rem; + --icon-size-lg: 1.75rem; + + --radius-detail: 4px; + --radius-overlay: 12px; + --radius-round: 999px; + + --duration-fast: 150ms; + --duration-normal: 200ms; + --duration-slow: 400ms; + --ease-standard: cubic-bezier(0.4, 0, 0.2, 1); + --ease-emphasized: cubic-bezier(0.16, 1, 0.3, 1); + + --c-overlay: rgb(3 8 20 / 72%); + --c-scrim-base: rgb(3 8 20); + --c-text-on-media: oklch(0.97 0.01 255); + --c-text-on-media-muted: rgb(255 255 255 / 78%); + --shadow-popover: 0 0.75rem 2rem rgb(0 0 0 / 35%); + --shadow-modal: 0 1.5rem 4rem rgb(0 0 0 / 45%); +}
Música, historias y recursos. Encuentra lo que buscas en todo el sitio. @@ -43,7 +44,7 @@ {/if} busquedaModal.cerrar()} > @@ -53,35 +54,10 @@ diff --git a/src/routes/(sitio)/musica/+page.svelte b/src/routes/(sitio)/musica/+page.svelte index db00dfa..5d04739 100644 --- a/src/routes/(sitio)/musica/+page.svelte +++ b/src/routes/(sitio)/musica/+page.svelte @@ -160,8 +160,8 @@ Música - Todos los álbumes y canciones del catálogo. Usa los estilos o idiomas de la - izquierda y el desplegable de etiquetas del buscador para acotar la colección. + Todos los álbumes y canciones del catálogo. Usa los estilos o idiomas de la izquierda y el + desplegable de etiquetas del buscador para acotar la colección. Conocer a los intérpretes → @@ -321,7 +321,7 @@ .entradilla { max-width: 56ch; font-size: var(--fs-lg); - font-weight: 300; + font-weight: var(--font-weight-regular); } /* @@ -393,8 +393,8 @@ white-space: nowrap; cursor: pointer; transition: - background-color 0.2s var(--suave), - color 0.2s var(--suave); + background-color 0.2s var(--ease-standard), + color 0.2s var(--ease-standard); } /* diff --git a/src/routes/(sitio)/suscripciones/+page.svelte b/src/routes/(sitio)/suscripciones/+page.svelte index 69176fd..6cb70ff 100644 --- a/src/routes/(sitio)/suscripciones/+page.svelte +++ b/src/routes/(sitio)/suscripciones/+page.svelte @@ -178,7 +178,7 @@ margin-bottom: 0; color: var(--c-text-muted); font-size: var(--fs-lg); - font-weight: 300; + font-weight: var(--font-weight-regular); } .planes, @@ -274,9 +274,9 @@ 0 1.5rem 3rem -2.25rem color-mix(in oklab, var(--c-text) 45%, transparent), inset 0 1px 0 color-mix(in oklab, white 10%, transparent); transition: - transform 0.35s var(--sal), - border-color 0.25s var(--suave), - box-shadow 0.35s var(--sal); + transform 0.35s var(--ease-emphasized), + border-color 0.25s var(--ease-standard), + box-shadow 0.35s var(--ease-emphasized); } .plan::before { @@ -323,7 +323,7 @@ margin: 0; color: var(--tono-plan); font-size: var(--fs-xs); - font-weight: 700; + font-weight: var(--font-weight-semibold); letter-spacing: 0.12em; text-transform: uppercase; } @@ -378,7 +378,7 @@ .precio strong { font-family: var(--font-body); font-size: clamp(2.25rem, 4vw, 3rem); - font-weight: 650; + font-weight: var(--font-weight-semibold); font-variant-numeric: tabular-nums; letter-spacing: -0.045em; line-height: 1; @@ -415,7 +415,7 @@ .prestaciones li::before { color: var(--tono-plan); content: '✓'; - font-weight: 700; + font-weight: var(--font-weight-semibold); } .plan > .btn { diff --git a/src/routes/+error.svelte b/src/routes/+error.svelte index c170fb4..9578229 100644 --- a/src/routes/+error.svelte +++ b/src/routes/+error.svelte @@ -250,7 +250,7 @@ color: inherit; font-size: var(--boton-texto); cursor: pointer; - transition: border-color 0.3s var(--suave); + transition: border-color 0.3s var(--ease-standard); } .poner:hover, diff --git a/src/routes/proximamente/+page.svelte b/src/routes/proximamente/+page.svelte index 97b1c49..35a8241 100644 --- a/src/routes/proximamente/+page.svelte +++ b/src/routes/proximamente/+page.svelte @@ -65,7 +65,7 @@ margin: 0; font-size: clamp(2.5rem, 9vw, 4.5rem); line-height: 1.05; - background: var(--oro); + background: var(--gradiente-oro); background-clip: text; -webkit-background-clip: text; color: transparent; diff --git a/src/tokens.css b/src/tokens.css new file mode 100644 index 0000000..fce26a8 --- /dev/null +++ b/src/tokens.css @@ -0,0 +1,41 @@ +/* + * Contrato visual compartido por la web pública, el panel y Estudio. + * + * Estos tokens describen funciones, no páginas concretas. Un componente puede + * elegir entre ellos, pero no debe inventar otra escala para resolver el mismo + * papel. Los colores base y las familias pertenecen a `marca.css`; aquí viven + * tipografía, interacción, geometría, movimiento y elevación. + */ +:root { + --font-weight-regular: 400; + --font-weight-medium: 500; + --font-weight-semibold: 600; + + --leading-heading: 1.1; + --leading-ui: 1.35; + --leading-body: 1.65; + + --control-height-compact: 2.25rem; + --control-height: 2.75rem; + --control-height-touch: 3rem; + --icon-size-sm: 1.25rem; + --icon-size-md: 1.5rem; + --icon-size-lg: 1.75rem; + + --radius-detail: 4px; + --radius-overlay: 12px; + --radius-round: 999px; + + --duration-fast: 150ms; + --duration-normal: 200ms; + --duration-slow: 400ms; + --ease-standard: cubic-bezier(0.4, 0, 0.2, 1); + --ease-emphasized: cubic-bezier(0.16, 1, 0.3, 1); + + --c-overlay: rgb(3 8 20 / 72%); + --c-scrim-base: rgb(3 8 20); + --c-text-on-media: oklch(0.97 0.01 255); + --c-text-on-media-muted: rgb(255 255 255 / 78%); + --shadow-popover: 0 0.75rem 2rem rgb(0 0 0 / 35%); + --shadow-modal: 0 1.5rem 4rem rgb(0 0 0 / 45%); +}
- Todos los álbumes y canciones del catálogo. Usa los estilos o idiomas de la - izquierda y el desplegable de etiquetas del buscador para acotar la colección. + Todos los álbumes y canciones del catálogo. Usa los estilos o idiomas de la izquierda y el + desplegable de etiquetas del buscador para acotar la colección.
Conocer a los intérpretes →