chordia-ui 3.9.2 → 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.
Files changed (42) hide show
  1. package/dist/ChatMessage.cjs.js +5 -5
  2. package/dist/ChatMessage.cjs.js.map +1 -1
  3. package/dist/ChatMessage.es.js +583 -353
  4. package/dist/ChatMessage.es.js.map +1 -1
  5. package/dist/MessageThread.cjs.js +15 -0
  6. package/dist/MessageThread.cjs.js.map +1 -0
  7. package/dist/MessageThread.es.js +1868 -0
  8. package/dist/MessageThread.es.js.map +1 -0
  9. package/dist/PerformancePanel.cjs.js +1 -1
  10. package/dist/PerformancePanel.cjs.js.map +1 -1
  11. package/dist/PerformancePanel.es.js +587 -749
  12. package/dist/PerformancePanel.es.js.map +1 -1
  13. package/dist/components/chat.cjs.js +1 -27
  14. package/dist/components/chat.cjs.js.map +1 -1
  15. package/dist/components/chat.es.js +276 -1617
  16. package/dist/components/chat.es.js.map +1 -1
  17. package/dist/components/layout.cjs.js +2 -2
  18. package/dist/components/layout.cjs.js.map +1 -1
  19. package/dist/components/layout.es.js +289 -272
  20. package/dist/components/layout.es.js.map +1 -1
  21. package/dist/components/media.cjs.js +1 -1
  22. package/dist/components/media.cjs.js.map +1 -1
  23. package/dist/components/media.es.js +4 -4
  24. package/dist/components/media.es.js.map +1 -1
  25. package/dist/components/reports.cjs.js +2 -2
  26. package/dist/components/reports.cjs.js.map +1 -1
  27. package/dist/components/reports.es.js +18 -18
  28. package/dist/components/reports.es.js.map +1 -1
  29. package/dist/index.cjs.js +1 -1
  30. package/dist/index.es.js +8 -8
  31. package/package.json +1 -1
  32. package/src/components/chat/ChatHistoryPanel.jsx +740 -388
  33. package/src/components/chat/ChatInterface.jsx +3 -3
  34. package/src/components/chat/ChatMessage.jsx +338 -48
  35. package/src/components/chat/ChatWelcome.jsx +386 -0
  36. package/src/components/chat/ThinkingIndicator.jsx +121 -275
  37. package/src/components/chat/index.js +1 -0
  38. package/src/components/layout/SplitPane.jsx +21 -13
  39. package/src/components/media/InteractionSummaryCard.jsx +1 -1
  40. package/src/components/performance/PerformanceDetailsPage.jsx +51 -52
  41. package/src/components/performance/performanceRangeFormat.js +3 -2
  42. package/src/components/reports/ReportsDetails.jsx +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"ChatMessage.es.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","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","PieChart","Pie","cx","cy","midAngle","innerRadius","outerRadius","percent","radius","y","previous","unit","hasTrend","change","pctChange","isPositive","isNegative","trendColor","trendArrow","fmt","n","exportLegendItems","handleDownloadPng","useCallback","handleCopy","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":"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"}
