@tencentcloud/ai-desk-customer-vue 0.1.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 (351) hide show
  1. package/.code.yml +17 -0
  2. package/.eslintignore +6 -0
  3. package/.stylelintrc.json +40 -0
  4. package/CHANGELOG.md +5 -0
  5. package/README.md +12 -0
  6. package/adapter-vue-web.ts +73 -0
  7. package/adapter-vue.ts +10 -0
  8. package/assets/audio-before-delete.svg +4 -0
  9. package/assets/audio-blue.png +0 -0
  10. package/assets/audio-bubble-blue.svg +3 -0
  11. package/assets/audio-bubble-red.svg +3 -0
  12. package/assets/audio-delete.svg +10 -0
  13. package/assets/audio.svg +6 -0
  14. package/assets/back.svg +16 -0
  15. package/assets/background_mobile.png +0 -0
  16. package/assets/camera-uni.png +0 -0
  17. package/assets/close-quote-icon.svg +3 -0
  18. package/assets/customer_avatar.png +0 -0
  19. package/assets/customer_avatar_mobile.png +0 -0
  20. package/assets/dialog-close.png +0 -0
  21. package/assets/double-arrow.svg +1 -0
  22. package/assets/download.svg +6 -0
  23. package/assets/emoji.png +0 -0
  24. package/assets/face-uni.png +0 -0
  25. package/assets/face.png +0 -0
  26. package/assets/file-h5.png +0 -0
  27. package/assets/files.png +0 -0
  28. package/assets/form-dialog-bg.png +0 -0
  29. package/assets/icon-arrow-left.svg +7 -0
  30. package/assets/icon-close.svg +6 -0
  31. package/assets/iconRight.svg +3 -0
  32. package/assets/icon_form.png +0 -0
  33. package/assets/icon_form_filled.png +0 -0
  34. package/assets/icon_question.png +0 -0
  35. package/assets/icon_refresh.png +0 -0
  36. package/assets/icon_success.png +0 -0
  37. package/assets/imRobotGuess.svg +4 -0
  38. package/assets/image-uni.png +0 -0
  39. package/assets/image.png +0 -0
  40. package/assets/keyboard_icon.png +0 -0
  41. package/assets/loading.png +0 -0
  42. package/assets/more-uni.png +0 -0
  43. package/assets/more_tools.png +0 -0
  44. package/assets/msg-audio.svg +1 -0
  45. package/assets/msg-copy.svg +30 -0
  46. package/assets/msg-del.svg +33 -0
  47. package/assets/msg-quote.svg +8 -0
  48. package/assets/msg-revoke.svg +29 -0
  49. package/assets/radio-check.png +0 -0
  50. package/assets/radio-uncheck.png +0 -0
  51. package/assets/radio.svg +6 -0
  52. package/assets/refresh.svg +4 -0
  53. package/assets/rotate-left.svg +7 -0
  54. package/assets/rotate-right.svg +7 -0
  55. package/assets/star.png +0 -0
  56. package/assets/starLine.png +0 -0
  57. package/assets/translate.svg +12 -0
  58. package/assets/video-play.png +0 -0
  59. package/assets/video-uni.png +0 -0
  60. package/assets/video.png +0 -0
  61. package/assets/zoom-in.svg +9 -0
  62. package/assets/zoom-out.svg +9 -0
  63. package/components/CustomerServiceChat/chat-header/index-web.vue +141 -0
  64. package/components/CustomerServiceChat/emoji-config/custom-emoji.ts +15 -0
  65. package/components/CustomerServiceChat/emoji-config/default-emoji.ts +114 -0
  66. package/components/CustomerServiceChat/emoji-config/index.ts +140 -0
  67. package/components/CustomerServiceChat/emoji-config/locales/en.ts +66 -0
  68. package/components/CustomerServiceChat/emoji-config/locales/zh_cn.ts +66 -0
  69. package/components/CustomerServiceChat/index-web.vue +250 -0
  70. package/components/CustomerServiceChat/message-input/index-web.vue +214 -0
  71. package/components/CustomerServiceChat/message-input/index.ts +2 -0
  72. package/components/CustomerServiceChat/message-input/message-input-button.vue +95 -0
  73. package/components/CustomerServiceChat/message-input/message-input-editor-web.vue +884 -0
  74. package/components/CustomerServiceChat/message-input/message-input-file-web.ts +38 -0
  75. package/components/CustomerServiceChat/message-input/message-input-quote/index.vue +204 -0
  76. package/components/CustomerServiceChat/message-input-toolbar/emoji-dialog-mobile/emoji-dialog-mobile.vue +145 -0
  77. package/components/CustomerServiceChat/message-input-toolbar/emoji-picker/emoji-picker-dialog.vue +180 -0
  78. package/components/CustomerServiceChat/message-input-toolbar/emoji-picker/index.ts +2 -0
  79. package/components/CustomerServiceChat/message-input-toolbar/emoji-picker/index.vue +90 -0
  80. package/components/CustomerServiceChat/message-input-toolbar/emoji-picker/style/h5.scss +26 -0
  81. package/components/CustomerServiceChat/message-input-toolbar/emoji-picker/style/index.scss +4 -0
  82. package/components/CustomerServiceChat/message-input-toolbar/emoji-picker/style/web.scss +55 -0
  83. package/components/CustomerServiceChat/message-input-toolbar/file-upload/index.ts +2 -0
  84. package/components/CustomerServiceChat/message-input-toolbar/file-upload/index.vue +77 -0
  85. package/components/CustomerServiceChat/message-input-toolbar/image-upload/index.ts +2 -0
  86. package/components/CustomerServiceChat/message-input-toolbar/image-upload/index.vue +185 -0
  87. package/components/CustomerServiceChat/message-input-toolbar/index-web.vue +191 -0
  88. package/components/CustomerServiceChat/message-input-toolbar/index.ts +2 -0
  89. package/components/CustomerServiceChat/message-input-toolbar/style/uni.scss +111 -0
  90. package/components/CustomerServiceChat/message-input-toolbar/toolbar-item-container/index.vue +149 -0
  91. package/components/CustomerServiceChat/message-input-toolbar/toolbar-item-container/style/color.scss +6 -0
  92. package/components/CustomerServiceChat/message-input-toolbar/toolbar-item-container/style/h5.scss +20 -0
  93. package/components/CustomerServiceChat/message-input-toolbar/toolbar-item-container/style/index.scss +5 -0
  94. package/components/CustomerServiceChat/message-input-toolbar/toolbar-item-container/style/uni.scss +36 -0
  95. package/components/CustomerServiceChat/message-input-toolbar/toolbar-item-container/style/web.scss +19 -0
  96. package/components/CustomerServiceChat/message-input-toolbar/video-upload/index.ts +2 -0
  97. package/components/CustomerServiceChat/message-input-toolbar/video-upload/index.vue +146 -0
  98. package/components/CustomerServiceChat/message-list/index-web.vue +712 -0
  99. package/components/CustomerServiceChat/message-list/link/index.ts +23 -0
  100. package/components/CustomerServiceChat/message-list/message-elements/message-audio-web.vue +223 -0
  101. package/components/CustomerServiceChat/message-list/message-elements/message-bubble-web.vue +504 -0
  102. package/components/CustomerServiceChat/message-list/message-elements/message-custom.vue +5 -0
  103. package/components/CustomerServiceChat/message-list/message-elements/message-face.vue +45 -0
  104. package/components/CustomerServiceChat/message-list/message-elements/message-file.vue +151 -0
  105. package/components/CustomerServiceChat/message-list/message-elements/message-image-web.vue +97 -0
  106. package/components/CustomerServiceChat/message-list/message-elements/message-location.vue +34 -0
  107. package/components/CustomerServiceChat/message-list/message-elements/message-quote/index-web.vue +286 -0
  108. package/components/CustomerServiceChat/message-list/message-elements/message-quote/interface.ts +60 -0
  109. package/components/CustomerServiceChat/message-list/message-elements/message-record/index.vue +139 -0
  110. package/components/CustomerServiceChat/message-list/message-elements/message-text.vue +94 -0
  111. package/components/CustomerServiceChat/message-list/message-elements/message-timestamp.vue +76 -0
  112. package/components/CustomerServiceChat/message-list/message-elements/message-video-web.vue +319 -0
  113. package/components/CustomerServiceChat/message-list/message-elements/plugins/plugin-components/index.ts +9 -0
  114. package/components/CustomerServiceChat/message-list/message-elements/plugins/plugin-components/message-customer/index.ts +5 -0
  115. package/components/CustomerServiceChat/message-list/message-elements/plugins/plugin-components/message-customer/message-customer-service.vue +22 -0
  116. package/components/CustomerServiceChat/message-list/message-elements/plugins/plugin-components/message-plugin-layout-web.vue +133 -0
  117. package/components/CustomerServiceChat/message-list/message-elements/plugins/plugin-components/message-plugin-web.vue +83 -0
  118. package/components/CustomerServiceChat/message-list/message-elements/read-status/index.vue +193 -0
  119. package/components/CustomerServiceChat/message-list/message-elements/simple-message-list/index.vue +462 -0
  120. package/components/CustomerServiceChat/message-list/message-elements/simple-message-list/message-container.vue +105 -0
  121. package/components/CustomerServiceChat/message-list/message-elements/video-play.vue +59 -0
  122. package/components/CustomerServiceChat/message-list/message-tool/index-web.vue +312 -0
  123. package/components/CustomerServiceChat/message-list/message-tool/message-revoked.vue +63 -0
  124. package/components/CustomerServiceChat/message-list/scroll-button/index.vue +201 -0
  125. package/components/CustomerServiceChat/message-list/style/color.scss +32 -0
  126. package/components/CustomerServiceChat/message-list/style/h5.scss +16 -0
  127. package/components/CustomerServiceChat/message-list/style/index.scss +11 -0
  128. package/components/CustomerServiceChat/message-list/style/web.scss +180 -0
  129. package/components/CustomerServiceChat/style/common.scss +59 -0
  130. package/components/CustomerServiceChat/style/h5.scss +51 -0
  131. package/components/CustomerServiceChat/style/index.scss +12 -0
  132. package/components/CustomerServiceChat/style/uni.scss +13 -0
  133. package/components/CustomerServiceChat/style/web.scss +46 -0
  134. package/components/CustomerServiceChat/style/wx.scss +5 -0
  135. package/components/CustomerServiceChat/utils/conversationDraft.ts +86 -0
  136. package/components/CustomerServiceChat/utils/sendMessage.ts +140 -0
  137. package/components/common/Avatar/index.vue +148 -0
  138. package/components/common/BottomPopup/index.ts +3 -0
  139. package/components/common/BottomPopup/index.vue +160 -0
  140. package/components/common/BottomPopup/style/h5.scss +62 -0
  141. package/components/common/BottomPopup/style/index.scss +3 -0
  142. package/components/common/BottomPopup/style/modal.scss +5 -0
  143. package/components/common/Dialog/index.ts +3 -0
  144. package/components/common/Dialog/index.vue +120 -0
  145. package/components/common/Dialog/style/color.scss +43 -0
  146. package/components/common/Dialog/style/dialog.scss +4 -0
  147. package/components/common/Dialog/style/h5.scss +56 -0
  148. package/components/common/Dialog/style/web.scss +61 -0
  149. package/components/common/Drawer/index.vue +164 -0
  150. package/components/common/Icon.vue +83 -0
  151. package/components/common/ImagePreviewer/image-item-web.vue +42 -0
  152. package/components/common/ImagePreviewer/index-web.vue +682 -0
  153. package/components/common/ImagePreviewer/index.ts +3 -0
  154. package/components/common/Overlay/index.vue +126 -0
  155. package/components/common/ProgressMessage/index.vue +95 -0
  156. package/components/common/RadioSelect/index.vue +59 -0
  157. package/components/common/RichText/LICENSE +21 -0
  158. package/components/common/RichText/README.md +244 -0
  159. package/components/common/RichText/dist/mp-alipay/index.acss +1 -0
  160. package/components/common/RichText/dist/mp-alipay/index.axml +1 -0
  161. package/components/common/RichText/dist/mp-alipay/index.js +8 -0
  162. package/components/common/RichText/dist/mp-alipay/index.json +1 -0
  163. package/components/common/RichText/dist/mp-alipay/node/node.acss +1 -0
  164. package/components/common/RichText/dist/mp-alipay/node/node.axml +1 -0
  165. package/components/common/RichText/dist/mp-alipay/node/node.js +1 -0
  166. package/components/common/RichText/dist/mp-alipay/node/node.json +1 -0
  167. package/components/common/RichText/dist/mp-alipay/parser.js +1 -0
  168. package/components/common/RichText/dist/mp-baidu/index.css +1 -0
  169. package/components/common/RichText/dist/mp-baidu/index.js +8 -0
  170. package/components/common/RichText/dist/mp-baidu/index.json +1 -0
  171. package/components/common/RichText/dist/mp-baidu/index.swan +1 -0
  172. package/components/common/RichText/dist/mp-baidu/node/node.css +1 -0
  173. package/components/common/RichText/dist/mp-baidu/node/node.js +1 -0
  174. package/components/common/RichText/dist/mp-baidu/node/node.json +1 -0
  175. package/components/common/RichText/dist/mp-baidu/node/node.swan +1 -0
  176. package/components/common/RichText/dist/mp-baidu/parser.js +1 -0
  177. package/components/common/RichText/dist/mp-qq/index.js +8 -0
  178. package/components/common/RichText/dist/mp-qq/index.json +1 -0
  179. package/components/common/RichText/dist/mp-qq/index.qml +1 -0
  180. package/components/common/RichText/dist/mp-qq/index.qss +1 -0
  181. package/components/common/RichText/dist/mp-qq/node/node.js +1 -0
  182. package/components/common/RichText/dist/mp-qq/node/node.json +1 -0
  183. package/components/common/RichText/dist/mp-qq/node/node.qml +1 -0
  184. package/components/common/RichText/dist/mp-qq/node/node.qss +1 -0
  185. package/components/common/RichText/dist/mp-qq/parser.js +1 -0
  186. package/components/common/RichText/dist/mp-toutiao/index.js +8 -0
  187. package/components/common/RichText/dist/mp-toutiao/index.json +1 -0
  188. package/components/common/RichText/dist/mp-toutiao/index.ttml +1 -0
  189. package/components/common/RichText/dist/mp-toutiao/index.ttss +1 -0
  190. package/components/common/RichText/dist/mp-toutiao/node/node.js +1 -0
  191. package/components/common/RichText/dist/mp-toutiao/node/node.json +1 -0
  192. package/components/common/RichText/dist/mp-toutiao/node/node.ttml +1 -0
  193. package/components/common/RichText/dist/mp-toutiao/node/node.ttss +1 -0
  194. package/components/common/RichText/dist/mp-toutiao/parser.js +1 -0
  195. package/components/common/RichText/dist/mp-weixin/index.js +8 -0
  196. package/components/common/RichText/dist/mp-weixin/index.json +1 -0
  197. package/components/common/RichText/dist/mp-weixin/index.wxml +1 -0
  198. package/components/common/RichText/dist/mp-weixin/index.wxss +1 -0
  199. package/components/common/RichText/dist/mp-weixin/node/node.js +1 -0
  200. package/components/common/RichText/dist/mp-weixin/node/node.json +1 -0
  201. package/components/common/RichText/dist/mp-weixin/node/node.wxml +1 -0
  202. package/components/common/RichText/dist/mp-weixin/node/node.wxss +1 -0
  203. package/components/common/RichText/dist/mp-weixin/parser.js +1 -0
  204. package/components/common/RichText/dist/uni-app/components/mp-html/mp-html.vue +498 -0
  205. package/components/common/RichText/dist/uni-app/components/mp-html/node/node.vue +587 -0
  206. package/components/common/RichText/dist/uni-app/components/mp-html/parser.js +1393 -0
  207. package/components/common/RichText/dist/uni-app/static/app-plus/mp-html/js/handler.js +1 -0
  208. package/components/common/RichText/dist/uni-app/static/app-plus/mp-html/js/uni.webview.min.js +1 -0
  209. package/components/common/RichText/dist/uni-app/static/app-plus/mp-html/local.html +1 -0
  210. package/components/common/RichText/docs/.nojekyll +0 -0
  211. package/components/common/RichText/docs/index.html +50 -0
  212. package/components/common/RichText/docs/lib/docsify.min.js +1 -0
  213. package/components/common/RichText/docs/lib/prism-bash.min.js +1 -0
  214. package/components/common/RichText/docs/lib/search.min.js +1 -0
  215. package/components/common/RichText/docs/lib/vue.css +858 -0
  216. package/components/common/RichText/gulpfile.js +113 -0
  217. package/components/common/RichText/lint.js +63 -0
  218. package/components/common/RichText/package.json +74 -0
  219. package/components/common/RichText/plugins/README.md +2 -0
  220. package/components/common/RichText/plugins/audio/README.md +25 -0
  221. package/components/common/RichText/plugins/audio/build.js +11 -0
  222. package/components/common/RichText/plugins/audio/context.js +7 -0
  223. package/components/common/RichText/plugins/audio/index.js +34 -0
  224. package/components/common/RichText/plugins/audio/miniprogram/audio.js +189 -0
  225. package/components/common/RichText/plugins/audio/miniprogram/audio.json +3 -0
  226. package/components/common/RichText/plugins/audio/miniprogram/audio.wxml +17 -0
  227. package/components/common/RichText/plugins/audio/miniprogram/audio.wxss +127 -0
  228. package/components/common/RichText/plugins/audio/miniprogram/build.js +3 -0
  229. package/components/common/RichText/plugins/audio/uni-app/audio.vue +269 -0
  230. package/components/common/RichText/plugins/audio/uni-app/build.js +3 -0
  231. package/components/common/RichText/plugins/card/README.md +30 -0
  232. package/components/common/RichText/plugins/card/build.js +14 -0
  233. package/components/common/RichText/plugins/card/index.js +7 -0
  234. package/components/common/RichText/plugins/card/miniprogram/build.js +3 -0
  235. package/components/common/RichText/plugins/card/miniprogram/card.js +26 -0
  236. package/components/common/RichText/plugins/card/miniprogram/card.json +3 -0
  237. package/components/common/RichText/plugins/card/miniprogram/card.wxml +9 -0
  238. package/components/common/RichText/plugins/card/miniprogram/card.wxss +55 -0
  239. package/components/common/RichText/plugins/card/uni-app/build.js +3 -0
  240. package/components/common/RichText/plugins/card/uni-app/card.vue +122 -0
  241. package/components/common/RichText/plugins/editable/README.md +137 -0
  242. package/components/common/RichText/plugins/editable/config.js +15 -0
  243. package/components/common/RichText/plugins/editable/miniprogram/build.js +813 -0
  244. package/components/common/RichText/plugins/editable/miniprogram/index.js +551 -0
  245. package/components/common/RichText/plugins/editable/uni-app/build.js +744 -0
  246. package/components/common/RichText/plugins/editable/uni-app/index.js +553 -0
  247. package/components/common/RichText/plugins/emoji/README.md +15 -0
  248. package/components/common/RichText/plugins/emoji/index.js +203 -0
  249. package/components/common/RichText/plugins/highlight/README.md +26 -0
  250. package/components/common/RichText/plugins/highlight/config.js +5 -0
  251. package/components/common/RichText/plugins/highlight/index.js +96 -0
  252. package/components/common/RichText/plugins/highlight/miniprogram/build.js +88 -0
  253. package/components/common/RichText/plugins/highlight/prism.css +125 -0
  254. package/components/common/RichText/plugins/highlight/prism.min.js +7 -0
  255. package/components/common/RichText/plugins/highlight/uni-app/build.js +88 -0
  256. package/components/common/RichText/plugins/img-cache/README.md +24 -0
  257. package/components/common/RichText/plugins/img-cache/build.js +16 -0
  258. package/components/common/RichText/plugins/img-cache/index.js +138 -0
  259. package/components/common/RichText/plugins/latex/README.md +16 -0
  260. package/components/common/RichText/plugins/latex/build.js +14 -0
  261. package/components/common/RichText/plugins/latex/index.js +77 -0
  262. package/components/common/RichText/plugins/latex/katex.css +1070 -0
  263. package/components/common/RichText/plugins/latex/katex.min.js +1 -0
  264. package/components/common/RichText/plugins/markdown/README.md +17 -0
  265. package/components/common/RichText/plugins/markdown/index.js +34 -0
  266. package/components/common/RichText/plugins/markdown/marked.min.js +6 -0
  267. package/components/common/RichText/plugins/markdown/miniprogram/build.js +70 -0
  268. package/components/common/RichText/plugins/markdown/uni-app/build.js +68 -0
  269. package/components/common/RichText/plugins/search/README.md +46 -0
  270. package/components/common/RichText/plugins/search/miniprogram/index.js +137 -0
  271. package/components/common/RichText/plugins/search/uni-app/index.js +132 -0
  272. package/components/common/RichText/plugins/style/README.md +30 -0
  273. package/components/common/RichText/plugins/style/index.js +129 -0
  274. package/components/common/RichText/plugins/style/parser.js +175 -0
  275. package/components/common/RichText/plugins/template/README.md +2 -0
  276. package/components/common/RichText/plugins/template/build.js +65 -0
  277. package/components/common/RichText/plugins/template/index.js +67 -0
  278. package/components/common/RichText/plugins/txv-video/README.md +18 -0
  279. package/components/common/RichText/plugins/txv-video/build.js +3 -0
  280. package/components/common/RichText/plugins/txv-video/index.js +46 -0
  281. package/components/common/RichText/plugins/txv-video/miniprogram/build.js +6 -0
  282. package/components/common/RichText/plugins/txv-video/uni-app/build.js +3 -0
  283. package/components/common/RichText/src/miniprogram/index.js +396 -0
  284. package/components/common/RichText/src/miniprogram/index.json +6 -0
  285. package/components/common/RichText/src/miniprogram/index.wxml +7 -0
  286. package/components/common/RichText/src/miniprogram/index.wxss +13 -0
  287. package/components/common/RichText/src/miniprogram/node/node.js +247 -0
  288. package/components/common/RichText/src/miniprogram/node/node.json +6 -0
  289. package/components/common/RichText/src/miniprogram/node/node.wxml +112 -0
  290. package/components/common/RichText/src/miniprogram/node/node.wxss +164 -0
  291. package/components/common/RichText/src/miniprogram/parser.js +1269 -0
  292. package/components/common/RichText/src/uni-app/components/mp-html/mp-html.vue +498 -0
  293. package/components/common/RichText/src/uni-app/components/mp-html/node/node.vue +585 -0
  294. package/components/common/RichText/src/uni-app/components/mp-html/parser.js +1393 -0
  295. package/components/common/RichText/src/uni-app/static/app-plus/mp-html/js/handler.js +254 -0
  296. package/components/common/RichText/src/uni-app/static/app-plus/mp-html/js/uni.webview.min.js +1 -0
  297. package/components/common/RichText/src/uni-app/static/app-plus/mp-html/local.html +33 -0
  298. package/components/common/RichText/tools/config.js +82 -0
  299. package/components/common/RichText/tools/converter.js +205 -0
  300. package/components/common/RichText/tools/ifdef.js +115 -0
  301. package/components/common/RichText/tools/minifier.js +40 -0
  302. package/components/common/RichText/tools/plugin.js +248 -0
  303. package/components/common/Toast/index-web.ts +122 -0
  304. package/components/common/Toast/index-web.vue +178 -0
  305. package/components/common/Toast/type.ts +8 -0
  306. package/components/common/common.scss +59 -0
  307. package/components/customer-icon.vue +56 -0
  308. package/components/message-branch.vue +120 -0
  309. package/components/message-customer-service.vue +114 -0
  310. package/components/message-form/form-branch.vue +68 -0
  311. package/components/message-form/form-input.vue +242 -0
  312. package/components/message-form/index.vue +80 -0
  313. package/components/message-multi-branch/branch-pc.vue +79 -0
  314. package/components/message-multi-branch/index.vue +60 -0
  315. package/components/message-multi-form/component-mobile/form-popup.vue +37 -0
  316. package/components/message-multi-form/component-mobile/input-mobile.vue +102 -0
  317. package/components/message-multi-form/component-mobile/label-mobile.vue +32 -0
  318. package/components/message-multi-form/component-mobile/radios-mobile.vue +161 -0
  319. package/components/message-multi-form/component-pc/input-pc.vue +93 -0
  320. package/components/message-multi-form/component-pc/label-pc.vue +33 -0
  321. package/components/message-multi-form/component-pc/radio-pc.vue +98 -0
  322. package/components/message-multi-form/form-mobile.vue +385 -0
  323. package/components/message-multi-form/form-pc.vue +184 -0
  324. package/components/message-multi-form/index.vue +61 -0
  325. package/components/message-product-card.vue +129 -0
  326. package/components/message-rating/index.vue +56 -0
  327. package/components/message-rating/message-rating-number.vue +247 -0
  328. package/components/message-rating/message-rating-star.vue +237 -0
  329. package/components/message-rich-text.vue +155 -0
  330. package/components/message-robot-welcome.vue +181 -0
  331. package/components/message-stream.vue +109 -0
  332. package/constant.ts +122 -0
  333. package/excluded-list.txt +6 -0
  334. package/index.ts +30 -0
  335. package/index.vue +60 -0
  336. package/interface.ts +176 -0
  337. package/logger/index.ts +12 -0
  338. package/logger/main.ts +120 -0
  339. package/package.json +62 -0
  340. package/script/fileCopy.js +60 -0
  341. package/script/syncVersion.js +35 -0
  342. package/server.ts +128 -0
  343. package/styles/common.scss +116 -0
  344. package/tsconfig.json +34 -0
  345. package/typings.d.ts +20 -0
  346. package/utils/chatStorage.ts +70 -0
  347. package/utils/copy-web.ts +141 -0
  348. package/utils/enableSampleTaskStatus.ts +8 -0
  349. package/utils/env.ts +15 -0
  350. package/utils/index.ts +59 -0
  351. package/utils/utils.ts +162 -0
