igniteui-webcomponents 6.3.0-beta.0 → 6.3.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 (324) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/components/accordion/accordion.js +3 -4
  3. package/components/accordion/accordion.js.map +1 -1
  4. package/components/avatar/avatar.js +3 -4
  5. package/components/avatar/avatar.js.map +1 -1
  6. package/components/badge/badge.js +3 -4
  7. package/components/badge/badge.js.map +1 -1
  8. package/components/banner/banner.js +3 -4
  9. package/components/banner/banner.js.map +1 -1
  10. package/components/button/button-base.js +1 -1
  11. package/components/button/button-base.js.map +1 -1
  12. package/components/button/button.js +3 -4
  13. package/components/button/button.js.map +1 -1
  14. package/components/button/icon-button.js +3 -4
  15. package/components/button/icon-button.js.map +1 -1
  16. package/components/button-group/button-group.js +3 -4
  17. package/components/button-group/button-group.js.map +1 -1
  18. package/components/button-group/toggle-button.js +4 -3
  19. package/components/button-group/toggle-button.js.map +1 -1
  20. package/components/calendar/calendar.js +3 -4
  21. package/components/calendar/calendar.js.map +1 -1
  22. package/components/calendar/days-view/days-view.js +4 -3
  23. package/components/calendar/days-view/days-view.js.map +1 -1
  24. package/components/calendar/months-view/months-view.js +4 -3
  25. package/components/calendar/months-view/months-view.js.map +1 -1
  26. package/components/calendar/years-view/years-view.js +4 -3
  27. package/components/calendar/years-view/years-view.js.map +1 -1
  28. package/components/card/card.actions.js +3 -4
  29. package/components/card/card.actions.js.map +1 -1
  30. package/components/card/card.content.js +3 -4
  31. package/components/card/card.content.js.map +1 -1
  32. package/components/card/card.header.js +3 -4
  33. package/components/card/card.header.js.map +1 -1
  34. package/components/card/card.js +3 -4
  35. package/components/card/card.js.map +1 -1
  36. package/components/card/card.media.js +3 -4
  37. package/components/card/card.media.js.map +1 -1
  38. package/components/carousel/carousel-indicator-container.js +3 -4
  39. package/components/carousel/carousel-indicator-container.js.map +1 -1
  40. package/components/carousel/carousel-indicator.js +3 -4
  41. package/components/carousel/carousel-indicator.js.map +1 -1
  42. package/components/carousel/carousel-slide.js +3 -4
  43. package/components/carousel/carousel-slide.js.map +1 -1
  44. package/components/carousel/carousel.js +3 -4
  45. package/components/carousel/carousel.js.map +1 -1
  46. package/components/chat/chat-input.d.ts +8 -20
  47. package/components/chat/chat-input.js +78 -56
  48. package/components/chat/chat-input.js.map +1 -1
  49. package/components/chat/chat-message.d.ts +6 -21
  50. package/components/chat/chat-message.js +113 -71
  51. package/components/chat/chat-message.js.map +1 -1
  52. package/components/chat/chat-state.d.ts +45 -50
  53. package/components/chat/chat-state.js +82 -91
  54. package/components/chat/chat-state.js.map +1 -1
  55. package/components/chat/chat.d.ts +68 -24
  56. package/components/chat/chat.js +99 -96
  57. package/components/chat/chat.js.map +1 -1
  58. package/components/chat/extras/markdown-renderer.d.ts +6 -3
  59. package/components/chat/extras/markdown-renderer.js +19 -14
  60. package/components/chat/extras/markdown-renderer.js.map +1 -1
  61. package/components/chat/message-attachments.d.ts +5 -5
  62. package/components/chat/message-attachments.js +49 -43
  63. package/components/chat/message-attachments.js.map +1 -1
  64. package/components/chat/themes/chat.base.css.js +1 -1
  65. package/components/chat/themes/chat.base.css.js.map +1 -1
  66. package/components/chat/themes/dark/chat.bootstrap.css.js +1 -1
  67. package/components/chat/themes/dark/chat.bootstrap.css.js.map +1 -1
  68. package/components/chat/themes/dark/chat.fluent.css.js +1 -1
  69. package/components/chat/themes/dark/chat.fluent.css.js.map +1 -1
  70. package/components/chat/themes/dark/chat.indigo.css.js +1 -1
  71. package/components/chat/themes/dark/chat.indigo.css.js.map +1 -1
  72. package/components/chat/themes/dark/chat.material.css.js +1 -1
  73. package/components/chat/themes/dark/chat.material.css.js.map +1 -1
  74. package/components/chat/themes/input.base.css.js +1 -1
  75. package/components/chat/themes/input.base.css.js.map +1 -1
  76. package/components/chat/themes/light/chat.bootstrap.css.js +1 -1
  77. package/components/chat/themes/light/chat.bootstrap.css.js.map +1 -1
  78. package/components/chat/themes/light/chat.indigo.css.js +1 -1
  79. package/components/chat/themes/light/chat.indigo.css.js.map +1 -1
  80. package/components/chat/themes/light/chat.shared.css.js +1 -1
  81. package/components/chat/themes/light/chat.shared.css.js.map +1 -1
  82. package/components/chat/themes/message-attachments.base.css.js +1 -1
  83. package/components/chat/themes/message-attachments.base.css.js.map +1 -1
  84. package/components/chat/themes/message.base.css.js +1 -1
  85. package/components/chat/themes/message.base.css.js.map +1 -1
  86. package/components/chat/themes/shared/chat.bootstrap.css.js +1 -1
  87. package/components/chat/themes/shared/chat.bootstrap.css.js.map +1 -1
  88. package/components/chat/themes/shared/chat.fluent.css.js +1 -1
  89. package/components/chat/themes/shared/chat.fluent.css.js.map +1 -1
  90. package/components/chat/themes/shared/chat.indigo.css.js +1 -1
  91. package/components/chat/themes/shared/chat.indigo.css.js.map +1 -1
  92. package/components/chat/themes/shared/input/input.bootstrap.css.js +1 -1
  93. package/components/chat/themes/shared/input/input.bootstrap.css.js.map +1 -1
  94. package/components/chat/themes/shared/input/input.fluent.css.js +1 -1
  95. package/components/chat/themes/shared/input/input.fluent.css.js.map +1 -1
  96. package/components/chat/themes/shared/input/input.indigo.css.js +1 -1
  97. package/components/chat/themes/shared/input/input.indigo.css.js.map +1 -1
  98. package/components/chat/themes/shared/message-attachments/message-attachments.common.css.js +1 -1
  99. package/components/chat/themes/shared/message-attachments/message-attachments.common.css.js.map +1 -1
  100. package/components/chat/types.d.ts +173 -28
  101. package/components/chat/types.js.map +1 -1
  102. package/components/chat/utils.d.ts +3 -3
  103. package/components/chat/utils.js +7 -11
  104. package/components/chat/utils.js.map +1 -1
  105. package/components/checkbox/checkbox.js +3 -4
  106. package/components/checkbox/checkbox.js.map +1 -1
  107. package/components/checkbox/switch.js +3 -4
  108. package/components/checkbox/switch.js.map +1 -1
  109. package/components/checkbox/themes/checkbox.base.css.js +1 -1
  110. package/components/checkbox/themes/checkbox.base.css.js.map +1 -1
  111. package/components/checkbox/themes/switch.base.css.js +1 -1
  112. package/components/checkbox/themes/switch.base.css.js.map +1 -1
  113. package/components/chip/chip.js +3 -4
  114. package/components/chip/chip.js.map +1 -1
  115. package/components/combo/combo-header.js +3 -4
  116. package/components/combo/combo-header.js.map +1 -1
  117. package/components/combo/combo-item.js +3 -4
  118. package/components/combo/combo-item.js.map +1 -1
  119. package/components/combo/combo-list.js +2 -3
  120. package/components/combo/combo-list.js.map +1 -1
  121. package/components/combo/combo.js +4 -3
  122. package/components/combo/combo.js.map +1 -1
  123. package/components/common/controllers/focus-ring.js +5 -5
  124. package/components/common/controllers/focus-ring.js.map +1 -1
  125. package/components/common/controllers/key-bindings.js +4 -4
  126. package/components/common/controllers/key-bindings.js.map +1 -1
  127. package/components/common/i18n/chat.resources.d.ts +3 -0
  128. package/components/common/i18n/chat.resources.js +3 -0
  129. package/components/common/i18n/chat.resources.js.map +1 -1
  130. package/components/common/mixins/forms/associated.js +1 -1
  131. package/components/common/mixins/forms/associated.js.map +1 -1
  132. package/components/common/mixins/forms/form-value.js +1 -1
  133. package/components/common/mixins/forms/form-value.js.map +1 -1
  134. package/components/common/part-map.d.ts +1 -1
  135. package/components/common/util.d.ts +3 -0
  136. package/components/common/util.js +9 -1
  137. package/components/common/util.js.map +1 -1
  138. package/components/date-picker/date-picker.js +5 -4
  139. package/components/date-picker/date-picker.js.map +1 -1
  140. package/components/date-range-picker/date-range-picker.js +5 -4
  141. package/components/date-range-picker/date-range-picker.js.map +1 -1
  142. package/components/date-range-picker/predefined-ranges-area.js +3 -4
  143. package/components/date-range-picker/predefined-ranges-area.js.map +1 -1
  144. package/components/date-time-input/date-time-input.js +2 -3
  145. package/components/date-time-input/date-time-input.js.map +1 -1
  146. package/components/date-time-input/date-util.js +11 -11
  147. package/components/date-time-input/date-util.js.map +1 -1
  148. package/components/dialog/dialog.js +3 -4
  149. package/components/dialog/dialog.js.map +1 -1
  150. package/components/divider/divider.js +3 -4
  151. package/components/divider/divider.js.map +1 -1
  152. package/components/dropdown/dropdown-group.js +3 -4
  153. package/components/dropdown/dropdown-group.js.map +1 -1
  154. package/components/dropdown/dropdown-header.js +3 -4
  155. package/components/dropdown/dropdown-header.js.map +1 -1
  156. package/components/dropdown/dropdown-item.js +3 -4
  157. package/components/dropdown/dropdown-item.js.map +1 -1
  158. package/components/dropdown/dropdown.js +4 -3
  159. package/components/dropdown/dropdown.js.map +1 -1
  160. package/components/expansion-panel/expansion-panel.js +3 -4
  161. package/components/expansion-panel/expansion-panel.js.map +1 -1
  162. package/components/file-input/file-input.js +3 -4
  163. package/components/file-input/file-input.js.map +1 -1
  164. package/components/focus-trap/focus-trap.js +7 -8
  165. package/components/focus-trap/focus-trap.js.map +1 -1
  166. package/components/icon/icon-references.js +78 -0
  167. package/components/icon/icon-references.js.map +1 -1
  168. package/components/icon/icon-state.broadcast.js +1 -1
  169. package/components/icon/icon-state.broadcast.js.map +1 -1
  170. package/components/icon/icon.js +3 -4
  171. package/components/icon/icon.js.map +1 -1
  172. package/components/icon/internal-icons-lib.js +39 -0
  173. package/components/icon/internal-icons-lib.js.map +1 -1
  174. package/components/input/input-base.js +4 -3
  175. package/components/input/input-base.js.map +1 -1
  176. package/components/input/input.js +2 -3
  177. package/components/input/input.js.map +1 -1
  178. package/components/input/themes/shared/input.bootstrap.css.js +1 -1
  179. package/components/input/themes/shared/input.bootstrap.css.js.map +1 -1
  180. package/components/input/themes/shared/input.indigo.css.js +1 -1
  181. package/components/input/themes/shared/input.indigo.css.js.map +1 -1
  182. package/components/list/list-header.js +3 -4
  183. package/components/list/list-header.js.map +1 -1
  184. package/components/list/list-item.js +3 -4
  185. package/components/list/list-item.js.map +1 -1
  186. package/components/list/list.js +3 -4
  187. package/components/list/list.js.map +1 -1
  188. package/components/list/themes/header.js +2 -28
  189. package/components/list/themes/header.js.map +1 -1
  190. package/components/list/themes/item.js +6 -20
  191. package/components/list/themes/item.js.map +1 -1
  192. package/components/mask-input/mask-input.js +2 -3
  193. package/components/mask-input/mask-input.js.map +1 -1
  194. package/components/nav-drawer/nav-drawer-header-item.js +3 -4
  195. package/components/nav-drawer/nav-drawer-header-item.js.map +1 -1
  196. package/components/nav-drawer/nav-drawer-item.js +3 -4
  197. package/components/nav-drawer/nav-drawer-item.js.map +1 -1
  198. package/components/nav-drawer/nav-drawer.js +3 -4
  199. package/components/nav-drawer/nav-drawer.js.map +1 -1
  200. package/components/navbar/navbar.js +3 -4
  201. package/components/navbar/navbar.js.map +1 -1
  202. package/components/popover/popover.js +9 -10
  203. package/components/popover/popover.js.map +1 -1
  204. package/components/progress/circular-gradient.js +2 -3
  205. package/components/progress/circular-gradient.js.map +1 -1
  206. package/components/progress/circular-progress.js +3 -4
  207. package/components/progress/circular-progress.js.map +1 -1
  208. package/components/progress/linear-progress.js +3 -4
  209. package/components/progress/linear-progress.js.map +1 -1
  210. package/components/radio/radio.js +3 -4
  211. package/components/radio/radio.js.map +1 -1
  212. package/components/radio-group/radio-group.js +3 -4
  213. package/components/radio-group/radio-group.js.map +1 -1
  214. package/components/rating/rating-symbol.js +3 -4
  215. package/components/rating/rating-symbol.js.map +1 -1
  216. package/components/rating/rating.js +3 -4
  217. package/components/rating/rating.js.map +1 -1
  218. package/components/resize-container/resize-container.js +3 -4
  219. package/components/resize-container/resize-container.js.map +1 -1
  220. package/components/ripple/ripple.js +3 -4
  221. package/components/ripple/ripple.js.map +1 -1
  222. package/components/select/select-group.js +3 -4
  223. package/components/select/select-group.js.map +1 -1
  224. package/components/select/select-header.js +3 -4
  225. package/components/select/select-header.js.map +1 -1
  226. package/components/select/select-item.js +3 -4
  227. package/components/select/select-item.js.map +1 -1
  228. package/components/select/select.js +4 -3
  229. package/components/select/select.js.map +1 -1
  230. package/components/slider/range-slider.js +2 -3
  231. package/components/slider/range-slider.js.map +1 -1
  232. package/components/slider/slider-base.js +1 -1
  233. package/components/slider/slider-base.js.map +1 -1
  234. package/components/slider/slider-label.js +7 -8
  235. package/components/slider/slider-label.js.map +1 -1
  236. package/components/slider/slider.js +2 -3
  237. package/components/slider/slider.js.map +1 -1
  238. package/components/snackbar/snackbar.js +3 -4
  239. package/components/snackbar/snackbar.js.map +1 -1
  240. package/components/stepper/step.js +3 -4
  241. package/components/stepper/step.js.map +1 -1
  242. package/components/stepper/stepper.js +3 -4
  243. package/components/stepper/stepper.js.map +1 -1
  244. package/components/tabs/tab-dom.js +1 -1
  245. package/components/tabs/tab-dom.js.map +1 -1
  246. package/components/tabs/tab.js +4 -5
  247. package/components/tabs/tab.js.map +1 -1
  248. package/components/tabs/tabs.js +3 -4
  249. package/components/tabs/tabs.js.map +1 -1
  250. package/components/textarea/textarea.js +4 -3
  251. package/components/textarea/textarea.js.map +1 -1
  252. package/components/textarea/themes/shared/textarea.bootstrap.css.js +1 -1
  253. package/components/textarea/themes/shared/textarea.bootstrap.css.js.map +1 -1
  254. package/components/tile-manager/themes/tile-manager.base.css.js +1 -1
  255. package/components/tile-manager/themes/tile-manager.base.css.js.map +1 -1
  256. package/components/tile-manager/tile-manager.js +4 -3
  257. package/components/tile-manager/tile-manager.js.map +1 -1
  258. package/components/tile-manager/tile.js +3 -4
  259. package/components/tile-manager/tile.js.map +1 -1
  260. package/components/toast/toast.js +3 -4
  261. package/components/toast/toast.js.map +1 -1
  262. package/components/tooltip/controller.js +4 -4
  263. package/components/tooltip/controller.js.map +1 -1
  264. package/components/tooltip/tooltip.js +3 -4
  265. package/components/tooltip/tooltip.js.map +1 -1
  266. package/components/tree/tree-item.js +3 -4
  267. package/components/tree/tree-item.js.map +1 -1
  268. package/components/tree/tree.js +4 -3
  269. package/components/tree/tree.js.map +1 -1
  270. package/components/validation-container/validation-container.js +3 -4
  271. package/components/validation-container/validation-container.js.map +1 -1
  272. package/custom-elements.json +2142 -2029
  273. package/igniteui-webcomponents.css-data.json +1 -1
  274. package/igniteui-webcomponents.html-data.json +1 -1
  275. package/package.json +24 -2
  276. package/web-types.json +2 -2
  277. package/components/list/themes/dark/header/list-header.bootstrap.css.d.ts +0 -1
  278. package/components/list/themes/dark/header/list-header.bootstrap.css.js +0 -3
  279. package/components/list/themes/dark/header/list-header.bootstrap.css.js.map +0 -1
  280. package/components/list/themes/dark/header/list-header.fluent.css.d.ts +0 -1
  281. package/components/list/themes/dark/header/list-header.fluent.css.js +0 -3
  282. package/components/list/themes/dark/header/list-header.fluent.css.js.map +0 -1
  283. package/components/list/themes/dark/header/list-header.indigo.css.d.ts +0 -1
  284. package/components/list/themes/dark/header/list-header.indigo.css.js +0 -3
  285. package/components/list/themes/dark/header/list-header.indigo.css.js.map +0 -1
  286. package/components/list/themes/dark/header/list-header.material.css.d.ts +0 -1
  287. package/components/list/themes/dark/header/list-header.material.css.js +0 -3
  288. package/components/list/themes/dark/header/list-header.material.css.js.map +0 -1
  289. package/components/list/themes/dark/item/list-item.bootstrap.css.d.ts +0 -1
  290. package/components/list/themes/dark/item/list-item.bootstrap.css.js +0 -3
  291. package/components/list/themes/dark/item/list-item.bootstrap.css.js.map +0 -1
  292. package/components/list/themes/dark/item/list-item.fluent.css.d.ts +0 -1
  293. package/components/list/themes/dark/item/list-item.fluent.css.js +0 -3
  294. package/components/list/themes/dark/item/list-item.fluent.css.js.map +0 -1
  295. package/components/list/themes/dark/item/list-item.indigo.css.d.ts +0 -1
  296. package/components/list/themes/dark/item/list-item.indigo.css.js +0 -3
  297. package/components/list/themes/dark/item/list-item.indigo.css.js.map +0 -1
  298. package/components/list/themes/dark/item/list-item.material.css.d.ts +0 -1
  299. package/components/list/themes/dark/item/list-item.material.css.js +0 -3
  300. package/components/list/themes/dark/item/list-item.material.css.js.map +0 -1
  301. package/components/list/themes/light/header/list-header.bootstrap.css.d.ts +0 -1
  302. package/components/list/themes/light/header/list-header.bootstrap.css.js +0 -3
  303. package/components/list/themes/light/header/list-header.bootstrap.css.js.map +0 -1
  304. package/components/list/themes/light/header/list-header.fluent.css.d.ts +0 -1
  305. package/components/list/themes/light/header/list-header.fluent.css.js +0 -3
  306. package/components/list/themes/light/header/list-header.fluent.css.js.map +0 -1
  307. package/components/list/themes/light/header/list-header.indigo.css.d.ts +0 -1
  308. package/components/list/themes/light/header/list-header.indigo.css.js +0 -3
  309. package/components/list/themes/light/header/list-header.indigo.css.js.map +0 -1
  310. package/components/list/themes/light/header/list-header.material.css.d.ts +0 -1
  311. package/components/list/themes/light/header/list-header.material.css.js +0 -3
  312. package/components/list/themes/light/header/list-header.material.css.js.map +0 -1
  313. package/components/list/themes/light/item/list-item.bootstrap.css.d.ts +0 -1
  314. package/components/list/themes/light/item/list-item.bootstrap.css.js +0 -3
  315. package/components/list/themes/light/item/list-item.bootstrap.css.js.map +0 -1
  316. package/components/list/themes/light/item/list-item.fluent.css.d.ts +0 -1
  317. package/components/list/themes/light/item/list-item.fluent.css.js +0 -3
  318. package/components/list/themes/light/item/list-item.fluent.css.js.map +0 -1
  319. package/components/list/themes/light/item/list-item.indigo.css.d.ts +0 -1
  320. package/components/list/themes/light/item/list-item.indigo.css.js +0 -3
  321. package/components/list/themes/light/item/list-item.indigo.css.js.map +0 -1
  322. package/components/list/themes/light/item/list-item.material.css.d.ts +0 -1
  323. package/components/list/themes/light/item/list-item.material.css.js +0 -3
  324. package/components/list/themes/light/item/list-item.material.css.js.map +0 -1
