chordia-ui 3.9.2 → 3.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"PerformancePanel.cjs.js","sources":["../src/components/performance/performanceRangeFormat.js","../src/components/performance/performanceSparkline.js","../src/components/performance/performanceMetrics.js","../src/components/performance/PerformanceDetailsPage.jsx","../src/components/performance/PerformancePanel.jsx"],"sourcesContent":["// Shared en-US date/time formatting for time-range chips (8h / 1d / 7d / 30d).\n\nexport const 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\nconst LOCALE = \"en-US\";\nconst DATE_OPTS = { month: \"2-digit\", day: \"2-digit\", year: \"numeric\" };\nconst TIME_OPTS = { hour: \"numeric\", minute: \"2-digit\", hour12: true };\n\nexport function coalesceToDate(input) {\n if (!input) return null;\n if (input instanceof Date) {\n return Number.isNaN(input.getTime()) ? null : input;\n }\n const str = String(input).trim();\n const ymd = str.match(/^(\\d{4})-(\\d{1,2})-(\\d{1,2})/);\n if (ymd) {\n const d = new Date(Number(ymd[1]), Number(ymd[2]) - 1, Number(ymd[3]));\n return Number.isNaN(d.getTime()) ? null : d;\n }\n const parsed = new Date(str);\n return Number.isNaN(parsed.getTime()) ? null : parsed;\n}\n\nfunction isSameLocalCalendarDay(a, b) {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\nexport function formatLocalDate(date) {\n const d = date instanceof Date ? date : coalesceToDate(date);\n if (!d) return \"\";\n return d.toLocaleDateString(LOCALE, DATE_OPTS);\n}\n\nfunction formatLocalTime(date) {\n return date.toLocaleTimeString(LOCALE, TIME_OPTS);\n}\n\nfunction formatLocalDateTime(date) {\n return `${formatLocalDate(date)} ${formatLocalTime(date)}`;\n}\n\n/** Single-line label for the 8h chip (panel header). */\nexport function formatEightHourWindowLabel(from, to) {\n const f = coalesceToDate(from);\n const t = coalesceToDate(to);\n if (!f || !t) return \"\";\n if (isSameLocalCalendarDay(f, t)) {\n return `${formatLocalDateTime(f)} – ${formatLocalTime(t)}`;\n }\n return `${formatLocalDateTime(f)} – ${formatLocalDateTime(t)}`;\n}\n\n/** Start/end strings for the details page (arrow between). */\nexport function formatEightHourRangeEndpoints(from, to) {\n const f = coalesceToDate(from);\n const t = coalesceToDate(to);\n if (!f || !t) return null;\n if (isSameLocalCalendarDay(f, t)) {\n return { from: formatLocalDateTime(f), to: formatLocalTime(t) };\n }\n return { from: formatLocalDateTime(f), to: formatLocalDateTime(t) };\n}\n\n/** Rolling from/to for a preset chip (matches panel + details display). */\nexport function getPresetWindowDates(windowId) {\n const ms = RANGE_TO_MS[windowId];\n if (!ms) return null;\n const to = new Date();\n const from = new Date(to.getTime() - ms);\n return { from, to };\n}\n\n/** Label for preset window chips (8h shows time range; others show dates). */\nexport function computeWindowLabel(windowId) {\n const ms = RANGE_TO_MS[windowId];\n if (!ms) return \"\";\n const range = getPresetWindowDates(windowId);\n if (!range) return \"\";\n if (windowId === \"8h\") {\n return formatEightHourWindowLabel(range.from, range.to);\n }\n return `${formatLocalDate(range.from)} – ${formatLocalDate(range.to)}`;\n}\n","// Sparkline path builders shared by PerformancePanel + PerformanceDetailsPage.\n\nexport const SPARK_DEFAULT_LINE =\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\nexport const SPARK_DEFAULT_AREA =\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\n/** Normalize host points — flat array of numbers or [x, y] pairs (y used). */\nexport function normalizeSparkPoints(points) {\n if (!Array.isArray(points)) return null;\n const numeric = points\n .map((p) => {\n if (Array.isArray(p)) return Number(p[1]);\n if (p == null || p === \"\") return NaN;\n return Number(p);\n })\n .filter((n) => Number.isFinite(n));\n return numeric.length >= 2 ? numeric : null;\n}\n\n/** Project a numeric series onto an SVG viewBox. Returns null when unusable. */\nexport function buildSparkPaths(points, vbW = 52, vbH = 36) {\n const numeric = normalizeSparkPoints(points);\n if (!numeric) return null;\n const min = Math.min(...numeric);\n const max = Math.max(...numeric);\n const padY = 4;\n const span = max - min || 1;\n const usableH = vbH - padY * 2 - 4;\n const sx = (i) => (numeric.length === 1 ? 0 : (i / (numeric.length - 1)) * (vbW - 2)) + 1;\n const sy = (v) => padY + (1 - (v - min) / span) * usableH;\n let line = \"\";\n for (let i = 0; i < numeric.length; i++) {\n line += `${i === 0 ? \"M\" : \"L\"}${sx(i).toFixed(2)},${sy(numeric[i]).toFixed(2)}`;\n }\n const lastX = sx(numeric.length - 1);\n const firstX = sx(0);\n const area = `${line} L${lastX.toFixed(2)},${vbH} L${firstX.toFixed(2)},${vbH} Z`;\n return { line, area };\n}\n\n/** Infer up/down from first vs last point when host omits `trend`. */\nexport function trendFromPoints(points) {\n const numeric = normalizeSparkPoints(points);\n if (!numeric) return null;\n const first = numeric[0];\n const last = numeric[numeric.length - 1];\n if (last > first) return \"up\";\n if (last < first) return \"down\";\n return \"up\";\n}\n","import { trendFromPoints } from \"./performanceSparkline.js\";\n\nexport const METRIC_PLACEHOLDER = \"—\";\n\n/** Hosts often send \"-\", \"—\", or empty strings when API delta/value is null. */\nexport function isNullishMetric(value) {\n if (value == null) return true;\n const str = String(value).trim();\n if (!str) return true;\n if (/^[-−–—]$/.test(str)) return true;\n if (/^(n\\/a|null|undefined)$/i.test(str)) return true;\n return false;\n}\n\nexport function hasMeaningfulMetric(value) {\n return !isNullishMetric(value);\n}\n\nexport function formatMetricDisplay(value, fallback = METRIC_PLACEHOLDER) {\n return isNullishMetric(value) ? fallback : String(value);\n}\n\n/** Non-empty host field — includes placeholder dashes the API uses for missing data. */\nexport function hasHostMetricField(value) {\n return value != null && String(value).trim() !== \"\";\n}\n\n/**\n * Whether a chart card should render. Matches legacy `value || delta || points.length`\n * while treating numeric zero as present data.\n */\nexport function hasChartData(chart) {\n if (!chart) return false;\n if (hasHostMetricField(chart.value) || hasHostMetricField(chart.delta)) return true;\n return Array.isArray(chart.points) && chart.points.length > 0;\n}\n\n/** Derive up/down from signed deltas (+2.0%, -3pp, 95.5% (0.6pp), etc.). */\nexport function trendFromSignedValue(text) {\n if (isNullishMetric(text)) return null;\n const str = String(text).trim();\n const parenMatch = str.match(/\\(\\s*([+-])?\\s*([\\d.]+)/);\n if (parenMatch) {\n if (parenMatch[1] === \"-\") return \"down\";\n if (parenMatch[1] === \"+\") return \"up\";\n return parseFloat(parenMatch[2]) < 0 ? \"down\" : \"up\";\n }\n if (/^[-−]/.test(str)) return \"down\";\n if (/^\\+/.test(str)) return \"up\";\n if (/-\\d/.test(str)) return \"down\";\n return null;\n}\n\nexport function resolveTrend(trend, signedText) {\n return trendFromSignedValue(signedText) ?? (trend === \"down\" ? \"down\" : \"up\");\n}\n\nexport function resolveKpiTrend(trend, value, points) {\n return (\n trendFromPoints(points) ??\n (hasMeaningfulMetric(value) ? resolveTrend(trend, value) : trend === \"down\" ? \"down\" : \"up\")\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport {\n ArrowLeft,\n ArrowRight,\n CalendarDays,\n Download,\n Phone,\n ChevronDown,\n ChevronUp,\n ChevronLeft,\n ChevronRight,\n TrendingUp,\n TrendingDown,\n Lightbulb,\n ShieldCheck,\n FolderKanban,\n Layers,\n} from \"lucide-react\";\nimport DataTable2 from \"../data/DataTable2\";\nimport { DateRangeButton } from \"./PerformancePanel\";\nimport {\n formatEightHourRangeEndpoints,\n formatLocalDate,\n getPresetWindowDates,\n} from \"./performanceRangeFormat\";\nimport {\n SPARK_DEFAULT_AREA,\n SPARK_DEFAULT_LINE,\n buildSparkPaths,\n normalizeSparkPoints,\n} from \"./performanceSparkline\";\nimport {\n METRIC_PLACEHOLDER,\n formatMetricDisplay,\n hasChartData,\n hasMeaningfulMetric,\n resolveKpiTrend,\n resolveTrend,\n} from \"./performanceMetrics\";\n\n// Color values resolve to CSS variables declared in `src/tokens/colors.css`.\n// Anything new added here MUST first be added to that file as a `--*` token.\nconst C = {\n ink: \"var(--color-text)\",\n muted: \"var(--color-text-secondary)\",\n border: \"var(--grey-absent)\",\n borderSubtle: \"var(--neutral-100)\",\n iconCircle: \"var(--surface-hover)\",\n black: \"var(--neutral-900)\",\n white: \"var(--grey-white)\",\n neutralBorder: \"var(--neutral-250)\",\n neutral800: \"var(--neutral-800)\",\n neutral600: \"var(--neutral-600)\",\n neutral450: \"var(--neutral-450)\",\n neutral400: \"var(--neutral-400)\",\n neutral300: \"var(--neutral-300)\",\n neutral150: \"var(--neutral-150)\",\n neutral100: \"var(--neutral-100)\",\n beige: \"var(--surface-warm-40)\",\n shadowCard: \"var(--shadow-card)\",\n // Section accent colors are passed to SectionHeading via `iconColor`.\n railCompliance: \"var(--rail-compliance)\",\n accentYellow: \"var(--accent-yellow)\",\n};\n\nconst FONT_DISPLAY = \"var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)\";\nconst FONT_BODY = \"var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)\";\n\nfunction TrendArrow({ direction = \"up\", color = C.muted }) {\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 width={18} height={9.5} viewBox=\"0 0 19 10\" fill=\"none\" style={{ flexShrink: 0 }}>\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\n// MM/DD/YYYY in the viewer's local timezone — matches PerformancePanel's\n// `formatLocalDate`. Accepts Date instances or strings (e.g. \"2026-03-16\");\n// returns the input untouched if it can't be parsed.\nfunction formatDisplayDate(input) {\n if (!input) return \"\";\n const opts = { month: \"2-digit\", day: \"2-digit\", year: \"numeric\" };\n if (input instanceof Date) {\n return Number.isNaN(input.getTime()) ? \"\" : input.toLocaleDateString(\"en-US\", opts);\n }\n const str = String(input).trim();\n const ymd = str.match(/^(\\d{4})-(\\d{1,2})-(\\d{1,2})/);\n if (ymd) {\n const d = new Date(Number(ymd[1]), Number(ymd[2]) - 1, Number(ymd[3]));\n return d.toLocaleDateString(\"en-US\", opts);\n }\n const parsed = new Date(str);\n if (!Number.isNaN(parsed.getTime())) return parsed.toLocaleDateString(\"en-US\", opts);\n return str;\n}\n\nfunction Sparkline({ trend = \"up\", points, empty = false, width = 49.618, height = 35 }) {\n const id = React.useId();\n if (empty) {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 52 36\"\n fill=\"none\"\n style={{ flexShrink: 0 }}\n >\n <path\n d=\"M2,18 L50,18\"\n stroke={C.ink}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n }\n const built = buildSparkPaths(points);\n const linePath = built ? built.line : SPARK_DEFAULT_LINE;\n const areaPath = built ? built.area : SPARK_DEFAULT_AREA;\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 // Only mirror the canned curve. When real points are supplied the\n // shape already reflects direction, so no mirror needed.\n transform: !built && 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 // Dashed only when we don't have real points and trend is \"down\"\n // (matches the pre-existing decorative behavior).\n strokeDasharray={!built && trend === \"down\" ? \"2 4\" : undefined}\n />\n </svg>\n );\n}\n\nfunction KpiCell({ value, label, sub, trend = \"up\", points }) {\n const displayValue = formatMetricDisplay(value);\n const hasData = hasMeaningfulMetric(value) || normalizeSparkPoints(points) != null;\n const direction = resolveKpiTrend(trend, value, points);\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 16,\n minWidth: 0,\n }}\n >\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n flexShrink: 0,\n alignItems: \"flex-end\",\n }}\n >\n <Sparkline trend={direction} points={points} empty={!hasData} />\n {hasData ? <TrendArrow direction={direction} /> : null}\n </div>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 6, minWidth: 0 }}>\n <div\n style={{\n fontFamily: FONT_DISPLAY,\n fontSize: 28,\n fontWeight: 400,\n lineHeight: \"1.2\",\n color: C.muted,\n letterSpacing: \"-0.01em\",\n whiteSpace: \"nowrap\",\n }}\n >\n {displayValue}\n </div>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 2 }}>\n <span\n style={{\n fontFamily: FONT_BODY,\n fontSize: 13,\n color: C.ink,\n lineHeight: \"1.2\",\n }}\n >\n {label}\n </span>\n <span\n style={{\n fontFamily: FONT_BODY,\n fontSize: 13,\n color: C.neutral600,\n lineHeight: \"1.2\",\n }}\n >\n {sub}\n </span>\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_BODY,\n fontSize: 14,\n cursor: \"pointer\",\n }}\n >\n {label}\n </button>\n );\n}\n\nfunction FilterButton({ icon: Icon, children, active = false }) {\n return (\n <button\n type=\"button\"\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n height: 32,\n padding: \"0 16px\",\n borderRadius: 10,\n border: active ? \"none\" : `1px solid ${C.neutralBorder}`,\n background: active ? C.black : C.white,\n cursor: \"pointer\",\n fontFamily: FONT_BODY,\n fontSize: 14,\n color: active ? C.white : C.neutral800,\n fontWeight: active ? 600 : 400,\n whiteSpace: \"nowrap\",\n }}\n >\n {Icon && <Icon size={18} strokeWidth={1.75} />}\n {children}\n </button>\n );\n}\n\nconst DEFAULT_LINE_POINTS = [\n [0, 30],\n [60, 50],\n [120, 95],\n [180, 60],\n [240, 70],\n [300, 80],\n];\n\nfunction CompassLineChart({\n // When omitted, y-axis labels are auto-derived from `points` (5 evenly-spaced\n // ticks from max → min). Pass a custom array to override the formatting.\n yLabels: yLabelsProp,\n xLabels = [],\n // points: array of [x, y] pairs OR array of y-numbers (auto-distributed in x).\n // y is in DATA space — the chart auto-scales it to pixel space using the\n // points' own min/max (with a small padding).\n points,\n // index of the marker to render filled (defaults to the last point)\n highlightIndex,\n}) {\n const [hoveredPoint, setHoveredPoint] = React.useState(null);\n const width = 460;\n const height = 110;\n const hasData = Array.isArray(points) && points.length > 0;\n const gradId = React.useId();\n // Cap the visible x-axis ticks regardless of how many points are passed —\n // long trends (60+ days) would otherwise overflow the card.\n const MAX_X_TICKS = 6;\n const allXLabels = Array.isArray(xLabels) ? xLabels : [];\n const visibleXLabels =\n allXLabels.length <= MAX_X_TICKS\n ? allXLabels\n : Array.from({ length: MAX_X_TICKS }, (_, i) =>\n allXLabels[Math.round((i * (allXLabels.length - 1)) / (MAX_X_TICKS - 1))]\n );\n // Vertical grid lines at evenly-spaced positions matching the visible ticks.\n const gridCount = Math.max(2, visibleXLabels.length || MAX_X_TICKS);\n const gridXs = Array.from({ length: gridCount }, (_, i) => (i / (gridCount - 1)) * width);\n\n if (!hasData) {\n // Empty state: render an empty 133px chart skeleton with just the grid\n // lines — no placeholder copy. Hosts that supply only headline value/\n // delta still get a clean card without \"No data\" text bleeding through.\n return (\n <div style={{ display: \"flex\", gap: 8, height: 133, width: \"100%\" }}>\n <div style={{ width: 24, flexShrink: 0 }} />\n <div style={{ flex: 1, position: \"relative\", minWidth: 0 }}>\n <svg\n width=\"100%\"\n height={height + 14}\n viewBox={`0 0 ${width} ${height + 14}`}\n preserveAspectRatio=\"none\"\n >\n {gridXs.map((gx, i) => (\n <line\n key={`grid-${i}`}\n x1={gx}\n y1=\"0\"\n x2={gx}\n y2={height}\n stroke={C.borderSubtle}\n strokeDasharray=\"2 3\"\n strokeWidth=\"1\"\n vectorEffect=\"non-scaling-stroke\"\n />\n ))}\n </svg>\n </div>\n </div>\n );\n }\n\n // Normalize to [x, y] pairs in DATA space.\n const dataPairs = Array.isArray(points[0])\n ? points\n : points.map((y, i) => [i, y]);\n const yValues = dataPairs.map(([, y]) => y);\n const yDataMin = Math.min(...yValues);\n const yDataMax = Math.max(...yValues);\n // Pad the range so the curve isn't pinned to the very top/bottom; if all\n // values are identical, give the axis a 1-unit cushion so it still draws.\n const yPad = yDataMax === yDataMin ? Math.max(Math.abs(yDataMax) * 0.1, 1) : (yDataMax - yDataMin) * 0.1;\n const yMin = yDataMin - yPad;\n const yMax = yDataMax + yPad;\n const ySpan = yMax - yMin || 1;\n const sy = (y) => ((yMax - y) / ySpan) * height;\n const normalized = dataPairs.map(([x, y]) => [x, sy(y)]);\n\n // Auto-derive y-axis labels (5 evenly-spaced ticks from max → min) when the\n // caller didn't pass an override.\n const yLabels =\n yLabelsProp && yLabelsProp.length\n ? yLabelsProp\n : Array.from({ length: 5 }, (_, i) => {\n const v = yMax - (i / 4) * (yMax - yMin);\n const abs = Math.abs(v);\n const decimals = abs >= 100 ? 0 : abs >= 10 ? 1 : 2;\n return v.toFixed(decimals);\n });\n const minX = normalized[0][0];\n const maxX = normalized[normalized.length - 1][0];\n const xSpan = maxX - minX || 1;\n // Keep endpoints away from the SVG edge so first/last point markers don't clip.\n const xPad = 8;\n const innerWidth = Math.max(1, width - xPad * 2);\n const sx = (x) => xPad + ((x - minX) / xSpan) * innerWidth;\n const formatPointValue = (value) => {\n const n = Number(value);\n if (!Number.isFinite(n)) return String(value ?? \"\");\n const abs = Math.abs(n);\n const decimals = abs >= 100 ? 0 : abs >= 10 ? 1 : 2;\n return n.toFixed(decimals);\n };\n const linePath = normalized\n .map(([x, y], i) => `${i === 0 ? \"M\" : \"L\"}${sx(x)},${y}`)\n .join(\" \");\n const areaPath = `${linePath} L${sx(normalized[normalized.length - 1][0])},${height} L${sx(normalized[0][0])},${height} Z`;\n const highlight = highlightIndex == null ? normalized.length - 1 : highlightIndex;\n return (\n <div style={{ display: \"flex\", gap: 8, height: 133, width: \"100%\" }}>\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"space-between\",\n padding: \"14px 0\",\n fontFamily: FONT_BODY,\n fontSize: 10,\n color: C.neutral800,\n flexShrink: 0,\n }}\n >\n {yLabels.map((l) => (\n <span key={l}>{l}</span>\n ))}\n </div>\n <div style={{ flex: 1, position: \"relative\", minWidth: 0 }}>\n {hoveredPoint && (\n <div\n style={{\n position: \"absolute\",\n left: `${hoveredPoint.xPct}%`,\n top: `${hoveredPoint.yPct}%`,\n transform: \"translate(-50%, calc(-100% - 10px))\",\n pointerEvents: \"none\",\n zIndex: 2,\n background: C.black,\n color: C.white,\n borderRadius: 6,\n minWidth: 60,\n padding: \"8px 10px\",\n boxShadow: \"0 6px 16px rgba(0,0,0,0.18)\",\n fontFamily: FONT_BODY,\n fontSize: 11,\n lineHeight: 1.25,\n whiteSpace: \"nowrap\",\n textAlign: \"left\",\n }}\n >\n <div>{hoveredPoint.label}</div>\n <div style={{ fontWeight: 600 }}>{hoveredPoint.value}</div>\n <div\n style={{\n position: \"absolute\",\n left: \"50%\",\n bottom: -5,\n width: 10,\n height: 10,\n background: C.black,\n transform: \"translateX(-50%) rotate(45deg)\",\n borderRadius: 2,\n }}\n />\n </div>\n )}\n <svg\n width=\"100%\"\n height={height + 14}\n viewBox={`0 0 ${width} ${height + 14}`}\n preserveAspectRatio=\"none\"\n onMouseLeave={() => setHoveredPoint(null)}\n >\n <defs>\n <linearGradient id={`area-${gradId}`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" style={{ stopColor: C.black, stopOpacity: 0.08 }} />\n <stop offset=\"100%\" style={{ stopColor: C.black, stopOpacity: 0 }} />\n </linearGradient>\n </defs>\n {gridXs.map((gx, i) => (\n <line\n key={`grid-${i}`}\n x1={gx}\n y1=\"0\"\n x2={gx}\n y2={height}\n stroke={C.borderSubtle}\n strokeDasharray=\"2 3\"\n strokeWidth=\"1\"\n vectorEffect=\"non-scaling-stroke\"\n />\n ))}\n <path d={areaPath} fill={`url(#area-${gradId})`} />\n <path\n d={linePath}\n stroke={C.black}\n strokeWidth=\"1.5\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n vectorEffect=\"non-scaling-stroke\"\n />\n {normalized.map(([x, y], i) => {\n const isHighlight = i === highlight;\n return (\n <circle\n key={i}\n cx={sx(x)}\n cy={y}\n r={isHighlight ? 4 : 3}\n fill={isHighlight ? C.black : C.white}\n stroke={C.black}\n strokeWidth=\"1.5\"\n vectorEffect=\"non-scaling-stroke\"\n onMouseEnter={() => {\n setHoveredPoint({\n xPct: (sx(x) / width) * 100,\n yPct: (y / (height + 28)) * 100,\n label: allXLabels[i] || `Point ${i + 1}`,\n value: formatPointValue(dataPairs[i]?.[1]),\n });\n }}\n />\n );\n })}\n </svg>\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n paddingRight: 6,\n fontFamily: FONT_BODY,\n fontSize: 10,\n color: C.neutral800,\n marginTop: 8,\n marginBottom: 4,\n overflow: \"hidden\",\n }}\n >\n {visibleXLabels.map((l, i) => (\n <span key={i} style={{ whiteSpace: \"nowrap\" }}>{l}</span>\n ))}\n </div>\n </div>\n </div>\n );\n}\n\nfunction ChartCard({ title, value, delta, children }) {\n const displayValue = formatMetricDisplay(value);\n const showDelta = hasMeaningfulMetric(delta);\n // Value line uses em-dash fallback; delta/trend icons stay hidden for placeholders.\n const deltaTrend = showDelta ? resolveTrend(\"up\", delta) : \"up\";\n return (\n <div\n style={{\n flex: 1,\n background: C.white,\n border: `1px solid ${C.border}`,\n borderRadius: 8,\n padding: 24,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 24,\n minWidth: 0,\n boxShadow: C.shadowCard,\n }}\n >\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"flex-end\" }}>\n <span\n style={{\n fontFamily: FONT_DISPLAY,\n fontWeight: 600,\n fontSize: 15,\n color: C.ink,\n lineHeight: 1.2,\n }}\n >\n {title}\n </span>\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"flex-end\",\n gap: 4,\n fontFamily: FONT_DISPLAY,\n fontWeight: 600,\n }}\n >\n <span style={{ fontSize: 20, color: C.black, lineHeight: 1 }}>{displayValue}</span>\n {showDelta ? (\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 3,\n fontSize: 10,\n color: C.neutral300,\n lineHeight: 1,\n }}\n >\n <TrendArrow direction={deltaTrend} color={C.neutral300} />\n {delta}\n </span>\n ) : null}\n </span>\n </div>\n <div style={{ flex: 1 }}>{children}</div>\n </div>\n );\n}\n\nfunction SectionHeading({ icon: Icon, title, trailing, iconColor = C.ink, bordered = false }) {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n width: \"100%\",\n paddingBottom: bordered ? 12 : 0,\n borderBottom: bordered ? `1px solid ${C.border}` : \"none\",\n }}\n >\n <div\n style={{\n width: 24,\n height: 24,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n <Icon size={22} strokeWidth={1.75} style={{ color: iconColor }} />\n </div>\n <div\n style={{\n flex: 1,\n fontFamily: FONT_DISPLAY,\n fontWeight: 600,\n fontSize: 16,\n color: C.ink,\n lineHeight: 1.2,\n textTransform: \"uppercase\",\n letterSpacing: \"0.02em\",\n }}\n >\n {title}\n </div>\n {trailing && (\n <div style={{ fontFamily: FONT_BODY, fontSize: 14, color: C.ink }}>{trailing}</div>\n )}\n </div>\n );\n}\n\n// Hosts emit `text` (matches PerformancePanel's accordion); legacy callers\n// may pass `bullet`. Accept either so existing consumers don't break.\n// When `href` is provided the label renders as an underlined link that\n// opens in a new tab (used by Performance guidance examples → interaction\n// detail page).\nfunction CitationRow({ text, bullet, citation, date, href }) {\n const label = text ?? bullet ?? \"\";\n return (\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n fontFamily: FONT_BODY,\n fontSize: 14,\n color: C.ink,\n lineHeight: \"24px\",\n gap: 16,\n }}\n >\n {href ? (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n color: C.ink,\n textDecoration: \"underline\",\n textUnderlineOffset: 2,\n textDecorationColor: C.border,\n minWidth: 0,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {label}\n </a>\n ) : (\n <span style={{ minWidth: 0, overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}>\n {label}\n </span>\n )}\n <span style={{ display: \"inline-flex\", gap: 4, whiteSpace: \"nowrap\" }}>\n <span style={{ color: C.ink }}>{citation}</span>\n {date ? <span style={{ color: C.muted }}>({date})</span> : null}\n </span>\n </div>\n );\n}\n\nfunction AccordionRow({\n title,\n summary,\n calls,\n // Hosts emit `percent` (matches PerformancePanel's accordion); legacy\n // callers may still send `delta`. Accept either.\n percent,\n delta,\n bullets,\n defaultExpanded = false,\n}) {\n const [expanded, setExpanded] = React.useState(defaultExpanded);\n const trailingRaw = percent ?? delta;\n const showTrailing = hasMeaningfulMetric(trailingRaw);\n const trailing = showTrailing ? String(trailingRaw) : METRIC_PLACEHOLDER;\n const trailingTrend = showTrailing ? resolveTrend(\"up\", trailing) : \"up\";\n const TrendIcon = trailingTrend === \"down\" ? TrendingDown : TrendingUp;\n const rows = Array.isArray(bullets) ? bullets : [];\n // Outer container is a div so the bullet rows inside (which may hold\n // <a> links to the interaction detail page) aren't nested inside an\n // interactive <button>. Header still toggles via the inner button.\n return (\n <div style={{ borderTop: `1px solid ${C.border}` }}>\n <button\n type=\"button\"\n onClick={() => setExpanded((v) => !v)}\n aria-expanded={expanded}\n style={{\n border: \"none\",\n background: \"transparent\",\n padding: 16,\n display: \"flex\",\n gap: 12,\n alignItems: \"flex-start\",\n cursor: \"pointer\",\n width: \"100%\",\n textAlign: \"left\",\n fontFamily: FONT_BODY,\n }}\n >\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\", gap: 12, minWidth: 0 }}>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 12 }}>\n <span\n style={{\n fontFamily: FONT_BODY,\n fontWeight: 500,\n fontSize: 14,\n color: C.black,\n lineHeight: \"24px\",\n }}\n >\n {title}\n </span>\n <span style={{ fontFamily: FONT_BODY, fontSize: 14, color: C.muted, lineHeight: \"24px\" }}>\n {summary}\n </span>\n </div>\n <div style={{ display: \"flex\", gap: 16 }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n <Phone size={12} color={C.ink} strokeWidth={1.75} />\n <span style={{ fontFamily: FONT_BODY, fontSize: 12, color: C.ink }}>{calls} calls</span>\n </div>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n {showTrailing ? (\n <TrendIcon size={12} color={C.ink} strokeWidth={1.75} />\n ) : null}\n <span\n style={{\n fontFamily: FONT_BODY,\n fontSize: 12,\n color: showTrailing ? C.ink : C.muted,\n }}\n >\n {trailing}\n </span>\n </div>\n </div>\n </div>\n <ChevronDown\n size={20}\n color={C.ink}\n strokeWidth={2}\n style={{\n flexShrink: 0,\n transform: expanded ? \"rotate(180deg)\" : \"none\",\n transition: \"transform 150ms ease\",\n }}\n />\n </button>\n {expanded && rows.length > 0 && (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 12,\n padding: \"0 16px 16px\",\n }}\n >\n {rows.map((b, i) => (\n <CitationRow key={i} {...b} />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction PercentRow({ label, value }) {\n return (\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n padding: \"8px 8px 12px\",\n borderBottom: `1px solid ${C.border}`,\n fontFamily: FONT_BODY,\n fontSize: 13,\n lineHeight: \"1.2\",\n }}\n >\n <span style={{ color: C.ink }}>{label}</span>\n <span style={{ color: C.muted }}>{value}</span>\n </div>\n );\n}\n\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: \"flex\", gap: 4 }}>\n {Array.from({ length: max }).map((_, i) => {\n if (i < full) {\n return (\n <span\n key={i}\n style={{\n width: 10,\n height: 10,\n borderRadius: \"50%\",\n background: C.black,\n display: \"inline-block\",\n }}\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\n style={{\n width: 6,\n height: 6,\n borderRadius: \"50%\",\n background: C.black,\n display: \"inline-block\",\n }}\n />\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 display: \"inline-block\",\n boxSizing: \"border-box\",\n }}\n />\n );\n })}\n </div>\n );\n}\n\nexport const DEFAULT_SESSION_COLUMNS = [\n { id: \"title\", label: \"Title\", width: 220, sortable: true, filterable: true },\n { id: \"date\", label: \"Date\", width: 170, sortable: true },\n { id: \"duration\", label: \"Duration\", width: 170, sortable: true },\n { id: \"lift\", label: \"Lift\", width: 120, sortable: true },\n {\n id: \"compass\",\n label: \"Compass Score\",\n width: 220,\n sortable: true,\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\n\nfunction SubSectionHeading({ icon: Icon, title }) {\n return (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 16, width: \"100%\" }}>\n <div\n style={{\n width: 34,\n height: 34,\n borderRadius: 9999,\n background: C.iconCircle,\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 fontFamily: FONT_DISPLAY,\n fontWeight: 600,\n fontSize: 16,\n color: C.ink,\n lineHeight: 1.2,\n }}\n >\n {title}\n </span>\n </div>\n );\n}\n\nexport default function PerformanceDetailsPage({\n agentName = \"\",\n startDate = \"\",\n endDate = \"\",\n totalCalls = \"\",\n onBack,\n className = \"\",\n // KPI strip\n kpiBaseline = { value: \"\", label: \"\", sub: \"\", trend: \"up\" },\n kpiAgentLift = { value: \"\", label: \"\", sub: \"\", trend: \"down\" },\n kpiScore = { value: \"\", label: \"\", sub: \"\", trend: \"up\" },\n // Chart cards (Baseline / Agent Lift / Score / CSAT / Volume)\n // Each takes { value, delta, yLabels?, xLabels?, points? }.\n // points is an array of [x, y] pairs OR a flat array of y-numbers.\n baselineChart = { value: \"\", delta: \"\" },\n agentLiftChart = { value: \"\", delta: \"\" },\n scoreChart = { value: \"\", delta: \"\" },\n csatChart = { value: \"\", delta: \"\" },\n volumeChart = { value: \"\", delta: \"\" },\n // Insight sections — titles and chart-card labels stay empty by default\n // so the library doesn't ship demo copy.\n guidanceItems = [],\n strengthItems = [],\n callDrivers = [],\n callParadigms = [],\n strengthsTitle = \"\",\n guidanceTitle = \"\",\n callMixTitle = \"\",\n driversTitle = \"\",\n paradigmsTitle = \"\",\n sessionsTitle = \"\",\n baselineChartTitle = \"\",\n agentLiftChartTitle = \"\",\n scoreChartTitle = \"\",\n csatChartTitle = \"\",\n volumeChartTitle = \"\",\n // Sessions table\n sessions = [],\n sessionColumns = [],\n initialPageSize = 10,\n // Time-range chips state — mirrors PerformancePanel so the active chip /\n // Date Range highlight survives the navigation into the details page.\n // Callbacks are optional; when omitted the controls are display-only.\n selectedWindow = \"30d\",\n onWindowChange,\n dateRange,\n onDateRangeChange,\n // Server-side pagination for the sessions table. When all four are provided\n // the table switches to controlled / server-paginated mode and the host is\n // expected to refetch when the user changes page or page size.\n sessionsTotal = null,\n sessionsPage = null,\n sessionsPageSize = null,\n onSessionsPageChange,\n onSessionsPageSizeChange,\n // Fires when the user clicks the Export CSV button in the header. Disabled\n // if no handler is provided.\n onExport,\n // Fires when the user clicks a row in the sessions table.\n onSessionClick,\n // Fires whenever the user toggles columns in the sessions table's column\n // picker — hosts can scope their CSV export to whatever the user has visible.\n onSessionsVisibleColumnsChange,\n}) {\n const customRangeActive = !!(dateRange?.from && dateRange?.to);\n // 8h label uses a rolling window (now − 8h), same as the list panel. Hosts\n // often pass date-only startDate/endDate (midnight), which would render as\n // \"12:00 AM – 12:00 AM\"; derive the range locally instead.\n const eightHourRange = (() => {\n if (customRangeActive || selectedWindow !== \"8h\") return null;\n const range = getPresetWindowDates(\"8h\");\n return range ? formatEightHourRangeEndpoints(range.from, range.to) : null;\n })();\n const presetDateRange = (() => {\n if (customRangeActive || selectedWindow === \"8h\") return null;\n const range = getPresetWindowDates(selectedWindow);\n if (!range) return null;\n return {\n from: formatLocalDate(range.from),\n to: formatLocalDate(range.to),\n };\n })();\n\n // A chart card is only worth rendering when the host has something concrete\n // for it — either a headline value, a delta, or actual chart points. Without\n // that we'd ship empty frames with \"No data\" inside, which leaks library\n // demo copy. Hosts populate progressively; gallery passes everything.\n const showRow1 =\n hasChartData(baselineChart) || hasChartData(agentLiftChart) || hasChartData(scoreChart);\n const showRow2 = hasChartData(csatChart) || hasChartData(volumeChart);\n\n return (\n <div\n className={className}\n style={{\n background: C.white,\n fontFamily: FONT_BODY,\n color: C.ink,\n width: \"100%\",\n minWidth: 1192,\n boxSizing: \"border-box\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"23px 32px\",\n minHeight: 78,\n boxSizing: \"border-box\",\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 paddingLeft: 16,\n borderLeft: `1px solid ${C.border}`,\n flex: 1,\n minWidth: 0,\n alignSelf: \"stretch\",\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n <h1\n style={{\n fontFamily: FONT_DISPLAY,\n fontSize: 24,\n fontWeight: 400,\n color: C.ink,\n margin: 0,\n lineHeight: 1,\n whiteSpace: \"nowrap\",\n }}\n >\n {agentName}\n </h1>\n </div>\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_BODY,\n fontSize: 14,\n lineHeight: \"24px\",\n color: C.neutral800,\n flexShrink: 0,\n }}\n >\n <Download size={18} strokeWidth={1.75} />\n Export CSV\n </button>\n </div>\n\n <div\n style={{\n padding: \"0 32px 32px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n }}\n >\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n gap: 16,\n paddingLeft: 49,\n }}\n >\n <div style={{ display: \"flex\", gap: 16, alignItems: \"center\" }}>\n <div style={{ display: \"inline-flex\", alignItems: \"center\", gap: 6 }}>\n <CalendarDays size={14} color={C.ink} strokeWidth={1.75} style={{ flexShrink: 0 }} />\n <span\n style={{\n fontFamily: FONT_BODY,\n fontSize: 12,\n color: C.ink,\n lineHeight: 1.5,\n }}\n >\n {eightHourRange?.from ??\n presetDateRange?.from ??\n formatDisplayDate(startDate)}\n </span>\n <ArrowRight size={12} color={C.ink} strokeWidth={1.75} style={{ flexShrink: 0 }} />\n <span\n style={{\n fontFamily: FONT_BODY,\n fontSize: 12,\n color: C.ink,\n lineHeight: 1.5,\n }}\n >\n {eightHourRange?.to ??\n presetDateRange?.to ??\n formatDisplayDate(endDate)}\n </span>\n </div>\n <div style={{ display: \"inline-flex\", alignItems: \"center\", gap: 6 }}>\n <Phone size={14} color={C.ink} strokeWidth={1.75} style={{ flexShrink: 0 }} />\n <span\n style={{\n fontFamily: FONT_BODY,\n fontSize: 12,\n color: C.ink,\n lineHeight: 1.5,\n }}\n >\n {totalCalls}\n </span>\n </div>\n </div>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 10 }}>\n {[\n { id: \"8h\", label: \"8h\" },\n { id: \"1d\", label: \"1d\" },\n { id: \"7d\", label: \"7d\" },\n { id: \"30d\", label: \"30d\" },\n ].map((opt) => (\n <RangeChip\n key={opt.id}\n label={opt.label}\n active={!customRangeActive && opt.id === selectedWindow}\n onClick={() => onWindowChange?.(opt.id)}\n />\n ))}\n <DateRangeButton value={dateRange} onChange={onDateRangeChange} />\n </div>\n </div>\n\n <div\n style={{\n background: C.beige,\n border: `1px solid ${C.border}`,\n borderRadius: 8,\n padding: 16,\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n {[\n { key: \"baseline\", kpi: kpiBaseline },\n { key: \"agent-lift\", kpi: kpiAgentLift },\n { key: \"score\", kpi: kpiScore },\n ].map((col, i) => (\n <React.Fragment key={col.key}>\n {i > 0 ? (\n <ArrowRight\n size={20}\n color={C.ink}\n strokeWidth={1.75}\n style={{ flexShrink: 0, margin: \"0 24px\" }}\n />\n ) : null}\n <div\n style={{\n flex: 1,\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n minWidth: 0,\n }}\n >\n <KpiCell\n value={col.kpi.value}\n label={col.kpi.label}\n sub={col.kpi.sub}\n trend={col.kpi.trend}\n points={col.kpi.points}\n />\n </div>\n </React.Fragment>\n ))}\n </div>\n\n {showRow1 && (\n <div style={{ display: \"flex\", gap: 24 }}>\n {hasChartData(baselineChart) && (\n <ChartCard title={baselineChartTitle} value={baselineChart.value} delta={baselineChart.delta}>\n <CompassLineChart\n yLabels={baselineChart.yLabels}\n xLabels={baselineChart.xLabels}\n points={baselineChart.points}\n />\n </ChartCard>\n )}\n {hasChartData(agentLiftChart) && (\n <ChartCard title={agentLiftChartTitle} value={agentLiftChart.value} delta={agentLiftChart.delta}>\n <CompassLineChart\n yLabels={agentLiftChart.yLabels}\n xLabels={agentLiftChart.xLabels}\n points={agentLiftChart.points}\n />\n </ChartCard>\n )}\n {hasChartData(scoreChart) && (\n <ChartCard title={scoreChartTitle} value={scoreChart.value} delta={scoreChart.delta}>\n <CompassLineChart\n yLabels={scoreChart.yLabels}\n xLabels={scoreChart.xLabels}\n points={scoreChart.points}\n />\n </ChartCard>\n )}\n </div>\n )}\n\n {showRow2 && (\n <div style={{ display: \"flex\", gap: 24 }}>\n {hasChartData(csatChart) && (\n <ChartCard title={csatChartTitle} value={csatChart.value} delta={csatChart.delta}>\n <CompassLineChart\n yLabels={csatChart.yLabels}\n xLabels={csatChart.xLabels}\n points={csatChart.points}\n />\n </ChartCard>\n )}\n {hasChartData(volumeChart) && (\n <ChartCard title={volumeChartTitle} value={volumeChart.value} delta={volumeChart.delta}>\n <CompassLineChart\n yLabels={volumeChart.yLabels}\n xLabels={volumeChart.xLabels}\n points={volumeChart.points}\n />\n </ChartCard>\n )}\n </div>\n )}\n\n <div style={{ display: \"flex\", gap: 24, marginTop: 8, alignItems: \"flex-start\" }}>\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\", gap: 16, minWidth: 0 }}>\n <SectionHeading icon={ShieldCheck} title={strengthsTitle} iconColor={C.railCompliance} />\n <div style={{ display: \"flex\", flexDirection: \"column\", maxHeight: 480, overflowY: \"auto\" }}>\n {strengthItems.map((item, i) => (\n <AccordionRow key={i} {...item} />\n ))}\n </div>\n </div>\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\", gap: 16, minWidth: 0 }}>\n <SectionHeading icon={Lightbulb} title={guidanceTitle} iconColor={C.railCompliance} />\n <div style={{ display: \"flex\", flexDirection: \"column\", maxHeight: 480, overflowY: \"auto\" }}>\n {guidanceItems.map((item, i) => (\n <AccordionRow key={i} {...item} />\n ))}\n </div>\n </div>\n </div>\n\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 16, marginTop: 8 }}>\n <SectionHeading icon={Phone} title={callMixTitle} iconColor={C.railCompliance} />\n <div style={{ display: \"flex\", gap: 24, alignItems: \"flex-start\" }}>\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\", gap: 8, minWidth: 0 }}>\n <SubSectionHeading icon={FolderKanban} title={driversTitle} />\n <div style={{ display: \"flex\", flexDirection: \"column\", maxHeight: 480, overflowY: \"auto\" }}>\n {callDrivers.map((row, i) => (\n <PercentRow key={i} {...row} />\n ))}\n </div>\n </div>\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\", gap: 8, minWidth: 0 }}>\n <SubSectionHeading icon={Layers} title={paradigmsTitle} />\n <div style={{ display: \"flex\", flexDirection: \"column\", maxHeight: 480, overflowY: \"auto\" }}>\n {callParadigms.map((row, i) => (\n <PercentRow key={i} {...row} />\n ))}\n </div>\n </div>\n </div>\n </div>\n\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 16, marginTop: 8 }}>\n {sessionsTitle && (\n <span\n style={{\n fontFamily: FONT_DISPLAY,\n fontWeight: 600,\n fontSize: 16,\n color: C.ink,\n lineHeight: 1.2,\n }}\n >\n {sessionsTitle}\n </span>\n )}\n <DataTable2\n data={sessions}\n columns={sessionColumns}\n initialPageSize={initialPageSize}\n totalCount={sessionsTotal}\n page={sessionsPage}\n pageSize={sessionsPageSize}\n onPageChange={onSessionsPageChange}\n onPageSizeChange={onSessionsPageSizeChange}\n onRowClick={onSessionClick}\n onVisibleColumnsChange={onSessionsVisibleColumnsChange}\n />\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n Download,\n ChevronDown,\n CalendarDays,\n Search,\n ChevronLeft,\n ChevronRight,\n TrendingUp,\n Lightbulb,\n ShieldCheck,\n Phone,\n Signal,\n FolderKanban,\n Layers,\n Check,\n} from \"lucide-react\";\nimport DataTable2 from \"../data/DataTable2\";\nimport PerformanceDetailsPage from \"./PerformanceDetailsPage\";\nimport {\n RANGE_TO_MS,\n computeWindowLabel,\n formatLocalDate,\n} from \"./performanceRangeFormat\";\nimport {\n SPARK_DEFAULT_AREA,\n SPARK_DEFAULT_LINE,\n buildSparkPaths,\n trendFromPoints,\n} from \"./performanceSparkline\";\n\nconst EMPTY_STAT = { value: \"\", label: \"\", trend: \"up\" };\n\n// Color values resolve to CSS variables declared in `src/tokens/colors.css`.\n// Anything new added here MUST first be added to that file as a `--*` token.\nconst C = {\n ink: \"var(--color-text)\",\n muted: \"var(--color-text-secondary)\",\n border: \"var(--grey-absent)\",\n borderSubtle: \"var(--neutral-100)\",\n iconCircle: \"var(--surface-hover)\",\n black: \"var(--neutral-900)\",\n white: \"var(--grey-white)\",\n green: \"var(--color-green)\",\n red: \"var(--color-red-strong)\",\n neutralBorder: \"var(--neutral-250)\",\n neutralLight: \"var(--neutral-100)\",\n beige: \"var(--surface-warm-40)\",\n // Extras needed by inline literals in this file:\n neutral800: \"var(--neutral-800)\", // button/text label grey\n textInk: \"var(--text-ink)\", // body subtitle (#1E2125)\n textFaintGrey: \"var(--text-faint-grey)\", // disabled calendar day text\n hoverWarm40: \"var(--hover-warm-40)\", // calendar in-range highlight\n shadowPopover: \"var(--shadow-popover)\",\n shadowDropdown: \"var(--shadow-dropdown)\",\n railCompliance: \"var(--rail-compliance)\", // section icon accent\n};\n\nconst FONT_DISPLAY = \"var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)\";\nconst FONT_BODY = \"var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)\";\n\nfunction Sparkline({ trend = \"up\", points, width = 49.618, height = 35 }) {\n const id = React.useId();\n const built = buildSparkPaths(points);\n const linePath = built ? built.line : SPARK_DEFAULT_LINE;\n const areaPath = built ? built.area : SPARK_DEFAULT_AREA;\n const direction = trendFromPoints(points) ?? trend;\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: !built && direction === \"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={!built && direction === \"down\" ? \"2 4\" : undefined}\n />\n </svg>\n );\n}\n\nfunction resolveStatTrend(trend, points) {\n return trendFromPoints(points) ?? (trend === \"down\" ? \"down\" : \"up\");\n}\n\nfunction TrendArrow({ direction = \"up\", color = C.muted }) {\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 width={18} height={9.5} viewBox=\"0 0 19 10\" fill=\"none\" style={{ flexShrink: 0 }}>\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\", points, muted = false, beigeBg = false, style = {} }) {\n const direction = resolveStatTrend(trend, points);\n return (\n <div\n style={{\n background: beigeBg ? C.beige : 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={direction} points={points} />\n <TrendArrow direction={direction} />\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: muted ? C.muted : C.ink,\n letterSpacing: \"-0.01em\",\n }}\n >\n {value}\n </div>\n <div style={{ fontFamily: FONT_BODY, fontSize: 13, color: C.ink, lineHeight: \"1.2\" }}>{label}</div>\n </div>\n </div>\n );\n}\n\nfunction StatSubCell({ value, label, trend = \"up\", points, withDivider = false }) {\n const direction = resolveStatTrend(trend, points);\n return (\n <div\n style={{\n flex: 1,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n paddingLeft: withDivider ? 24 : 0,\n borderLeft: withDivider ? `1px solid ${C.border}` : \"none\",\n minWidth: 0,\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"flex-start\", justifyContent: \"space-between\" }}>\n <Sparkline trend={direction} points={points} />\n <TrendArrow direction={direction} />\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.muted,\n letterSpacing: \"-0.01em\",\n }}\n >\n {value}\n </div>\n <div style={{ fontFamily: FONT_BODY, fontSize: 13, color: C.ink, lineHeight: \"1.2\" }}>{label}</div>\n </div>\n </div>\n );\n}\n\nfunction FilterButton({ icon: Icon, children, trailing: Trailing }) {\n return (\n <button\n type=\"button\"\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: \"pointer\",\n fontFamily: FONT_BODY,\n fontSize: 14,\n color: C.neutral800,\n whiteSpace: \"nowrap\",\n }}\n >\n {Icon && <Icon size={18} strokeWidth={1.75} />}\n {children}\n {Trailing && <Trailing size={16} strokeWidth={2} />}\n </button>\n );\n}\n\nconst MONTH_NAMES = [\n \"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n \"July\", \"August\", \"September\", \"October\", \"November\", \"December\",\n];\nconst DOW_LABELS = [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"];\n\nfunction startOfDay(d) {\n const x = new Date(d);\n x.setHours(0, 0, 0, 0);\n return x;\n}\n\nfunction buildCalendarGrid(year, month) {\n // Returns 42 dates (6 weeks). Leading/trailing days are from neighbour months.\n const first = new Date(year, month, 1);\n const startWeekday = first.getDay();\n const gridStart = new Date(year, month, 1 - startWeekday);\n return Array.from({ length: 42 }, (_, i) => {\n const d = new Date(gridStart);\n d.setDate(gridStart.getDate() + i);\n return d;\n });\n}\n\nfunction DateRangePopover({ value, onApply, onClose, anchorRef }) {\n const popoverRef = React.useRef(null);\n const [from, setFrom] = React.useState(value?.from ? startOfDay(value.from) : null);\n const [to, setTo] = React.useState(value?.to ? startOfDay(value.to) : null);\n const initialMonth = from || new Date();\n const [viewYear, setViewYear] = React.useState(initialMonth.getFullYear());\n const [viewMonth, setViewMonth] = React.useState(initialMonth.getMonth());\n const [pos, setPos] = React.useState({ top: 0, left: 0 });\n\n // Position under the trigger (right-aligned so it doesn't overflow viewport).\n // Recomputed on scroll/resize so the popover stays attached to the button\n // when the page scrolls — same pattern as the Columns dropdown in DataTable2.\n React.useLayoutEffect(() => {\n const updatePosition = () => {\n if (!anchorRef?.current) return;\n const r = anchorRef.current.getBoundingClientRect();\n const POPOVER_WIDTH = 320;\n setPos({\n top: r.bottom + 6,\n left: Math.max(8, r.right - POPOVER_WIDTH),\n });\n };\n updatePosition();\n window.addEventListener(\"scroll\", updatePosition, true);\n window.addEventListener(\"resize\", updatePosition);\n return () => {\n window.removeEventListener(\"scroll\", updatePosition, true);\n window.removeEventListener(\"resize\", updatePosition);\n };\n }, [anchorRef]);\n\n // Close on outside click / Escape.\n React.useEffect(() => {\n const handleClick = (e) => {\n if (popoverRef.current?.contains(e.target)) return;\n if (anchorRef?.current?.contains(e.target)) return;\n onClose();\n };\n const handleKey = (e) => { if (e.key === \"Escape\") onClose(); };\n document.addEventListener(\"mousedown\", handleClick);\n document.addEventListener(\"keydown\", handleKey);\n return () => {\n document.removeEventListener(\"mousedown\", handleClick);\n document.removeEventListener(\"keydown\", handleKey);\n };\n }, [onClose, anchorRef]);\n\n const days = buildCalendarGrid(viewYear, viewMonth);\n const today = startOfDay(new Date());\n\n const handleDayClick = (d) => {\n const day = startOfDay(d);\n // Block future dates — they'd never be valid for \"data up to now\" filters.\n if (day > today) return;\n if (!from || (from && to)) {\n setFrom(day);\n setTo(null);\n } else if (day < from) {\n setFrom(day);\n } else {\n setTo(day);\n }\n };\n\n const goPrev = () => {\n if (viewMonth === 0) { setViewMonth(11); setViewYear(viewYear - 1); }\n else setViewMonth(viewMonth - 1);\n };\n const goNext = () => {\n if (viewMonth === 11) { setViewMonth(0); setViewYear(viewYear + 1); }\n else setViewMonth(viewMonth + 1);\n };\n\n const isInRange = (d) => from && to && d >= from && d <= to;\n const isEdge = (d) => (from && d.getTime() === from.getTime()) || (to && d.getTime() === to.getTime());\n\n return createPortal(\n <div\n ref={popoverRef}\n style={{\n position: \"fixed\",\n top: pos.top,\n left: pos.left,\n width: 320,\n background: C.white,\n border: `1px solid ${C.borderSubtle}`,\n borderRadius: 12,\n boxShadow: C.shadowPopover,\n padding: 16,\n zIndex: 9999,\n fontFamily: FONT_BODY,\n }}\n >\n {/* Month header with prev/next */}\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", marginBottom: 12 }}>\n <button type=\"button\" onClick={goPrev} style={navBtnStyle} aria-label=\"Previous month\">\n <ChevronLeft size={18} strokeWidth={1.75} />\n </button>\n <div style={{ fontSize: 14, fontWeight: 600, color: C.ink }}>\n {MONTH_NAMES[viewMonth]} {viewYear}\n </div>\n <button type=\"button\" onClick={goNext} style={navBtnStyle} aria-label=\"Next month\">\n <ChevronRight size={18} strokeWidth={1.75} />\n </button>\n </div>\n\n {/* Day-of-week header */}\n <div style={{ display: \"grid\", gridTemplateColumns: \"repeat(7, 1fr)\", gap: 2, marginBottom: 4 }}>\n {DOW_LABELS.map((d) => (\n <div key={d} style={{ textAlign: \"center\", fontSize: 12, color: C.muted, padding: \"4px 0\" }}>\n {d}\n </div>\n ))}\n </div>\n\n {/* Day grid */}\n <div style={{ display: \"grid\", gridTemplateColumns: \"repeat(7, 1fr)\", gap: 2 }}>\n {days.map((d) => {\n const inMonth = d.getMonth() === viewMonth;\n const inRange = isInRange(d);\n const edge = isEdge(d);\n const isToday = d.getTime() === today.getTime();\n const isFuture = d > today;\n return (\n <button\n key={d.toISOString()}\n type=\"button\"\n onClick={() => handleDayClick(d)}\n disabled={isFuture}\n aria-disabled={isFuture}\n style={{\n height: 36,\n border: \"none\",\n borderRadius: 8,\n background: edge ? C.black : inRange ? C.hoverWarm40 : \"transparent\",\n color: edge ? C.white : isFuture ? C.textFaintGrey : inMonth ? C.ink : C.muted,\n fontFamily: FONT_BODY,\n fontSize: 13,\n fontWeight: isToday ? 500 : 400,\n cursor: isFuture ? \"not-allowed\" : \"pointer\",\n opacity: isFuture ? 0.6 : 1,\n }}\n >\n {d.getDate()}\n </button>\n );\n })}\n </div>\n\n {/* Footer */}\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", marginTop: 12, paddingTop: 12, borderTop: `1px solid ${C.borderSubtle}` }}>\n <button\n type=\"button\"\n onClick={() => { setFrom(null); setTo(null); }}\n style={{ background: \"transparent\", border: \"none\", padding: 0, cursor: \"pointer\", fontSize: 14, fontWeight: 500, color: C.ink }}\n >\n Clear\n </button>\n <button\n type=\"button\"\n disabled={!from || !to}\n onClick={() => { onApply({ from, to }); onClose(); }}\n style={{\n background: !from || !to ? C.neutralBorder : C.black,\n color: C.white,\n border: \"none\",\n borderRadius: 10,\n height: 30,\n padding: \"0 16px\",\n fontFamily: FONT_BODY,\n fontSize: 14,\n fontWeight: 600,\n cursor: !from || !to ? \"not-allowed\" : \"pointer\",\n }}\n >\n Apply\n </button>\n </div>\n </div>,\n document.body,\n );\n}\n\nconst navBtnStyle = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 28,\n height: 28,\n border: \"none\",\n background: \"transparent\",\n borderRadius: 6,\n cursor: \"pointer\",\n color: C.ink,\n};\n\nfunction DateRangeButton({ value, onChange }) {\n const [open, setOpen] = React.useState(false);\n const triggerRef = React.useRef(null);\n // Highlighted only after the user clicks Apply in the popover (i.e. once a\n // custom date range is committed). Just opening the popover does not\n // activate the button — same active treatment as the 30d/8h/1d/7d chips.\n const active = !!(value?.from && value?.to);\n return (\n <>\n <button\n ref={triggerRef}\n type=\"button\"\n onClick={() => setOpen((o) => !o)}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n height: 32,\n padding: \"0 16px\",\n borderRadius: 10,\n border: active ? \"none\" : `1px solid ${C.neutralBorder}`,\n background: active ? C.black : C.white,\n cursor: \"pointer\",\n fontFamily: FONT_BODY,\n fontSize: 14,\n color: active ? C.white : C.neutral800,\n fontWeight: active ? 600 : 400,\n whiteSpace: \"nowrap\",\n }}\n >\n <CalendarDays size={18} strokeWidth={1.75} />\n Date Range\n </button>\n {open && (\n <DateRangePopover\n value={value}\n anchorRef={triggerRef}\n onClose={() => setOpen(false)}\n onApply={(range) => onChange?.(range)}\n />\n )}\n </>\n );\n}\n\nexport { DateRangeButton };\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_BODY,\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\nfunction SearchBar() {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n height: 32,\n width: 260,\n padding: \"0 12px\",\n borderRadius: 11,\n background: C.white,\n border: `1px solid ${C.neutralLight}`,\n }}\n >\n <Search size={16} strokeWidth={2} style={{ color: \"var(--neutral-400)\" }} />\n <input\n placeholder=\"Search\"\n style={{\n flex: 1,\n border: \"none\",\n outline: \"none\",\n background: \"transparent\",\n fontFamily: FONT_BODY,\n fontSize: 14,\n color: C.ink,\n }}\n />\n </div>\n );\n}\n\nfunction CompassRating({ 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: \"flex\", gap: 4 }}>\n {Array.from({ length: max }).map((_, i) => {\n if (i < full) {\n return (\n <span\n key={i}\n style={{\n width: 10,\n height: 10,\n borderRadius: \"50%\",\n background: C.black,\n display: \"inline-block\",\n }}\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\n style={{\n width: 6,\n height: 6,\n borderRadius: \"50%\",\n background: C.black,\n display: \"inline-block\",\n }}\n />\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 display: \"inline-block\",\n boxSizing: \"border-box\",\n }}\n />\n );\n })}\n </div>\n );\n}\n\nexport const DEFAULT_AGENT_COLUMNS = [\n { id: \"agent\", label: \"Agent\", width: 180, sortable: true, filterable: true },\n { id: \"supervisor\", label: \"Supervisor\", width: 170, sortable: true, filterable: true },\n { id: \"calls\", label: \"Calls\", width: 100, sortable: true },\n { id: \"baseline\", label: \"Baseline\", width: 110, sortable: true },\n { id: \"lift\", label: \"Lift\", width: 100, sortable: true },\n { id: \"score\", label: \"Score\", width: 100, sortable: true, filterable: true, filterType: \"number\" },\n {\n id: \"compass\",\n label: \"Compass Score\",\n width: 200,\n sortable: true,\n filterable: true,\n filterType: \"number\",\n render: (value) => (\n <span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 12 }}>\n <span style={{ minWidth: 32 }}>{value}</span>\n <CompassRating value={typeof value === \"number\" ? value : 0} />\n </span>\n ),\n },\n { id: \"totalDuration\", label: \"Total Duration\", width: 150, sortable: true, filterable: true, filterType: \"duration\", filterShowPresets: false },\n { id: \"avgDuration\", label: \"Average Duration\", width: 170, sortable: true, filterable: true, filterType: \"duration\", filterShowPresets: false },\n];\n\n\nfunction SectionHeading({ icon: Icon, title, trailing, iconColor = C.ink, bordered = false }) {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n width: \"100%\",\n paddingBottom: bordered ? 12 : 0,\n borderBottom: bordered ? `1px solid ${C.border}` : \"none\",\n }}\n >\n <div\n style={{\n width: 24,\n height: 24,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n <Icon size={22} strokeWidth={1.75} style={{ color: iconColor }} />\n </div>\n <div\n style={{\n flex: 1,\n fontFamily: FONT_DISPLAY,\n fontWeight: 600,\n fontSize: 16,\n color: C.ink,\n lineHeight: \"1.2\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.02em\",\n }}\n >\n {title}\n </div>\n {trailing && (\n <div style={{ fontFamily: FONT_BODY, fontSize: 14, color: C.ink }}>{trailing}</div>\n )}\n </div>\n );\n}\n\nfunction SubSectionHeading({ icon: Icon, title }) {\n return (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 16, width: \"100%\" }}>\n <div\n style={{\n width: 34,\n height: 34,\n borderRadius: 9999,\n background: C.iconCircle,\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 fontFamily: FONT_DISPLAY,\n fontWeight: 600,\n fontSize: 16,\n color: C.ink,\n lineHeight: \"24px\",\n }}\n >\n {title}\n </span>\n </div>\n );\n}\n\nfunction AccordionItem({ title, summary, calls, percent, bullets, defaultExpanded = false }) {\n const [expanded, setExpanded] = React.useState(defaultExpanded);\n const rows = Array.isArray(bullets) ? bullets : [];\n // Outer container is a div (not a button) so the bullet rows inside can\n // hold <a> link elements without nesting interactive HTML — clicking\n // the header still toggles via the inner button below.\n return (\n <div style={{ borderTop: `1px solid ${C.border}` }}>\n <button\n type=\"button\"\n onClick={() => setExpanded((v) => !v)}\n aria-expanded={expanded}\n style={{\n border: \"none\",\n background: \"transparent\",\n padding: 16,\n display: \"flex\",\n gap: 12,\n alignItems: \"flex-start\",\n cursor: \"pointer\",\n width: \"100%\",\n textAlign: \"left\",\n fontFamily: FONT_BODY,\n }}\n >\n <div\n style={{\n flex: 1,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 12,\n minWidth: 0,\n }}\n >\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 12 }}>\n <div\n style={{\n fontFamily: FONT_DISPLAY,\n fontWeight: 600,\n fontSize: 14,\n color: C.black,\n lineHeight: \"24px\",\n }}\n >\n {title}\n </div>\n <div style={{ fontFamily: FONT_BODY, fontSize: 14, color: C.muted, lineHeight: \"24px\" }}>\n {summary}\n </div>\n </div>\n <div style={{ display: \"flex\", gap: 16 }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n <Phone size={14} color={C.ink} strokeWidth={1.75} />\n <span style={{ fontFamily: FONT_BODY, fontSize: 12, color: C.ink, lineHeight: 1.5 }}>\n {calls}\n </span>\n </div>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n <TrendingUp size={14} color={C.ink} strokeWidth={1.75} />\n <span style={{ fontFamily: FONT_BODY, fontSize: 12, color: C.ink, lineHeight: 1.5 }}>\n {percent}\n </span>\n </div>\n </div>\n </div>\n <ChevronDown\n size={20}\n color={C.ink}\n strokeWidth={2}\n style={{\n flexShrink: 0,\n transform: expanded ? \"rotate(180deg)\" : \"none\",\n transition: \"transform 150ms ease\",\n }}\n />\n </button>\n {expanded && rows.length > 0 && (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 12,\n padding: \"0 16px 16px\",\n }}\n >\n {rows.map((b, i) => (\n <div\n key={i}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n fontFamily: FONT_BODY,\n fontSize: 14,\n color: C.ink,\n lineHeight: \"24px\",\n gap: 16,\n }}\n >\n {b.href ? (\n <a\n href={b.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n color: C.ink,\n textDecoration: \"underline\",\n textUnderlineOffset: 2,\n textDecorationColor: C.border,\n minWidth: 0,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {b.text}\n </a>\n ) : (\n <span\n style={{\n minWidth: 0,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {b.text}\n </span>\n )}\n <span style={{ display: \"inline-flex\", gap: 4, whiteSpace: \"nowrap\" }}>\n <span style={{ color: C.ink }}>{b.citation}</span>\n <span style={{ color: C.muted }}>({b.date})</span>\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction PercentRow({ label, value }) {\n return (\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n padding: \"12px 0\",\n borderBottom: `1px solid ${C.border}`,\n fontFamily: FONT_BODY,\n fontSize: 13,\n lineHeight: \"24px\",\n }}\n >\n <span style={{ color: C.ink }}>{label}</span>\n <span style={{ color: C.muted }}>{value}</span>\n </div>\n );\n}\n\nfunction EmptyState({ message = \"\" }) {\n if (!message) return null;\n return (\n <div\n style={{\n padding: \"16px 0\",\n fontFamily: FONT_BODY,\n fontSize: 13,\n color: C.muted,\n lineHeight: 1.5,\n }}\n >\n {message}\n </div>\n );\n}\n\nexport default function PerformancePanel({\n className = \"\",\n onAgentClick,\n // Header text — empty defaults so host apps don't see demo copy. Hosts pass\n // their own page title / subtitle (the gallery in dev/App.jsx demonstrates\n // the intended \"Performance\" / \"Agent performance metrics...\" wording).\n title = \"\",\n subtitle = \"\",\n dateRangeLabel = \"\",\n // View-by dropdown. `initialViewBy` seeds internal state on mount;\n // `onViewByChange(id)` fires when the user selects a different option.\n viewByOptions = [],\n initialViewBy = \"\",\n onViewByChange,\n // Label rendered above the View-by option list inside the popover. Empty by\n // default; the gallery passes \"Aggregated By\" to reproduce the Figma copy.\n aggregatedByLabel = \"\",\n // KPI strip\n volumeStat = EMPTY_STAT,\n compassStat = EMPTY_STAT,\n baselineSubStat = EMPTY_STAT,\n agentLiftSubStat = EMPTY_STAT,\n scoreSubStat = EMPTY_STAT,\n // Agent table\n agentRows = [],\n agentColumns = [],\n initialPageSize = 10,\n // Insight sections — all titles, empty-state copy, and the section icons /\n // colors are host-driven so the library renders nothing concrete by default.\n guidanceItems = [],\n strengthItems = [],\n callDrivers = [],\n callParadigms = [],\n topSignalsLeft = [],\n topSignalsRight = [],\n topSignalsTrailing = \"\",\n strengthsTitle = \"\",\n guidanceTitle = \"\",\n callMixTitle = \"\",\n driversTitle = \"\",\n paradigmsTitle = \"\",\n topSignalsTitle = \"\",\n emptyStrengthsMessage = \"\",\n emptyGuidanceMessage = \"\",\n emptyDriversMessage = \"\",\n emptyParadigmsMessage = \"\",\n emptyTopSignalsMessage = \"\",\n // Time-range chips (8h / 1d / 7d / 30d). Override `rangeOptions` to customize.\n // `selectedWindow` is the currently-active option id; `onWindowChange(id)` fires\n // 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 // (Same slot pattern as DataTableFilters2's `dateRangePicker` prop.)\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 // Fires when the user clicks the Export CSV button in the header.\n onExport,\n // Fires whenever the user toggles columns in the table's column picker —\n // hosts can scope their CSV export to whatever the user has visible.\n onVisibleColumnsChange,\n}) {\n const [selectedAgent, setSelectedAgent] = React.useState(null);\n const [viewByOpen, setViewByOpen] = React.useState(false);\n const [viewBy, setViewBy] = React.useState(initialViewBy);\n // Internal fallback for the custom date range when the host doesn't pass\n // `dateRange` / `onDateRangeChange`. Lifted up to this component (rather\n // than living inside DateRangeButton) so the time-range chips can become\n // mutually exclusive with 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 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 const viewByTriggerRef = React.useRef(null);\n const viewByPopoverRef = React.useRef(null);\n\n React.useEffect(() => {\n if (!viewByOpen) return;\n const handler = (e) => {\n if (\n viewByPopoverRef.current?.contains(e.target) ||\n viewByTriggerRef.current?.contains(e.target)\n ) {\n return;\n }\n setViewByOpen(false);\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [viewByOpen]);\n\n const viewByLabel =\n viewByOptions.find((o) => o.id === viewBy)?.label || (viewByOptions[0]?.label ?? \"\");\n\n const handleRowClick = (row) => {\n if (onAgentClick) {\n onAgentClick(row);\n return;\n }\n setSelectedAgent(row);\n };\n\n // Keep the panel (including DataTable2) mounted while a details page is shown,\n // so filters / sort / pagination are preserved when the user navigates back.\n return (\n <>\n {selectedAgent && (() => {\n // Compute the start/end the details page should show. Custom range\n // wins; otherwise derive from the selected window so the chip view\n // and the date display stay consistent across the two pages.\n let detailsFrom = null;\n let detailsTo = null;\n if (customRangeActive) {\n detailsFrom = effectiveDateRange.from;\n detailsTo = effectiveDateRange.to;\n } else {\n const ms = RANGE_TO_MS[selectedWindow];\n if (ms) {\n detailsTo = new Date();\n detailsFrom = new Date(detailsTo.getTime() - ms);\n }\n }\n return (\n <PerformanceDetailsPage\n className={className}\n agentName={selectedAgent.agent}\n startDate={detailsFrom || \"\"}\n endDate={detailsTo || \"\"}\n totalCalls={`${selectedAgent.calls} Calls`}\n onBack={() => setSelectedAgent(null)}\n selectedWindow={selectedWindow}\n dateRange={effectiveDateRange}\n />\n );\n })()}\n <div\n className={className}\n style={{\n background: C.white,\n fontFamily: FONT_BODY,\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) when drilling into agent details so DataTable2's\n // internal filter / sort / pagination state survives the round trip.\n display: selectedAgent ? \"none\" : \"flex\",\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"flex-start\", gap: 8, paddingTop: 12 }}>\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\", gap: 4 }}>\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 }}\n >\n {title}\n </h1>\n <p style={{ fontFamily: FONT_BODY, fontSize: 14, color: \"var(--neutral-950)\", margin: 0, lineHeight: \"1.4\" }}>\n {subtitle}\n </p>\n </div>\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_BODY,\n fontSize: 14,\n color: C.neutral800,\n }}\n >\n <Download size={18} strokeWidth={1.75} />\n Export CSV\n </button>\n </div>\n\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\" }}>\n <div style={{ position: \"relative\" }}>\n <button\n type=\"button\"\n ref={viewByTriggerRef}\n onClick={() => setViewByOpen((v) => !v)}\n aria-haspopup=\"listbox\"\n aria-expanded={viewByOpen}\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: \"pointer\",\n fontFamily: FONT_BODY,\n fontSize: 14,\n lineHeight: \"24px\",\n color: C.neutral800,\n whiteSpace: \"nowrap\",\n }}\n >\n {viewByLabel}\n <ChevronDown\n size={20}\n strokeWidth={1.75}\n style={{\n transform: viewByOpen ? \"rotate(180deg)\" : \"none\",\n transition: \"transform 120ms ease\",\n }}\n />\n </button>\n {viewByOpen && (\n <div\n ref={viewByPopoverRef}\n role=\"listbox\"\n style={{\n position: \"absolute\",\n top: 36,\n left: 0,\n zIndex: 20,\n background: C.white,\n border: `1px solid ${C.border}`,\n borderRadius: 4,\n boxShadow: C.shadowDropdown,\n display: \"flex\",\n flexDirection: \"column\",\n minWidth: 144,\n fontFamily: FONT_BODY,\n }}\n >\n {aggregatedByLabel && (\n <div\n style={{\n padding: 12,\n fontFamily: FONT_DISPLAY,\n fontWeight: 600,\n fontSize: 13,\n color: C.ink,\n lineHeight: 1.2,\n }}\n >\n {aggregatedByLabel}\n </div>\n )}\n {viewByOptions.map((opt) => {\n const isSelected = viewBy === opt.id;\n return (\n <button\n key={opt.id}\n type=\"button\"\n role=\"option\"\n aria-selected={isSelected}\n onClick={() => {\n if (opt.id !== viewBy) {\n setViewBy(opt.id);\n onViewByChange?.(opt.id);\n }\n setViewByOpen(false);\n }}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: isSelected ? 12 : \"12px 12px 12px 40px\",\n borderTop: `1px solid ${C.border}`,\n borderLeft: \"none\",\n borderRight: \"none\",\n borderBottom: \"none\",\n background: \"transparent\",\n cursor: \"pointer\",\n textAlign: \"left\",\n fontFamily: FONT_BODY,\n fontSize: 13,\n lineHeight: 1.2,\n color: C.ink,\n width: \"100%\",\n }}\n >\n {isSelected && (\n <Check size={20} color={C.ink} strokeWidth={1.75} style={{ flexShrink: 0 }} />\n )}\n <span>{opt.label}</span>\n </button>\n );\n })}\n </div>\n )}\n </div>\n <div style={{ display: \"flex\", gap: 10, alignItems: \"center\" }}>\n {(() => {\n // Custom range wins if active; otherwise the active chip drives the\n // label. Chip label wins over `dateRangeLabel` so hosts aren't stuck\n // showing date-only strings for 8h when they pass a legacy override.\n const customLabel = customRangeActive\n ? `${formatLocalDate(effectiveDateRange.from)} – ${formatLocalDate(effectiveDateRange.to)}`\n : \"\";\n const label =\n customLabel ||\n computeWindowLabel(selectedWindow) ||\n dateRangeLabel;\n return label ? (\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n fontFamily: FONT_BODY,\n fontSize: 13,\n color: C.ink,\n }}\n >\n <CalendarDays size={16} strokeWidth={1.75} color={C.muted} />\n {label}\n </span>\n ) : null;\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 <React.Suspense\n fallback={<FilterButton icon={CalendarDays}>Date Range</FilterButton>}\n >\n {dateRangePicker}\n </React.Suspense>\n ) : (\n <DateRangeButton value={effectiveDateRange} onChange={handleDateRangeChange} />\n )}\n {/* <SearchBar /> */}\n </div>\n </div>\n\n <div style={{ display: \"flex\", gap: 24 }}>\n <StatCard value={volumeStat.value} label={volumeStat.label} trend={volumeStat.trend} points={volumeStat.points} style={{ width: 264, flexShrink: 0 }} />\n <StatCard value={compassStat.value} label={compassStat.label} trend={compassStat.trend} points={compassStat.points} style={{ width: 264, flexShrink: 0 }} />\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 gap: 24,\n alignItems: \"stretch\",\n boxSizing: \"border-box\",\n }}\n >\n <StatSubCell value={baselineSubStat.value} label={baselineSubStat.label} trend={baselineSubStat.trend} points={baselineSubStat.points} />\n <StatSubCell value={agentLiftSubStat.value} label={agentLiftSubStat.label} trend={agentLiftSubStat.trend} points={agentLiftSubStat.points} withDivider />\n <StatSubCell value={scoreSubStat.value} label={scoreSubStat.label} trend={scoreSubStat.trend} points={scoreSubStat.points} withDivider />\n </div>\n </div>\n\n <DataTable2\n data={agentRows}\n columns={agentColumns}\n initialPageSize={initialPageSize}\n onRowClick={handleRowClick}\n onVisibleColumnsChange={onVisibleColumnsChange}\n />\n\n <div style={{ display: \"flex\", gap: 24, alignItems: \"flex-start\" }}>\n <div style={{ flex: 1, minWidth: 0, display: \"flex\", flexDirection: \"column\", gap: 16 }}>\n <SectionHeading icon={ShieldCheck} title={strengthsTitle} iconColor=\"var(--rail-compliance)\" />\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n borderBottom: `1px solid ${C.border}`,\n maxHeight: 480,\n overflowY: \"auto\",\n }}\n >\n {strengthItems.length === 0 ? (\n <EmptyState message={emptyStrengthsMessage} />\n ) : (\n strengthItems.map((item, i) => <AccordionItem key={i} {...item} />)\n )}\n </div>\n </div>\n <div style={{ flex: 1, minWidth: 0, display: \"flex\", flexDirection: \"column\", gap: 16 }}>\n <SectionHeading icon={Lightbulb} title={guidanceTitle} iconColor=\"var(--rail-compliance)\" />\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n borderBottom: `1px solid ${C.border}`,\n maxHeight: 480,\n overflowY: \"auto\",\n }}\n >\n {guidanceItems.length === 0 ? (\n <EmptyState message={emptyGuidanceMessage} />\n ) : (\n guidanceItems.map((item, i) => <AccordionItem key={i} {...item} />)\n )}\n </div>\n </div>\n </div>\n\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 16 }}>\n <SectionHeading icon={Phone} title={callMixTitle} iconColor=\"var(--rail-compliance)\" />\n <div style={{ display: \"flex\", gap: 24, alignItems: \"flex-start\" }}>\n <div style={{ flex: 1, minWidth: 0, display: \"flex\", flexDirection: \"column\", gap: 8 }}>\n <SubSectionHeading icon={FolderKanban} title={driversTitle} />\n <div style={{ display: \"flex\", flexDirection: \"column\", maxHeight: 480, overflowY: \"auto\" }}>\n {callDrivers.length === 0 ? (\n <EmptyState message={emptyDriversMessage} />\n ) : (\n callDrivers.map((row, i) => <PercentRow key={i} {...row} />)\n )}\n </div>\n </div>\n <div style={{ flex: 1, minWidth: 0, display: \"flex\", flexDirection: \"column\", gap: 8 }}>\n <SubSectionHeading icon={Layers} title={paradigmsTitle} />\n <div style={{ display: \"flex\", flexDirection: \"column\", maxHeight: 480, overflowY: \"auto\" }}>\n {callParadigms.length === 0 ? (\n <EmptyState message={emptyParadigmsMessage} />\n ) : (\n callParadigms.map((row, i) => <PercentRow key={i} {...row} />)\n )}\n </div>\n </div>\n </div>\n </div>\n\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 16 }}>\n <SectionHeading icon={Signal} title={topSignalsTitle} iconColor=\"var(--rail-compliance)\" trailing={topSignalsTrailing} bordered />\n {topSignalsLeft.length === 0 && topSignalsRight.length === 0 ? (\n <EmptyState message={emptyTopSignalsMessage} />\n ) : (\n <div style={{ display: \"flex\", gap: 24 }}>\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\" }}>\n {topSignalsLeft.map((row, i) => (\n <PercentRow key={i} {...row} />\n ))}\n </div>\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\" }}>\n {topSignalsRight.map((row, i) => (\n <PercentRow key={i} {...row} />\n ))}\n </div>\n </div>\n )}\n </div>\n </div>\n </>\n );\n}\n"],"names":["RANGE_TO_MS","LOCALE","DATE_OPTS","TIME_OPTS","coalesceToDate","input","str","ymd","d","parsed","isSameLocalCalendarDay","a","b","formatLocalDate","date","formatLocalTime","formatLocalDateTime","formatEightHourWindowLabel","from","to","f","t","formatEightHourRangeEndpoints","getPresetWindowDates","windowId","ms","computeWindowLabel","range","SPARK_DEFAULT_LINE","SPARK_DEFAULT_AREA","normalizeSparkPoints","points","numeric","p","n","buildSparkPaths","vbW","vbH","min","max","padY","span","usableH","sx","i","sy","v","line","lastX","firstX","area","trendFromPoints","first","last","METRIC_PLACEHOLDER","isNullishMetric","value","hasMeaningfulMetric","formatMetricDisplay","fallback","hasHostMetricField","hasChartData","chart","trendFromSignedValue","text","parenMatch","resolveTrend","trend","signedText","resolveKpiTrend","C","FONT_DISPLAY","FONT_BODY","TrendArrow","direction","color","upPath","downPath","jsx","formatDisplayDate","opts","Sparkline","empty","width","height","id","React","built","linePath","areaPath","jsxs","KpiCell","label","sub","displayValue","hasData","RangeChip","active","onClick","CompassLineChart","yLabelsProp","xLabels","highlightIndex","hoveredPoint","setHoveredPoint","gradId","MAX_X_TICKS","allXLabels","visibleXLabels","_","gridCount","gridXs","gx","dataPairs","y","yValues","yDataMin","yDataMax","yPad","yMin","yMax","ySpan","normalized","yLabels","abs","decimals","minX","xSpan","xPad","innerWidth","formatPointValue","highlight","l","isHighlight","_a","ChartCard","title","delta","children","showDelta","deltaTrend","SectionHeading","Icon","trailing","iconColor","bordered","CitationRow","bullet","citation","href","AccordionRow","summary","calls","percent","bullets","defaultExpanded","expanded","setExpanded","trailingRaw","showTrailing","TrendIcon","TrendingDown","TrendingUp","rows","Phone","ChevronDown","PercentRow","CompassDots","full","hasPartial","DEFAULT_SESSION_COLUMNS","num","SubSectionHeading","PerformanceDetailsPage","agentName","startDate","endDate","totalCalls","onBack","className","kpiBaseline","kpiAgentLift","kpiScore","baselineChart","agentLiftChart","scoreChart","csatChart","volumeChart","guidanceItems","strengthItems","callDrivers","callParadigms","strengthsTitle","guidanceTitle","callMixTitle","driversTitle","paradigmsTitle","sessionsTitle","baselineChartTitle","agentLiftChartTitle","scoreChartTitle","csatChartTitle","volumeChartTitle","sessions","sessionColumns","initialPageSize","selectedWindow","onWindowChange","dateRange","onDateRangeChange","sessionsTotal","sessionsPage","sessionsPageSize","onSessionsPageChange","onSessionsPageSizeChange","onExport","onSessionClick","onSessionsVisibleColumnsChange","customRangeActive","eightHourRange","presetDateRange","showRow1","showRow2","ArrowLeft","Download","CalendarDays","ArrowRight","opt","DateRangeButton","col","ShieldCheck","item","Lightbulb","FolderKanban","row","Layers","DataTable2","EMPTY_STAT","resolveStatTrend","StatCard","muted","beigeBg","style","StatSubCell","withDivider","FilterButton","Trailing","MONTH_NAMES","DOW_LABELS","startOfDay","x","buildCalendarGrid","year","month","startWeekday","gridStart","DateRangePopover","onApply","onClose","anchorRef","popoverRef","setFrom","setTo","initialMonth","viewYear","setViewYear","viewMonth","setViewMonth","pos","setPos","updatePosition","r","POPOVER_WIDTH","handleClick","e","_b","handleKey","days","today","handleDayClick","day","goPrev","goNext","isInRange","isEdge","createPortal","navBtnStyle","ChevronLeft","ChevronRight","inMonth","inRange","edge","isToday","isFuture","onChange","open","setOpen","triggerRef","Fragment","o","DEFAULT_RANGE_OPTIONS","CompassRating","DEFAULT_AGENT_COLUMNS","AccordionItem","EmptyState","message","PerformancePanel","onAgentClick","subtitle","dateRangeLabel","viewByOptions","initialViewBy","onViewByChange","aggregatedByLabel","volumeStat","compassStat","baselineSubStat","agentLiftSubStat","scoreSubStat","agentRows","agentColumns","topSignalsLeft","topSignalsRight","topSignalsTrailing","topSignalsTitle","emptyStrengthsMessage","emptyGuidanceMessage","emptyDriversMessage","emptyParadigmsMessage","emptyTopSignalsMessage","rangeOptions","dateRangePicker","onVisibleColumnsChange","selectedAgent","setSelectedAgent","viewByOpen","setViewByOpen","viewBy","setViewBy","internalDateRange","setInternalDateRange","effectiveDateRange","handleDateRangeChange","handleWindowChange","viewByTriggerRef","viewByPopoverRef","handler","viewByLabel","handleRowClick","detailsFrom","detailsTo","isSelected","Check","Signal"],"mappings":"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"}
1
+ {"version":3,"file":"PerformancePanel.cjs.js","sources":["../src/components/performance/performanceRangeFormat.js","../src/components/performance/performanceSparkline.js","../src/components/performance/performanceMetrics.js","../src/components/performance/PerformanceDetailsPage.jsx","../src/components/performance/PerformancePanel.jsx"],"sourcesContent":["// Shared browser-locale date/time formatting for time-range chips (8h / 1d / 7d / 30d).\n\nexport const 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\n// `undefined` → follow the viewer's browser locale (US: MM/DD, UK/IN: DD/MM, etc.).\nconst LOCALE = undefined;\nconst DATE_OPTS = { month: \"2-digit\", day: \"2-digit\", year: \"numeric\" };\nconst TIME_OPTS = { hour: \"numeric\", minute: \"2-digit\", hour12: true };\n\nexport function coalesceToDate(input) {\n if (!input) return null;\n if (input instanceof Date) {\n return Number.isNaN(input.getTime()) ? null : input;\n }\n const str = String(input).trim();\n const ymd = str.match(/^(\\d{4})-(\\d{1,2})-(\\d{1,2})/);\n if (ymd) {\n const d = new Date(Number(ymd[1]), Number(ymd[2]) - 1, Number(ymd[3]));\n return Number.isNaN(d.getTime()) ? null : d;\n }\n const parsed = new Date(str);\n return Number.isNaN(parsed.getTime()) ? null : parsed;\n}\n\nfunction isSameLocalCalendarDay(a, b) {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\nexport function formatLocalDate(date) {\n const d = date instanceof Date ? date : coalesceToDate(date);\n if (!d) return \"\";\n return d.toLocaleDateString(LOCALE, DATE_OPTS);\n}\n\nfunction formatLocalTime(date) {\n return date.toLocaleTimeString(LOCALE, TIME_OPTS);\n}\n\nfunction formatLocalDateTime(date) {\n return `${formatLocalDate(date)} ${formatLocalTime(date)}`;\n}\n\n/** Single-line label for the 8h chip (panel header). */\nexport function formatEightHourWindowLabel(from, to) {\n const f = coalesceToDate(from);\n const t = coalesceToDate(to);\n if (!f || !t) return \"\";\n if (isSameLocalCalendarDay(f, t)) {\n return `${formatLocalDateTime(f)} – ${formatLocalTime(t)}`;\n }\n return `${formatLocalDateTime(f)} – ${formatLocalDateTime(t)}`;\n}\n\n/** Start/end strings for the details page (arrow between). */\nexport function formatEightHourRangeEndpoints(from, to) {\n const f = coalesceToDate(from);\n const t = coalesceToDate(to);\n if (!f || !t) return null;\n if (isSameLocalCalendarDay(f, t)) {\n return { from: formatLocalDateTime(f), to: formatLocalTime(t) };\n }\n return { from: formatLocalDateTime(f), to: formatLocalDateTime(t) };\n}\n\n/** Rolling from/to for a preset chip (matches panel + details display). */\nexport function getPresetWindowDates(windowId) {\n const ms = RANGE_TO_MS[windowId];\n if (!ms) return null;\n const to = new Date();\n const from = new Date(to.getTime() - ms);\n return { from, to };\n}\n\n/** Label for preset window chips (8h shows time range; others show dates). */\nexport function computeWindowLabel(windowId) {\n const ms = RANGE_TO_MS[windowId];\n if (!ms) return \"\";\n const range = getPresetWindowDates(windowId);\n if (!range) return \"\";\n if (windowId === \"8h\") {\n return formatEightHourWindowLabel(range.from, range.to);\n }\n return `${formatLocalDate(range.from)} – ${formatLocalDate(range.to)}`;\n}\n","// Sparkline path builders shared by PerformancePanel + PerformanceDetailsPage.\n\nexport const SPARK_DEFAULT_LINE =\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\nexport const SPARK_DEFAULT_AREA =\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\n/** Normalize host points — flat array of numbers or [x, y] pairs (y used). */\nexport function normalizeSparkPoints(points) {\n if (!Array.isArray(points)) return null;\n const numeric = points\n .map((p) => {\n if (Array.isArray(p)) return Number(p[1]);\n if (p == null || p === \"\") return NaN;\n return Number(p);\n })\n .filter((n) => Number.isFinite(n));\n return numeric.length >= 2 ? numeric : null;\n}\n\n/** Project a numeric series onto an SVG viewBox. Returns null when unusable. */\nexport function buildSparkPaths(points, vbW = 52, vbH = 36) {\n const numeric = normalizeSparkPoints(points);\n if (!numeric) return null;\n const min = Math.min(...numeric);\n const max = Math.max(...numeric);\n const padY = 4;\n const span = max - min || 1;\n const usableH = vbH - padY * 2 - 4;\n const sx = (i) => (numeric.length === 1 ? 0 : (i / (numeric.length - 1)) * (vbW - 2)) + 1;\n const sy = (v) => padY + (1 - (v - min) / span) * usableH;\n let line = \"\";\n for (let i = 0; i < numeric.length; i++) {\n line += `${i === 0 ? \"M\" : \"L\"}${sx(i).toFixed(2)},${sy(numeric[i]).toFixed(2)}`;\n }\n const lastX = sx(numeric.length - 1);\n const firstX = sx(0);\n const area = `${line} L${lastX.toFixed(2)},${vbH} L${firstX.toFixed(2)},${vbH} Z`;\n return { line, area };\n}\n\n/** Infer up/down from first vs last point when host omits `trend`. */\nexport function trendFromPoints(points) {\n const numeric = normalizeSparkPoints(points);\n if (!numeric) return null;\n const first = numeric[0];\n const last = numeric[numeric.length - 1];\n if (last > first) return \"up\";\n if (last < first) return \"down\";\n return \"up\";\n}\n","import { trendFromPoints } from \"./performanceSparkline.js\";\n\nexport const METRIC_PLACEHOLDER = \"—\";\n\n/** Hosts often send \"-\", \"—\", or empty strings when API delta/value is null. */\nexport function isNullishMetric(value) {\n if (value == null) return true;\n const str = String(value).trim();\n if (!str) return true;\n if (/^[-−–—]$/.test(str)) return true;\n if (/^(n\\/a|null|undefined)$/i.test(str)) return true;\n return false;\n}\n\nexport function hasMeaningfulMetric(value) {\n return !isNullishMetric(value);\n}\n\nexport function formatMetricDisplay(value, fallback = METRIC_PLACEHOLDER) {\n return isNullishMetric(value) ? fallback : String(value);\n}\n\n/** Non-empty host field — includes placeholder dashes the API uses for missing data. */\nexport function hasHostMetricField(value) {\n return value != null && String(value).trim() !== \"\";\n}\n\n/**\n * Whether a chart card should render. Matches legacy `value || delta || points.length`\n * while treating numeric zero as present data.\n */\nexport function hasChartData(chart) {\n if (!chart) return false;\n if (hasHostMetricField(chart.value) || hasHostMetricField(chart.delta)) return true;\n return Array.isArray(chart.points) && chart.points.length > 0;\n}\n\n/** Derive up/down from signed deltas (+2.0%, -3pp, 95.5% (0.6pp), etc.). */\nexport function trendFromSignedValue(text) {\n if (isNullishMetric(text)) return null;\n const str = String(text).trim();\n const parenMatch = str.match(/\\(\\s*([+-])?\\s*([\\d.]+)/);\n if (parenMatch) {\n if (parenMatch[1] === \"-\") return \"down\";\n if (parenMatch[1] === \"+\") return \"up\";\n return parseFloat(parenMatch[2]) < 0 ? \"down\" : \"up\";\n }\n if (/^[-−]/.test(str)) return \"down\";\n if (/^\\+/.test(str)) return \"up\";\n if (/-\\d/.test(str)) return \"down\";\n return null;\n}\n\nexport function resolveTrend(trend, signedText) {\n return trendFromSignedValue(signedText) ?? (trend === \"down\" ? \"down\" : \"up\");\n}\n\nexport function resolveKpiTrend(trend, value, points) {\n return (\n trendFromPoints(points) ??\n (hasMeaningfulMetric(value) ? resolveTrend(trend, value) : trend === \"down\" ? \"down\" : \"up\")\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport {\n ArrowLeft,\n ArrowRight,\n CalendarDays,\n Download,\n Phone,\n ChevronDown,\n ChevronUp,\n ChevronLeft,\n ChevronRight,\n TrendingUp,\n TrendingDown,\n Lightbulb,\n ShieldCheck,\n FolderKanban,\n Layers,\n} from \"lucide-react\";\nimport DataTable2 from \"../data/DataTable2\";\nimport { DateRangeButton } from \"./PerformancePanel\";\nimport {\n formatEightHourRangeEndpoints,\n formatLocalDate,\n getPresetWindowDates,\n} from \"./performanceRangeFormat\";\nimport {\n SPARK_DEFAULT_AREA,\n SPARK_DEFAULT_LINE,\n buildSparkPaths,\n normalizeSparkPoints,\n} from \"./performanceSparkline\";\nimport {\n METRIC_PLACEHOLDER,\n formatMetricDisplay,\n hasChartData,\n hasMeaningfulMetric,\n resolveKpiTrend,\n resolveTrend,\n} from \"./performanceMetrics\";\n\n// Color values resolve to CSS variables declared in `src/tokens/colors.css`.\n// Anything new added here MUST first be added to that file as a `--*` token.\nconst C = {\n ink: \"var(--color-text)\",\n muted: \"var(--color-text-secondary)\",\n border: \"var(--grey-absent)\",\n borderSubtle: \"var(--neutral-100)\",\n iconCircle: \"var(--surface-hover)\",\n black: \"var(--neutral-900)\",\n white: \"var(--grey-white)\",\n neutralBorder: \"var(--neutral-250)\",\n neutral800: \"var(--neutral-800)\",\n neutral600: \"var(--neutral-600)\",\n neutral450: \"var(--neutral-450)\",\n neutral400: \"var(--neutral-400)\",\n neutral300: \"var(--neutral-300)\",\n neutral150: \"var(--neutral-150)\",\n neutral100: \"var(--neutral-100)\",\n beige: \"var(--surface-warm-40)\",\n shadowCard: \"var(--shadow-card)\",\n // Section accent colors are passed to SectionHeading via `iconColor`.\n railCompliance: \"var(--rail-compliance)\",\n accentYellow: \"var(--accent-yellow)\",\n};\n\nconst FONT_DISPLAY = \"var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)\";\nconst FONT_BODY = \"var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)\";\n\nfunction TrendArrow({ direction = \"up\", color = C.muted }) {\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 width={18} height={9.5} viewBox=\"0 0 19 10\" fill=\"none\" style={{ flexShrink: 0 }}>\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\n// Date in the viewer's local timezone and browser locale — matches\n// PerformancePanel's `formatLocalDate`. Accepts Date instances or strings (e.g. \"2026-03-16\");\n// returns the input untouched if it can't be parsed.\nfunction formatDisplayDate(input) {\n if (!input) return \"\";\n const opts = { month: \"2-digit\", day: \"2-digit\", year: \"numeric\" };\n if (input instanceof Date) {\n return Number.isNaN(input.getTime()) ? \"\" : input.toLocaleDateString(undefined, opts);\n }\n const str = String(input).trim();\n const ymd = str.match(/^(\\d{4})-(\\d{1,2})-(\\d{1,2})/);\n if (ymd) {\n const d = new Date(Number(ymd[1]), Number(ymd[2]) - 1, Number(ymd[3]));\n return d.toLocaleDateString(undefined, opts);\n }\n const parsed = new Date(str);\n if (!Number.isNaN(parsed.getTime())) return parsed.toLocaleDateString(undefined, opts);\n return str;\n}\n\nfunction Sparkline({ trend = \"up\", points, empty = false, width = 49.618, height = 35 }) {\n const id = React.useId();\n if (empty) {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 52 36\"\n fill=\"none\"\n style={{ flexShrink: 0 }}\n >\n <path\n d=\"M2,18 L50,18\"\n stroke={C.ink}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n }\n const built = buildSparkPaths(points);\n const linePath = built ? built.line : SPARK_DEFAULT_LINE;\n const areaPath = built ? built.area : SPARK_DEFAULT_AREA;\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 // Only mirror the canned curve. When real points are supplied the\n // shape already reflects direction, so no mirror needed.\n transform: !built && 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 // Dashed only when we don't have real points and trend is \"down\"\n // (matches the pre-existing decorative behavior).\n strokeDasharray={!built && trend === \"down\" ? \"2 4\" : undefined}\n />\n </svg>\n );\n}\n\nfunction KpiCell({ value, label, sub, trend = \"up\", points }) {\n const displayValue = formatMetricDisplay(value);\n const hasData = hasMeaningfulMetric(value) || normalizeSparkPoints(points) != null;\n const direction = resolveKpiTrend(trend, value, points);\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 16,\n minWidth: 0,\n }}\n >\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n flexShrink: 0,\n alignItems: \"flex-end\",\n }}\n >\n <Sparkline trend={direction} points={points} empty={!hasData} />\n {hasData ? <TrendArrow direction={direction} /> : null}\n </div>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 6, minWidth: 0 }}>\n <div\n style={{\n fontFamily: FONT_DISPLAY,\n fontSize: 28,\n fontWeight: 400,\n lineHeight: \"1.2\",\n color: C.muted,\n letterSpacing: \"-0.01em\",\n whiteSpace: \"nowrap\",\n }}\n >\n {displayValue}\n </div>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 2 }}>\n <span\n style={{\n fontFamily: FONT_BODY,\n fontSize: 13,\n color: C.ink,\n lineHeight: \"1.2\",\n }}\n >\n {label}\n </span>\n <span\n style={{\n fontFamily: FONT_BODY,\n fontSize: 13,\n color: C.neutral600,\n lineHeight: \"1.2\",\n }}\n >\n {sub}\n </span>\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_BODY,\n fontSize: 14,\n cursor: \"pointer\",\n }}\n >\n {label}\n </button>\n );\n}\n\nfunction FilterButton({ icon: Icon, children, active = false }) {\n return (\n <button\n type=\"button\"\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n height: 32,\n padding: \"0 16px\",\n borderRadius: 10,\n border: active ? \"none\" : `1px solid ${C.neutralBorder}`,\n background: active ? C.black : C.white,\n cursor: \"pointer\",\n fontFamily: FONT_BODY,\n fontSize: 14,\n color: active ? C.white : C.neutral800,\n fontWeight: active ? 600 : 400,\n whiteSpace: \"nowrap\",\n }}\n >\n {Icon && <Icon size={18} strokeWidth={1.75} />}\n {children}\n </button>\n );\n}\n\nconst DEFAULT_LINE_POINTS = [\n [0, 30],\n [60, 50],\n [120, 95],\n [180, 60],\n [240, 70],\n [300, 80],\n];\n\nfunction CompassLineChart({\n // When omitted, y-axis labels are auto-derived from `points` (5 evenly-spaced\n // ticks from max → min). Pass a custom array to override the formatting.\n yLabels: yLabelsProp,\n xLabels = [],\n // points: array of [x, y] pairs OR array of y-numbers (auto-distributed in x).\n // y is in DATA space — the chart auto-scales it to pixel space using the\n // points' own min/max (with a small padding).\n points,\n // index of the marker to render filled (defaults to the last point)\n highlightIndex,\n // Optional axis captions. xAxisLabel renders centered below the x-ticks;\n // yAxisLabel renders rotated to the left of the y-ticks. Omit to hide.\n xAxisLabel = \"\",\n yAxisLabel = \"\",\n}) {\n const [hoveredPoint, setHoveredPoint] = React.useState(null);\n const width = 460;\n const height = 110;\n const hasData = Array.isArray(points) && points.length > 0;\n const gradId = React.useId();\n // Cap the visible x-axis ticks regardless of how many points are passed —\n // long trends (60+ days) would otherwise overflow the card.\n const MAX_X_TICKS = 6;\n const allXLabels = Array.isArray(xLabels) ? xLabels : [];\n const visibleXLabels =\n allXLabels.length <= MAX_X_TICKS\n ? allXLabels\n : Array.from({ length: MAX_X_TICKS }, (_, i) =>\n allXLabels[Math.round((i * (allXLabels.length - 1)) / (MAX_X_TICKS - 1))]\n );\n // Vertical grid lines at evenly-spaced positions matching the visible ticks.\n const gridCount = Math.max(2, visibleXLabels.length || MAX_X_TICKS);\n const gridXs = Array.from({ length: gridCount }, (_, i) => (i / (gridCount - 1)) * width);\n\n if (!hasData) {\n // Empty state: render an empty 133px chart skeleton with just the grid\n // lines — no placeholder copy. Hosts that supply only headline value/\n // delta still get a clean card without \"No data\" text bleeding through.\n return (\n <div style={{ display: \"flex\", gap: 8, height: 133, width: \"100%\" }}>\n <div style={{ width: 24, flexShrink: 0 }} />\n <div style={{ flex: 1, position: \"relative\", minWidth: 0 }}>\n <svg\n width=\"100%\"\n height={height + 14}\n viewBox={`0 0 ${width} ${height + 14}`}\n preserveAspectRatio=\"none\"\n >\n {gridXs.map((gx, i) => (\n <line\n key={`grid-${i}`}\n x1={gx}\n y1=\"0\"\n x2={gx}\n y2={height}\n stroke={C.borderSubtle}\n strokeDasharray=\"2 3\"\n strokeWidth=\"1\"\n vectorEffect=\"non-scaling-stroke\"\n />\n ))}\n </svg>\n </div>\n </div>\n );\n }\n\n // Normalize to [x, y] pairs in DATA space.\n const dataPairs = Array.isArray(points[0])\n ? points\n : points.map((y, i) => [i, y]);\n const yValues = dataPairs.map(([, y]) => y);\n const yDataMin = Math.min(...yValues);\n const yDataMax = Math.max(...yValues);\n // Pad the range so the curve isn't pinned to the very top/bottom; if all\n // values are identical, give the axis a 1-unit cushion so it still draws.\n const yPad = yDataMax === yDataMin ? Math.max(Math.abs(yDataMax) * 0.1, 1) : (yDataMax - yDataMin) * 0.1;\n const yMin = yDataMin - yPad;\n const yMax = yDataMax + yPad;\n const ySpan = yMax - yMin || 1;\n const sy = (y) => ((yMax - y) / ySpan) * height;\n const normalized = dataPairs.map(([x, y]) => [x, sy(y)]);\n\n // Auto-derive y-axis labels (5 evenly-spaced ticks from max → min) when the\n // caller didn't pass an override.\n const yLabels =\n yLabelsProp && yLabelsProp.length\n ? yLabelsProp\n : Array.from({ length: 5 }, (_, i) => {\n const v = yMax - (i / 4) * (yMax - yMin);\n const abs = Math.abs(v);\n const decimals = abs >= 100 ? 0 : abs >= 10 ? 1 : 2;\n return v.toFixed(decimals);\n });\n const minX = normalized[0][0];\n const maxX = normalized[normalized.length - 1][0];\n const xSpan = maxX - minX || 1;\n // Keep endpoints away from the SVG edge so first/last point markers don't clip.\n const xPad = 8;\n const innerWidth = Math.max(1, width - xPad * 2);\n const sx = (x) => xPad + ((x - minX) / xSpan) * innerWidth;\n const formatPointValue = (value) => {\n const n = Number(value);\n if (!Number.isFinite(n)) return String(value ?? \"\");\n const abs = Math.abs(n);\n const decimals = abs >= 100 ? 0 : abs >= 10 ? 1 : 2;\n return n.toFixed(decimals);\n };\n const linePath = normalized\n .map(([x, y], i) => `${i === 0 ? \"M\" : \"L\"}${sx(x)},${y}`)\n .join(\" \");\n const areaPath = `${linePath} L${sx(normalized[normalized.length - 1][0])},${height} L${sx(normalized[0][0])},${height} Z`;\n const highlight = highlightIndex == null ? normalized.length - 1 : highlightIndex;\n return (\n <div style={{ display: \"flex\", gap: 8, height: xAxisLabel ? 151 : 133, width: \"100%\" }}>\n {yAxisLabel ? (\n <div style={{ display: \"flex\", alignItems: \"center\", flexShrink: 0 }}>\n <span\n style={{\n writingMode: \"vertical-rl\",\n transform: \"rotate(180deg)\",\n fontFamily: FONT_BODY,\n fontSize: 10,\n fontWeight: 500,\n color: C.neutral800,\n whiteSpace: \"nowrap\",\n }}\n >\n {yAxisLabel}\n </span>\n </div>\n ) : null}\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"space-between\",\n padding: \"14px 0\",\n fontFamily: FONT_BODY,\n fontSize: 10,\n color: C.neutral800,\n flexShrink: 0,\n }}\n >\n {yLabels.map((l) => (\n <span key={l}>{l}</span>\n ))}\n </div>\n <div style={{ flex: 1, position: \"relative\", minWidth: 0 }}>\n {hoveredPoint && (\n <div\n style={{\n position: \"absolute\",\n left: `${hoveredPoint.xPct}%`,\n top: `${hoveredPoint.yPct}%`,\n transform: \"translate(-50%, calc(-100% - 10px))\",\n pointerEvents: \"none\",\n zIndex: 2,\n background: C.black,\n color: C.white,\n borderRadius: 6,\n minWidth: 60,\n padding: \"8px 10px\",\n boxShadow: \"0 6px 16px rgba(0,0,0,0.18)\",\n fontFamily: FONT_BODY,\n fontSize: 11,\n lineHeight: 1.25,\n whiteSpace: \"nowrap\",\n textAlign: \"left\",\n }}\n >\n <div>{hoveredPoint.label}</div>\n <div style={{ fontWeight: 600 }}>{hoveredPoint.value}</div>\n <div\n style={{\n position: \"absolute\",\n left: \"50%\",\n bottom: -5,\n width: 10,\n height: 10,\n background: C.black,\n transform: \"translateX(-50%) rotate(45deg)\",\n borderRadius: 2,\n }}\n />\n </div>\n )}\n <svg\n width=\"100%\"\n height={height + 14}\n viewBox={`0 0 ${width} ${height + 14}`}\n preserveAspectRatio=\"none\"\n onMouseLeave={() => setHoveredPoint(null)}\n >\n <defs>\n <linearGradient id={`area-${gradId}`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" style={{ stopColor: C.black, stopOpacity: 0.08 }} />\n <stop offset=\"100%\" style={{ stopColor: C.black, stopOpacity: 0 }} />\n </linearGradient>\n </defs>\n {gridXs.map((gx, i) => (\n <line\n key={`grid-${i}`}\n x1={gx}\n y1=\"0\"\n x2={gx}\n y2={height}\n stroke={C.borderSubtle}\n strokeDasharray=\"2 3\"\n strokeWidth=\"1\"\n vectorEffect=\"non-scaling-stroke\"\n />\n ))}\n <path d={areaPath} fill={`url(#area-${gradId})`} />\n <path\n d={linePath}\n stroke={C.black}\n strokeWidth=\"1.5\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n vectorEffect=\"non-scaling-stroke\"\n />\n {normalized.map(([x, y], i) => {\n const isHighlight = i === highlight;\n return (\n <circle\n key={i}\n cx={sx(x)}\n cy={y}\n r={isHighlight ? 4 : 3}\n fill={isHighlight ? C.black : C.white}\n stroke={C.black}\n strokeWidth=\"1.5\"\n vectorEffect=\"non-scaling-stroke\"\n onMouseEnter={() => {\n setHoveredPoint({\n xPct: (sx(x) / width) * 100,\n yPct: (y / (height + 28)) * 100,\n label: allXLabels[i] || `Point ${i + 1}`,\n value: formatPointValue(dataPairs[i]?.[1]),\n });\n }}\n />\n );\n })}\n </svg>\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n paddingRight: 6,\n fontFamily: FONT_BODY,\n fontSize: 10,\n color: C.neutral800,\n marginTop: 8,\n marginBottom: 4,\n overflow: \"hidden\",\n }}\n >\n {visibleXLabels.map((l, i) => (\n <span key={i} style={{ whiteSpace: \"nowrap\" }}>{l}</span>\n ))}\n </div>\n {xAxisLabel ? (\n <div\n style={{\n textAlign: \"center\",\n fontFamily: FONT_BODY,\n fontSize: 10,\n fontWeight: 500,\n color: C.neutral800,\n }}\n >\n {xAxisLabel}\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n\nfunction ChartCard({ title, value, delta, children }) {\n const displayValue = formatMetricDisplay(value);\n const showDelta = hasMeaningfulMetric(delta);\n // Value line uses em-dash fallback; delta/trend icons stay hidden for placeholders.\n const deltaTrend = showDelta ? resolveTrend(\"up\", delta) : \"up\";\n return (\n <div\n style={{\n flex: 1,\n background: C.white,\n border: `1px solid ${C.border}`,\n borderRadius: 8,\n padding: 24,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 24,\n minWidth: 0,\n boxShadow: C.shadowCard,\n }}\n >\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"flex-end\" }}>\n <span\n style={{\n fontFamily: FONT_DISPLAY,\n fontWeight: 600,\n fontSize: 15,\n color: C.ink,\n lineHeight: 1.2,\n }}\n >\n {title}\n </span>\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"flex-end\",\n gap: 4,\n fontFamily: FONT_DISPLAY,\n fontWeight: 600,\n }}\n >\n <span style={{ fontSize: 20, color: C.black, lineHeight: 1 }}>{displayValue}</span>\n {showDelta ? (\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 3,\n fontSize: 10,\n color: C.neutral300,\n lineHeight: 1,\n }}\n >\n <TrendArrow direction={deltaTrend} color={C.neutral300} />\n {delta}\n </span>\n ) : null}\n </span>\n </div>\n <div style={{ flex: 1 }}>{children}</div>\n </div>\n );\n}\n\nfunction SectionHeading({ icon: Icon, title, trailing, iconColor = C.ink, bordered = false }) {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n width: \"100%\",\n paddingBottom: bordered ? 12 : 0,\n borderBottom: bordered ? `1px solid ${C.border}` : \"none\",\n }}\n >\n <div\n style={{\n width: 24,\n height: 24,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n <Icon size={22} strokeWidth={1.75} style={{ color: iconColor }} />\n </div>\n <div\n style={{\n flex: 1,\n fontFamily: FONT_DISPLAY,\n fontWeight: 600,\n fontSize: 16,\n color: C.ink,\n lineHeight: 1.2,\n textTransform: \"uppercase\",\n letterSpacing: \"0.02em\",\n }}\n >\n {title}\n </div>\n {trailing && (\n <div style={{ fontFamily: FONT_BODY, fontSize: 14, color: C.ink }}>{trailing}</div>\n )}\n </div>\n );\n}\n\n// Hosts emit `text` (matches PerformancePanel's accordion); legacy callers\n// may pass `bullet`. Accept either so existing consumers don't break.\n// When `href` is provided the label renders as an underlined link that\n// opens in a new tab (used by Performance guidance examples → interaction\n// detail page).\nfunction CitationRow({ text, bullet, citation, date, href }) {\n const label = text ?? bullet ?? \"\";\n return (\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n fontFamily: FONT_BODY,\n fontSize: 14,\n color: C.ink,\n lineHeight: \"24px\",\n gap: 16,\n }}\n >\n {href ? (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n color: C.ink,\n textDecoration: \"underline\",\n textUnderlineOffset: 2,\n textDecorationColor: C.border,\n minWidth: 0,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {label}\n </a>\n ) : (\n <span style={{ minWidth: 0, overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}>\n {label}\n </span>\n )}\n <span style={{ display: \"inline-flex\", gap: 4, whiteSpace: \"nowrap\" }}>\n <span style={{ color: C.ink }}>{citation}</span>\n {date ? <span style={{ color: C.muted }}>({date})</span> : null}\n </span>\n </div>\n );\n}\n\nfunction AccordionRow({\n title,\n summary,\n calls,\n // Hosts emit `percent` (matches PerformancePanel's accordion); legacy\n // callers may still send `delta`. Accept either.\n percent,\n delta,\n bullets,\n defaultExpanded = false,\n}) {\n const [expanded, setExpanded] = React.useState(defaultExpanded);\n const trailingRaw = percent ?? delta;\n const showTrailing = hasMeaningfulMetric(trailingRaw);\n const trailing = showTrailing ? String(trailingRaw) : METRIC_PLACEHOLDER;\n const trailingTrend = showTrailing ? resolveTrend(\"up\", trailing) : \"up\";\n const TrendIcon = trailingTrend === \"down\" ? TrendingDown : TrendingUp;\n const rows = Array.isArray(bullets) ? bullets : [];\n // Outer container is a div so the bullet rows inside (which may hold\n // <a> links to the interaction detail page) aren't nested inside an\n // interactive <button>. Header still toggles via the inner button.\n return (\n <div style={{ borderTop: `1px solid ${C.border}` }}>\n <button\n type=\"button\"\n onClick={() => setExpanded((v) => !v)}\n aria-expanded={expanded}\n style={{\n border: \"none\",\n background: \"transparent\",\n padding: 16,\n display: \"flex\",\n gap: 12,\n alignItems: \"flex-start\",\n cursor: \"pointer\",\n width: \"100%\",\n textAlign: \"left\",\n fontFamily: FONT_BODY,\n }}\n >\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\", gap: 12, minWidth: 0 }}>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 12 }}>\n <span\n style={{\n fontFamily: FONT_BODY,\n fontWeight: 500,\n fontSize: 14,\n color: C.black,\n lineHeight: \"24px\",\n }}\n >\n {title}\n </span>\n <span style={{ fontFamily: FONT_BODY, fontSize: 14, color: C.muted, lineHeight: \"24px\" }}>\n {summary}\n </span>\n </div>\n <div style={{ display: \"flex\", gap: 16 }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n <Phone size={12} color={C.ink} strokeWidth={1.75} />\n <span style={{ fontFamily: FONT_BODY, fontSize: 12, color: C.ink }}>{calls} Interactions</span>\n </div>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n {showTrailing ? (\n <TrendIcon size={12} color={C.ink} strokeWidth={1.75} />\n ) : null}\n <span\n style={{\n fontFamily: FONT_BODY,\n fontSize: 12,\n color: showTrailing ? C.ink : C.muted,\n }}\n >\n {trailing}\n </span>\n </div>\n </div>\n </div>\n <ChevronDown\n size={20}\n color={C.ink}\n strokeWidth={2}\n style={{\n flexShrink: 0,\n transform: expanded ? \"rotate(180deg)\" : \"none\",\n transition: \"transform 150ms ease\",\n }}\n />\n </button>\n {expanded && rows.length > 0 && (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 12,\n padding: \"0 16px 16px\",\n }}\n >\n {rows.map((b, i) => (\n <CitationRow key={i} {...b} />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction PercentRow({ label, value }) {\n return (\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n padding: \"8px 8px 12px\",\n borderBottom: `1px solid ${C.border}`,\n fontFamily: FONT_BODY,\n fontSize: 13,\n lineHeight: \"1.2\",\n }}\n >\n <span style={{ color: C.ink }}>{label}</span>\n <span style={{ color: C.muted }}>{value}</span>\n </div>\n );\n}\n\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: \"flex\", gap: 4 }}>\n {Array.from({ length: max }).map((_, i) => {\n if (i < full) {\n return (\n <span\n key={i}\n style={{\n width: 10,\n height: 10,\n borderRadius: \"50%\",\n background: C.black,\n display: \"inline-block\",\n }}\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\n style={{\n width: 6,\n height: 6,\n borderRadius: \"50%\",\n background: C.black,\n display: \"inline-block\",\n }}\n />\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 display: \"inline-block\",\n boxSizing: \"border-box\",\n }}\n />\n );\n })}\n </div>\n );\n}\n\nexport const DEFAULT_SESSION_COLUMNS = [\n { id: \"title\", label: \"Title\", width: 220, sortable: true, filterable: true },\n { id: \"date\", label: \"Date\", width: 170, sortable: true },\n { id: \"duration\", label: \"Duration\", width: 170, sortable: true },\n { id: \"lift\", label: \"Lift\", width: 120, sortable: true },\n {\n id: \"compass\",\n label: \"Compass Score\",\n width: 220,\n sortable: true,\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\n\nfunction SubSectionHeading({ icon: Icon, title }) {\n return (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 16, width: \"100%\" }}>\n <div\n style={{\n width: 34,\n height: 34,\n borderRadius: 9999,\n background: C.iconCircle,\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 fontFamily: FONT_DISPLAY,\n fontWeight: 600,\n fontSize: 16,\n color: C.ink,\n lineHeight: 1.2,\n }}\n >\n {title}\n </span>\n </div>\n );\n}\n\nexport default function PerformanceDetailsPage({\n agentName = \"\",\n startDate = \"\",\n endDate = \"\",\n totalCalls = \"\",\n onBack,\n className = \"\",\n // KPI strip\n kpiBaseline = { value: \"\", label: \"\", sub: \"\", trend: \"up\" },\n kpiAgentLift = { value: \"\", label: \"\", sub: \"\", trend: \"down\" },\n kpiScore = { value: \"\", label: \"\", sub: \"\", trend: \"up\" },\n // Chart cards (Baseline / Agent Lift / Score / CSAT / Volume)\n // Each takes { value, delta, yLabels?, xLabels?, points? }.\n // points is an array of [x, y] pairs OR a flat array of y-numbers.\n baselineChart = { value: \"\", delta: \"\" },\n agentLiftChart = { value: \"\", delta: \"\" },\n scoreChart = { value: \"\", delta: \"\" },\n csatChart = { value: \"\", delta: \"\" },\n volumeChart = { value: \"\", delta: \"\" },\n // Insight sections — titles and chart-card labels stay empty by default\n // so the library doesn't ship demo copy.\n guidanceItems = [],\n strengthItems = [],\n callDrivers = [],\n callParadigms = [],\n strengthsTitle = \"\",\n guidanceTitle = \"\",\n callMixTitle = \"\",\n driversTitle = \"\",\n paradigmsTitle = \"\",\n sessionsTitle = \"\",\n baselineChartTitle = \"\",\n agentLiftChartTitle = \"\",\n scoreChartTitle = \"\",\n csatChartTitle = \"\",\n volumeChartTitle = \"\",\n // Sessions table\n sessions = [],\n sessionColumns = [],\n initialPageSize = 10,\n // Time-range chips state — mirrors PerformancePanel so the active chip /\n // Date Range highlight survives the navigation into the details page.\n // Callbacks are optional; when omitted the controls are display-only.\n selectedWindow = \"30d\",\n onWindowChange,\n dateRange,\n onDateRangeChange,\n // Server-side pagination for the sessions table. When all four are provided\n // the table switches to controlled / server-paginated mode and the host is\n // expected to refetch when the user changes page or page size.\n sessionsTotal = null,\n sessionsPage = null,\n sessionsPageSize = null,\n onSessionsPageChange,\n onSessionsPageSizeChange,\n // Fires when the user clicks the Export CSV button in the header. Disabled\n // if no handler is provided.\n onExport,\n // Fires when the user clicks a row in the sessions table.\n onSessionClick,\n // Fires whenever the user toggles columns in the sessions table's column\n // picker — hosts can scope their CSV export to whatever the user has visible.\n onSessionsVisibleColumnsChange,\n}) {\n const customRangeActive = !!(dateRange?.from && dateRange?.to);\n // 8h label uses a rolling window (now − 8h), same as the list panel. Hosts\n // often pass date-only startDate/endDate (midnight), which would render as\n // \"12:00 AM – 12:00 AM\"; derive the range locally instead.\n const eightHourRange = (() => {\n if (customRangeActive || selectedWindow !== \"8h\") return null;\n const range = getPresetWindowDates(\"8h\");\n return range ? formatEightHourRangeEndpoints(range.from, range.to) : null;\n })();\n const presetDateRange = (() => {\n if (customRangeActive || selectedWindow === \"8h\") return null;\n const range = getPresetWindowDates(selectedWindow);\n if (!range) return null;\n return {\n from: formatLocalDate(range.from),\n to: formatLocalDate(range.to),\n };\n })();\n\n // A chart card is only worth rendering when the host has something concrete\n // for it — either a headline value, a delta, or actual chart points. Without\n // that we'd ship empty frames with \"No data\" inside, which leaks library\n // demo copy. Hosts populate progressively; gallery passes everything.\n const showRow1 =\n hasChartData(baselineChart) || hasChartData(agentLiftChart) || hasChartData(scoreChart);\n const showRow2 = hasChartData(csatChart) || hasChartData(volumeChart);\n\n return (\n <div\n className={className}\n style={{\n background: C.white,\n fontFamily: FONT_BODY,\n color: C.ink,\n width: \"100%\",\n minWidth: 1192,\n boxSizing: \"border-box\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"23px 32px\",\n minHeight: 78,\n boxSizing: \"border-box\",\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 paddingLeft: 16,\n borderLeft: `1px solid ${C.border}`,\n flex: 1,\n minWidth: 0,\n alignSelf: \"stretch\",\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n <h1\n style={{\n fontFamily: FONT_DISPLAY,\n fontSize: 24,\n fontWeight: 400,\n color: C.ink,\n margin: 0,\n lineHeight: 1,\n whiteSpace: \"nowrap\",\n }}\n >\n {agentName}\n </h1>\n </div>\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_BODY,\n fontSize: 14,\n lineHeight: \"24px\",\n color: C.neutral800,\n flexShrink: 0,\n }}\n >\n <Download size={18} strokeWidth={1.75} />\n Export CSV\n </button>\n </div>\n\n <div\n style={{\n padding: \"0 32px 32px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n }}\n >\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n gap: 16,\n paddingLeft: 49,\n }}\n >\n <div style={{ display: \"flex\", gap: 16, alignItems: \"center\" }}>\n <div style={{ display: \"inline-flex\", alignItems: \"center\", gap: 6 }}>\n <CalendarDays size={14} color={C.ink} strokeWidth={1.75} style={{ flexShrink: 0 }} />\n <span\n style={{\n fontFamily: FONT_BODY,\n fontSize: 12,\n color: C.ink,\n lineHeight: 1.5,\n }}\n >\n {eightHourRange?.from ??\n presetDateRange?.from ??\n formatDisplayDate(startDate)}\n </span>\n <ArrowRight size={12} color={C.ink} strokeWidth={1.75} style={{ flexShrink: 0 }} />\n <span\n style={{\n fontFamily: FONT_BODY,\n fontSize: 12,\n color: C.ink,\n lineHeight: 1.5,\n }}\n >\n {eightHourRange?.to ??\n presetDateRange?.to ??\n formatDisplayDate(endDate)}\n </span>\n </div>\n <div style={{ display: \"inline-flex\", alignItems: \"center\", gap: 6 }}>\n <Phone size={14} color={C.ink} strokeWidth={1.75} style={{ flexShrink: 0 }} />\n <span\n style={{\n fontFamily: FONT_BODY,\n fontSize: 12,\n color: C.ink,\n lineHeight: 1.5,\n }}\n >\n {totalCalls}\n </span>\n </div>\n </div>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 10 }}>\n {[\n { id: \"8h\", label: \"8h\" },\n { id: \"1d\", label: \"1d\" },\n { id: \"7d\", label: \"7d\" },\n { id: \"30d\", label: \"30d\" },\n ].map((opt) => (\n <RangeChip\n key={opt.id}\n label={opt.label}\n active={!customRangeActive && opt.id === selectedWindow}\n onClick={() => onWindowChange?.(opt.id)}\n />\n ))}\n <DateRangeButton value={dateRange} onChange={onDateRangeChange} />\n </div>\n </div>\n\n {showRow1 && (\n <div style={{ display: \"flex\", gap: 24 }}>\n {hasChartData(baselineChart) && (\n <ChartCard title={baselineChartTitle} value={baselineChart.value} delta={baselineChart.delta}>\n <CompassLineChart\n yLabels={baselineChart.yLabels}\n xLabels={baselineChart.xLabels}\n points={baselineChart.points}\n xAxisLabel={baselineChart.xAxisLabel}\n yAxisLabel={baselineChart.yAxisLabel}\n />\n </ChartCard>\n )}\n {hasChartData(agentLiftChart) && (\n <ChartCard title={agentLiftChartTitle} value={agentLiftChart.value} delta={agentLiftChart.delta}>\n <CompassLineChart\n yLabels={agentLiftChart.yLabels}\n xLabels={agentLiftChart.xLabels}\n points={agentLiftChart.points}\n xAxisLabel={agentLiftChart.xAxisLabel}\n yAxisLabel={agentLiftChart.yAxisLabel}\n />\n </ChartCard>\n )}\n {hasChartData(scoreChart) && (\n <ChartCard title={scoreChartTitle} value={scoreChart.value} delta={scoreChart.delta}>\n <CompassLineChart\n yLabels={scoreChart.yLabels}\n xLabels={scoreChart.xLabels}\n points={scoreChart.points}\n xAxisLabel={scoreChart.xAxisLabel}\n yAxisLabel={scoreChart.yAxisLabel}\n />\n </ChartCard>\n )}\n </div>\n )}\n\n {showRow2 && (\n <div style={{ display: \"flex\", gap: 24 }}>\n {hasChartData(csatChart) && (\n <ChartCard title={csatChartTitle} value={csatChart.value} delta={csatChart.delta}>\n <CompassLineChart\n yLabels={csatChart.yLabels}\n xLabels={csatChart.xLabels}\n points={csatChart.points}\n xAxisLabel={csatChart.xAxisLabel}\n yAxisLabel={csatChart.yAxisLabel}\n />\n </ChartCard>\n )}\n {hasChartData(volumeChart) && (\n <ChartCard title={volumeChartTitle} value={volumeChart.value} delta={volumeChart.delta}>\n <CompassLineChart\n yLabels={volumeChart.yLabels}\n xLabels={volumeChart.xLabels}\n points={volumeChart.points}\n xAxisLabel={volumeChart.xAxisLabel}\n yAxisLabel={volumeChart.yAxisLabel}\n />\n </ChartCard>\n )}\n </div>\n )}\n\n <div style={{ display: \"flex\", gap: 24, marginTop: 8, alignItems: \"flex-start\" }}>\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\", gap: 16, minWidth: 0 }}>\n <SectionHeading icon={ShieldCheck} title={strengthsTitle} iconColor={C.railCompliance} />\n <div style={{ display: \"flex\", flexDirection: \"column\", maxHeight: 480, overflowY: \"auto\" }}>\n {strengthItems.map((item, i) => (\n <AccordionRow key={i} {...item} />\n ))}\n </div>\n </div>\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\", gap: 16, minWidth: 0 }}>\n <SectionHeading icon={Lightbulb} title={guidanceTitle} iconColor={C.railCompliance} />\n <div style={{ display: \"flex\", flexDirection: \"column\", maxHeight: 480, overflowY: \"auto\" }}>\n {guidanceItems.map((item, i) => (\n <AccordionRow key={i} {...item} />\n ))}\n </div>\n </div>\n </div>\n\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 16, marginTop: 8 }}>\n <SectionHeading icon={Phone} title={callMixTitle} iconColor={C.railCompliance} />\n <div style={{ display: \"flex\", gap: 24, alignItems: \"flex-start\" }}>\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\", gap: 8, minWidth: 0 }}>\n <SubSectionHeading icon={FolderKanban} title={driversTitle} />\n <div style={{ display: \"flex\", flexDirection: \"column\", maxHeight: 480, overflowY: \"auto\" }}>\n {callDrivers.map((row, i) => (\n <PercentRow key={i} {...row} />\n ))}\n </div>\n </div>\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\", gap: 8, minWidth: 0 }}>\n <SubSectionHeading icon={Layers} title={paradigmsTitle} />\n <div style={{ display: \"flex\", flexDirection: \"column\", maxHeight: 480, overflowY: \"auto\" }}>\n {callParadigms.map((row, i) => (\n <PercentRow key={i} {...row} />\n ))}\n </div>\n </div>\n </div>\n </div>\n\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 16, marginTop: 8 }}>\n {sessionsTitle && (\n <span\n style={{\n fontFamily: FONT_DISPLAY,\n fontWeight: 600,\n fontSize: 16,\n color: C.ink,\n lineHeight: 1.2,\n }}\n >\n {sessionsTitle}\n </span>\n )}\n <DataTable2\n data={sessions}\n columns={sessionColumns}\n initialPageSize={initialPageSize}\n totalCount={sessionsTotal}\n page={sessionsPage}\n pageSize={sessionsPageSize}\n onPageChange={onSessionsPageChange}\n onPageSizeChange={onSessionsPageSizeChange}\n onRowClick={onSessionClick}\n onVisibleColumnsChange={onSessionsVisibleColumnsChange}\n />\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n Download,\n ChevronDown,\n CalendarDays,\n Search,\n ChevronLeft,\n ChevronRight,\n TrendingUp,\n Lightbulb,\n ShieldCheck,\n Phone,\n Signal,\n FolderKanban,\n Layers,\n Check,\n} from \"lucide-react\";\nimport DataTable2 from \"../data/DataTable2\";\nimport PerformanceDetailsPage from \"./PerformanceDetailsPage\";\nimport {\n RANGE_TO_MS,\n computeWindowLabel,\n formatLocalDate,\n} from \"./performanceRangeFormat\";\nimport {\n SPARK_DEFAULT_AREA,\n SPARK_DEFAULT_LINE,\n buildSparkPaths,\n trendFromPoints,\n} from \"./performanceSparkline\";\n\nconst EMPTY_STAT = { value: \"\", label: \"\", trend: \"up\" };\n\n// Color values resolve to CSS variables declared in `src/tokens/colors.css`.\n// Anything new added here MUST first be added to that file as a `--*` token.\nconst C = {\n ink: \"var(--color-text)\",\n muted: \"var(--color-text-secondary)\",\n border: \"var(--grey-absent)\",\n borderSubtle: \"var(--neutral-100)\",\n iconCircle: \"var(--surface-hover)\",\n black: \"var(--neutral-900)\",\n white: \"var(--grey-white)\",\n green: \"var(--color-green)\",\n red: \"var(--color-red-strong)\",\n neutralBorder: \"var(--neutral-250)\",\n neutralLight: \"var(--neutral-100)\",\n beige: \"var(--surface-warm-40)\",\n // Extras needed by inline literals in this file:\n neutral800: \"var(--neutral-800)\", // button/text label grey\n textInk: \"var(--text-ink)\", // body subtitle (#1E2125)\n textFaintGrey: \"var(--text-faint-grey)\", // disabled calendar day text\n hoverWarm40: \"var(--hover-warm-40)\", // calendar in-range highlight\n shadowPopover: \"var(--shadow-popover)\",\n shadowDropdown: \"var(--shadow-dropdown)\",\n railCompliance: \"var(--rail-compliance)\", // section icon accent\n};\n\nconst FONT_DISPLAY = \"var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)\";\nconst FONT_BODY = \"var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)\";\n\nfunction Sparkline({ trend = \"up\", points, width = 49.618, height = 35 }) {\n const id = React.useId();\n const built = buildSparkPaths(points);\n const linePath = built ? built.line : SPARK_DEFAULT_LINE;\n const areaPath = built ? built.area : SPARK_DEFAULT_AREA;\n const direction = trendFromPoints(points) ?? trend;\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: !built && direction === \"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={!built && direction === \"down\" ? \"2 4\" : undefined}\n />\n </svg>\n );\n}\n\nfunction resolveStatTrend(trend, points) {\n return trendFromPoints(points) ?? (trend === \"down\" ? \"down\" : \"up\");\n}\n\nfunction TrendArrow({ direction = \"up\", color = C.muted }) {\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 width={18} height={9.5} viewBox=\"0 0 19 10\" fill=\"none\" style={{ flexShrink: 0 }}>\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\", points, muted = false, beigeBg = false, style = {} }) {\n const direction = resolveStatTrend(trend, points);\n return (\n <div\n style={{\n background: beigeBg ? C.beige : 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={direction} points={points} />\n <TrendArrow direction={direction} />\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: muted ? C.muted : C.ink,\n letterSpacing: \"-0.01em\",\n }}\n >\n {value}\n </div>\n <div style={{ fontFamily: FONT_BODY, fontSize: 13, color: C.ink, lineHeight: \"1.2\" }}>{label}</div>\n </div>\n </div>\n );\n}\n\nfunction StatSubCell({ value, label, trend = \"up\", points, withDivider = false }) {\n const direction = resolveStatTrend(trend, points);\n return (\n <div\n style={{\n flex: 1,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n paddingLeft: withDivider ? 24 : 0,\n borderLeft: withDivider ? `1px solid ${C.border}` : \"none\",\n minWidth: 0,\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"flex-start\", justifyContent: \"space-between\" }}>\n <Sparkline trend={direction} points={points} />\n <TrendArrow direction={direction} />\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.muted,\n letterSpacing: \"-0.01em\",\n }}\n >\n {value}\n </div>\n <div style={{ fontFamily: FONT_BODY, fontSize: 13, color: C.ink, lineHeight: \"1.2\" }}>{label}</div>\n </div>\n </div>\n );\n}\n\nfunction FilterButton({ icon: Icon, children, trailing: Trailing }) {\n return (\n <button\n type=\"button\"\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: \"pointer\",\n fontFamily: FONT_BODY,\n fontSize: 14,\n color: C.neutral800,\n whiteSpace: \"nowrap\",\n }}\n >\n {Icon && <Icon size={18} strokeWidth={1.75} />}\n {children}\n {Trailing && <Trailing size={16} strokeWidth={2} />}\n </button>\n );\n}\n\nconst MONTH_NAMES = [\n \"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n \"July\", \"August\", \"September\", \"October\", \"November\", \"December\",\n];\nconst DOW_LABELS = [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"];\n\nfunction startOfDay(d) {\n const x = new Date(d);\n x.setHours(0, 0, 0, 0);\n return x;\n}\n\nfunction buildCalendarGrid(year, month) {\n // Returns 42 dates (6 weeks). Leading/trailing days are from neighbour months.\n const first = new Date(year, month, 1);\n const startWeekday = first.getDay();\n const gridStart = new Date(year, month, 1 - startWeekday);\n return Array.from({ length: 42 }, (_, i) => {\n const d = new Date(gridStart);\n d.setDate(gridStart.getDate() + i);\n return d;\n });\n}\n\nfunction DateRangePopover({ value, onApply, onClose, anchorRef }) {\n const popoverRef = React.useRef(null);\n const [from, setFrom] = React.useState(value?.from ? startOfDay(value.from) : null);\n const [to, setTo] = React.useState(value?.to ? startOfDay(value.to) : null);\n const initialMonth = from || new Date();\n const [viewYear, setViewYear] = React.useState(initialMonth.getFullYear());\n const [viewMonth, setViewMonth] = React.useState(initialMonth.getMonth());\n const [pos, setPos] = React.useState({ top: 0, left: 0 });\n\n // Position under the trigger (right-aligned so it doesn't overflow viewport).\n // Recomputed on scroll/resize so the popover stays attached to the button\n // when the page scrolls — same pattern as the Columns dropdown in DataTable2.\n React.useLayoutEffect(() => {\n const updatePosition = () => {\n if (!anchorRef?.current) return;\n const r = anchorRef.current.getBoundingClientRect();\n const POPOVER_WIDTH = 320;\n setPos({\n top: r.bottom + 6,\n left: Math.max(8, r.right - POPOVER_WIDTH),\n });\n };\n updatePosition();\n window.addEventListener(\"scroll\", updatePosition, true);\n window.addEventListener(\"resize\", updatePosition);\n return () => {\n window.removeEventListener(\"scroll\", updatePosition, true);\n window.removeEventListener(\"resize\", updatePosition);\n };\n }, [anchorRef]);\n\n // Close on outside click / Escape.\n React.useEffect(() => {\n const handleClick = (e) => {\n if (popoverRef.current?.contains(e.target)) return;\n if (anchorRef?.current?.contains(e.target)) return;\n onClose();\n };\n const handleKey = (e) => { if (e.key === \"Escape\") onClose(); };\n document.addEventListener(\"mousedown\", handleClick);\n document.addEventListener(\"keydown\", handleKey);\n return () => {\n document.removeEventListener(\"mousedown\", handleClick);\n document.removeEventListener(\"keydown\", handleKey);\n };\n }, [onClose, anchorRef]);\n\n const days = buildCalendarGrid(viewYear, viewMonth);\n const today = startOfDay(new Date());\n\n const handleDayClick = (d) => {\n const day = startOfDay(d);\n // Block future dates — they'd never be valid for \"data up to now\" filters.\n if (day > today) return;\n if (!from || (from && to)) {\n setFrom(day);\n setTo(null);\n } else if (day < from) {\n setFrom(day);\n } else {\n setTo(day);\n }\n };\n\n const goPrev = () => {\n if (viewMonth === 0) { setViewMonth(11); setViewYear(viewYear - 1); }\n else setViewMonth(viewMonth - 1);\n };\n const goNext = () => {\n if (viewMonth === 11) { setViewMonth(0); setViewYear(viewYear + 1); }\n else setViewMonth(viewMonth + 1);\n };\n\n const isInRange = (d) => from && to && d >= from && d <= to;\n const isEdge = (d) => (from && d.getTime() === from.getTime()) || (to && d.getTime() === to.getTime());\n\n return createPortal(\n <div\n ref={popoverRef}\n style={{\n position: \"fixed\",\n top: pos.top,\n left: pos.left,\n width: 320,\n background: C.white,\n border: `1px solid ${C.borderSubtle}`,\n borderRadius: 12,\n boxShadow: C.shadowPopover,\n padding: 16,\n zIndex: 9999,\n fontFamily: FONT_BODY,\n }}\n >\n {/* Month header with prev/next */}\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", marginBottom: 12 }}>\n <button type=\"button\" onClick={goPrev} style={navBtnStyle} aria-label=\"Previous month\">\n <ChevronLeft size={18} strokeWidth={1.75} />\n </button>\n <div style={{ fontSize: 14, fontWeight: 600, color: C.ink }}>\n {MONTH_NAMES[viewMonth]} {viewYear}\n </div>\n <button type=\"button\" onClick={goNext} style={navBtnStyle} aria-label=\"Next month\">\n <ChevronRight size={18} strokeWidth={1.75} />\n </button>\n </div>\n\n {/* Day-of-week header */}\n <div style={{ display: \"grid\", gridTemplateColumns: \"repeat(7, 1fr)\", gap: 2, marginBottom: 4 }}>\n {DOW_LABELS.map((d) => (\n <div key={d} style={{ textAlign: \"center\", fontSize: 12, color: C.muted, padding: \"4px 0\" }}>\n {d}\n </div>\n ))}\n </div>\n\n {/* Day grid */}\n <div style={{ display: \"grid\", gridTemplateColumns: \"repeat(7, 1fr)\", gap: 2 }}>\n {days.map((d) => {\n const inMonth = d.getMonth() === viewMonth;\n const inRange = isInRange(d);\n const edge = isEdge(d);\n const isToday = d.getTime() === today.getTime();\n const isFuture = d > today;\n return (\n <button\n key={d.toISOString()}\n type=\"button\"\n onClick={() => handleDayClick(d)}\n disabled={isFuture}\n aria-disabled={isFuture}\n style={{\n height: 36,\n border: \"none\",\n borderRadius: 8,\n background: edge ? C.black : inRange ? C.hoverWarm40 : \"transparent\",\n color: edge ? C.white : isFuture ? C.textFaintGrey : inMonth ? C.ink : C.muted,\n fontFamily: FONT_BODY,\n fontSize: 13,\n fontWeight: isToday ? 500 : 400,\n cursor: isFuture ? \"not-allowed\" : \"pointer\",\n opacity: isFuture ? 0.6 : 1,\n }}\n >\n {d.getDate()}\n </button>\n );\n })}\n </div>\n\n {/* Footer */}\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", marginTop: 12, paddingTop: 12, borderTop: `1px solid ${C.borderSubtle}` }}>\n <button\n type=\"button\"\n onClick={() => { setFrom(null); setTo(null); }}\n style={{ background: \"transparent\", border: \"none\", padding: 0, cursor: \"pointer\", fontSize: 14, fontWeight: 500, color: C.ink }}\n >\n Clear\n </button>\n <button\n type=\"button\"\n disabled={!from || !to}\n onClick={() => { onApply({ from, to }); onClose(); }}\n style={{\n background: !from || !to ? C.neutralBorder : C.black,\n color: C.white,\n border: \"none\",\n borderRadius: 10,\n height: 30,\n padding: \"0 16px\",\n fontFamily: FONT_BODY,\n fontSize: 14,\n fontWeight: 600,\n cursor: !from || !to ? \"not-allowed\" : \"pointer\",\n }}\n >\n Apply\n </button>\n </div>\n </div>,\n document.body,\n );\n}\n\nconst navBtnStyle = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 28,\n height: 28,\n border: \"none\",\n background: \"transparent\",\n borderRadius: 6,\n cursor: \"pointer\",\n color: C.ink,\n};\n\nfunction DateRangeButton({ value, onChange }) {\n const [open, setOpen] = React.useState(false);\n const triggerRef = React.useRef(null);\n // Highlighted only after the user clicks Apply in the popover (i.e. once a\n // custom date range is committed). Just opening the popover does not\n // activate the button — same active treatment as the 30d/8h/1d/7d chips.\n const active = !!(value?.from && value?.to);\n return (\n <>\n <button\n ref={triggerRef}\n type=\"button\"\n onClick={() => setOpen((o) => !o)}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n height: 32,\n padding: \"0 16px\",\n borderRadius: 10,\n border: active ? \"none\" : `1px solid ${C.neutralBorder}`,\n background: active ? C.black : C.white,\n cursor: \"pointer\",\n fontFamily: FONT_BODY,\n fontSize: 14,\n color: active ? C.white : C.neutral800,\n fontWeight: active ? 600 : 400,\n whiteSpace: \"nowrap\",\n }}\n >\n <CalendarDays size={18} strokeWidth={1.75} />\n Date Range\n </button>\n {open && (\n <DateRangePopover\n value={value}\n anchorRef={triggerRef}\n onClose={() => setOpen(false)}\n onApply={(range) => onChange?.(range)}\n />\n )}\n </>\n );\n}\n\nexport { DateRangeButton };\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_BODY,\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\nfunction SearchBar() {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n height: 32,\n width: 260,\n padding: \"0 12px\",\n borderRadius: 11,\n background: C.white,\n border: `1px solid ${C.neutralLight}`,\n }}\n >\n <Search size={16} strokeWidth={2} style={{ color: \"var(--neutral-400)\" }} />\n <input\n placeholder=\"Search\"\n style={{\n flex: 1,\n border: \"none\",\n outline: \"none\",\n background: \"transparent\",\n fontFamily: FONT_BODY,\n fontSize: 14,\n color: C.ink,\n }}\n />\n </div>\n );\n}\n\nfunction CompassRating({ 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: \"flex\", gap: 4 }}>\n {Array.from({ length: max }).map((_, i) => {\n if (i < full) {\n return (\n <span\n key={i}\n style={{\n width: 10,\n height: 10,\n borderRadius: \"50%\",\n background: C.black,\n display: \"inline-block\",\n }}\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\n style={{\n width: 6,\n height: 6,\n borderRadius: \"50%\",\n background: C.black,\n display: \"inline-block\",\n }}\n />\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 display: \"inline-block\",\n boxSizing: \"border-box\",\n }}\n />\n );\n })}\n </div>\n );\n}\n\nexport const DEFAULT_AGENT_COLUMNS = [\n { id: \"agent\", label: \"Agent\", width: 180, sortable: true, filterable: true },\n { id: \"supervisor\", label: \"Supervisor\", width: 170, sortable: true, filterable: true },\n { id: \"calls\", label: \"Calls\", width: 100, sortable: true },\n { id: \"baseline\", label: \"Baseline\", width: 110, sortable: true },\n { id: \"lift\", label: \"Lift\", width: 100, sortable: true },\n { id: \"score\", label: \"Score\", width: 100, sortable: true, filterable: true, filterType: \"number\" },\n {\n id: \"compass\",\n label: \"Compass Score\",\n width: 200,\n sortable: true,\n filterable: true,\n filterType: \"number\",\n render: (value) => (\n <span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 12 }}>\n <span style={{ minWidth: 32 }}>{value}</span>\n <CompassRating value={typeof value === \"number\" ? value : 0} />\n </span>\n ),\n },\n { id: \"totalDuration\", label: \"Total Duration\", width: 150, sortable: true, filterable: true, filterType: \"duration\", filterShowPresets: false },\n { id: \"avgDuration\", label: \"Average Duration\", width: 170, sortable: true, filterable: true, filterType: \"duration\", filterShowPresets: false },\n];\n\n\nfunction SectionHeading({ icon: Icon, title, trailing, iconColor = C.ink, bordered = false }) {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n width: \"100%\",\n paddingBottom: bordered ? 12 : 0,\n borderBottom: bordered ? `1px solid ${C.border}` : \"none\",\n }}\n >\n <div\n style={{\n width: 24,\n height: 24,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n <Icon size={22} strokeWidth={1.75} style={{ color: iconColor }} />\n </div>\n <div\n style={{\n flex: 1,\n fontFamily: FONT_DISPLAY,\n fontWeight: 600,\n fontSize: 16,\n color: C.ink,\n lineHeight: \"1.2\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.02em\",\n }}\n >\n {title}\n </div>\n {trailing && (\n <div style={{ fontFamily: FONT_BODY, fontSize: 14, color: C.ink }}>{trailing}</div>\n )}\n </div>\n );\n}\n\nfunction SubSectionHeading({ icon: Icon, title }) {\n return (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 16, width: \"100%\" }}>\n <div\n style={{\n width: 34,\n height: 34,\n borderRadius: 9999,\n background: C.iconCircle,\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 fontFamily: FONT_DISPLAY,\n fontWeight: 600,\n fontSize: 16,\n color: C.ink,\n lineHeight: \"24px\",\n }}\n >\n {title}\n </span>\n </div>\n );\n}\n\nfunction AccordionItem({ title, summary, calls, percent, bullets, defaultExpanded = false }) {\n const [expanded, setExpanded] = React.useState(defaultExpanded);\n const rows = Array.isArray(bullets) ? bullets : [];\n // Outer container is a div (not a button) so the bullet rows inside can\n // hold <a> link elements without nesting interactive HTML — clicking\n // the header still toggles via the inner button below.\n return (\n <div style={{ borderTop: `1px solid ${C.border}` }}>\n <button\n type=\"button\"\n onClick={() => setExpanded((v) => !v)}\n aria-expanded={expanded}\n style={{\n border: \"none\",\n background: \"transparent\",\n padding: 16,\n display: \"flex\",\n gap: 12,\n alignItems: \"flex-start\",\n cursor: \"pointer\",\n width: \"100%\",\n textAlign: \"left\",\n fontFamily: FONT_BODY,\n }}\n >\n <div\n style={{\n flex: 1,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 12,\n minWidth: 0,\n }}\n >\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 12 }}>\n <div\n style={{\n fontFamily: FONT_DISPLAY,\n fontWeight: 600,\n fontSize: 14,\n color: C.black,\n lineHeight: \"24px\",\n }}\n >\n {title}\n </div>\n <div style={{ fontFamily: FONT_BODY, fontSize: 14, color: C.muted, lineHeight: \"24px\" }}>\n {summary}\n </div>\n </div>\n <div style={{ display: \"flex\", gap: 16 }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n <Phone size={14} color={C.ink} strokeWidth={1.75} />\n <span style={{ fontFamily: FONT_BODY, fontSize: 12, color: C.ink, lineHeight: 1.5 }}>\n {calls}\n </span>\n </div>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n <TrendingUp size={14} color={C.ink} strokeWidth={1.75} />\n <span style={{ fontFamily: FONT_BODY, fontSize: 12, color: C.ink, lineHeight: 1.5 }}>\n {percent}\n </span>\n </div>\n </div>\n </div>\n <ChevronDown\n size={20}\n color={C.ink}\n strokeWidth={2}\n style={{\n flexShrink: 0,\n transform: expanded ? \"rotate(180deg)\" : \"none\",\n transition: \"transform 150ms ease\",\n }}\n />\n </button>\n {expanded && rows.length > 0 && (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 12,\n padding: \"0 16px 16px\",\n }}\n >\n {rows.map((b, i) => (\n <div\n key={i}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n fontFamily: FONT_BODY,\n fontSize: 14,\n color: C.ink,\n lineHeight: \"24px\",\n gap: 16,\n }}\n >\n {b.href ? (\n <a\n href={b.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n color: C.ink,\n textDecoration: \"underline\",\n textUnderlineOffset: 2,\n textDecorationColor: C.border,\n minWidth: 0,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {b.text}\n </a>\n ) : (\n <span\n style={{\n minWidth: 0,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {b.text}\n </span>\n )}\n <span style={{ display: \"inline-flex\", gap: 4, whiteSpace: \"nowrap\" }}>\n <span style={{ color: C.ink }}>{b.citation}</span>\n <span style={{ color: C.muted }}>({b.date})</span>\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction PercentRow({ label, value }) {\n return (\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n padding: \"12px 0\",\n borderBottom: `1px solid ${C.border}`,\n fontFamily: FONT_BODY,\n fontSize: 13,\n lineHeight: \"24px\",\n }}\n >\n <span style={{ color: C.ink }}>{label}</span>\n <span style={{ color: C.muted }}>{value}</span>\n </div>\n );\n}\n\nfunction EmptyState({ message = \"\" }) {\n if (!message) return null;\n return (\n <div\n style={{\n padding: \"16px 0\",\n fontFamily: FONT_BODY,\n fontSize: 13,\n color: C.muted,\n lineHeight: 1.5,\n }}\n >\n {message}\n </div>\n );\n}\n\nexport default function PerformancePanel({\n className = \"\",\n onAgentClick,\n // Header text — empty defaults so host apps don't see demo copy. Hosts pass\n // their own page title / subtitle (the gallery in dev/App.jsx demonstrates\n // the intended \"Performance\" / \"Agent performance metrics...\" wording).\n title = \"\",\n subtitle = \"\",\n dateRangeLabel = \"\",\n // View-by dropdown. `initialViewBy` seeds internal state on mount;\n // `onViewByChange(id)` fires when the user selects a different option.\n viewByOptions = [],\n initialViewBy = \"\",\n onViewByChange,\n // Label rendered above the View-by option list inside the popover. Empty by\n // default; the gallery passes \"Aggregated By\" to reproduce the Figma copy.\n aggregatedByLabel = \"\",\n // KPI strip\n volumeStat = EMPTY_STAT,\n compassStat = EMPTY_STAT,\n baselineSubStat = EMPTY_STAT,\n agentLiftSubStat = EMPTY_STAT,\n scoreSubStat = EMPTY_STAT,\n // Agent table\n agentRows = [],\n agentColumns = [],\n initialPageSize = 10,\n // Insight sections — all titles, empty-state copy, and the section icons /\n // colors are host-driven so the library renders nothing concrete by default.\n guidanceItems = [],\n strengthItems = [],\n callDrivers = [],\n callParadigms = [],\n topSignalsLeft = [],\n topSignalsRight = [],\n topSignalsTrailing = \"\",\n strengthsTitle = \"\",\n guidanceTitle = \"\",\n callMixTitle = \"\",\n driversTitle = \"\",\n paradigmsTitle = \"\",\n topSignalsTitle = \"\",\n emptyStrengthsMessage = \"\",\n emptyGuidanceMessage = \"\",\n emptyDriversMessage = \"\",\n emptyParadigmsMessage = \"\",\n emptyTopSignalsMessage = \"\",\n // Time-range chips (8h / 1d / 7d / 30d). Override `rangeOptions` to customize.\n // `selectedWindow` is the currently-active option id; `onWindowChange(id)` fires\n // 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 // (Same slot pattern as DataTableFilters2's `dateRangePicker` prop.)\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 // Fires when the user clicks the Export CSV button in the header.\n onExport,\n // Fires whenever the user toggles columns in the table's column picker —\n // hosts can scope their CSV export to whatever the user has visible.\n onVisibleColumnsChange,\n}) {\n const [selectedAgent, setSelectedAgent] = React.useState(null);\n const [viewByOpen, setViewByOpen] = React.useState(false);\n const [viewBy, setViewBy] = React.useState(initialViewBy);\n // Internal fallback for the custom date range when the host doesn't pass\n // `dateRange` / `onDateRangeChange`. Lifted up to this component (rather\n // than living inside DateRangeButton) so the time-range chips can become\n // mutually exclusive with 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 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 const viewByTriggerRef = React.useRef(null);\n const viewByPopoverRef = React.useRef(null);\n\n React.useEffect(() => {\n if (!viewByOpen) return;\n const handler = (e) => {\n if (\n viewByPopoverRef.current?.contains(e.target) ||\n viewByTriggerRef.current?.contains(e.target)\n ) {\n return;\n }\n setViewByOpen(false);\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [viewByOpen]);\n\n const viewByLabel =\n viewByOptions.find((o) => o.id === viewBy)?.label || (viewByOptions[0]?.label ?? \"\");\n\n const handleRowClick = (row) => {\n if (onAgentClick) {\n onAgentClick(row);\n return;\n }\n setSelectedAgent(row);\n };\n\n // Keep the panel (including DataTable2) mounted while a details page is shown,\n // so filters / sort / pagination are preserved when the user navigates back.\n return (\n <>\n {selectedAgent && (() => {\n // Compute the start/end the details page should show. Custom range\n // wins; otherwise derive from the selected window so the chip view\n // and the date display stay consistent across the two pages.\n let detailsFrom = null;\n let detailsTo = null;\n if (customRangeActive) {\n detailsFrom = effectiveDateRange.from;\n detailsTo = effectiveDateRange.to;\n } else {\n const ms = RANGE_TO_MS[selectedWindow];\n if (ms) {\n detailsTo = new Date();\n detailsFrom = new Date(detailsTo.getTime() - ms);\n }\n }\n return (\n <PerformanceDetailsPage\n className={className}\n agentName={selectedAgent.agent}\n startDate={detailsFrom || \"\"}\n endDate={detailsTo || \"\"}\n totalCalls={`${selectedAgent.calls} Calls`}\n onBack={() => setSelectedAgent(null)}\n selectedWindow={selectedWindow}\n dateRange={effectiveDateRange}\n />\n );\n })()}\n <div\n className={className}\n style={{\n background: C.white,\n fontFamily: FONT_BODY,\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) when drilling into agent details so DataTable2's\n // internal filter / sort / pagination state survives the round trip.\n display: selectedAgent ? \"none\" : \"flex\",\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"flex-start\", gap: 8, paddingTop: 12 }}>\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\", gap: 4 }}>\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 }}\n >\n {title}\n </h1>\n <p style={{ fontFamily: FONT_BODY, fontSize: 14, color: \"var(--neutral-950)\", margin: 0, lineHeight: \"1.4\" }}>\n {subtitle}\n </p>\n </div>\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_BODY,\n fontSize: 14,\n color: C.neutral800,\n }}\n >\n <Download size={18} strokeWidth={1.75} />\n Export CSV\n </button>\n </div>\n\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\" }}>\n <div style={{ position: \"relative\" }}>\n <button\n type=\"button\"\n ref={viewByTriggerRef}\n onClick={() => setViewByOpen((v) => !v)}\n aria-haspopup=\"listbox\"\n aria-expanded={viewByOpen}\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: \"pointer\",\n fontFamily: FONT_BODY,\n fontSize: 14,\n lineHeight: \"24px\",\n color: C.neutral800,\n whiteSpace: \"nowrap\",\n }}\n >\n {viewByLabel}\n <ChevronDown\n size={20}\n strokeWidth={1.75}\n style={{\n transform: viewByOpen ? \"rotate(180deg)\" : \"none\",\n transition: \"transform 120ms ease\",\n }}\n />\n </button>\n {viewByOpen && (\n <div\n ref={viewByPopoverRef}\n role=\"listbox\"\n style={{\n position: \"absolute\",\n top: 36,\n left: 0,\n zIndex: 20,\n background: C.white,\n border: `1px solid ${C.border}`,\n borderRadius: 4,\n boxShadow: C.shadowDropdown,\n display: \"flex\",\n flexDirection: \"column\",\n minWidth: 144,\n fontFamily: FONT_BODY,\n }}\n >\n {aggregatedByLabel && (\n <div\n style={{\n padding: 12,\n fontFamily: FONT_DISPLAY,\n fontWeight: 600,\n fontSize: 13,\n color: C.ink,\n lineHeight: 1.2,\n }}\n >\n {aggregatedByLabel}\n </div>\n )}\n {viewByOptions.map((opt) => {\n const isSelected = viewBy === opt.id;\n return (\n <button\n key={opt.id}\n type=\"button\"\n role=\"option\"\n aria-selected={isSelected}\n onClick={() => {\n if (opt.id !== viewBy) {\n setViewBy(opt.id);\n onViewByChange?.(opt.id);\n }\n setViewByOpen(false);\n }}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: isSelected ? 12 : \"12px 12px 12px 40px\",\n borderTop: `1px solid ${C.border}`,\n borderLeft: \"none\",\n borderRight: \"none\",\n borderBottom: \"none\",\n background: \"transparent\",\n cursor: \"pointer\",\n textAlign: \"left\",\n fontFamily: FONT_BODY,\n fontSize: 13,\n lineHeight: 1.2,\n color: C.ink,\n width: \"100%\",\n }}\n >\n {isSelected && (\n <Check size={20} color={C.ink} strokeWidth={1.75} style={{ flexShrink: 0 }} />\n )}\n <span>{opt.label}</span>\n </button>\n );\n })}\n </div>\n )}\n </div>\n <div style={{ display: \"flex\", gap: 10, alignItems: \"center\" }}>\n {(() => {\n // Custom range wins if active; otherwise the active chip drives the\n // label. Chip label wins over `dateRangeLabel` so hosts aren't stuck\n // showing date-only strings for 8h when they pass a legacy override.\n const customLabel = customRangeActive\n ? `${formatLocalDate(effectiveDateRange.from)} – ${formatLocalDate(effectiveDateRange.to)}`\n : \"\";\n const label =\n customLabel ||\n computeWindowLabel(selectedWindow) ||\n dateRangeLabel;\n return label ? (\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n fontFamily: FONT_BODY,\n fontSize: 13,\n color: C.ink,\n }}\n >\n <CalendarDays size={16} strokeWidth={1.75} color={C.muted} />\n {label}\n </span>\n ) : null;\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 <React.Suspense\n fallback={<FilterButton icon={CalendarDays}>Date Range</FilterButton>}\n >\n {dateRangePicker}\n </React.Suspense>\n ) : (\n <DateRangeButton value={effectiveDateRange} onChange={handleDateRangeChange} />\n )}\n {/* <SearchBar /> */}\n </div>\n </div>\n\n <div style={{ display: \"flex\", gap: 24 }}>\n <StatCard value={volumeStat.value} label={volumeStat.label} trend={volumeStat.trend} points={volumeStat.points} style={{ width: 264, flexShrink: 0 }} />\n <StatCard value={compassStat.value} label={compassStat.label} trend={compassStat.trend} points={compassStat.points} style={{ width: 264, flexShrink: 0 }} />\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 gap: 24,\n alignItems: \"stretch\",\n boxSizing: \"border-box\",\n }}\n >\n <StatSubCell value={baselineSubStat.value} label={baselineSubStat.label} trend={baselineSubStat.trend} points={baselineSubStat.points} />\n <StatSubCell value={agentLiftSubStat.value} label={agentLiftSubStat.label} trend={agentLiftSubStat.trend} points={agentLiftSubStat.points} withDivider />\n <StatSubCell value={scoreSubStat.value} label={scoreSubStat.label} trend={scoreSubStat.trend} points={scoreSubStat.points} withDivider />\n </div>\n </div>\n\n <DataTable2\n data={agentRows}\n columns={agentColumns}\n initialPageSize={initialPageSize}\n onRowClick={handleRowClick}\n onVisibleColumnsChange={onVisibleColumnsChange}\n />\n\n <div style={{ display: \"flex\", gap: 24, alignItems: \"flex-start\" }}>\n <div style={{ flex: 1, minWidth: 0, display: \"flex\", flexDirection: \"column\", gap: 16 }}>\n <SectionHeading icon={ShieldCheck} title={strengthsTitle} iconColor=\"var(--rail-compliance)\" />\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n borderBottom: `1px solid ${C.border}`,\n maxHeight: 480,\n overflowY: \"auto\",\n }}\n >\n {strengthItems.length === 0 ? (\n <EmptyState message={emptyStrengthsMessage} />\n ) : (\n strengthItems.map((item, i) => <AccordionItem key={i} {...item} />)\n )}\n </div>\n </div>\n <div style={{ flex: 1, minWidth: 0, display: \"flex\", flexDirection: \"column\", gap: 16 }}>\n <SectionHeading icon={Lightbulb} title={guidanceTitle} iconColor=\"var(--rail-compliance)\" />\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n borderBottom: `1px solid ${C.border}`,\n maxHeight: 480,\n overflowY: \"auto\",\n }}\n >\n {guidanceItems.length === 0 ? (\n <EmptyState message={emptyGuidanceMessage} />\n ) : (\n guidanceItems.map((item, i) => <AccordionItem key={i} {...item} />)\n )}\n </div>\n </div>\n </div>\n\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 16 }}>\n <SectionHeading icon={Phone} title={callMixTitle} iconColor=\"var(--rail-compliance)\" />\n <div style={{ display: \"flex\", gap: 24, alignItems: \"flex-start\" }}>\n <div style={{ flex: 1, minWidth: 0, display: \"flex\", flexDirection: \"column\", gap: 8 }}>\n <SubSectionHeading icon={FolderKanban} title={driversTitle} />\n <div style={{ display: \"flex\", flexDirection: \"column\", maxHeight: 480, overflowY: \"auto\" }}>\n {callDrivers.length === 0 ? (\n <EmptyState message={emptyDriversMessage} />\n ) : (\n callDrivers.map((row, i) => <PercentRow key={i} {...row} />)\n )}\n </div>\n </div>\n <div style={{ flex: 1, minWidth: 0, display: \"flex\", flexDirection: \"column\", gap: 8 }}>\n <SubSectionHeading icon={Layers} title={paradigmsTitle} />\n <div style={{ display: \"flex\", flexDirection: \"column\", maxHeight: 480, overflowY: \"auto\" }}>\n {callParadigms.length === 0 ? (\n <EmptyState message={emptyParadigmsMessage} />\n ) : (\n callParadigms.map((row, i) => <PercentRow key={i} {...row} />)\n )}\n </div>\n </div>\n </div>\n </div>\n\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 16 }}>\n <SectionHeading icon={Signal} title={topSignalsTitle} iconColor=\"var(--rail-compliance)\" trailing={topSignalsTrailing} bordered />\n {topSignalsLeft.length === 0 && topSignalsRight.length === 0 ? (\n <EmptyState message={emptyTopSignalsMessage} />\n ) : (\n <div style={{ display: \"flex\", gap: 24 }}>\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\" }}>\n {topSignalsLeft.map((row, i) => (\n <PercentRow key={i} {...row} />\n ))}\n </div>\n <div style={{ flex: 1, display: \"flex\", flexDirection: \"column\" }}>\n {topSignalsRight.map((row, i) => (\n <PercentRow key={i} {...row} />\n ))}\n </div>\n </div>\n )}\n </div>\n </div>\n </>\n );\n}\n"],"names":["RANGE_TO_MS","LOCALE","DATE_OPTS","TIME_OPTS","coalesceToDate","input","str","ymd","d","parsed","isSameLocalCalendarDay","a","b","formatLocalDate","date","formatLocalTime","formatLocalDateTime","formatEightHourWindowLabel","from","to","f","t","formatEightHourRangeEndpoints","getPresetWindowDates","windowId","ms","computeWindowLabel","range","SPARK_DEFAULT_LINE","SPARK_DEFAULT_AREA","normalizeSparkPoints","points","numeric","p","n","buildSparkPaths","vbW","vbH","min","max","padY","span","usableH","sx","i","sy","v","line","lastX","firstX","area","trendFromPoints","first","last","METRIC_PLACEHOLDER","isNullishMetric","value","hasMeaningfulMetric","formatMetricDisplay","fallback","hasHostMetricField","hasChartData","chart","trendFromSignedValue","text","parenMatch","resolveTrend","trend","signedText","resolveKpiTrend","C","FONT_DISPLAY","FONT_BODY","TrendArrow","direction","color","upPath","downPath","jsx","formatDisplayDate","opts","RangeChip","label","active","onClick","CompassLineChart","yLabelsProp","xLabels","highlightIndex","xAxisLabel","yAxisLabel","hoveredPoint","setHoveredPoint","React","width","height","hasData","gradId","MAX_X_TICKS","allXLabels","visibleXLabels","_","gridCount","gridXs","jsxs","gx","dataPairs","y","yValues","yDataMin","yDataMax","yPad","yMin","yMax","ySpan","normalized","x","yLabels","abs","decimals","minX","xSpan","xPad","innerWidth","formatPointValue","linePath","areaPath","highlight","l","isHighlight","_a","ChartCard","title","delta","children","displayValue","showDelta","deltaTrend","SectionHeading","Icon","trailing","iconColor","bordered","CitationRow","bullet","citation","href","AccordionRow","summary","calls","percent","bullets","defaultExpanded","expanded","setExpanded","trailingRaw","showTrailing","TrendIcon","TrendingDown","TrendingUp","rows","Phone","ChevronDown","PercentRow","CompassDots","full","hasPartial","DEFAULT_SESSION_COLUMNS","num","SubSectionHeading","PerformanceDetailsPage","agentName","startDate","endDate","totalCalls","onBack","className","kpiBaseline","kpiAgentLift","kpiScore","baselineChart","agentLiftChart","scoreChart","csatChart","volumeChart","guidanceItems","strengthItems","callDrivers","callParadigms","strengthsTitle","guidanceTitle","callMixTitle","driversTitle","paradigmsTitle","sessionsTitle","baselineChartTitle","agentLiftChartTitle","scoreChartTitle","csatChartTitle","volumeChartTitle","sessions","sessionColumns","initialPageSize","selectedWindow","onWindowChange","dateRange","onDateRangeChange","sessionsTotal","sessionsPage","sessionsPageSize","onSessionsPageChange","onSessionsPageSizeChange","onExport","onSessionClick","onSessionsVisibleColumnsChange","customRangeActive","eightHourRange","presetDateRange","showRow1","showRow2","ArrowLeft","Download","CalendarDays","ArrowRight","opt","DateRangeButton","ShieldCheck","item","Lightbulb","FolderKanban","row","Layers","DataTable2","EMPTY_STAT","Sparkline","id","built","resolveStatTrend","StatCard","muted","beigeBg","style","StatSubCell","withDivider","FilterButton","Trailing","MONTH_NAMES","DOW_LABELS","startOfDay","buildCalendarGrid","year","month","startWeekday","gridStart","DateRangePopover","onApply","onClose","anchorRef","popoverRef","setFrom","setTo","initialMonth","viewYear","setViewYear","viewMonth","setViewMonth","pos","setPos","updatePosition","r","POPOVER_WIDTH","handleClick","e","_b","handleKey","days","today","handleDayClick","day","goPrev","goNext","isInRange","isEdge","createPortal","navBtnStyle","ChevronLeft","ChevronRight","inMonth","inRange","edge","isToday","isFuture","onChange","open","setOpen","triggerRef","Fragment","o","DEFAULT_RANGE_OPTIONS","CompassRating","DEFAULT_AGENT_COLUMNS","AccordionItem","EmptyState","message","PerformancePanel","onAgentClick","subtitle","dateRangeLabel","viewByOptions","initialViewBy","onViewByChange","aggregatedByLabel","volumeStat","compassStat","baselineSubStat","agentLiftSubStat","scoreSubStat","agentRows","agentColumns","topSignalsLeft","topSignalsRight","topSignalsTrailing","topSignalsTitle","emptyStrengthsMessage","emptyGuidanceMessage","emptyDriversMessage","emptyParadigmsMessage","emptyTopSignalsMessage","rangeOptions","dateRangePicker","onVisibleColumnsChange","selectedAgent","setSelectedAgent","viewByOpen","setViewByOpen","viewBy","setViewBy","internalDateRange","setInternalDateRange","effectiveDateRange","handleDateRangeChange","handleWindowChange","viewByTriggerRef","viewByPopoverRef","handler","viewByLabel","handleRowClick","detailsFrom","detailsTo","isSelected","Check","Signal"],"mappings":"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"}