igniteui-webcomponents 6.3.0-alpha.1 → 6.3.0-beta.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 (380) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/components/accordion/themes/accordion.base.css.js +1 -1
  3. package/components/accordion/themes/accordion.base.css.js.map +1 -1
  4. package/components/banner/themes/banner.base.css.js +1 -1
  5. package/components/banner/themes/banner.base.css.js.map +1 -1
  6. package/components/banner/themes/shared/banner.bootstrap.css.js +1 -1
  7. package/components/banner/themes/shared/banner.bootstrap.css.js.map +1 -1
  8. package/components/banner/themes/shared/banner.fluent.css.js +1 -1
  9. package/components/banner/themes/shared/banner.fluent.css.js.map +1 -1
  10. package/components/banner/themes/shared/banner.indigo.css.js +1 -1
  11. package/components/banner/themes/shared/banner.indigo.css.js.map +1 -1
  12. package/components/banner/themes/shared/banner.material.css.js +1 -1
  13. package/components/banner/themes/shared/banner.material.css.js.map +1 -1
  14. package/components/button/themes/button/button.base.css.js +1 -1
  15. package/components/button/themes/button/button.base.css.js.map +1 -1
  16. package/components/button/themes/button/shared/button.common.css.js +1 -1
  17. package/components/button/themes/button/shared/button.common.css.js.map +1 -1
  18. package/components/button/themes/button/shared/button.fluent.css.js +1 -1
  19. package/components/button/themes/button/shared/button.fluent.css.js.map +1 -1
  20. package/components/button/themes/button/shared/button.indigo.css.js +1 -1
  21. package/components/button/themes/button/shared/button.indigo.css.js.map +1 -1
  22. package/components/calendar/calendar.d.ts +1 -1
  23. package/components/calendar/themes/calendar.base.css.js +1 -1
  24. package/components/calendar/themes/calendar.base.css.js.map +1 -1
  25. package/components/calendar/themes/days-view.base.css.js +1 -1
  26. package/components/calendar/themes/days-view.base.css.js.map +1 -1
  27. package/components/calendar/themes/shared/bootstrap/calendar.bootstrap.css.js +1 -1
  28. package/components/calendar/themes/shared/bootstrap/calendar.bootstrap.css.js.map +1 -1
  29. package/components/calendar/themes/shared/bootstrap/days-view.bootstrap.css.js +1 -1
  30. package/components/calendar/themes/shared/bootstrap/days-view.bootstrap.css.js.map +1 -1
  31. package/components/calendar/themes/shared/bootstrap/year-month-view.bootstrap.css.js +1 -1
  32. package/components/calendar/themes/shared/bootstrap/year-month-view.bootstrap.css.js.map +1 -1
  33. package/components/calendar/themes/shared/fluent/calendar.fluent.css.js +1 -1
  34. package/components/calendar/themes/shared/fluent/calendar.fluent.css.js.map +1 -1
  35. package/components/calendar/themes/shared/indigo/calendar.indigo.css.js +1 -1
  36. package/components/calendar/themes/shared/indigo/calendar.indigo.css.js.map +1 -1
  37. package/components/calendar/themes/shared/material/calendar.material.css.js +1 -1
  38. package/components/calendar/themes/shared/material/calendar.material.css.js.map +1 -1
  39. package/components/calendar/themes/year-month-view.base.css.js +1 -1
  40. package/components/calendar/themes/year-month-view.base.css.js.map +1 -1
  41. package/components/card/themes/card.actions.base.css.js +1 -1
  42. package/components/card/themes/card.actions.base.css.js.map +1 -1
  43. package/components/card/themes/card.content.base.css.js +1 -1
  44. package/components/card/themes/card.content.base.css.js.map +1 -1
  45. package/components/card/themes/card.header.base.css.js +1 -1
  46. package/components/card/themes/card.header.base.css.js.map +1 -1
  47. package/components/card/themes/shared/actions/card.actions.bootstrap.css.js +1 -1
  48. package/components/card/themes/shared/actions/card.actions.bootstrap.css.js.map +1 -1
  49. package/components/card/themes/shared/actions/card.actions.indigo.css.js +1 -1
  50. package/components/card/themes/shared/actions/card.actions.indigo.css.js.map +1 -1
  51. package/components/card/themes/shared/container/card.bootstrap.css.js +1 -1
  52. package/components/card/themes/shared/container/card.bootstrap.css.js.map +1 -1
  53. package/components/card/themes/shared/container/card.indigo.css.js +1 -1
  54. package/components/card/themes/shared/container/card.indigo.css.js.map +1 -1
  55. package/components/card/themes/shared/content/card.content.bootstrap.css.js +1 -1
  56. package/components/card/themes/shared/content/card.content.bootstrap.css.js.map +1 -1
  57. package/components/card/themes/shared/header/card.header.fluent.css.js +1 -1
  58. package/components/card/themes/shared/header/card.header.fluent.css.js.map +1 -1
  59. package/components/card/themes/shared/header/card.header.indigo.css.js +1 -1
  60. package/components/card/themes/shared/header/card.header.indigo.css.js.map +1 -1
  61. package/components/carousel/themes/carousel.base.css.js +1 -1
  62. package/components/carousel/themes/carousel.base.css.js.map +1 -1
  63. package/components/carousel/themes/shared/carousel.indigo.css.js +1 -1
  64. package/components/carousel/themes/shared/carousel.indigo.css.js.map +1 -1
  65. package/components/chat/chat-input.d.ts +47 -11
  66. package/components/chat/chat-input.js +186 -72
  67. package/components/chat/chat-input.js.map +1 -1
  68. package/components/chat/chat-message.d.ts +17 -2
  69. package/components/chat/chat-message.js +126 -26
  70. package/components/chat/chat-message.js.map +1 -1
  71. package/components/chat/chat-state.d.ts +18 -135
  72. package/components/chat/chat-state.js +56 -398
  73. package/components/chat/chat-state.js.map +1 -1
  74. package/components/chat/chat.d.ts +36 -64
  75. package/components/chat/chat.js +163 -119
  76. package/components/chat/chat.js.map +1 -1
  77. package/components/chat/extras/markdown-renderer.d.ts +23 -0
  78. package/components/chat/extras/markdown-renderer.js +44 -0
  79. package/components/chat/extras/markdown-renderer.js.map +1 -0
  80. package/components/chat/message-attachments.d.ts +23 -5
  81. package/components/chat/message-attachments.js +94 -12
  82. package/components/chat/message-attachments.js.map +1 -1
  83. package/components/chat/themes/attachments.d.ts +2 -0
  84. package/components/chat/themes/attachments.js +14 -0
  85. package/components/chat/themes/attachments.js.map +1 -0
  86. package/components/chat/themes/chat.base.css.js +1 -1
  87. package/components/chat/themes/chat.base.css.js.map +1 -1
  88. package/components/chat/themes/dark/chat.indigo.css.js +1 -1
  89. package/components/chat/themes/dark/chat.indigo.css.js.map +1 -1
  90. package/components/chat/themes/input.base.css.js +1 -1
  91. package/components/chat/themes/input.base.css.js.map +1 -1
  92. package/components/chat/themes/light/chat.indigo.css.js +1 -1
  93. package/components/chat/themes/light/chat.indigo.css.js.map +1 -1
  94. package/components/chat/themes/light/chat.shared.css.js +1 -1
  95. package/components/chat/themes/light/chat.shared.css.js.map +1 -1
  96. package/components/chat/themes/message-attachments.base.css.js +1 -1
  97. package/components/chat/themes/message-attachments.base.css.js.map +1 -1
  98. package/components/chat/themes/message.base.css.js +1 -1
  99. package/components/chat/themes/message.base.css.js.map +1 -1
  100. package/components/chat/themes/shared/chat.bootstrap.css.js +1 -1
  101. package/components/chat/themes/shared/chat.bootstrap.css.js.map +1 -1
  102. package/components/chat/themes/shared/chat.common.css.js +1 -1
  103. package/components/chat/themes/shared/chat.common.css.js.map +1 -1
  104. package/components/chat/themes/shared/chat.fluent.css.js +3 -0
  105. package/components/chat/themes/shared/chat.fluent.css.js.map +1 -0
  106. package/components/chat/themes/shared/chat.indigo.css.js +1 -1
  107. package/components/chat/themes/shared/chat.indigo.css.js.map +1 -1
  108. package/components/chat/themes/shared/input/input.bootstrap.css.js +1 -1
  109. package/components/chat/themes/shared/input/input.bootstrap.css.js.map +1 -1
  110. package/components/chat/themes/shared/input/input.fluent.css.js +1 -1
  111. package/components/chat/themes/shared/input/input.fluent.css.js.map +1 -1
  112. package/components/chat/themes/shared/input/input.material.css.js +1 -1
  113. package/components/chat/themes/shared/input/input.material.css.js.map +1 -1
  114. package/components/chat/themes/shared/message-attachments/message-attachments.common.css.js +3 -0
  115. package/components/chat/themes/shared/message-attachments/message-attachments.common.css.js.map +1 -0
  116. package/components/chat/themes/shared/message-attachments/message-attachments.indigo.css.js +3 -0
  117. package/components/chat/themes/shared/message-attachments/message-attachments.indigo.css.js.map +1 -0
  118. package/components/chat/themes/themes.js +3 -2
  119. package/components/chat/themes/themes.js.map +1 -1
  120. package/components/chat/types.d.ts +26 -133
  121. package/components/chat/types.js +1 -14
  122. package/components/chat/types.js.map +1 -1
  123. package/components/chat/utils.d.ts +16 -0
  124. package/components/chat/utils.js +86 -0
  125. package/components/chat/utils.js.map +1 -0
  126. package/components/checkbox/checkbox-base.d.ts +1 -1
  127. package/components/checkbox/themes/shared/checkbox/checkbox.bootstrap.css.js +1 -1
  128. package/components/checkbox/themes/shared/checkbox/checkbox.bootstrap.css.js.map +1 -1
  129. package/components/checkbox/themes/shared/checkbox/checkbox.fluent.css.js +1 -1
  130. package/components/checkbox/themes/shared/checkbox/checkbox.fluent.css.js.map +1 -1
  131. package/components/checkbox/themes/shared/checkbox/checkbox.indigo.css.js +1 -1
  132. package/components/checkbox/themes/shared/checkbox/checkbox.indigo.css.js.map +1 -1
  133. package/components/checkbox/themes/shared/checkbox/checkbox.material.css.js +1 -1
  134. package/components/checkbox/themes/shared/checkbox/checkbox.material.css.js.map +1 -1
  135. package/components/chip/themes/shared/chip.indigo.css.js +1 -1
  136. package/components/chip/themes/shared/chip.indigo.css.js.map +1 -1
  137. package/components/combo/themes/combo-item.base.css.js +1 -1
  138. package/components/combo/themes/combo-item.base.css.js.map +1 -1
  139. package/components/combo/themes/combo.base.css.js +1 -1
  140. package/components/combo/themes/combo.base.css.js.map +1 -1
  141. package/components/combo/themes/shared/combo.bootstrap.css.js +1 -1
  142. package/components/combo/themes/shared/combo.bootstrap.css.js.map +1 -1
  143. package/components/combo/themes/shared/combo.fluent.css.js +1 -1
  144. package/components/combo/themes/shared/combo.fluent.css.js.map +1 -1
  145. package/components/combo/themes/shared/combo.indigo.css.js +1 -1
  146. package/components/combo/themes/shared/combo.indigo.css.js.map +1 -1
  147. package/components/combo/themes/shared/combo.material.css.js +1 -1
  148. package/components/combo/themes/shared/combo.material.css.js.map +1 -1
  149. package/components/common/context.d.ts +4 -1
  150. package/components/common/context.js +2 -1
  151. package/components/common/context.js.map +1 -1
  152. package/components/common/i18n/chat.resources.d.ts +4 -4
  153. package/components/common/i18n/chat.resources.js +4 -4
  154. package/components/common/i18n/chat.resources.js.map +1 -1
  155. package/components/common/util.d.ts +8 -0
  156. package/components/common/util.js +33 -1
  157. package/components/common/util.js.map +1 -1
  158. package/components/date-picker/themes/date-picker.base.css.js +1 -1
  159. package/components/date-picker/themes/date-picker.base.css.js.map +1 -1
  160. package/components/date-picker/themes/shared/date-picker.bootstrap.css.js +1 -1
  161. package/components/date-picker/themes/shared/date-picker.bootstrap.css.js.map +1 -1
  162. package/components/date-picker/themes/shared/date-picker.common.css.js +1 -1
  163. package/components/date-picker/themes/shared/date-picker.common.css.js.map +1 -1
  164. package/components/date-picker/themes/shared/date-picker.fluent.css.js +1 -1
  165. package/components/date-picker/themes/shared/date-picker.fluent.css.js.map +1 -1
  166. package/components/date-picker/themes/shared/date-picker.indigo.css.js +1 -1
  167. package/components/date-picker/themes/shared/date-picker.indigo.css.js.map +1 -1
  168. package/components/date-range-picker/date-range-picker.base.css.js +1 -1
  169. package/components/date-range-picker/date-range-picker.base.css.js.map +1 -1
  170. package/components/date-range-picker/date-range-picker.d.ts +1 -1
  171. package/components/date-range-picker/predefined-ranges-area.base.css.js +1 -1
  172. package/components/date-range-picker/predefined-ranges-area.base.css.js.map +1 -1
  173. package/components/date-range-picker/themes/shared/date-range-picker.bootstrap.css.js +1 -1
  174. package/components/date-range-picker/themes/shared/date-range-picker.bootstrap.css.js.map +1 -1
  175. package/components/date-range-picker/themes/shared/date-range-picker.common.css.js +1 -1
  176. package/components/date-range-picker/themes/shared/date-range-picker.common.css.js.map +1 -1
  177. package/components/date-range-picker/themes/shared/date-range-picker.fluent.css.js +1 -1
  178. package/components/date-range-picker/themes/shared/date-range-picker.fluent.css.js.map +1 -1
  179. package/components/date-range-picker/themes/shared/date-range-picker.indigo.css.js +1 -1
  180. package/components/date-range-picker/themes/shared/date-range-picker.indigo.css.js.map +1 -1
  181. package/components/dialog/themes/dialog.base.css.js +1 -1
  182. package/components/dialog/themes/dialog.base.css.js.map +1 -1
  183. package/components/dialog/themes/shared/dialog.bootstrap.css.js +1 -1
  184. package/components/dialog/themes/shared/dialog.bootstrap.css.js.map +1 -1
  185. package/components/dialog/themes/shared/dialog.common.css.js +1 -1
  186. package/components/dialog/themes/shared/dialog.common.css.js.map +1 -1
  187. package/components/dialog/themes/shared/dialog.fluent.css.js +1 -1
  188. package/components/dialog/themes/shared/dialog.fluent.css.js.map +1 -1
  189. package/components/dialog/themes/shared/dialog.indigo.css.js +1 -1
  190. package/components/dialog/themes/shared/dialog.indigo.css.js.map +1 -1
  191. package/components/dropdown/themes/dropdown-item.base.css.js +1 -1
  192. package/components/dropdown/themes/dropdown-item.base.css.js.map +1 -1
  193. package/components/dropdown/themes/shared/dropdown.indigo.css.js +1 -1
  194. package/components/dropdown/themes/shared/dropdown.indigo.css.js.map +1 -1
  195. package/components/dropdown/themes/shared/item/dropdown-item.indigo.css.js +1 -1
  196. package/components/dropdown/themes/shared/item/dropdown-item.indigo.css.js.map +1 -1
  197. package/components/expansion-panel/themes/expansion-panel.base.css.js +1 -1
  198. package/components/expansion-panel/themes/expansion-panel.base.css.js.map +1 -1
  199. package/components/expansion-panel/themes/shared/expansion-panel.indigo.css.js +1 -1
  200. package/components/expansion-panel/themes/shared/expansion-panel.indigo.css.js.map +1 -1
  201. package/components/file-input/file-input.d.ts +0 -4
  202. package/components/file-input/file-input.js +12 -15
  203. package/components/file-input/file-input.js.map +1 -1
  204. package/components/file-input/themes/shared/file-input.material.css.js +1 -1
  205. package/components/file-input/themes/shared/file-input.material.css.js.map +1 -1
  206. package/components/icon/icon-references.js +130 -0
  207. package/components/icon/icon-references.js.map +1 -1
  208. package/components/icon/internal-icons-lib.js +66 -0
  209. package/components/icon/internal-icons-lib.js.map +1 -1
  210. package/components/input/input.d.ts +0 -4
  211. package/components/input/input.js +9 -11
  212. package/components/input/input.js.map +1 -1
  213. package/components/input/themes/shared/input.common.css.js +1 -1
  214. package/components/input/themes/shared/input.common.css.js.map +1 -1
  215. package/components/input/themes/shared/input.fluent.css.js +1 -1
  216. package/components/input/themes/shared/input.fluent.css.js.map +1 -1
  217. package/components/input/themes/shared/input.indigo.css.js +1 -1
  218. package/components/input/themes/shared/input.indigo.css.js.map +1 -1
  219. package/components/input/themes/shared/input.material.css.js +1 -1
  220. package/components/input/themes/shared/input.material.css.js.map +1 -1
  221. package/components/list/themes/dark/container/list.indigo.css.js +1 -1
  222. package/components/list/themes/dark/container/list.indigo.css.js.map +1 -1
  223. package/components/list/themes/dark/header/list-header.indigo.css.js +1 -1
  224. package/components/list/themes/dark/header/list-header.indigo.css.js.map +1 -1
  225. package/components/list/themes/dark/item/list-item.indigo.css.js +1 -1
  226. package/components/list/themes/dark/item/list-item.indigo.css.js.map +1 -1
  227. package/components/list/themes/light/container/list.indigo.css.js +1 -1
  228. package/components/list/themes/light/container/list.indigo.css.js.map +1 -1
  229. package/components/list/themes/light/header/list-header.indigo.css.js +1 -1
  230. package/components/list/themes/light/header/list-header.indigo.css.js.map +1 -1
  231. package/components/list/themes/light/item/list-item.indigo.css.js +1 -1
  232. package/components/list/themes/light/item/list-item.indigo.css.js.map +1 -1
  233. package/components/nav-drawer/themes/shared/container/nav-drawer.bootstrap.css.js +1 -1
  234. package/components/nav-drawer/themes/shared/container/nav-drawer.bootstrap.css.js.map +1 -1
  235. package/components/nav-drawer/themes/shared/container/nav-drawer.indigo.css.js +1 -1
  236. package/components/nav-drawer/themes/shared/container/nav-drawer.indigo.css.js.map +1 -1
  237. package/components/nav-drawer/themes/shared/container/nav-drawer.material.css.js +1 -1
  238. package/components/nav-drawer/themes/shared/container/nav-drawer.material.css.js.map +1 -1
  239. package/components/nav-drawer/themes/shared/header-item/header-item.bootstrap.css.js +1 -1
  240. package/components/nav-drawer/themes/shared/header-item/header-item.bootstrap.css.js.map +1 -1
  241. package/components/nav-drawer/themes/shared/header-item/header-item.fluent.css.js +1 -1
  242. package/components/nav-drawer/themes/shared/header-item/header-item.fluent.css.js.map +1 -1
  243. package/components/nav-drawer/themes/shared/header-item/header-item.indigo.css.js +1 -1
  244. package/components/nav-drawer/themes/shared/header-item/header-item.indigo.css.js.map +1 -1
  245. package/components/nav-drawer/themes/shared/header-item/header-item.material.css.js +1 -1
  246. package/components/nav-drawer/themes/shared/header-item/header-item.material.css.js.map +1 -1
  247. package/components/nav-drawer/themes/shared/item/item.bootstrap.css.js +1 -1
  248. package/components/nav-drawer/themes/shared/item/item.bootstrap.css.js.map +1 -1
  249. package/components/nav-drawer/themes/shared/item/item.fluent.css.js +1 -1
  250. package/components/nav-drawer/themes/shared/item/item.fluent.css.js.map +1 -1
  251. package/components/nav-drawer/themes/shared/item/item.indigo.css.js +1 -1
  252. package/components/nav-drawer/themes/shared/item/item.indigo.css.js.map +1 -1
  253. package/components/nav-drawer/themes/shared/item/item.material.css.js +1 -1
  254. package/components/nav-drawer/themes/shared/item/item.material.css.js.map +1 -1
  255. package/components/navbar/themes/navbar.base.css.js +1 -1
  256. package/components/navbar/themes/navbar.base.css.js.map +1 -1
  257. package/components/navbar/themes/shared/navbar.bootstrap.css.js +1 -1
  258. package/components/navbar/themes/shared/navbar.bootstrap.css.js.map +1 -1
  259. package/components/navbar/themes/shared/navbar.indigo.css.js +1 -1
  260. package/components/navbar/themes/shared/navbar.indigo.css.js.map +1 -1
  261. package/components/progress/themes/linear/shared/linear.progress.fluent.css.js +1 -1
  262. package/components/progress/themes/linear/shared/linear.progress.fluent.css.js.map +1 -1
  263. package/components/progress/themes/linear/shared/linear.progress.indigo.css.js +1 -1
  264. package/components/progress/themes/linear/shared/linear.progress.indigo.css.js.map +1 -1
  265. package/components/radio/themes/shared/radio.bootstrap.css.js +1 -1
  266. package/components/radio/themes/shared/radio.bootstrap.css.js.map +1 -1
  267. package/components/radio/themes/shared/radio.fluent.css.js +1 -1
  268. package/components/radio/themes/shared/radio.fluent.css.js.map +1 -1
  269. package/components/radio/themes/shared/radio.indigo.css.js +1 -1
  270. package/components/radio/themes/shared/radio.indigo.css.js.map +1 -1
  271. package/components/radio/themes/shared/radio.material.css.js +1 -1
  272. package/components/radio/themes/shared/radio.material.css.js.map +1 -1
  273. package/components/radio-group/themes/radio-group.base.css.js +1 -1
  274. package/components/radio-group/themes/radio-group.base.css.js.map +1 -1
  275. package/components/radio-group/themes/shared/radio-group.bootstrap.css.js +1 -1
  276. package/components/radio-group/themes/shared/radio-group.bootstrap.css.js.map +1 -1
  277. package/components/radio-group/themes/shared/radio-group.fluent.css.js +1 -1
  278. package/components/radio-group/themes/shared/radio-group.fluent.css.js.map +1 -1
  279. package/components/radio-group/themes/shared/radio-group.indigo.css.js +1 -1
  280. package/components/radio-group/themes/shared/radio-group.indigo.css.js.map +1 -1
  281. package/components/radio-group/themes/shared/radio-group.material.css.js +1 -1
  282. package/components/radio-group/themes/shared/radio-group.material.css.js.map +1 -1
  283. package/components/rating/themes/rating.base.css.js +1 -1
  284. package/components/rating/themes/rating.base.css.js.map +1 -1
  285. package/components/rating/themes/shared/rating.indigo.css.js +1 -1
  286. package/components/rating/themes/shared/rating.indigo.css.js.map +1 -1
  287. package/components/resize-container/resize-container.d.ts +1 -1
  288. package/components/select/select.js +0 -1
  289. package/components/select/select.js.map +1 -1
  290. package/components/select/themes/shared/select.bootstrap.css.js +1 -1
  291. package/components/select/themes/shared/select.bootstrap.css.js.map +1 -1
  292. package/components/select/themes/shared/select.fluent.css.js +1 -1
  293. package/components/select/themes/shared/select.fluent.css.js.map +1 -1
  294. package/components/select/themes/shared/select.indigo.css.js +1 -1
  295. package/components/select/themes/shared/select.indigo.css.js.map +1 -1
  296. package/components/select/themes/shared/select.material.css.js +1 -1
  297. package/components/select/themes/shared/select.material.css.js.map +1 -1
  298. package/components/slider/themes/shared/slider.common.css.js +1 -1
  299. package/components/slider/themes/shared/slider.common.css.js.map +1 -1
  300. package/components/slider/themes/slider.base.css.js +1 -1
  301. package/components/slider/themes/slider.base.css.js.map +1 -1
  302. package/components/snackbar/themes/shared/snackbar.indigo.css.js +1 -1
  303. package/components/snackbar/themes/shared/snackbar.indigo.css.js.map +1 -1
  304. package/components/snackbar/themes/snackbar.base.css.js +1 -1
  305. package/components/snackbar/themes/snackbar.base.css.js.map +1 -1
  306. package/components/stepper/step.d.ts +1 -1
  307. package/components/tabs/themes/shared/tab/tab.bootstrap.css.js +1 -1
  308. package/components/tabs/themes/shared/tab/tab.bootstrap.css.js.map +1 -1
  309. package/components/tabs/themes/shared/tab/tab.fluent.css.js +1 -1
  310. package/components/tabs/themes/shared/tab/tab.fluent.css.js.map +1 -1
  311. package/components/tabs/themes/shared/tab/tab.indigo.css.js +1 -1
  312. package/components/tabs/themes/shared/tab/tab.indigo.css.js.map +1 -1
  313. package/components/tabs/themes/shared/tab/tab.material.css.js +1 -1
  314. package/components/tabs/themes/shared/tab/tab.material.css.js.map +1 -1
  315. package/components/textarea/textarea.d.ts +1 -1
  316. package/components/textarea/themes/shared/textarea.bootstrap.css.js +1 -1
  317. package/components/textarea/themes/shared/textarea.bootstrap.css.js.map +1 -1
  318. package/components/textarea/themes/shared/textarea.fluent.css.js +1 -1
  319. package/components/textarea/themes/shared/textarea.fluent.css.js.map +1 -1
  320. package/components/textarea/themes/shared/textarea.indigo.css.js +1 -1
  321. package/components/textarea/themes/shared/textarea.indigo.css.js.map +1 -1
  322. package/components/textarea/themes/shared/textarea.material.css.js +1 -1
  323. package/components/textarea/themes/shared/textarea.material.css.js.map +1 -1
  324. package/components/textarea/themes/textarea.base.css.js +1 -1
  325. package/components/textarea/themes/textarea.base.css.js.map +1 -1
  326. package/components/tile-manager/resize-state.js +1 -1
  327. package/components/tile-manager/resize-state.js.map +1 -1
  328. package/components/toast/themes/shared/toast.bootstrap.css.js +1 -1
  329. package/components/toast/themes/shared/toast.bootstrap.css.js.map +1 -1
  330. package/components/toast/themes/shared/toast.common.css.js +1 -1
  331. package/components/toast/themes/shared/toast.common.css.js.map +1 -1
  332. package/components/toast/themes/shared/toast.fluent.css.js +1 -1
  333. package/components/toast/themes/shared/toast.fluent.css.js.map +1 -1
  334. package/components/toast/themes/toast.base.css.js +1 -1
  335. package/components/toast/themes/toast.base.css.js.map +1 -1
  336. package/components/tooltip/themes/tooltip.base.css.js +1 -1
  337. package/components/tooltip/themes/tooltip.base.css.js.map +1 -1
  338. package/components/tree/themes/item.base.css.js +1 -1
  339. package/components/tree/themes/item.base.css.js.map +1 -1
  340. package/components/tree/themes/shared/item.common.css.js +1 -1
  341. package/components/tree/themes/shared/item.common.css.js.map +1 -1
  342. package/components/tree/themes/shared/item.indigo.css.js +1 -1
  343. package/components/tree/themes/shared/item.indigo.css.js.map +1 -1
  344. package/components/tree/themes/shared/item.material.css.js +1 -1
  345. package/components/tree/themes/shared/item.material.css.js.map +1 -1
  346. package/custom-elements.json +24401 -24643
  347. package/extras/index.d.ts +1 -0
  348. package/extras/index.js +2 -0
  349. package/extras/index.js.map +1 -0
  350. package/igniteui-webcomponents.css-data.json +1 -1
  351. package/igniteui-webcomponents.html-data.json +1 -1
  352. package/index.d.ts +1 -3
  353. package/index.js +0 -2
  354. package/index.js.map +1 -1
  355. package/package.json +6 -2
  356. package/web-types.json +2 -2
  357. package/components/chat/assets/file.png +0 -0
  358. package/components/chat/assets/json.png +0 -0
  359. package/components/chat/assets/link.png +0 -0
  360. package/components/chat/chat-message-list.d.ts +0 -70
  361. package/components/chat/chat-message-list.js +0 -89
  362. package/components/chat/chat-message-list.js.map +0 -1
  363. package/components/chat/chat-renderer.d.ts +0 -14
  364. package/components/chat/chat-renderer.js +0 -39
  365. package/components/chat/chat-renderer.js.map +0 -1
  366. package/components/chat/markdown-renderer.d.ts +0 -72
  367. package/components/chat/markdown-renderer.js +0 -71
  368. package/components/chat/markdown-renderer.js.map +0 -1
  369. package/components/chat/plain-text-renderer.d.ts +0 -15
  370. package/components/chat/plain-text-renderer.js +0 -7
  371. package/components/chat/plain-text-renderer.js.map +0 -1
  372. package/components/chat/themes/message-list.base.css.js +0 -3
  373. package/components/chat/themes/message-list.base.css.js.map +0 -1
  374. package/components/chat/themes/shared/message-attachments.common.css.js +0 -3
  375. package/components/chat/themes/shared/message-attachments.common.css.js.map +0 -1
  376. package/components/chat/themes/shared/message-list.common.css.js +0 -3
  377. package/components/chat/themes/shared/message-list.common.css.js.map +0 -1
  378. /package/components/chat/themes/{message-list.base.css.d.ts → shared/chat.fluent.css.d.ts} +0 -0
  379. /package/components/chat/themes/shared/{message-attachments.common.css.d.ts → message-attachments/message-attachments.common.css.d.ts} +0 -0
  380. /package/components/chat/themes/shared/{message-list.common.css.d.ts → message-attachments/message-attachments.indigo.css.d.ts} +0 -0
