const DAYS=[['Mon',12],['Tue',13],['Wed',14],['Thu',15],['Fri',16],['Sat',17],['Sun',18]].map(([d,n],i)=>({d,n,we:i>4})); const ALL_SLOTS=(()=>{const a=[];for(let h=7;h<=19;h++){for(const m of[0,30]){if(h===7&&m===0)continue;if(h===19&&m===30){a.push('19:30');break}a.push(String(h).padStart(2,'0')+':'+(m?'30':'00'))}}return a})(); function slotsFor(clin,day){if(clin==='zuzanna'&&day<2)return[];const seed=(clin.length*7+day*13)%5;return ALL_SLOTS.filter((_,i)=>(i+seed)%3===0||(i+seed)%7===0)} const SESSION_TYPES={first:{t:'Introduction',min:()=>PD.PRICING.introMinutes,mult:0},continue:{t:'Session',min:()=>PD.PRICING.sessionMinutes,mult:1},debrief:{t:'Energy Load Index debrief',min:()=>25,mult:0.5},cofounder:{t:'Co-founder session',min:()=>PD.PRICING.coFounderMinutes,mult:PD.PRICING.coFounderMultiplier}}; const sessionLabel=k=>{const x=SESSION_TYPES[k]||SESSION_TYPES.continue;return x.t+', '+x.min()+' minutes'}; const sessionPrice=(k,c)=>{const x=SESSION_TYPES[k]||SESSION_TYPES.continue;return x.mult?PD.priceLabel(c,x.mult):'Free'}; function Booking({q}){const[s,set]=useStore();const returning=!!(s.booking||q.clin); const[step,setStep]=useState(+q.step||(q.type?3:1));const[type,setType]=useState(q.type||'first');const[clin,setClin]=useState(q.clin||(+q.step>=3?'steven':null)); const[day,setDay]=useState(q.soon?0:0);const[slot,setSlot]=useState(q.soon?'16:30':(+q.step>=3&&(!q.clin||q.clin==='steven')?'11:00':null));const[lang,setLang]=useState('English');const[phone,setPhone]=useState('+351 ');const[modal,setModal]=useState(+q.step===4);const[co2,setCo2]=useState('');const[done,setDone]=useState(false); useEffect(()=>{if(q.step)setStep(+q.step)},[q.step]); const c=clin?PD.clin(clin):null; const slots0=c?(q.soon&&day===0?['16:30','17:00',...slotsFor(clin,day).filter(x=>x>'17:00')]:slotsFor(clin,day)):[];const slots=type==='cofounder'?slots0.filter((t,i)=>i%2===0&&t<='18:00'):slots0;const coOk=type!=='cofounder'||/\S+@\S+\.\S+/.test(co2); const steps=['Choose session','Clinician','Time','Confirm']; const Crumb=()=>; const phoneOk=/^\+\d{1,3}\s?\d[\d\s]{7,}$/.test(phone.trim()); const confirm=()=>{const dd=DAYS[day];set({booking:{clin,type,date:`${dd.d} ${dd.n} Oct 2026`,time:slot,lang,co2:type==='cofounder'?co2:undefined}});setModal(false);setDone(true)}; if(done){const b=store.s.booking;return

Booked.

A confirmation is in your inbox. You will find this session under My sessions.

{SESSION_TYPES[type].t} with {c.name}

{c.bio?c.bio.split('.')[0]+'.':c.works} Read {c.id==='zuzanna'?'her':c.rep?'the':'his'} full profile.


Time and date

{b.date} at {b.time} (Europe/Lisbon), {SESSION_TYPES[type].min()} minutes

{type==='cofounder'&&b.co2&&

Invitation sent to {b.co2}

}

Language: {b.lang}

{type==='first'?'Cost to you: €0. The introduction is free.':'Your share: shown before you confirm.'}

If it does not fit, the next introduction is on us.

Need to move it? Reschedule or cancel free until 24 hours before.

Optional

Take the Energy Load Index before your first paid session.

We measure it again after your sixth. You see the change. Your investor never does.

Take the Index

Go to My sessions
} return
{step===1&&<>

What kind of session?

Not sure? Start with the first one.

{[['first','spark','First session with a psychologist','A free 15-minute introduction to check the fit.'],['cofounder','users','Co-founder session','Both co-founders with one psychologist. 80 minutes.'],...(s.booking?[['continue','redo','Continue with '+PD.clin(s.booking.clin).name,'Same person, no re-explaining.']]:[]),['debrief','gauge','Energy Load Index debrief','Twenty-five minutes to go through your result and decide what to do with it.']].map(([k,ic,t,d])=>)}

Your fund never sees that you booked.

} {step===2&&<>

Who would you like to see?

Your three matches from the intake.

{MATCHES.map(m=>{const cc=PD.clin(m.id);return
{cc.name}

{cc.city}

{m.r1}

{m.r2}

{setClin(m.id);setStep(3)}} style={{marginTop:'auto'}}>Choose {cc.name.split(' ')[0]}
})}

Browse the whole network instead

} {step===3&&c&&<>

Pick a day and a time

Times shown are your clinician's actual availability.

Mon 12 Oct, week 42
{DAYS.map((d,i)=>)}
{SESSION_TYPES[type].t+', '+SESSION_TYPES[type].min()+' min'} with {c.name}{lang}
(UTC+1:00) Lisbon
{slots.length?
{slots.map(t=>)}
:
Nothing within 24 hours with this psychologist. Two others with similar experience have an introduction slot tomorrow.
}
Session language
{['English','Português'].map(l=>{const can=c.langs.includes(l);return can?:null})}

Need another language? Tell us and we will look.

setModal(true)}>Book session
}
{modal&&

One detail before we book

A mobile number lets us send a reminder two hours before. It is used for nothing else, and it never reaches your fund.

setPhone(e.target.value)} placeholder="+351 912 345 678" autoFocus/>
{type==='cofounder'&&
setCo2(e.target.value)} placeholder="name@company.com"/>

They receive their own invitation.

}

{type==='first'?'The introduction is free.':'Price: '+sessionPrice(type,c)+'. Your share is shown before you confirm.'} If it does not fit, the next introduction is on us.

Confirm
}
} function CalMenu(){const[o,setO]=useState(false);return
{o&&
{['Google','Apple','Outlook','.ics file'].map(l=>)}
}
} Object.assign(window,{Booking,CalMenu,SESSION_TYPES,sessionLabel,sessionPrice});