fix(onboarding): center step connector line & refresh welcome layout (#640)

* fix(onboarding): center step connector line with circles

The connector line was vertically centered against the circle+label
column, landing below the circle's center. Absolutely position the
label below the circle so the row height equals just the circle and
items-center aligns the line to the circle's center.

* feat(onboarding): refresh welcome layout & indicator spacing

- Place logo inline to the right of the Welcome heading
- Move the tagline badge below the heading with more breathing room
- Add space between the step indicator and step content
This commit is contained in:
gagan 2026-06-24 15:35:22 +05:30 committed by GitHub
parent 7e1acedfcf
commit aa347c9047
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 17 additions and 21 deletions

View file

@ -26,7 +26,7 @@ export function StepIndicator({ currentStep, path }: StepIndicatorProps) {
const currentIndex = steps.findIndex(s => s.step === currentStep) const currentIndex = steps.findIndex(s => s.step === currentStep)
return ( return (
<div className="flex items-center gap-2 mb-8 px-4"> <div className="flex items-center gap-2 mb-14 px-4">
{steps.map((s, i) => ( {steps.map((s, i) => (
<React.Fragment key={s.step}> <React.Fragment key={s.step}>
{i > 0 && ( {i > 0 && (
@ -37,7 +37,7 @@ export function StepIndicator({ currentStep, path }: StepIndicatorProps) {
)} )}
/> />
)} )}
<div className="flex flex-col items-center gap-1.5"> <div className="relative flex flex-col items-center">
<div <div
className={cn( className={cn(
"size-8 rounded-full flex items-center justify-center text-xs font-medium transition-all duration-300", "size-8 rounded-full flex items-center justify-center text-xs font-medium transition-all duration-300",
@ -54,7 +54,7 @@ export function StepIndicator({ currentStep, path }: StepIndicatorProps) {
</div> </div>
<span <span
className={cn( className={cn(
"text-[11px] font-medium transition-colors duration-300", "absolute top-full mt-1.5 whitespace-nowrap text-[11px] font-medium transition-colors duration-300",
i <= currentIndex ? "text-foreground" : "text-muted-foreground" i <= currentIndex ? "text-foreground" : "text-muted-foreground"
)} )}
> >

View file

@ -12,15 +12,21 @@ export function WelcomeStep({ state }: WelcomeStepProps) {
return ( return (
<div className="flex flex-col items-center justify-center text-center flex-1"> <div className="flex flex-col items-center justify-center text-center flex-1">
{/* Logo with ambient glow */} {/* Logo + main heading on the same level */}
<motion.div <motion.div
initial={{ opacity: 0, scale: 0.8 }} initial={{ opacity: 0, y: 8 }}
animate={{ opacity: 1, scale: 1 }} animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.5, ease: [0.16, 1, 0.3, 1] }} transition={{ delay: 0.2 }}
className="relative mb-8" className="flex items-center gap-4 mb-4"
> >
<div className="absolute inset-0 size-16 rounded-2xl bg-primary/10 blur-xl scale-[2.5]" /> <h1 className="text-3xl font-bold tracking-tight">
<img src="/logo-only.png" alt="Rowboat" className="relative size-16" /> Welcome to Rowboat
</h1>
{/* Logo with ambient glow */}
<div className="relative shrink-0">
<div className="absolute inset-0 size-12 rounded-2xl bg-primary/10 blur-xl scale-[2.5]" />
<img src="/logo-only.png" alt="Rowboat" className="relative size-12" />
</div>
</motion.div> </motion.div>
{/* Tagline badge */} {/* Tagline badge */}
@ -28,21 +34,11 @@ export function WelcomeStep({ state }: WelcomeStepProps) {
initial={{ opacity: 0, y: 6 }} initial={{ opacity: 0, y: 6 }}
animate={{ opacity: 1, y: 0 }} animate={{ opacity: 1, y: 0 }}
transition={{ delay: 0.15 }} transition={{ delay: 0.15 }}
className="inline-flex items-center gap-2 rounded-full border bg-muted/50 px-3.5 py-1.5 text-xs font-medium text-muted-foreground mb-6" className="inline-flex items-center gap-2 rounded-full border bg-muted/50 px-3.5 py-1.5 text-xs font-medium text-muted-foreground mb-10"
> >
<span className="size-1.5 rounded-full bg-green-500 animate-pulse" /> <span className="size-1.5 rounded-full bg-green-500 animate-pulse" />
Your AI coworker, with memory Your AI coworker, with memory
</motion.div> </motion.div>
{/* Main heading */}
<motion.h1
initial={{ opacity: 0, y: 8 }}
animate={{ opacity: 1, y: 0 }}
transition={{ delay: 0.2 }}
className="text-3xl font-bold tracking-tight mb-3"
>
Welcome to Rowboat
</motion.h1>
<motion.p <motion.p
initial={{ opacity: 0 }} initial={{ opacity: 0 }}
animate={{ opacity: 1 }} animate={{ opacity: 1 }}