chordia-ui 3.7.0 → 3.7.2
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.
- package/dist/ChatMessage.cjs.js +15 -0
- package/dist/ChatMessage.cjs.js.map +1 -0
- package/dist/ChatMessage.es.js +915 -0
- package/dist/ChatMessage.es.js.map +1 -0
- package/dist/SideDrawer.cjs.js +2 -0
- package/dist/SideDrawer.cjs.js.map +1 -0
- package/dist/SideDrawer.es.js +358 -0
- package/dist/SideDrawer.es.js.map +1 -0
- package/dist/Toast.cjs.js +2 -2
- package/dist/Toast.cjs.js.map +1 -1
- package/dist/Toast.es.js +301 -671
- package/dist/Toast.es.js.map +1 -1
- package/dist/components/UpdatedInteractionDetails.cjs.js +4 -4
- package/dist/components/UpdatedInteractionDetails.cjs.js.map +1 -1
- package/dist/components/UpdatedInteractionDetails.es.js +652 -603
- package/dist/components/UpdatedInteractionDetails.es.js.map +1 -1
- package/dist/components/chat.cjs.js +5 -7
- package/dist/components/chat.cjs.js.map +1 -1
- package/dist/components/chat.es.js +393 -849
- package/dist/components/chat.es.js.map +1 -1
- package/dist/components/common.cjs.js +1 -1
- package/dist/components/common.es.js +28 -27
- package/dist/components/common.es.js.map +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.es.js +73 -72
- package/dist/index.es.js.map +1 -1
- package/package.json +1 -1
- package/src/components/UpdatedInteractionDetails/UpdatedInteractionContext.jsx +6 -2
- package/src/components/UpdatedInteractionDetails/UpdatedInteractionDetails.jsx +190 -139
- package/src/components/chat/ChartRenderer.jsx +300 -49
- package/src/components/common/AskCompass.jsx +91 -87
- package/src/components/common/SideDrawer.jsx +7 -3
- package/dist/ChartRenderer.cjs.js +0 -3
- package/dist/ChartRenderer.cjs.js.map +0 -1
- package/dist/ChartRenderer.es.js +0 -304
- package/dist/ChartRenderer.es.js.map +0 -1
|
@@ -0,0 +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, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\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 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\" : \"Chordia\"}\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 maxWidth: \"75%\",\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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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const e=require("react/jsx-runtime"),f=require("react"),m=require("lucide-react");function v({open:t,onClose:n,title:r,subtitle:i,children:a,footer:o,width:g=515,height:p=762,toggleLabel:d,toggleChecked:x,onToggle:c,topOffset:l}){const y=f.useRef(null),u=l!=null,h=typeof l=="number"?`${l}px`:l;return f.useEffect(()=>{if(!t)return;const s=b=>{b.key==="Escape"&&(n==null||n())};return document.addEventListener("keydown",s),()=>document.removeEventListener("keydown",s)},[t,n]),t?e.jsxs(e.Fragment,{children:[e.jsx("div",{onClick:n,style:{position:"fixed",inset:0,zIndex:1200,background:"rgba(0, 0, 0, 0.20)"}}),e.jsxs("div",{ref:y,style:{position:"fixed",top:u?h:"50%",right:0,transform:u?"none":"translateY(-50%)",zIndex:1201,display:"flex",width:g,height:p,maxHeight:u?`calc(100vh - ${h})`:"100vh",padding:"20px",flexDirection:"column",alignItems:"flex-start",gap:"20px",borderRadius:"12px 0 0 12px",background:"#FFF",boxShadow:"648px 0 100px 0 rgba(0, 0, 0, 0.20)"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",width:"100%",flexShrink:0},children:[e.jsx("h2",{style:{fontSize:"24px",fontWeight:600,fontStyle:"normal",color:"var(--Grey-3, #252525)",margin:0,lineHeight:"normal"},children:r}),e.jsx("button",{onClick:n,style:{display:"flex",alignItems:"center",justifyContent:"center",width:"28px",height:"28px",border:"none",background:"transparent",color:"var(--Grey-Strong, #808183)",cursor:"pointer",borderRadius:"4px",transition:"background 0.15s ease"},onMouseEnter:s=>{s.currentTarget.style.background="#ECEEF2"},onMouseLeave:s=>{s.currentTarget.style.background="transparent"},children:e.jsx(m.X,{size:20,strokeWidth:2})})]}),e.jsx("div",{style:{width:"100%",height:"1px",background:"#ECEEF2",flexShrink:0}}),(i||d)&&e.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",width:"100%",gap:"12px",flexShrink:0},children:[i&&e.jsx("p",{style:{fontSize:"13px",fontStyle:"normal",fontWeight:400,lineHeight:"140%",color:"#0B0B0B",margin:0,flex:1},children:i}),d&&e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"8px",flexShrink:0},children:[e.jsx("button",{onClick:()=>c==null?void 0:c(!x),style:{position:"relative",width:"40px",height:"22px",borderRadius:"11px",border:"none",background:x?"var(--Base-Strong, #0B0B0B)":"var(--Base-Faint, #D9D9D9)",cursor:"pointer",transition:"background 0.2s ease",padding:0,flexShrink:0},children:e.jsx("div",{style:{position:"absolute",top:"2px",left:x?"20px":"2px",width:"18px",height:"18px",borderRadius:"50%",background:"#FFF",transition:"left 0.2s ease",boxShadow:"0 1px 3px rgba(0,0,0,0.15)"}})}),e.jsx("span",{style:{fontSize:"13px",fontWeight:500,color:"var(--Base-Strong, #1E1E1E)",lineHeight:1.4},children:d})]})]}),e.jsx("div",{style:{flex:1,width:"100%",overflowY:"auto",display:"flex",flexDirection:"column",gap:"16px",minHeight:0},children:a}),o&&e.jsxs(e.Fragment,{children:[e.jsx("div",{style:{width:"100%",height:"1px",background:"#ECEEF2",flexShrink:0}}),e.jsx("div",{style:{display:"flex",alignItems:"center",justifyContent:"flex-end",gap:"12px",width:"100%",flexShrink:0},children:o})]})]})]}):null}function S({label:t,variant:n="secondary",onClick:r,disabled:i}){const a=n==="primary";return e.jsx("button",{onClick:r,disabled:i,style:{display:"flex",height:"36px",padding:"0 20px",justifyContent:"center",alignItems:"center",gap:"8px",borderRadius:"6px",border:a?"none":"1px solid #D9D9D9",background:a?"var(--Base-Strong, #0B0B0B)":"var(--Base-White, #FFF)",color:a?"#FFF":"var(--Base-Strong, #1E1E1E)",fontSize:"16px",fontWeight:600,cursor:i?"default":"pointer",opacity:i?.5:1,transition:"all 0.15s ease"},onMouseEnter:o=>{!i&&!a&&(o.currentTarget.style.background="#ECEEF2")},onMouseLeave:o=>{!i&&!a&&(o.currentTarget.style.background="var(--Base-White, #FFF)")},children:t})}function k({children:t,htmlFor:n}){return e.jsx("label",{htmlFor:n,style:{display:"block",color:"var(--Base-Strong, #2E3236)",fontSize:"16px",fontStyle:"normal",fontWeight:400,lineHeight:"normal",marginBottom:"6px"},children:t})}function j(t){return e.jsx("input",{...t,style:{width:"100%",padding:"10px 12px",borderRadius:"6px",border:"1px solid #D9D9D9",color:"var(--Base-Strong, #2E3236)",fontSize:"16px",fontStyle:"normal",fontWeight:400,lineHeight:"normal",outline:"none",boxSizing:"border-box",background:"#FFF",transition:"border-color 0.15s ease",...t.style},onFocus:n=>{var r;n.currentTarget.style.borderColor="#808183",(r=t.onFocus)==null||r.call(t,n)},onBlur:n=>{var r;n.currentTarget.style.borderColor="#D9D9D9",(r=t.onBlur)==null||r.call(t,n)}})}exports.DrawerButton=S;exports.DrawerInput=j;exports.DrawerLabel=k;exports.SideDrawer=v;
|
|
2
|
+
//# sourceMappingURL=SideDrawer.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SideDrawer.cjs.js","sources":["../src/components/common/SideDrawer.jsx"],"sourcesContent":["\"use client\";\n\nimport React, { useEffect, useRef } from \"react\";\nimport { X } from \"lucide-react\";\n\n/**\n * SideDrawer — slide-in panel from the right edge.\n *\n * Props:\n * - open boolean Whether the drawer is visible\n * - onClose function Close callback\n * - title string Header title\n * - subtitle string Optional description below the divider\n * - children ReactNode Drawer body content\n * - footer ReactNode Optional fixed footer (e.g. Cancel/Save buttons)\n * - width number|string Drawer width (default 515)\n * - height number|string Drawer height (default 762)\n * - toggleLabel string Optional toggle label (right side of subtitle row)\n * - toggleChecked boolean Toggle state\n * - onToggle function Toggle callback\n * - topOffset number|string Optional top offset (e.g. below navbar)\n */\nexport default function SideDrawer({\n open,\n onClose,\n title,\n subtitle,\n children,\n footer,\n width = 515,\n height = 762,\n toggleLabel,\n toggleChecked,\n onToggle,\n topOffset,\n}) {\n const drawerRef = useRef(null);\n const hasTopOffset = topOffset !== undefined && topOffset !== null;\n const normalizedTopOffset = typeof topOffset === \"number\" ? `${topOffset}px` : topOffset;\n\n // Close on Escape key\n useEffect(() => {\n if (!open) return;\n const handleKey = (e) => {\n if (e.key === \"Escape\") onClose?.();\n };\n document.addEventListener(\"keydown\", handleKey);\n return () => document.removeEventListener(\"keydown\", handleKey);\n }, [open, onClose]);\n\n if (!open) return null;\n\n return (\n <>\n {/* Backdrop */}\n <div\n onClick={onClose}\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex: 1200,\n background: \"rgba(0, 0, 0, 0.20)\",\n }}\n />\n\n {/* Drawer panel */}\n <div\n ref={drawerRef}\n style={{\n position: \"fixed\",\n top: hasTopOffset ? normalizedTopOffset : \"50%\",\n right: 0,\n transform: hasTopOffset ? \"none\" : \"translateY(-50%)\",\n zIndex: 1201,\n display: \"flex\",\n width,\n height,\n maxHeight: hasTopOffset ? `calc(100vh - ${normalizedTopOffset})` : \"100vh\",\n padding: \"20px\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n gap: \"20px\",\n borderRadius: \"12px 0 0 12px\",\n background: \"#FFF\",\n boxShadow: \"648px 0 100px 0 rgba(0, 0, 0, 0.20)\",\n }}\n >\n {/* Header: Title + Close */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n width: \"100%\",\n flexShrink: 0,\n }}\n >\n <h2\n style={{\n fontSize: \"24px\",\n fontWeight: 600,\n fontStyle: \"normal\",\n color: \"var(--Grey-3, #252525)\",\n margin: 0,\n lineHeight: \"normal\",\n }}\n >\n {title}\n </h2>\n <button\n onClick={onClose}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"28px\",\n height: \"28px\",\n border: \"none\",\n background: \"transparent\",\n color: \"var(--Grey-Strong, #808183)\",\n cursor: \"pointer\",\n borderRadius: \"4px\",\n transition: \"background 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"#ECEEF2\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n }}\n >\n <X size={20} strokeWidth={2} />\n </button>\n </div>\n\n {/* Divider */}\n <div\n style={{\n width: \"100%\",\n height: \"1px\",\n background: \"#ECEEF2\",\n flexShrink: 0,\n }}\n />\n\n {/* Subtitle row with optional toggle */}\n {(subtitle || toggleLabel) && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n width: \"100%\",\n gap: \"12px\",\n flexShrink: 0,\n }}\n >\n {subtitle && (\n <p\n style={{\n fontSize: \"13px\",\n fontStyle: \"normal\",\n fontWeight: 400,\n lineHeight: \"140%\",\n color: \"#0B0B0B\",\n margin: 0,\n flex: 1,\n }}\n >\n {subtitle}\n </p>\n )}\n {toggleLabel && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n flexShrink: 0,\n }}\n >\n {/* Toggle switch */}\n <button\n onClick={() => onToggle?.(!toggleChecked)}\n style={{\n position: \"relative\",\n width: \"40px\",\n height: \"22px\",\n borderRadius: \"11px\",\n border: \"none\",\n background: toggleChecked\n ? \"var(--Base-Strong, #0B0B0B)\"\n : \"var(--Base-Faint, #D9D9D9)\",\n cursor: \"pointer\",\n transition: \"background 0.2s ease\",\n padding: 0,\n flexShrink: 0,\n }}\n >\n <div\n style={{\n position: \"absolute\",\n top: \"2px\",\n left: toggleChecked ? \"20px\" : \"2px\",\n width: \"18px\",\n height: \"18px\",\n borderRadius: \"50%\",\n background: \"#FFF\",\n transition: \"left 0.2s ease\",\n boxShadow: \"0 1px 3px rgba(0,0,0,0.15)\",\n }}\n />\n </button>\n <span\n style={{\n fontSize: \"13px\",\n fontWeight: 500,\n color: \"var(--Base-Strong, #1E1E1E)\",\n lineHeight: 1.4,\n }}\n >\n {toggleLabel}\n </span>\n </div>\n )}\n </div>\n )}\n\n {/* Body content — scrollable */}\n <div\n style={{\n flex: 1,\n width: \"100%\",\n overflowY: \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"16px\",\n minHeight: 0,\n }}\n >\n {children}\n </div>\n\n {/* Footer */}\n {footer && (\n <>\n <div\n style={{\n width: \"100%\",\n height: \"1px\",\n background: \"#ECEEF2\",\n flexShrink: 0,\n }}\n />\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n gap: \"12px\",\n width: \"100%\",\n flexShrink: 0,\n }}\n >\n {footer}\n </div>\n </>\n )}\n </div>\n </>\n );\n}\n\n/**\n * DrawerButton — standard button for use in SideDrawer footer.\n *\n * Props:\n * - label string\n * - variant \"primary\" | \"secondary\" (default \"secondary\")\n * - onClick function\n * - disabled boolean\n */\nexport function DrawerButton({\n label,\n variant = \"secondary\",\n onClick,\n disabled,\n}) {\n const isPrimary = variant === \"primary\";\n\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n style={{\n display: \"flex\",\n height: \"36px\",\n padding: \"0 20px\",\n justifyContent: \"center\",\n alignItems: \"center\",\n gap: \"8px\",\n borderRadius: \"6px\",\n border: isPrimary ? \"none\" : \"1px solid #D9D9D9\",\n background: isPrimary\n ? \"var(--Base-Strong, #0B0B0B)\"\n : \"var(--Base-White, #FFF)\",\n color: isPrimary ? \"#FFF\" : \"var(--Base-Strong, #1E1E1E)\",\n fontSize: \"16px\",\n fontWeight: 600,\n cursor: disabled ? \"default\" : \"pointer\",\n opacity: disabled ? 0.5 : 1,\n transition: \"all 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n if (!disabled && !isPrimary) {\n e.currentTarget.style.background = \"#ECEEF2\";\n }\n }}\n onMouseLeave={(e) => {\n if (!disabled && !isPrimary) {\n e.currentTarget.style.background = \"var(--Base-White, #FFF)\";\n }\n }}\n >\n {label}\n </button>\n );\n}\n\n/**\n * DrawerLabel — form label for use inside SideDrawer.\n *\n * Props:\n * - children ReactNode\n * - htmlFor string\n */\nexport function DrawerLabel({ children, htmlFor }) {\n return (\n <label\n htmlFor={htmlFor}\n style={{\n display: \"block\",\n color: \"var(--Base-Strong, #2E3236)\",\n fontSize: \"16px\",\n fontStyle: \"normal\",\n fontWeight: 400,\n lineHeight: \"normal\",\n marginBottom: \"6px\",\n }}\n >\n {children}\n </label>\n );\n}\n\n/**\n * DrawerInput — text input for use inside SideDrawer.\n *\n * Props:\n * - All standard <input> props (type, placeholder, value, onChange, etc.)\n */\nexport function DrawerInput(props) {\n return (\n <input\n {...props}\n style={{\n width: \"100%\",\n padding: \"10px 12px\",\n borderRadius: \"6px\",\n border: \"1px solid #D9D9D9\",\n color: \"var(--Base-Strong, #2E3236)\",\n fontSize: \"16px\",\n fontStyle: \"normal\",\n fontWeight: 400,\n lineHeight: \"normal\",\n outline: \"none\",\n boxSizing: \"border-box\",\n background: \"#FFF\",\n transition: \"border-color 0.15s ease\",\n ...props.style,\n }}\n onFocus={(e) => {\n e.currentTarget.style.borderColor = \"#808183\";\n props.onFocus?.(e);\n }}\n onBlur={(e) => {\n e.currentTarget.style.borderColor = \"#D9D9D9\";\n props.onBlur?.(e);\n }}\n />\n );\n}\n"],"names":["SideDrawer","open","onClose","title","subtitle","children","footer","width","height","toggleLabel","toggleChecked","onToggle","topOffset","drawerRef","useRef","hasTopOffset","normalizedTopOffset","useEffect","handleKey","e","jsxs","Fragment","jsx","X","DrawerButton","label","variant","onClick","disabled","isPrimary","DrawerLabel","htmlFor","DrawerInput","props","_a"],"mappings":"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"}
|
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
import { jsxs as d, Fragment as p, jsx as t } from "react/jsx-runtime";
|
|
2
|
+
import { useRef as v, useEffect as S } from "react";
|
|
3
|
+
import { X as k } from "lucide-react";
|
|
4
|
+
function B({
|
|
5
|
+
open: e,
|
|
6
|
+
onClose: n,
|
|
7
|
+
title: r,
|
|
8
|
+
subtitle: i,
|
|
9
|
+
children: o,
|
|
10
|
+
footer: a,
|
|
11
|
+
width: g = 515,
|
|
12
|
+
height: y = 762,
|
|
13
|
+
toggleLabel: c,
|
|
14
|
+
toggleChecked: x,
|
|
15
|
+
onToggle: u,
|
|
16
|
+
topOffset: s
|
|
17
|
+
}) {
|
|
18
|
+
const b = v(null), h = s != null, f = typeof s == "number" ? `${s}px` : s;
|
|
19
|
+
return S(() => {
|
|
20
|
+
if (!e)
|
|
21
|
+
return;
|
|
22
|
+
const l = (m) => {
|
|
23
|
+
m.key === "Escape" && (n == null || n());
|
|
24
|
+
};
|
|
25
|
+
return document.addEventListener("keydown", l), () => document.removeEventListener("keydown", l);
|
|
26
|
+
}, [e, n]), e ? /* @__PURE__ */ d(p, { children: [
|
|
27
|
+
/* @__PURE__ */ t(
|
|
28
|
+
"div",
|
|
29
|
+
{
|
|
30
|
+
onClick: n,
|
|
31
|
+
style: {
|
|
32
|
+
position: "fixed",
|
|
33
|
+
inset: 0,
|
|
34
|
+
zIndex: 1200,
|
|
35
|
+
background: "rgba(0, 0, 0, 0.20)"
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
),
|
|
39
|
+
/* @__PURE__ */ d(
|
|
40
|
+
"div",
|
|
41
|
+
{
|
|
42
|
+
ref: b,
|
|
43
|
+
style: {
|
|
44
|
+
position: "fixed",
|
|
45
|
+
top: h ? f : "50%",
|
|
46
|
+
right: 0,
|
|
47
|
+
transform: h ? "none" : "translateY(-50%)",
|
|
48
|
+
zIndex: 1201,
|
|
49
|
+
display: "flex",
|
|
50
|
+
width: g,
|
|
51
|
+
height: y,
|
|
52
|
+
maxHeight: h ? `calc(100vh - ${f})` : "100vh",
|
|
53
|
+
padding: "20px",
|
|
54
|
+
flexDirection: "column",
|
|
55
|
+
alignItems: "flex-start",
|
|
56
|
+
gap: "20px",
|
|
57
|
+
borderRadius: "12px 0 0 12px",
|
|
58
|
+
background: "#FFF",
|
|
59
|
+
boxShadow: "648px 0 100px 0 rgba(0, 0, 0, 0.20)"
|
|
60
|
+
},
|
|
61
|
+
children: [
|
|
62
|
+
/* @__PURE__ */ d(
|
|
63
|
+
"div",
|
|
64
|
+
{
|
|
65
|
+
style: {
|
|
66
|
+
display: "flex",
|
|
67
|
+
alignItems: "center",
|
|
68
|
+
justifyContent: "space-between",
|
|
69
|
+
width: "100%",
|
|
70
|
+
flexShrink: 0
|
|
71
|
+
},
|
|
72
|
+
children: [
|
|
73
|
+
/* @__PURE__ */ t(
|
|
74
|
+
"h2",
|
|
75
|
+
{
|
|
76
|
+
style: {
|
|
77
|
+
fontSize: "24px",
|
|
78
|
+
fontWeight: 600,
|
|
79
|
+
fontStyle: "normal",
|
|
80
|
+
color: "var(--Grey-3, #252525)",
|
|
81
|
+
margin: 0,
|
|
82
|
+
lineHeight: "normal"
|
|
83
|
+
},
|
|
84
|
+
children: r
|
|
85
|
+
}
|
|
86
|
+
),
|
|
87
|
+
/* @__PURE__ */ t(
|
|
88
|
+
"button",
|
|
89
|
+
{
|
|
90
|
+
onClick: n,
|
|
91
|
+
style: {
|
|
92
|
+
display: "flex",
|
|
93
|
+
alignItems: "center",
|
|
94
|
+
justifyContent: "center",
|
|
95
|
+
width: "28px",
|
|
96
|
+
height: "28px",
|
|
97
|
+
border: "none",
|
|
98
|
+
background: "transparent",
|
|
99
|
+
color: "var(--Grey-Strong, #808183)",
|
|
100
|
+
cursor: "pointer",
|
|
101
|
+
borderRadius: "4px",
|
|
102
|
+
transition: "background 0.15s ease"
|
|
103
|
+
},
|
|
104
|
+
onMouseEnter: (l) => {
|
|
105
|
+
l.currentTarget.style.background = "#ECEEF2";
|
|
106
|
+
},
|
|
107
|
+
onMouseLeave: (l) => {
|
|
108
|
+
l.currentTarget.style.background = "transparent";
|
|
109
|
+
},
|
|
110
|
+
children: /* @__PURE__ */ t(k, { size: 20, strokeWidth: 2 })
|
|
111
|
+
}
|
|
112
|
+
)
|
|
113
|
+
]
|
|
114
|
+
}
|
|
115
|
+
),
|
|
116
|
+
/* @__PURE__ */ t(
|
|
117
|
+
"div",
|
|
118
|
+
{
|
|
119
|
+
style: {
|
|
120
|
+
width: "100%",
|
|
121
|
+
height: "1px",
|
|
122
|
+
background: "#ECEEF2",
|
|
123
|
+
flexShrink: 0
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
),
|
|
127
|
+
(i || c) && /* @__PURE__ */ d(
|
|
128
|
+
"div",
|
|
129
|
+
{
|
|
130
|
+
style: {
|
|
131
|
+
display: "flex",
|
|
132
|
+
alignItems: "center",
|
|
133
|
+
justifyContent: "space-between",
|
|
134
|
+
width: "100%",
|
|
135
|
+
gap: "12px",
|
|
136
|
+
flexShrink: 0
|
|
137
|
+
},
|
|
138
|
+
children: [
|
|
139
|
+
i && /* @__PURE__ */ t(
|
|
140
|
+
"p",
|
|
141
|
+
{
|
|
142
|
+
style: {
|
|
143
|
+
fontSize: "13px",
|
|
144
|
+
fontStyle: "normal",
|
|
145
|
+
fontWeight: 400,
|
|
146
|
+
lineHeight: "140%",
|
|
147
|
+
color: "#0B0B0B",
|
|
148
|
+
margin: 0,
|
|
149
|
+
flex: 1
|
|
150
|
+
},
|
|
151
|
+
children: i
|
|
152
|
+
}
|
|
153
|
+
),
|
|
154
|
+
c && /* @__PURE__ */ d(
|
|
155
|
+
"div",
|
|
156
|
+
{
|
|
157
|
+
style: {
|
|
158
|
+
display: "flex",
|
|
159
|
+
alignItems: "center",
|
|
160
|
+
gap: "8px",
|
|
161
|
+
flexShrink: 0
|
|
162
|
+
},
|
|
163
|
+
children: [
|
|
164
|
+
/* @__PURE__ */ t(
|
|
165
|
+
"button",
|
|
166
|
+
{
|
|
167
|
+
onClick: () => u == null ? void 0 : u(!x),
|
|
168
|
+
style: {
|
|
169
|
+
position: "relative",
|
|
170
|
+
width: "40px",
|
|
171
|
+
height: "22px",
|
|
172
|
+
borderRadius: "11px",
|
|
173
|
+
border: "none",
|
|
174
|
+
background: x ? "var(--Base-Strong, #0B0B0B)" : "var(--Base-Faint, #D9D9D9)",
|
|
175
|
+
cursor: "pointer",
|
|
176
|
+
transition: "background 0.2s ease",
|
|
177
|
+
padding: 0,
|
|
178
|
+
flexShrink: 0
|
|
179
|
+
},
|
|
180
|
+
children: /* @__PURE__ */ t(
|
|
181
|
+
"div",
|
|
182
|
+
{
|
|
183
|
+
style: {
|
|
184
|
+
position: "absolute",
|
|
185
|
+
top: "2px",
|
|
186
|
+
left: x ? "20px" : "2px",
|
|
187
|
+
width: "18px",
|
|
188
|
+
height: "18px",
|
|
189
|
+
borderRadius: "50%",
|
|
190
|
+
background: "#FFF",
|
|
191
|
+
transition: "left 0.2s ease",
|
|
192
|
+
boxShadow: "0 1px 3px rgba(0,0,0,0.15)"
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
)
|
|
196
|
+
}
|
|
197
|
+
),
|
|
198
|
+
/* @__PURE__ */ t(
|
|
199
|
+
"span",
|
|
200
|
+
{
|
|
201
|
+
style: {
|
|
202
|
+
fontSize: "13px",
|
|
203
|
+
fontWeight: 500,
|
|
204
|
+
color: "var(--Base-Strong, #1E1E1E)",
|
|
205
|
+
lineHeight: 1.4
|
|
206
|
+
},
|
|
207
|
+
children: c
|
|
208
|
+
}
|
|
209
|
+
)
|
|
210
|
+
]
|
|
211
|
+
}
|
|
212
|
+
)
|
|
213
|
+
]
|
|
214
|
+
}
|
|
215
|
+
),
|
|
216
|
+
/* @__PURE__ */ t(
|
|
217
|
+
"div",
|
|
218
|
+
{
|
|
219
|
+
style: {
|
|
220
|
+
flex: 1,
|
|
221
|
+
width: "100%",
|
|
222
|
+
overflowY: "auto",
|
|
223
|
+
display: "flex",
|
|
224
|
+
flexDirection: "column",
|
|
225
|
+
gap: "16px",
|
|
226
|
+
minHeight: 0
|
|
227
|
+
},
|
|
228
|
+
children: o
|
|
229
|
+
}
|
|
230
|
+
),
|
|
231
|
+
a && /* @__PURE__ */ d(p, { children: [
|
|
232
|
+
/* @__PURE__ */ t(
|
|
233
|
+
"div",
|
|
234
|
+
{
|
|
235
|
+
style: {
|
|
236
|
+
width: "100%",
|
|
237
|
+
height: "1px",
|
|
238
|
+
background: "#ECEEF2",
|
|
239
|
+
flexShrink: 0
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
),
|
|
243
|
+
/* @__PURE__ */ t(
|
|
244
|
+
"div",
|
|
245
|
+
{
|
|
246
|
+
style: {
|
|
247
|
+
display: "flex",
|
|
248
|
+
alignItems: "center",
|
|
249
|
+
justifyContent: "flex-end",
|
|
250
|
+
gap: "12px",
|
|
251
|
+
width: "100%",
|
|
252
|
+
flexShrink: 0
|
|
253
|
+
},
|
|
254
|
+
children: a
|
|
255
|
+
}
|
|
256
|
+
)
|
|
257
|
+
] })
|
|
258
|
+
]
|
|
259
|
+
}
|
|
260
|
+
)
|
|
261
|
+
] }) : null;
|
|
262
|
+
}
|
|
263
|
+
function D({
|
|
264
|
+
label: e,
|
|
265
|
+
variant: n = "secondary",
|
|
266
|
+
onClick: r,
|
|
267
|
+
disabled: i
|
|
268
|
+
}) {
|
|
269
|
+
const o = n === "primary";
|
|
270
|
+
return /* @__PURE__ */ t(
|
|
271
|
+
"button",
|
|
272
|
+
{
|
|
273
|
+
onClick: r,
|
|
274
|
+
disabled: i,
|
|
275
|
+
style: {
|
|
276
|
+
display: "flex",
|
|
277
|
+
height: "36px",
|
|
278
|
+
padding: "0 20px",
|
|
279
|
+
justifyContent: "center",
|
|
280
|
+
alignItems: "center",
|
|
281
|
+
gap: "8px",
|
|
282
|
+
borderRadius: "6px",
|
|
283
|
+
border: o ? "none" : "1px solid #D9D9D9",
|
|
284
|
+
background: o ? "var(--Base-Strong, #0B0B0B)" : "var(--Base-White, #FFF)",
|
|
285
|
+
color: o ? "#FFF" : "var(--Base-Strong, #1E1E1E)",
|
|
286
|
+
fontSize: "16px",
|
|
287
|
+
fontWeight: 600,
|
|
288
|
+
cursor: i ? "default" : "pointer",
|
|
289
|
+
opacity: i ? 0.5 : 1,
|
|
290
|
+
transition: "all 0.15s ease"
|
|
291
|
+
},
|
|
292
|
+
onMouseEnter: (a) => {
|
|
293
|
+
!i && !o && (a.currentTarget.style.background = "#ECEEF2");
|
|
294
|
+
},
|
|
295
|
+
onMouseLeave: (a) => {
|
|
296
|
+
!i && !o && (a.currentTarget.style.background = "var(--Base-White, #FFF)");
|
|
297
|
+
},
|
|
298
|
+
children: e
|
|
299
|
+
}
|
|
300
|
+
);
|
|
301
|
+
}
|
|
302
|
+
function z({ children: e, htmlFor: n }) {
|
|
303
|
+
return /* @__PURE__ */ t(
|
|
304
|
+
"label",
|
|
305
|
+
{
|
|
306
|
+
htmlFor: n,
|
|
307
|
+
style: {
|
|
308
|
+
display: "block",
|
|
309
|
+
color: "var(--Base-Strong, #2E3236)",
|
|
310
|
+
fontSize: "16px",
|
|
311
|
+
fontStyle: "normal",
|
|
312
|
+
fontWeight: 400,
|
|
313
|
+
lineHeight: "normal",
|
|
314
|
+
marginBottom: "6px"
|
|
315
|
+
},
|
|
316
|
+
children: e
|
|
317
|
+
}
|
|
318
|
+
);
|
|
319
|
+
}
|
|
320
|
+
function I(e) {
|
|
321
|
+
return /* @__PURE__ */ t(
|
|
322
|
+
"input",
|
|
323
|
+
{
|
|
324
|
+
...e,
|
|
325
|
+
style: {
|
|
326
|
+
width: "100%",
|
|
327
|
+
padding: "10px 12px",
|
|
328
|
+
borderRadius: "6px",
|
|
329
|
+
border: "1px solid #D9D9D9",
|
|
330
|
+
color: "var(--Base-Strong, #2E3236)",
|
|
331
|
+
fontSize: "16px",
|
|
332
|
+
fontStyle: "normal",
|
|
333
|
+
fontWeight: 400,
|
|
334
|
+
lineHeight: "normal",
|
|
335
|
+
outline: "none",
|
|
336
|
+
boxSizing: "border-box",
|
|
337
|
+
background: "#FFF",
|
|
338
|
+
transition: "border-color 0.15s ease",
|
|
339
|
+
...e.style
|
|
340
|
+
},
|
|
341
|
+
onFocus: (n) => {
|
|
342
|
+
var r;
|
|
343
|
+
n.currentTarget.style.borderColor = "#808183", (r = e.onFocus) == null || r.call(e, n);
|
|
344
|
+
},
|
|
345
|
+
onBlur: (n) => {
|
|
346
|
+
var r;
|
|
347
|
+
n.currentTarget.style.borderColor = "#D9D9D9", (r = e.onBlur) == null || r.call(e, n);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
);
|
|
351
|
+
}
|
|
352
|
+
export {
|
|
353
|
+
D,
|
|
354
|
+
B as S,
|
|
355
|
+
z as a,
|
|
356
|
+
I as b
|
|
357
|
+
};
|
|
358
|
+
//# sourceMappingURL=SideDrawer.es.js.map
|