@usetheo/ui 0.13.1 → 0.13.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/dist/{chunk-REFY5MLN.js → chunk-2NTEJRPA.js} +5 -5
  2. package/dist/{chunk-REFY5MLN.js.map → chunk-2NTEJRPA.js.map} +1 -1
  3. package/dist/{chunk-2EUKYGH5.js → chunk-357XIC2N.js} +3 -3
  4. package/dist/chunk-357XIC2N.js.map +1 -0
  5. package/dist/{chunk-RPZMFGYI.js → chunk-3YOPTHZH.js} +3 -3
  6. package/dist/{chunk-RPZMFGYI.js.map → chunk-3YOPTHZH.js.map} +1 -1
  7. package/dist/{chunk-KFUFTZLS.js → chunk-44ZNZZUS.js} +3 -3
  8. package/dist/{chunk-KFUFTZLS.js.map → chunk-44ZNZZUS.js.map} +1 -1
  9. package/dist/{chunk-PJUP4BJD.js → chunk-47IPOYLQ.js} +3 -3
  10. package/dist/{chunk-PJUP4BJD.js.map → chunk-47IPOYLQ.js.map} +1 -1
  11. package/dist/{chunk-OJPPSJMF.js → chunk-4XYFJIRC.js} +3 -3
  12. package/dist/{chunk-OJPPSJMF.js.map → chunk-4XYFJIRC.js.map} +1 -1
  13. package/dist/{chunk-SOJW47EZ.js → chunk-5YX76GH6.js} +3 -3
  14. package/dist/{chunk-SOJW47EZ.js.map → chunk-5YX76GH6.js.map} +1 -1
  15. package/dist/{chunk-7T4NK6W6.js → chunk-65YSFZAN.js} +3 -3
  16. package/dist/{chunk-7T4NK6W6.js.map → chunk-65YSFZAN.js.map} +1 -1
  17. package/dist/{chunk-3ZXZGZOX.js → chunk-6ORS6XOE.js} +3 -3
  18. package/dist/{chunk-3ZXZGZOX.js.map → chunk-6ORS6XOE.js.map} +1 -1
  19. package/dist/{chunk-2A3E5Y72.js → chunk-6V2LQEPT.js} +3 -3
  20. package/dist/{chunk-2A3E5Y72.js.map → chunk-6V2LQEPT.js.map} +1 -1
  21. package/dist/{chunk-5XCTTXC3.js → chunk-ACZNFEOZ.js} +3 -3
  22. package/dist/{chunk-5XCTTXC3.js.map → chunk-ACZNFEOZ.js.map} +1 -1
  23. package/dist/{chunk-GLEOUWPN.js → chunk-AJ2LNQUQ.js} +3 -3
  24. package/dist/{chunk-GLEOUWPN.js.map → chunk-AJ2LNQUQ.js.map} +1 -1
  25. package/dist/{chunk-SBKVVVYY.js → chunk-AX6P3SDS.js} +3 -3
  26. package/dist/{chunk-SBKVVVYY.js.map → chunk-AX6P3SDS.js.map} +1 -1
  27. package/dist/{chunk-VB53UMAL.js → chunk-B42EOFRD.js} +3 -3
  28. package/dist/{chunk-VB53UMAL.js.map → chunk-B42EOFRD.js.map} +1 -1
  29. package/dist/{chunk-GIXHBTHH.js → chunk-CFVSXYVT.js} +3 -3
  30. package/dist/{chunk-GIXHBTHH.js.map → chunk-CFVSXYVT.js.map} +1 -1
  31. package/dist/{chunk-KDE3NYTI.js → chunk-CX54TUTT.js} +3 -3
  32. package/dist/{chunk-KDE3NYTI.js.map → chunk-CX54TUTT.js.map} +1 -1
  33. package/dist/{chunk-BP4RQSX7.js → chunk-DJK6H3FD.js} +3 -3
  34. package/dist/{chunk-BP4RQSX7.js.map → chunk-DJK6H3FD.js.map} +1 -1
  35. package/dist/{chunk-4SMYNLTA.js → chunk-EOTSD2GL.js} +3 -3
  36. package/dist/{chunk-4SMYNLTA.js.map → chunk-EOTSD2GL.js.map} +1 -1
  37. package/dist/{chunk-YUFFAWNB.js → chunk-FELH4AAQ.js} +3 -3
  38. package/dist/{chunk-YUFFAWNB.js.map → chunk-FELH4AAQ.js.map} +1 -1
  39. package/dist/{chunk-NEMXW2LB.js → chunk-FM72LBCJ.js} +3 -3
  40. package/dist/{chunk-NEMXW2LB.js.map → chunk-FM72LBCJ.js.map} +1 -1
  41. package/dist/{chunk-VHTAVROO.js → chunk-FNQASFTK.js} +3 -3
  42. package/dist/{chunk-VHTAVROO.js.map → chunk-FNQASFTK.js.map} +1 -1
  43. package/dist/{chunk-Q2BAL2PF.js → chunk-FOE3XXBJ.js} +3 -3
  44. package/dist/{chunk-Q2BAL2PF.js.map → chunk-FOE3XXBJ.js.map} +1 -1
  45. package/dist/{chunk-7BGCWJQR.js → chunk-HKVOCYTN.js} +3 -3
  46. package/dist/{chunk-7BGCWJQR.js.map → chunk-HKVOCYTN.js.map} +1 -1
  47. package/dist/{chunk-JFKBFQA5.js → chunk-HNRFBJ25.js} +3 -3
  48. package/dist/{chunk-JFKBFQA5.js.map → chunk-HNRFBJ25.js.map} +1 -1
  49. package/dist/{chunk-QCQTTOMD.js → chunk-II5Q5RIO.js} +3 -3
  50. package/dist/{chunk-QCQTTOMD.js.map → chunk-II5Q5RIO.js.map} +1 -1
  51. package/dist/{chunk-QRXIYPWP.js → chunk-ITEIRMSH.js} +3 -3
  52. package/dist/{chunk-QRXIYPWP.js.map → chunk-ITEIRMSH.js.map} +1 -1
  53. package/dist/{chunk-JQTCCKZA.js → chunk-JP3SHERK.js} +3 -3
  54. package/dist/{chunk-JQTCCKZA.js.map → chunk-JP3SHERK.js.map} +1 -1
  55. package/dist/{chunk-VBEMLZGX.js → chunk-JS5T2CRO.js} +3 -3
  56. package/dist/{chunk-VBEMLZGX.js.map → chunk-JS5T2CRO.js.map} +1 -1
  57. package/dist/{chunk-VBQFE5RV.js → chunk-KXZH7BTX.js} +3 -3
  58. package/dist/{chunk-VBQFE5RV.js.map → chunk-KXZH7BTX.js.map} +1 -1
  59. package/dist/{chunk-MXB2GVEQ.js → chunk-LB4PMLCX.js} +3 -3
  60. package/dist/{chunk-MXB2GVEQ.js.map → chunk-LB4PMLCX.js.map} +1 -1
  61. package/dist/{chunk-CED2LKHI.js → chunk-LMGE2QEO.js} +3 -3
  62. package/dist/{chunk-CED2LKHI.js.map → chunk-LMGE2QEO.js.map} +1 -1
  63. package/dist/{chunk-PVCW4O37.js → chunk-MLEPCMTF.js} +3 -3
  64. package/dist/{chunk-PVCW4O37.js.map → chunk-MLEPCMTF.js.map} +1 -1
  65. package/dist/{chunk-H5QPJNVD.js → chunk-NSZEZTDO.js} +3 -3
  66. package/dist/{chunk-H5QPJNVD.js.map → chunk-NSZEZTDO.js.map} +1 -1
  67. package/dist/{chunk-AENNHS3S.js → chunk-QBSJM4XI.js} +3 -3
  68. package/dist/{chunk-AENNHS3S.js.map → chunk-QBSJM4XI.js.map} +1 -1
  69. package/dist/{chunk-XJA4B3F5.js → chunk-QCSMJTA6.js} +3 -3
  70. package/dist/{chunk-XJA4B3F5.js.map → chunk-QCSMJTA6.js.map} +1 -1
  71. package/dist/{chunk-G2WCT6PJ.js → chunk-QTG266XU.js} +3 -3
  72. package/dist/{chunk-G2WCT6PJ.js.map → chunk-QTG266XU.js.map} +1 -1
  73. package/dist/{chunk-RLWULF5B.js → chunk-RMJYXHBX.js} +3 -3
  74. package/dist/{chunk-RLWULF5B.js.map → chunk-RMJYXHBX.js.map} +1 -1
  75. package/dist/{chunk-P44UAK45.js → chunk-SPGNNN4R.js} +3 -3
  76. package/dist/{chunk-P44UAK45.js.map → chunk-SPGNNN4R.js.map} +1 -1
  77. package/dist/{chunk-CSEGVTKO.js → chunk-T4Z7HBZR.js} +3 -3
  78. package/dist/{chunk-CSEGVTKO.js.map → chunk-T4Z7HBZR.js.map} +1 -1
  79. package/dist/{chunk-PZGUZHI7.js → chunk-TW5I37AE.js} +3 -3
  80. package/dist/{chunk-PZGUZHI7.js.map → chunk-TW5I37AE.js.map} +1 -1
  81. package/dist/{chunk-AXNJFBYX.js → chunk-UJAWV6LM.js} +3 -3
  82. package/dist/{chunk-AXNJFBYX.js.map → chunk-UJAWV6LM.js.map} +1 -1
  83. package/dist/{chunk-4DTLUBRW.js → chunk-V2WCZBVE.js} +4 -4
  84. package/dist/{chunk-4DTLUBRW.js.map → chunk-V2WCZBVE.js.map} +1 -1
  85. package/dist/{chunk-YES6SPDT.js → chunk-V4LRBYOD.js} +3 -3
  86. package/dist/{chunk-YES6SPDT.js.map → chunk-V4LRBYOD.js.map} +1 -1
  87. package/dist/{chunk-4UBFLXS3.js → chunk-VFRFUU7A.js} +3 -3
  88. package/dist/{chunk-4UBFLXS3.js.map → chunk-VFRFUU7A.js.map} +1 -1
  89. package/dist/{chunk-BWIDDAR7.js → chunk-VLNFUEOR.js} +3 -3
  90. package/dist/{chunk-BWIDDAR7.js.map → chunk-VLNFUEOR.js.map} +1 -1
  91. package/dist/{chunk-ZJXOHLQE.js → chunk-VU7XKD4G.js} +3 -3
  92. package/dist/{chunk-ZJXOHLQE.js.map → chunk-VU7XKD4G.js.map} +1 -1
  93. package/dist/{chunk-V3HFDVZ3.js → chunk-W24RR5OD.js} +3 -3
  94. package/dist/{chunk-V3HFDVZ3.js.map → chunk-W24RR5OD.js.map} +1 -1
  95. package/dist/{chunk-A3OU6ICP.js → chunk-W743ORLA.js} +3 -3
  96. package/dist/{chunk-A3OU6ICP.js.map → chunk-W743ORLA.js.map} +1 -1
  97. package/dist/{chunk-TJLULCZW.js → chunk-WQVEJJV7.js} +3 -3
  98. package/dist/{chunk-TJLULCZW.js.map → chunk-WQVEJJV7.js.map} +1 -1
  99. package/dist/{chunk-ZAMPCRFJ.js → chunk-WX4Q4DTX.js} +3 -3
  100. package/dist/{chunk-ZAMPCRFJ.js.map → chunk-WX4Q4DTX.js.map} +1 -1
  101. package/dist/{chunk-U3AEEFVB.js → chunk-Y7JTBQUQ.js} +3 -3
  102. package/dist/{chunk-U3AEEFVB.js.map → chunk-Y7JTBQUQ.js.map} +1 -1
  103. package/dist/{chunk-K72DJOXR.js → chunk-ZAP4RIUL.js} +3 -3
  104. package/dist/{chunk-K72DJOXR.js.map → chunk-ZAP4RIUL.js.map} +1 -1
  105. package/dist/{chunk-BPJ3RN3U.js → chunk-ZEDDWVBB.js} +4 -4
  106. package/dist/{chunk-BPJ3RN3U.js.map → chunk-ZEDDWVBB.js.map} +1 -1
  107. package/dist/composites/agent-composer/index.js +2 -2
  108. package/dist/composites/agent-stream/index.js +8 -8
  109. package/dist/composites/agent-tool-renderer/index.js +5 -5
  110. package/dist/composites/approval-card/index.js +1 -1
  111. package/dist/composites/chat-composer/index.js +1 -1
  112. package/dist/composites/chat-message/index.js +6 -6
  113. package/dist/composites/choice-prompt/index.js +1 -1
  114. package/dist/composites/command-palette/index.js +2 -2
  115. package/dist/composites/confirm-dialog/index.js +2 -2
  116. package/dist/composites/confirm-prompt/index.js +1 -1
  117. package/dist/composites/cron-jobs-list/index.js +2 -2
  118. package/dist/composites/data-table/index.js +2 -2
  119. package/dist/composites/domain-config/index.js +1 -1
  120. package/dist/composites/env-var-editor/index.js +1 -1
  121. package/dist/composites/mcp-server-list/index.js +2 -2
  122. package/dist/composites/metric-card/index.js +2 -2
  123. package/dist/composites/multi-select-prompt/index.js +1 -1
  124. package/dist/composites/page-shell/index.js +3 -3
  125. package/dist/composites/permission-modal/index.js +2 -2
  126. package/dist/composites/preview-env-card/index.js +1 -1
  127. package/dist/composites/preview-panel/index.js +1 -1
  128. package/dist/composites/project-card/index.js +1 -1
  129. package/dist/composites/rollback-ui/index.js +1 -1
  130. package/dist/composites/skills-list/index.js +2 -2
  131. package/dist/composites/text-prompt/index.js +1 -1
  132. package/dist/index.js +53 -53
  133. package/dist/primitives/artifact-preview/index.js +1 -1
  134. package/dist/primitives/build-log-stream/index.js +1 -1
  135. package/dist/primitives/card/index.js +1 -1
  136. package/dist/primitives/channel-card/index.js +1 -1
  137. package/dist/primitives/cost-meter/index.js +1 -1
  138. package/dist/primitives/cron-job-card/index.js +1 -1
  139. package/dist/primitives/dialog/index.js +1 -1
  140. package/dist/primitives/diff-viewer/index.js +1 -1
  141. package/dist/primitives/empty-state/index.js +1 -1
  142. package/dist/primitives/folder-context-card/index.js +1 -1
  143. package/dist/primitives/hook-config/index.js +1 -1
  144. package/dist/primitives/hook-event-log/index.js +1 -1
  145. package/dist/primitives/mcp-server-card/index.js +1 -1
  146. package/dist/primitives/memory-editor/index.js +1 -1
  147. package/dist/primitives/metrics-panel/index.js +1 -1
  148. package/dist/primitives/model-card/index.js +1 -1
  149. package/dist/primitives/permission-matrix/index.js +1 -1
  150. package/dist/primitives/pin-input/index.js +1 -1
  151. package/dist/primitives/progress-checklist/index.js +1 -1
  152. package/dist/primitives/recent-folders-list/index.js +1 -1
  153. package/dist/primitives/running-tasks-panel/index.js +1 -1
  154. package/dist/primitives/session-timeline/index.js +1 -1
  155. package/dist/primitives/skill-card/index.js +1 -1
  156. package/dist/primitives/system-prompt-editor/index.js +1 -1
  157. package/dist/primitives/task-plan/index.js +1 -1
  158. package/dist/primitives/terminal-panel/index.js +1 -1
  159. package/dist/primitives/token-usage-chart/index.js +1 -1
  160. package/dist/primitives/tools-list/index.js +1 -1
  161. package/package.json +1 -1
  162. package/dist/chunk-2EUKYGH5.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/primitives/card/card.tsx"],"names":[],"mappings":";;;;;AAiCA,IAAM,WAAA,GAAc,aAAA,CAAgC,EAAE,IAAA,EAAM,MAAM,CAAA;AAElE,IAAM,WAAA,GAAc,MAAgB,UAAA,CAAW,WAAW,CAAA,CAAE,IAAA;AAM5D,IAAM,IAAA,GAAO,UAAA;AAAA,EACX,CAAC,EAAE,SAAA,EAAW,IAAA,GAAO,IAAA,EAAM,GAAG,KAAA,EAAM,EAAG,GAAA,qBACrC,GAAA,CAAC,YAAY,QAAA,EAAZ,EAAqB,KAAA,EAAO,EAAE,MAAK,EAClC,QAAA,kBAAA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,MAAA;AAAA,MACV,GAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,0DAAA;AAAA,QACA,+CAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN,EACF;AAEJ,CAAA;AACA,IAAA,CAAK,WAAA,GAAc,MAAA;AAEnB,IAAM,eAAA,GAA4C;AAAA,EAChD,EAAA,EAAI,kBAAA;AAAA,EACJ,EAAA,EAAI,oBAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,MAAA,GAAS,UAAA;AAAA,EACb,CAAC,EAAE,SAAA,EAAW,GAAG,KAAA,IAAS,GAAA,KAAQ;AAChC,IAAA,MAAM,OAAO,WAAA,EAAY;AACzB,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAU,aAAA;AAAA,QACV,GAAA;AAAA,QACA,WAAW,EAAA,CAAG,eAAA,EAAiB,eAAA,CAAgB,IAAI,GAAG,SAAS,CAAA;AAAA,QAC9D,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF,CAAA;AACA,MAAA,CAAO,WAAA,GAAc,aAAA;AAErB,IAAM,eAAA,GAA4C;AAAA,EAChD,EAAA,EAAI,eAAA;AAAA,EACJ,EAAA,EAAI,eAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAWA,IAAM,KAAA,GAAQ,UAAA;AAAA,EACZ,CAAC,EAAE,SAAA,EAAW,OAAA,GAAU,OAAO,GAAG,KAAA,IAAS,GAAA,KAAQ;AACjD,IAAA,MAAM,IAAA,GAAO,UAAU,IAAA,GAAO,IAAA;AAC9B,IAAA,MAAM,OAAO,WAAA,EAAY;AACzB,IAAA,uBACE,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAU,YAAA;AAAA,QACV,GAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,6CAAA;AAAA,UACA,gBAAgB,IAAI,CAAA;AAAA,UACpB;AAAA,SACF;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF,CAAA;AACA,KAAA,CAAM,WAAA,GAAc,YAAA;AAEpB,IAAM,WAAA,GAAc,UAAA;AAAA,EAClB,CAAC,EAAE,SAAA,EAAW,GAAG,KAAA,IAAS,GAAA,qBACxB,GAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,kBAAA;AAAA,MACV,GAAA;AAAA,MACA,SAAA,EAAW,EAAA,CAAG,oCAAA,EAAsC,SAAS,CAAA;AAAA,MAC5D,GAAG;AAAA;AAAA;AAGV,CAAA;AACA,WAAA,CAAY,WAAA,GAAc,kBAAA;AAE1B,IAAM,aAAA,GAA0C;AAAA,EAC9C,EAAA,EAAI,YAAA;AAAA,EACJ,EAAA,EAAI,YAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,IAAA,GAAO,UAAA;AAAA,EACX,CAAC,EAAE,SAAA,EAAW,GAAG,KAAA,IAAS,GAAA,KAAQ;AAChC,IAAA,MAAM,OAAO,WAAA,EAAY;AACzB,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAU,WAAA;AAAA,QACV,GAAA;AAAA,QACA,SAAA,EAAW,EAAA,CAAG,aAAA,CAAc,IAAI,GAAG,SAAS,CAAA;AAAA,QAC3C,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF,CAAA;AACA,IAAA,CAAK,WAAA,GAAc,WAAA;AAEnB,IAAM,eAAA,GAA4C;AAAA,EAChD,EAAA,EAAI,gBAAA;AAAA,EACJ,EAAA,EAAI,gBAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,MAAA,GAAS,UAAA;AAAA,EACb,CAAC,EAAE,SAAA,EAAW,GAAG,KAAA,IAAS,GAAA,KAAQ;AAChC,IAAA,MAAM,OAAO,WAAA,EAAY;AACzB,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAU,aAAA;AAAA,QACV,GAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,6CAAA;AAAA,UACA,gBAAgB,IAAI,CAAA;AAAA,UACpB;AAAA,SACF;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF,CAAA;AACA,MAAA,CAAO,WAAA,GAAc,aAAA;AAErB,IAAM,IAAA,mBAAqB,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM;AAAA,EAC7C,MAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAC","file":"chunk-AXNJFBYX.js","sourcesContent":["\"use client\";\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { createContext, forwardRef, useContext } from \"react\";\nimport type { HTMLAttributes } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\n/**\n * Card — surface container for grouping related content.\n *\n * Composition pattern (shadcn-style):\n * <Card>\n * <Card.Header>\n * <Card.Title>…</Card.Title>\n * <Card.Description>…</Card.Description>\n * </Card.Header>\n * <Card.Body>…</Card.Body>\n * <Card.Footer>…</Card.Footer>\n * </Card>\n *\n * The `size` prop on the root propagates to subparts via Context, so a\n * single declaration controls padding + heading scale across the compound.\n * Subparts used in isolation default to `md`. Subparts do NOT accept a `size`\n * prop of their own — use `className` for granular per-subpart tweaks.\n * (EC-8, edge-case review 2026-05-20.)\n */\n\ntype CardSize = \"sm\" | \"md\" | \"lg\";\n\ninterface CardContextValue {\n size: CardSize;\n}\n\nconst CardContext = createContext<CardContextValue>({ size: \"md\" });\n\nconst useCardSize = (): CardSize => useContext(CardContext).size;\n\ninterface CardRootProps extends HTMLAttributes<HTMLDivElement> {\n size?: CardSize;\n}\n\nconst Root = forwardRef<HTMLDivElement, CardRootProps>(\n ({ className, size = \"md\", ...props }, ref) => (\n <CardContext.Provider value={{ size }}>\n <div\n data-slot=\"card\"\n ref={ref}\n className={cn(\n \"rounded-xl border bg-card text-card-foreground shadow-md\",\n \"transition-shadow duration-base ease-out-soft\",\n className,\n )}\n {...props}\n />\n </CardContext.Provider>\n ),\n);\nRoot.displayName = \"Card\";\n\nconst headerPadBySize: Record<CardSize, string> = {\n sm: \"gap-1 p-3 pb-1.5\",\n md: \"gap-1.5 p-5 pb-2.5\",\n lg: \"gap-2 p-6 pb-3\",\n};\n\nconst Header = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => {\n const size = useCardSize();\n return (\n <div\n data-slot=\"card-header\"\n ref={ref}\n className={cn(\"flex flex-col\", headerPadBySize[size], className)}\n {...props}\n />\n );\n },\n);\nHeader.displayName = \"Card.Header\";\n\nconst titleFontBySize: Record<CardSize, string> = {\n sm: \"text-title-md\",\n md: \"text-title-lg\",\n lg: \"text-headline\",\n};\n\ninterface TitleProps extends HTMLAttributes<HTMLHeadingElement> {\n /**\n * When true, renders the child element with the Card.Title styles applied\n * (Radix Slot pattern). Use to swap the default `<h3>` for `<h1>` / `<h2>`\n * when the heading hierarchy requires it.\n */\n asChild?: boolean;\n}\n\nconst Title = forwardRef<HTMLHeadingElement, TitleProps>(\n ({ className, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"h3\";\n const size = useCardSize();\n return (\n <Comp\n data-slot=\"card-title\"\n ref={ref}\n className={cn(\n \"font-display text-foreground tracking-tight\",\n titleFontBySize[size],\n className,\n )}\n {...props}\n />\n );\n },\n);\nTitle.displayName = \"Card.Title\";\n\nconst Description = forwardRef<HTMLParagraphElement, HTMLAttributes<HTMLParagraphElement>>(\n ({ className, ...props }, ref) => (\n <p\n data-slot=\"card-description\"\n ref={ref}\n className={cn(\"text-body-sm text-muted-foreground\", className)}\n {...props}\n />\n ),\n);\nDescription.displayName = \"Card.Description\";\n\nconst bodyPadBySize: Record<CardSize, string> = {\n sm: \"p-3 pt-1.5\",\n md: \"p-5 pt-2.5\",\n lg: \"p-6 pt-3\",\n};\n\nconst Body = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => {\n const size = useCardSize();\n return (\n <div\n data-slot=\"card-body\"\n ref={ref}\n className={cn(bodyPadBySize[size], className)}\n {...props}\n />\n );\n },\n);\nBody.displayName = \"Card.Body\";\n\nconst footerPadBySize: Record<CardSize, string> = {\n sm: \"gap-2 p-3 pt-2\",\n md: \"gap-3 p-5 pt-3\",\n lg: \"gap-4 p-6 pt-4\",\n};\n\nconst Footer = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => {\n const size = useCardSize();\n return (\n <div\n data-slot=\"card-footer\"\n ref={ref}\n className={cn(\n \"flex items-center border-border/40 border-t\",\n footerPadBySize[size],\n className,\n )}\n {...props}\n />\n );\n },\n);\nFooter.displayName = \"Card.Footer\";\n\nconst Card = /*#__PURE__*/ Object.assign(Root, {\n Header,\n Title,\n Description,\n Body,\n Footer,\n});\n\nexport { Card };\n"]}
