chordia-ui 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +90 -0
- package/dist/Timeline.cjs.js +7 -0
- package/dist/Timeline.cjs.js.map +1 -0
- package/dist/Timeline.es.js +5961 -0
- package/dist/Timeline.es.js.map +1 -0
- package/dist/index.cjs.js +34 -0
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.es.js +9343 -0
- package/dist/index.es.js.map +1 -0
- package/dist/pages/interactionDetails.cjs.js +11 -0
- package/dist/pages/interactionDetails.cjs.js.map +1 -0
- package/dist/pages/interactionDetails.es.js +2126 -0
- package/dist/pages/interactionDetails.es.js.map +1 -0
- package/package.json +71 -0
- package/src/tokens/colors.css +150 -0
- package/src/tokens/fonts.css +145 -0
- package/src/tokens/index.css +4 -0
- package/src/tokens/spacing.css +54 -0
- package/src/tokens/typography.css +38 -0
- package/src/utils/cn.js +11 -0
- package/src/utils/index.js +1 -0
- package/tailwind.preset.js +204 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactionDetails.es.js","sources":["../../src/components/common/EvidenceItem.jsx","../../src/components/common/AgentLiftCard.jsx","../../src/components/pages/interactionDetails/CoachingSynthesisCard.jsx","../../src/components/pages/interactionDetails/InteractionContext.jsx","../../src/components/pages/interactionDetails/InteractionScores.jsx","../../src/components/pages/interactionDetails/InteractionSignals.jsx","../../src/components/pages/interactionDetails/InteractionGuidance.jsx","../../src/components/pages/interactionDetails/InteractionNBA.jsx","../../src/components/pages/interactionDetails/InteractionRecording.jsx","../../src/components/pages/interactionDetails/InteractionTranscript.jsx","../../src/components/common/MessageThread.jsx","../../src/components/pages/interactionDetails/InteractionDetailPanel.jsx","../../src/components/pages/interactionDetails/ExpandPatternComparison.jsx"],"sourcesContent":["import React from 'react';\r\nimport { User, UserCheck, Play, ScrollText } from 'lucide-react';\r\nimport SmallButton from '../primitives/SmallButton.jsx';\r\n\r\nfunction fmtMs(ms) {\r\n return `${Math.floor(ms / 60000)}:${String(Math.floor((ms % 60000) / 1000)).padStart(2, '0')}`;\r\n}\r\n\r\nexport default function EvidenceItem({ ev, onPlay, onHighlight }) {\r\n const actor = ev.actor === 'agent' ? <UserCheck size={11} /> : <User size={11} />;\r\n return (\r\n <div style={{\r\n fontSize: 'var(--text-sm)', padding: '6px 10px', borderRadius: 'var(--radius-sm)',\r\n background: 'var(--paper-elevated)', border: '1px solid var(--border)', marginTop: 4,\r\n }}>\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 5, marginBottom: 3 }}>\r\n <span style={{ color: 'var(--text-muted)' }}>{actor}</span>\r\n {ev.source && <span style={{ color: 'var(--text-muted)', fontWeight: 500 }}>{ev.source}</span>}\r\n <span style={{ marginLeft: 'auto', display: 'flex', gap: 4, alignItems: 'center' }}>\r\n {ev.start_ms != null && (\r\n <SmallButton variant=\"ghost\" size=\"sm\" onClick={() => onPlay(ev.start_ms, ev.end_ms)} title=\"Play audio\"><Play size={10} /></SmallButton>\r\n )}\r\n {ev.turn_ids?.length > 0 && (\r\n <SmallButton variant=\"ghost\" size=\"sm\" onClick={() => onHighlight(ev.turn_ids)} title=\"Show in transcript\"><ScrollText size={10} /></SmallButton>\r\n )}\r\n {ev.start_ms != null && (\r\n <span style={{ fontSize: 'var(--text-xs)', color: 'var(--text-faint)' }}>{fmtMs(ev.start_ms)}</span>\r\n )}\r\n </span>\r\n </div>\r\n <div style={{ color: 'var(--text-base)', fontStyle: 'italic', lineHeight: 1.4 }}>\"{(ev.text || '').slice(0, 200)}\"</div>\r\n </div>\r\n );\r\n}\r\n","import React from 'react';\r\nimport { TrendingUp } from 'lucide-react';\r\nimport DetailCard from '../primitives/DetailCard.jsx';\r\nimport Tag from '../primitives/Tag.jsx';\r\n\r\nexport default function AgentLiftCard({ outcomeLift }) {\r\n if (outcomeLift.lift == null) return null;\r\n\r\n const pExpected = outcomeLift.p_expected;\r\n const pFull = outcomeLift.p_full;\r\n const liftRaw = outcomeLift.lift_raw ?? (pFull != null && pExpected != null ? pFull - pExpected : null);\r\n const liftRecentered = outcomeLift.lift;\r\n\r\n const fmtPct = (v) => v != null ? Math.round(v * 100) + '%' : '—';\r\n const fmtPp = (v) => {\r\n if (v == null) return '—';\r\n const pp = (v * 100).toFixed(1);\r\n return v > 0 ? `+${pp}pp` : `${pp}pp`;\r\n };\r\n\r\n const liftColor = (v) =>\r\n v > 0 ? 'var(--state-present)' : v < 0 ? '#f87171' : 'var(--text-muted)';\r\n\r\n return (\r\n <DetailCard title={\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 4 }}>\r\n <TrendingUp size={12} /> Agent Lift Analysis\r\n </div>\r\n }>\r\n {/* Main equation row: Baseline + Impact = Outcome */}\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 16 }}>\r\n {/* Call Difficulty Baseline */}\r\n <div style={{ textAlign: 'center', flex: 1 }}>\r\n <div style={{ fontSize: 20, fontWeight: 600, color: 'var(--text-faint)' }}>\r\n {fmtPct(pExpected)}\r\n </div>\r\n <div style={{ fontSize: 10, color: 'var(--text-faint)', marginTop: 2 }}>Expected Outcome</div>\r\n <div style={{ fontSize: 9, color: 'var(--text-faint)', marginTop: 1 }}>Based on call type & difficulty</div>\r\n </div>\r\n\r\n {/* Plus sign */}\r\n <div style={{ fontSize: 16, color: 'var(--text-faint)', fontWeight: 300 }}>+</div>\r\n\r\n {/* Agent Impact (raw lift) */}\r\n <div style={{ textAlign: 'center', flex: 1 }}>\r\n <div style={{ fontSize: 20, fontWeight: 700, color: liftColor(liftRaw) }}>\r\n {fmtPp(liftRaw)}\r\n </div>\r\n <div style={{ fontSize: 10, color: 'var(--text-muted)', marginTop: 2 }}>Agent Impact</div>\r\n <div style={{ fontSize: 9, color: 'var(--text-faint)', marginTop: 1 }}>Behavior-driven change</div>\r\n </div>\r\n\r\n {/* Equals sign */}\r\n <div style={{ fontSize: 16, color: 'var(--text-faint)', fontWeight: 300 }}>=</div>\r\n\r\n {/* Agent Outcome */}\r\n <div style={{ textAlign: 'center', flex: 1 }}>\r\n <div style={{ fontSize: 20, fontWeight: 600, color: 'var(--text-ink)' }}>\r\n {fmtPct(pFull)}\r\n </div>\r\n <div style={{ fontSize: 10, color: 'var(--text-muted)', marginTop: 2 }}>Predicted Outcome</div>\r\n <div style={{ fontSize: 9, color: 'var(--text-faint)', marginTop: 1 }}>With agent behaviors</div>\r\n </div>\r\n </div>\r\n\r\n {/* Recentered lift — the \"so what\" */}\r\n <div style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: 8,\r\n padding: '8px 12px',\r\n borderRadius: 6,\r\n background: 'var(--surface-raised, #f5f5f5)',\r\n marginBottom: 12,\r\n }}>\r\n <span style={{ fontSize: 10, color: 'var(--text-muted)' }}>vs. Average Agent:</span>\r\n <span style={{\r\n fontSize: 14,\r\n fontWeight: 700,\r\n color: liftColor(liftRecentered),\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 4,\r\n }}>\r\n {fmtPp(liftRecentered)}\r\n <svg width=\"10\" height=\"7\">\r\n {liftRecentered > 0 ? (\r\n <path d=\"M5 0 L9 6 L1 6 Z\" fill=\"var(--state-present)\" />\r\n ) : liftRecentered < 0 ? (\r\n <path d=\"M5 6 L9 0 L1 0 Z\" fill=\"#f87171\" />\r\n ) : (\r\n <rect x=\"1\" y=\"2.5\" width=\"8\" height=\"1\" fill=\"var(--text-muted)\" />\r\n )}\r\n </svg>\r\n </span>\r\n {outcomeLift.interpretation?.lift_band && (\r\n <span style={{\r\n fontSize: 9,\r\n fontWeight: 600,\r\n color: liftColor(liftRecentered),\r\n textTransform: 'capitalize',\r\n }}>\r\n {outcomeLift.interpretation.lift_band.replace(/_/g, ' ')}\r\n </span>\r\n )}\r\n </div>\r\n\r\n {/* Key Drivers */}\r\n {outcomeLift.driver_signal_keys?.length > 0 && (\r\n <div>\r\n <div style={{ fontSize: 9, fontWeight: 600, color: 'var(--text-muted)', marginBottom: 6, textTransform: 'uppercase', letterSpacing: '0.04em' }}>\r\n Key Drivers\r\n </div>\r\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>\r\n {outcomeLift.driver_signal_keys.map((key, i) => (\r\n <Tag key={i} variant=\"default\" size=\"xs\">\r\n {key.replace(/^sig\\./, '').replace(/_/g, ' ')}\r\n </Tag>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </DetailCard>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport { TrendingUp, Lightbulb, Building, MessageSquareQuote } from \"lucide-react\";\r\n\r\n/**\r\n * CoachingSynthesisCard — displays LLM-generated coaching synthesis from Compass.\r\n *\r\n * Props:\r\n * - data object Coaching synthesis response (see shape below)\r\n * - loading boolean Show shimmer loading state\r\n * - error string Error message to display\r\n *\r\n * Data shape (from compass/summaries/coaching.py):\r\n * - one_liner string One-sentence summary\r\n * - context string Situational factors\r\n * - strengths Array<{ text: string, quote?: string }>\r\n * - improvements Array<{ text: string, quote?: string }>\r\n * - organizational Array<{ text: string, quote?: string }> (alias: organizational_insights)\r\n * - overall string \"effective\" | \"strong\" | \"needs_improvement\" | \"mixed\"\r\n */\r\n\r\nconst STYLE_ID = \"coaching-synthesis-keyframes\";\r\n\r\nfunction ensureKeyframes() {\r\n if (typeof document === \"undefined\") return;\r\n if (document.getElementById(STYLE_ID)) return;\r\n const style = document.createElement(\"style\");\r\n style.id = STYLE_ID;\r\n style.textContent = `\r\n @keyframes coaching-shimmer {\r\n 0% { background-position: -200% 0; }\r\n 100% { background-position: 200% 0; }\r\n }\r\n @keyframes coaching-pulse {\r\n 0%, 100% { opacity: 0.4; }\r\n 50% { opacity: 1; }\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n}\r\n\r\nexport default function CoachingSynthesisCard({ data, loading, error }) {\r\n React.useEffect(() => { ensureKeyframes(); }, []);\r\n\r\n // Loading state\r\n if (loading) {\r\n return (\r\n <div style={{\r\n padding: \"20px 0\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: 12,\r\n }}>\r\n <div style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: 8,\r\n }}>\r\n <div style={{\r\n width: 6,\r\n height: 6,\r\n borderRadius: \"50%\",\r\n background: \"var(--rail-tone)\",\r\n animation: \"coaching-pulse 1.5s ease-in-out infinite\",\r\n }} />\r\n <span style={{\r\n fontSize: \"var(--text-base)\",\r\n color: \"var(--rail-tone)\",\r\n fontFamily: \"var(--font-sans)\",\r\n fontWeight: 500,\r\n }}>\r\n Compass is synthesizing coaching insights…\r\n </span>\r\n </div>\r\n {/* Shimmer lines */}\r\n {[180, 260, 220].map((w, i) => (\r\n <div\r\n key={i}\r\n style={{\r\n height: 10,\r\n width: w,\r\n maxWidth: \"100%\",\r\n borderRadius: 4,\r\n background: \"linear-gradient(90deg, var(--hover-warm-subtle) 25%, var(--hover-warm) 50%, var(--hover-warm-subtle) 75%)\",\r\n backgroundSize: \"200% 100%\",\r\n animation: `coaching-shimmer 1.8s ease-in-out infinite`,\r\n animationDelay: `${i * 0.2}s`,\r\n }}\r\n />\r\n ))}\r\n </div>\r\n );\r\n }\r\n\r\n // Error state\r\n if (error) {\r\n return (\r\n <div style={{\r\n padding: \"16px 0\",\r\n fontSize: \"var(--text-base)\",\r\n color: \"var(--text-faint)\",\r\n fontFamily: \"var(--font-sans)\",\r\n }}>\r\n Unable to generate coaching summary.\r\n </div>\r\n );\r\n }\r\n\r\n // No data\r\n if (!data) return null;\r\n\r\n const strengths = data.strengths || [];\r\n const improvements = data.improvements || [];\r\n const organizational = data.organizational || data.organizational_insights || [];\r\n const oneLiner = typeof data.one_liner === \"string\" ? data.one_liner : data.one_liner?.text || \"\";\r\n const context = typeof data.context === \"string\" ? data.context : data.context?.text || \"\";\r\n\r\n return (\r\n <div style={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: 14,\r\n fontFamily: \"var(--font-sans)\",\r\n }}>\r\n {/* One-liner */}\r\n {oneLiner && (\r\n <div style={{\r\n fontSize: \"var(--text-lg)\",\r\n fontWeight: 600,\r\n color: \"var(--text-strong)\",\r\n lineHeight: 1.4,\r\n }}>\r\n {oneLiner}\r\n </div>\r\n )}\r\n\r\n {/* Context */}\r\n {context && (\r\n <div style={{\r\n fontSize: \"var(--text-base)\",\r\n color: \"var(--text-muted)\",\r\n lineHeight: 1.45,\r\n }}>\r\n {context}\r\n </div>\r\n )}\r\n\r\n {/* Strengths */}\r\n {strengths.length > 0 && (\r\n <CoachingSection\r\n icon={<TrendingUp size={13} />}\r\n label=\"Strengths\"\r\n color=\"var(--rail-discovery)\"\r\n items={strengths}\r\n />\r\n )}\r\n\r\n {/* Improvements */}\r\n {improvements.length > 0 && (\r\n <CoachingSection\r\n icon={<Lightbulb size={13} />}\r\n label=\"Improvements\"\r\n color=\"var(--rail-compliance)\"\r\n items={improvements}\r\n />\r\n )}\r\n\r\n {/* Organizational */}\r\n {organizational.length > 0 && (\r\n <CoachingSection\r\n icon={<Building size={13} />}\r\n label=\"Organizational\"\r\n color=\"var(--rail-outcome)\"\r\n items={organizational}\r\n />\r\n )}\r\n\r\n {/* Overall rating */}\r\n {data.overall && (\r\n <div style={{\r\n fontSize: \"var(--text-base)\",\r\n color: \"var(--text-faint)\",\r\n fontStyle: \"italic\",\r\n marginTop: 2,\r\n }}>\r\n Overall: {data.overall.replace(/_/g, \" \")}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nfunction CoachingSection({ icon, label, color, items }) {\r\n return (\r\n <div>\r\n {/* Section header */}\r\n <div style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: 5,\r\n marginBottom: 6,\r\n color,\r\n fontSize: \"var(--text-base)\",\r\n fontWeight: 650,\r\n letterSpacing: \"0.04em\",\r\n }}>\r\n {icon}\r\n {label}\r\n </div>\r\n\r\n {/* Items */}\r\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 6 }}>\r\n {items.map((item, i) => {\r\n const text = typeof item === \"string\" ? item : item?.text || \"\";\r\n const quote = typeof item === \"object\" ? item?.quote : null;\r\n\r\n return (\r\n <div key={i} style={{ paddingLeft: 14 }}>\r\n <div style={{\r\n fontSize: \"var(--text-base)\",\r\n color: \"var(--text-base)\",\r\n lineHeight: 1.4,\r\n }}>\r\n • {text}\r\n </div>\r\n {quote && (\r\n <div style={{\r\n display: \"flex\",\r\n alignItems: \"flex-start\",\r\n gap: 4,\r\n marginTop: 3,\r\n paddingLeft: 8,\r\n }}>\r\n <MessageSquareQuote\r\n size={10}\r\n style={{\r\n color: \"var(--text-faint)\",\r\n flexShrink: 0,\r\n marginTop: 2,\r\n }}\r\n />\r\n <span style={{\r\n fontSize: \"var(--text-base)\",\r\n color: \"var(--text-muted)\",\r\n fontStyle: \"italic\",\r\n lineHeight: 1.35,\r\n }}>\r\n \"{quote}\"\r\n </span>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import React from 'react';\r\nimport CardBase from '../../primitives/Card.jsx';\r\n\r\nfunction fmtDur(seconds) {\r\n const m = Math.floor(seconds / 60);\r\n const s = Math.round(seconds % 60);\r\n return `${m}:${s.toString().padStart(2, '0')}`;\r\n}\r\n\r\nexport default function InteractionContext({ title, meta, callPurpose, classification, dimensions }) {\r\n const cp = callPurpose || {};\r\n const cls = classification || {};\r\n\r\n return (\r\n <CardBase variant=\"elevated\" padding=\"sm\">\r\n <div style={{ fontSize: 'var(--text-md)', fontWeight: 550, color: 'var(--text-strong)', lineHeight: 1.375, marginBottom: 6 }}>\r\n {title}\r\n </div>\r\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr 1fr', gap: '4px 12px', fontSize: 11, color: 'var(--text-muted)' }}>\r\n {meta.evaluated_dt && <div><span style={{ fontSize: 10, color: 'var(--text-faint)' }}>Date</span><div style={{ color: 'var(--text-base)' }}>{new Date(meta.evaluated_dt).toLocaleString()}</div></div>}\r\n {meta.duration_seconds != null && <div><span style={{ fontSize: 10, color: 'var(--text-faint)' }}>Duration</span><div style={{ color: 'var(--text-base)' }}>{fmtDur(meta.duration_seconds)}</div></div>}\r\n {meta.message_count && <div><span style={{ fontSize: 10, color: 'var(--text-faint)' }}>Messages</span><div style={{ color: 'var(--text-base)' }}>{meta.message_count}</div></div>}\r\n {cp.interaction_direction && <div><span style={{ fontSize: 10, color: 'var(--text-faint)' }}>Direction</span><div style={{ color: 'var(--text-base)' }}>{cp.interaction_direction}</div></div>}\r\n {cp.interaction_driver && <div><span style={{ fontSize: 10, color: 'var(--text-faint)' }}>Driver</span><div style={{ color: 'var(--text-base)' }}>{cp.interaction_driver}</div></div>}\r\n {cp.customer_intent && <div><span style={{ fontSize: 10, color: 'var(--text-faint)' }}>Intent</span><div style={{ color: 'var(--text-base)' }}>{cp.customer_intent}</div></div>}\r\n {cls.interaction_paradigm && <div><span style={{ fontSize: 10, color: 'var(--text-faint)' }}>Paradigm</span><div style={{ color: 'var(--text-base)' }}>{cls.interaction_paradigm}</div></div>}\r\n {dimensions.map((dim, i) => (\r\n <div key={i}><span style={{ fontSize: 10, color: 'var(--text-faint)' }}>{dim.label || dim.key}</span><div style={{ color: 'var(--text-base)' }}>{dim.value}</div></div>\r\n ))}\r\n </div>\r\n {meta.session_id && (\r\n <div style={{ fontSize: 9, color: 'var(--text-faint)', fontFamily: 'var(--font-mono)', marginTop: 4, userSelect: 'all' }}>\r\n {meta.session_id}\r\n </div>\r\n )}\r\n </CardBase>\r\n );\r\n}","import React from 'react';\r\nimport DetailCard from '../../primitives/DetailCard.jsx';\r\n\r\nexport default function InteractionScores({ scores }) {\r\n if (!scores?.length) return null;\r\n\r\n return (\r\n <DetailCard title=\"Scores\">\r\n <div style={{ display: 'flex', gap: 24, flexWrap: 'wrap' }}>\r\n {scores.map((s, i) => {\r\n const val = s.value != null ? Math.round(s.value) : null;\r\n return (\r\n <div key={i} style={{ textAlign: 'center', minWidth: 48 }}>\r\n <div style={{ fontSize: 20, fontWeight: 700, color: 'var(--text-ink)' }}>{val ?? '—'}</div>\r\n <div style={{ fontSize: 'var(--text-sm)', color: 'var(--text-muted)', marginTop: 2 }}>{s.label || s.key}</div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </DetailCard>\r\n );\r\n}","import React, { useMemo } from 'react';\r\nimport { Target, CheckCircle, Lightbulb, Scale, Zap, MessageSquare, FileText, ChevronDown } from 'lucide-react';\r\nimport DetailCard from '../../primitives/DetailCard.jsx';\r\nimport SectionLabel from '../../primitives/SectionLabel.jsx';\r\nimport EvidenceItem from '../../common/EvidenceItem.jsx';\r\n\r\nconst GROUP_LABELS = {\r\n outcome: { label: 'Outcome', icon: <Target size={12} />, color: 'var(--rail-outcome)' },\r\n process: { label: 'Process & Protocol', icon: <FileText size={12} />, color: 'var(--rail-discovery)' },\r\n compliance: { label: 'Compliance', icon: <Scale size={12} />, color: 'var(--rail-compliance)' },\r\n customer_friction: { label: 'Customer Friction', icon: <Zap size={12} />, color: 'var(--rail-coral)' },\r\n experience: { label: 'Experience', icon: <MessageSquare size={12} />, color: 'var(--rail-teal)' },\r\n};\r\n\r\nconst KIND_COLORS = {\r\n risk: { icon: <Zap size={10} />, color: 'var(--rail-signal-churn)' },\r\n opportunity: { icon: <Lightbulb size={10} />, color: 'var(--state-unknown)' },\r\n excellence: { icon: <CheckCircle size={10} />, color: 'var(--rail-teal)' },\r\n};\r\n\r\nexport default function InteractionSignals({ signals, expandedSignals, toggleSignal, playAudio, highlightTurns }) {\r\n if (!signals?.signals?.length) return null;\r\n\r\n const grouped = useMemo(() => {\r\n const result = {};\r\n for (const s of signals.signals) {\r\n const g = s.group || 'experience';\r\n if (!result[g]) result[g] = [];\r\n result[g].push(s);\r\n }\r\n return result;\r\n }, [signals]);\r\n\r\n return (\r\n <DetailCard title={`Signals (${signals.present_count} present / ${signals.total_signals_evaluated} evaluated)`}>\r\n {Object.entries(grouped).map(([groupKey, groupSignals]) => {\r\n const info = GROUP_LABELS[groupKey] || GROUP_LABELS.experience;\r\n\r\n return (\r\n <div key={groupKey} style={{ marginBottom: 10 }}>\r\n <SectionLabel style={{ display: 'flex', alignItems: 'center', gap: 4 }}>\r\n {info.icon}\r\n <span>{info.label}</span>\r\n </SectionLabel>\r\n\r\n <div style={{ marginTop: 4, display: 'flex', flexDirection: 'column', gap: 6 }}>\r\n {groupSignals.map((s, i) => {\r\n const name = s.display_name || s.key || '';\r\n const delta = s.baseline?.delta;\r\n const hasObs = s.observations?.length > 0;\r\n const isExpanded = expandedSignals.has(s.key);\r\n \r\n // Map signal group to Tag variant\r\n const getVariant = (group) => {\r\n switch (group) {\r\n case 'outcome': return 'phase';\r\n case 'process': return 'tool';\r\n case 'compliance': return 'policy';\r\n case 'customer_friction': return 'default';\r\n case 'experience': return 'global';\r\n default: return 'default';\r\n }\r\n };\r\n \r\n return (\r\n <div\r\n key={i}\r\n id={`signal-${s.key}`}\r\n style={{\r\n border: '1px solid var(--border)',\r\n borderRadius: 'var(--radius-md)',\r\n background: 'var(--paper)',\r\n overflow: 'hidden',\r\n }}\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={(e) => {\r\n if (hasObs) {\r\n toggleSignal(s.key);\r\n e.currentTarget.blur();\r\n }\r\n }}\r\n style={{\r\n width: '100%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n padding: '6px 10px',\r\n background: 'transparent',\r\n border: 'none',\r\n cursor: hasObs ? 'pointer' : 'default',\r\n }}\r\n title={[\r\n s.confidence != null ? `Confidence: ${Math.round(s.confidence * 100)}%` : '',\r\n delta != null ? `Δ baseline: ${delta > 0 ? '+' : ''}${(delta * 100).toFixed(1)}%` : '',\r\n ].filter(Boolean).join(' · ')}\r\n >\r\n <span\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 6,\r\n whiteSpace: 'nowrap',\r\n }}\r\n >\r\n {KIND_COLORS[s.kind]?.icon}\r\n <span>{name}</span>\r\n {hasObs && (\r\n <span\r\n style={{\r\n marginLeft: 4,\r\n fontSize: 10,\r\n opacity: 0.6,\r\n }}\r\n >\r\n ({s.observations.length})\r\n </span>\r\n )}\r\n </span>\r\n {hasObs && (\r\n <ChevronDown\r\n size={14}\r\n style={{\r\n color: 'var(--text-muted)',\r\n flexShrink: 0,\r\n transform: isExpanded ? 'rotate(180deg)' : 'rotate(0deg)',\r\n transition: 'transform 0.16s ease',\r\n }}\r\n />\r\n )}\r\n </button>\r\n\r\n {isExpanded && s.observations && (\r\n <div style={{ width: '100%', margin: '0 0 6px' }}>\r\n {s.observations.map((obs, oi) => (\r\n <div key={oi} style={{\r\n fontSize: 'var(--text-sm)', color: 'var(--text-muted)', padding: '8px 12px',\r\n background: 'var(--paper)', borderLeft: `3px solid ${info.color}`,\r\n marginBottom: 6, borderRadius: '0 var(--radius-sm) var(--radius-sm) 0',\r\n }}>\r\n <div style={{ fontWeight: 600, color: 'var(--text-base)', marginBottom: 3, fontSize: 'var(--text-base)' }}>{obs.key || ''}</div>\r\n <div style={{ marginBottom: 6, lineHeight: 1.4 }}>{obs.reason || obs.explanation || ''}</div>\r\n {obs.evidence?.map((ev, ei) => (\r\n <EvidenceItem key={ei} ev={ev} onPlay={playAudio} onHighlight={highlightTurns} />\r\n ))}\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </DetailCard>\r\n );\r\n}","import React from 'react';\r\nimport { CheckCircle, Lightbulb, Zap, CornerDownRight } from 'lucide-react';\r\nimport DetailCard from '../../primitives/DetailCard.jsx';\r\nimport EvidenceItem from '../../common/EvidenceItem.jsx';\r\n\r\nconst KIND_COLORS = {\r\n risk: { icon: <Zap size={10} />, color: 'var(--rail-signal-churn)' },\r\n opportunity: { icon: <Lightbulb size={10} />, color: 'var(--state-unknown)' },\r\n excellence: { icon: <CheckCircle size={10} />, color: 'var(--rail-teal)' },\r\n};\r\n\r\nexport default function InteractionGuidance({ guidance, playAudio, highlightTurns }) {\r\n if (!guidance?.items?.length) return null;\r\n\r\n return (\r\n <DetailCard title={`Guidance (${guidance.total_items} items)`}>\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\r\n {guidance.items.map((g, i) => {\r\n const ki = KIND_COLORS[g.guidance_kind] || KIND_COLORS.excellence;\r\n const ownerBadge = g.owner === 'organization'\r\n ? { bg: 'color-mix(in srgb, var(--rail-discovery) 15%, transparent)', color: 'var(--rail-discovery)', text: 'ORG' }\r\n : g.owner === 'shared'\r\n ? { bg: 'color-mix(in srgb, var(--state-unknown) 15%, transparent)', color: 'var(--state-unknown)', text: 'SHARED' }\r\n : { bg: 'color-mix(in srgb, var(--rail-teal) 10%, transparent)', color: 'var(--rail-teal)', text: 'AGENT' };\r\n return (\r\n <div key={i} style={{\r\n padding: '10px 12px', borderRadius: 'var(--radius)',\r\n background: 'var(--paper)', borderLeft: `3px solid ${ki.color}`,\r\n }}>\r\n <div style={{ fontSize: 'var(--text-base)', color: 'var(--text-strong)', display: 'flex', alignItems: 'center', gap: 5, fontWeight: 550 }}>\r\n {ki.icon} {g.title || ''}\r\n <span style={{\r\n fontSize: 9, padding: '1px 6px', borderRadius: 8, marginLeft: 4,\r\n background: ownerBadge.bg, color: ownerBadge.color, fontWeight: 600,\r\n }}>\r\n {ownerBadge.text}\r\n </span>\r\n </div>\r\n {g.detail && <div style={{ fontSize: 'var(--text-sm)', color: 'var(--text-muted)', marginTop: 4, lineHeight: 1.4 }}>{g.detail}</div>}\r\n {/* Signal refs with evidence */}\r\n {g.signal_refs?.map((sr, si) => (\r\n <div key={si} style={{ marginTop: 6 }}>\r\n <div style={{ fontSize: 10, color: 'var(--text-muted)', fontWeight: 600, marginBottom: 3, display: 'flex', alignItems: 'center', gap: 3 }}>\r\n <CornerDownRight size={10} /> {sr.display_name || sr.signal_key}\r\n {sr.confidence != null && <span style={{ fontWeight: 400, opacity: 0.7 }}> ({Math.round(sr.confidence * 100)}%)</span>}\r\n </div>\r\n {sr.evidence?.map((ev, ei) => (\r\n <EvidenceItem key={ei} ev={ev} onPlay={playAudio} onHighlight={highlightTurns} />\r\n ))}\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </DetailCard>\r\n );\r\n}","import React from 'react';\r\nimport { Target } from 'lucide-react';\r\nimport DetailCard from '../../primitives/DetailCard.jsx';\r\n\r\nexport default function InteractionNBA({ nba }) {\r\n const items = nba?.recommendations || nba?.actions || [];\r\n if (!items.length) return null;\r\n\r\n return (\r\n <DetailCard title=\"Next Best Actions\">\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\r\n {items.slice(0, 8).map((r, i) => (\r\n <div key={i} style={{ fontSize: 11, color: 'var(--text-muted)', display: 'flex', alignItems: 'center', gap: 4 }}>\r\n <Target size={12} /> <strong style={{ color: 'var(--text-base)' }}>{r.action || r.title || ''}</strong>\r\n {r.rationale && ` — ${r.rationale}`}\r\n </div>\r\n ))}\r\n </div>\r\n </DetailCard>\r\n );\r\n}","import React from 'react';\r\nimport DetailCard from '../../primitives/DetailCard.jsx';\r\nimport Timeline from '../../media/Timeline.jsx';\r\n\r\nexport default function InteractionRecording({ \r\n audioUrl, \r\n timelineSegments, \r\n durationSeconds, \r\n currentTimeSeconds,\r\n timelinePlaying,\r\n playbackRate,\r\n onSeek,\r\n onTogglePlay,\r\n onSeekBack,\r\n onSeekForward,\r\n onSetPlaybackRate,\r\n audioRef\r\n}) {\r\n if (!audioUrl) return null;\r\n\r\n return (\r\n <DetailCard title=\"Recording\">\r\n <Timeline\r\n segments={timelineSegments}\r\n durationSeconds={durationSeconds || 0}\r\n currentTimeSeconds={currentTimeSeconds}\r\n onSeek={onSeek}\r\n showControls={true}\r\n hasRecording={true}\r\n timelinePlaying={timelinePlaying}\r\n playbackRate={playbackRate}\r\n onTogglePlay={onTogglePlay}\r\n onSeekBack={onSeekBack}\r\n onSeekForward={onSeekForward}\r\n onSetPlaybackRate={onSetPlaybackRate}\r\n />\r\n {/* Hidden audio element for actual playback */}\r\n <audio ref={audioRef} preload=\"none\" style={{ display: 'none' }}>\r\n <source src={audioUrl} type=\"audio/mpeg\" />\r\n </audio>\r\n </DetailCard>\r\n );\r\n}","import React from 'react';\r\nimport TranscriptCard from '../../media/TranscriptCard.jsx';\r\n\r\nexport default function InteractionTranscript({ \r\n transcript, \r\n audioUrl,\r\n highlightedTurns,\r\n activeTurnIndex,\r\n timelinePlaying,\r\n turnObservations,\r\n setExpandedSignals,\r\n onTurnPlayPause,\r\n}) {\r\n if (!transcript?.messages?.length) return null;\r\n\r\n // Helper function to format time from ms to \"MM:SS–MM:SS\"\r\n const formatTimeRange = (startMs, endMs) => {\r\n if (startMs == null) return undefined;\r\n const formatTime = (ms) => {\r\n const minutes = Math.floor(ms / 60000);\r\n const seconds = Math.floor((ms % 60000) / 1000);\r\n return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\r\n };\r\n const start = formatTime(startMs);\r\n const end = endMs != null ? formatTime(endMs) : start;\r\n return `${start}–${end}`;\r\n };\r\n\r\n const turns = transcript.messages.map((m, i) => ({\r\n actor: m.actor === 'agent' ? (transcript.actor_map?.agent || 'Agent') : (transcript.actor_map?.customer || 'Customer'),\r\n actorType: m.actor === 'agent' ? 'agent' : 'customer',\r\n text: m.text || '',\r\n timeRange: formatTimeRange(m.start ?? m.start_ms, m.end ?? m.end_ms),\r\n isHighlighted: highlightedTurns.has(i),\r\n highlightColor: (timelinePlaying && activeTurnIndex === i) \r\n ? (m.actor === 'agent' ? 'var(--rail-outcome)' : 'var(--rail-discovery)')\r\n : undefined,\r\n observations: (turnObservations[i] || []).map(obs => ({\r\n ...obs,\r\n onClick: () => {\r\n // Expand the parent signal and scroll to it\r\n setExpandedSignals(prev => new Set([...prev, obs.signalKey]));\r\n setTimeout(() => {\r\n const el = document.getElementById(`signal-${obs.signalKey}`);\r\n if (el) el.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\r\n }, 100);\r\n },\r\n })),\r\n }));\r\n\r\n return (\r\n <div id=\"transcript-container\">\r\n <TranscriptCard\r\n turns={turns}\r\n audioUrl={audioUrl}\r\n activeTurnIndex={activeTurnIndex}\r\n autoScrollActiveTurn={timelinePlaying}\r\n isExternalPlaying={timelinePlaying}\r\n onTurnPlayPause={onTurnPlayPause}\r\n />\r\n </div>\r\n );\r\n}","\"use client\";\r\n\r\nimport React, { useEffect, useRef, useState } from \"react\";\r\nimport { Send, Clock } from \"lucide-react\";\r\n\r\nconst messageActionButtonStyle = {\r\n padding: 0,\r\n border: \"none\",\r\n background: \"transparent\",\r\n fontSize: \"12px\",\r\n fontWeight: 500,\r\n color: \"rgba(30, 33, 37, 0.65)\",\r\n cursor: \"pointer\",\r\n fontFamily: \"inherit\",\r\n};\r\n\r\n/**\r\n * MessageThread (common)\r\n *\r\n * Lightweight, UI-only message thread component for session discussion.\r\n * - Controlled via `messages` + `onSendMessage` (and optional reply/edit/delete callbacks)\r\n * - No data fetching or app-specific APIs – host app owns data + side effects\r\n *\r\n * `messages` items:\r\n * {\r\n * id: string;\r\n * author: { name: string; initials: string; color: string; role?: string };\r\n * content: string;\r\n * timestamp: string; // already formatted for display\r\n * type?: \"comment\" | \"system\";\r\n * isEdited?: boolean;\r\n * references?: Array<{ type: \"condition\" | \"timestamp\" | \"observation\"; label: string }>;\r\n * }\r\n */\r\nexport default function MessageThread({\r\n sessionTitle,\r\n sessionSubtitle,\r\n threadLabel,\r\n messages: initialMessages = [],\r\n onSendMessage,\r\n onReplyMessage,\r\n onEditMessage,\r\n onDeleteMessage,\r\n onCreateNewThread, // optional: host can handle new thread creation\r\n currentUser,\r\n isLoading = false,\r\n}) {\r\n const [messageInput, setMessageInput] = useState(\"\");\r\n const [isFocused, setIsFocused] = useState(false);\r\n const [messages, setMessages] = useState(initialMessages);\r\n const [isSending, setIsSending] = useState(false);\r\n const [hoveredMessageId, setHoveredMessageId] = useState(null);\r\n const [replyingToMessageId, setReplyingToMessageId] = useState(null);\r\n const [replyDraft, setReplyDraft] = useState(\"\");\r\n const [editingMessageId, setEditingMessageId] = useState(null);\r\n const [editContent, setEditContent] = useState(\"\");\r\n const [deleteConfirmMessage, setDeleteConfirmMessage] = useState(null);\r\n const [showNewThreadCompose, setShowNewThreadCompose] = useState(false);\r\n const [newThreadInput, setNewThreadInput] = useState(\"\");\r\n const [isCreatingNewThread, setIsCreatingNewThread] = useState(false);\r\n\r\n const messagesEndRef = useRef(null);\r\n const messageInputRef = useRef(null);\r\n\r\n const displayCurrentUser = currentUser || {\r\n name: \"You\",\r\n initials: \"YO\",\r\n color: \"#6B7C93\",\r\n };\r\n\r\n const hasHeader = threadLabel || sessionTitle || sessionSubtitle;\r\n const replyingToMessage = replyingToMessageId\r\n ? messages.find((m) => m.id === replyingToMessageId)\r\n : null;\r\n\r\n useEffect(() => {\r\n setMessages(initialMessages);\r\n }, [initialMessages]);\r\n\r\n useEffect(() => {\r\n if (!messagesEndRef.current) return;\r\n if (!messages || messages.length === 0) return;\r\n messagesEndRef.current.scrollIntoView({ behavior: \"smooth\" });\r\n }, [messages]);\r\n\r\n const handleNewThreadSubmit = async () => {\r\n const trimmed = newThreadInput.trim();\r\n if (!trimmed) return;\r\n setIsCreatingNewThread(true);\r\n try {\r\n await onCreateNewThread?.(trimmed);\r\n setNewThreadInput(\"\");\r\n setShowNewThreadCompose(false);\r\n } finally {\r\n setIsCreatingNewThread(false);\r\n }\r\n };\r\n\r\n const handleNewThreadCancel = () => {\r\n setShowNewThreadCompose(false);\r\n setNewThreadInput(\"\");\r\n };\r\n\r\n const handleSend = async () => {\r\n const trimmed = messageInput.trim();\r\n if (!trimmed) return;\r\n\r\n const content = trimmed;\r\n setMessageInput(\"\");\r\n\r\n const optimisticId = `temp-${Date.now()}`;\r\n const optimisticMessage = {\r\n id: optimisticId,\r\n author: displayCurrentUser,\r\n content,\r\n timestamp: \"Just now\",\r\n type: \"comment\",\r\n isOptimistic: true,\r\n };\r\n\r\n setMessages((prev) => [...prev, optimisticMessage]);\r\n\r\n if (onSendMessage) {\r\n setIsSending(true);\r\n try {\r\n await onSendMessage(content);\r\n setMessages((prev) =>\r\n prev.map((msg) =>\r\n msg.id === optimisticId ? { ...msg, isOptimistic: false } : msg\r\n )\r\n );\r\n } catch {\r\n setMessages((prev) => prev.filter((msg) => msg.id !== optimisticId));\r\n } finally {\r\n setIsSending(false);\r\n }\r\n return;\r\n }\r\n\r\n setMessages((prev) =>\r\n prev.map((msg) =>\r\n msg.id === optimisticId ? { ...msg, isOptimistic: false } : msg\r\n )\r\n );\r\n };\r\n\r\n const handleKeyPress = (e) => {\r\n if (e.key === \"Enter\" && !e.shiftKey) {\r\n e.preventDefault();\r\n handleSend();\r\n }\r\n };\r\n\r\n const handleReplyClick = (message) => {\r\n setReplyingToMessageId(message.id);\r\n setReplyDraft(\"\");\r\n setEditingMessageId(null);\r\n setEditContent(\"\");\r\n setHoveredMessageId(null);\r\n onReplyMessage?.(message);\r\n };\r\n\r\n const handleInlineReplySend = async (parentMessageId) => {\r\n const trimmed = replyDraft.trim();\r\n if (!trimmed) return;\r\n setIsSending(true);\r\n try {\r\n await onSendMessage?.(trimmed, parentMessageId);\r\n setReplyingToMessageId(null);\r\n setReplyDraft(\"\");\r\n } finally {\r\n setIsSending(false);\r\n }\r\n };\r\n\r\n const handleEditClick = (message) => {\r\n setEditingMessageId(message.id);\r\n setEditContent(message.content || \"\");\r\n setReplyingToMessageId(null);\r\n setReplyDraft(\"\");\r\n setHoveredMessageId(null);\r\n onEditMessage?.(message);\r\n };\r\n\r\n const handleEditSubmit = async () => {\r\n const trimmed = editContent.trim();\r\n if (!trimmed || !editingMessageId) return;\r\n await onEditMessage?.({ id: editingMessageId, content: trimmed });\r\n setEditingMessageId(null);\r\n setEditContent(\"\");\r\n };\r\n\r\n const handleDeleteClick = (message) => {\r\n setDeleteConfirmMessage(message);\r\n setHoveredMessageId(null);\r\n };\r\n\r\n const handleDeleteConfirm = async () => {\r\n if (!deleteConfirmMessage) return;\r\n const msg = deleteConfirmMessage;\r\n setDeleteConfirmMessage(null);\r\n await onDeleteMessage?.(msg);\r\n };\r\n\r\n return (\r\n <div\r\n style={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n height: \"100%\",\r\n background: \"rgba(255, 255, 255, 0.98)\",\r\n border: \"1px solid rgba(52, 58, 64, 0.12)\",\r\n borderRadius: \"12px\",\r\n overflow: \"hidden\",\r\n position: \"relative\",\r\n }}\r\n >\r\n {/* Delete confirmation overlay */}\r\n {deleteConfirmMessage && (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n zIndex: 50,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n background: \"rgba(30, 33, 37, 0.35)\",\r\n borderRadius: \"12px\",\r\n }}\r\n onClick={() => setDeleteConfirmMessage(null)}\r\n >\r\n <div\r\n style={{\r\n background: \"white\",\r\n borderRadius: \"12px\",\r\n padding: \"20px 24px\",\r\n boxShadow: \"0 8px 24px rgba(30, 33, 37, 0.15)\",\r\n maxWidth: \"320px\",\r\n width: \"90%\",\r\n }}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <p\r\n style={{\r\n margin: 0,\r\n marginBottom: \"20px\",\r\n fontSize: \"14px\",\r\n fontWeight: 500,\r\n color: \"rgba(30, 33, 37, 0.9)\",\r\n lineHeight: 1.45,\r\n }}\r\n >\r\n Do you really want to delete?\r\n </p>\r\n <div\r\n style={{\r\n display: \"flex\",\r\n gap: \"10px\",\r\n justifyContent: \"flex-end\",\r\n }}\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={() => setDeleteConfirmMessage(null)}\r\n style={{\r\n padding: \"8px 16px\",\r\n fontSize: \"12px\",\r\n fontWeight: 600,\r\n color: \"rgba(30, 33, 37, 0.45)\",\r\n background: \"rgba(30, 33, 37, 0.1)\",\r\n border: \"none\",\r\n borderRadius: \"6px\",\r\n cursor: \"pointer\",\r\n }}\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={handleDeleteConfirm}\r\n style={{\r\n padding: \"8px 16px\",\r\n fontSize: \"12px\",\r\n fontWeight: 600,\r\n color: \"white\",\r\n background: \"#5e88b0\",\r\n border: \"none\",\r\n borderRadius: \"6px\",\r\n cursor: \"pointer\",\r\n }}\r\n >\r\n Delete\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Header */}\r\n {hasHeader && (\r\n <div\r\n style={{\r\n padding: \"14px 16px\",\r\n borderBottom: \"1px solid rgba(52, 58, 64, 0.12)\",\r\n background: \"rgba(255, 255, 255, 0.98)\",\r\n }}\r\n >\r\n <div\r\n style={{\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n gap: \"8px\",\r\n }}\r\n >\r\n <div>\r\n <div\r\n style={{\r\n fontSize: \"14px\",\r\n fontWeight: 600,\r\n color: \"rgba(30, 33, 37, 0.95)\",\r\n marginBottom: \"4px\",\r\n }}\r\n >\r\n {threadLabel || \"Session Discussion\"}\r\n </div>\r\n {(sessionTitle || sessionSubtitle) && (\r\n <div\r\n style={{\r\n fontSize: \"12px\",\r\n color: \"rgba(30, 33, 37, 0.52)\",\r\n }}\r\n >\r\n {sessionTitle || sessionSubtitle}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Always show \"+ New thread\" button */}\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n setShowNewThreadCompose((prev) => !prev);\r\n }}\r\n style={{\r\n display: \"inline-flex\",\r\n alignItems: \"center\",\r\n gap: \"6px\",\r\n padding: \"6px 12px\",\r\n fontSize: \"13px\",\r\n fontWeight: 500,\r\n color: \"rgba(30, 33, 37, 0.75)\",\r\n background: \"transparent\",\r\n border: \"1px solid rgba(30, 33, 37, 0.12)\",\r\n borderRadius: \"6px\",\r\n cursor: \"pointer\",\r\n transition: \"background 0.15s ease, color 0.15s ease\",\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.background = \"rgba(231, 212, 162, 0.12)\";\r\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.9)\";\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.background = \"transparent\";\r\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.75)\";\r\n }}\r\n title=\"Start a new discussion thread\"\r\n >\r\n <span\r\n style={{\r\n fontSize: 16,\r\n lineHeight: 1,\r\n marginTop: -1,\r\n }}\r\n >\r\n +\r\n </span>\r\n New thread\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Messages list */}\r\n <div\r\n style={{\r\n flex: 1,\r\n overflowY: \"auto\",\r\n padding: \"16px\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: \"16px\",\r\n }}\r\n >\r\n {/* Inline \"new thread\" compose */}\r\n {showNewThreadCompose && (\r\n <div\r\n style={{\r\n marginBottom: \"16px\",\r\n padding: \"12px\",\r\n background: \"rgba(30, 33, 37, 0.04)\",\r\n border: \"1px solid rgba(52, 58, 64, 0.14)\",\r\n borderRadius: \"8px\",\r\n }}\r\n >\r\n <textarea\r\n value={newThreadInput}\r\n onChange={(e) => setNewThreadInput(e.target.value)}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\" && !e.shiftKey) {\r\n e.preventDefault();\r\n handleNewThreadSubmit();\r\n }\r\n }}\r\n placeholder=\"Start a new thread...\"\r\n disabled={isCreatingNewThread}\r\n style={{\r\n width: \"100%\",\r\n minHeight: \"64px\",\r\n padding: \"8px 12px\",\r\n fontSize: \"13px\",\r\n color: \"rgba(30, 33, 37, 0.88)\",\r\n background: \"white\",\r\n border: \"1px solid rgba(52, 58, 64, 0.16)\",\r\n borderRadius: \"6px\",\r\n resize: \"vertical\",\r\n outline: \"none\",\r\n fontFamily: \"inherit\",\r\n lineHeight: 1.5,\r\n marginBottom: \"10px\",\r\n }}\r\n />\r\n <div style={{ display: \"flex\", gap: \"8px\", justifyContent: \"flex-end\" }}>\r\n <button\r\n type=\"button\"\r\n onClick={handleNewThreadCancel}\r\n disabled={isCreatingNewThread}\r\n style={{\r\n padding: \"6px 14px\",\r\n fontSize: \"12px\",\r\n fontWeight: 500,\r\n color: \"rgba(30, 33, 37, 0.7)\",\r\n background: \"rgba(30, 33, 37, 0.08)\",\r\n border: \"none\",\r\n borderRadius: \"6px\",\r\n cursor: isCreatingNewThread ? \"not-allowed\" : \"pointer\",\r\n }}\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={handleNewThreadSubmit}\r\n disabled={!newThreadInput.trim() || isCreatingNewThread}\r\n style={{\r\n padding: \"6px 14px\",\r\n fontSize: \"12px\",\r\n fontWeight: 600,\r\n color: \"white\",\r\n background:\r\n newThreadInput.trim() && !isCreatingNewThread\r\n ? \"#5e88b0\"\r\n : \"rgba(30, 33, 37, 0.25)\",\r\n border: \"none\",\r\n borderRadius: \"6px\",\r\n cursor:\r\n newThreadInput.trim() && !isCreatingNewThread\r\n ? \"pointer\"\r\n : \"not-allowed\",\r\n }}\r\n >\r\n {isCreatingNewThread ? \"Sending...\" : \"Send\"}\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n {isLoading ? (\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n padding: \"40px\",\r\n color: \"rgba(30, 33, 37, 0.42)\",\r\n }}\r\n >\r\n Loading messages...\r\n </div>\r\n ) : messages.length === 0 ? (\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n padding: \"40px\",\r\n color: \"rgba(30, 33, 37, 0.42)\",\r\n }}\r\n >\r\n No messages yet. Start the conversation!\r\n </div>\r\n ) : (\r\n messages.map((message) => (\r\n <div\r\n key={message.id}\r\n onMouseEnter={() =>\r\n message.type !== \"system\" && setHoveredMessageId(message.id)\r\n }\r\n onMouseLeave={() => setHoveredMessageId(null)}\r\n style={{\r\n display: \"flex\",\r\n gap: \"12px\",\r\n opacity: message.type === \"system\" ? 0.75 : 1,\r\n padding: \"4px 0\",\r\n margin: \"0 -4px\",\r\n borderRadius: \"8px\",\r\n }}\r\n >\r\n {message.type !== \"system\" ? (\r\n <div\r\n style={{\r\n width: \"36px\",\r\n height: \"36px\",\r\n borderRadius: \"50%\",\r\n background: message.author.color,\r\n color: \"white\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n fontSize: \"11px\",\r\n fontWeight: 650,\r\n flexShrink: 0,\r\n }}\r\n >\r\n {message.author.initials}\r\n </div>\r\n ) : (\r\n <div\r\n style={{\r\n width: \"36px\",\r\n height: \"36px\",\r\n borderRadius: \"50%\",\r\n background: \"rgba(30, 33, 37, 0.1)\",\r\n color: \"rgba(30, 33, 37, 0.55)\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n flexShrink: 0,\r\n }}\r\n >\r\n <Clock size={16} />\r\n </div>\r\n )}\r\n\r\n <div style={{ flex: 1, minWidth: 0 }}>\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"baseline\",\r\n flexWrap: \"wrap\",\r\n gap: \"8px\",\r\n marginBottom: \"6px\",\r\n justifyContent: \"space-between\",\r\n }}\r\n >\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"baseline\",\r\n flexWrap: \"wrap\",\r\n gap: \"8px\",\r\n }}\r\n >\r\n <span\r\n style={{\r\n fontSize: \"13px\",\r\n fontWeight: 650,\r\n color: \"rgba(30, 33, 37, 0.9)\",\r\n }}\r\n >\r\n {message.author.name}\r\n </span>\r\n <span\r\n style={{\r\n fontSize: \"10px\",\r\n fontFamily: \"var(--default-mono-font-family)\",\r\n color: \"rgba(30, 33, 37, 0.5)\",\r\n }}\r\n >\r\n {message.timestamp}\r\n </span>\r\n </div>\r\n\r\n {message.type !== \"system\" &&\r\n hoveredMessageId === message.id && (\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: \"12px\",\r\n flexShrink: 0,\r\n }}\r\n >\r\n {onReplyMessage && (\r\n <button\r\n type=\"button\"\r\n onClick={(e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n handleReplyClick(message);\r\n }}\r\n style={messageActionButtonStyle}\r\n >\r\n Reply\r\n </button>\r\n )}\r\n {onEditMessage && (\r\n <button\r\n type=\"button\"\r\n onClick={(e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n handleEditClick(message);\r\n }}\r\n style={messageActionButtonStyle}\r\n >\r\n Edit\r\n </button>\r\n )}\r\n {onDeleteMessage && (\r\n <button\r\n type=\"button\"\r\n onClick={(e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n handleDeleteClick(message);\r\n }}\r\n style={{\r\n ...messageActionButtonStyle,\r\n color: \"rgba(198, 99, 99, 0.9)\",\r\n }}\r\n >\r\n Delete\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {editingMessageId === message.id ? (\r\n <div style={{ marginTop: \"6px\" }}>\r\n <textarea\r\n value={editContent}\r\n onChange={(e) => setEditContent(e.target.value)}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\" && !e.shiftKey) {\r\n e.preventDefault();\r\n handleEditSubmit();\r\n }\r\n if (e.key === \"Escape\") {\r\n setEditingMessageId(null);\r\n setEditContent(\"\");\r\n }\r\n }}\r\n placeholder=\"Edit message...\"\r\n autoFocus\r\n style={{\r\n width: \"100%\",\r\n minHeight: \"64px\",\r\n padding: \"8px 12px\",\r\n fontSize: \"13px\",\r\n color: \"rgba(30, 33, 37, 0.88)\",\r\n background: \"white\",\r\n border: \"1px solid rgba(52, 58, 64, 0.2)\",\r\n borderRadius: \"6px\",\r\n resize: \"vertical\",\r\n outline: \"none\",\r\n fontFamily: \"inherit\",\r\n lineHeight: 1.5,\r\n marginBottom: \"8px\",\r\n }}\r\n />\r\n </div>\r\n ) : (\r\n <div\r\n style={{\r\n fontSize: \"13px\",\r\n color: \"rgba(30, 33, 37, 0.88)\",\r\n lineHeight: 1.55,\r\n }}\r\n >\r\n {message.content}\r\n </div>\r\n )}\r\n\r\n {replyingToMessageId === message.id && (\r\n <div style={{ marginTop: \"12px\" }}>\r\n <textarea\r\n value={replyDraft}\r\n onChange={(e) => setReplyDraft(e.target.value)}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\" && !e.shiftKey) {\r\n e.preventDefault();\r\n handleInlineReplySend(message.id);\r\n }\r\n if (e.key === \"Escape\") {\r\n setReplyingToMessageId(null);\r\n setReplyDraft(\"\");\r\n }\r\n }}\r\n placeholder=\"Type your reply...\"\r\n disabled={isSending}\r\n autoFocus\r\n style={{\r\n width: \"100%\",\r\n minHeight: \"64px\",\r\n padding: \"8px 12px\",\r\n fontSize: \"13px\",\r\n color: \"rgba(30, 33, 37, 0.88)\",\r\n background: \"white\",\r\n border: \"1px solid rgba(52, 58, 64, 0.16)\",\r\n borderRadius: \"6px\",\r\n resize: \"vertical\",\r\n outline: \"none\",\r\n fontFamily: \"inherit\",\r\n lineHeight: 1.5,\r\n marginBottom: \"10px\",\r\n }}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n ))\r\n )}\r\n <div ref={messagesEndRef} />\r\n </div>\r\n\r\n {/* Input area */}\r\n <div\r\n style={{\r\n padding: \"12px\",\r\n borderTop: \"1px solid rgba(52, 58, 64, 0.12)\",\r\n background: \"rgba(255, 255, 255, 0.95)\",\r\n }}\r\n >\r\n <div\r\n style={{\r\n display: \"flex\",\r\n gap: \"8px\",\r\n alignItems: \"flex-end\",\r\n }}\r\n >\r\n <div\r\n style={{\r\n width: \"36px\",\r\n height: \"36px\",\r\n borderRadius: \"50%\",\r\n background: displayCurrentUser.color,\r\n color: \"white\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n fontSize: \"11px\",\r\n fontWeight: 650,\r\n flexShrink: 0,\r\n }}\r\n >\r\n {displayCurrentUser.initials}\r\n </div>\r\n\r\n <div\r\n style={{\r\n flex: 1,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: \"8px\",\r\n }}\r\n >\r\n <textarea\r\n ref={messageInputRef}\r\n value={messageInput}\r\n onChange={(e) => setMessageInput(e.target.value)}\r\n onKeyDown={handleKeyPress}\r\n onFocus={() => setIsFocused(true)}\r\n onBlur={() => setIsFocused(false)}\r\n placeholder={\r\n replyingToMessage ? \"Type your reply...\" : \"Add a comment...\"\r\n }\r\n style={{\r\n width: \"100%\",\r\n minHeight: \"38px\",\r\n maxHeight: \"120px\",\r\n padding: \"8px 12px\",\r\n fontSize: \"13px\",\r\n color: \"rgba(30, 33, 37, 0.85)\",\r\n background: \"white\",\r\n border: `1px solid ${\r\n isFocused\r\n ? \"rgba(94, 136, 176, 0.35)\"\r\n : \"rgba(52, 58, 64, 0.16)\"\r\n }`,\r\n borderRadius: \"8px\",\r\n resize: \"vertical\",\r\n outline: \"none\",\r\n transition: \"border-color 0.15s ease\",\r\n fontFamily: \"inherit\",\r\n lineHeight: 1.5,\r\n }}\r\n />\r\n\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"flex-end\",\r\n }}\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={handleSend}\r\n disabled={!messageInput.trim() || isSending}\r\n style={{\r\n padding: \"8px 16px\",\r\n background:\r\n messageInput.trim() && !isSending\r\n ? \"#5e88b0\"\r\n : \"rgba(30, 33, 37, 0.1)\",\r\n border: \"none\",\r\n borderRadius: \"6px\",\r\n color:\r\n messageInput.trim() && !isSending\r\n ? \"white\"\r\n : \"rgba(30, 33, 37, 0.45)\",\r\n fontSize: \"12px\",\r\n fontWeight: 600,\r\n cursor:\r\n messageInput.trim() && !isSending\r\n ? \"pointer\"\r\n : \"not-allowed\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: \"6px\",\r\n transition: \"all 0.15s ease\",\r\n }}\r\n >\r\n {isSending ? (\r\n <>\r\n <div\r\n style={{\r\n width: \"14px\",\r\n height: \"14px\",\r\n border: \"2px solid rgba(255, 255, 255, 0.3)\",\r\n borderTopColor: \"white\",\r\n borderRadius: \"50%\",\r\n animation: \"spin 0.6s linear infinite\",\r\n }}\r\n />\r\n Sending...\r\n </>\r\n ) : (\r\n <>\r\n <Send size={14} />\r\n Send\r\n </>\r\n )}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n","\"use client\";\r\n\r\nimport React, { useState, useEffect, useRef, useMemo } from 'react';\r\nimport DetailCard from '../../primitives/DetailCard.jsx';\r\nimport CoachingSynthesisCard from './CoachingSynthesisCard.jsx';\r\nimport InteractionContext from './InteractionContext.jsx';\r\nimport InteractionScores from './InteractionScores.jsx';\r\nimport AgentLiftCard from '../../common/AgentLiftCard.jsx';\r\nimport InteractionSignals from './InteractionSignals.jsx';\r\nimport InteractionGuidance from './InteractionGuidance.jsx';\r\nimport InteractionNBA from './InteractionNBA.jsx';\r\nimport InteractionRecording from './InteractionRecording.jsx';\r\nimport InteractionTranscript from './InteractionTranscript.jsx';\r\nimport MessageThread from '../../common/MessageThread.jsx';\r\n\r\nfunction findBlock(blocks, id) {\r\n return blocks.find((b) => b.block_id === id);\r\n}\r\n\r\nfunction InteractionDetailPanel({ data, audioUrl, coachingData, coachingLoading, coachingError }) {\r\n const blocks = data.blocks || [];\r\n const evidenceIndex = data.evidence_index || {};\r\n const audioRef = useRef(null);\r\n const segmentEndHandlerRef = useRef(null);\r\n const [highlightedTurns, setHighlightedTurns] = useState(new Set());\r\n const [expandedSignals, setExpandedSignals] = useState(new Set());\r\n \r\n // Timeline state for audio playback integration\r\n const [currentTimeSeconds, setCurrentTimeSeconds] = useState(0);\r\n const [timelinePlaying, setTimelinePlaying] = useState(false);\r\n const [playbackRate, setPlaybackRate] = useState(1);\r\n\r\n // Extract block data\r\n const meta = findBlock(blocks, 'interaction-metadata')?.payload || {};\r\n const ctx = findBlock(blocks, 'interaction-context')?.payload || {};\r\n const summary = findBlock(blocks, 'interaction-summary')?.payload || {};\r\n const scores = findBlock(blocks, 'interaction-scores')?.payload || {};\r\n const signals = findBlock(blocks, 'interaction-signals')?.payload || {};\r\n const guidance = findBlock(blocks, 'interaction-guidance')?.payload || {};\r\n const transcript = findBlock(blocks, 'interaction-transcript')?.payload || {};\r\n const messageThread = findBlock(blocks, 'interaction-message-thread')?.payload || {};\r\n const nba = findBlock(blocks, 'interaction-nba')?.payload || {};\r\n const dimensionsBlock = findBlock(blocks, 'interaction-dimensions')?.payload || {};\r\n const dimensions = (dimensionsBlock.dimensions || []).filter(d => d.value);\r\n const outcomeLift = findBlock(blocks, 'interaction-outcome-lift')?.payload || {};\r\n\r\n // Build turn → observation pills map from signals data\r\n const turnObservations = useMemo(() => {\r\n const map = {}; // turnIndex → [{label, reason, color, signalKey}]\r\n const GROUP_LABELS = {\r\n outcome: { color: 'var(--rail-outcome)' },\r\n process: { color: 'var(--rail-discovery)' },\r\n compliance: { color: 'var(--rail-compliance)' },\r\n customer_friction: { color: 'var(--rail-coral)' },\r\n experience: { color: 'var(--rail-teal)' },\r\n };\r\n\r\n for (const signal of (signals.signals || [])) {\r\n const groupInfo = GROUP_LABELS[signal.group] || {};\r\n for (const obs of (signal.observations || [])) {\r\n for (const ev of (obs.evidence || [])) {\r\n if (ev.turn_ids?.length) {\r\n for (const tid of ev.turn_ids) {\r\n if (!map[tid]) map[tid] = [];\r\n // Deduplicate by observation key per turn\r\n if (!map[tid].some(o => o.label === (obs.key || signal.display_name || signal.key))) {\r\n map[tid].push({\r\n label: obs.key || signal.display_name || signal.key,\r\n reason: obs.reason || obs.explanation || '',\r\n color: groupInfo.color || 'var(--state-present)',\r\n signalKey: signal.key,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return map;\r\n }, [signals.signals]);\r\n\r\n // Build timeline segments from transcript messages\r\n const timelineSegments = transcript.messages?.map((m, i) => {\r\n const startTime = (m.start ?? m.start_ms) ? (m.start ?? m.start_ms) / 1000 : 0;\r\n const endTime = (m.end ?? m.end_ms) ? (m.end ?? m.end_ms) / 1000 : startTime + 1;\r\n const isAgent = m.actor === 'agent';\r\n const actorName = isAgent ? (transcript.actor_map?.agent || 'Agent') : (transcript.actor_map?.customer || 'Customer');\r\n \r\n return {\r\n startTime,\r\n endTime,\r\n actor: actorName,\r\n actorColor: isAgent ? 'var(--rail-outcome)' : 'var(--rail-discovery)',\r\n };\r\n }) || [];\r\n\r\n // Compute active turn index based on current playback time\r\n const activeTurnIndex = useMemo(() => {\r\n if (!timelinePlaying && currentTimeSeconds === 0) return -1;\r\n const messages = transcript.messages || [];\r\n const currentMs = currentTimeSeconds * 1000;\r\n for (let i = messages.length - 1; i >= 0; i--) {\r\n const startMs = messages[i].start ?? messages[i].start_ms;\r\n if (startMs != null && currentMs >= startMs) return i;\r\n }\r\n return -1;\r\n }, [currentTimeSeconds, timelinePlaying, transcript.messages]);\r\n\r\n // Timeline event handlers\r\n const handleTimelineSeek = (seconds) => {\r\n if (audioRef.current) {\r\n audioRef.current.currentTime = seconds;\r\n setCurrentTimeSeconds(seconds);\r\n }\r\n };\r\n\r\n const handleTimelineTogglePlay = () => {\r\n if (audioRef.current) {\r\n if (timelinePlaying) {\r\n audioRef.current.pause();\r\n setTimelinePlaying(false);\r\n } else {\r\n const p = audioRef.current.play();\r\n if (p !== undefined) p.catch(() => {}); // ignore AbortError when pause() interrupts play()\r\n setTimelinePlaying(true);\r\n }\r\n }\r\n };\r\n\r\n const handleTimelineSeekBack = () => {\r\n if (audioRef.current) {\r\n audioRef.current.currentTime = Math.max(0, audioRef.current.currentTime - 15);\r\n }\r\n };\r\n\r\n const handleTimelineSeekForward = () => {\r\n if (audioRef.current) {\r\n const duration = meta.duration_seconds || audioRef.current.duration || 0;\r\n audioRef.current.currentTime = Math.min(duration, audioRef.current.currentTime + 15);\r\n }\r\n };\r\n\r\n const handleSetPlaybackRate = (rate) => {\r\n if (audioRef.current) {\r\n audioRef.current.playbackRate = rate;\r\n setPlaybackRate(rate);\r\n }\r\n };\r\n\r\n // Update currentTimeSeconds from audio element\r\n useEffect(() => {\r\n const audio = audioRef.current;\r\n if (!audio) return;\r\n\r\n const updateTime = () => setCurrentTimeSeconds(audio.currentTime);\r\n const handlePlay = () => setTimelinePlaying(true);\r\n const handlePause = () => setTimelinePlaying(false);\r\n const handleEnded = () => setTimelinePlaying(false);\r\n\r\n audio.addEventListener('timeupdate', updateTime);\r\n audio.addEventListener('play', handlePlay);\r\n audio.addEventListener('pause', handlePause);\r\n audio.addEventListener('ended', handleEnded);\r\n\r\n return () => {\r\n audio.removeEventListener('timeupdate', updateTime);\r\n audio.removeEventListener('play', handlePlay);\r\n audio.removeEventListener('pause', handlePause);\r\n audio.removeEventListener('ended', handleEnded);\r\n };\r\n }, [audioUrl]);\r\n\r\n const playAudio = (startMs, endMs) => {\r\n const player = audioRef.current;\r\n if (!player) return;\r\n\r\n const startSec = startMs / 1000;\r\n player.currentTime = startSec;\r\n setCurrentTimeSeconds(startSec);\r\n\r\n const p = player.play();\r\n if (p !== undefined) p.catch(() => {}); // ignore AbortError when pause() interrupts play()\r\n\r\n // Clear any previous segment end handler so only one is active\r\n if (segmentEndHandlerRef.current) {\r\n player.removeEventListener('timeupdate', segmentEndHandlerRef.current);\r\n segmentEndHandlerRef.current = null;\r\n }\r\n\r\n if (endMs != null) {\r\n const endSec = endMs / 1000;\r\n const handler = () => {\r\n if (player.currentTime >= endSec) {\r\n player.pause();\r\n if (segmentEndHandlerRef.current) {\r\n player.removeEventListener('timeupdate', segmentEndHandlerRef.current);\r\n segmentEndHandlerRef.current = null;\r\n }\r\n }\r\n };\r\n segmentEndHandlerRef.current = handler;\r\n player.addEventListener('timeupdate', handler);\r\n }\r\n };\r\n\r\n const handleTranscriptTurnPlayPause = (turn, index) => {\r\n const messages = transcript.messages || [];\r\n const message = messages[index];\r\n const player = audioRef.current;\r\n\r\n if (!message || !player) return;\r\n\r\n const startMs = message.start ?? message.start_ms;\r\n const endMs = message.end ?? message.end_ms;\r\n\r\n // If this turn is already active and playing, pause playback\r\n if (timelinePlaying && activeTurnIndex === index) {\r\n player.pause();\r\n return;\r\n }\r\n\r\n if (startMs == null) return;\r\n playAudio(startMs, endMs);\r\n };\r\n\r\n const highlightTurns = (turnIds) => {\r\n setHighlightedTurns(new Set(turnIds));\r\n // TranscriptCard handles highlight styling via isHighlighted prop\r\n // Always scroll transcript container into view so highlights are visible\r\n const container = document.getElementById('transcript-container');\r\n if (container) {\r\n container.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\r\n }\r\n setTimeout(() => setHighlightedTurns(new Set()), 5000);\r\n };\r\n\r\n const toggleSignal = (key) => {\r\n setExpandedSignals(prev => {\r\n const next = new Set(prev);\r\n if (next.has(key)) next.delete(key); else next.add(key);\r\n return next;\r\n });\r\n };\r\n\r\n const title = ctx.call_purpose?.interaction_driver || summary.one_liner || 'Interaction Detail';\r\n\r\n return (\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>\r\n {/* Context — metadata + call purpose + dimensions */}\r\n <InteractionContext\r\n title={title}\r\n meta={meta}\r\n callPurpose={ctx.call_purpose}\r\n classification={ctx.classification}\r\n dimensions={dimensions}\r\n />\r\n\r\n {/* Scores */}\r\n <InteractionScores scores={scores.scores} />\r\n\r\n {/* Agent Lift Analysis */}\r\n <AgentLiftCard outcomeLift={outcomeLift} />\r\n\r\n {/* Coaching Synthesis — only show if loading or has data */}\r\n {(coachingLoading || coachingData || coachingError) && (\r\n <DetailCard title=\"Coaching Summary\">\r\n <CoachingSynthesisCard \r\n data={coachingData} \r\n loading={coachingLoading} \r\n error={coachingError} \r\n />\r\n </DetailCard>\r\n )}\r\n\r\n {/* Signals */}\r\n <InteractionSignals\r\n signals={signals}\r\n expandedSignals={expandedSignals}\r\n toggleSignal={toggleSignal}\r\n playAudio={playAudio}\r\n highlightTurns={highlightTurns}\r\n />\r\n\r\n {/* Guidance */}\r\n <InteractionGuidance\r\n guidance={guidance}\r\n playAudio={playAudio}\r\n highlightTurns={highlightTurns}\r\n />\r\n\r\n {/* NBA */}\r\n <InteractionNBA nba={nba} />\r\n\r\n {/* Recording / Timeline */}\r\n <InteractionRecording\r\n audioUrl={audioUrl}\r\n timelineSegments={timelineSegments}\r\n durationSeconds={meta.duration_seconds}\r\n currentTimeSeconds={currentTimeSeconds}\r\n timelinePlaying={timelinePlaying}\r\n playbackRate={playbackRate}\r\n onSeek={handleTimelineSeek}\r\n onTogglePlay={handleTimelineTogglePlay}\r\n onSeekBack={handleTimelineSeekBack}\r\n onSeekForward={handleTimelineSeekForward}\r\n onSetPlaybackRate={handleSetPlaybackRate}\r\n audioRef={audioRef}\r\n />\r\n\r\n {/* Transcript */}\r\n <InteractionTranscript\r\n transcript={transcript}\r\n audioUrl={audioUrl}\r\n highlightedTurns={highlightedTurns}\r\n activeTurnIndex={activeTurnIndex}\r\n timelinePlaying={timelinePlaying}\r\n turnObservations={turnObservations}\r\n setExpandedSignals={setExpandedSignals}\r\n onTurnPlayPause={handleTranscriptTurnPlayPause}\r\n />\r\n\r\n <MessageThread\r\n messageThread={messageThread}\r\n sessionTitle={title}\r\n messages={[]}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nclass ErrorBoundary extends React.Component {\r\n constructor(props) { \r\n super(props); \r\n this.state = { hasError: false }; \r\n }\r\n static getDerivedStateFromError() { \r\n return { hasError: true }; \r\n }\r\n componentDidCatch(error, info) { \r\n console.error('InteractionDetailPanel render error:', error, info?.componentStack); \r\n }\r\n render() { \r\n return this.state.hasError ? this.props.fallback : this.props.children; \r\n }\r\n}\r\n\r\nexport default function InteractionDetailPanelWrapper(props) {\r\n return (\r\n <ErrorBoundary fallback={\r\n <div style={{ padding: 16, color: 'var(--state-unknown)', fontSize: 12 }}>\r\n Error rendering detail.\r\n </div>\r\n }>\r\n <InteractionDetailPanel {...props} />\r\n </ErrorBoundary>\r\n );\r\n}","\"use client\";\r\n\r\nimport React, { useState } from \"react\";\r\nimport { ChevronDown, ChevronRight } from \"lucide-react\";\r\n\r\n/**\r\n * ExpandPatternComparison Component\r\n * Demonstrates three different expand/collapse patterns for signal cards.\r\n */\r\nexport default function ExpandPatternComparison({ pattern }) {\r\n const [isExpanded, setIsExpanded] = useState(false);\r\n\r\n const sampleSignal = {\r\n name: \"Customer Escalation Likelihood\",\r\n description:\r\n \"Based on observed patterns, this session shows indicators consistent with potential escalation.\",\r\n technicalKey: \"signal.escalation_likelihood\",\r\n probability: 0.68,\r\n confidence: 0.81,\r\n observations: 3,\r\n };\r\n\r\n if (pattern === \"text-link\") {\r\n return (\r\n <div\r\n style={{\r\n position: \"relative\",\r\n background: \"rgba(255, 255, 255, 0.82)\",\r\n border: \"1px solid rgba(52, 58, 64, 0.12)\",\r\n borderRadius: \"12px\",\r\n overflow: \"hidden\",\r\n boxShadow: \"0 2px 4px rgba(30, 33, 37, 0.06)\",\r\n }}\r\n >\r\n {/* Left rail */}\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n left: 0,\r\n top: 0,\r\n bottom: 0,\r\n width: \"5px\",\r\n background: \"#6B7C93\",\r\n opacity: 0.6,\r\n }}\r\n />\r\n\r\n {/* Content - not clickable */}\r\n <div\r\n style={{\r\n padding: \"14px 16px 14px 21px\",\r\n }}\r\n >\r\n <div style={{ marginBottom: \"4px\" }}>\r\n <span\r\n style={{\r\n fontSize: \"13px\",\r\n fontWeight: 680,\r\n color: \"rgba(30, 33, 37, 0.92)\",\r\n lineHeight: 1.2,\r\n }}\r\n >\r\n {sampleSignal.name}\r\n </span>\r\n </div>\r\n <div\r\n style={{\r\n fontSize: \"12px\",\r\n color: \"rgba(30, 33, 37, 0.65)\",\r\n lineHeight: 1.4,\r\n marginBottom: \"6px\",\r\n }}\r\n >\r\n {sampleSignal.description}\r\n </div>\r\n <div\r\n style={{\r\n fontSize: \"11px\",\r\n color: \"rgba(30, 33, 37, 0.42)\",\r\n fontFamily: \"ui-monospace, monospace\",\r\n marginBottom: \"8px\",\r\n }}\r\n >\r\n {sampleSignal.technicalKey}\r\n </div>\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: \"12px\",\r\n fontSize: \"11.5px\",\r\n marginBottom: \"10px\",\r\n }}\r\n >\r\n <span style={{ color: \"rgba(139, 157, 127, 0.65)\" }}>prob</span>\r\n <strong style={{ color: \"rgba(139, 157, 127, 0.85)\" }}>\r\n {sampleSignal.probability.toFixed(2)}\r\n </strong>\r\n <span style={{ color: \"rgba(30, 33, 37, 0.24)\" }}>·</span>\r\n <span style={{ color: \"rgba(184, 156, 106, 0.65)\" }}>conf</span>\r\n <strong style={{ color: \"rgba(184, 156, 106, 0.85)\" }}>\r\n {sampleSignal.confidence.toFixed(2)}\r\n </strong>\r\n <span style={{ color: \"rgba(30, 33, 37, 0.24)\" }}>·</span>\r\n <span style={{ color: \"rgba(30, 33, 37, 0.52)\" }}>\r\n {sampleSignal.observations} observations\r\n </span>\r\n </div>\r\n\r\n {/* Text link to expand */}\r\n {!isExpanded && (\r\n <button\r\n onClick={() => setIsExpanded(true)}\r\n style={{\r\n fontSize: \"12px\",\r\n color: \"rgba(30, 33, 37, 0.56)\",\r\n background: \"none\",\r\n border: \"none\",\r\n padding: 0,\r\n cursor: \"pointer\",\r\n textDecoration: \"underline\",\r\n textDecorationColor: \"rgba(30, 33, 37, 0.2)\",\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.78)\";\r\n e.currentTarget.style.textDecorationColor =\r\n \"rgba(30, 33, 37, 0.4)\";\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.56)\";\r\n e.currentTarget.style.textDecorationColor =\r\n \"rgba(30, 33, 37, 0.2)\";\r\n }}\r\n >\r\n View contributing observations\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Expanded content */}\r\n {isExpanded && (\r\n <div\r\n style={{\r\n borderTop: \"1px solid rgba(52, 58, 64, 0.08)\",\r\n background: \"rgba(244, 241, 230, 0.25)\",\r\n padding: \"16px 16px 16px 21px\",\r\n }}\r\n >\r\n <div\r\n style={{\r\n fontSize: \"10px\",\r\n fontWeight: 650,\r\n letterSpacing: \"0.08em\",\r\n textTransform: \"uppercase\",\r\n color: \"rgba(30, 33, 37, 0.52)\",\r\n marginBottom: \"8px\",\r\n }}\r\n >\r\n Contributing Observations\r\n </div>\r\n <div style={{ fontSize: \"12px\", color: \"rgba(30, 33, 37, 0.62)\" }}>\r\n [Observations would appear here]\r\n </div>\r\n <button\r\n onClick={() => setIsExpanded(false)}\r\n style={{\r\n marginTop: \"10px\",\r\n fontSize: \"12px\",\r\n color: \"rgba(30, 33, 37, 0.56)\",\r\n background: \"none\",\r\n border: \"none\",\r\n padding: 0,\r\n cursor: \"pointer\",\r\n textDecoration: \"underline\",\r\n textDecorationColor: \"rgba(30, 33, 37, 0.2)\",\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.78)\";\r\n e.currentTarget.style.textDecorationColor =\r\n \"rgba(30, 33, 37, 0.4)\";\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.56)\";\r\n e.currentTarget.style.textDecorationColor =\r\n \"rgba(30, 33, 37, 0.2)\";\r\n }}\r\n >\r\n Hide observations\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n if (pattern === \"rotating-chevron\") {\r\n return (\r\n <div\r\n style={{\r\n position: \"relative\",\r\n background: \"rgba(255, 255, 255, 0.82)\",\r\n border: \"1px solid rgba(52, 58, 64, 0.12)\",\r\n borderRadius: \"12px\",\r\n overflow: \"hidden\",\r\n boxShadow: \"0 2px 4px rgba(30, 33, 37, 0.06)\",\r\n }}\r\n >\r\n {/* Left rail */}\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n left: 0,\r\n top: 0,\r\n bottom: 0,\r\n width: \"5px\",\r\n background: \"#6B7C93\",\r\n opacity: 0.6,\r\n }}\r\n />\r\n\r\n {/* Header - Clickable */}\r\n <button\r\n type=\"button\"\r\n onClick={() => setIsExpanded(!isExpanded)}\r\n style={{\r\n width: \"100%\",\r\n padding: \"14px 16px 14px 21px\",\r\n background: \"transparent\",\r\n border: \"none\",\r\n cursor: \"pointer\",\r\n textAlign: \"left\",\r\n transition: \"background 0.15s ease\",\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.background = \"rgba(231, 212, 162, 0.08)\";\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.background = \"transparent\";\r\n }}\r\n >\r\n <div style={{ display: \"flex\", alignItems: \"flex-start\", gap: \"12px\" }}>\r\n <div style={{ flex: 1, minWidth: 0 }}>\r\n <div style={{ marginBottom: \"4px\" }}>\r\n <span\r\n style={{\r\n fontSize: \"13px\",\r\n fontWeight: 680,\r\n color: \"rgba(30, 33, 37, 0.92)\",\r\n lineHeight: 1.2,\r\n }}\r\n >\r\n {sampleSignal.name}\r\n </span>\r\n </div>\r\n <div\r\n style={{\r\n fontSize: \"12px\",\r\n color: \"rgba(30, 33, 37, 0.65)\",\r\n lineHeight: 1.4,\r\n marginBottom: \"6px\",\r\n }}\r\n >\r\n {sampleSignal.description}\r\n </div>\r\n <div\r\n style={{\r\n fontSize: \"11px\",\r\n color: \"rgba(30, 33, 37, 0.42)\",\r\n fontFamily: \"ui-monospace, monospace\",\r\n marginBottom: \"8px\",\r\n }}\r\n >\r\n {sampleSignal.technicalKey}\r\n </div>\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: \"12px\",\r\n fontSize: \"11.5px\",\r\n }}\r\n >\r\n <span style={{ color: \"rgba(139, 157, 127, 0.65)\" }}>prob</span>\r\n <strong style={{ color: \"rgba(139, 157, 127, 0.85)\" }}>\r\n {sampleSignal.probability.toFixed(2)}\r\n </strong>\r\n <span style={{ color: \"rgba(30, 33, 37, 0.24)\" }}>·</span>\r\n <span style={{ color: \"rgba(184, 156, 106, 0.65)\" }}>conf</span>\r\n <strong style={{ color: \"rgba(184, 156, 106, 0.85)\" }}>\r\n {sampleSignal.confidence.toFixed(2)}\r\n </strong>\r\n <span style={{ color: \"rgba(30, 33, 37, 0.24)\" }}>·</span>\r\n <span style={{ color: \"rgba(30, 33, 37, 0.52)\" }}>\r\n {sampleSignal.observations} observations\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Rotating chevron on right */}\r\n <div\r\n style={{\r\n paddingTop: \"2px\",\r\n color: \"rgba(30, 33, 37, 0.42)\",\r\n flexShrink: 0,\r\n transition: \"transform 0.2s ease\",\r\n }}\r\n >\r\n <ChevronDown\r\n size={18}\r\n style={{\r\n transform: isExpanded ? \"rotate(180deg)\" : \"rotate(0deg)\",\r\n transition: \"transform 0.2s ease\",\r\n }}\r\n />\r\n </div>\r\n </div>\r\n </button>\r\n\r\n {/* Expanded content */}\r\n {isExpanded && (\r\n <div\r\n style={{\r\n borderTop: \"1px solid rgba(52, 58, 64, 0.08)\",\r\n background: \"rgba(244, 241, 230, 0.25)\",\r\n padding: \"16px 16px 16px 21px\",\r\n }}\r\n >\r\n <div\r\n style={{\r\n fontSize: \"10px\",\r\n fontWeight: 650,\r\n letterSpacing: \"0.08em\",\r\n textTransform: \"uppercase\",\r\n color: \"rgba(30, 33, 37, 0.52)\",\r\n marginBottom: \"8px\",\r\n }}\r\n >\r\n Contributing Observations\r\n </div>\r\n <div style={{ fontSize: \"12px\", color: \"rgba(30, 33, 37, 0.62)\" }}>\r\n [Observations would appear here]\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n // directional-chevron (current SignalCard pattern)\r\n return (\r\n <div\r\n style={{\r\n position: \"relative\",\r\n background: \"rgba(255, 255, 255, 0.82)\",\r\n border: \"1px solid rgba(52, 58, 64, 0.12)\",\r\n borderRadius: \"12px\",\r\n overflow: \"hidden\",\r\n boxShadow: \"0 2px 4px rgba(30, 33, 37, 0.06)\",\r\n }}\r\n >\r\n {/* Left rail */}\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n left: 0,\r\n top: 0,\r\n bottom: 0,\r\n width: \"5px\",\r\n background: \"#6B7C93\",\r\n opacity: 0.6,\r\n }}\r\n />\r\n\r\n {/* Header - Clickable */}\r\n <button\r\n type=\"button\"\r\n onClick={() => setIsExpanded(!isExpanded)}\r\n style={{\r\n width: \"100%\",\r\n padding: \"14px 16px 14px 21px\",\r\n background: \"transparent\",\r\n border: \"none\",\r\n cursor: \"pointer\",\r\n textAlign: \"left\",\r\n display: \"flex\",\r\n alignItems: \"flex-start\",\r\n gap: \"12px\",\r\n transition: \"background 0.15s ease\",\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.background = \"rgba(231, 212, 162, 0.08)\";\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.background = \"transparent\";\r\n }}\r\n >\r\n {/* Directional chevron on left */}\r\n <div\r\n style={{\r\n paddingTop: \"2px\",\r\n color: \"rgba(30, 33, 37, 0.42)\",\r\n flexShrink: 0,\r\n }}\r\n >\r\n {isExpanded ? (\r\n <ChevronDown size={16} />\r\n ) : (\r\n <ChevronRight size={16} />\r\n )}\r\n </div>\r\n <div style={{ flex: 1, minWidth: 0 }}>\r\n <div style={{ marginBottom: \"4px\" }}>\r\n <span\r\n style={{\r\n fontSize: \"13px\",\r\n fontWeight: 680,\r\n color: \"rgba(30, 33, 37, 0.92)\",\r\n lineHeight: 1.2,\r\n }}\r\n >\r\n {sampleSignal.name}\r\n </span>\r\n </div>\r\n <div\r\n style={{\r\n fontSize: \"12px\",\r\n color: \"rgba(30, 33, 37, 0.65)\",\r\n lineHeight: 1.4,\r\n marginBottom: \"6px\",\r\n }}\r\n >\r\n {sampleSignal.description}\r\n </div>\r\n <div\r\n style={{\r\n fontSize: \"11px\",\r\n color: \"rgba(30, 33, 37, 0.42)\",\r\n fontFamily: \"ui-monospace, monospace\",\r\n marginBottom: \"8px\",\r\n }}\r\n >\r\n {sampleSignal.technicalKey}\r\n </div>\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: \"12px\",\r\n fontSize: \"11.5px\",\r\n }}\r\n >\r\n <span style={{ color: \"rgba(139, 157, 127, 0.65)\" }}>prob</span>\r\n <strong style={{ color: \"rgba(139, 157, 127, 0.85)\" }}>\r\n {sampleSignal.probability.toFixed(2)}\r\n </strong>\r\n <span style={{ color: \"rgba(30, 33, 37, 0.24)\" }}>·</span>\r\n <span style={{ color: \"rgba(184, 156, 106, 0.65)\" }}>conf</span>\r\n <strong style={{ color: \"rgba(184, 156, 106, 0.85)\" }}>\r\n {sampleSignal.confidence.toFixed(2)}\r\n </strong>\r\n <span style={{ color: \"rgba(30, 33, 37, 0.24)\" }}>·</span>\r\n <span style={{ color: \"rgba(30, 33, 37, 0.52)\" }}>\r\n {sampleSignal.observations} observations\r\n </span>\r\n </div>\r\n </div>\r\n </button>\r\n\r\n {/* Expanded content */}\r\n {isExpanded && (\r\n <div\r\n style={{\r\n borderTop: \"1px solid rgba(52, 58, 64, 0.08)\",\r\n background: \"rgba(244, 241, 230, 0.25)\",\r\n padding: \"16px 16px 16px 21px\",\r\n }}\r\n >\r\n <div\r\n style={{\r\n fontSize: \"10px\",\r\n fontWeight: 650,\r\n letterSpacing: \"0.08em\",\r\n textTransform: \"uppercase\",\r\n color: \"rgba(30, 33, 37, 0.52)\",\r\n marginBottom: \"8px\",\r\n }}\r\n >\r\n Contributing Observations\r\n </div>\r\n <div style={{ fontSize: \"12px\", color: \"rgba(30, 33, 37, 0.62)\" }}>\r\n [Observations would appear here]\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n"],"names":["fmtMs","ms","EvidenceItem","ev","onPlay","onHighlight","actor","jsx","UserCheck","User","jsxs","SmallButton","Play","_a","ScrollText","AgentLiftCard","outcomeLift","pExpected","pFull","liftRaw","liftRecentered","fmtPct","v","fmtPp","pp","liftColor","DetailCard","TrendingUp","_b","key","i","Tag","STYLE_ID","ensureKeyframes","style","CoachingSynthesisCard","data","loading","error","React","w","strengths","improvements","organizational","oneLiner","context","CoachingSection","Lightbulb","Building","icon","label","color","items","item","text","quote","MessageSquareQuote","fmtDur","seconds","m","s","InteractionContext","title","meta","callPurpose","classification","dimensions","cp","cls","CardBase","dim","InteractionScores","scores","val","GROUP_LABELS","Target","FileText","Scale","Zap","MessageSquare","KIND_COLORS","CheckCircle","InteractionSignals","signals","expandedSignals","toggleSignal","playAudio","highlightTurns","grouped","useMemo","result","g","groupKey","groupSignals","info","SectionLabel","name","delta","hasObs","isExpanded","e","ChevronDown","obs","oi","ei","InteractionGuidance","guidance","ki","ownerBadge","sr","si","CornerDownRight","InteractionNBA","nba","r","InteractionRecording","audioUrl","timelineSegments","durationSeconds","currentTimeSeconds","timelinePlaying","playbackRate","onSeek","onTogglePlay","onSeekBack","onSeekForward","onSetPlaybackRate","audioRef","Timeline","InteractionTranscript","transcript","highlightedTurns","activeTurnIndex","turnObservations","setExpandedSignals","onTurnPlayPause","formatTimeRange","startMs","endMs","formatTime","minutes","start","end","turns","prev","el","TranscriptCard","messageActionButtonStyle","MessageThread","sessionTitle","sessionSubtitle","threadLabel","initialMessages","onSendMessage","onReplyMessage","onEditMessage","onDeleteMessage","onCreateNewThread","currentUser","isLoading","messageInput","setMessageInput","useState","isFocused","setIsFocused","messages","setMessages","isSending","setIsSending","hoveredMessageId","setHoveredMessageId","replyingToMessageId","setReplyingToMessageId","replyDraft","setReplyDraft","editingMessageId","setEditingMessageId","editContent","setEditContent","deleteConfirmMessage","setDeleteConfirmMessage","showNewThreadCompose","setShowNewThreadCompose","newThreadInput","setNewThreadInput","isCreatingNewThread","setIsCreatingNewThread","messagesEndRef","useRef","messageInputRef","displayCurrentUser","hasHeader","replyingToMessage","useEffect","handleNewThreadSubmit","trimmed","handleNewThreadCancel","handleSend","content","optimisticId","optimisticMessage","msg","handleKeyPress","handleReplyClick","message","handleInlineReplySend","parentMessageId","handleEditClick","handleEditSubmit","handleDeleteClick","Clock","Fragment","Send","findBlock","blocks","id","b","InteractionDetailPanel","coachingData","coachingLoading","coachingError","segmentEndHandlerRef","setHighlightedTurns","setCurrentTimeSeconds","setTimelinePlaying","setPlaybackRate","ctx","summary","_c","_d","_e","_f","_g","messageThread","_h","_i","_j","d","_k","map","signal","groupInfo","tid","o","_l","startTime","endTime","isAgent","actorName","currentMs","handleTimelineSeek","handleTimelineTogglePlay","p","handleTimelineSeekBack","handleTimelineSeekForward","duration","handleSetPlaybackRate","rate","audio","updateTime","handlePlay","handlePause","handleEnded","player","startSec","endSec","handler","handleTranscriptTurnPlayPause","turn","index","turnIds","container","next","_m","ErrorBoundary","props","InteractionDetailPanelWrapper","ExpandPatternComparison","pattern","setIsExpanded","sampleSignal","ChevronRight"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "chordia-ui",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Chordia Design System - UI components, tokens, and Tailwind preset",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.cjs.js",
|
|
7
|
+
"module": "dist/index.es.js",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.es.js",
|
|
11
|
+
"require": "./dist/index.cjs.js"
|
|
12
|
+
},
|
|
13
|
+
"./pages/interactionDetails": {
|
|
14
|
+
"import": "./dist/pages/interactionDetails.es.js",
|
|
15
|
+
"require": "./dist/pages/interactionDetails.cjs.js"
|
|
16
|
+
},
|
|
17
|
+
"./tokens": "./src/tokens/index.css",
|
|
18
|
+
"./tokens/*": "./src/tokens/*",
|
|
19
|
+
"./tailwind-preset": "./tailwind.preset.js",
|
|
20
|
+
"./utils": "./src/utils/index.js"
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"dist",
|
|
24
|
+
"src/tokens",
|
|
25
|
+
"src/utils",
|
|
26
|
+
"tailwind.preset.js"
|
|
27
|
+
],
|
|
28
|
+
"scripts": {
|
|
29
|
+
"dev": "vite",
|
|
30
|
+
"build": "vite build",
|
|
31
|
+
"build:lib": "vite build --config vite.lib.config.js",
|
|
32
|
+
"preview": "vite preview"
|
|
33
|
+
},
|
|
34
|
+
"peerDependencies": {
|
|
35
|
+
"lucide-react": ">=0.300.0",
|
|
36
|
+
"react": ">=18.0.0",
|
|
37
|
+
"react-dom": ">=18.0.0",
|
|
38
|
+
"recharts": ">=3.0.0"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@vitejs/plugin-react": "^4.3.4",
|
|
42
|
+
"autoprefixer": "^10.4.20",
|
|
43
|
+
"clsx": "^2.1.1",
|
|
44
|
+
"lucide-react": "^0.468.0",
|
|
45
|
+
"marked": "^17.0.3",
|
|
46
|
+
"postcss": "^8.4.49",
|
|
47
|
+
"react": "^18.3.1",
|
|
48
|
+
"react-dom": "^18.3.1",
|
|
49
|
+
"tailwind-merge": "^2.6.0",
|
|
50
|
+
"tailwindcss": "^3.4.17",
|
|
51
|
+
"vite": "^6.1.0",
|
|
52
|
+
"recharts": "^3.7.0"
|
|
53
|
+
},
|
|
54
|
+
"keywords": [
|
|
55
|
+
"chordia",
|
|
56
|
+
"design-system",
|
|
57
|
+
"ui",
|
|
58
|
+
"components",
|
|
59
|
+
"tailwind"
|
|
60
|
+
],
|
|
61
|
+
"license": "MIT",
|
|
62
|
+
"publishConfig": {
|
|
63
|
+
"access": "public"
|
|
64
|
+
},
|
|
65
|
+
"dependencies": {
|
|
66
|
+
"@dnd-kit/core": "^6.3.1",
|
|
67
|
+
"@dnd-kit/sortable": "^10.0.0",
|
|
68
|
+
"@dnd-kit/utilities": "^3.2.2",
|
|
69
|
+
"@radix-ui/react-tooltip": "^1.2.8"
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/* Chordia Design System - Color Tokens */
|
|
2
|
+
:root {
|
|
3
|
+
/* ============================================
|
|
4
|
+
FONTS
|
|
5
|
+
============================================ */
|
|
6
|
+
--font-sans: 'Averta', ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
|
|
7
|
+
--font-display: 'Tomato Grotesk', 'Averta', ui-sans-serif, system-ui, sans-serif;
|
|
8
|
+
--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
|
|
9
|
+
|
|
10
|
+
--default-font-family: var(--font-sans);
|
|
11
|
+
--default-mono-font-family: var(--font-mono);
|
|
12
|
+
|
|
13
|
+
/* ============================================
|
|
14
|
+
FOUNDATION COLORS
|
|
15
|
+
============================================ */
|
|
16
|
+
--bg-chordia: #F4F1E6;
|
|
17
|
+
--paper: rgba(255, 255, 255, 0.78);
|
|
18
|
+
--paper-secondary: rgba(255, 255, 255, 0.55);
|
|
19
|
+
--paper-elevated: rgba(255, 255, 255, 0.82);
|
|
20
|
+
--paper-high: rgba(255, 255, 255, 0.85);
|
|
21
|
+
|
|
22
|
+
/* Text hierarchy */
|
|
23
|
+
--text-ink: #1E2125;
|
|
24
|
+
--text-base: rgba(30, 33, 37, 0.78);
|
|
25
|
+
--text-strong: rgba(30, 33, 37, 0.92);
|
|
26
|
+
--text-muted: rgba(30, 33, 37, 0.56);
|
|
27
|
+
--text-faint: rgba(30, 33, 37, 0.36);
|
|
28
|
+
--text-subtle: rgba(30, 33, 37, 0.52);
|
|
29
|
+
--text-xfaint: rgba(30, 33, 37, 0.28);
|
|
30
|
+
|
|
31
|
+
/* Borders */
|
|
32
|
+
--border: rgba(52, 58, 64, 0.12);
|
|
33
|
+
--border-hover: rgba(52, 58, 64, 0.18);
|
|
34
|
+
--border-strong: rgba(52, 58, 64, 0.22);
|
|
35
|
+
--border-subtle: rgba(52, 58, 64, 0.08);
|
|
36
|
+
|
|
37
|
+
/* Interactive states */
|
|
38
|
+
--hover-warm: rgba(231, 212, 162, 0.12);
|
|
39
|
+
--hover-warm-strong: rgba(231, 212, 162, 0.18);
|
|
40
|
+
--hover-warm-subtle: rgba(231, 212, 162, 0.08);
|
|
41
|
+
--hover-cool: rgba(210, 220, 235, 0.18);
|
|
42
|
+
--focus: rgba(231, 212, 162, 0.55);
|
|
43
|
+
|
|
44
|
+
/* ============================================
|
|
45
|
+
SEMANTIC COLORS (No Judgment Principle)
|
|
46
|
+
============================================ */
|
|
47
|
+
--state-present: #25A372;
|
|
48
|
+
--state-absent: rgba(30, 33, 37, 0.28);
|
|
49
|
+
--state-unknown: #E7BF33;
|
|
50
|
+
|
|
51
|
+
/* ============================================
|
|
52
|
+
RAIL COLORS (Categorization)
|
|
53
|
+
============================================ */
|
|
54
|
+
--rail-compliance: #C98A5A;
|
|
55
|
+
--rail-orange: #C98A5A;
|
|
56
|
+
--rail-tone: #9B7AA8;
|
|
57
|
+
--rail-purple: #9B7AA8;
|
|
58
|
+
--rail-discovery: #5E88B0;
|
|
59
|
+
--rail-blue: #5E88B0;
|
|
60
|
+
--rail-outcome: #6B7C93;
|
|
61
|
+
--rail-slate: #6B7C93;
|
|
62
|
+
--rail-signal-churn: #D17B6B;
|
|
63
|
+
--rail-coral: #D17B6B;
|
|
64
|
+
--rail-signal-upsell: #7BA89D;
|
|
65
|
+
--rail-teal: #B8976A;
|
|
66
|
+
--rail-signal-satisfaction: #9B8E6F;
|
|
67
|
+
--rail-olive: #9B8E6F;
|
|
68
|
+
--rail-quality: #8A9BAF;
|
|
69
|
+
|
|
70
|
+
/* ============================================
|
|
71
|
+
ACTOR CARD TINTS (Conversation Turns)
|
|
72
|
+
============================================ */
|
|
73
|
+
--card-customer: rgba(94, 136, 176, 0.06); /* --rail-discovery at 6% */
|
|
74
|
+
--card-agent: var(--paper-elevated); /* neutral white */
|
|
75
|
+
--card-assistant: rgba(155, 122, 168, 0.05); /* --rail-purple at 5% */
|
|
76
|
+
|
|
77
|
+
/* ============================================
|
|
78
|
+
COMPONENT-SPECIFIC TOKENS
|
|
79
|
+
============================================ */
|
|
80
|
+
--rail-width-thin: 4px;
|
|
81
|
+
--rail-width: 5px;
|
|
82
|
+
--rail-width-thick: 6px;
|
|
83
|
+
--deviation-dot-size: 6px;
|
|
84
|
+
--deviation-gap: 3px;
|
|
85
|
+
--timestamp-bg: rgba(255, 255, 255, 0.70);
|
|
86
|
+
--timestamp-border: rgba(52, 58, 64, 0.16);
|
|
87
|
+
--bar-h: 3px;
|
|
88
|
+
--bar-w: 45px;
|
|
89
|
+
--bar-bg: rgba(30, 33, 37, 0.12);
|
|
90
|
+
--bar-fill: rgba(30, 33, 37, 0.45);
|
|
91
|
+
--tooltip-bg: rgba(30, 33, 37, 0.95);
|
|
92
|
+
--tooltip-text: rgba(255, 255, 255, 0.95);
|
|
93
|
+
|
|
94
|
+
/* ============================================
|
|
95
|
+
STANDARD DESIGN SYSTEM COLORS
|
|
96
|
+
============================================ */
|
|
97
|
+
--background: var(--bg-chordia);
|
|
98
|
+
--foreground: var(--text-ink);
|
|
99
|
+
--card: var(--paper-elevated);
|
|
100
|
+
--card-foreground: var(--text-ink);
|
|
101
|
+
--popover: var(--paper-high);
|
|
102
|
+
--popover-foreground: var(--text-ink);
|
|
103
|
+
--primary: #030213;
|
|
104
|
+
--primary-foreground: #ffffff;
|
|
105
|
+
--secondary: rgba(249, 250, 251, 1);
|
|
106
|
+
--secondary-foreground: #030213;
|
|
107
|
+
--accent: rgba(233, 235, 239, 1);
|
|
108
|
+
--accent-foreground: #030213;
|
|
109
|
+
--destructive: #C98A5A;
|
|
110
|
+
--destructive-foreground: #ffffff;
|
|
111
|
+
--input: transparent;
|
|
112
|
+
--input-background: rgba(243, 243, 245, 1);
|
|
113
|
+
--switch-background: rgba(203, 206, 212, 1);
|
|
114
|
+
--ring: rgba(113, 113, 122, 0.5);
|
|
115
|
+
--chart-1: #25A372;
|
|
116
|
+
--chart-2: #44C090;
|
|
117
|
+
--chart-3: #B7D89E;
|
|
118
|
+
--chart-4: #E7BF33;
|
|
119
|
+
--chart-5: #C98A5A;
|
|
120
|
+
--sidebar: var(--paper-high);
|
|
121
|
+
--sidebar-foreground: var(--text-ink);
|
|
122
|
+
--sidebar-primary: #030213;
|
|
123
|
+
--sidebar-primary-foreground: #ffffff;
|
|
124
|
+
--sidebar-accent: var(--hover-warm-subtle);
|
|
125
|
+
--sidebar-accent-foreground: var(--text-ink);
|
|
126
|
+
--sidebar-border: var(--border);
|
|
127
|
+
--sidebar-ring: var(--ring);
|
|
128
|
+
|
|
129
|
+
/* ============================================
|
|
130
|
+
LEGACY COMPATIBILITY
|
|
131
|
+
============================================ */
|
|
132
|
+
--bg: var(--bg-chordia);
|
|
133
|
+
--paper2: var(--paper-secondary);
|
|
134
|
+
--ink: var(--text-ink);
|
|
135
|
+
--text: var(--text-base);
|
|
136
|
+
--muted: var(--text-muted);
|
|
137
|
+
--faint: var(--text-faint);
|
|
138
|
+
--b1: var(--border);
|
|
139
|
+
--b2: var(--border-hover);
|
|
140
|
+
--warm: var(--hover-warm);
|
|
141
|
+
--cool: var(--hover-cool);
|
|
142
|
+
--present: var(--state-present);
|
|
143
|
+
--absent: var(--state-absent);
|
|
144
|
+
--unknown: var(--state-unknown);
|
|
145
|
+
--s1: var(--shadow-lg);
|
|
146
|
+
--s2: var(--shadow-md);
|
|
147
|
+
--r1: var(--radius-lg);
|
|
148
|
+
--r2: var(--radius-md);
|
|
149
|
+
--font-size: 0.875rem;
|
|
150
|
+
}
|