@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/index120.mjs CHANGED
@@ -1,37 +1,189 @@
1
- import { jsxs as i, jsx as a, Fragment as c } from "react/jsx-runtime";
2
- import { Bot as m } from "lucide-react";
3
- import e from "./index119.mjs";
4
- const o = ({
5
- title: d = "AI Assistant",
6
- subtitle: r,
7
- avatar: l,
8
- actions: s,
9
- children: t,
10
- className: h,
11
- ...n
12
- }) => /* @__PURE__ */ i(
13
- "div",
14
- {
15
- className: [e.header, h].filter(Boolean).join(" "),
16
- ...n,
17
- children: [
18
- /* @__PURE__ */ a("div", { className: e.headerAvatar, children: l || /* @__PURE__ */ a(
19
- "div",
20
- {
21
- className: [e.messageAvatar, e.headerAvatarDefault].filter(Boolean).join(" "),
22
- children: /* @__PURE__ */ a(m, { size: 20 })
23
- }
24
- ) }),
25
- /* @__PURE__ */ a("div", { className: e.headerContent, children: t || /* @__PURE__ */ i(c, { children: [
26
- /* @__PURE__ */ a("h2", { className: e.headerTitle, children: d }),
27
- r && /* @__PURE__ */ a("p", { className: e.headerSubtitle, children: r })
28
- ] }) }),
29
- s && /* @__PURE__ */ a("div", { className: e.headerActions, children: s })
30
- ]
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 "./index126.mjs";
6
+ import { formatFileSize as L } from "./index184.mjs";
7
+ import n from "./index116.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",
81
+ {
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",
137
+ {
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
150
+ }
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
+ ] })
181
+ }
182
+ );
31
183
  }
32
184
  );
33
- o.displayName = "ChatHeader";
185
+ te.displayName = "ChatInput";
34
186
  export {
35
- o as ChatHeader
187
+ te as ChatInput
36
188
  };
37
189
  //# sourceMappingURL=index120.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index120.mjs","sources":["../src/components/Chat/components/ChatHeader.tsx"],"sourcesContent":["/**\n * ChatHeader Component\n *\n * Header bar with title, avatar, and action buttons.\n */\n\nimport React from \"react\";\nimport { Bot } from \"lucide-react\";\nimport type { ChatHeaderProps } from \"../Chat.types\";\nimport styles from \"../Chat.module.css\";\n\nexport const ChatHeader: React.FC<ChatHeaderProps> = ({\n title = \"AI Assistant\",\n subtitle,\n avatar,\n actions,\n children,\n className,\n ...rest\n}) => {\n return (\n <div\n className={[styles.header, className].filter(Boolean).join(\" \")}\n {...rest}\n >\n {/* Avatar */}\n <div className={styles.headerAvatar}>\n {avatar || (\n <div\n className={[styles.messageAvatar, styles.headerAvatarDefault]\n .filter(Boolean)\n .join(\" \")}\n >\n <Bot size={20} />\n </div>\n )}\n </div>\n\n {/* Title/Subtitle */}\n <div className={styles.headerContent}>\n {children || (\n <>\n <h2 className={styles.headerTitle}>{title}</h2>\n {subtitle && <p className={styles.headerSubtitle}>{subtitle}</p>}\n </>\n )}\n </div>\n\n {/* Actions */}\n {actions && <div className={styles.headerActions}>{actions}</div>}\n </div>\n );\n};\n\nChatHeader.displayName = \"ChatHeader\";\n"],"names":["ChatHeader","title","subtitle","avatar","actions","children","className","rest","jsxs","styles","jsx","Bot","Fragment"],"mappings":";;;AAWO,MAAMA,IAAwC,CAAC;AAAA,EACpD,OAAAC,IAAQ;AAAA,EACR,UAAAC;AAAA,EACA,QAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,GAAGC;AACL,MAEI,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,WAAW,CAACC,EAAO,QAAQH,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,IAC7D,GAAGC;AAAA,IAGJ,UAAA;AAAA,MAAA,gBAAAG,EAAC,OAAA,EAAI,WAAWD,EAAO,cACpB,UAAAN,KACC,gBAAAO;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW,CAACD,EAAO,eAAeA,EAAO,mBAAmB,EACzD,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,UAEX,UAAA,gBAAAC,EAACC,GAAA,EAAI,MAAM,GAAA,CAAI;AAAA,QAAA;AAAA,MAAA,GAGrB;AAAA,wBAGC,OAAA,EAAI,WAAWF,EAAO,eACpB,eACC,gBAAAD,EAAAI,GAAA,EACE,UAAA;AAAA,QAAA,gBAAAF,EAAC,MAAA,EAAG,WAAWD,EAAO,aAAc,UAAAR,GAAM;AAAA,QACzCC,KAAY,gBAAAQ,EAAC,KAAA,EAAE,WAAWD,EAAO,gBAAiB,UAAAP,EAAA,CAAS;AAAA,MAAA,EAAA,CAC9D,EAAA,CAEJ;AAAA,MAGCE,KAAW,gBAAAM,EAAC,OAAA,EAAI,WAAWD,EAAO,eAAgB,UAAAL,EAAA,CAAQ;AAAA,IAAA;AAAA,EAAA;AAAA;AAKjEJ,EAAW,cAAc;"}
