chordia-ui 3.8.8 → 3.8.9

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.
Files changed (51) hide show
  1. package/dist/AgentLiftAnalysisCard.cjs.js +10 -0
  2. package/dist/AgentLiftAnalysisCard.cjs.js.map +1 -0
  3. package/dist/AgentLiftAnalysisCard.es.js +678 -0
  4. package/dist/AgentLiftAnalysisCard.es.js.map +1 -0
  5. package/dist/DataTable2.cjs.js +1 -1
  6. package/dist/DataTable2.cjs.js.map +1 -1
  7. package/dist/DataTable2.es.js +3 -2
  8. package/dist/DataTable2.es.js.map +1 -1
  9. package/dist/PerformancePanel.cjs.js +1 -1
  10. package/dist/PerformancePanel.cjs.js.map +1 -1
  11. package/dist/PerformancePanel.es.js +414 -347
  12. package/dist/PerformancePanel.es.js.map +1 -1
  13. package/dist/SideDrawer.cjs.js +1 -1
  14. package/dist/SideDrawer.cjs.js.map +1 -1
  15. package/dist/SideDrawer.es.js +93 -706
  16. package/dist/SideDrawer.es.js.map +1 -1
  17. package/dist/components/Signals.cjs.js +1 -1
  18. package/dist/components/Signals.cjs.js.map +1 -1
  19. package/dist/components/Signals.es.js +3 -2
  20. package/dist/components/Signals.es.js.map +1 -1
  21. package/dist/components/UpdatedInteractionDetails.cjs.js +4 -4
  22. package/dist/components/UpdatedInteractionDetails.cjs.js.map +1 -1
  23. package/dist/components/UpdatedInteractionDetails.es.js +384 -389
  24. package/dist/components/UpdatedInteractionDetails.es.js.map +1 -1
  25. package/dist/components/common.cjs.js +1 -1
  26. package/dist/components/common.es.js +17 -16
  27. package/dist/components/common.es.js.map +1 -1
  28. package/dist/components/data.cjs.js +1 -1
  29. package/dist/components/data.cjs.js.map +1 -1
  30. package/dist/components/data.es.js +9 -8
  31. package/dist/components/data.es.js.map +1 -1
  32. package/dist/components/performance.cjs.js +1 -1
  33. package/dist/components/performance.cjs.js.map +1 -1
  34. package/dist/components/performance.es.js +12 -11
  35. package/dist/components/performance.es.js.map +1 -1
  36. package/dist/components/reports.cjs.js +1 -1
  37. package/dist/components/reports.cjs.js.map +1 -1
  38. package/dist/components/reports.es.js +36 -35
  39. package/dist/components/reports.es.js.map +1 -1
  40. package/dist/index.cjs.js +1 -1
  41. package/dist/index.es.js +79 -78
  42. package/dist/index.es.js.map +1 -1
  43. package/dist/pages/interactionDetails.cjs.js +1 -1
  44. package/dist/pages/interactionDetails.cjs.js.map +1 -1
  45. package/dist/pages/interactionDetails.es.js +16 -15
  46. package/dist/pages/interactionDetails.es.js.map +1 -1
  47. package/package.json +1 -1
  48. package/src/components/UpdatedInteractionDetails/UpdatedInteractionDetails.jsx +16 -25
  49. package/src/components/common/AgentLiftAnalysisCard.jsx +86 -11
  50. package/src/components/performance/PerformanceDetailsPage.jsx +99 -66
  51. package/src/components/performance/PerformancePanel.jsx +125 -87
