← Volver al sitio

DESIGN SYSTEM

Guía de estilos

Documentación de los tokens visuales y componentes usados en el portfolio: color, tipografía, botones, tags, tarjetas, navegación e iconografía. Sirve de referencia para mantener consistencia al agregar nuevas secciones.

Colores

Paleta completa organizada por función. El texto usa 3 niveles — Black para headlines, Body Text para párrafos, Tertiary para texto de apoyo — más Muted para meta y labels. Cada color referencia su equivalente en Tailwind (familia neutral).

Texto

Black
--black · #050505≈ tw neutral-950 · headlines h1–h6
Body Text
--text-body · #525252tw neutral-600 · párrafos
Tertiary
--text-tertiary · #404040tw neutral-700 · texto de apoyo
Muted Text
--gray-mid · #a3a3a3tw neutral-400 · meta y labels

Fondos

White
--white · #fffffftw white
Dark
--dark · #141414≈ tw neutral-900 · footer, testimonios
Light BG
--gray-bg · #f7f7f7≈ tw neutral-100 · secciones, hover de btn-text
Success BG
--success-bg · #eaf7ef≈ tw green-50
Subtle BG
--subtle-bg · #efefef≈ tw neutral-200

Bordes

Border Light
--gray-border · #f2f2f2≈ tw neutral-200 · divisores, bordes de imagen
Border Medium
--gray-300 · #d0d0d0≈ tw neutral-300 · separadores de tags
Border Subtle
--gray-100 · #f0f0f0≈ tw neutral-100

Acentos

Green Primary
--green · #0ea43b≈ tw green-600 · badge de disponibilidad
Green Secondary
--green-secondary · #2ecc71≈ tw green-500 · sobre fondo oscuro
Purple Accent
--purple-500 · #6A71DF≈ tw indigo-400 · eyebrows, bullets, stats

Overlays sobre fondo oscuro

Blanco con alpha, para el footer y las testimonial cards. No son colores planos: dependen del fondo sobre el que se apoyan.

Line
--on-dark-line · white 7%divisores del footer
Hover
--on-dark-hover · white 10%fondo hover de icon button
Border
--on-dark-border · white 14%bordes de control
Text
--on-dark-text · white 28%disclaimer, borde de btn-outline-white
Label
--on-dark-label · white 35%labels del footer

Estados

Dark Hover
--dark-hover · #1c1c1c≈ tw neutral-900 · hover de btn-primary

Tipografía

Inter en todos los pesos (400/500/600/700), incluyendo labels y microcopy técnico.

Familia

Inter — The quick brown fox font-family: 'Inter', sans-serif

Escala por breakpoint

Valores computados reales medidos a 1440px, 768px y 375px. Headline 1 y 2 usan clamp(), así que escalan de forma fluida entre esos anchos; el resto de la escala es fija.

El line-height se declara en em y el px entre paréntesis es lo que computa. Los que dicen heredado no declaran uno propio: toman el 1.4em de body, que resuelve a 22.4px fijos y se hereda como ese px, no como proporción.