1
+ {"version":3,"file":"index120.mjs","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","files","handlePaste","items","imageFiles","item","handleVoiceRecordingComplete","blob","handleSubmit","canSend","styles","jsxs","index","formatFileSize","X","ChatVoiceRecorder","Paperclip","Mic","Send"],"mappings":"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"}
package/dist/index121.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),g=require("react"),f=require("lucide-react"),h=require("./index84.cjs"),t=require("./index119.cjs"),j=require("./index14.cjs"),a=g.forwardRef(({children:l,autoScroll:r=!0,className:i,...n},s)=>{const{scrollRef:c,isAtBottom:u,scrollToBottom:m}=h.useAutoScroll({enabled:r}),d=o=>{c.current=o,typeof s=="function"?s(o):s&&(s.current=o)};return e.jsxs("div",{ref:d,className:[t.default.messages,i].filter(Boolean).join(" "),role:"log","aria-live":"polite","aria-label":"Chat messages","aria-relevant":"additions",...n,children:[e.jsx("div",{className:t.default.messagesInner,children:l}),!u&&e.jsx("div",{className:t.default.scrollToBottomWrapper,children:e.jsx(j.Button,{variant:"secondary",size:"sm",iconOnly:!0,icon:e.jsx(f.ArrowDown,{size:18}),onClick:m,"aria-label":"Scroll to latest messages",className:t.default.scrollToBottomButton})})]})});a.displayName="ChatMessages";exports.ChatMessages=a;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("react/jsx-runtime"),e=require("./index116.cjs"),s=({label:t="Generating response",className:i,...n})=>a.jsx("div",{className:[e.default.message,e.default.messageAssistant,i].filter(Boolean).join(" "),role:"status","aria-live":"polite","aria-label":t,...n,children:a.jsx("div",{className:e.default.messageContent,children:a.jsx("div",{className:[e.default.messageBubble,e.default.messageBubbleAssistant,e.default.thinkingBubble].join(" "),children:a.jsx("span",{className:e.default.thinkingSpinner})})})});s.displayName="ChatTypingIndicator";exports.ChatTypingIndicator=s;
2
2
  //# sourceMappingURL=index121.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index121.cjs","sources":["../src/components/Chat/components/ChatMessages.tsx"],"sourcesContent":["/**\n * ChatMessages Component\n *\n * Scrollable container for chat messages with auto-scroll support\n * and accessibility features.\n */\n\nimport React, { forwardRef } from \"react\";\nimport { ArrowDown } from \"lucide-react\";\nimport type { ChatMessagesProps } from \"../Chat.types\";\nimport { useAutoScroll } from \"../hooks/useAutoScroll\";\nimport { Button } from \"../../Button\";\nimport styles from \"../Chat.module.css\";\n\nexport const ChatMessages = forwardRef<HTMLDivElement, ChatMessagesProps>(\n ({ children, autoScroll = true, className, ...rest }, forwardedRef) => {\n const { scrollRef, isAtBottom, scrollToBottom } = useAutoScroll({\n enabled: autoScroll,\n });\n\n // Combine refs\n const handleRef = (node: HTMLDivElement | null) => {\n // Set internal ref\n (scrollRef as React.MutableRefObject<HTMLDivElement | null>).current =\n node;\n\n // Forward ref\n if (typeof forwardedRef === \"function\") {\n forwardedRef(node);\n } else if (forwardedRef) {\n forwardedRef.current = node;\n }\n };\n\n return (\n <div\n ref={handleRef}\n className={[styles.messages, className].filter(Boolean).join(\" \")}\n role=\"log\"\n aria-live=\"polite\"\n aria-label=\"Chat messages\"\n aria-relevant=\"additions\"\n {...rest}\n >\n <div className={styles.messagesInner}>{children}</div>\n\n {/* Scroll to bottom button (shown when not at bottom) */}\n {!isAtBottom && (\n <div className={styles.scrollToBottomWrapper}>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n iconOnly\n icon={<ArrowDown size={18} />}\n onClick={scrollToBottom}\n aria-label=\"Scroll to latest messages\"\n className={styles.scrollToBottomButton}\n />\n </div>\n )}\n </div>\n );\n },\n);\n\nChatMessages.displayName = \"ChatMessages\";\n"],"names":["ChatMessages","forwardRef","children","autoScroll","className","rest","forwardedRef","scrollRef","isAtBottom","scrollToBottom","useAutoScroll","handleRef","node","jsxs","styles","jsx","Button","ArrowDown"],"mappings":"oPAcaA,EAAeC,EAAAA,WAC1B,CAAC,CAAE,SAAAC,EAAU,WAAAC,EAAa,GAAM,UAAAC,EAAW,GAAGC,CAAA,EAAQC,IAAiB,CACrE,KAAM,CAAE,UAAAC,EAAW,WAAAC,EAAY,eAAAC,CAAA,EAAmBC,EAAAA,cAAc,CAC9D,QAASP,CAAA,CACV,EAGKQ,EAAaC,GAAgC,CAEhDL,EAA4D,QAC3DK,EAGE,OAAON,GAAiB,WAC1BA,EAAaM,CAAI,EACRN,IACTA,EAAa,QAAUM,EAE3B,EAEA,OACEC,EAAAA,KAAC,MAAA,CACC,IAAKF,EACL,UAAW,CAACG,UAAO,SAAUV,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAChE,KAAK,MACL,YAAU,SACV,aAAW,gBACX,gBAAc,YACb,GAAGC,EAEJ,SAAA,CAAAU,EAAAA,IAAC,MAAA,CAAI,UAAWD,EAAAA,QAAO,cAAgB,SAAAZ,EAAS,EAG/C,CAACM,GACAO,EAAAA,IAAC,MAAA,CAAI,UAAWD,UAAO,sBACrB,SAAAC,EAAAA,IAACC,EAAAA,OAAA,CACC,QAAQ,YACR,KAAK,KACL,SAAQ,GACR,KAAMD,EAAAA,IAACE,EAAAA,UAAA,CAAU,KAAM,EAAA,CAAI,EAC3B,QAASR,EACT,aAAW,4BACX,UAAWK,EAAAA,QAAO,oBAAA,CAAA,CACpB,CACF,CAAA,CAAA,CAAA,CAIR,CACF,EAEAd,EAAa,YAAc"}
