Display · Títulos · Botones · Números grandes
family=Fraunces:ital,opsz,wght@0,9..144,300;0,9..144,700;0,9..144,800;1,9..144,300;1,9..144,400
Seguridad alimentaria sin margen de error.
La ficha que el servicio necesitaba.
Light 300
subtítulos, italic
ExtraBold 800
h1, CTAs, logotipos
CSS: font-family:'Fraunces',serif;
· Variable: var(--ff-d)
Body · Descripciones · UI · Párrafos
family=Outfit:wght@300;400;500;600;700;800
Rutty convierte la ruta de reparto sociosanitaria en una operación guiada, trazable y segura. DALINA guía el alta nutricional de cada comensal en 7 pasos estructurados, con IA que interpreta informes médicos.
CSS: font-family:'Outfit',sans-serif;
· Variable: var(--ff-b)
Monospace · Labels · Badges · Eyebrows · Datos técnicos
family=JetBrains+Mono:wght@400;500;600;700
IA CONVERSACIONAL · UE 1169/2011 · PROTOCOLO P02 · V6 LIVE · SUPABASE + RLS
IA conversacional
Síntesis de voz
Supabase RLS
Netlify Functions
Protocolo P02
V6 Live
CSS: font-family:'JetBrains Mono',monospace;
· Variable: var(--ff-m)
Google Fonts · Import único completo
<link href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,300;0,9..144,500;0,9..144,700;0,9..144,800;1,9..144,300;1,9..144,400&family=Outfit:wght@300;400;500;600;700;800&family=JetBrains+Mono:wght@400;500;600;700&display=swap" rel="stylesheet">
Pegar siempre este link en el <head> de cualquier landing o componente nuevo del ecosistema AlimentIA.
Colores primarios del sistema
CSS Variables · Copiar en :root de cada landing
:root {
/* Azules */
--navy: #152E54;
--navyd: #0D1E3A;
--deep: #07101f;
--blue: #2563A8;
--bluec: #EEF4FB;
/* Dorado */
--gold: #F0A800;
--goldd: #D4920A;
--goldc: #FFF8EC;
/* Estado */
--green: #15C76A; /* ok, confirmado */
--red: #C93030; /* alerta, alérgeno grave */
/* Neutros */
--gray: #F0F2F7;
--grayb: #E4E8F0;
--muted: #8A95A3;
--dark: #5A6475;
--text: #0D1825;
--border:#DDE3EC;
--white: #ffffff;
/* Tipografía */
--ff-d: 'Fraunces', serif;
--ff-b: 'Outfit', sans-serif;
--ff-m: 'JetBrains Mono', monospace;
/* Radios */
--r: 14px;
--r2: 22px;
--r3: 32px;
}
Secciones oscuras (dark)
Fondo: #07101f o #0D1E3A
Títulos: #ffffff
Subtextos: rgba(255,255,255,.45)
Labels: var(--gold)
Líneas: rgba(255,255,255,.07)
Secciones claras (light)
Fondo: #ffffff o #f8f9fc
Títulos: var(--navy)
Subtextos: var(--dark)
Labels: var(--blue)
Líneas: var(--border)
Radios de borde
🔵
--r: 14px — pills, inputs pequeños, badges
🟡
--r2: 22px — cards, secciones, paneles
⭐
--r3: 32px — botones principales CTA
⚪
40px — phone mockup, objetos flotantes
Sombras
🌑
0 4px 24px rgba(13,30,58,.1) — cards hover
🌒
0 12px 56px rgba(13,30,58,.2) — modales
🌓
0 24px 80px rgba(13,30,58,.3) — desktop mocks
✨
0 0 40px rgba(240,168,0,.3) — glow dorado CTA
Anchura máxima y padding
📐
max-width: 1160px — contenedor principal de landing pages
📐
padding: 100px 2rem — secciones principales
📐
padding: 120px 2rem 80px — sección hero (cuenta la nav fija de 62px)
📱
Breakpoint móvil: 900px (grids a 1 col), 700px (hide nav links)
Animaciones estándar del ecosistema
🔄
Grid animado hero: background-size: 80px 80px, animation: gridMove 20s linear infinite — líneas gold 4% opacidad
💡
Scan line: línea horizontal dorada que recorre la pantalla verticalmente, animation: scan 4s ease-in-out infinite
🌐
Orbs: radiales de color azul/dorado en esquinas, animation: orbPulse 6s ease-in-out infinite
📱
Phone float: animation: phoneFloat 5s ease-in-out infinite — translateY(0→-14px) con ligera rotación (±1deg)
🟢
Live dot: animation: liveP 2s ease-in-out infinite — box-shadow pulsante verde sobre el punto
📜
Scroll reveal: IntersectionObserver en clase .reveal → añade clase .visible, opacity:0→1, translateY(28px→0), transition: .65s ease
🏷️
Ticker: animation: ticker 30s linear infinite — duplicar el contenido para el loop sin salto
💬
Typing dots: 3 spans con animation: typingB .9s ease-in-out infinite, delays 0 / .2s / .4s
Cursor personalizado
* { cursor: none; }
/* Punto dorado */ #cursor {
position:fixed; width:14px; height:14px;
background:var(--gold); border-radius:50%;
pointer-events:none; z-index:9999;
transform:translate(-50%,-50%);
mix-blend-mode:screen;
}
/* Anillo retrasado */ #cursor-ring {
position:fixed; width:36px; height:36px;
border:1.5px solid rgba(240,168,0,.4);
border-radius:50%; pointer-events:none; z-index:9998;
transform:translate(-50%,-50%);
transition:all .18s ease;
}
/* JS: laggy follow */
let rx=0, ry=0;
(function anim(){
rx += (mx-rx)*.12; ry += (my-ry)*.12;
ring.style.left = rx+'px'; ring.style.top = ry+'px';
requestAnimationFrame(anim);
})();
En hover de links/botones: punto se encoge a 8px, anillo crece a 54px, border-color sube a rgba(240,168,0,.6)
Badges de tecnología — Colores por tipo
IA conversacional
bg rgba(240,168,0,.15) · color #D4920A
Síntesis de voz
bg rgba(21,199,106,.12) · color #0e9050
Base de datos
bg rgba(37,99,168,.15) · color #2563A8
Backend / infra
bg #F0F2F7 · color #5A6475 · border #DDE3EC
Protocolo / alerta
bg rgba(201,48,48,.1) · color #C93030
Version live
bg #152E54 · color #F0A800 (navy+gold)
⚙️ Plataformas de despliegue y desarrollo
📧
Email Supabase
quintaesenciadigital@gmail.com
📦
CDN Assets
Aka625.b-cdn.net/Alimentia26/
🤖 APIs de IA y servicios externos (Netlify Functions)
🤖
Claude Haiku
claude-haiku-4-5-20251001 · Anthropic · Fallback IA
🧠
GPT-4o mini
gpt-4o-mini · OpenAI · Primario IA chat
🔊
ElevenLabs TTS
eleven_multilingual_v2 · Voz Matilda (XrExE9yKIg1WjnnlVkGX)
🔊
OpenAI TTS-HD
tts-1-hd · Voz Shimmer · Speed 0.92x · Secundario
🔑
Env vars Netlify
OPENAI_KEY / CLAUDE_KEY / ELEVEN_KEY — nunca al cliente
🗄️
Supabase Project
ID: uwecrtssdtwubyzirirb · RLS activo por organización
Arquitectura de seguridad
🔐
Netlify Functions serverless — todas las llamadas a APIs externas (Claude, GPT, ElevenLabs) pasan por aquí. Las API keys nunca llegan al frontend.
🔒
Supabase RLS (Row-Level Security) — cada organización (residencia, SAD, catering) tiene acceso solo a sus propios datos. Aislamiento total a nivel de fila.
📱
PWA sin instalación — todas las apps funcionan desde el navegador. No requieren descarga en App Store / Play Store. Compatibles con cualquier móvil moderno.
📥
Importación UCALSA Connect — rutas via CSV. Rutty valida, asigna y publica en <30 segundos. Compatible con el flujo existente de los servicios.
🎯 Problema real antes que función
Siempre empezar por el problema que se resuelve. No por la feature. "El repartidor sale con un post-it de alergias" antes que "Rutty muestra alérgenos en pantalla". El drama primero, la solución después.
🔬 Tecnología visible y específica
Nunca "IA avanzada". Siempre Claude Haiku + GPT-4o mini. Nunca "síntesis de voz". Siempre ElevenLabs Multilingual v2, voz Matilda. La especificidad construye confianza. Los nombres exactos de tecnología van en el hero desde el primer segundo.
⚡ Tono directo y sin relleno
La IA de Rutty responde en máximo 3 frases. Las landings tienen el mismo criterio: cada frase justifica su presencia. Sin "solución innovadora", sin "ecosistema revolucionario". Palabras concretas: "Cajas ROJAS = protocolo de doble verificación". "QR único por comensal". "30 segundos".
🌑 Dark-first con alternancia controlada
Las secciones de impacto (hero, problema, funciones, comparativa, ecosistema) van en dark #07101f. Las secciones de detalle y legitimidad (tecnología, flujo, normativa) van en claro #ffffff / #f8f9fc. El CTA final siempre en dorado (#F0A800) como ruptura.
🔗 El ecosistema siempre presente
Todas las landings terminan con el diagrama DALINA → [app] → Comensalia y los links cruzados. Cada app existe dentro del sistema, no sola. El footer siempre incluye links a AlimentIA Pro, DALINA, Comensalia y el email de contacto.
📐 Mockups como prueba, no decoración
El phone mock y el desktop mock muestran datos reales del producto: nombres de campo correctos, badges de alérgeno reales (DALINA), nombres de tecnología, estados de ruta de Supabase. Un mockup genérico no vende. Un mockup con "Lácteos severo · Sin gluten" sí.
✅ Normativa como argumento, no como aviso legal
UE 1169/2011, P02, P04, P05, P06, RLS — no son disclaimers al pie. Son argumentos de venta. "14 alérgenos de declaración obligatoria integrados en el flujo" es diferente a "cumplimos con la normativa". La normativa justifica la necesidad del producto.