chordia-ui 3.9.0 → 3.9.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/DataTable2.cjs.js +1 -1
- package/dist/DataTable2.cjs.js.map +1 -1
- package/dist/DataTable2.es.js +611 -604
- package/dist/DataTable2.es.js.map +1 -1
- package/dist/PerformancePanel.cjs.js +1 -1
- package/dist/PerformancePanel.cjs.js.map +1 -1
- package/dist/PerformancePanel.es.js +1068 -816
- package/dist/PerformancePanel.es.js.map +1 -1
- package/dist/SupervisorSelect.cjs.js +2 -0
- package/dist/SupervisorSelect.cjs.js.map +1 -0
- package/dist/SupervisorSelect.es.js +352 -0
- package/dist/SupervisorSelect.es.js.map +1 -0
- package/dist/components/Signals.cjs.js +1 -1
- package/dist/components/Signals.cjs.js.map +1 -1
- package/dist/components/Signals.es.js +273 -318
- package/dist/components/Signals.es.js.map +1 -1
- package/dist/components/UpdatedInteractionDetails.cjs.js +3 -3
- package/dist/components/UpdatedInteractionDetails.cjs.js.map +1 -1
- package/dist/components/UpdatedInteractionDetails.es.js +98 -92
- package/dist/components/UpdatedInteractionDetails.es.js.map +1 -1
- package/dist/components/performance.cjs.js +1 -1
- package/dist/components/performance.cjs.js.map +1 -1
- package/dist/components/performance.es.js +116 -349
- package/dist/components/performance.es.js.map +1 -1
- package/dist/components/reports.cjs.js +2 -2
- package/dist/components/reports.cjs.js.map +1 -1
- package/dist/components/reports.es.js +122 -141
- package/dist/components/reports.es.js.map +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.es.js +1 -1
- package/dist/pages/interactionDetails.cjs.js +2 -2
- package/dist/pages/interactionDetails.cjs.js.map +1 -1
- package/dist/pages/interactionDetails.es.js +130 -124
- package/dist/pages/interactionDetails.es.js.map +1 -1
- package/package.json +1 -1
- package/src/components/Signals/SignalDetailsPage.jsx +2 -29
- package/src/components/Signals/SignalsListPage.jsx +2 -24
- package/src/components/UpdatedInteractionDetails/UpdatedCoachingSynthesisCard.jsx +8 -1
- package/src/components/data/DataTable2.jsx +19 -5
- package/src/components/pages/interactionDetails/CoachingSynthesisCard.jsx +8 -1
- package/src/components/performance/PerformanceDetailsPage.jsx +230 -75
- package/src/components/performance/PerformancePanel.jsx +42 -45
- package/src/components/performance/index.js +27 -0
- package/src/components/performance/performanceApiMap.js +133 -0
- package/src/components/performance/performanceMetrics.js +63 -0
- package/src/components/performance/performanceRangeFormat.js +92 -0
- package/src/components/performance/performanceSparkline.js +52 -0
- package/src/components/reports/ReportsList.jsx +2 -25
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Signals.cjs.js","sources":["../../src/components/Signals/SignalDetailsPage.jsx","../../src/components/Signals/SignalsListPage.jsx"],"sourcesContent":["\"use client\";\n\nimport React from \"react\";\nimport {\n ArrowLeft,\n CalendarDays,\n ChevronDown,\n Check,\n Download,\n Share2,\n FileText,\n} from \"lucide-react\";\nimport DataTable2 from \"../data/DataTable2\";\nimport { DateRangeButton } from \"../performance/PerformancePanel\";\n\nconst C = {\n ink: \"#2E3236\",\n muted: \"#808183\",\n border: \"#D9D9D9\",\n borderSubtle: \"#E6E6E6\",\n black: \"#0B0B0B\",\n white: \"#FFFFFF\",\n neutralBorder: \"#BFBFBF\",\n neutralLight: \"#E6E6E6\",\n neutral800: \"#323232\",\n neutral600: \"#676767\",\n neutral400: \"#989898\",\n fillTrack: \"#EFEFEF\",\n beige: \"rgba(243, 241, 229, 0.4)\",\n};\n\nconst FONT_DISPLAY = \"var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)\";\n\nfunction formatLocalDate(date) {\n if (!(date instanceof Date)) {\n const parsed = new Date(date);\n if (Number.isNaN(parsed.getTime())) return String(date ?? \"\");\n date = parsed;\n }\n return date.toLocaleDateString(\"en-US\", {\n month: \"2-digit\",\n day: \"2-digit\",\n year: \"numeric\",\n });\n}\n\nconst DEFAULT_RANGE_OPTIONS = [\n { id: \"8h\", label: \"8h\" },\n { id: \"1d\", label: \"1d\" },\n { id: \"7d\", label: \"7d\" },\n { id: \"30d\", label: \"30d\" },\n];\n\nconst RANGE_TO_MS = {\n \"8h\": 8 * 60 * 60 * 1000,\n \"1d\": 24 * 60 * 60 * 1000,\n \"7d\": 7 * 24 * 60 * 60 * 1000,\n \"30d\": 30 * 24 * 60 * 60 * 1000,\n};\n\nfunction computeWindowLabel(windowId) {\n const ms = RANGE_TO_MS[windowId];\n if (!ms) return \"\";\n const to = new Date();\n const from = new Date(to.getTime() - ms);\n return `${formatLocalDate(from)} – ${formatLocalDate(to)}`;\n}\n\nfunction RangeChip({ label, active = false, onClick }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n style={{\n height: 32,\n minWidth: 31,\n padding: \"0 12px\",\n borderRadius: 10,\n border: active ? \"none\" : `1px solid ${C.borderSubtle}`,\n background: active ? C.black : C.white,\n color: active ? C.white : C.black,\n fontFamily: FONT_DISPLAY,\n fontSize: 14,\n cursor: \"pointer\",\n }}\n >\n {label}\n </button>\n );\n}\n\n// KPI card that mirrors the Figma \"Total Calls\" tile: a large value, a small\n// muted delta hint inline to the right, and a label underneath.\nfunction KpiCard({ value, delta, label, style = {} }) {\n return (\n <div\n style={{\n background: C.white,\n border: `1px solid ${C.border}`,\n borderRadius: 8,\n padding: 16,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n boxSizing: \"border-box\",\n ...style,\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"baseline\", gap: 8, minHeight: 36 }}>\n <span\n style={{\n fontFamily: FONT_DISPLAY,\n fontSize: 28,\n fontWeight: 500,\n color: C.ink,\n letterSpacing: \"-0.01em\",\n lineHeight: 1.1,\n }}\n >\n {value}\n </span>\n {delta != null && delta !== \"\" && (\n <span\n style={{\n fontFamily: FONT_DISPLAY,\n fontSize: 12,\n fontWeight: 500,\n color: C.muted,\n whiteSpace: \"nowrap\",\n }}\n >\n {delta}\n </span>\n )}\n </div>\n <span style={{ fontFamily: FONT_DISPLAY, fontSize: 13, color: C.ink, lineHeight: 1.2 }}>\n {label}\n </span>\n </div>\n );\n}\n\n// Triple sub-card for the \"Outcome Correlation\" tile. Each cell shows a primary\n// value plus a two-line caption. All labels are host-provided so the library\n// stays free of demo copy.\nfunction OutcomeCorrelationCard({\n title = \"\",\n present = { value: \"\", caption: \"\", sub: \"\" },\n absent = { value: \"\", caption: \"\", sub: \"\" },\n impact = { value: \"\", caption: \"\", sub: \"\" },\n style = {},\n}) {\n return (\n <div\n style={{\n flex: 1,\n background: C.beige,\n border: `1px solid ${C.border}`,\n borderRadius: 8,\n padding: 16,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 12,\n boxSizing: \"border-box\",\n minWidth: 0,\n ...style,\n }}\n >\n <span\n style={{\n fontFamily: FONT_DISPLAY,\n fontSize: 13,\n fontWeight: 500,\n color: C.ink,\n lineHeight: 1.2,\n }}\n >\n {title}\n </span>\n <div style={{ display: \"flex\", alignItems: \"stretch\", gap: 24, minWidth: 0 }}>\n <OutcomeCell {...present} />\n <OutcomeCell {...absent} />\n <OutcomeCell {...impact} />\n </div>\n </div>\n );\n}\n\nfunction OutcomeCell({ value, caption, sub }) {\n return (\n <div\n style={{\n flex: 1,\n minWidth: 0,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n }}\n >\n <span\n style={{\n fontFamily: FONT_DISPLAY,\n fontSize: 22,\n fontWeight: 500,\n color: C.muted,\n letterSpacing: \"-0.01em\",\n lineHeight: 1.1,\n }}\n >\n {value}\n </span>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n <span style={{ fontFamily: FONT_DISPLAY, fontSize: 12, color: C.ink, lineHeight: 1.2 }}>\n {caption}\n </span>\n {sub && (\n <span\n style={{ fontFamily: FONT_DISPLAY, fontSize: 12, color: C.neutral600, lineHeight: 1.2 }}\n >\n {sub}\n </span>\n )}\n </div>\n </div>\n );\n}\n\n// Dropdown used by the Fire Rate Trend chart card to pick a comparison view.\n// Matches the View-By pattern from PerformancePanel (anchored popover).\nfunction ViewBySelect({ value, options = [], onChange }) {\n const [open, setOpen] = React.useState(false);\n const triggerRef = React.useRef(null);\n const popoverRef = React.useRef(null);\n React.useEffect(() => {\n if (!open) return;\n const handler = (e) => {\n if (\n popoverRef.current?.contains(e.target) ||\n triggerRef.current?.contains(e.target)\n ) {\n return;\n }\n setOpen(false);\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [open]);\n const selected = options.find((o) => o.id === value) || options[0];\n return (\n <div style={{ position: \"relative\" }}>\n <button\n type=\"button\"\n ref={triggerRef}\n onClick={() => setOpen((v) => !v)}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n height: 24,\n padding: \"0 8px 0 0\",\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n fontFamily: FONT_DISPLAY,\n fontSize: 12,\n color: C.ink,\n }}\n >\n {selected?.label}\n <ChevronDown\n size={14}\n strokeWidth={1.75}\n style={{ transform: open ? \"rotate(180deg)\" : \"none\", transition: \"transform 120ms ease\" }}\n />\n </button>\n {open && (\n <div\n ref={popoverRef}\n role=\"listbox\"\n style={{\n position: \"absolute\",\n top: 28,\n right: 0,\n zIndex: 30,\n background: C.white,\n border: `1px solid ${C.border}`,\n borderRadius: 8,\n boxShadow: \"0 8px 24px rgba(11, 11, 11, 0.12)\",\n minWidth: 200,\n padding: 4,\n fontFamily: FONT_DISPLAY,\n }}\n >\n {options.map((opt) => {\n const isSelected = opt.id === value;\n return (\n <button\n key={opt.id}\n type=\"button\"\n role=\"option\"\n aria-selected={isSelected}\n onClick={() => {\n onChange?.(opt.id);\n setOpen(false);\n }}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n width: \"100%\",\n padding: \"8px 10px\",\n border: \"none\",\n background: isSelected ? C.borderSubtle : \"transparent\",\n cursor: \"pointer\",\n textAlign: \"left\",\n fontFamily: FONT_DISPLAY,\n fontSize: 13,\n color: C.ink,\n borderRadius: 6,\n }}\n >\n {isSelected ? (\n <Check size={16} color={C.ink} strokeWidth={1.75} />\n ) : (\n <span style={{ width: 16 }} />\n )}\n <span>{opt.label}</span>\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n\n// Two-series line chart (current + previous period). Series points are arrays\n// of y-numbers, equally spaced across the x-axis. The previous series is\n// rendered dashed; current is solid.\nfunction FireRateTrendChart({\n currentSeries = [],\n previousSeries = [],\n yLabels = [],\n height = 176,\n showPrevious = true,\n legendCurrentLabel = \"\",\n legendPreviousLabel = \"\",\n}) {\n const innerHeight = height - 8;\n const PADDING_LEFT = 32;\n const PADDING_RIGHT = 8;\n const viewWidth = 1080;\n const innerWidth = viewWidth - PADDING_LEFT - PADDING_RIGHT;\n\n const allValues = [...currentSeries, ...(showPrevious ? previousSeries : [])];\n const hasData = allValues.length > 0;\n if (!hasData) {\n return (\n <div\n style={{\n height,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontFamily: FONT_DISPLAY,\n fontSize: 12,\n color: C.muted,\n }}\n >\n No data\n </div>\n );\n }\n\n const yMin = Math.min(...allValues, 0);\n const yMax = Math.max(...allValues, 1);\n const ySpan = yMax - yMin || 1;\n const sy = (y) => 12 + ((yMax - y) / ySpan) * (innerHeight - 24);\n const seriesToPath = (series) => {\n if (!series.length) return \"\";\n const step = series.length > 1 ? innerWidth / (series.length - 1) : 0;\n return series\n .map((y, i) => `${i === 0 ? \"M\" : \"L\"}${PADDING_LEFT + i * step},${sy(y)}`)\n .join(\" \");\n };\n\n const currentPath = seriesToPath(currentSeries);\n const previousPath = showPrevious ? seriesToPath(previousSeries) : \"\";\n\n const dots = (series) =>\n series.map((y, i) => {\n const step = series.length > 1 ? innerWidth / (series.length - 1) : 0;\n return { x: PADDING_LEFT + i * step, y: sy(y) };\n });\n\n return (\n <div style={{ width: \"100%\" }}>\n <svg\n width=\"100%\"\n height={height}\n viewBox={`0 0 ${viewWidth} ${height}`}\n preserveAspectRatio=\"none\"\n >\n {/* y-axis labels (top / middle / bottom) */}\n {yLabels.map((l, i) => {\n const yPos =\n 12 + (i / Math.max(1, yLabels.length - 1)) * (innerHeight - 24);\n return (\n <text\n key={l + i}\n x={0}\n y={yPos + 3}\n fontFamily={FONT_DISPLAY}\n fontSize=\"10\"\n fill={C.neutral800}\n >\n {l}\n </text>\n );\n })}\n {/* baseline */}\n <line\n x1={PADDING_LEFT}\n y1={innerHeight}\n x2={viewWidth - PADDING_RIGHT}\n y2={innerHeight}\n stroke={C.border}\n strokeWidth=\"1\"\n />\n {/* faint grid lines at top + middle */}\n <line\n x1={PADDING_LEFT}\n y1={12}\n x2={viewWidth - PADDING_RIGHT}\n y2={12}\n stroke={C.borderSubtle}\n strokeDasharray=\"2 4\"\n strokeWidth=\"1\"\n />\n {previousPath && (\n <path\n d={previousPath}\n stroke={C.neutral400}\n strokeWidth=\"1.5\"\n strokeDasharray=\"4 4\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n )}\n {currentPath && (\n <path\n d={currentPath}\n stroke={C.black}\n strokeWidth=\"1.5\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n )}\n {/* markers */}\n {showPrevious &&\n dots(previousSeries).map((p, i) => (\n <circle\n key={`prev-${i}`}\n cx={p.x}\n cy={p.y}\n r={3}\n fill={C.white}\n stroke={C.neutral400}\n strokeWidth=\"1.5\"\n />\n ))}\n {dots(currentSeries).map((p, i) => (\n <circle\n key={`cur-${i}`}\n cx={p.x}\n cy={p.y}\n r={3}\n fill={C.white}\n stroke={C.black}\n strokeWidth=\"1.5\"\n />\n ))}\n </svg>\n {/* Legend — only renders when the host provides labels for the series. */}\n {(legendCurrentLabel || (showPrevious && legendPreviousLabel)) && (\n <div\n style={{\n display: \"flex\",\n justifyContent: \"center\",\n gap: 24,\n marginTop: 8,\n fontFamily: FONT_DISPLAY,\n fontSize: 11,\n color: C.ink,\n }}\n >\n {legendCurrentLabel && (\n <span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 6 }}>\n <span style={{ width: 20, height: 0, borderTop: `2px solid ${C.black}` }} />\n {legendCurrentLabel}\n </span>\n )}\n {showPrevious && legendPreviousLabel && (\n <span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 6 }}>\n <span\n style={{\n width: 20,\n height: 0,\n borderTop: `2px dashed ${C.neutral400}`,\n }}\n />\n {legendPreviousLabel}\n </span>\n )}\n </div>\n )}\n </div>\n );\n}\n\n// Section heading: small icon-in-circle on the left, bold title, optional\n// trailing count badge on the right, and a hairline bottom divider. Used for\n// \"Co-occurring Signals\" and \"Evidence Samples\" — the same shape repeats in\n// both (matches Figma node 4010:1423).\nfunction SectionHeading({ icon: Icon, title, count }) {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 16,\n width: \"100%\",\n paddingBottom: 16,\n borderBottom: `1px solid ${C.border}`,\n }}\n >\n <div\n style={{\n width: 34,\n height: 34,\n borderRadius: 9999,\n background: \"#F3F7F7\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n <Icon size={20} color={C.ink} strokeWidth={1.75} />\n </div>\n <span\n style={{\n flex: 1,\n fontFamily: FONT_DISPLAY,\n fontWeight: 700,\n fontSize: 16,\n color: C.ink,\n lineHeight: 1.2,\n }}\n >\n {title}\n </span>\n {count != null && count !== \"\" && (\n <span\n style={{\n fontFamily: FONT_DISPLAY,\n fontSize: 13,\n color: C.muted,\n }}\n >\n {count}\n </span>\n )}\n </div>\n );\n}\n\n// Two-column list row: label on the left, value (or rate) on the right.\n// Used inside the Co-occurring Signals / Evidence Samples panels.\nfunction PercentRow({ label, value }) {\n return (\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n padding: \"10px 0\",\n borderBottom: `1px solid ${C.border}`,\n fontFamily: FONT_DISPLAY,\n fontSize: 13,\n lineHeight: 1.4,\n gap: 16,\n }}\n >\n <span style={{ color: C.ink, minWidth: 0, overflow: \"hidden\", textOverflow: \"ellipsis\" }}>\n {label}\n </span>\n <span style={{ color: C.muted, whiteSpace: \"nowrap\" }}>{value}</span>\n </div>\n );\n}\n\nfunction TwoColumnList({ items = [] }) {\n if (!items.length) {\n return (\n <div\n style={{ padding: \"12px 0\", fontFamily: FONT_DISPLAY, fontSize: 13, color: C.muted }}\n >\n No items available.\n </div>\n );\n }\n const half = Math.ceil(items.length / 2);\n const left = items.slice(0, half);\n const right = items.slice(half);\n return (\n <div style={{ display: \"flex\", gap: 24 }}>\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\" }}>\n {left.map((row, i) => (\n <PercentRow key={`l-${i}`} {...row} />\n ))}\n </div>\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\" }}>\n {right.map((row, i) => (\n <PercentRow key={`r-${i}`} {...row} />\n ))}\n </div>\n </div>\n );\n}\n\n// Compass score dot rating used in the Recent Interactions table.\nfunction CompassDots({ value = 0, max = 5 }) {\n const v = typeof value === \"number\" ? value : parseFloat(value) || 0;\n const full = Math.floor(v);\n const hasPartial = v % 1 > 0 && full < max;\n return (\n <div style={{ display: \"inline-flex\", gap: 4 }}>\n {Array.from({ length: max }).map((_, i) => {\n if (i < full) {\n return (\n <span\n key={i}\n style={{ width: 10, height: 10, borderRadius: \"50%\", background: C.black }}\n />\n );\n }\n if (i === full && hasPartial) {\n return (\n <span\n key={i}\n style={{\n width: 10,\n height: 10,\n borderRadius: \"50%\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <span style={{ width: 6, height: 6, borderRadius: \"50%\", background: C.black }} />\n </span>\n );\n }\n return (\n <span\n key={i}\n style={{\n width: 10,\n height: 10,\n borderRadius: \"50%\",\n background: C.white,\n border: `1px solid ${C.border}`,\n boxSizing: \"border-box\",\n }}\n />\n );\n })}\n </div>\n );\n}\n\nexport const DEFAULT_AGENT_BREAKDOWN_COLUMNS = [\n { id: \"agent\", label: \"Agent\", width: 250, sortable: true, filterable: true },\n {\n id: \"fireCount\",\n label: \"Fire Count\",\n width: 174,\n sortable: true,\n filterable: true,\n filterType: \"number\",\n },\n {\n id: \"totalCalls\",\n label: \"Total Calls\",\n width: 181,\n sortable: true,\n filterable: true,\n filterType: \"number\",\n },\n {\n id: \"rate\",\n label: \"Rate\",\n width: 183,\n sortable: true,\n filterable: true,\n filterType: \"number\",\n },\n {\n id: \"avgStrength\",\n label: \"Avg Strength\",\n width: 172,\n sortable: true,\n filterable: true,\n filterType: \"number\",\n },\n];\n\nexport const DEFAULT_RECENT_INTERACTION_COLUMNS = [\n { id: \"dateTime\", label: \"Date & Time\", width: 212, sortable: true },\n { id: \"agent\", label: \"Agent\", width: 224, sortable: true, filterable: true },\n { id: \"title\", label: \"Title\", width: 298, sortable: true, filterable: true },\n {\n id: \"strength\",\n label: \"Strength\",\n width: 172,\n sortable: true,\n filterable: true,\n filterType: \"number\",\n },\n {\n id: \"compass\",\n label: \"Compass Score\",\n width: 183,\n sortable: true,\n filterable: true,\n filterType: \"number\",\n render: (value) => {\n const num = typeof value === \"number\" ? value : parseFloat(value) || 0;\n return (\n <span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 12 }}>\n <span style={{ minWidth: 32 }}>{value}</span>\n <CompassDots value={num} />\n </span>\n );\n },\n },\n];\n\nexport default function SignalDetailsPage({\n className = \"\",\n // Header\n signalName = \"\",\n signalSubtitle = \"\",\n onBack,\n // Date controls\n dateRangeLabel = \"\",\n rangeOptions = DEFAULT_RANGE_OPTIONS,\n selectedWindow = \"30d\",\n onWindowChange,\n dateRangePicker,\n dateRange,\n onDateRangeChange,\n onExport,\n // KPI strip — primary tiles\n fireRateStat = { value: \"\", delta: \"\", label: \"\" },\n fireCountStat = { value: \"\", delta: \"\", label: \"\" },\n // Outcome correlation tile (3 sub-cells)\n outcomeCorrelation = {\n title: \"\",\n present: { value: \"\", caption: \"\", sub: \"\" },\n absent: { value: \"\", caption: \"\", sub: \"\" },\n impact: { value: \"\", caption: \"\", sub: \"\" },\n },\n // Fire Rate Trend chart\n chartTitle = \"\",\n chartLegendCurrentLabel = \"\",\n chartLegendPreviousLabel = \"\",\n chartYLabels = [],\n fireRateTrend = { currentSeries: [], previousSeries: [] },\n chartViewOptions = [],\n chartView,\n onChartViewChange,\n // Agent breakdown table\n agentBreakdownRows = [],\n agentBreakdownColumns = DEFAULT_AGENT_BREAKDOWN_COLUMNS,\n agentBreakdownTitle = \"\",\n onAgentClick,\n onAgentBreakdownVisibleColumnsChange,\n agentBreakdownInitialPageSize = 10,\n // Co-occurring signals\n coOccurringTitle = \"\",\n coOccurringItems = [],\n // Evidence samples\n evidenceTitle = \"\",\n evidenceItems = [],\n // Recent interactions table\n recentInteractions = [],\n recentInteractionColumns = DEFAULT_RECENT_INTERACTION_COLUMNS,\n recentInteractionsTitle = \"\",\n onInteractionClick,\n onRecentInteractionsVisibleColumnsChange,\n recentInteractionsInitialPageSize = 10,\n // Server-side pagination pass-through for both tables (optional).\n agentBreakdownTotal = null,\n agentBreakdownPage = null,\n agentBreakdownPageSize = null,\n onAgentBreakdownPageChange,\n onAgentBreakdownPageSizeChange,\n recentInteractionsTotal = null,\n recentInteractionsPage = null,\n recentInteractionsPageSize = null,\n onRecentInteractionsPageChange,\n onRecentInteractionsPageSizeChange,\n}) {\n // Internal fallback for the custom date range, matching PerformancePanel /\n // SignalsListPage so the time-range chips can become mutually exclusive with\n // a committed custom range.\n const [internalDateRange, setInternalDateRange] = React.useState(null);\n const effectiveDateRange = dateRange !== undefined ? dateRange : internalDateRange;\n const customRangeActive = !!(effectiveDateRange?.from && effectiveDateRange?.to);\n\n const handleDateRangeChange = (range) => {\n setInternalDateRange(range);\n onDateRangeChange?.(range);\n };\n const handleWindowChange = (id) => {\n setInternalDateRange(null);\n onDateRangeChange?.(null);\n onWindowChange?.(id);\n };\n\n const dateLabel = customRangeActive\n ? `${formatLocalDate(effectiveDateRange.from)} – ${formatLocalDate(effectiveDateRange.to)}`\n : dateRangeLabel || computeWindowLabel(selectedWindow);\n\n const [internalChartView, setInternalChartView] = React.useState(\n chartView ?? chartViewOptions[0]?.id ?? null,\n );\n const effectiveChartView = onChartViewChange ? chartView : internalChartView;\n const handleChartViewChange = (v) => {\n if (!onChartViewChange) setInternalChartView(v);\n onChartViewChange?.(v);\n };\n\n // Whether the previous-period line is drawn is driven by the option the\n // user picks. Each option in `chartViewOptions` may carry `showPrevious`;\n // missing or undefined falls back to true so the dual-series chart still\n // renders when the host hasn't customised the option set.\n const activeChartOption = chartViewOptions.find((o) => o.id === effectiveChartView);\n const showPreviousSeries =\n activeChartOption?.showPrevious === undefined\n ? true\n : !!activeChartOption.showPrevious;\n\n return (\n <div\n className={className}\n style={{\n background: C.white,\n fontFamily: FONT_DISPLAY,\n color: C.ink,\n width: \"100%\",\n minWidth: 1192,\n boxSizing: \"border-box\",\n padding: \"12px 32px 32px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 24,\n }}\n >\n {/* Header — back arrow + title + date controls + Export */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 16,\n paddingTop: 12,\n flexWrap: \"wrap\",\n }}\n >\n <button\n type=\"button\"\n aria-label=\"Back\"\n onClick={onBack}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 24,\n height: 24,\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n color: C.ink,\n padding: 0,\n flexShrink: 0,\n }}\n >\n <ArrowLeft size={20} strokeWidth={1.75} />\n </button>\n <div\n style={{\n flex: 1,\n minWidth: 0,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n paddingLeft: 16,\n borderLeft: `1px solid ${C.border}`,\n alignSelf: \"stretch\",\n justifyContent: \"center\",\n }}\n >\n <h1\n style={{\n fontFamily: FONT_DISPLAY,\n fontSize: 22,\n fontWeight: 500,\n color: C.ink,\n margin: 0,\n lineHeight: 1.2,\n letterSpacing: \"-0.01em\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n }}\n >\n {signalName}\n </h1>\n {signalSubtitle && (\n <span\n style={{ fontFamily: FONT_DISPLAY, fontSize: 12, color: C.muted, lineHeight: 1.2 }}\n >\n {signalSubtitle}\n </span>\n )}\n </div>\n <div style={{ display: \"flex\", gap: 10, alignItems: \"center\", flexWrap: \"wrap\" }}>\n {dateLabel && (\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n fontFamily: FONT_DISPLAY,\n fontSize: 13,\n color: C.ink,\n marginRight: 6,\n whiteSpace: \"nowrap\",\n }}\n >\n <CalendarDays size={16} strokeWidth={1.75} color={C.muted} />\n {dateLabel}\n </span>\n )}\n {rangeOptions.map((opt) => (\n <RangeChip\n key={opt.id}\n label={opt.label}\n active={!customRangeActive && opt.id === selectedWindow}\n onClick={() => handleWindowChange(opt.id)}\n />\n ))}\n {dateRangePicker ? (\n dateRangePicker\n ) : (\n <DateRangeButton value={effectiveDateRange} onChange={handleDateRangeChange} />\n )}\n {/*\n <button\n type=\"button\"\n onClick={() => onExport?.()}\n disabled={!onExport}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n height: 32,\n padding: \"0 16px\",\n borderRadius: 10,\n border: `1px solid ${C.neutralBorder}`,\n background: C.white,\n cursor: onExport ? \"pointer\" : \"not-allowed\",\n opacity: onExport ? 1 : 0.5,\n fontFamily: FONT_DISPLAY,\n fontSize: 14,\n color: C.neutral800,\n }}\n >\n <Download size={18} strokeWidth={1.75} />\n Export CSV\n </button>\n */}\n </div>\n </div>\n\n {/* KPI strip */}\n <div style={{ display: \"flex\", gap: 24, alignItems: \"stretch\" }}>\n <KpiCard\n value={fireRateStat.value}\n delta={fireRateStat.delta}\n label={fireRateStat.label}\n style={{ width: 272, flexShrink: 0 }}\n />\n <KpiCard\n value={fireCountStat.value}\n delta={fireCountStat.delta}\n label={fireCountStat.label}\n style={{ width: 272, flexShrink: 0 }}\n />\n <OutcomeCorrelationCard\n title={outcomeCorrelation.title}\n present={outcomeCorrelation.present}\n absent={outcomeCorrelation.absent}\n impact={outcomeCorrelation.impact}\n />\n </div>\n\n {/* Fire Rate Trend chart card */}\n <div\n style={{\n background: C.white,\n border: `1px solid ${C.border}`,\n borderRadius: 8,\n padding: 24,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 12 }}>\n <span\n style={{\n flex: 1,\n fontFamily: FONT_DISPLAY,\n fontSize: 14,\n fontWeight: 500,\n color: C.ink,\n lineHeight: 1.2,\n }}\n >\n {chartTitle}\n </span>\n {chartViewOptions.length > 0 && (\n <ViewBySelect\n value={effectiveChartView}\n options={chartViewOptions}\n onChange={handleChartViewChange}\n />\n )}\n </div>\n <FireRateTrendChart\n currentSeries={fireRateTrend.currentSeries || []}\n previousSeries={fireRateTrend.previousSeries || []}\n yLabels={chartYLabels}\n showPrevious={showPreviousSeries}\n legendCurrentLabel={chartLegendCurrentLabel}\n legendPreviousLabel={chartLegendPreviousLabel}\n />\n </div>\n\n {/* By Agent table — title overlaps DataTable2's toolbar (which already\n renders the Columns button) so the row reads as one in the design. */}\n <div style={{ position: \"relative\" }}>\n {agentBreakdownTitle && (\n <span\n style={{\n position: \"absolute\",\n top: 14,\n left: 4,\n zIndex: 40,\n fontFamily: FONT_DISPLAY,\n fontSize: 20,\n fontWeight: 500,\n color: C.ink,\n lineHeight: 1.2,\n letterSpacing: \"-0.01em\",\n pointerEvents: \"none\",\n }}\n >\n {agentBreakdownTitle}\n </span>\n )}\n <DataTable2\n data={agentBreakdownRows}\n columns={agentBreakdownColumns}\n initialPageSize={agentBreakdownInitialPageSize}\n onRowClick={onAgentClick}\n onVisibleColumnsChange={onAgentBreakdownVisibleColumnsChange}\n totalCount={agentBreakdownTotal}\n page={agentBreakdownPage}\n pageSize={agentBreakdownPageSize}\n onPageChange={onAgentBreakdownPageChange}\n onPageSizeChange={onAgentBreakdownPageSizeChange}\n />\n </div>\n\n {/* Co-occurring Signals */}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 16 }}>\n <SectionHeading icon={Share2} title={coOccurringTitle} />\n <TwoColumnList items={coOccurringItems} />\n </div>\n\n {/* Evidence Samples */}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 16 }}>\n <SectionHeading icon={FileText} title={evidenceTitle} />\n <TwoColumnList items={evidenceItems} />\n </div>\n\n {/* Recent Interactions table — same heading-overlap pattern as By Agent. */}\n <div style={{ position: \"relative\" }}>\n {recentInteractionsTitle && (\n <span\n style={{\n position: \"absolute\",\n top: 14,\n left: 0,\n zIndex: 40,\n fontFamily: FONT_DISPLAY,\n fontSize: 20,\n fontWeight: 600,\n color: C.ink,\n lineHeight: 1.2,\n letterSpacing: \"-0.01em\",\n pointerEvents: \"none\",\n }}\n >\n {recentInteractionsTitle}\n </span>\n )}\n <DataTable2\n data={recentInteractions}\n columns={recentInteractionColumns}\n initialPageSize={recentInteractionsInitialPageSize}\n onRowClick={onInteractionClick}\n onVisibleColumnsChange={onRecentInteractionsVisibleColumnsChange}\n totalCount={recentInteractionsTotal}\n page={recentInteractionsPage}\n pageSize={recentInteractionsPageSize}\n onPageChange={onRecentInteractionsPageChange}\n onPageSizeChange={onRecentInteractionsPageSizeChange}\n />\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { CalendarDays, Download } from \"lucide-react\";\nimport DataTable2 from \"../data/DataTable2\";\nimport { DateRangeButton } from \"../performance/PerformancePanel\";\nimport SignalDetailsPage from \"./SignalDetailsPage\";\n\nconst EMPTY_STAT = { value: \"\", label: \"\", trend: \"up\" };\n\nconst C = {\n ink: \"#2E3236\",\n muted: \"#808183\",\n border: \"#D9D9D9\",\n borderSubtle: \"#E6E6E6\",\n black: \"#0B0B0B\",\n white: \"#FFFFFF\",\n neutralBorder: \"#BFBFBF\",\n neutralLight: \"#E6E6E6\",\n neutral600: \"#676767\",\n neutral400: \"#989898\",\n fillTrack: \"#EFEFEF\",\n};\n\nconst FONT_DISPLAY = \"var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)\";\n\n// Sparkline shape lifted from PerformancePanel so this page stays\n// self-contained — the design uses the same KPI card visual.\nfunction Sparkline({ trend = \"up\", width = 49.618, height = 35 }) {\n const id = React.useId();\n const linePath =\n \"M1.00049 13.5213C7.85975 11.7032 8.88149 4.73912 13.7838 4.73912C19.8344 4.73912 23.6237 17.166 29.1281 17.166C34.5998 17.166 37.4149 4.88121 43.4004 8.61051C47.9764 11.4616 50.6186 1.00024 50.6186 1.00024\";\n const areaPath =\n \"M1.00049 16.692C8.88149 15.6975 8.88149 7.79403 13.7838 7.79403C19.8344 7.79403 23.6237 21.4034 29.1281 21.4034C34.5998 21.4034 37.4149 8.93821 43.4004 12.7223C47.9764 15.6152 50.6186 5.00024 50.6186 5.00024V36.0002C50.6186 36.0002 10.8223 36.0002 1.00049 36.0002C1.00049 28.8653 1.00049 19.4871 1.00049 16.692Z\";\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 52 36\"\n fill=\"none\"\n style={{\n flexShrink: 0,\n transform: trend === \"down\" ? \"scaleX(-1)\" : undefined,\n }}\n >\n <defs>\n <linearGradient\n id={`spark-${id}`}\n x1=\"9.96776\"\n y1=\"16.2053\"\n x2=\"9.96776\"\n y2=\"36.0002\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor={C.ink} />\n <stop offset=\"1\" stopColor={C.white} stopOpacity=\"0.01\" />\n </linearGradient>\n </defs>\n <path\n d={areaPath}\n fill={`url(#spark-${id})`}\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n opacity=\"0.1\"\n />\n <path\n d={linePath}\n stroke={C.ink}\n strokeWidth=\"2\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeDasharray={trend === \"down\" ? \"2 4\" : undefined}\n />\n </svg>\n );\n}\n\nfunction TrendArrow({ direction = \"up\", color = C.muted, size = 18 }) {\n const upPath =\n \"M12.4167 0.75H17.4167M17.4167 0.75V5.75M17.4167 0.75L10.3333 7.83333L6.16667 3.66667L0.75 9.08333\";\n const downPath =\n \"M12.4167 9.25H17.4167M17.4167 9.25V4.25M17.4167 9.25L10.3333 2.16667L6.16667 6.33333L0.75 0.91667\";\n return (\n <svg\n width={size}\n height={(size * 9.5) / 18}\n viewBox=\"0 0 19 10\"\n fill=\"none\"\n style={{ flexShrink: 0 }}\n >\n <path\n d={direction === \"up\" ? upPath : downPath}\n stroke={color}\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction StatCard({ value, label, trend = \"up\", style = {} }) {\n return (\n <div\n style={{\n background: C.white,\n border: `1px solid ${C.border}`,\n borderRadius: 8,\n padding: 16,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n boxSizing: \"border-box\",\n ...style,\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"flex-start\", justifyContent: \"space-between\" }}>\n <Sparkline trend={trend} />\n <TrendArrow direction={trend} />\n </div>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8, marginTop: 8 }}>\n <div\n style={{\n fontFamily: FONT_DISPLAY,\n fontSize: 28,\n fontWeight: 500,\n lineHeight: \"1.2\",\n color: C.ink,\n letterSpacing: \"-0.01em\",\n }}\n >\n {value}\n </div>\n <div style={{ fontFamily: FONT_DISPLAY, fontSize: 13, color: C.ink, lineHeight: \"1.2\" }}>\n {label}\n </div>\n </div>\n </div>\n );\n}\n\nfunction RangeChip({ label, active = false, onClick }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n style={{\n height: 32,\n minWidth: 31,\n padding: \"0 12px\",\n borderRadius: 10,\n border: active ? \"none\" : `1px solid ${C.borderSubtle}`,\n background: active ? C.black : C.white,\n color: active ? C.white : C.black,\n fontFamily: FONT_DISPLAY,\n fontSize: 14,\n cursor: \"pointer\",\n }}\n >\n {label}\n </button>\n );\n}\n\nconst DEFAULT_RANGE_OPTIONS = [\n { id: \"8h\", label: \"8h\" },\n { id: \"1d\", label: \"1d\" },\n { id: \"7d\", label: \"7d\" },\n { id: \"30d\", label: \"30d\" },\n];\n\nconst RANGE_TO_MS = {\n \"8h\": 8 * 60 * 60 * 1000,\n \"1d\": 24 * 60 * 60 * 1000,\n \"7d\": 7 * 24 * 60 * 60 * 1000,\n \"30d\": 30 * 24 * 60 * 60 * 1000,\n};\n\nfunction formatLocalDate(date) {\n return date.toLocaleDateString(\"en-US\", {\n month: \"2-digit\",\n day: \"2-digit\",\n year: \"numeric\",\n });\n}\n\nfunction computeWindowLabel(windowId) {\n const ms = RANGE_TO_MS[windowId];\n if (!ms) return \"\";\n const to = new Date();\n const from = new Date(to.getTime() - ms);\n return `${formatLocalDate(from)} – ${formatLocalDate(to)}`;\n}\n\n// Fire Rate progress bar — number on the left, fill bar on the right.\n// Accepts numeric percentage (0–100) or a string like \"25%\".\nfunction FireRateBar({ value }) {\n const num =\n typeof value === \"number\"\n ? value\n : parseFloat(String(value ?? \"\").replace(\"%\", \"\")) || 0;\n const pct = Math.max(0, Math.min(100, num));\n return (\n <span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 12, width: \"100%\" }}>\n <span style={{ minWidth: 32, color: C.ink, fontVariantNumeric: \"tabular-nums\" }}>\n {pct}%\n </span>\n <span\n style={{\n flex: 1,\n height: 4,\n background: C.fillTrack,\n borderRadius: 2,\n overflow: \"hidden\",\n minWidth: 40,\n maxWidth: 80,\n }}\n >\n <span\n style={{\n display: \"block\",\n width: `${pct}%`,\n height: \"100%\",\n background: C.black,\n borderRadius: 2,\n }}\n />\n </span>\n </span>\n );\n}\n\n// Delta cell — trend arrow + signed numeric value. Accepts a number or a\n// string like \"+0.2\" / \"-1.2\".\nfunction DeltaCell({ value }) {\n if (value == null || value === \"\") return null;\n const num =\n typeof value === \"number\" ? value : parseFloat(String(value).replace(/[^-\\d.]/g, \"\"));\n const isFinite = Number.isFinite(num);\n const up = !isFinite || num >= 0;\n const display =\n typeof value === \"string\"\n ? value\n : isFinite\n ? `${num >= 0 ? \"+\" : \"\"}${num.toFixed(1)}`\n : String(value);\n return (\n <span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 6 }}>\n <TrendArrow direction={up ? \"up\" : \"down\"} color={C.ink} size={16} />\n <span style={{ fontVariantNumeric: \"tabular-nums\" }}>{display}</span>\n </span>\n );\n}\n\n// Signed numeric (no arrow) — used for Compass Score in this design.\nfunction SignedNumber({ value }) {\n if (value == null || value === \"\") return null;\n const num =\n typeof value === \"number\" ? value : parseFloat(String(value).replace(/[^-\\d.]/g, \"\"));\n if (!Number.isFinite(num)) return <span>{String(value)}</span>;\n const sign = num >= 0 ? \"+\" : \"\";\n const display = typeof value === \"string\" && /^[+-]/.test(value) ? value : `${sign}${num}`;\n return <span style={{ fontVariantNumeric: \"tabular-nums\" }}>{display}</span>;\n}\n\nexport const DEFAULT_SIGNAL_COLUMNS = [\n { id: \"signal\", label: \"Signals\", width: 250, sortable: true, filterable: true },\n {\n id: \"fireRate\",\n label: \"Fire Rate\",\n width: 140,\n sortable: true,\n filterable: true,\n filterType: \"number\",\n render: (value) => <FireRateBar value={value} />,\n },\n {\n id: \"fires\",\n label: \"Fires\",\n width: 140,\n sortable: true,\n filterable: true,\n filterType: \"number\",\n },\n {\n id: \"delta\",\n label: \"Delta\",\n width: 140,\n sortable: true,\n filterable: true,\n filterType: \"number\",\n render: (value) => <DeltaCell value={value} />,\n },\n {\n id: \"avgStrength\",\n label: \"Avg Strength\",\n width: 140,\n sortable: true,\n filterable: true,\n filterType: \"number\",\n },\n {\n id: \"compass\",\n label: \"Agent Lift\",\n width: 140,\n sortable: true,\n filterable: true,\n filterType: \"number\",\n render: (value) => <SignedNumber value={value} />,\n },\n { id: \"topAgent\", label: \"Top Agent\", width: 178, sortable: true, filterable: true },\n];\n\nexport default function SignalsListPage({\n className = \"\",\n // Header\n title = \"\",\n dateRangeLabel = \"\",\n // KPI strip\n totalInteractionsStat = EMPTY_STAT,\n activeSignalsStat = EMPTY_STAT,\n // Table section heading — e.g. \"80 Active Signals\". When omitted, the\n // component derives a label from `activeSignalsStat.value`.\n activeSignalsHeading = \"\",\n // Time-range chips (8h / 1d / 7d / 30d). Override `rangeOptions` to customize.\n // `selectedWindow` is the currently-active option id; `onWindowChange(id)`\n // fires when the user picks a new chip.\n rangeOptions = DEFAULT_RANGE_OPTIONS,\n selectedWindow = \"30d\",\n onWindowChange,\n // Host-provided date-range picker node. Should render its own trigger button\n // and popover. When provided, replaces the built-in default picker.\n dateRangePicker,\n // Used by the built-in default picker when `dateRangePicker` is not provided.\n // `dateRange` is `{ from, to }` (Date objects); `onDateRangeChange` receives\n // the same shape when the user clicks Apply.\n dateRange,\n onDateRangeChange,\n // Table data\n signals = [],\n signalColumns = DEFAULT_SIGNAL_COLUMNS,\n initialPageSize = 10,\n onSignalClick,\n onVisibleColumnsChange,\n // Server-side pagination (optional pass-through to DataTable2).\n signalsTotal = null,\n signalsPage = null,\n signalsPageSize = null,\n onSignalsPageChange,\n onSignalsPageSizeChange,\n // Export button\n onExport,\n // Labels used by the auto-drill-down (when the host doesn't supply\n // `onSignalClick`). Empty by default so host apps don't see demo copy.\n fireRateStatLabel = \"\",\n fireCountStatLabel = \"\",\n}) {\n // Internal fallback for the custom date range when the host doesn't pass\n // `dateRange` / `onDateRangeChange`. Lifted here so the time-range chips can\n // become mutually exclusive with a committed custom range — same pattern as\n // PerformancePanel.\n const [internalDateRange, setInternalDateRange] = React.useState(null);\n const effectiveDateRange = dateRange !== undefined ? dateRange : internalDateRange;\n const customRangeActive = !!(effectiveDateRange?.from && effectiveDateRange?.to);\n\n const handleDateRangeChange = (range) => {\n setInternalDateRange(range);\n onDateRangeChange?.(range);\n };\n const handleWindowChange = (id) => {\n // Picking a chip cancels any active custom range so only one mode is\n // highlighted at a time.\n setInternalDateRange(null);\n onDateRangeChange?.(null);\n onWindowChange?.(id);\n };\n\n // Heading label: prefer the explicit override, otherwise compose from the\n // KPI value + label the host passed. Stays empty when neither is provided.\n const headingLabel =\n activeSignalsHeading ||\n (activeSignalsStat.value !== \"\" && activeSignalsStat.value != null\n ? `${activeSignalsStat.value} ${activeSignalsStat.label || \"\"}`.trim()\n : \"\");\n\n const dateLabel = customRangeActive\n ? `${formatLocalDate(effectiveDateRange.from)} – ${formatLocalDate(effectiveDateRange.to)}`\n : dateRangeLabel || computeWindowLabel(selectedWindow);\n\n // Drill-down state — when a row is clicked we surface SignalDetailsPage on\n // top of the list. If the host passes `onSignalClick` they own navigation\n // and we don't open the internal panel.\n const [selectedSignal, setSelectedSignal] = React.useState(null);\n const handleRowClick = (row) => {\n if (onSignalClick) {\n onSignalClick(row);\n return;\n }\n setSelectedSignal(row);\n };\n\n // Map a list row to the details-page KPI shape. The list only knows a\n // handful of fields, so the details panel mostly renders empty until the\n // host wires real data via onSignalClick — but at least the headline KPIs\n // and the signal name carry across so the drill-down feels continuous.\n const detailsProps = selectedSignal\n ? {\n signalName: selectedSignal.signal ?? \"\",\n fireRateStat: {\n value:\n selectedSignal.fireRate != null && selectedSignal.fireRate !== \"\"\n ? `${selectedSignal.fireRate}%`\n : \"\",\n delta: selectedSignal.delta ?? \"\",\n label: fireRateStatLabel,\n },\n fireCountStat: {\n value:\n typeof selectedSignal.fires === \"number\"\n ? selectedSignal.fires.toLocaleString()\n : selectedSignal.fires ?? \"\",\n delta: \"\",\n label: fireCountStatLabel,\n },\n selectedWindow,\n onWindowChange,\n dateRange: effectiveDateRange,\n onDateRangeChange: handleDateRangeChange,\n rangeOptions,\n dateRangePicker,\n onExport,\n }\n : null;\n\n return (\n <>\n {selectedSignal && (\n <SignalDetailsPage\n className={className}\n {...detailsProps}\n onBack={() => setSelectedSignal(null)}\n />\n )}\n <div\n className={className}\n style={{\n background: C.white,\n fontFamily: FONT_DISPLAY,\n color: C.ink,\n width: \"100%\",\n minWidth: 1192,\n boxSizing: \"border-box\",\n padding: \"12px 32px 32px\",\n flexDirection: \"column\",\n gap: 24,\n // Hide (don't unmount) while drilling into a signal so DataTable2's\n // internal filter / sort / pagination state survives the round trip.\n display: selectedSignal ? \"none\" : \"flex\",\n }}\n >\n {/* Header row — title on the left, date controls + export on the right. */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 16,\n paddingTop: 12,\n flexWrap: \"wrap\",\n }}\n >\n <h1\n style={{\n fontFamily: FONT_DISPLAY,\n fontSize: 24,\n fontWeight: 500,\n color: C.ink,\n margin: 0,\n lineHeight: \"1.2\",\n letterSpacing: \"-0.01em\",\n flex: 1,\n minWidth: 0,\n }}\n >\n {title}\n </h1>\n <div style={{ display: \"flex\", gap: 10, alignItems: \"center\", flexWrap: \"wrap\" }}>\n {dateLabel && (\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n fontFamily: FONT_DISPLAY,\n fontSize: 13,\n color: C.ink,\n marginRight: 6,\n whiteSpace: \"nowrap\",\n }}\n >\n <CalendarDays size={16} strokeWidth={1.75} color={C.muted} />\n {dateLabel}\n </span>\n )}\n {rangeOptions.map((opt) => (\n <RangeChip\n key={opt.id}\n label={opt.label}\n active={!customRangeActive && opt.id === selectedWindow}\n onClick={() => handleWindowChange(opt.id)}\n />\n ))}\n {dateRangePicker ? (\n dateRangePicker\n ) : (\n <DateRangeButton value={effectiveDateRange} onChange={handleDateRangeChange} />\n )}\n {/*\n <button\n type=\"button\"\n onClick={() => onExport?.()}\n disabled={!onExport}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n height: 32,\n padding: \"0 16px\",\n borderRadius: 10,\n border: `1px solid ${C.neutralBorder}`,\n background: C.white,\n cursor: onExport ? \"pointer\" : \"not-allowed\",\n opacity: onExport ? 1 : 0.5,\n fontFamily: FONT_DISPLAY,\n fontSize: 14,\n color: \"#323232\",\n }}\n >\n <Download size={18} strokeWidth={1.75} />\n Export CSV\n </button>\n */}\n </div>\n </div>\n\n {/* KPI strip — two stat cards anchored to the left of the row. */}\n <div style={{ display: \"flex\", gap: 24 }}>\n <StatCard\n value={totalInteractionsStat.value}\n label={totalInteractionsStat.label}\n trend={totalInteractionsStat.trend}\n style={{ width: 264, flexShrink: 0 }}\n />\n <StatCard\n value={activeSignalsStat.value}\n label={activeSignalsStat.label}\n trend={activeSignalsStat.trend}\n style={{ width: 264, flexShrink: 0 }}\n />\n </div>\n\n {/* Table section. The heading sits on the same row as DataTable2's\n built-in toolbar (which renders the Columns button on the right),\n matching the Figma layout. Absolute positioning lets the heading\n overlap DataTable2's sticky toolbar without restructuring it. */}\n <div\n style={{\n position: \"relative\",\n paddingTop: 8,\n borderTop: `1px solid ${C.border}`,\n }}\n >\n {headingLabel && (\n <span\n style={{\n position: \"absolute\",\n top: 24,\n left: 0,\n zIndex: 40,\n fontFamily: FONT_DISPLAY,\n fontSize: 14,\n color: C.ink,\n fontWeight: 500,\n lineHeight: 1.2,\n pointerEvents: \"none\",\n }}\n >\n {headingLabel}\n </span>\n )}\n\n <DataTable2\n data={signals}\n columns={signalColumns}\n initialPageSize={initialPageSize}\n onRowClick={handleRowClick}\n onVisibleColumnsChange={onVisibleColumnsChange}\n totalCount={signalsTotal}\n page={signalsPage}\n pageSize={signalsPageSize}\n onPageChange={onSignalsPageChange}\n onPageSizeChange={onSignalsPageSizeChange}\n />\n </div>\n </div>\n </>\n );\n}\n"],"names":["C","FONT_DISPLAY","formatLocalDate","date","parsed","DEFAULT_RANGE_OPTIONS","RANGE_TO_MS","computeWindowLabel","windowId","ms","to","from","RangeChip","label","active","onClick","jsx","KpiCard","value","delta","style","jsxs","OutcomeCorrelationCard","title","present","absent","impact","OutcomeCell","caption","sub","ViewBySelect","options","onChange","open","setOpen","React","triggerRef","popoverRef","handler","e","_a","_b","selected","o","v","ChevronDown","opt","isSelected","Check","FireRateTrendChart","currentSeries","previousSeries","yLabels","height","showPrevious","legendCurrentLabel","legendPreviousLabel","innerHeight","PADDING_LEFT","PADDING_RIGHT","viewWidth","innerWidth","allValues","yMin","yMax","ySpan","sy","y","seriesToPath","series","step","i","currentPath","previousPath","dots","l","yPos","p","SectionHeading","Icon","count","PercentRow","TwoColumnList","items","half","left","right","row","CompassDots","max","full","hasPartial","_","DEFAULT_AGENT_BREAKDOWN_COLUMNS","DEFAULT_RECENT_INTERACTION_COLUMNS","num","SignalDetailsPage","className","signalName","signalSubtitle","onBack","dateRangeLabel","rangeOptions","selectedWindow","onWindowChange","dateRangePicker","dateRange","onDateRangeChange","onExport","fireRateStat","fireCountStat","outcomeCorrelation","chartTitle","chartLegendCurrentLabel","chartLegendPreviousLabel","chartYLabels","fireRateTrend","chartViewOptions","chartView","onChartViewChange","agentBreakdownRows","agentBreakdownColumns","agentBreakdownTitle","onAgentClick","onAgentBreakdownVisibleColumnsChange","agentBreakdownInitialPageSize","coOccurringTitle","coOccurringItems","evidenceTitle","evidenceItems","recentInteractions","recentInteractionColumns","recentInteractionsTitle","onInteractionClick","onRecentInteractionsVisibleColumnsChange","recentInteractionsInitialPageSize","agentBreakdownTotal","agentBreakdownPage","agentBreakdownPageSize","onAgentBreakdownPageChange","onAgentBreakdownPageSizeChange","recentInteractionsTotal","recentInteractionsPage","recentInteractionsPageSize","onRecentInteractionsPageChange","onRecentInteractionsPageSizeChange","internalDateRange","setInternalDateRange","effectiveDateRange","customRangeActive","handleDateRangeChange","range","handleWindowChange","id","dateLabel","internalChartView","setInternalChartView","effectiveChartView","handleChartViewChange","activeChartOption","showPreviousSeries","ArrowLeft","CalendarDays","DateRangeButton","DataTable2","Share2","FileText","EMPTY_STAT","Sparkline","trend","width","linePath","areaPath","TrendArrow","direction","color","size","upPath","downPath","StatCard","FireRateBar","pct","DeltaCell","isFinite","up","display","SignedNumber","sign","DEFAULT_SIGNAL_COLUMNS","SignalsListPage","totalInteractionsStat","activeSignalsStat","activeSignalsHeading","signals","signalColumns","initialPageSize","onSignalClick","onVisibleColumnsChange","signalsTotal","signalsPage","signalsPageSize","onSignalsPageChange","onSignalsPageSizeChange","fireRateStatLabel","fireCountStatLabel","headingLabel","selectedSignal","setSelectedSignal","handleRowClick","detailsProps","Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Signals.cjs.js","sources":["../../src/components/Signals/SignalDetailsPage.jsx","../../src/components/Signals/SignalsListPage.jsx"],"sourcesContent":["\"use client\";\n\nimport React from \"react\";\nimport {\n ArrowLeft,\n CalendarDays,\n ChevronDown,\n Check,\n Download,\n Share2,\n FileText,\n} from \"lucide-react\";\nimport DataTable2 from \"../data/DataTable2\";\nimport { DateRangeButton } from \"../performance/PerformancePanel\";\nimport { computeWindowLabel, formatLocalDate } from \"../performance/performanceRangeFormat\";\n\nconst C = {\n ink: \"#2E3236\",\n muted: \"#808183\",\n border: \"#D9D9D9\",\n borderSubtle: \"#E6E6E6\",\n black: \"#0B0B0B\",\n white: \"#FFFFFF\",\n neutralBorder: \"#BFBFBF\",\n neutralLight: \"#E6E6E6\",\n neutral800: \"#323232\",\n neutral600: \"#676767\",\n neutral400: \"#989898\",\n fillTrack: \"#EFEFEF\",\n beige: \"rgba(243, 241, 229, 0.4)\",\n};\n\nconst FONT_DISPLAY = \"var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)\";\n\nconst DEFAULT_RANGE_OPTIONS = [\n { id: \"8h\", label: \"8h\" },\n { id: \"1d\", label: \"1d\" },\n { id: \"7d\", label: \"7d\" },\n { id: \"30d\", label: \"30d\" },\n];\n\nfunction RangeChip({ label, active = false, onClick }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n style={{\n height: 32,\n minWidth: 31,\n padding: \"0 12px\",\n borderRadius: 10,\n border: active ? \"none\" : `1px solid ${C.borderSubtle}`,\n background: active ? C.black : C.white,\n color: active ? C.white : C.black,\n fontFamily: FONT_DISPLAY,\n fontSize: 14,\n cursor: \"pointer\",\n }}\n >\n {label}\n </button>\n );\n}\n\n// KPI card that mirrors the Figma \"Total Calls\" tile: a large value, a small\n// muted delta hint inline to the right, and a label underneath.\nfunction KpiCard({ value, delta, label, style = {} }) {\n return (\n <div\n style={{\n background: C.white,\n border: `1px solid ${C.border}`,\n borderRadius: 8,\n padding: 16,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n boxSizing: \"border-box\",\n ...style,\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"baseline\", gap: 8, minHeight: 36 }}>\n <span\n style={{\n fontFamily: FONT_DISPLAY,\n fontSize: 28,\n fontWeight: 500,\n color: C.ink,\n letterSpacing: \"-0.01em\",\n lineHeight: 1.1,\n }}\n >\n {value}\n </span>\n {delta != null && delta !== \"\" && (\n <span\n style={{\n fontFamily: FONT_DISPLAY,\n fontSize: 12,\n fontWeight: 500,\n color: C.muted,\n whiteSpace: \"nowrap\",\n }}\n >\n {delta}\n </span>\n )}\n </div>\n <span style={{ fontFamily: FONT_DISPLAY, fontSize: 13, color: C.ink, lineHeight: 1.2 }}>\n {label}\n </span>\n </div>\n );\n}\n\n// Triple sub-card for the \"Outcome Correlation\" tile. Each cell shows a primary\n// value plus a two-line caption. All labels are host-provided so the library\n// stays free of demo copy.\nfunction OutcomeCorrelationCard({\n title = \"\",\n present = { value: \"\", caption: \"\", sub: \"\" },\n absent = { value: \"\", caption: \"\", sub: \"\" },\n impact = { value: \"\", caption: \"\", sub: \"\" },\n style = {},\n}) {\n return (\n <div\n style={{\n flex: 1,\n background: C.beige,\n border: `1px solid ${C.border}`,\n borderRadius: 8,\n padding: 16,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 12,\n boxSizing: \"border-box\",\n minWidth: 0,\n ...style,\n }}\n >\n <span\n style={{\n fontFamily: FONT_DISPLAY,\n fontSize: 13,\n fontWeight: 500,\n color: C.ink,\n lineHeight: 1.2,\n }}\n >\n {title}\n </span>\n <div style={{ display: \"flex\", alignItems: \"stretch\", gap: 24, minWidth: 0 }}>\n <OutcomeCell {...present} />\n <OutcomeCell {...absent} />\n <OutcomeCell {...impact} />\n </div>\n </div>\n );\n}\n\nfunction OutcomeCell({ value, caption, sub }) {\n return (\n <div\n style={{\n flex: 1,\n minWidth: 0,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n }}\n >\n <span\n style={{\n fontFamily: FONT_DISPLAY,\n fontSize: 22,\n fontWeight: 500,\n color: C.muted,\n letterSpacing: \"-0.01em\",\n lineHeight: 1.1,\n }}\n >\n {value}\n </span>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n <span style={{ fontFamily: FONT_DISPLAY, fontSize: 12, color: C.ink, lineHeight: 1.2 }}>\n {caption}\n </span>\n {sub && (\n <span\n style={{ fontFamily: FONT_DISPLAY, fontSize: 12, color: C.neutral600, lineHeight: 1.2 }}\n >\n {sub}\n </span>\n )}\n </div>\n </div>\n );\n}\n\n// Dropdown used by the Fire Rate Trend chart card to pick a comparison view.\n// Matches the View-By pattern from PerformancePanel (anchored popover).\nfunction ViewBySelect({ value, options = [], onChange }) {\n const [open, setOpen] = React.useState(false);\n const triggerRef = React.useRef(null);\n const popoverRef = React.useRef(null);\n React.useEffect(() => {\n if (!open) return;\n const handler = (e) => {\n if (\n popoverRef.current?.contains(e.target) ||\n triggerRef.current?.contains(e.target)\n ) {\n return;\n }\n setOpen(false);\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [open]);\n const selected = options.find((o) => o.id === value) || options[0];\n return (\n <div style={{ position: \"relative\" }}>\n <button\n type=\"button\"\n ref={triggerRef}\n onClick={() => setOpen((v) => !v)}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n height: 24,\n padding: \"0 8px 0 0\",\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n fontFamily: FONT_DISPLAY,\n fontSize: 12,\n color: C.ink,\n }}\n >\n {selected?.label}\n <ChevronDown\n size={14}\n strokeWidth={1.75}\n style={{ transform: open ? \"rotate(180deg)\" : \"none\", transition: \"transform 120ms ease\" }}\n />\n </button>\n {open && (\n <div\n ref={popoverRef}\n role=\"listbox\"\n style={{\n position: \"absolute\",\n top: 28,\n right: 0,\n zIndex: 30,\n background: C.white,\n border: `1px solid ${C.border}`,\n borderRadius: 8,\n boxShadow: \"0 8px 24px rgba(11, 11, 11, 0.12)\",\n minWidth: 200,\n padding: 4,\n fontFamily: FONT_DISPLAY,\n }}\n >\n {options.map((opt) => {\n const isSelected = opt.id === value;\n return (\n <button\n key={opt.id}\n type=\"button\"\n role=\"option\"\n aria-selected={isSelected}\n onClick={() => {\n onChange?.(opt.id);\n setOpen(false);\n }}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n width: \"100%\",\n padding: \"8px 10px\",\n border: \"none\",\n background: isSelected ? C.borderSubtle : \"transparent\",\n cursor: \"pointer\",\n textAlign: \"left\",\n fontFamily: FONT_DISPLAY,\n fontSize: 13,\n color: C.ink,\n borderRadius: 6,\n }}\n >\n {isSelected ? (\n <Check size={16} color={C.ink} strokeWidth={1.75} />\n ) : (\n <span style={{ width: 16 }} />\n )}\n <span>{opt.label}</span>\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n\n// Two-series line chart (current + previous period). Series points are arrays\n// of y-numbers, equally spaced across the x-axis. The previous series is\n// rendered dashed; current is solid.\nfunction FireRateTrendChart({\n currentSeries = [],\n previousSeries = [],\n yLabels = [],\n height = 176,\n showPrevious = true,\n legendCurrentLabel = \"\",\n legendPreviousLabel = \"\",\n}) {\n const innerHeight = height - 8;\n const PADDING_LEFT = 32;\n const PADDING_RIGHT = 8;\n const viewWidth = 1080;\n const innerWidth = viewWidth - PADDING_LEFT - PADDING_RIGHT;\n\n const allValues = [...currentSeries, ...(showPrevious ? previousSeries : [])];\n const hasData = allValues.length > 0;\n if (!hasData) {\n return (\n <div\n style={{\n height,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontFamily: FONT_DISPLAY,\n fontSize: 12,\n color: C.muted,\n }}\n >\n No data\n </div>\n );\n }\n\n const yMin = Math.min(...allValues, 0);\n const yMax = Math.max(...allValues, 1);\n const ySpan = yMax - yMin || 1;\n const sy = (y) => 12 + ((yMax - y) / ySpan) * (innerHeight - 24);\n const seriesToPath = (series) => {\n if (!series.length) return \"\";\n const step = series.length > 1 ? innerWidth / (series.length - 1) : 0;\n return series\n .map((y, i) => `${i === 0 ? \"M\" : \"L\"}${PADDING_LEFT + i * step},${sy(y)}`)\n .join(\" \");\n };\n\n const currentPath = seriesToPath(currentSeries);\n const previousPath = showPrevious ? seriesToPath(previousSeries) : \"\";\n\n const dots = (series) =>\n series.map((y, i) => {\n const step = series.length > 1 ? innerWidth / (series.length - 1) : 0;\n return { x: PADDING_LEFT + i * step, y: sy(y) };\n });\n\n return (\n <div style={{ width: \"100%\" }}>\n <svg\n width=\"100%\"\n height={height}\n viewBox={`0 0 ${viewWidth} ${height}`}\n preserveAspectRatio=\"none\"\n >\n {/* y-axis labels (top / middle / bottom) */}\n {yLabels.map((l, i) => {\n const yPos =\n 12 + (i / Math.max(1, yLabels.length - 1)) * (innerHeight - 24);\n return (\n <text\n key={l + i}\n x={0}\n y={yPos + 3}\n fontFamily={FONT_DISPLAY}\n fontSize=\"10\"\n fill={C.neutral800}\n >\n {l}\n </text>\n );\n })}\n {/* baseline */}\n <line\n x1={PADDING_LEFT}\n y1={innerHeight}\n x2={viewWidth - PADDING_RIGHT}\n y2={innerHeight}\n stroke={C.border}\n strokeWidth=\"1\"\n />\n {/* faint grid lines at top + middle */}\n <line\n x1={PADDING_LEFT}\n y1={12}\n x2={viewWidth - PADDING_RIGHT}\n y2={12}\n stroke={C.borderSubtle}\n strokeDasharray=\"2 4\"\n strokeWidth=\"1\"\n />\n {previousPath && (\n <path\n d={previousPath}\n stroke={C.neutral400}\n strokeWidth=\"1.5\"\n strokeDasharray=\"4 4\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n )}\n {currentPath && (\n <path\n d={currentPath}\n stroke={C.black}\n strokeWidth=\"1.5\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n )}\n {/* markers */}\n {showPrevious &&\n dots(previousSeries).map((p, i) => (\n <circle\n key={`prev-${i}`}\n cx={p.x}\n cy={p.y}\n r={3}\n fill={C.white}\n stroke={C.neutral400}\n strokeWidth=\"1.5\"\n />\n ))}\n {dots(currentSeries).map((p, i) => (\n <circle\n key={`cur-${i}`}\n cx={p.x}\n cy={p.y}\n r={3}\n fill={C.white}\n stroke={C.black}\n strokeWidth=\"1.5\"\n />\n ))}\n </svg>\n {/* Legend — only renders when the host provides labels for the series. */}\n {(legendCurrentLabel || (showPrevious && legendPreviousLabel)) && (\n <div\n style={{\n display: \"flex\",\n justifyContent: \"center\",\n gap: 24,\n marginTop: 8,\n fontFamily: FONT_DISPLAY,\n fontSize: 11,\n color: C.ink,\n }}\n >\n {legendCurrentLabel && (\n <span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 6 }}>\n <span style={{ width: 20, height: 0, borderTop: `2px solid ${C.black}` }} />\n {legendCurrentLabel}\n </span>\n )}\n {showPrevious && legendPreviousLabel && (\n <span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 6 }}>\n <span\n style={{\n width: 20,\n height: 0,\n borderTop: `2px dashed ${C.neutral400}`,\n }}\n />\n {legendPreviousLabel}\n </span>\n )}\n </div>\n )}\n </div>\n );\n}\n\n// Section heading: small icon-in-circle on the left, bold title, optional\n// trailing count badge on the right, and a hairline bottom divider. Used for\n// \"Co-occurring Signals\" and \"Evidence Samples\" — the same shape repeats in\n// both (matches Figma node 4010:1423).\nfunction SectionHeading({ icon: Icon, title, count }) {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 16,\n width: \"100%\",\n paddingBottom: 16,\n borderBottom: `1px solid ${C.border}`,\n }}\n >\n <div\n style={{\n width: 34,\n height: 34,\n borderRadius: 9999,\n background: \"#F3F7F7\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n <Icon size={20} color={C.ink} strokeWidth={1.75} />\n </div>\n <span\n style={{\n flex: 1,\n fontFamily: FONT_DISPLAY,\n fontWeight: 700,\n fontSize: 16,\n color: C.ink,\n lineHeight: 1.2,\n }}\n >\n {title}\n </span>\n {count != null && count !== \"\" && (\n <span\n style={{\n fontFamily: FONT_DISPLAY,\n fontSize: 13,\n color: C.muted,\n }}\n >\n {count}\n </span>\n )}\n </div>\n );\n}\n\n// Two-column list row: label on the left, value (or rate) on the right.\n// Used inside the Co-occurring Signals / Evidence Samples panels.\nfunction PercentRow({ label, value }) {\n return (\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n padding: \"10px 0\",\n borderBottom: `1px solid ${C.border}`,\n fontFamily: FONT_DISPLAY,\n fontSize: 13,\n lineHeight: 1.4,\n gap: 16,\n }}\n >\n <span style={{ color: C.ink, minWidth: 0, overflow: \"hidden\", textOverflow: \"ellipsis\" }}>\n {label}\n </span>\n <span style={{ color: C.muted, whiteSpace: \"nowrap\" }}>{value}</span>\n </div>\n );\n}\n\nfunction TwoColumnList({ items = [] }) {\n if (!items.length) {\n return (\n <div\n style={{ padding: \"12px 0\", fontFamily: FONT_DISPLAY, fontSize: 13, color: C.muted }}\n >\n No items available.\n </div>\n );\n }\n const half = Math.ceil(items.length / 2);\n const left = items.slice(0, half);\n const right = items.slice(half);\n return (\n <div style={{ display: \"flex\", gap: 24 }}>\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\" }}>\n {left.map((row, i) => (\n <PercentRow key={`l-${i}`} {...row} />\n ))}\n </div>\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\" }}>\n {right.map((row, i) => (\n <PercentRow key={`r-${i}`} {...row} />\n ))}\n </div>\n </div>\n );\n}\n\n// Compass score dot rating used in the Recent Interactions table.\nfunction CompassDots({ value = 0, max = 5 }) {\n const v = typeof value === \"number\" ? value : parseFloat(value) || 0;\n const full = Math.floor(v);\n const hasPartial = v % 1 > 0 && full < max;\n return (\n <div style={{ display: \"inline-flex\", gap: 4 }}>\n {Array.from({ length: max }).map((_, i) => {\n if (i < full) {\n return (\n <span\n key={i}\n style={{ width: 10, height: 10, borderRadius: \"50%\", background: C.black }}\n />\n );\n }\n if (i === full && hasPartial) {\n return (\n <span\n key={i}\n style={{\n width: 10,\n height: 10,\n borderRadius: \"50%\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <span style={{ width: 6, height: 6, borderRadius: \"50%\", background: C.black }} />\n </span>\n );\n }\n return (\n <span\n key={i}\n style={{\n width: 10,\n height: 10,\n borderRadius: \"50%\",\n background: C.white,\n border: `1px solid ${C.border}`,\n boxSizing: \"border-box\",\n }}\n />\n );\n })}\n </div>\n );\n}\n\nexport const DEFAULT_AGENT_BREAKDOWN_COLUMNS = [\n { id: \"agent\", label: \"Agent\", width: 250, sortable: true, filterable: true },\n {\n id: \"fireCount\",\n label: \"Fire Count\",\n width: 174,\n sortable: true,\n filterable: true,\n filterType: \"number\",\n },\n {\n id: \"totalCalls\",\n label: \"Total Calls\",\n width: 181,\n sortable: true,\n filterable: true,\n filterType: \"number\",\n },\n {\n id: \"rate\",\n label: \"Rate\",\n width: 183,\n sortable: true,\n filterable: true,\n filterType: \"number\",\n },\n {\n id: \"avgStrength\",\n label: \"Avg Strength\",\n width: 172,\n sortable: true,\n filterable: true,\n filterType: \"number\",\n },\n];\n\nexport const DEFAULT_RECENT_INTERACTION_COLUMNS = [\n { id: \"dateTime\", label: \"Date & Time\", width: 212, sortable: true },\n { id: \"agent\", label: \"Agent\", width: 224, sortable: true, filterable: true },\n { id: \"title\", label: \"Title\", width: 298, sortable: true, filterable: true },\n {\n id: \"strength\",\n label: \"Strength\",\n width: 172,\n sortable: true,\n filterable: true,\n filterType: \"number\",\n },\n {\n id: \"compass\",\n label: \"Compass Score\",\n width: 183,\n sortable: true,\n filterable: true,\n filterType: \"number\",\n render: (value) => {\n const num = typeof value === \"number\" ? value : parseFloat(value) || 0;\n return (\n <span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 12 }}>\n <span style={{ minWidth: 32 }}>{value}</span>\n <CompassDots value={num} />\n </span>\n );\n },\n },\n];\n\nexport default function SignalDetailsPage({\n className = \"\",\n // Header\n signalName = \"\",\n signalSubtitle = \"\",\n onBack,\n // Date controls\n dateRangeLabel = \"\",\n rangeOptions = DEFAULT_RANGE_OPTIONS,\n selectedWindow = \"30d\",\n onWindowChange,\n dateRangePicker,\n dateRange,\n onDateRangeChange,\n onExport,\n // KPI strip — primary tiles\n fireRateStat = { value: \"\", delta: \"\", label: \"\" },\n fireCountStat = { value: \"\", delta: \"\", label: \"\" },\n // Outcome correlation tile (3 sub-cells)\n outcomeCorrelation = {\n title: \"\",\n present: { value: \"\", caption: \"\", sub: \"\" },\n absent: { value: \"\", caption: \"\", sub: \"\" },\n impact: { value: \"\", caption: \"\", sub: \"\" },\n },\n // Fire Rate Trend chart\n chartTitle = \"\",\n chartLegendCurrentLabel = \"\",\n chartLegendPreviousLabel = \"\",\n chartYLabels = [],\n fireRateTrend = { currentSeries: [], previousSeries: [] },\n chartViewOptions = [],\n chartView,\n onChartViewChange,\n // Agent breakdown table\n agentBreakdownRows = [],\n agentBreakdownColumns = DEFAULT_AGENT_BREAKDOWN_COLUMNS,\n agentBreakdownTitle = \"\",\n onAgentClick,\n onAgentBreakdownVisibleColumnsChange,\n agentBreakdownInitialPageSize = 10,\n // Co-occurring signals\n coOccurringTitle = \"\",\n coOccurringItems = [],\n // Evidence samples\n evidenceTitle = \"\",\n evidenceItems = [],\n // Recent interactions table\n recentInteractions = [],\n recentInteractionColumns = DEFAULT_RECENT_INTERACTION_COLUMNS,\n recentInteractionsTitle = \"\",\n onInteractionClick,\n onRecentInteractionsVisibleColumnsChange,\n recentInteractionsInitialPageSize = 10,\n // Server-side pagination pass-through for both tables (optional).\n agentBreakdownTotal = null,\n agentBreakdownPage = null,\n agentBreakdownPageSize = null,\n onAgentBreakdownPageChange,\n onAgentBreakdownPageSizeChange,\n recentInteractionsTotal = null,\n recentInteractionsPage = null,\n recentInteractionsPageSize = null,\n onRecentInteractionsPageChange,\n onRecentInteractionsPageSizeChange,\n}) {\n // Internal fallback for the custom date range, matching PerformancePanel /\n // SignalsListPage so the time-range chips can become mutually exclusive with\n // a committed custom range.\n const [internalDateRange, setInternalDateRange] = React.useState(null);\n const effectiveDateRange = dateRange !== undefined ? dateRange : internalDateRange;\n const customRangeActive = !!(effectiveDateRange?.from && effectiveDateRange?.to);\n\n const handleDateRangeChange = (range) => {\n setInternalDateRange(range);\n onDateRangeChange?.(range);\n };\n const handleWindowChange = (id) => {\n setInternalDateRange(null);\n onDateRangeChange?.(null);\n onWindowChange?.(id);\n };\n\n const dateLabel = customRangeActive\n ? `${formatLocalDate(effectiveDateRange.from)} – ${formatLocalDate(effectiveDateRange.to)}`\n : computeWindowLabel(selectedWindow) || dateRangeLabel;\n\n const [internalChartView, setInternalChartView] = React.useState(\n chartView ?? chartViewOptions[0]?.id ?? null,\n );\n const effectiveChartView = onChartViewChange ? chartView : internalChartView;\n const handleChartViewChange = (v) => {\n if (!onChartViewChange) setInternalChartView(v);\n onChartViewChange?.(v);\n };\n\n // Whether the previous-period line is drawn is driven by the option the\n // user picks. Each option in `chartViewOptions` may carry `showPrevious`;\n // missing or undefined falls back to true so the dual-series chart still\n // renders when the host hasn't customised the option set.\n const activeChartOption = chartViewOptions.find((o) => o.id === effectiveChartView);\n const showPreviousSeries =\n activeChartOption?.showPrevious === undefined\n ? true\n : !!activeChartOption.showPrevious;\n\n return (\n <div\n className={className}\n style={{\n background: C.white,\n fontFamily: FONT_DISPLAY,\n color: C.ink,\n width: \"100%\",\n minWidth: 1192,\n boxSizing: \"border-box\",\n padding: \"12px 32px 32px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 24,\n }}\n >\n {/* Header — back arrow + title + date controls + Export */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 16,\n paddingTop: 12,\n flexWrap: \"wrap\",\n }}\n >\n <button\n type=\"button\"\n aria-label=\"Back\"\n onClick={onBack}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 24,\n height: 24,\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n color: C.ink,\n padding: 0,\n flexShrink: 0,\n }}\n >\n <ArrowLeft size={20} strokeWidth={1.75} />\n </button>\n <div\n style={{\n flex: 1,\n minWidth: 0,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n paddingLeft: 16,\n borderLeft: `1px solid ${C.border}`,\n alignSelf: \"stretch\",\n justifyContent: \"center\",\n }}\n >\n <h1\n style={{\n fontFamily: FONT_DISPLAY,\n fontSize: 22,\n fontWeight: 500,\n color: C.ink,\n margin: 0,\n lineHeight: 1.2,\n letterSpacing: \"-0.01em\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n }}\n >\n {signalName}\n </h1>\n {signalSubtitle && (\n <span\n style={{ fontFamily: FONT_DISPLAY, fontSize: 12, color: C.muted, lineHeight: 1.2 }}\n >\n {signalSubtitle}\n </span>\n )}\n </div>\n <div style={{ display: \"flex\", gap: 10, alignItems: \"center\", flexWrap: \"wrap\" }}>\n {dateLabel && (\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n fontFamily: FONT_DISPLAY,\n fontSize: 13,\n color: C.ink,\n marginRight: 6,\n whiteSpace: \"nowrap\",\n }}\n >\n <CalendarDays size={16} strokeWidth={1.75} color={C.muted} />\n {dateLabel}\n </span>\n )}\n {rangeOptions.map((opt) => (\n <RangeChip\n key={opt.id}\n label={opt.label}\n active={!customRangeActive && opt.id === selectedWindow}\n onClick={() => handleWindowChange(opt.id)}\n />\n ))}\n {dateRangePicker ? (\n dateRangePicker\n ) : (\n <DateRangeButton value={effectiveDateRange} onChange={handleDateRangeChange} />\n )}\n {/*\n <button\n type=\"button\"\n onClick={() => onExport?.()}\n disabled={!onExport}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n height: 32,\n padding: \"0 16px\",\n borderRadius: 10,\n border: `1px solid ${C.neutralBorder}`,\n background: C.white,\n cursor: onExport ? \"pointer\" : \"not-allowed\",\n opacity: onExport ? 1 : 0.5,\n fontFamily: FONT_DISPLAY,\n fontSize: 14,\n color: C.neutral800,\n }}\n >\n <Download size={18} strokeWidth={1.75} />\n Export CSV\n </button>\n */}\n </div>\n </div>\n\n {/* KPI strip */}\n <div style={{ display: \"flex\", gap: 24, alignItems: \"stretch\" }}>\n <KpiCard\n value={fireRateStat.value}\n delta={fireRateStat.delta}\n label={fireRateStat.label}\n style={{ width: 272, flexShrink: 0 }}\n />\n <KpiCard\n value={fireCountStat.value}\n delta={fireCountStat.delta}\n label={fireCountStat.label}\n style={{ width: 272, flexShrink: 0 }}\n />\n <OutcomeCorrelationCard\n title={outcomeCorrelation.title}\n present={outcomeCorrelation.present}\n absent={outcomeCorrelation.absent}\n impact={outcomeCorrelation.impact}\n />\n </div>\n\n {/* Fire Rate Trend chart card */}\n <div\n style={{\n background: C.white,\n border: `1px solid ${C.border}`,\n borderRadius: 8,\n padding: 24,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 12 }}>\n <span\n style={{\n flex: 1,\n fontFamily: FONT_DISPLAY,\n fontSize: 14,\n fontWeight: 500,\n color: C.ink,\n lineHeight: 1.2,\n }}\n >\n {chartTitle}\n </span>\n {chartViewOptions.length > 0 && (\n <ViewBySelect\n value={effectiveChartView}\n options={chartViewOptions}\n onChange={handleChartViewChange}\n />\n )}\n </div>\n <FireRateTrendChart\n currentSeries={fireRateTrend.currentSeries || []}\n previousSeries={fireRateTrend.previousSeries || []}\n yLabels={chartYLabels}\n showPrevious={showPreviousSeries}\n legendCurrentLabel={chartLegendCurrentLabel}\n legendPreviousLabel={chartLegendPreviousLabel}\n />\n </div>\n\n {/* By Agent table — title overlaps DataTable2's toolbar (which already\n renders the Columns button) so the row reads as one in the design. */}\n <div style={{ position: \"relative\" }}>\n {agentBreakdownTitle && (\n <span\n style={{\n position: \"absolute\",\n top: 14,\n left: 4,\n zIndex: 40,\n fontFamily: FONT_DISPLAY,\n fontSize: 20,\n fontWeight: 500,\n color: C.ink,\n lineHeight: 1.2,\n letterSpacing: \"-0.01em\",\n pointerEvents: \"none\",\n }}\n >\n {agentBreakdownTitle}\n </span>\n )}\n <DataTable2\n data={agentBreakdownRows}\n columns={agentBreakdownColumns}\n initialPageSize={agentBreakdownInitialPageSize}\n onRowClick={onAgentClick}\n onVisibleColumnsChange={onAgentBreakdownVisibleColumnsChange}\n totalCount={agentBreakdownTotal}\n page={agentBreakdownPage}\n pageSize={agentBreakdownPageSize}\n onPageChange={onAgentBreakdownPageChange}\n onPageSizeChange={onAgentBreakdownPageSizeChange}\n />\n </div>\n\n {/* Co-occurring Signals */}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 16 }}>\n <SectionHeading icon={Share2} title={coOccurringTitle} />\n <TwoColumnList items={coOccurringItems} />\n </div>\n\n {/* Evidence Samples */}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 16 }}>\n <SectionHeading icon={FileText} title={evidenceTitle} />\n <TwoColumnList items={evidenceItems} />\n </div>\n\n {/* Recent Interactions table — same heading-overlap pattern as By Agent. */}\n <div style={{ position: \"relative\" }}>\n {recentInteractionsTitle && (\n <span\n style={{\n position: \"absolute\",\n top: 14,\n left: 0,\n zIndex: 40,\n fontFamily: FONT_DISPLAY,\n fontSize: 20,\n fontWeight: 600,\n color: C.ink,\n lineHeight: 1.2,\n letterSpacing: \"-0.01em\",\n pointerEvents: \"none\",\n }}\n >\n {recentInteractionsTitle}\n </span>\n )}\n <DataTable2\n data={recentInteractions}\n columns={recentInteractionColumns}\n initialPageSize={recentInteractionsInitialPageSize}\n onRowClick={onInteractionClick}\n onVisibleColumnsChange={onRecentInteractionsVisibleColumnsChange}\n totalCount={recentInteractionsTotal}\n page={recentInteractionsPage}\n pageSize={recentInteractionsPageSize}\n onPageChange={onRecentInteractionsPageChange}\n onPageSizeChange={onRecentInteractionsPageSizeChange}\n />\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { CalendarDays, Download } from \"lucide-react\";\nimport DataTable2 from \"../data/DataTable2\";\nimport { DateRangeButton } from \"../performance/PerformancePanel\";\nimport { computeWindowLabel, formatLocalDate } from \"../performance/performanceRangeFormat\";\nimport SignalDetailsPage from \"./SignalDetailsPage\";\n\nconst EMPTY_STAT = { value: \"\", label: \"\", trend: \"up\" };\n\nconst C = {\n ink: \"#2E3236\",\n muted: \"#808183\",\n border: \"#D9D9D9\",\n borderSubtle: \"#E6E6E6\",\n black: \"#0B0B0B\",\n white: \"#FFFFFF\",\n neutralBorder: \"#BFBFBF\",\n neutralLight: \"#E6E6E6\",\n neutral600: \"#676767\",\n neutral400: \"#989898\",\n fillTrack: \"#EFEFEF\",\n};\n\nconst FONT_DISPLAY = \"var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)\";\n\n// Sparkline shape lifted from PerformancePanel so this page stays\n// self-contained — the design uses the same KPI card visual.\nfunction Sparkline({ trend = \"up\", width = 49.618, height = 35 }) {\n const id = React.useId();\n const linePath =\n \"M1.00049 13.5213C7.85975 11.7032 8.88149 4.73912 13.7838 4.73912C19.8344 4.73912 23.6237 17.166 29.1281 17.166C34.5998 17.166 37.4149 4.88121 43.4004 8.61051C47.9764 11.4616 50.6186 1.00024 50.6186 1.00024\";\n const areaPath =\n \"M1.00049 16.692C8.88149 15.6975 8.88149 7.79403 13.7838 7.79403C19.8344 7.79403 23.6237 21.4034 29.1281 21.4034C34.5998 21.4034 37.4149 8.93821 43.4004 12.7223C47.9764 15.6152 50.6186 5.00024 50.6186 5.00024V36.0002C50.6186 36.0002 10.8223 36.0002 1.00049 36.0002C1.00049 28.8653 1.00049 19.4871 1.00049 16.692Z\";\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 52 36\"\n fill=\"none\"\n style={{\n flexShrink: 0,\n transform: trend === \"down\" ? \"scaleX(-1)\" : undefined,\n }}\n >\n <defs>\n <linearGradient\n id={`spark-${id}`}\n x1=\"9.96776\"\n y1=\"16.2053\"\n x2=\"9.96776\"\n y2=\"36.0002\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor={C.ink} />\n <stop offset=\"1\" stopColor={C.white} stopOpacity=\"0.01\" />\n </linearGradient>\n </defs>\n <path\n d={areaPath}\n fill={`url(#spark-${id})`}\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n opacity=\"0.1\"\n />\n <path\n d={linePath}\n stroke={C.ink}\n strokeWidth=\"2\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeDasharray={trend === \"down\" ? \"2 4\" : undefined}\n />\n </svg>\n );\n}\n\nfunction TrendArrow({ direction = \"up\", color = C.muted, size = 18 }) {\n const upPath =\n \"M12.4167 0.75H17.4167M17.4167 0.75V5.75M17.4167 0.75L10.3333 7.83333L6.16667 3.66667L0.75 9.08333\";\n const downPath =\n \"M12.4167 9.25H17.4167M17.4167 9.25V4.25M17.4167 9.25L10.3333 2.16667L6.16667 6.33333L0.75 0.91667\";\n return (\n <svg\n width={size}\n height={(size * 9.5) / 18}\n viewBox=\"0 0 19 10\"\n fill=\"none\"\n style={{ flexShrink: 0 }}\n >\n <path\n d={direction === \"up\" ? upPath : downPath}\n stroke={color}\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction StatCard({ value, label, trend = \"up\", style = {} }) {\n return (\n <div\n style={{\n background: C.white,\n border: `1px solid ${C.border}`,\n borderRadius: 8,\n padding: 16,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n boxSizing: \"border-box\",\n ...style,\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"flex-start\", justifyContent: \"space-between\" }}>\n <Sparkline trend={trend} />\n <TrendArrow direction={trend} />\n </div>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8, marginTop: 8 }}>\n <div\n style={{\n fontFamily: FONT_DISPLAY,\n fontSize: 28,\n fontWeight: 500,\n lineHeight: \"1.2\",\n color: C.ink,\n letterSpacing: \"-0.01em\",\n }}\n >\n {value}\n </div>\n <div style={{ fontFamily: FONT_DISPLAY, fontSize: 13, color: C.ink, lineHeight: \"1.2\" }}>\n {label}\n </div>\n </div>\n </div>\n );\n}\n\nfunction RangeChip({ label, active = false, onClick }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n style={{\n height: 32,\n minWidth: 31,\n padding: \"0 12px\",\n borderRadius: 10,\n border: active ? \"none\" : `1px solid ${C.borderSubtle}`,\n background: active ? C.black : C.white,\n color: active ? C.white : C.black,\n fontFamily: FONT_DISPLAY,\n fontSize: 14,\n cursor: \"pointer\",\n }}\n >\n {label}\n </button>\n );\n}\n\nconst DEFAULT_RANGE_OPTIONS = [\n { id: \"8h\", label: \"8h\" },\n { id: \"1d\", label: \"1d\" },\n { id: \"7d\", label: \"7d\" },\n { id: \"30d\", label: \"30d\" },\n];\n\n// Fire Rate progress bar — number on the left, fill bar on the right.\n// Accepts numeric percentage (0–100) or a string like \"25%\".\nfunction FireRateBar({ value }) {\n const num =\n typeof value === \"number\"\n ? value\n : parseFloat(String(value ?? \"\").replace(\"%\", \"\")) || 0;\n const pct = Math.max(0, Math.min(100, num));\n return (\n <span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 12, width: \"100%\" }}>\n <span style={{ minWidth: 32, color: C.ink, fontVariantNumeric: \"tabular-nums\" }}>\n {pct}%\n </span>\n <span\n style={{\n flex: 1,\n height: 4,\n background: C.fillTrack,\n borderRadius: 2,\n overflow: \"hidden\",\n minWidth: 40,\n maxWidth: 80,\n }}\n >\n <span\n style={{\n display: \"block\",\n width: `${pct}%`,\n height: \"100%\",\n background: C.black,\n borderRadius: 2,\n }}\n />\n </span>\n </span>\n );\n}\n\n// Delta cell — trend arrow + signed numeric value. Accepts a number or a\n// string like \"+0.2\" / \"-1.2\".\nfunction DeltaCell({ value }) {\n if (value == null || value === \"\") return null;\n const num =\n typeof value === \"number\" ? value : parseFloat(String(value).replace(/[^-\\d.]/g, \"\"));\n const isFinite = Number.isFinite(num);\n const up = !isFinite || num >= 0;\n const display =\n typeof value === \"string\"\n ? value\n : isFinite\n ? `${num >= 0 ? \"+\" : \"\"}${num.toFixed(1)}`\n : String(value);\n return (\n <span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 6 }}>\n <TrendArrow direction={up ? \"up\" : \"down\"} color={C.ink} size={16} />\n <span style={{ fontVariantNumeric: \"tabular-nums\" }}>{display}</span>\n </span>\n );\n}\n\n// Signed numeric (no arrow) — used for Compass Score in this design.\nfunction SignedNumber({ value }) {\n if (value == null || value === \"\") return null;\n const num =\n typeof value === \"number\" ? value : parseFloat(String(value).replace(/[^-\\d.]/g, \"\"));\n if (!Number.isFinite(num)) return <span>{String(value)}</span>;\n const sign = num >= 0 ? \"+\" : \"\";\n const display = typeof value === \"string\" && /^[+-]/.test(value) ? value : `${sign}${num}`;\n return <span style={{ fontVariantNumeric: \"tabular-nums\" }}>{display}</span>;\n}\n\nexport const DEFAULT_SIGNAL_COLUMNS = [\n { id: \"signal\", label: \"Signals\", width: 250, sortable: true, filterable: true },\n {\n id: \"fireRate\",\n label: \"Fire Rate\",\n width: 140,\n sortable: true,\n filterable: true,\n filterType: \"number\",\n render: (value) => <FireRateBar value={value} />,\n },\n {\n id: \"fires\",\n label: \"Fires\",\n width: 140,\n sortable: true,\n filterable: true,\n filterType: \"number\",\n },\n {\n id: \"delta\",\n label: \"Delta\",\n width: 140,\n sortable: true,\n filterable: true,\n filterType: \"number\",\n render: (value) => <DeltaCell value={value} />,\n },\n {\n id: \"avgStrength\",\n label: \"Avg Strength\",\n width: 140,\n sortable: true,\n filterable: true,\n filterType: \"number\",\n },\n {\n id: \"compass\",\n label: \"Agent Lift\",\n width: 140,\n sortable: true,\n filterable: true,\n filterType: \"number\",\n render: (value) => <SignedNumber value={value} />,\n },\n { id: \"topAgent\", label: \"Top Agent\", width: 178, sortable: true, filterable: true },\n];\n\nexport default function SignalsListPage({\n className = \"\",\n // Header\n title = \"\",\n dateRangeLabel = \"\",\n // KPI strip\n totalInteractionsStat = EMPTY_STAT,\n activeSignalsStat = EMPTY_STAT,\n // Table section heading — e.g. \"80 Active Signals\". When omitted, the\n // component derives a label from `activeSignalsStat.value`.\n activeSignalsHeading = \"\",\n // Time-range chips (8h / 1d / 7d / 30d). Override `rangeOptions` to customize.\n // `selectedWindow` is the currently-active option id; `onWindowChange(id)`\n // fires when the user picks a new chip.\n rangeOptions = DEFAULT_RANGE_OPTIONS,\n selectedWindow = \"30d\",\n onWindowChange,\n // Host-provided date-range picker node. Should render its own trigger button\n // and popover. When provided, replaces the built-in default picker.\n dateRangePicker,\n // Used by the built-in default picker when `dateRangePicker` is not provided.\n // `dateRange` is `{ from, to }` (Date objects); `onDateRangeChange` receives\n // the same shape when the user clicks Apply.\n dateRange,\n onDateRangeChange,\n // Table data\n signals = [],\n signalColumns = DEFAULT_SIGNAL_COLUMNS,\n initialPageSize = 10,\n onSignalClick,\n onVisibleColumnsChange,\n // Server-side pagination (optional pass-through to DataTable2).\n signalsTotal = null,\n signalsPage = null,\n signalsPageSize = null,\n onSignalsPageChange,\n onSignalsPageSizeChange,\n // Export button\n onExport,\n // Labels used by the auto-drill-down (when the host doesn't supply\n // `onSignalClick`). Empty by default so host apps don't see demo copy.\n fireRateStatLabel = \"\",\n fireCountStatLabel = \"\",\n}) {\n // Internal fallback for the custom date range when the host doesn't pass\n // `dateRange` / `onDateRangeChange`. Lifted here so the time-range chips can\n // become mutually exclusive with a committed custom range — same pattern as\n // PerformancePanel.\n const [internalDateRange, setInternalDateRange] = React.useState(null);\n const effectiveDateRange = dateRange !== undefined ? dateRange : internalDateRange;\n const customRangeActive = !!(effectiveDateRange?.from && effectiveDateRange?.to);\n\n const handleDateRangeChange = (range) => {\n setInternalDateRange(range);\n onDateRangeChange?.(range);\n };\n const handleWindowChange = (id) => {\n // Picking a chip cancels any active custom range so only one mode is\n // highlighted at a time.\n setInternalDateRange(null);\n onDateRangeChange?.(null);\n onWindowChange?.(id);\n };\n\n // Heading label: prefer the explicit override, otherwise compose from the\n // KPI value + label the host passed. Stays empty when neither is provided.\n const headingLabel =\n activeSignalsHeading ||\n (activeSignalsStat.value !== \"\" && activeSignalsStat.value != null\n ? `${activeSignalsStat.value} ${activeSignalsStat.label || \"\"}`.trim()\n : \"\");\n\n const dateLabel = customRangeActive\n ? `${formatLocalDate(effectiveDateRange.from)} – ${formatLocalDate(effectiveDateRange.to)}`\n : computeWindowLabel(selectedWindow) || dateRangeLabel;\n\n // Drill-down state — when a row is clicked we surface SignalDetailsPage on\n // top of the list. If the host passes `onSignalClick` they own navigation\n // and we don't open the internal panel.\n const [selectedSignal, setSelectedSignal] = React.useState(null);\n const handleRowClick = (row) => {\n if (onSignalClick) {\n onSignalClick(row);\n return;\n }\n setSelectedSignal(row);\n };\n\n // Map a list row to the details-page KPI shape. The list only knows a\n // handful of fields, so the details panel mostly renders empty until the\n // host wires real data via onSignalClick — but at least the headline KPIs\n // and the signal name carry across so the drill-down feels continuous.\n const detailsProps = selectedSignal\n ? {\n signalName: selectedSignal.signal ?? \"\",\n fireRateStat: {\n value:\n selectedSignal.fireRate != null && selectedSignal.fireRate !== \"\"\n ? `${selectedSignal.fireRate}%`\n : \"\",\n delta: selectedSignal.delta ?? \"\",\n label: fireRateStatLabel,\n },\n fireCountStat: {\n value:\n typeof selectedSignal.fires === \"number\"\n ? selectedSignal.fires.toLocaleString()\n : selectedSignal.fires ?? \"\",\n delta: \"\",\n label: fireCountStatLabel,\n },\n selectedWindow,\n onWindowChange,\n dateRange: effectiveDateRange,\n onDateRangeChange: handleDateRangeChange,\n rangeOptions,\n dateRangePicker,\n onExport,\n }\n : null;\n\n return (\n <>\n {selectedSignal && (\n <SignalDetailsPage\n className={className}\n {...detailsProps}\n onBack={() => setSelectedSignal(null)}\n />\n )}\n <div\n className={className}\n style={{\n background: C.white,\n fontFamily: FONT_DISPLAY,\n color: C.ink,\n width: \"100%\",\n minWidth: 1192,\n boxSizing: \"border-box\",\n padding: \"12px 32px 32px\",\n flexDirection: \"column\",\n gap: 24,\n // Hide (don't unmount) while drilling into a signal so DataTable2's\n // internal filter / sort / pagination state survives the round trip.\n display: selectedSignal ? \"none\" : \"flex\",\n }}\n >\n {/* Header row — title on the left, date controls + export on the right. */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 16,\n paddingTop: 12,\n flexWrap: \"wrap\",\n }}\n >\n <h1\n style={{\n fontFamily: FONT_DISPLAY,\n fontSize: 24,\n fontWeight: 500,\n color: C.ink,\n margin: 0,\n lineHeight: \"1.2\",\n letterSpacing: \"-0.01em\",\n flex: 1,\n minWidth: 0,\n }}\n >\n {title}\n </h1>\n <div style={{ display: \"flex\", gap: 10, alignItems: \"center\", flexWrap: \"wrap\" }}>\n {dateLabel && (\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n fontFamily: FONT_DISPLAY,\n fontSize: 13,\n color: C.ink,\n marginRight: 6,\n whiteSpace: \"nowrap\",\n }}\n >\n <CalendarDays size={16} strokeWidth={1.75} color={C.muted} />\n {dateLabel}\n </span>\n )}\n {rangeOptions.map((opt) => (\n <RangeChip\n key={opt.id}\n label={opt.label}\n active={!customRangeActive && opt.id === selectedWindow}\n onClick={() => handleWindowChange(opt.id)}\n />\n ))}\n {dateRangePicker ? (\n dateRangePicker\n ) : (\n <DateRangeButton value={effectiveDateRange} onChange={handleDateRangeChange} />\n )}\n {/*\n <button\n type=\"button\"\n onClick={() => onExport?.()}\n disabled={!onExport}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n height: 32,\n padding: \"0 16px\",\n borderRadius: 10,\n border: `1px solid ${C.neutralBorder}`,\n background: C.white,\n cursor: onExport ? \"pointer\" : \"not-allowed\",\n opacity: onExport ? 1 : 0.5,\n fontFamily: FONT_DISPLAY,\n fontSize: 14,\n color: \"#323232\",\n }}\n >\n <Download size={18} strokeWidth={1.75} />\n Export CSV\n </button>\n */}\n </div>\n </div>\n\n {/* KPI strip — two stat cards anchored to the left of the row. */}\n <div style={{ display: \"flex\", gap: 24 }}>\n <StatCard\n value={totalInteractionsStat.value}\n label={totalInteractionsStat.label}\n trend={totalInteractionsStat.trend}\n style={{ width: 264, flexShrink: 0 }}\n />\n <StatCard\n value={activeSignalsStat.value}\n label={activeSignalsStat.label}\n trend={activeSignalsStat.trend}\n style={{ width: 264, flexShrink: 0 }}\n />\n </div>\n\n {/* Table section. The heading sits on the same row as DataTable2's\n built-in toolbar (which renders the Columns button on the right),\n matching the Figma layout. Absolute positioning lets the heading\n overlap DataTable2's sticky toolbar without restructuring it. */}\n <div\n style={{\n position: \"relative\",\n paddingTop: 8,\n borderTop: `1px solid ${C.border}`,\n }}\n >\n {headingLabel && (\n <span\n style={{\n position: \"absolute\",\n top: 24,\n left: 0,\n zIndex: 40,\n fontFamily: FONT_DISPLAY,\n fontSize: 14,\n color: C.ink,\n fontWeight: 500,\n lineHeight: 1.2,\n pointerEvents: \"none\",\n }}\n >\n {headingLabel}\n </span>\n )}\n\n <DataTable2\n data={signals}\n columns={signalColumns}\n initialPageSize={initialPageSize}\n onRowClick={handleRowClick}\n onVisibleColumnsChange={onVisibleColumnsChange}\n totalCount={signalsTotal}\n page={signalsPage}\n pageSize={signalsPageSize}\n onPageChange={onSignalsPageChange}\n onPageSizeChange={onSignalsPageSizeChange}\n />\n </div>\n </div>\n </>\n );\n}\n"],"names":["C","FONT_DISPLAY","DEFAULT_RANGE_OPTIONS","RangeChip","label","active","onClick","jsx","KpiCard","value","delta","style","jsxs","OutcomeCorrelationCard","title","present","absent","impact","OutcomeCell","caption","sub","ViewBySelect","options","onChange","open","setOpen","React","triggerRef","popoverRef","handler","e","_a","_b","selected","o","v","ChevronDown","opt","isSelected","Check","FireRateTrendChart","currentSeries","previousSeries","yLabels","height","showPrevious","legendCurrentLabel","legendPreviousLabel","innerHeight","PADDING_LEFT","PADDING_RIGHT","viewWidth","innerWidth","allValues","yMin","yMax","ySpan","sy","y","seriesToPath","series","step","i","currentPath","previousPath","dots","l","yPos","p","SectionHeading","Icon","count","PercentRow","TwoColumnList","items","half","left","right","row","CompassDots","max","full","hasPartial","_","DEFAULT_AGENT_BREAKDOWN_COLUMNS","DEFAULT_RECENT_INTERACTION_COLUMNS","num","SignalDetailsPage","className","signalName","signalSubtitle","onBack","dateRangeLabel","rangeOptions","selectedWindow","onWindowChange","dateRangePicker","dateRange","onDateRangeChange","onExport","fireRateStat","fireCountStat","outcomeCorrelation","chartTitle","chartLegendCurrentLabel","chartLegendPreviousLabel","chartYLabels","fireRateTrend","chartViewOptions","chartView","onChartViewChange","agentBreakdownRows","agentBreakdownColumns","agentBreakdownTitle","onAgentClick","onAgentBreakdownVisibleColumnsChange","agentBreakdownInitialPageSize","coOccurringTitle","coOccurringItems","evidenceTitle","evidenceItems","recentInteractions","recentInteractionColumns","recentInteractionsTitle","onInteractionClick","onRecentInteractionsVisibleColumnsChange","recentInteractionsInitialPageSize","agentBreakdownTotal","agentBreakdownPage","agentBreakdownPageSize","onAgentBreakdownPageChange","onAgentBreakdownPageSizeChange","recentInteractionsTotal","recentInteractionsPage","recentInteractionsPageSize","onRecentInteractionsPageChange","onRecentInteractionsPageSizeChange","internalDateRange","setInternalDateRange","effectiveDateRange","customRangeActive","handleDateRangeChange","range","handleWindowChange","id","dateLabel","formatLocalDate","computeWindowLabel","internalChartView","setInternalChartView","effectiveChartView","handleChartViewChange","activeChartOption","showPreviousSeries","ArrowLeft","CalendarDays","DateRangeButton","DataTable2","Share2","FileText","EMPTY_STAT","Sparkline","trend","width","linePath","areaPath","TrendArrow","direction","color","size","upPath","downPath","StatCard","FireRateBar","pct","DeltaCell","isFinite","up","display","SignedNumber","sign","DEFAULT_SIGNAL_COLUMNS","SignalsListPage","totalInteractionsStat","activeSignalsStat","activeSignalsHeading","signals","signalColumns","initialPageSize","onSignalClick","onVisibleColumnsChange","signalsTotal","signalsPage","signalsPageSize","onSignalsPageChange","onSignalsPageSizeChange","fireRateStatLabel","fireCountStatLabel","headingLabel","selectedSignal","setSelectedSignal","handleRowClick","detailsProps","Fragment"],"mappings":"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"}
|