1
+ {"version":3,"file":"ChatMessage.es.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","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","PieChart","Pie","cx","cy","midAngle","innerRadius","outerRadius","percent","radius","y","previous","unit","hasTrend","change","pctChange","isPositive","isNegative","trendColor","trendArrow","fmt","n","exportLegendItems","handleDownloadPng","useCallback","handleCopy","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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"}
@@ -0,0 +1,15 @@
1
+ "use strict";const e=require("react/jsx-runtime"),s=require("react"),y=require("lucide-react"),ce=require("./ChatMessage.cjs.js"),pe="#2e3236",he="#e3e1d7",ye="#2e3236";function me({size:d=32}){const p=Math.round(d*.75);return e.jsx("div",{style:{width:d,height:d,borderRadius:"9999px",background:pe,display:"flex",alignItems:"center",justifyContent:"center",overflow:"hidden",flexShrink:0},children:e.jsxs("svg",{width:p,height:p,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",style:{display:"block"},"aria-hidden":"true",children:[e.jsx("path",{d:"M12 24C18.6274 24 24 18.6274 24 12C24 5.37258 18.6274 0 12 0C5.37258 0 0 5.37258 0 12C0 18.6274 5.37258 24 12 24Z",fill:pe}),e.jsx("path",{d:"M12.0281 1.54883C15.1413 1.54883 17.9364 2.90958 19.8514 5.06845C21.4881 6.9137 22.4824 9.34236 22.4824 12.0032C22.4824 15.0939 21.1413 17.8711 19.0094 19.7849C17.1586 21.4463 14.7113 22.4575 12.0281 22.4575C9.34478 22.4575 6.74638 21.3828 4.8764 19.6286C2.84343 17.7216 1.57373 15.0107 1.57373 12.0032C1.57373 9.28897 2.60792 6.81646 4.30366 4.95829C6.21523 2.86349 8.9682 1.54883 12.0281 1.54883Z",stroke:"#E8D4A3",strokeWidth:"1.6",strokeMiterlimit:"10"}),e.jsx("path",{d:"M12.0281 4.27832C14.237 4.27832 16.2239 5.21303 17.6307 6.69799C18.9409 8.08066 19.7525 9.94558 19.7525 12.0027C19.7525 14.2369 18.8032 16.2491 17.2862 17.6582C15.9086 18.9419 14.06 19.7271 12.0281 19.7271C9.99626 19.7271 8.46689 18.4265 7.08366 17.1225C5.58971 15.714 4.30371 14.2184 4.30371 12.0027C4.30371 10.0097 5.05856 8.19307 6.2979 6.82333C7.71148 5.26024 9.75514 4.27832 12.0281 4.27832Z",stroke:"#9BDB9C",strokeWidth:"1.2",strokeMiterlimit:"10"}),e.jsx("path",{d:"M12.0282 7.00837C13.3327 7.00837 14.5209 7.50861 15.4101 8.32753C16.4016 9.24032 17.0226 10.5488 17.0226 12.0028C17.0226 13.3805 16.4651 14.6282 15.563 15.5315C14.6592 16.4369 13.4091 16.9973 12.0282 16.9973C10.6472 16.9973 10.1869 15.4702 9.29093 14.6164C8.33599 13.7065 7.03369 13.426 7.03369 12.0023C7.03369 10.7303 7.50919 9.56969 8.29158 8.68781C9.20662 7.65699 10.5415 7.00781 12.0282 7.00781V7.00837Z",stroke:"#4DE294",strokeWidth:"0.8",strokeMiterlimit:"10"})]})})}function ue({phase:d="thinking",label:p,toolSteps:k=[],elapsedMs:j,compact:c=!1}){const C=p||(d==="responding"||d==="generating"?"Compass is generating response...":"Thinking..."),L=c?28:32;return e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"8px",animation:"cuiThinkingPulse 1.6s ease-in-out infinite"},children:[e.jsx("style",{children:`
2
+ @keyframes cuiThinkingPulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.6; } }
3
+ `}),e.jsx(me,{size:L}),e.jsx("div",{style:{display:"inline-flex",alignItems:"center",background:he,padding:c?"8px 12px":"12px 16px",borderRadius:"20px",maxWidth:"100%",minWidth:0},children:e.jsx("p",{style:{margin:0,fontSize:"14px",fontWeight:400,lineHeight:"normal",color:ye,fontFamily:"inherit",overflowWrap:"anywhere",wordBreak:"break-word"},children:C})})]})}const ve={error:(...d)=>console.warn("toast.error:",...d)};function ke({initialMessages:d=[],onSendMessage:p,onStreamMessage:k,onMessagesChange:j,onCodeBlockClick:c,placeholder:C="Ask a question about this interaction...",title:L="Chat with Chordia"}){const[M,P]=s.useState(d||[]),[b,ee]=s.useState(""),[U,z]=s.useState(!1),[m,u]=s.useState(!1),[h,A]=s.useState(null),[F,q]=s.useState("thinking"),[O,n]=s.useState(null),[v,I]=s.useState(0),f=s.useRef(null),R=s.useRef(null),_=s.useRef(null),J=s.useRef(null),H=s.useRef(null),[N,$]=s.useState(!1),[te,K]=s.useState(0);s.useEffect(()=>{var a;(a=f.current)==null||a.scrollIntoView({behavior:"smooth"})},[M,U]),s.useEffect(()=>{R.current&&(R.current.style.height="auto",R.current.style.height=`${Math.min(R.current.scrollHeight,120)}px`)},[b]),s.useEffect(()=>{if(j){const a=[...M];h&&a.push(h),j(a)}},[M,h,j]),s.useEffect(()=>{let a;return U&&O&&(a=setInterval(()=>{if(I(Date.now()-O),H.current){const l=(Date.now()-H.current)/1e3;l>=3?($(!0),K(Math.floor(l))):$(!1)}},500)),()=>a&&clearInterval(a)},[U,O]);const Q=()=>{z(!1),u(!1),A(null),J.current=null,q("thinking"),$(!1),K(0),H.current=null,n(null),I(0),_.current&&(_.current.abort(),_.current=null)},re=a=>{if(a.startsWith("data: ")){const l=a.slice(6);if(l==="[DONE]")return{type:"done"};try{return{type:"data",data:JSON.parse(l)}}catch{return null}}return null},se=a=>{var T,x;if(!((x=(T=a.choices)==null?void 0:T[0])!=null&&x.delta))return;H.current=Date.now(),$(!1);const l=a.choices[0].delta;if(l.tool_calls||l.tool_results){q("tool");return}l.content!==void 0&&(q("responding"),A(S=>{const Y=S||{id:Date.now().toString(),role:"assistant",content:"",timestamp:new Date().toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}),isStreaming:!0},V={...Y,content:(Y.content||"")+(l.content||"")};return J.current=V,V}))},X=async a=>{const l=a.getReader(),T=new TextDecoder;let x="";try{for(;;){const{done:S,value:Y}=await l.read();if(S)break;x+=T.decode(Y,{stream:!0});const V=x.split(`
4
+ `);x=V.pop()||"";for(const ae of V)if(ae.trim()){const ne=re(ae);if(ne){if(ne.type==="done")return;ne.type==="data"&&se(ne.data)}}}}finally{l.releaseLock()}},ie=async()=>{if(!b.trim()||m)return;const a=b.trim(),l={id:Date.now().toString(),role:"user",content:a,timestamp:new Date().toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"})},T=[...M,l];P(T),ee(""),z(!0),u(!0),q("thinking"),n(Date.now()),H.current=Date.now(),_.current=new AbortController;try{let x;if(k)x=await k(a,T);else if(p)x=await p(a,T);else{setTimeout(()=>{const S={id:(Date.now()+1).toString(),role:"assistant",content:"This is a demonstration response. In a real implementation, this would connect to your LLM backend.",timestamp:new Date().toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"})};P(Y=>[...Y,S]),Q()},1e3);return}if(x instanceof ReadableStream)await X(x);else if(x instanceof Response&&x.body)await X(x.body);else if(x&&typeof x.then=="function"){const S=await x;S instanceof ReadableStream?await X(S):S instanceof Response&&S.body&&await X(S.body)}J.current&&P(S=>[...S,{...J.current,isStreaming:!1}])}catch(x){x.name!=="AbortError"&&(ve.error("Failed to send message"),console.error("Stream error:",x))}finally{Q()}},D=a=>{a.key==="Enter"&&!a.shiftKey&&(a.preventDefault(),ie())};return e.jsxs("div",{style:{display:"flex",flexDirection:"column",height:"100%",border:"1px solid var(--border, rgba(52,58,64,0.12))",borderRadius:"var(--radius-lg, 12px)",background:"var(--paper-elevated, rgba(255,255,255,0.82))",overflow:"hidden"},children:[L?e.jsxs("div",{style:{padding:"16px 20px",borderBottom:"1px solid var(--border-subtle, rgba(52,58,64,0.08))",background:"var(--paper-elevated, rgba(255,255,255,0.82))"},children:[e.jsx("div",{style:{fontSize:"var(--text-lg, 16px)",fontWeight:720,letterSpacing:"-0.01em",color:"var(--text-strong, rgba(30,33,37,0.92))"},children:L}),e.jsx("div",{style:{fontSize:"var(--text-sm, 11px)",color:"var(--text-muted, rgba(30,33,37,0.56))",marginTop:"2px"},children:"Ask questions, get insights from analyzed interactions"})]}):null,e.jsx("div",{style:{flex:1,minHeight:0,overflowY:"auto",padding:"20px",display:"flex",flexDirection:"column"},children:M.length===0?e.jsx("div",{style:{flex:1,display:"flex",alignItems:"center",justifyContent:"center",color:"var(--text-faint, rgba(30,33,37,0.36))",fontSize:"var(--text-md, 13px)",textAlign:"center",padding:"40px"},children:"No messages yet. Start a conversation by asking a question below."}):e.jsxs(e.Fragment,{children:[M.map(a=>e.jsx(ce.ChatMessage,{role:a.role,content:a.content,html:a.html,timestamp:a.timestamp,toolBadges:a.toolBadges,isStreaming:a.isStreaming,onCodeBlockClick:c},a.id)),h&&e.jsx(ce.ChatMessage,{role:h.role,content:h.content,timestamp:h.timestamp,isStreaming:!0,onCodeBlockClick:c},h.id),U&&(!h||N)&&e.jsx("div",{style:{marginBottom:"16px"},children:e.jsx(ue,{phase:N?"tool":F,elapsedMs:v,label:N&&te>=30?"Compacting conversation — trimming context to stay sharp...":N&&te>=10?"Running background tasks...":N?"Still working...":void 0})}),e.jsx("div",{ref:f})]})}),e.jsxs("div",{style:{borderTop:"1px solid var(--border-subtle, rgba(52,58,64,0.08))",padding:"16px 20px",background:"var(--paper-elevated, rgba(255,255,255,0.82))"},children:[e.jsxs("div",{style:{display:"flex",gap:"12px",alignItems:"flex-end"},children:[e.jsx("textarea",{ref:R,value:b,onChange:a=>ee(a.target.value),onKeyDown:D,placeholder:C,rows:1,disabled:m,style:{flex:1,padding:"10px 14px",fontSize:"var(--text-base, 14px)",lineHeight:1.5,color:"var(--text-strong, rgba(30,33,37,0.92))",background:"rgba(255, 255, 255, 0.95)",border:"1px solid rgba(52, 58, 64, 0.18)",borderRadius:"var(--radius-md, 8px)",resize:"none",outline:"none",transition:"border-color 0.15s ease",fontFamily:"inherit",minHeight:"42px",maxHeight:"120px",opacity:m?.6:1,cursor:m?"not-allowed":"text"},onFocus:a=>{m||(a.target.style.borderColor="rgba(94, 136, 176, 0.35)")},onBlur:a=>{a.target.style.borderColor="rgba(52, 58, 64, 0.18)"}}),e.jsx("button",{onClick:ie,disabled:!b.trim()||m,style:{padding:"10px 16px",background:b.trim()&&!m?"var(--Base-Strong, #0B0B0B)":"#ECEEF2",color:b.trim()&&!m?"white":"var(--text-base)",border:"none",borderRadius:"var(--radius-md, 8px)",cursor:b.trim()&&!m?"pointer":"not-allowed",display:"flex",alignItems:"center",gap:"6px",fontSize:"var(--text-md, 13px)",fontWeight:650,transition:"all 0.15s ease",height:"42px"},children:m?e.jsxs(e.Fragment,{children:[e.jsx("style",{children:`
5
+ @keyframes buttonSpin {
6
+ from { transform: rotate(0deg); }
7
+ to { transform: rotate(360deg); }
8
+ }
9
+ `}),e.jsx("div",{style:{width:"14px",height:"14px",border:"2px solid rgba(255, 255, 255, 0.3)",borderTopColor:"white",borderRadius:"50%",animation:"buttonSpin 0.6s linear infinite"}}),"Sending..."]}):e.jsxs(e.Fragment,{children:[e.jsx(y.Send,{size:16}),"Send"]})})]}),e.jsx("div",{style:{fontSize:"var(--text-sm, 11px)",color:"var(--text-faint, rgba(30,33,37,0.36))",marginTop:"8px"},children:"Press Enter to send, Shift+Enter for new line"})]})]})}const i={title:"#2e3236",muted:"#808183",faint:"#989898",hoverBg:"#f3f7f7",selectedBg:"#FAF5E9",border:"#d9d9d9",borderSubtle:"#e6e6e6",pillDarkBg:"#272727",pillDarkText:"#f2f2f0",searchTrack:"#d8d8d8"};function je(d){const p=d?new Date(d):null;if(!p||Number.isNaN(p.getTime()))return"Older";const k=new Date,j=new Date(k.getFullYear(),k.getMonth(),k.getDate()),c=new Date(j);return c.setDate(j.getDate()-1),p>=j?"Today":p>=c?"Yesterday":"Older"}const Se=["Today","Yesterday","Older"];function we(d){const p=d?new Date(d):null;if(!p||Number.isNaN(p.getTime()))return"";const k=Date.now()-p.getTime(),j=Math.floor(k/6e4);if(j<1)return"just now";if(j<60)return`${j}m ago`;const c=Math.floor(j/60);if(c<24)return`${c}h ago`;const C=Math.floor(c/24);return C<7?`${C}d ago`:p.toLocaleDateString(void 0,{month:"short",day:"numeric"})}function Ce({threads:d=[],activeThreadId:p,onSelectThread:k,onNewChat:j,onCollapse:c,onRenameThread:C,onDeleteThread:L,onPinThread:M,loading:P=!1,pageSize:b=10,page:ee,pageCount:U,onPageChange:z,onFilterChange:m}){const u=typeof z=="function",[h,A]=s.useState(""),[F,q]=s.useState("all"),O=o=>{q(o),m==null||m(o)},[n,v]=s.useState(1),[I,f]=s.useState(null),[R,_]=s.useState(null),[J,H]=s.useState(""),[N,$]=s.useState(null),[te,K]=s.useState(null),Q=s.useRef(null);s.useEffect(()=>{R&&Q.current&&(Q.current.focus(),Q.current.select())},[R]),s.useEffect(()=>{if(!te)return;const o=()=>K(null),r=B=>{B.key==="Escape"&&K(null)};return document.addEventListener("click",o),document.addEventListener("keydown",r),()=>{document.removeEventListener("click",o),document.removeEventListener("keydown",r)}},[te]);const re=typeof C=="function",se=typeof L=="function",X=typeof M=="function",{groups:ie,totalPages:D}=s.useMemo(()=>{const o=h.trim().toLowerCase(),B=[...d.filter(g=>F==="pinned"&&!g.pinned?!1:o?(g.title||"").toLowerCase().includes(o)||(g.last_message_preview||"").toLowerCase().includes(o):!0)].sort((g,E)=>{if(g.pinned&&!E.pinned)return-1;if(!g.pinned&&E.pinned)return 1;const le=new Date(g.updated_at||g.created_at||0).getTime();return new Date(E.updated_at||E.created_at||0).getTime()-le}),Z=u?Math.max(1,U||1):Math.max(1,Math.ceil(B.length/b));let w;if(u)w=B;else{const E=(Math.min(n,Z)-1)*b;w=B.slice(E,E+b)}const W={};for(const g of w){const E=je(g.updated_at||g.created_at);(W[E]||(W[E]=[])).push(g)}return{groups:Se.map(g=>({label:g,items:W[g]||[]})).filter(g=>g.items.length>0),totalPages:Z}},[d,h,F,n,b,u,U]),a=ie.reduce((o,r)=>o+r.items.length,0),l=u?Math.max(1,ee||1):n,T=u?z:v;s.useEffect(()=>{u||v(1)},[h,F,u]),s.useEffect(()=>{u||v(o=>Math.min(o,D))},[D,u]);const x=s.useMemo(()=>{if(D<=5)return Array.from({length:D},(Z,w)=>w+1);let r=Math.max(1,l-2);const B=Math.min(D,r+5-1);return r=Math.max(1,B-5+1),Array.from({length:B-r+1},(Z,w)=>r+w)},[D,l]),S=(o,r)=>{o.stopPropagation(),K(null),$(null),_(r.id),H(r.title||r.name||"")},Y=o=>{o&&o.stopPropagation();const r=(J||"").trim();R&&r&&(C==null||C(R,r)),_(null),H("")},V=o=>{o&&o.stopPropagation(),_(null),H("")},ae=(o,r)=>{o.stopPropagation(),K(null),_(null),$(r.id)},ne=o=>{o&&o.stopPropagation(),N&&(L==null||L(N)),$(null)},xe=o=>{o&&o.stopPropagation(),$(null)},ge=(o,r)=>{o.stopPropagation(),M==null||M(r.id,!r.pinned)},oe={display:"inline-flex",alignItems:"center",justifyContent:"center",width:"24px",height:"24px",padding:0,background:"transparent",border:"none",borderRadius:"6px",cursor:"pointer",color:i.muted,transition:"all 0.12s ease",flexShrink:0};return e.jsxs("div",{style:{display:"flex",flexDirection:"column",height:"100%",background:"#FFFFFF",overflow:"hidden"},children:[e.jsxs("div",{style:{padding:"16px 16px 0 16px",flexShrink:0},children:[e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",height:"32px"},children:[e.jsx("div",{style:{fontSize:"14px",fontWeight:400,color:i.title},children:"Threads"}),c&&e.jsx("button",{type:"button",title:"Collapse",onClick:c,style:{...oe,width:"20px",height:"20px",color:i.muted},onMouseEnter:o=>o.currentTarget.style.background=i.hoverBg,onMouseLeave:o=>o.currentTarget.style.background="transparent",children:e.jsx(y.PanelLeftClose,{size:20,strokeWidth:1.5})})]}),e.jsx("div",{style:{display:"flex",alignItems:"center",height:"32px",background:i.searchTrack,borderRadius:"11px",padding:"1px",marginTop:"12px"},children:e.jsxs("div",{style:{display:"flex",flex:1,alignItems:"center",gap:"8px",height:"30px",background:"#FFFFFF",borderRadius:"10px",padding:"4px 8px"},children:[e.jsx(y.Search,{size:18,style:{color:i.faint,flexShrink:0}}),e.jsx("input",{type:"text",value:h,onChange:o=>A(o.target.value),placeholder:"Search",style:{flex:1,minWidth:0,border:"none",outline:"none",background:"transparent",fontSize:"14px",fontWeight:500,color:i.title}})]})}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"16px",marginTop:"12px"},children:[e.jsx("button",{type:"button",onClick:()=>O("all"),style:{display:"inline-flex",alignItems:"center",justifyContent:"center",height:"28px",padding:"0 12px",borderRadius:"8px",border:"none",cursor:"pointer",fontSize:"14px",fontWeight:400,lineHeight:"24px",transition:"all 0.12s ease",background:F==="all"?i.pillDarkBg:i.hoverBg,color:F==="all"?i.pillDarkText:i.title},children:"All"}),e.jsxs("button",{type:"button",onClick:()=>O("pinned"),style:{display:"inline-flex",alignItems:"center",justifyContent:"center",gap:"8px",height:"28px",padding:"0 16px",borderRadius:"10px",border:"none",cursor:"pointer",fontSize:"14px",fontWeight:400,lineHeight:"24px",transition:"all 0.12s ease",background:F==="pinned"?i.pillDarkBg:i.hoverBg,color:F==="pinned"?i.pillDarkText:i.title},children:[e.jsx(y.Pin,{size:16,style:{flexShrink:0}}),"Pinned"]})]})]}),e.jsx("div",{style:{flex:1,overflowY:"auto",padding:"16px 16px 8px 16px"},children:P?e.jsx("div",{style:{padding:"30px 16px",textAlign:"center",color:i.faint,fontSize:"13px"},children:"Loading threads..."}):a===0?e.jsx("div",{style:{padding:"30px 16px",textAlign:"center",color:i.faint,fontSize:"13px"},children:h?"No threads found":F==="pinned"?"No pinned threads":"No threads yet"}):ie.map(o=>e.jsxs("div",{style:{marginBottom:"8px"},children:[e.jsx("div",{style:{fontSize:"13px",fontWeight:500,color:i.title,padding:"8px 0 4px 0"},children:o.label}),o.items.map(r=>{const B=r.id===p,Z=I===r.id,w=R===r.id,W=N===r.id,G=te===r.id,g=re||se,E=(X||g)&&(Z||B||G)&&!w&&!W,le=G||W||w,de=B?i.selectedBg:Z||le?i.hoverBg:"transparent",fe=B||Z||le?`1px solid ${i.border}`:"1px solid transparent";return e.jsxs("div",{onClick:()=>{w||W||k==null||k(r.id)},onMouseEnter:()=>f(r.id),onMouseLeave:()=>f(t=>t===r.id?null:t),style:{display:"flex",alignItems:"center",gap:"4px",padding:"8px 4px",marginBottom:"2px",borderRadius:"8px",background:de,border:fe,cursor:w||W?"default":"pointer",transition:"background 0.12s ease, border-color 0.12s ease",boxSizing:"border-box",position:"relative"},children:[e.jsx("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",width:"40px",height:"40px",flexShrink:0,color:i.muted},children:e.jsx(y.MessageSquare,{size:20})}),w?e.jsx("input",{ref:Q,type:"text",value:J,onChange:t=>H(t.target.value),onClick:t=>t.stopPropagation(),onKeyDown:t=>{t.stopPropagation(),t.key==="Enter"?Y(t):t.key==="Escape"&&V(t)},style:{flex:1,minWidth:0,fontSize:"14px",fontWeight:600,color:i.title,background:"#fff",border:`1px solid ${i.border}`,borderRadius:"6px",padding:"4px 8px",outline:"none",boxSizing:"border-box"}}):e.jsxs("div",{style:{flex:1,minWidth:0,display:"flex",flexDirection:"column",gap:"4px",textAlign:"left"},children:[e.jsx("div",{title:r.title||r.name||"Untitled thread",style:{display:"block",minWidth:0,maxWidth:"100%",fontSize:"14px",fontWeight:B?550:500,color:i.title,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",lineHeight:1.2},children:r.title||r.name||"Untitled thread"}),W?e.jsxs("div",{style:{display:"flex",alignItems:"center",flexWrap:"wrap",gap:"8px"},children:[e.jsx("span",{style:{fontSize:"12px",fontWeight:500,color:i.title},children:"Confirm: delete this thread?"}),e.jsx("button",{type:"button",onClick:ne,style:{padding:"3px 12px",fontSize:"12px",fontWeight:600,color:i.title,background:"#ECEEF2",border:`1px solid ${i.borderSubtle}`,borderRadius:"6px",cursor:"pointer"},onMouseEnter:t=>t.currentTarget.style.background="#E2E5EA",onMouseLeave:t=>t.currentTarget.style.background="#ECEEF2",children:"Yes"}),e.jsx("button",{type:"button",onClick:xe,style:{padding:"3px 6px",fontSize:"12px",fontWeight:500,color:i.muted,background:"transparent",border:"none",cursor:"pointer"},onMouseEnter:t=>t.currentTarget.style.color=i.title,onMouseLeave:t=>t.currentTarget.style.color=i.muted,children:"No"})]}):e.jsxs("div",{style:{fontSize:"12px",color:i.muted,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",lineHeight:1.5},children:[r.message_count!=null&&e.jsxs(e.Fragment,{children:[r.message_count," msg",r.message_count!==1?"s":""," · "]}),we(r.updated_at||r.created_at)]})]}),w&&e.jsxs("div",{style:{display:"inline-flex",alignItems:"center",gap:"2px",flexShrink:0},children:[e.jsx("button",{type:"button",title:"Save",onClick:Y,style:{...oe,color:"#1f9d57"},onMouseEnter:t=>t.currentTarget.style.background="rgba(31,157,87,0.12)",onMouseLeave:t=>t.currentTarget.style.background="transparent",children:e.jsx(y.Check,{size:15})}),e.jsx("button",{type:"button",title:"Cancel",onClick:V,style:oe,onMouseEnter:t=>t.currentTarget.style.background="rgba(0,0,0,0.06)",onMouseLeave:t=>t.currentTarget.style.background="transparent",children:e.jsx(y.X,{size:15})})]}),!w&&!W&&!E&&r.pinned&&e.jsx(y.Pin,{size:14,style:{color:i.title,flexShrink:0},fill:"currentColor"}),E&&e.jsxs("div",{style:{display:"inline-flex",alignItems:"center",gap:"2px",flexShrink:0},children:[X&&e.jsx("button",{type:"button",title:r.pinned?"Unpin":"Pin",onClick:t=>ge(t,r),style:{...oe,color:r.pinned?i.title:i.muted},onMouseEnter:t=>{t.currentTarget.style.background="rgba(0,0,0,0.06)",t.currentTarget.style.color=i.title},onMouseLeave:t=>{t.currentTarget.style.background="transparent",t.currentTarget.style.color=r.pinned?i.title:i.muted},children:e.jsx(y.Pin,{size:14,fill:r.pinned?"currentColor":"none"})}),g&&e.jsx("button",{type:"button",title:"More",onClick:t=>{t.stopPropagation(),K(be=>be===r.id?null:r.id)},style:{...oe,color:G?i.title:i.muted,background:G?"rgba(0,0,0,0.06)":"transparent"},onMouseEnter:t=>{t.currentTarget.style.background="rgba(0,0,0,0.06)",t.currentTarget.style.color=i.title},onMouseLeave:t=>{t.currentTarget.style.background=G?"rgba(0,0,0,0.06)":"transparent",t.currentTarget.style.color=G?i.title:i.muted},children:e.jsx(y.MoreVertical,{size:14})})]}),G&&g&&e.jsxs("div",{onClick:t=>t.stopPropagation(),style:{position:"absolute",top:"calc(100% - 2px)",right:"8px",zIndex:20,width:"144px",background:"#FFFFFF",border:`1px solid ${i.border}`,borderRadius:"4px",boxShadow:"-2px 2px 4px rgba(0,0,0,0.1)",overflow:"hidden"},children:[re&&e.jsx("button",{type:"button",onClick:t=>S(t,r),style:{display:"block",width:"100%",textAlign:"left",padding:"12px",fontSize:"13px",color:i.title,background:"transparent",border:"none",cursor:"pointer"},onMouseEnter:t=>t.currentTarget.style.background=i.hoverBg,onMouseLeave:t=>t.currentTarget.style.background="transparent",children:"Rename"}),se&&e.jsx("button",{type:"button",onClick:t=>ae(t,r),style:{display:"block",width:"100%",textAlign:"left",padding:"12px",fontSize:"13px",color:i.title,background:"transparent",border:"none",borderTop:re?`1px solid ${i.border}`:"none",cursor:"pointer"},onMouseEnter:t=>t.currentTarget.style.background=i.hoverBg,onMouseLeave:t=>t.currentTarget.style.background="transparent",children:"Delete"})]})]},r.id)})]},o.label))}),!P&&D>1&&e.jsxs("div",{style:{flexShrink:0,display:"flex",alignItems:"center",justifyContent:"center",gap:"6px",height:"64px",padding:"0 16px",boxSizing:"border-box",borderTop:`1px solid ${i.border}`},children:[e.jsxs("button",{type:"button",disabled:l<=1,onClick:()=>T(Math.max(1,l-1)),style:{display:"inline-flex",alignItems:"center",justifyContent:"center",gap:"4px",height:"24px",padding:"4px 8px",borderRadius:"10px",background:"#FFFFFF",border:`1px solid ${i.borderSubtle}`,fontSize:"12px",lineHeight:"16px",color:"#0b0b0b",cursor:l<=1?"default":"pointer",opacity:l<=1?.5:1},children:[e.jsx(y.ChevronLeft,{size:12}),"Back"]}),x.map(o=>{const r=o===l;return e.jsx("button",{type:"button",onClick:()=>T(o),style:{display:"inline-flex",alignItems:"center",justifyContent:"center",height:"24px",minWidth:"22px",padding:"4px 8px",borderRadius:"10px",fontSize:"12px",lineHeight:"16px",cursor:"pointer",background:r?"#0b0b0b":"#FFFFFF",color:r?"#FFFFFF":"#0b0b0b",border:r?"1px solid #0b0b0b":`1px solid ${i.borderSubtle}`,fontWeight:r?600:400},children:o},o)}),e.jsxs("button",{type:"button",disabled:l>=D,onClick:()=>T(Math.min(D,l+1)),style:{display:"inline-flex",alignItems:"center",justifyContent:"center",gap:"4px",height:"24px",padding:"4px 8px",borderRadius:"10px",background:"#FFFFFF",border:`1px solid ${i.borderSubtle}`,fontSize:"12px",lineHeight:"16px",color:"#0b0b0b",cursor:l>=D?"default":"pointer",opacity:l>=D?.5:1},children:["Next",e.jsx(y.ChevronRight,{size:12})]})]})]})}const Me={error:(...d)=>console.warn("toast.error:",...d)},Te=()=>({userData:{name:"User",email:""}});function Ee({sessionTitle:d,messages:p,onSendMessage:k,currentUser:j}){var O;const[c,C]=s.useState(""),[L,M]=s.useState(!1),[P,b]=s.useState(p||[]),[ee,U]=s.useState(!1),[z,m]=s.useState(!1),{userData:u}=Te(),h=s.useRef(null),A=j||{name:(u==null?void 0:u.name)||"You",initials:((O=u==null?void 0:u.name)==null?void 0:O.split(" ").map(n=>n[0]).join("").toUpperCase())||"YO",color:"#6B7C93"};s.useEffect(()=>{b(p||[])},[p]),s.useEffect(()=>{h.current&&h.current.scrollIntoView({behavior:"smooth"})},[P]);const F=async()=>{if(!c.trim())return;const n=c.trim();C(""),m(!0);const v={id:`temp-${Date.now()}`,author:{name:A.name,role:(u==null?void 0:u.role)||"",initials:A.initials,color:A.color},content:n,timestamp:"Just now",type:"comment",isOptimistic:!0};if(b(I=>[...I,v]),k){try{await k(n),b(I=>I.map(f=>f.id===v.id?{...f,isOptimistic:!1}:f))}catch{b(f=>f.filter(R=>R.id!==v.id)),Me.error("Failed to send message")}finally{m(!1)}return}setTimeout(()=>{b(I=>I.map(f=>f.id===v.id?{...f,isOptimistic:!1}:f)),m(!1)},500)},q=n=>{n.key==="Enter"&&!n.shiftKey&&(n.preventDefault(),F())};return e.jsxs("div",{style:{display:"flex",flexDirection:"column",height:"100%",background:"var(--paper-elevated, rgba(255,255,255,0.82))",border:"1px solid var(--border, rgba(52,58,64,0.12))",borderRadius:"var(--radius-lg, 12px)",overflow:"hidden"},children:[d&&e.jsxs("div",{style:{padding:"14px 16px",borderBottom:"1px solid var(--border, rgba(52,58,64,0.12))",background:"var(--paper-elevated, rgba(255,255,255,0.82))"},children:[e.jsx("div",{style:{fontSize:"var(--text-md, 13px)",fontWeight:680,color:"var(--text-strong, rgba(30,33,37,0.92))",marginBottom:"3px"},children:"Session Discussion"}),d&&e.jsx("div",{style:{fontSize:"var(--text-sm, 11px)",color:"var(--text-muted, rgba(30,33,37,0.56))",display:"flex",alignItems:"center",gap:"8px"},children:e.jsx("span",{children:d})})]}),e.jsxs("div",{style:{flex:1,overflowY:"auto",padding:"16px",display:"flex",flexDirection:"column",gap:"16px"},children:[ee?e.jsx("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",padding:"40px",color:"var(--text-faint, rgba(30,33,37,0.36))"},children:"Loading messages..."}):P.length===0?e.jsx("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",padding:"40px",color:"var(--text-faint, rgba(30,33,37,0.36))"},children:"No messages yet. Start the conversation!"}):P.map(n=>e.jsxs("div",{style:{display:"flex",gap:"12px",opacity:n.type==="system"?.75:1},children:[n.type!=="system"&&e.jsx("div",{style:{width:"32px",height:"32px",borderRadius:"8px",background:n.author.color,color:"white",display:"flex",alignItems:"center",justifyContent:"center",fontSize:"11px",fontWeight:650,flexShrink:0,opacity:.9},children:n.author.initials}),n.type==="system"&&e.jsx("div",{style:{width:"32px",height:"32px",borderRadius:"8px",background:"rgba(30, 33, 37, 0.08)",color:"rgba(30, 33, 37, 0.52)",display:"flex",alignItems:"center",justifyContent:"center",fontSize:"11px",fontWeight:650,flexShrink:0},children:e.jsx(y.Clock,{size:14})}),e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsxs("div",{style:{display:"flex",alignItems:"baseline",gap:"8px",marginBottom:"4px"},children:[e.jsx("span",{style:{fontSize:"var(--text-sm, 11px)",fontWeight:650,color:"var(--text-base, rgba(30,33,37,0.78))"},children:n.author.name}),e.jsx("span",{style:{fontSize:"var(--text-sm, 11px)",color:"var(--text-faint, rgba(30,33,37,0.36))",fontFamily:"var(--font-mono, monospace)"},children:n.timestamp}),n.author.role&&e.jsx("span",{style:{fontSize:"var(--text-xs, 10px)",color:"var(--text-muted, rgba(30,33,37,0.56))",background:"rgba(30, 33, 37, 0.06)",padding:"2px 6px",borderRadius:"4px",textTransform:"uppercase",letterSpacing:"0.04em",fontWeight:600},children:n.author.role}),n.isEdited&&e.jsx("span",{style:{fontSize:"var(--text-xs, 10px)",color:"var(--text-faint, rgba(30,33,37,0.36))",fontStyle:"italic"},children:"(edited)"})]}),e.jsx("div",{style:{fontSize:"var(--text-md, 13px)",color:"var(--text-base, rgba(30,33,37,0.78))",lineHeight:1.5,marginBottom:n.references?"8px":0},children:n.content}),n.references&&n.references.length>0&&e.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:"6px",marginTop:"8px"},children:n.references.map((v,I)=>e.jsxs("button",{type:"button",style:{fontSize:"11px",padding:"4px 8px",borderRadius:"6px",border:"1px solid rgba(52, 58, 64, 0.16)",background:"rgba(255, 255, 255, 0.7)",color:v.type==="condition"?"rgba(94, 136, 176, 0.85)":v.type==="observation"?"rgba(107, 123, 147, 0.85)":v.type==="timestamp"?"rgba(184, 156, 106, 0.85)":"rgba(30, 33, 37, 0.65)",cursor:"pointer",display:"inline-flex",alignItems:"center",gap:"4px",transition:"all 0.15s ease",fontWeight:550},onMouseEnter:f=>{f.currentTarget.style.background="rgba(255, 255, 255, 0.95)",f.currentTarget.style.borderColor="rgba(52, 58, 64, 0.24)"},onMouseLeave:f=>{f.currentTarget.style.background="rgba(255, 255, 255, 0.7)",f.currentTarget.style.borderColor="rgba(52, 58, 64, 0.16)"},children:[v.type==="timestamp"&&e.jsx(y.Clock,{size:12}),(v.type==="condition"||v.type==="observation")&&e.jsx(y.Hash,{size:12}),v.label]},I))})]})]},n.id)),e.jsx("div",{ref:h})]}),e.jsxs("div",{style:{padding:"12px",borderTop:"1px solid var(--border, rgba(52,58,64,0.12))",background:"var(--paper-elevated, rgba(255,255,255,0.82))"},children:[e.jsxs("div",{style:{display:"flex",gap:"8px",alignItems:"flex-end"},children:[e.jsx("div",{style:{width:"32px",height:"32px",borderRadius:"var(--radius-md, 8px)",background:A.color,color:"white",display:"flex",alignItems:"center",justifyContent:"center",fontSize:"var(--text-sm, 11px)",fontWeight:650,flexShrink:0,opacity:.9},children:A.initials}),e.jsxs("div",{style:{flex:1,display:"flex",flexDirection:"column",gap:"8px"},children:[e.jsx("textarea",{value:c,onChange:n=>C(n.target.value),onKeyDown:q,onFocus:()=>M(!0),onBlur:()=>M(!1),placeholder:"Add a comment...",style:{width:"100%",minHeight:"38px",maxHeight:"120px",padding:"8px 12px",fontSize:"var(--text-md, 13px)",color:"var(--text-base, rgba(30,33,37,0.78))",background:"white",border:`1px solid ${L?"rgba(94, 136, 176, 0.35)":"rgba(52, 58, 64, 0.16)"}`,borderRadius:"var(--radius-md, 8px)",resize:"vertical",outline:"none",transition:"border-color 0.15s ease",fontFamily:"inherit",lineHeight:1.5}}),e.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between"},children:[e.jsxs("div",{style:{display:"flex",gap:"4px"},children:[e.jsx("button",{type:"button",style:{padding:"6px",background:"transparent",border:"none",borderRadius:"6px",color:"rgba(30, 33, 37, 0.52)",cursor:"pointer",display:"flex",alignItems:"center",transition:"all 0.15s ease"},onMouseEnter:n=>{n.currentTarget.style.background="rgba(30, 33, 37, 0.06)",n.currentTarget.style.color="rgba(30, 33, 37, 0.75)"},onMouseLeave:n=>{n.currentTarget.style.background="transparent",n.currentTarget.style.color="rgba(30, 33, 37, 0.52)"},title:"Mention user",children:e.jsx(y.AtSign,{size:16})}),e.jsx("button",{type:"button",style:{padding:"6px",background:"transparent",border:"none",borderRadius:"6px",color:"rgba(30, 33, 37, 0.52)",cursor:"pointer",display:"flex",alignItems:"center",transition:"all 0.15s ease"},onMouseEnter:n=>{n.currentTarget.style.background="rgba(30, 33, 37, 0.06)",n.currentTarget.style.color="rgba(30, 33, 37, 0.75)"},onMouseLeave:n=>{n.currentTarget.style.background="transparent",n.currentTarget.style.color="rgba(30, 33, 37, 0.52)"},title:"Reference condition",children:e.jsx(y.Hash,{size:16})}),e.jsx("button",{type:"button",style:{padding:"6px",background:"transparent",border:"none",borderRadius:"6px",color:"rgba(30, 33, 37, 0.52)",cursor:"pointer",display:"flex",alignItems:"center",transition:"all 0.15s ease"},onMouseEnter:n=>{n.currentTarget.style.background="rgba(30, 33, 37, 0.06)",n.currentTarget.style.color="rgba(30, 33, 37, 0.75)"},onMouseLeave:n=>{n.currentTarget.style.background="transparent",n.currentTarget.style.color="rgba(30, 33, 37, 0.52)"},title:"Attach file",children:e.jsx(y.Paperclip,{size:16})})]}),e.jsx("button",{type:"button",onClick:F,disabled:!c.trim()||z,style:{padding:"6px 12px",background:c.trim()&&!z?"rgba(94, 136, 176, 0.85)":"var(--border-subtle, rgba(52,58,64,0.08))",border:"none",borderRadius:"6px",color:c.trim()&&!z?"white":"var(--text-faint, rgba(30,33,37,0.36))",fontSize:"var(--text-sm, 11px)",fontWeight:600,cursor:c.trim()&&!z?"pointer":"not-allowed",display:"flex",alignItems:"center",gap:"6px",transition:"all 0.15s ease"},onMouseEnter:n=>{c.trim()&&!z&&(n.currentTarget.style.background="rgba(94, 136, 176, 1)")},onMouseLeave:n=>{c.trim()&&!z&&(n.currentTarget.style.background="rgba(94, 136, 176, 0.85)")},children:z?e.jsxs(e.Fragment,{children:[e.jsx("style",{children:`
10
+ @keyframes messageSpin {
11
+ from { transform: rotate(0deg); }
12
+ to { transform: rotate(360deg); }
13
+ }
14
+ `}),e.jsx("div",{style:{width:"14px",height:"14px",border:"2px solid rgba(255, 255, 255, 0.3)",borderTopColor:"white",borderRadius:"50%",animation:"messageSpin 0.6s linear infinite"}}),"Sending..."]}):e.jsxs(e.Fragment,{children:[e.jsx(y.Send,{size:14}),"Send"]})})]})]})]}),e.jsxs("div",{style:{marginTop:"8px",fontSize:"var(--text-sm, 11px)",color:"var(--text-faint, rgba(30,33,37,0.36))",lineHeight:1.4},children:[e.jsx("strong",{children:"Tip:"})," Use"," ",e.jsx("code",{style:{background:"rgba(30, 33, 37, 0.06)",padding:"2px 4px",borderRadius:"3px",fontFamily:"var(--font-mono, monospace)",fontSize:"var(--text-xs, 10px)"},children:"@"})," ","to mention teammates,"," ",e.jsx("code",{style:{background:"rgba(30, 33, 37, 0.06)",padding:"2px 4px",borderRadius:"3px",fontFamily:"var(--font-mono, monospace)",fontSize:"var(--text-xs, 10px)"},children:"#"})," ","to reference conditions"]})]})]})}exports.ChatHistoryPanel=Ce;exports.ChatInterface=ke;exports.MessageThread=Ee;exports.ThinkingIndicator=ue;
15
+ //# sourceMappingURL=MessageThread.cjs.js.map