igniteui-webcomponents 6.1.2 → 6.3.0-alpha.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 (348) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/LICENSE +1 -1
  3. package/README.md +13 -1
  4. package/components/card/themes/content.js +7 -0
  5. package/components/card/themes/content.js.map +1 -1
  6. package/components/card/themes/shared/content/card.content.indigo.css.d.ts +1 -0
  7. package/components/card/themes/shared/content/card.content.indigo.css.js +3 -0
  8. package/components/card/themes/shared/content/card.content.indigo.css.js.map +1 -0
  9. package/components/carousel/carousel-indicator.d.ts +1 -1
  10. package/components/carousel/carousel-indicator.js.map +1 -1
  11. package/components/carousel/carousel-slide.d.ts +3 -3
  12. package/components/carousel/carousel-slide.js +7 -13
  13. package/components/carousel/carousel-slide.js.map +1 -1
  14. package/components/carousel/carousel.d.ts +39 -38
  15. package/components/carousel/carousel.js +160 -153
  16. package/components/carousel/carousel.js.map +1 -1
  17. package/components/chat/chat-input.d.ts +70 -0
  18. package/components/chat/chat-input.js +266 -0
  19. package/components/chat/chat-input.js.map +1 -0
  20. package/components/chat/chat-message-list.d.ts +111 -0
  21. package/components/chat/chat-message-list.js +178 -0
  22. package/components/chat/chat-message-list.js.map +1 -0
  23. package/components/chat/chat-message.d.ts +57 -0
  24. package/components/chat/chat-message.js +59 -0
  25. package/components/chat/chat-message.js.map +1 -0
  26. package/components/chat/chat-state.d.ts +155 -0
  27. package/components/chat/chat-state.js +167 -0
  28. package/components/chat/chat-state.js.map +1 -0
  29. package/components/chat/chat.d.ts +164 -0
  30. package/components/chat/chat.js +168 -0
  31. package/components/chat/chat.js.map +1 -0
  32. package/components/chat/markdown-util.d.ts +2 -0
  33. package/components/chat/markdown-util.js +22 -0
  34. package/components/chat/markdown-util.js.map +1 -0
  35. package/components/chat/message-attachments.d.ts +45 -0
  36. package/components/chat/message-attachments.js +127 -0
  37. package/components/chat/message-attachments.js.map +1 -0
  38. package/components/chat/themes/chat.base.css.d.ts +1 -0
  39. package/components/chat/themes/chat.base.css.js +3 -0
  40. package/components/chat/themes/chat.base.css.js.map +1 -0
  41. package/components/chat/themes/dark/chat.bootstrap.css.d.ts +1 -0
  42. package/components/chat/themes/dark/chat.bootstrap.css.js +3 -0
  43. package/components/chat/themes/dark/chat.bootstrap.css.js.map +1 -0
  44. package/components/chat/themes/dark/chat.fluent.css.d.ts +1 -0
  45. package/components/chat/themes/dark/chat.fluent.css.js +3 -0
  46. package/components/chat/themes/dark/chat.fluent.css.js.map +1 -0
  47. package/components/chat/themes/dark/chat.indigo.css.d.ts +1 -0
  48. package/components/chat/themes/dark/chat.indigo.css.js +3 -0
  49. package/components/chat/themes/dark/chat.indigo.css.js.map +1 -0
  50. package/components/chat/themes/dark/chat.material.css.d.ts +1 -0
  51. package/components/chat/themes/dark/chat.material.css.js +3 -0
  52. package/components/chat/themes/dark/chat.material.css.js.map +1 -0
  53. package/components/chat/themes/input.base.css.d.ts +1 -0
  54. package/components/chat/themes/input.base.css.js +3 -0
  55. package/components/chat/themes/input.base.css.js.map +1 -0
  56. package/components/chat/themes/input.d.ts +2 -0
  57. package/components/chat/themes/input.js +35 -0
  58. package/components/chat/themes/input.js.map +1 -0
  59. package/components/chat/themes/light/chat.bootstrap.css.d.ts +1 -0
  60. package/components/chat/themes/light/chat.bootstrap.css.js +3 -0
  61. package/components/chat/themes/light/chat.bootstrap.css.js.map +1 -0
  62. package/components/chat/themes/light/chat.fluent.css.d.ts +1 -0
  63. package/components/chat/themes/light/chat.fluent.css.js +3 -0
  64. package/components/chat/themes/light/chat.fluent.css.js.map +1 -0
  65. package/components/chat/themes/light/chat.indigo.css.d.ts +1 -0
  66. package/components/chat/themes/light/chat.indigo.css.js +3 -0
  67. package/components/chat/themes/light/chat.indigo.css.js.map +1 -0
  68. package/components/chat/themes/light/chat.material.css.d.ts +1 -0
  69. package/components/chat/themes/light/chat.material.css.js +3 -0
  70. package/components/chat/themes/light/chat.material.css.js.map +1 -0
  71. package/components/chat/themes/light/chat.shared.css.d.ts +1 -0
  72. package/components/chat/themes/light/chat.shared.css.js +3 -0
  73. package/components/chat/themes/light/chat.shared.css.js.map +1 -0
  74. package/components/chat/themes/message-attachments.base.css.d.ts +1 -0
  75. package/components/chat/themes/message-attachments.base.css.js +3 -0
  76. package/components/chat/themes/message-attachments.base.css.js.map +1 -0
  77. package/components/chat/themes/message-list.base.css.d.ts +1 -0
  78. package/components/chat/themes/message-list.base.css.js +3 -0
  79. package/components/chat/themes/message-list.base.css.js.map +1 -0
  80. package/components/chat/themes/message.base.css.d.ts +1 -0
  81. package/components/chat/themes/message.base.css.js +3 -0
  82. package/components/chat/themes/message.base.css.js.map +1 -0
  83. package/components/chat/themes/shared/chat-message.common.css.d.ts +1 -0
  84. package/components/chat/themes/shared/chat-message.common.css.js +3 -0
  85. package/components/chat/themes/shared/chat-message.common.css.js.map +1 -0
  86. package/components/chat/themes/shared/chat.common.css.d.ts +1 -0
  87. package/components/chat/themes/shared/chat.common.css.js +3 -0
  88. package/components/chat/themes/shared/chat.common.css.js.map +1 -0
  89. package/components/chat/themes/shared/input/input.bootstrap.css.d.ts +1 -0
  90. package/components/chat/themes/shared/input/input.bootstrap.css.js +3 -0
  91. package/components/chat/themes/shared/input/input.bootstrap.css.js.map +1 -0
  92. package/components/chat/themes/shared/input/input.common.css.d.ts +1 -0
  93. package/components/chat/themes/shared/input/input.common.css.js +3 -0
  94. package/components/chat/themes/shared/input/input.common.css.js.map +1 -0
  95. package/components/chat/themes/shared/input/input.fluent.css.d.ts +1 -0
  96. package/components/chat/themes/shared/input/input.fluent.css.js +3 -0
  97. package/components/chat/themes/shared/input/input.fluent.css.js.map +1 -0
  98. package/components/chat/themes/shared/input/input.indigo.css.d.ts +1 -0
  99. package/components/chat/themes/shared/input/input.indigo.css.js +3 -0
  100. package/components/chat/themes/shared/input/input.indigo.css.js.map +1 -0
  101. package/components/chat/themes/shared/input/input.material.css.d.ts +1 -0
  102. package/components/chat/themes/shared/input/input.material.css.js +3 -0
  103. package/components/chat/themes/shared/input/input.material.css.js.map +1 -0
  104. package/components/chat/themes/shared/message-attachments.common.css.d.ts +1 -0
  105. package/components/chat/themes/shared/message-attachments.common.css.js +3 -0
  106. package/components/chat/themes/shared/message-attachments.common.css.js.map +1 -0
  107. package/components/chat/themes/shared/message-list.common.css.d.ts +1 -0
  108. package/components/chat/themes/shared/message-list.common.css.js +3 -0
  109. package/components/chat/themes/shared/message-list.common.css.js.map +1 -0
  110. package/components/chat/themes/themes.d.ts +2 -0
  111. package/components/chat/themes/themes.js +46 -0
  112. package/components/chat/themes/themes.js.map +1 -0
  113. package/components/chat/types.d.ts +190 -0
  114. package/components/chat/types.js +8 -0
  115. package/components/chat/types.js.map +1 -0
  116. package/components/checkbox/checkbox-base.d.ts +3 -5
  117. package/components/checkbox/checkbox-base.js +15 -21
  118. package/components/checkbox/checkbox-base.js.map +1 -1
  119. package/components/checkbox/checkbox.d.ts +3 -4
  120. package/components/checkbox/checkbox.js +18 -17
  121. package/components/checkbox/checkbox.js.map +1 -1
  122. package/components/checkbox/switch.d.ts +0 -1
  123. package/components/checkbox/switch.js +7 -10
  124. package/components/checkbox/switch.js.map +1 -1
  125. package/components/checkbox/themes/dark/checkbox/checkbox.bootstrap.css.js +1 -1
  126. package/components/checkbox/themes/dark/checkbox/checkbox.bootstrap.css.js.map +1 -1
  127. package/components/checkbox/themes/dark/checkbox/checkbox.fluent.css.js +1 -1
  128. package/components/checkbox/themes/dark/checkbox/checkbox.fluent.css.js.map +1 -1
  129. package/components/checkbox/themes/dark/switch/switch.bootstrap.css.js +1 -1
  130. package/components/checkbox/themes/dark/switch/switch.bootstrap.css.js.map +1 -1
  131. package/components/checkbox/themes/dark/switch/switch.fluent.css.js +1 -1
  132. package/components/checkbox/themes/dark/switch/switch.fluent.css.js.map +1 -1
  133. package/components/checkbox/themes/dark/switch/switch.indigo.css.js +1 -1
  134. package/components/checkbox/themes/dark/switch/switch.indigo.css.js.map +1 -1
  135. package/components/checkbox/themes/dark/switch/switch.material.css.js +1 -1
  136. package/components/checkbox/themes/dark/switch/switch.material.css.js.map +1 -1
  137. package/components/checkbox/themes/light/switch/switch.bootstrap.css.js +1 -1
  138. package/components/checkbox/themes/light/switch/switch.bootstrap.css.js.map +1 -1
  139. package/components/checkbox/themes/light/switch/switch.fluent.css.js +1 -1
  140. package/components/checkbox/themes/light/switch/switch.fluent.css.js.map +1 -1
  141. package/components/checkbox/themes/light/switch/switch.indigo.css.js +1 -1
  142. package/components/checkbox/themes/light/switch/switch.indigo.css.js.map +1 -1
  143. package/components/checkbox/themes/light/switch/switch.material.css.js +1 -1
  144. package/components/checkbox/themes/light/switch/switch.material.css.js.map +1 -1
  145. package/components/checkbox/themes/shared/checkbox/checkbox.bootstrap.css.js +1 -1
  146. package/components/checkbox/themes/shared/checkbox/checkbox.bootstrap.css.js.map +1 -1
  147. package/components/checkbox/themes/shared/checkbox/checkbox.common.css.js +1 -1
  148. package/components/checkbox/themes/shared/checkbox/checkbox.common.css.js.map +1 -1
  149. package/components/checkbox/themes/shared/checkbox/checkbox.fluent.css.js +1 -1
  150. package/components/checkbox/themes/shared/checkbox/checkbox.fluent.css.js.map +1 -1
  151. package/components/checkbox/themes/shared/checkbox/checkbox.indigo.css.js +1 -1
  152. package/components/checkbox/themes/shared/checkbox/checkbox.indigo.css.js.map +1 -1
  153. package/components/checkbox/themes/shared/checkbox/checkbox.material.css.js +1 -1
  154. package/components/checkbox/themes/shared/checkbox/checkbox.material.css.js.map +1 -1
  155. package/components/chip/chip.d.ts +11 -11
  156. package/components/chip/chip.js +61 -65
  157. package/components/chip/chip.js.map +1 -1
  158. package/components/combo/combo.d.ts +3 -3
  159. package/components/combo/combo.js +12 -6
  160. package/components/combo/combo.js.map +1 -1
  161. package/components/combo/themes/shared/combo.common.css.js +1 -1
  162. package/components/combo/themes/shared/combo.common.css.js.map +1 -1
  163. package/components/combo/themes/shared/combo.indigo.css.js +1 -1
  164. package/components/combo/themes/shared/combo.indigo.css.js.map +1 -1
  165. package/components/combo/themes/shared/combo.material.css.js +1 -1
  166. package/components/combo/themes/shared/combo.material.css.js.map +1 -1
  167. package/components/common/context.d.ts +5 -1
  168. package/components/common/context.js +2 -1
  169. package/components/common/context.js.map +1 -1
  170. package/components/common/controllers/internals.d.ts +66 -2
  171. package/components/common/controllers/internals.js +21 -0
  172. package/components/common/controllers/internals.js.map +1 -1
  173. package/components/common/controllers/slot.d.ts +87 -0
  174. package/components/common/controllers/slot.js +75 -0
  175. package/components/common/controllers/slot.js.map +1 -0
  176. package/components/common/definitions/defineAllComponents.js +2 -0
  177. package/components/common/definitions/defineAllComponents.js.map +1 -1
  178. package/components/common/mixins/forms/associated.d.ts +1 -1
  179. package/components/common/mixins/forms/associated.js +91 -36
  180. package/components/common/mixins/forms/associated.js.map +1 -1
  181. package/components/common/mixins/forms/form-transformers.d.ts +21 -0
  182. package/components/common/mixins/forms/form-transformers.js +64 -0
  183. package/components/common/mixins/forms/form-transformers.js.map +1 -0
  184. package/components/common/mixins/forms/form-value.d.ts +7 -36
  185. package/components/common/mixins/forms/form-value.js +2 -64
  186. package/components/common/mixins/forms/form-value.js.map +1 -1
  187. package/components/common/mixins/forms/types.d.ts +19 -10
  188. package/components/common/mixins/forms/types.js +2 -1
  189. package/components/common/mixins/forms/types.js.map +1 -1
  190. package/components/common/util.d.ts +1 -0
  191. package/components/common/util.js +3 -0
  192. package/components/common/util.js.map +1 -1
  193. package/components/date-picker/date-picker.d.ts +1 -3
  194. package/components/date-picker/date-picker.js +11 -13
  195. package/components/date-picker/date-picker.js.map +1 -1
  196. package/components/date-picker/themes/dark/date-picker.indigo.css.js +1 -1
  197. package/components/date-picker/themes/dark/date-picker.indigo.css.js.map +1 -1
  198. package/components/date-picker/themes/shared/date-picker.bootstrap.css.js +1 -1
  199. package/components/date-picker/themes/shared/date-picker.bootstrap.css.js.map +1 -1
  200. package/components/date-picker/themes/shared/date-picker.common.css.js +1 -1
  201. package/components/date-picker/themes/shared/date-picker.common.css.js.map +1 -1
  202. package/components/date-picker/themes/shared/date-picker.fluent.css.js +1 -1
  203. package/components/date-picker/themes/shared/date-picker.fluent.css.js.map +1 -1
  204. package/components/date-picker/themes/shared/date-picker.indigo.css.js +1 -1
  205. package/components/date-picker/themes/shared/date-picker.indigo.css.js.map +1 -1
  206. package/components/date-picker/themes/shared/date-picker.material.css.js +1 -1
  207. package/components/date-picker/themes/shared/date-picker.material.css.js.map +1 -1
  208. package/components/date-range-picker/date-range-picker.d.ts +1 -3
  209. package/components/date-range-picker/date-range-picker.js +19 -26
  210. package/components/date-range-picker/date-range-picker.js.map +1 -1
  211. package/components/date-range-picker/themes/dark/date-range-picker.indigo.css.js +1 -1
  212. package/components/date-range-picker/themes/dark/date-range-picker.indigo.css.js.map +1 -1
  213. package/components/date-range-picker/themes/shared/date-range-picker.bootstrap.css.js +1 -1
  214. package/components/date-range-picker/themes/shared/date-range-picker.bootstrap.css.js.map +1 -1
  215. package/components/date-range-picker/themes/shared/date-range-picker.common.css.js +1 -1
  216. package/components/date-range-picker/themes/shared/date-range-picker.common.css.js.map +1 -1
  217. package/components/date-range-picker/themes/shared/date-range-picker.fluent.css.js +1 -1
  218. package/components/date-range-picker/themes/shared/date-range-picker.fluent.css.js.map +1 -1
  219. package/components/date-range-picker/themes/shared/date-range-picker.indigo.css.js +1 -1
  220. package/components/date-range-picker/themes/shared/date-range-picker.indigo.css.js.map +1 -1
  221. package/components/date-range-picker/themes/shared/date-range-picker.material.css.js +1 -1
  222. package/components/date-range-picker/themes/shared/date-range-picker.material.css.js.map +1 -1
  223. package/components/date-time-input/date-time-input.d.ts +1 -2
  224. package/components/date-time-input/date-time-input.js +7 -7
  225. package/components/date-time-input/date-time-input.js.map +1 -1
  226. package/components/dialog/dialog.d.ts +23 -25
  227. package/components/dialog/dialog.js +108 -115
  228. package/components/dialog/dialog.js.map +1 -1
  229. package/components/dialog/themes/dark/dialog.bootstrap.css.js +1 -1
  230. package/components/dialog/themes/dark/dialog.bootstrap.css.js.map +1 -1
  231. package/components/expansion-panel/expansion-panel.d.ts +12 -14
  232. package/components/expansion-panel/expansion-panel.js +43 -56
  233. package/components/expansion-panel/expansion-panel.js.map +1 -1
  234. package/components/file-input/file-input.d.ts +1 -3
  235. package/components/file-input/file-input.js +6 -11
  236. package/components/file-input/file-input.js.map +1 -1
  237. package/components/file-input/themes/shared/file-input.bootstrap.css.js +1 -1
  238. package/components/file-input/themes/shared/file-input.bootstrap.css.js.map +1 -1
  239. package/components/file-input/themes/shared/file-input.material.css.js +1 -1
  240. package/components/file-input/themes/shared/file-input.material.css.js.map +1 -1
  241. package/components/input/input.d.ts +1 -4
  242. package/components/input/input.js +7 -12
  243. package/components/input/input.js.map +1 -1
  244. package/components/input/themes/shared/input.bootstrap.css.js +1 -1
  245. package/components/input/themes/shared/input.bootstrap.css.js.map +1 -1
  246. package/components/input/themes/shared/input.common.css.js +1 -1
  247. package/components/input/themes/shared/input.common.css.js.map +1 -1
  248. package/components/input/themes/shared/input.fluent.css.js +1 -1
  249. package/components/input/themes/shared/input.fluent.css.js.map +1 -1
  250. package/components/input/themes/shared/input.indigo.css.js +1 -1
  251. package/components/input/themes/shared/input.indigo.css.js.map +1 -1
  252. package/components/input/themes/shared/input.material.css.js +1 -1
  253. package/components/input/themes/shared/input.material.css.js.map +1 -1
  254. package/components/mask-input/mask-input-base.js +1 -0
  255. package/components/mask-input/mask-input-base.js.map +1 -1
  256. package/components/mask-input/mask-input.d.ts +2 -3
  257. package/components/mask-input/mask-input.js +5 -8
  258. package/components/mask-input/mask-input.js.map +1 -1
  259. package/components/nav-drawer/nav-drawer-item.d.ts +3 -4
  260. package/components/nav-drawer/nav-drawer-item.js +15 -18
  261. package/components/nav-drawer/nav-drawer-item.js.map +1 -1
  262. package/components/nav-drawer/nav-drawer.d.ts +1 -2
  263. package/components/nav-drawer/nav-drawer.js +9 -11
  264. package/components/nav-drawer/nav-drawer.js.map +1 -1
  265. package/components/nav-drawer/themes/container.base.css.js +1 -1
  266. package/components/nav-drawer/themes/container.base.css.js.map +1 -1
  267. package/components/nav-drawer/themes/shared/container/nav-drawer.common.css.js +1 -1
  268. package/components/nav-drawer/themes/shared/container/nav-drawer.common.css.js.map +1 -1
  269. package/components/popover/popover.d.ts +17 -16
  270. package/components/popover/popover.js +81 -91
  271. package/components/popover/popover.js.map +1 -1
  272. package/components/progress/base.d.ts +8 -8
  273. package/components/progress/base.js +19 -23
  274. package/components/progress/base.js.map +1 -1
  275. package/components/progress/circular-gradient.js.map +1 -1
  276. package/components/progress/circular-progress.d.ts +3 -4
  277. package/components/progress/circular-progress.js +15 -18
  278. package/components/progress/circular-progress.js.map +1 -1
  279. package/components/progress/linear-progress.d.ts +1 -0
  280. package/components/progress/linear-progress.js +5 -1
  281. package/components/progress/linear-progress.js.map +1 -1
  282. package/components/radio/radio.d.ts +3 -5
  283. package/components/radio/radio.js +33 -31
  284. package/components/radio/radio.js.map +1 -1
  285. package/components/radio/themes/dark/radio.fluent.css.js +1 -1
  286. package/components/radio/themes/dark/radio.fluent.css.js.map +1 -1
  287. package/components/radio/themes/shared/radio.bootstrap.css.js +1 -1
  288. package/components/radio/themes/shared/radio.bootstrap.css.js.map +1 -1
  289. package/components/radio/themes/shared/radio.common.css.js +1 -1
  290. package/components/radio/themes/shared/radio.common.css.js.map +1 -1
  291. package/components/radio/themes/shared/radio.fluent.css.js +1 -1
  292. package/components/radio/themes/shared/radio.fluent.css.js.map +1 -1
  293. package/components/radio/themes/shared/radio.indigo.css.js +1 -1
  294. package/components/radio/themes/shared/radio.indigo.css.js.map +1 -1
  295. package/components/radio/themes/shared/radio.material.css.js +1 -1
  296. package/components/radio/themes/shared/radio.material.css.js.map +1 -1
  297. package/components/radio-group/radio-group.d.ts +4 -4
  298. package/components/radio-group/radio-group.js +24 -21
  299. package/components/radio-group/radio-group.js.map +1 -1
  300. package/components/rating/rating.d.ts +1 -2
  301. package/components/rating/rating.js +4 -3
  302. package/components/rating/rating.js.map +1 -1
  303. package/components/select/select.d.ts +35 -38
  304. package/components/select/select.js +138 -146
  305. package/components/select/select.js.map +1 -1
  306. package/components/select/themes/shared/select.bootstrap.css.js +1 -1
  307. package/components/select/themes/shared/select.bootstrap.css.js.map +1 -1
  308. package/components/select/themes/shared/select.common.css.js +1 -1
  309. package/components/select/themes/shared/select.common.css.js.map +1 -1
  310. package/components/select/themes/shared/select.fluent.css.js +1 -1
  311. package/components/select/themes/shared/select.fluent.css.js.map +1 -1
  312. package/components/select/themes/shared/select.indigo.css.js +1 -1
  313. package/components/select/themes/shared/select.indigo.css.js.map +1 -1
  314. package/components/select/themes/shared/select.material.css.js +1 -1
  315. package/components/select/themes/shared/select.material.css.js.map +1 -1
  316. package/components/slider/slider-label.js.map +1 -1
  317. package/components/slider/slider.d.ts +1 -2
  318. package/components/slider/slider.js +5 -2
  319. package/components/slider/slider.js.map +1 -1
  320. package/components/textarea/textarea.d.ts +13 -20
  321. package/components/textarea/textarea.js +66 -90
  322. package/components/textarea/textarea.js.map +1 -1
  323. package/components/textarea/themes/shared/textarea.bootstrap.css.js +1 -1
  324. package/components/textarea/themes/shared/textarea.bootstrap.css.js.map +1 -1
  325. package/components/textarea/themes/shared/textarea.common.css.js +1 -1
  326. package/components/textarea/themes/shared/textarea.common.css.js.map +1 -1
  327. package/components/textarea/themes/shared/textarea.fluent.css.js +1 -1
  328. package/components/textarea/themes/shared/textarea.fluent.css.js.map +1 -1
  329. package/components/textarea/themes/shared/textarea.indigo.css.js +1 -1
  330. package/components/textarea/themes/shared/textarea.indigo.css.js.map +1 -1
  331. package/components/textarea/themes/shared/textarea.material.css.js +1 -1
  332. package/components/textarea/themes/shared/textarea.material.css.js.map +1 -1
  333. package/components/tile-manager/position.js +2 -1
  334. package/components/tile-manager/position.js.map +1 -1
  335. package/components/tile-manager/tile.d.ts +8 -12
  336. package/components/tile-manager/tile.js +16 -37
  337. package/components/tile-manager/tile.js.map +1 -1
  338. package/components/validation-container/validation-container.d.ts +2 -1
  339. package/components/validation-container/validation-container.js +19 -14
  340. package/components/validation-container/validation-container.js.map +1 -1
  341. package/custom-elements.json +38469 -33868
  342. package/igniteui-webcomponents.css-data.json +1 -1
  343. package/igniteui-webcomponents.html-data.json +1 -1
  344. package/index.d.ts +3 -0
  345. package/index.js +1 -0
  346. package/index.js.map +1 -1
  347. package/package.json +1 -1
  348. package/web-types.json +2 -2
