{"version":3,"sources":["../node_modules/@mui/icons-material/Groups.mjs","../call-control-sdk/lib/pages/common/components/ConferenceTimeline.tsx","../node_modules/@mui/icons-material/MicOff.mjs","../node_modules/@mui/icons-material/Assignment.mjs"],"sourcesContent":["\"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 12.75c1.63 0 3.07.39 4.24.9 1.08.48 1.76 1.56 1.76 2.73V18H6v-1.61c0-1.18.68-2.26 1.76-2.73 1.17-.52 2.61-.91 4.24-.91M4 13c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2m1.13 1.1c-.37-.06-.74-.1-1.13-.1-.99 0-1.93.21-2.78.58C.48 14.9 0 15.62 0 16.43V18h4.5v-1.61c0-.83.23-1.61.63-2.29M20 13c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2m4 3.43c0-.81-.48-1.53-1.22-1.85-.85-.37-1.79-.58-2.78-.58-.39 0-.76.04-1.13.1.4.68.63 1.46.63 2.29V18H24zM12 6c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3\"\n}), 'Groups');","import React, { useEffect, useMemo, useRef, useState } from \"react\";\r\nimport {\r\n  Alert,\r\n  Box,\r\n  CircularProgress,\r\n  Dialog,\r\n  IconButton,\r\n  Table,\r\n  TableBody,\r\n  TableCell,\r\n  TableContainer,\r\n  TableHead,\r\n  TableRow,\r\n  Typography,\r\n} from \"@mui/material\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport GroupsIcon from \"@mui/icons-material/Groups\";\r\nimport MicOffIcon from \"@mui/icons-material/MicOff\";\r\nimport dayjs from \"dayjs\";\r\nimport { getConferenceReport } from \"../../cdrReport/useCdrReport\";\r\nimport type {\r\n  ConferenceParticipant,\r\n  ConferenceReportResponse,\r\n} from \"../../cdrReport/types\";\r\nimport { useNumberMask } from \"../../../utils/numberMask\";\r\nconst FONT =\r\n  \"'Inter', 'Segoe UI', 'Roboto', -apple-system, BlinkMacSystemFont, sans-serif\";\r\n\r\nconst COLORS = {\r\n  navy: \"#0d2a56\",\r\n  amber: \"#c47c00\",\r\n  blue: \"#1565c8\",\r\n  green: \"#0a9a62\",\r\n  red: \"#cc2a2a\",\r\n  grey: \"#8b98a9\",  \r\n} as const;\r\n\r\n/**\r\n * Bar colour means state, and only state — that is what the legend above the\r\n * chart is a key for. Bars used to be tinted per participant instead, so the\r\n * legend's \"Connected\" swatch could only ever match one row and every other leg\r\n * was an unexplained colour.\r\n *\r\n * Every entry here is used verbatim by both the bars and the legend swatches, so\r\n * the two cannot drift apart again. Per-participant identity lives in the line\r\n * tiles and the join / leave caps (see LEG_HUES), which the legend never claims\r\n * to explain.\r\n */\r\nconst SEGMENT_STYLE = {\r\n  ringing: {\r\n    background: \"#fbe9b8\",\r\n    border: \"1px dashed #d9a93c\",\r\n  },\r\n  connected: {\r\n    background: \"#0a9a62\",\r\n    border: \"none\",\r\n  },\r\n  unanswered: {\r\n    background: \"#f6d5d5\",\r\n    border: \"1px solid #cc2a2a\",\r\n  },\r\n} as const;\r\n\r\n/** Diagonal amber hatch marking the on-hold portion of a connected bar. */\r\nconst HOLD_HATCH =\r\n  \"repeating-linear-gradient(45deg, #c47c00 0 4px, #e9a83a 4px 8px)\";\r\n\r\n/** Tint behind the stretch where two or more legs were connected at once. */\r\nconst BAND_TINT = \"rgba(21,101,200,0.06)\";\r\nconst BAND_BORDER = \"rgba(21,101,200,0.3)\";\r\n\r\n/* One hue per leg, used for the line-number tile and the join / leave caps so a\r\n   participant stays identifiable across the chart and the table. Deliberately NOT\r\n   used for the bars: bar colour is reserved for state, which is what the legend\r\n   above the chart explains. */\r\nconst LEG_HUES = [\"#6b3fbf\", \"#0a9a62\", \"#1565c8\", \"#c47c00\", \"#0f7c8a\", \"#b3357a\"];\r\nconst legHue = (i: number) => LEG_HUES[i % LEG_HUES.length];\r\n\r\nconst ROW_H = 34;\r\nconst BAR_H = 16;\r\n/** Track never gets narrower than this, so the axis stays readable on small dialogs. */\r\nconst LABEL_W = 190;\r\n\r\nconst toMs = (value?: string | null): number | null => {\r\n  if (!value) return null;\r\n  const ms = dayjs(value).valueOf();\r\n  return Number.isFinite(ms) ? ms : null;\r\n};\r\n\r\n/** Seconds → `mm:ss`, or `h:mm:ss` once the span passes an hour. */\r\nconst fmtOffset = (sec: number): string => {\r\n  const s = Math.max(0, Math.round(sec));\r\n  const h = Math.floor(s / 3600);\r\n  const m = Math.floor((s % 3600) / 60);\r\n  const ss = s % 60;\r\n  const mm = h > 0 ? String(m).padStart(2, \"0\") : String(m);\r\n  return `${h > 0 ? `${h}:` : \"\"}${mm}:${String(ss).padStart(2, \"0\")}`;\r\n};\r\n\r\nconst fmtClock = (value?: string | null): string =>\r\n  value ? dayjs(value).format(\"HH:mm:ss\") : \"\";\r\n\r\nconst fmtDuration = (\r\n  fmt?: string | null,\r\n  seconds?: number | null,\r\n): string => {\r\n  if (fmt) return fmt;\r\n  if (seconds == null || !isFinite(seconds)) return \"\";\r\n  return fmtOffset(seconds);\r\n};\r\n\r\n/* Axis granularity — first step that keeps the tick count at 8 or under. */\r\nconst TICK_STEPS = [5, 10, 15, 30, 60, 120, 300, 600, 900, 1800, 3600, 7200];\r\n\r\ninterface Segment {\r\n  kind: \"ringing\" | \"connected\" | \"unanswered\";\r\n  from: number;\r\n  to: number;\r\n}\r\n\r\ninterface LegLayout {\r\n  participant: ConferenceParticipant;\r\n  /** Identity tint for the line tile and the join / leave caps. */\r\n  hue: string;\r\n  /** Window the leg occupied, clamped to real timestamps. */\r\n  start: number;\r\n  end: number;\r\n  segments: Segment[];\r\n  /** Portion of the connected segment spent on hold, as a fraction (0–1). */\r\n  holdFraction: number;\r\n  answered: boolean;\r\n  ongoing: boolean;\r\n}\r\n\r\n/**\r\n * Places every leg on a shared clock.\r\n *\r\n * A leg's window runs join → leave. When the backend has not written a leave time\r\n * yet (leg still up) we fall back to `join + durationSeconds`, and finally to the\r\n * window end, so an in-progress conference still renders instead of collapsing to\r\n * a zero-width bar.\r\n */\r\nfunction buildLayout(participants: ConferenceParticipant[]) {\r\n  const rows = participants.map((p, i) => {\r\n    const join = toMs(p.joinTime);\r\n    const answer = toMs(p.answerTime);\r\n    const leave = toMs(p.leaveTime);\r\n    const start = join ?? answer ?? leave ?? 0;\r\n    const durMs = (p.durationSeconds ?? 0) * 1000;\r\n    const end = leave ?? (start ? start + durMs : start);\r\n    return { p, i, start, end: Math.max(end, start), answer, leave };\r\n  });\r\n\r\n  const t0 = Math.min(...rows.map((r) => r.start));\r\n  const t1 = Math.max(...rows.map((r) => r.end));\r\n  const span = Math.max(t1 - t0, 1000);\r\n\r\n  const legs: LegLayout[] = rows.map(({ p, i, start, end, answer }) => {\r\n    const segments: Segment[] = [];\r\n    const answered =\r\n      answer != null || (p.legDisposition ?? \"\").toLowerCase() === \"answered\";\r\n    const connectFrom = answer != null && answer > start ? answer : start;\r\n\r\n    if (answer != null && answer > start) {\r\n      segments.push({ kind: \"ringing\", from: start, to: answer });\r\n    }\r\n    if (answered) {\r\n      segments.push({ kind: \"connected\", from: connectFrom, to: end });\r\n    } else {\r\n      segments.push({ kind: \"unanswered\", from: start, to: end });\r\n    }\r\n\r\n    const connectedMs = Math.max(end - connectFrom, 0);\r\n    const holdMs = (p.holdDurationSeconds ?? 0) * 1000;\r\n    const holdFraction =\r\n      connectedMs > 0 ? Math.min(holdMs / connectedMs, 1) : 0;\r\n\r\n    return {\r\n      participant: p,\r\n      hue: legHue(i),\r\n      start,\r\n      end,\r\n      segments,\r\n      holdFraction,\r\n      answered,\r\n      ongoing: p.leaveTime == null,\r\n    };\r\n  });\r\n\r\n  /* How many legs were connected at the same time, as a step function over the\r\n     whole window. Drives the concurrency lane, the shaded \"2+ connected\" bands\r\n     and the live-count readout on the crosshair. */\r\n  const events: Array<[number, number]> = [];\r\n  for (const leg of legs) {\r\n    const connected = leg.segments.find((s) => s.kind === \"connected\");\r\n    if (!connected || connected.to <= connected.from) continue;\r\n    events.push([connected.from, 1]);\r\n    events.push([connected.to, -1]);\r\n  }\r\n  // Ties resolve ends before starts, so two legs that merely touch don't count\r\n  // as overlapping.\r\n  events.sort((a, b) => a[0] - b[0] || a[1] - b[1]);\r\n\r\n  const concurrency: Array<{ from: number; to: number; count: number }> = [];\r\n  let live = 0;\r\n  let cursor = t0;\r\n  for (const [at, delta] of events) {\r\n    if (at > cursor) concurrency.push({ from: cursor, to: at, count: live });\r\n    live += delta;\r\n    cursor = at;\r\n  }\r\n  if (cursor < t1) concurrency.push({ from: cursor, to: t1, count: live });\r\n\r\n  /* Consecutive 2+ stretches merged into bands — the part of the call that was\r\n     genuinely multi-party. */\r\n  const bands: Array<[number, number]> = [];\r\n  for (const seg of concurrency) {\r\n    if (seg.count < 2) continue;\r\n    const last = bands[bands.length - 1];\r\n    if (last && last[1] === seg.from) last[1] = seg.to;\r\n    else bands.push([seg.from, seg.to]);\r\n  }\r\n\r\n  const spanSec = span / 1000;\r\n  const step = TICK_STEPS.find((s) => spanSec / s <= 8) ?? TICK_STEPS[TICK_STEPS.length - 1];\r\n  const ticks: number[] = [];\r\n  for (let t = 0; t <= spanSec + 0.001; t += step) ticks.push(t);\r\n\r\n  return { legs, t0, t1, span, bands, ticks, concurrency };\r\n}\r\n\r\n/**\r\n * What the leg was doing at `at` — the bar part under the cursor, named. Hold is\r\n * drawn at the head of the connected bar, so the same head slice is what reports\r\n * itself as \"On hold\" here; the two stay in step because both derive from\r\n * `holdDurationSeconds`.\r\n */\r\nfunction segmentAt(\r\n  leg: LegLayout,\r\n  at: number,\r\n): { name: string; detail: string; tint: string } | null {\r\n  const seg = leg.segments.find((s) => at >= s.from && at <= s.to);\r\n  if (!seg) return null;\r\n\r\n  const p = leg.participant;\r\n  const segLen = fmtOffset((seg.to - seg.from) / 1000);\r\n\r\n  if (seg.kind === \"ringing\") return { name: \"Ringing\", detail: segLen, tint: \"#f0c05a\" };\r\n  if (seg.kind === \"unanswered\")\r\n    return { name: \"Not answered\", detail: `rang ${segLen}`, tint: \"#e88d8d\" };\r\n\r\n  const holdMs = (p.holdDurationSeconds ?? 0) * 1000;\r\n  if (holdMs > 0 && at <= seg.from + holdMs) {\r\n    return {\r\n      name: \"On hold\",\r\n      detail: fmtDuration(p.holdDurationFmt, p.holdDurationSeconds),\r\n      tint: \"#e9a83a\",\r\n    };\r\n  }\r\n  return {\r\n    name: \"On call\",\r\n    detail: fmtDuration(p.durationFmt, p.durationSeconds),\r\n    tint: \"#4fc48f\",\r\n  };\r\n}\r\n\r\n/** Legs connected at a given instant — powers the crosshair readout. */\r\nfunction liveAt(\r\n  concurrency: Array<{ from: number; to: number; count: number }>,\r\n  at: number,\r\n): number {\r\n  const seg = concurrency.find((s) => at >= s.from && at < s.to);\r\n  return seg?.count ?? 0;\r\n}\r\n\r\n/* Each legend swatch is drawn from the SAME constants the bars use, and shaped\r\n   like a bar rather than a dot — so the key is a literal sample of what is in the\r\n   chart, not an approximation of it. */\r\nconst SWATCH_SX: Record<string, object> = {\r\n  ringing: SEGMENT_STYLE.ringing,\r\n  connected: SEGMENT_STYLE.connected,\r\n  hold: {\r\n    background: SEGMENT_STYLE.connected.background,\r\n    backgroundImage: HOLD_HATCH,\r\n  },\r\n  unanswered: SEGMENT_STYLE.unanswered,\r\n  band: { background: BAND_TINT, border: `1px dashed ${BAND_BORDER}` },\r\n};\r\n\r\nfunction StatusDot({ label, swatch }: { label: string; swatch: keyof typeof SWATCH_SX }) {\r\n  return (\r\n    <Box sx={{ display: \"inline-flex\", alignItems: \"center\", gap: 0.6 }}>\r\n      <Box\r\n        sx={{\r\n          width: 16,\r\n          height: 9,\r\n          borderRadius: \"3px\",\r\n          flexShrink: 0,\r\n          ...SWATCH_SX[swatch],\r\n        }}\r\n      />\r\n      <Typography sx={{ fontSize: \"0.68rem\", color: \"#5a6a7d\", whiteSpace: \"nowrap\" }}>\r\n        {label}\r\n      </Typography>\r\n    </Box>\r\n  );\r\n}\r\n\r\nfunction SummaryTile({ label, value }: { label: string; value: string }) {\r\n  return (\r\n    <Box\r\n      sx={{\r\n        border: \"1px solid #e0e7ef\",\r\n        borderRadius: \"8px\",\r\n        px: 1.5,\r\n        py: 0.9,\r\n        minWidth: 118,\r\n        bgcolor: \"#fff\",\r\n      }}\r\n    >\r\n      <Typography\r\n        sx={{ fontSize: \"0.65rem\", color: \"#7b8798\", fontWeight: 600, letterSpacing: \"0.04em\" }}\r\n      >\r\n        {label.toUpperCase()}\r\n      </Typography>\r\n      <Typography\r\n        sx={{\r\n          fontSize: \"0.95rem\",\r\n          fontWeight: 700,\r\n          color: COLORS.navy,\r\n          fontVariantNumeric: \"tabular-nums\",\r\n          mt: 0.2,\r\n        }}\r\n      >\r\n        {value}\r\n      </Typography>\r\n    </Box>\r\n  );\r\n}\r\n\r\nfunction LegStatusPill({ participant }: { participant: ConferenceParticipant }) {\r\n  const raw = (participant.status ?? \"\").toUpperCase();\r\n  const ongoing = participant.leaveTime == null;\r\n  const answered = (participant.legDisposition ?? \"\").toLowerCase() === \"answered\";\r\n  let color: string = COLORS.grey;\r\n  let bg = \"#eef1f6\";\r\n  if (ongoing) {\r\n    color = COLORS.green;\r\n    bg = \"#e6f7ef\";\r\n  } else if (!answered) {\r\n    color = COLORS.red;\r\n    bg = \"#fce8e8\";\r\n  }\r\n  return (\r\n    <Box\r\n      component=\"span\"\r\n      sx={{\r\n        display: \"inline-flex\",\r\n        px: 0.75,\r\n        py: 0.25,\r\n        borderRadius: \"6px\",\r\n        bgcolor: bg,\r\n        color,\r\n        fontSize: \"0.65rem\",\r\n        fontWeight: 700,\r\n        letterSpacing: \"0.02em\",\r\n      }}\r\n    >\r\n      {raw || (ongoing ? \"ACTIVE\" : \"\")}\r\n    </Box>\r\n  );\r\n}\r\n\r\n/* ── Timeline ─────────────────────────────────────────────────────────────── */\r\n//\r\n// Hover behaviour, deliberately: NO MUI tooltips anywhere inside the chart. Bars,\r\n// markers and labels overlap each other by design, so poppers anchored to them\r\n// used to stack and fight. Instead there is exactly one readout — a fixed strip\r\n// above the chart — plus native `title` attributes as the slow-hover fallback,\r\n// which the browser renders one at a time.\r\n\r\ninterface HoverState {\r\n  /** 0–1 position across the track. */\r\n  fraction: number;\r\n  at: number;\r\n  live: number;\r\n  /** The bar part under the cursor, when the cursor is over a leg's row. */\r\n  segment: { name: string; detail: string; tint: string } | null;\r\n}\r\n\r\n/** Gutter above the rows reserved for the crosshair's time / live-count pill. */\r\nconst READOUT_H = 20;\r\n\r\n/**\r\n * The leg rows, split out and memoised: the crosshair updates on every mouse move\r\n * and must not drag a full re-render of every bar along with it.\r\n */\r\nconst TimelineRows = React.memo(function TimelineRows({\r\n  legs,\r\n  t0,\r\n  span,\r\n  bands,\r\n  ticks,\r\n  label,\r\n  hoveredLeg,\r\n  onHoverLeg,\r\n}: {\r\n  legs: LegLayout[];\r\n  t0: number;\r\n  span: number;\r\n  bands: Array<[number, number]>;\r\n  ticks: number[];\r\n  label: (p: ConferenceParticipant) => string;\r\n  hoveredLeg: string | null;\r\n  onHoverLeg: (legUuid: string | null) => void;\r\n}) {\r\n  const pct = (ms: number) => ((ms - t0) / span) * 100;\r\n  const spanSec = span / 1000;\r\n\r\n  return (\r\n    <Box sx={{ position: \"relative\" }}>\r\n      {/* Backdrop: conference bands and the tick grid, behind the bars. */}\r\n      <Box\r\n        sx={{\r\n          position: \"absolute\",\r\n          left: LABEL_W,\r\n          right: 0,\r\n          top: 0,\r\n          bottom: 0,\r\n          pointerEvents: \"none\",\r\n        }}\r\n      >\r\n        {bands.map(([from, to], i) => {\r\n          const left = pct(from);\r\n          const width = Math.max(pct(to) - left, 0.4);\r\n          return (\r\n            <Box\r\n              key={i}\r\n              sx={{\r\n                position: \"absolute\",\r\n                left: `${left}%`,\r\n                width: `${width}%`,\r\n                top: 0,\r\n                bottom: 0,\r\n                bgcolor: BAND_TINT,\r\n                borderLeft: `1px dashed ${BAND_BORDER}`,\r\n                borderRight: `1px dashed ${BAND_BORDER}`,\r\n              }}\r\n            />\r\n          );\r\n        })}\r\n        {ticks.map((sec) => {\r\n          const left = (sec / spanSec) * 100;\r\n          if (left > 100 || left === 0) return null;\r\n          return (\r\n            <Box\r\n              key={sec}\r\n              sx={{\r\n                position: \"absolute\",\r\n                left: `${left}%`,\r\n                top: 0,\r\n                bottom: 0,\r\n                borderLeft: \"1px dashed #eef1f6\",\r\n              }}\r\n            />\r\n          );\r\n        })}\r\n      </Box>\r\n\r\n      {legs.map((leg) => {\r\n        const p = leg.participant;\r\n        const connected = leg.segments.find((s) => s.kind === \"connected\");\r\n        const ringing = leg.segments.find((s) => s.kind === \"ringing\");\r\n        const holdFmt = fmtDuration(p.holdDurationFmt, p.holdDurationSeconds);\r\n        const hasHold = (p.holdDurationSeconds ?? 0) > 0;\r\n        const isHovered = hoveredLeg === p.legUuid;\r\n        const legTitle = [\r\n          label(p),\r\n          `joined ${fmtClock(p.joinTime)}`,\r\n          p.answerTime ? `answered ${fmtClock(p.answerTime)}` : \"never answered\",\r\n          p.leaveTime ? `left ${fmtClock(p.leaveTime)}` : \"still on call\",\r\n          `talk ${fmtDuration(p.durationFmt, p.durationSeconds)}`,\r\n          hasHold ? `hold ${holdFmt}` : null,\r\n        ]\r\n          .filter(Boolean)\r\n          .join(\"  ·  \");\r\n\r\n        return (\r\n          <Box\r\n            key={p.legUuid}\r\n            title={legTitle}\r\n            sx={{\r\n              display: \"flex\",\r\n              alignItems: \"center\",\r\n              height: ROW_H,\r\n              position: \"relative\",\r\n              borderRadius: \"4px\",\r\n              bgcolor: isHovered ? \"rgba(21,101,200,0.06)\" : \"transparent\",\r\n              transition: \"background-color 0.12s ease\",\r\n            }}\r\n          >\r\n            {/* Label */}\r\n            <Box\r\n              sx={{\r\n                width: LABEL_W,\r\n                flexShrink: 0,\r\n                pr: 1.25,\r\n                display: \"flex\",\r\n                alignItems: \"center\",\r\n                gap: 0.75,\r\n                minWidth: 0,\r\n              }}\r\n            >\r\n              <Box\r\n                sx={{\r\n                  width: 20,\r\n                  height: 20,\r\n                  borderRadius: \"5px\",\r\n                  bgcolor: leg.hue,\r\n                  color: \"#fff\",\r\n                  fontSize: \"0.65rem\",\r\n                  fontWeight: 700,\r\n                  display: \"flex\",\r\n                  alignItems: \"center\",\r\n                  justifyContent: \"center\",\r\n                  flexShrink: 0,\r\n                }}\r\n              >\r\n                {p.lineNumber ?? \"•\"}\r\n              </Box>\r\n              <Typography\r\n                sx={{\r\n                  fontSize: \"0.74rem\",\r\n                  fontWeight: 600,\r\n                  color: COLORS.navy,\r\n                  overflow: \"hidden\",\r\n                  textOverflow: \"ellipsis\",\r\n                  whiteSpace: \"nowrap\",\r\n                }}\r\n              >\r\n                {label(p)}\r\n              </Typography>\r\n              {p.isMuted && (\r\n                <MicOffIcon\r\n                  sx={{ fontSize: 13, color: COLORS.red, flexShrink: 0 }}\r\n                  titleAccess=\"Muted\"\r\n                />\r\n              )}\r\n            </Box>\r\n\r\n            {/* Track */}\r\n            <Box sx={{ position: \"relative\", flex: 1, height: ROW_H }}>\r\n              {/* Baseline for the whole window, so a short leg still reads as\r\n                  \"joined late\" rather than floating in empty space. */}\r\n              <Box\r\n                sx={{\r\n                  position: \"absolute\",\r\n                  left: 0,\r\n                  right: 0,\r\n                  top: \"50%\",\r\n                  height: 1,\r\n                  bgcolor: \"#eef1f6\",\r\n                }}\r\n              />\r\n\r\n              {leg.segments.map((seg, si) => {\r\n                const left = pct(seg.from);\r\n                const width = Math.max(pct(seg.to) - left, 0.35);\r\n                const isRing = seg.kind === \"ringing\";\r\n                const isMiss = seg.kind === \"unanswered\";\r\n                return (\r\n                  <Box\r\n                    key={si}\r\n                    sx={{\r\n                      position: \"absolute\",\r\n                      left: `${left}%`,\r\n                      width: `${width}%`,\r\n                      top: `${(ROW_H - BAR_H) / 2}px`,\r\n                      height: BAR_H,\r\n                      borderRadius: \"4px\",\r\n                      overflow: \"hidden\",\r\n                      ...SEGMENT_STYLE[seg.kind],\r\n                      opacity: isMiss ? 0.9 : 1,\r\n                      boxShadow: isHovered ? \"0 0 0 2px rgba(21,101,200,0.3)\" : \"none\",\r\n                      transition: \"box-shadow 0.12s ease\",\r\n                      display: \"flex\",\r\n                      alignItems: \"center\",\r\n                    }}\r\n                  >\r\n                    {/* Hold is reported as a total, not as intervals — it sits at\r\n                        the head of the connected bar. The table below carries the\r\n                        exact figure. */}\r\n                    {seg.kind === \"connected\" && hasHold && (\r\n                      <Box\r\n                        sx={{\r\n                          position: \"absolute\",\r\n                          left: 0,\r\n                          top: 0,\r\n                          bottom: 0,\r\n                          width: `${leg.holdFraction * 100}%`,\r\n                          minWidth: 3,\r\n                          backgroundImage:\r\n                            HOLD_HATCH,\r\n                        }}\r\n                      />\r\n                    )}\r\n                    {/* Talk time printed inside the bar once it is wide enough\r\n                        to hold it without clipping. */}\r\n                    {seg.kind === \"connected\" && width > 22 && (\r\n                      <Typography\r\n                        sx={{\r\n                          position: \"relative\",\r\n                          ml: \"auto\",\r\n                          mr: \"6px\",\r\n                          fontSize: \"0.63rem\",\r\n                          fontWeight: 700,\r\n                          color: \"#fff\",\r\n                          fontVariantNumeric: \"tabular-nums\",\r\n                          textShadow: \"0 1px 1px rgba(0,0,0,0.25)\",\r\n                        }}\r\n                      >\r\n                        {fmtDuration(p.durationFmt, p.durationSeconds)}\r\n                      </Typography>\r\n                    )}\r\n                  </Box>\r\n                );\r\n              })}\r\n\r\n              {/* Ring duration, printed above the ring segment when it is wide\r\n                  enough to be worth calling out. */}\r\n              {ringing && pct(ringing.to) - pct(ringing.from) > 6 && (\r\n                <Typography\r\n                  sx={{\r\n                    position: \"absolute\",\r\n                    left: `${pct(ringing.from)}%`,\r\n                    width: `${pct(ringing.to) - pct(ringing.from)}%`,\r\n                    top: 0,\r\n                    textAlign: \"center\",\r\n                    fontSize: \"0.6rem\",\r\n                    fontWeight: 600,\r\n                    color: \"#b08324\",\r\n                    whiteSpace: \"nowrap\",\r\n                  }}\r\n                >\r\n                  {fmtOffset((ringing.to - ringing.from) / 1000)}\r\n                </Typography>\r\n              )}\r\n\r\n              {/* Join / leave caps */}\r\n              <Box\r\n                sx={{\r\n                  position: \"absolute\",\r\n                  left: `${pct(leg.start)}%`,\r\n                  top: \"50%\",\r\n                  width: 7,\r\n                  height: 7,\r\n                  ml: \"-3.5px\",\r\n                  mt: \"-3.5px\",\r\n                  borderRadius: \"50%\",\r\n                  bgcolor: \"#fff\",\r\n                  border: `2px solid ${leg.hue}`,\r\n                }}\r\n              />\r\n              {p.leaveTime && (\r\n                <Box\r\n                  sx={{\r\n                    position: \"absolute\",\r\n                    left: `${pct(leg.end)}%`,\r\n                    top: \"50%\",\r\n                    width: 7,\r\n                    height: 7,\r\n                    ml: \"-3.5px\",\r\n                    mt: \"-3.5px\",\r\n                    borderRadius: \"50%\",\r\n                    bgcolor: leg.hue,\r\n                    border: \"2px solid #fff\",\r\n                    boxShadow: `0 0 0 1px ${leg.hue}`,\r\n                  }}\r\n                />\r\n              )}\r\n\r\n              {/* Still-up legs get an arrow instead of an end cap. */}\r\n              {leg.ongoing && (\r\n                <Box\r\n                  sx={{\r\n                    position: \"absolute\",\r\n                    left: `calc(${pct(leg.end)}% + 3px)`,\r\n                    top: \"50%\",\r\n                    transform: \"translateY(-50%)\",\r\n                    width: 0,\r\n                    height: 0,\r\n                    borderTop: \"4px solid transparent\",\r\n                    borderBottom: \"4px solid transparent\",\r\n                    borderLeft: `6px solid ${leg.hue}`,\r\n                  }}\r\n                />\r\n              )}\r\n\r\n              {/* Duration printed just past the bar when it did not fit inside. */}\r\n              {connected &&\r\n                pct(leg.end) < 88 &&\r\n                pct(connected.to) - pct(connected.from) <= 22 && (\r\n                  <Typography\r\n                    sx={{\r\n                      position: \"absolute\",\r\n                      left: `calc(${pct(leg.end)}% + 8px)`,\r\n                      top: \"50%\",\r\n                      transform: \"translateY(-50%)\",\r\n                      fontSize: \"0.66rem\",\r\n                      fontWeight: 600,\r\n                      color: \"#7b8798\",\r\n                      whiteSpace: \"nowrap\",\r\n                      fontVariantNumeric: \"tabular-nums\",\r\n                    }}\r\n                  >\r\n                    {fmtDuration(p.durationFmt, p.durationSeconds)}\r\n                  </Typography>\r\n                )}\r\n            </Box>\r\n          </Box>\r\n        );\r\n      })}\r\n    </Box>\r\n  );\r\n});\r\n\r\nfunction Timeline({\r\n  data,\r\n  label,\r\n  hoveredLeg,\r\n  onHoverLeg,\r\n}: {\r\n  data: ConferenceReportResponse;\r\n  label: (p: ConferenceParticipant) => string;\r\n  hoveredLeg: string | null;\r\n  onHoverLeg: (legUuid: string | null) => void;\r\n}) {\r\n  const layout = useMemo(() => buildLayout(data.participants), [data.participants]);\r\n  const { legs, t0, span, bands, ticks, concurrency } = layout;\r\n\r\n  const chartRef = useRef<HTMLDivElement | null>(null);\r\n  const trackRef = useRef<HTMLDivElement | null>(null);\r\n  const [hover, setHover] = useState<HoverState | null>(null);\r\n\r\n  const spanSec = span / 1000;\r\n\r\n  /* One listener on the whole chart rather than per-bar handlers, so the readout\r\n     never depends on which of the overlapping elements the cursor is over. The\r\n     hovered row comes from the cursor's Y rather than per-row enter/leave events,\r\n     which would flicker through `null` on every row boundary. */\r\n  const handleMove = (e: React.MouseEvent) => {\r\n    const track = trackRef.current;\r\n    const chart = chartRef.current;\r\n    if (!track || !chart) return;\r\n\r\n    const trackRect = track.getBoundingClientRect();\r\n    const x = e.clientX - trackRect.left;\r\n    if (x < 0 || x > trackRect.width || trackRect.width === 0) {\r\n      setHover(null);\r\n      onHoverLeg(null);\r\n      return;\r\n    }\r\n\r\n    const fraction = x / trackRect.width;\r\n    const at = t0 + fraction * span;\r\n\r\n    const cy = e.clientY - chart.getBoundingClientRect().top;\r\n    const rowIndex = Math.floor((cy - READOUT_H) / ROW_H);\r\n    const leg = rowIndex >= 0 && rowIndex < legs.length ? legs[rowIndex] : null;\r\n\r\n    onHoverLeg(leg ? leg.participant.legUuid : null);\r\n    setHover({\r\n      fraction,\r\n      at,\r\n      live: liveAt(concurrency, at),\r\n      segment: leg ? segmentAt(leg, at) : null,\r\n    });\r\n  };\r\n\r\n  const clearHover = () => {\r\n    setHover(null);\r\n    onHoverLeg(null);\r\n  };\r\n\r\n  return (\r\n    <Box sx={{ border: \"1px solid #e0e7ef\", borderRadius: \"8px\", bgcolor: \"#fff\", p: 1.5 }}>\r\n      {/* Legend only — the hover readout rides the crosshair line itself. */}\r\n      <Box\r\n        sx={{\r\n          display: \"flex\",\r\n          gap: 1.75,\r\n          flexWrap: \"wrap\",\r\n          alignItems: \"center\",\r\n          mb: 1.25,\r\n          minHeight: 24,\r\n        }}\r\n      >\r\n        <StatusDot label=\"Ringing\" swatch=\"ringing\" />\r\n        <StatusDot label=\"On call\" swatch=\"connected\" />\r\n        <StatusDot label=\"On hold\" swatch=\"hold\" />\r\n        <StatusDot label=\"Not answered\" swatch=\"unanswered\" />\r\n        <StatusDot label=\"Conference (2+ on call)\" swatch=\"band\" />\r\n\r\n        <Typography\r\n          sx={{ fontSize: \"0.65rem\", color: \"#a3aebc\", whiteSpace: \"nowrap\", ml: \"auto\" }}\r\n        >\r\n          hover the chart for a time readout\r\n        </Typography>\r\n      </Box>\r\n\r\n      <Box\r\n        ref={chartRef}\r\n        sx={{ position: \"relative\" }}\r\n        onMouseMove={handleMove}\r\n        onMouseLeave={clearHover}\r\n      >\r\n        {/* Gutter the crosshair pill sits in, so it never lands on top of a bar. */}\r\n        <Box sx={{ height: READOUT_H }} />\r\n\r\n        <TimelineRows\r\n          legs={legs}\r\n          t0={t0}\r\n          span={span}\r\n          bands={bands}\r\n          ticks={ticks}\r\n          label={label}\r\n          hoveredLeg={hoveredLeg}\r\n          onHoverLeg={onHoverLeg}\r\n        />\r\n\r\n        {/* Axis — also the element the crosshair measures against, since it spans\r\n            exactly the same width as every row's track. */}\r\n        <Box sx={{ display: \"flex\", mt: 0.5 }}>\r\n          <Box sx={{ width: LABEL_W, flexShrink: 0 }} />\r\n          <Box\r\n            ref={trackRef}\r\n            sx={{ position: \"relative\", flex: 1, height: 22, borderTop: \"1px solid #e0e7ef\" }}\r\n          >\r\n            {ticks.map((sec) => {\r\n              const left = (sec / spanSec) * 100;\r\n              if (left > 100) return null;\r\n              return (\r\n                <Box\r\n                  key={sec}\r\n                  sx={{\r\n                    position: \"absolute\",\r\n                    left: `${left}%`,\r\n                    top: 0,\r\n                    transform:\r\n                      left > 92 ? \"translateX(-100%)\" : left < 2 ? \"none\" : \"translateX(-50%)\",\r\n                  }}\r\n                >\r\n                  <Box sx={{ width: 1, height: 4, bgcolor: \"#cfd7e3\", mx: \"auto\" }} />\r\n                  <Typography\r\n                    sx={{\r\n                      fontSize: \"0.63rem\",\r\n                      color: \"#8b98a9\",\r\n                      fontVariantNumeric: \"tabular-nums\",\r\n                      whiteSpace: \"nowrap\",\r\n                    }}\r\n                  >\r\n                    {fmtOffset(sec)}\r\n                  </Typography>\r\n                </Box>\r\n              );\r\n            })}\r\n          </Box>\r\n        </Box>\r\n\r\n        {/* Crosshair — the line carries its own readout in the gutter above the\r\n            rows, so the time and live count follow the cursor without ever\r\n            covering a bar. */}\r\n        {hover && (\r\n          <Box\r\n            sx={{\r\n              position: \"absolute\",\r\n              left: LABEL_W,\r\n              right: 0,\r\n              top: 0,\r\n              bottom: 22,\r\n              pointerEvents: \"none\",\r\n            }}\r\n          >\r\n            <Box\r\n              sx={{\r\n                position: \"absolute\",\r\n                left: `${hover.fraction * 100}%`,\r\n                top: READOUT_H - 2,\r\n                bottom: 0,\r\n                borderLeft: \"1px solid rgba(21,101,200,0.55)\",\r\n              }}\r\n            >\r\n              <Box\r\n                sx={{\r\n                  position: \"absolute\",\r\n                  top: -(READOUT_H - 2),\r\n                  // Flips to the left of the line near the right edge so the pill\r\n                  // never runs off the chart.\r\n                  left: hover.fraction > 0.7 ? \"auto\" : 4,\r\n                  right: hover.fraction > 0.7 ? 4 : \"auto\",\r\n                  px: 0.8,\r\n                  py: 0.25,\r\n                  borderRadius: \"5px\",\r\n                  bgcolor: COLORS.navy,\r\n                  color: \"#fff\",\r\n                  fontSize: \"0.64rem\",\r\n                  fontWeight: 600,\r\n                  lineHeight: 1.5,\r\n                  whiteSpace: \"nowrap\",\r\n                  fontVariantNumeric: \"tabular-nums\",\r\n                }}\r\n              >\r\n                <Box component=\"span\" sx={{ opacity: 0.75 }}>\r\n                  {dayjs(hover.at).format(\"HH:mm:ss\")}\r\n                </Box>\r\n                {hover.segment ? (\r\n                  <>\r\n                    {\" · \"}\r\n                    <Box\r\n                      component=\"span\"\r\n                      sx={{\r\n                        display: \"inline-block\",\r\n                        width: 7,\r\n                        height: 7,\r\n                        borderRadius: \"2px\",\r\n                        bgcolor: hover.segment.tint,\r\n                        mr: 0.5,\r\n                        verticalAlign: \"middle\",\r\n                      }}\r\n                    />\r\n                    {hover.segment.name}\r\n                    <Box component=\"span\" sx={{ opacity: 0.75 }}>\r\n                      {\" \"}\r\n                      {hover.segment.detail}\r\n                    </Box>\r\n                  </>\r\n                ) : (\r\n                  <> · {hover.live} on call</>\r\n                )}\r\n              </Box>\r\n            </Box>\r\n          </Box>\r\n        )}\r\n      </Box>\r\n    </Box>\r\n  );\r\n}\r\n\r\n/* ── Detail table ─────────────────────────────────────────────────────────── */\r\n\r\nconst TH = {\r\n  fontSize: \"0.7rem\",\r\n  fontWeight: 700,\r\n  color: \"#5a6a7d\",\r\n  bgcolor: \"#f5f7fa\",\r\n  py: 0.7,\r\n  px: 1,\r\n  borderBottom: \"1px solid #e0e7ef\",\r\n  whiteSpace: \"nowrap\",\r\n} as const;\r\n\r\nconst TD = {\r\n  fontSize: \"0.73rem\",\r\n  color: \"#33455c\",\r\n  py: 0.6,\r\n  px: 1,\r\n  borderBottom: \"1px solid #eef1f6\",\r\n  whiteSpace: \"nowrap\",\r\n} as const;\r\n\r\nfunction ParticipantTable({\r\n  participants,\r\n  label,\r\n  hoveredLeg,\r\n  onHoverLeg,\r\n}: {\r\n  participants: ConferenceParticipant[];\r\n  label: (p: ConferenceParticipant) => string;\r\n  hoveredLeg: string | null;\r\n  onHoverLeg: (legUuid: string | null) => void;\r\n}) {\r\n  return (\r\n    <TableContainer sx={{ border: \"1px solid #e0e7ef\", borderRadius: \"8px\", bgcolor: \"#fff\" }}>\r\n      <Table size=\"small\" sx={{ \"& .MuiTableCell-root\": { fontFamily: FONT } }}>\r\n        <TableHead>\r\n          <TableRow>\r\n            {[\r\n              \"Line\",\r\n              \"Participant\",\r\n              \"Status\",\r\n              \"Joined\",\r\n              \"Answered\",\r\n              \"Left\",\r\n              \"Talk\",\r\n              \"Hold\",\r\n              \"Disposition\",\r\n            ].map((h) => (\r\n              <TableCell key={h} sx={TH}>\r\n                {h}\r\n              </TableCell>\r\n            ))}\r\n          </TableRow>\r\n        </TableHead>\r\n        <TableBody>\r\n          {participants.map((p, i) => (\r\n            <TableRow\r\n              key={p.legUuid}\r\n              hover\r\n              onMouseEnter={() => onHoverLeg(p.legUuid)}\r\n              onMouseLeave={() => onHoverLeg(null)}\r\n              sx={{\r\n                bgcolor: hoveredLeg === p.legUuid ? \"rgba(21,101,200,0.06)\" : \"transparent\",\r\n              }}\r\n            >\r\n              <TableCell sx={TD}>\r\n                <Box\r\n                  sx={{\r\n                    width: 18,\r\n                    height: 18,\r\n                    borderRadius: \"5px\",\r\n                    bgcolor: legHue(i),\r\n                    color: \"#fff\",\r\n                    fontSize: \"0.63rem\",\r\n                    fontWeight: 700,\r\n                    display: \"flex\",\r\n                    alignItems: \"center\",\r\n                    justifyContent: \"center\",\r\n                  }}\r\n                >\r\n                  {p.lineNumber ?? \"•\"}\r\n                </Box>\r\n              </TableCell>\r\n              <TableCell sx={{ ...TD, fontWeight: 600, color: COLORS.navy }}>\r\n                <span title={p.legUuid}>{label(p)}</span>\r\n              </TableCell>\r\n              <TableCell sx={TD}>\r\n                <LegStatusPill participant={p} />\r\n              </TableCell>\r\n              <TableCell sx={{ ...TD, fontVariantNumeric: \"tabular-nums\" }}>\r\n                {fmtClock(p.joinTime)}\r\n              </TableCell>\r\n              <TableCell sx={{ ...TD, fontVariantNumeric: \"tabular-nums\" }}>\r\n                {fmtClock(p.answerTime)}\r\n              </TableCell>\r\n              <TableCell sx={{ ...TD, fontVariantNumeric: \"tabular-nums\" }}>\r\n                {p.leaveTime ? fmtClock(p.leaveTime) : \"ongoing\"}\r\n              </TableCell>\r\n              <TableCell\r\n                sx={{\r\n                  ...TD,\r\n                  fontWeight: 600,\r\n                  color: COLORS.blue,\r\n                  fontVariantNumeric: \"tabular-nums\",\r\n                }}\r\n              >\r\n                {fmtDuration(p.durationFmt, p.durationSeconds)}\r\n              </TableCell>\r\n              <TableCell\r\n                sx={{\r\n                  ...TD,\r\n                  color: (p.holdDurationSeconds ?? 0) > 0 ? COLORS.amber : \"#8b98a9\",\r\n                  fontVariantNumeric: \"tabular-nums\",\r\n                }}\r\n              >\r\n                {fmtDuration(p.holdDurationFmt, p.holdDurationSeconds)}\r\n              </TableCell>\r\n              <TableCell sx={{ ...TD, textTransform: \"capitalize\" }}>\r\n                {p.legDisposition || \"\"}\r\n              </TableCell>\r\n            </TableRow>\r\n          ))}\r\n        </TableBody>\r\n      </Table>\r\n    </TableContainer>\r\n  );\r\n}\r\n\r\n/* ── Dialog ───────────────────────────────────────────────────────────────── */\r\n\r\nexport interface ConferenceTimelineDialogProps {\r\n  open: boolean;\r\n  onClose: () => void;\r\n  /** Call whose conference legs are shown. */\r\n  callUuid?: string;\r\n  /** Optional context for the header — the CDR row's customer number. */\r\n  phoneNumber?: string | null;\r\n  /** Optional context for the header — the agent who handled the call. */\r\n  agentName?: string | null;\r\n}\r\n\r\n/**\r\n * Conference detail for one CDR row: who was bridged in, when each leg joined,\r\n * connected and dropped, and the stretch where the call was genuinely multi-party.\r\n */\r\nexport default function ConferenceTimelineDialog({\r\n  open,\r\n  onClose,\r\n  callUuid,\r\n  phoneNumber,\r\n  agentName,\r\n}: ConferenceTimelineDialogProps) {\r\n  const { maskNumber } = useNumberMask();\r\n  const [data, setData] = useState<ConferenceReportResponse | null>(null);\r\n  const [loading, setLoading] = useState(false);\r\n  const [error, setError] = useState<string | null>(null);\r\n  /* Shared between the chart and the table below so hovering either one\r\n     highlights the same leg in both. */\r\n  const [hoveredLeg, setHoveredLeg] = useState<string | null>(null);\r\n\r\n  useEffect(() => {\r\n    setData(null);\r\n    setError(null);\r\n    if (!open || !callUuid) return;\r\n\r\n    let cancelled = false;\r\n    setLoading(true);\r\n\r\n    getConferenceReport(callUuid)\r\n      .then((res) => {\r\n        if (!cancelled) setData(res);\r\n      })\r\n      .catch((err: any) => {\r\n        if (cancelled) return;\r\n        // A call that never conferenced comes back 404 on some builds — that's an\r\n        // empty state, not a failure the user needs to act on.\r\n        if (err?.response?.status === 404) setData(null);\r\n        else\r\n          setError(\r\n            err?.response?.data?.message ??\r\n              err?.response?.data?.detail ??\r\n              err?.message ??\r\n              \"Failed to load conference details\",\r\n          );\r\n      })\r\n      .finally(() => {\r\n        if (!cancelled) setLoading(false);\r\n      });\r\n\r\n    return () => {\r\n      cancelled = true;\r\n    };\r\n  }, [open, callUuid]);\r\n\r\n  /* Participant identifiers are customer numbers — same masking rule as the grid. */\r\n  const label = (p: ConferenceParticipant): string => {\r\n    const name = (p.participantName ?? \"\").trim();\r\n    const ident = (p.participantIdentifier ?? \"\").trim();\r\n    return maskNumber(name || ident) || name || ident || \"Unknown\";\r\n  };\r\n\r\n  const participants = data?.participants ?? [];\r\n  const hasLegs = participants.length > 0;\r\n\r\n  const callWindow = useMemo(() => {\r\n    if (!hasLegs) return null;\r\n    const starts = participants\r\n      .map((p) => toMs(p.joinTime))\r\n      .filter((v): v is number => v != null);\r\n    const ends = participants\r\n      .map((p) => toMs(p.leaveTime))\r\n      .filter((v): v is number => v != null);\r\n    if (!starts.length) return null;\r\n    return {\r\n      from: Math.min(...starts),\r\n      to: ends.length ? Math.max(...ends) : null,\r\n    };\r\n  }, [participants, hasLegs]);\r\n\r\n  return (\r\n    <Dialog\r\n      open={open}\r\n      onClose={(_e, reason) => {\r\n        if (reason !== \"backdropClick\") onClose();\r\n      }}\r\n      fullWidth\r\n      maxWidth={false}\r\n      slotProps={{\r\n        paper: {\r\n          sx: {\r\n            width: \"min(1100px, 92vw)\",\r\n            maxHeight: \"88vh\",\r\n            borderRadius: \"10px\",\r\n            fontFamily: FONT,\r\n          },\r\n        },\r\n      }}\r\n    >\r\n      {/* Header */}\r\n      <Box\r\n        sx={{\r\n          px: 2.5,\r\n          py: 1.5,\r\n          display: \"flex\",\r\n          alignItems: \"flex-start\",\r\n          justifyContent: \"space-between\",\r\n          gap: 1,\r\n          borderBottom: \"1px solid #e0e7ef\",\r\n        }}\r\n      >\r\n        <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1.25, minWidth: 0 }}>\r\n          <Box\r\n            sx={{\r\n              width: 32,\r\n              height: 32,\r\n              borderRadius: \"8px\",\r\n              bgcolor: \"#e3eefa\",\r\n              color: COLORS.blue,\r\n              display: \"flex\",\r\n              alignItems: \"center\",\r\n              justifyContent: \"center\",\r\n              flexShrink: 0,\r\n            }}\r\n          >\r\n            <GroupsIcon sx={{ fontSize: 19 }} />\r\n          </Box>\r\n          <Box sx={{ minWidth: 0 }}>\r\n            <Typography\r\n              sx={{ fontFamily: FONT, fontWeight: 700, fontSize: \"1rem\", color: COLORS.navy }}\r\n            >\r\n              Conference Timeline\r\n            </Typography>\r\n            <Typography\r\n              sx={{\r\n                fontFamily: FONT,\r\n                fontSize: \"0.72rem\",\r\n                color: \"#7b8798\",\r\n                overflow: \"hidden\",\r\n                textOverflow: \"ellipsis\",\r\n                whiteSpace: \"nowrap\",\r\n              }}\r\n            >\r\n              {[\r\n                maskNumber(phoneNumber ?? \"\") || null,\r\n                agentName || null,\r\n                callUuid || null,\r\n              ]\r\n                .filter(Boolean)\r\n                .join(\"  ·  \")}\r\n            </Typography>\r\n          </Box>\r\n        </Box>\r\n        <IconButton\r\n          size=\"small\"\r\n          onClick={onClose}\r\n          sx={{ color: \"#7b8798\", flexShrink: 0 }}\r\n          title=\"Close\"\r\n        >\r\n          <CloseIcon sx={{ fontSize: 18 }} />\r\n        </IconButton>\r\n      </Box>\r\n\r\n      {/* Body */}\r\n      <Box sx={{ px: 2.5, py: 2, overflow: \"auto\", bgcolor: \"#fafbfc\" }}>\r\n        {loading && (\r\n          <Box sx={{ display: \"flex\", justifyContent: \"center\", py: 6 }}>\r\n            <CircularProgress size={30} sx={{ color: COLORS.blue }} />\r\n          </Box>\r\n        )}\r\n\r\n        {!loading && error && (\r\n          <Alert severity=\"error\" sx={{ fontFamily: FONT, fontSize: \"0.78rem\" }}>\r\n            {error}\r\n          </Alert>\r\n        )}\r\n\r\n        {!loading && !error && !hasLegs && (\r\n          <Box sx={{ textAlign: \"center\", py: 6 }}>\r\n            <GroupsIcon sx={{ fontSize: 34, color: \"#c6cfdb\" }} />\r\n            <Typography\r\n              sx={{ fontFamily: FONT, fontSize: \"0.82rem\", color: \"#7b8798\", mt: 1 }}\r\n            >\r\n              This call was never conferenced — no additional legs were bridged in.\r\n            </Typography>\r\n          </Box>\r\n        )}\r\n\r\n        {!loading && !error && hasLegs && data && (\r\n          <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: 2 }}>\r\n            {/* Summary */}\r\n            <Box sx={{ display: \"flex\", gap: 1.25, flexWrap: \"wrap\" }}>\r\n              <SummaryTile\r\n                label=\"Participants\"\r\n                value={String(data.participantCount || participants.length)}\r\n              />\r\n              <SummaryTile\r\n                label=\"Total duration\"\r\n                value={fmtDuration(data.totalDurationFmt, data.totalDurationSeconds)}\r\n              />\r\n              {callWindow && (\r\n                <SummaryTile\r\n                  label=\"Started\"\r\n                  value={dayjs(callWindow.from).format(\"HH:mm:ss\")}\r\n                />\r\n              )}\r\n              {callWindow?.to != null && (\r\n                <SummaryTile\r\n                  label=\"Ended\"\r\n                  value={dayjs(callWindow.to).format(\"HH:mm:ss\")}\r\n                />\r\n              )}\r\n              <SummaryTile\r\n                label=\"Date\"\r\n                value={callWindow ? dayjs(callWindow.from).format(\"DD MMM YYYY\") : \"\"}\r\n              />\r\n            </Box>\r\n\r\n            <Timeline\r\n              data={data}\r\n              label={label}\r\n              hoveredLeg={hoveredLeg}\r\n              onHoverLeg={setHoveredLeg}\r\n            />\r\n            <ParticipantTable\r\n              participants={participants}\r\n              label={label}\r\n              hoveredLeg={hoveredLeg}\r\n              onHoverLeg={setHoveredLeg}\r\n            />\r\n          </Box>\r\n        )}\r\n      </Box>\r\n    </Dialog>\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 11h-1.7c0 .74-.16 1.43-.43 2.05l1.23 1.23c.56-.98.9-2.09.9-3.28m-4.02.17c0-.06.02-.11.02-.17V5c0-1.66-1.34-3-3-3S9 3.34 9 5v.18zM4.27 3 3 4.27l6.01 6.01V11c0 1.66 1.33 3 2.99 3 .22 0 .44-.03.65-.08l1.66 1.66c-.71.33-1.5.52-2.31.52-2.76 0-5.3-2.1-5.3-5.1H5c0 3.41 2.72 6.23 6 6.72V21h2v-3.28c.91-.13 1.77-.45 2.54-.9L19.73 21 21 19.73z\"\n}), 'MicOff');","\"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 3h-4.18C14.4 1.84 13.3 1 12 1s-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2m-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1m2 14H7v-2h7zm3-4H7v-2h10zm0-4H7V7h10z\"\n}), 'Assignment');"],"mappings":"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","names":["_jsx","dayjs","_a","TimelineRows","_jsx"]}