root = Card([header, missingAlert, blockedCallout, updatesSection, divider, postSection], "clear", "column", "l")
header = CardHeader("Async Standup", "Thursday, June 18, 2026")
missingAlert = Alert("Missing updates", "3 of 8 teammates haven't posted yet.", "warning")
blockedCallout = Callout("warning", "Blocked", "Maya is waiting on design approval for the billing flow; no ETA yet.")
updatesSection = Card([updatesHeading, updatesList], "sunk", "column", "m")
updatesHeading = Heading("Today's updates", "h3")
updatesList = ListBlock([updateOne, updateTwo, updateThree, updateFour, updateFive], "number")
updateOne = ListItem("Priya", "Shipped dashboard filters; reviewing API docs this afternoon.")
updateTwo = ListItem("Marcus", "Pairing with Alex on the auth refactor; should land EOD.")
updateThree = ListItem("Maya", "Blocked — waiting on design review for the billing flow.")
updateFour = ListItem("Sofia", "Drafting the Q3 roadmap doc; comments welcome.")
updateFive = ListItem("Dmitri", "Fixed the flaky e2e tests; 47 passing locally.")
divider = Separator()
postSection = Card([postHeading, postForm], "sunk", "column", "m")
postHeading = Heading("Post your update", "h3")
postForm = Form("standup-update", postButtons, [nameField, statusField, blockerField])
nameField = FormControl("Name", nameInput)
nameInput = Input("name", "Your name")
statusField = FormControl("Today's update", statusArea, "What did you work on, and what's next?")
statusArea = TextArea("status", "Summarize your update…", 3)
blockerField = FormControl("Any blockers?", blockerRadio)
blockerRadio = RadioGroup("blocker", [blockerNone, blockerYes], "none")
blockerNone = RadioItem("No blockers", "All clear", "none")
blockerYes = RadioItem("I'm blocked", "I'll post details in the thread", "blocked")
postButtons = Buttons([submitBtn])
submitBtn = Button("Post update", null, "primary")