/* global React, PROGRAMS, eur, Icon, Button, Card, Badge, LevelChip, Eyebrow, EPMark, Logo */ const { useState: useStateFA } = React; /* --------------------------------------------------------------- FORMSPREE ENDPOINT · edita esta línea cuando tengas el form ID. Pasos: 1) Crea cuenta en https://formspree.io 2) Nuevo formulario → copia el endpoint (https://formspree.io/f/XXXXXXXX) 3) Reemplaza el valor de FORMSPREE_ENDPOINT abajo 4) En el dashboard, activa "Notification emails" → secretaria@escueladeprotones.com --------------------------------------------------------------- */ const FORMSPREE_ENDPOINT = 'https://formspree.io/f/maqkbool'; /* ======================================== Format / Methodology ======================================== */ function MethodologySection() { return (
// Metodología

Formato intensivo.
Casos reales. Aforo controlado.

Cada edición se imparte en tres días consecutivos, con cuatro horas diarias en directo. Sin grabaciones públicas, sin asistentes pasivos: clases enfocadas, ejercicios sobre datasheets reales y debate técnico.

{[ ['Teoría aplicada', 'Cada concepto se aterriza en un caso real auditado, no en ejemplos académicos.'], ['Datasheets de fabricante', 'Aprendes a leer los documentos que llegan a tu mesa, no versiones simplificadas.'], ['Material descargable', 'Plantillas de cálculo, hojas de selección y checklist normativos para llevarte al puesto.'], ['Certificado firmado', 'Documento acreditativo emitido por Lean Hydrogen al completar cada programa.'], ].map(([t,b]) => (
{t}
{b}
))}
{/* Schedule card */}
Horario tipo de edición

12 horas de formación en directo

16:00 — 20:00 · Hora peninsular (CET/CEST)
{[ { day:'Día 01', date:'Mar', label:'Fundamentos y marco general' }, { day:'Día 02', date:'Mié', label:'Análisis técnico aplicado' }, { day:'Día 03', date:'Jue', label:'Casos reales y entrega de material' }, ].map((d, i)=>(
{d.date} {String(i+1).padStart(2,'0')}
{d.day}
{d.label}
16:00 — 20:00
))}
{[ ['Total', '12 h'], ['Aforo', '30 alumnos'], ['Idioma', 'Español'], ].map(([k,v])=>(
{k}
{v}
))}
); } /* ======================================== Calendar / cohorts ======================================== */ function CalendarSection() { // Launch strategy: each programme runs ONE live edition during the Oct–Dec 2026 // window, then continues as on-demand async editions from 2027 onwards. const cohorts = [ { id:'p1', month:'Oct', year:2026, dates:'13 — 15 oct', spots: 12, total: 30 }, { id:'p2', month:'Oct', year:2026, dates:'27 — 29 oct', spots: 8, total: 30 }, { id:'p3', month:'Nov', year:2026, dates:'10 — 12 nov', spots: 14, total: 30 }, { id:'p4', month:'Nov', year:2026, dates:'24 — 26 nov', spots: 18, total: 30 }, { id:'p5', month:'Dic', year:2026, dates:' 1 — 3 dic', spots: 22, total: 30 }, { id:'p6', month:'Dic', year:2026, dates:'15 — 17 dic', spots: 26, total: 30 }, ]; return (
// Lanzamiento · Q4 2026

Ediciones en vivo de lanzamiento.

Cada programa abre con una única edición en directo entre octubre y diciembre de 2026, con plaza limitada y acceso al claustro. A partir de 2027 quedará disponible en formato asíncrono, a tu ritmo.

Preinscripción ya disponible
{cohorts.map((c, i)=>{ const p = PROGRAMS.find(x => x.id === c.id); const lc = p.level === 'i' ? 'var(--lh-cyan)' : p.level === 'a' ? 'var(--lh-blue)' : '#9A9F00'; const remaining = c.total - c.spots; const pct = (c.spots / c.total) * 100; const isFull = remaining <= 0; return (
{c.month} {c.year}
{p.code}
{p.title}
{p.subtitle}
En vivo
{isFull ? 'Completo' : `${remaining} plazas libres`} {c.spots}/{c.total}
80 ? 'var(--warning)' : lc, }}/>
{c.dates}
); })}
{/* Async follow-on band */}
Desde 2027 — ediciones asíncronas · a tu ritmo
Tras la edición en vivo de cada programa, el contenido queda disponible en formato asíncrono con tutorías programadas. Mismo precio, mismo certificado firmado por Lean Hydrogen.
{/* In-company / ad-hoc training band */}
{/* faint blueprint */}
// Formación in-company
Diseñamos programas a medida para tu empresa.
Combinamos módulos del catálogo o construimos un itinerario ad-hoc sobre tus casos reales — electrolizadores, SAF, amoníaco, metanol. En vuestras oficinas, online o híbrido. Bonificable FUNDAE.
secretaria@escueladeprotones.com
); } /* ======================================== Apply / contact ======================================== */ function ApplySection() { const [submitted, setSubmitted] = useStateFA(false); const [sending, setSending] = useStateFA(false); const [error, setError] = useStateFA(null); const [form, setForm] = useStateFA({ name:'', email:'', company:'', role:'', program:'', message:'', track:'reservar', privacy: false, }); const update = (k) => (e) => setForm(prev => ({...prev, [k]: e.target.value})); const trackLabel = {reservar:'Preinscripción', corporativo:'Reserva corporativa', info:'Más información'}; async function handleSubmit(e) { e.preventDefault(); setError(null); // Fail loudly if the endpoint hasn't been wired yet. if (FORMSPREE_ENDPOINT.indexOf('YOUR_FORM_ID') !== -1) { setError('Form endpoint no configurado. Edita FORMSPREE_ENDPOINT en sections-end.jsx.'); return; } setSending(true); const programLabel = form.program === 'multiple' ? 'Varios — necesita asesoramiento' : (PROGRAMS.find(p => p.id === form.program) || {}); const programText = typeof programLabel === 'string' ? programLabel : (programLabel.code ? programLabel.code + ' · ' + programLabel.title : form.program); try { const res = await fetch(FORMSPREE_ENDPOINT, { method: 'POST', headers: { 'Accept': 'application/json' }, body: new URLSearchParams({ 'Nombre': form.name, 'Email': form.email, 'Empresa': form.company, 'Cargo': form.role, 'Programa': programText, 'Mensaje': form.message, 'Tipo': trackLabel[form.track] || form.track, '_subject': 'Escuela de Protones — ' + (trackLabel[form.track] || 'Solicitud') + ' (' + form.name + ')', '_replyto': form.email, }), }); if (!res.ok) { const data = await res.json().catch(() => ({})); throw new Error( (data.errors && data.errors.map(e => e.message).join(', ')) || 'No hemos podido enviar tu solicitud. Inténtalo de nuevo en unos minutos o escríbenos a secretaria@escueladeprotones.com.' ); } setSubmitted(true); } catch (err) { setError(err.message || 'Error de red. Inténtalo de nuevo.'); } finally { setSending(false); } } return (
// Preinscripción abierta

Reserva tu plaza para la edición en vivo de Q4 2026.

Cuéntanos qué programa te interesa. El equipo te confirma disponibilidad, condiciones y fechas en menos de 48 horas hábiles.

{[ { icon:'mail', label:'Correo de admisiones', value:'secretaria@escueladeprotones.com' }, { icon:'calendar', label:'Lanzamiento', value:'Octubre 2026 — preinscripción ya abierta' }, { icon:'users', label:'Reservas corporativas', value:'A partir de 3 plazas — condiciones especiales' }, { icon:'euro', label:'Bonificable FUNDAE', value:'Empresas: 100 % gestionable como formación bonificada. Tramitamos la solicitud.' }, ].map(it=>(
{it.label}
{it.value}
))}
{/* Form */}
{submitted ? (

Solicitud recibida

Te contactaremos en menos de 48 horas hábiles para confirmar la plaza.

) : (
{[ ['reservar','Preinscripción'], ['corporativo','Reserva corporativa'], ['info','Más información'], ].map(([k,label])=>( ))}
{PROGRAMS.map(p=>( ))}
{error && (
{error}
)}
)}
); } function FormField({ label, as = 'input', type='text', required, placeholder, rows, value, onChange, name }) { const [focus, setFocus] = useStateFA(false); const sharedStyle = { width:'100%', boxSizing:'border-box', padding:'12px 14px', fontFamily:'inherit', fontSize:14, color:'var(--fg)', background:'#fff', border:`1px solid ${focus ? 'var(--accent)' : 'var(--border)'}`, boxShadow: focus ? 'var(--shadow-focus)' : 'none', borderRadius:8, outline:'none', transition:'all 160ms cubic-bezier(.2,.8,.2,1)', resize: as === 'textarea' ? 'vertical' : 'none', }; return (