@particle-academy/react-fancy 6.11.1 → 6.12.0

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 (272) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/accordion-panel.cjs +7 -7
  3. package/dist/accordion-panel.js +1 -1
  4. package/dist/accordion.cjs +3 -3
  5. package/dist/accordion.js +1 -1
  6. package/dist/autocomplete.cjs +2 -2
  7. package/dist/autocomplete.js +1 -1
  8. package/dist/avatar.cjs +2 -2
  9. package/dist/avatar.js +1 -1
  10. package/dist/breadcrumbs.cjs +2 -2
  11. package/dist/breadcrumbs.js +1 -1
  12. package/dist/calendar.cjs +2 -2
  13. package/dist/calendar.js +1 -1
  14. package/dist/carousel.cjs +7 -7
  15. package/dist/carousel.js +1 -1
  16. package/dist/chart.cjs +2 -2
  17. package/dist/chart.js +1 -1
  18. package/dist/chat-drawer.cjs +2 -2
  19. package/dist/chat-drawer.js +1 -1
  20. package/dist/chat-thread.cjs +4 -4
  21. package/dist/chat-thread.js +2 -2
  22. package/dist/{chunk-GB2EGMVQ.cjs → chunk-2JNOPH3B.cjs} +3 -3
  23. package/dist/chunk-2JNOPH3B.cjs.map +1 -0
  24. package/dist/{chunk-R3PCZSBQ.js → chunk-2OCWIAGS.js} +4 -4
  25. package/dist/chunk-2OCWIAGS.js.map +1 -0
  26. package/dist/{chunk-KRECSPD3.js → chunk-2PNQTEXK.js} +3 -3
  27. package/dist/chunk-2PNQTEXK.js.map +1 -0
  28. package/dist/{chunk-RVBA4LEB.cjs → chunk-2SO4WS2E.cjs} +4 -4
  29. package/dist/{chunk-RVBA4LEB.cjs.map → chunk-2SO4WS2E.cjs.map} +1 -1
  30. package/dist/{chunk-NWP5EGSR.cjs → chunk-2U2VQ2QF.cjs} +4 -4
  31. package/dist/{chunk-NWP5EGSR.cjs.map → chunk-2U2VQ2QF.cjs.map} +1 -1
  32. package/dist/{chunk-LXEOBSEZ.js → chunk-32542ZE6.js} +3 -3
  33. package/dist/{chunk-LXEOBSEZ.js.map → chunk-32542ZE6.js.map} +1 -1
  34. package/dist/{chunk-XQF4HCOV.cjs → chunk-3ISEBGRC.cjs} +14 -14
  35. package/dist/chunk-3ISEBGRC.cjs.map +1 -0
  36. package/dist/{chunk-J57JSHDC.js → chunk-5EOVD46D.js} +5 -5
  37. package/dist/{chunk-J57JSHDC.js.map → chunk-5EOVD46D.js.map} +1 -1
  38. package/dist/{chunk-NFUKNVB7.cjs → chunk-7J7RHUGH.cjs} +5 -5
  39. package/dist/chunk-7J7RHUGH.cjs.map +1 -0
  40. package/dist/{chunk-NW2LQRUP.js → chunk-7YUXEZXU.js} +3 -3
  41. package/dist/{chunk-NW2LQRUP.js.map → chunk-7YUXEZXU.js.map} +1 -1
  42. package/dist/{chunk-AR5DLM4K.js → chunk-AADPWMZV.js} +3 -3
  43. package/dist/{chunk-AR5DLM4K.js.map → chunk-AADPWMZV.js.map} +1 -1
  44. package/dist/{chunk-5FA6V7JF.js → chunk-B4NXPUOF.js} +3 -3
  45. package/dist/{chunk-5FA6V7JF.js.map → chunk-B4NXPUOF.js.map} +1 -1
  46. package/dist/{chunk-FZQWFDUV.cjs → chunk-BDYIKGV5.cjs} +4 -4
  47. package/dist/chunk-BDYIKGV5.cjs.map +1 -0
  48. package/dist/{chunk-VOAC5OKY.cjs → chunk-BEKJQHOX.cjs} +3 -3
  49. package/dist/{chunk-VOAC5OKY.cjs.map → chunk-BEKJQHOX.cjs.map} +1 -1
  50. package/dist/{chunk-TBLKVTJC.cjs → chunk-CR3AZMQE.cjs} +3 -3
  51. package/dist/{chunk-TBLKVTJC.cjs.map → chunk-CR3AZMQE.cjs.map} +1 -1
  52. package/dist/{chunk-7K2C744H.cjs → chunk-CXR54P5L.cjs} +4 -4
  53. package/dist/chunk-CXR54P5L.cjs.map +1 -0
  54. package/dist/{chunk-5NJF7SQX.js → chunk-D4K666OI.js} +3 -3
  55. package/dist/{chunk-5NJF7SQX.js.map → chunk-D4K666OI.js.map} +1 -1
  56. package/dist/{chunk-C2VGO375.js → chunk-EVFWX2HA.js} +3 -3
  57. package/dist/{chunk-C2VGO375.js.map → chunk-EVFWX2HA.js.map} +1 -1
  58. package/dist/{chunk-UBLMYH6C.js → chunk-EXD56OPP.js} +4 -4
  59. package/dist/chunk-EXD56OPP.js.map +1 -0
  60. package/dist/{chunk-I65KXHYL.js → chunk-F6IRLWBS.js} +6 -6
  61. package/dist/{chunk-I65KXHYL.js.map → chunk-F6IRLWBS.js.map} +1 -1
  62. package/dist/{chunk-C6EVRWXZ.cjs → chunk-FUBGTLKL.cjs} +3 -3
  63. package/dist/{chunk-C6EVRWXZ.cjs.map → chunk-FUBGTLKL.cjs.map} +1 -1
  64. package/dist/{chunk-7N7XVBH7.cjs → chunk-GOIZT7CW.cjs} +6 -6
  65. package/dist/{chunk-7N7XVBH7.cjs.map → chunk-GOIZT7CW.cjs.map} +1 -1
  66. package/dist/{chunk-R4SANV3G.cjs → chunk-IHCG3EHP.cjs} +15 -15
  67. package/dist/chunk-IHCG3EHP.cjs.map +1 -0
  68. package/dist/{chunk-6B2GMKE4.cjs → chunk-IJIP6MWS.cjs} +9 -9
  69. package/dist/chunk-IJIP6MWS.cjs.map +1 -0
  70. package/dist/{chunk-TKGMH5PA.js → chunk-J6YPMR7E.js} +3 -3
  71. package/dist/{chunk-TKGMH5PA.js.map → chunk-J6YPMR7E.js.map} +1 -1
  72. package/dist/{chunk-LG2O26CG.js → chunk-JI4AI3K4.js} +5 -5
  73. package/dist/chunk-JI4AI3K4.js.map +1 -0
  74. package/dist/{chunk-CO2NEUFK.js → chunk-JUQGTTED.js} +4 -4
  75. package/dist/chunk-JUQGTTED.js.map +1 -0
  76. package/dist/{chunk-CG3RCQVL.cjs → chunk-K3NIG7O4.cjs} +6 -6
  77. package/dist/{chunk-CG3RCQVL.cjs.map → chunk-K3NIG7O4.cjs.map} +1 -1
  78. package/dist/{chunk-LJCQI6ZS.js → chunk-KHHTTAKZ.js} +3 -3
  79. package/dist/{chunk-LJCQI6ZS.js.map → chunk-KHHTTAKZ.js.map} +1 -1
  80. package/dist/{chunk-EEFU5BVM.cjs → chunk-KJUUCMHH.cjs} +7 -7
  81. package/dist/{chunk-EEFU5BVM.cjs.map → chunk-KJUUCMHH.cjs.map} +1 -1
  82. package/dist/{chunk-LHHELLMT.cjs → chunk-KRQZGVN3.cjs} +4 -4
  83. package/dist/chunk-KRQZGVN3.cjs.map +1 -0
  84. package/dist/{chunk-KDRBUF5S.js → chunk-LCBMI4WO.js} +3 -3
  85. package/dist/{chunk-KDRBUF5S.js.map → chunk-LCBMI4WO.js.map} +1 -1
  86. package/dist/{chunk-AXW55PQG.js → chunk-M5EKV5PK.js} +3 -3
  87. package/dist/{chunk-AXW55PQG.js.map → chunk-M5EKV5PK.js.map} +1 -1
  88. package/dist/{chunk-D6NISIKV.js → chunk-MSLAK77J.js} +4 -4
  89. package/dist/chunk-MSLAK77J.js.map +1 -0
  90. package/dist/{chunk-26GRLVCQ.js → chunk-N2XFWVF7.js} +3 -3
  91. package/dist/chunk-N2XFWVF7.js.map +1 -0
  92. package/dist/{chunk-3O3ZWWLG.js → chunk-NBIRHOM6.js} +4 -4
  93. package/dist/{chunk-3O3ZWWLG.js.map → chunk-NBIRHOM6.js.map} +1 -1
  94. package/dist/{chunk-FY2WDVKF.cjs → chunk-ND2T3PMH.cjs} +3 -3
  95. package/dist/{chunk-FY2WDVKF.cjs.map → chunk-ND2T3PMH.cjs.map} +1 -1
  96. package/dist/{chunk-GE2ZGE3A.cjs → chunk-O23KGVXS.cjs} +6 -6
  97. package/dist/chunk-O23KGVXS.cjs.map +1 -0
  98. package/dist/{chunk-4EQ336PQ.js → chunk-OIX3DCKN.js} +3 -3
  99. package/dist/{chunk-4EQ336PQ.js.map → chunk-OIX3DCKN.js.map} +1 -1
  100. package/dist/{chunk-JJYMRV62.js → chunk-OIYZCYEY.js} +3 -3
  101. package/dist/chunk-OIYZCYEY.js.map +1 -0
  102. package/dist/{chunk-TH7VP4CL.cjs → chunk-OKHXAI75.cjs} +3 -3
  103. package/dist/{chunk-TH7VP4CL.cjs.map → chunk-OKHXAI75.cjs.map} +1 -1
  104. package/dist/{chunk-5SVZX6WF.cjs → chunk-OLIYEZ4C.cjs} +6 -6
  105. package/dist/{chunk-5SVZX6WF.cjs.map → chunk-OLIYEZ4C.cjs.map} +1 -1
  106. package/dist/{chunk-FX37P4KR.js → chunk-OSNDO2ZF.js} +4 -4
  107. package/dist/{chunk-FX37P4KR.js.map → chunk-OSNDO2ZF.js.map} +1 -1
  108. package/dist/{chunk-K6Q542VL.js → chunk-OUG3YE6E.js} +6 -6
  109. package/dist/{chunk-K6Q542VL.js.map → chunk-OUG3YE6E.js.map} +1 -1
  110. package/dist/{chunk-TXQT6S4D.cjs → chunk-OXR2FUEV.cjs} +3 -3
  111. package/dist/chunk-OXR2FUEV.cjs.map +1 -0
  112. package/dist/{chunk-SD6YAMDH.cjs → chunk-PDE63TMC.cjs} +3 -3
  113. package/dist/{chunk-SD6YAMDH.cjs.map → chunk-PDE63TMC.cjs.map} +1 -1
  114. package/dist/{chunk-HKLBCA5X.cjs → chunk-PIPF34XD.cjs} +4 -4
  115. package/dist/{chunk-HKLBCA5X.cjs.map → chunk-PIPF34XD.cjs.map} +1 -1
  116. package/dist/{chunk-CDW7MFPG.js → chunk-Q5P5WG6Q.js} +4 -4
  117. package/dist/{chunk-CDW7MFPG.js.map → chunk-Q5P5WG6Q.js.map} +1 -1
  118. package/dist/{chunk-ISAHWGMD.cjs → chunk-QJVQEGB7.cjs} +4 -4
  119. package/dist/{chunk-ISAHWGMD.cjs.map → chunk-QJVQEGB7.cjs.map} +1 -1
  120. package/dist/{chunk-6EPM5JG7.cjs → chunk-QLFV2KUQ.cjs} +3 -3
  121. package/dist/{chunk-6EPM5JG7.cjs.map → chunk-QLFV2KUQ.cjs.map} +1 -1
  122. package/dist/{chunk-GISORLGW.cjs → chunk-QMNDEIOJ.cjs} +3 -3
  123. package/dist/{chunk-GISORLGW.cjs.map → chunk-QMNDEIOJ.cjs.map} +1 -1
  124. package/dist/{chunk-OUPHLIXV.cjs → chunk-RBM5VYQG.cjs} +11 -11
  125. package/dist/{chunk-OUPHLIXV.cjs.map → chunk-RBM5VYQG.cjs.map} +1 -1
  126. package/dist/{chunk-24RWB7Q3.js → chunk-RC76D7FD.js} +5 -4
  127. package/dist/chunk-RC76D7FD.js.map +1 -0
  128. package/dist/{chunk-FSLEFL4U.cjs → chunk-RKDQ7RRL.cjs} +3 -3
  129. package/dist/{chunk-FSLEFL4U.cjs.map → chunk-RKDQ7RRL.cjs.map} +1 -1
  130. package/dist/{chunk-Z6M3UELD.js → chunk-S2I4QQBM.js} +3 -3
  131. package/dist/{chunk-Z6M3UELD.js.map → chunk-S2I4QQBM.js.map} +1 -1
  132. package/dist/{chunk-EW2N52FD.js → chunk-SUVSEI7N.js} +4 -4
  133. package/dist/{chunk-EW2N52FD.js.map → chunk-SUVSEI7N.js.map} +1 -1
  134. package/dist/{chunk-FR3V5IAJ.cjs → chunk-T6CBYOES.cjs} +5 -4
  135. package/dist/chunk-T6CBYOES.cjs.map +1 -0
  136. package/dist/{chunk-FECD3WKN.js → chunk-TDY5YPSU.js} +3 -3
  137. package/dist/{chunk-FECD3WKN.js.map → chunk-TDY5YPSU.js.map} +1 -1
  138. package/dist/{chunk-ZFXCZ2QO.cjs → chunk-TQIE25DE.cjs} +11 -11
  139. package/dist/{chunk-ZFXCZ2QO.cjs.map → chunk-TQIE25DE.cjs.map} +1 -1
  140. package/dist/{chunk-GE6TSA3M.cjs → chunk-TRXMF2NG.cjs} +3 -3
  141. package/dist/{chunk-GE6TSA3M.cjs.map → chunk-TRXMF2NG.cjs.map} +1 -1
  142. package/dist/{chunk-AF33UCTN.cjs → chunk-ULEJD5SQ.cjs} +3 -3
  143. package/dist/chunk-ULEJD5SQ.cjs.map +1 -0
  144. package/dist/{chunk-PIYQPXLT.js → chunk-VDD5SLBI.js} +3 -3
  145. package/dist/{chunk-PIYQPXLT.js.map → chunk-VDD5SLBI.js.map} +1 -1
  146. package/dist/{chunk-VOGI7GX3.js → chunk-VKNQ2BGO.js} +3 -3
  147. package/dist/{chunk-VOGI7GX3.js.map → chunk-VKNQ2BGO.js.map} +1 -1
  148. package/dist/{chunk-3BBEVHSP.cjs → chunk-VQHM3UUK.cjs} +3 -3
  149. package/dist/{chunk-3BBEVHSP.cjs.map → chunk-VQHM3UUK.cjs.map} +1 -1
  150. package/dist/{chunk-QMZK7SRS.cjs → chunk-VWZCUKV5.cjs} +3 -3
  151. package/dist/{chunk-QMZK7SRS.cjs.map → chunk-VWZCUKV5.cjs.map} +1 -1
  152. package/dist/{chunk-3W6BKQVZ.js → chunk-X4SUHI3G.js} +4 -4
  153. package/dist/{chunk-3W6BKQVZ.js.map → chunk-X4SUHI3G.js.map} +1 -1
  154. package/dist/{chunk-DQWAG7YY.cjs → chunk-X6XUEM2V.cjs} +4 -4
  155. package/dist/{chunk-DQWAG7YY.cjs.map → chunk-X6XUEM2V.cjs.map} +1 -1
  156. package/dist/{chunk-EDIB6V6Y.cjs → chunk-XIP2TPSX.cjs} +4 -4
  157. package/dist/{chunk-EDIB6V6Y.cjs.map → chunk-XIP2TPSX.cjs.map} +1 -1
  158. package/dist/{chunk-MD7HUHJB.js → chunk-XKUIPBJD.js} +10 -10
  159. package/dist/chunk-XKUIPBJD.js.map +1 -0
  160. package/dist/{chunk-SOIGBPK6.js → chunk-Y3CBLOD6.js} +6 -6
  161. package/dist/chunk-Y3CBLOD6.js.map +1 -0
  162. package/dist/{chunk-YZW7HQXH.js → chunk-YAZGTSKS.js} +14 -14
  163. package/dist/chunk-YAZGTSKS.js.map +1 -0
  164. package/dist/{chunk-MKDTXMCE.js → chunk-YFFW4E77.js} +4 -4
  165. package/dist/{chunk-MKDTXMCE.js.map → chunk-YFFW4E77.js.map} +1 -1
  166. package/dist/{chunk-YPYZZLZ5.js → chunk-YMDFLW47.js} +9 -9
  167. package/dist/chunk-YMDFLW47.js.map +1 -0
  168. package/dist/{chunk-LREJ7AV2.cjs → chunk-Z3IM25W7.cjs} +4 -4
  169. package/dist/{chunk-LREJ7AV2.cjs.map → chunk-Z3IM25W7.cjs.map} +1 -1
  170. package/dist/{chunk-AE6ICNJR.js → chunk-Z5DMAMVG.js} +3 -3
  171. package/dist/{chunk-AE6ICNJR.js.map → chunk-Z5DMAMVG.js.map} +1 -1
  172. package/dist/{chunk-JN5DHZ6I.js → chunk-ZC2H5GM2.js} +6 -6
  173. package/dist/{chunk-JN5DHZ6I.js.map → chunk-ZC2H5GM2.js.map} +1 -1
  174. package/dist/{chunk-DPPDZOMY.cjs → chunk-ZEQXMUXE.cjs} +4 -4
  175. package/dist/chunk-ZEQXMUXE.cjs.map +1 -0
  176. package/dist/{chunk-OP7A4SZZ.cjs → chunk-ZGSSUUK2.cjs} +4 -4
  177. package/dist/{chunk-OP7A4SZZ.cjs.map → chunk-ZGSSUUK2.cjs.map} +1 -1
  178. package/dist/{chunk-3T3LBIQA.cjs → chunk-ZQE2Q3R2.cjs} +4 -4
  179. package/dist/{chunk-3T3LBIQA.cjs.map → chunk-ZQE2Q3R2.cjs.map} +1 -1
  180. package/dist/{chunk-HCIEXBEB.js → chunk-ZRV5TRYW.js} +3 -3
  181. package/dist/{chunk-HCIEXBEB.js.map → chunk-ZRV5TRYW.js.map} +1 -1
  182. package/dist/command.cjs +3 -3
  183. package/dist/command.js +1 -1
  184. package/dist/composer.cjs +4 -4
  185. package/dist/composer.js +2 -2
  186. package/dist/drawer.cjs +3 -3
  187. package/dist/drawer.js +1 -1
  188. package/dist/editor.cjs +3 -3
  189. package/dist/editor.js +1 -1
  190. package/dist/emoji-select.cjs +2 -2
  191. package/dist/emoji-select.js +1 -1
  192. package/dist/file-browser.cjs +5 -5
  193. package/dist/file-browser.js +1 -1
  194. package/dist/index.cjs +126 -126
  195. package/dist/index.js +40 -40
  196. package/dist/input-tag.cjs +6 -6
  197. package/dist/input-tag.js +1 -1
  198. package/dist/input.cjs +3 -3
  199. package/dist/input.js +2 -2
  200. package/dist/inputs.cjs +7 -7
  201. package/dist/inputs.js +4 -4
  202. package/dist/json-editor.cjs +15 -15
  203. package/dist/json-editor.js +4 -4
  204. package/dist/magic-wand.cjs +2 -2
  205. package/dist/magic-wand.js +1 -1
  206. package/dist/media-viewer.cjs +3 -3
  207. package/dist/media-viewer.js +2 -2
  208. package/dist/mobile-menu.cjs +3 -3
  209. package/dist/mobile-menu.js +1 -1
  210. package/dist/modal.cjs +3 -3
  211. package/dist/modal.js +1 -1
  212. package/dist/mood-meter.cjs +2 -2
  213. package/dist/mood-meter.js +1 -1
  214. package/dist/navbar.cjs +3 -3
  215. package/dist/navbar.js +1 -1
  216. package/dist/number-field.cjs +4 -4
  217. package/dist/number-field.js +3 -3
  218. package/dist/pagination.cjs +2 -2
  219. package/dist/pagination.js +1 -1
  220. package/dist/paste-pills.cjs +14 -14
  221. package/dist/paste-pills.js +1 -1
  222. package/dist/phone-input.cjs +6 -6
  223. package/dist/phone-input.js +3 -3
  224. package/dist/pillbox.cjs +2 -2
  225. package/dist/pillbox.js +1 -1
  226. package/dist/profile.cjs +3 -3
  227. package/dist/profile.js +2 -2
  228. package/dist/prompt-input.cjs +5 -5
  229. package/dist/prompt-input.js +2 -2
  230. package/dist/reason-tag.cjs +2 -2
  231. package/dist/reason-tag.js +1 -1
  232. package/dist/select.cjs +2 -2
  233. package/dist/select.js +1 -1
  234. package/dist/sidebar.cjs +3 -3
  235. package/dist/sidebar.js +1 -1
  236. package/dist/table.cjs +11 -11
  237. package/dist/table.js +1 -1
  238. package/dist/time-grid.cjs +2 -2
  239. package/dist/time-grid.js +1 -1
  240. package/dist/time-picker.cjs +2 -2
  241. package/dist/time-picker.js +1 -1
  242. package/dist/toast.cjs +3 -3
  243. package/dist/toast.js +1 -1
  244. package/dist/video-viewer.cjs +2 -2
  245. package/dist/video-viewer.js +1 -1
  246. package/package.json +1 -1
  247. package/dist/chunk-24RWB7Q3.js.map +0 -1
  248. package/dist/chunk-26GRLVCQ.js.map +0 -1
  249. package/dist/chunk-6B2GMKE4.cjs.map +0 -1
  250. package/dist/chunk-7K2C744H.cjs.map +0 -1
  251. package/dist/chunk-AF33UCTN.cjs.map +0 -1
  252. package/dist/chunk-CO2NEUFK.js.map +0 -1
  253. package/dist/chunk-D6NISIKV.js.map +0 -1
  254. package/dist/chunk-DPPDZOMY.cjs.map +0 -1
  255. package/dist/chunk-FR3V5IAJ.cjs.map +0 -1
  256. package/dist/chunk-FZQWFDUV.cjs.map +0 -1
  257. package/dist/chunk-GB2EGMVQ.cjs.map +0 -1
  258. package/dist/chunk-GE2ZGE3A.cjs.map +0 -1
  259. package/dist/chunk-JJYMRV62.js.map +0 -1
  260. package/dist/chunk-KRECSPD3.js.map +0 -1
  261. package/dist/chunk-LG2O26CG.js.map +0 -1
  262. package/dist/chunk-LHHELLMT.cjs.map +0 -1
  263. package/dist/chunk-MD7HUHJB.js.map +0 -1
  264. package/dist/chunk-NFUKNVB7.cjs.map +0 -1
  265. package/dist/chunk-R3PCZSBQ.js.map +0 -1
  266. package/dist/chunk-R4SANV3G.cjs.map +0 -1
  267. package/dist/chunk-SOIGBPK6.js.map +0 -1
  268. package/dist/chunk-TXQT6S4D.cjs.map +0 -1
  269. package/dist/chunk-UBLMYH6C.js.map +0 -1
  270. package/dist/chunk-XQF4HCOV.cjs.map +0 -1
  271. package/dist/chunk-YPYZZLZ5.js.map +0 -1
  272. package/dist/chunk-YZW7HQXH.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/ChatThread/chat-utils.ts","../src/components/ChatThread/ChatMessage.tsx","../src/components/ChatThread/ChatThread.tsx"],"names":["useState","useRef","useEffect","useCallback","sanitizeComponentHref","jsxs","cn","jsx","Badge","Button","ContentRenderer","Fragment","Avatar","TEXT_MUTED","BORDER","useLayoutEffect","useId","useImperativeHandle"],"mappings":";;;;;;;;;;;AAEO,IAAM,cAAA,GAAmC;AAAA,EAC9C,GAAA,EAAK,cAAA;AAAA,EACL,WAAA,EAAa,uBAAA;AAAA,EACb,cAAA,EAAgB,6BAAA;AAAA,EAChB,aAAa,CAAC,CAAA,KAAO,MAAM,CAAA,GAAI,eAAA,GAAkB,GAAG,CAAC,CAAA,aAAA,CAAA;AAAA,EACrD,QAAA,EAAU,eAAA;AAAA,EACV,OAAA,EAAS,YAAA;AAAA,EACT,MAAA,EAAQ,UAAA;AAAA,EACR,QAAA,EAAU,UAAA;AAAA,EACV,MAAA,EAAQ,QAAA;AAAA,EACR,MAAA,EAAQ,QAAA;AAAA,EACR,QAAA,EAAU,UAAA;AAAA,EACV,QAAA,EAAU,UAAA;AAAA,EACV,SAAA,EAAW,WAAA;AAAA,EACX,WAAA,EAAa,aAAA;AAAA,EACb,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,KAAA;AAAA,IACN,SAAA,EAAW,WAAA;AAAA,IACX,MAAA,EAAQ,QAAA;AAAA,IACR,KAAA,EAAO,OAAA;AAAA,IACP,KAAA,EAAO,OAAA;AAAA,IACP,QAAA,EAAU;AAAA;AAEd,CAAA;AAEO,SAAS,YAAY,MAAA,EAAsD;AAChF,EAAA,IAAI,CAAC,QAAQ,OAAO,cAAA;AACpB,EAAA,OAAO;AAAA,IACL,GAAG,cAAA;AAAA,IACH,GAAG,MAAA;AAAA,IACH,OAAO,EAAE,GAAG,eAAe,KAAA,EAAO,GAAG,OAAO,KAAA;AAAM,GACpD;AACF;AAGO,SAAS,OAAO,KAAA,EAAiD;AACtE,EAAA,IAAI,UAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,IAAI,OAAO,IAAA;AAClE,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,KAAK,CAAA;AACxB,EAAA,OAAO,OAAO,KAAA,CAAM,CAAA,CAAE,OAAA,EAAS,IAAI,IAAA,GAAO,CAAA;AAC5C;AAGO,SAAS,OAAO,CAAA,EAAiB;AACtC,EAAA,MAAM,CAAA,GAAI,CAAC,CAAA,KAAc,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAClD,EAAA,OAAO,GAAG,CAAA,CAAE,WAAA,EAAa,CAAA,CAAA,EAAI,EAAE,CAAA,CAAE,QAAA,EAAS,GAAI,CAAC,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,CAAA,CAAE,OAAA,EAAS,CAAC,CAAA,CAAA;AACpE;AAEO,SAAS,kBAAkB,CAAA,EAAiB;AACjD,EAAA,OAAO,CAAA,CAAE,mBAAmB,MAAA,EAAW,EAAE,MAAM,SAAA,EAAW,MAAA,EAAQ,WAAW,CAAA;AAC/E;AAEO,SAAS,iBAAiB,CAAA,EAAiB;AAChD,EAAA,OAAO,EAAE,kBAAA,CAAmB,MAAA,EAAW,EAAE,SAAA,EAAW,UAAU,CAAA;AAChE;AAEO,SAAS,SAAA,CAAU,MAAc,MAAA,EAAkC;AACxE,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC/B,EAAA,IAAI,OAAO,OAAO,KAAA;AAClB,EAAA,OAAO,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,aAAY,GAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,GAAI,EAAA;AAC/D;AAEO,SAAS,SAAS,IAAA,EAAsB;AAC7C,EAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA,CAAE,OAAO,OAAO,CAAA;AACrD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,GAAA;AAC/B,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AAC7B,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,GAAS,CAAA,GAAK,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA,GAAM,EAAA;AACrE,EAAA,OAAA,CAAQ,KAAA,GAAQ,MAAM,WAAA,EAAY;AACpC;AAEO,SAAS,KAAA,CAAM,SAA0B,QAAA,EAA6B;AAC3E,EAAA,OAAO,OAAA,CAAQ,GAAA,IAAO,QAAA,CAAS,QAAA,CAAS,QAAQ,IAAI,CAAA;AACtD;AAEO,IAAM,uBAAA,GAA0B,IAAI,EAAA,GAAK,GAAA;AAGzC,SAAS,cAAA,CACd,IAAA,EACA,IAAA,EACA,QAAA,EACS;AACT,EAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,IAAA,CAAK,IAAA,EAAM,OAAO,KAAA;AACpC,EAAA,IAAA,CAAK,IAAA,CAAK,QAAQ,IAAA,IAAQ,EAAA,OAAS,KAAK,MAAA,EAAQ,IAAA,IAAQ,KAAK,OAAO,KAAA;AACpE,EAAA,IAAA,CAAK,KAAK,UAAA,IAAc,QAAA,OAAe,IAAA,CAAK,UAAA,IAAc,WAAW,OAAO,KAAA;AAC5E,EAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAA,EAAU,OAAO,KAAA;AAC3C,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU,OAAO,KAAA;AACnC,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAC/B,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAC/B,EAAA,IAAI,CAAC,CAAA,IAAK,CAAC,CAAA,EAAG,OAAO,KAAA;AACrB,EAAA,MAAM,GAAA,GAAM,CAAA,CAAE,OAAA,EAAQ,GAAI,EAAE,OAAA,EAAQ;AACpC,EAAA,OAAO,GAAA,IAAO,KAAK,GAAA,IAAO,QAAA;AAC5B;AAEO,SAAS,YAAY,CAAA,EAAmB;AAC7C,EAAA,IAAI,CAAA,GAAI,IAAA,EAAM,OAAO,CAAA,EAAG,CAAC,CAAA,EAAA,CAAA;AACzB,EAAA,IAAI,CAAA,GAAI,OAAO,IAAA,EAAM,OAAO,IAAI,CAAA,GAAI,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AACpD,EAAA,OAAO,IAAI,CAAA,IAAK,IAAA,GAAO,IAAA,CAAA,EAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAC1C;AC3EA,IAAM,MAAA,GACJ,6HAAA;AACF,IAAM,OAAA,GACJ,oHAAA;AACF,IAAM,aAAA,GACJ,mIAAA;AACF,IAAM,IAAA,GACJ,qHAAA;AACF,IAAM,UAAA,GACJ,iIAAA;AASK,SAAS,sBACd,aAAA,EACgG;AAChG,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,eAAS,KAAK,CAAA;AACtC,EAAA,MAAM,OAAA,GAAUC,aAAO,KAAK,CAAA;AAC5B,EAAA,MAAM,OAAA,GAAUA,aAAO,IAAI,CAAA;AAC3B,EAAA,MAAM,UAAA,GAAaA,aAAO,aAAa,CAAA;AACvC,EAAA,UAAA,CAAW,OAAA,GAAU,aAAA;AAErB,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAClB,IAAA,OAAO,MAAM;AACX,MAAA,OAAA,CAAQ,OAAA,GAAU,KAAA;AAAA,IACpB,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,GAAA,GAAMC,iBAAA,CAAY,CAAC,EAAA,EAAkC,GAAA,KAAiC;AAC1F,IAAA,IAAI,QAAQ,OAAA,EAAS;AACrB,IAAA,MAAM,SAAS,EAAA,EAAG;AAClB,IAAA,IAAI,CAAC,MAAA,IAAU,OAAQ,MAAA,CAA4B,SAAS,UAAA,EAAY;AAExE,IAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAClB,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,MAAM,SAAS,MAAM;AACnB,MAAA,OAAA,CAAQ,OAAA,GAAU,KAAA;AAClB,MAAA,IAAI,OAAA,CAAQ,OAAA,EAAS,OAAA,CAAQ,KAAK,CAAA;AAAA,IACpC,CAAA;AACA,IAAA,KAAK,QAAQ,OAAA,CAAQ,MAAM,EAAE,IAAA,CAAK,MAAA,EAAQ,CAAC,KAAA,KAAmB;AAC5D,MAAA,MAAA,EAAO;AACP,MAAA,MAAM,UAAU,UAAA,CAAW,OAAA;AAC3B,MAAA,IAAI,OAAA,EAAS,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAAA,WAC1B,MAAM,KAAA;AAAA,IACb,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,CAAC,MAAM,GAAG,CAAA;AACnB;AAEA,SAAS,cAAA,CAAe;AAAA,EACtB,UAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,gBAAA,EAAkB;AACpB,IAAA,IAAA,GAAO,gBAAA,CAAiB,YAAY,OAAO,CAAA;AAAA,EAC7C,CAAA,MAAO;AACL,IAAA,MAAM,IAAA,GAAOC,uCAAA,CAAsB,aAAA,EAAe,UAAA,CAAW,GAAG,CAAA;AAChE,IAAA,MAAM,IAAA,GAAO,OAAO,UAAA,CAAW,IAAA,KAAS,QAAA,mBACtCC,eAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAWC,oBAAA,CAAG,MAAA,EAAQ,UAAU,CAAA,EAAG,QAAA,EAAA;AAAA,MAAA,GAAA;AAAA,MAAE,WAAA,CAAY,WAAW,IAAI,CAAA;AAAA,MAAE;AAAA,KAAA,EAAC,CAAA,GACvE,IAAA;AACJ,IAAA,IAAA,GAAO,IAAA,mCACJ,GAAA,EAAA,EAAE,IAAA,EAAY,QAAO,QAAA,EAAS,GAAA,EAAI,qBAAA,EAAsB,SAAA,EAAU,wCAAA,EAChE,QAAA,EAAA;AAAA,MAAA,UAAA,CAAW,IAAA;AAAA,MACX;AAAA,KAAA,EACH,CAAA,mBAEAD,eAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,MAAA,UAAA,CAAW,IAAA;AAAA,MACX;AAAA,KAAA,EACH,CAAA;AAAA,EAEJ;AAEA,EAAA,sCACG,IAAA,EAAA,EAAG,sBAAA,EAAsB,WAAW,EAAA,EAAI,SAAA,EAAU,WAChD,QAAA,EAAA,IAAA,EACH,CAAA;AAEJ;AAEA,SAAS,cAAA,CAAe;AAAA,EACtB,OAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAMG;AACD,EAAA,MAAM,WAAW,OAAA,CAAQ,QAAA;AACzB,EAAA,MAAM,KAAA,GAAQ,SAAS,KAAA,IAAS,SAAA;AAEhC,EAAA,IAAI,UAAU,SAAA,EAAW;AACvB,IAAA,MAAM,IAAA,GAAO,UAAU,UAAA,GAAa,MAAA,CAAO,WAAW,KAAA,KAAU,UAAA,GAAa,MAAA,CAAO,QAAA,GAAW,MAAA,CAAO,SAAA;AACtG,IAAA,MAAM,QAAQ,KAAA,KAAU,UAAA,GAAa,SAAA,GAAY,KAAA,KAAU,aAAa,KAAA,GAAQ,MAAA;AAChF,IAAA,uBACEE,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EACb,yCAACC,uBAAA,EAAA,EAAM,KAAA,EAAc,OAAA,EAAQ,MAAA,EAAO,IAAA,EAAK,IAAA,EAAK,2BAAA,EAA2B,KAAA,EACtE,gBACH,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,EAAU,OAAO,IAAA;AAEnC,EAAA,uBACEH,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACZ,QAAA,EAAA;AAAA,IAAA,QAAA,oBACCE,cAAA;AAAA,MAACE,wBAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,IAAA,EAAK,IAAA;AAAA,QACL,KAAA,EAAM,SAAA;AAAA,QACN,QAAA,EAAU,IAAA;AAAA,QACV,aAAW,IAAA,IAAQ,MAAA;AAAA,QACnB,2BAAA,EAA0B,QAAA;AAAA,QAC1B,OAAA,EAAS,QAAA;AAAA,QAER,QAAA,EAAA,QAAA,CAAS,eAAe,MAAA,CAAO;AAAA;AAAA,KAClC;AAAA,IAED,QAAA,oBACCF,cAAA;AAAA,MAACE,wBAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,IAAA,EAAK,IAAA;AAAA,QACL,OAAA,EAAQ,OAAA;AAAA,QACR,QAAA,EAAU,IAAA;AAAA,QACV,aAAW,IAAA,IAAQ,MAAA;AAAA,QACnB,2BAAA,EAA0B,QAAA;AAAA,QAC1B,OAAA,EAAS,QAAA;AAAA,QAER,QAAA,EAAA,QAAA,CAAS,eAAe,MAAA,CAAO;AAAA;AAAA;AAClC,GAAA,EAEJ,CAAA;AAEJ;AAWO,SAAS,WAAA,CAAY;AAAA,EAC1B,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,SAAA;AAAA,EACA,QAAA,GAAW,CAAC,MAAM,CAAA;AAAA,EAClB,SAAA,GAAY,IAAA;AAAA,EACZ,cAAA;AAAA,EACA,MAAA,EAAQ,UAAA;AAAA,EACR,UAAA,GAAa,iBAAA;AAAA,EACb,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,MAAA,GAAS,YAAY,UAAU,CAAA;AACrC,EAAA,MAAM,CAAC,IAAA,EAAM,GAAG,CAAA,GAAI,sBAAsB,aAAa,CAAA;AAEvD,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,MAAA;AACjC,EAAA,MAAM,UAAA,GAAa,QAAQ,UAAA,IAAc,QAAA;AACzC,EAAA,MAAM,WAAW,UAAA,KAAe,UAAA;AAChC,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,EAAS,QAAQ,CAAA;AACnC,EAAA,MAAM,MAAA,GAAS,QAAQ,IAAA,KAAS,QAAA;AAChC,EAAA,MAAM,WAAW,OAAA,CAAQ,QAAA;AACzB,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA;AAErC,EAAA,MAAM,OAAO,OAAA,CAAQ,MAAA,EAAQ,QAAQ,SAAA,CAAU,OAAA,CAAQ,MAAM,MAAM,CAAA;AAEnE,EAAA,MAAM,MAAA,GAAS,CAAC,IAAA,KAA8B;AAC5C,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,MAAM,EAAA,GAAK,IAAA,KAAS,QAAA,GAAW,gBAAA,GAAmB,gBAAA;AAClD,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAM,GAAA,GAA+B;AAAA,MACnC,IAAA,EAAM,IAAA,KAAS,QAAA,GAAW,iBAAA,GAAoB,iBAAA;AAAA,MAC9C,WAAW,OAAA,CAAQ,EAAA;AAAA,MACnB,YAAY,QAAA,CAAS;AAAA,KACvB;AACA,IAAA,GAAA,CAAI,MAAM;AACR,MAAA,UAAA,GAAa,GAAG,CAAA;AAChB,MAAA,OAAO,GAAG,OAAO,CAAA;AAAA,IACnB,GAAG,GAAG,CAAA;AAAA,EACR,CAAA;AAEA,EAAA,MAAM,OACJ,OAAA,CAAQ,MAAA,KAAW,yBACjBF,cAAA,CAAC,KAAA,EAAA,EAAI,qBAAkB,EAAA,EAAG,SAAA,EAAU,iCAAA,EACjC,QAAA,EAAA,OAAA,CAAQ,SACX,CAAA,mBAEAA,cAAA,CAAC,SAAI,mBAAA,EAAkB,EAAA,EAAG,WAAU,qBAAA,EAClC,QAAA,kBAAAA,cAAA;AAAA,IAACG,iCAAA;AAAA,IAAA;AAAA,MACE,GAAG,cAAA;AAAA,MACJ,OAAO,OAAA,CAAQ,OAAA;AAAA,MACf,MAAA,EAAO,UAAA;AAAA,MACP,SAAA,EAAW,MAAA,KAAW,WAAA,GAAc,SAAA,GAAY;AAAA;AAAA,GAClD,EACF,CAAA;AAGJ,EAAA,MAAM,WAAA,GACJ,OAAA,CAAQ,WAAA,IAAe,OAAA,CAAQ,WAAA,CAAY,MAAA,GAAS,CAAA,mBAClDH,cAAA,CAAC,IAAA,EAAA,EAAG,uBAAA,EAAsB,EAAA,EAAG,YAAA,EAAY,OAAO,WAAA,EAAa,SAAA,EAAU,0BAAA,EACpE,QAAA,EAAA,OAAA,CAAQ,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,oCACvB,cAAA,EAAA,EAA0B,UAAA,EAAY,CAAA,EAAG,OAAA,EAAkB,gBAAA,EAAA,EAAvC,CAAA,CAAE,EAAyE,CACjG,GACH,CAAA,GACE,IAAA;AAEN,EAAA,MAAM,UAAA,GACJ,MAAA,KAAW,SAAA,mBACTA,cAAA,CAAC,KAAA,EAAA,EAAI,yBAAsB,SAAA,EAAU,SAAA,EAAWD,oBAAA,CAAG,cAAA,EAAgB,UAAU,CAAA,EAC1E,iBAAO,OAAA,EACV,CAAA,GACE,MAAA,KAAW,QAAA,mBACbC,cAAA,CAAC,KAAA,EAAA,EAAI,uBAAA,EAAsB,QAAA,EAAS,SAAA,EAAU,6CAAA,EAC3C,QAAA,EAAA,MAAA,CAAO,MAAA,EACV,CAAA,GACE,IAAA;AAEN,EAAA,MAAM,cACJ,OAAA,KAAY,MAAA,IAAa,YAAY,IAAA,IAAQ,OAAA,KAAY,wBACvDA,cAAA,CAAC,KAAA,EAAA,EAAI,2BAAA,EAA0B,EAAA,EAAG,WAAWD,oBAAA,CAAG,wCAAA,EAA0C,YAAY,OAAO,CAAA,EAC1G,mBACH,CAAA,GACE,IAAA;AAEN,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,qBAAqB,OAAA,CAAQ,EAAA;AAAA,IAC7B,kBAAkB,OAAA,CAAQ,IAAA;AAAA,IAC1B,kBAAA,EAAoB,MAAA;AAAA,IACpB,sBAAA,EAAwB,UAAA;AAAA,IACxB,eAAA,EAAiB,MAAM,EAAA,GAAK,MAAA;AAAA,IAC5B,mBAAA,EAAqB,UAAU,EAAA,GAAK,MAAA;AAAA,IACpC,WAAA,EAAa,MAAA,KAAW,WAAA,GAAc,IAAA,GAAO;AAAA,GAC/C;AAEA,EAAA,IAAI,MAAA,IAAU,CAAC,QAAA,EAAU;AACvB,IAAA,uBACED,eAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACE,GAAG,SAAA;AAAA,QACJ,WAAWC,oBAAA,CAAG,0DAAA,EAA4D,UAAA,EAAY,SAAA,EAAW,YAAY,OAAO,CAAA;AAAA,QAEnH,QAAA,EAAA;AAAA,UAAA,QAAA,oBACCC,cAAA,CAACC,uBAAA,EAAA,EAAM,KAAA,EAAM,OAAA,EAAQ,OAAA,EAAQ,MAAA,EAAO,IAAA,EAAK,IAAA,EAAK,0BAAA,EAAyB,EAAA,EACpE,QAAA,EAAA,MAAA,CAAO,QAAA,EACV,CAAA;AAAA,0BAEFD,cAAA,CAAC,SAAI,SAAA,EAAWD,oBAAA,CAAG,eAAe,UAAA,EAAY,MAAM,GAAI,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,UAC5D,WAAA;AAAA,UACA;AAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,MAAM,WAAA,GAAcA,oBAAA;AAAA,IAClB,mCAAA;AAAA,IACA,IAAA;AAAA,IACA,QAAA,GACI,iGAAA,GACA,QAAA,GACEA,oBAAA,CAAG,sDAAA,EAAwD,OAAO,CAAA,GAClE,GAAA,GACEA,oBAAA,CAAG,QAAA,EAAU,MAAA,EAAQ,OAAO,CAAA,GAC5B,aAAA;AAAA,IACR,WAAW,QAAA,IAAY,wBAAA;AAAA,IACvB,UAAA,EAAY,MAAA;AAAA,IACZ,YAAY,UAAA,EAAY;AAAA,GAC1B;AAEA,EAAA,MAAM,8BACJD,eAAA,CAAAM,mBAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,QAAA,mCACE,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EACb,QAAA,kBAAAJ,cAAA,CAACC,2BAAM,KAAA,EAAM,OAAA,EAAQ,OAAA,EAAQ,MAAA,EAAO,MAAK,IAAA,EAAK,0BAAA,EAAyB,EAAA,EACpE,QAAA,EAAA,MAAA,CAAO,UACV,CAAA,EACF,CAAA;AAAA,IAED,4BACCH,eAAA,CAAC,KAAA,EAAA,EAAI,2BAAA,EAA0B,EAAA,EAAG,WAAU,0CAAA,EAC1C,QAAA,EAAA;AAAA,sBAAAE,cAAA,CAACC,uBAAA,EAAA,EAAM,OAAM,QAAA,EAAS,OAAA,EAAQ,QAAO,IAAA,EAAK,IAAA,EACvC,iBAAO,QAAA,EACV,CAAA;AAAA,MACC,SAAS,KAAA,oBAASD,cAAA,CAAC,UAAK,SAAA,EAAU,aAAA,EAAe,mBAAS,KAAA,EAAM;AAAA,KAAA,EACnE,CAAA;AAAA,IAED,IAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA,oBACCA,cAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,MAAA;AAAA,QACA,IAAA;AAAA,QACA,QAAA,EAAU,gBAAA,GAAmB,MAAM,MAAA,CAAO,QAAQ,CAAA,GAAI,MAAA;AAAA,QACtD,QAAA,EAAU,gBAAA,GAAmB,MAAM,MAAA,CAAO,QAAQ,CAAA,GAAI;AAAA;AAAA;AACxD,GAAA,EAEJ,CAAA;AAGF,EAAA,uBACEF,eAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACE,GAAG,SAAA;AAAA,MACJ,SAAA,EAAWC,oBAAA;AAAA,QACT,mBAAA;AAAA,QACA,UAAU,QAAA,GAAW,MAAA;AAAA,QACrB,GAAA,IAAO,kBAAA;AAAA,QACP,SAAA;AAAA,QACA,UAAA,EAAY;AAAA,OACd;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAAC,KAAA,EAAA,EAAI,WAAU,cAAA,EAAe,aAAA,EAAa,WAAW,MAAA,EACnD,QAAA,EAAA,CAAC,OAAA,oBACAA,cAAA,CAACK,wBAAA,EAAA,EAAO,IAAA,EAAK,MAAK,GAAA,EAAK,OAAA,CAAQ,QAAQ,MAAA,EAAQ,GAAA,EAAI,IAAG,QAAA,EAAU,QAAA,CAAS,IAAI,CAAA,EAAG,CAAA,EAEpF,CAAA;AAAA,wBACAP,eAAA,CAAC,SAAI,SAAA,EAAWC,oBAAA,CAAG,qCAAqC,GAAA,GAAM,WAAA,GAAc,aAAa,CAAA,EACtF,QAAA,EAAA;AAAA,UAAA,CAAC,OAAA,oBACAD,eAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,kBAAA,EAAiB,EAAA;AAAA,cACjB,WAAWC,oBAAA,CAAG,wCAAA,EAA0C,GAAA,IAAO,kBAAA,EAAoB,YAAY,MAAM,CAAA;AAAA,cAErG,QAAA,EAAA;AAAA,gCAAAC,cAAA,CAAC,MAAA,EAAA,EAAK,oBAAiB,EAAA,EAAG,SAAA,EAAWD,qBAAG,aAAA,EAAe,IAAI,GACxD,QAAA,EAAA,IAAA,EACH,CAAA;AAAA,gBACC,IAAA,oBACCC,cAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,IAAA,CAAK,WAAA,EAAY,EAAG,SAAA,EAAW,UAAA,EAC5C,QAAA,EAAA,UAAA,CAAW,IAAI,CAAA,EAClB;AAAA;AAAA;AAAA,WAEJ;AAAA,UAED,QAAA,mBACCA,cAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,sBAAoB,QAAA,CAAS,EAAA;AAAA,cAC7B,0BAAA,EAA0B,SAAS,KAAA,IAAS,SAAA;AAAA,cAC5C,aAAW,IAAA,IAAQ,MAAA;AAAA,cACnB,SAAA,EAAWD,oBAAA,CAAG,oBAAA,EAAsB,WAAW,CAAA;AAAA,cAE9C,QAAA,EAAA;AAAA;AAAA,WACH,mBAEAC,cAAA,CAAC,KAAA,EAAA,EAAI,kBAAA,EAAiB,EAAA,EAAG,WAAWD,oBAAA,CAAG,oBAAA,EAAsB,WAAW,CAAA,EACrE,QAAA,EAAA,WAAA,EACH,CAAA;AAAA,UAED,UAAA;AAAA,UACA;AAAA,SAAA,EACH;AAAA;AAAA;AAAA,GACF;AAEJ;AAEA,WAAA,CAAY,WAAA,GAAc,aAAA;AC1X1B,IAAMO,WAAAA,GACJ,iIAAA;AACF,IAAMC,OAAAA,GACJ,6HAAA;AAIF,IAAM,kBAAA,GAAqB,OAAO,MAAA,KAAW,WAAA,GAAcZ,eAAAA,GAAYa,qBAAA;AAgChE,SAAS,UAAA,CAAW;AAAA,EACzB,GAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA,GAAe,CAAA;AAAA,EACf,aAAA;AAAA,EACA,UAAA;AAAA,EACA,cAAA,GAAiB,KAAA;AAAA,EACjB,aAAA,GAAgB,IAAA;AAAA,EAChB,eAAA,GAAkB,EAAA;AAAA,EAClB,gBAAA;AAAA,EACA,UAAA,GAAa,MAAA;AAAA,EACb,SAAA,GAAY,gBAAA;AAAA,EACZ,gBAAA,GAAmB,KAAA;AAAA,EACnB,aAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA;AAAA,EAEA,QAAA,GAAW,CAAC,MAAM,CAAA;AAAA,EAClB,SAAA,GAAY,IAAA;AAAA,EACZ,cAAA;AAAA,EACA,MAAA,EAAQ,UAAA;AAAA,EACR,UAAA;AAAA,EACA,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA,EAAU,YAAA;AAAA,EACV,GAAG;AACL,CAAA,EAAoB;AAClB,EAAA,MAAM,MAAA,GAAS,YAAY,UAAU,CAAA;AACrC,EAAA,MAAM,YAAYC,WAAA,EAAM;AACxB,EAAA,MAAM,MAAA,GAASf,aAAuB,IAAI,CAAA;AAC1C,EAAA,MAAM,UAAA,GAAaA,aAAuB,IAAI,CAAA;AAC9C,EAAA,MAAM,WAAA,GAAcA,aAAO,IAAI,CAAA;AAC/B,EAAA,MAAM,OAAA,GAAUA,aAAoB,IAAI,CAAA;AACxC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAID,eAAS,IAAI,CAAA;AAC7C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAS,CAAC,CAAA;AACtC,EAAA,MAAM,CAAC,QAAA,EAAU,OAAO,CAAA,GAAI,sBAAsB,aAAa,CAAA;AAE/D,EAAA,MAAM,mBAAA,GAAsBC,aAAO,gBAAgB,CAAA;AACnD,EAAA,mBAAA,CAAoB,OAAA,GAAU,gBAAA;AAE9B,EAAA,MAAM,OAAA,GAAUE,iBAAAA;AAAA,IACd,CAAC,EAAA,KAAoB,EAAA,CAAG,eAAe,EAAA,CAAG,SAAA,GAAY,GAAG,YAAA,IAAgB,eAAA;AAAA,IACzE,CAAC,eAAe;AAAA,GAClB;AAEA,EAAA,MAAM,cAAA,GAAiBA,iBAAAA,CAAY,CAAC,KAAA,KAAmB;AACrD,IAAA,MAAM,OAAA,GAAU,YAAY,OAAA,KAAY,KAAA;AACxC,IAAA,WAAA,CAAY,OAAA,GAAU,KAAA;AACtB,IAAA,WAAA,CAAY,KAAK,CAAA;AACjB,IAAA,IAAI,KAAA,YAAiB,CAAC,CAAA;AACtB,IAAA,IAAI,OAAA,EAAS,mBAAA,CAAoB,OAAA,GAAU,KAAK,CAAA;AAAA,EAClD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,iBAAA,GAAoBA,kBAAY,MAAM;AAC1C,IAAA,MAAM,KAAK,MAAA,CAAO,OAAA;AAClB,IAAA,IAAI,CAAC,EAAA,EAAI;AAGT,IAAA,EAAA,CAAG,YAAY,EAAA,CAAG,YAAA;AAAA,EACpB,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,kBAAA,CAAmB,MAAM;AACvB,IAAA,MAAM,KAAK,MAAA,CAAO,OAAA;AAClB,IAAA,IAAI,CAAC,EAAA,EAAI;AAET,IAAA,MAAM,MAAM,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AACpC,IAAA,MAAM,KAAA,GAAQ,IAAI,CAAC,CAAA;AACnB,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA;AAC/B,IAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AAErB,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,IAAI,eAAe,iBAAA,EAAkB;AAAA,IACvC,CAAA,MAAO;AACL,MAAA,MAAM,YACJ,IAAA,CAAK,IAAA,KAAS,MAAA,IACd,IAAA,CAAK,SAAS,IAAA,IACd,IAAA,CAAK,KAAA,KAAU,MAAA,IACf,KAAK,KAAA,KAAU,KAAA,IACf,GAAA,CAAI,QAAA,CAAS,KAAK,KAAK,CAAA;AAEzB,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,IAAI,aAAA,IAAiB,WAAA,CAAY,OAAA,EAAS,iBAAA,EAAkB;AAAA,gBAIpD,SAAA,GAAY,IAAA,CAAK,SAAA,IAAa,EAAA,CAAG,eAAe,IAAA,CAAK,YAAA,CAAA;AAAA,MAC/D,CAAA,MAAO;AACL,QAAA,MAAM,SAAA,GAAY,KAAK,IAAA,KAAS,MAAA,GAAY,KAAK,GAAA,CAAI,OAAA,CAAQ,KAAK,IAAI,CAAA;AACtE,QAAA,MAAM,WAA8B,EAAC;AACrC,QAAA,KAAA,IAAS,IAAI,SAAA,GAAY,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACpD,UAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,QAAA,CAAS,CAAC,CAAA,CAAE,EAAE,CAAA,EAAG,QAAA,CAAS,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,QAC9D;AAEA,QAAA,IAAI,aAAA,IAAiB,YAAY,OAAA,EAAS;AACxC,UAAA,iBAAA,EAAkB;AAAA,QACpB,CAAA,MAAA,IAAW,aAAA,IAAiB,QAAA,CAAS,IAAA,CAAK,CAAC,MAAM,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAC,CAAA,EAAG;AAEpE,UAAA,iBAAA,EAAkB;AAAA,QACpB,CAAA,MAAA,IAAW,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAC9B,UAAA,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,GAAI,QAAA,CAAS,MAAM,CAAA;AAAA,QACtC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,OAAA,GAAU,EAAE,GAAA,EAAK,IAAI,IAAI,GAAG,CAAA,EAAG,KAAA,EAAO,IAAA,EAAM,YAAA,EAAc,EAAA,CAAG,YAAA,EAAc,SAAA,EAAW,GAAG,SAAA,EAAU;AAC3G,IAAA,MAAM,WAAA,GAAc,QAAQ,EAAE,CAAA;AAC9B,IAAA,IAAI,WAAA,KAAgB,WAAA,CAAY,OAAA,IAAW,WAAA,iBAA4B,WAAW,CAAA;AAAA,EAGpF,GAAG,CAAC,QAAA,EAAU,eAAe,OAAA,EAAS,cAAA,EAAgB,iBAAiB,CAAC,CAAA;AAIxE,EAAAD,gBAAU,MAAM;AACd,IAAA,MAAM,UAAU,UAAA,CAAW,OAAA;AAC3B,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,aAAA,IAAiB,OAAO,mBAAmB,WAAA,EAAa;AACzE,IAAA,MAAM,EAAA,GAAK,IAAI,cAAA,CAAe,MAAM;AAClC,MAAA,IAAI,WAAA,CAAY,SAAS,iBAAA,EAAkB;AAAA,IAC7C,CAAC,CAAA;AACD,IAAA,EAAA,CAAG,QAAQ,OAAO,CAAA;AAClB,IAAA,OAAO,MAAM,GAAG,UAAA,EAAW;AAAA,EAC7B,CAAA,EAAG,CAAC,aAAA,EAAe,iBAAiB,CAAC,CAAA;AAErC,EAAA,MAAM,QAAA,GAAWC,iBAAAA;AAAA,IACf,CAAC,CAAA,KAA+B;AAC9B,MAAA,YAAA,GAAe,CAAC,CAAA;AAChB,MAAA,IAAI,QAAQ,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,SAAA,GAAY,EAAE,aAAA,CAAc,SAAA;AACjE,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,CAAA,CAAE,aAAa,CAAA;AACnC,MAAA,IAAI,GAAA,KAAQ,WAAA,CAAY,OAAA,IAAW,GAAA,iBAAoB,GAAG,CAAA;AAAA,IAC5D,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,cAAA,EAAgB,YAAY;AAAA,GACxC;AAEA,EAAA,MAAM,YAAA,GAAeA,kBAAY,MAAM;AACrC,IAAA,UAAA,GAAa,EAAE,IAAA,EAAM,gBAAA,EAAkB,MAAA,EAAQ,CAAA;AAC/C,IAAA,iBAAA,EAAkB;AAClB,IAAA,cAAA,CAAe,IAAI,CAAA;AAGnB,IAAA,MAAA,CAAO,OAAA,EAAS,KAAA,CAAM,EAAE,aAAA,EAAe,MAAM,CAAA;AAAA,EAC/C,GAAG,CAAC,UAAA,EAAY,MAAA,EAAQ,iBAAA,EAAmB,cAAc,CAAC,CAAA;AAE1D,EAAAc,yBAAA;AAAA,IACE,GAAA;AAAA,IACA,OAAO;AAAA,MACL,cAAA,GAAiB;AACf,QAAA,iBAAA,EAAkB;AAClB,QAAA,MAAM,KAAK,MAAA,CAAO,OAAA;AAClB,QAAA,IAAI,EAAA,EAAI,cAAA,CAAe,OAAA,CAAQ,EAAE,CAAC,CAAA;AAAA,MACpC,CAAA;AAAA,MACA,gBAAgB,EAAA,EAAY;AAC1B,QAAA,MAAM,KAAK,MAAA,CAAO,OAAA;AAClB,QAAA,IAAI,CAAC,IAAI,OAAO,KAAA;AAChB,QAAA,MAAM,SAAS,CAAC,GAAG,GAAG,gBAAA,CAA8B,qBAAqB,CAAC,CAAA,CAAE,IAAA;AAAA,UAC1E,CAAC,CAAA,KAAM,CAAA,CAAE,YAAA,CAAa,mBAAmB,CAAA,KAAM;AAAA,SACjD;AACA,QAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,QAAA,EAAA,CAAG,YAAY,MAAA,CAAO,SAAA;AACtB,QAAA,cAAA,CAAe,OAAA,CAAQ,EAAE,CAAC,CAAA;AAC1B,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA,MACA,IAAI,OAAA,GAAU;AACZ,QAAA,OAAO,MAAA,CAAO,OAAA;AAAA,MAChB;AAAA,KACF,CAAA;AAAA,IACA,CAAC,iBAAA,EAAmB,cAAA,EAAgB,OAAO;AAAA,GAC7C;AAEA,EAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,aAAa,CAAA,KAAM,UAAA,IAAc,IAAA,CAAA;AACjE,EAAA,MAAM,cAAc,cAAA,IAAkB,QAAA;AACtC,EAAA,MAAM,QAAA,GAAW,MAAA,GAAS,CAAA,IAAK,CAAC,QAAA;AAChC,EAAA,MAAM,cACJ,gBAAA,KAAqB,IAAA,GAAO,0BAA0B,OAAO,gBAAA,KAAqB,WAAW,gBAAA,GAAmB,CAAA;AAElH,EAAA,MAAM,QAAqB,EAAC;AAC5B,EAAA,IAAI,OAAA;AACJ,EAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACzB,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,CAAA,CAAE,SAAS,CAAA;AAC/B,IAAA,IAAI,SAAA,GAAuB,IAAA;AAC3B,IAAA,IAAI,UAAA,KAAe,SAAS,IAAA,EAAM;AAChC,MAAA,MAAM,GAAA,GAAM,OAAO,IAAI,CAAA;AACvB,MAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,QAAA,SAAA,mBACEZ,eAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,yBAAA,EAAyB,GAAA;AAAA,YACzB,SAAA,EAAWC,oBAAA,CAAG,2CAAA,EAA6CO,WAAAA,EAAY,YAAY,SAAS,CAAA;AAAA,YAE5F,QAAA,EAAA;AAAA,8BAAAN,cAAAA,CAAC,UAAK,aAAA,EAAY,MAAA,EAAO,WAAWD,oBAAA,CAAG,sBAAA,EAAwBQ,OAAM,CAAA,EAAG,CAAA;AAAA,8BACxEP,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,SAAA,CAAU,IAAI,CAAA,EAAE,CAAA;AAAA,8BACvBA,eAAC,MAAA,EAAA,EAAK,aAAA,EAAY,QAAO,SAAA,EAAWD,oBAAA,CAAG,sBAAA,EAAwBQ,OAAM,CAAA,EAAG;AAAA;AAAA;AAAA,SAC1E;AAEF,QAAA,OAAA,GAAU,GAAA;AAAA,MACZ;AAAA,IACF;AACA,IAAA,MAAM,OAAA,GAAU,WAAA,GAAc,CAAA,IAAK,CAAC,SAAA,IAAa,cAAA,CAAe,QAAA,CAAS,CAAA,GAAI,CAAC,CAAA,EAAG,CAAA,EAAG,WAAW,CAAA;AAE/F,IAAA,KAAA,CAAM,IAAA;AAAA,sBACJT,eAAAA,CAACM,cAAAA,EAAA,EACE,QAAA,EAAA;AAAA,QAAA,SAAA;AAAA,wBACDJ,cAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,CAAA;AAAA,YACT,OAAA;AAAA,YACA,OAAA,EAAS,gBAAgB,CAAC,CAAA;AAAA,YAC1B,QAAA;AAAA,YACA,SAAA;AAAA,YACA,cAAA;AAAA,YACA,MAAA,EAAQ,UAAA;AAAA,YACR,UAAA;AAAA,YACA,gBAAA;AAAA,YACA,gBAAA;AAAA,YACA,gBAAA;AAAA,YACA,UAAA;AAAA,YACA,aAAA;AAAA,YACA;AAAA;AAAA;AACF,OAAA,EAAA,EAjBa,EAAE,EAkBjB;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,CAAA,GAAI,IAAI,YAAY,CAAA,CAAA;AAE1B,EAAA,uBACEF,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,8BAAA,EAA6B,EAAA;AAAA,MAC5B,GAAG,IAAA;AAAA,MACJ,SAAA,EAAWC,oBAAA,CAAG,uBAAA,EAAyB,SAAA,EAAW,YAAY,IAAI,CAAA;AAAA,MAEjE,QAAA,EAAA;AAAA,QAAA,OAAA,KAAY,MAAA,IAAa,OAAA,KAAY,IAAA,oBACpCC,cAAAA;AAAA,UAAC,CAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAI,SAAA;AAAA,YACJ,sCAAA,EAAqC,EAAA;AAAA,YACrC,SAAA,EAAWD,oBAAA,CAAG,0CAAA,EAA4C,UAAA,EAAY,OAAO,CAAA;AAAA,YAE5E,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,wBAEFD,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAA,EACb,QAAA,EAAA;AAAA,0BAAAE,cAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,MAAA;AAAA,cACL,kCAAA,EAAiC,EAAA;AAAA,cACjC,IAAA,EAAK,KAAA;AAAA,cACL,WAAA,EAAU,QAAA;AAAA,cACV,eAAA,EAAc,WAAA;AAAA,cACd,YAAA,EAAY,OAAA,GAAU,MAAA,GAAY,MAAA,CAAO,GAAA;AAAA,cACzC,iBAAA,EAAiB,UAAU,SAAA,GAAY,MAAA;AAAA,cACvC,QAAA,EAAU,CAAA;AAAA,cACV,QAAA;AAAA,cACA,SAAA,EAAWD,oBAAA;AAAA,gBACT,iMAAA;AAAA,gBACA,UAAA,EAAY;AAAA,eACd;AAAA,cAEA,0BAAAD,eAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,UAAA,EAAY,WAAU,oBAAA,EAC7B,QAAA,EAAA;AAAA,gBAAA,eAAA,oBACCE,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BACb,QAAA,kBAAAA,cAAAA;AAAA,kBAACE,wBAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,IAAA,EAAK,IAAA;AAAA,oBACL,OAAA,EAAQ,OAAA;AAAA,oBACR,2CAAA,EAA0C,EAAA;AAAA,oBAC1C,QAAA,EAAU,WAAA;AAAA,oBACV,aAAW,WAAA,IAAe,MAAA;AAAA,oBAC1B,OAAA,EAAS,MACP,OAAA,CAAQ,MAAM;AACZ,sBAAA,UAAA,GAAa,EAAE,IAAA,EAAM,cAAA,EAAgB,CAAA;AACrC,sBAAA,OAAO,aAAA,EAAe;AAAA,oBACxB,CAAA,EAAG,EAAE,IAAA,EAAM,cAAA,EAAgB,CAAA;AAAA,oBAG5B,QAAA,EAAA,WAAA,GAAc,MAAA,CAAO,cAAA,GAAiB,MAAA,CAAO;AAAA;AAAA,iBAChD,EACF,CAAA;AAAA,gBAED,QAAA,CAAS,MAAA,KAAW,CAAA,IAAK,KAAA,KAAU,0BAClCF,cAAAA,CAAC,KAAA,EAAA,EAAI,oCAAA,EAAmC,IAAG,SAAA,EAAWD,oBAAA,CAAG,+BAAA,EAAiCO,WAAU,GACjG,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,gBAED;AAAA,eAAA,EACH;AAAA;AAAA,WACF;AAAA,UACC,4BACCN,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uEACb,QAAA,kBAAAA,cAAAA;AAAA,YAACE,wBAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,IAAA,EAAK,IAAA;AAAA,cACL,mCAAA,EAAkC,EAAA;AAAA,cAClC,aAAA,EAAa,MAAA;AAAA,cACb,YAAA,EAAa,cAAA;AAAA,cACb,SAAA,EAAWH,oBAAA,CAAG,+BAAA,EAAiC,UAAA,EAAY,IAAI,CAAA;AAAA,cAC/D,OAAA,EAAS,YAAA;AAAA,cAER,QAAA,EAAA,MAAA,CAAO,YAAY,MAAM;AAAA;AAAA,WAC5B,EACF;AAAA,SAAA,EAEJ,CAAA;AAAA,QACC,QAAA,KAAa,MAAA,IAAa,QAAA,KAAa,IAAA,oBACtCC,cAAAA,CAAC,KAAA,EAAA,EAAI,uCAAA,EAAsC,EAAA,EAAG,WAAWD,oBAAA,CAAG,UAAA,EAAY,UAAA,EAAY,QAAQ,GACzF,QAAA,EAAA,QAAA,EACH;AAAA;AAAA;AAAA,GAEJ;AAEJ;AAEA,UAAA,CAAW,WAAA,GAAc,YAAA","file":"chunk-RVBA4LEB.cjs","sourcesContent":["import type { ChatMessageData, ChatThreadLabels } from \"./ChatThread.types\";\n\nexport const DEFAULT_LABELS: ChatThreadLabels = {\n log: \"Conversation\",\n loadEarlier: \"Load earlier messages\",\n loadingEarlier: \"Loading earlier messages...\",\n newMessages: (n) => (n === 1 ? \"1 new message\" : `${n} new messages`),\n internal: \"Internal note\",\n pending: \"Sending...\",\n failed: \"Not sent\",\n proposal: \"Proposed\",\n accept: \"Accept\",\n reject: \"Reject\",\n accepted: \"Accepted\",\n rejected: \"Rejected\",\n withdrawn: \"Withdrawn\",\n attachments: \"Attachments\",\n roles: {\n user: \"You\",\n assistant: \"Assistant\",\n system: \"System\",\n agent: \"Agent\",\n staff: \"Staff\",\n customer: \"Customer\",\n },\n};\n\nexport function mergeLabels(labels?: Partial<ChatThreadLabels>): ChatThreadLabels {\n if (!labels) return DEFAULT_LABELS;\n return {\n ...DEFAULT_LABELS,\n ...labels,\n roles: { ...DEFAULT_LABELS.roles, ...labels.roles },\n };\n}\n\n/** `null` for a missing or unparseable time: no time renders rather than \"Invalid Date\". */\nexport function toDate(value: string | number | undefined): Date | null {\n if (value === undefined || value === null || value === \"\") return null;\n const d = new Date(value);\n return Number.isNaN(d.getTime()) ? null : d;\n}\n\n/** Local calendar day, `YYYY-MM-DD`. */\nexport function dayKey(d: Date): string {\n const p = (n: number) => String(n).padStart(2, \"0\");\n return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}`;\n}\n\nexport function defaultFormatTime(d: Date): string {\n return d.toLocaleTimeString(undefined, { hour: \"2-digit\", minute: \"2-digit\" });\n}\n\nexport function defaultFormatDay(d: Date): string {\n return d.toLocaleDateString(undefined, { dateStyle: \"medium\" });\n}\n\nexport function roleLabel(role: string, labels: ChatThreadLabels): string {\n const known = labels.roles[role];\n if (known) return known;\n return role ? role.charAt(0).toUpperCase() + role.slice(1) : \"\";\n}\n\nexport function initials(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return \"?\";\n const first = parts[0][0] ?? \"\";\n const last = parts.length > 1 ? (parts[parts.length - 1][0] ?? \"\") : \"\";\n return (first + last).toUpperCase();\n}\n\nexport function isOwn(message: ChatMessageData, ownRoles: string[]): boolean {\n return message.own ?? ownRoles.includes(message.role);\n}\n\nexport const DEFAULT_GROUP_WINDOW_MS = 5 * 60 * 1000;\n\n/** Does `curr` continue `prev`'s group? Same role, same author, same visibility, within the window. */\nexport function continuesGroup(\n prev: ChatMessageData | undefined,\n curr: ChatMessageData,\n windowMs: number,\n): boolean {\n if (!prev) return false;\n if (prev.role !== curr.role) return false;\n if ((prev.author?.name ?? \"\") !== (curr.author?.name ?? \"\")) return false;\n if ((prev.visibility ?? \"public\") !== (curr.visibility ?? \"public\")) return false;\n if (prev.proposal || curr.proposal) return false;\n if (curr.role === \"system\") return false;\n const a = toDate(prev.createdAt);\n const b = toDate(curr.createdAt);\n if (!a || !b) return false;\n const gap = b.getTime() - a.getTime();\n return gap >= 0 && gap <= windowMs;\n}\n\nexport function formatBytes(n: number): string {\n if (n < 1024) return `${n} B`;\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KB`;\n return `${(n / (1024 * 1024)).toFixed(1)} MB`;\n}\n","import { useCallback, useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { sanitizeComponentHref } from \"../../utils/sanitize\";\nimport { Avatar } from \"../Avatar\";\nimport { Badge } from \"../Badge\";\nimport { Button } from \"../Button\";\nimport { ContentRenderer } from \"../ContentRenderer\";\nimport type {\n ChatAction,\n ChatAttachment,\n ChatMessageData,\n ChatMessageProps,\n ChatThreadActionContext,\n ChatThreadLabels,\n} from \"./ChatThread.types\";\nimport {\n defaultFormatTime,\n formatBytes,\n initials,\n isOwn,\n mergeLabels,\n roleLabel,\n toDate,\n} from \"./chat-utils\";\n\nconst BORDER =\n \"border-[color:var(--fancy-border,var(--color-zinc-200))] dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))]\";\nconst SURFACE =\n \"bg-[color:var(--fancy-surface,var(--color-white))] dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\";\nconst SURFACE_MUTED =\n \"bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] dark:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]\";\nconst TEXT =\n \"text-[color:var(--fancy-text,var(--color-zinc-900))] dark:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]\";\nconst TEXT_MUTED =\n \"text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))]\";\n\n/**\n * Run a host callback that may return a Promise. While it is pending the\n * control is busy and a second run is refused. A rejection goes to\n * `onActionError`, or is left unhandled so it still reaches the console.\n *\n * @internal shared by ChatMessage (proposal decisions) and ChatThread (load earlier)\n */\nexport function useAcknowledgedAction(\n onActionError?: (error: unknown, action: ChatThreadActionContext) => void,\n): [busy: boolean, run: (fn: () => ReturnType<ChatAction>, ctx: ChatThreadActionContext) => void] {\n const [busy, setBusy] = useState(false);\n const busyRef = useRef(false);\n const mounted = useRef(true);\n const onErrorRef = useRef(onActionError);\n onErrorRef.current = onActionError;\n\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n\n const run = useCallback((fn: () => ReturnType<ChatAction>, ctx: ChatThreadActionContext) => {\n if (busyRef.current) return;\n const result = fn();\n if (!result || typeof (result as Promise<unknown>).then !== \"function\") return;\n\n busyRef.current = true;\n setBusy(true);\n const settle = () => {\n busyRef.current = false;\n if (mounted.current) setBusy(false);\n };\n void Promise.resolve(result).then(settle, (error: unknown) => {\n settle();\n const onError = onErrorRef.current;\n if (onError) onError(error, ctx);\n else throw error;\n });\n }, []);\n\n return [busy, run];\n}\n\nfunction AttachmentItem({\n attachment,\n message,\n renderAttachment,\n}: {\n attachment: ChatAttachment;\n message: ChatMessageData;\n renderAttachment?: ChatMessageProps[\"renderAttachment\"];\n}) {\n let body: ReactNode;\n if (renderAttachment) {\n body = renderAttachment(attachment, message);\n } else {\n const href = sanitizeComponentHref(\"ChatMessage\", attachment.url);\n const size = typeof attachment.size === \"number\" ? (\n <span className={cn(\"ms-1\", TEXT_MUTED)}>({formatBytes(attachment.size)})</span>\n ) : null;\n body = href ? (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\" className=\"underline underline-offset-2 break-all\">\n {attachment.name}\n {size}\n </a>\n ) : (\n <span className=\"break-all\">\n {attachment.name}\n {size}\n </span>\n );\n }\n\n return (\n <li data-chat-attachment={attachment.id} className=\"text-sm\">\n {body}\n </li>\n );\n}\n\nfunction ProposalFooter({\n message,\n labels,\n busy,\n onAccept,\n onReject,\n}: {\n message: ChatMessageData;\n labels: ChatThreadLabels;\n busy: boolean;\n onAccept?: () => void;\n onReject?: () => void;\n}) {\n const proposal = message.proposal!;\n const state = proposal.state ?? \"pending\";\n\n if (state !== \"pending\") {\n const text = state === \"accepted\" ? labels.accepted : state === \"rejected\" ? labels.rejected : labels.withdrawn;\n const color = state === \"accepted\" ? \"emerald\" : state === \"rejected\" ? \"red\" : \"zinc\";\n return (\n <div className=\"mt-2\">\n <Badge color={color} variant=\"soft\" size=\"sm\" data-chat-proposal-status={state}>\n {text}\n </Badge>\n </div>\n );\n }\n\n if (!onAccept && !onReject) return null;\n\n return (\n <div className=\"mt-3 flex flex-wrap items-center gap-2\">\n {onAccept && (\n <Button\n type=\"button\"\n size=\"sm\"\n color=\"emerald\"\n disabled={busy}\n aria-busy={busy || undefined}\n data-chat-proposal-action=\"accept\"\n onClick={onAccept}\n >\n {proposal.acceptLabel ?? labels.accept}\n </Button>\n )}\n {onReject && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n disabled={busy}\n aria-busy={busy || undefined}\n data-chat-proposal-action=\"reject\"\n onClick={onReject}\n >\n {proposal.rejectLabel ?? labels.reject}\n </Button>\n )}\n </div>\n );\n}\n\n/**\n * ChatMessage — one message of a `ChatThread`, usable on its own.\n *\n * Content is markdown through `ContentRenderer`, always sanitised (there is no\n * `unsafe` here on purpose: message bodies are text the host did not author).\n * `format: \"text\"` renders it literally. A message with a `proposal` is an\n * approval card: the host owns its state and decides it through\n * `onProposalAccept` / `onProposalReject`; the card never acts on its own.\n */\nexport function ChatMessage({\n message,\n actions,\n grouped = false,\n className,\n ownRoles = [\"user\"],\n streaming = true,\n contentOptions,\n labels: labelsProp,\n formatTime = defaultFormatTime,\n renderAttachment,\n onProposalAccept,\n onProposalReject,\n onActivity,\n onActionError,\n classNames,\n}: ChatMessageProps) {\n const labels = mergeLabels(labelsProp);\n const [busy, run] = useAcknowledgedAction(onActionError);\n\n const status = message.status ?? \"sent\";\n const visibility = message.visibility ?? \"public\";\n const internal = visibility === \"internal\";\n const own = isOwn(message, ownRoles);\n const system = message.role === \"system\";\n const proposal = message.proposal;\n const date = toDate(message.createdAt);\n // Always a name: the author's, else the role's (\"Assistant\", or the host's own role capitalised).\n const name = message.author?.name || roleLabel(message.role, labels);\n\n const decide = (kind: \"accept\" | \"reject\") => {\n if (!proposal) return;\n const cb = kind === \"accept\" ? onProposalAccept : onProposalReject;\n if (!cb) return;\n const ctx: ChatThreadActionContext = {\n type: kind === \"accept\" ? \"proposal-accept\" : \"proposal-reject\",\n messageId: message.id,\n proposalId: proposal.id,\n };\n run(() => {\n onActivity?.(ctx);\n return cb(message);\n }, ctx);\n };\n\n const body =\n message.format === \"text\" ? (\n <div data-chat-content=\"\" className=\"whitespace-pre-wrap break-words\">\n {message.content}\n </div>\n ) : (\n <div data-chat-content=\"\" className=\"min-w-0 break-words\">\n <ContentRenderer\n {...contentOptions}\n value={message.content}\n format=\"markdown\"\n streaming={status === \"streaming\" ? streaming : false}\n />\n </div>\n );\n\n const attachments =\n message.attachments && message.attachments.length > 0 ? (\n <ul data-chat-attachments=\"\" aria-label={labels.attachments} className=\"mt-2 flex flex-col gap-1\">\n {message.attachments.map((a) => (\n <AttachmentItem key={a.id} attachment={a} message={message} renderAttachment={renderAttachment} />\n ))}\n </ul>\n ) : null;\n\n const statusText =\n status === \"pending\" ? (\n <div data-chat-status-text=\"pending\" className={cn(\"mt-1 text-xs\", TEXT_MUTED)}>\n {labels.pending}\n </div>\n ) : status === \"failed\" ? (\n <div data-chat-status-text=\"failed\" className=\"mt-1 text-xs text-red-600 dark:text-red-400\">\n {labels.failed}\n </div>\n ) : null;\n\n const actionsSlot =\n actions !== undefined && actions !== null && actions !== false ? (\n <div data-chat-message-actions=\"\" className={cn(\"mt-1 flex flex-wrap items-center gap-1\", classNames?.actions)}>\n {actions}\n </div>\n ) : null;\n\n const rootAttrs = {\n \"data-chat-message\": message.id,\n \"data-chat-role\": message.role,\n \"data-chat-status\": status,\n \"data-chat-visibility\": visibility,\n \"data-chat-own\": own ? \"\" : undefined,\n \"data-chat-grouped\": grouped ? \"\" : undefined,\n \"aria-busy\": status === \"streaming\" ? true : undefined,\n };\n\n if (system && !proposal) {\n return (\n <article\n {...rootAttrs}\n className={cn(\"flex flex-col items-center px-4 py-1 text-center text-xs\", TEXT_MUTED, className, classNames?.message)}\n >\n {internal && (\n <Badge color=\"amber\" variant=\"soft\" size=\"sm\" data-chat-internal-label=\"\">\n {labels.internal}\n </Badge>\n )}\n <div className={cn(\"max-w-prose\", classNames?.bubble)}>{body}</div>\n {attachments}\n {actionsSlot}\n </article>\n );\n }\n\n const bubbleClass = cn(\n \"rounded-2xl px-3.5 py-2.5 text-sm\",\n TEXT,\n internal\n ? \"border border-dashed border-amber-400 bg-amber-50 dark:border-amber-500/60 dark:bg-amber-950/30\"\n : proposal\n ? cn(\"border-2 border-violet-300 dark:border-violet-500/60\", SURFACE)\n : own\n ? cn(\"border\", BORDER, SURFACE)\n : SURFACE_MUTED,\n status === \"failed\" && \"ring-1 ring-red-400/70\",\n classNames?.bubble,\n proposal && classNames?.proposal,\n );\n\n const bubbleInner = (\n <>\n {internal && (\n <div className=\"mb-1.5\">\n <Badge color=\"amber\" variant=\"soft\" size=\"sm\" data-chat-internal-label=\"\">\n {labels.internal}\n </Badge>\n </div>\n )}\n {proposal && (\n <div data-chat-proposal-header=\"\" className=\"mb-1.5 flex flex-wrap items-center gap-2\">\n <Badge color=\"violet\" variant=\"soft\" size=\"sm\">\n {labels.proposal}\n </Badge>\n {proposal.title && <span className=\"font-medium\">{proposal.title}</span>}\n </div>\n )}\n {body}\n {attachments}\n {proposal && (\n <ProposalFooter\n message={message}\n labels={labels}\n busy={busy}\n onAccept={onProposalAccept ? () => decide(\"accept\") : undefined}\n onReject={onProposalReject ? () => decide(\"reject\") : undefined}\n />\n )}\n </>\n );\n\n return (\n <article\n {...rootAttrs}\n className={cn(\n \"flex gap-2.5 px-3\",\n grouped ? \"pt-0.5\" : \"pt-3\",\n own && \"flex-row-reverse\",\n className,\n classNames?.message,\n )}\n >\n <div className=\"w-8 shrink-0\" aria-hidden={grouped || undefined}>\n {!grouped && (\n <Avatar size=\"sm\" src={message.author?.avatar} alt=\"\" fallback={initials(name)} />\n )}\n </div>\n <div className={cn(\"flex min-w-0 max-w-[85%] flex-col\", own ? \"items-end\" : \"items-start\")}>\n {!grouped && (\n <div\n data-chat-header=\"\"\n className={cn(\"mb-1 flex items-baseline gap-2 text-xs\", own && \"flex-row-reverse\", classNames?.header)}\n >\n <span data-chat-author=\"\" className={cn(\"font-medium\", TEXT)}>\n {name}\n </span>\n {date && (\n <time dateTime={date.toISOString()} className={TEXT_MUTED}>\n {formatTime(date)}\n </time>\n )}\n </div>\n )}\n {proposal ? (\n <div\n data-chat-proposal={proposal.id}\n data-chat-proposal-state={proposal.state ?? \"pending\"}\n aria-busy={busy || undefined}\n className={cn(\"min-w-0 max-w-full\", bubbleClass)}\n >\n {bubbleInner}\n </div>\n ) : (\n <div data-chat-bubble=\"\" className={cn(\"min-w-0 max-w-full\", bubbleClass)}>\n {bubbleInner}\n </div>\n )}\n {statusText}\n {actionsSlot}\n </div>\n </article>\n );\n}\n\nChatMessage.displayName = \"ChatMessage\";\n","import {\n Fragment,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useLayoutEffect,\n useRef,\n useState,\n type ReactNode,\n type UIEvent,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Button } from \"../Button\";\nimport { ChatMessage, useAcknowledgedAction } from \"./ChatMessage\";\nimport type { ChatMessageData, ChatThreadProps } from \"./ChatThread.types\";\nimport {\n DEFAULT_GROUP_WINDOW_MS,\n continuesGroup,\n dayKey,\n defaultFormatDay,\n isOwn,\n mergeLabels,\n toDate,\n} from \"./chat-utils\";\n\nconst TEXT_MUTED =\n \"text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))]\";\nconst BORDER =\n \"border-[color:var(--fancy-border,var(--color-zinc-200))] dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))]\";\n\n// The isomorphic layout effect: scroll work must happen before paint in the\n// browser, and must not warn during SSR.\nconst useIsoLayoutEffect = typeof window === \"undefined\" ? useEffect : useLayoutEffect;\n\ninterface Seen {\n ids: Set<string>;\n first?: string;\n last?: string;\n scrollHeight: number;\n /** The reader's position as of the last render or scroll event, before any browser adjustment. */\n scrollTop: number;\n}\n\n/**\n * ChatThread — a controlled message list for agent and support conversations.\n *\n * - **Controlled.** It renders exactly `messages`, oldest first. Loading\n * earlier history and deciding a proposal go through callbacks; nothing is\n * held internally that an agent would need to read or write.\n * - **Stick to the bottom without yanking.** New messages are followed only\n * while the reader is at the bottom. A reader who scrolled up stays put and\n * gets an \"N new messages\" jump control. Prepended history keeps the\n * reader's place. Only the log's own `scrollTop` is ever set, and focus moves\n * with `preventScroll`, so no ancestor (or the page) scrolls (the 5.69 rule).\n * - **Visibility is the host's.** `visibility: \"internal\"` is labelled and\n * styled, never filtered: pass only what the viewer may see.\n * - **Handles:** `data-react-fancy-chat-thread`, `data-chat-message=\"<id>\"`,\n * `data-chat-role`, `data-chat-status`, `data-chat-visibility`,\n * `data-chat-proposal=\"<id>\"`, `data-chat-proposal-action`.\n * - **Observable:** `onActivity` reports every interaction as one stream.\n *\n * Pair it with `Composer` or `PromptInput` in the `composer` slot (both have\n * acknowledged send). It does not ship an input of its own.\n */\nexport function ChatThread({\n ref,\n messages,\n heading,\n headingLevel = 2,\n onLoadEarlier,\n hasEarlier,\n loadingEarlier = false,\n stickToBottom = true,\n bottomThreshold = 48,\n onAtBottomChange,\n separators = \"none\",\n formatDay = defaultFormatDay,\n groupConsecutive = false,\n renderActions,\n composer,\n empty,\n classNames,\n className,\n // message display\n ownRoles = [\"user\"],\n streaming = true,\n contentOptions,\n labels: labelsProp,\n formatTime,\n renderAttachment,\n onProposalAccept,\n onProposalReject,\n onActivity,\n onActionError,\n onScroll: onScrollProp,\n ...rest\n}: ChatThreadProps) {\n const labels = mergeLabels(labelsProp);\n const headingId = useId();\n const logRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const atBottomRef = useRef(true);\n const seenRef = useRef<Seen | null>(null);\n const [atBottom, setAtBottom] = useState(true);\n const [unseen, setUnseen] = useState(0);\n const [loadBusy, runLoad] = useAcknowledgedAction(onActionError);\n\n const onAtBottomChangeRef = useRef(onAtBottomChange);\n onAtBottomChangeRef.current = onAtBottomChange;\n\n const measure = useCallback(\n (el: HTMLElement) => el.scrollHeight - el.scrollTop - el.clientHeight <= bottomThreshold,\n [bottomThreshold],\n );\n\n const commitAtBottom = useCallback((value: boolean) => {\n const changed = atBottomRef.current !== value;\n atBottomRef.current = value;\n setAtBottom(value);\n if (value) setUnseen(0);\n if (changed) onAtBottomChangeRef.current?.(value);\n }, []);\n\n const scrollLogToBottom = useCallback(() => {\n const el = logRef.current;\n if (!el) return;\n // The log's own scrollTop only. Never scrollIntoView: that scrolls every\n // scrollable ancestor too, up to the page.\n el.scrollTop = el.scrollHeight;\n }, []);\n\n // Follow, hold, or keep place, every time the messages change.\n useIsoLayoutEffect(() => {\n const el = logRef.current;\n if (!el) return;\n\n const ids = messages.map((m) => m.id);\n const first = ids[0];\n const last = ids[ids.length - 1];\n const prev = seenRef.current;\n\n if (!prev) {\n if (stickToBottom) scrollLogToBottom();\n } else {\n const prepended =\n prev.last !== undefined &&\n prev.last === last &&\n prev.first !== undefined &&\n prev.first !== first &&\n ids.includes(prev.first);\n\n if (prepended) {\n if (stickToBottom && atBottomRef.current) scrollLogToBottom();\n // From the position BEFORE the change, never the current one: the\n // browser's scroll anchoring (overflow-anchor) may already have moved\n // scrollTop by the inserted height, and adding it again overshoots.\n else el.scrollTop = prev.scrollTop + (el.scrollHeight - prev.scrollHeight);\n } else {\n const lastIndex = prev.last === undefined ? -1 : ids.indexOf(prev.last);\n const appended: ChatMessageData[] = [];\n for (let i = lastIndex + 1; i < messages.length; i++) {\n if (!prev.ids.has(messages[i].id)) appended.push(messages[i]);\n }\n\n if (stickToBottom && atBottomRef.current) {\n scrollLogToBottom();\n } else if (stickToBottom && appended.some((m) => isOwn(m, ownRoles))) {\n // The viewer's own send: show it, wherever they were reading.\n scrollLogToBottom();\n } else if (appended.length > 0) {\n setUnseen((n) => n + appended.length);\n }\n }\n }\n\n seenRef.current = { ids: new Set(ids), first, last, scrollHeight: el.scrollHeight, scrollTop: el.scrollTop };\n const nowAtBottom = measure(el);\n if (nowAtBottom !== atBottomRef.current || nowAtBottom) commitAtBottom(nowAtBottom);\n // ownRoles is compared by content inside; a new array each render must not re-run this.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [messages, stickToBottom, measure, commitAtBottom, scrollLogToBottom]);\n\n // Content that grows without a messages change (images, fonts, a\n // ContentRenderer extension resolving) keeps a reader at the bottom there.\n useEffect(() => {\n const content = contentRef.current;\n if (!content || !stickToBottom || typeof ResizeObserver === \"undefined\") return;\n const ro = new ResizeObserver(() => {\n if (atBottomRef.current) scrollLogToBottom();\n });\n ro.observe(content);\n return () => ro.disconnect();\n }, [stickToBottom, scrollLogToBottom]);\n\n const onScroll = useCallback(\n (e: UIEvent<HTMLDivElement>) => {\n onScrollProp?.(e);\n if (seenRef.current) seenRef.current.scrollTop = e.currentTarget.scrollTop;\n const now = measure(e.currentTarget);\n if (now !== atBottomRef.current || now) commitAtBottom(now);\n },\n [measure, commitAtBottom, onScrollProp],\n );\n\n const jumpToLatest = useCallback(() => {\n onActivity?.({ type: \"jump-to-latest\", unseen });\n scrollLogToBottom();\n commitAtBottom(true);\n // The jump control is about to unmount; keep focus in the conversation\n // without scrolling anything (genie#1290).\n logRef.current?.focus({ preventScroll: true });\n }, [onActivity, unseen, scrollLogToBottom, commitAtBottom]);\n\n useImperativeHandle(\n ref,\n () => ({\n scrollToLatest() {\n scrollLogToBottom();\n const el = logRef.current;\n if (el) commitAtBottom(measure(el));\n },\n scrollToMessage(id: string) {\n const el = logRef.current;\n if (!el) return false;\n const target = [...el.querySelectorAll<HTMLElement>(\"[data-chat-message]\")].find(\n (n) => n.getAttribute(\"data-chat-message\") === id,\n );\n if (!target) return false;\n el.scrollTop = target.offsetTop;\n commitAtBottom(measure(el));\n return true;\n },\n get element() {\n return logRef.current;\n },\n }),\n [scrollLogToBottom, commitAtBottom, measure],\n );\n\n const showLoadEarlier = Boolean(onLoadEarlier) && (hasEarlier ?? true);\n const earlierBusy = loadingEarlier || loadBusy;\n const showJump = unseen > 0 && !atBottom;\n const groupWindow =\n groupConsecutive === true ? DEFAULT_GROUP_WINDOW_MS : typeof groupConsecutive === \"number\" ? groupConsecutive : 0;\n\n const items: ReactNode[] = [];\n let prevDay: string | undefined;\n messages.forEach((m, i) => {\n const date = toDate(m.createdAt);\n let separator: ReactNode = null;\n if (separators === \"day\" && date) {\n const key = dayKey(date);\n if (key !== prevDay) {\n separator = (\n <div\n data-chat-day-separator={key}\n className={cn(\"flex items-center gap-3 px-4 pt-4 text-xs\", TEXT_MUTED, classNames?.separator)}\n >\n <span aria-hidden=\"true\" className={cn(\"h-px flex-1 border-t\", BORDER)} />\n <span>{formatDay(date)}</span>\n <span aria-hidden=\"true\" className={cn(\"h-px flex-1 border-t\", BORDER)} />\n </div>\n );\n prevDay = key;\n }\n }\n const grouped = groupWindow > 0 && !separator && continuesGroup(messages[i - 1], m, groupWindow);\n\n items.push(\n <Fragment key={m.id}>\n {separator}\n <ChatMessage\n message={m}\n grouped={grouped}\n actions={renderActions?.(m)}\n ownRoles={ownRoles}\n streaming={streaming}\n contentOptions={contentOptions}\n labels={labelsProp}\n formatTime={formatTime}\n renderAttachment={renderAttachment}\n onProposalAccept={onProposalAccept}\n onProposalReject={onProposalReject}\n onActivity={onActivity}\n onActionError={onActionError}\n classNames={classNames}\n />\n </Fragment>,\n );\n });\n\n const H = `h${headingLevel}` as \"h2\";\n\n return (\n <div\n data-react-fancy-chat-thread=\"\"\n {...rest}\n className={cn(\"flex min-h-0 flex-col\", className, classNames?.root)}\n >\n {heading !== undefined && heading !== null && (\n <H\n id={headingId}\n data-react-fancy-chat-thread-heading=\"\"\n className={cn(\"shrink-0 px-4 py-3 text-sm font-semibold\", classNames?.heading)}\n >\n {heading}\n </H>\n )}\n <div className=\"relative flex min-h-0 flex-1 flex-col\">\n <div\n ref={logRef}\n data-react-fancy-chat-thread-log=\"\"\n role=\"log\"\n aria-live=\"polite\"\n aria-relevant=\"additions\"\n aria-label={heading ? undefined : labels.log}\n aria-labelledby={heading ? headingId : undefined}\n tabIndex={0}\n onScroll={onScroll}\n className={cn(\n \"relative min-h-0 flex-1 overflow-y-auto overscroll-contain focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-[color:var(--fancy-focus,var(--color-blue-500))]\",\n classNames?.log,\n )}\n >\n <div ref={contentRef} className=\"flex flex-col pb-3\">\n {showLoadEarlier && (\n <div className=\"flex justify-center pt-3\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n data-react-fancy-chat-thread-load-earlier=\"\"\n disabled={earlierBusy}\n aria-busy={earlierBusy || undefined}\n onClick={() =>\n runLoad(() => {\n onActivity?.({ type: \"load-earlier\" });\n return onLoadEarlier!();\n }, { type: \"load-earlier\" })\n }\n >\n {earlierBusy ? labels.loadingEarlier : labels.loadEarlier}\n </Button>\n </div>\n )}\n {messages.length === 0 && empty !== undefined && (\n <div data-react-fancy-chat-thread-empty=\"\" className={cn(\"px-4 py-8 text-center text-sm\", TEXT_MUTED)}>\n {empty}\n </div>\n )}\n {items}\n </div>\n </div>\n {showJump && (\n <div className=\"pointer-events-none absolute inset-x-0 bottom-3 flex justify-center\">\n <Button\n type=\"button\"\n size=\"sm\"\n data-react-fancy-chat-thread-jump=\"\"\n data-unseen={unseen}\n iconTrailing=\"chevron-down\"\n className={cn(\"pointer-events-auto shadow-md\", classNames?.jump)}\n onClick={jumpToLatest}\n >\n {labels.newMessages(unseen)}\n </Button>\n </div>\n )}\n </div>\n {composer !== undefined && composer !== null && (\n <div data-react-fancy-chat-thread-composer=\"\" className={cn(\"shrink-0\", classNames?.composer)}>\n {composer}\n </div>\n )}\n </div>\n );\n}\n\nChatThread.displayName = \"ChatThread\";\n"]}
