{"version":3,"sources":["../call-control-sdk/lib/pages/common/components/AuditReport.tsx","../node_modules/@mui/icons-material/Launch.mjs","../node_modules/@mui/icons-material/CheckCircleOutlined.mjs","../node_modules/@mui/icons-material/HighlightOff.mjs","../node_modules/@mui/icons-material/RemoveCircleOutlined.mjs"],"sourcesContent":["import React, { useCallback, useEffect, useState } from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport {\r\n  Avatar,\r\n  Box,\r\n  Chip,\r\n  Typography,\r\n  Table,\r\n  TableBody,\r\n  TableCell,\r\n  TableContainer,\r\n  TableHead,\r\n  TableRow,\r\n  Tabs,\r\n  Tab,\r\n  LinearProgress,\r\n  useTheme,\r\n  Dialog,\r\n  IconButton,\r\n  GlobalStyles,\r\n  CircularProgress,\r\n  Alert,\r\n  Tooltip,\r\n} from \"@mui/material\";\r\nimport { alpha } from \"@mui/material/styles\";\r\nimport type { SxProps, Theme } from \"@mui/material/styles\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport LaunchIcon from \"@mui/icons-material/Launch\";\r\nimport CheckCircleOutlineIcon from \"@mui/icons-material/CheckCircleOutlined\";\r\nimport HighlightOffIcon from \"@mui/icons-material/HighlightOff\";\r\nimport RemoveCircleOutlineIcon from \"@mui/icons-material/RemoveCircleOutlined\";\r\nimport PlayArrowIcon from \"@mui/icons-material/PlayArrow\";\r\nimport DownloadIcon from \"@mui/icons-material/Download\";\r\nimport axiosInstance from \"../../../services/axios\";\r\nimport { END_POINT } from \"../../../services/endPoint\";\r\nimport type { CdrRecordResponse } from \"../../cdrReport/types\";\r\nimport { getRecordingByCall } from \"../../cdrReport/useCdrReport\";\r\n\r\n// ─── API response types ────────────────────────────────────────────────────────\r\n\r\n// Fully dynamic — the backend sends whatever metadata fields apply to the call.\r\n// We render exactly what arrives (no fixed field list, no N/A placeholders).\r\ntype AuditMetadata = Record<string, string | number | undefined> & {\r\n  Call_ID?: string;\r\n  call_id?: string;\r\n};\r\n\r\n// Dynamic too: Overall_Audit_Score_Percentage / Audit_Result are surfaced\r\n// specially (big score + result badge); every other key is shown as-is.\r\ntype ExecutiveAuditSummary = Record<string, number | string | undefined>;\r\n\r\ninterface ScorecardEntry {\r\n  Weightage?: number;\r\n  Score_Obtained?: number | string;\r\n  Remarks?: string;\r\n}\r\n\r\ninterface QualityScorecard {\r\n  // Sections are dynamic. The backend now returns audit-plan-specific section\r\n  // names (e.g. \"Clinical Protocol\", \"Safety Assessment\", \"Compliance\") rather\r\n  // than a fixed set — each maps to a ScorecardEntry, with Total_Score/Final_Rating\r\n  // as the roll-up. Older tenants' fixed section keys still fit this shape.\r\n  [section: string]: ScorecardEntry | number | string | undefined;\r\n  Total_Score?: number;\r\n  Final_Rating?: string;\r\n}\r\n\r\ninterface DispositionFramework {\r\n  dispositionType?: string;\r\n  frameworks?: Array<{\r\n    expectedFramework?: string;\r\n    status?: string;\r\n    remarks?: string;\r\n  }>;\r\n}\r\n\r\ninterface ChecklistItem {\r\n  parameter?: string;\r\n  expectedStandard?: string;\r\n  status?: string;\r\n  remarks?: string;\r\n  qaObservation?: string;\r\n}\r\n\r\ninterface ChecklistGroup {\r\n  items?: ChecklistItem[];\r\n}\r\n\r\ntype ObsRecord = Record<string, { Status?: string; Remarks?: string; Observation_Impact?: string; Expected_Standard?: string }>;\r\n\r\n// New backend shape: each dynamic section (e.g. \"Clinical Protocol\") is a map of\r\n// criterion_N -> { Criterion, Type, Result, Remarks }.\r\ninterface CriterionEntry {\r\n  Criterion?: string;\r\n  // `Weightage` is the max score for the criterion; older payloads carried the\r\n  // same number under `Type`, so we read either.\r\n  Weightage?: string | number;\r\n  Type?: string | number;\r\n  Result?: string | number;\r\n  Remarks?: string;\r\n}\r\ntype CriterionSection = Record<string, CriterionEntry>;\r\n\r\n// Sections are dynamic and may arrive in any of three shapes: the new\r\n// criterion-based map, the legacy observation record, or the legacy\r\n// process-workflow group array. The renderer detects the shape per section.\r\ntype SectionWiseAuditObservations = Record<string, ObsRecord | ChecklistGroup[] | CriterionSection>;\r\n\r\ninterface RootCauseItem {\r\n  Observation?: string;\r\n  Root_Cause?: string;\r\n  Impact?: string;\r\n  Severity?: string;\r\n}\r\n\r\ninterface AuditorRecommendation {\r\n  Key_Strengths?: string[] | string;\r\n  Improvement_Areas?: string[] | string;\r\n}\r\n\r\nexport interface NewAuditApiResponse {\r\n  Audit_Metadata?: AuditMetadata;\r\n  Call_Summary?: string;\r\n  transcript?: string;\r\n  Executive_Audit_Summary?: ExecutiveAuditSummary;\r\n  Quality_Scorecard?: QualityScorecard;\r\n  Disposition_Based_Quality_Framework?: DispositionFramework[];\r\n  Section_Wise_Audit_Observations_Checklist?: SectionWiseAuditObservations;\r\n  Root_Cause_Analysis?: RootCauseItem[];\r\n  // Now typically a plain string of recommendation prose; older tenants send the\r\n  // structured { Key_Strengths, Improvement_Areas } object — both are rendered.\r\n  Auditor_Recommendation?: AuditorRecommendation | string;\r\n  Final_Auditor_Remarks?: string;\r\n}\r\n\r\n// ─── Per-disposition envelope ──────────────────────────────────────────────────\r\n//\r\n// A call can be audited against more than one disposition, so the backend wraps\r\n// the report(s) in a `dispositions` array — one full report per disposition code.\r\n// Older deployments returned a single bare report object at the root; both are\r\n// normalised into a DispositionEntry list by `toDispositionEntries`.\r\n\r\n/** One audited disposition: its code plus the full report scored for it. */\r\nexport interface DispositionReport {\r\n  disp_code?: string;\r\n  report?: NewAuditApiResponse;\r\n}\r\n\r\nexport interface AuditApiEnvelope {\r\n  dispositions?: DispositionReport[];\r\n}\r\n\r\n/** What the response can be: the per-disposition envelope or a legacy bare report. */\r\nexport type AuditApiPayload = AuditApiEnvelope & NewAuditApiResponse;\r\n\r\n/** A disposition the user can select, paired with the report to render for it. */\r\ninterface DispositionEntry {\r\n  /** Raw `disp_code` (falls back to the label when the backend omits it). */\r\n  code: string;\r\n  /** Chip text — empty for a legacy single-report payload (no chip row shown). */\r\n  label: string;\r\n  report: NewAuditApiResponse;\r\n}\r\n\r\n/** \"APPOINTMENT_SCHEDULED\" -> \"Appointment Scheduled\". */\r\nfunction humanizeDispCode(code: string): string {\r\n  return code\r\n    .replace(/[_-]+/g, \" \")\r\n    .trim()\r\n    .toLowerCase()\r\n    .replace(/\\b\\w/g, (c) => c.toUpperCase());\r\n}\r\n\r\n// The root `dispositions` key is overloaded: the envelope's entries carry a\r\n// `report` object, whereas the legacy metadata form carries { code, name,\r\n// parent_code, parent_name }. Only the former is an envelope.\r\nfunction isEnvelope(raw: AuditApiPayload): boolean {\r\n  return (\r\n    Array.isArray(raw.dispositions) &&\r\n    raw.dispositions.some((d) => !!d && typeof d === \"object\" && !!d.report && typeof d.report === \"object\")\r\n  );\r\n}\r\n\r\n/**\r\n * Flattens the response into one entry per disposition, in the order received.\r\n * Returns [] when there is nothing renderable, so callers show the empty state.\r\n */\r\nfunction toDispositionEntries(raw: AuditApiPayload | null | undefined): DispositionEntry[] {\r\n  if (!raw || typeof raw !== \"object\") return [];\r\n\r\n  if (isEnvelope(raw)) {\r\n    return (raw.dispositions ?? [])\r\n      .map((d) => {\r\n        const report = d?.report;\r\n        if (!report || typeof report !== \"object\") return null;\r\n        const code = String(d?.disp_code ?? \"\").trim();\r\n        // The report's own metadata usually carries a display-ready disposition\r\n        // (\"Appointment Scheduled\"); fall back to humanising the raw code.\r\n        const metaDisposition = String(report.Audit_Metadata?.Call_Disposition ?? \"\").trim();\r\n        const label = metaDisposition || (code ? humanizeDispCode(code) : \"\") || \"Audit\";\r\n        return { code: code || label, label, report } as DispositionEntry;\r\n      })\r\n      .filter(Boolean) as DispositionEntry[];\r\n  }\r\n\r\n  // An explicitly empty envelope has no report to show.\r\n  if (Array.isArray(raw.dispositions) && raw.dispositions.length === 0) return [];\r\n\r\n  // Legacy: the response *is* the report. No chip row for a single unlabelled entry.\r\n  return [{ code: \"\", label: \"\", report: raw }];\r\n}\r\n\r\nfunction toStringArray(value: string[] | string | undefined): string[] {\r\n  if (!value) return [];\r\n  if (Array.isArray(value)) return value;\r\n  return value.split(\"\\n\").map((l) => l.replace(/^\\s*[\\*\\-]\\s*/, \"\").trim()).filter(Boolean);\r\n}\r\n\r\n// ─── Colour helpers ────────────────────────────────────────────────────────────\r\n\r\nconst STATUS_COLOUR: Record<string, { color: string; bg: string }> = {\r\n  completed: { color: \"#2e7d32\", bg: \"#e8f5e9\" },\r\n  complied: { color: \"#2e7d32\", bg: \"#e8f5e9\" },\r\n  pass: { color: \"#2e7d32\", bg: \"#e8f5e9\" },\r\n  compliant: { color: \"#2e7d32\", bg: \"#e8f5e9\" },\r\n  achieved: { color: \"#2e7d32\", bg: \"#e8f5e9\" },\r\n  strong: { color: \"#2e7d32\", bg: \"#e8f5e9\" },\r\n  excellent: { color: \"#2e7d32\", bg: \"#e8f5e9\" },\r\n  low: { color: \"#2e7d32\", bg: \"#e8f5e9\" },\r\n  no: { color: \"#2e7d32\", bg: \"#e8f5e9\" },\r\n  good: { color: \"#1565c0\", bg: \"#e3f2fd\" },\r\n  partial: { color: \"#e65100\", bg: \"#fff3e0\" },\r\n  moderate: { color: \"#e65100\", bg: \"#fff3e0\" },\r\n  medium: { color: \"#e65100\", bg: \"#fff3e0\" },\r\n  weak: { color: \"#e65100\", bg: \"#fff3e0\" },\r\n  missed: { color: \"#c62828\", bg: \"#ffebee\" },\r\n  fail: { color: \"#c62828\", bg: \"#ffebee\" },\r\n  high: { color: \"#c62828\", bg: \"#ffebee\" },\r\n  poor: { color: \"#c62828\", bg: \"#ffebee\" },\r\n  yes: { color: \"#c62828\", bg: \"#ffebee\" },\r\n  \"n/a\": { color: \"#757575\", bg: \"#f5f5f5\" },\r\n  na: { color: \"#757575\", bg: \"#f5f5f5\" },\r\n};\r\n\r\nfunction resolveColour(label: string): { color: string; bg: string } {\r\n  const key = label.toLowerCase().trim();\r\n  if (STATUS_COLOUR[key]) return STATUS_COLOUR[key];\r\n  const stripped = key.replace(/[^a-z]/g, \"\");\r\n  return STATUS_COLOUR[stripped] ?? { color: \"#555\", bg: \"#f0f0f0\" };\r\n}\r\n\r\n/** `suffix` rides inside the badge (\"FAIL · 50/100\") — used for the audit score. */\r\nfunction StatusBadge({ label, suffix }: { label: string; suffix?: string }) {\r\n  const { color, bg } = resolveColour(label);\r\n  return (\r\n    <Box sx={{ display: \"inline-flex\", alignItems: \"center\", gap: \"4px\", px: \"7px\", py: \"2px\", borderRadius: \"4px\", backgroundColor: bg, whiteSpace: \"nowrap\" }}>\r\n      <Typography sx={{ fontSize: \"0.72rem\", fontWeight: 600, color, letterSpacing: \"0.02em\" }}>\r\n        {label.toUpperCase()}\r\n      </Typography>\r\n      {suffix && (\r\n        <Typography sx={{ fontSize: \"0.72rem\", fontWeight: 500, color, opacity: 0.85 }}>\r\n          {`· ${suffix}`}\r\n        </Typography>\r\n      )}\r\n    </Box>\r\n  );\r\n}\r\n\r\nfunction StatusIconBadge({ label }: { label: string }) {\r\n  const key = label.toLowerCase().replace(/[^a-z]/g, \"\");\r\n  let icon: React.ReactNode;\r\n  if (key === \"complied\" || key === \"completed\" || key === \"pass\") {\r\n    icon = <CheckCircleOutlineIcon sx={{ fontSize: 15, color: \"#2e7d32\" }} />;\r\n  } else if (key === \"partial\") {\r\n    icon = <RemoveCircleOutlineIcon sx={{ fontSize: 15, color: \"#e65100\" }} />;\r\n  } else if (key === \"na\") {\r\n    icon = <RemoveCircleOutlineIcon sx={{ fontSize: 15, color: \"#757575\" }} />;\r\n  } else {\r\n    icon = <HighlightOffIcon sx={{ fontSize: 15, color: \"#c62828\" }} />;\r\n  }\r\n  return (\r\n    <Box sx={{ display: \"inline-flex\", alignItems: \"center\", gap: \"4px\" }}>\r\n      {icon}\r\n      <StatusBadge label={label} />\r\n    </Box>\r\n  );\r\n}\r\n\r\n// ─── Shared styles ─────────────────────────────────────────────────────────────\r\n\r\n// Score bands, shared by every score a chip renders: green from 80, amber from\r\n// 65, red below. Thresholds AND colours match the audit-jobs list's `catColor`,\r\n// so the same score reads identically on both screens.\r\nfunction scoreBandColor(pct: number): string {\r\n  if (pct >= 80) return \"#00A550\";\r\n  if (pct >= 65) return \"#C47C00\";\r\n  return \"#F05A22\";\r\n}\r\n\r\n// One chip shape for \"<disposition> <score>\", kept in step with the audit-jobs\r\n// list so the same pair reads as the same object in both places.\r\nconst CHIP_SX: SxProps<Theme> = {\r\n  display: \"inline-flex\",\r\n  alignItems: \"center\",\r\n  gap: \"6px\",\r\n  minHeight: 22,\r\n  maxWidth: 260,\r\n  px: \"8px\",\r\n  py: \"2px\",\r\n  borderRadius: \"11px\",\r\n  backgroundColor: \"rgba(26, 95, 108, 0.10)\",\r\n};\r\n\r\nconst CHIP_LABEL_SX: SxProps<Theme> = {\r\n  fontSize: \"0.72rem\",\r\n  fontWeight: 600,\r\n  color: \"#1A5F6C\",\r\n  overflow: \"hidden\",\r\n  textOverflow: \"ellipsis\",\r\n  whiteSpace: \"nowrap\",\r\n};\r\n\r\nconst CHIP_SCORE_SX = { fontSize: \"0.74rem\", fontWeight: 700, flexShrink: 0, whiteSpace: \"nowrap\" } as const;\r\n\r\nconst TH: SxProps<Theme> = { fontSize: \"0.72rem\", fontWeight: 700, color: \"text.secondary\", py: \"7px\", px: \"10px\", backgroundColor: \"#f5f7f8\", borderBottom: \"1px solid\", borderColor: \"divider\", whiteSpace: \"nowrap\" };\r\nconst TD: SxProps<Theme> = { fontSize: \"0.75rem\", color: \"text.primary\", py: \"6px\", px: \"10px\", borderBottom: \"1px solid\", borderColor: \"divider\", verticalAlign: \"middle\" };\r\n\r\nfunction SectionTitle({ children }: { children: React.ReactNode }) {\r\n  return (\r\n    <Typography sx={{ fontSize: \"0.78rem\", fontWeight: 700, color: \"text.primary\", mb: \"8px\", mt: \"4px\" }}>\r\n      {children}\r\n    </Typography>\r\n  );\r\n}\r\n\r\n// ─── Transcript bubbles (mirrors Transcript.tsx chat layout) ───────────────────\r\n\r\nfunction TranscriptBubbles({ text }: { text: string }) {\r\n  const lines = text.split(\"\\n\").filter((l) => l.trim().length > 0);\r\n  if (!lines.length) {\r\n    return <Typography sx={{ fontSize: \"0.75rem\", color: \"text.secondary\" }}>No transcript available.</Typography>;\r\n  }\r\n  return (\r\n    <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: \"6px\" }}>\r\n      {lines.map((line, idx) => {\r\n        const isPatient = line.trim().toLowerCase().startsWith(\"patient\");\r\n        const text = line.replace(/^\\s*(Patient|Agent)\\s*:\\s*/i, \"\");\r\n        return (\r\n          <Box key={idx} sx={{ display: \"flex\", justifyContent: isPatient ? \"flex-end\" : \"flex-start\", alignItems: \"flex-end\", gap: \"6px\" }}>\r\n            {!isPatient && <Avatar sx={{ width: 22, height: 22, fontSize: 12 }} />}\r\n            <Box\r\n              sx={(t) => ({\r\n                maxWidth: \"70%\",\r\n                px: \"10px\",\r\n                py: \"7px\",\r\n                borderRadius: isPatient ? \"8px 8px 0 8px\" : \"8px 8px 8px 0\",\r\n                backgroundColor: isPatient ? t.palette.primary.main : \"#fff\",\r\n                color: isPatient ? t.palette.common.white : \"#222\",\r\n                border: isPatient ? \"none\" : \"1px solid #e0e0e0\",\r\n                fontSize: \"0.78rem\",\r\n                lineHeight: 1.5,\r\n              })}\r\n            >\r\n              {text}\r\n            </Box>\r\n            {isPatient && <Avatar sx={{ width: 22, height: 22, fontSize: 12 }} />}\r\n          </Box>\r\n        );\r\n      })}\r\n    </Box>\r\n  );\r\n}\r\n\r\n// ─── Recording Component ──────────────────────────────────────────────────────\r\n\r\nconst fmtRecordingDuration = (s: number): string => {\r\n  if (!isFinite(s) || s < 0) return \"\";\r\n  const m = Math.floor(s / 60);\r\n  return `${m}:${String(Math.floor(s % 60)).padStart(2, \"0\")}`;\r\n};\r\n\r\n/* Coordinates playback so only one recording is open at a time. */\r\nconst activePlayers = new Set<(activeId: string) => void>();\r\nconst notifyPlay = (activeId: string) => {\r\n  activePlayers.forEach((fn) => fn(activeId));\r\n};\r\n\r\nfunction CallRecording({ callId }: { callId: string }) {\r\n  const [audioUrl, setAudioUrl] = useState<string | null>(null);\r\n  const [loading, setLoading] = useState(false);\r\n  const [error, setError] = useState(false);\r\n  const [durationSec, setDurationSec] = useState<number | null>(null);\r\n  const [currentSec, setCurrentSec] = useState(0);\r\n  const totalLabel = durationSec != null ? fmtRecordingDuration(durationSec) : \"\";\r\n\r\n  const closePlayer = useCallback(() => {\r\n    setAudioUrl((prev) => {\r\n      if (prev && prev.startsWith(\"blob:\")) URL.revokeObjectURL(prev);\r\n      return null;\r\n    });\r\n    setCurrentSec(0);\r\n    setDurationSec(null);\r\n  }, []);\r\n\r\n  // Close this player whenever another recording starts playing.\r\n  useEffect(() => {\r\n    const onPlay = (activeId: string) => {\r\n      if (activeId !== callId) closePlayer();\r\n    };\r\n    activePlayers.add(onPlay);\r\n    return () => {\r\n      activePlayers.delete(onPlay);\r\n    };\r\n  }, [callId, closePlayer]);\r\n\r\n  const handlePlay = async () => {\r\n    if (audioUrl) return;\r\n    notifyPlay(callId);\r\n    try {\r\n      setLoading(true);\r\n      setError(false);\r\n      const blob = await getRecordingByCall(callId);\r\n      setAudioUrl(URL.createObjectURL(blob));\r\n    } catch {\r\n      setError(true);\r\n    } finally {\r\n      setLoading(false);\r\n    }\r\n  };\r\n\r\n  const handleDownload = async () => {\r\n    try {\r\n      const blob = audioUrl ? await fetch(audioUrl).then((r) => r.blob()) : await getRecordingByCall(callId);\r\n      const url = URL.createObjectURL(blob);\r\n      const a = document.createElement(\"a\");\r\n      a.href = url;\r\n      a.download = `recording_${callId}.wav`;\r\n      a.click();\r\n      URL.revokeObjectURL(url);\r\n    } catch {\r\n      /* ignore */\r\n    }\r\n  };\r\n\r\n  if (error) {\r\n    return <Typography sx={{ fontSize: \"0.75rem\", color: \"text.secondary\" }}>Recording not available.</Typography>;\r\n  }\r\n\r\n  if (audioUrl) {\r\n    return (\r\n      <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1 }}>\r\n        <audio\r\n          controls\r\n          autoPlay\r\n          src={audioUrl}\r\n          onLoadedMetadata={(e) => setDurationSec(e.currentTarget.duration)}\r\n          onTimeUpdate={(e) => setCurrentSec(e.currentTarget.currentTime)}\r\n          onEnded={closePlayer}\r\n          style={{ height: 38, flex: 1, maxWidth: 400 }}\r\n        />\r\n        {totalLabel && (\r\n          <Typography sx={{ fontSize: 12, fontWeight: 600, color: \"#1A5F6C\", whiteSpace: \"nowrap\" }}>\r\n            {fmtRecordingDuration(currentSec)} / {totalLabel}\r\n          </Typography>\r\n        )}\r\n        <Tooltip title=\"Download\">\r\n          <IconButton size=\"small\" onClick={handleDownload} sx={{ color: \"#1565c0\" }}>\r\n            <DownloadIcon sx={{ fontSize: 18 }} />\r\n          </IconButton>\r\n        </Tooltip>\r\n      </Box>\r\n    );\r\n  }\r\n\r\n  return (\r\n    <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1 }}>\r\n      <Tooltip title={loading ? \"Loading...\" : \"Play Recording\"}>\r\n        <span>\r\n          <IconButton\r\n            onClick={handlePlay}\r\n            disabled={loading}\r\n            sx={{\r\n              color: \"#1A5F6C\",\r\n              border: \"1px solid\",\r\n              borderColor: \"#1A5F6C\",\r\n              borderRadius: \"6px\",\r\n              px: 1.5,\r\n              py: 0.5,\r\n              \"&:hover\": { backgroundColor: \"rgba(26, 95, 108, 0.08)\" },\r\n            }}\r\n          >\r\n            {loading ? (\r\n              <CircularProgress size={16} color=\"inherit\" />\r\n            ) : (\r\n              <>\r\n                <PlayArrowIcon sx={{ fontSize: 18, mr: 0.5 }} />\r\n                <Typography sx={{ fontSize: \"0.75rem\", fontWeight: 600 }}>Play Recording</Typography>\r\n              </>\r\n            )}\r\n          </IconButton>\r\n        </span>\r\n      </Tooltip>\r\n      <Tooltip title=\"Download\">\r\n        <span>\r\n          <IconButton size=\"small\" onClick={handleDownload} disabled={loading} sx={{ color: \"#1565c0\" }}>\r\n            <DownloadIcon sx={{ fontSize: 18 }} />\r\n          </IconButton>\r\n        </span>\r\n      </Tooltip>\r\n    </Box>\r\n  );\r\n}\r\n\r\n// ─── Overview Tab ──────────────────────────────────────────────────────────────\r\n\r\n// Metadata keys are backend-driven, so labels are derived from the key itself\r\n// rather than looked up in a fixed table.\r\nfunction metadataLabel(key: string): string {\r\n  return key.replace(/_/g, \" \");\r\n}\r\n\r\n/** Seconds → \"HH:MM:SS\". Floored, since durations arrive as raw floats. */\r\nfunction formatDurationSeconds(seconds: number): string {\r\n  const total = Math.max(0, Math.floor(seconds));\r\n  const h = Math.floor(total / 3600);\r\n  const m = Math.floor((total % 3600) / 60);\r\n  const s = total % 60;\r\n  return `${String(h).padStart(2, \"0\")}:${String(m).padStart(2, \"0\")}:${String(s).padStart(2, \"0\")}`;\r\n}\r\n\r\n/** ISO timestamp → \"Aug 24, 2026, 6:32 PM\", matching how dates read elsewhere in the app. */\r\nfunction formatDateTime(value: string): string | null {\r\n  const parsed = new Date(value);\r\n  if (isNaN(parsed.getTime())) return null;\r\n  return `${parsed.toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\", year: \"numeric\" })}, ${parsed.toLocaleTimeString(\"en-US\", { hour: \"numeric\", minute: \"2-digit\", hour12: true })}`;\r\n}\r\n\r\n/**\r\n * Display form of a metadata value.\r\n *\r\n * Two kinds of value can't be rendered from their own shape alone — only the\r\n * field name says a bare number is seconds, or a string is a timestamp — so\r\n * those two are matched on the key. The match is on a name FRAGMENT, not an\r\n * exact list, so any `*_Duration` / `*_Date_Time` a future audit plan sends is\r\n * covered without another code change. Everything else stays fully dynamic:\r\n * fractional numbers are cut to 2 decimals (the backend sends durations as raw\r\n * floats like \"98.71999999999999886313…\") and all other values render as sent.\r\n */\r\nfunction metadataValue(key: string, value: string | number): string {\r\n  const raw = String(value).trim();\r\n  const normalizedKey = key.toLowerCase();\r\n  const num = typeof value === \"number\" ? value : Number(raw);\r\n  const isNumeric = raw !== \"\" && Number.isFinite(num);\r\n\r\n  if (normalizedKey.includes(\"duration\")) {\r\n    // Seconds, or clock text already in the wanted shape — pass that through.\r\n    if (isNumeric) return formatDurationSeconds(num);\r\n    return raw;\r\n  }\r\n\r\n  if (normalizedKey.includes(\"date\") || normalizedKey.includes(\"time\")) {\r\n    // Non-timestamps (\"N/A\") fall through to the raw value untouched.\r\n    if (!isNumeric) return formatDateTime(raw) ?? raw;\r\n  }\r\n\r\n  if (!isNumeric || Number.isInteger(num)) return raw;\r\n  return num.toFixed(2);\r\n}\r\n\r\n// A disposition entry the backend may attach to Audit_Metadata (or the response\r\n// root). Shown as \"Parent - Child\" when it has a parent, otherwise just its name.\r\ninterface MetaDisposition {\r\n  code?: string;\r\n  name?: string;\r\n  parent_code?: string;\r\n  parent_name?: string;\r\n}\r\nfunction formatDisposition(d: MetaDisposition): string {\r\n  const name = (d.name ?? d.code ?? \"\").trim();\r\n  const parent = (d.parent_name ?? \"\").trim();\r\n  return parent ? `${parent} - ${name}` : name;\r\n}\r\n\r\nfunction OverviewTab({ data }: { data: NewAuditApiResponse }) {\r\n  const meta = data.Audit_Metadata ?? {};\r\n  // Dispositions can arrive as an array under Audit_Metadata (or the response\r\n  // root), each { code, name, parent_code, parent_name }. They render as the\r\n  // value of the Call Disposition row (formatted \"Parent - Child\" pills).\r\n  const rawDispositions: MetaDisposition[] = Array.isArray((meta as any).dispositions)\r\n    ? (meta as any).dispositions\r\n    : Array.isArray((data as any).dispositions)\r\n      ? (data as any).dispositions\r\n      : [];\r\n  const dispositionLabels = rawDispositions.map(formatDisposition).filter(Boolean);\r\n\r\n  // Extract call_id for recording (check both Call_ID and call_id fields)\r\n  const callId = meta.Call_ID ?? meta.call_id ?? (meta as any).Recording_ID;\r\n\r\n  // Fully dynamic — render only the metadata fields the backend actually sent,\r\n  // in the order received. No fixed list, no \"N/A\" placeholders for absent keys.\r\n  // Skip the raw `dispositions` array (shown as the Call Disposition value) and\r\n  // any non-primitive value.\r\n  const kvItems = Object.entries(meta)\r\n    .filter(([k, v]) => k !== \"dispositions\" && (typeof v === \"string\" || typeof v === \"number\") && String(v).trim() !== \"\")\r\n    .map(([k, v]) => ({ key: k, label: metadataLabel(k), value: metadataValue(k, v as string | number) }));\r\n  const half = Math.ceil(kvItems.length / 2);\r\n  const col1 = kvItems.slice(0, half);\r\n  const col2 = kvItems.slice(half);\r\n\r\n  return (\r\n    <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: 2 }}>\r\n      {/* Audit Metadata */}\r\n      {kvItems.length > 0 && (\r\n      <Box>\r\n        <SectionTitle>Audit Metadata</SectionTitle>\r\n        <Box sx={{ border: \"1px solid\", borderColor: \"divider\", borderRadius: \"8px\", overflow: \"hidden\", backgroundColor: \"background.paper\" }}>\r\n          <Box sx={{ display: \"flex\" }}>\r\n            {[col1, col2].filter((chunk) => chunk.length > 0).map((chunk, ci) => (\r\n              <Box key={ci} sx={{ flex: \"1 1 240px\", minWidth: 0, borderRight: ci === 0 && col2.length > 0 ? \"1px solid\" : \"none\", borderColor: \"divider\" }}>\r\n                {chunk.map((item, ii) => (\r\n                  <Box key={ii} sx={{ display: \"flex\", alignItems: \"baseline\", borderBottom: ii < chunk.length - 1 ? \"1px solid\" : \"none\", borderColor: \"divider\", px: \"10px\", py: \"6px\", gap: 1 }}>\r\n                    <Typography sx={{ fontSize: \"0.72rem\", color: \"text.secondary\", minWidth: 140, flexShrink: 0 }}>{item.label}</Typography>\r\n                    {item.key === \"Call_Disposition\" && dispositionLabels.length > 0 ? (\r\n                      // Formatted disposition list (\"Parent - Child\") in place of the plain value.\r\n                      <Box sx={{ display: \"flex\", flexWrap: \"wrap\", gap: \"6px\", minWidth: 0 }}>\r\n                        {dispositionLabels.map((d, di) => (\r\n                          <Box key={di} sx={{ display: \"inline-flex\", alignItems: \"center\", px: \"8px\", py: \"2px\", borderRadius: \"6px\", backgroundColor: \"#e6f4f1\", color: \"#1A5F6C\", fontSize: \"0.72rem\", fontWeight: 600 }}>\r\n                            {d}\r\n                          </Box>\r\n                        ))}\r\n                      </Box>\r\n                    ) : (\r\n                      <Typography sx={{ fontSize: \"0.75rem\", color: \"text.primary\", fontWeight: 500, minWidth: 0, wordBreak: \"break-word\" }}>\r\n                        {item.value}\r\n                      </Typography>\r\n                    )}\r\n                  </Box>\r\n                ))}\r\n              </Box>\r\n            ))}\r\n          </Box>\r\n        </Box>\r\n      </Box>\r\n      )}\r\n\r\n      {/* Call Summary */}\r\n      <Box>\r\n        <SectionTitle>Call Summary</SectionTitle>\r\n        <Box sx={{ border: \"1px solid\", borderColor: \"divider\", borderRadius: \"8px\", backgroundColor: \"background.paper\", px: \"14px\", py: \"10px\", maxHeight: 160, overflowY: \"auto\" }}>\r\n          <Typography sx={{ fontSize: \"0.75rem\", color: \"text.secondary\", lineHeight: 1.7 }}>\r\n            {data.Call_Summary ?? \"No summary available.\"}\r\n          </Typography>\r\n        </Box>\r\n      </Box>\r\n\r\n      {/* Recording */}\r\n      {callId && (\r\n        <Box>\r\n          <SectionTitle>Recording</SectionTitle>\r\n          <Box sx={{ border: \"1px solid\", borderColor: \"divider\", borderRadius: \"8px\", backgroundColor: \"background.paper\", px: \"14px\", py: \"10px\" }}>\r\n            <CallRecording callId={String(callId)} />\r\n          </Box>\r\n        </Box>\r\n      )}\r\n\r\n      {/* Call Transcription */}\r\n      <Box>\r\n        <SectionTitle>Call Transcription</SectionTitle>\r\n        <Box sx={{ border: \"1px solid\", borderColor: \"divider\", borderRadius: \"8px\", backgroundColor: \"#f9f9f9\", px: \"14px\", py: \"12px\", maxHeight: 320, overflowY: \"auto\" }}>\r\n          <TranscriptBubbles text={data.transcript ?? \"\"} />\r\n        </Box>\r\n      </Box>\r\n    </Box>\r\n  );\r\n}\r\n\r\n// ─── Scorecard Tab ─────────────────────────────────────────────────────────────\r\n\r\ninterface ScoreRow {\r\n  key: string;\r\n  label: string;\r\n  rawEntryScore: number | string | undefined;\r\n  score: number;\r\n  max: number;\r\n  remarks?: string;\r\n}\r\n\r\ninterface ScorecardTotals {\r\n  rows: ScoreRow[];\r\n  /** Score as sent by the backend — never derived from other dispositions. */\r\n  overallScore: number;\r\n  /** Sum of this disposition's own section weightages (its own denominator). */\r\n  totalMax: number;\r\n  pct: number;\r\n  rating: string;\r\n  resultBadge: string;\r\n}\r\n\r\n/**\r\n * Reads one disposition's scorecard. Each disposition carries its own weightages,\r\n * so every total is scored against its own denominator — totals from different\r\n * dispositions are never summed or averaged, only shown side by side.\r\n */\r\nfunction readScorecard(data: NewAuditApiResponse): ScorecardTotals {\r\n  const sc = data.Quality_Scorecard ?? {};\r\n  const summary = data.Executive_Audit_Summary ?? {};\r\n\r\n  const rawScore = sc.Total_Score ?? summary.Overall_Audit_Score_Percentage ?? 0;\r\n  const overallScore = typeof rawScore === \"string\" ? parseFloat(rawScore.replace(\"%\", \"\")) || 0 : rawScore;\r\n\r\n  // Rows are whatever scored sections the backend sent, in the order received.\r\n  // A section is any object-valued key — the scalar roll-ups (Total_Score,\r\n  // Final_Rating) are excluded by that shape test, so no key list is needed.\r\n  const rows: ScoreRow[] = Object.entries(sc)\r\n    .filter(([, val]) => isPlainObject(val))\r\n    .map(([key, val]) => {\r\n      const entry = val as ScorecardEntry;\r\n      const rawEntryScore = entry.Score_Obtained;\r\n      const score = typeof rawEntryScore === \"string\" ? parseFloat(rawEntryScore) || 0 : rawEntryScore ?? 0;\r\n      const max = entry.Weightage ?? 0;\r\n      return { key, label: key.replace(/_/g, \" \"), rawEntryScore, score, max, remarks: entry.Remarks };\r\n    });\r\n\r\n  // Total denominator is the sum of section weightages (100 in practice); fall\r\n  // back to 100 if weightages are absent.\r\n  const totalMax = rows.reduce((sum, r) => sum + (r.max || 0), 0) || 100;\r\n\r\n  return {\r\n    rows,\r\n    overallScore,\r\n    totalMax,\r\n    pct: Math.min(Math.round((overallScore / totalMax) * 100), 100),\r\n    rating: String(sc.Final_Rating ?? \"\"),\r\n    resultBadge: String(summary.Audit_Result ?? sc.Final_Rating ?? \"N/A\"),\r\n  };\r\n}\r\n\r\n/**\r\n * One card per audited disposition, each showing that disposition's own total\r\n * against its own denominator. Clicking a card selects it, the same as its chip.\r\n * Rendered only when a call was audited against more than one disposition.\r\n */\r\nfunction DispositionScoreCards({\r\n  entries,\r\n  selected,\r\n  onSelect,\r\n  primary,\r\n}: {\r\n  entries: DispositionEntry[];\r\n  selected: number;\r\n  onSelect: (index: number) => void;\r\n  primary: string;\r\n}) {\r\n  return (\r\n    <Box sx={{ display: \"grid\", gridTemplateColumns: \"repeat(auto-fit, minmax(190px, 1fr))\", gap: \"10px\" }}>\r\n      {entries.map((entry, i) => {\r\n        const { overallScore, totalMax, pct, rating, resultBadge } = readScorecard(entry.report);\r\n        const isActive = i === selected;\r\n        const barColor = pct < 80 ? \"#c62828\" : primary;\r\n        return (\r\n          <Box\r\n            key={`${entry.code}-${i}`}\r\n            onClick={() => onSelect(i)}\r\n            role=\"button\"\r\n            tabIndex={0}\r\n            onKeyDown={(e) => { if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); onSelect(i); } }}\r\n            sx={{\r\n              cursor: \"pointer\",\r\n              border: \"1px solid\",\r\n              borderColor: isActive ? primary : \"divider\",\r\n              boxShadow: isActive ? `inset 0 0 0 1px ${primary}` : \"none\",\r\n              borderRadius: \"8px\",\r\n              backgroundColor: isActive ? alpha(primary, 0.06) : \"background.paper\",\r\n              px: \"12px\",\r\n              py: \"10px\",\r\n              display: \"flex\",\r\n              flexDirection: \"column\",\r\n              gap: \"6px\",\r\n              transition: \"all 0.15s ease\",\r\n              \"&:hover\": { borderColor: primary },\r\n            }}\r\n          >\r\n            <Typography\r\n              title={entry.label}\r\n              sx={{ fontSize: \"0.74rem\", fontWeight: 700, color: isActive ? primary : \"text.primary\", overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}\r\n            >\r\n              {entry.label}\r\n            </Typography>\r\n            <Box sx={{ display: \"flex\", alignItems: \"baseline\", gap: \"3px\" }}>\r\n              <Typography sx={{ fontSize: \"1.5rem\", fontWeight: 700, color: \"text.primary\", lineHeight: 1 }}>{overallScore}</Typography>\r\n              <Typography sx={{ fontSize: \"0.75rem\", color: \"text.secondary\", fontWeight: 600 }}>/{totalMax}</Typography>\r\n            </Box>\r\n            <LinearProgress\r\n              variant=\"determinate\"\r\n              value={pct}\r\n              sx={{ height: 5, borderRadius: 3, backgroundColor: alpha(barColor, 0.12), \"& .MuiLinearProgress-bar\": { backgroundColor: barColor, borderRadius: 3 } }}\r\n            />\r\n            <Box sx={{ display: \"flex\", gap: \"5px\", flexWrap: \"wrap\" }}>\r\n              {rating && <StatusBadge label={rating} />}\r\n              <StatusBadge label={resultBadge} />\r\n            </Box>\r\n          </Box>\r\n        );\r\n      })}\r\n    </Box>\r\n  );\r\n}\r\n\r\ninterface ComparisonCell { score: number; max: number; raw: number | string | undefined }\r\ninterface ComparisonRow { key: string; label: string; cells: Array<ComparisonCell | null>; remarks?: string }\r\n\r\n/**\r\n * Joins every disposition's scorecard into one row set for side-by-side display.\r\n *\r\n * Sections are joined on their backend key. Audit plans differ per disposition,\r\n * so the row set is the UNION of all sections in first-seen order, and a section\r\n * a disposition wasn't scored on gets a null cell — rendered \"—\", never 0, since\r\n * \"not part of this plan\" is not the same as \"scored zero\". Weightage is carried\r\n * per cell because the same section can be weighted differently per plan.\r\n */\r\nfunction buildComparisonRows(\r\n  entries: DispositionEntry[],\r\n  selected: number,\r\n): { rows: ComparisonRow[]; totals: ScorecardTotals[] } {\r\n  const totals = entries.map((e) => readScorecard(e.report));\r\n\r\n  const order: string[] = [];\r\n  const seen = new Set<string>();\r\n  for (const t of totals) {\r\n    for (const r of t.rows) {\r\n      if (!seen.has(r.key)) { seen.add(r.key); order.push(r.key); }\r\n    }\r\n  }\r\n\r\n  const rows = order.map((key) => ({\r\n    key,\r\n    label: key.replace(/_/g, \" \"),\r\n    cells: totals.map((t) => {\r\n      const row = t.rows.find((r) => r.key === key);\r\n      return row ? { score: row.score, max: row.max, raw: row.rawEntryScore } : null;\r\n    }),\r\n    // Only the selected disposition's remarks are shown — N remarks columns\r\n    // would not fit, and the selection is what the rest of the report follows.\r\n    remarks: totals[selected]?.rows.find((r) => r.key === key)?.remarks,\r\n  }));\r\n\r\n  return { rows, totals };\r\n}\r\n\r\n/**\r\n * Quality scorecard for a call audited against several dispositions: one score\r\n * column per disposition, each against its own weightage. Column headers select\r\n * that disposition, matching the score cards and chips.\r\n */\r\nfunction ComparisonScorecardTable({\r\n  entries,\r\n  selected = 0,\r\n  onSelect,\r\n  primary,\r\n}: {\r\n  entries: DispositionEntry[];\r\n  selected?: number;\r\n  /** Omitted by the print layout, which renders each disposition on its own — chips are then static. */\r\n  onSelect?: (index: number) => void;\r\n  primary: string;\r\n}) {\r\n  const { rows, totals } = buildComparisonRows(entries, selected);\r\n  const selectedLabel = entries[selected]?.label ?? \"\";\r\n  // With one disposition there is nothing to disambiguate.\r\n  const remarksHeader = entries.length > 1 ? `Remarks — ${selectedLabel}` : \"Remarks\";\r\n\r\n  // One chip per disposition that scored this section: \"<disposition> <score>\",\r\n  // stacked one per line. A disposition whose plan omits the section simply has\r\n  // no chip — no \"—\" placeholder to mistake for a zero.\r\n  const scoreChips = (cells: Array<ComparisonCell | null>, bold = false) => (\r\n    <Box sx={{ display: \"flex\", flexDirection: \"column\", alignItems: \"flex-start\", gap: \"4px\" }}>\r\n      {cells.map((cell, i) => {\r\n        if (!cell) return null;\r\n        const entry = entries[i];\r\n        const max = cell.max || 0;\r\n        const pct = max > 0 ? Math.min(Math.round((cell.score / max) * 100), 100) : 0;\r\n        const tone = scoreBandColor(pct);\r\n        const isActive = i === selected && entries.length > 1;\r\n        return (\r\n          <Box\r\n            key={`${entry.code}-${i}`}\r\n            onClick={onSelect ? () => onSelect(i) : undefined}\r\n            role={onSelect ? \"button\" : undefined}\r\n            tabIndex={onSelect ? 0 : undefined}\r\n            onKeyDown={onSelect ? (e) => { if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); onSelect(i); } } : undefined}\r\n            title={`${entry.label} — ${cell.raw ?? cell.score}${max > 0 ? ` of ${max}` : \"\"}`}\r\n            sx={{\r\n              ...CHIP_SX,\r\n              cursor: onSelect ? \"pointer\" : \"default\",\r\n              border: \"1px solid\",\r\n              borderColor: isActive ? primary : \"transparent\",\r\n              transition: \"all 0.15s ease\",\r\n              ...(onSelect ? { \"&:hover\": { borderColor: primary } } : {}),\r\n            }}\r\n          >\r\n            <Typography sx={CHIP_LABEL_SX}>{entry.label}</Typography>\r\n            <Typography sx={{ ...CHIP_SCORE_SX, color: tone, fontWeight: bold || isActive ? 700 : CHIP_SCORE_SX.fontWeight }}>\r\n              {cell.raw ?? cell.score}\r\n              {max > 0 && (\r\n                <Box component=\"span\" sx={{ fontSize: \"0.66rem\", fontWeight: 500, color: \"text.secondary\" }}>/{max}</Box>\r\n              )}\r\n            </Typography>\r\n          </Box>\r\n        );\r\n      })}\r\n    </Box>\r\n  );\r\n\r\n  return (\r\n    <Box>\r\n      <SectionTitle>Quality Scorecard</SectionTitle>\r\n      <TableContainer sx={{ border: \"1px solid\", borderColor: \"divider\", borderRadius: \"8px\", overflowX: \"auto\" }}>\r\n        <Table size=\"small\">\r\n          <TableHead>\r\n            <TableRow>\r\n              <TableCell sx={{ ...TH, minWidth: 180 }}>Evaluation Parameter</TableCell>\r\n              <TableCell sx={{ ...TH, minWidth: 220 }}>Disposition Score</TableCell>\r\n              <TableCell sx={{ ...TH, minWidth: 200, whiteSpace: \"normal\", lineHeight: 1.25 }}>\r\n                {remarksHeader}\r\n              </TableCell>\r\n            </TableRow>\r\n          </TableHead>\r\n          <TableBody>\r\n            {rows.map((row) => (\r\n              <TableRow key={row.key}>\r\n                <TableCell sx={{ ...TD }}>{row.label}</TableCell>\r\n                <TableCell sx={{ ...TD }}>{scoreChips(row.cells)}</TableCell>\r\n                <TableCell sx={{ ...TD }}>{row.remarks ?? \"\"}</TableCell>\r\n              </TableRow>\r\n            ))}\r\n            <TableRow sx={{ backgroundColor: \"#f5f7f8\", \"& td\": { borderBottom: 0 } }}>\r\n              <TableCell sx={{ ...TD, fontWeight: 700 }}>Total Score</TableCell>\r\n              <TableCell sx={{ ...TD }}>\r\n                {scoreChips(\r\n                  totals.map((t) => ({ score: t.overallScore, max: t.totalMax, raw: t.overallScore })),\r\n                  true,\r\n                )}\r\n              </TableCell>\r\n              <TableCell sx={{ ...TD, fontWeight: 700 }}>\r\n                <StatusBadge label={totals[selected]?.rating || totals[selected]?.resultBadge || \"N/A\"} />\r\n              </TableCell>\r\n            </TableRow>\r\n          </TableBody>\r\n        </Table>\r\n      </TableContainer>\r\n    </Box>\r\n  );\r\n}\r\n\r\nfunction ScorecardTab({\r\n  data,\r\n  primary,\r\n  dispositions = [],\r\n  selectedDisposition = 0,\r\n  onSelectDisposition,\r\n}: {\r\n  data: NewAuditApiResponse;\r\n  primary: string;\r\n  /** Passed by the tab view so multiple dispositions get the score strip; the print layout omits it (it prints each disposition in full). */\r\n  dispositions?: DispositionEntry[];\r\n  selectedDisposition?: number;\r\n  onSelectDisposition?: (index: number) => void;\r\n}) {\r\n  const summary = data.Executive_Audit_Summary ?? {};\r\n  const { overallScore, totalMax, pct, resultBadge } = readScorecard(data);\r\n  const showScoreStrip = dispositions.length > 1 && !!onSelectDisposition;\r\n\r\n  // Dynamic executive metrics — render every summary field the backend sent,\r\n  // except the overall score (shown as the big number) and the audit result\r\n  // (shown as the result badge). No fixed list.\r\n  const metrics = Object.entries(summary)\r\n    .filter(([k, v]) => k !== \"Overall_Audit_Score_Percentage\" && k !== \"Audit_Result\" && v != null && String(v).trim() !== \"\")\r\n    .map(([k, v]) => ({ label: metadataLabel(k), value: String(v) }));\r\n\r\n  return (\r\n    <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: 2.5 }}>\r\n      {/* Every disposition's own total, side by side — the table below stays on\r\n          the selected one. */}\r\n      {showScoreStrip && (\r\n        <Box>\r\n          <SectionTitle>Scores by Disposition</SectionTitle>\r\n          <DispositionScoreCards\r\n            entries={dispositions}\r\n            selected={selectedDisposition}\r\n            onSelect={onSelectDisposition!}\r\n            primary={primary}\r\n          />\r\n        </Box>\r\n      )}\r\n\r\n      {/* Overall score + metric cards */}\r\n      <Box sx={{ display: \"flex\", gap: 2, flexWrap: \"wrap\", alignItems: \"stretch\" }}>\r\n        <Box sx={{ display: \"flex\", flexDirection: \"column\", alignItems: \"center\", justifyContent: \"center\", border: \"1px solid\", borderColor: \"divider\", borderRadius: \"8px\", backgroundColor: \"background.paper\", px: 3, py: 2, minWidth: 140, gap: 0.5 }}>\r\n          {/* With several dispositions, name the one this score belongs to so the\r\n              table below is never ambiguous. */}\r\n          <Typography sx={{ fontSize: \"0.72rem\", color: \"text.secondary\", fontWeight: 600, mb: 0.5, letterSpacing: \"0.04em\", maxWidth: 180, textAlign: \"center\" }}>\r\n            {showScoreStrip\r\n              ? (dispositions[selectedDisposition]?.label ?? \"\").toUpperCase()\r\n              : \"OVERALL SCORE\"}\r\n          </Typography>\r\n          <Box sx={{ display: \"flex\", alignItems: \"baseline\", gap: \"3px\" }}>\r\n            <Typography sx={{ fontSize: \"2.4rem\", fontWeight: 700, color: primary, lineHeight: 1 }}>{overallScore}</Typography>\r\n            <Typography sx={{ fontSize: \"0.85rem\", color: \"text.secondary\", fontWeight: 600 }}>/{totalMax}</Typography>\r\n          </Box>\r\n          <Box sx={{ width: \"100%\", mt: 0.75 }}>\r\n            <LinearProgress variant=\"determinate\" value={pct} sx={{ height: 6, borderRadius: 3, backgroundColor: alpha(primary, 0.12), \"& .MuiLinearProgress-bar\": { backgroundColor: primary, borderRadius: 3 } }} />\r\n          </Box>\r\n          <Box sx={{ mt: 0.75 }}><StatusBadge label={resultBadge} /></Box>\r\n        </Box>\r\n        {metrics.length > 0 && (\r\n        <Box sx={{ flex: 1, minWidth: 260, display: \"grid\", gridTemplateColumns: \"repeat(auto-fit, minmax(140px, 1fr))\", gap: \"8px\", alignSelf: \"stretch\" }}>\r\n          {metrics.map((m) => (\r\n            <Box key={m.label} sx={{ border: \"1px solid\", borderColor: \"divider\", borderRadius: \"6px\", backgroundColor: \"background.paper\", px: \"10px\", py: \"8px\", display: \"flex\", flexDirection: \"column\", alignItems: \"center\", justifyContent: \"center\", gap: \"6px\" }}>\r\n              <Typography sx={{ fontSize: \"0.72rem\", color: \"text.secondary\", lineHeight: 1.3, textAlign: \"center\" }}>{m.label}</Typography>\r\n              <StatusBadge label={m.value} />\r\n            </Box>\r\n          ))}\r\n        </Box>\r\n        )}\r\n      </Box>\r\n\r\n      {/* Quality Scorecard — one \"<disposition> <score>\" chip per line in a single\r\n          column, the same shape whether the call has one disposition or many. */}\r\n      <ComparisonScorecardTable\r\n        entries={dispositions}\r\n        selected={selectedDisposition}\r\n        onSelect={onSelectDisposition}\r\n        primary={primary}\r\n      />\r\n    </Box>\r\n  );\r\n}\r\n\r\n// ─── Audit Checklist Tab ───────────────────────────────────────────────────────\r\n\r\ninterface ChecklistRow { parameter: string; expectedStandard: string; status: string; remarks: string; qaObservation: string }\r\n\r\n// Section and criterion names are backend-driven — audit plans differ per tenant\r\n// and per call, so there is no list of known keys to translate. Every label the\r\n// user sees is the key the backend sent, de-underscored.\r\nfunction humanizeSection(key: string): string {\r\n  return key.replace(/_/g, \" \");\r\n}\r\n\r\ninterface CriterionRow { criterion: string; weightage: string; result: string; remarks: string }\r\n\r\n// A section is \"criterion-based\" (new shape) when its values carry a `Criterion`\r\n// or `Result` field — as opposed to the legacy `Status`-keyed observation record.\r\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\r\n  return !!value && typeof value === \"object\" && !Array.isArray(value);\r\n}\r\n\r\nfunction isCriterionSection(value: unknown): value is CriterionSection {\r\n  if (!isPlainObject(value)) return false;\r\n  return Object.values(value).some(\r\n    (e) => isPlainObject(e) && (\"Criterion\" in e || \"Result\" in e),\r\n  );\r\n}\r\n\r\nfunction criterionSectionToRows(section: CriterionSection): CriterionRow[] {\r\n  const asText = (v: unknown): string => (v === undefined || v === null || v === \"\" ? \"\" : String(v));\r\n  // Section contents are backend-driven, so a section may carry scalar siblings\r\n  // alongside its criteria (a section total, a note). Those are not rows —\r\n  // including them would render an all-placeholder junk row.\r\n  return Object.values(section)\r\n    .filter((c): c is CriterionEntry => isPlainObject(c))\r\n    .map((c) => ({\r\n      criterion: c.Criterion ?? \"\",\r\n      // Prefer `Weightage`; fall back to `Type` (older payloads put the max score there).\r\n      weightage: asText(c.Weightage ?? c.Type) || \"\",\r\n      result: asText(c.Result) || \"N/A\",\r\n      remarks: c.Remarks ?? \"\",\r\n    }));\r\n}\r\n\r\nfunction obsRecordToRows(record: ObsRecord | undefined): ChecklistRow[] {\r\n  return Object.entries(record ?? {})\r\n    .filter(([, val]) => isPlainObject(val))\r\n    .map(([key, val]) => ({\r\n      parameter: key.replace(/_/g, \" \"),\r\n      expectedStandard: val.Expected_Standard ?? \"\",\r\n      status: val.Status ?? \"N/A\",\r\n      remarks: val.Remarks ?? \"\",\r\n      qaObservation: val.Observation_Impact ?? \"\",\r\n    }));\r\n}\r\n\r\nfunction processWorkflowRows(groups: ChecklistGroup[] | undefined): ChecklistRow[] {\r\n  return (groups ?? []).flatMap((g) =>\r\n    (g?.items ?? []).map((item) => ({\r\n      parameter: item.parameter ?? \"\",\r\n      expectedStandard: item.expectedStandard ?? \"\",\r\n      status: item.status ?? \"N/A\",\r\n      remarks: item.remarks ?? \"\",\r\n      qaObservation: item.qaObservation ?? \"\",\r\n    })),\r\n  );\r\n}\r\n\r\nconst CHECKLIST_COLS: Array<{ key: keyof ChecklistRow; label: string; minWidth: number }> = [\r\n  { key: \"parameter\", label: \"Audit Parameter\", minWidth: 180 },\r\n  { key: \"expectedStandard\", label: \"Expected Standard\", minWidth: 200 },\r\n  { key: \"status\", label: \"Status\", minWidth: 130 },\r\n  { key: \"remarks\", label: \"Remarks\", minWidth: 160 },\r\n  { key: \"qaObservation\", label: \"QA Observation / Impact\", minWidth: 180 },\r\n];\r\n\r\n// A row field the backend never populated (every cell is blank).\r\nfunction isEmptyColumn(rows: ChecklistRow[], key: keyof ChecklistRow): boolean {\r\n  return rows.every((row) => {\r\n    const value = String(row[key] ?? \"\").trim();\r\n    return value === \"\";\r\n  });\r\n}\r\n\r\nfunction ChecklistTable({ title, rows }: { title: string; rows: ChecklistRow[] }) {\r\n  if (!rows.length) return null;\r\n  // Drop columns the backend sent nothing for, so a section that carries no\r\n  // expected-standard or impact text doesn't render a wall of dashes.\r\n  const cols = CHECKLIST_COLS.filter((col) => col.key === \"status\" || !isEmptyColumn(rows, col.key));\r\n  return (\r\n    <Box>\r\n      <SectionTitle>{title}</SectionTitle>\r\n      <TableContainer sx={{ border: \"1px solid\", borderColor: \"divider\", borderRadius: \"8px\", overflow: \"hidden\" }}>\r\n        <Table size=\"small\">\r\n          <TableHead>\r\n            <TableRow>\r\n              {cols.map((col) => (\r\n                <TableCell key={col.key} sx={{ ...TH, minWidth: col.minWidth }}>{col.label}</TableCell>\r\n              ))}\r\n            </TableRow>\r\n          </TableHead>\r\n          <TableBody>\r\n            {rows.map((row, ri) => (\r\n              <TableRow key={ri} sx={{ \"&:last-child td\": { borderBottom: 0 } }}>\r\n                {cols.map((col) => (\r\n                  <TableCell key={col.key} sx={{ ...TD }}>\r\n                    {col.key === \"status\" ? <StatusIconBadge label={row.status} /> : row[col.key]}\r\n                  </TableCell>\r\n                ))}\r\n              </TableRow>\r\n            ))}\r\n          </TableBody>\r\n        </Table>\r\n      </TableContainer>\r\n    </Box>\r\n  );\r\n}\r\n\r\n// New criterion-based section: Criterion | Weightage | Result | Remarks.\r\n// Fixed percentage widths + table-layout:fixed so EVERY section table lines its\r\n// columns up with the others (they're separate <Table>s but share a width).\r\nconst CRITERION_COLS: Array<{ key: keyof CriterionRow; label: string; width: string; align: \"left\" | \"center\" }> = [\r\n  { key: \"criterion\", label: \"Criterion\", width: \"34%\", align: \"left\" },\r\n  { key: \"weightage\", label: \"Weightage\", width: \"11%\", align: \"center\" },\r\n  { key: \"result\", label: \"Result\", width: \"11%\", align: \"center\" },\r\n  { key: \"remarks\", label: \"Remarks\", width: \"44%\", align: \"left\" },\r\n];\r\n\r\nfunction CriterionTable({ title, rows }: { title: string; rows: CriterionRow[] }) {\r\n  if (!rows.length) return null;\r\n  return (\r\n    <Box>\r\n      <SectionTitle>{title}</SectionTitle>\r\n      <TableContainer sx={{ border: \"1px solid\", borderColor: \"divider\", borderRadius: \"8px\", overflow: \"hidden\" }}>\r\n        <Table size=\"small\" sx={{ tableLayout: \"fixed\" }}>\r\n          <TableHead>\r\n            <TableRow>\r\n              {CRITERION_COLS.map((col) => (\r\n                <TableCell key={col.key} sx={{ ...TH, width: col.width, textAlign: col.align }}>{col.label}</TableCell>\r\n              ))}\r\n            </TableRow>\r\n          </TableHead>\r\n          <TableBody>\r\n            {rows.map((row, ri) => (\r\n              <TableRow key={ri} sx={{ \"&:last-child td\": { borderBottom: 0 } }}>\r\n                <TableCell sx={{ ...TD, wordBreak: \"break-word\" }}>{row.criterion}</TableCell>\r\n                <TableCell sx={{ ...TD, textAlign: \"center\" }}>\r\n                  <Box sx={{ display: \"inline-flex\", alignItems: \"center\", justifyContent: \"center\", minWidth: 26, px: \"7px\", py: \"2px\", borderRadius: \"4px\", backgroundColor: \"#e3f2fd\", color: \"#1565c0\", fontSize: \"0.72rem\", fontWeight: 700 }}>\r\n                    {row.weightage}\r\n                  </Box>\r\n                </TableCell>\r\n                <TableCell sx={{ ...TD, textAlign: \"center\" }}><StatusBadge label={row.result} /></TableCell>\r\n                <TableCell sx={{ ...TD, wordBreak: \"break-word\" }}>{row.remarks}</TableCell>\r\n              </TableRow>\r\n            ))}\r\n          </TableBody>\r\n        </Table>\r\n      </TableContainer>\r\n    </Box>\r\n  );\r\n}\r\n\r\n// A section the backend sent as prose rather than a table of criteria.\r\nfunction SectionNote({ title, text }: { title: string; text: string }) {\r\n  return (\r\n    <Box>\r\n      <SectionTitle>{title}</SectionTitle>\r\n      <Box sx={{ border: \"1px solid\", borderColor: \"divider\", borderRadius: \"8px\", backgroundColor: \"background.paper\", px: \"14px\", py: \"10px\" }}>\r\n        <Typography sx={{ fontSize: \"0.75rem\", color: \"text.secondary\", lineHeight: 1.6 }}>{text}</Typography>\r\n      </Box>\r\n    </Box>\r\n  );\r\n}\r\n\r\n// Renders every section in Section_Wise_Audit_Observations_Checklist. Section\r\n// names are entirely backend-driven — they vary per audit plan and per call, and\r\n// nothing here is keyed to a fixed list: sections render in the order received\r\n// with their own names. Each section's SHAPE is detected independently too, so a\r\n// response may mix them: criterion map, legacy process-workflow group array,\r\n// legacy observation record, or a scalar note.\r\nfunction SectionWiseTables({ obs }: { obs: SectionWiseAuditObservations }) {\r\n  const entries = Object.entries(obs ?? {});\r\n  if (!entries.length) return null;\r\n  return (\r\n    <>\r\n      {entries.map(([sectionKey, sectionVal]) => {\r\n        const title = humanizeSection(sectionKey);\r\n        if (Array.isArray(sectionVal)) {\r\n          return <ChecklistTable key={sectionKey} title={title} rows={processWorkflowRows(sectionVal)} />;\r\n        }\r\n        if (isCriterionSection(sectionVal)) {\r\n          return <CriterionTable key={sectionKey} title={title} rows={criterionSectionToRows(sectionVal)} />;\r\n        }\r\n        // A scalar section is prose, not a table. Rendering it as one would walk\r\n        // a string character-by-character and emit one junk row per character.\r\n        if (typeof sectionVal === \"string\" || typeof sectionVal === \"number\") {\r\n          const text = String(sectionVal).trim();\r\n          return text ? <SectionNote key={sectionKey} title={title} text={text} /> : null;\r\n        }\r\n        if (!isPlainObject(sectionVal)) return null;\r\n        return (\r\n          <ChecklistTable\r\n            key={sectionKey}\r\n            title={title}\r\n            rows={obsRecordToRows(sectionVal as ObsRecord)}\r\n          />\r\n        );\r\n      })}\r\n    </>\r\n  );\r\n}\r\n\r\nfunction DispositionFrameworkTable({ data }: { data: NewAuditApiResponse }) {\r\n  const rows = (data.Disposition_Based_Quality_Framework ?? []).flatMap((df) =>\r\n    (df?.frameworks ?? []).map((fw) => ({\r\n      dispositionType: df.dispositionType ?? \"\",\r\n      expectedFramework: fw.expectedFramework ?? \"\",\r\n      status: fw.status ?? \"N/A\",\r\n      remarks: fw.remarks ?? \"\",\r\n    })),\r\n  );\r\n\r\n  if (!rows.length) {\r\n    return <Typography sx={{ fontSize: \"0.75rem\", color: \"text.secondary\" }}>No disposition framework data available.</Typography>;\r\n  }\r\n\r\n  return (\r\n    <Box>\r\n      <SectionTitle>Disposition-Based Quality Framework</SectionTitle>\r\n      <TableContainer sx={{ border: \"1px solid\", borderColor: \"divider\", borderRadius: \"8px\", overflow: \"hidden\" }}>\r\n        <Table size=\"small\">\r\n          <TableHead>\r\n            <TableRow>\r\n              {[\r\n                { label: \"Disposition Type\", minWidth: 160 },\r\n                { label: \"Expected Framework\", minWidth: 200 },\r\n                { label: \"Status\", minWidth: 120 },\r\n                { label: \"Remarks\", minWidth: 160 },\r\n              ].map((col, i) => (\r\n                <TableCell key={i} sx={{ ...TH, minWidth: col.minWidth }}>{col.label}</TableCell>\r\n              ))}\r\n            </TableRow>\r\n          </TableHead>\r\n          <TableBody>\r\n            {rows.map((row, ri) => (\r\n              <TableRow key={ri} sx={{ \"&:last-child td\": { borderBottom: 0 } }}>\r\n                <TableCell sx={{ ...TD }}>{row.dispositionType}</TableCell>\r\n                <TableCell sx={{ ...TD }}>{row.expectedFramework}</TableCell>\r\n                <TableCell sx={{ ...TD }}><StatusIconBadge label={row.status} /></TableCell>\r\n                <TableCell sx={{ ...TD }}>{row.remarks}</TableCell>\r\n              </TableRow>\r\n            ))}\r\n          </TableBody>\r\n        </Table>\r\n      </TableContainer>\r\n    </Box>\r\n  );\r\n}\r\n\r\nfunction AuditChecklistContent({ data }: { data: NewAuditApiResponse }) {\r\n  const obs = data.Section_Wise_Audit_Observations_Checklist;\r\n  const hasFramework = (data.Disposition_Based_Quality_Framework ?? []).length > 0;\r\n  const sectionCount = isPlainObject(obs) ? Object.keys(obs).length : 0;\r\n\r\n  // Shown only when the backend sent no checklist at all — otherwise a blank tab\r\n  // gives no clue whether anything was meant to be there.\r\n  if (!hasFramework && sectionCount === 0) {\r\n    return (\r\n      <Typography sx={{ fontSize: \"0.8rem\", color: \"text.secondary\" }}>\r\n        No audit checklist available.\r\n      </Typography>\r\n    );\r\n  }\r\n\r\n  return (\r\n    <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: 2 }}>\r\n      {hasFramework && <DispositionFrameworkTable data={data} />}\r\n      <SectionWiseTables obs={obs ?? {}} />\r\n    </Box>\r\n  );\r\n}\r\n\r\n// The tab and the print layout render the same checklist — one implementation so\r\n// they can't drift.\r\nfunction AuditChecklistTab({ data }: { data: NewAuditApiResponse; primary: string }) {\r\n  return <AuditChecklistContent data={data} />;\r\n}\r\n\r\n// ─── Root Cause Analysis Tab ───────────────────────────────────────────────────\r\n\r\nfunction AuditorRecommendationTab({ data, primary }: { data: NewAuditApiResponse; primary: string }) {\r\n  const rcaRows = data.Root_Cause_Analysis ?? [];\r\n  const rec = data.Auditor_Recommendation;\r\n  // The backend now sends a prose string; older tenants send a structured object.\r\n  const recString = typeof rec === \"string\" ? rec.trim() : \"\";\r\n  const recObj = rec && typeof rec === \"object\" ? rec : null;\r\n  const strengths = toStringArray(recObj?.Key_Strengths);\r\n  const improvements = toStringArray(recObj?.Improvement_Areas);\r\n  const hasStructured = strengths.length > 0 || improvements.length > 0;\r\n  const remarks = data.Final_Auditor_Remarks;\r\n  const hasAnything = rcaRows.length > 0 || !!recString || hasStructured || !!remarks;\r\n\r\n  return (\r\n    <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: 2 }}>\r\n      {/* Root Cause Analysis — only when the backend sends it */}\r\n      {rcaRows.length > 0 && (\r\n        <Box>\r\n          <SectionTitle>Root Cause Analysis</SectionTitle>\r\n          <TableContainer sx={{ border: \"1px solid\", borderColor: \"divider\", borderRadius: \"8px\", overflow: \"hidden\" }}>\r\n            <Table size=\"small\">\r\n              <TableHead>\r\n                <TableRow>\r\n                  {[{ label: \"Observation\", minWidth: 180 }, { label: \"Root Cause\", minWidth: 200 }, { label: \"Impact\", minWidth: 200 }, { label: \"Severity\", minWidth: 90 }].map((col, i) => (\r\n                    <TableCell key={i} sx={{ ...TH, minWidth: col.minWidth }}>{col.label}</TableCell>\r\n                  ))}\r\n                </TableRow>\r\n              </TableHead>\r\n              <TableBody>\r\n                {rcaRows.map((row, ri) => (\r\n                  <TableRow key={ri} sx={{ \"&:last-child td\": { borderBottom: 0 } }}>\r\n                    <TableCell sx={{ ...TD }}>{row.Observation ?? \"\"}</TableCell>\r\n                    <TableCell sx={{ ...TD }}>{row.Root_Cause ?? \"\"}</TableCell>\r\n                    <TableCell sx={{ ...TD }}>{row.Impact ?? \"\"}</TableCell>\r\n                    <TableCell sx={{ ...TD, textAlign: \"center\" }}>{row.Severity ? <StatusBadge label={row.Severity} /> : \"\"}</TableCell>\r\n                  </TableRow>\r\n                ))}\r\n              </TableBody>\r\n            </Table>\r\n          </TableContainer>\r\n        </Box>\r\n      )}\r\n\r\n      {/* Auditor Recommendation — prose form (current backend) */}\r\n      {recString && (\r\n        <Box>\r\n          <SectionTitle>Auditor Recommendation</SectionTitle>\r\n          <Box sx={{ border: \"1px solid\", borderLeft: \"3px solid\", borderColor: \"divider\", borderLeftColor: primary, borderRadius: \"6px\", px: \"14px\", py: \"12px\", backgroundColor: alpha(primary, 0.04) }}>\r\n            <Typography sx={{ fontSize: \"0.8rem\", color: \"text.secondary\", lineHeight: 1.7 }}>{recString}</Typography>\r\n          </Box>\r\n        </Box>\r\n      )}\r\n\r\n      {/* Auditor Recommendation — structured form (legacy) */}\r\n      {hasStructured && (\r\n        <Box>\r\n          <SectionTitle>Auditor Recommendation</SectionTitle>\r\n          <Box sx={{ display: \"flex\", gap: 2, flexWrap: \"wrap\" }}>\r\n            {[\r\n              { title: \"Key Strengths\", items: strengths, color: \"#2e7d32\" },\r\n              { title: \"Improvement Areas\", items: improvements, color: \"#e65100\" },\r\n            ].filter((g) => g.items.length > 0).map((g) => (\r\n              <Box key={g.title} sx={{ flex: \"1 1 200px\", border: \"1px solid\", borderColor: \"divider\", borderRadius: \"6px\", backgroundColor: \"background.paper\", px: \"14px\", py: \"10px\" }}>\r\n                <Typography sx={{ fontSize: \"0.78rem\", fontWeight: 600, color: \"text.primary\", mb: \"8px\" }}>{g.title}</Typography>\r\n                {g.items.map((item, ii) => (\r\n                  <Box key={ii} sx={{ display: \"flex\", alignItems: \"flex-start\", gap: \"7px\", mb: \"5px\" }}>\r\n                    <Box sx={{ width: 5, height: 5, borderRadius: \"50%\", backgroundColor: g.color, mt: \"5px\", flexShrink: 0 }} />\r\n                    <Typography sx={{ fontSize: \"0.75rem\", color: \"text.secondary\", lineHeight: 1.5 }}>{item}</Typography>\r\n                  </Box>\r\n                ))}\r\n              </Box>\r\n            ))}\r\n          </Box>\r\n        </Box>\r\n      )}\r\n\r\n      {remarks && (\r\n        <Box sx={{ border: \"1px solid\", borderLeft: \"3px solid\", borderColor: \"divider\", borderLeftColor: primary, borderRadius: \"6px\", px: \"14px\", py: \"10px\", backgroundColor: alpha(primary, 0.04) }}>\r\n          <Typography sx={{ fontSize: \"0.78rem\", fontWeight: 600, color: primary, mb: \"6px\" }}>Final Auditor Remarks</Typography>\r\n          <Typography sx={{ fontSize: \"0.75rem\", color: \"text.secondary\", lineHeight: 1.6 }}>{remarks}</Typography>\r\n        </Box>\r\n      )}\r\n\r\n      {!hasAnything && (\r\n        <Typography sx={{ fontSize: \"0.8rem\", color: \"text.secondary\" }}>No auditor recommendation available.</Typography>\r\n      )}\r\n    </Box>\r\n  );\r\n}\r\n\r\n// ─── Static tabs ───────────────────────────────────────────────────────────────\r\n\r\nconst STATIC_TABS = [\r\n  { id: \"overview\", label: \"Overview\" },\r\n  { id: \"scorecard\", label: \"Scorecard\" },\r\n  { id: \"checklist\", label: \"Audit Checklist\" },\r\n  { id: \"rca\", label: \"Auditor Recommendation\" },\r\n];\r\n\r\n// ─── Data hook ─────────────────────────────────────────────────────────────────\r\n\r\nfunction useAuditReportData(callUuid?: string, active = true) {\r\n  const [activeTab, setActiveTab] = useState(0);\r\n  const [dispositions, setDispositions] = useState<DispositionEntry[]>([]);\r\n  const [selectedDisposition, setSelectedDisposition] = useState(0);\r\n  const [auditLoading, setAuditLoading] = useState(false);\r\n  const [auditError, setAuditError] = useState<string | null>(null);\r\n\r\n  useEffect(() => {\r\n    setDispositions([]);\r\n    setSelectedDisposition(0);\r\n    setAuditError(null);\r\n    setActiveTab(0);\r\n\r\n    if (!active || !callUuid) return;\r\n\r\n    let cancelled = false;\r\n    setAuditLoading(true);\r\n    axiosInstance\r\n      .get<AuditApiPayload>(END_POINT.CALLSAGE_AUDIT(callUuid))\r\n      .then((res) => {\r\n        if (cancelled) return;\r\n        setDispositions(toDispositionEntries(res.data));\r\n        setSelectedDisposition(0);\r\n      })\r\n      .catch((err: any) => {\r\n        if (!cancelled) setAuditError(err?.response?.data?.message ?? err?.message ?? \"Failed to generate audit report\");\r\n      })\r\n      .finally(() => { if (!cancelled) setAuditLoading(false); });\r\n    return () => { cancelled = true; };\r\n  }, [active, callUuid]);\r\n\r\n  // Guard the index against a response that shrank between renders.\r\n  const selectedIndex = selectedDisposition < dispositions.length ? selectedDisposition : 0;\r\n  const apiData = dispositions[selectedIndex]?.report ?? null;\r\n\r\n  return {\r\n    activeTab,\r\n    setActiveTab,\r\n    dispositions,\r\n    selectedDisposition: selectedIndex,\r\n    setSelectedDisposition,\r\n    apiData,\r\n    auditLoading,\r\n    auditError,\r\n  };\r\n}\r\n\r\n// ─── Print layout ──────────────────────────────────────────────────────────────\r\n\r\nconst PRINT_ROOT_ID = \"audit-report-print-root\";\r\n\r\nconst PRINT_STYLES = (\r\n  <GlobalStyles\r\n    styles={{\r\n      [`#${PRINT_ROOT_ID}`]: { position: \"absolute\", width: \"1px\", height: \"1px\", overflow: \"hidden\", clip: \"rect(0 0 0 0)\", clipPath: \"inset(50%)\", whiteSpace: \"nowrap\", pointerEvents: \"none\" },\r\n      \"@media print\": {\r\n        \"body *\": { visibility: \"hidden\" },\r\n        [`#${PRINT_ROOT_ID}`]: { visibility: \"visible\", position: \"absolute\", top: 0, left: 0, width: \"100%\", height: \"auto\", overflow: \"visible\", clip: \"auto\", clipPath: \"none\", whiteSpace: \"normal\", padding: \"0 8mm\", boxSizing: \"border-box\" },\r\n        [`#${PRINT_ROOT_ID} *`]: { visibility: \"visible\", printColorAdjust: \"exact\", WebkitPrintColorAdjust: \"exact\" } as React.CSSProperties,\r\n      },\r\n    }}\r\n  />\r\n);\r\n\r\n// ─── Inner component (shared by dialog + full-page) ───────────────────────────\r\n\r\ninterface AuditReportInnerProps {\r\n  callUuid?: string;\r\n  active?: boolean;\r\n  primary: string;\r\n  onClose?: () => void;\r\n  onMaximize?: () => void;\r\n}\r\n\r\n/**\r\n * Chip row for selecting which audited disposition to display. Rendered only\r\n * when the backend sent labelled dispositions; picking one swaps the report\r\n * shown in every tab (the active tab is kept, so sections stay comparable).\r\n */\r\nfunction DispositionChips({\r\n  entries,\r\n  selected,\r\n  onSelect,\r\n  primary,\r\n}: {\r\n  entries: DispositionEntry[];\r\n  selected: number;\r\n  onSelect: (index: number) => void;\r\n  primary: string;\r\n}) {\r\n  return (\r\n    <Box\r\n      sx={{\r\n        px: { xs: 2, md: 2.5 },\r\n        py: \"8px\",\r\n        display: \"flex\",\r\n        alignItems: \"center\",\r\n        gap: \"8px\",\r\n        flexWrap: \"wrap\",\r\n        borderBottom: \"1px solid\",\r\n        borderColor: \"divider\",\r\n        backgroundColor: \"background.paper\",\r\n        flexShrink: 0,\r\n      }}\r\n    >\r\n      <Typography sx={{ fontSize: \"0.72rem\", fontWeight: 600, color: \"text.secondary\", whiteSpace: \"nowrap\" }}>\r\n        Disposition\r\n      </Typography>\r\n      {entries.map((entry, i) => {\r\n        const isActive = i === selected;\r\n        return (\r\n          <Chip\r\n            key={`${entry.code}-${i}`}\r\n            size=\"small\"\r\n            clickable={entries.length > 1}\r\n            onClick={entries.length > 1 ? () => onSelect(i) : undefined}\r\n            label={entry.label}\r\n            sx={{\r\n              height: 26,\r\n              borderRadius: \"13px\",\r\n              fontSize: \"0.72rem\",\r\n              fontWeight: 600,\r\n              border: \"1px solid\",\r\n              borderColor: isActive ? primary : \"divider\",\r\n              backgroundColor: isActive ? alpha(primary, 0.12) : \"background.paper\",\r\n              color: isActive ? primary : \"text.secondary\",\r\n              \"&:hover\": { backgroundColor: isActive ? alpha(primary, 0.18) : \"action.hover\" },\r\n            }}\r\n          />\r\n        );\r\n      })}\r\n    </Box>\r\n  );\r\n}\r\n\r\n// A value the backend sent as a stand-in for \"not known\".\r\nfunction isPlaceholder(value: string): boolean {\r\n  const v = value.trim().toLowerCase().replace(/[^a-z]/g, \"\");\r\n  return v === \"\" || v === \"na\" || v === \"null\" || v === \"none\" || v === \"unknown\";\r\n}\r\n\r\n/**\r\n * Title-bar subtitle built from whatever metadata the backend actually sent —\r\n * the first few real values in the order received. No field is named here: the\r\n * metadata keys vary per tenant, and placeholders are skipped rather than\r\n * printed (which is what produced \"N/A · N/A · N/A\").\r\n */\r\nfunction buildSubtitle(data: NewAuditApiResponse): string | undefined {\r\n  const values = Object.entries(data.Audit_Metadata ?? {})\r\n    .filter(([, v]) => typeof v === \"string\" || typeof v === \"number\")\r\n    .map(([k, v]) => metadataValue(k, v as string | number))\r\n    .filter((v) => !isPlaceholder(v));\r\n  return values.slice(0, 3).join(\" · \") || undefined;\r\n}\r\n\r\nfunction buildHeaderBadges(\r\n  data: NewAuditApiResponse,\r\n  opts: {\r\n    /** Suppressed when the chip row is shown — it already names the disposition. */\r\n    includeDisposition?: boolean;\r\n    /** Suppressed when the score strip is shown — it already lists every total. */\r\n    includeScore?: boolean;\r\n  } = {},\r\n): Array<{ label: string; value: string; asBadge?: boolean; badgeSuffix?: string }> {\r\n  const { includeDisposition = true, includeScore = true } = opts;\r\n  const summary = data.Executive_Audit_Summary ?? {};\r\n  const meta = data.Audit_Metadata ?? {};\r\n  // Score against this disposition's own denominator, not a hardcoded 100.\r\n  const { overallScore, totalMax } = readScorecard(data);\r\n  const hasScore = (data.Quality_Scorecard?.Total_Score ?? summary.Overall_Audit_Score_Percentage) != null;\r\n  // Prefer the dispositions list (\"Parent - Child\", comma-joined) when the\r\n  // backend sends it; otherwise fall back to the single Call_Disposition string.\r\n  const rawDispositions: MetaDisposition[] = Array.isArray((meta as any).dispositions)\r\n    ? (meta as any).dispositions\r\n    : Array.isArray((data as any).dispositions)\r\n      ? (data as any).dispositions\r\n      : [];\r\n  const dispositionValue = rawDispositions.map(formatDisposition).filter(Boolean).join(\", \")\r\n    || (meta.Call_Disposition != null ? String(meta.Call_Disposition) : \"\");\r\n  // The score rides inside the PASS/FAIL badge (\"FAIL · 50/100\"); it only needs\r\n  // a badge of its own when the backend sent no result to hang it on. That is\r\n  // compact enough to keep even when `includeScore` suppresses the standalone\r\n  // badge in favour of the per-disposition score strip.\r\n  const scoreValue = hasScore ? `${overallScore}/${totalMax}` : \"\";\r\n  // Only surface badges whose values the backend actually sent — no N/A fillers.\r\n  return [\r\n    includeDisposition && dispositionValue ? { label: \"Call Disposition\", value: dispositionValue } : null,\r\n    summary.Audit_Result\r\n      ? {\r\n          label: \"Result\",\r\n          value: String(summary.Audit_Result),\r\n          asBadge: true,\r\n          badgeSuffix: scoreValue || undefined,\r\n        }\r\n      : null,\r\n    !summary.Audit_Result && includeScore && scoreValue\r\n      ? { label: \"Score\", value: scoreValue }\r\n      : null,\r\n  ].filter(Boolean) as Array<{ label: string; value: string; asBadge?: boolean; badgeSuffix?: string }>;\r\n}\r\n\r\nfunction AuditReportInner({ callUuid, active = true, primary, onClose, onMaximize }: AuditReportInnerProps) {\r\n  const {\r\n    activeTab, setActiveTab, dispositions, selectedDisposition, setSelectedDisposition,\r\n    apiData, auditLoading, auditError,\r\n  } = useAuditReportData(callUuid, active);\r\n\r\n  // Chips are the disposition selector; a legacy single unlabelled report has none.\r\n  const showChips = dispositions.some((d) => !!d.label);\r\n  const headerBadges = apiData\r\n    ? buildHeaderBadges(apiData, { includeDisposition: !showChips, includeScore: dispositions.length <= 1 })\r\n    : [];\r\n  const subtitle = apiData ? buildSubtitle(apiData) : undefined;\r\n\r\n  const iconButtonSx = {\r\n    flexShrink: 0, width: 28, height: 28, borderRadius: \"6px\", backgroundColor: \"action.hover\", color: \"text.secondary\",\r\n    \"&:hover\": { backgroundColor: \"action.selected\", color: \"text.primary\" },\r\n    transition: \"all 0.15s ease\",\r\n  } as const;\r\n\r\n  function renderTab() {\r\n    if (!apiData) return null;\r\n    switch (activeTab) {\r\n      case 0: return <OverviewTab data={apiData} />;\r\n      case 1: return (\r\n        <ScorecardTab\r\n          data={apiData}\r\n          primary={primary}\r\n          dispositions={dispositions}\r\n          selectedDisposition={selectedDisposition}\r\n          onSelectDisposition={setSelectedDisposition}\r\n        />\r\n      );\r\n      case 2: return <AuditChecklistTab data={apiData} primary={primary} />;\r\n      case 3: return <AuditorRecommendationTab data={apiData} primary={primary} />;\r\n      default: return null;\r\n    }\r\n  }\r\n\r\n  return (\r\n    <>\r\n      {PRINT_STYLES}\r\n      {createPortal(\r\n        <div id={PRINT_ROOT_ID}>\r\n          <Box sx={{ mb: 2.5, pb: 1.5, borderBottom: \"2px solid\", borderColor: \"divider\" }}>\r\n            <Typography sx={{ fontSize: \"1.2rem\", fontWeight: 700, color: \"text.primary\" }}>Audit Report</Typography>\r\n            {subtitle && <Typography sx={{ fontSize: \"0.8rem\", color: \"text.secondary\", mt: \"4px\" }}>{subtitle}</Typography>}\r\n          </Box>\r\n          {/* Print every audited disposition, not just the selected one. */}\r\n          {dispositions.map((entry, i) => (\r\n            <Box key={`${entry.code}-${i}`} sx={{ display: \"flex\", flexDirection: \"column\", gap: 3, mb: 3 }}>\r\n              {showChips && (\r\n                <Typography sx={{ fontSize: \"0.95rem\", fontWeight: 700, color: \"text.primary\" }}>\r\n                  {`Disposition: ${entry.label}`}\r\n                </Typography>\r\n              )}\r\n              <OverviewTab data={entry.report} />\r\n              {/* One entry, no selection handler — same table shape, static chips. */}\r\n              <ScorecardTab data={entry.report} primary={primary} dispositions={[entry]} />\r\n              <Box>\r\n                <SectionTitle>Audit Checklist</SectionTitle>\r\n                <AuditChecklistContent data={entry.report} />\r\n              </Box>\r\n              <AuditorRecommendationTab data={entry.report} primary={primary} />\r\n            </Box>\r\n          ))}\r\n        </div>,\r\n        document.body,\r\n      )}\r\n\r\n      {/* Title bar */}\r\n      <Box sx={{ px: { xs: 2, md: 2.5 }, py: \"12px\", display: \"flex\", alignItems: \"flex-start\", justifyContent: \"space-between\", gap: 1, borderBottom: \"1px solid\", borderColor: \"divider\", flexShrink: 0 }}>\r\n        <Box sx={{ minWidth: 0 }}>\r\n          <Typography sx={{ fontWeight: 700, fontSize: { xs: \"1rem\", sm: \"1.2rem\" }, color: \"text.primary\", lineHeight: 1.3 }}>Audit Report</Typography>\r\n          {subtitle && <Typography sx={{ fontSize: \"0.78rem\", color: \"text.secondary\", mt: \"3px\" }}>{subtitle}</Typography>}\r\n        </Box>\r\n        <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.75, flexShrink: 0 }}>\r\n          {onMaximize && (\r\n            <IconButton size=\"small\" onClick={onMaximize} title=\"Open in new tab\" sx={iconButtonSx}>\r\n              <LaunchIcon sx={{ fontSize: 14 }} />\r\n            </IconButton>\r\n          )}\r\n          {onClose && (\r\n            <IconButton size=\"small\" onClick={onClose} title=\"Close\" sx={iconButtonSx}>\r\n              <CloseIcon sx={{ fontSize: 15 }} />\r\n            </IconButton>\r\n          )}\r\n        </Box>\r\n      </Box>\r\n\r\n      {/* Disposition selector — sits above the badges so the disposition reads\r\n          first and the result/score row follows it. */}\r\n      {showChips && (\r\n        <DispositionChips\r\n          entries={dispositions}\r\n          selected={selectedDisposition}\r\n          onSelect={setSelectedDisposition}\r\n          primary={primary}\r\n        />\r\n      )}\r\n\r\n      {/* Header badges */}\r\n      {headerBadges.length > 0 && (\r\n        <Box sx={{ px: { xs: 2, md: 2.5 }, py: \"8px\", display: \"flex\", alignItems: \"center\", gap: \"8px\", flexWrap: \"wrap\", borderBottom: \"1px solid\", borderColor: \"divider\", backgroundColor: \"#f5f7f8\", flexShrink: 0 }}>\r\n          {headerBadges.map((badge, i) =>\r\n            badge.asBadge ? (\r\n              <StatusBadge key={i} label={badge.value} suffix={badge.badgeSuffix} />\r\n            ) : (\r\n              <Box key={i} sx={{ display: \"flex\", alignItems: \"center\", gap: \"5px\", px: \"9px\", height: 26, border: \"1px solid\", borderColor: \"divider\", borderRadius: \"5px\", backgroundColor: \"background.paper\" }}>\r\n                <Box sx={{ width: 5, height: 5, borderRadius: \"50%\", backgroundColor: primary, flexShrink: 0 }} />\r\n                <Typography sx={{ fontSize: \"0.72rem\", color: \"text.secondary\", whiteSpace: \"nowrap\" }}>\r\n                  <Box component=\"span\" sx={{ fontWeight: 600, color: \"text.primary\", mr: \"3px\" }}>{badge.label}:</Box>\r\n                  {badge.value}\r\n                </Typography>\r\n              </Box>\r\n            ),\r\n          )}\r\n        </Box>\r\n      )}\r\n\r\n      {/* Static tabs */}\r\n      <Box sx={{ borderBottom: \"1px solid\", borderColor: \"divider\", backgroundColor: \"background.paper\", flexShrink: 0 }}>\r\n        <Tabs\r\n          value={activeTab}\r\n          onChange={(_, v) => setActiveTab(v)}\r\n          variant=\"scrollable\"\r\n          scrollButtons=\"auto\"\r\n          sx={{\r\n            minHeight: 40,\r\n            px: { xs: 1, md: 2 },\r\n            \"& .MuiTab-root\": { fontSize: \"0.78rem\", fontWeight: 600, minHeight: 40, textTransform: \"none\", color: \"text.secondary\", py: 0, px: 1.5, \"&.Mui-selected\": { color: primary } },\r\n            \"& .MuiTabs-indicator\": { backgroundColor: primary, height: 2 },\r\n          }}\r\n        >\r\n          {STATIC_TABS.map((tab) => (\r\n            <Tab key={tab.id} label={tab.label} disableRipple />\r\n          ))}\r\n        </Tabs>\r\n      </Box>\r\n\r\n      {/* Tab content */}\r\n      <Box sx={{ flex: 1, overflow: \"auto\", px: { xs: 2, md: 2.5 }, py: 2 }}>\r\n        {auditLoading && (\r\n          <Box sx={{ display: \"flex\", justifyContent: \"center\", alignItems: \"center\", py: 6 }}>\r\n            <CircularProgress size={32} />\r\n          </Box>\r\n        )}\r\n        {!auditLoading && auditError && (\r\n          <Alert severity=\"warning\" sx={{ mb: 2, fontSize: \"0.78rem\" }}>{auditError}</Alert>\r\n        )}\r\n        {!auditLoading && !auditError && !apiData && (\r\n          <Box sx={{ display: \"flex\", justifyContent: \"center\", alignItems: \"center\", py: 6 }}>\r\n            <Typography sx={{ fontSize: \"0.78rem\", color: \"text.secondary\" }}>No audit data available.</Typography>\r\n          </Box>\r\n        )}\r\n        {!auditLoading && apiData && renderTab()}\r\n      </Box>\r\n    </>\r\n  );\r\n}\r\n\r\n// ─── \"Open in new tab\" URL resolver (host-configurable) ─────────────────────────\r\n//\r\n// The maximize button opens the full-page audit report in a new browser tab.\r\n// This SDK runs inside different host apps that may mount the audit-report route\r\n// at a different path, behind a router `basename`, or with hash routing — so the\r\n// host decides how that URL is built. The default targets a ROOT-level\r\n// \"/audit-report/:callUuid\" route (what ahs-cti-ui registers); a host that mounts\r\n// the route elsewhere should call `setAuditReportUrlResolver` once at startup.\r\n\r\n/** Builds the URL the maximize button opens for a given call. */\r\nexport type AuditReportUrlResolver = (callUuid: string) => string;\r\n\r\nlet auditReportUrlResolver: AuditReportUrlResolver = (callUuid) =>\r\n  `/audit-report/${encodeURIComponent(callUuid)}`;\r\n\r\n/**\r\n * Configure how the audit-report maximize button builds its new-tab URL.\r\n * Call once during host-app startup, alongside registering the route that\r\n * renders `SDKPages.AuditReportPage`.\r\n *\r\n * @example\r\n * // Route registered at \"/reports/audit-report/:callUuid\":\r\n * setAuditReportUrlResolver((id) => `/reports/audit-report/${encodeURIComponent(id)}`);\r\n * // Hash router:\r\n * setAuditReportUrlResolver((id) => `/#/audit-report/${encodeURIComponent(id)}`);\r\n */\r\nexport function setAuditReportUrlResolver(resolver: AuditReportUrlResolver): void {\r\n  auditReportUrlResolver = resolver;\r\n}\r\n\r\n// ─── Public exports ────────────────────────────────────────────────────────────\r\n\r\ninterface AuditReportDialogProps {\r\n  open: boolean;\r\n  onClose: () => void;\r\n  width?: string;\r\n  rowData?: CdrRecordResponse;\r\n  /**\r\n   * Call to audit. Use this when you have a bare call id (e.g. a ticket's\r\n   * `convoxid`) rather than a full CDR row. Takes precedence over\r\n   * `rowData.callUuid` when both are provided.\r\n   */\r\n  callUuid?: string;\r\n  /**\r\n   * Per-instance override of the maximize behaviour. When provided it takes\r\n   * precedence over the globally-configured resolver — useful for in-app\r\n   * navigation instead of opening a new tab.\r\n   */\r\n  onMaximize?: (callUuid: string) => void;\r\n}\r\n\r\n/**\r\n * Audit report shown in a modal dialog. The maximize button opens the same\r\n * report full-screen in a new browser tab. The URL is built by the\r\n * host-configured resolver (see `setAuditReportUrlResolver`).\r\n */\r\nexport default function AuditReportDialog({ open, onClose, width = \"80vw\", rowData, callUuid: callUuidProp, onMaximize }: AuditReportDialogProps) {\r\n  const theme = useTheme();\r\n  const primary = theme.palette.primary.main;\r\n  const callUuid = callUuidProp ?? rowData?.callUuid;\r\n\r\n  const handleMaximize = () => {\r\n    if (!callUuid) return;\r\n    if (onMaximize) {\r\n      onMaximize(callUuid);\r\n      return;\r\n    }\r\n    // NOTE: open WITHOUT \"noopener\" so the new tab inherits a copy of this\r\n    // tab's sessionStorage (auth session + API token live there) — otherwise\r\n    // the new tab boots logged-out.\r\n    window.open(auditReportUrlResolver(callUuid), \"_blank\");\r\n  };\r\n\r\n  return (\r\n    <Dialog\r\n      open={open}\r\n      onClose={(_e, reason) => { if (reason !== 'backdropClick') onClose(); }}\r\n      fullWidth\r\n      slotProps={{\r\n        paper: {\r\n          sx: { width, maxWidth: width, height: \"90vh\", display: \"flex\", flexDirection: \"column\", overflow: \"hidden\", borderRadius: \"10px\" },\r\n        },\r\n      }}\r\n    >\r\n      {open && (\r\n        <AuditReportInner\r\n          callUuid={callUuid}\r\n          active={open}\r\n          primary={primary}\r\n          onClose={onClose}\r\n          onMaximize={callUuid ? handleMaximize : undefined}\r\n        />\r\n      )}\r\n    </Dialog>\r\n  );\r\n}\r\n\r\n/**\r\n * Stand-alone full-page audit report rendered by the `/audit-report/:callUuid` route.\r\n */\r\nexport function AuditReportFullPage({ callUuid }: { callUuid?: string }) {\r\n  const theme = useTheme();\r\n  const primary = theme.palette.primary.main;\r\n\r\n  return (\r\n    <Box sx={{ height: \"100vh\", display: \"flex\", flexDirection: \"column\", overflow: \"hidden\", backgroundColor: \"background.paper\" }}>\r\n      <AuditReportInner callUuid={callUuid} active primary={primary} />\r\n    </Box>\r\n  );\r\n}\r\n\r\n/**\r\n * Embeddable audit report — the same tabbed report as the dialog/full page, but\r\n * sized to fill its parent container (no dialog chrome, no `100vh` lock). Use it\r\n * inside split-view layouts, e.g. a call list with an inline report pane.\r\n *\r\n * @param callUuid Call to load the report for (fetched when it changes).\r\n * @param active   When false, skips fetching (e.g. no call selected yet).\r\n */\r\nexport function AuditReportPanel({ callUuid, active = true }: { callUuid?: string; active?: boolean }) {\r\n  const theme = useTheme();\r\n  const primary = theme.palette.primary.main;\r\n\r\n  return (\r\n    <Box sx={{ height: \"100%\", display: \"flex\", flexDirection: \"column\", overflow: \"hidden\", backgroundColor: \"background.paper\" }}>\r\n      <AuditReportInner callUuid={callUuid} active={active} primary={primary} />\r\n    </Box>\r\n  );\r\n}\r\n\r\n","\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n  d: \"M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3z\"\n}), 'Launch');","\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n  d: \"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m4.59-12.42L10 14.17l-2.59-2.58L6 13l4 4 8-8z\"\n}), 'CheckCircleOutlined');","\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n  d: \"M14.59 8 12 10.59 9.41 8 8 9.41 10.59 12 8 14.59 9.41 16 12 13.41 14.59 16 16 14.59 13.41 12 16 9.41zM12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8\"\n}), 'HighlightOff');","\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n  d: \"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m5 11H7v-2h10z\"\n}), 'RemoveCircleOutlined');"],"mappings":"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","names":["_jsx","_jsx","_jsx","_a","text","_b"]}