igniteui-webcomponents 6.2.0 → 6.3.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (323) hide show
  1. package/components/accordion/accordion.js +1 -4
  2. package/components/accordion/accordion.js.map +1 -1
  3. package/components/button/themes/button/button.base.css.js +1 -1
  4. package/components/button/themes/button/button.base.css.js.map +1 -1
  5. package/components/button/themes/button/shared/button.common.css.js +1 -1
  6. package/components/button/themes/button/shared/button.common.css.js.map +1 -1
  7. package/components/button/themes/button/shared/button.fluent.css.js +1 -1
  8. package/components/button/themes/button/shared/button.fluent.css.js.map +1 -1
  9. package/components/button/themes/button/shared/button.indigo.css.js +1 -1
  10. package/components/button/themes/button/shared/button.indigo.css.js.map +1 -1
  11. package/components/button/themes/icon-button/icon-button.base.css.js +1 -1
  12. package/components/button/themes/icon-button/icon-button.base.css.js.map +1 -1
  13. package/components/button/themes/icon-button/shared/icon-button.bootstrap.css.js +1 -1
  14. package/components/button/themes/icon-button/shared/icon-button.bootstrap.css.js.map +1 -1
  15. package/components/button/themes/icon-button/shared/icon-button.fluent.css.js +1 -1
  16. package/components/button/themes/icon-button/shared/icon-button.fluent.css.js.map +1 -1
  17. package/components/button/themes/icon-button/shared/icon-button.indigo.css.js +1 -1
  18. package/components/button/themes/icon-button/shared/icon-button.indigo.css.js.map +1 -1
  19. package/components/button/themes/icon-button/shared/icon-button.material.css.js +1 -1
  20. package/components/button/themes/icon-button/shared/icon-button.material.css.js.map +1 -1
  21. package/components/button-group/themes/shared/button/button.bootstrap.css.js +1 -1
  22. package/components/button-group/themes/shared/button/button.bootstrap.css.js.map +1 -1
  23. package/components/button-group/themes/shared/button/button.common.css.js +1 -1
  24. package/components/button-group/themes/shared/button/button.common.css.js.map +1 -1
  25. package/components/button-group/themes/shared/button/button.indigo.css.js +1 -1
  26. package/components/button-group/themes/shared/button/button.indigo.css.js.map +1 -1
  27. package/components/calendar/days-view/days-view.js +1 -3
  28. package/components/calendar/days-view/days-view.js.map +1 -1
  29. package/components/calendar/months-view/months-view.js +1 -3
  30. package/components/calendar/months-view/months-view.js.map +1 -1
  31. package/components/calendar/themes/year-month-view.base.css.js +1 -1
  32. package/components/calendar/themes/year-month-view.base.css.js.map +1 -1
  33. package/components/calendar/years-view/years-view.js +1 -3
  34. package/components/calendar/years-view/years-view.js.map +1 -1
  35. package/components/carousel/carousel.js +0 -3
  36. package/components/carousel/carousel.js.map +1 -1
  37. package/components/chat/assets/file.png +0 -0
  38. package/components/chat/assets/json.png +0 -0
  39. package/components/chat/assets/link.png +0 -0
  40. package/components/chat/chat-input.d.ts +54 -0
  41. package/components/chat/chat-input.js +137 -0
  42. package/components/chat/chat-input.js.map +1 -0
  43. package/components/chat/chat-message-list.d.ts +70 -0
  44. package/components/chat/chat-message-list.js +89 -0
  45. package/components/chat/chat-message-list.js.map +1 -0
  46. package/components/chat/chat-message.d.ts +47 -0
  47. package/components/chat/chat-message.js +70 -0
  48. package/components/chat/chat-message.js.map +1 -0
  49. package/components/chat/chat-renderer.d.ts +14 -0
  50. package/components/chat/chat-renderer.js +39 -0
  51. package/components/chat/chat-renderer.js.map +1 -0
  52. package/components/chat/chat-state.d.ts +250 -0
  53. package/components/chat/chat-state.js +538 -0
  54. package/components/chat/chat-state.js.map +1 -0
  55. package/components/chat/chat.d.ts +177 -0
  56. package/components/chat/chat.js +250 -0
  57. package/components/chat/chat.js.map +1 -0
  58. package/components/chat/markdown-renderer.d.ts +72 -0
  59. package/components/chat/markdown-renderer.js +71 -0
  60. package/components/chat/markdown-renderer.js.map +1 -0
  61. package/components/chat/message-attachments.d.ts +38 -0
  62. package/components/chat/message-attachments.js +49 -0
  63. package/components/chat/message-attachments.js.map +1 -0
  64. package/components/chat/plain-text-renderer.d.ts +15 -0
  65. package/components/chat/plain-text-renderer.js +7 -0
  66. package/components/chat/plain-text-renderer.js.map +1 -0
  67. package/components/chat/themes/chat.base.css.d.ts +1 -0
  68. package/components/chat/themes/chat.base.css.js +3 -0
  69. package/components/chat/themes/chat.base.css.js.map +1 -0
  70. package/components/chat/themes/dark/chat.bootstrap.css.d.ts +1 -0
  71. package/components/chat/themes/dark/chat.bootstrap.css.js +3 -0
  72. package/components/chat/themes/dark/chat.bootstrap.css.js.map +1 -0
  73. package/components/chat/themes/dark/chat.fluent.css.d.ts +1 -0
  74. package/components/chat/themes/dark/chat.fluent.css.js +3 -0
  75. package/components/chat/themes/dark/chat.fluent.css.js.map +1 -0
  76. package/components/chat/themes/dark/chat.indigo.css.d.ts +1 -0
  77. package/components/chat/themes/dark/chat.indigo.css.js +3 -0
  78. package/components/chat/themes/dark/chat.indigo.css.js.map +1 -0
  79. package/components/chat/themes/dark/chat.material.css.d.ts +1 -0
  80. package/components/chat/themes/dark/chat.material.css.js +3 -0
  81. package/components/chat/themes/dark/chat.material.css.js.map +1 -0
  82. package/components/chat/themes/input.base.css.d.ts +1 -0
  83. package/components/chat/themes/input.base.css.js +3 -0
  84. package/components/chat/themes/input.base.css.js.map +1 -0
  85. package/components/chat/themes/input.d.ts +2 -0
  86. package/components/chat/themes/input.js +35 -0
  87. package/components/chat/themes/input.js.map +1 -0
  88. package/components/chat/themes/light/chat.bootstrap.css.d.ts +1 -0
  89. package/components/chat/themes/light/chat.bootstrap.css.js +3 -0
  90. package/components/chat/themes/light/chat.bootstrap.css.js.map +1 -0
  91. package/components/chat/themes/light/chat.fluent.css.d.ts +1 -0
  92. package/components/chat/themes/light/chat.fluent.css.js +3 -0
  93. package/components/chat/themes/light/chat.fluent.css.js.map +1 -0
  94. package/components/chat/themes/light/chat.indigo.css.d.ts +1 -0
  95. package/components/chat/themes/light/chat.indigo.css.js +3 -0
  96. package/components/chat/themes/light/chat.indigo.css.js.map +1 -0
  97. package/components/chat/themes/light/chat.material.css.d.ts +1 -0
  98. package/components/chat/themes/light/chat.material.css.js +3 -0
  99. package/components/chat/themes/light/chat.material.css.js.map +1 -0
  100. package/components/chat/themes/light/chat.shared.css.d.ts +1 -0
  101. package/components/chat/themes/light/chat.shared.css.js +3 -0
  102. package/components/chat/themes/light/chat.shared.css.js.map +1 -0
  103. package/components/chat/themes/message-attachments.base.css.d.ts +1 -0
  104. package/components/chat/themes/message-attachments.base.css.js +3 -0
  105. package/components/chat/themes/message-attachments.base.css.js.map +1 -0
  106. package/components/chat/themes/message-list.base.css.d.ts +1 -0
  107. package/components/chat/themes/message-list.base.css.js +3 -0
  108. package/components/chat/themes/message-list.base.css.js.map +1 -0
  109. package/components/chat/themes/message.base.css.d.ts +1 -0
  110. package/components/chat/themes/message.base.css.js +3 -0
  111. package/components/chat/themes/message.base.css.js.map +1 -0
  112. package/components/chat/themes/message.d.ts +2 -0
  113. package/components/chat/themes/message.js +28 -0
  114. package/components/chat/themes/message.js.map +1 -0
  115. package/components/chat/themes/shared/chat-message/chat-message.bootstrap.css.d.ts +1 -0
  116. package/components/chat/themes/shared/chat-message/chat-message.bootstrap.css.js +3 -0
  117. package/components/chat/themes/shared/chat-message/chat-message.bootstrap.css.js.map +1 -0
  118. package/components/chat/themes/shared/chat-message/chat-message.common.css.d.ts +1 -0
  119. package/components/chat/themes/shared/chat-message/chat-message.common.css.js +3 -0
  120. package/components/chat/themes/shared/chat-message/chat-message.common.css.js.map +1 -0
  121. package/components/chat/themes/shared/chat-message/chat-message.fluent.css.d.ts +1 -0
  122. package/components/chat/themes/shared/chat-message/chat-message.fluent.css.js +3 -0
  123. package/components/chat/themes/shared/chat-message/chat-message.fluent.css.js.map +1 -0
  124. package/components/chat/themes/shared/chat-message/chat-message.indigo.css.d.ts +1 -0
  125. package/components/chat/themes/shared/chat-message/chat-message.indigo.css.js +3 -0
  126. package/components/chat/themes/shared/chat-message/chat-message.indigo.css.js.map +1 -0
  127. package/components/chat/themes/shared/chat.bootstrap.css.d.ts +1 -0
  128. package/components/chat/themes/shared/chat.bootstrap.css.js +3 -0
  129. package/components/chat/themes/shared/chat.bootstrap.css.js.map +1 -0
  130. package/components/chat/themes/shared/chat.common.css.d.ts +1 -0
  131. package/components/chat/themes/shared/chat.common.css.js +3 -0
  132. package/components/chat/themes/shared/chat.common.css.js.map +1 -0
  133. package/components/chat/themes/shared/chat.indigo.css.d.ts +1 -0
  134. package/components/chat/themes/shared/chat.indigo.css.js +3 -0
  135. package/components/chat/themes/shared/chat.indigo.css.js.map +1 -0
  136. package/components/chat/themes/shared/input/input.bootstrap.css.d.ts +1 -0
  137. package/components/chat/themes/shared/input/input.bootstrap.css.js +3 -0
  138. package/components/chat/themes/shared/input/input.bootstrap.css.js.map +1 -0
  139. package/components/chat/themes/shared/input/input.common.css.d.ts +1 -0
  140. package/components/chat/themes/shared/input/input.common.css.js +3 -0
  141. package/components/chat/themes/shared/input/input.common.css.js.map +1 -0
  142. package/components/chat/themes/shared/input/input.fluent.css.d.ts +1 -0
  143. package/components/chat/themes/shared/input/input.fluent.css.js +3 -0
  144. package/components/chat/themes/shared/input/input.fluent.css.js.map +1 -0
  145. package/components/chat/themes/shared/input/input.indigo.css.d.ts +1 -0
  146. package/components/chat/themes/shared/input/input.indigo.css.js +3 -0
  147. package/components/chat/themes/shared/input/input.indigo.css.js.map +1 -0
  148. package/components/chat/themes/shared/input/input.material.css.d.ts +1 -0
  149. package/components/chat/themes/shared/input/input.material.css.js +3 -0
  150. package/components/chat/themes/shared/input/input.material.css.js.map +1 -0
  151. package/components/chat/themes/shared/message-attachments.common.css.d.ts +1 -0
  152. package/components/chat/themes/shared/message-attachments.common.css.js +3 -0
  153. package/components/chat/themes/shared/message-attachments.common.css.js.map +1 -0
  154. package/components/chat/themes/shared/message-list.common.css.d.ts +1 -0
  155. package/components/chat/themes/shared/message-list.common.css.js +3 -0
  156. package/components/chat/themes/shared/message-list.common.css.js.map +1 -0
  157. package/components/chat/themes/themes.d.ts +2 -0
  158. package/components/chat/themes/themes.js +48 -0
  159. package/components/chat/themes/themes.js.map +1 -0
  160. package/components/chat/types.d.ts +244 -0
  161. package/components/chat/types.js +15 -0
  162. package/components/chat/types.js.map +1 -0
  163. package/components/checkbox/themes/dark/switch/switch.bootstrap.css.js +1 -1
  164. package/components/checkbox/themes/dark/switch/switch.bootstrap.css.js.map +1 -1
  165. package/components/checkbox/themes/dark/switch/switch.fluent.css.js +1 -1
  166. package/components/checkbox/themes/dark/switch/switch.fluent.css.js.map +1 -1
  167. package/components/checkbox/themes/dark/switch/switch.indigo.css.js +1 -1
  168. package/components/checkbox/themes/dark/switch/switch.indigo.css.js.map +1 -1
  169. package/components/checkbox/themes/dark/switch/switch.material.css.js +1 -1
  170. package/components/checkbox/themes/dark/switch/switch.material.css.js.map +1 -1
  171. package/components/checkbox/themes/light/switch/switch.bootstrap.css.js +1 -1
  172. package/components/checkbox/themes/light/switch/switch.bootstrap.css.js.map +1 -1
  173. package/components/checkbox/themes/light/switch/switch.fluent.css.js +1 -1
  174. package/components/checkbox/themes/light/switch/switch.fluent.css.js.map +1 -1
  175. package/components/checkbox/themes/light/switch/switch.indigo.css.js +1 -1
  176. package/components/checkbox/themes/light/switch/switch.indigo.css.js.map +1 -1
  177. package/components/checkbox/themes/light/switch/switch.material.css.js +1 -1
  178. package/components/checkbox/themes/light/switch/switch.material.css.js.map +1 -1
  179. package/components/checkbox/themes/shared/switch/switch.bootstrap.css.js +1 -1
  180. package/components/checkbox/themes/shared/switch/switch.bootstrap.css.js.map +1 -1
  181. package/components/checkbox/themes/shared/switch/switch.common.css.js +1 -1
  182. package/components/checkbox/themes/shared/switch/switch.common.css.js.map +1 -1
  183. package/components/checkbox/themes/shared/switch/switch.fluent.css.js +1 -1
  184. package/components/checkbox/themes/shared/switch/switch.fluent.css.js.map +1 -1
  185. package/components/checkbox/themes/shared/switch/switch.indigo.css.js +1 -1
  186. package/components/checkbox/themes/shared/switch/switch.indigo.css.js.map +1 -1
  187. package/components/chip/themes/chip.base.css.js +1 -1
  188. package/components/chip/themes/chip.base.css.js.map +1 -1
  189. package/components/chip/themes/shared/chip.indigo.css.js +1 -1
  190. package/components/chip/themes/shared/chip.indigo.css.js.map +1 -1
  191. package/components/combo/controllers/navigation.js +1 -1
  192. package/components/combo/controllers/navigation.js.map +1 -1
  193. package/components/combo/themes/combo-item.base.css.js +1 -1
  194. package/components/combo/themes/combo-item.base.css.js.map +1 -1
  195. package/components/combo/themes/combo.base.css.js +1 -1
  196. package/components/combo/themes/combo.base.css.js.map +1 -1
  197. package/components/combo/themes/shared/combo.bootstrap.css.js +1 -1
  198. package/components/combo/themes/shared/combo.bootstrap.css.js.map +1 -1
  199. package/components/combo/themes/shared/combo.common.css.js +1 -1
  200. package/components/combo/themes/shared/combo.common.css.js.map +1 -1
  201. package/components/combo/themes/shared/combo.fluent.css.js +1 -1
  202. package/components/combo/themes/shared/combo.fluent.css.js.map +1 -1
  203. package/components/combo/themes/shared/combo.indigo.css.js +1 -1
  204. package/components/combo/themes/shared/combo.indigo.css.js.map +1 -1
  205. package/components/combo/themes/shared/combo.material.css.js +1 -1
  206. package/components/combo/themes/shared/combo.material.css.js.map +1 -1
  207. package/components/common/context.d.ts +5 -1
  208. package/components/common/context.js +2 -1
  209. package/components/common/context.js.map +1 -1
  210. package/components/common/controllers/key-bindings.js +4 -3
  211. package/components/common/controllers/key-bindings.js.map +1 -1
  212. package/components/common/definitions/defineAllComponents.js +2 -0
  213. package/components/common/definitions/defineAllComponents.js.map +1 -1
  214. package/components/common/i18n/chat.resources.d.ts +8 -0
  215. package/components/common/i18n/chat.resources.js +8 -0
  216. package/components/common/i18n/chat.resources.js.map +1 -0
  217. package/components/common/util.d.ts +14 -0
  218. package/components/common/util.js +51 -1
  219. package/components/common/util.js.map +1 -1
  220. package/components/date-picker/date-picker.js +2 -2
  221. package/components/date-picker/date-picker.js.map +1 -1
  222. package/components/date-picker/themes/shared/date-picker.common.css.js +1 -1
  223. package/components/date-picker/themes/shared/date-picker.common.css.js.map +1 -1
  224. package/components/date-range-picker/date-range-picker.js +0 -1
  225. package/components/date-range-picker/date-range-picker.js.map +1 -1
  226. package/components/date-range-picker/themes/shared/date-range-picker.bootstrap.css.js +1 -1
  227. package/components/date-range-picker/themes/shared/date-range-picker.bootstrap.css.js.map +1 -1
  228. package/components/date-range-picker/themes/shared/date-range-picker.common.css.js +1 -1
  229. package/components/date-range-picker/themes/shared/date-range-picker.common.css.js.map +1 -1
  230. package/components/date-time-input/date-time-input.js +1 -1
  231. package/components/date-time-input/date-time-input.js.map +1 -1
  232. package/components/dropdown/themes/dropdown-group.base.css.js +1 -1
  233. package/components/dropdown/themes/dropdown-group.base.css.js.map +1 -1
  234. package/components/dropdown/themes/dropdown-item.base.css.js +1 -1
  235. package/components/dropdown/themes/dropdown-item.base.css.js.map +1 -1
  236. package/components/dropdown/themes/shared/group/dropdown-group.fluent.css.js +1 -1
  237. package/components/dropdown/themes/shared/group/dropdown-group.fluent.css.js.map +1 -1
  238. package/components/dropdown/themes/shared/header/dropdown-header.common.css.js +1 -1
  239. package/components/dropdown/themes/shared/header/dropdown-header.common.css.js.map +1 -1
  240. package/components/dropdown/themes/shared/header/dropdown-header.indigo.css.js +1 -1
  241. package/components/dropdown/themes/shared/header/dropdown-header.indigo.css.js.map +1 -1
  242. package/components/dropdown/themes/shared/item/dropdown-item.indigo.css.js +1 -1
  243. package/components/dropdown/themes/shared/item/dropdown-item.indigo.css.js.map +1 -1
  244. package/components/expansion-panel/expansion-panel.js +0 -1
  245. package/components/expansion-panel/expansion-panel.js.map +1 -1
  246. package/components/expansion-panel/themes/expansion-panel.base.css.js +1 -1
  247. package/components/expansion-panel/themes/expansion-panel.base.css.js.map +1 -1
  248. package/components/expansion-panel/themes/shared/expansion-panel.indigo.css.js +1 -1
  249. package/components/expansion-panel/themes/shared/expansion-panel.indigo.css.js.map +1 -1
  250. package/components/file-input/themes/shared/file-input.bootstrap.css.js +1 -1
  251. package/components/file-input/themes/shared/file-input.bootstrap.css.js.map +1 -1
  252. package/components/input/themes/shared/input.bootstrap.css.js +1 -1
  253. package/components/input/themes/shared/input.bootstrap.css.js.map +1 -1
  254. package/components/input/themes/shared/input.common.css.js +1 -1
  255. package/components/input/themes/shared/input.common.css.js.map +1 -1
  256. package/components/input/themes/shared/input.fluent.css.js +1 -1
  257. package/components/input/themes/shared/input.fluent.css.js.map +1 -1
  258. package/components/input/themes/shared/input.indigo.css.js +1 -1
  259. package/components/input/themes/shared/input.indigo.css.js.map +1 -1
  260. package/components/input/themes/shared/input.material.css.js +1 -1
  261. package/components/input/themes/shared/input.material.css.js.map +1 -1
  262. package/components/list/themes/header.base.css.js +1 -1
  263. package/components/list/themes/header.base.css.js.map +1 -1
  264. package/components/list/themes/item.base.css.js +1 -1
  265. package/components/list/themes/item.base.css.js.map +1 -1
  266. package/components/list/themes/shared/header/list-header.indigo.css.js +1 -1
  267. package/components/list/themes/shared/header/list-header.indigo.css.js.map +1 -1
  268. package/components/list/themes/shared/item/list-item.indigo.css.js +1 -1
  269. package/components/list/themes/shared/item/list-item.indigo.css.js.map +1 -1
  270. package/components/rating/rating.js +0 -1
  271. package/components/rating/rating.js.map +1 -1
  272. package/components/select/themes/dark/select.bootstrap.css.js +1 -1
  273. package/components/select/themes/dark/select.bootstrap.css.js.map +1 -1
  274. package/components/select/themes/light/select.bootstrap.css.js +1 -1
  275. package/components/select/themes/light/select.bootstrap.css.js.map +1 -1
  276. package/components/select/themes/shared/select.bootstrap.css.js +1 -1
  277. package/components/select/themes/shared/select.bootstrap.css.js.map +1 -1
  278. package/components/select/themes/shared/select.common.css.js +1 -1
  279. package/components/select/themes/shared/select.common.css.js.map +1 -1
  280. package/components/select/themes/shared/select.material.css.js +1 -1
  281. package/components/select/themes/shared/select.material.css.js.map +1 -1
  282. package/components/slider/slider-base.js +0 -1
  283. package/components/slider/slider-base.js.map +1 -1
  284. package/components/tabs/tabs.js +0 -1
  285. package/components/tabs/tabs.js.map +1 -1
  286. package/components/textarea/themes/shared/textarea.bootstrap.css.js +1 -1
  287. package/components/textarea/themes/shared/textarea.bootstrap.css.js.map +1 -1
  288. package/components/textarea/themes/shared/textarea.common.css.js +1 -1
  289. package/components/textarea/themes/shared/textarea.common.css.js.map +1 -1
  290. package/components/textarea/themes/shared/textarea.fluent.css.js +1 -1
  291. package/components/textarea/themes/shared/textarea.fluent.css.js.map +1 -1
  292. package/components/textarea/themes/shared/textarea.indigo.css.js +1 -1
  293. package/components/textarea/themes/shared/textarea.indigo.css.js.map +1 -1
  294. package/components/textarea/themes/shared/textarea.material.css.js +1 -1
  295. package/components/textarea/themes/shared/textarea.material.css.js.map +1 -1
  296. package/components/textarea/themes/textarea.base.css.js +1 -1
  297. package/components/textarea/themes/textarea.base.css.js.map +1 -1
  298. package/components/tree/themes/item.base.css.js +1 -1
  299. package/components/tree/themes/item.base.css.js.map +1 -1
  300. package/components/tree/themes/shared/item.indigo.css.js +1 -1
  301. package/components/tree/themes/shared/item.indigo.css.js.map +1 -1
  302. package/components/tree/tree.js +3 -1
  303. package/components/tree/tree.js.map +1 -1
  304. package/components/tree/tree.navigation.js +3 -3
  305. package/components/tree/tree.navigation.js.map +1 -1
  306. package/components/tree/tree.selection.js +6 -2
  307. package/components/tree/tree.selection.js.map +1 -1
  308. package/custom-elements.json +8212 -6063
  309. package/igniteui-webcomponents.css-data.json +1 -1
  310. package/igniteui-webcomponents.html-data.json +1 -1
  311. package/index.d.ts +6 -0
  312. package/index.js +4 -0
  313. package/index.js.map +1 -1
  314. package/package.json +1 -1
  315. package/themes/dark/bootstrap.css +1 -1
  316. package/themes/dark/fluent.css +1 -1
  317. package/themes/dark/indigo.css +1 -1
  318. package/themes/dark/material.css +1 -1
  319. package/themes/light/bootstrap.css +1 -1
  320. package/themes/light/fluent.css +1 -1
  321. package/themes/light/indigo.css +1 -1
  322. package/themes/light/material.css +1 -1
  323. package/web-types.json +2 -2
