chordia-ui 3.9.3 → 3.9.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"ChatMessage.cjs.js","sources":["../src/components/chat/ChartRenderer.jsx","../src/components/chat/ChatMessage.jsx"],"sourcesContent":["\"use client\";\nimport React, { useRef, useCallback } from 'react';\nimport {\n ResponsiveContainer, BarChart, Bar, Cell, LineChart, Line,\n XAxis, YAxis, CartesianGrid, Tooltip, Legend,\n PieChart, Pie, AreaChart, Area,\n} from 'recharts';\n\n// Chordia design system rail colors — ordered for max visual distinction\nconst COLORS = [\n '#5E88B0', // rail-discovery / rail-blue\n '#9B7AA8', // rail-purple / rail-tone\n '#C98A5A', // rail-compliance / rail-orange\n '#7BA89D', // rail-signal-upsell (teal-green)\n '#D17B6B', // rail-coral / rail-signal-churn\n '#6B7C93', // rail-slate / rail-outcome\n '#9B8E6F', // rail-olive / rail-signal-satisfaction\n '#8A9BAF', // rail-quality\n '#B8976A', // rail-teal (warm gold)\n '#A8C76B', // green accent (complementary)\n];\n\n// Shared axis/tooltip/legend styling\nconst AXIS_TICK = { fill: 'var(--text-muted, #666)', fontSize: 12 };\nconst AXIS_LINE = { stroke: 'var(--border, #e0e0e0)' };\nconst GRID_STROKE = 'var(--border, #e0e0e0)';\nconst TOOLTIP_STYLE = {\n // pointerEvents: 'none' is critical — without it, the tooltip steals hover from chart elements\n // and flickers (especially noticeable on pie slices).\n // transition: 'none' disables Recharts' default position-slide animation, so the tooltip\n // snaps to the active point instead of flying in from its previous location.\n wrapperStyle: {\n zIndex: 9999,\n pointerEvents: 'none',\n outline: 'none',\n transition: 'none',\n },\n};\nconst LEGEND_STYLE = { color: 'var(--text-ink, #1e2125)', fontSize: '12px' };\n\n// Custom tooltip with a clean light-bg card layout.\n// Each row has a colored dot (the series color) + dark text — always readable, no contrast tricks.\nconst ChartTooltip = ({ active, payload, label }) => {\n if (!active || !payload || !payload.length) return null;\n return (\n <div\n className=\"chordia-chart-tooltip\"\n style={{\n background: '#ffffff',\n border: '1px solid rgba(52, 58, 64, 0.12)',\n borderRadius: 8,\n boxShadow: '0 8px 24px rgba(15, 23, 42, 0.12), 0 2px 6px rgba(15, 23, 42, 0.06)',\n padding: '10px 12px',\n minWidth: 140,\n maxWidth: 280,\n maxHeight: 280,\n overflowY: 'auto',\n fontSize: 12,\n lineHeight: 1.5,\n color: '#1E2125',\n // Re-enable pointer events on the inner content so the user can scroll with the wheel\n // even though the wrapper above has pointerEvents: 'none' (which prevents hover flicker).\n pointerEvents: 'auto',\n }}\n >\n <style>{`\n .chordia-chart-tooltip::-webkit-scrollbar { width: 8px; }\n .chordia-chart-tooltip::-webkit-scrollbar-track { background: transparent; }\n .chordia-chart-tooltip::-webkit-scrollbar-thumb {\n background: rgba(52, 58, 64, 0.25);\n border-radius: 4px;\n }\n .chordia-chart-tooltip::-webkit-scrollbar-thumb:hover {\n background: rgba(52, 58, 64, 0.4);\n }\n `}</style>\n {label !== undefined && label !== '' && (\n <div\n style={{\n fontSize: 11,\n fontWeight: 600,\n letterSpacing: '0.02em',\n color: '#6B7280',\n textTransform: 'uppercase',\n marginBottom: 6,\n paddingBottom: 6,\n borderBottom: '1px solid rgba(52, 58, 64, 0.08)',\n }}\n >\n {label}\n </div>\n )}\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4 }}>\n {payload.map((entry, i) => {\n const seriesColor = entry.color || entry.payload?.fill || '#9CA3AF';\n return (\n <div\n key={i}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n justifyContent: 'space-between',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, minWidth: 0 }}>\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n background: seriesColor,\n flexShrink: 0,\n }}\n />\n <span\n style={{\n color: '#374151',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {entry.name}\n </span>\n </div>\n <span style={{ color: '#111827', fontWeight: 600, marginLeft: 8 }}>\n {entry.value}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n\n// Smart label: skip x_label if tick values already contain the label text\nconst shouldShowAxisLabel = (label, tickValues) => {\n if (!label) return false;\n const lower = label.toLowerCase();\n // If most ticks contain the label word, it's redundant\n const matches = tickValues.filter(v => String(v).toLowerCase().includes(lower));\n return matches.length < tickValues.length * 0.5;\n};\n\n// --- Export utilities ---\nconst getChartSvg = (containerEl) => {\n const wrappers = Array.from(containerEl.querySelectorAll('.recharts-wrapper'));\n const largestWrapper = wrappers.length\n ? wrappers.reduce((largest, current) => {\n const largestRect = largest.getBoundingClientRect();\n const currentRect = current.getBoundingClientRect();\n return (currentRect.width * currentRect.height) > (largestRect.width * largestRect.height)\n ? current\n : largest;\n })\n : null;\n\n if (largestWrapper) {\n const surface = largestWrapper.querySelector('svg.recharts-surface');\n if (surface) {\n const rect = surface.getBoundingClientRect();\n if (rect.width >= 100 && rect.height >= 100) return surface;\n }\n }\n\n // Fallback: pick the largest SVG so we don't accidentally export icon SVGs.\n const candidates = Array.from(containerEl.querySelectorAll('svg'));\n if (!candidates.length) return null;\n\n const largestSvg = candidates.reduce((largest, current) => {\n const largestRect = largest.getBoundingClientRect();\n const currentRect = current.getBoundingClientRect();\n return (currentRect.width * currentRect.height) > (largestRect.width * largestRect.height)\n ? current\n : largest;\n });\n\n const largestRect = largestSvg.getBoundingClientRect();\n if (largestRect.width < 100 || largestRect.height < 100) return null;\n\n return largestSvg;\n};\n\nconst escapeXml = (value) => String(value)\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\n\nconst buildExportSvg = ({ chartSvg, width, height, legendItems = [] }) => {\n const baseSvg = chartSvg.cloneNode(true);\n const legendLineHeight = 20;\n const legendStartX = 16;\n const legendRightPadding = 16;\n const maxLegendX = width - legendRightPadding;\n const legendRows = [];\n let currentRow = [];\n let currentRowWidth = 0;\n\n legendItems.forEach(({ label, color }) => {\n const itemWidth = Math.max(40, (String(label).length * 7) + 34);\n if (currentRow.length && (legendStartX + currentRowWidth + itemWidth > maxLegendX)) {\n legendRows.push(currentRow);\n currentRow = [];\n currentRowWidth = 0;\n }\n currentRow.push({ label, color, itemWidth });\n currentRowWidth += itemWidth;\n });\n if (currentRow.length) legendRows.push(currentRow);\n\n const exportLegendHeight = legendRows.length ? (legendRows.length * legendLineHeight) + 20 : 0;\n const exportHeight = height + exportLegendHeight;\n\n baseSvg.setAttribute('width', width);\n baseSvg.setAttribute('height', height);\n baseSvg.setAttribute('x', 0);\n baseSvg.setAttribute('y', 0);\n\n const legendMarkup = legendRows.map((row, rowIndex) => {\n let cursorX = legendStartX;\n const legendLineY = height + 20 + (rowIndex * legendLineHeight);\n const rowMarkup = row.map(({ label, color, itemWidth }) => {\n const line = `<line x1=\"${cursorX}\" y1=\"${legendLineY}\" x2=\"${cursorX + 10}\" y2=\"${legendLineY}\" stroke=\"${color}\" stroke-width=\"2\" />`;\n const dot = `<circle cx=\"${cursorX + 5}\" cy=\"${legendLineY}\" r=\"2.5\" fill=\"#fff\" stroke=\"${color}\" stroke-width=\"1.5\" />`;\n const text = `<text x=\"${cursorX + 14}\" y=\"${legendLineY + 4}\" fill=\"#666\" font-size=\"12\">${escapeXml(label)}</text>`;\n cursorX += itemWidth;\n return `${line}${dot}${text}`;\n }).join('');\n return rowMarkup;\n }).join('');\n\n return [\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${exportHeight}\" viewBox=\"0 0 ${width} ${exportHeight}\">`,\n '<style>text { font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif; }</style>',\n '<rect x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" fill=\"#ffffff\" />',\n new XMLSerializer().serializeToString(baseSvg),\n legendMarkup,\n '</svg>',\n ].join('');\n};\n\nconst downloadPng = async (containerEl, title, legendItems = []) => {\n const svg = getChartSvg(containerEl);\n if (!svg) return;\n // Ensure dimensions\n const svgRect = svg.getBoundingClientRect();\n const w = svgRect.width || svg.clientWidth || Number(svg.getAttribute('width')) || 600;\n const h = svgRect.height || svg.clientHeight || Number(svg.getAttribute('height')) || 300;\n const xml = buildExportSvg({ chartSvg: svg, width: w, height: h, legendItems });\n const blob = new Blob([xml], { type: 'image/svg+xml;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n const img = new Image();\n img.onload = () => {\n const canvas = document.createElement('canvas');\n const scale = 2; // retina\n canvas.width = w * scale;\n canvas.height = h * scale;\n const ctx = canvas.getContext('2d');\n ctx.fillStyle = '#ffffff';\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.scale(scale, scale);\n ctx.drawImage(img, 0, 0, w, h);\n URL.revokeObjectURL(url);\n const link = document.createElement('a');\n link.download = `${(title || 'chart').replace(/[^a-z0-9]+/gi, '_')}.png`;\n link.href = canvas.toDataURL('image/png');\n link.click();\n };\n img.src = url;\n};\n\nconst downloadSvg = (containerEl, title, legendItems = []) => {\n const svg = getChartSvg(containerEl);\n if (!svg) return;\n const svgRect = svg.getBoundingClientRect();\n const w = svgRect.width || svg.clientWidth || Number(svg.getAttribute('width')) || 600;\n const h = svgRect.height || svg.clientHeight || Number(svg.getAttribute('height')) || 300;\n\n const xml = buildExportSvg({ chartSvg: svg, width: w, height: h, legendItems });\n const blob = new Blob([xml], { type: 'image/svg+xml;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.download = `${(title || 'chart').replace(/[^a-z0-9]+/gi, '_')}.svg`;\n link.href = url;\n link.click();\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n};\n\nconst copyAsCsv = (series, allXValues) => {\n const header = ['', ...series.map(s => s.name)].join(',');\n const rows = allXValues.map(x => {\n const vals = series.map(s => {\n const match = s.data.find(d => d.x === x);\n return match ? match.y : '';\n });\n return [x, ...vals].join(',');\n });\n const csv = [header, ...rows].join('\\n');\n navigator.clipboard.writeText(csv);\n};\n\nconst ActionBar = ({ onDownloadPng, onCopy, copied }) => (\n <div style={{\n display: 'flex', gap: 6, justifyContent: 'flex-end',\n marginBottom: 8, opacity: 0.7, transition: 'opacity 0.15s',\n }}>\n <button onClick={onCopy} title=\"Copy data as CSV\" style={{\n background: 'none', border: '1px solid var(--border, #e0e0e0)',\n borderRadius: 'var(--radius-sm, 4px)', padding: '3px 8px',\n fontSize: 11, color: 'var(--text-muted, #666)', cursor: 'pointer',\n display: 'flex', alignItems: 'center', gap: 4,\n }}>\n {copied ? '✓ Copied' : '📋 CSV'}\n </button>\n <button onClick={onDownloadPng} title=\"Download as PNG\" style={{\n background: 'none', border: '1px solid var(--border, #e0e0e0)',\n borderRadius: 'var(--radius-sm, 4px)', padding: '3px 8px',\n fontSize: 11, color: 'var(--text-muted, #666)', cursor: 'pointer',\n display: 'flex', alignItems: 'center', gap: 4,\n }}>\n 📥 PNG\n </button>\n </div>\n);\n\nconst ChartRenderer = ({ chartType, title, xLabel, yLabel, series, compact = false }) => {\n const chartRef = useRef(null);\n const [copied, setCopied] = React.useState(false);\n\n if (!series || series.length === 0) return null;\n\n // Transform: merge all series into [{x, series1: val, series2: val}, ...]\n const allXValues = [...new Set(series.flatMap(s => s.data.map(d => d.x)))];\n const chartData = allXValues.map(x => {\n const point = { x };\n series.forEach(s => {\n const match = s.data.find(d => d.x === x);\n point[s.name] = match ? match.y : null;\n });\n return point;\n });\n\n const seriesNames = series.map(s => s.name);\n const isSingleSeries = seriesNames.length === 1;\n\n // Determine if axis labels are redundant\n const showXLabel = shouldShowAxisLabel(xLabel, allXValues);\n\n // Check if x-axis labels are long (rotate them)\n const maxTickLen = Math.max(...allXValues.map(v => String(v).length));\n const rotateXTicks = maxTickLen > 12 || allXValues.length > 8;\n\n // Bottom margin: stack space for tick labels + the axis label so they don't overlap\n const xTickSpace = rotateXTicks ? 40 : 5;\n const xLabelSpace = showXLabel ? 25 : 0;\n const bottomMargin = xTickSpace + xLabelSpace;\n\n // Estimate legend rows so we can reserve enough vertical space for it. Recharts\n // doesn't auto-detect wrapping, so a multi-row legend collides with the x-axis label.\n // Conservative estimate: ~4 items per row.\n const legendRows = isSingleSeries ? 0 : Math.max(1, Math.ceil(seriesNames.length / 4));\n const legendHeight = legendRows > 0 ? legendRows * 24 + (showXLabel ? 24 : 12) : 0;\n\n // Bump chart container height so the wrapped legend gets its own space below the chart\n // SVG instead of overlapping the x-axis label.\n // In compact mode (e.g. AskCompass panel), shrink the base height so charts feel proportional\n // to the smaller surface they're rendered in.\n const baseChartHeight = compact ? 240 : 300;\n const chartHeight = baseChartHeight + Math.max(0, (legendRows - 1) * 28);\n\n // Always keep a gap between the x-axis (or its label) and the legend.\n // Extra padding when an x-label is also present so all three layers (ticks → label → legend) breathe.\n // zIndex: 0 ensures the legend never paints over the tooltip (which is zIndex: 1000).\n const legendPaddingTop = showXLabel ? 24 : 12;\n const legendWrapperStyle = { ...LEGEND_STYLE, paddingTop: legendPaddingTop, zIndex: 0 };\n\n const containerStyle = {\n background: 'var(--paper-elevated, #fff)',\n border: '1px solid var(--border, #e0e0e0)',\n borderRadius: 'var(--radius-md, 8px)',\n padding: '16px',\n marginBottom: '16px',\n };\n\n const titleStyle = {\n color: 'var(--text-strong, #1e2125)',\n fontSize: '14px',\n fontWeight: '600',\n marginBottom: '12px',\n };\n\n const xAxisProps = {\n dataKey: 'x',\n tick: rotateXTicks\n ? { fill: 'var(--text-muted, #666)', fontSize: 11, angle: -35, textAnchor: 'end' }\n : AXIS_TICK,\n axisLine: AXIS_LINE,\n tickLine: AXIS_LINE,\n ...(showXLabel ? {\n label: {\n value: xLabel,\n position: 'insideBottom',\n // Push label below rotated ticks (which take ~40px) when present\n offset: rotateXTicks ? -45 : -10,\n style: { textAnchor: 'middle', fill: 'var(--text-muted, #666)' },\n },\n } : {}),\n };\n\n const yAxisProps = {\n tick: AXIS_TICK,\n axisLine: AXIS_LINE,\n tickLine: AXIS_LINE,\n ...(yLabel ? {\n width: 72,\n label: {\n value: yLabel,\n angle: -90,\n position: 'insideLeft',\n offset: 10,\n style: { textAnchor: 'middle', fill: 'var(--text-muted, #666)' },\n },\n } : {}),\n };\n\n const renderChart = () => {\n switch (chartType) {\n case 'bar':\n return (\n <ResponsiveContainer width=\"100%\" height={chartHeight}>\n <BarChart data={chartData} margin={{ top: 5, right: 30, left: yLabel ? 10 : 20, bottom: bottomMargin }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={GRID_STROKE} />\n <XAxis {...xAxisProps} />\n <YAxis {...yAxisProps} />\n {!isSingleSeries && <Legend wrapperStyle={legendWrapperStyle} height={legendHeight} />}\n {seriesNames.map((name, i) => (\n <Bar key={name} dataKey={name} fill={COLORS[i % COLORS.length]} radius={[2, 2, 0, 0]} isAnimationActive={false}>\n {isSingleSeries && chartData.map((_, idx) => (\n <Cell key={idx} fill={COLORS[idx % COLORS.length]} />\n ))}\n </Bar>\n ))}\n <Tooltip wrapperStyle={TOOLTIP_STYLE.wrapperStyle} content={<ChartTooltip />} cursor={{ fill: 'rgba(94, 136, 176, 0.06)', stroke: 'rgba(52, 58, 64, 0.18)', strokeDasharray: '3 3' }} isAnimationActive={false} animationDuration={0} />\n </BarChart>\n </ResponsiveContainer>\n );\n\n case 'horizontal_bar': {\n // Horizontal bar: swap X/Y, use YAxis for categories\n return (\n <ResponsiveContainer width=\"100%\" height={Math.max(compact ? 240 : 300, chartData.length * (compact ? 32 : 40))}>\n <BarChart data={chartData} layout=\"vertical\" margin={{ top: 5, right: 30, left: 100, bottom: 5 }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={GRID_STROKE} />\n <XAxis type=\"number\" tick={AXIS_TICK} axisLine={AXIS_LINE} tickLine={AXIS_LINE}\n {...(yLabel ? { label: { value: yLabel, position: 'insideBottom', offset: -5, style: { textAnchor: 'middle', fill: 'var(--text-muted, #666)' } } } : {})}\n />\n <YAxis type=\"category\" dataKey=\"x\" tick={{ fill: 'var(--text-muted, #666)', fontSize: 11 }} width={90} axisLine={AXIS_LINE} tickLine={AXIS_LINE} />\n {!isSingleSeries && <Legend wrapperStyle={legendWrapperStyle} height={legendHeight} />}\n {seriesNames.map((name, i) => (\n <Bar key={name} dataKey={name} fill={COLORS[i % COLORS.length]} radius={[0, 2, 2, 0]} isAnimationActive={false}>\n {isSingleSeries && chartData.map((_, idx) => (\n <Cell key={idx} fill={COLORS[idx % COLORS.length]} />\n ))}\n </Bar>\n ))}\n <Tooltip wrapperStyle={TOOLTIP_STYLE.wrapperStyle} content={<ChartTooltip />} cursor={{ fill: 'rgba(94, 136, 176, 0.06)', stroke: 'rgba(52, 58, 64, 0.18)', strokeDasharray: '3 3' }} isAnimationActive={false} animationDuration={0} />\n </BarChart>\n </ResponsiveContainer>\n );\n }\n\n case 'line':\n return (\n <ResponsiveContainer width=\"100%\" height={chartHeight}>\n <LineChart data={chartData} margin={{ top: 5, right: 30, left: yLabel ? 10 : 20, bottom: bottomMargin }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={GRID_STROKE} />\n <XAxis {...xAxisProps} />\n <YAxis {...yAxisProps} />\n <Legend wrapperStyle={legendWrapperStyle} height={legendHeight} />\n {seriesNames.map((name, i) => (\n <Line key={name} type=\"monotone\" dataKey={name}\n stroke={COLORS[i % COLORS.length]} strokeWidth={2}\n dot={{ r: 4, fill: COLORS[i % COLORS.length] }}\n activeDot={{ r: 6, fill: COLORS[i % COLORS.length] }}\n isAnimationActive={false}\n />\n ))}\n <Tooltip wrapperStyle={TOOLTIP_STYLE.wrapperStyle} content={<ChartTooltip />} cursor={{ fill: 'rgba(94, 136, 176, 0.06)', stroke: 'rgba(52, 58, 64, 0.18)', strokeDasharray: '3 3' }} isAnimationActive={false} animationDuration={0} />\n </LineChart>\n </ResponsiveContainer>\n );\n\n case 'area':\n return (\n <ResponsiveContainer width=\"100%\" height={chartHeight}>\n <AreaChart data={chartData} margin={{ top: 5, right: 30, left: yLabel ? 10 : 20, bottom: bottomMargin }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={GRID_STROKE} />\n <XAxis {...xAxisProps} />\n <YAxis {...yAxisProps} />\n <Legend wrapperStyle={legendWrapperStyle} height={legendHeight} />\n {seriesNames.map((name, i) => (\n <Area key={name} type=\"monotone\" dataKey={name}\n stroke={COLORS[i % COLORS.length]} strokeWidth={2}\n fill={COLORS[i % COLORS.length]} fillOpacity={0.15}\n isAnimationActive={false}\n />\n ))}\n <Tooltip wrapperStyle={TOOLTIP_STYLE.wrapperStyle} content={<ChartTooltip />} cursor={{ fill: 'rgba(94, 136, 176, 0.06)', stroke: 'rgba(52, 58, 64, 0.18)', strokeDasharray: '3 3' }} isAnimationActive={false} animationDuration={0} />\n </AreaChart>\n </ResponsiveContainer>\n );\n\n case 'pie': {\n // Pie uses first series only\n const pieData = series[0].data.map((d, i) => ({\n name: d.x,\n value: d.y,\n fill: COLORS[i % COLORS.length],\n }));\n const RADIAN = Math.PI / 180;\n const renderLabel = ({ cx, cy, midAngle, innerRadius, outerRadius, percent, name }) => {\n const radius = outerRadius + 20;\n const x = cx + radius * Math.cos(-midAngle * RADIAN);\n const y = cy + radius * Math.sin(-midAngle * RADIAN);\n if (percent < 0.04) return null;\n return (\n <text x={x} y={y} fill=\"var(--text-ink, #1e2125)\" fontSize={11}\n textAnchor={x > cx ? 'start' : 'end'} dominantBaseline=\"central\">\n {name} ({(percent * 100).toFixed(0)}%)\n </text>\n );\n };\n return (\n <ResponsiveContainer width=\"100%\" height={compact ? 260 : 320}>\n <PieChart margin={{ top: 16, right: 16, bottom: 16, left: 16 }}>\n <Pie data={pieData} cx={compact ? \"42%\" : \"38%\"} cy=\"50%\" outerRadius={compact ? 88 : 110}\n dataKey=\"value\" label={renderLabel} labelLine={{ stroke: 'var(--text-muted, #666)' }}\n isAnimationActive={false}>\n {pieData.map((entry, i) => (\n <Cell key={i} fill={entry.fill} />\n ))}\n </Pie>\n <Tooltip wrapperStyle={TOOLTIP_STYLE.wrapperStyle} content={<ChartTooltip />} cursor={{ fill: 'rgba(94, 136, 176, 0.06)', stroke: 'rgba(52, 58, 64, 0.18)', strokeDasharray: '3 3' }} isAnimationActive={false} animationDuration={0} />\n </PieChart>\n </ResponsiveContainer>\n );\n }\n\n case 'metric': {\n const s = series[0];\n const current = s.data[0];\n const previous = s.data.length > 1 ? s.data[1] : null;\n const value = current.y;\n const unit = current.x || '';\n const hasTrend = previous !== null;\n const change = hasTrend ? value - previous.y : 0;\n const pctChange = hasTrend && previous.y !== 0 ? ((change / Math.abs(previous.y)) * 100) : 0;\n const isPositive = change > 0;\n const isNegative = change < 0;\n const trendColor = isPositive ? '#7BA89D' : isNegative ? '#D17B6B' : 'var(--text-muted, #666)';\n const trendArrow = isPositive ? '↑' : isNegative ? '↓' : '→';\n\n // Format large numbers nicely\n const fmt = (n) => {\n if (Number.isInteger(n) && Math.abs(n) >= 1000) return n.toLocaleString();\n if (typeof n === 'number') return n % 1 === 0 ? n.toString() : n.toFixed(n < 10 ? 2 : 1);\n return String(n);\n };\n\n return (\n <div style={{ display: 'flex', alignItems: 'baseline', gap: 12, padding: '8px 0' }}>\n <div style={{\n fontSize: '36px', fontWeight: 700, lineHeight: 1,\n color: 'var(--text-strong, #1e2125)',\n fontVariantNumeric: 'tabular-nums',\n }}>\n {fmt(value)}\n </div>\n {unit && (\n <div style={{ fontSize: '14px', color: 'var(--text-muted, #666)', fontWeight: 500 }}>\n {unit}\n </div>\n )}\n {hasTrend && (\n <div style={{\n display: 'flex', alignItems: 'center', gap: 4,\n fontSize: '13px', fontWeight: 600, color: trendColor,\n background: isPositive ? 'rgba(123,168,157,0.12)' : isNegative ? 'rgba(209,123,107,0.12)' : 'rgba(128,128,128,0.08)',\n padding: '3px 8px', borderRadius: 'var(--radius-sm, 4px)',\n }}>\n <span>{trendArrow}</span>\n <span>{fmt(Math.abs(change))} ({Math.abs(pctChange).toFixed(1)}%)</span>\n </div>\n )}\n {hasTrend && (\n <div style={{ fontSize: '11px', color: 'var(--text-faint, #999)' }}>\n vs {previous.x || 'previous'}\n </div>\n )}\n </div>\n );\n }\n\n default:\n return <div style={{ color: 'var(--text-muted)', fontSize: 12, padding: 8 }}>Unsupported chart type: {chartType}</div>;\n }\n };\n\n const showLegendInExport = chartType === 'line'\n || chartType === 'area'\n || ((chartType === 'bar' || chartType === 'horizontal_bar') && !isSingleSeries);\n\n const exportLegendItems = showLegendInExport\n ? seriesNames.map((name, i) => ({ label: name, color: COLORS[i % COLORS.length] }))\n : [];\n\n const handleDownloadPng = useCallback(() => {\n if (chartRef.current) downloadPng(chartRef.current, title, exportLegendItems);\n }, [title, exportLegendItems]);\n\n const handleCopy = useCallback(() => {\n copyAsCsv(series, allXValues);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }, [series, allXValues]);\n\n const showActions = chartType !== 'metric';\n\n return (\n <div style={containerStyle}>\n {title && <div style={titleStyle}>{title}</div>}\n {showActions && <ActionBar onDownloadPng={handleDownloadPng} onCopy={handleCopy} copied={copied} />}\n <div ref={chartRef}>\n {renderChart()}\n </div>\n </div>\n );\n};\n\nexport default ChartRenderer;\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { Wrench, Copy, Check, PanelRightOpen } from \"lucide-react\";\n\n/**\n * Lightweight Markdown Renderer\n * Handles: code blocks, inline code, bold, italic, links, lists, headers, horizontal rules, file paths\n */\nconst MarkdownRenderer = ({ content, onCodeBlockClick, onFilePathClick }) => {\n const [copiedBlocks, setCopiedBlocks] = useState(new Set());\n\n const copyToClipboard = async (text, blockId) => {\n try {\n await navigator.clipboard.writeText(text);\n setCopiedBlocks(prev => new Set([...prev, blockId]));\n setTimeout(() => {\n setCopiedBlocks(prev => {\n const newSet = new Set(prev);\n newSet.delete(blockId);\n return newSet;\n });\n }, 2000);\n } catch (err) {\n console.error('Failed to copy text:', err);\n }\n };\n\n const renderCodeBlock = (code, language, blockId) => {\n const isCopied = copiedBlocks.has(blockId);\n \n return (\n <div \n key={blockId}\n style={{\n position: 'relative',\n marginBottom: '16px',\n borderRadius: '8px',\n background: 'var(--ink, #1E2125)',\n border: '1px solid var(--border-subtle, rgba(52,58,64,0.08))',\n overflow: 'hidden',\n }}\n >\n {/* Header with language and copy button */}\n <div style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '8px 12px',\n background: 'rgba(255,255,255,0.05)',\n borderBottom: '1px solid rgba(255,255,255,0.1)',\n }}>\n <span style={{\n fontSize: '11px',\n color: 'rgba(255,255,255,0.7)',\n fontFamily: 'var(--font-mono, monospace)',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n }}>\n {language || 'code'}\n </span>\n <button\n onClick={() => copyToClipboard(code, blockId)}\n style={{\n background: 'none',\n border: 'none',\n color: 'rgba(255,255,255,0.7)',\n cursor: 'pointer',\n padding: '4px',\n borderRadius: '4px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n fontSize: '11px',\n transition: 'all 0.15s ease',\n }}\n onMouseEnter={(e) => {\n e.target.style.background = 'rgba(255,255,255,0.1)';\n e.target.style.color = 'rgba(255,255,255,0.9)';\n }}\n onMouseLeave={(e) => {\n e.target.style.background = 'none';\n e.target.style.color = 'rgba(255,255,255,0.7)';\n }}\n >\n {isCopied ? <Check size={12} /> : <Copy size={12} />}\n {isCopied ? 'Copied!' : 'Copy'}\n </button>\n {onCodeBlockClick && (\n <button\n onClick={() => onCodeBlockClick({ code, language })}\n style={{\n background: 'none',\n border: 'none',\n color: 'rgba(255,255,255,0.7)',\n cursor: 'pointer',\n padding: '4px',\n borderRadius: '4px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n fontSize: '11px',\n transition: 'all 0.15s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'rgba(255,255,255,0.1)';\n e.currentTarget.style.color = 'rgba(255,255,255,0.9)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'none';\n e.currentTarget.style.color = 'rgba(255,255,255,0.7)';\n }}\n >\n <PanelRightOpen size={12} />\n Canvas\n </button>\n )}\n </div>\n {/* Code content */}\n <pre style={{\n margin: 0,\n padding: '12px',\n fontFamily: 'var(--font-mono, monospace)',\n fontSize: '13px',\n lineHeight: 1.4,\n color: 'rgba(255,255,255,0.95)',\n overflow: 'auto',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n }}>\n {code}\n </pre>\n </div>\n );\n };\n\n const parseMarkdown = (text) => {\n const elements = [];\n const lines = text.split('\\n');\n let i = 0;\n let blockId = 0;\n\n while (i < lines.length) {\n const line = lines[i];\n \n // Code blocks (```language)\n if (line.trim().startsWith('```')) {\n const language = line.trim().slice(3);\n let codeLines = [];\n i++;\n \n while (i < lines.length && !lines[i].trim().startsWith('```')) {\n codeLines.push(lines[i]);\n i++;\n }\n \n if (i < lines.length) i++; // Skip closing ```\n \n elements.push(renderCodeBlock(codeLines.join('\\n'), language, `code-${blockId++}`));\n continue;\n }\n \n // Headers\n if (line.startsWith('#')) {\n const level = line.match(/^#+/)[0].length;\n const text = line.slice(level).trim();\n const HeaderTag = level === 1 ? 'h2' : level === 2 ? 'h3' : level === 3 ? 'h4' : 'h5';\n \n elements.push(\n React.createElement(HeaderTag, {\n key: `header-${i}`,\n style: {\n fontSize: level === 1 ? '18px' : level === 2 ? '16px' : '14px',\n fontWeight: 720,\n color: 'var(--text-strong, rgba(30,33,37,0.92))',\n marginTop: elements.length > 0 ? '20px' : '0',\n marginBottom: '8px',\n lineHeight: 1.3,\n }\n }, text)\n );\n i++;\n continue;\n }\n \n // Horizontal rule\n if (line.trim() === '---' || line.trim() === '***') {\n elements.push(\n <hr key={`hr-${i}`} style={{\n border: 'none',\n borderTop: '1px solid var(--border-subtle, rgba(52,58,64,0.08))',\n margin: '16px 0',\n }} />\n );\n i++;\n continue;\n }\n \n // Lists\n if (line.match(/^(\\s*)([-*+]|\\d+\\.)\\s/)) {\n const listItems = [];\n const isOrdered = /^\\s*\\d+\\./.test(line);\n \n while (i < lines.length && (lines[i].match(/^(\\s*)([-*+]|\\d+\\.)\\s/) || lines[i].trim() === '')) {\n if (lines[i].trim() !== '') {\n const match = lines[i].match(/^(\\s*)([-*+]|\\d+\\.)\\s(.*)$/);\n if (match) {\n listItems.push(match[3]);\n }\n }\n i++;\n }\n \n const ListTag = isOrdered ? 'ol' : 'ul';\n elements.push(\n React.createElement(ListTag, {\n key: `list-${i}`,\n style: {\n margin: '8px 0',\n paddingLeft: '20px',\n color: 'var(--text-strong, rgba(30,33,37,0.92))',\n }\n }, listItems.map((item, idx) => \n React.createElement('li', {\n key: `item-${idx}`,\n style: { marginBottom: '4px' }\n }, parseInlineMarkdownWithContext(item))\n ))\n );\n continue;\n }\n \n // Tables (lines starting with |)\n if (line.trim().startsWith('|') && line.trim().endsWith('|')) {\n const tableRows = [];\n while (i < lines.length && lines[i].trim().startsWith('|') && lines[i].trim().endsWith('|')) {\n tableRows.push(lines[i]);\n i++;\n }\n \n if (tableRows.length >= 2) {\n // Parse cells from each row\n const parseCells = (row) => row.trim().slice(1, -1).split('|').map(c => c.trim());\n const headerCells = parseCells(tableRows[0]);\n \n // Check if row 1 is a separator (---|---|---)\n const isSeparator = (row) => parseCells(row).every(c => /^[-:]+$/.test(c));\n const hasSeparator = tableRows.length >= 2 && isSeparator(tableRows[1]);\n const bodyStart = hasSeparator ? 2 : 1;\n \n // Parse alignment from separator\n const alignments = hasSeparator ? parseCells(tableRows[1]).map(c => {\n if (c.startsWith(':') && c.endsWith(':')) return 'center';\n if (c.endsWith(':')) return 'right';\n return 'left';\n }) : headerCells.map(() => 'left');\n \n const cellStyle = {\n padding: '6px 12px',\n borderBottom: '1px solid var(--border-subtle, rgba(52,58,64,0.08))',\n fontSize: '13px',\n lineHeight: 1.5,\n color: 'var(--text-strong, rgba(30,33,37,0.92))',\n // Override the chat bubble's inherited `word-break: break-word`\n // so cells size to natural min-content; the wrapper's\n // overflow-x: auto handles wide tables via horizontal scroll\n // instead of collapsing columns char-by-char on long URLs.\n wordBreak: 'normal',\n overflowWrap: 'normal',\n };\n \n elements.push(\n <div key={`table-${i}`} style={{ overflowX: 'auto', margin: '8px 0' }}>\n <table style={{\n borderCollapse: 'collapse',\n width: '100%',\n border: '1px solid var(--border-subtle, rgba(52,58,64,0.08))',\n borderRadius: '6px',\n overflow: 'hidden',\n }}>\n {hasSeparator && (\n <thead>\n <tr style={{ background: 'var(--hover-warm-subtle, rgba(231,212,162,0.08))' }}>\n {headerCells.map((cell, ci) => (\n <th key={ci} style={{ ...cellStyle, fontWeight: 660, textAlign: alignments[ci] || 'left', whiteSpace: 'nowrap' }}>\n {parseInlineMarkdownWithContext(cell)}\n </th>\n ))}\n </tr>\n </thead>\n )}\n <tbody>\n {(hasSeparator ? tableRows.slice(bodyStart) : tableRows).map((row, ri) => (\n <tr key={ri} style={{ background: ri % 2 === 1 ? 'var(--hover-warm-subtle, rgba(231,212,162,0.04))' : 'transparent' }}>\n {parseCells(row).map((cell, ci) => (\n <td key={ci} style={{ ...cellStyle, textAlign: alignments[ci] || 'left' }}>\n {parseInlineMarkdownWithContext(cell)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n }\n continue;\n }\n \n // Regular paragraphs\n if (line.trim()) {\n const paragraph = [];\n while (i < lines.length && lines[i].trim() && !lines[i].match(/^(#|```|---|\\*\\*\\*|(\\s*)([-*+]|\\d+\\.)\\s)/) && !(lines[i].trim().startsWith('|') && lines[i].trim().endsWith('|'))) {\n paragraph.push(lines[i]);\n i++;\n }\n \n if (paragraph.length > 0) {\n elements.push(\n <p key={`p-${i}`} style={{ \n margin: '8px 0',\n lineHeight: 1.6,\n color: 'var(--text-strong, rgba(30,33,37,0.92))',\n }}>\n {parseInlineMarkdownWithContext(paragraph.join(' '))}\n </p>\n );\n }\n } else {\n i++;\n }\n }\n \n return elements;\n };\n\n const parseInlineMarkdown = (text) => {\n const elements = [];\n let remaining = text;\n let key = 0;\n\n while (remaining.length > 0) {\n // File paths (before other patterns to catch them first)\n if (onFilePathClick) {\n // Match file paths: containing /src/, /components/, /packages/ or ending in common extensions\n const filePathMatch = remaining.match(/^([^\\s`*\\[]+(?:\\/src\\/|\\/components\\/|\\/packages\\/)[^\\s`*\\[]*|[^\\s`*\\[]*\\.(ts|tsx|js|jsx|py|css|scss|sass|json|md|yaml|yml|html|xml|sh|sql|go|rs|php|java|c|cpp|h|hpp)(?:\\b|$))/);\n if (filePathMatch) {\n const filePath = filePathMatch[1];\n elements.push(\n <span\n key={`file-path-${key++}`}\n onClick={() => onFilePathClick(filePath)}\n style={{\n color: 'var(--rail-discovery, #5E88B0)',\n textDecoration: 'underline',\n textDecorationStyle: 'dotted',\n textUnderlineOffset: '2px',\n cursor: 'pointer',\n fontFamily: 'var(--font-mono, monospace)',\n fontSize: '13px',\n transition: 'all 0.15s ease',\n ':hover': {\n background: 'var(--hover-warm-subtle, rgba(231,212,162,0.08))',\n textDecoration: 'underline',\n textDecorationStyle: 'solid'\n }\n }}\n onMouseEnter={(e) => {\n e.target.style.background = 'var(--hover-warm-subtle, rgba(231,212,162,0.08))';\n e.target.style.textDecorationStyle = 'solid';\n }}\n onMouseLeave={(e) => {\n e.target.style.background = 'none';\n e.target.style.textDecorationStyle = 'dotted';\n }}\n >\n {filePath}\n </span>\n );\n remaining = remaining.slice(filePathMatch[0].length);\n continue;\n }\n }\n\n // Inline code\n const inlineCodeMatch = remaining.match(/^`([^`]+)`/);\n if (inlineCodeMatch) {\n elements.push(\n <code key={`inline-code-${key++}`} style={{\n background: 'var(--hover-warm-subtle, rgba(231,212,162,0.08))',\n border: '1px solid var(--border-subtle, rgba(52,58,64,0.08))',\n borderRadius: '3px',\n padding: '2px 4px',\n fontFamily: 'var(--font-mono, monospace)',\n fontSize: '12px',\n color: 'var(--text-strong, rgba(30,33,37,0.92))',\n }}>\n {inlineCodeMatch[1]}\n </code>\n );\n remaining = remaining.slice(inlineCodeMatch[0].length);\n continue;\n }\n\n // Bold\n const boldMatch = remaining.match(/^\\*\\*([^*]+)\\*\\*/);\n if (boldMatch) {\n elements.push(\n <strong key={`bold-${key++}`} style={{\n fontWeight: 720,\n color: 'var(--text-strong, rgba(30,33,37,0.92))',\n }}>\n {boldMatch[1]}\n </strong>\n );\n remaining = remaining.slice(boldMatch[0].length);\n continue;\n }\n\n // Italic\n const italicMatch = remaining.match(/^\\*([^*]+)\\*/);\n if (italicMatch) {\n elements.push(\n <em key={`italic-${key++}`} style={{\n fontStyle: 'italic',\n color: 'var(--text-strong, rgba(30,33,37,0.92))',\n }}>\n {italicMatch[1]}\n </em>\n );\n remaining = remaining.slice(italicMatch[0].length);\n continue;\n }\n\n // Links\n const linkMatch = remaining.match(/^\\[([^\\]]+)\\]\\(([^)]+)\\)/);\n if (linkMatch) {\n const linkText = linkMatch[1];\n const linkHref = linkMatch[2];\n const isViewButton = linkText === 'View';\n const viewButtonStyle = {\n display: 'inline-flex',\n alignItems: 'center',\n padding: '3px 10px',\n background: 'var(--rail-discovery, #5E88B0)',\n color: '#fff',\n textDecoration: 'none',\n borderRadius: '4px',\n fontSize: '12px',\n fontWeight: 600,\n whiteSpace: 'nowrap',\n cursor: 'pointer',\n };\n const defaultLinkStyle = {\n color: 'var(--rail-discovery, #5E88B0)',\n textDecoration: 'underline',\n textUnderlineOffset: '2px',\n };\n elements.push(\n <a key={`link-${key++}`}\n href={linkHref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={isViewButton ? viewButtonStyle : defaultLinkStyle}>\n {linkText}\n </a>\n );\n remaining = remaining.slice(linkMatch[0].length);\n continue;\n }\n\n // Regular text — consume up to the next special char, or consume the special char itself if no pattern matched\n const nextSpecialChar = remaining.search(/[`*\\[]/);\n if (nextSpecialChar === -1) {\n // No more special chars — add rest and break\n elements.push(remaining);\n break;\n } else if (nextSpecialChar === 0) {\n // Special char at position 0 but no pattern matched — consume it as text\n elements.push(remaining[0]);\n remaining = remaining.slice(1);\n } else {\n elements.push(remaining.slice(0, nextSpecialChar));\n remaining = remaining.slice(nextSpecialChar);\n }\n }\n\n return elements.length === 1 && typeof elements[0] === 'string' ? elements[0] : elements;\n };\n\n // Helper to pass context to parseInlineMarkdown calls within parseMarkdown\n const parseInlineMarkdownWithContext = (text) => parseInlineMarkdown(text);\n \n return <div>{parseMarkdown(content)}</div>;\n};\n\n/**\n * ChatMessage Component\n * Individual message in chat interface with markdown support for assistant messages\n */\nexport default function ChatMessage({ \n role, \n content, \n html, \n timestamp, \n toolBadges, \n isStreaming,\n onCodeBlockClick,\n onFilePathClick,\n}) {\n const isUser = role === \"user\";\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: isUser ? \"flex-end\" : \"flex-start\",\n marginBottom: \"16px\",\n width: \"100%\",\n maxWidth: \"100%\",\n }}\n >\n {/* Role label */}\n <div\n style={{\n fontSize: \"var(--text-sm, 11px)\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n marginBottom: \"6px\",\n fontWeight: 650,\n letterSpacing: \"0.02em\",\n }}\n >\n {isUser ? \"You\" : \"Compass\"}\n {isStreaming && !isUser && (\n <span style={{ marginLeft: \"6px\", color: \"var(--rail-purple, #9B7AA8)\" }}>\n ●\n </span>\n )}\n </div>\n\n {/* Tool badges */}\n {toolBadges && toolBadges.length > 0 && (\n <div style={{ \n marginBottom: \"8px\", \n display: \"flex\", \n flexWrap: \"wrap\", \n gap: \"4px\",\n maxWidth: \"75%\" \n }}>\n {toolBadges.map((badge, index) => (\n <span \n key={badge.id || index}\n style={{\n display: \"inline-block\",\n fontSize: \"11px\",\n padding: \"2px 8px\",\n borderRadius: \"6px\",\n background: \"var(--paper-elevated, rgba(255,255,255,0.82))\",\n border: `1px solid ${\n badge.pending \n ? \"var(--rail-discovery, #5A8CC0)\" \n : badge.success !== false \n ? \"var(--state-present, #5CB85C)\" \n : \"var(--rail-signal-churn, #C98A5A)\"\n }`,\n color: badge.pending \n ? \"var(--rail-discovery, #5A8CC0)\" \n : badge.success !== false \n ? \"var(--state-present, #5CB85C)\" \n : \"var(--rail-signal-churn, #C98A5A)\",\n }}\n >\n <Wrench size={10} style={{ marginRight: 3, verticalAlign: \"middle\" }} />\n {badge.name}\n {badge.pending ? \"...\" : badge.success !== false ? \" ✓\" : \" ✗\"}\n </span>\n ))}\n </div>\n )}\n\n {/* Message bubble */}\n <div\n style={{\n width: \"100%\",\n maxWidth: \"100%\",\n padding: \"12px 16px\",\n borderRadius: \"var(--radius-lg, 12px)\",\n background: isUser\n ? \"var(--card-customer, rgba(94,136,176,0.08))\"\n : \"var(--paper-elevated, rgba(255,255,255,0.82))\",\n border: isUser\n ? \"1px solid var(--border-subtle, rgba(52,58,64,0.08))\"\n : \"1px solid var(--border, rgba(52,58,64,0.12))\",\n fontSize: \"var(--text-base, 14px)\",\n lineHeight: 1.6,\n color: \"var(--text-strong, rgba(30,33,37,0.92))\",\n wordBreak: \"break-word\",\n }}\n >\n {html ? (\n <div dangerouslySetInnerHTML={{ __html: html }} />\n ) : isUser ? (\n // User messages stay plain text\n <div style={{ whiteSpace: \"pre-wrap\" }}>{content}</div>\n ) : (\n // Assistant messages get markdown rendering\n <MarkdownRenderer content={content || \"\"} onCodeBlockClick={onCodeBlockClick} onFilePathClick={onFilePathClick} />\n )}\n </div>\n\n {/* Timestamp */}\n {timestamp && (\n <div\n style={{\n fontSize: \"var(--text-xs-plus, 10.5px)\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n marginTop: \"4px\",\n fontFamily: \"var(--font-mono, monospace)\",\n }}\n >\n {timestamp}\n </div>\n )}\n </div>\n );\n}"],"names":["COLORS","AXIS_TICK","AXIS_LINE","GRID_STROKE","TOOLTIP_STYLE","LEGEND_STYLE","ChartTooltip","active","payload","label","jsxs","jsx","entry","i","seriesColor","_a","shouldShowAxisLabel","tickValues","lower","v","getChartSvg","containerEl","wrappers","largestWrapper","largest","current","largestRect","currentRect","surface","rect","candidates","largestSvg","escapeXml","value","buildExportSvg","chartSvg","width","height","legendItems","baseSvg","legendLineHeight","legendStartX","maxLegendX","legendRows","currentRow","currentRowWidth","color","itemWidth","exportLegendHeight","exportHeight","legendMarkup","row","rowIndex","cursorX","legendLineY","line","dot","text","downloadPng","title","svg","svgRect","w","h","xml","blob","url","img","canvas","scale","ctx","link","copyAsCsv","series","allXValues","header","s","rows","x","vals","match","d","csv","ActionBar","onDownloadPng","onCopy","copied","ChartRenderer","chartType","xLabel","yLabel","compact","chartRef","useRef","setCopied","React","chartData","point","seriesNames","isSingleSeries","showXLabel","rotateXTicks","bottomMargin","legendHeight","chartHeight","legendWrapperStyle","containerStyle","titleStyle","xAxisProps","yAxisProps","renderChart","ResponsiveContainer","BarChart","CartesianGrid","XAxis","YAxis","Legend","name","Bar","_","idx","Cell","Tooltip","LineChart","Line","AreaChart","Area","pieData","RADIAN","renderLabel","cx","cy","midAngle","innerRadius","outerRadius","percent","radius","y","PieChart","Pie","previous","unit","hasTrend","change","pctChange","isPositive","isNegative","trendColor","trendArrow","fmt","n","exportLegendItems","handleDownloadPng","useCallback","handleCopy","showActions","MarkdownRenderer","content","onCodeBlockClick","onFilePathClick","copiedBlocks","setCopiedBlocks","useState","copyToClipboard","blockId","prev","newSet","err","renderCodeBlock","code","language","isCopied","e","Check","Copy","PanelRightOpen","parseMarkdown","elements","lines","codeLines","level","HeaderTag","listItems","isOrdered","ListTag","item","parseInlineMarkdownWithContext","tableRows","parseCells","c","headerCells","isSeparator","hasSeparator","bodyStart","alignments","cellStyle","cell","ci","ri","paragraph","parseInlineMarkdown","remaining","key","filePathMatch","filePath","inlineCodeMatch","boldMatch","italicMatch","linkMatch","linkText","linkHref","isViewButton","viewButtonStyle","defaultLinkStyle","nextSpecialChar","ChatMessage","role","html","timestamp","toolBadges","isStreaming","isUser","badge","index","Wrench"],"mappings":"qHASMA,EAAS,CACb,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,SACF,EAGMC,EAAY,CAAE,KAAM,0BAA2B,SAAU,EAAG,EAC5DC,EAAY,CAAE,OAAQ,0BACtBC,EAAc,yBACdC,EAAgB,CAKpB,aAAc,CACZ,OAAQ,KACR,cAAe,OACf,QAAS,OACT,WAAY,MACd,CACF,EACMC,GAAe,CAAE,MAAO,2BAA4B,SAAU,MAAO,EAIrEC,EAAe,CAAC,CAAE,OAAAC,EAAQ,QAAAC,EAAS,MAAAC,KACnC,CAACF,GAAU,CAACC,GAAW,CAACA,EAAQ,OAAe,KAEjDE,EAAA,KAAC,MAAA,CACC,UAAU,wBACV,MAAO,CACL,WAAY,UACZ,OAAQ,mCACR,aAAc,EACd,UAAW,sEACX,QAAS,YACT,SAAU,IACV,SAAU,IACV,UAAW,IACX,UAAW,OACX,SAAU,GACV,WAAY,IACZ,MAAO,UAGP,cAAe,MACjB,EAEA,SAAA,CAAAC,MAAC,QAAO,CAAA,SAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAUN,EACDF,IAAU,QAAaA,IAAU,IAChCE,EAAA,IAAC,MAAA,CACC,MAAO,CACL,SAAU,GACV,WAAY,IACZ,cAAe,SACf,MAAO,UACP,cAAe,YACf,aAAc,EACd,cAAe,EACf,aAAc,kCAChB,EAEC,SAAAF,CAAA,CACH,EAEDE,EAAA,IAAA,MAAA,CAAI,MAAO,CAAE,QAAS,OAAQ,cAAe,SAAU,IAAK,CAC1D,EAAA,SAAAH,EAAQ,IAAI,CAACI,EAAOC,IAAM,OACzB,MAAMC,EAAcF,EAAM,SAASG,EAAAH,EAAM,UAAN,YAAAG,EAAe,OAAQ,UAExD,OAAAL,EAAA,KAAC,MAAA,CAEC,MAAO,CACL,QAAS,OACT,WAAY,SACZ,IAAK,EACL,eAAgB,eAClB,EAEA,SAAA,CAACA,EAAAA,KAAA,MAAA,CAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,EAAG,SAAU,CAAA,EACrE,SAAA,CAAAC,EAAA,IAAC,OAAA,CACC,MAAO,CACL,MAAO,EACP,OAAQ,EACR,aAAc,MACd,WAAYG,EACZ,WAAY,CACd,CAAA,CACF,EACAH,EAAA,IAAC,OAAA,CACC,MAAO,CACL,MAAO,UACP,SAAU,SACV,aAAc,WACd,WAAY,QACd,EAEC,SAAMC,EAAA,IAAA,CACT,CAAA,EACF,EACCD,EAAAA,IAAA,OAAA,CAAK,MAAO,CAAE,MAAO,UAAW,WAAY,IAAK,WAAY,CAC3D,EAAA,SAAAC,EAAM,KACT,CAAA,CAAA,CAAA,EA/BKC,CAAA,CAkCV,CAAA,EACH,CAAA,CAAA,CAAA,EAMAG,GAAsB,CAACP,EAAOQ,IAAe,CACjD,GAAI,CAACR,EAAc,MAAA,GACb,MAAAS,EAAQT,EAAM,cAGb,OADSQ,EAAW,OAAYE,GAAA,OAAOA,CAAC,EAAE,YAAY,EAAE,SAASD,CAAK,CAAC,EAC/D,OAASD,EAAW,OAAS,EAC9C,EAGMG,GAAeC,GAAgB,CACnC,MAAMC,EAAW,MAAM,KAAKD,EAAY,iBAAiB,mBAAmB,CAAC,EACvEE,EAAiBD,EAAS,OAC5BA,EAAS,OAAO,CAACE,EAASC,IAAY,CAChCC,MAAAA,EAAcF,EAAQ,wBACtBG,EAAcF,EAAQ,wBACpB,OAAAE,EAAY,MAAQA,EAAY,OAAWD,EAAY,MAAQA,EAAY,OAC/ED,EACAD,CACL,CAAA,EACC,KAEJ,GAAID,EAAgB,CACZ,MAAAK,EAAUL,EAAe,cAAc,sBAAsB,EACnE,GAAIK,EAAS,CACL,MAAAC,EAAOD,EAAQ,wBACrB,GAAIC,EAAK,OAAS,KAAOA,EAAK,QAAU,IAAY,OAAAD,CACtD,CACF,CAGA,MAAME,EAAa,MAAM,KAAKT,EAAY,iBAAiB,KAAK,CAAC,EACjE,GAAI,CAACS,EAAW,OAAe,OAAA,KAE/B,MAAMC,EAAaD,EAAW,OAAO,CAACN,EAASC,IAAY,CACnDC,MAAAA,EAAcF,EAAQ,wBACtBG,EAAcF,EAAQ,wBACpB,OAAAE,EAAY,MAAQA,EAAY,OAAWD,EAAY,MAAQA,EAAY,OAC/ED,EACAD,CAAA,CACL,EAEKE,EAAcK,EAAW,wBAC/B,OAAIL,EAAY,MAAQ,KAAOA,EAAY,OAAS,IAAY,KAEzDK,CACT,EAEMC,GAAaC,GAAU,OAAOA,CAAK,EACtC,QAAQ,KAAM,OAAO,EACrB,QAAQ,KAAM,MAAM,EACpB,QAAQ,KAAM,MAAM,EACpB,QAAQ,KAAM,QAAQ,EACtB,QAAQ,KAAM,QAAQ,EAEnBC,GAAiB,CAAC,CAAE,SAAAC,EAAU,MAAAC,EAAO,OAAAC,EAAQ,YAAAC,EAAc,CAAA,KAAS,CAClE,MAAAC,EAAUJ,EAAS,UAAU,EAAI,EACjCK,EAAmB,GACnBC,EAAe,GAEfC,EAAaN,EADQ,GAErBO,EAAa,CAAA,EACnB,IAAIC,EAAa,CAAA,EACbC,EAAkB,EAEtBP,EAAY,QAAQ,CAAC,CAAE,MAAA7B,EAAO,MAAAqC,KAAY,CAClC,MAAAC,EAAY,KAAK,IAAI,GAAK,OAAOtC,CAAK,EAAE,OAAS,EAAK,EAAE,EAC1DmC,EAAW,QAAWH,EAAeI,EAAkBE,EAAYL,IACrEC,EAAW,KAAKC,CAAU,EAC1BA,EAAa,CAAA,EACKC,EAAA,GAEpBD,EAAW,KAAK,CAAE,MAAAnC,EAAO,MAAAqC,EAAO,UAAAC,CAAW,CAAA,EACxBF,GAAAE,CAAA,CACpB,EACGH,EAAW,QAAQD,EAAW,KAAKC,CAAU,EAEjD,MAAMI,EAAqBL,EAAW,OAAUA,EAAW,OAASH,EAAoB,GAAK,EACvFS,EAAeZ,EAASW,EAEtBT,EAAA,aAAa,QAASH,CAAK,EAC3BG,EAAA,aAAa,SAAUF,CAAM,EAC7BE,EAAA,aAAa,IAAK,CAAC,EACnBA,EAAA,aAAa,IAAK,CAAC,EAE3B,MAAMW,EAAeP,EAAW,IAAI,CAACQ,EAAKC,IAAa,CACrD,IAAIC,EAAUZ,EACR,MAAAa,EAAcjB,EAAS,GAAMe,EAAWZ,EAQvC,OAPWW,EAAI,IAAI,CAAC,CAAE,MAAA1C,EAAO,MAAAqC,EAAO,UAAAC,KAAgB,CACnD,MAAAQ,EAAO,aAAaF,CAAO,SAASC,CAAW,SAASD,EAAU,EAAE,SAASC,CAAW,aAAaR,CAAK,wBAC1GU,EAAM,eAAeH,EAAU,CAAC,SAASC,CAAW,iCAAiCR,CAAK,0BAC1FW,EAAO,YAAYJ,EAAU,EAAE,QAAQC,EAAc,CAAC,gCAAgCtB,GAAUvB,CAAK,CAAC,UACjG,OAAA4C,GAAAN,EACJ,GAAGQ,CAAI,GAAGC,CAAG,GAAGC,CAAI,EAAA,CAC5B,EAAE,KAAK,EAAE,CACH,CACR,EAAE,KAAK,EAAE,EAEH,MAAA,CACL,kDAAkDrB,CAAK,aAAaa,CAAY,kBAAkBb,CAAK,IAAIa,CAAY,KACvH,0GACA,iEACA,IAAI,cAAA,EAAgB,kBAAkBV,CAAO,EAC7CW,EACA,QAAA,EACA,KAAK,EAAE,CACX,EAEMQ,GAAc,MAAOrC,EAAasC,EAAOrB,EAAc,CAAA,IAAO,CAC5D,MAAAsB,EAAMxC,GAAYC,CAAW,EACnC,GAAI,CAACuC,EAAK,OAEJ,MAAAC,EAAUD,EAAI,wBACdE,EAAID,EAAQ,OAASD,EAAI,aAAe,OAAOA,EAAI,aAAa,OAAO,CAAC,GAAK,IAC7EG,EAAIF,EAAQ,QAAUD,EAAI,cAAgB,OAAOA,EAAI,aAAa,QAAQ,CAAC,GAAK,IAChFI,EAAM9B,GAAe,CAAE,SAAU0B,EAAK,MAAOE,EAAG,OAAQC,EAAG,YAAAzB,CAAa,CAAA,EACxE2B,EAAO,IAAI,KAAK,CAACD,CAAG,EAAG,CAAE,KAAM,6BAAA,CAA+B,EAC9DE,EAAM,IAAI,gBAAgBD,CAAI,EAC9BE,EAAM,IAAI,MAChBA,EAAI,OAAS,IAAM,CACX,MAAAC,EAAS,SAAS,cAAc,QAAQ,EACxCC,EAAQ,EACdD,EAAO,MAAQN,EAAIO,EACnBD,EAAO,OAASL,EAAIM,EACd,MAAAC,EAAMF,EAAO,WAAW,IAAI,EAClCE,EAAI,UAAY,UAChBA,EAAI,SAAS,EAAG,EAAGF,EAAO,MAAOA,EAAO,MAAM,EAC1CE,EAAA,MAAMD,EAAOA,CAAK,EACtBC,EAAI,UAAUH,EAAK,EAAG,EAAGL,EAAGC,CAAC,EAC7B,IAAI,gBAAgBG,CAAG,EACjB,MAAAK,EAAO,SAAS,cAAc,GAAG,EACvCA,EAAK,SAAW,IAAIZ,GAAS,SAAS,QAAQ,eAAgB,GAAG,CAAC,OAC7DY,EAAA,KAAOH,EAAO,UAAU,WAAW,EACxCG,EAAK,MAAM,CAAA,EAEbJ,EAAI,IAAMD,CACZ,EAmBMM,GAAY,CAACC,EAAQC,IAAe,CACxC,MAAMC,EAAS,CAAC,GAAI,GAAGF,EAAO,IAASG,GAAAA,EAAE,IAAI,CAAC,EAAE,KAAK,GAAG,EAClDC,EAAOH,EAAW,IAASI,GAAA,CACzB,MAAAC,EAAON,EAAO,IAASG,GAAA,CAC3B,MAAMI,EAAQJ,EAAE,KAAK,KAAUK,GAAAA,EAAE,IAAMH,CAAC,EACjC,OAAAE,EAAQA,EAAM,EAAI,EAAA,CAC1B,EACD,MAAO,CAACF,EAAG,GAAGC,CAAI,EAAE,KAAK,GAAG,CAAA,CAC7B,EACKG,EAAM,CAACP,EAAQ,GAAGE,CAAI,EAAE,KAAK;AAAA,CAAI,EAC7B,UAAA,UAAU,UAAUK,CAAG,CACnC,EAEMC,GAAY,CAAC,CAAE,cAAAC,EAAe,OAAAC,EAAQ,OAAAC,CAAO,IAChD5E,EAAA,KAAA,MAAA,CAAI,MAAO,CACV,QAAS,OAAQ,IAAK,EAAG,eAAgB,WACzC,aAAc,EAAG,QAAS,GAAK,WAAY,eAC7C,EACE,SAAA,CAAAC,EAAA,IAAC,SAAO,CAAA,QAAS0E,EAAQ,MAAM,mBAAmB,MAAO,CACvD,WAAY,OAAQ,OAAQ,mCAC5B,aAAc,wBAAyB,QAAS,UAChD,SAAU,GAAI,MAAO,0BAA2B,OAAQ,UACxD,QAAS,OAAQ,WAAY,SAAU,IAAK,CAC9C,EACG,SAASC,EAAA,WAAa,QACzB,CAAA,QACC,SAAO,CAAA,QAASF,EAAe,MAAM,kBAAkB,MAAO,CAC7D,WAAY,OAAQ,OAAQ,mCAC5B,aAAc,wBAAyB,QAAS,UAChD,SAAU,GAAI,MAAO,0BAA2B,OAAQ,UACxD,QAAS,OAAQ,WAAY,SAAU,IAAK,CAAA,EAC3C,SAEH,SAAA,CAAA,CACF,CAAA,EAGIG,GAAgB,CAAC,CAAE,UAAAC,EAAW,MAAA7B,EAAO,OAAA8B,EAAQ,OAAAC,EAAQ,OAAAjB,EAAQ,QAAAkB,EAAU,MAAY,CACjF,MAAAC,EAAWC,SAAO,IAAI,EACtB,CAACP,EAAQQ,CAAS,EAAIC,EAAM,SAAS,EAAK,EAE5C,GAAA,CAACtB,GAAUA,EAAO,SAAW,EAAU,OAAA,KAG3C,MAAMC,EAAa,CAAC,GAAG,IAAI,IAAID,EAAO,QAAQG,GAAKA,EAAE,KAAK,IAASK,GAAAA,EAAE,CAAC,CAAC,CAAC,CAAC,EACnEe,EAAYtB,EAAW,IAASI,GAAA,CAC9B,MAAAmB,EAAQ,CAAE,EAAAnB,GAChB,OAAAL,EAAO,QAAaG,GAAA,CAClB,MAAMI,EAAQJ,EAAE,KAAK,KAAUK,GAAAA,EAAE,IAAMH,CAAC,EACxCmB,EAAMrB,EAAE,IAAI,EAAII,EAAQA,EAAM,EAAI,IAAA,CACnC,EACMiB,CAAA,CACR,EAEKC,EAAczB,EAAO,IAAIG,GAAKA,EAAE,IAAI,EACpCuB,EAAiBD,EAAY,SAAW,EAGxCE,EAAapF,GAAoByE,EAAQf,CAAU,EAInD2B,EADa,KAAK,IAAI,GAAG3B,EAAW,IAAIvD,GAAK,OAAOA,CAAC,EAAE,MAAM,CAAC,EAClC,IAAMuD,EAAW,OAAS,EAKtD4B,GAFaD,EAAe,GAAK,IACnBD,EAAa,GAAK,GAMhCzD,EAAawD,EAAiB,EAAI,KAAK,IAAI,EAAG,KAAK,KAAKD,EAAY,OAAS,CAAC,CAAC,EAC/EK,EAAe5D,EAAa,EAAIA,EAAa,IAAMyD,EAAa,GAAK,IAAM,EAO3EI,GADkBb,EAAU,IAAM,KACF,KAAK,IAAI,GAAIhD,EAAa,GAAK,EAAE,EAMjE8D,EAAqB,CAAE,GAAGpG,GAAc,WADrB+F,EAAa,GAAK,GACiC,OAAQ,GAE9EM,EAAiB,CACrB,WAAY,8BACZ,OAAQ,mCACR,aAAc,wBACd,QAAS,OACT,aAAc,MAAA,EAGVC,EAAa,CACjB,MAAO,8BACP,SAAU,OACV,WAAY,MACZ,aAAc,MAAA,EAGVC,EAAa,CACjB,QAAS,IACT,KAAMP,EACF,CAAE,KAAM,0BAA2B,SAAU,GAAI,MAAO,IAAK,WAAY,KACzE,EAAApG,EACJ,SAAUC,EACV,SAAUA,EACV,GAAIkG,EAAa,CACf,MAAO,CACL,MAAOX,EACP,SAAU,eAEV,OAAQY,EAAe,IAAM,IAC7B,MAAO,CAAE,WAAY,SAAU,KAAM,yBAA0B,CACjE,CAAA,EACE,CAAC,CAAA,EAGDQ,EAAa,CACjB,KAAM5G,EACN,SAAUC,EACV,SAAUA,EACV,GAAIwF,EAAS,CACX,MAAO,GACP,MAAO,CACL,MAAOA,EACP,MAAO,IACP,SAAU,aACV,OAAQ,GACR,MAAO,CAAE,WAAY,SAAU,KAAM,yBAA0B,CACjE,CAAA,EACE,CAAC,CAAA,EAGDoB,GAAc,IAAM,CACxB,OAAQtB,EAAW,CACjB,IAAK,MAED,OAAA7E,MAACoG,EAAAA,qBAAoB,MAAM,OAAO,OAAQP,EACxC,SAAA9F,EAAA,KAACsG,WAAS,CAAA,KAAMhB,EAAW,OAAQ,CAAE,IAAK,EAAG,MAAO,GAAI,KAAMN,EAAS,GAAK,GAAI,OAAQY,CAAA,EACtF,SAAA,CAAA3F,EAAA,IAACsG,EAAc,cAAA,CAAA,gBAAgB,MAAM,OAAQ9G,EAAa,EAC1DQ,EAAAA,IAACuG,EAAO,MAAA,CAAA,GAAGN,EAAY,EACvBjG,EAAAA,IAACwG,EAAO,MAAA,CAAA,GAAGN,EAAY,EACtB,CAACV,GAAkBxF,EAAA,IAACyG,UAAO,aAAcX,EAAoB,OAAQF,EAAc,EACnFL,EAAY,IAAI,CAACmB,EAAMxG,IACtBF,EAAAA,IAAC2G,OAAe,QAASD,EAAM,KAAMrH,EAAOa,EAAIb,EAAO,MAAM,EAAG,OAAQ,CAAC,EAAG,EAAG,EAAG,CAAC,EAAG,kBAAmB,GACtG,SAAkBmG,GAAAH,EAAU,IAAI,CAACuB,EAAGC,IAClC7G,EAAAA,IAAA8G,EAAA,KAAA,CAAe,KAAMzH,EAAOwH,EAAMxH,EAAO,MAAM,CAAA,EAArCwH,CAAwC,CACpD,GAHOH,CAIV,CACD,EACD1G,EAAAA,IAAC+G,WAAQ,aAActH,EAAc,aAAc,QAASO,MAACL,GAAa,CAAA,EAAI,OAAQ,CAAE,KAAM,2BAA4B,OAAQ,yBAA0B,gBAAiB,OAAS,kBAAmB,GAAO,kBAAmB,EAAG,CAAA,CACxO,CAAA,CACF,CAAA,EAGJ,IAAK,iBAEH,OACGK,EAAAA,IAAAoG,EAAAA,oBAAA,CAAoB,MAAM,OAAO,OAAQ,KAAK,IAAIpB,EAAU,IAAM,IAAKK,EAAU,QAAUL,EAAU,GAAK,GAAG,EAC5G,SAACjF,EAAAA,KAAAsG,EAAAA,SAAA,CAAS,KAAMhB,EAAW,OAAO,WAAW,OAAQ,CAAE,IAAK,EAAG,MAAO,GAAI,KAAM,IAAK,OAAQ,CAC3F,EAAA,SAAA,CAAArF,EAAA,IAACsG,EAAc,cAAA,CAAA,gBAAgB,MAAM,OAAQ9G,EAAa,EAC1DQ,EAAA,IAACuG,EAAA,MAAA,CAAM,KAAK,SAAS,KAAMjH,EAAW,SAAUC,EAAW,SAAUA,EAClE,GAAIwF,EAAS,CAAE,MAAO,CAAE,MAAOA,EAAQ,SAAU,eAAgB,OAAQ,GAAI,MAAO,CAAE,WAAY,SAAU,KAAM,0BAA4B,CAAA,EAAM,CAAC,CAAA,CACxJ,QACCyB,EAAAA,MAAM,CAAA,KAAK,WAAW,QAAQ,IAAI,KAAM,CAAE,KAAM,0BAA2B,SAAU,EAAM,EAAA,MAAO,GAAI,SAAUjH,EAAW,SAAUA,EAAW,EAChJ,CAACiG,GAAkBxF,EAAA,IAACyG,UAAO,aAAcX,EAAoB,OAAQF,EAAc,EACnFL,EAAY,IAAI,CAACmB,EAAMxG,IACtBF,EAAAA,IAAC2G,OAAe,QAASD,EAAM,KAAMrH,EAAOa,EAAIb,EAAO,MAAM,EAAG,OAAQ,CAAC,EAAG,EAAG,EAAG,CAAC,EAAG,kBAAmB,GACtG,SAAkBmG,GAAAH,EAAU,IAAI,CAACuB,EAAGC,IAClC7G,EAAAA,IAAA8G,EAAA,KAAA,CAAe,KAAMzH,EAAOwH,EAAMxH,EAAO,MAAM,CAAA,EAArCwH,CAAwC,CACpD,GAHOH,CAIV,CACD,EACD1G,EAAAA,IAAC+G,WAAQ,aAActH,EAAc,aAAc,QAASO,MAACL,GAAa,CAAA,EAAI,OAAQ,CAAE,KAAM,2BAA4B,OAAQ,yBAA0B,gBAAiB,OAAS,kBAAmB,GAAO,kBAAmB,EAAG,CAAA,CACxO,CAAA,CACF,CAAA,EAIJ,IAAK,OAED,OAAAK,MAACoG,EAAAA,qBAAoB,MAAM,OAAO,OAAQP,EACxC,SAAA9F,EAAA,KAACiH,YAAU,CAAA,KAAM3B,EAAW,OAAQ,CAAE,IAAK,EAAG,MAAO,GAAI,KAAMN,EAAS,GAAK,GAAI,OAAQY,CAAA,EACvF,SAAA,CAAA3F,EAAA,IAACsG,EAAc,cAAA,CAAA,gBAAgB,MAAM,OAAQ9G,EAAa,EAC1DQ,EAAAA,IAACuG,EAAO,MAAA,CAAA,GAAGN,EAAY,EACvBjG,EAAAA,IAACwG,EAAO,MAAA,CAAA,GAAGN,EAAY,EACtBlG,EAAA,IAAAyG,EAAA,OAAA,CAAO,aAAcX,EAAoB,OAAQF,EAAc,EAC/DL,EAAY,IAAI,CAACmB,EAAMxG,IACtBF,EAAA,IAACiH,EAAA,KAAA,CAAgB,KAAK,WAAW,QAASP,EACxC,OAAQrH,EAAOa,EAAIb,EAAO,MAAM,EAAG,YAAa,EAChD,IAAK,CAAE,EAAG,EAAG,KAAMA,EAAOa,EAAIb,EAAO,MAAM,CAAE,EAC7C,UAAW,CAAE,EAAG,EAAG,KAAMA,EAAOa,EAAIb,EAAO,MAAM,CAAE,EACnD,kBAAmB,EAAA,EAJVqH,CAAA,CAMZ,EACD1G,EAAAA,IAAC+G,WAAQ,aAActH,EAAc,aAAc,QAASO,MAACL,GAAa,CAAA,EAAI,OAAQ,CAAE,KAAM,2BAA4B,OAAQ,yBAA0B,gBAAiB,OAAS,kBAAmB,GAAO,kBAAmB,EAAG,CAAA,CACxO,CAAA,CACF,CAAA,EAGJ,IAAK,OAED,OAAAK,MAACoG,EAAAA,qBAAoB,MAAM,OAAO,OAAQP,EACxC,SAAA9F,EAAA,KAACmH,YAAU,CAAA,KAAM7B,EAAW,OAAQ,CAAE,IAAK,EAAG,MAAO,GAAI,KAAMN,EAAS,GAAK,GAAI,OAAQY,CAAA,EACvF,SAAA,CAAA3F,EAAA,IAACsG,EAAc,cAAA,CAAA,gBAAgB,MAAM,OAAQ9G,EAAa,EAC1DQ,EAAAA,IAACuG,EAAO,MAAA,CAAA,GAAGN,EAAY,EACvBjG,EAAAA,IAACwG,EAAO,MAAA,CAAA,GAAGN,EAAY,EACtBlG,EAAA,IAAAyG,EAAA,OAAA,CAAO,aAAcX,EAAoB,OAAQF,EAAc,EAC/DL,EAAY,IAAI,CAACmB,EAAMxG,IACtBF,EAAA,IAACmH,EAAA,KAAA,CAAgB,KAAK,WAAW,QAAST,EACxC,OAAQrH,EAAOa,EAAIb,EAAO,MAAM,EAAG,YAAa,EAChD,KAAMA,EAAOa,EAAIb,EAAO,MAAM,EAAG,YAAa,IAC9C,kBAAmB,EAAA,EAHVqH,CAAA,CAKZ,EACD1G,EAAAA,IAAC+G,WAAQ,aAActH,EAAc,aAAc,QAASO,MAACL,GAAa,CAAA,EAAI,OAAQ,CAAE,KAAM,2BAA4B,OAAQ,yBAA0B,gBAAiB,OAAS,kBAAmB,GAAO,kBAAmB,EAAG,CAAA,CACxO,CAAA,CACF,CAAA,EAGJ,IAAK,MAAO,CAEJ,MAAAyH,EAAUtD,EAAO,CAAC,EAAE,KAAK,IAAI,CAACQ,EAAGpE,KAAO,CAC5C,KAAMoE,EAAE,EACR,MAAOA,EAAE,EACT,KAAMjF,EAAOa,EAAIb,EAAO,MAAM,CAC9B,EAAA,EACIgI,EAAS,KAAK,GAAK,IACnBC,EAAc,CAAC,CAAE,GAAAC,EAAI,GAAAC,EAAI,SAAAC,EAAU,YAAAC,EAAa,YAAAC,EAAa,QAAAC,EAAS,KAAAlB,KAAW,CACrF,MAAMmB,EAASF,EAAc,GACvBxD,EAAIoD,EAAKM,EAAS,KAAK,IAAI,CAACJ,EAAWJ,CAAM,EAC7CS,EAAIN,EAAKK,EAAS,KAAK,IAAI,CAACJ,EAAWJ,CAAM,EACnD,OAAIO,EAAU,IAAa,KAEzB7H,EAAA,KAAC,OAAA,CAAK,EAAAoE,EAAM,EAAA2D,EAAM,KAAK,2BAA2B,SAAU,GAC1D,WAAY3D,EAAIoD,EAAK,QAAU,MAAO,iBAAiB,UACtD,SAAA,CAAAb,EAAK,MAAIkB,EAAU,KAAK,QAAQ,CAAC,EAAE,IAAA,CAAA,CAAA,CACtC,EAIF,OAAA5H,MAACoG,EAAAA,qBAAoB,MAAM,OAAO,OAAQpB,EAAU,IAAM,IACxD,SAACjF,EAAAA,KAAAgI,EAAAA,SAAA,CAAS,OAAQ,CAAE,IAAK,GAAI,MAAO,GAAI,OAAQ,GAAI,KAAM,IACxD,SAAA,CAAA/H,EAAA,IAACgI,EAAA,IAAA,CAAI,KAAMZ,EAAS,GAAIpC,EAAU,MAAQ,MAAO,GAAG,MAAM,YAAaA,EAAU,GAAK,IACpF,QAAQ,QAAQ,MAAOsC,EAAa,UAAW,CAAE,OAAQ,yBAA0B,EACnF,kBAAmB,GAClB,SAAAF,EAAQ,IAAI,CAACnH,EAAOC,IAClBF,EAAAA,IAAA8G,EAAA,KAAA,CAAa,KAAM7G,EAAM,IAAf,EAAAC,CAAqB,CACjC,CAAA,CACH,EACAF,EAAAA,IAAC+G,WAAQ,aAActH,EAAc,aAAc,QAASO,MAACL,GAAa,CAAA,EAAI,OAAQ,CAAE,KAAM,2BAA4B,OAAQ,yBAA0B,gBAAiB,OAAS,kBAAmB,GAAO,kBAAmB,EAAG,CAAA,CACxO,CAAA,CACF,CAAA,CAEJ,CAEA,IAAK,SAAU,CACP,MAAAsE,EAAIH,EAAO,CAAC,EACZhD,EAAUmD,EAAE,KAAK,CAAC,EAClBgE,EAAWhE,EAAE,KAAK,OAAS,EAAIA,EAAE,KAAK,CAAC,EAAI,KAC3C3C,EAAQR,EAAQ,EAChBoH,EAAOpH,EAAQ,GAAK,GACpBqH,EAAWF,IAAa,KACxBG,EAASD,EAAW7G,EAAQ2G,EAAS,EAAI,EACzCI,EAAYF,GAAYF,EAAS,IAAM,EAAMG,EAAS,KAAK,IAAIH,EAAS,CAAC,EAAK,IAAO,EACrFK,EAAaF,EAAS,EACtBG,EAAaH,EAAS,EACtBI,EAAaF,EAAa,UAAYC,EAAa,UAAY,0BAC/DE,EAAaH,EAAa,IAAMC,EAAa,IAAM,IAGnDG,EAAOC,GACP,OAAO,UAAUA,CAAC,GAAK,KAAK,IAAIA,CAAC,GAAK,IAAaA,EAAE,iBACrD,OAAOA,GAAM,SAAiBA,EAAI,IAAM,EAAIA,EAAE,SAAa,EAAAA,EAAE,QAAQA,EAAI,GAAK,EAAI,CAAC,EAChF,OAAOA,CAAC,EAGjB,OACG5I,EAAA,KAAA,MAAA,CAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,WAAY,IAAK,GAAI,QAAS,OAAA,EACvE,SAAA,CAAAC,MAAC,OAAI,MAAO,CACV,SAAU,OAAQ,WAAY,IAAK,WAAY,EAC/C,MAAO,8BACP,mBAAoB,cACtB,EACG,SAAI0I,EAAApH,CAAK,EACZ,EACC4G,GACClI,EAAAA,IAAC,MAAI,CAAA,MAAO,CAAE,SAAU,OAAQ,MAAO,0BAA2B,WAAY,GAAI,EAC/E,SACHkI,CAAA,CAAA,EAEDC,GACEpI,EAAA,KAAA,MAAA,CAAI,MAAO,CACV,QAAS,OAAQ,WAAY,SAAU,IAAK,EAC5C,SAAU,OAAQ,WAAY,IAAK,MAAOyI,EAC1C,WAAYF,EAAa,yBAA2BC,EAAa,yBAA2B,yBAC5F,QAAS,UAAW,aAAc,uBAElC,EAAA,SAAA,CAAAvI,EAAAA,IAAC,QAAM,SAAWyI,CAAA,CAAA,SACjB,OAAM,CAAA,SAAA,CAAIC,EAAA,KAAK,IAAIN,CAAM,CAAC,EAAE,KAAG,KAAK,IAAIC,CAAS,EAAE,QAAQ,CAAC,EAAE,IAAA,EAAE,CAAA,EACnE,EAEDF,UACE,MAAI,CAAA,MAAO,CAAE,SAAU,OAAQ,MAAO,yBAA6B,EAAA,SAAA,CAAA,MAC9DF,EAAS,GAAK,UAAA,EACpB,CAEJ,CAAA,CAAA,CAEJ,CAEA,QACS,OAAAlI,OAAC,MAAI,CAAA,MAAO,CAAE,MAAO,oBAAqB,SAAU,GAAI,QAAS,CAAA,EAAK,SAAA,CAAA,2BAAyB8E,CAAU,CAAA,CAAA,CACpH,CAAA,EAOI+D,EAJqB/D,IAAc,QACpCA,IAAc,SACZA,IAAc,OAASA,IAAc,mBAAqB,CAACW,EAG9DD,EAAY,IAAI,CAACmB,EAAMxG,KAAO,CAAE,MAAOwG,EAAM,MAAOrH,EAAOa,EAAIb,EAAO,MAAM,CAAE,EAAE,EAChF,GAEEwJ,GAAoBC,EAAAA,YAAY,IAAM,CACtC7D,EAAS,SAAqBlC,GAAAkC,EAAS,QAASjC,EAAO4F,CAAiB,CAAA,EAC3E,CAAC5F,EAAO4F,CAAiB,CAAC,EAEvBG,GAAaD,EAAAA,YAAY,IAAM,CACnCjF,GAAUC,EAAQC,CAAU,EAC5BoB,EAAU,EAAI,EACd,WAAW,IAAMA,EAAU,EAAK,EAAG,GAAI,CAAA,EACtC,CAACrB,EAAQC,CAAU,CAAC,EAEjBiF,GAAcnE,IAAc,SAGhC,OAAA9E,EAAA,KAAC,MAAI,CAAA,MAAOgG,EACT,SAAA,CAAA/C,GAAUhD,EAAA,IAAA,MAAA,CAAI,MAAOgG,EAAa,SAAMhD,EAAA,EACxCgG,IAAgBhJ,EAAAA,IAAAwE,GAAA,CAAU,cAAeqE,GAAmB,OAAQE,GAAY,OAAApE,EAAgB,EAChG3E,EAAA,IAAA,MAAA,CAAI,IAAKiF,EACP,cACH,CACF,CAAA,CAAA,CAEJ,ECxnBMgE,GAAmB,CAAC,CAAE,QAAAC,EAAS,iBAAAC,EAAkB,gBAAAC,KAAsB,CAC3E,KAAM,CAACC,EAAcC,CAAe,EAAIC,EAAAA,SAAS,IAAI,GAAK,EAEpDC,EAAkB,MAAO1G,EAAM2G,IAAY,CAC3C,GAAA,CACI,MAAA,UAAU,UAAU,UAAU3G,CAAI,EACxBwG,EAAAI,OAAY,IAAI,CAAC,GAAGA,EAAMD,CAAO,CAAC,CAAC,EACnD,WAAW,IAAM,CACfH,EAAwBI,GAAA,CAChB,MAAAC,EAAS,IAAI,IAAID,CAAI,EAC3B,OAAAC,EAAO,OAAOF,CAAO,EACdE,CAAA,CACR,GACA,GAAI,QACAC,EAAK,CACJ,QAAA,MAAM,uBAAwBA,CAAG,CAC3C,CAAA,EAGIC,EAAkB,CAACC,EAAMC,EAAUN,IAAY,CAC7C,MAAAO,EAAWX,EAAa,IAAII,CAAO,EAGvC,OAAA1J,EAAA,KAAC,MAAA,CAEC,MAAO,CACL,SAAU,WACV,aAAc,OACd,aAAc,MACd,WAAY,sBACZ,OAAQ,sDACR,SAAU,QACZ,EAGA,SAAA,CAAAA,OAAC,OAAI,MAAO,CACV,QAAS,OACT,eAAgB,gBAChB,WAAY,SACZ,QAAS,WACT,WAAY,yBACZ,aAAc,iCAEd,EAAA,SAAA,CAAAC,MAAC,QAAK,MAAO,CACX,SAAU,OACV,MAAO,wBACP,WAAY,8BACZ,cAAe,YACf,cAAe,QAAA,EAEd,YAAY,OACf,EACAD,EAAA,KAAC,SAAA,CACC,QAAS,IAAMyJ,EAAgBM,EAAML,CAAO,EAC5C,MAAO,CACL,WAAY,OACZ,OAAQ,OACR,MAAO,wBACP,OAAQ,UACR,QAAS,MACT,aAAc,MACd,QAAS,OACT,WAAY,SACZ,IAAK,MACL,SAAU,OACV,WAAY,gBACd,EACA,aAAeQ,GAAM,CACjBA,EAAA,OAAO,MAAM,WAAa,wBAC1BA,EAAA,OAAO,MAAM,MAAQ,uBACzB,EACA,aAAeA,GAAM,CACjBA,EAAA,OAAO,MAAM,WAAa,OAC1BA,EAAA,OAAO,MAAM,MAAQ,uBACzB,EAEC,SAAA,CAAWD,EAAAhK,EAAA,IAACkK,SAAM,KAAM,EAAA,CAAI,EAAMlK,EAAAA,IAAAmK,EAAA,KAAA,CAAK,KAAM,EAAI,CAAA,EACjDH,EAAW,UAAY,MAAA,CAAA,CAC1B,EACCb,GACCpJ,EAAA,KAAC,SAAA,CACC,QAAS,IAAMoJ,EAAiB,CAAE,KAAAW,EAAM,SAAAC,EAAU,EAClD,MAAO,CACL,WAAY,OACZ,OAAQ,OACR,MAAO,wBACP,OAAQ,UACR,QAAS,MACT,aAAc,MACd,QAAS,OACT,WAAY,SACZ,IAAK,MACL,SAAU,OACV,WAAY,gBACd,EACA,aAAeE,GAAM,CACjBA,EAAA,cAAc,MAAM,WAAa,wBACjCA,EAAA,cAAc,MAAM,MAAQ,uBAChC,EACA,aAAeA,GAAM,CACjBA,EAAA,cAAc,MAAM,WAAa,OACjCA,EAAA,cAAc,MAAM,MAAQ,uBAChC,EAEA,SAAA,CAACjK,EAAAA,IAAAoK,EAAA,eAAA,CAAe,KAAM,EAAI,CAAA,EAAE,QAAA,CAAA,CAE9B,CAAA,EAEJ,EAEApK,MAAC,OAAI,MAAO,CACV,OAAQ,EACR,QAAS,OACT,WAAY,8BACZ,SAAU,OACV,WAAY,IACZ,MAAO,yBACP,SAAU,OACV,WAAY,WACZ,UAAW,YAAA,EAEV,SACH8J,EAAA,CAAA,CAAA,EAlGKL,CAAA,CAmGP,EAIEY,EAAiBvH,GAAS,CAC9B,MAAMwH,EAAW,CAAA,EACXC,EAAQzH,EAAK,MAAM;AAAA,CAAI,EAC7B,IAAI5C,EAAI,EACJuJ,EAAU,EAEP,KAAAvJ,EAAIqK,EAAM,QAAQ,CACjB,MAAA3H,EAAO2H,EAAMrK,CAAC,EAGpB,GAAI0C,EAAK,KAAA,EAAO,WAAW,KAAK,EAAG,CACjC,MAAMmH,EAAWnH,EAAK,KAAK,EAAE,MAAM,CAAC,EACpC,IAAI4H,EAAY,CAAA,EAGT,IAFPtK,IAEOA,EAAIqK,EAAM,QAAU,CAACA,EAAMrK,CAAC,EAAE,KAAK,EAAE,WAAW,KAAK,GAChDsK,EAAA,KAAKD,EAAMrK,CAAC,CAAC,EACvBA,IAGEA,EAAIqK,EAAM,QAAQrK,IAEboK,EAAA,KAAKT,EAAgBW,EAAU,KAAK;AAAA,CAAI,EAAGT,EAAU,QAAQN,GAAS,EAAE,CAAC,EAClF,QACF,CAGI,GAAA7G,EAAK,WAAW,GAAG,EAAG,CACxB,MAAM6H,EAAQ7H,EAAK,MAAM,KAAK,EAAE,CAAC,EAAE,OAC7BE,EAAOF,EAAK,MAAM6H,CAAK,EAAE,KAAK,EAC9BC,EAAYD,IAAU,EAAI,KAAOA,IAAU,EAAI,KAAOA,IAAU,EAAI,KAAO,KAExEH,EAAA,KACPlF,EAAM,cAAcsF,EAAW,CAC7B,IAAK,UAAUxK,CAAC,GAChB,MAAO,CACL,SAAUuK,IAAU,EAAI,OAASA,IAAU,EAAI,OAAS,OACxD,WAAY,IACZ,MAAO,0CACP,UAAWH,EAAS,OAAS,EAAI,OAAS,IAC1C,aAAc,MACd,WAAY,GACd,GACCxH,CAAI,CAAA,EAET5C,IACA,QACF,CAGA,GAAI0C,EAAK,SAAW,OAASA,EAAK,SAAW,MAAO,CACzC0H,EAAA,KACPtK,MAAC,MAAmB,MAAO,CACzB,OAAQ,OACR,UAAW,sDACX,OAAQ,QACV,CAAA,EAJS,MAAME,CAAC,EAIb,CAAA,EAELA,IACA,QACF,CAGI,GAAA0C,EAAK,MAAM,uBAAuB,EAAG,CACvC,MAAM+H,EAAY,CAAA,EACZC,EAAY,YAAY,KAAKhI,CAAI,EAEvC,KAAO1C,EAAIqK,EAAM,SAAWA,EAAMrK,CAAC,EAAE,MAAM,uBAAuB,GAAKqK,EAAMrK,CAAC,EAAE,SAAW,KAAK,CAC9F,GAAIqK,EAAMrK,CAAC,EAAE,KAAA,IAAW,GAAI,CAC1B,MAAMmE,EAAQkG,EAAMrK,CAAC,EAAE,MAAM,4BAA4B,EACrDmE,GACQsG,EAAA,KAAKtG,EAAM,CAAC,CAAC,CAE3B,CACAnE,GACF,CAEM,MAAA2K,EAAUD,EAAY,KAAO,KAC1BN,EAAA,KACPlF,EAAM,cAAcyF,EAAS,CAC3B,IAAK,QAAQ3K,CAAC,GACd,MAAO,CACL,OAAQ,QACR,YAAa,OACb,MAAO,yCACT,GACCyK,EAAU,IAAI,CAACG,EAAMjE,IACtBzB,EAAM,cAAc,KAAM,CACxB,IAAK,QAAQyB,CAAG,GAChB,MAAO,CAAE,aAAc,KAAM,CAAA,EAC5BkE,EAA+BD,CAAI,CAAC,CAAA,CACxC,CAAA,EAEH,QACF,CAGI,GAAAlI,EAAK,OAAO,WAAW,GAAG,GAAKA,EAAK,KAAK,EAAE,SAAS,GAAG,EAAG,CAC5D,MAAMoI,EAAY,CAAA,EAClB,KAAO9K,EAAIqK,EAAM,QAAUA,EAAMrK,CAAC,EAAE,OAAO,WAAW,GAAG,GAAKqK,EAAMrK,CAAC,EAAE,OAAO,SAAS,GAAG,GAC9E8K,EAAA,KAAKT,EAAMrK,CAAC,CAAC,EACvBA,IAGE,GAAA8K,EAAU,QAAU,EAAG,CAEzB,MAAMC,EAAczI,GAAQA,EAAI,OAAO,MAAM,EAAG,EAAE,EAAE,MAAM,GAAG,EAAE,IAAS0I,GAAAA,EAAE,MAAM,EAC1EC,EAAcF,EAAWD,EAAU,CAAC,CAAC,EAGrCI,EAAe5I,GAAQyI,EAAWzI,CAAG,EAAE,MAAW0I,GAAA,UAAU,KAAKA,CAAC,CAAC,EACnEG,EAAeL,EAAU,QAAU,GAAKI,EAAYJ,EAAU,CAAC,CAAC,EAChEM,EAAYD,EAAe,EAAI,EAG/BE,EAAaF,EAAeJ,EAAWD,EAAU,CAAC,CAAC,EAAE,IAASE,GAC9DA,EAAE,WAAW,GAAG,GAAKA,EAAE,SAAS,GAAG,EAAU,SAC7CA,EAAE,SAAS,GAAG,EAAU,QACrB,MACR,EAAIC,EAAY,IAAI,IAAM,MAAM,EAE3BK,EAAY,CAChB,QAAS,WACT,aAAc,sDACd,SAAU,OACV,WAAY,IACZ,MAAO,0CAKP,UAAW,SACX,aAAc,QAAA,EAGPlB,EAAA,KACPtK,EAAAA,IAAC,MAAuB,CAAA,MAAO,CAAE,UAAW,OAAQ,OAAQ,OAAQ,EAClE,SAACD,EAAA,KAAA,QAAA,CAAM,MAAO,CACZ,eAAgB,WAChB,MAAO,OACP,OAAQ,sDACR,aAAc,MACd,SAAU,QAET,EAAA,SAAA,CAAAsL,SACE,QACC,CAAA,SAAArL,EAAAA,IAAC,KAAG,CAAA,MAAO,CAAE,WAAY,oDACtB,SAAAmL,EAAY,IAAI,CAACM,EAAMC,IACtB1L,EAAA,IAAC,MAAY,MAAO,CAAE,GAAGwL,EAAW,WAAY,IAAK,UAAWD,EAAWG,CAAE,GAAK,OAAQ,WAAY,UACnG,WAA+BD,CAAI,CAAA,EAD7BC,CAET,CACD,CACH,CAAA,EACF,EAEF1L,EAAAA,IAAC,SACG,UAAeqL,EAAAL,EAAU,MAAMM,CAAS,EAAIN,GAAW,IAAI,CAACxI,EAAKmJ,IAChE3L,MAAA,KAAA,CAAY,MAAO,CAAE,WAAY2L,EAAK,IAAM,EAAI,mDAAqD,aAAc,EACjH,SAAWV,EAAAzI,CAAG,EAAE,IAAI,CAACiJ,EAAMC,IAC1B1L,EAAAA,IAAC,MAAY,MAAO,CAAE,GAAGwL,EAAW,UAAWD,EAAWG,CAAE,GAAK,MAAA,EAC9D,SAAAX,EAA+BU,CAAI,GAD7BC,CAET,CACD,CAAA,EALMC,CAMT,CACD,CACH,CAAA,CACF,CAAA,CAAA,CAAA,EA9BQ,SAASzL,CAAC,EA+BpB,CAAA,CAEJ,CACA,QACF,CAGI,GAAA0C,EAAK,OAAQ,CACf,MAAMgJ,EAAY,CAAA,EAClB,KAAO1L,EAAIqK,EAAM,QAAUA,EAAMrK,CAAC,EAAE,KAAK,GAAK,CAACqK,EAAMrK,CAAC,EAAE,MAAM,0CAA0C,GAAK,EAAEqK,EAAMrK,CAAC,EAAE,OAAO,WAAW,GAAG,GAAKqK,EAAMrK,CAAC,EAAE,KAAA,EAAO,SAAS,GAAG,IAClK0L,EAAA,KAAKrB,EAAMrK,CAAC,CAAC,EACvBA,IAGE0L,EAAU,OAAS,GACZtB,EAAA,KACPtK,MAAC,KAAiB,MAAO,CACvB,OAAQ,QACR,WAAY,IACZ,MAAO,yCACT,EACG,WAA+B4L,EAAU,KAAK,GAAG,CAAC,CAAA,EAL7C,KAAK1L,CAAC,EAMd,CAAA,CAEJ,MAEAA,GAEJ,CAEO,OAAAoK,CAAA,EAGHuB,EAAuB/I,GAAS,CACpC,MAAMwH,EAAW,CAAA,EACjB,IAAIwB,EAAYhJ,EACZiJ,EAAM,EAEH,KAAAD,EAAU,OAAS,GAAG,CAE3B,GAAI1C,EAAiB,CAEb,MAAA4C,EAAgBF,EAAU,MAAM,iLAAiL,EACvN,GAAIE,EAAe,CACX,MAAAC,EAAWD,EAAc,CAAC,EACvB1B,EAAA,KACPtK,EAAA,IAAC,OAAA,CAEC,QAAS,IAAMoJ,EAAgB6C,CAAQ,EACvC,MAAO,CACL,MAAO,iCACP,eAAgB,YAChB,oBAAqB,SACrB,oBAAqB,MACrB,OAAQ,UACR,WAAY,8BACZ,SAAU,OACV,WAAY,iBACZ,SAAU,CACR,WAAY,mDACZ,eAAgB,YAChB,oBAAqB,OACvB,CACF,EACA,aAAehC,GAAM,CACjBA,EAAA,OAAO,MAAM,WAAa,mDAC1BA,EAAA,OAAO,MAAM,oBAAsB,OACvC,EACA,aAAeA,GAAM,CACjBA,EAAA,OAAO,MAAM,WAAa,OAC1BA,EAAA,OAAO,MAAM,oBAAsB,QACvC,EAEC,SAAAgC,CAAA,EA1BI,aAAaF,GAAK,EA2BzB,CAAA,EAEFD,EAAYA,EAAU,MAAME,EAAc,CAAC,EAAE,MAAM,EACnD,QACF,CACF,CAGM,MAAAE,EAAkBJ,EAAU,MAAM,YAAY,EACpD,GAAII,EAAiB,CACV5B,EAAA,KACPtK,MAAC,QAAkC,MAAO,CACxC,WAAY,mDACZ,OAAQ,sDACR,aAAc,MACd,QAAS,UACT,WAAY,8BACZ,SAAU,OACV,MAAO,yCAAA,EAEN,SAAgBkM,EAAA,CAAC,CATT,EAAA,eAAeH,GAAK,EAU/B,CAAA,EAEFD,EAAYA,EAAU,MAAMI,EAAgB,CAAC,EAAE,MAAM,EACrD,QACF,CAGM,MAAAC,EAAYL,EAAU,MAAM,kBAAkB,EACpD,GAAIK,EAAW,CACJ7B,EAAA,KACPtK,MAAC,UAA6B,MAAO,CACnC,WAAY,IACZ,MAAO,yCAAA,EAEN,SAAUmM,EAAA,CAAC,CAJD,EAAA,QAAQJ,GAAK,EAK1B,CAAA,EAEFD,EAAYA,EAAU,MAAMK,EAAU,CAAC,EAAE,MAAM,EAC/C,QACF,CAGM,MAAAC,EAAcN,EAAU,MAAM,cAAc,EAClD,GAAIM,EAAa,CACN9B,EAAA,KACPtK,MAAC,MAA2B,MAAO,CACjC,UAAW,SACX,MAAO,yCAAA,EAEN,SAAYoM,EAAA,CAAC,CAJP,EAAA,UAAUL,GAAK,EAKxB,CAAA,EAEFD,EAAYA,EAAU,MAAMM,EAAY,CAAC,EAAE,MAAM,EACjD,QACF,CAGM,MAAAC,EAAYP,EAAU,MAAM,0BAA0B,EAC5D,GAAIO,EAAW,CACP,MAAAC,EAAWD,EAAU,CAAC,EACtBE,EAAWF,EAAU,CAAC,EACtBG,EAAeF,IAAa,OAC5BG,EAAkB,CACtB,QAAS,cACT,WAAY,SACZ,QAAS,WACT,WAAY,iCACZ,MAAO,OACP,eAAgB,OAChB,aAAc,MACd,SAAU,OACV,WAAY,IACZ,WAAY,SACZ,OAAQ,SAAA,EAEJC,EAAmB,CACvB,MAAO,iCACP,eAAgB,YAChB,oBAAqB,KAAA,EAEdpC,EAAA,KACPtK,EAAA,IAAC,IAAA,CACE,KAAMuM,EACN,OAAO,SACP,IAAI,sBACJ,MAAOC,EAAeC,EAAkBC,EACxC,SAAAJ,CAAA,EALK,QAAQP,GAAK,EAMrB,CAAA,EAEFD,EAAYA,EAAU,MAAMO,EAAU,CAAC,EAAE,MAAM,EAC/C,QACF,CAGM,MAAAM,EAAkBb,EAAU,OAAO,QAAQ,EACjD,GAAIa,IAAoB,GAAI,CAE1BrC,EAAS,KAAKwB,CAAS,EACvB,KAAA,MACSa,IAAoB,GAEpBrC,EAAA,KAAKwB,EAAU,CAAC,CAAC,EACdA,EAAAA,EAAU,MAAM,CAAC,IAE7BxB,EAAS,KAAKwB,EAAU,MAAM,EAAGa,CAAe,CAAC,EACrCb,EAAAA,EAAU,MAAMa,CAAe,EAE/C,CAEO,OAAArC,EAAS,SAAW,GAAK,OAAOA,EAAS,CAAC,GAAM,SAAWA,EAAS,CAAC,EAAIA,CAAA,EAI5ES,EAAkCjI,GAAS+I,EAAoB/I,CAAI,EAEzE,OAAQ9C,EAAAA,IAAA,MAAA,CAAK,SAAcqK,EAAAnB,CAAO,CAAE,CAAA,CACtC,EAMA,SAAwB0D,GAAY,CAClC,KAAAC,EACA,QAAA3D,EACA,KAAA4D,EACA,UAAAC,EACA,WAAAC,EACA,YAAAC,EACA,iBAAA9D,EACA,gBAAAC,CACF,EAAG,CACD,MAAM8D,EAASL,IAAS,OAGtB,OAAA9M,EAAA,KAAC,MAAA,CACC,MAAO,CACL,QAAS,OACT,cAAe,SACf,WAAYmN,EAAS,WAAa,aAClC,aAAc,OACd,MAAO,OACP,SAAU,MACZ,EAGA,SAAA,CAAAnN,EAAA,KAAC,MAAA,CACC,MAAO,CACL,SAAU,uBACV,MAAO,yCACP,aAAc,MACd,WAAY,IACZ,cAAe,QACjB,EAEC,SAAA,CAAAmN,EAAS,MAAQ,UACjBD,GAAe,CAACC,GACflN,EAAA,IAAC,OAAK,CAAA,MAAO,CAAE,WAAY,MAAO,MAAO,6BAA8B,EAAG,SAE1E,GAAA,CAAA,CAAA,CAAA,CAEJ,EAGCgN,GAAcA,EAAW,OAAS,GACjChN,EAAAA,IAAC,OAAI,MAAO,CACV,aAAc,MACd,QAAS,OACT,SAAU,OACV,IAAK,MACL,SAAU,KAAA,EAET,SAAAgN,EAAW,IAAI,CAACG,EAAOC,IACtBrN,EAAA,KAAC,OAAA,CAEC,MAAO,CACL,QAAS,eACT,SAAU,OACV,QAAS,UACT,aAAc,MACd,WAAY,gDACZ,OAAQ,aACNoN,EAAM,QACF,iCACAA,EAAM,UAAY,GAChB,gCACA,mCACR,GACA,MAAOA,EAAM,QACT,iCACAA,EAAM,UAAY,GAChB,gCACA,mCACR,EAEA,SAAA,CAACnN,EAAAA,IAAAqN,EAAA,OAAA,CAAO,KAAM,GAAI,MAAO,CAAE,YAAa,EAAG,cAAe,QAAY,CAAA,CAAA,EACrEF,EAAM,KACNA,EAAM,QAAU,MAAQA,EAAM,UAAY,GAAQ,KAAO,IAAA,CAAA,EAvBrDA,EAAM,IAAMC,CAyBpB,CAAA,EACH,EAIFpN,EAAA,IAAC,MAAA,CACC,MAAO,CACL,MAAO,OACP,SAAU,OACV,QAAS,YACT,aAAc,yBACd,WAAYkN,EACR,8CACA,gDACJ,OAAQA,EACJ,sDACA,+CACJ,SAAU,yBACV,WAAY,IACZ,MAAO,0CACP,UAAW,YACb,EAEC,SAAAJ,QACE,MAAI,CAAA,wBAAyB,CAAE,OAAQA,EAAQ,CAAA,EAC9CI,QAED,MAAI,CAAA,MAAO,CAAE,WAAY,YAAe,SAAQhE,EAAA,QAGhDD,GAAiB,CAAA,QAASC,GAAW,GAAI,iBAAAC,EAAoC,gBAAAC,EAAkC,CAAA,CAEpH,EAGC2D,GACC/M,EAAA,IAAC,MAAA,CACC,MAAO,CACL,SAAU,8BACV,MAAO,yCACP,UAAW,MACX,WAAY,6BACd,EAEC,SAAA+M,CAAA,CACH,CAAA,CAAA,CAAA,CAIR"}
1
+ {"version":3,"file":"ChatMessage.cjs.js","sources":["../src/components/chat/ChartRenderer.jsx","../src/components/chat/ChatMessage.jsx"],"sourcesContent":["\"use client\";\nimport React, { useRef, useCallback } from 'react';\nimport {\n ResponsiveContainer, BarChart, Bar, Cell, LineChart, Line,\n XAxis, YAxis, CartesianGrid, Tooltip, Legend,\n PieChart, Pie, AreaChart, Area,\n} from 'recharts';\n\n// Chordia design system rail colors — ordered for max visual distinction\nconst COLORS = [\n '#5E88B0', // rail-discovery / rail-blue\n '#9B7AA8', // rail-purple / rail-tone\n '#C98A5A', // rail-compliance / rail-orange\n '#7BA89D', // rail-signal-upsell (teal-green)\n '#D17B6B', // rail-coral / rail-signal-churn\n '#6B7C93', // rail-slate / rail-outcome\n '#9B8E6F', // rail-olive / rail-signal-satisfaction\n '#8A9BAF', // rail-quality\n '#B8976A', // rail-teal (warm gold)\n '#A8C76B', // green accent (complementary)\n];\n\n// Shared axis/tooltip/legend styling\nconst AXIS_TICK = { fill: 'var(--text-muted, #666)', fontSize: 12 };\nconst AXIS_LINE = { stroke: 'var(--border, #e0e0e0)' };\nconst GRID_STROKE = 'var(--border, #e0e0e0)';\nconst TOOLTIP_STYLE = {\n // pointerEvents: 'none' is critical — without it, the tooltip steals hover from chart elements\n // and flickers (especially noticeable on pie slices).\n // transition: 'none' disables Recharts' default position-slide animation, so the tooltip\n // snaps to the active point instead of flying in from its previous location.\n wrapperStyle: {\n zIndex: 9999,\n pointerEvents: 'none',\n outline: 'none',\n transition: 'none',\n },\n};\nconst LEGEND_STYLE = { color: 'var(--text-ink, #1e2125)', fontSize: '12px' };\n\n// Custom tooltip with a clean light-bg card layout.\n// Each row has a colored dot (the series color) + dark text — always readable, no contrast tricks.\nconst ChartTooltip = ({ active, payload, label }) => {\n if (!active || !payload || !payload.length) return null;\n return (\n <div\n className=\"chordia-chart-tooltip\"\n style={{\n background: '#ffffff',\n border: '1px solid rgba(52, 58, 64, 0.12)',\n borderRadius: 8,\n boxShadow: '0 8px 24px rgba(15, 23, 42, 0.12), 0 2px 6px rgba(15, 23, 42, 0.06)',\n padding: '10px 12px',\n minWidth: 140,\n maxWidth: 280,\n maxHeight: 280,\n overflowY: 'auto',\n fontSize: 12,\n lineHeight: 1.5,\n color: '#1E2125',\n // Re-enable pointer events on the inner content so the user can scroll with the wheel\n // even though the wrapper above has pointerEvents: 'none' (which prevents hover flicker).\n pointerEvents: 'auto',\n }}\n >\n <style>{`\n .chordia-chart-tooltip::-webkit-scrollbar { width: 8px; }\n .chordia-chart-tooltip::-webkit-scrollbar-track { background: transparent; }\n .chordia-chart-tooltip::-webkit-scrollbar-thumb {\n background: rgba(52, 58, 64, 0.25);\n border-radius: 4px;\n }\n .chordia-chart-tooltip::-webkit-scrollbar-thumb:hover {\n background: rgba(52, 58, 64, 0.4);\n }\n `}</style>\n {label !== undefined && label !== '' && (\n <div\n style={{\n fontSize: 11,\n fontWeight: 600,\n letterSpacing: '0.02em',\n color: '#6B7280',\n textTransform: 'uppercase',\n marginBottom: 6,\n paddingBottom: 6,\n borderBottom: '1px solid rgba(52, 58, 64, 0.08)',\n }}\n >\n {label}\n </div>\n )}\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4 }}>\n {payload.map((entry, i) => {\n const seriesColor = entry.color || entry.payload?.fill || '#9CA3AF';\n return (\n <div\n key={i}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n justifyContent: 'space-between',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, minWidth: 0 }}>\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n background: seriesColor,\n flexShrink: 0,\n }}\n />\n <span\n style={{\n color: '#374151',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {entry.name}\n </span>\n </div>\n <span style={{ color: '#111827', fontWeight: 600, marginLeft: 8 }}>\n {entry.value}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n\n// Smart label: skip x_label if tick values already contain the label text\nconst shouldShowAxisLabel = (label, tickValues) => {\n if (!label) return false;\n const lower = label.toLowerCase();\n // If most ticks contain the label word, it's redundant\n const matches = tickValues.filter(v => String(v).toLowerCase().includes(lower));\n return matches.length < tickValues.length * 0.5;\n};\n\n// --- Export utilities ---\nconst getChartSvg = (containerEl) => {\n const wrappers = Array.from(containerEl.querySelectorAll('.recharts-wrapper'));\n const largestWrapper = wrappers.length\n ? wrappers.reduce((largest, current) => {\n const largestRect = largest.getBoundingClientRect();\n const currentRect = current.getBoundingClientRect();\n return (currentRect.width * currentRect.height) > (largestRect.width * largestRect.height)\n ? current\n : largest;\n })\n : null;\n\n if (largestWrapper) {\n const surface = largestWrapper.querySelector('svg.recharts-surface');\n if (surface) {\n const rect = surface.getBoundingClientRect();\n if (rect.width >= 100 && rect.height >= 100) return surface;\n }\n }\n\n // Fallback: pick the largest SVG so we don't accidentally export icon SVGs.\n const candidates = Array.from(containerEl.querySelectorAll('svg'));\n if (!candidates.length) return null;\n\n const largestSvg = candidates.reduce((largest, current) => {\n const largestRect = largest.getBoundingClientRect();\n const currentRect = current.getBoundingClientRect();\n return (currentRect.width * currentRect.height) > (largestRect.width * largestRect.height)\n ? current\n : largest;\n });\n\n const largestRect = largestSvg.getBoundingClientRect();\n if (largestRect.width < 100 || largestRect.height < 100) return null;\n\n return largestSvg;\n};\n\nconst escapeXml = (value) => String(value)\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\n\nconst buildExportSvg = ({ chartSvg, width, height, legendItems = [] }) => {\n const baseSvg = chartSvg.cloneNode(true);\n const legendLineHeight = 20;\n const legendStartX = 16;\n const legendRightPadding = 16;\n const maxLegendX = width - legendRightPadding;\n const legendRows = [];\n let currentRow = [];\n let currentRowWidth = 0;\n\n legendItems.forEach(({ label, color }) => {\n const itemWidth = Math.max(40, (String(label).length * 7) + 34);\n if (currentRow.length && (legendStartX + currentRowWidth + itemWidth > maxLegendX)) {\n legendRows.push(currentRow);\n currentRow = [];\n currentRowWidth = 0;\n }\n currentRow.push({ label, color, itemWidth });\n currentRowWidth += itemWidth;\n });\n if (currentRow.length) legendRows.push(currentRow);\n\n const exportLegendHeight = legendRows.length ? (legendRows.length * legendLineHeight) + 20 : 0;\n const exportHeight = height + exportLegendHeight;\n\n baseSvg.setAttribute('width', width);\n baseSvg.setAttribute('height', height);\n baseSvg.setAttribute('x', 0);\n baseSvg.setAttribute('y', 0);\n\n const legendMarkup = legendRows.map((row, rowIndex) => {\n let cursorX = legendStartX;\n const legendLineY = height + 20 + (rowIndex * legendLineHeight);\n const rowMarkup = row.map(({ label, color, itemWidth }) => {\n const line = `<line x1=\"${cursorX}\" y1=\"${legendLineY}\" x2=\"${cursorX + 10}\" y2=\"${legendLineY}\" stroke=\"${color}\" stroke-width=\"2\" />`;\n const dot = `<circle cx=\"${cursorX + 5}\" cy=\"${legendLineY}\" r=\"2.5\" fill=\"#fff\" stroke=\"${color}\" stroke-width=\"1.5\" />`;\n const text = `<text x=\"${cursorX + 14}\" y=\"${legendLineY + 4}\" fill=\"#666\" font-size=\"12\">${escapeXml(label)}</text>`;\n cursorX += itemWidth;\n return `${line}${dot}${text}`;\n }).join('');\n return rowMarkup;\n }).join('');\n\n return [\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${exportHeight}\" viewBox=\"0 0 ${width} ${exportHeight}\">`,\n '<style>text { font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif; }</style>',\n '<rect x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" fill=\"#ffffff\" />',\n new XMLSerializer().serializeToString(baseSvg),\n legendMarkup,\n '</svg>',\n ].join('');\n};\n\nconst downloadPng = async (containerEl, title, legendItems = []) => {\n const svg = getChartSvg(containerEl);\n if (!svg) return;\n // Ensure dimensions\n const svgRect = svg.getBoundingClientRect();\n const w = svgRect.width || svg.clientWidth || Number(svg.getAttribute('width')) || 600;\n const h = svgRect.height || svg.clientHeight || Number(svg.getAttribute('height')) || 300;\n const xml = buildExportSvg({ chartSvg: svg, width: w, height: h, legendItems });\n const blob = new Blob([xml], { type: 'image/svg+xml;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n const img = new Image();\n img.onload = () => {\n const canvas = document.createElement('canvas');\n const scale = 2; // retina\n canvas.width = w * scale;\n canvas.height = h * scale;\n const ctx = canvas.getContext('2d');\n ctx.fillStyle = '#ffffff';\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.scale(scale, scale);\n ctx.drawImage(img, 0, 0, w, h);\n URL.revokeObjectURL(url);\n const link = document.createElement('a');\n link.download = `${(title || 'chart').replace(/[^a-z0-9]+/gi, '_')}.png`;\n link.href = canvas.toDataURL('image/png');\n link.click();\n };\n img.src = url;\n};\n\nconst downloadSvg = (containerEl, title, legendItems = []) => {\n const svg = getChartSvg(containerEl);\n if (!svg) return;\n const svgRect = svg.getBoundingClientRect();\n const w = svgRect.width || svg.clientWidth || Number(svg.getAttribute('width')) || 600;\n const h = svgRect.height || svg.clientHeight || Number(svg.getAttribute('height')) || 300;\n\n const xml = buildExportSvg({ chartSvg: svg, width: w, height: h, legendItems });\n const blob = new Blob([xml], { type: 'image/svg+xml;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.download = `${(title || 'chart').replace(/[^a-z0-9]+/gi, '_')}.svg`;\n link.href = url;\n link.click();\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n};\n\nconst copyAsCsv = (series, allXValues) => {\n const header = ['', ...series.map(s => s.name)].join(',');\n const rows = allXValues.map(x => {\n const vals = series.map(s => {\n const match = s.data.find(d => d.x === x);\n return match ? match.y : '';\n });\n return [x, ...vals].join(',');\n });\n const csv = [header, ...rows].join('\\n');\n navigator.clipboard.writeText(csv);\n};\n\nconst ActionBar = ({ onDownloadPng, onCopy, copied }) => (\n <div style={{\n display: 'flex', gap: 6, justifyContent: 'flex-end',\n marginBottom: 8, opacity: 0.7, transition: 'opacity 0.15s',\n }}>\n <button onClick={onCopy} title=\"Copy data as CSV\" style={{\n background: 'none', border: '1px solid var(--border, #e0e0e0)',\n borderRadius: 'var(--radius-sm, 4px)', padding: '3px 8px',\n fontSize: 11, color: 'var(--text-muted, #666)', cursor: 'pointer',\n display: 'flex', alignItems: 'center', gap: 4,\n }}>\n {copied ? '✓ Copied' : '📋 CSV'}\n </button>\n <button onClick={onDownloadPng} title=\"Download as PNG\" style={{\n background: 'none', border: '1px solid var(--border, #e0e0e0)',\n borderRadius: 'var(--radius-sm, 4px)', padding: '3px 8px',\n fontSize: 11, color: 'var(--text-muted, #666)', cursor: 'pointer',\n display: 'flex', alignItems: 'center', gap: 4,\n }}>\n 📥 PNG\n </button>\n </div>\n);\n\nconst ChartRenderer = ({ chartType, title, xLabel, yLabel, series, compact = false }) => {\n const chartRef = useRef(null);\n const [copied, setCopied] = React.useState(false);\n\n if (!series || series.length === 0) return null;\n\n // Transform: merge all series into [{x, series1: val, series2: val}, ...]\n const allXValues = [...new Set(series.flatMap(s => s.data.map(d => d.x)))];\n const chartData = allXValues.map(x => {\n const point = { x };\n series.forEach(s => {\n const match = s.data.find(d => d.x === x);\n point[s.name] = match ? match.y : null;\n });\n return point;\n });\n\n const seriesNames = series.map(s => s.name);\n const isSingleSeries = seriesNames.length === 1;\n\n // Determine if axis labels are redundant\n const showXLabel = shouldShowAxisLabel(xLabel, allXValues);\n\n // Check if x-axis labels are long (rotate them)\n const maxTickLen = Math.max(...allXValues.map(v => String(v).length));\n const rotateXTicks = maxTickLen > 12 || allXValues.length > 8;\n\n // Bottom margin: stack space for tick labels + the axis label so they don't overlap\n const xTickSpace = rotateXTicks ? 40 : 5;\n const xLabelSpace = showXLabel ? 25 : 0;\n const bottomMargin = xTickSpace + xLabelSpace;\n\n // Estimate legend rows so we can reserve enough vertical space for it. Recharts\n // doesn't auto-detect wrapping, so a multi-row legend collides with the x-axis label.\n // Conservative estimate: ~4 items per row.\n const legendRows = isSingleSeries ? 0 : Math.max(1, Math.ceil(seriesNames.length / 4));\n const legendHeight = legendRows > 0 ? legendRows * 24 + (showXLabel ? 24 : 12) : 0;\n\n // Bump chart container height so the wrapped legend gets its own space below the chart\n // SVG instead of overlapping the x-axis label.\n // In compact mode (e.g. AskCompass panel), shrink the base height so charts feel proportional\n // to the smaller surface they're rendered in.\n const baseChartHeight = compact ? 240 : 300;\n const chartHeight = baseChartHeight + Math.max(0, (legendRows - 1) * 28);\n\n // Always keep a gap between the x-axis (or its label) and the legend.\n // Extra padding when an x-label is also present so all three layers (ticks → label → legend) breathe.\n // zIndex: 0 ensures the legend never paints over the tooltip (which is zIndex: 1000).\n const legendPaddingTop = showXLabel ? 24 : 12;\n const legendWrapperStyle = { ...LEGEND_STYLE, paddingTop: legendPaddingTop, zIndex: 0 };\n\n const containerStyle = {\n background: 'var(--paper-elevated, #fff)',\n border: '1px solid var(--border, #e0e0e0)',\n borderRadius: 'var(--radius-md, 8px)',\n padding: '16px',\n marginBottom: '16px',\n };\n\n const titleStyle = {\n color: 'var(--text-strong, #1e2125)',\n fontSize: '14px',\n fontWeight: '600',\n marginBottom: '12px',\n };\n\n const xAxisProps = {\n dataKey: 'x',\n tick: rotateXTicks\n ? { fill: 'var(--text-muted, #666)', fontSize: 11, angle: -35, textAnchor: 'end' }\n : AXIS_TICK,\n axisLine: AXIS_LINE,\n tickLine: AXIS_LINE,\n ...(showXLabel ? {\n label: {\n value: xLabel,\n position: 'insideBottom',\n // Push label below rotated ticks (which take ~40px) when present\n offset: rotateXTicks ? -45 : -10,\n style: { textAnchor: 'middle', fill: 'var(--text-muted, #666)' },\n },\n } : {}),\n };\n\n const yAxisProps = {\n tick: AXIS_TICK,\n axisLine: AXIS_LINE,\n tickLine: AXIS_LINE,\n ...(yLabel ? {\n width: 72,\n label: {\n value: yLabel,\n angle: -90,\n position: 'insideLeft',\n offset: 10,\n style: { textAnchor: 'middle', fill: 'var(--text-muted, #666)' },\n },\n } : {}),\n };\n\n const renderChart = () => {\n switch (chartType) {\n case 'bar':\n return (\n <ResponsiveContainer width=\"100%\" height={chartHeight}>\n <BarChart data={chartData} margin={{ top: 5, right: 30, left: yLabel ? 10 : 20, bottom: bottomMargin }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={GRID_STROKE} />\n <XAxis {...xAxisProps} />\n <YAxis {...yAxisProps} />\n {!isSingleSeries && <Legend wrapperStyle={legendWrapperStyle} height={legendHeight} />}\n {seriesNames.map((name, i) => (\n <Bar key={name} dataKey={name} fill={COLORS[i % COLORS.length]} radius={[2, 2, 0, 0]} isAnimationActive={false}>\n {isSingleSeries && chartData.map((_, idx) => (\n <Cell key={idx} fill={COLORS[idx % COLORS.length]} />\n ))}\n </Bar>\n ))}\n <Tooltip wrapperStyle={TOOLTIP_STYLE.wrapperStyle} content={<ChartTooltip />} cursor={{ fill: 'rgba(94, 136, 176, 0.06)', stroke: 'rgba(52, 58, 64, 0.18)', strokeDasharray: '3 3' }} isAnimationActive={false} animationDuration={0} />\n </BarChart>\n </ResponsiveContainer>\n );\n\n case 'horizontal_bar': {\n // Horizontal bar: swap X/Y, use YAxis for categories\n return (\n <ResponsiveContainer width=\"100%\" height={Math.max(compact ? 240 : 300, chartData.length * (compact ? 32 : 40))}>\n <BarChart data={chartData} layout=\"vertical\" margin={{ top: 5, right: 30, left: 100, bottom: 5 }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={GRID_STROKE} />\n <XAxis type=\"number\" tick={AXIS_TICK} axisLine={AXIS_LINE} tickLine={AXIS_LINE}\n {...(yLabel ? { label: { value: yLabel, position: 'insideBottom', offset: -5, style: { textAnchor: 'middle', fill: 'var(--text-muted, #666)' } } } : {})}\n />\n <YAxis type=\"category\" dataKey=\"x\" tick={{ fill: 'var(--text-muted, #666)', fontSize: 11 }} width={90} axisLine={AXIS_LINE} tickLine={AXIS_LINE} />\n {!isSingleSeries && <Legend wrapperStyle={legendWrapperStyle} height={legendHeight} />}\n {seriesNames.map((name, i) => (\n <Bar key={name} dataKey={name} fill={COLORS[i % COLORS.length]} radius={[0, 2, 2, 0]} isAnimationActive={false}>\n {isSingleSeries && chartData.map((_, idx) => (\n <Cell key={idx} fill={COLORS[idx % COLORS.length]} />\n ))}\n </Bar>\n ))}\n <Tooltip wrapperStyle={TOOLTIP_STYLE.wrapperStyle} content={<ChartTooltip />} cursor={{ fill: 'rgba(94, 136, 176, 0.06)', stroke: 'rgba(52, 58, 64, 0.18)', strokeDasharray: '3 3' }} isAnimationActive={false} animationDuration={0} />\n </BarChart>\n </ResponsiveContainer>\n );\n }\n\n case 'line':\n return (\n <ResponsiveContainer width=\"100%\" height={chartHeight}>\n <LineChart data={chartData} margin={{ top: 5, right: 30, left: yLabel ? 10 : 20, bottom: bottomMargin }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={GRID_STROKE} />\n <XAxis {...xAxisProps} />\n <YAxis {...yAxisProps} />\n <Legend wrapperStyle={legendWrapperStyle} height={legendHeight} />\n {seriesNames.map((name, i) => (\n <Line key={name} type=\"monotone\" dataKey={name}\n stroke={COLORS[i % COLORS.length]} strokeWidth={2}\n dot={{ r: 4, fill: COLORS[i % COLORS.length] }}\n activeDot={{ r: 6, fill: COLORS[i % COLORS.length] }}\n isAnimationActive={false}\n />\n ))}\n <Tooltip wrapperStyle={TOOLTIP_STYLE.wrapperStyle} content={<ChartTooltip />} cursor={{ fill: 'rgba(94, 136, 176, 0.06)', stroke: 'rgba(52, 58, 64, 0.18)', strokeDasharray: '3 3' }} isAnimationActive={false} animationDuration={0} />\n </LineChart>\n </ResponsiveContainer>\n );\n\n case 'area':\n return (\n <ResponsiveContainer width=\"100%\" height={chartHeight}>\n <AreaChart data={chartData} margin={{ top: 5, right: 30, left: yLabel ? 10 : 20, bottom: bottomMargin }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={GRID_STROKE} />\n <XAxis {...xAxisProps} />\n <YAxis {...yAxisProps} />\n <Legend wrapperStyle={legendWrapperStyle} height={legendHeight} />\n {seriesNames.map((name, i) => (\n <Area key={name} type=\"monotone\" dataKey={name}\n stroke={COLORS[i % COLORS.length]} strokeWidth={2}\n fill={COLORS[i % COLORS.length]} fillOpacity={0.15}\n isAnimationActive={false}\n />\n ))}\n <Tooltip wrapperStyle={TOOLTIP_STYLE.wrapperStyle} content={<ChartTooltip />} cursor={{ fill: 'rgba(94, 136, 176, 0.06)', stroke: 'rgba(52, 58, 64, 0.18)', strokeDasharray: '3 3' }} isAnimationActive={false} animationDuration={0} />\n </AreaChart>\n </ResponsiveContainer>\n );\n\n case 'pie': {\n // Pie uses first series only\n const pieData = series[0].data.map((d, i) => ({\n name: d.x,\n value: d.y,\n fill: COLORS[i % COLORS.length],\n }));\n const RADIAN = Math.PI / 180;\n const renderLabel = ({ cx, cy, midAngle, innerRadius, outerRadius, percent, name }) => {\n const radius = outerRadius + 20;\n const x = cx + radius * Math.cos(-midAngle * RADIAN);\n const y = cy + radius * Math.sin(-midAngle * RADIAN);\n if (percent < 0.04) return null;\n return (\n <text x={x} y={y} fill=\"var(--text-ink, #1e2125)\" fontSize={11}\n textAnchor={x > cx ? 'start' : 'end'} dominantBaseline=\"central\">\n {name} ({(percent * 100).toFixed(0)}%)\n </text>\n );\n };\n return (\n <ResponsiveContainer width=\"100%\" height={compact ? 260 : 320}>\n <PieChart margin={{ top: 16, right: 16, bottom: 16, left: 16 }}>\n <Pie data={pieData} cx={compact ? \"42%\" : \"38%\"} cy=\"50%\" outerRadius={compact ? 88 : 110}\n dataKey=\"value\" label={renderLabel} labelLine={{ stroke: 'var(--text-muted, #666)' }}\n isAnimationActive={false}>\n {pieData.map((entry, i) => (\n <Cell key={i} fill={entry.fill} />\n ))}\n </Pie>\n <Tooltip wrapperStyle={TOOLTIP_STYLE.wrapperStyle} content={<ChartTooltip />} cursor={{ fill: 'rgba(94, 136, 176, 0.06)', stroke: 'rgba(52, 58, 64, 0.18)', strokeDasharray: '3 3' }} isAnimationActive={false} animationDuration={0} />\n </PieChart>\n </ResponsiveContainer>\n );\n }\n\n case 'metric': {\n const s = series[0];\n const current = s.data[0];\n const previous = s.data.length > 1 ? s.data[1] : null;\n const value = current.y;\n const unit = current.x || '';\n const hasTrend = previous !== null;\n const change = hasTrend ? value - previous.y : 0;\n const pctChange = hasTrend && previous.y !== 0 ? ((change / Math.abs(previous.y)) * 100) : 0;\n const isPositive = change > 0;\n const isNegative = change < 0;\n const trendColor = isPositive ? '#7BA89D' : isNegative ? '#D17B6B' : 'var(--text-muted, #666)';\n const trendArrow = isPositive ? '↑' : isNegative ? '↓' : '→';\n\n // Format large numbers nicely\n const fmt = (n) => {\n if (Number.isInteger(n) && Math.abs(n) >= 1000) return n.toLocaleString();\n if (typeof n === 'number') return n % 1 === 0 ? n.toString() : n.toFixed(n < 10 ? 2 : 1);\n return String(n);\n };\n\n return (\n <div style={{ display: 'flex', alignItems: 'baseline', gap: 12, padding: '8px 0' }}>\n <div style={{\n fontSize: '36px', fontWeight: 700, lineHeight: 1,\n color: 'var(--text-strong, #1e2125)',\n fontVariantNumeric: 'tabular-nums',\n }}>\n {fmt(value)}\n </div>\n {unit && (\n <div style={{ fontSize: '14px', color: 'var(--text-muted, #666)', fontWeight: 500 }}>\n {unit}\n </div>\n )}\n {hasTrend && (\n <div style={{\n display: 'flex', alignItems: 'center', gap: 4,\n fontSize: '13px', fontWeight: 600, color: trendColor,\n background: isPositive ? 'rgba(123,168,157,0.12)' : isNegative ? 'rgba(209,123,107,0.12)' : 'rgba(128,128,128,0.08)',\n padding: '3px 8px', borderRadius: 'var(--radius-sm, 4px)',\n }}>\n <span>{trendArrow}</span>\n <span>{fmt(Math.abs(change))} ({Math.abs(pctChange).toFixed(1)}%)</span>\n </div>\n )}\n {hasTrend && (\n <div style={{ fontSize: '11px', color: 'var(--text-faint, #999)' }}>\n vs {previous.x || 'previous'}\n </div>\n )}\n </div>\n );\n }\n\n default:\n return <div style={{ color: 'var(--text-muted)', fontSize: 12, padding: 8 }}>Unsupported chart type: {chartType}</div>;\n }\n };\n\n const showLegendInExport = chartType === 'line'\n || chartType === 'area'\n || ((chartType === 'bar' || chartType === 'horizontal_bar') && !isSingleSeries);\n\n const exportLegendItems = showLegendInExport\n ? seriesNames.map((name, i) => ({ label: name, color: COLORS[i % COLORS.length] }))\n : [];\n\n const handleDownloadPng = useCallback(() => {\n if (chartRef.current) downloadPng(chartRef.current, title, exportLegendItems);\n }, [title, exportLegendItems]);\n\n const handleCopy = useCallback(() => {\n copyAsCsv(series, allXValues);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }, [series, allXValues]);\n\n const showActions = chartType !== 'metric';\n\n return (\n <div style={containerStyle}>\n {title && <div style={titleStyle}>{title}</div>}\n {showActions && <ActionBar onDownloadPng={handleDownloadPng} onCopy={handleCopy} copied={copied} />}\n <div ref={chartRef}>\n {renderChart()}\n </div>\n </div>\n );\n};\n\nexport default ChartRenderer;\n","\"use client\";\n\nimport React, { useState, useRef, useEffect } from \"react\";\nimport { Wrench, Copy, Check, PanelRightOpen, ThumbsUp, ThumbsDown } from \"lucide-react\";\n\n/**\n * Lightweight Markdown Renderer\n * Handles: code blocks, inline code, bold, italic, links, lists, headers, horizontal rules, file paths\n */\nconst MarkdownRenderer = ({ content, onCodeBlockClick, onFilePathClick }) => {\n const [copiedBlocks, setCopiedBlocks] = useState(new Set());\n\n const copyToClipboard = async (text, blockId) => {\n try {\n await navigator.clipboard.writeText(text);\n setCopiedBlocks(prev => new Set([...prev, blockId]));\n setTimeout(() => {\n setCopiedBlocks(prev => {\n const newSet = new Set(prev);\n newSet.delete(blockId);\n return newSet;\n });\n }, 2000);\n } catch (err) {\n console.error('Failed to copy text:', err);\n }\n };\n\n const renderCodeBlock = (code, language, blockId) => {\n const isCopied = copiedBlocks.has(blockId);\n \n return (\n <div \n key={blockId}\n style={{\n position: 'relative',\n marginBottom: '16px',\n borderRadius: '8px',\n background: 'var(--ink, #1E2125)',\n border: '1px solid var(--border-subtle, rgba(52,58,64,0.08))',\n overflow: 'hidden',\n }}\n >\n {/* Header with language and copy button */}\n <div style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '8px 12px',\n background: 'rgba(255,255,255,0.05)',\n borderBottom: '1px solid rgba(255,255,255,0.1)',\n }}>\n <span style={{\n fontSize: '11px',\n color: 'rgba(255,255,255,0.7)',\n fontFamily: 'var(--font-mono, monospace)',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n }}>\n {language || 'code'}\n </span>\n <button\n onClick={() => copyToClipboard(code, blockId)}\n style={{\n background: 'none',\n border: 'none',\n color: 'rgba(255,255,255,0.7)',\n cursor: 'pointer',\n padding: '4px',\n borderRadius: '4px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n fontSize: '11px',\n transition: 'all 0.15s ease',\n }}\n onMouseEnter={(e) => {\n e.target.style.background = 'rgba(255,255,255,0.1)';\n e.target.style.color = 'rgba(255,255,255,0.9)';\n }}\n onMouseLeave={(e) => {\n e.target.style.background = 'none';\n e.target.style.color = 'rgba(255,255,255,0.7)';\n }}\n >\n {isCopied ? <Check size={12} /> : <Copy size={12} />}\n {isCopied ? 'Copied!' : 'Copy'}\n </button>\n {onCodeBlockClick && (\n <button\n onClick={() => onCodeBlockClick({ code, language })}\n style={{\n background: 'none',\n border: 'none',\n color: 'rgba(255,255,255,0.7)',\n cursor: 'pointer',\n padding: '4px',\n borderRadius: '4px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n fontSize: '11px',\n transition: 'all 0.15s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'rgba(255,255,255,0.1)';\n e.currentTarget.style.color = 'rgba(255,255,255,0.9)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'none';\n e.currentTarget.style.color = 'rgba(255,255,255,0.7)';\n }}\n >\n <PanelRightOpen size={12} />\n Canvas\n </button>\n )}\n </div>\n {/* Code content */}\n <pre style={{\n margin: 0,\n padding: '12px',\n fontFamily: 'var(--font-mono, monospace)',\n fontSize: '13px',\n lineHeight: 1.4,\n color: 'rgba(255,255,255,0.95)',\n overflow: 'auto',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n }}>\n {code}\n </pre>\n </div>\n );\n };\n\n const parseMarkdown = (text) => {\n const elements = [];\n const lines = text.split('\\n');\n let i = 0;\n let blockId = 0;\n\n while (i < lines.length) {\n const line = lines[i];\n \n // Code blocks (```language)\n if (line.trim().startsWith('```')) {\n const language = line.trim().slice(3);\n let codeLines = [];\n i++;\n \n while (i < lines.length && !lines[i].trim().startsWith('```')) {\n codeLines.push(lines[i]);\n i++;\n }\n \n if (i < lines.length) i++; // Skip closing ```\n \n elements.push(renderCodeBlock(codeLines.join('\\n'), language, `code-${blockId++}`));\n continue;\n }\n \n // Headers\n if (line.startsWith('#')) {\n const level = line.match(/^#+/)[0].length;\n const text = line.slice(level).trim();\n const HeaderTag = level === 1 ? 'h2' : level === 2 ? 'h3' : level === 3 ? 'h4' : 'h5';\n \n elements.push(\n React.createElement(HeaderTag, {\n key: `header-${i}`,\n style: {\n fontSize: level === 1 ? '18px' : level === 2 ? '16px' : '14px',\n fontWeight: 720,\n color: 'var(--text-strong, rgba(30,33,37,0.92))',\n marginTop: elements.length > 0 ? '20px' : '0',\n marginBottom: '8px',\n lineHeight: 1.3,\n }\n }, text)\n );\n i++;\n continue;\n }\n \n // Horizontal rule\n if (line.trim() === '---' || line.trim() === '***') {\n elements.push(\n <hr key={`hr-${i}`} style={{\n border: 'none',\n borderTop: '1px solid var(--border-subtle, rgba(52,58,64,0.08))',\n margin: '16px 0',\n }} />\n );\n i++;\n continue;\n }\n \n // Lists\n if (line.match(/^(\\s*)([-*+]|\\d+\\.)\\s/)) {\n const listItems = [];\n const isOrdered = /^\\s*\\d+\\./.test(line);\n \n while (i < lines.length && (lines[i].match(/^(\\s*)([-*+]|\\d+\\.)\\s/) || lines[i].trim() === '')) {\n if (lines[i].trim() !== '') {\n const match = lines[i].match(/^(\\s*)([-*+]|\\d+\\.)\\s(.*)$/);\n if (match) {\n listItems.push(match[3]);\n }\n }\n i++;\n }\n \n const ListTag = isOrdered ? 'ol' : 'ul';\n elements.push(\n React.createElement(ListTag, {\n key: `list-${i}`,\n style: {\n margin: '8px 0',\n paddingLeft: '20px',\n color: 'var(--text-strong, rgba(30,33,37,0.92))',\n }\n }, listItems.map((item, idx) => \n React.createElement('li', {\n key: `item-${idx}`,\n style: { marginBottom: '4px' }\n }, parseInlineMarkdownWithContext(item))\n ))\n );\n continue;\n }\n \n // Tables (lines starting with |)\n if (line.trim().startsWith('|') && line.trim().endsWith('|')) {\n const tableRows = [];\n while (i < lines.length && lines[i].trim().startsWith('|') && lines[i].trim().endsWith('|')) {\n tableRows.push(lines[i]);\n i++;\n }\n \n if (tableRows.length >= 2) {\n // Parse cells from each row\n const parseCells = (row) => row.trim().slice(1, -1).split('|').map(c => c.trim());\n const headerCells = parseCells(tableRows[0]);\n \n // Check if row 1 is a separator (---|---|---)\n const isSeparator = (row) => parseCells(row).every(c => /^[-:]+$/.test(c));\n const hasSeparator = tableRows.length >= 2 && isSeparator(tableRows[1]);\n const bodyStart = hasSeparator ? 2 : 1;\n \n // Parse alignment from separator\n const alignments = hasSeparator ? parseCells(tableRows[1]).map(c => {\n if (c.startsWith(':') && c.endsWith(':')) return 'center';\n if (c.endsWith(':')) return 'right';\n return 'left';\n }) : headerCells.map(() => 'left');\n \n const cellStyle = {\n padding: '6px 12px',\n borderBottom: '1px solid var(--border-subtle, rgba(52,58,64,0.08))',\n fontSize: '13px',\n lineHeight: 1.5,\n color: 'var(--text-strong, rgba(30,33,37,0.92))',\n // Override the chat bubble's inherited `word-break: break-word`\n // so cells size to natural min-content; the wrapper's\n // overflow-x: auto handles wide tables via horizontal scroll\n // instead of collapsing columns char-by-char on long URLs.\n wordBreak: 'normal',\n overflowWrap: 'normal',\n };\n \n elements.push(\n <div key={`table-${i}`} style={{ overflowX: 'auto', margin: '8px 0' }}>\n <table style={{\n borderCollapse: 'collapse',\n width: '100%',\n border: '1px solid var(--border-subtle, rgba(52,58,64,0.08))',\n borderRadius: '6px',\n overflow: 'hidden',\n }}>\n {hasSeparator && (\n <thead>\n <tr style={{ background: 'var(--hover-warm-subtle, rgba(231,212,162,0.08))' }}>\n {headerCells.map((cell, ci) => (\n <th key={ci} style={{ ...cellStyle, fontWeight: 660, textAlign: alignments[ci] || 'left', whiteSpace: 'nowrap' }}>\n {parseInlineMarkdownWithContext(cell)}\n </th>\n ))}\n </tr>\n </thead>\n )}\n <tbody>\n {(hasSeparator ? tableRows.slice(bodyStart) : tableRows).map((row, ri) => (\n <tr key={ri} style={{ background: ri % 2 === 1 ? 'var(--hover-warm-subtle, rgba(231,212,162,0.04))' : 'transparent' }}>\n {parseCells(row).map((cell, ci) => (\n <td key={ci} style={{ ...cellStyle, textAlign: alignments[ci] || 'left' }}>\n {parseInlineMarkdownWithContext(cell)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n }\n continue;\n }\n \n // Regular paragraphs\n if (line.trim()) {\n const paragraph = [];\n while (i < lines.length && lines[i].trim() && !lines[i].match(/^(#|```|---|\\*\\*\\*|(\\s*)([-*+]|\\d+\\.)\\s)/) && !(lines[i].trim().startsWith('|') && lines[i].trim().endsWith('|'))) {\n paragraph.push(lines[i]);\n i++;\n }\n \n if (paragraph.length > 0) {\n elements.push(\n <p key={`p-${i}`} style={{ \n margin: '8px 0',\n lineHeight: 1.6,\n color: 'var(--text-strong, rgba(30,33,37,0.92))',\n }}>\n {parseInlineMarkdownWithContext(paragraph.join(' '))}\n </p>\n );\n }\n } else {\n i++;\n }\n }\n \n return elements;\n };\n\n const parseInlineMarkdown = (text) => {\n const elements = [];\n let remaining = text;\n let key = 0;\n\n while (remaining.length > 0) {\n // File paths (before other patterns to catch them first)\n if (onFilePathClick) {\n // Match file paths: containing /src/, /components/, /packages/ or ending in common extensions\n const filePathMatch = remaining.match(/^([^\\s`*\\[]+(?:\\/src\\/|\\/components\\/|\\/packages\\/)[^\\s`*\\[]*|[^\\s`*\\[]*\\.(ts|tsx|js|jsx|py|css|scss|sass|json|md|yaml|yml|html|xml|sh|sql|go|rs|php|java|c|cpp|h|hpp)(?:\\b|$))/);\n if (filePathMatch) {\n const filePath = filePathMatch[1];\n elements.push(\n <span\n key={`file-path-${key++}`}\n onClick={() => onFilePathClick(filePath)}\n style={{\n color: 'var(--rail-discovery, #5E88B0)',\n textDecoration: 'underline',\n textDecorationStyle: 'dotted',\n textUnderlineOffset: '2px',\n cursor: 'pointer',\n fontFamily: 'var(--font-mono, monospace)',\n fontSize: '13px',\n transition: 'all 0.15s ease',\n ':hover': {\n background: 'var(--hover-warm-subtle, rgba(231,212,162,0.08))',\n textDecoration: 'underline',\n textDecorationStyle: 'solid'\n }\n }}\n onMouseEnter={(e) => {\n e.target.style.background = 'var(--hover-warm-subtle, rgba(231,212,162,0.08))';\n e.target.style.textDecorationStyle = 'solid';\n }}\n onMouseLeave={(e) => {\n e.target.style.background = 'none';\n e.target.style.textDecorationStyle = 'dotted';\n }}\n >\n {filePath}\n </span>\n );\n remaining = remaining.slice(filePathMatch[0].length);\n continue;\n }\n }\n\n // Inline code\n const inlineCodeMatch = remaining.match(/^`([^`]+)`/);\n if (inlineCodeMatch) {\n elements.push(\n <code key={`inline-code-${key++}`} style={{\n background: 'var(--hover-warm-subtle, rgba(231,212,162,0.08))',\n border: '1px solid var(--border-subtle, rgba(52,58,64,0.08))',\n borderRadius: '3px',\n padding: '2px 4px',\n fontFamily: 'var(--font-mono, monospace)',\n fontSize: '12px',\n color: 'var(--text-strong, rgba(30,33,37,0.92))',\n }}>\n {inlineCodeMatch[1]}\n </code>\n );\n remaining = remaining.slice(inlineCodeMatch[0].length);\n continue;\n }\n\n // Bold\n const boldMatch = remaining.match(/^\\*\\*([^*]+)\\*\\*/);\n if (boldMatch) {\n elements.push(\n <strong key={`bold-${key++}`} style={{\n fontWeight: 720,\n color: 'var(--text-strong, rgba(30,33,37,0.92))',\n }}>\n {boldMatch[1]}\n </strong>\n );\n remaining = remaining.slice(boldMatch[0].length);\n continue;\n }\n\n // Italic\n const italicMatch = remaining.match(/^\\*([^*]+)\\*/);\n if (italicMatch) {\n elements.push(\n <em key={`italic-${key++}`} style={{\n fontStyle: 'italic',\n color: 'var(--text-strong, rgba(30,33,37,0.92))',\n }}>\n {italicMatch[1]}\n </em>\n );\n remaining = remaining.slice(italicMatch[0].length);\n continue;\n }\n\n // Images ![alt](url) — the chart/image itself renders separately, so\n // show the alt text as a proper link to the source (no stray \"!\").\n const imageMatch = remaining.match(/^!\\[([^\\]]*)\\]\\(([^)]+)\\)/);\n if (imageMatch) {\n const altText = imageMatch[1] || imageMatch[2];\n const imgHref = imageMatch[2];\n elements.push(\n <a key={`img-link-${key++}`}\n href={imgHref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n color: 'var(--rail-discovery, #5E88B0)',\n textDecoration: 'underline',\n textUnderlineOffset: '2px',\n }}>\n {altText}\n </a>\n );\n remaining = remaining.slice(imageMatch[0].length);\n continue;\n }\n\n // Links\n const linkMatch = remaining.match(/^\\[([^\\]]+)\\]\\(([^)]+)\\)/);\n if (linkMatch) {\n const linkText = linkMatch[1];\n const linkHref = linkMatch[2];\n const isViewButton = linkText === 'View';\n const viewButtonStyle = {\n display: 'inline-flex',\n alignItems: 'center',\n padding: '3px 10px',\n background: 'var(--rail-discovery, #5E88B0)',\n color: '#fff',\n textDecoration: 'none',\n borderRadius: '4px',\n fontSize: '12px',\n fontWeight: 600,\n whiteSpace: 'nowrap',\n cursor: 'pointer',\n };\n const defaultLinkStyle = {\n color: 'var(--rail-discovery, #5E88B0)',\n textDecoration: 'underline',\n textUnderlineOffset: '2px',\n };\n elements.push(\n <a key={`link-${key++}`}\n href={linkHref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={isViewButton ? viewButtonStyle : defaultLinkStyle}>\n {linkText}\n </a>\n );\n remaining = remaining.slice(linkMatch[0].length);\n continue;\n }\n\n // Regular text — consume up to the next special char, or consume the special char itself if no pattern matched\n const nextSpecialChar = remaining.search(/[`*\\[!]/);\n if (nextSpecialChar === -1) {\n // No more special chars — add rest and break\n elements.push(remaining);\n break;\n } else if (nextSpecialChar === 0) {\n // Special char at position 0 but no pattern matched — consume it as text\n elements.push(remaining[0]);\n remaining = remaining.slice(1);\n } else {\n elements.push(remaining.slice(0, nextSpecialChar));\n remaining = remaining.slice(nextSpecialChar);\n }\n }\n\n return elements.length === 1 && typeof elements[0] === 'string' ? elements[0] : elements;\n };\n\n // Helper to pass context to parseInlineMarkdown calls within parseMarkdown\n const parseInlineMarkdownWithContext = (text) => parseInlineMarkdown(text);\n \n return <div>{parseMarkdown(content)}</div>;\n};\n\nconst ACTION_MUTED = \"#808183\"; // grey/muted\nconst ACTION_STRONG = \"#2e3236\"; // grey/strong\n\n/**\n * MessageActions\n * Footer row under a message: timestamp · copy (· thumbs up / down for the\n * assistant). Thumbs-up submits immediately; thumbs-down opens a popover that\n * collects an optional reason + labels before submitting.\n *\n * onFeedback({ rating: \"up\" | \"down\", reason?, labels? })\n * initialRating - pre-set rating (e.g. previously-saved feedback)\n */\n/**\n * Convert markdown source into clean, human-readable plain text for copying.\n * Strips the markup characters (**, *, _, `, #, >, list/link/image syntax)\n * while keeping the visible text, so pasting elsewhere shows \"Last 30 days\"\n * instead of \"**Last 30 days**\".\n */\nfunction markdownToPlainText(md) {\n if (!md) return \"\";\n return md\n // Fenced code blocks — keep the inner code, drop the ``` fences\n .replace(/```[a-zA-Z0-9]*\\n?([\\s\\S]*?)```/g, \"$1\")\n // Inline code `code` -> code\n .replace(/`([^`]+)`/g, \"$1\")\n // Images ![alt](url) -> \"alt (url)\" so the source link survives the paste\n .replace(/!\\[([^\\]]*)\\]\\(([^)]*)\\)/g, (_, alt, url) =>\n alt.trim() && alt.trim() !== url.trim() ? `${alt} (${url})` : url\n )\n // Links [text](url) -> \"text (url)\" so the destination survives the paste;\n // if the text already equals the url, keep just the url to avoid \"url (url)\".\n .replace(/\\[([^\\]]+)\\]\\(([^)]*)\\)/g, (_, text, url) =>\n text.trim() && text.trim() !== url.trim() ? `${text} (${url})` : url\n )\n // Bold/italic **text** __text__ *text* _text_ -> text\n .replace(/(\\*\\*|__)(.*?)\\1/g, \"$2\")\n .replace(/(\\*|_)(.*?)\\1/g, \"$2\")\n // Strikethrough ~~text~~ -> text\n .replace(/~~(.*?)~~/g, \"$1\")\n // Headings (# ...) -> text\n .replace(/^\\s{0,3}#{1,6}\\s+/gm, \"\")\n // Blockquotes (> ...) -> text\n .replace(/^\\s{0,3}>\\s?/gm, \"\")\n // Unordered list markers (-, *, +) -> \"• \"\n .replace(/^\\s*[-*+]\\s+/gm, \"• \")\n // Horizontal rules\n .replace(/^\\s*([-*_])\\1{2,}\\s*$/gm, \"\")\n .trim();\n}\n\nfunction MessageActions({ timestamp, content, showFeedback, align = \"start\", onFeedback, initialRating = null }) {\n const [copied, setCopied] = useState(false);\n const [rating, setRating] = useState(initialRating); // \"up\" | \"down\" | null\n const [showReason, setShowReason] = useState(false);\n const [reason, setReason] = useState(\"\");\n const popoverRef = useRef(null);\n\n // Close the reason popover on outside click / Escape.\n useEffect(() => {\n if (!showReason) return;\n const onDocClick = (e) => {\n if (popoverRef.current && !popoverRef.current.contains(e.target)) setShowReason(false);\n };\n const onKey = (e) => {\n if (e.key === \"Escape\") setShowReason(false);\n };\n document.addEventListener(\"mousedown\", onDocClick);\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"mousedown\", onDocClick);\n document.removeEventListener(\"keydown\", onKey);\n };\n }, [showReason]);\n\n const copy = async () => {\n try {\n await navigator.clipboard.writeText(markdownToPlainText(content || \"\"));\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n } catch (err) {\n console.error(\"Failed to copy message:\", err);\n }\n };\n\n const rateUp = () => {\n setShowReason(false);\n setRating(\"up\");\n onFeedback?.({ rating: \"up\" });\n };\n\n const submitDown = () => {\n setRating(\"down\");\n setShowReason(false);\n onFeedback?.({\n rating: \"down\",\n ...(reason.trim() ? { reason: reason.trim() } : {}),\n });\n };\n\n const iconBtn = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 0,\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n color: ACTION_MUTED,\n transition: \"color 0.12s ease\",\n };\n const sep = (\n <span style={{ fontSize: \"13px\", color: ACTION_MUTED, lineHeight: \"normal\" }}>•</span>\n );\n\n return (\n <div\n style={{\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n marginTop: \"8px\",\n justifyContent: align === \"end\" ? \"flex-end\" : \"flex-start\",\n }}\n >\n {timestamp && (\n <span style={{ fontSize: \"13px\", color: ACTION_MUTED, whiteSpace: \"nowrap\" }}>\n {timestamp}\n </span>\n )}\n {timestamp && sep}\n <button\n type=\"button\"\n title={copied ? \"Copied\" : \"Copy\"}\n onClick={copy}\n style={{ ...iconBtn, color: copied ? \"#1f9d57\" : ACTION_MUTED }}\n onMouseEnter={(e) => { if (!copied) e.currentTarget.style.color = ACTION_STRONG; }}\n onMouseLeave={(e) => { if (!copied) e.currentTarget.style.color = ACTION_MUTED; }}\n >\n {copied ? <Check size={16} /> : <Copy size={16} />}\n </button>\n {showFeedback && (\n <>\n {sep}\n <div style={{ display: \"inline-flex\", alignItems: \"center\", gap: \"16px\" }}>\n <button\n type=\"button\"\n title=\"Good response\"\n onClick={rateUp}\n style={{ ...iconBtn, color: rating === \"up\" ? ACTION_STRONG : ACTION_MUTED }}\n onMouseEnter={(e) => (e.currentTarget.style.color = ACTION_STRONG)}\n onMouseLeave={(e) => (e.currentTarget.style.color = rating === \"up\" ? ACTION_STRONG : ACTION_MUTED)}\n >\n <ThumbsUp size={16} fill={rating === \"up\" ? \"currentColor\" : \"none\"} />\n </button>\n <button\n type=\"button\"\n title=\"Bad response\"\n onClick={() => setShowReason((v) => !v)}\n style={{\n ...iconBtn,\n color: rating === \"down\" || showReason ? ACTION_STRONG : ACTION_MUTED,\n }}\n onMouseEnter={(e) => (e.currentTarget.style.color = ACTION_STRONG)}\n onMouseLeave={(e) =>\n (e.currentTarget.style.color = rating === \"down\" || showReason ? ACTION_STRONG : ACTION_MUTED)\n }\n >\n <ThumbsDown size={16} fill={rating === \"down\" ? \"currentColor\" : \"none\"} />\n </button>\n </div>\n </>\n )}\n\n {/* Thumbs-down reason popover */}\n {showReason && (\n <div\n ref={popoverRef}\n style={{\n position: \"absolute\",\n top: \"calc(100% + 6px)\",\n [align === \"end\" ? \"right\" : \"left\"]: 0,\n zIndex: 30,\n width: \"300px\",\n background: \"#FFFFFF\",\n border: \"1px solid #d9d9d9\",\n borderRadius: \"10px\",\n boxShadow: \"0 4px 16px rgba(0,0,0,0.12)\",\n padding: \"12px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"10px\",\n textAlign: \"left\",\n }}\n >\n <div style={{ fontSize: \"13px\", fontWeight: 600, color: ACTION_STRONG }}>\n What was wrong with this response?\n </div>\n <textarea\n value={reason}\n onChange={(e) => setReason(e.target.value)}\n placeholder=\"Add details (optional)\"\n rows={3}\n style={{\n width: \"100%\",\n boxSizing: \"border-box\",\n resize: \"none\",\n border: \"1px solid #d9d9d9\",\n borderRadius: \"8px\",\n padding: \"8px\",\n fontSize: \"13px\",\n color: ACTION_STRONG,\n fontFamily: \"inherit\",\n outline: \"none\",\n }}\n />\n <div style={{ display: \"flex\", justifyContent: \"flex-end\", gap: \"8px\" }}>\n <button\n type=\"button\"\n onClick={() => setShowReason(false)}\n style={{\n padding: \"6px 12px\",\n fontSize: \"12px\",\n fontWeight: 600,\n color: ACTION_STRONG,\n background: \"#FFFFFF\",\n border: \"1px solid #d9d9d9\",\n borderRadius: \"6px\",\n cursor: \"pointer\",\n }}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={submitDown}\n style={{\n padding: \"6px 12px\",\n fontSize: \"12px\",\n fontWeight: 600,\n color: \"#f2f2f0\",\n background: \"#0B0B0B\",\n border: \"1px solid #0B0B0B\",\n borderRadius: \"6px\",\n cursor: \"pointer\",\n }}\n >\n Submit\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}\n\n/**\n * ChatMessage Component\n * Individual message in chat interface with markdown support for assistant messages\n */\nexport default function ChatMessage({\n role,\n content,\n html,\n timestamp,\n toolBadges,\n isStreaming,\n onCodeBlockClick,\n onFilePathClick,\n onFeedback,\n feedbackRating,\n afterContent,\n}) {\n const isUser = role === \"user\";\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: isUser ? \"flex-end\" : \"flex-start\",\n marginBottom: \"16px\",\n width: \"100%\",\n maxWidth: \"100%\",\n }}\n >\n {/* Role label — \"You\" (right) for the user, \"Compass\" (left) for the assistant */}\n <div\n style={{\n fontSize: \"13px\",\n fontWeight: 400,\n color: ACTION_MUTED,\n marginBottom: \"6px\",\n }}\n >\n {isUser ? \"You\" : \"Compass\"}\n </div>\n\n {/* Tool badges */}\n {toolBadges && toolBadges.length > 0 && (\n <div style={{ \n marginBottom: \"8px\", \n display: \"flex\", \n flexWrap: \"wrap\", \n gap: \"4px\",\n maxWidth: \"75%\" \n }}>\n {toolBadges.map((badge, index) => (\n <span \n key={badge.id || index}\n style={{\n display: \"inline-block\",\n fontSize: \"11px\",\n padding: \"2px 8px\",\n borderRadius: \"6px\",\n background: \"var(--paper-elevated, rgba(255,255,255,0.82))\",\n border: `1px solid ${\n badge.pending \n ? \"var(--rail-discovery, #5A8CC0)\" \n : badge.success !== false \n ? \"var(--state-present, #5CB85C)\" \n : \"var(--rail-signal-churn, #C98A5A)\"\n }`,\n color: badge.pending \n ? \"var(--rail-discovery, #5A8CC0)\" \n : badge.success !== false \n ? \"var(--state-present, #5CB85C)\" \n : \"var(--rail-signal-churn, #C98A5A)\",\n }}\n >\n <Wrench size={10} style={{ marginRight: 3, verticalAlign: \"middle\" }} />\n {badge.name}\n {badge.pending ? \"...\" : badge.success !== false ? \" ✓\" : \" ✗\"}\n </span>\n ))}\n </div>\n )}\n\n {/* Message bubble — user: filled pill sized to content; assistant: plain */}\n <div\n style={\n isUser\n ? {\n maxWidth: \"85%\",\n width: \"fit-content\",\n padding: \"12px 16px\",\n borderRadius: \"8px\",\n background: \"#f3f7f7\", // grey/hover\n fontSize: \"14px\",\n lineHeight: 1.6,\n color: \"#2e3236\", // grey/strong\n wordBreak: \"break-word\",\n }\n : {\n width: \"100%\",\n maxWidth: \"100%\",\n padding: \"20px 24px\",\n border: \"1px solid #e6e6e6\",\n borderRadius: \"14px\",\n background: \"#FFFFFF\",\n fontSize: \"14px\",\n lineHeight: 1.6,\n color: \"#2e3236\",\n wordBreak: \"break-word\",\n }\n }\n >\n {html ? (\n <div dangerouslySetInnerHTML={{ __html: html }} />\n ) : isUser ? (\n // User messages stay plain text\n <div style={{ whiteSpace: \"pre-wrap\" }}>{content}</div>\n ) : (\n // Assistant messages get markdown rendering\n <MarkdownRenderer content={content || \"\"} onCodeBlockClick={onCodeBlockClick} onFilePathClick={onFilePathClick} />\n )}\n </div>\n\n {/* Extra content (e.g. charts) — rendered after the message box but\n before the footer, so the footer always sits at the very end. */}\n {afterContent && (\n <div style={{ width: \"100%\", marginTop: \"10px\" }}>{afterContent}</div>\n )}\n\n {/* Actions footer — hide while the assistant is still streaming */}\n {!(isStreaming && !isUser) && (\n <MessageActions\n timestamp={timestamp}\n content={content}\n showFeedback={!isUser}\n align={isUser ? \"end\" : \"start\"}\n onFeedback={onFeedback}\n initialRating={feedbackRating}\n />\n )}\n </div>\n );\n}"],"names":["COLORS","AXIS_TICK","AXIS_LINE","GRID_STROKE","TOOLTIP_STYLE","LEGEND_STYLE","ChartTooltip","active","payload","label","jsxs","jsx","entry","seriesColor","_a","shouldShowAxisLabel","tickValues","lower","v","getChartSvg","containerEl","wrappers","largestWrapper","largest","current","largestRect","currentRect","surface","rect","candidates","largestSvg","escapeXml","value","buildExportSvg","chartSvg","width","height","legendItems","baseSvg","legendLineHeight","legendStartX","maxLegendX","legendRows","currentRow","currentRowWidth","color","itemWidth","exportLegendHeight","exportHeight","legendMarkup","row","rowIndex","cursorX","legendLineY","line","dot","text","downloadPng","title","svg","svgRect","w","xml","blob","url","img","canvas","scale","ctx","link","copyAsCsv","series","allXValues","header","s","rows","x","vals","match","d","csv","ActionBar","onDownloadPng","onCopy","copied","ChartRenderer","chartType","xLabel","yLabel","compact","chartRef","useRef","setCopied","React","chartData","point","seriesNames","isSingleSeries","showXLabel","rotateXTicks","bottomMargin","legendHeight","chartHeight","legendWrapperStyle","containerStyle","titleStyle","xAxisProps","yAxisProps","renderChart","ResponsiveContainer","BarChart","CartesianGrid","XAxis","YAxis","Legend","name","i","Bar","_","idx","Cell","Tooltip","LineChart","Line","AreaChart","Area","pieData","RADIAN","renderLabel","cx","cy","midAngle","innerRadius","outerRadius","percent","radius","y","PieChart","Pie","previous","unit","hasTrend","change","pctChange","isPositive","isNegative","trendColor","trendArrow","fmt","n","exportLegendItems","handleDownloadPng","useCallback","handleCopy","showActions","MarkdownRenderer","content","onCodeBlockClick","onFilePathClick","copiedBlocks","setCopiedBlocks","useState","copyToClipboard","blockId","prev","newSet","err","renderCodeBlock","code","language","isCopied","e","Check","Copy","PanelRightOpen","parseMarkdown","elements","lines","codeLines","level","HeaderTag","listItems","isOrdered","ListTag","item","parseInlineMarkdownWithContext","tableRows","parseCells","c","headerCells","isSeparator","hasSeparator","bodyStart","alignments","cellStyle","cell","ci","ri","paragraph","parseInlineMarkdown","remaining","key","filePathMatch","filePath","inlineCodeMatch","boldMatch","italicMatch","imageMatch","altText","imgHref","linkMatch","linkText","linkHref","isViewButton","viewButtonStyle","defaultLinkStyle","nextSpecialChar","ACTION_MUTED","ACTION_STRONG","markdownToPlainText","md","alt","MessageActions","timestamp","showFeedback","align","onFeedback","initialRating","rating","setRating","showReason","setShowReason","reason","setReason","popoverRef","useEffect","onDocClick","onKey","copy","rateUp","submitDown","iconBtn","sep","Fragment","ThumbsUp","ThumbsDown","ChatMessage","role","html","toolBadges","isStreaming","feedbackRating","afterContent","isUser","badge","index","Wrench"],"mappings":"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"}