1
+ {"version":3,"sources":["../src/components/primitives/card/card.tsx"],"names":[],"mappings":"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","file":"chunk-UJAWV6LM.js","sourcesContent":["\"use client\";\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { createContext, forwardRef, useContext } from \"react\";\nimport type { HTMLAttributes } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\n/**\n * Card — surface container for grouping related content.\n *\n * Composition pattern (shadcn-style):\n * <Card>\n * <Card.Header>\n * <Card.Title>…</Card.Title>\n * <Card.Description>…</Card.Description>\n * </Card.Header>\n * <Card.Body>…</Card.Body>\n * <Card.Footer>…</Card.Footer>\n * </Card>\n *\n * The `size` prop on the root propagates to subparts via Context, so a\n * single declaration controls padding + heading scale across the compound.\n * Subparts used in isolation default to `md`. Subparts do NOT accept a `size`\n * prop of their own — use `className` for granular per-subpart tweaks.\n * (EC-8, edge-case review 2026-05-20.)\n */\n\ntype CardSize = \"sm\" | \"md\" | \"lg\";\n\ninterface CardContextValue {\n size: CardSize;\n}\n\nconst CardContext = createContext<CardContextValue>({ size: \"md\" });\n\nconst useCardSize = (): CardSize => useContext(CardContext).size;\n\ninterface CardRootProps extends HTMLAttributes<HTMLDivElement> {\n size?: CardSize;\n}\n\nconst Root = forwardRef<HTMLDivElement, CardRootProps>(\n ({ className, size = \"md\", ...props }, ref) => (\n <CardContext.Provider value={{ size }}>\n <div\n data-slot=\"card\"\n ref={ref}\n className={cn(\n \"rounded-xl border border-border bg-card text-card-foreground shadow-md\",\n \"transition-shadow duration-base ease-out-soft\",\n className,\n )}\n {...props}\n />\n </CardContext.Provider>\n ),\n);\nRoot.displayName = \"Card\";\n\nconst headerPadBySize: Record<CardSize, string> = {\n sm: \"gap-1 p-3 pb-1.5\",\n md: \"gap-1.5 p-5 pb-2.5\",\n lg: \"gap-2 p-6 pb-3\",\n};\n\nconst Header = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => {\n const size = useCardSize();\n return (\n <div\n data-slot=\"card-header\"\n ref={ref}\n className={cn(\"flex flex-col\", headerPadBySize[size], className)}\n {...props}\n />\n );\n },\n);\nHeader.displayName = \"Card.Header\";\n\nconst titleFontBySize: Record<CardSize, string> = {\n sm: \"text-title-md\",\n md: \"text-title-lg\",\n lg: \"text-headline\",\n};\n\ninterface TitleProps extends HTMLAttributes<HTMLHeadingElement> {\n /**\n * When true, renders the child element with the Card.Title styles applied\n * (Radix Slot pattern). Use to swap the default `<h3>` for `<h1>` / `<h2>`\n * when the heading hierarchy requires it.\n */\n asChild?: boolean;\n}\n\nconst Title = forwardRef<HTMLHeadingElement, TitleProps>(\n ({ className, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"h3\";\n const size = useCardSize();\n return (\n <Comp\n data-slot=\"card-title\"\n ref={ref}\n className={cn(\n \"font-display text-foreground tracking-tight\",\n titleFontBySize[size],\n className,\n )}\n {...props}\n />\n );\n },\n);\nTitle.displayName = \"Card.Title\";\n\nconst Description = forwardRef<HTMLParagraphElement, HTMLAttributes<HTMLParagraphElement>>(\n ({ className, ...props }, ref) => (\n <p\n data-slot=\"card-description\"\n ref={ref}\n className={cn(\"text-body-sm text-muted-foreground\", className)}\n {...props}\n />\n ),\n);\nDescription.displayName = \"Card.Description\";\n\nconst bodyPadBySize: Record<CardSize, string> = {\n sm: \"p-3 pt-1.5\",\n md: \"p-5 pt-2.5\",\n lg: \"p-6 pt-3\",\n};\n\nconst Body = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => {\n const size = useCardSize();\n return (\n <div\n data-slot=\"card-body\"\n ref={ref}\n className={cn(bodyPadBySize[size], className)}\n {...props}\n />\n );\n },\n);\nBody.displayName = \"Card.Body\";\n\nconst footerPadBySize: Record<CardSize, string> = {\n sm: \"gap-2 p-3 pt-2\",\n md: \"gap-3 p-5 pt-3\",\n lg: \"gap-4 p-6 pt-4\",\n};\n\nconst Footer = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => {\n const size = useCardSize();\n return (\n <div\n data-slot=\"card-footer\"\n ref={ref}\n className={cn(\n \"flex items-center border-border/40 border-t\",\n footerPadBySize[size],\n className,\n )}\n {...props}\n />\n );\n },\n);\nFooter.displayName = \"Card.Footer\";\n\nconst Card = /*#__PURE__*/ Object.assign(Root, {\n Header,\n Title,\n Description,\n Body,\n Footer,\n});\n\nexport { Card };\n"]}
@@ -1,5 +1,5 @@
1
- import { ApprovalCard } from './chunk-2EUKYGH5.js';
2
- import { ChatMessage } from './chunk-Q2BAL2PF.js';
1
+ import { ApprovalCard } from './chunk-357XIC2N.js';
2
+ import { ChatMessage } from './chunk-FOE3XXBJ.js';
3
3
  import { ToolCallCard } from './chunk-VZX4HLBM.js';
4
4
  import { AgentStreaming } from './chunk-YD2QEVHO.js';
5
5
  import { AgentErrorCard } from './chunk-W7I3ZX66.js';
@@ -118,5 +118,5 @@ function toAgentStreamItems(input, options = {}) {
118
118
  }
119
119
 
120
120
  export { AgentStream, mapAgentEventStatus, toAgentStreamItems };
