Casper Studios internal design system for generating consistent, production-grade SaaS UI. Use this skill whenever generating UI code for internal tools, client apps, dashboards, POCs, prototypes, or any visual interface — even quick mockups or artifacts. Apply it any time the output is a React component, page, or layout. If the user mentions "our design system", "Casper style", "match our look", or asks you to build any kind of app or interface, use this skill. Also trigger when restyling or theming existing UI to match Casper's visual language. This skill takes priority over generic frontend-design guidance.
From caspernpx claudepluginhub casper-studios/casper-marketplace --plugin casperThis skill uses the workspace's default tool permissions.
assets/logo-mono-black.svgassets/logo-mono-white.svgassets/logo-on-white-default.svgassets/logo-on-white-variant.svgreferences/components.mdreferences/mobile.mdreferences/theme.cssreferences/web-layouts.mdSearches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Searches prompts.chat for AI prompt templates by keyword or category, retrieves by ID with variable handling, and improves prompts via AI. Use for discovering or enhancing prompts.
Compares coding agents like Claude Code and Aider on custom YAML-defined codebase tasks using git worktrees, measuring pass rate, cost, time, and consistency.
A clean, elevated SaaS design system built on shadcn/ui, Tailwind CSS v4, and React (Vite). Every interface generated for Casper Studios — whether a client demo, internal tool, or quick prototype — must follow these rules to maintain a consistent, professional visual identity across the team.
Before generating any UI code, read this file completely and the reference files listed below. You MUST read the reference files — they contain rules and code examples that are required for correct output. Skipping them will produce incorrect, off-brand UI.
Required for EVERY project:
references/components.md — ALWAYS read. Reusable pieces: stat cards, list items, filter bars, kanban boards, profile cards, product cards, activity feeds, toast notifications, form validation states. Required whenever building UI elements inside a layout.references/theme.css — ALWAYS read. Tailwind CSS v4 theme tokens. Copy this file into your project as-is.assets/ — Contains Casper Studios logo SVGs in 4 variants (default, variant, mono-black, mono-white). Use the correct variant based on background color — see the Logo section below.Required based on platform:
references/web-layouts.md — MUST read when the project is a web application. Web-specific responsive rules + code examples: app shell, sidebar nav, dashboard grid, data table page, page header.references/mobile.md — MUST read when the project is a mobile application. Mobile-specific rules + code examples: device frame, top bar, bottom tab navigation, form patterns, pinned-button layout, list views, card stacks, full screen compositions, contextual actions (menus + bottom sheets).Non-negotiable: Do not generate UI without reading the platform reference file first. If you are unsure whether the project is web or mobile, ask the user before proceeding.
Before producing any UI code, confirm the following with the user. If their prompt already answers these clearly, proceed without asking. If not, ask before generating anything.
.dark class overrides, use bg-neutral-0 for surfaces, and include the mono-white logo variant.)Do NOT assume defaults for these. If the user says "build me a dashboard," you don't know if it's web or mobile, or if it needs dark mode. Ask.
The Casper aesthetic is clean authority — a professional SaaS style that feels premium without trying too hard. It uses generous whitespace, a restrained purple accent, and soft rounded surfaces to create interfaces that feel trustworthy and modern. Think Linear meets Notion: structured, breathable, quietly confident.
#5900FF) appears on active states, primary buttons, and key CTAs — nowhere else. If everything is purple, nothing is.shadow-sm for cards, shadow-md for popovers. Never use shadow-lg on in-page elements.references/theme.css as Casper brand overridesshadcn init), then layer Casper brand tokens from references/theme.css on top. The shadcn semantic layer (bg-background, text-foreground, bg-primary, border-border, etc.) is the base — Casper's theme.css adds brand colors, typography, shadows, and spacing on top of it, not as a replacement. Use shadcn components directly. Do NOT create custom base components that duplicate shadcn functionalityDM Sans with sans-serif as fallback for all UI text. Load via Google Fonts or bundleThe palette is intentionally restrained. Most of the UI is neutral gray + white, with purple as a sharp accent.
| Role | Token | Hex | When to use |
|---|---|---|---|
| Brand accent | brand-500 | #5900FF | Active nav items, primary buttons, links, focus rings |
| Brand subtle | brand-50 | #EEE5FF | Active nav background, selected row highlight, hover tints |
| Brand light | brand-100 | #DECCFF | Icon circle backgrounds, soft tag fills |
| Default text | neutral-950 | #0A0A0A | Page titles, headings |
| Body text | neutral-900 | #171717 | Primary body text |
| Subtext | neutral-500 | #737373 | Metadata, timestamps, secondary labels |
| Borders | neutral-200 | #E5E5E5 | Card borders, dividers, table lines |
| Surface | neutral-50 | #FAFAFA | Page background behind cards |
| Card surface | neutral-0 | #FFFFFF | Card backgrounds, panels (use bg-neutral-0 for dark mode compatibility — see Dark Mode section) |
Use these ONLY for status indicators, badges, and contextual feedback — never as decorative accents.
success-500 (#22C55E) for badges/icons, success-50 for pill backgroundserror-500 (#EF4444) for badges/icons, error-50 for pill backgroundswarning-500 (#F59E0B) for badges/icons, warning-50 for pill backgroundstext-black/50, use neutral-500)All text is set in DM Sans with sans-serif as fallback (font-family: 'DM Sans', sans-serif). Monospace (font-mono) is acceptable for code blocks, data labels, and IDs only.
| Style | Size | Weight | Line Height | Use |
|---|---|---|---|---|
| Heading 1 | 30px | 500 | 36px | Page titles only. One per view. |
| Heading 2 | 20px | 500 | 24px | Section titles within a page |
| Heading 3 | 16px | 500 | 20px | Card titles, subsection labels |
| Body | 14px | 400 | 20px | Default paragraph and UI text |
| Body Bold | 14px | 500 | 20px | Emphasis within body text, table headers |
| Caption | 12px | 400 | 16px | Timestamps, helper text, metadata |
| Caption Bold | 12px | 500 | 16px | Badge labels, small category tags |
medium weight (500), never bold (700)brand-500 color with no underline by default, underline on hoverUse Tailwind's default spacing scale. Key values:
4px (p-1) — icon padding, tight gaps8px (p-2) — badge padding, small gaps12px (p-3) — input padding, card internal gaps16px (p-4) — card padding, section gaps24px (p-6) — between cards, content sections32px (p-8) — major section separation48px (p-12) — page-level padding on large screensneutral-50 (#FAFAFA)1280px centered240px fixed width24px paddingThe design is predominantly flat. Shadows are used to indicate layers, not to add decoration.
| Token | Use |
|---|---|
shadow-sm | Cards, inputs at rest |
shadow-md | Dropdown menus, popovers, tooltips |
shadow-lg | Modals, command palettes, overlays ONLY |
shadow-overlay | Semantic alias for shadow-lg — identical value. Use on modals/sheets so the intent reads clearly in code |
NEVER apply shadow-lg (or its alias shadow-overlay) to cards or in-page elements. These are reserved for floating layers only.
The theme file (references/theme.css) uses the shadcn/ui radius system — a single --radius base variable in :root that controls the entire scale via calc(). This is mapped into Tailwind classes via @theme inline. No Tailwind v4 defaults are overridden.
| Token | Tailwind Class | Default Value | Use |
|---|---|---|---|
--radius-sm | rounded-sm | 6px | Inner elements, nav items, small nested controls |
--radius-md | rounded-md | 8px | Buttons, inputs, popovers, tooltips, chart tooltips |
--radius-lg | rounded-lg | 10px | Cards, panels, large containers |
--radius-xl | rounded-xl | 14px | Modal containers, dialogs, hero cards |
| (Tailwind built-in) | rounded-full | 9999px | Badges, pills, avatars, icon circles |
The base value --radius: 0.625rem (10px) is the shadcn default. To make the entire UI sharper or rounder, change this single value — all tokens recalculate automatically.
Cards always use rounded-lg (10px). Buttons and inputs always use rounded-md (8px). Nested elements inside cards should use rounded-sm (6px) for non-interactive elements to maintain visual hierarchy — the inner radius should always be smaller than the outer.
import { IconName } from "lucide-react"16px for inline, 20px for standaloneneutral-500 for subtext, brand-500 for active)40px diameter, brand-50 or brand-100 background, rounded-full20px, brand-500 colorerror-50 bg + error-500 icon)The Casper Studios logo has four variants stored in assets/. Use the correct variant based on the background it sits on:
| Variant | File | When to use |
|---|---|---|
| Default (full color) | assets/logo-on-white-default.svg | Light/white backgrounds. Gradient icon + purple "CASPER" + dark "STUDIOS". This is the primary logo — use it whenever possible. |
| Variant (full color) | assets/logo-on-white-variant.svg | Light/white backgrounds when you want all-black text instead of purple + dark gray. Same gradient icon. |
| Mono Black | assets/logo-mono-black.svg | Light backgrounds where color is unavailable (e.g., print, grayscale contexts). Grayscale icon + near-black text. |
| Mono White | assets/logo-mono-white.svg | Dark backgrounds only. Gray icon + white text. Use this whenever the logo sits on a dark surface (dark nav bars, dark hero sections, overlays, dark mode). |
logo-on-white-default.svg or logo-on-white-variant.svglogo-mono-white.svg — never place the default or black logo on a dark background8px on all sidesUse shadcn/ui components as your base layer. Theme them using the CSS variables in references/theme.css. Here is how specific components should be configured:
brand-500 bg, text-white (literal white, not a token), rounded-md. Hover: brand-600.neutral-200 border, neutral-900 text, rounded-md. Hover: neutral-50 bg.neutral-600 text, rounded-md. Hover: neutral-100 bg.error-500 bg, text-white, rounded-md.rounded-md (8px), 14px font.48px (h-12). Use this on standalone pages, forms, modals, and any top-level content area.36px (h-9). Use when the button lives inside a smaller container — cards, panels, table rows, sidebar nav, filter bars, inline actions. The tighter context calls for a tighter control.rounded-full (pill shape). Height 22px. Caption-bold text (12px, 500 weight).success-50 bg, success-700 text.neutral-100 bg, neutral-700 text.brand-50 bg, brand-700 text.bg-neutral-0). 1px neutral-200 border. rounded-lg (10px). shadow-sm.16px minimum, 24px for spacious cards.Heading 3 (16px/500) with optional "View all" link aligned right.1px neutral-200 divider.<Table>. No outer border on the table itself — let the parent Card provide the container.neutral-500 color, uppercase.48-56px. Rows separated by 1px neutral-200 bottom border.neutral-50 background.rounded-md (8px). 1px neutral-200 border. neutral-50 bg or white bg.2px brand-500 ring (use Tailwind ring-2 ring-brand-500).<label> element above every input, never inside it. Labels use 14px/400 in neutral-900. The gap between label and input is 6px (space-y-1.5).neutral-400 color, normal weight (400), short hint text (e.g., "e.g. john@email.com"). Placeholders are supplementary hints, not labels.16px (space-y-4 or gap-4).48px (h-12). Use for inputs on standalone pages, forms, modals, and any top-level content area.36px (h-9). Use when the input lives inside a smaller container — cards, panels, table rows, filter bars, inline search fields. Same logic as compact buttons.See references/web-layouts.md for the full sidebar code pattern. Key specs:
240px. White background. Right border: 1px neutral-200.36px height (compact — inside sidebar panel), rounded-sm (6px), 12px left padding.
neutral-600 text. Active: brand-50 bg, brand-500 text, font-weight: 500. Hover: neutral-100 bg.neutral-400, 24px top margin between groups.Sheet (slide-in from left).<Tabs>. Underline variant.brand-500 bottom border (2px), neutral-900 text.neutral-500 text. Hover: neutral-900 text.black/50 opacity.rounded-xl (14px), shadow-overlay.For rules and code examples, read the appropriate reference file:
references/web-layouts.md — Responsive rules, App Shell, Sidebar Navigation, Dashboard Grid, Data Table Page, Page Headerreferences/components.md — Stat Card, List Item Row, Filter Bar, Kanban Board, Profile/Discovery Card, Product Card, Activity Feed Item, Toast Notifications, Form Validation Statesreferences/mobile.md — Mobile rules, Device Frame Shell, Mobile Top Bar, Bottom Tab Navigation, Mobile Form Layout, Pinned Bottom Button, Mobile List View, Mobile Card Stack, Full Screen Composition, Contextual ActionsEvery project is either a web application or a mobile application — the layout approach is fundamentally different. You MUST have already read the appropriate platform reference file (as instructed at the top of this document) before reaching this point. If you haven't, stop and read it now:
references/web-layouts.md (responsive breakpoints, sidebar behavior, layout patterns)references/mobile.md (device frame, touch targets, pinned buttons, navigation, mobile-specific rules)Do NOT treat a mobile app as a responsive web page. Mobile apps render inside a device frame and follow entirely different navigation, spacing, and interaction patterns.
When no real image is available, use soft gradient mesh backgrounds — NOT gray boxes. These should feel like abstract art, not loading states.
Gradient recipes (CSS linear-gradient or radial-gradient combos):
linear-gradient(135deg, #a8edea 0%, #fed6e3 50%, #a8edea 100%)linear-gradient(135deg, #f6d5c5 0%, #e8b4b8 50%, #d4a0a0 100%)linear-gradient(135deg, #c3b1e1 0%, #f0c4d0 50%, #e0aed0 100%)linear-gradient(135deg, #43e97b 0%, #38f9d7 100%)Apply rounded-lg to image containers. These are placeholders — they should look intentional and beautiful.
Every state change should feel smooth and intentional — no hard cuts. This applies across both web and mobile:
transition-colors or transition-all with Tailwind's default duration (~150ms). State changes like hover, focus, and active should never feel instantaneous.150–300ms ease-out transition keeps things feeling responsive without sluggish.opacity 0→50%), not appear instantly.Nothing on screen should ever just "appear" or "disappear" — every visual change gets a brief, smooth transition.
Every screen has at least three faces: populated, empty, and broken. AI-generated interfaces almost always show only the happy path with fake data. A polished interface acknowledges the other two.
When a list, table, or content area has no data yet (first-time use, zero results, cleared filters):
48px, neutral-300) + a short heading (Heading 3) + one line of body text (neutral-500) vertically in the content areaWhen something goes wrong (network failure, permission denied, server error):
error-500 for the icon colorWifiOff for network errors, ShieldX for permission, AlertTriangle as a generic fallbacksecondary variant) when the action is retryableWhen content is being fetched:
Loader2 icon with animate-spin, 24px, neutral-400). No skeleton screens unless explicitly requested — they add complexity without clarifying the designneutral-400The anti-pattern rule "No animated skeletons or shimmer effects in static mockups" still stands — but a simple animate-spin on a loader icon is fine for interactive interfaces.
Inputs need to clearly communicate when something is wrong. This applies to both web and mobile. For code examples, see the Form Validation States section in references/components.md.
After a successful form submission, provide clear feedback. Don't just silently navigate away:
Transient feedback messages that confirm actions, surface errors, or provide information. Use shadcn's Sonner toast component. For code examples and the full variant table, see the Toast Notification section in references/components.md.
16px from the edge4000ms default, 6000ms for messages with an action link. Error toasts should persist until dismissedWhen rendering charts (Recharts, Chart.js, etc.), use this ordered color sequence so data visualizations feel native to the brand. The palette starts with the brand purple and fans out through distinguishable hues:
| Order | Name | Hex | Use |
|---|---|---|---|
| 1 | Brand | #5900FF | Primary data series, single-metric charts |
| 2 | Teal | #14B8A6 | Secondary series |
| 3 | Amber | #F59E0B | Tertiary series |
| 4 | Rose | #F43F5E | Fourth series, or "negative" in comparisons |
| 5 | Sky | #0EA5E9 | Fifth series |
| 6 | Lime | #84CC16 | Sixth series |
Brand (#5900FF)Brand + Teal10% opacity fills for area charts (e.g., #5900FF1A for brand area fill)neutral-200. Axis labels: neutral-500, caption size (12px). Axis lines: neutral-300shadow-md, rounded-md, neutral-200 border — same treatment as popoversDark mode is off by default. Only implement it when explicitly requested by the user or client. When dark mode is requested, follow these rules — do NOT improvise an inverted palette.
The theme file (references/theme.css) includes a .dark class block that overrides CSS custom properties. Adding class="dark" to <html> or a wrapper element flips the entire color system without changing any component code. The neutral scale inverts so existing utilities (text-neutral-900, bg-neutral-50, border-neutral-200) automatically produce the correct dark-mode values.
You don't change token names in your code — the .dark override changes the values behind them. Here's what each token resolves to:
| Token (unchanged in code) | Light Mode Value | Dark Mode Value | Notes |
|---|---|---|---|
bg-neutral-50 | #FAFAFA (light gray) | #171717 (near-black) | Page background |
bg-neutral-0 | #FFFFFF (white) | #0A0A0A (near-black) | Card surfaces |
border-neutral-200 | #E5E5E5 (light gray) | #404040 (dark gray) | Borders / dividers |
text-neutral-950 | #0A0A0A (near-black) | #FFFFFF (white) | Page titles |
text-neutral-900 | #171717 (near-black) | #FAFAFA (near-white) | Body text |
text-neutral-500 | #737373 (mid-gray) | #737373 (mid-gray) | Stays the same — mid-range |
text-neutral-400 | #A3A3A3 (light gray) | #A3A3A3 (stays same) | Subtext — readable on dark |
bg-brand-500 | #5900FF | #7A33FF (lighter) | Brighter for contrast on dark bg |
bg-brand-50 | #EEE5FF (light purple) | #120033 (very dark purple) | Tinted backgrounds invert |
bg-white vs bg-neutral-0 — Critical DistinctionTailwind's built-in white and black are NOT overridden in dark mode. They always resolve to literal #FFFFFF and #000000.
text-white when you mean actual white — e.g., button text on a brand-500 background. This stays white in both modes. ✅bg-neutral-0 (not bg-white) for surfaces that should invert in dark mode — e.g., card backgrounds, sidebars, top bars. bg-neutral-0 maps to #FFFFFF in light and #0A0A0A in dark. ✅bg-neutral-50 for page backgrounds. Maps to #FAFAFA in light, #171717 in dark. ✅If you use bg-white on a card, it will stay bright white in dark mode — blinding. Use bg-neutral-0 instead.
Shadows are nearly invisible on dark surfaces. The .dark block increases shadow opacity so elevation is still perceptible, but cards should primarily rely on their neutral-200 border (which maps to a subtle dark gray divider in dark mode) for definition.
Use assets/logo-mono-white.svg — the only variant approved for dark surfaces.
.dark class overridebg-white for surfaces — use bg-neutral-0 so they invert properlybrand-500 for large tinted surfaces — use brand-50 (which maps to a dark purple in dark mode)neutral-50 or neutral-0.1px for structural borders. Never 2px+.rounded-lg (10px), never circles.rounded-lg cards should contain rounded-sm children, not rounded-lg children. The inner radius should always be smaller than the outer.Before delivering any UI code, verify:
DM Sans font family (with sans-serif fallback)bg-neutral-0 + neutral-200 border + rounded-lg + shadow-smneutral-50, not whiteneutral-400, normal weight).dark class applied, logo uses mono-white variant, surfaces use bg-neutral-0 (not bg-white)rounded-md (8px), cards use rounded-lg (10px), nav items/inner elements use rounded-sm (6px)48px (h-12) by default, 36px (h-9) when inside cards, panels, tables, or other compact containers48px height (same as global default — no mobile override needed)