{
  "name": "SessionPage",
  "package": "@magicblocksai/ui",
  "file": "packages/ui/src/components/SessionPage.tsx",
  "chapterTag": "16 Pipeline & CRM",
  "chapter": "16-app-pipeline.html",
  "sectionId": "session-page",
  "elName": "SessionPage",
  "demoUrl": "https://brand.magicblocks.ai/components/16-app-pipeline#session-page",
  "hasLiveDemo": false,
  "description": "A completed session — summary-led, consistent with the contact overview. A hero\n(identity · channel · agent · Goals chips · stat row), then the `<SessionSummaryBand>`,\nthen the transcript + per-message traces collapsed below. Composes the summary band\n(KeyFactGrid + MemoryList + HandoverOutcome) and `<MemoriesDialog>`; the transcript is\npassed in as a composed `<ChatTranscript>` so the page stays a thin shell.",
  "useClient": true,
  "interactivity": "interactive",
  "namedExports": [
    {
      "name": "SessionPage",
      "isPrincipal": true,
      "isType": false
    },
    {
      "name": "SessionPageProps",
      "isPrincipal": false,
      "isType": true
    },
    {
      "name": "SessionGoal",
      "isPrincipal": false,
      "isType": false
    },
    {
      "name": "SessionStat",
      "isPrincipal": false,
      "isType": false
    }
  ],
  "importStatement": "import { SessionPage } from \"@magicblocksai/ui\";",
  "props": [
    {
      "name": "contactName",
      "optional": false,
      "type": "ReactNode",
      "doc": ""
    },
    {
      "name": "initials",
      "optional": true,
      "type": "string",
      "doc": ""
    },
    {
      "name": "company",
      "optional": true,
      "type": "ReactNode",
      "doc": ""
    },
    {
      "name": "sentiment",
      "optional": true,
      "type": "SessionSentiment",
      "doc": ""
    },
    {
      "name": "channel",
      "optional": false,
      "type": "SessionChannel",
      "doc": ""
    },
    {
      "name": "agent",
      "optional": true,
      "type": "ReactNode",
      "doc": "\"Sage agent · v2.3\"."
    },
    {
      "name": "startedAt",
      "optional": true,
      "type": "ReactNode",
      "doc": ""
    },
    {
      "name": "sessionId",
      "optional": true,
      "type": "ReactNode",
      "doc": ""
    },
    {
      "name": "status",
      "optional": true,
      "type": "ReactNode; // outcome goals?: SessionGoal[]",
      "doc": "Status pill. Default \"Completed\"."
    },
    {
      "name": "stats",
      "optional": true,
      "type": "SessionStat[]; // mode /** `\"completed\"` (default) → summary-led. `\"live\"` → renders the `console` slot (a `<TakeoverConsole>`) in place of the summary band + transcript, under the same shared hero. */ mode?: \"completed\" | \"live\"",
      "doc": ""
    },
    {
      "name": "console",
      "optional": true,
      "type": "ReactNode; // summary band (completed mode) summary?: ReactNode",
      "doc": "Live-mode body — a composed `<TakeoverConsole>`. Shown when `mode=\"live\"`."
    },
    {
      "name": "summaryTag",
      "optional": true,
      "type": "ReactNode",
      "doc": ""
    },
    {
      "name": "keyFacts",
      "optional": true,
      "type": "KeyFact[]",
      "doc": ""
    },
    {
      "name": "memories",
      "optional": true,
      "type": "Memory[]",
      "doc": ""
    },
    {
      "name": "handover",
      "optional": true,
      "type": "OutcomeEvent[]; // transcript (a composed <ChatTranscript>, collapsed by default) transcript?: ReactNode",
      "doc": ""
    },
    {
      "name": "transcriptCount",
      "optional": true,
      "type": "ReactNode",
      "doc": ""
    },
    {
      "name": "transcriptOpen",
      "optional": true,
      "type": "boolean",
      "doc": ""
    },
    {
      "name": "defaultTranscriptOpen",
      "optional": true,
      "type": "boolean",
      "doc": ""
    },
    {
      "name": "onTranscriptToggle",
      "optional": true,
      "type": "(open: boolean) => void; // nav backHref?: string",
      "doc": ""
    },
    {
      "name": "onPrev",
      "optional": true,
      "type": "() => void",
      "doc": ""
    },
    {
      "name": "onNext",
      "optional": true,
      "type": "() => void",
      "doc": ""
    }
  ],
  "classesUsed": [
    "channel-chip",
    "session-page",
    "sp-avatar",
    "sp-back",
    "sp-band",
    "sp-company",
    "sp-goal",
    "sp-goals",
    "sp-goals-chips",
    "sp-goals-k",
    "sp-hero",
    "sp-hero-foot",
    "sp-hero-id",
    "sp-hero-top",
    "sp-meta",
    "sp-name",
    "sp-nav",
    "sp-navbtn",
    "sp-sdot",
    "sp-stat",
    "sp-stat-k",
    "sp-stat-v",
    "sp-stats",
    "sp-status",
    "sp-tcollapse",
    "sp-tcollapse-chevron",
    "sp-tcollapse-count",
    "sp-topbar",
    "sp-transcript",
    "sp-transcript-body",
    "ssb-expand"
  ],
  "examples": {
    "react": "<SessionPage\n  contactName=\"Sarah Kim\" initials=\"SK\" channel=\"webchat\"\n  agent=\"Sage agent · v2.3\" startedAt=\"Apr 28, 9:15 AM\"\n  goals={[{ id: \"g1\", label: \"Qualified\" }, { id: \"g2\", label: \"Meeting booked\" }]}\n  stats={[{ label: \"Duration\", value: \"4m 12s\" }, { label: \"Messages\", value: \"18\" }]}\n  summary=\"…\" keyFacts={facts} memories={memories} handover={handover}\n  transcript={<ChatTranscript>{messages}</ChatTranscript>} transcriptCount=\"18\"\n/>",
    "html": "<div class=\"session-page\" style=\"max-width:820px;\">\n  <div class=\"sp-topbar\"><a class=\"sp-back\" href=\"#sessions\">&lsaquo; Sessions</a><div class=\"sp-nav\"><button type=\"button\" class=\"sp-navbtn\">&lsaquo; Prev</button><button type=\"button\" class=\"sp-navbtn\">Next &rsaquo;</button></div></div>\n  <div class=\"sp-hero\">\n    <div class=\"sp-hero-top\">\n      <span class=\"sp-avatar\" aria-hidden=\"true\">SK</span>\n      <div class=\"sp-hero-id\">\n        <h2 class=\"sp-name\"><span class=\"sp-sdot\" data-sentiment=\"positive\" aria-hidden=\"true\"></span>Sarah Kim<span class=\"sp-company\"> &middot; Skyhook</span></h2>\n        <div class=\"sp-meta\"><span class=\"channel-chip\" data-channel=\"webchat\">Webchat</span><span>Sage agent &middot; v2.3</span><span>Apr 28, 9:15 AM</span><span>#S-4821</span></div>\n      </div>\n      <span class=\"sp-status\">Completed</span>\n    </div>\n    <div class=\"sp-hero-foot\">\n      <div class=\"sp-goals\"><div class=\"sp-goals-k\">Goals achieved</div><div class=\"sp-goals-chips\"><span class=\"sp-goal\">Qualified</span><span class=\"sp-goal\">Meeting booked</span></div></div>\n      <div class=\"sp-stats\"><div class=\"sp-stat\"><div class=\"sp-stat-k\">Duration</div><div class=\"sp-stat-v\">4m 12s</div></div><div class=\"sp-stat\"><div class=\"sp-stat-k\">Messages</div><div class=\"sp-stat-v\">18</div></div><div class=\"sp-stat\"><div class=\"sp-stat-k\">Sentiment</div><div class=\"sp-stat-v\">Positive</div></div></div>\n    </div>\n  </div>\n  <div class=\"session-summary-band sp-band\">\n    <div class=\"ssb-summary\">\n      <div class=\"ssb-summary-eb\">AI summary<span class=\"ssb-tag\">SAGE</span></div>\n      <p class=\"ssb-summary-text\">Sarah from Skyhook asked about 5-seat volume pricing for a CS team moving handoffs to Slack. Sage confirmed the Scale plan, qualified the use case, and booked a walkthrough.</p>\n    </div>\n    <div class=\"ssb-cards\">\n      <div class=\"ssb-card\">\n        <div class=\"ssb-card-eb\">Key facts</div>\n        <div class=\"key-fact-grid\" data-layout=\"list\">\n          <div class=\"kfg-row\"><span class=\"kfg-key\">seats</span><span class=\"kfg-val\">5</span></div>\n          <div class=\"kfg-row\"><span class=\"kfg-key\">plan</span><span class=\"kfg-val\">Scale</span></div>\n          <div class=\"kfg-row\"><span class=\"kfg-key\">handoff</span><span class=\"kfg-val\">Slack</span></div>\n        </div>\n      </div>\n      <div class=\"ssb-card\">\n        <div class=\"ssb-card-eb\">Memories</div>\n        <div class=\"memory-list\">\n          <div class=\"memory-row\"><div class=\"memory-body\"><div class=\"memory-text\">Prefers Slack for team handoffs</div><div class=\"memory-meta\"><span class=\"memory-source\">this session</span><span class=\"memory-conf\" data-conf=\"high\">high</span></div></div></div>\n          <div class=\"memory-row\"><div class=\"memory-body\"><div class=\"memory-text\">Evaluating for a 5-person CS team</div><div class=\"memory-meta\"><span class=\"memory-source\">this session</span><span class=\"memory-conf\" data-conf=\"high\">high</span></div></div></div>\n        </div>\n        <button type=\"button\" class=\"ssb-expand\">Expand all memories (5)</button>\n      </div>\n      <div class=\"ssb-card\">\n        <div class=\"ssb-card-eb\">Handover &amp; outcome</div>\n        <div class=\"handover-outcome\">\n          <div class=\"ho-row\" data-kind=\"webhook\"><span class=\"ho-ic\" aria-hidden=\"true\"></span><div class=\"ho-body\"><span class=\"ho-label\">CRM lead created</span><span class=\"ho-detail\">POST crm.acme.com/leads</span></div><span class=\"ho-status\">200</span></div>\n          <div class=\"ho-row\" data-kind=\"handover\"><span class=\"ho-ic\" aria-hidden=\"true\"></span><div class=\"ho-body\"><span class=\"ho-label\">Handed to journey block</span><span class=\"ho-detail\">Post-demo nurture</span></div></div>\n        </div>\n      </div>\n    </div>\n  </div>\n  <div class=\"sp-transcript\"><button type=\"button\" class=\"sp-tcollapse\" aria-expanded=\"false\"><span class=\"sp-tcollapse-chevron\" aria-hidden=\"true\"></span>Show transcript<span class=\"sp-tcollapse-count\">18</span></button></div>\n</div>",
    "css": ".channel-chip { display: inline-flex; align-items: center; gap: var(--s-1); font: 600 10px/1 var(--f-mono); text-transform: uppercase; letter-spacing: 0.04em; padding: 5px 9px; border-radius: var(--r-sm); background: var(--bg-sunk); color: var(--fg-dim); }\n\n.session-page { display: flex; flex-direction: column; gap: var(--s-4); }\n\n.sp-avatar { width: 44px; height: 44px; border-radius: 50%; flex: none; background: var(--accent-soft); color: var(--accent-text); display: inline-flex; align-items: center; justify-content: center; font: 700 15px var(--f-display); }\n\n.sp-back { font: 500 12px/1 var(--f-body); color: var(--fg-dim); text-decoration: none; }\n\n.sp-band { margin: 0; }\n\n.sp-company { font-weight: 400; color: var(--fg-faint); font-size: 14px; }\n\n.sp-goal { display: inline-flex; align-items: center; gap: 6px; font: 600 12px/1 var(--f-body); color: var(--success-text); background: var(--success-soft); border-radius: var(--r-pill); padding: 6px 11px; }\n\n.sp-goals { display: flex; flex-direction: column; }\n\n.sp-goals-chips { display: flex; gap: var(--s-2); flex-wrap: wrap; margin-top: 6px; }\n\n.sp-goals-k { font: 600 9.5px/1 var(--f-mono); text-transform: uppercase; letter-spacing: 0.05em; color: var(--fg-faint); }\n\n.sp-hero { position: relative; overflow: hidden; background: var(--bg-paper); border: 1px solid var(--hair); border-radius: var(--r-lg); padding: var(--s-5); box-shadow: var(--sh-1); }\n\n.sp-hero-foot { display: flex; align-items: center; gap: var(--s-5); flex-wrap: wrap; margin-top: var(--s-4); padding-top: var(--s-4); border-top: 1px solid var(--hair-soft); position: relative; }\n\n.sp-hero-id { min-width: 0; flex: 1; }\n\n.sp-hero-top { display: flex; align-items: flex-start; gap: var(--s-3); position: relative; }\n\n.sp-meta { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-1) var(--s-3); margin-top: 5px; font: 500 11.5px/1 var(--f-body); color: var(--fg-faint); }\n\n.sp-name { margin: 0; font: 700 17px/1.2 var(--f-display); color: var(--fg); display: flex; align-items: center; gap: var(--s-2); flex-wrap: wrap; }\n\n.sp-nav { margin-left: auto; display: flex; gap: var(--s-2); }\n\n.sp-navbtn { font: 500 12px/1 var(--f-body); color: var(--fg-dim); background: var(--bg-paper); border: 1px solid var(--hair); border-radius: var(--r-sm); padding: 6px 10px; cursor: pointer; }\n\n.sp-sdot { width: 8px; height: 8px; border-radius: 50%; flex: none; background: var(--fg-faint); }\n\n.sp-stat { display: flex; flex-direction: column; gap: 3px; }\n\n.sp-stat-k { font: 600 9.5px/1 var(--f-mono); text-transform: uppercase; letter-spacing: 0.05em; color: var(--fg-faint); }\n\n.sp-stat-v { font: 700 15px/1 var(--f-display); color: var(--fg); margin-top: 3px; }\n\n.sp-stats { margin-left: auto; display: flex; gap: var(--s-5); flex-wrap: wrap; }\n\n.sp-status { margin-left: auto; font: 600 11px/1 var(--f-mono); text-transform: uppercase; letter-spacing: 0.04em; background: var(--bg-sunk); color: var(--fg-dim); padding: 5px 10px; border-radius: var(--r-pill); white-space: nowrap; }\n\n.sp-tcollapse { display: flex; align-items: center; gap: var(--s-2); width: 100%; font: 600 13px/1 var(--f-body); color: var(--fg); background: var(--bg-warm); border: 1px solid var(--hair); border-radius: var(--r-lg); padding: var(--s-4); cursor: pointer; }\n\n.sp-tcollapse-chevron { width: 9px; height: 9px; flex: none; position: relative; color: var(--fg-faint); }\n\n.sp-tcollapse-count { margin-left: auto; font: 600 11px/1 var(--f-mono); color: var(--fg-faint); }\n\n.sp-topbar { display: flex; align-items: center; gap: var(--s-3); }\n\n.sp-transcript { display: flex; flex-direction: column; }\n\n.sp-transcript-body { margin-top: var(--s-3); }\n\n.ssb-expand { margin-top: var(--s-3); width: 100%; font: 600 11.5px/1 var(--f-body); color: var(--accent-text); background: var(--accent-soft); border: none; padding: 8px; border-radius: var(--r-sm); cursor: pointer; }"
  }
}
