mdm-im-v3 2.0.3 → 2.1.2

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 (33) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +69 -0
  3. package/dist/{FilePreview-CqsQCI87.js → FilePreview-Cz0KMA_m.js} +2 -2
  4. package/dist/assets/extracted/bc26358d.woff +0 -0
  5. package/dist/assets/extracted/be398edc.ttf +0 -0
  6. package/dist/assets/extracted/de12ee92.woff2 +0 -0
  7. package/dist/core.es.js +2 -2
  8. package/dist/{index-C4_SSULD.js → index-C8koozDu.js} +697 -47
  9. package/dist/{index-B3MeQmIL.js → index-GiaKeCU7.js} +1550 -3296
  10. package/dist/{index-D8yaC3ve.js → index-P9_HILzo.js} +3700 -480
  11. package/dist/index.es.js +1 -1
  12. package/dist/style/index.css +1 -1
  13. package/dist-h5/{ChatHistoryH5-Deqlnw3u.js → ChatHistoryH5-CKDqKPl-.js} +2 -2
  14. package/dist-h5/{ChatPageH5-wyLGmPhW.js → ChatPageH5-FXZxtcQr.js} +975 -164
  15. package/dist-h5/{ChatSettingsH5-DD3dnI-H.js → ChatSettingsH5-PackrlPt.js} +169 -27
  16. package/dist-h5/{CreateGroupH5-3LIujy3_.js → CreateGroupH5-CO_ZH36_.js} +2 -2
  17. package/dist-h5/{GroupAnnouncementH5-5EpXQs5V.js → GroupAnnouncementH5-yUDR5kYW.js} +1 -1
  18. package/dist-h5/{GroupInfoDialogH5-fgcrbRyp.js → GroupInfoDialogH5-BRk-_mEn.js} +1 -1
  19. package/dist-h5/{GroupMembersH5-DX2lxrLB.js → GroupMembersH5-BVHUF2mG.js} +1 -1
  20. package/dist-h5/{GroupNoticeH5-DVXrcmP9.js → GroupNoticeH5-KA-L2h9r.js} +1 -1
  21. package/dist-h5/{MemberDetailH5-DAVUVr30.js → MemberDetailH5-BfAE0nx-.js} +2 -2
  22. package/dist-h5/{SearchPageH5-BiGhJF4U.js → SearchPageH5-B6B_U4hW.js} +2 -2
  23. package/dist-h5/{SelectMembersH5-DbrSnTg3.js → SelectMembersH5-CrPoBnYp.js} +2 -2
  24. package/dist-h5/assets/extracted/bc26358d.woff +0 -0
  25. package/dist-h5/assets/extracted/be398edc.ttf +0 -0
  26. package/dist-h5/assets/extracted/de12ee92.woff2 +0 -0
  27. package/dist-h5/{imChat-Cz45JFEl.js → imChat-pGlpr8Vj.js} +40 -7
  28. package/dist-h5/index.es.js +2 -2
  29. package/dist-h5/{indexH5-Cx3l8YDq.js → indexH5-CCvF1MV7.js} +3591 -329
  30. package/dist-h5/{indexH5-BZ77bUNH.js → indexH5-sKvS7t3k.js} +101 -69
  31. package/dist-h5/style/index-h5.css +1 -1
  32. package/package.json +72 -70
  33. package/dist-h5/request-rky8JSGo.js +0 -44
@@ -1,14 +1,14 @@
1
1
  import { ref, computed, openBlock, createElementBlock, Fragment, createVNode, unref, normalizeClass, withCtx, createElementVNode, toDisplayString, withModifiers, createTextVNode, inject, normalizeStyle, createCommentVNode, renderList, watch, nextTick, onMounted, onBeforeUnmount, createBlock, withDirectives, vShow, vModelText, resolveComponent } from "vue";
2
2
  import { useRouter, useRoute } from "vue-router";
3
- import { NavBar, Icon, ActionSheet, Loading, Checkbox, Popup, Empty, Button, showToast, showImagePreview, showDialog, Search, List } from "vant";
4
- import { l as IM_LOGIN_PLATFORM, n as formatFileSize, o as handleLinks, p as IM_MSG_TYPE, u as useChatStore, I as IM_CVS_TYPE, q as useDate, c as cloneDeep, i as isDefaultAvatar, k as handleUrl, a as getAvatarBg, b as getAvatarText, r as getJsonDetail, h as useMsgList, s as getReplyDetail, t as IM_FONT_FAMILY, v as IM_FONT_SIZE, w as IM_FONT_STYLE, e as useUsers, f as useConversations, m as mittBus, g as getGroupAvatarBg, x as IM_GROUP_STATUS, y as uuidv4 } from "./indexH5-Cx3l8YDq.js";
5
- import { u as uploadFiles } from "./imChat-Cz45JFEl.js";
3
+ import { NavBar, Icon, ActionSheet, Loading, Checkbox, Popup, Empty, Button, showToast, showImagePreview, showDialog, Overlay, Search, List } from "vant";
4
+ import { o as isNoticeAgentConversation, l as IM_LOGIN_PLATFORM, q as formatFileSize, r as handleLinks, t as IM_MSG_TYPE, u as useChatStore, I as IM_CVS_TYPE, v as useDate, c as cloneDeep, i as isDefaultAvatar, n as handleUrl, a as getAvatarBg, b as getAvatarText, w as isBurnMessage, x as formatBurnRemain, y as isBurned, z as getJsonDetail, A as useBurnAfterReading, j as useMsgList, B as dedupeMessages, C as getDefaultExportFromCjs, D as getMediaDuration, E as getReplyDetail, F as IM_FONT_FAMILY, G as IM_FONT_SIZE, H as IM_FONT_STYLE, f as useUsers, h as useConversations, m as mittBus, g as getGroupAvatarBg, J as IM_GROUP_STATUS, d as getConversationBurnSetting, p as preserveBurnInEx, K as uuidv4 } from "./indexH5-CCvF1MV7.js";
5
+ import { u as uploadFiles } from "./imChat-pGlpr8Vj.js";
6
6
  import { _ as _export_sfc } from "./_plugin-vue_export-helper-1tPrXgE0.js";
7
7
  import { ElMessage } from "element-plus";
8
8
  import axios from "axios";
9
9
  import { f as fileIcon, a as fileWordIcon, b as filePdfIcon, c as fileExcelIcon, d as fileVideoIcon, e as fileMusicIcon } from "./file_excel_icon-dlT1dWlt.js";
10
10
  import { d as defaultAvatar } from "./default_avatar-BE2kit_X.js";
11
- import { J as JoinGroupDialogH5, G as GroupInfoDialogH5 } from "./GroupInfoDialogH5-fgcrbRyp.js";
11
+ import { J as JoinGroupDialogH5, G as GroupInfoDialogH5 } from "./GroupInfoDialogH5-BRk-_mEn.js";
12
12
  const uploadQueue = ref({});
