scalesite/components/marketing/testimonial-card.tsx
bast1qn 98552163a8 Initial ScaleSite Next.js implementation
Complete frontend implementation with:
- Next.js 16 with App Router and TypeScript
- Tailwind CSS v4 with custom violet theme
- shadcn/ui components with Lucide React icons
- Landing page with hero, services, pricing, testimonials, FAQ
- Service selection page with toggle
- Login/Register pages with social auth UI
- Multi-step checkout flow
- Client dashboard with stats, projects, support tickets
- Billing page with subscription, payment methods, invoices
- All mock data and TypeScript types

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-01 21:42:48 +01:00

52 lines
1.6 KiB
TypeScript

import { Star } from 'lucide-react'
import { Card, CardContent } from '@/components/ui/card'
import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'
interface TestimonialCardProps {
name: string
role: string
company: string
avatar: string
rating: number
quote: string
}
export function TestimonialCard({ name, role, company, avatar, rating, quote }: TestimonialCardProps) {
return (
<Card className="bg-card border-border rounded-xl">
<CardContent className="p-6">
<div className="flex flex-col gap-4">
{/* Rating stars */}
<div className="flex gap-1">
{Array.from({ length: 5 }).map((_, i) => (
<Star
key={i}
className={`w-4 h-4 ${
i < rating ? 'fill-primary text-primary' : 'fill-muted text-muted-foreground'
}`}
/>
))}
</div>
{/* Quote */}
<p className="text-muted-foreground text-sm leading-relaxed">&ldquo;{quote}&rdquo;</p>
{/* Author */}
<div className="flex items-center gap-3 pt-2">
<Avatar className="w-10 h-10">
<AvatarImage src={avatar} alt={name} />
<AvatarFallback>{name.charAt(0)}</AvatarFallback>
</Avatar>
<div className="flex flex-col">
<p className="text-foreground font-semibold text-sm">{name}</p>
<p className="text-muted-foreground text-xs">
{role}, {company}
</p>
</div>
</div>
</div>
</CardContent>
</Card>
)
}