Checklist UI
Build a custom checklist component styled to your app's design system.
By default, sunboard init wires the built-in <Sunboard.Checklist /> — a
generic floating widget. /sunboard.checklist-ui replaces it with a custom
component that matches your app's design system and mounts it in the runtime
wrapper. The useChecklist() hook owns the data; the skill owns the visual layer.
When to use it
- The default floating widget doesn't match your look, or you want the checklist somewhere specific — a sidebar panel, a home-page card, a nav dropdown.
What happens
- Inventories your design system — Tailwind, shadcn, MUI, CSS modules, your icon library, and how dark mode works.
- Writes a component at
app/components/sunboard/onboarding-checklist.tsx(orsrc/...for Vite) that renders fromuseChecklist()and reuses your own primitives. - Handles the completion screen when the spec defines one.
- Mounts it in
sunboard-provider.tsx, replacing<Sunboard.Checklist />(tours and hotspots stay as they are). - Asks where it should live, then previews it against your real app.
The hook contract
Everything you render comes from useChecklist() — copy is already
token-interpolated, so you never re-interpolate:
const {
visible, // render nothing when false
title, // user-facing heading (pre-interpolated)
subtitle, // optional eyebrow
steps, // ChecklistViewStep[]
progress, // 0..100
isCompleted, // (key) => boolean
startStep, // (step) => void — handles navigation + tour launch
completion, // success-screen content, when present
dismissCompletion // () => void
} = useChecklist();Don't reach past the hook
If you find yourself reading step.action.type or step.route, stop — call
startStep(step) and let the runtime decide what to do. The hook's field names
are a stable, append-only contract. For imperative work like track(), use
useSunboard() separately.