JDS.

Search docs

Find a page or component

Styling

CSS variables for color, radius and motion, exposed as Tailwind utilities. Neutral by default, so your brand sets the color.

Overview

Tokens follow the shadcn convention: a surface variable and a matching -foreground, defined on :root for light and .dark for dark, then mapped to Tailwind in @theme inline. The palette is pure grayscale, with color reserved for status.

Colors

light
Surface
background
card
popover
muted
accent
secondary
Content
foreground
muted-foreground
primary
border
input
ring
Signal
success
warning
info
destructive
dark
Surface
background
card
popover
muted
accent
secondary
Content
foreground
muted-foreground
primary
border
input
ring
Signal
success
warning
info
destructive

Primary color

Neutral is the default: no brand color, and agent activity reads through motion and contrast. To add one, pick a preset. It only sets --primary, --primary-foreground and --ring, so buttons, focus rings and the Voice Orb follow it. Try them in Customize, the color dot in the header.

pnpm dlx shadcn@latest add @jds/color-blue

Presets: color-blue, color-violet, color-rose, color-emerald, color-amber. For any other color, set the three variables yourself in both themes.

Base color

Tints the whole gray scale while keeping every lightness step, so contrast doesn't change. Stone is warm, Zinc is cool, Slate leans blue. Install a base before a primary color preset, so the preset's --primary wins.

pnpm dlx shadcn@latest add @jds/base-stone

Status

success, warning, info and destructive each have a -foreground variant tuned for text on the page background.

Dark mode

Dark is the default and uses the .dark class on html. Borders and inputs are translucent foreground (9% and 13%) so they stay visible on any surface. A .light class scopes the light theme inside a dark page, which is how the palettes above render side by side.

app/globals.css
:root,
.light {
  --background: oklch(0.985 0 0);
  --foreground: oklch(0.145 0 0);
  --ring: oklch(0.6 0 0);
  /* … */
}

.dark {
  --background: oklch(0.185 0 0);
  --foreground: oklch(0.94 0 0);
  --border: oklch(1 0 0 / 9%);
  --ring: oklch(0.55 0 0);
  /* … */
}

Font

Components read --font-sans, so changing the font is one variable. This site offers Geist (the default), Inter and the system font in Customize. See Get Started for wiring a font with next/font.

Radius

One base value, --radius: 0.625rem. The rounded-sm to rounded-4xl scale derives from it, so changing it reshapes everything consistently. Try values from square (0) to soft (1rem) in Customize.

Customizing

Change the variables, not the components. To brand it, set --primary and --ring, or tint the neutrals by giving them a small chroma. To add a color, declare --name in both themes and --color-name in @theme inline.