# Onboarding Timeline

> A onboarding timeline block.

A shadcn/ui block from the [@blocks-so](https://blocks.so) registry, listed on [shadcn.exchange](https://shadcn.exchange/r/blocks-so/onboarding-06).

- Page, with a live preview: https://shadcn.exchange/r/blocks-so/onboarding-06
- Screenshot: https://abzjhwgwpdpz7ua5.public.blob.vercel-storage.com/shots/blocks-so/onboarding-06-light-13d0890651b24460.png
- Registry item: https://blocks.so/r/onboarding-06.json
- Categories: onboarding
- Listed: 2026-10-13, source last changed 2026-10-13

## Install

```bash
npx shadcn@latest add https://blocks.so/r/onboarding-06.json
```

Run it in a project that has shadcn/ui set up. It adds the files below and installs what they depend on.

## Dependencies

- npm packages: `@tabler/icons-react`

## Files

### `content/components/onboarding/onboarding-06.tsx`

```tsx
import { IconCheck } from '@tabler/icons-react';
import { cn } from '@/lib/utils';

const steps = [
  {
    id: 1,
    type: 'done',
    title: 'Repository connected',
    description: 'Linked GitHub repository to deployment pipeline',
    activityTime: '3d ago',
  },
  {
    id: 2,
    type: 'done',
    title: 'Build configuration set',
    description: 'Configured build commands and environment variables',
    activityTime: '2d ago',
  },
  {
    id: 3,
    type: 'done',
    title: 'Domain configured',
    description: 'Custom domain verified and SSL certificate issued',
    activityTime: '31min ago',
  },
  {
    id: 4,
    type: 'in progress',
    title: 'Running health checks',
    description: 'Verifying all endpoints respond correctly',
    activityTime: 'Running now...',
  },
  {
    id: 5,
    type: 'open',
    title: 'Go live',
    description: 'Switch traffic to the new deployment',
    activityTime: 'Upcoming',
  },
];

export function Onboarding06() {
  return (
    <div className="flex min-h-dvh items-center justify-center bg-background p-4">
      <div className="sm:mx-auto sm:max-w-lg">
        <h3 className="font-medium text-foreground">Deployment progress</h3>
        <ul className="mt-6 space-y-6">
          {steps.map((step, stepIdx) => (
            <li className="relative flex gap-x-3" key={step.id}>
              <div
                className={cn(
                  'absolute top-0 left-0 flex w-6 justify-center',
                  stepIdx === steps.length - 1 ? 'h-6' : '-bottom-6'
                )}
              >
                <span aria-hidden className="w-px bg-border" />
              </div>
              <div className="flex items-start space-x-2.5">
                <div className="relative flex size-6 flex-none items-center justify-center bg-background">
                  {step.type === 'done' ? (
                    <IconCheck aria-hidden className="size-5 text-primary" />
                  ) : step.type === 'in progress' ? (
                    <div
                      aria-hidden
                      className="size-2.5 rounded-full bg-primary ring-4 ring-background"
                    />
                  ) : (
                    <div
                      aria-hidden
                      className="size-3 rounded-full border border-border bg-background ring-4 ring-background"
                    />
                  )}
                </div>
                <div>
                  <p className="mt-0.5 font-medium text-foreground text-sm">
                    {step.title}{' '}
                    <span className="font-normal text-muted-foreground/60">
                      &#8729; {step.activityTime}
                    </span>
                  </p>
                  <p className="mt-0.5 text-muted-foreground text-sm leading-6">
                    {step.description}
                  </p>
                </div>
              </div>
            </li>
          ))}
        </ul>
      </div>
    </div>
  );
}
```
