Un sistema para aumentar lo humano.
Neo organiza marca, producto, motion, IA, fotografía y voz para que cada experiencia Wiwo se sienta cálida, clara y profundamente humana. La inteligencia trabaja por dentro; las personas viven al frente.
Humanity Augmented
La tecnología no es la protagonista. Lo son las personas que cuidan, enseñan, crean, venden, construyen y hacen posible el futuro. Wiwo amplifica su capacidad sin borrar aquello que las hace humanas.
Menos futuro como estética.
Más futuro como capacidad.
Neo deja de representar la inteligencia con abundancia de efectos futuristas. La expresa a través de personas que pueden hacer más: mejores decisiones, más creatividad, más cuidado, más tiempo y más posibilidades.
La persona primero
Rostros, manos, vínculos, oficio y emoción son el foco. La tecnología aparece como apoyo, nunca como sustituto.
Beige como mundo
El beige ocupa entre 60% y 80% de las composiciones. Construye luz, calma, cercanía y continuidad visual.
Serif como voz
Instrument Serif o Fraunces expresan humanidad, preguntas, manifiestos y conceptos emocionales.
Tech en microdosis
Tomorrow Light/Regular, siempre en mayúsculas, nombra versiones, datos, coordenadas y estados pequeños.
Antes de mostrar qué puede hacer la inteligencia, Wiwo pregunta para quién puede hacerlo.
La lógica antes de la forma.
Principios, voz y conceptos retóricos que hacen que cada interfaz Wiwo tenga criterio antes de tener componentes.
Principios
Humanity, Augmented. define cómo se toman decisiones de interfaz, narrativa y experiencia. Todo parte de una pregunta: ¿esto amplifica a una persona o solo exhibe tecnología?
Humano, no demostrativo
La tecnología se demuestra a través de lo que permite hacer. Prioriza personas, consecuencias y posibilidades por sobre pantallas o efectos.
Editorial y respirable
Mucho beige, titulares serif con emoción, bloques claros y aire suficiente para que la imagen humana tenga presencia.
Inteligencia silenciosa
La interfaz explica estado, criterio y próximo paso sin presumir magia. El sistema es avanzado, pero su expresión es serena.
Contraste con propósito
Azul para identidad, lime para una acción decisiva y Tomorrow para la señal técnica. Ningún acento debe competir con la persona.
Retórica
Un slogan corporativo y cuatro territorios de apoyo. Humanity, Augmented. sostiene la marca Wiwo; los demás conceptos explican facetas específicas de su promesa.
Humanity Augmented
Wiwo existe para hacer más posible lo humano. La inteligencia artificial, los datos y la automatización no son el destino: son capacidades al servicio del criterio, la creatividad, el cuidado y la ambición de las personas.
Una promesa.
Cuatro maneras de demostrarla.
X10, The Power of You, Simple por fuera e Imagine Tomorrow no compiten como slogans corporativos. Funcionan como pruebas, enfoques o capítulos de Humanity, Augmented.
Lo humano,
amplificado.
La tecnología expande criterio, creatividad, intuición, cuidado y experiencia sin borrar la singularidad de cada persona.
Multiplicación real.
Velocidad, eficiencia, inteligencia y capacidad operativa multiplicadas por tecnología.
La persona al centro.
La tecnología se adapta a las personas, no al revés.
Brutal por dentro.
Ocultar complejidad para entregar fluidez, claridad y control.
El futuro se construye.
El mañana no se espera: se imagina, se diseña y se convierte en sistemas reales.
Una identidad que se siente humana.
Logo, serif, beige, fotografía y acentos técnicos trabajan como un solo sistema: editorial por fuera, profundamente inteligente por dentro.
Marca
Neo conserva los archivos maestros de Wiwo y documenta el lockup Humanity, Augmented. como firma principal. Los descriptores de verticales siguen siendo funcionales; el slogan pertenece a toda la compañía.
Una marca reconocible sin quitarle espacio a la persona.
Beige construye el mundo; azul firma; lime interrumpe con intención. El slogan corporativo une compañía, plataformas y verticales bajo una misma visión humana.
Un slogan para toda la compañía.
Descriptores para cada capacidad.
Humanity, Augmented. es la firma corporativa y conceptual. “For Business”, “For Shops”, “For Health”, Lab, Talk y MetriQ identifican unidades o productos; nunca sustituyen el slogan en comunicaciones maestras.
En campañas institucionales: wiwo. + Humanity, Augmented. En producto: nombre de producto primero y el slogan como firma de cierre. No reutilizar antiguos claims de neoagencia como posicionamiento corporativo.
Presentación obligatoria
Cuando se presente el sistema de logo, muestra los dos archivos maestros —azul y beige— y la aplicación azul sobre campo verde. El símbolo se presenta aparte como ícono, loader o sello.
El Lazo Infinito.
El símbolo de wiwo nace de un solo trazo que se pliega sobre sí mismo: dos vértices que se cruzan sin principio ni final. Es, al mismo tiempo, una W —la inicial de wiwo— y el signo del infinito puesto de pie.
El loop representa la conexión permanente entre posibilidades: ideas que se entrelazan, tecnología que dialoga con estrategia, marcas que se conectan con personas. Donde una línea parece terminar, gira y vuelve a empezar: el mismo movimiento de la innovación.
Proporción intacta
No comprimir, expandir ni reconstruir. El logotipo mantiene su relación 1085:366 y el símbolo 505:369.
Contraste por fondo
Azul sobre beige o superficies claras. Beige solo sobre tinta #292929 o fotografías con una zona oscura uniforme. Nunca beige sobre beige; verde solo para activación.
Zona segura
Reserva al menos la altura del punto final alrededor del logo. En interfaces compactas, usa el símbolo antes de reducir demasiado el logotipo.
Sin filtros
No aplicar sombras duras, recolor por CSS, blur ni efectos encima del archivo. Cambia de variante según el fondo.
La marca también respira.
El wordmark de Wiwo puede moverse, pero siempre como una presencia precisa: nada de deformarlo, estirarlo, rotarlo en exceso ni taparlo con efectos. La animación debe revelar intención, estado o transición.
- Animar el contenedor, la máscara o el aura; no distorsionar el PNG del logo.
- Usar verde y gradiente para actividad IA, éxito, carga o generación.
- Duraciones suaves: microinteracción bajo 420ms; loop premium entre 2.4s y 4.4s.
Brand breathe
Loop casi imperceptible para hero, sidebar, empty states o pantallas de espera largas. Se siente vivo sin parecer loader.
Liquid reveal
Entrada de marca para loaders premium, modales de bienvenida y cambios de sección. El reveal ocurre por máscara, no por deformación.
Gradient sweep
Barrido luminoso para estados IA: pensando, generando, exportando o sincronizando. La luz pasa sobre la marca y se retira.
Loader lockup
Para carga de marca, exports o generación de entregables. Aparece, se estabiliza y sale con calma; nunca parpadea ni grita.
Descarga de assets
Archivos PNG transparentes listos para Figma, web, presentaciones y piezas comerciales.
Fotografía
La fotografía Wiwo observa personas reales con cercanía editorial: piel, gestos, vínculos, oficios y pequeños momentos de transformación. Beige como luz; tecnología como detalle.
Primero la vida. Después la tecnología.
La escena debe poder emocionar incluso si eliminamos toda interfaz. El sistema aumenta la historia; nunca es la historia.
Más documental.
Menos futurista.
Calidez analógica, textura de piel, luz natural, grano sutil y actuaciones no posadas. La tecnología aparece en microgestos: una señal, un dato, un objeto translúcido o una capa casi invisible.
Textura real, miradas imperfectas y presencia. Evitar belleza plástica, exceso de retoque o modelos sin historia.
Cuidar, enseñar, crear, vender, construir, aprender o vincularse. La escena siempre expresa una capacidad humana.
Beige #F8FAD7/#EDEFDD domina; lavanda y azul acompañan; lime aparece como una señal pequeña pero inolvidable.
Luz beige
Prioriza luz natural, tonos crema y sombras suaves. El beige no es un fondo neutro: es la atmósfera principal.
Personas con propósito
La persona hace algo significativo o comparte un vínculo real. Evita poses vacías, gestos de stock o entusiasmo forzado.
Tecnología secundaria
Incluye interfaz, dato u objeto solo cuando ayuda a entender la capacidad. Nunca debe tapar el rostro o dominar la escena.
Marca en detalle
Lime, azul y lavanda aparecen en un borde, prenda, objeto, tipografía o interfaz mínima; nunca como baño cromático total.
Evitar perfección artificial
Nada de cyber, piel encerada, oficinas de stock, CGI dominante o escenas imposibles. Wiwo es cálido, actual y reconocible.
Biblioteca visual con propósito.
Las imágenes se ordenan por la experiencia humana que ponen al frente —vínculo, cuidado, oficio, aprendizaje, creación y vida cotidiana—, no por el formato técnico que las contiene. La tecnología puede aparecer, pero nunca define por sí sola la escena.
Selecciona por historia
Antes de usar una imagen, define qué experiencia humana expresa: vínculo, oficio, cuidado, aprendizaje, creación o vida cotidiana.
Color al servicio
El beige construye atmósfera; azul y lime aparecen como señales pequeñas. El color nunca debe competir con el rostro o la acción.
Acción verdadera
Las personas hacen algo significativo o comparten un vínculo real. Evita poses vacías, entusiasmo forzado y gestos de stock.
Tecnología en segundo plano
Interfaces, datos y objetos aparecen solo si ayudan a entender la capacidad. Nunca tapan el rostro ni dominan la escena.
Movimiento para personas reales.
La dirección audiovisual observa antes de demostrar: gestos, miradas, manos, oficio y colaboración. La luz beige construye cercanía; azul y lime aparecen como señales breves de una tecnología que acompaña.
Cámara
Plano sostenido, acercamiento suave y movimiento a la altura de la mirada. Evita órbitas robóticas, cámara nerviosa o velocidad demostrativa.
Luz y color
Beige luminoso y piel natural como territorio dominante. Azul identifica; lime activa. Evita neón distópico, metal oscuro o brillos sin calidez.
Edición
Dar tiempo a la expresión y a la acción: planos de 600 a 1200ms como base. Las microinteracciones pueden vivir en 160/280ms sin acelerar el relato humano.
Uso correcto
Estos archivos son referencia visual. No prometer video real si no existe archivo fuente, render o pieza editada.
Tokens, componentes y patrones.
La parte consumible: fuente única de tokens, componentes para producto real y reglas de layout que escalan.
Tokens
Base reutilizable para web, Figma y producto. Primero se nombran las funciones; después, los colores de marca.
Color
El beige domina el sistema. El azul firma y organiza; el lime identifica la expresión humana; el verde intenso comunica acción y progreso; la tinta sostiene la lectura. Regla estricta: ningún verde se usa como texto sobre fondos claros.
Degradados
El degradado verde–azul se conserva para estados de sistema, IA activa y motion. No es fondo editorial ni recurso dominante de campaña.
Tipografía
El sistema usa Instrument Serif, Fraunces, Plus Jakarta Sans, Outfit y Tomorrow. En este documento están autohosteadas las variantes necesarias para representar fielmente la jerarquía.
Forma y espacio
El sistema usa formas simples: tarjetas con radio base de 16px, superficies expresivas de 24–36px, controles tipo píldora, focos visibles y grillas con ritmo de 4/8px.
Modo oscuro semántico
Los modos claro y oscuro comparten nombres semánticos: las vistas cambian al cambiar --surface, --ink, --line y los contenedores.
Tokens como código
El HTML documenta el sistema y expresa el contrato canónico de tokens. En una implementación de producto, ese contrato debe exportarse a JSON y regenerar cada salida desde una sola fuente.
npm run build:tokens
Una fuente, tres consumos
Estos archivos se generan desde el JSON. No se editan a mano: web, Figma y Tailwind deben leer el mismo origen para evitar deriva.
--wiwo-beige
#F8FAD7
Fondo principal, secciones largas, documentos, superficies de lectura.
--wiwo-beige-alt
#EDEFDD
Fondos secundarios, bloques alternos, superficies operativas y áreas de descanso visual.
--wiwo-blue
#4242FF
Identidad, foco, selección, links importantes y elementos de confianza.
--wiwo-lime
#8AF84F
Acento humano, lockup de Humanity, Augmented. e interrupciones editoriales puntuales.
--wiwo-green
#3BFF00
Acción primaria, energía y progreso. Nunca usar como texto sobre beige o blanco; solo sobre oscuro, como relleno con tinta encima o en gráficos no textuales.
--wiwo-gradient-primary
103deg
Momentos de IA, transformación y transiciones de estado. No usar como fondo editorial dominante.
--chart-primary
#4242FF
Serie principal de KPIs: revenue, conversión, selección y foco en dashboards.
--chart-positive
#3BFF00
Crecimiento, progreso positivo, completion y mejoras confirmadas.
--chart-grid
Light / Dark
Líneas de chart semánticas. Cambian con el tema para no hardcodear grillas.
--glass-fill
rgba 24%
Capas liquid glass: toolbars, overlays, docks, command palettes y estados flotantes.
--surface
Light beige / Dark ink
Fondo base del producto. Cambia con el tema y evita fondos hardcodeados por pantalla.
--surface-container
Elevación semántica
Cards, tablas, tool surfaces y paneles operativos. En dark se eleva sin usar negro sólido.
--ink
Light #292929 / Dark beige
Texto principal. No usarlo como fondo; para superficies opuestas existe --surface-inverse.
--line
Borde por tema
Separadores y contornos. En dark baja opacidad para que el dashboard no se vea alambrado.
--surface-inverse
Modo opuesto
Botones sobrios, headers de tablas y contenedores premium; siempre con --ink-inverse.
Componentes
Componentes mínimos para empezar un producto Wiwo: acción clara, estados visibles y contenido fácil de escanear.
Foco visible real
Todo control interactivo usa :focus-visible con ring azul/verde según tema. El foco no depende de hover ni de color solamente: debe verse en teclado, formularios, icon buttons, chips y nav.
Contraste aprobado
La paleta Wiwo se usa con pares cerrados. Si el fondo se mueve, el texto necesita overlay, glass o contenedor estable.
| Fondo | Texto | Uso | Regla |
|---|---|---|---|
| Beige #F8FAD7 / #EDEFDD | #292929 | UI base, lectura, dashboards | Aprobado para texto normal y largo. |
| Verde #3BFF00 | #292929 | CTA, estado activo, success | Nunca usar blanco sobre verde lima. |
| Azul #4242FF | #FFFFFF o #F8FAD7 | Marca, foco, selección | Aprobado para botones, chips y headers. |
| Ink #292929 | #F8FAD7 | Dark mode, cards premium | No usar negro sólido; ink es el límite oscuro. |
| Gradiente Wiwo | #292929 sobre glass claro o #F8FAD7 sobre overlay ink | IA, progreso, transformación | Texto directo solo si el fondo queda estabilizado. |
Botones y acciones
Usa verde para la acción más importante, ink #292929 para acción sobria y grupos conectados cuando hay decisiones hermanas.
Chips y filtros
Los chips agrupan contexto, no reemplazan titulares. Buenos para estados de IA, categorías y filtros rápidos.
Formulario
Labels siempre visibles. Ayuda corta. Foco azul. Error con texto específico, no solo color.
Estados
Los estados deben poder leerse sin depender del color. Incluye nombre, icono o microcopy.
Navegación de producto
Nav compacta, íconos reconocibles, estado activo evidente y superficie limpia para trabajo repetido.
Briefs activos
Patrón hero / portada
Para piezas editoriales o comerciales, usar imagen real o arte generado. El texto va sobre la escena, no en una tarjeta flotante.
Liquid glass
Úsalo para capas flotantes sobre color o video: dock, comando, búsqueda, overlays y estados que necesitan profundidad.
Componentes para producto real
Wiwo Boost, MetriQ y cualquier herramienta operativa necesitan UI de trabajo: tablas densas, feedback claro, estados vacíos útiles, paginación, dialogs accesibles y una paleta estable para KPIs.
Tablas para dashboards
La tabla es componente crítico: debe permitir escaneo, comparación, sorting, filtros, estados, tendencia, progreso y paginación sin convertirse en una grilla de tarjetas.
| Cliente | Etapa | KPI | Tendencia | Señal | Próxima acción |
|---|---|---|---|---|---|
| Retail launchPaid + retail media | Live | 84% brief clarity | +12% | Priorizar audiencias con intención alta. | |
| Audience mapMetriQ cohort scan | Revisión | 62% fit score | -4% | Corregir segmento y excluir ruido. | |
| Creative routesBoost generative flow | Listo | 12 assets aprobados | +31% | Exportar formatos por canal. |
Toasts y empty states
El feedback debe confirmar lo que pasó, decir qué hacer ahora y no esconder estados importantes en una esquina sin contexto.
Sin campañas comparables
Explica por qué está vacío, qué falta y cuál es el primer paso útil. Nada de pantallas muertas.
Modales para decisiones reales
Un modal no es una decoración: interrumpe el flujo solo cuando la decisión importa, mantiene foco, explica impacto y vuelve al punto de origen al cerrar.
Interrumpir solo cuando agrega claridad.
Usa modales para confirmar acciones críticas, guiar agentes IA o resolver errores específicos. Si la acción puede vivir inline, evita bloquear la pantalla.
Interacciones entre ventanas
Cuando una acción mueve contexto entre modal, panel, agente, preview o export, la transición debe sentirse como un traspaso de estado: no una pantalla nueva desconectada.
Una ventana entrega contexto a la siguiente.
Este patrón sirve para productos con IA, dashboards y workflows de campaña: cada ventana recibe contexto, hace visible el trabajo invisible y deja claro cuál es el siguiente paso.
Campaña retail Q3
Recibe audiencia, objetivo, presupuesto y restricciones antes de pedirle trabajo a la IA.
Agente de rutas
Toma el brief y genera caminos, riesgos, assets necesarios y próximos pasos.
Vista de impacto
Convierte la propuesta en composición, KPIs esperados y cambios visibles.
Entrega final
Cierra el ciclo: archivos, tracking, historial, responsables y siguiente señal.
Lightbox para assets, video y evidencia
El lightbox se usa cuando el usuario necesita inspeccionar una pieza sin salir del flujo: imagen, frame de video, mockup, asset de campaña o evidencia visual. Debe abrir rápido, oscurecer contexto, mantener navegación y devolver foco al trigger.
Inspeccionar sin perder contexto.
Usa fondo ink con blur, panel lateral glass y controles mínimos. No convierte la galería en un carrusel decorativo: cada apertura responde a una intención de revisión.
Paleta para KPIs y charts
Los gráficos no deben inventar colores por pantalla. Usa tokens de chart, reserva lime para acción/positivo, azul para serie principal y deja danger solo para problemas reales.
Revenue pulse
Serie principal + positivo + alerta--chart-grid cambia con light/dark.Wiwo Expressive
El sistema usa tácticas expresivas: contraste de forma, contención tonal, grupos de acción, motion con easing y jerarquía por tamaño.
IA, bots y microanimaciones
En Wiwo la IA no aparece como un spinner genérico. Se comporta como una capa viva: escucha, piensa, propone, confirma y se retira sin robar protagonismo. El movimiento debe explicar que el sistema está trabajando, pero siempre con calma, precisión y una estética optimista.
Cómo interactúan los bots
Los bots se ven como agentes coordinados, no como ventanas sueltas. Cada agente declara qué está haciendo, qué encontró y cuál es la próxima acción útil.
Letras, ventanas y modales
El texto generado por IA aparece con reveal editorial, no con máquina de escribir lenta. Las ventanas entran desde profundidad y desaparecen con compresión suave, como si el sistema limpiara el espacio para la siguiente decisión.
El modal confirma, entrega una acción y luego se retira con escala .985 y 10px hacia arriba. La capa de fondo se apaga en 160ms.
Cómo viven los gradientes en plataformas Wiwo
El gradiente no debe ser una alfombra decorativa permanente. Debe aparecer como energía del sistema: borde vivo, halo de IA, progreso, foco de selección, transición de estado o momento de transformación.
Reglas avanzadas para IA y microinteracciones
La experiencia debe sentirse cara: pocas cosas se mueven al mismo tiempo, cada movimiento tiene causa y todo vuelve rápido a un estado legible.
"use client";
import { useRef } from "react";
import gsap from "gsap";
import { useGSAP } from "@gsap/react";
import { ScrollTrigger } from "gsap/ScrollTrigger";
import { SplitText } from "gsap/SplitText";
gsap.registerPlugin(useGSAP, ScrollTrigger, SplitText);
export function AiMotionSection() {
const scope = useRef<HTMLElement>(null);
useGSAP(() => {
if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return;
const split = SplitText.create("[data-ai-title]", {
type: "words,chars",
mask: "words"
});
const tl = gsap.timeline({
defaults: { ease: "power3.out" },
scrollTrigger: { trigger: scope.current, start: "top 72%" }
});
tl.from(split.chars, { y: 14, opacity: 0, filter: "blur(6px)", stagger: 0.018, duration: 0.42 })
.from("[data-agent-card]", { y: 18, opacity: 0, scale: 0.98, stagger: 0.08, duration: 0.5 }, "-=0.2")
.to("[data-modal]", { y: -10, opacity: 0, scale: 0.985, filter: "blur(6px)", duration: 0.18 }, "+=1.2");
return () => split.revert();
}, { scope });
return <section ref={scope} data-ai-motion-section />;
}
Wiwo Thinking Orb
El orb es la señal propia de Wiwo para comunicar que una plataforma o IA está pensando. No es un loader ni un spinner: es una señal viva, precisa y serena que respira, razona, genera y vuelve a la calma.
Estados de pensamiento
Cada estado cambia ritmo, brillo, deformación y dirección del movimiento. El usuario debe sentir que algo inteligente está ocurriendo, sin perder legibilidad ni calma.
Cómo construirlo en plataformas Wiwo
El orb puede vivir en CSS para producto liviano, Rive para estados vectoriales exportables o Three.js / React Three Fiber cuando se necesita profundidad real, shaders y escenas tipo WiwoSurface.
- GSAP + SplitTextSincroniza cambio de estado, texto animado y salida de respuestas con timelines precisos.
- ScrollTrigger + LenisActiva el orb con scrub, pinning y scroll suave en demos, onboarding o presentaciones.
- RiveIdeal para estados pequeños, botones IA, micro loaders y componentes exportables entre producto y marketing.
- Three.js / React Three FiberUsar para orbs grandes, escenas inmersivas, shaders, refracción, partículas y profundidad real.
Tamaños, contexto y restricciones
El orb reemplaza esperas genéricas en propuestas, análisis, contenido, reportes, automatizaciones, chat, insights y módulos con agentes. Debe sentirse preciso y sereno, nunca decorativo.
Vidrio funcional, no decorativo.
Capas translúcidas para contextos de IA, barras de herramientas y superposiciones de alto foco. Usar solo cuando la profundidad ayude a entender la jerarquía.
Launch control
El sistema debe sentirse vivo.
Animaciones, preloaders, bots, orbes y stack técnico se documentan como comportamiento de producto.
Preloaders
Los preloaders de Wiwo no son mensajes técnicos de carga. Son una extensión de la personalidad del producto: hacen que la espera se sienta activa, inteligente y de marca.
Wordmark para cargas de marca, exports, entregables y experiencias premium.
Círculos gradiente para estados compactos, dashboards, tablas y acciones inline.
La espera también comunica.
En vez de decir "Cargando..." o "Procesando...", Wiwo convierte la espera en una experiencia de marca: humor de industria, ironía inteligente, lenguaje operativo y señales reales del trabajo que el sistema está resolviendo.
Humanizar procesos complejos
Transforman tareas técnicas en acciones comprensibles y cercanas.
- Construyendo estrategia de marca...
- Detectando oportunidades ocultas...
- Ajustando narrativa de marca...
Reírse de los dolores
Humor interno de marketing, diseño, publicidad y ventas.
- Agregando más logos al PPT...
- Esperando feedback eterno...
- Traduciendo brief ambiguo...
Mostrar trabajo invisible
Hacen visible lo que la plataforma resuelve automáticamente.
- Recalculando jerarquía...
- Optimizando para cada canal...
- Cerrando loops eternos...
Generar expectativa positiva
La espera se convierte en anticipación, no fricción.
- Preparando algo bueno...
- Vale la pena...
- Haciendo magia sin drama...
Reforzar valor Wiwo
Cada mensaje recuerda que Wiwo convierte tecnología en impacto.
- Haciendo que marketing venda...
- Transformando datos en acción...
- Quitando sufrimiento manual...
Estructura
Ícono primero: wordmark Wiwo para momentos de marca o tres círculos para estados compactos. Nunca loader genérico sin personalidad.
Movimiento
Gradiente verde/azul, pulso suave, dots en wave, barra indeterminada o wordmark respirando. Duración base: 900ms a 2400ms.
Texto animado
El mensaje cambia cada 1.6 a 2.4 segundos. Evitar repetir una sola frase o estados fríos como "Procesando...".
Tono
Mezcla operativo + humor profesional + cultura creativa. Irreverente, pero nunca burlesco con el usuario.
Accesibilidad
Respetar reduced motion. Usar aria live polite si el texto informa progreso real; decorativo si solo entretiene.
HTML base
Usar wordmark o dots. El texto vive en un nodo único para poder rotarlo sin layout shift.
<div class="wiwo-preloader wiwo-surface-dark" role="status" aria-live="polite" aria-busy="true">
<img class="wiwo-preloader-logo" src="/logos/wiwo-beige.svg" alt="Wiwo" />
<div class="wiwo-loader-orb" aria-hidden="true"></div>
<p class="wiwo-preloader-copy" data-loader-message>Traduciendo brief ambiguo...</p>
<div class="wiwo-progress" aria-hidden="true"><span></span></div>
</div>
Banco JS
Rotación simple. En producto, filtrar por contexto: export, IA, resize, datos, ventas o espera general.
const messages = [
"Buscando el \"hagámoslo viral\"...",
"Recalculando jerarquía...",
"Transformando datos en acción...",
"Haciendo magia sin drama..."
];
export function startWiwoPreloader(root) {
const message = root.querySelector("[data-loader-message]");
let index = 0;
const setMessage = () => {
message.dataset.state = "changing";
window.setTimeout(() => {
message.textContent = messages[index++ % messages.length];
message.dataset.state = "ready";
}, 180);
};
setMessage();
const timer = window.setInterval(setMessage, 1900);
return () => window.clearInterval(timer);
}
Iconografía
Lucide Icons es la biblioteca base para producto digital Wiwo: SVG livianos, minimalistas, consistentes, personalizables y listos para React, Next.js, Tailwind y shadcn/ui.
Lucide como base de producto.
Usar Lucide para dashboards, SaaS, landing pages, apps, botones, menús, estados y acciones. El documento también está construido con Lucide inline para ser su propio mejor ejemplo.
Stroke consistente
Base 2px. Usa 1.75 para UI editorial o 2.25 para acciones primarias, sin mezclar pesos dentro del mismo componente.
Grid 24px
Botones 18 a 20px, nav 20px, cards 24px, hero o empty states 32 a 40px con absoluteStrokeWidth.
Color por contexto
Hereda currentColor. Azul para navegación/foco, verde para acción, #292929 para controles sobrios y beige solo sobre fondos profundos.
Accesibilidad
Iconos decorativos con aria hidden. Icon buttons con aria label. Acciones importantes siempre con texto visible.
Producto / SaaS
Interfaces de trabajo, dashboards, CRM, tablas, búsqueda y configuración.
IA / Launch
Momentos de magia controlada: automatización, copiloto, sugerencias y activaciones.
Estado / Feedback
Confirmaciones, alertas, estados vivos y microinteracciones de producto.
Next.js / React
Importa solo lo que se usa. Lucide trabaja bien con React Server Components cuando el icono no necesita estado.
// app/components/wiwo-action.tsx
import { Sparkles } from "lucide-react";
export function WiwoAction() {
return (
<button className="wiwo-button-primary" type="button">
<Sparkles size={20} strokeWidth={2} aria-hidden="true" />
Activar flujo
</button>
);
}
Tailwind / shadcn
Usa clases de tamaño estables y color por currentColor. No fijar colores inline salvo íconos de estado.
// app/components/launch-action.tsx
import { Rocket } from "lucide-react";
import { Button } from "@/components/ui/button";
export function LaunchAction() {
return (
<Button
type="button"
className="gap-2 rounded-control bg-wiwo-green text-wiwo-ink font-action disabled:opacity-disabled"
>
<Rocket className="size-4" strokeWidth={2} aria-hidden="true" />
Lanzar
</Button>
);
}
Stack motion
Para experiencias Wiwo de alto impacto: Next.js como base, GSAP para movimiento preciso, Lenis para scroll, Rive para vectores interactivos y Three.js / React Three Fiber solo cuando el caso requiere 3D real.
Construir con movimiento.
El sistema no se implementa como una plantilla plana. Cada sitio, campaña o producto elige la capa de movimiento mínima que necesita para orientar, explicar o responder.
Next.js como sistema operativo
Usa App Router para separar contenido, componentes server y capas client. Todo motion vive en client components con boundaries claros, carga diferida y CSS tokens compartidos.
GSAP + ScrollTrigger
Para pinning, scrub, snap, parallax y transiciones ligadas al scroll con control fino. Es la capa pro para marca, campañas y heroes expresivos.
SplitText
Para titulares que aparecen por línea, palabra o carácter. Ideal en hero sections, manifiestos y bloques editoriales con precisión de motion design.
Lenis
Para scroll suave, sincronizado con ScrollTrigger y escenas WebGL. Se usa cuando el sitio necesita sensación premium, no por defecto en herramientas densas.
Rive
Para logos vivos, loaders, botones con estado, ilustraciones UI y microinteracciones con state machines. Debe sentirse producto, no video decorativo.
Three.js / React Three Fiber
Para WebGL, shaders, partículas, productos flotando, espacios inmersivos y escenas tipo keynote. React Three Fiber se usa cuando el 3D vive dentro de React.
Color, tipo, glass, radios y easing antes de animar.
Secciones en Next, motion solo en client components.
GSAP para revelar, ordenar y conectar scroll.
Rive para vectores; Three/R3F para escenas 3D.
Reduce motion, performance, responsive y foco visible.
Instalación base
Crear el proyecto en Next.js y agregar solo las capas que el caso necesite. Rive y Three deben cargarse diferido si no son primera pantalla.
npx create-next-app@latest wiwo-surface --ts --app --tailwind
cd wiwo-surface
npm install lucide-react gsap @gsap/react lenis @rive-app/react-canvas three @react-three/fiber @react-three/drei
MotionShell client
Plantilla para sincronizar Lenis con ScrollTrigger y dejar SplitText dentro de un scope controlado.
"use client";
import { useRef } from "react";
import gsap from "gsap";
import { useGSAP } from "@gsap/react";
import { ScrollTrigger } from "gsap/ScrollTrigger";
import { SplitText } from "gsap/SplitText";
import Lenis from "lenis";
gsap.registerPlugin(useGSAP, ScrollTrigger, SplitText);
export function MotionShell({ children }) {
const scope = useRef(null);
useGSAP(() => {
if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return;
const title = scope.current?.querySelector("[data-split]");
if (!title) return;
const lenis = new Lenis({ lerp: 0.08, smoothWheel: true });
const tick = (time) => lenis.raf(time * 1000);
lenis.on("scroll", ScrollTrigger.update);
gsap.ticker.add(tick);
gsap.ticker.lagSmoothing(0);
const split = SplitText.create(title, {
type: "lines,words",
mask: "lines",
autoSplit: true
});
gsap.from(split.words, {
yPercent: 110,
opacity: 0,
stagger: 0.018,
duration: 0.72,
ease: "power3.out",
scrollTrigger: { trigger: title, start: "top 78%" }
});
return () => {
split.revert();
gsap.ticker.remove(tick);
lenis.destroy();
};
}, { scope });
return <main ref={scope}>{children}</main>;
}
Reglas de implementación
- Motion con propósito. Revela jerarquía, confirma acción o conecta una historia. Si solo adorna, sale.
- Client boundary limpio. GSAP, Rive y Three viven en componentes client; contenido y data pueden seguir en server components.
- Lenis sincronizado. Si hay smooth scroll, conecta RAF con ScrollTrigger y prueba pinning, anchors y teclado.
- 3D solo cuando aporta. Three.js / R3F se usa para escenas, producto, partículas o shaders. Para íconos y estados, Rive.
- Accesibilidad primero. Respeta reduced motion, evita texto ilegible durante animaciones y mantiene foco visible.
Motion specs
Instrucciones avanzadas para que Wiwo se sienta como experiencia de marca premium: microinteracciones, scroll cinematográfico, texto preciso, vectores vivos y 3D solo cuando aporta.
Motion con sistema.
La animación se diseña como arquitectura: timeline, triggers, estados, performance y salida accesible. No son adornos; son feedback, jerarquía y dirección.
Arquitectura motion
En App Router, deja contenido y SEO en server components; monta motion en islas client. Cada isla debe tener scope, cleanup, reduced motion y carga diferida si usa Rive o Three.
Microinteracciones
Usa timelines cortos para hover, press, success, menú y cards. El movimiento debe responder al input con magnetismo suave, spotlight y retorno elástico.
Scroll narrativo
Para piezas de marca: usa `pin`, `scrub`, `snap`, timeline maestro y labels. Cada bloque debe tener una razón narrativa para quedarse fijo.
Texto de precisión
Usa SplitText para líneas/palabras con mask. Recalcula split en resize, foco en legibilidad y fallback sin animación cuando reduced motion esté activo.
State machines UI
Rive entra cuando necesitas vectores con estados: idle, hover, loading, success, error. Ideal para logo vivo, íconos de producto y loaders con input real.
WebGL expresivo
Three.js / R3F solo para escenas inmersivas, shaders, partículas o producto 3D. Si es decoración plana, usa CSS/GSAP; si es espacio, usa WebGL.
GSAP timeline pro
Patrón base para hero, SplitText, ScrollTrigger y Lenis sincronizado en Next.js.
"use client";
import { useRef } from "react";
import gsap from "gsap";
import { useGSAP } from "@gsap/react";
import { ScrollTrigger } from "gsap/ScrollTrigger";
import { SplitText } from "gsap/SplitText";
import Lenis from "lenis";
gsap.registerPlugin(useGSAP, ScrollTrigger, SplitText);
export function WiwoMotionPage({ children }) {
const scope = useRef(null);
useGSAP(() => {
const reduce = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
if (reduce) return;
const hero = scope.current?.querySelector("[data-motion-hero]");
const title = scope.current?.querySelector("[data-hero-title]");
if (!hero || !title) return;
const lenis = new Lenis({ lerp: 0.08, smoothWheel: true });
const raf = (time) => lenis.raf(time * 1000);
lenis.on("scroll", ScrollTrigger.update);
gsap.ticker.add(raf);
gsap.ticker.lagSmoothing(0);
const split = SplitText.create(title, {
type: "lines,words",
mask: "lines",
autoSplit: true
});
const tl = gsap.timeline({
defaults: { ease: "power3.out" },
scrollTrigger: {
trigger: hero,
start: "top 78%",
end: "bottom 20%",
scrub: 0.8
}
});
tl.from(split.words, { yPercent: 110, opacity: 0, stagger: 0.018, duration: 0.72 })
.from(gsap.utils.toArray("[data-motion-card]", scope.current), { y: 42, opacity: 0, stagger: 0.08, duration: 0.6 }, "-=0.35")
.to(gsap.utils.toArray("[data-parallax]", scope.current), { yPercent: -12, ease: "none" }, 0);
return () => {
split.revert();
gsap.ticker.remove(raf);
lenis.destroy();
};
}, { scope });
return <main ref={scope} data-motion-page>{children}</main>;
}
Rive + Three según caso
Rive para estados vectoriales; R3F cuando la experiencia necesita canvas 3D real.
"use client";
// Rive: UI state machine
import { useEffect, useState } from "react";
import { useRive, useStateMachineInput } from "@rive-app/react-canvas";
import { Canvas } from "@react-three/fiber";
import { Float, Environment } from "@react-three/drei";
export function WiwoRiveButton() {
const { RiveComponent, rive } = useRive({
src: "/rive/wiwo-button.riv",
stateMachines: "Button",
autoplay: true
});
const hover = useStateMachineInput(rive, "Button", "isHover");
const setHover = (value) => {
if (hover) hover.value = value;
};
return (
<button
className="wiwo-icon-button"
type="button"
aria-label="Activar flujo Wiwo"
onPointerEnter={() => setHover(true)}
onPointerLeave={() => setHover(false)}
>
<RiveComponent aria-hidden="true" />
</button>
);
}
// React Three Fiber: WiwoSurface scene
function readToken(name) {
return getComputedStyle(document.documentElement).getPropertyValue(name).trim();
}
export function WiwoSurface() {
const [tokens, setTokens] = useState(null);
useEffect(() => {
setTokens({
blue: readToken("--wiwo-blue"),
green: readToken("--wiwo-green")
});
}, []);
if (!tokens) return null;
return (
<Canvas dpr={[1, 1.5]} camera={{ position: [0, 0, 5], fov: 38 }}>
<Environment preset="city" />
<Float speed={1.2} rotationIntensity={0.35} floatIntensity={0.6}>
<mesh>
<torusKnotGeometry args={[1, 0.28, 180, 24]} />
<meshPhysicalMaterial
color={tokens.blue}
emissive={tokens.green}
emissiveIntensity={0.18}
roughness={0.38}
metalness={0.04}
clearcoat={0.72}
/>
</mesh>
</Float>
</Canvas>
);
}
Patrones
Reglas para que el sistema sirva tanto en landings como en dashboards, documentos, decks y herramientas internas.
Grilla maestra
Todo layout estratégico parte de 12 columnas en desktop. Las composiciones permitidas son 3/9, 4/8, 5/7 y 6/6; cualquier otro split debe responder a una necesidad funcional clara.
- Desktop: 12 columnas con gutter
--space-5. - Tablet: mantiene proporción hasta que el contenido pida colapso.
- Mobile: una columna visual y navegación compacta.
- Cards:
auto-fit + minmax(260px, 1fr).
Medidas de lectura
La tipografía no se controla solo por tamaño: también por ancho de línea. Estos tokens evitan títulos cortados, párrafos eternos y UI apretada.
--measure-display: 12chpara titulares.--measure-lead: 36chpara bajadas.--measure-body: 62chpara lectura larga.- No forzar cortes con guiones manuales.
Layout editorial
Usar cuando Wiwo explica una idea: casos, reportes, pensamiento, manifiestos y piezas para LinkedIn.
- Titular de 8 a 12 palabras máximo.
- Grilla de 12 columnas en desktop, 4 en mobile.
- Imagen o arte como evidencia, no como relleno.
- Chips solo para categoría, fecha o estado.
Layout operativo
Usar cuando el usuario viene a trabajar: CRM, automatizaciones, brief builder, tableros y sistemas de seguimiento.
- Navegación persistente y densa.
- Acción primaria siempre visible arriba o abajo.
- Estados con texto, icono y color.
- Evitar secciones hero si la tarea es repetitiva.
Reglas listas para construir.
Instrucciones, CSS base y archivos generados para que diseño, frontend y Figma trabajen desde el mismo origen.
Instrucciones
Cómo aplicar el sistema sin romper la marca ni convertirlo en una copia literal de ningún lenguaje externo.
-
Parte por tokens. Define color, tipografía, radio, spacing y motion antes de dibujar pantallas. Si una decisión no cabe en tokens, probablemente es una excepción de campaña.
-
Tokens como código. Cambia valores en
tokens/wiwo.tokens.jsony ejecutanpm run build:tokens. CSS, Tailwind y variables Figma son outputs, no fuente editorial. -
El modo oscuro exige cobertura completa. Actívalo solo cuando superficies, texto, líneas, controles, imágenes y estados hayan pasado contraste y QA. No mezcles cards oscuras aisladas dentro de una experiencia clara.
-
Elige el modo. Editorial para contar, operativo para ejecutar. No mezcles un hero gigante dentro de una herramienta de trabajo.
-
Usa tácticas Wiwo Expressive. Aumenta jerarquía con tamaño, forma, contención tonal, grupos conectados y motion. No dependas solo del color.
-
Usa fotos como evidencia humana. Prioriza escenas con personas, vínculos, oficio, cuidado y vida cotidiana, con beige dominante y acentos Wiwo integrados. No uses cyber city, cyborgs, sci-fi frío ni tecnología lejana: la capacidad debe sentirse humana, actual y reconocible.
-
Lucide es la biblioteca de íconos base. Importa desde lucide react, usa SVG con currentColor, stroke 2px, tamaños 18/20/24/32 y aria label solo cuando el ícono sea el único contenido del control.
-
Controla contraste. Usa la tabla de pares aprobados: verde solo con #292929, azul con blanco o beige, y gradientes solo con overlay, glass o contenedor estable.
-
Anima por significado. Motion para confirmar, ordenar, revelar o guiar. Duración recomendada: 160ms micro, 280ms paneles, 420ms transiciones expresivas.
-
Accesibilidad como estilo. Implementa
:focus-visible, labels persistentes,aria-invalidcon texto específico y estados disabled/loading/error que se entiendan sin depender del color.
CSS base
Snippet de consumo. Los valores salen de tokens/wiwo.tokens.json y se importan desde el CSS generado.
/* 1. Fuente única: outputs/tokens/wiwo.tokens.json */
/* 2. Build: npm run build:tokens */
/* 3. Consumo web */
@import "./tokens/wiwo.tokens.css";
html {
font-family: var(--font-system);
background: var(--surface);
color: var(--ink);
}
body {
margin: 0;
background: var(--surface);
color: var(--ink);
font-family: var(--font-system);
text-rendering: optimizeLegibility;
}
:where(a, button, input, select, textarea, summary):focus-visible {
outline: 3px solid var(--focus-ring);
outline-offset: 3px;
box-shadow: 0 0 0 7px var(--focus-glow);
}
.wiwo-button-primary {
display: inline-flex;
align-items: center;
justify-content: center;
gap: var(--space-2);
min-height: 48px;
padding: 0 var(--space-5);
border-radius: var(--radius-control);
border: 1px solid var(--wiwo-green);
background: var(--wiwo-green);
color: var(--on-accent);
font-family: var(--font-system);
font-size: 1rem;
font-weight: var(--weight-action);
transition:
transform var(--motion-fast) var(--ease-expressive),
box-shadow var(--motion-fast) var(--ease-expressive),
background var(--motion-fast) var(--ease-expressive);
}
.wiwo-button-primary:hover:not(:disabled) {
transform: translateY(-1px);
box-shadow: var(--shadow-1);
}
.wiwo-button-primary:disabled,
.wiwo-input:disabled {
cursor: not-allowed;
opacity: var(--disabled-opacity);
}
.wiwo-button-primary[data-loading="true"] {
pointer-events: none;
color: transparent;
}
.wiwo-button-primary[data-loading="true"]::after {
content: "";
width: var(--icon-size-md);
height: var(--icon-size-md);
border: 2px solid currentColor;
border-top-color: transparent;
border-radius: var(--shape-full);
color: var(--on-accent);
animation: wiwo-spin var(--motion-loop) linear infinite;
}
.wiwo-card {
border: 1px solid var(--line);
border-radius: var(--radius-card);
background: var(--surface);
color: var(--ink);
padding: var(--space-5);
}
.wiwo-card[data-variant="inverse"] {
background: var(--surface-inverse);
color: var(--ink-inverse);
}
.wiwo-glass {
border: 1px solid var(--glass-stroke);
border-radius: var(--shape-lg);
background: var(--glass-fill);
box-shadow: var(--shadow-glass);
backdrop-filter: blur(var(--glass-blur)) saturate(1.28);
}
.wiwo-gradient-band {
min-height: 96px;
border-radius: var(--radius-card);
background: var(--wiwo-gradient-primary);
background-size: 180% 180%;
animation: wiwo-gradient var(--motion-loop) var(--ease-emphasized) infinite alternate;
}
.wiwo-icon {
width: var(--icon-size-md);
height: var(--icon-size-md);
color: currentColor;
stroke-width: var(--icon-stroke);
}
.wiwo-icon-button {
inline-size: 44px;
block-size: 44px;
display: inline-grid;
place-items: center;
border: 1px solid var(--line);
border-radius: var(--shape-full);
background: var(--control-surface);
color: var(--ink);
}
.wiwo-input {
min-height: 48px;
border: 1px solid var(--line);
border-radius: var(--shape-xs);
background: var(--surface);
color: var(--ink);
padding: 0 var(--space-4);
font: inherit;
}
.wiwo-input[aria-invalid="true"] {
border-color: var(--error);
background: var(--error-soft);
}
.wiwo-field-error {
margin-block-start: var(--space-2);
color: var(--error);
font-size: var(--step--1);
font-weight: var(--weight-meta);
}
.wiwo-connected-group {
display: inline-flex;
gap: var(--space-1);
padding: var(--space-1);
border-radius: var(--shape-full);
overflow: hidden;
background: var(--surface-container);
}
.wiwo-connected-group button {
min-height: 52px;
padding: 0 var(--space-4);
border: 0;
border-radius: var(--shape-full);
background: transparent;
color: var(--muted);
font: inherit;
font-weight: var(--weight-nav);
transition: background var(--motion-fast), color var(--motion-fast);
}
.wiwo-connected-group button[aria-selected="true"] {
background: var(--surface-inverse);
color: var(--ink-inverse);
}
@keyframes wiwo-spin {
to { transform: rotate(1turn); }
}
@keyframes wiwo-gradient {
to { background-position: 100% 50%; }
}
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: .001ms !important;
animation-iteration-count: 1 !important;
scroll-behavior: auto !important;
transition-duration: .001ms !important;
}
}