/* hero.jsx — Navbar, Hero w/ Search, Dashboard mockup, Logo cloud (dark band), Beneficios */ /* ============= NAVBAR (light) ============= */ function Navbar({ onLogin }) { const [scrolled, setScrolled] = useState(false); useEffect(() => { const onScroll = () => setScrolled(window.scrollY > 12); window.addEventListener('scroll', onScroll, { passive: true }); return () => window.removeEventListener('scroll', onScroll); }, []); const links = [ { href: '#dashboard', label: 'La app' }, { href: '#modos', label: 'Modos' }, { href: '#precios', label: 'Precios' }, { href: '#seguridad', label: 'Seguridad' }, ]; return ( ); } /* ============= HERO + SEARCH ============= */ const MODES = [ { id: 'general', label: 'General', icon: 'scale', desc: 'Respuesta jurídica directa con citas a BOE y CENDOJ.', color: 'indigo' }, { id: 'devil', label: 'Abogado del Diablo', icon: 'gavel', desc: 'Refuta tu argumentación con la jurisprudencia más adversa.', color: 'red' }, { id: 'judge', label: 'Simulador de Juez', icon: 'judge', desc: 'Predice cómo lo verá un tribunal y qué pesa más.', color: 'amber' }, { id: 'data', label: 'Probabilidades', icon: 'chart', desc: 'Estima el éxito basado en sentencias análogas.', color: 'emerald' }, ]; const SUGGESTIONS = [ "Plazo para recurrir en apelación en civil", "Requisitos del despido improcedente 2025", "Doctrina del TS sobre cláusulas suelo", "Convencionalidad y CDFUE en penal", ]; const FALLBACK_ANSWER = `El plazo para interponer recurso de apelación contra una sentencia civil es de **veinte días hábiles** desde la notificación. **Fundamentación:** - Art. 458.1 LEC — plazo de interposición y forma escrita. - STS, Sala 1ª, núm. 487/2023 de 10 de abril — cómputo desde notificación efectiva. **Aplicación práctica:** - *Dies a quo*: día siguiente a la notificación al procurador. - *Dies ad quem*: 20º día hábil, antes de las 15:00 (art. 135 LEC). ¿Reviso los motivos de oposición que el contrario podría alegar antes de preparar nada?`; function HeroSearch({ onLoginRequired }) { const FREE_LIMIT = 3; const [query, setQuery] = useState(''); const [mode, setMode] = useState('general'); const [loading, setLoading] = useState(false); const [response, setResponse] = useState(null); const [error, setError] = useState(null); const [used, setUsed] = useState(0); const inputRef = useRef(null); useEffect(() => { try { const n = parseInt(localStorage.getItem('mentaly_anon_count') || '0', 10); if (!isNaN(n)) setUsed(n); } catch {} }, []); const remaining = Math.max(0, FREE_LIMIT - used); const search = async () => { const q = query.trim(); if (!q) return; if (mode !== 'general' || used >= FREE_LIMIT) { onLoginRequired(q, mode); return; } setLoading(true); setError(null); setResponse(null); try { let answer = ''; try { const sys = `Eres Mentaly, una IA jurídica especializada en derecho español. Respondes con concisión y precisión. Formato: - Empieza con la respuesta directa (1-2 frases, en negrita los datos clave con **doble asterisco**). - "Fundamentación:" con 2-4 bullets que citen artículo (LEC, CC, CP, LO, ET, RGPD…) y sentencias del TS/TC/AP plausibles. - "Aplicación práctica:" con 2-3 bullets. - Cierra con una pregunta corta de seguimiento. No inventes referencias; si no las tienes, escríbelo. Tono: abogado senior, español de España, profesional. Máximo 180 palabras.`; const text = await window.MentalyAI.complete({ messages: [{ role: 'user', content: `Consulta jurídica:\n${q}` }], system: sys, timeout: 18000, }); answer = typeof text === 'string' ? text : (text?.text || ''); } catch { answer = FALLBACK_ANSWER; } if (!answer || answer.length < 8) answer = FALLBACK_ANSWER; setResponse({ text: answer, q }); const next = used + 1; setUsed(next); try { localStorage.setItem('mentaly_anon_count', String(next)); } catch {} } catch { setError('Algo ha fallado. Inténtalo de nuevo.'); } finally { setLoading(false); } }; const onKey = (e) => { if (e.key === 'Enter' && !loading) search(); }; const modeColorPill = { indigo: { bg: 'bg-indigo2-500/[0.08]', br: 'border-indigo2-500/30', txt: 'text-indigo2-600', dot: 'bg-indigo2-500' }, red: { bg: 'bg-red-500/[0.08]', br: 'border-red-700/30', txt: 'text-red-700', dot: 'bg-red-600' }, amber: { bg: 'bg-amber-500/[0.12]', br: 'border-amber-500/35', txt: 'text-amber-700', dot: 'bg-amber-500' }, emerald: { bg: 'bg-emerald-500/[0.08]', br: 'border-emerald-500/30', txt: 'text-emerald-700', dot: 'bg-emerald-500' }, }; return (
{/* Mode tabs */}
{MODES.map(m => { const c = modeColorPill[m.color]; const active = mode === m.id; const locked = m.id !== 'general'; return ( ); })}
{/* Search input */}
setQuery(e.target.value)} onKeyDown={onKey} placeholder={mode === 'general' ? "Pregunta a Mentaly…" : `Modo "${MODES.find(m=>m.id===mode).label}" — inicia sesión`} className="flex-1 bg-transparent py-3.5 outline-none text-[15.5px] text-ink-900 placeholder:text-ink-400" disabled={loading} /> {loading ? : (<>Consultar)}
{/* Suggestions */} {!response && !loading && (
Prueba {SUGGESTIONS.map(s => ( ))}
)} {/* Trust line */}
3 consultas gratis Privado · RGPD UE Conectado a BOE & CENDOJ
{loading && } {error && (
{error}
)} {response && !loading && ( onLoginRequired('', 'general')} /> )}
); } function ResponseSkeleton() { return (
Mentaly está razonando…
consultando BOE + CENDOJ
); } function ResponseCard({ text, q, onLogin }) { return (
Respuesta de Mentaly
2,1s · modo General
{q && (
“{q}”
)}
BOE CENDOJ Citas verificadas
¿Quieres analizar tu propio expediente?
Sube tu PDF y desbloquea los 4 modos de razonamiento.
); } /* ============= HERO SECTION ============= */ function Hero({ onLoginRequired }) { return (
{/* lightweight glow top-right */}
{/* subtle grid fading down */}
IA jurídica para abogados en España · 2026

El criterio de un
abogado senior,
{' '} amplificado por IA.

Mentaly analiza expedientes de hasta 10.000 páginas, contrasta jurisprudencia del CENDOJ y razona con 4 perspectivas distintas. Pregunta ahora, sin registro.

); } /* ============= DASHBOARD MOCKUP ============= */ function DashboardMockup() { const [ref, shown] = useReveal(0.18); const fullUserQ = "¿La cláusula suelo de esta escritura supera el doble control de transparencia o es nula?"; const fullAnswer = "La escritura no acredita información precontractual real sobre el riesgo de oscilación a la baja, por lo que no supera el doble control de transparencia exigido por el TS (STS 9/05/2013, Pleno)."; const [userChars, setUserChars] = useState(0); const [aiChars, setAiChars] = useState(0); const [pct, setPct] = useState(0); const [stage, setStage] = useState(0); // 0=idle 1=upload 2=ocr 3=user 4=thinking 5=ai 6=done const [uploadPct, setUploadPct] = useState(0); const [ocrPage, setOcrPage] = useState(0); const [sourcesShown, setSourcesShown] = useState(0); useEffect(() => { if (!shown) return; let cancelled = false; const timers = []; const intervals = []; const wait = (ms) => new Promise((res) => { const t = setTimeout(() => res(), ms); timers.push(t); }); const runOnce = async () => { // reset setUserChars(0); setAiChars(0); setPct(0); setUploadPct(0); setOcrPage(0); setSourcesShown(0); // Stage 1 — upload PDF setStage(1); let up = 0; await new Promise((res) => { const id = setInterval(() => { up += 4 + Math.random() * 6; if (up >= 100) { up = 100; clearInterval(id); res(); } setUploadPct(Math.round(up)); }, 40); intervals.push(id); }); if (cancelled) return; await wait(280); // Stage 2 — OCR setStage(2); const total = 412; let p = 0; await new Promise((res) => { const id = setInterval(() => { p += 28 + Math.floor(Math.random() * 14); if (p >= total) { p = total; clearInterval(id); res(); } setOcrPage(p); }, 60); intervals.push(id); }); if (cancelled) return; await wait(420); // Stage 3 — User types setStage(3); await new Promise((res) => { let u = 0; const id = setInterval(() => { u += 2; setUserChars(u); if (u >= fullUserQ.length) { clearInterval(id); res(); } }, 22); intervals.push(id); }); if (cancelled) return; await wait(320); // Stage 4 — Thinking setStage(4); await wait(950); if (cancelled) return; // Stage 5 — AI answer (count-up + typewriter parallel) setStage(5); const cntId = setInterval(() => { setPct(v => { const nx = v + 2.6; if (nx >= 84.7) { clearInterval(cntId); return 84.7; } return nx; }); }, 28); intervals.push(cntId); await new Promise((res) => { let a = 0; const id = setInterval(() => { a += 3; setAiChars(a); if (a >= fullAnswer.length) { clearInterval(id); res(); } }, 22); intervals.push(id); }); if (cancelled) return; setStage(6); // Stage 6 — sources fade-in for (let i = 0; i < 4; i++) { await wait(220); if (cancelled) return; setSourcesShown(n => Math.max(n, i+1)); } // Pause then restart await wait(3800); if (!cancelled) runOnce(); }; runOnce(); return () => { cancelled = true; timers.forEach(clearTimeout); intervals.forEach(clearInterval); }; }, [shown]); const userText = fullUserQ.slice(0, Math.min(userChars, fullUserQ.length)); const aiText = fullAnswer.slice(0, Math.min(aiChars, fullAnswer.length)); const aiDone = aiChars >= fullAnswer.length; const ratioModes = [ { id: 'general', icon: 'scale', tip: 'General', accent: 'indigo' }, { id: 'devil', icon: 'gavel', tip: 'Adverso', accent: 'red' }, { id: 'judge', icon: 'judge', tip: 'Juez', accent: 'amber' }, { id: 'data', icon: 'chart', tip: 'Datos', accent: 'emerald' }, ]; return (
Vista de Mentaly

Una herramienta diseñada
para ejercer mejor.

{/* Mockup */}
{/* Top bar */}
mentaly.es · sesión activa
{/* MODES RAIL (md+) */} {/* SIDEBAR — expedientes (árbol de carpetas) */} {/* CHAT */}
García vs BBVA
Cláusula suelo · escritura 23/04/2010 · 412 págs
General
{/* Upload + OCR banner */} {(stage === 1 || stage === 2) && (
{stage === 1 ? 'Subiendo expediente.pdf' : 'Extrayendo texto del expediente'}
{stage === 1 ? `${uploadPct} %` : `pág. ${ocrPage} / 412`}
{stage === 1 ? ( <> cifrado AES-256 · subida segura ) : ( <> detectando plazos · partes · fundamentos · riesgos )}
)} {/* User msg with typewriter */} {stage >= 3 && (
{userText} {userChars < fullUserQ.length && }
)} {/* Thinking */} {stage === 4 && (
Mentaly está leyendo el expediente · consultando BOE & CENDOJ…
)} {/* AI answer */} {stage >= 5 && (

Nula por falta de transparencia material.{' '} {aiText} {!aiDone && }

{aiDone && (

Fundamentos:{' '} art. 1303 CC {' · '} STS 367/2017 {' · '} STJUE C-154/15 {' · expediente p. 12, 47, 218.'}

)}
)}
Pregunta sobre este expediente…
{/* SOURCES (lg+) */}

Vista real del asistente — diseño preliminar

); } /* ============= LOGO CLOUD — Fuentes oficiales (dark band, real links) ============= */ function LogoBOE({ className="" }) { return ( );} function LogoCENDOJ({ className="" }){ return ( );} function LogoEURLex({ className="" }){ const stars = Array.from({length: 12}).map((_,i) => { const a = (i/12) * Math.PI*2 - Math.PI/2; const r = 11; return { x: 28 + Math.cos(a)*r, y: 16 + Math.sin(a)*r }; }); return ( ); } function LogoTC({ className="" }) { return ( );} function LogoMJ({ className="" }) { return ( );} const LOGO_ITEMS = [ { name: 'BOE.es', sub: 'Boletín Oficial del Estado', href: 'https://www.boe.es', Mark: LogoBOE }, { name: 'CENDOJ', sub: 'Centro de Doc. Judicial', href: 'https://www.poderjudicial.es', Mark: LogoCENDOJ }, { name: 'EUR-Lex', sub: 'Derecho de la Unión Europea', href: 'https://eur-lex.europa.eu', Mark: LogoEURLex }, { name: 'T. Constitucional',sub: 'Tribunal Constitucional', href: 'https://www.tribunalconstitucional.es', Mark: LogoTC }, { name: 'Mª de Justicia', sub: 'Ministerio de Justicia', href: 'https://www.mjusticia.gob.es', Mark: LogoMJ }, ]; function LogoCloud() { return (
{/* subtle dot pattern */}
{/* corner glow */}
Conexión en tiempo real con bases de datos oficiales
{LOGO_ITEMS.map(it => (
{it.name}
{it.sub}
))}

Cada respuesta cita la fuente. Haz clic en cualquier organismo para visitar su web oficial.

); } /* ============= BENEFICIOS — 4 cards ============= */ function Beneficios() { return (
Tareas que te ahorran horas esta semana.} kicker="No es un asistente más. Es un cambio en cómo abordas cada expediente." > } /> } /> } /> } />
); } function BeneCard({ title, desc, visual }) { return (
{visual}
{title}
{desc}
); } function MiniScan() { const lines = [ { w: '90%' }, { w: '78%', hi: true, tag: 'plazo' }, { w: '85%' }, { w: '62%' }, { w: '88%', hi: true, tag: 'parte' }, { w: '72%' }, { w: '80%', hi: true, tag: 'riesgo' }, { w: '64%' }, ]; return (
Exp. 2024/0418 p.218
{lines.map((l,i) => (
{l.hi && {l.tag}}
))}
); } function MiniSources() { const items = [ { tag: 'BOE', name: 'CC art. 1303', c: 'blue' }, { tag: 'CENDOJ', name: 'STS 241/2013', c: 'violet' }, { tag: 'STJUE', name: 'C-154/15', c: 'amber' }, ]; return (
{items.map((s,i) => (
{s.tag} {s.name}
))}
); } function MiniModes() { const modes = [ { l: 'General', c: 'indigo' }, { l: 'Diablo', c: 'red' }, { l: 'Juez', c: 'amber' }, { l: 'Datos', c: 'emerald' }, ]; return (
{modes.map((m,i) => ( {m.l} ))}
Modo General
); } function MiniShield() { return (
{/* spinning ring */}
{/* pulse rings */}
RGPD UE · AES-256
); } Object.assign(window, { Navbar, Hero, DashboardMockup, LogoCloud, Beneficios, MODES });