creating-dashboards by ancoleman/ai-design-components
npx skills add https://github.com/ancoleman/ai-design-components --skill creating-dashboards此技能支持创建复杂的仪表板界面,通过协调的组件(包括 KPI 卡片、图表、表格和过滤器)聚合和展示数据。仪表板作为数据驱动决策的集中指挥中心,将来自其他技能(数据可视化、表格、设计令牌)的多种组件类型组合成统一的分析体验,具有实时更新、响应式布局和交互式过滤功能。
在以下情况下激活此技能:
┌────────────────────────────┐
│ Revenue (This Month) │ ← 带时间段的标签
│ │
│ $1,245,832 │ ← 大数字(主要指标)
│ ↑ 15.3% vs last month │ ← 带比较的趋势指示器
│ ▂▃▅▆▇█ (sparkline) │ ← 迷你可视化
└────────────────────────────┘
固定布局:设计师定义的放置位置,跨用户保持一致 可自定义网格:用户拖放、可调整大小的组件、保存的布局 基于模板:预构建的模式、特定行业的起点
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
对于快速分析仪表板 → 使用 Tremor 预构建的 KPI 卡片、图表和表格,代码量最小:
npm install @tremor/react
对于可自定义的仪表板 → 使用 react-grid-layout 拖放、可调整大小的组件、用户定义的布局:
npm install react-grid-layout
为跨组件协调实现过滤器上下文:
// 用于共享过滤器的仪表板上下文
const DashboardContext = createContext({
filters: { dateRange: null, categories: [] },
setFilters: () => {},
refreshInterval: 30000
});
// 用提供者包装仪表板
<DashboardContext.Provider value={dashboardState}>
<FilterPanel />
<WidgetGrid />
</DashboardContext.Provider>
并行加载:同时获取所有组件数据 懒加载:先加载可见组件,滚动时加载其他组件 缓存更新:在获取新数据时从缓存提供服务
服务器发送事件(推荐用于仪表板):
const eventSource = new EventSource('/api/dashboard/stream');
eventSource.onmessage = (event) => {
const update = JSON.parse(event.data);
updateWidget(update.widgetId, update.data);
};
为不同屏幕尺寸定义断点:
import { Card, Grid, Metric, Text, BadgeDelta, AreaChart } from '@tremor/react';
function QuickDashboard({ data }) {
return (
<Grid numItems={1} numItemsSm={2} numItemsLg={4} className="gap-4">
{/* KPI Cards */}
<Card>
<Text>Total Revenue</Text>
<Metric>$45,231.89</Metric>
<BadgeDelta deltaType="increase">+12.5%</BadgeDelta>
</Card>
<Card>
<Text>Active Users</Text>
<Metric>1,234</Metric>
<BadgeDelta deltaType="decrease">-2.3%</BadgeDelta>
</Card>
{/* Chart Widget */}
<Card className="lg:col-span-2">
<Text>Revenue Trend</Text>
<AreaChart
data={data.revenue}
index="date"
categories={["revenue"]}
valueFormatter={(value) => `$${value.toLocaleString()}`}
/>
</Card>
</Grid>
);
}
完整实现请参见 examples/tremor-dashboard.tsx。
import { Responsive, WidthProvider } from 'react-grid-layout';
import 'react-grid-layout/css/styles.css';
const ResponsiveGridLayout = WidthProvider(Responsive);
function CustomizableDashboard() {
const [layouts, setLayouts] = useState(getStoredLayouts());
return (
<ResponsiveGridLayout
layouts={layouts}
breakpoints={{ lg: 1200, md: 996, sm: 768 }}
cols={{ lg: 12, md: 10, sm: 6 }}
rowHeight={60}
onLayoutChange={(layout, layouts) => {
setLayouts(layouts);
localStorage.setItem('dashboardLayout', JSON.stringify(layouts));
}}
draggableHandle=".widget-header"
>
<div key="kpi1">
<KPIWidget data={kpiData} />
</div>
<div key="chart1">
<ChartWidget data={chartData} />
</div>
<div key="table1">
<TableWidget data={tableData} />
</div>
</ResponsiveGridLayout>
);
}
包含组件目录的完整示例,请参见 examples/customizable-dashboard.tsx。
最适合从服务器到仪表板的单向更新:
function useSSEUpdates(endpoint) {
useEffect(() => {
const eventSource = new EventSource(endpoint);
eventSource.onmessage = (event) => {
const update = JSON.parse(event.data);
// 更新特定组件或所有组件
dispatch({ type: 'UPDATE_WIDGET', payload: update });
};
return () => eventSource.close();
}, [endpoint]);
}
当仪表板需要向服务器发送命令时使用:
const ws = new WebSocket('ws://localhost:3000/dashboard');
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
updateDashboard(data);
};
// 将过滤器更改发送到服务器
ws.send(JSON.stringify({ type: 'FILTER_CHANGE', filters }));
用于不支持 WebSocket/SSE 的环境:
function useSmartPolling(fetchData, interval = 30000) {
const [isPaused, setIsPaused] = useState(false);
useEffect(() => {
if (isPaused || document.hidden) return;
const timer = setInterval(fetchData, interval);
return () => clearInterval(timer);
}, [isPaused, interval]);
// 标签页非活动时暂停
useEffect(() => {
const handleVisibilityChange = () => {
setIsPaused(document.hidden);
};
document.addEventListener('visibilitychange', handleVisibilityChange);
return () => document.removeEventListener('visibilitychange', handleVisibilityChange);
}, []);
}
包含错误处理和重连的详细模式,请参见 references/real-time-updates.md。
function DashboardGrid({ widgets }) {
const [visibleWidgets, setVisibleWidgets] = useState(new Set());
return widgets.map(widget => (
<LazyLoad
key={widget.id}
height={widget.height}
offset={100}
once
placeholder={<WidgetSkeleton />}
>
<Widget {...widget} />
</LazyLoad>
));
}
// 同时获取所有组件数据
const loadDashboard = async () => {
const [kpis, charts, tables] = await Promise.all([
fetchKPIs(),
fetchChartData(),
fetchTableData()
]);
return { kpis, charts, tables };
};
function CachedWidget({ id, fetcher, ttl = 60000 }) {
const cache = useRef({ data: null, timestamp: 0 });
const getData = async () => {
const now = Date.now();
if (cache.current.data && now - cache.current.timestamp < ttl) {
return cache.current.data;
}
const fresh = await fetcher();
cache.current = { data: fresh, timestamp: now };
return fresh;
};
// 在获取新数据时使用缓存数据
return <Widget data={cache.current.data} onRefresh={getData} />;
}
要分析和优化仪表板性能,请运行:
python scripts/optimize-dashboard-performance.py --analyze dashboard-config.json
引用 data-viz 技能以获取图表组件:
// 使用来自 data-viz 技能的图表
import { createChart } from '../data-viz/chart-factory';
const revenueChart = createChart('area', {
data: revenueData,
xAxis: 'date',
yAxis: 'revenue',
theme: dashboardTheme
});
引用 tables 技能以获取数据网格:
// 使用来自 tables 技能的高级表格
import { DataGrid } from '../tables/data-grid';
<DataGrid
data={transactions}
columns={columnDefs}
pagination={true}
sorting={true}
filtering={true}
/>
使用 design-tokens 技能实现一致的主题:
// 来自 design-tokens 技能的仪表板特定令牌
const dashboardTokens = {
'--dashboard-bg': 'var(--color-bg-secondary)',
'--widget-bg': 'var(--color-white)',
'--widget-shadow': 'var(--shadow-lg)',
'--kpi-value-size': 'var(--font-size-4xl)',
'--kpi-trend-positive': 'var(--color-success)',
'--kpi-trend-negative': 'var(--color-error)'
};
可选地使用 forms 技能获取过滤器控件:
// 来自 forms 技能的高级过滤器输入
import { DateRangePicker, MultiSelect } from '../forms/inputs';
<FilterPanel>
<DateRangePicker onChange={handleDateChange} />
<MultiSelect options={categories} onChange={handleCategoryFilter} />
</FilterPanel>
scripts/generate-dashboard-layout.py - 生成响应式网格配置scripts/calculate-kpi-metrics.py - 计算趋势、比较、迷你图scripts/validate-widget-config.py - 验证组件和过滤器配置scripts/optimize-dashboard-performance.py - 分析和优化性能scripts/export-dashboard.py - 将仪表板导出为各种格式直接运行脚本而无需加载到上下文中:
python scripts/calculate-kpi-metrics.py --data metrics.json --period monthly
references/kpi-card-patterns.md - KPI 卡片设计模式和变体references/layout-strategies.md - 网格系统和响应式方法references/real-time-updates.md - WebSocket、SSE 和轮询实现references/filter-coordination.md - 跨组件过滤器同步references/performance-optimization.md - 高级优化技术references/library-guide.md - 详细的 Tremor 和 react-grid-layout 指南examples/sales-dashboard.tsx - 完整的销售分析仪表板examples/monitoring-dashboard.tsx - 带警报的实时监控examples/executive-dashboard.tsx - 精美的执行报告examples/customizable-dashboard.tsx - 带持久化的拖放功能examples/tremor-dashboard.tsx - 快速 Tremor 实现examples/filter-context.tsx - 全局过滤器协调assets/dashboard-templates.json - 预构建的仪表板布局assets/widget-library.json - 组件目录和配置assets/grid-layouts.json - 响应式网格配置assets/kpi-formats.json - 数字格式化规则assets/theme-tokens.json - 仪表板特定的设计令牌有关特定模式和详细实现,请探索上面引用的捆绑资源。
每周安装数
155
代码仓库
GitHub 星标数
305
首次出现
2026 年 1 月 25 日
安全审计
安装于
opencode143
gemini-cli139
codex133
cursor127
github-copilot126
claude-code121
This skill enables the creation of sophisticated dashboard interfaces that aggregate and present data through coordinated widgets including KPI cards, charts, tables, and filters. Dashboards serve as centralized command centers for data-driven decision making, combining multiple component types from other skills (data-viz, tables, design-tokens) into unified analytics experiences with real-time updates, responsive layouts, and interactive filtering.
Activate this skill when:
┌────────────────────────────┐
│ Revenue (This Month) │ ← Label with time period
│ │
│ $1,245,832 │ ← Big number (primary metric)
│ ↑ 15.3% vs last month │ ← Trend indicator with comparison
│ ▂▃▅▆▇█ (sparkline) │ ← Mini visualization
└────────────────────────────┘
Fixed Layout : Designer-defined placement, consistent across users Customizable Grid : User drag-and-drop, resizable widgets, saved layouts Template-Based : Pre-built patterns, industry-specific starting points
For Quick Analytics Dashboard → Use Tremor Pre-built KPI cards, charts, and tables with minimal code:
npm install @tremor/react
For Customizable Dashboard → Use react-grid-layout Drag-and-drop, resizable widgets, user-defined layouts:
npm install react-grid-layout
Implement filter context for cross-widget coordination:
// Dashboard context for shared filters
const DashboardContext = createContext({
filters: { dateRange: null, categories: [] },
setFilters: () => {},
refreshInterval: 30000
});
// Wrap dashboard with provider
<DashboardContext.Provider value={dashboardState}>
<FilterPanel />
<WidgetGrid />
</DashboardContext.Provider>
Parallel Loading : Fetch all widget data simultaneously Lazy Loading : Load visible widgets first, others on scroll Cached Updates : Serve from cache while fetching fresh data
Server-Sent Events (Recommended for Dashboards) :
const eventSource = new EventSource('/api/dashboard/stream');
eventSource.onmessage = (event) => {
const update = JSON.parse(event.data);
updateWidget(update.widgetId, update.data);
};
Define breakpoints for different screen sizes:
import { Card, Grid, Metric, Text, BadgeDelta, AreaChart } from '@tremor/react';
function QuickDashboard({ data }) {
return (
<Grid numItems={1} numItemsSm={2} numItemsLg={4} className="gap-4">
{/* KPI Cards */}
<Card>
<Text>Total Revenue</Text>
<Metric>$45,231.89</Metric>
<BadgeDelta deltaType="increase">+12.5%</BadgeDelta>
</Card>
<Card>
<Text>Active Users</Text>
<Metric>1,234</Metric>
<BadgeDelta deltaType="decrease">-2.3%</BadgeDelta>
</Card>
{/* Chart Widget */}
<Card className="lg:col-span-2">
<Text>Revenue Trend</Text>
<AreaChart
data={data.revenue}
index="date"
categories={["revenue"]}
valueFormatter={(value) => `$${value.toLocaleString()}`}
/>
</Card>
</Grid>
);
}
For complete implementation, see examples/tremor-dashboard.tsx.
import { Responsive, WidthProvider } from 'react-grid-layout';
import 'react-grid-layout/css/styles.css';
const ResponsiveGridLayout = WidthProvider(Responsive);
function CustomizableDashboard() {
const [layouts, setLayouts] = useState(getStoredLayouts());
return (
<ResponsiveGridLayout
layouts={layouts}
breakpoints={{ lg: 1200, md: 996, sm: 768 }}
cols={{ lg: 12, md: 10, sm: 6 }}
rowHeight={60}
onLayoutChange={(layout, layouts) => {
setLayouts(layouts);
localStorage.setItem('dashboardLayout', JSON.stringify(layouts));
}}
draggableHandle=".widget-header"
>
<div key="kpi1">
<KPIWidget data={kpiData} />
</div>
<div key="chart1">
<ChartWidget data={chartData} />
</div>
<div key="table1">
<TableWidget data={tableData} />
</div>
</ResponsiveGridLayout>
);
}
For full example with widget catalog, see examples/customizable-dashboard.tsx.
Best for unidirectional updates from server to dashboard:
function useSSEUpdates(endpoint) {
useEffect(() => {
const eventSource = new EventSource(endpoint);
eventSource.onmessage = (event) => {
const update = JSON.parse(event.data);
// Update specific widget or all widgets
dispatch({ type: 'UPDATE_WIDGET', payload: update });
};
return () => eventSource.close();
}, [endpoint]);
}
Use when dashboard needs to send commands back to server:
const ws = new WebSocket('ws://localhost:3000/dashboard');
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
updateDashboard(data);
};
// Send filter changes to server
ws.send(JSON.stringify({ type: 'FILTER_CHANGE', filters }));
For environments without WebSocket/SSE support:
function useSmartPolling(fetchData, interval = 30000) {
const [isPaused, setIsPaused] = useState(false);
useEffect(() => {
if (isPaused || document.hidden) return;
const timer = setInterval(fetchData, interval);
return () => clearInterval(timer);
}, [isPaused, interval]);
// Pause when tab inactive
useEffect(() => {
const handleVisibilityChange = () => {
setIsPaused(document.hidden);
};
document.addEventListener('visibilitychange', handleVisibilityChange);
return () => document.removeEventListener('visibilitychange', handleVisibilityChange);
}, []);
}
For detailed patterns including error handling and reconnection, see references/real-time-updates.md.
function DashboardGrid({ widgets }) {
const [visibleWidgets, setVisibleWidgets] = useState(new Set());
return widgets.map(widget => (
<LazyLoad
key={widget.id}
height={widget.height}
offset={100}
once
placeholder={<WidgetSkeleton />}
>
<Widget {...widget} />
</LazyLoad>
));
}
// Fetch all widget data simultaneously
const loadDashboard = async () => {
const [kpis, charts, tables] = await Promise.all([
fetchKPIs(),
fetchChartData(),
fetchTableData()
]);
return { kpis, charts, tables };
};
function CachedWidget({ id, fetcher, ttl = 60000 }) {
const cache = useRef({ data: null, timestamp: 0 });
const getData = async () => {
const now = Date.now();
if (cache.current.data && now - cache.current.timestamp < ttl) {
return cache.current.data;
}
const fresh = await fetcher();
cache.current = { data: fresh, timestamp: now };
return fresh;
};
// Use cached data while fetching fresh
return <Widget data={cache.current.data} onRefresh={getData} />;
}
To analyze and optimize dashboard performance, run:
python scripts/optimize-dashboard-performance.py --analyze dashboard-config.json
Reference the data-viz skill for chart widgets:
// Use charts from data-viz skill
import { createChart } from '../data-viz/chart-factory';
const revenueChart = createChart('area', {
data: revenueData,
xAxis: 'date',
yAxis: 'revenue',
theme: dashboardTheme
});
Reference the tables skill for data grids:
// Use advanced tables from tables skill
import { DataGrid } from '../tables/data-grid';
<DataGrid
data={transactions}
columns={columnDefs}
pagination={true}
sorting={true}
filtering={true}
/>
Use the design-tokens skill for consistent theming:
// Dashboard-specific tokens from design-tokens skill
const dashboardTokens = {
'--dashboard-bg': 'var(--color-bg-secondary)',
'--widget-bg': 'var(--color-white)',
'--widget-shadow': 'var(--shadow-lg)',
'--kpi-value-size': 'var(--font-size-4xl)',
'--kpi-trend-positive': 'var(--color-success)',
'--kpi-trend-negative': 'var(--color-error)'
};
Optionally use the forms skill for filter controls:
// Advanced filter inputs from forms skill
import { DateRangePicker, MultiSelect } from '../forms/inputs';
<FilterPanel>
<DateRangePicker onChange={handleDateChange} />
<MultiSelect options={categories} onChange={handleCategoryFilter} />
</FilterPanel>
scripts/generate-dashboard-layout.py - Generate responsive grid configurationsscripts/calculate-kpi-metrics.py - Calculate trends, comparisons, sparklinesscripts/validate-widget-config.py - Validate widget and filter configurationsscripts/optimize-dashboard-performance.py - Analyze and optimize performancescripts/export-dashboard.py - Export dashboards to various formatsRun scripts directly without loading into context:
python scripts/calculate-kpi-metrics.py --data metrics.json --period monthly
references/kpi-card-patterns.md - KPI card design patterns and variationsreferences/layout-strategies.md - Grid systems and responsive approachesreferences/real-time-updates.md - WebSocket, SSE, and polling implementationsreferences/filter-coordination.md - Cross-widget filter synchronizationreferences/performance-optimization.md - Advanced optimization techniquesreferences/library-guide.md - Detailed Tremor and react-grid-layout guidesexamples/sales-dashboard.tsx - Full sales analytics dashboardexamples/monitoring-dashboard.tsx - Real-time monitoring with alertsexamples/executive-dashboard.tsx - Polished executive reportingexamples/customizable-dashboard.tsx - Drag-and-drop with persistenceexamples/tremor-dashboard.tsx - Quick Tremor implementationexamples/filter-context.tsx - Global filter coordinationassets/dashboard-templates.json - Pre-built dashboard layoutsassets/widget-library.json - Widget catalog and configurationsassets/grid-layouts.json - Responsive grid configurationsassets/kpi-formats.json - Number formatting rulesassets/theme-tokens.json - Dashboard-specific design tokensFor specific patterns and detailed implementations, explore the bundled resources referenced above.
Weekly Installs
155
Repository
GitHub Stars
305
First Seen
Jan 25, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
opencode143
gemini-cli139
codex133
cursor127
github-copilot126
claude-code121
Excel财务建模规范与xlsx文件处理指南:专业格式、零错误公式与数据分析
45,000 周安装
dotnet-upgrade:AI 辅助 .NET 项目升级与现代化指南,自动化迁移策略
7,800 周安装
AI功能实现计划生成器 - 资深工程师级技术方案与架构设计指南
7,800 周安装
GitHub Copilot史诗级PRD生成提示 - 专家级产品需求文档模板与AI辅助工具
7,800 周安装
Azure Static Web Apps 完整指南:本地开发、部署与配置详解
7,800 周安装
AI生成YouTube缩略图设计指南 | 高点击率缩略图制作工具与技巧
7,900 周安装
Entity Framework Core 最佳实践指南 - 数据上下文设计、性能优化、迁移与安全
7,800 周安装