@switch (tab()) { @case ('Checklist') {
{{ doneCount() }} of {{ steps.length }} done · about {{ minutesLeft() }} minutes left
    @for (step of steps; track step.id) {
  1. }
} @case ('Guides') { Each guide belongs to a screen and opens from it. They are kept short on purpose — the gotcha at the end is the part people actually need.
    @for (guide of guides; track guide.id) {
  • @if (openGuideId() === guide.id) {

    {{ guide.body }}

    Where people trip up {{ guide.gotcha }}
    }
  • }
} @case ('Videos') {
@for (name of topics; track name) { }
@if (videos().length > 0) {
    @for (video of videos(); track video.id) {
  • }
} @else { No demo for this topic yet. } } @case ('Go-live') { @if (canGoLive()) { Every blocking gate has passed. {{ waived().length }} gate(s) were waived — a waiver is a dated promise, not a pass, and each one still has to close. } @else { Not ready: {{ blockers().length }} blocking gate(s) have not passed. A launch gate anyone can wave through is not a gate. }
    @for (gate of gates; track gate.id) {
  • }
} } @switch (tab()) { @case ('Checklist') { @if (selectedStep(); as step) {

{{ step.title }}

{{ step.why }}

Step
@if (blockedBy().length > 0) {
Finish these first @for (blocker of blockedBy(); track blocker.id) { }

You can still open the screen — this is guidance, not a lock.

} } @else { Select a step. } } @case ('Guides') {

Guides

Short, screen-specific explanations. Open one to read it, then jump straight to the screen it covers.

Available @for (guide of guides; track guide.id) { }
} @case ('Go-live') { @if (selectedGate(); as gate) {

{{ gate.name }}

{{ gate.category }} · {{ gateStatusLabels[gate.status] }}

Sign-off
What closes it

{{ gate.evidence }}

@if (gate.waiverReason) {
Waiver {{ gate.waiverReason }}
}
Launch status
} @else { Select a gate. } } @case ('Videos') {

Video library

{{ watchedCount() }} watched. Every demo links to the screen it covers.

@if (nextVideo(); as next) {
Up next
} @else { You have watched every demo. } } }