Components

August 3, 2026 · View on GitHub

UI components organized by purpose.

components/
├── ui/        → Primitives (reusable across projects)
├── layout/    → Site chrome (customize per project)
└── effects/   → Animation & visual enhancements
// UI Components - import directly for better clarity
import { Image } from '@/components/ui/image'
import { Link } from '@/components/ui/link'
import { Menu } from '@/components/ui/menu'
import { Select } from '@/components/ui/select'
import { Tabs } from '@/components/ui/tabs'
import { Toast } from '@/components/ui/toast'
import { Marquee } from '@/components/ui/marquee'

// Layout Components
import { Wrapper } from '@/components/layout/wrapper'
import { Header } from '@/components/layout/header'
import { Footer } from '@/components/layout/footer'

// Effects Components (GSAPRuntime is auto-loaded via OptionalFeatures - do not import manually)

Component Inventory

For the full, always-current component / hook / utility inventory, see COMPONENTS.md, generated by bun run generate:manifest.

UI Components

Built on Base UI for accessibility.

ComponentPurpose
image/Optimized images (always use this, never next/image)
link/Smart navigation (auto-detects external)
form/Form components with validation
select/Custom dropdowns (accessible, Base UI)
menu/Dropdown menus
accordion/Expandable sections
tabs/Tab navigation
tooltip/Hover hints
alert-dialog/Confirmation dialogs
toast/Notifications
checkbox/Checkboxes
switch/Toggle switches
fold/Scroll-based folding
scrollbar/Custom scrollbars
real-viewport/Sets the --scrollbar-width CSS property
marquee/Infinite scrolling text
sanity-image/Sanity-optimized image component
not-configured/Placeholder for unconfigured integrations

Layout Components

ComponentPurpose
wrapper/Page wrapper (theme, WebGL, Lenis)
header/Site header/navigation
footer/Site footer
lenis/Smooth scrolling
<Wrapper theme="dark" webgl lenis>
  <section>Your content</section>
</Wrapper>

Effects Components

GSAPRuntime is automatically loaded via OptionalFeatures in the root layout - do not import it manually.

ComponentPurpose
gsap/GSAP + Tempus integration (auto-loaded)
progress-text/Scroll-based text reveal

Best Practices

// ✅ Always use custom Image
import { Image } from '@/components/ui/image'
<Image src="/photo.jpg" alt="Photo" aspectRatio={16/9} mobileSize="100vw" desktopSize="50vw" />

// ✅ Always use custom Link
import { Link } from '@/components/ui/link'
<Link href="/about">Internal</Link>
<Link href="https://example.com">External</Link>

// ✅ CSS Modules + Tailwind
import s from './component.module.css'
<div className={cn(s.wrapper, 'flex items-center')} />