chordia-ui 3.7.2 → 3.7.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.
- package/dist/CustomFilterChips.cjs.js +1 -1
- package/dist/CustomFilterChips.cjs.js.map +1 -1
- package/dist/CustomFilterChips.es.js +2 -2
- package/dist/CustomFilterChips.es.js.map +1 -1
- package/dist/components/UpdatedInteractionDetails.cjs.js +2 -2
- package/dist/components/UpdatedInteractionDetails.cjs.js.map +1 -1
- package/dist/components/UpdatedInteractionDetails.es.js +14 -13
- package/dist/components/UpdatedInteractionDetails.es.js.map +1 -1
- package/package.json +1 -1
- package/src/components/UpdatedInteractionDetails/UpdatedInteractionDetails.jsx +13 -13
- package/src/components/UpdatedInteractionDetails/UpdatedThreads.jsx +1 -0
- package/src/components/common/CustomFilterChips.jsx +5 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UpdatedInteractionDetails.cjs.js","sources":["../../src/components/UpdatedInteractionDetails/UpdatedCoachingSynthesisCard.jsx","../../src/components/UpdatedInteractionDetails/UpdatedInteractionContext.jsx","../../src/components/UpdatedInteractionDetails/UpdatedInteractionScores.jsx","../../src/components/UpdatedInteractionDetails/UpdatedInteractionSignals.jsx","../../src/components/UpdatedInteractionDetails/UpdatedCompassScore.jsx","../../src/components/UpdatedInteractionDetails/UpdatedThreads.jsx","../../src/components/UpdatedInteractionDetails/UpdatedGuidance.jsx","../../src/components/UpdatedInteractionDetails/UpdatedInteractionDetails.jsx"],"sourcesContent":["\"use client\";\n\nimport React from \"react\";\nimport { ShieldCheck, ThumbsUp, TrendingUp, Lightbulb } from \"lucide-react\";\n\n/**\n * UpdatedCoachingSynthesisCard — \"COACHING SUMMARY\" section matching Figma node 113-7216.\n *\n * Props:\n * - data object Coaching synthesis response\n * - loading boolean Show shimmer loading state\n * - error string Error message to display\n *\n * Data shape:\n * - one_liner string\n * - context string\n * - strengths Array<{ text: string, quote?: string }>\n * - improvements Array<{ text: string, quote?: string }>\n * - overall string \"effective\" | \"strong\" | \"needs_improvement\" | \"mixed\"\n */\n\nconst COLORS = {\n strong: \"var(--Grey-Strong, #2E3236)\",\n muted: \"var(--Grey-Muted, #808183)\",\n absent: \"var(--Grey-absent, #D9D9D9)\",\n accent: \"var(--rail-orange, #C98A5A)\",\n itemText: \"var(--text-item, #3F3F3F)\",\n quoteLine: \"var(--border-warm, #B2AEA8)\",\n quoteText: \"var(--text-subtle-warm, #767473)\",\n iconBg: \"var(--surface-hover, #F3F7F7)\",\n};\n\nconst OVERALL_MAP = {\n effective: \"Effective\",\n strong: \"Strong\",\n needs_improvement: \"Needs Improvement\",\n mixed: \"Mixed\",\n};\n\nconst STYLE_ID = \"updated-coaching-synthesis-keyframes\";\n\nfunction ensureKeyframes() {\n if (typeof document === \"undefined\") return;\n if (document.getElementById(STYLE_ID)) return;\n const style = document.createElement(\"style\");\n style.id = STYLE_ID;\n style.textContent = `\n @keyframes updated-coaching-shimmer {\n 0% { background-position: -200% 0; }\n 100% { background-position: 200% 0; }\n }\n @keyframes updated-coaching-pulse {\n 0%, 100% { opacity: 0.4; }\n 50% { opacity: 1; }\n }\n `;\n document.head.appendChild(style);\n}\n\nfunction OverallBadge({ overall }) {\n const label = OVERALL_MAP[overall] || (overall ? overall.replace(/_/g, \" \") : \"\");\n\n return (\n <div style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n flexShrink: 0,\n }}>\n <span style={{\n fontSize: 13,\n fontWeight: 400,\n color: COLORS.strong,\n fontFamily: \"var(--font-sans)\",\n lineHeight: 1.2,\n }}>\n Overall:\n </span>\n <div style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n }}>\n <ThumbsUp size={14} color={COLORS.strong} strokeWidth={1.5} />\n <span style={{\n fontSize: 13,\n fontWeight:600,\n color: COLORS.strong,\n fontFamily: \"var(--font-sans)\",\n lineHeight: 1.2,\n }}>\n {label}\n </span>\n </div>\n </div>\n );\n}\n\nfunction SectionItem({ item }) {\n const text = typeof item === \"string\" ? item : item?.text || \"\";\n const quote = typeof item === \"object\" ? item?.quote : null;\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 14 }}>\n <div style={{\n fontSize: 14,\n fontWeight: 600,\n color: COLORS.itemText,\n fontFamily: \"var(--font-sans)\",\n lineHeight: 1.5,\n }}>\n {text}\n </div>\n {quote && (\n <div style={{\n display: \"flex\",\n gap: 10,\n }}>\n <div style={{\n width: 1,\n flexShrink: 0,\n alignSelf: \"stretch\",\n background: COLORS.quoteLine,\n }} />\n <div style={{\n fontSize: 14,\n fontWeight: 400,\n color: COLORS.quoteText,\n fontFamily: \"var(--font-sans)\",\n lineHeight: 1.5,\n }}>\n “{quote}”\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction CoachingColumn({ icon, label, items }) {\n if (!items || items.length === 0) return null;\n\n return (\n <div style={{\n flex: 1,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n borderRadius: 12,\n }}>\n {/* Column header */}\n <div style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 16,\n }}>\n {/* Icon with circular bg */}\n <div style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 24,\n height: 24,\n borderRadius: 9999,\n background: COLORS.iconBg,\n flexShrink: 0,\n }}>\n {icon}\n </div>\n <span style={{\n fontSize: 16,\n fontWeight: 600,\n color: COLORS.strong,\n fontFamily: \"var(--font-sans)\",\n lineHeight: \"normal\",\n }}>\n {label}\n </span>\n </div>\n\n {/* Items */}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 24 }}>\n {items.map((item, i) => (\n <SectionItem key={i} item={item} />\n ))}\n </div>\n </div>\n );\n}\n\nconst UpdatedCoachingSynthesisCard = ({ data, loading, error }) => {\n React.useEffect(() => { ensureKeyframes(); }, []);\n\n // Loading state — ThreeCirclesSpinner\n if (loading) {\n return (\n <>\n <style>{`\n @keyframes coaching-spinner-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `}</style>\n <div style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 12,\n padding: \"48px 24px\",\n }}>\n <svg\n width={48}\n height={48}\n viewBox=\"0 0 48 48\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ animation: \"coaching-spinner-spin 1.2s linear infinite\" }}\n >\n <path\n d=\"M43 24C43 26.4951 42.5086 28.9658 41.5537 31.271C40.5989 33.5762 39.1993 35.6707 37.435 37.435C35.6707 39.1993 33.5762 40.5989 31.271 41.5537C28.9658 42.5086 26.4951 43 24 43C21.5049 43 19.0342 42.5086 16.729 41.5537C14.4238 40.5989 12.3293 39.1993 10.565 37.435C8.80066 35.6707 7.40113 33.5762 6.44629 31.271C5.49145 28.9658 5 26.4951 5 24\"\n stroke=\"#F3E7C7\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M12 24C12 22.4241 12.3104 20.8637 12.9134 19.4078C13.5165 17.9519 14.4004 16.629 15.5147 15.5147C16.629 14.4004 17.9519 13.5165 19.4078 12.9134C20.8637 12.3104 22.4241 12 24 12C25.5759 12 27.1363 12.3104 28.5922 12.9134C30.0481 13.5165 31.371 14.4004 32.4853 15.5147C33.5996 16.629 34.4835 17.9519 35.0866 19.4078C35.6896 20.8637 36 22.4241 36 24\"\n stroke=\"#00A66E\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M20 24C20 24.5253 20.1035 25.0454 20.3045 25.5307C20.5055 26.016 20.8001 26.457 21.1716 26.8284C21.543 27.1999 21.984 27.4945 22.4693 27.6955C22.9546 27.8965 23.4747 28 24 28C24.5253 28 25.0454 27.8965 25.5307 27.6955C26.016 27.4945 26.457 27.1999 26.8284 26.8284C27.1999 26.457 27.4945 26.016 27.6955 25.5307C27.8965 25.0454 28 24.5253 28 24\"\n stroke=\"#F3E7C7\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n />\n </svg>\n <span style={{\n fontSize: 14,\n color: COLORS.muted,\n fontWeight: 500,\n textAlign: \"center\",\n }}>\n Synthesizing coaching summary...\n </span>\n </div>\n </>\n );\n }\n\n // Error state\n if (error) {\n return (\n <div style={{\n fontSize: 14,\n color: COLORS.muted,\n }}>\n Unable to generate coaching summary.\n </div>\n );\n }\n\n // No data\n if (!data) return null;\n\n const strengths = data.strengths || [];\n const improvements = data.improvements || [];\n const oneLiner = typeof data.one_liner === \"string\" ? data.one_liner : data.one_liner?.text || \"\";\n const context = typeof data.context === \"string\" ? data.context : data.context?.text || \"\";\n\n return (\n <div style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n background: \"#FFF\",\n }}>\n {/* Section header — Figma: icon + \"Coaching Summary\" 16px / 700 / #2E3236 */}\n <div style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n }}>\n <ShieldCheck size={20} color={COLORS.accent} strokeWidth={2} />\n <span style={{\n fontSize: 16,\n fontWeight: 600,\n color: COLORS.strong,\n fontFamily: \"var(--font-sans)\",\n lineHeight: 1.2,\n textTransform: \"uppercase\",\n }}>\n Coaching Summary\n </span>\n </div>\n\n {/* One-liner — Figma: 14px / 600 / #2E3236 */}\n {oneLiner && (\n <div style={{\n fontSize: 14,\n fontWeight: 500,\n color: COLORS.strong,\n fontFamily: \"var(--font-sans)\",\n lineHeight: 1.5,\n }}>\n {oneLiner}\n </div>\n )}\n\n {/* Context row + Overall badge — Figma: horizontal, space-between */}\n <div style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 16,\n justifyContent: \"space-between\",\n }}>\n {context && (\n <div style={{\n fontSize: 14,\n fontWeight: 400,\n color: COLORS.muted,\n fontFamily: \"var(--font-sans)\",\n lineHeight: 1.5,\n flex: 1,\n }}>\n {context}\n </div>\n )}\n {data.overall && <OverallBadge overall={data.overall} />}\n </div>\n\n {/* Two-column layout: Key Strengths + Improvements */}\n {/* Figma: border-top 1px #D9D9D9, padding-top 24px, gap 24px */}\n {(strengths.length > 0 || improvements.length > 0) && (\n <div style={{\n display: \"flex\",\n gap: 24,\n paddingTop: 24,\n borderTop: `1px solid ${COLORS.absent}`,\n }}>\n <CoachingColumn\n icon={<TrendingUp size={14} color={COLORS.strong} strokeWidth={1.5} />}\n label=\"Key Strengths\"\n items={strengths}\n />\n <CoachingColumn\n icon={<Lightbulb size={14} color={COLORS.strong} strokeWidth={1.5} />}\n label=\"Improvements\"\n items={improvements}\n />\n </div>\n )}\n </div>\n );\n};\n\nexport default UpdatedCoachingSynthesisCard;\n","import { useEffect, useRef, useState } from 'react';\nimport { ChevronDown, ChevronUp, Pencil } from 'lucide-react';\n\n/*\n * Figma node: 101-2385 / 495-803 (Context grid + More Details expandable)\n */\n\nfunction fmtDur(seconds) {\n const m = Math.floor(seconds / 60);\n const s = Math.round(seconds % 60);\n return `${m}:${s.toString().padStart(2, '0')}`;\n}\n\nconst ROW_STYLE = {\n display: 'flex',\n justifyContent: 'space-between',\n padding: '8px 8px 12px 8px',\n alignItems: 'center',\n gap: 24,\n fontFamily: 'var(--font-sans)',\n fontSize: 13,\n fontWeight: 400,\n lineHeight: 'normal',\n borderBottom: '1px solid var(--Grey-absent, #D9D9D9)',\n};\n\nconst COLUMN_STYLE = {\n display: 'flex',\n flexDirection: 'column',\n flex: '1 0 0',\n gap: 0,\n minWidth: 0,\n};\n\nconst UpdatedInteractionContext = ({\n meta = {},\n callPurpose = {},\n classification = {},\n dimensions = [],\n outcomeQuality = 'Neutral',\n onMoreDetails,\n moreDetails = [],\n resolutionOutcome,\n customerIntent,\n canShowEditButton = false,\n onEditInteraction,\n}) => {\n const [expanded, setExpanded] = useState(false);\n const moreDetailsRef = useRef(null);\n\n const duration = meta.duration_seconds != null ? fmtDur(meta.duration_seconds) : null;\n const messages = meta.message_count;\n const driver = callPurpose.interaction_driver;\n const paradigm = classification.interaction_paradigm;\n\n // Helper to find a dimension by key pattern\n const findDim = (keyPattern) => dimensions.find((d) => (d.key || '').toLowerCase().includes(keyPattern));\n\n // Auto-extract known dimensions — use explicit props first, then fall back to dimensions data\n const dimResolution = findDim('resolution_outcome');\n const dimIntent = findDim('customer_intent');\n const dimOutcomeQuality = findDim('outcome_quality');\n\n const fmtValue = (v) => v ? v.replace(/_/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase()) : null;\n\n const resolvedOutcomeQuality = outcomeQuality !== 'Neutral' ? outcomeQuality\n : dimOutcomeQuality ? fmtValue(dimOutcomeQuality.value)\n : outcomeQuality;\n\n const resolvedResolutionOutcome = resolutionOutcome ?? (dimResolution ? fmtValue(dimResolution.value) : null);\n const resolvedCustomerIntent = customerIntent ?? (dimIntent ? fmtValue(dimIntent.value) : null);\n\n // Keys to exclude from the generic dimensions grid (they go in dedicated spots)\n const excludedKeys = new Set(['resolution_outcome', 'customer_intent', 'outcome_quality'].map((k) => `dim.${k}`));\n const filteredDimensions = dimensions.filter((d) => !excludedKeys.has(d.key));\n\n // Build paired rows: [left, right] per line\n const pairedRows = [];\n const rawPairs = [\n [\n duration != null ? { label: 'Duration', value: duration } : null,\n messages != null ? { label: 'Messages', value: messages } : null,\n ],\n [\n driver != null ? { label: 'Driver', value: driver } : null,\n paradigm != null ? { label: 'Paradigm', value: paradigm } : null,\n ],\n ];\n\n // Add remaining dimension pairs (excluding the ones we extracted)\n for (let i = 0; i < filteredDimensions.length; i += 2) {\n const left = filteredDimensions[i] ? { label: filteredDimensions[i].display_name || filteredDimensions[i].label || filteredDimensions[i].key, value: fmtValue(filteredDimensions[i].value) } : null;\n const right = filteredDimensions[i + 1] ? { label: filteredDimensions[i + 1].display_name || filteredDimensions[i + 1].label || filteredDimensions[i + 1].key, value: fmtValue(filteredDimensions[i + 1].value) } : null;\n rawPairs.push([left, right]);\n }\n\n // Last row: Outcome Quality (left) + More details toggle (right)\n rawPairs.push([\n { label: 'Outcome Quality', value: resolvedOutcomeQuality },\n { isMoreDetails: true },\n ]);\n\n rawPairs.forEach((pair) => pairedRows.push(pair));\n\n // Build \"More Details\" expanded rows — auto-extracted from dimensions\n const detailRows = [\n resolvedResolutionOutcome != null && { label: 'Resolution Outcome', value: resolvedResolutionOutcome },\n resolvedCustomerIntent != null && { label: 'Customer Intent', value: resolvedCustomerIntent },\n ...(moreDetails || []),\n ].filter(Boolean);\n\n // Close \"More Details\" dropdown on outside click\n useEffect(() => {\n if (!expanded) return;\n\n const handleOutsideClick = (event) => {\n if (moreDetailsRef.current && !moreDetailsRef.current.contains(event.target)) {\n setExpanded(false);\n }\n };\n\n document.addEventListener('mousedown', handleOutsideClick);\n return () => document.removeEventListener('mousedown', handleOutsideClick);\n }, [expanded]);\n\n const renderRow = (item) => (\n <div\n key={item.label}\n style={ROW_STYLE}\n >\n <span style={{ color: 'var(--Grey-Strong, #2E3236)', whiteSpace: 'nowrap', flexShrink: 0 }}>\n {item.label}\n </span>\n <span style={{\n color: 'var(--Grey-Muted, #808183)',\n textAlign: 'right',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n minWidth: 0,\n }}>\n {item.value}\n </span>\n </div>\n );\n\n const renderMoreDetailsToggle = () => (\n <div\n key=\"more-details\"\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 12,\n padding: '8px 8px 12px 8px',\n fontFamily: 'var(--font-sans)',\n borderBottom: 'none',\n minHeight: 33,\n }}\n >\n <button\n onClick={() => {\n setExpanded((p) => !p);\n if (onMoreDetails && !expanded) onMoreDetails();\n }}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: 0,\n color: 'var(--Grey-Strong, #2E3236)',\n fontSize: 13,\n fontWeight: 500,\n lineHeight: 'normal',\n fontFamily: 'var(--font-sans)',\n whiteSpace: 'nowrap',\n flexShrink: 0,\n }}\n >\n <span>More Details</span>\n {expanded\n ? <ChevronUp size={16} color=\"var(--Grey-Muted, #808183)\" strokeWidth={1.5} />\n : <ChevronDown size={16} color=\"var(--Grey-Muted, #808183)\" strokeWidth={1.5} />\n }\n </button>\n\n {canShowEditButton && (\n <button\n onClick={onEditInteraction || (() => {})}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n padding: '5px 12px',\n background: 'var(--Grey-White, #FFF)',\n border: '1px solid var(--Grey-absent, #D9D9D9)',\n borderRadius: 12,\n color: 'var(--Grey-Strong, #2E3236)',\n fontSize: 13,\n fontWeight: 500,\n lineHeight: 'normal',\n fontFamily: 'var(--font-sans)',\n cursor: 'pointer',\n flexShrink: 0,\n }}\n >\n <Pencil size={15} color=\"var(--Grey-Strong, #2E3236)\" strokeWidth={1.5} />\n <span style={{ fontSize: 13, lineHeight: 'normal' }}>Edit</span>\n </button>\n )}\n </div>\n );\n\n return (\n <div\n ref={moreDetailsRef}\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignSelf: 'stretch',\n gap: 0,\n position: 'relative',\n overflow: 'visible',\n }}\n >\n {/* Paired rows — two columns side by side */}\n {pairedRows.map((pair, idx) => (\n <div\n key={idx}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 24,\n alignSelf: 'stretch',\n flexWrap: 'nowrap',\n }}\n >\n {/* Left cell */}\n <div style={COLUMN_STYLE}>\n {pair[0] && !pair[0].isMoreDetails ? renderRow(pair[0]) : <div style={{ flex: 1 }} />}\n </div>\n\n {/* Right cell */}\n <div style={COLUMN_STYLE}>\n {pair[1] && !pair[1].isMoreDetails\n ? renderRow(pair[1])\n : pair[1]?.isMoreDetails\n ? renderMoreDetailsToggle()\n : <div style={{ flex: 1 }} />}\n </div>\n </div>\n ))}\n\n {/* More Details dropdown — absolute, full width, left-aligned */}\n {expanded && detailRows.length > 0 && (\n <div\n style={{\n position: 'absolute',\n top: '100%',\n right: 0,\n marginTop: 4,\n display: 'flex',\n width: 340,\n flexDirection: 'column',\n alignItems: 'flex-start',\n borderRadius: 4,\n border: '1px solid var(--Grey-absent, #D9D9D9)',\n background: 'var(--Grey-White, #FFF)',\n boxShadow: '-2px 2px 2px 0 rgba(0, 0, 0, 0.25)',\n overflow: 'hidden',\n fontFamily: 'var(--font-sans)',\n zIndex: 50,\n }}\n >\n {/* Dropdown header */}\n <div style={{\n padding: '12px 16px',\n fontSize: 13,\n fontWeight: 600,\n color: 'var(--Grey-Strong, #2E3236)',\n borderBottom: '1px solid var(--Grey-absent, #D9D9D9)',\n alignSelf: 'stretch',\n }}>\n More details\n </div>\n\n {/* Detail rows */}\n {detailRows.map((row) => (\n <div\n key={row.label}\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '12px 16px',\n gap: 24,\n fontSize: 13,\n fontWeight: 400,\n lineHeight: 'normal',\n borderBottom: '1px solid var(--Grey-absent, #D9D9D9)',\n alignSelf: 'stretch',\n }}\n >\n <span style={{ color: 'var(--Grey-Strong, #2E3236)', whiteSpace: 'nowrap', flexShrink: 0 }}>\n {row.label}\n </span>\n <span style={{\n color: 'var(--Grey-Muted, #808183)',\n fontSize: 13,\n fontStyle: 'normal',\n fontWeight: 400,\n lineHeight: '120%',\n textAlign: 'right',\n }}>\n {row.value}\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n};\n\nexport default UpdatedInteractionContext;\n","import React from 'react';\nimport { ThumbsUp, ThumbsDown, Plus } from 'lucide-react';\n\n/*\n * Figma node: 101-2386 (Agent Lift Analysis)\n *\n * Container: fill=#F3F1E5, padding: 24px, gap: 24px, vertical,\n * border-radius: 8px, border: 1px solid #D9D9D9\n *\n * Header (Frame 12): vertical, gap: 32\n * Row (Frame 20): horizontal, space-between, center\n * \"Agent Lift Analysis\" — 15px/700/#2E3236, lh=120%\n * Right (Frame 18): horizontal, gap: 8, center\n * \"vs. Average Agent:\" — 13px/400/#2E3236, lh=120%\n * \"+4.3pp\" — 14px/700/#2E3236, lh=120%\n * Divider: border-left 1px #D9D9D9, padding-left: 8\n * ThumbsUp 14x14 + \"Positive\" 13px/700/#2E3236\n *\n * Metrics (Frame 15): horizontal, gap: 24, align: bottom\n * Col 1 (Frame 8): vertical, gap: 16, center\n * \"94%\" — 28px/400/#808183, lh=120%\n * Labels: vertical, gap: 8\n * \"Expected Outcome\" — 13px/400/#2E3236\n * \"Based on call type & difficulty\" — 13px/400/#808183\n * Plus icon: 16x16, fill=#2E3236, radius: 24, white stroke\n * Col 2 (Frame 9): vertical, gap: 16, pad-left: 24, border-left: 1px #D9D9D9\n * \"-11.0pp\" — 28px/400/#808183\n * \"Agent Impact\" — 13px/400/#2E3236\n * \"Behavior-driven change\" — 13px/400/#808183\n * Col 3 (Frame 7): vertical, gap: 16, pad-left: 24, border-left: 1px #D9D9D9\n * \"83%\" — 28px/400/#2E3236 (highlighted)\n * \"Predicted Outcome\" — 13px/700/#2E3236\n * \"With agent behaviors\" — 13px/400/#808183\n *\n * Key Drivers (Frame 13): vertical, gap: 4\n * \"Key Drivers\" — 12px/700/#2E3236, lh=120%\n * Chips (Frame 16): horizontal, gap: 4\n * Each: bg=#FFF, pad=8, radius=4, border 1px #D9D9D9\n * Text: 12px/400/#2E3236, lh=120%\n */\n\nconst COLORS = {\n strong: 'var(--Grey-Strong, #2E3236)',\n muted: 'var(--Grey-Muted, #808183)',\n absent: 'var(--Grey-absent, #D9D9D9)',\n white: 'var(--Grey-White, #FFF)',\n cardBg: 'var(--surface-warm-40, rgba(243, 241, 229, 0.40))',\n};\n\nconst LH = 1.2;\nconst MAX_VISIBLE_DRIVERS = 3;\n\nconst fmtPct = (v) => (v != null ? Math.round(v * 100) + '%' : '\\u2014');\n\nconst fmtPp = (v) => {\n if (v == null) return '\\u2014';\n const pp = (v * 100).toFixed(1);\n return v > 0 ? `+${pp}pp` : `${pp}pp`;\n};\n\nconst UpdatedInteractionScores = ({ outcomeLift, driverLabels = [] }) => {\n if (!outcomeLift || outcomeLift.lift == null) return null;\n\n const pExpected = outcomeLift.p_expected;\n const pFull = outcomeLift.p_full;\n const liftRaw =\n outcomeLift.lift_raw ??\n (pFull != null && pExpected != null ? pFull - pExpected : null);\n const liftRecentered = outcomeLift.lift;\n\n const liftBand = outcomeLift.interpretation?.lift_band\n ? outcomeLift.interpretation.lift_band.replace(/_/g, ' ')\n : liftRecentered >= 0\n ? 'Positive'\n : 'Negative';\n\n const liftBandCapitalized =\n liftBand.charAt(0).toUpperCase() + liftBand.slice(1);\n\n const isNegativeBand = /negative/i.test(liftBand);\n const LiftIcon = isNegativeBand ? ThumbsDown : ThumbsUp;\n\n const visibleDrivers = driverLabels.slice(0, MAX_VISIBLE_DRIVERS);\n const overflowCount = driverLabels.length - MAX_VISIBLE_DRIVERS;\n\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n padding: 24,\n gap: 24,\n borderRadius: 8,\n border: `1px solid ${COLORS.absent}`,\n background: COLORS.cardBg,\n alignSelf: 'stretch',\n }}\n >\n {/* Frame 12: Header + Metrics — vertical, gap: 32 */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: 32 }}>\n\n {/* Frame 20: Title row — horizontal, space-between, center */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 24,\n alignSelf: 'stretch',\n }}\n >\n <span\n style={{\n fontSize: 15,\n fontWeight: 600,\n color: COLORS.strong,\n fontFamily: 'var(--font-sans)',\n lineHeight: LH,\n }}\n >\n Agent Lift Analysis\n </span>\n\n {/* Frame 18: right meta — horizontal, gap: 8, center */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n fontFamily: 'var(--font-sans)',\n }}\n >\n <span style={{ fontSize: 13, fontWeight: 400, color: COLORS.strong, lineHeight: LH }}>\n vs. Average Agent:\n </span>\n {/* Frame 19: value */}\n <span style={{ fontSize: 14, fontWeight: 600, color: COLORS.strong, lineHeight: LH }}>\n {fmtPp(liftRecentered)}\n </span>\n {/* Frame 21: divider + thumbsup + band */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n paddingLeft: 8,\n borderLeft: `1px solid ${COLORS.absent}`,\n }}\n >\n <LiftIcon size={14} color={COLORS.strong} />\n <span style={{ fontSize: 13, fontWeight: 600, color: COLORS.strong, lineHeight: LH }}>\n {liftBandCapitalized}\n </span>\n </div>\n </div>\n </div>\n\n {/* Frame 15: Metrics row — horizontal, gap: 24 */}\n <div\n style={{\n display: 'flex',\n gap: 24,\n }}\n >\n {/* Frame 8: Expected Outcome — flex: 1, equal width */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: 16, alignItems: 'flex-start', flex: 1, minWidth: 0 }}>\n <span style={{ fontSize: 28, fontWeight: 400, color: COLORS.muted, fontFamily: 'var(--font-sans)', lineHeight: LH }}>\n {fmtPct(pExpected)}\n </span>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8, alignItems: 'flex-start', minHeight: 48 }}>\n <span style={{ fontSize: 13, fontWeight: 400, color: COLORS.strong, fontFamily: 'var(--font-sans)', lineHeight: LH, whiteSpace: 'nowrap' }}>\n Expected Outcome\n </span>\n <span style={{ fontSize: 13, fontWeight: 400, color: COLORS.muted, fontFamily: 'var(--font-sans)', lineHeight: LH, textAlign: 'left' }}>\n Based on call type & difficulty\n </span>\n </div>\n </div>\n\n {/* Frame 9: Agent Impact — flex: 1, equal width, border-left */}\n <div style={{\n display: 'flex', flexDirection: 'column', gap: 16, alignItems: 'flex-start',\n paddingLeft: 24, borderLeft: `1px solid ${COLORS.absent}`, flex: 1, minWidth: 0,\n }}>\n <span style={{ fontSize: 28, fontWeight: 400, color: COLORS.muted, fontFamily: 'var(--font-sans)', lineHeight: LH }}>\n {fmtPp(liftRaw)}\n </span>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8, alignItems: 'flex-start', minHeight: 48 }}>\n <span style={{ fontSize: 13, fontWeight: 400, color: COLORS.strong, fontFamily: 'var(--font-sans)', lineHeight: LH, whiteSpace: 'nowrap' }}>\n Agent Impact\n </span>\n <span style={{ fontSize: 13, fontWeight: 400, color: COLORS.muted, fontFamily: 'var(--font-sans)', lineHeight: LH, textAlign: 'left' }}>\n Behavior-driven change\n </span>\n </div>\n </div>\n\n {/* Frame 7: Predicted Outcome — flex: 1, equal width, border-left */}\n <div style={{\n display: 'flex', flexDirection: 'column', gap: 16, alignItems: 'flex-start',\n paddingLeft: 24, borderLeft: `1px solid ${COLORS.absent}`, flex: 1, minWidth: 0,\n }}>\n <span style={{ fontSize: 28, fontWeight: 400, color: COLORS.strong, fontFamily: 'var(--font-sans)', lineHeight: LH }}>\n {fmtPct(pFull)}\n </span>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8, alignItems: 'flex-start', minHeight: 48 }}>\n <span style={{ fontSize: 13, fontWeight: 600, color: COLORS.strong, fontFamily: 'var(--font-sans)', lineHeight: LH, whiteSpace: 'nowrap' }}>\n Predicted Outcome\n </span>\n <span style={{ fontSize: 13, fontWeight: 400, color: COLORS.muted, fontFamily: 'var(--font-sans)', lineHeight: LH, textAlign: 'left' }}>\n With agent behaviors\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Frame 13: Key Drivers — vertical, gap: 4 */}\n {driverLabels.length > 0 && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4, alignSelf: 'stretch' }}>\n <span\n style={{\n fontSize: 12,\n fontWeight: 600,\n color: COLORS.strong,\n fontFamily: 'var(--font-sans)',\n lineHeight: LH,\n }}\n >\n Key Drivers\n </span>\n {/* Frame 16: chips — horizontal, gap: 4 */}\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>\n {visibleDrivers.map((label, i) => (\n <div\n key={i}\n style={{\n display: 'flex',\n padding: 8,\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 4,\n border: `1px solid ${COLORS.absent}`,\n background: COLORS.white,\n }}\n >\n <span\n style={{\n fontSize: 12,\n fontWeight: 400,\n color: COLORS.strong,\n fontFamily: 'var(--font-sans)',\n lineHeight: LH,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n maxWidth: 200,\n }}\n >\n {label}\n </span>\n </div>\n ))}\n {overflowCount > 0 && (\n <div\n style={{\n display: 'flex',\n padding: 8,\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 4,\n border: `1px solid ${COLORS.absent}`,\n background: COLORS.white,\n }}\n >\n <span\n style={{\n fontSize: 12,\n fontWeight: 400,\n color: COLORS.strong,\n fontFamily: 'var(--font-sans)',\n lineHeight: LH,\n whiteSpace: 'nowrap',\n }}\n >\n + {overflowCount}\n </span>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default UpdatedInteractionScores;\n","import { useState } from 'react';\nimport { ChevronDown, ChevronUp, PlayCircle, PauseCircle, FileSignal, ScrollText } from 'lucide-react';\n\n/* Hover circle wrapper for icons */\nconst HoverIcon = ({ children, size = 28, onClick, title }) => {\n const [hovered, setHovered] = useState(false);\n return (\n <div\n title={title}\n onClick={onClick}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: size,\n height: size,\n borderRadius: 9999,\n background: hovered ? 'var(--surface-hover, #F3F7F7)' : 'transparent',\n cursor: 'pointer',\n flexShrink: 0,\n transition: 'background 0.15s',\n }}\n >\n {children}\n </div>\n );\n};\n\n/*\n * Figma node: 222-672 (Signals accordion)\n *\n * Header: FileSignal icon in #F3F7F7 circle + \"Signals\" 15px/500 + \"N Signals Detected\" 14px/500\n *\n * Accordion Title (collapsed): horizontal, gap: 12, pad: 8 0, border-bottom: 1px #D9D9D9\n * Name: 14px/600/#0B0A0A, lh: 171%\n * Chevron: 20x20, stroke #767473\n *\n * Accordion Body (reason): horizontal, gap: 12, pad: 8 0, space-between\n * Reason: 14px/400/#767473, lh: 150%\n * Right: ScrollText icon 16x16 #808183 + time 13px/400/#808183\n *\n * Evidence (Frame 39): horizontal, gap: 8, pad: 8 0\n * Play circle: ~17px, stroke #808183\n * Quote: 13px/400/#2E3236, lh: 120%\n */\n\nconst UpdatedInteractionSignals = ({\n signals = { signals: [], present_count: 0, total_signals_evaluated: 0 },\n expandedSignals = new Set(),\n toggleSignal = () => {},\n playEvidence = () => {},\n highlightTurns = () => {},\n onShowInTranscript = () => {},\n timelinePlaying = false,\n currentTimeSeconds = 0,\n}) => {\n const signalList = signals?.signals ?? [];\n const presentCount = signals?.present_count ?? signalList.length;\n\n const fmtMs = (ms) => {\n const minutes = Math.floor(ms / 60000);\n const seconds = Math.floor((ms % 60000) / 1000);\n return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n };\n\n const isEvPlaying = (ev) =>\n timelinePlaying &&\n ev.start_ms != null &&\n currentTimeSeconds * 1000 >= ev.start_ms &&\n currentTimeSeconds * 1000 <= (ev.end_ms ?? ev.start_ms + 5000);\n\n return (\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n alignSelf: 'stretch',\n width: '100%',\n gap: 16,\n }}>\n {/* ── Header: icon + \"Signals\" + count ── */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: 16,\n width: '100%',\n }}>\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 34,\n height: 34,\n borderRadius: 9999,\n background: 'var(--surface-hover, #F3F7F7)',\n flexShrink: 0,\n }}>\n <FileSignal size={20} color=\"#2E3236\" strokeWidth={1.5} />\n </div>\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n flex: 1,\n }}>\n <span style={{\n fontSize: 15,\n fontWeight: 500,\n color: 'var(--Grey-Strong, #2E3236)',\n }}>\n Signals\n </span>\n <span style={{\n fontSize: 14,\n fontWeight: 500,\n color: 'var(--Grey-Strong, #2E3236)',\n }}>\n {presentCount} Signals Detected\n </span>\n </div>\n </div>\n\n {/* ── Signal list (accordion) ── */}\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n alignSelf: 'stretch',\n background: 'var(--Grey-White, #FFF)',\n gap: 8,\n }}>\n {signalList.length === 0 && (\n <div style={{\n padding: '8px 0',\n fontSize: 14,\n color: 'var(--Grey-Muted, #808183)',\n }}>\n No signals detected.\n </div>\n )}\n\n {signalList.map((signal, idx) => {\n const key = signal.key ?? signal.id ?? idx;\n const isExpanded = expandedSignals.has(key);\n const obsCount = signal.observations?.length ?? 0;\n\n return (\n <div\n key={key}\n id={`signal-${key}`}\n style={{\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n gap: 8,\n }}\n >\n {/* ── Accordion Title — signal row ── */}\n <button\n onClick={() => toggleSignal(key)}\n style={{\n display: 'flex',\n padding: '8px 0',\n alignItems: 'center',\n gap: 12,\n alignSelf: 'stretch',\n width: '100%',\n background: 'none',\n border: 'none',\n borderBottom: '1px solid var(--Grey-absent, #D9D9D9)',\n cursor: 'pointer',\n }}\n >\n <span style={{\n flex: 1,\n textAlign: 'left',\n fontSize: 14,\n fontWeight: 600,\n color: 'var(--text-dark, #0B0A0A)',\n lineHeight: 1.71,\n }}>\n {signal.display_name || signal.key?.replace(/_/g, ' ')}\n {obsCount > 0 && (\n <span style={{\n fontWeight: 600,\n color: 'var(--text-dark, #0B0A0A)',\n marginLeft: 6,\n }}>\n ({obsCount})\n </span>\n )}\n </span>\n {isExpanded ? (\n <ChevronUp size={20} color=\"#767473\" />\n ) : (\n <ChevronDown size={20} color=\"#767473\" />\n )}\n </button>\n\n {/* ── Expanded: Observations ── */}\n {isExpanded && signal.observations?.length > 0 && (\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n alignSelf: 'stretch',\n gap: 0,\n }}>\n {signal.observations.map((obs, obsIdx) => (\n <div\n key={obs.key ?? obsIdx}\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignSelf: 'stretch',\n gap: 8,\n }}\n >\n {/* Accordion Body — reason + timestamp */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: 12,\n padding: '8px 0',\n justifyContent: 'space-between',\n }}>\n <span style={{\n flex: 1,\n fontSize: 14,\n fontWeight: 400,\n color: 'var(--text-subtle-warm, #767473)',\n lineHeight: 1.5,\n }}>\n {obs.reason || obs.explanation}\n </span>\n {obs.evidence?.[0]?.start_ms != null && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n flexShrink: 0,\n }}\n >\n <HoverIcon\n size={28}\n title=\"Show in transcript\"\n onClick={(e) => {\n e.stopPropagation();\n onShowInTranscript(obs.evidence[0].start_ms);\n }}\n >\n <ScrollText size={16} color=\"#808183\" strokeWidth={1.5} />\n </HoverIcon>\n <span style={{\n fontSize: 13,\n fontWeight: 400,\n color: 'var(--Grey-Muted, #808183)',\n lineHeight: 1.2,\n whiteSpace: 'nowrap',\n }}>\n {fmtMs(obs.evidence[0].start_ms)}\n </span>\n </div>\n )}\n </div>\n\n {/* Evidence quotes — Frame 39 */}\n {obs.evidence?.map((ev, evIdx) => {\n const hasTimestamps = ev.start_ms != null && ev.end_ms != null;\n return ev.text && (\n <div\n key={evIdx}\n onClick={(e) => {\n e.stopPropagation();\n if (hasTimestamps) playEvidence(ev);\n }}\n onMouseEnter={() => highlightTurns(ev.turn_ids ?? [])}\n onMouseLeave={() => highlightTurns([])}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '8px 0',\n cursor: hasTimestamps ? 'pointer' : 'default',\n }}\n >\n {hasTimestamps && (\n <HoverIcon size={28}>\n {isEvPlaying(ev) ? (\n <PauseCircle\n size={17}\n color=\"var(--Grey-Muted, #808183)\"\n strokeWidth={1.5}\n />\n ) : (\n <PlayCircle\n size={17}\n color=\"var(--Grey-Muted, #808183)\"\n strokeWidth={1}\n />\n )}\n </HoverIcon>\n )}\n <span style={{\n fontSize: 13,\n fontWeight: 400,\n color: 'var(--Grey-Strong, #2E3236)',\n lineHeight: 1.2,\n }}>\n “{ev.text}”\n </span>\n </div>\n );\n })}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n\nexport default UpdatedInteractionSignals;\n","import React, { useState, useRef } from 'react';\nimport { Info } from 'lucide-react';\n\n/*\n * Figma node: 270-6494 (Compass Score card)\n *\n * Container: padding: 24px, border-radius: 8px, border: 1px solid #D9D9D9,\n * background: #FFF, gap: 24px, vertical\n *\n * Title: \"Compass Score\" 15px/700/#2E3236\n * Description: 14px/400/#808183\n *\n * Content: horizontal, gap: 48, center both axes\n * Left: Meter 243x200 (SVG from Figma export)\n * Right: Legends vertical, gap: 8, centered\n * Each: label 12px/400/#2E3236 + Info 14px stroke=#ACACAD\n * Score bar: 5 segments 22x6, gap: 2, filled=#2E3236, empty=#E3E1D7\n */\n\nconst COLORS = {\n strong: 'var(--Grey-Strong, #2E3236)',\n muted: 'var(--Grey-Muted, #808183)',\n absent: 'var(--Grey-absent, #D9D9D9)',\n white: 'var(--Grey-White, #FFF)',\n accent: 'var(--rail-orange, #C98A5A)',\n track: 'var(--rail-surface-2, #E3E1D7)',\n infoIcon: 'var(--color-input-border, #ACACAD)',\n};\n\n// Gauge using stroke-based semi-circle arcs — matching Figma node 270-6499\n// Compass score scale: 0.5 to 5.0 (supports 0.5 increments)\n// Visual scale is always 5 segments, where each segment represents 1 point.\nconst GaugeMeter = ({ score = 4, minScore = 0, maxScore = 5 }) => {\n const svgW = 243;\n const svgH = 130;\n const cx = svgW / 2;\n const cy = svgH - 7;\n const r = 85; // mid-radius of the arc\n const sw = 30; // stroke-width (thickness of the arc band)\n const totalSeg = 5; // always render 5 visual steps\n const numericScore = Number(score);\n const clampedScore = Number.isFinite(numericScore)\n ? Math.min(Math.max(numericScore, minScore), maxScore)\n : minScore;\n const filledUnits = maxScore > minScore\n ? ((clampedScore - minScore) / (maxScore - minScore)) * totalSeg\n : 0;\n const segDeg = 180 / totalSeg; // 36° per segment\n\n // Convert polar (degrees, 0°=right, CCW) to SVG x,y (Y-down)\n const toXY = (angleDeg) => {\n const rad = (angleDeg * Math.PI) / 180;\n return {\n x: cx + r * Math.cos(rad),\n y: cy - r * Math.sin(rad),\n };\n };\n\n // SVG arc from startDeg to endDeg (both in math convention: 0=right, 180=left)\n // We draw clockwise in SVG (sweep-flag=1) from higher angle to lower angle\n const strokeArc = (fromDeg, toDeg) => {\n const s = toXY(fromDeg);\n const e = toXY(toDeg);\n const large = (fromDeg - toDeg) > 180 ? 1 : 0;\n return `M ${s.x} ${s.y} A ${r} ${r} 0 ${large} 1 ${e.x} ${e.y}`;\n };\n\n const gap = 2; // degrees gap between segments\n\n return (\n <svg width=\"100%\" viewBox={`0 0 ${svgW} ${svgH}`} fill=\"none\" style={{ maxWidth: svgW }}>\n {/* Segments from left (180°) to right (0°) */}\n {Array.from({ length: totalSeg }, (_, i) => {\n const fromA = 180 - i * segDeg - (i > 0 ? gap / 2 : 0);\n const toA = 180 - (i + 1) * segDeg + (i < totalSeg - 1 ? gap / 2 : 0);\n const segmentFill = Math.max(0, Math.min(1, filledUnits - i));\n const pathD = strokeArc(fromA, toA);\n return (\n <g key={i}>\n {/* Base track segment */}\n <path\n d={pathD}\n stroke={COLORS.track}\n strokeWidth={sw}\n strokeLinecap=\"butt\"\n fill=\"none\"\n />\n {/* Filled overlay can be full or half (or any partial) */}\n {segmentFill > 0 && (\n <path\n d={pathD}\n stroke={COLORS.strong}\n strokeWidth={sw}\n strokeLinecap=\"butt\"\n fill=\"none\"\n pathLength={1}\n strokeDasharray={`${segmentFill} 1`}\n />\n )}\n </g>\n );\n })}\n </svg>\n );\n};\n\nconst ScoreBar = ({ value = 0, maxValue = 5 }) => {\n const numericValue = Number(value);\n const clampedValue = Number.isFinite(numericValue)\n ? Math.min(Math.max(numericValue, 0), maxValue)\n : 0;\n\n return (\n <div style={{ display: 'flex', gap: 2 }}>\n {Array.from({ length: maxValue }, (_, i) => {\n const segmentFill = Math.max(0, Math.min(1, clampedValue - i));\n return (\n <div\n key={i}\n style={{\n width: 22,\n height: 6,\n borderRadius: 1,\n background: COLORS.track,\n overflow: 'hidden',\n }}\n >\n {segmentFill > 0 && (\n <div\n style={{\n width: `${segmentFill * 100}%`,\n height: '100%',\n background: COLORS.strong,\n }}\n />\n )}\n </div>\n );\n })}\n </div>\n );\n};\n\nconst LEGEND_TOOLTIPS = {\n 'CSAT': 'Predicted Customer Satisfaction',\n 'Resolution': 'Predicted Resolution: was the issue fully resolved?',\n 'Process Adherence': 'Process Adherence: Did the agent follow procedures?',\n 'Communication': 'Predicted Communication Quality: Clarity, Empathy, Professionalism',\n};\n\nconst InfoTooltip = ({ text, children }) => {\n const [show, setShow] = useState(false);\n const ref = useRef(null);\n const [pos, setPos] = useState({ top: 0, left: 0 });\n\n const handleEnter = () => {\n if (ref.current) {\n const rect = ref.current.getBoundingClientRect();\n setPos({\n top: rect.top - 8,\n left: rect.left + rect.width / 2,\n });\n }\n setShow(true);\n };\n\n return (\n <div\n ref={ref}\n style={{ position: 'relative', display: 'inline-flex' }}\n onMouseEnter={handleEnter}\n onMouseLeave={() => setShow(false)}\n >\n {children}\n {show && (\n <div style={{\n position: 'fixed',\n top: pos.top,\n left: pos.left,\n transform: 'translate(-50%, -100%)',\n display: 'flex',\n width: 'max-content',\n maxWidth: 300,\n padding: 10,\n alignItems: 'center',\n borderRadius: 4,\n border: '1px solid var(--Grey-absent, #D9D9D9)',\n background: 'var(--Grey-Strong, #2E3236)',\n zIndex: 9999,\n pointerEvents: 'none',\n }}>\n <span style={{\n color: '#FFF',\n fontSize: 12,\n fontWeight: 400,\n lineHeight: '140%',\n }}>\n {text}\n </span>\n </div>\n )}\n </div>\n );\n};\n\nconst LegendItem = ({ label, value = 0, maxValue = 5 }) => (\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 8,\n padding: 8,\n alignItems: 'flex-start',\n }}>\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n }}>\n <span style={{\n fontSize: 12,\n fontWeight: 400,\n color: COLORS.strong,\n fontFamily: 'var(--font-sans)',\n lineHeight: 'normal',\n }}>\n {label}\n </span>\n <InfoTooltip text={LEGEND_TOOLTIPS[label] || label}>\n <Info size={14} color={COLORS.infoIcon} strokeWidth={1} style={{ cursor: 'pointer' }} />\n </InfoTooltip>\n </div>\n <ScoreBar value={value} maxValue={maxValue} />\n </div>\n);\n\nconst UpdatedCompassScore = ({\n score = 4,\n minScore = 0,\n maxScore = 5,\n predictedScore = 4,\n predictedLabel = 'Predicted Objective',\n description = '',\n legends = [\n { label: 'CSAT', value: 3 },\n { label: 'Resolution', value: 4 },\n { label: 'Process Adherence', value: 5 },\n { label: 'Communication', value: 3 },\n ],\n}) => {\n const numericScore = Number(score);\n const clampedScore = Number.isFinite(numericScore)\n ? Math.min(Math.max(numericScore, minScore), maxScore)\n : minScore;\n const displayScore = clampedScore.toFixed(1);\n\n return (\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n padding: 24,\n borderRadius: 8,\n border: `1px solid ${COLORS.absent}`,\n background: COLORS.white,\n alignSelf: 'stretch',\n flex: 1,\n gap: 24,\n }}>\n {/* Section Title — left-aligned, vertical, gap: 8 */}\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 8,\n }}>\n <span style={{\n fontSize: 15,\n fontWeight: 600,\n color: COLORS.strong,\n fontFamily: 'var(--font-sans)',\n lineHeight: 1.2,\n }}>\n Interaction Quality\n </span>\n <span style={{\n fontSize: 14,\n fontWeight: 400,\n color: COLORS.muted,\n fontFamily: 'var(--font-sans)',\n lineHeight: 'normal',\n }}>\n {description}\n </span>\n </div>\n\n {/* Content: Meter (left) + Legends (right) */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 24,\n flex: 1,\n overflow: 'hidden',\n }}>\n {/* Left: Gauge + Pin + Score number */}\n <div style={{\n position: 'relative',\n maxWidth: 243,\n minWidth: 160,\n flex: '0 1 243px',\n flexDirection: 'column',\n alignItems: 'center',\n display: 'flex',\n }}>\n <GaugeMeter score={score} minScore={minScore} maxScore={maxScore} />\n\n {/* Compass pin — centered below gauge, needle rotates to point at score */}\n {(() => {\n // Pin sits at gauge center; needle rotates from 180° (score=0) to 0° (score=max)\n const pct = maxScore > minScore ? (clampedScore - minScore) / (maxScore - minScore) : 0;\n // SVG pin's default needle points to top-right (~45°)\n // We need: score=0 → needle points left (180°), score=max → needle points right (0°)\n // Target angle on gauge: 180 - pct*180\n // Pin default orientation: needle at ~45° from top → offset is 45\n // Rotation needed: -(targetAngle - 45) to align needle with gauge position\n const targetAngle = 180 - pct * 180;\n const rotateDeg = -(targetAngle - 45);\n return (\n <svg\n width=\"34\" height=\"35\" viewBox=\"0 0 34 35\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{\n marginTop: -24,\n transform: `rotate(${rotateDeg}deg)`,\n transformOrigin: 'center center',\n }}\n >\n <path d=\"M16 25.2169C19.958 25.2169 23.1667 22.0083 23.1667 18.0503C23.1667 14.0922 19.958 10.8836 16 10.8836C12.042 10.8836 8.83334 14.0922 8.83334 18.0503C8.83334 22.0083 12.042 25.2169 16 25.2169Z\" fill=\"var(--rail-orange, #C98A5A)\" />\n <path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"M30.4791 11.2328L33.4351 0L21.6888 3.09113C19.9212 2.41855 18.0036 2.05025 16 2.05025C7.16344 2.05025 0 9.2137 0 18.0503C0 26.8868 7.16344 34.0503 16 34.0503C24.8366 34.0503 32 26.8868 32 18.0503C32 15.6119 31.4546 13.301 30.4791 11.2328ZM16 30.5503C22.9036 30.5503 28.5 24.9538 28.5 18.0503C28.5 11.1467 22.9036 5.55025 16 5.55025C9.09644 5.55025 3.5 11.1467 3.5 18.0503C3.5 24.9538 9.09644 30.5503 16 30.5503Z\" fill=\"var(--rail-orange, #C98A5A)\" />\n </svg>\n );\n })()}\n\n {/* Score number below gauge */}\n <div style={{\n fontSize: 28,\n fontWeight: 400,\n color: COLORS.strong,\n fontFamily: 'var(--font-sans)',\n lineHeight: 1,\n textAlign: 'center',\n marginTop: 8,\n }}>\n {displayScore}\n </div>\n <div style={{\n fontSize: 15,\n fontWeight: 500,\n color: COLORS.strong,\n fontFamily: 'var(--font-sans)',\n lineHeight: 1.2,\n textAlign: 'center',\n marginTop: 8,\n }}>\n Compass Score\n </div>\n </div>\n\n {/* Right: Predicted Score + Legends */}\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 8,\n alignItems: 'flex-start',\n justifyContent: 'center',\n flex: 1,\n }}>\n {/* Overall Score title */}\n <div style={{\n fontSize: 15,\n fontWeight: 500,\n color: COLORS.strong,\n fontFamily: 'var(--font-sans)',\n lineHeight: 1.2,\n textAlign: 'left',\n }}>\n Interaction Quality Index\n </div>\n\n {/* Divider */}\n <div style={{\n width: '100%',\n height: 1,\n background: COLORS.absent,\n }} />\n\n {/* Legend items */}\n {legends.map((legend, i) => (\n <LegendItem\n key={i}\n label={legend.label}\n value={legend.value}\n />\n ))}\n </div>\n </div>\n </div>\n );\n};\n\nexport default UpdatedCompassScore;\n","\"use client\";\n\nimport React, { useState, useRef, useMemo, useEffect } from \"react\";\nimport {\n MessagesSquare,\n Ellipsis,\n CircleCheck,\n Check,\n CornerDownRight,\n Info,\n X,\n} from \"lucide-react\";\n\n/* ─── helpers ─── */\n\nconst roleColorMap = (role) => {\n if (!role) return null;\n const normalized = String(role).trim().toLowerCase();\n const roleTokens = normalized.split(/[^a-z]+/).filter(Boolean);\n if (roleTokens.includes(\"supervisor\")) return \"var(--rail-compliance, #C98A5A)\";\n if (\n roleTokens.includes(\"admin\") ||\n roleTokens.includes(\"administrator\") ||\n roleTokens.includes(\"superadmin\")\n ) {\n return \"var(--rail-discovery, #5E88B0)\";\n }\n if (roleTokens.includes(\"agent\")) return \"var(--rail-outcome, #6B7C93)\";\n return null;\n};\n\nconst extractRoleValue = (user) => {\n if (!user) return null;\n const directRole =\n user.role ??\n user.userRole ??\n user.user_role ??\n user.author_role ??\n user.roleName ??\n user.role_name ??\n user.userType ??\n user.user_type ??\n user.type;\n\n if (typeof directRole === \"string\") return directRole;\n if (Array.isArray(directRole)) return directRole.join(\" \");\n if (directRole && typeof directRole === \"object\") {\n return directRole.name || directRole.value || directRole.label || null;\n }\n\n const nestedRole =\n user.user?.role ??\n user.user?.userRole ??\n user.user?.user_role ??\n user.profile?.role ??\n user.profile?.userRole ??\n user.profile?.user_role;\n\n if (typeof nestedRole === \"string\") return nestedRole;\n if (Array.isArray(nestedRole)) return nestedRole.join(\" \");\n if (nestedRole && typeof nestedRole === \"object\") {\n return nestedRole.name || nestedRole.value || nestedRole.label || null;\n }\n\n return null;\n};\n\n/** Role-mapped color first so stale `color` from auth/session does not override role (matches thread intent). */\nconst resolveCurrentUserAvatarColor = (user) => {\n if (!user) return \"#6B7C93\";\n const role = extractRoleValue(user);\n return roleColorMap(role) || user.color || \"#6B7C93\";\n};\n\nconst getInitials = (name) =>\n (name || \"\")\n .split(\" \")\n .map((w) => w[0])\n .join(\"\")\n .toUpperCase() || \"U\";\n\nconst isWithinEditWindow = (value) => {\n if (!value) return true; // optimistic/new comments are editable\n if (value === \"Just now\") return true;\n if (/^\\d{4}-\\d{2}-\\d{2}T/.test(value)) {\n try {\n const utcValue = /Z$|[+-]\\d{2}:\\d{2}$/.test(value) ? value : value + \"Z\";\n const d = new Date(utcValue);\n if (Number.isNaN(d.getTime())) return false;\n return (Date.now() - d.getTime()) < 15 * 60 * 1000;\n } catch { return false; }\n }\n // Parse relative timestamps like \"5 min\", \"1 h\", \"2 days\"\n const minMatch = value.match(/^(\\d+)\\s*min/);\n if (minMatch) return parseInt(minMatch[1], 10) < 15;\n // Anything in hours or days is beyond 15 min\n if (/\\d+\\s*h/.test(value) || /\\d+\\s*day/.test(value)) return false;\n return true;\n};\n\nconst formatTimestamp = (value) => {\n if (!value) return \"\";\n if (!/^\\d{4}-\\d{2}-\\d{2}T/.test(value)) return value;\n try {\n // Append Z if missing so timestamp is parsed as UTC\n const utcValue = /Z$|[+-]\\d{2}:\\d{2}$/.test(value) ? value : value + \"Z\";\n const d = new Date(utcValue);\n if (Number.isNaN(d.getTime())) return value;\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffMin = Math.floor(diffMs / 60000);\n const diffHr = Math.floor(diffMs / 3600000);\n if (diffMin < 1) return \"Just now\";\n if (diffMin < 60) return `${diffMin} min`;\n if (diffHr < 24) return `${diffHr} h`;\n const diffDays = Math.floor(diffHr / 24);\n if (diffDays === 1) return \"1 day\";\n return `${diffDays} days`;\n } catch {\n return value;\n }\n};\n\n/* ─── Avatar (36 × 36) ─── */\nconst Avatar = ({ name, initials, color, avatar, size = 36 }) => {\n if (avatar) {\n return (\n <img\n src={avatar}\n alt={name}\n style={{\n width: size,\n height: size,\n borderRadius: \"50%\",\n objectFit: \"cover\",\n flexShrink: 0,\n }}\n />\n );\n }\n return (\n <div\n style={{\n width: size,\n height: size,\n borderRadius: \"50%\",\n background: color || \"#6B7C93\",\n color: \"#FFF\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: size <= 32 ? \"10px\" : \"11px\",\n fontWeight: 650,\n flexShrink: 0,\n fontFamily: \"var(--default-font-family)\",\n letterSpacing: \"0.02em\",\n }}\n title={name}\n >\n {initials || getInitials(name)}\n </div>\n );\n};\n\n/* ============================================\n COMMENT ROW — Figma node 593-1135 (top-level)\n display: flex\n width: 552px\n align-items: flex-start\n gap: 16px\n\n Reply row — Figma node 593-2042\n display: flex\n padding-left: 48px\n align-items: flex-start\n gap: 16px\n ============================================ */\nconst CommentBubble = ({\n comment,\n isReply = false,\n isConsecutive = false,\n onReply,\n onSendReply,\n onEdit,\n onDelete,\n onMenuClick,\n showReply = true,\n}) => {\n const [hovered, setHovered] = useState(false);\n const [menuOpen, setMenuOpen] = useState(false);\n const [replyOpen, setReplyOpen] = useState(false);\n const [replyValue, setReplyValue] = useState(\"\");\n const [editOpen, setEditOpen] = useState(false);\n const [editValue, setEditValue] = useState(\"\");\n const [confirmDelete, setConfirmDelete] = useState(false);\n const menuRef = useRef(null);\n const replyRef = useRef(null);\n const editRef = useRef(null);\n const author = comment.author || {};\n const authorName = author.name || comment.author_name || \"Unknown\";\n const initials = author.initials || getInitials(authorName);\n const role = author.role || comment.author_role;\n const avatarColor = author.color || roleColorMap(role) || \"#6B7C93\";\n const avatarImg = author.avatar || comment.avatar;\n const rawTimestamp = comment.timestamp || comment.created_at;\n const timestamp = formatTimestamp(rawTimestamp);\n const canEdit = isWithinEditWindow(rawTimestamp);\n const isEdited = Boolean(comment.isEdited || comment.is_edited || comment.edited);\n\n const paragraphs = Array.isArray(comment.content)\n ? comment.content\n : [comment.content || comment.text || \"\"];\n\n // Close menu on outside click\n React.useEffect(() => {\n if (!menuOpen) return;\n const handler = (e) => {\n if (menuRef.current && !menuRef.current.contains(e.target)) setMenuOpen(false);\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [menuOpen]);\n\n // Auto-resize reply textarea\n React.useEffect(() => {\n const ta = replyRef.current;\n if (!ta) return;\n ta.style.height = \"auto\";\n const max = 140;\n ta.style.height = Math.min(ta.scrollHeight, max) + \"px\";\n ta.style.overflowY = ta.scrollHeight > max ? \"auto\" : \"hidden\";\n }, [replyValue, replyOpen]);\n\n // Auto-resize edit textarea\n React.useEffect(() => {\n const ta = editRef.current;\n if (!ta) return;\n ta.style.height = \"auto\";\n const max = 140;\n ta.style.height = Math.min(ta.scrollHeight, max) + \"px\";\n ta.style.overflowY = ta.scrollHeight > max ? \"auto\" : \"hidden\";\n }, [editValue, editOpen]);\n\n return (\n <div\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n style={{\n display: \"flex\",\n paddingLeft: isReply ? 48 : 0,\n alignItems: \"flex-start\",\n gap: 16,\n paddingTop: isConsecutive ? 0 : 8,\n paddingBottom: 8,\n }}\n >\n {/* Avatar — 36 × 36 (hidden for consecutive messages, keep space) */}\n {isConsecutive ? (\n <div style={{ width: 36, flexShrink: 0 }} />\n ) : (\n <Avatar\n name={authorName}\n initials={initials}\n color={avatarColor}\n avatar={avatarImg}\n />\n )}\n\n {/* Content column */}\n <div style={{ flex: 1, minWidth: 0 }}>\n {/* Header row — always shows menu, name/time hidden for consecutive */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: isConsecutive ? \"flex-end\" : \"space-between\",\n marginBottom: isConsecutive ? 0 : 6,\n }}\n >\n {!isConsecutive && (\n <div style={{ display: \"flex\", alignItems: \"baseline\", gap: 8 }}>\n {/* Name — 13px / 650 / #1E2125 */}\n <span\n style={{\n fontSize: 13,\n fontWeight: 650,\n color: \"var(--text-ink, #1E2125)\",\n lineHeight: \"150%\",\n fontFamily: \"var(--default-font-family)\",\n }}\n >\n {authorName}\n </span>\n {/* Timestamp — 12px / 400 / #808183 */}\n <span\n style={{\n fontSize: 12,\n fontWeight: 400,\n color: \"var(--Grey-Muted, #808183)\",\n lineHeight: \"150%\",\n fontFamily: \"var(--default-font-family)\",\n }}\n >\n {timestamp}\n </span>\n {isEdited && (\n <span\n style={{\n fontSize: 12,\n fontWeight: 400,\n color: \"var(--Grey-Muted, #808183)\",\n lineHeight: \"150%\",\n fontFamily: \"var(--default-font-family)\",\n }}\n >\n (Edited)\n </span>\n )}\n </div>\n )}\n\n {/* Three-dot menu — Ellipsis 24×24, hover only + dropdown */}\n <div style={{ position: \"relative\" }} ref={menuRef}>\n <button\n type=\"button\"\n onClick={() => setMenuOpen((p) => !p)}\n style={{\n padding: 2,\n border: \"none\",\n background: \"transparent\",\n cursor: \"pointer\",\n borderRadius: 4,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n opacity: hovered || menuOpen ? 1 : 0,\n transition: \"opacity 0.15s\",\n flexShrink: 0,\n }}\n >\n <Ellipsis size={24} color=\"var(--Grey-Muted, #808183)\" />\n </button>\n\n {/* Dropdown — Figma node 486-4493 */}\n {menuOpen && (\n <div\n style={{\n position: \"absolute\",\n top: \"100%\",\n right: 0,\n marginTop: 4,\n display: \"flex\",\n width: 99,\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n borderRadius: 4,\n border: \"1px solid var(--Grey-absent, #D9D9D9)\",\n background: \"var(--Grey-White, #FFF)\",\n boxShadow: \"-2px 2px 2px 0 rgba(0, 0, 0, 0.25)\",\n zIndex: 50,\n overflow: \"hidden\",\n }}\n >\n {onReply && (\n <button\n type=\"button\"\n onClick={() => { setMenuOpen(false); setEditOpen(false); setReplyOpen(true); }}\n style={{\n display: \"flex\",\n width: \"100%\",\n padding: \"10px 16px\",\n alignItems: \"center\",\n border: \"none\",\n background: \"transparent\",\n cursor: \"pointer\",\n fontSize: 13,\n fontWeight: 400,\n color: \"var(--Grey-Strong, #2E3236)\",\n fontFamily: \"var(--default-font-family)\",\n lineHeight: \"150%\",\n textAlign: \"left\",\n }}\n onMouseEnter={(e) => { e.currentTarget.style.background = \"var(--surface-hover, #F3F7F7)\"; }}\n onMouseLeave={(e) => { e.currentTarget.style.background = \"transparent\"; }}\n >\n Reply\n </button>\n )}\n {onEdit && (\n <button\n type=\"button\"\n disabled={!canEdit}\n onClick={() => {\n if (!canEdit) return;\n setMenuOpen(false);\n const text = Array.isArray(comment.content)\n ? comment.content.join(\"\\n\")\n : (comment.content || comment.text || \"\");\n setEditValue(text);\n setEditOpen(true);\n setReplyOpen(false);\n }}\n style={{\n display: \"flex\",\n width: \"100%\",\n padding: \"10px 16px\",\n alignItems: \"center\",\n border: \"none\",\n background: \"transparent\",\n cursor: canEdit ? \"pointer\" : \"not-allowed\",\n fontSize: 13,\n fontWeight: 400,\n color: canEdit ? \"var(--Grey-Strong, #2E3236)\" : \"var(--Grey-Muted, #808183)\",\n fontFamily: \"var(--default-font-family)\",\n lineHeight: \"150%\",\n textAlign: \"left\",\n opacity: canEdit ? 1 : 0.5,\n }}\n onMouseEnter={(e) => { if (canEdit) e.currentTarget.style.background = \"var(--surface-hover, #F3F7F7)\"; }}\n onMouseLeave={(e) => { e.currentTarget.style.background = \"transparent\"; }}\n >\n Edit\n </button>\n )}\n {onDelete && (\n <button\n type=\"button\"\n onClick={() => { setMenuOpen(false); setConfirmDelete(true); }}\n style={{\n display: \"flex\",\n width: \"100%\",\n padding: \"10px 16px\",\n alignItems: \"center\",\n border: \"none\",\n background: \"transparent\",\n cursor: \"pointer\",\n fontSize: 13,\n fontWeight: 400,\n color: \"var(--Grey-Strong, #2E3236)\",\n fontFamily: \"var(--default-font-family)\",\n lineHeight: \"150%\",\n textAlign: \"left\",\n }}\n onMouseEnter={(e) => { e.currentTarget.style.background = \"var(--surface-hover, #F3F7F7)\"; }}\n onMouseLeave={(e) => { e.currentTarget.style.background = \"transparent\"; }}\n >\n Delete\n </button>\n )}\n </div>\n )}\n </div>\n </div>\n\n {/* Edit mode — card with editable input */}\n {editOpen ? (\n <div\n style={{\n display: \"flex\",\n width: 662,\n maxWidth: \"100%\",\n padding: \"8px 12px 12px 12px\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n alignItems: \"flex-start\",\n gap: 24,\n borderRadius: 8,\n border: \"1px solid var(--Grey-absent, #D9D9D9)\",\n background: \"var(--Grey-White, #FFF)\",\n boxSizing: \"border-box\",\n marginTop: 4,\n }}\n >\n {/* Header with author name + close */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n width: \"100%\",\n }}\n >\n <span\n style={{\n fontSize: 13,\n fontWeight: 600,\n color: \"var(--Grey-Muted, #808183)\",\n fontFamily: \"var(--default-font-family)\",\n lineHeight: \"normal\",\n }}\n >\n {\"\\u201C\"} {comment.author?.name || \"Unknown\"}\n </span>\n <button\n type=\"button\"\n onClick={() => setEditOpen(false)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: 0,\n }}\n >\n <X size={20} color=\"var(--Grey-Muted, #808183)\" />\n </button>\n </div>\n {/* Editable input + Save */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"flex-end\",\n gap: 8,\n width: \"100%\",\n }}\n >\n <textarea\n ref={editRef}\n value={editValue}\n onChange={(e) => setEditValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n if (e.metaKey || e.ctrlKey || e.shiftKey) {\n // Allow newline insertion\n return;\n }\n e.preventDefault();\n if (editValue.trim()) {\n onEdit?.({ ...comment, content: editValue.trim(), isEdited: true });\n setEditOpen(false);\n }\n }\n if (e.key === \"Escape\") { setEditOpen(false); }\n }}\n autoFocus\n rows={1}\n style={{\n flex: 1,\n padding: \"10px 12px\",\n fontSize: 13,\n fontWeight: 400,\n color: \"var(--text-ink, #1E2125)\",\n fontFamily: \"var(--default-font-family)\",\n lineHeight: \"160%\",\n border: \"none\",\n background: \"transparent\",\n outline: \"none\",\n boxSizing: \"border-box\",\n resize: \"none\",\n minHeight: 24,\n maxHeight: 140,\n overflowY: \"hidden\",\n }}\n />\n <button\n type=\"button\"\n onClick={() => {\n if (editValue.trim()) {\n onEdit?.({ ...comment, content: editValue.trim(), isEdited: true });\n setEditOpen(false);\n }\n }}\n disabled={!editValue.trim()}\n style={{\n display: \"flex\",\n padding: \"6px 16px\",\n justifyContent: \"center\",\n alignItems: \"center\",\n fontSize: 13,\n fontWeight: 600,\n color: editValue.trim()\n ? \"var(--Grey-White, #FFF)\"\n : \"var(--Grey-Muted, #808183)\",\n background: editValue.trim()\n ? \"var(--Grey-Strong, #2E3236)\"\n : \"var(--grey-light, #e9e8e8a1)\",\n border: \"none\",\n borderRadius: 6,\n cursor: editValue.trim() ? \"pointer\" : \"not-allowed\",\n fontFamily: \"var(--default-font-family)\",\n flexShrink: 0,\n transition: \"all 0.15s\",\n lineHeight: \"150%\",\n }}\n >\n Save\n </button>\n </div>\n </div>\n ) : (\n /* Message bubbles — stacked, gap: 4px, fit content */\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4, alignItems: \"flex-start\" }}>\n {paragraphs.map((paragraph, idx) => (\n <div\n key={idx}\n style={{\n fontSize: 13,\n fontWeight: 400,\n color: \"var(--text-ink, #1E2125)\",\n lineHeight: \"160%\",\n fontFamily: \"var(--default-font-family)\",\n padding: \"8px 12px\",\n background: isReply\n ? \"var(--surface-hover, #F3F7F7)\"\n : \"var(--surface-warm-40, rgba(243, 241, 229, 0.40))\",\n borderRadius: 8,\n wordBreak: \"break-word\",\n }}\n >\n {paragraph}\n </div>\n ))}\n </div>\n )}\n\n {/* Inline delete confirmation */}\n {confirmDelete && (\n <div\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n marginTop: 8,\n fontSize: 13,\n fontFamily: \"var(--default-font-family)\",\n }}\n >\n <span style={{ color: \"var(--Grey-Muted, #808183)\", fontWeight: 400 }}>\n Confirm: delete this comment?\n </span>\n <button\n type=\"button\"\n onClick={() => { setConfirmDelete(false); onDelete?.(comment); }}\n style={{\n background: \"var(--grey-light, #e9e8e8a1)\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 13,\n fontWeight: 600,\n color: \"var(--text-ink, #1E2125)\",\n fontFamily: \"var(--default-font-family)\",\n padding: \"4px 10px\",\n borderRadius: 6,\n transition: \"background 0.15s\",\n }}\n onMouseEnter={(e) => { e.currentTarget.style.background = \"var(--Grey-absent, #D9D9D9)\"; }}\n onMouseLeave={(e) => { e.currentTarget.style.background = \"var(--grey-light, #e9e8e8a1)\"; }}\n >\n Delete\n </button>\n <button\n type=\"button\"\n onClick={() => setConfirmDelete(false)}\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 13,\n fontWeight: 400,\n color: \"var(--Grey-Muted, #808183)\",\n fontFamily: \"var(--default-font-family)\",\n padding: \"4px 10px\",\n borderRadius: 6,\n transition: \"background 0.15s\",\n }}\n onMouseEnter={(e) => { e.currentTarget.style.background = \"var(--grey-light, #e9e8e8a1)\"; }}\n onMouseLeave={(e) => { e.currentTarget.style.background = \"none\"; }}\n >\n Cancel\n </button>\n </div>\n )}\n\n {/* Reply action — CornerDownRight 20×20 + \"Reply\" */}\n {showReply && onReply && !replyOpen && !confirmDelete && (\n <button\n type=\"button\"\n onClick={() => { setEditOpen(false); setReplyOpen(true); }}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n marginTop: 8,\n padding: 0,\n border: \"none\",\n background: \"transparent\",\n cursor: \"pointer\",\n fontSize: 13,\n fontWeight: 400,\n color: \"var(--Grey-Muted, #808183)\",\n fontFamily: \"var(--default-font-family)\",\n transition: \"color 0.15s\",\n }}\n >\n <CornerDownRight size={20} color=\"var(--Grey-Muted, #808183)\" strokeWidth={1.5} />\n Reply\n </button>\n )}\n\n {/* Inline reply input */}\n {replyOpen && (\n <div\n style={{\n display: \"flex\",\n width: 662,\n maxWidth: \"100%\",\n padding: \"8px 12px 12px 12px\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n alignItems: \"flex-start\",\n gap: 24,\n borderRadius: 8,\n border: \"1px solid var(--Grey-absent, #D9D9D9)\",\n background: \"var(--Grey-White, #FFF)\",\n boxSizing: \"border-box\",\n marginTop: 12,\n }}\n >\n {/* Tagged comment quote */}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8, width: \"100%\" }}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n width: \"100%\",\n }}\n >\n <span\n style={{\n fontSize: 13,\n fontWeight: 600,\n color: \"var(--Grey-Muted, #808183)\",\n fontFamily: \"var(--default-font-family)\",\n lineHeight: \"normal\",\n }}\n >\n {\"\\u201C\"} {comment.author?.name || \"Unknown\"}\n </span>\n <button\n type=\"button\"\n onClick={() => { setReplyValue(\"\"); setReplyOpen(false); }}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: 0,\n }}\n >\n <X size={20} color=\"var(--Grey-Muted, #808183)\" />\n </button>\n </div>\n <div\n style={{\n display: \"flex\",\n height: 36,\n padding: 16,\n alignItems: \"center\",\n gap: 5,\n borderRadius: \"0 8px 8px 8px\",\n background: \"var(--Grey-Strong, #2E3236)\",\n boxSizing: \"border-box\",\n width: \"100%\",\n }}\n >\n <span\n style={{\n color: \"var(--Grey-White, #FFF)\",\n fontSize: 13,\n fontWeight: 400,\n fontFamily: \"var(--default-font-family)\",\n lineHeight: \"normal\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {Array.isArray(comment.content) ? comment.content[0] : comment.content}\n </span>\n </div>\n </div>\n {/* Reply input + Post button */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"flex-end\",\n gap: 8,\n width: \"100%\",\n }}\n >\n <textarea\n ref={replyRef}\n value={replyValue}\n onChange={(e) => setReplyValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n if (e.metaKey || e.ctrlKey || e.shiftKey) {\n // Allow newline insertion\n return;\n }\n e.preventDefault();\n if (replyValue.trim()) {\n onSendReply?.({ content: replyValue.trim(), parentId: comment.id });\n setReplyValue(\"\");\n setReplyOpen(false);\n }\n }\n if (e.key === \"Escape\") {\n setReplyValue(\"\");\n setReplyOpen(false);\n }\n }}\n autoFocus\n placeholder=\"Add a reply\"\n rows={1}\n style={{\n flex: 1,\n padding: \"10px 12px\",\n fontSize: 13,\n fontWeight: 400,\n color: \"var(--text-ink, #1E2125)\",\n fontFamily: \"var(--default-font-family)\",\n lineHeight: \"160%\",\n border: \"none\",\n background: \"transparent\",\n outline: \"none\",\n boxSizing: \"border-box\",\n resize: \"none\",\n minHeight: 24,\n maxHeight: 140,\n overflowY: \"hidden\",\n }}\n />\n <button\n type=\"button\"\n onClick={() => {\n if (replyValue.trim()) {\n onSendReply?.({ content: replyValue.trim(), parentId: comment.id });\n setReplyValue(\"\");\n setReplyOpen(false);\n }\n }}\n disabled={!replyValue.trim()}\n style={{\n display: \"flex\",\n height: 28,\n padding: \"8px 12px\",\n justifyContent: \"center\",\n alignItems: \"center\",\n gap: 8,\n fontSize: 13,\n fontWeight: 600,\n color: replyValue.trim()\n ? \"var(--Grey-White, #FFF)\"\n : \"var(--Grey-Muted, #808183)\",\n background: replyValue.trim()\n ? \"var(--Neutral-850, #272727)\"\n : \"var(--grey-light, #e9e8e8a1)\",\n border: \"none\",\n borderRadius: 10,\n cursor: replyValue.trim() ? \"pointer\" : \"not-allowed\",\n fontFamily: \"var(--default-font-family)\",\n lineHeight: \"150%\",\n }}\n >\n Post\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n};\n\n/* ============================================\n COMMENT INPUT — Figma node 237-5570\n display: flex\n width: 552px\n padding: 12px\n flex-direction: column\n justify-content: center\n align-items: flex-start\n gap: 24px\n\n border-radius: 8px\n border: 1px solid var(--Grey-absent, #D9D9D9)\n background: var(--Grey-White, #FFF)\n ============================================ */\nconst CommentInput = ({ currentUser, onSubmit }) => {\n const [value, setValue] = useState(\"\");\n const [isFocused, setIsFocused] = useState(false);\n const textareaRef = useRef(null);\n\n useEffect(() => {\n const ta = textareaRef.current;\n if (!ta) return;\n ta.style.height = \"auto\";\n const max = 140;\n ta.style.height = Math.min(ta.scrollHeight, max) + \"px\";\n ta.style.overflowY = ta.scrollHeight > max ? \"auto\" : \"hidden\";\n }, [value]);\n\n const handleSubmit = () => {\n const trimmed = value.trim();\n if (!trimmed) return;\n onSubmit?.(trimmed);\n setValue(\"\");\n };\n\n const handleKeyDown = (e) => {\n if (e.key === \"Enter\") {\n if (e.metaKey || e.ctrlKey || e.shiftKey) {\n // Allow newline insertion\n return;\n }\n e.preventDefault();\n handleSubmit();\n }\n };\n\n const initials = currentUser?.initials || getInitials(currentUser?.name);\n const color = resolveCurrentUserAvatarColor(currentUser);\n const avatarImg = currentUser?.avatar;\n\n return (\n <div style={{ display: \"flex\", gap: 16, alignItems: \"flex-start\" }}>\n {/* Current user avatar */}\n <Avatar\n name={currentUser?.name}\n initials={initials}\n color={color}\n avatar={avatarImg}\n />\n\n {/* Input container — Figma: 552px, padding 12, border-radius 8 */}\n <div\n style={{\n flex: 1,\n padding: 12,\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n alignItems: \"flex-start\",\n gap: 24,\n borderRadius: 8,\n border: isFocused\n ? \"1px solid var(--Grey-Strong, #2E3236)\"\n : \"1px solid var(--Grey-absent, #D9D9D9)\",\n background: \"var(--Grey-White, #FFF)\",\n transition: \"border-color 0.15s\",\n }}\n >\n {/* Textarea + Post row */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"flex-end\",\n gap: 8,\n width: \"100%\",\n }}\n >\n <textarea\n ref={textareaRef}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n onKeyDown={handleKeyDown}\n placeholder=\"Add feedback\"\n rows={1}\n style={{\n flex: 1,\n border: \"none\",\n outline: \"none\",\n resize: \"none\",\n fontSize: 13,\n fontWeight: 400,\n color: \"var(--text-ink, #1E2125)\",\n fontFamily: \"var(--default-font-family)\",\n lineHeight: \"160%\",\n background: \"transparent\",\n padding: 0,\n minHeight: 24,\n maxHeight: 140,\n overflowY: \"hidden\",\n }}\n />\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={!value.trim()}\n style={{\n display: \"flex\",\n padding: \"6px 16px\",\n justifyContent: \"center\",\n alignItems: \"center\",\n fontSize: 13,\n fontWeight: 600,\n color: value.trim()\n ? \"var(--Grey-White, #FFF)\"\n : \"var(--Grey-Muted, #808183)\",\n background: value.trim()\n ? \"var(--Grey-Strong, #2E3236)\"\n : \"var(--grey-light, #e9e8e8a1)\",\n border: \"none\",\n borderRadius: 6,\n cursor: value.trim() ? \"pointer\" : \"not-allowed\",\n fontFamily: \"var(--default-font-family)\",\n transition: \"all 0.15s\",\n flexShrink: 0,\n lineHeight: \"150%\",\n }}\n >\n Post\n </button>\n </div>\n </div>\n </div>\n );\n};\n\n/* ============================================\n MAIN COMPONENT: UpdatedThreads\n\n Outer container — full width\n Header (237-5556):\n display: flex\n height: 40px\n padding-bottom: 8px\n align-items: center\n gap: 16px\n align-self: stretch\n border-bottom: 1px solid var(--Grey-absent, #D9D9D9)\n\n Comments + Input wrapper (596-2060):\n display: flex\n padding-top: 24px\n flex-direction: column\n align-items: flex-start\n gap: 10px\n align-self: stretch\n border-top: 1px solid var(--Grey-absent, #D9D9D9)\n width: 552px (content area)\n ============================================ */\n\nconst CommentThread = ({ comment, depth = 0, isConsecutive = false, onReply, onSendReply, onEdit, onDelete, onMenuClick }) => {\n const hasReplies = comment.replies && comment.replies.length > 0;\n const isLastAtDepth = !hasReplies;\n return (\n <React.Fragment>\n <div style={{ paddingLeft: depth > 0 ? Math.min(depth * 32, 128) : 0 }}>\n <CommentBubble\n comment={comment}\n isReply={depth > 0}\n isConsecutive={isConsecutive}\n onReply={onReply}\n onSendReply={onSendReply}\n onEdit={onEdit}\n onDelete={onDelete}\n onMenuClick={onMenuClick}\n showReply={isLastAtDepth}\n />\n </div>\n {hasReplies && comment.replies.map((reply) => (\n <CommentThread\n key={reply.id}\n comment={reply}\n depth={depth + 1}\n onReply={onReply}\n onSendReply={onSendReply}\n onEdit={onEdit}\n onDelete={onDelete}\n onMenuClick={onMenuClick}\n />\n ))}\n </React.Fragment>\n );\n};\n\nconst UpdatedThreads = ({\n comments: externalComments = [],\n totalComments,\n children,\n onSendComment,\n onReply,\n onSendReply,\n onEdit,\n onDelete,\n onMenuClick,\n onMarkResolved,\n currentUser,\n isResolved = false,\n}) => {\n // Local state for optimistic updates (replies, new comments, edits, deletes)\n const [localComments, setLocalComments] = useState([]);\n const [isSending, setIsSending] = useState(false);\n\n // Merge external + local comments\n const allComments = useMemo(() => {\n const externalIds = new Set(externalComments.map((c) => c.id));\n // Filter out local comments that now exist in external (API caught up)\n const newLocal = localComments.filter((c) => !externalIds.has(c.id));\n return [...externalComments, ...newLocal];\n }, [externalComments, localComments]);\n\n // Sync: remove local comments when external updates\n React.useEffect(() => {\n const externalIds = new Set(externalComments.map((c) => c.id));\n setLocalComments((prev) => prev.filter((c) => !externalIds.has(c.id)));\n }, [externalComments]);\n\n const displayCurrentUser = useMemo(() => {\n if (!currentUser) return { name: \"You\", initials: \"YO\", color: \"#6B7C93\" };\n const name = currentUser.name || \"You\";\n const initials = currentUser.initials || getInitials(name);\n const color = resolveCurrentUserAvatarColor(currentUser);\n return { ...currentUser, name, initials, color };\n }, [currentUser]);\n\n const handleSendReply = async ({ content, parentId }) => {\n if (onSendReply) {\n // Host app mode — let API handle it, show loading\n setIsSending(true);\n try {\n await onSendReply({ content, parentId });\n } finally {\n setIsSending(false);\n }\n } else {\n // Library demo mode — optimistic local comment\n const optimisticReply = {\n id: `temp-${Date.now()}`,\n author: displayCurrentUser,\n content,\n timestamp: \"Just now\",\n parentId,\n isOptimistic: true,\n };\n setLocalComments((prev) => [...prev, optimisticReply]);\n }\n };\n\n const handleSendComment = async (text) => {\n if (onSendComment) {\n // Host app mode — let API handle it, show loading\n setIsSending(true);\n try {\n await onSendComment(text);\n } finally {\n setIsSending(false);\n }\n } else {\n // Library demo mode — optimistic local comment\n const optimisticComment = {\n id: `temp-${Date.now()}`,\n author: displayCurrentUser,\n content: text,\n timestamp: \"Just now\",\n isOptimistic: true,\n };\n setLocalComments((prev) => [...prev, optimisticComment]);\n }\n };\n\n const handleEdit = (comment) => {\n // If it's a local optimistic comment, update locally\n setLocalComments((prev) =>\n prev.map((c) => (c.id === comment.id ? { ...c, content: comment.content, isEdited: true } : c))\n );\n onEdit?.(comment);\n };\n\n const handleDelete = (comment) => {\n // Remove from local state immediately\n setLocalComments((prev) => prev.filter((c) => c.id !== comment.id));\n onDelete?.(comment);\n };\n\n const groupedComments = useMemo(() => {\n const repliesByParent = {};\n allComments.forEach((c) => {\n if (c.parentId) {\n if (!repliesByParent[c.parentId]) repliesByParent[c.parentId] = [];\n repliesByParent[c.parentId].push(c);\n }\n });\n const buildTree = (comment) => ({\n ...comment,\n replies: (repliesByParent[comment.id] || []).map(buildTree),\n });\n return allComments.filter((c) => !c.parentId).map(buildTree);\n }, [allComments]);\n\n const commentCount = totalComments ?? allComments.length;\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n background: \"var(--Grey-White, #FFF)\",\n width: \"100%\",\n fontFamily: \"var(--default-font-family)\",\n }}\n >\n {/* ═══════════════════════════════════════════\n HEADER — FEEDBACK & GUIDANCE\n ═══════════════════════════════════════════ */}\n <div\n style={{\n display: \"flex\",\n height: 40,\n paddingBottom: 8,\n alignItems: \"center\",\n gap: 8,\n alignSelf: \"stretch\",\n }}\n >\n <MessagesSquare size={24} color=\"var(--rail-orange, #C98A5A)\" strokeWidth={1.5} />\n <span\n style={{\n fontSize: 16,\n fontWeight: 600,\n color: \"var(--Grey-Strong, #2E3236)\",\n textTransform: \"uppercase\",\n lineHeight: 1.2,\n }}\n >\n Feedback & Guidance\n </span>\n </div>\n\n {/* Divider */}\n <div style={{ width: \"100%\", height: 1, background: \"var(--Grey-absent, #D9D9D9)\" }} />\n\n {/* ═══════════════════════════════════════════\n CONTENT AREA — Two equal columns\n ═══════════════════════════════════════════ */}\n <div\n style={{\n display: \"flex\",\n gap: 24,\n alignSelf: \"stretch\",\n }}\n >\n {/* Left column — Feedback / Comments */}\n <div style={{ flex: 1, minWidth: 0 }}>\n {/* Feedback sub-header */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 16,\n paddingTop: 16,\n paddingBottom: 8,\n }}\n >\n <div\n style={{\n width: 34,\n height: 34,\n borderRadius: 9999,\n background: \"var(--surface-hover, #F3F7F7)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n <MessagesSquare style={{ width: 20, height: 20, flexShrink: 0 }} color=\"var(--Grey-Strong, #2E3236)\" strokeWidth={1.5} />\n </div>\n <span\n style={{\n fontSize: 15,\n fontWeight: 500,\n color: \"var(--Grey-Strong, #2E3236)\",\n }}\n >\n Feedback\n </span>\n <span\n style={{\n fontSize: 13,\n fontWeight: 400,\n color: \"var(--Grey-Muted, #808183)\",\n fontFamily: \"var(--default-font-family)\",\n lineHeight: \"150%\",\n marginLeft: \"auto\",\n }}\n >\n {commentCount} Comment{commentCount !== 1 ? \"s\" : \"\"}\n </span>\n {isResolved ? (\n <div\n style={{\n display: \"inline-flex\",\n height: 32,\n padding: \"12px 16px 12px 12px\",\n justifyContent: \"center\",\n alignItems: \"center\",\n gap: 8,\n borderRadius: 10,\n background: \"var(--Rail-Surface-2, #E3E1D7)\",\n flexShrink: 0,\n }}\n >\n <Check size={16} color=\"var(--Grey-Strong, #2E3236)\" strokeWidth={2} />\n <span\n style={{\n fontSize: 13,\n fontWeight: 500,\n color: \"var(--Grey-Strong, #2E3236)\",\n fontFamily: \"var(--default-font-family)\",\n lineHeight: \"150%\",\n }}\n >\n Resolved\n </span>\n </div>\n ) : onMarkResolved ? (\n <button\n type=\"button\"\n onClick={onMarkResolved}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"8px 16px\",\n fontSize: 13,\n fontWeight: 500,\n color: \"var(--Grey-Strong, #2E3236)\",\n background: \"var(--Grey-White, #FFF)\",\n border: \"1px solid var(--Grey-absent, #D9D9D9)\",\n borderRadius: 20,\n cursor: \"pointer\",\n fontFamily: \"var(--default-font-family)\",\n transition: \"background 0.15s\",\n lineHeight: \"150%\",\n flexShrink: 0,\n }}\n >\n <CircleCheck size={16} color=\"var(--Grey-Strong, #2E3236)\" strokeWidth={1.5} />\n Mark as Resolved\n </button>\n ) : null}\n </div>\n {/* Comments list */}\n {allComments.length > 0 && (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 0,\n marginBottom: 24,\n maxHeight: 600,\n overflowY: allComments.length > 6 ? \"auto\" : \"visible\",\n }}\n >\n {groupedComments.map((comment, idx) => {\n const prev = idx > 0 ? groupedComments[idx - 1] : null;\n const prevAuthor = prev?.author?.name || prev?.author_name;\n const currAuthor = comment.author?.name || comment.author_name;\n const isConsecutive = prev && prevAuthor === currAuthor && (!prev.replies || prev.replies.length === 0);\n return (\n <CommentThread\n key={comment.id}\n comment={comment}\n depth={0}\n isConsecutive={!!isConsecutive}\n onReply={onReply}\n onSendReply={handleSendReply}\n onEdit={handleEdit}\n onDelete={handleDelete}\n onMenuClick={onMenuClick}\n />\n );\n })}\n </div>\n )}\n\n {/* Edit info hint */}\n {allComments.length > 0 && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n marginBottom: 16,\n marginLeft: 48,\n }}\n >\n <Info size={16} color=\"var(--Grey-Muted, #808183)\" />\n <span\n style={{\n color: \"var(--Grey-Muted, #808183)\",\n fontSize: 13,\n fontStyle: \"normal\",\n fontWeight: 400,\n lineHeight: \"normal\",\n }}\n >\n Comments can be edited within 15 minutes.\n </span>\n </div>\n )}\n\n {/* Loading indicator */}\n {isSending && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"8px 0\",\n }}\n >\n <div\n style={{\n width: 16,\n height: 16,\n border: \"2px solid var(--Grey-absent, #D9D9D9)\",\n borderTopColor: \"var(--Grey-Strong, #2E3236)\",\n borderRadius: \"50%\",\n animation: \"spin 0.8s linear infinite\",\n }}\n />\n <span\n style={{\n fontSize: 13,\n color: \"var(--Grey-Muted, #808183)\",\n fontFamily: \"var(--default-font-family)\",\n }}\n >\n Sending...\n </span>\n <style>{`@keyframes spin { to { transform: rotate(360deg); } }`}</style>\n </div>\n )}\n\n {/* Comment input */}\n <CommentInput currentUser={displayCurrentUser} onSubmit={handleSendComment} />\n </div>\n\n {/* Right column — Guidance (rendered via children) */}\n <div\n style={{\n flex: 1,\n minWidth: 0,\n }}\n >\n {children}\n </div>\n </div>\n </div>\n );\n};\n\nexport default UpdatedThreads;\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { Lightbulb, PlayCircle, PauseCircle, ScrollText } from \"lucide-react\";\n\n/**\n * UpdatedGuidance — Guidance list for interaction details.\n *\n * Figma node: 822-15273\n *\n * Props:\n * - items Array Guidance items\n * - loading boolean Show loading state\n * - onPlayEvidence fn Called with { start_ms, end_ms } to play audio segment\n * - onShowInTranscript fn Called with start_ms to scroll transcript\n *\n * Item shape:\n * - title string Guidance text\n * - signal_refs Array<{ display_name, confidence }>\n * - start_ms number Evidence start time in ms\n * - end_ms number Evidence end time in ms\n */\n\n/* ── Hover icon wrapper (same as UpdatedInteractionSignals) ── */\nconst HoverIcon = ({ children, size = 28, onClick, title }) => {\n const [hovered, setHovered] = useState(false);\n return (\n <div\n title={title}\n onClick={onClick}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: size,\n height: size,\n borderRadius: 9999,\n background: hovered ? \"var(--surface-hover, #F3F7F7)\" : \"transparent\",\n cursor: \"pointer\",\n flexShrink: 0,\n transition: \"background 0.15s\",\n }}\n >\n {children}\n </div>\n );\n};\n\nconst fmtMs = (ms) => {\n const minutes = Math.floor(ms / 60000);\n const seconds = Math.floor((ms % 60000) / 1000);\n return `${minutes.toString().padStart(2, \"0\")}:${seconds.toString().padStart(2, \"0\")}`;\n};\n\n/* ── Single guidance item ── */\nconst GuidanceItem = ({ item, isLast, onPlayEvidence, onShowInTranscript, timelinePlaying, currentTimeSeconds }) => {\n const signalText = item.signal_refs\n ?.map((sr) => {\n const name = sr.display_name || sr.signal_key || \"\";\n const pct =\n sr.confidence != null ? ` (${Math.round(sr.confidence * 100)}%)` : \"\";\n return name + pct;\n })\n .join(\", \");\n\n const startMs = item.start_ms ?? item.startMs;\n const endMs = item.end_ms ?? item.endMs;\n const hasTimestamp = startMs != null;\n\n // Check if audio is currently playing within this item's time range\n const currentMs = (currentTimeSeconds ?? 0) * 1000;\n const isPlayingThisItem =\n timelinePlaying &&\n hasTimestamp &&\n currentMs >= startMs &&\n currentMs <= (endMs ?? startMs + 5000);\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n padding: \"12px 0\",\n borderBottom: isLast\n ? \"none\"\n : \"1px solid var(--Grey-absent, #D9D9D9)\",\n }}\n >\n {/* Guidance title */}\n <span\n style={{\n alignSelf: \"stretch\",\n fontSize: 14,\n fontWeight: 400,\n color: \"var(--Grey-Strong, #2E3236)\",\n lineHeight: \"150%\",\n }}\n >\n {item.title || item.detail || \"\"}\n </span>\n\n {/* Signal ref + action icons row */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n }}\n >\n {signalText && (\n <span\n style={{\n fontSize: 14,\n fontWeight: 400,\n color: \"var(--Grey-Muted, #808183)\",\n fontFamily: \"var(--default-font-family)\",\n lineHeight: \"150%\",\n flex: 1,\n minWidth: 0,\n }}\n >\n {signalText}\n </span>\n )}\n {hasTimestamp && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n flexShrink: 0,\n }}\n >\n <HoverIcon\n size={28}\n title={isPlayingThisItem ? \"Pause\" : \"Play evidence\"}\n onClick={() =>\n onPlayEvidence?.({\n start_ms: startMs,\n end_ms: endMs,\n })\n }\n >\n {isPlayingThisItem ? (\n <PauseCircle\n size={17}\n color=\"var(--Grey-Strong, #2E3236)\"\n strokeWidth={1}\n />\n ) : (\n <PlayCircle\n size={17}\n color=\"var(--Grey-Muted, #808183)\"\n strokeWidth={1}\n />\n )}\n </HoverIcon>\n <HoverIcon\n size={28}\n title=\"Show in transcript\"\n onClick={() => onShowInTranscript?.(startMs)}\n >\n <ScrollText size={16} color=\"#808183\" strokeWidth={1.5} />\n </HoverIcon>\n <span\n style={{\n fontSize: 13,\n fontWeight: 400,\n color: \"var(--Grey-Muted, #808183)\",\n lineHeight: 1.2,\n whiteSpace: \"nowrap\",\n }}\n >\n {fmtMs(startMs)}\n </span>\n </div>\n )}\n </div>\n </div>\n );\n};\n\n/* ── Main Component ── */\nconst UpdatedGuidance = ({\n items = [],\n guidanceCount,\n loading = false,\n onPlayEvidence,\n onShowInTranscript,\n timelinePlaying = false,\n currentTimeSeconds = 0,\n}) => {\n const count = guidanceCount ?? items.length;\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"stretch\",\n width: \"100%\",\n }}\n >\n {/* Sub-header — icon + Guidance + count */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 16,\n paddingTop: 16,\n paddingBottom: 8,\n }}\n >\n <div\n style={{\n width: 34,\n height: 34,\n borderRadius: 9999,\n background: \"var(--surface-hover, #F3F7F7)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n <Lightbulb\n style={{ width: 20, height: 20, flexShrink: 0 }}\n color=\"var(--Grey-Strong, #2E3236)\"\n strokeWidth={1.5}\n />\n </div>\n <span\n style={{\n fontSize: 15,\n fontWeight: 500,\n color: \"var(--Grey-Strong, #2E3236)\",\n }}\n >\n Guidance\n </span>\n <span\n style={{\n fontSize: 13,\n fontWeight: 400,\n color: \"var(--Grey-Muted, #808183)\",\n fontFamily: \"var(--default-font-family)\",\n lineHeight: \"150%\",\n marginLeft: \"auto\",\n }}\n >\n {count} Item{count !== 1 ? \"s\" : \"\"}\n </span>\n </div>\n\n {items.map((item, i) => (\n <GuidanceItem\n key={i}\n item={item}\n isLast={i === items.length - 1}\n onPlayEvidence={onPlayEvidence}\n onShowInTranscript={onShowInTranscript}\n timelinePlaying={timelinePlaying}\n currentTimeSeconds={currentTimeSeconds}\n />\n ))}\n </div>\n );\n};\n\nexport default UpdatedGuidance;\n","import { useState, useRef, useEffect } from 'react';\nimport { ArrowLeft, ArrowRight, CalendarDays, PhoneIncoming, ClipboardList, FileSignal, Repeat, ChevronDown, ChevronRight, Headset, CircleUser, History, ExternalLink, Mail } from 'lucide-react';\nimport UpdatedInteractionContext from './UpdatedInteractionContext';\nimport UpdatedInteractionRecording from './UpdatedInteractionRecording';\nimport UpdatedInteractionScores from './UpdatedInteractionScores';\nimport UpdatedCoachingSynthesisCard from './UpdatedCoachingSynthesisCard';\nimport UpdatedInteractionSignals from './UpdatedInteractionSignals';\nimport UpdatedCompassScore from './UpdatedCompassScore';\nimport UpdatedThreads from './UpdatedThreads';\nimport UpdatedGuidance from './UpdatedGuidance';\nimport SideDrawer from '../common/SideDrawer';\n\n/* Hover tooltip — fixed position to escape overflow containers.\n Anchored below the trigger. */\nconst NameTooltip = ({ text, children }) => {\n const [show, setShow] = useState(false);\n const triggerRef = useRef(null);\n const [pos, setPos] = useState({ top: 0, left: 0 });\n\n if (!text) return children;\n\n const handleEnter = () => {\n if (triggerRef.current) {\n const rect = triggerRef.current.getBoundingClientRect();\n setPos({\n top: rect.bottom + 6,\n left: rect.left + rect.width / 2,\n });\n }\n setShow(true);\n };\n\n return (\n <div\n ref={triggerRef}\n style={{ position: 'relative', display: 'inline-flex' }}\n onMouseEnter={handleEnter}\n onMouseLeave={() => setShow(false)}\n >\n {children}\n {show && (\n <div style={{\n position: 'fixed',\n top: pos.top,\n left: pos.left,\n transform: 'translate(-50%, 0)',\n display: 'flex',\n padding: 10,\n alignItems: 'center',\n borderRadius: 4,\n border: '1px solid var(--Grey-absent, #D9D9D9)',\n background: 'var(--Grey-Strong, #2E3236)',\n zIndex: 9999,\n pointerEvents: 'none',\n whiteSpace: 'nowrap',\n }}>\n <span style={{\n color: '#FFF',\n fontSize: 12,\n fontWeight: 400,\n lineHeight: 'normal',\n }}>\n {text}\n </span>\n </div>\n )}\n </div>\n );\n};\n\nconst TABS = [\n { key: 'overview', label: 'Overview' },\n { key: 'coaching', label: 'Coaching Summary' },\n { key: 'signals', label: 'Signals & Recording' },\n { key: 'comments', label: 'Feedback' },\n];\n\nconst UpdatedInteractionDetails = ({\n title = 'Wheel Stud Replacement Enquiry',\n onBack,\n // Data props — all optional with defaults for demo\n data,\n coachingData,\n coachingLoading = false,\n audioUrl,\n // Audio/playback props — pass these when the host app manages audio externally\n // (like InteractionDetailPanel does). If omitted, UpdatedInteractionRecording\n // manages its own audio element internally.\n audioRef: externalAudioRef,\n currentTimeSeconds,\n timelinePlaying,\n playbackRate,\n timelineSegments,\n onSeek,\n onTogglePlay,\n onSeekBack,\n onSeekForward,\n onSetPlaybackRate,\n // Speaker names\n agentName: externalAgentName,\n agentFullName: externalAgentFullName,\n customerName: externalCustomerName,\n customerFullName: externalCustomerFullName,\n // Transcript props — pass real transcript data from the host app\n transcript,\n activeTurnIndex,\n turnObservations,\n highlightedTurns,\n onTurnPlayPause,\n // Signal evidence playback — host app can provide to play audio segments from signals\n onPlayEvidence,\n onHighlightTurns,\n // Context props — pass from host app to override block-derived defaults\n callPurpose: externalCallPurpose,\n classification: externalClassification,\n outcomeQuality: externalOutcomeQuality,\n // Context \"More Details\" expandable section\n resolutionOutcome,\n customerIntent,\n interactionId,\n moreDetails,\n // Compass score props\n compassScore, // gauge meter value — compass_score, range 0.5-5\n compassMaxScore = 5,\n predictedCsat, // predicted objective number (e.g. compass_score) — shown as \"03\" top-right\n predictedLabel = 'Predicted Objective',\n compassLegends,\n // Customer session history drawer\n customerSessions: customerSessionsList,\n customerSessionCount,\n onSessionClick,\n onViewAllSessions,\n // Footer navigation\n prevSessionDesc,\n prevSessionDisabled = false,\n nextSessionDesc,\n nextSessionDisabled = false,\n onPreviousSession,\n onNextSession,\n // Comments\n comments = [],\n guidance = [],\n currentUser,\n onSendComment,\n onSendReply,\n onReply,\n onEdit,\n onEditInteraction,\n onDelete,\n onMenuClick,\n onMarkResolved,\n commentsResolved,\n}) => {\n const [activeTab, setActiveTab] = useState('overview');\n const [expandedSignals, setExpandedSignals] = useState(new Set());\n const [showSessionDrawer, setShowSessionDrawer] = useState(false);\n const [hoveredSessionIdx, setHoveredSessionIdx] = useState(null);\n const [internalPlaying, setInternalPlaying] = useState(false);\n const [internalCurrentTime, setInternalCurrentTime] = useState(0);\n const [isScrolledPastHeader, setIsScrolledPastHeader] = useState(false);\n const recordingRef = useRef(null);\n\n // Section refs for scroll-to-section tab behavior\n const overviewRef = useRef(null);\n const coachingRef = useRef(null);\n const signalsRef = useRef(null);\n const commentsRef = useRef(null);\n const sectionRefs = { overview: overviewRef, coaching: coachingRef, signals: signalsRef, comments: commentsRef };\n const scrollContainerRef = useRef(null);\n const isClickScrolling = useRef(false);\n\n // Scroll-spy: update active tab based on which section's top is nearest the viewport\n useEffect(() => {\n const container = scrollContainerRef.current;\n if (!container) return;\n\n const tabKeys = ['overview', 'coaching', 'signals', 'comments'];\n const refs = [overviewRef, coachingRef, signalsRef, commentsRef];\n\n // Find the closest scrollable ancestor (the element that actually scrolls)\n const getScrollParent = (el) => {\n let node = el.parentElement;\n while (node) {\n const { overflow, overflowY } = window.getComputedStyle(node);\n if (/(auto|scroll)/.test(overflow + overflowY)) return node;\n node = node.parentElement;\n }\n return null;\n };\n\n const scrollParent = getScrollParent(container);\n\n const handleScroll = () => {\n if (isClickScrolling.current) return;\n\n let activeKey = tabKeys[0];\n\n // Use viewport-relative positions — works regardless of which element scrolls\n for (let i = refs.length - 1; i >= 0; i--) {\n const el = refs[i].current;\n if (!el) continue;\n const rect = el.getBoundingClientRect();\n // Section is \"active\" when its top has scrolled above 150px from viewport top\n if (rect.top <= 150) {\n activeKey = tabKeys[i];\n break;\n }\n }\n\n setActiveTab(activeKey);\n\n // Move session nav from title row to sticky tabs once content starts scrolling.\n const overviewTop = overviewRef.current?.getBoundingClientRect().top ?? Number.POSITIVE_INFINITY;\n setIsScrolledPastHeader(overviewTop <= 150);\n };\n\n // Attach to all possible scroll targets\n container.addEventListener('scroll', handleScroll, { passive: true });\n if (scrollParent && scrollParent !== container) {\n scrollParent.addEventListener('scroll', handleScroll, { passive: true });\n }\n window.addEventListener('scroll', handleScroll, { passive: true, capture: true });\n handleScroll();\n\n return () => {\n container.removeEventListener('scroll', handleScroll);\n if (scrollParent && scrollParent !== container) {\n scrollParent.removeEventListener('scroll', handleScroll);\n }\n window.removeEventListener('scroll', handleScroll, { capture: true });\n };\n }, []);\n\n const clickedTabRef = useRef(null);\n\n const handleTabClick = (key) => {\n setActiveTab(key);\n isClickScrolling.current = true;\n clickedTabRef.current = key;\n const el = sectionRefs[key]?.current;\n if (el) {\n // Offset scroll to account for the sticky header + tabs (~120px)\n const container = scrollContainerRef.current;\n if (container && container.scrollHeight > container.clientHeight) {\n // Container itself scrolls\n const containerTop = container.getBoundingClientRect().top;\n const elTop = el.getBoundingClientRect().top;\n const offset = elTop - containerTop + container.scrollTop - 16;\n container.scrollTo({ top: offset, behavior: 'smooth' });\n } else {\n // Page/parent scrolls — use window with offset\n const elTop = el.getBoundingClientRect().top + window.scrollY - 120;\n window.scrollTo({ top: elTop, behavior: 'smooth' });\n }\n }\n setTimeout(() => {\n isClickScrolling.current = false;\n clickedTabRef.current = null;\n }, 1200);\n };\n\n const sessionHistory = customerSessionsList || [];\n const hasPastSessions = sessionHistory.length > 1;\n\n /* Called from Signals/Guidance \"Show in transcript\" icon —\n switches to Signals section, then scrolls/highlights transcript card without playing audio. */\n const handleShowInTranscript = (startMs) => {\n setActiveTab('signals');\n const signalsEl = signalsRef.current;\n if (signalsEl) {\n const container = scrollContainerRef.current;\n if (container && container.scrollHeight > container.clientHeight) {\n const containerTop = container.getBoundingClientRect().top;\n const elTop = signalsEl.getBoundingClientRect().top;\n const offset = elTop - containerTop + container.scrollTop - 16;\n container.scrollTo({ top: offset, behavior: 'smooth' });\n } else {\n const elTop = signalsEl.getBoundingClientRect().top + window.scrollY - 120;\n window.scrollTo({ top: elTop, behavior: 'smooth' });\n }\n }\n\n const timeSec = startMs / 1000;\n // Wait briefly so section scroll starts before transcript container scroll/highlight.\n setTimeout(() => {\n if (recordingRef.current?.scrollToTranscript) {\n recordingRef.current.scrollToTranscript(timeSec);\n }\n }, 220);\n };\n\n /* Called from Signals evidence play button — seeks + plays audio segment */\n const handlePlayEvidence = (ev) => {\n setActiveTab('signals');\n const signalsEl = signalsRef.current;\n if (signalsEl) {\n const container = scrollContainerRef.current;\n if (container && container.scrollHeight > container.clientHeight) {\n const containerTop = container.getBoundingClientRect().top;\n const elTop = signalsEl.getBoundingClientRect().top;\n const offset = elTop - containerTop + container.scrollTop - 16;\n container.scrollTo({ top: offset, behavior: 'smooth' });\n } else {\n const elTop = signalsEl.getBoundingClientRect().top + window.scrollY - 120;\n window.scrollTo({ top: elTop, behavior: 'smooth' });\n }\n }\n\n const startMs = ev?.start_ms ?? ev?.startMs;\n\n // Wait briefly so section scroll starts before playback seek/play begins.\n setTimeout(() => {\n // Keep transcript highlight behavior consistent with \"Show in transcript\".\n if (startMs != null && recordingRef.current?.scrollToTranscript) {\n recordingRef.current.scrollToTranscript(startMs / 1000);\n }\n\n if (onPlayEvidence) {\n onPlayEvidence(ev);\n } else {\n // Default: seek to evidence start time via recording ref\n if (startMs != null && recordingRef.current?.seekTo) {\n recordingRef.current.seekTo(startMs / 1000);\n setInternalPlaying(true);\n setInternalCurrentTime(startMs / 1000);\n // Stop playing after evidence duration\n const endMs = ev.end_ms ?? ev.endMs ?? (startMs + 5000);\n const durationMs = endMs - startMs;\n setTimeout(() => setInternalPlaying(false), durationMs);\n }\n }\n }, 220);\n };\n\n /* Called to highlight transcript turns related to evidence */\n const handleHighlightTurns = (turnIds) => {\n if (onHighlightTurns) {\n onHighlightTurns(turnIds);\n }\n };\n\n const toggleSignal = (key) => {\n setExpandedSignals((prev) => {\n const next = new Set(prev);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n return next;\n });\n };\n\n // Extract data from blocks if provided\n const blocks = data?.blocks || [];\n const findBlock = (id) => blocks.find((b) => b.block_id === id)?.payload || {};\n\n const meta = findBlock('interaction-metadata');\n const ctx = findBlock('interaction-context');\n const signals = findBlock('interaction-signals');\n const outcomeLift = findBlock('interaction-outcome-lift');\n const dimensionsBlock = findBlock('interaction-dimensions');\n const blockDimensions = dimensionsBlock.dimensions || [];\n const callPurpose = ctx.call_purpose || {};\n const classification = ctx.classification || {};\n\n const resolvedMeta = meta || {};\n const resolvedCallPurpose = externalCallPurpose || callPurpose || {};\n const resolvedClassification = externalClassification || classification || {};\n const resolvedOutcomeLift = outcomeLift || {};\n const resolvedDriverLabels = (resolvedOutcomeLift.driver_signal_keys || [])\n .map((k) => k.replace(/^sig\\./, '').replace(/_/g, ' '));\n const resolvedCoaching = coachingData || null;\n const resolvedSignals = signals?.signals?.length\n ? signals\n : { present_count: 0, total_signals_evaluated: 0, signals: [] };\n const guidanceData = guidance || [];\n\n // Resolve names: explicit props → metadata block → context block → fallback\n const agentName = externalAgentName || meta.agent_name || meta.agent || ctx.agent_name || 'Agent';\n const agentFullName = externalAgentFullName || meta.agent_full_name || meta.agent_name || agentName;\n const customerName = externalCustomerName || meta.customer_name || meta.customer || ctx.customer_name || 'Customer';\n const customerFullName = externalCustomerFullName || meta.customer_full_name || meta.customer_name || customerName;\n const resolvedUserRole = String(\n currentUser?.role ??\n currentUser?.userRole ??\n currentUser?.user_role ??\n currentUser?.roleName ??\n currentUser?.role_name ??\n ''\n ).toLowerCase();\n const canEditInteraction = /(admin|superadmin|administrator)/.test(resolvedUserRole);\n const sessionCount = customerSessionCount ?? sessionHistory.length;\n const rawDate = meta.created_dt || data?.created_dt || ctx.created_dt || '';\n const dateStr = rawDate\n ? new Date(/Z$|[+-]\\d{2}:\\d{2}$/.test(rawDate) ? rawDate : rawDate + 'Z').toLocaleString()\n : '';\n const direction = resolvedCallPurpose.interaction_direction === 'inbound' ? 'Inbound' : 'Outbound';\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', width: '100%', height: '100%', background: 'var(--Grey-White, #FFF)' }}>\n {/* Sticky Header + Tabs */}\n {/* Header */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 12, padding: '18px 24px 0' }}>\n <button\n onClick={onBack}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: 0,\n flexShrink: 0,\n }}\n >\n <ArrowLeft size={24} color=\"var(--Grey-Strong, #2E3236)\" />\n </button>\n <div style={{ width: 1, height: 28, background: 'var(--Base-absent, #D9D9D9)' }} />\n <h1 style={{\n color: 'var(--Grey-Strong, #2E3236)',\n fontSize: 24,\n fontStyle: 'normal',\n fontWeight: 400,\n lineHeight: 'normal',\n margin: 0,\n flex: 1,\n }}>\n {title}\n </h1>\n\n {/* Figma node 605-1186: Previous / Next Session — inline in header */}\n {(onPreviousSession || onNextSession) && !isScrolledPastHeader && (\n <div style={{ display: 'flex', alignItems: 'center', flexShrink: 0 }}>\n {/* Previous Session */}\n <NameTooltip text={prevSessionDesc}>\n <button\n onClick={prevSessionDisabled ? undefined : onPreviousSession}\n disabled={prevSessionDisabled}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n padding: '4px 12px',\n background: 'none',\n border: 'none',\n cursor: prevSessionDisabled ? 'default' : 'pointer',\n opacity: prevSessionDisabled ? 0.4 : 1,\n }}\n >\n <ArrowLeft size={16} color=\"var(--Neutral-800, #323232)\" strokeWidth={1.5} />\n <span style={{\n color: 'var(--Neutral-800, #323232)',\n fontSize: 13,\n fontWeight: 400,\n lineHeight: '24px',\n fontFamily: 'var(--default-font-family)',\n whiteSpace: 'nowrap',\n }}>\n Previous Session\n </span>\n </button>\n </NameTooltip>\n\n {/* Divider */}\n <div style={{\n width: 1,\n height: 20,\n background: 'var(--Grey-absent, #D9D9D9)',\n flexShrink: 0,\n }} />\n\n {/* Next Session */}\n <NameTooltip text={nextSessionDesc}>\n <button\n onClick={nextSessionDisabled ? undefined : onNextSession}\n disabled={nextSessionDisabled}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n padding: '4px 12px',\n background: 'none',\n border: 'none',\n cursor: nextSessionDisabled ? 'default' : 'pointer',\n opacity: nextSessionDisabled ? 0.4 : 1,\n }}\n >\n <span style={{\n color: 'var(--Neutral-800, #323232)',\n fontSize: 13,\n fontWeight: 400,\n lineHeight: '24px',\n fontFamily: 'var(--default-font-family)',\n whiteSpace: 'nowrap',\n }}>\n Next Session\n </span>\n <ArrowRight size={16} color=\"var(--Neutral-800, #323232)\" strokeWidth={1.5} />\n </button>\n </NameTooltip>\n </div>\n )}\n </div>\n\n <div style={{ position: 'sticky', top: 68, zIndex: 20, background: 'var(--Grey-White, #FFF)' }}>\n {/* Tabs + sticky session nav at far right */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 16,\n background: 'var(--Grey-White, #FFF)',\n borderBottom: '1px solid var(--Grey-Faint, #ACADAD)',\n padding: '0 24px',\n marginTop: 8,\n }}>\n <div style={{ display: 'flex', alignItems: 'flex-start', minWidth: 0 }}>\n {TABS.map((tab) => (\n <button\n key={tab.key}\n onClick={() => handleTabClick(tab.key)}\n style={{\n display: 'flex',\n padding: 16,\n alignItems: 'center',\n gap: 10,\n background: 'none',\n border: 'none',\n borderBottom: activeTab === tab.key\n ? '3px solid var(--Grey-Strong, #2E3236)'\n : '3px solid transparent',\n cursor: 'pointer',\n fontSize: 15,\n fontWeight: activeTab === tab.key ? 500 : 400,\n color: activeTab === tab.key\n ? 'var(--Grey-Strong, #2E3236)'\n : 'var(--Grey-Muted, #808183)',\n whiteSpace: 'nowrap',\n transition: 'border-color 0.2s ease, color 0.2s ease',\n }}\n >\n {tab.label}\n </button>\n ))}\n </div>\n\n {(onPreviousSession || onNextSession) && isScrolledPastHeader && (\n <div style={{ display: 'flex', alignItems: 'center', flexShrink: 0 }}>\n <NameTooltip text={prevSessionDesc}>\n <button\n onClick={prevSessionDisabled ? undefined : onPreviousSession}\n disabled={prevSessionDisabled}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n padding: '4px 12px',\n background: 'none',\n border: 'none',\n cursor: prevSessionDisabled ? 'default' : 'pointer',\n opacity: prevSessionDisabled ? 0.4 : 1,\n }}\n >\n <ArrowLeft size={16} color=\"var(--Neutral-800, #323232)\" strokeWidth={1.5} />\n <span style={{\n color: 'var(--Neutral-800, #323232)',\n fontSize: 13,\n fontWeight: 400,\n lineHeight: '24px',\n fontFamily: 'var(--default-font-family)',\n whiteSpace: 'nowrap',\n }}>\n Previous Session\n </span>\n </button>\n </NameTooltip>\n\n <div style={{\n width: 1,\n height: 20,\n background: 'var(--Grey-absent, #D9D9D9)',\n flexShrink: 0,\n }} />\n\n <NameTooltip text={nextSessionDesc}>\n <button\n onClick={nextSessionDisabled ? undefined : onNextSession}\n disabled={nextSessionDisabled}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n padding: '4px 12px',\n background: 'none',\n border: 'none',\n cursor: nextSessionDisabled ? 'default' : 'pointer',\n opacity: nextSessionDisabled ? 0.4 : 1,\n }}\n >\n <span style={{\n color: 'var(--Neutral-800, #323232)',\n fontSize: 13,\n fontWeight: 400,\n lineHeight: '24px',\n fontFamily: 'var(--default-font-family)',\n whiteSpace: 'nowrap',\n }}>\n Next Session\n </span>\n <ArrowRight size={16} color=\"var(--Neutral-800, #323232)\" strokeWidth={1.5} />\n </button>\n </NameTooltip>\n </div>\n )}\n </div>\n </div>{/* end sticky header + tabs */}\n\n {/* All sections rendered — tabs scroll to them */}\n <div ref={scrollContainerRef} style={{ padding: 24, flex: 1, overflowY: 'auto' }}>\n {/* ═══ OVERVIEW SECTION ═══ */}\n <div ref={overviewRef} style={{\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'flex-end',\n alignItems: 'flex-start',\n gap: 24,\n alignSelf: 'stretch',\n }}>\n {/* Figma node 106-3508: Section Header — horizontal, gap: 16, height: 40, center */}\n <div style={{\n display: 'flex',\n height: 40,\n alignItems: 'center',\n gap: 16,\n alignSelf: 'stretch',\n }}>\n {/* Left: Icon + Title — fills remaining space */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, flex: 1 }}>\n <ClipboardList size={24} color=\"var(--rail-orange, #C98A5A)\" strokeWidth={2} />\n <span style={{\n fontSize: 16,\n fontWeight: 600,\n color: 'var(--Grey-Strong, #2E3236)',\n lineHeight: 1.2,\n textTransform: 'uppercase',\n }}>\n Overview\n </span>\n </div>\n\n {/* Right: Metadata — horizontal, gap: 16, center */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 16, flexShrink: 0 }}>\n {/* Date */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 6, padding: '8px 0' }}>\n <CalendarDays size={16} color=\"var(--Grey-Muted, #808183)\" strokeWidth={1.5} />\n <span style={{ fontSize: 13, fontWeight: 400, color: 'var(--Grey-Strong, #2E3236)', fontFamily: 'var(--font-sans)', lineHeight: 1.2 }}>\n {dateStr}\n </span>\n </div>\n\n {/* Direction */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 6, padding: '8px 0' }}>\n <PhoneIncoming size={16} color=\"var(--Grey-Muted, #808183)\" strokeWidth={1.5} />\n <span style={{ fontSize: 13, fontWeight: 400, color: 'var(--Grey-Strong, #2E3236)', fontFamily: 'var(--font-sans)', lineHeight: 1.2 }}>\n {direction}\n </span>\n </div>\n\n {/* Agent + Customer — border-left separator */}\n <div style={{\n display: 'flex', alignItems: 'center', gap: 16,\n paddingLeft: 16,\n borderLeft: '1px solid var(--Grey-absent, #D9D9D9)',\n }}>\n {/* Agent — Headset icon + tooltip */}\n <NameTooltip text={agentFullName}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 6, padding: '8px 0', cursor: 'pointer' }}>\n <Headset size={16} color=\"var(--Grey-Muted, #808183)\" strokeWidth={1.5} />\n <span style={{ fontSize: 13, fontWeight: 400, color: 'var(--Grey-Strong, #2E3236)', fontFamily: 'var(--font-sans)', lineHeight: 1.2 }}>\n {agentName}\n </span>\n </div>\n </NameTooltip>\n\n {/* Repeat icon */}\n {/* <Repeat size={16} color=\"var(--color-input-border, #ACACAD)\" strokeWidth={1.5} /> */}\n\n {/* Customer — CircleUser icon + side drawer trigger (only if > 1 session) */}\n {sessionCount > 1 ? (\n <div>\n <NameTooltip text={customerFullName}>\n <button\n onClick={() => setShowSessionDrawer(true)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 16,\n padding: '0 16px',\n height: 34,\n borderRadius: 8,\n background: 'var(--Rail-Surface-2, #E3E1D7)',\n border: 'none',\n cursor: 'pointer',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 4, minWidth: 0 }}>\n <CircleUser size={16} color=\"var(--Grey-Strong, #2E3236)\" strokeWidth={1.5} />\n <span style={{ fontSize: 13, fontWeight: 400, color: 'var(--Grey-Strong, #2E3236)', lineHeight: 1.2, whiteSpace: 'nowrap' }}>\n <span style={{ fontWeight: 600 }}>{customerName}</span>{' '}\n <span>({sessionCount} Sessions)</span>\n </span>\n </div>\n <ChevronRight size={16} color=\"var(--Grey-Strong, #2E3236)\" strokeWidth={1.7} />\n </button>\n </NameTooltip>\n </div>\n ) : (\n <NameTooltip text={customerFullName}>\n <button\n onClick={() => setShowSessionDrawer(true)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 16,\n padding: '0 16px',\n height: 34,\n borderRadius: 8,\n background: 'var(--Rail-Surface-2, #E3E1D7)',\n border: 'none',\n cursor: 'pointer',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 4, minWidth: 0 }}>\n <CircleUser size={16} color=\"var(--Grey-Strong, #2E3236)\" strokeWidth={1.5} />\n <span style={{ fontSize: 13, fontWeight: 600, color: 'var(--Grey-Strong, #2E3236)', lineHeight: 1.2, whiteSpace: 'nowrap' }}>\n {customerName}\n </span>\n </div>\n <ChevronRight size={16} color=\"var(--Grey-Strong, #2E3236)\" strokeWidth={1.7} />\n </button>\n </NameTooltip>\n )}\n </div>\n </div>\n </div>\n\n {/*\n Figma node 101-2385\n Row: Compass Score (left) | Context + Agent Lift Analysis stacked (right)\n */}\n <div style={{\n display: 'flex',\n alignItems: 'stretch',\n gap: 24,\n alignSelf: 'stretch',\n }}>\n {/* Left — Compass Score */}\n <div style={{ flex: 1, minWidth: 0, display: 'flex' }}>\n <UpdatedCompassScore\n score={compassScore ?? 0.5}\n minScore={0}\n maxScore={compassMaxScore}\n predictedScore={predictedCsat ?? 0.5}\n predictedLabel={predictedLabel}\n legends={compassLegends}\n />\n </div>\n\n {/* Right — Context grid + Agent Lift Analysis stacked */}\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'stretch',\n justifyContent: 'flex-end',\n gap: 24,\n flex: 1,\n minWidth: 0,\n }}>\n <UpdatedInteractionContext\n meta={resolvedMeta}\n callPurpose={resolvedCallPurpose}\n classification={resolvedClassification}\n outcomeQuality={externalOutcomeQuality || 'Neutral'}\n dimensions={blockDimensions}\n resolutionOutcome={resolutionOutcome}\n customerIntent={customerIntent}\n interactionId={interactionId ?? meta.interaction_id}\n moreDetails={moreDetails}\n canShowEditButton={canEditInteraction}\n onEditInteraction={onEditInteraction}\n />\n <UpdatedInteractionScores\n outcomeLift={resolvedOutcomeLift}\n driverLabels={resolvedDriverLabels}\n />\n </div>\n </div>\n\n </div>\n\n {/* ═══ COACHING SUMMARY SECTION ═══ */}\n <div ref={coachingRef} style={{ paddingTop: 24 }}>\n <UpdatedCoachingSynthesisCard data={coachingLoading ? null : resolvedCoaching} loading={coachingLoading} />\n </div>\n\n {/* ═══ SIGNALS & RECORDING SECTION ═══ */}\n <div ref={signalsRef} style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 16,\n alignSelf: 'stretch',\n paddingTop: 24,\n }}>\n {/* Section header */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n }}>\n <FileSignal size={24} color=\"#C98A5A\" strokeWidth={2} />\n <span style={{\n fontSize: 16,\n fontWeight: 600,\n color: 'var(--Grey-Strong, #2E3236)',\n lineHeight: 1.2,\n textTransform: 'uppercase',\n }}>\n Signals & Recording\n </span>\n </div>\n\n {/* Content: Signals (left) | Recording+Transcript (right) */}\n <div style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: 24,\n alignSelf: 'stretch',\n paddingTop: 16,\n borderTop: '1px solid #D9D9D9',\n }}>\n <div style={{ flex: 1, minWidth: 0 }}>\n <UpdatedInteractionSignals\n signals={resolvedSignals}\n expandedSignals={expandedSignals}\n toggleSignal={toggleSignal}\n playEvidence={handlePlayEvidence}\n highlightTurns={handleHighlightTurns}\n onShowInTranscript={handleShowInTranscript}\n timelinePlaying={timelinePlaying || internalPlaying}\n currentTimeSeconds={currentTimeSeconds ?? internalCurrentTime}\n />\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <UpdatedInteractionRecording\n ref={recordingRef}\n audioUrl={audioUrl}\n durationSeconds={resolvedMeta.duration_seconds}\n audioRef={externalAudioRef}\n agentName={agentName}\n customerName={customerName}\n currentTimeSeconds={currentTimeSeconds}\n timelinePlaying={timelinePlaying}\n playbackRate={playbackRate}\n timelineSegments={timelineSegments}\n onSeek={onSeek}\n onTogglePlay={onTogglePlay}\n onSeekBack={onSeekBack}\n onSeekForward={onSeekForward}\n onSetPlaybackRate={onSetPlaybackRate}\n transcript={transcript}\n activeTurnIndex={activeTurnIndex}\n turnObservations={turnObservations}\n highlightedTurns={highlightedTurns}\n onTurnPlayPause={onTurnPlayPause}\n setExpandedSignals={setExpandedSignals}\n />\n </div>\n </div>\n </div>\n\n {/* ═══ FEEDBACK SECTION ═══ */}\n <div ref={commentsRef} style={{ paddingTop: 24 }}>\n <UpdatedThreads\n comments={comments}\n totalComments={comments.length}\n currentUser={currentUser}\n onSendComment={onSendComment || (() => {})}\n onSendReply={onSendReply || (() => {})}\n onReply={onReply || (() => {})}\n onEdit={onEdit || (() => {})}\n onDelete={onDelete || (() => {})}\n onMenuClick={onMenuClick || (() => {})}\n onMarkResolved={onMarkResolved || (() => {})}\n isResolved={commentsResolved}\n >\n <UpdatedGuidance\n items={guidanceData}\n guidanceCount={guidanceData.length}\n onPlayEvidence={handlePlayEvidence}\n onShowInTranscript={handleShowInTranscript}\n timelinePlaying={timelinePlaying || internalPlaying}\n currentTimeSeconds={currentTimeSeconds ?? internalCurrentTime}\n />\n </UpdatedThreads>\n </div>\n </div>\n\n <SideDrawer\n open={showSessionDrawer}\n onClose={() => setShowSessionDrawer(false)}\n title={(\n <div style={{ display: 'flex', alignItems: 'center', gap: 10, minWidth: 0 }}>\n <div style={{\n width: 34,\n height: 34,\n borderRadius: '50%',\n background: 'var(--surface-hover, #F3F7F7)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n }}>\n <CircleUser size={20} color=\"var(--Grey-Strong, #2E3236)\" strokeWidth={1.7} />\n </div>\n <div style={{ minWidth: 0 }}>\n <div style={{\n fontSize: 16,\n fontWeight: 600,\n color: 'var(--Grey-Strong, #2E3236)',\n lineHeight: 1.2,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}>\n {customerName}\n </div>\n </div>\n </div>\n )}\n subtitle={hasPastSessions ? (\n <span style={{\n fontSize: 13,\n fontWeight: 400,\n color: 'var(--Grey-Muted, #808183)',\n lineHeight: 1.5,\n }}>\n {sessionCount} Sessions in Past\n </span>\n ) : null}\n width={470}\n height=\"100vh\"\n topOffset={70}\n footer={hasPastSessions ? (\n <div style={{ width: '100%', display: 'flex', justifyContent: 'center' }}>\n <button\n onClick={() => { if (onViewAllSessions) onViewAllSessions(); setShowSessionDrawer(false); }}\n style={{\n display: 'flex',\n height: 32,\n padding: '0 16px 0 12px',\n justifyContent: 'center',\n alignItems: 'center',\n gap: 6,\n background: 'var(--Grey-White, #FFF)',\n border: '1px solid var(--Grey-absent, #D9D9D9)',\n borderRadius: 10,\n cursor: 'pointer',\n }}\n >\n <History size={16} color=\"var(--Grey-Muted, #808183)\" strokeWidth={1.5} />\n <span style={{ fontSize: 14, fontWeight: 600, color: 'var(--Grey-Strong, #2E3236)' }}>\n View All Sessions\n </span>\n </button>\n </div>\n ) : null}\n >\n <div\n style={{\n borderTop: '1px solid var(--Grey-absent, #D9D9D9)',\n maxHeight: '100%',\n overflowY: 'auto',\n }}\n >\n {hasPastSessions ? sessionHistory.map((session, i) => (\n <div\n key={session.id || i}\n onClick={() => { if (onSessionClick) onSessionClick(session); setShowSessionDrawer(false); }}\n onMouseEnter={() => setHoveredSessionIdx(i)}\n onMouseLeave={() => setHoveredSessionIdx(null)}\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n gap: 12,\n padding: '16px 12px',\n borderTop: i === 0 ? 'none' : '1px solid var(--Grey-absent, #D9D9D9)',\n background: hoveredSessionIdx === i ? 'var(--surface-hover, #F3F7F7)' : 'var(--Grey-White, #FFF)',\n cursor: 'pointer',\n transition: 'background 0.15s',\n }}\n >\n <div style={{ minWidth: 0 }}>\n <div style={{ fontSize: 14, display: 'flex', alignItems: 'center', gap: 6, fontWeight: 400, color: 'var(--Grey-Strong, #2E3236)', lineHeight: 1.2, marginBottom: 8, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>\n {session.title}\n </div>\n {session.status && (\n <div style={{ fontSize: 13, color: 'var(--Grey-Strong, #2E3236)', marginBottom: 12, lineHeight: 1.2 }}>\n <span style={{ fontWeight: 400 }}>Status: </span>\n <span style={{ fontWeight: 400, color: 'var(--Grey-Muted, #808183)' }}>{session.status}</span>\n </div>\n )}\n <div style={{ display: 'flex', alignItems: 'center', gap: 14, flexWrap: 'wrap' }}>\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 6, fontSize: 13, fontWeight: 400, color: 'var(--Grey-Muted, #808183)', lineHeight: 1.1 }}>\n <CalendarDays size={16} color=\"var(--Grey-Muted, #808183)\" strokeWidth={1.8} />\n {session.date}\n </span>\n {(session.agent || session.agent_name) && (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 6, fontSize: 13, fontWeight: 400, color: 'var(--Grey-Muted, #808183)', lineHeight: 1.1 }}>\n <Headset size={16} color=\"var(--Grey-Muted, #808183)\" strokeWidth={1.8} />\n {session.agent || session.agent_name}\n </span>\n )}\n </div>\n </div>\n {hoveredSessionIdx === i && (\n <ExternalLink size={20} color=\"var(--Grey-Muted, #808183)\" strokeWidth={1.7} style={{ flexShrink: 0 }} />\n )}\n </div>\n )) : (\n <div\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n minHeight: 140,\n padding: '24px 12px',\n color: 'var(--Grey-Muted, #808183)',\n fontSize: 14,\n fontStyle: 'italic',\n textAlign: 'center',\n }}\n >\n No previous sessions available\n </div>\n )}\n </div>\n </SideDrawer>\n\n </div>\n );\n};\n\nexport default UpdatedInteractionDetails;\n"],"names":["COLORS","OVERALL_MAP","STYLE_ID","ensureKeyframes","style","OverallBadge","overall","label","jsxs","jsx","ThumbsUp","SectionItem","item","text","quote","CoachingColumn","icon","items","i","UpdatedCoachingSynthesisCard","data","loading","error","React","Fragment","strengths","improvements","oneLiner","_a","context","_b","ShieldCheck","TrendingUp","Lightbulb","fmtDur","seconds","m","s","ROW_STYLE","COLUMN_STYLE","UpdatedInteractionContext","meta","callPurpose","classification","dimensions","outcomeQuality","onMoreDetails","moreDetails","resolutionOutcome","customerIntent","canShowEditButton","onEditInteraction","expanded","setExpanded","useState","moreDetailsRef","useRef","duration","messages","driver","paradigm","findDim","keyPattern","d","dimResolution","dimIntent","dimOutcomeQuality","fmtValue","v","c","resolvedOutcomeQuality","resolvedResolutionOutcome","resolvedCustomerIntent","excludedKeys","k","filteredDimensions","pairedRows","rawPairs","left","right","pair","detailRows","useEffect","handleOutsideClick","event","renderRow","renderMoreDetailsToggle","ChevronUp","ChevronDown","Pencil","idx","row","LH","MAX_VISIBLE_DRIVERS","fmtPct","fmtPp","pp","UpdatedInteractionScores","outcomeLift","driverLabels","pExpected","pFull","liftRaw","liftRecentered","liftBand","liftBandCapitalized","LiftIcon","ThumbsDown","visibleDrivers","overflowCount","HoverIcon","children","size","onClick","title","hovered","setHovered","UpdatedInteractionSignals","signals","expandedSignals","toggleSignal","playEvidence","highlightTurns","onShowInTranscript","timelinePlaying","currentTimeSeconds","signalList","presentCount","fmtMs","ms","minutes","isEvPlaying","ev","FileSignal","signal","key","isExpanded","obsCount","_c","obs","obsIdx","e","ScrollText","evIdx","hasTimestamps","PauseCircle","PlayCircle","GaugeMeter","score","minScore","maxScore","numericScore","clampedScore","filledUnits","segDeg","toXY","angleDeg","rad","strokeArc","fromDeg","toDeg","large","gap","_","fromA","toA","segmentFill","pathD","ScoreBar","value","maxValue","numericValue","clampedValue","LEGEND_TOOLTIPS","InfoTooltip","show","setShow","ref","pos","setPos","handleEnter","rect","LegendItem","Info","UpdatedCompassScore","predictedScore","predictedLabel","description","legends","displayScore","rotateDeg","legend","roleColorMap","role","roleTokens","extractRoleValue","user","directRole","nestedRole","_d","_e","_f","resolveCurrentUserAvatarColor","getInitials","name","w","isWithinEditWindow","utcValue","minMatch","formatTimestamp","diffMs","diffMin","diffHr","diffDays","Avatar","initials","color","avatar","CommentBubble","comment","isReply","isConsecutive","onReply","onSendReply","onEdit","onDelete","onMenuClick","showReply","menuOpen","setMenuOpen","replyOpen","setReplyOpen","replyValue","setReplyValue","editOpen","setEditOpen","editValue","setEditValue","confirmDelete","setConfirmDelete","menuRef","replyRef","editRef","author","authorName","avatarColor","avatarImg","rawTimestamp","timestamp","canEdit","isEdited","paragraphs","handler","ta","max","p","Ellipsis","X","paragraph","CornerDownRight","CommentInput","currentUser","onSubmit","setValue","isFocused","setIsFocused","textareaRef","handleSubmit","trimmed","handleKeyDown","CommentThread","depth","hasReplies","isLastAtDepth","reply","UpdatedThreads","externalComments","totalComments","onSendComment","onMarkResolved","isResolved","localComments","setLocalComments","isSending","setIsSending","allComments","useMemo","externalIds","newLocal","prev","displayCurrentUser","handleSendReply","content","parentId","optimisticReply","handleSendComment","optimisticComment","handleEdit","handleDelete","groupedComments","repliesByParent","buildTree","commentCount","MessagesSquare","Check","CircleCheck","prevAuthor","currAuthor","GuidanceItem","isLast","onPlayEvidence","signalText","sr","pct","startMs","endMs","hasTimestamp","currentMs","isPlayingThisItem","UpdatedGuidance","guidanceCount","count","NameTooltip","triggerRef","TABS","UpdatedInteractionDetails","onBack","coachingData","coachingLoading","audioUrl","externalAudioRef","playbackRate","timelineSegments","onSeek","onTogglePlay","onSeekBack","onSeekForward","onSetPlaybackRate","externalAgentName","externalAgentFullName","externalCustomerName","externalCustomerFullName","transcript","activeTurnIndex","turnObservations","highlightedTurns","onTurnPlayPause","onHighlightTurns","externalCallPurpose","externalClassification","externalOutcomeQuality","interactionId","compassScore","compassMaxScore","predictedCsat","compassLegends","customerSessionsList","customerSessionCount","onSessionClick","onViewAllSessions","prevSessionDesc","prevSessionDisabled","nextSessionDesc","nextSessionDisabled","onPreviousSession","onNextSession","comments","guidance","commentsResolved","activeTab","setActiveTab","setExpandedSignals","showSessionDrawer","setShowSessionDrawer","hoveredSessionIdx","setHoveredSessionIdx","internalPlaying","setInternalPlaying","internalCurrentTime","setInternalCurrentTime","isScrolledPastHeader","setIsScrolledPastHeader","recordingRef","overviewRef","coachingRef","signalsRef","commentsRef","sectionRefs","scrollContainerRef","isClickScrolling","container","tabKeys","refs","scrollParent","el","node","overflow","overflowY","handleScroll","activeKey","overviewTop","clickedTabRef","handleTabClick","containerTop","offset","elTop","sessionHistory","hasPastSessions","handleShowInTranscript","signalsEl","timeSec","handlePlayEvidence","durationMs","handleHighlightTurns","turnIds","next","blocks","findBlock","id","b","ctx","blockDimensions","resolvedMeta","resolvedCallPurpose","resolvedClassification","resolvedOutcomeLift","resolvedDriverLabels","resolvedCoaching","resolvedSignals","guidanceData","agentName","agentFullName","customerName","customerFullName","resolvedUserRole","canEditInteraction","sessionCount","rawDate","dateStr","direction","ArrowLeft","ArrowRight","tab","ClipboardList","CalendarDays","PhoneIncoming","Headset","CircleUser","ChevronRight","UpdatedInteractionRecording","SideDrawer","History","session","ExternalLink"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"UpdatedInteractionDetails.cjs.js","sources":["../../src/components/UpdatedInteractionDetails/UpdatedCoachingSynthesisCard.jsx","../../src/components/UpdatedInteractionDetails/UpdatedInteractionContext.jsx","../../src/components/UpdatedInteractionDetails/UpdatedInteractionScores.jsx","../../src/components/UpdatedInteractionDetails/UpdatedInteractionSignals.jsx","../../src/components/UpdatedInteractionDetails/UpdatedCompassScore.jsx","../../src/components/UpdatedInteractionDetails/UpdatedThreads.jsx","../../src/components/UpdatedInteractionDetails/UpdatedGuidance.jsx","../../src/components/UpdatedInteractionDetails/UpdatedInteractionDetails.jsx"],"sourcesContent":["\"use client\";\n\nimport React from \"react\";\nimport { ShieldCheck, ThumbsUp, TrendingUp, Lightbulb } from \"lucide-react\";\n\n/**\n * UpdatedCoachingSynthesisCard — \"COACHING SUMMARY\" section matching Figma node 113-7216.\n *\n * Props:\n * - data object Coaching synthesis response\n * - loading boolean Show shimmer loading state\n * - error string Error message to display\n *\n * Data shape:\n * - one_liner string\n * - context string\n * - strengths Array<{ text: string, quote?: string }>\n * - improvements Array<{ text: string, quote?: string }>\n * - overall string \"effective\" | \"strong\" | \"needs_improvement\" | \"mixed\"\n */\n\nconst COLORS = {\n strong: \"var(--Grey-Strong, #2E3236)\",\n muted: \"var(--Grey-Muted, #808183)\",\n absent: \"var(--Grey-absent, #D9D9D9)\",\n accent: \"var(--rail-orange, #C98A5A)\",\n itemText: \"var(--text-item, #3F3F3F)\",\n quoteLine: \"var(--border-warm, #B2AEA8)\",\n quoteText: \"var(--text-subtle-warm, #767473)\",\n iconBg: \"var(--surface-hover, #F3F7F7)\",\n};\n\nconst OVERALL_MAP = {\n effective: \"Effective\",\n strong: \"Strong\",\n needs_improvement: \"Needs Improvement\",\n mixed: \"Mixed\",\n};\n\nconst STYLE_ID = \"updated-coaching-synthesis-keyframes\";\n\nfunction ensureKeyframes() {\n if (typeof document === \"undefined\") return;\n if (document.getElementById(STYLE_ID)) return;\n const style = document.createElement(\"style\");\n style.id = STYLE_ID;\n style.textContent = `\n @keyframes updated-coaching-shimmer {\n 0% { background-position: -200% 0; }\n 100% { background-position: 200% 0; }\n }\n @keyframes updated-coaching-pulse {\n 0%, 100% { opacity: 0.4; }\n 50% { opacity: 1; }\n }\n `;\n document.head.appendChild(style);\n}\n\nfunction OverallBadge({ overall }) {\n const label = OVERALL_MAP[overall] || (overall ? overall.replace(/_/g, \" \") : \"\");\n\n return (\n <div style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n flexShrink: 0,\n }}>\n <span style={{\n fontSize: 13,\n fontWeight: 400,\n color: COLORS.strong,\n fontFamily: \"var(--font-sans)\",\n lineHeight: 1.2,\n }}>\n Overall:\n </span>\n <div style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n }}>\n <ThumbsUp size={14} color={COLORS.strong} strokeWidth={1.5} />\n <span style={{\n fontSize: 13,\n fontWeight:600,\n color: COLORS.strong,\n fontFamily: \"var(--font-sans)\",\n lineHeight: 1.2,\n }}>\n {label}\n </span>\n </div>\n </div>\n );\n}\n\nfunction SectionItem({ item }) {\n const text = typeof item === \"string\" ? item : item?.text || \"\";\n const quote = typeof item === \"object\" ? item?.quote : null;\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 14 }}>\n <div style={{\n fontSize: 14,\n fontWeight: 600,\n color: COLORS.itemText,\n fontFamily: \"var(--font-sans)\",\n lineHeight: 1.5,\n }}>\n {text}\n </div>\n {quote && (\n <div style={{\n display: \"flex\",\n gap: 10,\n }}>\n <div style={{\n width: 1,\n flexShrink: 0,\n alignSelf: \"stretch\",\n background: COLORS.quoteLine,\n }} />\n <div style={{\n fontSize: 14,\n fontWeight: 400,\n color: COLORS.quoteText,\n fontFamily: \"var(--font-sans)\",\n lineHeight: 1.5,\n }}>\n “{quote}”\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction CoachingColumn({ icon, label, items }) {\n if (!items || items.length === 0) return null;\n\n return (\n <div style={{\n flex: 1,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n borderRadius: 12,\n }}>\n {/* Column header */}\n <div style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 16,\n }}>\n {/* Icon with circular bg */}\n <div style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 24,\n height: 24,\n borderRadius: 9999,\n background: COLORS.iconBg,\n flexShrink: 0,\n }}>\n {icon}\n </div>\n <span style={{\n fontSize: 16,\n fontWeight: 600,\n color: COLORS.strong,\n fontFamily: \"var(--font-sans)\",\n lineHeight: \"normal\",\n }}>\n {label}\n </span>\n </div>\n\n {/* Items */}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 24 }}>\n {items.map((item, i) => (\n <SectionItem key={i} item={item} />\n ))}\n </div>\n </div>\n );\n}\n\nconst UpdatedCoachingSynthesisCard = ({ data, loading, error }) => {\n React.useEffect(() => { ensureKeyframes(); }, []);\n\n // Loading state — ThreeCirclesSpinner\n if (loading) {\n return (\n <>\n <style>{`\n @keyframes coaching-spinner-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `}</style>\n <div style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 12,\n padding: \"48px 24px\",\n }}>\n <svg\n width={48}\n height={48}\n viewBox=\"0 0 48 48\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ animation: \"coaching-spinner-spin 1.2s linear infinite\" }}\n >\n <path\n d=\"M43 24C43 26.4951 42.5086 28.9658 41.5537 31.271C40.5989 33.5762 39.1993 35.6707 37.435 37.435C35.6707 39.1993 33.5762 40.5989 31.271 41.5537C28.9658 42.5086 26.4951 43 24 43C21.5049 43 19.0342 42.5086 16.729 41.5537C14.4238 40.5989 12.3293 39.1993 10.565 37.435C8.80066 35.6707 7.40113 33.5762 6.44629 31.271C5.49145 28.9658 5 26.4951 5 24\"\n stroke=\"#F3E7C7\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M12 24C12 22.4241 12.3104 20.8637 12.9134 19.4078C13.5165 17.9519 14.4004 16.629 15.5147 15.5147C16.629 14.4004 17.9519 13.5165 19.4078 12.9134C20.8637 12.3104 22.4241 12 24 12C25.5759 12 27.1363 12.3104 28.5922 12.9134C30.0481 13.5165 31.371 14.4004 32.4853 15.5147C33.5996 16.629 34.4835 17.9519 35.0866 19.4078C35.6896 20.8637 36 22.4241 36 24\"\n stroke=\"#00A66E\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M20 24C20 24.5253 20.1035 25.0454 20.3045 25.5307C20.5055 26.016 20.8001 26.457 21.1716 26.8284C21.543 27.1999 21.984 27.4945 22.4693 27.6955C22.9546 27.8965 23.4747 28 24 28C24.5253 28 25.0454 27.8965 25.5307 27.6955C26.016 27.4945 26.457 27.1999 26.8284 26.8284C27.1999 26.457 27.4945 26.016 27.6955 25.5307C27.8965 25.0454 28 24.5253 28 24\"\n stroke=\"#F3E7C7\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n />\n </svg>\n <span style={{\n fontSize: 14,\n color: COLORS.muted,\n fontWeight: 500,\n textAlign: \"center\",\n }}>\n Synthesizing coaching summary...\n </span>\n </div>\n </>\n );\n }\n\n // Error state\n if (error) {\n return (\n <div style={{\n fontSize: 14,\n color: COLORS.muted,\n }}>\n Unable to generate coaching summary.\n </div>\n );\n }\n\n // No data\n if (!data) return null;\n\n const strengths = data.strengths || [];\n const improvements = data.improvements || [];\n const oneLiner = typeof data.one_liner === \"string\" ? data.one_liner : data.one_liner?.text || \"\";\n const context = typeof data.context === \"string\" ? data.context : data.context?.text || \"\";\n\n return (\n <div style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n background: \"#FFF\",\n }}>\n {/* Section header — Figma: icon + \"Coaching Summary\" 16px / 700 / #2E3236 */}\n <div style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n }}>\n <ShieldCheck size={20} color={COLORS.accent} strokeWidth={2} />\n <span style={{\n fontSize: 16,\n fontWeight: 600,\n color: COLORS.strong,\n fontFamily: \"var(--font-sans)\",\n lineHeight: 1.2,\n textTransform: \"uppercase\",\n }}>\n Coaching Summary\n </span>\n </div>\n\n {/* One-liner — Figma: 14px / 600 / #2E3236 */}\n {oneLiner && (\n <div style={{\n fontSize: 14,\n fontWeight: 500,\n color: COLORS.strong,\n fontFamily: \"var(--font-sans)\",\n lineHeight: 1.5,\n }}>\n {oneLiner}\n </div>\n )}\n\n {/* Context row + Overall badge — Figma: horizontal, space-between */}\n <div style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 16,\n justifyContent: \"space-between\",\n }}>\n {context && (\n <div style={{\n fontSize: 14,\n fontWeight: 400,\n color: COLORS.muted,\n fontFamily: \"var(--font-sans)\",\n lineHeight: 1.5,\n flex: 1,\n }}>\n {context}\n </div>\n )}\n {data.overall && <OverallBadge overall={data.overall} />}\n </div>\n\n {/* Two-column layout: Key Strengths + Improvements */}\n {/* Figma: border-top 1px #D9D9D9, padding-top 24px, gap 24px */}\n {(strengths.length > 0 || improvements.length > 0) && (\n <div style={{\n display: \"flex\",\n gap: 24,\n paddingTop: 24,\n borderTop: `1px solid ${COLORS.absent}`,\n }}>\n <CoachingColumn\n icon={<TrendingUp size={14} color={COLORS.strong} strokeWidth={1.5} />}\n label=\"Key Strengths\"\n items={strengths}\n />\n <CoachingColumn\n icon={<Lightbulb size={14} color={COLORS.strong} strokeWidth={1.5} />}\n label=\"Improvements\"\n items={improvements}\n />\n </div>\n )}\n </div>\n );\n};\n\nexport default UpdatedCoachingSynthesisCard;\n","import { useEffect, useRef, useState } from 'react';\nimport { ChevronDown, ChevronUp, Pencil } from 'lucide-react';\n\n/*\n * Figma node: 101-2385 / 495-803 (Context grid + More Details expandable)\n */\n\nfunction fmtDur(seconds) {\n const m = Math.floor(seconds / 60);\n const s = Math.round(seconds % 60);\n return `${m}:${s.toString().padStart(2, '0')}`;\n}\n\nconst ROW_STYLE = {\n display: 'flex',\n justifyContent: 'space-between',\n padding: '8px 8px 12px 8px',\n alignItems: 'center',\n gap: 24,\n fontFamily: 'var(--font-sans)',\n fontSize: 13,\n fontWeight: 400,\n lineHeight: 'normal',\n borderBottom: '1px solid var(--Grey-absent, #D9D9D9)',\n};\n\nconst COLUMN_STYLE = {\n display: 'flex',\n flexDirection: 'column',\n flex: '1 0 0',\n gap: 0,\n minWidth: 0,\n};\n\nconst UpdatedInteractionContext = ({\n meta = {},\n callPurpose = {},\n classification = {},\n dimensions = [],\n outcomeQuality = 'Neutral',\n onMoreDetails,\n moreDetails = [],\n resolutionOutcome,\n customerIntent,\n canShowEditButton = false,\n onEditInteraction,\n}) => {\n const [expanded, setExpanded] = useState(false);\n const moreDetailsRef = useRef(null);\n\n const duration = meta.duration_seconds != null ? fmtDur(meta.duration_seconds) : null;\n const messages = meta.message_count;\n const driver = callPurpose.interaction_driver;\n const paradigm = classification.interaction_paradigm;\n\n // Helper to find a dimension by key pattern\n const findDim = (keyPattern) => dimensions.find((d) => (d.key || '').toLowerCase().includes(keyPattern));\n\n // Auto-extract known dimensions — use explicit props first, then fall back to dimensions data\n const dimResolution = findDim('resolution_outcome');\n const dimIntent = findDim('customer_intent');\n const dimOutcomeQuality = findDim('outcome_quality');\n\n const fmtValue = (v) => v ? v.replace(/_/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase()) : null;\n\n const resolvedOutcomeQuality = outcomeQuality !== 'Neutral' ? outcomeQuality\n : dimOutcomeQuality ? fmtValue(dimOutcomeQuality.value)\n : outcomeQuality;\n\n const resolvedResolutionOutcome = resolutionOutcome ?? (dimResolution ? fmtValue(dimResolution.value) : null);\n const resolvedCustomerIntent = customerIntent ?? (dimIntent ? fmtValue(dimIntent.value) : null);\n\n // Keys to exclude from the generic dimensions grid (they go in dedicated spots)\n const excludedKeys = new Set(['resolution_outcome', 'customer_intent', 'outcome_quality'].map((k) => `dim.${k}`));\n const filteredDimensions = dimensions.filter((d) => !excludedKeys.has(d.key));\n\n // Build paired rows: [left, right] per line\n const pairedRows = [];\n const rawPairs = [\n [\n duration != null ? { label: 'Duration', value: duration } : null,\n messages != null ? { label: 'Messages', value: messages } : null,\n ],\n [\n driver != null ? { label: 'Driver', value: driver } : null,\n paradigm != null ? { label: 'Paradigm', value: paradigm } : null,\n ],\n ];\n\n // Add remaining dimension pairs (excluding the ones we extracted)\n for (let i = 0; i < filteredDimensions.length; i += 2) {\n const left = filteredDimensions[i] ? { label: filteredDimensions[i].display_name || filteredDimensions[i].label || filteredDimensions[i].key, value: fmtValue(filteredDimensions[i].value) } : null;\n const right = filteredDimensions[i + 1] ? { label: filteredDimensions[i + 1].display_name || filteredDimensions[i + 1].label || filteredDimensions[i + 1].key, value: fmtValue(filteredDimensions[i + 1].value) } : null;\n rawPairs.push([left, right]);\n }\n\n // Last row: Outcome Quality (left) + More details toggle (right)\n rawPairs.push([\n { label: 'Outcome Quality', value: resolvedOutcomeQuality },\n { isMoreDetails: true },\n ]);\n\n rawPairs.forEach((pair) => pairedRows.push(pair));\n\n // Build \"More Details\" expanded rows — auto-extracted from dimensions\n const detailRows = [\n resolvedResolutionOutcome != null && { label: 'Resolution Outcome', value: resolvedResolutionOutcome },\n resolvedCustomerIntent != null && { label: 'Customer Intent', value: resolvedCustomerIntent },\n ...(moreDetails || []),\n ].filter(Boolean);\n\n // Close \"More Details\" dropdown on outside click\n useEffect(() => {\n if (!expanded) return;\n\n const handleOutsideClick = (event) => {\n if (moreDetailsRef.current && !moreDetailsRef.current.contains(event.target)) {\n setExpanded(false);\n }\n };\n\n document.addEventListener('mousedown', handleOutsideClick);\n return () => document.removeEventListener('mousedown', handleOutsideClick);\n }, [expanded]);\n\n const renderRow = (item) => (\n <div\n key={item.label}\n style={ROW_STYLE}\n >\n <span style={{ color: 'var(--Grey-Strong, #2E3236)', whiteSpace: 'nowrap', flexShrink: 0 }}>\n {item.label}\n </span>\n <span style={{\n color: 'var(--Grey-Muted, #808183)',\n textAlign: 'right',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n minWidth: 0,\n }}>\n {item.value}\n </span>\n </div>\n );\n\n const renderMoreDetailsToggle = () => (\n <div\n key=\"more-details\"\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 12,\n padding: '8px 8px 12px 8px',\n fontFamily: 'var(--font-sans)',\n borderBottom: 'none',\n minHeight: 33,\n }}\n >\n <button\n onClick={() => {\n setExpanded((p) => !p);\n if (onMoreDetails && !expanded) onMoreDetails();\n }}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: 0,\n color: 'var(--Grey-Strong, #2E3236)',\n fontSize: 13,\n fontWeight: 500,\n lineHeight: 'normal',\n fontFamily: 'var(--font-sans)',\n whiteSpace: 'nowrap',\n flexShrink: 0,\n }}\n >\n <span>More Details</span>\n {expanded\n ? <ChevronUp size={16} color=\"var(--Grey-Muted, #808183)\" strokeWidth={1.5} />\n : <ChevronDown size={16} color=\"var(--Grey-Muted, #808183)\" strokeWidth={1.5} />\n }\n </button>\n\n {canShowEditButton && (\n <button\n onClick={onEditInteraction || (() => {})}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n padding: '5px 12px',\n background: 'var(--Grey-White, #FFF)',\n border: '1px solid var(--Grey-absent, #D9D9D9)',\n borderRadius: 12,\n color: 'var(--Grey-Strong, #2E3236)',\n fontSize: 13,\n fontWeight: 500,\n lineHeight: 'normal',\n fontFamily: 'var(--font-sans)',\n cursor: 'pointer',\n flexShrink: 0,\n }}\n >\n <Pencil size={15} color=\"var(--Grey-Strong, #2E3236)\" strokeWidth={1.5} />\n <span style={{ fontSize: 13, lineHeight: 'normal' }}>Edit</span>\n </button>\n )}\n </div>\n );\n\n return (\n <div\n ref={moreDetailsRef}\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignSelf: 'stretch',\n gap: 0,\n position: 'relative',\n overflow: 'visible',\n }}\n >\n {/* Paired rows — two columns side by side */}\n {pairedRows.map((pair, idx) => (\n <div\n key={idx}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 24,\n alignSelf: 'stretch',\n flexWrap: 'nowrap',\n }}\n >\n {/* Left cell */}\n <div style={COLUMN_STYLE}>\n {pair[0] && !pair[0].isMoreDetails ? renderRow(pair[0]) : <div style={{ flex: 1 }} />}\n </div>\n\n {/* Right cell */}\n <div style={COLUMN_STYLE}>\n {pair[1] && !pair[1].isMoreDetails\n ? renderRow(pair[1])\n : pair[1]?.isMoreDetails\n ? renderMoreDetailsToggle()\n : <div style={{ flex: 1 }} />}\n </div>\n </div>\n ))}\n\n {/* More Details dropdown — absolute, full width, left-aligned */}\n {expanded && detailRows.length > 0 && (\n <div\n style={{\n position: 'absolute',\n top: '100%',\n right: 0,\n marginTop: 4,\n display: 'flex',\n width: 340,\n flexDirection: 'column',\n alignItems: 'flex-start',\n borderRadius: 4,\n border: '1px solid var(--Grey-absent, #D9D9D9)',\n background: 'var(--Grey-White, #FFF)',\n boxShadow: '-2px 2px 2px 0 rgba(0, 0, 0, 0.25)',\n overflow: 'hidden',\n fontFamily: 'var(--font-sans)',\n zIndex: 50,\n }}\n >\n {/* Dropdown header */}\n <div style={{\n padding: '12px 16px',\n fontSize: 13,\n fontWeight: 600,\n color: 'var(--Grey-Strong, #2E3236)',\n borderBottom: '1px solid var(--Grey-absent, #D9D9D9)',\n alignSelf: 'stretch',\n }}>\n More details\n </div>\n\n {/* Detail rows */}\n {detailRows.map((row) => (\n <div\n key={row.label}\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '12px 16px',\n gap: 24,\n fontSize: 13,\n fontWeight: 400,\n lineHeight: 'normal',\n borderBottom: '1px solid var(--Grey-absent, #D9D9D9)',\n alignSelf: 'stretch',\n }}\n >\n <span style={{ color: 'var(--Grey-Strong, #2E3236)', whiteSpace: 'nowrap', flexShrink: 0 }}>\n {row.label}\n </span>\n <span style={{\n color: 'var(--Grey-Muted, #808183)',\n fontSize: 13,\n fontStyle: 'normal',\n fontWeight: 400,\n lineHeight: '120%',\n textAlign: 'right',\n }}>\n {row.value}\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n};\n\nexport default UpdatedInteractionContext;\n","import React from 'react';\nimport { ThumbsUp, ThumbsDown, Plus } from 'lucide-react';\n\n/*\n * Figma node: 101-2386 (Agent Lift Analysis)\n *\n * Container: fill=#F3F1E5, padding: 24px, gap: 24px, vertical,\n * border-radius: 8px, border: 1px solid #D9D9D9\n *\n * Header (Frame 12): vertical, gap: 32\n * Row (Frame 20): horizontal, space-between, center\n * \"Agent Lift Analysis\" — 15px/700/#2E3236, lh=120%\n * Right (Frame 18): horizontal, gap: 8, center\n * \"vs. Average Agent:\" — 13px/400/#2E3236, lh=120%\n * \"+4.3pp\" — 14px/700/#2E3236, lh=120%\n * Divider: border-left 1px #D9D9D9, padding-left: 8\n * ThumbsUp 14x14 + \"Positive\" 13px/700/#2E3236\n *\n * Metrics (Frame 15): horizontal, gap: 24, align: bottom\n * Col 1 (Frame 8): vertical, gap: 16, center\n * \"94%\" — 28px/400/#808183, lh=120%\n * Labels: vertical, gap: 8\n * \"Expected Outcome\" — 13px/400/#2E3236\n * \"Based on call type & difficulty\" — 13px/400/#808183\n * Plus icon: 16x16, fill=#2E3236, radius: 24, white stroke\n * Col 2 (Frame 9): vertical, gap: 16, pad-left: 24, border-left: 1px #D9D9D9\n * \"-11.0pp\" — 28px/400/#808183\n * \"Agent Impact\" — 13px/400/#2E3236\n * \"Behavior-driven change\" — 13px/400/#808183\n * Col 3 (Frame 7): vertical, gap: 16, pad-left: 24, border-left: 1px #D9D9D9\n * \"83%\" — 28px/400/#2E3236 (highlighted)\n * \"Predicted Outcome\" — 13px/700/#2E3236\n * \"With agent behaviors\" — 13px/400/#808183\n *\n * Key Drivers (Frame 13): vertical, gap: 4\n * \"Key Drivers\" — 12px/700/#2E3236, lh=120%\n * Chips (Frame 16): horizontal, gap: 4\n * Each: bg=#FFF, pad=8, radius=4, border 1px #D9D9D9\n * Text: 12px/400/#2E3236, lh=120%\n */\n\nconst COLORS = {\n strong: 'var(--Grey-Strong, #2E3236)',\n muted: 'var(--Grey-Muted, #808183)',\n absent: 'var(--Grey-absent, #D9D9D9)',\n white: 'var(--Grey-White, #FFF)',\n cardBg: 'var(--surface-warm-40, rgba(243, 241, 229, 0.40))',\n};\n\nconst LH = 1.2;\nconst MAX_VISIBLE_DRIVERS = 3;\n\nconst fmtPct = (v) => (v != null ? Math.round(v * 100) + '%' : '\\u2014');\n\nconst fmtPp = (v) => {\n if (v == null) return '\\u2014';\n const pp = (v * 100).toFixed(1);\n return v > 0 ? `+${pp}pp` : `${pp}pp`;\n};\n\nconst UpdatedInteractionScores = ({ outcomeLift, driverLabels = [] }) => {\n if (!outcomeLift || outcomeLift.lift == null) return null;\n\n const pExpected = outcomeLift.p_expected;\n const pFull = outcomeLift.p_full;\n const liftRaw =\n outcomeLift.lift_raw ??\n (pFull != null && pExpected != null ? pFull - pExpected : null);\n const liftRecentered = outcomeLift.lift;\n\n const liftBand = outcomeLift.interpretation?.lift_band\n ? outcomeLift.interpretation.lift_band.replace(/_/g, ' ')\n : liftRecentered >= 0\n ? 'Positive'\n : 'Negative';\n\n const liftBandCapitalized =\n liftBand.charAt(0).toUpperCase() + liftBand.slice(1);\n\n const isNegativeBand = /negative/i.test(liftBand);\n const LiftIcon = isNegativeBand ? ThumbsDown : ThumbsUp;\n\n const visibleDrivers = driverLabels.slice(0, MAX_VISIBLE_DRIVERS);\n const overflowCount = driverLabels.length - MAX_VISIBLE_DRIVERS;\n\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n padding: 24,\n gap: 24,\n borderRadius: 8,\n border: `1px solid ${COLORS.absent}`,\n background: COLORS.cardBg,\n alignSelf: 'stretch',\n }}\n >\n {/* Frame 12: Header + Metrics — vertical, gap: 32 */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: 32 }}>\n\n {/* Frame 20: Title row — horizontal, space-between, center */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 24,\n alignSelf: 'stretch',\n }}\n >\n <span\n style={{\n fontSize: 15,\n fontWeight: 600,\n color: COLORS.strong,\n fontFamily: 'var(--font-sans)',\n lineHeight: LH,\n }}\n >\n Agent Lift Analysis\n </span>\n\n {/* Frame 18: right meta — horizontal, gap: 8, center */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n fontFamily: 'var(--font-sans)',\n }}\n >\n <span style={{ fontSize: 13, fontWeight: 400, color: COLORS.strong, lineHeight: LH }}>\n vs. Average Agent:\n </span>\n {/* Frame 19: value */}\n <span style={{ fontSize: 14, fontWeight: 600, color: COLORS.strong, lineHeight: LH }}>\n {fmtPp(liftRecentered)}\n </span>\n {/* Frame 21: divider + thumbsup + band */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n paddingLeft: 8,\n borderLeft: `1px solid ${COLORS.absent}`,\n }}\n >\n <LiftIcon size={14} color={COLORS.strong} />\n <span style={{ fontSize: 13, fontWeight: 600, color: COLORS.strong, lineHeight: LH }}>\n {liftBandCapitalized}\n </span>\n </div>\n </div>\n </div>\n\n {/* Frame 15: Metrics row — horizontal, gap: 24 */}\n <div\n style={{\n display: 'flex',\n gap: 24,\n }}\n >\n {/* Frame 8: Expected Outcome — flex: 1, equal width */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: 16, alignItems: 'flex-start', flex: 1, minWidth: 0 }}>\n <span style={{ fontSize: 28, fontWeight: 400, color: COLORS.muted, fontFamily: 'var(--font-sans)', lineHeight: LH }}>\n {fmtPct(pExpected)}\n </span>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8, alignItems: 'flex-start', minHeight: 48 }}>\n <span style={{ fontSize: 13, fontWeight: 400, color: COLORS.strong, fontFamily: 'var(--font-sans)', lineHeight: LH, whiteSpace: 'nowrap' }}>\n Expected Outcome\n </span>\n <span style={{ fontSize: 13, fontWeight: 400, color: COLORS.muted, fontFamily: 'var(--font-sans)', lineHeight: LH, textAlign: 'left' }}>\n Based on call type & difficulty\n </span>\n </div>\n </div>\n\n {/* Frame 9: Agent Impact — flex: 1, equal width, border-left */}\n <div style={{\n display: 'flex', flexDirection: 'column', gap: 16, alignItems: 'flex-start',\n paddingLeft: 24, borderLeft: `1px solid ${COLORS.absent}`, flex: 1, minWidth: 0,\n }}>\n <span style={{ fontSize: 28, fontWeight: 400, color: COLORS.muted, fontFamily: 'var(--font-sans)', lineHeight: LH }}>\n {fmtPp(liftRaw)}\n </span>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8, alignItems: 'flex-start', minHeight: 48 }}>\n <span style={{ fontSize: 13, fontWeight: 400, color: COLORS.strong, fontFamily: 'var(--font-sans)', lineHeight: LH, whiteSpace: 'nowrap' }}>\n Agent Impact\n </span>\n <span style={{ fontSize: 13, fontWeight: 400, color: COLORS.muted, fontFamily: 'var(--font-sans)', lineHeight: LH, textAlign: 'left' }}>\n Behavior-driven change\n </span>\n </div>\n </div>\n\n {/* Frame 7: Predicted Outcome — flex: 1, equal width, border-left */}\n <div style={{\n display: 'flex', flexDirection: 'column', gap: 16, alignItems: 'flex-start',\n paddingLeft: 24, borderLeft: `1px solid ${COLORS.absent}`, flex: 1, minWidth: 0,\n }}>\n <span style={{ fontSize: 28, fontWeight: 400, color: COLORS.strong, fontFamily: 'var(--font-sans)', lineHeight: LH }}>\n {fmtPct(pFull)}\n </span>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8, alignItems: 'flex-start', minHeight: 48 }}>\n <span style={{ fontSize: 13, fontWeight: 600, color: COLORS.strong, fontFamily: 'var(--font-sans)', lineHeight: LH, whiteSpace: 'nowrap' }}>\n Predicted Outcome\n </span>\n <span style={{ fontSize: 13, fontWeight: 400, color: COLORS.muted, fontFamily: 'var(--font-sans)', lineHeight: LH, textAlign: 'left' }}>\n With agent behaviors\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Frame 13: Key Drivers — vertical, gap: 4 */}\n {driverLabels.length > 0 && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4, alignSelf: 'stretch' }}>\n <span\n style={{\n fontSize: 12,\n fontWeight: 600,\n color: COLORS.strong,\n fontFamily: 'var(--font-sans)',\n lineHeight: LH,\n }}\n >\n Key Drivers\n </span>\n {/* Frame 16: chips — horizontal, gap: 4 */}\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>\n {visibleDrivers.map((label, i) => (\n <div\n key={i}\n style={{\n display: 'flex',\n padding: 8,\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 4,\n border: `1px solid ${COLORS.absent}`,\n background: COLORS.white,\n }}\n >\n <span\n style={{\n fontSize: 12,\n fontWeight: 400,\n color: COLORS.strong,\n fontFamily: 'var(--font-sans)',\n lineHeight: LH,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n maxWidth: 200,\n }}\n >\n {label}\n </span>\n </div>\n ))}\n {overflowCount > 0 && (\n <div\n style={{\n display: 'flex',\n padding: 8,\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 4,\n border: `1px solid ${COLORS.absent}`,\n background: COLORS.white,\n }}\n >\n <span\n style={{\n fontSize: 12,\n fontWeight: 400,\n color: COLORS.strong,\n fontFamily: 'var(--font-sans)',\n lineHeight: LH,\n whiteSpace: 'nowrap',\n }}\n >\n + {overflowCount}\n </span>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default UpdatedInteractionScores;\n","import { useState } from 'react';\nimport { ChevronDown, ChevronUp, PlayCircle, PauseCircle, FileSignal, ScrollText } from 'lucide-react';\n\n/* Hover circle wrapper for icons */\nconst HoverIcon = ({ children, size = 28, onClick, title }) => {\n const [hovered, setHovered] = useState(false);\n return (\n <div\n title={title}\n onClick={onClick}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: size,\n height: size,\n borderRadius: 9999,\n background: hovered ? 'var(--surface-hover, #F3F7F7)' : 'transparent',\n cursor: 'pointer',\n flexShrink: 0,\n transition: 'background 0.15s',\n }}\n >\n {children}\n </div>\n );\n};\n\n/*\n * Figma node: 222-672 (Signals accordion)\n *\n * Header: FileSignal icon in #F3F7F7 circle + \"Signals\" 15px/500 + \"N Signals Detected\" 14px/500\n *\n * Accordion Title (collapsed): horizontal, gap: 12, pad: 8 0, border-bottom: 1px #D9D9D9\n * Name: 14px/600/#0B0A0A, lh: 171%\n * Chevron: 20x20, stroke #767473\n *\n * Accordion Body (reason): horizontal, gap: 12, pad: 8 0, space-between\n * Reason: 14px/400/#767473, lh: 150%\n * Right: ScrollText icon 16x16 #808183 + time 13px/400/#808183\n *\n * Evidence (Frame 39): horizontal, gap: 8, pad: 8 0\n * Play circle: ~17px, stroke #808183\n * Quote: 13px/400/#2E3236, lh: 120%\n */\n\nconst UpdatedInteractionSignals = ({\n signals = { signals: [], present_count: 0, total_signals_evaluated: 0 },\n expandedSignals = new Set(),\n toggleSignal = () => {},\n playEvidence = () => {},\n highlightTurns = () => {},\n onShowInTranscript = () => {},\n timelinePlaying = false,\n currentTimeSeconds = 0,\n}) => {\n const signalList = signals?.signals ?? [];\n const presentCount = signals?.present_count ?? signalList.length;\n\n const fmtMs = (ms) => {\n const minutes = Math.floor(ms / 60000);\n const seconds = Math.floor((ms % 60000) / 1000);\n return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n };\n\n const isEvPlaying = (ev) =>\n timelinePlaying &&\n ev.start_ms != null &&\n currentTimeSeconds * 1000 >= ev.start_ms &&\n currentTimeSeconds * 1000 <= (ev.end_ms ?? ev.start_ms + 5000);\n\n return (\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n alignSelf: 'stretch',\n width: '100%',\n gap: 16,\n }}>\n {/* ── Header: icon + \"Signals\" + count ── */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: 16,\n width: '100%',\n }}>\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 34,\n height: 34,\n borderRadius: 9999,\n background: 'var(--surface-hover, #F3F7F7)',\n flexShrink: 0,\n }}>\n <FileSignal size={20} color=\"#2E3236\" strokeWidth={1.5} />\n </div>\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n flex: 1,\n }}>\n <span style={{\n fontSize: 15,\n fontWeight: 500,\n color: 'var(--Grey-Strong, #2E3236)',\n }}>\n Signals\n </span>\n <span style={{\n fontSize: 14,\n fontWeight: 500,\n color: 'var(--Grey-Strong, #2E3236)',\n }}>\n {presentCount} Signals Detected\n </span>\n </div>\n </div>\n\n {/* ── Signal list (accordion) ── */}\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n alignSelf: 'stretch',\n background: 'var(--Grey-White, #FFF)',\n gap: 8,\n }}>\n {signalList.length === 0 && (\n <div style={{\n padding: '8px 0',\n fontSize: 14,\n color: 'var(--Grey-Muted, #808183)',\n }}>\n No signals detected.\n </div>\n )}\n\n {signalList.map((signal, idx) => {\n const key = signal.key ?? signal.id ?? idx;\n const isExpanded = expandedSignals.has(key);\n const obsCount = signal.observations?.length ?? 0;\n\n return (\n <div\n key={key}\n id={`signal-${key}`}\n style={{\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n gap: 8,\n }}\n >\n {/* ── Accordion Title — signal row ── */}\n <button\n onClick={() => toggleSignal(key)}\n style={{\n display: 'flex',\n padding: '8px 0',\n alignItems: 'center',\n gap: 12,\n alignSelf: 'stretch',\n width: '100%',\n background: 'none',\n border: 'none',\n borderBottom: '1px solid var(--Grey-absent, #D9D9D9)',\n cursor: 'pointer',\n }}\n >\n <span style={{\n flex: 1,\n textAlign: 'left',\n fontSize: 14,\n fontWeight: 600,\n color: 'var(--text-dark, #0B0A0A)',\n lineHeight: 1.71,\n }}>\n {signal.display_name || signal.key?.replace(/_/g, ' ')}\n {obsCount > 0 && (\n <span style={{\n fontWeight: 600,\n color: 'var(--text-dark, #0B0A0A)',\n marginLeft: 6,\n }}>\n ({obsCount})\n </span>\n )}\n </span>\n {isExpanded ? (\n <ChevronUp size={20} color=\"#767473\" />\n ) : (\n <ChevronDown size={20} color=\"#767473\" />\n )}\n </button>\n\n {/* ── Expanded: Observations ── */}\n {isExpanded && signal.observations?.length > 0 && (\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n alignSelf: 'stretch',\n gap: 0,\n }}>\n {signal.observations.map((obs, obsIdx) => (\n <div\n key={obs.key ?? obsIdx}\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignSelf: 'stretch',\n gap: 8,\n }}\n >\n {/* Accordion Body — reason + timestamp */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: 12,\n padding: '8px 0',\n justifyContent: 'space-between',\n }}>\n <span style={{\n flex: 1,\n fontSize: 14,\n fontWeight: 400,\n color: 'var(--text-subtle-warm, #767473)',\n lineHeight: 1.5,\n }}>\n {obs.reason || obs.explanation}\n </span>\n {obs.evidence?.[0]?.start_ms != null && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n flexShrink: 0,\n }}\n >\n <HoverIcon\n size={28}\n title=\"Show in transcript\"\n onClick={(e) => {\n e.stopPropagation();\n onShowInTranscript(obs.evidence[0].start_ms);\n }}\n >\n <ScrollText size={16} color=\"#808183\" strokeWidth={1.5} />\n </HoverIcon>\n <span style={{\n fontSize: 13,\n fontWeight: 400,\n color: 'var(--Grey-Muted, #808183)',\n lineHeight: 1.2,\n whiteSpace: 'nowrap',\n }}>\n {fmtMs(obs.evidence[0].start_ms)}\n </span>\n </div>\n )}\n </div>\n\n {/* Evidence quotes — Frame 39 */}\n {obs.evidence?.map((ev, evIdx) => {\n const hasTimestamps = ev.start_ms != null && ev.end_ms != null;\n return ev.text && (\n <div\n key={evIdx}\n onClick={(e) => {\n e.stopPropagation();\n if (hasTimestamps) playEvidence(ev);\n }}\n onMouseEnter={() => highlightTurns(ev.turn_ids ?? [])}\n onMouseLeave={() => highlightTurns([])}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '8px 0',\n cursor: hasTimestamps ? 'pointer' : 'default',\n }}\n >\n {hasTimestamps && (\n <HoverIcon size={28}>\n {isEvPlaying(ev) ? (\n <PauseCircle\n size={17}\n color=\"var(--Grey-Muted, #808183)\"\n strokeWidth={1.5}\n />\n ) : (\n <PlayCircle\n size={17}\n color=\"var(--Grey-Muted, #808183)\"\n strokeWidth={1}\n />\n )}\n </HoverIcon>\n )}\n <span style={{\n fontSize: 13,\n fontWeight: 400,\n color: 'var(--Grey-Strong, #2E3236)',\n lineHeight: 1.2,\n }}>\n “{ev.text}”\n </span>\n </div>\n );\n })}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n\nexport default UpdatedInteractionSignals;\n","import React, { useState, useRef } from 'react';\nimport { Info } from 'lucide-react';\n\n/*\n * Figma node: 270-6494 (Compass Score card)\n *\n * Container: padding: 24px, border-radius: 8px, border: 1px solid #D9D9D9,\n * background: #FFF, gap: 24px, vertical\n *\n * Title: \"Compass Score\" 15px/700/#2E3236\n * Description: 14px/400/#808183\n *\n * Content: horizontal, gap: 48, center both axes\n * Left: Meter 243x200 (SVG from Figma export)\n * Right: Legends vertical, gap: 8, centered\n * Each: label 12px/400/#2E3236 + Info 14px stroke=#ACACAD\n * Score bar: 5 segments 22x6, gap: 2, filled=#2E3236, empty=#E3E1D7\n */\n\nconst COLORS = {\n strong: 'var(--Grey-Strong, #2E3236)',\n muted: 'var(--Grey-Muted, #808183)',\n absent: 'var(--Grey-absent, #D9D9D9)',\n white: 'var(--Grey-White, #FFF)',\n accent: 'var(--rail-orange, #C98A5A)',\n track: 'var(--rail-surface-2, #E3E1D7)',\n infoIcon: 'var(--color-input-border, #ACACAD)',\n};\n\n// Gauge using stroke-based semi-circle arcs — matching Figma node 270-6499\n// Compass score scale: 0.5 to 5.0 (supports 0.5 increments)\n// Visual scale is always 5 segments, where each segment represents 1 point.\nconst GaugeMeter = ({ score = 4, minScore = 0, maxScore = 5 }) => {\n const svgW = 243;\n const svgH = 130;\n const cx = svgW / 2;\n const cy = svgH - 7;\n const r = 85; // mid-radius of the arc\n const sw = 30; // stroke-width (thickness of the arc band)\n const totalSeg = 5; // always render 5 visual steps\n const numericScore = Number(score);\n const clampedScore = Number.isFinite(numericScore)\n ? Math.min(Math.max(numericScore, minScore), maxScore)\n : minScore;\n const filledUnits = maxScore > minScore\n ? ((clampedScore - minScore) / (maxScore - minScore)) * totalSeg\n : 0;\n const segDeg = 180 / totalSeg; // 36° per segment\n\n // Convert polar (degrees, 0°=right, CCW) to SVG x,y (Y-down)\n const toXY = (angleDeg) => {\n const rad = (angleDeg * Math.PI) / 180;\n return {\n x: cx + r * Math.cos(rad),\n y: cy - r * Math.sin(rad),\n };\n };\n\n // SVG arc from startDeg to endDeg (both in math convention: 0=right, 180=left)\n // We draw clockwise in SVG (sweep-flag=1) from higher angle to lower angle\n const strokeArc = (fromDeg, toDeg) => {\n const s = toXY(fromDeg);\n const e = toXY(toDeg);\n const large = (fromDeg - toDeg) > 180 ? 1 : 0;\n return `M ${s.x} ${s.y} A ${r} ${r} 0 ${large} 1 ${e.x} ${e.y}`;\n };\n\n const gap = 2; // degrees gap between segments\n\n return (\n <svg width=\"100%\" viewBox={`0 0 ${svgW} ${svgH}`} fill=\"none\" style={{ maxWidth: svgW }}>\n {/* Segments from left (180°) to right (0°) */}\n {Array.from({ length: totalSeg }, (_, i) => {\n const fromA = 180 - i * segDeg - (i > 0 ? gap / 2 : 0);\n const toA = 180 - (i + 1) * segDeg + (i < totalSeg - 1 ? gap / 2 : 0);\n const segmentFill = Math.max(0, Math.min(1, filledUnits - i));\n const pathD = strokeArc(fromA, toA);\n return (\n <g key={i}>\n {/* Base track segment */}\n <path\n d={pathD}\n stroke={COLORS.track}\n strokeWidth={sw}\n strokeLinecap=\"butt\"\n fill=\"none\"\n />\n {/* Filled overlay can be full or half (or any partial) */}\n {segmentFill > 0 && (\n <path\n d={pathD}\n stroke={COLORS.strong}\n strokeWidth={sw}\n strokeLinecap=\"butt\"\n fill=\"none\"\n pathLength={1}\n strokeDasharray={`${segmentFill} 1`}\n />\n )}\n </g>\n );\n })}\n </svg>\n );\n};\n\nconst ScoreBar = ({ value = 0, maxValue = 5 }) => {\n const numericValue = Number(value);\n const clampedValue = Number.isFinite(numericValue)\n ? Math.min(Math.max(numericValue, 0), maxValue)\n : 0;\n\n return (\n <div style={{ display: 'flex', gap: 2 }}>\n {Array.from({ length: maxValue }, (_, i) => {\n const segmentFill = Math.max(0, Math.min(1, clampedValue - i));\n return (\n <div\n key={i}\n style={{\n width: 22,\n height: 6,\n borderRadius: 1,\n background: COLORS.track,\n overflow: 'hidden',\n }}\n >\n {segmentFill > 0 && (\n <div\n style={{\n width: `${segmentFill * 100}%`,\n height: '100%',\n background: COLORS.strong,\n }}\n />\n )}\n </div>\n );\n })}\n </div>\n );\n};\n\nconst LEGEND_TOOLTIPS = {\n 'CSAT': 'Predicted Customer Satisfaction',\n 'Resolution': 'Predicted Resolution: was the issue fully resolved?',\n 'Process Adherence': 'Process Adherence: Did the agent follow procedures?',\n 'Communication': 'Predicted Communication Quality: Clarity, Empathy, Professionalism',\n};\n\nconst InfoTooltip = ({ text, children }) => {\n const [show, setShow] = useState(false);\n const ref = useRef(null);\n const [pos, setPos] = useState({ top: 0, left: 0 });\n\n const handleEnter = () => {\n if (ref.current) {\n const rect = ref.current.getBoundingClientRect();\n setPos({\n top: rect.top - 8,\n left: rect.left + rect.width / 2,\n });\n }\n setShow(true);\n };\n\n return (\n <div\n ref={ref}\n style={{ position: 'relative', display: 'inline-flex' }}\n onMouseEnter={handleEnter}\n onMouseLeave={() => setShow(false)}\n >\n {children}\n {show && (\n <div style={{\n position: 'fixed',\n top: pos.top,\n left: pos.left,\n transform: 'translate(-50%, -100%)',\n display: 'flex',\n width: 'max-content',\n maxWidth: 300,\n padding: 10,\n alignItems: 'center',\n borderRadius: 4,\n border: '1px solid var(--Grey-absent, #D9D9D9)',\n background: 'var(--Grey-Strong, #2E3236)',\n zIndex: 9999,\n pointerEvents: 'none',\n }}>\n <span style={{\n color: '#FFF',\n fontSize: 12,\n fontWeight: 400,\n lineHeight: '140%',\n }}>\n {text}\n </span>\n </div>\n )}\n </div>\n );\n};\n\nconst LegendItem = ({ label, value = 0, maxValue = 5 }) => (\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 8,\n padding: 8,\n alignItems: 'flex-start',\n }}>\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n }}>\n <span style={{\n fontSize: 12,\n fontWeight: 400,\n color: COLORS.strong,\n fontFamily: 'var(--font-sans)',\n lineHeight: 'normal',\n }}>\n {label}\n </span>\n <InfoTooltip text={LEGEND_TOOLTIPS[label] || label}>\n <Info size={14} color={COLORS.infoIcon} strokeWidth={1} style={{ cursor: 'pointer' }} />\n </InfoTooltip>\n </div>\n <ScoreBar value={value} maxValue={maxValue} />\n </div>\n);\n\nconst UpdatedCompassScore = ({\n score = 4,\n minScore = 0,\n maxScore = 5,\n predictedScore = 4,\n predictedLabel = 'Predicted Objective',\n description = '',\n legends = [\n { label: 'CSAT', value: 3 },\n { label: 'Resolution', value: 4 },\n { label: 'Process Adherence', value: 5 },\n { label: 'Communication', value: 3 },\n ],\n}) => {\n const numericScore = Number(score);\n const clampedScore = Number.isFinite(numericScore)\n ? Math.min(Math.max(numericScore, minScore), maxScore)\n : minScore;\n const displayScore = clampedScore.toFixed(1);\n\n return (\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n padding: 24,\n borderRadius: 8,\n border: `1px solid ${COLORS.absent}`,\n background: COLORS.white,\n alignSelf: 'stretch',\n flex: 1,\n gap: 24,\n }}>\n {/* Section Title — left-aligned, vertical, gap: 8 */}\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 8,\n }}>\n <span style={{\n fontSize: 15,\n fontWeight: 600,\n color: COLORS.strong,\n fontFamily: 'var(--font-sans)',\n lineHeight: 1.2,\n }}>\n Interaction Quality\n </span>\n <span style={{\n fontSize: 14,\n fontWeight: 400,\n color: COLORS.muted,\n fontFamily: 'var(--font-sans)',\n lineHeight: 'normal',\n }}>\n {description}\n </span>\n </div>\n\n {/* Content: Meter (left) + Legends (right) */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 24,\n flex: 1,\n overflow: 'hidden',\n }}>\n {/* Left: Gauge + Pin + Score number */}\n <div style={{\n position: 'relative',\n maxWidth: 243,\n minWidth: 160,\n flex: '0 1 243px',\n flexDirection: 'column',\n alignItems: 'center',\n display: 'flex',\n }}>\n <GaugeMeter score={score} minScore={minScore} maxScore={maxScore} />\n\n {/* Compass pin — centered below gauge, needle rotates to point at score */}\n {(() => {\n // Pin sits at gauge center; needle rotates from 180° (score=0) to 0° (score=max)\n const pct = maxScore > minScore ? (clampedScore - minScore) / (maxScore - minScore) : 0;\n // SVG pin's default needle points to top-right (~45°)\n // We need: score=0 → needle points left (180°), score=max → needle points right (0°)\n // Target angle on gauge: 180 - pct*180\n // Pin default orientation: needle at ~45° from top → offset is 45\n // Rotation needed: -(targetAngle - 45) to align needle with gauge position\n const targetAngle = 180 - pct * 180;\n const rotateDeg = -(targetAngle - 45);\n return (\n <svg\n width=\"34\" height=\"35\" viewBox=\"0 0 34 35\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{\n marginTop: -24,\n transform: `rotate(${rotateDeg}deg)`,\n transformOrigin: 'center center',\n }}\n >\n <path d=\"M16 25.2169C19.958 25.2169 23.1667 22.0083 23.1667 18.0503C23.1667 14.0922 19.958 10.8836 16 10.8836C12.042 10.8836 8.83334 14.0922 8.83334 18.0503C8.83334 22.0083 12.042 25.2169 16 25.2169Z\" fill=\"var(--rail-orange, #C98A5A)\" />\n <path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"M30.4791 11.2328L33.4351 0L21.6888 3.09113C19.9212 2.41855 18.0036 2.05025 16 2.05025C7.16344 2.05025 0 9.2137 0 18.0503C0 26.8868 7.16344 34.0503 16 34.0503C24.8366 34.0503 32 26.8868 32 18.0503C32 15.6119 31.4546 13.301 30.4791 11.2328ZM16 30.5503C22.9036 30.5503 28.5 24.9538 28.5 18.0503C28.5 11.1467 22.9036 5.55025 16 5.55025C9.09644 5.55025 3.5 11.1467 3.5 18.0503C3.5 24.9538 9.09644 30.5503 16 30.5503Z\" fill=\"var(--rail-orange, #C98A5A)\" />\n </svg>\n );\n })()}\n\n {/* Score number below gauge */}\n <div style={{\n fontSize: 28,\n fontWeight: 400,\n color: COLORS.strong,\n fontFamily: 'var(--font-sans)',\n lineHeight: 1,\n textAlign: 'center',\n marginTop: 8,\n }}>\n {displayScore}\n </div>\n <div style={{\n fontSize: 15,\n fontWeight: 500,\n color: COLORS.strong,\n fontFamily: 'var(--font-sans)',\n lineHeight: 1.2,\n textAlign: 'center',\n marginTop: 8,\n }}>\n Compass Score\n </div>\n </div>\n\n {/* Right: Predicted Score + Legends */}\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 8,\n alignItems: 'flex-start',\n justifyContent: 'center',\n flex: 1,\n }}>\n {/* Overall Score title */}\n <div style={{\n fontSize: 15,\n fontWeight: 500,\n color: COLORS.strong,\n fontFamily: 'var(--font-sans)',\n lineHeight: 1.2,\n textAlign: 'left',\n }}>\n Interaction Quality Index\n </div>\n\n {/* Divider */}\n <div style={{\n width: '100%',\n height: 1,\n background: COLORS.absent,\n }} />\n\n {/* Legend items */}\n {legends.map((legend, i) => (\n <LegendItem\n key={i}\n label={legend.label}\n value={legend.value}\n />\n ))}\n </div>\n </div>\n </div>\n );\n};\n\nexport default UpdatedCompassScore;\n","\"use client\";\n\nimport React, { useState, useRef, useMemo, useEffect } from \"react\";\nimport {\n MessagesSquare,\n Ellipsis,\n CircleCheck,\n Check,\n CornerDownRight,\n Info,\n X,\n} from \"lucide-react\";\n\n/* ─── helpers ─── */\n\nconst roleColorMap = (role) => {\n if (!role) return null;\n const normalized = String(role).trim().toLowerCase();\n const roleTokens = normalized.split(/[^a-z]+/).filter(Boolean);\n if (roleTokens.includes(\"supervisor\")) return \"var(--rail-compliance, #C98A5A)\";\n if (\n roleTokens.includes(\"admin\") ||\n roleTokens.includes(\"administrator\") ||\n roleTokens.includes(\"superadmin\")\n ) {\n return \"var(--rail-discovery, #5E88B0)\";\n }\n if (roleTokens.includes(\"agent\")) return \"var(--rail-outcome, #6B7C93)\";\n return null;\n};\n\nconst extractRoleValue = (user) => {\n if (!user) return null;\n const directRole =\n user.role ??\n user.userRole ??\n user.user_role ??\n user.author_role ??\n user.roleName ??\n user.role_name ??\n user.userType ??\n user.user_type ??\n user.type;\n\n if (typeof directRole === \"string\") return directRole;\n if (Array.isArray(directRole)) return directRole.join(\" \");\n if (directRole && typeof directRole === \"object\") {\n return directRole.name || directRole.value || directRole.label || null;\n }\n\n const nestedRole =\n user.user?.role ??\n user.user?.userRole ??\n user.user?.user_role ??\n user.profile?.role ??\n user.profile?.userRole ??\n user.profile?.user_role;\n\n if (typeof nestedRole === \"string\") return nestedRole;\n if (Array.isArray(nestedRole)) return nestedRole.join(\" \");\n if (nestedRole && typeof nestedRole === \"object\") {\n return nestedRole.name || nestedRole.value || nestedRole.label || null;\n }\n\n return null;\n};\n\n/** Role-mapped color first so stale `color` from auth/session does not override role (matches thread intent). */\nconst resolveCurrentUserAvatarColor = (user) => {\n if (!user) return \"#6B7C93\";\n const role = extractRoleValue(user);\n return roleColorMap(role) || user.color || \"#6B7C93\";\n};\n\nconst getInitials = (name) =>\n (name || \"\")\n .split(\" \")\n .map((w) => w[0])\n .join(\"\")\n .toUpperCase() || \"U\";\n\nconst isWithinEditWindow = (value) => {\n if (!value) return true; // optimistic/new comments are editable\n if (value === \"Just now\") return true;\n if (/^\\d{4}-\\d{2}-\\d{2}T/.test(value)) {\n try {\n const utcValue = /Z$|[+-]\\d{2}:\\d{2}$/.test(value) ? value : value + \"Z\";\n const d = new Date(utcValue);\n if (Number.isNaN(d.getTime())) return false;\n return (Date.now() - d.getTime()) < 15 * 60 * 1000;\n } catch { return false; }\n }\n // Parse relative timestamps like \"5 min\", \"1 h\", \"2 days\"\n const minMatch = value.match(/^(\\d+)\\s*min/);\n if (minMatch) return parseInt(minMatch[1], 10) < 15;\n // Anything in hours or days is beyond 15 min\n if (/\\d+\\s*h/.test(value) || /\\d+\\s*day/.test(value)) return false;\n return true;\n};\n\nconst formatTimestamp = (value) => {\n if (!value) return \"\";\n if (!/^\\d{4}-\\d{2}-\\d{2}T/.test(value)) return value;\n try {\n // Append Z if missing so timestamp is parsed as UTC\n const utcValue = /Z$|[+-]\\d{2}:\\d{2}$/.test(value) ? value : value + \"Z\";\n const d = new Date(utcValue);\n if (Number.isNaN(d.getTime())) return value;\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffMin = Math.floor(diffMs / 60000);\n const diffHr = Math.floor(diffMs / 3600000);\n if (diffMin < 1) return \"Just now\";\n if (diffMin < 60) return `${diffMin} min`;\n if (diffHr < 24) return `${diffHr} h`;\n const diffDays = Math.floor(diffHr / 24);\n if (diffDays === 1) return \"1 day\";\n return `${diffDays} days`;\n } catch {\n return value;\n }\n};\n\n/* ─── Avatar (36 × 36) ─── */\nconst Avatar = ({ name, initials, color, avatar, size = 36 }) => {\n if (avatar) {\n return (\n <img\n src={avatar}\n alt={name}\n style={{\n width: size,\n height: size,\n borderRadius: \"50%\",\n objectFit: \"cover\",\n flexShrink: 0,\n }}\n />\n );\n }\n return (\n <div\n style={{\n width: size,\n height: size,\n borderRadius: \"50%\",\n background: color || \"#6B7C93\",\n color: \"#FFF\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: size <= 32 ? \"10px\" : \"11px\",\n fontWeight: 650,\n flexShrink: 0,\n fontFamily: \"var(--default-font-family)\",\n letterSpacing: \"0.02em\",\n }}\n title={name}\n >\n {initials || getInitials(name)}\n </div>\n );\n};\n\n/* ============================================\n COMMENT ROW — Figma node 593-1135 (top-level)\n display: flex\n width: 552px\n align-items: flex-start\n gap: 16px\n\n Reply row — Figma node 593-2042\n display: flex\n padding-left: 48px\n align-items: flex-start\n gap: 16px\n ============================================ */\nconst CommentBubble = ({\n comment,\n isReply = false,\n isConsecutive = false,\n onReply,\n onSendReply,\n onEdit,\n onDelete,\n onMenuClick,\n showReply = true,\n}) => {\n const [hovered, setHovered] = useState(false);\n const [menuOpen, setMenuOpen] = useState(false);\n const [replyOpen, setReplyOpen] = useState(false);\n const [replyValue, setReplyValue] = useState(\"\");\n const [editOpen, setEditOpen] = useState(false);\n const [editValue, setEditValue] = useState(\"\");\n const [confirmDelete, setConfirmDelete] = useState(false);\n const menuRef = useRef(null);\n const replyRef = useRef(null);\n const editRef = useRef(null);\n const author = comment.author || {};\n const authorName = author.name || comment.author_name || \"Unknown\";\n const initials = author.initials || getInitials(authorName);\n const role = author.role || comment.author_role;\n const avatarColor = author.color || roleColorMap(role) || \"#6B7C93\";\n const avatarImg = author.avatar || comment.avatar;\n const rawTimestamp = comment.timestamp || comment.created_at;\n const timestamp = formatTimestamp(rawTimestamp);\n const canEdit = isWithinEditWindow(rawTimestamp);\n const isEdited = Boolean(comment.isEdited || comment.is_edited || comment.edited);\n\n const paragraphs = Array.isArray(comment.content)\n ? comment.content\n : [comment.content || comment.text || \"\"];\n\n // Close menu on outside click\n React.useEffect(() => {\n if (!menuOpen) return;\n const handler = (e) => {\n if (menuRef.current && !menuRef.current.contains(e.target)) setMenuOpen(false);\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [menuOpen]);\n\n // Auto-resize reply textarea\n React.useEffect(() => {\n const ta = replyRef.current;\n if (!ta) return;\n ta.style.height = \"auto\";\n const max = 140;\n ta.style.height = Math.min(ta.scrollHeight, max) + \"px\";\n ta.style.overflowY = ta.scrollHeight > max ? \"auto\" : \"hidden\";\n }, [replyValue, replyOpen]);\n\n // Auto-resize edit textarea\n React.useEffect(() => {\n const ta = editRef.current;\n if (!ta) return;\n ta.style.height = \"auto\";\n const max = 140;\n ta.style.height = Math.min(ta.scrollHeight, max) + \"px\";\n ta.style.overflowY = ta.scrollHeight > max ? \"auto\" : \"hidden\";\n }, [editValue, editOpen]);\n\n return (\n <div\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n style={{\n display: \"flex\",\n paddingLeft: isReply ? 48 : 0,\n alignItems: \"flex-start\",\n gap: 16,\n paddingTop: isConsecutive ? 0 : 8,\n paddingBottom: 8,\n }}\n >\n {/* Avatar — 36 × 36 (hidden for consecutive messages, keep space) */}\n {isConsecutive ? (\n <div style={{ width: 36, flexShrink: 0 }} />\n ) : (\n <Avatar\n name={authorName}\n initials={initials}\n color={avatarColor}\n avatar={avatarImg}\n />\n )}\n\n {/* Content column */}\n <div style={{ flex: 1, minWidth: 0 }}>\n {/* Header row — always shows menu, name/time hidden for consecutive */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: isConsecutive ? \"flex-end\" : \"space-between\",\n marginBottom: isConsecutive ? 0 : 6,\n }}\n >\n {!isConsecutive && (\n <div style={{ display: \"flex\", alignItems: \"baseline\", gap: 8 }}>\n {/* Name — 13px / 650 / #1E2125 */}\n <span\n style={{\n fontSize: 13,\n fontWeight: 650,\n color: \"var(--text-ink, #1E2125)\",\n lineHeight: \"150%\",\n fontFamily: \"var(--default-font-family)\",\n }}\n >\n {authorName}\n </span>\n {/* Timestamp — 12px / 400 / #808183 */}\n <span\n style={{\n fontSize: 12,\n fontWeight: 400,\n color: \"var(--Grey-Muted, #808183)\",\n lineHeight: \"150%\",\n fontFamily: \"var(--default-font-family)\",\n }}\n >\n {timestamp}\n </span>\n {isEdited && (\n <span\n style={{\n fontSize: 12,\n fontWeight: 400,\n color: \"var(--Grey-Muted, #808183)\",\n lineHeight: \"150%\",\n fontFamily: \"var(--default-font-family)\",\n }}\n >\n (Edited)\n </span>\n )}\n </div>\n )}\n\n {/* Three-dot menu — Ellipsis 24×24, hover only + dropdown */}\n <div style={{ position: \"relative\" }} ref={menuRef}>\n <button\n type=\"button\"\n onClick={() => setMenuOpen((p) => !p)}\n style={{\n padding: 2,\n border: \"none\",\n background: \"transparent\",\n cursor: \"pointer\",\n borderRadius: 4,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n opacity: hovered || menuOpen ? 1 : 0,\n transition: \"opacity 0.15s\",\n flexShrink: 0,\n }}\n >\n <Ellipsis size={24} color=\"var(--Grey-Muted, #808183)\" />\n </button>\n\n {/* Dropdown — Figma node 486-4493 */}\n {menuOpen && (\n <div\n style={{\n position: \"absolute\",\n top: \"100%\",\n right: 0,\n marginTop: 4,\n display: \"flex\",\n width: 99,\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n borderRadius: 4,\n border: \"1px solid var(--Grey-absent, #D9D9D9)\",\n background: \"var(--Grey-White, #FFF)\",\n boxShadow: \"-2px 2px 2px 0 rgba(0, 0, 0, 0.25)\",\n zIndex: 50,\n overflow: \"hidden\",\n }}\n >\n {onReply && (\n <button\n type=\"button\"\n onClick={() => { setMenuOpen(false); setEditOpen(false); setReplyOpen(true); }}\n style={{\n display: \"flex\",\n width: \"100%\",\n padding: \"10px 16px\",\n alignItems: \"center\",\n border: \"none\",\n background: \"transparent\",\n cursor: \"pointer\",\n fontSize: 13,\n fontWeight: 400,\n color: \"var(--Grey-Strong, #2E3236)\",\n fontFamily: \"var(--default-font-family)\",\n lineHeight: \"150%\",\n textAlign: \"left\",\n }}\n onMouseEnter={(e) => { e.currentTarget.style.background = \"var(--surface-hover, #F3F7F7)\"; }}\n onMouseLeave={(e) => { e.currentTarget.style.background = \"transparent\"; }}\n >\n Reply\n </button>\n )}\n {onEdit && (\n <button\n type=\"button\"\n disabled={!canEdit}\n onClick={() => {\n if (!canEdit) return;\n setMenuOpen(false);\n const text = Array.isArray(comment.content)\n ? comment.content.join(\"\\n\")\n : (comment.content || comment.text || \"\");\n setEditValue(text);\n setEditOpen(true);\n setReplyOpen(false);\n }}\n style={{\n display: \"flex\",\n width: \"100%\",\n padding: \"10px 16px\",\n alignItems: \"center\",\n border: \"none\",\n background: \"transparent\",\n cursor: canEdit ? \"pointer\" : \"not-allowed\",\n fontSize: 13,\n fontWeight: 400,\n color: canEdit ? \"var(--Grey-Strong, #2E3236)\" : \"var(--Grey-Muted, #808183)\",\n fontFamily: \"var(--default-font-family)\",\n lineHeight: \"150%\",\n textAlign: \"left\",\n opacity: canEdit ? 1 : 0.5,\n }}\n onMouseEnter={(e) => { if (canEdit) e.currentTarget.style.background = \"var(--surface-hover, #F3F7F7)\"; }}\n onMouseLeave={(e) => { e.currentTarget.style.background = \"transparent\"; }}\n >\n Edit\n </button>\n )}\n {onDelete && (\n <button\n type=\"button\"\n onClick={() => { setMenuOpen(false); setConfirmDelete(true); }}\n style={{\n display: \"flex\",\n width: \"100%\",\n padding: \"10px 16px\",\n alignItems: \"center\",\n border: \"none\",\n background: \"transparent\",\n cursor: \"pointer\",\n fontSize: 13,\n fontWeight: 400,\n color: \"var(--Grey-Strong, #2E3236)\",\n fontFamily: \"var(--default-font-family)\",\n lineHeight: \"150%\",\n textAlign: \"left\",\n }}\n onMouseEnter={(e) => { e.currentTarget.style.background = \"var(--surface-hover, #F3F7F7)\"; }}\n onMouseLeave={(e) => { e.currentTarget.style.background = \"transparent\"; }}\n >\n Delete\n </button>\n )}\n </div>\n )}\n </div>\n </div>\n\n {/* Edit mode — card with editable input */}\n {editOpen ? (\n <div\n style={{\n display: \"flex\",\n width: 662,\n maxWidth: \"100%\",\n padding: \"8px 12px 12px 12px\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n alignItems: \"flex-start\",\n gap: 24,\n borderRadius: 8,\n border: \"1px solid var(--Grey-absent, #D9D9D9)\",\n background: \"var(--Grey-White, #FFF)\",\n boxSizing: \"border-box\",\n marginTop: 4,\n }}\n >\n {/* Header with author name + close */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n width: \"100%\",\n }}\n >\n <span\n style={{\n fontSize: 13,\n fontWeight: 600,\n color: \"var(--Grey-Muted, #808183)\",\n fontFamily: \"var(--default-font-family)\",\n lineHeight: \"normal\",\n }}\n >\n {\"\\u201C\"} {comment.author?.name || \"Unknown\"}\n </span>\n <button\n type=\"button\"\n onClick={() => setEditOpen(false)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: 0,\n }}\n >\n <X size={20} color=\"var(--Grey-Muted, #808183)\" />\n </button>\n </div>\n {/* Editable input + Save */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"flex-end\",\n gap: 8,\n width: \"100%\",\n }}\n >\n <textarea\n ref={editRef}\n value={editValue}\n onChange={(e) => setEditValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n if (e.metaKey || e.ctrlKey || e.shiftKey) {\n // Allow newline insertion\n return;\n }\n e.preventDefault();\n if (editValue.trim()) {\n onEdit?.({ ...comment, content: editValue.trim(), isEdited: true });\n setEditOpen(false);\n }\n }\n if (e.key === \"Escape\") { setEditOpen(false); }\n }}\n autoFocus\n rows={1}\n style={{\n flex: 1,\n padding: \"10px 12px\",\n fontSize: 13,\n fontWeight: 400,\n color: \"var(--text-ink, #1E2125)\",\n fontFamily: \"var(--default-font-family)\",\n lineHeight: \"160%\",\n border: \"none\",\n background: \"transparent\",\n outline: \"none\",\n boxSizing: \"border-box\",\n resize: \"none\",\n minHeight: 24,\n maxHeight: 140,\n overflowY: \"hidden\",\n }}\n />\n <button\n type=\"button\"\n onClick={() => {\n if (editValue.trim()) {\n onEdit?.({ ...comment, content: editValue.trim(), isEdited: true });\n setEditOpen(false);\n }\n }}\n disabled={!editValue.trim()}\n style={{\n display: \"flex\",\n padding: \"6px 16px\",\n justifyContent: \"center\",\n alignItems: \"center\",\n fontSize: 13,\n fontWeight: 600,\n color: editValue.trim()\n ? \"var(--Grey-White, #FFF)\"\n : \"var(--Grey-Muted, #808183)\",\n background: editValue.trim()\n ? \"var(--Grey-Strong, #2E3236)\"\n : \"var(--grey-light, #e9e8e8a1)\",\n border: \"none\",\n borderRadius: 6,\n cursor: editValue.trim() ? \"pointer\" : \"not-allowed\",\n fontFamily: \"var(--default-font-family)\",\n flexShrink: 0,\n transition: \"all 0.15s\",\n lineHeight: \"150%\",\n }}\n >\n Save\n </button>\n </div>\n </div>\n ) : (\n /* Message bubbles — stacked, gap: 4px, fit content */\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4, alignItems: \"flex-start\" }}>\n {paragraphs.map((paragraph, idx) => (\n <div\n key={idx}\n style={{\n fontSize: 13,\n fontWeight: 400,\n color: \"var(--text-ink, #1E2125)\",\n lineHeight: \"160%\",\n fontFamily: \"var(--default-font-family)\",\n padding: \"8px 12px\",\n background: isReply\n ? \"var(--surface-hover, #F3F7F7)\"\n : \"var(--surface-warm-40, rgba(243, 241, 229, 0.40))\",\n borderRadius: 8,\n wordBreak: \"break-word\",\n whiteSpace: \"pre-wrap\",\n }}\n >\n {paragraph}\n </div>\n ))}\n </div>\n )}\n\n {/* Inline delete confirmation */}\n {confirmDelete && (\n <div\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n marginTop: 8,\n fontSize: 13,\n fontFamily: \"var(--default-font-family)\",\n }}\n >\n <span style={{ color: \"var(--Grey-Muted, #808183)\", fontWeight: 400 }}>\n Confirm: delete this comment?\n </span>\n <button\n type=\"button\"\n onClick={() => { setConfirmDelete(false); onDelete?.(comment); }}\n style={{\n background: \"var(--grey-light, #e9e8e8a1)\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 13,\n fontWeight: 600,\n color: \"var(--text-ink, #1E2125)\",\n fontFamily: \"var(--default-font-family)\",\n padding: \"4px 10px\",\n borderRadius: 6,\n transition: \"background 0.15s\",\n }}\n onMouseEnter={(e) => { e.currentTarget.style.background = \"var(--Grey-absent, #D9D9D9)\"; }}\n onMouseLeave={(e) => { e.currentTarget.style.background = \"var(--grey-light, #e9e8e8a1)\"; }}\n >\n Delete\n </button>\n <button\n type=\"button\"\n onClick={() => setConfirmDelete(false)}\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 13,\n fontWeight: 400,\n color: \"var(--Grey-Muted, #808183)\",\n fontFamily: \"var(--default-font-family)\",\n padding: \"4px 10px\",\n borderRadius: 6,\n transition: \"background 0.15s\",\n }}\n onMouseEnter={(e) => { e.currentTarget.style.background = \"var(--grey-light, #e9e8e8a1)\"; }}\n onMouseLeave={(e) => { e.currentTarget.style.background = \"none\"; }}\n >\n Cancel\n </button>\n </div>\n )}\n\n {/* Reply action — CornerDownRight 20×20 + \"Reply\" */}\n {showReply && onReply && !replyOpen && !confirmDelete && (\n <button\n type=\"button\"\n onClick={() => { setEditOpen(false); setReplyOpen(true); }}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n marginTop: 8,\n padding: 0,\n border: \"none\",\n background: \"transparent\",\n cursor: \"pointer\",\n fontSize: 13,\n fontWeight: 400,\n color: \"var(--Grey-Muted, #808183)\",\n fontFamily: \"var(--default-font-family)\",\n transition: \"color 0.15s\",\n }}\n >\n <CornerDownRight size={20} color=\"var(--Grey-Muted, #808183)\" strokeWidth={1.5} />\n Reply\n </button>\n )}\n\n {/* Inline reply input */}\n {replyOpen && (\n <div\n style={{\n display: \"flex\",\n width: 662,\n maxWidth: \"100%\",\n padding: \"8px 12px 12px 12px\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n alignItems: \"flex-start\",\n gap: 24,\n borderRadius: 8,\n border: \"1px solid var(--Grey-absent, #D9D9D9)\",\n background: \"var(--Grey-White, #FFF)\",\n boxSizing: \"border-box\",\n marginTop: 12,\n }}\n >\n {/* Tagged comment quote */}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8, width: \"100%\" }}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n width: \"100%\",\n }}\n >\n <span\n style={{\n fontSize: 13,\n fontWeight: 600,\n color: \"var(--Grey-Muted, #808183)\",\n fontFamily: \"var(--default-font-family)\",\n lineHeight: \"normal\",\n }}\n >\n {\"\\u201C\"} {comment.author?.name || \"Unknown\"}\n </span>\n <button\n type=\"button\"\n onClick={() => { setReplyValue(\"\"); setReplyOpen(false); }}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: 0,\n }}\n >\n <X size={20} color=\"var(--Grey-Muted, #808183)\" />\n </button>\n </div>\n <div\n style={{\n display: \"flex\",\n height: 36,\n padding: 16,\n alignItems: \"center\",\n gap: 5,\n borderRadius: \"0 8px 8px 8px\",\n background: \"var(--Grey-Strong, #2E3236)\",\n boxSizing: \"border-box\",\n width: \"100%\",\n }}\n >\n <span\n style={{\n color: \"var(--Grey-White, #FFF)\",\n fontSize: 13,\n fontWeight: 400,\n fontFamily: \"var(--default-font-family)\",\n lineHeight: \"normal\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {Array.isArray(comment.content) ? comment.content[0] : comment.content}\n </span>\n </div>\n </div>\n {/* Reply input + Post button */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"flex-end\",\n gap: 8,\n width: \"100%\",\n }}\n >\n <textarea\n ref={replyRef}\n value={replyValue}\n onChange={(e) => setReplyValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n if (e.metaKey || e.ctrlKey || e.shiftKey) {\n // Allow newline insertion\n return;\n }\n e.preventDefault();\n if (replyValue.trim()) {\n onSendReply?.({ content: replyValue.trim(), parentId: comment.id });\n setReplyValue(\"\");\n setReplyOpen(false);\n }\n }\n if (e.key === \"Escape\") {\n setReplyValue(\"\");\n setReplyOpen(false);\n }\n }}\n autoFocus\n placeholder=\"Add a reply\"\n rows={1}\n style={{\n flex: 1,\n padding: \"10px 12px\",\n fontSize: 13,\n fontWeight: 400,\n color: \"var(--text-ink, #1E2125)\",\n fontFamily: \"var(--default-font-family)\",\n lineHeight: \"160%\",\n border: \"none\",\n background: \"transparent\",\n outline: \"none\",\n boxSizing: \"border-box\",\n resize: \"none\",\n minHeight: 24,\n maxHeight: 140,\n overflowY: \"hidden\",\n }}\n />\n <button\n type=\"button\"\n onClick={() => {\n if (replyValue.trim()) {\n onSendReply?.({ content: replyValue.trim(), parentId: comment.id });\n setReplyValue(\"\");\n setReplyOpen(false);\n }\n }}\n disabled={!replyValue.trim()}\n style={{\n display: \"flex\",\n height: 28,\n padding: \"8px 12px\",\n justifyContent: \"center\",\n alignItems: \"center\",\n gap: 8,\n fontSize: 13,\n fontWeight: 600,\n color: replyValue.trim()\n ? \"var(--Grey-White, #FFF)\"\n : \"var(--Grey-Muted, #808183)\",\n background: replyValue.trim()\n ? \"var(--Neutral-850, #272727)\"\n : \"var(--grey-light, #e9e8e8a1)\",\n border: \"none\",\n borderRadius: 10,\n cursor: replyValue.trim() ? \"pointer\" : \"not-allowed\",\n fontFamily: \"var(--default-font-family)\",\n lineHeight: \"150%\",\n }}\n >\n Post\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n};\n\n/* ============================================\n COMMENT INPUT — Figma node 237-5570\n display: flex\n width: 552px\n padding: 12px\n flex-direction: column\n justify-content: center\n align-items: flex-start\n gap: 24px\n\n border-radius: 8px\n border: 1px solid var(--Grey-absent, #D9D9D9)\n background: var(--Grey-White, #FFF)\n ============================================ */\nconst CommentInput = ({ currentUser, onSubmit }) => {\n const [value, setValue] = useState(\"\");\n const [isFocused, setIsFocused] = useState(false);\n const textareaRef = useRef(null);\n\n useEffect(() => {\n const ta = textareaRef.current;\n if (!ta) return;\n ta.style.height = \"auto\";\n const max = 140;\n ta.style.height = Math.min(ta.scrollHeight, max) + \"px\";\n ta.style.overflowY = ta.scrollHeight > max ? \"auto\" : \"hidden\";\n }, [value]);\n\n const handleSubmit = () => {\n const trimmed = value.trim();\n if (!trimmed) return;\n onSubmit?.(trimmed);\n setValue(\"\");\n };\n\n const handleKeyDown = (e) => {\n if (e.key === \"Enter\") {\n if (e.metaKey || e.ctrlKey || e.shiftKey) {\n // Allow newline insertion\n return;\n }\n e.preventDefault();\n handleSubmit();\n }\n };\n\n const initials = currentUser?.initials || getInitials(currentUser?.name);\n const color = resolveCurrentUserAvatarColor(currentUser);\n const avatarImg = currentUser?.avatar;\n\n return (\n <div style={{ display: \"flex\", gap: 16, alignItems: \"flex-start\" }}>\n {/* Current user avatar */}\n <Avatar\n name={currentUser?.name}\n initials={initials}\n color={color}\n avatar={avatarImg}\n />\n\n {/* Input container — Figma: 552px, padding 12, border-radius 8 */}\n <div\n style={{\n flex: 1,\n padding: 12,\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n alignItems: \"flex-start\",\n gap: 24,\n borderRadius: 8,\n border: isFocused\n ? \"1px solid var(--Grey-Strong, #2E3236)\"\n : \"1px solid var(--Grey-absent, #D9D9D9)\",\n background: \"var(--Grey-White, #FFF)\",\n transition: \"border-color 0.15s\",\n }}\n >\n {/* Textarea + Post row */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"flex-end\",\n gap: 8,\n width: \"100%\",\n }}\n >\n <textarea\n ref={textareaRef}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n onKeyDown={handleKeyDown}\n placeholder=\"Add feedback\"\n rows={1}\n style={{\n flex: 1,\n border: \"none\",\n outline: \"none\",\n resize: \"none\",\n fontSize: 13,\n fontWeight: 400,\n color: \"var(--text-ink, #1E2125)\",\n fontFamily: \"var(--default-font-family)\",\n lineHeight: \"160%\",\n background: \"transparent\",\n padding: 0,\n minHeight: 24,\n maxHeight: 140,\n overflowY: \"hidden\",\n }}\n />\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={!value.trim()}\n style={{\n display: \"flex\",\n padding: \"6px 16px\",\n justifyContent: \"center\",\n alignItems: \"center\",\n fontSize: 13,\n fontWeight: 600,\n color: value.trim()\n ? \"var(--Grey-White, #FFF)\"\n : \"var(--Grey-Muted, #808183)\",\n background: value.trim()\n ? \"var(--Grey-Strong, #2E3236)\"\n : \"var(--grey-light, #e9e8e8a1)\",\n border: \"none\",\n borderRadius: 6,\n cursor: value.trim() ? \"pointer\" : \"not-allowed\",\n fontFamily: \"var(--default-font-family)\",\n transition: \"all 0.15s\",\n flexShrink: 0,\n lineHeight: \"150%\",\n }}\n >\n Post\n </button>\n </div>\n </div>\n </div>\n );\n};\n\n/* ============================================\n MAIN COMPONENT: UpdatedThreads\n\n Outer container — full width\n Header (237-5556):\n display: flex\n height: 40px\n padding-bottom: 8px\n align-items: center\n gap: 16px\n align-self: stretch\n border-bottom: 1px solid var(--Grey-absent, #D9D9D9)\n\n Comments + Input wrapper (596-2060):\n display: flex\n padding-top: 24px\n flex-direction: column\n align-items: flex-start\n gap: 10px\n align-self: stretch\n border-top: 1px solid var(--Grey-absent, #D9D9D9)\n width: 552px (content area)\n ============================================ */\n\nconst CommentThread = ({ comment, depth = 0, isConsecutive = false, onReply, onSendReply, onEdit, onDelete, onMenuClick }) => {\n const hasReplies = comment.replies && comment.replies.length > 0;\n const isLastAtDepth = !hasReplies;\n return (\n <React.Fragment>\n <div style={{ paddingLeft: depth > 0 ? Math.min(depth * 32, 128) : 0 }}>\n <CommentBubble\n comment={comment}\n isReply={depth > 0}\n isConsecutive={isConsecutive}\n onReply={onReply}\n onSendReply={onSendReply}\n onEdit={onEdit}\n onDelete={onDelete}\n onMenuClick={onMenuClick}\n showReply={isLastAtDepth}\n />\n </div>\n {hasReplies && comment.replies.map((reply) => (\n <CommentThread\n key={reply.id}\n comment={reply}\n depth={depth + 1}\n onReply={onReply}\n onSendReply={onSendReply}\n onEdit={onEdit}\n onDelete={onDelete}\n onMenuClick={onMenuClick}\n />\n ))}\n </React.Fragment>\n );\n};\n\nconst UpdatedThreads = ({\n comments: externalComments = [],\n totalComments,\n children,\n onSendComment,\n onReply,\n onSendReply,\n onEdit,\n onDelete,\n onMenuClick,\n onMarkResolved,\n currentUser,\n isResolved = false,\n}) => {\n // Local state for optimistic updates (replies, new comments, edits, deletes)\n const [localComments, setLocalComments] = useState([]);\n const [isSending, setIsSending] = useState(false);\n\n // Merge external + local comments\n const allComments = useMemo(() => {\n const externalIds = new Set(externalComments.map((c) => c.id));\n // Filter out local comments that now exist in external (API caught up)\n const newLocal = localComments.filter((c) => !externalIds.has(c.id));\n return [...externalComments, ...newLocal];\n }, [externalComments, localComments]);\n\n // Sync: remove local comments when external updates\n React.useEffect(() => {\n const externalIds = new Set(externalComments.map((c) => c.id));\n setLocalComments((prev) => prev.filter((c) => !externalIds.has(c.id)));\n }, [externalComments]);\n\n const displayCurrentUser = useMemo(() => {\n if (!currentUser) return { name: \"You\", initials: \"YO\", color: \"#6B7C93\" };\n const name = currentUser.name || \"You\";\n const initials = currentUser.initials || getInitials(name);\n const color = resolveCurrentUserAvatarColor(currentUser);\n return { ...currentUser, name, initials, color };\n }, [currentUser]);\n\n const handleSendReply = async ({ content, parentId }) => {\n if (onSendReply) {\n // Host app mode — let API handle it, show loading\n setIsSending(true);\n try {\n await onSendReply({ content, parentId });\n } finally {\n setIsSending(false);\n }\n } else {\n // Library demo mode — optimistic local comment\n const optimisticReply = {\n id: `temp-${Date.now()}`,\n author: displayCurrentUser,\n content,\n timestamp: \"Just now\",\n parentId,\n isOptimistic: true,\n };\n setLocalComments((prev) => [...prev, optimisticReply]);\n }\n };\n\n const handleSendComment = async (text) => {\n if (onSendComment) {\n // Host app mode — let API handle it, show loading\n setIsSending(true);\n try {\n await onSendComment(text);\n } finally {\n setIsSending(false);\n }\n } else {\n // Library demo mode — optimistic local comment\n const optimisticComment = {\n id: `temp-${Date.now()}`,\n author: displayCurrentUser,\n content: text,\n timestamp: \"Just now\",\n isOptimistic: true,\n };\n setLocalComments((prev) => [...prev, optimisticComment]);\n }\n };\n\n const handleEdit = (comment) => {\n // If it's a local optimistic comment, update locally\n setLocalComments((prev) =>\n prev.map((c) => (c.id === comment.id ? { ...c, content: comment.content, isEdited: true } : c))\n );\n onEdit?.(comment);\n };\n\n const handleDelete = (comment) => {\n // Remove from local state immediately\n setLocalComments((prev) => prev.filter((c) => c.id !== comment.id));\n onDelete?.(comment);\n };\n\n const groupedComments = useMemo(() => {\n const repliesByParent = {};\n allComments.forEach((c) => {\n if (c.parentId) {\n if (!repliesByParent[c.parentId]) repliesByParent[c.parentId] = [];\n repliesByParent[c.parentId].push(c);\n }\n });\n const buildTree = (comment) => ({\n ...comment,\n replies: (repliesByParent[comment.id] || []).map(buildTree),\n });\n return allComments.filter((c) => !c.parentId).map(buildTree);\n }, [allComments]);\n\n const commentCount = totalComments ?? allComments.length;\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n background: \"var(--Grey-White, #FFF)\",\n width: \"100%\",\n fontFamily: \"var(--default-font-family)\",\n }}\n >\n {/* ═══════════════════════════════════════════\n HEADER — FEEDBACK & GUIDANCE\n ═══════════════════════════════════════════ */}\n <div\n style={{\n display: \"flex\",\n height: 40,\n paddingBottom: 8,\n alignItems: \"center\",\n gap: 8,\n alignSelf: \"stretch\",\n }}\n >\n <MessagesSquare size={24} color=\"var(--rail-orange, #C98A5A)\" strokeWidth={1.5} />\n <span\n style={{\n fontSize: 16,\n fontWeight: 600,\n color: \"var(--Grey-Strong, #2E3236)\",\n textTransform: \"uppercase\",\n lineHeight: 1.2,\n }}\n >\n Feedback & Guidance\n </span>\n </div>\n\n {/* Divider */}\n <div style={{ width: \"100%\", height: 1, background: \"var(--Grey-absent, #D9D9D9)\" }} />\n\n {/* ═══════════════════════════════════════════\n CONTENT AREA — Two equal columns\n ═══════════════════════════════════════════ */}\n <div\n style={{\n display: \"flex\",\n gap: 24,\n alignSelf: \"stretch\",\n }}\n >\n {/* Left column — Feedback / Comments */}\n <div style={{ flex: 1, minWidth: 0 }}>\n {/* Feedback sub-header */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 16,\n paddingTop: 16,\n paddingBottom: 8,\n }}\n >\n <div\n style={{\n width: 34,\n height: 34,\n borderRadius: 9999,\n background: \"var(--surface-hover, #F3F7F7)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n <MessagesSquare style={{ width: 20, height: 20, flexShrink: 0 }} color=\"var(--Grey-Strong, #2E3236)\" strokeWidth={1.5} />\n </div>\n <span\n style={{\n fontSize: 15,\n fontWeight: 500,\n color: \"var(--Grey-Strong, #2E3236)\",\n }}\n >\n Feedback\n </span>\n <span\n style={{\n fontSize: 13,\n fontWeight: 400,\n color: \"var(--Grey-Muted, #808183)\",\n fontFamily: \"var(--default-font-family)\",\n lineHeight: \"150%\",\n marginLeft: \"auto\",\n }}\n >\n {commentCount} Comment{commentCount !== 1 ? \"s\" : \"\"}\n </span>\n {isResolved ? (\n <div\n style={{\n display: \"inline-flex\",\n height: 32,\n padding: \"12px 16px 12px 12px\",\n justifyContent: \"center\",\n alignItems: \"center\",\n gap: 8,\n borderRadius: 10,\n background: \"var(--Rail-Surface-2, #E3E1D7)\",\n flexShrink: 0,\n }}\n >\n <Check size={16} color=\"var(--Grey-Strong, #2E3236)\" strokeWidth={2} />\n <span\n style={{\n fontSize: 13,\n fontWeight: 500,\n color: \"var(--Grey-Strong, #2E3236)\",\n fontFamily: \"var(--default-font-family)\",\n lineHeight: \"150%\",\n }}\n >\n Resolved\n </span>\n </div>\n ) : onMarkResolved ? (\n <button\n type=\"button\"\n onClick={onMarkResolved}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"8px 16px\",\n fontSize: 13,\n fontWeight: 500,\n color: \"var(--Grey-Strong, #2E3236)\",\n background: \"var(--Grey-White, #FFF)\",\n border: \"1px solid var(--Grey-absent, #D9D9D9)\",\n borderRadius: 20,\n cursor: \"pointer\",\n fontFamily: \"var(--default-font-family)\",\n transition: \"background 0.15s\",\n lineHeight: \"150%\",\n flexShrink: 0,\n }}\n >\n <CircleCheck size={16} color=\"var(--Grey-Strong, #2E3236)\" strokeWidth={1.5} />\n Mark as Resolved\n </button>\n ) : null}\n </div>\n {/* Comments list */}\n {allComments.length > 0 && (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 0,\n marginBottom: 24,\n maxHeight: 600,\n overflowY: allComments.length > 6 ? \"auto\" : \"visible\",\n }}\n >\n {groupedComments.map((comment, idx) => {\n const prev = idx > 0 ? groupedComments[idx - 1] : null;\n const prevAuthor = prev?.author?.name || prev?.author_name;\n const currAuthor = comment.author?.name || comment.author_name;\n const isConsecutive = prev && prevAuthor === currAuthor && (!prev.replies || prev.replies.length === 0);\n return (\n <CommentThread\n key={comment.id}\n comment={comment}\n depth={0}\n isConsecutive={!!isConsecutive}\n onReply={onReply}\n onSendReply={handleSendReply}\n onEdit={handleEdit}\n onDelete={handleDelete}\n onMenuClick={onMenuClick}\n />\n );\n })}\n </div>\n )}\n\n {/* Edit info hint */}\n {allComments.length > 0 && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n marginBottom: 16,\n marginLeft: 48,\n }}\n >\n <Info size={16} color=\"var(--Grey-Muted, #808183)\" />\n <span\n style={{\n color: \"var(--Grey-Muted, #808183)\",\n fontSize: 13,\n fontStyle: \"normal\",\n fontWeight: 400,\n lineHeight: \"normal\",\n }}\n >\n Comments can be edited within 15 minutes.\n </span>\n </div>\n )}\n\n {/* Loading indicator */}\n {isSending && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"8px 0\",\n }}\n >\n <div\n style={{\n width: 16,\n height: 16,\n border: \"2px solid var(--Grey-absent, #D9D9D9)\",\n borderTopColor: \"var(--Grey-Strong, #2E3236)\",\n borderRadius: \"50%\",\n animation: \"spin 0.8s linear infinite\",\n }}\n />\n <span\n style={{\n fontSize: 13,\n color: \"var(--Grey-Muted, #808183)\",\n fontFamily: \"var(--default-font-family)\",\n }}\n >\n Sending...\n </span>\n <style>{`@keyframes spin { to { transform: rotate(360deg); } }`}</style>\n </div>\n )}\n\n {/* Comment input */}\n <CommentInput currentUser={displayCurrentUser} onSubmit={handleSendComment} />\n </div>\n\n {/* Right column — Guidance (rendered via children) */}\n <div\n style={{\n flex: 1,\n minWidth: 0,\n }}\n >\n {children}\n </div>\n </div>\n </div>\n );\n};\n\nexport default UpdatedThreads;\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { Lightbulb, PlayCircle, PauseCircle, ScrollText } from \"lucide-react\";\n\n/**\n * UpdatedGuidance — Guidance list for interaction details.\n *\n * Figma node: 822-15273\n *\n * Props:\n * - items Array Guidance items\n * - loading boolean Show loading state\n * - onPlayEvidence fn Called with { start_ms, end_ms } to play audio segment\n * - onShowInTranscript fn Called with start_ms to scroll transcript\n *\n * Item shape:\n * - title string Guidance text\n * - signal_refs Array<{ display_name, confidence }>\n * - start_ms number Evidence start time in ms\n * - end_ms number Evidence end time in ms\n */\n\n/* ── Hover icon wrapper (same as UpdatedInteractionSignals) ── */\nconst HoverIcon = ({ children, size = 28, onClick, title }) => {\n const [hovered, setHovered] = useState(false);\n return (\n <div\n title={title}\n onClick={onClick}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: size,\n height: size,\n borderRadius: 9999,\n background: hovered ? \"var(--surface-hover, #F3F7F7)\" : \"transparent\",\n cursor: \"pointer\",\n flexShrink: 0,\n transition: \"background 0.15s\",\n }}\n >\n {children}\n </div>\n );\n};\n\nconst fmtMs = (ms) => {\n const minutes = Math.floor(ms / 60000);\n const seconds = Math.floor((ms % 60000) / 1000);\n return `${minutes.toString().padStart(2, \"0\")}:${seconds.toString().padStart(2, \"0\")}`;\n};\n\n/* ── Single guidance item ── */\nconst GuidanceItem = ({ item, isLast, onPlayEvidence, onShowInTranscript, timelinePlaying, currentTimeSeconds }) => {\n const signalText = item.signal_refs\n ?.map((sr) => {\n const name = sr.display_name || sr.signal_key || \"\";\n const pct =\n sr.confidence != null ? ` (${Math.round(sr.confidence * 100)}%)` : \"\";\n return name + pct;\n })\n .join(\", \");\n\n const startMs = item.start_ms ?? item.startMs;\n const endMs = item.end_ms ?? item.endMs;\n const hasTimestamp = startMs != null;\n\n // Check if audio is currently playing within this item's time range\n const currentMs = (currentTimeSeconds ?? 0) * 1000;\n const isPlayingThisItem =\n timelinePlaying &&\n hasTimestamp &&\n currentMs >= startMs &&\n currentMs <= (endMs ?? startMs + 5000);\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n padding: \"12px 0\",\n borderBottom: isLast\n ? \"none\"\n : \"1px solid var(--Grey-absent, #D9D9D9)\",\n }}\n >\n {/* Guidance title */}\n <span\n style={{\n alignSelf: \"stretch\",\n fontSize: 14,\n fontWeight: 400,\n color: \"var(--Grey-Strong, #2E3236)\",\n lineHeight: \"150%\",\n }}\n >\n {item.title || item.detail || \"\"}\n </span>\n\n {/* Signal ref + action icons row */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n }}\n >\n {signalText && (\n <span\n style={{\n fontSize: 14,\n fontWeight: 400,\n color: \"var(--Grey-Muted, #808183)\",\n fontFamily: \"var(--default-font-family)\",\n lineHeight: \"150%\",\n flex: 1,\n minWidth: 0,\n }}\n >\n {signalText}\n </span>\n )}\n {hasTimestamp && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n flexShrink: 0,\n }}\n >\n <HoverIcon\n size={28}\n title={isPlayingThisItem ? \"Pause\" : \"Play evidence\"}\n onClick={() =>\n onPlayEvidence?.({\n start_ms: startMs,\n end_ms: endMs,\n })\n }\n >\n {isPlayingThisItem ? (\n <PauseCircle\n size={17}\n color=\"var(--Grey-Strong, #2E3236)\"\n strokeWidth={1}\n />\n ) : (\n <PlayCircle\n size={17}\n color=\"var(--Grey-Muted, #808183)\"\n strokeWidth={1}\n />\n )}\n </HoverIcon>\n <HoverIcon\n size={28}\n title=\"Show in transcript\"\n onClick={() => onShowInTranscript?.(startMs)}\n >\n <ScrollText size={16} color=\"#808183\" strokeWidth={1.5} />\n </HoverIcon>\n <span\n style={{\n fontSize: 13,\n fontWeight: 400,\n color: \"var(--Grey-Muted, #808183)\",\n lineHeight: 1.2,\n whiteSpace: \"nowrap\",\n }}\n >\n {fmtMs(startMs)}\n </span>\n </div>\n )}\n </div>\n </div>\n );\n};\n\n/* ── Main Component ── */\nconst UpdatedGuidance = ({\n items = [],\n guidanceCount,\n loading = false,\n onPlayEvidence,\n onShowInTranscript,\n timelinePlaying = false,\n currentTimeSeconds = 0,\n}) => {\n const count = guidanceCount ?? items.length;\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"stretch\",\n width: \"100%\",\n }}\n >\n {/* Sub-header — icon + Guidance + count */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 16,\n paddingTop: 16,\n paddingBottom: 8,\n }}\n >\n <div\n style={{\n width: 34,\n height: 34,\n borderRadius: 9999,\n background: \"var(--surface-hover, #F3F7F7)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n <Lightbulb\n style={{ width: 20, height: 20, flexShrink: 0 }}\n color=\"var(--Grey-Strong, #2E3236)\"\n strokeWidth={1.5}\n />\n </div>\n <span\n style={{\n fontSize: 15,\n fontWeight: 500,\n color: \"var(--Grey-Strong, #2E3236)\",\n }}\n >\n Guidance\n </span>\n <span\n style={{\n fontSize: 13,\n fontWeight: 400,\n color: \"var(--Grey-Muted, #808183)\",\n fontFamily: \"var(--default-font-family)\",\n lineHeight: \"150%\",\n marginLeft: \"auto\",\n }}\n >\n {count} Item{count !== 1 ? \"s\" : \"\"}\n </span>\n </div>\n\n {items.map((item, i) => (\n <GuidanceItem\n key={i}\n item={item}\n isLast={i === items.length - 1}\n onPlayEvidence={onPlayEvidence}\n onShowInTranscript={onShowInTranscript}\n timelinePlaying={timelinePlaying}\n currentTimeSeconds={currentTimeSeconds}\n />\n ))}\n </div>\n );\n};\n\nexport default UpdatedGuidance;\n","import { useState, useRef, useEffect } from 'react';\nimport { ArrowLeft, ArrowRight, CalendarDays, PhoneIncoming, ClipboardList, FileSignal, Repeat, ChevronDown, ChevronRight, Headset, CircleUser, History, ExternalLink, Mail } from 'lucide-react';\nimport UpdatedInteractionContext from './UpdatedInteractionContext';\nimport UpdatedInteractionRecording from './UpdatedInteractionRecording';\nimport UpdatedInteractionScores from './UpdatedInteractionScores';\nimport UpdatedCoachingSynthesisCard from './UpdatedCoachingSynthesisCard';\nimport UpdatedInteractionSignals from './UpdatedInteractionSignals';\nimport UpdatedCompassScore from './UpdatedCompassScore';\nimport UpdatedThreads from './UpdatedThreads';\nimport UpdatedGuidance from './UpdatedGuidance';\nimport SideDrawer from '../common/SideDrawer';\n\n/* Hover tooltip — fixed position to escape overflow containers.\n Anchored below the trigger. */\nconst NameTooltip = ({ text, children }) => {\n const [show, setShow] = useState(false);\n const triggerRef = useRef(null);\n const [pos, setPos] = useState({ top: 0, left: 0 });\n\n if (!text) return children;\n\n const handleEnter = () => {\n if (triggerRef.current) {\n const rect = triggerRef.current.getBoundingClientRect();\n setPos({\n top: rect.bottom + 6,\n left: rect.left + rect.width / 2,\n });\n }\n setShow(true);\n };\n\n return (\n <div\n ref={triggerRef}\n style={{ position: 'relative', display: 'inline-flex' }}\n onMouseEnter={handleEnter}\n onMouseLeave={() => setShow(false)}\n >\n {children}\n {show && (\n <div style={{\n position: 'fixed',\n top: pos.top,\n left: pos.left,\n transform: 'translate(-50%, 0)',\n display: 'flex',\n padding: 10,\n alignItems: 'center',\n borderRadius: 4,\n border: '1px solid var(--Grey-absent, #D9D9D9)',\n background: 'var(--Grey-Strong, #2E3236)',\n zIndex: 9999,\n pointerEvents: 'none',\n whiteSpace: 'nowrap',\n }}>\n <span style={{\n color: '#FFF',\n fontSize: 12,\n fontWeight: 400,\n lineHeight: 'normal',\n }}>\n {text}\n </span>\n </div>\n )}\n </div>\n );\n};\n\nconst TABS = [\n { key: 'overview', label: 'Overview' },\n { key: 'coaching', label: 'Coaching Summary' },\n { key: 'signals', label: 'Signals & Recording' },\n { key: 'comments', label: 'Feedback' },\n];\n\nconst UpdatedInteractionDetails = ({\n title = 'Wheel Stud Replacement Enquiry',\n onBack,\n // Data props — all optional with defaults for demo\n data,\n coachingData,\n coachingLoading = false,\n audioUrl,\n // Audio/playback props — pass these when the host app manages audio externally\n // (like InteractionDetailPanel does). If omitted, UpdatedInteractionRecording\n // manages its own audio element internally.\n audioRef: externalAudioRef,\n currentTimeSeconds,\n timelinePlaying,\n playbackRate,\n timelineSegments,\n onSeek,\n onTogglePlay,\n onSeekBack,\n onSeekForward,\n onSetPlaybackRate,\n // Speaker names\n agentName: externalAgentName,\n agentFullName: externalAgentFullName,\n customerName: externalCustomerName,\n customerFullName: externalCustomerFullName,\n // Transcript props — pass real transcript data from the host app\n transcript,\n activeTurnIndex,\n turnObservations,\n highlightedTurns,\n onTurnPlayPause,\n // Signal evidence playback — host app can provide to play audio segments from signals\n onPlayEvidence,\n onHighlightTurns,\n // Context props — pass from host app to override block-derived defaults\n callPurpose: externalCallPurpose,\n classification: externalClassification,\n outcomeQuality: externalOutcomeQuality,\n // Context \"More Details\" expandable section\n resolutionOutcome,\n customerIntent,\n interactionId,\n moreDetails,\n // Compass score props\n compassScore, // gauge meter value — compass_score, range 0.5-5\n compassMaxScore = 5,\n predictedCsat, // predicted objective number (e.g. compass_score) — shown as \"03\" top-right\n predictedLabel = 'Predicted Objective',\n compassLegends,\n // Customer session history drawer\n customerSessions: customerSessionsList,\n customerSessionCount,\n onSessionClick,\n onViewAllSessions,\n // Footer navigation\n prevSessionDesc,\n prevSessionDisabled = false,\n nextSessionDesc,\n nextSessionDisabled = false,\n onPreviousSession,\n onNextSession,\n // Comments\n comments = [],\n guidance = [],\n currentUser,\n onSendComment,\n onSendReply,\n onReply,\n onEdit,\n onEditInteraction,\n onDelete,\n onMenuClick,\n onMarkResolved,\n commentsResolved,\n}) => {\n const [activeTab, setActiveTab] = useState('overview');\n const [expandedSignals, setExpandedSignals] = useState(new Set());\n const [showSessionDrawer, setShowSessionDrawer] = useState(false);\n const [hoveredSessionIdx, setHoveredSessionIdx] = useState(null);\n const [internalPlaying, setInternalPlaying] = useState(false);\n const [internalCurrentTime, setInternalCurrentTime] = useState(0);\n const [isScrolledPastHeader, setIsScrolledPastHeader] = useState(false);\n const recordingRef = useRef(null);\n\n // Section refs for scroll-to-section tab behavior\n const overviewRef = useRef(null);\n const coachingRef = useRef(null);\n const signalsRef = useRef(null);\n const commentsRef = useRef(null);\n const sectionRefs = { overview: overviewRef, coaching: coachingRef, signals: signalsRef, comments: commentsRef };\n const scrollContainerRef = useRef(null);\n const isClickScrolling = useRef(false);\n\n // Scroll-spy: update active tab based on which section's top is nearest the viewport\n useEffect(() => {\n const container = scrollContainerRef.current;\n if (!container) return;\n\n const tabKeys = ['overview', 'coaching', 'signals', 'comments'];\n const refs = [overviewRef, coachingRef, signalsRef, commentsRef];\n\n // Find the closest scrollable ancestor (the element that actually scrolls)\n const getScrollParent = (el) => {\n let node = el.parentElement;\n while (node) {\n const { overflow, overflowY } = window.getComputedStyle(node);\n if (/(auto|scroll)/.test(overflow + overflowY)) return node;\n node = node.parentElement;\n }\n return null;\n };\n\n const scrollParent = getScrollParent(container);\n\n const handleScroll = () => {\n if (isClickScrolling.current) return;\n\n let activeKey = tabKeys[0];\n\n // Use viewport-relative positions — works regardless of which element scrolls\n for (let i = refs.length - 1; i >= 0; i--) {\n const el = refs[i].current;\n if (!el) continue;\n const rect = el.getBoundingClientRect();\n // Section is \"active\" when its top has scrolled above 150px from viewport top\n if (rect.top <= 150) {\n activeKey = tabKeys[i];\n break;\n }\n }\n\n setActiveTab(activeKey);\n\n // Move session nav from title row to sticky tabs once content starts scrolling.\n const overviewTop = overviewRef.current?.getBoundingClientRect().top ?? Number.POSITIVE_INFINITY;\n setIsScrolledPastHeader(overviewTop <= 150);\n };\n\n // Attach to all possible scroll targets\n container.addEventListener('scroll', handleScroll, { passive: true });\n if (scrollParent && scrollParent !== container) {\n scrollParent.addEventListener('scroll', handleScroll, { passive: true });\n }\n window.addEventListener('scroll', handleScroll, { passive: true, capture: true });\n handleScroll();\n\n return () => {\n container.removeEventListener('scroll', handleScroll);\n if (scrollParent && scrollParent !== container) {\n scrollParent.removeEventListener('scroll', handleScroll);\n }\n window.removeEventListener('scroll', handleScroll, { capture: true });\n };\n }, []);\n\n const clickedTabRef = useRef(null);\n\n const handleTabClick = (key) => {\n setActiveTab(key);\n isClickScrolling.current = true;\n clickedTabRef.current = key;\n const el = sectionRefs[key]?.current;\n if (el) {\n // Offset scroll to account for the sticky header + tabs (~120px)\n const container = scrollContainerRef.current;\n if (container && container.scrollHeight > container.clientHeight) {\n // Container itself scrolls\n const containerTop = container.getBoundingClientRect().top;\n const elTop = el.getBoundingClientRect().top;\n const offset = elTop - containerTop + container.scrollTop - 16;\n container.scrollTo({ top: offset, behavior: 'smooth' });\n } else {\n // Page/parent scrolls — use window with offset\n const elTop = el.getBoundingClientRect().top + window.scrollY - 120;\n window.scrollTo({ top: elTop, behavior: 'smooth' });\n }\n }\n setTimeout(() => {\n isClickScrolling.current = false;\n clickedTabRef.current = null;\n }, 1200);\n };\n\n const sessionHistory = customerSessionsList || [];\n const hasPastSessions = sessionHistory.length > 1;\n\n /* Called from Signals/Guidance \"Show in transcript\" icon —\n switches to Signals section, then scrolls/highlights transcript card without playing audio. */\n const handleShowInTranscript = (startMs) => {\n setActiveTab('signals');\n const signalsEl = signalsRef.current;\n if (signalsEl) {\n const container = scrollContainerRef.current;\n if (container && container.scrollHeight > container.clientHeight) {\n const containerTop = container.getBoundingClientRect().top;\n const elTop = signalsEl.getBoundingClientRect().top;\n const offset = elTop - containerTop + container.scrollTop - 16;\n container.scrollTo({ top: offset, behavior: 'smooth' });\n } else {\n const elTop = signalsEl.getBoundingClientRect().top + window.scrollY - 120;\n window.scrollTo({ top: elTop, behavior: 'smooth' });\n }\n }\n\n const timeSec = startMs / 1000;\n // Wait briefly so section scroll starts before transcript container scroll/highlight.\n setTimeout(() => {\n if (recordingRef.current?.scrollToTranscript) {\n recordingRef.current.scrollToTranscript(timeSec);\n }\n }, 220);\n };\n\n /* Called from Signals evidence play button — seeks + plays audio segment */\n const handlePlayEvidence = (ev) => {\n setActiveTab('signals');\n const signalsEl = signalsRef.current;\n if (signalsEl) {\n const container = scrollContainerRef.current;\n if (container && container.scrollHeight > container.clientHeight) {\n const containerTop = container.getBoundingClientRect().top;\n const elTop = signalsEl.getBoundingClientRect().top;\n const offset = elTop - containerTop + container.scrollTop - 16;\n container.scrollTo({ top: offset, behavior: 'smooth' });\n } else {\n const elTop = signalsEl.getBoundingClientRect().top + window.scrollY - 120;\n window.scrollTo({ top: elTop, behavior: 'smooth' });\n }\n }\n\n const startMs = ev?.start_ms ?? ev?.startMs;\n\n // Wait briefly so section scroll starts before playback seek/play begins.\n setTimeout(() => {\n // Keep transcript highlight behavior consistent with \"Show in transcript\".\n if (startMs != null && recordingRef.current?.scrollToTranscript) {\n recordingRef.current.scrollToTranscript(startMs / 1000);\n }\n\n if (onPlayEvidence) {\n onPlayEvidence(ev);\n } else {\n // Default: seek to evidence start time via recording ref\n if (startMs != null && recordingRef.current?.seekTo) {\n recordingRef.current.seekTo(startMs / 1000);\n setInternalPlaying(true);\n setInternalCurrentTime(startMs / 1000);\n // Stop playing after evidence duration\n const endMs = ev.end_ms ?? ev.endMs ?? (startMs + 5000);\n const durationMs = endMs - startMs;\n setTimeout(() => setInternalPlaying(false), durationMs);\n }\n }\n }, 220);\n };\n\n /* Called to highlight transcript turns related to evidence */\n const handleHighlightTurns = (turnIds) => {\n if (onHighlightTurns) {\n onHighlightTurns(turnIds);\n }\n };\n\n const toggleSignal = (key) => {\n setExpandedSignals((prev) => {\n const next = new Set(prev);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n return next;\n });\n };\n\n // Extract data from blocks if provided\n const blocks = data?.blocks || [];\n const findBlock = (id) => blocks.find((b) => b.block_id === id)?.payload || {};\n\n const meta = findBlock('interaction-metadata');\n const ctx = findBlock('interaction-context');\n const signals = findBlock('interaction-signals');\n const outcomeLift = findBlock('interaction-outcome-lift');\n const dimensionsBlock = findBlock('interaction-dimensions');\n const blockDimensions = dimensionsBlock.dimensions || [];\n const callPurpose = ctx.call_purpose || {};\n const classification = ctx.classification || {};\n\n const resolvedMeta = meta || {};\n const resolvedCallPurpose = externalCallPurpose || callPurpose || {};\n const resolvedClassification = externalClassification || classification || {};\n const resolvedOutcomeLift = outcomeLift || {};\n const resolvedDriverLabels = (resolvedOutcomeLift.driver_signal_keys || [])\n .map((k) => k.replace(/^sig\\./, '').replace(/_/g, ' '));\n const resolvedCoaching = coachingData || null;\n const resolvedSignals = signals?.signals?.length\n ? signals\n : { present_count: 0, total_signals_evaluated: 0, signals: [] };\n const guidanceData = guidance || [];\n\n // Resolve names: explicit props → metadata block → context block → fallback\n const agentName = externalAgentName || meta.agent_name || meta.agent || ctx.agent_name || 'Agent';\n const agentFullName = externalAgentFullName || meta.agent_full_name || meta.agent_name || agentName;\n const customerName = externalCustomerName || meta.customer_name || meta.customer || ctx.customer_name || 'Customer';\n const customerFullName = externalCustomerFullName || meta.customer_full_name || meta.customer_name || customerName;\n const resolvedUserRole = String(\n currentUser?.role ??\n currentUser?.userRole ??\n currentUser?.user_role ??\n currentUser?.roleName ??\n currentUser?.role_name ??\n ''\n ).toLowerCase();\n const canEditInteraction = /(admin|superadmin|administrator)/.test(resolvedUserRole);\n const sessionCount = customerSessionCount ?? sessionHistory.length;\n const rawDate = meta.created_dt || data?.created_dt || ctx.created_dt || '';\n const dateStr = rawDate\n ? new Date(/Z$|[+-]\\d{2}:\\d{2}$/.test(rawDate) ? rawDate : rawDate + 'Z').toLocaleString()\n : '';\n const direction = resolvedCallPurpose.interaction_direction === 'inbound' ? 'Inbound' : 'Outbound';\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', width: '100%', height: '100%', background: 'var(--Grey-White, #FFF)' }}>\n {/* Sticky Header + Tabs */}\n {/* Header */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 12, padding: '18px 24px 0' }}>\n <button\n onClick={onBack}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: 0,\n flexShrink: 0,\n }}\n >\n <ArrowLeft size={24} color=\"var(--Grey-Strong, #2E3236)\" />\n </button>\n <div style={{ width: 1, height: 28, background: 'var(--Base-absent, #D9D9D9)' }} />\n <h1 style={{\n color: 'var(--Grey-Strong, #2E3236)',\n fontSize: 24,\n fontStyle: 'normal',\n fontWeight: 400,\n lineHeight: 'normal',\n margin: 0,\n flex: 1,\n }}>\n {title}\n </h1>\n\n {/* Figma node 605-1186: Previous / Next Session — inline in header */}\n {(onPreviousSession || onNextSession) && !isScrolledPastHeader && (\n <div style={{ display: 'flex', alignItems: 'center', flexShrink: 0 }}>\n {/* Previous Session */}\n <NameTooltip text={prevSessionDesc}>\n <button\n onClick={prevSessionDisabled ? undefined : onPreviousSession}\n disabled={prevSessionDisabled}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n padding: '4px 12px',\n background: 'none',\n border: 'none',\n cursor: prevSessionDisabled ? 'default' : 'pointer',\n opacity: prevSessionDisabled ? 0.4 : 1,\n }}\n >\n <ArrowLeft size={16} color=\"var(--Neutral-800, #323232)\" strokeWidth={1.5} />\n <span style={{\n color: 'var(--Neutral-800, #323232)',\n fontSize: 13,\n fontWeight: 400,\n lineHeight: '24px',\n fontFamily: 'var(--default-font-family)',\n whiteSpace: 'nowrap',\n }}>\n Previous Interaction\n </span>\n </button>\n </NameTooltip>\n\n {/* Divider */}\n <div style={{\n width: 1,\n height: 20,\n background: 'var(--Grey-absent, #D9D9D9)',\n flexShrink: 0,\n }} />\n\n {/* Next Session */}\n <NameTooltip text={nextSessionDesc}>\n <button\n onClick={nextSessionDisabled ? undefined : onNextSession}\n disabled={nextSessionDisabled}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n padding: '4px 12px',\n background: 'none',\n border: 'none',\n cursor: nextSessionDisabled ? 'default' : 'pointer',\n opacity: nextSessionDisabled ? 0.4 : 1,\n }}\n >\n <span style={{\n color: 'var(--Neutral-800, #323232)',\n fontSize: 13,\n fontWeight: 400,\n lineHeight: '24px',\n fontFamily: 'var(--default-font-family)',\n whiteSpace: 'nowrap',\n }}>\n Next Interaction\n </span>\n <ArrowRight size={16} color=\"var(--Neutral-800, #323232)\" strokeWidth={1.5} />\n </button>\n </NameTooltip>\n </div>\n )}\n </div>\n\n <div style={{ position: 'sticky', top: 68, zIndex: 20, background: 'var(--Grey-White, #FFF)' }}>\n {/* Tabs + sticky session nav at far right */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 16,\n background: 'var(--Grey-White, #FFF)',\n borderBottom: '1px solid var(--Grey-Faint, #ACADAD)',\n padding: '0 24px',\n marginTop: 8,\n }}>\n <div style={{ display: 'flex', alignItems: 'flex-start', minWidth: 0 }}>\n {TABS.map((tab) => (\n <button\n key={tab.key}\n onClick={() => handleTabClick(tab.key)}\n style={{\n display: 'flex',\n padding: 16,\n alignItems: 'center',\n gap: 10,\n background: 'none',\n border: 'none',\n borderBottom: activeTab === tab.key\n ? '3px solid var(--Grey-Strong, #2E3236)'\n : '3px solid transparent',\n cursor: 'pointer',\n fontSize: 15,\n fontWeight: activeTab === tab.key ? 500 : 400,\n color: activeTab === tab.key\n ? 'var(--Grey-Strong, #2E3236)'\n : 'var(--Grey-Muted, #808183)',\n whiteSpace: 'nowrap',\n transition: 'border-color 0.2s ease, color 0.2s ease',\n }}\n >\n {tab.label}\n </button>\n ))}\n </div>\n\n {(onPreviousSession || onNextSession) && isScrolledPastHeader && (\n <div style={{ display: 'flex', alignItems: 'center', flexShrink: 0 }}>\n <NameTooltip text={prevSessionDesc}>\n <button\n onClick={prevSessionDisabled ? undefined : onPreviousSession}\n disabled={prevSessionDisabled}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n padding: '4px 12px',\n background: 'none',\n border: 'none',\n cursor: prevSessionDisabled ? 'default' : 'pointer',\n opacity: prevSessionDisabled ? 0.4 : 1,\n }}\n >\n <ArrowLeft size={16} color=\"var(--Neutral-800, #323232)\" strokeWidth={1.5} />\n <span style={{\n color: 'var(--Neutral-800, #323232)',\n fontSize: 13,\n fontWeight: 400,\n lineHeight: '24px',\n fontFamily: 'var(--default-font-family)',\n whiteSpace: 'nowrap',\n }}>\n Previous Interaction\n </span>\n </button>\n </NameTooltip>\n\n <div style={{\n width: 1,\n height: 20,\n background: 'var(--Grey-absent, #D9D9D9)',\n flexShrink: 0,\n }} />\n\n <NameTooltip text={nextSessionDesc}>\n <button\n onClick={nextSessionDisabled ? undefined : onNextSession}\n disabled={nextSessionDisabled}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n padding: '4px 12px',\n background: 'none',\n border: 'none',\n cursor: nextSessionDisabled ? 'default' : 'pointer',\n opacity: nextSessionDisabled ? 0.4 : 1,\n }}\n >\n <span style={{\n color: 'var(--Neutral-800, #323232)',\n fontSize: 13,\n fontWeight: 400,\n lineHeight: '24px',\n fontFamily: 'var(--default-font-family)',\n whiteSpace: 'nowrap',\n }}>\n Next Interaction\n </span>\n <ArrowRight size={16} color=\"var(--Neutral-800, #323232)\" strokeWidth={1.5} />\n </button>\n </NameTooltip>\n </div>\n )}\n </div>\n </div>{/* end sticky header + tabs */}\n\n {/* All sections rendered — tabs scroll to them */}\n <div ref={scrollContainerRef} style={{ padding: 24, flex: 1, overflowY: 'auto' }}>\n {/* ═══ OVERVIEW SECTION ═══ */}\n <div ref={overviewRef} style={{\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'flex-end',\n alignItems: 'flex-start',\n gap: 24,\n alignSelf: 'stretch',\n }}>\n {/* Figma node 106-3508: Section Header — horizontal, gap: 16, height: 40, center */}\n <div style={{\n display: 'flex',\n height: 40,\n alignItems: 'center',\n gap: 16,\n alignSelf: 'stretch',\n }}>\n {/* Left: Icon + Title — fills remaining space */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, flex: 1 }}>\n <ClipboardList size={24} color=\"var(--rail-orange, #C98A5A)\" strokeWidth={2} />\n <span style={{\n fontSize: 16,\n fontWeight: 600,\n color: 'var(--Grey-Strong, #2E3236)',\n lineHeight: 1.2,\n textTransform: 'uppercase',\n }}>\n Overview\n </span>\n </div>\n\n {/* Right: Metadata — horizontal, gap: 16, center */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 16, flexShrink: 0 }}>\n {/* Date */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 6, padding: '8px 0' }}>\n <CalendarDays size={16} color=\"var(--Grey-Muted, #808183)\" strokeWidth={1.5} />\n <span style={{ fontSize: 13, fontWeight: 400, color: 'var(--Grey-Strong, #2E3236)', fontFamily: 'var(--font-sans)', lineHeight: 1.2 }}>\n {dateStr}\n </span>\n </div>\n\n {/* Direction */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 6, padding: '8px 0' }}>\n <PhoneIncoming size={16} color=\"var(--Grey-Muted, #808183)\" strokeWidth={1.5} />\n <span style={{ fontSize: 13, fontWeight: 400, color: 'var(--Grey-Strong, #2E3236)', fontFamily: 'var(--font-sans)', lineHeight: 1.2 }}>\n {direction}\n </span>\n </div>\n\n {/* Agent + Customer — border-left separator */}\n <div style={{\n display: 'flex', alignItems: 'center', gap: 16,\n paddingLeft: 16,\n borderLeft: '1px solid var(--Grey-absent, #D9D9D9)',\n }}>\n {/* Agent — Headset icon + tooltip */}\n <NameTooltip text={agentFullName}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 6, padding: '8px 0', cursor: 'pointer' }}>\n <Headset size={16} color=\"var(--Grey-Muted, #808183)\" strokeWidth={1.5} />\n <span style={{ fontSize: 13, fontWeight: 400, color: 'var(--Grey-Strong, #2E3236)', fontFamily: 'var(--font-sans)', lineHeight: 1.2 }}>\n {agentName}\n </span>\n </div>\n </NameTooltip>\n\n {/* Repeat icon */}\n {/* <Repeat size={16} color=\"var(--color-input-border, #ACACAD)\" strokeWidth={1.5} /> */}\n\n {/* Customer — CircleUser icon + side drawer trigger (only if > 1 session) */}\n {sessionCount > 1 ? (\n <div>\n <NameTooltip text={customerFullName}>\n <button\n onClick={() => setShowSessionDrawer(true)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 16,\n padding: '0 16px',\n height: 34,\n borderRadius: 8,\n background: 'var(--Rail-Surface-2, #E3E1D7)',\n border: 'none',\n cursor: 'pointer',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 4, minWidth: 0 }}>\n <CircleUser size={16} color=\"var(--Grey-Strong, #2E3236)\" strokeWidth={1.5} />\n <span style={{ fontSize: 13, fontWeight: 400, color: 'var(--Grey-Strong, #2E3236)', lineHeight: 1.2, whiteSpace: 'nowrap' }}>\n <span style={{ fontWeight: 600 }}>{customerName}</span>{' '}\n <span>({sessionCount} Interactions)</span>\n </span>\n </div>\n <ChevronRight size={16} color=\"var(--Grey-Strong, #2E3236)\" strokeWidth={1.7} />\n </button>\n </NameTooltip>\n </div>\n ) : (\n <NameTooltip text={customerFullName}>\n <button\n onClick={() => setShowSessionDrawer(true)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 16,\n padding: '0 16px',\n height: 34,\n borderRadius: 8,\n background: 'var(--Rail-Surface-2, #E3E1D7)',\n border: 'none',\n cursor: 'pointer',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 4, minWidth: 0 }}>\n <CircleUser size={16} color=\"var(--Grey-Strong, #2E3236)\" strokeWidth={1.5} />\n <span style={{ fontSize: 13, fontWeight: 600, color: 'var(--Grey-Strong, #2E3236)', lineHeight: 1.2, whiteSpace: 'nowrap' }}>\n {customerName}\n </span>\n </div>\n <ChevronRight size={16} color=\"var(--Grey-Strong, #2E3236)\" strokeWidth={1.7} />\n </button>\n </NameTooltip>\n )}\n </div>\n </div>\n </div>\n\n {/*\n Figma node 101-2385\n Row: Compass Score (left) | Context + Agent Lift Analysis stacked (right)\n */}\n <div style={{\n display: 'flex',\n alignItems: 'stretch',\n gap: 24,\n alignSelf: 'stretch',\n }}>\n {/* Left — Compass Score */}\n <div style={{ flex: 1, minWidth: 0, display: 'flex' }}>\n <UpdatedCompassScore\n score={compassScore ?? 0.5}\n minScore={0}\n maxScore={compassMaxScore}\n predictedScore={predictedCsat ?? 0.5}\n predictedLabel={predictedLabel}\n legends={compassLegends}\n />\n </div>\n\n {/* Right — Context grid + Agent Lift Analysis stacked */}\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'stretch',\n justifyContent: 'flex-end',\n gap: 24,\n flex: 1,\n minWidth: 0,\n }}>\n <UpdatedInteractionContext\n meta={resolvedMeta}\n callPurpose={resolvedCallPurpose}\n classification={resolvedClassification}\n outcomeQuality={externalOutcomeQuality || 'Neutral'}\n dimensions={blockDimensions}\n resolutionOutcome={resolutionOutcome}\n customerIntent={customerIntent}\n interactionId={interactionId ?? meta.interaction_id}\n moreDetails={moreDetails}\n canShowEditButton={canEditInteraction}\n onEditInteraction={onEditInteraction}\n />\n <UpdatedInteractionScores\n outcomeLift={resolvedOutcomeLift}\n driverLabels={resolvedDriverLabels}\n />\n </div>\n </div>\n\n </div>\n\n {/* ═══ COACHING SUMMARY SECTION ═══ */}\n <div ref={coachingRef} style={{ paddingTop: 24 }}>\n <UpdatedCoachingSynthesisCard data={coachingLoading ? null : resolvedCoaching} loading={coachingLoading} />\n </div>\n\n {/* ═══ SIGNALS & RECORDING SECTION ═══ */}\n <div ref={signalsRef} style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 16,\n alignSelf: 'stretch',\n paddingTop: 24,\n }}>\n {/* Section header */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n }}>\n <FileSignal size={24} color=\"#C98A5A\" strokeWidth={2} />\n <span style={{\n fontSize: 16,\n fontWeight: 600,\n color: 'var(--Grey-Strong, #2E3236)',\n lineHeight: 1.2,\n textTransform: 'uppercase',\n }}>\n Signals & Recording\n </span>\n </div>\n\n {/* Content: Signals (left) | Recording+Transcript (right) */}\n <div style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: 24,\n alignSelf: 'stretch',\n paddingTop: 16,\n borderTop: '1px solid #D9D9D9',\n }}>\n <div style={{ flex: 1, minWidth: 0 }}>\n <UpdatedInteractionSignals\n signals={resolvedSignals}\n expandedSignals={expandedSignals}\n toggleSignal={toggleSignal}\n playEvidence={handlePlayEvidence}\n highlightTurns={handleHighlightTurns}\n onShowInTranscript={handleShowInTranscript}\n timelinePlaying={timelinePlaying || internalPlaying}\n currentTimeSeconds={currentTimeSeconds ?? internalCurrentTime}\n />\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <UpdatedInteractionRecording\n ref={recordingRef}\n audioUrl={audioUrl}\n durationSeconds={resolvedMeta.duration_seconds}\n audioRef={externalAudioRef}\n agentName={agentName}\n customerName={customerName}\n currentTimeSeconds={currentTimeSeconds}\n timelinePlaying={timelinePlaying}\n playbackRate={playbackRate}\n timelineSegments={timelineSegments}\n onSeek={onSeek}\n onTogglePlay={onTogglePlay}\n onSeekBack={onSeekBack}\n onSeekForward={onSeekForward}\n onSetPlaybackRate={onSetPlaybackRate}\n transcript={transcript}\n activeTurnIndex={activeTurnIndex}\n turnObservations={turnObservations}\n highlightedTurns={highlightedTurns}\n onTurnPlayPause={onTurnPlayPause}\n setExpandedSignals={setExpandedSignals}\n />\n </div>\n </div>\n </div>\n\n {/* ═══ FEEDBACK SECTION ═══ */}\n <div ref={commentsRef} style={{ paddingTop: 24 }}>\n <UpdatedThreads\n comments={comments}\n totalComments={comments.length}\n currentUser={currentUser}\n onSendComment={onSendComment || (() => {})}\n onSendReply={onSendReply || (() => {})}\n onReply={onReply || (() => {})}\n onEdit={onEdit || (() => {})}\n onDelete={onDelete || (() => {})}\n onMenuClick={onMenuClick || (() => {})}\n onMarkResolved={onMarkResolved || (() => {})}\n isResolved={commentsResolved}\n >\n <UpdatedGuidance\n items={guidanceData}\n guidanceCount={guidanceData.length}\n onPlayEvidence={handlePlayEvidence}\n onShowInTranscript={handleShowInTranscript}\n timelinePlaying={timelinePlaying || internalPlaying}\n currentTimeSeconds={currentTimeSeconds ?? internalCurrentTime}\n />\n </UpdatedThreads>\n </div>\n </div>\n\n <SideDrawer\n open={showSessionDrawer}\n onClose={() => setShowSessionDrawer(false)}\n title={(\n <div style={{ display: 'flex', alignItems: 'center', gap: 10, minWidth: 0 }}>\n <div style={{\n width: 34,\n height: 34,\n borderRadius: '50%',\n background: 'var(--surface-hover, #F3F7F7)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n }}>\n <CircleUser size={20} color=\"var(--Grey-Strong, #2E3236)\" strokeWidth={1.7} />\n </div>\n <div style={{ minWidth: 0 }}>\n <div style={{\n fontSize: 16,\n fontWeight: 600,\n color: 'var(--Grey-Strong, #2E3236)',\n lineHeight: 1.2,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}>\n {customerName}\n </div>\n </div>\n </div>\n )}\n subtitle={hasPastSessions ? (\n <span style={{\n fontSize: 13,\n fontWeight: 400,\n color: 'var(--Grey-Muted, #808183)',\n lineHeight: 1.5,\n }}>\n {sessionCount} Interactions in Past\n </span>\n ) : null}\n width={470}\n height=\"100vh\"\n topOffset={70}\n footer={hasPastSessions ? (\n <div style={{ width: '100%', display: 'flex', justifyContent: 'center' }}>\n <button\n onClick={() => { if (onViewAllSessions) onViewAllSessions(); setShowSessionDrawer(false); }}\n style={{\n display: 'flex',\n height: 40,\n padding: '0 20px 0 18px',\n justifyContent: 'center',\n alignItems: 'center',\n gap: 7,\n background: 'var(--Grey-White, #FFF)',\n border: '1px solid var(--Grey-absent, #D9D9D9)',\n borderRadius: 10,\n cursor: 'pointer',\n }}\n >\n <History size={18} color=\"var(--Grey-Muted, #808183)\" strokeWidth={1.5} />\n <span style={{ fontSize: 15, fontWeight: 600, color: 'var(--Grey-Strong, #2E3236)' }}>\n View All Interactions\n </span>\n </button>\n </div>\n ) : null}\n >\n <div\n style={{\n borderTop: '1px solid var(--Grey-absent, #D9D9D9)',\n maxHeight: '100%',\n overflowY: 'auto',\n }}\n >\n {hasPastSessions ? sessionHistory.map((session, i) => (\n <div\n key={session.id || i}\n onClick={() => { if (onSessionClick) onSessionClick(session); setShowSessionDrawer(false); }}\n onMouseEnter={() => setHoveredSessionIdx(i)}\n onMouseLeave={() => setHoveredSessionIdx(null)}\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n gap: 12,\n padding: '16px 12px',\n borderTop: i === 0 ? 'none' : '1px solid var(--Grey-absent, #D9D9D9)',\n background: hoveredSessionIdx === i ? 'var(--surface-hover, #F3F7F7)' : 'var(--Grey-White, #FFF)',\n cursor: 'pointer',\n transition: 'background 0.15s',\n }}\n >\n <div style={{ minWidth: 0 }}>\n <div style={{ fontSize: 14, display: 'flex', alignItems: 'center', gap: 6, fontWeight: 400, color: 'var(--Grey-Strong, #2E3236)', lineHeight: 1.2, marginBottom: 8, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>\n {session.title}\n </div>\n {session.status && (\n <div style={{ fontSize: 13, color: 'var(--Grey-Strong, #2E3236)', marginBottom: 12, lineHeight: 1.2 }}>\n <span style={{ fontWeight: 400 }}>Status: </span>\n <span style={{ fontWeight: 400, color: 'var(--Grey-Muted, #808183)' }}>{session.status}</span>\n </div>\n )}\n <div style={{ display: 'flex', alignItems: 'center', gap: 14, flexWrap: 'wrap' }}>\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 6, fontSize: 13, fontWeight: 400, color: 'var(--Grey-Muted, #808183)', lineHeight: 1.1 }}>\n <CalendarDays size={16} color=\"var(--Grey-Muted, #808183)\" strokeWidth={1.8} />\n {session.date}\n </span>\n {(session.agent || session.agent_name) && (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 6, fontSize: 13, fontWeight: 400, color: 'var(--Grey-Muted, #808183)', lineHeight: 1.1 }}>\n <Headset size={16} color=\"var(--Grey-Muted, #808183)\" strokeWidth={1.8} />\n {session.agent || session.agent_name}\n </span>\n )}\n </div>\n </div>\n {hoveredSessionIdx === i && (\n <ExternalLink size={20} color=\"var(--Grey-Muted, #808183)\" strokeWidth={1.7} style={{ flexShrink: 0 }} />\n )}\n </div>\n )) : (\n <div\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n minHeight: 140,\n padding: '24px 12px',\n color: 'var(--Grey-Muted, #808183)',\n fontSize: 14,\n fontStyle: 'italic',\n textAlign: 'center',\n }}\n >\n No other interactions available\n </div>\n )}\n </div>\n </SideDrawer>\n\n </div>\n );\n};\n\nexport default UpdatedInteractionDetails;\n"],"names":["COLORS","OVERALL_MAP","STYLE_ID","ensureKeyframes","style","OverallBadge","overall","label","jsxs","jsx","ThumbsUp","SectionItem","item","text","quote","CoachingColumn","icon","items","i","UpdatedCoachingSynthesisCard","data","loading","error","React","Fragment","strengths","improvements","oneLiner","_a","context","_b","ShieldCheck","TrendingUp","Lightbulb","fmtDur","seconds","m","s","ROW_STYLE","COLUMN_STYLE","UpdatedInteractionContext","meta","callPurpose","classification","dimensions","outcomeQuality","onMoreDetails","moreDetails","resolutionOutcome","customerIntent","canShowEditButton","onEditInteraction","expanded","setExpanded","useState","moreDetailsRef","useRef","duration","messages","driver","paradigm","findDim","keyPattern","d","dimResolution","dimIntent","dimOutcomeQuality","fmtValue","v","c","resolvedOutcomeQuality","resolvedResolutionOutcome","resolvedCustomerIntent","excludedKeys","k","filteredDimensions","pairedRows","rawPairs","left","right","pair","detailRows","useEffect","handleOutsideClick","event","renderRow","renderMoreDetailsToggle","ChevronUp","ChevronDown","Pencil","idx","row","LH","MAX_VISIBLE_DRIVERS","fmtPct","fmtPp","pp","UpdatedInteractionScores","outcomeLift","driverLabels","pExpected","pFull","liftRaw","liftRecentered","liftBand","liftBandCapitalized","LiftIcon","ThumbsDown","visibleDrivers","overflowCount","HoverIcon","children","size","onClick","title","hovered","setHovered","UpdatedInteractionSignals","signals","expandedSignals","toggleSignal","playEvidence","highlightTurns","onShowInTranscript","timelinePlaying","currentTimeSeconds","signalList","presentCount","fmtMs","ms","minutes","isEvPlaying","ev","FileSignal","signal","key","isExpanded","obsCount","_c","obs","obsIdx","e","ScrollText","evIdx","hasTimestamps","PauseCircle","PlayCircle","GaugeMeter","score","minScore","maxScore","numericScore","clampedScore","filledUnits","segDeg","toXY","angleDeg","rad","strokeArc","fromDeg","toDeg","large","gap","_","fromA","toA","segmentFill","pathD","ScoreBar","value","maxValue","numericValue","clampedValue","LEGEND_TOOLTIPS","InfoTooltip","show","setShow","ref","pos","setPos","handleEnter","rect","LegendItem","Info","UpdatedCompassScore","predictedScore","predictedLabel","description","legends","displayScore","rotateDeg","legend","roleColorMap","role","roleTokens","extractRoleValue","user","directRole","nestedRole","_d","_e","_f","resolveCurrentUserAvatarColor","getInitials","name","w","isWithinEditWindow","utcValue","minMatch","formatTimestamp","diffMs","diffMin","diffHr","diffDays","Avatar","initials","color","avatar","CommentBubble","comment","isReply","isConsecutive","onReply","onSendReply","onEdit","onDelete","onMenuClick","showReply","menuOpen","setMenuOpen","replyOpen","setReplyOpen","replyValue","setReplyValue","editOpen","setEditOpen","editValue","setEditValue","confirmDelete","setConfirmDelete","menuRef","replyRef","editRef","author","authorName","avatarColor","avatarImg","rawTimestamp","timestamp","canEdit","isEdited","paragraphs","handler","ta","max","p","Ellipsis","X","paragraph","CornerDownRight","CommentInput","currentUser","onSubmit","setValue","isFocused","setIsFocused","textareaRef","handleSubmit","trimmed","handleKeyDown","CommentThread","depth","hasReplies","isLastAtDepth","reply","UpdatedThreads","externalComments","totalComments","onSendComment","onMarkResolved","isResolved","localComments","setLocalComments","isSending","setIsSending","allComments","useMemo","externalIds","newLocal","prev","displayCurrentUser","handleSendReply","content","parentId","optimisticReply","handleSendComment","optimisticComment","handleEdit","handleDelete","groupedComments","repliesByParent","buildTree","commentCount","MessagesSquare","Check","CircleCheck","prevAuthor","currAuthor","GuidanceItem","isLast","onPlayEvidence","signalText","sr","pct","startMs","endMs","hasTimestamp","currentMs","isPlayingThisItem","UpdatedGuidance","guidanceCount","count","NameTooltip","triggerRef","TABS","UpdatedInteractionDetails","onBack","coachingData","coachingLoading","audioUrl","externalAudioRef","playbackRate","timelineSegments","onSeek","onTogglePlay","onSeekBack","onSeekForward","onSetPlaybackRate","externalAgentName","externalAgentFullName","externalCustomerName","externalCustomerFullName","transcript","activeTurnIndex","turnObservations","highlightedTurns","onTurnPlayPause","onHighlightTurns","externalCallPurpose","externalClassification","externalOutcomeQuality","interactionId","compassScore","compassMaxScore","predictedCsat","compassLegends","customerSessionsList","customerSessionCount","onSessionClick","onViewAllSessions","prevSessionDesc","prevSessionDisabled","nextSessionDesc","nextSessionDisabled","onPreviousSession","onNextSession","comments","guidance","commentsResolved","activeTab","setActiveTab","setExpandedSignals","showSessionDrawer","setShowSessionDrawer","hoveredSessionIdx","setHoveredSessionIdx","internalPlaying","setInternalPlaying","internalCurrentTime","setInternalCurrentTime","isScrolledPastHeader","setIsScrolledPastHeader","recordingRef","overviewRef","coachingRef","signalsRef","commentsRef","sectionRefs","scrollContainerRef","isClickScrolling","container","tabKeys","refs","scrollParent","el","node","overflow","overflowY","handleScroll","activeKey","overviewTop","clickedTabRef","handleTabClick","containerTop","offset","elTop","sessionHistory","hasPastSessions","handleShowInTranscript","signalsEl","timeSec","handlePlayEvidence","durationMs","handleHighlightTurns","turnIds","next","blocks","findBlock","id","b","ctx","blockDimensions","resolvedMeta","resolvedCallPurpose","resolvedClassification","resolvedOutcomeLift","resolvedDriverLabels","resolvedCoaching","resolvedSignals","guidanceData","agentName","agentFullName","customerName","customerFullName","resolvedUserRole","canEditInteraction","sessionCount","rawDate","dateStr","direction","ArrowLeft","ArrowRight","tab","ClipboardList","CalendarDays","PhoneIncoming","Headset","CircleUser","ChevronRight","UpdatedInteractionRecording","SideDrawer","History","session","ExternalLink"],"mappings":"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"}
|