xiaohongshu
xiaohongshu
design-language-system
Apply the professional Navy Blue colour scheme and design tokens. Use when styling components, charts, or ensuring colour consistency across the application.
Full skill instructions
This skill documents the professional colour scheme and design tokens for SG Cars Trends, optimised for automotive data visualisation (GitHub Issue #406).
Never use arbitrary hex colours in components. Always use:
var(--chart-1), var(--primary))text-foreground, bg-primary, text-default-500)text-primary, bg-muted)| Role | Colour | Hex | HSL | Usage |
|---|---|---|---|---|
| Primary | Navy Blue | #191970 | hsl(240, 63%, 27%) | Headers, footers, primary buttons, key accents |
| Secondary | Slate Gray | #708090 | hsl(210, 13%, 50%) | Card containers, borders, secondary buttons |
| Accent | Steel Blue | #4A6AAE | hsl(220, 40%, 49%) | Interactive elements, links, hover states |
| Foreground | Blue-Gray | #2D3748 | hsl(220, 15%, 20%) | Body text, icons |
| Muted | Light Blue-Gray | #F0F4F8 | hsl(213, 32%, 95%) | Backgrounds, subtle textures |
| Border | Light Slate | #E2E8F0 | hsl(214, 32%, 91%) | Dividers, input borders |
| Success | Green | #22C55E | hsl(142, 71%, 45%) | Positive trends, success states |
| Destructive | Red | #DC2626 | hsl(0, 72%, 51%) | Errors, negative trends, destructive actions |
Defined in apps/web/src/app/globals.css:
:root {
/* Primary - Navy Blue */
--primary: hsl(240 63% 27%); /* #191970 */
--primary-foreground: hsl(0 0% 100%);
/* Secondary - Slate Gray */
--secondary: hsl(210 13% 50%); /* #708090 */
--secondary-foreground: hsl(0 0% 100%);
/* Foreground - Blue-Gray */
--foreground: hsl(220 15% 20%);
--background: hsl(0 0% 100%);
/* Muted - Light Blue-Gray */
--muted: hsl(213 32% 95%); /* #F0F4F8 */
--muted-foreground: hsl(220 15% 20%);
/* Accent - Steel Blue */
--accent: hsl(220 40% 49%); /* #4A6AAE */
--accent-foreground: hsl(0 0% 100%);
/* Success - Green */
--success: hsl(142 71% 45%); /* #22C55E */
--success-foreground: hsl(0 0% 100%);
/* Destructive - Red */
--destructive: hsl(0 72% 51%); /* #DC2626 */
--destructive-foreground: hsl(0 0% 100%);
/* Border */
--border: hsl(214 32% 91%); /* #E2E8F0 */
}
Navy Blue gradient palette for data visualisation:
:root {
--chart-1: hsl(240 64% 27%); /* Navy Blue - Primary/Top ranking */
--chart-2: hsl(220 51% 37%); /* Medium Blue - Second ranking */
--chart-3: hsl(220 41% 49%); /* Light Blue - Third ranking */
--chart-4: hsl(210 14% 53%); /* Slate Gray - Fourth ranking */
--chart-5: hsl(215 23% 65%); /* Light Slate - Fifth ranking */
--chart-6: hsl(212 17% 76%); /* Pale Slate - Sixth ranking */
}
// ✅ Good - Use semantic classes
<span className="text-foreground">Primary body text</span>
<span className="text-default-600">Secondary text</span>
<span className="text-default-500">Muted/helper text</span>
<span className="text-muted-foreground">Captions, metadata</span>
<span className="text-primary">Brand emphasis</span>
// ❌ Bad - Hardcoded colours
<span className="text-[#2F4F4F]">Body text</span>
<span style={{ color: "#708090" }}>Helper text</span>
// ✅ Good - Use semantic classes
<div className="bg-primary text-primary-foreground">Primary action</div>
<div className="bg-default-100">Subtle background</div>
<div className="bg-default-200">Hover state</div>
<div className="bg-white">Card background</div>
// ❌ Bad - Hardcoded colours
<div className="bg-[#191970]">Navy background</div>
// ✅ Good - Use CSS variables
<div style={{ backgroundColor: `var(--chart-${index + 1})` }} />
<div className="bg-[var(--chart-1)]" />
// For bar charts with multiple series
{data.map((item, i) => (
<Bar
key={item.name}
style={{ fill: `var(--chart-${i + 1})` }}
/>
))}
// For single-highlight charts
<Bar
className={isHighlighted ? "fill-[var(--chart-1)]" : "fill-default-200"}
/>
// ❌ Bad - Hardcoded hex colours
<div style={{ backgroundColor: "#191970" }} />
<Bar fill="#708090" />
// ✅ Good - Use semantic classes for states
<button className="bg-primary text-primary-foreground hover:bg-primary/90">
Primary Button
</button>
<Link className="text-default-500 hover:bg-default-100">
Navigation Item
</Link>
// Active/selected states
<Tab className={isActive ? "bg-primary text-primary-foreground" : "text-default-500"}>
Tab Label
</Tab>
// ❌ Bad - Hardcoded state colours
<button className="bg-[#191970] hover:bg-[#14145A]">Button</button>
Limit charts to 6 series maximum to match the available --chart-1 through --chart-6 variables:
// ✅ Good - Within 6 series limit
{data.slice(0, 5).map((item, i) => (
<Bar style={{ fill: `var(--chart-${i + 1})` }} />
))}
// No modulo needed when series count is controlled
colour: `var(--chart-${index + 1})`
// ❌ Bad - Modulo for unlimited series (indicates design problem)
colour: `var(--chart-${(index % 6) + 1})`
For charts where one element is emphasised:
// Latest year highlighted, others muted
{data.map((item, i, arr) => {
const isLatest = i === arr.length - 1;
return (
<div
className={isLatest ? "bg-[var(--chart-1)]" : "bg-default-200 hover:bg-default-300"}
/>
);
})}
import { Cell, Pie, PieChart } from "recharts";
// Use CSS variables for fill colours
<Pie data={chartData} dataKey="value">
{chartData.map((entry, index) => (
<Cell
key={`cell-${entry.name}`}
fill={entry.fill} // fill comes from data with var(--chart-N)
/>
))}
</Pie>
// Prepare chart data with CSS variable colours
const chartData = data.map((item, index) => ({
name: item.name,
value: item.count,
fill: `var(--chart-${index + 1})`,
}));
The colour system is integrated with HeroUI via apps/web/src/app/hero.ts:
import { heroui } from "@heroui/react";
export default heroui({
themes: {
light: {
colors: {
primary: {
DEFAULT: "#191970", // Navy Blue
foreground: "#FFFFFF",
},
secondary: {
DEFAULT: "#708090", // Slate Gray
foreground: "#FFFFFF",
},
success: {
DEFAULT: "#008B8B", // Dark Cyan
foreground: "#FFFFFF",
},
foreground: "#2F4F4F", // Dark Slate Gray
// ... default scale for grays
},
},
},
});
Use the default scale for UI element states:
| Class | Usage |
|---|---|
bg-default-50 | Lightest background |
bg-default-100 | Subtle background, hover state base |
bg-default-200 | Muted elements, inactive bars |
bg-default-300 | Hover state for muted elements |
text-default-500 | Muted text, placeholders |
text-default-600 | Secondary text |
text-default-900 | Strong emphasis (H4 headings) |
When migrating existing code to the design system:
CHART_COLORS, MARKET_SHARE_COLOURS)var(--chart-N) inline for chart colourstext-gray-* with text-default-*bg-gray-* with bg-default-*text-foreground instead of text-gray-900 for body text// ❌ Bad - Don't create colour arrays
const CHART_COLORS = ["#191970", "#2E4A8E", "#4A6AAE", "#708090"];
// ...later
backgroundColor: CHART_COLORS[i % CHART_COLORS.length]
// ✅ Good - Use CSS variables inline
backgroundColor: `var(--chart-${i + 1})`
// ❌ Bad - Hardcoded hex
<div className="text-[#2F4F4F]">Text</div>
<div style={{ backgroundColor: "#191970" }}>Box</div>
// ✅ Good - Semantic tokens
<div className="text-foreground">Text</div>
<div className="bg-primary">Box</div>
// ❌ Bad - Tailwind gray scale
<span className="text-gray-600">Helper text</span>
<div className="bg-gray-100">Background</div>
// ✅ Good - HeroUI default scale
<span className="text-default-600">Helper text</span>
<div className="bg-default-100">Background</div>
OG images require inline styles and cannot use CSS variables:
// apps/web/src/app/*/opengraph-image.tsx
// Inline hex colours are acceptable here
<div style={{ backgroundColor: "#191970" }}>
The hero.ts theme config uses hex values to define the source of truth:
// apps/web/src/app/hero.ts
primary: {
DEFAULT: "#191970", // This defines the --primary variable
}
apps/web/src/app/globals.css - CSS variable definitionsapps/web/src/app/hero.ts - HeroUI theme configurationapps/web/CLAUDE.md - Colour System sectionpackages/ui/src/styles/globals.css - Shared UI package stylesThe Navy Blue primary (#191970) on white background meets WCAG AAA contrast requirements.
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