@orion-ds/react 4.0.0 → 4.2.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 (431) hide show
  1. package/dist/contexts/ThemeContext.d.ts.map +1 -1
  2. package/dist/index.d.ts +2 -3
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index10.cjs +1 -1
  5. package/dist/index10.mjs +1 -1
  6. package/dist/index100.cjs +1 -1
  7. package/dist/index100.mjs +20 -40
  8. package/dist/index100.mjs.map +1 -1
  9. package/dist/index101.cjs +1 -1
  10. package/dist/index101.mjs +28 -14
  11. package/dist/index101.mjs.map +1 -1
  12. package/dist/index102.cjs +1 -1
  13. package/dist/index102.mjs +44 -28
  14. package/dist/index102.mjs.map +1 -1
  15. package/dist/index103.cjs +1 -1
  16. package/dist/index103.mjs +42 -30
  17. package/dist/index103.mjs.map +1 -1
  18. package/dist/index104.cjs +1 -1
  19. package/dist/index104.mjs +56 -36
  20. package/dist/index104.mjs.map +1 -1
  21. package/dist/index105.cjs +1 -1
  22. package/dist/index105.mjs +26 -30
  23. package/dist/index105.mjs.map +1 -1
  24. package/dist/index106.cjs +1 -1
  25. package/dist/index106.mjs +64 -52
  26. package/dist/index106.mjs.map +1 -1
  27. package/dist/index107.cjs +1 -1
  28. package/dist/index107.mjs +20 -42
  29. package/dist/index107.mjs.map +1 -1
  30. package/dist/index108.cjs +1 -1
  31. package/dist/index108.mjs +45 -32
  32. package/dist/index108.mjs.map +1 -1
  33. package/dist/index109.cjs +1 -1
  34. package/dist/index109.mjs +24 -50
  35. package/dist/index109.mjs.map +1 -1
  36. package/dist/index11.cjs +1 -1
  37. package/dist/index11.mjs +1 -1
  38. package/dist/index110.cjs +1 -1
  39. package/dist/index110.mjs +40 -12
  40. package/dist/index110.mjs.map +1 -1
  41. package/dist/index111.cjs +1 -1
  42. package/dist/index111.mjs +18 -33
  43. package/dist/index111.mjs.map +1 -1
  44. package/dist/index112.cjs +1 -1
  45. package/dist/index112.mjs +55 -28
  46. package/dist/index112.mjs.map +1 -1
  47. package/dist/index113.cjs +1 -1
  48. package/dist/index113.mjs +36 -20
  49. package/dist/index113.mjs.map +1 -1
  50. package/dist/index114.cjs +1 -1
  51. package/dist/index114.mjs +62 -24
  52. package/dist/index114.mjs.map +1 -1
  53. package/dist/index115.cjs +1 -1
  54. package/dist/index115.mjs +65 -33
  55. package/dist/index115.mjs.map +1 -1
  56. package/dist/index116.cjs +1 -1
  57. package/dist/index116.mjs +234 -18
  58. package/dist/index116.mjs.map +1 -1
  59. package/dist/index117.cjs +1 -1
  60. package/dist/index117.cjs.map +1 -1
  61. package/dist/index117.mjs +34 -31
  62. package/dist/index117.mjs.map +1 -1
  63. package/dist/index118.cjs +1 -1
  64. package/dist/index118.cjs.map +1 -1
  65. package/dist/index118.mjs +44 -29
  66. package/dist/index118.mjs.map +1 -1
  67. package/dist/index119.cjs +1 -1
  68. package/dist/index119.cjs.map +1 -1
  69. package/dist/index119.mjs +170 -234
  70. package/dist/index119.mjs.map +1 -1
  71. package/dist/index12.cjs +1 -1
  72. package/dist/index12.mjs +1 -1
  73. package/dist/index120.cjs +1 -1
  74. package/dist/index120.cjs.map +1 -1
  75. package/dist/index120.mjs +184 -32
  76. package/dist/index120.mjs.map +1 -1
  77. package/dist/index121.cjs +1 -1
  78. package/dist/index121.cjs.map +1 -1
  79. package/dist/index121.mjs +24 -39
  80. package/dist/index121.mjs.map +1 -1
  81. package/dist/index122.cjs +1 -1
  82. package/dist/index122.cjs.map +1 -1
  83. package/dist/index122.mjs +78 -158
  84. package/dist/index122.mjs.map +1 -1
  85. package/dist/index123.cjs +1 -1
  86. package/dist/index123.cjs.map +1 -1
  87. package/dist/index123.mjs +47 -180
  88. package/dist/index123.mjs.map +1 -1
  89. package/dist/index124.cjs +1 -1
  90. package/dist/index124.cjs.map +1 -1
  91. package/dist/index124.mjs +64 -26
  92. package/dist/index124.mjs.map +1 -1
  93. package/dist/index125.cjs +1 -1
  94. package/dist/index125.cjs.map +1 -1
  95. package/dist/index125.mjs +115 -81
  96. package/dist/index125.mjs.map +1 -1
  97. package/dist/index126.cjs +1 -1
  98. package/dist/index126.cjs.map +1 -1
  99. package/dist/index126.mjs +108 -52
  100. package/dist/index126.mjs.map +1 -1
  101. package/dist/index127.cjs +1 -1
  102. package/dist/index127.cjs.map +1 -1
  103. package/dist/index127.mjs +105 -60
  104. package/dist/index127.mjs.map +1 -1
  105. package/dist/index128.cjs +1 -1
  106. package/dist/index128.cjs.map +1 -1
  107. package/dist/index128.mjs +112 -114
  108. package/dist/index128.mjs.map +1 -1
  109. package/dist/index129.cjs +1 -1
  110. package/dist/index129.cjs.map +1 -1
  111. package/dist/index129.mjs +212 -106
  112. package/dist/index129.mjs.map +1 -1
  113. package/dist/index13.cjs +1 -1
  114. package/dist/index13.mjs +1 -1
  115. package/dist/index130.cjs +1 -1
  116. package/dist/index130.cjs.map +1 -1
  117. package/dist/index130.mjs +44 -111
  118. package/dist/index130.mjs.map +1 -1
  119. package/dist/index131.cjs +1 -1
  120. package/dist/index131.cjs.map +1 -1
  121. package/dist/index131.mjs +40 -122
  122. package/dist/index131.mjs.map +1 -1
  123. package/dist/index132.cjs +1 -1
  124. package/dist/index132.cjs.map +1 -1
  125. package/dist/index132.mjs +106 -214
  126. package/dist/index132.mjs.map +1 -1
  127. package/dist/index133.cjs +1 -1
  128. package/dist/index133.mjs +22 -42
  129. package/dist/index133.mjs.map +1 -1
  130. package/dist/index134.cjs +1 -1
  131. package/dist/index134.mjs +30 -44
  132. package/dist/index134.mjs.map +1 -1
  133. package/dist/index135.cjs +1 -1
  134. package/dist/index135.mjs +46 -28
  135. package/dist/index135.mjs.map +1 -1
  136. package/dist/index136.cjs +1 -1
  137. package/dist/index136.mjs +12 -76
  138. package/dist/index136.mjs.map +1 -1
  139. package/dist/index137.cjs +1 -1
  140. package/dist/index137.mjs +32 -38
  141. package/dist/index137.mjs.map +1 -1
  142. package/dist/index138.cjs +1 -1
  143. package/dist/index138.mjs +27 -38
  144. package/dist/index138.mjs.map +1 -1
  145. package/dist/index139.cjs +1 -1
  146. package/dist/index139.mjs +33 -65
  147. package/dist/index139.mjs.map +1 -1
  148. package/dist/index14.cjs +1 -1
  149. package/dist/index14.mjs +1 -1
  150. package/dist/index140.cjs +1 -1
  151. package/dist/index140.mjs +57 -28
  152. package/dist/index140.mjs.map +1 -1
  153. package/dist/index141.cjs +1 -1
  154. package/dist/index141.mjs +30 -16
  155. package/dist/index141.mjs.map +1 -1
  156. package/dist/index142.cjs +1 -1
  157. package/dist/index142.mjs +32 -22
  158. package/dist/index142.mjs.map +1 -1
  159. package/dist/index143.cjs +1 -1
  160. package/dist/index143.mjs +50 -62
  161. package/dist/index143.mjs.map +1 -1
  162. package/dist/index144.cjs +1 -1
  163. package/dist/index144.mjs +16 -20
  164. package/dist/index144.mjs.map +1 -1
  165. package/dist/index145.cjs +1 -1
  166. package/dist/index145.mjs +30 -20
  167. package/dist/index145.mjs.map +1 -1
  168. package/dist/index146.cjs +1 -1
  169. package/dist/index146.mjs +46 -26
  170. package/dist/index146.mjs.map +1 -1
  171. package/dist/index147.cjs +1 -1
  172. package/dist/index147.mjs +42 -42
  173. package/dist/index148.cjs +1 -1
  174. package/dist/index148.mjs +28 -45
  175. package/dist/index148.mjs.map +1 -1
  176. package/dist/index149.cjs +1 -1
  177. package/dist/index149.mjs +28 -27
  178. package/dist/index15.cjs +1 -1
  179. package/dist/index15.mjs +1 -1
  180. package/dist/index150.cjs +1 -1
  181. package/dist/index150.mjs +30 -28
  182. package/dist/index150.mjs.map +1 -1
  183. package/dist/index151.cjs +1 -1
  184. package/dist/index151.mjs +24 -32
  185. package/dist/index151.mjs.map +1 -1
  186. package/dist/index152.cjs +1 -1
  187. package/dist/index152.mjs +21 -29
  188. package/dist/index152.mjs.map +1 -1
  189. package/dist/index153.cjs +1 -1
  190. package/dist/index153.mjs +36 -24
  191. package/dist/index153.mjs.map +1 -1
  192. package/dist/index154.cjs +1 -1
  193. package/dist/index154.mjs +38 -28
  194. package/dist/index154.mjs.map +1 -1
  195. package/dist/index155.cjs +1 -1
  196. package/dist/index155.mjs +12 -30
  197. package/dist/index155.mjs.map +1 -1
  198. package/dist/index156.cjs +1 -1
  199. package/dist/index156.mjs +28 -33
  200. package/dist/index156.mjs.map +1 -1
  201. package/dist/index157.cjs +1 -1
  202. package/dist/index157.mjs +38 -46
  203. package/dist/index157.mjs.map +1 -1
  204. package/dist/index158.cjs +1 -1
  205. package/dist/index158.mjs +33 -46
  206. package/dist/index158.mjs.map +1 -1
  207. package/dist/index159.cjs +1 -1
  208. package/dist/index159.mjs +28 -44
  209. package/dist/index159.mjs.map +1 -1
  210. package/dist/index16.cjs +1 -1
  211. package/dist/index16.mjs +1 -1
  212. package/dist/index160.cjs +1 -1
  213. package/dist/index160.mjs +13 -39
  214. package/dist/index160.mjs.map +1 -1
  215. package/dist/index161.cjs +1 -1
  216. package/dist/index161.mjs +18 -22
  217. package/dist/index161.mjs.map +1 -1
  218. package/dist/index162.cjs +1 -1
  219. package/dist/index162.mjs +28 -18
  220. package/dist/index162.mjs.map +1 -1
  221. package/dist/index163.cjs +1 -1
  222. package/dist/index163.mjs +18 -40
  223. package/dist/index163.mjs.map +1 -1
  224. package/dist/index164.cjs +1 -1
  225. package/dist/index164.mjs +65 -16
  226. package/dist/index164.mjs.map +1 -1
  227. package/dist/index165.cjs +1 -1
  228. package/dist/index165.mjs +30 -24
  229. package/dist/index165.mjs.map +1 -1
  230. package/dist/index166.cjs +1 -1
  231. package/dist/index166.mjs +44 -64
  232. package/dist/index166.mjs.map +1 -1
  233. package/dist/index167.cjs +1 -1
  234. package/dist/index167.mjs +51 -52
  235. package/dist/index167.mjs.map +1 -1
  236. package/dist/index168.cjs +1 -1
  237. package/dist/index168.cjs.map +1 -1
  238. package/dist/index168.mjs +37 -13
  239. package/dist/index168.mjs.map +1 -1
  240. package/dist/index169.cjs +1 -1
  241. package/dist/index169.mjs +28 -56
  242. package/dist/index169.mjs.map +1 -1
  243. package/dist/index17.cjs +1 -1
  244. package/dist/index17.mjs +1 -1
  245. package/dist/index170.cjs +1 -1
  246. package/dist/index170.mjs +18 -106
  247. package/dist/index170.mjs.map +1 -1
  248. package/dist/index171.cjs +1 -1
  249. package/dist/index171.mjs +33 -18
  250. package/dist/index171.mjs.map +1 -1
  251. package/dist/index172.cjs +1 -1
  252. package/dist/index172.mjs +20 -62
  253. package/dist/index172.mjs.map +1 -1
  254. package/dist/index173.cjs +1 -1
  255. package/dist/index173.mjs +24 -55
  256. package/dist/index173.mjs.map +1 -1
  257. package/dist/index174.cjs +1 -1
  258. package/dist/index174.mjs +64 -18
  259. package/dist/index174.mjs.map +1 -1
  260. package/dist/index175.cjs +1 -1
  261. package/dist/index175.mjs +76 -52
  262. package/dist/index175.mjs.map +1 -1
  263. package/dist/index176.cjs +1 -1
  264. package/dist/index176.mjs +40 -64
  265. package/dist/index176.mjs.map +1 -1
  266. package/dist/index177.cjs +1 -1
  267. package/dist/index177.cjs.map +1 -1
  268. package/dist/index177.mjs +53 -37
  269. package/dist/index177.mjs.map +1 -1
  270. package/dist/index178.cjs +1 -1
  271. package/dist/index178.mjs +53 -28
  272. package/dist/index178.mjs.map +1 -1
  273. package/dist/index179.cjs +1 -1
  274. package/dist/index179.mjs +18 -67
  275. package/dist/index179.mjs.map +1 -1
  276. package/dist/index18.cjs +1 -1
  277. package/dist/index18.mjs +1 -1
  278. package/dist/index180.cjs +1 -1
  279. package/dist/index180.mjs +42 -57
  280. package/dist/index180.mjs.map +1 -1
  281. package/dist/index181.cjs +1 -1
  282. package/dist/index181.mjs +28 -44
  283. package/dist/index181.mjs.map +1 -1
  284. package/dist/index185.cjs +1 -1
  285. package/dist/index185.mjs +1 -1
  286. package/dist/index19.cjs +1 -1
  287. package/dist/index19.mjs +2 -2
  288. package/dist/index20.cjs +1 -1
  289. package/dist/index20.mjs +14 -14
  290. package/dist/index21.cjs +1 -1
  291. package/dist/index21.mjs +1 -1
  292. package/dist/index22.cjs +1 -1
  293. package/dist/index22.mjs +1 -1
  294. package/dist/index23.cjs +1 -1
  295. package/dist/index23.mjs +1 -1
  296. package/dist/index24.cjs +1 -1
  297. package/dist/index24.mjs +1 -1
  298. package/dist/index25.cjs +1 -1
  299. package/dist/index25.mjs +1 -1
  300. package/dist/index26.cjs +1 -1
  301. package/dist/index26.cjs.map +1 -1
  302. package/dist/index26.mjs +1 -1
  303. package/dist/index27.cjs +1 -1
  304. package/dist/index27.mjs +1 -1
  305. package/dist/index28.cjs +1 -1
  306. package/dist/index28.mjs +1 -1
  307. package/dist/index30.cjs +1 -1
  308. package/dist/index30.mjs +1 -1
  309. package/dist/index31.cjs +1 -1
  310. package/dist/index31.mjs +1 -1
  311. package/dist/index32.cjs +1 -1
  312. package/dist/index32.mjs +1 -1
  313. package/dist/index33.cjs +1 -1
  314. package/dist/index33.mjs +1 -1
  315. package/dist/index34.cjs +1 -1
  316. package/dist/index34.mjs +1 -1
  317. package/dist/index35.cjs +1 -1
  318. package/dist/index35.mjs +1 -1
  319. package/dist/index36.cjs +1 -1
  320. package/dist/index36.mjs +1 -1
  321. package/dist/index37.cjs +1 -1
  322. package/dist/index37.mjs +1 -1
  323. package/dist/index38.cjs +1 -1
  324. package/dist/index38.mjs +1 -1
  325. package/dist/index39.cjs +1 -1
  326. package/dist/index39.mjs +1 -1
  327. package/dist/index40.cjs +1 -1
  328. package/dist/index40.mjs +1 -1
  329. package/dist/index42.cjs +1 -1
  330. package/dist/index42.mjs +1 -1
  331. package/dist/index43.cjs +1 -1
  332. package/dist/index43.cjs.map +1 -1
  333. package/dist/index43.mjs +1 -1
  334. package/dist/index44.cjs +1 -1
  335. package/dist/index44.mjs +1 -1
  336. package/dist/index46.cjs +1 -1
  337. package/dist/index46.mjs +1 -1
  338. package/dist/index47.cjs +1 -1
  339. package/dist/index47.mjs +1 -1
  340. package/dist/index49.cjs +1 -1
  341. package/dist/index49.mjs +1 -1
  342. package/dist/index5.cjs +1 -1
  343. package/dist/index5.mjs +1 -1
  344. package/dist/index50.cjs +1 -1
  345. package/dist/index50.mjs +1 -1
  346. package/dist/index51.cjs +1 -1
  347. package/dist/index51.mjs +1 -1
  348. package/dist/index52.cjs +1 -1
  349. package/dist/index52.mjs +1 -1
  350. package/dist/index53.cjs +1 -1
  351. package/dist/index53.mjs +1 -1
  352. package/dist/index54.cjs +1 -1
  353. package/dist/index54.mjs +1 -1
  354. package/dist/index55.cjs +1 -1
  355. package/dist/index55.mjs +1 -1
  356. package/dist/index56.cjs +1 -1
  357. package/dist/index56.mjs +1 -1
  358. package/dist/index57.cjs +1 -1
  359. package/dist/index57.mjs +1 -1
  360. package/dist/index58.cjs +1 -1
  361. package/dist/index58.mjs +1 -1
  362. package/dist/index59.cjs +1 -1
  363. package/dist/index59.mjs +1 -1
  364. package/dist/index6.cjs +1 -1
  365. package/dist/index6.mjs +1 -1
  366. package/dist/index60.cjs +1 -1
  367. package/dist/index60.mjs +1 -1
  368. package/dist/index61.cjs +1 -1
  369. package/dist/index61.mjs +1 -1
  370. package/dist/index62.cjs +1 -1
  371. package/dist/index62.mjs +1 -1
  372. package/dist/index64.cjs +1 -1
  373. package/dist/index64.mjs +1 -1
  374. package/dist/index65.cjs +1 -1
  375. package/dist/index65.mjs +1 -1
  376. package/dist/index66.cjs +1 -1
  377. package/dist/index66.mjs +1 -1
  378. package/dist/index67.cjs +1 -1
  379. package/dist/index67.mjs +1 -1
  380. package/dist/index68.cjs +1 -1
  381. package/dist/index68.mjs +1 -1
  382. package/dist/index69.cjs +1 -1
  383. package/dist/index69.mjs +1 -1
  384. package/dist/index7.cjs +1 -1
  385. package/dist/index7.mjs +1 -1
  386. package/dist/index70.cjs +1 -1
  387. package/dist/index70.mjs +1 -1
  388. package/dist/index71.cjs +1 -1
  389. package/dist/index71.mjs +1 -1
  390. package/dist/index72.cjs +1 -1
  391. package/dist/index72.mjs +1 -1
  392. package/dist/index73.cjs +1 -1
  393. package/dist/index73.mjs +1 -1
  394. package/dist/index75.cjs +7 -10
  395. package/dist/index75.cjs.map +1 -1
  396. package/dist/index75.mjs +18 -21
  397. package/dist/index75.mjs.map +1 -1
  398. package/dist/index76.cjs +1 -1
  399. package/dist/index76.mjs +1 -1
  400. package/dist/index77.cjs +1 -1
  401. package/dist/index77.mjs +1 -1
  402. package/dist/index78.cjs +1 -1
  403. package/dist/index78.mjs +1 -1
  404. package/dist/index79.cjs +1 -1
  405. package/dist/index79.mjs +1 -1
  406. package/dist/index8.cjs +1 -1
  407. package/dist/index8.mjs +1 -1
  408. package/dist/index80.cjs +1 -1
  409. package/dist/index80.mjs +1 -1
  410. package/dist/index81.cjs +1 -1
  411. package/dist/index81.mjs +1 -1
  412. package/dist/index82.cjs +1 -1
  413. package/dist/index82.mjs +2 -2
  414. package/dist/index9.cjs +1 -1
  415. package/dist/index9.mjs +1 -1
  416. package/dist/index97.cjs +1 -1
  417. package/dist/index97.cjs.map +1 -1
  418. package/dist/index97.mjs +62 -154
  419. package/dist/index97.mjs.map +1 -1
  420. package/dist/index98.cjs +1 -1
  421. package/dist/index98.cjs.map +1 -1
  422. package/dist/index98.mjs +138 -202
  423. package/dist/index98.mjs.map +1 -1
  424. package/dist/index99.cjs +1 -1
  425. package/dist/index99.cjs.map +1 -1
  426. package/dist/index99.mjs +218 -36
  427. package/dist/index99.mjs.map +1 -1
  428. package/dist/react.css +1 -1
  429. package/dist/styles.css +8 -1
  430. package/dist/theme.css +7 -0
  431. package/package.json +5 -8