1
+ {"version":3,"sources":["../src/components/ChatThread/chat-utils.ts","../src/components/ChatThread/ChatMessage.tsx","../src/components/ChatThread/ChatThread.tsx"],"names":["useState","useRef","useEffect","useCallback","sanitizeComponentHref","jsxs","cn","jsx","Badge","Button","ContentRenderer","Fragment","Avatar","TEXT_MUTED","BORDER","useLayoutEffect","useId","useImperativeHandle"],"mappings":"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","file":"chunk-2SO4WS2E.cjs","sourcesContent":["import type { ChatMessageData, ChatThreadLabels } from \"./ChatThread.types\";\n\nexport const DEFAULT_LABELS: ChatThreadLabels = {\n log: \"Conversation\",\n loadEarlier: \"Load earlier messages\",\n loadingEarlier: \"Loading earlier messages...\",\n newMessages: (n) => (n === 1 ? \"1 new message\" : `${n} new messages`),\n internal: \"Internal note\",\n pending: \"Sending...\",\n failed: \"Not sent\",\n proposal: \"Proposed\",\n accept: \"Accept\",\n reject: \"Reject\",\n accepted: \"Accepted\",\n rejected: \"Rejected\",\n withdrawn: \"Withdrawn\",\n attachments: \"Attachments\",\n roles: {\n user: \"You\",\n assistant: \"Assistant\",\n system: \"System\",\n agent: \"Agent\",\n staff: \"Staff\",\n customer: \"Customer\",\n },\n};\n\nexport function mergeLabels(labels?: Partial<ChatThreadLabels>): ChatThreadLabels {\n if (!labels) return DEFAULT_LABELS;\n return {\n ...DEFAULT_LABELS,\n ...labels,\n roles: { ...DEFAULT_LABELS.roles, ...labels.roles },\n };\n}\n\n/** `null` for a missing or unparseable time: no time renders rather than \"Invalid Date\". */\nexport function toDate(value: string | number | undefined): Date | null {\n if (value === undefined || value === null || value === \"\") return null;\n const d = new Date(value);\n return Number.isNaN(d.getTime()) ? null : d;\n}\n\n/** Local calendar day, `YYYY-MM-DD`. */\nexport function dayKey(d: Date): string {\n const p = (n: number) => String(n).padStart(2, \"0\");\n return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}`;\n}\n\nexport function defaultFormatTime(d: Date): string {\n return d.toLocaleTimeString(undefined, { hour: \"2-digit\", minute: \"2-digit\" });\n}\n\nexport function defaultFormatDay(d: Date): string {\n return d.toLocaleDateString(undefined, { dateStyle: \"medium\" });\n}\n\nexport function roleLabel(role: string, labels: ChatThreadLabels): string {\n const known = labels.roles[role];\n if (known) return known;\n return role ? role.charAt(0).toUpperCase() + role.slice(1) : \"\";\n}\n\nexport function initials(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return \"?\";\n const first = parts[0][0] ?? \"\";\n const last = parts.length > 1 ? (parts[parts.length - 1][0] ?? \"\") : \"\";\n return (first + last).toUpperCase();\n}\n\nexport function isOwn(message: ChatMessageData, ownRoles: string[]): boolean {\n return message.own ?? ownRoles.includes(message.role);\n}\n\nexport const DEFAULT_GROUP_WINDOW_MS = 5 * 60 * 1000;\n\n/** Does `curr` continue `prev`'s group? Same role, same author, same visibility, within the window. */\nexport function continuesGroup(\n prev: ChatMessageData | undefined,\n curr: ChatMessageData,\n windowMs: number,\n): boolean {\n if (!prev) return false;\n if (prev.role !== curr.role) return false;\n if ((prev.author?.name ?? \"\") !== (curr.author?.name ?? \"\")) return false;\n if ((prev.visibility ?? \"public\") !== (curr.visibility ?? \"public\")) return false;\n if (prev.proposal || curr.proposal) return false;\n if (curr.role === \"system\") return false;\n const a = toDate(prev.createdAt);\n const b = toDate(curr.createdAt);\n if (!a || !b) return false;\n const gap = b.getTime() - a.getTime();\n return gap >= 0 && gap <= windowMs;\n}\n\nexport function formatBytes(n: number): string {\n if (n < 1024) return `${n} B`;\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KB`;\n return `${(n / (1024 * 1024)).toFixed(1)} MB`;\n}\n","import { useCallback, useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { sanitizeComponentHref } from \"../../utils/sanitize\";\nimport { Avatar } from \"../Avatar\";\nimport { Badge } from \"../Badge\";\nimport { Button } from \"../Button\";\nimport { ContentRenderer } from \"../ContentRenderer\";\nimport type {\n ChatAction,\n ChatAttachment,\n ChatMessageData,\n ChatMessageProps,\n ChatThreadActionContext,\n ChatThreadLabels,\n} from \"./ChatThread.types\";\nimport {\n defaultFormatTime,\n formatBytes,\n initials,\n isOwn,\n mergeLabels,\n roleLabel,\n toDate,\n} from \"./chat-utils\";\n\nconst BORDER =\n \"border-[color:var(--fancy-border,var(--color-zinc-200))] dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))]\";\nconst SURFACE =\n \"bg-[color:var(--fancy-surface,var(--color-white))] dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\";\nconst SURFACE_MUTED =\n \"bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] dark:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]\";\nconst TEXT =\n \"text-[color:var(--fancy-text,var(--color-zinc-900))] dark:text-[color:var(--fancy-text-dark,var(--color-zinc-100))]\";\nconst TEXT_MUTED =\n \"text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))]\";\n\n/**\n * Run a host callback that may return a Promise. While it is pending the\n * control is busy and a second run is refused. A rejection goes to\n * `onActionError`, or is left unhandled so it still reaches the console.\n *\n * @internal shared by ChatMessage (proposal decisions) and ChatThread (load earlier)\n */\nexport function useAcknowledgedAction(\n onActionError?: (error: unknown, action: ChatThreadActionContext) => void,\n): [busy: boolean, run: (fn: () => ReturnType<ChatAction>, ctx: ChatThreadActionContext) => void] {\n const [busy, setBusy] = useState(false);\n const busyRef = useRef(false);\n const mounted = useRef(true);\n const onErrorRef = useRef(onActionError);\n onErrorRef.current = onActionError;\n\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n\n const run = useCallback((fn: () => ReturnType<ChatAction>, ctx: ChatThreadActionContext) => {\n if (busyRef.current) return;\n const result = fn();\n if (!result || typeof (result as Promise<unknown>).then !== \"function\") return;\n\n busyRef.current = true;\n setBusy(true);\n const settle = () => {\n busyRef.current = false;\n if (mounted.current) setBusy(false);\n };\n void Promise.resolve(result).then(settle, (error: unknown) => {\n settle();\n const onError = onErrorRef.current;\n if (onError) onError(error, ctx);\n else throw error;\n });\n }, []);\n\n return [busy, run];\n}\n\nfunction AttachmentItem({\n attachment,\n message,\n renderAttachment,\n}: {\n attachment: ChatAttachment;\n message: ChatMessageData;\n renderAttachment?: ChatMessageProps[\"renderAttachment\"];\n}) {\n let body: ReactNode;\n if (renderAttachment) {\n body = renderAttachment(attachment, message);\n } else {\n const href = sanitizeComponentHref(\"ChatMessage\", attachment.url);\n const size = typeof attachment.size === \"number\" ? (\n <span className={cn(\"ms-1\", TEXT_MUTED)}>({formatBytes(attachment.size)})</span>\n ) : null;\n body = href ? (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\" className=\"underline underline-offset-2 break-all\">\n {attachment.name}\n {size}\n </a>\n ) : (\n <span className=\"break-all\">\n {attachment.name}\n {size}\n </span>\n );\n }\n\n return (\n <li data-chat-attachment={attachment.id} className=\"text-sm\">\n {body}\n </li>\n );\n}\n\nfunction ProposalFooter({\n message,\n labels,\n busy,\n onAccept,\n onReject,\n}: {\n message: ChatMessageData;\n labels: ChatThreadLabels;\n busy: boolean;\n onAccept?: () => void;\n onReject?: () => void;\n}) {\n const proposal = message.proposal!;\n const state = proposal.state ?? \"pending\";\n\n if (state !== \"pending\") {\n const text = state === \"accepted\" ? labels.accepted : state === \"rejected\" ? labels.rejected : labels.withdrawn;\n const color = state === \"accepted\" ? \"emerald\" : state === \"rejected\" ? \"red\" : \"zinc\";\n return (\n <div className=\"mt-2\">\n <Badge color={color} variant=\"soft\" size=\"sm\" data-chat-proposal-status={state}>\n {text}\n </Badge>\n </div>\n );\n }\n\n if (!onAccept && !onReject) return null;\n\n return (\n <div className=\"mt-3 flex flex-wrap items-center gap-2\">\n {onAccept && (\n <Button\n type=\"button\"\n size=\"sm\"\n color=\"emerald\"\n disabled={busy}\n aria-busy={busy || undefined}\n data-chat-proposal-action=\"accept\"\n onClick={onAccept}\n >\n {proposal.acceptLabel ?? labels.accept}\n </Button>\n )}\n {onReject && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n disabled={busy}\n aria-busy={busy || undefined}\n data-chat-proposal-action=\"reject\"\n onClick={onReject}\n >\n {proposal.rejectLabel ?? labels.reject}\n </Button>\n )}\n </div>\n );\n}\n\n/**\n * ChatMessage — one message of a `ChatThread`, usable on its own.\n *\n * Content is markdown through `ContentRenderer`, always sanitised (there is no\n * `unsafe` here on purpose: message bodies are text the host did not author).\n * `format: \"text\"` renders it literally. A message with a `proposal` is an\n * approval card: the host owns its state and decides it through\n * `onProposalAccept` / `onProposalReject`; the card never acts on its own.\n */\nexport function ChatMessage({\n message,\n actions,\n grouped = false,\n className,\n ownRoles = [\"user\"],\n streaming = true,\n contentOptions,\n labels: labelsProp,\n formatTime = defaultFormatTime,\n renderAttachment,\n onProposalAccept,\n onProposalReject,\n onActivity,\n onActionError,\n classNames,\n}: ChatMessageProps) {\n const labels = mergeLabels(labelsProp);\n const [busy, run] = useAcknowledgedAction(onActionError);\n\n const status = message.status ?? \"sent\";\n const visibility = message.visibility ?? \"public\";\n const internal = visibility === \"internal\";\n const own = isOwn(message, ownRoles);\n const system = message.role === \"system\";\n const proposal = message.proposal;\n const date = toDate(message.createdAt);\n // Always a name: the author's, else the role's (\"Assistant\", or the host's own role capitalised).\n const name = message.author?.name || roleLabel(message.role, labels);\n\n const decide = (kind: \"accept\" | \"reject\") => {\n if (!proposal) return;\n const cb = kind === \"accept\" ? onProposalAccept : onProposalReject;\n if (!cb) return;\n const ctx: ChatThreadActionContext = {\n type: kind === \"accept\" ? \"proposal-accept\" : \"proposal-reject\",\n messageId: message.id,\n proposalId: proposal.id,\n };\n run(() => {\n onActivity?.(ctx);\n return cb(message);\n }, ctx);\n };\n\n const body =\n message.format === \"text\" ? (\n <div data-chat-content=\"\" className=\"whitespace-pre-wrap break-words\">\n {message.content}\n </div>\n ) : (\n <div data-chat-content=\"\" className=\"min-w-0 break-words\">\n <ContentRenderer\n {...contentOptions}\n value={message.content}\n format=\"markdown\"\n streaming={status === \"streaming\" ? streaming : false}\n />\n </div>\n );\n\n const attachments =\n message.attachments && message.attachments.length > 0 ? (\n <ul data-chat-attachments=\"\" aria-label={labels.attachments} className=\"mt-2 flex flex-col gap-1\">\n {message.attachments.map((a) => (\n <AttachmentItem key={a.id} attachment={a} message={message} renderAttachment={renderAttachment} />\n ))}\n </ul>\n ) : null;\n\n const statusText =\n status === \"pending\" ? (\n <div data-chat-status-text=\"pending\" className={cn(\"mt-1 text-xs\", TEXT_MUTED)}>\n {labels.pending}\n </div>\n ) : status === \"failed\" ? (\n <div data-chat-status-text=\"failed\" className=\"mt-1 text-xs text-red-600 dark:text-red-400\">\n {labels.failed}\n </div>\n ) : null;\n\n const actionsSlot =\n actions !== undefined && actions !== null && actions !== false ? (\n <div data-chat-message-actions=\"\" className={cn(\"mt-1 flex flex-wrap items-center gap-1\", classNames?.actions)}>\n {actions}\n </div>\n ) : null;\n\n const rootAttrs = {\n \"data-chat-message\": message.id,\n \"data-chat-role\": message.role,\n \"data-chat-status\": status,\n \"data-chat-visibility\": visibility,\n \"data-chat-own\": own ? \"\" : undefined,\n \"data-chat-grouped\": grouped ? \"\" : undefined,\n \"aria-busy\": status === \"streaming\" ? true : undefined,\n };\n\n if (system && !proposal) {\n return (\n <article\n {...rootAttrs}\n className={cn(\"flex flex-col items-center px-4 py-1 text-center text-xs\", TEXT_MUTED, className, classNames?.message)}\n >\n {internal && (\n <Badge color=\"amber\" variant=\"soft\" size=\"sm\" data-chat-internal-label=\"\">\n {labels.internal}\n </Badge>\n )}\n <div className={cn(\"max-w-prose\", classNames?.bubble)}>{body}</div>\n {attachments}\n {actionsSlot}\n </article>\n );\n }\n\n const bubbleClass = cn(\n \"rounded-2xl px-3.5 py-2.5 text-sm\",\n TEXT,\n internal\n ? \"border border-dashed border-amber-400 bg-amber-50 dark:border-amber-500/60 dark:bg-amber-950/30\"\n : proposal\n ? cn(\"border-2 border-violet-300 dark:border-violet-500/60\", SURFACE)\n : own\n ? cn(\"border\", BORDER, SURFACE)\n : SURFACE_MUTED,\n status === \"failed\" && \"ring-1 ring-red-400/70\",\n classNames?.bubble,\n proposal && classNames?.proposal,\n );\n\n const bubbleInner = (\n <>\n {internal && (\n <div className=\"mb-1.5\">\n <Badge color=\"amber\" variant=\"soft\" size=\"sm\" data-chat-internal-label=\"\">\n {labels.internal}\n </Badge>\n </div>\n )}\n {proposal && (\n <div data-chat-proposal-header=\"\" className=\"mb-1.5 flex flex-wrap items-center gap-2\">\n <Badge color=\"violet\" variant=\"soft\" size=\"sm\">\n {labels.proposal}\n </Badge>\n {proposal.title && <span className=\"font-medium\">{proposal.title}</span>}\n </div>\n )}\n {body}\n {attachments}\n {proposal && (\n <ProposalFooter\n message={message}\n labels={labels}\n busy={busy}\n onAccept={onProposalAccept ? () => decide(\"accept\") : undefined}\n onReject={onProposalReject ? () => decide(\"reject\") : undefined}\n />\n )}\n </>\n );\n\n return (\n <article\n {...rootAttrs}\n className={cn(\n \"flex gap-2.5 px-3\",\n grouped ? \"pt-0.5\" : \"pt-3\",\n own && \"flex-row-reverse\",\n className,\n classNames?.message,\n )}\n >\n <div className=\"w-8 shrink-0\" aria-hidden={grouped || undefined}>\n {!grouped && (\n <Avatar size=\"sm\" src={message.author?.avatar} alt=\"\" fallback={initials(name)} />\n )}\n </div>\n <div className={cn(\"flex min-w-0 max-w-[85%] flex-col\", own ? \"items-end\" : \"items-start\")}>\n {!grouped && (\n <div\n data-chat-header=\"\"\n className={cn(\"mb-1 flex items-baseline gap-2 text-xs\", own && \"flex-row-reverse\", classNames?.header)}\n >\n <span data-chat-author=\"\" className={cn(\"font-medium\", TEXT)}>\n {name}\n </span>\n {date && (\n <time dateTime={date.toISOString()} className={TEXT_MUTED}>\n {formatTime(date)}\n </time>\n )}\n </div>\n )}\n {proposal ? (\n <div\n data-chat-proposal={proposal.id}\n data-chat-proposal-state={proposal.state ?? \"pending\"}\n aria-busy={busy || undefined}\n className={cn(\"min-w-0 max-w-full\", bubbleClass)}\n >\n {bubbleInner}\n </div>\n ) : (\n <div data-chat-bubble=\"\" className={cn(\"min-w-0 max-w-full\", bubbleClass)}>\n {bubbleInner}\n </div>\n )}\n {statusText}\n {actionsSlot}\n </div>\n </article>\n );\n}\n\nChatMessage.displayName = \"ChatMessage\";\n","import {\n Fragment,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useLayoutEffect,\n useRef,\n useState,\n type ReactNode,\n type UIEvent,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Button } from \"../Button\";\nimport { ChatMessage, useAcknowledgedAction } from \"./ChatMessage\";\nimport type { ChatMessageData, ChatThreadProps } from \"./ChatThread.types\";\nimport {\n DEFAULT_GROUP_WINDOW_MS,\n continuesGroup,\n dayKey,\n defaultFormatDay,\n isOwn,\n mergeLabels,\n toDate,\n} from \"./chat-utils\";\n\nconst TEXT_MUTED =\n \"text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))]\";\nconst BORDER =\n \"border-[color:var(--fancy-border,var(--color-zinc-200))] dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))]\";\n\n// The isomorphic layout effect: scroll work must happen before paint in the\n// browser, and must not warn during SSR.\nconst useIsoLayoutEffect = typeof window === \"undefined\" ? useEffect : useLayoutEffect;\n\ninterface Seen {\n ids: Set<string>;\n first?: string;\n last?: string;\n scrollHeight: number;\n /** The reader's position as of the last render or scroll event, before any browser adjustment. */\n scrollTop: number;\n}\n\n/**\n * ChatThread — a controlled message list for agent and support conversations.\n *\n * - **Controlled.** It renders exactly `messages`, oldest first. Loading\n * earlier history and deciding a proposal go through callbacks; nothing is\n * held internally that an agent would need to read or write.\n * - **Stick to the bottom without yanking.** New messages are followed only\n * while the reader is at the bottom. A reader who scrolled up stays put and\n * gets an \"N new messages\" jump control. Prepended history keeps the\n * reader's place. Only the log's own `scrollTop` is ever set, and focus moves\n * with `preventScroll`, so no ancestor (or the page) scrolls (the 5.69 rule).\n * - **Visibility is the host's.** `visibility: \"internal\"` is labelled and\n * styled, never filtered: pass only what the viewer may see.\n * - **Handles:** `data-react-fancy-chat-thread`, `data-chat-message=\"<id>\"`,\n * `data-chat-role`, `data-chat-status`, `data-chat-visibility`,\n * `data-chat-proposal=\"<id>\"`, `data-chat-proposal-action`.\n * - **Observable:** `onActivity` reports every interaction as one stream.\n *\n * Pair it with `Composer` or `PromptInput` in the `composer` slot (both have\n * acknowledged send). It does not ship an input of its own.\n */\nexport function ChatThread({\n ref,\n messages,\n heading,\n headingLevel = 2,\n onLoadEarlier,\n hasEarlier,\n loadingEarlier = false,\n stickToBottom = true,\n bottomThreshold = 48,\n onAtBottomChange,\n separators = \"none\",\n formatDay = defaultFormatDay,\n groupConsecutive = false,\n renderActions,\n composer,\n empty,\n classNames,\n className,\n // message display\n ownRoles = [\"user\"],\n streaming = true,\n contentOptions,\n labels: labelsProp,\n formatTime,\n renderAttachment,\n onProposalAccept,\n onProposalReject,\n onActivity,\n onActionError,\n onScroll: onScrollProp,\n ...rest\n}: ChatThreadProps) {\n const labels = mergeLabels(labelsProp);\n const headingId = useId();\n const logRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const atBottomRef = useRef(true);\n const seenRef = useRef<Seen | null>(null);\n const [atBottom, setAtBottom] = useState(true);\n const [unseen, setUnseen] = useState(0);\n const [loadBusy, runLoad] = useAcknowledgedAction(onActionError);\n\n const onAtBottomChangeRef = useRef(onAtBottomChange);\n onAtBottomChangeRef.current = onAtBottomChange;\n\n const measure = useCallback(\n (el: HTMLElement) => el.scrollHeight - el.scrollTop - el.clientHeight <= bottomThreshold,\n [bottomThreshold],\n );\n\n const commitAtBottom = useCallback((value: boolean) => {\n const changed = atBottomRef.current !== value;\n atBottomRef.current = value;\n setAtBottom(value);\n if (value) setUnseen(0);\n if (changed) onAtBottomChangeRef.current?.(value);\n }, []);\n\n const scrollLogToBottom = useCallback(() => {\n const el = logRef.current;\n if (!el) return;\n // The log's own scrollTop only. Never scrollIntoView: that scrolls every\n // scrollable ancestor too, up to the page.\n el.scrollTop = el.scrollHeight;\n }, []);\n\n // Follow, hold, or keep place, every time the messages change.\n useIsoLayoutEffect(() => {\n const el = logRef.current;\n if (!el) return;\n\n const ids = messages.map((m) => m.id);\n const first = ids[0];\n const last = ids[ids.length - 1];\n const prev = seenRef.current;\n\n if (!prev) {\n if (stickToBottom) scrollLogToBottom();\n } else {\n const prepended =\n prev.last !== undefined &&\n prev.last === last &&\n prev.first !== undefined &&\n prev.first !== first &&\n ids.includes(prev.first);\n\n if (prepended) {\n if (stickToBottom && atBottomRef.current) scrollLogToBottom();\n // From the position BEFORE the change, never the current one: the\n // browser's scroll anchoring (overflow-anchor) may already have moved\n // scrollTop by the inserted height, and adding it again overshoots.\n else el.scrollTop = prev.scrollTop + (el.scrollHeight - prev.scrollHeight);\n } else {\n const lastIndex = prev.last === undefined ? -1 : ids.indexOf(prev.last);\n const appended: ChatMessageData[] = [];\n for (let i = lastIndex + 1; i < messages.length; i++) {\n if (!prev.ids.has(messages[i].id)) appended.push(messages[i]);\n }\n\n if (stickToBottom && atBottomRef.current) {\n scrollLogToBottom();\n } else if (stickToBottom && appended.some((m) => isOwn(m, ownRoles))) {\n // The viewer's own send: show it, wherever they were reading.\n scrollLogToBottom();\n } else if (appended.length > 0) {\n setUnseen((n) => n + appended.length);\n }\n }\n }\n\n seenRef.current = { ids: new Set(ids), first, last, scrollHeight: el.scrollHeight, scrollTop: el.scrollTop };\n const nowAtBottom = measure(el);\n if (nowAtBottom !== atBottomRef.current || nowAtBottom) commitAtBottom(nowAtBottom);\n // ownRoles is compared by content inside; a new array each render must not re-run this.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [messages, stickToBottom, measure, commitAtBottom, scrollLogToBottom]);\n\n // Content that grows without a messages change (images, fonts, a\n // ContentRenderer extension resolving) keeps a reader at the bottom there.\n useEffect(() => {\n const content = contentRef.current;\n if (!content || !stickToBottom || typeof ResizeObserver === \"undefined\") return;\n const ro = new ResizeObserver(() => {\n if (atBottomRef.current) scrollLogToBottom();\n });\n ro.observe(content);\n return () => ro.disconnect();\n }, [stickToBottom, scrollLogToBottom]);\n\n const onScroll = useCallback(\n (e: UIEvent<HTMLDivElement>) => {\n onScrollProp?.(e);\n if (seenRef.current) seenRef.current.scrollTop = e.currentTarget.scrollTop;\n const now = measure(e.currentTarget);\n if (now !== atBottomRef.current || now) commitAtBottom(now);\n },\n [measure, commitAtBottom, onScrollProp],\n );\n\n const jumpToLatest = useCallback(() => {\n onActivity?.({ type: \"jump-to-latest\", unseen });\n scrollLogToBottom();\n commitAtBottom(true);\n // The jump control is about to unmount; keep focus in the conversation\n // without scrolling anything (genie#1290).\n logRef.current?.focus({ preventScroll: true });\n }, [onActivity, unseen, scrollLogToBottom, commitAtBottom]);\n\n useImperativeHandle(\n ref,\n () => ({\n scrollToLatest() {\n scrollLogToBottom();\n const el = logRef.current;\n if (el) commitAtBottom(measure(el));\n },\n scrollToMessage(id: string) {\n const el = logRef.current;\n if (!el) return false;\n const target = [...el.querySelectorAll<HTMLElement>(\"[data-chat-message]\")].find(\n (n) => n.getAttribute(\"data-chat-message\") === id,\n );\n if (!target) return false;\n el.scrollTop = target.offsetTop;\n commitAtBottom(measure(el));\n return true;\n },\n get element() {\n return logRef.current;\n },\n }),\n [scrollLogToBottom, commitAtBottom, measure],\n );\n\n const showLoadEarlier = Boolean(onLoadEarlier) && (hasEarlier ?? true);\n const earlierBusy = loadingEarlier || loadBusy;\n const showJump = unseen > 0 && !atBottom;\n const groupWindow =\n groupConsecutive === true ? DEFAULT_GROUP_WINDOW_MS : typeof groupConsecutive === \"number\" ? groupConsecutive : 0;\n\n const items: ReactNode[] = [];\n let prevDay: string | undefined;\n messages.forEach((m, i) => {\n const date = toDate(m.createdAt);\n let separator: ReactNode = null;\n if (separators === \"day\" && date) {\n const key = dayKey(date);\n if (key !== prevDay) {\n separator = (\n <div\n data-chat-day-separator={key}\n className={cn(\"flex items-center gap-3 px-4 pt-4 text-xs\", TEXT_MUTED, classNames?.separator)}\n >\n <span aria-hidden=\"true\" className={cn(\"h-px flex-1 border-t\", BORDER)} />\n <span>{formatDay(date)}</span>\n <span aria-hidden=\"true\" className={cn(\"h-px flex-1 border-t\", BORDER)} />\n </div>\n );\n prevDay = key;\n }\n }\n const grouped = groupWindow > 0 && !separator && continuesGroup(messages[i - 1], m, groupWindow);\n\n items.push(\n <Fragment key={m.id}>\n {separator}\n <ChatMessage\n message={m}\n grouped={grouped}\n actions={renderActions?.(m)}\n ownRoles={ownRoles}\n streaming={streaming}\n contentOptions={contentOptions}\n labels={labelsProp}\n formatTime={formatTime}\n renderAttachment={renderAttachment}\n onProposalAccept={onProposalAccept}\n onProposalReject={onProposalReject}\n onActivity={onActivity}\n onActionError={onActionError}\n classNames={classNames}\n />\n </Fragment>,\n );\n });\n\n const H = `h${headingLevel}` as \"h2\";\n\n return (\n <div\n data-react-fancy-chat-thread=\"\"\n {...rest}\n className={cn(\"flex min-h-0 flex-col\", className, classNames?.root)}\n >\n {heading !== undefined && heading !== null && (\n <H\n id={headingId}\n data-react-fancy-chat-thread-heading=\"\"\n className={cn(\"shrink-0 px-4 py-3 text-sm font-semibold\", classNames?.heading)}\n >\n {heading}\n </H>\n )}\n <div className=\"relative flex min-h-0 flex-1 flex-col\">\n <div\n ref={logRef}\n data-react-fancy-chat-thread-log=\"\"\n role=\"log\"\n aria-live=\"polite\"\n aria-relevant=\"additions\"\n aria-label={heading ? undefined : labels.log}\n aria-labelledby={heading ? headingId : undefined}\n tabIndex={0}\n onScroll={onScroll}\n className={cn(\n \"relative min-h-0 flex-1 overflow-y-auto overscroll-contain focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-[color:var(--fancy-focus,var(--color-blue-500))]\",\n classNames?.log,\n )}\n >\n <div ref={contentRef} className=\"flex flex-col pb-3\">\n {showLoadEarlier && (\n <div className=\"flex justify-center pt-3\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n data-react-fancy-chat-thread-load-earlier=\"\"\n disabled={earlierBusy}\n aria-busy={earlierBusy || undefined}\n onClick={() =>\n runLoad(() => {\n onActivity?.({ type: \"load-earlier\" });\n return onLoadEarlier!();\n }, { type: \"load-earlier\" })\n }\n >\n {earlierBusy ? labels.loadingEarlier : labels.loadEarlier}\n </Button>\n </div>\n )}\n {messages.length === 0 && empty !== undefined && (\n <div data-react-fancy-chat-thread-empty=\"\" className={cn(\"px-4 py-8 text-center text-sm\", TEXT_MUTED)}>\n {empty}\n </div>\n )}\n {items}\n </div>\n </div>\n {showJump && (\n <div className=\"pointer-events-none absolute inset-x-0 bottom-3 flex justify-center\">\n <Button\n type=\"button\"\n size=\"sm\"\n data-react-fancy-chat-thread-jump=\"\"\n data-unseen={unseen}\n iconTrailing=\"chevron-down\"\n className={cn(\"pointer-events-auto shadow-md\", classNames?.jump)}\n onClick={jumpToLatest}\n >\n {labels.newMessages(unseen)}\n </Button>\n </div>\n )}\n </div>\n {composer !== undefined && composer !== null && (\n <div data-react-fancy-chat-thread-composer=\"\" className={cn(\"shrink-0\", classNames?.composer)}>\n {composer}\n </div>\n )}\n </div>\n );\n}\n\nChatThread.displayName = \"ChatThread\";\n"]}
@@ -38,7 +38,7 @@ function ChatDrawer({
38
38
  {
39
39
  className: [
40
40
  "inline-flex h-4 w-4 items-center justify-center rounded-full text-[10px] font-semibold",
41
- active ? "bg-white/20 text-white" : "bg-[color:var(--fancy-border,var(--color-zinc-200))] text-zinc-600 group-hover:bg-zinc-300 dark:bg-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:text-zinc-300"
41
+ active ? "bg-white/20 text-white" : "bg-[color:var(--fancy-border,var(--color-zinc-200))] group-hover:bg-zinc-300 dark:bg-[color:var(--fancy-border-dark,var(--color-zinc-700))] text-[color:var(--fancy-text-soft,var(--color-zinc-700))] dark:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))]"
42
42
  ].join(" "),
43
43
  children: number
44
44
  }
@@ -56,7 +56,7 @@ function ChatDrawer({
56
56
  onClick: handleToggle,
57
57
  "aria-label": open ? "Collapse drawer" : "Expand drawer",
58
58
  "aria-expanded": open,
59
- className: "ms-auto inline-flex h-6 w-6 items-center justify-center rounded-full text-zinc-400 transition hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] hover:text-zinc-700 dark:hover:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))] dark:hover:text-zinc-200",
59
+ className: "ms-auto inline-flex h-6 w-6 items-center justify-center rounded-full text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))] transition hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] hover:text-[color:var(--fancy-text-soft,var(--color-zinc-700))] dark:hover:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))] dark:hover:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]",
60
60
  children: /* @__PURE__ */ jsxRuntime.jsx(
61
61
  chunkMXWR3T3N_cjs.Icon,
62
62
  {
@@ -79,5 +79,5 @@ function ChatDrawer({
79
79
  }
80
80
 
81
81
  exports.ChatDrawer = ChatDrawer;
82
- //# sourceMappingURL=chunk-NWP5EGSR.cjs.map
83
- //# sourceMappingURL=chunk-NWP5EGSR.cjs.map
82
+ //# sourceMappingURL=chunk-2U2VQ2QF.cjs.map
83
+ //# sourceMappingURL=chunk-2U2VQ2QF.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/ChatDrawer/ChatDrawer.tsx"],"names":["useCallback","jsxs","jsx","Icon"],"mappings":";;;;;;AA+DO,SAAS,UAAA,CAAW;AAAA,EACzB,IAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,QAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA,GAAgB,GAAA;AAAA,EAChB;AACF,CAAA,EAAoB;AAClB,EAAA,MAAM,YAAA,GAAeA,kBAAY,MAAM;AACrC,IAAA,QAAA,GAAW,CAAC,IAAI,CAAA;AAAA,EAClB,CAAA,EAAG,CAAC,QAAA,EAAU,IAAI,CAAC,CAAA;AAEnB,EAAA,uBACEC,eAAA,CAAC,SAAI,SAAA,EACH,QAAA,EAAA;AAAA,oBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uCAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,cAAA,CAAC,SAAI,SAAA,EAAU,qCAAA,EACZ,eAAK,GAAA,CAAI,CAAC,KAAK,CAAA,KAAM;AACpB,QAAA,MAAM,MAAA,GAAS,IAAI,EAAA,KAAO,WAAA;AAC1B,QAAA,MAAM,SAAS,GAAA,CAAI,MAAA,KAAW,OAAO,IAAA,GAAO,GAAA,CAAI,UAAU,CAAA,GAAI,CAAA;AAC9D,QAAA,uBACED,eAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA;AAAA,YACjC,SAAA,EAAW;AAAA,cACT,2GAAA;AAAA,cACA,SACI,4CAAA,GACA;AAAA,aACN,CAAE,KAAK,GAAG,CAAA;AAAA,YACV,cAAA,EAAc,MAAA;AAAA,YAEb,QAAA,EAAA;AAAA,cAAA,MAAA,KAAW,IAAA,oBACVC,cAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAW;AAAA,oBACT,wFAAA;AAAA,oBACA,SACI,wBAAA,GACA;AAAA,mBACN,CAAE,KAAK,GAAG,CAAA;AAAA,kBAET,QAAA,EAAA;AAAA;AAAA,eACH;AAAA,8BAEFA,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAA0B,cAAI,KAAA,EAAM;AAAA;AAAA,WAAA;AAAA,UAvB/C,GAAA,CAAI;AAAA,SAwBX;AAAA,MAEJ,CAAC,CAAA,EACH,CAAA;AAAA,sBACAA,cAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,YAAA;AAAA,UACT,YAAA,EAAY,OAAO,iBAAA,GAAoB,eAAA;AAAA,UACvC,eAAA,EAAe,IAAA;AAAA,UACf,SAAA,EAAU,0RAAA;AAAA,UAEV,QAAA,kBAAAA,cAAA;AAAA,YAACC,sBAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAM,OAAO,cAAA,GAAiB,YAAA;AAAA,cAC9B,SAAA,EAAU;AAAA;AAAA;AACZ;AAAA;AACF,KAAA,EACF,CAAA;AAAA,IAEC,IAAA,oBACCD,cAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,eAAA;AAAA,QACV,KAAA,EAAO,EAAE,SAAA,EAAW,aAAA,EAAc;AAAA,QAEjC;AAAA;AAAA;AACH,GAAA,EAEJ,CAAA;AAEJ","file":"chunk-NWP5EGSR.cjs","sourcesContent":["import { type ReactNode, useCallback } from \"react\";\nimport { Icon } from \"../Icon\";\n\n/**\n * ChatDrawer — tabbed, collapsible panel that sits *above* a `PromptInput`\n * (via the input's `aboveInput` slot) so the drawer and composer share one\n * rounded shell. Each tab gets a numbered chip and a content panel; only\n * one panel renders at a time.\n *\n * <PromptInput\n * aboveInput={\n * <ChatDrawer\n * tabs={[\n * { id: \"files\", label: \"Files\" },\n * { id: \"tools\", label: \"Chat Tools\" },\n * { id: \"prompts\", label: \"Chat Prompts\" },\n * { id: \"deal\", label: \"IBM Analytics Platform\" },\n * ]}\n * activeTabId={tab}\n * onTabChange={setTab}\n * open={open}\n * onToggle={setOpen}\n * >\n * {tab === \"tools\" && <ToolsGrid />}\n * {tab === \"deal\" && <DealCard />}\n * </ChatDrawer>\n * }\n * budgetTokens={200_000}\n * onSubmit={(text) => send(text)}\n * />\n *\n * The drawer is purely presentational and slot-driven — you decide what\n * each tab shows. Tab order in the numbered chips is the order you pass.\n */\n\nexport type ChatDrawerTab = {\n /** Stable id — used as the React key and as `activeTabId`. */\n id: string;\n /** Human label rendered on the chip. */\n label: string;\n /**\n * Optional override for the numbered prefix (defaults to position +1).\n * Set to `null` to hide the number entirely (e.g. for a context-specific\n * tab like the deal one in the screenshots).\n */\n number?: number | null;\n};\n\nexport interface ChatDrawerProps {\n tabs: ChatDrawerTab[];\n activeTabId: string;\n onTabChange: (id: string) => void;\n /** Body open/closed. Default true. */\n open?: boolean;\n /** Called when the chevron is clicked. */\n onToggle?: (open: boolean) => void;\n /** Body content for the active tab. */\n children?: ReactNode;\n /** Min height of the body when open, in px. Default 140. */\n minBodyHeight?: number;\n className?: string;\n}\n\nexport function ChatDrawer({\n tabs,\n activeTabId,\n onTabChange,\n open = true,\n onToggle,\n children,\n minBodyHeight = 140,\n className,\n}: ChatDrawerProps) {\n const handleToggle = useCallback(() => {\n onToggle?.(!open);\n }, [onToggle, open]);\n\n return (\n <div className={className}>\n <div className=\"flex items-center gap-1.5 px-2.5 py-2\">\n <div className=\"flex flex-wrap items-center gap-1.5\">\n {tabs.map((tab, i) => {\n const active = tab.id === activeTabId;\n const number = tab.number === null ? null : tab.number ?? i + 1;\n return (\n <button\n key={tab.id}\n type=\"button\"\n onClick={() => onTabChange(tab.id)}\n className={[\n \"group inline-flex items-center gap-1.5 rounded-full border px-2.5 py-1 text-[12px] font-medium transition\",\n active\n ? \"border-violet-500 bg-violet-500 text-white\"\n : \"border-[color:var(--fancy-border,var(--color-zinc-200))] bg-transparent text-[color:var(--fancy-text-soft,var(--color-zinc-700))] hover:border-zinc-300 hover:bg-zinc-50 dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))] dark:hover:border-zinc-600 dark:hover:bg-zinc-800\",\n ].join(\" \")}\n aria-pressed={active}\n >\n {number !== null && (\n <span\n className={[\n \"inline-flex h-4 w-4 items-center justify-center rounded-full text-[10px] font-semibold\",\n active\n ? \"bg-white/20 text-white\"\n : \"bg-[color:var(--fancy-border,var(--color-zinc-200))] text-zinc-600 group-hover:bg-zinc-300 dark:bg-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:text-zinc-300\",\n ].join(\" \")}\n >\n {number}\n </span>\n )}\n <span className=\"truncate max-w-[180px]\">{tab.label}</span>\n </button>\n );\n })}\n </div>\n <button\n type=\"button\"\n onClick={handleToggle}\n aria-label={open ? \"Collapse drawer\" : \"Expand drawer\"}\n aria-expanded={open}\n className=\"ms-auto inline-flex h-6 w-6 items-center justify-center rounded-full text-zinc-400 transition hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] hover:text-zinc-700 dark:hover:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))] dark:hover:text-zinc-200\"\n >\n <Icon\n name={open ? \"chevron-down\" : \"chevron-up\"}\n className=\"h-3.5 w-3.5\"\n />\n </button>\n </div>\n\n {open && (\n <div\n className=\"px-2.5 pb-2.5\"\n style={{ minHeight: minBodyHeight }}\n >\n {children}\n </div>\n )}\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/ChatDrawer/ChatDrawer.tsx"],"names":["useCallback","jsxs","jsx","Icon"],"mappings":";;;;;;AA+DO,SAAS,UAAA,CAAW;AAAA,EACzB,IAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,QAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA,GAAgB,GAAA;AAAA,EAChB;AACF,CAAA,EAAoB;AAClB,EAAA,MAAM,YAAA,GAAeA,kBAAY,MAAM;AACrC,IAAA,QAAA,GAAW,CAAC,IAAI,CAAA;AAAA,EAClB,CAAA,EAAG,CAAC,QAAA,EAAU,IAAI,CAAC,CAAA;AAEnB,EAAA,uBACEC,eAAA,CAAC,SAAI,SAAA,EACH,QAAA,EAAA;AAAA,oBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uCAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,cAAA,CAAC,SAAI,SAAA,EAAU,qCAAA,EACZ,eAAK,GAAA,CAAI,CAAC,KAAK,CAAA,KAAM;AACpB,QAAA,MAAM,MAAA,GAAS,IAAI,EAAA,KAAO,WAAA;AAC1B,QAAA,MAAM,SAAS,GAAA,CAAI,MAAA,KAAW,OAAO,IAAA,GAAO,GAAA,CAAI,UAAU,CAAA,GAAI,CAAA;AAC9D,QAAA,uBACED,eAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA;AAAA,YACjC,SAAA,EAAW;AAAA,cACT,2GAAA;AAAA,cACA,SACI,4CAAA,GACA;AAAA,aACN,CAAE,KAAK,GAAG,CAAA;AAAA,YACV,cAAA,EAAc,MAAA;AAAA,YAEb,QAAA,EAAA;AAAA,cAAA,MAAA,KAAW,IAAA,oBACVC,cAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAW;AAAA,oBACT,wFAAA;AAAA,oBACA,SACI,wBAAA,GACA;AAAA,mBACN,CAAE,KAAK,GAAG,CAAA;AAAA,kBAET,QAAA,EAAA;AAAA;AAAA,eACH;AAAA,8BAEFA,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAA0B,cAAI,KAAA,EAAM;AAAA;AAAA,WAAA;AAAA,UAvB/C,GAAA,CAAI;AAAA,SAwBX;AAAA,MAEJ,CAAC,CAAA,EACH,CAAA;AAAA,sBACAA,cAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,YAAA;AAAA,UACT,YAAA,EAAY,OAAO,iBAAA,GAAoB,eAAA;AAAA,UACvC,eAAA,EAAe,IAAA;AAAA,UACf,SAAA,EAAU,yeAAA;AAAA,UAEV,QAAA,kBAAAA,cAAA;AAAA,YAACC,sBAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAM,OAAO,cAAA,GAAiB,YAAA;AAAA,cAC9B,SAAA,EAAU;AAAA;AAAA;AACZ;AAAA;AACF,KAAA,EACF,CAAA;AAAA,IAEC,IAAA,oBACCD,cAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,eAAA;AAAA,QACV,KAAA,EAAO,EAAE,SAAA,EAAW,aAAA,EAAc;AAAA,QAEjC;AAAA;AAAA;AACH,GAAA,EAEJ,CAAA;AAEJ","file":"chunk-2U2VQ2QF.cjs","sourcesContent":["import { type ReactNode, useCallback } from \"react\";\nimport { Icon } from \"../Icon\";\n\n/**\n * ChatDrawer — tabbed, collapsible panel that sits *above* a `PromptInput`\n * (via the input's `aboveInput` slot) so the drawer and composer share one\n * rounded shell. Each tab gets a numbered chip and a content panel; only\n * one panel renders at a time.\n *\n * <PromptInput\n * aboveInput={\n * <ChatDrawer\n * tabs={[\n * { id: \"files\", label: \"Files\" },\n * { id: \"tools\", label: \"Chat Tools\" },\n * { id: \"prompts\", label: \"Chat Prompts\" },\n * { id: \"deal\", label: \"IBM Analytics Platform\" },\n * ]}\n * activeTabId={tab}\n * onTabChange={setTab}\n * open={open}\n * onToggle={setOpen}\n * >\n * {tab === \"tools\" && <ToolsGrid />}\n * {tab === \"deal\" && <DealCard />}\n * </ChatDrawer>\n * }\n * budgetTokens={200_000}\n * onSubmit={(text) => send(text)}\n * />\n *\n * The drawer is purely presentational and slot-driven — you decide what\n * each tab shows. Tab order in the numbered chips is the order you pass.\n */\n\nexport type ChatDrawerTab = {\n /** Stable id — used as the React key and as `activeTabId`. */\n id: string;\n /** Human label rendered on the chip. */\n label: string;\n /**\n * Optional override for the numbered prefix (defaults to position +1).\n * Set to `null` to hide the number entirely (e.g. for a context-specific\n * tab like the deal one in the screenshots).\n */\n number?: number | null;\n};\n\nexport interface ChatDrawerProps {\n tabs: ChatDrawerTab[];\n activeTabId: string;\n onTabChange: (id: string) => void;\n /** Body open/closed. Default true. */\n open?: boolean;\n /** Called when the chevron is clicked. */\n onToggle?: (open: boolean) => void;\n /** Body content for the active tab. */\n children?: ReactNode;\n /** Min height of the body when open, in px. Default 140. */\n minBodyHeight?: number;\n className?: string;\n}\n\nexport function ChatDrawer({\n tabs,\n activeTabId,\n onTabChange,\n open = true,\n onToggle,\n children,\n minBodyHeight = 140,\n className,\n}: ChatDrawerProps) {\n const handleToggle = useCallback(() => {\n onToggle?.(!open);\n }, [onToggle, open]);\n\n return (\n <div className={className}>\n <div className=\"flex items-center gap-1.5 px-2.5 py-2\">\n <div className=\"flex flex-wrap items-center gap-1.5\">\n {tabs.map((tab, i) => {\n const active = tab.id === activeTabId;\n const number = tab.number === null ? null : tab.number ?? i + 1;\n return (\n <button\n key={tab.id}\n type=\"button\"\n onClick={() => onTabChange(tab.id)}\n className={[\n \"group inline-flex items-center gap-1.5 rounded-full border px-2.5 py-1 text-[12px] font-medium transition\",\n active\n ? \"border-violet-500 bg-violet-500 text-white\"\n : \"border-[color:var(--fancy-border,var(--color-zinc-200))] bg-transparent text-[color:var(--fancy-text-soft,var(--color-zinc-700))] hover:border-zinc-300 hover:bg-zinc-50 dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))] dark:hover:border-zinc-600 dark:hover:bg-zinc-800\",\n ].join(\" \")}\n aria-pressed={active}\n >\n {number !== null && (\n <span\n className={[\n \"inline-flex h-4 w-4 items-center justify-center rounded-full text-[10px] font-semibold\",\n active\n ? \"bg-white/20 text-white\"\n : \"bg-[color:var(--fancy-border,var(--color-zinc-200))] group-hover:bg-zinc-300 dark:bg-[color:var(--fancy-border-dark,var(--color-zinc-700))] text-[color:var(--fancy-text-soft,var(--color-zinc-700))] dark:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))]\",\n ].join(\" \")}\n >\n {number}\n </span>\n )}\n <span className=\"truncate max-w-[180px]\">{tab.label}</span>\n </button>\n );\n })}\n </div>\n <button\n type=\"button\"\n onClick={handleToggle}\n aria-label={open ? \"Collapse drawer\" : \"Expand drawer\"}\n aria-expanded={open}\n className=\"ms-auto inline-flex h-6 w-6 items-center justify-center rounded-full text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))] transition hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] hover:text-[color:var(--fancy-text-soft,var(--color-zinc-700))] dark:hover:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))] dark:hover:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]\"\n >\n <Icon\n name={open ? \"chevron-down\" : \"chevron-up\"}\n className=\"h-3.5 w-3.5\"\n />\n </button>\n </div>\n\n {open && (\n <div\n className=\"px-2.5 pb-2.5\"\n style={{ minHeight: minBodyHeight }}\n >\n {children}\n </div>\n )}\n </div>\n );\n}\n"]}
@@ -80,7 +80,7 @@ var Avatar = forwardRef(
80
80
  "span",
81
81
  {
82
82
  className: cn(
83
- "font-medium text-zinc-600 dark:text-zinc-300 select-none",
83
+ "font-medium text-[color:var(--fancy-text-soft,var(--color-zinc-700))] dark:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))] select-none",
84
84
  fallbackTextSize[size]
85
85
  ),
86
86
  children: fallback
@@ -104,5 +104,5 @@ var Avatar = forwardRef(
104
104
  Avatar.displayName = "Avatar";
105
105
 
106
106
  export { Avatar };
107
- //# sourceMappingURL=chunk-LXEOBSEZ.js.map
108
- //# sourceMappingURL=chunk-LXEOBSEZ.js.map
107
+ //# sourceMappingURL=chunk-32542ZE6.js.map
108
+ //# sourceMappingURL=chunk-32542ZE6.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Avatar/Avatar.tsx"],"names":[],"mappings":";;;;AAIA,IAAM,UAAA,GAAa;AAAA,EACjB,EAAA,EAAI,SAAA;AAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA;AAAA,EACJ,WAAA,EAAa;AAAA;AACf,CAAA;AAKA,IAAM,oBAAA,GAAmD;AAAA,EACvD,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,WAAA;AAAA,EACJ,EAAA,EAAI,WAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,gBAAA,GAA+C;AAAA,EACnD,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,WAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,iBAAA,GAAgD;AAAA,EACpD,EAAA,EAAI,aAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,aAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,kBAAA,GAAmD;AAAA,EACvD,MAAA,EAAQ,cAAA;AAAA,EACR,OAAA,EAAS,aAAA;AAAA,EACT,IAAA,EAAM,YAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AAEO,IAAM,MAAA,GAAS,UAAA;AAAA,EACpB,CACE;AAAA,IACE,GAAA;AAAA,IACA,GAAA,GAAM,EAAA;AAAA,IACN,QAAA;AAAA,IACA,IAAA,GAAO,IAAA;AAAA,IACP,MAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,KAEF,GAAA,KACG;AACH,IAAA,MAAM,OAAA,GAAU,IAAA,KAAS,IAAA,GAAO,IAAA,GAAO,IAAA,IAAQ,IAAA;AAC/C,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,yBAAA,EAAwB,EAAA;AAAA,QACxB,SAAA,EAAW,EAAA;AAAA,UACT,+DAAA;AAAA,UACA,qBAAqB,IAAI,CAAA;AAAA,UACzB,CAAC,GAAA,IAAO,qHAAA;AAAA,UACR;AAAA,SACF;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,OAAA,oBACC,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,aAAA,EAAW,IAAA;AAAA,cACX,8BAAA,EAA8B,OAAA;AAAA,cAC9B,SAAA,EAAU,mBAAA;AAAA,cACV,KAAA,EAAO,EAAE,cAAA,EAAgB,UAAA,CAAW,OAAO,CAAA;AAAE;AAAA,WAC/C;AAAA,UAED,GAAA,mBACC,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,GAAA;AAAA,cACA,GAAA;AAAA,cACA,SAAA,EAAU;AAAA;AAAA,WACZ,mBAEA,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,0DAAA;AAAA,gBACA,iBAAiB,IAAI;AAAA,eACvB;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,UAED,MAAA,oBACC,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,oKAAA;AAAA,gBACA,kBAAkB,IAAI,CAAA;AAAA,gBACtB,mBAAmB,MAAM;AAAA;AAC3B;AAAA;AACF;AAAA;AAAA,KAEJ;AAAA,EAEJ;AACF;AAEA,MAAA,CAAO,WAAA,GAAc,QAAA","file":"chunk-LXEOBSEZ.js","sourcesContent":["import { forwardRef, type CSSProperties } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport type { AvatarProps } from \"./Avatar.types\";\n\nconst glowColors = {\n on: \"#a855f7\", // violet — neutral\n xp: \"#22c55e\", // green\n achievement: \"#f59e0b\", // amber\n} as const;\n\ntype AvatarSize = NonNullable<AvatarProps[\"size\"]>;\ntype AvatarStatus = NonNullable<AvatarProps[\"status\"]>;\n\nconst containerSizeClasses: Record<AvatarSize, string> = {\n xs: \"h-6 w-6\",\n sm: \"h-8 w-8\",\n md: \"h-10 w-10\",\n lg: \"h-12 w-12\",\n xl: \"h-16 w-16\",\n};\n\nconst fallbackTextSize: Record<AvatarSize, string> = {\n xs: \"text-xs\",\n sm: \"text-xs\",\n md: \"text-sm\",\n lg: \"text-base\",\n xl: \"text-lg\",\n};\n\nconst statusSizeClasses: Record<AvatarSize, string> = {\n xs: \"h-1.5 w-1.5\",\n sm: \"h-2 w-2\",\n md: \"h-2.5 w-2.5\",\n lg: \"h-3 w-3\",\n xl: \"h-4 w-4\",\n};\n\nconst statusColorClasses: Record<AvatarStatus, string> = {\n online: \"bg-green-500\",\n offline: \"bg-zinc-400\",\n busy: \"bg-red-500\",\n away: \"bg-amber-500\",\n};\n\nexport const Avatar = forwardRef<HTMLDivElement, AvatarProps>(\n (\n {\n src,\n alt = \"\",\n fallback,\n size = \"md\",\n status,\n glow,\n className,\n },\n ref,\n ) => {\n const glowKey = glow === true ? \"on\" : glow || null;\n return (\n <div\n ref={ref}\n data-react-fancy-avatar=\"\"\n className={cn(\n \"relative inline-flex items-center justify-center rounded-full\",\n containerSizeClasses[size],\n !src && \"bg-[color:var(--fancy-border,var(--color-zinc-200))] dark:bg-[color:var(--fancy-border-dark,var(--color-zinc-700))]\",\n className,\n )}\n >\n {glowKey && (\n <span\n aria-hidden\n data-react-fancy-avatar-glow={glowKey}\n className=\"fancy-avatar-glow\"\n style={{ \"--fancy-glow\": glowColors[glowKey] } as CSSProperties}\n />\n )}\n {src ? (\n <img\n src={src}\n alt={alt}\n className=\"h-full w-full rounded-full object-cover\"\n />\n ) : (\n <span\n className={cn(\n \"font-medium text-zinc-600 dark:text-zinc-300 select-none\",\n fallbackTextSize[size],\n )}\n >\n {fallback}\n </span>\n )}\n {status && (\n <span\n className={cn(\n \"absolute bottom-0 end-0 rounded-full ring-2 ring-[color:var(--fancy-surface,var(--color-white))] dark:ring-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\",\n statusSizeClasses[size],\n statusColorClasses[status],\n )}\n />\n )}\n </div>\n );\n },\n);\n\nAvatar.displayName = \"Avatar\";\n"]}
1
+ {"version":3,"sources":["../src/components/Avatar/Avatar.tsx"],"names":[],"mappings":";;;;AAIA,IAAM,UAAA,GAAa;AAAA,EACjB,EAAA,EAAI,SAAA;AAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA;AAAA,EACJ,WAAA,EAAa;AAAA;AACf,CAAA;AAKA,IAAM,oBAAA,GAAmD;AAAA,EACvD,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,WAAA;AAAA,EACJ,EAAA,EAAI,WAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,gBAAA,GAA+C;AAAA,EACnD,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,WAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,iBAAA,GAAgD;AAAA,EACpD,EAAA,EAAI,aAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,aAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,kBAAA,GAAmD;AAAA,EACvD,MAAA,EAAQ,cAAA;AAAA,EACR,OAAA,EAAS,aAAA;AAAA,EACT,IAAA,EAAM,YAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AAEO,IAAM,MAAA,GAAS,UAAA;AAAA,EACpB,CACE;AAAA,IACE,GAAA;AAAA,IACA,GAAA,GAAM,EAAA;AAAA,IACN,QAAA;AAAA,IACA,IAAA,GAAO,IAAA;AAAA,IACP,MAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,KAEF,GAAA,KACG;AACH,IAAA,MAAM,OAAA,GAAU,IAAA,KAAS,IAAA,GAAO,IAAA,GAAO,IAAA,IAAQ,IAAA;AAC/C,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,yBAAA,EAAwB,EAAA;AAAA,QACxB,SAAA,EAAW,EAAA;AAAA,UACT,+DAAA;AAAA,UACA,qBAAqB,IAAI,CAAA;AAAA,UACzB,CAAC,GAAA,IAAO,qHAAA;AAAA,UACR;AAAA,SACF;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,OAAA,oBACC,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,aAAA,EAAW,IAAA;AAAA,cACX,8BAAA,EAA8B,OAAA;AAAA,cAC9B,SAAA,EAAU,mBAAA;AAAA,cACV,KAAA,EAAO,EAAE,cAAA,EAAgB,UAAA,CAAW,OAAO,CAAA;AAAE;AAAA,WAC/C;AAAA,UAED,GAAA,mBACC,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,GAAA;AAAA,cACA,GAAA;AAAA,cACA,SAAA,EAAU;AAAA;AAAA,WACZ,mBAEA,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,uJAAA;AAAA,gBACA,iBAAiB,IAAI;AAAA,eACvB;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,UAED,MAAA,oBACC,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,oKAAA;AAAA,gBACA,kBAAkB,IAAI,CAAA;AAAA,gBACtB,mBAAmB,MAAM;AAAA;AAC3B;AAAA;AACF;AAAA;AAAA,KAEJ;AAAA,EAEJ;AACF;AAEA,MAAA,CAAO,WAAA,GAAc,QAAA","file":"chunk-32542ZE6.js","sourcesContent":["import { forwardRef, type CSSProperties } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport type { AvatarProps } from \"./Avatar.types\";\n\nconst glowColors = {\n on: \"#a855f7\", // violet — neutral\n xp: \"#22c55e\", // green\n achievement: \"#f59e0b\", // amber\n} as const;\n\ntype AvatarSize = NonNullable<AvatarProps[\"size\"]>;\ntype AvatarStatus = NonNullable<AvatarProps[\"status\"]>;\n\nconst containerSizeClasses: Record<AvatarSize, string> = {\n xs: \"h-6 w-6\",\n sm: \"h-8 w-8\",\n md: \"h-10 w-10\",\n lg: \"h-12 w-12\",\n xl: \"h-16 w-16\",\n};\n\nconst fallbackTextSize: Record<AvatarSize, string> = {\n xs: \"text-xs\",\n sm: \"text-xs\",\n md: \"text-sm\",\n lg: \"text-base\",\n xl: \"text-lg\",\n};\n\nconst statusSizeClasses: Record<AvatarSize, string> = {\n xs: \"h-1.5 w-1.5\",\n sm: \"h-2 w-2\",\n md: \"h-2.5 w-2.5\",\n lg: \"h-3 w-3\",\n xl: \"h-4 w-4\",\n};\n\nconst statusColorClasses: Record<AvatarStatus, string> = {\n online: \"bg-green-500\",\n offline: \"bg-zinc-400\",\n busy: \"bg-red-500\",\n away: \"bg-amber-500\",\n};\n\nexport const Avatar = forwardRef<HTMLDivElement, AvatarProps>(\n (\n {\n src,\n alt = \"\",\n fallback,\n size = \"md\",\n status,\n glow,\n className,\n },\n ref,\n ) => {\n const glowKey = glow === true ? \"on\" : glow || null;\n return (\n <div\n ref={ref}\n data-react-fancy-avatar=\"\"\n className={cn(\n \"relative inline-flex items-center justify-center rounded-full\",\n containerSizeClasses[size],\n !src && \"bg-[color:var(--fancy-border,var(--color-zinc-200))] dark:bg-[color:var(--fancy-border-dark,var(--color-zinc-700))]\",\n className,\n )}\n >\n {glowKey && (\n <span\n aria-hidden\n data-react-fancy-avatar-glow={glowKey}\n className=\"fancy-avatar-glow\"\n style={{ \"--fancy-glow\": glowColors[glowKey] } as CSSProperties}\n />\n )}\n {src ? (\n <img\n src={src}\n alt={alt}\n className=\"h-full w-full rounded-full object-cover\"\n />\n ) : (\n <span\n className={cn(\n \"font-medium text-[color:var(--fancy-text-soft,var(--color-zinc-700))] dark:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))] select-none\",\n fallbackTextSize[size],\n )}\n >\n {fallback}\n </span>\n )}\n {status && (\n <span\n className={cn(\n \"absolute bottom-0 end-0 rounded-full ring-2 ring-[color:var(--fancy-surface,var(--color-white))] dark:ring-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\",\n statusSizeClasses[size],\n statusColorClasses[status],\n )}\n />\n )}\n </div>\n );\n },\n);\n\nAvatar.displayName = \"Avatar\";\n"]}
@@ -162,7 +162,7 @@ function FileBrowserPathBar({
162
162
  spellCheck: false,
163
163
  placeholder,
164
164
  "aria-label": "Path",
165
- className: "min-w-0 flex-1 rounded-md border border-zinc-300 bg-transparent px-2 py-0.5 font-mono text-xs text-[color:var(--fancy-text-soft,var(--color-zinc-700))] outline-none placeholder:text-zinc-400 focus:border-blue-400 dark:border-zinc-600 dark:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))]"
165
+ className: "min-w-0 flex-1 rounded-md border border-zinc-300 bg-transparent px-2 py-0.5 font-mono text-xs text-[color:var(--fancy-text-soft,var(--color-zinc-700))] outline-none placeholder:text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:placeholder:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))] focus:border-blue-400 dark:border-zinc-600 dark:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))]"
166
166
  }
167
167
  ) : /* @__PURE__ */ jsxRuntime.jsxs(
168
168
  "nav",
@@ -184,7 +184,7 @@ function FileBrowserPathBar({
184
184
  segments.map((segment, i) => {
185
185
  const last = i === segments.length - 1;
186
186
  return /* @__PURE__ */ jsxRuntime.jsxs(react.Fragment, { children: [
187
- i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { size: 12, "aria-hidden": "true", className: "shrink-0 text-zinc-400 rtl:-scale-x-100" }),
187
+ i > 0 && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { size: 12, "aria-hidden": "true", className: "shrink-0 text-[color:var(--fancy-text-faint,var(--color-zinc-400))] dark:text-[color:var(--fancy-text-faint-dark,var(--color-zinc-500))] rtl:-scale-x-100" }),
188
188
  last ? /* @__PURE__ */ jsxRuntime.jsx(
189
189
  "span",
190
190
  {
@@ -214,7 +214,7 @@ function FileBrowserPathBar({
214
214
  type: "button",
215
215
  "aria-label": "Edit path",
216
216
  onClick: startEdit,
217
- className: "shrink-0 rounded-md p-1 text-zinc-400 transition-colors hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] hover:text-zinc-600 dark:hover:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))] dark:hover:text-zinc-300",
217
+ className: "shrink-0 rounded-md p-1 text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))] transition-colors hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] hover:text-[color:var(--fancy-text-soft,var(--color-zinc-700))] dark:hover:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))] dark:hover:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))]",
218
218
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Pencil, { size: 13 })
219
219
  }
220
220
  )
@@ -277,7 +277,7 @@ function FileBrowserNewFolder({ className }) {
277
277
  onClick: () => setOpen(true),
278
278
  title: `New folder in ${path}`,
279
279
  className: chunkZU5Q77OT_cjs.cn(
280
- "flex shrink-0 items-center gap-1 rounded-md px-1.5 py-0.5 text-xs text-zinc-500 transition-colors",
280
+ "flex shrink-0 items-center gap-1 rounded-md px-1.5 py-0.5 text-xs text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))] transition-colors",
281
281
  "hover:bg-[color:var(--fancy-surface-muted,var(--color-zinc-100))] hover:text-[color:var(--fancy-text-soft,var(--color-zinc-700))] dark:hover:bg-[color:var(--fancy-surface-muted-dark,var(--color-zinc-800))] dark:hover:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))]",
282
282
  className
283
283
  ),
@@ -296,7 +296,7 @@ function FileBrowserNewFolder({ className }) {
296
296
  className: chunkZU5Q77OT_cjs.cn("flex shrink-0 flex-col gap-0.5", className),
297
297
  children: [
298
298
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1", children: [
299
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FolderPlus, { size: 13, "aria-hidden": "true", className: "shrink-0 text-zinc-400" }),
299
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FolderPlus, { size: 13, "aria-hidden": "true", className: "shrink-0 text-[color:var(--fancy-text-faint,var(--color-zinc-400))] dark:text-[color:var(--fancy-text-faint-dark,var(--color-zinc-500))]" }),
300
300
  /* @__PURE__ */ jsxRuntime.jsx(
301
301
  "input",
302
302
  {
@@ -325,7 +325,7 @@ function FileBrowserNewFolder({ className }) {
325
325
  },
326
326
  className: chunkZU5Q77OT_cjs.cn(
327
327
  "w-32 min-w-0 rounded-md border px-1.5 py-0.5 text-xs outline-none",
328
- "bg-transparent text-[color:var(--fancy-text-soft,var(--color-zinc-700))] placeholder:text-zinc-400 dark:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))]",
328
+ "bg-transparent text-[color:var(--fancy-text-soft,var(--color-zinc-700))] placeholder:text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:placeholder:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))] dark:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))]",
329
329
  shown ? "border-red-400 dark:border-red-500" : "border-[color:var(--fancy-border,var(--color-zinc-200))] dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))]"
330
330
  )
331
331
  }
@@ -347,7 +347,7 @@ function FileBrowserNewFolder({ className }) {
347
347
  type: "button",
348
348
  "data-react-fancy-file-browser-new-folder-cancel": "",
349
349
  onClick: close,
350
- className: "rounded-md px-1.5 py-0.5 text-xs text-zinc-500 transition-colors hover:text-[color:var(--fancy-text-soft,var(--color-zinc-700))] dark:hover:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))]",
350
+ className: "rounded-md px-1.5 py-0.5 text-xs text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))] transition-colors hover:text-[color:var(--fancy-text-soft,var(--color-zinc-700))] dark:hover:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))]",
351
351
  children: "Cancel"
352
352
  }
353
353
  )
@@ -388,7 +388,7 @@ function FileBrowserToolbar({ filterPlaceholder = "Filter", className }) {
388
388
  "data-react-fancy-file-browser-filter": "",
389
389
  className: "flex min-w-0 flex-1 items-center gap-1.5 rounded-md border border-[color:var(--fancy-border,var(--color-zinc-200))] px-2 dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))]",
390
390
  children: [
391
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Search, { size: 13, "aria-hidden": "true", className: "shrink-0 text-zinc-400" }),
391
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Search, { size: 13, "aria-hidden": "true", className: "shrink-0 text-[color:var(--fancy-text-faint,var(--color-zinc-400))] dark:text-[color:var(--fancy-text-faint-dark,var(--color-zinc-500))]" }),
392
392
  /* @__PURE__ */ jsxRuntime.jsx(
393
393
  "input",
394
394
  {
@@ -398,7 +398,7 @@ function FileBrowserToolbar({ filterPlaceholder = "Filter", className }) {
398
398
  placeholder: filterPlaceholder,
399
399
  "aria-label": "Filter by name",
400
400
  spellCheck: false,
401
- className: "min-w-0 flex-1 bg-transparent py-1 text-xs text-[color:var(--fancy-text-soft,var(--color-zinc-700))] outline-none placeholder:text-zinc-400 dark:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))]"
401
+ className: "min-w-0 flex-1 bg-transparent py-1 text-xs text-[color:var(--fancy-text-soft,var(--color-zinc-700))] outline-none placeholder:text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:placeholder:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))] dark:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))]"
402
402
  }
403
403
  ),
404
404
  filter !== "" && /* @__PURE__ */ jsxRuntime.jsx(
@@ -407,7 +407,7 @@ function FileBrowserToolbar({ filterPlaceholder = "Filter", className }) {
407
407
  type: "button",
408
408
  "aria-label": "Clear filter",
409
409
  onClick: () => setFilter(""),
410
- className: "shrink-0 text-zinc-400 transition-colors hover:text-zinc-600 dark:hover:text-zinc-300",
410
+ className: "shrink-0 text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))] transition-colors hover:text-[color:var(--fancy-text-soft,var(--color-zinc-700))] dark:hover:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))]",
411
411
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { size: 12 })
412
412
  }
413
413
  )
@@ -607,14 +607,14 @@ function FileBrowserNode({ entry, depth }) {
607
607
  ),
608
608
  style: { paddingInlineStart: paddingLeft },
609
609
  children: [
610
- expandable ? loading ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { size: 14, className: "shrink-0 animate-spin text-zinc-400", "aria-hidden": "true" }) : /* @__PURE__ */ jsxRuntime.jsx(
610
+ expandable ? loading ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { size: 14, className: "shrink-0 animate-spin text-[color:var(--fancy-text-faint,var(--color-zinc-400))] dark:text-[color:var(--fancy-text-faint-dark,var(--color-zinc-500))]", "aria-hidden": "true" }) : /* @__PURE__ */ jsxRuntime.jsx(
611
611
  "button",
612
612
  {
613
613
  type: "button",
614
614
  tabIndex: -1,
615
615
  "aria-hidden": "true",
616
616
  onClick: handleChevronClick,
617
- className: "flex shrink-0 items-center justify-center text-zinc-400 hover:text-zinc-600 dark:hover:text-zinc-300",
617
+ className: "flex shrink-0 items-center justify-center text-[color:var(--fancy-text-muted,var(--color-zinc-500))] dark:text-[color:var(--fancy-text-muted-dark,var(--color-zinc-400))] hover:text-[color:var(--fancy-text-soft,var(--color-zinc-700))] dark:hover:text-[color:var(--fancy-text-soft-dark,var(--color-zinc-300))]",
618
618
  children: /* @__PURE__ */ jsxRuntime.jsx(
619
619
  lucideReact.ChevronRight,
620
620
  {
@@ -1089,5 +1089,5 @@ exports.FileBrowser = FileBrowser;
1089
1089
  exports.FileBrowserNewFolder = FileBrowserNewFolder;
1090
1090
  exports.useFileBrowser = useFileBrowser;
1091
1091
  exports.validateFolderName = validateFolderName;
1092
- //# sourceMappingURL=chunk-XQF4HCOV.cjs.map
1093
- //# sourceMappingURL=chunk-XQF4HCOV.cjs.map
1092
+ //# sourceMappingURL=chunk-3ISEBGRC.cjs.map
1093
+ //# sourceMappingURL=chunk-3ISEBGRC.cjs.map