@@ -0,0 +1,10 @@
1
+ "use strict";const e=require("react/jsx-runtime"),b=require("react"),S=require("lucide-react"),v="chordia-cog-spin-style";if(typeof document<"u"&&!document.getElementById(v)){const i=document.createElement("style");i.id=v,i.textContent=`
2
+ @keyframes chordia-cog-spin {
3
+ from { transform: rotate(0deg); }
4
+ to { transform: rotate(360deg); }
5
+ }
6
+ @media (prefers-reduced-motion: reduce) {
7
+ .chordia-cog-spin { animation: none !important; }
8
+ }
9
+ `,document.head.appendChild(i)}const n={strong:"var(--Grey-Strong, #2E3236)",muted:"var(--Grey-Muted, #808183)",faint:"var(--Grey-Faint, #ACADAD)",border:"var(--Grey-absent, #D9D9D9)",orange:"var(--rail-orange, #C98A5A)",surface:"#FAF9F5",gaugeTrack:"#E3E1D7"},o="var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)",j=(i,l,r)=>Math.max(l,Math.min(r,i)),R=i=>{const l=j(Number(i)||0,-1,1);return l>=.6?"High":l>=.15?"Above Average":l<=-.6?"Low":l<=-.15?"Below Average":"Average"},F=i=>{const l=Number(i);return!Number.isFinite(l)||Math.abs(l)<.05?"neutral":l>0?"positive":"negative"},_=({text:i,children:l,maxWidth:r=280})=>{const[t,s]=b.useState(!1),a=b.useRef(null),[d,h]=b.useState({top:0,left:0});if(!i)return l;const g=()=>{if(a.current){const c=a.current.getBoundingClientRect();h({top:c.bottom+6,left:c.left+c.width/2})}s(!0)};return e.jsxs("div",{ref:a,style:{position:"relative",display:"inline-flex"},onMouseEnter:g,onMouseLeave:()=>s(!1),children:[l,t&&e.jsx("div",{style:{position:"fixed",top:d.top,left:d.left,transform:"translate(-50%, 0)",maxWidth:r,padding:"8px 12px",borderRadius:6,border:"1px solid var(--Grey-absent, #D9D9D9)",background:"var(--Grey-Strong, #2E3236)",color:"#FFF",fontFamily:o,fontSize:12,fontWeight:400,lineHeight:1.4,boxShadow:"0 4px 12px rgba(0, 0, 0, 0.15)",zIndex:9999,pointerEvents:"none",whiteSpace:"normal",textAlign:"left"},children:i})]})},W=({value:i=0,highlight:l=null})=>{const y=j(Number(i)||0,-1,1)*(Math.PI/2),m=60+38*Math.sin(y),p=56-38*Math.cos(y);let f=null;if(l!=null){const u=j(Number(l)||0,-1,1);if(u!==0){const x=u*(Math.PI/2),w=60,C=56-26.65,L=60+26.65*Math.sin(x),T=56-26.65*Math.cos(x),N=u>0?1:0;f=`M ${w} ${C} A ${26.65} ${26.65} 0 0 ${N} ${L} ${T}`}}return e.jsxs("svg",{width:"120",height:"80",viewBox:"0 0 120 80",role:"img","aria-hidden":"true",style:{marginBottom:-20,display:"block"},children:[e.jsx("path",{d:`M ${60-26.65} 56 A ${26.65} ${26.65} 0 0 1 ${60+26.65} 56`,fill:"none",stroke:n.gaugeTrack,strokeWidth:28.7,strokeLinecap:"butt"}),f&&e.jsx("path",{d:f,fill:"none",stroke:n.strong,strokeWidth:28.7,strokeLinecap:"butt"}),e.jsx("text",{x:60,y:56-41-4,textAnchor:"middle",fontSize:"13",fontFamily:o,fill:n.orange,children:"0"}),e.jsx("text",{x:60-41-9,y:56+5,textAnchor:"middle",fontSize:"14",fontFamily:o,fill:n.strong,children:"−"}),e.jsx("text",{x:60+41+9,y:56+5,textAnchor:"middle",fontSize:"14",fontFamily:o,fill:n.strong,children:"+"}),e.jsx("line",{x1:60,y1:56,x2:m,y2:p,stroke:n.orange,strokeWidth:2,strokeLinecap:"round"}),e.jsx("circle",{cx:60,cy:56,r:2.5,fill:n.orange})]})},A=({title:i,value:l,highlight:r,centerLabel:t,centerLabelColor:s,sublabel:a,footer:d,description:h})=>e.jsxs("div",{style:{flex:1,minWidth:0,display:"flex",flexDirection:"column",alignItems:"center",gap:10},children:[e.jsx("div",{style:{minHeight:40,display:"flex",alignItems:"center",justifyContent:"center",width:"100%"},children:e.jsx("span",{style:{fontFamily:o,fontSize:14,fontWeight:400,color:n.strong,lineHeight:"20px",textAlign:"center",width:"100%"},children:i})}),l==null?e.jsx("div",{style:{width:120,height:60,display:"flex",alignItems:"center",justifyContent:"center",marginBottom:-20},children:e.jsx("span",{style:{fontFamily:o,fontSize:28,fontWeight:400,color:n.muted,lineHeight:1},children:"—"})}):e.jsx(W,{value:l,highlight:r}),e.jsxs("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",gap:4,width:"100%"},children:[e.jsx("span",{style:{fontFamily:o,fontSize:14,fontWeight:600,color:t?s||"#272727":n.muted,lineHeight:"normal",textAlign:"center"},children:t||"—"}),a&&e.jsx("span",{style:{fontFamily:o,fontSize:13,fontWeight:400,color:n.muted,lineHeight:"normal",textAlign:"center",width:"100%"},children:a}),e.jsx("span",{style:{fontFamily:o,fontSize:13,fontWeight:400,color:d?n.strong:n.muted,lineHeight:"normal",textAlign:"center",width:"100%"},children:d||"—"}),h&&e.jsx("span",{style:{fontFamily:o,fontSize:13,fontWeight:400,color:n.muted,lineHeight:"normal",textAlign:"center",width:"100%",marginTop:4},children:h})]})]}),z=({percent:i,label:l,totalLabel:r="Total",description:t,status:s})=>{const a=(s==null?void 0:s.label)??l;return e.jsxs("div",{style:{flex:1,minWidth:0,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"flex-start",gap:16},children:[a&&e.jsx("div",{style:{minHeight:40,display:"flex",alignItems:"center",justifyContent:"center",width:"100%"},children:e.jsx("span",{style:{fontFamily:o,fontSize:14,fontWeight:600,color:n.strong,lineHeight:"normal",whiteSpace:"nowrap"},children:a})}),e.jsxs("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",gap:20,width:"100%"},children:[e.jsx("span",{style:{fontFamily:o,fontSize:34,fontWeight:400,color:n.strong,lineHeight:1.2,textAlign:"center",whiteSpace:"nowrap"},children:i!=null?`${i}%`:"—"}),e.jsxs("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",gap:4,width:"100%"},children:[r&&e.jsx("span",{style:{fontFamily:o,fontSize:14,fontWeight:600,color:"#272727",lineHeight:"normal",textAlign:"center",whiteSpace:"nowrap"},children:r}),t&&e.jsx("span",{style:{fontFamily:o,fontSize:13,fontWeight:400,color:n.muted,lineHeight:"normal",textAlign:"center",width:"100%"},children:t})]})]})]})},E=({variant:i="dashed"})=>e.jsx("div",{"aria-hidden":"true",style:{width:0,alignSelf:"stretch",borderLeft:`1px ${i} ${n.border}`,flexShrink:0}}),H=()=>e.jsxs("div",{style:{flex:1,minWidth:0,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:16,padding:"0 8px"},children:[e.jsx(S.Settings,{size:28,color:n.orange,strokeWidth:2,className:"chordia-cog-spin","aria-hidden":"true",style:{animation:"chordia-cog-spin 4s linear infinite",transformOrigin:"50% 50%",willChange:"transform"}}),e.jsx("span",{style:{fontFamily:o,fontSize:14,fontWeight:400,color:n.strong,lineHeight:1.2,textAlign:"center",maxWidth:120},children:"Compass is Learning..."})]}),k=({title:i="Agent Lift Analysis",status:l,interactionDifficulty:r,agentImpact:t,outcome:s,showInfoIcon:a=!0,onInfoClick:d,infoTooltip:h="Measures the agent's contribution to the call outcome by comparing actual performance against the expected result for similar calls."})=>{const g=Number(r==null?void 0:r.value)||0,c=Number(t==null?void 0:t.value)||0,y=(r==null?void 0:r.label)??R(g),m=(t==null?void 0:t.label)??R(c),p="#272727",f=(()=>{if((t==null?void 0:t.impactPercent)==null)return;const x=Number(t.impactPercent);if(Number.isFinite(x))return`${x<0?"-":""}${Math.abs(x)}% Score impact`})(),u=l??{label:s==null?void 0:s.label,direction:t!=null?F(c):"positive"};return e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:16,padding:"24px 16px",background:n.surface,border:`1px solid ${n.border}`,borderRadius:8,width:"100%",boxSizing:"border-box"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6,width:"100%"},children:[e.jsx("span",{style:{fontFamily:o,fontSize:15,fontWeight:700,color:n.strong,lineHeight:1.2,whiteSpace:"nowrap"},children:i}),e.jsx(_,{text:h,children:e.jsx("button",{type:"button",onClick:d,"aria-label":"About Agent Lift Analysis",style:{display:"inline-flex",alignItems:"center",justifyContent:"center",width:16,height:16,padding:0,border:"none",background:"transparent",cursor:h||d?"pointer":"default",color:n.muted},children:e.jsx(S.Info,{size:16,strokeWidth:1.75})})})]}),e.jsxs("div",{style:{display:"flex",alignItems:"stretch",gap:16,width:"100%"},children:[r&&e.jsx(A,{title:"Interaction Difficulty",value:g,highlight:null,centerLabel:y,centerLabelColor:p,sublabel:r.sublabel,footer:r.footer}),r&&t&&e.jsx(E,{variant:"dashed"}),t&&(t.isLearning?e.jsx(H,{}):e.jsx(A,{title:"Agent Impact",value:c,highlight:c,centerLabel:m,centerLabelColor:p,sublabel:t.sublabel,footer:f,description:t.description})),(r||t)&&s&&e.jsx(E,{variant:"solid"}),s&&e.jsx(z,{percent:s.percent,label:s.label,totalLabel:s.totalLabel??"Total",description:s.description,status:u})]})]})};exports.AgentLiftAnalysisCard=k;
10
+ //# sourceMappingURL=AgentLiftAnalysisCard.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentLiftAnalysisCard.cjs.js","sources":["../src/components/common/AgentLiftAnalysisCard.jsx"],"sourcesContent":["\"use client\";\n\nimport React, { useRef, useState } from \"react\";\nimport { ArrowUp, ArrowDown, Info, Settings } from \"lucide-react\";\n\n// Inject the cog-spin keyframes once per module load — the \"Compass is\n// Learning...\" column shows a slowly-rotating gear to signal that the model\n// is still computing in the background. CSS keyframes are GPU-accelerated\n// and cost zero JS per frame, so this is preferable to a motion/react\n// driven animation here. Guarded against SSR + re-injection (hot reload).\nconst COG_SPIN_STYLE_ID = \"chordia-cog-spin-style\";\nif (\n typeof document !== \"undefined\" &&\n !document.getElementById(COG_SPIN_STYLE_ID)\n) {\n const styleEl = document.createElement(\"style\");\n styleEl.id = COG_SPIN_STYLE_ID;\n styleEl.textContent = `\n @keyframes chordia-cog-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n @media (prefers-reduced-motion: reduce) {\n .chordia-cog-spin { animation: none !important; }\n }\n `;\n document.head.appendChild(styleEl);\n}\n\n/**\n * AgentLiftAnalysisCard — three-panel \"Agent Lift Analysis\" card.\n *\n * Figma node: 1441-8546\n *\n * Layout: title + status pill on top, then three columns separated by\n * vertical dividers:\n * 1. Interaction Difficulty — half-circle gauge with a vertical needle and\n * a centered text descriptor (e.g. \"Average\", \"Based on interaction\n * type\", \"75% Score impact\").\n * 2. Agent Impact (+X%) — same gauge style, plus a highlight arc that\n * shades the portion of the dial the value occupies. Label appears\n * below (\"Above Average\", \"Based on agent behaviors\").\n * 3. Outcome — large percentage value with a bold caption and short\n * description.\n *\n * Gauge values use a [-1, +1] scale where 0 sits at the top (vertical\n * needle) and the extremes correspond to the \"-\" / \"+\" tick labels. The\n * component clamps anything outside that range so hosts can pass through\n * raw deltas without normalising first.\n *\n * Props\n * - title string Card title (default \"Agent Lift Analysis\")\n * - status { label, direction } Header pill — `direction`\n * is `'positive' | 'negative' | 'neutral'` and\n * picks the arrow icon. Omit to hide the pill.\n * - interactionDifficulty { value, label, sublabel, footer }\n * - agentImpact { value, label, sublabel, impactPercent }\n * `impactPercent` (signed number) is appended to\n * the section title as \"Agent Impact (+5%)\".\n * - outcome { percent, label, description }\n * - showInfoIcon boolean Toggles the (i) icon next to the\n * status pill. Defaults to true.\n * - onInfoClick fn Click handler for the info icon.\n */\n\nconst COLORS = {\n strong: \"var(--Grey-Strong, #2E3236)\",\n muted: \"var(--Grey-Muted, #808183)\",\n faint: \"var(--Grey-Faint, #ACADAD)\",\n border: \"var(--Grey-absent, #D9D9D9)\",\n orange: \"var(--rail-orange, #C98A5A)\",\n // Card surface — warm off-white the Figma frame uses. Falls back to a hex\n // since this specific tone isn't in the existing token set.\n surface: \"#FAF9F5\",\n // Gauge ring (background semicircle)\n gaugeTrack: \"#E3E1D7\",\n};\n\nconst FONT_DISPLAY =\n \"var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)\";\n\nconst clamp = (v, lo, hi) => Math.max(lo, Math.min(hi, v));\n\nconst fmtSignedPercent = (value) => {\n if (value == null || Number.isNaN(value)) return null;\n const num = Number(value);\n if (!Number.isFinite(num)) return null;\n const sign = num >= 0 ? \"+\" : \"\";\n return `${sign}${num}%`;\n};\n\n// Translate a normalised [-1, +1] score into a descriptor used when the host\n// doesn't pass an explicit label (e.g. the API only sends raw numbers).\n// Thresholds are intentionally narrow so anything close to centre still\n// reads as \"Average\". Hosts can override by passing `label` directly.\nconst deriveLevelLabel = (value) => {\n const v = clamp(Number(value) || 0, -1, 1);\n if (v >= 0.6) return \"High\";\n if (v >= 0.15) return \"Above Average\";\n if (v <= -0.6) return \"Low\";\n if (v <= -0.15) return \"Below Average\";\n return \"Average\";\n};\n\n// Centre values get the orange accent (matches the gauge \"0\"); deltas use\n// the strong ink so the descriptor reads as movement away from average.\nconst deriveLevelColor = (value, fallback) => {\n const v = clamp(Number(value) || 0, -1, 1);\n return Math.abs(v) < 0.15\n ? \"var(--rail-orange, #C98A5A)\"\n : fallback || \"var(--Grey-Strong, #2E3236)\";\n};\n\n// Inferred direction for the header status pill when the host doesn't\n// supply one. Non-trivial positive lift → up arrow, non-trivial negative\n// → down arrow, otherwise neutral (no arrow).\nconst deriveDirection = (value) => {\n const v = Number(value);\n if (!Number.isFinite(v) || Math.abs(v) < 0.05) return \"neutral\";\n return v > 0 ? \"positive\" : \"negative\";\n};\n\n/* ── Hover tooltip ──\n Mirrors the `NameTooltip` pattern used elsewhere in the app: fixed\n positioning so the tooltip escapes overflow containers, anchored just\n below the trigger. Renders nothing when `text` is empty so callers can\n conditionally suppress it. */\nconst HoverTooltip = ({ text, children, maxWidth = 280 }) => {\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\n style={{\n position: \"fixed\",\n top: pos.top,\n left: pos.left,\n transform: \"translate(-50%, 0)\",\n maxWidth,\n padding: \"8px 12px\",\n borderRadius: 6,\n border: \"1px solid var(--Grey-absent, #D9D9D9)\",\n background: \"var(--Grey-Strong, #2E3236)\",\n color: \"#FFF\",\n fontFamily: FONT_DISPLAY,\n fontSize: 12,\n fontWeight: 400,\n lineHeight: 1.4,\n boxShadow: \"0 4px 12px rgba(0, 0, 0, 0.15)\",\n zIndex: 9999,\n pointerEvents: \"none\",\n whiteSpace: \"normal\",\n textAlign: \"left\",\n }}\n >\n {text}\n </div>\n )}\n </div>\n );\n};\n\n/* ── Half-circle gauge with optional highlight arc ──\n value — number in [-1, +1] driving the needle angle.\n highlight — number in [-1, +1]; when truthy, renders a darker arc from 0\n (top) to the corresponding angle on the dial.\n\n Geometry matches Figma node 1430:4087: a filled half-donut with\n outer radius R_OUTER = 41\n inner radius R_INNER ≈ 12.3\n which we render as a stroked centerline arc (radius = (R+r)/2 = 26.65,\n stroke = R-r = 28.7, butt cap). Visually identical to the Figma SVG path\n but lets the highlight arc be expressed as the same stroke trick with a\n shorter end-angle — no per-segment path math needed. */\nconst Gauge = ({ value = 0, highlight = null }) => {\n const cx = 60;\n const cy = 56;\n const R_OUTER = 41;\n const R_INNER = 12.3;\n const R_CENTER = (R_OUTER + R_INNER) / 2; // 26.65\n const TRACK_WIDTH = R_OUTER - R_INNER; // 28.7\n const needleLen = 38;\n\n const v = clamp(Number(value) || 0, -1, 1);\n const angleRad = v * (Math.PI / 2);\n const tipX = cx + needleLen * Math.sin(angleRad);\n const tipY = cy - needleLen * Math.cos(angleRad);\n\n // Highlight arc path — partial centerline arc from the top of the dial\n // (angle 0) to the value angle. Sweep flag flips with the sign so\n // negative highlights arc to the left.\n let highlightPath = null;\n if (highlight != null) {\n const h = clamp(Number(highlight) || 0, -1, 1);\n if (h !== 0) {\n const hAngle = h * (Math.PI / 2);\n const startX = cx;\n const startY = cy - R_CENTER;\n const endX = cx + R_CENTER * Math.sin(hAngle);\n const endY = cy - R_CENTER * Math.cos(hAngle);\n const sweep = h > 0 ? 1 : 0;\n highlightPath = `M ${startX} ${startY} A ${R_CENTER} ${R_CENTER} 0 0 ${sweep} ${endX} ${endY}`;\n }\n }\n\n return (\n // viewBox is 120×80 but the visible dial only occupies the top ~56px\n // (half-circle centred at cy=56). `marginBottom: -24` pulls the\n // following element up by the unused bottom band so the gauge column\n // doesn't reserve that empty space in the flow — matches Figma's\n // `mb-[-30px]` on the gauge wrapper and keeps the Outcome column's\n // bottom-anchored percent block from being pushed too far down.\n <svg\n width=\"120\"\n height=\"80\"\n viewBox=\"0 0 120 80\"\n role=\"img\"\n aria-hidden=\"true\"\n style={{ marginBottom: -20, display: \"block\" }}\n >\n {/* Background half-donut — stroked semicircle with R-r thickness */}\n <path\n d={`M ${cx - R_CENTER} ${cy} A ${R_CENTER} ${R_CENTER} 0 0 1 ${cx + R_CENTER} ${cy}`}\n fill=\"none\"\n stroke={COLORS.gaugeTrack}\n strokeWidth={TRACK_WIDTH}\n strokeLinecap=\"butt\"\n />\n {/* Highlight arc — same stroke trick, shorter end angle */}\n {highlightPath && (\n <path\n d={highlightPath}\n fill=\"none\"\n stroke={COLORS.strong}\n strokeWidth={TRACK_WIDTH}\n strokeLinecap=\"butt\"\n />\n )}\n {/* \"0\" label centered above the outer arc */}\n <text\n x={cx}\n y={cy - R_OUTER - 4}\n textAnchor=\"middle\"\n fontSize=\"13\"\n fontFamily={FONT_DISPLAY}\n fill={COLORS.orange}\n >\n 0\n </text>\n {/* \"-\" left, \"+\" right tick labels, sitting at the outer dial edge */}\n <text\n x={cx - R_OUTER - 9}\n y={cy + 5}\n textAnchor=\"middle\"\n fontSize=\"14\"\n fontFamily={FONT_DISPLAY}\n fill={COLORS.strong}\n >\n −\n </text>\n <text\n x={cx + R_OUTER + 9}\n y={cy + 5}\n textAnchor=\"middle\"\n fontSize=\"14\"\n fontFamily={FONT_DISPLAY}\n fill={COLORS.strong}\n >\n +\n </text>\n {/* Needle — extends from pivot (center bottom) to near the outer rim */}\n <line\n x1={cx}\n y1={cy}\n x2={tipX}\n y2={tipY}\n stroke={COLORS.orange}\n strokeWidth={2}\n strokeLinecap=\"round\"\n />\n {/* Needle pivot dot */}\n <circle cx={cx} cy={cy} r={2.5} fill={COLORS.orange} />\n </svg>\n );\n};\n\n/* ── Single gauge column (title + gauge + description block) ── */\nconst GaugeColumn = ({\n title,\n value,\n highlight,\n centerLabel,\n centerLabelColor,\n sublabel,\n footer,\n description,\n}) => (\n <div\n style={{\n flex: 1,\n minWidth: 0,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 10,\n }}\n >\n {/* Title — reserves a fixed 2-line block so the gauge below it always\n starts at the same Y as the sibling column, regardless of whether\n this title wraps to 1 line (\"Agent Impact\") or 2 lines\n (\"Interaction Difficulty\"). The flex centring also makes a 1-line\n title sit at the visual midline of the 2-line slot, so the two\n gauges land in the same horizontal band. */}\n <div\n style={{\n minHeight: 40,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"100%\",\n }}\n >\n <span\n style={{\n fontFamily: FONT_DISPLAY,\n fontSize: 14,\n fontWeight: 400,\n color: COLORS.strong,\n lineHeight: \"20px\",\n textAlign: \"center\",\n width: \"100%\",\n }}\n >\n {title}\n </span>\n </div>\n {value == null ? (\n // Gauge swapped for an em-dash placeholder when the API ships no\n // numeric value for this column. Same 60px height as the gauge SVG\n // (after its -20 negative margin) so the columns stay aligned.\n <div\n style={{\n width: 120,\n height: 60,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n marginBottom: -20,\n }}\n >\n <span\n style={{\n fontFamily: FONT_DISPLAY,\n fontSize: 28,\n fontWeight: 400,\n color: COLORS.muted,\n lineHeight: 1,\n }}\n >\n —\n </span>\n </div>\n ) : (\n <Gauge value={value} highlight={highlight} />\n )}\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 4,\n width: \"100%\",\n }}\n >\n <span\n style={{\n fontFamily: FONT_DISPLAY,\n // Figma 1463:4261 spec: 14px Averta-Semibold, Neutral/850\n // (#272727) for both \"Average\" and \"Above Average\".\n fontSize: 14,\n fontWeight: 600,\n color: centerLabel ? (centerLabelColor || \"#272727\") : COLORS.muted,\n lineHeight: \"normal\",\n textAlign: \"center\",\n }}\n >\n {centerLabel || \"—\"}\n </span>\n {sublabel && (\n <span\n style={{\n fontFamily: FONT_DISPLAY,\n fontSize: 13,\n fontWeight: 400,\n color: COLORS.muted,\n lineHeight: \"normal\",\n textAlign: \"center\",\n width: \"100%\",\n }}\n >\n {sublabel}\n </span>\n )}\n <span\n style={{\n fontFamily: FONT_DISPLAY,\n fontSize: 13,\n fontWeight: 400,\n color: footer ? COLORS.strong : COLORS.muted,\n lineHeight: \"normal\",\n textAlign: \"center\",\n width: \"100%\",\n }}\n >\n {footer || \"—\"}\n </span>\n {description && (\n <span\n style={{\n fontFamily: FONT_DISPLAY,\n fontSize: 13,\n fontWeight: 400,\n color: COLORS.muted,\n lineHeight: \"normal\",\n textAlign: \"center\",\n width: \"100%\",\n marginTop: 4,\n }}\n >\n {description}\n </span>\n )}\n </div>\n </div>\n);\n\n/* ── Outcome column ──\n Per Figma 1463:4261, the column now hosts the status pill that used to\n live in the card header. Layout (top → bottom):\n 1. Status pill — arrow + outcome label + (i) info icon\n 2. Big 80% percent\n 3. \"Total\" caption (was \"Positive Outcome\" in the prior design — that\n text now lives in the status pill instead)\n 4. Muted description paragraph\n\n The column uses `justify-between` so the pill anchors to the top and the\n percent / caption / description anchor to the bottom of the row height,\n matching the Figma frame exactly. */\nconst OutcomeColumn = ({\n percent,\n label,\n totalLabel = \"Total\",\n description,\n status,\n}) => {\n // Only the label text matters now — the directional arrow and info icon\n // that used to sit alongside it were removed in the latest review.\n const pillLabel = status?.label ?? label;\n return (\n // Top-aligned stack — pill → percent → Total / description, all hugging\n // the top of the column with the root `gap: 16` between them. The row\n // still uses `align-items: stretch` so the column visually fills the\n // row height, but any leftover space falls to the BOTTOM of the column\n // (after the description) rather than being distributed between the\n // pill and the percent. This keeps the Outcome content tight even\n // when the gauge columns are taller, matching the visual rhythm\n // requested in the latest review.\n <div\n style={{\n flex: 1,\n minWidth: 0,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"flex-start\",\n gap: 16,\n }}\n >\n {/* Status pill (was the card-header pill in the prior design).\n Wrapped in the same 40px / flex-centred slot used by the gauge\n column titles so the pill text baseline lines up with\n \"Interaction Difficulty\" and \"Agent Impact\" on the sibling\n columns — otherwise it sits 10px higher at the top of the row. */}\n {pillLabel && (\n <div\n style={{\n minHeight: 40,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"100%\",\n }}\n >\n {/* Outcome label only — the direction arrow and info icon were\n removed per the latest review. The card-level info-icon (next\n to the title) still surfaces the \"what is this?\" affordance,\n so duplicating it here added noise without value, and the\n arrow's positive/negative cue is already conveyed by the\n percentage + the Total descriptor below. */}\n <span\n style={{\n fontFamily: FONT_DISPLAY,\n fontSize: 14,\n fontWeight: 600,\n color: COLORS.strong,\n lineHeight: \"normal\",\n whiteSpace: \"nowrap\",\n }}\n >\n {pillLabel}\n </span>\n </div>\n )}\n\n {/* Percent + Total + description. Inner block matches Figma node\n 1542:4333 (`flex-col` with `Total` + description nested in a\n `gap-[4px]`); we bump the gap between the big percent and the\n Total caption to 20px so the bottom block breathes — the 8px\n spec from Figma read too tight in the live layout. */}\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 20,\n width: \"100%\",\n }}\n >\n <span\n style={{\n fontFamily: FONT_DISPLAY,\n fontSize: 34,\n fontWeight: 400,\n color: COLORS.strong,\n lineHeight: 1.2,\n textAlign: \"center\",\n whiteSpace: \"nowrap\",\n }}\n >\n {percent != null ? `${percent}%` : \"—\"}\n </span>\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 4,\n width: \"100%\",\n }}\n >\n {totalLabel && (\n <span\n style={{\n fontFamily: FONT_DISPLAY,\n fontSize: 14,\n fontWeight: 600,\n color: \"#272727\",\n lineHeight: \"normal\",\n textAlign: \"center\",\n whiteSpace: \"nowrap\",\n }}\n >\n {totalLabel}\n </span>\n )}\n {description && (\n <span\n style={{\n fontFamily: FONT_DISPLAY,\n fontSize: 13,\n fontWeight: 400,\n color: COLORS.muted,\n lineHeight: \"normal\",\n textAlign: \"center\",\n width: \"100%\",\n }}\n >\n {description}\n </span>\n )}\n </div>\n </div>\n </div>\n );\n};\n\n/* ── Vertical divider between columns ──\n Figma uses two different rules:\n - Between Interaction Difficulty and Agent Impact (node 1432:6429):\n 1px DASHED line.\n - Between Agent Impact and Outcome (node 1432:6432): 1px SOLID line.\n Implemented as a single component with a `variant` prop so callers don't\n have to repeat the same wrapper twice. */\nconst VDivider = ({ variant = \"dashed\" }) => (\n <div\n aria-hidden=\"true\"\n style={{\n width: 0,\n alignSelf: \"stretch\",\n borderLeft: `1px ${variant} ${COLORS.border}`,\n flexShrink: 0,\n }}\n />\n);\n\n/* ── \"Compass is Learning..\" column ──\n Rendered in place of the Agent Impact gauge when the API ships\n `interpretation.lift_band: \"learning\"`. Mirrors Figma node 1211:4526:\n centered settings icon (orange) + 13px \"Compass is Learning..\" caption,\n 16px gap, takes the same `flex: 1` width so the row layout stays the\n same as the gauge column it's replacing. */\nconst LearningColumn = () => (\n <div\n style={{\n flex: 1,\n minWidth: 0,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 16,\n padding: \"0 8px\",\n }}\n >\n <Settings\n size={28}\n color={COLORS.orange}\n strokeWidth={2}\n className=\"chordia-cog-spin\"\n aria-hidden=\"true\"\n style={{\n animation: \"chordia-cog-spin 4s linear infinite\",\n transformOrigin: \"50% 50%\",\n willChange: \"transform\",\n }}\n />\n <span\n style={{\n fontFamily: FONT_DISPLAY,\n fontSize: 14,\n fontWeight: 400,\n color: COLORS.strong,\n lineHeight: 1.2,\n textAlign: \"center\",\n maxWidth: 120,\n }}\n >\n Compass is Learning...\n </span>\n </div>\n);\n\n/* ── Main component ── */\nconst AgentLiftAnalysisCard = ({\n title = \"Agent Lift Analysis\",\n status,\n interactionDifficulty,\n agentImpact,\n outcome,\n showInfoIcon = true,\n onInfoClick,\n // Tooltip text rendered on hover of the (i) icon next to the card\n // title. The default explains what this section measures; hosts can\n // override per-context if needed.\n infoTooltip = \"Measures the agent's contribution to the call outcome by comparing actual performance against the expected result for similar calls.\",\n}) => {\n // Resolve dynamic values from the API. Anything the host supplies wins;\n // when fields are absent we derive them from the numeric `value` so the\n // card stays readable even with a bare API payload like\n // `{ value: 0.3, impact_percent: 5 }`.\n const difficultyValue = Number(interactionDifficulty?.value) || 0;\n const impactValue = Number(agentImpact?.value) || 0;\n\n const difficultyLabel =\n interactionDifficulty?.label ?? deriveLevelLabel(difficultyValue);\n const impactLabel = agentImpact?.label ?? deriveLevelLabel(impactValue);\n\n // Per Figma 1463:4261 both gauge labels use Neutral/850 (#272727) at\n // 14px / Averta-Semibold — the orange-for-Average tint is gone.\n const gaugeLabelColor = \"#272727\";\n\n // Agent Impact column gains a \"X% Score impact\" footer (mirroring the\n // Interaction Difficulty footer). The (+X%) suffix that previously lived\n // in the section title is gone. We preserve the negative sign so a\n // detrimental impact reads \"-7% Score impact\" rather than masquerading\n // as a positive number, but skip a leading \"+\" for positive values to\n // match the Figma copy.\n const impactFooter = (() => {\n if (agentImpact?.impactPercent == null) return undefined;\n const n = Number(agentImpact.impactPercent);\n if (!Number.isFinite(n)) return undefined;\n return `${n < 0 ? \"-\" : \"\"}${Math.abs(n)}% Score impact`;\n })();\n\n // Status pill — defaults to the agent-impact direction with the outcome\n // label as the text (\"Positive Outcome\" / \"Negative Outcome\"). Hosts can\n // override with an explicit `status` prop.\n const resolvedStatus = status ?? {\n label: outcome?.label,\n direction:\n agentImpact != null\n ? deriveDirection(impactValue)\n : \"positive\",\n };\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n padding: \"24px 16px\",\n background: COLORS.surface,\n border: `1px solid ${COLORS.border}`,\n borderRadius: 8,\n width: \"100%\",\n boxSizing: \"border-box\",\n }}\n >\n {/* Header — title + (i) info icon. The status pill lives inside\n the Outcome column; when the host disables `showInfoIcon` on the\n pill (the current default), the (i) trigger lives here instead. */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n width: \"100%\",\n }}\n >\n <span\n style={{\n fontFamily: FONT_DISPLAY,\n fontSize: 15,\n fontWeight: 700,\n color: COLORS.strong,\n lineHeight: 1.2,\n whiteSpace: \"nowrap\",\n }}\n >\n {title}\n </span>\n <HoverTooltip text={infoTooltip}>\n <button\n type=\"button\"\n onClick={onInfoClick}\n aria-label=\"About Agent Lift Analysis\"\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 16,\n height: 16,\n padding: 0,\n border: \"none\",\n background: \"transparent\",\n // Pointer cursor whenever the (i) has something to surface —\n // a tooltip on hover or a click handler. Since `infoTooltip`\n // defaults to a non-empty string, the icon almost always\n // reads as interactive.\n cursor:\n infoTooltip || onInfoClick ? \"pointer\" : \"default\",\n color: COLORS.muted,\n }}\n >\n <Info size={16} strokeWidth={1.75} />\n </button>\n </HoverTooltip>\n </div>\n\n {/* Body: three columns split by vertical dividers */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"stretch\",\n gap: 16,\n width: \"100%\",\n }}\n >\n {interactionDifficulty && (\n <GaugeColumn\n title=\"Interaction Difficulty\"\n value={difficultyValue}\n highlight={null}\n centerLabel={difficultyLabel}\n centerLabelColor={gaugeLabelColor}\n sublabel={interactionDifficulty.sublabel}\n footer={interactionDifficulty.footer}\n />\n )}\n {interactionDifficulty && agentImpact && (\n <VDivider variant=\"dashed\" />\n )}\n {agentImpact && (\n agentImpact.isLearning ? (\n <LearningColumn />\n ) : (\n <GaugeColumn\n title=\"Agent Impact\"\n value={impactValue}\n highlight={impactValue}\n centerLabel={impactLabel}\n centerLabelColor={gaugeLabelColor}\n sublabel={agentImpact.sublabel}\n footer={impactFooter}\n description={agentImpact.description}\n />\n )\n )}\n {(interactionDifficulty || agentImpact) && outcome && (\n <VDivider variant=\"solid\" />\n )}\n {outcome && (\n <OutcomeColumn\n percent={outcome.percent}\n label={outcome.label}\n totalLabel={outcome.totalLabel ?? \"Total\"}\n description={outcome.description}\n status={resolvedStatus}\n />\n )}\n </div>\n </div>\n );\n};\n\nexport default AgentLiftAnalysisCard;\n"],"names":["COG_SPIN_STYLE_ID","styleEl","COLORS","FONT_DISPLAY","clamp","v","lo","hi","deriveLevelLabel","value","deriveDirection","HoverTooltip","text","children","maxWidth","show","setShow","useState","triggerRef","useRef","pos","setPos","handleEnter","rect","jsxs","jsx","Gauge","highlight","angleRad","tipX","tipY","highlightPath","h","hAngle","startX","startY","endX","endY","sweep","GaugeColumn","title","centerLabel","centerLabelColor","sublabel","footer","description","OutcomeColumn","percent","label","totalLabel","status","pillLabel","VDivider","variant","LearningColumn","Settings","AgentLiftAnalysisCard","interactionDifficulty","agentImpact","outcome","showInfoIcon","onInfoClick","infoTooltip","difficultyValue","impactValue","difficultyLabel","impactLabel","gaugeLabelColor","impactFooter","n","resolvedStatus","Info"],"mappings":"+FAUMA,EAAoB,yBAC1B,GACE,OAAO,SAAa,KACpB,CAAC,SAAS,eAAeA,CAAiB,EAC1C,CACM,MAAAC,EAAU,SAAS,cAAc,OAAO,EAC9CA,EAAQ,GAAKD,EACbC,EAAQ,YAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASb,SAAA,KAAK,YAAYA,CAAO,CACnC,CAsCA,MAAMC,EAAS,CACb,OAAQ,8BACR,MAAO,6BACP,MAAO,6BACP,OAAQ,8BACR,OAAQ,8BAGR,QAAS,UAET,WAAY,SACd,EAEMC,EACJ,mEAEIC,EAAQ,CAACC,EAAGC,EAAIC,IAAO,KAAK,IAAID,EAAI,KAAK,IAAIC,EAAIF,CAAC,CAAC,EAcnDG,EAAoBC,GAAU,CAClC,MAAMJ,EAAID,EAAM,OAAOK,CAAK,GAAK,EAAG,GAAI,CAAC,EACzC,OAAIJ,GAAK,GAAY,OACjBA,GAAK,IAAa,gBAClBA,GAAK,IAAa,MAClBA,GAAK,KAAc,gBAChB,SACT,EAcMK,EAAmBD,GAAU,CAC3B,MAAAJ,EAAI,OAAOI,CAAK,EAClB,MAAA,CAAC,OAAO,SAASJ,CAAC,GAAK,KAAK,IAAIA,CAAC,EAAI,IAAa,UAC/CA,EAAI,EAAI,WAAa,UAC9B,EAOMM,EAAe,CAAC,CAAE,KAAAC,EAAM,SAAAC,EAAU,SAAAC,EAAW,OAAU,CAC3D,KAAM,CAACC,EAAMC,CAAO,EAAIC,WAAS,EAAK,EAChCC,EAAaC,SAAO,IAAI,EACxB,CAACC,EAAKC,CAAM,EAAIJ,EAAA,SAAS,CAAE,IAAK,EAAG,KAAM,CAAA,CAAG,EAElD,GAAI,CAACL,EAAa,OAAAC,EAElB,MAAMS,EAAc,IAAM,CACxB,GAAIJ,EAAW,QAAS,CAChB,MAAAK,EAAOL,EAAW,QAAQ,sBAAsB,EAC/CG,EAAA,CACL,IAAKE,EAAK,OAAS,EACnB,KAAMA,EAAK,KAAOA,EAAK,MAAQ,CAAA,CAChC,CACH,CACAP,EAAQ,EAAI,CAAA,EAIZ,OAAAQ,EAAA,KAAC,MAAA,CACC,IAAKN,EACL,MAAO,CAAE,SAAU,WAAY,QAAS,aAAc,EACtD,aAAcI,EACd,aAAc,IAAMN,EAAQ,EAAK,EAEhC,SAAA,CAAAH,EACAE,GACCU,EAAA,IAAC,MAAA,CACC,MAAO,CACL,SAAU,QACV,IAAKL,EAAI,IACT,KAAMA,EAAI,KACV,UAAW,qBACX,SAAAN,EACA,QAAS,WACT,aAAc,EACd,OAAQ,wCACR,WAAY,8BACZ,MAAO,OACP,WAAYX,EACZ,SAAU,GACV,WAAY,IACZ,WAAY,IACZ,UAAW,iCACX,OAAQ,KACR,cAAe,OACf,WAAY,SACZ,UAAW,MACb,EAEC,SAAAS,CAAA,CACH,CAAA,CAAA,CAAA,CAIR,EAcMc,EAAQ,CAAC,CAAE,MAAAjB,EAAQ,EAAG,UAAAkB,EAAY,QAAW,CAU3C,MAAAC,EADIxB,EAAM,OAAOK,CAAK,GAAK,EAAG,GAAI,CAAC,GACnB,KAAK,GAAK,GAC1BoB,EAAO,GAAK,GAAY,KAAK,IAAID,CAAQ,EACzCE,EAAO,GAAK,GAAY,KAAK,IAAIF,CAAQ,EAK/C,IAAIG,EAAgB,KACpB,GAAIJ,GAAa,KAAM,CACrB,MAAMK,EAAI5B,EAAM,OAAOuB,CAAS,GAAK,EAAG,GAAI,CAAC,EAC7C,GAAIK,IAAM,EAAG,CACL,MAAAC,EAASD,GAAK,KAAK,GAAK,GACxBE,EAAS,GACTC,EAAS,GAAK,MACdC,EAAO,GAAK,MAAW,KAAK,IAAIH,CAAM,EACtCI,EAAO,GAAK,MAAW,KAAK,IAAIJ,CAAM,EACtCK,EAAQN,EAAI,EAAI,EAAI,EAC1BD,EAAgB,KAAKG,CAAM,IAAIC,CAAM,MAAM,KAAQ,IAAI,KAAQ,QAAQG,CAAK,IAAIF,CAAI,IAAIC,CAAI,EAC9F,CACF,CAEA,OAOEb,EAAA,KAAC,MAAA,CACC,MAAM,MACN,OAAO,KACP,QAAQ,aACR,KAAK,MACL,cAAY,OACZ,MAAO,CAAE,aAAc,IAAK,QAAS,OAAQ,EAG7C,SAAA,CAAAC,EAAA,IAAC,OAAA,CACC,EAAG,KAAK,GAAK,KAAQ,SAAY,KAAQ,IAAI,KAAQ,UAAU,GAAK,KAAQ,MAC5E,KAAK,OACL,OAAQvB,EAAO,WACf,YAAa,KACb,cAAc,MAAA,CAChB,EAEC6B,GACCN,EAAA,IAAC,OAAA,CACC,EAAGM,EACH,KAAK,OACL,OAAQ7B,EAAO,OACf,YAAa,KACb,cAAc,MAAA,CAChB,EAGFuB,EAAA,IAAC,OAAA,CACC,EAAG,GACH,EAAG,GAAK,GAAU,EAClB,WAAW,SACX,SAAS,KACT,WAAYtB,EACZ,KAAMD,EAAO,OACd,SAAA,GAAA,CAED,EAEAuB,EAAA,IAAC,OAAA,CACC,EAAG,GAAK,GAAU,EAClB,EAAG,GAAK,EACR,WAAW,SACX,SAAS,KACT,WAAYtB,EACZ,KAAMD,EAAO,OACd,SAAA,GAAA,CAED,EACAuB,EAAA,IAAC,OAAA,CACC,EAAG,GAAK,GAAU,EAClB,EAAG,GAAK,EACR,WAAW,SACX,SAAS,KACT,WAAYtB,EACZ,KAAMD,EAAO,OACd,SAAA,GAAA,CAED,EAEAuB,EAAA,IAAC,OAAA,CACC,GAAI,GACJ,GAAI,GACJ,GAAII,EACJ,GAAIC,EACJ,OAAQ5B,EAAO,OACf,YAAa,EACb,cAAc,OAAA,CAChB,EAEAuB,MAAC,UAAO,MAAQ,MAAQ,EAAG,IAAK,KAAMvB,EAAO,OAAQ,CAAA,CAAA,CACvD,CAEJ,EAGMqC,EAAc,CAAC,CACnB,MAAAC,EACA,MAAA/B,EACA,UAAAkB,EACA,YAAAc,EACA,iBAAAC,EACA,SAAAC,EACA,OAAAC,EACA,YAAAC,CACF,IACErB,EAAA,KAAC,MAAA,CACC,MAAO,CACL,KAAM,EACN,SAAU,EACV,QAAS,OACT,cAAe,SACf,WAAY,SACZ,IAAK,EACP,EAQA,SAAA,CAAAC,EAAA,IAAC,MAAA,CACC,MAAO,CACL,UAAW,GACX,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,MAAO,MACT,EAEA,SAAAA,EAAA,IAAC,OAAA,CACC,MAAO,CACL,WAAYtB,EACZ,SAAU,GACV,WAAY,IACZ,MAAOD,EAAO,OACd,WAAY,OACZ,UAAW,SACX,MAAO,MACT,EAEC,SAAAsC,CAAA,CACH,CAAA,CACF,EACC/B,GAAS,KAIRgB,EAAA,IAAC,MAAA,CACC,MAAO,CACL,MAAO,IACP,OAAQ,GACR,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,aAAc,GAChB,EAEA,SAAAA,EAAA,IAAC,OAAA,CACC,MAAO,CACL,WAAYtB,EACZ,SAAU,GACV,WAAY,IACZ,MAAOD,EAAO,MACd,WAAY,CACd,EACD,SAAA,GAAA,CAED,CAAA,CACF,EAEAuB,EAAAA,IAACC,EAAM,CAAA,MAAAjB,EAAc,UAAAkB,CAAsB,CAAA,EAE7CH,EAAA,KAAC,MAAA,CACC,MAAO,CACL,QAAS,OACT,cAAe,SACf,WAAY,SACZ,IAAK,EACL,MAAO,MACT,EAEA,SAAA,CAAAC,EAAA,IAAC,OAAA,CACC,MAAO,CACL,WAAYtB,EAGZ,SAAU,GACV,WAAY,IACZ,MAAOsC,EAAeC,GAAoB,UAAaxC,EAAO,MAC9D,WAAY,SACZ,UAAW,QACb,EAEC,SAAeuC,GAAA,GAAA,CAClB,EACCE,GACClB,EAAA,IAAC,OAAA,CACC,MAAO,CACL,WAAYtB,EACZ,SAAU,GACV,WAAY,IACZ,MAAOD,EAAO,MACd,WAAY,SACZ,UAAW,SACX,MAAO,MACT,EAEC,SAAAyC,CAAA,CACH,EAEFlB,EAAA,IAAC,OAAA,CACC,MAAO,CACL,WAAYtB,EACZ,SAAU,GACV,WAAY,IACZ,MAAOyC,EAAS1C,EAAO,OAASA,EAAO,MACvC,WAAY,SACZ,UAAW,SACX,MAAO,MACT,EAEC,SAAU0C,GAAA,GAAA,CACb,EACCC,GACCpB,EAAA,IAAC,OAAA,CACC,MAAO,CACL,WAAYtB,EACZ,SAAU,GACV,WAAY,IACZ,MAAOD,EAAO,MACd,WAAY,SACZ,UAAW,SACX,MAAO,OACP,UAAW,CACb,EAEC,SAAA2C,CAAA,CACH,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,EAeIC,EAAgB,CAAC,CACrB,QAAAC,EACA,MAAAC,EACA,WAAAC,EAAa,QACb,YAAAJ,EACA,OAAAK,CACF,IAAM,CAGE,MAAAC,GAAYD,GAAA,YAAAA,EAAQ,QAASF,EACnC,OASExB,EAAA,KAAC,MAAA,CACC,MAAO,CACL,KAAM,EACN,SAAU,EACV,QAAS,OACT,cAAe,SACf,WAAY,SACZ,eAAgB,aAChB,IAAK,EACP,EAOC,SAAA,CACC2B,GAAA1B,EAAA,IAAC,MAAA,CACC,MAAO,CACL,UAAW,GACX,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,MAAO,MACT,EAQA,SAAAA,EAAA,IAAC,OAAA,CACC,MAAO,CACL,WAAYtB,EACZ,SAAU,GACV,WAAY,IACZ,MAAOD,EAAO,OACd,WAAY,SACZ,WAAY,QACd,EAEC,SAAAiD,CAAA,CACH,CAAA,CACF,EAQF3B,EAAA,KAAC,MAAA,CACC,MAAO,CACL,QAAS,OACT,cAAe,SACf,WAAY,SACZ,IAAK,GACL,MAAO,MACT,EAEA,SAAA,CAAAC,EAAA,IAAC,OAAA,CACC,MAAO,CACL,WAAYtB,EACZ,SAAU,GACV,WAAY,IACZ,MAAOD,EAAO,OACd,WAAY,IACZ,UAAW,SACX,WAAY,QACd,EAEC,SAAW6C,GAAA,KAAO,GAAGA,CAAO,IAAM,GAAA,CACrC,EACAvB,EAAA,KAAC,MAAA,CACC,MAAO,CACL,QAAS,OACT,cAAe,SACf,WAAY,SACZ,IAAK,EACL,MAAO,MACT,EAEC,SAAA,CACCyB,GAAAxB,EAAA,IAAC,OAAA,CACC,MAAO,CACL,WAAYtB,EACZ,SAAU,GACV,WAAY,IACZ,MAAO,UACP,WAAY,SACZ,UAAW,SACX,WAAY,QACd,EAEC,SAAA8C,CAAA,CACH,EAEDJ,GACCpB,EAAA,IAAC,OAAA,CACC,MAAO,CACL,WAAYtB,EACZ,SAAU,GACV,WAAY,IACZ,MAAOD,EAAO,MACd,WAAY,SACZ,UAAW,SACX,MAAO,MACT,EAEC,SAAA2C,CAAA,CACH,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,EASMO,EAAW,CAAC,CAAE,QAAAC,EAAU,QAC5B,IAAA5B,EAAA,IAAC,MAAA,CACC,cAAY,OACZ,MAAO,CACL,MAAO,EACP,UAAW,UACX,WAAY,OAAO4B,CAAO,IAAInD,EAAO,MAAM,GAC3C,WAAY,CACd,CAAA,CACF,EASIoD,EAAiB,IACrB9B,EAAA,KAAC,MAAA,CACC,MAAO,CACL,KAAM,EACN,SAAU,EACV,QAAS,OACT,cAAe,SACf,WAAY,SACZ,eAAgB,SAChB,IAAK,GACL,QAAS,OACX,EAEA,SAAA,CAAAC,EAAA,IAAC8B,EAAA,SAAA,CACC,KAAM,GACN,MAAOrD,EAAO,OACd,YAAa,EACb,UAAU,mBACV,cAAY,OACZ,MAAO,CACL,UAAW,sCACX,gBAAiB,UACjB,WAAY,WACd,CAAA,CACF,EACAuB,EAAA,IAAC,OAAA,CACC,MAAO,CACL,WAAYtB,EACZ,SAAU,GACV,WAAY,IACZ,MAAOD,EAAO,OACd,WAAY,IACZ,UAAW,SACX,SAAU,GACZ,EACD,SAAA,wBAAA,CAED,CAAA,CAAA,CACF,EAIIsD,EAAwB,CAAC,CAC7B,MAAAhB,EAAQ,sBACR,OAAAU,EACA,sBAAAO,EACA,YAAAC,EACA,QAAAC,EACA,aAAAC,EAAe,GACf,YAAAC,EAIA,YAAAC,EAAc,sIAChB,IAAM,CAKJ,MAAMC,EAAkB,OAAON,GAAA,YAAAA,EAAuB,KAAK,GAAK,EAC1DO,EAAc,OAAON,GAAA,YAAAA,EAAa,KAAK,GAAK,EAE5CO,GACJR,GAAA,YAAAA,EAAuB,QAASjD,EAAiBuD,CAAe,EAC5DG,GAAcR,GAAA,YAAAA,EAAa,QAASlD,EAAiBwD,CAAW,EAIhEG,EAAkB,UAQlBC,GAAgB,IAAM,CAC1B,IAAIV,GAAA,YAAAA,EAAa,gBAAiB,KAAa,OACzC,MAAAW,EAAI,OAAOX,EAAY,aAAa,EACtC,GAAC,OAAO,SAASW,CAAC,EACf,MAAA,GAAGA,EAAI,EAAI,IAAM,EAAE,GAAG,KAAK,IAAIA,CAAC,CAAC,gBAAA,KAMpCC,EAAiBpB,GAAU,CAC/B,MAAOS,GAAA,YAAAA,EAAS,MAChB,UACED,GAAe,KACXhD,EAAgBsD,CAAW,EAC3B,UAAA,EAIN,OAAAxC,EAAA,KAAC,MAAA,CACC,MAAO,CACL,QAAS,OACT,cAAe,SACf,IAAK,GACL,QAAS,YACT,WAAYtB,EAAO,QACnB,OAAQ,aAAaA,EAAO,MAAM,GAClC,aAAc,EACd,MAAO,OACP,UAAW,YACb,EAKA,SAAA,CAAAsB,EAAA,KAAC,MAAA,CACC,MAAO,CACL,QAAS,OACT,WAAY,SACZ,IAAK,EACL,MAAO,MACT,EAEA,SAAA,CAAAC,EAAA,IAAC,OAAA,CACC,MAAO,CACL,WAAYtB,EACZ,SAAU,GACV,WAAY,IACZ,MAAOD,EAAO,OACd,WAAY,IACZ,WAAY,QACd,EAEC,SAAAsC,CAAA,CACH,EACAf,EAAAA,IAACd,EAAa,CAAA,KAAMmD,EAClB,SAAArC,EAAA,IAAC,SAAA,CACC,KAAK,SACL,QAASoC,EACT,aAAW,4BACX,MAAO,CACL,QAAS,cACT,WAAY,SACZ,eAAgB,SAChB,MAAO,GACP,OAAQ,GACR,QAAS,EACT,OAAQ,OACR,WAAY,cAKZ,OACEC,GAAeD,EAAc,UAAY,UAC3C,MAAO3D,EAAO,KAChB,EAEA,SAACuB,EAAA,IAAA8C,OAAA,CAAK,KAAM,GAAI,YAAa,KAAM,CAAA,CAAA,EAEvC,CAAA,CAAA,CACF,EAGA/C,EAAA,KAAC,MAAA,CACC,MAAO,CACL,QAAS,OACT,WAAY,UACZ,IAAK,GACL,MAAO,MACT,EAEC,SAAA,CACCiC,GAAAhC,EAAA,IAACc,EAAA,CACC,MAAM,yBACN,MAAOwB,EACP,UAAW,KACX,YAAaE,EACb,iBAAkBE,EAClB,SAAUV,EAAsB,SAChC,OAAQA,EAAsB,MAAA,CAChC,EAEDA,GAAyBC,GACvBjC,EAAA,IAAA2B,EAAA,CAAS,QAAQ,SAAS,EAE5BM,IACCA,EAAY,WACVjC,EAAA,IAAC6B,GAAe,CAAA,EAEhB7B,EAAA,IAACc,EAAA,CACC,MAAM,eACN,MAAOyB,EACP,UAAWA,EACX,YAAaE,EACb,iBAAkBC,EAClB,SAAUT,EAAY,SACtB,OAAQU,EACR,YAAaV,EAAY,WAAA,CAAA,IAI7BD,GAAyBC,IAAgBC,GACxClC,EAAAA,IAAA2B,EAAA,CAAS,QAAQ,QAAQ,EAE3BO,GACClC,EAAA,IAACqB,EAAA,CACC,QAASa,EAAQ,QACjB,MAAOA,EAAQ,MACf,WAAYA,EAAQ,YAAc,QAClC,YAAaA,EAAQ,YACrB,OAAQW,CAAA,CACV,CAAA,CAAA,CAEJ,CAAA,CAAA,CAAA,CAGN"}