121
- //# sourceMappingURL=chunk-4DTLUBRW.js.map
122
- //# sourceMappingURL=chunk-4DTLUBRW.js.map
121
+ //# sourceMappingURL=chunk-V2WCZBVE.js.map
122
+ //# sourceMappingURL=chunk-V2WCZBVE.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/composites/agent-stream/agent-stream.tsx","../src/components/composites/agent-stream/to-agent-stream-items.ts"],"names":[],"mappings":"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","file":"chunk-4DTLUBRW.js","sourcesContent":["import { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport { LiveRegionProvider } from \"../../../lib/live-region-context.js\";\nimport type { IconComponent } from \"../../../lib/types.js\";\nimport type { UIMessage } from \"../../../types/chat.js\";\nimport { AgentErrorCard, type AgentErrorKind } from \"../../primitives/agent-error-card/index.js\";\nimport { AgentStreaming } from \"../../primitives/agent-streaming/index.js\";\nimport { ToolCallCard, type ToolCallStatus } from \"../../primitives/tool-call-card/index.js\";\nimport { ApprovalCard, type ApprovalSeverity } from \"../approval-card/index.js\";\nimport { ChatMessage } from \"../chat-message/index.js\";\n\n/**\n * AgentStream — the canonical conversation surface for a code agent.\n *\n * Interleaves chat messages (user + assistant), tool invocations, approval\n * gates, errors, and the live streaming indicator. Mirrors how Claude Code\n * presents work to the user: conversation-centric, tool calls embedded,\n * approvals pause the flow inline, errors surface where they happen.\n *\n * Items are rendered in array order. The consumer fully controls the data;\n * AgentStream is a pure presentational composite over its child primitives.\n */\n\nexport interface ToolCallStreamItem {\n kind: \"tool-call\";\n id: string;\n tool: ReactNode;\n icon?: IconComponent;\n target?: ReactNode;\n status: ToolCallStatus;\n output?: ReactNode;\n defaultExpanded?: boolean;\n timestamp?: ReactNode;\n}\n\ninterface ApprovalStreamItem {\n kind: \"approval\";\n id: string;\n severity?: ApprovalSeverity;\n title: ReactNode;\n request: ReactNode;\n description?: ReactNode;\n details?: ReactNode;\n onApprove?: () => void;\n onDeny?: () => void;\n onAlways?: () => void;\n}\n\ninterface ErrorStreamItem {\n kind: \"error\";\n id: string;\n errorKind?: AgentErrorKind;\n title: ReactNode;\n detail?: ReactNode;\n actions?: ReactNode;\n timestamp?: ReactNode;\n}\n\ninterface StreamingStreamItem {\n kind: \"streaming\";\n id: string;\n model?: ReactNode;\n partial?: ReactNode;\n}\n\nexport interface MessageStreamItem {\n kind: \"message\";\n id: string;\n message: UIMessage;\n}\n\ninterface CustomStreamItem {\n kind: \"custom\";\n id: string;\n /** Arbitrary node — escape hatch for inline diff cards, etc. */\n node: ReactNode;\n}\n\nexport type AgentStreamItem =\n | MessageStreamItem\n | ToolCallStreamItem\n | ApprovalStreamItem\n | ErrorStreamItem\n | StreamingStreamItem\n | CustomStreamItem;\n\ninterface AgentStreamProps extends HTMLAttributes<HTMLDivElement> {\n items: AgentStreamItem[];\n}\n\nconst AgentStream = forwardRef<HTMLDivElement, AgentStreamProps>(\n ({ className, items, ...props }, ref) => (\n // T4.1 (MF-4): AgentStream is the canonical live region for the stream\n // surface. Wrap children in LiveRegionProvider so nested AgentStreaming,\n // AgentErrorCard, AutoCompactNotice, Skeleton, etc. don't declare their\n // own aria-live (which would cause double announcements).\n <LiveRegionProvider value={true}>\n <div\n data-slot=\"agent-stream\"\n ref={ref}\n role=\"log\"\n aria-live=\"polite\"\n aria-relevant=\"additions\"\n // MEDIUM-001: explicit aria-atomic=\"false\" so VoiceOver/macOS doesn't\n // reannounce the entire stream on each new item.\n aria-atomic=\"false\"\n className={cn(\"flex flex-col gap-3\", className)}\n {...props}\n >\n {items.map((item) => {\n if (item.kind === \"message\") return <ChatMessage key={item.id} message={item.message} />;\n if (item.kind === \"tool-call\")\n return (\n <ToolCallCard\n key={item.id}\n tool={item.tool}\n icon={item.icon}\n target={item.target}\n status={item.status}\n output={item.output}\n defaultExpanded={item.defaultExpanded}\n timestamp={item.timestamp}\n />\n );\n if (item.kind === \"approval\")\n return (\n <ApprovalCard\n key={item.id}\n severity={item.severity}\n title={item.title}\n request={item.request}\n description={item.description}\n details={item.details}\n onApprove={item.onApprove}\n onDeny={item.onDeny}\n onAlways={item.onAlways}\n />\n );\n if (item.kind === \"error\")\n return (\n <AgentErrorCard\n key={item.id}\n kind={item.errorKind}\n title={item.title}\n detail={item.detail}\n actions={item.actions}\n timestamp={item.timestamp}\n />\n );\n if (item.kind === \"streaming\")\n return <AgentStreaming key={item.id} model={item.model} partial={item.partial} />;\n if (item.kind === \"custom\") return <div key={item.id}>{item.node}</div>;\n return null;\n })}\n </div>\n </LiveRegionProvider>\n ),\n);\nAgentStream.displayName = \"AgentStream\";\n\nexport { AgentStream };\n","/**\n * `toAgentStreamItems` (M5-6) — a pure, order-aware builder that merges\n * historical `UIMessage`s with live `AgentEvent`s into the `AgentStreamItem[]`\n * that `<AgentStream>` renders.\n *\n * History (the conversation so far) becomes `message` items; live activity\n * (commands / file ops / lint / …) becomes `tool-call` items, in\n * history-then-live order (the caller owns chronology within each segment). A\n * `classifyTool` option customizes each tool-call item per event.\n *\n * Pure: no React, no hooks — imports types only.\n */\nimport type { AgentEvent, AgentEventStatus } from \"../../../types/agent.js\";\nimport type { UIMessage } from \"../../../types/chat.js\";\nimport type { ToolCallStatus } from \"../../primitives/tool-call-card/index.js\";\nimport type { AgentStreamItem, MessageStreamItem, ToolCallStreamItem } from \"./agent-stream.js\";\n\nconst STATUS_MAP: Record<AgentEventStatus, ToolCallStatus> = {\n pending: \"queued\",\n running: \"running\",\n success: \"success\",\n failed: \"failed\",\n};\n\n/** Map theo-ui's `AgentEventStatus` to the `ToolCallCard` `ToolCallStatus`. */\nexport function mapAgentEventStatus(status: AgentEventStatus): ToolCallStatus {\n return STATUS_MAP[status];\n}\n\n/** Fields of a tool-call item a `classifyTool` override may set (never the discriminant). */\nexport type ToolCallOverride = Partial<\n Pick<ToolCallStreamItem, \"tool\" | \"icon\" | \"target\" | \"output\" | \"defaultExpanded\" | \"timestamp\">\n>;\n\nexport interface ToAgentStreamItemsInput {\n /** Completed conversation turns, rendered first. */\n history?: UIMessage[];\n /** In-flight agent activity, rendered after history. */\n live?: AgentEvent[];\n}\n\nexport interface ToAgentStreamItemsOptions {\n /** Customize the tool-call item produced for each live event. */\n classifyTool?: (event: AgentEvent) => ToolCallOverride;\n}\n\nfunction toMessageItem(message: UIMessage): MessageStreamItem {\n return { kind: \"message\", id: message.id, message };\n}\n\nfunction toToolCallItem(\n event: AgentEvent,\n classifyTool?: (event: AgentEvent) => ToolCallOverride,\n): ToolCallStreamItem {\n const base: ToolCallStreamItem = {\n kind: \"tool-call\",\n id: event.id,\n tool: event.label,\n target: event.path,\n output: event.detail,\n status: mapAgentEventStatus(event.status),\n };\n const override = classifyTool?.(event);\n // Override may set presentational fields only; kind/id/status stay authoritative,\n // and an explicit `tool: undefined` must NOT blank the required label.\n return {\n ...base,\n ...override,\n kind: \"tool-call\",\n id: event.id,\n status: base.status,\n tool: override?.tool ?? base.tool,\n };\n}\n\n/** Build the ordered `AgentStreamItem[]` for `<AgentStream>`. Pure. */\nexport function toAgentStreamItems(\n input: ToAgentStreamItemsInput,\n options: ToAgentStreamItemsOptions = {},\n): AgentStreamItem[] {\n const history = (input.history ?? []).map(toMessageItem);\n const live = (input.live ?? []).map((event) => toToolCallItem(event, options.classifyTool));\n return [...history, ...live];\n}\n"]}
1
+ {"version":3,"sources":["../src/components/composites/agent-stream/agent-stream.tsx","../src/components/composites/agent-stream/to-agent-stream-items.ts"],"names":[],"mappings":"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","file":"chunk-V2WCZBVE.js","sourcesContent":["import { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport { LiveRegionProvider } from \"../../../lib/live-region-context.js\";\nimport type { IconComponent } from \"../../../lib/types.js\";\nimport type { UIMessage } from \"../../../types/chat.js\";\nimport { AgentErrorCard, type AgentErrorKind } from \"../../primitives/agent-error-card/index.js\";\nimport { AgentStreaming } from \"../../primitives/agent-streaming/index.js\";\nimport { ToolCallCard, type ToolCallStatus } from \"../../primitives/tool-call-card/index.js\";\nimport { ApprovalCard, type ApprovalSeverity } from \"../approval-card/index.js\";\nimport { ChatMessage } from \"../chat-message/index.js\";\n\n/**\n * AgentStream — the canonical conversation surface for a code agent.\n *\n * Interleaves chat messages (user + assistant), tool invocations, approval\n * gates, errors, and the live streaming indicator. Mirrors how Claude Code\n * presents work to the user: conversation-centric, tool calls embedded,\n * approvals pause the flow inline, errors surface where they happen.\n *\n * Items are rendered in array order. The consumer fully controls the data;\n * AgentStream is a pure presentational composite over its child primitives.\n */\n\nexport interface ToolCallStreamItem {\n kind: \"tool-call\";\n id: string;\n tool: ReactNode;\n icon?: IconComponent;\n target?: ReactNode;\n status: ToolCallStatus;\n output?: ReactNode;\n defaultExpanded?: boolean;\n timestamp?: ReactNode;\n}\n\ninterface ApprovalStreamItem {\n kind: \"approval\";\n id: string;\n severity?: ApprovalSeverity;\n title: ReactNode;\n request: ReactNode;\n description?: ReactNode;\n details?: ReactNode;\n onApprove?: () => void;\n onDeny?: () => void;\n onAlways?: () => void;\n}\n\ninterface ErrorStreamItem {\n kind: \"error\";\n id: string;\n errorKind?: AgentErrorKind;\n title: ReactNode;\n detail?: ReactNode;\n actions?: ReactNode;\n timestamp?: ReactNode;\n}\n\ninterface StreamingStreamItem {\n kind: \"streaming\";\n id: string;\n model?: ReactNode;\n partial?: ReactNode;\n}\n\nexport interface MessageStreamItem {\n kind: \"message\";\n id: string;\n message: UIMessage;\n}\n\ninterface CustomStreamItem {\n kind: \"custom\";\n id: string;\n /** Arbitrary node — escape hatch for inline diff cards, etc. */\n node: ReactNode;\n}\n\nexport type AgentStreamItem =\n | MessageStreamItem\n | ToolCallStreamItem\n | ApprovalStreamItem\n | ErrorStreamItem\n | StreamingStreamItem\n | CustomStreamItem;\n\ninterface AgentStreamProps extends HTMLAttributes<HTMLDivElement> {\n items: AgentStreamItem[];\n}\n\nconst AgentStream = forwardRef<HTMLDivElement, AgentStreamProps>(\n ({ className, items, ...props }, ref) => (\n // T4.1 (MF-4): AgentStream is the canonical live region for the stream\n // surface. Wrap children in LiveRegionProvider so nested AgentStreaming,\n // AgentErrorCard, AutoCompactNotice, Skeleton, etc. don't declare their\n // own aria-live (which would cause double announcements).\n <LiveRegionProvider value={true}>\n <div\n data-slot=\"agent-stream\"\n ref={ref}\n role=\"log\"\n aria-live=\"polite\"\n aria-relevant=\"additions\"\n // MEDIUM-001: explicit aria-atomic=\"false\" so VoiceOver/macOS doesn't\n // reannounce the entire stream on each new item.\n aria-atomic=\"false\"\n className={cn(\"flex flex-col gap-3\", className)}\n {...props}\n >\n {items.map((item) => {\n if (item.kind === \"message\") return <ChatMessage key={item.id} message={item.message} />;\n if (item.kind === \"tool-call\")\n return (\n <ToolCallCard\n key={item.id}\n tool={item.tool}\n icon={item.icon}\n target={item.target}\n status={item.status}\n output={item.output}\n defaultExpanded={item.defaultExpanded}\n timestamp={item.timestamp}\n />\n );\n if (item.kind === \"approval\")\n return (\n <ApprovalCard\n key={item.id}\n severity={item.severity}\n title={item.title}\n request={item.request}\n description={item.description}\n details={item.details}\n onApprove={item.onApprove}\n onDeny={item.onDeny}\n onAlways={item.onAlways}\n />\n );\n if (item.kind === \"error\")\n return (\n <AgentErrorCard\n key={item.id}\n kind={item.errorKind}\n title={item.title}\n detail={item.detail}\n actions={item.actions}\n timestamp={item.timestamp}\n />\n );\n if (item.kind === \"streaming\")\n return <AgentStreaming key={item.id} model={item.model} partial={item.partial} />;\n if (item.kind === \"custom\") return <div key={item.id}>{item.node}</div>;\n return null;\n })}\n </div>\n </LiveRegionProvider>\n ),\n);\nAgentStream.displayName = \"AgentStream\";\n\nexport { AgentStream };\n","/**\n * `toAgentStreamItems` (M5-6) — a pure, order-aware builder that merges\n * historical `UIMessage`s with live `AgentEvent`s into the `AgentStreamItem[]`\n * that `<AgentStream>` renders.\n *\n * History (the conversation so far) becomes `message` items; live activity\n * (commands / file ops / lint / …) becomes `tool-call` items, in\n * history-then-live order (the caller owns chronology within each segment). A\n * `classifyTool` option customizes each tool-call item per event.\n *\n * Pure: no React, no hooks — imports types only.\n */\nimport type { AgentEvent, AgentEventStatus } from \"../../../types/agent.js\";\nimport type { UIMessage } from \"../../../types/chat.js\";\nimport type { ToolCallStatus } from \"../../primitives/tool-call-card/index.js\";\nimport type { AgentStreamItem, MessageStreamItem, ToolCallStreamItem } from \"./agent-stream.js\";\n\nconst STATUS_MAP: Record<AgentEventStatus, ToolCallStatus> = {\n pending: \"queued\",\n running: \"running\",\n success: \"success\",\n failed: \"failed\",\n};\n\n/** Map theo-ui's `AgentEventStatus` to the `ToolCallCard` `ToolCallStatus`. */\nexport function mapAgentEventStatus(status: AgentEventStatus): ToolCallStatus {\n return STATUS_MAP[status];\n}\n\n/** Fields of a tool-call item a `classifyTool` override may set (never the discriminant). */\nexport type ToolCallOverride = Partial<\n Pick<ToolCallStreamItem, \"tool\" | \"icon\" | \"target\" | \"output\" | \"defaultExpanded\" | \"timestamp\">\n>;\n\nexport interface ToAgentStreamItemsInput {\n /** Completed conversation turns, rendered first. */\n history?: UIMessage[];\n /** In-flight agent activity, rendered after history. */\n live?: AgentEvent[];\n}\n\nexport interface ToAgentStreamItemsOptions {\n /** Customize the tool-call item produced for each live event. */\n classifyTool?: (event: AgentEvent) => ToolCallOverride;\n}\n\nfunction toMessageItem(message: UIMessage): MessageStreamItem {\n return { kind: \"message\", id: message.id, message };\n}\n\nfunction toToolCallItem(\n event: AgentEvent,\n classifyTool?: (event: AgentEvent) => ToolCallOverride,\n): ToolCallStreamItem {\n const base: ToolCallStreamItem = {\n kind: \"tool-call\",\n id: event.id,\n tool: event.label,\n target: event.path,\n output: event.detail,\n status: mapAgentEventStatus(event.status),\n };\n const override = classifyTool?.(event);\n // Override may set presentational fields only; kind/id/status stay authoritative,\n // and an explicit `tool: undefined` must NOT blank the required label.\n return {\n ...base,\n ...override,\n kind: \"tool-call\",\n id: event.id,\n status: base.status,\n tool: override?.tool ?? base.tool,\n };\n}\n\n/** Build the ordered `AgentStreamItem[]` for `<AgentStream>`. Pure. */\nexport function toAgentStreamItems(\n input: ToAgentStreamItemsInput,\n options: ToAgentStreamItemsOptions = {},\n): AgentStreamItem[] {\n const history = (input.history ?? []).map(toMessageItem);\n const live = (input.live ?? []).map((event) => toToolCallItem(event, options.classifyTool));\n return [...history, ...live];\n}\n"]}
@@ -9,7 +9,7 @@ var ArtifactPreview = forwardRef(
9
9
  {
10
10
  "data-slot": "artifact-preview",
11
11
  ref,
12
- className: cn("flex h-full flex-col overflow-hidden rounded-xl border bg-card", className),
12
+ className: cn("flex h-full flex-col overflow-hidden rounded-xl border border-border bg-card", className),
13
13
  ...props,
14
14
  children: [
15
15
  /* @__PURE__ */ jsxs("header", { className: "flex items-center gap-3 border-border/40 border-b px-3 py-2", children: [
@@ -51,5 +51,5 @@ function ToolbarButton({
51
51
  }
52
52
 
53
53
  export { ArtifactPreview };
54
- //# sourceMappingURL=chunk-YES6SPDT.js.map
55
- //# sourceMappingURL=chunk-YES6SPDT.js.map
54
+ //# sourceMappingURL=chunk-V4LRBYOD.js.map
55
+ //# sourceMappingURL=chunk-V4LRBYOD.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/primitives/artifact-preview/artifact-preview.tsx"],"names":[],"mappings":";;;;;AA4BA,IAAM,eAAA,GAAkB,UAAA;AAAA,EACtB,CACE,EAAE,SAAA,EAAW,KAAA,EAAO,QAAQ,IAAA,EAAM,OAAA,EAAS,UAAA,EAAY,SAAA,EAAW,OAAA,EAAS,QAAA,EAAU,GAAG,KAAA,IACxF,GAAA,qBAEA,IAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,kBAAA;AAAA,MACV,GAAA;AAAA,MACA,SAAA,EAAW,EAAA,CAAG,gEAAA,EAAkE,SAAS,CAAA;AAAA,MACxF,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,QAAA,EAAA,EAAO,WAAU,6DAAA,EAChB,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gBAAA,EACb,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mDAAA,EAAqD,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,YACvE,yBACC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qDAAA,EAAuD,kBAAO,CAAA,GACzE;AAAA,WAAA,EACN,CAAA;AAAA,UACC,OAAA,oBACC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACZ,QAAA,EAAA;AAAA,YAAA,SAAA,mBACC,GAAA,CAAC,aAAA,EAAA,EAAc,OAAA,EAAS,SAAA,EAAW,YAAA,EAAW,SAAA,EAC5C,QAAA,kBAAA,GAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,UAAA,EAAW,CAAA,EAClC,CAAA,GACE,IAAA;AAAA,YACH,UAAA,mBACC,GAAA,CAAC,aAAA,EAAA,EAAc,OAAA,EAAS,UAAA,EAAY,YAAA,EAAW,UAAA,EAC7C,QAAA,kBAAA,GAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,UAAA,EAAW,CAAA,EAClC,CAAA,GACE,IAAA;AAAA,YACH,OAAA,mBACC,GAAA,CAAC,aAAA,EAAA,EAAc,OAAA,EAAS,OAAA,EAAS,YAAA,EAAW,eAAA,EAC1C,QAAA,kBAAA,GAAA,CAAC,CAAA,EAAA,EAAE,SAAA,EAAU,UAAA,EAAW,CAAA,EAC1B,CAAA,GACE;AAAA,WAAA,EACN;AAAA,SAAA,EAEJ,CAAA;AAAA,wBACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAAwB,QAAA,EAAS,CAAA;AAAA,QAC/C,uBACC,GAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,6DAAA,EACf,gBACH,CAAA,GACE;AAAA;AAAA;AAAA;AAGV;AACA,eAAA,CAAgB,WAAA,GAAc,iBAAA;AAE9B,SAAS,aAAA,CAAc;AAAA,EACrB,OAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA,EAAc;AAChB,CAAA,EAIG;AACD,EAAA,uBACE,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA;AAAA,MACA,YAAA,EAAY,SAAA;AAAA,MACZ,SAAA,EAAW,EAAA;AAAA,QACT,+FAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ","file":"chunk-YES6SPDT.js","sourcesContent":["import { Maximize2, RefreshCw, X } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\ninterface ArtifactPreviewProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n title: ReactNode;\n /** Optional source/destination label (e.g. \"Google Drive\", \"Local · ~/reports\"). */\n source?: ReactNode;\n /**\n * Tabs at the bottom of the artifact (e.g. \"Expense Report | Currency Summary\").\n * Caller controls the active state externally.\n */\n tabs?: ReactNode;\n /** Top toolbar actions. Defaults to refresh + maximize + close. */\n toolbar?: ReactNode;\n onMaximize?: () => void;\n onRefresh?: () => void;\n onClose?: () => void;\n}\n\n/**\n * ArtifactPreview — shell for previewing a generated artifact (XLSX, PDF, image…).\n *\n * Renders a toolbar + content slot + optional bottom tabs. The actual preview\n * (spreadsheet, PDF embed, image) is the caller's `children`, so this stays\n * dependency-free.\n */\nconst ArtifactPreview = forwardRef<HTMLElement, ArtifactPreviewProps>(\n (\n { className, title, source, tabs, toolbar, onMaximize, onRefresh, onClose, children, ...props },\n ref,\n ) => (\n <section\n data-slot=\"artifact-preview\"\n ref={ref}\n className={cn(\"flex h-full flex-col overflow-hidden rounded-xl border bg-card\", className)}\n {...props}\n >\n <header className=\"flex items-center gap-3 border-border/40 border-b px-3 py-2\">\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate font-medium text-body-sm text-foreground\">{title}</p>\n {source ? (\n <p className=\"truncate font-mono text-label text-muted-foreground\">{source}</p>\n ) : null}\n </div>\n {toolbar ?? (\n <div className=\"flex items-center gap-1\">\n {onRefresh ? (\n <ToolbarButton onClick={onRefresh} aria-label=\"Refresh\">\n <RefreshCw className=\"size-3.5\" />\n </ToolbarButton>\n ) : null}\n {onMaximize ? (\n <ToolbarButton onClick={onMaximize} aria-label=\"Maximize\">\n <Maximize2 className=\"size-3.5\" />\n </ToolbarButton>\n ) : null}\n {onClose ? (\n <ToolbarButton onClick={onClose} aria-label=\"Close preview\">\n <X className=\"size-3.5\" />\n </ToolbarButton>\n ) : null}\n </div>\n )}\n </header>\n <div className=\"flex-1 overflow-auto\">{children}</div>\n {tabs ? (\n <footer className=\"flex items-center gap-1 border-border/40 border-t px-2 py-1\">\n {tabs}\n </footer>\n ) : null}\n </section>\n ),\n);\nArtifactPreview.displayName = \"ArtifactPreview\";\n\nfunction ToolbarButton({\n onClick,\n children,\n \"aria-label\": ariaLabel,\n}: {\n onClick?: () => void;\n children: ReactNode;\n \"aria-label\": string;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-label={ariaLabel}\n className={cn(\n \"rounded-md p-1.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n )}\n >\n {children}\n </button>\n );\n}\n\nexport { ArtifactPreview };\n"]}
1
+ {"version":3,"sources":["../src/components/primitives/artifact-preview/artifact-preview.tsx"],"names":[],"mappings":";;;;;AA4BA,IAAM,eAAA,GAAkB,UAAA;AAAA,EACtB,CACE,EAAE,SAAA,EAAW,KAAA,EAAO,QAAQ,IAAA,EAAM,OAAA,EAAS,UAAA,EAAY,SAAA,EAAW,OAAA,EAAS,QAAA,EAAU,GAAG,KAAA,IACxF,GAAA,qBAEA,IAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,kBAAA;AAAA,MACV,GAAA;AAAA,MACA,SAAA,EAAW,EAAA,CAAG,8EAAA,EAAgF,SAAS,CAAA;AAAA,MACtG,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,QAAA,EAAA,EAAO,WAAU,6DAAA,EAChB,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gBAAA,EACb,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mDAAA,EAAqD,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,YACvE,yBACC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qDAAA,EAAuD,kBAAO,CAAA,GACzE;AAAA,WAAA,EACN,CAAA;AAAA,UACC,OAAA,oBACC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACZ,QAAA,EAAA;AAAA,YAAA,SAAA,mBACC,GAAA,CAAC,aAAA,EAAA,EAAc,OAAA,EAAS,SAAA,EAAW,YAAA,EAAW,SAAA,EAC5C,QAAA,kBAAA,GAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,UAAA,EAAW,CAAA,EAClC,CAAA,GACE,IAAA;AAAA,YACH,UAAA,mBACC,GAAA,CAAC,aAAA,EAAA,EAAc,OAAA,EAAS,UAAA,EAAY,YAAA,EAAW,UAAA,EAC7C,QAAA,kBAAA,GAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,UAAA,EAAW,CAAA,EAClC,CAAA,GACE,IAAA;AAAA,YACH,OAAA,mBACC,GAAA,CAAC,aAAA,EAAA,EAAc,OAAA,EAAS,OAAA,EAAS,YAAA,EAAW,eAAA,EAC1C,QAAA,kBAAA,GAAA,CAAC,CAAA,EAAA,EAAE,SAAA,EAAU,UAAA,EAAW,CAAA,EAC1B,CAAA,GACE;AAAA,WAAA,EACN;AAAA,SAAA,EAEJ,CAAA;AAAA,wBACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAAwB,QAAA,EAAS,CAAA;AAAA,QAC/C,uBACC,GAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,6DAAA,EACf,gBACH,CAAA,GACE;AAAA;AAAA;AAAA;AAGV;AACA,eAAA,CAAgB,WAAA,GAAc,iBAAA;AAE9B,SAAS,aAAA,CAAc;AAAA,EACrB,OAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA,EAAc;AAChB,CAAA,EAIG;AACD,EAAA,uBACE,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA;AAAA,MACA,YAAA,EAAY,SAAA;AAAA,MACZ,SAAA,EAAW,EAAA;AAAA,QACT,+FAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ","file":"chunk-V4LRBYOD.js","sourcesContent":["import { Maximize2, RefreshCw, X } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\ninterface ArtifactPreviewProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n title: ReactNode;\n /** Optional source/destination label (e.g. \"Google Drive\", \"Local · ~/reports\"). */\n source?: ReactNode;\n /**\n * Tabs at the bottom of the artifact (e.g. \"Expense Report | Currency Summary\").\n * Caller controls the active state externally.\n */\n tabs?: ReactNode;\n /** Top toolbar actions. Defaults to refresh + maximize + close. */\n toolbar?: ReactNode;\n onMaximize?: () => void;\n onRefresh?: () => void;\n onClose?: () => void;\n}\n\n/**\n * ArtifactPreview — shell for previewing a generated artifact (XLSX, PDF, image…).\n *\n * Renders a toolbar + content slot + optional bottom tabs. The actual preview\n * (spreadsheet, PDF embed, image) is the caller's `children`, so this stays\n * dependency-free.\n */\nconst ArtifactPreview = forwardRef<HTMLElement, ArtifactPreviewProps>(\n (\n { className, title, source, tabs, toolbar, onMaximize, onRefresh, onClose, children, ...props },\n ref,\n ) => (\n <section\n data-slot=\"artifact-preview\"\n ref={ref}\n className={cn(\"flex h-full flex-col overflow-hidden rounded-xl border border-border bg-card\", className)}\n {...props}\n >\n <header className=\"flex items-center gap-3 border-border/40 border-b px-3 py-2\">\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate font-medium text-body-sm text-foreground\">{title}</p>\n {source ? (\n <p className=\"truncate font-mono text-label text-muted-foreground\">{source}</p>\n ) : null}\n </div>\n {toolbar ?? (\n <div className=\"flex items-center gap-1\">\n {onRefresh ? (\n <ToolbarButton onClick={onRefresh} aria-label=\"Refresh\">\n <RefreshCw className=\"size-3.5\" />\n </ToolbarButton>\n ) : null}\n {onMaximize ? (\n <ToolbarButton onClick={onMaximize} aria-label=\"Maximize\">\n <Maximize2 className=\"size-3.5\" />\n </ToolbarButton>\n ) : null}\n {onClose ? (\n <ToolbarButton onClick={onClose} aria-label=\"Close preview\">\n <X className=\"size-3.5\" />\n </ToolbarButton>\n ) : null}\n </div>\n )}\n </header>\n <div className=\"flex-1 overflow-auto\">{children}</div>\n {tabs ? (\n <footer className=\"flex items-center gap-1 border-border/40 border-t px-2 py-1\">\n {tabs}\n </footer>\n ) : null}\n </section>\n ),\n);\nArtifactPreview.displayName = \"ArtifactPreview\";\n\nfunction ToolbarButton({\n onClick,\n children,\n \"aria-label\": ariaLabel,\n}: {\n onClick?: () => void;\n children: ReactNode;\n \"aria-label\": string;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-label={ariaLabel}\n className={cn(\n \"rounded-md p-1.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n )}\n >\n {children}\n </button>\n );\n}\n\nexport { ArtifactPreview };\n"]}
@@ -9,7 +9,7 @@ var PreviewPanel = forwardRef(
9
9
  {
10
10
  "data-slot": "preview-panel",
11
11
  ref,
12
- className: cn("flex h-full flex-col overflow-hidden rounded-xl border bg-card", className),
12
+ className: cn("flex h-full flex-col overflow-hidden rounded-xl border border-border bg-card", className),
13
13
  ...props,
14
14
  children: [
15
15
  /* @__PURE__ */ jsx(
@@ -31,5 +31,5 @@ var PreviewPanel = forwardRef(
31
31
  PreviewPanel.displayName = "PreviewPanel";
32
32
 
33
33
  export { PreviewPanel };
34
- //# sourceMappingURL=chunk-4UBFLXS3.js.map
35
- //# sourceMappingURL=chunk-4UBFLXS3.js.map
34
+ //# sourceMappingURL=chunk-VFRFUU7A.js.map
35
+ //# sourceMappingURL=chunk-VFRFUU7A.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/composites/preview-panel/preview-panel.tsx"],"names":[],"mappings":";;;;;AA2BA,IAAM,YAAA,GAAe,UAAA;AAAA,EACnB,CACE,EAAE,SAAA,EAAW,GAAA,EAAK,WAAA,EAAa,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAU,OAAA,EAAS,QAAA,EAAU,GAAG,KAAA,IAClF,GAAA,qBAEA,IAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,eAAA;AAAA,MACV,GAAA;AAAA,MACA,SAAA,EAAW,EAAA,CAAG,gEAAA,EAAkE,SAAS,CAAA;AAAA,MACxF,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,eAAA;AAAA,UAAA;AAAA,YACC,GAAA;AAAA,YACC,GAAI,WAAA,GAAc,EAAE,WAAA,KAAgB,EAAC;AAAA,YACrC,GAAI,MAAA,GAAS,EAAE,MAAA,KAAW,EAAC;AAAA,YAC3B,GAAI,SAAA,GAAY,EAAE,SAAA,KAAc,EAAC;AAAA,YACjC,GAAI,QAAA,GAAW,EAAE,QAAA,KAAa;AAAC;AAAA,SAClC;AAAA,wBACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCAAA,EAAwC,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,QAC9D,2BACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0DAAA,EAA4D,oBAAS,CAAA,GAClF;AAAA;AAAA;AAAA;AAGV;AACA,YAAA,CAAa,WAAA,GAAc,cAAA","file":"chunk-4UBFLXS3.js","sourcesContent":["import { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport { BrowserControls } from \"../../primitives/browser-controls/index.js\";\n\ninterface PreviewPanelProps extends Omit<HTMLAttributes<HTMLElement>, \"content\"> {\n url: string;\n onUrlChange?: (next: string) => void;\n onBack?: () => void;\n onForward?: () => void;\n onReload?: () => void;\n /**\n * Region rendered as the preview body. Typically an <iframe>.\n */\n content: ReactNode;\n /**\n * Optional logs section rendered below the preview (e.g. dev server output).\n */\n logsSlot?: ReactNode;\n}\n\n/**\n * PreviewPanel — browser preview with controls + integrated logs slot.\n *\n * The Code workspace shows live dev-server URL + HMR logs side-by-side; this\n * panel keeps both in a single card so the user doesn't switch contexts.\n */\nconst PreviewPanel = forwardRef<HTMLElement, PreviewPanelProps>(\n (\n { className, url, onUrlChange, onBack, onForward, onReload, content, logsSlot, ...props },\n ref,\n ) => (\n <section\n data-slot=\"preview-panel\"\n ref={ref}\n className={cn(\"flex h-full flex-col overflow-hidden rounded-xl border bg-card\", className)}\n {...props}\n >\n <BrowserControls\n url={url}\n {...(onUrlChange ? { onUrlChange } : {})}\n {...(onBack ? { onBack } : {})}\n {...(onForward ? { onForward } : {})}\n {...(onReload ? { onReload } : {})}\n />\n <div className=\"flex-1 overflow-hidden bg-background\">{content}</div>\n {logsSlot ? (\n <div className=\"max-h-48 overflow-auto border-border/40 border-t bg-card\">{logsSlot}</div>\n ) : null}\n </section>\n ),\n);\nPreviewPanel.displayName = \"PreviewPanel\";\n\nexport { PreviewPanel };\n"]}
1
+ {"version":3,"sources":["../src/components/composites/preview-panel/preview-panel.tsx"],"names":[],"mappings":";;;;;AA2BA,IAAM,YAAA,GAAe,UAAA;AAAA,EACnB,CACE,EAAE,SAAA,EAAW,GAAA,EAAK,WAAA,EAAa,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAU,OAAA,EAAS,QAAA,EAAU,GAAG,KAAA,IAClF,GAAA,qBAEA,IAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,eAAA;AAAA,MACV,GAAA;AAAA,MACA,SAAA,EAAW,EAAA,CAAG,8EAAA,EAAgF,SAAS,CAAA;AAAA,MACtG,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,eAAA;AAAA,UAAA;AAAA,YACC,GAAA;AAAA,YACC,GAAI,WAAA,GAAc,EAAE,WAAA,KAAgB,EAAC;AAAA,YACrC,GAAI,MAAA,GAAS,EAAE,MAAA,KAAW,EAAC;AAAA,YAC3B,GAAI,SAAA,GAAY,EAAE,SAAA,KAAc,EAAC;AAAA,YACjC,GAAI,QAAA,GAAW,EAAE,QAAA,KAAa;AAAC;AAAA,SAClC;AAAA,wBACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCAAA,EAAwC,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,QAC9D,2BACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0DAAA,EAA4D,oBAAS,CAAA,GAClF;AAAA;AAAA;AAAA;AAGV;AACA,YAAA,CAAa,WAAA,GAAc,cAAA","file":"chunk-VFRFUU7A.js","sourcesContent":["import { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport { BrowserControls } from \"../../primitives/browser-controls/index.js\";\n\ninterface PreviewPanelProps extends Omit<HTMLAttributes<HTMLElement>, \"content\"> {\n url: string;\n onUrlChange?: (next: string) => void;\n onBack?: () => void;\n onForward?: () => void;\n onReload?: () => void;\n /**\n * Region rendered as the preview body. Typically an <iframe>.\n */\n content: ReactNode;\n /**\n * Optional logs section rendered below the preview (e.g. dev server output).\n */\n logsSlot?: ReactNode;\n}\n\n/**\n * PreviewPanel — browser preview with controls + integrated logs slot.\n *\n * The Code workspace shows live dev-server URL + HMR logs side-by-side; this\n * panel keeps both in a single card so the user doesn't switch contexts.\n */\nconst PreviewPanel = forwardRef<HTMLElement, PreviewPanelProps>(\n (\n { className, url, onUrlChange, onBack, onForward, onReload, content, logsSlot, ...props },\n ref,\n ) => (\n <section\n data-slot=\"preview-panel\"\n ref={ref}\n className={cn(\"flex h-full flex-col overflow-hidden rounded-xl border border-border bg-card\", className)}\n {...props}\n >\n <BrowserControls\n url={url}\n {...(onUrlChange ? { onUrlChange } : {})}\n {...(onBack ? { onBack } : {})}\n {...(onForward ? { onForward } : {})}\n {...(onReload ? { onReload } : {})}\n />\n <div className=\"flex-1 overflow-hidden bg-background\">{content}</div>\n {logsSlot ? (\n <div className=\"max-h-48 overflow-auto border-border/40 border-t bg-card\">{logsSlot}</div>\n ) : null}\n </section>\n ),\n);\nPreviewPanel.displayName = \"PreviewPanel\";\n\nexport { PreviewPanel };\n"]}
@@ -21,7 +21,7 @@ var SkillCard = forwardRef(
21
21
  "data-slot": "skill-card",
22
22
  ref,
23
23
  className: cn(
24
- "grid gap-3 rounded-xl border bg-card p-4",
24
+ "grid gap-3 rounded-xl border border-border bg-card p-4",
25
25
  !enabled && "opacity-60",
26
26
  className
27
27
  ),
@@ -82,5 +82,5 @@ var SkillCard = forwardRef(
82
82
  SkillCard.displayName = "SkillCard";
83
83
 
84
84
  export { SkillCard };
85
- //# sourceMappingURL=chunk-BWIDDAR7.js.map
86
- //# sourceMappingURL=chunk-BWIDDAR7.js.map
85
+ //# sourceMappingURL=chunk-VLNFUEOR.js.map
86
+ //# sourceMappingURL=chunk-VLNFUEOR.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/primitives/skill-card/skill-card.tsx"],"names":[],"mappings":"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","file":"chunk-BWIDDAR7.js","sourcesContent":["import { BookOpen, Sparkles, User, Users } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport type { IconComponent } from \"../../../lib/types.js\";\nimport type { Mode } from \"../../../types/mode.js\";\n\nexport type SkillSource = \"builtin\" | \"project\" | \"user\" | \"plugin\";\nexport type SkillState = \"enabled\" | \"disabled\";\n\nconst SOURCE_CONFIG: Record<SkillSource, { label: string; icon: IconComponent; tone: string }> = {\n builtin: { label: \"Built-in\", icon: Sparkles, tone: \"text-primary\" },\n project: { label: \"Project\", icon: BookOpen, tone: \"text-accent\" },\n user: { label: \"User\", icon: User, tone: \"text-info\" },\n plugin: { label: \"Plugin\", icon: Users, tone: \"text-muted-foreground\" },\n};\n\nexport interface Skill {\n id: string;\n name: string;\n description?: ReactNode;\n /** Where the skill comes from. */\n source: SkillSource;\n /** Optional tools the skill is allowed to use (informational). */\n allowedTools?: string[];\n /** Optional trigger keywords / patterns for discovery. */\n triggers?: string[];\n state?: SkillState;\n /** Modes this skill is visible in. Omit / empty = global (all modes). */\n modes?: Mode[];\n}\n\ninterface SkillCardProps extends Omit<HTMLAttributes<HTMLDivElement>, \"onToggle\"> {\n skill: Skill;\n onToggle?: (id: string, next: SkillState) => void;\n}\n\n/**\n * SkillCard — single skill entry showing what it does, where it came from,\n * and which tools it needs. Toggle to enable/disable for the current session.\n */\nconst SkillCard = forwardRef<HTMLDivElement, SkillCardProps>(\n ({ className, skill, onToggle, ...props }, ref) => {\n const config = SOURCE_CONFIG[skill.source];\n const Icon = config.icon;\n const state = skill.state ?? \"enabled\";\n const enabled = state === \"enabled\";\n return (\n <article\n data-slot=\"skill-card\"\n ref={ref}\n className={cn(\n \"grid gap-3 rounded-xl border bg-card p-4\",\n !enabled && \"opacity-60\",\n className,\n )}\n {...props}\n >\n <header className=\"flex items-start justify-between gap-3\">\n <div className=\"flex items-center gap-2\">\n <span className={cn(\"grid size-8 place-items-center rounded-md bg-muted\", config.tone)}>\n <Icon className=\"size-4\" aria-hidden=\"true\" />\n </span>\n <div className=\"grid\">\n <h4 className=\"font-medium font-mono text-body-sm text-foreground\">{skill.name}</h4>\n <span className=\"font-mono text-label-caps text-muted-foreground uppercase tracking-wider\">\n {config.label}\n </span>\n </div>\n </div>\n {onToggle ? (\n <button\n type=\"button\"\n onClick={() => onToggle(skill.id, enabled ? \"disabled\" : \"enabled\")}\n aria-pressed={enabled}\n className={cn(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5\",\n \"font-mono text-label uppercase tracking-wider transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n enabled\n ? \"border-success/40 bg-success/15 text-success\"\n : \"border-border/40 bg-muted text-muted-foreground\",\n )}\n >\n {enabled ? \"Enabled\" : \"Disabled\"}\n </button>\n ) : null}\n </header>\n {skill.description ? (\n <p className=\"text-body-sm text-muted-foreground\">{skill.description}</p>\n ) : null}\n {skill.allowedTools && skill.allowedTools.length > 0 ? (\n <div className=\"flex flex-wrap gap-1.5\">\n <span className=\"font-mono text-label text-muted-foreground uppercase tracking-wider\">\n tools:\n </span>\n {skill.allowedTools.map((tool) => (\n <span\n key={tool}\n className=\"inline-flex items-center rounded-md bg-muted px-2 py-0.5 font-mono text-foreground text-label\"\n >\n {tool}\n </span>\n ))}\n </div>\n ) : null}\n {skill.triggers && skill.triggers.length > 0 ? (\n <div className=\"flex flex-wrap gap-1.5\">\n <span className=\"font-mono text-label text-muted-foreground uppercase tracking-wider\">\n triggers:\n </span>\n {skill.triggers.map((trigger) => (\n <span\n key={trigger}\n className=\"inline-flex items-center rounded-md bg-primary/10 px-2 py-0.5 font-mono text-label text-primary\"\n >\n {trigger}\n </span>\n ))}\n </div>\n ) : null}\n </article>\n );\n },\n);\nSkillCard.displayName = \"SkillCard\";\n\nexport { SkillCard };\n"]}
1
+ {"version":3,"sources":["../src/components/primitives/skill-card/skill-card.tsx"],"names":[],"mappings":"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","file":"chunk-VLNFUEOR.js","sourcesContent":["import { BookOpen, Sparkles, User, Users } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport type { IconComponent } from \"../../../lib/types.js\";\nimport type { Mode } from \"../../../types/mode.js\";\n\nexport type SkillSource = \"builtin\" | \"project\" | \"user\" | \"plugin\";\nexport type SkillState = \"enabled\" | \"disabled\";\n\nconst SOURCE_CONFIG: Record<SkillSource, { label: string; icon: IconComponent; tone: string }> = {\n builtin: { label: \"Built-in\", icon: Sparkles, tone: \"text-primary\" },\n project: { label: \"Project\", icon: BookOpen, tone: \"text-accent\" },\n user: { label: \"User\", icon: User, tone: \"text-info\" },\n plugin: { label: \"Plugin\", icon: Users, tone: \"text-muted-foreground\" },\n};\n\nexport interface Skill {\n id: string;\n name: string;\n description?: ReactNode;\n /** Where the skill comes from. */\n source: SkillSource;\n /** Optional tools the skill is allowed to use (informational). */\n allowedTools?: string[];\n /** Optional trigger keywords / patterns for discovery. */\n triggers?: string[];\n state?: SkillState;\n /** Modes this skill is visible in. Omit / empty = global (all modes). */\n modes?: Mode[];\n}\n\ninterface SkillCardProps extends Omit<HTMLAttributes<HTMLDivElement>, \"onToggle\"> {\n skill: Skill;\n onToggle?: (id: string, next: SkillState) => void;\n}\n\n/**\n * SkillCard — single skill entry showing what it does, where it came from,\n * and which tools it needs. Toggle to enable/disable for the current session.\n */\nconst SkillCard = forwardRef<HTMLDivElement, SkillCardProps>(\n ({ className, skill, onToggle, ...props }, ref) => {\n const config = SOURCE_CONFIG[skill.source];\n const Icon = config.icon;\n const state = skill.state ?? \"enabled\";\n const enabled = state === \"enabled\";\n return (\n <article\n data-slot=\"skill-card\"\n ref={ref}\n className={cn(\n \"grid gap-3 rounded-xl border border-border bg-card p-4\",\n !enabled && \"opacity-60\",\n className,\n )}\n {...props}\n >\n <header className=\"flex items-start justify-between gap-3\">\n <div className=\"flex items-center gap-2\">\n <span className={cn(\"grid size-8 place-items-center rounded-md bg-muted\", config.tone)}>\n <Icon className=\"size-4\" aria-hidden=\"true\" />\n </span>\n <div className=\"grid\">\n <h4 className=\"font-medium font-mono text-body-sm text-foreground\">{skill.name}</h4>\n <span className=\"font-mono text-label-caps text-muted-foreground uppercase tracking-wider\">\n {config.label}\n </span>\n </div>\n </div>\n {onToggle ? (\n <button\n type=\"button\"\n onClick={() => onToggle(skill.id, enabled ? \"disabled\" : \"enabled\")}\n aria-pressed={enabled}\n className={cn(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5\",\n \"font-mono text-label uppercase tracking-wider transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n enabled\n ? \"border-success/40 bg-success/15 text-success\"\n : \"border-border/40 bg-muted text-muted-foreground\",\n )}\n >\n {enabled ? \"Enabled\" : \"Disabled\"}\n </button>\n ) : null}\n </header>\n {skill.description ? (\n <p className=\"text-body-sm text-muted-foreground\">{skill.description}</p>\n ) : null}\n {skill.allowedTools && skill.allowedTools.length > 0 ? (\n <div className=\"flex flex-wrap gap-1.5\">\n <span className=\"font-mono text-label text-muted-foreground uppercase tracking-wider\">\n tools:\n </span>\n {skill.allowedTools.map((tool) => (\n <span\n key={tool}\n className=\"inline-flex items-center rounded-md bg-muted px-2 py-0.5 font-mono text-foreground text-label\"\n >\n {tool}\n </span>\n ))}\n </div>\n ) : null}\n {skill.triggers && skill.triggers.length > 0 ? (\n <div className=\"flex flex-wrap gap-1.5\">\n <span className=\"font-mono text-label text-muted-foreground uppercase tracking-wider\">\n triggers:\n </span>\n {skill.triggers.map((trigger) => (\n <span\n key={trigger}\n className=\"inline-flex items-center rounded-md bg-primary/10 px-2 py-0.5 font-mono text-label text-primary\"\n >\n {trigger}\n </span>\n ))}\n </div>\n ) : null}\n </article>\n );\n },\n);\nSkillCard.displayName = \"SkillCard\";\n\nexport { SkillCard };\n"]}
@@ -14,7 +14,7 @@ var HookEventLog = forwardRef(
14
14
  {
15
15
  "data-slot": "hook-event-log",
16
16
  ref,
17
- className: cn("rounded-xl border bg-card", className),
17
+ className: cn("rounded-xl border border-border bg-card", className),
18
18
  ...props,
19
19
  children: [
20
20
  /* @__PURE__ */ jsxs("header", { className: "flex items-baseline justify-between border-border/40 border-b px-4 py-3", children: [
@@ -62,5 +62,5 @@ var HookEventLog = forwardRef(
62
62
  HookEventLog.displayName = "HookEventLog";
63
63
 
64
64
  export { HookEventLog };
65
- //# sourceMappingURL=chunk-ZJXOHLQE.js.map
66
- //# sourceMappingURL=chunk-ZJXOHLQE.js.map
65
+ //# sourceMappingURL=chunk-VU7XKD4G.js.map
66
+ //# sourceMappingURL=chunk-VU7XKD4G.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/primitives/hook-event-log/hook-event-log.tsx"],"names":[],"mappings":"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","file":"chunk-ZJXOHLQE.js","sourcesContent":["import { CheckCircle2, CircleX, ShieldAlert } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\nexport type HookEventResult = \"ok\" | \"blocked\" | \"error\";\n\nexport interface HookEventEntry {\n id: string;\n /** Hook event (e.g. PreToolUse). */\n event: string;\n /** Hook matcher (e.g. Bash). */\n matcher: string;\n /** What the hook command was. */\n command: string;\n result: HookEventResult;\n timestamp: string;\n /** Optional stderr/stdout snippet. */\n output?: string;\n /** Optional duration label, e.g. \"120ms\". */\n duration?: string;\n}\n\ninterface HookEventLogProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n events: HookEventEntry[];\n title?: ReactNode;\n}\n\nconst RESULT_CONFIG = {\n ok: { icon: CheckCircle2, color: \"text-success\" },\n blocked: { icon: ShieldAlert, color: \"text-warning\" },\n error: { icon: CircleX, color: \"text-destructive\" },\n} as const;\n\n/**\n * HookEventLog — chronological list of hook firings, with result tone, the\n * command that ran, and an optional output preview.\n */\nconst HookEventLog = forwardRef<HTMLDivElement, HookEventLogProps>(\n ({ className, events, title = \"Hook log\", ...props }, ref) => (\n <section\n data-slot=\"hook-event-log\"\n ref={ref}\n className={cn(\"rounded-xl border bg-card\", className)}\n {...props}\n >\n <header className=\"flex items-baseline justify-between border-border/40 border-b px-4 py-3\">\n <h3 className=\"font-display text-title-md tracking-tight\">{title}</h3>\n <span className=\"font-mono text-label text-muted-foreground\">\n {events.length} {events.length === 1 ? \"event\" : \"events\"}\n </span>\n </header>\n <ol className=\"divide-y divide-border/30\">\n {events.map((evt) => {\n const cfg = RESULT_CONFIG[evt.result];\n const Icon = cfg.icon;\n return (\n <li\n key={evt.id}\n className=\"grid grid-cols-[auto_1fr_auto] items-start gap-3 px-4 py-2.5\"\n >\n <Icon aria-hidden=\"true\" className={cn(\"mt-0.5 size-3.5 shrink-0\", cfg.color)} />\n <div className=\"min-w-0\">\n <p className=\"flex flex-wrap items-baseline gap-2\">\n <span className=\"font-mono text-code-sm text-primary\">{evt.event}</span>\n <span className=\"font-mono text-code-sm text-muted-foreground\">\n matcher={evt.matcher}\n </span>\n {evt.duration ? (\n <span className=\"font-mono text-label text-muted-foreground tabular-nums\">\n {evt.duration}\n </span>\n ) : null}\n </p>\n <p className=\"truncate font-mono text-code-sm text-foreground\">{evt.command}</p>\n {evt.output ? (\n <pre className=\"mt-1 max-h-24 overflow-auto rounded-md bg-muted/60 px-2 py-1 font-mono text-code-sm text-muted-foreground\">\n {evt.output}\n </pre>\n ) : null}\n </div>\n <span className=\"font-mono text-label text-muted-foreground tabular-nums\">\n {evt.timestamp}\n </span>\n </li>\n );\n })}\n {events.length === 0 ? (\n <li className=\"px-4 py-8 text-center font-sans text-body-sm text-muted-foreground\">\n No hooks have fired yet.\n </li>\n ) : null}\n </ol>\n </section>\n ),\n);\nHookEventLog.displayName = \"HookEventLog\";\n\nexport { HookEventLog };\n"]}
1
+ {"version":3,"sources":["../src/components/primitives/hook-event-log/hook-event-log.tsx"],"names":[],"mappings":"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","file":"chunk-VU7XKD4G.js","sourcesContent":["import { CheckCircle2, CircleX, ShieldAlert } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\nexport type HookEventResult = \"ok\" | \"blocked\" | \"error\";\n\nexport interface HookEventEntry {\n id: string;\n /** Hook event (e.g. PreToolUse). */\n event: string;\n /** Hook matcher (e.g. Bash). */\n matcher: string;\n /** What the hook command was. */\n command: string;\n result: HookEventResult;\n timestamp: string;\n /** Optional stderr/stdout snippet. */\n output?: string;\n /** Optional duration label, e.g. \"120ms\". */\n duration?: string;\n}\n\ninterface HookEventLogProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n events: HookEventEntry[];\n title?: ReactNode;\n}\n\nconst RESULT_CONFIG = {\n ok: { icon: CheckCircle2, color: \"text-success\" },\n blocked: { icon: ShieldAlert, color: \"text-warning\" },\n error: { icon: CircleX, color: \"text-destructive\" },\n} as const;\n\n/**\n * HookEventLog — chronological list of hook firings, with result tone, the\n * command that ran, and an optional output preview.\n */\nconst HookEventLog = forwardRef<HTMLDivElement, HookEventLogProps>(\n ({ className, events, title = \"Hook log\", ...props }, ref) => (\n <section\n data-slot=\"hook-event-log\"\n ref={ref}\n className={cn(\"rounded-xl border border-border bg-card\", className)}\n {...props}\n >\n <header className=\"flex items-baseline justify-between border-border/40 border-b px-4 py-3\">\n <h3 className=\"font-display text-title-md tracking-tight\">{title}</h3>\n <span className=\"font-mono text-label text-muted-foreground\">\n {events.length} {events.length === 1 ? \"event\" : \"events\"}\n </span>\n </header>\n <ol className=\"divide-y divide-border/30\">\n {events.map((evt) => {\n const cfg = RESULT_CONFIG[evt.result];\n const Icon = cfg.icon;\n return (\n <li\n key={evt.id}\n className=\"grid grid-cols-[auto_1fr_auto] items-start gap-3 px-4 py-2.5\"\n >\n <Icon aria-hidden=\"true\" className={cn(\"mt-0.5 size-3.5 shrink-0\", cfg.color)} />\n <div className=\"min-w-0\">\n <p className=\"flex flex-wrap items-baseline gap-2\">\n <span className=\"font-mono text-code-sm text-primary\">{evt.event}</span>\n <span className=\"font-mono text-code-sm text-muted-foreground\">\n matcher={evt.matcher}\n </span>\n {evt.duration ? (\n <span className=\"font-mono text-label text-muted-foreground tabular-nums\">\n {evt.duration}\n </span>\n ) : null}\n </p>\n <p className=\"truncate font-mono text-code-sm text-foreground\">{evt.command}</p>\n {evt.output ? (\n <pre className=\"mt-1 max-h-24 overflow-auto rounded-md bg-muted/60 px-2 py-1 font-mono text-code-sm text-muted-foreground\">\n {evt.output}\n </pre>\n ) : null}\n </div>\n <span className=\"font-mono text-label text-muted-foreground tabular-nums\">\n {evt.timestamp}\n </span>\n </li>\n );\n })}\n {events.length === 0 ? (\n <li className=\"px-4 py-8 text-center font-sans text-body-sm text-muted-foreground\">\n No hooks have fired yet.\n </li>\n ) : null}\n </ol>\n </section>\n ),\n);\nHookEventLog.displayName = \"HookEventLog\";\n\nexport { HookEventLog };\n"]}
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { Dialog } from './chunk-CSEGVTKO.js';
2
+ import { Dialog } from './chunk-T4Z7HBZR.js';
3
3
  import { cn } from './chunk-EWDN56AS.js';
4
4
  import { Command } from 'cmdk';
5
5
  import { Search, ChevronRight } from 'lucide-react';
@@ -98,5 +98,5 @@ function CommandPalette({
98
98
  }
99
99
 
100
100
  export { CommandPalette };
101
- //# sourceMappingURL=chunk-V3HFDVZ3.js.map
102
- //# sourceMappingURL=chunk-V3HFDVZ3.js.map
101
+ //# sourceMappingURL=chunk-W24RR5OD.js.map
102
+ //# sourceMappingURL=chunk-W24RR5OD.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/composites/command-palette/command-palette.tsx"],"names":["CommandPrimitive"],"mappings":"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","file":"chunk-V3HFDVZ3.js","sourcesContent":["\"use client\";\n\nimport { Command as CommandPrimitive } from \"cmdk\";\nimport { ChevronRight, Search } from \"lucide-react\";\nimport { useMemo, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport type { IconComponent } from \"../../../lib/types.js\";\nimport { Dialog } from \"../../primitives/dialog/index.js\";\n\nexport interface CommandItem {\n id: string;\n label: ReactNode;\n /** Optional secondary line (path, hint, shortcut). */\n hint?: ReactNode;\n /** Optional group name. Items with the same group are visually grouped. */\n group?: string;\n /** Optional icon. */\n icon?: IconComponent;\n /** Optional searchable plain-text used by the cmdk ranker. Falls back to `label` when string. */\n searchable?: string;\n}\n\ninterface CommandPaletteProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n items: CommandItem[];\n onSelect: (id: string) => void;\n placeholder?: string;\n emptyMessage?: ReactNode;\n /**\n * Optional custom filter score (0 = no match, > 0 = match). Receives the\n * `value` (the item's searchable text) and the current `search` query.\n * Defaults to cmdk's built-in fuzzy ranker which prioritizes substring +\n * word-boundary + consecutive matches.\n */\n filter?: (value: string, search: string) => number;\n}\n\nconst defaultEmpty = \"No results.\";\n\n/**\n * CommandPalette — Cmd+K-style global launcher with full keyboard navigation.\n *\n * Built on `cmdk` (the de-facto shadcn pattern) + Theo Dialog. Provides\n * out-of-the-box: ArrowUp/ArrowDown navigation, Enter selection, Escape close,\n * Home/End, active-item highlight via `data-selected`, and fuzzy ranking.\n *\n * Stateless: caller owns `open` / `onOpenChange` / `items`. Selecting an item\n * fires `onSelect(id)` and closes the dialog.\n */\nfunction CommandPalette({\n open,\n onOpenChange,\n items,\n onSelect,\n placeholder = \"Type a command or search…\",\n emptyMessage = defaultEmpty,\n filter,\n}: CommandPaletteProps) {\n const [search, setSearch] = useState(\"\");\n\n const groups = useMemo(() => {\n const map = new Map<string, CommandItem[]>();\n for (const item of items) {\n const key = item.group ?? \"\";\n if (!map.has(key)) map.set(key, []);\n map.get(key)?.push(item);\n }\n return Array.from(map.entries());\n }, [items]);\n\n const handleSelect = (id: string) => {\n onSelect(id);\n onOpenChange(false);\n setSearch(\"\");\n };\n\n return (\n <Dialog data-slot=\"command-palette\" open={open} onOpenChange={onOpenChange}>\n <Dialog.Content className=\"max-w-xl p-0\" hideCloseButton>\n <Dialog.Title className=\"sr-only\">Command palette</Dialog.Title>\n <Dialog.Description className=\"sr-only\">\n Type to search commands. Use arrow keys to navigate, Enter to select, Escape to close.\n </Dialog.Description>\n <CommandPrimitive label=\"Command palette\" shouldFilter {...(filter ? { filter } : {})}>\n <div className=\"flex items-center gap-2 border-border/40 border-b px-4 py-3\">\n <Search className=\"size-4 text-muted-foreground\" aria-hidden=\"true\" />\n <CommandPrimitive.Input\n value={search}\n onValueChange={setSearch}\n placeholder={placeholder}\n className={cn(\n \"flex-1 bg-transparent\",\n \"font-sans text-body-md text-foreground placeholder:text-muted-foreground\",\n \"focus:outline-none\",\n )}\n />\n <span className=\"rounded-md bg-muted px-1.5 py-0.5 font-mono text-label text-muted-foreground\">\n ⌘K\n </span>\n </div>\n <CommandPrimitive.List className=\"max-h-[420px] overflow-y-auto p-1\">\n <CommandPrimitive.Empty className=\"px-3 py-6 text-center text-body-sm text-muted-foreground\">\n {emptyMessage}\n </CommandPrimitive.Empty>\n {groups.map(([groupName, list]) => (\n <CommandPrimitive.Group\n key={groupName || \"default\"}\n heading={groupName || undefined}\n className={cn(\n \"[&_[cmdk-group-heading]]:px-3 [&_[cmdk-group-heading]]:pt-2 [&_[cmdk-group-heading]]:pb-1\",\n \"[&_[cmdk-group-heading]]:font-sans [&_[cmdk-group-heading]]:text-label-caps\",\n \"[&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group-heading]]:uppercase [&_[cmdk-group-heading]]:tracking-wider\",\n )}\n >\n {list.map((item) => {\n const Icon = item.icon;\n const value =\n item.searchable ?? (typeof item.label === \"string\" ? item.label : item.id);\n return (\n <CommandPrimitive.Item\n key={item.id}\n value={value}\n onSelect={() => handleSelect(item.id)}\n className={cn(\n \"flex w-full cursor-pointer items-center gap-3 rounded-md px-3 py-2 text-left\",\n \"transition-colors hover:bg-muted\",\n \"data-[selected=true]:bg-muted\",\n \"focus-visible:outline-none\",\n )}\n >\n {Icon ? <Icon className=\"size-4 text-primary\" /> : null}\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-body-sm text-foreground\">{item.label}</p>\n {item.hint ? (\n <p className=\"truncate font-mono text-label text-muted-foreground\">\n {item.hint}\n </p>\n ) : null}\n </div>\n <ChevronRight className=\"size-3 text-muted-foreground\" aria-hidden=\"true\" />\n </CommandPrimitive.Item>\n );\n })}\n </CommandPrimitive.Group>\n ))}\n </CommandPrimitive.List>\n </CommandPrimitive>\n </Dialog.Content>\n </Dialog>\n );\n}\n\nexport { CommandPalette };\n"]}
1
+ {"version":3,"sources":["../src/components/composites/command-palette/command-palette.tsx"],"names":["CommandPrimitive"],"mappings":"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","file":"chunk-W24RR5OD.js","sourcesContent":["\"use client\";\n\nimport { Command as CommandPrimitive } from \"cmdk\";\nimport { ChevronRight, Search } from \"lucide-react\";\nimport { useMemo, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport type { IconComponent } from \"../../../lib/types.js\";\nimport { Dialog } from \"../../primitives/dialog/index.js\";\n\nexport interface CommandItem {\n id: string;\n label: ReactNode;\n /** Optional secondary line (path, hint, shortcut). */\n hint?: ReactNode;\n /** Optional group name. Items with the same group are visually grouped. */\n group?: string;\n /** Optional icon. */\n icon?: IconComponent;\n /** Optional searchable plain-text used by the cmdk ranker. Falls back to `label` when string. */\n searchable?: string;\n}\n\ninterface CommandPaletteProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n items: CommandItem[];\n onSelect: (id: string) => void;\n placeholder?: string;\n emptyMessage?: ReactNode;\n /**\n * Optional custom filter score (0 = no match, > 0 = match). Receives the\n * `value` (the item's searchable text) and the current `search` query.\n * Defaults to cmdk's built-in fuzzy ranker which prioritizes substring +\n * word-boundary + consecutive matches.\n */\n filter?: (value: string, search: string) => number;\n}\n\nconst defaultEmpty = \"No results.\";\n\n/**\n * CommandPalette — Cmd+K-style global launcher with full keyboard navigation.\n *\n * Built on `cmdk` (the de-facto shadcn pattern) + Theo Dialog. Provides\n * out-of-the-box: ArrowUp/ArrowDown navigation, Enter selection, Escape close,\n * Home/End, active-item highlight via `data-selected`, and fuzzy ranking.\n *\n * Stateless: caller owns `open` / `onOpenChange` / `items`. Selecting an item\n * fires `onSelect(id)` and closes the dialog.\n */\nfunction CommandPalette({\n open,\n onOpenChange,\n items,\n onSelect,\n placeholder = \"Type a command or search…\",\n emptyMessage = defaultEmpty,\n filter,\n}: CommandPaletteProps) {\n const [search, setSearch] = useState(\"\");\n\n const groups = useMemo(() => {\n const map = new Map<string, CommandItem[]>();\n for (const item of items) {\n const key = item.group ?? \"\";\n if (!map.has(key)) map.set(key, []);\n map.get(key)?.push(item);\n }\n return Array.from(map.entries());\n }, [items]);\n\n const handleSelect = (id: string) => {\n onSelect(id);\n onOpenChange(false);\n setSearch(\"\");\n };\n\n return (\n <Dialog data-slot=\"command-palette\" open={open} onOpenChange={onOpenChange}>\n <Dialog.Content className=\"max-w-xl p-0\" hideCloseButton>\n <Dialog.Title className=\"sr-only\">Command palette</Dialog.Title>\n <Dialog.Description className=\"sr-only\">\n Type to search commands. Use arrow keys to navigate, Enter to select, Escape to close.\n </Dialog.Description>\n <CommandPrimitive label=\"Command palette\" shouldFilter {...(filter ? { filter } : {})}>\n <div className=\"flex items-center gap-2 border-border/40 border-b px-4 py-3\">\n <Search className=\"size-4 text-muted-foreground\" aria-hidden=\"true\" />\n <CommandPrimitive.Input\n value={search}\n onValueChange={setSearch}\n placeholder={placeholder}\n className={cn(\n \"flex-1 bg-transparent\",\n \"font-sans text-body-md text-foreground placeholder:text-muted-foreground\",\n \"focus:outline-none\",\n )}\n />\n <span className=\"rounded-md bg-muted px-1.5 py-0.5 font-mono text-label text-muted-foreground\">\n ⌘K\n </span>\n </div>\n <CommandPrimitive.List className=\"max-h-[420px] overflow-y-auto p-1\">\n <CommandPrimitive.Empty className=\"px-3 py-6 text-center text-body-sm text-muted-foreground\">\n {emptyMessage}\n </CommandPrimitive.Empty>\n {groups.map(([groupName, list]) => (\n <CommandPrimitive.Group\n key={groupName || \"default\"}\n heading={groupName || undefined}\n className={cn(\n \"[&_[cmdk-group-heading]]:px-3 [&_[cmdk-group-heading]]:pt-2 [&_[cmdk-group-heading]]:pb-1\",\n \"[&_[cmdk-group-heading]]:font-sans [&_[cmdk-group-heading]]:text-label-caps\",\n \"[&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group-heading]]:uppercase [&_[cmdk-group-heading]]:tracking-wider\",\n )}\n >\n {list.map((item) => {\n const Icon = item.icon;\n const value =\n item.searchable ?? (typeof item.label === \"string\" ? item.label : item.id);\n return (\n <CommandPrimitive.Item\n key={item.id}\n value={value}\n onSelect={() => handleSelect(item.id)}\n className={cn(\n \"flex w-full cursor-pointer items-center gap-3 rounded-md px-3 py-2 text-left\",\n \"transition-colors hover:bg-muted\",\n \"data-[selected=true]:bg-muted\",\n \"focus-visible:outline-none\",\n )}\n >\n {Icon ? <Icon className=\"size-4 text-primary\" /> : null}\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-body-sm text-foreground\">{item.label}</p>\n {item.hint ? (\n <p className=\"truncate font-mono text-label text-muted-foreground\">\n {item.hint}\n </p>\n ) : null}\n </div>\n <ChevronRight className=\"size-3 text-muted-foreground\" aria-hidden=\"true\" />\n </CommandPrimitive.Item>\n );\n })}\n </CommandPrimitive.Group>\n ))}\n </CommandPrimitive.List>\n </CommandPrimitive>\n </Dialog.Content>\n </Dialog>\n );\n}\n\nexport { CommandPalette };\n"]}
@@ -21,7 +21,7 @@ var MemoryEditor = forwardRef(
21
21
  {
22
22
  "data-slot": "memory-editor",
23
23
  ref,
24
- className: cn("rounded-xl border bg-card", className),
24
+ className: cn("rounded-xl border border-border bg-card", className),
25
25
  ...props,
26
26
  children: [
27
27
  /* @__PURE__ */ jsxs("header", { className: "flex items-center justify-between gap-3 border-border/40 border-b px-4 py-3", children: [
@@ -87,5 +87,5 @@ Write Markdown the agent should keep in context.`
87
87
  MemoryEditor.displayName = "MemoryEditor";
88
88
 
89
89
  export { MemoryEditor };
90
- //# sourceMappingURL=chunk-A3OU6ICP.js.map
91
- //# sourceMappingURL=chunk-A3OU6ICP.js.map
90
+ //# sourceMappingURL=chunk-W743ORLA.js.map
91
+ //# sourceMappingURL=chunk-W743ORLA.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/primitives/memory-editor/memory-editor.tsx"],"names":[],"mappings":"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","file":"chunk-A3OU6ICP.js","sourcesContent":["import { Brain, Folder, FolderOpen, User } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport type { IconComponent } from \"../../../lib/types.js\";\n\nexport type MemoryScope = \"global\" | \"project\" | \"session\";\n\nexport interface MemoryLayer {\n scope: MemoryScope;\n /** File path on disk for transparency. */\n path: string;\n /** Markdown content. */\n content: string;\n /** Last modified label, e.g. \"2m ago\". */\n modifiedAt?: string;\n}\n\ninterface MemoryEditorProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n layers: MemoryLayer[];\n /** Currently active layer for editing. */\n activeScope: MemoryScope;\n onScopeChange: (scope: MemoryScope) => void;\n onContentChange: (scope: MemoryScope, next: string) => void;\n title?: ReactNode;\n}\n\nconst SCOPE_META: Record<MemoryScope, { label: string; icon: IconComponent; hint: string }> = {\n global: { label: \"Global\", icon: User, hint: \"Applies to every project for this user.\" },\n project: {\n label: \"Project\",\n icon: FolderOpen,\n hint: \"Versioned with the project. Shared by team.\",\n },\n session: { label: \"Session\", icon: Folder, hint: \"This session only. Wiped on exit.\" },\n};\n\n/**\n * MemoryEditor — three-layer Markdown memory editor (global / project /\n * session) mirroring Claude Code's CLAUDE.md hierarchy.\n *\n * Each scope keeps its own file. Switching scopes via tab updates which\n * layer is being edited. Path is shown explicitly so users know where the\n * content lives on disk.\n */\nconst MemoryEditor = forwardRef<HTMLDivElement, MemoryEditorProps>(\n (\n { className, layers, activeScope, onScopeChange, onContentChange, title = \"Memory\", ...props },\n ref,\n ) => {\n const active = layers.find((l) => l.scope === activeScope);\n const ActiveIcon = active ? SCOPE_META[active.scope].icon : Brain;\n return (\n <section\n data-slot=\"memory-editor\"\n ref={ref}\n className={cn(\"rounded-xl border bg-card\", className)}\n {...props}\n >\n <header className=\"flex items-center justify-between gap-3 border-border/40 border-b px-4 py-3\">\n <div className=\"flex items-center gap-2\">\n <Brain className=\"size-4 text-primary\" aria-hidden=\"true\" />\n <h3 className=\"font-display text-title-md tracking-tight\">{title}</h3>\n </div>\n <div className=\"inline-flex items-center rounded-lg border border-border/60 bg-muted p-0.5\">\n {([\"global\", \"project\", \"session\"] as const).map((scope) => {\n const meta = SCOPE_META[scope];\n const Icon = meta.icon;\n const isActive = scope === activeScope;\n return (\n <button\n key={scope}\n type=\"button\"\n onClick={() => onScopeChange(scope)}\n aria-pressed={isActive}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-md px-2.5 py-1\",\n \"font-sans text-label transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n isActive\n ? \"bg-card text-foreground shadow-sm\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n <Icon className=\"size-3\" />\n {meta.label}\n </button>\n );\n })}\n </div>\n </header>\n\n {active ? (\n <>\n <div className=\"flex items-center justify-between gap-3 border-border/40 border-b bg-muted/30 px-4 py-2\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <ActiveIcon className=\"size-3 shrink-0 text-muted-foreground\" aria-hidden=\"true\" />\n <span className=\"truncate font-mono text-code-sm text-foreground\">\n {active.path}\n </span>\n {active.modifiedAt ? (\n <span className=\"shrink-0 font-mono text-label text-muted-foreground\">\n · {active.modifiedAt}\n </span>\n ) : null}\n </div>\n <span className=\"font-sans text-label text-muted-foreground italic\">\n {SCOPE_META[active.scope].hint}\n </span>\n </div>\n <textarea\n value={active.content}\n onChange={(e) => onContentChange(active.scope, e.target.value)}\n rows={12}\n className=\"w-full resize-y bg-transparent px-4 py-3 font-mono text-code-md text-foreground placeholder:text-muted-foreground focus:outline-none\"\n placeholder={`# ${SCOPE_META[active.scope].label} notes\\n\\nWrite Markdown the agent should keep in context.`}\n />\n </>\n ) : null}\n </section>\n );\n },\n);\nMemoryEditor.displayName = \"MemoryEditor\";\n\nexport { MemoryEditor };\n"]}
1
+ {"version":3,"sources":["../src/components/primitives/memory-editor/memory-editor.tsx"],"names":[],"mappings":"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","file":"chunk-W743ORLA.js","sourcesContent":["import { Brain, Folder, FolderOpen, User } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport type { IconComponent } from \"../../../lib/types.js\";\n\nexport type MemoryScope = \"global\" | \"project\" | \"session\";\n\nexport interface MemoryLayer {\n scope: MemoryScope;\n /** File path on disk for transparency. */\n path: string;\n /** Markdown content. */\n content: string;\n /** Last modified label, e.g. \"2m ago\". */\n modifiedAt?: string;\n}\n\ninterface MemoryEditorProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n layers: MemoryLayer[];\n /** Currently active layer for editing. */\n activeScope: MemoryScope;\n onScopeChange: (scope: MemoryScope) => void;\n onContentChange: (scope: MemoryScope, next: string) => void;\n title?: ReactNode;\n}\n\nconst SCOPE_META: Record<MemoryScope, { label: string; icon: IconComponent; hint: string }> = {\n global: { label: \"Global\", icon: User, hint: \"Applies to every project for this user.\" },\n project: {\n label: \"Project\",\n icon: FolderOpen,\n hint: \"Versioned with the project. Shared by team.\",\n },\n session: { label: \"Session\", icon: Folder, hint: \"This session only. Wiped on exit.\" },\n};\n\n/**\n * MemoryEditor — three-layer Markdown memory editor (global / project /\n * session) mirroring Claude Code's CLAUDE.md hierarchy.\n *\n * Each scope keeps its own file. Switching scopes via tab updates which\n * layer is being edited. Path is shown explicitly so users know where the\n * content lives on disk.\n */\nconst MemoryEditor = forwardRef<HTMLDivElement, MemoryEditorProps>(\n (\n { className, layers, activeScope, onScopeChange, onContentChange, title = \"Memory\", ...props },\n ref,\n ) => {\n const active = layers.find((l) => l.scope === activeScope);\n const ActiveIcon = active ? SCOPE_META[active.scope].icon : Brain;\n return (\n <section\n data-slot=\"memory-editor\"\n ref={ref}\n className={cn(\"rounded-xl border border-border bg-card\", className)}\n {...props}\n >\n <header className=\"flex items-center justify-between gap-3 border-border/40 border-b px-4 py-3\">\n <div className=\"flex items-center gap-2\">\n <Brain className=\"size-4 text-primary\" aria-hidden=\"true\" />\n <h3 className=\"font-display text-title-md tracking-tight\">{title}</h3>\n </div>\n <div className=\"inline-flex items-center rounded-lg border border-border/60 bg-muted p-0.5\">\n {([\"global\", \"project\", \"session\"] as const).map((scope) => {\n const meta = SCOPE_META[scope];\n const Icon = meta.icon;\n const isActive = scope === activeScope;\n return (\n <button\n key={scope}\n type=\"button\"\n onClick={() => onScopeChange(scope)}\n aria-pressed={isActive}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-md px-2.5 py-1\",\n \"font-sans text-label transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n isActive\n ? \"bg-card text-foreground shadow-sm\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n <Icon className=\"size-3\" />\n {meta.label}\n </button>\n );\n })}\n </div>\n </header>\n\n {active ? (\n <>\n <div className=\"flex items-center justify-between gap-3 border-border/40 border-b bg-muted/30 px-4 py-2\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <ActiveIcon className=\"size-3 shrink-0 text-muted-foreground\" aria-hidden=\"true\" />\n <span className=\"truncate font-mono text-code-sm text-foreground\">\n {active.path}\n </span>\n {active.modifiedAt ? (\n <span className=\"shrink-0 font-mono text-label text-muted-foreground\">\n · {active.modifiedAt}\n </span>\n ) : null}\n </div>\n <span className=\"font-sans text-label text-muted-foreground italic\">\n {SCOPE_META[active.scope].hint}\n </span>\n </div>\n <textarea\n value={active.content}\n onChange={(e) => onContentChange(active.scope, e.target.value)}\n rows={12}\n className=\"w-full resize-y bg-transparent px-4 py-3 font-mono text-code-md text-foreground placeholder:text-muted-foreground focus:outline-none\"\n placeholder={`# ${SCOPE_META[active.scope].label} notes\\n\\nWrite Markdown the agent should keep in context.`}\n />\n </>\n ) : null}\n </section>\n );\n },\n);\nMemoryEditor.displayName = \"MemoryEditor\";\n\nexport { MemoryEditor };\n"]}
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { MCPServerCard } from './chunk-RLWULF5B.js';
2
+ import { MCPServerCard } from './chunk-RMJYXHBX.js';
3
3
  import { cn } from './chunk-EWDN56AS.js';
4
4
  import { Plus } from 'lucide-react';
5
5
  import { forwardRef, useState, useMemo } from 'react';
@@ -104,5 +104,5 @@ var MCPServerList = forwardRef(
104
104
  MCPServerList.displayName = "MCPServerList";
105
105
 
106
106
  export { MCPServerList };
107
- //# sourceMappingURL=chunk-TJLULCZW.js.map
108
- //# sourceMappingURL=chunk-TJLULCZW.js.map
107
+ //# sourceMappingURL=chunk-WQVEJJV7.js.map
108
+ //# sourceMappingURL=chunk-WQVEJJV7.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/composites/mcp-server-list/mcp-server-list.tsx"],"names":[],"mappings":";;;;;;AAoBA,IAAM,YAAA,GAAkC,CAAC,WAAA,EAAa,UAAA,EAAY,YAAY,cAAc,CAAA;AAM5F,IAAM,aAAA,GAAgB,UAAA;AAAA,EACpB,CACE,EAAE,SAAA,EAAW,OAAA,EAAS,KAAA,GAAQ,aAAA,EAAe,KAAA,EAAO,SAAA,EAAW,YAAA,EAAc,GAAG,KAAA,EAAM,EACtF,GAAA,KACG;AACH,IAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAiC,IAAI,CAAA;AAEjE,IAAA,MAAM,MAAA,GAAS,QAAQ,MAAM;AAC3B,MAAA,MAAM,MAAA,GAA0C;AAAA,QAC9C,SAAA,EAAW,CAAA;AAAA,QACX,QAAA,EAAU,CAAA;AAAA,QACV,QAAA,EAAU,CAAA;AAAA,QACV,YAAA,EAAc;AAAA,OAChB;AACA,MAAA,KAAA,MAAW,CAAA,IAAK,OAAA,EAAS,MAAA,CAAO,CAAA,CAAE,MAAM,CAAA,EAAA;AACxC,MAAA,OAAO,MAAA;AAAA,IACT,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,IAAA,MAAM,QAAA,GAAW,OAAA;AAAA,MACf,MAAO,SAAS,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,MAAM,CAAA,GAAI,OAAA;AAAA,MAC7D,CAAC,SAAS,MAAM;AAAA,KAClB;AAEA,IAAA,uBACE,IAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAU,iBAAA;AAAA,QACV,GAAA;AAAA,QACA,SAAA,EAAW,EAAA,CAAG,YAAA,EAAc,SAAS,CAAA;AAAA,QACrC,YAAA,EAAW,aAAA;AAAA,QACV,GAAG,KAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,QAAA,EAAA,EAAO,WAAU,mDAAA,EACf,QAAA,EAAA;AAAA,YAAA,KAAA,uBACE,IAAA,EAAA,EAAG,SAAA,EAAU,6CAA6C,QAAA,EAAA,KAAA,EAAM,CAAA,uBAEhE,MAAA,EAAA,EAAK,CAAA;AAAA,4BAER,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,8BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,+DAAA,EACb,QAAA,EAAA;AAAA,gCAAA,IAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,OAAA,EAAS,MAAM,SAAA,CAAU,IAAI,CAAA;AAAA,oBAC7B,gBAAc,MAAA,KAAW,IAAA;AAAA,oBACzB,SAAA,EAAW,EAAA;AAAA,sBACT,6CAAA;AAAA,sBACA,MAAA,KAAW,OAAO,mCAAA,GAAsC;AAAA,qBAC1D;AAAA,oBACD,QAAA,EAAA;AAAA,sBAAA,WAAA;AAAA,sBACQ,OAAA,CAAQ;AAAA;AAAA;AAAA,iBACjB;AAAA,gBACC,YAAA,CAAa,GAAA,CAAI,CAAC,MAAA,qBACjB,IAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBAEC,IAAA,EAAK,QAAA;AAAA,oBACL,OAAA,EAAS,MAAM,SAAA,CAAU,MAAM,CAAA;AAAA,oBAC/B,gBAAc,MAAA,KAAW,MAAA;AAAA,oBACzB,QAAA,EAAU,MAAA,CAAO,MAAM,CAAA,KAAM,CAAA;AAAA,oBAC7B,SAAA,EAAW,EAAA;AAAA,sBACT,uDAAA;AAAA,sBACA,MAAA,KAAW,SACP,mCAAA,GACA,uBAAA;AAAA,sBACJ;AAAA,qBACF;AAAA,oBAEC,QAAA,EAAA;AAAA,sBAAA,MAAA;AAAA,sBAAO,QAAA;AAAA,sBAAI,OAAO,MAAM;AAAA;AAAA,mBAAA;AAAA,kBAbpB;AAAA,iBAeR;AAAA,eAAA,EACH,CAAA;AAAA,cACC,KAAA,mBACC,IAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,OAAA,EAAS,KAAA;AAAA,kBACT,SAAA,EAAU,yMAAA;AAAA,kBAEV,QAAA,EAAA;AAAA,oCAAA,GAAA,CAAC,IAAA,EAAA,EAAK,WAAU,UAAA,EAAW,CAAA;AAAA,oBAAE;AAAA;AAAA;AAAA,eAC/B,GACE;AAAA,aAAA,EACN;AAAA,WAAA,EACF,CAAA;AAAA,UAEC,SAAS,MAAA,KAAW,CAAA,mBACnB,GAAA,CAAC,GAAA,EAAA,EAAE,WAAU,iIAAA,EAAkI,QAAA,EAAA,2BAAA,EAE/I,CAAA,mBAEA,GAAA,CAAC,SAAI,SAAA,EAAU,uCAAA,EACZ,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,MAAA,qBACb,GAAA;AAAA,YAAC,aAAA;AAAA,YAAA;AAAA,cAEC,MAAA;AAAA,cACC,GAAI,SAAA,GAAY,EAAE,SAAA,KAAc,EAAC;AAAA,cACjC,GAAI,YAAA,GAAe,EAAE,YAAA,KAAiB;AAAC,aAAA;AAAA,YAHnC,MAAA,CAAO;AAAA,WAKf,CAAA,EACH;AAAA;AAAA;AAAA,KAEJ;AAAA,EAEJ;AACF;AACA,aAAA,CAAc,WAAA,GAAc,eAAA","file":"chunk-TJLULCZW.js","sourcesContent":["\"use client\";\n\nimport { Plus } from \"lucide-react\";\nimport { forwardRef, useMemo, useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport {\n type MCPServer,\n MCPServerCard,\n type MCPServerStatus,\n} from \"../../primitives/mcp-server-card/index.js\";\n\ninterface MCPServerListProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n servers: MCPServer[];\n title?: ReactNode;\n onAdd?: () => void;\n onRestart?: (id: string) => void;\n onDisconnect?: (id: string) => void;\n}\n\nconst STATUS_ORDER: MCPServerStatus[] = [\"connected\", \"starting\", \"degraded\", \"disconnected\"];\n\n/**\n * MCPServerList — grouped MCP server inventory with status filter chips.\n * Surfaces degraded/disconnected servers prominently so the user can act.\n */\nconst MCPServerList = forwardRef<HTMLDivElement, MCPServerListProps>(\n (\n { className, servers, title = \"MCP servers\", onAdd, onRestart, onDisconnect, ...props },\n ref,\n ) => {\n const [filter, setFilter] = useState<MCPServerStatus | null>(null);\n\n const counts = useMemo(() => {\n const result: Record<MCPServerStatus, number> = {\n connected: 0,\n starting: 0,\n degraded: 0,\n disconnected: 0,\n };\n for (const s of servers) result[s.status]++;\n return result;\n }, [servers]);\n\n const filtered = useMemo(\n () => (filter ? servers.filter((s) => s.status === filter) : servers),\n [servers, filter],\n );\n\n return (\n <section\n data-slot=\"mcp-server-list\"\n ref={ref}\n className={cn(\"grid gap-3\", className)}\n aria-label=\"MCP servers\"\n {...props}\n >\n <header className=\"flex flex-wrap items-center justify-between gap-3\">\n {title ? (\n <h3 className=\"font-display text-title-md tracking-tight\">{title}</h3>\n ) : (\n <span />\n )}\n <div className=\"flex items-center gap-2\">\n <div className=\"inline-flex rounded-lg border border-border/60 bg-muted p-0.5\">\n <button\n type=\"button\"\n onClick={() => setFilter(null)}\n aria-pressed={filter === null}\n className={cn(\n \"rounded-md px-2.5 py-1 font-mono text-label\",\n filter === null ? \"bg-card text-foreground shadow-sm\" : \"text-muted-foreground\",\n )}\n >\n All · {servers.length}\n </button>\n {STATUS_ORDER.map((status) => (\n <button\n key={status}\n type=\"button\"\n onClick={() => setFilter(status)}\n aria-pressed={filter === status}\n disabled={counts[status] === 0}\n className={cn(\n \"rounded-md px-2.5 py-1 font-mono text-label uppercase\",\n filter === status\n ? \"bg-card text-foreground shadow-sm\"\n : \"text-muted-foreground\",\n \"disabled:opacity-40\",\n )}\n >\n {status} · {counts[status]}\n </button>\n ))}\n </div>\n {onAdd ? (\n <button\n type=\"button\"\n onClick={onAdd}\n className=\"inline-flex items-center gap-1 rounded-md bg-primary px-2.5 py-1 font-sans text-label text-primary-foreground hover:shadow-glow focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Plus className=\"size-3.5\" /> Add server\n </button>\n ) : null}\n </div>\n </header>\n\n {filtered.length === 0 ? (\n <p className=\"rounded-xl border border-border/60 border-dashed bg-muted/30 px-4 py-8 text-center font-sans text-body-sm text-muted-foreground\">\n No servers in this state.\n </p>\n ) : (\n <div className=\"grid grid-cols-1 gap-3 md:grid-cols-2\">\n {filtered.map((server) => (\n <MCPServerCard\n key={server.id}\n server={server}\n {...(onRestart ? { onRestart } : {})}\n {...(onDisconnect ? { onDisconnect } : {})}\n />\n ))}\n </div>\n )}\n </section>\n );\n },\n);\nMCPServerList.displayName = \"MCPServerList\";\n\nexport { MCPServerList };\n"]}
1
+ {"version":3,"sources":["../src/components/composites/mcp-server-list/mcp-server-list.tsx"],"names":[],"mappings":"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","file":"chunk-WQVEJJV7.js","sourcesContent":["\"use client\";\n\nimport { Plus } from \"lucide-react\";\nimport { forwardRef, useMemo, useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\nimport {\n type MCPServer,\n MCPServerCard,\n type MCPServerStatus,\n} from \"../../primitives/mcp-server-card/index.js\";\n\ninterface MCPServerListProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n servers: MCPServer[];\n title?: ReactNode;\n onAdd?: () => void;\n onRestart?: (id: string) => void;\n onDisconnect?: (id: string) => void;\n}\n\nconst STATUS_ORDER: MCPServerStatus[] = [\"connected\", \"starting\", \"degraded\", \"disconnected\"];\n\n/**\n * MCPServerList — grouped MCP server inventory with status filter chips.\n * Surfaces degraded/disconnected servers prominently so the user can act.\n */\nconst MCPServerList = forwardRef<HTMLDivElement, MCPServerListProps>(\n (\n { className, servers, title = \"MCP servers\", onAdd, onRestart, onDisconnect, ...props },\n ref,\n ) => {\n const [filter, setFilter] = useState<MCPServerStatus | null>(null);\n\n const counts = useMemo(() => {\n const result: Record<MCPServerStatus, number> = {\n connected: 0,\n starting: 0,\n degraded: 0,\n disconnected: 0,\n };\n for (const s of servers) result[s.status]++;\n return result;\n }, [servers]);\n\n const filtered = useMemo(\n () => (filter ? servers.filter((s) => s.status === filter) : servers),\n [servers, filter],\n );\n\n return (\n <section\n data-slot=\"mcp-server-list\"\n ref={ref}\n className={cn(\"grid gap-3\", className)}\n aria-label=\"MCP servers\"\n {...props}\n >\n <header className=\"flex flex-wrap items-center justify-between gap-3\">\n {title ? (\n <h3 className=\"font-display text-title-md tracking-tight\">{title}</h3>\n ) : (\n <span />\n )}\n <div className=\"flex items-center gap-2\">\n <div className=\"inline-flex rounded-lg border border-border/60 bg-muted p-0.5\">\n <button\n type=\"button\"\n onClick={() => setFilter(null)}\n aria-pressed={filter === null}\n className={cn(\n \"rounded-md px-2.5 py-1 font-mono text-label\",\n filter === null ? \"bg-card text-foreground shadow-sm\" : \"text-muted-foreground\",\n )}\n >\n All · {servers.length}\n </button>\n {STATUS_ORDER.map((status) => (\n <button\n key={status}\n type=\"button\"\n onClick={() => setFilter(status)}\n aria-pressed={filter === status}\n disabled={counts[status] === 0}\n className={cn(\n \"rounded-md px-2.5 py-1 font-mono text-label uppercase\",\n filter === status\n ? \"bg-card text-foreground shadow-sm\"\n : \"text-muted-foreground\",\n \"disabled:opacity-40\",\n )}\n >\n {status} · {counts[status]}\n </button>\n ))}\n </div>\n {onAdd ? (\n <button\n type=\"button\"\n onClick={onAdd}\n className=\"inline-flex items-center gap-1 rounded-md bg-primary px-2.5 py-1 font-sans text-label text-primary-foreground hover:shadow-glow focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Plus className=\"size-3.5\" /> Add server\n </button>\n ) : null}\n </div>\n </header>\n\n {filtered.length === 0 ? (\n <p className=\"rounded-xl border border-border/60 border-dashed bg-muted/30 px-4 py-8 text-center font-sans text-body-sm text-muted-foreground\">\n No servers in this state.\n </p>\n ) : (\n <div className=\"grid grid-cols-1 gap-3 md:grid-cols-2\">\n {filtered.map((server) => (\n <MCPServerCard\n key={server.id}\n server={server}\n {...(onRestart ? { onRestart } : {})}\n {...(onDisconnect ? { onDisconnect } : {})}\n />\n ))}\n </div>\n )}\n </section>\n );\n },\n);\nMCPServerList.displayName = \"MCPServerList\";\n\nexport { MCPServerList };\n"]}
@@ -42,7 +42,7 @@ var ChannelCard = forwardRef(
42
42
  {
43
43
  "data-slot": "channel-card",
44
44
  ref,
45
- className: cn("grid gap-3 rounded-xl border bg-card p-4", className),
45
+ className: cn("grid gap-3 rounded-xl border border-border bg-card p-4", className),
46
46
  "aria-label": `Channel ${channel.name}`,
47
47
  ...props,
48
48
  children: [
@@ -117,5 +117,5 @@ var ChannelCard = forwardRef(
117
117
  ChannelCard.displayName = "ChannelCard";
118
118
 
119
119
  export { ChannelCard };
120
- //# sourceMappingURL=chunk-ZAMPCRFJ.js.map
121
- //# sourceMappingURL=chunk-ZAMPCRFJ.js.map
120
+ //# sourceMappingURL=chunk-WX4Q4DTX.js.map
121
+ //# sourceMappingURL=chunk-WX4Q4DTX.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/primitives/channel-card/channel-card.tsx"],"names":[],"mappings":"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","file":"chunk-ZAMPCRFJ.js","sourcesContent":["import {\n type LucideIcon,\n MessageCircle,\n Power,\n Send,\n Settings,\n Slack,\n Webhook,\n} from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\nexport type ChannelPlatform = \"telegram\" | \"discord\" | \"slack\" | \"whatsapp\" | \"webhook\" | \"mcp\";\n\nexport type ChannelStatus = \"disconnected\" | \"connecting\" | \"connected\" | \"error\";\n\nexport interface Channel {\n id: string;\n name: string;\n platform: ChannelPlatform;\n status: ChannelStatus;\n description?: ReactNode;\n lastSeen?: string;\n messageCount?: number;\n}\n\nconst PLATFORM_ICON: Record<ChannelPlatform, LucideIcon> = {\n telegram: Send,\n discord: MessageCircle,\n slack: Slack,\n whatsapp: MessageCircle,\n webhook: Webhook,\n mcp: Webhook,\n};\n\nconst PLATFORM_LABEL: Record<ChannelPlatform, string> = {\n telegram: \"Telegram\",\n discord: \"Discord\",\n slack: \"Slack\",\n whatsapp: \"WhatsApp\",\n webhook: \"Webhook\",\n mcp: \"MCP\",\n};\n\nconst STATUS_CONFIG: Record<ChannelStatus, { label: string; class: string }> = {\n connected: { label: \"Connected\", class: \"border-success/40 bg-success/15 text-success\" },\n connecting: {\n label: \"Connecting\",\n class: \"border-primary/40 bg-primary/15 text-primary animate-pulse\",\n },\n disconnected: {\n label: \"Disconnected\",\n class: \"border-muted-foreground/40 bg-muted/40 text-muted-foreground\",\n },\n error: { label: \"Error\", class: \"border-destructive/40 bg-destructive/15 text-destructive\" },\n};\n\ninterface ChannelCardProps extends HTMLAttributes<HTMLElement> {\n channel: Channel;\n onConfigure?: (id: string) => void;\n onToggle?: (id: string, enabled: boolean) => void;\n}\n\n/**\n * ChannelCard — inbound gateway connection (Telegram, Discord, Slack, …)\n * showing its connection status, platform, and inline controls.\n *\n * EC absorbed: the toggle reflects the *current* status. \"connected\" implies\n * enabled (toggle off disconnects); \"disconnected\"/\"error\" implies disabled\n * (toggle on reconnects). \"connecting\" is a transient state — toggle is a\n * no-op (button disabled).\n */\nconst ChannelCard = forwardRef<HTMLElement, ChannelCardProps>(\n ({ className, channel, onConfigure, onToggle, ...props }, ref) => {\n const cfg = STATUS_CONFIG[channel.status];\n const Icon = PLATFORM_ICON[channel.platform];\n const enabled = channel.status === \"connected\";\n const togglePending = channel.status === \"connecting\";\n\n return (\n <article\n data-slot=\"channel-card\"\n ref={ref}\n className={cn(\"grid gap-3 rounded-xl border bg-card p-4\", className)}\n aria-label={`Channel ${channel.name}`}\n {...props}\n >\n <header className=\"flex items-start justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <Icon className=\"size-4 shrink-0 text-primary\" aria-hidden=\"true\" />\n <div className=\"min-w-0\">\n <h4 className=\"font-medium font-mono text-body-sm text-foreground\">{channel.name}</h4>\n <p className=\"truncate font-mono text-label text-muted-foreground\">\n {PLATFORM_LABEL[channel.platform]}\n </p>\n </div>\n </div>\n <span\n className={cn(\n \"inline-flex shrink-0 items-center rounded-full border px-2.5 py-0.5\",\n \"font-mono text-label uppercase tracking-wider\",\n cfg.class,\n )}\n >\n {cfg.label}\n </span>\n </header>\n\n {channel.description ? (\n <p className=\"font-sans text-body-sm text-muted-foreground\">{channel.description}</p>\n ) : null}\n\n {(channel.lastSeen !== undefined || channel.messageCount !== undefined) && (\n <dl className=\"grid grid-cols-2 gap-2 font-mono text-label\">\n {channel.lastSeen !== undefined ? (\n <div>\n <dt className=\"text-muted-foreground uppercase tracking-wider\">Last seen</dt>\n <dd className=\"text-foreground\">{channel.lastSeen}</dd>\n </div>\n ) : null}\n {channel.messageCount !== undefined ? (\n <div>\n <dt className=\"text-muted-foreground uppercase tracking-wider\">Messages</dt>\n <dd className=\"text-foreground\">{channel.messageCount.toLocaleString()}</dd>\n </div>\n ) : null}\n </dl>\n )}\n\n <footer className=\"flex items-center justify-end gap-1.5\">\n {onConfigure ? (\n <button\n type=\"button\"\n onClick={() => onConfigure(channel.id)}\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border/60 bg-card px-2.5 py-1 font-mono text-label hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Settings className=\"size-3\" /> Configure\n </button>\n ) : null}\n {onToggle ? (\n <button\n type=\"button\"\n onClick={() => onToggle(channel.id, !enabled)}\n disabled={togglePending}\n aria-pressed={enabled}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-md border border-border/60 bg-card px-2.5 py-1 font-mono text-label hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n togglePending && \"cursor-not-allowed opacity-60\",\n enabled && \"text-success\",\n )}\n >\n <Power className=\"size-3\" />\n {enabled ? \"Disconnect\" : \"Connect\"}\n </button>\n ) : null}\n </footer>\n </article>\n );\n },\n);\nChannelCard.displayName = \"ChannelCard\";\n\nexport { ChannelCard };\n"]}
1
+ {"version":3,"sources":["../src/components/primitives/channel-card/channel-card.tsx"],"names":[],"mappings":"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","file":"chunk-WX4Q4DTX.js","sourcesContent":["import {\n type LucideIcon,\n MessageCircle,\n Power,\n Send,\n Settings,\n Slack,\n Webhook,\n} from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../../../lib/cn.js\";\n\nexport type ChannelPlatform = \"telegram\" | \"discord\" | \"slack\" | \"whatsapp\" | \"webhook\" | \"mcp\";\n\nexport type ChannelStatus = \"disconnected\" | \"connecting\" | \"connected\" | \"error\";\n\nexport interface Channel {\n id: string;\n name: string;\n platform: ChannelPlatform;\n status: ChannelStatus;\n description?: ReactNode;\n lastSeen?: string;\n messageCount?: number;\n}\n\nconst PLATFORM_ICON: Record<ChannelPlatform, LucideIcon> = {\n telegram: Send,\n discord: MessageCircle,\n slack: Slack,\n whatsapp: MessageCircle,\n webhook: Webhook,\n mcp: Webhook,\n};\n\nconst PLATFORM_LABEL: Record<ChannelPlatform, string> = {\n telegram: \"Telegram\",\n discord: \"Discord\",\n slack: \"Slack\",\n whatsapp: \"WhatsApp\",\n webhook: \"Webhook\",\n mcp: \"MCP\",\n};\n\nconst STATUS_CONFIG: Record<ChannelStatus, { label: string; class: string }> = {\n connected: { label: \"Connected\", class: \"border-success/40 bg-success/15 text-success\" },\n connecting: {\n label: \"Connecting\",\n class: \"border-primary/40 bg-primary/15 text-primary animate-pulse\",\n },\n disconnected: {\n label: \"Disconnected\",\n class: \"border-muted-foreground/40 bg-muted/40 text-muted-foreground\",\n },\n error: { label: \"Error\", class: \"border-destructive/40 bg-destructive/15 text-destructive\" },\n};\n\ninterface ChannelCardProps extends HTMLAttributes<HTMLElement> {\n channel: Channel;\n onConfigure?: (id: string) => void;\n onToggle?: (id: string, enabled: boolean) => void;\n}\n\n/**\n * ChannelCard — inbound gateway connection (Telegram, Discord, Slack, …)\n * showing its connection status, platform, and inline controls.\n *\n * EC absorbed: the toggle reflects the *current* status. \"connected\" implies\n * enabled (toggle off disconnects); \"disconnected\"/\"error\" implies disabled\n * (toggle on reconnects). \"connecting\" is a transient state — toggle is a\n * no-op (button disabled).\n */\nconst ChannelCard = forwardRef<HTMLElement, ChannelCardProps>(\n ({ className, channel, onConfigure, onToggle, ...props }, ref) => {\n const cfg = STATUS_CONFIG[channel.status];\n const Icon = PLATFORM_ICON[channel.platform];\n const enabled = channel.status === \"connected\";\n const togglePending = channel.status === \"connecting\";\n\n return (\n <article\n data-slot=\"channel-card\"\n ref={ref}\n className={cn(\"grid gap-3 rounded-xl border border-border bg-card p-4\", className)}\n aria-label={`Channel ${channel.name}`}\n {...props}\n >\n <header className=\"flex items-start justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <Icon className=\"size-4 shrink-0 text-primary\" aria-hidden=\"true\" />\n <div className=\"min-w-0\">\n <h4 className=\"font-medium font-mono text-body-sm text-foreground\">{channel.name}</h4>\n <p className=\"truncate font-mono text-label text-muted-foreground\">\n {PLATFORM_LABEL[channel.platform]}\n </p>\n </div>\n </div>\n <span\n className={cn(\n \"inline-flex shrink-0 items-center rounded-full border px-2.5 py-0.5\",\n \"font-mono text-label uppercase tracking-wider\",\n cfg.class,\n )}\n >\n {cfg.label}\n </span>\n </header>\n\n {channel.description ? (\n <p className=\"font-sans text-body-sm text-muted-foreground\">{channel.description}</p>\n ) : null}\n\n {(channel.lastSeen !== undefined || channel.messageCount !== undefined) && (\n <dl className=\"grid grid-cols-2 gap-2 font-mono text-label\">\n {channel.lastSeen !== undefined ? (\n <div>\n <dt className=\"text-muted-foreground uppercase tracking-wider\">Last seen</dt>\n <dd className=\"text-foreground\">{channel.lastSeen}</dd>\n </div>\n ) : null}\n {channel.messageCount !== undefined ? (\n <div>\n <dt className=\"text-muted-foreground uppercase tracking-wider\">Messages</dt>\n <dd className=\"text-foreground\">{channel.messageCount.toLocaleString()}</dd>\n </div>\n ) : null}\n </dl>\n )}\n\n <footer className=\"flex items-center justify-end gap-1.5\">\n {onConfigure ? (\n <button\n type=\"button\"\n onClick={() => onConfigure(channel.id)}\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border/60 bg-card px-2.5 py-1 font-mono text-label hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Settings className=\"size-3\" /> Configure\n </button>\n ) : null}\n {onToggle ? (\n <button\n type=\"button\"\n onClick={() => onToggle(channel.id, !enabled)}\n disabled={togglePending}\n aria-pressed={enabled}\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-md border border-border/60 bg-card px-2.5 py-1 font-mono text-label hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n togglePending && \"cursor-not-allowed opacity-60\",\n enabled && \"text-success\",\n )}\n >\n <Power className=\"size-3\" />\n {enabled ? \"Disconnect\" : \"Connect\"}\n </button>\n ) : null}\n </footer>\n </article>\n );\n },\n);\nChannelCard.displayName = \"ChannelCard\";\n\nexport { ChannelCard };\n"]}