Desktop 1440px
Tablet 768px
Mobile 375px
Headline 1h1 · clamp(38px, 6vw, 72px)
Aa
size72px
line-h1.25em (90px)
weight700
track-0.025em
Aa
size46.08px
line-h1.25em (57.6px)
weight700
track-0.025em
Aa
size38px
line-h1.25em (47.5px)
weight700
track-0.025em
Headline 2h2 · clamp(26px, 4vw, 38px)
Aa
size38px
line-h1.2em (45.6px)
weight700
track-0.02em
Aa
size30.72px
line-h1.2em (36.86px)
weight700
track-0.02em
Aa
size26px
line-h1.2em (31.2px)
weight700
track-0.02em
Headline 3h3 · fijo
Aa
size32px
line-h1.2em (38.4px)
weight500
track-0.04em
Aa
size32px
line-h1.2em (38.4px)
weight500
track-0.04em
Aa
size32px
line-h1.2em (38.4px)
weight500
track-0.04em
Headline 4card title · fijo
Aa
size18px
line-hheredado (22.4px)
weight600
tracknormal
Aa
size18px
line-hheredado (22.4px)
weight600
tracknormal
Aa
size18px
line-hheredado (22.4px)
weight600
tracknormal
Stats.stat-counter · fijo
Aa
size48px
line-h1.2em (57.6px)
weight700
tracknormal
Aa
size48px
line-h1.2em (57.6px)
weight700
tracknormal
Aa
size48px
line-h1.2em (57.6px)
weight700
tracknormal
Description.description · fijo
Aa
size18px
line-h1.4em (25.2px)
weight400
max-w640px
Aa
size18px
line-h1.4em (25.2px)
weight400
max-w640px
Aa
size18px
line-h1.4em (25.2px)
weight400
max-w640px
Body Textpárrafos · fijo
Aa
size16px
line-h1.65em (26.4px)
weight400
tracknormal
Aa
size16px
line-h1.65em (26.4px)
weight400
tracknormal
Aa
size16px
line-h1.65em (26.4px)
weight400
tracknormal
Texto secundariometa · fijo
Aa
size13px
line-hheredado (22.4px)
weight400
tracknormal
Aa
size13px
line-hheredado (22.4px)
weight400
tracknormal
Aa
size13px
line-hheredado (22.4px)
weight400
tracknormal
Field Labeluppercase · fijo
Aa
size11.5px
line-hheredado (22.4px)
weight600
track0.06em
Aa
size11.5px
line-hheredado (22.4px)
weight600
track0.06em
Aa
size11.5px
line-hheredado (22.4px)
weight600
track0.06em

Botones

2 estilos (primary / outline) × 2 tamaños (sm / lg). Todos comparten radio 100px (pill) y una micro-animación de dos líneas apiladas en hover.

Primary — fondo claro

Outline — fondo claro

Outline — fondo oscuro

Text — fondo claro

Outline con icono — "Próximo proyecto"

El icono va dentro de .btn-top y .btn-bot, después del texto. El gap: 8px de esas capas lo separa, y con stroke="currentColor" toma el color del botón. Se usa al pie de cada case study.

ClaseTipoEstilo
.btn-primaryEstilofondo negro, texto blanco
.btn-outlineEstiloborde 1.5px negro, texto negro (fondo claro)
.btn-outline-whiteEstiloborde 1.5px blanco 28%, texto blanco (fondo oscuro)
.btn-textEstilosin borde, solo texto — fondo gris sutil en hover (--gray-bg)
iconoVarianteSVG 14×14 con stroke="currentColor" dentro de .btn-top / .btn-bot
font-weightTodos500 · Consistente para todos los botones
.btn-smTamañopadding 14px 20px · font-size 16px · height 44px — CTA de nav
.btn-lgTamañopadding 13px 28px · font-size 16px — CTAs de sección

Tags & Pills

Badge neutro (Mis skills, Testimonios) y metadata de proyectos.

Mis skills
Testimonios
Blink.la · Diseño de producto

Project Card

Usada en la grilla de proyectos de home y en /proyectos. Cover 16:9, nombre y tags separados por punto medio.

ClaseUso
.projects-gridGrilla de 2 columnas que contiene las cards (1 columna en mobile)
.project-cardContenedor <a>: sin fondo ni borde propio, el texto queda "afuera" de la imagen
.project-cover-frameEnvoltorio de la imagen: radio 20px + overflow hidden, recorta el zoom del hover
.project-coverImagen de portada, aspect-ratio 16:9. En hover del card, escala a 1.06 (transición 0.6s)
.project-infoPadding superior mínimo debajo del cover, sin fondo
.project-nameTítulo del proyecto — Headline 4, 18px / 600
.project-tagsFila flex de tags + separadores
.project-tagCliente o disciplina, 16px, color body text
.project-sepPunto medio "·" entre tags, color body text

Testimonial Card

Usada en la sección de testimonios de home, sobre fondo oscuro.

Cita o testimonio de un colega describiendo la colaboración...

Nombre Apellido
Cargo · Empresa

Case study

Estructura de una página de proyecto completa (ej. /proyectos/ypf): eyebrow, meta, secciones de contenido y navegación prev/next.

Logo del cliente (antes del título)

Eyebrow de texto (fallback sin logo disponible)

YPF

Meta (Cliente / Año / Scope)

Cliente YPF
Año 2022
Scope Diseño UX / Diseño UI / Agile (Scrum)

Sección de contenido + lista

Desafío

  • Era fácil perder el progreso o cometer errores.
  • No existía una forma confiable de manejar la conectividad deficiente o nula.

