| 123456789101112131415161718192021222324252627282930313233343536373839 |
- 'use client';
- import { type ComponentRenderProps } from '@json-render/react';
- import { useData } from '@json-render/react';
- import { getByPath } from '@json-render/core';
- export function Chart({ element }: ComponentRenderProps) {
- const { title, dataPath } = element.props as { title?: string | null; dataPath: string };
- const { data } = useData();
- const chartData = getByPath(data, dataPath) as Array<{ label: string; value: number }> | undefined;
- if (!chartData || !Array.isArray(chartData)) {
- return <div style={{ padding: 20, color: 'var(--muted)' }}>No data</div>;
- }
- const maxValue = Math.max(...chartData.map((d) => d.value));
- return (
- <div>
- {title && <h4 style={{ margin: '0 0 16px', fontSize: 14, fontWeight: 600 }}>{title}</h4>}
- <div style={{ display: 'flex', gap: 8, alignItems: 'flex-end', height: 120 }}>
- {chartData.map((d, i) => (
- <div key={i} style={{ flex: 1, display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 4 }}>
- <div
- style={{
- width: '100%',
- height: `${(d.value / maxValue) * 100}%`,
- background: 'var(--foreground)',
- borderRadius: '4px 4px 0 0',
- minHeight: 4,
- }}
- />
- <span style={{ fontSize: 12, color: 'var(--muted)' }}>{d.label}</span>
- </div>
- ))}
- </div>
- </div>
- );
- }
|