package/dist/index122.mjs CHANGED
@@ -1,174 +1,94 @@
1
- import { jsx as s, jsxs as i } from "react/jsx-runtime";
2
- import { User as j, Bot as y, RotateCcw as z, ThumbsUp as U, ThumbsDown as w, AlertCircle as R, Check as S, Clock as T } from "lucide-react";
3
- import { ChatMarkdown as x } from "./index126.mjs";
4
- import { ChatAttachment as D } from "./index131.mjs";
5
- import e from "./index119.mjs";
6
- const F = (a) => a ? new Intl.DateTimeFormat("en-US", {
7
- hour: "numeric",
8
- minute: "2-digit",
9
- hour12: !0
10
- }).format(a) : "", M = (a) => {
11
- switch (a) {
12
- case "sending":
13
- return /* @__PURE__ */ s(T, { size: 12 });
14
- case "sent":
15
- return /* @__PURE__ */ s(S, { size: 12 });
16
- case "error":
17
- return /* @__PURE__ */ s(R, { size: 12 });
18
- default:
19
- return null;
20
- }
21
- }, E = ({
22
- role: a,
23
- content: c,
24
- timestamp: d,
25
- status: r,
26
- attachments: o,
27
- avatar: b,
28
- showAvatar: k,
29
- actions: g,
30
- isStreaming: B,
31
- onImageClick: u,
32
- onRetry: h,
33
- reaction: l,
34
- onReaction: m,
35
- children: f,
36
- className: v,
37
- ...p
1
+ import { jsxs as r, jsx as o, Fragment as d } from "react/jsx-runtime";
2
+ import { useState as g, useCallback as k } from "react";
3
+ import { Prism as x } from "react-syntax-highlighter";
4
+ import { oneLight as B, oneDark as b } from "react-syntax-highlighter/dist/esm/styles/prism";
5
+ import { Check as j, Copy as v } from "lucide-react";
6
+ import t from "./index116.mjs";
7
+ import { useThemeContext as L } from "./index75.mjs";
8
+ const N = (e) => e ? {
9
+ js: "javascript",
10
+ ts: "typescript",
11
+ jsx: "jsx",
12
+ tsx: "tsx",
13
+ py: "python",
14
+ rb: "ruby",
15
+ sh: "bash",
16
+ shell: "bash",
17
+ yml: "yaml",
18
+ md: "markdown"
19
+ }[e.toLowerCase()] || e.toLowerCase() : "text", w = ({
20
+ code: e,
21
+ language: s,
22
+ showLineNumbers: m = !1,
23
+ showCopyButton: p = !0,
24
+ maxHeight: h = "400px",
25
+ className: y,
26
+ ...C
38
27
  }) => {
39
- const t = a === "user", A = a === "system", N = a === "assistant", C = k ?? !1;
40
- return A ? /* @__PURE__ */ s(
41
- "div",
42
- {
43
- className: [e.message, v].filter(Boolean).join(" "),
44
- role: "listitem",
45
- ...p,
46
- children: /* @__PURE__ */ s("div", { className: e.messageContent, children: /* @__PURE__ */ s("div", { className: e.messageBubbleSystem, children: f || c }) })
28
+ const [a, i] = g(!1);
29
+ let l = "dark";
30
+ try {
31
+ l = L().theme;
32
+ } catch {
33
+ }
34
+ const u = k(async () => {
35
+ try {
36
+ await navigator.clipboard.writeText(e), i(!0), setTimeout(() => i(!1), 2e3);
37
+ } catch (n) {
38
+ console.error("Failed to copy code:", n);
47
39
  }
48
- ) : /* @__PURE__ */ i(
40
+ }, [e]), c = N(s), f = l === "light" ? B : b;
41
+ return /* @__PURE__ */ r(
49
42
  "div",
50
43
  {
51
- className: [
52
- e.message,
53
- t && e.messageUser,
54
- N && e.messageAssistant,
55
- v
56
- ].filter(Boolean).join(" "),
57
- role: "listitem",
58
- ...p,
44
+ className: [t.codeBlock, y].filter(Boolean).join(" "),
45
+ ...C,
59
46
  children: [
60
- C && /* @__PURE__ */ s(
61
- "div",
62
- {
63
- className: [
64
- e.messageAvatar,
65
- t ? e.messageAvatarUser : e.messageAvatarAssistant
66
- ].filter(Boolean).join(" "),
67
- "aria-hidden": "true",
68
- children: b || (t ? /* @__PURE__ */ s(j, { size: 18 }) : /* @__PURE__ */ s(y, { size: 18 }))
69
- }
70
- ),
71
- /* @__PURE__ */ i("div", { className: e.messageContent, children: [
72
- /* @__PURE__ */ i(
73
- "div",
47
+ /* @__PURE__ */ r("div", { className: t.codeBlockHeader, children: [
48
+ /* @__PURE__ */ o("span", { className: t.codeBlockLanguage, children: c }),
49
+ p && /* @__PURE__ */ o(
50
+ "button",
74
51
  {
75
- className: [
76
- e.messageBubble,
77
- t ? e.messageBubbleUser : e.messageBubbleAssistant
78
- ].filter(Boolean).join(" "),
79
- children: [
80
- f || /* @__PURE__ */ s(
81
- x,
82
- {
83
- content: c,
84
- className: t ? e.markdownUser : void 0
85
- }
86
- ),
87
- B && /* @__PURE__ */ s("span", { className: e.streamingCursor })
88
- ]
52
+ className: [t.codeBlockCopy, a && t.codeBlockCopied].filter(Boolean).join(" "),
53
+ onClick: u,
54
+ "aria-label": a ? "Copied!" : "Copy code",
55
+ children: a ? /* @__PURE__ */ r(d, { children: [
56
+ /* @__PURE__ */ o(j, { size: 14 }),
57
+ "Copied!"
58
+ ] }) : /* @__PURE__ */ r(d, { children: [
59
+ /* @__PURE__ */ o(v, { size: 14 }),
60
+ "Copy"
61
+ ] })
89
62
  }
90
- ),
91
- o && o.length > 0 && /* @__PURE__ */ s("div", { className: e.messageAttachments, children: o.map((n) => /* @__PURE__ */ s(
92
- D,
93
- {
94
- attachment: n,
95
- onClick: n.type === "image" && u ? () => u(n) : void 0
63
+ )
64
+ ] }),
65
+ /* @__PURE__ */ o("div", { className: t.codeBlockContent, style: { maxHeight: h }, children: /* @__PURE__ */ o(
66
+ x,
67
+ {
68
+ language: c,
69
+ style: f,
70
+ showLineNumbers: m,
71
+ customStyle: {
72
+ margin: 0,
73
+ padding: 0,
74
+ background: "transparent",
75
+ fontSize: "inherit",
76
+ lineHeight: "inherit"
96
77
  },
97
- n.id
98
- )) }),
99
- /* @__PURE__ */ i("div", { className: e.messageFooter, children: [
100
- d && /* @__PURE__ */ s("span", { className: e.messageTimestamp, children: F(d) }),
101
- r && /* @__PURE__ */ i(
102
- "span",
103
- {
104
- className: [
105
- e.messageStatus,
106
- r === "error" && e.messageStatusError
107
- ].filter(Boolean).join(" "),
108
- children: [
109
- M(r),
110
- r === "error" && "Failed to send"
111
- ]
112
- }
113
- ),
114
- r === "error" && h && /* @__PURE__ */ i(
115
- "button",
116
- {
117
- className: e.messageRetry,
118
- onClick: h,
119
- "aria-label": "Retry sending message",
120
- children: [
121
- /* @__PURE__ */ s(z, { size: 12 }),
122
- "Retry"
123
- ]
78
+ codeTagProps: {
79
+ style: {
80
+ fontFamily: "var(--font-mono)"
124
81
  }
125
- ),
126
- g && /* @__PURE__ */ s("div", { className: e.messageActions, children: g }),
127
- N && m && /* @__PURE__ */ i(
128
- "div",
129
- {
130
- className: [
131
- e.messageReactions,
132
- l && e.messageReactionsVisible
133
- ].filter(Boolean).join(" "),
134
- children: [
135
- /* @__PURE__ */ s(
136
- "button",
137
- {
138
- className: [
139
- e.messageReactionButton,
140
- l === "like" && e.messageReactionActive
141
- ].filter(Boolean).join(" "),
142
- onClick: () => m("like"),
143
- "aria-label": "Like this response",
144
- "aria-pressed": l === "like",
145
- children: /* @__PURE__ */ s(U, { size: 14 })
146
- }
147
- ),
148
- /* @__PURE__ */ s(
149
- "button",
150
- {
151
- className: [
152
- e.messageReactionButton,
153
- l === "dislike" && e.messageReactionActive
154
- ].filter(Boolean).join(" "),
155
- onClick: () => m("dislike"),
156
- "aria-label": "Dislike this response",
157
- "aria-pressed": l === "dislike",
158
- children: /* @__PURE__ */ s(w, { size: 14 })
159
- }
160
- )
161
- ]
162
- }
163
- )
164
- ] })
165
- ] })
82
+ },
83
+ children: e
84
+ }
85
+ ) })
166
86
  ]
167
87
  }
168
88
  );
169
89
  };
170
- E.displayName = "ChatMessage";
90
+ w.displayName = "ChatCodeBlock";
171
91
  export {
172
- E as ChatMessage
92
+ w as ChatCodeBlock
173
93
  };
174
94
  //# sourceMappingURL=index122.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index122.mjs","sources":["../src/components/Chat/components/ChatMessage.tsx"],"sourcesContent":["/**\n * ChatMessage Component\n *\n * Individual message bubble with support for text, markdown,\n * attachments, reactions, retry, and various states.\n */\n\nimport React from \"react\";\nimport {\n User,\n Bot,\n AlertCircle,\n Check,\n Clock,\n RotateCcw,\n ThumbsUp,\n ThumbsDown,\n} from \"lucide-react\";\nimport type { ChatMessageProps } from \"../Chat.types\";\nimport { ChatMarkdown } from \"./ChatMarkdown\";\nimport { ChatAttachment } from \"./ChatAttachment\";\nimport styles from \"../Chat.module.css\";\n\n// Format timestamp\nconst formatTimestamp = (date?: Date): string => {\n if (!date) return \"\";\n return new Intl.DateTimeFormat(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\",\n hour12: true,\n }).format(date);\n};\n\n// Get status icon\nconst getStatusIcon = (status?: string) => {\n switch (status) {\n case \"sending\":\n return <Clock size={12} />;\n case \"sent\":\n return <Check size={12} />;\n case \"error\":\n return <AlertCircle size={12} />;\n default:\n return null;\n }\n};\n\nexport const ChatMessage: React.FC<ChatMessageProps> = ({\n role,\n content,\n timestamp,\n status,\n attachments,\n avatar,\n showAvatar,\n actions,\n isStreaming,\n onImageClick,\n onRetry,\n reaction,\n onReaction,\n children,\n className,\n ...rest\n}) => {\n const isUser = role === \"user\";\n const isSystem = role === \"system\";\n const isAssistant = role === \"assistant\";\n const shouldShowAvatar = showAvatar ?? false;\n\n // System messages have a different layout\n if (isSystem) {\n return (\n <div\n className={[styles.message, className].filter(Boolean).join(\" \")}\n role=\"listitem\"\n {...rest}\n >\n <div className={styles.messageContent}>\n <div className={styles.messageBubbleSystem}>\n {children || content}\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div\n className={[\n styles.message,\n isUser && styles.messageUser,\n isAssistant && styles.messageAssistant,\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n role=\"listitem\"\n {...rest}\n >\n {/* Avatar */}\n {shouldShowAvatar && (\n <div\n className={[\n styles.messageAvatar,\n isUser ? styles.messageAvatarUser : styles.messageAvatarAssistant,\n ]\n .filter(Boolean)\n .join(\" \")}\n aria-hidden=\"true\"\n >\n {avatar || (isUser ? <User size={18} /> : <Bot size={18} />)}\n </div>\n )}\n\n {/* Content */}\n <div className={styles.messageContent}>\n {/* Message bubble */}\n <div\n className={[\n styles.messageBubble,\n isUser ? styles.messageBubbleUser : styles.messageBubbleAssistant,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {children || (\n <ChatMarkdown\n content={content}\n className={isUser ? styles.markdownUser : undefined}\n />\n )}\n\n {/* Streaming cursor */}\n {isStreaming && <span className={styles.streamingCursor} />}\n </div>\n\n {/* Attachments */}\n {attachments && attachments.length > 0 && (\n <div className={styles.messageAttachments}>\n {attachments.map((attachment) => (\n <ChatAttachment\n key={attachment.id}\n attachment={attachment}\n onClick={\n attachment.type === \"image\" && onImageClick\n ? () => onImageClick(attachment)\n : undefined\n }\n />\n ))}\n </div>\n )}\n\n {/* Footer (timestamp, status, actions, reactions) */}\n <div className={styles.messageFooter}>\n {timestamp && (\n <span className={styles.messageTimestamp}>\n {formatTimestamp(timestamp)}\n </span>\n )}\n\n {status && (\n <span\n className={[\n styles.messageStatus,\n status === \"error\" && styles.messageStatusError,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {getStatusIcon(status)}\n {status === \"error\" && \"Failed to send\"}\n </span>\n )}\n\n {/* Retry button for failed messages */}\n {status === \"error\" && onRetry && (\n <button\n className={styles.messageRetry}\n onClick={onRetry}\n aria-label=\"Retry sending message\"\n >\n <RotateCcw size={12} />\n Retry\n </button>\n )}\n\n {actions && <div className={styles.messageActions}>{actions}</div>}\n\n {/* Reactions for assistant messages */}\n {isAssistant && onReaction && (\n <div\n className={[\n styles.messageReactions,\n reaction && styles.messageReactionsVisible,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n <button\n className={[\n styles.messageReactionButton,\n reaction === \"like\" && styles.messageReactionActive,\n ]\n .filter(Boolean)\n .join(\" \")}\n onClick={() => onReaction(\"like\")}\n aria-label=\"Like this response\"\n aria-pressed={reaction === \"like\"}\n >\n <ThumbsUp size={14} />\n </button>\n <button\n className={[\n styles.messageReactionButton,\n reaction === \"dislike\" && styles.messageReactionActive,\n ]\n .filter(Boolean)\n .join(\" \")}\n onClick={() => onReaction(\"dislike\")}\n aria-label=\"Dislike this response\"\n aria-pressed={reaction === \"dislike\"}\n >\n <ThumbsDown size={14} />\n </button>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};\n\nChatMessage.displayName = \"ChatMessage\";\n"],"names":["formatTimestamp","date","getStatusIcon","status","jsx","Clock","Check","AlertCircle","ChatMessage","role","content","timestamp","attachments","avatar","showAvatar","actions","isStreaming","onImageClick","onRetry","reaction","onReaction","children","className","rest","isUser","isSystem","isAssistant","shouldShowAvatar","styles","jsxs","User","Bot","ChatMarkdown","attachment","ChatAttachment","RotateCcw","ThumbsUp","ThumbsDown"],"mappings":"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"}
1
+ {"version":3,"file":"index122.mjs","sources":["../src/components/Chat/components/ChatCodeBlock.tsx"],"sourcesContent":["/**\n * ChatCodeBlock Component\n *\n * Syntax-highlighted code block with copy functionality\n * and theme-aware highlighting.\n */\n\nimport React, { useState, useCallback } from \"react\";\nimport { Prism as SyntaxHighlighter } from \"react-syntax-highlighter\";\nimport {\n oneDark,\n oneLight,\n} from \"react-syntax-highlighter/dist/esm/styles/prism\";\nimport { Copy, Check } from \"lucide-react\";\nimport type { ChatCodeBlockProps } from \"../Chat.types\";\nimport { useThemeContext } from \"../../../contexts\";\nimport styles from \"../Chat.module.css\";\n\n// Map common language aliases\nconst normalizeLanguage = (lang?: string): string => {\n if (!lang) return \"text\";\n\n const aliases: Record<string, string> = {\n js: \"javascript\",\n ts: \"typescript\",\n jsx: \"jsx\",\n tsx: \"tsx\",\n py: \"python\",\n rb: \"ruby\",\n sh: \"bash\",\n shell: \"bash\",\n yml: \"yaml\",\n md: \"markdown\",\n };\n\n return aliases[lang.toLowerCase()] || lang.toLowerCase();\n};\n\nexport const ChatCodeBlock: React.FC<ChatCodeBlockProps> = ({\n code,\n language,\n showLineNumbers = false,\n showCopyButton = true,\n maxHeight = \"400px\",\n className,\n ...rest\n}) => {\n const [copied, setCopied] = useState(false);\n\n // Get current theme for syntax highlighting\n let currentTheme: \"light\" | \"dark\" = \"dark\";\n try {\n const ctx = useThemeContext();\n currentTheme = ctx.theme;\n } catch {\n // ThemeProvider not available, default to dark\n }\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(code);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (err) {\n console.error(\"Failed to copy code:\", err);\n }\n }, [code]);\n\n const normalizedLang = normalizeLanguage(language);\n const highlightStyle = currentTheme === \"light\" ? oneLight : oneDark;\n\n return (\n <div\n className={[styles.codeBlock, className].filter(Boolean).join(\" \")}\n {...rest}\n >\n {/* Header with language and copy button */}\n <div className={styles.codeBlockHeader}>\n <span className={styles.codeBlockLanguage}>{normalizedLang}</span>\n {showCopyButton && (\n <button\n className={[styles.codeBlockCopy, copied && styles.codeBlockCopied]\n .filter(Boolean)\n .join(\" \")}\n onClick={handleCopy}\n aria-label={copied ? \"Copied!\" : \"Copy code\"}\n >\n {copied ? (\n <>\n <Check size={14} />\n Copied!\n </>\n ) : (\n <>\n <Copy size={14} />\n Copy\n </>\n )}\n </button>\n )}\n </div>\n\n {/* Code content */}\n <div className={styles.codeBlockContent} style={{ maxHeight }}>\n <SyntaxHighlighter\n language={normalizedLang}\n style={highlightStyle}\n showLineNumbers={showLineNumbers}\n customStyle={{\n margin: 0,\n padding: 0,\n background: \"transparent\",\n fontSize: \"inherit\",\n lineHeight: \"inherit\",\n }}\n codeTagProps={{\n style: {\n fontFamily: \"var(--font-mono)\",\n },\n }}\n >\n {code}\n </SyntaxHighlighter>\n </div>\n </div>\n );\n};\n\nChatCodeBlock.displayName = \"ChatCodeBlock\";\n"],"names":["normalizeLanguage","lang","ChatCodeBlock","code","language","showLineNumbers","showCopyButton","maxHeight","className","rest","copied","setCopied","useState","currentTheme","useThemeContext","handleCopy","useCallback","err","normalizedLang","highlightStyle","oneLight","oneDark","jsxs","styles","jsx","Fragment","Check","Copy","SyntaxHighlighter"],"mappings":";;;;;;;AAmBA,MAAMA,IAAoB,CAACC,MACpBA,IAEmC;AAAA,EACtC,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,KAAK;AAAA,EACL,IAAI;AAAA,EAGSA,EAAK,YAAA,CAAa,KAAKA,EAAK,YAAA,IAfzB,QAkBPC,IAA8C,CAAC;AAAA,EAC1D,MAAAC;AAAA,EACA,UAAAC;AAAA,EACA,iBAAAC,IAAkB;AAAA,EAClB,gBAAAC,IAAiB;AAAA,EACjB,WAAAC,IAAY;AAAA,EACZ,WAAAC;AAAA,EACA,GAAGC;AACL,MAAM;AACJ,QAAM,CAACC,GAAQC,CAAS,IAAIC,EAAS,EAAK;AAG1C,MAAIC,IAAiC;AACrC,MAAI;AAEF,IAAAA,IADYC,EAAA,EACO;AAAA,EACrB,QAAQ;AAAA,EAER;AAEA,QAAMC,IAAaC,EAAY,YAAY;AACzC,QAAI;AACF,YAAM,UAAU,UAAU,UAAUb,CAAI,GACxCQ,EAAU,EAAI,GACd,WAAW,MAAMA,EAAU,EAAK,GAAG,GAAI;AAAA,IACzC,SAASM,GAAK;AACZ,cAAQ,MAAM,wBAAwBA,CAAG;AAAA,IAC3C;AAAA,EACF,GAAG,CAACd,CAAI,CAAC,GAEHe,IAAiBlB,EAAkBI,CAAQ,GAC3Ce,IAAiBN,MAAiB,UAAUO,IAAWC;AAE7D,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,CAACC,EAAO,WAAWf,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAChE,GAAGC;AAAA,MAGJ,UAAA;AAAA,QAAA,gBAAAa,EAAC,OAAA,EAAI,WAAWC,EAAO,iBACrB,UAAA;AAAA,UAAA,gBAAAC,EAAC,QAAA,EAAK,WAAWD,EAAO,mBAAoB,UAAAL,GAAe;AAAA,UAC1DZ,KACC,gBAAAkB;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAW,CAACD,EAAO,eAAeb,KAAUa,EAAO,eAAe,EAC/D,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,cACX,SAASR;AAAA,cACT,cAAYL,IAAS,YAAY;AAAA,cAEhC,cACC,gBAAAY,EAAAG,GAAA,EACE,UAAA;AAAA,gBAAA,gBAAAD,EAACE,GAAA,EAAM,MAAM,GAAA,CAAI;AAAA,gBAAE;AAAA,cAAA,EAAA,CAErB,IAEA,gBAAAJ,EAAAG,GAAA,EACE,UAAA;AAAA,gBAAA,gBAAAD,EAACG,GAAA,EAAK,MAAM,GAAA,CAAI;AAAA,gBAAE;AAAA,cAAA,EAAA,CAEpB;AAAA,YAAA;AAAA,UAAA;AAAA,QAEJ,GAEJ;AAAA,QAGA,gBAAAH,EAAC,SAAI,WAAWD,EAAO,kBAAkB,OAAO,EAAE,WAAAhB,KAChD,UAAA,gBAAAiB;AAAA,UAACI;AAAAA,UAAA;AAAA,YACC,UAAUV;AAAA,YACV,OAAOC;AAAA,YACP,iBAAAd;AAAA,YACA,aAAa;AAAA,cACX,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,UAAU;AAAA,cACV,YAAY;AAAA,YAAA;AAAA,YAEd,cAAc;AAAA,cACZ,OAAO;AAAA,gBACL,YAAY;AAAA,cAAA;AAAA,YACd;AAAA,YAGD,UAAAF;AAAA,UAAA;AAAA,QAAA,EACH,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;AAEAD,EAAc,cAAc;"}
package/dist/index123.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),l=require("react"),o=require("lucide-react"),_=require("./index85.cjs"),$=require("./index129.cjs"),E=require("./index184.cjs"),a=require("./index119.cjs"),X=m=>m.type.startsWith("image/")?e.jsx(o.Image,{size:14}):e.jsx(o.File,{size:14}),y=l.forwardRef(({onSend:m,placeholder:R="Type a message...",allowAttachments:N=!0,allowVoiceRecording:S=!0,allowAudioUpload:G=!0,disabled:i=!1,maxLength:f,acceptedFileTypes:k=["image/*","audio/*",".pdf",".doc",".docx",".txt"],isLoading:s=!1,pendingAttachments:z,onRemoveAttachment:I,className:q,...w},r)=>{const[j,h]=l.useState(!1),u=l.useRef(null),{value:x,setValue:B,attachments:D,addAttachments:c,removeAttachment:F,handleSubmit:g,handleKeyDown:V,textareaRef:C,isEmpty:P}=_.useChatInput({maxLength:f,onSend:m,disabled:i||s}),d=z||D,M=I||F,T=l.useCallback(t=>{C.current=t,typeof r=="function"?r(t):r&&(r.current=t)},[r,C]),W=l.useCallback(t=>{const n=t.target.files;n&&n.length>0&&c(Array.from(n)),u.current&&(u.current.value="")},[c]),K=l.useCallback(t=>{const n=t.clipboardData.items,p=[];for(const v of n)if(v.type.startsWith("image/")){const A=v.getAsFile();A&&p.push(A)}p.length>0&&(t.preventDefault(),c(p))},[c]),O=l.useCallback(t=>{const n=Object.assign(t,{name:`voice-${Date.now()}.webm`,lastModified:Date.now()});c([n]),h(!1)},[c]),U=l.useCallback(()=>{i||s||g()},[i,s,g]),b=!P||d.length>0;return e.jsx("div",{className:[a.default.inputContainer,q].filter(Boolean).join(" "),children:e.jsxs("div",{className:a.default.inputWrapper,children:[d.length>0&&e.jsx("div",{className:a.default.pendingAttachments,children:d.map((t,n)=>e.jsxs("div",{className:a.default.pendingAttachment,children:[X(t),e.jsx("span",{children:t.name}),e.jsxs("span",{className:a.default.pendingAttachmentSize,children:["(",E.formatFileSize(t.size),")"]}),e.jsx("button",{className:a.default.pendingAttachmentRemove,onClick:()=>M(n),"aria-label":`Remove ${t.name}`,children:e.jsx(o.X,{size:14})})]},n))}),j&&e.jsx($.ChatVoiceRecorder,{onRecordingComplete:O,onCancel:()=>h(!1)}),!j&&e.jsxs("div",{className:a.default.inputBox,children:[N&&e.jsxs("div",{className:a.default.inputActions,children:[e.jsx("input",{ref:u,type:"file",accept:k.join(","),multiple:!0,onChange:W,style:{display:"none"},"aria-hidden":"true"}),e.jsx("button",{className:a.default.inputButton,onClick:()=>u.current?.click(),disabled:i||s,"aria-label":"Attach file",title:"Attach file",children:e.jsx(o.Paperclip,{size:20})})]}),e.jsx("textarea",{ref:T,className:a.default.inputTextarea,value:x,onChange:t=>B(t.target.value),onKeyDown:V,onPaste:K,placeholder:R,disabled:i||s,maxLength:f,rows:1,"aria-label":"Message input",...w}),e.jsxs("div",{className:a.default.inputActions,children:[S&&!x&&d.length===0&&e.jsx("button",{className:a.default.inputButton,onClick:()=>h(!0),disabled:i||s,"aria-label":"Record voice message",title:"Record voice message",children:e.jsx(o.Mic,{size:20})}),e.jsx("button",{className:[a.default.inputButton,b&&a.default.inputButtonPrimary].filter(Boolean).join(" "),onClick:U,disabled:i||s||!b,"aria-label":"Send message",title:"Send message",children:s?e.jsx("span",{className:a.default.inputSpinner}):e.jsx(o.Send,{size:20})})]})]})]})})});y.displayName="ChatInput";exports.ChatInput=y;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react/jsx-runtime"),d=require("react-markdown"),u=require("remark-gfm"),m=require("./index122.cjs"),g=require("./index116.cjs"),o=({content:s,className:c,...i})=>r.jsx("div",{className:[g.default.markdown,c].filter(Boolean).join(" "),...i,children:r.jsx(d,{remarkPlugins:[u],components:{code({className:e,children:t,...a}){const n=/language-(\w+)/.exec(e||"");if(!n)return r.jsx("code",{className:e,...a,children:t});const l=String(t).replace(/\n$/,"");return r.jsx(m.ChatCodeBlock,{code:l,language:n[1]})},pre({children:e}){return r.jsx(r.Fragment,{children:e})},a({href:e,children:t,...a}){const n=e?.startsWith("http");return r.jsx("a",{href:e,target:n?"_blank":void 0,rel:n?"noopener noreferrer":void 0,...a,children:t})}},children:s})});o.displayName="ChatMarkdown";exports.ChatMarkdown=o;
2
2
  //# sourceMappingURL=index123.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index123.cjs","sources":["../src/components/Chat/components/ChatInput.tsx"],"sourcesContent":["/**\n * ChatInput Component\n *\n * Multi-line input with attachment support, voice recording,\n * and send functionality.\n */\n\nimport React, { forwardRef, useCallback, useState, useRef } from \"react\";\nimport { Send, Paperclip, Mic, X, Image, File } from \"lucide-react\";\nimport type { ChatInputProps } from \"../Chat.types\";\nimport { useChatInput } from \"../hooks/useChatInput\";\nimport { ChatVoiceRecorder } from \"./ChatVoiceRecorder\";\nimport { formatFileSize } from \"../utils\";\nimport styles from \"../Chat.module.css\";\n\n// Get file icon\nconst getFileIcon = (file: File) => {\n if (file.type.startsWith(\"image/\")) {\n return <Image size={14} />;\n }\n return <File size={14} />;\n};\n\nexport const ChatInput = forwardRef<HTMLTextAreaElement, ChatInputProps>(\n (\n {\n onSend,\n placeholder = \"Type a message...\",\n allowAttachments = true,\n allowVoiceRecording = true,\n allowAudioUpload: _allowAudioUpload = true,\n disabled = false,\n maxLength,\n acceptedFileTypes = [\n \"image/*\",\n \"audio/*\",\n \".pdf\",\n \".doc\",\n \".docx\",\n \".txt\",\n ],\n isLoading = false,\n pendingAttachments: externalAttachments,\n onRemoveAttachment: externalOnRemove,\n className,\n ...rest\n },\n forwardedRef,\n ) => {\n const [showVoiceRecorder, setShowVoiceRecorder] = useState(false);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const {\n value,\n setValue,\n attachments,\n addAttachments,\n removeAttachment,\n handleSubmit: internalSubmit,\n handleKeyDown,\n textareaRef,\n isEmpty,\n } = useChatInput({\n maxLength,\n onSend,\n disabled: disabled || isLoading,\n });\n\n // Use external attachments if provided, otherwise internal\n const displayAttachments = externalAttachments || attachments;\n const handleRemoveAttachment = externalOnRemove || removeAttachment;\n\n // Combine refs via callback ref\n const combinedRef = useCallback(\n (node: HTMLTextAreaElement | null) => {\n // Set internal ref\n (\n textareaRef as React.MutableRefObject<HTMLTextAreaElement | null>\n ).current = node;\n // Forward ref\n if (typeof forwardedRef === \"function\") {\n forwardedRef(node);\n } else if (forwardedRef) {\n forwardedRef.current = node;\n }\n },\n [forwardedRef, textareaRef],\n );\n\n // Handle file selection\n const handleFileSelect = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (files && files.length > 0) {\n addAttachments(Array.from(files));\n }\n // Reset input\n if (fileInputRef.current) {\n fileInputRef.current.value = \"\";\n }\n },\n [addAttachments],\n );\n\n // Handle paste for images\n const handlePaste = useCallback(\n (e: React.ClipboardEvent) => {\n const items = e.clipboardData.items;\n const imageFiles: File[] = [];\n\n for (const item of items) {\n if (item.type.startsWith(\"image/\")) {\n const file = item.getAsFile();\n if (file) {\n imageFiles.push(file);\n }\n }\n }\n\n if (imageFiles.length > 0) {\n e.preventDefault();\n addAttachments(imageFiles);\n }\n },\n [addAttachments],\n );\n\n // Handle voice recording complete\n const handleVoiceRecordingComplete = useCallback(\n (blob: Blob) => {\n // Create a file-like object from the blob\n const file = Object.assign(blob, {\n name: `voice-${Date.now()}.webm`,\n lastModified: Date.now(),\n }) as File;\n addAttachments([file]);\n setShowVoiceRecorder(false);\n },\n [addAttachments],\n );\n\n // Handle submit\n const handleSubmit = useCallback(() => {\n if (disabled || isLoading) return;\n internalSubmit();\n }, [disabled, isLoading, internalSubmit]);\n\n const canSend = !isEmpty || displayAttachments.length > 0;\n\n return (\n <div\n className={[styles.inputContainer, className].filter(Boolean).join(\" \")}\n >\n <div className={styles.inputWrapper}>\n {/* Pending attachments */}\n {displayAttachments.length > 0 && (\n <div className={styles.pendingAttachments}>\n {displayAttachments.map((file, index) => (\n <div key={index} className={styles.pendingAttachment}>\n {getFileIcon(file)}\n <span>{file.name}</span>\n <span className={styles.pendingAttachmentSize}>\n ({formatFileSize(file.size)})\n </span>\n <button\n className={styles.pendingAttachmentRemove}\n onClick={() => handleRemoveAttachment(index)}\n aria-label={`Remove ${file.name}`}\n >\n <X size={14} />\n </button>\n </div>\n ))}\n </div>\n )}\n\n {/* Voice recorder overlay */}\n {showVoiceRecorder && (\n <ChatVoiceRecorder\n onRecordingComplete={handleVoiceRecordingComplete}\n onCancel={() => setShowVoiceRecorder(false)}\n />\n )}\n\n {/* Main input box */}\n {!showVoiceRecorder && (\n <div className={styles.inputBox}>\n {/* Left actions (attachments) */}\n {allowAttachments && (\n <div className={styles.inputActions}>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept={acceptedFileTypes.join(\",\")}\n multiple\n onChange={handleFileSelect}\n style={{ display: \"none\" }}\n aria-hidden=\"true\"\n />\n <button\n className={styles.inputButton}\n onClick={() => fileInputRef.current?.click()}\n disabled={disabled || isLoading}\n aria-label=\"Attach file\"\n title=\"Attach file\"\n >\n <Paperclip size={20} />\n </button>\n </div>\n )}\n\n {/* Textarea */}\n <textarea\n ref={combinedRef}\n className={styles.inputTextarea}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n placeholder={placeholder}\n disabled={disabled || isLoading}\n maxLength={maxLength}\n rows={1}\n aria-label=\"Message input\"\n {...rest}\n />\n\n {/* Right actions (voice, send) */}\n <div className={styles.inputActions}>\n {/* Voice recording button */}\n {allowVoiceRecording &&\n !value &&\n displayAttachments.length === 0 && (\n <button\n className={styles.inputButton}\n onClick={() => setShowVoiceRecorder(true)}\n disabled={disabled || isLoading}\n aria-label=\"Record voice message\"\n title=\"Record voice message\"\n >\n <Mic size={20} />\n </button>\n )}\n\n {/* Send button */}\n <button\n className={[\n styles.inputButton,\n canSend && styles.inputButtonPrimary,\n ]\n .filter(Boolean)\n .join(\" \")}\n onClick={handleSubmit}\n disabled={disabled || isLoading || !canSend}\n aria-label=\"Send message\"\n title=\"Send message\"\n >\n {isLoading ? (\n <span className={styles.inputSpinner} />\n ) : (\n <Send size={20} />\n )}\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n },\n);\n\nChatInput.displayName = \"ChatInput\";\n"],"names":["getFileIcon","file","jsx","Image","File","ChatInput","forwardRef","onSend","placeholder","allowAttachments","allowVoiceRecording","_allowAudioUpload","disabled","maxLength","acceptedFileTypes","isLoading","externalAttachments","externalOnRemove","className","rest","forwardedRef","showVoiceRecorder","setShowVoiceRecorder","useState","fileInputRef","useRef","value","setValue","attachments","addAttachments","removeAttachment","internalSubmit","handleKeyDown","textareaRef","isEmpty","useChatInput","displayAttachments","handleRemoveAttachment","combinedRef","useCallback","node","handleFileSelect","e","files","handlePaste","items","imageFiles","item","handleVoiceRecordingComplete","blob","handleSubmit","canSend","styles","jsxs","index","formatFileSize","X","ChatVoiceRecorder","Paperclip","Mic","Send"],"mappings":"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"}
1
+ {"version":3,"file":"index123.cjs","sources":["../src/components/Chat/components/ChatMarkdown.tsx"],"sourcesContent":["/**\n * ChatMarkdown Component\n *\n * Markdown renderer with support for GFM (tables, strikethrough, etc.)\n * and custom code block rendering.\n */\n\nimport React from \"react\";\nimport ReactMarkdown from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\nimport type { ChatMarkdownProps } from \"../Chat.types\";\nimport { ChatCodeBlock } from \"./ChatCodeBlock\";\nimport styles from \"../Chat.module.css\";\n\nexport const ChatMarkdown: React.FC<ChatMarkdownProps> = ({\n content,\n className,\n ...rest\n}) => {\n return (\n <div\n className={[styles.markdown, className].filter(Boolean).join(\" \")}\n {...rest}\n >\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n components={{\n // Custom code block rendering\n code({ className: codeClassName, children, ...props }) {\n const match = /language-(\\w+)/.exec(codeClassName || \"\");\n const isInline = !match;\n\n if (isInline) {\n // Inline code\n return (\n <code className={codeClassName} {...props}>\n {children}\n </code>\n );\n }\n\n // Code block with syntax highlighting\n const codeString = String(children).replace(/\\n$/, \"\");\n return <ChatCodeBlock code={codeString} language={match[1]} />;\n },\n\n // Custom pre rendering (remove wrapper for code blocks)\n pre({ children }) {\n return <>{children}</>;\n },\n\n // Custom link rendering (open in new tab)\n a({ href, children, ...props }) {\n const isExternal = href?.startsWith(\"http\");\n return (\n <a\n href={href}\n target={isExternal ? \"_blank\" : undefined}\n rel={isExternal ? \"noopener noreferrer\" : undefined}\n {...props}\n >\n {children}\n </a>\n );\n },\n }}\n >\n {content}\n </ReactMarkdown>\n </div>\n );\n};\n\nChatMarkdown.displayName = \"ChatMarkdown\";\n"],"names":["ChatMarkdown","content","className","rest","jsx","styles","ReactMarkdown","remarkGfm","codeClassName","children","props","match","codeString","ChatCodeBlock","href","isExternal"],"mappings":"iOAcaA,EAA4C,CAAC,CACxD,QAAAC,EACA,UAAAC,EACA,GAAGC,CACL,IAEIC,EAAAA,IAAC,MAAA,CACC,UAAW,CAACC,UAAO,SAAUH,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAC/D,GAAGC,EAEJ,SAAAC,EAAAA,IAACE,EAAA,CACC,cAAe,CAACC,CAAS,EACzB,WAAY,CAEV,KAAK,CAAE,UAAWC,EAAe,SAAAC,EAAU,GAAGC,GAAS,CACrD,MAAMC,EAAQ,iBAAiB,KAAKH,GAAiB,EAAE,EAGvD,GAFiB,CAACG,EAIhB,aACG,OAAA,CAAK,UAAWH,EAAgB,GAAGE,EACjC,SAAAD,EACH,EAKJ,MAAMG,EAAa,OAAOH,CAAQ,EAAE,QAAQ,MAAO,EAAE,EACrD,aAAQI,EAAAA,cAAA,CAAc,KAAMD,EAAY,SAAUD,EAAM,CAAC,EAAG,CAC9D,EAGA,IAAI,CAAE,SAAAF,GAAY,CAChB,yBAAU,SAAAA,EAAS,CACrB,EAGA,EAAE,CAAE,KAAAK,EAAM,SAAAL,EAAU,GAAGC,GAAS,CAC9B,MAAMK,EAAaD,GAAM,WAAW,MAAM,EAC1C,OACEV,EAAAA,IAAC,IAAA,CACC,KAAAU,EACA,OAAQC,EAAa,SAAW,OAChC,IAAKA,EAAa,sBAAwB,OACzC,GAAGL,EAEH,SAAAD,CAAA,CAAA,CAGP,CAAA,EAGD,SAAAR,CAAA,CAAA,CACH,CAAA,EAKND,EAAa,YAAc"}
package/dist/index123.mjs CHANGED
@@ -1,189 +1,56 @@
1
- import { jsx as t, jsxs as c } from "react/jsx-runtime";
2
- import { forwardRef as E, useState as O, useRef as X, useCallback as r } from "react";
3
- import { X as _, Paperclip as q, Mic as G, Send as H, Image as J, File as Q } from "lucide-react";
4
- import { useChatInput as Y } from "./index85.mjs";
5
- import { ChatVoiceRecorder as Z } from "./index129.mjs";
6
- import { formatFileSize as L } from "./index184.mjs";
7
- import n from "./index119.mjs";
8
- const ee = (p) => p.type.startsWith("image/") ? /* @__PURE__ */ t(J, { size: 14 }) : /* @__PURE__ */ t(Q, { size: 14 }), te = E(
9
- ({
10
- onSend: p,
11
- placeholder: S = "Type a message...",
12
- allowAttachments: R = !0,
13
- allowVoiceRecording: z = !0,
14
- allowAudioUpload: ne = !0,
15
- disabled: s = !1,
16
- maxLength: f,
17
- acceptedFileTypes: w = [
18
- "image/*",
19
- "audio/*",
20
- ".pdf",
21
- ".doc",
22
- ".docx",
23
- ".txt"
24
- ],
25
- isLoading: i = !1,
26
- pendingAttachments: x,
27
- onRemoveAttachment: B,
28
- className: j,
29
- ...k
30
- }, o) => {
31
- const [g, h] = O(!1), m = X(null), {
32
- value: v,
33
- setValue: D,
34
- attachments: F,
35
- addAttachments: l,
36
- removeAttachment: I,
37
- handleSubmit: A,
38
- handleKeyDown: V,
39
- textareaRef: b,
40
- isEmpty: P
41
- } = Y({
42
- maxLength: f,
43
- onSend: p,
44
- disabled: s || i
45
- }), u = x || F, M = B || I, W = r(
46
- (e) => {
47
- b.current = e, typeof o == "function" ? o(e) : o && (o.current = e);
48
- },
49
- [o, b]
50
- ), K = r(
51
- (e) => {
52
- const a = e.target.files;
53
- a && a.length > 0 && l(Array.from(a)), m.current && (m.current.value = "");
54
- },
55
- [l]
56
- ), T = r(
57
- (e) => {
58
- const a = e.clipboardData.items, d = [];
59
- for (const C of a)
60
- if (C.type.startsWith("image/")) {
61
- const N = C.getAsFile();
62
- N && d.push(N);
63
- }
64
- d.length > 0 && (e.preventDefault(), l(d));
65
- },
66
- [l]
67
- ), U = r(
68
- (e) => {
69
- const a = Object.assign(e, {
70
- name: `voice-${Date.now()}.webm`,
71
- lastModified: Date.now()
72
- });
73
- l([a]), h(!1);
74
- },
75
- [l]
76
- ), $ = r(() => {
77
- s || i || A();
78
- }, [s, i, A]), y = !P || u.length > 0;
79
- return /* @__PURE__ */ t(
80
- "div",
1
+ import { jsx as e, Fragment as c } from "react/jsx-runtime";
2
+ import l from "react-markdown";
3
+ import d from "remark-gfm";
4
+ import { ChatCodeBlock as p } from "./index122.mjs";
5
+ import g from "./index116.mjs";
6
+ const f = ({
7
+ content: a,
8
+ className: i,
9
+ ...m
10
+ }) => /* @__PURE__ */ e(
11
+ "div",
12
+ {
13
+ className: [g.markdown, i].filter(Boolean).join(" "),
14
+ ...m,
15
+ children: /* @__PURE__ */ e(
16
+ l,
81
17
  {
82
- className: [n.inputContainer, j].filter(Boolean).join(" "),
83
- children: /* @__PURE__ */ c("div", { className: n.inputWrapper, children: [
84
- u.length > 0 && /* @__PURE__ */ t("div", { className: n.pendingAttachments, children: u.map((e, a) => /* @__PURE__ */ c("div", { className: n.pendingAttachment, children: [
85
- ee(e),
86
- /* @__PURE__ */ t("span", { children: e.name }),
87
- /* @__PURE__ */ c("span", { className: n.pendingAttachmentSize, children: [
88
- "(",
89
- L(e.size),
90
- ")"
91
- ] }),
92
- /* @__PURE__ */ t(
93
- "button",
94
- {
95
- className: n.pendingAttachmentRemove,
96
- onClick: () => M(a),
97
- "aria-label": `Remove ${e.name}`,
98
- children: /* @__PURE__ */ t(_, { size: 14 })
99
- }
100
- )
101
- ] }, a)) }),
102
- g && /* @__PURE__ */ t(
103
- Z,
104
- {
105
- onRecordingComplete: U,
106
- onCancel: () => h(!1)
107
- }
108
- ),
109
- !g && /* @__PURE__ */ c("div", { className: n.inputBox, children: [
110
- R && /* @__PURE__ */ c("div", { className: n.inputActions, children: [
111
- /* @__PURE__ */ t(
112
- "input",
113
- {
114
- ref: m,
115
- type: "file",
116
- accept: w.join(","),
117
- multiple: !0,
118
- onChange: K,
119
- style: { display: "none" },
120
- "aria-hidden": "true"
121
- }
122
- ),
123
- /* @__PURE__ */ t(
124
- "button",
125
- {
126
- className: n.inputButton,
127
- onClick: () => m.current?.click(),
128
- disabled: s || i,
129
- "aria-label": "Attach file",
130
- title: "Attach file",
131
- children: /* @__PURE__ */ t(q, { size: 20 })
132
- }
133
- )
134
- ] }),
135
- /* @__PURE__ */ t(
136
- "textarea",
18
+ remarkPlugins: [d],
19
+ components: {
20
+ // Custom code block rendering
21
+ code({ className: r, children: o, ...t }) {
22
+ const n = /language-(\w+)/.exec(r || "");
23
+ if (!n)
24
+ return /* @__PURE__ */ e("code", { className: r, ...t, children: o });
25
+ const s = String(o).replace(/\n$/, "");
26
+ return /* @__PURE__ */ e(p, { code: s, language: n[1] });
27
+ },
28
+ // Custom pre rendering (remove wrapper for code blocks)
29
+ pre({ children: r }) {
30
+ return /* @__PURE__ */ e(c, { children: r });
31
+ },
32
+ // Custom link rendering (open in new tab)
33
+ a({ href: r, children: o, ...t }) {
34
+ const n = r?.startsWith("http");
35
+ return /* @__PURE__ */ e(
36
+ "a",
137
37
  {
138
- ref: W,
139
- className: n.inputTextarea,
140
- value: v,
141
- onChange: (e) => D(e.target.value),
142
- onKeyDown: V,
143
- onPaste: T,
144
- placeholder: S,
145
- disabled: s || i,
146
- maxLength: f,
147
- rows: 1,
148
- "aria-label": "Message input",
149
- ...k
38
+ href: r,
39
+ target: n ? "_blank" : void 0,
40
+ rel: n ? "noopener noreferrer" : void 0,
41
+ ...t,
42
+ children: o
150
43
  }
151
- ),
152
- /* @__PURE__ */ c("div", { className: n.inputActions, children: [
153
- z && !v && u.length === 0 && /* @__PURE__ */ t(
154
- "button",
155
- {
156
- className: n.inputButton,
157
- onClick: () => h(!0),
158
- disabled: s || i,
159
- "aria-label": "Record voice message",
160
- title: "Record voice message",
161
- children: /* @__PURE__ */ t(G, { size: 20 })
162
- }
163
- ),
164
- /* @__PURE__ */ t(
165
- "button",
166
- {
167
- className: [
168
- n.inputButton,
169
- y && n.inputButtonPrimary
170
- ].filter(Boolean).join(" "),
171
- onClick: $,
172
- disabled: s || i || !y,
173
- "aria-label": "Send message",
174
- title: "Send message",
175
- children: i ? /* @__PURE__ */ t("span", { className: n.inputSpinner }) : /* @__PURE__ */ t(H, { size: 20 })
176
- }
177
- )
178
- ] })
179
- ] })
180
- ] })
44
+ );
45
+ }
46
+ },
47
+ children: a
181
48
  }
182
- );
49
+ )
183
50
  }
184
51
  );
185
- te.displayName = "ChatInput";
52
+ f.displayName = "ChatMarkdown";
186
53
  export {
187
- te as ChatInput
54
+ f as ChatMarkdown
188
55
  };
189
56
  //# sourceMappingURL=index123.mjs.map