@mieweb/ui 0.8.0 → 0.9.0-dev.1

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 (384) hide show
  1. package/README.md +162 -739
  2. package/agent/mieweb-ui.instructions.md +34 -16
  3. package/dist/Animated-Cs-naa2g.d.cts +175 -0
  4. package/dist/Animated-Cs-naa2g.d.ts +175 -0
  5. package/dist/CsvBlock-D7Z6ZCRP.js +6 -0
  6. package/dist/{CsvBlock-PUSTBQ5B.js.map → CsvBlock-D7Z6ZCRP.js.map} +1 -1
  7. package/dist/CsvBlock-QXXZ7ZUM.cjs +15 -0
  8. package/dist/{CsvBlock-OTFG3PYZ.cjs.map → CsvBlock-QXXZ7ZUM.cjs.map} +1 -1
  9. package/dist/HtmlPreviewBlock-AADG7MVB.cjs +15 -0
  10. package/dist/{HtmlPreviewBlock-QHLSIMWJ.cjs.map → HtmlPreviewBlock-AADG7MVB.cjs.map} +1 -1
  11. package/dist/HtmlPreviewBlock-F5VDM2EN.js +6 -0
  12. package/dist/{HtmlPreviewBlock-YF2YVKKX.js.map → HtmlPreviewBlock-F5VDM2EN.js.map} +1 -1
  13. package/dist/MermaidBlock-6PLITRBZ.js +6 -0
  14. package/dist/{MermaidBlock-H3TWNC4D.js.map → MermaidBlock-6PLITRBZ.js.map} +1 -1
  15. package/dist/MermaidBlock-TQ2O5CLV.cjs +15 -0
  16. package/dist/{MermaidBlock-ZLLBO3VY.cjs.map → MermaidBlock-TQ2O5CLV.cjs.map} +1 -1
  17. package/dist/SurveyBlock-OYL3VNU5.cjs +15 -0
  18. package/dist/{SurveyBlock-M2ZRTGVJ.cjs.map → SurveyBlock-OYL3VNU5.cjs.map} +1 -1
  19. package/dist/SurveyBlock-W5PSQ62F.js +6 -0
  20. package/dist/{SurveyBlock-JLHS3YQD.js.map → SurveyBlock-W5PSQ62F.js.map} +1 -1
  21. package/dist/ag-grid.cjs +5 -5
  22. package/dist/ag-grid.js +1 -1
  23. package/dist/brands/index.cjs +7 -7
  24. package/dist/brands/index.js +2 -2
  25. package/dist/{chunk-XS35KPBZ.cjs → chunk-2A2FLQJC.cjs} +1140 -14
  26. package/dist/chunk-2A2FLQJC.cjs.map +1 -0
  27. package/dist/{chunk-OTQ72WX3.js → chunk-2BPIVWAK.js} +3 -3
  28. package/dist/{chunk-OTQ72WX3.js.map → chunk-2BPIVWAK.js.map} +1 -1
  29. package/dist/{chunk-6EWJGRC3.js → chunk-3JWAABYI.js} +6 -6
  30. package/dist/chunk-3JWAABYI.js.map +1 -0
  31. package/dist/{chunk-5JZIDILK.cjs → chunk-3LHICE4I.cjs} +6 -6
  32. package/dist/chunk-3LHICE4I.cjs.map +1 -0
  33. package/dist/{chunk-JHZW3Y62.js → chunk-3RB35GYK.js} +5 -5
  34. package/dist/chunk-3RB35GYK.js.map +1 -0
  35. package/dist/{chunk-BOW7ZGI2.cjs → chunk-4SM3I7WE.cjs} +170 -10
  36. package/dist/chunk-4SM3I7WE.cjs.map +1 -0
  37. package/dist/{chunk-QHTDWIED.js → chunk-5H7SAEQO.js} +5 -5
  38. package/dist/{chunk-QHTDWIED.js.map → chunk-5H7SAEQO.js.map} +1 -1
  39. package/dist/chunk-5VXRKOPR.cjs +735 -0
  40. package/dist/chunk-5VXRKOPR.cjs.map +1 -0
  41. package/dist/{chunk-EMMYFHOT.js → chunk-5WOB4UBD.js} +3 -3
  42. package/dist/{chunk-EMMYFHOT.js.map → chunk-5WOB4UBD.js.map} +1 -1
  43. package/dist/{chunk-4CUFXCC5.cjs → chunk-5Z6UPVGC.cjs} +6 -6
  44. package/dist/{chunk-4CUFXCC5.cjs.map → chunk-5Z6UPVGC.cjs.map} +1 -1
  45. package/dist/{chunk-YIXTGWT4.cjs → chunk-6QKMMKRY.cjs} +5 -5
  46. package/dist/{chunk-YIXTGWT4.cjs.map → chunk-6QKMMKRY.cjs.map} +1 -1
  47. package/dist/{chunk-F57VRLKP.js → chunk-6SAYPXHX.js} +4 -4
  48. package/dist/{chunk-F57VRLKP.js.map → chunk-6SAYPXHX.js.map} +1 -1
  49. package/dist/{chunk-SK7H3Z67.cjs → chunk-6XDPJWSC.cjs} +99 -83
  50. package/dist/chunk-6XDPJWSC.cjs.map +1 -0
  51. package/dist/{chunk-4AE2L6AO.cjs → chunk-7FTBPLA6.cjs} +8 -8
  52. package/dist/chunk-7FTBPLA6.cjs.map +1 -0
  53. package/dist/{chunk-KVE7PQ5P.cjs → chunk-7KN6J7XV.cjs} +20 -20
  54. package/dist/{chunk-KVE7PQ5P.cjs.map → chunk-7KN6J7XV.cjs.map} +1 -1
  55. package/dist/{chunk-K4S4FAYX.cjs → chunk-AHINB2TP.cjs} +11 -11
  56. package/dist/{chunk-K4S4FAYX.cjs.map → chunk-AHINB2TP.cjs.map} +1 -1
  57. package/dist/{chunk-MYFZYUPR.cjs → chunk-AOHJILLU.cjs} +38 -3
  58. package/dist/chunk-AOHJILLU.cjs.map +1 -0
  59. package/dist/chunk-BKSPDTX4.js +3 -0
  60. package/dist/{chunk-3PXOIAF6.js.map → chunk-BKSPDTX4.js.map} +1 -1
  61. package/dist/chunk-BN75TLUN.cjs +163 -0
  62. package/dist/chunk-BN75TLUN.cjs.map +1 -0
  63. package/dist/{chunk-WWJIW2IH.cjs → chunk-BVMABVC4.cjs} +3 -3
  64. package/dist/{chunk-WWJIW2IH.cjs.map → chunk-BVMABVC4.cjs.map} +1 -1
  65. package/dist/{chunk-H7QSGFMZ.cjs → chunk-BZAGP5W6.cjs} +17 -10
  66. package/dist/chunk-BZAGP5W6.cjs.map +1 -0
  67. package/dist/{chunk-RS5VA6QU.cjs → chunk-C3DUS2VE.cjs} +3 -3
  68. package/dist/{chunk-RS5VA6QU.cjs.map → chunk-C3DUS2VE.cjs.map} +1 -1
  69. package/dist/{chunk-NLBT5O2X.js → chunk-CK3KLRNF.js} +3 -3
  70. package/dist/{chunk-NLBT5O2X.js.map → chunk-CK3KLRNF.js.map} +1 -1
  71. package/dist/{chunk-L6D4CKLV.cjs → chunk-CXDMZT45.cjs} +135 -4
  72. package/dist/chunk-CXDMZT45.cjs.map +1 -0
  73. package/dist/{chunk-TXRQQMG5.js → chunk-CYMZ2QS5.js} +2 -2
  74. package/dist/{chunk-TXRQQMG5.js.map → chunk-CYMZ2QS5.js.map} +1 -1
  75. package/dist/{chunk-DX64KLSN.js → chunk-D25WH7MH.js} +7 -7
  76. package/dist/{chunk-DX64KLSN.js.map → chunk-D25WH7MH.js.map} +1 -1
  77. package/dist/{chunk-XBKOZRDO.js → chunk-DFYMIRMW.js} +4 -4
  78. package/dist/{chunk-XBKOZRDO.js.map → chunk-DFYMIRMW.js.map} +1 -1
  79. package/dist/{chunk-AESFOMSH.js → chunk-DGRXAIWK.js} +135 -4
  80. package/dist/chunk-DGRXAIWK.js.map +1 -0
  81. package/dist/{chunk-UZ5NGGMI.js → chunk-EG7XFZ3W.js} +4 -4
  82. package/dist/{chunk-UZ5NGGMI.js.map → chunk-EG7XFZ3W.js.map} +1 -1
  83. package/dist/{chunk-LQHI44OZ.cjs → chunk-FUFBRKOG.cjs} +59 -59
  84. package/dist/{chunk-LQHI44OZ.cjs.map → chunk-FUFBRKOG.cjs.map} +1 -1
  85. package/dist/{chunk-DG7KE4YJ.cjs → chunk-FYAKUU2A.cjs} +38 -21
  86. package/dist/chunk-FYAKUU2A.cjs.map +1 -0
  87. package/dist/{chunk-7L7OPISJ.cjs → chunk-H4AVMUOC.cjs} +12 -6
  88. package/dist/chunk-H4AVMUOC.cjs.map +1 -0
  89. package/dist/{chunk-I2ECTLON.cjs → chunk-HXSA6QC5.cjs} +3 -3
  90. package/dist/{chunk-I2ECTLON.cjs.map → chunk-HXSA6QC5.cjs.map} +1 -1
  91. package/dist/{chunk-DCBMTFLE.js → chunk-HZ4MBUC3.js} +3 -3
  92. package/dist/{chunk-DCBMTFLE.js.map → chunk-HZ4MBUC3.js.map} +1 -1
  93. package/dist/{chunk-X5ZPYYMS.js → chunk-I3DQXUSC.js} +3 -3
  94. package/dist/{chunk-X5ZPYYMS.js.map → chunk-I3DQXUSC.js.map} +1 -1
  95. package/dist/{chunk-FN6VHMLM.cjs → chunk-IB54SKWB.cjs} +8 -8
  96. package/dist/{chunk-FN6VHMLM.cjs.map → chunk-IB54SKWB.cjs.map} +1 -1
  97. package/dist/chunk-IF3X2WZP.js +705 -0
  98. package/dist/chunk-IF3X2WZP.js.map +1 -0
  99. package/dist/{chunk-JP5SGIXA.cjs → chunk-IFDC4TXM.cjs} +4 -4
  100. package/dist/{chunk-JP5SGIXA.cjs.map → chunk-IFDC4TXM.cjs.map} +1 -1
  101. package/dist/{chunk-RDGRKYQ5.cjs → chunk-IINZWUGK.cjs} +58 -6
  102. package/dist/chunk-IINZWUGK.cjs.map +1 -0
  103. package/dist/{chunk-U3JU6BI5.cjs → chunk-JEIW7BSV.cjs} +3 -3
  104. package/dist/{chunk-U3JU6BI5.cjs.map → chunk-JEIW7BSV.cjs.map} +1 -1
  105. package/dist/{chunk-RZJXCI53.js → chunk-KATEJG2F.js} +1138 -14
  106. package/dist/chunk-KATEJG2F.js.map +1 -0
  107. package/dist/{chunk-D2GID3YK.js → chunk-KREUYVMZ.js} +58 -6
  108. package/dist/chunk-KREUYVMZ.js.map +1 -0
  109. package/dist/{chunk-Y6YSJPVC.js → chunk-KRU6IGV7.js} +11 -3
  110. package/dist/chunk-KRU6IGV7.js.map +1 -0
  111. package/dist/{chunk-LZU7YBXG.js → chunk-KU3XRHWA.js} +169 -10
  112. package/dist/chunk-KU3XRHWA.js.map +1 -0
  113. package/dist/{chunk-P2VTQ5AR.cjs → chunk-L52N6BEN.cjs} +39 -23
  114. package/dist/chunk-L52N6BEN.cjs.map +1 -0
  115. package/dist/{chunk-XWYKLEKG.js → chunk-L5W7TJQ5.js} +11 -5
  116. package/dist/chunk-L5W7TJQ5.js.map +1 -0
  117. package/dist/{chunk-PAM5UUBL.cjs → chunk-L7L5S2HO.cjs} +18 -2
  118. package/dist/{chunk-PAM5UUBL.cjs.map → chunk-L7L5S2HO.cjs.map} +1 -1
  119. package/dist/{chunk-SEPYBAML.js → chunk-LAEIVOIY.js} +38 -21
  120. package/dist/chunk-LAEIVOIY.js.map +1 -0
  121. package/dist/{chunk-Z5KFXHDP.cjs → chunk-MM7QKUE3.cjs} +5 -5
  122. package/dist/{chunk-Z5KFXHDP.cjs.map → chunk-MM7QKUE3.cjs.map} +1 -1
  123. package/dist/{chunk-FJ7YPVKV.js → chunk-MUIDWFYJ.js} +3 -3
  124. package/dist/{chunk-FJ7YPVKV.js.map → chunk-MUIDWFYJ.js.map} +1 -1
  125. package/dist/{chunk-YMHOF6WA.cjs → chunk-MYAU2ZUC.cjs} +3 -3
  126. package/dist/{chunk-YMHOF6WA.cjs.map → chunk-MYAU2ZUC.cjs.map} +1 -1
  127. package/dist/{chunk-5J5PEUUA.js → chunk-NHN6A3ZO.js} +6 -6
  128. package/dist/{chunk-5J5PEUUA.js.map → chunk-NHN6A3ZO.js.map} +1 -1
  129. package/dist/{chunk-EPQPUFS6.cjs → chunk-NYJIXR4Y.cjs} +6 -6
  130. package/dist/chunk-NYJIXR4Y.cjs.map +1 -0
  131. package/dist/{chunk-RYQ3S3KO.cjs → chunk-O425FKDI.cjs} +581 -70
  132. package/dist/chunk-O425FKDI.cjs.map +1 -0
  133. package/dist/{chunk-WIYQI35R.cjs → chunk-O7XHHTTP.cjs} +8 -8
  134. package/dist/{chunk-WIYQI35R.cjs.map → chunk-O7XHHTTP.cjs.map} +1 -1
  135. package/dist/{chunk-IILJGFI5.js → chunk-OAZUDUGX.js} +8 -6
  136. package/dist/chunk-OAZUDUGX.js.map +1 -0
  137. package/dist/{chunk-JHGMZX4I.cjs → chunk-OCV33S5Q.cjs} +6 -6
  138. package/dist/{chunk-JHGMZX4I.cjs.map → chunk-OCV33S5Q.cjs.map} +1 -1
  139. package/dist/{chunk-IYXCFIMP.js → chunk-ODYQYLO2.js} +33 -17
  140. package/dist/chunk-ODYQYLO2.js.map +1 -0
  141. package/dist/{chunk-FPVRQCCL.js → chunk-OHDIJOGG.js} +4 -4
  142. package/dist/{chunk-FPVRQCCL.js.map → chunk-OHDIJOGG.js.map} +1 -1
  143. package/dist/{chunk-GQVL2JKQ.cjs → chunk-OHKO5THF.cjs} +3 -3
  144. package/dist/{chunk-GQVL2JKQ.cjs.map → chunk-OHKO5THF.cjs.map} +1 -1
  145. package/dist/{chunk-LMBXJZLG.js → chunk-ON4JULCA.js} +3 -3
  146. package/dist/{chunk-LMBXJZLG.js.map → chunk-ON4JULCA.js.map} +1 -1
  147. package/dist/{chunk-A5YOIJKL.js → chunk-ONNY7UO4.js} +15 -15
  148. package/dist/{chunk-A5YOIJKL.js.map → chunk-ONNY7UO4.js.map} +1 -1
  149. package/dist/{chunk-DWCYEPTT.js → chunk-OSPTA4UR.js} +4 -4
  150. package/dist/{chunk-DWCYEPTT.js.map → chunk-OSPTA4UR.js.map} +1 -1
  151. package/dist/{chunk-FDUA6OGN.js → chunk-PFKRHNYV.js} +8 -8
  152. package/dist/chunk-PFKRHNYV.js.map +1 -0
  153. package/dist/{chunk-XMECP2MD.js → chunk-PHK4XBO5.js} +4 -4
  154. package/dist/{chunk-XMECP2MD.js.map → chunk-PHK4XBO5.js.map} +1 -1
  155. package/dist/{chunk-ZZJ4ZVYR.cjs → chunk-PJ6CC53R.cjs} +3 -3
  156. package/dist/{chunk-ZZJ4ZVYR.cjs.map → chunk-PJ6CC53R.cjs.map} +1 -1
  157. package/dist/{chunk-N3Y43KOB.js → chunk-PYHFVYVZ.js} +12 -5
  158. package/dist/chunk-PYHFVYVZ.js.map +1 -0
  159. package/dist/{chunk-XMCIXHGH.js → chunk-Q7G56ZIO.js} +39 -23
  160. package/dist/chunk-Q7G56ZIO.js.map +1 -0
  161. package/dist/{chunk-4PIW3Y5M.js → chunk-QAKASRE6.js} +34 -26
  162. package/dist/chunk-QAKASRE6.js.map +1 -0
  163. package/dist/{chunk-QGZC43L7.js → chunk-QAQOCS2J.js} +5 -5
  164. package/dist/{chunk-QGZC43L7.js.map → chunk-QAQOCS2J.js.map} +1 -1
  165. package/dist/{chunk-YVIH26FG.cjs → chunk-QKAYRHWP.cjs} +12 -12
  166. package/dist/{chunk-YVIH26FG.cjs.map → chunk-QKAYRHWP.cjs.map} +1 -1
  167. package/dist/{chunk-FDV7EQWH.js → chunk-RPG2ZP2T.js} +575 -68
  168. package/dist/chunk-RPG2ZP2T.js.map +1 -0
  169. package/dist/{chunk-P3JEMF6E.cjs → chunk-RSCA5AZW.cjs} +4 -4
  170. package/dist/{chunk-P3JEMF6E.cjs.map → chunk-RSCA5AZW.cjs.map} +1 -1
  171. package/dist/{chunk-5Y5FSR4N.js → chunk-SCXELRRZ.js} +3 -3
  172. package/dist/{chunk-5Y5FSR4N.js.map → chunk-SCXELRRZ.js.map} +1 -1
  173. package/dist/{chunk-JWTCEWQ4.cjs → chunk-SNEQXSC5.cjs} +2 -2
  174. package/dist/{chunk-JWTCEWQ4.cjs.map → chunk-SNEQXSC5.cjs.map} +1 -1
  175. package/dist/{chunk-U5TTXN45.cjs → chunk-SRA2L3SQ.cjs} +9 -7
  176. package/dist/chunk-SRA2L3SQ.cjs.map +1 -0
  177. package/dist/{chunk-5U6GETAW.js → chunk-TQDZLRIE.js} +3 -3
  178. package/dist/chunk-TQDZLRIE.js.map +1 -0
  179. package/dist/{chunk-HK3AMH3Q.cjs → chunk-VROIMIHB.cjs} +11 -3
  180. package/dist/chunk-VROIMIHB.cjs.map +1 -0
  181. package/dist/{chunk-3SHLOF4V.cjs → chunk-VTR2KGLY.cjs} +9 -9
  182. package/dist/{chunk-3SHLOF4V.cjs.map → chunk-VTR2KGLY.cjs.map} +1 -1
  183. package/dist/{chunk-XO3WLK65.js → chunk-VVDE4CHU.js} +3 -3
  184. package/dist/{chunk-XO3WLK65.js.map → chunk-VVDE4CHU.js.map} +1 -1
  185. package/dist/{chunk-BOOJDRJO.js → chunk-WSNMQQ4P.js} +38 -3
  186. package/dist/chunk-WSNMQQ4P.js.map +1 -0
  187. package/dist/chunk-WYMO3IIK.js +136 -0
  188. package/dist/chunk-WYMO3IIK.js.map +1 -0
  189. package/dist/{chunk-SPWVKDGC.cjs → chunk-X5QRRMGB.cjs} +35 -27
  190. package/dist/chunk-X5QRRMGB.cjs.map +1 -0
  191. package/dist/{chunk-SH6B4MG5.js → chunk-XBXDUAIM.js} +4 -4
  192. package/dist/{chunk-SH6B4MG5.js.map → chunk-XBXDUAIM.js.map} +1 -1
  193. package/dist/{chunk-56QJHQ5C.cjs → chunk-XEEVDZDK.cjs} +5 -5
  194. package/dist/{chunk-56QJHQ5C.cjs.map → chunk-XEEVDZDK.cjs.map} +1 -1
  195. package/dist/{chunk-GXODR6V4.js → chunk-XOIIUO6O.js} +3 -3
  196. package/dist/{chunk-GXODR6V4.js.map → chunk-XOIIUO6O.js.map} +1 -1
  197. package/dist/{chunk-ELYGV32O.cjs → chunk-XTHMC76F.cjs} +5 -5
  198. package/dist/{chunk-ELYGV32O.cjs.map → chunk-XTHMC76F.cjs.map} +1 -1
  199. package/dist/{chunk-FF235PKY.cjs → chunk-XWZEECEX.cjs} +3 -3
  200. package/dist/chunk-XWZEECEX.cjs.map +1 -0
  201. package/dist/{chunk-TVLZZI5Q.cjs → chunk-YJP6DUFO.cjs} +9 -9
  202. package/dist/{chunk-TVLZZI5Q.cjs.map → chunk-YJP6DUFO.cjs.map} +1 -1
  203. package/dist/{chunk-EHQ77LL5.js → chunk-ZB54MTMQ.js} +3 -3
  204. package/dist/{chunk-EHQ77LL5.js.map → chunk-ZB54MTMQ.js.map} +1 -1
  205. package/dist/components/Accordion/index.cjs +2 -2
  206. package/dist/components/Accordion/index.js +1 -1
  207. package/dist/components/Alert/index.cjs +5 -5
  208. package/dist/components/Alert/index.d.cts +1 -1
  209. package/dist/components/Alert/index.d.ts +1 -1
  210. package/dist/components/Alert/index.js +1 -1
  211. package/dist/components/AlertDialog/index.cjs +6 -5
  212. package/dist/components/AlertDialog/index.js +5 -4
  213. package/dist/components/AudioPlayer/index.cjs +6 -6
  214. package/dist/components/AudioPlayer/index.js +1 -1
  215. package/dist/components/Autocomplete/index.cjs +4 -4
  216. package/dist/components/Autocomplete/index.js +3 -3
  217. package/dist/components/Avatar/index.cjs +5 -5
  218. package/dist/components/Avatar/index.js +1 -1
  219. package/dist/components/Badge/index.d.cts +1 -1
  220. package/dist/components/Badge/index.d.ts +1 -1
  221. package/dist/components/Breadcrumb/index.cjs +3 -3
  222. package/dist/components/Breadcrumb/index.js +1 -1
  223. package/dist/components/Button/index.cjs +3 -3
  224. package/dist/components/Button/index.js +1 -1
  225. package/dist/components/Card/index.d.cts +2 -2
  226. package/dist/components/Card/index.d.ts +2 -2
  227. package/dist/components/CountryCodeDropdown/index.cjs +6 -6
  228. package/dist/components/CountryCodeDropdown/index.d.cts +11 -1
  229. package/dist/components/CountryCodeDropdown/index.d.ts +11 -1
  230. package/dist/components/CountryCodeDropdown/index.js +3 -3
  231. package/dist/components/CustomizableDashboard/index.cjs +11 -11
  232. package/dist/components/CustomizableDashboard/index.js +4 -4
  233. package/dist/components/DateInput/index.cjs +4 -4
  234. package/dist/components/DateInput/index.js +3 -3
  235. package/dist/components/Dropdown/index.cjs +13 -9
  236. package/dist/components/Dropdown/index.d.cts +38 -2
  237. package/dist/components/Dropdown/index.d.ts +38 -2
  238. package/dist/components/Dropdown/index.js +3 -3
  239. package/dist/components/FloatingWindow/index.cjs +4 -4
  240. package/dist/components/FloatingWindow/index.js +2 -2
  241. package/dist/components/GlossaryTooltip/index.cjs +4 -4
  242. package/dist/components/GlossaryTooltip/index.js +3 -3
  243. package/dist/components/KeyboardShortcutsOverlay/index.cjs +6 -5
  244. package/dist/components/KeyboardShortcutsOverlay/index.js +4 -3
  245. package/dist/components/Markdown/index.cjs +19 -19
  246. package/dist/components/Markdown/index.js +7 -7
  247. package/dist/components/MediaEditor/index.cjs +15 -14
  248. package/dist/components/MediaEditor/index.js +10 -9
  249. package/dist/components/MediaPlayer/index.cjs +6 -6
  250. package/dist/components/MediaPlayer/index.js +3 -3
  251. package/dist/components/Modal/index.cjs +11 -10
  252. package/dist/components/Modal/index.d.cts +1 -1
  253. package/dist/components/Modal/index.d.ts +1 -1
  254. package/dist/components/Modal/index.js +3 -2
  255. package/dist/components/Pagination/index.cjs +4 -4
  256. package/dist/components/Pagination/index.d.cts +1 -1
  257. package/dist/components/Pagination/index.d.ts +1 -1
  258. package/dist/components/Pagination/index.js +1 -1
  259. package/dist/components/PhoneInput/index.cjs +4 -4
  260. package/dist/components/PhoneInput/index.js +2 -2
  261. package/dist/components/Progress/index.d.cts +1 -1
  262. package/dist/components/Progress/index.d.ts +1 -1
  263. package/dist/components/QuickAction/index.cjs +6 -6
  264. package/dist/components/QuickAction/index.js +1 -1
  265. package/dist/components/RecordButton/index.d.cts +1 -1
  266. package/dist/components/RecordButton/index.d.ts +1 -1
  267. package/dist/components/RichTextEditor/index.cjs +9 -9
  268. package/dist/components/RichTextEditor/index.js +6 -6
  269. package/dist/components/SectionSpyNav/index.cjs +4 -4
  270. package/dist/components/SectionSpyNav/index.js +3 -3
  271. package/dist/components/Select/index.cjs +5 -5
  272. package/dist/components/Select/index.js +3 -3
  273. package/dist/components/Sheet/index.cjs +11 -11
  274. package/dist/components/Sheet/index.js +2 -2
  275. package/dist/components/Slider/index.cjs +5 -5
  276. package/dist/components/Slider/index.d.cts +2 -2
  277. package/dist/components/Slider/index.d.ts +2 -2
  278. package/dist/components/Slider/index.js +1 -1
  279. package/dist/components/SourceTip/index.cjs +4 -4
  280. package/dist/components/SourceTip/index.js +3 -3
  281. package/dist/components/SuperChat/index.cjs +292 -115
  282. package/dist/components/SuperChat/index.cjs.map +1 -1
  283. package/dist/components/SuperChat/index.d.cts +29 -8
  284. package/dist/components/SuperChat/index.d.ts +29 -8
  285. package/dist/components/SuperChat/index.js +284 -107
  286. package/dist/components/SuperChat/index.js.map +1 -1
  287. package/dist/components/SuperChat/plugins/index.cjs +7 -7
  288. package/dist/components/SuperChat/plugins/index.cjs.map +1 -1
  289. package/dist/components/SuperChat/plugins/index.d.cts +2 -2
  290. package/dist/components/SuperChat/plugins/index.d.ts +2 -2
  291. package/dist/components/SuperChat/plugins/index.js +6 -6
  292. package/dist/components/SuperChat/plugins/index.js.map +1 -1
  293. package/dist/components/Text/index.d.cts +1 -1
  294. package/dist/components/Text/index.d.ts +1 -1
  295. package/dist/components/ThemeProvider/index.cjs +9 -9
  296. package/dist/components/ThemeProvider/index.d.cts +1 -1
  297. package/dist/components/ThemeProvider/index.d.ts +1 -1
  298. package/dist/components/ThemeProvider/index.js +3 -3
  299. package/dist/components/Toggle/index.d.cts +1 -1
  300. package/dist/components/Toggle/index.d.ts +1 -1
  301. package/dist/components/Tooltip/index.cjs +3 -3
  302. package/dist/components/Tooltip/index.js +2 -2
  303. package/dist/components/TranscriptView/index.cjs +3 -3
  304. package/dist/components/TranscriptView/index.js +1 -1
  305. package/dist/datavis.cjs +2 -2
  306. package/dist/datavis.js +1 -1
  307. package/dist/esheet.cjs +15 -14
  308. package/dist/esheet.cjs.map +1 -1
  309. package/dist/esheet.js +12 -11
  310. package/dist/esheet.js.map +1 -1
  311. package/dist/hooks/index.cjs +3 -3
  312. package/dist/hooks/index.d.cts +1 -1
  313. package/dist/hooks/index.d.ts +1 -1
  314. package/dist/hooks/index.js +2 -2
  315. package/dist/index.cjs +2509 -2860
  316. package/dist/index.cjs.map +1 -1
  317. package/dist/index.d.cts +278 -43
  318. package/dist/index.d.ts +278 -43
  319. package/dist/index.js +1305 -1700
  320. package/dist/index.js.map +1 -1
  321. package/dist/motion.cjs +87 -0
  322. package/dist/motion.cjs.map +1 -0
  323. package/dist/motion.d.cts +52 -0
  324. package/dist/motion.d.ts +52 -0
  325. package/dist/motion.js +50 -0
  326. package/dist/motion.js.map +1 -0
  327. package/dist/styles/init.css +25 -0
  328. package/dist/styles.css +1 -1
  329. package/dist/tailwind-preset.cjs +4 -4
  330. package/dist/tailwind-preset.js +1 -1
  331. package/dist/{types-BoTeTPdH.d.ts → types-9vK_YdEb.d.ts} +12 -1
  332. package/dist/{types-DyIB9HYT.d.cts → types-DZDroUW8.d.cts} +12 -1
  333. package/dist/{useAnchoredPosition-C7PNglzD.d.ts → useAnchoredPosition-CKwLSQW8.d.cts} +10 -3
  334. package/dist/{useAnchoredPosition-C7PNglzD.d.cts → useAnchoredPosition-CKwLSQW8.d.ts} +10 -3
  335. package/package.json +21 -2
  336. package/dist/CsvBlock-OTFG3PYZ.cjs +0 -15
  337. package/dist/CsvBlock-PUSTBQ5B.js +0 -6
  338. package/dist/HtmlPreviewBlock-QHLSIMWJ.cjs +0 -15
  339. package/dist/HtmlPreviewBlock-YF2YVKKX.js +0 -6
  340. package/dist/MermaidBlock-H3TWNC4D.js +0 -6
  341. package/dist/MermaidBlock-ZLLBO3VY.cjs +0 -15
  342. package/dist/SurveyBlock-JLHS3YQD.js +0 -6
  343. package/dist/SurveyBlock-M2ZRTGVJ.cjs +0 -15
  344. package/dist/chunk-26DPQUSB.cjs +0 -1177
  345. package/dist/chunk-26DPQUSB.cjs.map +0 -1
  346. package/dist/chunk-3PXOIAF6.js +0 -3
  347. package/dist/chunk-4AE2L6AO.cjs.map +0 -1
  348. package/dist/chunk-4PIW3Y5M.js.map +0 -1
  349. package/dist/chunk-5JZIDILK.cjs.map +0 -1
  350. package/dist/chunk-5U6GETAW.js.map +0 -1
  351. package/dist/chunk-6EWJGRC3.js.map +0 -1
  352. package/dist/chunk-7L7OPISJ.cjs.map +0 -1
  353. package/dist/chunk-AESFOMSH.js.map +0 -1
  354. package/dist/chunk-BOOJDRJO.js.map +0 -1
  355. package/dist/chunk-BOW7ZGI2.cjs.map +0 -1
  356. package/dist/chunk-D2GID3YK.js.map +0 -1
  357. package/dist/chunk-DG7KE4YJ.cjs.map +0 -1
  358. package/dist/chunk-EKRT7K2K.js +0 -1145
  359. package/dist/chunk-EKRT7K2K.js.map +0 -1
  360. package/dist/chunk-EPQPUFS6.cjs.map +0 -1
  361. package/dist/chunk-FDUA6OGN.js.map +0 -1
  362. package/dist/chunk-FDV7EQWH.js.map +0 -1
  363. package/dist/chunk-FF235PKY.cjs.map +0 -1
  364. package/dist/chunk-H7QSGFMZ.cjs.map +0 -1
  365. package/dist/chunk-HK3AMH3Q.cjs.map +0 -1
  366. package/dist/chunk-IILJGFI5.js.map +0 -1
  367. package/dist/chunk-IYXCFIMP.js.map +0 -1
  368. package/dist/chunk-JHZW3Y62.js.map +0 -1
  369. package/dist/chunk-L6D4CKLV.cjs.map +0 -1
  370. package/dist/chunk-LZU7YBXG.js.map +0 -1
  371. package/dist/chunk-MYFZYUPR.cjs.map +0 -1
  372. package/dist/chunk-N3Y43KOB.js.map +0 -1
  373. package/dist/chunk-P2VTQ5AR.cjs.map +0 -1
  374. package/dist/chunk-RDGRKYQ5.cjs.map +0 -1
  375. package/dist/chunk-RYQ3S3KO.cjs.map +0 -1
  376. package/dist/chunk-RZJXCI53.js.map +0 -1
  377. package/dist/chunk-SEPYBAML.js.map +0 -1
  378. package/dist/chunk-SK7H3Z67.cjs.map +0 -1
  379. package/dist/chunk-SPWVKDGC.cjs.map +0 -1
  380. package/dist/chunk-U5TTXN45.cjs.map +0 -1
  381. package/dist/chunk-XMCIXHGH.js.map +0 -1
  382. package/dist/chunk-XS35KPBZ.cjs.map +0 -1
  383. package/dist/chunk-XWYKLEKG.js.map +0 -1
  384. package/dist/chunk-Y6YSJPVC.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/Messaging/MessageBubble.tsx","../src/components/Messaging/MessageList.tsx","../src/components/Messaging/ConversationHeader.tsx","../src/components/Messaging/MessageThread.tsx","../src/components/Messaging/hooks.ts"],"names":["cva","jsxs","cn","jsx","React","React2","React3","React4","DragDropZone","MessageComposer","React5"],"mappings":"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","file":"chunk-RYQ3S3KO.cjs","sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport type {\n Message,\n MessageStatus,\n MessageAttachment,\n ReadReceipt,\n} from './types';\n\n// ============================================================================\n// Message Status Icon Component\n// ============================================================================\n\nconst statusIconVariants = cva(\n 'inline-flex items-center gap-0.5 text-current',\n {\n variants: {\n status: {\n sending: 'text-neutral-500',\n sent: 'text-neutral-500',\n delivered: 'text-muted-foreground',\n read: 'text-primary-800 dark:text-primary-300',\n failed: 'text-red-500',\n },\n },\n defaultVariants: {\n status: 'sent',\n },\n }\n);\n\nexport interface MessageStatusIconProps {\n status: MessageStatus;\n className?: string;\n}\n\n/**\n * Visual status indicator for messages (checkmarks).\n */\nfunction MessageStatusIcon({ status, className }: MessageStatusIconProps) {\n return (\n <span\n className={cn(statusIconVariants({ status }), className)}\n role=\"img\"\n aria-label={`Message ${status}`}\n >\n {status === 'sending' && (\n <svg\n aria-hidden=\"true\"\n className=\"h-3.5 w-3.5 animate-spin\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n />\n </svg>\n )}\n {status === 'sent' && (\n <svg\n aria-hidden=\"true\"\n className=\"h-3.5 w-3.5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n )}\n {(status === 'delivered' || status === 'read') && (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M5 13l4 4L19 7\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M12 13l4 4L26 7\"\n transform=\"translate(-5, 0)\"\n />\n </svg>\n )}\n {status === 'failed' && (\n <svg\n aria-hidden=\"true\"\n className=\"h-3.5 w-3.5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n )}\n </span>\n );\n}\n\n// ============================================================================\n// Read Receipt Indicator Component\n// ============================================================================\n\nexport interface ReadReceiptIndicatorProps {\n /** Read receipts to display */\n receipts: ReadReceipt[];\n /** Maximum avatars to show before +N */\n maxAvatars?: number;\n /** Size of avatars */\n size?: 'xs' | 'sm';\n className?: string;\n}\n\n/**\n * Displays read receipt avatars for group conversations.\n */\nfunction ReadReceiptIndicator({\n receipts,\n maxAvatars = 3,\n size = 'xs',\n className,\n}: ReadReceiptIndicatorProps) {\n if (receipts.length === 0) return null;\n\n const visibleReceipts = receipts.slice(0, maxAvatars);\n const remainingCount = receipts.length - maxAvatars;\n\n const sizeClasses = {\n xs: 'h-4 w-4 text-[8px]',\n sm: 'h-5 w-5 text-[10px]',\n };\n\n return (\n <div\n className={cn('flex items-center -space-x-1', className)}\n aria-label={`Read by ${receipts.map((r) => r.participant.name).join(', ')}`}\n >\n {visibleReceipts.map((receipt) => (\n <div\n key={receipt.participant.id}\n className={cn(\n 'rounded-full ring-2 ring-white dark:ring-neutral-900',\n 'bg-primary-800 font-medium text-white',\n 'flex items-center justify-center',\n sizeClasses[size]\n )}\n title={`Read by ${receipt.participant.name}`}\n >\n {receipt.participant.avatarUrl ? (\n <img\n src={receipt.participant.avatarUrl}\n alt={receipt.participant.name}\n className=\"h-full w-full rounded-full object-cover\"\n />\n ) : (\n receipt.participant.name.charAt(0).toUpperCase()\n )}\n </div>\n ))}\n {remainingCount > 0 && (\n <div\n className={cn(\n 'rounded-full ring-2 ring-white dark:ring-neutral-900',\n 'bg-neutral-500 font-medium text-white',\n 'flex items-center justify-center',\n sizeClasses[size]\n )}\n >\n +{remainingCount}\n </div>\n )}\n </div>\n );\n}\n\n// ============================================================================\n// Message Attachment Preview Component\n// ============================================================================\n\nexport interface AttachmentPreviewProps {\n attachment: MessageAttachment;\n onClick?: () => void;\n className?: string;\n}\n\n/**\n * Renders an attachment preview within a message bubble.\n */\nfunction AttachmentPreview({\n attachment,\n onClick,\n className,\n}: AttachmentPreviewProps) {\n const isImage = attachment.type === 'image';\n const isVideo = attachment.type === 'video';\n\n if (isImage || isVideo) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n 'relative block overflow-hidden rounded-lg',\n 'focus:ring-primary-500 focus:ring-2 focus:outline-none',\n 'transition-transform hover:scale-[1.02]',\n className\n )}\n aria-label={`View ${attachment.alt || attachment.filename}`}\n >\n <img\n src={attachment.thumbnailUrl || attachment.url}\n alt={attachment.alt || attachment.filename}\n className=\"max-h-64 w-auto rounded-lg object-cover\"\n loading=\"lazy\"\n />\n {isVideo && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-black/30\">\n <div className=\"rounded-full bg-white/90 p-3\">\n <svg\n aria-hidden=\"true\"\n className=\"h-6 w-6 text-neutral-900\"\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n </div>\n </div>\n )}\n {attachment.state === 'uploading' &&\n attachment.progress !== undefined && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-black/50\">\n <div className=\"text-center text-white\">\n <svg\n aria-hidden=\"true\"\n className=\"mx-auto h-8 w-8 animate-spin\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n />\n </svg>\n <span className=\"mt-1 text-sm\">{attachment.progress}%</span>\n </div>\n </div>\n )}\n {attachment.state === 'failed' && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-black/50\">\n <div className=\"text-center text-white\">\n <svg\n aria-hidden=\"true\"\n className=\"mx-auto h-8 w-8 text-red-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n <span className=\"mt-1 text-sm\">Upload failed</span>\n </div>\n </div>\n )}\n </button>\n );\n }\n\n // File/document attachment\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n 'flex items-center gap-3 rounded-lg p-3',\n 'bg-white/10 hover:bg-white/20',\n 'transition-colors',\n 'focus:ring-primary-500 focus:ring-2 focus:outline-none',\n className\n )}\n >\n <div className=\"rounded-lg bg-white/20 p-2\">\n <svg\n aria-hidden=\"true\"\n className=\"h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n </div>\n <div className=\"min-w-0 flex-1 text-left\">\n <p className=\"truncate text-sm font-medium\">{attachment.filename}</p>\n <p className=\"text-xs opacity-70\">{formatFileSize(attachment.size)}</p>\n </div>\n </button>\n );\n}\n\n/**\n * Format file size in human-readable format.\n */\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n// ============================================================================\n// Message Bubble Component\n// ============================================================================\n\nconst bubbleVariants = cva(\n [\n 'relative max-w-[85%] sm:max-w-[70%]',\n 'rounded-2xl px-4 py-2',\n 'transition-all duration-200',\n ],\n {\n variants: {\n variant: {\n outgoing: ['bg-primary-800 text-white', 'rounded-br-md', 'ml-auto'],\n incoming: [\n 'bg-neutral-100 text-neutral-900',\n 'dark:bg-neutral-800 dark:text-neutral-100',\n 'rounded-bl-md',\n 'mr-auto',\n ],\n system: [\n 'mx-auto max-w-none',\n 'bg-transparent text-muted-foreground',\n 'text-center text-sm',\n 'py-1 px-2',\n ],\n },\n status: {\n sending: '',\n sent: '',\n delivered: '',\n read: '',\n failed: 'ring-2 ring-red-500/50',\n },\n },\n defaultVariants: {\n variant: 'incoming',\n status: 'sent',\n },\n }\n);\n\nexport interface MessageBubbleProps\n extends\n Omit<React.HTMLAttributes<HTMLDivElement>, 'id'>,\n VariantProps<typeof bubbleVariants> {\n /** The message to display */\n message: Message;\n /** Whether to show the sender's avatar */\n showAvatar?: boolean;\n /** Whether to show the sender's name (for group chats) */\n showSenderName?: boolean;\n /** Whether to show the timestamp */\n showTimestamp?: boolean;\n /** Whether to show message status */\n showStatus?: boolean;\n /** Whether to show read receipts */\n showReadReceipts?: boolean;\n /** Called when retry is clicked for failed messages */\n onRetry?: () => void;\n /** Called when an attachment is clicked */\n onAttachmentClick?: (attachment: MessageAttachment) => void;\n /** Whether this is the current user's message */\n isOutgoing?: boolean;\n /** Custom timestamp formatter */\n formatTimestamp?: (timestamp: Date | string) => string;\n}\n\n/**\n * Default timestamp formatter.\n */\nfunction defaultFormatTimestamp(timestamp: Date | string): string {\n const date = typeof timestamp === 'string' ? new Date(timestamp) : timestamp;\n return date.toLocaleTimeString(undefined, {\n hour: 'numeric',\n minute: '2-digit',\n });\n}\n\n/**\n * A message bubble component for displaying individual messages.\n *\n * @example\n * ```tsx\n * <MessageBubble\n * message={message}\n * isOutgoing={message.sender.isCurrentUser}\n * showAvatar\n * showTimestamp\n * />\n * ```\n */\nconst MessageBubble = React.forwardRef<HTMLDivElement, MessageBubbleProps>(\n (\n {\n className,\n message,\n showAvatar = false,\n showSenderName = false,\n showTimestamp = true,\n showStatus = true,\n showReadReceipts = true,\n onRetry,\n onAttachmentClick,\n isOutgoing,\n formatTimestamp = defaultFormatTimestamp,\n ...props\n },\n ref\n ) => {\n const isSystem = message.type === 'system';\n const variant = isSystem ? 'system' : isOutgoing ? 'outgoing' : 'incoming';\n\n const hasAttachments =\n message.attachments && message.attachments.length > 0;\n const hasText = message.content && message.content.trim().length > 0;\n const isFailed = message.status === 'failed';\n\n // System messages render differently\n if (isSystem) {\n return (\n <div\n ref={ref}\n data-slot=\"message-system\"\n className={cn(bubbleVariants({ variant: 'system' }), className)}\n role=\"status\"\n aria-live=\"polite\"\n {...props}\n >\n {message.content}\n </div>\n );\n }\n\n return (\n <div\n ref={ref}\n data-slot=\"message-bubble\"\n className={cn(\n 'group flex items-end gap-2',\n isOutgoing ? 'flex-row-reverse' : 'flex-row',\n className\n )}\n {...props}\n >\n {/* Avatar */}\n {showAvatar && !isOutgoing && (\n <div data-slot=\"message-avatar\" className=\"mb-1 shrink-0\">\n <div\n className={cn(\n 'flex h-8 w-8 items-center justify-center rounded-full',\n 'bg-primary-800 text-sm font-medium text-white'\n )}\n >\n {message.sender.avatarUrl ? (\n <img\n src={message.sender.avatarUrl}\n alt={message.sender.name}\n className=\"h-full w-full rounded-full object-cover\"\n />\n ) : (\n message.sender.name.charAt(0).toUpperCase()\n )}\n </div>\n </div>\n )}\n\n {/* Message content container.\n *\n * `flex-1 min-w-0` lets this column expand to fill the row so the\n * bubble's `max-w-[85%]` resolves against the row width instead of\n * collapsing to the bubble's own min-content. Without this, short\n * words like \"Yes!\" get squeezed into a vertical stack because the\n * column shrink-wraps the bubble and the bubble's max-width then\n * shrinks the bubble further — a feedback loop that bottoms out at\n * `overflow-wrap: break-word` breaking every character.\n */}\n <div\n className={cn(\n 'flex min-w-0 flex-1 flex-col',\n isOutgoing ? 'items-end' : 'items-start'\n )}\n >\n {/* Sender name (for group chats) */}\n {showSenderName && !isOutgoing && (\n <span\n data-slot=\"message-sender-name\"\n className=\"text-muted-foreground mb-1 px-1 text-xs font-medium\"\n >\n {message.sender.name}\n </span>\n )}\n\n {/* Reply preview */}\n {message.replyTo && (\n <div\n data-slot=\"message-reply-preview\"\n className={cn(\n 'mb-1 max-w-full rounded-lg px-3 py-1.5 text-xs',\n isOutgoing\n ? 'bg-primary-700/50 text-white/80'\n : 'bg-neutral-200 text-neutral-600 dark:bg-neutral-700 dark:text-neutral-300'\n )}\n >\n <span className=\"font-medium\">{message.replyTo.sender.name}</span>\n <p className=\"truncate\">{message.replyTo.content}</p>\n </div>\n )}\n\n {/* Bubble */}\n <div\n data-slot=\"message-bubble-content\"\n className={cn(bubbleVariants({ variant, status: message.status }))}\n role=\"article\"\n aria-label={`Message from ${message.sender.name}`}\n >\n {/* Attachments */}\n {hasAttachments && (\n <div className={cn('space-y-2', hasText && 'mb-2')}>\n {message.attachments!.map((attachment) => (\n <AttachmentPreview\n key={attachment.id}\n attachment={attachment}\n onClick={() => onAttachmentClick?.(attachment)}\n />\n ))}\n </div>\n )}\n\n {/* Text content */}\n {hasText && (\n <p className=\"break-words whitespace-pre-wrap\">\n {message.isDeleted ? (\n <span className=\"italic opacity-60\">\n This message was deleted\n </span>\n ) : (\n message.content\n )}\n </p>\n )}\n\n {/* Edited indicator */}\n {message.isEdited && !message.isDeleted && (\n <span className=\"ml-1 text-xs opacity-60\">(edited)</span>\n )}\n </div>\n\n {/* Footer: timestamp, status, read receipts */}\n <div\n data-slot=\"message-footer\"\n className={cn(\n 'mt-1 flex items-center gap-2 px-1',\n isOutgoing ? 'flex-row-reverse' : 'flex-row'\n )}\n >\n {showTimestamp && (\n <span className=\"text-muted-foreground text-xs\">\n {formatTimestamp(message.timestamp)}\n </span>\n )}\n\n {showStatus && isOutgoing && (\n <MessageStatusIcon status={message.status} />\n )}\n\n {showReadReceipts &&\n isOutgoing &&\n message.readReceipts &&\n message.readReceipts.length > 0 && (\n <ReadReceiptIndicator receipts={message.readReceipts} />\n )}\n\n {/* Retry button for failed messages */}\n {isFailed && onRetry && (\n <button\n type=\"button\"\n onClick={onRetry}\n className={cn(\n 'flex items-center gap-1 rounded px-2 py-0.5',\n 'text-xs font-medium text-red-700 dark:text-red-400',\n 'hover:bg-red-50 dark:hover:bg-red-900/20',\n 'focus:ring-2 focus:ring-red-500 focus:outline-none'\n )}\n aria-label=\"Retry sending message\"\n >\n <svg\n aria-hidden=\"true\"\n className=\"h-3 w-3\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\"\n />\n </svg>\n Retry\n </button>\n )}\n </div>\n\n {/* Reactions */}\n {message.reactions && message.reactions.length > 0 && (\n <div\n data-slot=\"message-reactions\"\n className={cn(\n '-mt-1 flex flex-wrap gap-1',\n isOutgoing ? 'justify-end' : 'justify-start'\n )}\n >\n {message.reactions.map((reaction) => (\n <span\n key={reaction.emoji}\n className={cn(\n 'inline-flex items-center gap-1 rounded-full px-2 py-0.5',\n 'bg-neutral-100 text-xs dark:bg-neutral-800',\n 'border border-neutral-200 dark:border-neutral-700'\n )}\n title={reaction.participants.map((p) => p.name).join(', ')}\n >\n <span>{reaction.emoji}</span>\n {reaction.count > 1 && (\n <span className=\"text-neutral-500\">{reaction.count}</span>\n )}\n </span>\n ))}\n </div>\n )}\n </div>\n\n {/* Spacer for avatar alignment when showing own messages */}\n {showAvatar && isOutgoing && <div className=\"w-8 shrink-0\" />}\n </div>\n );\n }\n);\n\nMessageBubble.displayName = 'MessageBubble';\n\nexport {\n MessageBubble,\n MessageStatusIcon,\n ReadReceiptIndicator,\n AttachmentPreview,\n bubbleVariants,\n formatFileSize,\n};\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport type {\n Message,\n MessageGroup,\n MessageParticipant,\n MessageAttachment,\n TypingState,\n} from './types';\nimport { MessageBubble } from './MessageBubble';\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Groups messages by date.\n */\nfunction groupMessagesByDate(messages: Message[]): MessageGroup[] {\n const groups: Map<string, Message[]> = new Map();\n\n messages.forEach((message) => {\n const date = new Date(message.timestamp);\n const dateKey = date.toDateString();\n const existing = groups.get(dateKey) || [];\n groups.set(dateKey, [...existing, message]);\n });\n\n return Array.from(groups.entries()).map(([dateKey, msgs]) => ({\n date: dateKey,\n label: formatDateLabel(new Date(dateKey)),\n messages: msgs,\n }));\n}\n\n/**\n * Format date label for message grouping.\n */\nfunction formatDateLabel(date: Date): string {\n const now = new Date();\n const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n const yesterday = new Date(today);\n yesterday.setDate(yesterday.getDate() - 1);\n const messageDate = new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate()\n );\n\n if (messageDate.getTime() === today.getTime()) {\n return 'Today';\n }\n if (messageDate.getTime() === yesterday.getTime()) {\n return 'Yesterday';\n }\n\n // Check if same year\n if (date.getFullYear() === now.getFullYear()) {\n return date.toLocaleDateString(undefined, {\n weekday: 'long',\n month: 'long',\n day: 'numeric',\n });\n }\n\n return date.toLocaleDateString(undefined, {\n weekday: 'long',\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n });\n}\n\n/**\n * Check if two messages are from the same sender within a time threshold.\n */\nfunction isSameSenderGroup(\n prev: Message | undefined,\n current: Message,\n thresholdMinutes: number = 5\n): boolean {\n if (!prev) return false;\n if (prev.sender.id !== current.sender.id) return false;\n if (prev.type === 'system' || current.type === 'system') return false;\n\n const prevTime = new Date(prev.timestamp).getTime();\n const currentTime = new Date(current.timestamp).getTime();\n const diffMinutes = (currentTime - prevTime) / (1000 * 60);\n\n return diffMinutes < thresholdMinutes;\n}\n\n// ============================================================================\n// Skeleton Message Component\n// ============================================================================\n\nexport interface SkeletonMessageProps {\n isOutgoing?: boolean;\n showAvatar?: boolean;\n className?: string;\n}\n\n/**\n * A skeleton placeholder for loading messages.\n */\nfunction SkeletonMessage({\n isOutgoing = false,\n showAvatar = true,\n className,\n}: SkeletonMessageProps) {\n return (\n <div\n data-slot=\"skeleton-message\"\n className={cn(\n 'flex items-end gap-2',\n isOutgoing ? 'flex-row-reverse' : 'flex-row',\n className\n )}\n aria-hidden=\"true\"\n >\n {showAvatar && !isOutgoing && (\n <div\n data-slot=\"skeleton-avatar\"\n className=\"h-8 w-8 animate-pulse rounded-full bg-neutral-200 dark:bg-neutral-700\"\n />\n )}\n <div\n data-slot=\"skeleton-bubble\"\n className={cn(\n 'animate-pulse rounded-2xl',\n isOutgoing\n ? 'bg-primary-800/30 rounded-br-md'\n : 'rounded-bl-md bg-neutral-200 dark:bg-neutral-700',\n 'h-10 w-48'\n )}\n />\n {showAvatar && isOutgoing && (\n <div data-slot=\"skeleton-spacer\" className=\"w-8\" />\n )}\n </div>\n );\n}\n\nSkeletonMessage.displayName = 'SkeletonMessage';\n\n// ============================================================================\n// Typing Indicator Component\n// ============================================================================\n\nexport interface TypingIndicatorProps {\n typingState: TypingState;\n className?: string;\n}\n\n/**\n * Displays who is currently typing.\n */\nfunction TypingIndicator({ typingState, className }: TypingIndicatorProps) {\n const { participants } = typingState;\n\n if (participants.length === 0) return null;\n\n const typingText =\n participants.length === 1\n ? `${participants[0].name} is typing`\n : participants.length === 2\n ? `${participants[0].name} and ${participants[1].name} are typing`\n : `${participants[0].name} and ${participants.length - 1} others are typing`;\n\n return (\n <div\n data-slot=\"typing-indicator\"\n className={cn('flex items-center gap-2 px-4 py-2', className)}\n role=\"status\"\n aria-live=\"polite\"\n aria-label={typingText}\n >\n {/* Typing bubble animation */}\n <div className=\"flex items-center gap-1 rounded-2xl rounded-bl-md bg-neutral-200 px-4 py-3 dark:bg-neutral-700\">\n <span\n className=\"h-2 w-2 animate-bounce rounded-full bg-neutral-500\"\n style={{ animationDelay: '0ms' }}\n />\n <span\n className=\"h-2 w-2 animate-bounce rounded-full bg-neutral-500\"\n style={{ animationDelay: '150ms' }}\n />\n <span\n className=\"h-2 w-2 animate-bounce rounded-full bg-neutral-500\"\n style={{ animationDelay: '300ms' }}\n />\n </div>\n <span className=\"text-muted-foreground text-xs\">{typingText}</span>\n </div>\n );\n}\n\nTypingIndicator.displayName = 'TypingIndicator';\n\n// ============================================================================\n// Date Separator Component\n// ============================================================================\n\nexport interface DateSeparatorProps {\n label: string;\n className?: string;\n}\n\n/**\n * A visual separator showing the date between message groups.\n */\nfunction DateSeparator({ label, className }: DateSeparatorProps) {\n return (\n <div\n data-slot=\"date-separator\"\n className={cn('flex items-center justify-center py-4', className)}\n role=\"separator\"\n aria-label={label}\n >\n <span\n className={cn(\n 'rounded-full px-3 py-1 text-xs font-medium',\n 'bg-neutral-100 text-neutral-600',\n 'dark:bg-neutral-800 dark:text-neutral-400'\n )}\n >\n {label}\n </span>\n </div>\n );\n}\n\nDateSeparator.displayName = 'DateSeparator';\n\n// ============================================================================\n// Empty State Component\n// ============================================================================\n\nexport interface EmptyStateProps {\n /** Custom title */\n title?: string;\n /** Custom description */\n description?: string;\n /** Custom icon */\n icon?: React.ReactNode;\n /** Action button */\n action?: React.ReactNode;\n className?: string;\n}\n\n/**\n * Empty state shown when there are no messages.\n */\nfunction EmptyState({\n title = 'No messages yet',\n description = 'Start the conversation by sending a message below.',\n icon,\n action,\n className,\n}: EmptyStateProps) {\n return (\n <div\n data-slot=\"message-empty-state\"\n className={cn(\n 'flex flex-1 flex-col items-center justify-center p-8 text-center',\n className\n )}\n role=\"status\"\n aria-label={title}\n >\n {icon || (\n <div\n data-slot=\"message-empty-state-icon\"\n className=\"mb-4 rounded-full bg-neutral-100 p-4 dark:bg-neutral-800\"\n >\n <svg\n aria-hidden=\"true\"\n className=\"h-12 w-12 text-neutral-500\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z\"\n />\n </svg>\n </div>\n )}\n <h3 className=\"mb-2 text-lg font-semibold text-neutral-900 dark:text-neutral-100\">\n {title}\n </h3>\n <p className=\"text-muted-foreground mb-4 max-w-sm text-sm\">\n {description}\n </p>\n {action}\n </div>\n );\n}\n\nEmptyState.displayName = 'EmptyState';\n\n// ============================================================================\n// Load More Button Component\n// ============================================================================\n\nexport interface LoadMoreButtonProps {\n isLoading?: boolean;\n onClick: () => void;\n className?: string;\n}\n\n/**\n * Button to load more message history.\n */\nfunction LoadMoreButton({\n isLoading,\n onClick,\n className,\n}: LoadMoreButtonProps) {\n return (\n <div\n data-slot=\"load-more-button\"\n className={cn('flex justify-center py-4', className)}\n >\n <button\n type=\"button\"\n onClick={onClick}\n disabled={isLoading}\n className={cn(\n 'rounded-full px-4 py-2 text-sm font-medium',\n 'bg-neutral-100 text-neutral-600 dark:bg-neutral-800 dark:text-neutral-300',\n 'hover:bg-neutral-200 dark:hover:bg-neutral-700',\n 'focus:ring-primary-500 focus:ring-2 focus:outline-none',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'transition-colors'\n )}\n aria-label={isLoading ? 'Loading more messages' : 'Load more messages'}\n >\n {isLoading ? (\n <span className=\"flex items-center gap-2\">\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4 animate-spin\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n />\n </svg>\n Loading...\n </span>\n ) : (\n 'Load earlier messages'\n )}\n </button>\n </div>\n );\n}\n\nLoadMoreButton.displayName = 'LoadMoreButton';\n\n// ============================================================================\n// Message List Component\n// ============================================================================\n\nexport interface MessageListProps {\n /** Array of messages to display */\n messages: Message[];\n /** Current user for determining outgoing messages */\n currentUser: MessageParticipant;\n /** Whether messages are loading */\n isLoading?: boolean;\n /** Whether more messages are available */\n hasMore?: boolean;\n /** Whether more messages are being loaded */\n isLoadingMore?: boolean;\n /** Typing indicator state */\n typingState?: TypingState;\n /** Show avatars for incoming messages */\n showAvatars?: boolean;\n /** Show sender names (for group conversations) */\n showSenderNames?: boolean;\n /** Group messages by date */\n groupByDate?: boolean;\n /** Callback when load more is triggered */\n onLoadMore?: () => void;\n /** Callback when a message action (retry) is triggered */\n onRetryMessage?: (messageId: string) => void;\n /** Callback when an attachment is clicked */\n onAttachmentClick?: (attachment: MessageAttachment, message: Message) => void;\n /** Custom empty state */\n emptyState?: React.ReactNode;\n /** Custom timestamp formatter */\n formatTimestamp?: (timestamp: Date | string) => string;\n /** Additional class name */\n className?: string;\n /** Auto-scroll behavior */\n autoScroll?: 'always' | 'onNewMessage' | 'manual';\n}\n\n/**\n * A scrollable list of messages with date grouping, auto-scroll, and loading states.\n *\n * @example\n * ```tsx\n * <MessageList\n * messages={messages}\n * currentUser={currentUser}\n * typingState={typingState}\n * onLoadMore={handleLoadMore}\n * showAvatars\n * groupByDate\n * />\n * ```\n */\nconst MessageList = React.forwardRef<HTMLDivElement, MessageListProps>(\n (\n {\n messages,\n currentUser,\n isLoading = false,\n hasMore = false,\n isLoadingMore = false,\n typingState,\n showAvatars = true,\n showSenderNames = false,\n groupByDate = true,\n onLoadMore,\n onRetryMessage,\n onAttachmentClick,\n emptyState,\n formatTimestamp,\n className,\n autoScroll = 'onNewMessage',\n },\n ref\n ) => {\n const scrollContainerRef = React.useRef<HTMLDivElement>(null);\n const bottomRef = React.useRef<HTMLDivElement>(null);\n const [isUserScrolled, setIsUserScrolled] = React.useState(false);\n const prevMessageCountRef = React.useRef(messages.length);\n\n // Combine refs\n React.useImperativeHandle(ref, () => scrollContainerRef.current!);\n\n // Handle scroll to detect if user has scrolled up\n const handleScroll = React.useCallback(() => {\n const container = scrollContainerRef.current;\n if (!container) return;\n\n const { scrollTop, scrollHeight, clientHeight } = container;\n const isAtBottom = scrollHeight - scrollTop - clientHeight < 100;\n setIsUserScrolled(!isAtBottom);\n }, []);\n\n // Auto-scroll on new messages\n React.useEffect(() => {\n const container = scrollContainerRef.current;\n const bottom = bottomRef.current;\n if (!container || !bottom) return;\n\n const messageCountChanged =\n messages.length !== prevMessageCountRef.current;\n prevMessageCountRef.current = messages.length;\n\n if (autoScroll === 'always') {\n bottom.scrollIntoView({ behavior: 'smooth' });\n } else if (autoScroll === 'onNewMessage' && messageCountChanged) {\n // Check if new message is from current user (outgoing)\n const lastMessage = messages[messages.length - 1];\n const isOutgoing = lastMessage?.sender.id === currentUser.id;\n\n // Always scroll on outgoing, only scroll on incoming if at bottom\n if (isOutgoing || !isUserScrolled) {\n bottom.scrollIntoView({ behavior: 'smooth' });\n }\n }\n }, [messages, currentUser.id, autoScroll, isUserScrolled]);\n\n // Scroll to bottom on initial load\n React.useEffect(() => {\n const bottom = bottomRef.current;\n if (bottom && !isLoading) {\n bottom.scrollIntoView();\n }\n }, [isLoading]);\n\n // Group messages\n const messageGroups = groupByDate\n ? groupMessagesByDate(messages)\n : [{ date: 'all', label: '', messages }];\n\n // Loading skeleton\n if (isLoading) {\n return (\n <div\n role=\"status\"\n className={cn(\n 'flex flex-1 flex-col gap-3 overflow-y-auto p-4',\n className\n )}\n aria-busy=\"true\"\n aria-label=\"Loading messages\"\n >\n {Array.from({ length: 8 }).map((_, i) => (\n <SkeletonMessage\n key={i}\n isOutgoing={i % 3 === 0}\n showAvatar={showAvatars}\n />\n ))}\n </div>\n );\n }\n\n // Empty state\n if (messages.length === 0) {\n return emptyState || <EmptyState />;\n }\n\n return (\n <div\n ref={scrollContainerRef}\n data-slot=\"message-list\"\n className={cn(\n 'flex flex-1 flex-col overflow-y-auto',\n 'scroll-smooth',\n className\n )}\n onScroll={handleScroll}\n role=\"log\"\n aria-label=\"Message history\"\n aria-live=\"polite\"\n >\n {/* Load more button */}\n {hasMore && onLoadMore && (\n <LoadMoreButton isLoading={isLoadingMore} onClick={onLoadMore} />\n )}\n\n {/* Messages grouped by date */}\n <div\n data-slot=\"message-list-content\"\n className=\"flex flex-col gap-1 p-4\"\n >\n {messageGroups.map((group) => (\n <React.Fragment key={group.date}>\n {/* Date separator */}\n {groupByDate && group.label && (\n <DateSeparator label={group.label} />\n )}\n\n {/* Messages in group */}\n {group.messages.map((message, index) => {\n const prevMessage = group.messages[index - 1];\n const isOutgoing = message.sender.id === currentUser.id;\n const isSameGroup = isSameSenderGroup(prevMessage, message);\n\n return (\n <div\n key={message.id}\n className={cn(\n 'transition-opacity duration-200',\n isSameGroup ? 'mt-0.5' : 'mt-3',\n index === 0 && 'mt-0'\n )}\n >\n <MessageBubble\n message={message}\n isOutgoing={isOutgoing}\n showAvatar={showAvatars && !isSameGroup && !isOutgoing}\n showSenderName={\n showSenderNames && !isSameGroup && !isOutgoing\n }\n showTimestamp={!isSameGroup}\n onRetry={\n message.status === 'failed' && onRetryMessage\n ? () => onRetryMessage(message.id)\n : undefined\n }\n onAttachmentClick={(attachment) =>\n onAttachmentClick?.(attachment, message)\n }\n formatTimestamp={formatTimestamp}\n />\n </div>\n );\n })}\n </React.Fragment>\n ))}\n </div>\n\n {/* Typing indicator */}\n {typingState && typingState.participants.length > 0 && (\n <TypingIndicator typingState={typingState} />\n )}\n\n {/* Scroll anchor */}\n <div ref={bottomRef} className=\"h-0\" aria-hidden=\"true\" />\n\n {/* Scroll to bottom button when user has scrolled up */}\n {isUserScrolled && (\n <button\n type=\"button\"\n onClick={() => {\n bottomRef.current?.scrollIntoView({ behavior: 'smooth' });\n }}\n className={cn(\n 'fixed right-4 bottom-24 z-10',\n 'rounded-full p-3 shadow-lg',\n 'bg-white dark:bg-neutral-800',\n 'border border-neutral-200 dark:border-neutral-700',\n 'hover:bg-neutral-50 dark:hover:bg-neutral-700',\n 'focus:ring-primary-500 focus:ring-2 focus:outline-none',\n 'transition-all'\n )}\n aria-label=\"Scroll to bottom\"\n >\n <svg\n aria-hidden=\"true\"\n className=\"h-5 w-5 text-neutral-600 dark:text-neutral-300\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 14l-7 7m0 0l-7-7m7 7V3\"\n />\n </svg>\n </button>\n )}\n </div>\n );\n }\n);\n\nMessageList.displayName = 'MessageList';\n\nexport {\n MessageList,\n SkeletonMessage,\n TypingIndicator,\n DateSeparator,\n EmptyState,\n LoadMoreButton,\n groupMessagesByDate,\n formatDateLabel,\n isSameSenderGroup,\n};\n","import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport type { Conversation, MessageParticipant } from './types';\n\n// ============================================================================\n// Conversation Header Component\n// ============================================================================\n\nconst headerVariants = cva(\n [\n 'flex items-center gap-3 px-4 py-3',\n 'bg-white dark:bg-neutral-900',\n 'border-b border-neutral-200 dark:border-neutral-700',\n ],\n {\n variants: {\n size: {\n sm: 'py-2',\n md: 'py-3',\n lg: 'py-4',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n }\n);\n\nexport interface ConversationHeaderProps\n extends\n React.HTMLAttributes<HTMLElement>,\n VariantProps<typeof headerVariants> {\n /** The conversation to display */\n conversation?: Conversation;\n /** Custom title (overrides conversation name) */\n title?: string;\n /** Custom subtitle */\n subtitle?: string;\n /** Avatar URL */\n avatarUrl?: string;\n /** Participant for direct messages */\n participant?: MessageParticipant;\n /** Show online status indicator */\n showOnlineStatus?: boolean;\n /** Show back button (mobile) */\n showBackButton?: boolean;\n /** Called when back button is clicked */\n onBack?: () => void;\n /** Additional actions (menu, call, etc.) */\n actions?: React.ReactNode;\n /** Custom left content */\n leftContent?: React.ReactNode;\n /** Custom right content */\n rightContent?: React.ReactNode;\n}\n\n/**\n * Get display title for a conversation.\n */\nfunction getConversationTitle(\n conversation?: Conversation,\n participant?: MessageParticipant\n): string {\n if (conversation?.name) return conversation.name;\n if (participant?.name) return participant.name;\n if (conversation?.participants && conversation.participants.length > 0) {\n const names = conversation.participants\n .filter((p) => !p.isCurrentUser)\n .map((p) => p.name);\n if (names.length <= 2) return names.join(' & ');\n return `${names[0]} and ${names.length - 1} others`;\n }\n return 'Conversation';\n}\n\n/**\n * Get subtitle for a conversation.\n */\nfunction getConversationSubtitle(\n conversation?: Conversation,\n participant?: MessageParticipant,\n showOnlineStatus?: boolean\n): string | undefined {\n if (participant) {\n if (showOnlineStatus && participant.isOnline) {\n return 'Online';\n }\n if (participant.lastSeen) {\n const lastSeen = new Date(participant.lastSeen);\n return `Last seen ${formatLastSeen(lastSeen)}`;\n }\n if (participant.phoneNumber) {\n return participant.phoneNumber;\n }\n }\n if (conversation?.type === 'group' && conversation.participants) {\n return `${conversation.participants.length} participants`;\n }\n return undefined;\n}\n\n/**\n * Format last seen time.\n */\nfunction formatLastSeen(date: Date): string {\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / (1000 * 60));\n const diffHours = Math.floor(diffMs / (1000 * 60 * 60));\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffMins < 1) return 'just now';\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n return date.toLocaleDateString();\n}\n\n/**\n * Header component for a conversation/message thread.\n *\n * @example\n * ```tsx\n * <ConversationHeader\n * conversation={conversation}\n * showBackButton\n * onBack={() => navigate('/conversations')}\n * actions={<IconButton icon={<MoreIcon />} />}\n * />\n * ```\n */\nconst ConversationHeader = React.forwardRef<\n HTMLElement,\n ConversationHeaderProps\n>(\n (\n {\n className,\n size,\n conversation,\n title,\n subtitle,\n avatarUrl,\n participant,\n showOnlineStatus = true,\n showBackButton = false,\n onBack,\n actions,\n leftContent,\n rightContent,\n ...props\n },\n ref\n ) => {\n const displayTitle =\n title || getConversationTitle(conversation, participant);\n const displaySubtitle =\n subtitle ||\n getConversationSubtitle(conversation, participant, showOnlineStatus);\n const displayAvatar =\n avatarUrl || conversation?.avatarUrl || participant?.avatarUrl;\n const isOnline = participant?.isOnline;\n\n return (\n <header\n ref={ref}\n data-slot=\"conversation-header\"\n className={cn(headerVariants({ size }), className)}\n {...props}\n >\n {/* Left content / Back button */}\n {leftContent ||\n (showBackButton && onBack && (\n <button\n type=\"button\"\n onClick={onBack}\n className={cn(\n '-ml-2 rounded-full p-2',\n 'text-neutral-500 hover:text-neutral-700',\n 'dark:text-neutral-400 dark:hover:text-neutral-200',\n 'hover:bg-neutral-100 dark:hover:bg-neutral-800',\n 'focus:ring-primary-500 focus:ring-2 focus:outline-none',\n 'transition-colors'\n )}\n aria-label=\"Go back\"\n >\n <svg\n aria-hidden=\"true\"\n className=\"h-5 w-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n </button>\n ))}\n\n {/* Avatar */}\n <div\n data-slot=\"conversation-header-avatar\"\n className=\"relative shrink-0\"\n >\n <div\n className={cn(\n 'flex h-10 w-10 items-center justify-center rounded-full',\n 'bg-primary-800 font-medium text-white'\n )}\n >\n {displayAvatar ? (\n <img\n src={displayAvatar}\n alt={displayTitle}\n className=\"h-full w-full rounded-full object-cover\"\n />\n ) : (\n displayTitle.charAt(0).toUpperCase()\n )}\n </div>\n {/* Online indicator */}\n {showOnlineStatus && isOnline && (\n <span\n className={cn(\n 'absolute right-0 bottom-0',\n 'h-3 w-3 rounded-full',\n 'bg-green-500 ring-2 ring-white dark:ring-neutral-900'\n )}\n role=\"status\"\n aria-label=\"Online\"\n />\n )}\n </div>\n\n {/* Title and subtitle */}\n <div data-slot=\"conversation-header-info\" className=\"min-w-0 flex-1\">\n <h2 className=\"truncate font-semibold text-neutral-900 dark:text-neutral-100\">\n {displayTitle}\n </h2>\n {displaySubtitle && (\n <p\n className={cn(\n 'truncate text-sm',\n isOnline\n ? 'text-green-700 dark:text-green-400'\n : 'text-muted-foreground'\n )}\n >\n {displaySubtitle}\n </p>\n )}\n </div>\n\n {/* Right content / Actions */}\n {rightContent ||\n (actions && (\n <div className=\"flex shrink-0 items-center gap-1\">{actions}</div>\n ))}\n </header>\n );\n }\n);\n\nConversationHeader.displayName = 'ConversationHeader';\n\n// ============================================================================\n// Conversation List Item Component\n// ============================================================================\n\nexport interface ConversationListItemProps extends Omit<\n React.HTMLAttributes<HTMLButtonElement>,\n 'onSelect'\n> {\n /** The conversation to display */\n conversation: Conversation;\n /** Whether this item is selected */\n isSelected?: boolean;\n /** Called when the item is clicked */\n onSelect?: (conversation: Conversation) => void;\n}\n\n/**\n * A list item for displaying a conversation in a list.\n */\nconst ConversationListItem = React.forwardRef<\n HTMLButtonElement,\n ConversationListItemProps\n>(({ className, conversation, isSelected, onSelect, ...props }, ref) => {\n const participant = conversation.participants.find((p) => !p.isCurrentUser);\n const title = getConversationTitle(conversation, participant);\n const avatarUrl = conversation.avatarUrl || participant?.avatarUrl;\n const lastMessage = conversation.lastMessage;\n const isUnread = conversation.unreadCount > 0;\n\n const formatTime = (timestamp: Date | string) => {\n const date = new Date(timestamp);\n const now = new Date();\n const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n const messageDate = new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate()\n );\n\n if (messageDate.getTime() === today.getTime()) {\n return date.toLocaleTimeString(undefined, {\n hour: 'numeric',\n minute: '2-digit',\n });\n }\n\n const yesterday = new Date(today);\n yesterday.setDate(yesterday.getDate() - 1);\n if (messageDate.getTime() === yesterday.getTime()) {\n return 'Yesterday';\n }\n\n return date.toLocaleDateString(undefined, {\n month: 'short',\n day: 'numeric',\n });\n };\n\n return (\n <button\n ref={ref}\n type=\"button\"\n onClick={() => onSelect?.(conversation)}\n data-slot=\"conversation-list-item\"\n className={cn(\n 'flex w-full items-center gap-3 px-4 py-3',\n 'text-left transition-colors',\n isSelected\n ? 'bg-primary-50 dark:bg-primary-900/20'\n : 'hover:bg-neutral-50 dark:hover:bg-neutral-800/50',\n 'focus:bg-neutral-50 focus:outline-none dark:focus:bg-neutral-800/50',\n className\n )}\n aria-current={isSelected ? 'true' : undefined}\n {...props}\n >\n {/* Avatar */}\n <div\n data-slot=\"conversation-list-item-avatar\"\n className=\"relative shrink-0\"\n >\n <div\n className={cn(\n 'flex h-12 w-12 items-center justify-center rounded-full',\n 'bg-primary-800 font-medium text-white'\n )}\n >\n {avatarUrl ? (\n <img\n src={avatarUrl}\n alt={title}\n className=\"h-full w-full rounded-full object-cover\"\n />\n ) : (\n title.charAt(0).toUpperCase()\n )}\n </div>\n {participant?.isOnline && (\n <span\n className={cn(\n 'absolute right-0 bottom-0',\n 'h-3 w-3 rounded-full',\n 'bg-green-500 ring-2 ring-white dark:ring-neutral-900'\n )}\n />\n )}\n </div>\n\n {/* Content */}\n <div\n data-slot=\"conversation-list-item-content\"\n className=\"min-w-0 flex-1\"\n >\n <div className=\"flex items-center justify-between gap-2\">\n <h3\n className={cn(\n 'truncate text-sm',\n isUnread\n ? 'font-semibold text-neutral-900 dark:text-neutral-100'\n : 'font-medium text-neutral-700 dark:text-neutral-300'\n )}\n >\n {title}\n </h3>\n {lastMessage && (\n <span className=\"shrink-0 text-xs text-neutral-600 dark:text-neutral-400\">\n {formatTime(lastMessage.timestamp)}\n </span>\n )}\n </div>\n <div className=\"flex items-center justify-between gap-2\">\n <p\n className={cn(\n 'truncate text-sm',\n isUnread\n ? 'text-neutral-700 dark:text-neutral-300'\n : 'text-neutral-600 dark:text-neutral-400'\n )}\n >\n {lastMessage?.content || 'No messages yet'}\n </p>\n {isUnread && (\n <span\n data-slot=\"conversation-list-item-badge\"\n className={cn(\n 'flex shrink-0 items-center justify-center',\n 'h-5 min-w-[20px] rounded-full px-1.5',\n 'bg-primary-800 text-xs font-medium text-white'\n )}\n >\n {conversation.unreadCount > 99 ? '99+' : conversation.unreadCount}\n </span>\n )}\n </div>\n </div>\n\n {/* Pinned/Muted indicators */}\n <div className=\"flex shrink-0 flex-col items-center gap-1\">\n {conversation.isPinned && (\n <svg\n aria-hidden=\"true\"\n className=\"text-primary-800 h-4 w-4\"\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M16 4v8l2 2v2h-6v6l-1 1-1-1v-6H4v-2l2-2V4c0-1.1.9-2 2-2h6c1.1 0 2 .9 2 2z\" />\n </svg>\n )}\n {conversation.isMuted && (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4 text-neutral-500\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5.586 15H4a1 1 0 01-1-1v-4a1 1 0 011-1h1.586l4.707-4.707C10.923 3.663 12 4.109 12 5v14c0 .891-1.077 1.337-1.707.707L5.586 15z\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M17 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2\"\n />\n </svg>\n )}\n </div>\n </button>\n );\n});\n\nConversationListItem.displayName = 'ConversationListItem';\n\n// ============================================================================\n// Conversation List Skeleton Component\n// ============================================================================\n\nexport interface ConversationListSkeletonProps {\n count?: number;\n className?: string;\n}\n\n/**\n * Skeleton loading state for conversation list.\n */\nfunction ConversationListSkeleton({\n count = 5,\n className,\n}: ConversationListSkeletonProps) {\n return (\n <div\n className={cn(\n 'divide-y divide-neutral-200 dark:divide-neutral-700',\n className\n )}\n >\n {Array.from({ length: count }).map((_, i) => (\n <div\n key={i}\n className=\"flex items-center gap-3 px-4 py-3\"\n aria-hidden=\"true\"\n >\n <div className=\"h-12 w-12 animate-pulse rounded-full bg-neutral-200 dark:bg-neutral-700\" />\n <div className=\"flex-1 space-y-2\">\n <div className=\"h-4 w-32 animate-pulse rounded bg-neutral-200 dark:bg-neutral-700\" />\n <div className=\"h-3 w-48 animate-pulse rounded bg-neutral-200 dark:bg-neutral-700\" />\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nConversationListSkeleton.displayName = 'ConversationListSkeleton';\n\nexport {\n ConversationHeader,\n ConversationListItem,\n ConversationListSkeleton,\n headerVariants,\n getConversationTitle,\n getConversationSubtitle,\n formatLastSeen,\n};\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport type {\n Message,\n MessageParticipant,\n MessageAttachment,\n TypingState,\n Conversation,\n NewMessage,\n MessagingEventHandlers,\n} from './types';\nimport { MessageList } from './MessageList';\nimport { MessageComposer } from './MessageComposer';\nimport { ConversationHeader } from './ConversationHeader';\nimport { DragDropZone } from './AttachmentPicker';\n\n// ============================================================================\n// Lightbox Modal Component\n// ============================================================================\n\nexport interface LightboxModalProps {\n /** The attachment to display */\n attachment: MessageAttachment | null;\n /** Called when the modal is closed */\n onClose: () => void;\n}\n\n/**\n * Full-screen lightbox for viewing media attachments.\n */\nfunction LightboxModal({ attachment, onClose }: LightboxModalProps) {\n // Handle escape key\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n onClose();\n }\n };\n\n if (attachment) {\n document.addEventListener('keydown', handleKeyDown);\n document.body.style.overflow = 'hidden';\n }\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n document.body.style.overflow = '';\n };\n }, [attachment, onClose]);\n\n if (!attachment) return null;\n\n const isImage = attachment.type === 'image';\n const isVideo = attachment.type === 'video';\n\n return (\n <div\n data-slot=\"message-lightbox\"\n className={cn('fixed inset-0 z-50', 'flex items-center justify-center')}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={`View ${attachment.filename}`}\n >\n {/* Backdrop - clickable to close */}\n <button\n type=\"button\"\n className=\"absolute inset-0 cursor-default bg-black/90\"\n onClick={onClose}\n aria-label=\"Close lightbox\"\n />\n\n {/* Close button */}\n <button\n type=\"button\"\n onClick={onClose}\n className={cn(\n 'absolute top-4 right-4 z-10',\n 'rounded-full p-2',\n 'bg-white/10 text-white',\n 'hover:bg-white/20',\n 'focus:ring-2 focus:ring-white focus:outline-none',\n 'transition-colors'\n )}\n aria-label=\"Close\"\n >\n <svg\n aria-hidden=\"true\"\n className=\"h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n\n {/* Media content */}\n <div className=\"relative z-10 max-h-[90vh] max-w-[90vw]\">\n {isImage && (\n <img\n src={attachment.url}\n alt={attachment.alt || attachment.filename}\n className=\"max-h-[90vh] max-w-[90vw] object-contain\"\n />\n )}\n {isVideo && (\n <video\n src={attachment.url}\n controls\n autoPlay\n className=\"max-h-[90vh] max-w-[90vw]\"\n >\n <track kind=\"captions\" />\n </video>\n )}\n </div>\n\n {/* Filename */}\n <div className=\"absolute bottom-4 left-1/2 -translate-x-1/2\">\n <p className=\"rounded-full bg-black/50 px-4 py-2 text-sm text-white\">\n {attachment.filename}\n </p>\n </div>\n </div>\n );\n}\n\nLightboxModal.displayName = 'LightboxModal';\n\n// ============================================================================\n// Message Thread Component\n// ============================================================================\n\nexport interface MessageThreadProps {\n /** The conversation being displayed */\n conversation?: Conversation;\n /** Array of messages in the thread */\n messages: Message[];\n /** Current user for determining message direction */\n currentUser: MessageParticipant;\n /** Typing indicator state */\n typingState?: TypingState;\n /** Whether messages are loading */\n isLoading?: boolean;\n /** Whether more messages are available */\n hasMore?: boolean;\n /** Whether more messages are being loaded */\n isLoadingMore?: boolean;\n /** Whether a message is being sent */\n isSending?: boolean;\n /** Event handlers */\n eventHandlers?: MessagingEventHandlers;\n /** Show header */\n showHeader?: boolean;\n /** Show back button in header */\n showBackButton?: boolean;\n /** Called when back is clicked */\n onBack?: () => void;\n /** Custom header actions */\n headerActions?: React.ReactNode;\n /** Composer placeholder */\n placeholder?: string;\n /** Maximum message length */\n maxMessageLength?: number;\n /** Show character count */\n showCharacterCount?: boolean;\n /** Show attachment picker */\n showAttachmentPicker?: boolean;\n /** Show camera button */\n showCameraButton?: boolean;\n /** Accepted file types */\n acceptedFileTypes?: string[];\n /** Maximum file size */\n maxFileSize?: number;\n /** Maximum attachments */\n maxAttachments?: number;\n /** Show avatars in message list */\n showAvatars?: boolean;\n /** Show sender names (group chats) */\n showSenderNames?: boolean;\n /** Group messages by date */\n groupByDate?: boolean;\n /** Custom empty state */\n emptyState?: React.ReactNode;\n /** Custom timestamp formatter */\n formatTimestamp?: (timestamp: Date | string) => string;\n /** Called when an error occurs */\n onError?: (error: string) => void;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * A complete message thread component combining header, message list, and composer.\n *\n * @example\n * ```tsx\n * <MessageThread\n * conversation={conversation}\n * messages={messages}\n * currentUser={currentUser}\n * typingState={typingState}\n * eventHandlers={{\n * onSendMessage: handleSend,\n * onLoadMore: handleLoadMore,\n * onRetryMessage: handleRetry,\n * }}\n * showHeader\n * showBackButton\n * onBack={() => navigate('/conversations')}\n * />\n * ```\n */\nconst MessageThread = React.forwardRef<HTMLDivElement, MessageThreadProps>(\n (\n {\n conversation,\n messages,\n currentUser,\n typingState,\n isLoading = false,\n hasMore = false,\n isLoadingMore = false,\n isSending = false,\n eventHandlers = {},\n showHeader = true,\n showBackButton = false,\n onBack,\n headerActions,\n placeholder = 'Type a message...',\n maxMessageLength = 1600,\n showCharacterCount = false,\n showAttachmentPicker = true,\n showCameraButton = false,\n acceptedFileTypes,\n maxFileSize,\n maxAttachments,\n showAvatars = true,\n showSenderNames = false,\n groupByDate = true,\n emptyState,\n formatTimestamp,\n onError,\n className,\n },\n ref\n ) => {\n const [lightboxAttachment, setLightboxAttachment] =\n React.useState<MessageAttachment | null>(null);\n const [replyTo, setReplyTo] = React.useState<{\n id: string;\n content: string;\n senderName: string;\n } | null>(null);\n\n // Get participant for direct messages\n const participant =\n conversation?.type === 'direct'\n ? conversation.participants.find((p) => p.id !== currentUser.id)\n : undefined;\n\n // Handle attachment click\n const handleAttachmentClick = (\n attachment: MessageAttachment,\n message: Message\n ) => {\n if (attachment.type === 'image' || attachment.type === 'video') {\n setLightboxAttachment(attachment);\n }\n eventHandlers.onAttachmentClick?.(attachment, message);\n };\n\n // Handle send message\n const handleSendMessage = async (newMessage: NewMessage) => {\n const messageWithReply: NewMessage = {\n ...newMessage,\n replyToId: replyTo?.id || newMessage.replyToId,\n };\n setReplyTo(null);\n await eventHandlers.onSendMessage?.(messageWithReply);\n };\n\n return (\n <div\n ref={ref}\n data-slot=\"message-thread\"\n className={cn(\n 'flex h-full flex-col',\n 'bg-white dark:bg-neutral-900',\n className\n )}\n >\n {/* Header */}\n {showHeader && (\n <ConversationHeader\n conversation={conversation}\n participant={participant}\n showBackButton={showBackButton}\n onBack={onBack}\n actions={headerActions}\n />\n )}\n\n {/* Message list */}\n <DragDropZone\n onFilesDropped={() => {\n // Could trigger composer with attachments\n onError?.('Drop files on the composer to attach them');\n }}\n disabled={!showAttachmentPicker}\n className=\"flex-1 overflow-hidden\"\n >\n <MessageList\n messages={messages}\n currentUser={currentUser}\n isLoading={isLoading}\n hasMore={hasMore}\n isLoadingMore={isLoadingMore}\n typingState={typingState}\n showAvatars={showAvatars}\n showSenderNames={showSenderNames}\n groupByDate={groupByDate}\n onLoadMore={eventHandlers.onLoadMore}\n onRetryMessage={eventHandlers.onRetryMessage}\n onAttachmentClick={handleAttachmentClick}\n emptyState={emptyState}\n formatTimestamp={formatTimestamp}\n className=\"h-full\"\n />\n </DragDropZone>\n\n {/* Composer */}\n <MessageComposer\n onSend={handleSendMessage}\n onTypingStart={eventHandlers.onTypingStart}\n onTypingStop={eventHandlers.onTypingStop}\n placeholder={placeholder}\n maxLength={maxMessageLength}\n showCharacterCount={showCharacterCount}\n isSending={isSending}\n showAttachmentPicker={showAttachmentPicker}\n showCameraButton={showCameraButton}\n acceptedFileTypes={acceptedFileTypes}\n maxFileSize={maxFileSize}\n maxAttachments={maxAttachments}\n onError={onError}\n replyTo={replyTo}\n onCancelReply={() => setReplyTo(null)}\n />\n\n {/* Lightbox */}\n <LightboxModal\n attachment={lightboxAttachment}\n onClose={() => setLightboxAttachment(null)}\n />\n </div>\n );\n }\n);\n\nMessageThread.displayName = 'MessageThread';\n\n// ============================================================================\n// Split View Container Component\n// ============================================================================\n\nexport interface MessagingSplitViewProps {\n /** Conversation list content */\n conversationList: React.ReactNode;\n /** Message thread content */\n messageThread: React.ReactNode;\n /** Whether a conversation is selected */\n hasSelectedConversation?: boolean;\n /** Width of the conversation list on desktop */\n listWidth?: string | number;\n /** Breakpoint for mobile view */\n mobileBreakpoint?: 'sm' | 'md' | 'lg';\n /** Additional class name */\n className?: string;\n}\n\n/**\n * Split view container for desktop with responsive mobile behavior.\n *\n * @example\n * ```tsx\n * <MessagingSplitView\n * conversationList={<ConversationList />}\n * messageThread={<MessageThread />}\n * hasSelectedConversation={!!selectedConversation}\n * />\n * ```\n */\nfunction MessagingSplitView({\n conversationList,\n messageThread,\n hasSelectedConversation = false,\n listWidth = 320,\n mobileBreakpoint = 'md',\n className,\n}: MessagingSplitViewProps) {\n const breakpointClasses = {\n sm: 'sm:flex',\n md: 'md:flex',\n lg: 'lg:flex',\n };\n\n const hideMobileClasses = {\n sm: hasSelectedConversation ? 'hidden sm:block' : 'block sm:block',\n md: hasSelectedConversation ? 'hidden md:block' : 'block md:block',\n lg: hasSelectedConversation ? 'hidden lg:block' : 'block lg:block',\n };\n\n const showMobileClasses = {\n sm: hasSelectedConversation ? 'block sm:block' : 'hidden sm:block',\n md: hasSelectedConversation ? 'block md:block' : 'hidden md:block',\n lg: hasSelectedConversation ? 'block lg:block' : 'hidden lg:block',\n };\n\n return (\n <div\n data-slot=\"messaging-split-view\"\n className={cn(\n 'h-full w-full',\n breakpointClasses[mobileBreakpoint],\n className\n )}\n >\n {/* Conversation list */}\n <div\n data-slot=\"messaging-list-pane\"\n className={cn(\n 'h-full w-full flex-shrink-0',\n 'border-r border-neutral-200 dark:border-neutral-700',\n hideMobileClasses[mobileBreakpoint]\n )}\n style={{\n width: typeof listWidth === 'number' ? `${listWidth}px` : listWidth,\n }}\n >\n {conversationList}\n </div>\n\n {/* Message thread */}\n <div\n data-slot=\"messaging-thread-pane\"\n className={cn(\n 'h-full min-w-0 flex-1',\n showMobileClasses[mobileBreakpoint]\n )}\n >\n {messageThread}\n </div>\n </div>\n );\n}\n\nMessagingSplitView.displayName = 'MessagingSplitView';\n\nexport { MessageThread, LightboxModal, MessagingSplitView };\n","import * as React from 'react';\nimport type {\n Message,\n MessageParticipant,\n MessageStatus,\n TypingState,\n NewMessage,\n} from './types';\n\n// ============================================================================\n// useMessages Hook\n// ============================================================================\n\nexport interface UseMessagesOptions {\n /** Initial messages */\n initialMessages?: Message[];\n /** Current user */\n currentUser: MessageParticipant;\n /** Called when a message is sent */\n onSend?: (message: NewMessage) => Promise<Message>;\n /** Called when a message is retried */\n onRetry?: (messageId: string) => Promise<void>;\n /** Called when messages need to be loaded */\n onLoadMore?: () => Promise<Message[]>;\n}\n\nexport interface UseMessagesReturn {\n /** Current messages */\n messages: Message[];\n /** Add a new message (from external source) */\n addMessage: (message: Message) => void;\n /** Update a message */\n updateMessage: (messageId: string, updates: Partial<Message>) => void;\n /** Remove a message */\n removeMessage: (messageId: string) => void;\n /** Send a new message */\n sendMessage: (content: NewMessage) => Promise<void>;\n /** Retry a failed message */\n retryMessage: (messageId: string) => Promise<void>;\n /** Load more messages */\n loadMore: () => Promise<void>;\n /** Whether sending is in progress */\n isSending: boolean;\n /** Whether loading more is in progress */\n isLoadingMore: boolean;\n /** Mark a message as read */\n markAsRead: (messageId: string) => void;\n /** Update message status */\n updateStatus: (messageId: string, status: MessageStatus) => void;\n}\n\n/**\n * Hook for managing message state with optimistic updates.\n *\n * @example\n * ```tsx\n * const {\n * messages,\n * sendMessage,\n * isSending,\n * } = useMessages({\n * currentUser,\n * onSend: async (msg) => await api.sendMessage(msg),\n * });\n * ```\n */\nexport function useMessages(options: UseMessagesOptions): UseMessagesReturn {\n const {\n initialMessages = [],\n currentUser,\n onSend,\n onRetry,\n onLoadMore,\n } = options;\n\n const [messages, setMessages] = React.useState<Message[]>(initialMessages);\n const [isSending, setIsSending] = React.useState(false);\n const [isLoadingMore, setIsLoadingMore] = React.useState(false);\n\n // Update messages when initialMessages changes\n React.useEffect(() => {\n setMessages(initialMessages);\n }, [initialMessages]);\n\n const addMessage = React.useCallback((message: Message) => {\n setMessages((prev) => {\n // Avoid duplicates\n if (prev.some((m) => m.id === message.id)) {\n return prev;\n }\n return [...prev, message];\n });\n }, []);\n\n const updateMessage = React.useCallback(\n (messageId: string, updates: Partial<Message>) => {\n setMessages((prev) =>\n prev.map((m) => (m.id === messageId ? { ...m, ...updates } : m))\n );\n },\n []\n );\n\n const removeMessage = React.useCallback((messageId: string) => {\n setMessages((prev) => prev.filter((m) => m.id !== messageId));\n }, []);\n\n const updateStatus = React.useCallback(\n (messageId: string, status: MessageStatus) => {\n updateMessage(messageId, { status });\n },\n [updateMessage]\n );\n\n const markAsRead = React.useCallback(\n (messageId: string) => {\n updateStatus(messageId, 'read');\n },\n [updateStatus]\n );\n\n const sendMessage = React.useCallback(\n async (newMessage: NewMessage) => {\n // Create optimistic message\n const optimisticId = `optimistic-${Date.now()}`;\n const optimisticMessage: Message = {\n id: optimisticId,\n type: 'text',\n content: newMessage.content,\n sender: currentUser,\n timestamp: new Date(),\n status: 'sending',\n attachments: [], // Would handle attachment uploads here\n };\n\n // Add optimistic message\n addMessage(optimisticMessage);\n setIsSending(true);\n\n try {\n if (onSend) {\n const sentMessage = await onSend(newMessage);\n // Replace optimistic message with real one\n setMessages((prev) =>\n prev.map((m) => (m.id === optimisticId ? sentMessage : m))\n );\n } else {\n // No send handler, just mark as sent\n updateStatus(optimisticId, 'sent');\n }\n } catch {\n // Mark as failed\n updateStatus(optimisticId, 'failed');\n } finally {\n setIsSending(false);\n }\n },\n [currentUser, onSend, addMessage, updateStatus]\n );\n\n const retryMessage = React.useCallback(\n async (messageId: string) => {\n updateStatus(messageId, 'sending');\n\n try {\n if (onRetry) {\n await onRetry(messageId);\n updateStatus(messageId, 'sent');\n }\n } catch {\n updateStatus(messageId, 'failed');\n }\n },\n [onRetry, updateStatus]\n );\n\n const loadMore = React.useCallback(async () => {\n if (isLoadingMore || !onLoadMore) return;\n\n setIsLoadingMore(true);\n try {\n const olderMessages = await onLoadMore();\n setMessages((prev) => [...olderMessages, ...prev]);\n } finally {\n setIsLoadingMore(false);\n }\n }, [isLoadingMore, onLoadMore]);\n\n return {\n messages,\n addMessage,\n updateMessage,\n removeMessage,\n sendMessage,\n retryMessage,\n loadMore,\n isSending,\n isLoadingMore,\n markAsRead,\n updateStatus,\n };\n}\n\n// ============================================================================\n// useTypingIndicator Hook\n// ============================================================================\n\nexport interface UseTypingIndicatorOptions {\n /** Current typing participants (from server) */\n typingParticipants?: MessageParticipant[];\n /** Debounce time for typing stop (ms) */\n debounceTime?: number;\n /** Called when local user starts typing */\n onTypingStart?: () => void;\n /** Called when local user stops typing */\n onTypingStop?: () => void;\n}\n\nexport interface UseTypingIndicatorReturn {\n /** Current typing state */\n typingState: TypingState;\n /** Signal that local user is typing */\n startTyping: () => void;\n /** Signal that local user stopped typing */\n stopTyping: () => void;\n /** Update remote typing participants */\n setTypingParticipants: (participants: MessageParticipant[]) => void;\n}\n\n/**\n * Hook for managing typing indicator state.\n *\n * @example\n * ```tsx\n * const { typingState, startTyping, stopTyping } = useTypingIndicator({\n * onTypingStart: () => socket.emit('typing', true),\n * onTypingStop: () => socket.emit('typing', false),\n * });\n * ```\n */\nexport function useTypingIndicator(\n options: UseTypingIndicatorOptions = {}\n): UseTypingIndicatorReturn {\n const {\n typingParticipants: initialParticipants = [],\n debounceTime = 2000,\n onTypingStart,\n onTypingStop,\n } = options;\n\n const [participants, setParticipants] =\n React.useState<MessageParticipant[]>(initialParticipants);\n const [isLocalTyping, setIsLocalTyping] = React.useState(false);\n const typingTimeoutRef = React.useRef<NodeJS.Timeout | null>(null);\n\n // Update from props\n React.useEffect(() => {\n setParticipants(initialParticipants);\n }, [initialParticipants]);\n\n const startTyping = React.useCallback(() => {\n if (!isLocalTyping) {\n setIsLocalTyping(true);\n onTypingStart?.();\n }\n\n // Reset timeout\n if (typingTimeoutRef.current) {\n clearTimeout(typingTimeoutRef.current);\n }\n\n typingTimeoutRef.current = setTimeout(() => {\n setIsLocalTyping(false);\n onTypingStop?.();\n }, debounceTime);\n }, [isLocalTyping, debounceTime, onTypingStart, onTypingStop]);\n\n const stopTyping = React.useCallback(() => {\n if (typingTimeoutRef.current) {\n clearTimeout(typingTimeoutRef.current);\n }\n setIsLocalTyping(false);\n onTypingStop?.();\n }, [onTypingStop]);\n\n // Cleanup on unmount\n React.useEffect(() => {\n return () => {\n if (typingTimeoutRef.current) {\n clearTimeout(typingTimeoutRef.current);\n }\n };\n }, []);\n\n const typingState: TypingState = React.useMemo(\n () => ({\n participants,\n lastUpdated: new Date(),\n }),\n [participants]\n );\n\n return {\n typingState,\n startTyping,\n stopTyping,\n setTypingParticipants: setParticipants,\n };\n}\n\n// ============================================================================\n// useMessageScroll Hook\n// ============================================================================\n\nexport interface UseMessageScrollOptions {\n /** Messages to watch for changes */\n messages: Message[];\n /** Current user ID */\n currentUserId: string;\n /** Threshold from bottom to consider \"at bottom\" (px) */\n threshold?: number;\n}\n\nexport interface UseMessageScrollReturn {\n /** Ref to attach to scroll container */\n scrollContainerRef: React.RefObject<HTMLDivElement | null>;\n /** Ref to attach to bottom anchor element */\n bottomRef: React.RefObject<HTMLDivElement | null>;\n /** Whether user has scrolled up from bottom */\n isScrolledUp: boolean;\n /** Scroll to bottom */\n scrollToBottom: (smooth?: boolean) => void;\n}\n\n/**\n * Hook for managing message list scroll behavior.\n *\n * @example\n * ```tsx\n * const { scrollContainerRef, bottomRef, isScrolledUp, scrollToBottom } =\n * useMessageScroll({ messages, currentUserId: user.id });\n * ```\n */\nexport function useMessageScroll(\n options: UseMessageScrollOptions\n): UseMessageScrollReturn {\n const { messages, currentUserId, threshold = 100 } = options;\n\n const scrollContainerRef = React.useRef<HTMLDivElement>(null);\n const bottomRef = React.useRef<HTMLDivElement>(null);\n const [isScrolledUp, setIsScrolledUp] = React.useState(false);\n const prevMessageCountRef = React.useRef(messages.length);\n\n // Handle scroll events\n React.useEffect(() => {\n const container = scrollContainerRef.current;\n if (!container) return;\n\n const handleScroll = () => {\n const { scrollTop, scrollHeight, clientHeight } = container;\n const isAtBottom = scrollHeight - scrollTop - clientHeight < threshold;\n setIsScrolledUp(!isAtBottom);\n };\n\n container.addEventListener('scroll', handleScroll);\n return () => container.removeEventListener('scroll', handleScroll);\n }, [threshold]);\n\n const scrollToBottom = React.useCallback((smooth = true) => {\n bottomRef.current?.scrollIntoView({\n behavior: smooth ? 'smooth' : 'auto',\n });\n }, []);\n\n // Auto-scroll on new messages\n React.useEffect(() => {\n const messageCountChanged = messages.length !== prevMessageCountRef.current;\n prevMessageCountRef.current = messages.length;\n\n if (!messageCountChanged) return;\n\n const lastMessage = messages[messages.length - 1];\n const isOutgoing = lastMessage?.sender.id === currentUserId;\n\n // Always scroll on outgoing, only scroll on incoming if at bottom\n if (isOutgoing || !isScrolledUp) {\n scrollToBottom(true);\n }\n }, [messages, currentUserId, isScrolledUp, scrollToBottom]);\n\n return {\n scrollContainerRef,\n bottomRef,\n isScrolledUp,\n scrollToBottom,\n };\n}\n\n// ============================================================================\n// useReadReceipts Hook\n// ============================================================================\n\nexport interface UseReadReceiptsOptions {\n /** Messages to track */\n messages: Message[];\n /** Current user ID */\n currentUserId: string;\n /** Called when a message should be marked as read */\n onMarkRead?: (messageId: string) => void;\n /** IntersectionObserver threshold */\n threshold?: number;\n}\n\n/**\n * Hook for automatically marking messages as read when visible.\n *\n * @example\n * ```tsx\n * const { observeMessage } = useReadReceipts({\n * messages,\n * currentUserId: user.id,\n * onMarkRead: (id) => socket.emit('read', id),\n * });\n * ```\n */\nexport function useReadReceipts(options: UseReadReceiptsOptions) {\n const { currentUserId, onMarkRead, threshold = 0.5 } = options;\n\n const observerRef = React.useRef<IntersectionObserver | null>(null);\n const observedMessagesRef = React.useRef<Set<string>>(new Set());\n\n React.useEffect(() => {\n observerRef.current = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n const messageId = entry.target.getAttribute('data-message-id');\n if (messageId && !observedMessagesRef.current.has(messageId)) {\n observedMessagesRef.current.add(messageId);\n onMarkRead?.(messageId);\n }\n }\n });\n },\n { threshold }\n );\n\n return () => {\n observerRef.current?.disconnect();\n };\n }, [onMarkRead, threshold]);\n\n const observeMessage = React.useCallback(\n (element: HTMLElement | null, message: Message) => {\n if (!element || !observerRef.current) return;\n\n // Only observe unread incoming messages\n if (\n message.sender.id !== currentUserId &&\n message.status !== 'read' &&\n !observedMessagesRef.current.has(message.id)\n ) {\n element.setAttribute('data-message-id', message.id);\n observerRef.current.observe(element);\n }\n },\n [currentUserId]\n );\n\n return { observeMessage };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/AI/icons.tsx","../src/components/AI/CollapsiblePill.tsx","../src/components/AI/MCPToolCall.tsx","../src/components/AI/AIMessage.tsx"],"names":["React","jsxs","jsx","cva"],"mappings":"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","file":"chunk-RZJXCI53.js","sourcesContent":["/**\n * AI Component Icons\n *\n * Shared icon components for AI features to follow DRY principles.\n */\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\n\n// ============================================================================\n// Sparkles Icon (Modern AI Symbol)\n// ============================================================================\n\nexport interface SparklesIconProps {\n className?: string;\n /** Size variant */\n size?: 'sm' | 'md' | 'lg';\n}\n\nconst sizeClasses = {\n sm: 'h-4 w-4',\n md: 'h-5 w-5',\n lg: 'h-7 w-7',\n};\n\n/**\n * Sparkles icon - the modern symbol for AI features\n * Used by ChatGPT, GitHub Copilot, Google Gemini, etc.\n */\nexport function SparklesIcon({ className, size = 'md' }: SparklesIconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn(sizeClasses[size], className)}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n {/* Large sparkle */}\n <path d=\"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z\" />\n {/* Small sparkle */}\n <path\n d=\"M20 3v4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M22 5h-4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\n// ============================================================================\n// AI Logo Icon (Stack/Layers) - Legacy\n// ============================================================================\n\nexport interface AILogoIconProps {\n className?: string;\n /** Size variant */\n size?: 'sm' | 'md' | 'lg';\n}\n\n/**\n * The AI assistant logo - a stacked layers/prism icon\n * @deprecated Use SparklesIcon for a more recognizable AI symbol\n */\nexport function AILogoIcon({ className, size = 'md' }: AILogoIconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn(sizeClasses[size], className)}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <path\n d=\"M12 2L2 7L12 12L22 7L12 2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"currentColor\"\n fillOpacity=\"0.2\"\n />\n <path\n d=\"M2 17L12 22L22 17\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M2 12L12 17L22 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\n// ============================================================================\n// Close Icon\n// ============================================================================\n\nexport interface CloseIconProps {\n className?: string;\n}\n\nexport function CloseIcon({ className }: CloseIconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn('h-5 w-5', className)}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n );\n}\n\n// ============================================================================\n// Refresh/Clear Icon\n// ============================================================================\n\nexport interface RefreshIconProps {\n className?: string;\n}\n\nexport function RefreshIcon({ className }: RefreshIconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn('h-5 w-5', className)}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0l3.181 3.183a8.25 8.25 0 0013.803-3.7M4.031 9.865a8.25 8.25 0 0113.803-3.7l3.181 3.182m0-4.991v4.99\"\n />\n </svg>\n );\n}\n\n// ============================================================================\n// Chevron Icon\n// ============================================================================\n\nexport interface ChevronIconProps {\n className?: string;\n direction?: 'up' | 'down' | 'left' | 'right';\n}\n\nconst chevronRotation = {\n up: '-rotate-180',\n down: '',\n left: 'rotate-90',\n right: '-rotate-90',\n};\n\nexport function ChevronIcon({\n className,\n direction = 'down',\n}: ChevronIconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn('h-4 w-4', chevronRotation[direction], className)}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n );\n}\n\n// ============================================================================\n// Send Icon\n// ============================================================================\n\nexport interface SendIconProps {\n className?: string;\n}\n\nexport function SendIcon({ className }: SendIconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn('h-5 w-5', className)}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 19l9 2-9-18-9 18 9-2zm0 0v-8\"\n />\n </svg>\n );\n}\n\n// ============================================================================\n// Spinner Icon\n// ============================================================================\n\nexport interface SpinnerIconProps {\n className?: string;\n}\n\nexport function SpinnerIcon({ className }: SpinnerIconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn('h-5 w-5 animate-spin', className)}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n />\n </svg>\n );\n}\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { ChevronIcon } from './icons';\n\nexport interface CollapsiblePillProps {\n label: string;\n leadingIcon?: React.ReactNode;\n density?: 'standard' | 'condensed';\n defaultOpen?: boolean;\n pillClassName?: string;\n className?: string;\n /** Native tooltip shown on hover (e.g. \"Show details\") */\n title?: string;\n children?: React.ReactNode;\n}\n\nexport function CollapsiblePill({\n label,\n leadingIcon,\n density = 'standard',\n defaultOpen = false,\n pillClassName,\n className,\n title,\n children,\n}: CollapsiblePillProps) {\n const hasContent = Boolean(children);\n const [isOpen, setIsOpen] = React.useState(defaultOpen);\n const contentId = React.useId();\n\n React.useEffect(() => {\n setIsOpen(defaultOpen);\n }, [defaultOpen]);\n\n const toggle = () => {\n setIsOpen((open) => !open);\n };\n\n return (\n <div data-slot=\"collapsible-pill\" className={className}>\n <button\n type=\"button\"\n onClick={hasContent ? toggle : undefined}\n aria-expanded={hasContent ? isOpen : undefined}\n aria-controls={hasContent ? contentId : undefined}\n title={title}\n disabled={!hasContent}\n className={cn(\n 'focus-visible:ring-ring inline-flex items-center gap-1.5 border font-medium transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-1',\n density === 'condensed'\n ? 'rounded-[8px] px-2 py-0.5 text-[10px]'\n : 'rounded-[10px] px-[11px] py-1 text-[11px]',\n pillClassName\n )}\n >\n {leadingIcon}\n <span>{label}</span>\n {hasContent && (\n <ChevronIcon\n direction={isOpen ? 'down' : 'right'}\n className={\n density === 'condensed'\n ? 'h-2.5 w-2.5 opacity-60'\n : 'h-3 w-3 opacity-60'\n }\n />\n )}\n </button>\n {hasContent && (\n <div\n id={contentId}\n aria-hidden={!isOpen}\n inert={!isOpen || undefined}\n className={cn(\n 'overflow-hidden transition-[max-height,opacity] duration-300 ease-in-out',\n isOpen\n ? 'max-h-[500px] overflow-y-auto opacity-100'\n : 'max-h-0 opacity-0'\n )}\n >\n <div className=\"mt-1.5\">{children}</div>\n </div>\n )}\n </div>\n );\n}\n","/**\n * MCP Tool Call Display Component\n *\n * Renders an MCP tool invocation with status, parameters, and results.\n */\n\nimport * as React from 'react';\nimport { cva } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport { CollapsiblePill } from './CollapsiblePill';\nimport type {\n MCPToolCall,\n MCPToolStatus,\n MCPToolResult,\n MCPResourceLink,\n MCPToolParameter,\n} from './types';\n\n// ============================================================================\n// Status Icon Component\n// ============================================================================\n\nconst statusIconVariants = cva(\n 'flex h-5 w-5 items-center justify-center rounded-full',\n {\n variants: {\n status: {\n pending: 'bg-neutral-200 dark:bg-neutral-700',\n running: 'bg-primary-100 dark:bg-primary-900/50',\n success: 'bg-green-100 dark:bg-green-900/50',\n error: 'bg-red-100 dark:bg-red-900/50',\n cancelled: 'bg-neutral-200 dark:bg-neutral-700',\n },\n },\n defaultVariants: {\n status: 'pending',\n },\n }\n);\n\ninterface ToolStatusIconProps {\n status: MCPToolStatus;\n className?: string;\n}\n\nfunction ToolStatusIcon({ status, className }: ToolStatusIconProps) {\n return (\n <span\n data-slot=\"ai-tool-status-icon\"\n className={cn(statusIconVariants({ status }), className)}\n >\n {status === 'pending' && (\n <svg\n aria-hidden=\"true\"\n className=\"h-3 w-3 text-neutral-500\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <circle cx=\"10\" cy=\"10\" r=\"3\" />\n </svg>\n )}\n {status === 'running' && (\n <svg\n aria-hidden=\"true\"\n className=\"text-primary-800 dark:text-primary-400 h-3 w-3 animate-spin\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n />\n </svg>\n )}\n {status === 'success' && (\n <svg\n aria-hidden=\"true\"\n className=\"h-3 w-3 text-green-600 dark:text-green-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n )}\n {status === 'error' && (\n <svg\n aria-hidden=\"true\"\n className=\"h-3 w-3 text-red-600 dark:text-red-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n )}\n {status === 'cancelled' && (\n <svg\n aria-hidden=\"true\"\n className=\"h-3 w-3 text-neutral-500\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M18 12H6\" />\n </svg>\n )}\n </span>\n );\n}\n\n// ============================================================================\n// Tool Icon Component\n// ============================================================================\n\nconst TOOL_ICONS: Record<string, React.ReactNode> = {\n // Patient tools\n create_patient: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M18 7.5v3m0 0v3m0-3h3m-3 0h-3m-2.25-4.125a3.375 3.375 0 11-6.75 0 3.375 3.375 0 016.75 0zM3 19.235v-.11a6.375 6.375 0 0112.75 0v.109A12.318 12.318 0 019.374 21c-2.331 0-4.512-.645-6.374-1.766z\"\n />\n </svg>\n ),\n get_patient: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z\"\n />\n </svg>\n ),\n search_patients: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607z\"\n />\n </svg>\n ),\n // Appointment tools\n schedule_appointment: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 012.25-2.25h13.5A2.25 2.25 0 0121 7.5v11.25m-18 0A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75m-18 0v-7.5A2.25 2.25 0 015.25 9h13.5A2.25 2.25 0 0121 11.25v7.5m-9-6h.008v.008H12v-.008zM12 15h.008v.008H12V15zm0 2.25h.008v.008H12v-.008zM9.75 15h.008v.008H9.75V15zm0 2.25h.008v.008H9.75v-.008zM7.5 15h.008v.008H7.5V15zm0 2.25h.008v.008H7.5v-.008zm6.75-4.5h.008v.008h-.008v-.008zm0 2.25h.008v.008h-.008V15zm0 2.25h.008v.008h-.008v-.008zm2.25-4.5h.008v.008H16.5v-.008zm0 2.25h.008v.008H16.5V15z\"\n />\n </svg>\n ),\n // Document tools\n create_document: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m3.75 9v6m3-3H9m1.5-12H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z\"\n />\n </svg>\n ),\n // Provider tools\n search_providers: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M15 10.5a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19.5 10.5c0 7.142-7.5 11.25-7.5 11.25S4.5 17.642 4.5 10.5a7.5 7.5 0 1115 0z\"\n />\n </svg>\n ),\n // Default tool icon\n default: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M11.42 15.17L17.25 21A2.652 2.652 0 0021 17.25l-5.877-5.877M11.42 15.17l2.496-3.03c.317-.384.74-.626 1.208-.766M11.42 15.17l-4.655 5.653a2.548 2.548 0 11-3.586-3.586l6.837-5.63m5.108-.233c.55-.164 1.163-.188 1.743-.14a4.5 4.5 0 004.486-6.336l-3.276 3.277a3.004 3.004 0 01-2.25-2.25l3.276-3.276a4.5 4.5 0 00-6.336 4.486c.091 1.076-.071 2.264-.904 2.95l-.102.085m-1.745 1.437L5.909 7.5H4.5L2.25 3.75l1.5-1.5L7.5 4.5v1.409l4.26 4.26m-1.745 1.437l1.745-1.437m6.615 8.206L15.75 15.75M4.867 19.125h.008v.008h-.008v-.008z\"\n />\n </svg>\n ),\n};\n\nfunction getToolIcon(toolName: string): React.ReactNode {\n return TOOL_ICONS[toolName] || TOOL_ICONS.default;\n}\n\n// ============================================================================\n// Resource Link Component\n// ============================================================================\n\nexport interface ResourceLinkProps {\n link: MCPResourceLink;\n onClick?: (link: MCPResourceLink) => void;\n className?: string;\n}\n\nexport function ResourceLink({ link, onClick, className }: ResourceLinkProps) {\n const handleClick = (e: React.MouseEvent) => {\n if (onClick) {\n e.preventDefault();\n onClick(link);\n }\n };\n\n const linkTypeIcons: Record<string, React.ReactNode> = {\n patient: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z\"\n />\n </svg>\n ),\n document: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z\"\n />\n </svg>\n ),\n appointment: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 012.25-2.25h13.5A2.25 2.25 0 0121 7.5v11.25m-18 0A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75m-18 0v-7.5A2.25 2.25 0 015.25 9h13.5A2.25 2.25 0 0121 11.25v7.5\"\n />\n </svg>\n ),\n order: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M9 12h3.75M9 15h3.75M9 18h3.75m3 .75H18a2.25 2.25 0 002.25-2.25V6.108c0-1.135-.845-2.098-1.976-2.192a48.424 48.424 0 00-1.123-.08m-5.801 0c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m0 0H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V9.375c0-.621-.504-1.125-1.125-1.125H8.25z\"\n />\n </svg>\n ),\n provider: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M15 10.5a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19.5 10.5c0 7.142-7.5 11.25-7.5 11.25S4.5 17.642 4.5 10.5a7.5 7.5 0 1115 0z\"\n />\n </svg>\n ),\n external: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M13.5 6H5.25A2.25 2.25 0 003 8.25v10.5A2.25 2.25 0 005.25 21h10.5A2.25 2.25 0 0018 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25\"\n />\n </svg>\n ),\n internal: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M13.19 8.688a4.5 4.5 0 011.242 7.244l-4.5 4.5a4.5 4.5 0 01-6.364-6.364l1.757-1.757m13.35-.622l1.757-1.757a4.5 4.5 0 00-6.364-6.364l-4.5 4.5a4.5 4.5 0 001.242 7.244\"\n />\n </svg>\n ),\n };\n\n const icon = link.type ? linkTypeIcons[link.type] : linkTypeIcons.internal;\n\n return (\n <a\n href={link.href}\n onClick={handleClick}\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-md px-2.5 py-1.5',\n 'bg-primary-50 text-primary-900 hover:bg-primary-100',\n 'dark:bg-primary-900/30 dark:text-primary-300 dark:hover:bg-primary-900/50',\n 'text-sm font-medium transition-colors',\n 'focus:ring-primary-500 focus:ring-2 focus:ring-offset-2 focus:outline-none',\n 'dark:focus:ring-offset-neutral-900',\n className\n )}\n >\n {icon}\n <span>{link.label}</span>\n {link.type === 'external' && (\n <svg\n aria-hidden=\"true\"\n className=\"h-3 w-3 opacity-60\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M4.5 19.5l15-15m0 0H8.25m11.25 0v11.25\"\n />\n </svg>\n )}\n </a>\n );\n}\n\n// ============================================================================\n// Tool Result Component\n// ============================================================================\n\ninterface ToolResultDisplayProps {\n result: MCPToolResult;\n onLinkClick?: (link: MCPResourceLink) => void;\n className?: string;\n}\n\nfunction ToolResultDisplay({\n result,\n onLinkClick,\n className,\n}: ToolResultDisplayProps) {\n if (result.type === 'error') {\n return (\n <div\n className={cn(\n 'mt-2 rounded-md bg-red-50 p-3 dark:bg-red-900/20',\n className\n )}\n >\n <p className=\"text-sm text-red-700 dark:text-red-300\">\n {typeof result.data === 'string'\n ? String(result.data)\n : 'An error occurred'}\n </p>\n </div>\n );\n }\n\n return (\n <div className={cn('space-y-2', className)}>\n {result.summary && (\n <p className=\"text-sm text-neutral-700 dark:text-neutral-300\">\n {result.summary}\n </p>\n )}\n\n {result.link && <ResourceLink link={result.link} onClick={onLinkClick} />}\n\n {result.resources && result.resources.length > 0 && (\n <div className=\"flex flex-wrap gap-2\">\n {result.resources.map((resource) => (\n <ResourceLink\n key={resource.id}\n link={{\n href: resource.uri || '#',\n label: resource.name,\n type: resource.type as MCPResourceLink['type'],\n }}\n onClick={onLinkClick}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ============================================================================\n// MCP Tool Call Component\n// ============================================================================\n\n// Human-readable tool names\nconst TOOL_FRIENDLY_NAMES: Record<string, string> = {\n create_patient: 'Creating patient',\n get_patient: 'Looking up patient',\n search_patients: 'Searching patients',\n update_patient: 'Updating patient',\n delete_patient: 'Removing patient',\n schedule_appointment: 'Scheduling appointment',\n cancel_appointment: 'Canceling appointment',\n update_appointment: 'Updating appointment',\n create_document: 'Creating document',\n upload_document: 'Uploading document',\n get_document: 'Retrieving document',\n search_documents: 'Searching documents',\n create_order: 'Creating order',\n send_message: 'Sending message',\n search: 'Searching',\n search_providers: 'Searching for providers',\n};\n\nfunction getToolFriendlyName(toolName: string, status: MCPToolStatus): string {\n const baseName = TOOL_FRIENDLY_NAMES[toolName] || toolName.replace(/_/g, ' ');\n\n // Adjust tense based on status\n if (status === 'success') {\n // Past tense approximation — check longer prefixes first to avoid\n // partial matches (e.g. \"Searching for\" before \"Searching\")\n if (baseName.startsWith('Creating'))\n return baseName.replace('Creating', 'Created');\n if (baseName.startsWith('Scheduling'))\n return baseName.replace('Scheduling', 'Scheduled');\n if (baseName.startsWith('Searching for'))\n return baseName.replace('Searching for', 'Found');\n if (baseName.startsWith('Searching'))\n return baseName.replace('Searching', 'Found');\n if (baseName.startsWith('Looking'))\n return baseName.replace('Looking', 'Found');\n if (baseName.startsWith('Updating'))\n return baseName.replace('Updating', 'Updated');\n if (baseName.startsWith('Removing'))\n return baseName.replace('Removing', 'Removed');\n if (baseName.startsWith('Canceling'))\n return baseName.replace('Canceling', 'Canceled');\n if (baseName.startsWith('Retrieving'))\n return baseName.replace('Retrieving', 'Retrieved');\n if (baseName.startsWith('Uploading'))\n return baseName.replace('Uploading', 'Uploaded');\n if (baseName.startsWith('Sending'))\n return baseName.replace('Sending', 'Sent');\n }\n return baseName;\n}\n\n// Generate a user-friendly summary from parameters\nfunction getParameterSummary(\n toolName: string,\n params: MCPToolParameter[]\n): string | null {\n const paramMap = Object.fromEntries(params.map((p) => [p.name, p.value]));\n\n // Patient creation\n if (\n toolName === 'create_patient' &&\n paramMap.firstName &&\n paramMap.lastName\n ) {\n return `${paramMap.firstName} ${paramMap.lastName}`;\n }\n\n // Search\n if (toolName.includes('search') && paramMap.query) {\n return `\"${paramMap.query}\"`;\n }\n\n // Appointment\n if (toolName.includes('appointment') && paramMap.patientName) {\n const date = paramMap.preferredDate || paramMap.date;\n return date\n ? `${paramMap.patientName} on ${date}`\n : String(paramMap.patientName);\n }\n\n // Provider search\n if (toolName === 'search_providers' && paramMap.zipcode) {\n const service = paramMap.service;\n return service\n ? `${service} near ${paramMap.zipcode}`\n : `near ${paramMap.zipcode}`;\n }\n\n return null;\n}\n\n// Pill header colors per status (Ozwell-style status pill)\nconst statusPillClasses: Record<MCPToolStatus, string> = {\n pending:\n 'bg-neutral-100 border-neutral-200 text-neutral-600 dark:bg-neutral-800 dark:border-neutral-700 dark:text-neutral-400',\n running:\n 'bg-primary-50 border-primary-200 text-primary-800 dark:bg-primary-900/20 dark:border-primary-800 dark:text-primary-300',\n success:\n 'bg-green-50 border-green-200 text-green-700 dark:bg-green-900/20 dark:border-green-800 dark:text-green-300',\n error:\n 'bg-red-50 border-red-200 text-red-700 dark:bg-red-900/20 dark:border-red-800 dark:text-red-300',\n cancelled:\n 'bg-neutral-100 border-neutral-200 text-neutral-400 opacity-60 dark:bg-neutral-800 dark:border-neutral-700 dark:text-neutral-400',\n};\n\nexport interface MCPToolCallDisplayProps {\n /** The tool call to display */\n toolCall: MCPToolCall;\n /** Compact (condensed) sizing — tighter pill and box */\n compact?: boolean;\n /** Whether to include raw parameters inside the detail box */\n showParameters?: boolean;\n /** Whether clicking the pill can expand/collapse the entire detail box */\n collapsible?: boolean;\n /** Default collapsed state. By default, completed tool calls start expanded. */\n defaultCollapsed?: boolean;\n /** Hide the whole tool-call display (mirrors Ozwell's debug flag) */\n hidden?: boolean;\n /** Callback when a resource link is clicked */\n onLinkClick?: (link: MCPResourceLink) => void;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * Displays an MCP tool call with its status, parameters, and results.\n * Shows a user-friendly summary by default, with technical details available on expand.\n */\nexport function MCPToolCallDisplay({\n toolCall,\n showParameters = true,\n collapsible = true,\n defaultCollapsed,\n compact,\n hidden = false,\n onLinkClick,\n className,\n}: MCPToolCallDisplayProps) {\n const formatDuration = (ms?: number) => {\n if (!ms) return null;\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(1)}s`;\n };\n\n const friendlyName = getToolFriendlyName(toolCall.toolName, toolCall.status);\n const durationLabel = formatDuration(toolCall.duration);\n const paramSummary = getParameterSummary(\n toolCall.toolName,\n toolCall.parameters\n );\n\n // While running, show the input summary in the pill (e.g. \"Creating patient\n // · John Smith\"). On success the name already appears as the result link, so\n // show the duration instead to avoid duplication.\n const detailBit =\n toolCall.status === 'success'\n ? durationLabel\n : (paramSummary ?? durationLabel);\n const pillLabel = detailBit ? `${friendlyName} · ${detailBit}` : friendlyName;\n\n const hasParams = showParameters && toolCall.parameters.length > 0;\n const hasBoxContent = Boolean(toolCall.result || toolCall.error || hasParams);\n const isCompleted =\n toolCall.status === 'success' || toolCall.status === 'error';\n const effectiveDefaultCollapsed = defaultCollapsed ?? !isCompleted;\n\n if (hidden) return null;\n\n // Everything the pill reveals in one click: result, links, and raw params.\n const box = (\n <div\n className={cn(\n 'w-full max-w-md space-y-2 rounded-lg border border-neutral-200 bg-neutral-50 dark:border-neutral-700 dark:bg-neutral-800/50',\n compact ? 'p-2' : 'p-3'\n )}\n >\n {/* Result Summary & Links */}\n {toolCall.result && (\n <div data-slot=\"ai-tool-result\">\n <ToolResultDisplay\n result={toolCall.result}\n onLinkClick={onLinkClick}\n />\n </div>\n )}\n\n {/* Error */}\n {toolCall.error && (\n <div className=\"rounded-md bg-red-100 p-2 dark:bg-red-900/30\">\n <p className=\"text-sm text-red-700 dark:text-red-300\">\n {toolCall.error}\n </p>\n </div>\n )}\n\n {/* Raw parameters — revealed together with the box */}\n {hasParams && (\n <div\n data-slot=\"ai-tool-parameters\"\n className=\"rounded-md bg-neutral-100 p-2 dark:bg-neutral-800\"\n >\n <h4 className=\"mb-1.5 text-xs font-medium tracking-wide text-neutral-600 uppercase dark:text-neutral-400\">\n Parameters\n </h4>\n <div className=\"space-y-0.5\">\n {toolCall.parameters.map((param) => (\n <div key={param.name} className=\"flex items-start gap-2 text-xs\">\n <span className=\"font-mono text-neutral-600 dark:text-neutral-400\">\n {param.name}:\n </span>\n <span className=\"font-mono text-neutral-700 dark:text-neutral-300\">\n {typeof param.value === 'string'\n ? param.value\n : JSON.stringify(param.value)}\n </span>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n\n const staticPill = (\n <span\n data-slot=\"ai-tool-pill\"\n className={cn(\n 'inline-flex items-center gap-1.5 border font-medium',\n compact\n ? 'rounded-[8px] px-2 py-0.5 text-[10px]'\n : 'rounded-[10px] px-[11px] py-1 text-[11px]',\n statusPillClasses[toolCall.status]\n )}\n >\n <ToolStatusIcon status={toolCall.status} />\n <span>{pillLabel}</span>\n </span>\n );\n\n return (\n <div data-slot=\"ai-tool-call\" className={className}>\n {!hasBoxContent ? (\n staticPill\n ) : collapsible ? (\n // Pill click reveals the whole box (result + params) in one go.\n <CollapsiblePill\n label={pillLabel}\n leadingIcon={<ToolStatusIcon status={toolCall.status} />}\n density={compact ? 'condensed' : 'standard'}\n defaultOpen={!effectiveDefaultCollapsed}\n pillClassName={statusPillClasses[toolCall.status]}\n title=\"Toggle details\"\n >\n {box}\n </CollapsiblePill>\n ) : (\n // Non-collapsible: pill + box always visible.\n <div className=\"space-y-1.5\">\n {staticPill}\n {box}\n </div>\n )}\n </div>\n );\n}\n\nexport { ToolStatusIcon, getToolIcon };\n","/**\n * AI Message Component\n *\n * Renders AI chat messages with support for text, tool calls, and streaming.\n */\n\nimport * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport type {\n AIMessage,\n AIMessageContent,\n AIRenderMessageFooter,\n AIRenderTextContent,\n MCPResourceLink,\n} from './types';\nimport { MCPToolCallDisplay } from './MCPToolCall';\nimport { SparklesIcon } from './icons';\nimport { CollapsiblePill } from './CollapsiblePill';\nimport { AudioPlayer } from '../AudioPlayer';\n\n// ============================================================================\n// Avatar Component\n// ============================================================================\n\nconst avatarVariants = cva(\n 'flex shrink-0 items-center justify-center rounded-full',\n {\n variants: {\n role: {\n user: 'bg-primary-100 text-primary-900 dark:bg-primary-900/50 dark:text-primary-300',\n assistant: 'bg-primary-800 text-white dark:bg-primary-800',\n system:\n 'bg-neutral-200 text-neutral-600 dark:bg-neutral-700 dark:text-neutral-400',\n tool: 'bg-amber-100 text-amber-700 dark:bg-amber-900/50 dark:text-amber-300',\n },\n size: {\n sm: 'h-6 w-6 text-xs',\n md: 'h-8 w-8 text-sm',\n lg: 'h-10 w-10 text-base',\n },\n },\n defaultVariants: {\n role: 'user',\n size: 'md',\n },\n }\n);\n\ninterface MessageAvatarProps extends VariantProps<typeof avatarVariants> {\n userName?: string;\n className?: string;\n}\n\nfunction MessageAvatar({\n role,\n size,\n userName,\n className,\n}: MessageAvatarProps) {\n const getInitials = (name?: string) => {\n if (!name) return '?';\n return name\n .split(' ')\n .map((n) => n[0])\n .join('')\n .substring(0, 2)\n .toUpperCase();\n };\n\n return (\n <div\n data-slot=\"ai-message-avatar\"\n className={cn(avatarVariants({ role, size }), className)}\n >\n {role === 'assistant' ? (\n <SparklesIcon size=\"md\" />\n ) : role === 'user' ? (\n <span className=\"font-medium\">{getInitials(userName)}</span>\n ) : role === 'system' ? (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z\"\n />\n </svg>\n ) : (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M11.42 15.17L17.25 21A2.652 2.652 0 0021 17.25l-5.877-5.877M11.42 15.17l2.496-3.03c.317-.384.74-.626 1.208-.766M11.42 15.17l-4.655 5.653a2.548 2.548 0 11-3.586-3.586l6.837-5.63m5.108-.233c.55-.164 1.163-.188 1.743-.14a4.5 4.5 0 004.486-6.336l-3.276 3.277a3.004 3.004 0 01-2.25-2.25l3.276-3.276a4.5 4.5 0 00-6.336 4.486c.091 1.076-.071 2.264-.904 2.95l-.102.085m-1.745 1.437L5.909 7.5H4.5L2.25 3.75l1.5-1.5L7.5 4.5v1.409l4.26 4.26m-1.745 1.437l1.745-1.437m6.615 8.206L15.75 15.75M4.867 19.125h.008v.008h-.008v-.008z\"\n />\n </svg>\n )}\n </div>\n );\n}\n\n// ============================================================================\n// Typing Indicator\n// ============================================================================\n\nfunction AITypingIndicator({ className }: { className?: string }) {\n const dotStyle = {\n width: '6px',\n height: '6px',\n minWidth: '6px',\n minHeight: '6px',\n flexShrink: 0,\n };\n\n return (\n <div\n data-slot=\"ai-typing-indicator\"\n className={cn('inline-flex items-center justify-center gap-2', className)}\n >\n <span\n className=\"rounded-full bg-neutral-500 dark:bg-neutral-400\"\n style={{\n ...dotStyle,\n animation: 'typing-dot 1.4s infinite ease-in-out both',\n animationDelay: '-0.32s',\n }}\n />\n <span\n className=\"rounded-full bg-neutral-500 dark:bg-neutral-400\"\n style={{\n ...dotStyle,\n animation: 'typing-dot 1.4s infinite ease-in-out both',\n animationDelay: '-0.16s',\n }}\n />\n <span\n className=\"rounded-full bg-neutral-500 dark:bg-neutral-400\"\n style={{\n ...dotStyle,\n animation: 'typing-dot 1.4s infinite ease-in-out both',\n }}\n />\n <style>{`\n @keyframes typing-dot {\n 0%, 80%, 100% { opacity: 0.4; }\n 40% { opacity: 1; }\n }\n `}</style>\n </div>\n );\n}\n\n// ============================================================================\n// Thinking Block\n// ============================================================================\n\nfunction ThinkingBlock({\n text,\n streaming,\n defaultCollapsed = false,\n}: {\n text: string;\n streaming: boolean;\n defaultCollapsed?: boolean;\n}) {\n const startedAt = React.useRef(Date.now());\n const [elapsed, setElapsed] = React.useState<number | null>(null);\n const prevStreaming = React.useRef(streaming);\n\n React.useEffect(() => {\n if (prevStreaming.current && !streaming) {\n setElapsed(Math.round((Date.now() - startedAt.current) / 1000));\n }\n prevStreaming.current = streaming;\n }, [streaming]);\n\n const label = streaming\n ? 'Thinking'\n : elapsed !== null && elapsed > 0\n ? `Thought for ${elapsed}s`\n : 'Thought';\n\n const dot = streaming ? (\n <span\n aria-hidden=\"true\"\n className=\"inline-block h-1.5 w-1.5 animate-pulse rounded-full bg-violet-500 dark:bg-violet-400\"\n />\n ) : null;\n\n return (\n <div data-slot=\"ai-message-thinking\">\n <CollapsiblePill\n label={label}\n leadingIcon={dot}\n defaultOpen={!defaultCollapsed}\n pillClassName=\"bg-violet-50 border-violet-200 text-violet-600 hover:bg-violet-100 dark:bg-violet-950/30 dark:border-violet-800 dark:text-violet-400 dark:hover:bg-violet-950/50 focus-visible:ring-violet-500\"\n >\n <div className=\"border-s-2 border-violet-200 ps-3 text-[13px] leading-relaxed text-neutral-600 italic dark:border-violet-700 dark:text-neutral-400\">\n {text}\n </div>\n </CollapsiblePill>\n </div>\n );\n}\n\n// ============================================================================\n// Content Block Renderer\n// ============================================================================\n\ninterface ContentBlockProps {\n content: AIMessageContent;\n onLinkClick?: (link: MCPResourceLink) => void;\n messageId: string;\n streaming: boolean;\n role: AIMessage['role'];\n renderTextContent?: AIRenderTextContent;\n}\n\nfunction ContentBlock({\n content,\n onLinkClick,\n messageId,\n streaming,\n role,\n renderTextContent,\n}: ContentBlockProps) {\n if (content.type === 'text' && content.text) {\n if (renderTextContent) {\n return (\n <div className=\"prose prose-sm dark:prose-invert max-w-none\">\n {renderTextContent(content.text, { messageId, streaming, role })}\n </div>\n );\n }\n return (\n <div className=\"prose prose-sm dark:prose-invert max-w-none\">\n <p className=\"whitespace-pre-wrap\">{content.text}</p>\n </div>\n );\n }\n\n if (content.type === 'tool_use' && content.toolCall) {\n return (\n <MCPToolCallDisplay\n toolCall={content.toolCall}\n onLinkClick={onLinkClick}\n defaultCollapsed={content.collapsed}\n />\n );\n }\n\n if (content.type === 'thinking' && content.text) {\n return (\n <ThinkingBlock\n text={content.text}\n streaming={streaming}\n defaultCollapsed={content.collapsed ?? false}\n />\n );\n }\n\n if (content.type === 'code' && content.text) {\n return (\n <pre\n data-slot=\"ai-message-code\"\n className=\"rounded-lg bg-neutral-900 p-3 text-sm dark:bg-neutral-950\"\n >\n <code\n className={content.language ? `language-${content.language}` : ''}\n >\n {content.text}\n </code>\n </pre>\n );\n }\n\n if (content.type === 'audio' && content.audioUrl) {\n // Guard against `javascript:` URLs, mirroring the image/file blocks.\n if (/^\\s*javascript:/i.test(content.audioUrl)) {\n return null;\n }\n return (\n <AudioPlayer\n src={content.audioUrl}\n title={content.text || 'Audio recording'}\n variant=\"waveform\"\n showTime\n showPlaybackRate\n fallbackDuration={content.duration}\n />\n );\n }\n\n if (content.type === 'video' && content.videoUrl) {\n // Guard against `javascript:` URLs, mirroring the audio/image/file blocks.\n if (/^\\s*javascript:/i.test(content.videoUrl)) {\n return null;\n }\n return (\n <video\n src={content.videoUrl}\n controls\n preload=\"metadata\"\n aria-label={content.text || 'Video recording'}\n className=\"my-1 max-h-80 w-full rounded-lg bg-black\"\n >\n {/* Recorded clips carry no caption track; present for a11y compliance. */}\n <track kind=\"captions\" />\n </video>\n );\n }\n\n if (content.type === 'image' && content.imageUrl) {\n const safeHref = /^\\s*javascript:/i.test(content.imageUrl)\n ? undefined\n : content.imageUrl;\n return (\n <a\n href={safeHref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"block w-fit transition-transform hover:scale-[1.02]\"\n aria-label={`View ${content.name || 'Uploaded image'}`}\n >\n <img\n src={content.imageUrl}\n alt={content.name || 'Uploaded image'}\n loading=\"lazy\"\n className=\"my-1 max-h-64 w-auto rounded-lg object-cover\"\n />\n </a>\n );\n }\n\n if (content.type === 'file') {\n const sizeLabel =\n typeof content.fileSize === 'number'\n ? formatFileSize(content.fileSize)\n : undefined;\n const card = (\n <div className=\"my-1 flex items-center gap-3 rounded-lg bg-neutral-100 p-3 transition-colors dark:bg-neutral-800\">\n <div className=\"rounded-lg bg-neutral-200 p-2 dark:bg-neutral-700\">\n <svg\n aria-hidden=\"true\"\n className=\"h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium\">\n {content.name || 'Document'}\n </p>\n {sizeLabel && <p className=\"text-xs opacity-70\">{sizeLabel}</p>}\n </div>\n </div>\n );\n\n if (content.fileUrl) {\n const safeFileHref = /^\\s*javascript:/i.test(content.fileUrl)\n ? undefined\n : content.fileUrl;\n return (\n <a\n href={safeFileHref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"block w-fit no-underline\"\n >\n {card}\n </a>\n );\n }\n return card;\n }\n\n return null;\n}\n\n/** Human-readable file size (e.g. \"1.2 MB\"). */\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n// ============================================================================\n// AI Message Component\n// ============================================================================\n\nconst messageVariants = cva('flex gap-3', {\n variants: {\n role: {\n user: 'flex-row-reverse',\n assistant: 'flex-row',\n system: 'flex-row justify-center',\n tool: 'flex-row',\n },\n },\n defaultVariants: {\n role: 'assistant',\n },\n});\n\nconst bubbleVariants = cva('rounded-2xl px-4 py-2.5 w-fit max-w-[85%]', {\n variants: {\n variant: {\n user: 'bg-primary-800 text-white dark:bg-primary-800',\n assistant:\n 'bg-neutral-100 text-neutral-900 dark:bg-neutral-800 dark:text-white',\n system:\n 'bg-neutral-100 text-neutral-600 dark:bg-neutral-800 dark:text-neutral-400 text-center text-sm max-w-[95%]',\n tool: 'bg-transparent p-0 max-w-full w-full',\n },\n },\n defaultVariants: {\n variant: 'assistant',\n },\n});\n\nexport interface ChatBubbleProps\n extends\n React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof bubbleVariants> {\n /** Show error styling (red border). */\n hasError?: boolean;\n /**\n * Optional left-border accent color. Used by multi-participant surfaces\n * (e.g. SuperChat) to tint a speaker's bubble; AI chat leaves it unset.\n */\n accent?: string;\n}\n\n/**\n * The shared chat bubble shell. This is the single source of truth for how a\n * chat message bubble looks across the library (AI chat, SuperChat, etc.).\n * Presentational only — callers render their own content inside.\n */\nconst ChatBubble = React.forwardRef<HTMLDivElement, ChatBubbleProps>(\n (\n { className, variant, hasError, accent, style, children, ...props },\n ref\n ) => {\n return (\n <div\n ref={ref}\n data-slot=\"chat-bubble\"\n className={cn(\n bubbleVariants({ variant }),\n hasError && 'border border-red-300 dark:border-red-700',\n className\n )}\n style={accent ? { borderLeft: `3px solid ${accent}`, ...style } : style}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nChatBubble.displayName = 'ChatBubble';\n\nexport interface AIMessageDisplayProps {\n /** The message to display */\n message: AIMessage;\n /** User name for user messages */\n userName?: string;\n /** Whether to show the avatar */\n showAvatar?: boolean;\n /** Whether to show timestamp */\n showTimestamp?: boolean;\n /** Callback when a resource link is clicked */\n onLinkClick?: (link: MCPResourceLink) => void;\n /**\n * Optional renderer for `text` content blocks (e.g. Markdown). Called per\n * text block with `{ messageId, streaming, role }`. Host must sanitize.\n */\n renderTextContent?: AIRenderTextContent;\n /**\n * Optional renderer for a per-message footer shown below the bubble (e.g.\n * message action controls). Aligned with the message (right for user, left\n * for assistant).\n */\n renderMessageFooter?: AIRenderMessageFooter;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * Displays an AI chat message with support for text, tool calls, and streaming.\n */\nexport function AIMessageDisplay({\n message,\n userName,\n showAvatar = true,\n showTimestamp = false,\n onLinkClick,\n renderTextContent,\n renderMessageFooter,\n className,\n}: AIMessageDisplayProps) {\n const isStreaming = message.status === 'streaming';\n const hasContent = message.content.length > 0;\n const messageFooter = renderMessageFooter?.(message);\n\n const formatTime = (timestamp: Date | string) => {\n const date = new Date(timestamp);\n return date.toLocaleTimeString(undefined, {\n hour: 'numeric',\n minute: '2-digit',\n });\n };\n\n // For tool messages, render just the tool call without bubble\n if (message.role === 'tool') {\n return (\n <div\n data-slot=\"ai-message\"\n className={cn(messageVariants({ role: message.role }), className)}\n >\n {showAvatar && <MessageAvatar role={message.role} />}\n <div className=\"flex-1 space-y-2\">\n {message.content.map((content, index) => (\n <ContentBlock\n key={index}\n content={content}\n onLinkClick={onLinkClick}\n messageId={message.id}\n streaming={isStreaming}\n role={message.role}\n renderTextContent={renderTextContent}\n />\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div\n data-slot=\"ai-message\"\n className={cn(messageVariants({ role: message.role }), className)}\n >\n {showAvatar && message.role !== 'system' && (\n <MessageAvatar role={message.role} userName={userName} />\n )}\n\n <div\n className={cn(\n 'flex min-w-0 flex-1 flex-col gap-1',\n message.role === 'user' && 'items-end'\n )}\n >\n <ChatBubble\n data-slot=\"ai-message-bubble\"\n variant={message.role}\n hasError={message.status === 'error'}\n >\n {hasContent ? (\n <div className=\"space-y-3\">\n {message.content.map((content, index) => (\n <ContentBlock\n key={index}\n content={content}\n onLinkClick={onLinkClick}\n messageId={message.id}\n streaming={isStreaming}\n role={message.role}\n renderTextContent={renderTextContent}\n />\n ))}\n </div>\n ) : isStreaming ? (\n <div className=\"flex items-center justify-center\">\n <AITypingIndicator />\n </div>\n ) : null}\n </ChatBubble>\n\n {messageFooter != null && messageFooter !== false && (\n <div data-slot=\"ai-message-footer\" className=\"w-fit max-w-[85%]\">\n {messageFooter}\n </div>\n )}\n\n {showTimestamp && (\n <span\n data-slot=\"ai-message-timestamp\"\n className=\"px-2 text-xs text-neutral-500\"\n >\n {formatTime(message.timestamp)}\n </span>\n )}\n\n {message.status === 'error' && (\n <span className=\"px-2 text-xs text-red-500\">\n {message.role === 'user' ? 'Failed to send' : 'An error occurred'}\n </span>\n )}\n </div>\n </div>\n );\n}\n\nexport { MessageAvatar, AITypingIndicator, ChatBubble, bubbleVariants };\n"]}