import { Component, memo, type ReactNode } from 'react'; import type { DiagramSpec } from './types'; import { Plane } from './plane'; import { NumberLine } from './numberline'; import { Solid } from './solid'; import { Chart } from './charts'; import { Mapping, Tree, Venn } from './sets'; import { Clock, Fraction, Grid, Groups, Pattern, Table } from './misc'; import { PAPER } from './svg'; import { MathText } from '@/lib/MathText'; export type { DiagramSpec } from './types'; /** * شکلِ جوابِ دستیار. توصیف از بک‌اند می‌آید (rag/services/diagram.py، اعتبارسنجی‌شده) * و اینجا فقط به عنصرِ React/SVG تبدیل می‌شود؛ هیچ HTMLی از مدل وارد صفحه نمی‌شود. * * هر خطایی در رسم (شکلی که کد پیش‌بینی نکرده) فقط همین شکل را پنهان می‌کند؛ * متنِ جواب سرِ جایش می‌ماند. */ function Body({ spec }: { spec: DiagramSpec }): ReactNode { switch (spec.kind) { case 'plane': return ; case 'numberline': return ; case 'solid': return ; case 'bar': case 'linechart': case 'pie': return ; case 'venn': return ; case 'mapping': return ; case 'tree': return ; case 'fraction': return ; case 'grid': return ; case 'groups': return ; case 'clock': return ; case 'table': return ; case 'pattern': return ; default: return null; } } class Guard extends Component<{ children: ReactNode }, { broken: boolean }> { state = { broken: false }; static getDerivedStateFromError() { return { broken: true }; } render() { return this.state.broken ? null : this.props.children; } } function DiagramBase({ spec }: { spec: DiagramSpec }) { return ( {/* dir=ltr: محور و مختصات چپ‌به‌راست‌اند؛ در زمینه‌ی rtl «−۱» به «۱−» برمی‌گشت. برچسب‌های فارسی با unicode-bidi: plaintext جهتِ خودشان را می‌گیرند. */}
{spec.title &&
}
); } export const Diagram = memo(DiagramBase);