@@ -0,0 +1,167 @@
1
+ export class ChatState {
2
+ get sortedMessagesIds() {
3
+ return this._sortedMessages.map((m) => m.id);
4
+ }
5
+ get messages() {
6
+ return this._messages;
7
+ }
8
+ set messages(value) {
9
+ this._messages = value;
10
+ this._sortedMessages = value.slice().sort((a, b) => {
11
+ return a.timestamp.getTime() - b.timestamp.getTime();
12
+ });
13
+ this._host.requestUpdate();
14
+ }
15
+ get options() {
16
+ return this._options;
17
+ }
18
+ set options(value) {
19
+ this._options = value;
20
+ this._host.requestUpdate();
21
+ }
22
+ get currentUserId() {
23
+ return this._options?.currentUserId ?? 'user';
24
+ }
25
+ get suggestionsPosition() {
26
+ return this._options?.suggestionsPosition ?? this._suggestionsPosition;
27
+ }
28
+ get textArea() {
29
+ return this._textArea;
30
+ }
31
+ set textArea(value) {
32
+ this._textArea = value;
33
+ }
34
+ get inputAttachments() {
35
+ return this._inputAttachments;
36
+ }
37
+ set inputAttachments(value) {
38
+ this._inputAttachments = value;
39
+ this._host.requestUpdate();
40
+ }
41
+ get inputValue() {
42
+ return this._inputValue;
43
+ }
44
+ set inputValue(value) {
45
+ this._inputValue = value;
46
+ this._host.requestUpdate();
47
+ }
48
+ constructor(chat) {
49
+ this._textArea = null;
50
+ this._messages = [];
51
+ this._sortedMessages = [];
52
+ this._inputAttachments = [];
53
+ this._inputValue = '';
54
+ this._acceptedTypesCache = null;
55
+ this._suggestionsPosition = 'below-messages';
56
+ this._host = chat;
57
+ }
58
+ emitEvent(name, args) {
59
+ return this._host.emitEvent(name, args);
60
+ }
61
+ handleInputChange(value) {
62
+ this.inputValue = value;
63
+ this.emitEvent('igcInputChange', { detail: { value: this.inputValue } });
64
+ }
65
+ addMessage(message) {
66
+ const newMessage = {
67
+ id: message.id ?? Date.now().toString(),
68
+ text: message.text,
69
+ sender: message.sender ?? this.currentUserId,
70
+ timestamp: message.timestamp ?? new Date(),
71
+ attachments: message.attachments || [],
72
+ };
73
+ const allowed = this.emitEvent('igcMessageCreated', {
74
+ detail: newMessage,
75
+ cancelable: true,
76
+ });
77
+ if (allowed) {
78
+ if (!this.messages.some((msg) => msg.id === newMessage.id)) {
79
+ this.messages = [...this.messages, newMessage];
80
+ }
81
+ this.inputValue = '';
82
+ this.inputAttachments = [];
83
+ }
84
+ }
85
+ attachFiles(files) {
86
+ const newAttachments = [];
87
+ let count = this.inputAttachments.length;
88
+ files.forEach((file) => {
89
+ if (this.inputAttachments.find((a) => a.name === file.name)) {
90
+ return;
91
+ }
92
+ const isImage = file.type.startsWith('image/');
93
+ newAttachments.push({
94
+ id: Date.now().toString() + count++,
95
+ url: URL.createObjectURL(file),
96
+ name: file.name,
97
+ file: file,
98
+ thumbnail: isImage ? URL.createObjectURL(file) : undefined,
99
+ });
100
+ });
101
+ const allowed = this.emitEvent('igcAttachmentChange', {
102
+ detail: [...this.inputAttachments, ...newAttachments],
103
+ cancelable: true,
104
+ });
105
+ if (allowed) {
106
+ this.inputAttachments = [...this.inputAttachments, ...newAttachments];
107
+ }
108
+ }
109
+ removeAttachment(index) {
110
+ const allowed = this.emitEvent('igcAttachmentChange', {
111
+ detail: this.inputAttachments.filter((_, i) => i !== index),
112
+ cancelable: true,
113
+ });
114
+ if (allowed) {
115
+ this.inputAttachments = this.inputAttachments.filter((_, i) => i !== index);
116
+ }
117
+ }
118
+ handleSuggestionClick(suggestion) {
119
+ this.addMessage({ text: suggestion });
120
+ if (this.textArea) {
121
+ this.textArea.focus();
122
+ }
123
+ }
124
+ updateOptions(options) {
125
+ this.options = { ...this.options, ...options };
126
+ }
127
+ updateAcceptedTypesCache() {
128
+ if (!this.options?.acceptedFiles) {
129
+ this._acceptedTypesCache = null;
130
+ return;
131
+ }
132
+ const types = this.options?.acceptedFiles
133
+ .split(',')
134
+ .map((type) => type.trim().toLowerCase());
135
+ this._acceptedTypesCache = {
136
+ extensions: new Set(types.filter((t) => t.startsWith('.'))),
137
+ mimeTypes: new Set(types.filter((t) => !t.startsWith('.') && !t.endsWith('/*'))),
138
+ wildcardTypes: new Set(types.filter((t) => t.endsWith('/*')).map((t) => t.slice(0, -2))),
139
+ };
140
+ }
141
+ isFileTypeAccepted(file, type = '') {
142
+ if (!this._acceptedTypesCache)
143
+ return true;
144
+ if (file === null && type === '')
145
+ return false;
146
+ const fileType = file != null ? file.type.toLowerCase() : type.toLowerCase();
147
+ const fileExtension = file != null
148
+ ? `.${file.name.split('.').pop()?.toLowerCase()}`
149
+ : `.${type.split('/').pop()?.toLowerCase()}`;
150
+ if (this._acceptedTypesCache.extensions.has(fileExtension)) {
151
+ return true;
152
+ }
153
+ if (this._acceptedTypesCache.mimeTypes.has(fileType)) {
154
+ return true;
155
+ }
156
+ const [fileBaseType] = fileType.split('/');
157
+ return this._acceptedTypesCache.wildcardTypes.has(fileBaseType);
158
+ }
159
+ hasSlotContent(name) {
160
+ return (this._host.renderRoot.querySelector(`slot[name=${name}]`)
161
+ ?.childNodes.length !== 0);
162
+ }
163
+ }
164
+ export function createChatState(host) {
165
+ return new ChatState(host);
166
+ }
167
+ //# sourceMappingURL=chat-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-state.js","sourceRoot":"","sources":["../../../src/components/chat/chat-state.ts"],"names":[],"mappings":"AAcA,MAAM,OAAO,SAAS;IAgCpB,IAAW,iBAAiB;QAC1B,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC;IAKD,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAMD,IAAW,QAAQ,CAAC,KAAmB;QACrC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACjD,OAAO,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QACvD,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAKD,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAKD,IAAW,OAAO,CAAC,KAAqB;QACtC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAKD,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,QAAQ,EAAE,aAAa,IAAI,MAAM,CAAC;IAChD,CAAC;IAKD,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,QAAQ,EAAE,mBAAmB,IAAI,IAAI,CAAC,oBAAoB,CAAC;IACzE,CAAC;IAID,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAKD,IAAW,QAAQ,CAAC,KAA2B;QAC7C,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IACzB,CAAC;IAKD,IAAW,gBAAgB;QACzB,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAKD,IAAW,gBAAgB,CAAC,KAA6B;QACvD,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAKD,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAKD,IAAW,UAAU,CAAC,KAAa;QACjC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAOD,YAAY,IAAsB;QAhI1B,cAAS,GAAgC,IAAI,CAAC;QAE9C,cAAS,GAAiB,EAAE,CAAC;QAE7B,oBAAe,GAAiB,EAAE,CAAC;QAInC,sBAAiB,GAA2B,EAAE,CAAC;QAE/C,gBAAW,GAAG,EAAE,CAAC;QAIjB,wBAAmB,GAIhB,IAAI,CAAC;QAER,yBAAoB,GAC1B,gBAAgB,CAAC;QA4GjB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAUM,SAAS,CAAC,IAAoC,EAAE,IAAU;QAC/D,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;IAOM,iBAAiB,CAAC,KAAa;QACpC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC3E,CAAC;IAYM,UAAU,CAAC,OAMjB;QACC,MAAM,UAAU,GAAe;YAC7B,EAAE,EAAE,OAAO,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;YACvC,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,aAAa;YAC5C,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE;YAC1C,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE;SACvC,CAAC;QAEF,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,mBAAmB,EAAE;YAClD,MAAM,EAAE,UAAU;YAClB,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;QAEH,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC3D,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YACjD,CAAC;YACD,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;YACrB,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;QAC7B,CAAC;IACH,CAAC;IAOM,WAAW,CAAC,KAAa;QAC9B,MAAM,cAAc,GAA2B,EAAE,CAAC;QAClD,IAAI,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;QACzC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACrB,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5D,OAAO;YACT,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC/C,cAAc,CAAC,IAAI,CAAC;gBAClB,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAK,EAAE;gBACnC,GAAG,EAAE,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;gBAC9B,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,IAAI;gBACV,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;aAC3D,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,qBAAqB,EAAE;YACpD,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,gBAAgB,EAAE,GAAG,cAAc,CAAC;YACrD,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;QACH,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,gBAAgB,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB,EAAE,GAAG,cAAc,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAOM,gBAAgB,CAAC,KAAa;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,qBAAqB,EAAE;YACpD,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC;YAC3D,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;QACH,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAClD,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,CACtB,CAAC;QACJ,CAAC;IACH,CAAC;IAOM,qBAAqB,CAAC,UAAkB;QAC7C,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QACtC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IAMM,aAAa,CAAC,OAAgC;QACnD,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;IACjD,CAAC;IAMM,wBAAwB;QAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,CAAC;YACjC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;YAChC,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa;aACtC,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,mBAAmB,GAAG;YACzB,UAAU,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3D,SAAS,EAAE,IAAI,GAAG,CAChB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAC7D;YACD,aAAa,EAAE,IAAI,GAAG,CACpB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CACjE;SACF,CAAC;IACJ,CAAC;IAQM,kBAAkB,CAAC,IAAU,EAAE,IAAI,GAAG,EAAE;QAC7C,IAAI,CAAC,IAAI,CAAC,mBAAmB;YAAE,OAAO,IAAI,CAAC;QAE3C,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,EAAE;YAAE,OAAO,KAAK,CAAC;QAE/C,MAAM,QAAQ,GACZ,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QAC9D,MAAM,aAAa,GACjB,IAAI,IAAI,IAAI;YACV,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,EAAE;YACjD,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,EAAE,CAAC;QAGjD,IAAI,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;YAC3D,OAAO,IAAI,CAAC;QACd,CAAC;QAGD,IAAI,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrD,OAAO,IAAI,CAAC;QACd,CAAC;QAGD,MAAM,CAAC,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAClE,CAAC;IAOM,cAAc,CAAC,IAAY;QAChC,OAAO,CACL,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,aAAa,CAAkB,aAAa,IAAI,GAAG,CAAC;YACxE,EAAE,UAAU,CAAC,MAAM,KAAK,CAAC,CAC5B,CAAC;IACJ,CAAC;CAEF;AAED,MAAM,UAAU,eAAe,CAAC,IAAsB;IACpD,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC","sourcesContent":["import type IgcTextareaComponent from '../textarea/textarea.js';\nimport type IgcChatComponent from './chat.js';\nimport type { IgcChatComponentEventMap } from './chat.js';\nimport type {\n IgcChatOptions,\n IgcMessage,\n IgcMessageAttachment,\n} from './types.js';\n\n/**\n * Internal state manager for the `<igc-chat>` component.\n *\n * Manages messages, input value, attachments, options, and event emissions.\n */\nexport class ChatState {\n //#region Internal properties and state /** The host `<igc-chat>` component instance */\n private readonly _host: IgcChatComponent;\n /** Reference to the text area input component */\n private _textArea: IgcTextareaComponent | null = null;\n /** The current list of messages */\n private _messages: IgcMessage[] = [];\n /** Sorted copy of messages by timestamp */\n private _sortedMessages: IgcMessage[] = [];\n /** Chat options/configuration */\n private _options?: IgcChatOptions;\n /** List of current input attachments */\n private _inputAttachments: IgcMessageAttachment[] = [];\n /** Current input text */\n private _inputValue = '';\n /**\n * Cache of accepted file types, organized into extensions, mimeTypes, and wildcardTypes\n */\n private _acceptedTypesCache: {\n extensions: Set<string>;\n mimeTypes: Set<string>;\n wildcardTypes: Set<string>;\n } | null = null;\n\n private _suggestionsPosition: 'below-input' | 'below-messages' =\n 'below-messages';\n //#endregion\n\n //#region Public properties\n /**\n * Array of message IDs sorted by timestamp ascending.\n */\n public get sortedMessagesIds(): string[] {\n return this._sortedMessages.map((m) => m.id);\n }\n\n /**\n * Gets the list of chat messages.\n */\n public get messages(): IgcMessage[] {\n return this._messages;\n }\n\n /**\n * Sets the list of chat messages.\n * Also sorts messages by timestamp and requests host update.\n */\n public set messages(value: IgcMessage[]) {\n this._messages = value;\n this._sortedMessages = value.slice().sort((a, b) => {\n return a.timestamp.getTime() - b.timestamp.getTime();\n });\n this._host.requestUpdate();\n }\n\n /**\n * Gets current chat options.\n */\n public get options(): IgcChatOptions | undefined {\n return this._options;\n }\n\n /**\n * Sets chat options and requests host update.\n */\n public set options(value: IgcChatOptions) {\n this._options = value;\n this._host.requestUpdate();\n }\n\n /**\n * Gets the current user ID from options or returns 'user' as fallback.\n */\n public get currentUserId(): string {\n return this._options?.currentUserId ?? 'user';\n }\n\n /**\n * Gets the current suggestionsPosition from options or returns the default value 'below-messages'.\n */\n public get suggestionsPosition(): string {\n return this._options?.suggestionsPosition ?? this._suggestionsPosition;\n }\n /**\n * Gets the text area component.\n */\n public get textArea(): IgcTextareaComponent | null {\n return this._textArea;\n }\n\n /**\n * Sets the text area component.\n */\n public set textArea(value: IgcTextareaComponent) {\n this._textArea = value;\n }\n\n /**\n * Gets the list of attachments currently attached to input.\n */\n public get inputAttachments(): IgcMessageAttachment[] {\n return this._inputAttachments;\n }\n\n /**\n * Sets the input attachments and requests host update.\n */\n public set inputAttachments(value: IgcMessageAttachment[]) {\n this._inputAttachments = value;\n this._host.requestUpdate(); // Notify the host component to re-render\n }\n\n /**\n * Gets the current input value.\n */\n public get inputValue(): string {\n return this._inputValue;\n }\n\n /**\n * Sets the current input value and requests host update.\n */\n public set inputValue(value: string) {\n this._inputValue = value;\n this._host.requestUpdate();\n }\n //#endregion\n\n /**\n * Creates an instance of ChatState.\n * @param chat The host `<igc-chat>` component.\n */\n constructor(chat: IgcChatComponent) {\n this._host = chat;\n }\n\n //#region Event handlers\n\n /**\n * Emits a custom event from the host component.\n * @param name Event name (key of IgcChatComponentEventMap)\n * @param args Event detail or options\n * @returns true if event was not canceled, false otherwise\n */\n public emitEvent(name: keyof IgcChatComponentEventMap, args?: any) {\n return this._host.emitEvent(name, args);\n }\n\n /**\n * Handles input text changes.\n * Updates internal inputValue and emits 'igcInputChange' event.\n * @param value New input value\n */\n public handleInputChange(value: string): void {\n this.inputValue = value;\n this.emitEvent('igcInputChange', { detail: { value: this.inputValue } });\n }\n\n //#endregion\n\n //#region Public API\n\n /**\n * Adds a new chat message.\n * Emits 'igcMessageCreated' event which can be canceled to prevent adding.\n * Clears input value and attachments on success.\n * @param message Partial message object with optional id, sender, timestamp\n */\n public addMessage(message: {\n id?: string;\n text: string;\n sender?: string;\n timestamp?: Date;\n attachments?: IgcMessageAttachment[];\n }): void {\n const newMessage: IgcMessage = {\n id: message.id ?? Date.now().toString(),\n text: message.text,\n sender: message.sender ?? this.currentUserId,\n timestamp: message.timestamp ?? new Date(),\n attachments: message.attachments || [],\n };\n\n const allowed = this.emitEvent('igcMessageCreated', {\n detail: newMessage,\n cancelable: true,\n });\n\n if (allowed) {\n if (!this.messages.some((msg) => msg.id === newMessage.id)) {\n this.messages = [...this.messages, newMessage];\n }\n this.inputValue = '';\n this.inputAttachments = [];\n }\n }\n\n /**\n * Adds files as attachments to the input.\n * Emits 'igcAttachmentChange' event which can be canceled to prevent adding.\n * @param files Array of File objects to attach\n */\n public attachFiles(files: File[]) {\n const newAttachments: IgcMessageAttachment[] = [];\n let count = this.inputAttachments.length;\n files.forEach((file) => {\n if (this.inputAttachments.find((a) => a.name === file.name)) {\n return;\n }\n\n const isImage = file.type.startsWith('image/');\n newAttachments.push({\n id: Date.now().toString() + count++,\n url: URL.createObjectURL(file),\n name: file.name,\n file: file,\n thumbnail: isImage ? URL.createObjectURL(file) : undefined,\n });\n });\n\n const allowed = this.emitEvent('igcAttachmentChange', {\n detail: [...this.inputAttachments, ...newAttachments],\n cancelable: true,\n });\n if (allowed) {\n this.inputAttachments = [...this.inputAttachments, ...newAttachments];\n }\n }\n\n /**\n * Removes an attachment by index.\n * Emits 'igcAttachmentChange' event which can be canceled to prevent removal.\n * @param index Index of the attachment to remove\n */\n public removeAttachment(index: number): void {\n const allowed = this.emitEvent('igcAttachmentChange', {\n detail: this.inputAttachments.filter((_, i) => i !== index),\n cancelable: true,\n });\n if (allowed) {\n this.inputAttachments = this.inputAttachments.filter(\n (_, i) => i !== index\n );\n }\n }\n\n /**\n * Handles when a suggestion is clicked.\n * Adds the suggestion as a new message and focuses the text area.\n * @param suggestion The suggestion string clicked\n */\n public handleSuggestionClick(suggestion: string): void {\n this.addMessage({ text: suggestion });\n if (this.textArea) {\n this.textArea.focus();\n }\n }\n\n /**\n * Updates the chat options partially.\n * @param options Partial options to merge with current options\n */\n public updateOptions(options: Partial<IgcChatOptions>): void {\n this.options = { ...this.options, ...options };\n }\n\n /**\n * Updates the internal cache for accepted file types.\n * Parses the acceptedFiles string option into extensions, mimeTypes, and wildcard types.\n */\n public updateAcceptedTypesCache() {\n if (!this.options?.acceptedFiles) {\n this._acceptedTypesCache = null;\n return;\n }\n\n const types = this.options?.acceptedFiles\n .split(',')\n .map((type) => type.trim().toLowerCase());\n this._acceptedTypesCache = {\n extensions: new Set(types.filter((t) => t.startsWith('.'))),\n mimeTypes: new Set(\n types.filter((t) => !t.startsWith('.') && !t.endsWith('/*'))\n ),\n wildcardTypes: new Set(\n types.filter((t) => t.endsWith('/*')).map((t) => t.slice(0, -2))\n ),\n };\n }\n\n /**\n * Checks if a file's type or extension is accepted by the chat's acceptedFiles setting.\n * @param file File object to check\n * @param type Optional MIME type override if no file provided\n * @returns True if accepted, false otherwise\n */\n public isFileTypeAccepted(file: File, type = ''): boolean {\n if (!this._acceptedTypesCache) return true;\n\n if (file === null && type === '') return false;\n\n const fileType =\n file != null ? file.type.toLowerCase() : type.toLowerCase();\n const fileExtension =\n file != null\n ? `.${file.name.split('.').pop()?.toLowerCase()}`\n : `.${type.split('/').pop()?.toLowerCase()}`;\n\n // Check file extension\n if (this._acceptedTypesCache.extensions.has(fileExtension)) {\n return true;\n }\n\n // Check exact MIME type\n if (this._acceptedTypesCache.mimeTypes.has(fileType)) {\n return true;\n }\n\n // Check wildcard MIME types\n const [fileBaseType] = fileType.split('/');\n return this._acceptedTypesCache.wildcardTypes.has(fileBaseType);\n }\n\n /**\n * Checks if a slot is empty.\n * @param name Slot name to check\n * @returns True if the slot has content, false otherwise\n */\n public hasSlotContent(name: string): boolean {\n return (\n this._host.renderRoot.querySelector<HTMLSlotElement>(`slot[name=${name}]`)\n ?.childNodes.length !== 0\n );\n }\n //#endregion\n}\n\nexport function createChatState(host: IgcChatComponent): ChatState {\n return new ChatState(host);\n}\n"]}
@@ -0,0 +1,164 @@
1
+ import { LitElement, type TemplateResult } 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 chat message attachment is clicked.
18
+ *
19
+ * @event igcAttachmentClick
20
+ * @type {CustomEvent<IgcMessageAttachment>}
21
+ * @detail The attachment that was clicked.
22
+ */
23
+ igcAttachmentClick: CustomEvent<IgcMessageAttachment>;
24
+ /**
25
+ * Dispatched when an attachment is changed (e.g., updated or removed).
26
+ *
27
+ * @event igcAttachmentChange
28
+ * @type {CustomEvent<IgcMessageAttachment>}
29
+ * @detail The attachment that was changed.
30
+ */
31
+ igcAttachmentChange: CustomEvent<IgcMessageAttachment>;
32
+ /**
33
+ * Dispatched during an attachment drag operation.
34
+ *
35
+ * @event igcAttachmentDrag
36
+ * @type {CustomEvent<any>}
37
+ * @detail The drag event payload.
38
+ */
39
+ igcAttachmentDrag: CustomEvent<any>;
40
+ /**
41
+ * Dispatched when an attachment is dropped (e.g., in a drag-and-drop operation).
42
+ *
43
+ * @event igcAttachmentDrop
44
+ * @type {CustomEvent<any>}
45
+ * @detail The drop event payload.
46
+ */
47
+ igcAttachmentDrop: CustomEvent<any>;
48
+ /**
49
+ * Dispatched when the typing status changes (e.g., user starts or stops typing).
50
+ *
51
+ * @event igcTypingChange
52
+ * @type {CustomEvent<boolean>}
53
+ * @detail `true` if typing started, `false` if stopped.
54
+ */
55
+ igcTypingChange: CustomEvent<boolean>;
56
+ /**
57
+ * Dispatched when the chat input field gains focus.
58
+ *
59
+ * @event igcInputFocus
60
+ * @type {CustomEvent<any>}
61
+ * @detail Focus event payload.
62
+ */
63
+ igcInputFocus: CustomEvent<any>;
64
+ /**
65
+ * Dispatched when the chat input field loses focus.
66
+ *
67
+ * @event igcInputBlur
68
+ * @type {CustomEvent<any>}
69
+ * @detail Blur event payload.
70
+ */
71
+ igcInputBlur: CustomEvent<any>;
72
+ /**
73
+ * Dispatched when the content of the chat input changes.
74
+ *
75
+ * @event igcInputChange
76
+ * @type {CustomEvent<string>}
77
+ * @detail The current text value of the input.
78
+ */
79
+ igcInputChange: CustomEvent<string>;
80
+ }
81
+ declare const IgcChatComponent_base: Constructor<import("../common/mixins/event-emitter.js").EventEmitterInterface<IgcChatComponentEventMap>> & Constructor<LitElement>;
82
+ /**
83
+ * A chat UI component for displaying messages, attachments, and input interaction.
84
+ *
85
+ * This component is part of the Ignite UI Web Components suite.
86
+ *
87
+ * @element igc-chat
88
+ * @slot prefix - Slot for injecting content (e.g., avatar or icon) before the chat title.
89
+ * @slot title - Slot for overriding the chat title content.
90
+ * @slot actions - Slot for injecting header actions (e.g., buttons, menus).
91
+ * @slot suggestions-header - Slot for rendering a custom header for the suggestions list.
92
+ * @slot suggestions - Slot for rendering a custom list of quick reply suggestions.
93
+ * @slot suggestions-actions - Slot for rendering additional actions.
94
+ * @slot suggestion - Slot for rendering a single suggestion item.
95
+ * @slot empty-state - Slot shown when there are no messages.
96
+ *
97
+ * @csspart header - Styles the header container.
98
+ * @csspart prefix - Styles the element before the title (e.g., avatar).
99
+ * @csspart title - Styles the chat header title.
100
+ * @csspart suggestions - Styles the suggestion container.
101
+ * @csspart suggestion - Styles each suggestion item.
102
+ */
103
+ export default class IgcChatComponent extends IgcChatComponent_base {
104
+ static readonly tagName = "igc-chat";
105
+ static styles: import("lit").CSSResult[];
106
+ /**
107
+ * Registers the chat component and its child components.
108
+ * Should be called once before using the component.
109
+ *
110
+ * @example
111
+ * IgcChatComponent.register();
112
+ */
113
+ static register(): void;
114
+ private readonly _chatState;
115
+ private _context;
116
+ private _hasContent;
117
+ private _chatInput;
118
+ constructor();
119
+ /**
120
+ * The list of chat messages currently displayed.
121
+ * Use this property to set or update the message history.
122
+ */
123
+ set messages(value: IgcMessage[]);
124
+ get messages(): IgcMessage[];
125
+ /**
126
+ * The chat message currently being composed but not yet sent.
127
+ * Includes the draft text and any attachments.
128
+ */
129
+ set draftMessage(value: {
130
+ text: string;
131
+ attachments?: IgcMessageAttachment[];
132
+ });
133
+ get draftMessage(): {
134
+ text: string;
135
+ attachments?: IgcMessageAttachment[];
136
+ };
137
+ /**
138
+ * Controls the chat behavior and appearance through a configuration object.
139
+ * Use this to toggle UI options, provide suggestions, templates, etc.
140
+ */
141
+ set options(value: IgcChatOptions);
142
+ get options(): IgcChatOptions | undefined;
143
+ /** Returns the default attachments element. */
144
+ get defaultAttachments(): TemplateResult;
145
+ /** Returns the default textarea element. */
146
+ get defaultTextArea(): TemplateResult;
147
+ /** Returns the default file upload button element. */
148
+ get defaultFileUploadButton(): TemplateResult;
149
+ /** Returns the default send message button element. */
150
+ get defaultSendButton(): TemplateResult;
151
+ protected contextChanged(): void;
152
+ private renderHeader;
153
+ private renderSuggestions;
154
+ protected firstUpdated(): void;
155
+ protected createRenderRoot(): HTMLElement | DocumentFragment;
156
+ protected render(): TemplateResult<1>;
157
+ }
158
+ declare global {
159
+ interface HTMLElementTagNameMap {
160
+ /** The `<igc-chat>` custom element. */
161
+ 'igc-chat': IgcChatComponent;
162
+ }
163
+ }
164
+ export {};
@@ -0,0 +1,168 @@
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, query, state } 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 { watch } from '../common/decorators/watch.js';
14
+ import { registerComponent } from '../common/definitions/register.js';
15
+ import { EventEmitterMixin } from '../common/mixins/event-emitter.js';
16
+ import IgcChatInputComponent from './chat-input.js';
17
+ import IgcChatMessageListComponent from './chat-message-list.js';
18
+ import { createChatState } from './chat-state.js';
19
+ import { styles } from './themes/chat.base.css.js';
20
+ import { styles as shared } from './themes/shared/chat.common.css.js';
21
+ import { all } from './themes/themes.js';
22
+ class IgcChatComponent extends EventEmitterMixin(LitElement) {
23
+ static register() {
24
+ registerComponent(IgcChatComponent, IgcChatInputComponent, IgcChatMessageListComponent, IgcButtonComponent);
25
+ }
26
+ constructor() {
27
+ super();
28
+ this._chatState = createChatState(this);
29
+ this._context = new ContextProvider(this, {
30
+ context: chatContext,
31
+ initialValue: this._chatState,
32
+ });
33
+ this._hasContent = false;
34
+ addThemingController(this, all);
35
+ }
36
+ set messages(value) {
37
+ this._chatState.messages = value;
38
+ }
39
+ get messages() {
40
+ return this._chatState.messages;
41
+ }
42
+ set draftMessage(value) {
43
+ if (this._chatState) {
44
+ this._chatState.inputValue = value.text;
45
+ this._chatState.inputAttachments = value.attachments || [];
46
+ this.requestUpdate();
47
+ }
48
+ }
49
+ get draftMessage() {
50
+ return {
51
+ text: this._chatState?.inputValue,
52
+ attachments: this._chatState?.inputAttachments,
53
+ };
54
+ }
55
+ set options(value) {
56
+ this._chatState.options = value;
57
+ }
58
+ get options() {
59
+ return this._chatState.options;
60
+ }
61
+ get defaultAttachments() {
62
+ return this._chatInput.defaultAttachmentsArea;
63
+ }
64
+ get defaultTextArea() {
65
+ return this._chatInput.defaultTextArea;
66
+ }
67
+ get defaultFileUploadButton() {
68
+ return this._chatInput.defaultFileUploadButton;
69
+ }
70
+ get defaultSendButton() {
71
+ return this._chatInput.defaultSendButton;
72
+ }
73
+ contextChanged() {
74
+ this._context.setValue(this._chatState, true);
75
+ }
76
+ renderHeader() {
77
+ return html ` <div part="header">
78
+ <slot name="prefix" part="prefix"></slot>
79
+ <slot name="title" part="title"
80
+ >${this._chatState.options?.headerText}</slot
81
+ >
82
+ <slot name="actions" part="actions"></slot>
83
+ </div>`;
84
+ }
85
+ renderSuggestions() {
86
+ return html ` <div
87
+ part="suggestions-container"
88
+ role="list"
89
+ aria-label="Suggestions"
90
+ >
91
+ <slot name="suggestions-header" part="suggestions-header"></slot>
92
+ <slot name="suggestions" part="suggestions">
93
+ ${this._chatState.options?.suggestions?.map((suggestion) => html `
94
+ <slot name="suggestion" part="suggestion" role="listitem">
95
+ <igc-chip
96
+ @click=${() => this._chatState?.handleSuggestionClick(suggestion)}
97
+ >
98
+ <span>${suggestion}</span>
99
+ </igc-chip>
100
+ </slot>
101
+ `)}
102
+ </slot>
103
+ <slot name="suggestions-actions" part="suggestions-actions"></slot>
104
+ </div>`;
105
+ }
106
+ firstUpdated() {
107
+ this._context.setValue(this._chatState, true);
108
+ }
109
+ createRenderRoot() {
110
+ const root = super.createRenderRoot();
111
+ root.addEventListener('slotchange', () => {
112
+ this._hasContent =
113
+ this._chatState?.hasSlotContent('prefix') ||
114
+ this._chatState?.hasSlotContent('title') ||
115
+ this._chatState?.hasSlotContent('actions');
116
+ });
117
+ return root;
118
+ }
119
+ render() {
120
+ const hasSuggestions = this._chatState.options?.suggestions &&
121
+ this._chatState.options.suggestions.length > 0;
122
+ return html `
123
+ <div part="chat-container">
124
+ ${this._hasContent || this._chatState.options?.headerText
125
+ ? this.renderHeader()
126
+ : nothing}
127
+ ${this.messages.length === 0
128
+ ? html `<div part="empty-state">
129
+ <slot name="empty-state"> </slot>
130
+ </div>`
131
+ : html `<igc-chat-message-list> </igc-chat-message-list>`}
132
+ ${hasSuggestions &&
133
+ this._chatState.suggestionsPosition === 'below-messages'
134
+ ? this.renderSuggestions()
135
+ : nothing}
136
+ <igc-chat-input> </igc-chat-input>
137
+ ${hasSuggestions &&
138
+ this._chatState.suggestionsPosition === 'below-input'
139
+ ? this.renderSuggestions()
140
+ : nothing}
141
+ </div>
142
+ `;
143
+ }
144
+ }
145
+ IgcChatComponent.tagName = 'igc-chat';
146
+ IgcChatComponent.styles = [styles, shared];
147
+ export default IgcChatComponent;
148
+ __decorate([
149
+ state()
150
+ ], IgcChatComponent.prototype, "_hasContent", void 0);
151
+ __decorate([
152
+ query(IgcChatInputComponent.tagName)
153
+ ], IgcChatComponent.prototype, "_chatInput", void 0);
154
+ __decorate([
155
+ property({ reflect: true, attribute: false })
156
+ ], IgcChatComponent.prototype, "messages", null);
157
+ __decorate([
158
+ property({ reflect: true, attribute: false })
159
+ ], IgcChatComponent.prototype, "draftMessage", null);
160
+ __decorate([
161
+ property({ attribute: false })
162
+ ], IgcChatComponent.prototype, "options", null);
163
+ __decorate([
164
+ watch('messages'),
165
+ watch('draftMessage'),
166
+ watch('options')
167
+ ], IgcChatComponent.prototype, "contextChanged", null);
168
+ //# 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, type TemplateResult } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { addThemingController } from '../../theming/theming-controller.js';\nimport IgcButtonComponent from '../button/button.js';\nimport { chatContext } from '../common/context.js';\nimport { watch } from '../common/decorators/watch.js';\nimport { registerComponent } from '../common/definitions/register.js';\nimport type { Constructor } from '../common/mixins/constructor.js';\nimport { EventEmitterMixin } from '../common/mixins/event-emitter.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 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\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 );\n }\n\n private readonly _chatState = createChatState(this);\n\n private _context = new ContextProvider(this, {\n context: chatContext,\n initialValue: this._chatState,\n });\n\n @state()\n private _hasContent = false;\n\n @query(IgcChatInputComponent.tagName)\n private _chatInput!: IgcChatInputComponent;\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({ reflect: true, 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({ reflect: true, attribute: false })\n public set draftMessage(value: {\n text: string;\n attachments?: IgcMessageAttachment[];\n }) {\n if (this._chatState) {\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 /** Returns the default attachments element. */\n public get defaultAttachments(): TemplateResult {\n return this._chatInput.defaultAttachmentsArea;\n }\n\n /** Returns the default textarea element. */\n public get defaultTextArea(): TemplateResult {\n return this._chatInput.defaultTextArea;\n }\n\n /** Returns the default file upload button element. */\n public get defaultFileUploadButton(): TemplateResult {\n return this._chatInput.defaultFileUploadButton;\n }\n\n /** Returns the default send message button element. */\n public get defaultSendButton(): TemplateResult {\n return this._chatInput.defaultSendButton;\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 return html` <div part=\"header\">\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 renderSuggestions() {\n return html` <div\n part=\"suggestions-container\"\n role=\"list\"\n aria-label=\"Suggestions\"\n >\n <slot name=\"suggestions-header\" part=\"suggestions-header\"></slot>\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-chip\n @click=${() =>\n this._chatState?.handleSuggestionClick(suggestion)}\n >\n <span>${suggestion}</span>\n </igc-chip>\n </slot>\n `\n )}\n </slot>\n <slot name=\"suggestions-actions\" part=\"suggestions-actions\"></slot>\n </div>`;\n }\n\n protected override firstUpdated() {\n this._context.setValue(this._chatState, true);\n }\n\n protected override createRenderRoot(): HTMLElement | DocumentFragment {\n const root = super.createRenderRoot();\n root.addEventListener('slotchange', () => {\n this._hasContent =\n this._chatState?.hasSlotContent('prefix') ||\n this._chatState?.hasSlotContent('title') ||\n this._chatState?.hasSlotContent('actions');\n });\n return root;\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 part=\"chat-container\">\n ${this._hasContent || this._chatState.options?.headerText\n ? this.renderHeader()\n : nothing}\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> </igc-chat-message-list>`}\n ${hasSuggestions &&\n this._chatState.suggestionsPosition === 'below-messages'\n ? this.renderSuggestions()\n : nothing}\n <igc-chat-input> </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,2 @@
1
+ import { type TemplateResult } from 'lit';
2
+ export declare function renderMarkdown(text: string): TemplateResult;
@@ -0,0 +1,22 @@
1
+ import { html } from 'lit';
2
+ import { marked } from 'marked';
3
+ marked.setOptions({
4
+ gfm: true,
5
+ breaks: true,
6
+ });
7
+ const renderer = new marked.Renderer();
8
+ renderer.code = (code, language) => {
9
+ return `<pre><code class="language-${language}">${code}</code></pre>`;
10
+ };
11
+ renderer.link = (href, title, text) => {
12
+ return `<a href="${href}" target="_blank" rel="noopener noreferrer" ${title ? `title="${title}"` : ''}>${text}</a>`;
13
+ };
14
+ export function renderMarkdown(text) {
15
+ if (!text)
16
+ return html ``;
17
+ const rendered = marked(text, { renderer }).toString();
18
+ const template = document.createElement('template');
19
+ template.innerHTML = rendered;
20
+ return html `${template.content}`;
21
+ }
22
+ //# sourceMappingURL=markdown-util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-util.js","sourceRoot":"","sources":["../../../src/components/chat/markdown-util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAuB,MAAM,KAAK,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,MAAM,CAAC,UAAU,CAAC;IAChB,GAAG,EAAE,IAAI;IACT,MAAM,EAAE,IAAI;CACb,CAAC,CAAC;AAEH,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;AAGvC,QAAQ,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE;IACjC,OAAO,8BAA8B,QAAQ,KAAK,IAAI,eAAe,CAAC;AACxE,CAAC,CAAC;AAGF,QAAQ,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;IACpC,OAAO,YAAY,IAAI,+CAA+C,KAAK,CAAC,CAAC,CAAC,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,MAAM,CAAC;AACtH,CAAC,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA,EAAE,CAAC;IAEzB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IACvD,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IACpD,QAAQ,CAAC,SAAS,GAAG,QAAQ,CAAC;IAE9B,OAAO,IAAI,CAAA,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;AACnC,CAAC","sourcesContent":["import { html, type TemplateResult } from 'lit';\nimport { marked } from 'marked';\n\nmarked.setOptions({\n gfm: true,\n breaks: true,\n});\n\nconst renderer = new marked.Renderer();\n\n// Customize code rendering\nrenderer.code = (code, language) => {\n return `<pre><code class=\"language-${language}\">${code}</code></pre>`;\n};\n\n// Customize link rendering\nrenderer.link = (href, title, text) => {\n return `<a href=\"${href}\" target=\"_blank\" rel=\"noopener noreferrer\" ${title ? `title=\"${title}\"` : ''}>${text}</a>`;\n};\n\nexport function renderMarkdown(text: string): TemplateResult {\n if (!text) return html``;\n\n const rendered = marked(text, { renderer }).toString();\n const template = document.createElement('template');\n template.innerHTML = rendered;\n\n return html`${template.content}`;\n}\n"]}
@@ -0,0 +1,45 @@
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
+ private handleHeaderClick;
33
+ private getURL;
34
+ private defaulAttachmentContent;
35
+ private renderAttachmentHeaderText;
36
+ private renderAttachmentHeaderActions;
37
+ private renderAttachmentContent;
38
+ private renderDefaultAttachmentsTemplate;
39
+ protected render(): import("lit-html").TemplateResult<1>;
40
+ }
41
+ declare global {
42
+ interface HTMLElementTagNameMap {
43
+ 'igc-message-attachments': IgcMessageAttachmentsComponent;
44
+ }
45
+ }