@@ -7,140 +7,205 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  import { ContextProvider } from '@lit/context';
8
8
  import { html, LitElement, nothing } from 'lit';
9
9
  import { property } from 'lit/decorators.js';
10
+ import { cache } from 'lit/directives/cache.js';
11
+ import { repeat } from 'lit/directives/repeat.js';
10
12
  import { addThemingController } from '../../theming/theming-controller.js';
11
13
  import IgcButtonComponent from '../button/button.js';
12
- import { chatContext } from '../common/context.js';
14
+ import { chatContext, chatUserInputContext } from '../common/context.js';
13
15
  import { addSlotController, setSlots } from '../common/controllers/slot.js';
14
16
  import { watch } from '../common/decorators/watch.js';
15
17
  import { registerComponent } from '../common/definitions/register.js';
16
18
  import { IgcChatResourceStringEN } from '../common/i18n/chat.resources.js';
17
19
  import { EventEmitterMixin } from '../common/mixins/event-emitter.js';
20
+ import { isEmpty } from '../common/util.js';
18
21
  import IgcIconComponent from '../icon/icon.js';
19
22
  import IgcListComponent from '../list/list.js';
20
23
  import IgcListHeaderComponent from '../list/list-header.js';
21
24
  import IgcListItemComponent from '../list/list-item.js';
