xiaohongshu
xiaohongshu
Brief-specific design system, typography, colors, and component patterns
Full skill instructions
Use this skill when creating or modifying UI components. Brief has a complete design system—always use it instead of inventing new patterns.
| Category | Use | Avoid |
|---|---|---|
| Sans font | font-sans (Spline Sans) | Inter, Roboto, Arial, system fonts |
| Serif font | font-serif (Piazzolla) | Times, Georgia |
| Mono font | font-mono (Spline Sans Mono) | Courier, Monaco |
| Primary color | bg-primary (fern green) | Purple gradients, arbitrary hex |
| Focus rings | ring-ring (sky-blue) | Custom ring colors |
| Components | @/components/ui/* | Custom from-scratch implementations |
Brief uses three font families configured in web/lib/fonts.ts:
// ✅ Correct - use CSS variables
<h1 className="font-sans">Spline Sans (default)</h1>
<blockquote className="font-serif">Piazzolla for accents</blockquote>
<code className="font-mono">Spline Sans Mono</code>
// ❌ Wrong - hardcoded fonts
<h1 style={{ fontFamily: 'Inter' }}>Never do this</h1>
Use these predefined classes from globals.css instead of ad-hoc combinations:
| Class | Size | Weight | Use For |
|---|---|---|---|
.large-title | 3xl | normal | Hero headlines |
.large-title-heavy | 3xl | semibold | Emphasized headlines |
.title-1 | 2xl | normal | Page titles |
.title-2 | xl | normal | Section headers |
.title-3 | lg | normal | Card headers |
.body | base | normal | Default body text |
.callout | sm | normal | Supporting info |
.subhead | xs | normal | Labels, metadata |
.caption-1 | xxs | normal | Fine print |
Add -heavy suffix for semibold variants (e.g., .title-1-heavy).
// ✅ Good
<h1 className="title-1">Page Title</h1>
<p className="body">Content goes here</p>
// ❌ Bad - recreating what exists
<h1 className="text-2xl font-normal tracking-tight leading-7">Page Title</h1>
All colors are OKLCH-based. Key ramps defined in globals.css:
brand-fern — Primary brand green (050–095 stops)neutral — Grays for backgrounds/borderssky-blue — Focus states and interactive chrome// Primitive utilities (use sparingly, prefer semantics)
<div className="bg-brand-fern-050">Primary brand surface</div>
<div className="border-neutral-090">High-contrast border</div>
Always prefer semantic tokens over primitives.
⚠️ CRITICAL: Only use tokens that exist. Do NOT invent tokens by pattern-matching (e.g., don't create
bg-background-secondarybecausebg-backgroundexists).
These are the only semantic tokens available. If it's not listed, it doesn't exist:
| Token | Foreground Variant | Usage |
|---|---|---|
background | foreground | Page/app background |
card | card-foreground | Card surfaces |
popover | popover-foreground | Dropdowns, tooltips |
primary | primary-foreground | Primary actions, CTAs |
secondary | secondary-foreground | Secondary actions |
muted | muted-foreground | Subdued surfaces, hint text |
accent | accent-foreground | Highlighted items |
destructive | destructive-foreground | Danger/delete actions |
| Utility Tokens | Usage |
|---|---|
border | Dividers, card edges |
input | Form input backgrounds |
ring | Focus rings (sky-blue) |
| Sidebar Tokens | Usage |
|---|---|
sidebar / sidebar-foreground | Sidebar surfaces |
sidebar-primary / sidebar-primary-foreground | Sidebar primary |
sidebar-accent / sidebar-accent-foreground | Sidebar highlights |
sidebar-border / sidebar-ring | Sidebar chrome |
| Chart Tokens | Usage |
|---|---|
chart-1 through chart-5 | Data visualization |
// ❌ These tokens DO NOT EXIST - don't invent them
bg-background-secondary // Use: bg-secondary
bg-background-muted // Use: bg-muted
text-primary // Use: text-foreground or text-primary-foreground
bg-surface // Use: bg-card or bg-background
text-subtle // Use: text-muted-foreground
border-muted // Use: border-border
bg-hover // Use: hover:bg-accent
// ✅ Semantic (preferred)
<Button className="bg-primary text-primary-foreground">Save</Button>
<div className="border border-border rounded-lg">Card</div>
<span className="text-muted-foreground">Optional hint</span>
// ❌ Avoid raw values
<Button className="bg-[#2d6a4f]">Save</Button>
<div style={{ borderColor: '#e5e5e5' }}>Card</div>
All interactive elements use consistent focus rings:
className="focus-visible:ring-ring/50 focus-visible:ring-[3px]"
Before writing any component:
@/components/ui/* (TailStack components)grep -r "ComponentName" components/packages/chat-ui/src/ for shared componentsAlways use existing primitives from /components/ui/:
// ✅ Use design system
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Dialog, DialogContent } from "@/components/ui/dialog";
import { Card, CardHeader, CardContent } from "@/components/ui/card";
// ❌ Never recreate
const MyButton = () => <button className="px-4 py-2 bg-blue-500">...</button>;
Extend existing components via composition:
// ✅ Good - compose from Button
export function SubmitButton({ children, ...props }) {
return (
<Button variant="default" size="lg" {...props}>
<CheckIcon className="mr-2 h-4 w-4" />
{children}
</Button>
);
}
// ❌ Bad - duplicate Button internals
export function SubmitButton({ children }) {
return (
<button className="inline-flex items-center justify-center rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground">
<CheckIcon className="mr-2 h-4 w-4" />
{children}
</button>
);
}
// NEVER use these fonts
fontFamily: 'Inter' // Generic AI default
fontFamily: 'Roboto' // Google generic
fontFamily: 'Arial' // System fallback
fontFamily: 'system-ui' // Platform default
className="font-['Inter']" // Hardcoded font
// NEVER use these patterns
className="bg-gradient-to-r from-purple-500 to-pink-500" // Purple gradient slop
className="bg-indigo-600" // Arbitrary Tailwind color
style={{ backgroundColor: '#6366f1' }} // Hardcoded hex
className="bg-blue-500" // Generic blue
// NEVER nest cards in cards
<Card>
<Card> {/* Card inception = bad */}
<CardContent>...</CardContent>
</Card>
</Card>
// Use flat hierarchy with spacing instead
<Card>
<CardContent className="space-y-4">
<section>...</section>
<section>...</section>
</CardContent>
</Card>
// NEVER recreate existing components
const MyModal = ({ children }) => (
<div className="fixed inset-0 bg-black/50 flex items-center justify-center">
<div className="bg-white rounded-lg p-6">{children}</div>
</div>
);
// Use: import { Dialog, DialogContent } from "@/components/ui/dialog";
// NEVER hardcode shadows
className="shadow-[0_4px_6px_rgba(0,0,0,0.1)]"
// Use: className="shadow-sm" or "shadow-md"
Brief is transitioning from Lucide to custom icons:
// Preferred - Custom Brief icons (when available)
import { BriefIcon } from "@/components/icons/react";
// Fallback - Lucide (still installed)
import { Check, X, ChevronDown } from "lucide-react";
// Icon sizing follows Button conventions
<Button size="icon">
<Check className="h-4 w-4" />
</Button>
gap Over Margin// ✅ Good
<div className="flex flex-col gap-4">
<Item />
<Item />
</div>
// ❌ Avoid
<div className="flex flex-col">
<Item className="mb-4" />
<Item />
</div>
| Gap | Pixels | Use For |
|---|---|---|
gap-1 | 4px | Tight groupings |
gap-2 | 8px | Related items |
gap-4 | 16px | Section spacing |
gap-6 | 24px | Major sections |
gap-8 | 32px | Page sections |
className="rounded-md" // 6px - default for inputs/buttons
className="rounded-lg" // 8px - cards, dialogs
className="rounded-xl" // 12px - large containers
After creating/modifying a component:
pnpm run storybook in packages/ui-storybookdocs/design/system.mdpackages/ui-storybook (run with pnpm run storybook)web/components/ui/web/app/globals.css (:root and @theme inline sections)web/lib/fonts.tsFor detailed context beyond this quick reference, see the reference/ subdirectory:
| Doc | When to Use |
|---|---|
reference/typography.md | Font stack rationale, type scale, semantic classes, font loading |
reference/color.md | OKLCH color architecture, token layers, contrast requirements |
reference/motion.md | Animation timing, easing curves, CSS vs Motion library, a11y |
Use these for edge cases, advanced patterns, or when you need to explain why a pattern exists.
xiaohongshu
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