Codapult
FeaturesPricingAPIHelpChangelog
Codapult

Ship Your SaaS Faster

Product

  • Features
  • Pricing
  • Plugins
  • API Reference
  • Help Center
  • Feature Requests
  • Changelog

Company

  • Contact
  • GitHub

Legal

  • Privacy Policy
  • Terms of Service

© 2026 Codapult. All rights reserved.

All articles

Getting Started

  • Introduction
  • Quick Start
  • Project Structure

Configuration

  • Environment Variables
  • App Configuration

Authentication

  • Authentication

Database

  • Database

Teams

  • Teams & Organizations

Payments

  • Payments & Billing

Api

  • API Layer

Ai

  • AI Features

Email

  • Email

Infrastructure

  • Infrastructure

Ui

  • UI & Theming

I18n

  • Internationalization

Content Management

  • Content Management

Admin

  • Admin Panel

Security

  • Security

Monitoring

  • Analytics & Monitoring

Modules

  • Module Architecture

Plugins

  • Plugin System

Deployment

  • Deployment
  • Troubleshooting

Upgrading

  • Upgrading Codapult

Developer Tools

  • MCP Server
  • Testing
Ui

UI & Theming

Customize colors, fonts, dark mode, branding, and landing page sections.

Codapult's UI is built on Tailwind CSS v4, shadcn/ui (New York style), and Radix UI primitives. All theming is driven by CSS custom properties in OKLCH color space, making it easy to customize the entire look from a single file.

Color System

Theme colors are defined as CSS custom properties in src/app/globals.css using OKLCH — a perceptually uniform color space that produces more consistent palettes than HSL.

Changing Your Brand Color

Edit the --primary variable in both :root (light) and .dark (dark) sections:

:root {
  --primary: oklch(0.546 0.24 280); /* iris — default */
  --primary-foreground: oklch(0.985 0 0);
  /* ... */
}

.dark {
  --primary: oklch(0.623 0.21 280);
  --primary-foreground: oklch(0.985 0 0);
  /* ... */
}

To switch to a green brand, for example:

:root {
  --primary: oklch(0.55 0.2 145);
  --ring: oklch(0.55 0.2 145);
}

.dark {
  --primary: oklch(0.65 0.18 145);
  --ring: oklch(0.65 0.18 145);
}

Tip: Keep --ring in sync with --primary so focus rings match your brand.

Available Tokens

TokenPurpose
--background / --foregroundPage background and text
--primary / --primary-foregroundBrand color and text on brand
--secondary / --secondary-foregroundSecondary surfaces
--muted / --muted-foregroundMuted backgrounds and subdued text
--accent / --accent-foregroundAccent highlights
--destructiveError / danger actions
--border / --input / --ringBorders, inputs, focus rings
--card / --popoverCard and popover surfaces
--sidebar-*Sidebar-specific overrides
--chart-1 through --chart-5Chart and data visualization colors

Tailwind Integration

Tailwind v4 maps CSS variables to utility classes via the @theme inline directive — no tailwind.config file needed:

@theme inline {
  --color-primary: var(--primary);
  --color-primary-foreground: var(--primary-foreground);
  --font-sans: var(--font-geist-sans);
  --font-mono: var(--font-geist-mono);
  /* ... */
}

Use standard Tailwind classes like bg-primary, text-muted-foreground, border-border in your components.


Fonts

Default fonts are Geist Sans and Geist Mono, loaded via next/font/google in src/app/layout.tsx.

To replace them:

import { Inter, JetBrains_Mono } from 'next/font/google';

const sans = Inter({ subsets: ['latin'], variable: '--font-geist-sans' });
const mono = JetBrains_Mono({ subsets: ['latin'], variable: '--font-geist-mono' });

The CSS variable names (--font-geist-sans, --font-geist-mono) are referenced by the @theme inline block, so Tailwind classes like font-sans and font-mono update automatically.


Dark Mode

Dark mode uses next-themes with the .dark CSS class strategy.

  • ThemeToggle component in the dashboard and marketing pages lets users switch between light, dark, and system.
  • Color tokens in .dark { ... } override the :root values automatically.
  • All shadcn/ui and Radix UI components respect dark mode out of the box.

Icons

Codapult uses lucide-react for all icons:

import { Settings, Bell, ChevronRight } from 'lucide-react';

<Settings className="h-4 w-4" />;

The cn() Utility

The cn() helper from @/lib/utils combines clsx (conditional classes) and tailwind-merge (deduplication):

import { cn } from '@/lib/utils';

<div className={cn(
  'rounded-lg border p-4',
  isActive && 'border-primary bg-primary/10',
  className,
)} />

Always use cn() when merging Tailwind classes to avoid conflicting utilities.


White-Label Branding

The BrandingProvider component enables per-organization color overrides. Organizations can customize:

  • Primary color — brand color used throughout the dashboard
  • Sidebar color — sidebar background and highlights
  • Accent color — secondary accent for buttons and links

These overrides are stored in the database and injected as CSS variables at runtime, so each organization sees their own branding without a rebuild.


Design Tokens API

Export your theme tokens programmatically via GET /api/design-tokens:

FormatURLDescription
JSON/api/design-tokens?format=jsonToken name/value pairs
CSS/api/design-tokens?format=cssCSS custom properties block
Tailwind/api/design-tokens?format=tailwindTailwind theme config object
Style Dictionary/api/design-tokens?format=style-dictionaryStyle Dictionary compatible format

Token definitions live in src/lib/design-tokens/.


Landing Page

Marketing page sections are modular components in src/components/marketing/:

ComponentDescription
HeroAbove-the-fold headline with CTA
HowItWorksStep-by-step feature walkthrough
PricingInteractive pricing cards with toggle
FAQAccordion-style frequently asked questions
VideoEmbedProduct demo video embed
TestimonialsCustomer quotes carousel

Customizing Sections

Enable, disable, or reorder sections in src/app/(marketing)/page.tsx:

export default function LandingPage() {
  return (
    <>
      <Hero />
      <HowItWorks />
      <Pricing />
      <FAQ />
    </>
  );
}

Marketing content — pricing tiers, testimonials, stats, and feature lists — is configured in src/config/marketing.ts. Edit that file to update copy without touching components.


UI Components

All base UI components live in src/components/ui/ and follow the shadcn/ui conventions (New York style). They are built on Radix UI primitives for accessibility and composability.

To add a new shadcn/ui component:

npx shadcn@latest add dialog
InfrastructureInternationalization