// 02 Onboarding Questionnaire — guided flow with section progress + 4 question types const OnboardingTab = () => (
{/* Flow overview */} {[ ['1','Identity','#dceaff', 70], ['2','Knowledge','#fde2cf', 95], ['3','Project','#d8efe2', 85], ['4','Challenges','#fcdcdc', 70], ['5','Bottlenecks','#e3e3e3', 60], ['6','Uncertainty','#fbeec1', 50], ['7','Evidence','#f0e0ee', 40], ['✓','Review','#fff7cc', 0], ].map(([n,t,bg,m], i) => ( {n} {t} {m > 0 && } {m > 0 ? m+'% complete' : 'auto'} {i < 7 && } ))}
Save anytime. · Skippable except Identity Q1–Q4 · Returnable from dashboard · Each answer shows what it produces in the database
{/* 4 question types showcased */}
My primary professional role is…
Pick one — this is the strongest first identity filter.
{['Professor / Lector','Lecturer / Educator','Researcher','Lecturer-researcher','Project / Programme mgr','Network coordinator','Policy / Public sector','Industry professional','Student / Early career','Other'].map((r,i) => (
{r}
{i===2 &&
}
))}
Why this matters → feeds role-based filtering & first-layer clustering.
Knowledge domains (up to 5)
{['Hydrogen production','Storage & transport','Conversion','Safety','Materials','Sensors','Digital twins / AI','Data engineering','Circularity','Policy','Business models','Education','Orchestration'].map((d,i) => ( {d}{i<3 && ' ✓'} ))}
Subdomains under Hydrogen production
search
{['Alkaline electrolysis','PEM ✓','SOEC ✓','Catalyst design ✓','Membrane durability','Materials char.','Pilot operation'].map((s,i)=>( {s} ))}
Why this matters → nested taxonomy creates the fingerprint vector — driver of cosine similarity.
Allocate 100 points
Drag the chips, or type a number. Total must be 100.
{[['PEM electrolysis',40,'#1c5fbf'],['Catalyst design',25,'#1c5fbf'],['Membrane durability',20,'#1c5fbf'],['SOEC',10,'#1c5fbf'],['Materials char.',5,'#1c5fbf']].map(([n,v,c]) => (
{n}
{v}
{v}
))}
Total100 / 100
Your weighted “fingerprint” → vector for similarity matching. Same logic as HvA Fingerprint, but stronger.
Describe the challenge in one line
e.g. “Membrane degradation under variable load.”
What layer is it?
{['Technical','Educational','Organizational','Policy','Cross-disciplinary'].map((l,i) => ( {l} ))}
How shared is this challenge?
Likely also faced by others in the ecosystem
{[1,2,3,4,5].map(n => (
{n}
))}
1 unique → 5 widely shared
What resource is missing? (creates a Need)
{['Data','Method','Equipment','Partner','Funding','Evidence','Workforce'].map(t => + {t})}
“Missing resource” → automatically becomes a Need; matched against others’ Offers.
{/* Review screen */}
{[ ['ORCID','0000-0002-9876-5432','#dceaff'], ['Google Scholar','scholar.google.com/citations?...','#fde2cf'], ['Institutional','research.hva.nl/persons/...','#d8efe2'], ['LinkedIn','linkedin.com/in/...','#dceaff'], ['Website','sara.example.org','#fff7cc'], ].map(([l,v,bg]) => (
{l}
{v}
))}
Representative outputs (≤ 3)
{[1,2,3].map(i => (
+ paste DOI / link
))}
Review your profile
Edit any section before we build the database from your answers.
{[ ['Identity','Lecturer-researcher · Univ. of Applied Sciences · NL','complete'], ['Knowledge','3 domains · 5 subdomains · 100 pts allocated','complete'], ['Project','Lead, “GreenH2-PEM Pilot” · TRL 5','complete'], ['Challenges','Membrane degradation · cross-disciplinary','complete'], ['Bottlenecks','External · severity 4/5','complete'], ['Uncertainty','Long-term durability data','complete'], ['Evidence','ORCID + 2 papers','partial'], ].map(([s,sum,st]) => (
{s}
{sum}
{st} Edit
))}
On submit → answers are normalized into entities, signals are computed, and the matching engine runs (≈ 4–8 sec).
Build my profile & find matchesSave draft
{/* Processing screen */}
62%
Building your profile…
✓ Normalizing answers → entities
✓ Tagging subdomains via taxonomy
↻ Computing fingerprint vector
○ Comparing with 248 profiles
○ Generating relationship edges
○ Drafting your “Why this match” explanations
Step 5/7 · Bottlenecks
What blocks your work most?
{['Funding cycles','Lack of partners','Missing data / evidence','Skills gap','Regulatory','Time / capacity'].map((b,i)=>(
{b}
))}
Severity
{[1,2,3,4,5].map(n=>(
{n}
))}
BackNext
5 of 7 · Saved
Inline validation
Errors next to field. Never block on optional fields.
Total must be 100. You allocated 92.
Autosave
Every change persists. Toast: “Saved · 2s ago”.
Saved · 2s agoResume from anywhere
Skip / come back
All non-Identity sections skippable; dashboard nudges to complete (with weight on matching power).
); const QuestionnaireShell = ({step, section, subtitle, children}) => (
{step} · {section}
{subtitle}
Saved · 2s ago
{children}
); const ProgressFooter = ({cur, max, section, final=false}) => (
Question {cur} / {max} · {section}
Back {final ? 'Continue → Review' : 'Next →'}
); window.OnboardingTab = OnboardingTab;