/* ═══════════════════════════════════════════════════════════ CRIAR EXPERIÊNCIA — Multi-step briefing wizard Hexis AI: confidence scoring · smart fill · personalized recs ═══════════════════════════════════════════════════════════ */ const { useState: useStateCE, useEffect: useEffectCE, useMemo: useMemoC, useRef: useRefCE } = React; /* ── Hexis AI confidence engine (client-side) ─────────────── */ const computeConfidence = (stepId, optValue, profile) => { const role = (profile?.role || '').toLowerCase(); const sector = (profile?.sector || '').toLowerCase(); const intent = (profile?.intent || '').toLowerCase(); const interests = (profile?.interests_confirmed || []).map(i => i.toLowerCase()); const mis = profile?.misScore || 0.5; const match = (keywords) => keywords.some(k => role.includes(k) || sector.includes(k) || intent.includes(k) || interests.some(i => i.includes(k)) ); if (stepId === 'tipo') { const map = { Summit: match(['ceo','founder','cto','coo','managing','summit','conference','eventtech']) ? 0.91 : 0.62, Workshop: match(['cto','director','head','formação','saas','tech']) ? 0.85 : 0.55, Networking: match(['ceo','founder','managing','investor','captação','networking']) ? 0.94 : 0.60, Roadshow: match(['coo','sales','vp','roadshow','expansion','expansão']) ? 0.82 : 0.51, Hackathon: match(['cto','founder','inovação','tech','saas','startup']) ? 0.79 : 0.48, Outro: 0.38, }; return Math.min(0.98, (map[optValue] || 0.50) * (0.85 + mis * 0.15)); } if (stepId === 'setor') { const map = { FinTech: match(['fintech','finance','banking','crypto','payment']) ? 0.93 : 0.55, 'Energia': match(['energy','energia','esg','oil','renewabl','green']) ? 0.88 : 0.52, 'SaaS B2B': match(['saas','software','cloud','tech','eventtech']) ? 0.92 : 0.58, AgriTech: match(['agri','food','farm','rural']) ? 0.80 : 0.44, HealthTech: match(['health','bio','med','saúde']) ? 0.85 : 0.49, Outro: 0.40, }; return Math.min(0.98, (map[optValue] || 0.50) * (0.88 + mis * 0.12)); } if (stepId === 'escala') { const map = { micro: match(['ceo','founder','managing','investor','captação']) ? 0.88 : 0.56, pequeno: match(['cto','director','workshop','formação']) ? 0.85 : 0.60, medio: match(['summit','conference','coo','sales']) ? 0.90 : 0.65, grande: match(['ceo','founder','managing']) ? 0.84 : 0.58, }; return Math.min(0.98, (map[optValue] || 0.60) * (0.90 + mis * 0.10)); } if (stepId === 'objetivo') { const map = { Pipeline: match(['sales','vp','ceo','pipeline','lead']) ? 0.93 : 0.62, Captação: match(['founder','captação','investor','série','vc']) ? 0.96 : 0.50, Parcerias: match(['ceo','coo','partner','parceria']) ? 0.87 : 0.60, Branding: match(['cmo','branding','marketing','visibilidade']) ? 0.85 : 0.55, Formação: match(['cto','director','formação','upskilling']) ? 0.82 : 0.52, Lançamento: match(['cto','founder','product','launch','lançamento']) ? 0.88 : 0.56, }; return Math.min(0.98, (map[optValue] || 0.60) * (0.90 + mis * 0.10)); } return 0.60; }; const getBestOption = (stepId, opts, profile) => opts.reduce((best, o) => { const c = computeConfidence(stepId, o.v, profile); return c > (best.score || 0) ? { opt: o, score: c } : best; }, {}).opt; /* ── Hexis step messages ──────────────────────────────────── */ const HEXIS_STEP_MSG = (stepId, data, profile) => { const name = profile?.name?.split(' ')[0] || 'Executivo'; const count = Math.floor(240 + Math.random() * 160); if (stepId === 'tipo') { if (!data.tipo) return `Analisei ${count} eventos similares ao teu perfil (${profile?.role}, ${profile?.sector}). Vou recomendar o formato com maior probabilidade de ROI para ti.`; return `Ótima escolha, ${name}. ${data.tipo} tem MatchScore médio de ${Math.round(86 + computeConfidence('tipo', data.tipo, profile) * 10)}% no teu sector. Prossegue para afinação do setor.`; } if (stepId === 'setor') { if (!data.setor) return `Com base no teu histórico de ${profile?.interests_confirmed?.slice(0, 2).join(' + ') || 'EventTech'}, tenho 3 setores com ≥85% de match para o formato ${data.tipo}.`; return `${data.setor} × ${data.tipo}: combinação com pipeline estimado de €${(2.1 + computeConfidence('setor', data.setor, profile) * 5).toFixed(1)}M nos próximos 90 dias.`; } if (stepId === 'escala') { if (!data.escala) return `Para ${data.tipo} em ${data.setor}, o Hexis calculou a escala ótima com base em ${count} eventos comparáveis. Vê as minhas recomendações abaixo.`; return `Escala ${data.escala} alinhada com eventos históricos semelhantes. Custo operacional estimado: €${data.escala === 'micro' ? '8.400' : data.escala === 'pequeno' ? '18.600' : data.escala === 'medio' ? '42.000' : '95.000'}.`; } if (stepId === 'objetivo') { if (!data.objetivo.length) return `Análise comportamental indica que o teu perfil tende a maximizar resultados em ${['Pipeline','Captação','Parcerias'].join(' + ')}. Seleciona até 3 KPIs.`; return `KPIs selecionados: ${data.objetivo.join(' · ')}. O Hexis configurará o algoritmo de matchmaking para estes objetivos. Pronto para construir o teu stack.`; } return 'O Hexis está a calibrar o setup operacional para a tua experiência.'; }; /* ── Hexis AI side panel per step ─────────────────────────── */ const HexisStepPanel = ({ stepId, data, profile, opts, onSmartFill, stepXP }) => { const [visible, setVisible] = useStateCE(false); const [analysisText, setAnalysisText] = useStateCE(''); const fullText = HEXIS_STEP_MSG(stepId, data, profile); useEffectCE(() => { setVisible(false); setAnalysisText(''); const t1 = setTimeout(() => setVisible(true), 200); return () => clearTimeout(t1); }, [stepId]); /* Typewriter effect */ useEffectCE(() => { if (!visible) return; let i = 0; setAnalysisText(''); const iv = setInterval(() => { i++; setAnalysisText(fullText.slice(0, i)); if (i >= fullText.length) clearInterval(iv); }, 18); return () => clearInterval(iv); }, [visible, fullText]); const topOpt = getBestOption(stepId, opts, profile); return (
Hexis AI · Assistente de Briefing MIS {(profile?.misScore || 0.72).toFixed(2)}
Análise comportamental · {Math.round((profile?.misScore || 0.72) * 100)}% calibrado ao teu perfil
{/* Typewriter analysis */}
{analysisText} {analysisText.length < fullText.length && ( )}
{/* Confidence scores */}
{opts.slice(0, 4).map(o => { const c = computeConfidence(stepId, o.v, profile); const pct = Math.round(c * 100); const isTop = o.v === topOpt?.v; return (
{o.l}
0.75 ? 'rgba(0,196,140,0.7)' : 'rgba(255,255,255,0.2)', borderRadius: 2, transition: 'width 0.6s ease', }} />
0.75 ? 'var(--success)' : 'var(--text-3)', minWidth: 34, textAlign: 'right', fontWeight: isTop ? 900 : 400 }}> {pct}% {isTop && REC}
); })}
{/* XP chip */}
+{stepXP} XP ao concluir este passo · Hexis calibra em tempo real
); }; /* ── Products catalog ─────────────────────────────────────── */ const CE_PRODUCTS = [ { id: 'cp_01', source: 'Marcianus', cat: 'HaaS', name: 'Kiosk NFC Check-in', desc: 'Setup completo + operação incluídos. Face ID + NFC.', price: 2400, per: '/evento', tag: '', rec: ['Summit','Networking','Roadshow'] }, { id: 'cp_02', source: 'Marcianus', cat: 'SaaS', name: 'Hexis AI Live', desc: 'Motor de matchmaking em tempo real durante o evento.', price: 1200, per: '/evento', tag: 'Recomendado', rec: ['Summit','Networking','Hackathon'] }, { id: 'cp_03', source: 'Marcianus', cat: 'DaaS', name: 'Pack Leads Qualificados', desc: '50 decisores validados · MatchScore ≥85%.', price: 2400, per: '/pack', tag: '', rec: ['Summit','Roadshow'] }, { id: 'cp_04', source: 'Marcianus', cat: 'HaaS', name: 'NFC Wristbands × 100', desc: 'Identidade física. Regista cada conexão e interação.', price: 1200, per: '/100un.', tag: '', rec: ['Summit','Workshop','Networking'] }, { id: 'cp_05', source: 'Marcianus', cat: 'SaaS', name: 'D3-BMC Dashboard', desc: 'Analytics em tempo real durante e pós-evento.', price: 600, per: '/evento', tag: '', rec: ['Summit','Networking','Roadshow','Hackathon'] }, { id: 'cp_06', source: 'Parceiro', partner: 'EventPro Lisboa', cat: 'Serviço', name: 'Gestão de Evento Completa', desc: 'Equipa de produção, logística e coordenação no local.', price: 4500, per: '/evento', tag: '', rec: ['Summit','Roadshow'] }, { id: 'cp_07', source: 'Parceiro', partner: 'Chef Rodrigues', cat: 'Catering', name: 'Catering Executivo', desc: 'Menu personalizado · Serviço white-glove · Chef residente.', price: 65, per: '/pax', tag: '', rec: ['Networking','Summit'] }, { id: 'cp_08', source: 'Parceiro', partner: 'Studio Vox', cat: 'Design', name: 'Identidade Visual do Evento', desc: 'Brand book + assets digitais + signage design.', price: 3200, per: '/projeto', tag: '', rec: ['Summit','Hackathon','Roadshow'] }, { id: 'cp_09', source: 'Parceiro', partner: 'LuxTransfer PT', cat: 'Logística', name: 'Transfers VIP', desc: 'Frota premium. Motoristas NDA. Tracking real-time.', price: 800, per: '/dia', tag: '', rec: ['Networking','Summit'] }, { id: 'cp_10', source: 'Parceiro', partner: 'Spaces Lux', cat: 'Venue', name: 'Venue Executivo Premium', desc: 'Espaço até 500 pax. AV completo. Gestão de acesso.', price: 4500, per: '/dia', tag: '', rec: ['Summit','Networking'] }, { id: 'cp_11', source: 'Parceiro', partner: 'TalentOS', cat: 'Talent', name: 'Keynote Speaker C-Level', desc: 'Orador validado. Preparação conjunta. Follow-up whitepaper.', price: 1800, per: '/keynote', tag: '', rec: ['Summit','Hackathon'] }, ]; const catColor = { HaaS: 'var(--gold)', SaaS: 'var(--purple-soft)', DaaS: 'var(--success)', Serviço: 'var(--blue)', Catering: 'var(--warning)', Design: 'var(--purple-soft)', Logística: 'var(--warning)', Venue: 'var(--text-1)', Talent: 'var(--blue)' }; /* ── Products step ────────────────────────────────────────── */ const ProductsStep = ({ cart, setCart, data }) => { const [filter, setFilter] = useStateCE('Recomendados'); const [hexisNote, setHexisNote] = useStateCE(true); const recommended = CE_PRODUCTS.filter(p => p.rec?.includes(data.tipo)); const list = filter === 'Recomendados' ? recommended : filter === 'Todos' ? CE_PRODUCTS : CE_PRODUCTS.filter(p => p.source === filter || p.cat === filter); const inCart = (id) => cart.some(c => c.id === id); const toggle = (p) => { if (inCart(p.id)) setCart(prev => prev.filter(c => c.id !== p.id)); else { setCart(prev => [...prev, p]); SoundFX.tap(); if (window.HexisEngine) HexisEngine.awardXP(5, 'Produto adicionado'); } }; const total = cart.reduce((s, p) => s + p.price, 0); return (
{hexisNote && (
Hexis AI selecionou {recommended.length} produtos recomendados para o teu evento {data.tipo} · {data.setor}. Confiança de seleção ≥87%.
)}
{['Recomendados', 'Todos', 'Marcianus', 'Parceiro', 'HaaS', 'SaaS', 'Talent'].map(s => ( setFilter(s)}>{s === 'Recomendados' ? `⟡ Recomendados (${recommended.length})` : s} ))}
{list.map(p => (
toggle(p)} > {p.tag && {p.tag}}
{p.cat} {p.partner && · {p.partner}}
{p.name}
{p.desc}
€{p.price.toLocaleString('pt-PT')}{p.per} {inCart(p.id) ? '✓' : '+'}
))}
{cart.length > 0 && (
{cart.length} {cart.length === 1 ? 'item' : 'items'} selecionados
Total est.: €{total.toLocaleString('pt-PT')}
)}
); }; /* ── Step XP values ───────────────────────────────────────── */ const STEP_XP = [30, 25, 20, 35, 15]; /* ── Main step definitions ───────────────────────────────── */ const STEPS_CE = [ { id: 'tipo', title: 'Que tipo de experiência queres criar?', sub: 'O Hexis AI analisou o teu perfil e calculou a compatibilidade para cada formato.', field: 'tipo', opts: [ { v: 'Summit', l: 'Summit / Conferência', d: 'Palco principal · Painéis · 100+ participantes' }, { v: 'Workshop', l: 'Workshop / Formação', d: 'Prático · Certificado · 10–50 participantes' }, { v: 'Networking', l: 'Networking Privado', d: 'C-Level · Deal flow · 30 convidados' }, { v: 'Roadshow', l: 'Roadshow B2B', d: 'Multi-cidade · Expansão · Pipeline regional' }, { v: 'Hackathon', l: 'Hackathon / Demo Day', d: 'Inovação · Startups · Investidores' }, { v: 'Outro', l: 'Experiência customizada',d: 'Definimos juntos o formato ideal' }, ], }, { id: 'setor', title: 'Qual é o setor ou vertical do evento?', sub: 'O Hexis filtra participantes com base no teu sector de actuação e histórico.', field: 'setor', opts: [ { v: 'FinTech', l: 'FinTech', d: 'Finanças · Pagamentos · Crypto · Banking' }, { v: 'Energia', l: 'Energia & ESG', d: 'Renováveis · Sustentabilidade · Oil & Gas' }, { v: 'SaaS B2B', l: 'SaaS B2B', d: 'Software · Plataformas · Cloud' }, { v: 'AgriTech', l: 'AgriTech', d: 'Agricultura · Alimentação · Rural Tech' }, { v: 'HealthTech', l: 'HealthTech', d: 'Saúde · Biotech · MedTech' }, { v: 'Outro', l: 'Outro Setor', d: 'Retail · Media · Telecom · GovTech' }, ], }, { id: 'escala', title: 'Qual a escala esperada do evento?', sub: 'Estimativa de participantes e localização — o Hexis calcula custo operacional.', field: 'escala', opts: [ { v: 'micro', l: 'Micro (< 30)', d: 'Reunião privada · Muito selectivo' }, { v: 'pequeno', l: 'Pequeno (30–100)',d: 'Workshop · Networking focado' }, { v: 'medio', l: 'Médio (100–500)', d: 'Conferência regional · Summit' }, { v: 'grande', l: 'Grande (500+)', d: 'Summit nacional · Feira · Roadshow' }, ], }, { id: 'objetivo', title: 'Qual o objetivo principal?', sub: 'Define os KPIs que o Hexis vai usar para calibrar o algoritmo de matchmaking.', field: 'objetivo', multi: true, opts: [ { v: 'Pipeline', l: 'Gerar pipeline B2B', d: 'Leads qualificados e MatchScore™' }, { v: 'Captação', l: 'Captação de investimento', d: 'Conexão com VCs / Angels' }, { v: 'Parcerias', l: 'Parcerias estratégicas', d: 'Deal flow e integrações' }, { v: 'Branding', l: 'Branding de marca', d: 'Visibilidade e autoridade' }, { v: 'Formação', l: 'Formação corporativa', d: 'Upskilling com certificação' }, { v: 'Lançamento',l: 'Lançar produto', d: 'Go-to-market com audiência certa' }, ], }, ]; /* ── MAIN PAGE ─────────────────────────────────────────────── */ const CriarExperienciaPage = ({ onNav }) => { const auth = window.useAuth ? window.useAuth() : { user: null }; const { user } = auth; const [step, setStep] = useStateCE(0); const [data, setData] = useStateCE({ tipo: '', setor: '', escala: '', objetivo: [] }); const [submitted, setSubmitted] = useStateCE(false); const [name, setName] = useStateCE(''); const [email, setEmail] = useStateCE(''); const [msg, setMsg] = useStateCE(''); const [productCart, setProductCart] = useStateCE([]); const [profile, setProfile] = useStateCE(null); const [hexisAnalyzing, setHexisAnalyzing] = useStateCE(false); /* Sync HexisEngine profile */ useEffectCE(() => { if (window.HexisEngine) { setProfile(HexisEngine.getProfile()); return HexisEngine.subscribe(p => setProfile({ ...p })); } }, []); /* Prefill name/email if logged in */ useEffectCE(() => { if (user) { if (user.name) setName(user.name); if (user.email) setEmail(user.email); } }, [user]); const totalSteps = STEPS_CE.length + 1; /* +1 products */ const isProductsStep = step === STEPS_CE.length; const s = !isProductsStep ? STEPS_CE[step] : null; const toggle = (arr, val) => arr.includes(val) ? arr.filter(x => x !== val) : [...arr, val]; const sel = (k, v) => setData(d => ({ ...d, [k]: v })); const canNext = () => { if (isProductsStep) return true; if (s.multi) return data[s.field].length > 0; return !!data[s.field]; }; /* Smart fill — auto-select best option for current step */ const handleSmartFill = (opt) => { if (!opt || !s) return; if (s.multi) sel(s.field, data[s.field].includes(opt.v) ? data[s.field] : [...data[s.field], opt.v]); else sel(s.field, opt.v); ToastBus.push({ kind: 'gold', icon: 'zap', title: 'Smart Fill · Hexis AI', desc: `"${opt.l}" selecionado com ${Math.round(computeConfidence(s.id, opt.v, profile) * 100)}% de confiança.` }); }; const next = async () => { if (step < totalSteps - 1) { /* Award XP for completing a wizard step */ const xp = STEP_XP[step] || 20; if (window.HexisEngine) HexisEngine.awardXP(xp, `Briefing Passo ${step + 1}`); /* Simulate Hexis "thinking" on transition */ if (!isProductsStep) { setHexisAnalyzing(true); setTimeout(() => setHexisAnalyzing(false), 600); } setStep(prev => prev + 1); return; } if (!user && !email.trim()) return; if (window.HexisEngine) HexisEngine.awardXP(50, 'Briefing Completo'); setSubmitted(true); if (window.MarcianusAPI) { MarcianusAPI.track({ action: 'criar_experiencia_submit', category: 'conversion', label: data.tipo }); MarcianusAPI.createEvent({ title: `${data.tipo || 'Experiencia'} ${data.setor || 'Marcianus'}`, subtitle: `Briefing Hexis AI · ${data.objetivo.join(', ')}`, sector: data.setor || 'Multi-sector', venue_name: data.local || 'A definir', venue_city: data.local || 'Lisboa', starts_at: new Date(Date.now() + 1000 * 60 * 60 * 24 * 30).toISOString(), ends_at: new Date(Date.now() + 1000 * 60 * 60 * 24 * 31).toISOString(), max_attendees: Number((data.escala || '').match(/\d+/)?.[0] || 100), price_base: productCart.reduce((sum, p) => sum + p.price, 0), pipeline_target: 1000000, is_private: true, }); } SoundFX.success(); fireConfetti({ x: window.innerWidth / 2, y: window.innerHeight / 2 }); }; /* ── Success screen ─────────────────────────────────────── */ if (submitted) { const cartTotal = productCart.reduce((sum, p) => sum + p.price, 0); const matchEst = profile ? Math.round(82 + (profile.misScore || 0.7) * 15) : 89; return (
🚀
Briefing Recebido · Hexis Calibrado

Experiência em preparação.

O Hexis AI gerou o setup operacional para o teu {data.tipo} em {data.setor}. MatchScore estimado: {matchEst}%. Proposta em 48h.

Tipo{data.tipo}
Setor{data.setor}
Escala{data.escala}
Objetivos{data.objetivo.join(' · ')}
Match Score est.{matchEst}%
{productCart.length > 0 && (
Produtos ({productCart.length})€{cartTotal.toLocaleString('pt-PT')} est.
)} {profile && (
XP ganho+{STEP_XP.slice(0, step).reduce((a, b) => a + b, 50)} XP
)}
{/* Hexis confirmation note */}
O Hexis AI analisou {Math.floor(320 + (profile?.tapCount || 10) * 3)} eventos similares e preparou um briefing operacional personalizado. A equipa Marcianus receberá a proposta completa com setup de hardware, matchmaking e analytics.
{!user && } {user && }
); } const currentStepDef = s || null; return (
{/* Header */}
Criar Experiência · Passo {step + 1}/{totalSteps}
{hexisAnalyzing && ( ⟡ Hexis a calibrar… )}
{profile && (
+{STEP_XP[step] || 20} XP
próximo passo
)}
{/* Two-column layout: step card + Hexis panel */}
{/* ── LEFT: Step card ──────────────────────────── */}
{isProductsStep ? ( <>

Adiciona produtos e serviços

OPCIONAL

O Hexis pré-selecionou os produtos com maior impacto para o teu {data.tipo} em {data.setor}. Ajustas com a equipa Marcianus após proposta.

) : ( <>

{s.title}

{s.sub}

{s.opts.map(o => { const isSelected = s.multi ? data[s.field].includes(o.v) : data[s.field] === o.v; const conf = profile ? computeConfidence(s.id, o.v, profile) : null; const confPct = conf ? Math.round(conf * 100) : null; const isTopRec = profile && getBestOption(s.id, s.opts, profile)?.v === o.v; return (
{ SoundFX.tap(); if (s.multi) sel(s.field, toggle(data[s.field], o.v)); else sel(s.field, o.v); }} role="option" aria-selected={isSelected} tabIndex={0} onKeyDown={(e) => e.key === 'Enter' && (s.multi ? sel(s.field, toggle(data[s.field], o.v)) : sel(s.field, o.v))} > {isTopRec && !isSelected && ( ⟡ REC )}
{o.l}

{o.d}

{confPct !== null && (
{confPct}%
)}
); })}
{/* Contact fields on last wizard step (not logged in) */} {step === STEPS_CE.length - 1 && !user && (
Contacto para a proposta
setName(e.target.value)} placeholder="João Silva" />
setEmail(e.target.value)} placeholder="nome@empresa.com" />