/install financial-design-systems
Financial Data Visualization
Build dark-themed financial charts and visualizations that are readable, beautiful, and consistent with modern trading UIs.
When to Use
- Building trading dashboards with charts
- Displaying portfolio performance
- Showing price history and trends
- Any financial data visualization
Pattern 1: Chart Color Palette
// lib/chart-theme.ts
export const chartColors = {
// Gains/Losses
positive: 'hsl(154 80% 60%)', // Green
negative: 'hsl(346 80% 62%)', // Red
neutral: 'hsl(216 90% 68%)', // Blue
// Backgrounds
background: 'hsl(222 47% 11%)',
surface: 'hsl(222 47% 15%)',
grid: 'hsl(222 47% 20%)',
// Text
textPrimary: 'hsl(210 40% 98%)',
textSecondary: 'hsl(215 20% 65%)',
textMuted: 'hsl(215 20% 45%)',
// Data series
series: [
'hsl(200 90% 65%)', // Cyan
'hsl(280 90% 65%)', // Purple
'hsl(45 90% 65%)', // Gold
'hsl(160 90% 65%)', // Teal
'hsl(320 90% 65%)', // Pink
],
};
Pattern 2: Recharts Theme Config
// components/charts/chart-config.ts
import { chartColors } from '@/lib/chart-theme';
export const chartConfig = {
// Axis styling
axisStyle: {
stroke: chartColors.textMuted,
fontSize: 11,
fontFamily: 'var(--font-mono)',
},
// Grid styling
gridStyle: {
stroke: chartColors.grid,
strokeDasharray: '3 3',
},
// Tooltip styling
tooltipStyle: {
backgroundColor: chartColors.surface,
border: `1px solid ${chartColors.grid}`,
borderRadius: '8px',
boxShadow: '0 4px 12px rgba(0, 0, 0, 0.3)',
},
};
// Custom tooltip component
export function ChartTooltip({ active, payload, label }: any) {
if (!active || !payload) return null;
return (
\x3Cdiv
className="rounded-lg border bg-popover px-3 py-2 shadow-lg"
style={chartConfig.tooltipStyle}
>
\x3Cp className="text-xs text-muted-foreground mb-1">{label}\x3C/p>
{payload.map((entry: any, index: number) => (
\x3Cp
key={index}
className="text-sm font-mono tabular-nums"
style={{ color: entry.color }}
>
{entry.name}: {formatCurrency(entry.value)}
\x3C/p>
))}
\x3C/div>
);
}
Pattern 3: Price Chart Component
import {
AreaChart,
Area,
XAxis,
YAxis,
Tooltip,
ResponsiveContainer,
} from 'recharts';
interface PriceChartProps {
data: { time: string; price: number }[];
isPositive?: boolean;
}
export function PriceChart({ data, isPositive = true }: PriceChartProps) {
const color = isPositive ? chartColors.positive : chartColors.negative;
return (
\x3CResponsiveContainer width="100%" height={200}>
\x3CAreaChart data={data}>
\x3Cdefs>
\x3ClinearGradient id="priceGradient" x1="0" y1="0" x2="0" y2="1">
\x3Cstop offset="0%" stopColor={color} stopOpacity={0.3} />
\x3Cstop offset="100%" stopColor={color} stopOpacity={0} />
\x3C/linearGradient>
\x3C/defs>
\x3CXAxis
dataKey="time"
axisLine={false}
tickLine={false}
tick={{ ...chartConfig.axisStyle }}
/>
\x3CYAxis
domain={['auto', 'auto']}
axisLine={false}
tickLine={false}
tick={{ ...chartConfig.axisStyle }}
tickFormatter={(value) => formatCompact(value)}
/>
\x3CTooltip content={\x3CChartTooltip />} />
\x3CArea
type="monotone"
dataKey="price"
stroke={color}
strokeWidth={2}
fill="url(#priceGradient)"
/>
\x3C/AreaChart>
\x3C/ResponsiveContainer>
);
}
Pattern 4: Candlestick Colors
export const candlestickColors = {
up: {
fill: 'hsl(154 80% 60%)',
stroke: 'hsl(154 80% 50%)',
},
down: {
fill: 'hsl(346 80% 62%)',
stroke: 'hsl(346 80% 52%)',
},
wick: 'hsl(215 20% 45%)',
};
// Usage with lightweight-charts or similar
const candlestickSeries = chart.addCandlestickSeries({
upColor: candlestickColors.up.fill,
downColor: candlestickColors.down.fill,
borderUpColor: candlestickColors.up.stroke,
borderDownColor: candlestickColors.down.stroke,
wickUpColor: candlestickColors.wick,
wickDownColor: candlestickColors.wick,
});
Pattern 5: Percentage Bar
interface PercentageBarProps {
value: number; // -100 to 100
showLabel?: boolean;
}
export function PercentageBar({ value, showLabel = true }: PercentageBarProps) {
const isPositive = value >= 0;
const absValue = Math.min(Math.abs(value), 100);
return (
\x3Cdiv className="flex items-center gap-2">
{/* Negative side */}
\x3Cdiv className="flex-1 flex justify-end">
{!isPositive && (
\x3Cdiv
className="h-2 rounded-l bg-destructive"
style={{ width: `${absValue}%` }}
/>
)}
\x3C/div>
{/* Center divider */}
\x3Cdiv className="w-px h-4 bg-border" />
{/* Positive side */}
\x3Cdiv className="flex-1">
{isPositive && (
\x3Cdiv
className="h-2 rounded-r bg-success"
style={{ width: `${absValue}%` }}
/>
)}
\x3C/div>
{showLabel && (
\x3Cspan
className={cn(
'text-xs font-mono tabular-nums w-12 text-right',
isPositive ? 'text-success' : 'text-destructive'
)}
>
{formatPercentage(value)}
\x3C/span>
)}
\x3C/div>
);
}
Pattern 6: Mini Sparkline
interface SparklineProps {
data: number[];
width?: number;
height?: number;
}
export function Sparkline({ data, width = 80, height = 24 }: SparklineProps) {
const first = data[0];
const last = data[data.length - 1];
const isPositive = last >= first;
const color = isPositive ? chartColors.positive : chartColors.negative;
const min = Math.min(...data);
const max = Math.max(...data);
const range = max - min || 1;
const points = data
.map((value, i) => {
const x = (i / (data.length - 1)) * width;
const y = height - ((value - min) / range) * height;
return `${x},${y}`;
})
.join(' ');
return (
\x3Csvg width={width} height={height} className="overflow-visible">
\x3Cpolyline
points={points}
fill="none"
stroke={color}
strokeWidth={1.5}
strokeLinecap="round"
strokeLinejoin="round"
/>
\x3C/svg>
);
}
Pattern 7: Chart Legend
interface LegendItem {
label: string;
color: string;
value?: string;
}
export function ChartLegend({ items }: { items: LegendItem[] }) {
return (
\x3Cdiv className="flex flex-wrap gap-4">
{items.map((item) => (
\x3Cdiv key={item.label} className="flex items-center gap-2">
\x3Cdiv
className="size-3 rounded-full"
style={{ backgroundColor: item.color }}
/>
\x3Cspan className="text-xs text-muted-foreground">{item.label}\x3C/span>
{item.value && (
\x3Cspan className="text-xs font-mono">{item.value}\x3C/span>
)}
\x3C/div>
))}
\x3C/div>
);
}
Related Skills
- Meta-skill: ai/skills/meta/design-system-creation/ — Complete design system workflow
- animated-financial-display — Number animations and value flash effects
- dual-stream-architecture — Real-time data streaming patterns
NEVER Do
- Use light theme colors — Ensure sufficient contrast on dark backgrounds
- Use red/green without considering colorblind users — Add shapes or patterns
- Skip grid lines — They help read values
- Use thick strokes — 1-2px is optimal for data lines
- Animate charts on every data point — Reserve animation for initial load
Quick Reference
// Color assignment
const color = value >= 0 ? chartColors.positive : chartColors.negative;
// Gradient definition
\x3ClinearGradient id="gradient" x1="0" y1="0" x2="0" y2="1">
\x3Cstop offset="0%" stopColor={color} stopOpacity={0.3} />
\x3Cstop offset="100%" stopColor={color} stopOpacity={0} />
\x3C/linearGradient>
// Axis styling
\x3CXAxis tick={{ fill: chartColors.textMuted, fontSize: 11 }} />
// Tooltip styling
\x3CTooltip contentStyle={{ background: chartColors.surface }} />
- Make sure OpenClaw is installed (local or Docker)
- Run the install command in chat:
/install financial-design-systems - After installation, invoke the skill by name or use
/financial-design-systems - Provide required inputs per the skill's parameter spec and get structured output
What is Financial Design Systems?
Patterns for building dark-themed financial charts and data visualizations. Covers chart theming, color scales for gains/losses, and real-time data display. Use when building trading dashboards or financial analytics. Triggers on chart theme, data visualization, financial chart, dark theme, gains losses, trading UI. It is an AI Agent Skill for Claude Code / OpenClaw, with 1148 downloads so far.
How do I install Financial Design Systems?
Run "/install financial-design-systems" in the OpenClaw or Claude Code chat to install it in one step — no extra setup required.
Is Financial Design Systems free?
Yes, Financial Design Systems is completely free (open-source). You can download, install and use it at no cost.
Which platforms does Financial Design Systems support?
Financial Design Systems is cross-platform and runs anywhere OpenClaw / Claude Code is available (cross-platform).
Who created Financial Design Systems?
It is built and maintained by wpank (@wpank); the current version is v1.0.0.