Próximo proyecto

Va al pie de cada case study, dentro de .case-nav (alineado a la derecha). Es el .btn-outline del sistema con una flecha a la derecha; hereda la animación de hover de dos capas. No hay botón "anterior". El último proyecto vuelve al primero, y el link siempre apunta al mismo idioma de la página.

ClaseUso
.case-logoLogo del cliente arriba del título — height 28px, ancho auto (/images/logos)
.case-eyebrowNombre del cliente en texto — fallback cuando no hay logo
.case-hero / .case-subtitleTítulo del caso + bajada descriptiva
.case-metaFila Cliente / Año / Scope con borde inferior
.case-sectionCada bloque de contenido (Contexto, Desafío, Enfoque, etc.)
.case-subheadSubtítulo dentro de una sección (ej. "Metodología", "Componentes clave")
.case-listLista con bullet circular gris
.case-img / .case-img-gridImagen de soporte a ancho completo, o grilla de 2
.case-navContenedor del botón "Próximo proyecto" al pie — un solo .btn-outline con flecha, alineado a la derecha
.case-captionTexto gris chico centrado debajo de una imagen
.case-quoteCita destacada con borde izquierdo, para una frase clave
.case-statMétrica destacada (número grande + label)
.case-calloutBloque destacado con fondo gris para un mensaje final

Iconografía

SVG lineales, stroke 1.5px, sin relleno. Contenedor de 38×38px con esquinas de 11px para skills.

Wireframing & Pixel-perfect UI
UX Research
Design Systems
Colaboración entre equipos

Espaciado & radios

Contenedor centrado a 1040px. Radios consistentes por tipo de elemento.

Border radius

Pill / botones
100px
Cards
20px
Skill row / mini nav
14px
Skill icon
11px
Avatares / icon btn
50%

Contenedor

TokenValorUso
--max-w1040pxAncho máximo de todas las secciones del sitio (imágenes, grillas)
--case-text-w880pxAncho máximo para secciones de texto en case studies (más estrecho que imágenes)
padding lateral24pxPadding horizontal consistente en mobile/desktop
padding vertical (sección)88pxSeparación entre bloques grandes (Projects, Skills, Testimonials)
gap grid16pxSeparación entre cards en grillas

Responsive

Cómo se adaptan los estilos tipográficos y espaciados en diferentes resoluciones.

Headline 1 (título principal)

Mobile 375pxTablet 768pxDesktop 1440px
font-size38px46.08px72px
font-weight700
line-height1.25em
letter-spacing-0.025em
declaraciónclamp(38px, 6vw, 72px)

Headline 2

Mobile 375pxTablet 768pxDesktop 1440px
font-size26px30.72px38px
font-weight700
line-height1.2em
letter-spacing-0.02em
declaraciónclamp(26px, 4vw, 38px)

Body Text

Mobile (max 720px)Tablet/Desktop
font-size16px16px
line-height1.65em
colorvar(--text-body) · #525252

Botones

Mobile (max 720px)Desktop
.btn-smpadding: 10px 16px · font-size: 14pxpadding: 14px 20px · font-size: 16px
.btn-lgpadding: 13px 28px · font-size: 14.5px
border-radius100px (pill)

Espaciado de secciones

MobileDesktop
padding vertical (sección)48px88px
padding horizontal24px (ambos)
gap grid (cards)16px (1 columna mobile)16px (2 columnas)

Breakpoints

NombreTamaño máximoCambios principales
Mobilemax-width: 720pxfont-size reducidos, padding, 1 columna grillas
Tablet720px - 1024pxsizing intermedio, 2 columnas
Desktop1024px+tamaños completos, max-width 1040px

Stat Counter

Componente de número animado que crece desde 0 cuando entra en viewport.

Ejemplo

0+
años de experiencia
AtributoTipoDescripción
data-valuenúmeroValor final al que animar (ej: 15, 30, 95)
data-unitstringUnidad a mostrar después del número (ej: +, %, años)
.stat-valueelementoContenedor para el número que se anima
.stat-unitelementoContenedor para la unidad

Comportamiento

  • El contador detecta cuando entra en viewport usando IntersectionObserver
  • Anima el número desde 0 hasta el valor especificado en ~1.5 segundos
  • Solo anima una vez por sesión
  • Compatible con valores enteros y decimales