DesignSystem
La nave nodriza de BigFarm, SGP, BigFrut y los productos que vienen — un lenguaje de tokens compartido, una identidad propia en cada capa.
Cómo usar este documento
Por qué este Design System
No partimos de cero. Partimos de lo que ya funciona en producción.
BigFarm resolvió cómo hablarle al campo.
ADS Platform resuelve cómo escalar esa voz a 7 productos.
Cada token, cada componente y cada decisión de BigFarm DS v1.0 ya está validada en producción con beta testers reales. ADS Platform no reemplaza ese trabajo — lo eleva a capa primitiva para que SGP, BigFrut y los productos que vienen no reinventen color, tipografía ni reglas de alerta desde cero.
"Un solo lenguaje visual detrás de siete productos distintos. Cada equipo construye más rápido porque la decisión de marca ya está tomada."— Design System ADS Platform, borrador v0.1
Cómo hereda cada producto
ADS Platform es la raíz — provee los primitivos que todos comparten. SGP opera como el framework base sobre el que se construyen los productos del ecosistema.
--sgp-*
En desarrollo
--bfr-*
Refactor pendiente
--bc-*
En planificación
--acp-*
En planificación
--hernia-*
En planificación
--sic-*
En planificación
--ads-* se propaga en cascada sin editar cada producto por separado.
Design Tokens — Capa primitiva
Variables CSS de ADS Platform. Los productos hijo (bf-, sgp-, etc.) referencian estos valores.
| Token | Valor | Uso |
|---|---|---|
--ads-indigo-700 | #3730A3 | Marca ADS Platform, nav activo, CTA primario de plataforma |
--ads-indigo-600 | #4338CA | Hover sobre primary, focus rings |
--ads-indigo-100 | #D9DCF5 | Bordes en contextos de plataforma |
--ads-indigo-50 | #EEF0FC | Fondos sutiles, badges de plataforma |
--ads-navy-900 | #1C1A17 | Texto fuerte en todos los productos — gris cálido, no frío |
--ads-gray-500 | #85817A | Labels, subtítulos, placeholders — escala cálida |
--ads-red-600 | #C0392B | Heredado · estado crítico — invariante en todos los productos |
--ads-amber-600 | #D4791A | Heredado · estado de advertencia — invariante en todos los productos |
--ads-green-600 | #4D8F1F | Heredado · estado óptimo / OK — invariante en todos los productos |
Paleta de color
Indigo + gris cálido. La marca pesa cuando aparece, no compite con la información operativa. Rojo/ámbar/verde semánticos no se tocan.
Indigo 700 sobre blanco da 8.6:1 — pasa AA incluso en texto pequeño. Es más accesible que el verde original de BigFarm (2.7:1, por eso ese producto ya usa el alias #4A8F1A para texto).
Coincidencia intencional: --ads-green-600 (semántico, estado "óptimo") y --bf-green-600 (marca BigFarm, tono oscuro para texto AA) comparten el mismo valor #4D8F1F. No es accidental — ese verde oscurecido cumple simultáneamente las dos funciones: contraste suficiente sobre blanco y señal visual de "OK" coherente con la marca agrícola. Si la marca BigFarm cambia, solo se actualiza --bf-green-600; el token semántico --ads-green-600 permanece invariante.
Tipografía
Dos familias, roles claros. IBM Plex Sans marca la jerarquía de título. Inter hace todo el trabajo de cuerpo, label y cifra.
Plex Sans entra solo en H1, H2, H3 y nombre de marca — la jerarquía de título tiene una textura ligeramente distinta a Inter, sin saltar a otra familia completamente ajena.
Inter mantiene tabular-nums activado en cifras — hectáreas, GDA e IDs alinean en columna igual que en BigFarm. Un solo motor de texto para todo lo operativo.
Spacing & Radius
Escala heredada de BigFarm y validada en producción. Los valores de spacing no tienen token CSS nombrado — se usan como literales en padding y gap. Los valores de radius sí tienen token CSS en :root.
| Valor | Visual | Uso principal |
|---|---|---|
4px |
Gap entre ícono y label, indicadores inline, separación de brand-info | |
8px |
Padding horizontal de chip y token-code, gaps entre elementos relacionados | |
12px |
Padding de badge y hero-pill, gap de grilla densa (hero-meta-grid) | |
16px |
Padding interno de meta-card, separación de headers y dividers | |
20px |
Padding horizontal del nav lateral, bordes de arch-platform | |
24px |
Cuerpo de componente (comp-card-body, type-row, btn-variant-row) | |
32px |
Padding de card grande (thesis-card, northstar-card), hero-main vertical | |
48px |
Sangría inferior del sidebar, separación entre grupos de sección | |
64px |
Padding lateral del contenido principal (main-inner), padding izquierdo del hero |
| Token | Valor | Muestra | Uso |
|---|---|---|---|
--r-xs |
3px | Etiquetas code, scrollbar, tokens de arquitectura — ángulo apenas suavizado |
|
--r-sm |
5px | Botones secundario, ghost y destructivo — radio técnico, deliberadamente no genérico | |
--r-md |
8px | Product-cards en arquitectura, arch-note, btn-decision-note | |
--r-lg |
12px | Cards de herencia (inherit-wrap), hero meta-card, barra de plataforma (arch-platform) | |
--r-xl |
16px | Contenedores principales — token-table-wrap, comp-card, thesis-card, type-specimen-wrap | |
--r-2xl |
24px | Reservado para modales, drawers y paneles flotantes — no implementado aún en v0.1 | |
--r-pill |
999px | CTA primario, badges, hero-pills, btn-bf — formas completamente redondeadas |
--r-xs (3px). Para botones de utilidad: --r-sm (5px). Para cards intermedias: --r-md o --r-lg. Para contenedores de sección: --r-xl. Para todo lo que sea CTA o badge: --r-pill. Si dudas entre dos niveles, elige el menor — el exceso de radio en elementos pequeños se lee como diseño genérico.
Elevación
Cuatro tokens de sombra sobre base rgba(28,26,23, …) — el navy-900 del sistema, no negro puro. Profundidad jerárquica: plano → card → flotante → modal. En fondo oscuro, se sustituyen por glow indigo coloreado.
| Token | Cuándo usarlo | Componentes actuales |
|---|---|---|
--shadow-xs |
Elementos interactivos pequeños en reposo: pills, chips flotantes, badges con acción | btn-secondary (rest), icon-stat-pill |
--shadow-sm |
Cards en reposo sobre el fondo de la app. Plano pero levantado respecto al background gris | thesis-card, comp-card, token-table-wrap, inherit-wrap, roadmap-wrap |
--shadow-md |
Elementos que flotan sobre el contenido: dropdowns, tooltips, popovers, cards en estado hover | thesis-card (hover), northstar-card, swatch (hover) |
--shadow-lg |
Modales, drawers laterales y overlays de pantalla completa — capa Z más alta del sistema | Reservado — no implementado en v0.1 |
Las sombras en rgba(28,26,23,…) se vuelven invisibles sobre fondos oscuros como #09081A. El hero ya resuelve esto con glow indigo coloreado: box-shadow con spread y blur en tonos de --ads-indigo-*. La misma técnica aplica a cualquier elemento elevado dentro del sidebar, un panel oscuro o un modal.
rgba ya en uso en el hero y el sidebar. Al implementar un modal oscuro o un drawer, usar esta progresión en lugar de los tokens --shadow-*.Accesibilidad
WCAG 2.2, nivel AA como base obligatoria. El campo agrícola chileno y global impone restricciones que van más allá del estándar: luz solar directa, guantes, conectividad limitada y diversidad de alfabetización son el contexto real de uso — no una excepción.
Luz solar · guantes · polvo · urgencia · sin red
- Contraste 7:1 mínimo real — el sol directo reduce la percepción efectiva hasta un 40%. El estándar AA (4.5:1) no es suficiente en estas condiciones.
- Touch targets ≥44×44px — guantes de cuero, nitrilo o látex imposibilitan precisión fina. WCAG 2.2 pide 24px; el campo exige 44px mínimo (iOS HIG).
- Sin tooltips hover — el toque no activa hover. Información crítica debe ser visible permanentemente, no escondida detrás de interacciones secundarias.
- Offline-first — conectividad rural en Chile promedia 1–5 Mbps con cortes frecuentes. Los estados de carga y error deben ser manejables sin red.
- Lenguaje e íconos claros — trabajadores temporales de Haití, Venezuela, Perú y Bolivia requieren íconos reconocibles junto al texto. No depender solo de labels en español.
Agrónomo · jefe de campo · contador · gerencia
- Navegación por teclado completa — usuarios power-user en escritorio navegan sin ratón. Tab order lógico, shortcuts documentados, skip-links.
- Lectores de pantalla — NVDA/JAWS en Windows, VoiceOver en macOS/iOS. Semántica HTML5 correcta: roles landmark, aria-label, aria-live para alertas.
- Contraste 4.5:1 AA — pantallas interiores bajo luz controlada. El estándar WCAG es suficiente; no sacrificar legibilidad por contraste excesivo en textos decorativos.
- Resize al 200% sin scroll horizontal — presbicia frecuente en jefes de campo y gerentes de 45+ años. El layout debe fluir, no romper.
- Errores descriptivos y accionables — planillas de riego, registros SAG, formularios de cuartel. Cada error debe decir qué falló y cómo corregirlo.
bf-green-600: #4D8F1F (3.7:1, pasa AA para texto grande ≥18px). Para texto de cuerpo en campo bajo sol directo, se requiere un alias dark: #3B7015 (~5.8:1 · AA ✓). Este es el problema de accesibilidad activo más crítico del ecosistema.
2.5.8 nivel AA
Oficina / escritorio
Móvil campo ✓
Guantes · lluvia ✓
btn-icon (32px): en interfaces móviles de campo, agregar padding: 6px invisible alrededor para llevar el área activa a 44px sin cambiar el aspecto visual.
WCAG 1.4.1 prohíbe usar el color como único medio de transmitir información. El 8% de los hombres tienen algún grado de discromatopsia (deuteranopia, protanopia) — en un equipo de 50 personas de campo, eso son 4 usuarios. El semáforo ADS resuelve el problema con tres capas redundantes simultáneas.
Motion
ADS Platform comunica estabilidad. Cada elemento que se mueve justifica su existencia por la información que transmite — confirma un estado, guía la atención o señala progreso. Si la animación puede quitarse sin pérdida de contexto, se quita.
| Token / nombre | Valor | Cuándo aplicar | Usos actuales en el sistema |
|---|---|---|---|
--t-fast |
0.12s ease · 120ms | Respuesta inmediata a input directo — el usuario ya tomó la decisión | Hover de botón, color de borde de input, highlight de fila en tabla |
--t-base |
0.18s ease · 180ms | Transiciones que afectan más de una propiedad o un componente compuesto | Sombra de card en hover, aparición de focus ring, activación de nav-link activo |
btn-spin |
0.65s linear ∞ | Única animación de bucle autorizada en UI interactiva — señala proceso en curso | Estado btn-loading en Primary, Secondary y Destructive |
- Cambios de estado de botón — color, sombra y borde en hover / active / focus. 120ms (
--t-fast). El usuario confirmó una intención. - Loading spinner — indica proceso en curso. Es el único loop autorizado en pantallas interactivas y va vinculado a una acción explícita del usuario.
- Focus ring en inputs y controles — aparición suavizada en 120ms. Sin transición, el salto brusco se lee como glitch en pantallas de baja tasa de refresco.
- Aparición de badge o alerta — fade in + translate Y ≤6px en 180ms (
--t-base). Señala novedad sin bloquear la lectura del contenido existente. - Apertura de dropdown — opacity o max-height en 180ms. Sin transforms 3D, sin bounce ni elastic easing — no es una app de consumo.
- Transiciones de página completa — fade, slide o morph entre rutas. Confunde el contexto de navegación y es lento en redes 2G / 3G del campo.
- Parallax y scroll-triggered — fuerza reflows continuos en el hilo principal. Inútil en móvil táctil y destructivo en dispositivos de gama baja.
- Autoplay de cualquier tipo — video, GIF, carrusel automático. Consume datos móviles limitados sin consentimiento; el usuario en campo no puede detenerlo con guantes.
- Shimmer skeleton en listas largas — animar N filas simultáneamente es trabajo de GPU proporcional al tamaño de la lista. Usar un spinner único o un estado estático.
- Fondos o logos en loop — movimiento ambiental sin propósito. Excepción única ya documentada: el dot de estado en el sidebar (
blink) y el hero dot (glow) — ambos deben detenerse conprefers-reduced-motion.
Usuarios con epilepsia fotosensible, migraña, vértigo o fatiga visual activan esta preferencia del sistema operativo. Ignorarla es una falla de accesibilidad (WCAG 2.1 SC 2.3.3). El archivo actual no incluye este bloque todavía — es el próximo paso obligatorio antes de que cualquier componente animado llegue a producción.
--t-fast y --t-base colapsan a duración mínima. Las animaciones de bucle (blink, glow, btn-spin) pasan a animation-duration: 0.01ms — el navegador las detiene sin eliminarlas del DOM ni romper el layout.@media (prefers-reduced-motion: reduce) { /* Colapsar todas las transiciones y animaciones */ *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; scroll-behavior: auto !important; } }
Badges & estado
El semáforo de alerta (crítico / advertencia / óptimo) es invariante — se hereda exacto, sin reinterpretación por producto.
Formularios
Label visible sobre el campo en todos los casos — nunca placeholder como sustituto. Radius 5px (técnico, igual que botones de utilidad). Focus ring en indigo-600 con halo 3px. Error en rojo-600, descriptivo y accionable.
Productos del ecosistema
ADS Platform actúa como la nave nodriza — provee la capa compartida de tokens, tipografía y semántica de estado sobre la que cada producto construye su identidad propia.
La capa de herencia compartida. Todas las decisiones de color, tipografía, spacing y semántica de estado parten aquí y fluyen hacia cada producto hijo. Un cambio en ADS Platform afecta el ecosistema completo.
Gestión de predios, cuarteles, temporadas y aplicaciones agrícolas. Primer producto nativo del stack ADS — diseño en curso.
--sgp-*
Plataforma de trazabilidad frutícola. Refactor externo pendiente para integrar tokens ADS y alinear identidad de marca.
--bfr-*
CRM inteligente con análisis de comportamiento comercial. Identidad visual en definición — logo e identidad de marca pendientes.
--sic-*
Estados de página
Pantallas completas que el usuario ve cuando no hay contenido, hay un error o el sistema está cargando. En un producto offline-first, estos estados son tan frecuentes como los estados normales — deben comunicar con claridad y siempre ofrecer un camino de acción.
Ningún cuartel registrado en esta vista. Crea el primero para comenzar a registrar actividad.
No se pudo obtener la información del servidor. Verifica la conexión e intenta de nuevo.
prefers-reduced-motion.
Regla de error: todo estado de error debe ofrecer al menos una acción de recuperación (reintentar, volver atrás, contactar soporte). Un error sin salida es un callejón sin salida de UX.
Librería de íconos
No se inventa nada nuevo. Esta es la iconografía real extraída del código fuente de BigFarm MVP1 — se adopta tal cual como base de ADS Platform.
ads_platform-icons-/, ubicada junto a este HTML. Si la carpeta se mueve, las rutas de imagen deben actualizarse.
Qué falta y por qué este v0.1 alcanza para hoy
Honesto sobre el alcance: esto desbloquea la conversación con Gabriel, no cierra el Design System completo.
| Qué falta | Estado | Por qué bloquea |
|---|---|---|
CSS prefers-reduced-motion |
Pendiente | Violación WCAG 2.1 SC 2.3.3 activa. Ningún componente con transición puede ir a producción sin este bloque en el CSS global. Documentado en §Motion como "próximo paso obligatorio". |
| Tokens semánticos completos — superficie y estado en modo oscuro | En curso | BigFarm BI ya opera en dark mode en producción. Sin tokens formalizados, cada equipo define los colores de superficie de forma independiente — imposible mantener coherencia cross-product. |
| Componentes cross-product — mapa, agente LLM, selector de entidad | Pendiente | Existen 3 implementaciones divergentes hoy. Bloquea que SGP y BigFarm BI compartan interfaz real. Requiere auditoría de las 3 versiones antes de canonizar una sola solución. |
| Qué falta | Estado | Por qué no está hoy |
|---|---|---|
| Badge "NUEVO · PLATAFORMA" — regla de uso | Pendiente | Requiere decisión de Gabriel: ¿el badge es temporal (expira tras un ciclo de versión, como changelog vivo) o permanente (marcador de origen de plataforma)? Sin esa definición, la regla no se puede documentar con precisión. |
| Íconos geométricos por nivel de alerta — ✕ △ ✓ junto al dot de color | Pendiente | Tercera capa de redundancia visual independiente del color. Necesaria para pantallas con brillo reducido en campo. Los badges semáforo actuales ya cubren el caso base — esto refuerza sin desbloquear nada nuevo. |
| Logotipo oficial ADS Platform | Pendiente | Requiere validación de identidad con Gabriel antes de producir el isotipo final. El logo provisional actual (logo1_ads_1.png) es funcional para este borrador. |
| Logotipo SGP | Pendiente | Mismo bloqueo de decisión de marca que el logotipo ADS Platform. Depende de la dirección de identidad de plataforma acordada con Gabriel. |