CoreMVP
Customization

Components

UI component library and usage.

Overview

The template includes components from multiple sources:

SourcePurpose
Custom componentsLanding page, headers, etc.
shadcn/uiForm inputs, buttons, cards
Fumadocs UIDocumentation components

Component Locations

src/components/
├── ui/                    # shadcn/ui components
│   ├── button.tsx
│   ├── input.tsx
│   └── card.tsx
├── landing/               # Landing page sections
├── dashboard/             # Dashboard components
├── pricing/               # Pricing components
└── paywall.tsx            # Gated content

Adding shadcn/ui Components

Use the CLI to add components:

bunx shadcn@latest add dialog
bunx shadcn@latest add dropdown-menu
bunx shadcn@latest add toast

Common Components

Button

import { Button } from '@/components/ui/button';

<Button variant="default">Primary</Button>
<Button variant="secondary">Secondary</Button>
<Button variant="outline">Outline</Button>
<Button variant="ghost">Ghost</Button>
<Button variant="destructive">Destructive</Button>

Input

import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';

<div>
  <Label htmlFor="email">Email</Label>
  <Input id="email" type="email" placeholder="you@example.com" />
</div>

Card

import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/card';

<Card>
  <CardHeader>
    <CardTitle>Card Title</CardTitle>
  </CardHeader>
  <CardContent>
    Card content goes here.
  </CardContent>
</Card>

Landing Page Components

Hero Section

import { HeroSection } from '@/components/hero-section';

<HeroSection
  title="Your SaaS Product"
  subtitle="Brief description of what you offer"
  ctaText="Get Started"
  ctaHref="/signup"
/>

Pricing Cards

import { PricingSection } from '@/components/pricing';

<PricingSection products={stripeProducts} />

Creating Custom Components

Follow the project conventions:

src/components/feature-card.tsx
interface FeatureCardProps {
  title: string;
  description: string;
  icon: React.ReactNode;
}

export function FeatureCard({ title, description, icon }: FeatureCardProps) {
  return (
    <div className="p-6 border rounded-lg">
      <div className="mb-4">{icon}</div>
      <h3 className="text-lg font-semibold">{title}</h3>
      <p className="text-muted-foreground">{description}</p>
    </div>
  );
}

Icons

Use Lucide icons:

import { Check, X, ArrowRight } from 'lucide-react';

<Check className="h-4 w-4" />
<X className="h-4 w-4 text-destructive" />
<ArrowRight className="h-4 w-4" />

Was this page helpful?

On this page