Ir al contenido

Guía de mejoras de estilo

Esta guía documenta los tokens del sistema de diseño y las clases de componentes implementadas en styles/custom.css. Sirve como referencia para los tokens de borde, superficie, sombra, radio, botón, degradado, transición, enfoque y tipografía utilizados en todo el tema.

Estado: Todos los tokens de diseño y las clases de componentes descritos a continuación están implementados y disponibles para su uso.

Cada sección documenta una categoría de tokens:

  1. Definiciones de tokens — propiedades personalizadas de CSS con valores para modo claro/oscuro
  2. Asignación de componentes — qué componentes del tema utilizan cada token
  3. Notas de implementación — orientación de uso y consideraciones de accesibilidad

Las tablas de tokens están divididas por modo claro y modo oscuro cuando los valores difieren.


El tema utiliza bordes con transparencia alfa en lugar de colores grises sólidos. Esto permite que los bordes se adapten de forma natural a cualquier fondo.

/* Patrón de borde con transparencia alfa */
border: 1px solid var(--f5-border-default); /* neutral al 20% alfa */
/* Modo claro */
:root[data-theme='light'] {
--f5-border-faint: #3434341a; /* --f5-black-3 al 10% */
--f5-border-default: #34343433; /* --f5-black-3 al 20% */
--f5-border-strong: #22222266; /* --f5-black-4 al 40% */
}
/* Modo oscuro */
:root {
--f5-border-faint: #f5f5f51a; /* --f5-white-2 al 10% */
--f5-border-default: #f5f5f533; /* --f5-white-2 al 20% */
--f5-border-strong: #cccccc66; /* --f5-white-4 al 40% */
}
TokenOpacidadCaso de uso
--f5-border-faint10%Separadores sutiles, filas de tabla
--f5-border-default20%Bordes predeterminados, contornos de tarjeta
--f5-border-strong40%Bordes enfatizados, estados activos

Estado: Completo — implementado en styles/custom.css.

Tokens de superficie semánticos para estados de hover y activo.

TokenValorPropósito
--f5-white#ffffffFondos principales
--f5-white-1#faf9f7Barra lateral, áreas sutiles
--f5-white-2#f5f5f5Superficies elevadas
--f5-surface-hovervar(--f5-white-2)Relleno al pasar el cursor
--f5-surface-activevar(--f5-white-3)Relleno presionado/activo
TokenValorPropósito
--f5-black#000000Fondos principales
--f5-black-4#222222Barra lateral, áreas sutiles
--f5-surface-hovervar(--f5-black-3)Relleno al pasar el cursor
--f5-surface-activevar(--f5-black-2)Relleno presionado/activo
:root[data-theme='light'] {
--f5-surface-hover: var(--f5-white-2); /* #f5f5f5 */
--f5-surface-active: var(--f5-white-3); /* #e6e6e6 */
}
:root {
--f5-surface-hover: var(--f5-black-3); /* #343434 */
--f5-surface-active: var(--f5-black-2); /* #666666 */
}

Estado: Completo — implementado en styles/custom.css.


