xiaohongshu
xiaohongshu
design-system
StepLeague design system, theme configuration, CSS variables, badge styling, and UI patterns. Use when working with colors, themes, styling, badges, buttons, cards, or any visual UI changes. Keywords: CSS, theme, colors, dark mode, light mode, variables, styling, UI, design.
Full skill instructions
NEVER use hardcoded Tailwind colors. ALWAYS use semantic CSS variables.
// ❌ WRONG
<div className="bg-slate-900 text-slate-300 border-slate-700">
// ✅ CORRECT
<div className="bg-card text-foreground border-border">
MUST READ: docs/THEME_SYSTEM.md
This skill is a quick reference. The full theme documentation contains:
| Variable | Usage |
|---|---|
bg-background | Page background |
bg-card | Card/container background |
bg-muted | Muted/subtle background |
bg-primary | Primary action background |
bg-secondary | Secondary background |
| Variable | Usage |
|---|---|
text-foreground | Primary text |
text-muted-foreground | Secondary/muted text |
text-primary | Emphasised text (brand color) |
// Use HSL syntax for status colors
className="text-[hsl(var(--success))]" // Green
className="text-[hsl(var(--warning))]" // Amber
className="text-[hsl(var(--info))]" // Blue
className="text-destructive" // Red
className="bg-primary/90" // 90% opacity
className="bg-[hsl(var(--success)/0.1)]" // 10% opacity
| Component | Import | Use Case |
|---|---|---|
Badge | @/components/ui/badge | General UI (variant prop) |
SystemBadge | @/components/ui/SystemBadge | Category-based (Kanban, Roadmap) |
import { Badge } from "@/components/ui/badge";
<Badge variant="default">Default</Badge>
<Badge variant="secondary">Secondary</Badge>
<Badge variant="destructive">Error</Badge>
<Badge variant="outline">Outline</Badge>
import { SystemBadge } from "@/components/ui/SystemBadge";
<SystemBadge category="status" value="verified" />
<SystemBadge category="type" value="bug" size="sm" />
<SystemBadge category="release" value="now" />
All badge colors are in src/lib/badges.ts:
import { getBadgeClass, getBadgeConfig } from '@/lib/badges';
const statusClass = getBadgeClass('status', 'verified');
const badgeConfig = getBadgeConfig('type', 'bug');
CRITICAL: truncate won't work without min-w-0!
// ✅ CORRECT
<div className="flex items-center gap-3">
<Icon className="flex-shrink-0" /> // Prevent icon shrinking
<div className="flex-1 min-w-0"> // Enable truncation
<div className="truncate">Long text...</div>
</div>
</div>
// ❌ WRONG - truncate won't work
<div className="flex-1">
<div className="truncate">Long text...</div>
</div>
className="hover:bg-secondary"
className="hover:border-primary/50"
className="hover:bg-[hsl(var(--success)/0.1)]"
className="focus:outline-none focus:ring-1 focus:ring-primary"
Every color MUST work in BOTH light AND dark mode. No exceptions.
| Property | Value |
|---|---|
| Framework | next-themes |
| Attribute | data-theme="light" (NOT class-based) |
| Default | Dark mode |
| Toggle | User preference via settings |
ALWAYS define BOTH variants:
/* In globals.css */
:root {
/* Dark mode (default) */
--custom-color: 200 50% 50%;
}
[data-theme="light"] {
/* Light mode - MUST be defined! */
--custom-color: 200 60% 30%; /* Darker for light bg */
}
// ❌ WRONG - Hardcoded, breaks in one theme
<div className="bg-slate-900 text-white">
// ❌ WRONG - Only works in dark mode
<div className="bg-gray-800">
// ❌ WRONG - Custom inline color
<div style={{ backgroundColor: '#1e293b' }}>
// ✅ CORRECT - Uses semantic variables
<div className="bg-card text-foreground">
// ✅ CORRECT - With opacity
<div className="bg-muted/50">
ALWAYS test in BOTH themes before considering work complete. Toggle to light mode via user settings or browser dev tools.
| Text Type | Minimum Ratio |
|---|---|
| Body text | 4.5:1 |
| Large text (18px+ or 14px bold) | 3:1 |
| UI components | 3:1 |
// ❌ RISKY - muted-foreground may have low contrast
<p className="text-muted-foreground text-sm">Small muted text</p>
// ✅ SAFER - use for secondary info only, not critical content
<p className="text-muted-foreground">Secondary description</p>
<p className="text-foreground">Important content here</p>
// ✅ Status on dark background - use appropriate contrast
<span className="text-[hsl(var(--success))]">Verified</span>
<span className="text-destructive">Error occurred</span>
// ✅ Status as background - ensure text contrast
<Badge variant="success">Verified</Badge> // Uses pre-defined contrast
| Forbidden | Why |
|---|---|
bg-slate-* | Breaks light mode |
text-gray-* | Inconsistent theming |
border-zinc-* | Not semantic |
#1e293b, rgb(...) | Hardcoded |
dark: prefix | Use data-theme instead |
| Pattern | Example |
|---|---|
| Semantic variables | bg-card, text-foreground |
| Status colors (HSL) | text-[hsl(var(--success))] |
| With opacity | bg-primary/90 |
| Custom vars in globals.css | After defining light/dark variants |
Search for hardcoded colors in codebase:
# Find Tailwind color classes (potential violations)
grep -r "bg-slate\|bg-gray\|text-slate\|text-gray" src/
grep -r "border-zinc\|bg-zinc" src/
<button aria-label="Close modal">
<X className="h-5 w-5" />
</button>
// Always add aria-label for icon-only buttons
<button aria-label="Delete item" className="text-destructive">
<Trash2 className="h-4 w-4" />
</button>
All interactive elements must have visible focus:
className="focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2"
| Component | Location |
|---|---|
toast, toaster | Notifications |
dialog | Modals |
dropdown-menu | Dropdowns |
input, label, textarea | Form fields |
select, checkbox | Form controls |
tooltip | Tooltips |
confirm-dialog | Confirmation prompts |
// Toasts
import { toast } from "@/hooks/use-toast";
toast({ title: "Success!", description: "Saved" });
toast({ title: "Error", variant: "destructive" });
// Confirmation
import { ConfirmDialog } from "@/components/ui/confirm-dialog";
<ConfirmDialog
open={showDelete}
onOpenChange={setShowDelete}
title="Delete?"
variant="destructive"
onConfirm={handleDelete}
/>
| File | Purpose |
|---|---|
docs/THEME_SYSTEM.md | Full documentation |
src/app/globals.css | CSS variable definitions |
src/lib/badges.ts | Badge color configuration |
/admin/design-system | Live component examples |
Before completing any UI work:
min-w-0 for flex containers needing truncationflex-shrink-0 on icons in flex layoutsform-components - Form field stylingarchitecture-philosophy - Use shadcn over custom componentsxiaohongshu
technical spec
product ux expert
database patterns
Conduct multi-agent task orchestration and workflow coordination.
Initialize project with Conductor artifacts (product definition,
Expert in web animations, transitions, and motion design using Framer Motion and CSS
Creates Mermaid and ASCII diagrams for flowcharts, architecture, ERDs, state machines, mindmaps, and more. Use when user mentions diagram, flowchart, mermaid, ASCII diagram, text diagram, terminal diagram, visualize, C4, mindmap, architecture diagram, sequence diagram, ERD, or needs visual docume...
PostgreSQL bindings for H3 hexagonal grid system. Use when working with H3 cells in Postgres, including spatial indexing, geometry/geography integration, and raster analysis.
Context-Driven Development skill for projects using Conductor. Use this skill when you detect a `conductor/` directory in the project, when working on tasks defined in a `plan.md` file, or when the user asks about tracks, specs, or plans. Automatically applies TDD workflow, tracks task completion...
Display project status, active tracks, and next actions
Official Stakpak application containerization standard operating procedure, a step-by-step guidline to properly dockerize applications. This is a rule book curated by the Stakpak Team.
Generate, edit, and beat-sync AI video with leading models in one workspace.
The world's fastest calendar for remote work
Transform Your Design with AI Designer by ImgCreator.ai
Revolutionizing Video Production with AI-Powered Creativity
Extend an image past the frame and let AI fill the new aspect ratio.
Discover your celebrity doppelgänger with StarByFace!
ChainClarity explains 700+ crypto whitepapers in plain English, with layered summaries, comparisons, research tools, alerts, and a $4.99 Pro plan.
Opus.ai: Revolutionize Your Web Experience