/* global React */ const { useState, useEffect, useRef, useCallback } = React; /* ============================================================ FixRiver — Automatizaciones (showcase) Catálogo de automatizaciones Make + n8n. Make: capturas AVIF servidas desde el CDN (card en la grilla, full en el lightbox). n8n: visor interactivo del workflow real. ============================================================ */ const MAKE = '167,139,250'; // iris / violet → Make const N8N = '240,96,143'; // magenta → n8n const IMG_BASE = 'https://cdn.fixriver.com/assets/automations/'; const mkImg = (slug) => ({ img: IMG_BASE + slug + '-card.avif', imgFull: IMG_BASE + slug + '-full.avif' }); // Orden mezclado (Make y n8n alternados) para que la grilla no quede en dos bloques. // Make: captura del CDN. n8n: visor interactivo del workflow real (N8nViewer). // Los slugs de Make saltan de make-08 a make-10: es intencional, make-09 no existe. const AUTOS = [ { id:'make-01-alfred', p:'make', title:'Alfred — Asistente multipropósito por WhatsApp', desc:'Un solo número de WhatsApp que lo hace todo: emite facturas, resume tus emails, transcribe audios y hasta responde con voz. Detecta la intención con IA, filtra intentos de manipulación y registra cada operación. La demo de lo que puede ser un asistente de empresa.', ...mkImg('make-01-alfred') }, { id:'n8n-01', p:'n8n', title:'Asistente de RRHH por WhatsApp (multi-agente)', desc:'Varios agentes IA coordinados resuelven las dudas de empleados por WhatsApp y derivan al equipo solo cuando hace falta.', img:null, workflow:'workflows/01-asistente-rrhh-whatsapp.json' }, { id:'make-02-chat-master-ia', p:'make', title:'Chat Master IA — Captación del Máster en IA (BIG + Universidad Isabel I)', desc:'En producción: recibía por WhatsApp a los interesados en el máster, identificaba al contacto, transcribía los audios entrantes y sostenía la conversación con un asistente IA con memoria e historial. La puerta de entrada del embudo de captación.', ...mkImg('make-02-chat-master-ia') }, { id:'n8n-02', p:'n8n', title:'Copiloto de operaciones por Telegram', desc:'Un copiloto IA en Telegram consulta tus sistemas y ejecuta tareas operativas desde el chat del equipo.', img:null, workflow:'workflows/02-copiloto-operaciones-telegram.json' }, { id:'make-03-chat-respuesta', p:'make', title:'Chat Respuesta — Motor de respuesta del asistente', desc:'La segunda mitad del sistema, con un detalle que casi ningún bot resuelve bien: si el interesado manda tres mensajes seguidos, no recibe tres respuestas sueltas — el flujo los agrupa y contesta con una sola que responde a todo junto, como lo haría una persona. Esa arquitectura modular terminó siendo material de clase para los propios alumnos del máster.', ...mkImg('make-03-chat-respuesta') }, { id:'n8n-03', p:'n8n', title:'Funnel de registro conversacional por WhatsApp', desc:'Guía al usuario paso a paso por WhatsApp hasta completar el registro, sin formularios ni fricción.', img:null, workflow:'workflows/03-funnel-registro-whatsapp.json' }, { id:'make-04-emitir-factura', p:'make', title:'Emitir Factura — Facturación end-to-end', desc:'El sistema que factura en producción: identifica al cliente, resuelve método de pago, conversión de divisas y numeración secuencial, genera el PDF con formato desde plantilla y lo archiva con su registro contable. Facturar sin tocar nada.', ...mkImg('make-04-emitir-factura') }, { id:'n8n-04', p:'n8n', title:'Certificados automáticos de cursos', desc:'Genera y envía el certificado personalizado en cuanto el alumno termina el curso.', img:null, workflow:'workflows/04-certificados-automaticos.json' }, { id:'make-05-gcalendar', p:'make', title:'Agenda en Google Calendar por WhatsApp', desc:'Tus clientes consultan disponibilidad, reservan y cancelan turnos directamente por WhatsApp; todo queda sincronizado en Google Calendar al instante. Recepción abierta 24/7 sin recepcionista.', ...mkImg('make-05-gcalendar') }, { id:'n8n-05', p:'n8n', title:'Subtitulado automático de academias de video', desc:'Transcribe y subtitula cada video de la academia automáticamente, listo para publicar.', img:null, workflow:'workflows/05-subtitulado-automatico.json' }, { id:'make-06-envio-whatsapp', p:'make', title:'Envío WhatsApp — Recordatorios de turnos a escala', desc:'Más de 150 módulos en producción: lee los turnos registrados en Calendar y dispara recordatorios por WhatsApp y email en cada hito, con rutas para confirmaciones y avisos. Menos ausencias, agenda llena.', ...mkImg('make-06-envio-whatsapp') }, { id:'n8n-06', p:'n8n', title:'Resúmenes de clases generados por IA', desc:'Convierte la grabación de cada clase en un resumen con los puntos clave para repasar en minutos.', img:null, workflow:'workflows/06-resumenes-ia.json' }, { id:'make-07-sheets-holded', p:'make', title:'Sheets → Holded — Contabilidad de alquiler turístico', desc:'En producción: toma la exportación de un sistema de gestión legacy, canaliza las reservas de una gestora de propiedades turísticas y las contabiliza y factura automáticamente en Holded. Del Excel viejo a la contabilidad ordenada.', ...mkImg('make-07-sheets-holded') }, { id:'n8n-07', p:'n8n', title:'Conciliación de pagos con Stripe', desc:'Cruza los cobros de Stripe con tu contabilidad y señala cada diferencia para revisarla.', img:null, workflow:'workflows/07-conciliacion-stripe.json' }, { id:'make-08-recepcion-myc', p:'make', title:'Recepción MYC — Prototipo operativo de 300+ módulos', desc:'Una prueba de concepto funcional a gran escala: 300+ módulos orquestando toda la operación de recepción por WhatsApp, para validar el modelo antes de pasarlo a desarrollo en código. Parte del proyecto Moyca (ver Desarrollos).', ...mkImg('make-08-recepcion-myc') }, { id:'n8n-08', p:'n8n', title:'Motor de campañas masivas por WhatsApp API', desc:'Envía campañas segmentadas por la API oficial de WhatsApp con control de ritmo y entregas.', img:null, workflow:'workflows/08-campanas-whatsapp.json' }, { id:'make-10-transcripciones', p:'make', title:'Process Transcriptions — 3 toneladas de cintas de radio', desc:'Uno de los primeros proyectos: años de emisiones de radio digitalizadas desde más de 3 toneladas de cintas magnéticas, transcritas en serie y luego resumidas y etiquetadas con IA. Memoria histórica convertida en archivo consultable.', ...mkImg('make-10-transcripciones') }, { id:'n8n-09', p:'n8n', title:'Sistema self-healing de mensajería', desc:'Detecta los errores de envío y reintenta o reencamina los mensajes solo, sin intervención.', img:null, workflow:'workflows/09-self-healing.json' }, { id:'n8n-10', p:'n8n', title:'Unificación de usuarios duplicados', desc:'Detecta y fusiona registros duplicados para mantener una única ficha por usuario.', img:null, workflow:'workflows/10-unificacion-duplicados.json' }, ]; const PLATFORMS = { make: { name:'Make', c: MAKE, icon:'puzzle' }, n8n: { name:'n8n', c: N8N, icon:'workflow' }, }; /* ---------- minimapa SVG del workflow real (tarjetas n8n) ---------- Dibuja nodos y conexiones con las posiciones reales del JSON (precalculadas en thumbs.js para no descargar los workflows en la grilla). */ const NODE = 96; // tamaño de nodo en coordenadas del lienzo de n8n function WorkflowThumb({ id }) { const t = (window.WF_THUMBS || {})[id]; if (!t) return null; const xs = t.n.map(p => p[0]), ys = t.n.map(p => p[1]); const pad = 70; const minX = Math.min(...xs) - pad, minY = Math.min(...ys) - pad; const w = Math.max(...xs) - minX + NODE + pad, h = Math.max(...ys) - minY + NODE + pad; return ( ); } /* ---------- placeholder que evoca un lienzo de automatización ---------- */ function Shot({ a, color }) { const pf = PLATFORMS[a.p]; const c = color ? pf.c : '148,163,184'; if (a.img) { return (
{a.title}
); } const thumb = a.workflow && (window.WF_THUMBS || {})[a.id]; if (thumb) { return (
{thumb.n.length} nodos · míralo por dentro
); } return (
{a.id}.png
); } function Badge({ p, color }) { const pf = PLATFORMS[p]; return ( {pf.name} ); } function Card({ a, color, onOpen, span }) { const pf = PLATFORMS[a.p]; return ( ); } function Row({ a, color, onOpen }) { const pf = PLATFORMS[a.p]; return ( ); } /* ---------- Lightbox ---------- */ function Lightbox({ list, idx, color, onClose, onStep }) { useEffect(() => { function key(e){ if (e.key === 'Escape') onClose(); else if (e.key === 'ArrowLeft') onStep(-1); else if (e.key === 'ArrowRight') onStep(1); } addEventListener('keydown', key); return () => removeEventListener('keydown', key); }, [onClose, onStep]); if (idx == null) return null; const a = list[idx]; const pf = PLATFORMS[a.p]; const c = color ? pf.c : '148,163,184'; return (
e.target.classList.contains('lb') && onClose()}>
{a.workflow ? : a.img ? {a.title} : }

{a.title}

{a.desc}

¿Es esta la automatización para tu negocio? Contacta con nosotros
{idx + 1} / {list.length}
); } function Section({ t }) { const [filter, setFilter] = useState('all'); const [lb, setLb] = useState(null); const color = t.colorCode !== false; const layout = t.layout || 'grid'; const list = AUTOS.filter(a => filter === 'all' || a.p === filter); const counts = { all: AUTOS.length, make: AUTOS.filter(a=>a.p==='make').length, n8n: AUTOS.filter(a=>a.p==='n8n').length, }; // re-draw lucide icons whenever the DOM changes useEffect(() => { if (window.lucide) window.lucide.createIcons(); }); const step = useCallback((d) => { setLb(i => (i == null ? i : (i + d + list.length) % list.length)); }, [list.length]); // bento spans: every 5th card (within filtered list) goes wide for rhythm const isWide = (i) => layout === 'bento' && i % 5 === 0; const FILTERS = [ ['all','Todas','layers'], ['make','Make','puzzle'], ['n8n','n8n','workflow'], ]; return (
Automatizaciones

El trabajo repetitivo, resuelto.

Automatizaciones reales, funcionando en negocios como el tuyo. Cada flujo conecta las herramientas que ya usas y elimina una tarea de tu semana. Filtra por plataforma y míralos por dentro.

{FILTERS.map(([k,label,icon]) => ( ))}
{layout === 'lista' ? (
{list.map((a, i) => setLb(i)} />)}
) : (
{list.map((a, i) => setLb(i)} />)}
)}
setLb(null)} onStep={step} />
); } Object.assign(window, { Section });