Palette
Cleanslate theme
A cool blue-white slate with an indigo accent — the plainest of the lot, and the easiest to build on.
background
card
primary
chart-2
success
danger
Install
The file lands as app/vibra-cleanslate.css. Import it after your globals and set data-preset="cleanslate" on <html>, or on any wrapper.
$
npx shadcn@latest add @vibra/theme-cleanslateNeeds the @vibra registry in your components.json — set it up once.
The stylesheet
/* Cleanslate — a cool blue-white slate with an indigo accent, the plainest of the lot.
*
* After tweakcn's palette (https://www.shadcnblocks.com/theme/cleanslate), mapped onto every token
* vibra.css defines and held to Vibra's contrast floors: where a value moved,
* it moved the least it could — a fill that was too light to read as a word
* is the same hue, deeper. The typefaces the original names are not carried;
* a preset is colour, radius and elevation, and the face is the page's own.
*
* Generated by scripts/build-presets.ts. Edit scripts/presets/sources, not this file. */
[data-preset="cleanslate"] {
--radius: 0.5rem;
/* Planes. */
--background: oklch(0.98 0 247.9);
--surface: oklch(0.99 0 247.9);
--card: oklch(1 0 0);
--popover: oklch(1 0 0);
--muted: oklch(0.97 0 264.5);
--secondary: oklch(0.93 0.01 264.5);
--accent: oklch(0.93 0.03 272.8);
/* Ink. --faint-foreground is for eyebrows, meta and axis titles at 11px/600 and up — never body copy. */
--foreground: oklch(0.28 0.04 260);
--card-foreground: var(--foreground);
--popover-foreground: var(--foreground);
--muted-foreground: oklch(0.51 0.02 264.4);
--faint-foreground: oklch(0.51 0.02 264.4);
--secondary-foreground: var(--foreground);
--accent-foreground: var(--foreground);
/* The accent, and the aliases that carry it. */
--brand: oklch(0.5 0.2 277.1);
--brand-foreground: oklch(1 0 0);
--brand-muted: oklch(0.93 0.045 277.1);
--primary: var(--brand);
--primary-foreground: var(--brand-foreground);
--ring: var(--brand);
/* Lines. --input is the field boundary, so it carries 3:1 against the page and a card. */
--border: oklch(0.87 0.01 258.3);
--rule: oklch(0.76 0.01 258.3);
--input: oklch(0.65 0.01 258.3);
--chart-grid: oklch(0.87 0.01 258.3);
/* Semantic tones on opaque tints. */
--success: oklch(0.5 0.14 150);
--success-foreground: oklch(0.99 0.003 150);
--success-muted: oklch(0.95 0.04 150);
--warning: oklch(0.5 0.11 75);
--warning-foreground: oklch(0.99 0.003 75);
--warning-muted: oklch(0.95 0.04 75);
--danger: oklch(0.5 0.2 25.3);
--danger-foreground: oklch(0.99 0.003 25.3);
--danger-muted: oklch(0.95 0.04 25.3);
--info: oklch(0.5 0.14 250);
--info-foreground: oklch(0.99 0.003 250);
--info-muted: oklch(0.95 0.04 250);
--destructive: var(--danger);
/* Chart palette: the accent first when it is a colour, then the source's hues, then three of Vibra's own. */
--chart-1: var(--brand);
--chart-2: oklch(0.53 0.23 277);
--chart-3: oklch(0.46 0.21 277);
--chart-4: oklch(0.4 0.18 277.4);
--chart-5: oklch(0.36 0.14 278.7);
--chart-6: oklch(0.55 0.12 37.1);
--chart-7: oklch(0.56 0.14 157.1);
--chart-8: oklch(0.5 0.02 247.9);
--chart-positive: var(--success);
--chart-negative: var(--danger);
--chart-neutral: var(--muted-foreground);
--chart-axis: var(--muted-foreground);
/* The sidebar sits one plane below the content it frames. */
--sidebar: oklch(0.97 0 264.5);
--sidebar-foreground: var(--foreground);
--sidebar-primary: var(--brand);
--sidebar-primary-foreground: var(--brand-foreground);
--sidebar-accent: oklch(0.93 0.03 272.8);
--sidebar-accent-foreground: var(--foreground);
--sidebar-border: oklch(0.87 0.01 258.3);
--sidebar-ring: var(--brand);
/* Elevation. */
--shadow-sheet: 0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 1px 2px -2px hsl(0 0% 0% / 0.10);
--shadow-float: 0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 4px 6px -2px hsl(0 0% 0% / 0.10);
--shadow-modal: 0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 8px 10px -2px hsl(0 0% 0% / 0.10);
--overlay: oklch(0 0 0 / 40%);
}
.dark [data-preset="cleanslate"],
[data-preset="cleanslate"].dark,
[data-preset="cleanslate"] .dark {
/* Planes. */
--background: oklch(0.21 0.04 265.8);
--surface: oklch(0.245 0.04 265.8);
--card: oklch(0.28 0.04 260);
--popover: oklch(0.28 0.04 260);
--muted: oklch(0.28 0.04 260);
--secondary: oklch(0.34 0.03 260.9);
--accent: oklch(0.37 0.03 259.7);
/* Ink. --faint-foreground is for eyebrows, meta and axis titles at 11px/600 and up — never body copy. */
--foreground: oklch(0.93 0.01 255.5);
--card-foreground: var(--foreground);
--popover-foreground: var(--foreground);
--muted-foreground: oklch(0.74 0.02 261.3);
--faint-foreground: oklch(0.74 0.02 261.3);
--secondary-foreground: var(--foreground);
--accent-foreground: var(--foreground);
/* The accent, and the aliases that carry it. */
--brand: oklch(0.75 0.125 276.9);
--brand-foreground: oklch(0.21 0.04 265.8);
--brand-muted: oklch(0.28 0.06 276.9);
--primary: var(--brand);
--primary-foreground: var(--brand-foreground);
--ring: var(--brand);
/* Lines. --input is the field boundary, so it carries 3:1 against the page and a card. */
--border: oklch(0.45 0.03 256.8);
--rule: oklch(0.505 0.03 256.8);
--input: oklch(0.56 0.03 256.8);
--chart-grid: oklch(0.47 0.03 256.8);
/* Semantic tones on opaque tints. */
--success: oklch(0.8 0.14 150);
--success-foreground: oklch(0.16 0.03 150);
--success-muted: oklch(0.3 0.04 150);
--warning: oklch(0.8 0.11 85);
--warning-foreground: oklch(0.16 0.03 85);
--warning-muted: oklch(0.3 0.04 85);
--danger: oklch(0.8 0.14 25.3);
--danger-foreground: oklch(0.16 0.03 25.3);
--danger-muted: oklch(0.3 0.04 25.3);
--info: oklch(0.8 0.14 250);
--info-foreground: oklch(0.16 0.03 250);
--info-muted: oklch(0.3 0.04 250);
--destructive: var(--danger);
/* Chart palette: the accent first when it is a colour, then the source's hues, then three of Vibra's own. */
--chart-1: var(--brand);
--chart-2: oklch(0.59 0.2 277.1);
--chart-3: oklch(0.58 0.23 307);
--chart-4: oklch(0.67 0.175 277);
--chart-5: oklch(0.58 0.18 307.4);
--chart-6: oklch(0.76 0.11 36.9);
--chart-7: oklch(0.74 0.12 156.9);
--chart-8: oklch(0.72 0.02 265.8);
--chart-positive: var(--success);
--chart-negative: var(--danger);
--chart-neutral: var(--muted-foreground);
--chart-axis: var(--muted-foreground);
/* The sidebar sits one plane below the content it frames. */
--sidebar: oklch(0.28 0.04 260);
--sidebar-foreground: var(--foreground);
--sidebar-primary: var(--brand);
--sidebar-primary-foreground: var(--brand-foreground);
--sidebar-accent: oklch(0.37 0.03 259.7);
--sidebar-accent-foreground: var(--foreground);
--sidebar-border: oklch(0.45 0.03 256.8);
--sidebar-ring: var(--brand);
/* Elevation. */
--shadow-sheet: inset 0 1px 0 oklch(1 0 0 / 5%);
--shadow-float: 0 12px 32px -8px oklch(0 0 0 / 60%), inset 0 1px 0 oklch(1 0 0 / 6%);
--shadow-modal: 0 24px 64px -12px oklch(0 0 0 / 70%);
--overlay: oklch(0 0 0 / 60%);
}