Components
Customize and extend the built-in landing page and UI components.
UI Components
Built on shadcn/ui and Radix UI primitives - accessible, customizable, and type-safe.
Available Components
ButtonPrimary, secondary, and variant buttons
DialogModal dialogs (license activation)
InputText input fields
CardContent containers with header/footer
AccordionCollapsible content (FAQ)
SonnerToast notifications
AlertNotification messages and warnings
SeparatorVisual dividers
Want to add more components?
Browse the full shadcn/ui component library and add what you need:
→ shadcn/ui Components DocumentationUsing Components
Import Pattern
import { Button } from '@/components/ui/button';
import { Dialog, DialogContent, DialogHeader } from '@/components/ui/dialog';
import { Input } from '@/components/ui/input';
import { Card } from '@/components/ui/card';
export function MyComponent() {
return (
<div>
<Button>Click me</Button>
<Input placeholder="Enter text" />
</div>
);
}Toast Notifications
import { toast } from 'sonner';
// Success
toast.success('File processed successfully!');
// Error
toast.error('Failed to process file');
// Loading
toast.loading('Processing...');Customization Methods
Method 1: Tailwind Classes (Recommended)
<Button className="bg-blue-500 hover:bg-blue-600">
Custom Button
</Button>Method 2: Variants
<Button variant="destructive">Delete</Button>
<Button variant="outline">Cancel</Button>
<Button variant="ghost">Subtle Action</Button>Method 3: Modify Component Files
Edit files in components/ui/ to change default styles.
Landing Page Components
Six modular components in components/landing/:
Herocomponents/landing/Hero.tsxMain headline and CTA
Customize: title, subtitle, CTA text and action
Featurescomponents/landing/Features.tsxProduct features grid
Customize: feature items, icons, descriptions
Pricingcomponents/landing/Pricing.tsxPricing cards with CTA
Customize: price display, features list, CTA behavior
FAQcomponents/landing/FAQ.tsxFrequently asked questions
Customize: questions and answers (accordion items)
CTAcomponents/landing/CTA.tsxFinal call-to-action
Customize: title, subtitle, CTA text, show/hide price
Footercomponents/landing/Footer.tsxSite footer with links
Customize: social links, additional links
app/home-client.tsx to modify props and layoutCommon Patterns
Loading States
import { Loader2 } from 'lucide-react';
<Button disabled={isLoading}>
{isLoading && <Loader2 className="mr-2 h-4 w-4 animate-spin" />}
{isLoading ? 'Processing...' : 'Process File'}
</Button>Error States
import { Alert, AlertDescription } from '@/components/ui/alert';
{error && (
<Alert variant="destructive">
<AlertDescription>{error}</AlertDescription>
</Alert>
)}Empty States
{items.length === 0 ? (
<div className="text-center py-12 text-gray-500">
<p>No items yet</p>
<Button onClick={addItem}>Add First Item</Button>
</div>
) : (
<ItemList items={items} />
)}Accessibility
All components are built on Radix UI primitives, which are accessible by default with keyboard navigation, screen reader support, and ARIA attributes.
<Button aria-label="Close dialog" onClick={handleClose}>
<X className="h-4 w-4" />
</Button><button onClick={handleClose}>
<X className="h-4 w-4" />
</button>