@@ -0,0 +1,177 @@
1
+ import { LitElement } from 'lit';
2
+ import type { Constructor } from '../common/mixins/constructor.js';
3
+ import type { IgcChatOptions, IgcMessage, IgcMessageAttachment } from './types.js';
4
+ /**
5
+ * Defines the custom events dispatched by the `<igc-chat>` component.
6
+ */
7
+ export interface IgcChatComponentEventMap {
8
+ /**
9
+ * Dispatched when a new chat message is created (sent).
10
+ *
11
+ * @event igcMessageCreated
12
+ * @type {CustomEvent<IgcMessage>}
13
+ * @detail The message that was created.
14
+ */
15
+ igcMessageCreated: CustomEvent<IgcMessage>;
16
+ /**
17
+ * Dispatched when a new chat message is created (sent).
18
+ *
19
+ * @event igcMessageCreated
20
+ * @type {CustomEvent<IgcMessage>}
21
+ * @detail The message that was reacted to and the reaction.
22
+ */
23
+ igcMessageReact: CustomEvent<{
24
+ message: IgcMessage;
25
+ reaction: string;
26
+ }>;
27
+ /**
28
+ * Dispatched when a chat message attachment is clicked.
29
+ *
30
+ * @event igcAttachmentClick
31
+ * @type {CustomEvent<IgcMessageAttachment>}
32
+ * @detail The attachment that was clicked.
33
+ */
34
+ igcAttachmentClick: CustomEvent<IgcMessageAttachment>;
35
+ /**
36
+ * Dispatched when an attachment is changed (e.g., updated or removed).
37
+ *
38
+ * @event igcAttachmentChange
39
+ * @type {CustomEvent<IgcMessageAttachment>}
40
+ * @detail The attachment that was changed.
41
+ */
42
+ igcAttachmentChange: CustomEvent<IgcMessageAttachment>;
43
+ /**
44
+ * Dispatched during an attachment drag operation.
45
+ *
46
+ * @event igcAttachmentDrag
47
+ * @type {CustomEvent<any>}
48
+ * @detail The drag event payload.
49
+ */
50
+ igcAttachmentDrag: CustomEvent<any>;
51
+ /**
52
+ * Dispatched when an attachment is dropped (e.g., in a drag-and-drop operation).
53
+ *
54
+ * @event igcAttachmentDrop
55
+ * @type {CustomEvent<any>}
56
+ * @detail The drop event payload.
57
+ */
58
+ igcAttachmentDrop: CustomEvent<any>;
59
+ /**
60
+ * Dispatched when the typing status changes (e.g., user starts or stops typing).
61
+ *
62
+ * @event igcTypingChange
63
+ * @type {CustomEvent<boolean>}
64
+ * @detail `true` if typing started, `false` if stopped.
65
+ */
66
+ igcTypingChange: CustomEvent<boolean>;
67
+ /**
68
+ * Dispatched when the chat input field gains focus.
69
+ *
70
+ * @event igcInputFocus
71
+ * @type {CustomEvent<any>}
72
+ * @detail Focus event payload.
73
+ */
74
+ igcInputFocus: CustomEvent<any>;
75
+ /**
76
+ * Dispatched when the chat input field loses focus.
77
+ *
78
+ * @event igcInputBlur
79
+ * @type {CustomEvent<any>}
80
+ * @detail Blur event payload.
81
+ */
82
+ igcInputBlur: CustomEvent<any>;
83
+ /**
84
+ * Dispatched when the content of the chat input changes.
85
+ *
86
+ * @event igcInputChange
87
+ * @type {CustomEvent<string>}
88
+ * @detail The current text value of the input.
89
+ */
90
+ igcInputChange: CustomEvent<string>;
91
+ }
92
+ declare const IgcChatComponent_base: Constructor<import("../common/mixins/event-emitter.js").EventEmitterInterface<IgcChatComponentEventMap>> & Constructor<LitElement>;
93
+ /**
94
+ * A chat UI component for displaying messages, attachments, and input interaction.
95
+ *
96
+ * This component is part of the Ignite UI Web Components suite.
97
+ *
98
+ * @element igc-chat
99
+ * @slot prefix - Slot for injecting content (e.g., avatar or icon) before the chat title.
100
+ * @slot title - Slot for overriding the chat title content.
101
+ * @slot actions - Slot for injecting header actions (e.g., buttons, menus).
102
+ * @slot suggestions-header - Slot for rendering a custom header for the suggestions list.
103
+ * @slot suggestions - Slot for rendering a custom list of quick reply suggestions.
104
+ * @slot suggestions-actions - Slot for rendering additional actions.
105
+ * @slot suggestion - Slot for rendering a single suggestion item.
106
+ * @slot empty-state - Slot shown when there are no messages.
107
+ *
108
+ * @csspart header - Styles the header container.
109
+ * @csspart prefix - Styles the element before the title (e.g., avatar).
110
+ * @csspart title - Styles the chat header title.
111
+ * @csspart suggestions - Styles the suggestion container.
112
+ * @csspart suggestion - Styles each suggestion item.
113
+ */
114
+ export default class IgcChatComponent extends IgcChatComponent_base {
115
+ static readonly tagName = "igc-chat";
116
+ static styles: import("lit").CSSResult[];
117
+ /**
118
+ * Registers the chat component and its child components.
119
+ * Should be called once before using the component.
120
+ *
121
+ * @example
122
+ * IgcChatComponent.register();
123
+ */
124
+ static register(): void;
125
+ private readonly _chatState;
126
+ private readonly _slots;
127
+ private _context;
128
+ constructor();
129
+ /**
130
+ * The list of chat messages currently displayed.
131
+ * Use this property to set or update the message history.
132
+ */
133
+ set messages(value: IgcMessage[]);
134
+ get messages(): IgcMessage[];
135
+ /**
136
+ * The chat message currently being composed but not yet sent.
137
+ * Includes the draft text and any attachments.
138
+ */
139
+ set draftMessage(value: {
140
+ text: string;
141
+ attachments?: IgcMessageAttachment[];
142
+ });
143
+ get draftMessage(): {
144
+ text: string;
145
+ attachments?: IgcMessageAttachment[];
146
+ };
147
+ /**
148
+ * Controls the chat behavior and appearance through a configuration object.
149
+ * Use this to toggle UI options, provide suggestions, templates, etc.
150
+ */
151
+ set options(value: IgcChatOptions);
152
+ get options(): IgcChatOptions | undefined;
153
+ /** The resource strings. */
154
+ resourceStrings: import("../common/i18n/chat.resources.js").IgcChatResourceStrings;
155
+ /**
156
+ * Scrolls the view to a specific message by id.
157
+ * @param messageId - The id of the message to scroll to
158
+ */
159
+ scrollToMessage(messageId: string): void;
160
+ protected contextChanged(): void;
161
+ private renderHeader;
162
+ private renderSuggestionPrefix;
163
+ private renderSuggestions;
164
+ /**
165
+ * Updates the context value to notify all consumers that the chat state has changed.
166
+ * This ensures that components consuming the chat context will re-render.
167
+ */
168
+ updateContextValue(): void;
169
+ protected render(): import("lit-html").TemplateResult<1>;
170
+ }
171
+ declare global {
172
+ interface HTMLElementTagNameMap {
173
+ /** The `<igc-chat>` custom element. */
174
+ 'igc-chat': IgcChatComponent;
175
+ }
176
+ }
177
+ export {};
@@ -0,0 +1,250 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { ContextProvider } from '@lit/context';
8
+ import { html, LitElement, nothing } from 'lit';
9
+ import { property } from 'lit/decorators.js';
10
+ import { addThemingController } from '../../theming/theming-controller.js';
11
+ import IgcButtonComponent from '../button/button.js';
12
+ import { chatContext } from '../common/context.js';
13
+ import { addSlotController, setSlots } from '../common/controllers/slot.js';
14
+ import { watch } from '../common/decorators/watch.js';
15
+ import { registerComponent } from '../common/definitions/register.js';
16
+ import { IgcChatResourceStringEN } from '../common/i18n/chat.resources.js';
17
+ import { EventEmitterMixin } from '../common/mixins/event-emitter.js';
18
+ import IgcIconComponent from '../icon/icon.js';
19
+ import IgcListComponent from '../list/list.js';
20
+ import IgcListHeaderComponent from '../list/list-header.js';
21
+ import IgcListItemComponent from '../list/list-item.js';
22
+ import IgcChatInputComponent from './chat-input.js';
23
+ import IgcChatMessageListComponent from './chat-message-list.js';
24
+ import { createChatState } from './chat-state.js';
25
+ import { styles } from './themes/chat.base.css.js';
26
+ import { styles as shared } from './themes/shared/chat.common.css.js';
27
+ import { all } from './themes/themes.js';
28
+ const Slots = setSlots('prefix', 'title', 'actions', 'suggestions-header', 'suggestions', 'suggestions-actions', 'suggestions-header', 'suggestion', 'empty-state');
29
+ class IgcChatComponent extends EventEmitterMixin(LitElement) {
30
+ static register() {
31
+ registerComponent(IgcChatComponent, IgcChatInputComponent, IgcChatMessageListComponent, IgcButtonComponent, IgcIconComponent, IgcListComponent, IgcListItemComponent, IgcListHeaderComponent);
32
+ }
33
+ constructor() {
34
+ super();
35
+ this._chatState = createChatState(this);
36
+ this._slots = addSlotController(this, {
37
+ slots: Slots,
38
+ });
39
+ this._context = new ContextProvider(this, {
40
+ context: chatContext,
41
+ initialValue: this._chatState,
42
+ });
43
+ this.resourceStrings = IgcChatResourceStringEN;
44
+ addThemingController(this, all);
45
+ }
46
+ set messages(value) {
47
+ this._chatState.messages = value;
48
+ }
49
+ get messages() {
50
+ return this._chatState.messages;
51
+ }
52
+ set draftMessage(value) {
53
+ if (this._chatState && value) {
54
+ this._chatState.inputValue = value.text;
55
+ this._chatState.inputAttachments = value.attachments || [];
56
+ this.requestUpdate();
57
+ }
58
+ }
59
+ get draftMessage() {
60
+ return {
61
+ text: this._chatState?.inputValue,
62
+ attachments: this._chatState?.inputAttachments,
63
+ };
64
+ }
65
+ set options(value) {
66
+ this._chatState.options = value;
67
+ }
68
+ get options() {
69
+ return this._chatState.options;
70
+ }
71
+ scrollToMessage(messageId) {
72
+ const messageListComponent = this.shadowRoot?.querySelector('igc-chat-message-list');
73
+ if (!messageListComponent) {
74
+ return;
75
+ }
76
+ const messageElement = messageListComponent.shadowRoot?.querySelector(`#message-${messageId}`);
77
+ if (!messageElement) {
78
+ return;
79
+ }
80
+ messageElement.scrollIntoView({
81
+ behavior: 'smooth',
82
+ block: 'center',
83
+ inline: 'nearest',
84
+ });
85
+ }
86
+ contextChanged() {
87
+ this._context.setValue(this._chatState, true);
88
+ }
89
+ renderHeader() {
90
+ const hasContent = this._slots.hasAssignedElements('prefix') ||
91
+ this._slots.hasAssignedElements('title') ||
92
+ this._slots.hasAssignedElements('actions');
93
+ return html ` <div part="header" ?hidden=${!hasContent}>
94
+ <slot name="prefix" part="prefix"></slot>
95
+ <slot name="title" part="title"
96
+ >${this._chatState.options?.headerText}</slot
97
+ >
98
+ <slot name="actions" part="actions"></slot>
99
+ </div>`;
100
+ }
101
+ renderSuggestionPrefix() {
102
+ const defaultPrefix = html `<igc-icon
103
+ name="star-icon"
104
+ collection="material"
105
+ ></igc-icon>`;
106
+ return html `<span slot="start">
107
+ ${this._chatState?.options?.templates?.suggestionPrefixTemplate
108
+ ? this._chatState.options.templates.suggestionPrefixTemplate
109
+ : defaultPrefix}
110
+ </span>`;
111
+ }
112
+ renderSuggestions() {
113
+ const hasContent = this._slots.hasAssignedElements('suggestions-header');
114
+ return html `<div part="suggestions-container">
115
+ <igc-list role="list" aria-label="Suggestions">
116
+ <igc-list-header part="suggestions-header">
117
+ <span ?hidden=${hasContent}>
118
+ ${this.resourceStrings.suggestionsHeader}
119
+ </span>
120
+ <slot name="suggestions-header"></slot>
121
+ </igc-list-header>
122
+ <slot name="suggestions" part="suggestions">
123
+ ${this._chatState.options?.suggestions?.map((suggestion) => html `
124
+ <slot name="suggestion" part="suggestion" role="listitem">
125
+ <igc-list-item
126
+ @click=${() => this._chatState?.handleSuggestionClick(suggestion)}
127
+ >
128
+ ${this.renderSuggestionPrefix()}
129
+ <span slot="title">${suggestion}</span>
130
+ </igc-list-item>
131
+ </slot>
132
+ `)}
133
+ </slot>
134
+ <slot name="suggestions-actions" part="suggestions-actions"></slot>
135
+ </igc-list>
136
+ </div>`;
137
+ }
138
+ updateContextValue() {
139
+ this._context.setValue(this._chatState, true);
140
+ }
141
+ render() {
142
+ const hasSuggestions = this._chatState.options?.suggestions &&
143
+ this._chatState.options.suggestions.length > 0;
144
+ return html `
145
+ <div
146
+ part="chat-container"
147
+ exportparts="
148
+ chat-container,
149
+ header,
150
+ prefix,
151
+ title,
152
+ actions,
153
+ chat-wrapper,
154
+ chat-messages,
155
+ empty-state,
156
+ suggestions-container,
157
+ suggestions-header,
158
+ suggestions,
159
+ suggestions-actions,
160
+ suggestion,
161
+ message-container,
162
+ message-list,
163
+ message-item,
164
+ message,
165
+ message-text,
166
+ message-attachments,
167
+ message-actions,
168
+ typing-indicator,
169
+ attachments-container,
170
+ attachment,
171
+ attachment-header,
172
+ attachment-content,
173
+ attachment-icon,
174
+ file-name,
175
+ attachment-actions
176
+ "
177
+ >
178
+ ${this.renderHeader()}
179
+ <div part="chat-wrapper">
180
+ ${this.messages.length === 0
181
+ ? html `<div part="empty-state">
182
+ <slot name="empty-state"> </slot>
183
+ </div>`
184
+ : html ` <igc-chat-message-list
185
+ part="chat-messages"
186
+ exportparts="
187
+ message-container,
188
+ message-list,
189
+ message-item,
190
+ message,
191
+ message-text,
192
+ message-attachments,
193
+ message-actions,
194
+ typing-indicator,
195
+ attachments-container,
196
+ attachment,
197
+ attachment-header,
198
+ attachment-content,
199
+ attachment-icon,
200
+ file-name,
201
+ actions: attachment-actions"
202
+ >
203
+ </igc-chat-message-list>`}
204
+ ${hasSuggestions &&
205
+ this._chatState.suggestionsPosition === 'below-messages'
206
+ ? this.renderSuggestions()
207
+ : nothing}
208
+ </div>
209
+ <igc-chat-input
210
+ exportparts="
211
+ input-container,
212
+ input-wrapper,
213
+ attachments: input-attachments-container,
214
+ attachments-wrapper: input-attachment,
215
+ attachment-name: input-attachment-name,
216
+ text-input,
217
+ buttons-container: input-buttons-container,
218
+ upload-button,
219
+ send-button"
220
+ >
221
+ </igc-chat-input>
222
+ ${hasSuggestions &&
223
+ this._chatState.suggestionsPosition === 'below-input'
224
+ ? this.renderSuggestions()
225
+ : nothing}
226
+ </div>
227
+ `;
228
+ }
229
+ }
230
+ IgcChatComponent.tagName = 'igc-chat';
231
+ IgcChatComponent.styles = [styles, shared];
232
+ export default IgcChatComponent;
233
+ __decorate([
234
+ property({ attribute: false })
235
+ ], IgcChatComponent.prototype, "messages", null);
236
+ __decorate([
237
+ property({ attribute: false })
238
+ ], IgcChatComponent.prototype, "draftMessage", null);
239
+ __decorate([
240
+ property({ attribute: false })
241
+ ], IgcChatComponent.prototype, "options", null);
242
+ __decorate([
243
+ property({ attribute: false })
244
+ ], IgcChatComponent.prototype, "resourceStrings", void 0);
245
+ __decorate([
246
+ watch('messages'),
247
+ watch('draftMessage'),
248
+ watch('options')
249
+ ], IgcChatComponent.prototype, "contextChanged", null);
250
+ //# sourceMappingURL=chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/components/chat/chat.ts"],"names":[],"mappings":"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","sourcesContent":["import { ContextProvider } from '@lit/context';\nimport { html, LitElement, nothing } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { addThemingController } from '../../theming/theming-controller.js';\nimport IgcButtonComponent from '../button/button.js';\nimport { chatContext } from '../common/context.js';\nimport { addSlotController, setSlots } from '../common/controllers/slot.js';\nimport { watch } from '../common/decorators/watch.js';\nimport { registerComponent } from '../common/definitions/register.js';\nimport { IgcChatResourceStringEN } from '../common/i18n/chat.resources.js';\nimport type { Constructor } from '../common/mixins/constructor.js';\nimport { EventEmitterMixin } from '../common/mixins/event-emitter.js';\nimport IgcIconComponent from '../icon/icon.js';\nimport IgcListComponent from '../list/list.js';\nimport IgcListHeaderComponent from '../list/list-header.js';\nimport IgcListItemComponent from '../list/list-item.js';\nimport IgcChatInputComponent from './chat-input.js';\nimport IgcChatMessageListComponent from './chat-message-list.js';\nimport { createChatState } from './chat-state.js';\nimport { styles } from './themes/chat.base.css.js';\nimport { styles as shared } from './themes/shared/chat.common.css.js';\nimport { all } from './themes/themes.js';\nimport type {\n IgcChatOptions,\n IgcMessage,\n IgcMessageAttachment,\n} from './types.js';\n\n/**\n * Defines the custom events dispatched by the `<igc-chat>` component.\n */\nexport interface IgcChatComponentEventMap {\n /**\n * Dispatched when a new chat message is created (sent).\n *\n * @event igcMessageCreated\n * @type {CustomEvent<IgcMessage>}\n * @detail The message that was created.\n */\n igcMessageCreated: CustomEvent<IgcMessage>;\n\n /**\n * Dispatched when a new chat message is created (sent).\n *\n * @event igcMessageCreated\n * @type {CustomEvent<IgcMessage>}\n * @detail The message that was reacted to and the reaction.\n */\n igcMessageReact: CustomEvent<{ message: IgcMessage; reaction: string }>;\n\n /**\n * Dispatched when a chat message attachment is clicked.\n *\n * @event igcAttachmentClick\n * @type {CustomEvent<IgcMessageAttachment>}\n * @detail The attachment that was clicked.\n */\n igcAttachmentClick: CustomEvent<IgcMessageAttachment>;\n\n /**\n * Dispatched when an attachment is changed (e.g., updated or removed).\n *\n * @event igcAttachmentChange\n * @type {CustomEvent<IgcMessageAttachment>}\n * @detail The attachment that was changed.\n */\n igcAttachmentChange: CustomEvent<IgcMessageAttachment>;\n\n /**\n * Dispatched during an attachment drag operation.\n *\n * @event igcAttachmentDrag\n * @type {CustomEvent<any>}\n * @detail The drag event payload.\n */\n igcAttachmentDrag: CustomEvent<any>;\n\n /**\n * Dispatched when an attachment is dropped (e.g., in a drag-and-drop operation).\n *\n * @event igcAttachmentDrop\n * @type {CustomEvent<any>}\n * @detail The drop event payload.\n */\n igcAttachmentDrop: CustomEvent<any>;\n\n /**\n * Dispatched when the typing status changes (e.g., user starts or stops typing).\n *\n * @event igcTypingChange\n * @type {CustomEvent<boolean>}\n * @detail `true` if typing started, `false` if stopped.\n */\n igcTypingChange: CustomEvent<boolean>;\n\n /**\n * Dispatched when the chat input field gains focus.\n *\n * @event igcInputFocus\n * @type {CustomEvent<any>}\n * @detail Focus event payload.\n */\n igcInputFocus: CustomEvent<any>;\n\n /**\n * Dispatched when the chat input field loses focus.\n *\n * @event igcInputBlur\n * @type {CustomEvent<any>}\n * @detail Blur event payload.\n */\n igcInputBlur: CustomEvent<any>;\n\n /**\n * Dispatched when the content of the chat input changes.\n *\n * @event igcInputChange\n * @type {CustomEvent<string>}\n * @detail The current text value of the input.\n */\n igcInputChange: CustomEvent<string>;\n}\n\nconst Slots = setSlots(\n 'prefix',\n 'title',\n 'actions',\n 'suggestions-header',\n 'suggestions',\n 'suggestions-actions',\n 'suggestions-header',\n 'suggestion',\n 'empty-state'\n);\n\n/**\n * A chat UI component for displaying messages, attachments, and input interaction.\n *\n * This component is part of the Ignite UI Web Components suite.\n *\n * @element igc-chat\n * @slot prefix - Slot for injecting content (e.g., avatar or icon) before the chat title.\n * @slot title - Slot for overriding the chat title content.\n * @slot actions - Slot for injecting header actions (e.g., buttons, menus).\n * @slot suggestions-header - Slot for rendering a custom header for the suggestions list.\n * @slot suggestions - Slot for rendering a custom list of quick reply suggestions.\n * @slot suggestions-actions - Slot for rendering additional actions.\n * @slot suggestion - Slot for rendering a single suggestion item.\n * @slot empty-state - Slot shown when there are no messages.\n *\n * @csspart header - Styles the header container.\n * @csspart prefix - Styles the element before the title (e.g., avatar).\n * @csspart title - Styles the chat header title.\n * @csspart suggestions - Styles the suggestion container.\n * @csspart suggestion - Styles each suggestion item.\n */\nexport default class IgcChatComponent extends EventEmitterMixin<\n IgcChatComponentEventMap,\n Constructor<LitElement>\n>(LitElement) {\n public static readonly tagName = 'igc-chat';\n\n public static styles = [styles, shared];\n\n /* blazorSuppress */\n /**\n * Registers the chat component and its child components.\n * Should be called once before using the component.\n *\n * @example\n * IgcChatComponent.register();\n */\n public static register() {\n registerComponent(\n IgcChatComponent,\n IgcChatInputComponent,\n IgcChatMessageListComponent,\n IgcButtonComponent,\n IgcIconComponent,\n IgcListComponent,\n IgcListItemComponent,\n IgcListHeaderComponent\n );\n }\n\n private readonly _chatState = createChatState(this);\n\n private readonly _slots = addSlotController(this, {\n slots: Slots,\n });\n\n private _context = new ContextProvider(this, {\n context: chatContext,\n initialValue: this._chatState,\n });\n constructor() {\n super();\n addThemingController(this, all);\n }\n\n /**\n * The list of chat messages currently displayed.\n * Use this property to set or update the message history.\n */\n @property({ attribute: false })\n public set messages(value: IgcMessage[]) {\n this._chatState.messages = value;\n }\n\n public get messages(): IgcMessage[] {\n return this._chatState.messages;\n }\n\n /**\n * The chat message currently being composed but not yet sent.\n * Includes the draft text and any attachments.\n */\n @property({ attribute: false })\n public set draftMessage(value: {\n text: string;\n attachments?: IgcMessageAttachment[];\n }) {\n if (this._chatState && value) {\n this._chatState.inputValue = value.text;\n this._chatState.inputAttachments = value.attachments || [];\n this.requestUpdate();\n }\n }\n\n public get draftMessage(): {\n text: string;\n attachments?: IgcMessageAttachment[];\n } {\n return {\n text: this._chatState?.inputValue,\n attachments: this._chatState?.inputAttachments,\n };\n }\n\n /**\n * Controls the chat behavior and appearance through a configuration object.\n * Use this to toggle UI options, provide suggestions, templates, etc.\n */\n @property({ attribute: false })\n public set options(value: IgcChatOptions) {\n this._chatState.options = value;\n }\n\n public get options(): IgcChatOptions | undefined {\n return this._chatState.options;\n }\n\n /** The resource strings. */\n @property({ attribute: false })\n public resourceStrings = IgcChatResourceStringEN;\n\n /**\n * Scrolls the view to a specific message by id.\n * @param messageId - The id of the message to scroll to\n */\n public scrollToMessage(messageId: string) {\n // Find the message list component\n const messageListComponent = this.shadowRoot?.querySelector(\n 'igc-chat-message-list'\n );\n if (!messageListComponent) {\n return;\n }\n\n // Look for the message element inside the message list's shadow DOM\n const messageElement = messageListComponent.shadowRoot?.querySelector(\n `#message-${messageId}`\n );\n\n if (!messageElement) {\n return;\n }\n\n // Scroll the message into view with smooth behavior\n messageElement.scrollIntoView({\n behavior: 'smooth',\n block: 'center',\n inline: 'nearest',\n });\n }\n\n @watch('messages')\n @watch('draftMessage')\n @watch('options')\n protected contextChanged() {\n this._context.setValue(this._chatState, true);\n }\n\n private renderHeader() {\n const hasContent =\n this._slots.hasAssignedElements('prefix') ||\n this._slots.hasAssignedElements('title') ||\n this._slots.hasAssignedElements('actions');\n return html` <div part=\"header\" ?hidden=${!hasContent}>\n <slot name=\"prefix\" part=\"prefix\"></slot>\n <slot name=\"title\" part=\"title\"\n >${this._chatState.options?.headerText}</slot\n >\n <slot name=\"actions\" part=\"actions\"></slot>\n </div>`;\n }\n\n private renderSuggestionPrefix() {\n const defaultPrefix = html`<igc-icon\n name=\"star-icon\"\n collection=\"material\"\n ></igc-icon>`;\n return html`<span slot=\"start\">\n ${this._chatState?.options?.templates?.suggestionPrefixTemplate\n ? this._chatState.options.templates.suggestionPrefixTemplate\n : defaultPrefix}\n </span>`;\n }\n\n private renderSuggestions() {\n const hasContent = this._slots.hasAssignedElements('suggestions-header');\n return html`<div part=\"suggestions-container\">\n <igc-list role=\"list\" aria-label=\"Suggestions\">\n <igc-list-header part=\"suggestions-header\">\n <span ?hidden=${hasContent}>\n ${this.resourceStrings.suggestionsHeader}\n </span>\n <slot name=\"suggestions-header\"></slot>\n </igc-list-header>\n <slot name=\"suggestions\" part=\"suggestions\">\n ${this._chatState.options?.suggestions?.map(\n (suggestion) => html`\n <slot name=\"suggestion\" part=\"suggestion\" role=\"listitem\">\n <igc-list-item\n @click=${() =>\n this._chatState?.handleSuggestionClick(suggestion)}\n >\n ${this.renderSuggestionPrefix()}\n <span slot=\"title\">${suggestion}</span>\n </igc-list-item>\n </slot>\n `\n )}\n </slot>\n <slot name=\"suggestions-actions\" part=\"suggestions-actions\"></slot>\n </igc-list>\n </div>`;\n }\n\n /**\n * Updates the context value to notify all consumers that the chat state has changed.\n * This ensures that components consuming the chat context will re-render.\n */\n public updateContextValue() {\n this._context.setValue(this._chatState, true);\n }\n\n protected override render() {\n const hasSuggestions =\n this._chatState.options?.suggestions &&\n this._chatState.options.suggestions.length > 0;\n return html`\n <div\n part=\"chat-container\"\n exportparts=\"\n chat-container,\n header,\n prefix,\n title,\n actions,\n chat-wrapper,\n chat-messages,\n empty-state,\n suggestions-container,\n suggestions-header,\n suggestions,\n suggestions-actions,\n suggestion,\n message-container,\n message-list,\n message-item,\n message,\n message-text,\n message-attachments,\n message-actions,\n typing-indicator,\n attachments-container,\n attachment,\n attachment-header,\n attachment-content,\n attachment-icon,\n file-name,\n attachment-actions\n \"\n >\n ${this.renderHeader()}\n <div part=\"chat-wrapper\">\n ${this.messages.length === 0\n ? html`<div part=\"empty-state\">\n <slot name=\"empty-state\"> </slot>\n </div>`\n : html` <igc-chat-message-list\n part=\"chat-messages\"\n exportparts=\"\n message-container,\n message-list,\n message-item,\n message,\n message-text,\n message-attachments,\n message-actions,\n typing-indicator,\n attachments-container,\n attachment,\n attachment-header,\n attachment-content,\n attachment-icon,\n file-name,\n actions: attachment-actions\"\n >\n </igc-chat-message-list>`}\n ${hasSuggestions &&\n this._chatState.suggestionsPosition === 'below-messages'\n ? this.renderSuggestions()\n : nothing}\n </div>\n <igc-chat-input\n exportparts=\"\n input-container,\n input-wrapper,\n attachments: input-attachments-container,\n attachments-wrapper: input-attachment,\n attachment-name: input-attachment-name,\n text-input,\n buttons-container: input-buttons-container,\n upload-button,\n send-button\"\n >\n </igc-chat-input>\n ${hasSuggestions &&\n this._chatState.suggestionsPosition === 'below-input'\n ? this.renderSuggestions()\n : nothing}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n /** The `<igc-chat>` custom element. */\n 'igc-chat': IgcChatComponent;\n }\n}\n"]}
@@ -0,0 +1,72 @@
1
+ import { type TemplateResult } from 'lit';
2
+ import type { ChatMessageRenderer, IgcMessage } from './types.js';
3
+ /**
4
+ * Options to configure the MarkdownMessageRenderer.
5
+ */
6
+ export interface MarkdownRendererOptions {
7
+ /**
8
+ * If true, disables syntax highlighting entirely.
9
+ */
10
+ noHighlighter?: boolean;
11
+ /**
12
+ * A custom syntax highlighter compatible with Shiki's `codeToHtml()` API.
13
+ */
14
+ highlighter?: any;
15
+ /**
16
+ * List of programming languages to support in syntax highlighting.
17
+ */
18
+ languages?: string[];
19
+ /**
20
+ * The theme used by the syntax highlighter (e.g., 'github-light').
21
+ */
22
+ theme?: string;
23
+ /**
24
+ * A custom HTML sanitization function. Defaults to DOMPurify.sanitize.
25
+ */
26
+ sanitizer?: (html: string) => string;
27
+ }
28
+ /**
29
+ * A renderer that converts markdown chat messages to HTML using `marked`,
30
+ * with optional syntax highlighting powered by `shiki` or a custom highlighter.
31
+ *
32
+ * @implements {ChatMessageRenderer}
33
+ */
34
+ export declare class MarkdownMessageRenderer implements ChatMessageRenderer {
35
+ private opts;
36
+ private highlighter?;
37
+ private theme;
38
+ private langs;
39
+ private _marked;
40
+ private initialized;
41
+ private _sanitizer;
42
+ /**
43
+ * Creates a new MarkdownMessageRenderer.
44
+ *
45
+ * @param {MarkdownRendererOptions} [opts={}] - Configuration options.
46
+ */
47
+ constructor(opts?: MarkdownRendererOptions);
48
+ /**
49
+ * Initializes the `marked` instance with custom renderer options.
50
+ * Currently modifies link rendering to open in a new tab with safe attributes.
51
+ *
52
+ * @private
53
+ */
54
+ private initMarked;
55
+ private initSanitizer;
56
+ /**
57
+ * Performs async initialization for syntax highlighting.
58
+ * Loads Shiki and configures the `marked` instance with `marked-shiki`.
59
+ * This is called lazily during rendering unless pre-called explicitly.
60
+ *
61
+ * @async
62
+ * @returns {Promise<void>} A promise that resolves once initialization is complete.
63
+ */
64
+ init(): Promise<void>;
65
+ /**
66
+ * Renders the given chat message as markdown, with optional syntax highlighting.
67
+ *
68
+ * @param {IgcMessage} message - The message to render.
69
+ * @returns {Promise<TemplateResult>} A lit template containing the rendered markdown content.
70
+ */
71
+ render(message: IgcMessage): Promise<TemplateResult>;
72
+ }
@@ -0,0 +1,71 @@
1
+ import DOMPurify from 'dompurify';
2
+ import { html } from 'lit';
3
+ import { Marked, Renderer } from 'marked';
4
+ export class MarkdownMessageRenderer {
5
+ constructor(opts = {}) {
6
+ this.opts = opts;
7
+ this.initialized = false;
8
+ this.theme = opts.theme ?? 'github-light';
9
+ this.langs = opts.languages ?? ['javascript', 'typescript', 'html', 'css'];
10
+ this.highlighter = opts.highlighter;
11
+ this._marked = new Marked();
12
+ this.initMarked();
13
+ this._sanitizer = this.initSanitizer();
14
+ }
15
+ initMarked() {
16
+ const renderer = new Renderer();
17
+ renderer.link = (href, title, text) => {
18
+ return `<a href="${href}" target="_blank" rel="noopener noreferrer" ${title ? `title="${title}"` : ''}>${text}</a>`;
19
+ };
20
+ this._marked.setOptions({
21
+ gfm: true,
22
+ breaks: true,
23
+ renderer,
24
+ });
25
+ }
26
+ initSanitizer() {
27
+ return this.opts?.sanitizer ?? DOMPurify.sanitize;
28
+ }
29
+ async init() {
30
+ if (this.highlighter || this.opts.noHighlighter) {
31
+ this.initialized = true;
32
+ return;
33
+ }
34
+ const shiki = await import('shiki');
35
+ this.highlighter = await shiki.getSingletonHighlighter({
36
+ themes: [this.theme],
37
+ langs: this.langs,
38
+ });
39
+ const markedShiki = await import('marked-shiki');
40
+ this._marked.use(markedShiki.default({
41
+ highlight: (code, lang) => {
42
+ try {
43
+ const safeLang = lang && this.highlighter.getLoadedLanguages?.().includes(lang)
44
+ ? lang
45
+ : 'text';
46
+ return (this.highlighter?.codeToHtml(code, {
47
+ lang: safeLang,
48
+ themes: { light: this.theme },
49
+ }) ?? code);
50
+ }
51
+ catch (_err) {
52
+ return `<pre><code>${DOMPurify.sanitize(code)}</code></pre>`;
53
+ }
54
+ },
55
+ }));
56
+ this.initialized = true;
57
+ }
58
+ async render(message) {
59
+ if (!this.initialized) {
60
+ await this.init();
61
+ }
62
+ if (!message.text)
63
+ return html ``;
64
+ const rendered = await this._marked?.parse(message.text);
65
+ const cleanHtml = this._sanitizer(rendered);
66
+ const template = document.createElement('template');
67
+ template.innerHTML = cleanHtml ?? message.text;
68
+ return html `${template.content}`;
69
+ }
70
+ }
71
+ //# sourceMappingURL=markdown-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-renderer.js","sourceRoot":"","sources":["../../../src/components/chat/markdown-renderer.ts"],"names":[],"mappings":"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","sourcesContent":["import DOMPurify from 'dompurify';\nimport { html, type TemplateResult } from 'lit';\nimport { Marked, Renderer } from 'marked';\nimport type { ChatMessageRenderer, IgcMessage } from './types.js';\n\n/**\n * Options to configure the MarkdownMessageRenderer.\n */\nexport interface MarkdownRendererOptions {\n /**\n * If true, disables syntax highlighting entirely.\n */\n noHighlighter?: boolean;\n\n /**\n * A custom syntax highlighter compatible with Shiki's `codeToHtml()` API.\n */\n highlighter?: any;\n\n /**\n * List of programming languages to support in syntax highlighting.\n */\n languages?: string[];\n\n /**\n * The theme used by the syntax highlighter (e.g., 'github-light').\n */\n theme?: string;\n\n /**\n * A custom HTML sanitization function. Defaults to DOMPurify.sanitize.\n */\n sanitizer?: (html: string) => string;\n}\n\n/**\n * A renderer that converts markdown chat messages to HTML using `marked`,\n * with optional syntax highlighting powered by `shiki` or a custom highlighter.\n *\n * @implements {ChatMessageRenderer}\n */\nexport class MarkdownMessageRenderer implements ChatMessageRenderer {\n private highlighter?: any;\n private theme: string;\n private langs: string[];\n private _marked: Marked;\n private initialized = false;\n private _sanitizer: (html: string) => string;\n\n /**\n * Creates a new MarkdownMessageRenderer.\n *\n * @param {MarkdownRendererOptions} [opts={}] - Configuration options.\n */\n constructor(private opts: MarkdownRendererOptions = {}) {\n this.theme = opts.theme ?? 'github-light';\n this.langs = opts.languages ?? ['javascript', 'typescript', 'html', 'css'];\n this.highlighter = opts.highlighter;\n\n this._marked = new Marked();\n this.initMarked();\n this._sanitizer = this.initSanitizer();\n }\n\n /**\n * Initializes the `marked` instance with custom renderer options.\n * Currently modifies link rendering to open in a new tab with safe attributes.\n *\n * @private\n */\n private initMarked() {\n const renderer = new Renderer();\n\n // Customize link rendering\n renderer.link = (href, title, text) => {\n return `<a href=\"${href}\" target=\"_blank\" rel=\"noopener noreferrer\" ${title ? `title=\"${title}\"` : ''}>${text}</a>`;\n };\n\n this._marked.setOptions({\n gfm: true,\n breaks: true,\n renderer,\n });\n }\n\n private initSanitizer() {\n return this.opts?.sanitizer ?? DOMPurify.sanitize;\n }\n\n /**\n * Performs async initialization for syntax highlighting.\n * Loads Shiki and configures the `marked` instance with `marked-shiki`.\n * This is called lazily during rendering unless pre-called explicitly.\n *\n * @async\n * @returns {Promise<void>} A promise that resolves once initialization is complete.\n */\n async init(): Promise<void> {\n if (this.highlighter || this.opts.noHighlighter) {\n this.initialized = true;\n return;\n }\n\n const shiki = await import('shiki');\n this.highlighter = await shiki.getSingletonHighlighter({\n themes: [this.theme],\n langs: this.langs,\n });\n\n const markedShiki = await import('marked-shiki');\n this._marked.use(\n markedShiki.default({\n highlight: (code: any, lang: string) => {\n try {\n const safeLang =\n lang && this.highlighter.getLoadedLanguages?.().includes(lang)\n ? lang\n : 'text';\n\n return (\n this.highlighter?.codeToHtml(code, {\n lang: safeLang,\n themes: { light: this.theme },\n }) ?? code\n );\n } catch (_err) {\n // if Shiki still throws for some reason, just return escaped code\n return `<pre><code>${DOMPurify.sanitize(code)}</code></pre>`;\n }\n },\n })\n );\n\n this.initialized = true;\n }\n\n /**\n * Renders the given chat message as markdown, with optional syntax highlighting.\n *\n * @param {IgcMessage} message - The message to render.\n * @returns {Promise<TemplateResult>} A lit template containing the rendered markdown content.\n */\n async render(message: IgcMessage): Promise<TemplateResult> {\n if (!this.initialized) {\n await this.init();\n }\n\n if (!message.text) return html``;\n\n const rendered = await this._marked?.parse(message.text);\n const cleanHtml = this._sanitizer(rendered);\n const template = document.createElement('template');\n template.innerHTML = cleanHtml ?? message.text;\n\n return html`${template.content}`;\n }\n}\n"]}
@@ -0,0 +1,38 @@
1
+ import { LitElement } from 'lit';
2
+ import { type IgcMessage } from './types.js';
3
+ /**
4
+ * A component that renders message attachments within a chat.
5
+ *
6
+ * Displays attachments such as images or files, supporting custom templates
7
+ * and default rendering using expansion panels.
8
+ *
9
+ * @element igc-message-attachments
10
+ *
11
+ * @csspart attachments-container - Container wrapping all attachments.
12
+ * @csspart attachment - Wrapper for a single attachment.
13
+ * @csspart attachment-header - Wrapper for a single attachment header.
14
+ * @csspart attachments-content - Part representing the attachment preview.
15
+ * @csspart attachment-icon - Icon part representing the attachment type.
16
+ * @csspart file-name - Part representing the attachment's file name.
17
+ * @csspart actions - Container for header action buttons.
18
+ * @csspart image-attachment - Part for the image element inside an image attachment.
19
+ *
20
+ * @fires igcAttachmentClick - Fired when an attachment header is toggled (clicked).
21
+ */
22
+ export default class IgcMessageAttachmentsComponent extends LitElement {
23
+ static readonly tagName = "igc-message-attachments";
24
+ static styles: import("lit").CSSResult[];
25
+ private _chatState?;
26
+ static register(): void;
27
+ /**
28
+ * The array of attachments to render.
29
+ */
30
+ message: IgcMessage | undefined;
31
+ constructor();
32
+ protected render(): import("lit-html").TemplateResult<1>;
33
+ }
34
+ declare global {
35
+ interface HTMLElementTagNameMap {
36
+ 'igc-message-attachments': IgcMessageAttachmentsComponent;
37
+ }
38
+ }