22
25
  import IgcChatInputComponent from './chat-input.js';
23
- import IgcChatMessageListComponent from './chat-message-list.js';
24
- import { createChatState } from './chat-state.js';
26
+ import IgcChatMessageComponent from './chat-message.js';
27
+ import { ChatState } from './chat-state.js';
25
28
  import { styles } from './themes/chat.base.css.js';
26
29
  import { styles as shared } from './themes/shared/chat.common.css.js';
27
30
  import { all } from './themes/themes.js';
28
- const Slots = setSlots('prefix', 'title', 'actions', 'suggestions-header', 'suggestions', 'suggestions-actions', 'suggestions-header', 'suggestion', 'empty-state');
31
+ const Slots = setSlots('prefix', 'title', 'actions', 'suggestions-header', 'suggestions', 'suggestions-actions', 'suggestion', 'empty-state');
29
32
  class IgcChatComponent extends EventEmitterMixin(LitElement) {
30
33
  static register() {
31
- registerComponent(IgcChatComponent, IgcChatInputComponent, IgcChatMessageListComponent, IgcButtonComponent, IgcIconComponent, IgcListComponent, IgcListItemComponent, IgcListHeaderComponent);
34
+ registerComponent(IgcChatComponent, IgcChatInputComponent, IgcChatMessageComponent, IgcButtonComponent, IgcIconComponent, IgcListComponent, IgcListItemComponent, IgcListHeaderComponent);
32
35
  }
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);
36
+ _updateContext() {
37
+ this._context.setValue(this._state, true);
38
+ }
39
+ _updateUserInputContext() {
40
+ this._userInputContext.setValue(this._state, true);
45
41
  }
