root = Card([header, missingCallout, blockedCallout, roster, postSection], "card", "column", "l")
header = CardHeader("Team Async Standup", "Tuesday, June 10, 2025 · 8:00 AM")
missingCallout = Callout("info", "2 updates still missing", "Alex and Sam haven't posted today. You can nudge them after you post.")
blockedCallout = Callout("warning", "2 people blocked", "Priya is waiting on API credentials from DevOps. Marcus is hitting CI runner timeouts on large builds.")
roster = ListBlock([teamPriya, teamMarcus, teamLena, teamDavid, teamAlex, teamSam], "image")
teamPriya = ListItem("Priya Sharma", "🚧 Blocked: Waiting on API credentials for the auth flow. Shipped the dashboard filter yesterday.", avatarPriya)
avatarPriya = ["https://picsum.photos/seed/priya/80/80"]
teamMarcus = ListItem("Marcus Chen", "🚧 Blocked: CI runner keeps timing out on large builds. Got the test suite to 92% green.", avatarMarcus)
avatarMarcus = ["https://picsum.photos/seed/marcus/80/80"]
teamLena = ListItem("Lena Fischer", "Drafted the Q3 roadmap; waiting on design review before sharing.", avatarLena)
avatarLena = ["https://picsum.photos/seed/lena/80/80"]
teamDavid = ListItem("David Okafor", "Polished onboarding docs and opened PR #142 for review.", avatarDavid)
avatarDavid = ["https://picsum.photos/seed/david/80/80"]
teamAlex = ListItem("Alex Rivera", "No update yet.", avatarAlex)
avatarAlex = ["https://picsum.photos/seed/alex/80/80"]
teamSam = ListItem("Sam Johnson", "No update yet.", avatarSam)
avatarSam = ["https://picsum.photos/seed/sam/80/80"]
postSection = Card([postHeading, postForm], "sunk", "column", "m")
postHeading = Heading("Post your update", "h3")
postForm = Form("standup-post", postButtons, [updateField, blockedField])
updateField = FormControl("What did you work on today?", updateInput, "Mention anything you need help with.")
updateInput = Input("update", "e.g. Shipped export button, reviewed PRs...", "text")
blockedField = FormControl("Blocked?", blockedSwitch)
blockedSwitch = SwitchGroup("blocked", [blockedItem])
blockedItem = SwitchItem("Mark as blocked", "Surface this in the blocked callout", "blocked_flag")
postButtons = Buttons([postBtn])
postBtn = Button("Post update", null, "primary")