Saltar al contenido

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

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

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.

Botones

Al pasar el cursor el fondo se oscurece, al pulsar el botón se reduce al 98 % y el foco del teclado muestra el anillo de foco común. No hay estilo deshabilitado: mientras un formulario se envía, su botón sigue siendo enfocable y se marca con aria-disabled.

Marcado
<button type="button" class="btn-primary">Principal</button>
<button type="button" class="btn-brand">Marca</button>
<button type="button" class="btn-ghost">Fantasma</button>
<button type="button" class="btn-ghost btn-sm">Pequeño</button>
Cursor encima
fondo más oscuro
Foco del teclado
anillo de foco común
Pulsado
se reduce al 98 %
Ocupado
aria-disabled="true", sigue siendo enfocable
Tema oscuro
todos los pares de la tabla de contraste oscura

Chips

Etiquetas estáticas, no controles. El nivel de cada habilidad usa tres estilos: principal (relleno), sólido y conocido (discontinuo).

PrincipalChipConocidoChip de marcaEstado en vivo
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.

Revisa 1 campo antes de enviar: Empresa.

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

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.

El anillo de foco, dibujado de forma estática

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: .