@@ -7,31 +7,34 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  import { consume } 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';
10
11
  import { until } from 'lit/directives/until.js';
11
12
  import { addThemingController } from '../../theming/theming-controller.js';
12
- import IgcAvatarComponent from '../avatar/avatar.js';
13
+ import IgcIconButtonComponent from '../button/icon-button.js';
13
14
  import { chatContext } from '../common/context.js';
14
15
  import { registerComponent } from '../common/definitions/register.js';
15
16
  import { partMap } from '../common/part-map.js';
16
- import { isEmpty } from '../common/util.js';
17
- import IgcTooltipComponent from '../tooltip/tooltip.js';
17
+ import { isEmpty, trimmedHtml } from '../common/util.js';
18
18
  import IgcMessageAttachmentsComponent from './message-attachments.js';
19
19
  import { styles } from './themes/message.base.css.js';
20
20
  import { all } from './themes/message.js';
21
21
  import { styles as shared } from './themes/shared/chat-message/chat-message.common.css.js';
22
- import { chatMessageAdoptPageStyles, showChatActionsTooltip } from './utils.js';
22
+ import { chatMessageAdoptPageStyles } from './utils.js';
23
23
  const LIKE_INACTIVE = 'thumb_up_inactive';
24
24
  const LIKE_ACTIVE = 'thumb_up_active';