46
42
  set messages(value) {
47
- this._chatState.messages = value;
43
+ this._state.messages = value;
48
44
  }
49
45
  get messages() {
50
- return this._chatState.messages;
46
+ return this._state.messages;
51
47
  }
52
48
  set draftMessage(value) {
53
- if (this._chatState && value) {
54
- this._chatState.inputValue = value.text;
55
- this._chatState.inputAttachments = value.attachments || [];
49
+ if (this._state && value) {
50
+ this._state.inputValue = value.text;
51
+ this._state.inputAttachments = value.attachments || [];
56
52
  this.requestUpdate();
57
53
  }
58
54
  }
59
55
  get draftMessage() {
60
56
  return {
61
- text: this._chatState?.inputValue,
62
- attachments: this._chatState?.inputAttachments,
57
+ text: this._state.inputValue,
58
+ attachments: this._state.inputAttachments,
63
59
  };
64
60
  }
65
61
  set options(value) {
66
- this._chatState.options = value;
62
+ this._state.options = value;
67
63
  }
68
64
  get options() {
69
- return this._chatState.options;
65
+ return this._state.options;
66
+ }
67
+ constructor() {
68
+ super();
69
+ this._state = new ChatState(this, this._updateContext, this._updateUserInputContext);
70
+ this._slots = addSlotController(this, {
71
+ slots: Slots,
72
+ });
73
+ this._context = new ContextProvider(this, {
74
+ context: chatContext,
75
+ initialValue: this._state,
76
+ });
77
+ this._userInputContext = new ContextProvider(this, {
78
+ context: chatUserInputContext,
79
+ initialValue: this._state,
80
+ });
81
+ this.resourceStrings = IgcChatResourceStringEN;
82
+ addThemingController(this, all);
83
+ }
84
+ contextChanged() {
85
+ this._context.setValue(this._state, true);
70
86
  }
71
87
  scrollToMessage(messageId) {
72
- const messageListComponent = this.shadowRoot?.querySelector('igc-chat-message-list');
73
- if (!messageListComponent) {
74
- return;
88
+ if (!isEmpty(this.messages)) {
89
+ const message = this.renderRoot.querySelector(`#message-${messageId}`);
90
+ message?.scrollIntoView({ block: 'end', inline: 'end' });
75
91
  }
76
- const messageElement = messageListComponent.shadowRoot?.querySelector(`#message-${messageId}`);
77
- if (!messageElement) {
78
- return;
92
+ }
93
+ updateContextValue() {
94
+ this._context.setValue(this._state, true);
95
+ }
96
+ updated(properties) {
97
+ if (properties.has('messages') && !this._state.disableAutoScroll) {
98
+ this._scrollToBottom();
79
99
  }
80
- messageElement.scrollIntoView({
81
- behavior: 'smooth',
82
- block: 'center',
83
- inline: 'nearest',
84
- });
85
100
  }
86
- contextChanged() {
87
- this._context.setValue(this._chatState, true);
101
+ _scrollToBottom() {
102
+ if (!isEmpty(this.messages)) {
103
+ const lastMessage = this.renderRoot
104
+ .querySelectorAll(IgcChatMessageComponent.tagName)
105
+ .item(this.messages.length - 1);
106
+ requestAnimationFrame(() => lastMessage.scrollIntoView({ block: 'end', inline: 'end' }));
107
+ }
88
108
  }
89
- renderHeader() {
109
+ _renderHeader() {
90
110
  const hasContent = this._slots.hasAssignedElements('prefix') ||
91
111
  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() {
112
+ this._slots.hasAssignedElements('actions') ||
113
+ this._state.options?.headerText;
114
+ return html `
115
+ <div part="header" ?hidden=${!hasContent}>
116
+ <slot name="prefix" part="prefix"></slot>
117
+ <slot name="title" part="title"
118
+ >${this._state.options?.headerText}</slot
119
+ >
120
+ <slot name="actions" part="actions"></slot>
121
+ </div>
122
+ `;
123
+ }
124
+ _renderMessages() {
125
+ return html `
126
+ <div part="message-list" tabindex="0">
127
+ ${repeat(this._state.messages, (message) => message.id, (message) => {
128
+ return html `
129
+ <igc-chat-message
130
+ id=${`message-${message.id}`}
131
+ part="message-item"
132
+ .message=${message}
133
+ exportparts="message-container, message-text, message-attachments, message-actions,
134
+ attachments-container, attachment, attachment-header, attachment-content, attachment-icon, file-name, actions: attachment-actions"
135
+ >
136
+ </igc-chat-message>
137
+ `;
138
+ })}
139
+ ${this._state.options?.isTyping
140
+ ? (this._state.options?.renderers?.typingIndicator?.({
141
+ param: undefined,
142
+ defaults: {
143
+ typingIndicator: () => this._renderLoadingTemplate(),
144
+ },
145
+ options: this._state.options,
146
+ }) ?? this._renderLoadingTemplate())
147
+ : nothing}
148
+ </div>
149
+ `;
150
+ }
151
+ _renderLoadingTemplate() {
152
+ return html `
153
+ <div part="typing-indicator">
154
+ <div part="typing-dot"></div>
155
+ <div part="typing-dot"></div>
156
+ <div part="typing-dot"></div>
157
+ <div part="typing-dot"></div>
158
+ </div>
159
+ `;
160
+ }
161
+ _renderSuggestionPrefix() {
162
+ return html `
163
+ <span slot="start">
164
+ <igc-icon name="auto_suggest"></igc-icon>
165
+ </span>
166
+ `;
167
+ }
168
+ _renderSuggestions() {
113
169
  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>`;
170
+ const suggestions = this._state.options?.suggestions ?? [];
171
+ return html `
172
+ <div part="suggestions-container">
173
+ <igc-list>
174
+ <igc-list-header part="suggestions-header">
175
+ <span ?hidden=${hasContent}>
176
+ ${this.resourceStrings.suggestionsHeader}
177
+ </span>
178
+ <slot name="suggestions-header"></slot>
179
+ </igc-list-header>
180
+ <slot name="suggestions" part="suggestions">
181
+ ${suggestions.map((suggestion) => html `
182
+ <slot name="suggestion" part="suggestion">
183
+ <igc-list-item
184
+ @click=${() => this._state?.handleSuggestionClick(suggestion)}
185
+ >
186
+ ${this._renderSuggestionPrefix()}
187
+ <span slot="title">${suggestion}</span>
188
+ </igc-list-item>
189
+ </slot>
190
+ `)}
191
+ </slot>
192
+ <slot name="suggestions-actions" part="suggestions-actions"></slot>
193
+ </igc-list>
194
+ </div>
195
+ `;
137
196
  }
138
- updateContextValue() {
139
- this._context.setValue(this._chatState, true);
197
+ _renderEmptyState() {
198
+ return html `
199
+ <div part="empty-state">
200
+ <slot name="empty-state"></slot>
201
+ </div>
202
+ `;
140
203
  }
141
204
  render() {
142
- const hasSuggestions = this._chatState.options?.suggestions &&
143
- this._chatState.options.suggestions.length > 0;
205
+ const hasMessages = !isEmpty(this.messages);
206
+ const suggestions = isEmpty(this._state.options?.suggestions ?? [])
207
+ ? nothing
208
+ : this._renderSuggestions();
144
209
  return html `
145
210
  <div
146
211
  part="chat-container"
@@ -175,37 +240,17 @@ class IgcChatComponent extends EventEmitterMixin(LitElement) {
175
240
  attachment-actions
176
241
  "
177
242
  >
178
- ${this.renderHeader()}
243
+ ${this._renderHeader()}
244
+
179
245
  <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()
246
+ ${cache(hasMessages || this._state.options?.isTyping
247
+ ? this._renderMessages()
248
+ : this._renderEmptyState())}
249
+ ${this._state.suggestionsPosition === 'below-messages'
250
+ ? suggestions
207
251
  : nothing}
208
252
  </div>
253
+
209
254
  <igc-chat-input
210
255
  exportparts="
211
256
  input-container,
@@ -219,9 +264,8 @@ class IgcChatComponent extends EventEmitterMixin(LitElement) {
219
264
  send-button"
220
265
  >
221
266
  </igc-chat-input>
222
- ${hasSuggestions &&
223
- this._chatState.suggestionsPosition === 'below-input'
224
- ? this.renderSuggestions()
267
+ ${this._state.suggestionsPosition === 'below-input'
268
+ ? suggestions
225
269
  : nothing}
226
270
  </div>
227
271
  `;
@@ -1 +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"]}
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, type PropertyValues } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { cache } from 'lit/directives/cache.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { addThemingController } from '../../theming/theming-controller.js';\nimport IgcButtonComponent from '../button/button.js';\nimport { chatContext, chatUserInputContext } 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 { isEmpty } from '../common/util.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 IgcChatMessageComponent from './chat-message.js';\nimport { ChatState } 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 igcMessageCreated: CustomEvent<IgcMessage>;\n\n /**\n * Dispatched when a message is reacted to.\n */\n igcMessageReact: CustomEvent<{ message: IgcMessage; reaction: string }>;\n\n /**\n * Dispatched when a chat message attachment is clicked.\n */\n igcAttachmentClick: CustomEvent<IgcMessageAttachment>;\n\n /**\n * Dispatched when an attachment is changed (e.g., updated or removed).\n */\n igcAttachmentChange: CustomEvent<IgcMessageAttachment>;\n\n /**\n * Dispatched during an attachment drag operation.\n */\n igcAttachmentDrag: CustomEvent<void>;\n\n /**\n * Dispatched when an attachment is dropped (e.g., in a drag-and-drop operation).\n */\n igcAttachmentDrop: CustomEvent<void>;\n\n /**\n * Dispatched when the typing status changes (e.g., user starts or stops typing).\n */\n igcTypingChange: CustomEvent<boolean>;\n\n /**\n * Dispatched when the chat input field gains focus.\n */\n igcInputFocus: CustomEvent<void>;\n\n /**\n * Dispatched when the chat input field loses focus.\n */\n igcInputBlur: CustomEvent<void>;\n\n /**\n * Dispatched when the content of the chat input changes.\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 'suggestion',\n 'empty-state'\n);\n\n/**\n * A chat UI component for displaying messages, attachments, and input interaction.\n *\n * @element igc-chat\n *\n * @fires igcMessageCreated - Dispatched when a new chat message is created (sent).\n * @fires igcMessageReact - Dispatched when a message is reacted to.\n * @fires igcAttachmentClick - Dispatched when a chat message attachment is clicked.\n * @fires igcAttachmentChange - Dispatched when a message attachment is changed (e.g., updated or removed).\n * @fires igcAttachmentDrag - Dispatched during an attachment drag operation.\n * @fires igcAttachmentDrop - Dispatched when an attachment is dropped (e.g., in a drag-and-drop operation).\n * @fires igcTypingChange - Dispatched when the typing status changes (e.g., user starts or stops typing).\n * @fires igcInputFocus - Dispatched when the chat input field gains focus.\n * @fires igcInputBlur - Dispatched when the chat input field loses focus.\n * @fires igcInputChange - Dispatched when the content of the chat input changes.\n *\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 public static register(): void {\n registerComponent(\n IgcChatComponent,\n IgcChatInputComponent,\n IgcChatMessageComponent,\n IgcButtonComponent,\n IgcIconComponent,\n IgcListComponent,\n IgcListItemComponent,\n IgcListHeaderComponent\n );\n }\n\n private readonly _state = new ChatState(\n this,\n this._updateContext,\n this._updateUserInputContext\n );\n\n private readonly _slots = addSlotController(this, {\n slots: Slots,\n });\n\n private readonly _context = new ContextProvider(this, {\n context: chatContext,\n initialValue: this._state,\n });\n\n private readonly _userInputContext = new ContextProvider(this, {\n context: chatUserInputContext,\n initialValue: this._state,\n });\n\n private _updateContext(): void {\n this._context.setValue(this._state, true);\n }\n\n private _updateUserInputContext(): void {\n this._userInputContext.setValue(this._state, true);\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._state.messages = value;\n }\n\n public get messages(): IgcMessage[] {\n return this._state.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._state && value) {\n this._state.inputValue = value.text;\n this._state.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._state.inputValue,\n attachments: this._state.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._state.options = value;\n }\n\n public get options(): IgcChatOptions | undefined {\n return this._state.options;\n }\n\n /**\n * The resource strings of the chat.\n */\n @property({ attribute: false })\n public resourceStrings = IgcChatResourceStringEN;\n\n constructor() {\n super();\n addThemingController(this, all);\n }\n\n @watch('messages')\n @watch('draftMessage')\n @watch('options')\n protected contextChanged() {\n this._context.setValue(this._state, true);\n }\n\n // REVIEW: Maybe accept an `IgcMessage` type as well?\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): void {\n if (!isEmpty(this.messages)) {\n const message = this.renderRoot.querySelector(`#message-${messageId}`);\n message?.scrollIntoView({ block: 'end', inline: 'end' });\n }\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._state, true);\n }\n\n protected override updated(properties: PropertyValues<this>): void {\n if (properties.has('messages') && !this._state.disableAutoScroll) {\n this._scrollToBottom();\n }\n }\n\n private _scrollToBottom(): void {\n if (!isEmpty(this.messages)) {\n const lastMessage = this.renderRoot\n .querySelectorAll(IgcChatMessageComponent.tagName)\n .item(this.messages.length - 1);\n\n requestAnimationFrame(() =>\n lastMessage.scrollIntoView({ block: 'end', inline: 'end' })\n );\n }\n }\n\n private _renderHeader() {\n const hasContent =\n this._slots.hasAssignedElements('prefix') ||\n this._slots.hasAssignedElements('title') ||\n this._slots.hasAssignedElements('actions') ||\n this._state.options?.headerText;\n\n return html`\n <div part=\"header\" ?hidden=${!hasContent}>\n <slot name=\"prefix\" part=\"prefix\"></slot>\n <slot name=\"title\" part=\"title\"\n >${this._state.options?.headerText}</slot\n >\n <slot name=\"actions\" part=\"actions\"></slot>\n </div>\n `;\n }\n\n private _renderMessages() {\n return html`\n <div part=\"message-list\" tabindex=\"0\">\n ${repeat(\n this._state.messages,\n (message) => message.id,\n (message) => {\n return html`\n <igc-chat-message\n id=${`message-${message.id}`}\n part=\"message-item\"\n .message=${message}\n exportparts=\"message-container, message-text, message-attachments, message-actions,\n attachments-container, attachment, attachment-header, attachment-content, attachment-icon, file-name, actions: attachment-actions\"\n >\n </igc-chat-message>\n `;\n }\n )}\n ${this._state.options?.isTyping\n ? (this._state.options?.renderers?.typingIndicator?.({\n param: undefined,\n defaults: {\n typingIndicator: () => this._renderLoadingTemplate(),\n },\n options: this._state.options,\n }) ?? this._renderLoadingTemplate())\n : nothing}\n </div>\n `;\n }\n\n private _renderLoadingTemplate() {\n return html`\n <div part=\"typing-indicator\">\n <div part=\"typing-dot\"></div>\n <div part=\"typing-dot\"></div>\n <div part=\"typing-dot\"></div>\n <div part=\"typing-dot\"></div>\n </div>\n `;\n }\n\n private _renderSuggestionPrefix() {\n return html`\n <span slot=\"start\">\n <igc-icon name=\"auto_suggest\"></igc-icon>\n </span>\n `;\n }\n\n private _renderSuggestions() {\n const hasContent = this._slots.hasAssignedElements('suggestions-header');\n const suggestions = this._state.options?.suggestions ?? [];\n\n return html`\n <div part=\"suggestions-container\">\n <igc-list>\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 ${suggestions.map(\n (suggestion) => html`\n <slot name=\"suggestion\" part=\"suggestion\">\n <igc-list-item\n @click=${() =>\n this._state?.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 private _renderEmptyState() {\n return html`\n <div part=\"empty-state\">\n <slot name=\"empty-state\"></slot>\n </div>\n `;\n }\n\n protected override render() {\n const hasMessages = !isEmpty(this.messages);\n const suggestions = isEmpty(this._state.options?.suggestions ?? [])\n ? nothing\n : this._renderSuggestions();\n\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\n <div part=\"chat-wrapper\">\n ${cache(\n hasMessages || this._state.options?.isTyping\n ? this._renderMessages()\n : this._renderEmptyState()\n )}\n ${this._state.suggestionsPosition === 'below-messages'\n ? suggestions\n : nothing}\n </div>\n\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 ${this._state.suggestionsPosition === 'below-input'\n ? suggestions\n : nothing}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'igc-chat': IgcChatComponent;\n }\n}\n"]}
@@ -0,0 +1,23 @@
1
+ import type { IgcMessage } from '../types.js';
2
+ /**
3
+ * Options to configure the MarkdownMessageRenderer.
4
+ */
5
+ export interface MarkdownRendererOptions {
6
+ /**
7
+ * If true, disables syntax highlighting entirely.
8
+ */
9
+ noHighlighter?: boolean;
10
+ /**
11
+ * List of programming languages to support in syntax highlighting.
12
+ */
13
+ languages?: string[];
14
+ /**
15
+ * The theme used by the syntax highlighter (e.g., 'github-light').
16
+ */
17
+ theme?: string;
18
+ /**
19
+ * A custom HTML sanitization function. Defaults to DOMPurify.sanitize.
20
+ */
21
+ sanitizer?: (html: string) => string;
22
+ }
23
+ export declare function createMarkdownRenderer(options?: MarkdownRendererOptions): Promise<(message: IgcMessage) => Promise<unknown>>;
@@ -0,0 +1,44 @@
1
+ import DOMPurify from 'dompurify';
2
+ import { unsafeHTML } from 'lit/directives/unsafe-html.js';
3
+ import { Marked } from 'marked';
4
+ import markedShiki from 'marked-shiki';
5
+ import { getSingletonHighlighter } from 'shiki';
6
+ export async function createMarkdownRenderer(options) {
7
+ const sanitizer = options?.sanitizer ?? DOMPurify.sanitize;
8
+ const markedInstance = new Marked({
9
+ breaks: true,
10
+ gfm: true,
11
+ extensions: [
12
+ {
13
+ name: 'link',
14
+ renderer({ href, title, text }) {
15
+ return `<a href="${href}" target="_blank" rel="noopener noreferrer" ${title ? `title="${title}"` : ''}>${text}</a>`;
16
+ },
17
+ },
18
+ ],
19
+ });
20
+ if (!options?.noHighlighter) {
21
+ const themes = [options?.theme ?? 'github-light'];
22
+ const langs = options?.languages
23
+ ? options.languages
24
+ : ['javascript', 'typescript', 'html', 'css'];
25
+ const shikiInstance = await getSingletonHighlighter({
26
+ themes,
27
+ langs,
28
+ });
29
+ markedInstance.use(markedShiki({
30
+ highlight(code, lang, _) {
31
+ return shikiInstance.codeToHtml(code, {
32
+ lang,
33
+ themes: { light: themes[0] },
34
+ });
35
+ },
36
+ }));
37
+ }
38
+ return async (message) => {
39
+ return message.text
40
+ ? unsafeHTML(sanitizer(await markedInstance.parse(message.text)))
41
+ : '';
42
+ };
43
+ }
44
+ //# sourceMappingURL=markdown-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-renderer.js","sourceRoot":"","sources":["../../../../src/components/chat/extras/markdown-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,WAAW,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,OAAO,CAAC;AA4BhD,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,OAAiC;IAEjC,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,SAAS,CAAC,QAAQ,CAAC;IAE3D,MAAM,cAAc,GAAG,IAAI,MAAM,CAAC;QAChC,MAAM,EAAE,IAAI;QACZ,GAAG,EAAE,IAAI;QACT,UAAU,EAAE;YACV;gBACE,IAAI,EAAE,MAAM;gBACZ,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;oBAC5B,OAAO,YAAY,IAAI,+CAA+C,KAAK,CAAC,CAAC,CAAC,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,MAAM,CAAC;gBACtH,CAAC;aACF;SACF;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,CAAC,OAAO,EAAE,KAAK,IAAI,cAAc,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,OAAO,EAAE,SAAS;YAC9B,CAAC,CAAC,OAAO,CAAC,SAAS;YACnB,CAAC,CAAC,CAAC,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAEhD,MAAM,aAAa,GAAG,MAAM,uBAAuB,CAAC;YAClD,MAAM;YACN,KAAK;SACN,CAAC,CAAC;QAEH,cAAc,CAAC,GAAG,CAChB,WAAW,CAAC;YACV,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;gBACrB,OAAO,aAAa,CAAC,UAAU,CAAC,IAAI,EAAE;oBACpC,IAAI;oBACJ,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE;iBAC7B,CAAC,CAAC;YACL,CAAC;SACF,CAAC,CACH,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,EAAE,OAAmB,EAAoB,EAAE;QACrD,OAAO,OAAO,CAAC,IAAI;YACjB,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YACjE,CAAC,CAAC,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import DOMPurify from 'dompurify';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport { Marked } from 'marked';\nimport markedShiki from 'marked-shiki';\nimport { getSingletonHighlighter } from 'shiki';\nimport type { 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 * 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\nexport async function createMarkdownRenderer(\n options?: MarkdownRendererOptions\n) {\n const sanitizer = options?.sanitizer ?? DOMPurify.sanitize;\n\n const markedInstance = new Marked({\n breaks: true,\n gfm: true,\n extensions: [\n {\n name: 'link',\n renderer({ href, title, text }) {\n return `<a href=\"${href}\" target=\"_blank\" rel=\"noopener noreferrer\" ${title ? `title=\"${title}\"` : ''}>${text}</a>`;\n },\n },\n ],\n });\n\n if (!options?.noHighlighter) {\n const themes = [options?.theme ?? 'github-light'];\n const langs = options?.languages\n ? options.languages\n : ['javascript', 'typescript', 'html', 'css'];\n\n const shikiInstance = await getSingletonHighlighter({\n themes,\n langs,\n });\n\n markedInstance.use(\n markedShiki({\n highlight(code, lang, _) {\n return shikiInstance.codeToHtml(code, {\n lang,\n themes: { light: themes[0] },\n });\n },\n })\n );\n }\n\n return async (message: IgcMessage): Promise<unknown> => {\n return message.text\n ? unsafeHTML(sanitizer(await markedInstance.parse(message.text)))\n : '';\n };\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { LitElement } from 'lit';
2
- import { type IgcMessage } from './types.js';
1
+ import { LitElement, nothing } from 'lit';
2
+ import type { IgcMessage } from './types.js';
3
3
  /**
4
4
  * A component that renders message attachments within a chat.
5
5
  *
@@ -22,14 +22,32 @@ import { type IgcMessage } from './types.js';
22
22
  export default class IgcMessageAttachmentsComponent extends LitElement {
23
23
  static readonly tagName = "igc-message-attachments";
24
24
  static styles: import("lit").CSSResult[];
25
- private _chatState?;
26
25
  static register(): void;
26
+ private readonly _defaults;
27
+ private readonly _state;
27
28
  /**
28
29
  * The array of attachments to render.
29
30
  */
30
- message: IgcMessage | undefined;
31
+ message?: IgcMessage;
31
32
  constructor();
32
- protected render(): import("lit-html").TemplateResult<1>;
33
+ private _getRenderers;
34
+ private _handleHeaderClick;
35
+ /**
36
+ * Default attachment header template used when no custom template is provided.
37
+ * Renders the attachment icon and name.
38
+ * @param attachment The message attachment to render
39
+ * @returns TemplateResult containing the rendered attachment header
40
+ */
41
+ private renderHeader;
42
+ /**
43
+ * Default attachment content template used when no custom template is provided.
44
+ * Renders the attachment content based on its type.
45
+ * @param attachment The message attachment to render
46
+ * @returns TemplateResult containing the rendered attachment content
47
+ */
48
+ private _renderContent;
49
+ private _renderAttachment;
50
+ protected render(): typeof nothing | import("lit-html").TemplateResult<1>;
33
51
  }
34
52
  declare global {
35
53
  interface HTMLElementTagNameMap {