// Screen 2: Participant List — 4 variations function ListScreen() { const data = [ ['AP','Aguilar, Phillip','M·47','T2021','2880','2712','168','crit', 102, 'Honolulu'], ['KM','Kahale, Mei','F·32','H2021 U4','2200','2156','44','warn', 98, 'Kailua'], ['NJ','Nakagawa, Joel','M·28','T2021','2880','2534','346','warn', 88, 'Pearl City'], ['LK','Liu, Karina','F·54','H2021 U4','1800','1368','432','soon', 76, 'Honolulu'], ['TR','Tavares, Roy','M·39','T2021','2880','1843','1037','ok', 64, 'Hilo'], ['MS','Makoa, Sela','F·22','CLS 1:1','1500','780','720','ok', 52, 'Kahului'], ['HD','Haku, Daniel','M·61','H2021','2200','902','1298','ok', 41, 'Kailua'], ['OR','Ono, Rae','F·45','T2021','2880','806','2074','ok', 28, 'Honolulu'], ]; return ( <>

② Participants list

Searchable roster. Four density/layout takes — same data, different reading speed.

{/* V1 — Classic table */}
filter ▾ columns ▾ + add }/>
{data.map(([i,n,a,svc,au,u,r,s,p])=>( ))}
NameServiceAuthUsedRemain%Status
{n}
{a}
{svc} {au} {u} {r}
familiar. low-risk. same mental model as Excel
{/* V2 — Cards with photo + meters */}
{data.slice(0,6).map(([i,n,a,svc,au,u,r,s,p])=>(
{n}
{a} · {svc}
{u}u used{r}u left
))}
warmer · gauges read instantly
{/* V3 — Split list/detail */}
⌕ search…
{data.map(([i,n,a,svc,au,u,r,s,p],idx)=>(
{n}
{svc}
))}
Aguilar, Phillip
M · 47 · Honolulu · ID 47298473
over cap
authorized
2,880u
used YTD
2,712u
remain
168u
3 services · 1 staff assigned · last visit 2 days ago
{/* V4 — Kanban by status */}
{[ ['crit','Critical',1,[data[0]]], ['warn','At-risk',2,[data[1],data[2]]], ['soon','Running low',1,[data[3]]], ['ok','Healthy',4,[data[4],data[5],data[6],data[7]]], ].map(([s,title,n,items])=>(
{title} {n}
{items.map(it=>(
{it[1]}
{it[3]}
))}
))}
great for daily triage stand-ups
); } window.ListScreen = ListScreen;