We design and build premium digital products, brands, and experiences.
Un lienzo gris pálido, tinta casi negra y tipografía de 314px componiendo el logo de la página. El estudio que escribió r3f-scroll-rig esconde un motor WebGL debajo de lo que parece un PDF elegante.
Un solo peso tipográfico (400) en todo el sitio: el énfasis se hace con la escala (de 13px a 314px, un salto de 24x), con la itálica o con el highlight beige que subraya palabras al hacer scroll. Los neutros de apoyo son arenas cálidas y el color saturado entra solo por proyecto. Cero sombras: la profundidad es física, no óptica.
La tesis del sistema, medida: el acento con más área de todo el sitio (#FFF38B, score 1.44M, segundo tras el blanco) no pertenece al estudio sino a un proyecto. El :root incluso tokeniza la paleta del cliente (--color-aila-*). 14islands se mantiene neutro para que el trabajo ponga el color; el marco no compite jamás con el cuadro.
Tinta #070707 sobre: #F2F2F2 → 18:1 · #FFFFFF → 20.2:1 · #EAE5DF → 16.1:1 · #FFF38B → 17.7:1 · #FFCA6B → 13.3:1 · #A5A9FD → 9.3:1. Todo AAA: el casi negro funciona sobre cualquier superficie del sistema o de proyecto. Las trampas son los grises: #797979 solo desde 19px, y #A2A2A9 únicamente como forma gigante.
Todo el sitio (display de 314px y labels de 13px por igual) usa peso 400. No hay bold: cuando 14islands quiere énfasis, cambia la escala, pasa a la itálica de Aften o hace crecer el highlight beige detrás de la palabra. El display se comporta como logotipo: 314.81px medidos con line-height 0.8 y tracking -0.05em, compuesto en escalones asimétricos. El cuerpo hace lo contrario: 13-16px, interlínea 1.4-1.5 y tracking normal, quieto y neutro.
El tracking negativo crece con el tamaño y desaparece en texto funcional: -0.05em a 314px, -0.04em a 83px, normal a 13px.
| Rol | Size real | Weight | LH | Tracking |
|---|---|---|---|---|
| display hero | 314.81px | 400 | 0.8 | -0.05em |
| display md (h4 contacto) | 83.33px | 400 | 1.0 | -0.04em |
| body | 16px | 400 | 1.5 | normal |
| label / nav | 12.96px | 400 | 1.4 | normal · uppercase |
| itálica de acento | hereda | 400 | hereda | AftenScreenItalic real |
El display escala en vw sin topar: en una pantalla 4K el hero es arquitectura. Los @font-face reales son cuatro: AftenScreen, AftenScreenItalic, BentonSans e Inter (auxiliar).
El sitio casi no tiene botones: tiene texto que actúa. El control real es el label de 13px uppercase con un subrayado de 1px que entra de izquierda a derecha (curva --ease-cubic). Los botones sólidos son derivados del sistema: tinta #070707 con radio 5px, y la variante arena #EAE5DF para acciones suaves.
El rectángulo #E4DED7 hace scaleX de 0 a 1 detrás de la palabra al entrar al viewport. El texto no cambia de color ni de peso: el fondo hace el énfasis.
Card de trabajo (componente firma): radio 5px, sin borde y sin sombra; el color del proyecto separa la card del canvas. En el sitio real la imagen vive en el canvas WebGL global y se distorsiona con la velocidad del scroll; aquí el hover escala el contenido con --ease-quint-out como eco de ese gesto.
Footer de contacto (componente firma): el email es un h4 de display real (83.33px medidos, line-height 1.0, tracking -0.04em) y toda su caja es clickeable. Debajo, los créditos vuelven al registro diminuto de 13px uppercase. La tensión entre las dos escalas es la composición.
El motivo por el que este sitio está en la galería: 14islands escribió @14islands/r3f-scroll-rig y su home es la demo canónica del patrón. Las clases reales del html (js-has-global-canvas lenis lenis-smooth) delatan la arquitectura: un único canvas WebGL global persigue a las imágenes del DOM para aplicarles shaders, con Lenis amortiguando el scroll debajo. Y el motion está tokenizado igual que el color: 25 curvas de easing con nombre en el :root.
| Token real | Curva | Uso |
|---|---|---|
| --ease-cubic | cubic-bezier(.66, 0, .34, 1) | La curva de la casa: subrayados, transiciones de interfaz |
| --ease-expo-out | cubic-bezier(.19, 1, .22, 1) | Entradas de display y reveals |
| --ease-quint-out | cubic-bezier(.23, 1, .32, 1) | Deceleraciones suaves, media |
| --ease-back-out | cubic-bezier(.175, .885, .32, 1.275) | Overshoot clásico |
| --ease-back-out-more | cubic-bezier(.56, .91, .465, 1.65) | Overshoot 1.65: el único gesto juguetón del sistema |
| + 20 más | in / out / in-out | Penner completa: sine, quad, cubic, quart, quint, expo, circ |
Simétrica y contenida: cubic-bezier(.66, 0, .34, 1). Acelera y frena con la misma elegancia; es la voz neutral de la interfaz.
El único rebote permitido: cubic-bezier(.56, .91, .465, 1.65), overshoot de 1.65 reservado para momentos de juego, nunca para la lectura.
Accesibilidad: con prefers-reduced-motion, Lenis cede al scroll nativo, el canvas congela las distorsiones (las imágenes se muestran planas), los reveals aparecen completos y el highlight se pinta sin animación. Esta página aplica la misma regla a sus demos.
Filosofía del layout: el vacío es la ornamentación. Un protagonista por viewport (titular gigante, o card de trabajo, o bloque de texto) y un label diminuto de 13px como contrapeso en la esquina. Entre el label y el display de 314px no hay elementos intermedios que llenen: la tensión entre lo diminuto y lo enorme es la composición.
:root {
/* nombres reales del :root de 14islands.com */
--color-almost-black: #070707;
--color-background: #F2F2F2;
--color-white: #FFFFFF;
--color-sand: #EAE5DF;
--color-sand-highlight: #A59D92;
--color-grey-highlight-dark: #797979;
--color-grey-highlight-light: #A2A2A9;
--color-beige-theme-animated-text-highlight-bg: #E4DED7;
--color-dark-theme-animated-text-highlight-bg: #26272A;
/* paleta de proyecto tokenizada (real) */
--color-aila-purple: #A5A9FD;
--color-aila-yellow: #FFCA6B;
--color-aila-grey: #1F1F1F;
--color-aila-almost-black: #101010;
/* limón HeroKit, medido por área en el canvas WebGL: #FFF38B */
--font-display: "Work Sans"; /* sustituta de Aften Screen */
--font-body: "Libre Franklin"; /* sustituta de Benton Sans */
--radius-soft: 5px; /* thumbs y controles; el texto sin caja */
--shadow: none; /* cero sombras medidas */
/* espaciado maestro (real) */
--indent: max(0.9375rem, 3.7615740741vw);
--menuNavigationHeight: max(5rem, 7.6967592593vw);
--breakpoint-medium: 600px;
--breakpoint-desktop: 900px;
--breakpoint-large: 1400px;
/* easings reales (25 tokens; los principales) */
--ease-cubic: cubic-bezier(0.66, 0, 0.34, 1);
--ease-expo-out: cubic-bezier(0.19, 1, 0.22, 1);
--ease-quint-out: cubic-bezier(0.23, 1, 0.32, 1);
--ease-back-out: cubic-bezier(0.175, 0.885, 0.32, 1.275);
--ease-back-out-more: cubic-bezier(0.56, 0.91, 0.465, 1.65);
}@theme {
--color-almost-black: #070707;
--color-background: #F2F2F2;
--color-white: #FFFFFF;
--color-sand: #EAE5DF;
--color-sand-highlight: #A59D92;
--color-grey-mid: #797979;
--color-grey-soft: #A2A2A9;
--color-highlight-beige: #E4DED7;
--color-highlight-dark: #26272A;
--color-aila-purple: #A5A9FD;
--color-aila-yellow: #FFCA6B;
--color-aila-grey: #1F1F1F;
--color-aila-almost-black: #101010;
--color-lemon-herokit: #FFF38B;
--font-display: "Work Sans", "Helvetica Neue", sans-serif;
--font-body: "Libre Franklin", Arial, sans-serif;
--radius-soft: 5px;
--spacing-indent: max(0.9375rem, 3.76vw);
--spacing-nav: max(5rem, 7.7vw);
--ease-cubic: cubic-bezier(0.66, 0, 0.34, 1);
--ease-expo-out: cubic-bezier(0.19, 1, 0.22, 1);
--ease-back-out-more: cubic-bezier(0.56, 0.91, 0.465, 1.65);
--text-display-hero: 19.7vw; /* 314.81px @1600, LH 0.8, -0.05em */
--text-display-md: 5.2vw; /* 83.33px @1600, LH 1.0, -0.04em */
--text-body: 16px; /* LH 1.5 */
--text-label: 12.96px; /* uppercase, LH 1.4 */
}{
"colors": {
"almost-black": "#070707",
"background": "#F2F2F2",
"white": "#FFFFFF",
"sand": "#EAE5DF",
"sand-highlight": "#A59D92",
"grey-mid": "#797979",
"grey-soft": "#A2A2A9",
"highlight-beige": "#E4DED7",
"highlight-dark": "#26272A",
"project": {
"aila-purple": "#A5A9FD",
"aila-yellow": "#FFCA6B",
"aila-grey": "#1F1F1F",
"aila-almost-black": "#101010",
"herokit-lemon": "#FFF38B"
}
},
"typography": {
"display-hero": {
"fontFamily": "Aften Screen",
"substitute": "Work Sans",
"fontSize": "314.81px @1600 (fluido en vw)",
"fontWeight": 400,
"lineHeight": "0.8",
"letterSpacing": "-0.05em"
},
"display-md": {
"fontFamily": "Aften Screen",
"substitute": "Work Sans",
"fontSize": "83.33px @1600",
"fontWeight": 400,
"lineHeight": "1.0",
"letterSpacing": "-0.04em"
},
"accent-italic": {
"fontFamily": "Aften Screen Italic",
"substitute": "Work Sans Italic",
"fontWeight": 400
},
"body": {
"fontFamily": "Benton Sans",
"substitute": "Libre Franklin",
"fontSize": "16px",
"fontWeight": 400,
"lineHeight": "1.5",
"letterSpacing": "normal"
},
"label": {
"fontFamily": "Benton Sans",
"substitute": "Libre Franklin",
"fontSize": "12.96px",
"fontWeight": 400,
"lineHeight": "1.4",
"letterSpacing": "normal",
"textTransform": "uppercase"
}
},
"rounded": {
"soft": "5px",
"text": "0px"
},
"shadow": {
"system": "none"
},
"spacing": {
"indent": "max(0.9375rem, 3.7615740741vw)",
"menu-height": "max(5rem, 7.6967592593vw)",
"breakpoints": [600, 900, 1400]
},
"motion": {
"ease-cubic": "cubic-bezier(0.66, 0, 0.34, 1)",
"ease-expo-out": "cubic-bezier(0.19, 1, 0.22, 1)",
"ease-quint-out": "cubic-bezier(0.23, 1, 0.32, 1)",
"ease-back-out-more": "cubic-bezier(0.56, 0.91, 0.465, 1.65)",
"architecture": "lenis + canvas WebGL global (r3f-scroll-rig, autoría propia)",
"html-classes": "js-has-global-canvas lenis lenis-smooth js-smooth-scrollbar-enabled"
}
}__DSG_EMBED__