{"version":3,"sources":["../src/components/ChatDrawer/ChatDrawer.tsx"],"names":["useCallback","jsxs","jsx","Icon"],"mappings":";;;;;;AA+DO,SAAS,UAAA,CAAW;AAAA,EACzB,IAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,QAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA,GAAgB,GAAA;AAAA,EAChB;AACF,CAAA,EAAoB;AAClB,EAAA,MAAM,YAAA,GAAeA,kBAAY,MAAM;AACrC,IAAA,QAAA,GAAW,CAAC,IAAI,CAAA;AAAA,EAClB,CAAA,EAAG,CAAC,QAAA,EAAU,IAAI,CAAC,CAAA;AAEnB,EAAA,uBACEC,eAAA,CAAC,SAAI,SAAA,EACH,QAAA,EAAA;AAAA,oBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uCAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,cAAA,CAAC,SAAI,SAAA,EAAU,qCAAA,EACZ,eAAK,GAAA,CAAI,CAAC,KAAK,CAAA,KAAM;AACpB,QAAA,MAAM,MAAA,GAAS,IAAI,EAAA,KAAO,WAAA;AAC1B,QAAA,MAAM,SAAS,GAAA,CAAI,MAAA,KAAW,OAAO,IAAA,GAAO,GAAA,CAAI,UAAU,CAAA,GAAI,CAAA;AAC9D,QAAA,uBACED,eAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA;AAAA,YACjC,SAAA,EAAW;AAAA,cACT,2GAAA;AAAA,cACA,SACI,4CAAA,GACA;AAAA,aACN,CAAE,KAAK,GAAG,CAAA;AAAA,YACV,cAAA,EAAc,MAAA;AAAA,YAEb,QAAA,EAAA;AAAA,cAAA,MAAA,KAAW,IAAA,oBACVC,cAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAW;AAAA,oBACT,wFAAA;AAAA,oBACA,SACI,wBAAA,GACA;AAAA,mBACN,CAAE,KAAK,GAAG,CAAA;AAAA,kBAET,QAAA,EAAA;AAAA;AAAA,eACH;AAAA,8BAEFA,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAA0B,cAAI,KAAA,EAAM;AAAA;AAAA,WAAA;AAAA,UAvB/C,GAAA,CAAI;AAAA,SAwBX;AAAA,MAEJ,CAAC,CAAA,EACH,CAAA;AAAA,sBACAA,cAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,YAAA;AAAA,UACT,YAAA,EAAY,OAAO,iBAAA,GAAoB,eAAA;AAAA,UACvC,eAAA,EAAe,IAAA;AAAA,UACf,SAAA,EAAU,qLAAA;AAAA,UAEV,QAAA,kBAAAA,cAAA;AAAA,YAACC,sBAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAM,OAAO,cAAA,GAAiB,YAAA;AAAA,cAC9B,SAAA,EAAU;AAAA;AAAA;AACZ;AAAA;AACF,KAAA,EACF,CAAA;AAAA,IAEC,IAAA,oBACCD,cAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,eAAA;AAAA,QACV,KAAA,EAAO,EAAE,SAAA,EAAW,aAAA,EAAc;AAAA,QAEjC;AAAA;AAAA;AACH,GAAA,EAEJ,CAAA;AAEJ","file":"chunk-HE3JJXIL.cjs","sourcesContent":["import { type ReactNode, useCallback } from \"react\";\nimport { Icon } from \"../Icon\";\n\n/**\n * ChatDrawer — tabbed, collapsible panel that sits *above* a `PromptInput`\n * (via the input's `aboveInput` slot) so the drawer and composer share one\n * rounded shell. Each tab gets a numbered chip and a content panel; only\n * one panel renders at a time.\n *\n *   <PromptInput\n *     aboveInput={\n *       <ChatDrawer\n *         tabs={[\n *           { id: \"files\",   label: \"Files\" },\n *           { id: \"tools\",   label: \"Chat Tools\" },\n *           { id: \"prompts\", label: \"Chat Prompts\" },\n *           { id: \"deal\",    label: \"IBM Analytics Platform\" },\n *         ]}\n *         activeTabId={tab}\n *         onTabChange={setTab}\n *         open={open}\n *         onToggle={setOpen}\n *       >\n *         {tab === \"tools\" && <ToolsGrid />}\n *         {tab === \"deal\"  && <DealCard />}\n *       </ChatDrawer>\n *     }\n *     budgetTokens={200_000}\n *     onSubmit={(text) => send(text)}\n *   />\n *\n * The drawer is purely presentational and slot-driven — you decide what\n * each tab shows. Tab order in the numbered chips is the order you pass.\n */\n\nexport type ChatDrawerTab = {\n  /** Stable id — used as the React key and as `activeTabId`. */\n  id: string;\n  /** Human label rendered on the chip. */\n  label: string;\n  /**\n   * Optional override for the numbered prefix (defaults to position +1).\n   * Set to `null` to hide the number entirely (e.g. for a context-specific\n   * tab like the deal one in the screenshots).\n   */\n  number?: number | null;\n};\n\nexport interface ChatDrawerProps {\n  tabs: ChatDrawerTab[];\n  activeTabId: string;\n  onTabChange: (id: string) => void;\n  /** Body open/closed. Default true. */\n  open?: boolean;\n  /** Called when the chevron is clicked. */\n  onToggle?: (open: boolean) => void;\n  /** Body content for the active tab. */\n  children?: ReactNode;\n  /** Min height of the body when open, in px. Default 140. */\n  minBodyHeight?: number;\n  className?: string;\n}\n\nexport function ChatDrawer({\n  tabs,\n  activeTabId,\n  onTabChange,\n  open = true,\n  onToggle,\n  children,\n  minBodyHeight = 140,\n  className,\n}: ChatDrawerProps) {\n  const handleToggle = useCallback(() => {\n    onToggle?.(!open);\n  }, [onToggle, open]);\n\n  return (\n    <div className={className}>\n      <div className=\"flex items-center gap-1.5 px-2.5 py-2\">\n        <div className=\"flex flex-wrap items-center gap-1.5\">\n          {tabs.map((tab, i) => {\n            const active = tab.id === activeTabId;\n            const number = tab.number === null ? null : tab.number ?? i + 1;\n            return (\n              <button\n                key={tab.id}\n                type=\"button\"\n                onClick={() => onTabChange(tab.id)}\n                className={[\n                  \"group inline-flex items-center gap-1.5 rounded-full border px-2.5 py-1 text-[12px] font-medium transition\",\n                  active\n                    ? \"border-violet-500 bg-violet-500 text-white\"\n                    : \"border-zinc-200 bg-transparent text-zinc-700 hover:border-zinc-300 hover:bg-zinc-50 dark:border-zinc-700 dark:text-zinc-300 dark:hover:border-zinc-600 dark:hover:bg-zinc-800\",\n                ].join(\" \")}\n                aria-pressed={active}\n              >\n                {number !== null && (\n                  <span\n                    className={[\n                      \"inline-flex h-4 w-4 items-center justify-center rounded-full text-[10px] font-semibold\",\n                      active\n                        ? \"bg-white/20 text-white\"\n                        : \"bg-zinc-200 text-zinc-600 group-hover:bg-zinc-300 dark:bg-zinc-700 dark:text-zinc-300\",\n                    ].join(\" \")}\n                  >\n                    {number}\n                  </span>\n                )}\n                <span className=\"truncate max-w-[180px]\">{tab.label}</span>\n              </button>\n            );\n          })}\n        </div>\n        <button\n          type=\"button\"\n          onClick={handleToggle}\n          aria-label={open ? \"Collapse drawer\" : \"Expand drawer\"}\n          aria-expanded={open}\n          className=\"ml-auto inline-flex h-6 w-6 items-center justify-center rounded-full text-zinc-400 transition hover:bg-zinc-100 hover:text-zinc-700 dark:hover:bg-zinc-800 dark:hover:text-zinc-200\"\n        >\n          <Icon\n            name={open ? \"chevron-down\" : \"chevron-up\"}\n            className=\"h-3.5 w-3.5\"\n          />\n        </button>\n      </div>\n\n      {open && (\n        <div\n          className=\"px-2.5 pb-2.5\"\n          style={{ minHeight: minBodyHeight }}\n        >\n          {children}\n        </div>\n      )}\n    </div>\n  );\n}\n"]}