@@ -0,0 +1,97 @@
1
+ <template>
2
+ <div
3
+ ref="skeletonDomRef"
4
+ class="image-container"
5
+ @click.self="toggleShow"
6
+ >
7
+ <img
8
+ :class="['message-image', !isPC && 'message-image-h5']"
9
+ :src="props.content.url"
10
+ :width="props.content.width"
11
+ :height="props.content.height"
12
+ >
13
+ </div>
14
+ </template>
15
+
16
+ <script lang="ts" setup>
17
+ import vue from '../../../../adapter-vue';
18
+ import { IMessageModel } from '@tencentcloud/chat-uikit-engine';
19
+ import { isPC } from '../../../../utils/env';
20
+ import { handleSkeletonSize } from '../../../../utils/utils';
21
+ import type { IImageMessageContent } from '../../../../interface';
22
+ const { ref, watch, onMounted, withDefaults } = vue;
23
+
24
+ const emits = defineEmits(['previewImage']);
25
+ const props = withDefaults(
26
+ defineProps<{
27
+ content: IImageMessageContent;
28
+ messageItem: IMessageModel;
29
+ }>(),
30
+ {
31
+ content: () => ({}),
32
+ messageItem: () => ({} as IMessageModel),
33
+ },
34
+ );
35
+ const skeletonDomRef = ref();
36
+
37
+ onMounted(() => {
38
+ if (
39
+ props.messageItem?.status === 'success'
40
+ || props.messageItem?.status === 'fail'
41
+ || props.messageItem?.progress === 1
42
+ ) {
43
+ autoFixSkeletonSize();
44
+ }
45
+ });
46
+
47
+ watch(
48
+ () => props.content.height,
49
+ (newVal: number, oldVal: number) => {
50
+ if (newVal > oldVal) {
51
+ autoFixSkeletonSize();
52
+ }
53
+ },
54
+ );
55
+
56
+ function autoFixSkeletonSize() {
57
+ const { width = 0, height = 0 } = props.content;
58
+ if (width === 0 || height === 0) return;
59
+ const containerWidth = document.getElementById('app')?.clientWidth || 0;
60
+ const max = !isPC ? Math.min(containerWidth - 180, 300) : 300;
61
+ const size = handleSkeletonSize(width, height, max, max);
62
+ skeletonDomRef?.value?.style
63
+ && (skeletonDomRef.value.style.width = `${size.width}px`);
64
+ skeletonDomRef?.value?.style
65
+ && (skeletonDomRef.value.style.height = `${size.height}px`);
66
+ }
67
+
68
+ function toggleShow() {
69
+ if (
70
+ props.messageItem?.status === 'success'
71
+ || props.messageItem?.progress === 1
72
+ ) {
73
+ emits('previewImage', props.messageItem);
74
+ }
75
+ }
76
+ </script>
77
+
78
+ <style lang="scss" scoped>
79
+ @import "../../style/common";
80
+
81
+ .image-container {
82
+ overflow: hidden;
83
+ background-color: #f4f4f4;
84
+
85
+ .message-image {
86
+ max-width: min(calc(100vw - 180px), 300px);
87
+ max-height: min(calc(100vw - 180px), 300px);
88
+ width: inherit;
89
+ height: inherit;
90
+
91
+ &-h5 {
92
+ max-width: calc(100vw - 180px);
93
+ max-height: calc(100vw - 180px);
94
+ }
95
+ }
96
+ }
97
+ </style>
@@ -0,0 +1,34 @@
1
+ <template>
2
+ <a
3
+ class="message-location"
4
+ :href="data.href"
5
+ target="_blank"
6
+ title="点击查看详情"
7
+ >
8
+ <span class="el-icon-location-outline">{{ data.description }}</span>
9
+ <img :src="data.url">
10
+ </a>
11
+ </template>
12
+
13
+ <script lang="ts" setup>
14
+ import vue from '../../../../adapter-vue';
15
+ const { watchEffect, ref } = vue;
16
+ const props = defineProps({
17
+ content: {
18
+ type: Object,
19
+ default: () => ({}),
20
+ },
21
+ });
22
+ const data = ref();
23
+ watchEffect(() => {
24
+ data.value = props.content;
25
+ });
26
+ </script>
27
+ <style lang="scss" scoped>
28
+ @import "../../style/common";
29
+
30
+ .message-location {
31
+ display: flex;
32
+ flex-direction: column;
33
+ }
34
+ </style>
@@ -0,0 +1,286 @@
1
+ <template>
2
+ <div style="display:flex;width: fit-content;">
3
+ <div v-if="hasQuoteContent&&isH5" :class="{
4
+ 'mobile-left-box': true,
5
+ reverse: message.flow === 'out',
6
+ in:message.flow === 'in',
7
+ }"></div>
8
+ <div
9
+ v-if="hasQuoteContent"
10
+ :class="{
11
+ 'reference-content': true,
12
+ reverse: message.flow === 'out',
13
+ in:message.flow === 'in',
14
+ isMobile: isH5,
15
+ isPc: isPC,
16
+ }"
17
+ @click="scrollToOriginalMessage"
18
+ >
19
+
20
+ <div
21
+ v-if="isMessageRevoked"
22
+ class="revoked-text"
23
+ >
24
+ {{ TUITranslateService.t("TUIChat.引用内容已撤回") }}
25
+ </div>
26
+ <div v-else>
27
+ <div v-if="isH5" class="mobile-quote-sender">
28
+ {{ messageQuoteContent.messageSender }}
29
+ </div>
30
+ <div
31
+ class="max-double-line"
32
+ >
33
+ {{ isPC ? messageQuoteContent.messageSender + ": "+ transformTextWithKeysToEmojiNames(messageQuoteText) : transformTextWithKeysToEmojiNames(messageQuoteText)}}
34
+ </div>
35
+ </div>
36
+
37
+ </div>
38
+ </div>
39
+
40
+ </template>
41
+
42
+ <script lang="ts" setup>
43
+ import vue from '../../../../../adapter-vue';
44
+ import {
45
+ TUIStore,
46
+ StoreName,
47
+ IMessageModel,
48
+ TUITranslateService,
49
+ } from '@tencentcloud/chat-uikit-engine';
50
+ import {
51
+ getBoundingClientRect,
52
+ getScrollInfo,
53
+ } from '@tencentcloud/universal-api';
54
+ import { isUniFrameWork,isH5,isPC } from '../../../../../utils/env';
55
+ import {
56
+ Toast,
57
+ TOAST_TYPE,
58
+ } from '../../../../../components/common/Toast/index-web';
59
+ import {
60
+ ICloudCustomData,
61
+ IQuoteContent,
62
+ MessageQuoteTypeEnum,
63
+ } from './interface.ts';
64
+ import { transformTextWithKeysToEmojiNames } from '../../../emoji-config';
65
+ const { computed, ref, onMounted } = vue;
66
+
67
+ export interface IProps {
68
+ message: IMessageModel;
69
+ }
70
+
71
+ export interface IEmits {
72
+ (e: 'scrollTo', scrollHeight: number): void;
73
+ (e: 'blinkMessage', messageID: string | undefined): void;
74
+ }
75
+
76
+ const emits = defineEmits<IEmits>();
77
+ const props = withDefaults(defineProps<IProps>(), {
78
+ message: () => ({} as IMessageModel),
79
+ });
80
+
81
+ let selfAddValue = 0;
82
+ const messageQuoteText = ref<string>('');
83
+ const hasQuoteContent = ref(false);
84
+ const messageQuoteContent = ref<IQuoteContent>({} as IQuoteContent);
85
+
86
+ const isMessageRevoked = computed<boolean>(() => {
87
+ try {
88
+ const cloudCustomData: ICloudCustomData = JSON.parse(
89
+ props.message?.cloudCustomData || '{}',
90
+ );
91
+ const quotedMessageModel = TUIStore.getMessageModel(
92
+ cloudCustomData.messageReply.messageID,
93
+ );
94
+ return quotedMessageModel?.isRevoked;
95
+ } catch (error) {
96
+ return true;
97
+ }
98
+ });
99
+
100
+ onMounted(() => {
101
+ try {
102
+ const cloudCustomData: ICloudCustomData = JSON.parse(
103
+ props.message?.cloudCustomData || '{}',
104
+ );
105
+ hasQuoteContent.value = Boolean(cloudCustomData.messageReply);
106
+ if (hasQuoteContent.value) {
107
+ messageQuoteContent.value = cloudCustomData.messageReply;
108
+ messageQuoteText.value = performQuoteContent(messageQuoteContent.value);
109
+ }
110
+ } catch (error) {
111
+ hasQuoteContent.value = false;
112
+ }
113
+ });
114
+
115
+ function performQuoteContent(params: IQuoteContent) {
116
+ let messageKey: string = '';
117
+ let quoteContent: string = '';
118
+ switch (params.messageType) {
119
+ case MessageQuoteTypeEnum.TYPE_TEXT:
120
+ messageKey = '[文本]';
121
+ break;
122
+ case MessageQuoteTypeEnum.TYPE_CUSTOM:
123
+ messageKey = '[自定义消息]';
124
+ break;
125
+ case MessageQuoteTypeEnum.TYPE_IMAGE:
126
+ messageKey = '[图片]';
127
+ break;
128
+ case MessageQuoteTypeEnum.TYPE_SOUND:
129
+ messageKey = '[音频]';
130
+ break;
131
+ case MessageQuoteTypeEnum.TYPE_VIDEO:
132
+ messageKey = '[视频]';
133
+ break;
134
+ case MessageQuoteTypeEnum.TYPE_FILE:
135
+ messageKey = '[文件]';
136
+ break;
137
+ case MessageQuoteTypeEnum.TYPE_LOCATION:
138
+ messageKey = '[地理位置]';
139
+ break;
140
+ case MessageQuoteTypeEnum.TYPE_FACE:
141
+ messageKey = '[动画表情]';
142
+ break;
143
+ case MessageQuoteTypeEnum.TYPE_GROUP_TIPS:
144
+ messageKey = '[群提示]';
145
+ break;
146
+ case MessageQuoteTypeEnum.TYPE_MERGER:
147
+ messageKey = '[聊天记录]';
148
+ break;
149
+ default:
150
+ messageKey = '[消息]';
151
+ break;
152
+ }
153
+ if (
154
+ [MessageQuoteTypeEnum.TYPE_TEXT, MessageQuoteTypeEnum.TYPE_MERGER].includes(
155
+ params.messageType,
156
+ )
157
+ ) {
158
+ quoteContent = params.messageAbstract;
159
+ }
160
+ return quoteContent
161
+ ? quoteContent
162
+ : TUITranslateService.t(`TUIChat.${messageKey}`);
163
+ }
164
+
165
+ async function scrollToOriginalMessage() {
166
+ if (isMessageRevoked.value) {
167
+ return;
168
+ }
169
+ const originMessageID = messageQuoteContent.value?.messageID;
170
+ const currentMessageList = TUIStore.getData(StoreName.CHAT, 'messageList');
171
+ const isOriginalMessageInScreen = currentMessageList.some(
172
+ msg => msg.ID === originMessageID,
173
+ );
174
+ if (originMessageID && isOriginalMessageInScreen) {
175
+ try {
176
+ const scrollViewRect = await getBoundingClientRect(
177
+ '#messageScrollList',
178
+ 'messageList',
179
+ );
180
+ const originalMessageRect = await getBoundingClientRect(
181
+ '#tui-' + originMessageID,
182
+ 'messageList',
183
+ );
184
+ const { scrollTop } = await getScrollInfo(
185
+ '#messageScrollList',
186
+ 'messageList',
187
+ );
188
+ const finalScrollTop
189
+ = originalMessageRect.top
190
+ + scrollTop
191
+ - scrollViewRect.top
192
+ - (selfAddValue++ % 2);
193
+ const isNeedScroll = originalMessageRect.top < scrollViewRect.top;
194
+ if (!isUniFrameWork && window) {
195
+ const scrollView = document.getElementById('messageScrollList');
196
+ if (isNeedScroll && scrollView) {
197
+ scrollView.scrollTop = finalScrollTop;
198
+ }
199
+ } else if (isUniFrameWork && isNeedScroll) {
200
+ emits('scrollTo', finalScrollTop);
201
+ }
202
+ emits('blinkMessage', originMessageID);
203
+ } catch (error) {
204
+ console.error(error);
205
+ }
206
+ } else {
207
+ Toast({
208
+ message: TUITranslateService.t('TUIChat.无法定位到原消息'),
209
+ type: TOAST_TYPE.WARNING,
210
+ });
211
+ }
212
+ }
213
+ </script>
214
+
215
+ <style lang="scss" scoped>
216
+ .reference-content {
217
+ max-width: 272px;
218
+ margin-top: 4px;
219
+
220
+ padding: 12px;
221
+ font-size: 12px;
222
+ color: #666;
223
+ word-wrap: break-word;
224
+ word-break: break-all;
225
+ background-color: #fbfbfb;
226
+ border-radius: 8px;
227
+ line-height: 16.8px;
228
+ cursor: pointer;
229
+ -webkit-tap-highlight-color: transparent;
230
+ }
231
+ .reference-content.isPc {
232
+ margin-left: 44px;
233
+ }
234
+
235
+ .reverse.reference-content {
236
+ margin-right: 44px;
237
+ margin-left: auto;
238
+ border-radius: 0 8px 8px 0;
239
+ }
240
+ .isMobile.reference-content.in {
241
+ margin-right: auto;
242
+ background: #f3f4f7;
243
+ border-radius: 0 8px 8px 0;
244
+ }
245
+ .isMobile.reverse.reference-content {
246
+ margin-right: 10px;
247
+ margin-left: auto;
248
+ background: #FFFFFF1A;
249
+ color: white;
250
+
251
+ }
252
+ .mobile-left-box {
253
+ display:inline-block;
254
+ background: #FFFFFF33;
255
+ width: 5px;
256
+ margin-top: 4px;
257
+ border-radius: 8px 0 0 8px;
258
+ }
259
+ .mobile-left-box.in {
260
+ display:inline-block;
261
+ background: #e1e2e5;
262
+ width: 5px;
263
+ margin-top: 4px;
264
+ border-radius: 8px 0 0 8px;
265
+ }
266
+ .revoked-text {
267
+ color: #999;
268
+ }
269
+
270
+ .mobile-quote-sender{
271
+ font-family: PingFangSC-Regular;
272
+ font-size: 10px;
273
+
274
+ }
275
+
276
+ .max-double-line {
277
+ font-family: PingFangSC-Regular;
278
+ font-size: 14px;
279
+ word-break: break-all;
280
+ overflow: hidden;
281
+ display: -webkit-box;
282
+ max-height: 33px;
283
+ -webkit-line-clamp: 2;
284
+ -webkit-box-orient: vertical;
285
+ }
286
+ </style>
@@ -0,0 +1,60 @@
1
+ export interface IQuoteContent {
2
+ messageAbstract: string;
3
+ messageID: string;
4
+ messageSender: string;
5
+ messageSequence: number;
6
+ messageTime: number;
7
+ messageType: number;
8
+ version: number;
9
+ }
10
+
11
+ export interface ICloudCustomData {
12
+ messageReply: IQuoteContent;
13
+ }
14
+
15
+ export enum MessageQuoteTypeEnum {
16
+ /**
17
+ * none message
18
+ */
19
+ TYPE_NONE = 0,
20
+ /**
21
+ * text message
22
+ */
23
+ TYPE_TEXT = 1,
24
+ /**
25
+ * custom message
26
+ */
27
+ TYPE_CUSTOM = 2,
28
+ /**
29
+ * image message
30
+ */
31
+ TYPE_IMAGE = 3,
32
+ /**
33
+ * voice message
34
+ */
35
+ TYPE_SOUND = 4,
36
+ /**
37
+ * video message
38
+ */
39
+ TYPE_VIDEO = 5,
40
+ /**
41
+ * file message
42
+ */
43
+ TYPE_FILE = 6,
44
+ /**
45
+ * location message
46
+ */
47
+ TYPE_LOCATION = 7,
48
+ /**
49
+ * animation face message
50
+ */
51
+ TYPE_FACE = 8,
52
+ /**
53
+ * group tips message (save in message list)
54
+ */
55
+ TYPE_GROUP_TIPS = 9,
56
+ /**
57
+ * merge forward message
58
+ */
59
+ TYPE_MERGER = 10,
60
+ }
@@ -0,0 +1,139 @@
1
+ <template>
2
+ <div>
3
+ <div
4
+ class="message-record-container"
5
+ @click="openMergeDetail"
6
+ >
7
+ <div class="record-title">
8
+ {{ props.renderData.title }}
9
+ </div>
10
+ <div class="record-abstract-container">
11
+ <div
12
+ v-for="(item, index) in props.renderData.abstractList.slice(0, 7)"
13
+ :key="index"
14
+ class="record-abstract-item"
15
+ >
16
+ {{ transformTextWithKeysToEmojiNames(item) }}
17
+ </div>
18
+ </div>
19
+ <div class="record-footer">
20
+ {{ TUITranslateService.t("TUIChat.聊天记录") }}
21
+ </div>
22
+ </div>
23
+ <Overlay
24
+ v-if="!props.disabled && isPC"
25
+ :visible="isMessageListVisible"
26
+ @onOverlayClick="isMessageListVisible = false"
27
+ >
28
+ <SimpleMessageList
29
+ :isMounted="isMessageListVisible"
30
+ :renderData="props.renderData"
31
+ :messageID="props.messageItem.ID"
32
+ @closeOverlay="closeMergeDetail"
33
+ />
34
+ </Overlay>
35
+ <Drawer
36
+ v-else-if="!props.disabled && isH5 && !isUniFrameWork"
37
+ :visible="isMessageListVisible"
38
+ :isFullScreen="true"
39
+ :overlayColor="'transparent'"
40
+ :popDirection="'right'"
41
+ >
42
+ <SimpleMessageList
43
+ :isMounted="isMessageListVisible"
44
+ :renderData="props.renderData"
45
+ :messageID="props.messageItem.ID"
46
+ @closeOverlay="closeMergeDetail"
47
+ />
48
+ </Drawer>
49
+ </div>
50
+ </template>
51
+
52
+ <script lang="ts" setup>
53
+ import vue from '../../../../../adapter-vue';
54
+ import {
55
+ TUITranslateService,
56
+ IMessageModel,
57
+ } from '@tencentcloud/chat-uikit-engine';
58
+ import Overlay from '../../../../common/Overlay/index.vue';
59
+ import Drawer from '../../../../common/Drawer/index.vue';
60
+ import SimpleMessageList from '../simple-message-list/index.vue';
61
+ import { isH5, isPC, isUniFrameWork } from '../../../../../utils/env';
62
+ import { transformTextWithKeysToEmojiNames } from '../../../emoji-config/index';
63
+ import { IMergeMessageContent } from '../../../../../interface';
64
+ const { ref, withDefaults } = vue;
65
+
66
+ interface IEmits {
67
+ (e: 'assignMessageIDInUniapp', messageID: string): void;
68
+ }
69
+
70
+ interface IProps {
71
+ // Core data for rendering message record card and message list
72
+ renderData: IMergeMessageContent;
73
+ /**
74
+ * The MessageRecord component has two main functions:
75
+ * 1. display message record cards primarily.
76
+ * 2. clicking on it and show the simple message list.
77
+ * When used as a nested component with the disabled prop
78
+ * it is only need renderData to render message record cards.
79
+ * Therefore, 'messageItem' and 'disabled' is not a required prop.
80
+ */
81
+ disabled?: boolean;
82
+ messageItem?: IMessageModel;
83
+ }
84
+
85
+ const emits = defineEmits<IEmits>();
86
+ const props = withDefaults(defineProps<IProps>(), {
87
+ messageItem: () => ({} as IMessageModel),
88
+ disabled: false,
89
+ });
90
+
91
+ const isMessageListVisible = ref(false);
92
+
93
+ function openMergeDetail() {
94
+ if (props.disabled) {
95
+ return;
96
+ }
97
+ if (!isUniFrameWork) {
98
+ isMessageListVisible.value = true;
99
+ } else {
100
+ emits('assignMessageIDInUniapp', props.messageItem.ID);
101
+ }
102
+ }
103
+
104
+ function closeMergeDetail() {
105
+ isMessageListVisible.value = false;
106
+ }
107
+ </script>
108
+ <style lang="scss" scoped>
109
+ :not(not) {
110
+ display: flex;
111
+ flex-direction: column;
112
+ box-sizing: border-box;
113
+ min-width: 0;
114
+ }
115
+
116
+ .message-record-container {
117
+ padding: 10px 15px;
118
+ border: 1px solid #ddd;
119
+ border-radius: 10px;
120
+ cursor: pointer;
121
+ background-color: #fff;
122
+ max-width: 400px;
123
+ min-width: 180px;
124
+ overflow: hidden;
125
+
126
+ .record-abstract-container {
127
+ color: #bbb;
128
+ font-size: 12px;
129
+ margin: 8px 0;
130
+ }
131
+
132
+ .record-footer {
133
+ color: #888;
134
+ font-size: 11px;
135
+ padding-top: 5px;
136
+ border-top: 1px solid #eee;
137
+ }
138
+ }
139
+ </style>
@@ -0,0 +1,94 @@
1
+ <template>
2
+ <div :class="['message-text-container', isPC && 'text-select']">
3
+ <span
4
+ v-for="(item, index) in data.text"
5
+ :key="index"
6
+ >
7
+ <span
8
+ v-if="item.name === 'text'"
9
+ class="text"
10
+ >{{ item.text }}</span>
11
+ <img
12
+ v-else
13
+ class="emoji"
14
+ :src="item.src"
15
+ :alt="item.emojiKey"
16
+ >
17
+ </span>
18
+ </div>
19
+ </template>
20
+
21
+ <script lang="ts" setup>
22
+ import vue from '../../../../adapter-vue';
23
+ import {
24
+ CUSTOM_BASIC_EMOJI_URL,
25
+ CUSTOM_BASIC_EMOJI_URL_MAPPING,
26
+ } from '../../emoji-config';
27
+ import { isPC } from '../../../../utils/env';
28
+ const { watchEffect, ref } = vue;
29
+ interface IProps {
30
+ content: Record<string, any>;
31
+ }
32
+ const props = withDefaults(defineProps<IProps>(), {
33
+ content: () => ({}),
34
+ });
35
+ const data = ref();
36
+ watchEffect(() => {
37
+ data.value = props.content;
38
+ data.value.text?.forEach(
39
+ (item: {
40
+ name: string;
41
+ text?: string;
42
+ src?: string;
43
+ type?: string;
44
+ emojiKey?: string;
45
+ }) => {
46
+ if (item.name === 'img' && item?.type === 'custom') {
47
+ if (!CUSTOM_BASIC_EMOJI_URL) {
48
+ console.warn(
49
+ 'CUSTOM_BASIC_EMOJI_URL is required for custom emoji, please check your CUSTOM_BASIC_EMOJI_URL.',
50
+ );
51
+ } else if (
52
+ !item.emojiKey
53
+ || !CUSTOM_BASIC_EMOJI_URL_MAPPING[item.emojiKey]
54
+ ) {
55
+ console.warn(
56
+ 'emojiKey is required for custom emoji, please check your emojiKey.',
57
+ );
58
+ } else {
59
+ item.src
60
+ = CUSTOM_BASIC_EMOJI_URL
61
+ + CUSTOM_BASIC_EMOJI_URL_MAPPING[item.emojiKey];
62
+ }
63
+ }
64
+ },
65
+ );
66
+ });
67
+ </script>
68
+ <style lang="scss" scoped>
69
+ .message-text-container {
70
+ display: inline;
71
+ }
72
+
73
+ .text-select {
74
+ -webkit-user-select: text;
75
+ -moz-user-select: text;
76
+ -ms-user-select: text;
77
+ user-select: text;
78
+ }
79
+
80
+ .emoji {
81
+ vertical-align: bottom;
82
+ width: 20px;
83
+ height: 20px;
84
+ }
85
+
86
+ .text {
87
+ white-space: pre-wrap;
88
+ font-size: 14px;
89
+ text-size-adjust: none;
90
+ font-family: PingFangSC-Regular;
91
+ overflow-wrap: break-word;
92
+ word-break: keep-all;
93
+ }
94
+ </style>