El tema utiliza sombras alfa con tinte neutro con valores de doble capa para lograr una profundidad natural. El modo claro usa --f5-black-3 (#343434) como base de tinte; el modo oscuro usa #cccccc.

:root[data-theme='light'] {
--f5-shadow-inset: inset 0px 1px 2px 1px #3434341a;
--f5-shadow-low:
0px 1px 1px 0px #3434340d,
0px 2px 2px 0px #3434340d;
--f5-shadow-mid:
0px 2px 3px 0px #3434341a,
0px 8px 16px -10px #34343433;
--f5-shadow-high:
0px 2px 3px 0px #34343426,
0px 16px 16px -10px #34343433;
--f5-shadow-higher:
0px 2px 3px 0px #3434341a,
0px 12px 28px 0px #34343440;
}
:root {
--f5-shadow-inset: inset 0px 1px 2px 1px #cccccc0d;
--f5-shadow-low:
0px 1px 1px 0px #cccccc0a,
0px 2px 2px 0px #cccccc0a;
--f5-shadow-mid:
0px 2px 3px 0px #cccccc0d,
0px 8px 16px -10px #cccccc1a;
--f5-shadow-high:
0px 2px 3px 0px #cccccc1a,
0px 16px 16px -10px #cccccc1a;
--f5-shadow-higher:
0px 2px 3px 0px #cccccc0d,
0px 12px 28px 0px #cccccc26;
}
ComponenteNivel de sombra
.swatch, .icon-card--f5-shadow-low (en reposo)
.starlight-aside--f5-shadow-low
.expressive-code .frame--f5-shadow-mid
.mermaid-container--f5-shadow-mid
Tarjetas al pasar el cursor--f5-shadow-mid
Menús desplegables, popovers--f5-shadow-high
Modales--f5-shadow-higher

Estado: Completo — todos los niveles de sombra (inset, low, mid, high, higher) implementados en styles/custom.css.


:root {
--f5-radius-xs: 0.1875rem; /* 3px — insignias, etiquetas */
--f5-radius-sm: 0.3125rem; /* 5px — elementos de navegación, controles pequeños */
--f5-radius-md: 0.375rem; /* 6px — tarjetas, bloques de código */
--f5-radius-lg: 0.5rem; /* 8px — modales, contenedores grandes */
--f5-radius-full: 999px; /* píldoras, completamente redondeado */
}
ComponenteToken de radio
.swatch--f5-radius-md (6px)
.icon-card--f5-radius-md (6px)
.starlight-aside--f5-radius-md (6px)
.expressive-code .frame--f5-radius-md (6px)
.mermaid-container--f5-radius-lg (8px)
.edit-link--f5-radius-full (píldora)
Elementos de navegación en barra lateral--f5-radius-sm (5px)
Insignias--f5-radius-xs (3px)

Estado: Completo — escala de radio (xs, sm, md, lg, full) implementada en styles/custom.css.


/* Elementos de navegación en barra lateral */
nav.sidebar a {
border-radius: var(--f5-radius-sm); /* 5px */
padding: 0.25rem 0.5rem; /* 4px 8px */
min-height: 2.25rem; /* 36px */
display: flex;
align-items: center;
transition: background-color 0.15s ease, color 0.15s ease;
}
/* Hover en modo claro */
:root[data-theme='light'] nav.sidebar a:hover {
background-color: var(--f5-white-2); /* #f5f5f5 */
}
/* Hover en modo oscuro */
:root nav.sidebar a:hover {
background-color: var(--f5-black-3); /* #343434 */
}
/* Indicador de página activa */
nav.sidebar a[aria-current="page"] {
background-color: var(--f5-white-3); /* #e6e6e6 claro */
font-weight: 600;
}
:root:not([data-theme='light']) nav.sidebar a[aria-current="page"] {
background-color: var(--f5-black-2); /* #666666 → ajustar para legibilidad */
}
nav.sidebar a[aria-current="page"] {
border-left: 3px solid var(--sl-color-accent);
padding-left: calc(0.5rem - 3px); /* compensar por el borde */
}

Estado: Completo — hover de barra lateral, estado activo e indicador de acento implementados en styles/custom.css.


/* Primario — usando el rojo F5 como acción de marca */
.btn-primary {
background: var(--f5-red);
color: var(--f5-white);
border: none;
border-radius: var(--f5-radius-sm);
padding: 0.625rem 1rem;
font-weight: 500;
font-size: 0.875rem;
transition: background-color 0.15s ease, box-shadow 0.15s ease;
}
.btn-primary:hover {
background: var(--f5-red-3);
box-shadow: var(--f5-shadow-low);
}
/* Secundario — estilo de contorno */
.btn-secondary {
background: transparent;
color: var(--sl-color-gray-2);
border: 1px solid var(--f5-border-default);
border-radius: var(--f5-radius-sm);
padding: 0.625rem 1rem;
font-weight: 500;
font-size: 0.875rem;
transition: background-color 0.15s ease, border-color 0.15s ease;
}
.btn-secondary:hover {
background: var(--f5-surface-hover);
border-color: var(--f5-border-strong);
}
/* Terciario — fantasma/solo texto */
.btn-tertiary {
background: transparent;
color: var(--sl-color-accent);
border: none;
border-radius: var(--f5-radius-sm);
padding: 0.625rem 1rem;
font-weight: 500;
font-size: 0.875rem;
transition: background-color 0.15s ease;
}
.btn-tertiary:hover {
background: var(--f5-surface-hover);
}
TamañoRellenoTamaño de fuenteAltura mínima
Pequeño0.375rem 0.75rem0.8125rem (13px)32px
Mediano (predeterminado)0.625rem 1rem0.875rem (14px)40px
Grande0.75rem 1.5rem1rem (16px)48px

Estado: Completo — todas las variantes de botón (primary, secondary, tertiary, critical) y la escala de tamaños (sm, predeterminado, lg) implementadas en styles/custom.css.


Usando la paleta de marca F5:

/* Degradado de hero primario — azul River */
.hero-gradient-primary {
background: linear-gradient(135deg, var(--f5-river-2) 0%, var(--f5-river) 100%);
/* #6e8dcc → #0e41aa */
}
/* Lavado de página suave — tono cálido sutil */
:root[data-theme='light'] .hero-gradient-faint {
background: linear-gradient(180deg, #faf9f7 0%, #f5f5f5 100%);
}
:root .hero-gradient-faint {
background: linear-gradient(180deg, #222222 0%, #000000 100%);
}
/* Variante berenjena para páginas de características */
.hero-gradient-eggplant {
background: linear-gradient(135deg, var(--f5-eggplant-2) 0%, var(--f5-eggplant) 100%);
/* #9c59c9 → #62228b */
}
/* Variante roja de marca para anuncios */
.hero-gradient-red {
background: linear-gradient(135deg, var(--f5-red-2) 0%, var(--f5-red) 100%);
/* #f06680 → #e4002b */
}
/* Viñeta radial para profundidad */
.hero-vignette::after {
content: '';
position: absolute;
inset: 0;
background: radial-gradient(ellipse at center, transparent 40%, rgba(0, 0, 0, 0.15) 100%);
pointer-events: none;
}
/* Desvanecimiento inferior hacia el fondo de la página */
.hero-fade::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 30%;
background: linear-gradient(to bottom, transparent, var(--sl-color-black));
pointer-events: none;
}

Estado: Completo — degradados de hero (primary, eggplant, red, faint) y superposiciones (hero-fade, hero-vignette) implementados en styles/custom.css.


:root {
--f5-transition-fast: 0.15s ease;
--f5-transition-base: 0.2s ease;
--f5-transition-bounce: 0.2s cubic-bezier(0.68, -0.2, 0.265, 1.15);
--f5-transition-decelerate: 0.6s cubic-bezier(0.5, 1, 0.89, 1);
--f5-transition-spring: 0.2s cubic-bezier(0.54, 1.5, 0.38, 1.11);
}
TokenDuraciónSuavizadoCaso de uso
--f5-transition-fast0.15seaseLa mayoría de estados hover, cambios de color
--f5-transition-base0.2seaseRellenos de fondo, cambios de borde
--f5-transition-bounce0.2scubic-bezier(0.68, -0.2, 0.265, 1.15)Interruptores, alternadores
--f5-transition-decelerate0.6scubic-bezier(0.5, 1, 0.89, 1)Indicadores de pestaña, paneles deslizantes
--f5-transition-spring0.2scubic-bezier(0.54, 1.5, 0.38, 1.11)Tooltips, entrada de popover
PropiedadSeguro para animarNotas
background-colorEstándar para rellenos hover
colorCambios de color de texto
border-colorÉnfasis de borde al pasar el cursor
box-shadowCambios de elevación (usar will-change si hay saltos)
transformEscala, traslado para retroalimentación
opacityAparecer/desaparecer gradualmente
width, heightEvitarProvoca reflujo de diseño
padding, marginEvitarProvoca reflujo de diseño
/* Elementos de navegación en barra lateral */
nav.sidebar a {
transition: background-color var(--f5-transition-fast),
color var(--f5-transition-fast);
}
/* Tarjetas — elevación de sombra al pasar el cursor */
.swatch, .icon-card {
transition: box-shadow var(--f5-transition-base),
transform var(--f5-transition-base);
}
.swatch:hover, .icon-card:hover {
box-shadow: var(--f5-shadow-mid);
transform: translateY(-1px);
}
/* Botones */
.btn-primary, .btn-secondary, .btn-tertiary {
transition: background-color var(--f5-transition-fast),
border-color var(--f5-transition-fast),
box-shadow var(--f5-transition-fast);
}
/* Enlaces */
a {
transition: color var(--f5-transition-fast);
}

Estado: Completo — los cinco tokens de transición (fast, base, bounce, decelerate, spring) y las transiciones de componentes implementados en styles/custom.css.


El tema utiliza un patrón de doble anillo con un anillo interior insertado y un resplandor exterior:

/* Enfoque de acción — usando el azul F5 River */
:root {
--f5-focus-action: inset 0 0 0 1px var(--f5-river), 0 0 0 3px var(--f5-river-2);
/* inset 0 0 0 1px #0e41aa, 0 0 0 3px #6e8dcc */
--f5-focus-critical: inset 0 0 0 1px var(--f5-red-3), 0 0 0 3px var(--f5-red-2);
/* inset 0 0 0 1px #a70020, 0 0 0 3px #f06680 */
}
/* Aplicar a elementos interactivos */
a:focus-visible,
button:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible {
outline: none;
box-shadow: var(--f5-focus-action);
}
/* Variante crítica para botones destructivos */
.btn-critical:focus-visible {
box-shadow: var(--f5-focus-critical);
}
  • El patrón de doble anillo cumple con los requisitos de Apariencia de enfoque de WCAG 2.2 (contorno contrastante mínimo de 2px)
  • Usar box-shadow en lugar de outline permite respetar el radio de borde
  • :focus-visible garantiza que el anillo solo aparezca para la navegación por teclado, no para clics del ratón

Estado: Completo — patrón de enfoque de doble anillo (action, critical) y estilos :focus-visible implementados en styles/custom.css.


:root {
--sl-font: "proximaNova", system-ui, "Segoe UI", Helvetica, Arial, sans-serif;
--sl-font-heading: "neusaNextProWide", system-ui, "Segoe UI", Helvetica, Arial, sans-serif;
--sl-line-height-headings: 1.1;
}
EscalaTamañoAltura de líneaUso
Display 5001.875rem (30px)1.267--sl-text-h1
Display 4001.5rem (24px)1.333--sl-text-h2
Display 3001.125rem (18px)1.333--sl-text-h3
Display 2001rem (16px)1.5--sl-text-h4
Display 1000.8125rem (13px)1.385Texto de encabezado de sección
Body 3001rem (16px)1.5Cuerpo principal
Body 2000.875rem (14px)1.429Texto de barra lateral, pies de foto
Body 1000.8125rem (13px)1.385Texto pequeño
AspectoValorNotas
Altura de línea de encabezados1.1Encabezados compactos para impacto de marca; considerar 1.2 para legibilidad
Altura de línea del cuerpo1.5 (predeterminado de Starlight)Adecuada para lectura
Familia de fuentesFuentes de marca personalizadasproximaNova (cuerpo), neusaNextProWide (encabezados)
Pesos de encabezadosh1-h2: 700, h3: 500, h4-h6: 700 mayúsculasOpinionado para consistencia de marca

Prioridad: No se necesitan cambios. La tipografía actual está bien definida y es apropiada para la marca. El ajuste menor de la altura de línea de encabezados (1.1 a 1.2) es opcional.


Todos los tokens de diseño fueron implementados en cinco sprints:

SprintAlcanceTokens añadidos
1. FundaciónSombras + radio de borde--f5-shadow-* (5 niveles), --f5-radius-* (5 niveles)
2. Barra lateral + SuperficiesNavegación + tokens interactivos--f5-surface-hover, --f5-surface-active, --f5-border-* (3 niveles), --f5-transition-fast
3. BotonesSistema de componentes.btn-primary, .btn-secondary, .btn-tertiary, .btn-critical, variantes de tamaño
4. Degradados de heroUtilidades de fondo.hero-gradient-primary, -eggplant, -red, -faint, .hero-vignette, .hero-fade
5. Enfoque + TransicionesAccesibilidad + pulido--f5-focus-action, --f5-focus-critical, --f5-transition-* (5 tokens), efectos hover de tarjetas

:root {
/* Escala de radio de borde */
--f5-radius-xs: 0.1875rem; /* 3px */
--f5-radius-sm: 0.3125rem; /* 5px */
--f5-radius-md: 0.375rem; /* 6px */
--f5-radius-lg: 0.5rem; /* 8px */
--f5-radius-full: 999px;
/* Temporización de transiciones */
--f5-transition-fast: 0.15s ease;
--f5-transition-base: 0.2s ease;
--f5-transition-bounce: 0.2s cubic-bezier(0.68, -0.2, 0.265, 1.15);
--f5-transition-decelerate: 0.6s cubic-bezier(0.5, 1, 0.89, 1);
--f5-transition-spring: 0.2s cubic-bezier(0.54, 1.5, 0.38, 1.11);
/* Anillos de enfoque */
--f5-focus-action: inset 0 0 0 1px var(--f5-river), 0 0 0 3px var(--f5-river-2);
--f5-focus-critical: inset 0 0 0 1px var(--f5-red-3), 0 0 0 3px var(--f5-red-2);
/* Sombras en modo oscuro (predeterminado) */
--f5-shadow-low: 0px 1px 1px 0px #cccccc0a, 0px 2px 2px 0px #cccccc0a;
--f5-shadow-mid: 0px 2px 3px 0px #cccccc0d, 0px 8px 16px -10px #cccccc1a;
--f5-shadow-high: 0px 2px 3px 0px #cccccc1a, 0px 16px 16px -10px #cccccc1a;
--f5-shadow-higher: 0px 2px 3px 0px #cccccc0d, 0px 12px 28px 0px #cccccc26;
/* Bordes en modo oscuro */
--f5-border-faint: #f5f5f51a;
--f5-border-default: #f5f5f533;
--f5-border-strong: #cccccc66;
/* Superficies en modo oscuro */
--f5-surface-hover: var(--f5-black-3);
--f5-surface-active: var(--f5-black-2);
}
:root[data-theme='light'] {
/* Sombras en modo claro */
--f5-shadow-low: 0px 1px 1px 0px #3434340d, 0px 2px 2px 0px #3434340d;
--f5-shadow-mid: 0px 2px 3px 0px #3434341a, 0px 8px 16px -10px #34343433;
--f5-shadow-high: 0px 2px 3px 0px #34343426, 0px 16px 16px -10px #34343433;
--f5-shadow-higher: 0px 2px 3px 0px #3434341a, 0px 12px 28px 0px #34343440;
/* Bordes en modo claro */
--f5-border-faint: #3434341a;
--f5-border-default: #34343433;
--f5-border-strong: #22222266;
/* Superficies en modo claro */
--f5-surface-hover: var(--f5-white-2);
--f5-surface-active: var(--f5-white-3);
}