25
25
  const DISLIKE_INACTIVE = 'thumb_down_inactive';
26
26
  const DISLIKE_ACTIVE = 'thumb_down_active';
27
- class IgcChatMessageComponent extends LitElement {
27
+ const COPY_CONTENT = 'copy_content';
28
+ const REGENERATE = 'regenerate';
29
+ export default class IgcChatMessageComponent extends LitElement {
30
+ static { this.tagName = 'igc-chat-message'; }
31
+ static { this.styles = [styles, shared]; }
28
32
  static register() {
29
- registerComponent(IgcChatMessageComponent, IgcMessageAttachmentsComponent, IgcAvatarComponent, IgcTooltipComponent);
33
+ registerComponent(IgcChatMessageComponent, IgcMessageAttachmentsComponent, IgcIconButtonComponent);
30
34
  }
31
35
  constructor() {
32
36
  super();
33
37
  this._defaults = Object.freeze({
34
- message: () => this._renderMessage(),
35
38
  messageHeader: () => this._renderHeader(),
36
39
  messageContent: () => this._renderContent(),
37
40
  messageAttachments: () => this._renderAttachments(),
@@ -40,66 +43,95 @@ class IgcChatMessageComponent extends LitElement {
40
43
  addThemingController(this, all);
41
44
  }
42
45
  firstUpdated() {
43
- chatMessageAdoptPageStyles(this);
46
+ if (this._state.options?.adoptRootStyles) {
47
+ chatMessageAdoptPageStyles(this);
48
+ }
44
49
  }
45
50
  _getRenderer(name) {
46
51
  return this._state.options?.renderers
47
52
  ? (this._state.options.renderers[name] ?? this._defaults[name])
48
53
  : this._defaults[name];
49
54
  }
55
+ async _handleCopy() {
56
+ const text = this.message.text;
57
+ const separator = text ? '\n\n' : '';
58
+ const attachments = this.message.attachments ?? [];
59
+ const { attachmentLabel, attachmentsListLabel, messageCopied } = this._state.resourceStrings;
60
+ const attachmentsText = isEmpty(attachments)
61
+ ? ''
62
+ : attachments
63
+ .map(({ name, url }) => `${name ?? attachmentLabel}: ${url ?? ''}`)
64
+ .join('\n');
65
+ const payload = attachmentsText
66
+ ? `${text}${separator}${attachmentsListLabel}:\n${attachmentsText}`
67
+ : text;
68
+ try {
69
+ await navigator.clipboard.writeText(payload);
70
+ this._state.showActionToast(messageCopied);
71
+ }
72
+ catch (err) {
73
+ throw new Error(`Failed to copy message: ${err}`);
74
+ }
75
+ }
50
76
  _handleMessageActionClick(event) {
51
77
  const targetButton = event.target;
52
- const button = targetButton.closest('igc-icon-button');
53
- if (!button)
78
+ const button = targetButton.closest(IgcIconButtonComponent.tagName);
79
+ if (!button) {
54
80
  return;
55
- let reaction = button.getAttribute('name');
56
- if (this.message) {
57
- if (reaction === LIKE_INACTIVE) {
58
- reaction = LIKE_ACTIVE;
59
- this.message.reactions = [reaction];
60
- }
61
- else if (reaction === DISLIKE_INACTIVE) {
62
- reaction = DISLIKE_ACTIVE;
63
- this.message.reactions = [reaction];
64
- }
65
- else if (reaction === this.message.reactions?.[0]) {
66
- reaction = null;
67
- this.message.reactions = [];
68
- }
69
- this.requestUpdate();
70
81
  }
71
- this._state.emitEvent('igcMessageReact', {
72
- detail: { message: this.message, reaction },
73
- });
82
+ let reaction = button.name;
83
+ switch (reaction) {
84
+ case LIKE_INACTIVE:
85
+ case LIKE_ACTIVE:
86
+ reaction = this.message.reactions?.includes(LIKE_ACTIVE)
87
+ ? LIKE_INACTIVE
88
+ : LIKE_ACTIVE;
89
+ break;
90
+ case DISLIKE_INACTIVE:
91
+ case DISLIKE_ACTIVE:
92
+ reaction = this.message.reactions?.includes(DISLIKE_ACTIVE)
93
+ ? DISLIKE_INACTIVE
94
+ : DISLIKE_ACTIVE;
95
+ break;
96
+ case COPY_CONTENT:
97
+ reaction = COPY_CONTENT;
98
+ this._handleCopy();
99
+ break;
100
+ case REGENERATE:
101
+ reaction = REGENERATE;
102
+ break;
103
+ default:
104
+ reaction = '';
105
+ }
106
+ this.message.reactions = reaction ? [reaction] : [];
107
+ this._state.emitMessageReaction({ message: this.message, reaction });
108
+ this.requestUpdate();
74
109
  }
75
110
  _renderHeader() {
76
111
  return nothing;
77
112
  }
78
113
  _renderContent() {
79
- return this.message?.text
80
- ? html `<pre part="plain-text">${this.message.text}</pre>`
81
- : nothing;
114
+ return html `${this.message.text}`;
82
115
  }
83
116
  _renderActions() {
84
- const isSent = this.message?.sender === this._state.currentUserId;
85
- const hasText = this.message?.text.trim();
117
+ const isSent = this.message.sender === this._state.currentUserId;
118
+ const hasText = this.message.text.trim();
119
+ const hasAttachments = !isEmpty(this.message.attachments ?? []);
86
120
  const isTyping = this._state._isTyping;
87
121
  const isLastMessage = this.message === this._state.messages.at(-1);
88
122
  const resourceStrings = this._state.resourceStrings;
89
- if (isSent || !hasText || (isLastMessage && isTyping)) {
123
+ if (isSent || !(hasText || hasAttachments) || (isLastMessage && isTyping)) {
90
124
  return nothing;
91
125
  }
92
126
  return html `
93
- <div @click=${this._handleMessageActionClick}>
94
- ${this._renderActionButton('copy_content', resourceStrings.reactionCopy)}
95
- ${this._renderActionButton(this.message?.reactions?.includes(LIKE_ACTIVE)
127
+ ${this._renderActionButton(COPY_CONTENT, resourceStrings.reactionCopy)}
128
+ ${this._renderActionButton(this.message.reactions?.includes(LIKE_ACTIVE)
96
129
  ? LIKE_ACTIVE
97
130
  : LIKE_INACTIVE, resourceStrings.reactionLike)}
98
- ${this._renderActionButton(this.message?.reactions?.includes(DISLIKE_ACTIVE)
131
+ ${this._renderActionButton(this.message.reactions?.includes(DISLIKE_ACTIVE)
99
132
  ? DISLIKE_ACTIVE
100
133
  : DISLIKE_INACTIVE, resourceStrings.reactionDislike)}
101
- ${this._renderActionButton('regenerate', resourceStrings.reactionRegenerate)}
102
- </div>
134
+ ${this._renderActionButton(REGENERATE, resourceStrings.reactionRegenerate)}
103
135
  `;
104
136
  }
105
137
  _renderActionButton(name, tooltipMessage) {
@@ -108,59 +140,69 @@ class IgcChatMessageComponent extends LitElement {
108
140
  id=${`${name}-button`}
109
141
  name=${name}
110
142
  variant="flat"
111
- @pointerenter=${({ target }) => showChatActionsTooltip(target, tooltipMessage)}
112
- @focus=${({ target }) => showChatActionsTooltip(target, tooltipMessage)}
143
+ @pointerenter=${({ target }) => this._state.showActionsTooltip(target, tooltipMessage)}
144
+ @focus=${({ target }) => this._state.showActionsTooltip(target, tooltipMessage)}
113
145
  ></igc-icon-button>
114
146
  `;
115
147
  }
116
148
  _renderAttachments() {
117
- return isEmpty(this.message?.attachments ?? [])
149
+ return isEmpty(this.message.attachments ?? [])
118
150
  ? nothing
119
151
  : html `
120
152
  <igc-message-attachments
121
153
  .message=${this.message}
154
+ exportparts="
155
+ attachment,
156
+ attachment-header,
157
+ attachment-icon,
158
+ file-name,
159
+ attachment-content"
122
160
  ></igc-message-attachments>
123
161
  `;
124
162
  }
125
163
  _renderMessage() {
126
- return this.message
127
- ? html `${this._renderHeader()}${this._renderContent()}${this._renderAttachments()}${this._renderActions()}`
128
- : nothing;
129
- }
130
- render() {
131
- if (!this.message) {
132
- return nothing;
133
- }
134
- const parts = {
135
- 'message-container': true,
136
- sent: this._state.isCurrentUserMessage(this.message),
137
- };
138
- const options = this._state.options;
139
164
  const ctx = {
140
- param: this.message,
141
- defaults: this._defaults,
142
- options,
165
+ message: this.message,
166
+ instance: this._state.host,
143
167
  };
144
- if (options?.renderers?.message) {
145
- return html `
146
- <div part=${partMap(parts)}>
147
- ${until(options.renderers.message(ctx))}
148
- </div>
149
- `;
150
- }
151
- return html `
152
- <div part=${partMap(parts)}>
168
+ return trimmedHtml `
169
+ <div part="message-header">
153
170
  ${until(this._getRenderer('messageHeader')(ctx))}
171
+ </div>
172
+ <div part="plain-text">
154
173
  ${until(this._getRenderer('messageContent')(ctx))}
174
+ </div>
175
+ <div part="message-attachments">
155
176
  ${until(this._getRenderer('messageAttachments')(ctx))}
177
+ </div>
178
+ <div part="message-actions" @click=${this._handleMessageActionClick}>
156
179
  ${until(this._getRenderer('messageActions')(ctx))}
157
180
  </div>
158
181
  `;
159
182
  }
183
+ render() {
184
+ const messageRenderer = this._state.options?.renderers?.message;
185
+ const ctx = {
186
+ message: this.message,
187
+ instance: this._state.host,
188
+ };
189
+ const parts = {
190
+ 'message-container': true,
191
+ sent: this._state.isCurrentUserMessage(this.message),
192
+ };
193
+ return html `
194
+ ${cache(this.message
195
+ ? html `
196
+ <div part=${partMap(parts)}>
197
+ ${cache(messageRenderer
198
+ ? until(messageRenderer(ctx))
199
+ : this._renderMessage())}
200
+ </div>
201
+ `
202
+ : nothing)}
203
+ `;
204
+ }
160
205
  }
161
- IgcChatMessageComponent.tagName = 'igc-chat-message';
162
- IgcChatMessageComponent.styles = [styles, shared];
163
- export default IgcChatMessageComponent;
164
206
  __decorate([
165
207
  consume({ context: chatContext, subscribe: true })
166
208
  ], IgcChatMessageComponent.prototype, "_state", void 0);
@@ -1 +1 @@
1
- {"version":3,"file":"chat-message.js","sourceRoot":"","sources":["../../../src/components/chat/chat-message.ts"],"names":[],"mappings":"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","sourcesContent":["import { consume } from '@lit/context';\nimport { html, LitElement, nothing } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { until } from 'lit/directives/until.js';\nimport { addThemingController } from '../../theming/theming-controller.js';\nimport IgcAvatarComponent from '../avatar/avatar.js';\nimport { chatContext } from '../common/context.js';\nimport { registerComponent } from '../common/definitions/register.js';\nimport { partMap } from '../common/part-map.js';\nimport { isEmpty } from '../common/util.js';\nimport IgcTooltipComponent from '../tooltip/tooltip.js';\nimport type { ChatState } from './chat-state.js';\nimport IgcMessageAttachmentsComponent from './message-attachments.js';\nimport { styles } from './themes/message.base.css.js';\nimport { all } from './themes/message.js';\nimport { styles as shared } from './themes/shared/chat-message/chat-message.common.css.js';\nimport type { ChatTemplateRenderer, IgcMessage } from './types.js';\nimport { chatMessageAdoptPageStyles, showChatActionsTooltip } from './utils.js';\n\nconst LIKE_INACTIVE = 'thumb_up_inactive';\nconst LIKE_ACTIVE = 'thumb_up_active';\nconst DISLIKE_INACTIVE = 'thumb_down_inactive';\nconst DISLIKE_ACTIVE = 'thumb_down_active';\n\ntype DefaultMessageRenderers = {\n message: ChatTemplateRenderer<IgcMessage>;\n messageHeader: ChatTemplateRenderer<IgcMessage>;\n messageContent: ChatTemplateRenderer<IgcMessage>;\n messageAttachments: ChatTemplateRenderer<IgcMessage>;\n messageActions: ChatTemplateRenderer<IgcMessage>;\n};\n\n/**\n * A chat message component for displaying individual messages in `<igc-chat>`.\n *\n * @element igc-chat-message\n *\n * @fires igcMessageReact - Fired when a message is reacted to.\n *\n * This component renders a single chat message including:\n * - Message text (sanitized)\n * - Attachments (if any)\n * - Custom templates for message content and actions (if provided via chat options)\n *\n * It distinguishes sent messages from received messages by comparing\n * the message sender with the current user ID from chat state.\n *\n * The message text is sanitized with DOMPurify before rendering,\n * and can be rendered with a markdown renderer if provided.\n */\nexport default class IgcChatMessageComponent extends LitElement {\n public static readonly tagName = 'igc-chat-message';\n public static override styles = [styles, shared];\n\n /* blazorSuppress */\n public static register(): void {\n registerComponent(\n IgcChatMessageComponent,\n IgcMessageAttachmentsComponent,\n IgcAvatarComponent,\n IgcTooltipComponent\n );\n }\n\n /**\n * Injected chat state context. Provides message data, user info, and options.\n */\n @consume({ context: chatContext, subscribe: true })\n private readonly _state!: ChatState;\n\n private readonly _defaults = Object.freeze<DefaultMessageRenderers>({\n message: () => this._renderMessage(),\n messageHeader: () => this._renderHeader(),\n messageContent: () => this._renderContent(),\n messageAttachments: () => this._renderAttachments(),\n messageActions: () => this._renderActions(),\n });\n\n /**\n * The chat message to render.\n */\n @property({ attribute: false })\n public message?: IgcMessage;\n\n constructor() {\n super();\n addThemingController(this, all);\n }\n\n protected override firstUpdated(): void {\n chatMessageAdoptPageStyles(this);\n }\n\n private _getRenderer(name: keyof DefaultMessageRenderers) {\n return this._state.options?.renderers\n ? (this._state.options.renderers[name] ?? this._defaults[name])\n : this._defaults[name];\n }\n\n private _handleMessageActionClick(event: PointerEvent): void {\n const targetButton = event.target as HTMLElement;\n const button = targetButton.closest('igc-icon-button');\n if (!button) return;\n\n let reaction = button.getAttribute('name');\n if (this.message) {\n if (reaction === LIKE_INACTIVE) {\n reaction = LIKE_ACTIVE;\n this.message.reactions = [reaction];\n } else if (reaction === DISLIKE_INACTIVE) {\n reaction = DISLIKE_ACTIVE;\n this.message.reactions = [reaction];\n } else if (reaction === this.message.reactions?.[0]) {\n reaction = null;\n this.message.reactions = [];\n }\n\n this.requestUpdate();\n }\n\n this._state.emitEvent('igcMessageReact', {\n detail: { message: this.message, reaction },\n });\n }\n\n private _renderHeader() {\n return nothing;\n }\n\n private _renderContent() {\n return this.message?.text\n ? html`<pre part=\"plain-text\">${this.message.text}</pre>`\n : nothing;\n }\n\n private _renderActions() {\n const isSent = this.message?.sender === this._state.currentUserId;\n const hasText = this.message?.text.trim();\n const isTyping = this._state._isTyping;\n const isLastMessage = this.message === this._state.messages.at(-1);\n const resourceStrings = this._state.resourceStrings!;\n\n if (isSent || !hasText || (isLastMessage && isTyping)) {\n return nothing;\n }\n\n return html`\n <div @click=${this._handleMessageActionClick}>\n ${this._renderActionButton(\n 'copy_content',\n resourceStrings.reactionCopy\n )}\n ${this._renderActionButton(\n this.message?.reactions?.includes(LIKE_ACTIVE)\n ? LIKE_ACTIVE\n : LIKE_INACTIVE,\n resourceStrings.reactionLike\n )}\n ${this._renderActionButton(\n this.message?.reactions?.includes(DISLIKE_ACTIVE)\n ? DISLIKE_ACTIVE\n : DISLIKE_INACTIVE,\n resourceStrings.reactionDislike\n )}\n ${this._renderActionButton(\n 'regenerate',\n resourceStrings.reactionRegenerate\n )}\n </div>\n `;\n }\n\n private _renderActionButton(name: string, tooltipMessage: string) {\n return html`\n <igc-icon-button\n id=${`${name}-button`}\n name=${name}\n variant=\"flat\"\n @pointerenter=${({ target }: PointerEvent) =>\n showChatActionsTooltip(target as Element, tooltipMessage)}\n @focus=${({ target }: FocusEvent) =>\n showChatActionsTooltip(target as Element, tooltipMessage)}\n ></igc-icon-button>\n `;\n }\n\n // Default rendering logic for attachments\n private _renderAttachments() {\n return isEmpty(this.message?.attachments ?? [])\n ? nothing\n : html`\n <igc-message-attachments\n .message=${this.message}\n ></igc-message-attachments>\n `;\n }\n\n /**\n * Default message template used when no custom template is provided.\n * Renders the message text, sanitized for security.\n * @param message The chat message to render\n * @returns TemplateResult containing the rendered message\n */\n private _renderMessage() {\n return this.message\n ? html`${this._renderHeader()}${this._renderContent()}${this._renderAttachments()}${this._renderActions()}`\n : nothing;\n }\n\n /**\n * Renders the chat message template.\n * - Applies 'sent' CSS class if the message sender matches current user.\n * - Uses markdown rendering if configured.\n * - Renders attachments and custom templates if provided.\n */\n protected override render() {\n if (!this.message) {\n return nothing;\n }\n\n const parts = {\n 'message-container': true,\n sent: this._state.isCurrentUserMessage(this.message),\n };\n\n const options = this._state.options;\n const ctx = {\n param: this.message,\n defaults: this._defaults,\n options,\n };\n\n if (options?.renderers?.message) {\n return html`\n <div part=${partMap(parts)}>\n ${until(options.renderers.message(ctx))}\n </div>\n `;\n }\n\n return html`\n <div part=${partMap(parts)}>\n ${until(this._getRenderer('messageHeader')(ctx))}\n ${until(this._getRenderer('messageContent')(ctx))}\n ${until(this._getRenderer('messageAttachments')(ctx))}\n ${until(this._getRenderer('messageActions')(ctx))}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'igc-chat-message': IgcChatMessageComponent;\n }\n}\n"]}
1
+ {"version":3,"file":"chat-message.js","sourceRoot":"","sources":["../../../src/components/chat/chat-message.ts"],"names":[],"mappings":"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","sourcesContent":["import { consume } from '@lit/context';\nimport { html, LitElement, nothing } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { cache } from 'lit/directives/cache.js';\nimport { until } from 'lit/directives/until.js';\nimport { addThemingController } from '../../theming/theming-controller.js';\nimport IgcIconButtonComponent from '../button/icon-button.js';\nimport { chatContext } from '../common/context.js';\nimport { registerComponent } from '../common/definitions/register.js';\nimport { partMap } from '../common/part-map.js';\nimport { isEmpty, trimmedHtml } from '../common/util.js';\nimport type { ChatState } from './chat-state.js';\nimport IgcMessageAttachmentsComponent from './message-attachments.js';\nimport { styles } from './themes/message.base.css.js';\nimport { all } from './themes/message.js';\nimport { styles as shared } from './themes/shared/chat-message/chat-message.common.css.js';\nimport type {\n ChatMessageRenderContext,\n ChatTemplateRenderer,\n IgcChatMessage,\n} from './types.js';\nimport { chatMessageAdoptPageStyles } from './utils.js';\n\nconst LIKE_INACTIVE = 'thumb_up_inactive';\nconst LIKE_ACTIVE = 'thumb_up_active';\nconst DISLIKE_INACTIVE = 'thumb_down_inactive';\nconst DISLIKE_ACTIVE = 'thumb_down_active';\nconst COPY_CONTENT = 'copy_content';\nconst REGENERATE = 'regenerate';\n\ntype DefaultMessageRenderers = {\n messageHeader: ChatTemplateRenderer<ChatMessageRenderContext>;\n messageContent: ChatTemplateRenderer<ChatMessageRenderContext>;\n messageAttachments: ChatTemplateRenderer<ChatMessageRenderContext>;\n messageActions: ChatTemplateRenderer<ChatMessageRenderContext>;\n};\n\n/* blazorSuppress */\n/**\n * A chat message component for displaying individual messages in `<igc-chat>`.\n *\n * @element igc-chat-message\n *\n *\n * This component renders a single chat message including:\n * - Message text (sanitized)\n * - Attachments (if any)\n * - Custom templates for message content and actions (if provided via chat options)\n *\n * It distinguishes sent messages from received messages by comparing\n * the message sender with the current user ID from chat state.\n *\n * The message text is sanitized with DOMPurify before rendering,\n * and can be rendered with a markdown renderer if provided.\n */\nexport default class IgcChatMessageComponent extends LitElement {\n public static readonly tagName = 'igc-chat-message';\n public static override styles = [styles, shared];\n\n /* blazorSuppress */\n public static register(): void {\n registerComponent(\n IgcChatMessageComponent,\n IgcMessageAttachmentsComponent,\n IgcIconButtonComponent\n );\n }\n\n private readonly _defaults = Object.freeze<DefaultMessageRenderers>({\n messageHeader: () => this._renderHeader(),\n messageContent: () => this._renderContent(),\n messageAttachments: () => this._renderAttachments(),\n messageActions: () => this._renderActions(),\n });\n\n @consume({ context: chatContext, subscribe: true })\n private readonly _state!: ChatState;\n\n /**\n * The chat message to render.\n */\n @property({ attribute: false })\n public message!: IgcChatMessage;\n\n constructor() {\n super();\n addThemingController(this, all);\n }\n\n protected override firstUpdated(): void {\n if (this._state.options?.adoptRootStyles) {\n chatMessageAdoptPageStyles(this);\n }\n }\n\n private _getRenderer(name: keyof DefaultMessageRenderers) {\n return this._state.options?.renderers\n ? (this._state.options.renderers[name] ?? this._defaults[name])\n : this._defaults[name];\n }\n\n private async _handleCopy(): Promise<void> {\n const text = this.message.text;\n const separator = text ? '\\n\\n' : '';\n const attachments = this.message.attachments ?? [];\n const { attachmentLabel, attachmentsListLabel, messageCopied } =\n this._state.resourceStrings!;\n\n const attachmentsText = isEmpty(attachments)\n ? ''\n : attachments\n .map(({ name, url }) => `${name ?? attachmentLabel}: ${url ?? ''}`)\n .join('\\n');\n\n const payload = attachmentsText\n ? `${text}${separator}${attachmentsListLabel}:\\n${attachmentsText}`\n : text;\n\n try {\n await navigator.clipboard.writeText(payload);\n this._state.showActionToast(messageCopied);\n } catch (err) {\n throw new Error(`Failed to copy message: ${err}`);\n }\n }\n\n private _handleMessageActionClick(event: PointerEvent): void {\n const targetButton = event.target as HTMLElement;\n const button = targetButton.closest(IgcIconButtonComponent.tagName);\n\n if (!button) {\n return;\n }\n\n let reaction = button.name;\n\n switch (reaction) {\n case LIKE_INACTIVE:\n case LIKE_ACTIVE:\n reaction = this.message.reactions?.includes(LIKE_ACTIVE)\n ? LIKE_INACTIVE\n : LIKE_ACTIVE;\n break;\n case DISLIKE_INACTIVE:\n case DISLIKE_ACTIVE:\n reaction = this.message.reactions?.includes(DISLIKE_ACTIVE)\n ? DISLIKE_INACTIVE\n : DISLIKE_ACTIVE;\n break;\n case COPY_CONTENT:\n reaction = COPY_CONTENT;\n this._handleCopy();\n break;\n case REGENERATE:\n reaction = REGENERATE;\n break;\n default:\n reaction = '';\n }\n\n this.message.reactions = reaction ? [reaction] : [];\n this._state.emitMessageReaction({ message: this.message, reaction });\n this.requestUpdate();\n }\n\n private _renderHeader() {\n return nothing;\n }\n\n private _renderContent() {\n return html`${this.message.text}`;\n }\n\n private _renderActions() {\n const isSent = this.message.sender === this._state.currentUserId;\n const hasText = this.message.text.trim();\n const hasAttachments = !isEmpty(this.message.attachments ?? []);\n const isTyping = this._state._isTyping;\n const isLastMessage = this.message === this._state.messages.at(-1);\n const resourceStrings = this._state.resourceStrings!;\n\n if (isSent || !(hasText || hasAttachments) || (isLastMessage && isTyping)) {\n return nothing;\n }\n\n return html`\n ${this._renderActionButton(COPY_CONTENT, resourceStrings.reactionCopy)}\n ${this._renderActionButton(\n this.message.reactions?.includes(LIKE_ACTIVE)\n ? LIKE_ACTIVE\n : LIKE_INACTIVE,\n resourceStrings.reactionLike\n )}\n ${this._renderActionButton(\n this.message.reactions?.includes(DISLIKE_ACTIVE)\n ? DISLIKE_ACTIVE\n : DISLIKE_INACTIVE,\n resourceStrings.reactionDislike\n )}\n ${this._renderActionButton(\n REGENERATE,\n resourceStrings.reactionRegenerate\n )}\n `;\n }\n\n private _renderActionButton(name: string, tooltipMessage: string) {\n return html`\n <igc-icon-button\n id=${`${name}-button`}\n name=${name}\n variant=\"flat\"\n @pointerenter=${({ target }: PointerEvent) =>\n this._state.showActionsTooltip(target as Element, tooltipMessage)}\n @focus=${({ target }: FocusEvent) =>\n this._state.showActionsTooltip(target as Element, tooltipMessage)}\n ></igc-icon-button>\n `;\n }\n\n private _renderAttachments() {\n return isEmpty(this.message.attachments ?? [])\n ? nothing\n : html`\n <igc-message-attachments\n .message=${this.message}\n exportparts=\"\n attachment,\n attachment-header,\n attachment-icon,\n file-name,\n attachment-content\"\n ></igc-message-attachments>\n `;\n }\n\n private _renderMessage() {\n const ctx: ChatMessageRenderContext = {\n message: this.message,\n instance: this._state.host,\n };\n\n return trimmedHtml`\n <div part=\"message-header\">\n ${until(this._getRenderer('messageHeader')(ctx))}\n </div>\n <div part=\"plain-text\">\n ${until(this._getRenderer('messageContent')(ctx))}\n </div>\n <div part=\"message-attachments\">\n ${until(this._getRenderer('messageAttachments')(ctx))}\n </div>\n <div part=\"message-actions\" @click=${this._handleMessageActionClick}>\n ${until(this._getRenderer('messageActions')(ctx))}\n </div>\n `;\n }\n\n protected override render() {\n const messageRenderer = this._state.options?.renderers?.message;\n const ctx: ChatMessageRenderContext = {\n message: this.message,\n instance: this._state.host,\n };\n\n const parts = {\n 'message-container': true,\n sent: this._state.isCurrentUserMessage(this.message),\n };\n\n return html`\n ${cache(\n this.message\n ? html`\n <div part=${partMap(parts)}>\n ${cache(\n messageRenderer\n ? until(messageRenderer(ctx))\n : this._renderMessage()\n )}\n </div>\n `\n : nothing\n )}\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'igc-chat-message': IgcChatMessageComponent;\n }\n}\n"]}
@@ -1,7 +1,6 @@
1
- import type IgcTextareaComponent from '../textarea/textarea.js';
2
1
  import type IgcChatComponent from './chat.js';
3
2
  import type { IgcChatComponentEventMap } from './chat.js';
4
- import type { IgcChatOptions, IgcMessage, IgcMessageAttachment } from './types.js';
3
+ import type { ChatSuggestionsPosition, IgcChatMessage, IgcChatMessageAttachment, IgcChatMessageReaction, IgcChatOptions } from './types.js';
5
4
  import { type ChatAcceptedFileTypes } from './utils.js';
6
5
  /**
7
6
  * Internal state manager for the `<igc-chat>` component.
@@ -12,8 +11,8 @@ export declare class ChatState {
12
11
  private readonly _host;
13
12
  private readonly _contextUpdateFn;
14
13
  private readonly _userInputContextUpdateFn;
15
- /** Reference to the text area input component */
16
- private _textArea;
14
+ private _actionsTooltip?;
15
+ private _actionToast?;
17
16
  /** The current list of messages */
18
17
  private _messages;
19
18
  /** Chat options/configuration */
@@ -26,23 +25,20 @@ export declare class ChatState {
26
25
  * Cache of accepted file types, organized into extensions, mimeTypes, and wildcardTypes
27
26
  */
28
27
  private _acceptedTypesCache;
29
- /** Default position of the suggestions */
30
- private _suggestionsPosition;
31
- /** Default time in milliseconds before dispatching stop typing event */
32
- private _stopTypingDelay;
33
28
  _isTyping: boolean;
34
29
  private _lastTyped;
35
30
  resourceStrings: import("../common/i18n/chat.resources.js").IgcChatResourceStrings;
31
+ get host(): IgcChatComponent;
36
32
  get acceptedFileTypes(): ChatAcceptedFileTypes | null;
37
33
  get disableAutoScroll(): boolean;
38
34
  /**
39
35
  * Gets the list of chat messages.
40
36
  */
41
- get messages(): IgcMessage[];
37
+ get messages(): IgcChatMessage[];
42
38
  /**
43
39
  * Sets the list of chat messages.
44
40
  */
45
- set messages(value: IgcMessage[]);
41
+ set messages(value: IgcChatMessage[]);
46
42
  /**
47
43
  * Gets current chat options.
48
44
  */
@@ -58,27 +54,19 @@ export declare class ChatState {
58
54
  /**
59
55
  * Gets the current suggestionsPosition from options or returns the default value 'below-messages'.
60
56
  */
61
- get suggestionsPosition(): string;
57
+ get suggestionsPosition(): ChatSuggestionsPosition;
62
58
  /**
63
59
  * Gets the current stopTypingDelay from options or returns the default value `3000`.
64
60
  */
65
61
  get stopTypingDelay(): number;
66
- /**
67
- * Gets the text area component.
68
- */
69
- get textArea(): IgcTextareaComponent | null;
70
- /**
71
- * Sets the text area component.
72
- */
73
- set textArea(value: IgcTextareaComponent);
74
62
  /**
75
63
  * Gets the list of attachments currently attached to input.
76
64
  */
77
- get inputAttachments(): IgcMessageAttachment[];
65
+ get inputAttachments(): IgcChatMessageAttachment[];
78
66
  /**
79
67
  * Sets the input attachments and requests host update.
80
68
  */
81
- set inputAttachments(value: IgcMessageAttachment[]);
69
+ set inputAttachments(value: IgcChatMessageAttachment[]);
82
70
  /**
83
71
  * Gets the current input value.
84
72
  */
@@ -87,47 +75,54 @@ export declare class ChatState {
87
75
  * Sets the current input value and requests host update.
88
76
  */
89
77
  set inputValue(value: string);
78
+ /**
79
+ * Returns whether the default chat input textarea has a trimmed value payload.
80
+ * @internal
81
+ */
90
82
  get hasInputValue(): boolean;
83
+ /**
84
+ * Returns whether the default file input of the chat has any attached files.
85
+ * @internal
86
+ */
91
87
  get hasInputAttachments(): boolean;
92
88
  constructor(chat: IgcChatComponent, contextUpdateFn: () => unknown, userInputContextUpdateFn: () => unknown);
93
- isCurrentUserMessage(message?: IgcMessage): boolean;
89
+ isCurrentUserMessage(message?: IgcChatMessage): boolean;
94
90
  emitEvent(name: keyof IgcChatComponentEventMap, args?: any): boolean;
91
+ /** @internal */
92
+ emitMessageCreated(message: IgcChatMessage): boolean;
93
+ /** @internal */
94
+ emitAttachmentsAdded(attachments: IgcChatMessageAttachment[]): boolean;
95
+ /** @internal */
96
+ emitAttachmentRemoved(attachment: IgcChatMessageAttachment): boolean;
97
+ /** @internal */
98
+ emitMessageReaction(reaction: IgcChatMessageReaction): boolean;
95
99
  /**
96
- * Adds a new chat message.
97
- * Emits 'igcMessageCreated' event which can be canceled to prevent adding.
98
- * Clears input value and attachments on success.
99
- * @param message Partial message object with optional id, sender, timestamp
100
- */
101
- addMessage(message: Partial<IgcMessage>): void;
102
- /**
103
- * Adds files as attachments to the input.
104
- * Emits 'igcAttachmentChange' event which can be canceled to prevent adding.
105
- * @param files Array of File objects to attach
100
+ * @internal
106
101
  */
107
- attachFiles(files: File[]): void;
108
- isImageAttachment(attachment: IgcMessageAttachment): boolean;
109
- handleKeyDown: (e: KeyboardEvent) => void;
110
- sendMessage: () => void;
102
+ showActionsTooltip(target: Element, message: string): void;
111
103
  /**
112
- * Removes an attachment by index.
113
- * Emits 'igcAttachmentChange' event which can be canceled to prevent removal.
114
- * @param index Index of the attachment to remove
104
+ * @internal
115
105
  */
116
- removeAttachment: (index: number) => void;
106
+ showActionToast(content: string): void;
117
107
  /**
118
- * Handles when a suggestion is clicked.
119
- * Adds the suggestion as a new message and focuses the text area.
120
- * @param suggestion The suggestion string clicked
108
+ * Updates the internal cache for accepted file types.
109
+ * Parses the acceptedFiles string option into extensions, mimeTypes, and wildcard types.
121
110
  */
122
- handleSuggestionClick: (suggestion: string) => void;
111
+ private _setAcceptedTypesCache;
112
+ protected _createMessage(message: Partial<IgcChatMessage>): IgcChatMessage;
113
+ addMessage(message: Partial<IgcChatMessage>): void;
123
114
  /**
124
- * Updates the chat options partially.
125
- * @param options Partial options to merge with current options
115
+ * Adds a new chat message.
116
+ * Emits 'igcMessageCreated' event which can be canceled to prevent adding.
117
+ * Clears input value and attachments on success.
118
+ * @internal
126
119
  */
127
- updateOptions(options: Partial<IgcChatOptions>): void;
120
+ addMessageWithEvent(message: Partial<IgcChatMessage>): void;
128
121
  /**
129
- * Updates the internal cache for accepted file types.
130
- * Parses the acceptedFiles string option into extensions, mimeTypes, and wildcard types.
122
+ * Adds files as attachments to the input.
123
+ * Emits 'igcAttachmentChange' event which can be canceled to prevent adding.
124
+ * @internal
131
125
  */
132
- updateAcceptedTypesCache(): void;
126
+ attachFilesWithEvent(files: File[]): void;
127
+ handleKeyDown: (_: KeyboardEvent) => void;
133
128
  }