13
13
  const useUploadQueue = () => {
14
14
  const addPendingMessage = (conversationID, message) => {
@@ -27,7 +27,7 @@ const useUploadQueue = () => {
27
27
  const getPendingMessages = (conversationID) => {
28
28
  return uploadQueue.value[conversationID] ? [...uploadQueue.value[conversationID]] : [];
29
29
  };
30
- const updatePendingMessage2 = (conversationID, clientMsgID, updates) => {
30
+ const updatePendingMessage = (conversationID, clientMsgID, updates) => {
31
31
  const list = uploadQueue.value[conversationID];
32
32
  if (!list) return;
33
33
  const idx = list.findIndex((item) => item.clientMsgID === clientMsgID);
@@ -39,7 +39,7 @@ const useUploadQueue = () => {
39
39
  addPendingMessage,
40
40
  removePendingMessage,
41
41
  getPendingMessages,
42
- updatePendingMessage: updatePendingMessage2
42
+ updatePendingMessage
43
43
  };
44
44
  };
45
45
  const setting = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAAXNSR0IArs4c6QAABIRJREFUWEfdWNFx2zgQfUvnP0oFSSqIXEHkCo76vYkYXQWBKohcgeAKTqEy90umgrMqiFxB7Api/1vcmwVIGKQJkrJ8N5nDl8cCF49vd98+gvCLL/rF8eH/BzCeqxH2WIEQA7hGgUX+VV+2ZSKeqzfl3jEYlzjBeb7W14dkbTCDBliBTwAUASP/EAapPF1d+P+LP6gYEf709zJwC0AjwkW+1vJ37xoEcJosPjJYN4HVQDIuiWgN4JaZYyLMQ6cLUAKpLF196UPYCzBO1JKAz3XG8AURligwb/7WPJDh9kqcj40453mql10ghwD8QcAbE4SxZcbSr7n4g5oQYQnC+9pBjBsGlvlGC6tmxb+rMZ1AV3sZuM5T/fYogNOZunQBI7wK1Y4ARYSJOazALv+q80DjjKjAz+qFs422zwTWEAZdirnAWahj+2rJsSiMR/jbJgTPkOKZUkRYmYCMP/yUDQXl74sPjDeEQelekRf8Cwxe5KlWT05xqX3SJEb3uKMGh7IpMasaNLoY4W2XJgYZLCdGRmQLX+QiT3VQ22yH0kuz94RvuiZGrfHshJmGQNYAymiigt4xeNyYGHccYdx2aDkxVk6KSipZDmactzWVPQc7APaFyglDoB1HfOWf4wAaPSu7q5GuO77HJP9LS8DaimdqRYTOGgo1lmH8BWSGG5D+4nucVuc9AEzUuqn0YHzjE6gQcxQhc4FFmMkcCGJMQHhd/RZqLsPk3gj3bzWAXjk5gLW6KHCGF9h1FW+cqJ+ueew4kxcxBqBsLul+M9ok3flGn4Uayey/x9hlkLGtBPwBYKK4CpClEju8pO4ce4ybbKPtKPSW6dY9dhWTbLu102pNWzA8BuihD76xZyAYCGpZnKiDNNTPYkXScwAMjivfCQ0R+UEApeXzVL8ammIGdnmqT9v2x4n6ToBIFvzO7MiMq+vHDM6U1Ms7ebi3Bu00kHqqdGyZp/q8VoOJ+kyA9XqBOm0CdTXIuMo22ryY38W53+7i1QDSTStfBW0aWSPMpcyAIR7R2SguMA3ar2TxCWD5jHhoNMa3bKPlm+cBYK0zvVeTFCLCWZvkxG3a2aAl1ETmg6pAVpVATQe9F6qPOvuhMyHG2HfIhs0IpwGQ4hdlmjQnwh0XmLcxV+qk1KfP2tYIfcPshs2Ctefrqi67zEIptOKoTd10OWoj5D7zjCveY942Smspbu1COy+/DxXwrs53tevZrSHdPcSwuhk9RMv6QPqmpM/C9TJo0nGgRe8FWI+3yDdadz0zhMHn/mhyc5wZxwOczpTTx66BP50t3jPxBKBb3PM2VPSlWf1RCrjTuxCLvQxOEyUWyk2M5r1K+T0sdzA1R2OEe4+FD7S63zlkwvQCbIqxf69yiKNuu995niaxt1rOfFapsEC9Wy57LSLueGSEu5zrdhTj+hHDDZP75BQ7/Wrcq3gBWydG26VTWXdb3kOFarQJtDfFzQfKyyKZMK/FpfAecbAhZmpOBJGRl5CJwVCHXp0cDLBP51on0lyNhl5YHs3gUwAe88x/wuAxAP8BS+SlR9q0RzUAAAAASUVORK5CYII=";
@@ -62,21 +62,25 @@ const icons = {
62
62
  board,
63
63
  speaker
64
64
  };
65
- const _hoisted_1$5 = {
65
+ const _hoisted_1$6 = {
66
66
  key: 0,
67
67
  class: "header-title"
68
68
  };
69
- const _hoisted_2$5 = { class: "title-row" };
70
- const _hoisted_3$5 = { class: "title-name" };
71
- const _hoisted_4$5 = ["src"];
72
- const _hoisted_5$5 = {
69
+ const _hoisted_2$6 = { class: "title-row" };
70
+ const _hoisted_3$6 = { class: "title-name" };
71
+ const _hoisted_4$6 = ["src"];
72
+ const _hoisted_5$6 = {
73
73
  key: 1,
74
74
  class: "header-title"
75
75
  };
76
76
  const _hoisted_6$5 = { class: "title-row" };
77
77
  const _hoisted_7$4 = { class: "title-name" };
78
- const _hoisted_8$4 = { class: "online-text" };
79
- const _sfc_main$5 = {
78
+ const _hoisted_8$4 = {
79
+ key: 0,
80
+ class: "title-notice-tag"
81
+ };
82
+ const _hoisted_9$4 = { class: "online-text" };
83
+ const _sfc_main$6 = {
80
84
  __name: "ChatHeaderH5",
81
85
  props: {
82
86
  chatInfo: {
@@ -110,6 +114,7 @@ const _sfc_main$5 = {
110
114
  const info = props.chatInfo || {};
111
115
  return info.onlineStatus === 1 || info.platformIDs && info.platformIDs.length > 0;
112
116
  });
117
+ const isNoticeAgent = computed(() => isNoticeAgentConversation(props.chatInfo));
113
118
  const onlineText = computed(() => {
114
119
  const info = props.chatInfo || {};
115
120
  if (!isOnline.value) return "离线";
@@ -191,9 +196,9 @@ const _sfc_main$5 = {
191
196
  title: withCtx(() => {
192
197
  var _a, _b;
193
198
  return [
194
- __props.isGroup ? (openBlock(), createElementBlock("div", _hoisted_1$5, [
195
- createElementVNode("div", _hoisted_2$5, [
196
- createElementVNode("div", _hoisted_3$5, toDisplayString(((_a = __props.chatInfo) == null ? void 0 : _a.showName) || "群聊"), 1),
199
+ __props.isGroup ? (openBlock(), createElementBlock("div", _hoisted_1$6, [
200
+ createElementVNode("div", _hoisted_2$6, [
201
+ createElementVNode("div", _hoisted_3$6, toDisplayString(((_a = __props.chatInfo) == null ? void 0 : _a.showName) || "群聊"), 1),
197
202
  createElementVNode("div", {
198
203
  class: "title-sub",
199
204
  onClick: withModifiers(onViewGroupMembers, ["stop"])
@@ -202,17 +207,19 @@ const _sfc_main$5 = {
202
207
  class: "group-icon",
203
208
  src: unref(icons).groupUser,
204
209
  alt: ""
205
- }, null, 8, _hoisted_4$5),
210
+ }, null, 8, _hoisted_4$6),
206
211
  createTextVNode(" " + toDisplayString(memberCountText.value), 1)
207
212
  ])
208
213
  ])
209
- ])) : (openBlock(), createElementBlock("div", _hoisted_5$5, [
214
+ ])) : (openBlock(), createElementBlock("div", _hoisted_5$6, [
210
215
  createElementVNode("div", _hoisted_6$5, [
211
216
  createElementVNode("span", _hoisted_7$4, toDisplayString(((_b = __props.chatInfo) == null ? void 0 : _b.showName) || "聊天"), 1),
212
- createElementVNode("span", {
213
- class: normalizeClass(["online-dot", { online: isOnline.value, offline: !isOnline.value }])
214
- }, null, 2),
215
- createElementVNode("span", _hoisted_8$4, toDisplayString(onlineText.value), 1)
217
+ isNoticeAgent.value ? (openBlock(), createElementBlock("span", _hoisted_8$4, "通知")) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
218
+ createElementVNode("span", {
219
+ class: normalizeClass(["online-dot", { online: isOnline.value, offline: !isOnline.value }])
220
+ }, null, 2),
221
+ createElementVNode("span", _hoisted_9$4, toDisplayString(onlineText.value), 1)
222
+ ], 64))
216
223
  ])
217
224
  ]))
218
225
  ];
@@ -238,7 +245,7 @@ const _sfc_main$5 = {
238
245
  };
239
246
  }
240
247
  };
241
- const ChatHeaderH5 = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["__scopeId", "data-v-1ffa1282"]]);
248
+ const ChatHeaderH5 = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["__scopeId", "data-v-170f3859"]]);
242
249
  let activeAudioMsg = null;
243
250
  let activeVideoEl = null;
244
251
  const audioPlayers = /* @__PURE__ */ new Map();
@@ -261,7 +268,10 @@ const pauseActiveVideo = () => {
261
268
  const useAudioPlayer = () => {
262
269
  const playAudio = async (msg) => {
263
270
  var _a, _b;
271
+ if (!msg) return;
272
+ if (msg.status !== void 0 && msg.status !== 2) return;
264
273
  const msgId = msg.clientMsgID;
274
+ if (!msgId) return;
265
275
  if ((activeAudioMsg == null ? void 0 : activeAudioMsg.clientMsgID) === msgId) {
266
276
  const player = audioPlayers.get(msgId);
267
277
  if (player) {
@@ -357,14 +367,14 @@ const useAudioPlayer = () => {
357
367
  };
358
368
  const speakImg1 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAATCAYAAACdkl3yAAAAAXNSR0IArs4c6QAAAZNJREFUOE+tk8+LjmEUhq9rxzALSXbCRiI/VhYWLJSdZjtJlJgsbOyMssH8AWz8KnZkM9mQZG8jolhokpUwsbAgxe19pufV6/OZ753y7J7zPOfqPvc5R/7TsS8nyVpgq/poWM5SQNPABWBKvToIWwpoBfAY2ARsV191YYuCkuwA5tQvJSnJZuAZcF+d6AVKsqYp4x1wr0meUH9W2EXgJLBNfdHCRik6A5wHJtXbFVRUPgVm1PK+cEZ6lOQ18EHd3SYlmQPm1V1DQUn2A8eAE+rHqmAGOA2MqV9rbBbYq676C5RkGbDwEbjbmpnkCHCjie1sYsXoYvpN4LD6u6I/SkvyFlgHnGvMPVuTWtBG9U2N3aoNWP6v0oqqMi+fO1261ozAoRJXf1TQE2C1ur6X2UnGgeLVrDpZISX2CbijHuwLegjsA7aoLyvoOHClOxKLtj/JWNO998C0eqlCVgLPgeLNBvVbX0Xj7XpU0HXg6LDFHTmQnSGcAi4DD4AD6vdeu9b9VNXsAU4VRer84HtvRYOJg/dfqOihFK69gr0AAAAASUVORK5CYII=";
359
369
  const speakImg2 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAMAAAD04JH5AAAACGFjVEwAAAAVAAAAACFN2OIAAAMAUExURQAAAP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wc9CwgAAAD/dFJOUwABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6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";
360
- const _hoisted_1$4 = ["innerHTML"];
361
- const _hoisted_2$4 = ["innerHTML"];
362
- const _hoisted_3$4 = ["innerHTML"];
363
- const _hoisted_4$4 = {
370
+ const _hoisted_1$5 = ["innerHTML"];
371
+ const _hoisted_2$5 = ["innerHTML"];
372
+ const _hoisted_3$5 = ["innerHTML"];
373
+ const _hoisted_4$5 = {
364
374
  key: 3,
365
375
  class: "msg-con-img"
366
376
  };
367
- const _hoisted_5$4 = ["src"];
377
+ const _hoisted_5$5 = ["src"];
368
378
  const _hoisted_6$4 = {
369
379
  key: 0,
370
380
  class: "name-txt"
@@ -399,7 +409,7 @@ const videoExtensions = ".mp4.avi.mov.wmv.flv.webm.mkv.mpeg.mpg";
399
409
  const wordExtensions = ".doc.docx";
400
410
  const pdfExtensions = ".pdf";
401
411
  const excelExtensions = ".xlsx.xls.xlsm.xlsb.xltx.xltm";
402
- const _sfc_main$4 = {
412
+ const _sfc_main$5 = {
403
413
  __name: "MessageItemH5",
404
414
  props: {
405
415
  msgInfo: {
@@ -554,24 +564,24 @@ const _sfc_main$4 = {
554
564
  class: normalizeClass(["msg-con-txt", { "is-reply": props.isReply, "is-self": msg.value.isSelf }]),
555
565
  style: normalizeStyle(msgStyle.value),
556
566
  innerHTML: handleLinks$1(msg.value.textElem.content)
557
- }, null, 14, _hoisted_1$4)) : msg.value.atTextElem ? (openBlock(), createElementBlock("div", {
567
+ }, null, 14, _hoisted_1$5)) : msg.value.atTextElem ? (openBlock(), createElementBlock("div", {
558
568
  key: 1,
559
569
  class: normalizeClass(["msg-con-txt", { "is-reply": props.isReply, "is-self": msg.value.isSelf }]),
560
570
  style: normalizeStyle(msgStyle.value),
561
571
  innerHTML: handleAtMessage(msg.value.atTextElem)
562
- }, null, 14, _hoisted_2$4)) : msg.value.quoteElem ? (openBlock(), createElementBlock("div", {
572
+ }, null, 14, _hoisted_2$5)) : msg.value.quoteElem ? (openBlock(), createElementBlock("div", {
563
573
  key: 2,
564
574
  class: normalizeClass(["msg-con-txt", { "is-reply": props.isReply, "is-self": msg.value.isSelf }]),
565
575
  style: normalizeStyle(msgStyle.value),
566
576
  innerHTML: handleLinks$1((_a = msg.value.quoteElem) == null ? void 0 : _a.text)
567
- }, null, 14, _hoisted_3$4)) : msg.value.pictureElem ? (openBlock(), createElementBlock("div", _hoisted_4$4, [
577
+ }, null, 14, _hoisted_3$5)) : msg.value.pictureElem ? (openBlock(), createElementBlock("div", _hoisted_4$5, [
568
578
  createElementVNode("img", {
569
579
  src: ((_b = msg.value.pictureElem.snapshotPicture) == null ? void 0 : _b.url) || ((_c = msg.value.pictureElem.sourcePicture) == null ? void 0 : _c.url),
570
580
  style: normalizeStyle(imageStyle.value),
571
581
  class: "img-content",
572
582
  onClick: withModifiers(onClickImage, ["stop"]),
573
583
  alt: ""
574
- }, null, 12, _hoisted_5$4)
584
+ }, null, 12, _hoisted_5$5)
575
585
  ])) : msg.value.fileElem ? (openBlock(), createElementBlock("div", {
576
586
  key: 4,
577
587
  class: normalizeClass(["msg-con-file", { "is-reply": props.isReply, "is-self": msg.value.isSelf }])
@@ -671,18 +681,18 @@ const _sfc_main$4 = {
671
681
  };
672
682
  }
673
683
  };
674
- const MessageItemH5 = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["__scopeId", "data-v-c2f5294e"]]);
675
- const _hoisted_1$3 = {
684
+ const MessageItemH5 = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["__scopeId", "data-v-c2f5294e"]]);
685
+ const _hoisted_1$4 = {
676
686
  key: 0,
677
687
  class: "loading-area"
678
688
  };
679
- const _hoisted_2$3 = ["id", "onClick"];
680
- const _hoisted_3$3 = {
689
+ const _hoisted_2$4 = ["id", "onClick"];
690
+ const _hoisted_3$4 = {
681
691
  key: 0,
682
692
  class: "tips-box"
683
693
  };
684
- const _hoisted_4$3 = { class: "tips-time" };
685
- const _hoisted_5$3 = { class: "tips-txt" };
694
+ const _hoisted_4$4 = { class: "tips-time" };
695
+ const _hoisted_5$4 = { class: "tips-txt" };
686
696
  const _hoisted_6$3 = {
687
697
  key: 0,
688
698
  class: "check-box"
@@ -701,28 +711,32 @@ const _hoisted_13$2 = {
701
711
  class: "msg-status"
702
712
  };
703
713
  const _hoisted_14$2 = { class: "quote-con-txt" };
704
- const _hoisted_15$2 = ["src", "onClick"];
705
- const _hoisted_16$1 = ["onClick"];
706
- const _hoisted_17$1 = {
714
+ const _hoisted_15$2 = {
715
+ key: 0,
716
+ class: "msg-burn-count"
717
+ };
718
+ const _hoisted_16$1 = ["src", "onClick"];
719
+ const _hoisted_17$1 = ["onClick"];
720
+ const _hoisted_18$1 = {
707
721
  key: 1,
708
722
  class: "empty-msg"
709
723
  };
710
- const _hoisted_18$1 = { class: "action-sheet-list" };
711
- const _hoisted_19$1 = ["onClick"];
712
- const _hoisted_20$1 = { class: "action-name" };
713
- const _hoisted_21$1 = { class: "merge-msg-popup" };
714
- const _hoisted_22$1 = { class: "merge-msg-popup__header" };
715
- const _hoisted_23$1 = { class: "merge-msg-popup__title" };
716
- const _hoisted_24$1 = { class: "merge-msg-popup__list" };
717
- const _hoisted_25$1 = ["src"];
718
- const _hoisted_26$1 = { class: "merge-msg-item__info" };
719
- const _hoisted_27$1 = { class: "merge-msg-item__head" };
720
- const _hoisted_28$1 = { class: "merge-msg-item__name" };
721
- const _hoisted_29$1 = { class: "merge-msg-item__time" };
722
- const _hoisted_30$1 = { class: "merge-msg-item__content" };
723
- const _hoisted_31$1 = { class: "merge-msg-popup__footer" };
724
+ const _hoisted_19$1 = { class: "action-sheet-list" };
725
+ const _hoisted_20$1 = ["onClick"];
726
+ const _hoisted_21$1 = { class: "action-name" };
727
+ const _hoisted_22$1 = { class: "merge-msg-popup" };
728
+ const _hoisted_23$1 = { class: "merge-msg-popup__header" };
729
+ const _hoisted_24$1 = { class: "merge-msg-popup__title" };
730
+ const _hoisted_25$1 = { class: "merge-msg-popup__list" };
731
+ const _hoisted_26$1 = ["src"];
732
+ const _hoisted_27$1 = { class: "merge-msg-item__info" };
733
+ const _hoisted_28$1 = { class: "merge-msg-item__head" };
734
+ const _hoisted_29$1 = { class: "merge-msg-item__name" };
735
+ const _hoisted_30$1 = { class: "merge-msg-item__time" };
736
+ const _hoisted_31$1 = { class: "merge-msg-item__content" };
737
+ const _hoisted_32$1 = { class: "merge-msg-popup__footer" };
724
738
  const maxSelectCount = 20;
725
- const _sfc_main$3 = {
739
+ const _sfc_main$4 = {
726
740
  __name: "MessageListH5",
727
741
  props: {
728
742
  imInstance: {
@@ -761,6 +775,7 @@ const _sfc_main$3 = {
761
775
  const chatMessage = useChatStore();
762
776
  computed(() => chatMessage.getUserInfo);
763
777
  const baseUrl = computed(() => chatMessage.getBaseUrl);
778
+ const { scheduleBurn, burnRemain } = useBurnAfterReading();
764
779
  const messageContainer = ref(null);
765
780
  const listContainer = ref(null);
766
781
  const localMsgList = ref([]);
@@ -1012,36 +1027,46 @@ const _sfc_main$3 = {
1012
1027
  const onResendMsg = (msg) => {
1013
1028
  showToast("重发功能开发中");
1014
1029
  };
1015
- const handleNotificationDetail = (jsonObj, type) => {
1016
- return jsonObj ? getJsonDetail(jsonObj, type) : "";
1030
+ const handleNotificationDetail = (jsonObj, type, msg) => {
1031
+ var _a;
1032
+ return jsonObj ? getJsonDetail(jsonObj, type, msg, (_a = props.chatInfo) == null ? void 0 : _a.showName) : "";
1017
1033
  };
1018
1034
  let isLoadingMoreAhead = false;
1019
1035
  const loadMore = async (direction) => {
1036
+ var _a, _b;
1020
1037
  if (!props.imInstance) return;
1021
1038
  const cvs = props.chatInfo;
1022
1039
  const cvsID = (cvs == null ? void 0 : cvs.conversationID) || "";
1023
1040
  if (!cvsID) return;
1024
1041
  if (direction === "ahead") {
1025
1042
  if (isFirstMessage.value || isLoadingMoreAhead) return;
1043
+ if (localMsgList.value.length === 0) return;
1026
1044
  isLoadingMoreAhead = true;
1027
1045
  isLoadingMore.value = true;
1028
1046
  try {
1029
- const startID = localMsgList.value.length > 0 ? localMsgList.value[0].clientMsgID : "";
1047
+ const startID = localMsgList.value[0].clientMsgID;
1030
1048
  const { list, isEnd } = await props.imInstance.getAdvancedHistoryMessageList({
1031
1049
  conversationID: cvsID,
1032
1050
  startClientMsgID: startID,
1033
1051
  count: pageCount.value
1034
1052
  });
1053
+ if (((_a = props.chatInfo) == null ? void 0 : _a.conversationID) !== cvsID) return;
1035
1054
  isFirstMessage.value = isEnd;
1036
1055
  if (list.length > 0) {
1037
1056
  const { handleMessageList } = useMsgList();
1038
- const newList = handleMessageList(list);
1039
- const container = messageContainer.value;
1040
- const oldHeight = (container == null ? void 0 : container.scrollHeight) || 0;
1041
- localMsgList.value = [...newList, ...localMsgList.value];
1042
- await nextTick();
1043
- if (container) {
1044
- container.scrollTop = container.scrollHeight - oldHeight;
1057
+ const seen = /* @__PURE__ */ new Set();
1058
+ localMsgList.value.forEach((item) => {
1059
+ if (item == null ? void 0 : item.clientMsgID) seen.add(item.clientMsgID);
1060
+ });
1061
+ const newList = dedupeMessages(handleMessageList(list), seen);
1062
+ if (newList.length > 0) {
1063
+ const container = messageContainer.value;
1064
+ const oldHeight = (container == null ? void 0 : container.scrollHeight) || 0;
1065
+ localMsgList.value = [...newList, ...localMsgList.value];
1066
+ await nextTick();
1067
+ if (container) {
1068
+ container.scrollTop = container.scrollHeight - oldHeight;
1069
+ }
1045
1070
  }
1046
1071
  }
1047
1072
  } catch (e) {
@@ -1059,11 +1084,18 @@ const _sfc_main$3 = {
1059
1084
  startClientMsgID: startID,
1060
1085
  count: pageCount.value
1061
1086
  });
1087
+ if (((_b = props.chatInfo) == null ? void 0 : _b.conversationID) !== cvsID) return;
1062
1088
  isLastMessage.value = isEnd;
1063
1089
  if (list.length > 0) {
1064
1090
  const { handleMessageList } = useMsgList();
1065
- const newList = handleMessageList(list.slice(1));
1066
- localMsgList.value = [...localMsgList.value, ...newList];
1091
+ const seen = /* @__PURE__ */ new Set();
1092
+ localMsgList.value.forEach((item) => {
1093
+ if (item == null ? void 0 : item.clientMsgID) seen.add(item.clientMsgID);
1094
+ });
1095
+ const newList = dedupeMessages(handleMessageList(list.slice(1)), seen);
1096
+ if (newList.length > 0) {
1097
+ localMsgList.value = [...localMsgList.value, ...newList];
1098
+ }
1067
1099
  }
1068
1100
  } catch (e) {
1069
1101
  console.error("加载更多新消息失败:", e);
@@ -1129,6 +1161,30 @@ const _sfc_main$3 = {
1129
1161
  selectMsgs.value = [];
1130
1162
  closeMenu();
1131
1163
  };
1164
+ const burnCvsID = computed(() => {
1165
+ var _a;
1166
+ return ((_a = props.chatInfo) == null ? void 0 : _a.conversationID) || "";
1167
+ });
1168
+ const scheduleCurrentBurns = () => {
1169
+ const cvsID = burnCvsID.value;
1170
+ if (!cvsID) return;
1171
+ const focused = chatMessage.getIsFocused;
1172
+ [...props.messageList].forEach((msg) => {
1173
+ if (!isBurnMessage(msg)) return;
1174
+ if (isBurned(msg)) {
1175
+ scheduleBurn(cvsID, msg, 0);
1176
+ return;
1177
+ }
1178
+ if (msg.isSelf && !msg.isRead) return;
1179
+ if (!msg.isSelf && !focused) return;
1180
+ scheduleBurn(cvsID, msg);
1181
+ });
1182
+ };
1183
+ onMounted(scheduleCurrentBurns);
1184
+ watch(() => props.messageList, scheduleCurrentBurns, { deep: true });
1185
+ watch(burnCvsID, () => {
1186
+ scheduleCurrentBurns();
1187
+ });
1132
1188
  __expose({ resetMessageList, closeMultiSelect });
1133
1189
  return (_ctx, _cache) => {
1134
1190
  return openBlock(), createElementBlock("div", {
@@ -1142,7 +1198,7 @@ const _sfc_main$3 = {
1142
1198
  ref: messageContainer,
1143
1199
  onClick: closeMenu
1144
1200
  }, [
1145
- isLoadingMore.value ? (openBlock(), createElementBlock("div", _hoisted_1$3, [
1201
+ isLoadingMore.value ? (openBlock(), createElementBlock("div", _hoisted_1$4, [
1146
1202
  createVNode(unref(Loading), {
1147
1203
  size: "20",
1148
1204
  color: "var(--chat-theme-color, #1989fa)",
@@ -1162,9 +1218,9 @@ const _sfc_main$3 = {
1162
1218
  key: item.clientMsgID || item.seq || index,
1163
1219
  onClick: ($event) => onMsgItemClick(item)
1164
1220
  }, [
1165
- item.contentType > 200 ? (openBlock(), createElementBlock("div", _hoisted_3$3, [
1166
- createElementVNode("div", _hoisted_4$3, toDisplayString(item.showSendTime || item.showCreateTime), 1),
1167
- createElementVNode("div", _hoisted_5$3, toDisplayString(handleNotificationDetail((_a = item.notificationElem) == null ? void 0 : _a.detail, item.contentType)), 1)
1221
+ item.contentType > 200 ? (openBlock(), createElementBlock("div", _hoisted_3$4, [
1222
+ createElementVNode("div", _hoisted_4$4, toDisplayString(item.showSendTime || item.showCreateTime), 1),
1223
+ createElementVNode("div", _hoisted_5$4, toDisplayString(handleNotificationDetail((_a = item.notificationElem) == null ? void 0 : _a.detail, item.contentType, item)), 1)
1168
1224
  ])) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
1169
1225
  isMultiSelect.value ? (openBlock(), createElementBlock("div", _hoisted_6$3, [
1170
1226
  createVNode(unref(Checkbox), {
@@ -1237,7 +1293,15 @@ const _sfc_main$3 = {
1237
1293
  !isGroupChat.value && item.isSelf && item.status === 2 ? (openBlock(), createElementBlock("div", {
1238
1294
  key: 1,
1239
1295
  class: normalizeClass(["msg-read", { "no-read": !item.isRead }])
1240
- }, toDisplayString(item.isRead ? "已读" : "未读"), 3)) : createCommentVNode("", true)
1296
+ }, toDisplayString(item.isRead ? "已读" : "未读"), 3)) : createCommentVNode("", true),
1297
+ unref(isBurnMessage)(item) ? (openBlock(), createElementBlock("div", {
1298
+ key: 2,
1299
+ class: normalizeClass(["msg-burn", { self: item.isSelf }])
1300
+ }, [
1301
+ _cache[6] || (_cache[6] = createElementVNode("span", { class: "msg-burn-icon" }, "🔥", -1)),
1302
+ _cache[7] || (_cache[7] = createElementVNode("span", { class: "msg-burn-label" }, "阅后即焚", -1)),
1303
+ unref(burnRemain)(item, burnCvsID.value) > 0 ? (openBlock(), createElementBlock("span", _hoisted_15$2, toDisplayString(unref(formatBurnRemain)(unref(burnRemain)(item, burnCvsID.value))), 1)) : createCommentVNode("", true)
1304
+ ], 2)) : createCommentVNode("", true)
1241
1305
  ], 32),
1242
1306
  item.isSelf && !unref(isDefaultAvatar)(item.senderFaceUrl) ? (openBlock(), createElementBlock("img", {
1243
1307
  key: 3,
@@ -1245,16 +1309,16 @@ const _sfc_main$3 = {
1245
1309
  src: unref(handleUrl)(item.senderFaceUrl, baseUrl.value),
1246
1310
  alt: "",
1247
1311
  onClick: withModifiers(($event) => onViewMember(item), ["stop"])
1248
- }, null, 8, _hoisted_15$2)) : item.isSelf ? (openBlock(), createElementBlock("div", {
1312
+ }, null, 8, _hoisted_16$1)) : item.isSelf ? (openBlock(), createElementBlock("div", {
1249
1313
  key: 4,
1250
1314
  class: "msg-avatar avatar-text",
1251
1315
  style: normalizeStyle({ background: unref(getAvatarBg)(item.sendID) }),
1252
1316
  onClick: withModifiers(($event) => onViewMember(item), ["stop"])
1253
- }, toDisplayString(unref(getAvatarText)(item.senderNickname, 2)), 13, _hoisted_16$1)) : createCommentVNode("", true)
1317
+ }, toDisplayString(unref(getAvatarText)(item.senderNickname, 2)), 13, _hoisted_17$1)) : createCommentVNode("", true)
1254
1318
  ], 64))
1255
- ], 10, _hoisted_2$3);
1319
+ ], 10, _hoisted_2$4);
1256
1320
  }), 128)),
1257
- localMsgList.value.length === 0 && !isLoadingMore.value ? (openBlock(), createElementBlock("div", _hoisted_17$1, [..._cache[6] || (_cache[6] = [
1321
+ localMsgList.value.length === 0 && !isLoadingMore.value ? (openBlock(), createElementBlock("div", _hoisted_18$1, [..._cache[8] || (_cache[8] = [
1258
1322
  createElementVNode("span", null, "暂无消息,发送第一条消息吧", -1)
1259
1323
  ])])) : createCommentVNode("", true)
1260
1324
  ], 512),
@@ -1277,7 +1341,7 @@ const _sfc_main$3 = {
1277
1341
  onCancel: _cache[3] || (_cache[3] = ($event) => showLongPressMenu.value = false)
1278
1342
  }, {
1279
1343
  default: withCtx(() => [
1280
- createElementVNode("div", _hoisted_18$1, [
1344
+ createElementVNode("div", _hoisted_19$1, [
1281
1345
  (openBlock(true), createElementBlock(Fragment, null, renderList(longPressActions.value, (action) => {
1282
1346
  return openBlock(), createElementBlock("div", {
1283
1347
  key: action.key,
@@ -1290,8 +1354,8 @@ const _sfc_main$3 = {
1290
1354
  size: "20px",
1291
1355
  class: "action-icon"
1292
1356
  }, null, 8, ["name"]),
1293
- createElementVNode("span", _hoisted_20$1, toDisplayString(action.name), 1)
1294
- ], 12, _hoisted_19$1);
1357
+ createElementVNode("span", _hoisted_21$1, toDisplayString(action.name), 1)
1358
+ ], 12, _hoisted_20$1);
1295
1359
  }), 128))
1296
1360
  ])
1297
1361
  ]),
@@ -1308,11 +1372,11 @@ const _sfc_main$3 = {
1308
1372
  onClose: onCloseMergeMsg
1309
1373
  }, {
1310
1374
  default: withCtx(() => [
1311
- createElementVNode("div", _hoisted_21$1, [
1312
- createElementVNode("div", _hoisted_22$1, [
1313
- createElementVNode("span", _hoisted_23$1, toDisplayString(mergeMsgTitle.value), 1)
1375
+ createElementVNode("div", _hoisted_22$1, [
1376
+ createElementVNode("div", _hoisted_23$1, [
1377
+ createElementVNode("span", _hoisted_24$1, toDisplayString(mergeMsgTitle.value), 1)
1314
1378
  ]),
1315
- createElementVNode("div", _hoisted_24$1, [
1379
+ createElementVNode("div", _hoisted_25$1, [
1316
1380
  (openBlock(true), createElementBlock(Fragment, null, renderList(mergeMsgList.value, (item, idx) => {
1317
1381
  return openBlock(), createElementBlock("div", {
1318
1382
  key: item.clientMsgID || idx,
@@ -1324,17 +1388,17 @@ const _sfc_main$3 = {
1324
1388
  src: unref(handleUrl)(item.senderFaceUrl, baseUrl.value),
1325
1389
  alt: "",
1326
1390
  onError: onMergeMsgAvatarError
1327
- }, null, 40, _hoisted_25$1)) : (openBlock(), createElementBlock("div", {
1391
+ }, null, 40, _hoisted_26$1)) : (openBlock(), createElementBlock("div", {
1328
1392
  key: 1,
1329
1393
  class: "merge-msg-item__avatar merge-msg-item__avatar--text",
1330
1394
  style: normalizeStyle({ background: unref(getAvatarBg)(item.sendID) })
1331
1395
  }, toDisplayString(unref(getAvatarText)(item.senderNickname, 2)), 5)),
1332
- createElementVNode("div", _hoisted_26$1, [
1333
- createElementVNode("div", _hoisted_27$1, [
1334
- createElementVNode("span", _hoisted_28$1, toDisplayString(item.senderNickname), 1),
1335
- createElementVNode("span", _hoisted_29$1, toDisplayString(item.showSendTime), 1)
1396
+ createElementVNode("div", _hoisted_27$1, [
1397
+ createElementVNode("div", _hoisted_28$1, [
1398
+ createElementVNode("span", _hoisted_29$1, toDisplayString(item.senderNickname), 1),
1399
+ createElementVNode("span", _hoisted_30$1, toDisplayString(item.showSendTime), 1)
1336
1400
  ]),
1337
- createElementVNode("div", _hoisted_30$1, [
1401
+ createElementVNode("div", _hoisted_31$1, [
1338
1402
  createVNode(MessageItemH5, {
1339
1403
  "msg-info": item,
1340
1404
  "is-group-chat": true,
@@ -1349,14 +1413,14 @@ const _sfc_main$3 = {
1349
1413
  description: "暂无消息"
1350
1414
  })) : createCommentVNode("", true)
1351
1415
  ]),
1352
- createElementVNode("div", _hoisted_31$1, [
1416
+ createElementVNode("div", _hoisted_32$1, [
1353
1417
  createVNode(unref(Button), {
1354
1418
  class: "merge-msg-popup__close-btn",
1355
1419
  block: "",
1356
1420
  round: "",
1357
1421
  onClick: onCloseMergeMsg
1358
1422
  }, {
1359
- default: withCtx(() => [..._cache[7] || (_cache[7] = [
1423
+ default: withCtx(() => [..._cache[9] || (_cache[9] = [
1360
1424
  createTextVNode(" 关闭 ", -1)
1361
1425
  ])]),
1362
1426
  _: 1
@@ -1370,18 +1434,18 @@ const _sfc_main$3 = {
1370
1434
  };
1371
1435
  }
1372
1436
  };
1373
- const MessageListH5 = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["__scopeId", "data-v-24a6683e"]]);
1437
+ const MessageListH5 = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["__scopeId", "data-v-828967da"]]);
1374
1438
  const emojis = /* @__PURE__ */ JSON.parse(`[{"annotation":"嘿嘿","name":"GRINNING FACE","hexcode":"1F600","shortcodes":["gleeful"],"tags":["笑脸","脸"],"emoji":"😀","text":"","type":1,"order":1,"group":0,"subgroup":0,"version":1,"emoticon":":D"},{"annotation":"哈哈","name":"SMILING FACE WITH OPEN MOUTH","hexcode":"1F603","shortcodes":["glad","smile"],"tags":["开口笑","笑脸","脸"],"emoji":"😃","text":"","type":1,"order":2,"group":0,"subgroup":0,"version":0.6},{"annotation":"大笑","name":"SMILING FACE WITH OPEN MOUTH AND SMILING EYES","hexcode":"1F604","shortcodes":["happy"],"tags":["哈哈","开心","笑","脸","高兴"],"emoji":"😄","text":"","type":1,"order":3,"group":0,"subgroup":0,"version":0.6},{"annotation":"嘻嘻","name":"GRINNING FACE WITH SMILING EYES","hexcode":"1F601","shortcodes":["blissful","grin"],"tags":["笑脸","脸"],"emoji":"😁","text":"","type":1,"order":4,"group":0,"subgroup":0,"version":0.6},{"annotation":"斜眼笑","name":"SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES","hexcode":"1F606","shortcodes":["amused","laugh","lol"],"tags":["开心","眯眼","笑","脸","高兴"],"emoji":"😆","text":"","type":1,"order":5,"group":0,"subgroup":0,"version":0.6,"emoticon":"xD"},{"annotation":"苦笑","name":"SMILING FACE WITH OPEN MOUTH AND COLD SWEAT","hexcode":"1F605","shortcodes":["embarassed","sweat_smile"],"tags":["冷汗","汗","脸"],"emoji":"😅","text":"","type":1,"order":6,"group":0,"subgroup":0,"version":0.6},{"annotation":"笑得满地打滚","name":"ROLLING ON THE FLOOR LAUGHING","hexcode":"1F923","shortcodes":["entertained","rofl"],"tags":["地板","打滚","笑","脸"],"emoji":"🤣","text":"","type":1,"order":7,"group":0,"subgroup":0,"version":3,"emoticon":":'D"},{"annotation":"笑哭了","name":"FACE WITH TEARS OF JOY","hexcode":"1F602","shortcodes":["joyful","haha"],"tags":["眼泪","笑","脸"],"emoji":"😂","text":"","type":1,"order":8,"group":0,"subgroup":0,"version":0.6,"emoticon":":')"},{"annotation":"呵呵","name":"SLIGHTLY SMILING FACE","hexcode":"1F642","shortcodes":["pleased","slight_smile"],"tags":["开心","笑","脸"],"emoji":"🙂","text":"","type":1,"order":9,"group":0,"subgroup":0,"version":1,"emoticon":":)"},{"annotation":"倒脸","name":"UPSIDE-DOWN FACE","hexcode":"1F643","shortcodes":["ecstatic","upside_down"],"tags":["脸","颠倒","颠倒的脸"],"emoji":"🙃","text":"","type":1,"order":10,"group":0,"subgroup":0,"version":1},{"annotation":"眨眼","name":"WINKING FACE","hexcode":"1F609","shortcodes":["coy","wink"],"tags":["媚眼","笑"],"emoji":"😉","text":"","type":1,"order":11,"group":0,"subgroup":0,"version":0.6,"emoticon":";)"},{"annotation":"羞涩微笑","name":"SMILING FACE WITH SMILING EYES","hexcode":"1F60A","shortcodes":["blush"],"tags":["害羞","微笑","羞涩","脸","脸红"],"emoji":"😊","text":"","type":1,"order":12,"group":0,"subgroup":0,"version":0.6,"emoticon":":>"},{"annotation":"微笑天使","name":"SMILING FACE WITH HALO","hexcode":"1F607","shortcodes":["innocent","halo"],"tags":["光环","天使","天真","幻想","微笑","脸"],"emoji":"😇","text":"","type":1,"order":13,"group":0,"subgroup":0,"version":1,"emoticon":"o:)"},{"annotation":"喜笑颜开","name":"SMILING FACE WITH SMILING EYES AND THREE HEARTS","hexcode":"1F970","shortcodes":["love"],"tags":["心","爱慕","迷恋","陷入爱河"],"emoji":"🥰","text":"","type":1,"order":14,"group":0,"subgroup":1,"version":11},{"annotation":"花痴","name":"SMILING FACE WITH HEART-SHAPED EYES","hexcode":"1F60D","shortcodes":["lovestruck"],"tags":["爱","红心","脸"],"emoji":"😍","text":"","type":1,"order":15,"group":0,"subgroup":1,"version":0.6},{"annotation":"好崇拜哦","name":"GRINNING FACE WITH STAR EYES","hexcode":"1F929","shortcodes":["starstruck"],"tags":["咧嘴笑","脸","露齿笑"],"emoji":"🤩","text":"","type":1,"order":16,"group":0,"subgroup":1,"version":5},{"annotation":"飞吻","name":"FACE THROWING A KISS","hexcode":"1F618","shortcodes":["flirty"],"tags":["亲亲","眨眼","脸"],"emoji":"😘","text":"","type":1,"order":17,"group":0,"subgroup":1,"version":0.6,"emoticon":":x"},{"annotation":"亲亲","name":"KISSING FACE","hexcode":"1F617","shortcodes":["kiss"],"tags":["吻","脸"],"emoji":"😗","text":"","type":1,"order":18,"group":0,"subgroup":1,"version":1},{"annotation":"微笑","name":"WHITE SMILING FACE","hexcode":"263A","shortcodes":["relaxed"],"tags":["呵呵","开心","放松","笑","脸"],"emoji":"☺️","text":"☺︎","type":0,"order":20,"group":0,"subgroup":1,"version":0.6},{"annotation":"羞涩亲亲","name":"KISSING FACE WITH CLOSED EYES","hexcode":"1F61A","shortcodes":["loving_kiss"],"tags":["亲亲","吻","羞涩","脸","闭眼"],"emoji":"😚","text":"","type":1,"order":21,"group":0,"subgroup":1,"version":0.6,"emoticon":":*"},{"annotation":"微笑亲亲","name":"KISSING FACE WITH SMILING EYES","hexcode":"1F619","shortcodes":["happy_kiss"],"tags":["亲亲","吻","微笑","脸"],"emoji":"😙","text":"","type":1,"order":22,"group":0,"subgroup":1,"version":1},{"annotation":"含泪的笑脸","name":"SMILING FACE WITH TEAR","hexcode":"1F972","shortcodes":["tear_smile"],"tags":["微笑的","感动的","感恩的","眼泪","释怀的","骄傲的"],"emoji":"🥲","text":"","type":1,"order":23,"group":0,"subgroup":1,"version":13},{"annotation":"好吃","name":"FACE SAVOURING DELICIOUS FOOD","hexcode":"1F60B","shortcodes":["yum","savour"],"tags":["津津有味","美味","脸"],"emoji":"😋","text":"","type":1,"order":24,"group":0,"subgroup":2,"version":0.6},{"annotation":"吐舌","name":"FACE WITH STUCK-OUT TONGUE","hexcode":"1F61B","shortcodes":["playful","tongue_out"],"tags":["脸","舌头","调皮"],"emoji":"😛","text":"","type":1,"order":25,"group":0,"subgroup":2,"version":1,"emoticon":":p"},{"annotation":"单眼吐舌","name":"FACE WITH STUCK-OUT TONGUE AND WINKING EYE","hexcode":"1F61C","shortcodes":["mischievous"],"tags":["单眼","吐舌","开玩笑","脸"],"emoji":"😜","text":"","type":1,"order":26,"group":0,"subgroup":2,"version":0.6,"emoticon":";p"},{"annotation":"滑稽","name":"GRINNING FACE WITH ONE LARGE AND ONE SMALL EYE","hexcode":"1F92A","shortcodes":["crazy"],"tags":["大眼","小眼","滑稽的脸","疯狂的脸","脸"],"emoji":"🤪","text":"","type":1,"order":27,"group":0,"subgroup":2,"version":5},{"annotation":"眯眼吐舌","name":"FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES","hexcode":"1F61D","shortcodes":["facetious","lmao"],"tags":["可怕","吐舌","眯眼","眼睛","脸"],"emoji":"😝","text":"","type":1,"order":28,"group":0,"subgroup":2,"version":0.6,"emoticon":"xp"},{"annotation":"发财","name":"MONEY-MOUTH FACE","hexcode":"1F911","shortcodes":["pretentious","money_mouth"],"tags":["拜金","脸","见钱眼开","钱"],"emoji":"🤑","text":"","type":1,"order":29,"group":0,"subgroup":2,"version":1},{"annotation":"抱抱","name":"HUGGING FACE","hexcode":"1F917","shortcodes":["hugging"],"tags":["抱","拥抱","笑","脸"],"emoji":"🤗","text":"","type":1,"order":30,"group":0,"subgroup":3,"version":1},{"annotation":"不说","name":"SMILING FACE WITH SMILING EYES AND HAND COVERING MOUTH","hexcode":"1F92D","shortcodes":["gasp"],"tags":["哎呀","脸"],"emoji":"🤭","text":"","type":1,"order":31,"group":0,"subgroup":3,"version":5},{"annotation":"安静的脸","name":"FACE WITH FINGER COVERING CLOSED LIPS","hexcode":"1F92B","shortcodes":["shushing"],"tags":["嘘","安静"],"emoji":"🤫","text":"","type":1,"order":32,"group":0,"subgroup":3,"version":5},{"annotation":"想一想","name":"THINKING FACE","hexcode":"1F914","shortcodes":["curious","thinking"],"tags":["思考","想","脸"],"emoji":"🤔","text":"","type":1,"order":33,"group":0,"subgroup":3,"version":1,"emoticon":":l"},{"annotation":"闭嘴","name":"ZIPPER-MOUTH FACE","hexcode":"1F910","shortcodes":["silenced","zipper_mouth"],"tags":["嘴","脸"],"emoji":"🤐","text":"","type":1,"order":34,"group":0,"subgroup":4,"version":1,"emoticon":":z"},{"annotation":"挑眉","name":"FACE WITH ONE EYEBROW RAISED","hexcode":"1F928","shortcodes":["contempt"],"tags":["不信任","怀疑","眉毛上挑的脸","脸"],"emoji":"🤨","text":"","type":1,"order":35,"group":0,"subgroup":4,"version":5},{"annotation":"冷漠","name":"NEUTRAL FACE","hexcode":"1F610","shortcodes":["indifferent","neutral"],"tags":["脸","面无表情"],"emoji":"😐️","text":"😐︎","type":1,"order":36,"group":0,"subgroup":4,"version":0.7,"emoticon":":|"},{"annotation":"无语","name":"EXPRESSIONLESS FACE","hexcode":"1F611","shortcodes":["apathetic","expressionless"],"tags":["脸","茫然","面无表情"],"emoji":"😑","text":"","type":1,"order":37,"group":0,"subgroup":4,"version":1},{"annotation":"沉默","name":"FACE WITHOUT MOUTH","hexcode":"1F636","shortcodes":["vacant","no_mouth"],"tags":["嘴","安静","脸"],"emoji":"😶","text":"","type":1,"order":38,"group":0,"subgroup":4,"version":1,"emoticon":":#"},{"annotation":"得意","name":"SMIRKING FACE","hexcode":"1F60F","shortcodes":["cocky","smirk"],"tags":["假笑"],"emoji":"😏","text":"","type":1,"order":39,"group":0,"subgroup":4,"version":0.6,"emoticon":":j"},{"annotation":"不高兴","name":"UNAMUSED FACE","hexcode":"1F612","shortcodes":["unamused"],"tags":["不屑","不服","脸","郁闷","鄙视"],"emoji":"😒","text":"","type":1,"order":40,"group":0,"subgroup":4,"version":0.6,"emoticon":":?"},{"annotation":"翻白眼","name":"FACE WITH ROLLING EYES","hexcode":"1F644","shortcodes":["disbelief"],"tags":["无语","白眼","脸"],"emoji":"🙄","text":"","type":1,"order":41,"group":0,"subgroup":4,"version":1},{"annotation":"龇牙咧嘴","name":"GRIMACING FACE","hexcode":"1F62C","shortcodes":["grimaced"],"tags":["咬牙切齿","脸","露齿","鬼脸"],"emoji":"😬","text":"","type":1,"order":42,"group":0,"subgroup":4,"version":1,"emoticon":"8D"},{"annotation":"说谎","name":"LYING FACE","hexcode":"1F925","shortcodes":["lying"],"tags":["匹诺曹","脸","长鼻子"],"emoji":"🤥","text":"","type":1,"order":43,"group":0,"subgroup":4,"version":3},{"annotation":"松了口气","name":"RELIEVED FACE","hexcode":"1F60C","shortcodes":["relieved"],"tags":["如释重负","松口气","脸"],"emoji":"😌","text":"","type":1,"order":44,"group":0,"subgroup":5,"version":0.6},{"annotation":"沉思","name":"PENSIVE FACE","hexcode":"1F614","shortcodes":["pensive"],"tags":["心事重重","脸"],"emoji":"😔","text":"","type":1,"order":45,"group":0,"subgroup":5,"version":0.6},{"annotation":"困","name":"SLEEPY FACE","hexcode":"1F62A","shortcodes":["sleepy"],"tags":["睡觉","瞌睡","脸"],"emoji":"😪","text":"","type":1,"order":46,"group":0,"subgroup":5,"version":0.6},{"annotation":"流口水","name":"DROOLING FACE","hexcode":"1F924","shortcodes":["drooling"],"tags":["口水","垂涎三尺","脸"],"emoji":"🤤","text":"","type":1,"order":47,"group":0,"subgroup":5,"version":3},{"annotation":"睡着了","name":"SLEEPING FACE","hexcode":"1F634","shortcodes":["exhausted","sleeping"],"tags":["呼噜","打呼","脸"],"emoji":"😴","text":"","type":1,"order":48,"group":0,"subgroup":5,"version":1},{"annotation":"感冒","name":"FACE WITH MEDICAL MASK","hexcode":"1F637","shortcodes":["ill","mask"],"tags":["医生","口罩","生病","脸"],"emoji":"😷","text":"","type":1,"order":49,"group":0,"subgroup":6,"version":0.6},{"annotation":"发烧","name":"FACE WITH THERMOMETER","hexcode":"1F912","shortcodes":["sick"],"tags":["体温计","温度计","生病","脸"],"emoji":"🤒","text":"","type":1,"order":50,"group":0,"subgroup":6,"version":1},{"annotation":"受伤","name":"FACE WITH HEAD-BANDAGE","hexcode":"1F915","shortcodes":["injured"],"tags":["打绷带","脸"],"emoji":"🤕","text":"","type":1,"order":51,"group":0,"subgroup":6,"version":1},{"annotation":"恶心","name":"NAUSEATED FACE","hexcode":"1F922","shortcodes":["nauseated"],"tags":["吐","呕","脸"],"emoji":"🤢","text":"","type":1,"order":52,"group":0,"subgroup":6,"version":3,"emoticon":"%("},{"annotation":"呕吐","name":"FACE WITH OPEN MOUTH VOMITING","hexcode":"1F92E","shortcodes":["vomiting"],"tags":["不舒服","脸"],"emoji":"🤮","text":"","type":1,"order":53,"group":0,"subgroup":6,"version":5},{"annotation":"打喷嚏","name":"SNEEZING FACE","hexcode":"1F927","shortcodes":["sneezing"],"tags":["喷嚏","脸","鼻涕"],"emoji":"🤧","text":"","type":1,"order":54,"group":0,"subgroup":6,"version":3},{"annotation":"脸发烧","name":"OVERHEATED FACE","hexcode":"1F975","shortcodes":["overheating"],"tags":["出汗","发烧","发热","心狂跳","脸红"],"emoji":"🥵","text":"","type":1,"order":55,"group":0,"subgroup":6,"version":11},{"annotation":"冷脸","name":"FREEZING FACE","hexcode":"1F976","shortcodes":["freezing"],"tags":["冷","冷冰冰","冻僵","满面寒霜"],"emoji":"🥶","text":"","type":1,"order":56,"group":0,"subgroup":6,"version":11},{"annotation":"头昏眼花","name":"FACE WITH UNEVEN EYES AND WAVY MOUTH","hexcode":"1F974","shortcodes":["woozy"],"tags":["嘴唇颤抖","头晕眼花","微醺","眼花","醉醺醺"],"emoji":"🥴","text":"","type":1,"order":57,"group":0,"subgroup":6,"version":11,"emoticon":":&"},{"annotation":"晕头转向","name":"DIZZY FACE","hexcode":"1F635","shortcodes":["dizzy"],"tags":["头晕","头晕眼花","晕头","脸"],"emoji":"😵","text":"","type":1,"order":58,"group":0,"subgroup":6,"version":0.6,"emoticon":"xo"},{"annotation":"爆炸头","name":"SHOCKED FACE WITH EXPLODING HEAD","hexcode":"1F92F","shortcodes":["shocked","exploding_head"],"tags":["震惊"],"emoji":"🤯","text":"","type":1,"order":59,"group":0,"subgroup":6,"version":5},{"annotation":"牛仔帽脸","name":"FACE WITH COWBOY HAT","hexcode":"1F920","shortcodes":["cowboy"],"tags":["帽","牛仔","脸"],"emoji":"🤠","text":"","type":1,"order":60,"group":0,"subgroup":7,"version":3},{"annotation":"聚会笑脸","name":"FACE WITH PARTY HORN AND PARTY HAT","hexcode":"1F973","shortcodes":["partying","celebrating"],"tags":["号角","帽子","庆祝","聚会"],"emoji":"🥳","text":"","type":1,"order":61,"group":0,"subgroup":7,"version":11},{"annotation":"伪装的脸","name":"DISGUISED FACE","hexcode":"1F978","shortcodes":["disguised_face"],"tags":["伪装","眼镜","脸","隐瞒身份","鼻子"],"emoji":"🥸","text":"","type":1,"order":62,"group":0,"subgroup":7,"version":13},{"annotation":"墨镜笑脸","name":"SMILING FACE WITH SUNGLASSES","hexcode":"1F60E","shortcodes":["confident"],"tags":["墨镜","太阳镜","眼镜","酷"],"emoji":"😎","text":"","type":1,"order":63,"group":0,"subgroup":8,"version":1,"emoticon":"8)"},{"annotation":"书呆子脸","name":"NERD FACE","hexcode":"1F913","shortcodes":["nerd"],"tags":["奇葩","脸"],"emoji":"🤓","text":"","type":1,"order":64,"group":0,"subgroup":8,"version":1,"emoticon":":B"},{"annotation":"带单片眼镜的脸","name":"FACE WITH MONOCLE","hexcode":"1F9D0","shortcodes":["monocle"],"tags":["古板"],"emoji":"🧐","text":"","type":1,"order":65,"group":0,"subgroup":8,"version":5},{"annotation":"困扰","name":"CONFUSED FACE","hexcode":"1F615","shortcodes":["confused"],"tags":["不懂","困惑","疑惑","脸"],"emoji":"😕","text":"","type":1,"order":66,"group":0,"subgroup":9,"version":1,"emoticon":":/"},{"annotation":"担心","name":"WORRIED FACE","hexcode":"1F61F","shortcodes":["worried"],"tags":["不高兴","伤心","担忧","焦虑","脸"],"emoji":"😟","text":"","type":1,"order":67,"group":0,"subgroup":9,"version":1},{"annotation":"微微不满","name":"SLIGHTLY FROWNING FACE","hexcode":"1F641","shortcodes":["cheerless","slight_frown"],"tags":["不开心","不高兴","委屈","心情不好","脸"],"emoji":"🙁","text":"","type":1,"order":68,"group":0,"subgroup":9,"version":1},{"annotation":"不满","name":"WHITE FROWNING FACE","hexcode":"2639","shortcodes":["sad","frowning"],"tags":["不爽","不高兴","皱眉","脸"],"emoji":"☹️","text":"☹︎","type":0,"order":70,"group":0,"subgroup":9,"version":0.7,"emoticon":":("},{"annotation":"吃惊","name":"FACE WITH OPEN MOUTH","hexcode":"1F62E","shortcodes":["surprised"],"tags":["同情","啊","脸"],"emoji":"😮","text":"","type":1,"order":71,"group":0,"subgroup":9,"version":1},{"annotation":"缄默","name":"HUSHED FACE","hexcode":"1F62F","shortcodes":["hushed"],"tags":["吃惊","脸"],"emoji":"😯","text":"","type":1,"order":72,"group":0,"subgroup":9,"version":1},{"annotation":"震惊","name":"ASTONISHED FACE","hexcode":"1F632","shortcodes":["astonished"],"tags":["惊","惊讶","脸"],"emoji":"😲","text":"","type":1,"order":73,"group":0,"subgroup":9,"version":0.6,"emoticon":":o"},{"annotation":"脸红","name":"FLUSHED FACE","hexcode":"1F633","shortcodes":["flushed"],"tags":["困惑","害羞","羞涩","脸","茫然","迷茫"],"emoji":"😳","text":"","type":1,"order":74,"group":0,"subgroup":9,"version":0.6,"emoticon":":$"},{"annotation":"恳求的脸","name":"FACE WITH PLEADING EYES","hexcode":"1F97A","shortcodes":["pleading"],"tags":["可怜兮兮的眼神","怜悯","祈求"],"emoji":"🥺","text":"","type":1,"order":75,"group":0,"subgroup":9,"version":11},{"annotation":"啊","name":"FROWNING FACE WITH OPEN MOUTH","hexcode":"1F626","shortcodes":["bored"],"tags":["惊讶","目瞪口呆","脸"],"emoji":"😦","text":"","type":1,"order":76,"group":0,"subgroup":9,"version":1},{"annotation":"极度痛苦","name":"ANGUISHED FACE","hexcode":"1F627","shortcodes":["anguished","wtf"],"tags":["痛","脸","难受"],"emoji":"😧","text":"","type":1,"order":77,"group":0,"subgroup":9,"version":1,"emoticon":":s"},{"annotation":"害怕","name":"FEARFUL FACE","hexcode":"1F628","shortcodes":["fearful"],"tags":["怕","恐怖","恐惧","脸"],"emoji":"😨","text":"","type":1,"order":78,"group":0,"subgroup":9,"version":0.6},{"annotation":"冷汗","name":"FACE WITH OPEN MOUTH AND COLD SWEAT","hexcode":"1F630","shortcodes":["cold_sweat","anxious","frustrated"],"tags":["无语","汗","焦虑","紧张","脸"],"emoji":"😰","text":"","type":1,"order":79,"group":0,"subgroup":9,"version":0.6},{"annotation":"失望但如释重负","name":"DISAPPOINTED BUT RELIEVED FACE","hexcode":"1F625","shortcodes":["hopeful"],"tags":["失望","如释重负","脸"],"emoji":"😥","text":"","type":1,"order":80,"group":0,"subgroup":9,"version":0.6},{"annotation":"哭","name":"CRYING FACE","hexcode":"1F622","shortcodes":["upset","cry"],"tags":["伤心","泪","脸"],"emoji":"😢","text":"","type":1,"order":81,"group":0,"subgroup":9,"version":0.6,"emoticon":":'("},{"annotation":"放声大哭","name":"LOUDLY CRYING FACE","hexcode":"1F62D","shortcodes":["distressed","sob"],"tags":["哭","大哭","泪","痛哭","脸"],"emoji":"😭","text":"","type":1,"order":82,"group":0,"subgroup":9,"version":0.6,"emoticon":":'o"},{"annotation":"吓死了","name":"FACE SCREAMING IN FEAR","hexcode":"1F631","shortcodes":["frightened","scream"],"tags":["吓死","害怕","尖叫","恐怖","脸"],"emoji":"😱","text":"","type":1,"order":83,"group":0,"subgroup":9,"version":0.6,"emoticon":"Dx"},{"annotation":"困惑","name":"CONFOUNDED FACE","hexcode":"1F616","shortcodes":["confounded"],"tags":["焦头烂额","纠结","脸"],"emoji":"😖","text":"","type":1,"order":84,"group":0,"subgroup":9,"version":0.6,"emoticon":"x("},{"annotation":"痛苦","name":"PERSEVERING FACE","hexcode":"1F623","shortcodes":["persevered"],"tags":["忍耐","脸","难受"],"emoji":"😣","text":"","type":1,"order":85,"group":0,"subgroup":9,"version":0.6},{"annotation":"失望","name":"DISAPPOINTED FACE","hexcode":"1F61E","shortcodes":["disappointed"],"tags":["不高兴","脸","难过"],"emoji":"😞","text":"","type":1,"order":86,"group":0,"subgroup":9,"version":0.6},{"annotation":"汗","name":"FACE WITH COLD SWEAT","hexcode":"1F613","shortcodes":["shamed"],"tags":["冷","尴尬","脸"],"emoji":"😓","text":"","type":1,"order":87,"group":0,"subgroup":9,"version":0.6,"emoticon":":<"},{"annotation":"累死了","name":"WEARY FACE","hexcode":"1F629","shortcodes":["weary"],"tags":["疲倦","疲劳","疲惫","累","脸"],"emoji":"😩","text":"","type":1,"order":88,"group":0,"subgroup":9,"version":0.6,"emoticon":"D:"},{"annotation":"累","name":"TIRED FACE","hexcode":"1F62B","shortcodes":["tired"],"tags":["疲倦","疲劳","疲惫","脸"],"emoji":"😫","text":"","type":1,"order":89,"group":0,"subgroup":9,"version":0.6,"emoticon":":c"},{"annotation":"打呵欠","name":"YAWNING FACE","hexcode":"1F971","shortcodes":["yawn"],"tags":["呵欠","哈欠","困","无聊","累"],"emoji":"🥱","text":"","type":1,"order":90,"group":0,"subgroup":9,"version":12},{"annotation":"傲慢","name":"FACE WITH LOOK OF TRIUMPH","hexcode":"1F624","shortcodes":["annoyed","hrmph"],"tags":["胜利","自负","赢","趾高气昂"],"emoji":"😤","text":"","type":1,"order":91,"group":0,"subgroup":10,"version":0.6},{"annotation":"怒火中烧","name":"POUTING FACE","hexcode":"1F621","shortcodes":["enraged","pout"],"tags":["发火","发飙","怒","生气","脸"],"emoji":"😡","text":"","type":1,"order":92,"group":0,"subgroup":10,"version":0.6,"emoticon":">:/"},{"annotation":"生气","name":"ANGRY FACE","hexcode":"1F620","shortcodes":["angry"],"tags":["怒","愤怒","脸"],"emoji":"😠","text":"","type":1,"order":93,"group":0,"subgroup":10,"version":0.6},{"annotation":"嘴上有符号的脸","name":"SERIOUS FACE WITH SYMBOLS COVERING MOUTH","hexcode":"1F92C","shortcodes":["censored"],"tags":["发誓","咒骂","脸"],"emoji":"🤬","text":"","type":1,"order":94,"group":0,"subgroup":10,"version":5,"emoticon":":@"},{"annotation":"恶魔微笑","name":"SMILING FACE WITH HORNS","hexcode":"1F608","shortcodes":["imp"],"tags":["幻想","犄角","神话故事","脸"],"emoji":"😈","text":"","type":1,"order":95,"group":0,"subgroup":10,"version":1,"emoticon":">:)"},{"annotation":"生气的恶魔","name":"IMP","hexcode":"1F47F","shortcodes":["angry_imp"],"tags":["幻想","顽童"],"emoji":"👿","text":"","type":1,"order":96,"group":0,"subgroup":10,"version":0.6,"emoticon":">:("},{"annotation":"头骨","name":"SKULL","hexcode":"1F480","shortcodes":["skull"],"tags":["妖怪","死亡","神话故事","脸"],"emoji":"💀","text":"","type":1,"order":97,"group":0,"subgroup":10,"version":0.6},{"annotation":"骷髅","name":"SKULL AND CROSSBONES","hexcode":"2620","shortcodes":["crossbones"],"tags":["头骨","妖怪","死亡","脸","骨头"],"emoji":"☠️","text":"☠︎","type":0,"order":99,"group":0,"subgroup":10,"version":1},{"annotation":"大便","name":"PILE OF POO","hexcode":"1F4A9","shortcodes":["poop"],"tags":["屎","怪物","粑粑","脸"],"emoji":"💩","text":"","type":1,"order":100,"group":0,"subgroup":11,"version":0.6},{"annotation":"小丑脸","name":"CLOWN FACE","hexcode":"1F921","shortcodes":["clown"],"tags":["小丑","脸"],"emoji":"🤡","text":"","type":1,"order":101,"group":0,"subgroup":11,"version":3},{"annotation":"食人魔","name":"JAPANESE OGRE","hexcode":"1F479","shortcodes":["ogre"],"tags":["妖怪","幻想","神话故事","脸","鬼"],"emoji":"👹","text":"","type":1,"order":102,"group":0,"subgroup":11,"version":0.6,"emoticon":">0)"},{"annotation":"小妖精","name":"JAPANESE GOBLIN","hexcode":"1F47A","shortcodes":["goblin"],"tags":["妖怪","幻想","神话故事","脸"],"emoji":"👺","text":"","type":1,"order":103,"group":0,"subgroup":11,"version":0.6},{"annotation":"鬼","name":"GHOST","hexcode":"1F47B","shortcodes":["ghost"],"tags":["妖怪","幻想","幽灵","神话故事","脸"],"emoji":"👻","text":"","type":1,"order":104,"group":0,"subgroup":11,"version":0.6},{"annotation":"外星人","name":"EXTRATERRESTRIAL ALIEN","hexcode":"1F47D","shortcodes":["alien"],"tags":["ufo","外星","太空","幻想","星际","脸"],"emoji":"👽️","text":"👽︎","type":1,"order":105,"group":0,"subgroup":11,"version":0.6},{"annotation":"外星怪物","name":"ALIEN MONSTER","hexcode":"1F47E","shortcodes":["alien_monster","space_invader"],"tags":["ufo","外星","太空","怪物","星际","脸","飞碟"],"emoji":"👾","text":"","type":1,"order":106,"group":0,"subgroup":11,"version":0.6},{"annotation":"机器人","name":"ROBOT FACE","hexcode":"1F916","shortcodes":["robot"],"tags":["怪物"],"emoji":"🤖","text":"","type":1,"order":107,"group":0,"subgroup":11,"version":1},{"annotation":"大笑的猫","name":"SMILING CAT FACE WITH OPEN MOUTH","hexcode":"1F63A","shortcodes":["smiling_cat"],"tags":["哈哈","猫脸","笑","脸"],"emoji":"😺","text":"","type":1,"order":108,"group":0,"subgroup":12,"version":0.6},{"annotation":"微笑的猫","name":"GRINNING CAT FACE WITH SMILING EYES","hexcode":"1F638","shortcodes":["grinning_cat"],"tags":["呵呵","猫脸","笑","脸"],"emoji":"😸","text":"","type":1,"order":109,"group":0,"subgroup":12,"version":0.6},{"annotation":"笑出眼泪的猫","name":"CAT FACE WITH TEARS OF JOY","hexcode":"1F639","shortcodes":["joyful_cat"],"tags":["喜极而泣","快乐","猫脸","眼泪","脸"],"emoji":"😹","text":"","type":1,"order":110,"group":0,"subgroup":12,"version":0.6},{"annotation":"花痴的猫","name":"SMILING CAT FACE WITH HEART-SHAPED EYES","hexcode":"1F63B","shortcodes":["lovestruck_cat"],"tags":["喜欢","心","猫脸","脸","花痴"],"emoji":"😻","text":"","type":1,"order":111,"group":0,"subgroup":12,"version":0.6},{"annotation":"奸笑的猫","name":"CAT FACE WITH WRY SMILE","hexcode":"1F63C","shortcodes":["smirking_cat"],"tags":["奸笑","猫脸","脸","讽刺"],"emoji":"😼","text":"","type":1,"order":112,"group":0,"subgroup":12,"version":0.6},{"annotation":"亲亲猫","name":"KISSING CAT FACE WITH CLOSED EYES","hexcode":"1F63D","shortcodes":["kissing_cat"],"tags":["亲亲","吻","猫脸","脸"],"emoji":"😽","text":"","type":1,"order":113,"group":0,"subgroup":12,"version":0.6,"emoticon":":3"},{"annotation":"疲倦的猫","name":"WEARY CAT FACE","hexcode":"1F640","shortcodes":["weary_cat"],"tags":["惊讶","猫脸","疲倦","累","脸"],"emoji":"🙀","text":"","type":1,"order":114,"group":0,"subgroup":12,"version":0.6},{"annotation":"哭泣的猫","name":"CRYING CAT FACE","hexcode":"1F63F","shortcodes":["crying_cat"],"tags":["哭","猫脸","眼泪","脸","难过"],"emoji":"😿","text":"","type":1,"order":115,"group":0,"subgroup":12,"version":0.6},{"annotation":"生气的猫","name":"POUTING CAT FACE","hexcode":"1F63E","shortcodes":["pouting_cat"],"tags":["猫脸","生气","脸"],"emoji":"😾","text":"","type":1,"order":116,"group":0,"subgroup":12,"version":0.6},{"annotation":"非礼勿视","name":"SEE-NO-EVIL MONKEY","hexcode":"1F648","shortcodes":["see_no_evil"],"tags":["脸","蒙住眼睛","蒙眼"],"emoji":"🙈","text":"","type":1,"order":117,"group":0,"subgroup":13,"version":0.6},{"annotation":"非礼勿听","name":"HEAR-NO-EVIL MONKEY","hexcode":"1F649","shortcodes":["hear_no_evil"],"tags":["堵上耳朵","堵耳","脸"],"emoji":"🙉","text":"","type":1,"order":118,"group":0,"subgroup":13,"version":0.6},{"annotation":"非礼勿言","name":"SPEAK-NO-EVIL MONKEY","hexcode":"1F64A","shortcodes":["speak_no_evil"],"tags":["捂上嘴巴","捂嘴","脸"],"emoji":"🙊","text":"","type":1,"order":119,"group":0,"subgroup":13,"version":0.6},{"annotation":"唇印","name":"KISS MARK","hexcode":"1F48B","shortcodes":["kiss_lips"],"tags":["吻","唇","浪漫"],"emoji":"💋","text":"","type":1,"order":120,"group":0,"subgroup":14,"version":0.6},{"annotation":"情书","name":"LOVE LETTER","hexcode":"1F48C","shortcodes":["love_letter"],"tags":["信","邮件"],"emoji":"💌","text":"","type":1,"order":121,"group":0,"subgroup":14,"version":0.6},{"annotation":"心中箭了","name":"HEART WITH ARROW","hexcode":"1F498","shortcodes":["cupid"],"tags":["丘比特","浪漫","爱情","箭","红心"],"emoji":"💘","text":"","type":1,"order":122,"group":0,"subgroup":14,"version":0.6},{"annotation":"系有缎带的心","name":"HEART WITH RIBBON","hexcode":"1F49D","shortcodes":["heart_ribbon"],"tags":["爱的礼物","送你一颗心"],"emoji":"💝","text":"","type":1,"order":123,"group":0,"subgroup":14,"version":0.6},{"annotation":"闪亮的心","name":"SPARKLING HEART","hexcode":"1F496","shortcodes":["sparkling_heart"],"tags":["激动","红心","闪亮"],"emoji":"💖","text":"","type":1,"order":124,"group":0,"subgroup":14,"version":0.6},{"annotation":"搏动的心","name":"GROWING HEART","hexcode":"1F497","shortcodes":["heartpulse"],"tags":["搏动","激动","紧张","红心"],"emoji":"💗","text":"","type":1,"order":125,"group":0,"subgroup":14,"version":0.6},{"annotation":"心跳","name":"BEATING HEART","hexcode":"1F493","shortcodes":["heartbeat"],"tags":["心动","爱"],"emoji":"💓","text":"","type":1,"order":126,"group":0,"subgroup":14,"version":0.6},{"annotation":"舞动的心","name":"REVOLVING HEARTS","hexcode":"1F49E","shortcodes":["revolving_hearts"],"tags":["旋转","涌动","跃动"],"emoji":"💞","text":"","type":1,"order":127,"group":0,"subgroup":14,"version":0.6},{"annotation":"两颗心","name":"TWO HEARTS","hexcode":"1F495","shortcodes":["two_hearts"],"tags":["爱情"],"emoji":"💕","text":"","type":1,"order":128,"group":0,"subgroup":14,"version":0.6},{"annotation":"心型装饰","name":"HEART DECORATION","hexcode":"1F49F","shortcodes":["heart_decoration"],"tags":["装饰"],"emoji":"💟","text":"","type":1,"order":129,"group":0,"subgroup":14,"version":0.6},{"annotation":"心叹号","name":"HEAVY HEART EXCLAMATION MARK ORNAMENT","hexcode":"2763","shortcodes":["heart_exclamation"],"tags":["叹号","心动"],"emoji":"❣️","text":"❣︎","type":0,"order":131,"group":0,"subgroup":14,"version":1},{"annotation":"心碎","name":"BROKEN HEART","hexcode":"1F494","shortcodes":["broken_heart"],"tags":["伤心"],"emoji":"💔","text":"","type":1,"order":132,"group":0,"subgroup":14,"version":0.6,"emoticon":"</3"},{"annotation":"红心","name":"HEAVY BLACK HEART","hexcode":"2764","shortcodes":["heart"],"tags":["心","爱"],"emoji":"❤️","text":"❤︎","type":0,"order":134,"group":0,"subgroup":14,"version":0.6,"emoticon":"<3"},{"annotation":"橙心","name":"ORANGE HEART","hexcode":"1F9E1","shortcodes":["orange_heart"],"tags":["橙"],"emoji":"🧡","text":"","type":1,"order":135,"group":0,"subgroup":14,"version":5},{"annotation":"黄心","name":"YELLOW HEART","hexcode":"1F49B","shortcodes":["yellow_heart"],"tags":["黄"],"emoji":"💛","text":"","type":1,"order":136,"group":0,"subgroup":14,"version":0.6},{"annotation":"绿心","name":"GREEN HEART","hexcode":"1F49A","shortcodes":["green_heart"],"tags":["绿"],"emoji":"💚","text":"","type":1,"order":137,"group":0,"subgroup":14,"version":0.6},{"annotation":"蓝心","name":"BLUE HEART","hexcode":"1F499","shortcodes":["blue_heart"],"tags":["蓝"],"emoji":"💙","text":"","type":1,"order":138,"group":0,"subgroup":14,"version":0.6},{"annotation":"紫心","name":"PURPLE HEART","hexcode":"1F49C","shortcodes":["purple_heart"],"tags":["紫"],"emoji":"💜","text":"","type":1,"order":139,"group":0,"subgroup":14,"version":0.6},{"annotation":"棕心","name":"BROWN HEART","hexcode":"1F90E","shortcodes":["brown_heart"],"tags":["心","心形","棕"],"emoji":"🤎","text":"","type":1,"order":140,"group":0,"subgroup":14,"version":12},{"annotation":"黑心","name":"BLACK HEART","hexcode":"1F5A4","shortcodes":["black_heart"],"tags":["心","邪恶","黑色"],"emoji":"🖤","text":"","type":1,"order":141,"group":0,"subgroup":14,"version":3},{"annotation":"白心","name":"WHITE HEART","hexcode":"1F90D","shortcodes":["white_heart"],"tags":["心","心形","白"],"emoji":"🤍","text":"","type":1,"order":142,"group":0,"subgroup":14,"version":12},{"annotation":"一百分","name":"HUNDRED POINTS SYMBOL","hexcode":"1F4AF","shortcodes":["100"],"tags":["满分","考试"],"emoji":"💯","text":"","type":1,"order":143,"group":0,"subgroup":14,"version":0.6},{"annotation":"怒","name":"ANGER SYMBOL","hexcode":"1F4A2","shortcodes":["anger"],"tags":["火大","生气","青筋"],"emoji":"💢","text":"","type":1,"order":144,"group":0,"subgroup":14,"version":0.6},{"annotation":"爆炸","name":"COLLISION SYMBOL","hexcode":"1F4A5","shortcodes":["boom","collision"],"tags":["炸","爆"],"emoji":"💥","text":"","type":1,"order":145,"group":0,"subgroup":14,"version":0.6},{"annotation":"头晕","name":"DIZZY SYMBOL","hexcode":"1F4AB","shortcodes":["dizzy_star"],"tags":["头晕目眩"],"emoji":"💫","text":"","type":1,"order":146,"group":0,"subgroup":14,"version":0.6},{"annotation":"汗滴","name":"SPLASHING SWEAT SYMBOL","hexcode":"1F4A6","shortcodes":["sweat_drops"],"tags":["汗"],"emoji":"💦","text":"","type":1,"order":147,"group":0,"subgroup":14,"version":0.6},{"annotation":"尾气","name":"DASH SYMBOL","hexcode":"1F4A8","shortcodes":["dash"],"tags":["疾驰而去","飞奔而去"],"emoji":"💨","text":"","type":1,"order":148,"group":0,"subgroup":14,"version":0.6},{"annotation":"洞","name":"HOLE","hexcode":"1F573","shortcodes":["hole"],"tags":["坑","陷阱"],"emoji":"🕳️","text":"🕳︎","type":0,"order":150,"group":0,"subgroup":14,"version":0.7},{"annotation":"炸弹","name":"BOMB","hexcode":"1F4A3","shortcodes":["bomb"],"tags":["爆炸"],"emoji":"💣️","text":"💣︎","type":1,"order":151,"group":0,"subgroup":14,"version":0.6},{"annotation":"话语气泡","name":"SPEECH BALLOON","hexcode":"1F4AC","shortcodes":["speech"],"tags":["发言","对话框","气泡"],"emoji":"💬","text":"","type":1,"order":152,"group":0,"subgroup":14,"version":0.6},{"annotation":"眼睛对话框","name":"EYE, LEFT SPEECH BUBBLE","hexcode":"1F441-FE0F-200D-1F5E8-FE0F","shortcodes":["eye_bubble"],"tags":["对话框","眼睛"],"emoji":"👁️‍🗨️","text":"","type":1,"order":153,"group":0,"subgroup":14,"version":2},{"annotation":"朝左的话语气泡","name":"LEFT SPEECH BUBBLE","hexcode":"1F5E8","shortcodes":["left_speech"],"tags":["对话框","话语"],"emoji":"🗨️","text":"🗨︎","type":0,"order":158,"group":0,"subgroup":14,"version":2},{"annotation":"愤怒话语气泡","name":"RIGHT ANGER BUBBLE","hexcode":"1F5EF","shortcodes":["right_anger_speech"],"tags":["对话框","愤怒"],"emoji":"🗯️","text":"🗯︎","type":0,"order":160,"group":0,"subgroup":14,"version":0.7},{"annotation":"内心活动气泡","name":"THOUGHT BALLOON","hexcode":"1F4AD","shortcodes":["thought"],"tags":["对话框","思想活动","气泡"],"emoji":"💭","text":"","type":1,"order":161,"group":0,"subgroup":14,"version":1},{"annotation":"睡着","name":"SLEEPING SYMBOL","hexcode":"1F4A4","shortcodes":["zzz"],"tags":["呼噜","打呼"],"emoji":"💤","text":"","type":1,"order":162,"group":0,"subgroup":14,"version":0.6},{"annotation":"挥手","name":"WAVING HAND SIGN","hexcode":"1F44B","shortcodes":["wave"],"tags":["你好","再见"],"emoji":"👋","text":"","type":1,"order":163,"group":1,"subgroup":15,"version":0.6,"skins":[{"annotation":"挥手: 较浅肤色","name":"WAVING HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F44B-1F3FB","shortcodes":["wave_tone1"],"emoji":"👋🏻","text":"","type":1,"order":164,"group":1,"subgroup":15,"version":1,"tone":1},{"annotation":"挥手: 中等-浅肤色","name":"WAVING HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F44B-1F3FC","shortcodes":["wave_tone2"],"emoji":"👋🏼","text":"","type":1,"order":165,"group":1,"subgroup":15,"version":1,"tone":2},{"annotation":"挥手: 中等肤色","name":"WAVING HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F44B-1F3FD","shortcodes":["wave_tone3"],"emoji":"👋🏽","text":"","type":1,"order":166,"group":1,"subgroup":15,"version":1,"tone":3},{"annotation":"挥手: 中等-深肤色","name":"WAVING HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F44B-1F3FE","shortcodes":["wave_tone4"],"emoji":"👋🏾","text":"","type":1,"order":167,"group":1,"subgroup":15,"version":1,"tone":4},{"annotation":"挥手: 较深肤色","name":"WAVING HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F44B-1F3FF","shortcodes":["wave_tone5"],"emoji":"👋🏿","text":"","type":1,"order":168,"group":1,"subgroup":15,"version":1,"tone":5}]},{"annotation":"立起的手背","name":"RAISED BACK OF HAND","hexcode":"1F91A","shortcodes":["raised_backhand"],"tags":["手","手背","立起"],"emoji":"🤚","text":"","type":1,"order":169,"group":1,"subgroup":15,"version":3,"skins":[{"annotation":"立起的手背: 较浅肤色","name":"RAISED BACK OF HAND, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F91A-1F3FB","shortcodes":["raised_backhand_tone1"],"emoji":"🤚🏻","text":"","type":1,"order":170,"group":1,"subgroup":15,"version":3,"tone":1},{"annotation":"立起的手背: 中等-浅肤色","name":"RAISED BACK OF HAND, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F91A-1F3FC","shortcodes":["raised_backhand_tone2"],"emoji":"🤚🏼","text":"","type":1,"order":171,"group":1,"subgroup":15,"version":3,"tone":2},{"annotation":"立起的手背: 中等肤色","name":"RAISED BACK OF HAND, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F91A-1F3FD","shortcodes":["raised_backhand_tone3"],"emoji":"🤚🏽","text":"","type":1,"order":172,"group":1,"subgroup":15,"version":3,"tone":3},{"annotation":"立起的手背: 中等-深肤色","name":"RAISED BACK OF HAND, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F91A-1F3FE","shortcodes":["raised_backhand_tone4"],"emoji":"🤚🏾","text":"","type":1,"order":173,"group":1,"subgroup":15,"version":3,"tone":4},{"annotation":"立起的手背: 较深肤色","name":"RAISED BACK OF HAND, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F91A-1F3FF","shortcodes":["raised_backhand_tone5"],"emoji":"🤚🏿","text":"","type":1,"order":174,"group":1,"subgroup":15,"version":3,"tone":5}]},{"annotation":"手掌","name":"RAISED HAND WITH FINGERS SPLAYED","hexcode":"1F590","shortcodes":["splayed_hand"],"tags":["击掌","布","手","禁止"],"emoji":"🖐️","text":"🖐︎","type":0,"order":176,"group":1,"subgroup":15,"version":0.7,"skins":[{"annotation":"手掌: 较浅肤色","name":"RAISED HAND WITH FINGERS SPLAYED, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F590-1F3FB","shortcodes":["splayed_hand_tone1"],"emoji":"🖐🏻","text":"","type":1,"order":177,"group":1,"subgroup":15,"version":1,"tone":1},{"annotation":"手掌: 中等-浅肤色","name":"RAISED HAND WITH FINGERS SPLAYED, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F590-1F3FC","shortcodes":["splayed_hand_tone2"],"emoji":"🖐🏼","text":"","type":1,"order":178,"group":1,"subgroup":15,"version":1,"tone":2},{"annotation":"手掌: 中等肤色","name":"RAISED HAND WITH FINGERS SPLAYED, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F590-1F3FD","shortcodes":["splayed_hand_tone3"],"emoji":"🖐🏽","text":"","type":1,"order":179,"group":1,"subgroup":15,"version":1,"tone":3},{"annotation":"手掌: 中等-深肤色","name":"RAISED HAND WITH FINGERS SPLAYED, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F590-1F3FE","shortcodes":["splayed_hand_tone4"],"emoji":"🖐🏾","text":"","type":1,"order":180,"group":1,"subgroup":15,"version":1,"tone":4},{"annotation":"手掌: 较深肤色","name":"RAISED HAND WITH FINGERS SPLAYED, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F590-1F3FF","shortcodes":["splayed_hand_tone5"],"emoji":"🖐🏿","text":"","type":1,"order":181,"group":1,"subgroup":15,"version":1,"tone":5}]},{"annotation":"举起手","name":"RAISED HAND","hexcode":"270B","shortcodes":["raised_hand"],"tags":["举手","手"],"emoji":"✋","text":"","type":1,"order":182,"group":1,"subgroup":15,"version":0.6,"skins":[{"annotation":"举起手: 较浅肤色","name":"RAISED HAND, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"270B-1F3FB","shortcodes":["raised_hand_tone1"],"emoji":"✋🏻","text":"","type":1,"order":183,"group":1,"subgroup":15,"version":1,"tone":1},{"annotation":"举起手: 中等-浅肤色","name":"RAISED HAND, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"270B-1F3FC","shortcodes":["raised_hand_tone2"],"emoji":"✋🏼","text":"","type":1,"order":184,"group":1,"subgroup":15,"version":1,"tone":2},{"annotation":"举起手: 中等肤色","name":"RAISED HAND, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"270B-1F3FD","shortcodes":["raised_hand_tone3"],"emoji":"✋🏽","text":"","type":1,"order":185,"group":1,"subgroup":15,"version":1,"tone":3},{"annotation":"举起手: 中等-深肤色","name":"RAISED HAND, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"270B-1F3FE","shortcodes":["raised_hand_tone4"],"emoji":"✋🏾","text":"","type":1,"order":186,"group":1,"subgroup":15,"version":1,"tone":4},{"annotation":"举起手: 较深肤色","name":"RAISED HAND, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"270B-1F3FF","shortcodes":["raised_hand_tone5"],"emoji":"✋🏿","text":"","type":1,"order":187,"group":1,"subgroup":15,"version":1,"tone":5}]},{"annotation":"瓦肯举手礼","name":"RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS","hexcode":"1F596","shortcodes":["vulcan"],"tags":["手","敬礼","斯波克","星际迷航","瓦肯"],"emoji":"🖖","text":"","type":1,"order":188,"group":1,"subgroup":15,"version":1,"skins":[{"annotation":"瓦肯举手礼: 较浅肤色","name":"RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F596-1F3FB","shortcodes":["vulcan_tone1"],"emoji":"🖖🏻","text":"","type":1,"order":189,"group":1,"subgroup":15,"version":1,"tone":1},{"annotation":"瓦肯举手礼: 中等-浅肤色","name":"RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F596-1F3FC","shortcodes":["vulcan_tone2"],"emoji":"🖖🏼","text":"","type":1,"order":190,"group":1,"subgroup":15,"version":1,"tone":2},{"annotation":"瓦肯举手礼: 中等肤色","name":"RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F596-1F3FD","shortcodes":["vulcan_tone3"],"emoji":"🖖🏽","text":"","type":1,"order":191,"group":1,"subgroup":15,"version":1,"tone":3},{"annotation":"瓦肯举手礼: 中等-深肤色","name":"RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F596-1F3FE","shortcodes":["vulcan_tone4"],"emoji":"🖖🏾","text":"","type":1,"order":192,"group":1,"subgroup":15,"version":1,"tone":4},{"annotation":"瓦肯举手礼: 较深肤色","name":"RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F596-1F3FF","shortcodes":["vulcan_tone5"],"emoji":"🖖🏿","text":"","type":1,"order":193,"group":1,"subgroup":15,"version":1,"tone":5}]},{"annotation":"OK","name":"OK HAND SIGN","hexcode":"1F44C","shortcodes":["ok_hand"],"tags":["ok","手"],"emoji":"👌","text":"","type":1,"order":194,"group":1,"subgroup":16,"version":0.6,"skins":[{"annotation":"OK: 较浅肤色","name":"OK HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F44C-1F3FB","shortcodes":["ok_hand_tone1"],"emoji":"👌🏻","text":"","type":1,"order":195,"group":1,"subgroup":16,"version":1,"tone":1},{"annotation":"OK: 中等-浅肤色","name":"OK HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F44C-1F3FC","shortcodes":["ok_hand_tone2"],"emoji":"👌🏼","text":"","type":1,"order":196,"group":1,"subgroup":16,"version":1,"tone":2},{"annotation":"OK: 中等肤色","name":"OK HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F44C-1F3FD","shortcodes":["ok_hand_tone3"],"emoji":"👌🏽","text":"","type":1,"order":197,"group":1,"subgroup":16,"version":1,"tone":3},{"annotation":"OK: 中等-深肤色","name":"OK HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F44C-1F3FE","shortcodes":["ok_hand_tone4"],"emoji":"👌🏾","text":"","type":1,"order":198,"group":1,"subgroup":16,"version":1,"tone":4},{"annotation":"OK: 较深肤色","name":"OK HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F44C-1F3FF","shortcodes":["ok_hand_tone5"],"emoji":"👌🏿","text":"","type":1,"order":199,"group":1,"subgroup":16,"version":1,"tone":5}]},{"annotation":"捏手指","name":"PINCHED FINGERS","hexcode":"1F90C","shortcodes":["pinched_fingers"],"tags":["匮乏","审讯","手势","手指","挖苦"],"emoji":"🤌","text":"","type":1,"order":200,"group":1,"subgroup":16,"version":13,"skins":[{"annotation":"捏手指: 较浅肤色","name":"PINCHED FINGERS, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F90C-1F3FB","shortcodes":["pinched_fingers_tone1"],"emoji":"🤌🏻","text":"","type":1,"order":201,"group":1,"subgroup":16,"version":13,"tone":1},{"annotation":"捏手指: 中等-浅肤色","name":"PINCHED FINGERS, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F90C-1F3FC","shortcodes":["pinched_fingers_tone2"],"emoji":"🤌🏼","text":"","type":1,"order":202,"group":1,"subgroup":16,"version":13,"tone":2},{"annotation":"捏手指: 中等肤色","name":"PINCHED FINGERS, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F90C-1F3FD","shortcodes":["pinched_fingers_tone3"],"emoji":"🤌🏽","text":"","type":1,"order":203,"group":1,"subgroup":16,"version":13,"tone":3},{"annotation":"捏手指: 中等-深肤色","name":"PINCHED FINGERS, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F90C-1F3FE","shortcodes":["pinched_fingers_tone4"],"emoji":"🤌🏾","text":"","type":1,"order":204,"group":1,"subgroup":16,"version":13,"tone":4},{"annotation":"捏手指: 较深肤色","name":"PINCHED FINGERS, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F90C-1F3FF","shortcodes":["pinched_fingers_tone5"],"emoji":"🤌🏿","text":"","type":1,"order":205,"group":1,"subgroup":16,"version":13,"tone":5}]},{"annotation":"捏合的手势","name":"PINCHING HAND","hexcode":"1F90F","shortcodes":["pinch"],"tags":["一点","小","少量"],"emoji":"🤏","text":"","type":1,"order":206,"group":1,"subgroup":16,"version":12,"skins":[{"annotation":"捏合的手势: 较浅肤色","name":"PINCHING HAND, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F90F-1F3FB","shortcodes":["pinch_tone1"],"emoji":"🤏🏻","text":"","type":1,"order":207,"group":1,"subgroup":16,"version":12,"tone":1},{"annotation":"捏合的手势: 中等-浅肤色","name":"PINCHING HAND, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F90F-1F3FC","shortcodes":["pinch_tone2"],"emoji":"🤏🏼","text":"","type":1,"order":208,"group":1,"subgroup":16,"version":12,"tone":2},{"annotation":"捏合的手势: 中等肤色","name":"PINCHING HAND, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F90F-1F3FD","shortcodes":["pinch_tone3"],"emoji":"🤏🏽","text":"","type":1,"order":209,"group":1,"subgroup":16,"version":12,"tone":3},{"annotation":"捏合的手势: 中等-深肤色","name":"PINCHING HAND, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F90F-1F3FE","shortcodes":["pinch_tone4"],"emoji":"🤏🏾","text":"","type":1,"order":210,"group":1,"subgroup":16,"version":12,"tone":4},{"annotation":"捏合的手势: 较深肤色","name":"PINCHING HAND, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F90F-1F3FF","shortcodes":["pinch_tone5"],"emoji":"🤏🏿","text":"","type":1,"order":211,"group":1,"subgroup":16,"version":12,"tone":5}]},{"annotation":"胜利手势","name":"VICTORY HAND","hexcode":"270C","shortcodes":["victory"],"tags":["v","成功","手","胜利"],"emoji":"✌️","text":"✌︎","type":0,"order":213,"group":1,"subgroup":16,"version":0.6,"skins":[{"annotation":"胜利手势: 较浅肤色","name":"VICTORY HAND, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"270C-1F3FB","shortcodes":["victory_tone1"],"emoji":"✌🏻","text":"","type":1,"order":214,"group":1,"subgroup":16,"version":1,"tone":1},{"annotation":"胜利手势: 中等-浅肤色","name":"VICTORY HAND, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"270C-1F3FC","shortcodes":["victory_tone2"],"emoji":"✌🏼","text":"","type":1,"order":215,"group":1,"subgroup":16,"version":1,"tone":2},{"annotation":"胜利手势: 中等肤色","name":"VICTORY HAND, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"270C-1F3FD","shortcodes":["victory_tone3"],"emoji":"✌🏽","text":"","type":1,"order":216,"group":1,"subgroup":16,"version":1,"tone":3},{"annotation":"胜利手势: 中等-深肤色","name":"VICTORY HAND, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"270C-1F3FE","shortcodes":["victory_tone4"],"emoji":"✌🏾","text":"","type":1,"order":217,"group":1,"subgroup":16,"version":1,"tone":4},{"annotation":"胜利手势: 较深肤色","name":"VICTORY HAND, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"270C-1F3FF","shortcodes":["victory_tone5"],"emoji":"✌🏿","text":"","type":1,"order":218,"group":1,"subgroup":16,"version":1,"tone":5}]},{"annotation":"交叉的手指","name":"HAND WITH INDEX AND MIDDLE FINGERS CROSSED","hexcode":"1F91E","shortcodes":["fingers_crossed"],"tags":["交叉","幸运","手","手指"],"emoji":"🤞","text":"","type":1,"order":219,"group":1,"subgroup":16,"version":3,"skins":[{"annotation":"交叉的手指: 较浅肤色","name":"HAND WITH INDEX AND MIDDLE FINGERS CROSSED, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F91E-1F3FB","shortcodes":["fingers_crossed_tone1"],"emoji":"🤞🏻","text":"","type":1,"order":220,"group":1,"subgroup":16,"version":3,"tone":1},{"annotation":"交叉的手指: 中等-浅肤色","name":"HAND WITH INDEX AND MIDDLE FINGERS CROSSED, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F91E-1F3FC","shortcodes":["fingers_crossed_tone2"],"emoji":"🤞🏼","text":"","type":1,"order":221,"group":1,"subgroup":16,"version":3,"tone":2},{"annotation":"交叉的手指: 中等肤色","name":"HAND WITH INDEX AND MIDDLE FINGERS CROSSED, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F91E-1F3FD","shortcodes":["fingers_crossed_tone3"],"emoji":"🤞🏽","text":"","type":1,"order":222,"group":1,"subgroup":16,"version":3,"tone":3},{"annotation":"交叉的手指: 中等-深肤色","name":"HAND WITH INDEX AND MIDDLE FINGERS CROSSED, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F91E-1F3FE","shortcodes":["fingers_crossed_tone4"],"emoji":"🤞🏾","text":"","type":1,"order":223,"group":1,"subgroup":16,"version":3,"tone":4},{"annotation":"交叉的手指: 较深肤色","name":"HAND WITH INDEX AND MIDDLE FINGERS CROSSED, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F91E-1F3FF","shortcodes":["fingers_crossed_tone5"],"emoji":"🤞🏿","text":"","type":1,"order":224,"group":1,"subgroup":16,"version":3,"tone":5}]},{"annotation":"爱你的手势","name":"I LOVE YOU HAND SIGN","hexcode":"1F91F","shortcodes":["love_you_gesture"],"tags":["我爱你","手"],"emoji":"🤟","text":"","type":1,"order":225,"group":1,"subgroup":16,"version":5,"skins":[{"annotation":"爱你的手势: 较浅肤色","name":"I LOVE YOU HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F91F-1F3FB","shortcodes":["love_you_gesture_tone1"],"emoji":"🤟🏻","text":"","type":1,"order":226,"group":1,"subgroup":16,"version":5,"tone":1},{"annotation":"爱你的手势: 中等-浅肤色","name":"I LOVE YOU HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F91F-1F3FC","shortcodes":["love_you_gesture_tone2"],"emoji":"🤟🏼","text":"","type":1,"order":227,"group":1,"subgroup":16,"version":5,"tone":2},{"annotation":"爱你的手势: 中等肤色","name":"I LOVE YOU HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F91F-1F3FD","shortcodes":["love_you_gesture_tone3"],"emoji":"🤟🏽","text":"","type":1,"order":228,"group":1,"subgroup":16,"version":5,"tone":3},{"annotation":"爱你的手势: 中等-深肤色","name":"I LOVE YOU HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F91F-1F3FE","shortcodes":["love_you_gesture_tone4"],"emoji":"🤟🏾","text":"","type":1,"order":229,"group":1,"subgroup":16,"version":5,"tone":4},{"annotation":"爱你的手势: 较深肤色","name":"I LOVE YOU HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F91F-1F3FF","shortcodes":["love_you_gesture_tone5"],"emoji":"🤟🏿","text":"","type":1,"order":230,"group":1,"subgroup":16,"version":5,"tone":5}]},{"annotation":"摇滚","name":"SIGN OF THE HORNS","hexcode":"1F918","shortcodes":["metal"],"tags":["手","角","金属礼"],"emoji":"🤘","text":"","type":1,"order":231,"group":1,"subgroup":16,"version":1,"emoticon":"\\\\m/","skins":[{"annotation":"摇滚: 较浅肤色","name":"SIGN OF THE HORNS, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F918-1F3FB","shortcodes":["metal_tone1"],"emoji":"🤘🏻","text":"","type":1,"order":232,"group":1,"subgroup":16,"version":1,"tone":1},{"annotation":"摇滚: 中等-浅肤色","name":"SIGN OF THE HORNS, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F918-1F3FC","shortcodes":["metal_tone2"],"emoji":"🤘🏼","text":"","type":1,"order":233,"group":1,"subgroup":16,"version":1,"tone":2},{"annotation":"摇滚: 中等肤色","name":"SIGN OF THE HORNS, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F918-1F3FD","shortcodes":["metal_tone3"],"emoji":"🤘🏽","text":"","type":1,"order":234,"group":1,"subgroup":16,"version":1,"tone":3},{"annotation":"摇滚: 中等-深肤色","name":"SIGN OF THE HORNS, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F918-1F3FE","shortcodes":["metal_tone4"],"emoji":"🤘🏾","text":"","type":1,"order":235,"group":1,"subgroup":16,"version":1,"tone":4},{"annotation":"摇滚: 较深肤色","name":"SIGN OF THE HORNS, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F918-1F3FF","shortcodes":["metal_tone5"],"emoji":"🤘🏿","text":"","type":1,"order":236,"group":1,"subgroup":16,"version":1,"tone":5}]},{"annotation":"给我打电话","name":"CALL ME HAND","hexcode":"1F919","shortcodes":["call_me"],"tags":["手","电话"],"emoji":"🤙","text":"","type":1,"order":237,"group":1,"subgroup":16,"version":3,"skins":[{"annotation":"给我打电话: 较浅肤色","name":"CALL ME HAND, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F919-1F3FB","shortcodes":["call_me_tone1"],"emoji":"🤙🏻","text":"","type":1,"order":238,"group":1,"subgroup":16,"version":3,"tone":1},{"annotation":"给我打电话: 中等-浅肤色","name":"CALL ME HAND, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F919-1F3FC","shortcodes":["call_me_tone2"],"emoji":"🤙🏼","text":"","type":1,"order":239,"group":1,"subgroup":16,"version":3,"tone":2},{"annotation":"给我打电话: 中等肤色","name":"CALL ME HAND, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F919-1F3FD","shortcodes":["call_me_tone3"],"emoji":"🤙🏽","text":"","type":1,"order":240,"group":1,"subgroup":16,"version":3,"tone":3},{"annotation":"给我打电话: 中等-深肤色","name":"CALL ME HAND, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F919-1F3FE","shortcodes":["call_me_tone4"],"emoji":"🤙🏾","text":"","type":1,"order":241,"group":1,"subgroup":16,"version":3,"tone":4},{"annotation":"给我打电话: 较深肤色","name":"CALL ME HAND, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F919-1F3FF","shortcodes":["call_me_tone5"],"emoji":"🤙🏿","text":"","type":1,"order":242,"group":1,"subgroup":16,"version":3,"tone":5}]},{"annotation":"反手食指向左指","name":"WHITE LEFT POINTING BACKHAND INDEX","hexcode":"1F448","shortcodes":["point_left"],"tags":["反手","向左指","手","指左","食指"],"emoji":"👈️","text":"👈︎","type":1,"order":243,"group":1,"subgroup":17,"version":0.6,"skins":[{"annotation":"反手食指向左指: 较浅肤色","name":"WHITE LEFT POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F448-1F3FB","shortcodes":["point_left_tone1"],"emoji":"👈🏻","text":"","type":1,"order":244,"group":1,"subgroup":17,"version":1,"tone":1},{"annotation":"反手食指向左指: 中等-浅肤色","name":"WHITE LEFT POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F448-1F3FC","shortcodes":["point_left_tone2"],"emoji":"👈🏼","text":"","type":1,"order":245,"group":1,"subgroup":17,"version":1,"tone":2},{"annotation":"反手食指向左指: 中等肤色","name":"WHITE LEFT POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F448-1F3FD","shortcodes":["point_left_tone3"],"emoji":"👈🏽","text":"","type":1,"order":246,"group":1,"subgroup":17,"version":1,"tone":3},{"annotation":"反手食指向左指: 中等-深肤色","name":"WHITE LEFT POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F448-1F3FE","shortcodes":["point_left_tone4"],"emoji":"👈🏾","text":"","type":1,"order":247,"group":1,"subgroup":17,"version":1,"tone":4},{"annotation":"反手食指向左指: 较深肤色","name":"WHITE LEFT POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F448-1F3FF","shortcodes":["point_left_tone5"],"emoji":"👈🏿","text":"","type":1,"order":248,"group":1,"subgroup":17,"version":1,"tone":5}]},{"annotation":"反手食指向右指","name":"WHITE RIGHT POINTING BACKHAND INDEX","hexcode":"1F449","shortcodes":["point_right"],"tags":["反手","向右指","手","指右","食指"],"emoji":"👉️","text":"👉︎","type":1,"order":249,"group":1,"subgroup":17,"version":0.6,"skins":[{"annotation":"反手食指向右指: 较浅肤色","name":"WHITE RIGHT POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F449-1F3FB","shortcodes":["point_right_tone1"],"emoji":"👉🏻","text":"","type":1,"order":250,"group":1,"subgroup":17,"version":1,"tone":1},{"annotation":"反手食指向右指: 中等-浅肤色","name":"WHITE RIGHT POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F449-1F3FC","shortcodes":["point_right_tone2"],"emoji":"👉🏼","text":"","type":1,"order":251,"group":1,"subgroup":17,"version":1,"tone":2},{"annotation":"反手食指向右指: 中等肤色","name":"WHITE RIGHT POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F449-1F3FD","shortcodes":["point_right_tone3"],"emoji":"👉🏽","text":"","type":1,"order":252,"group":1,"subgroup":17,"version":1,"tone":3},{"annotation":"反手食指向右指: 中等-深肤色","name":"WHITE RIGHT POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F449-1F3FE","shortcodes":["point_right_tone4"],"emoji":"👉🏾","text":"","type":1,"order":253,"group":1,"subgroup":17,"version":1,"tone":4},{"annotation":"反手食指向右指: 较深肤色","name":"WHITE RIGHT POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F449-1F3FF","shortcodes":["point_right_tone5"],"emoji":"👉🏿","text":"","type":1,"order":254,"group":1,"subgroup":17,"version":1,"tone":5}]},{"annotation":"反手食指向上指","name":"WHITE UP POINTING BACKHAND INDEX","hexcode":"1F446","shortcodes":["backhand_point_up"],"tags":["反手","向上指","手","指上","食指"],"emoji":"👆️","text":"👆︎","type":1,"order":255,"group":1,"subgroup":17,"version":0.6,"skins":[{"annotation":"反手食指向上指: 较浅肤色","name":"WHITE UP POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F446-1F3FB","shortcodes":["backhand_point_up_tone1"],"emoji":"👆🏻","text":"","type":1,"order":256,"group":1,"subgroup":17,"version":1,"tone":1},{"annotation":"反手食指向上指: 中等-浅肤色","name":"WHITE UP POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F446-1F3FC","shortcodes":["backhand_point_up_tone2"],"emoji":"👆🏼","text":"","type":1,"order":257,"group":1,"subgroup":17,"version":1,"tone":2},{"annotation":"反手食指向上指: 中等肤色","name":"WHITE UP POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F446-1F3FD","shortcodes":["backhand_point_up_tone3"],"emoji":"👆🏽","text":"","type":1,"order":258,"group":1,"subgroup":17,"version":1,"tone":3},{"annotation":"反手食指向上指: 中等-深肤色","name":"WHITE UP POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F446-1F3FE","shortcodes":["backhand_point_up_tone4"],"emoji":"👆🏾","text":"","type":1,"order":259,"group":1,"subgroup":17,"version":1,"tone":4},{"annotation":"反手食指向上指: 较深肤色","name":"WHITE UP POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F446-1F3FF","shortcodes":["backhand_point_up_tone5"],"emoji":"👆🏿","text":"","type":1,"order":260,"group":1,"subgroup":17,"version":1,"tone":5}]},{"annotation":"竖中指","name":"REVERSED HAND WITH MIDDLE FINGER EXTENDED","hexcode":"1F595","shortcodes":["middle_finger"],"tags":["中指","反手","手"],"emoji":"🖕","text":"","type":1,"order":261,"group":1,"subgroup":17,"version":1,"skins":[{"annotation":"竖中指: 较浅肤色","name":"REVERSED HAND WITH MIDDLE FINGER EXTENDED, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F595-1F3FB","shortcodes":["middle_finger_tone1"],"emoji":"🖕🏻","text":"","type":1,"order":262,"group":1,"subgroup":17,"version":1,"tone":1},{"annotation":"竖中指: 中等-浅肤色","name":"REVERSED HAND WITH MIDDLE FINGER EXTENDED, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F595-1F3FC","shortcodes":["middle_finger_tone2"],"emoji":"🖕🏼","text":"","type":1,"order":263,"group":1,"subgroup":17,"version":1,"tone":2},{"annotation":"竖中指: 中等肤色","name":"REVERSED HAND WITH MIDDLE FINGER EXTENDED, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F595-1F3FD","shortcodes":["middle_finger_tone3"],"emoji":"🖕🏽","text":"","type":1,"order":264,"group":1,"subgroup":17,"version":1,"tone":3},{"annotation":"竖中指: 中等-深肤色","name":"REVERSED HAND WITH MIDDLE FINGER EXTENDED, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F595-1F3FE","shortcodes":["middle_finger_tone4"],"emoji":"🖕🏾","text":"","type":1,"order":265,"group":1,"subgroup":17,"version":1,"tone":4},{"annotation":"竖中指: 较深肤色","name":"REVERSED HAND WITH MIDDLE FINGER EXTENDED, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F595-1F3FF","shortcodes":["middle_finger_tone5"],"emoji":"🖕🏿","text":"","type":1,"order":266,"group":1,"subgroup":17,"version":1,"tone":5}]},{"annotation":"反手食指向下指","name":"WHITE DOWN POINTING BACKHAND INDEX","hexcode":"1F447","shortcodes":["point_down"],"tags":["反手","向下指","手","指下","食指"],"emoji":"👇️","text":"👇︎","type":1,"order":267,"group":1,"subgroup":17,"version":0.6,"skins":[{"annotation":"反手食指向下指: 较浅肤色","name":"WHITE DOWN POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F447-1F3FB","shortcodes":["point_down_tone1"],"emoji":"👇🏻","text":"","type":1,"order":268,"group":1,"subgroup":17,"version":1,"tone":1},{"annotation":"反手食指向下指: 中等-浅肤色","name":"WHITE DOWN POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F447-1F3FC","shortcodes":["point_down_tone2"],"emoji":"👇🏼","text":"","type":1,"order":269,"group":1,"subgroup":17,"version":1,"tone":2},{"annotation":"反手食指向下指: 中等肤色","name":"WHITE DOWN POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F447-1F3FD","shortcodes":["point_down_tone3"],"emoji":"👇🏽","text":"","type":1,"order":270,"group":1,"subgroup":17,"version":1,"tone":3},{"annotation":"反手食指向下指: 中等-深肤色","name":"WHITE DOWN POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F447-1F3FE","shortcodes":["point_down_tone4"],"emoji":"👇🏾","text":"","type":1,"order":271,"group":1,"subgroup":17,"version":1,"tone":4},{"annotation":"反手食指向下指: 较深肤色","name":"WHITE DOWN POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F447-1F3FF","shortcodes":["point_down_tone5"],"emoji":"👇🏿","text":"","type":1,"order":272,"group":1,"subgroup":17,"version":1,"tone":5}]},{"annotation":"食指向上指","name":"WHITE UP POINTING INDEX","hexcode":"261D","shortcodes":["point_up"],"tags":["向上指","手","指上","食指"],"emoji":"☝️","text":"☝︎","type":0,"order":274,"group":1,"subgroup":17,"version":0.6,"skins":[{"annotation":"食指向上指: 较浅肤色","name":"WHITE UP POINTING INDEX, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"261D-1F3FB","shortcodes":["point_up_tone1"],"emoji":"☝🏻","text":"","type":1,"order":275,"group":1,"subgroup":17,"version":1,"tone":1},{"annotation":"食指向上指: 中等-浅肤色","name":"WHITE UP POINTING INDEX, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"261D-1F3FC","shortcodes":["point_up_tone2"],"emoji":"☝🏼","text":"","type":1,"order":276,"group":1,"subgroup":17,"version":1,"tone":2},{"annotation":"食指向上指: 中等肤色","name":"WHITE UP POINTING INDEX, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"261D-1F3FD","shortcodes":["point_up_tone3"],"emoji":"☝🏽","text":"","type":1,"order":277,"group":1,"subgroup":17,"version":1,"tone":3},{"annotation":"食指向上指: 中等-深肤色","name":"WHITE UP POINTING INDEX, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"261D-1F3FE","shortcodes":["point_up_tone4"],"emoji":"☝🏾","text":"","type":1,"order":278,"group":1,"subgroup":17,"version":1,"tone":4},{"annotation":"食指向上指: 较深肤色","name":"WHITE UP POINTING INDEX, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"261D-1F3FF","shortcodes":["point_up_tone5"],"emoji":"☝🏿","text":"","type":1,"order":279,"group":1,"subgroup":17,"version":1,"tone":5}]},{"annotation":"拇指向上","name":"THUMBS UP SIGN","hexcode":"1F44D","shortcodes":["thumbsup","+1","yes"],"tags":["同意","手","真棒","赞成","顶一下"],"emoji":"👍️","text":"👍︎","type":1,"order":280,"group":1,"subgroup":18,"version":0.6,"skins":[{"annotation":"拇指向上: 较浅肤色","name":"THUMBS UP SIGN, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F44D-1F3FB","shortcodes":["thumbsup_tone1","+1_tone1","yes_tone1"],"emoji":"👍🏻","text":"","type":1,"order":281,"group":1,"subgroup":18,"version":1,"tone":1},{"annotation":"拇指向上: 中等-浅肤色","name":"THUMBS UP SIGN, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F44D-1F3FC","shortcodes":["thumbsup_tone2","+1_tone2","yes_tone2"],"emoji":"👍🏼","text":"","type":1,"order":282,"group":1,"subgroup":18,"version":1,"tone":2},{"annotation":"拇指向上: 中等肤色","name":"THUMBS UP SIGN, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F44D-1F3FD","shortcodes":["thumbsup_tone3","+1_tone3","yes_tone3"],"emoji":"👍🏽","text":"","type":1,"order":283,"group":1,"subgroup":18,"version":1,"tone":3},{"annotation":"拇指向上: 中等-深肤色","name":"THUMBS UP SIGN, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F44D-1F3FE","shortcodes":["thumbsup_tone4","+1_tone4","yes_tone4"],"emoji":"👍🏾","text":"","type":1,"order":284,"group":1,"subgroup":18,"version":1,"tone":4},{"annotation":"拇指向上: 较深肤色","name":"THUMBS UP SIGN, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F44D-1F3FF","shortcodes":["thumbsup_tone5","+1_tone5","yes_tone5"],"emoji":"👍🏿","text":"","type":1,"order":285,"group":1,"subgroup":18,"version":1,"tone":5}]},{"annotation":"拇指向下","name":"THUMBS DOWN SIGN","hexcode":"1F44E","shortcodes":["thumbsdown","-1","no"],"tags":["不赞成","反对","手","责备"],"emoji":"👎️","text":"👎︎","type":1,"order":286,"group":1,"subgroup":18,"version":0.6,"skins":[{"annotation":"拇指向下: 较浅肤色","name":"THUMBS DOWN SIGN, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F44E-1F3FB","shortcodes":["thumbsdown_tone1","-1_tone1","no_tone1"],"emoji":"👎🏻","text":"","type":1,"order":287,"group":1,"subgroup":18,"version":1,"tone":1},{"annotation":"拇指向下: 中等-浅肤色","name":"THUMBS DOWN SIGN, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F44E-1F3FC","shortcodes":["thumbsdown_tone2","-1_tone2","no_tone2"],"emoji":"👎🏼","text":"","type":1,"order":288,"group":1,"subgroup":18,"version":1,"tone":2},{"annotation":"拇指向下: 中等肤色","name":"THUMBS DOWN SIGN, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F44E-1F3FD","shortcodes":["thumbsdown_tone3","-1_tone3","no_tone3"],"emoji":"👎🏽","text":"","type":1,"order":289,"group":1,"subgroup":18,"version":1,"tone":3},{"annotation":"拇指向下: 中等-深肤色","name":"THUMBS DOWN SIGN, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F44E-1F3FE","shortcodes":["thumbsdown_tone4","-1_tone4","no_tone4"],"emoji":"👎🏾","text":"","type":1,"order":290,"group":1,"subgroup":18,"version":1,"tone":4},{"annotation":"拇指向下: 较深肤色","name":"THUMBS DOWN SIGN, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F44E-1F3FF","shortcodes":["thumbsdown_tone5","-1_tone5","no_tone5"],"emoji":"👎🏿","text":"","type":1,"order":291,"group":1,"subgroup":18,"version":1,"tone":5}]},{"annotation":"举起拳头","name":"RAISED FIST","hexcode":"270A","shortcodes":["fist"],"tags":["手","拳头","握拳"],"emoji":"✊","text":"","type":1,"order":292,"group":1,"subgroup":18,"version":0.6,"skins":[{"annotation":"举起拳头: 较浅肤色","name":"RAISED FIST, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"270A-1F3FB","shortcodes":["fist_tone1"],"emoji":"✊🏻","text":"","type":1,"order":293,"group":1,"subgroup":18,"version":1,"tone":1},{"annotation":"举起拳头: 中等-浅肤色","name":"RAISED FIST, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"270A-1F3FC","shortcodes":["fist_tone2"],"emoji":"✊🏼","text":"","type":1,"order":294,"group":1,"subgroup":18,"version":1,"tone":2},{"annotation":"举起拳头: 中等肤色","name":"RAISED FIST, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"270A-1F3FD","shortcodes":["fist_tone3"],"emoji":"✊🏽","text":"","type":1,"order":295,"group":1,"subgroup":18,"version":1,"tone":3},{"annotation":"举起拳头: 中等-深肤色","name":"RAISED FIST, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"270A-1F3FE","shortcodes":["fist_tone4"],"emoji":"✊🏾","text":"","type":1,"order":296,"group":1,"subgroup":18,"version":1,"tone":4},{"annotation":"举起拳头: 较深肤色","name":"RAISED FIST, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"270A-1F3FF","shortcodes":["fist_tone5"],"emoji":"✊🏿","text":"","type":1,"order":297,"group":1,"subgroup":18,"version":1,"tone":5}]},{"annotation":"出拳","name":"FISTED HAND SIGN","hexcode":"1F44A","shortcodes":["punch"],"tags":["手","打","拳"],"emoji":"👊","text":"","type":1,"order":298,"group":1,"subgroup":18,"version":0.6,"skins":[{"annotation":"出拳: 较浅肤色","name":"FISTED HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F44A-1F3FB","shortcodes":["punch_tone1"],"emoji":"👊🏻","text":"","type":1,"order":299,"group":1,"subgroup":18,"version":1,"tone":1},{"annotation":"出拳: 中等-浅肤色","name":"FISTED HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F44A-1F3FC","shortcodes":["punch_tone2"],"emoji":"👊🏼","text":"","type":1,"order":300,"group":1,"subgroup":18,"version":1,"tone":2},{"annotation":"出拳: 中等肤色","name":"FISTED HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F44A-1F3FD","shortcodes":["punch_tone3"],"emoji":"👊🏽","text":"","type":1,"order":301,"group":1,"subgroup":18,"version":1,"tone":3},{"annotation":"出拳: 中等-深肤色","name":"FISTED HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F44A-1F3FE","shortcodes":["punch_tone4"],"emoji":"👊🏾","text":"","type":1,"order":302,"group":1,"subgroup":18,"version":1,"tone":4},{"annotation":"出拳: 较深肤色","name":"FISTED HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F44A-1F3FF","shortcodes":["punch_tone5"],"emoji":"👊🏿","text":"","type":1,"order":303,"group":1,"subgroup":18,"version":1,"tone":5}]},{"annotation":"朝左的拳头","name":"LEFT-FACING FIST","hexcode":"1F91B","shortcodes":["left_facing_fist"],"tags":["拳头","朝左"],"emoji":"🤛","text":"","type":1,"order":304,"group":1,"subgroup":18,"version":3,"skins":[{"annotation":"朝左的拳头: 较浅肤色","name":"LEFT-FACING FIST, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F91B-1F3FB","shortcodes":["left_facing_fist_tone1"],"emoji":"🤛🏻","text":"","type":1,"order":305,"group":1,"subgroup":18,"version":3,"tone":1},{"annotation":"朝左的拳头: 中等-浅肤色","name":"LEFT-FACING FIST, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F91B-1F3FC","shortcodes":["left_facing_fist_tone2"],"emoji":"🤛🏼","text":"","type":1,"order":306,"group":1,"subgroup":18,"version":3,"tone":2},{"annotation":"朝左的拳头: 中等肤色","name":"LEFT-FACING FIST, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F91B-1F3FD","shortcodes":["left_facing_fist_tone3"],"emoji":"🤛🏽","text":"","type":1,"order":307,"group":1,"subgroup":18,"version":3,"tone":3},{"annotation":"朝左的拳头: 中等-深肤色","name":"LEFT-FACING FIST, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F91B-1F3FE","shortcodes":["left_facing_fist_tone4"],"emoji":"🤛🏾","text":"","type":1,"order":308,"group":1,"subgroup":18,"version":3,"tone":4},{"annotation":"朝左的拳头: 较深肤色","name":"LEFT-FACING FIST, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F91B-1F3FF","shortcodes":["left_facing_fist_tone5"],"emoji":"🤛🏿","text":"","type":1,"order":309,"group":1,"subgroup":18,"version":3,"tone":5}]},{"annotation":"朝右的拳头","name":"RIGHT-FACING FIST","hexcode":"1F91C","shortcodes":["right_facing_fist"],"tags":["手","拳头","朝右"],"emoji":"🤜","text":"","type":1,"order":310,"group":1,"subgroup":18,"version":3,"skins":[{"annotation":"朝右的拳头: 较浅肤色","name":"RIGHT-FACING FIST, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F91C-1F3FB","shortcodes":["right_facing_fist_tone1"],"emoji":"🤜🏻","text":"","type":1,"order":311,"group":1,"subgroup":18,"version":3,"tone":1},{"annotation":"朝右的拳头: 中等-浅肤色","name":"RIGHT-FACING FIST, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F91C-1F3FC","shortcodes":["right_facing_fist_tone2"],"emoji":"🤜🏼","text":"","type":1,"order":312,"group":1,"subgroup":18,"version":3,"tone":2},{"annotation":"朝右的拳头: 中等肤色","name":"RIGHT-FACING FIST, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F91C-1F3FD","shortcodes":["right_facing_fist_tone3"],"emoji":"🤜🏽","text":"","type":1,"order":313,"group":1,"subgroup":18,"version":3,"tone":3},{"annotation":"朝右的拳头: 中等-深肤色","name":"RIGHT-FACING FIST, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F91C-1F3FE","shortcodes":["right_facing_fist_tone4"],"emoji":"🤜🏾","text":"","type":1,"order":314,"group":1,"subgroup":18,"version":3,"tone":4},{"annotation":"朝右的拳头: 较深肤色","name":"RIGHT-FACING FIST, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F91C-1F3FF","shortcodes":["right_facing_fist_tone5"],"emoji":"🤜🏿","text":"","type":1,"order":315,"group":1,"subgroup":18,"version":3,"tone":5}]},{"annotation":"鼓掌","name":"CLAPPING HANDS SIGN","hexcode":"1F44F","shortcodes":["clap"],"tags":["拍手"],"emoji":"👏","text":"","type":1,"order":316,"group":1,"subgroup":19,"version":0.6,"skins":[{"annotation":"鼓掌: 较浅肤色","name":"CLAPPING HANDS SIGN, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F44F-1F3FB","shortcodes":["clap_tone1"],"emoji":"👏🏻","text":"","type":1,"order":317,"group":1,"subgroup":19,"version":1,"tone":1},{"annotation":"鼓掌: 中等-浅肤色","name":"CLAPPING HANDS SIGN, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F44F-1F3FC","shortcodes":["clap_tone2"],"emoji":"👏🏼","text":"","type":1,"order":318,"group":1,"subgroup":19,"version":1,"tone":2},{"annotation":"鼓掌: 中等肤色","name":"CLAPPING HANDS SIGN, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F44F-1F3FD","shortcodes":["clap_tone3"],"emoji":"👏🏽","text":"","type":1,"order":319,"group":1,"subgroup":19,"version":1,"tone":3},{"annotation":"鼓掌: 中等-深肤色","name":"CLAPPING HANDS SIGN, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F44F-1F3FE","shortcodes":["clap_tone4"],"emoji":"👏🏾","text":"","type":1,"order":320,"group":1,"subgroup":19,"version":1,"tone":4},{"annotation":"鼓掌: 较深肤色","name":"CLAPPING HANDS SIGN, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F44F-1F3FF","shortcodes":["clap_tone5"],"emoji":"👏🏿","text":"","type":1,"order":321,"group":1,"subgroup":19,"version":1,"tone":5}]},{"annotation":"举双手","name":"PERSON RAISING BOTH HANDS IN CELEBRATION","hexcode":"1F64C","shortcodes":["raised_hands"],"tags":["击掌","双手","庆祝"],"emoji":"🙌","text":"","type":1,"order":322,"group":1,"subgroup":19,"version":0.6,"skins":[{"annotation":"举双手: 较浅肤色","name":"PERSON RAISING BOTH HANDS IN CELEBRATION, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F64C-1F3FB","shortcodes":["raised_hands_tone1"],"emoji":"🙌🏻","text":"","type":1,"order":323,"group":1,"subgroup":19,"version":1,"tone":1},{"annotation":"举双手: 中等-浅肤色","name":"PERSON RAISING BOTH HANDS IN CELEBRATION, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F64C-1F3FC","shortcodes":["raised_hands_tone2"],"emoji":"🙌🏼","text":"","type":1,"order":324,"group":1,"subgroup":19,"version":1,"tone":2},{"annotation":"举双手: 中等肤色","name":"PERSON RAISING BOTH HANDS IN CELEBRATION, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F64C-1F3FD","shortcodes":["raised_hands_tone3"],"emoji":"🙌🏽","text":"","type":1,"order":325,"group":1,"subgroup":19,"version":1,"tone":3},{"annotation":"举双手: 中等-深肤色","name":"PERSON RAISING BOTH HANDS IN CELEBRATION, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F64C-1F3FE","shortcodes":["raised_hands_tone4"],"emoji":"🙌🏾","text":"","type":1,"order":326,"group":1,"subgroup":19,"version":1,"tone":4},{"annotation":"举双手: 较深肤色","name":"PERSON RAISING BOTH HANDS IN CELEBRATION, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F64C-1F3FF","shortcodes":["raised_hands_tone5"],"emoji":"🙌🏿","text":"","type":1,"order":327,"group":1,"subgroup":19,"version":1,"tone":5}]},{"annotation":"张开双手","name":"OPEN HANDS SIGN","hexcode":"1F450","shortcodes":["open_hands"],"tags":["双手","摊手"],"emoji":"👐","text":"","type":1,"order":328,"group":1,"subgroup":19,"version":0.6,"skins":[{"annotation":"张开双手: 较浅肤色","name":"OPEN HANDS SIGN, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F450-1F3FB","shortcodes":["open_hands_tone1"],"emoji":"👐🏻","text":"","type":1,"order":329,"group":1,"subgroup":19,"version":1,"tone":1},{"annotation":"张开双手: 中等-浅肤色","name":"OPEN HANDS SIGN, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F450-1F3FC","shortcodes":["open_hands_tone2"],"emoji":"👐🏼","text":"","type":1,"order":330,"group":1,"subgroup":19,"version":1,"tone":2},{"annotation":"张开双手: 中等肤色","name":"OPEN HANDS SIGN, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F450-1F3FD","shortcodes":["open_hands_tone3"],"emoji":"👐🏽","text":"","type":1,"order":331,"group":1,"subgroup":19,"version":1,"tone":3},{"annotation":"张开双手: 中等-深肤色","name":"OPEN HANDS SIGN, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F450-1F3FE","shortcodes":["open_hands_tone4"],"emoji":"👐🏾","text":"","type":1,"order":332,"group":1,"subgroup":19,"version":1,"tone":4},{"annotation":"张开双手: 较深肤色","name":"OPEN HANDS SIGN, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F450-1F3FF","shortcodes":["open_hands_tone5"],"emoji":"👐🏿","text":"","type":1,"order":333,"group":1,"subgroup":19,"version":1,"tone":5}]},{"annotation":"掌心向上托起","name":"PALMS UP TOGETHER","hexcode":"1F932","shortcodes":["palms_up"],"tags":["祷告"],"emoji":"🤲","text":"","type":1,"order":334,"group":1,"subgroup":19,"version":5,"skins":[{"annotation":"掌心向上托起: 较浅肤色","name":"PALMS UP TOGETHER, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F932-1F3FB","shortcodes":["palms_up_tone1"],"emoji":"🤲🏻","text":"","type":1,"order":335,"group":1,"subgroup":19,"version":5,"tone":1},{"annotation":"掌心向上托起: 中等-浅肤色","name":"PALMS UP TOGETHER, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F932-1F3FC","shortcodes":["palms_up_tone2"],"emoji":"🤲🏼","text":"","type":1,"order":336,"group":1,"subgroup":19,"version":5,"tone":2},{"annotation":"掌心向上托起: 中等肤色","name":"PALMS UP TOGETHER, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F932-1F3FD","shortcodes":["palms_up_tone3"],"emoji":"🤲🏽","text":"","type":1,"order":337,"group":1,"subgroup":19,"version":5,"tone":3},{"annotation":"掌心向上托起: 中等-深肤色","name":"PALMS UP TOGETHER, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F932-1F3FE","shortcodes":["palms_up_tone4"],"emoji":"🤲🏾","text":"","type":1,"order":338,"group":1,"subgroup":19,"version":5,"tone":4},{"annotation":"掌心向上托起: 较深肤色","name":"PALMS UP TOGETHER, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F932-1F3FF","shortcodes":["palms_up_tone5"],"emoji":"🤲🏿","text":"","type":1,"order":339,"group":1,"subgroup":19,"version":5,"tone":5}]},{"annotation":"握手","name":"HANDSHAKE","hexcode":"1F91D","shortcodes":["handshake"],"tags":["会面","协议"],"emoji":"🤝","text":"","type":1,"order":340,"group":1,"subgroup":19,"version":3},{"annotation":"双手合十","name":"PERSON WITH FOLDED HANDS","hexcode":"1F64F","shortcodes":["pray"],"tags":["拜托","祈求","祈祷","祝福"],"emoji":"🙏","text":"","type":1,"order":341,"group":1,"subgroup":19,"version":0.6,"skins":[{"annotation":"双手合十: 较浅肤色","name":"PERSON WITH FOLDED HANDS, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F64F-1F3FB","shortcodes":["pray_tone1"],"emoji":"🙏🏻","text":"","type":1,"order":342,"group":1,"subgroup":19,"version":1,"tone":1},{"annotation":"双手合十: 中等-浅肤色","name":"PERSON WITH FOLDED HANDS, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F64F-1F3FC","shortcodes":["pray_tone2"],"emoji":"🙏🏼","text":"","type":1,"order":343,"group":1,"subgroup":19,"version":1,"tone":2},{"annotation":"双手合十: 中等肤色","name":"PERSON WITH FOLDED HANDS, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F64F-1F3FD","shortcodes":["pray_tone3"],"emoji":"🙏🏽","text":"","type":1,"order":344,"group":1,"subgroup":19,"version":1,"tone":3},{"annotation":"双手合十: 中等-深肤色","name":"PERSON WITH FOLDED HANDS, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F64F-1F3FE","shortcodes":["pray_tone4"],"emoji":"🙏🏾","text":"","type":1,"order":345,"group":1,"subgroup":19,"version":1,"tone":4},{"annotation":"双手合十: 较深肤色","name":"PERSON WITH FOLDED HANDS, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F64F-1F3FF","shortcodes":["pray_tone5"],"emoji":"🙏🏿","text":"","type":1,"order":346,"group":1,"subgroup":19,"version":1,"tone":5}]},{"annotation":"写字","name":"WRITING HAND","hexcode":"270D","shortcodes":["writing_hand"],"tags":["写","笔"],"emoji":"✍️","text":"✍︎","type":0,"order":348,"group":1,"subgroup":20,"version":0.7,"skins":[{"annotation":"写字: 较浅肤色","name":"WRITING HAND, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"270D-1F3FB","shortcodes":["writing_hand_tone1"],"emoji":"✍🏻","text":"","type":1,"order":349,"group":1,"subgroup":20,"version":1,"tone":1},{"annotation":"写字: 中等-浅肤色","name":"WRITING HAND, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"270D-1F3FC","shortcodes":["writing_hand_tone2"],"emoji":"✍🏼","text":"","type":1,"order":350,"group":1,"subgroup":20,"version":1,"tone":2},{"annotation":"写字: 中等肤色","name":"WRITING HAND, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"270D-1F3FD","shortcodes":["writing_hand_tone3"],"emoji":"✍🏽","text":"","type":1,"order":351,"group":1,"subgroup":20,"version":1,"tone":3},{"annotation":"写字: 中等-深肤色","name":"WRITING HAND, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"270D-1F3FE","shortcodes":["writing_hand_tone4"],"emoji":"✍🏾","text":"","type":1,"order":352,"group":1,"subgroup":20,"version":1,"tone":4},{"annotation":"写字: 较深肤色","name":"WRITING HAND, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"270D-1F3FF","shortcodes":["writing_hand_tone5"],"emoji":"✍🏿","text":"","type":1,"order":353,"group":1,"subgroup":20,"version":1,"tone":5}]}]`);
1375
- const _hoisted_1$2 = { class: "emoji-panel-h5" };
1376
- const _hoisted_2$2 = { class: "emoji-tabs" };
1377
- const _hoisted_3$2 = ["onClick"];
1378
- const _hoisted_4$2 = { class: "tab-icon" };
1379
- const _hoisted_5$2 = {
1439
+ const _hoisted_1$3 = { class: "emoji-panel-h5" };
1440
+ const _hoisted_2$3 = { class: "emoji-tabs" };
1441
+ const _hoisted_3$3 = ["onClick"];
1442
+ const _hoisted_4$3 = { class: "tab-icon" };
1443
+ const _hoisted_5$3 = {
1380
1444
  class: "emoji-grid",
1381
1445
  ref: "emojiGrid"
1382
1446
  };
1383
1447
  const _hoisted_6$2 = ["title", "onClick"];
1384
- const _sfc_main$2 = {
1448
+ const _sfc_main$3 = {
1385
1449
  __name: "EmojiPanelH5",
1386
1450
  props: {
1387
1451
  modelValue: {
@@ -1433,19 +1497,19 @@ const _sfc_main$2 = {
1433
1497
  emit("select", emoji);
1434
1498
  };
1435
1499
  return (_ctx, _cache) => {
1436
- return withDirectives((openBlock(), createElementBlock("div", _hoisted_1$2, [
1437
- createElementVNode("div", _hoisted_2$2, [
1500
+ return withDirectives((openBlock(), createElementBlock("div", _hoisted_1$3, [
1501
+ createElementVNode("div", _hoisted_2$3, [
1438
1502
  (openBlock(true), createElementBlock(Fragment, null, renderList(groups.value, (grp) => {
1439
1503
  return openBlock(), createElementBlock("div", {
1440
1504
  key: grp.key,
1441
1505
  class: normalizeClass(["emoji-tab", { active: activeGroup.value === grp.key }]),
1442
1506
  onClick: ($event) => activeGroup.value = grp.key
1443
1507
  }, [
1444
- createElementVNode("span", _hoisted_4$2, toDisplayString(grp.icon), 1)
1445
- ], 10, _hoisted_3$2);
1508
+ createElementVNode("span", _hoisted_4$3, toDisplayString(grp.icon), 1)
1509
+ ], 10, _hoisted_3$3);
1446
1510
  }), 128))
1447
1511
  ]),
1448
- createElementVNode("div", _hoisted_5$2, [
1512
+ createElementVNode("div", _hoisted_5$3, [
1449
1513
  (openBlock(true), createElementBlock(Fragment, null, renderList(currentEmojis.value, (item) => {
1450
1514
  return openBlock(), createElementBlock("span", {
1451
1515
  key: item.hexcode,
@@ -1461,7 +1525,603 @@ const _sfc_main$2 = {
1461
1525
  };
1462
1526
  }
1463
1527
  };
1464
- const EmojiPanelH5 = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__scopeId", "data-v-f5207080"]]);
1528
+ const EmojiPanelH5 = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["__scopeId", "data-v-f5207080"]]);
1529
+ var recorder$1 = { exports: {} };
1530
+ /*!
1531
+ *
1532
+ * js-audio-recorder - js audio recorder plugin
1533
+ *
1534
+ * @version v1.0.7
1535
+ * @homepage https://github.com/2fps/recorder
1536
+ * @author 2fps <echoweb@126.com> (https://www.zhuyuntao.cn)
1537
+ * @license MIT
1538
+ *
1539
+ */
1540
+ var recorder = recorder$1.exports;
1541
+ var hasRequiredRecorder;
1542
+ function requireRecorder() {
1543
+ if (hasRequiredRecorder) return recorder$1.exports;
1544
+ hasRequiredRecorder = 1;
1545
+ (function(module, exports) {
1546
+ !(function(t, e) {
1547
+ module.exports = e();
1548
+ })(recorder, function() {
1549
+ return (function(t) {
1550
+ var e = {};
1551
+ function n(i) {
1552
+ if (e[i]) return e[i].exports;
1553
+ var o = e[i] = { i, l: false, exports: {} };
1554
+ return t[i].call(o.exports, o, o.exports, n), o.l = true, o.exports;
1555
+ }
1556
+ return n.m = t, n.c = e, n.d = function(t2, e2, i) {
1557
+ n.o(t2, e2) || Object.defineProperty(t2, e2, { enumerable: true, get: i });
1558
+ }, n.r = function(t2) {
1559
+ "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(t2, Symbol.toStringTag, { value: "Module" }), Object.defineProperty(t2, "__esModule", { value: true });
1560
+ }, n.t = function(t2, e2) {
1561
+ if (1 & e2 && (t2 = n(t2)), 8 & e2) return t2;
1562
+ if (4 & e2 && "object" == typeof t2 && t2 && t2.__esModule) return t2;
1563
+ var i = /* @__PURE__ */ Object.create(null);
1564
+ if (n.r(i), Object.defineProperty(i, "default", { enumerable: true, value: t2 }), 2 & e2 && "string" != typeof t2) for (var o in t2) n.d(i, o, (function(e3) {
1565
+ return t2[e3];
1566
+ }).bind(null, o));
1567
+ return i;
1568
+ }, n.n = function(t2) {
1569
+ var e2 = t2 && t2.__esModule ? function() {
1570
+ return t2.default;
1571
+ } : function() {
1572
+ return t2;
1573
+ };
1574
+ return n.d(e2, "a", e2), e2;
1575
+ }, n.o = function(t2, e2) {
1576
+ return Object.prototype.hasOwnProperty.call(t2, e2);
1577
+ }, n.p = "", n(n.s = 1);
1578
+ })([function(t, e, n) {
1579
+ function i(t2, e2, n2) {
1580
+ for (var i2 = 0; i2 < n2.length; i2++) t2.setUint8(e2 + i2, n2.charCodeAt(i2));
1581
+ }
1582
+ Object.defineProperty(e, "__esModule", { value: true }), e.compress = function(t2, e2, n2) {
1583
+ for (var i2 = e2 / n2, o = Math.max(i2, 1), r = t2.left, a = t2.right, s = Math.floor((r.length + a.length) / i2), u = new Float32Array(s), c = 0, l = 0; c < s; ) {
1584
+ var f = Math.floor(l);
1585
+ u[c] = r[f], c++, a.length && (u[c] = a[f], c++), l += o;
1586
+ }
1587
+ return u;
1588
+ }, e.encodePCM = function(t2, e2, n2) {
1589
+ void 0 === n2 && (n2 = true);
1590
+ var i2 = 0, o = t2.length * (e2 / 8), r = new ArrayBuffer(o), a = new DataView(r);
1591
+ if (8 === e2) for (var s = 0; s < t2.length; s++, i2++) {
1592
+ var u = (c = Math.max(-1, Math.min(1, t2[s]))) < 0 ? 128 * c : 127 * c;
1593
+ u = +u + 128, a.setInt8(i2, u);
1594
+ }
1595
+ else for (s = 0; s < t2.length; s++, i2 += 2) {
1596
+ var c = Math.max(-1, Math.min(1, t2[s]));
1597
+ a.setInt16(i2, c < 0 ? 32768 * c : 32767 * c, n2);
1598
+ }
1599
+ return a;
1600
+ }, e.encodeWAV = function(t2, e2, n2, o, r, a) {
1601
+ void 0 === a && (a = true);
1602
+ var s = n2 > e2 ? e2 : n2, u = r, c = new ArrayBuffer(44 + t2.byteLength), l = new DataView(c), f = o, p = 0;
1603
+ i(l, p, "RIFF"), p += 4, l.setUint32(p, 36 + t2.byteLength, a), i(l, p += 4, "WAVE"), i(l, p += 4, "fmt "), p += 4, l.setUint32(p, 16, a), p += 4, l.setUint16(p, 1, a), p += 2, l.setUint16(p, f, a), p += 2, l.setUint32(p, s, a), p += 4, l.setUint32(p, f * s * (u / 8), a), p += 4, l.setUint16(p, f * (u / 8), a), p += 2, l.setUint16(p, u, a), i(l, p += 2, "data"), p += 4, l.setUint32(p, t2.byteLength, a), p += 4;
1604
+ for (var d = 0; d < t2.byteLength; ) l.setUint8(p, t2.getUint8(d)), p++, d++;
1605
+ return l;
1606
+ };
1607
+ }, function(t, e, n) {
1608
+ var i, o = this && this.__extends || (i = function(t2, e2) {
1609
+ return (i = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(t3, e3) {
1610
+ t3.__proto__ = e3;
1611
+ } || function(t3, e3) {
1612
+ for (var n2 in e3) e3.hasOwnProperty(n2) && (t3[n2] = e3[n2]);
1613
+ })(t2, e2);
1614
+ }, function(t2, e2) {
1615
+ function n2() {
1616
+ this.constructor = t2;
1617
+ }
1618
+ i(t2, e2), t2.prototype = null === e2 ? Object.create(e2) : (n2.prototype = e2.prototype, new n2());
1619
+ });
1620
+ Object.defineProperty(e, "__esModule", { value: true });
1621
+ var r = n(2), a = n(0), s = n(3), u = (function(t2) {
1622
+ function e2(e3) {
1623
+ void 0 === e3 && (e3 = {});
1624
+ var n2 = t2.call(this, e3) || this;
1625
+ return n2.isrecording = false, n2.ispause = false, n2.isplaying = false, n2;
1626
+ }
1627
+ return o(e2, t2), e2.prototype.setOption = function(t3) {
1628
+ void 0 === t3 && (t3 = {}), this.setNewOption(t3);
1629
+ }, e2.prototype.start = function() {
1630
+ return this.isrecording ? Promise.reject() : (this.isrecording = true, this.startRecord());
1631
+ }, e2.prototype.pause = function() {
1632
+ this.isrecording && !this.ispause && (this.ispause = true, this.pauseRecord());
1633
+ }, e2.prototype.resume = function() {
1634
+ this.isrecording && this.ispause && (this.ispause = false, this.resumeRecord());
1635
+ }, e2.prototype.stop = function() {
1636
+ this.isrecording && (this.isrecording = false, this.ispause = false, this.stopRecord());
1637
+ }, e2.prototype.play = function() {
1638
+ this.stop(), this.isplaying = true, this.onplay && this.onplay(), s.default.addPlayEnd(this.onplayend);
1639
+ var t3 = this.getWAV();
1640
+ t3.byteLength > 44 && s.default.play(t3.buffer);
1641
+ }, e2.prototype.getPlayTime = function() {
1642
+ return s.default.getPlayTime();
1643
+ }, e2.prototype.pausePlay = function() {
1644
+ !this.isrecording && this.isplaying && (this.isplaying = false, this.onpauseplay && this.onpauseplay(), s.default.pausePlay());
1645
+ }, e2.prototype.resumePlay = function() {
1646
+ this.isrecording || this.isplaying || (this.isplaying = true, this.onresumeplay && this.onresumeplay(), s.default.resumePlay());
1647
+ }, e2.prototype.stopPlay = function() {
1648
+ this.isrecording || (this.isplaying = false, this.onstopplay && this.onstopplay(), s.default.stopPlay());
1649
+ }, e2.prototype.destroy = function() {
1650
+ return s.default.destroyPlay(), this.destroyRecord();
1651
+ }, e2.prototype.getRecordAnalyseData = function() {
1652
+ return this.getAnalyseData();
1653
+ }, e2.prototype.getPlayAnalyseData = function() {
1654
+ return s.default.getAnalyseData();
1655
+ }, e2.prototype.getPCM = function() {
1656
+ this.stop();
1657
+ var t3 = this.getData();
1658
+ return t3 = a.compress(t3, this.inputSampleRate, this.outputSampleRate), a.encodePCM(t3, this.oututSampleBits, this.littleEdian);
1659
+ }, e2.prototype.getPCMBlob = function() {
1660
+ return new Blob([this.getPCM()]);
1661
+ }, e2.prototype.downloadPCM = function(t3) {
1662
+ void 0 === t3 && (t3 = "recorder");
1663
+ var e3 = this.getPCMBlob();
1664
+ r.downloadPCM(e3, t3);
1665
+ }, e2.prototype.getWAV = function() {
1666
+ var t3 = this.getPCM();
1667
+ return a.encodeWAV(t3, this.inputSampleRate, this.outputSampleRate, this.config.numChannels, this.oututSampleBits, this.littleEdian);
1668
+ }, e2.prototype.getWAVBlob = function() {
1669
+ return new Blob([this.getWAV()], { type: "audio/wav" });
1670
+ }, e2.prototype.downloadWAV = function(t3) {
1671
+ void 0 === t3 && (t3 = "recorder");
1672
+ var e3 = this.getWAVBlob();
1673
+ r.downloadWAV(e3, t3);
1674
+ }, e2.prototype.download = function(t3, e3, n2) {
1675
+ r.download(t3, e3, n2);
1676
+ }, e2.prototype.getChannelData = function() {
1677
+ var t3 = this.getPCM(), e3 = t3.byteLength, n2 = this.littleEdian, i2 = { left: null, right: null };
1678
+ if (2 === this.config.numChannels) {
1679
+ var o2 = new DataView(new ArrayBuffer(e3 / 2)), r2 = new DataView(new ArrayBuffer(e3 / 2));
1680
+ if (16 === this.config.sampleBits) for (var a2 = 0; a2 < e3 / 2; a2 += 2) o2.setInt16(a2, t3.getInt16(2 * a2, n2), n2), r2.setInt16(a2, t3.getInt16(2 * a2 + 2, n2), n2);
1681
+ else for (a2 = 0; a2 < e3 / 2; a2 += 2) o2.setInt8(a2, t3.getInt8(2 * a2)), r2.setInt8(a2, t3.getInt8(2 * a2 + 1));
1682
+ i2.left = o2, i2.right = r2;
1683
+ } else i2.left = t3;
1684
+ return i2;
1685
+ }, e2;
1686
+ })(n(5).default);
1687
+ e.default = u;
1688
+ }, function(t, e, n) {
1689
+ function i(t2, e2, n2) {
1690
+ var i2 = document.createElement("a");
1691
+ i2.href = window.URL.createObjectURL(t2), i2.download = e2 + "." + n2, i2.click();
1692
+ }
1693
+ Object.defineProperty(e, "__esModule", { value: true }), e.downloadWAV = function(t2, e2) {
1694
+ void 0 === e2 && (e2 = "recorder"), i(t2, e2, "wav");
1695
+ }, e.downloadPCM = function(t2, e2) {
1696
+ void 0 === e2 && (e2 = "recorder"), i(t2, e2, "pcm");
1697
+ }, e.download = function(t2, e2, n2) {
1698
+ return i(t2, e2, n2);
1699
+ };
1700
+ }, function(t, e, n) {
1701
+ Object.defineProperty(e, "__esModule", { value: true });
1702
+ var i = n(4), o = null, r = 0, a = 0, s = null, u = null, c = null, l = false, f = 0, p = function() {
1703
+ };
1704
+ function d() {
1705
+ return l = false, s.decodeAudioData(c.slice(0), function(t2) {
1706
+ (o = s.createBufferSource()).onended = function() {
1707
+ l || (f = s.currentTime - a + r, p());
1708
+ }, o.buffer = t2, o.connect(u), u.connect(s.destination), o.start(0, r), a = s.currentTime;
1709
+ }, function(t2) {
1710
+ i.throwError(t2);
1711
+ });
1712
+ }
1713
+ function h() {
1714
+ o && (o.stop(), o = null);
1715
+ }
1716
+ var y = (function() {
1717
+ function t2() {
1718
+ }
1719
+ return t2.play = function(t3) {
1720
+ return s || (s = new (window.AudioContext || window.webkitAudioContext)(), (u = s.createAnalyser()).fftSize = 2048), this.stopPlay(), c = t3, f = 0, d();
1721
+ }, t2.pausePlay = function() {
1722
+ h(), r += s.currentTime - a, l = true;
1723
+ }, t2.resumePlay = function() {
1724
+ return d();
1725
+ }, t2.stopPlay = function() {
1726
+ r = 0, c = null, h();
1727
+ }, t2.destroyPlay = function() {
1728
+ this.stopPlay();
1729
+ }, t2.getAnalyseData = function() {
1730
+ var t3 = new Uint8Array(u.frequencyBinCount);
1731
+ return u.getByteTimeDomainData(t3), t3;
1732
+ }, t2.addPlayEnd = function(t3) {
1733
+ void 0 === t3 && (t3 = function() {
1734
+ }), p = t3;
1735
+ }, t2.getPlayTime = function() {
1736
+ var t3 = l ? r : s.currentTime - a + r;
1737
+ return f || t3;
1738
+ }, t2;
1739
+ })();
1740
+ e.default = y;
1741
+ }, function(t, e, n) {
1742
+ Object.defineProperty(e, "__esModule", { value: true }), e.throwError = function(t2) {
1743
+ throw new Error(t2);
1744
+ };
1745
+ }, function(t, e, n) {
1746
+ Object.defineProperty(e, "__esModule", { value: true });
1747
+ var i = n(0), o = (function() {
1748
+ function t2(e2) {
1749
+ void 0 === e2 && (e2 = {}), this.size = 0, this.lBuffer = [], this.rBuffer = [], this.tempPCM = [], this.inputSampleBits = 16, this.fileSize = 0, this.duration = 0, this.needRecord = true;
1750
+ var n2, i2 = new (window.AudioContext || window.webkitAudioContext)();
1751
+ this.inputSampleRate = i2.sampleRate, this.setNewOption(e2), this.littleEdian = (n2 = new ArrayBuffer(2), new DataView(n2).setInt16(0, 256, true), 256 === new Int16Array(n2)[0]), t2.initUserMedia();
1752
+ }
1753
+ return t2.prototype.setNewOption = function(t3) {
1754
+ void 0 === t3 && (t3 = {}), this.config = { sampleBits: ~[8, 16].indexOf(t3.sampleBits) ? t3.sampleBits : 16, sampleRate: ~[8e3, 11025, 16e3, 22050, 24e3, 44100, 48e3].indexOf(t3.sampleRate) ? t3.sampleRate : this.inputSampleRate, numChannels: ~[1, 2].indexOf(t3.numChannels) ? t3.numChannels : 1 }, this.outputSampleRate = this.config.sampleRate, this.oututSampleBits = this.config.sampleBits;
1755
+ }, t2.prototype.startRecord = function() {
1756
+ var t3 = this;
1757
+ return this.context && this.destroyRecord(), this.initRecorder(), navigator.mediaDevices.getUserMedia({ audio: true }).then(function(e2) {
1758
+ t3.audioInput = t3.context.createMediaStreamSource(e2), t3.stream = e2;
1759
+ }).then(function() {
1760
+ t3.audioInput.connect(t3.analyser), t3.analyser.connect(t3.recorder), t3.recorder.connect(t3.context.destination);
1761
+ });
1762
+ }, t2.prototype.pauseRecord = function() {
1763
+ this.needRecord = false;
1764
+ }, t2.prototype.resumeRecord = function() {
1765
+ this.needRecord = true;
1766
+ }, t2.prototype.stopRecord = function() {
1767
+ this.audioInput && this.audioInput.disconnect(), this.source && this.source.stop(), this.recorder.disconnect(), this.analyser.disconnect(), this.needRecord = true;
1768
+ }, t2.prototype.destroyRecord = function() {
1769
+ return this.clearRecordStatus(), this.stopStream(), this.closeAudioContext();
1770
+ }, t2.prototype.getAnalyseData = function() {
1771
+ var t3 = new Uint8Array(this.analyser.frequencyBinCount);
1772
+ return this.analyser.getByteTimeDomainData(t3), t3;
1773
+ }, t2.prototype.getData = function() {
1774
+ return this.flat();
1775
+ }, t2.prototype.clearRecordStatus = function() {
1776
+ this.lBuffer.length = 0, this.rBuffer.length = 0, this.size = 0, this.fileSize = 0, this.PCM = null, this.audioInput = null, this.duration = 0;
1777
+ }, t2.prototype.flat = function() {
1778
+ var t3 = null, e2 = new Float32Array(0);
1779
+ 1 === this.config.numChannels ? t3 = new Float32Array(this.size) : (t3 = new Float32Array(this.size / 2), e2 = new Float32Array(this.size / 2));
1780
+ for (var n2 = 0, i2 = 0; i2 < this.lBuffer.length; i2++) t3.set(this.lBuffer[i2], n2), n2 += this.lBuffer[i2].length;
1781
+ n2 = 0;
1782
+ for (i2 = 0; i2 < this.rBuffer.length; i2++) e2.set(this.rBuffer[i2], n2), n2 += this.rBuffer[i2].length;
1783
+ return { left: t3, right: e2 };
1784
+ }, t2.prototype.initRecorder = function() {
1785
+ var t3 = this;
1786
+ this.clearRecordStatus(), this.context = new (window.AudioContext || window.webkitAudioContext)(), this.analyser = this.context.createAnalyser(), this.analyser.fftSize = 2048;
1787
+ var e2 = this.context.createScriptProcessor || this.context.createJavaScriptNode;
1788
+ this.recorder = e2.apply(this.context, [4096, this.config.numChannels, this.config.numChannels]), this.recorder.onaudioprocess = function(e3) {
1789
+ if (t3.needRecord) {
1790
+ var n2, i2 = e3.inputBuffer.getChannelData(0), o2 = null;
1791
+ t3.lBuffer.push(new Float32Array(i2)), t3.size += i2.length, 2 === t3.config.numChannels && (o2 = e3.inputBuffer.getChannelData(1), t3.rBuffer.push(new Float32Array(o2)), t3.size += o2.length), t3.fileSize = Math.floor(t3.size / Math.max(t3.inputSampleRate / t3.outputSampleRate, 1)) * (t3.oututSampleBits / 8), n2 = 100 * Math.max.apply(Math, i2), t3.duration += 4096 / t3.inputSampleRate, t3.onprocess && t3.onprocess(t3.duration), t3.onprogress && t3.onprogress({ duration: t3.duration, fileSize: t3.fileSize, vol: n2 });
1792
+ }
1793
+ };
1794
+ }, t2.prototype.stopStream = function() {
1795
+ this.stream && this.stream.getTracks && (this.stream.getTracks().forEach(function(t3) {
1796
+ return t3.stop();
1797
+ }), this.stream = null);
1798
+ }, t2.prototype.closeAudioContext = function() {
1799
+ return this.context && this.context.close && "closed" !== this.context.state ? this.context.close() : new Promise(function(t3) {
1800
+ t3();
1801
+ });
1802
+ }, t2.initUserMedia = function() {
1803
+ void 0 === navigator.mediaDevices && (navigator.mediaDevices = {}), void 0 === navigator.mediaDevices.getUserMedia && (navigator.mediaDevices.getUserMedia = function(t3) {
1804
+ var e2 = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
1805
+ return e2 ? new Promise(function(n2, i2) {
1806
+ e2.call(navigator, t3, n2, i2);
1807
+ }) : Promise.reject(new Error("浏览器不支持 getUserMedia !"));
1808
+ });
1809
+ }, t2.prototype.transformIntoPCM = function(t3, e2) {
1810
+ var n2 = new Float32Array(t3), o2 = new Float32Array(e2), r = i.compress({ left: n2, right: o2 }, this.inputSampleRate, this.outputSampleRate);
1811
+ return i.encodePCM(r, this.oututSampleBits, this.littleEdian);
1812
+ }, t2.getPermission = function() {
1813
+ return this.initUserMedia(), navigator.mediaDevices.getUserMedia({ audio: true }).then(function(t3) {
1814
+ t3 && t3.getTracks().forEach(function(t4) {
1815
+ return t4.stop();
1816
+ });
1817
+ });
1818
+ }, t2;
1819
+ })();
1820
+ e.default = o;
1821
+ }]).default;
1822
+ });
1823
+ })(recorder$1);
1824
+ return recorder$1.exports;
1825
+ }
1826
+ var jsAudioRecorder;
1827
+ var hasRequiredJsAudioRecorder;
1828
+ function requireJsAudioRecorder() {
1829
+ if (hasRequiredJsAudioRecorder) return jsAudioRecorder;
1830
+ hasRequiredJsAudioRecorder = 1;
1831
+ jsAudioRecorder = requireRecorder();
1832
+ return jsAudioRecorder;
1833
+ }
1834
+ var jsAudioRecorderExports = requireJsAudioRecorder();
1835
+ const Recorder = /* @__PURE__ */ getDefaultExportFromCjs(jsAudioRecorderExports);
1836
+ const VOICE_SAMPLE_BITS = 16;
1837
+ const VOICE_SAMPLE_RATE = 16e3;
1838
+ const VOICE_CHANNELS = 1;
1839
+ const VOICE_MIN_DURATION = 1;
1840
+ const VOICE_MAX_DURATION = 60;
1841
+ const VOICE_CANCEL_DISTANCE = 80;
1842
+ let activeRecorder = null;
1843
+ const now = () => Date.now();
1844
+ const useVoiceRecorder = () => {
1845
+ const instanceId = Symbol("voice-recorder");
1846
+ const isRecording = ref(false);
1847
+ const canceling = ref(false);
1848
+ const elapsed = ref(0);
1849
+ let recorder2 = null;
1850
+ let tickTimer = null;
1851
+ let startAt = 0;
1852
+ let onTimeoutCb = null;
1853
+ let starting = false;
1854
+ let canceledDuringStart = false;
1855
+ const remaining = computed(() => Math.max(0, VOICE_MAX_DURATION - elapsed.value));
1856
+ const countdown = computed(() => remaining.value <= 10 ? remaining.value : 0);
1857
+ const clearTick = () => {
1858
+ if (tickTimer) {
1859
+ clearInterval(tickTimer);
1860
+ tickTimer = null;
1861
+ }
1862
+ };
1863
+ const removeVisibilityListener = () => {
1864
+ var _a;
1865
+ (_a = document.removeEventListener) == null ? void 0 : _a.call(document, "visibilitychange", handleVisibilityChange);
1866
+ };
1867
+ const handleVisibilityChange = () => {
1868
+ if (document.visibilityState === "hidden" && isRecording.value) {
1869
+ cancel();
1870
+ }
1871
+ };
1872
+ const cleanup = () => {
1873
+ var _a;
1874
+ clearTick();
1875
+ removeVisibilityListener();
1876
+ canceledDuringStart = true;
1877
+ isRecording.value = false;
1878
+ canceling.value = false;
1879
+ elapsed.value = 0;
1880
+ if (recorder2) {
1881
+ try {
1882
+ recorder2.stop();
1883
+ } catch (error) {
1884
+ }
1885
+ const destroying = recorder2;
1886
+ recorder2 = null;
1887
+ try {
1888
+ (_a = destroying.destroy) == null ? void 0 : _a.call(destroying);
1889
+ } catch (error) {
1890
+ }
1891
+ }
1892
+ if (activeRecorder === instanceId) activeRecorder = null;
1893
+ };
1894
+ const start = async ({ onTimeout } = {}) => {
1895
+ var _a, _b;
1896
+ if (starting) return false;
1897
+ if (activeRecorder && activeRecorder !== instanceId) return false;
1898
+ if (isRecording.value) return false;
1899
+ if (typeof navigator === "undefined" || !((_a = navigator.mediaDevices) == null ? void 0 : _a.getUserMedia)) {
1900
+ throw new Error("当前环境不支持录音");
1901
+ }
1902
+ starting = true;
1903
+ canceledDuringStart = false;
1904
+ try {
1905
+ await Recorder.getPermission();
1906
+ if (canceledDuringStart) return false;
1907
+ recorder2 = new Recorder({
1908
+ sampleBits: VOICE_SAMPLE_BITS,
1909
+ sampleRate: VOICE_SAMPLE_RATE,
1910
+ numChannels: VOICE_CHANNELS
1911
+ });
1912
+ const startResult = recorder2.start();
1913
+ if (startResult == null ? void 0 : startResult.catch) {
1914
+ startResult.catch((error) => {
1915
+ console.error("[Voice] 录音启动失败:", error);
1916
+ cleanup();
1917
+ });
1918
+ }
1919
+ activeRecorder = instanceId;
1920
+ onTimeoutCb = onTimeout || null;
1921
+ isRecording.value = true;
1922
+ canceling.value = false;
1923
+ elapsed.value = 0;
1924
+ startAt = now();
1925
+ (_b = document.addEventListener) == null ? void 0 : _b.call(document, "visibilitychange", handleVisibilityChange);
1926
+ tickTimer = setInterval(async () => {
1927
+ elapsed.value = Math.floor((now() - startAt) / 1e3);
1928
+ if (elapsed.value >= VOICE_MAX_DURATION) {
1929
+ const cb = onTimeoutCb;
1930
+ onTimeoutCb = null;
1931
+ const result = await stop();
1932
+ cb == null ? void 0 : cb(result);
1933
+ }
1934
+ }, 250);
1935
+ return true;
1936
+ } finally {
1937
+ starting = false;
1938
+ }
1939
+ };
1940
+ const setCanceling = (value) => {
1941
+ canceling.value = !!value;
1942
+ };
1943
+ const stop = async () => {
1944
+ var _a;
1945
+ if (!recorder2 || !isRecording.value) return null;
1946
+ const recordedSeconds = (now() - startAt) / 1e3;
1947
+ const current = recorder2;
1948
+ const wasCanceling = canceling.value;
1949
+ clearTick();
1950
+ removeVisibilityListener();
1951
+ isRecording.value = false;
1952
+ onTimeoutCb = null;
1953
+ let blob = null;
1954
+ try {
1955
+ current.stop();
1956
+ blob = current.getWAVBlob();
1957
+ } catch (error) {
1958
+ console.warn("录音结束失败:", error);
1959
+ } finally {
1960
+ recorder2 = null;
1961
+ if (activeRecorder === instanceId) activeRecorder = null;
1962
+ try {
1963
+ (_a = current.destroy) == null ? void 0 : _a.call(current);
1964
+ } catch (error) {
1965
+ }
1966
+ }
1967
+ canceling.value = false;
1968
+ if (wasCanceling || !blob) return null;
1969
+ if (recordedSeconds < VOICE_MIN_DURATION) return { tooShort: true };
1970
+ const file = new File([blob], `voice_${Date.now()}.wav`, { type: "audio/wav" });
1971
+ let duration = 0;
1972
+ try {
1973
+ duration = await getMediaDuration(file);
1974
+ } catch (error) {
1975
+ duration = 0;
1976
+ }
1977
+ if (!duration) duration = Number(current.duration) || 0;
1978
+ if (!duration) duration = recordedSeconds;
1979
+ return {
1980
+ file,
1981
+ size: file.size,
1982
+ duration: Math.max(VOICE_MIN_DURATION, Math.round(duration))
1983
+ };
1984
+ };
1985
+ const cancel = () => {
1986
+ canceledDuringStart = true;
1987
+ canceling.value = true;
1988
+ return stop();
1989
+ };
1990
+ onBeforeUnmount(() => cleanup());
1991
+ return {
1992
+ isRecording,
1993
+ canceling,
1994
+ elapsed,
1995
+ remaining,
1996
+ countdown,
1997
+ start,
1998
+ stop,
1999
+ cancel,
2000
+ setCanceling,
2001
+ cleanup
2002
+ };
2003
+ };
2004
+ const _hoisted_1$2 = { class: "voice-recorder" };
2005
+ const _hoisted_2$2 = { class: "voice-wave" };
2006
+ const _hoisted_3$2 = { class: "voice-time" };
2007
+ const _hoisted_4$2 = {
2008
+ key: 0,
2009
+ class: "voice-tip countdown"
2010
+ };
2011
+ const _hoisted_5$2 = { class: "voice-tip cancel-tip" };
2012
+ const _sfc_main$2 = {
2013
+ __name: "VoiceRecorderH5",
2014
+ props: {
2015
+ disabled: {
2016
+ type: Boolean,
2017
+ default: false
2018
+ }
2019
+ },
2020
+ emits: ["record-start", "record-complete", "record-cancel"],
2021
+ setup(__props, { emit: __emit }) {
2022
+ const props = __props;
2023
+ const emit = __emit;
2024
+ const { isRecording, canceling, elapsed, countdown, start, stop, setCanceling } = useVoiceRecorder();
2025
+ const startY = ref(0);
2026
+ let starting = false;
2027
+ let pressing = false;
2028
+ const onTouchStart = async (e) => {
2029
+ var _a, _b;
2030
+ if (props.disabled || isRecording.value || starting) return;
2031
+ starting = true;
2032
+ pressing = true;
2033
+ startY.value = ((_b = (_a = e.touches) == null ? void 0 : _a[0]) == null ? void 0 : _b.clientY) || 0;
2034
+ try {
2035
+ const ok = await start({
2036
+ onTimeout: (result) => {
2037
+ if (result == null ? void 0 : result.file) emit("record-complete", result);
2038
+ else emit("record-cancel");
2039
+ }
2040
+ });
2041
+ if (ok && pressing) {
2042
+ emit("record-start");
2043
+ } else if (ok) {
2044
+ await stop();
2045
+ emit("record-cancel");
2046
+ }
2047
+ } catch (error) {
2048
+ console.error("[Voice] 录音启动失败:", error);
2049
+ showToast((error == null ? void 0 : error.message) || "无法录音,请检查麦克风权限");
2050
+ } finally {
2051
+ starting = false;
2052
+ }
2053
+ };
2054
+ const onTouchMove = (e) => {
2055
+ var _a, _b;
2056
+ if (!isRecording.value) return;
2057
+ const diff = startY.value - (((_b = (_a = e.touches) == null ? void 0 : _a[0]) == null ? void 0 : _b.clientY) || startY.value);
2058
+ setCanceling(diff > VOICE_CANCEL_DISTANCE);
2059
+ };
2060
+ const onTouchEnd = async () => {
2061
+ pressing = false;
2062
+ if (!isRecording.value) return;
2063
+ const result = await stop();
2064
+ if (!result) {
2065
+ emit("record-cancel");
2066
+ return;
2067
+ }
2068
+ if (result.tooShort) {
2069
+ showToast("录音时间太短");
2070
+ emit("record-cancel");
2071
+ return;
2072
+ }
2073
+ emit("record-complete", result);
2074
+ };
2075
+ return (_ctx, _cache) => {
2076
+ return openBlock(), createElementBlock("div", _hoisted_1$2, [
2077
+ createElementVNode("div", {
2078
+ class: normalizeClass(["voice-hold-btn", { recording: unref(isRecording), canceling: unref(canceling), disabled: props.disabled }]),
2079
+ onTouchstart: withModifiers(onTouchStart, ["prevent"]),
2080
+ onTouchmove: withModifiers(onTouchMove, ["prevent"]),
2081
+ onTouchend: withModifiers(onTouchEnd, ["prevent"]),
2082
+ onTouchcancel: withModifiers(onTouchEnd, ["prevent"])
2083
+ }, toDisplayString(unref(isRecording) ? unref(canceling) ? "松开 取消" : "松开 发送" : "按住 说话"), 35),
2084
+ createVNode(unref(Overlay), {
2085
+ show: unref(isRecording),
2086
+ "z-index": 3e3
2087
+ }, {
2088
+ default: withCtx(() => [
2089
+ createElementVNode("div", {
2090
+ class: normalizeClass(["voice-mask", { canceling: unref(canceling) }]),
2091
+ onTouchstart: _cache[0] || (_cache[0] = withModifiers(() => {
2092
+ }, ["prevent", "stop"])),
2093
+ onTouchmove: _cache[1] || (_cache[1] = withModifiers(() => {
2094
+ }, ["prevent", "stop"])),
2095
+ onTouchend: _cache[2] || (_cache[2] = withModifiers(() => {
2096
+ }, ["prevent", "stop"]))
2097
+ }, [
2098
+ createElementVNode("div", _hoisted_2$2, [
2099
+ (openBlock(), createElementBlock(Fragment, null, renderList(5, (n) => {
2100
+ return createElementVNode("span", {
2101
+ key: n,
2102
+ class: "wave-bar",
2103
+ style: normalizeStyle({ animationDelay: `${n * 0.1}s` })
2104
+ }, null, 4);
2105
+ }), 64))
2106
+ ]),
2107
+ createElementVNode("div", _hoisted_3$2, toDisplayString(unref(elapsed)) + "s", 1),
2108
+ unref(countdown) > 0 ? (openBlock(), createElementBlock("div", _hoisted_4$2, toDisplayString(unref(countdown)) + " 秒后自动结束", 1)) : createCommentVNode("", true),
2109
+ createElementVNode("div", _hoisted_5$2, [
2110
+ createVNode(unref(Icon), {
2111
+ name: unref(canceling) ? "cross" : "upgrade",
2112
+ size: "14"
2113
+ }, null, 8, ["name"]),
2114
+ createTextVNode(" " + toDisplayString(unref(canceling) ? "松开手指,取消发送" : "手指上滑,取消发送"), 1)
2115
+ ])
2116
+ ], 34)
2117
+ ]),
2118
+ _: 1
2119
+ }, 8, ["show"])
2120
+ ]);
2121
+ };
2122
+ }
2123
+ };
2124
+ const VoiceRecorderH5 = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__scopeId", "data-v-75dca338"]]);
1465
2125
  const _hoisted_1$1 = {
1466
2126
  key: 0,
1467
2127
  class: "disabled-box"
@@ -1553,6 +2213,7 @@ const _sfc_main$1 = {
1553
2213
  emits: [
1554
2214
  "send-message",
1555
2215
  "send-file",
2216
+ "send-sound",
1556
2217
  "clear-reply",
1557
2218
  "merge-forward",
1558
2219
  "delete-selected",
@@ -1564,6 +2225,7 @@ const _sfc_main$1 = {
1564
2225
  const emit = __emit;
1565
2226
  const chatMessage = useChatStore();
1566
2227
  computed(() => chatMessage.getUserInfo);
2228
+ const { stopAllAudio } = useAudioPlayer();
1567
2229
  const inputText = ref("");
1568
2230
  const textareaRef = ref(null);
1569
2231
  const showEmojiPanel = ref(false);
@@ -1584,6 +2246,41 @@ const _sfc_main$1 = {
1584
2246
  const placeholder = computed(() => {
1585
2247
  return "输入消息...";
1586
2248
  });
2249
+ const voiceMode = ref(false);
2250
+ const onToggleVoiceMode = () => {
2251
+ var _a;
2252
+ if (isDisabled.value) {
2253
+ showToast(disabledText.value || "当前无法录音");
2254
+ return;
2255
+ }
2256
+ (_a = textareaRef.value) == null ? void 0 : _a.blur();
2257
+ voiceMode.value = !voiceMode.value;
2258
+ showEmojiPanel.value = false;
2259
+ showPlusPanel.value = false;
2260
+ };
2261
+ const onRecordStart = () => {
2262
+ stopAllAudio();
2263
+ };
2264
+ const onRecordComplete = (payload) => {
2265
+ if (isDisabled.value) return;
2266
+ emit("send-sound", payload);
2267
+ };
2268
+ const onRecordCancel = () => {
2269
+ };
2270
+ watch(
2271
+ () => {
2272
+ var _a;
2273
+ return (_a = props.chatInfo) == null ? void 0 : _a.conversationID;
2274
+ },
2275
+ (id, oldID) => {
2276
+ if (id && id !== oldID) {
2277
+ voiceMode.value = false;
2278
+ }
2279
+ }
2280
+ );
2281
+ watch(isDisabled, (disabled) => {
2282
+ if (disabled) voiceMode.value = false;
2283
+ });
1587
2284
  const replyMsgStr = ref("");
1588
2285
  watch(
1589
2286
  () => props.msgItem,
@@ -1868,48 +2565,66 @@ const _sfc_main$1 = {
1868
2565
  })
1869
2566
  ])) : createCommentVNode("", true),
1870
2567
  createElementVNode("div", _hoisted_6$1, [
1871
- createElementVNode("div", _hoisted_7$1, [
1872
- withDirectives(createElementVNode("textarea", {
1873
- ref_key: "textareaRef",
1874
- ref: textareaRef,
1875
- "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => inputText.value = $event),
1876
- class: "input-textarea",
1877
- placeholder: placeholder.value,
1878
- rows: 1,
1879
- onKeydown: onKeyDown,
1880
- onFocus,
1881
- onBlur
1882
- }, null, 40, _hoisted_8$1), [
1883
- [vModelText, inputText.value]
1884
- ])
1885
- ]),
1886
2568
  createElementVNode("div", {
1887
- class: normalizeClass(["action-btn emoji-btn", { active: showEmojiPanel.value }]),
1888
- onClick: onToggleEmoji
2569
+ class: normalizeClass(["action-btn voice-toggle", { active: voiceMode.value }]),
2570
+ onClick: onToggleVoiceMode
1889
2571
  }, [
1890
2572
  createVNode(unref(Icon), {
1891
- name: "smile-o",
2573
+ name: voiceMode.value ? "edit" : "audio",
1892
2574
  size: "22",
1893
2575
  color: "var(--chat-tip-font-color, #999)"
1894
- })
2576
+ }, null, 8, ["name"])
1895
2577
  ], 2),
1896
- inputText.value.trim() ? (openBlock(), createElementBlock("div", {
2578
+ voiceMode.value ? (openBlock(), createBlock(VoiceRecorderH5, {
1897
2579
  key: 0,
1898
- class: "action-btn send-btn",
1899
- onClick: onSend
1900
- }, [..._cache[10] || (_cache[10] = [
1901
- createElementVNode("span", null, "发送", -1)
1902
- ])])) : (openBlock(), createElementBlock("div", {
1903
- key: 1,
1904
- class: normalizeClass(["action-btn plus-btn", { active: showPlusPanel.value }]),
1905
- onClick: onTogglePlus
1906
- }, [
1907
- createVNode(unref(Icon), {
1908
- name: "plus",
1909
- size: "22",
1910
- color: "var(--chat-tip-font-color, #999)"
1911
- })
1912
- ], 2))
2580
+ disabled: isDisabled.value,
2581
+ onRecordStart,
2582
+ onRecordComplete,
2583
+ onRecordCancel
2584
+ }, null, 8, ["disabled"])) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
2585
+ createElementVNode("div", _hoisted_7$1, [
2586
+ withDirectives(createElementVNode("textarea", {
2587
+ ref_key: "textareaRef",
2588
+ ref: textareaRef,
2589
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => inputText.value = $event),
2590
+ class: "input-textarea",
2591
+ placeholder: placeholder.value,
2592
+ rows: 1,
2593
+ onKeydown: onKeyDown,
2594
+ onFocus,
2595
+ onBlur
2596
+ }, null, 40, _hoisted_8$1), [
2597
+ [vModelText, inputText.value]
2598
+ ])
2599
+ ]),
2600
+ createElementVNode("div", {
2601
+ class: normalizeClass(["action-btn emoji-btn", { active: showEmojiPanel.value }]),
2602
+ onClick: onToggleEmoji
2603
+ }, [
2604
+ createVNode(unref(Icon), {
2605
+ name: "smile-o",
2606
+ size: "22",
2607
+ color: "var(--chat-tip-font-color, #999)"
2608
+ })
2609
+ ], 2),
2610
+ inputText.value.trim() ? (openBlock(), createElementBlock("div", {
2611
+ key: 0,
2612
+ class: "action-btn send-btn",
2613
+ onClick: onSend
2614
+ }, [..._cache[10] || (_cache[10] = [
2615
+ createElementVNode("span", null, "发送", -1)
2616
+ ])])) : (openBlock(), createElementBlock("div", {
2617
+ key: 1,
2618
+ class: normalizeClass(["action-btn plus-btn", { active: showPlusPanel.value }]),
2619
+ onClick: onTogglePlus
2620
+ }, [
2621
+ createVNode(unref(Icon), {
2622
+ name: "plus",
2623
+ size: "22",
2624
+ color: "var(--chat-tip-font-color, #999)"
2625
+ })
2626
+ ], 2))
2627
+ ], 64))
1913
2628
  ])
1914
2629
  ], 64)),
1915
2630
  withDirectives(createElementVNode("div", _hoisted_9$1, [
@@ -2088,7 +2803,7 @@ const _sfc_main$1 = {
2088
2803
  };
2089
2804
  }
2090
2805
  };
2091
- const ChatInputH5 = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-fc6ad145"]]);
2806
+ const ChatInputH5 = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-d9bf64c5"]]);
2092
2807
  const _hoisted_1 = { class: "notice-bar-text-wrap" };
2093
2808
  const _hoisted_2 = { class: "notice-bar-text notice-bar-scroll" };
2094
2809
  const _hoisted_3 = { class: "forward-popup" };
@@ -2131,7 +2846,7 @@ const _sfc_main = {
2131
2846
  updateMessageList,
2132
2847
  handleMessage
2133
2848
  } = useMsgList();
2134
- const { addPendingMessage, removePendingMessage, getPendingMessages } = useUploadQueue();
2849
+ const { addPendingMessage, removePendingMessage, getPendingMessages, updatePendingMessage } = useUploadQueue();
2135
2850
  let imInstance = null;
2136
2851
  const baseUrl = computed(() => chatMessage.getBaseUrl);
2137
2852
  const localUser = computed(() => chatMessage.getUserInfo);
@@ -2148,6 +2863,7 @@ const _sfc_main = {
2148
2863
  var _a;
2149
2864
  return ((_a = currentConversation.value) == null ? void 0 : _a.conversationType) === IM_CVS_TYPE.Group;
2150
2865
  });
2866
+ const isNoticeAgentChat = computed(() => isNoticeAgentConversation(currentConversation.value));
2151
2867
  const isMuted = ref(false);
2152
2868
  const selfMuted = ref(false);
2153
2869
  const isDismissed = ref(false);
@@ -2250,19 +2966,24 @@ const _sfc_main = {
2250
2966
  selfMuted.value = (self == null ? void 0 : self.muteEndTime) && self.muteEndTime > Date.now();
2251
2967
  };
2252
2968
  const loadMessages = async () => {
2969
+ var _a, _b;
2253
2970
  if (!imInstance) return;
2254
2971
  const cvs = currentConversation.value;
2255
2972
  const cvsID = (cvs == null ? void 0 : cvs.conversationID) || route.query.conversationID;
2256
2973
  if (!cvsID) return;
2257
2974
  try {
2258
- const { list } = await imInstance.getAdvancedHistoryMessageList({
2975
+ const res = await imInstance.getAdvancedHistoryMessageList({
2259
2976
  conversationID: cvsID,
2260
2977
  count: pageCount.value,
2261
2978
  startClientMsgID: ""
2262
2979
  });
2980
+ if (res == null ? void 0 : res.error) {
2981
+ console.warn("[IM] 会话历史消息拉取失败,保留当前展示:", cvsID, ((_a = res.error) == null ? void 0 : _a.errMsg) || ((_b = res.error) == null ? void 0 : _b.errCode));
2982
+ return;
2983
+ }
2263
2984
  isLastMessage.value = true;
2264
2985
  isFirstMessage.value = false;
2265
- updateMessageList(list || [], "init");
2986
+ updateMessageList((res == null ? void 0 : res.list) || [], "init");
2266
2987
  } catch (err) {
2267
2988
  console.error("加载消息列表失败:", err);
2268
2989
  }
@@ -2863,6 +3584,7 @@ const _sfc_main = {
2863
3584
  (_a = msgListRef.value) == null ? void 0 : _a.closeMultiSelect();
2864
3585
  };
2865
3586
  const addExInfo = (msg = {}) => {
3587
+ var _a, _b;
2866
3588
  const tenantID = chatMessage.getTenantID || "1";
2867
3589
  const imFontStyle = localStorage.getItem("IM_FONT_STYLE") || "";
2868
3590
  let msgStyle = null;
@@ -2872,7 +3594,22 @@ const _sfc_main = {
2872
3594
  } catch (e) {
2873
3595
  }
2874
3596
  }
2875
- msg.ex = JSON.stringify({ tenantID, msgStyle });
3597
+ const burnSetting = getConversationBurnSetting(currentConversation.value, (_a = chatMessage.getUserInfo) == null ? void 0 : _a.userID);
3598
+ let exInfo = {};
3599
+ if (msg.ex) {
3600
+ try {
3601
+ exInfo = JSON.parse(msg.ex) || {};
3602
+ } catch {
3603
+ exInfo = {};
3604
+ }
3605
+ }
3606
+ if (burnSetting.enabled && burnSetting.duration > 0) {
3607
+ exInfo.burnBySender = true;
3608
+ exInfo.burnDuration = burnSetting.duration;
3609
+ exInfo.burnFromUserID = burnSetting.fromUserID;
3610
+ exInfo.burnToUserID = burnSetting.toUserID || ((_b = currentConversation.value) == null ? void 0 : _b.userID) || "";
3611
+ }
3612
+ msg.ex = JSON.stringify({ ...exInfo, tenantID, msgStyle });
2876
3613
  };
2877
3614
  const sendTextMessage = async (content) => {
2878
3615
  if (!content || !imInstance) return;
@@ -2983,6 +3720,7 @@ const _sfc_main = {
2983
3720
  }
2984
3721
  };
2985
3722
  const uploadMsgFile = async ({ type, info }) => {
3723
+ var _a, _b;
2986
3724
  if (!imInstance) return;
2987
3725
  const FILE_CREATORS = {
2988
3726
  video: () => imInstance.createVideoMessageByURL({
@@ -3001,11 +3739,12 @@ const _sfc_main = {
3001
3739
  snapShotType: "png"
3002
3740
  }),
3003
3741
  audio: () => imInstance.createSoundMessageByURL({
3004
- duration: info.duration,
3742
+ // 语音时长必须 ≥1 秒,否则气泡显示 0"
3743
+ duration: Math.max(1, Math.round(info.duration || 0)),
3005
3744
  soundPath: info.path,
3006
3745
  sourceUrl: info.path,
3007
3746
  dataSize: info.size,
3008
- soundType: info.type
3747
+ soundType: info.type || "wav"
3009
3748
  }),
3010
3749
  file: () => imInstance.createFileMessageByURL({
3011
3750
  fileName: info.name,
@@ -3028,18 +3767,17 @@ const _sfc_main = {
3028
3767
  const formData = new FormData();
3029
3768
  formData.append("files", info.file);
3030
3769
  const { data: res } = await uploadFiles(baseUrl.value, formData);
3031
- if (res.code === 200 && res.data) {
3032
- const resFile = res.data.successFiles[0] || {};
3033
- const path = `/api/v1/auth/reviewFile/${resFile.fileID}`;
3034
- if (data.fileElem) {
3035
- data.fileElem.sourceUrl = path;
3036
- } else if (data.videoElem) {
3037
- data.videoElem.videoPath = path;
3038
- data.videoElem.videoUrl = path;
3039
- } else if (data.soundElem) {
3040
- data.soundElem.soundPath = path;
3041
- data.soundElem.sourceUrl = path;
3042
- }
3770
+ const resFile = ((_b = (_a = res == null ? void 0 : res.data) == null ? void 0 : _a.successFiles) == null ? void 0 : _b[0]) || {};
3771
+ if ((res == null ? void 0 : res.code) !== 200 || !resFile.fileID) throw new Error((res == null ? void 0 : res.msg) || "upload failed");
3772
+ const path = `/api/v1/auth/reviewFile/${resFile.fileID}`;
3773
+ if (data.fileElem) {
3774
+ data.fileElem.sourceUrl = path;
3775
+ } else if (data.videoElem) {
3776
+ data.videoElem.videoPath = path;
3777
+ data.videoElem.videoUrl = path;
3778
+ } else if (data.soundElem) {
3779
+ data.soundElem.soundPath = path;
3780
+ data.soundElem.sourceUrl = path;
3043
3781
  }
3044
3782
  }
3045
3783
  const result = await imInstance.sendMessageNotOss({
@@ -3062,6 +3800,68 @@ const _sfc_main = {
3062
3800
  updatePendingMessage(cvs.conversationID, msgItem.clientMsgID, { status: 3 });
3063
3801
  }
3064
3802
  };
3803
+ const sendVoiceMessage = async ({ file, duration } = {}) => {
3804
+ var _a, _b;
3805
+ if (!imInstance || !file) return;
3806
+ const cvs = currentConversation.value;
3807
+ if (!(cvs == null ? void 0 : cvs.conversationID) && !(cvs == null ? void 0 : cvs.userID) && !(cvs == null ? void 0 : cvs.groupID)) return;
3808
+ const formData = new FormData();
3809
+ formData.append("files", file);
3810
+ let path = "";
3811
+ try {
3812
+ const { data: res } = await uploadFiles(baseUrl.value, formData);
3813
+ const resFile = ((_b = (_a = res == null ? void 0 : res.data) == null ? void 0 : _a.successFiles) == null ? void 0 : _b[0]) || {};
3814
+ if ((res == null ? void 0 : res.code) !== 200 || !resFile.fileID) throw new Error((res == null ? void 0 : res.msg) || "upload failed");
3815
+ path = `/api/v1/auth/reviewFile/${resFile.fileID}`;
3816
+ } catch (error) {
3817
+ console.error("[Voice] 语音上传失败:", error);
3818
+ showToast("语音上传失败,请重试");
3819
+ return;
3820
+ }
3821
+ const data = await imInstance.createSoundMessageByURL({
3822
+ duration: Math.max(1, Math.round(duration || 0)),
3823
+ soundPath: path,
3824
+ sourceUrl: path,
3825
+ dataSize: file.size,
3826
+ soundType: "wav"
3827
+ });
3828
+ if (!data) {
3829
+ showToast("语音发送失败");
3830
+ return;
3831
+ }
3832
+ addExInfo(data);
3833
+ const msgItem = {
3834
+ ...data,
3835
+ sessionType: cvs.conversationType,
3836
+ recvID: cvs.conversationType === IM_CVS_TYPE.Single ? cvs.userID : "",
3837
+ groupID: cvs.conversationType === IM_CVS_TYPE.Group ? cvs.groupID : "",
3838
+ status: 1
3839
+ };
3840
+ if (!cvs.conversationID) await createConversation();
3841
+ updateMessageList([msgItem], "add");
3842
+ addPendingMessage(cvs.conversationID, msgItem);
3843
+ try {
3844
+ const result = await imInstance.sendMessageNotOss({
3845
+ recvID: cvs.conversationType === IM_CVS_TYPE.Single ? cvs.userID : "",
3846
+ groupID: cvs.conversationType === IM_CVS_TYPE.Group ? cvs.groupID : "",
3847
+ message: data
3848
+ });
3849
+ if (result) {
3850
+ updateMessageList([result], "update");
3851
+ removePendingMessage(cvs.conversationID, msgItem.clientMsgID);
3852
+ if (!cvs.isCustom) {
3853
+ updateConversationLatestMessage(cvs.conversationID, result, handleMessage(result));
3854
+ }
3855
+ } else {
3856
+ updateMessageList([{ ...msgItem, status: 3 }], "update");
3857
+ updatePendingMessage(cvs.conversationID, msgItem.clientMsgID, { status: 3 });
3858
+ }
3859
+ } catch (error) {
3860
+ console.error("[Voice] 语音发送失败:", error);
3861
+ updateMessageList([{ ...msgItem, status: 3 }], "update");
3862
+ updatePendingMessage(cvs.conversationID, msgItem.clientMsgID, { status: 3 });
3863
+ }
3864
+ };
3065
3865
  const createConversation = async (msg) => {
3066
3866
  const cvs = currentConversation.value;
3067
3867
  const sourceID = cvs.conversationType === IM_CVS_TYPE.Single ? cvs.userID : cvs.groupID;
@@ -3076,7 +3876,9 @@ const _sfc_main = {
3076
3876
  }
3077
3877
  currentConversation.value = info;
3078
3878
  if (info.ex) {
3079
- await (imInstance == null ? void 0 : imInstance.setConversation({ conversationID: info.conversationID, ex: "" }));
3879
+ const clearedEx = preserveBurnInEx("", info.ex);
3880
+ await (imInstance == null ? void 0 : imInstance.setConversation({ conversationID: info.conversationID, ex: clearedEx }));
3881
+ info.ex = clearedEx;
3080
3882
  }
3081
3883
  handleConversationList([info], "add", handleMessage);
3082
3884
  }
@@ -3143,6 +3945,13 @@ const _sfc_main = {
3143
3945
  duration: 0,
3144
3946
  file
3145
3947
  };
3948
+ if (msgType === "audio" || msgType === "video") {
3949
+ try {
3950
+ info.duration = Math.max(1, Math.round(await getMediaDuration(file)));
3951
+ } catch {
3952
+ info.duration = 1;
3953
+ }
3954
+ }
3146
3955
  await uploadMsgFile({ type: msgType, info });
3147
3956
  }
3148
3957
  }
@@ -3351,7 +4160,8 @@ const _sfc_main = {
3351
4160
  "im-instance": unref(imInstance),
3352
4161
  onApplied: onGroupJoinApplied
3353
4162
  }, null, 8, ["im-instance"]),
3354
- createVNode(ChatInputH5, {
4163
+ !isNoticeAgentChat.value ? (openBlock(), createBlock(ChatInputH5, {
4164
+ key: 1,
3355
4165
  ref_key: "msgInputRef",
3356
4166
  ref: msgInputRef,
3357
4167
  "chat-info": unref(currentConversation),
@@ -3365,17 +4175,18 @@ const _sfc_main = {
3365
4175
  "is-multi-select": isMultiSelect.value,
3366
4176
  onSendMessage: onSendTextMessage,
3367
4177
  onSendFile,
4178
+ onSendSound: sendVoiceMessage,
3368
4179
  onClearReply,
3369
4180
  onMergeForward,
3370
4181
  onDeleteSelected,
3371
4182
  onCancelSelect,
3372
4183
  onTriggerCall
3373
- }, null, 8, ["chat-info", "msg-item", "members", "group-info", "is-muted", "self-muted", "is-dismissed", "is-not-in-group", "is-multi-select"])
4184
+ }, null, 8, ["chat-info", "msg-item", "members", "group-info", "is-muted", "self-muted", "is-dismissed", "is-not-in-group", "is-multi-select"])) : createCommentVNode("", true)
3374
4185
  ], 2);
3375
4186
  };
3376
4187
  }
3377
4188
  };
3378
- const ChatPageH5 = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-637e93b5"]]);
4189
+ const ChatPageH5 = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-cb2e4389"]]);
3379
4190
  export {
3380
4191
  ChatPageH5 as default
3381
4192
  };