1
+ {"version":3,"file":"index121.cjs","sources":["../src/components/Chat/components/ChatTypingIndicator.tsx"],"sourcesContent":["/**\n * ChatTypingIndicator Component\n *\n * Circular processing indicator shown before content generation begins.\n * Intentionally abstract — communicates activity without representing\n * specific progress, reducing temporal expectations.\n *\n * Renders in assistant-message layout so the transition to streaming\n * content feels seamless. Avatar hidden by default, matching ChatMessage.\n */\n\nimport React from \"react\";\nimport type { ChatTypingIndicatorProps } from \"../Chat.types\";\nimport styles from \"../Chat.module.css\";\n\nexport const ChatTypingIndicator: React.FC<ChatTypingIndicatorProps> = ({\n label = \"Generating response\",\n className,\n ...rest\n}) => {\n return (\n <div\n className={[styles.message, styles.messageAssistant, className]\n .filter(Boolean)\n .join(\" \")}\n role=\"status\"\n aria-live=\"polite\"\n aria-label={label}\n {...rest}\n >\n <div className={styles.messageContent}>\n <div\n className={[\n styles.messageBubble,\n styles.messageBubbleAssistant,\n styles.thinkingBubble,\n ].join(\" \")}\n >\n <span className={styles.thinkingSpinner} />\n </div>\n </div>\n </div>\n );\n};\n\nChatTypingIndicator.displayName = \"ChatTypingIndicator\";\n"],"names":["ChatTypingIndicator","label","className","rest","jsx","styles"],"mappings":"iJAeaA,EAA0D,CAAC,CACtE,MAAAC,EAAQ,sBACR,UAAAC,EACA,GAAGC,CACL,IAEIC,EAAAA,IAAC,MAAA,CACC,UAAW,CAACC,EAAAA,QAAO,QAASA,EAAAA,QAAO,iBAAkBH,CAAS,EAC3D,OAAO,OAAO,EACd,KAAK,GAAG,EACX,KAAK,SACL,YAAU,SACV,aAAYD,EACX,GAAGE,EAEJ,SAAAC,EAAAA,IAAC,MAAA,CAAI,UAAWC,UAAO,eACrB,SAAAD,EAAAA,IAAC,MAAA,CACC,UAAW,CACTC,EAAAA,QAAO,cACPA,EAAAA,QAAO,uBACPA,UAAO,cAAA,EACP,KAAK,GAAG,EAEV,SAAAD,EAAAA,IAAC,OAAA,CAAK,UAAWC,EAAAA,QAAO,eAAA,CAAiB,CAAA,CAAA,CAC3C,CACF,CAAA,CAAA,EAKNL,EAAoB,YAAc"}
package/dist/index121.mjs CHANGED
@@ -1,47 +1,32 @@
1
- import { jsxs as p, jsx as s } from "react/jsx-runtime";
2
- import { forwardRef as f } from "react";
3
- import { ArrowDown as u } from "lucide-react";
4
- import { useAutoScroll as g } from "./index84.mjs";
5
- import e from "./index119.mjs";
6
- import { Button as h } from "./index14.mjs";
7
- const B = f(
8
- ({ children: r, autoScroll: a = !0, className: l, ...i }, o) => {
9
- const { scrollRef: m, isAtBottom: n, scrollToBottom: c } = g({
10
- enabled: a
11
- });
12
- return /* @__PURE__ */ p(
1
+ import { jsx as s } from "react/jsx-runtime";
2
+ import e from "./index116.mjs";
3
+ const t = ({
4
+ label: a = "Generating response",
5
+ className: i,
6
+ ...n
7
+ }) => /* @__PURE__ */ s(
8
+ "div",
9
+ {
10
+ className: [e.message, e.messageAssistant, i].filter(Boolean).join(" "),
11
+ role: "status",
12
+ "aria-live": "polite",
13
+ "aria-label": a,
14
+ ...n,
15
+ children: /* @__PURE__ */ s("div", { className: e.messageContent, children: /* @__PURE__ */ s(
13
16
  "div",
14
17
  {
15
- ref: (t) => {
16
- m.current = t, typeof o == "function" ? o(t) : o && (o.current = t);
17
- },
18
- className: [e.messages, l].filter(Boolean).join(" "),
19
- role: "log",
20
- "aria-live": "polite",
21
- "aria-label": "Chat messages",
22
- "aria-relevant": "additions",
23
- ...i,
24
- children: [
25
- /* @__PURE__ */ s("div", { className: e.messagesInner, children: r }),
26
- !n && /* @__PURE__ */ s("div", { className: e.scrollToBottomWrapper, children: /* @__PURE__ */ s(
27
- h,
28
- {
29
- variant: "secondary",
30
- size: "sm",
31
- iconOnly: !0,
32
- icon: /* @__PURE__ */ s(u, { size: 18 }),
33
- onClick: c,
34
- "aria-label": "Scroll to latest messages",
35
- className: e.scrollToBottomButton
36
- }
37
- ) })
38
- ]
18
+ className: [
19
+ e.messageBubble,
20
+ e.messageBubbleAssistant,
21
+ e.thinkingBubble
22
+ ].join(" "),
23
+ children: /* @__PURE__ */ s("span", { className: e.thinkingSpinner })
39
24
  }
40
- );
25
+ ) })
41
26
  }
42
27
  );
43
- B.displayName = "ChatMessages";
28
+ t.displayName = "ChatTypingIndicator";
44
29
  export {
45
- B as ChatMessages
30
+ t as ChatTypingIndicator
46
31
  };
47
32
  //# sourceMappingURL=index121.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index121.mjs","sources":["../src/components/Chat/components/ChatMessages.tsx"],"sourcesContent":["/**\n * ChatMessages Component\n *\n * Scrollable container for chat messages with auto-scroll support\n * and accessibility features.\n */\n\nimport React, { forwardRef } from \"react\";\nimport { ArrowDown } from \"lucide-react\";\nimport type { ChatMessagesProps } from \"../Chat.types\";\nimport { useAutoScroll } from \"../hooks/useAutoScroll\";\nimport { Button } from \"../../Button\";\nimport styles from \"../Chat.module.css\";\n\nexport const ChatMessages = forwardRef<HTMLDivElement, ChatMessagesProps>(\n ({ children, autoScroll = true, className, ...rest }, forwardedRef) => {\n const { scrollRef, isAtBottom, scrollToBottom } = useAutoScroll({\n enabled: autoScroll,\n });\n\n // Combine refs\n const handleRef = (node: HTMLDivElement | null) => {\n // Set internal ref\n (scrollRef as React.MutableRefObject<HTMLDivElement | null>).current =\n node;\n\n // Forward ref\n if (typeof forwardedRef === \"function\") {\n forwardedRef(node);\n } else if (forwardedRef) {\n forwardedRef.current = node;\n }\n };\n\n return (\n <div\n ref={handleRef}\n className={[styles.messages, className].filter(Boolean).join(\" \")}\n role=\"log\"\n aria-live=\"polite\"\n aria-label=\"Chat messages\"\n aria-relevant=\"additions\"\n {...rest}\n >\n <div className={styles.messagesInner}>{children}</div>\n\n {/* Scroll to bottom button (shown when not at bottom) */}\n {!isAtBottom && (\n <div className={styles.scrollToBottomWrapper}>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n iconOnly\n icon={<ArrowDown size={18} />}\n onClick={scrollToBottom}\n aria-label=\"Scroll to latest messages\"\n className={styles.scrollToBottomButton}\n />\n </div>\n )}\n </div>\n );\n },\n);\n\nChatMessages.displayName = \"ChatMessages\";\n"],"names":["ChatMessages","forwardRef","children","autoScroll","className","rest","forwardedRef","scrollRef","isAtBottom","scrollToBottom","useAutoScroll","jsxs","node","styles","jsx","Button","ArrowDown"],"mappings":";;;;;;AAcO,MAAMA,IAAeC;AAAA,EAC1B,CAAC,EAAE,UAAAC,GAAU,YAAAC,IAAa,IAAM,WAAAC,GAAW,GAAGC,EAAA,GAAQC,MAAiB;AACrE,UAAM,EAAE,WAAAC,GAAW,YAAAC,GAAY,gBAAAC,EAAA,IAAmBC,EAAc;AAAA,MAC9D,SAASP;AAAA,IAAA,CACV;AAgBD,WACE,gBAAAQ;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAfc,CAACC,MAAgC;AAEhD,UAAAL,EAA4D,UAC3DK,GAGE,OAAON,KAAiB,aAC1BA,EAAaM,CAAI,IACRN,MACTA,EAAa,UAAUM;AAAA,QAE3B;AAAA,QAKI,WAAW,CAACC,EAAO,UAAUT,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,QAChE,MAAK;AAAA,QACL,aAAU;AAAA,QACV,cAAW;AAAA,QACX,iBAAc;AAAA,QACb,GAAGC;AAAA,QAEJ,UAAA;AAAA,UAAA,gBAAAS,EAAC,OAAA,EAAI,WAAWD,EAAO,eAAgB,UAAAX,GAAS;AAAA,UAG/C,CAACM,KACA,gBAAAM,EAAC,OAAA,EAAI,WAAWD,EAAO,uBACrB,UAAA,gBAAAC;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,UAAQ;AAAA,cACR,MAAM,gBAAAD,EAACE,GAAA,EAAU,MAAM,GAAA,CAAI;AAAA,cAC3B,SAASP;AAAA,cACT,cAAW;AAAA,cACX,WAAWI,EAAO;AAAA,YAAA;AAAA,UAAA,EACpB,CACF;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAIR;AACF;AAEAb,EAAa,cAAc;"}
1
+ {"version":3,"file":"index121.mjs","sources":["../src/components/Chat/components/ChatTypingIndicator.tsx"],"sourcesContent":["/**\n * ChatTypingIndicator Component\n *\n * Circular processing indicator shown before content generation begins.\n * Intentionally abstract — communicates activity without representing\n * specific progress, reducing temporal expectations.\n *\n * Renders in assistant-message layout so the transition to streaming\n * content feels seamless. Avatar hidden by default, matching ChatMessage.\n */\n\nimport React from \"react\";\nimport type { ChatTypingIndicatorProps } from \"../Chat.types\";\nimport styles from \"../Chat.module.css\";\n\nexport const ChatTypingIndicator: React.FC<ChatTypingIndicatorProps> = ({\n label = \"Generating response\",\n className,\n ...rest\n}) => {\n return (\n <div\n className={[styles.message, styles.messageAssistant, className]\n .filter(Boolean)\n .join(\" \")}\n role=\"status\"\n aria-live=\"polite\"\n aria-label={label}\n {...rest}\n >\n <div className={styles.messageContent}>\n <div\n className={[\n styles.messageBubble,\n styles.messageBubbleAssistant,\n styles.thinkingBubble,\n ].join(\" \")}\n >\n <span className={styles.thinkingSpinner} />\n </div>\n </div>\n </div>\n );\n};\n\nChatTypingIndicator.displayName = \"ChatTypingIndicator\";\n"],"names":["ChatTypingIndicator","label","className","rest","jsx","styles"],"mappings":";;AAeO,MAAMA,IAA0D,CAAC;AAAA,EACtE,OAAAC,IAAQ;AAAA,EACR,WAAAC;AAAA,EACA,GAAGC;AACL,MAEI,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,WAAW,CAACC,EAAO,SAASA,EAAO,kBAAkBH,CAAS,EAC3D,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,IACX,MAAK;AAAA,IACL,aAAU;AAAA,IACV,cAAYD;AAAA,IACX,GAAGE;AAAA,IAEJ,UAAA,gBAAAC,EAAC,OAAA,EAAI,WAAWC,EAAO,gBACrB,UAAA,gBAAAD;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW;AAAA,UACTC,EAAO;AAAA,UACPA,EAAO;AAAA,UACPA,EAAO;AAAA,QAAA,EACP,KAAK,GAAG;AAAA,QAEV,UAAA,gBAAAD,EAAC,QAAA,EAAK,WAAWC,EAAO,gBAAA,CAAiB;AAAA,MAAA;AAAA,IAAA,EAC3C,CACF;AAAA,EAAA;AAAA;AAKNL,EAAoB,cAAc;"}
package/dist/index122.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),t=require("lucide-react"),p=require("./index126.cjs"),y=require("./index131.cjs"),e=require("./index119.cjs"),R=a=>a?new Intl.DateTimeFormat("en-US",{hour:"numeric",minute:"2-digit",hour12:!0}).format(a):"",S=a=>{switch(a){case"sending":return s.jsx(t.Clock,{size:12});case"sent":return s.jsx(t.Check,{size:12});case"error":return s.jsx(t.AlertCircle,{size:12});default:return null}},b=({role:a,content:u,timestamp:m,status:i,attachments:d,avatar:C,showAvatar:N,actions:c,isStreaming:k,onImageClick:f,onRetry:g,reaction:l,onReaction:o,children:j,className:h,...x})=>{const r=a==="user",A=a==="system",v=a==="assistant",B=N??!1;return A?s.jsx("div",{className:[e.default.message,h].filter(Boolean).join(" "),role:"listitem",...x,children:s.jsx("div",{className:e.default.messageContent,children:s.jsx("div",{className:e.default.messageBubbleSystem,children:j||u})})}):s.jsxs("div",{className:[e.default.message,r&&e.default.messageUser,v&&e.default.messageAssistant,h].filter(Boolean).join(" "),role:"listitem",...x,children:[B&&s.jsx("div",{className:[e.default.messageAvatar,r?e.default.messageAvatarUser:e.default.messageAvatarAssistant].filter(Boolean).join(" "),"aria-hidden":"true",children:C||(r?s.jsx(t.User,{size:18}):s.jsx(t.Bot,{size:18}))}),s.jsxs("div",{className:e.default.messageContent,children:[s.jsxs("div",{className:[e.default.messageBubble,r?e.default.messageBubbleUser:e.default.messageBubbleAssistant].filter(Boolean).join(" "),children:[j||s.jsx(p.ChatMarkdown,{content:u,className:r?e.default.markdownUser:void 0}),k&&s.jsx("span",{className:e.default.streamingCursor})]}),d&&d.length>0&&s.jsx("div",{className:e.default.messageAttachments,children:d.map(n=>s.jsx(y.ChatAttachment,{attachment:n,onClick:n.type==="image"&&f?()=>f(n):void 0},n.id))}),s.jsxs("div",{className:e.default.messageFooter,children:[m&&s.jsx("span",{className:e.default.messageTimestamp,children:R(m)}),i&&s.jsxs("span",{className:[e.default.messageStatus,i==="error"&&e.default.messageStatusError].filter(Boolean).join(" "),children:[S(i),i==="error"&&"Failed to send"]}),i==="error"&&g&&s.jsxs("button",{className:e.default.messageRetry,onClick:g,"aria-label":"Retry sending message",children:[s.jsx(t.RotateCcw,{size:12}),"Retry"]}),c&&s.jsx("div",{className:e.default.messageActions,children:c}),v&&o&&s.jsxs("div",{className:[e.default.messageReactions,l&&e.default.messageReactionsVisible].filter(Boolean).join(" "),children:[s.jsx("button",{className:[e.default.messageReactionButton,l==="like"&&e.default.messageReactionActive].filter(Boolean).join(" "),onClick:()=>o("like"),"aria-label":"Like this response","aria-pressed":l==="like",children:s.jsx(t.ThumbsUp,{size:14})}),s.jsx("button",{className:[e.default.messageReactionButton,l==="dislike"&&e.default.messageReactionActive].filter(Boolean).join(" "),onClick:()=>o("dislike"),"aria-label":"Dislike this response","aria-pressed":l==="dislike",children:s.jsx(t.ThumbsDown,{size:14})})]})]})]})]})};b.displayName="ChatMessage";exports.ChatMessage=b;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),n=require("react"),f=require("react-syntax-highlighter"),d=require("react-syntax-highlighter/dist/esm/styles/prism"),u=require("lucide-react"),o=require("./index116.cjs"),k=require("./index75.cjs"),b=t=>t?{js:"javascript",ts:"typescript",jsx:"jsx",tsx:"tsx",py:"python",rb:"ruby",sh:"bash",shell:"bash",yml:"yaml",md:"markdown"}[t.toLowerCase()]||t.toLowerCase():"text",h=({code:t,language:s,showLineNumbers:m=!1,showCopyButton:p=!0,maxHeight:y="400px",className:C,...x})=>{const[a,r]=n.useState(!1);let c="dark";try{c=k.useThemeContext().theme}catch{}const g=n.useCallback(async()=>{try{await navigator.clipboard.writeText(t),r(!0),setTimeout(()=>r(!1),2e3)}catch(l){console.error("Failed to copy code:",l)}},[t]),i=b(s),j=c==="light"?d.oneLight:d.oneDark;return e.jsxs("div",{className:[o.default.codeBlock,C].filter(Boolean).join(" "),...x,children:[e.jsxs("div",{className:o.default.codeBlockHeader,children:[e.jsx("span",{className:o.default.codeBlockLanguage,children:i}),p&&e.jsx("button",{className:[o.default.codeBlockCopy,a&&o.default.codeBlockCopied].filter(Boolean).join(" "),onClick:g,"aria-label":a?"Copied!":"Copy code",children:a?e.jsxs(e.Fragment,{children:[e.jsx(u.Check,{size:14}),"Copied!"]}):e.jsxs(e.Fragment,{children:[e.jsx(u.Copy,{size:14}),"Copy"]})})]}),e.jsx("div",{className:o.default.codeBlockContent,style:{maxHeight:y},children:e.jsx(f.Prism,{language:i,style:j,showLineNumbers:m,customStyle:{margin:0,padding:0,background:"transparent",fontSize:"inherit",lineHeight:"inherit"},codeTagProps:{style:{fontFamily:"var(--font-mono)"}},children:t})})]})};h.displayName="ChatCodeBlock";exports.ChatCodeBlock=h;
2
2
  //# sourceMappingURL=index122.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index122.cjs","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.cjs","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":"2TAmBMA,EAAqBC,GACpBA,EAEmC,CACtC,GAAI,aACJ,GAAI,aACJ,IAAK,MACL,IAAK,MACL,GAAI,SACJ,GAAI,OACJ,GAAI,OACJ,MAAO,OACP,IAAK,OACL,GAAI,UAAA,EAGSA,EAAK,YAAA,CAAa,GAAKA,EAAK,YAAA,EAfzB,OAkBPC,EAA8C,CAAC,CAC1D,KAAAC,EACA,SAAAC,EACA,gBAAAC,EAAkB,GAClB,eAAAC,EAAiB,GACjB,UAAAC,EAAY,QACZ,UAAAC,EACA,GAAGC,CACL,IAAM,CACJ,KAAM,CAACC,EAAQC,CAAS,EAAIC,EAAAA,SAAS,EAAK,EAG1C,IAAIC,EAAiC,OACrC,GAAI,CAEFA,EADYC,EAAAA,gBAAA,EACO,KACrB,MAAQ,CAER,CAEA,MAAMC,EAAaC,EAAAA,YAAY,SAAY,CACzC,GAAI,CACF,MAAM,UAAU,UAAU,UAAUb,CAAI,EACxCQ,EAAU,EAAI,EACd,WAAW,IAAMA,EAAU,EAAK,EAAG,GAAI,CACzC,OAASM,EAAK,CACZ,QAAQ,MAAM,uBAAwBA,CAAG,CAC3C,CACF,EAAG,CAACd,CAAI,CAAC,EAEHe,EAAiBlB,EAAkBI,CAAQ,EAC3Ce,EAAiBN,IAAiB,QAAUO,EAAAA,SAAWC,EAAAA,QAE7D,OACEC,EAAAA,KAAC,MAAA,CACC,UAAW,CAACC,UAAO,UAAWf,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAChE,GAAGC,EAGJ,SAAA,CAAAa,EAAAA,KAAC,MAAA,CAAI,UAAWC,EAAAA,QAAO,gBACrB,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAWD,EAAAA,QAAO,kBAAoB,SAAAL,EAAe,EAC1DZ,GACCkB,EAAAA,IAAC,SAAA,CACC,UAAW,CAACD,EAAAA,QAAO,cAAeb,GAAUa,EAAAA,QAAO,eAAe,EAC/D,OAAO,OAAO,EACd,KAAK,GAAG,EACX,QAASR,EACT,aAAYL,EAAS,UAAY,YAEhC,WACCY,EAAAA,KAAAG,EAAAA,SAAA,CACE,SAAA,CAAAD,EAAAA,IAACE,EAAAA,MAAA,CAAM,KAAM,EAAA,CAAI,EAAE,SAAA,CAAA,CAErB,EAEAJ,EAAAA,KAAAG,EAAAA,SAAA,CACE,SAAA,CAAAD,EAAAA,IAACG,EAAAA,KAAA,CAAK,KAAM,EAAA,CAAI,EAAE,MAAA,CAAA,CAEpB,CAAA,CAAA,CAEJ,EAEJ,EAGAH,MAAC,OAAI,UAAWD,EAAAA,QAAO,iBAAkB,MAAO,CAAE,UAAAhB,GAChD,SAAAiB,EAAAA,IAACI,EAAAA,MAAA,CACC,SAAUV,EACV,MAAOC,EACP,gBAAAd,EACA,YAAa,CACX,OAAQ,EACR,QAAS,EACT,WAAY,cACZ,SAAU,UACV,WAAY,SAAA,EAEd,aAAc,CACZ,MAAO,CACL,WAAY,kBAAA,CACd,EAGD,SAAAF,CAAA,CAAA,CACH,CACF,CAAA,CAAA,CAAA,CAGN,EAEAD,EAAc,YAAc"}