Sistema de diseño
El sistema de diseño de este sitio
Los colores, la tipografía, el espaciado y los componentes con los que está hecho este sitio. Cada valor de esta página se lee de la hoja de estilos al generar el sitio, y cada ratio de contraste se calcula a partir de esos valores.
Documenta solo este sitio; no es una muestra de trabajo para clientes. El build falla si algún par de texto y fondo de los que aparecen abajo queda por debajo de WCAG 2.2 AA.
Fuente: src/styles/global.css · tailwindcss/theme.css
Color
Dos escalas, brand (azul) e ink (neutra), más paper para la página clara y signal para los estados en vivo. Los valores están en OKLCH; el hex es el color sRGB que pinta el navegador.
Debajo de cada color: su contraste como texto sobre la página clara (paper) y sobre la página oscura (ink-950).
Brand
-
brand-50
#eef4ff
oklch(96.58% 0.0161 262.75)
1.0:1 sobre paper
17.3:1 sobre ink-950 -
brand-100
#dbe6ff
oklch(92.43% 0.0361 266.7)
1.2:1 sobre paper
15.2:1 sobre ink-950 -
brand-200
#bfd2ff
oklch(86.45% 0.0661 267.05)
1.4:1 sobre paper
12.6:1 sobre ink-950 -
brand-300
#93b3ff
oklch(77.27% 0.115 266.28)
2.0:1 sobre paper
9.2:1 sobre ink-950 -
brand-400
#6088ff
oklch(65.68% 0.1817 267.3)
3.1:1 sobre paper
5.8:1 sobre ink-950 -
brand-500
#3b63ff
oklch(57.01% 0.2352 267.14)
4.5:1 sobre paper
4.0:1 sobre ink-950 -
brand-600
#2542f5
oklch(49.99% 0.2626 266.9)
6.3:1 sobre paper
2.8:1 sobre ink-950 -
brand-700
#1d33dd
oklch(45.1% 0.2505 266.82)
7.8:1 sobre paper
2.3:1 sobre ink-950 -
brand-800
#1d2cb2
oklch(39.34% 0.2068 268.16)
9.8:1 sobre paper
1.8:1 sobre ink-950 -
brand-900
#1d2c8a
oklch(35.08% 0.1557 269.17)
11.3:1 sobre paper
1.6:1 sobre ink-950 -
brand-950
#121a54
oklch(25.47% 0.1048 270.77)
15.5:1 sobre paper
1.1:1 sobre ink-950
Ink
-
ink-50
#f7f7f8
oklch(97.64% 0.0013 286.38)
1.0:1 sobre paper
17.8:1 sobre ink-950 -
ink-100
#eeeef1
oklch(95% 0.004 286.32)
1.1:1 sobre paper
16.5:1 sobre ink-950 -
ink-200
#d9dade
oklch(88.88% 0.0055 274.96)
1.3:1 sobre paper
13.7:1 sobre ink-950 -
ink-300
#b7b8c0
oklch(78.42% 0.0113 280.42)
1.9:1 sobre paper
9.6:1 sobre ink-950 -
ink-400
#8f909c
oklch(65.64% 0.0177 282.1)
3.0:1 sobre paper
6.0:1 sobre ink-950 -
ink-500
#70717e
oklch(55.22% 0.0201 282.22)
4.6:1 sobre paper
3.9:1 sobre ink-950 -
ink-600
#585966
oklch(46.78% 0.0209 282.07)
6.6:1 sobre paper
2.7:1 sobre ink-950 -
ink-700
#474853
oklch(40.49% 0.0184 281.42)
8.7:1 sobre paper
2.1:1 sobre ink-950 -
ink-800
#2c2d35
oklch(29.94% 0.0145 279.85)
13.2:1 sobre paper
1.3:1 sobre ink-950 -
ink-900
#1a1b22
oklch(22.42% 0.0137 278.83)
16.5:1 sobre paper
1.1:1 sobre ink-950 -
ink-950
#0e0f14
oklch(16.97% 0.0105 276.32)
18.4:1 sobre paper
1.0:1 sobre ink-950
Superficie y estado
-
paper
#fbfbfa
oklch(98.78% 0.0013 106.42)
1.0:1 sobre paper
18.4:1 sobre ink-950 -
signal
#22c55e
oklch(72.27% 0.192 149.58)
2.2:1 sobre paper
8.4:1 sobre ink-950
Contraste
Los pares de texto y fondo que usan los componentes, en ambos temas. Los fondos con transparencia se mezclan con la superficie que tienen debajo, como hace el navegador.
55 de 55 pares cumplen AA, y 34 de los pares de texto también llegan a AAA.
Tema claro
| Uso | Muestra | Texto o elemento | Fondo | Ratio | Mínimo | Resultado |
|---|---|---|---|---|---|---|
| Texto del cuerpo body | ink-800 #2c2d35 | paper #fbfbfa | 13.2:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA AAA | |
| Encabezados h1, h2, h3, h4 | ink-950 #0e0f14 | paper #fbfbfa | 18.4:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA AAA | |
| Texto secundario .section-head .lead | ink-600 #585966 | paper #fbfbfa | 6.6:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA | |
| Metadatos .section-head .meta | ink-500 #70717e | paper #fbfbfa | 4.6:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA | |
| Enlaces .link-underline | brand-700 #1d33dd | paper #fbfbfa | 7.8:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA AAA | |
| Enlaces sobre tarjetas .link-underline | brand-700 #1d33dd | white #ffffff | 8.1:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA AAA | |
| Etiquetas de sección .eyebrow | brand-700 #1d33dd | paper #fbfbfa | 7.8:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA AAA | |
| Enlaces de navegación .nav-link | ink-600 #585966 | paper #fbfbfa | 6.6:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA | |
| Chips .chip | ink-700 #474853 | white #ffffff | 9.0:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA AAA | |
| Chips de marca .chip-brand | brand-700 #1d33dd | brand-50 #eef4ff | 7.4:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA AAA | |
| Chips de habilidades principales .chip-core | white #ffffff | ink-950 #0e0f14 | 19.1:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA AAA | |
| Chips de habilidades conocidas .chip-familiar | ink-500 #70717e | white #ffffff | 4.8:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA | |
| Botón principal .btn-primary | white #ffffff | ink-950 #0e0f14 | 19.1:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA AAA | |
| Botón principal, al pasar el cursor .btn-primary | white #ffffff | ink-800 #2c2d35 | 13.6:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA AAA | |
| Botón de marca .btn-brand | white #ffffff | brand-600 #2542f5 | 6.6:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA | |
| Botón de marca, al pasar el cursor .btn-brand | white #ffffff | brand-700 #1d33dd | 8.1:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA AAA | |
| Botón fantasma .btn-ghost | ink-800 #2c2d35 | paper + white/60 #fdfdfd | 13.4:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA AAA | |
| Texto de los campos .field | ink-900 #1a1b22 | white #ffffff | 17.1:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA AAA | |
| Texto de ejemplo .field | ink-500 #70717e | white #ffffff | 4.8:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA | |
| Etiquetas de los campos .field-label | ink-500 #70717e | paper #fbfbfa | 4.6:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA | |
| Errores de los campos .field-error | rose-700 #c70036 | white #ffffff | 6.0:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA | |
| Resumen de errores .error-summary | rose-800 #a50036 | rose-50 #fff1f2 | 7.2:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA AAA | |
| Borde de los campos .field | ink-400 #8f909c | white #ffffff | 3.1:1 | 3:1 No textual · 1.4.11 | Cumple · AA | |
| Anillo de foco :root | brand-600 #2542f5 | paper #fbfbfa | 6.3:1 | 3:1 No textual · 1.4.11 | Cumple · AA | |
| Anillo de foco sobre tarjetas :root | brand-600 #2542f5 | white #ffffff | 6.6:1 | 3:1 No textual · 1.4.11 | Cumple · AA |
Tema oscuro
| Uso | Muestra | Texto o elemento | Fondo | Ratio | Mínimo | Resultado |
|---|---|---|---|---|---|---|
| Texto del cuerpo body | ink-100 #eeeef1 | ink-950 #0e0f14 | 16.5:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA AAA | |
| Encabezados h1, h2, h3, h4 | white #ffffff | ink-950 #0e0f14 | 19.1:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA AAA | |
| Texto secundario .section-head .lead | ink-300 #b7b8c0 | ink-950 #0e0f14 | 9.6:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA AAA | |
| Metadatos .section-head .meta | ink-400 #8f909c | ink-950 #0e0f14 | 6.0:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA | |
| Enlaces .link-underline | brand-300 #93b3ff | ink-950 #0e0f14 | 9.2:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA AAA | |
| Enlaces sobre tarjetas .link-underline | brand-300 #93b3ff | ink-950 + ink-900/70 #16171e | 8.6:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA AAA | |
| Etiquetas de sección .eyebrow | brand-300 #93b3ff | ink-950 #0e0f14 | 9.2:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA AAA | |
| Enlaces de navegación .nav-link | ink-300 #b7b8c0 | ink-950 #0e0f14 | 9.6:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA AAA | |
| Chips .chip | ink-200 #d9dade | ink-900 #1a1b22 | 12.2:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA AAA | |
| Chips de marca .chip-brand | brand-200 #bfd2ff | ink-950 + ink-900/70 + brand-950/40 #141834 | 11.4:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA AAA | |
| Chips de habilidades principales .chip-core | ink-950 #0e0f14 | white #ffffff | 19.1:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA AAA | |
| Chips de habilidades conocidas .chip-familiar | ink-400 #8f909c | ink-950 + ink-900/70 #16171e | 5.6:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA | |
| Botón principal .btn-primary | ink-950 #0e0f14 | white #ffffff | 19.1:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA AAA | |
| Botón principal, al pasar el cursor .btn-primary | ink-950 #0e0f14 | ink-100 #eeeef1 | 16.5:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA AAA | |
| Botón de marca .btn-brand | white #ffffff | brand-500 #3b63ff | 4.7:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA | |
| Botón de marca, al pasar el cursor .btn-brand | white #ffffff | brand-600 #2542f5 | 6.6:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA | |
| Botón fantasma .btn-ghost | ink-100 #eeeef1 | ink-950 #0e0f14 | 16.5:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA AAA | |
| Texto de los campos .field | ink-100 #eeeef1 | ink-950 + ink-900/70 + ink-950/60 #111218 | 16.1:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA AAA | |
| Texto de ejemplo .field | ink-400 #8f909c | ink-950 + ink-900/70 + ink-950/60 #111218 | 5.9:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA | |
| Etiquetas de los campos .field-label | ink-400 #8f909c | ink-950 #0e0f14 | 6.0:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA | |
| Errores de los campos .field-error | rose-300 #ffa1ad | ink-950 #0e0f14 | 9.9:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA AAA | |
| Resumen de errores .error-summary | rose-200 #ffccd3 | ink-950 + rose-500/10 #26111b | 12.5:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA AAA | |
| Borde de los campos .field | ink-500 #70717e | ink-950 + ink-900/70 + ink-950/60 #111218 | 3.8:1 | 3:1 No textual · 1.4.11 | Cumple · AA | |
| Anillo de foco .dark | brand-300 #93b3ff | ink-950 #0e0f14 | 9.2:1 | 3:1 No textual · 1.4.11 | Cumple · AA | |
| Anillo de foco sobre tarjetas .dark | brand-300 #93b3ff | ink-950 + ink-900/70 #16171e | 8.6:1 | 3:1 No textual · 1.4.11 | Cumple · AA | |
| Texto de la consola .console | ink-100 #eeeef1 | ink-950 #0e0f14 | 16.5:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA AAA | |
| Claves en la consola .console .k | brand-300 #93b3ff | ink-950 #0e0f14 | 9.2:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA AAA | |
| Cadenas en la consola .console .s | emerald-300 #5ee9b5 | ink-950 #0e0f14 | 12.5:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA AAA | |
| Números en la consola .console .n | amber-200 #fee685 | ink-950 #0e0f14 | 15.3:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA AAA | |
| Comentarios en la consola .console .c | ink-400 #8f909c | ink-950 #0e0f14 | 6.0:1 | 4.5:1 Texto · 1.4.3 | Cumple · AA |
Los ratios usan el valor sRGB de cada color. En pantallas de gama amplia, los rose, emerald y amber por defecto de Tailwind pueden verse un poco más saturados.
Tipografía
Bricolage Grotesque para los encabezados e Inter para el texto, ambas fuentes variables con el subconjunto latino. Las fuentes de respaldo usan ajustes de métricas, así que el cambio a la fuente web no mueve el diseño.
Familias
-
Frontends rápidos y accesibles
Encabezados
--font-display: 'Bricolage Grotesque Variable', 'Bricolage Fallback', ui-sans-serif, system-ui, sans-serif
-
Frontends rápidos y accesibles
Texto e interfaz
--font-sans: 'Inter Variable', 'Inter Fallback', ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif
-
Frontends rápidos y accesibles
Etiquetas, código y consola
--font-mono: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', monospace
Tamaños de titular
Los tamaños de titular son fluidos: crecen con el viewport entre el mínimo y el máximo del clamp().
-
- Token
- text-display-xl
- Tamaño
- clamp(3rem, 8vw, 6.5rem)
- Interlineado
- 0.95
- Espaciado entre letras
- -0.035em
-
- Token
- text-display-lg
- Tamaño
- clamp(2rem, 4vw, 3.25rem)
- Interlineado
- 1.02
- Espaciado entre letras
- -0.03em
-
- Token
- text-display-md
- Tamaño
- clamp(1.5rem, 2.6vw, 2.125rem)
- Interlineado
- 1.1
- Espaciado entre letras
- -0.02em
Tamaños de texto
- text-xs · 0.75rem (12 px) Frontends rápidos y accesibles
- text-sm · 0.875rem (14 px) Frontends rápidos y accesibles
- text-base · 1rem (16 px) Frontends rápidos y accesibles
- text-lg · 1.125rem (18 px) Frontends rápidos y accesibles
- text-xl · 1.25rem (20 px) Frontends rápidos y accesibles
- text-2xl · 1.5rem (24 px) Frontends rápidos y accesibles
Espacio, radios y elevación
La escala de espaciado de Tailwind sobre una unidad de 0.25rem (4 px), un solo ancho de contenido y unos pocos radios y sombras, cada uno con una función.
Espaciado
- 1 · 0.25rem
- 2 · 0.5rem
- 3 · 0.75rem
- 4 · 1rem
- 5 · 1.25rem
- 6 · 1.5rem
- 8 · 2rem
- 10 · 2.5rem
- 12 · 3rem
- 16 · 4rem
- 20 · 5rem
- 28 · 7rem
Las secciones tienen 5rem de relleno vertical en teléfonos y 7rem desde 640 px.
Ancho del contenido: --container-page: 76rem
Radios
-
Chips
rounded-md · 0.375rem
-
Campos de formulario
rounded-xl · 0.75rem
-
Tarjetas
rounded-2xl · 1rem
-
Paneles
rounded-3xl · 1.5rem
-
Botones
rounded-full
Sombras
-
Tarjetas y botones en reposo
shadow-soft: 0 1px 2px rgb(0 0 0 / 0.04), 0 4px 16px -4px rgb(0 0 0 / 0.06)
-
Tarjetas al pasar el cursor y la consola
shadow-lift: 0 1px 1px rgb(14 15 20 / 0.04), 0 12px 32px -12px rgb(14 15 20 / 0.18)
-
Énfasis de marca
shadow-glow: 0 0 0 1px rgb(59 99 255 / 0.18), 0 20px 60px -20px rgb(59 99 255 / 0.45)
Movimiento
Transiciones cortas con una sola curva de aceleración. Si el visitante pide reducir el movimiento, se desactivan las animaciones, el desplazamiento suave y las transiciones de vista.
- Curva
- --ease-out: cubic-bezier(0.2, 0.7, 0.2, 1)
- Animaciones
-
- --animate-fade-up: fadeUp 0.7s cubic-bezier(0.2, 0.7, 0.2, 1) both
- --animate-caret: caret 1s steps(1) infinite
- --animate-pulse-dot: pulseDot 2s ease-in-out infinite
Componentes
Las clases compartidas de global.css, renderizadas en vivo. Pulsa Tab para ver el anillo de foco en cada control.
Chips
Etiquetas estáticas, no controles. El nivel de cada habilidad usa tres estilos: principal (relleno), sólido y conocido (discontinuo).
Marcado
<span class="chip-core">Principal</span>
<span class="chip">Chip</span>
<span class="chip chip-familiar">Conocido</span>
<span class="chip chip-brand">Chip de marca</span>
<span class="chip-live">Estado en vivo</span> - Tema oscuro
- todos los pares de la tabla de contraste oscura
Campos de formulario
Etiquetas visibles, un borde de al menos 3:1 y un anillo de marca con el foco. Un campo inválido recibe aria-invalid, un mensaje debajo y una línea en el resumen al inicio del formulario.
Escribe el nombre de la empresa.
Marcado
<div class="w-full"><label class="field-label" for="ds-email">Correo</label>
<input id="ds-email" class="field" type="email" placeholder="nombre@empresa.com" autocomplete="off"></div>
<div class="error-summary w-full">Revisa 1 campo antes de enviar: Empresa.</div>
<div class="w-full"><label class="field-label" for="ds-company">Empresa</label>
<input id="ds-company" class="field" type="text" aria-invalid="true" aria-describedby="ds-company-error" autocomplete="off">
<p id="ds-company-error" class="field-error">Escribe el nombre de la empresa.</p></div> - Foco del teclado
- borde de marca y un anillo de 4 px al 40 %
- Inválido
- borde rosa, mensaje debajo del campo y resumen de errores
- Tema oscuro
- todos los pares de la tabla de contraste oscura
Tarjetas y paneles
Superficies para agrupar contenido. card-hover eleva un poco una tarjeta enlazada al pasar el cursor.
Tarjeta
Radio grande, borde fino y una sombra suave.
Panel
Radio más grande y sin sombra.
Marcado
<div class="card p-5"><p class="font-semibold text-ink-950 dark:text-white">Tarjeta</p>
<p class="mt-1 text-sm">Radio grande, borde fino y una sombra suave.</p></div>
<div class="panel p-5"><p class="font-semibold text-ink-950 dark:text-white">Panel</p>
<p class="mt-1 text-sm">Radio más grande y sin sombra.</p></div> - Cursor encima
- .card-hover
- Tema oscuro
- todos los pares de la tabla de contraste oscura
Enlaces
Los enlaces de marca se subrayan al pasar el cursor; los enlaces discretos son para la navegación, donde el contexto ya indica que son enlaces.
Marcado
<a class="link-underline" href="#links">Enlace de marca</a>
<a class="link-quiet" href="#links">Enlace discreto</a> - Foco del teclado
- anillo de foco común
- Tema oscuro
- todos los pares de la tabla de contraste oscura
Consola
Panel de código decorativo, oscuro en ambos temas.
Marcado
<div class="console w-full" aria-hidden="true">
<div class="console-bar"><span class="console-dot"></span><span class="console-dot"></span><span class="console-dot"></span><span>resume.json</span></div>
<pre class="px-4 py-3 overflow-x-auto"><span class="c">// Oscar Arenas</span>
{ <span class="k">"years"</span>: <span class="n">17</span>, <span class="k">"stack"</span>: <span class="s">"React · Next.js"</span> }</pre>
</div> Foco
Todos los elementos interactivos comparten un estilo de foco: un contorno de 2 px en --focus-ring (brand-600 en el tema claro, brand-300 en el oscuro), a 3 px del elemento.
Declaración de accesibilidad
Objetivo: WCAG 2.2 nivel AA, en inglés y en español, en los temas claro y oscuro.
Lo que hace el sitio
- Un enlace para saltar al contenido principal, y regiones de encabezado, contenido y pie en todas las páginas.
- Un anillo de foco visible en todos los elementos interactivos, de al menos 3:1 frente a su fondo.
- Contraste de texto de al menos 4,5:1 en ambos temas, comprobado en cada build (las tablas de arriba).
- Cada página declara su idioma, y las versiones en inglés y en español se enlazan entre sí.
- Los campos de formulario tienen etiquetas visibles. Los errores se anuncian, se listan en un resumen con enlaces y el foco pasa al primer campo inválido.
- Las animaciones, el desplazamiento suave y las transiciones de vista se desactivan si se pide reducir el movimiento.
- Los avisos fijos nunca tapan el elemento que tiene el foco del teclado (WCAG 2.4.11).
Limitaciones conocidas
- La coincidencia inteligente de las herramientas de «Tu vacante» descarga una vez unos 138 MB (el modelo y su runtime) y necesita WebAssembly. Sin ella, la coincidencia por palabras clave ofrece las mismas herramientas con menos alcance.
- Por ahora, las tools WebMCP para agentes necesitan activar una opción del navegador; cada tool también funciona como un formulario normal en la página.
- Las herramientas interactivas necesitan JavaScript. El CV en sí es HTML estático y también está disponible como texto plano en Markdown.
- Los sitios de terceros enlazados (LinkedIn, emisores de certificados, la página de agenda) quedan fuera de esta declaración.
- Es una autoevaluación: ningún auditor externo ha revisado el sitio.
Comentarios
Si algo de este sitio no funciona con tu navegador o tu tecnología de apoyo, escribe a oscarenas@gmail.com y cuéntame en qué página estabas y qué intentabas hacer.
Última revisión: .